From 49f32028b8458104499b630177bb4e7da1e2483e Mon Sep 17 00:00:00 2001 From: Boris Smus Date: Tue, 29 Mar 2016 10:57:21 -0700 Subject: [PATCH] Initial check-in. --- .gitignore | 3 + CNAME | 1 + CONTRIBUTING | 22 + COPYING | 202 + README.md | 5 + build/device-motion-sender.min.js | 1 + build/vrview-analytics.js | 44284 ++++++++++++++++ build/vrview-analytics.min.js | 22 + build/vrview.js | 44220 +++++++++++++++ build/vrview.min.js | 22 + examples/coral.jpg | Bin 0 -> 1300257 bytes examples/pano/andes_2048.jpg | Bin 0 -> 1642557 bytes examples/pano/andes_512.jpg | Bin 0 -> 140764 bytes examples/pano/index.html | 49 + examples/style.css | 48 + examples/video/congo_2048.jpg | Bin 0 -> 1563711 bytes examples/video/congo_2048.mp4 | Bin 0 -> 2939784 bytes examples/video/index.html | 48 + images/ic_info_outline_black_24dp.svg | 5 + images/loading.gif | Bin 0 -> 192782 bytes index.html | 26 + node_modules/es6-promise/CHANGELOG.md | 50 + node_modules/es6-promise/LICENSE | 19 + node_modules/es6-promise/README.md | 74 + node_modules/es6-promise/dist/es6-promise.js | 954 + .../es6-promise/dist/es6-promise.min.js | 9 + .../es6-promise/lib/es6-promise.umd.js | 18 + .../es6-promise/lib/es6-promise/-internal.js | 257 + .../es6-promise/lib/es6-promise/asap.js | 119 + .../es6-promise/lib/es6-promise/enumerator.js | 113 + .../es6-promise/lib/es6-promise/polyfill.js | 26 + .../es6-promise/lib/es6-promise/promise.js | 384 + .../lib/es6-promise/promise/all.js | 52 + .../lib/es6-promise/promise/race.js | 104 + .../lib/es6-promise/promise/reject.js | 46 + .../lib/es6-promise/promise/resolve.js | 48 + .../es6-promise/lib/es6-promise/then.js | 32 + .../es6-promise/lib/es6-promise/utils.js | 22 + node_modules/es6-promise/package.json | 122 + node_modules/stats-js/LICENSE | 21 + node_modules/stats-js/README.md | 123 + node_modules/stats-js/build/stats.min.js | 6 + node_modules/stats-js/examples/basic.html | 53 + node_modules/stats-js/examples/theming.html | 125 + node_modules/stats-js/package.json | 76 + node_modules/stats-js/src/Stats.js | 149 + node_modules/stats-js/utils/builder.py | 9 + node_modules/stats-js/utils/compiler/COPYING | 202 + node_modules/stats-js/utils/compiler/README | 292 + .../stats-js/utils/compiler/compiler.jar | Bin 0 -> 5445104 bytes node_modules/three/README.md | 68 + .../three/examples/js/AnimationClipCreator.js | 139 + .../three/examples/js/BlendCharacter.js | 140 + .../three/examples/js/BlendCharacterGui.js | 216 + .../three/examples/js/BufferGeometryUtils.js | 187 + node_modules/three/examples/js/Car.js | 407 + node_modules/three/examples/js/Cloth.js | 325 + node_modules/three/examples/js/CurveExtras.js | 331 + node_modules/three/examples/js/Detector.js | 78 + .../three/examples/js/GPUParticleSystem.js | 505 + node_modules/three/examples/js/Gyroscope.js | 65 + .../three/examples/js/ImprovedNoise.js | 71 + .../three/examples/js/MD2Character.js | 256 + .../three/examples/js/MD2CharacterComplex.js | 559 + .../three/examples/js/MarchingCubes.js | 1057 + node_modules/three/examples/js/Mirror.js | 301 + .../three/examples/js/MorphAnimMesh.js | 70 + .../three/examples/js/MorphAnimation.js | 73 + node_modules/three/examples/js/Ocean.js | 363 + node_modules/three/examples/js/Octree.js | 2137 + node_modules/three/examples/js/PRNG.js | 23 + .../three/examples/js/ParametricGeometries.js | 271 + .../three/examples/js/ShaderGodRays.js | 308 + node_modules/three/examples/js/ShaderSkin.js | 789 + .../three/examples/js/ShaderTerrain.js | 342 + node_modules/three/examples/js/ShaderToon.js | 331 + .../three/examples/js/SimplexNoise.js | 324 + .../three/examples/js/SimulationRenderer.js | 235 + node_modules/three/examples/js/SkyShader.js | 261 + .../three/examples/js/TypedArrayUtils.js | 602 + .../three/examples/js/UCSCharacter.js | 140 + node_modules/three/examples/js/WaterShader.js | 295 + .../examples/js/cameras/CombinedCamera.js | 236 + .../js/controls/DeviceOrientationControls.js | 99 + .../examples/js/controls/DragControls.js | 236 + .../examples/js/controls/EditorControls.js | 327 + .../js/controls/FirstPersonControls.js | 300 + .../three/examples/js/controls/FlyControls.js | 293 + .../examples/js/controls/MouseControls.js | 61 + .../examples/js/controls/OrbitControls.js | 1115 + .../controls/OrthographicTrackballControls.js | 655 + .../js/controls/PointerLockControls.js | 69 + .../examples/js/controls/TrackballControls.js | 634 + .../examples/js/controls/TransformControls.js | 1132 + .../three/examples/js/controls/VRControls.js | 131 + .../three/examples/js/crossfade/gui.js | 39 + .../three/examples/js/crossfade/scenes.js | 111 + .../three/examples/js/crossfade/transition.js | 167 + .../three/examples/js/curves/NURBSCurve.js | 65 + .../three/examples/js/curves/NURBSSurface.js | 55 + .../three/examples/js/curves/NURBSUtils.js | 472 + .../examples/js/effects/AnaglyphEffect.js | 177 + .../three/examples/js/effects/AsciiEffect.js | 283 + .../js/effects/ParallaxBarrierEffect.js | 171 + .../three/examples/js/effects/StereoEffect.js | 148 + .../three/examples/js/effects/VREffect.js | 258 + .../examples/js/exporters/OBJExporter.js | 148 + .../js/exporters/STLBinaryExporter.js | 81 + .../examples/js/exporters/STLExporter.js | 75 + .../js/exporters/TypedGeometryExporter.js | 55 + .../examples/js/geometries/ConvexGeometry.js | 226 + .../examples/js/geometries/DecalGeometry.js | 289 + .../js/geometries/TeapotBufferGeometry.js | 751 + .../examples/js/geometries/TextGeometry.js | 62 + .../three/examples/js/geometries/hilbert2D.js | 63 + .../three/examples/js/geometries/hilbert3D.js | 88 + .../three/examples/js/libs/dat.gui.min.js | 94 + .../three/examples/js/libs/jszip.min.js | 14 + .../three/examples/js/libs/msgpack-js.js | 600 + .../three/examples/js/libs/pnltri.min.js | 19 + .../three/examples/js/libs/require.js | 36 + .../three/examples/js/libs/stats.min.js | 5 + .../three/examples/js/libs/system.min.js | 4 + .../three/examples/js/libs/tween.min.js | 13 + .../three/examples/js/loaders/AMFLoader.js | 502 + .../three/examples/js/loaders/AWDLoader.js | 1244 + .../examples/js/loaders/AssimpJSONLoader.js | 386 + .../examples/js/loaders/BabylonLoader.js | 255 + .../three/examples/js/loaders/BinaryLoader.js | 715 + .../examples/js/loaders/ColladaLoader.js | 5579 ++ .../examples/js/loaders/ColladaLoader2.js | 865 + .../three/examples/js/loaders/DDSLoader.js | 262 + .../three/examples/js/loaders/KMZLoader.js | 54 + .../three/examples/js/loaders/MD2Loader.js | 318 + .../three/examples/js/loaders/MTLLoader.js | 466 + .../three/examples/js/loaders/OBJLoader.js | 382 + .../three/examples/js/loaders/OBJMTLLoader.js | 374 + .../three/examples/js/loaders/PDBLoader.js | 186 + .../three/examples/js/loaders/PLYLoader.js | 484 + .../three/examples/js/loaders/PVRLoader.js | 269 + .../three/examples/js/loaders/RGBELoader.js | 349 + .../three/examples/js/loaders/STLLoader.js | 498 + .../three/examples/js/loaders/SVGLoader.js | 40 + .../three/examples/js/loaders/TGALoader.js | 483 + .../three/examples/js/loaders/UTF8Loader.js | 779 + .../three/examples/js/loaders/VRMLLoader.js | 1012 + .../three/examples/js/loaders/VTKLoader.js | 113 + .../examples/js/loaders/collada/Animation.js | 407 + .../js/loaders/collada/AnimationHandler.js | 220 + .../js/loaders/collada/KeyFrameAnimation.js | 241 + .../examples/js/loaders/ctm/CTMLoader.js | 276 + .../examples/js/loaders/ctm/CTMWorker.js | 19 + .../three/examples/js/loaders/ctm/ctm.js | 661 + .../js/loaders/ctm/license/OpenCTM.txt | 20 + .../js/loaders/ctm/license/js-lzma.txt | 19 + .../js/loaders/ctm/license/js-openctm.txt | 19 + .../three/examples/js/loaders/ctm/lzma.js | 517 + .../js/loaders/deprecated/SceneLoader.js | 1138 + .../examples/js/loaders/gltf/glTF-parser.js | 388 + .../examples/js/loaders/gltf/glTFAnimation.js | 251 + .../examples/js/loaders/gltf/glTFLoader.js | 1554 + .../js/loaders/gltf/glTFLoaderUtils.js | 220 + .../three/examples/js/loaders/sea3d/SEA3D.js | 4807 ++ .../examples/js/loaders/sea3d/SEA3DDeflate.js | 766 + .../examples/js/loaders/sea3d/SEA3DLZMA.js | 598 + .../examples/js/loaders/sea3d/SEA3DLoader.js | 2469 + .../three/examples/js/math/ColorConverter.js | 64 + node_modules/three/examples/js/math/Lut.js | 501 + .../examples/js/modifiers/ExplodeModifier.js | 43 + .../js/modifiers/SubdivisionModifier.js | 350 + .../js/modifiers/TessellateModifier.js | 236 + .../three/examples/js/objects/ShadowMesh.js | 69 + .../postprocessing/AdaptiveToneMappingPass.js | 315 + .../examples/js/postprocessing/BloomPass.js | 115 + .../examples/js/postprocessing/BokehPass.js | 102 + .../js/postprocessing/DotScreenPass.js | 60 + .../js/postprocessing/EffectComposer.js | 137 + .../examples/js/postprocessing/FilmPass.js | 61 + .../examples/js/postprocessing/GlitchPass.js | 112 + .../examples/js/postprocessing/MaskPass.js | 86 + .../examples/js/postprocessing/RenderPass.js | 51 + .../examples/js/postprocessing/SavePass.js | 62 + .../examples/js/postprocessing/ShaderPass.js | 59 + .../examples/js/postprocessing/TexturePass.js | 47 + .../examples/js/renderers/CSS2DRenderer.js | 104 + .../examples/js/renderers/CSS3DRenderer.js | 252 + .../js/renderers/CSS3DStereoRenderer.js | 329 + .../examples/js/renderers/CanvasRenderer.js | 1094 + .../three/examples/js/renderers/Projector.js | 921 + .../js/renderers/RaytracingRenderer.js | 546 + .../examples/js/renderers/SVGRenderer.js | 467 + .../examples/js/renderers/SoftwareRenderer.js | 1398 + .../three/examples/js/shaders/BasicShader.js | 31 + .../examples/js/shaders/BleachBypassShader.js | 64 + .../three/examples/js/shaders/BlendShader.js | 51 + .../three/examples/js/shaders/BokehShader.js | 116 + .../three/examples/js/shaders/BokehShader2.js | 370 + .../js/shaders/BrightnessContrastShader.js | 58 + .../js/shaders/ColorCorrectionShader.js | 50 + .../examples/js/shaders/ColorifyShader.js | 49 + .../examples/js/shaders/ConvolutionShader.js | 101 + .../three/examples/js/shaders/CopyShader.js | 46 + .../examples/js/shaders/DOFMipMapShader.js | 58 + .../examples/js/shaders/DigitalGlitch.js | 103 + .../examples/js/shaders/DotScreenShader.js | 68 + .../three/examples/js/shaders/EdgeShader.js | 93 + .../three/examples/js/shaders/EdgeShader2.js | 73 + .../three/examples/js/shaders/FXAAShader.js | 88 + .../three/examples/js/shaders/FilmShader.js | 104 + .../three/examples/js/shaders/FocusShader.js | 91 + .../examples/js/shaders/FresnelShader.js | 74 + .../js/shaders/GammaCorrectionShader.js | 50 + .../js/shaders/HorizontalBlurShader.js | 62 + .../js/shaders/HorizontalTiltShiftShader.js | 65 + .../js/shaders/HueSaturationShader.js | 69 + .../examples/js/shaders/KaleidoShader.js | 60 + .../examples/js/shaders/LuminosityShader.js | 50 + .../three/examples/js/shaders/MirrorShader.js | 58 + .../examples/js/shaders/NormalMapShader.js | 53 + .../three/examples/js/shaders/OceanShaders.js | 388 + .../examples/js/shaders/ParallaxShader.js | 184 + .../examples/js/shaders/RGBShiftShader.js | 56 + .../three/examples/js/shaders/SSAOShader.js | 225 + .../three/examples/js/shaders/SepiaShader.js | 54 + .../examples/js/shaders/TechnicolorShader.js | 47 + .../examples/js/shaders/ToneMapShader.js | 75 + .../examples/js/shaders/TriangleBlurShader.js | 78 + .../js/shaders/UnpackDepthRGBAShader.js | 57 + .../examples/js/shaders/VerticalBlurShader.js | 62 + .../js/shaders/VerticalTiltShiftShader.js | 65 + .../examples/js/shaders/VignetteShader.js | 63 + .../three/examples/js/utils/FontUtils.js | 276 + .../three/examples/js/utils/GeometryUtils.js | 301 + .../three/examples/js/utils/ImageUtils.js | 136 + .../examples/js/utils/ShadowMapViewer.js | 190 + .../three/examples/js/utils/UVsDebug.js | 123 + node_modules/three/package.json | 109 + node_modules/three/src/Three.js | 345 + .../three/src/animation/AnimationAction.js | 165 + .../three/src/animation/AnimationClip.js | 310 + .../three/src/animation/AnimationMixer.js | 241 + .../three/src/animation/AnimationUtils.js | 112 + .../three/src/animation/KeyframeTrack.js | 274 + .../three/src/animation/PropertyBinding.js | 391 + .../animation/tracks/BooleanKeyframeTrack.js | 63 + .../animation/tracks/ColorKeyframeTrack.js | 73 + .../animation/tracks/NumberKeyframeTrack.js | 63 + .../tracks/QuaternionKeyframeTrack.js | 85 + .../animation/tracks/StringKeyframeTrack.js | 63 + .../animation/tracks/VectorKeyframeTrack.js | 76 + node_modules/three/src/cameras/Camera.js | 68 + node_modules/three/src/cameras/CubeCamera.js | 84 + .../three/src/cameras/OrthographicCamera.js | 70 + .../three/src/cameras/PerspectiveCamera.js | 152 + .../three/src/core/BufferAttribute.js | 376 + node_modules/three/src/core/BufferGeometry.js | 1024 + node_modules/three/src/core/Channels.js | 39 + node_modules/three/src/core/Clock.js | 69 + node_modules/three/src/core/DirectGeometry.js | 286 + .../three/src/core/EventDispatcher.js | 107 + node_modules/three/src/core/Face3.js | 59 + node_modules/three/src/core/Face4.js | 10 + node_modules/three/src/core/Geometry.js | 1174 + .../src/core/InstancedBufferAttribute.js | 24 + .../three/src/core/InstancedBufferGeometry.js | 61 + .../src/core/InstancedInterleavedBuffer.js | 24 + .../three/src/core/InterleavedBuffer.js | 88 + .../src/core/InterleavedBufferAttribute.js | 125 + node_modules/three/src/core/Object3D.js | 771 + node_modules/three/src/core/Raycaster.js | 135 + node_modules/three/src/extras/CurveUtils.js | 49 + .../three/src/extras/GeometryUtils.js | 33 + node_modules/three/src/extras/ImageUtils.js | 53 + node_modules/three/src/extras/SceneUtils.js | 40 + node_modules/three/src/extras/ShapeUtils.js | 750 + node_modules/three/src/extras/audio/Audio.js | 233 + .../three/src/extras/audio/AudioListener.js | 42 + node_modules/three/src/extras/core/Curve.js | 287 + .../three/src/extras/core/CurvePath.js | 176 + node_modules/three/src/extras/core/Path.js | 724 + node_modules/three/src/extras/core/Shape.js | 75 + .../three/src/extras/curves/ArcCurve.js | 12 + .../src/extras/curves/CatmullRomCurve3.js | 177 + .../src/extras/curves/ClosedSplineCurve3.js | 39 + .../src/extras/curves/CubicBezierCurve.js | 37 + .../src/extras/curves/CubicBezierCurve3.js | 28 + .../three/src/extras/curves/EllipseCurve.js | 62 + .../three/src/extras/curves/LineCurve.js | 38 + .../three/src/extras/curves/LineCurve3.js | 26 + .../src/extras/curves/QuadraticBezierCurve.js | 39 + .../extras/curves/QuadraticBezierCurve3.js | 27 + .../three/src/extras/curves/SplineCurve.js | 34 + .../three/src/extras/curves/SplineCurve3.js | 38 + .../src/extras/geometries/BoxGeometry.js | 144 + .../extras/geometries/CircleBufferGeometry.js | 80 + .../src/extras/geometries/CircleGeometry.js | 36 + .../src/extras/geometries/CylinderGeometry.js | 189 + .../extras/geometries/DodecahedronGeometry.js | 69 + .../src/extras/geometries/EdgesGeometry.js | 95 + .../src/extras/geometries/ExtrudeGeometry.js | 704 + .../extras/geometries/IcosahedronGeometry.js | 45 + .../src/extras/geometries/LatheGeometry.js | 106 + .../extras/geometries/OctahedronGeometry.js | 38 + .../extras/geometries/ParametricGeometry.js | 85 + .../extras/geometries/PlaneBufferGeometry.js | 109 + .../src/extras/geometries/PlaneGeometry.js | 37 + .../extras/geometries/PolyhedronGeometry.js | 254 + .../src/extras/geometries/RingGeometry.js | 107 + .../src/extras/geometries/ShapeGeometry.js | 131 + .../extras/geometries/SphereBufferGeometry.js | 117 + .../src/extras/geometries/SphereGeometry.js | 42 + .../extras/geometries/TetrahedronGeometry.js | 38 + .../src/extras/geometries/TorusGeometry.js | 93 + .../extras/geometries/TorusKnotGeometry.js | 130 + .../src/extras/geometries/TubeGeometry.js | 313 + .../extras/geometries/WireframeGeometry.js | 182 + .../three/src/extras/helpers/ArrowHelper.js | 110 + .../three/src/extras/helpers/AxisHelper.js | 33 + .../src/extras/helpers/BoundingBoxHelper.js | 30 + .../three/src/extras/helpers/BoxHelper.js | 74 + .../three/src/extras/helpers/CameraHelper.js | 189 + .../extras/helpers/DirectionalLightHelper.js | 83 + .../three/src/extras/helpers/EdgesHelper.js | 23 + .../src/extras/helpers/FaceNormalsHelper.js | 110 + .../three/src/extras/helpers/GridHelper.js | 40 + .../extras/helpers/HemisphereLightHelper.js | 60 + .../src/extras/helpers/PointLightHelper.js | 73 + .../src/extras/helpers/SkeletonHelper.js | 100 + .../src/extras/helpers/SpotLightHelper.js | 62 + .../src/extras/helpers/VertexNormalsHelper.js | 145 + .../src/extras/helpers/WireframeHelper.js | 17 + .../extras/objects/ImmediateRenderObject.js | 15 + .../src/extras/objects/MorphBlendMesh.js | 315 + node_modules/three/src/lights/AmbientLight.js | 16 + .../three/src/lights/DirectionalLight.js | 37 + .../three/src/lights/HemisphereLight.js | 33 + node_modules/three/src/lights/Light.js | 114 + node_modules/three/src/lights/LightShadow.js | 40 + node_modules/three/src/lights/PointLight.js | 35 + node_modules/three/src/lights/SpotLight.js | 45 + .../three/src/loaders/AnimationLoader.js | 51 + .../three/src/loaders/BinaryTextureLoader.js | 96 + .../three/src/loaders/BufferGeometryLoader.js | 93 + node_modules/three/src/loaders/Cache.js | 43 + .../src/loaders/CompressedTextureLoader.js | 135 + .../three/src/loaders/CubeTextureLoader.js | 60 + node_modules/three/src/loaders/ImageLoader.js | 91 + node_modules/three/src/loaders/JSONLoader.js | 546 + node_modules/three/src/loaders/Loader.js | 294 + .../three/src/loaders/LoadingManager.js | 70 + .../three/src/loaders/MaterialLoader.js | 139 + .../three/src/loaders/ObjectLoader.js | 617 + .../three/src/loaders/TextureLoader.js | 44 + node_modules/three/src/loaders/XHRLoader.js | 100 + .../three/src/materials/LineBasicMaterial.js | 62 + .../three/src/materials/LineDashedMaterial.js | 67 + node_modules/three/src/materials/Material.js | 265 + .../three/src/materials/MeshBasicMaterial.js | 118 + .../three/src/materials/MeshDepthMaterial.js | 43 + .../src/materials/MeshLambertMaterial.js | 111 + .../three/src/materials/MeshNormalMaterial.js | 44 + .../three/src/materials/MeshPhongMaterial.js | 180 + .../three/src/materials/MultiMaterial.js | 66 + .../three/src/materials/PointsMaterial.js | 87 + .../three/src/materials/RawShaderMaterial.js | 14 + .../three/src/materials/ShaderMaterial.js | 135 + .../three/src/materials/SpriteMaterial.js | 55 + node_modules/three/src/math/Box2.js | 236 + node_modules/three/src/math/Box3.js | 354 + node_modules/three/src/math/Color.js | 491 + node_modules/three/src/math/Euler.js | 325 + node_modules/three/src/math/Frustum.js | 180 + node_modules/three/src/math/Line3.js | 126 + node_modules/three/src/math/Math.js | 175 + node_modules/three/src/math/Matrix3.js | 295 + node_modules/three/src/math/Matrix4.js | 1036 + node_modules/three/src/math/Plane.js | 222 + node_modules/three/src/math/Quaternion.js | 523 + node_modules/three/src/math/Ray.js | 532 + node_modules/three/src/math/Sphere.js | 153 + node_modules/three/src/math/Spline.js | 176 + node_modules/three/src/math/Triangle.js | 192 + node_modules/three/src/math/Vector2.js | 434 + node_modules/three/src/math/Vector3.js | 801 + node_modules/three/src/math/Vector4.js | 616 + node_modules/three/src/objects/Bone.js | 28 + node_modules/three/src/objects/Group.js | 14 + node_modules/three/src/objects/LOD.js | 176 + node_modules/three/src/objects/LensFlare.js | 96 + node_modules/three/src/objects/Line.js | 187 + .../three/src/objects/LineSegments.js | 14 + node_modules/three/src/objects/Mesh.js | 331 + node_modules/three/src/objects/Points.js | 143 + node_modules/three/src/objects/Skeleton.js | 176 + node_modules/three/src/objects/SkinnedMesh.js | 150 + node_modules/three/src/objects/Sprite.js | 71 + .../three/src/renderers/WebGLRenderTarget.js | 235 + .../src/renderers/WebGLRenderTargetCube.js | 14 + .../three/src/renderers/WebGLRenderer.js | 3575 ++ .../src/renderers/shaders/ShaderChunk.js | 1 + .../ShaderChunk/alphamap_fragment.glsl | 5 + .../ShaderChunk/alphamap_pars_fragment.glsl | 5 + .../ShaderChunk/alphatest_fragment.glsl | 5 + .../shaders/ShaderChunk/aomap_fragment.glsl | 5 + .../ShaderChunk/aomap_pars_fragment.glsl | 6 + .../shaders/ShaderChunk/begin_vertex.glsl | 2 + .../ShaderChunk/beginnormal_vertex.glsl | 2 + .../ShaderChunk/bumpmap_pars_fragment.glsl | 40 + .../shaders/ShaderChunk/color_fragment.glsl | 5 + .../ShaderChunk/color_pars_fragment.glsl | 5 + .../ShaderChunk/color_pars_vertex.glsl | 5 + .../shaders/ShaderChunk/color_vertex.glsl | 5 + .../renderers/shaders/ShaderChunk/common.glsl | 128 + .../ShaderChunk/defaultnormal_vertex.glsl | 7 + .../displacementmap_pars_vertex.glsl | 7 + .../ShaderChunk/displacementmap_vertex.glsl | 5 + .../ShaderChunk/emissivemap_fragment.glsl | 9 + .../emissivemap_pars_fragment.glsl | 5 + .../shaders/ShaderChunk/envmap_fragment.glsl | 62 + .../ShaderChunk/envmap_pars_fragment.glsl | 21 + .../ShaderChunk/envmap_pars_vertex.glsl | 7 + .../shaders/ShaderChunk/envmap_vertex.glsl | 17 + .../shaders/ShaderChunk/fog_fragment.glsl | 25 + .../ShaderChunk/fog_pars_fragment.glsl | 15 + .../ShaderChunk/hemilight_fragment.glsl | 18 + .../ShaderChunk/lightmap_fragment.glsl | 5 + .../ShaderChunk/lightmap_pars_fragment.glsl | 6 + .../lights_lambert_pars_vertex.glsl | 35 + .../ShaderChunk/lights_lambert_vertex.glsl | 128 + .../ShaderChunk/lights_phong_fragment.glsl | 99 + .../lights_phong_pars_fragment.glsl | 52 + .../ShaderChunk/lights_phong_pars_vertex.glsl | 11 + .../ShaderChunk/lights_phong_vertex.glsl | 5 + .../ShaderChunk/linear_to_gamma_fragment.glsl | 2 + .../ShaderChunk/logdepthbuf_fragment.glsl | 5 + .../logdepthbuf_pars_fragment.glsl | 11 + .../ShaderChunk/logdepthbuf_pars_vertex.glsl | 11 + .../ShaderChunk/logdepthbuf_vertex.glsl | 15 + .../shaders/ShaderChunk/map_fragment.glsl | 9 + .../ShaderChunk/map_pars_fragment.glsl | 5 + .../ShaderChunk/map_particle_fragment.glsl | 5 + .../map_particle_pars_fragment.glsl | 6 + .../ShaderChunk/morphnormal_vertex.glsl | 8 + .../ShaderChunk/morphtarget_pars_vertex.glsl | 13 + .../ShaderChunk/morphtarget_vertex.glsl | 17 + .../ShaderChunk/normal_phong_fragment.glsl | 28 + .../ShaderChunk/normalmap_pars_fragment.glsl | 27 + .../shaders/ShaderChunk/project_vertex.glsl | 11 + .../ShaderChunk/shadowmap_fragment.glsl | 262 + .../ShaderChunk/shadowmap_pars_fragment.glsl | 106 + .../ShaderChunk/shadowmap_pars_vertex.glsl | 7 + .../shaders/ShaderChunk/shadowmap_vertex.glsl | 9 + .../shaders/ShaderChunk/skinbase_vertex.glsl | 8 + .../ShaderChunk/skinning_pars_vertex.glsl | 47 + .../shaders/ShaderChunk/skinning_vertex.glsl | 12 + .../ShaderChunk/skinnormal_vertex.glsl | 12 + .../ShaderChunk/specularmap_fragment.glsl | 12 + .../specularmap_pars_fragment.glsl | 5 + .../ShaderChunk/uv2_pars_fragment.glsl | 5 + .../shaders/ShaderChunk/uv2_pars_vertex.glsl | 6 + .../shaders/ShaderChunk/uv2_vertex.glsl | 5 + .../shaders/ShaderChunk/uv_pars_fragment.glsl | 5 + .../shaders/ShaderChunk/uv_pars_vertex.glsl | 6 + .../shaders/ShaderChunk/uv_vertex.glsl | 5 + .../shaders/ShaderChunk/worldpos_vertex.glsl | 13 + .../three/src/renderers/shaders/ShaderLib.js | 927 + .../src/renderers/shaders/UniformsLib.js | 130 + .../src/renderers/shaders/UniformsUtils.js | 67 + .../renderers/webgl/WebGLBufferRenderer.js | 54 + .../src/renderers/webgl/WebGLCapabilities.js | 67 + .../src/renderers/webgl/WebGLExtensions.js | 50 + .../src/renderers/webgl/WebGLGeometries.js | 116 + .../webgl/WebGLIndexedBufferRenderer.js | 65 + .../three/src/renderers/webgl/WebGLObjects.js | 225 + .../three/src/renderers/webgl/WebGLProgram.js | 506 + .../src/renderers/webgl/WebGLPrograms.js | 290 + .../src/renderers/webgl/WebGLProperties.js | 37 + .../three/src/renderers/webgl/WebGLShader.js | 43 + .../src/renderers/webgl/WebGLShadowMap.js | 399 + .../three/src/renderers/webgl/WebGLState.js | 530 + .../webgl/plugins/LensFlarePlugin.js | 474 + .../renderers/webgl/plugins/SpritePlugin.js | 367 + node_modules/three/src/scenes/Fog.js | 21 + node_modules/three/src/scenes/FogExp2.js | 19 + node_modules/three/src/scenes/Scene.js | 33 + .../three/src/textures/CanvasTexture.js | 14 + .../three/src/textures/CompressedTexture.js | 25 + .../three/src/textures/CubeTexture.js | 27 + .../three/src/textures/DataTexture.js | 20 + node_modules/three/src/textures/Texture.js | 271 + .../three/src/textures/VideoTexture.js | 30 + node_modules/three/three.js | 36187 +++++++++++++ node_modules/three/three.min.js | 883 + node_modules/webvr-boilerplate/.jscsrc | 4 + node_modules/webvr-boilerplate/.npmignore | 7 + node_modules/webvr-boilerplate/CONTRIBUTING | 21 + node_modules/webvr-boilerplate/COPYING | 202 + node_modules/webvr-boilerplate/README.md | 125 + .../build/device-info-test.js | 486 + .../webvr-boilerplate/build/webvr-manager.js | 2968 ++ node_modules/webvr-boilerplate/index.html | 193 + node_modules/webvr-boilerplate/package.json | 89 + node_modules/webvr-polyfill/.jscsrc | 4 + node_modules/webvr-polyfill/CONTRIBUTING | 21 + node_modules/webvr-polyfill/COPYING | 202 + node_modules/webvr-polyfill/README.md | 58 + .../webvr-polyfill/build/webvr-polyfill.js | 3333 ++ node_modules/webvr-polyfill/package.json | 83 + package.json | 31 + scripts/acl.txt | 21 + scripts/deploy.sh | 5 + scripts/js/device-motion-sender.js | 88 + src/analytics.js | 55 + src/device-motion-receiver.js | 55 + src/emitter.js | 63 + src/eyes.js | 20 + src/loading-indicator.js | 54 + src/main.js | 209 + src/photosphere-renderer.js | 258 + src/scene-info.js | 55 + src/scene-loader.js | 116 + src/util.js | 128 + src/vertex-distorter.js | 241 + src/with-analytics.js | 5 + style.css | 86 + 525 files changed, 239310 insertions(+) create mode 100644 .gitignore create mode 100644 CNAME create mode 100644 CONTRIBUTING create mode 100644 COPYING create mode 100644 README.md create mode 100644 build/device-motion-sender.min.js create mode 100644 build/vrview-analytics.js create mode 100644 build/vrview-analytics.min.js create mode 100644 build/vrview.js create mode 100644 build/vrview.min.js create mode 100644 examples/coral.jpg create mode 100644 examples/pano/andes_2048.jpg create mode 100644 examples/pano/andes_512.jpg create mode 100644 examples/pano/index.html create mode 100644 examples/style.css create mode 100755 examples/video/congo_2048.jpg create mode 100644 examples/video/congo_2048.mp4 create mode 100644 examples/video/index.html create mode 100644 images/ic_info_outline_black_24dp.svg create mode 100644 images/loading.gif create mode 100644 index.html create mode 100644 node_modules/es6-promise/CHANGELOG.md create mode 100644 node_modules/es6-promise/LICENSE create mode 100644 node_modules/es6-promise/README.md create mode 100644 node_modules/es6-promise/dist/es6-promise.js create mode 100644 node_modules/es6-promise/dist/es6-promise.min.js create mode 100644 node_modules/es6-promise/lib/es6-promise.umd.js create mode 100644 node_modules/es6-promise/lib/es6-promise/-internal.js create mode 100644 node_modules/es6-promise/lib/es6-promise/asap.js create mode 100644 node_modules/es6-promise/lib/es6-promise/enumerator.js create mode 100644 node_modules/es6-promise/lib/es6-promise/polyfill.js create mode 100644 node_modules/es6-promise/lib/es6-promise/promise.js create mode 100644 node_modules/es6-promise/lib/es6-promise/promise/all.js create mode 100644 node_modules/es6-promise/lib/es6-promise/promise/race.js create mode 100644 node_modules/es6-promise/lib/es6-promise/promise/reject.js create mode 100644 node_modules/es6-promise/lib/es6-promise/promise/resolve.js create mode 100644 node_modules/es6-promise/lib/es6-promise/then.js create mode 100644 node_modules/es6-promise/lib/es6-promise/utils.js create mode 100644 node_modules/es6-promise/package.json create mode 100644 node_modules/stats-js/LICENSE create mode 100644 node_modules/stats-js/README.md create mode 100644 node_modules/stats-js/build/stats.min.js create mode 100644 node_modules/stats-js/examples/basic.html create mode 100644 node_modules/stats-js/examples/theming.html create mode 100644 node_modules/stats-js/package.json create mode 100644 node_modules/stats-js/src/Stats.js create mode 100644 node_modules/stats-js/utils/builder.py create mode 100644 node_modules/stats-js/utils/compiler/COPYING create mode 100644 node_modules/stats-js/utils/compiler/README create mode 100644 node_modules/stats-js/utils/compiler/compiler.jar create mode 100644 node_modules/three/README.md create mode 100644 node_modules/three/examples/js/AnimationClipCreator.js create mode 100644 node_modules/three/examples/js/BlendCharacter.js create mode 100644 node_modules/three/examples/js/BlendCharacterGui.js create mode 100644 node_modules/three/examples/js/BufferGeometryUtils.js create mode 100644 node_modules/three/examples/js/Car.js create mode 100644 node_modules/three/examples/js/Cloth.js create mode 100644 node_modules/three/examples/js/CurveExtras.js create mode 100644 node_modules/three/examples/js/Detector.js create mode 100644 node_modules/three/examples/js/GPUParticleSystem.js create mode 100644 node_modules/three/examples/js/Gyroscope.js create mode 100644 node_modules/three/examples/js/ImprovedNoise.js create mode 100644 node_modules/three/examples/js/MD2Character.js create mode 100644 node_modules/three/examples/js/MD2CharacterComplex.js create mode 100644 node_modules/three/examples/js/MarchingCubes.js create mode 100644 node_modules/three/examples/js/Mirror.js create mode 100644 node_modules/three/examples/js/MorphAnimMesh.js create mode 100644 node_modules/three/examples/js/MorphAnimation.js create mode 100644 node_modules/three/examples/js/Ocean.js create mode 100644 node_modules/three/examples/js/Octree.js create mode 100644 node_modules/three/examples/js/PRNG.js create mode 100644 node_modules/three/examples/js/ParametricGeometries.js create mode 100644 node_modules/three/examples/js/ShaderGodRays.js create mode 100644 node_modules/three/examples/js/ShaderSkin.js create mode 100644 node_modules/three/examples/js/ShaderTerrain.js create mode 100644 node_modules/three/examples/js/ShaderToon.js create mode 100644 node_modules/three/examples/js/SimplexNoise.js create mode 100644 node_modules/three/examples/js/SimulationRenderer.js create mode 100644 node_modules/three/examples/js/SkyShader.js create mode 100644 node_modules/three/examples/js/TypedArrayUtils.js create mode 100644 node_modules/three/examples/js/UCSCharacter.js create mode 100644 node_modules/three/examples/js/WaterShader.js create mode 100644 node_modules/three/examples/js/cameras/CombinedCamera.js create mode 100644 node_modules/three/examples/js/controls/DeviceOrientationControls.js create mode 100644 node_modules/three/examples/js/controls/DragControls.js create mode 100644 node_modules/three/examples/js/controls/EditorControls.js create mode 100644 node_modules/three/examples/js/controls/FirstPersonControls.js create mode 100644 node_modules/three/examples/js/controls/FlyControls.js create mode 100644 node_modules/three/examples/js/controls/MouseControls.js create mode 100644 node_modules/three/examples/js/controls/OrbitControls.js create mode 100644 node_modules/three/examples/js/controls/OrthographicTrackballControls.js create mode 100644 node_modules/three/examples/js/controls/PointerLockControls.js create mode 100644 node_modules/three/examples/js/controls/TrackballControls.js create mode 100644 node_modules/three/examples/js/controls/TransformControls.js create mode 100644 node_modules/three/examples/js/controls/VRControls.js create mode 100644 node_modules/three/examples/js/crossfade/gui.js create mode 100644 node_modules/three/examples/js/crossfade/scenes.js create mode 100644 node_modules/three/examples/js/crossfade/transition.js create mode 100644 node_modules/three/examples/js/curves/NURBSCurve.js create mode 100644 node_modules/three/examples/js/curves/NURBSSurface.js create mode 100644 node_modules/three/examples/js/curves/NURBSUtils.js create mode 100644 node_modules/three/examples/js/effects/AnaglyphEffect.js create mode 100644 node_modules/three/examples/js/effects/AsciiEffect.js create mode 100644 node_modules/three/examples/js/effects/ParallaxBarrierEffect.js create mode 100644 node_modules/three/examples/js/effects/StereoEffect.js create mode 100644 node_modules/three/examples/js/effects/VREffect.js create mode 100644 node_modules/three/examples/js/exporters/OBJExporter.js create mode 100644 node_modules/three/examples/js/exporters/STLBinaryExporter.js create mode 100644 node_modules/three/examples/js/exporters/STLExporter.js create mode 100644 node_modules/three/examples/js/exporters/TypedGeometryExporter.js create mode 100644 node_modules/three/examples/js/geometries/ConvexGeometry.js create mode 100644 node_modules/three/examples/js/geometries/DecalGeometry.js create mode 100644 node_modules/three/examples/js/geometries/TeapotBufferGeometry.js create mode 100644 node_modules/three/examples/js/geometries/TextGeometry.js create mode 100644 node_modules/three/examples/js/geometries/hilbert2D.js create mode 100644 node_modules/three/examples/js/geometries/hilbert3D.js create mode 100644 node_modules/three/examples/js/libs/dat.gui.min.js create mode 100644 node_modules/three/examples/js/libs/jszip.min.js create mode 100644 node_modules/three/examples/js/libs/msgpack-js.js create mode 100644 node_modules/three/examples/js/libs/pnltri.min.js create mode 100644 node_modules/three/examples/js/libs/require.js create mode 100644 node_modules/three/examples/js/libs/stats.min.js create mode 100644 node_modules/three/examples/js/libs/system.min.js create mode 100644 node_modules/three/examples/js/libs/tween.min.js create mode 100644 node_modules/three/examples/js/loaders/AMFLoader.js create mode 100644 node_modules/three/examples/js/loaders/AWDLoader.js create mode 100644 node_modules/three/examples/js/loaders/AssimpJSONLoader.js create mode 100644 node_modules/three/examples/js/loaders/BabylonLoader.js create mode 100644 node_modules/three/examples/js/loaders/BinaryLoader.js create mode 100644 node_modules/three/examples/js/loaders/ColladaLoader.js create mode 100644 node_modules/three/examples/js/loaders/ColladaLoader2.js create mode 100644 node_modules/three/examples/js/loaders/DDSLoader.js create mode 100644 node_modules/three/examples/js/loaders/KMZLoader.js create mode 100644 node_modules/three/examples/js/loaders/MD2Loader.js create mode 100644 node_modules/three/examples/js/loaders/MTLLoader.js create mode 100644 node_modules/three/examples/js/loaders/OBJLoader.js create mode 100644 node_modules/three/examples/js/loaders/OBJMTLLoader.js create mode 100644 node_modules/three/examples/js/loaders/PDBLoader.js create mode 100644 node_modules/three/examples/js/loaders/PLYLoader.js create mode 100644 node_modules/three/examples/js/loaders/PVRLoader.js create mode 100644 node_modules/three/examples/js/loaders/RGBELoader.js create mode 100644 node_modules/three/examples/js/loaders/STLLoader.js create mode 100644 node_modules/three/examples/js/loaders/SVGLoader.js create mode 100644 node_modules/three/examples/js/loaders/TGALoader.js create mode 100644 node_modules/three/examples/js/loaders/UTF8Loader.js create mode 100644 node_modules/three/examples/js/loaders/VRMLLoader.js create mode 100644 node_modules/three/examples/js/loaders/VTKLoader.js create mode 100644 node_modules/three/examples/js/loaders/collada/Animation.js create mode 100644 node_modules/three/examples/js/loaders/collada/AnimationHandler.js create mode 100644 node_modules/three/examples/js/loaders/collada/KeyFrameAnimation.js create mode 100644 node_modules/three/examples/js/loaders/ctm/CTMLoader.js create mode 100644 node_modules/three/examples/js/loaders/ctm/CTMWorker.js create mode 100644 node_modules/three/examples/js/loaders/ctm/ctm.js create mode 100644 node_modules/three/examples/js/loaders/ctm/license/OpenCTM.txt create mode 100644 node_modules/three/examples/js/loaders/ctm/license/js-lzma.txt create mode 100644 node_modules/three/examples/js/loaders/ctm/license/js-openctm.txt create mode 100644 node_modules/three/examples/js/loaders/ctm/lzma.js create mode 100644 node_modules/three/examples/js/loaders/deprecated/SceneLoader.js create mode 100644 node_modules/three/examples/js/loaders/gltf/glTF-parser.js create mode 100644 node_modules/three/examples/js/loaders/gltf/glTFAnimation.js create mode 100644 node_modules/three/examples/js/loaders/gltf/glTFLoader.js create mode 100644 node_modules/three/examples/js/loaders/gltf/glTFLoaderUtils.js create mode 100644 node_modules/three/examples/js/loaders/sea3d/SEA3D.js create mode 100644 node_modules/three/examples/js/loaders/sea3d/SEA3DDeflate.js create mode 100644 node_modules/three/examples/js/loaders/sea3d/SEA3DLZMA.js create mode 100644 node_modules/three/examples/js/loaders/sea3d/SEA3DLoader.js create mode 100644 node_modules/three/examples/js/math/ColorConverter.js create mode 100644 node_modules/three/examples/js/math/Lut.js create mode 100644 node_modules/three/examples/js/modifiers/ExplodeModifier.js create mode 100644 node_modules/three/examples/js/modifiers/SubdivisionModifier.js create mode 100644 node_modules/three/examples/js/modifiers/TessellateModifier.js create mode 100644 node_modules/three/examples/js/objects/ShadowMesh.js create mode 100644 node_modules/three/examples/js/postprocessing/AdaptiveToneMappingPass.js create mode 100644 node_modules/three/examples/js/postprocessing/BloomPass.js create mode 100644 node_modules/three/examples/js/postprocessing/BokehPass.js create mode 100644 node_modules/three/examples/js/postprocessing/DotScreenPass.js create mode 100644 node_modules/three/examples/js/postprocessing/EffectComposer.js create mode 100644 node_modules/three/examples/js/postprocessing/FilmPass.js create mode 100644 node_modules/three/examples/js/postprocessing/GlitchPass.js create mode 100644 node_modules/three/examples/js/postprocessing/MaskPass.js create mode 100644 node_modules/three/examples/js/postprocessing/RenderPass.js create mode 100644 node_modules/three/examples/js/postprocessing/SavePass.js create mode 100644 node_modules/three/examples/js/postprocessing/ShaderPass.js create mode 100644 node_modules/three/examples/js/postprocessing/TexturePass.js create mode 100644 node_modules/three/examples/js/renderers/CSS2DRenderer.js create mode 100644 node_modules/three/examples/js/renderers/CSS3DRenderer.js create mode 100644 node_modules/three/examples/js/renderers/CSS3DStereoRenderer.js create mode 100644 node_modules/three/examples/js/renderers/CanvasRenderer.js create mode 100644 node_modules/three/examples/js/renderers/Projector.js create mode 100644 node_modules/three/examples/js/renderers/RaytracingRenderer.js create mode 100644 node_modules/three/examples/js/renderers/SVGRenderer.js create mode 100644 node_modules/three/examples/js/renderers/SoftwareRenderer.js create mode 100644 node_modules/three/examples/js/shaders/BasicShader.js create mode 100644 node_modules/three/examples/js/shaders/BleachBypassShader.js create mode 100644 node_modules/three/examples/js/shaders/BlendShader.js create mode 100644 node_modules/three/examples/js/shaders/BokehShader.js create mode 100644 node_modules/three/examples/js/shaders/BokehShader2.js create mode 100644 node_modules/three/examples/js/shaders/BrightnessContrastShader.js create mode 100644 node_modules/three/examples/js/shaders/ColorCorrectionShader.js create mode 100644 node_modules/three/examples/js/shaders/ColorifyShader.js create mode 100644 node_modules/three/examples/js/shaders/ConvolutionShader.js create mode 100644 node_modules/three/examples/js/shaders/CopyShader.js create mode 100644 node_modules/three/examples/js/shaders/DOFMipMapShader.js create mode 100644 node_modules/three/examples/js/shaders/DigitalGlitch.js create mode 100644 node_modules/three/examples/js/shaders/DotScreenShader.js create mode 100644 node_modules/three/examples/js/shaders/EdgeShader.js create mode 100644 node_modules/three/examples/js/shaders/EdgeShader2.js create mode 100644 node_modules/three/examples/js/shaders/FXAAShader.js create mode 100644 node_modules/three/examples/js/shaders/FilmShader.js create mode 100644 node_modules/three/examples/js/shaders/FocusShader.js create mode 100644 node_modules/three/examples/js/shaders/FresnelShader.js create mode 100644 node_modules/three/examples/js/shaders/GammaCorrectionShader.js create mode 100644 node_modules/three/examples/js/shaders/HorizontalBlurShader.js create mode 100644 node_modules/three/examples/js/shaders/HorizontalTiltShiftShader.js create mode 100644 node_modules/three/examples/js/shaders/HueSaturationShader.js create mode 100644 node_modules/three/examples/js/shaders/KaleidoShader.js create mode 100644 node_modules/three/examples/js/shaders/LuminosityShader.js create mode 100644 node_modules/three/examples/js/shaders/MirrorShader.js create mode 100644 node_modules/three/examples/js/shaders/NormalMapShader.js create mode 100644 node_modules/three/examples/js/shaders/OceanShaders.js create mode 100644 node_modules/three/examples/js/shaders/ParallaxShader.js create mode 100644 node_modules/three/examples/js/shaders/RGBShiftShader.js create mode 100644 node_modules/three/examples/js/shaders/SSAOShader.js create mode 100644 node_modules/three/examples/js/shaders/SepiaShader.js create mode 100644 node_modules/three/examples/js/shaders/TechnicolorShader.js create mode 100644 node_modules/three/examples/js/shaders/ToneMapShader.js create mode 100644 node_modules/three/examples/js/shaders/TriangleBlurShader.js create mode 100644 node_modules/three/examples/js/shaders/UnpackDepthRGBAShader.js create mode 100644 node_modules/three/examples/js/shaders/VerticalBlurShader.js create mode 100644 node_modules/three/examples/js/shaders/VerticalTiltShiftShader.js create mode 100644 node_modules/three/examples/js/shaders/VignetteShader.js create mode 100644 node_modules/three/examples/js/utils/FontUtils.js create mode 100644 node_modules/three/examples/js/utils/GeometryUtils.js create mode 100644 node_modules/three/examples/js/utils/ImageUtils.js create mode 100644 node_modules/three/examples/js/utils/ShadowMapViewer.js create mode 100644 node_modules/three/examples/js/utils/UVsDebug.js create mode 100644 node_modules/three/package.json create mode 100644 node_modules/three/src/Three.js create mode 100644 node_modules/three/src/animation/AnimationAction.js create mode 100644 node_modules/three/src/animation/AnimationClip.js create mode 100644 node_modules/three/src/animation/AnimationMixer.js create mode 100644 node_modules/three/src/animation/AnimationUtils.js create mode 100644 node_modules/three/src/animation/KeyframeTrack.js create mode 100644 node_modules/three/src/animation/PropertyBinding.js create mode 100644 node_modules/three/src/animation/tracks/BooleanKeyframeTrack.js create mode 100644 node_modules/three/src/animation/tracks/ColorKeyframeTrack.js create mode 100644 node_modules/three/src/animation/tracks/NumberKeyframeTrack.js create mode 100644 node_modules/three/src/animation/tracks/QuaternionKeyframeTrack.js create mode 100644 node_modules/three/src/animation/tracks/StringKeyframeTrack.js create mode 100644 node_modules/three/src/animation/tracks/VectorKeyframeTrack.js create mode 100644 node_modules/three/src/cameras/Camera.js create mode 100644 node_modules/three/src/cameras/CubeCamera.js create mode 100644 node_modules/three/src/cameras/OrthographicCamera.js create mode 100644 node_modules/three/src/cameras/PerspectiveCamera.js create mode 100644 node_modules/three/src/core/BufferAttribute.js create mode 100644 node_modules/three/src/core/BufferGeometry.js create mode 100644 node_modules/three/src/core/Channels.js create mode 100644 node_modules/three/src/core/Clock.js create mode 100644 node_modules/three/src/core/DirectGeometry.js create mode 100644 node_modules/three/src/core/EventDispatcher.js create mode 100644 node_modules/three/src/core/Face3.js create mode 100644 node_modules/three/src/core/Face4.js create mode 100644 node_modules/three/src/core/Geometry.js create mode 100644 node_modules/three/src/core/InstancedBufferAttribute.js create mode 100644 node_modules/three/src/core/InstancedBufferGeometry.js create mode 100644 node_modules/three/src/core/InstancedInterleavedBuffer.js create mode 100644 node_modules/three/src/core/InterleavedBuffer.js create mode 100644 node_modules/three/src/core/InterleavedBufferAttribute.js create mode 100644 node_modules/three/src/core/Object3D.js create mode 100644 node_modules/three/src/core/Raycaster.js create mode 100644 node_modules/three/src/extras/CurveUtils.js create mode 100644 node_modules/three/src/extras/GeometryUtils.js create mode 100644 node_modules/three/src/extras/ImageUtils.js create mode 100644 node_modules/three/src/extras/SceneUtils.js create mode 100644 node_modules/three/src/extras/ShapeUtils.js create mode 100644 node_modules/three/src/extras/audio/Audio.js create mode 100644 node_modules/three/src/extras/audio/AudioListener.js create mode 100644 node_modules/three/src/extras/core/Curve.js create mode 100644 node_modules/three/src/extras/core/CurvePath.js create mode 100644 node_modules/three/src/extras/core/Path.js create mode 100644 node_modules/three/src/extras/core/Shape.js create mode 100644 node_modules/three/src/extras/curves/ArcCurve.js create mode 100644 node_modules/three/src/extras/curves/CatmullRomCurve3.js create mode 100644 node_modules/three/src/extras/curves/ClosedSplineCurve3.js create mode 100644 node_modules/three/src/extras/curves/CubicBezierCurve.js create mode 100644 node_modules/three/src/extras/curves/CubicBezierCurve3.js create mode 100644 node_modules/three/src/extras/curves/EllipseCurve.js create mode 100644 node_modules/three/src/extras/curves/LineCurve.js create mode 100644 node_modules/three/src/extras/curves/LineCurve3.js create mode 100644 node_modules/three/src/extras/curves/QuadraticBezierCurve.js create mode 100644 node_modules/three/src/extras/curves/QuadraticBezierCurve3.js create mode 100644 node_modules/three/src/extras/curves/SplineCurve.js create mode 100644 node_modules/three/src/extras/curves/SplineCurve3.js create mode 100644 node_modules/three/src/extras/geometries/BoxGeometry.js create mode 100644 node_modules/three/src/extras/geometries/CircleBufferGeometry.js create mode 100644 node_modules/three/src/extras/geometries/CircleGeometry.js create mode 100644 node_modules/three/src/extras/geometries/CylinderGeometry.js create mode 100644 node_modules/three/src/extras/geometries/DodecahedronGeometry.js create mode 100644 node_modules/three/src/extras/geometries/EdgesGeometry.js create mode 100644 node_modules/three/src/extras/geometries/ExtrudeGeometry.js create mode 100644 node_modules/three/src/extras/geometries/IcosahedronGeometry.js create mode 100644 node_modules/three/src/extras/geometries/LatheGeometry.js create mode 100644 node_modules/three/src/extras/geometries/OctahedronGeometry.js create mode 100644 node_modules/three/src/extras/geometries/ParametricGeometry.js create mode 100644 node_modules/three/src/extras/geometries/PlaneBufferGeometry.js create mode 100644 node_modules/three/src/extras/geometries/PlaneGeometry.js create mode 100644 node_modules/three/src/extras/geometries/PolyhedronGeometry.js create mode 100644 node_modules/three/src/extras/geometries/RingGeometry.js create mode 100644 node_modules/three/src/extras/geometries/ShapeGeometry.js create mode 100644 node_modules/three/src/extras/geometries/SphereBufferGeometry.js create mode 100644 node_modules/three/src/extras/geometries/SphereGeometry.js create mode 100644 node_modules/three/src/extras/geometries/TetrahedronGeometry.js create mode 100644 node_modules/three/src/extras/geometries/TorusGeometry.js create mode 100644 node_modules/three/src/extras/geometries/TorusKnotGeometry.js create mode 100644 node_modules/three/src/extras/geometries/TubeGeometry.js create mode 100644 node_modules/three/src/extras/geometries/WireframeGeometry.js create mode 100644 node_modules/three/src/extras/helpers/ArrowHelper.js create mode 100644 node_modules/three/src/extras/helpers/AxisHelper.js create mode 100644 node_modules/three/src/extras/helpers/BoundingBoxHelper.js create mode 100644 node_modules/three/src/extras/helpers/BoxHelper.js create mode 100644 node_modules/three/src/extras/helpers/CameraHelper.js create mode 100644 node_modules/three/src/extras/helpers/DirectionalLightHelper.js create mode 100644 node_modules/three/src/extras/helpers/EdgesHelper.js create mode 100644 node_modules/three/src/extras/helpers/FaceNormalsHelper.js create mode 100644 node_modules/three/src/extras/helpers/GridHelper.js create mode 100644 node_modules/three/src/extras/helpers/HemisphereLightHelper.js create mode 100644 node_modules/three/src/extras/helpers/PointLightHelper.js create mode 100644 node_modules/three/src/extras/helpers/SkeletonHelper.js create mode 100644 node_modules/three/src/extras/helpers/SpotLightHelper.js create mode 100644 node_modules/three/src/extras/helpers/VertexNormalsHelper.js create mode 100644 node_modules/three/src/extras/helpers/WireframeHelper.js create mode 100644 node_modules/three/src/extras/objects/ImmediateRenderObject.js create mode 100644 node_modules/three/src/extras/objects/MorphBlendMesh.js create mode 100644 node_modules/three/src/lights/AmbientLight.js create mode 100644 node_modules/three/src/lights/DirectionalLight.js create mode 100644 node_modules/three/src/lights/HemisphereLight.js create mode 100644 node_modules/three/src/lights/Light.js create mode 100644 node_modules/three/src/lights/LightShadow.js create mode 100644 node_modules/three/src/lights/PointLight.js create mode 100644 node_modules/three/src/lights/SpotLight.js create mode 100644 node_modules/three/src/loaders/AnimationLoader.js create mode 100644 node_modules/three/src/loaders/BinaryTextureLoader.js create mode 100644 node_modules/three/src/loaders/BufferGeometryLoader.js create mode 100644 node_modules/three/src/loaders/Cache.js create mode 100644 node_modules/three/src/loaders/CompressedTextureLoader.js create mode 100644 node_modules/three/src/loaders/CubeTextureLoader.js create mode 100644 node_modules/three/src/loaders/ImageLoader.js create mode 100644 node_modules/three/src/loaders/JSONLoader.js create mode 100644 node_modules/three/src/loaders/Loader.js create mode 100644 node_modules/three/src/loaders/LoadingManager.js create mode 100644 node_modules/three/src/loaders/MaterialLoader.js create mode 100644 node_modules/three/src/loaders/ObjectLoader.js create mode 100644 node_modules/three/src/loaders/TextureLoader.js create mode 100644 node_modules/three/src/loaders/XHRLoader.js create mode 100644 node_modules/three/src/materials/LineBasicMaterial.js create mode 100644 node_modules/three/src/materials/LineDashedMaterial.js create mode 100644 node_modules/three/src/materials/Material.js create mode 100644 node_modules/three/src/materials/MeshBasicMaterial.js create mode 100644 node_modules/three/src/materials/MeshDepthMaterial.js create mode 100644 node_modules/three/src/materials/MeshLambertMaterial.js create mode 100644 node_modules/three/src/materials/MeshNormalMaterial.js create mode 100644 node_modules/three/src/materials/MeshPhongMaterial.js create mode 100644 node_modules/three/src/materials/MultiMaterial.js create mode 100644 node_modules/three/src/materials/PointsMaterial.js create mode 100644 node_modules/three/src/materials/RawShaderMaterial.js create mode 100644 node_modules/three/src/materials/ShaderMaterial.js create mode 100644 node_modules/three/src/materials/SpriteMaterial.js create mode 100644 node_modules/three/src/math/Box2.js create mode 100644 node_modules/three/src/math/Box3.js create mode 100644 node_modules/three/src/math/Color.js create mode 100644 node_modules/three/src/math/Euler.js create mode 100644 node_modules/three/src/math/Frustum.js create mode 100644 node_modules/three/src/math/Line3.js create mode 100644 node_modules/three/src/math/Math.js create mode 100644 node_modules/three/src/math/Matrix3.js create mode 100644 node_modules/three/src/math/Matrix4.js create mode 100644 node_modules/three/src/math/Plane.js create mode 100644 node_modules/three/src/math/Quaternion.js create mode 100644 node_modules/three/src/math/Ray.js create mode 100644 node_modules/three/src/math/Sphere.js create mode 100644 node_modules/three/src/math/Spline.js create mode 100644 node_modules/three/src/math/Triangle.js create mode 100644 node_modules/three/src/math/Vector2.js create mode 100644 node_modules/three/src/math/Vector3.js create mode 100644 node_modules/three/src/math/Vector4.js create mode 100644 node_modules/three/src/objects/Bone.js create mode 100644 node_modules/three/src/objects/Group.js create mode 100644 node_modules/three/src/objects/LOD.js create mode 100644 node_modules/three/src/objects/LensFlare.js create mode 100644 node_modules/three/src/objects/Line.js create mode 100644 node_modules/three/src/objects/LineSegments.js create mode 100644 node_modules/three/src/objects/Mesh.js create mode 100644 node_modules/three/src/objects/Points.js create mode 100644 node_modules/three/src/objects/Skeleton.js create mode 100644 node_modules/three/src/objects/SkinnedMesh.js create mode 100644 node_modules/three/src/objects/Sprite.js create mode 100644 node_modules/three/src/renderers/WebGLRenderTarget.js create mode 100644 node_modules/three/src/renderers/WebGLRenderTargetCube.js create mode 100644 node_modules/three/src/renderers/WebGLRenderer.js create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk.js create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/begin_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/color_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/color_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/common.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/fog_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/hemilight_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/lights_lambert_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/lights_phong_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/map_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/normal_phong_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/project_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/uv2_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/uv_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl create mode 100644 node_modules/three/src/renderers/shaders/ShaderLib.js create mode 100644 node_modules/three/src/renderers/shaders/UniformsLib.js create mode 100644 node_modules/three/src/renderers/shaders/UniformsUtils.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLBufferRenderer.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLCapabilities.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLExtensions.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLGeometries.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLIndexedBufferRenderer.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLObjects.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLProgram.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLPrograms.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLProperties.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLShader.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLShadowMap.js create mode 100644 node_modules/three/src/renderers/webgl/WebGLState.js create mode 100644 node_modules/three/src/renderers/webgl/plugins/LensFlarePlugin.js create mode 100644 node_modules/three/src/renderers/webgl/plugins/SpritePlugin.js create mode 100644 node_modules/three/src/scenes/Fog.js create mode 100644 node_modules/three/src/scenes/FogExp2.js create mode 100644 node_modules/three/src/scenes/Scene.js create mode 100644 node_modules/three/src/textures/CanvasTexture.js create mode 100644 node_modules/three/src/textures/CompressedTexture.js create mode 100644 node_modules/three/src/textures/CubeTexture.js create mode 100644 node_modules/three/src/textures/DataTexture.js create mode 100644 node_modules/three/src/textures/Texture.js create mode 100644 node_modules/three/src/textures/VideoTexture.js create mode 100644 node_modules/three/three.js create mode 100644 node_modules/three/three.min.js create mode 100644 node_modules/webvr-boilerplate/.jscsrc create mode 100644 node_modules/webvr-boilerplate/.npmignore create mode 100644 node_modules/webvr-boilerplate/CONTRIBUTING create mode 100644 node_modules/webvr-boilerplate/COPYING create mode 100644 node_modules/webvr-boilerplate/README.md create mode 100644 node_modules/webvr-boilerplate/build/device-info-test.js create mode 100644 node_modules/webvr-boilerplate/build/webvr-manager.js create mode 100644 node_modules/webvr-boilerplate/index.html create mode 100644 node_modules/webvr-boilerplate/package.json create mode 100644 node_modules/webvr-polyfill/.jscsrc create mode 100644 node_modules/webvr-polyfill/CONTRIBUTING create mode 100644 node_modules/webvr-polyfill/COPYING create mode 100644 node_modules/webvr-polyfill/README.md create mode 100644 node_modules/webvr-polyfill/build/webvr-polyfill.js create mode 100644 node_modules/webvr-polyfill/package.json create mode 100644 package.json create mode 100644 scripts/acl.txt create mode 100755 scripts/deploy.sh create mode 100644 scripts/js/device-motion-sender.js create mode 100644 src/analytics.js create mode 100644 src/device-motion-receiver.js create mode 100644 src/emitter.js create mode 100644 src/eyes.js create mode 100644 src/loading-indicator.js create mode 100644 src/main.js create mode 100644 src/photosphere-renderer.js create mode 100644 src/scene-info.js create mode 100644 src/scene-loader.js create mode 100644 src/util.js create mode 100644 src/vertex-distorter.js create mode 100644 src/with-analytics.js create mode 100644 style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..482e34b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +*.swp +*.swo diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..a76d3154 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +photovrse.com diff --git a/CONTRIBUTING b/CONTRIBUTING new file mode 100644 index 00000000..43b6883e --- /dev/null +++ b/CONTRIBUTING @@ -0,0 +1,22 @@ +# Building + +This project uses browserify to manage dependencies and build. Watchify is +especially convenient to preserve the write-and-reload model of development. +This package lives in the npm index. There is also a bower version of it, but it +is deprecated. + +Relevant commands: + + npm build - builds the module. + npm build-analytics - builds the module with analytics support. + npm watch - auto-builds the module whenever any source changes. + + +# Updating the npm entry + +Once changes are made, a new version can be published to the index using the +following commands: + + npm version + npm publish + git push diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..dfc59b7f --- /dev/null +++ b/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 Google Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 00000000..80508426 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +VR Views +======== + +Please read the documentation available at +. diff --git a/build/device-motion-sender.min.js b/build/device-motion-sender.min.js new file mode 100644 index 00000000..d43248e9 --- /dev/null +++ b/build/device-motion-sender.min.js @@ -0,0 +1 @@ +function DeviceMotionSender(){if(!this.isIOS_()){return}window.addEventListener("devicemotion",this.onDeviceMotion_.bind(this),false);this.iframes=document.querySelectorAll("iframe.vrview")}DeviceMotionSender.prototype.onDeviceMotion_=function(e){var message={type:"DeviceMotion",deviceMotionEvent:this.cloneDeviceMotionEvent_(e)};for(var i=0;it;t+=2){var e=X[t],n=X[t+1];e(n),X[t]=void 0,X[t+1]=void 0}G=0}function f(){try{var t=_dereq_,e=t("vertx");return U=e.runOnLoop||e.runOnContext,i()}catch(n){return c()}}function l(t,e){var n=this,r=n._state;if(r===et&&!t||r===nt&&!e)return this;var o=new this.constructor(p),i=n._result;if(r){var s=arguments[r-1];H(function(){C(r,o,s,i)})}else j(n,o,t,e);return o}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(p);return g(n,t),n}function p(){}function _(){return new TypeError("You cannot resolve a promise with itself")}function v(){return new TypeError("A promises callback cannot return that same promise.")}function d(t){try{return t.then}catch(e){return rt.error=e,rt}}function y(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function m(t,e,n){H(function(t){var r=!1,o=y(n,e,function(n){r||(r=!0,e!==n?g(t,n):E(t,n))},function(e){r||(r=!0,S(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,S(t,o))},t)}function w(t,e){e._state===et?E(t,e._result):e._state===nt?S(t,e._result):j(e,void 0,function(e){g(t,e)},function(e){S(t,e)})}function b(t,n,r){n.constructor===t.constructor&&r===Z&&constructor.resolve===$?w(t,n):r===rt?S(t,rt.error):void 0===r?E(t,n):e(r)?m(t,n,r):E(t,n)}function g(e,n){e===n?S(e,_()):t(n)?b(e,n,d(n)):E(e,n)}function A(t){t._onerror&&t._onerror(t._result),T(t)}function E(t,e){t._state===tt&&(t._result=e,t._state=et,0!==t._subscribers.length&&H(T,t))}function S(t,e){t._state===tt&&(t._state=nt,t._result=e,H(A,t))}function j(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+et]=n,o[i+nt]=r,0===i&&t._state&&H(T,t)}function T(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r,o,i=t._result,s=0;ss;s++)j(r.resolve(t[s]),void 0,e,n);return o}function Y(t){var e=this,n=new e(p);return S(n,t),n}function q(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function F(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function D(t){this._id=ct++,this._state=void 0,this._result=void 0,this._subscribers=[],p!==t&&("function"!=typeof t&&q(),this instanceof D?M(this,t):F())}function K(t,e){this._instanceConstructor=t,this.promise=new t(p),Array.isArray(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?E(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&E(this.promise,this._result))):S(this.promise,this._validationError())}function L(){var t;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;(!n||"[object Promise]"!==Object.prototype.toString.call(n.resolve())||n.cast)&&(t.Promise=at)}var N;N=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var U,W,z,B=N,G=0,H=function(t,e){X[G]=t,X[G+1]=e,G+=2,2===G&&(W?W(a):z())},I="undefined"!=typeof window?window:void 0,J=I||{},Q=J.MutationObserver||J.WebKitMutationObserver,R="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),V="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,X=new Array(1e3);z=R?o():Q?s():V?u():void 0===I&&"function"==typeof _dereq_?f():c();var Z=l,$=h,tt=void 0,et=1,nt=2,rt=new P,ot=new P,it=O,st=k,ut=Y,ct=0,at=D;D.all=it,D.race=st,D.resolve=$,D.reject=ut,D._setScheduler=n,D._setAsap=r,D._asap=H,D.prototype={constructor:D,then:Z,"catch":function(t){return this.then(null,t)}};var ft=K;K.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},K.prototype._enumerate=function(){for(var t=this.length,e=this._input,n=0;this._state===tt&&t>n;n++)this._eachEntry(e[n],n)},K.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===$){var o=d(t);if(o===Z&&t._state!==tt)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===at){var i=new n(p);b(i,t,o),this._willSettleAt(i,e)}else this._willSettleAt(new n(function(e){e(t)}),e)}else this._willSettleAt(r(t),e)},K.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===tt&&(this._remaining--,t===nt?S(r,n):this._result[e]=n),0===this._remaining&&E(r,this._result)},K.prototype._willSettleAt=function(t,e){var n=this;j(t,void 0,function(t){n._settledAt(et,e,t)},function(t){n._settledAt(nt,e,t)})};var lt=L,ht={Promise:at,polyfill:lt};"function"==typeof define&&define.amd?define(function(){return ht}):"undefined"!=typeof module&&module.exports?module.exports=ht:"undefined"!=typeof this&&(this.ES6Promise=ht),lt()}).call(this); +}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"_process":20}],2:[function(_dereq_,module,exports){ +// stats.js - http://github.com/mrdoob/stats.js +var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px"; +i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div"); +k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display= +"block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height= +a+"px",m=b,r=0);return b},update:function(){l=this.end()}}};"object"===typeof module&&(module.exports=Stats); + +},{}],3:[function(_dereq_,module,exports){ +/** + * @author dmarcos / https://github.com/dmarcos + * @author mrdoob / http://mrdoob.com + */ + +var VRControls = function ( object, onError ) { + + var scope = this; + + var vrInputs = []; + + function filterInvalidDevices( devices ) { + + // Exclude Cardboard position sensor if Oculus exists. + + var oculusDevices = devices.filter( function ( device ) { + + return device.deviceName.toLowerCase().indexOf( 'oculus' ) !== - 1; + + } ); + + if ( oculusDevices.length >= 1 ) { + + return devices.filter( function ( device ) { + + return device.deviceName.toLowerCase().indexOf( 'cardboard' ) === - 1; + + } ); + + } else { + + return devices; + + } + + } + + function gotVRDevices( devices ) { + + devices = filterInvalidDevices( devices ); + + for ( var i = 0; i < devices.length; i ++ ) { + + if ( devices[ i ] instanceof PositionSensorVRDevice ) { + + vrInputs.push( devices[ i ] ); + + } + + } + + if ( onError ) onError( 'HMD not available' ); + + } + + if ( navigator.getVRDevices ) { + + navigator.getVRDevices().then( gotVRDevices ); + + } + + // the Rift SDK returns the position in meters + // this scale factor allows the user to define how meters + // are converted to scene units. + + this.scale = 1; + + this.update = function () { + + for ( var i = 0; i < vrInputs.length; i ++ ) { + + var vrInput = vrInputs[ i ]; + + var state = vrInput.getState(); + + if ( state.orientation !== null ) { + + object.quaternion.copy( state.orientation ); + + } + + if ( state.position !== null ) { + + object.position.copy( state.position ).multiplyScalar( scope.scale ); + + } + + } + + }; + + this.resetSensor = function () { + + for ( var i = 0; i < vrInputs.length; i ++ ) { + + var vrInput = vrInputs[ i ]; + + if ( vrInput.resetSensor !== undefined ) { + + vrInput.resetSensor(); + + } else if ( vrInput.zeroSensor !== undefined ) { + + vrInput.zeroSensor(); + + } + + } + + }; + + this.zeroSensor = function () { + + console.warn( 'THREE.VRControls: .zeroSensor() is now .resetSensor().' ); + this.resetSensor(); + + }; + + this.dispose = function () { + + vrInputs = []; + + }; + +}; + +try { + module.exports = VRControls; +} catch (e) { + THREE.VRControls = VRControls; +} + +},{}],4:[function(_dereq_,module,exports){ +/** + * @author dmarcos / https://github.com/dmarcos + * @author mrdoob / http://mrdoob.com + * + * WebVR Spec: http://mozvr.github.io/webvr-spec/webvr.html + * + * Firefox: http://mozvr.com/downloads/ + * Chromium: https://drive.google.com/folderview?id=0BzudLt22BqGRbW9WTHMtOWMzNjQ&usp=sharing#list + * + */ + +var VREffect = function ( renderer, onError ) { + + var vrHMD; + var eyeTranslationL, eyeFOVL, rectL; + var eyeTranslationR, eyeFOVR, rectR; + + function gotVRDevices( devices ) { + + for ( var i = 0; i < devices.length; i ++ ) { + + if ( devices[ i ] instanceof HMDVRDevice ) { + + vrHMD = devices[ i ]; + + break; // We keep the first we encounter + + } + + } + + if ( vrHMD === undefined ) { + + if ( onError ) onError( 'HMD not available' ); + + } + + } + + if ( navigator.getVRDevices ) { + + navigator.getVRDevices().then( gotVRDevices ); + + } + + // + + this.scale = 1; + + this.setSize = function( width, height ) { + + renderer.setSize( width, height ); + + }; + + // fullscreen + + var isFullscreen = false; + + var canvas = renderer.domElement; + var fullscreenchange = canvas.mozRequestFullScreen ? 'mozfullscreenchange' : 'webkitfullscreenchange'; + + document.addEventListener( fullscreenchange, function ( event ) { + + isFullscreen = document.mozFullScreenElement || document.webkitFullscreenElement; + + }, false ); + + this.setFullScreen = function ( boolean ) { + + if ( vrHMD === undefined ) return; + if ( isFullscreen === boolean ) return; + + if ( canvas.mozRequestFullScreen ) { + + canvas.mozRequestFullScreen( { vrDisplay: vrHMD } ); + + } else if ( canvas.webkitRequestFullscreen ) { + + canvas.webkitRequestFullscreen( { vrDisplay: vrHMD } ); + + } + + }; + + // render + + var cameraL = new THREE.PerspectiveCamera(); + var cameraR = new THREE.PerspectiveCamera(); + + this.render = function ( scene, camera ) { + + if ( vrHMD ) { + + var eyeParamsL = vrHMD.getEyeParameters( 'left' ); + var eyeParamsR = vrHMD.getEyeParameters( 'right' ); + + eyeTranslationL = eyeParamsL.eyeTranslation; + eyeTranslationR = eyeParamsR.eyeTranslation; + eyeFOVL = eyeParamsL.recommendedFieldOfView; + eyeFOVR = eyeParamsR.recommendedFieldOfView; + rectL = eyeParamsL.renderRect; + rectR = eyeParamsR.renderRect; + + var sceneL, sceneR; + + if ( Array.isArray( scene ) ) { + + sceneL = scene[ 0 ]; + sceneR = scene[ 1 ]; + + } else { + + sceneL = scene; + sceneR = scene; + + } + + var size = renderer.getSize(); + size.width /= 2; + + renderer.enableScissorTest( true ); + renderer.clear(); + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + cameraL.projectionMatrix = fovToProjection( eyeFOVL, true, camera.near, camera.far ); + cameraR.projectionMatrix = fovToProjection( eyeFOVR, true, camera.near, camera.far ); + + camera.matrixWorld.decompose( cameraL.position, cameraL.quaternion, cameraL.scale ); + camera.matrixWorld.decompose( cameraR.position, cameraR.quaternion, cameraR.scale ); + + cameraL.translateX( eyeTranslationL.x * this.scale ); + cameraR.translateX( eyeTranslationR.x * this.scale ); + + // render left eye + if ( rectL ) { + + renderer.setViewport( rectL.x, rectL.y, rectL.width, rectL.height ); + renderer.setScissor( rectL.x, rectL.y, rectL.width, rectL.height ); + + } else { + + renderer.setViewport( 0, 0, size.width, size.height ); + renderer.setScissor( 0, 0, size.width, size.height ); + + } + renderer.render( sceneL, cameraL ); + + // render right eye + if ( rectR ) { + + renderer.setViewport( rectR.x, rectR.y, rectR.width, rectR.height ); + renderer.setScissor( rectR.x, rectR.y, rectR.width, rectR.height ); + + } else { + + renderer.setViewport( size.width, 0, size.width, size.height ); + renderer.setScissor( size.width, 0, size.width, size.height ); + + } + renderer.render( sceneR, cameraR ); + + renderer.enableScissorTest( false ); + + return; + + } + + // Regular render mode if not HMD + + if ( Array.isArray( scene ) ) scene = scene[ 0 ]; + + renderer.render( scene, camera ); + + }; + + // + + function fovToNDCScaleOffset( fov ) { + + var pxscale = 2.0 / ( fov.leftTan + fov.rightTan ); + var pxoffset = ( fov.leftTan - fov.rightTan ) * pxscale * 0.5; + var pyscale = 2.0 / ( fov.upTan + fov.downTan ); + var pyoffset = ( fov.upTan - fov.downTan ) * pyscale * 0.5; + return { scale: [ pxscale, pyscale ], offset: [ pxoffset, pyoffset ] }; + + } + + function fovPortToProjection( fov, rightHanded, zNear, zFar ) { + + rightHanded = rightHanded === undefined ? true : rightHanded; + zNear = zNear === undefined ? 0.01 : zNear; + zFar = zFar === undefined ? 10000.0 : zFar; + + var handednessScale = rightHanded ? - 1.0 : 1.0; + + // start with an identity matrix + var mobj = new THREE.Matrix4(); + var m = mobj.elements; + + // and with scale/offset info for normalized device coords + var scaleAndOffset = fovToNDCScaleOffset( fov ); + + // X result, map clip edges to [-w,+w] + m[ 0 * 4 + 0 ] = scaleAndOffset.scale[ 0 ]; + m[ 0 * 4 + 1 ] = 0.0; + m[ 0 * 4 + 2 ] = scaleAndOffset.offset[ 0 ] * handednessScale; + m[ 0 * 4 + 3 ] = 0.0; + + // Y result, map clip edges to [-w,+w] + // Y offset is negated because this proj matrix transforms from world coords with Y=up, + // but the NDC scaling has Y=down (thanks D3D?) + m[ 1 * 4 + 0 ] = 0.0; + m[ 1 * 4 + 1 ] = scaleAndOffset.scale[ 1 ]; + m[ 1 * 4 + 2 ] = - scaleAndOffset.offset[ 1 ] * handednessScale; + m[ 1 * 4 + 3 ] = 0.0; + + // Z result (up to the app) + m[ 2 * 4 + 0 ] = 0.0; + m[ 2 * 4 + 1 ] = 0.0; + m[ 2 * 4 + 2 ] = zFar / ( zNear - zFar ) * - handednessScale; + m[ 2 * 4 + 3 ] = ( zFar * zNear ) / ( zNear - zFar ); + + // W result (= Z in) + m[ 3 * 4 + 0 ] = 0.0; + m[ 3 * 4 + 1 ] = 0.0; + m[ 3 * 4 + 2 ] = handednessScale; + m[ 3 * 4 + 3 ] = 0.0; + + mobj.transpose(); + + return mobj; + + } + + function fovToProjection( fov, rightHanded, zNear, zFar ) { + + var DEG2RAD = Math.PI / 180.0; + + var fovPort = { + upTan: Math.tan( fov.upDegrees * DEG2RAD ), + downTan: Math.tan( fov.downDegrees * DEG2RAD ), + leftTan: Math.tan( fov.leftDegrees * DEG2RAD ), + rightTan: Math.tan( fov.rightDegrees * DEG2RAD ) + }; + + return fovPortToProjection( fovPort, rightHanded, zNear, zFar ); + + } + +}; + +try { + module.exports = VREffect; +} catch (e) { + THREE.VREffect = VREffect; +} + +},{}],5:[function(_dereq_,module,exports){ +var self = self || {};// File:src/Three.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var THREE = { REVISION: '73' }; + +// + +if ( typeof define === 'function' && define.amd ) { + + define( 'three', THREE ); + +} else if ( 'undefined' !== typeof exports && 'undefined' !== typeof module ) { + + module.exports = THREE; + +} + + +// polyfills + +if ( self.requestAnimationFrame === undefined || self.cancelAnimationFrame === undefined ) { + + // Missing in Android stock browser. + + ( function () { + + var lastTime = 0; + var vendors = [ 'ms', 'moz', 'webkit', 'o' ]; + + for ( var x = 0; x < vendors.length && ! self.requestAnimationFrame; ++ x ) { + + self.requestAnimationFrame = self[ vendors[ x ] + 'RequestAnimationFrame' ]; + self.cancelAnimationFrame = self[ vendors[ x ] + 'CancelAnimationFrame' ] || self[ vendors[ x ] + 'CancelRequestAnimationFrame' ]; + + } + + if ( self.requestAnimationFrame === undefined && self.setTimeout !== undefined ) { + + self.requestAnimationFrame = function ( callback ) { + + var currTime = Date.now(), timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) ); + var id = self.setTimeout( function () { + + callback( currTime + timeToCall ); + + }, timeToCall ); + lastTime = currTime + timeToCall; + return id; + + }; + + } + + if ( self.cancelAnimationFrame === undefined && self.clearTimeout !== undefined ) { + + self.cancelAnimationFrame = function ( id ) { + + self.clearTimeout( id ); + + }; + + } + + } )(); + +} + +// + +if ( self.performance === undefined ) { + + self.performance = {}; + +} + +if ( self.performance.now === undefined ) { + + ( function () { + + var start = Date.now(); + + self.performance.now = function () { + + return Date.now() - start; + + } + + } )(); + +} + +// + +if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, -52 ); + +} + +// + +if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + +} + +if ( Function.prototype.name === undefined && Object.defineProperty !== undefined ) { + + // Missing in IE9-11. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*(\S*)\s*\(/ )[ 1 ]; + + } + + } ); + +} + +// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent.button + +THREE.MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + +// GL STATE CONSTANTS + +THREE.CullFaceNone = 0; +THREE.CullFaceBack = 1; +THREE.CullFaceFront = 2; +THREE.CullFaceFrontBack = 3; + +THREE.FrontFaceDirectionCW = 0; +THREE.FrontFaceDirectionCCW = 1; + +// SHADOWING TYPES + +THREE.BasicShadowMap = 0; +THREE.PCFShadowMap = 1; +THREE.PCFSoftShadowMap = 2; + +// MATERIAL CONSTANTS + +// side + +THREE.FrontSide = 0; +THREE.BackSide = 1; +THREE.DoubleSide = 2; + +// shading + +THREE.FlatShading = 1; +THREE.SmoothShading = 2; + +// colors + +THREE.NoColors = 0; +THREE.FaceColors = 1; +THREE.VertexColors = 2; + +// blending modes + +THREE.NoBlending = 0; +THREE.NormalBlending = 1; +THREE.AdditiveBlending = 2; +THREE.SubtractiveBlending = 3; +THREE.MultiplyBlending = 4; +THREE.CustomBlending = 5; + +// custom blending equations +// (numbers start from 100 not to clash with other +// mappings to OpenGL constants defined in Texture.js) + +THREE.AddEquation = 100; +THREE.SubtractEquation = 101; +THREE.ReverseSubtractEquation = 102; +THREE.MinEquation = 103; +THREE.MaxEquation = 104; + +// custom blending destination factors + +THREE.ZeroFactor = 200; +THREE.OneFactor = 201; +THREE.SrcColorFactor = 202; +THREE.OneMinusSrcColorFactor = 203; +THREE.SrcAlphaFactor = 204; +THREE.OneMinusSrcAlphaFactor = 205; +THREE.DstAlphaFactor = 206; +THREE.OneMinusDstAlphaFactor = 207; + +// custom blending source factors + +//THREE.ZeroFactor = 200; +//THREE.OneFactor = 201; +//THREE.SrcAlphaFactor = 204; +//THREE.OneMinusSrcAlphaFactor = 205; +//THREE.DstAlphaFactor = 206; +//THREE.OneMinusDstAlphaFactor = 207; +THREE.DstColorFactor = 208; +THREE.OneMinusDstColorFactor = 209; +THREE.SrcAlphaSaturateFactor = 210; + +// depth modes + +THREE.NeverDepth = 0; +THREE.AlwaysDepth = 1; +THREE.LessDepth = 2; +THREE.LessEqualDepth = 3; +THREE.EqualDepth = 4; +THREE.GreaterEqualDepth = 5; +THREE.GreaterDepth = 6; +THREE.NotEqualDepth = 7; + + +// TEXTURE CONSTANTS + +THREE.MultiplyOperation = 0; +THREE.MixOperation = 1; +THREE.AddOperation = 2; + +// Mapping modes + +THREE.UVMapping = 300; + +THREE.CubeReflectionMapping = 301; +THREE.CubeRefractionMapping = 302; + +THREE.EquirectangularReflectionMapping = 303; +THREE.EquirectangularRefractionMapping = 304; + +THREE.SphericalReflectionMapping = 305; + +// Wrapping modes + +THREE.RepeatWrapping = 1000; +THREE.ClampToEdgeWrapping = 1001; +THREE.MirroredRepeatWrapping = 1002; + +// Filters + +THREE.NearestFilter = 1003; +THREE.NearestMipMapNearestFilter = 1004; +THREE.NearestMipMapLinearFilter = 1005; +THREE.LinearFilter = 1006; +THREE.LinearMipMapNearestFilter = 1007; +THREE.LinearMipMapLinearFilter = 1008; + +// Data types + +THREE.UnsignedByteType = 1009; +THREE.ByteType = 1010; +THREE.ShortType = 1011; +THREE.UnsignedShortType = 1012; +THREE.IntType = 1013; +THREE.UnsignedIntType = 1014; +THREE.FloatType = 1015; +THREE.HalfFloatType = 1025; + +// Pixel types + +//THREE.UnsignedByteType = 1009; +THREE.UnsignedShort4444Type = 1016; +THREE.UnsignedShort5551Type = 1017; +THREE.UnsignedShort565Type = 1018; + +// Pixel formats + +THREE.AlphaFormat = 1019; +THREE.RGBFormat = 1020; +THREE.RGBAFormat = 1021; +THREE.LuminanceFormat = 1022; +THREE.LuminanceAlphaFormat = 1023; +// THREE.RGBEFormat handled as THREE.RGBAFormat in shaders +THREE.RGBEFormat = THREE.RGBAFormat; //1024; + +// DDS / ST3C Compressed texture formats + +THREE.RGB_S3TC_DXT1_Format = 2001; +THREE.RGBA_S3TC_DXT1_Format = 2002; +THREE.RGBA_S3TC_DXT3_Format = 2003; +THREE.RGBA_S3TC_DXT5_Format = 2004; + + +// PVRTC compressed texture formats + +THREE.RGB_PVRTC_4BPPV1_Format = 2100; +THREE.RGB_PVRTC_2BPPV1_Format = 2101; +THREE.RGBA_PVRTC_4BPPV1_Format = 2102; +THREE.RGBA_PVRTC_2BPPV1_Format = 2103; + +// Loop styles for AnimationAction + +THREE.LoopOnce = 2200; +THREE.LoopRepeat = 2201; +THREE.LoopPingPong = 2202; + +// DEPRECATED + +THREE.Projector = function () { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function ( vector, camera ) { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + +}; + +THREE.CanvasRenderer = function () { + + console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' ); + + this.domElement = document.createElement( 'canvas' ); + this.clear = function () {}; + this.render = function () {}; + this.setClearColor = function () {}; + this.setSize = function () {}; + +}; + +// File:src/math/Color.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Color = function ( color ) { + + if ( arguments.length === 3 ) { + + return this.fromArray( arguments ); + + } + + return this.set( color ); + +}; + +THREE.Color.prototype = { + + constructor: THREE.Color, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value instanceof THREE.Color ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function ( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = THREE.Math.euclideanModulo( h, 1 ); + s = THREE.Math.clamp( s, 0, 1 ); + l = THREE.Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = THREE.ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( optionalTarget ) { + + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + hsl.h = hue; + hsl.s = saturation; + hsl.l = lightness; + + return hsl; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function ( h, s, l ) { + + var hsl = this.getHSL(); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }, + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + } + +}; + +THREE.ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, +'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, +'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, +'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, +'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, +'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, +'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, +'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, +'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, +'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, +'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, +'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, +'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, +'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, +'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, +'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, +'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, +'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, +'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, +'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, +'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, +'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, +'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, +'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + +// File:src/math/Quaternion.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +THREE.Quaternion = function ( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + +}; + +THREE.Quaternion.prototype = { + + constructor: THREE.Quaternion, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get w () { + + return this._w; + + }, + + set w ( value ) { + + this._w = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( euler instanceof THREE.Euler === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var c1 = Math.cos( euler._x / 2 ); + var c2 = Math.cos( euler._y / 2 ); + var c3 = Math.cos( euler._z / 2 ); + var s1 = Math.sin( euler._x / 2 ); + var s2 = Math.sin( euler._y / 2 ); + var s3 = Math.sin( euler._z / 2 ); + + var order = euler.order; + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final + + // assumes direction vectors vFrom and vTo are normalized + + var v1, r; + + var EPS = 0.000001; + + return function ( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + this.normalize(); + + return this; + + } + + }(), + + inverse: function () { + + this.conjugate().normalize(); + + return this; + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var halfTheta = Math.acos( cosHalfTheta ); + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + +}; + +THREE.Quaternion.slerp = function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + +}; + +// File:src/math/Vector2.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.Vector2 = function ( x, y ) { + + this.x = x || 0; + this.y = y || 0; + +}; + +THREE.Vector2.prototype = { + + constructor: THREE.Vector2, + + get width() { return this.x }, + set width( value ) { this.x = value }, + + get height() { return this.y }, + set height( value ) { this.y = value }, + + // + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + this.x *= scalar; + this.y *= scalar; + } else { + this.x = 0; + this.y = 0; + } + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector2(); + max = new THREE.Vector2(); + + } + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + return this; + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + lengthManhattan: function() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + +}; + +// File:src/math/Vector3.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Vector3 = function ( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + +}; + +THREE.Vector3.prototype = { + + constructor: THREE.Vector3, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + } else { + this.x = 0; + this.y = 0; + this.z = 0; + } + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion; + + return function applyEuler( euler ) { + + if ( euler instanceof THREE.Euler === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); + + this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + return this; + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion; + + return function applyAxisAngle( axis, angle ) { + + if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); + + this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + return this; + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x; + var y = this.y; + var z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + // input: THREE.Matrix4 affine matrix + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + + return this; + + }, + + applyProjection: function ( m ) { + + // input: THREE.Matrix4 projection matrix + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + var d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x; + var y = this.y; + var z = this.z; + + var qx = q.x; + var qy = q.y; + var qz = q.z; + var qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix; + + return function project( camera ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix; + + return function unproject( camera ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + this.normalize(); + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector3(); + max = new THREE.Vector3(); + + } + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + return this; + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + return this; + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function () { + + var v1, dot; + + return function projectOnVector( vector ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + v1.copy( vector ).normalize(); + + dot = this.dot( v1 ); + + return this.copy( v1 ).multiplyScalar( dot ); + + }; + + }(), + + projectOnPlane: function () { + + var v1; + + return function projectOnPlane( planeNormal ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + } + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1; + + return function reflect( normal ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + } + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( this.length() * v.length() ); + + // clamp, to handle numerical problems + + return Math.acos( THREE.Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x; + var dy = this.y - v.y; + var dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + setEulerFromRotationMatrix: function ( m, order ) { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + + setEulerFromQuaternion: function ( q, order ) { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + + return this.setFromMatrixPosition( m ); + + }, + + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + + return this.setFromMatrixScale( m ); + + }, + + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + + return this.setFromMatrixColumn( index, matrix ); + + }, + + setFromMatrixPosition: function ( m ) { + + this.x = m.elements[ 12 ]; + this.y = m.elements[ 13 ]; + this.z = m.elements[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.set( m.elements[ 0 ], m.elements[ 1 ], m.elements[ 2 ] ).length(); + var sy = this.set( m.elements[ 4 ], m.elements[ 5 ], m.elements[ 6 ] ).length(); + var sz = this.set( m.elements[ 8 ], m.elements[ 9 ], m.elements[ 10 ] ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( index, matrix ) { + + var offset = index * 4; + + var me = matrix.elements; + + this.x = me[ offset ]; + this.y = me[ offset + 1 ]; + this.z = me[ offset + 2 ]; + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + + return this; + + } + +}; + +// File:src/math/Vector4.js + +/** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Vector4 = function ( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + +}; + +THREE.Vector4.prototype = { + + constructor: THREE.Vector4, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + } else { + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 0; + } + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x; + var y = this.y; + var z = this.z; + var w = this.w; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) + && ( Math.abs( m13 - m31 ) < epsilon ) + && ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) + && ( Math.abs( m13 + m31 ) < epsilon2 ) + && ( Math.abs( m23 + m32 ) < epsilon2 ) + && ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector4(); + max = new THREE.Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + this.w = attribute.array[ index + 3 ]; + + return this; + + } + +}; + +// File:src/math/Euler.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +THREE.Euler = function ( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || THREE.Euler.DefaultOrder; + +}; + +THREE.Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + +THREE.Euler.DefaultOrder = 'XYZ'; + +THREE.Euler.prototype = { + + constructor: THREE.Euler, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get order () { + + return this._order; + + }, + + set order ( value ) { + + this._order = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = THREE.Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ) + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix; + + return function ( q, order, update ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + matrix.makeRotationFromQuaternion( q ); + this.setFromRotationMatrix( matrix, order, update ); + + return this; + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new THREE.Quaternion(); + + return function ( newOrder ) { + + q.setFromEuler( this ); + this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new THREE.Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + +}; + +// File:src/math/Line3.js + +/** + * @author bhouston / http://clara.io + */ + +THREE.Line3 = function ( start, end ) { + + this.start = ( start !== undefined ) ? start : new THREE.Vector3(); + this.end = ( end !== undefined ) ? end : new THREE.Vector3(); + +}; + +THREE.Line3.prototype = { + + constructor: THREE.Line3, + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + center: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new THREE.Vector3(); + var startEnd = new THREE.Vector3(); + + return function ( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = THREE.Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, optionalTarget ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + var result = optionalTarget || new THREE.Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + +}; + +// File:src/math/Box2.js + +/** + * @author bhouston / http://clara.io + */ + +THREE.Box2 = function ( min, max ) { + + this.min = ( min !== undefined ) ? min : new THREE.Vector2( Infinity, Infinity ); + this.max = ( max !== undefined ) ? max : new THREE.Vector2( - Infinity, - Infinity ); + +}; + +THREE.Box2.prototype = { + + constructor: THREE.Box2, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ) + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new THREE.Vector2(); + + return function ( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + empty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + center: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector2(); + return result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + size: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector2(); + return result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + if ( point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ) { + + return false; + + } + + return true; + + }, + + containsBox: function ( box ) { + + if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && + ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) { + + return true; + + } + + return false; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new THREE.Vector2(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + isIntersectionBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + + if ( box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ) { + + return false; + + } + + return true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector2(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new THREE.Vector2(); + + return function ( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +}; + +// File:src/math/Box3.js + +/** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Box3 = function ( min, max ) { + + this.min = ( min !== undefined ) ? min : new THREE.Vector3( Infinity, Infinity, Infinity ); + this.max = ( max !== undefined ) ? max : new THREE.Vector3( - Infinity, - Infinity, - Infinity ); + +}; + +THREE.Box3.prototype = { + + constructor: THREE.Box3, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new THREE.Vector3(); + + return function ( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var v1 = new THREE.Vector3(); + + return function ( object ) { + + var scope = this; + + object.updateMatrixWorld( true ); + + this.makeEmpty(); + + object.traverse( function ( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry instanceof THREE.Geometry ) { + + var vertices = geometry.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + v1.copy( vertices[ i ] ); + + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry instanceof THREE.BufferGeometry && geometry.attributes[ 'position' ] !== undefined ) { + + var positions = geometry.attributes[ 'position' ].array; + + for ( var i = 0, il = positions.length; i < il; i += 3 ) { + + v1.set( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ); + + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + empty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + center: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + size: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + if ( point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ) { + + return false; + + } + + return true; + + }, + + containsBox: function ( box ) { + + if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && + ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) && + ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) { + + return true; + + } + + return false; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new THREE.Vector3(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + isIntersectionBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + + if ( box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ) { + + return false; + + } + + return true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new THREE.Vector3(); + + return function ( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new THREE.Vector3(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Sphere(); + + result.center = this.center(); + result.radius = this.size( v1 ).length() * 0.5; + + return result; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3() + ]; + + return function ( matrix ) { + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.makeEmpty(); + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +}; + +// File:src/math/Matrix3.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +THREE.Matrix3 = function () { + + this.elements = new Float32Array( [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + +}; + +THREE.Matrix3.prototype = { + + constructor: THREE.Matrix3, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 3 ] = n12; te[ 6 ] = n13; + te[ 1 ] = n21; te[ 4 ] = n22; te[ 7 ] = n23; + te[ 2 ] = n31; te[ 5 ] = n32; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 3 ], me[ 6 ], + me[ 1 ], me[ 4 ], me[ 7 ], + me[ 2 ], me[ 5 ], me[ 8 ] + + ); + + return this; + + }, + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + + applyToVector3Array: function () { + + var v1; + + return function ( array, offset, length ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = array.length; + + for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) { + + v1.fromArray( array, j ); + v1.applyMatrix3( this ); + v1.toArray( array, j ); + + } + + return array; + + }; + + }(), + + applyToBuffer: function () { + + var v1; + + return function applyToBuffer( buffer, offset, length ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = buffer.length / buffer.itemSize; + + for ( var i = 0, j = offset; i < length; i ++, j ++ ) { + + v1.x = buffer.getX( j ); + v1.y = buffer.getY( j ); + v1.z = buffer.getZ( j ); + + v1.applyMatrix3( this ); + + buffer.setXYZ( v1.x, v1.y, v1.z ); + + } + + return buffer; + + }; + + }(), + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnInvertible ) { + + // input: THREE.Matrix4 + // ( based on http://code.google.com/p/webgl-mjs/ ) + + var me = matrix.elements; + var te = this.elements; + + te[ 0 ] = me[ 10 ] * me[ 5 ] - me[ 6 ] * me[ 9 ]; + te[ 1 ] = - me[ 10 ] * me[ 1 ] + me[ 2 ] * me[ 9 ]; + te[ 2 ] = me[ 6 ] * me[ 1 ] - me[ 2 ] * me[ 5 ]; + te[ 3 ] = - me[ 10 ] * me[ 4 ] + me[ 6 ] * me[ 8 ]; + te[ 4 ] = me[ 10 ] * me[ 0 ] - me[ 2 ] * me[ 8 ]; + te[ 5 ] = - me[ 6 ] * me[ 0 ] + me[ 2 ] * me[ 4 ]; + te[ 6 ] = me[ 9 ] * me[ 4 ] - me[ 5 ] * me[ 8 ]; + te[ 7 ] = - me[ 9 ] * me[ 0 ] + me[ 1 ] * me[ 8 ]; + te[ 8 ] = me[ 5 ] * me[ 0 ] - me[ 1 ] * me[ 4 ]; + + var det = me[ 0 ] * te[ 0 ] + me[ 1 ] * te[ 3 ] + me[ 2 ] * te[ 6 ]; + + // no inverse + + if ( det === 0 ) { + + var msg = "Matrix3.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnInvertible || false ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + this.identity(); + + return this; + + } + + this.multiplyScalar( 1.0 / det ); + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + flattenToArrayOffset: function ( array, offset ) { + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + }, + + getNormalMatrix: function ( m ) { + + // input: THREE.Matrix4 + + this.getInverse( m ).transpose(); + + return this; + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + fromArray: function ( array ) { + + this.elements.set( array ); + + return this; + + }, + + toArray: function () { + + var te = this.elements; + + return [ + te[ 0 ], te[ 1 ], te[ 2 ], + te[ 3 ], te[ 4 ], te[ 5 ], + te[ 6 ], te[ 7 ], te[ 8 ] + ]; + + } + +}; + +// File:src/math/Matrix4.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Matrix4 = function () { + + this.elements = new Float32Array( [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + +}; + +THREE.Matrix4.prototype = { + + constructor: THREE.Matrix4, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new THREE.Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + this.elements.set( m.elements ); + + return this; + + }, + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + + copyPosition: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + var te = this.elements; + + xAxis.set( te[ 0 ], te[ 1 ], te[ 2 ] ); + yAxis.set( te[ 4 ], te[ 5 ], te[ 6 ] ); + zAxis.set( te[ 8 ], te[ 9 ], te[ 10 ] ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1; + + return function ( m ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.set( me[ 0 ], me[ 1 ], me[ 2 ] ).length(); + var scaleY = 1 / v1.set( me[ 4 ], me[ 5 ], me[ 6 ] ).length(); + var scaleZ = 1 / v1.set( me[ 8 ], me[ 9 ], me[ 10 ] ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( euler instanceof THREE.Euler === false ) { + + console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + + return this.makeRotationFromQuaternion( q ); + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q.x, y = q.y, z = q.z, w = q.w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x, y, z; + + return function ( eye, target, up ) { + + if ( x === undefined ) x = new THREE.Vector3(); + if ( y === undefined ) y = new THREE.Vector3(); + if ( z === undefined ) z = new THREE.Vector3(); + + var te = this.elements; + + z.subVectors( eye, target ).normalize(); + + if ( z.lengthSq() === 0 ) { + + z.z = 1; + + } + + x.crossVectors( up, z ).normalize(); + + if ( x.lengthSq() === 0 ) { + + z.x += 0.0001; + x.crossVectors( up, z ).normalize(); + + } + + y.crossVectors( z, x ); + + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyToArray: function ( a, b, r ) { + + var te = this.elements; + + this.multiplyMatrices( a, b ); + + r[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ]; + r[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ]; + r[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ]; + r[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ]; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' ); + return vector.applyProjection( this ); + + }, + + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + + applyToVector3Array: function () { + + var v1; + + return function ( array, offset, length ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = array.length; + + for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) { + + v1.fromArray( array, j ); + v1.applyMatrix4( this ); + v1.toArray( array, j ); + + } + + return array; + + }; + + }(), + + applyToBuffer: function () { + + var v1; + + return function applyToBuffer( buffer, offset, length ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = buffer.length / buffer.itemSize; + + for ( var i = 0, j = offset; i < length; i ++, j ++ ) { + + v1.x = buffer.getX( j ); + v1.y = buffer.getY( j ); + v1.z = buffer.getZ( j ); + + v1.applyMatrix4( this ); + + buffer.setXYZ( v1.x, v1.y, v1.z ); + + } + + return buffer; + + }; + + }(), + + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + + v.transformDirection( this ); + + }, + + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + flattenToArrayOffset: function ( array, offset ) { + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + }, + + getPosition: function () { + + var v1; + + return function () { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + + var te = this.elements; + return v1.set( te[ 12 ], te[ 13 ], te[ 14 ] ); + + }; + + }(), + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnInvertible ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements; + var me = m.elements; + + var n11 = me[ 0 ], n12 = me[ 4 ], n13 = me[ 8 ], n14 = me[ 12 ]; + var n21 = me[ 1 ], n22 = me[ 5 ], n23 = me[ 9 ], n24 = me[ 13 ]; + var n31 = me[ 2 ], n32 = me[ 6 ], n33 = me[ 10 ], n34 = me[ 14 ]; + var n41 = me[ 3 ], n42 = me[ 7 ], n43 = me[ 11 ], n44 = me[ 15 ]; + + te[ 0 ] = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44; + te[ 4 ] = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44; + te[ 8 ] = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44; + te[ 12 ] = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + te[ 1 ] = n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44; + te[ 5 ] = n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44; + te[ 9 ] = n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44; + te[ 13 ] = n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34; + te[ 2 ] = n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44; + te[ 6 ] = n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44; + te[ 10 ] = n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44; + te[ 14 ] = n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34; + te[ 3 ] = n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43; + te[ 7 ] = n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43; + te[ 11 ] = n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43; + te[ 15 ] = n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33; + + var det = n11 * te[ 0 ] + n21 * te[ 4 ] + n31 * te[ 8 ] + n41 * te[ 12 ]; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnInvertible || false ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + this.identity(); + + return this; + + } + + this.multiplyScalar( 1 / det ); + + return this; + + }, + + translate: function ( v ) { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + + rotateX: function ( angle ) { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + + rotateY: function ( angle ) { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + + rotateZ: function ( angle ) { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + + rotateByAxis: function ( axis, angle ) { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector, matrix; + + return function ( position, quaternion, scale ) { + + if ( vector === undefined ) vector = new THREE.Vector3(); + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) { + + sx = - sx; + + } + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + + matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy() + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makeFrustum: function ( left, right, bottom, top, near, far ) { + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makePerspective: function ( fov, aspect, near, far ) { + + var ymax = near * Math.tan( THREE.Math.degToRad( fov * 0.5 ) ); + var ymin = - ymax; + var xmin = ymin * aspect; + var xmax = ymax * aspect; + + return this.makeFrustum( xmin, xmax, ymin, ymax, near, far ); + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = right - left; + var h = top - bottom; + var p = far - near; + + var x = ( right + left ) / w; + var y = ( top + bottom ) / h; + var z = ( far + near ) / p; + + te[ 0 ] = 2 / w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 / h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 / p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array ) { + + this.elements.set( array ); + + return this; + + }, + + toArray: function () { + + var te = this.elements; + + return [ + te[ 0 ], te[ 1 ], te[ 2 ], te[ 3 ], + te[ 4 ], te[ 5 ], te[ 6 ], te[ 7 ], + te[ 8 ], te[ 9 ], te[ 10 ], te[ 11 ], + te[ 12 ], te[ 13 ], te[ 14 ], te[ 15 ] + ]; + + } + +}; + +// File:src/math/Ray.js + +/** + * @author bhouston / http://clara.io + */ + +THREE.Ray = function ( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new THREE.Vector3(); + this.direction = ( direction !== undefined ) ? direction : new THREE.Vector3(); + +}; + +THREE.Ray.prototype = { + + constructor: THREE.Ray, + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + recast: function () { + + var v1 = new THREE.Vector3(); + + return function ( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + result.subVectors( point, this.origin ); + var directionDistance = result.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return result.copy( this.origin ); + + } + + return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new THREE.Vector3(); + + return function ( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new THREE.Vector3(); + var segDir = new THREE.Vector3(); + var diff = new THREE.Vector3(); + + return function ( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/LibMathematics/Distance/Wm5DistRay3Segment3.cpp + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + + isIntersectionSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + intersectSphere: function () { + + // from http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-7-intersecting-simple-shapes/ray-sphere-intersection/ + + var v1 = new THREE.Vector3(); + + return function ( sphere, optionalTarget ) { + + v1.subVectors( sphere.center, this.origin ); + + var tca = v1.dot( this.direction ); + + var d2 = v1.dot( v1 ) - tca * tca; + + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, optionalTarget ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, optionalTarget ); + + } + + }(), + + isIntersectionPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, optionalTarget ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, optionalTarget ); + + }, + + isIntersectionBox: function () { + + var v = new THREE.Vector3(); + + return function ( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + }(), + + intersectBox: function ( box, optionalTarget ) { + + // http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-7-intersecting-simple-shapes/ray-box-intersection/ + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); + + }, + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new THREE.Vector3(); + var edge1 = new THREE.Vector3(); + var edge2 = new THREE.Vector3(); + var normal = new THREE.Vector3(); + + return function ( a, b, c, backfaceCulling, optionalTarget ) { + + // from http://www.geometrictools.com/LibMathematics/Intersection/Wm5IntrRay3Triangle3.cpp + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, optionalTarget ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.direction.add( this.origin ).applyMatrix4( matrix4 ); + this.origin.applyMatrix4( matrix4 ); + this.direction.sub( this.origin ); + this.direction.normalize(); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + +}; + +// File:src/math/Sphere.js + +/** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Sphere = function ( center, radius ) { + + this.center = ( center !== undefined ) ? center : new THREE.Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + +}; + +THREE.Sphere.prototype = { + + constructor: THREE.Sphere, + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new THREE.Box3(); + + return function ( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).center( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + clampPoint: function ( point, optionalTarget ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + var result = optionalTarget || new THREE.Vector3(); + result.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + result.sub( this.center ).normalize(); + result.multiplyScalar( this.radius ).add( this.center ); + + } + + return result; + + }, + + getBoundingBox: function ( optionalTarget ) { + + var box = optionalTarget || new THREE.Box3(); + + box.set( this.center, this.center ); + box.expandByScalar( this.radius ); + + return box; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + +}; + +// File:src/math/Frustum.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + +THREE.Frustum = function ( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new THREE.Plane(), + ( p1 !== undefined ) ? p1 : new THREE.Plane(), + ( p2 !== undefined ) ? p2 : new THREE.Plane(), + ( p3 !== undefined ) ? p3 : new THREE.Plane(), + ( p4 !== undefined ) ? p4 : new THREE.Plane(), + ( p5 !== undefined ) ? p5 : new THREE.Plane() + + ]; + +}; + +THREE.Frustum.prototype = { + + constructor: THREE.Frustum, + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new THREE.Sphere(); + + return function ( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new THREE.Vector3(), + p2 = new THREE.Vector3(); + + return function ( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6 ; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + +}; + +// File:src/math/Plane.js + +/** + * @author bhouston / http://clara.io + */ + +THREE.Plane = function ( normal, constant ) { + + this.normal = ( normal !== undefined ) ? normal : new THREE.Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + +}; + +THREE.Plane.prototype = { + + constructor: THREE.Plane, + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + + return function ( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, optionalTarget ) { + + return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); + + }, + + orthoPoint: function ( point, optionalTarget ) { + + var perpendicularMagnitude = this.distanceToPoint( point ); + + var result = optionalTarget || new THREE.Vector3(); + return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); + + }, + + isIntersectionLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectLine: function () { + + var v1 = new THREE.Vector3(); + + return function ( line, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return result.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return result.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + + coplanarPoint: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + var m1 = new THREE.Matrix3(); + + return function ( matrix, optionalNormalMatrix ) { + + // compute new normal based on theory here: + // http://www.songho.ca/opengl/gl_normaltransform.html + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + var newNormal = v1.copy( this.normal ).applyMatrix3( normalMatrix ); + + var newCoplanarPoint = this.coplanarPoint( v2 ); + newCoplanarPoint.applyMatrix4( matrix ); + + this.setFromNormalAndCoplanarPoint( newNormal, newCoplanarPoint ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant = this.constant - offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + +}; + +// File:src/math/Math.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Math = { + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function () { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i === 8 || i === 13 || i === 18 || i === 23 ) { + + uuid[ i ] = '-'; + + } else if ( i === 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + + } + + return uuid.join( '' ); + + }; + + }(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random float from <0, 1> with 16 bits of randomness + // (standard Math.random() creates repetitive patterns when applied over larger space) + + random16: function () { + + return ( 65280 * Math.random() + 255 * Math.random() ) / 65535; + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function () { + + var degreeToRadiansFactor = Math.PI / 180; + + return function ( degrees ) { + + return degrees * degreeToRadiansFactor; + + }; + + }(), + + radToDeg: function () { + + var radianToDegreesFactor = 180 / Math.PI; + + return function ( radians ) { + + return radians * radianToDegreesFactor; + + }; + + }(), + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nearestPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + + } + +}; + +// File:src/math/Spline.js + +/** + * Spline from Tween.js, slightly optimized (and trashed) + * http://sole.github.com/tween.js/examples/05_spline.html + * + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Spline = function ( points ) { + + this.points = points; + + var c = [], v3 = { x: 0, y: 0, z: 0 }, + point, intPoint, weight, w2, w3, + pa, pb, pc, pd; + + this.initFromArray = function ( a ) { + + this.points = []; + + for ( var i = 0; i < a.length; i ++ ) { + + this.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] }; + + } + + }; + + this.getPoint = function ( k ) { + + point = ( this.points.length - 1 ) * k; + intPoint = Math.floor( point ); + weight = point - intPoint; + + c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1; + c[ 1 ] = intPoint; + c[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1; + c[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2; + + pa = this.points[ c[ 0 ] ]; + pb = this.points[ c[ 1 ] ]; + pc = this.points[ c[ 2 ] ]; + pd = this.points[ c[ 3 ] ]; + + w2 = weight * weight; + w3 = weight * w2; + + v3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 ); + v3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 ); + v3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 ); + + return v3; + + }; + + this.getControlPointsArray = function () { + + var i, p, l = this.points.length, + coords = []; + + for ( i = 0; i < l; i ++ ) { + + p = this.points[ i ]; + coords[ i ] = [ p.x, p.y, p.z ]; + + } + + return coords; + + }; + + // approximate length by summing linear segments + + this.getLength = function ( nSubDivisions ) { + + var i, index, nSamples, position, + point = 0, intPoint = 0, oldIntPoint = 0, + oldPosition = new THREE.Vector3(), + tmpVec = new THREE.Vector3(), + chunkLengths = [], + totalLength = 0; + + // first point has 0 length + + chunkLengths[ 0 ] = 0; + + if ( ! nSubDivisions ) nSubDivisions = 100; + + nSamples = this.points.length * nSubDivisions; + + oldPosition.copy( this.points[ 0 ] ); + + for ( i = 1; i < nSamples; i ++ ) { + + index = i / nSamples; + + position = this.getPoint( index ); + tmpVec.copy( position ); + + totalLength += tmpVec.distanceTo( oldPosition ); + + oldPosition.copy( position ); + + point = ( this.points.length - 1 ) * index; + intPoint = Math.floor( point ); + + if ( intPoint !== oldIntPoint ) { + + chunkLengths[ intPoint ] = totalLength; + oldIntPoint = intPoint; + + } + + } + + // last point ends with total length + + chunkLengths[ chunkLengths.length ] = totalLength; + + return { chunks: chunkLengths, total: totalLength }; + + }; + + this.reparametrizeByArcLength = function ( samplingCoef ) { + + var i, j, + index, indexCurrent, indexNext, + realDistance, + sampling, position, + newpoints = [], + tmpVec = new THREE.Vector3(), + sl = this.getLength(); + + newpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() ); + + for ( i = 1; i < this.points.length; i ++ ) { + + //tmpVec.copy( this.points[ i - 1 ] ); + //linearDistance = tmpVec.distanceTo( this.points[ i ] ); + + realDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ]; + + sampling = Math.ceil( samplingCoef * realDistance / sl.total ); + + indexCurrent = ( i - 1 ) / ( this.points.length - 1 ); + indexNext = i / ( this.points.length - 1 ); + + for ( j = 1; j < sampling - 1; j ++ ) { + + index = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent ); + + position = this.getPoint( index ); + newpoints.push( tmpVec.copy( position ).clone() ); + + } + + newpoints.push( tmpVec.copy( this.points[ i ] ).clone() ); + + } + + this.points = newpoints; + + }; + + // Catmull-Rom + + function interpolate( p0, p1, p2, p3, t, t2, t3 ) { + + var v0 = ( p2 - p0 ) * 0.5, + v1 = ( p3 - p1 ) * 0.5; + + return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + +}; + +// File:src/math/Triangle.js + +/** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Triangle = function ( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new THREE.Vector3(); + this.b = ( b !== undefined ) ? b : new THREE.Vector3(); + this.c = ( c !== undefined ) ? c : new THREE.Vector3(); + +}; + +THREE.Triangle.normal = function () { + + var v0 = new THREE.Vector3(); + + return function ( a, b, c, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + result.subVectors( c, b ); + v0.subVectors( a, b ); + result.cross( v0 ); + + var resultLengthSq = result.lengthSq(); + if ( resultLengthSq > 0 ) { + + return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); + + } + + return result.set( 0, 0, 0 ); + + }; + +}(); + +// static/instance method to calculate barycentric coordinates +// based on: http://www.blackpawn.com/texts/pointinpoly/default.html +THREE.Triangle.barycoordFromPoint = function () { + + var v0 = new THREE.Vector3(); + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + + return function ( point, a, b, c, optionalTarget ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + var result = optionalTarget || new THREE.Vector3(); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return result.set( 1 - u - v, v, u ); + + }; + +}(); + +THREE.Triangle.containsPoint = function () { + + var v1 = new THREE.Vector3(); + + return function ( point, a, b, c ) { + + var result = THREE.Triangle.barycoordFromPoint( point, a, b, c, v1 ); + + return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); + + }; + +}(); + +THREE.Triangle.prototype = { + + constructor: THREE.Triangle, + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + area: function () { + + var v0 = new THREE.Vector3(); + var v1 = new THREE.Vector3(); + + return function () { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + midpoint: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + normal: function ( optionalTarget ) { + + return THREE.Triangle.normal( this.a, this.b, this.c, optionalTarget ); + + }, + + plane: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Plane(); + + return result.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + barycoordFromPoint: function ( point, optionalTarget ) { + + return THREE.Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); + + }, + + containsPoint: function ( point ) { + + return THREE.Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + +}; + +// File:src/core/Channels.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Channels = function () { + + this.mask = 1; + +}; + +THREE.Channels.prototype = { + + constructor: THREE.Channels, + + set: function ( channel ) { + + this.mask = 1 << channel; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel ); + + } + +}; + +// File:src/core/Clock.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Clock = function ( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + +}; + +THREE.Clock.prototype = { + + constructor: THREE.Clock, + + start: function () { + + this.startTime = self.performance.now(); + + this.oldTime = this.startTime; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + + } + + if ( this.running ) { + + var newTime = self.performance.now(); + + diff = 0.001 * ( newTime - this.oldTime ); + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + +}; + +// File:src/core/EventDispatcher.js + +/** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + +THREE.EventDispatcher = function () {}; + +THREE.EventDispatcher.prototype = { + + constructor: THREE.EventDispatcher, + + apply: function ( object ) { + + object.addEventListener = THREE.EventDispatcher.prototype.addEventListener; + object.hasEventListener = THREE.EventDispatcher.prototype.hasEventListener; + object.removeEventListener = THREE.EventDispatcher.prototype.removeEventListener; + object.dispatchEvent = THREE.EventDispatcher.prototype.dispatchEvent; + + }, + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) { + + return true; + + } + + return false; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = []; + var length = listenerArray.length; + + for ( var i = 0; i < length; i ++ ) { + + array[ i ] = listenerArray[ i ]; + + } + + for ( var i = 0; i < length; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + +}; + +// File:src/core/Raycaster.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + +( function ( THREE ) { + + THREE.Raycaster = function ( origin, direction, near, far ) { + + this.ray = new THREE.Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + } + } + } ); + + }; + + function descSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + // + + THREE.Raycaster.prototype = { + + constructor: THREE.Raycaster, + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( camera instanceof THREE.PerspectiveCamera ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( camera instanceof THREE.OrthographicCamera ) { + + this.ray.origin.set( coords.x, coords.y, - 1 ).unproject( camera ); + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive ) { + + var intersects = []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( descSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive ) { + + var intersects = []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( descSort ); + + return intersects; + + } + + }; + +}( THREE ) ); + +// File:src/core/Object3D.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + +THREE.Object3D = function () { + + Object.defineProperty( this, 'id', { value: THREE.Object3DIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.channels = new THREE.Channels(); + this.children = []; + + this.up = THREE.Object3D.DefaultUp.clone(); + + var position = new THREE.Vector3(); + var rotation = new THREE.Euler(); + var quaternion = new THREE.Quaternion(); + var scale = new THREE.Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new THREE.Matrix4() + }, + normalMatrix: { + value: new THREE.Matrix3() + } + } ); + + this.rotationAutoUpdate = true; + + this.matrix = new THREE.Matrix4(); + this.matrixWorld = new THREE.Matrix4(); + + this.matrixAutoUpdate = THREE.Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + +}; + +THREE.Object3D.DefaultUp = new THREE.Vector3( 0, 1, 0 ); +THREE.Object3D.DefaultMatrixAutoUpdate = true; + +THREE.Object3D.prototype = { + + constructor: THREE.Object3D, + + get eulerOrder () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + + return this.rotation.order; + + }, + + set eulerOrder ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + + this.rotation.order = value; + + }, + + get useQuaternion () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + + set useQuaternion ( value ) { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + + set renderDepth ( value ) { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + + // + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new THREE.Quaternion(); + + return function ( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new THREE.Vector3( 1, 0, 0 ); + + return function ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new THREE.Vector3( 0, 1, 0 ); + + return function ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new THREE.Vector3( 0, 0, 1 ); + + return function ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new THREE.Vector3(); + + return function ( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + + translateX: function () { + + var v1 = new THREE.Vector3( 1, 0, 0 ); + + return function ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new THREE.Vector3( 0, 1, 0 ); + + return function ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new THREE.Vector3( 0, 0, 1 ); + + return function ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new THREE.Matrix4(); + + return function ( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This routine does not support objects with rotated and/or translated parent(s) + + var m1 = new THREE.Matrix4(); + + return function ( vector ) { + + m1.lookAt( vector, this.position, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( object instanceof THREE.Object3D ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + }, + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + this.updateMatrixWorld( true ); + + return result.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new THREE.Vector3(); + var scale = new THREE.Vector3(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Quaternion(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, result, scale ); + + return result; + + }; + + }(), + + getWorldRotation: function () { + + var quaternion = new THREE.Quaternion(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Euler(); + + this.getWorldQuaternion( quaternion ); + + return result.setFromQuaternion( quaternion, this.rotation.order, false ); + + }; + + }(), + + getWorldScale: function () { + + var position = new THREE.Vector3(); + var quaternion = new THREE.Quaternion(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, result ); + + return result; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new THREE.Quaternion(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate === true ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate === true || force === true ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + this.children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + var isRootObject = ( meta === undefined ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {} + }; + + output.metadata = { + version: 4.4, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + + object.matrix = this.matrix.toArray(); + + // + + if ( this.geometry !== undefined ) { + + if ( meta.geometries[ this.geometry.uuid ] === undefined ) { + + meta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta ); + + } + + object.geometry = this.geometry.uuid; + + } + + if ( this.material !== undefined ) { + + if ( meta.materials[ this.material.uuid ] === undefined ) { + + meta.materials[ this.material.uuid ] = this.material.toJSON( meta ); + + } + + object.material = this.material.uuid; + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache ( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.rotationAutoUpdate = source.rotationAutoUpdate; + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.Object3D.prototype ); + +THREE.Object3DIdCount = 0; + +// File:src/core/Face3.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Face3 = function ( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = color instanceof THREE.Color ? color : new THREE.Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + +}; + +THREE.Face3.prototype = { + + constructor: THREE.Face3, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + +}; + +// File:src/core/Face4.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new THREE.Face3( a, b, c, normal, color, materialIndex ); + +}; + +// File:src/core/BufferAttribute.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.BufferAttribute = function ( array, itemSize ) { + + this.uuid = THREE.Math.generateUUID(); + + this.array = array; + this.itemSize = itemSize; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + +}; + +THREE.BufferAttribute.prototype = { + + constructor: THREE.BufferAttribute, + + get length() { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' ); + return this.array.length; + + }, + + get count() { + + return this.array.length / this.itemSize; + + }, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new THREE.Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyIndicesArray: function ( indices ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + var index = indices[ i ]; + + array[ offset ++ ] = index.a; + array[ offset ++ ] = index.b; + array[ offset ++ ] = index.c; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new THREE.Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new THREE.Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new THREE.Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +}; + +// + +THREE.Int8Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Int8Array( array ), itemSize ); + +}; + +THREE.Uint8Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Uint8Array( array ), itemSize ); + +}; + +THREE.Uint8ClampedAttribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Uint8ClampedArray( array ), itemSize ); + +}; + +THREE.Int16Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Int16Array( array ), itemSize ); + +}; + +THREE.Uint16Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Uint16Array( array ), itemSize ); + +}; + +THREE.Int32Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Int32Array( array ), itemSize ); + +}; + +THREE.Uint32Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Uint32Array( array ), itemSize ); + +}; + +THREE.Float32Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Float32Array( array ), itemSize ); + +}; + +THREE.Float64Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Float64Array( array ), itemSize ); + +}; + + +// Deprecated + +THREE.DynamicBufferAttribute = function ( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new THREE.BufferAttribute( array, itemSize ).setDynamic( true ); + +}; + +// File:src/core/InstancedBufferAttribute.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InstancedBufferAttribute = function ( array, itemSize, meshPerAttribute ) { + + THREE.BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + +}; + +THREE.InstancedBufferAttribute.prototype = Object.create( THREE.BufferAttribute.prototype ); +THREE.InstancedBufferAttribute.prototype.constructor = THREE.InstancedBufferAttribute; + +THREE.InstancedBufferAttribute.prototype.copy = function ( source ) { + + THREE.BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + +}; + +// File:src/core/InterleavedBuffer.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InterleavedBuffer = function ( array, stride ) { + + this.uuid = THREE.Math.generateUUID(); + + this.array = array; + this.stride = stride; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + +}; + +THREE.InterleavedBuffer.prototype = { + + constructor: THREE.InterleavedBuffer, + + get length () { + + return this.array.length; + + }, + + get count () { + + return this.array.length / this.stride; + + }, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.stride = source.stride; + this.dynamic = source.dynamic; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +}; + +// File:src/core/InstancedInterleavedBuffer.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InstancedInterleavedBuffer = function ( array, stride, meshPerAttribute ) { + + THREE.InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + +}; + +THREE.InstancedInterleavedBuffer.prototype = Object.create( THREE.InterleavedBuffer.prototype ); +THREE.InstancedInterleavedBuffer.prototype.constructor = THREE.InstancedInterleavedBuffer; + +THREE.InstancedInterleavedBuffer.prototype.copy = function ( source ) { + + THREE.InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + +}; + +// File:src/core/InterleavedBufferAttribute.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InterleavedBufferAttribute = function ( interleavedBuffer, itemSize, offset ) { + + this.uuid = THREE.Math.generateUUID(); + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + +}; + + +THREE.InterleavedBufferAttribute.prototype = { + + constructor: THREE.InterleavedBufferAttribute, + + get length() { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' ); + return this.array.length; + + }, + + get count() { + + return this.data.array.length / this.data.stride; + + }, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + +}; + +// File:src/core/Geometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + +THREE.Geometry = function () { + + Object.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [ [] ]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.elementsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + +}; + +THREE.Geometry.prototype = { + + constructor: THREE.Geometry, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new THREE.Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var vertices = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0, k = 0; i < vertices.length; i += 3, j += 2, k += 4 ) { + + scope.vertices.push( new THREE.Vector3( vertices[ i ], vertices[ i + 1 ], vertices[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new THREE.Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new THREE.Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new THREE.Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new THREE.Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new THREE.Face3( a, b, c, vertexNormals, vertexColors ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + }; + + if ( indices !== undefined ) { + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ] ); + + } + + } + + } else { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } + + } else { + + for ( var i = 0; i < vertices.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.center().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new THREE.Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new THREE.Vector3(), ab = new THREE.Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new THREE.Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new THREE.Vector3(), ab = new THREE.Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new THREE.Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new THREE.Vector3(); + vertexNormals = { a: new THREE.Vector3(), b: new THREE.Vector3(), c: new THREE.Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeTangents: function () { + + console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + + computeLineDistances: function () { + + var d = 0; + var vertices = this.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + if ( i > 0 ) { + + d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); + + } + + this.lineDistances[ i ] = d; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new THREE.Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new THREE.Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( geometry instanceof THREE.Geometry === false ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ]; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( mesh instanceof THREE.Mesh === false ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + mesh.matrixAutoUpdate && mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + var dupIndex = - 1; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + dupIndex = n; + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = false; // face.materialIndex !== undefined; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.vertices = []; + this.faces = []; + this.faceVertexUvs = [ [] ]; + + var vertices = source.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + var faces = source.faces; + + for ( var i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + for ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( var k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.Geometry.prototype ); + +THREE.GeometryIdCount = 0; + +// File:src/core/DirectGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.DirectGeometry = function () { + + Object.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'DirectGeometry'; + + this.indices = []; + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + +}; + +THREE.DirectGeometry.prototype = { + + constructor: THREE.DirectGeometry, + + computeBoundingBox: THREE.Geometry.prototype.computeBoundingBox, + computeBoundingSphere: THREE.Geometry.prototype.computeBoundingSphere, + + computeFaceNormals: function () { + + console.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' ); + + }, + + computeVertexNormals: function () { + + console.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' ); + + }, + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + if ( morphTargetsLength > 0 ) { + + var morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + if ( morphNormalsLength > 0 ) { + + var morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.DirectGeometry.prototype ); + +// File:src/core/BufferGeometry.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.BufferGeometry = function () { + + Object.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + +}; + +THREE.BufferGeometry.prototype = { + + constructor: THREE.BufferGeometry, + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + this.index = index; + + }, + + addAttribute: function ( name, attribute ) { + + if ( attribute instanceof THREE.BufferAttribute === false && attribute instanceof THREE.InterleavedBufferAttribute === false ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new THREE.BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + }, + + get drawcalls() { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + }, + + get offsets() { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + }, + + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToVector3Array( position.array ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToVector3Array( normal.array ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new THREE.Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.center().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object instanceof THREE.Points || object instanceof THREE.Line ) { + + var positions = new THREE.Float32Attribute( geometry.vertices.length * 3, 3 ); + var colors = new THREE.Float32Attribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new THREE.Float32Attribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object instanceof THREE.Mesh ) { + + if ( geometry instanceof THREE.Geometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object instanceof THREE.Mesh ) { + + var direct = geometry.__directGeometry; + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + if ( geometry.verticesNeedUpdate === true ) { + + var attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + var attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + var attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + var attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + var attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new THREE.DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new THREE.BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + if ( geometry.indices.length > 0 ) { + + var TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array; + var indices = new TypeArray( geometry.indices.length * 3 ); + this.setIndex( new THREE.BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new THREE.Float32Attribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new THREE.Float32Attribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new THREE.Float32Attribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + var vector = new THREE.Vector3(); + + return function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new THREE.Box3(); + + } + + var positions = this.attributes.position.array; + + if ( positions ) { + + var bb = this.boundingBox; + bb.makeEmpty(); + + for ( var i = 0, il = positions.length; i < il; i += 3 ) { + + vector.fromArray( positions, i ); + bb.expandByPoint( vector ); + + } + + } + + if ( positions === undefined || positions.length === 0 ) { + + this.boundingBox.min.set( 0, 0, 0 ); + this.boundingBox.max.set( 0, 0, 0 ); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }; + + }(), + + computeBoundingSphere: function () { + + var box = new THREE.Box3(); + var vector = new THREE.Vector3(); + + return function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new THREE.Sphere(); + + } + + var positions = this.attributes.position.array; + + if ( positions ) { + + box.makeEmpty(); + + var center = this.boundingSphere.center; + + for ( var i = 0, il = positions.length; i < il; i += 3 ) { + + vector.fromArray( positions, i ); + box.expandByPoint( vector ); + + } + + box.center( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = positions.length; i < il; i += 3 ) { + + vector.fromArray( positions, i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var normals = attributes.normal.array; + + for ( var i = 0, il = normals.length; i < il; i ++ ) { + + normals[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC, + + pA = new THREE.Vector3(), + pB = new THREE.Vector3(), + pC = new THREE.Vector3(), + + cb = new THREE.Vector3(), + ab = new THREE.Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + + computeOffsets: function ( size ) { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.') + + }, + + merge: function ( geometry, offset ) { + + if ( geometry instanceof THREE.BufferGeometry === false ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) offset = 0; + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var normals = this.attributes.normal.array; + + var x, y, z, n; + + for ( var i = 0, il = normals.length; i < il; i += 3 ) { + + x = normals[ i ]; + y = normals[ i + 1 ]; + z = normals[ i + 2 ]; + + n = 1.0 / Math.sqrt( x * x + y * y + z * z ); + + normals[ i ] *= n; + normals[ i + 1 ] *= n; + normals[ i + 2 ] *= n; + + } + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count ); + + } + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.BufferGeometry.prototype ); + +THREE.BufferGeometry.MaxIndex = 65535; + +// File:src/core/InstancedBufferGeometry.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InstancedBufferGeometry = function () { + + THREE.BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + +}; + +THREE.InstancedBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.InstancedBufferGeometry.prototype.constructor = THREE.InstancedBufferGeometry; + +THREE.InstancedBufferGeometry.prototype.addGroup = function ( start, count, instances ) { + + this.groups.push( { + + start: start, + count: count, + instances: instances + + } ); + +}; + +THREE.InstancedBufferGeometry.prototype.copy = function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.instances ); + + } + + return this; + +}; + +THREE.EventDispatcher.prototype.apply( THREE.InstancedBufferGeometry.prototype ); + +// File:src/animation/AnimationAction.js + +/** + * + * A clip that has been explicitly scheduled. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.AnimationAction = function ( clip, startTime, timeScale, weight, loop ) { + + if ( clip === undefined ) throw new Error( 'clip is null' ); + this.clip = clip; + this.localRoot = null; + this.startTime = startTime || 0; + this.timeScale = timeScale || 1; + this.weight = weight || 1; + this.loop = loop || THREE.LoopRepeat; + this.loopCount = 0; + this.enabled = true; // allow for easy disabling of the action. + + this.actionTime = - this.startTime; + this.clipTime = 0; + + this.propertyBindings = []; +}; + +/* +THREE.LoopOnce = 2200; +THREE.LoopRepeat = 2201; +THREE.LoopPingPing = 2202; +*/ + +THREE.AnimationAction.prototype = { + + constructor: THREE.AnimationAction, + + setLocalRoot: function( localRoot ) { + + this.localRoot = localRoot; + + return this; + + }, + + updateTime: function( clipDeltaTime ) { + + var previousClipTime = this.clipTime; + var previousLoopCount = this.loopCount; + var previousActionTime = this.actionTime; + + var duration = this.clip.duration; + + this.actionTime = this.actionTime + clipDeltaTime; + + if ( this.loop === THREE.LoopOnce ) { + + this.loopCount = 0; + this.clipTime = Math.min( Math.max( this.actionTime, 0 ), duration ); + + // if time is changed since last time, see if we have hit a start/end limit + if ( this.clipTime !== previousClipTime ) { + + if ( this.clipTime === duration ) { + + this.mixer.dispatchEvent( { type: 'finished', action: this, direction: 1 } ); + + } else if ( this.clipTime === 0 ) { + + this.mixer.dispatchEvent( { type: 'finished', action: this, direction: -1 } ); + + } + + } + + + return this.clipTime; + + } + + this.loopCount = Math.floor( this.actionTime / duration ); + + var newClipTime = this.actionTime - this.loopCount * duration; + newClipTime = newClipTime % duration; + + // if we are ping pong looping, ensure that we go backwards when appropriate + if ( this.loop == THREE.LoopPingPong ) { + + if ( Math.abs( this.loopCount % 2 ) === 1 ) { + + newClipTime = duration - newClipTime; + + } + + } + + this.clipTime = newClipTime; + + if ( this.loopCount !== previousLoopCount ) { + + this.mixer.dispatchEvent( { type: 'loop', action: this, loopDelta: ( this.loopCount - this.loopCount ) } ); + + } + + return this.clipTime; + + }, + + syncWith: function( action ) { + + this.actionTime = action.actionTime; + this.timeScale = action.timeScale; + + return this; + }, + + warpToDuration: function( duration ) { + + this.timeScale = this.clip.duration / duration; + + return this; + }, + + init: function( time ) { + + this.clipTime = time - this.startTime; + + return this; + + }, + + update: function( clipDeltaTime ) { + + this.updateTime( clipDeltaTime ); + + var clipResults = this.clip.getAt( this.clipTime ); + + return clipResults; + + }, + + getTimeScaleAt: function( time ) { + + if ( this.timeScale.getAt ) { + // pass in time, not clip time, allows for fadein/fadeout across multiple loops of the clip + return this.timeScale.getAt( time ); + + } + + return this.timeScale; + + }, + + getWeightAt: function( time ) { + + if ( this.weight.getAt ) { + // pass in time, not clip time, allows for fadein/fadeout across multiple loops of the clip + return this.weight.getAt( time ); + + } + + return this.weight; + + } + +}; + +// File:src/animation/AnimationClip.js + +/** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.AnimationClip = function ( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : -1; + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + for ( var i = 0; i < this.tracks.length; i ++ ) { + var track = this.tracks[i]; + this.duration = Math.max( track.keys[ track.keys.length - 1 ].time ); + } + } + + // maybe only do these on demand, as doing them here could potentially slow down loading + // but leaving these here during development as this ensures a lot of testing of these functions + this.trim(); + this.optimize(); + + this.results = []; + +}; + +THREE.AnimationClip.prototype = { + + constructor: THREE.AnimationClip, + + getAt: function( clipTime ) { + + clipTime = Math.max( 0, Math.min( clipTime, this.duration ) ); + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + var track = this.tracks[ i ]; + + this.results[ i ] = track.getAt( clipTime ); + + } + + return this.results; + }, + + trim: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + +}; + + +THREE.AnimationClip.CreateFromMorphTargetSequence = function( name, morphTargetSequence, fps ) { + + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var keys = []; + + keys.push( { time: ( i + numMorphTargets - 1 ) % numMorphTargets, value: 0 } ); + keys.push( { time: i, value: 1 } ); + keys.push( { time: ( i + 1 ) % numMorphTargets, value: 0 } ); + + keys.sort( THREE.KeyframeTrack.keyComparer ); + + // if there is a key at the first frame, duplicate it as the last frame as well for perfect loop. + if ( keys[0].time === 0 ) { + keys.push( { + time: numMorphTargets, + value: keys[0].value + }); + } + + tracks.push( new THREE.NumberKeyframeTrack( '.morphTargetInfluences[' + morphTargetSequence[i].name + ']', keys ).scale( 1.0 / fps ) ); + } + + return new THREE.AnimationClip( name, -1, tracks ); + +}; + +THREE.AnimationClip.findByName = function( clipArray, name ) { + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[i].name === name ) { + + return clipArray[i]; + + } + } + + return null; + +}; + +THREE.AnimationClip.CreateClipsFromMorphTargetSequences = function( morphTargets, fps ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + animationToMorphTargets[ name ] = animationMorphTargets = []; + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( THREE.AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps ) ); + } + + return clips; + +}; + +// parse the standard JSON format for clips +THREE.AnimationClip.parse = function( json ) { + + var tracks = []; + + for ( var i = 0; i < json.tracks.length; i ++ ) { + + tracks.push( THREE.KeyframeTrack.parse( json.tracks[i] ).scale( 1.0 / json.fps ) ); + + } + + return new THREE.AnimationClip( json.name, json.duration, tracks ); + +}; + + +// parse the animation.hierarchy format +THREE.AnimationClip.parseAnimation = function( animation, bones, nodeName ) { + + if ( ! animation ) { + console.error( " no animation in JSONLoader data" ); + return null; + } + + var convertTrack = function( trackName, animationKeys, propertyName, trackType, animationKeyToValueFunc ) { + + var keys = []; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + var animationKey = animationKeys[k]; + + if ( animationKey[propertyName] !== undefined ) { + + keys.push( { time: animationKey.time, value: animationKeyToValueFunc( animationKey ) } ); + } + + } + + // only return track if there are actually keys. + if ( keys.length > 0 ) { + + return new trackType( trackName, keys ); + + } + + return null; + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + var duration = animation.length || -1; // automatic length determination in AnimationClip. + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length == 0 ) { + continue; + } + + // process morph targets in a way exactly compatible with AnimationHandler.init( animation ) + if ( animationKeys[0].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[k].morphTargets ) { + for ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[k].morphTargets[m] ] = -1; + } + } + + } + + // create a track for each morph target with all zero morphTargetInfluences except for the keys in which the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var keys = []; + + for ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) { + + var animationKey = animationKeys[k]; + + keys.push( { + time: animationKey.time, + value: (( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ) + }); + + } + + tracks.push( new THREE.NumberKeyframeTrack( nodeName + '.morphTargetInfluence[' + morphTargetName + ']', keys ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + var boneName = nodeName + '.bones[' + bones[ h ].name + ']'; + + // track contains positions... + var positionTrack = convertTrack( boneName + '.position', animationKeys, 'pos', THREE.VectorKeyframeTrack, function( animationKey ) { + return new THREE.Vector3().fromArray( animationKey.pos ) + } ); + + if ( positionTrack ) tracks.push( positionTrack ); + + // track contains quaternions... + var quaternionTrack = convertTrack( boneName + '.quaternion', animationKeys, 'rot', THREE.QuaternionKeyframeTrack, function( animationKey ) { + if ( animationKey.rot.slerp ) { + return animationKey.rot.clone(); + } else { + return new THREE.Quaternion().fromArray( animationKey.rot ); + } + } ); + + if ( quaternionTrack ) tracks.push( quaternionTrack ); + + // track contains quaternions... + var scaleTrack = convertTrack( boneName + '.scale', animationKeys, 'scl', THREE.VectorKeyframeTrack, function( animationKey ) { + return new THREE.Vector3().fromArray( animationKey.scl ) + } ); + + if ( scaleTrack ) tracks.push( scaleTrack ); + + } + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new THREE.AnimationClip( clipName, duration, tracks ); + + return clip; + +}; + +// File:src/animation/AnimationMixer.js + +/** + * + * Mixes together the AnimationClips scheduled by AnimationActions and applies them to the root and subtree + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.AnimationMixer = function( root ) { + + this.root = root; + this.time = 0; + this.timeScale = 1.0; + this.actions = []; + this.propertyBindingMap = {}; + +}; + +THREE.AnimationMixer.prototype = { + + constructor: THREE.AnimationMixer, + + addAction: function( action ) { + + // TODO: check for duplicate action names? Or provide each action with a UUID? + + this.actions.push( action ); + action.init( this.time ); + action.mixer = this; + + var tracks = action.clip.tracks; + + var root = action.localRoot || this.root; + + for ( var i = 0; i < tracks.length; i ++ ) { + + var track = tracks[ i ]; + + var propertyBindingKey = root.uuid + '-' + track.name; + var propertyBinding = this.propertyBindingMap[ propertyBindingKey ]; + + if ( propertyBinding === undefined ) { + + propertyBinding = new THREE.PropertyBinding( root, track.name ); + this.propertyBindingMap[ propertyBindingKey ] = propertyBinding; + + } + + // push in the same order as the tracks. + action.propertyBindings.push( propertyBinding ); + + // track usages of shared property bindings, because if we leave too many around, the mixer can get slow + propertyBinding.referenceCount += 1; + + } + + }, + + removeAllActions: function() { + + for ( var i = 0; i < this.actions.length; i ++ ) { + + this.actions[i].mixer = null; + + } + + // unbind all property bindings + for ( var properyBindingKey in this.propertyBindingMap ) { + + this.propertyBindingMap[ properyBindingKey ].unbind(); + + } + + this.actions = []; + this.propertyBindingMap = {}; + + return this; + + }, + + removeAction: function( action ) { + + var index = this.actions.indexOf( action ); + + if ( index !== - 1 ) { + + this.actions.splice( index, 1 ); + action.mixer = null; + + } + + + // remove unused property bindings because if we leave them around the mixer can get slow + var root = action.localRoot || this.root; + var tracks = action.clip.tracks; + + for ( var i = 0; i < tracks.length; i ++ ) { + + var track = tracks[ i ]; + + var propertyBindingKey = root.uuid + '-' + track.name; + var propertyBinding = this.propertyBindingMap[ propertyBindingKey ]; + + propertyBinding.referenceCount -= 1; + + if ( propertyBinding.referenceCount <= 0 ) { + + propertyBinding.unbind(); + + delete this.propertyBindingMap[ propertyBindingKey ]; + + } + } + + return this; + + }, + + // can be optimized if needed + findActionByName: function( name ) { + + for ( var i = 0; i < this.actions.length; i ++ ) { + + if ( this.actions[i].name === name ) return this.actions[i]; + + } + + return null; + + }, + + play: function( action, optionalFadeInDuration ) { + + action.startTime = this.time; + this.addAction( action ); + + return this; + + }, + + fadeOut: function( action, duration ) { + + var keys = []; + + keys.push( { time: this.time, value: 1 } ); + keys.push( { time: this.time + duration, value: 0 } ); + + action.weight = new THREE.NumberKeyframeTrack( "weight", keys ); + + return this; + + }, + + fadeIn: function( action, duration ) { + + var keys = []; + + keys.push( { time: this.time, value: 0 } ); + keys.push( { time: this.time + duration, value: 1 } ); + + action.weight = new THREE.NumberKeyframeTrack( "weight", keys ); + + return this; + + }, + + warp: function( action, startTimeScale, endTimeScale, duration ) { + + var keys = []; + + keys.push( { time: this.time, value: startTimeScale } ); + keys.push( { time: this.time + duration, value: endTimeScale } ); + + action.timeScale = new THREE.NumberKeyframeTrack( "timeScale", keys ); + + return this; + + }, + + crossFade: function( fadeOutAction, fadeInAction, duration, warp ) { + + this.fadeOut( fadeOutAction, duration ); + this.fadeIn( fadeInAction, duration ); + + if ( warp ) { + + var startEndRatio = fadeOutAction.clip.duration / fadeInAction.clip.duration; + var endStartRatio = 1.0 / startEndRatio; + + this.warp( fadeOutAction, 1.0, startEndRatio, duration ); + this.warp( fadeInAction, endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + update: function( deltaTime ) { + + var mixerDeltaTime = deltaTime * this.timeScale; + this.time += mixerDeltaTime; + + for ( var i = 0; i < this.actions.length; i ++ ) { + + var action = this.actions[i]; + + var weight = action.getWeightAt( this.time ); + + var actionTimeScale = action.getTimeScaleAt( this.time ); + var actionDeltaTime = mixerDeltaTime * actionTimeScale; + + var actionResults = action.update( actionDeltaTime ); + + if ( action.weight <= 0 || ! action.enabled ) continue; + + for ( var j = 0; j < actionResults.length; j ++ ) { + + var name = action.clip.tracks[j].name; + + action.propertyBindings[ j ].accumulate( actionResults[j], weight ); + + } + + } + + // apply to nodes + for ( var propertyBindingKey in this.propertyBindingMap ) { + + this.propertyBindingMap[ propertyBindingKey ].apply(); + + } + + return this; + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.AnimationMixer.prototype ); + +// File:src/animation/AnimationUtils.js + +/** + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.AnimationUtils = { + + getEqualsFunc: function( exemplarValue ) { + + if ( exemplarValue.equals ) { + return function equals_object( a, b ) { + return a.equals( b ); + } + } + + return function equals_primitive( a, b ) { + return ( a === b ); + }; + + }, + + clone: function( exemplarValue ) { + + var typeName = typeof exemplarValue; + if ( typeName === "object" ) { + if ( exemplarValue.clone ) { + return exemplarValue.clone(); + } + console.error( "can not figure out how to copy exemplarValue", exemplarValue ); + } + + return exemplarValue; + + }, + + lerp: function( a, b, alpha, interTrack ) { + + var lerpFunc = THREE.AnimationUtils.getLerpFunc( a, interTrack ); + + return lerpFunc( a, b, alpha ); + + }, + + lerp_object: function( a, b, alpha ) { + return a.lerp( b, alpha ); + }, + + slerp_object: function( a, b, alpha ) { + return a.slerp( b, alpha ); + }, + + lerp_number: function( a, b, alpha ) { + return a * ( 1 - alpha ) + b * alpha; + }, + + lerp_boolean: function( a, b, alpha ) { + return ( alpha < 0.5 ) ? a : b; + }, + + lerp_boolean_immediate: function( a, b, alpha ) { + return a; + }, + + lerp_string: function( a, b, alpha ) { + return ( alpha < 0.5 ) ? a : b; + }, + + lerp_string_immediate: function( a, b, alpha ) { + return a; + }, + + // NOTE: this is an accumulator function that modifies the first argument (e.g. a). This is to minimize memory alocations. + getLerpFunc: function( exemplarValue, interTrack ) { + + if ( exemplarValue === undefined || exemplarValue === null ) throw new Error( "examplarValue is null" ); + + var typeName = typeof exemplarValue; + + switch( typeName ) { + + case "object": + if ( exemplarValue.lerp ) { + return THREE.AnimationUtils.lerp_object; + } + + if ( exemplarValue.slerp ) { + return THREE.AnimationUtils.slerp_object; + } + break; + + case "number": + return THREE.AnimationUtils.lerp_number; + + case "boolean": + if ( interTrack ) { + return THREE.AnimationUtils.lerp_boolean; + } else { + return THREE.AnimationUtils.lerp_boolean_immediate; + } + + case "string": + if ( interTrack ) { + return THREE.AnimationUtils.lerp_string; + } else { + return THREE.AnimationUtils.lerp_string_immediate; + } + + } + + } + +}; + +// File:src/animation/KeyframeTrack.js + +/** + * + * A Track that returns a keyframe interpolated value, currently linearly interpolated + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.KeyframeTrack = function ( name, keys ) { + + if ( name === undefined ) throw new Error( "track name is undefined" ); + if ( keys === undefined || keys.length === 0 ) throw new Error( "no keys in track named " + name ); + + this.name = name; + this.keys = keys; // time in seconds, value as value + + // the index of the last result, used as a starting point for local search. + this.lastIndex = 0; + + this.validate(); + this.optimize(); + +}; + +THREE.KeyframeTrack.prototype = { + + constructor: THREE.KeyframeTrack, + + getAt: function( time ) { + + + // this can not go higher than this.keys.length. + while( ( this.lastIndex < this.keys.length ) && ( time >= this.keys[this.lastIndex].time ) ) { + this.lastIndex ++; + }; + + // this can not go lower than 0. + while( ( this.lastIndex > 0 ) && ( time < this.keys[this.lastIndex - 1].time ) ) { + this.lastIndex --; + } + + if ( this.lastIndex >= this.keys.length ) { + + this.setResult( this.keys[ this.keys.length - 1 ].value ); + + return this.result; + + } + + if ( this.lastIndex === 0 ) { + + this.setResult( this.keys[ 0 ].value ); + + return this.result; + + } + + var prevKey = this.keys[ this.lastIndex - 1 ]; + this.setResult( prevKey.value ); + + // if true, means that prev/current keys are identical, thus no interpolation required. + if ( prevKey.constantToNext ) { + + return this.result; + + } + + // linear interpolation to start with + var currentKey = this.keys[ this.lastIndex ]; + var alpha = ( time - prevKey.time ) / ( currentKey.time - prevKey.time ); + this.result = this.lerpValues( this.result, currentKey.value, alpha ); + + return this.result; + + }, + + // move all keyframes either forwards or backwards in time + shift: function( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + for ( var i = 0; i < this.keys.length; i ++ ) { + this.keys[i].time += timeOffset; + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function( timeScale ) { + + if ( timeScale !== 1.0 ) { + + for ( var i = 0; i < this.keys.length; i ++ ) { + this.keys[i].time *= timeScale; + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function( startTime, endTime ) { + + var firstKeysToRemove = 0; + for ( var i = 1; i < this.keys.length; i ++ ) { + if ( this.keys[i] <= startTime ) { + firstKeysToRemove ++; + } + } + + var lastKeysToRemove = 0; + for ( var i = this.keys.length - 2; i > 0; i ++ ) { + if ( this.keys[i] >= endTime ) { + lastKeysToRemove ++; + } else { + break; + } + } + + // remove last keys first because it doesn't affect the position of the first keys (the otherway around doesn't work as easily) + if ( ( firstKeysToRemove + lastKeysToRemove ) > 0 ) { + this.keys = this.keys.splice( firstKeysToRemove, this.keys.length - lastKeysToRemove - firstKeysToRemove );; + } + + return this; + + }, + + /* NOTE: This is commented out because we really shouldn't have to handle unsorted key lists + Tracks with out of order keys should be considered to be invalid. - bhouston + sort: function() { + + this.keys.sort( THREE.KeyframeTrack.keyComparer ); + + return this; + + },*/ + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + // One could eventually ensure that all key.values in a track are all of the same type (otherwise interpolation makes no sense.) + validate: function() { + + var prevKey = null; + + if ( this.keys.length === 0 ) { + console.error( " track is empty, no keys", this ); + return; + } + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var currKey = this.keys[i]; + + if ( ! currKey ) { + console.error( " key is null in track", this, i ); + return; + } + + if ( ( typeof currKey.time ) !== 'number' || isNaN( currKey.time ) ) { + console.error( " key.time is not a valid number", this, i, currKey ); + return; + } + + if ( currKey.value === undefined || currKey.value === null) { + console.error( " key.value is null in track", this, i, currKey ); + return; + } + + if ( prevKey && prevKey.time > currKey.time ) { + console.error( " key.time is less than previous key time, out of order keys", this, i, currKey, prevKey ); + return; + } + + prevKey = currKey; + + } + + return this; + + }, + + // currently only removes equivalent sequential keys (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0), which are common in morph target animations + optimize: function() { + + var newKeys = []; + var prevKey = this.keys[0]; + newKeys.push( prevKey ); + + var equalsFunc = THREE.AnimationUtils.getEqualsFunc( prevKey.value ); + + for ( var i = 1; i < this.keys.length - 1; i ++ ) { + var currKey = this.keys[i]; + var nextKey = this.keys[i+1]; + + // if prevKey & currKey are the same time, remove currKey. If you want immediate adjacent keys, use an epsilon offset + // it is not possible to have two keys at the same time as we sort them. The sort is not stable on keys with the same time. + if ( ( prevKey.time === currKey.time ) ) { + + continue; + + } + + // remove completely unnecessary keyframes that are the same as their prev and next keys + if ( this.compareValues( prevKey.value, currKey.value ) && this.compareValues( currKey.value, nextKey.value ) ) { + + continue; + + } + + // determine if interpolation is required + prevKey.constantToNext = this.compareValues( prevKey.value, currKey.value ); + + newKeys.push( currKey ); + prevKey = currKey; + } + newKeys.push( this.keys[ this.keys.length - 1 ] ); + + this.keys = newKeys; + + return this; + + } + +}; + +THREE.KeyframeTrack.keyComparer = function keyComparator(key0, key1) { + return key0.time - key1.time; +}; + +THREE.KeyframeTrack.parse = function( json ) { + + if ( json.type === undefined ) throw new Error( "track type undefined, can not parse" ); + + var trackType = THREE.KeyframeTrack.GetTrackTypeForTypeName( json.type ); + + return trackType.parse( json ); + +}; + +THREE.KeyframeTrack.GetTrackTypeForTypeName = function( typeName ) { + switch( typeName.toLowerCase() ) { + case "vector": + case "vector2": + case "vector3": + case "vector4": + return THREE.VectorKeyframeTrack; + + case "quaternion": + return THREE.QuaternionKeyframeTrack; + + case "integer": + case "scalar": + case "double": + case "float": + case "number": + return THREE.NumberKeyframeTrack; + + case "bool": + case "boolean": + return THREE.BooleanKeyframeTrack; + + case "string": + return THREE.StringKeyframeTrack; + }; + + throw new Error( "Unsupported typeName: " + typeName ); +}; + +// File:src/animation/PropertyBinding.js + +/** + * + * A track bound to a real value in the scene graph. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.PropertyBinding = function ( rootNode, trackName ) { + + this.rootNode = rootNode; + this.trackName = trackName; + this.referenceCount = 0; + this.originalValue = null; // the value of the property before it was controlled by this binding + + var parseResults = THREE.PropertyBinding.parseTrackName( trackName ); + + this.directoryName = parseResults.directoryName; + this.nodeName = parseResults.nodeName; + this.objectName = parseResults.objectName; + this.objectIndex = parseResults.objectIndex; + this.propertyName = parseResults.propertyName; + this.propertyIndex = parseResults.propertyIndex; + + this.node = THREE.PropertyBinding.findNode( rootNode, this.nodeName ) || rootNode; + + this.cumulativeValue = null; + this.cumulativeWeight = 0; +}; + +THREE.PropertyBinding.prototype = { + + constructor: THREE.PropertyBinding, + + reset: function() { + + this.cumulativeValue = null; + this.cumulativeWeight = 0; + + }, + + accumulate: function( value, weight ) { + + if ( ! this.isBound ) this.bind(); + + if ( this.cumulativeWeight === 0 ) { + + if ( weight > 0 ) { + + if ( this.cumulativeValue === null ) { + this.cumulativeValue = THREE.AnimationUtils.clone( value ); + } + this.cumulativeWeight = weight; + + } + + } else { + + var lerpAlpha = weight / ( this.cumulativeWeight + weight ); + this.cumulativeValue = this.lerpValue( this.cumulativeValue, value, lerpAlpha ); + this.cumulativeWeight += weight; + + } + + }, + + unbind: function() { + + if ( ! this.isBound ) return; + + this.setValue( this.originalValue ); + + this.setValue = null; + this.getValue = null; + this.lerpValue = null; + this.equalsValue = null; + this.triggerDirty = null; + this.isBound = false; + + }, + + // bind to the real property in the scene graph, remember original value, memorize various accessors for speed/inefficiency + bind: function() { + + if ( this.isBound ) return; + + var targetObject = this.node; + + // ensure there is a value node + if ( ! targetObject ) { + console.error( " trying to update node for track: " + this.trackName + " but it wasn't found." ); + return; + } + + if ( this.objectName ) { + // special case were we need to reach deeper into the hierarchy to get the face materials.... + if ( this.objectName === "materials" ) { + if ( ! targetObject.material ) { + console.error( ' can not bind to material as node does not have a material', this ); + return; + } + if ( ! targetObject.material.materials ) { + console.error( ' can not bind to material.materials as node.material does not have a materials array', this ); + return; + } + targetObject = targetObject.material.materials; + } else if ( this.objectName === "bones" ) { + if ( ! targetObject.skeleton ) { + console.error( ' can not bind to bones as node does not have a skeleton', this ); + return; + } + // potential future optimization: skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + if ( targetObject[i].name === this.objectIndex ) { + this.objectIndex = i; + break; + } + } + } else { + + if ( targetObject[ this.objectName ] === undefined ) { + console.error( ' can not bind to objectName of node, undefined', this ); + return; + } + targetObject = targetObject[ this.objectName ]; + } + + if ( this.objectIndex !== undefined ) { + if ( targetObject[ this.objectIndex ] === undefined ) { + console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject ); + return; + } + + targetObject = targetObject[ this.objectIndex ]; + } + + } + + // special case mappings + var nodeProperty = targetObject[ this.propertyName ]; + if ( ! nodeProperty ) { + console.error( " trying to update property for track: " + this.nodeName + '.' + this.propertyName + " but it wasn't found.", targetObject ); + return; + } + + // access a sub element of the property array (only primitives are supported right now) + if ( this.propertyIndex !== undefined ) { + + if ( this.propertyName === "morphTargetInfluences" ) { + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); + } + if ( ! targetObject.geometry.morphTargets ) { + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this ); + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + if ( targetObject.geometry.morphTargets[i].name === this.propertyIndex ) { + this.propertyIndex = i; + break; + } + } + } + + this.setValue = function setValue_propertyIndexed( value ) { + if ( ! this.equalsValue( nodeProperty[ this.propertyIndex ], value ) ) { + nodeProperty[ this.propertyIndex ] = value; + return true; + } + return false; + }; + + this.getValue = function getValue_propertyIndexed() { + return nodeProperty[ this.propertyIndex ]; + }; + + } + // must use copy for Object3D.Euler/Quaternion + else if ( nodeProperty.copy ) { + + this.setValue = function setValue_propertyObject( value ) { + if ( ! this.equalsValue( nodeProperty, value ) ) { + nodeProperty.copy( value ); + return true; + } + return false; + } + + this.getValue = function getValue_propertyObject() { + return nodeProperty; + }; + + } + // otherwise just set the property directly on the node (do not use nodeProperty as it may not be a reference object) + else { + + this.setValue = function setValue_property( value ) { + if ( ! this.equalsValue( targetObject[ this.propertyName ], value ) ) { + targetObject[ this.propertyName ] = value; + return true; + } + return false; + } + + this.getValue = function getValue_property() { + return targetObject[ this.propertyName ]; + }; + + } + + // trigger node dirty + if ( targetObject.needsUpdate !== undefined ) { // material + + this.triggerDirty = function triggerDirty_needsUpdate() { + this.node.needsUpdate = true; + } + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + this.triggerDirty = function triggerDirty_matrixWorldNeedsUpdate() { + targetObject.matrixWorldNeedsUpdate = true; + } + + } + + this.originalValue = this.getValue(); + + this.equalsValue = THREE.AnimationUtils.getEqualsFunc( this.originalValue ); + this.lerpValue = THREE.AnimationUtils.getLerpFunc( this.originalValue, true ); + + this.isBound = true; + + }, + + apply: function() { + + // for speed capture the setter pattern as a closure (sort of a memoization pattern: https://en.wikipedia.org/wiki/Memoization) + if ( ! this.isBound ) this.bind(); + + // early exit if there is nothing to apply. + if ( this.cumulativeWeight > 0 ) { + + // blend with original value + if ( this.cumulativeWeight < 1 ) { + + var remainingWeight = 1 - this.cumulativeWeight; + var lerpAlpha = remainingWeight / ( this.cumulativeWeight + remainingWeight ); + this.cumulativeValue = this.lerpValue( this.cumulativeValue, this.originalValue, lerpAlpha ); + + } + + var valueChanged = this.setValue( this.cumulativeValue ); + + if ( valueChanged && this.triggerDirty ) { + this.triggerDirty(); + } + + // reset accumulator + this.cumulativeValue = null; + this.cumulativeWeight = 0; + + } + } + +}; + + +THREE.PropertyBinding.parseTrackName = function( trackName ) { + + // matches strings in the form of: + // nodeName.property + // nodeName.property[accessor] + // nodeName.material.property[accessor] + // uuid.property[accessor] + // uuid.objectName[objectIndex].propertyName[propertyIndex] + // parentName/nodeName.property + // parentName/parentName/nodeName.property[index] + // .bone[Armature.DEF_cog].position + // created and tested via https://regex101.com/#javascript + + var re = /^(([\w]+\/)*)([\w-\d]+)?(\.([\w]+)(\[([\w\d\[\]\_. ]+)\])?)?(\.([\w.]+)(\[([\w\d\[\]\_. ]+)\])?)$/; + var matches = re.exec(trackName); + + if ( ! matches ) { + throw new Error( "cannot parse trackName at all: " + trackName ); + } + + if (matches.index === re.lastIndex) { + re.lastIndex++; + } + + var results = { + directoryName: matches[1], + nodeName: matches[3], // allowed to be null, specified root node. + objectName: matches[5], + objectIndex: matches[7], + propertyName: matches[9], + propertyIndex: matches[11] // allowed to be null, specifies that the whole property is set. + }; + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + throw new Error( "can not parse propertyName from trackName: " + trackName ); + } + + return results; + +}; + +THREE.PropertyBinding.findNode = function( root, nodeName ) { + + function searchSkeleton( skeleton ) { + + for ( var i = 0; i < skeleton.bones.length; i ++ ) { + + var bone = skeleton.bones[i]; + + if ( bone.name === nodeName ) { + + return bone; + + } + } + + return null; + + } + + function searchNodeSubtree( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[i]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + } + + // + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var bone = searchSkeleton( root.skeleton ); + + if ( bone ) { + + return bone; + + } + } + + // search into node subtree. + if ( root.children ) { + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; +} + +// File:src/animation/tracks/VectorKeyframeTrack.js + +/** + * + * A Track that interpolates Vectors + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.VectorKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value.clone(); + +}; + +THREE.VectorKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.VectorKeyframeTrack.prototype.constructor = THREE.VectorKeyframeTrack; + +THREE.VectorKeyframeTrack.prototype.setResult = function( value ) { + + this.result.copy( value ); + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.VectorKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return value0.lerp( value1, alpha ); + +}; + +THREE.VectorKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return value0.equals( value1 ); + +}; + +THREE.VectorKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value.clone() + } ); + } + + return new THREE.VectorKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.VectorKeyframeTrack.parse = function( json ) { + + var elementCount = json.keys[0].value.length; + var valueType = THREE[ 'Vector' + elementCount ]; + + var keys = []; + + for ( var i = 0; i < json.keys.length; i ++ ) { + var jsonKey = json.keys[i]; + keys.push( { + value: new valueType().fromArray( jsonKey.value ), + time: jsonKey.time + } ); + } + + return new THREE.VectorKeyframeTrack( json.name, keys ); + +}; + +// File:src/animation/tracks/QuaternionKeyframeTrack.js + +/** + * + * A Track that interpolates Quaternion + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.QuaternionKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value.clone(); + +}; + +THREE.QuaternionKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.QuaternionKeyframeTrack.prototype.constructor = THREE.QuaternionKeyframeTrack; + +THREE.QuaternionKeyframeTrack.prototype.setResult = function( value ) { + + this.result.copy( value ); + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.QuaternionKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return value0.slerp( value1, alpha ); + +}; + +THREE.QuaternionKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return value0.equals( value1 ); + +}; + +THREE.QuaternionKeyframeTrack.prototype.multiply = function( quat ) { + + for ( var i = 0; i < this.keys.length; i ++ ) { + + this.keys[i].value.multiply( quat ); + + } + + return this; + +}; + +THREE.QuaternionKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value.clone() + } ); + } + + return new THREE.QuaternionKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.QuaternionKeyframeTrack.parse = function( json ) { + + var keys = []; + + for ( var i = 0; i < json.keys.length; i ++ ) { + var jsonKey = json.keys[i]; + keys.push( { + value: new THREE.Quaternion().fromArray( jsonKey.value ), + time: jsonKey.time + } ); + } + + return new THREE.QuaternionKeyframeTrack( json.name, keys ); + +}; + +// File:src/animation/tracks/StringKeyframeTrack.js + +/** + * + * A Track that interpolates Strings + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.StringKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value; + +}; + +THREE.StringKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.StringKeyframeTrack.prototype.constructor = THREE.StringKeyframeTrack; + +THREE.StringKeyframeTrack.prototype.setResult = function( value ) { + + this.result = value; + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.StringKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return ( alpha < 1.0 ) ? value0 : value1; + +}; + +THREE.StringKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return ( value0 === value1 ); + +}; + +THREE.StringKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value + } ); + } + + return new THREE.StringKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.StringKeyframeTrack.parse = function( json ) { + + return new THREE.StringKeyframeTrack( json.name, json.keys ); + +}; + +// File:src/animation/tracks/BooleanKeyframeTrack.js + +/** + * + * A Track that interpolates Boolean + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.BooleanKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value; + +}; + +THREE.BooleanKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.BooleanKeyframeTrack.prototype.constructor = THREE.BooleanKeyframeTrack; + +THREE.BooleanKeyframeTrack.prototype.setResult = function( value ) { + + this.result = value; + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.BooleanKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return ( alpha < 1.0 ) ? value0 : value1; + +}; + +THREE.BooleanKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return ( value0 === value1 ); + +}; + +THREE.BooleanKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value + } ); + } + + return new THREE.BooleanKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.BooleanKeyframeTrack.parse = function( json ) { + + return new THREE.BooleanKeyframeTrack( json.name, json.keys ); + +}; + +// File:src/animation/tracks/NumberKeyframeTrack.js + +/** + * + * A Track that interpolates Numbers + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.NumberKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value; + +}; + +THREE.NumberKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.NumberKeyframeTrack.prototype.constructor = THREE.NumberKeyframeTrack; + +THREE.NumberKeyframeTrack.prototype.setResult = function( value ) { + + this.result = value; + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.NumberKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return value0 * ( 1 - alpha ) + value1 * alpha; + +}; + +THREE.NumberKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return ( value0 === value1 ); + +}; + +THREE.NumberKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value + } ); + } + + return new THREE.NumberKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.NumberKeyframeTrack.parse = function( json ) { + + return new THREE.NumberKeyframeTrack( json.name, json.keys ); + +}; + +// File:src/cameras/Camera.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.Camera = function () { + + THREE.Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new THREE.Matrix4(); + this.projectionMatrix = new THREE.Matrix4(); + +}; + +THREE.Camera.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Camera.prototype.constructor = THREE.Camera; + +THREE.Camera.prototype.getWorldDirection = function () { + + var quaternion = new THREE.Quaternion(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + +}(); + +THREE.Camera.prototype.lookAt = function () { + + // This routine does not support cameras with rotated and/or translated parent(s) + + var m1 = new THREE.Matrix4(); + + return function ( vector ) { + + m1.lookAt( this.position, vector, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + +}(); + +THREE.Camera.prototype.clone = function () { + + return new this.constructor().copy( this ); + +}; + +THREE.Camera.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + +}; + +// File:src/cameras/CubeCamera.js + +/** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.CubeCamera = function ( near, far, cubeResolution ) { + + THREE.Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new THREE.Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new THREE.Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new THREE.Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new THREE.Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new THREE.Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new THREE.Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + this.renderTarget = new THREE.WebGLRenderTargetCube( cubeResolution, cubeResolution, { format: THREE.RGBFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter } ); + + this.updateCubeMap = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + +}; + +THREE.CubeCamera.prototype = Object.create( THREE.Object3D.prototype ); +THREE.CubeCamera.prototype.constructor = THREE.CubeCamera; + +// File:src/cameras/OrthographicCamera.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.OrthographicCamera = function ( left, right, top, bottom, near, far ) { + + THREE.Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + +}; + +THREE.OrthographicCamera.prototype = Object.create( THREE.Camera.prototype ); +THREE.OrthographicCamera.prototype.constructor = THREE.OrthographicCamera; + +THREE.OrthographicCamera.prototype.updateProjectionMatrix = function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + this.projectionMatrix.makeOrthographic( cx - dx, cx + dx, cy + dy, cy - dy, this.near, this.far ); + +}; + +THREE.OrthographicCamera.prototype.copy = function ( source ) { + + THREE.Camera.prototype.copy.call( this, source ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + + return this; + +}; + +THREE.OrthographicCamera.prototype.toJSON = function ( meta ) { + + var data = THREE.Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + return data; + +}; + +// File:src/cameras/PerspectiveCamera.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.PerspectiveCamera = function ( fov, aspect, near, far ) { + + THREE.Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.zoom = 1; + + this.fov = fov !== undefined ? fov : 50; + this.aspect = aspect !== undefined ? aspect : 1; + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + + this.updateProjectionMatrix(); + +}; + +THREE.PerspectiveCamera.prototype = Object.create( THREE.Camera.prototype ); +THREE.PerspectiveCamera.prototype.constructor = THREE.PerspectiveCamera; + + +/** + * Uses Focal Length (in mm) to estimate and set FOV + * 35mm (full-frame) camera is used if frame size is not specified; + * Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html + */ + +THREE.PerspectiveCamera.prototype.setLens = function ( focalLength, frameHeight ) { + + if ( frameHeight === undefined ) frameHeight = 24; + + this.fov = 2 * THREE.Math.radToDeg( Math.atan( frameHeight / ( focalLength * 2 ) ) ); + this.updateProjectionMatrix(); + +}; + + +/** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + +THREE.PerspectiveCamera.prototype.setViewOffset = function ( fullWidth, fullHeight, x, y, width, height ) { + + this.fullWidth = fullWidth; + this.fullHeight = fullHeight; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + + this.updateProjectionMatrix(); + +}; + + +THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function () { + + var fov = THREE.Math.radToDeg( 2 * Math.atan( Math.tan( THREE.Math.degToRad( this.fov ) * 0.5 ) / this.zoom ) ); + + if ( this.fullWidth ) { + + var aspect = this.fullWidth / this.fullHeight; + var top = Math.tan( THREE.Math.degToRad( fov * 0.5 ) ) * this.near; + var bottom = - top; + var left = aspect * bottom; + var right = aspect * top; + var width = Math.abs( right - left ); + var height = Math.abs( top - bottom ); + + this.projectionMatrix.makeFrustum( + left + this.x * width / this.fullWidth, + left + ( this.x + this.width ) * width / this.fullWidth, + top - ( this.y + this.height ) * height / this.fullHeight, + top - this.y * height / this.fullHeight, + this.near, + this.far + ); + + } else { + + this.projectionMatrix.makePerspective( fov, this.aspect, this.near, this.far ); + + } + +}; + +THREE.PerspectiveCamera.prototype.copy = function ( source ) { + + THREE.Camera.prototype.copy.call( this, source ); + + this.fov = source.fov; + this.aspect = source.aspect; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + + return this; + +}; + +THREE.PerspectiveCamera.prototype.toJSON = function ( meta ) { + + var data = THREE.Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.fov = this.fov; + data.object.aspect = this.aspect; + data.object.near = this.near; + data.object.far = this.far; + + return data; + +}; + +// File:src/lights/Light.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Light = function ( color ) { + + THREE.Object3D.call( this ); + + this.type = 'Light'; + + this.color = new THREE.Color( color ); + + this.receiveShadow = undefined; + +}; + +THREE.Light.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Light.prototype.constructor = THREE.Light; + +Object.defineProperties( THREE.Light.prototype, { + onlyShadow: { + set: function ( value ) { + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + } + }, + shadowCameraFov: { + set: function ( value ) { + this.shadow.camera.fov = value; + } + }, + shadowCameraLeft: { + set: function ( value ) { + this.shadow.camera.left = value; + } + }, + shadowCameraRight: { + set: function ( value ) { + this.shadow.camera.right = value; + } + }, + shadowCameraTop: { + set: function ( value ) { + this.shadow.camera.top = value; + } + }, + shadowCameraBottom: { + set: function ( value ) { + this.shadow.camera.bottom = value; + } + }, + shadowCameraNear: { + set: function ( value ) { + this.shadow.camera.near = value; + } + }, + shadowCameraFar: { + set: function ( value ) { + this.shadow.camera.far = value; + } + }, + shadowCameraVisible: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow ) instead.' ); + } + }, + shadowBias: { + set: function ( value ) { + this.shadow.bias = value; + } + }, + shadowDarkness: { + set: function ( value ) { + this.shadow.darkness = value; + } + }, + shadowMapWidth: { + set: function ( value ) { + this.shadow.mapSize.width = value; + } + }, + shadowMapHeight: { + set: function ( value ) { + this.shadow.mapSize.height = value; + } + } +} ); + +THREE.Light.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + +}; + +THREE.Light.prototype.toJSON = function ( meta ) { + + var data = THREE.Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.intensity !== undefined ) data.object.intensity = this.intensity; + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.exponent !== undefined ) data.object.exponent = this.exponent; + + return data; + +}; + +// File:src/lights/LightShadow.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.LightShadow = function ( camera ) { + + this.camera = camera; + + this.bias = 0; + this.darkness = 1; + + this.mapSize = new THREE.Vector2( 512, 512 ); + + this.map = null; + this.matrix = null; + +}; + +THREE.LightShadow.prototype = { + + constructor: THREE.LightShadow, + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.darkness = source.darkness; + + this.mapSize.copy( source.mapSize ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +}; + +// File:src/lights/AmbientLight.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.AmbientLight = function ( color ) { + + THREE.Light.call( this, color ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + +}; + +THREE.AmbientLight.prototype = Object.create( THREE.Light.prototype ); +THREE.AmbientLight.prototype.constructor = THREE.AmbientLight; + +// File:src/lights/DirectionalLight.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.DirectionalLight = function ( color, intensity ) { + + THREE.Light.call( this, color ); + + this.type = 'DirectionalLight'; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.target = new THREE.Object3D(); + + this.intensity = ( intensity !== undefined ) ? intensity : 1; + + this.shadow = new THREE.LightShadow( new THREE.OrthographicCamera( - 500, 500, 500, - 500, 50, 5000 ) ); + +}; + +THREE.DirectionalLight.prototype = Object.create( THREE.Light.prototype ); +THREE.DirectionalLight.prototype.constructor = THREE.DirectionalLight; + +THREE.DirectionalLight.prototype.copy = function ( source ) { + + THREE.Light.prototype.copy.call( this, source ); + + this.intensity = source.intensity; + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + +}; + +// File:src/lights/HemisphereLight.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.HemisphereLight = function ( skyColor, groundColor, intensity ) { + + THREE.Light.call( this, skyColor ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.groundColor = new THREE.Color( groundColor ); + this.intensity = ( intensity !== undefined ) ? intensity : 1; + +}; + +THREE.HemisphereLight.prototype = Object.create( THREE.Light.prototype ); +THREE.HemisphereLight.prototype.constructor = THREE.HemisphereLight; + +THREE.HemisphereLight.prototype.copy = function ( source ) { + + THREE.Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + this.intensity = source.intensity; + + return this; + +}; + +// File:src/lights/PointLight.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + + +THREE.PointLight = function ( color, intensity, distance, decay ) { + + THREE.Light.call( this, color ); + + this.type = 'PointLight'; + + this.intensity = ( intensity !== undefined ) ? intensity : 1; + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new THREE.LightShadow( new THREE.PerspectiveCamera( 90, 1, 1, 500 ) ); + +}; + +THREE.PointLight.prototype = Object.create( THREE.Light.prototype ); +THREE.PointLight.prototype.constructor = THREE.PointLight; + +THREE.PointLight.prototype.copy = function ( source ) { + + THREE.Light.prototype.copy.call( this, source ); + + this.intensity = source.intensity; + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + +}; + +// File:src/lights/SpotLight.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.SpotLight = function ( color, intensity, distance, angle, exponent, decay ) { + + THREE.Light.call( this, color ); + + this.type = 'SpotLight'; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.target = new THREE.Object3D(); + + this.intensity = ( intensity !== undefined ) ? intensity : 1; + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.exponent = ( exponent !== undefined ) ? exponent : 10; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new THREE.LightShadow( new THREE.PerspectiveCamera( 50, 1, 50, 5000 ) ); + +}; + +THREE.SpotLight.prototype = Object.create( THREE.Light.prototype ); +THREE.SpotLight.prototype.constructor = THREE.SpotLight; + +THREE.SpotLight.prototype.copy = function ( source ) { + + THREE.Light.prototype.copy.call( this, source ); + + this.intensity = source.intensity; + this.distance = source.distance; + this.angle = source.angle; + this.exponent = source.exponent; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + +}; + +// File:src/loaders/Cache.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + +}; + +// File:src/loaders/Loader.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Loader = function () { + + this.onLoadStart = function () {}; + this.onLoadProgress = function () {}; + this.onLoadComplete = function () {}; + +}; + +THREE.Loader.prototype = { + + constructor: THREE.Loader, + + crossOrigin: undefined, + + extractUrlBase: function ( url ) { + + var parts = url.split( '/' ); + + if ( parts.length === 1 ) return './'; + + parts.pop(); + + return parts.join( '/' ) + '/'; + + }, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var color, textureLoader, materialLoader; + + return function ( m, texturePath, crossOrigin ) { + + if ( color === undefined ) color = new THREE.Color(); + if ( textureLoader === undefined ) textureLoader = new THREE.TextureLoader(); + if ( materialLoader === undefined ) materialLoader = new THREE.MaterialLoader(); + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = THREE.Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = THREE.RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = THREE.MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = THREE.RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = THREE.MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = THREE.Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: THREE.Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + case 'DbgColor': + json.color = value; + break; + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + // These were never supported + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = THREE[ value ]; + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = [ value, value ]; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = THREE.BackSide; + break; + case 'doubleSided': + json.side = THREE.DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'opacity': + case 'transparent': + case 'depthTest': + case 'depthWrite': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = THREE.VertexColors; + if ( value === 'face' ) json.vertexColors = THREE.FaceColors; + break; + default: + console.error( 'Loader.createMaterial: Unsupported', name, value ); + break; + } + + } + + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + +}; + +THREE.Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + +}; + +// File:src/loaders/XHRLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.XHRLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.XHRLoader.prototype = { + + constructor: THREE.XHRLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var cached = THREE.Cache.get( url ); + + if ( cached !== undefined ) { + + if ( onLoad ) { + + setTimeout( function () { + + onLoad( cached ); + + }, 0 ); + + } + + return cached; + + } + + var request = new XMLHttpRequest(); + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = event.target.response; + + THREE.Cache.add( url, response ); + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, false ); + + if ( onProgress !== undefined ) { + + request.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + }, false ); + + if ( this.crossOrigin !== undefined ) request.crossOrigin = this.crossOrigin; + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + request.send( null ); + + scope.manager.itemStart( url ); + + return request; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + + } + +}; + +// File:src/loaders/ImageLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.ImageLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.ImageLoader.prototype = { + + constructor: THREE.ImageLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var cached = THREE.Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + if ( onLoad ) { + + setTimeout( function () { + + onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } else { + + scope.manager.itemEnd( url ); + + } + + return cached; + + } + + var image = document.createElement( 'img' ); + + image.addEventListener( 'load', function ( event ) { + + THREE.Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + }, false ); + + if ( onProgress !== undefined ) { + + image.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + image.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + }, false ); + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/loaders/JSONLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.JSONLoader = function ( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + this.withCredentials = false; + +}; + +THREE.JSONLoader.prototype = { + + constructor: THREE.JSONLoader, + + // Deprecated + + get statusDomElement () { + + if ( this._statusDomElement === undefined ) { + + this._statusDomElement = document.createElement( 'div' ); + + } + + console.warn( 'THREE.JSONLoader: .statusDomElement has been removed.' ); + return this._statusDomElement; + + }, + + load: function( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : THREE.Loader.prototype.extractUrlBase( url ); + + var loader = new THREE.XHRLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + if ( metadata.type === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + if ( metadata.type === 'scene' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); + return; + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + } ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: function ( json, texturePath ) { + + var geometry = new THREE.Geometry(), + scale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0; + + parseModel( scale ); + + parseSkin(); + parseMorphing( scale ); + parseAnimations(); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + function parseModel( scale ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + nUvLayers = 0; + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new THREE.Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new THREE.Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new THREE.Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new THREE.Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new THREE.Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new THREE.Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new THREE.Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new THREE.Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new THREE.Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new THREE.Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new THREE.Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + }; + + function parseSkin() { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + }; + + function parseMorphing( scale ) { + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new THREE.Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations() { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + if ( json.animation !== undefined ) { + animations.push( json.animation ); + } + if ( json.animations !== undefined ) { + if ( json.animations.length ) { + animations = animations.concat( json.animations ); + } else { + animations.push( json.animations ); + } + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = THREE.AnimationClip.parseAnimation( animations[i], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = THREE.AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + }; + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = THREE.Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + } + +}; + +// File:src/loaders/LoadingManager.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.LoadingManager = function ( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false, itemsLoaded = 0, itemsTotal = 0; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + +}; + +THREE.DefaultLoadingManager = new THREE.LoadingManager(); + +// File:src/loaders/BufferGeometryLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.BufferGeometryLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.BufferGeometryLoader.prototype = { + + constructor: THREE.BufferGeometryLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.XHRLoader( scope.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json ) { + + var geometry = new THREE.BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new self[ index.type ]( index.array ); + geometry.setIndex( new THREE.BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new self[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new THREE.BufferAttribute( typedArray, attribute.itemSize ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new THREE.Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new THREE.Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + +}; + +// File:src/loaders/MaterialLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.MaterialLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + this.textures = {}; + +}; + +THREE.MaterialLoader.prototype = { + + constructor: THREE.MaterialLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.XHRLoader( scope.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + getTexture: function ( name ) { + + var textures = this.textures; + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + }, + + parse: function ( json ) { + + var material = new THREE[ json.type ]; + material.uuid = json.uuid; + + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.shading !== undefined ) material.shading = json.shading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + + // for PointsMaterial + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = this.getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = this.getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = this.getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = this.getTexture( json.normalMap ); + if ( json.normalScale ) material.normalScale = new THREE.Vector2( json.normalScale, json.normalScale ); + + if ( json.displacementMap !== undefined ) material.displacementMap = this.getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.specularMap !== undefined ) material.specularMap = this.getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) { + + material.envMap = this.getTexture( json.envMap ); + material.combine = THREE.MultiplyOperation; + + } + + if ( json.reflectivity ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = this.getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = this.getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + // MeshFaceMaterial + + if ( json.materials !== undefined ) { + + for ( var i = 0, l = json.materials.length; i < l; i ++ ) { + + material.materials.push( this.parse( json.materials[ i ] ) ); + + } + + } + + return material; + + } + +}; + +// File:src/loaders/ObjectLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.ObjectLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + this.texturePath = ''; + +}; + +THREE.ObjectLoader.prototype = { + + constructor: THREE.ObjectLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new THREE.XHRLoader( scope.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( text ) { + + scope.parse( JSON.parse( text ), onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var geometries = this.parseGeometries( json.geometries ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseGeometries: function ( json ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new THREE.JSONLoader(); + var bufferGeometryLoader = new THREE.BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new THREE[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new THREE.BoxGeometry( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleBufferGeometry': + + geometry = new THREE.CircleBufferGeometry( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CircleGeometry': + + geometry = new THREE.CircleGeometry( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + + geometry = new THREE.CylinderGeometry( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + + geometry = new THREE.SphereGeometry( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereBufferGeometry': + + geometry = new THREE.SphereBufferGeometry( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + + geometry = new THREE.DodecahedronGeometry( + data.radius, + data.detail + ); + + break; + + case 'IcosahedronGeometry': + + geometry = new THREE.IcosahedronGeometry( + data.radius, + data.detail + ); + + break; + + case 'OctahedronGeometry': + + geometry = new THREE.OctahedronGeometry( + data.radius, + data.detail + ); + + break; + + case 'TetrahedronGeometry': + + geometry = new THREE.TetrahedronGeometry( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + + geometry = new THREE.RingGeometry( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + + geometry = new THREE.TorusGeometry( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + + geometry = new THREE.TorusKnotGeometry( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.p, + data.q, + data.heightScale + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data.data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new THREE.MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var material = loader.parse( json[ i ] ); + materials[ material.uuid ] = material; + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = THREE.AnimationClip.parse( json[i] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new THREE.LoadingManager( onLoad ); + + var loader = new THREE.ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value ) { + + if ( typeof( value ) === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return THREE[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new THREE.Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping ); + if ( data.offset !== undefined ) texture.offset = new THREE.Vector2( data.offset[ 0 ], data.offset[ 1 ] ); + if ( data.repeat !== undefined ) texture.repeat = new THREE.Vector2( data.repeat[ 0 ], data.repeat[ 1 ] ); + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + if ( Array.isArray( data.wrap ) ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ] ); + texture.wrapT = parseConstant( data.wrap[ 1 ] ); + + } + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function () { + + var matrix = new THREE.Matrix4(); + + return function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new THREE.Scene(); + + break; + + case 'PerspectiveCamera': + + object = new THREE.PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + break; + + case 'OrthographicCamera': + + object = new THREE.OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new THREE.AmbientLight( data.color ); + + break; + + case 'DirectionalLight': + + object = new THREE.DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new THREE.PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'SpotLight': + + object = new THREE.SpotLight( data.color, data.intensity, data.distance, data.angle, data.exponent, data.decay ); + + break; + + case 'HemisphereLight': + + object = new THREE.HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'Mesh': + + object = new THREE.Mesh( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LOD': + + object = new THREE.LOD(); + + break; + + case 'Line': + + object = new THREE.Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'PointCloud': + case 'Points': + + object = new THREE.Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new THREE.Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new THREE.Group(); + + break; + + default: + + object = new THREE.Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + matrix.fromArray( data.matrix ); + matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + for ( var child in data.children ) { + + object.add( this.parseObject( data.children[ child ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + + }() + +}; + +// File:src/loaders/TextureLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.TextureLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.TextureLoader.prototype = { + + constructor: THREE.TextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new THREE.Texture(); + + var loader = new THREE.ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( image ) { + + texture.image = image; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/loaders/CubeTextureLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.CubeTextureLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.CubeTextureLoader.prototype = { + + constructor: THREE.CubeTextureLoader, + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new THREE.CubeTexture( [] ); + + var loader = new THREE.ImageLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/loaders/BinaryTextureLoader.js + +/** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + +THREE.DataTextureLoader = THREE.BinaryTextureLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + // override in sub classes + this._parser = null; + +}; + +THREE.BinaryTextureLoader.prototype = { + + constructor: THREE.BinaryTextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new THREE.DataTexture(); + + var loader = new THREE.XHRLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : THREE.ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : THREE.ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : THREE.LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : THREE.LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = THREE.LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/loaders/CompressedTextureLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + +THREE.CompressedTextureLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + // override in sub classes + this._parser = null; + +}; + + +THREE.CompressedTextureLoader.prototype = { + + constructor: THREE.CompressedTextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new THREE.CompressedTexture(); + texture.image = images; + + var loader = new THREE.XHRLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setResponseType( 'arraybuffer' ); + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + var loadTexture = function ( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = THREE.LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + }; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = THREE.LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/materials/Material.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Material = function () { + + Object.defineProperty( this, 'id', { value: THREE.MaterialIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.side = THREE.FrontSide; + + this.opacity = 1; + this.transparent = false; + + this.blending = THREE.NormalBlending; + + this.blendSrc = THREE.SrcAlphaFactor; + this.blendDst = THREE.OneMinusSrcAlphaFactor; + this.blendEquation = THREE.AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = THREE.LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.alphaTest = 0; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this._needsUpdate = true; + +}; + +THREE.Material.prototype = { + + constructor: THREE.Material, + + get needsUpdate () { + + return this._needsUpdate; + + }, + + set needsUpdate ( value ) { + + if ( value === true ) this.update(); + + this._needsUpdate = value; + + }, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue instanceof THREE.Color ) { + + currentValue.set( newValue ); + + } else if ( currentValue instanceof THREE.Vector3 && newValue instanceof THREE.Vector3 ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var data = { + metadata: { + version: 4.4, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.color instanceof THREE.Color ) data.color = this.color.getHex(); + if ( this.emissive instanceof THREE.Color ) data.emissive = this.emissive.getHex(); + if ( this.specular instanceof THREE.Color ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + + if ( this.map instanceof THREE.Texture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap instanceof THREE.Texture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap instanceof THREE.Texture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( this.bumpMap instanceof THREE.Texture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( this.normalMap instanceof THREE.Texture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale; // Removed for now, causes issue in editor ui.js + + } + if ( this.displacementMap instanceof THREE.Texture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( this.specularMap instanceof THREE.Texture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + if ( this.envMap instanceof THREE.Texture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.vertexColors !== undefined && this.vertexColors !== THREE.NoColors ) data.vertexColors = this.vertexColors; + if ( this.shading !== undefined && this.shading !== THREE.SmoothShading ) data.shading = this.shading; + if ( this.blending !== undefined && this.blending !== THREE.NormalBlending ) data.blending = this.blending; + if ( this.side !== undefined && this.side !== THREE.FrontSide ) data.side = this.side; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.side = source.side; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blending = source.blending; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.alphaTest = source.alphaTest; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + + return this; + + }, + + update: function () { + + this.dispatchEvent( { type: 'update' } ); + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + // Deprecated + + get wrapAround () { + + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + + }, + + set wrapAround ( boolean ) { + + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + + }, + + get wrapRGB () { + + console.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' ); + return new THREE.Color(); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.Material.prototype ); + +THREE.MaterialIdCount = 0; + +// File:src/materials/LineBasicMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round", + * + * vertexColors: + * + * fog: + * } + */ + +THREE.LineBasicMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new THREE.Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.vertexColors = THREE.NoColors; + + this.fog = true; + + this.setValues( parameters ); + +}; + +THREE.LineBasicMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.LineBasicMaterial.prototype.constructor = THREE.LineBasicMaterial; + +THREE.LineBasicMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + this.vertexColors = source.vertexColors; + + this.fog = source.fog; + + return this; + +}; + +// File:src/materials/LineDashedMaterial.js + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: , + * + * vertexColors: + * + * fog: + * } + */ + +THREE.LineDashedMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'LineDashedMaterial'; + + this.color = new THREE.Color( 0xffffff ); + + this.linewidth = 1; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.vertexColors = false; + + this.fog = true; + + this.setValues( parameters ); + +}; + +THREE.LineDashedMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.LineDashedMaterial.prototype.constructor = THREE.LineDashedMaterial; + +THREE.LineDashedMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + this.vertexColors = source.vertexColors; + + this.fog = source.fog; + + return this; + +}; + +// File:src/materials/MeshBasicMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * shading: THREE.SmoothShading, + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, + * + * skinning: , + * morphTargets: , + * + * fog: + * } + */ + +THREE.MeshBasicMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new THREE.Color( 0xffffff ); // emissive + + this.map = null; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = THREE.MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.fog = true; + + this.shading = THREE.SmoothShading; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.vertexColors = THREE.NoColors; + + this.skinning = false; + this.morphTargets = false; + + this.setValues( parameters ); + +}; + +THREE.MeshBasicMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshBasicMaterial.prototype.constructor = THREE.MeshBasicMaterial; + +THREE.MeshBasicMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.fog = source.fog; + + this.shading = source.shading; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.vertexColors = source.vertexColors; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + +}; + +// File:src/materials/MeshLambertMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * emissive: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, + * + * skinning: , + * morphTargets: , + * morphNormals: , + * + * fog: + * } + */ + +THREE.MeshLambertMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new THREE.Color( 0xffffff ); // diffuse + this.emissive = new THREE.Color( 0x000000 ); + + this.map = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = THREE.MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.fog = true; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.vertexColors = THREE.NoColors; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +}; + +THREE.MeshLambertMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshLambertMaterial.prototype.constructor = THREE.MeshLambertMaterial; + +THREE.MeshLambertMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.emissive.copy( source.emissive ); + + this.map = source.map; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.fog = source.fog; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.vertexColors = source.vertexColors; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + +// File:src/materials/MeshPhongMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * emissive: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * shading: THREE.SmoothShading, + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, + * + * skinning: , + * morphTargets: , + * morphNormals: , + * + * fog: + * } + */ + +THREE.MeshPhongMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new THREE.Color( 0xffffff ); // diffuse + this.emissive = new THREE.Color( 0x000000 ); + this.specular = new THREE.Color( 0x111111 ); + this.shininess = 30; + + this.metal = false; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new THREE.Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = THREE.MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.fog = true; + + this.shading = THREE.SmoothShading; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.vertexColors = THREE.NoColors; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +}; + +THREE.MeshPhongMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshPhongMaterial.prototype.constructor = THREE.MeshPhongMaterial; + +THREE.MeshPhongMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.emissive.copy( source.emissive ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.metal = source.metal; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissiveMap = source.emissiveMap; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.fog = source.fog; + + this.shading = source.shading; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.vertexColors = source.vertexColors; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + +// File:src/materials/MeshDepthMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * opacity: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + +THREE.MeshDepthMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.morphTargets = false; + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.setValues( parameters ); + +}; + +THREE.MeshDepthMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshDepthMaterial.prototype.constructor = THREE.MeshDepthMaterial; + +THREE.MeshDepthMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + +}; + +// File:src/materials/MeshNormalMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * opacity: , + * + * shading: THREE.FlatShading, + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + +THREE.MeshNormalMaterial = function ( parameters ) { + + THREE.Material.call( this, parameters ); + + this.type = 'MeshNormalMaterial'; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.morphTargets = false; + + this.setValues( parameters ); + +}; + +THREE.MeshNormalMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshNormalMaterial.prototype.constructor = THREE.MeshNormalMaterial; + +THREE.MeshNormalMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + +}; + +// File:src/materials/MultiMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.MultiMaterial = function ( materials ) { + + this.uuid = THREE.Math.generateUUID(); + + this.type = 'MultiMaterial'; + + this.materials = materials instanceof Array ? materials : []; + + this.visible = true; + +}; + +THREE.MultiMaterial.prototype = { + + constructor: THREE.MultiMaterial, + + toJSON: function () { + + var output = { + metadata: { + version: 4.2, + type: 'material', + generator: 'MaterialExporter' + }, + uuid: this.uuid, + type: this.type, + materials: [] + }; + + for ( var i = 0, l = this.materials.length; i < l; i ++ ) { + + output.materials.push( this.materials[ i ].toJSON() ); + + } + + output.visible = this.visible; + + return output; + + }, + + clone: function () { + + var material = new this.constructor(); + + for ( var i = 0; i < this.materials.length; i ++ ) { + + material.materials.push( this.materials[ i ].clone() ); + + } + + material.visible = this.visible; + + return material; + + } + +}; + +// backwards compatibility + +THREE.MeshFaceMaterial = THREE.MultiMaterial; + +// File:src/materials/PointsMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * vertexColors: , + * + * fog: + * } + */ + +THREE.PointsMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new THREE.Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.vertexColors = THREE.NoColors; + + this.fog = true; + + this.setValues( parameters ); + +}; + +THREE.PointsMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.PointsMaterial.prototype.constructor = THREE.PointsMaterial; + +THREE.PointsMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.vertexColors = source.vertexColors; + + this.fog = source.fog; + + return this; + +}; + +// backwards compatibility + +THREE.PointCloudMaterial = function ( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new THREE.PointsMaterial( parameters ); + +}; + +THREE.ParticleBasicMaterial = function ( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new THREE.PointsMaterial( parameters ); + +}; + +THREE.ParticleSystemMaterial = function ( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new THREE.PointsMaterial( parameters ); + +}; + +// File:src/materials/ShaderMaterial.js + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { type: "f", value: 1.0 }, "parameter2": { type: "i" value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * shading: THREE.SmoothShading, + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, + * + * skinning: , + * morphTargets: , + * morphNormals: , + * + * fog: + * } + */ + +THREE.ShaderMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.shading = THREE.SmoothShading; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + + this.lights = false; // set to use scene lights + + this.vertexColors = THREE.NoColors; // set to use "color" attribute stream + + this.skinning = false; // set to use skinning attribute streams + + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.derivatives = false; // set to use derivatives + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + +}; + +THREE.ShaderMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.ShaderMaterial.prototype.constructor = THREE.ShaderMaterial; + +THREE.ShaderMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = THREE.UniformsUtils.clone( source.uniforms ); + + this.attributes = source.attributes; + this.defines = source.defines; + + this.shading = source.shading; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.fog = source.fog; + + this.lights = source.lights; + + this.vertexColors = source.vertexColors; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.derivatives = source.derivatives; + + return this; + +}; + +THREE.ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = THREE.Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.attributes = this.attributes; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + +}; + +// File:src/materials/RawShaderMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.RawShaderMaterial = function ( parameters ) { + + THREE.ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + +}; + +THREE.RawShaderMaterial.prototype = Object.create( THREE.ShaderMaterial.prototype ); +THREE.RawShaderMaterial.prototype.constructor = THREE.RawShaderMaterial; +// File:src/materials/SpriteMaterial.js + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2(), + * + * fog: + * } + */ + +THREE.SpriteMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new THREE.Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + + // set parameters + + this.setValues( parameters ); + +}; + +THREE.SpriteMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.SpriteMaterial.prototype.constructor = THREE.SpriteMaterial; + +THREE.SpriteMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + this.fog = source.fog; + + return this; + +}; + +// File:src/textures/Texture.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + +THREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Object.defineProperty( this, 'id', { value: THREE.TextureIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.sourceFile = ''; + + this.image = image !== undefined ? image : THREE.Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : THREE.Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : THREE.RGBAFormat; + this.type = type !== undefined ? type : THREE.UnsignedByteType; + + this.offset = new THREE.Vector2( 0, 0 ); + this.repeat = new THREE.Vector2( 1, 1 ); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + this.version = 0; + this.onUpdate = null; + +}; + +THREE.Texture.DEFAULT_IMAGE = undefined; +THREE.Texture.DEFAULT_MAPPING = THREE.UVMapping; + +THREE.Texture.prototype = { + + constructor: THREE.Texture, + + set needsUpdate ( value ) { + + if ( value === true ) this.version ++; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + + return this; + + }, + + toJSON: function ( meta ) { + + if ( meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image.toDataURL !== undefined ) { + + canvas = image; + + } else { + + canvas = document.createElement( 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + metadata: { + version: 4.4, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + wrap: [ this.wrapS, this.wrapT ], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = THREE.Math.generateUUID(); // UGH + + } + + if ( meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + meta.textures[ this.uuid ] = output; + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== THREE.UVMapping ) return; + + uv.multiply( this.repeat ); + uv.add( this.offset ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case THREE.RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case THREE.ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case THREE.MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case THREE.RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case THREE.ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case THREE.MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.Texture.prototype ); + +THREE.TextureIdCount = 0; + +// File:src/textures/CanvasTexture.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.CanvasTexture = function ( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + THREE.Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + +}; + +THREE.CanvasTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.CanvasTexture.prototype.constructor = THREE.CanvasTexture; + +// File:src/textures/CubeTexture.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.CubeTexture = function ( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + mapping = mapping !== undefined ? mapping : THREE.CubeReflectionMapping; + + THREE.Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.images = images; + this.flipY = false; + +}; + +THREE.CubeTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.CubeTexture.prototype.constructor = THREE.CubeTexture; + +THREE.CubeTexture.prototype.copy = function ( source ) { + + THREE.Texture.prototype.copy.call( this, source ); + + this.images = source.images; + + return this; + +}; +// File:src/textures/CompressedTexture.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.CompressedTexture = function ( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) { + + THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + +}; + +THREE.CompressedTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.CompressedTexture.prototype.constructor = THREE.CompressedTexture; + +// File:src/textures/DataTexture.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.DataTexture = function ( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) { + + THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : THREE.NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : THREE.NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + +}; + +THREE.DataTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.DataTexture.prototype.constructor = THREE.DataTexture; + +// File:src/textures/VideoTexture.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.VideoTexture = function ( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + THREE.Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + var scope = this; + + function update() { + + requestAnimationFrame( update ); + + if ( video.readyState === video.HAVE_ENOUGH_DATA ) { + + scope.needsUpdate = true; + + } + + } + + update(); + +}; + +THREE.VideoTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.VideoTexture.prototype.constructor = THREE.VideoTexture; + +// File:src/objects/Group.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Group = function () { + + THREE.Object3D.call( this ); + + this.type = 'Group'; + +}; + +THREE.Group.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Group.prototype.constructor = THREE.Group; +// File:src/objects/Points.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Points = function ( geometry, material ) { + + THREE.Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); + this.material = material !== undefined ? material : new THREE.PointsMaterial( { color: Math.random() * 0xffffff } ); + +}; + +THREE.Points.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Points.prototype.constructor = THREE.Points; + +THREE.Points.prototype.raycast = ( function () { + + var inverseMatrix = new THREE.Matrix4(); + var ray = new THREE.Ray(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = object.geometry; + var threshold = raycaster.params.Points.threshold; + + inverseMatrix.getInverse( this.matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + if ( geometry.boundingBox !== null ) { + + if ( ray.isIntersectionBox( geometry.boundingBox ) === false ) { + + return; + + } + + } + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new THREE.Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + var intersectPoint = ray.closestPointToPoint( point ); + intersectPoint.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry instanceof THREE.BufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + +}() ); + +THREE.Points.prototype.clone = function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + +}; + +// Backwards compatibility + +THREE.PointCloud = function ( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new THREE.Points( geometry, material ); + +}; + +THREE.ParticleSystem = function ( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new THREE.Points( geometry, material ); + +}; + +// File:src/objects/Line.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Line = function ( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new THREE.LineSegments( geometry, material ); + + } + + THREE.Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); + this.material = material !== undefined ? material : new THREE.LineBasicMaterial( { color: Math.random() * 0xffffff } ); + +}; + +THREE.Line.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Line.prototype.constructor = THREE.Line; + +THREE.Line.prototype.raycast = ( function () { + + var inverseMatrix = new THREE.Matrix4(); + var ray = new THREE.Ray(); + var sphere = new THREE.Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + // Checking boundingSphere distance to ray + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( this.matrixWorld ); + + if ( raycaster.ray.isIntersectionSphere( sphere ) === false ) { + + return; + + } + + inverseMatrix.getInverse( this.matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new THREE.Vector3(); + var vEnd = new THREE.Vector3(); + var interSegment = new THREE.Vector3(); + var interRay = new THREE.Vector3(); + var step = this instanceof THREE.LineSegments ? 2 : 1; + + if ( geometry instanceof THREE.BufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + + if ( index !== null ) { + + var indices = index.array; + var positions = attributes.position.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + var positions = attributes.position.array; + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry instanceof THREE.Geometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + +}() ); + +THREE.Line.prototype.clone = function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + +}; + +// DEPRECATED + +THREE.LineStrip = 0; +THREE.LinePieces = 1; + +// File:src/objects/LineSegments.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.LineSegments = function ( geometry, material ) { + + THREE.Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + +}; + +THREE.LineSegments.prototype = Object.create( THREE.Line.prototype ); +THREE.LineSegments.prototype.constructor = THREE.LineSegments; + +// File:src/objects/Mesh.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + +THREE.Mesh = function ( geometry, material ) { + + THREE.Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); + this.material = material !== undefined ? material : new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.updateMorphTargets(); + +}; + +THREE.Mesh.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Mesh.prototype.constructor = THREE.Mesh; + +THREE.Mesh.prototype.updateMorphTargets = function () { + + if ( this.geometry.morphTargets !== undefined && this.geometry.morphTargets.length > 0 ) { + + this.morphTargetBase = - 1; + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( var m = 0, ml = this.geometry.morphTargets.length; m < ml; m ++ ) { + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ this.geometry.morphTargets[ m ].name ] = m; + + } + + } + +}; + +THREE.Mesh.prototype.getMorphTargetIndexByName = function ( name ) { + + if ( this.morphTargetDictionary[ name ] !== undefined ) { + + return this.morphTargetDictionary[ name ]; + + } + + console.warn( 'THREE.Mesh.getMorphTargetIndexByName: morph target ' + name + ' does not exist. Returning 0.' ); + + return 0; + +}; + + +THREE.Mesh.prototype.raycast = ( function () { + + var inverseMatrix = new THREE.Matrix4(); + var ray = new THREE.Ray(); + var sphere = new THREE.Sphere(); + + var vA = new THREE.Vector3(); + var vB = new THREE.Vector3(); + var vC = new THREE.Vector3(); + + var tempA = new THREE.Vector3(); + var tempB = new THREE.Vector3(); + var tempC = new THREE.Vector3(); + + var uvA = new THREE.Vector2(); + var uvB = new THREE.Vector2(); + var uvC = new THREE.Vector2(); + + var barycoord = new THREE.Vector3(); + + var intersectionPoint = new THREE.Vector3(); + var intersectionPointWorld = new THREE.Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + THREE.Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, raycaster, ray, pA, pB, pC, point ){ + + var intersect; + var material = object.material; + + if ( material.side === THREE.BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== THREE.DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) { + + vA.fromArray( positions, a * 3 ); + vB.fromArray( positions, b * 3 ); + vC.fromArray( positions, c * 3 ); + + var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + uvA.fromArray( uvs, a * 2 ); + uvB.fromArray( uvs, b * 2 ); + uvC.fromArray( uvs, c * 2 ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + intersection.face = new THREE.Face3( a, b, c, THREE.Triangle.normal( vA, vB, vC ) ); + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + var matrixWorld = this.matrixWorld; + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.isIntersectionSphere( sphere ) === false ) return; + + // Check boundingBox before continuing + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + if ( geometry.boundingBox !== null ) { + + if ( ray.isIntersectionBox( geometry.boundingBox ) === false ) return; + + } + + var uvs, intersection; + + if ( geometry instanceof THREE.BufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( attributes.uv !== undefined ){ + + uvs = attributes.uv.array; + + } + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length; i < l; i += 3 ) { + + a = indices[ i ]; + b = indices[ i + 1 ]; + c = indices[ i + 2 ]; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else { + + + for ( var i = 0, l = positions.length; i < l; i += 9 ) { + + a = i / 3; + b = a + 1; + c = a + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c ); + + if ( intersection ) { + + intersection.index = a; // triangle number in positions buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( geometry instanceof THREE.Geometry ) { + + var fvA, fvB, fvC; + var isFaceMaterial = material instanceof THREE.MeshFaceMaterial; + var materials = isFaceMaterial === true ? material.materials : null; + + var vertices = geometry.vertices; + var faces = geometry.faces; + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + +}() ); + +THREE.Mesh.prototype.clone = function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + +}; + +// File:src/objects/Bone.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + +THREE.Bone = function ( skin ) { + + THREE.Object3D.call( this ); + + this.type = 'Bone'; + + this.skin = skin; + +}; + +THREE.Bone.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Bone.prototype.constructor = THREE.Bone; + +THREE.Bone.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + this.skin = source.skin; + + return this; + +}; + +// File:src/objects/Skeleton.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + +THREE.Skeleton = function ( bones, boneInverses, useVertexTexture ) { + + this.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true; + + this.identityMatrix = new THREE.Matrix4(); + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + + // create a bone texture or an array of floats + + if ( this.useVertexTexture ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix + size = THREE.Math.nextPowerOfTwo( Math.ceil( size ) ); + size = Math.max( size, 4 ); + + this.boneTextureWidth = size; + this.boneTextureHeight = size; + + this.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel + this.boneTexture = new THREE.DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType ); + + } else { + + this.boneMatrices = new Float32Array( 16 * this.bones.length ); + + } + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton bonInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + this.boneInverses.push( new THREE.Matrix4() ); + + } + + } + + } + +}; + +THREE.Skeleton.prototype.calculateInverses = function () { + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + var inverse = new THREE.Matrix4(); + + if ( this.bones[ b ] ) { + + inverse.getInverse( this.bones[ b ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + +}; + +THREE.Skeleton.prototype.pose = function () { + + var bone; + + // recover the bind-time world matrices + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ b ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + if ( bone.parent ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + +}; + +THREE.Skeleton.prototype.update = ( function () { + + var offsetMatrix = new THREE.Matrix4(); + + return function update() { + + // flatten bone matrices to array + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + // compute the offset between the current and the original transform + + var matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] ); + offsetMatrix.flattenToArrayOffset( this.boneMatrices, b * 16 ); + + } + + if ( this.useVertexTexture ) { + + this.boneTexture.needsUpdate = true; + + } + + }; + +} )(); + +THREE.Skeleton.prototype.clone = function () { + + return new THREE.Skeleton( this.bones, this.boneInverses, this.useVertexTexture ); + +}; + +// File:src/objects/SkinnedMesh.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + +THREE.SkinnedMesh = function ( geometry, material, useVertexTexture ) { + + THREE.Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = "attached"; + this.bindMatrix = new THREE.Matrix4(); + this.bindMatrixInverse = new THREE.Matrix4(); + + // init bones + + // TODO: remove bone creation as there is no reason (other than + // convenience) for THREE.SkinnedMesh to do this. + + var bones = []; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + var bone, gbone; + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + bone = new THREE.Bone( this ); + bones.push( bone ); + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + if ( gbone.parent !== - 1 && gbone.parent !== null) { + + bones[ gbone.parent ].add( bones[ b ] ); + + } else { + + this.add( bones[ b ] ); + + } + + } + + } + + this.normalizeSkinWeights(); + + this.updateMatrixWorld( true ); + this.bind( new THREE.Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld ); + +}; + + +THREE.SkinnedMesh.prototype = Object.create( THREE.Mesh.prototype ); +THREE.SkinnedMesh.prototype.constructor = THREE.SkinnedMesh; + +THREE.SkinnedMesh.prototype.bind = function( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + +}; + +THREE.SkinnedMesh.prototype.pose = function () { + + this.skeleton.pose(); + +}; + +THREE.SkinnedMesh.prototype.normalizeSkinWeights = function () { + + if ( this.geometry instanceof THREE.Geometry ) { + + for ( var i = 0; i < this.geometry.skinIndices.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + var scale = 1.0 / sw.lengthManhattan(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1 ); // this will be normalized by the shader anyway + + } + + } + + } else { + + // skinning weights assumed to be normalized for THREE.BufferGeometry + + } + +}; + +THREE.SkinnedMesh.prototype.updateMatrixWorld = function( force ) { + + THREE.Mesh.prototype.updateMatrixWorld.call( this, true ); + + if ( this.bindMode === "attached" ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === "detached" ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode ); + + } + +}; + +THREE.SkinnedMesh.prototype.clone = function() { + + return new this.constructor( this.geometry, this.material, this.useVertexTexture ).copy( this ); + +}; + +// File:src/objects/LOD.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.LOD = function () { + + THREE.Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + }, + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + } ); + +}; + + +THREE.LOD.prototype = Object.create( THREE.Object3D.prototype ); +THREE.LOD.prototype.constructor = THREE.LOD; + +THREE.LOD.prototype.addLevel = function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + +}; + +THREE.LOD.prototype.getObjectForDistance = function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + +}; + +THREE.LOD.prototype.raycast = ( function () { + + var matrixPosition = new THREE.Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + +}() ); + +THREE.LOD.prototype.update = function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + +}(); + +THREE.LOD.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + +}; + +THREE.LOD.prototype.toJSON = function ( meta ) { + + var data = THREE.Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + +}; + +// File:src/objects/Sprite.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Sprite = ( function () { + + var indices = new Uint16Array( [ 0, 1, 2, 0, 2, 3 ] ); + var vertices = new Float32Array( [ - 0.5, - 0.5, 0, 0.5, - 0.5, 0, 0.5, 0.5, 0, - 0.5, 0.5, 0 ] ); + var uvs = new Float32Array( [ 0, 0, 1, 0, 1, 1, 0, 1 ] ); + + var geometry = new THREE.BufferGeometry(); + geometry.setIndex( new THREE.BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) ); + + return function Sprite( material ) { + + THREE.Object3D.call( this ); + + this.type = 'Sprite'; + + this.geometry = geometry; + this.material = ( material !== undefined ) ? material : new THREE.SpriteMaterial(); + + }; + +} )(); + +THREE.Sprite.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Sprite.prototype.constructor = THREE.Sprite; + +THREE.Sprite.prototype.raycast = ( function () { + + var matrixPosition = new THREE.Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition ); + var guessSizeSq = this.scale.x * this.scale.y; + + if ( distanceSq > guessSizeSq ) { + + return; + + } + + intersects.push( { + + distance: Math.sqrt( distanceSq ), + point: this.position, + face: null, + object: this + + } ); + + }; + +}() ); + +THREE.Sprite.prototype.clone = function () { + + return new this.constructor( this.material ).copy( this ); + +}; + +// Backwards compatibility + +THREE.Particle = THREE.Sprite; + +// File:src/objects/LensFlare.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.LensFlare = function ( texture, size, distance, blending, color ) { + + THREE.Object3D.call( this ); + + this.lensFlares = []; + + this.positionScreen = new THREE.Vector3(); + this.customUpdateCallback = undefined; + + if ( texture !== undefined ) { + + this.add( texture, size, distance, blending, color ); + + } + +}; + +THREE.LensFlare.prototype = Object.create( THREE.Object3D.prototype ); +THREE.LensFlare.prototype.constructor = THREE.LensFlare; + + +/* + * Add: adds another flare + */ + +THREE.LensFlare.prototype.add = function ( texture, size, distance, blending, color, opacity ) { + + if ( size === undefined ) size = - 1; + if ( distance === undefined ) distance = 0; + if ( opacity === undefined ) opacity = 1; + if ( color === undefined ) color = new THREE.Color( 0xffffff ); + if ( blending === undefined ) blending = THREE.NormalBlending; + + distance = Math.min( distance, Math.max( 0, distance ) ); + + this.lensFlares.push( { + texture: texture, // THREE.Texture + size: size, // size in pixels (-1 = use texture.width) + distance: distance, // distance (0-1) from light source (0=at light source) + x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back + scale: 1, // scale + rotation: 0, // rotation + opacity: opacity, // opacity + color: color, // color + blending: blending // blending + } ); + +}; + +/* + * Update lens flares update positions on all flares based on the screen position + * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. + */ + +THREE.LensFlare.prototype.updateLensFlares = function () { + + var f, fl = this.lensFlares.length; + var flare; + var vecX = - this.positionScreen.x * 2; + var vecY = - this.positionScreen.y * 2; + + for ( f = 0; f < fl; f ++ ) { + + flare = this.lensFlares[ f ]; + + flare.x = this.positionScreen.x + vecX * flare.distance; + flare.y = this.positionScreen.y + vecY * flare.distance; + + flare.wantedRotation = flare.x * Math.PI * 0.25; + flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; + + } + +}; + +THREE.LensFlare.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + this.positionScreen.copy( source.positionScreen ); + this.customUpdateCallback = source.customUpdateCallback; + + for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { + + this.lensFlares.push( source.lensFlares[ i ] ); + + } + + return this; + +}; + +// File:src/scenes/Scene.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Scene = function () { + + THREE.Object3D.call( this ); + + this.type = 'Scene'; + + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + +}; + +THREE.Scene.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Scene.prototype.constructor = THREE.Scene; + +THREE.Scene.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + +}; + +// File:src/scenes/Fog.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Fog = function ( color, near, far ) { + + this.name = ''; + + this.color = new THREE.Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + +}; + +THREE.Fog.prototype.clone = function () { + + return new THREE.Fog( this.color.getHex(), this.near, this.far ); + +}; + +// File:src/scenes/FogExp2.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.FogExp2 = function ( color, density ) { + + this.name = ''; + + this.color = new THREE.Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + +}; + +THREE.FogExp2.prototype.clone = function () { + + return new THREE.FogExp2( this.color.getHex(), this.density ); + +}; + +// File:src/renderers/shaders/ShaderChunk.js + +THREE.ShaderChunk = {}; + +// File:src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl + +THREE.ShaderChunk[ 'alphamap_fragment'] = "#ifdef USE_ALPHAMAP\n\n diffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl + +THREE.ShaderChunk[ 'alphamap_pars_fragment'] = "#ifdef USE_ALPHAMAP\n\n uniform sampler2D alphaMap;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl + +THREE.ShaderChunk[ 'alphatest_fragment'] = "#ifdef ALPHATEST\n\n if ( diffuseColor.a < ALPHATEST ) discard;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/aomap_fragment.glsl + +THREE.ShaderChunk[ 'aomap_fragment'] = "#ifdef USE_AOMAP\n\n totalAmbientLight *= ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl + +THREE.ShaderChunk[ 'aomap_pars_fragment'] = "#ifdef USE_AOMAP\n\n uniform sampler2D aoMap;\n uniform float aoMapIntensity;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/begin_vertex.glsl + +THREE.ShaderChunk[ 'begin_vertex'] = "\nvec3 transformed = vec3( position );\n"; + +// File:src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl + +THREE.ShaderChunk[ 'beginnormal_vertex'] = "\nvec3 objectNormal = vec3( normal );\n"; + +// File:src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'bumpmap_pars_fragment'] = "#ifdef USE_BUMPMAP\n\n uniform sampler2D bumpMap;\n uniform float bumpScale;\n\n\n\n vec2 dHdxy_fwd() {\n\n vec2 dSTdx = dFdx( vUv );\n vec2 dSTdy = dFdy( vUv );\n\n float Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n return vec2( dBx, dBy );\n\n }\n\n vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\n vec3 vSigmaX = dFdx( surf_pos );\n vec3 vSigmaY = dFdy( surf_pos );\n vec3 vN = surf_norm;\n vec3 R1 = cross( vSigmaY, vN );\n vec3 R2 = cross( vN, vSigmaX );\n\n float fDet = dot( vSigmaX, R1 );\n\n vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n return normalize( abs( fDet ) * surf_norm - vGrad );\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/color_fragment.glsl + +THREE.ShaderChunk[ 'color_fragment'] = "#ifdef USE_COLOR\n\n diffuseColor.rgb *= vColor;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl + +THREE.ShaderChunk[ 'color_pars_fragment'] = "#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl + +THREE.ShaderChunk[ 'color_pars_vertex'] = "#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/color_vertex.glsl + +THREE.ShaderChunk[ 'color_vertex'] = "#ifdef USE_COLOR\n\n vColor.xyz = color.xyz;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/common.glsl + +THREE.ShaderChunk[ 'common'] = "#define PI 3.14159\n#define PI2 6.28318\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\n\nvec3 transformDirection( in vec3 normal, in mat4 matrix ) {\n\n return normalize( ( matrix * vec4( normal, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {\n\n return normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );\n\n}\n\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n float distance = dot( planeNormal, point - pointOnPlane );\n\n return - distance * planeNormal + point;\n\n}\n\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n return sign( dot( point - pointOnPlane, planeNormal ) );\n\n}\n\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n return lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n\n}\n\nfloat calcLightAttenuation( float lightDistance, float cutoffDistance, float decayExponent ) {\n\n if ( decayExponent > 0.0 ) {\n\n return pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n }\n\n return 1.0;\n\n}\n\nvec3 F_Schlick( in vec3 specularColor, in float dotLH ) {\n\n\n float fresnel = exp2( ( -5.55437 * dotLH - 6.98316 ) * dotLH );\n\n return ( 1.0 - specularColor ) * fresnel + specularColor;\n\n}\n\nfloat G_BlinnPhong_Implicit( /* in float dotNL, in float dotNV */ ) {\n\n\n return 0.25;\n\n}\n\nfloat D_BlinnPhong( in float shininess, in float dotNH ) {\n\n\n return ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( in vec3 specularColor, in float shininess, in vec3 normal, in vec3 lightDir, in vec3 viewDir ) {\n\n vec3 halfDir = normalize( lightDir + viewDir );\n\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotLH = saturate( dot( lightDir, halfDir ) );\n\n vec3 F = F_Schlick( specularColor, dotLH );\n\n float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n float D = D_BlinnPhong( shininess, dotNH );\n\n return F * G * D;\n\n}\n\nvec3 inputToLinear( in vec3 a ) {\n\n #ifdef GAMMA_INPUT\n\n return pow( a, vec3( float( GAMMA_FACTOR ) ) );\n\n #else\n\n return a;\n\n #endif\n\n}\n\nvec3 linearToOutput( in vec3 a ) {\n\n #ifdef GAMMA_OUTPUT\n\n return pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );\n\n #else\n\n return a;\n\n #endif\n\n}\n"; + +// File:src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl + +THREE.ShaderChunk[ 'defaultnormal_vertex'] = "#ifdef FLIP_SIDED\n\n objectNormal = -objectNormal;\n\n#endif\n\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; + +// File:src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl + +THREE.ShaderChunk[ 'displacementmap_vertex'] = "#ifdef USE_DISPLACEMENTMAP\n\n transformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl + +THREE.ShaderChunk[ 'displacementmap_pars_vertex'] = "#ifdef USE_DISPLACEMENTMAP\n\n uniform sampler2D displacementMap;\n uniform float displacementScale;\n uniform float displacementBias;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl + +THREE.ShaderChunk[ 'emissivemap_fragment'] = "#ifdef USE_EMISSIVEMAP\n\n vec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n emissiveColor.rgb = inputToLinear( emissiveColor.rgb );\n\n totalEmissiveLight *= emissiveColor.rgb;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl + +THREE.ShaderChunk[ 'emissivemap_pars_fragment'] = "#ifdef USE_EMISSIVEMAP\n\n uniform sampler2D emissiveMap;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/envmap_fragment.glsl + +THREE.ShaderChunk[ 'envmap_fragment'] = "#ifdef USE_ENVMAP\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n #else\n\n vec3 reflectVec = vReflect;\n\n #endif\n\n #ifdef DOUBLE_SIDED\n float flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n #else\n float flipNormal = 1.0;\n #endif\n\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n #elif defined( ENVMAP_TYPE_EQUIREC )\n vec2 sampleUV;\n sampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n sampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n vec4 envColor = texture2D( envMap, sampleUV );\n\n #elif defined( ENVMAP_TYPE_SPHERE )\n vec3 reflectView = flipNormal * normalize((viewMatrix * vec4( reflectVec, 0.0 )).xyz + vec3(0.0,0.0,1.0));\n vec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n #endif\n\n envColor.xyz = inputToLinear( envColor.xyz );\n\n #ifdef ENVMAP_BLENDING_MULTIPLY\n\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_MIX )\n\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_ADD )\n\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'envmap_pars_fragment'] = "#ifdef USE_ENVMAP\n\n uniform float reflectivity;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n uniform float flipEnvMap;\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n uniform float refractionRatio;\n\n #else\n\n varying vec3 vReflect;\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl + +THREE.ShaderChunk[ 'envmap_pars_vertex'] = "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n varying vec3 vReflect;\n\n uniform float refractionRatio;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/envmap_vertex.glsl + +THREE.ShaderChunk[ 'envmap_vertex'] = "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vReflect = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/fog_fragment.glsl + +THREE.ShaderChunk[ 'fog_fragment'] = "#ifdef USE_FOG\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n float depth = gl_FragDepthEXT / gl_FragCoord.w;\n\n #else\n\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n\n #endif\n\n #ifdef FOG_EXP2\n\n float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\n #else\n\n float fogFactor = smoothstep( fogNear, fogFar, depth );\n\n #endif\n \n outgoingLight = mix( outgoingLight, fogColor, fogFactor );\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl + +THREE.ShaderChunk[ 'fog_pars_fragment'] = "#ifdef USE_FOG\n\n uniform vec3 fogColor;\n\n #ifdef FOG_EXP2\n\n uniform float fogDensity;\n\n #else\n\n uniform float fogNear;\n uniform float fogFar;\n #endif\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/hemilight_fragment.glsl + +THREE.ShaderChunk[ 'hemilight_fragment'] = "#if MAX_HEMI_LIGHTS > 0\n\n for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lightDir = hemisphereLightDirection[ i ];\n\n float dotProduct = dot( normal, lightDir );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vec3 lightColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n totalAmbientLight += lightColor;\n\n }\n\n#endif\n\n"; + +// File:src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl + +THREE.ShaderChunk[ 'lightmap_fragment'] = "#ifdef USE_LIGHTMAP\n\n totalAmbientLight += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'lightmap_pars_fragment'] = "#ifdef USE_LIGHTMAP\n\n uniform sampler2D lightMap;\n uniform float lightMapIntensity;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/lights_lambert_pars_vertex.glsl + +THREE.ShaderChunk[ 'lights_lambert_pars_vertex'] = "#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl + +THREE.ShaderChunk[ 'lights_lambert_vertex'] = "vLightFront = vec3( 0.0 );\n\n#ifdef DOUBLE_SIDED\n\n vLightBack = vec3( 0.0 );\n\n#endif\n\nvec3 normal = normalize( transformedNormal );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec3 lightColor = pointLightColor[ i ];\n\n vec3 lVector = pointLightPosition[ i ] - mvPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * attenuation * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n #endif\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec3 lightColor = spotLightColor[ i ];\n\n vec3 lightPosition = spotLightPosition[ i ];\n vec3 lVector = lightPosition - mvPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n attenuation *= spotEffect;\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * attenuation * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n #endif\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 lightColor = directionalLightColor[ i ];\n\n vec3 lightDir = directionalLightDirection[ i ];\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * saturate( - dotProduct );\n\n #endif\n\n }\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lightDir = hemisphereLightDirection[ i ];\n\n\n float dotProduct = dot( normal, lightDir );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n #ifdef DOUBLE_SIDED\n\n float hemiDiffuseWeightBack = - 0.5 * dotProduct + 0.5;\n\n vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n\n #endif\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl + +THREE.ShaderChunk[ 'lights_phong_fragment'] = "vec3 viewDir = normalize( vViewPosition );\n\nvec3 totalDiffuseLight = vec3( 0.0 );\nvec3 totalSpecularLight = vec3( 0.0 );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec3 lightColor = pointLightColor[ i ];\n\n vec3 lightPosition = pointLightPosition[ i ];\n vec3 lVector = lightPosition + vViewPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec3 lightColor = spotLightColor[ i ];\n\n vec3 lightPosition = spotLightPosition[ i ];\n vec3 lVector = lightPosition + vViewPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n attenuation *= spotEffect;\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 lightColor = directionalLightColor[ i ];\n\n vec3 lightDir = directionalLightDirection[ i ];\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * cosineTerm;\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl + +THREE.ShaderChunk[ 'lights_phong_pars_fragment'] = "uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\nvarying vec3 vViewPosition;\n\n#ifndef FLAT_SHADED\n\n varying vec3 vNormal;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_phong_pars_vertex.glsl + +THREE.ShaderChunk[ 'lights_phong_pars_vertex'] = "#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_phong_vertex.glsl + +THREE.ShaderChunk[ 'lights_phong_vertex'] = "#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n vWorldPosition = worldPosition.xyz;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl + +THREE.ShaderChunk[ 'linear_to_gamma_fragment'] = "\n outgoingLight = linearToOutput( outgoingLight );\n"; + +// File:src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl + +THREE.ShaderChunk[ 'logdepthbuf_fragment'] = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\n gl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl + +THREE.ShaderChunk[ 'logdepthbuf_pars_fragment'] = "#ifdef USE_LOGDEPTHBUF\n\n uniform float logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl + +THREE.ShaderChunk[ 'logdepthbuf_pars_vertex'] = "#ifdef USE_LOGDEPTHBUF\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n uniform float logDepthBufFC;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl + +THREE.ShaderChunk[ 'logdepthbuf_vertex'] = "#ifdef USE_LOGDEPTHBUF\n\n gl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n vFragDepth = 1.0 + gl_Position.w;\n\n#else\n\n gl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\n #endif\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/map_fragment.glsl + +THREE.ShaderChunk[ 'map_fragment'] = "#ifdef USE_MAP\n\n vec4 texelColor = texture2D( map, vUv );\n\n texelColor.xyz = inputToLinear( texelColor.xyz );\n\n diffuseColor *= texelColor;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl + +THREE.ShaderChunk[ 'map_pars_fragment'] = "#ifdef USE_MAP\n\n uniform sampler2D map;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl + +THREE.ShaderChunk[ 'map_particle_fragment'] = "#ifdef USE_MAP\n\n diffuseColor *= texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl + +THREE.ShaderChunk[ 'map_particle_pars_fragment'] = "#ifdef USE_MAP\n\n uniform vec4 offsetRepeat;\n uniform sampler2D map;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl + +THREE.ShaderChunk[ 'morphnormal_vertex'] = "#ifdef USE_MORPHNORMALS\n\n objectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n objectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n objectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n objectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl + +THREE.ShaderChunk[ 'morphtarget_pars_vertex'] = "#ifdef USE_MORPHTARGETS\n\n #ifndef USE_MORPHNORMALS\n\n uniform float morphTargetInfluences[ 8 ];\n\n #else\n\n uniform float morphTargetInfluences[ 4 ];\n\n #endif\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl + +THREE.ShaderChunk[ 'morphtarget_vertex'] = "#ifdef USE_MORPHTARGETS\n\n transformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n transformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n transformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n transformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\n #ifndef USE_MORPHNORMALS\n\n transformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n transformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n transformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n transformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/normal_phong_fragment.glsl + +THREE.ShaderChunk[ 'normal_phong_fragment'] = "#ifndef FLAT_SHADED\n\n vec3 normal = normalize( vNormal );\n\n #ifdef DOUBLE_SIDED\n\n normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n\n #endif\n\n#else\n\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n\n#endif\n\n#ifdef USE_NORMALMAP\n\n normal = perturbNormal2Arb( -vViewPosition, normal );\n\n#elif defined( USE_BUMPMAP )\n\n normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n\n#endif\n\n"; + +// File:src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'normalmap_pars_fragment'] = "#ifdef USE_NORMALMAP\n\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n\n\n vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\n vec3 q0 = dFdx( eye_pos.xyz );\n vec3 q1 = dFdy( eye_pos.xyz );\n vec2 st0 = dFdx( vUv.st );\n vec2 st1 = dFdy( vUv.st );\n\n vec3 S = normalize( q0 * st1.t - q1 * st0.t );\n vec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n vec3 N = normalize( surf_norm );\n\n vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n mapN.xy = normalScale * mapN.xy;\n mat3 tsn = mat3( S, T, N );\n return normalize( tsn * mapN );\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/project_vertex.glsl + +THREE.ShaderChunk[ 'project_vertex'] = "#ifdef USE_SKINNING\n\n vec4 mvPosition = modelViewMatrix * skinned;\n\n#else\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\n#endif\n\ngl_Position = projectionMatrix * mvPosition;\n"; + +// File:src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl + +THREE.ShaderChunk[ 'shadowmap_fragment'] = "#ifdef USE_SHADOWMAP\n\n for ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n float texelSizeY = 1.0 / shadowMapSize[ i ].y;\n\n float shadow = 0.0;\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n bool isPointLight = shadowDarkness[ i ] < 0.0;\n\n if ( isPointLight ) {\n\n float realShadowDarkness = abs( shadowDarkness[ i ] );\n\n vec3 lightToPosition = vShadowCoord[ i ].xyz;\n\n #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n vec3 bd3D = normalize( lightToPosition );\n float dp = length( lightToPosition );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n\n #if defined( SHADOWMAP_TYPE_PCF )\n const float Dr = 1.25;\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n const float Dr = 2.25;\n #endif\n\n float os = Dr * 2.0 * texelSizeY;\n\n const vec3 Gsd = vec3( - 1, 0, 1 );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n shadow *= realShadowDarkness * ( 1.0 / 21.0 );\n\n #else \n vec3 bd3D = normalize( lightToPosition );\n float dp = length( lightToPosition );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n shadow *= realShadowDarkness;\n\n #endif\n\n } else {\n\n#endif \n float texelSizeX = 1.0 / shadowMapSize[ i ].x;\n\n vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\n\n\n bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n bool inFrustum = all( inFrustumVec );\n\n bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n bool frustumTest = all( frustumTestVec );\n\n if ( frustumTest ) {\n\n #if defined( SHADOWMAP_TYPE_PCF )\n\n\n /*\n for ( float y = -1.25; y <= 1.25; y += 1.25 )\n for ( float x = -1.25; x <= 1.25; x += 1.25 ) {\n vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n if ( fDepth < shadowCoord.z )\n shadow += 1.0;\n }\n shadow /= 9.0;\n */\n\n shadowCoord.z += shadowBias[ i ];\n\n const float ShadowDelta = 1.0 / 9.0;\n\n float xPixelOffset = texelSizeX;\n float yPixelOffset = texelSizeY;\n\n float dx0 = - 1.25 * xPixelOffset;\n float dy0 = - 1.25 * yPixelOffset;\n float dx1 = 1.25 * xPixelOffset;\n float dy1 = 1.25 * yPixelOffset;\n\n float fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n shadow *= shadowDarkness[ i ];\n\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\n shadowCoord.z += shadowBias[ i ];\n\n float xPixelOffset = texelSizeX;\n float yPixelOffset = texelSizeY;\n\n float dx0 = - 1.0 * xPixelOffset;\n float dy0 = - 1.0 * yPixelOffset;\n float dx1 = 1.0 * xPixelOffset;\n float dy1 = 1.0 * yPixelOffset;\n\n mat3 shadowKernel;\n mat3 depthKernel;\n\n depthKernel[ 0 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n depthKernel[ 0 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n depthKernel[ 0 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n depthKernel[ 1 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n depthKernel[ 1 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n depthKernel[ 1 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n depthKernel[ 2 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n depthKernel[ 2 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n depthKernel[ 2 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\n vec3 shadowZ = vec3( shadowCoord.z );\n shadowKernel[ 0 ] = vec3( lessThan( depthKernel[ 0 ], shadowZ ) );\n shadowKernel[ 0 ] *= vec3( 0.25 );\n\n shadowKernel[ 1 ] = vec3( lessThan( depthKernel[ 1 ], shadowZ ) );\n shadowKernel[ 1 ] *= vec3( 0.25 );\n\n shadowKernel[ 2 ] = vec3( lessThan( depthKernel[ 2 ], shadowZ ) );\n shadowKernel[ 2 ] *= vec3( 0.25 );\n\n vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[ i ].xy );\n\n shadowKernel[ 0 ] = mix( shadowKernel[ 1 ], shadowKernel[ 0 ], fractionalCoord.x );\n shadowKernel[ 1 ] = mix( shadowKernel[ 2 ], shadowKernel[ 1 ], fractionalCoord.x );\n\n vec4 shadowValues;\n shadowValues.x = mix( shadowKernel[ 0 ][ 1 ], shadowKernel[ 0 ][ 0 ], fractionalCoord.y );\n shadowValues.y = mix( shadowKernel[ 0 ][ 2 ], shadowKernel[ 0 ][ 1 ], fractionalCoord.y );\n shadowValues.z = mix( shadowKernel[ 1 ][ 1 ], shadowKernel[ 1 ][ 0 ], fractionalCoord.y );\n shadowValues.w = mix( shadowKernel[ 1 ][ 2 ], shadowKernel[ 1 ][ 1 ], fractionalCoord.y );\n\n shadow = dot( shadowValues, vec4( 1.0 ) ) * shadowDarkness[ i ];\n\n #else \n shadowCoord.z += shadowBias[ i ];\n\n vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n\n if ( fDepth < shadowCoord.z )\n shadow = shadowDarkness[ i ];\n\n #endif\n\n }\n\n#ifdef SHADOWMAP_DEBUG\n\n if ( inFrustum ) {\n\n if ( i == 0 ) {\n\n outgoingLight *= vec3( 1.0, 0.5, 0.0 );\n\n } else if ( i == 1 ) {\n\n outgoingLight *= vec3( 0.0, 1.0, 0.8 );\n\n } else {\n\n outgoingLight *= vec3( 0.0, 0.5, 1.0 );\n\n }\n\n }\n\n#endif\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n }\n\n#endif\n\n shadowMask = shadowMask * vec3( 1.0 - shadow );\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'shadowmap_pars_fragment'] = "#ifdef USE_SHADOWMAP\n\n uniform sampler2D shadowMap[ MAX_SHADOWS ];\n uniform vec2 shadowMapSize[ MAX_SHADOWS ];\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform float shadowBias[ MAX_SHADOWS ];\n\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n float unpackDepth( const in vec4 rgba_depth ) {\n\n const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n float depth = dot( rgba_depth, bit_shift );\n return depth;\n\n }\n\n #if defined(POINT_LIGHT_SHADOWS)\n\n\n void adjustShadowValue1K( const float testDepth, const vec4 textureData, const float bias, inout float shadowValue ) {\n\n const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n if ( testDepth >= dot( textureData, bitSh ) * 1000.0 + bias )\n shadowValue += 1.0;\n\n }\n\n\n vec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\n vec3 absV = abs( v );\n\n\n float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n absV *= scaleToCube;\n\n\n v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\n\n vec2 planar = v.xy;\n\n float almostATexel = 1.5 * texelSizeY;\n float almostOne = 1.0 - almostATexel;\n\n if ( absV.z >= almostOne ) {\n\n if ( v.z > 0.0 )\n planar.x = 4.0 - v.x;\n\n } else if ( absV.x >= almostOne ) {\n\n float signX = sign( v.x );\n planar.x = v.z * signX + 2.0 * signX;\n\n } else if ( absV.y >= almostOne ) {\n\n float signY = sign( v.y );\n planar.x = v.x + 2.0 * signY + 2.0;\n planar.y = v.z * signY - 2.0;\n\n }\n\n\n return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n }\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl + +THREE.ShaderChunk[ 'shadowmap_pars_vertex'] = "#ifdef USE_SHADOWMAP\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform mat4 shadowMatrix[ MAX_SHADOWS ];\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl + +THREE.ShaderChunk[ 'shadowmap_vertex'] = "#ifdef USE_SHADOWMAP\n\n for ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n\n }\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl + +THREE.ShaderChunk[ 'skinbase_vertex'] = "#ifdef USE_SKINNING\n\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl + +THREE.ShaderChunk[ 'skinning_pars_vertex'] = "#ifdef USE_SKINNING\n\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n\n #ifdef BONE_TEXTURE\n\n uniform sampler2D boneTexture;\n uniform int boneTextureWidth;\n uniform int boneTextureHeight;\n\n mat4 getBoneMatrix( const in float i ) {\n\n float j = i * 4.0;\n float x = mod( j, float( boneTextureWidth ) );\n float y = floor( j / float( boneTextureWidth ) );\n\n float dx = 1.0 / float( boneTextureWidth );\n float dy = 1.0 / float( boneTextureHeight );\n\n y = dy * ( y + 0.5 );\n\n vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n mat4 bone = mat4( v1, v2, v3, v4 );\n\n return bone;\n\n }\n\n #else\n\n uniform mat4 boneGlobalMatrices[ MAX_BONES ];\n\n mat4 getBoneMatrix( const in float i ) {\n\n mat4 bone = boneGlobalMatrices[ int(i) ];\n return bone;\n\n }\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/skinning_vertex.glsl + +THREE.ShaderChunk[ 'skinning_vertex'] = "#ifdef USE_SKINNING\n\n vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\n vec4 skinned = vec4( 0.0 );\n skinned += boneMatX * skinVertex * skinWeight.x;\n skinned += boneMatY * skinVertex * skinWeight.y;\n skinned += boneMatZ * skinVertex * skinWeight.z;\n skinned += boneMatW * skinVertex * skinWeight.w;\n skinned = bindMatrixInverse * skinned;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl + +THREE.ShaderChunk[ 'skinnormal_vertex'] = "#ifdef USE_SKINNING\n\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl + +THREE.ShaderChunk[ 'specularmap_fragment'] = "float specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n vec4 texelSpecular = texture2D( specularMap, vUv );\n specularStrength = texelSpecular.r;\n\n#else\n\n specularStrength = 1.0;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'specularmap_pars_fragment'] = "#ifdef USE_SPECULARMAP\n\n uniform sampler2D specularMap;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl + +THREE.ShaderChunk[ 'uv2_pars_fragment'] = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n varying vec2 vUv2;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl + +THREE.ShaderChunk[ 'uv2_pars_vertex'] = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n attribute vec2 uv2;\n varying vec2 vUv2;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv2_vertex.glsl + +THREE.ShaderChunk[ 'uv2_vertex'] = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n vUv2 = uv2;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl + +THREE.ShaderChunk[ 'uv_pars_fragment'] = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n varying vec2 vUv;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl + +THREE.ShaderChunk[ 'uv_pars_vertex'] = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n varying vec2 vUv;\n uniform vec4 offsetRepeat;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/uv_vertex.glsl + +THREE.ShaderChunk[ 'uv_vertex'] = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n vUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl + +THREE.ShaderChunk[ 'worldpos_vertex'] = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\n #ifdef USE_SKINNING\n\n vec4 worldPosition = modelMatrix * skinned;\n\n #else\n\n vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/UniformsUtils.js + +/** + * Uniform Utilities + */ + +THREE.UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src instanceof THREE.Color || + parameter_src instanceof THREE.Vector2 || + parameter_src instanceof THREE.Vector3 || + parameter_src instanceof THREE.Vector4 || + parameter_src instanceof THREE.Matrix3 || + parameter_src instanceof THREE.Matrix4 || + parameter_src instanceof THREE.Texture ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + +}; + +// File:src/renderers/shaders/UniformsLib.js + +/** + * Uniforms library for shared webgl shaders + */ + +THREE.UniformsLib = { + + common: { + + "diffuse" : { type: "c", value: new THREE.Color( 0xeeeeee ) }, + "opacity" : { type: "f", value: 1.0 }, + + "map" : { type: "t", value: null }, + "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) }, + + "specularMap" : { type: "t", value: null }, + "alphaMap" : { type: "t", value: null }, + + "envMap" : { type: "t", value: null }, + "flipEnvMap" : { type: "f", value: - 1 }, + "reflectivity" : { type: "f", value: 1.0 }, + "refractionRatio" : { type: "f", value: 0.98 } + + }, + + aomap: { + + "aoMap" : { type: "t", value: null }, + "aoMapIntensity" : { type: "f", value: 1 }, + + }, + + lightmap: { + + "lightMap" : { type: "t", value: null }, + "lightMapIntensity" : { type: "f", value: 1 }, + + }, + + emissivemap: { + + "emissiveMap" : { type: "t", value: null }, + + }, + + bumpmap: { + + "bumpMap" : { type: "t", value: null }, + "bumpScale" : { type: "f", value: 1 } + + }, + + normalmap: { + + "normalMap" : { type: "t", value: null }, + "normalScale" : { type: "v2", value: new THREE.Vector2( 1, 1 ) } + + }, + + displacementmap: { + + "displacementMap" : { type: "t", value: null }, + "displacementScale" : { type: "f", value: 1 }, + "displacementBias" : { type: "f", value: 0 } + + }, + + fog : { + + "fogDensity" : { type: "f", value: 0.00025 }, + "fogNear" : { type: "f", value: 1 }, + "fogFar" : { type: "f", value: 2000 }, + "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) } + + }, + + lights: { + + "ambientLightColor" : { type: "fv", value: [] }, + + "directionalLightDirection" : { type: "fv", value: [] }, + "directionalLightColor" : { type: "fv", value: [] }, + + "hemisphereLightDirection" : { type: "fv", value: [] }, + "hemisphereLightSkyColor" : { type: "fv", value: [] }, + "hemisphereLightGroundColor" : { type: "fv", value: [] }, + + "pointLightColor" : { type: "fv", value: [] }, + "pointLightPosition" : { type: "fv", value: [] }, + "pointLightDistance" : { type: "fv1", value: [] }, + "pointLightDecay" : { type: "fv1", value: [] }, + + "spotLightColor" : { type: "fv", value: [] }, + "spotLightPosition" : { type: "fv", value: [] }, + "spotLightDirection" : { type: "fv", value: [] }, + "spotLightDistance" : { type: "fv1", value: [] }, + "spotLightAngleCos" : { type: "fv1", value: [] }, + "spotLightExponent" : { type: "fv1", value: [] }, + "spotLightDecay" : { type: "fv1", value: [] } + + }, + + points: { + + "psColor" : { type: "c", value: new THREE.Color( 0xeeeeee ) }, + "opacity" : { type: "f", value: 1.0 }, + "size" : { type: "f", value: 1.0 }, + "scale" : { type: "f", value: 1.0 }, + "map" : { type: "t", value: null }, + "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) }, + + "fogDensity" : { type: "f", value: 0.00025 }, + "fogNear" : { type: "f", value: 1 }, + "fogFar" : { type: "f", value: 2000 }, + "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) } + + }, + + shadowmap: { + + "shadowMap": { type: "tv", value: [] }, + "shadowMapSize": { type: "v2v", value: [] }, + + "shadowBias" : { type: "fv1", value: [] }, + "shadowDarkness": { type: "fv1", value: [] }, + + "shadowMatrix" : { type: "m4v", value: [] } + + } + +}; + +// File:src/renderers/shaders/ShaderLib.js + +/** + * Webgl Shader Library for three.js + * + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + +THREE.ShaderLib = { + + 'basic': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "common" ], + THREE.UniformsLib[ "aomap" ], + THREE.UniformsLib[ "fog" ], + THREE.UniformsLib[ "shadowmap" ] + + ] ), + + vertexShader: [ + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "uv_pars_vertex" ], + THREE.ShaderChunk[ "uv2_pars_vertex" ], + THREE.ShaderChunk[ "envmap_pars_vertex" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + THREE.ShaderChunk[ "shadowmap_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "uv_vertex" ], + THREE.ShaderChunk[ "uv2_vertex" ], + THREE.ShaderChunk[ "color_vertex" ], + THREE.ShaderChunk[ "skinbase_vertex" ], + + " #ifdef USE_ENVMAP", + + THREE.ShaderChunk[ "beginnormal_vertex" ], + THREE.ShaderChunk[ "morphnormal_vertex" ], + THREE.ShaderChunk[ "skinnormal_vertex" ], + THREE.ShaderChunk[ "defaultnormal_vertex" ], + + " #endif", + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + THREE.ShaderChunk[ "worldpos_vertex" ], + THREE.ShaderChunk[ "envmap_vertex" ], + THREE.ShaderChunk[ "shadowmap_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 diffuse;", + "uniform float opacity;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "uv_pars_fragment" ], + THREE.ShaderChunk[ "uv2_pars_fragment" ], + THREE.ShaderChunk[ "map_pars_fragment" ], + THREE.ShaderChunk[ "alphamap_pars_fragment" ], + THREE.ShaderChunk[ "aomap_pars_fragment" ], + THREE.ShaderChunk[ "envmap_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "specularmap_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vec4( diffuse, opacity );", + " vec3 totalAmbientLight = vec3( 1.0 );", // hardwired + " vec3 shadowMask = vec3( 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "map_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + THREE.ShaderChunk[ "alphamap_fragment" ], + THREE.ShaderChunk[ "alphatest_fragment" ], + THREE.ShaderChunk[ "specularmap_fragment" ], + THREE.ShaderChunk[ "aomap_fragment" ], + THREE.ShaderChunk[ "shadowmap_fragment" ], + + " outgoingLight = diffuseColor.rgb * totalAmbientLight * shadowMask;", + + THREE.ShaderChunk[ "envmap_fragment" ], + + THREE.ShaderChunk[ "linear_to_gamma_fragment" ], + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'lambert': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "common" ], + THREE.UniformsLib[ "fog" ], + THREE.UniformsLib[ "lights" ], + THREE.UniformsLib[ "shadowmap" ], + + { + "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) } + } + + ] ), + + vertexShader: [ + + "#define LAMBERT", + + "varying vec3 vLightFront;", + + "#ifdef DOUBLE_SIDED", + + " varying vec3 vLightBack;", + + "#endif", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "uv_pars_vertex" ], + THREE.ShaderChunk[ "uv2_pars_vertex" ], + THREE.ShaderChunk[ "envmap_pars_vertex" ], + THREE.ShaderChunk[ "lights_lambert_pars_vertex" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + THREE.ShaderChunk[ "shadowmap_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "uv_vertex" ], + THREE.ShaderChunk[ "uv2_vertex" ], + THREE.ShaderChunk[ "color_vertex" ], + + THREE.ShaderChunk[ "beginnormal_vertex" ], + THREE.ShaderChunk[ "morphnormal_vertex" ], + THREE.ShaderChunk[ "skinbase_vertex" ], + THREE.ShaderChunk[ "skinnormal_vertex" ], + THREE.ShaderChunk[ "defaultnormal_vertex" ], + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + THREE.ShaderChunk[ "worldpos_vertex" ], + THREE.ShaderChunk[ "envmap_vertex" ], + THREE.ShaderChunk[ "lights_lambert_vertex" ], + THREE.ShaderChunk[ "shadowmap_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 diffuse;", + "uniform vec3 emissive;", + "uniform float opacity;", + + "uniform vec3 ambientLightColor;", + + "varying vec3 vLightFront;", + + "#ifdef DOUBLE_SIDED", + + " varying vec3 vLightBack;", + + "#endif", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "uv_pars_fragment" ], + THREE.ShaderChunk[ "uv2_pars_fragment" ], + THREE.ShaderChunk[ "map_pars_fragment" ], + THREE.ShaderChunk[ "alphamap_pars_fragment" ], + THREE.ShaderChunk[ "envmap_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "specularmap_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " vec3 outgoingLight = vec3( 0.0 );", // outgoing light does not have an alpha, the surface does + " vec4 diffuseColor = vec4( diffuse, opacity );", + " vec3 totalAmbientLight = ambientLightColor;", + " vec3 shadowMask = vec3( 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "map_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + THREE.ShaderChunk[ "alphamap_fragment" ], + THREE.ShaderChunk[ "alphatest_fragment" ], + THREE.ShaderChunk[ "specularmap_fragment" ], + THREE.ShaderChunk[ "shadowmap_fragment" ], + + " #ifdef DOUBLE_SIDED", + + " if ( gl_FrontFacing )", + " outgoingLight += diffuseColor.rgb * ( vLightFront * shadowMask + totalAmbientLight ) + emissive;", + " else", + " outgoingLight += diffuseColor.rgb * ( vLightBack * shadowMask + totalAmbientLight ) + emissive;", + + " #else", + + " outgoingLight += diffuseColor.rgb * ( vLightFront * shadowMask + totalAmbientLight ) + emissive;", + + " #endif", + + THREE.ShaderChunk[ "envmap_fragment" ], + + THREE.ShaderChunk[ "linear_to_gamma_fragment" ], + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'phong': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "common" ], + THREE.UniformsLib[ "aomap" ], + THREE.UniformsLib[ "lightmap" ], + THREE.UniformsLib[ "emissivemap" ], + THREE.UniformsLib[ "bumpmap" ], + THREE.UniformsLib[ "normalmap" ], + THREE.UniformsLib[ "displacementmap" ], + THREE.UniformsLib[ "fog" ], + THREE.UniformsLib[ "lights" ], + THREE.UniformsLib[ "shadowmap" ], + + { + "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) }, + "specular" : { type: "c", value: new THREE.Color( 0x111111 ) }, + "shininess": { type: "f", value: 30 } + } + + ] ), + + vertexShader: [ + + "#define PHONG", + + "varying vec3 vViewPosition;", + + "#ifndef FLAT_SHADED", + + " varying vec3 vNormal;", + + "#endif", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "uv_pars_vertex" ], + THREE.ShaderChunk[ "uv2_pars_vertex" ], + THREE.ShaderChunk[ "displacementmap_pars_vertex" ], + THREE.ShaderChunk[ "envmap_pars_vertex" ], + THREE.ShaderChunk[ "lights_phong_pars_vertex" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + THREE.ShaderChunk[ "shadowmap_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "uv_vertex" ], + THREE.ShaderChunk[ "uv2_vertex" ], + THREE.ShaderChunk[ "color_vertex" ], + + THREE.ShaderChunk[ "beginnormal_vertex" ], + THREE.ShaderChunk[ "morphnormal_vertex" ], + THREE.ShaderChunk[ "skinbase_vertex" ], + THREE.ShaderChunk[ "skinnormal_vertex" ], + THREE.ShaderChunk[ "defaultnormal_vertex" ], + + "#ifndef FLAT_SHADED", // Normal computed with derivatives when FLAT_SHADED + + " vNormal = normalize( transformedNormal );", + + "#endif", + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "displacementmap_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + " vViewPosition = - mvPosition.xyz;", + + THREE.ShaderChunk[ "worldpos_vertex" ], + THREE.ShaderChunk[ "envmap_vertex" ], + THREE.ShaderChunk[ "lights_phong_vertex" ], + THREE.ShaderChunk[ "shadowmap_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "#define PHONG", + + "uniform vec3 diffuse;", + "uniform vec3 emissive;", + "uniform vec3 specular;", + "uniform float shininess;", + "uniform float opacity;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "uv_pars_fragment" ], + THREE.ShaderChunk[ "uv2_pars_fragment" ], + THREE.ShaderChunk[ "map_pars_fragment" ], + THREE.ShaderChunk[ "alphamap_pars_fragment" ], + THREE.ShaderChunk[ "aomap_pars_fragment" ], + THREE.ShaderChunk[ "lightmap_pars_fragment" ], + THREE.ShaderChunk[ "emissivemap_pars_fragment" ], + THREE.ShaderChunk[ "envmap_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "lights_phong_pars_fragment" ], + THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "bumpmap_pars_fragment" ], + THREE.ShaderChunk[ "normalmap_pars_fragment" ], + THREE.ShaderChunk[ "specularmap_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vec4( diffuse, opacity );", + " vec3 totalAmbientLight = ambientLightColor;", + " vec3 totalEmissiveLight = emissive;", + " vec3 shadowMask = vec3( 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "map_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + THREE.ShaderChunk[ "alphamap_fragment" ], + THREE.ShaderChunk[ "alphatest_fragment" ], + THREE.ShaderChunk[ "specularmap_fragment" ], + THREE.ShaderChunk[ "normal_phong_fragment" ], + THREE.ShaderChunk[ "lightmap_fragment" ], + THREE.ShaderChunk[ "hemilight_fragment" ], + THREE.ShaderChunk[ "aomap_fragment" ], + THREE.ShaderChunk[ "emissivemap_fragment" ], + + THREE.ShaderChunk[ "lights_phong_fragment" ], + THREE.ShaderChunk[ "shadowmap_fragment" ], + + "totalDiffuseLight *= shadowMask;", + "totalSpecularLight *= shadowMask;", + + "#ifdef METAL", + + " outgoingLight += diffuseColor.rgb * ( totalDiffuseLight + totalAmbientLight ) * specular + totalSpecularLight + totalEmissiveLight;", + + "#else", + + " outgoingLight += diffuseColor.rgb * ( totalDiffuseLight + totalAmbientLight ) + totalSpecularLight + totalEmissiveLight;", + + "#endif", + + THREE.ShaderChunk[ "envmap_fragment" ], + + THREE.ShaderChunk[ "linear_to_gamma_fragment" ], + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'points': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "points" ], + THREE.UniformsLib[ "shadowmap" ] + + ] ), + + vertexShader: [ + + "uniform float size;", + "uniform float scale;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "shadowmap_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "color_vertex" ], + + " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", + + " #ifdef USE_SIZEATTENUATION", + " gl_PointSize = size * ( scale / length( mvPosition.xyz ) );", + " #else", + " gl_PointSize = size;", + " #endif", + + " gl_Position = projectionMatrix * mvPosition;", + + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + THREE.ShaderChunk[ "worldpos_vertex" ], + THREE.ShaderChunk[ "shadowmap_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 psColor;", + "uniform float opacity;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "map_particle_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vec4( psColor, opacity );", + " vec3 shadowMask = vec3( 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "map_particle_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + THREE.ShaderChunk[ "alphatest_fragment" ], + THREE.ShaderChunk[ "shadowmap_fragment" ], + + " outgoingLight = diffuseColor.rgb * shadowMask;", + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'dashed': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "common" ], + THREE.UniformsLib[ "fog" ], + + { + "scale" : { type: "f", value: 1 }, + "dashSize" : { type: "f", value: 1 }, + "totalSize": { type: "f", value: 2 } + } + + ] ), + + vertexShader: [ + + "uniform float scale;", + "attribute float lineDistance;", + + "varying float vLineDistance;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "color_vertex" ], + + " vLineDistance = scale * lineDistance;", + + " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", + " gl_Position = projectionMatrix * mvPosition;", + + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 diffuse;", + "uniform float opacity;", + + "uniform float dashSize;", + "uniform float totalSize;", + + "varying float vLineDistance;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " if ( mod( vLineDistance, totalSize ) > dashSize ) {", + + " discard;", + + " }", + + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vec4( diffuse, opacity );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + + " outgoingLight = diffuseColor.rgb;", // simple shader + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'depth': { + + uniforms: { + + "mNear": { type: "f", value: 1.0 }, + "mFar" : { type: "f", value: 2000.0 }, + "opacity" : { type: "f", value: 1.0 } + + }, + + vertexShader: [ + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform float mNear;", + "uniform float mFar;", + "uniform float opacity;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + " #ifdef USE_LOGDEPTHBUF_EXT", + + " float depth = gl_FragDepthEXT / gl_FragCoord.w;", + + " #else", + + " float depth = gl_FragCoord.z / gl_FragCoord.w;", + + " #endif", + + " float color = 1.0 - smoothstep( mNear, mFar, depth );", + " gl_FragColor = vec4( vec3( color ), opacity );", + + "}" + + ].join( "\n" ) + + }, + + 'normal': { + + uniforms: { + + "opacity" : { type: "f", value: 1.0 } + + }, + + vertexShader: [ + + "varying vec3 vNormal;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + " vNormal = normalize( normalMatrix * normal );", + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform float opacity;", + "varying vec3 vNormal;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + "}" + + ].join( "\n" ) + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + 'cube': { + + uniforms: { "tCube": { type: "t", value: null }, + "tFlip": { type: "f", value: - 1 } }, + + vertexShader: [ + + "varying vec3 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + " vWorldPosition = transformDirection( position, modelMatrix );", + + " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform samplerCube tCube;", + "uniform float tFlip;", + + "varying vec3 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + "}" + + ].join( "\n" ) + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + 'equirect': { + + uniforms: { "tEquirect": { type: "t", value: null }, + "tFlip": { type: "f", value: - 1 } }, + + vertexShader: [ + + "varying vec3 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + " vWorldPosition = transformDirection( position, modelMatrix );", + + " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform sampler2D tEquirect;", + "uniform float tFlip;", + + "varying vec3 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + // " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );", + "vec3 direction = normalize( vWorldPosition );", + "vec2 sampleUV;", + "sampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );", + "sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;", + "gl_FragColor = texture2D( tEquirect, sampleUV );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + "}" + + ].join( "\n" ) + + }, + + /* Depth encoding into RGBA texture + * + * based on SpiderGL shadow map example + * http://spidergl.org/example.php?id=6 + * + * originally from + * http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD + * + * see also + * http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ + */ + + 'depthRGBA': { + + uniforms: {}, + + vertexShader: [ + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "skinbase_vertex" ], + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "vec4 pack_depth( const in float depth ) {", + + " const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );", + " const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );", + " vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );", // " vec4 res = fract( depth * bit_shift );", + " res -= res.xxyz * bit_mask;", + " return res;", + + "}", + + "void main() {", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + " #ifdef USE_LOGDEPTHBUF_EXT", + + " gl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );", + + " #else", + + " gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );", + + " #endif", + + //"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );", + //"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );", + //"gl_FragData[ 0 ] = pack_depth( z );", + //"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );", + + "}" + + ].join( "\n" ) + + }, + + + 'distanceRGBA': { + + uniforms: { + + "lightPos": { type: "v3", value: new THREE.Vector3( 0, 0, 0 ) } + + }, + + vertexShader: [ + + "varying vec4 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "skinbase_vertex" ], + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "worldpos_vertex" ], + + "vWorldPosition = worldPosition;", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 lightPos;", + "varying vec4 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + + "vec4 pack1K ( float depth ) {", + + " depth /= 1000.0;", + " const vec4 bitSh = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );", + " const vec4 bitMsk = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );", + " vec4 res = fract( depth * bitSh );", + " res -= res.xxyz * bitMsk;", + " return res; ", + + "}", + + "float unpack1K ( vec4 color ) {", + + " const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );", + " return dot( color, bitSh ) * 1000.0;", + + "}", + + "void main () {", + + " gl_FragColor = pack1K( length( vWorldPosition.xyz - lightPos.xyz ) );", + + "}" + + ].join( "\n" ) + + } + +}; + +// File:src/renderers/WebGLRenderer.js + +/** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + +THREE.WebGLRenderer = function ( parameters ) { + + console.log( 'THREE.WebGLRenderer', THREE.REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _width = _canvas.width, + _height = _canvas.height, + + pixelRatio = 1, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + + _clearColor = new THREE.Color( 0x000000 ), + _clearAlpha = 0; + + var lights = []; + + var opaqueObjects = []; + var opaqueObjectsLastIndex = - 1; + var transparentObjects = []; + var transparentObjectsLastIndex = - 1; + + var morphInfluences = new Float32Array( 8 ); + + + var sprites = []; + var lensFlares = []; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // flags + + this.autoScaleCubemaps = true; + + // internal properties + + var _this = this, + + // internal state cache + + _currentProgram = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + _currentCamera = null, + + _usedTextureUnits = 0, + + _viewportX = 0, + _viewportY = 0, + _viewportWidth = _canvas.width, + _viewportHeight = _canvas.height, + _currentWidth = 0, + _currentHeight = 0, + + // frustum + + _frustum = new THREE.Frustum(), + + // camera matrices cache + + _projScreenMatrix = new THREE.Matrix4(), + + _vector3 = new THREE.Vector3(), + + // light arrays cache + + _direction = new THREE.Vector3(), + + _lightsNeedUpdate = true, + + _lights = { + + ambient: [ 0, 0, 0 ], + directional: { length: 0, colors: [], positions: [] }, + point: { length: 0, colors: [], positions: [], distances: [], decays: [] }, + spot: { length: 0, colors: [], positions: [], distances: [], directions: [], anglesCos: [], exponents: [], decays: [] }, + hemi: { length: 0, skyColors: [], groundColors: [], positions: [] } + + }, + + // info + + _infoMemory = { + + geometries: 0, + textures: 0 + + }, + + _infoRender = { + + calls: 0, + vertices: 0, + faces: 0, + points: 0 + + }; + + this.info = { + + render: _infoRender, + memory: _infoMemory, + programs: null + + }; + + + // initialize + + var _gl; + + try { + + var attributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer + }; + + _gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw 'Error creating WebGL context with your selected attributes.'; + + } else { + + throw 'Error creating WebGL context.'; + + } + + } + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error ); + + } + + var extensions = new THREE.WebGLExtensions( _gl ); + + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extensions.get( 'OES_element_index_uint' ) ) { + + THREE.BufferGeometry.MaxIndex = 4294967296; + + } + + var capabilities = new THREE.WebGLCapabilities( _gl, extensions, parameters ); + + var state = new THREE.WebGLState( _gl, extensions, paramThreeToGL ); + var properties = new THREE.WebGLProperties(); + var objects = new THREE.WebGLObjects( _gl, properties, this.info ); + var programCache = new THREE.WebGLPrograms( this, capabilities ); + + this.info.programs = programCache.programs; + + var bufferRenderer = new THREE.WebGLBufferRenderer( _gl, extensions, _infoRender ); + var indexedBufferRenderer = new THREE.WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ); + + // + + function glClearColor( r, g, b, a ) { + + if ( _premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + _gl.clearColor( r, g, b, a ); + + } + + function setDefaultGLState() { + + state.init(); + + _gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight ); + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + } + + function resetGLState() { + + _currentProgram = null; + _currentCamera = null; + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + + _lightsNeedUpdate = true; + + state.reset(); + + } + + setDefaultGLState(); + + this.context = _gl; + this.capabilities = capabilities; + this.extensions = extensions; + this.state = state; + + // shadow map + + var shadowMap = new THREE.WebGLShadowMap( this, lights, objects ); + + this.shadowMap = shadowMap; + + + // Plugins + + var spritePlugin = new THREE.SpritePlugin( this, sprites ); + var lensFlarePlugin = new THREE.LensFlarePlugin( this, lensFlares ); + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + extensions.get( 'WEBGL_lose_context' ).loseContext(); + + }; + + this.getMaxAnisotropy = ( function () { + + var value; + + return function getMaxAnisotropy() { + + if ( value !== undefined ) return value; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + value = _gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + value = 0; + + } + + return value; + + } + + } )(); + + this.getPrecision = function () { + + return capabilities.precision; + + }; + + this.getPixelRatio = function () { + + return pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value !== undefined ) pixelRatio = value; + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewportX = x * pixelRatio; + _viewportY = y * pixelRatio; + + _viewportWidth = width * pixelRatio; + _viewportHeight = height * pixelRatio; + + _gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight ); + + }; + + this.getViewport = function ( dimensions ) { + + dimensions.x = _viewportX / pixelRatio; + dimensions.y = _viewportY / pixelRatio; + + dimensions.z = _viewportWidth / pixelRatio; + dimensions.w = _viewportHeight / pixelRatio; + + }; + + this.setScissor = function ( x, y, width, height ) { + + _gl.scissor( + x * pixelRatio, + y * pixelRatio, + width * pixelRatio, + height * pixelRatio + ); + + }; + + this.enableScissorTest = function ( boolean ) { + + state.setScissorTest( boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return _clearColor; + + }; + + this.setClearColor = function ( color, alpha ) { + + _clearColor.set( color ); + + _clearAlpha = alpha !== undefined ? alpha : 1; + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + }; + + this.getClearAlpha = function () { + + return _clearAlpha; + + }; + + this.setClearAlpha = function ( alpha ) { + + _clearAlpha = alpha; + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + _gl.clear( _gl.COLOR_BUFFER_BIT ); + + }; + + this.clearDepth = function () { + + _gl.clear( _gl.DEPTH_BUFFER_BIT ); + + }; + + this.clearStencil = function () { + + _gl.clear( _gl.STENCIL_BUFFER_BIT ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // Reset + + this.resetGLState = resetGLState; + + this.dispose = function() { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + resetGLState(); + setDefaultGLState(); + + properties.clear(); + + }; + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + _infoMemory.textures --; + + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + _infoMemory.textures --; + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.delete( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget || textureProperties.__webglTexture === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + _gl.deleteRenderbuffer( renderTargetProperties.__webglRenderbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + _gl.deleteRenderbuffer( renderTargetProperties.__webglRenderbuffer ); + + } + + properties.delete( renderTarget.texture ); + properties.delete( renderTarget ); + + } + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.delete( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var attributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.position ); + _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( material.type !== 'MeshPhongMaterial' && material.shading === THREE.FlatShading ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.normal ); + + _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.uv ); + + _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== THREE.NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.color ); + + _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, lights, fog, geometry, material, object, group ) { + + setMaterial( material ); + + var program = setProgram( camera, lights, fog, material, object ); + + var updateBuffers = false; + var geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + var activeInfluences = []; + + for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { + + var influence = morphTargetInfluences[ i ]; + activeInfluences.push( [ influence, i ] ); + + } + + activeInfluences.sort( numericalSort ); + + if ( activeInfluences.length > 8 ) { + + activeInfluences.length = 8; + + } + + var morphAttributes = geometry.morphAttributes; + + for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var index = influence[ 1 ]; + + if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); + if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); + + } else { + + if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); + if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + var uniforms = program.getUniforms(); + + if ( uniforms.morphTargetInfluences !== null ) { + + _gl.uniform1fv( uniforms.morphTargetInfluences, morphInfluences ); + + } + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + + if ( material.wireframe === true ) { + + index = objects.getWireframeAttribute( geometry ); + + } + + var renderer; + + if ( index !== null ) { + + renderer = indexedBufferRenderer; + renderer.setIndex( index ); + + } else { + + renderer = bufferRenderer; + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) ); + + } + + } + + // + + var dataStart = 0; + var dataCount = Infinity; + + if ( index !== null ) { + + dataCount = index.count + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start; + var rangeCount = geometry.drawRange.count; + + var groupStart = group !== null ? group.start : 0; + var groupCount = group !== null ? group.count : Infinity; + + var drawStart = Math.max( dataStart, rangeStart, groupStart ); + var drawEnd = Math.min( dataStart + dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + // + + if ( object instanceof THREE.Mesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * pixelRatio ); + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.TRIANGLES ); + + } + + if ( geometry instanceof THREE.InstancedBufferGeometry && geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry ); + + } else { + + renderer.render( drawStart, drawCount ); + + } + + } else if ( object instanceof THREE.Line ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * pixelRatio ); + + if ( object instanceof THREE.LineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + renderer.render( drawStart, drawCount ); + + } else if ( object instanceof THREE.Points ) { + + renderer.setMode( _gl.POINTS ); + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry, startIndex ) { + + var extension; + + if ( geometry instanceof THREE.InstancedBufferGeometry ) { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + if ( startIndex === undefined ) startIndex = 0; + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var size = geometryAttribute.itemSize; + var buffer = objects.getAttributeBuffer( geometryAttribute ); + + if ( geometryAttribute instanceof THREE.InterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data instanceof THREE.InstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT ); + + } else { + + if ( geometryAttribute instanceof THREE.InstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, 0, startIndex * size * 4 ); // 4 bytes per Float32 + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Sorting + + function numericalSort ( a, b ) { + + return b[ 0 ] - a[ 0 ]; + + } + + function painterSortStable ( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable ( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( camera instanceof THREE.Camera === false ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + var fog = scene.fog; + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + _lightsNeedUpdate = true; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + lights.length = 0; + + opaqueObjectsLastIndex = - 1; + transparentObjectsLastIndex = - 1; + + sprites.length = 0; + lensFlares.length = 0; + + projectObject( scene, camera ); + + opaqueObjects.length = opaqueObjectsLastIndex + 1; + transparentObjects.length = transparentObjectsLastIndex + 1; + + if ( _this.sortObjects === true ) { + + opaqueObjects.sort( painterSortStable ); + transparentObjects.sort( reversePainterSortStable ); + + } + + // + + shadowMap.render( scene ); + + // + + _infoRender.calls = 0; + _infoRender.vertices = 0; + _infoRender.faces = 0; + _infoRender.points = 0; + + this.setRenderTarget( renderTarget ); + + if ( this.autoClear || forceClear ) { + + this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); + + } + + // + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + renderObjects( opaqueObjects, camera, lights, fog, overrideMaterial ); + renderObjects( transparentObjects, camera, lights, fog, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + state.setBlending( THREE.NoBlending ); + renderObjects( opaqueObjects, camera, lights, fog ); + + // transparent pass (back-to-front order) + + renderObjects( transparentObjects, camera, lights, fog ); + + } + + // custom render plugins (post pass) + + spritePlugin.render( scene, camera ); + lensFlarePlugin.render( scene, camera, _currentWidth, _currentHeight ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + if ( texture.generateMipmaps && isTargetPowerOfTwo && texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) { + + updateRenderTargetMipmap( renderTarget ); + + } + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.setDepthTest( true ); + state.setDepthWrite( true ); + state.setColorWrite( true ); + + // _gl.finish(); + + }; + + function pushRenderItem( object, geometry, material, z, group ) { + + var array, index; + + // allocate the next position in the appropriate array + + if ( material.transparent ) { + + array = transparentObjects; + index = ++ transparentObjectsLastIndex; + + } else { + + array = opaqueObjects; + index = ++ opaqueObjectsLastIndex; + + } + + // recycle existing render item or grow the array + + var renderItem = array[ index ]; + + if ( renderItem !== undefined ) { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.z = _vector3.z; + renderItem.group = group; + + } else { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + z: _vector3.z, + group: group + }; + + // assert( index === array.length ); + array.push( renderItem ); + + } + + } + + function projectObject( object, camera ) { + + if ( object.visible === false ) return; + + if ( ( object.channels.mask & camera.channels.mask ) !== 0 ) { + + if ( object instanceof THREE.Light ) { + + lights.push( object ); + + } else if ( object instanceof THREE.Sprite ) { + + sprites.push( object ); + + } else if ( object instanceof THREE.LensFlare ) { + + lensFlares.push( object ); + + } else if ( object instanceof THREE.ImmediateRenderObject ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyProjection( _projScreenMatrix ); + + } + + pushRenderItem( object, null, object.material, _vector3.z, null ); + + } else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) { + + if ( object instanceof THREE.SkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) { + + var material = object.material; + + if ( material.visible === true ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyProjection( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + + if ( material instanceof THREE.MeshFaceMaterial ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + pushRenderItem( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else { + + pushRenderItem( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera ); + + } + + } + + function renderObjects( renderList, camera, lights, fog, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object instanceof THREE.ImmediateRenderObject ) { + + setMaterial( material ); + + var program = setProgram( camera, lights, fog, material, object ); + + _currentGeometryProgram = ''; + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } else { + + _this.renderBufferDirect( camera, lights, fog, geometry, material, object, group ); + + } + + } + + } + + function initMaterial( material, lights, fog, object ) { + + var materialProperties = properties.get( material ); + + var parameters = programCache.getParameters( material, lights, fog, object ); + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = THREE.ShaderLib[ parameters.shaderID ]; + + materialProperties.__webglShader = { + name: material.type, + uniforms: THREE.UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.__webglShader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.__webglShader = materialProperties.__webglShader; + + program = programCache.acquireProgram( material, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var attributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( attributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( attributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + materialProperties.uniformsList = []; + + var uniformLocations = materialProperties.program.getUniforms(); + + for ( var u in materialProperties.__webglShader.uniforms ) { + + var location = uniformLocations[ u ]; + + if ( location ) { + + materialProperties.uniformsList.push( [ materialProperties.__webglShader.uniforms[ u ], location ] ); + + } + + } + + } + + function setMaterial( material ) { + + setMaterialFaces( material ); + + if ( material.transparent === true ) { + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha ); + + } else { + + state.setBlending( THREE.NoBlending ); + + } + + state.setDepthFunc( material.depthFunc ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + state.setColorWrite( material.colorWrite ); + state.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + function setMaterialFaces( material ) { + + material.side !== THREE.DoubleSide ? state.enable( _gl.CULL_FACE ) : state.disable( _gl.CULL_FACE ); + state.setFlipSided( material.side === THREE.BackSide ); + + } + + function setProgram( camera, lights, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + + if ( material.needsUpdate || ! materialProperties.program ) { + + initMaterial( material, lights, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.__webglShader.uniforms; + + if ( program.id !== _currentProgram ) { + + _gl.useProgram( program.program ); + _currentProgram = program.id; + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + if ( _currentMaterialId === - 1 ) refreshLights = true; + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + _gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + if ( capabilities.logarithmicDepthBuffer ) { + + _gl.uniform1f( p_uniforms.logDepthBufFC, 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + + if ( camera !== _currentCamera ) _currentCamera = camera; + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material instanceof THREE.ShaderMaterial || + material instanceof THREE.MeshPhongMaterial || + material.envMap ) { + + if ( p_uniforms.cameraPosition !== undefined ) { + + _vector3.setFromMatrixPosition( camera.matrixWorld ); + _gl.uniform3f( p_uniforms.cameraPosition, _vector3.x, _vector3.y, _vector3.z ); + + } + + } + + if ( material instanceof THREE.MeshPhongMaterial || + material instanceof THREE.MeshLambertMaterial || + material instanceof THREE.MeshBasicMaterial || + material instanceof THREE.ShaderMaterial || + material.skinning ) { + + if ( p_uniforms.viewMatrix !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera.matrixWorldInverse.elements ); + + } + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + if ( object.bindMatrix && p_uniforms.bindMatrix !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.bindMatrix, false, object.bindMatrix.elements ); + + } + + if ( object.bindMatrixInverse && p_uniforms.bindMatrixInverse !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.bindMatrixInverse, false, object.bindMatrixInverse.elements ); + + } + + if ( capabilities.floatVertexTextures && object.skeleton && object.skeleton.useVertexTexture ) { + + if ( p_uniforms.boneTexture !== undefined ) { + + var textureUnit = getTextureUnit(); + + _gl.uniform1i( p_uniforms.boneTexture, textureUnit ); + _this.setTexture( object.skeleton.boneTexture, textureUnit ); + + } + + if ( p_uniforms.boneTextureWidth !== undefined ) { + + _gl.uniform1i( p_uniforms.boneTextureWidth, object.skeleton.boneTextureWidth ); + + } + + if ( p_uniforms.boneTextureHeight !== undefined ) { + + _gl.uniform1i( p_uniforms.boneTextureHeight, object.skeleton.boneTextureHeight ); + + } + + } else if ( object.skeleton && object.skeleton.boneMatrices ) { + + if ( p_uniforms.boneGlobalMatrices !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.boneGlobalMatrices, false, object.skeleton.boneMatrices ); + + } + + } + + } + + if ( refreshMaterial ) { + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material instanceof THREE.MeshPhongMaterial || + material instanceof THREE.MeshLambertMaterial || + material.lights ) { + + if ( _lightsNeedUpdate ) { + + refreshLights = true; + setupLights( lights, camera ); + _lightsNeedUpdate = false; + + } + + if ( refreshLights ) { + + refreshUniformsLights( m_uniforms, _lights ); + markUniformsLightsNeedsUpdate( m_uniforms, true ); + + } else { + + markUniformsLightsNeedsUpdate( m_uniforms, false ); + + } + + } + + if ( material instanceof THREE.MeshBasicMaterial || + material instanceof THREE.MeshLambertMaterial || + material instanceof THREE.MeshPhongMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } + + // refresh single material specific uniforms + + if ( material instanceof THREE.LineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + } else if ( material instanceof THREE.LineDashedMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + refreshUniformsDash( m_uniforms, material ); + + } else if ( material instanceof THREE.PointsMaterial ) { + + refreshUniformsParticle( m_uniforms, material ); + + } else if ( material instanceof THREE.MeshPhongMaterial ) { + + refreshUniformsPhong( m_uniforms, material ); + + } else if ( material instanceof THREE.MeshDepthMaterial ) { + + m_uniforms.mNear.value = camera.near; + m_uniforms.mFar.value = camera.far; + m_uniforms.opacity.value = material.opacity; + + } else if ( material instanceof THREE.MeshNormalMaterial ) { + + m_uniforms.opacity.value = material.opacity; + + } + + if ( object.receiveShadow && ! material._shadowPass ) { + + refreshUniformsShadow( m_uniforms, lights, camera ); + + } + + // load common uniforms + + loadUniformsGeneric( materialProperties.uniformsList ); + + } + + loadUniformsMatrices( p_uniforms, object ); + + if ( p_uniforms.modelMatrix !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.modelMatrix, false, object.matrixWorld.elements ); + + } + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon ( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value = material.color; + + if ( material.emissive ) { + + uniforms.emissive.value = material.emissive; + + } + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + if ( uvScaleMap instanceof THREE.WebGLRenderTarget ) uvScaleMap = uvScaleMap.texture; + var offset = uvScaleMap.offset; + var repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + uniforms.envMap.value = material.envMap; + uniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + function refreshUniformsLine ( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash ( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsParticle ( uniforms, material ) { + + uniforms.psColor.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size; + uniforms.scale.value = _canvas.height / 2.0; // TODO: Cache this. + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + var offset = material.map.offset; + var repeat = material.map.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + } + + function refreshUniformsFog ( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog instanceof THREE.Fog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog instanceof THREE.FogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsPhong ( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsLights ( uniforms, lights ) { + + uniforms.ambientLightColor.value = lights.ambient; + + uniforms.directionalLightColor.value = lights.directional.colors; + uniforms.directionalLightDirection.value = lights.directional.positions; + + uniforms.pointLightColor.value = lights.point.colors; + uniforms.pointLightPosition.value = lights.point.positions; + uniforms.pointLightDistance.value = lights.point.distances; + uniforms.pointLightDecay.value = lights.point.decays; + + uniforms.spotLightColor.value = lights.spot.colors; + uniforms.spotLightPosition.value = lights.spot.positions; + uniforms.spotLightDistance.value = lights.spot.distances; + uniforms.spotLightDirection.value = lights.spot.directions; + uniforms.spotLightAngleCos.value = lights.spot.anglesCos; + uniforms.spotLightExponent.value = lights.spot.exponents; + uniforms.spotLightDecay.value = lights.spot.decays; + + uniforms.hemisphereLightSkyColor.value = lights.hemi.skyColors; + uniforms.hemisphereLightGroundColor.value = lights.hemi.groundColors; + uniforms.hemisphereLightDirection.value = lights.hemi.positions; + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate ( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLightColor.needsUpdate = value; + uniforms.directionalLightDirection.needsUpdate = value; + + uniforms.pointLightColor.needsUpdate = value; + uniforms.pointLightPosition.needsUpdate = value; + uniforms.pointLightDistance.needsUpdate = value; + uniforms.pointLightDecay.needsUpdate = value; + + uniforms.spotLightColor.needsUpdate = value; + uniforms.spotLightPosition.needsUpdate = value; + uniforms.spotLightDistance.needsUpdate = value; + uniforms.spotLightDirection.needsUpdate = value; + uniforms.spotLightAngleCos.needsUpdate = value; + uniforms.spotLightExponent.needsUpdate = value; + uniforms.spotLightDecay.needsUpdate = value; + + uniforms.hemisphereLightSkyColor.needsUpdate = value; + uniforms.hemisphereLightGroundColor.needsUpdate = value; + uniforms.hemisphereLightDirection.needsUpdate = value; + + } + + function refreshUniformsShadow ( uniforms, lights, camera ) { + + if ( uniforms.shadowMatrix ) { + + var j = 0; + + for ( var i = 0, il = lights.length; i < il; i ++ ) { + + var light = lights[ i ]; + + if ( light.castShadow === true ) { + + if ( light instanceof THREE.PointLight || light instanceof THREE.SpotLight || light instanceof THREE.DirectionalLight ) { + + var shadow = light.shadow; + + if ( light instanceof THREE.PointLight ) { + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + _vector3.setFromMatrixPosition( light.matrixWorld ).negate(); + shadow.matrix.identity().setPosition( _vector3 ); + + // for point lights we set the sign of the shadowDarkness uniform to be negative + uniforms.shadowDarkness.value[ j ] = - shadow.darkness; + + } else { + + uniforms.shadowDarkness.value[ j ] = shadow.darkness; + + } + + uniforms.shadowMatrix.value[ j ] = shadow.matrix; + uniforms.shadowMap.value[ j ] = shadow.map; + uniforms.shadowMapSize.value[ j ] = shadow.mapSize; + uniforms.shadowBias.value[ j ] = shadow.bias; + + j ++; + + } + + } + + } + + } + + } + + // Uniforms (load to GPU) + + function loadUniformsMatrices ( uniforms, object ) { + + _gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object.modelViewMatrix.elements ); + + if ( uniforms.normalMatrix ) { + + _gl.uniformMatrix3fv( uniforms.normalMatrix, false, object.normalMatrix.elements ); + + } + + } + + function getTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + function loadUniformsGeneric ( uniforms ) { + + var texture, textureUnit; + + for ( var j = 0, jl = uniforms.length; j < jl; j ++ ) { + + var uniform = uniforms[ j ][ 0 ]; + + // needsUpdate property is not added to all uniforms. + if ( uniform.needsUpdate === false ) continue; + + var type = uniform.type; + var value = uniform.value; + var location = uniforms[ j ][ 1 ]; + + switch ( type ) { + + case '1i': + _gl.uniform1i( location, value ); + break; + + case '1f': + _gl.uniform1f( location, value ); + break; + + case '2f': + _gl.uniform2f( location, value[ 0 ], value[ 1 ] ); + break; + + case '3f': + _gl.uniform3f( location, value[ 0 ], value[ 1 ], value[ 2 ] ); + break; + + case '4f': + _gl.uniform4f( location, value[ 0 ], value[ 1 ], value[ 2 ], value[ 3 ] ); + break; + + case '1iv': + _gl.uniform1iv( location, value ); + break; + + case '3iv': + _gl.uniform3iv( location, value ); + break; + + case '1fv': + _gl.uniform1fv( location, value ); + break; + + case '2fv': + _gl.uniform2fv( location, value ); + break; + + case '3fv': + _gl.uniform3fv( location, value ); + break; + + case '4fv': + _gl.uniform4fv( location, value ); + break; + + case 'Matrix3fv': + _gl.uniformMatrix3fv( location, false, value ); + break; + + case 'Matrix4fv': + _gl.uniformMatrix4fv( location, false, value ); + break; + + // + + case 'i': + + // single integer + _gl.uniform1i( location, value ); + + break; + + case 'f': + + // single float + _gl.uniform1f( location, value ); + + break; + + case 'v2': + + // single THREE.Vector2 + _gl.uniform2f( location, value.x, value.y ); + + break; + + case 'v3': + + // single THREE.Vector3 + _gl.uniform3f( location, value.x, value.y, value.z ); + + break; + + case 'v4': + + // single THREE.Vector4 + _gl.uniform4f( location, value.x, value.y, value.z, value.w ); + + break; + + case 'c': + + // single THREE.Color + _gl.uniform3f( location, value.r, value.g, value.b ); + + break; + + case 'iv1': + + // flat array of integers (JS or typed array) + _gl.uniform1iv( location, value ); + + break; + + case 'iv': + + // flat array of integers with 3 x N size (JS or typed array) + _gl.uniform3iv( location, value ); + + break; + + case 'fv1': + + // flat array of floats (JS or typed array) + _gl.uniform1fv( location, value ); + + break; + + case 'fv': + + // flat array of floats with 3 x N size (JS or typed array) + _gl.uniform3fv( location, value ); + + break; + + case 'v2v': + + // array of THREE.Vector2 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 2 * value.length ); + + } + + for ( var i = 0, i2 = 0, il = value.length; i < il; i ++, i2 += 2 ) { + + uniform._array[ i2 + 0 ] = value[ i ].x; + uniform._array[ i2 + 1 ] = value[ i ].y; + + } + + _gl.uniform2fv( location, uniform._array ); + + break; + + case 'v3v': + + // array of THREE.Vector3 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 3 * value.length ); + + } + + for ( var i = 0, i3 = 0, il = value.length; i < il; i ++, i3 += 3 ) { + + uniform._array[ i3 + 0 ] = value[ i ].x; + uniform._array[ i3 + 1 ] = value[ i ].y; + uniform._array[ i3 + 2 ] = value[ i ].z; + + } + + _gl.uniform3fv( location, uniform._array ); + + break; + + case 'v4v': + + // array of THREE.Vector4 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 4 * value.length ); + + } + + for ( var i = 0, i4 = 0, il = value.length; i < il; i ++, i4 += 4 ) { + + uniform._array[ i4 + 0 ] = value[ i ].x; + uniform._array[ i4 + 1 ] = value[ i ].y; + uniform._array[ i4 + 2 ] = value[ i ].z; + uniform._array[ i4 + 3 ] = value[ i ].w; + + } + + _gl.uniform4fv( location, uniform._array ); + + break; + + case 'm3': + + // single THREE.Matrix3 + _gl.uniformMatrix3fv( location, false, value.elements ); + + break; + + case 'm3v': + + // array of THREE.Matrix3 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 9 * value.length ); + + } + + for ( var i = 0, il = value.length; i < il; i ++ ) { + + value[ i ].flattenToArrayOffset( uniform._array, i * 9 ); + + } + + _gl.uniformMatrix3fv( location, false, uniform._array ); + + break; + + case 'm4': + + // single THREE.Matrix4 + _gl.uniformMatrix4fv( location, false, value.elements ); + + break; + + case 'm4v': + + // array of THREE.Matrix4 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 16 * value.length ); + + } + + for ( var i = 0, il = value.length; i < il; i ++ ) { + + value[ i ].flattenToArrayOffset( uniform._array, i * 16 ); + + } + + _gl.uniformMatrix4fv( location, false, uniform._array ); + + break; + + case 't': + + // single THREE.Texture (2d or cube) + + texture = value; + textureUnit = getTextureUnit(); + + _gl.uniform1i( location, textureUnit ); + + if ( ! texture ) continue; + + if ( texture instanceof THREE.CubeTexture || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + setCubeTexture( texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTargetCube ) { + + setCubeTextureDynamic( texture.texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTarget ) { + + _this.setTexture( texture.texture, textureUnit ); + + } else { + + _this.setTexture( texture, textureUnit ); + + } + + break; + + case 'tv': + + // array of THREE.Texture (2d or cube) + + if ( uniform._array === undefined ) { + + uniform._array = []; + + } + + for ( var i = 0, il = uniform.value.length; i < il; i ++ ) { + + uniform._array[ i ] = getTextureUnit(); + + } + + _gl.uniform1iv( location, uniform._array ); + + for ( var i = 0, il = uniform.value.length; i < il; i ++ ) { + + texture = uniform.value[ i ]; + textureUnit = uniform._array[ i ]; + + if ( ! texture ) continue; + + if ( texture instanceof THREE.CubeTexture || + ( texture.image instanceof Array && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + setCubeTexture( texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTarget ) { + + _this.setTexture( texture.texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTargetCube ) { + + setCubeTextureDynamic( texture.texture, textureUnit ); + + } else { + + _this.setTexture( texture, textureUnit ); + + } + + } + + break; + + default: + + console.warn( 'THREE.WebGLRenderer: Unknown uniform type: ' + type ); + + } + + } + + } + + function setColorLinear( array, offset, color, intensity ) { + + array[ offset + 0 ] = color.r * intensity; + array[ offset + 1 ] = color.g * intensity; + array[ offset + 2 ] = color.b * intensity; + + } + + function setupLights ( lights, camera ) { + + var l, ll, light, + r = 0, g = 0, b = 0, + color, skyColor, groundColor, + intensity, + distance, + + zlights = _lights, + + viewMatrix = camera.matrixWorldInverse, + + dirColors = zlights.directional.colors, + dirPositions = zlights.directional.positions, + + pointColors = zlights.point.colors, + pointPositions = zlights.point.positions, + pointDistances = zlights.point.distances, + pointDecays = zlights.point.decays, + + spotColors = zlights.spot.colors, + spotPositions = zlights.spot.positions, + spotDistances = zlights.spot.distances, + spotDirections = zlights.spot.directions, + spotAnglesCos = zlights.spot.anglesCos, + spotExponents = zlights.spot.exponents, + spotDecays = zlights.spot.decays, + + hemiSkyColors = zlights.hemi.skyColors, + hemiGroundColors = zlights.hemi.groundColors, + hemiPositions = zlights.hemi.positions, + + dirLength = 0, + pointLength = 0, + spotLength = 0, + hemiLength = 0, + + dirCount = 0, + pointCount = 0, + spotCount = 0, + hemiCount = 0, + + dirOffset = 0, + pointOffset = 0, + spotOffset = 0, + hemiOffset = 0; + + for ( l = 0, ll = lights.length; l < ll; l ++ ) { + + light = lights[ l ]; + + color = light.color; + intensity = light.intensity; + distance = light.distance; + + if ( light instanceof THREE.AmbientLight ) { + + if ( ! light.visible ) continue; + + r += color.r; + g += color.g; + b += color.b; + + } else if ( light instanceof THREE.DirectionalLight ) { + + dirCount += 1; + + if ( ! light.visible ) continue; + + _direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + _direction.sub( _vector3 ); + _direction.transformDirection( viewMatrix ); + + dirOffset = dirLength * 3; + + dirPositions[ dirOffset + 0 ] = _direction.x; + dirPositions[ dirOffset + 1 ] = _direction.y; + dirPositions[ dirOffset + 2 ] = _direction.z; + + setColorLinear( dirColors, dirOffset, color, intensity ); + + dirLength += 1; + + } else if ( light instanceof THREE.PointLight ) { + + pointCount += 1; + + if ( ! light.visible ) continue; + + pointOffset = pointLength * 3; + + setColorLinear( pointColors, pointOffset, color, intensity ); + + _vector3.setFromMatrixPosition( light.matrixWorld ); + _vector3.applyMatrix4( viewMatrix ); + + pointPositions[ pointOffset + 0 ] = _vector3.x; + pointPositions[ pointOffset + 1 ] = _vector3.y; + pointPositions[ pointOffset + 2 ] = _vector3.z; + + // distance is 0 if decay is 0, because there is no attenuation at all. + pointDistances[ pointLength ] = distance; + pointDecays[ pointLength ] = ( light.distance === 0 ) ? 0.0 : light.decay; + + pointLength += 1; + + } else if ( light instanceof THREE.SpotLight ) { + + spotCount += 1; + + if ( ! light.visible ) continue; + + spotOffset = spotLength * 3; + + setColorLinear( spotColors, spotOffset, color, intensity ); + + _direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.copy( _direction ).applyMatrix4( viewMatrix ); + + spotPositions[ spotOffset + 0 ] = _vector3.x; + spotPositions[ spotOffset + 1 ] = _vector3.y; + spotPositions[ spotOffset + 2 ] = _vector3.z; + + spotDistances[ spotLength ] = distance; + + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + _direction.sub( _vector3 ); + _direction.transformDirection( viewMatrix ); + + spotDirections[ spotOffset + 0 ] = _direction.x; + spotDirections[ spotOffset + 1 ] = _direction.y; + spotDirections[ spotOffset + 2 ] = _direction.z; + + spotAnglesCos[ spotLength ] = Math.cos( light.angle ); + spotExponents[ spotLength ] = light.exponent; + spotDecays[ spotLength ] = ( light.distance === 0 ) ? 0.0 : light.decay; + + spotLength += 1; + + } else if ( light instanceof THREE.HemisphereLight ) { + + hemiCount += 1; + + if ( ! light.visible ) continue; + + _direction.setFromMatrixPosition( light.matrixWorld ); + _direction.transformDirection( viewMatrix ); + + hemiOffset = hemiLength * 3; + + hemiPositions[ hemiOffset + 0 ] = _direction.x; + hemiPositions[ hemiOffset + 1 ] = _direction.y; + hemiPositions[ hemiOffset + 2 ] = _direction.z; + + skyColor = light.color; + groundColor = light.groundColor; + + setColorLinear( hemiSkyColors, hemiOffset, skyColor, intensity ); + setColorLinear( hemiGroundColors, hemiOffset, groundColor, intensity ); + + hemiLength += 1; + + } + + } + + // null eventual remains from removed lights + // (this is to avoid if in shader) + + for ( l = dirLength * 3, ll = Math.max( dirColors.length, dirCount * 3 ); l < ll; l ++ ) dirColors[ l ] = 0.0; + for ( l = pointLength * 3, ll = Math.max( pointColors.length, pointCount * 3 ); l < ll; l ++ ) pointColors[ l ] = 0.0; + for ( l = spotLength * 3, ll = Math.max( spotColors.length, spotCount * 3 ); l < ll; l ++ ) spotColors[ l ] = 0.0; + for ( l = hemiLength * 3, ll = Math.max( hemiSkyColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiSkyColors[ l ] = 0.0; + for ( l = hemiLength * 3, ll = Math.max( hemiGroundColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiGroundColors[ l ] = 0.0; + + zlights.directional.length = dirLength; + zlights.point.length = pointLength; + zlights.spot.length = spotLength; + zlights.hemi.length = hemiLength; + + zlights.ambient[ 0 ] = r; + zlights.ambient[ 1 ] = g; + zlights.ambient[ 2 ] = b; + + } + + // GL state setting + + this.setFaceCulling = function ( cullFace, frontFaceDirection ) { + + if ( cullFace === THREE.CullFaceNone ) { + + state.disable( _gl.CULL_FACE ); + + } else { + + if ( frontFaceDirection === THREE.FrontFaceDirectionCW ) { + + _gl.frontFace( _gl.CW ); + + } else { + + _gl.frontFace( _gl.CCW ); + + } + + if ( cullFace === THREE.CullFaceBack ) { + + _gl.cullFace( _gl.BACK ); + + } else if ( cullFace === THREE.CullFaceFront ) { + + _gl.cullFace( _gl.FRONT ); + + } else { + + _gl.cullFace( _gl.FRONT_AND_BACK ); + + } + + state.enable( _gl.CULL_FACE ); + + } + + }; + + // Textures + + function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) { + + var extension; + + if ( isImagePowerOfTwo ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== THREE.ClampToEdgeWrapping || texture.wrapT !== THREE.ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === THREE.FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === THREE.HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, _this.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + texture.image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false ) { + + texture.image = makePowerOfTwo( texture.image ); + + } + + var image = texture.image, + isImagePowerOfTwo = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture instanceof THREE.DataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isImagePowerOfTwo ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } else if ( texture instanceof THREE.CompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== THREE.RGBAFormat && texture.format !== THREE.RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isImagePowerOfTwo ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image ); + + } + + } + + if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + this.setTexture = function ( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + return; + + } + + if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + return; + + } + + uploadTexture( textureProperties, texture, slot ); + + return; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + }; + + function clampToMaxSize ( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElement( 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ); + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( texture.wrapS !== THREE.ClampToEdgeWrapping || texture.wrapT !== THREE.ClampToEdgeWrapping ) return true; + if ( texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) return true; + + return false; + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { + + var canvas = document.createElement( 'canvas' ); + canvas.width = THREE.Math.nearestPowerOfTwo( image.width ); + canvas.height = THREE.Math.nearestPowerOfTwo( image.height ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function setCubeTexture ( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = texture instanceof THREE.CompressedTexture; + var isDataTexture = texture.image[ 0 ] instanceof THREE.DataTexture; + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( _this.autoScaleCubemaps && ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isImagePowerOfTwo = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== THREE.RGBAFormat && texture.format !== THREE.RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( texture.generateMipmaps && isImagePowerOfTwo ) { + + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setCubeTextureDynamic ( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + // Render targets + + function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + + } + + function setupRenderBuffer ( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + /* For some reason this is not working. Defaulting to RGBA4. + } else if ( ! renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + */ + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + } + + this.setRenderTarget = function ( renderTarget ) { + + var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube ); + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true; + if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true; + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + // Setup texture, create render and frame buffers + + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ), + glFormat = paramThreeToGL( renderTarget.texture.format ), + glType = paramThreeToGL( renderTarget.texture.type ); + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + renderTargetProperties.__webglRenderbuffer = []; + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + renderTargetProperties.__webglRenderbuffer[ i ] = _gl.createRenderbuffer(); + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + + setupFrameBuffer( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + setupRenderBuffer( renderTargetProperties.__webglRenderbuffer[ i ], renderTarget ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + if ( renderTarget.shareDepthFrom ) { + + renderTargetProperties.__webglRenderbuffer = renderTarget.shareDepthFrom.__webglRenderbuffer; + + } else { + + renderTargetProperties.__webglRenderbuffer = _gl.createRenderbuffer(); + + } + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + + setupFrameBuffer( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D ); + + if ( renderTarget.shareDepthFrom ) { + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer ); + + } + + } else { + + setupRenderBuffer( renderTargetProperties.__webglRenderbuffer, renderTarget ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + } + + // Release everything + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + var framebuffer, width, height, vx, vy; + + if ( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + if ( isCube ) { + + framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; + + } else { + + framebuffer = renderTargetProperties.__webglFramebuffer; + + } + + width = renderTarget.width; + height = renderTarget.height; + + vx = 0; + vy = 0; + + } else { + + framebuffer = null; + + width = _viewportWidth; + height = _viewportHeight; + + vx = _viewportX; + vy = _viewportY; + + } + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.viewport( vx, vy, width, height ); + + _currentFramebuffer = framebuffer; + + } + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, 0 ); + + } + + _currentWidth = width; + _currentHeight = height; + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( renderTarget instanceof THREE.WebGLRenderTarget === false ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + + if ( texture.format !== THREE.RGBAFormat + && paramThreeToGL( texture.format ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( texture.type !== THREE.UnsignedByteType + && paramThreeToGL( texture.type ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) + && ! ( texture.type === THREE.FloatType && extensions.get( 'WEBGL_color_buffer_float' ) ) + && ! ( texture.type === THREE.HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + _gl.readPixels( x, y, width, height, paramThreeToGL( texture.format ), paramThreeToGL( texture.type ), buffer ); + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + function updateRenderTargetMipmap( renderTarget ) { + + var target = renderTarget instanceof THREE.WebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var texture = properties.get( renderTarget.texture ).__webglTexture; + + state.bindTexture( target, texture ); + _gl.generateMipmap( target ); + state.bindTexture( target, null ); + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback ( f ) { + + if ( f === THREE.NearestFilter || f === THREE.NearestMipMapNearestFilter || f === THREE.NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // Map three.js constants to WebGL constants + + function paramThreeToGL ( p ) { + + var extension; + + if ( p === THREE.RepeatWrapping ) return _gl.REPEAT; + if ( p === THREE.ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; + if ( p === THREE.MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; + + if ( p === THREE.NearestFilter ) return _gl.NEAREST; + if ( p === THREE.NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; + if ( p === THREE.NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; + + if ( p === THREE.LinearFilter ) return _gl.LINEAR; + if ( p === THREE.LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; + if ( p === THREE.LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; + + if ( p === THREE.UnsignedByteType ) return _gl.UNSIGNED_BYTE; + if ( p === THREE.UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === THREE.UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === THREE.UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; + + if ( p === THREE.ByteType ) return _gl.BYTE; + if ( p === THREE.ShortType ) return _gl.SHORT; + if ( p === THREE.UnsignedShortType ) return _gl.UNSIGNED_SHORT; + if ( p === THREE.IntType ) return _gl.INT; + if ( p === THREE.UnsignedIntType ) return _gl.UNSIGNED_INT; + if ( p === THREE.FloatType ) return _gl.FLOAT; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) { + + if ( p === THREE.HalfFloatType ) return extension.HALF_FLOAT_OES; + + } + + if ( p === THREE.AlphaFormat ) return _gl.ALPHA; + if ( p === THREE.RGBFormat ) return _gl.RGB; + if ( p === THREE.RGBAFormat ) return _gl.RGBA; + if ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE; + if ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; + + if ( p === THREE.AddEquation ) return _gl.FUNC_ADD; + if ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT; + if ( p === THREE.ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; + + if ( p === THREE.ZeroFactor ) return _gl.ZERO; + if ( p === THREE.OneFactor ) return _gl.ONE; + if ( p === THREE.SrcColorFactor ) return _gl.SRC_COLOR; + if ( p === THREE.OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; + if ( p === THREE.SrcAlphaFactor ) return _gl.SRC_ALPHA; + if ( p === THREE.OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; + if ( p === THREE.DstAlphaFactor ) return _gl.DST_ALPHA; + if ( p === THREE.OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; + + if ( p === THREE.DstColorFactor ) return _gl.DST_COLOR; + if ( p === THREE.OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; + if ( p === THREE.SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === THREE.RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === THREE.RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === THREE.RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === THREE.RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === THREE.RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === THREE.RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === THREE.RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === THREE.RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === THREE.MinEquation ) return extension.MIN_EXT; + if ( p === THREE.MaxEquation ) return extension.MAX_EXT; + + } + + return 0; + + } + + // DEPRECATED + + this.supportsFloatTextures = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return extensions.get( 'OES_texture_float' ); + + }; + + this.supportsHalfFloatTextures = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return extensions.get( 'OES_texture_half_float' ); + + }; + + this.supportsStandardDerivatives = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return extensions.get( 'OES_standard_derivatives' ); + + }; + + this.supportsCompressedTextureS3TC = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }; + + this.supportsCompressedTexturePVRTC = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }; + + this.supportsBlendMinMax = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return extensions.get( 'EXT_blend_minmax' ); + + }; + + this.supportsVertexTextures = function () { + + return capabilities.vertexTextures; + + }; + + this.supportsInstancedArrays = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return extensions.get( 'ANGLE_instanced_arrays' ); + + }; + + // + + this.initMaterial = function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }; + + this.addPrePlugin = function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }; + + this.addPostPlugin = function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }; + + this.updateShadowMap = function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }; + + Object.defineProperties( this, { + shadowMapEnabled: { + get: function () { + + return shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + return shadowMap.cullFace; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); + shadowMap.cullFace = value; + + } + }, + shadowMapDebug: { + get: function () { + + return shadowMap.debug; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapDebug is now .shadowMap.debug.' ); + shadowMap.debug = value; + + } + } + } ); + +}; + +// File:src/renderers/WebGLRenderTarget.js + +/** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.WebGLRenderTarget = function ( width, height, options ) { + + this.uuid = THREE.Math.generateUUID(); + + this.width = width; + this.height = height; + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = THREE.LinearFilter; + + this.texture = new THREE.Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + + this.shareDepthFrom = options.shareDepthFrom !== undefined ? options.shareDepthFrom : null; + +}; + +THREE.WebGLRenderTarget.prototype = { + + constructor: THREE.WebGLRenderTarget, + + get wrapS() { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + + return this.texture.wrapS; + + }, + + set wrapS( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + + this.texture.wrapS = value; + + }, + + get wrapT() { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + + return this.texture.wrapT; + + }, + + set wrapT( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + + this.texture.wrapT = value; + + }, + + get magFilter() { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + + return this.texture.magFilter; + + }, + + set magFilter( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + + this.texture.magFilter = value; + + }, + + get minFilter() { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + + return this.texture.minFilter; + + }, + + set minFilter( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + + this.texture.minFilter = value; + + }, + + get anisotropy() { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + + return this.texture.anisotropy; + + }, + + set anisotropy( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + + this.texture.anisotropy = value; + + }, + + get offset() { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + + return this.texture.offset; + + }, + + set offset( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + + this.texture.offset = value; + + }, + + get repeat() { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + + return this.texture.repeat; + + }, + + set repeat( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + + this.texture.repeat = value; + + }, + + get format() { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + + return this.texture.format; + + }, + + set format( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + + this.texture.format = value; + + }, + + get type() { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + + return this.texture.type; + + }, + + set type( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + + this.texture.type = value; + + }, + + get generateMipmaps() { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + + return this.texture.generateMipmaps; + + }, + + set generateMipmaps( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + + this.texture.generateMipmaps = value; + + }, + + // + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + + this.shareDepthFrom = source.shareDepthFrom; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.WebGLRenderTarget.prototype ); + +// File:src/renderers/WebGLRenderTargetCube.js + +/** + * @author alteredq / http://alteredqualia.com + */ + +THREE.WebGLRenderTargetCube = function ( width, height, options ) { + + THREE.WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + +}; + +THREE.WebGLRenderTargetCube.prototype = Object.create( THREE.WebGLRenderTarget.prototype ); +THREE.WebGLRenderTargetCube.prototype.constructor = THREE.WebGLRenderTargetCube; + +// File:src/renderers/webgl/WebGLBufferRenderer.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLBufferRenderer = function ( _gl, extensions, _infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + _gl.drawArrays( mode, start, count ); + + _infoRender.calls ++; + _infoRender.vertices += count; + if ( mode === _gl.TRIANGLES ) _infoRender.faces += count / 3; + + } + + function renderInstances( geometry ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + if ( position instanceof THREE.InterleavedBufferAttribute ) { + + extension.drawArraysInstancedANGLE( mode, 0, position.data.count, geometry.maxInstancedCount ); + + } else { + + extension.drawArraysInstancedANGLE( mode, 0, position.count, geometry.maxInstancedCount ); + + } + + } + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + +}; + +// File:src/renderers/webgl/WebGLIndexedBufferRenderer.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLIndexedBufferRenderer = function ( _gl, extensions, _infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, size; + + function setIndex( index ) { + + if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { + + type = _gl.UNSIGNED_INT; + size = 4; + + } else { + + type = _gl.UNSIGNED_SHORT; + size = 2; + + } + + } + + function render( start, count ) { + + _gl.drawElements( mode, count, type, start * size ); + + _infoRender.calls ++; + _infoRender.vertices += count; + if ( mode === _gl.TRIANGLES ) _infoRender.faces += count / 3; + + } + + function renderInstances( geometry ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var index = geometry.index; + + extension.drawElementsInstancedANGLE( mode, index.array.length, type, 0, geometry.maxInstancedCount ); + + } + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + +}; + +// File:src/renderers/webgl/WebGLExtensions.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLExtensions = function ( gl ) { + + var extensions = {}; + + this.get = function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + }; + +}; + +// File:src/renderers/webgl/WebGLCapabilities.js + +THREE.WebGLCapabilities = function ( gl, extensions, parameters ) { + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + this.getMaxPrecision = getMaxPrecision; + + this.precision = parameters.precision !== undefined ? parameters.precision : 'highp', + this.logarithmicDepthBuffer = parameters.logarithmicDepthBuffer !== undefined ? parameters.logarithmicDepthBuffer : false; + + this.maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + this.maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + this.maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + this.maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + this.maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + this.maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + this.maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + this.maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + this.vertexTextures = this.maxVertexTextures > 0; + this.floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + this.floatVertexTextures = this.vertexTextures && this.floatFragmentTextures; + + var _maxPrecision = getMaxPrecision( this.precision ); + + if ( _maxPrecision !== this.precision ) { + + console.warn( 'THREE.WebGLRenderer:', this.precision, 'not supported, using', _maxPrecision, 'instead.' ); + this.precision = _maxPrecision; + + } + + if ( this.logarithmicDepthBuffer ) { + + this.logarithmicDepthBuffer = !! extensions.get( 'EXT_frag_depth' ); + + } + +}; + +// File:src/renderers/webgl/WebGLGeometries.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLGeometries = function ( gl, properties, info ) { + + var geometries = {}; + + function get( object ) { + + var geometry = object.geometry; + + if ( geometries[ geometry.id ] !== undefined ) { + + return geometries[ geometry.id ]; + + } + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + var buffergeometry; + + if ( geometry instanceof THREE.BufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry instanceof THREE.Geometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new THREE.BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + deleteAttributes( buffergeometry.attributes ); + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + var property = properties.get( geometry ); + if ( property.wireframe ) deleteAttribute( property.wireframe ); + + info.memory.geometries --; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute instanceof THREE.InterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function deleteAttribute( attribute ) { + + var buffer = getAttributeBuffer( attribute ); + + if ( buffer !== undefined ) { + + gl.deleteBuffer( buffer ); + removeAttributeBuffer( attribute ); + + } + + } + + function deleteAttributes( attributes ) { + + for ( var name in attributes ) { + + deleteAttribute( attributes[ name ] ); + + } + + } + + function removeAttributeBuffer( attribute ) { + + if ( attribute instanceof THREE.InterleavedBufferAttribute ) { + + properties.delete( attribute.data ); + + } else { + + properties.delete( attribute ); + + } + + } + + this.get = get; + +}; + +// File:src/renderers/webgl/WebGLObjects.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLObjects = function ( gl, properties, info ) { + + var geometries = new THREE.WebGLGeometries( gl, properties, info ); + + // + + function update( object ) { + + // TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter. + + var geometry = geometries.get( object ); + + if ( object.geometry instanceof THREE.Geometry ) { + + geometry.updateFromObject( object ); + + } + + var index = geometry.index; + var attributes = geometry.attributes; + + if ( index !== null ) { + + updateAttribute( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in attributes ) { + + updateAttribute( attributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + updateAttribute( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + return geometry; + + } + + function updateAttribute( attribute, bufferType ) { + + var data = ( attribute instanceof THREE.InterleavedBufferAttribute ) ? attribute.data : attribute; + + var attributeProperties = properties.get( data ); + + if ( attributeProperties.__webglBuffer === undefined ) { + + createBuffer( attributeProperties, data, bufferType ); + + } else if ( attributeProperties.version !== data.version ) { + + updateBuffer( attributeProperties, data, bufferType ); + + } + + } + + function createBuffer( attributeProperties, data, bufferType ) { + + attributeProperties.__webglBuffer = gl.createBuffer(); + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + var usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + gl.bufferData( bufferType, data.array, usage ); + + attributeProperties.version = data.version; + + } + + function updateBuffer( attributeProperties, data, bufferType ) { + + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + if ( data.dynamic === false || data.updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, data.array ); + + } else if ( data.updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT, + data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) ); + + data.updateRange.count = 0; // reset range + + } + + attributeProperties.version = data.version; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute instanceof THREE.InterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function getWireframeAttribute( geometry ) { + + var property = properties.get( geometry ); + + if ( property.wireframe !== undefined ) { + + return property.wireframe; + + } + + var indices = []; + + var index = geometry.index; + var attributes = geometry.attributes; + var position = attributes.position; + + // console.time( 'wireframe' ); + + if ( index !== null ) { + + var edges = {}; + var array = index.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + if ( checkEdge( edges, a, b ) ) indices.push( a, b ); + if ( checkEdge( edges, b, c ) ) indices.push( b, c ); + if ( checkEdge( edges, c, a ) ) indices.push( c, a ); + + } + + } else { + + var array = attributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + var TypeArray = position.count > 65535 ? Uint32Array : Uint16Array; + var attribute = new THREE.BufferAttribute( new TypeArray( indices ), 1 ); + + updateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + property.wireframe = attribute; + + return attribute; + + } + + function checkEdge( edges, a, b ) { + + if ( a > b ) { + + var tmp = a; + a = b; + b = tmp; + + } + + var list = edges[ a ]; + + if ( list === undefined ) { + + edges[ a ] = [ b ]; + return true; + + } else if ( list.indexOf( b ) === -1 ) { + + list.push( b ); + return true; + + } + + return false; + + } + + this.getAttributeBuffer = getAttributeBuffer; + this.getWireframeAttribute = getWireframeAttribute; + + this.update = update; + +}; + +// File:src/renderers/webgl/WebGLProgram.js + +THREE.WebGLProgram = ( function () { + + var programIdCount = 0; + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchUniformLocations( gl, program, identifiers ) { + + var uniforms = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveUniform( program, i ); + var name = info.name; + var location = gl.getUniformLocation( program, name ); + + // console.log("THREE.WebGLProgram: ACTIVE UNIFORM:", name); + + var suffixPos = name.lastIndexOf( '[0]' ); + if ( suffixPos !== - 1 && suffixPos === name.length - 3 ) { + + uniforms[ name.substr( 0, suffixPos ) ] = location; + + } + + uniforms[ name ] = location; + + } + + return uniforms; + + } + + function fetchAttributeLocations( gl, program, identifiers ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + return function WebGLProgram( renderer, code, material, parameters ) { + + var gl = renderer.context; + + var defines = material.defines; + + var vertexShader = material.__webglShader.vertexShader; + var fragmentShader = material.__webglShader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === THREE.PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case THREE.CubeReflectionMapping: + case THREE.CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case THREE.EquirectangularReflectionMapping: + case THREE.EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case THREE.SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case THREE.CubeRefractionMapping: + case THREE.EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case THREE.MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case THREE.MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case THREE.AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material instanceof THREE.RawShaderMaterial ) { + + prefixVertex = ''; + prefixFragment = ''; + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + renderer.gammaInput ? '#define GAMMA_INPUT' : '', + renderer.gammaOutput ? '#define GAMMA_OUTPUT' : '', + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_DIR_LIGHTS ' + parameters.maxDirLights, + '#define MAX_POINT_LIGHTS ' + parameters.maxPointLights, + '#define MAX_SPOT_LIGHTS ' + parameters.maxSpotLights, + '#define MAX_HEMI_LIGHTS ' + parameters.maxHemiLights, + + '#define MAX_SHADOWS ' + parameters.maxShadows, + + '#define MAX_BONES ' + parameters.maxBones, + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + parameters.shadowMapDebug ? '#define SHADOWMAP_DEBUG' : '', + parameters.pointLightShadows > 0 ? '#define POINT_LIGHT_SHADOWS' : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + parameters.bumpMap || parameters.normalMap || parameters.flatShading || material.derivatives ? '#extension GL_OES_standard_derivatives : enable' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + '#define MAX_DIR_LIGHTS ' + parameters.maxDirLights, + '#define MAX_POINT_LIGHTS ' + parameters.maxPointLights, + '#define MAX_SPOT_LIGHTS ' + parameters.maxSpotLights, + '#define MAX_HEMI_LIGHTS ' + parameters.maxHemiLights, + + '#define MAX_SHADOWS ' + parameters.maxShadows, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + renderer.gammaInput ? '#define GAMMA_INPUT' : '', + renderer.gammaOutput ? '#define GAMMA_OUTPUT' : '', + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.metal ? '#define METAL' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + parameters.shadowMapDebug ? '#define SHADOWMAP_DEBUG' : '', + parameters.pointLightShadows > 0 ? '#define POINT_LIGHT_SHADOWS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + var glVertexShader = THREE.WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = THREE.WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ); + var vertexLog = gl.getShaderInfoLog( glVertexShader ); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); + + var runnable = true; + var haveDiagnostics = true; + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function() { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = fetchUniformLocations( gl, program ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function() { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function() { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + }; + +} )(); + +// File:src/renderers/webgl/WebGLPrograms.js + +THREE.WebGLPrograms = function ( renderer, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "envMap", "envMapMode", + "lightMap", "aoMap", "emissiveMap", "bumpMap", "normalMap", "displacementMap", "specularMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "maxDirLights", "maxPointLights", + "maxSpotLights", "maxHemiLights", "maxShadows", "shadowMapEnabled", "pointLightShadows", + "shadowMapType", "shadowMapDebug", "alphaTest", "metal", "doubleSided", + "flipSided" + ]; + + + function allocateBones ( object ) { + + if ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = nVertexMatrices; + + if ( object !== undefined && object instanceof THREE.SkinnedMesh ) { + + maxBones = Math.min( object.skeleton.bones.length, maxBones ); + + if ( maxBones < object.skeleton.bones.length ) { + + console.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' ); + + } + + } + + return maxBones; + + } + + } + + function allocateLights( lights ) { + + var dirLights = 0; + var pointLights = 0; + var spotLights = 0; + var hemiLights = 0; + + for ( var l = 0, ll = lights.length; l < ll; l ++ ) { + + var light = lights[ l ]; + + if ( light.visible === false ) continue; + + if ( light instanceof THREE.DirectionalLight ) dirLights ++; + if ( light instanceof THREE.PointLight ) pointLights ++; + if ( light instanceof THREE.SpotLight ) spotLights ++; + if ( light instanceof THREE.HemisphereLight ) hemiLights ++; + + } + + return { 'directional': dirLights, 'point': pointLights, 'spot': spotLights, 'hemi': hemiLights }; + + } + + function allocateShadows( lights ) { + + var maxShadows = 0; + var pointLightShadows = 0; + + for ( var l = 0, ll = lights.length; l < ll; l ++ ) { + + var light = lights[ l ]; + + if ( ! light.castShadow ) continue; + + if ( light instanceof THREE.SpotLight || light instanceof THREE.DirectionalLight ) maxShadows ++; + if ( light instanceof THREE.PointLight ) { + + maxShadows ++; + pointLightShadows ++; + + } + + } + + return { 'maxShadows': maxShadows, 'pointLightShadows': pointLightShadows }; + + } + + this.getParameters = function ( material, lights, fog, object ) { + + var shaderID = shaderIDs[ material.type ]; + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxLightCount = allocateLights( lights ); + var allocatedShadows = allocateShadows( lights ); + var maxBones = allocateBones( object ); + var precision = renderer.getPrecision(); + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLRenderer.initMaterial:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + + map: !! material.map, + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: fog, + useFog: material.fog, + fogExp: fog instanceof THREE.FogExp2, + + flatShading: material.shading === THREE.FlatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + maxDirLights: maxLightCount.directional, + maxPointLights: maxLightCount.point, + maxSpotLights: maxLightCount.spot, + maxHemiLights: maxLightCount.hemi, + + maxShadows: allocatedShadows.maxShadows, + pointLightShadows: allocatedShadows.pointLightShadows, + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && allocatedShadows.maxShadows > 0, + shadowMapType: renderer.shadowMap.type, + shadowMapDebug: renderer.shadowMap.debug, + + alphaTest: material.alphaTest, + metal: material.metal, + doubleSided: material.side === THREE.DoubleSide, + flipSided: material.side === THREE.BackSide + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var chunks = []; + + if ( parameters.shaderID ) { + + chunks.push( parameters.shaderID ); + + } else { + + chunks.push( material.fragmentShader ); + chunks.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + chunks.push( name ); + chunks.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + var parameterName = parameterNames[ i ]; + chunks.push( parameterName ); + chunks.push( parameters[ parameterName ] ); + + } + + return chunks.join(); + + }; + + this.acquireProgram = function ( material, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new THREE.WebGLProgram( renderer, code, material, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + +}; + +// File:src/renderers/webgl/WebGLProperties.js + +/** +* @author fordacious / fordacious.github.io +*/ + +THREE.WebGLProperties = function () { + + var properties = {}; + + this.get = function ( object ) { + + var uuid = object.uuid; + var map = properties[ uuid ]; + + if ( map === undefined ) { + + map = {}; + properties[ uuid ] = map; + + } + + return map; + + }; + + this.delete = function ( object ) { + + delete properties[ object.uuid ]; + + }; + + this.clear = function () { + + properties = {}; + + }; + +}; + +// File:src/renderers/webgl/WebGLShader.js + +THREE.WebGLShader = ( function () { + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + return function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + }; + +} )(); + +// File:src/renderers/webgl/WebGLShadowMap.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) { + + var _gl = _renderer.context, + _state = _renderer.state, + _frustum = new THREE.Frustum(), + _projScreenMatrix = new THREE.Matrix4(), + + _min = new THREE.Vector3(), + _max = new THREE.Vector3(), + + _lookTarget = new THREE.Vector3(), + _lightPositionWorld = new THREE.Vector3(), + + _renderList = [], + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ); + + var cubeDirections = [ + new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( - 1, 0, 0 ), new THREE.Vector3( 0, 0, 1 ), + new THREE.Vector3( 0, 0, - 1 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), + new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 1 ), new THREE.Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new THREE.Vector4(), new THREE.Vector4(), new THREE.Vector4(), + new THREE.Vector4(), new THREE.Vector4(), new THREE.Vector4() + ]; + + var _vector4 = new THREE.Vector4(); + + // init + + var depthShader = THREE.ShaderLib[ "depthRGBA" ]; + var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms ); + + var distanceShader = THREE.ShaderLib[ "distanceRGBA" ]; + var distanceUniforms = THREE.UniformsUtils.clone( distanceShader.uniforms ); + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = new THREE.ShaderMaterial( { + uniforms: depthUniforms, + vertexShader: depthShader.vertexShader, + fragmentShader: depthShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning + } ); + + depthMaterial._shadowPass = true; + + _depthMaterials[ i ] = depthMaterial; + + var distanceMaterial = new THREE.ShaderMaterial( { + uniforms: distanceUniforms, + vertexShader: distanceShader.vertexShader, + fragmentShader: distanceShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning + } ); + + distanceMaterial._shadowPass = true; + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = THREE.PCFShadowMap; + this.cullFace = THREE.CullFaceFront; + + this.render = function ( scene ) { + + var faceCount, isPointLight; + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + // Set GL state for depth map. + _gl.clearColor( 1, 1, 1, 1 ); + _state.disable( _gl.BLEND ); + _state.enable( _gl.CULL_FACE ); + _gl.frontFace( _gl.CCW ); + _gl.cullFace( scope.cullFace === THREE.CullFaceFront ? _gl.FRONT : _gl.BACK ); + _state.setDepthTest( true ); + + // save the existing viewport so it can be restored later + _renderer.getViewport( _vector4 ); + + // render depth map + + for ( var i = 0, il = _lights.length; i < il; i ++ ) { + + var light = _lights[ i ]; + + if ( light.castShadow === true ) { + + var shadow = light.shadow; + var shadowCamera = shadow.camera; + var shadowMapSize = shadow.mapSize; + + if ( light instanceof THREE.PointLight ) { + + faceCount = 6; + isPointLight = true; + + var vpWidth = shadowMapSize.x / 4.0; + var vpHeight = shadowMapSize.y / 2.0; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + } else { + + faceCount = 1; + isPointLight = false; + + } + + if ( shadow.map === null ) { + + var shadowFilter = THREE.LinearFilter; + + if ( scope.type === THREE.PCFSoftShadowMap ) { + + shadowFilter = THREE.NearestFilter; + + } + + var pars = { minFilter: shadowFilter, magFilter: shadowFilter, format: THREE.RGBAFormat }; + + shadow.map = new THREE.WebGLRenderTarget( shadowMapSize.x, shadowMapSize.y, pars ); + shadow.matrix = new THREE.Matrix4(); + + // + + if ( light instanceof THREE.SpotLight ) { + + shadowCamera.aspect = shadowMapSize.x / shadowMapSize.y; + + } + + shadowCamera.updateProjectionMatrix(); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + var vpDimensions = cube2DViewPorts[ face ]; + _renderer.setViewport( vpDimensions.x, vpDimensions.y, vpDimensions.z, vpDimensions.w ); + + } else { + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + + } + + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + _renderList.length = 0; + + projectObject( scene, shadowCamera ); + + // render shadow map + // render regular objects + + for ( var j = 0, jl = _renderList.length; j < jl; j ++ ) { + + var object = _renderList[ j ]; + var geometry = _objects.update( object ); + var material = object.material; + + if ( material instanceof THREE.MeshFaceMaterial ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, _lights, null, geometry, depthMaterial, object, group ); + + } + + } + + } else { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, _lights, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + // We must call _renderer.resetGLState() at the end of each iteration of + // the light loop in order to force material updates for each light. + _renderer.resetGLState(); + + } + + } + + _renderer.setViewport( _vector4.x, _vector4.y, _vector4.z, _vector4.w ); + + // Restore GL state. + var clearColor = _renderer.getClearColor(), + clearAlpha = _renderer.getClearAlpha(); + _renderer.setClearColor( clearColor, clearAlpha ); + _state.enable( _gl.BLEND ); + + if ( scope.cullFace === THREE.CullFaceFront ) { + + _gl.cullFace( _gl.BACK ); + + } + + _renderer.resetGLState(); + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { + + var geometry = object.geometry; + + var newMaterial = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = geometry.morphTargets !== undefined && + geometry.morphTargets.length > 0 && material.morphTargets; + + var useSkinning = object instanceof THREE.SkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + newMaterial = materialVariants[ variantIndex ]; + + } else { + + newMaterial = customMaterial; + + } + + newMaterial.visible = material.visible; + newMaterial.wireframe = material.wireframe; + newMaterial.wireframeLinewidth = material.wireframeLinewidth; + + if ( isPointLight && newMaterial.uniforms.lightPos !== undefined ) { + + newMaterial.uniforms.lightPos.value.copy( lightPositionWorld ); + + } + + return newMaterial; + + } + + function projectObject( object, camera ) { + + if ( object.visible === false ) return; + + if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) { + + if ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) { + + var material = object.material; + + if ( material.visible === true ) { + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + _renderList.push( object ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera ); + + } + + } + +}; + +// File:src/renderers/webgl/WebGLState.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLState = function ( gl, extensions, paramThreeToGL ) { + + var _this = this; + + var newAttributes = new Uint8Array( 16 ); + var enabledAttributes = new Uint8Array( 16 ); + var attributeDivisors = new Uint8Array( 16 ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + + var currentDepthFunc = null; + var currentDepthWrite = null; + + var currentColorWrite = null; + + var currentFlipSided = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + + var currentTextureSlot = undefined; + var currentBoundTextures = {}; + + this.init = function () { + + gl.clearColor( 0, 0, 0, 1 ); + gl.clearDepth( 1 ); + gl.clearStencil( 0 ); + + this.enable( gl.DEPTH_TEST ); + gl.depthFunc( gl.LEQUAL ); + + gl.frontFace( gl.CCW ); + gl.cullFace( gl.BACK ); + this.enable( gl.CULL_FACE ); + + this.enable( gl.BLEND ); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA ); + + }; + + this.initAttributes = function () { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + }; + + this.enableAttribute = function ( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + }; + + this.enableAttributeAndDivisor = function ( attribute, meshPerAttribute, extension ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + }; + + this.disableUnusedAttributes = function () { + + for ( var i = 0, l = enabledAttributes.length; i < l; i ++ ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + }; + + this.enable = function ( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + }; + + this.disable = function ( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + }; + + this.getCompressedTextureFormats = function () { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + }; + + this.setBlending = function ( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha ) { + + if ( blending !== currentBlending ) { + + if ( blending === THREE.NoBlending ) { + + this.disable( gl.BLEND ); + + } else if ( blending === THREE.AdditiveBlending ) { + + this.enable( gl.BLEND ); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } else if ( blending === THREE.SubtractiveBlending ) { + + // TODO: Find blendFuncSeparate() combination + + this.enable( gl.BLEND ); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } else if ( blending === THREE.MultiplyBlending ) { + + // TODO: Find blendFuncSeparate() combination + + this.enable( gl.BLEND ); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } else if ( blending === THREE.CustomBlending ) { + + this.enable( gl.BLEND ); + + } else { + + this.enable( gl.BLEND ); + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + currentBlending = blending; + + } + + if ( blending === THREE.CustomBlending ) { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } else { + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } + + }; + + this.setDepthFunc = function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case THREE.NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case THREE.AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case THREE.LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case THREE.LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case THREE.EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case THREE.GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case THREE.GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case THREE.NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }; + + this.setDepthTest = function ( depthTest ) { + + if ( depthTest ) { + + this.enable( gl.DEPTH_TEST ); + + } else { + + this.disable( gl.DEPTH_TEST ); + + } + + }; + + this.setDepthWrite = function ( depthWrite ) { + + if ( currentDepthWrite !== depthWrite ) { + + gl.depthMask( depthWrite ); + currentDepthWrite = depthWrite; + + } + + }; + + this.setColorWrite = function ( colorWrite ) { + + if ( currentColorWrite !== colorWrite ) { + + gl.colorMask( colorWrite, colorWrite, colorWrite, colorWrite ); + currentColorWrite = colorWrite; + + } + + }; + + this.setFlipSided = function ( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + }; + + this.setLineWidth = function ( width ) { + + if ( width !== currentLineWidth ) { + + gl.lineWidth( width ); + + currentLineWidth = width; + + } + + }; + + this.setPolygonOffset = function ( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + this.enable( gl.POLYGON_OFFSET_FILL ); + + } else { + + this.disable( gl.POLYGON_OFFSET_FILL ); + + } + + if ( polygonOffset && ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + }; + + this.setScissorTest = function ( scissorTest ) { + + if ( scissorTest ) { + + this.enable( gl.SCISSOR_TEST ); + + } else { + + this.disable( gl.SCISSOR_TEST ); + + } + + }; + + // texture + + this.activeTexture = function ( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + this.bindTexture = function ( webglType, webglTexture ) { + + if ( currentTextureSlot === undefined ) { + + _this.activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + }; + + this.compressedTexImage2D = function () { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + }; + + this.texImage2D = function () { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + }; + + // + + this.reset = function () { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentBlending = null; + + currentDepthWrite = null; + currentColorWrite = null; + + currentFlipSided = null; + + }; + +}; + +// File:src/renderers/webgl/plugins/LensFlarePlugin.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.LensFlarePlugin = function ( renderer, flares ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + var hasVertexTexture; + + var tempTexture, occlusionTexture; + + function init() { + + var vertices = new Float32Array( [ + - 1, - 1, 0, 0, + 1, - 1, 1, 0, + 1, 1, 1, 1, + - 1, 1, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + // buffers + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + // textures + + tempTexture = gl.createTexture(); + occlusionTexture = gl.createTexture(); + + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + hasVertexTexture = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ) > 0; + + var shader; + + if ( hasVertexTexture ) { + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "uniform sampler2D occlusionMap;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", + + "vVisibility = visibility.r / 9.0;", + "vVisibility *= 1.0 - visibility.g / 9.0;", + "vVisibility *= visibility.b / 9.0;", + "vVisibility *= 1.0 - visibility.a / 9.0;", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * vVisibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + } else { + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "precision mediump float;", + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform sampler2D occlusionMap;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;", + "visibility = ( 1.0 - visibility / 4.0 );", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * visibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + } + + program = createProgram( shader ); + + attributes = { + vertex: gl.getAttribLocation ( program, "position" ), + uv: gl.getAttribLocation ( program, "uv" ) + }; + + uniforms = { + renderType: gl.getUniformLocation( program, "renderType" ), + map: gl.getUniformLocation( program, "map" ), + occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), + opacity: gl.getUniformLocation( program, "opacity" ), + color: gl.getUniformLocation( program, "color" ), + scale: gl.getUniformLocation( program, "scale" ), + rotation: gl.getUniformLocation( program, "rotation" ), + screenPosition: gl.getUniformLocation( program, "screenPosition" ) + }; + + } + + /* + * Render lens flares + * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, + * reads these back and calculates occlusion. + */ + + this.render = function ( scene, camera, viewportWidth, viewportHeight ) { + + if ( flares.length === 0 ) return; + + var tempPosition = new THREE.Vector3(); + + var invAspect = viewportHeight / viewportWidth, + halfViewportWidth = viewportWidth * 0.5, + halfViewportHeight = viewportHeight * 0.5; + + var size = 16 / viewportHeight, + scale = new THREE.Vector2( size * invAspect, size ); + + var screenPosition = new THREE.Vector3( 1, 1, 0 ), + screenPositionPixels = new THREE.Vector2( 1, 1 ); + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.vertex ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + // loop through all lens flares to update their occlusion and positions + // setup gl and common used attribs/uniforms + + gl.uniform1i( uniforms.occlusionMap, 0 ); + gl.uniform1i( uniforms.map, 1 ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + state.disable( gl.CULL_FACE ); + gl.depthMask( false ); + + for ( var i = 0, l = flares.length; i < l; i ++ ) { + + size = 16 / viewportHeight; + scale.set( size * invAspect, size ); + + // calc object screen position + + var flare = flares[ i ]; + + tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); + + tempPosition.applyMatrix4( camera.matrixWorldInverse ); + tempPosition.applyProjection( camera.projectionMatrix ); + + // setup arrays for gl programs + + screenPosition.copy( tempPosition ); + + screenPositionPixels.x = screenPosition.x * halfViewportWidth + halfViewportWidth; + screenPositionPixels.y = screenPosition.y * halfViewportHeight + halfViewportHeight; + + // screen cull + + if ( hasVertexTexture || ( + screenPositionPixels.x > 0 && + screenPositionPixels.x < viewportWidth && + screenPositionPixels.y > 0 && + screenPositionPixels.y < viewportHeight ) ) { + + // save current RGB to temp texture + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, null ); + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 ); + + + // render pink quad + + gl.uniform1i( uniforms.renderType, 0 ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + + state.disable( gl.BLEND ); + state.enable( gl.DEPTH_TEST ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // copy result to occlusionMap + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 ); + + + // restore graphics + + gl.uniform1i( uniforms.renderType, 1 ); + state.disable( gl.DEPTH_TEST ); + + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // update object positions + + flare.positionScreen.copy( screenPosition ); + + if ( flare.customUpdateCallback ) { + + flare.customUpdateCallback( flare ); + + } else { + + flare.updateLensFlares(); + + } + + // render flares + + gl.uniform1i( uniforms.renderType, 2 ); + state.enable( gl.BLEND ); + + for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { + + var sprite = flare.lensFlares[ j ]; + + if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { + + screenPosition.x = sprite.x; + screenPosition.y = sprite.y; + screenPosition.z = sprite.z; + + size = sprite.size * sprite.scale / viewportHeight; + + scale.x = size * invAspect; + scale.y = size; + + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform1f( uniforms.rotation, sprite.rotation ); + + gl.uniform1f( uniforms.opacity, sprite.opacity ); + gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); + + state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); + renderer.setTexture( sprite.texture, 1 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + } + + } + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + state.enable( gl.DEPTH_TEST ); + gl.depthMask( true ); + + renderer.resetGLState(); + + }; + + function createProgram ( shader ) { + + var program = gl.createProgram(); + + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + + var prefix = "precision " + renderer.getPrecision() + " float;\n"; + + gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); + gl.shaderSource( vertexShader, prefix + shader.vertexShader ); + + gl.compileShader( fragmentShader ); + gl.compileShader( vertexShader ); + + gl.attachShader( program, fragmentShader ); + gl.attachShader( program, vertexShader ); + + gl.linkProgram( program ); + + return program; + + } + +}; + +// File:src/renderers/webgl/plugins/SpritePlugin.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.SpritePlugin = function ( renderer, sprites ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new THREE.Vector3(); + var spriteRotation = new THREE.Quaternion(); + var spriteScale = new THREE.Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation ( program, 'position' ), + uv: gl.getAttribLocation ( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElement( 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new THREE.Texture( canvas ); + texture.needsUpdate = true; + + } + + this.render = function ( scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( fog instanceof THREE.Fog ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( fog instanceof THREE.FogExp2 ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + + if ( material.map && material.map.image && material.map.image.width ) { + + renderer.setTexture( material.map, 0 ); + + } else { + + renderer.setTexture( texture, 0 ); + + } + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + renderer.resetGLState(); + + }; + + function createProgram () { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vUV = uvOffset + uv * uvScale;', + + 'vec2 alignedPosition = position * scale;', + + 'vec2 rotatedPosition;', + 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + 'vec4 finalPosition;', + + 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + 'finalPosition.xy += rotatedPosition;', + 'finalPosition = projectionMatrix * finalPosition;', + + 'gl_Position = finalPosition;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vec4 texture = texture2D( map, vUV );', + + 'if ( texture.a < alphaTest ) discard;', + + 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + 'if ( fogType > 0 ) {', + + 'float depth = gl_FragCoord.z / gl_FragCoord.w;', + 'float fogFactor = 0.0;', + + 'if ( fogType == 1 ) {', + + 'fogFactor = smoothstep( fogNear, fogFar, depth );', + + '} else {', + + 'const float LOG2 = 1.442695;', + 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', + 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + '}', + + 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', + + '}', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable ( a, b ) { + + if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + +}; + +// File:src/extras/CurveUtils.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.CurveUtils = { + + tangentQuadraticBezier: function ( t, p0, p1, p2 ) { + + return 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 ); + + }, + + // Puay Bing, thanks for helping with this derivative! + + tangentCubicBezier: function ( t, p0, p1, p2, p3 ) { + + return - 3 * p0 * ( 1 - t ) * ( 1 - t ) + + 3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) + + 6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 + + 3 * t * t * p3; + + }, + + tangentSpline: function ( t, p0, p1, p2, p3 ) { + + // To check if my formulas are correct + + var h00 = 6 * t * t - 6 * t; // derived from 2t^3 − 3t^2 + 1 + var h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t + var h01 = - 6 * t * t + 6 * t; // − 2t3 + 3t2 + var h11 = 3 * t * t - 2 * t; // t3 − t2 + + return h00 + h10 + h01 + h11; + + }, + + // Catmull-Rom + + interpolate: function( p0, p1, p2, p3, t ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + +}; + +// File:src/extras/GeometryUtils.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + + var matrix; + + if ( geometry2 instanceof THREE.Mesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + +}; + +// File:src/extras/ImageUtils.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Daosheng Mu / https://github.com/DaoshengMu/ + */ + +THREE.ImageUtils = { + + crossOrigin: undefined, + + loadTexture: function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture is being deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new THREE.TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadTextureCube: function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube is being deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new THREE.CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadCompressedTexture: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ) + + }, + + loadCompressedTextureCube: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ) + + } + +}; + +// File:src/extras/SceneUtils.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.SceneUtils = { + + createMultiMaterialObject: function ( geometry, materials ) { + + var group = new THREE.Group(); + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + group.add( new THREE.Mesh( geometry, materials[ i ] ) ); + + } + + return group; + + }, + + detach: function ( child, parent, scene ) { + + child.applyMatrix( parent.matrixWorld ); + parent.remove( child ); + scene.add( child ); + + }, + + attach: function ( child, scene, parent ) { + + var matrixWorldInverse = new THREE.Matrix4(); + matrixWorldInverse.getInverse( parent.matrixWorld ); + child.applyMatrix( matrixWorldInverse ); + + scene.remove( child ); + parent.add( child ); + + } + +}; + +// File:src/extras/ShapeUtils.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + triangulate: ( function () { + + /** + * This code is a quick port of code written in C++ which was submitted to + * flipcode.com by John W. Ratcliff // July 22, 2000 + * See original code and more information here: + * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml + * + * ported to actionscript by Zevan Rosser + * www.actionsnippet.com + * + * ported to javascript by Joshua Koo + * http://www.lab4games.net/zz85/blog + * + */ + + function snip( contour, u, v, w, n, verts ) { + + var p; + var ax, ay, bx, by; + var cx, cy, px, py; + + ax = contour[ verts[ u ] ].x; + ay = contour[ verts[ u ] ].y; + + bx = contour[ verts[ v ] ].x; + by = contour[ verts[ v ] ].y; + + cx = contour[ verts[ w ] ].x; + cy = contour[ verts[ w ] ].y; + + if ( Number.EPSILON > ( ( ( bx - ax ) * ( cy - ay ) ) - ( ( by - ay ) * ( cx - ax ) ) ) ) return false; + + var aX, aY, bX, bY, cX, cY; + var apx, apy, bpx, bpy, cpx, cpy; + var cCROSSap, bCROSScp, aCROSSbp; + + aX = cx - bx; aY = cy - by; + bX = ax - cx; bY = ay - cy; + cX = bx - ax; cY = by - ay; + + for ( p = 0; p < n; p ++ ) { + + px = contour[ verts[ p ] ].x; + py = contour[ verts[ p ] ].y; + + if ( ( ( px === ax ) && ( py === ay ) ) || + ( ( px === bx ) && ( py === by ) ) || + ( ( px === cx ) && ( py === cy ) ) ) continue; + + apx = px - ax; apy = py - ay; + bpx = px - bx; bpy = py - by; + cpx = px - cx; cpy = py - cy; + + // see if p is inside triangle abc + + aCROSSbp = aX * bpy - aY * bpx; + cCROSSap = cX * apy - cY * apx; + bCROSScp = bX * cpy - bY * cpx; + + if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; + + } + + return true; + + } + + // takes in an contour array and returns + + return function ( contour, indices ) { + + var n = contour.length; + + if ( n < 3 ) return null; + + var result = [], + verts = [], + vertIndices = []; + + /* we want a counter-clockwise polygon in verts */ + + var u, v, w; + + if ( THREE.ShapeUtils.area( contour ) > 0.0 ) { + + for ( v = 0; v < n; v ++ ) verts[ v ] = v; + + } else { + + for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; + + } + + var nv = n; + + /* remove nv - 2 vertices, creating 1 triangle every time */ + + var count = 2 * nv; /* error detection */ + + for ( v = nv - 1; nv > 2; ) { + + /* if we loop, it is probably a non-simple polygon */ + + if ( ( count -- ) <= 0 ) { + + //** Triangulate: ERROR - probable bad polygon! + + //throw ( "Warning, unable to triangulate polygon!" ); + //return null; + // Sometimes warning is fine, especially polygons are triangulated in reverse. + console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); + + if ( indices ) return vertIndices; + return result; + + } + + /* three consecutive vertices in current polygon, */ + + u = v; if ( nv <= u ) u = 0; /* previous */ + v = u + 1; if ( nv <= v ) v = 0; /* new v */ + w = v + 1; if ( nv <= w ) w = 0; /* next */ + + if ( snip( contour, u, v, w, nv, verts ) ) { + + var a, b, c, s, t; + + /* true names of the vertices */ + + a = verts[ u ]; + b = verts[ v ]; + c = verts[ w ]; + + /* output Triangle */ + + result.push( [ contour[ a ], + contour[ b ], + contour[ c ] ] ); + + + vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); + + /* remove v from the remaining polygon */ + + for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { + + verts[ s ] = verts[ t ]; + + } + + nv --; + + /* reset error detection counter */ + + count = 2 * nv; + + } + + } + + if ( indices ) return vertIndices; + return result; + + } + + } )(), + + triangulateShape: function ( contour, holes ) { + + function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { + + // inOtherPt needs to be collinear to the inSegment + if ( inSegPt1.x !== inSegPt2.x ) { + + if ( inSegPt1.x < inSegPt2.x ) { + + return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); + + } else { + + return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); + + } + + } else { + + if ( inSegPt1.y < inSegPt2.y ) { + + return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); + + } else { + + return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); + + } + + } + + } + + function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { + + var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; + var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; + + var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; + var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; + + var limit = seg1dy * seg2dx - seg1dx * seg2dy; + var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; + + if ( Math.abs( limit ) > Number.EPSILON ) { + + // not parallel + + var perpSeg2; + if ( limit > 0 ) { + + if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; + + } else { + + if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; + + } + + // i.e. to reduce rounding errors + // intersection at endpoint of segment#1? + if ( perpSeg2 === 0 ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt1 ]; + + } + if ( perpSeg2 === limit ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt2 ]; + + } + // intersection at endpoint of segment#2? + if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; + if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; + + // return real intersection point + var factorSeg1 = perpSeg2 / limit; + return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, + y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; + + } else { + + // parallel or collinear + if ( ( perpSeg1 !== 0 ) || + ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; + + // they are collinear or degenerate + var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? + var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? + // both segments are points + if ( seg1Pt && seg2Pt ) { + + if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || + ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points + return [ inSeg1Pt1 ]; // they are the same point + + } + // segment#1 is a single point + if ( seg1Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 + return [ inSeg1Pt1 ]; + + } + // segment#2 is a single point + if ( seg2Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 + return [ inSeg2Pt1 ]; + + } + + // they are collinear segments, which might overlap + var seg1min, seg1max, seg1minVal, seg1maxVal; + var seg2min, seg2max, seg2minVal, seg2maxVal; + if ( seg1dx !== 0 ) { + + // the segments are NOT on a vertical line + if ( inSeg1Pt1.x < inSeg1Pt2.x ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; + + } + if ( inSeg2Pt1.x < inSeg2Pt2.x ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; + + } + + } else { + + // the segments are on a vertical line + if ( inSeg1Pt1.y < inSeg1Pt2.y ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; + + } + if ( inSeg2Pt1.y < inSeg2Pt2.y ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; + + } + + } + if ( seg1minVal <= seg2minVal ) { + + if ( seg1maxVal < seg2minVal ) return []; + if ( seg1maxVal === seg2minVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg2min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; + return [ seg2min, seg2max ]; + + } else { + + if ( seg1minVal > seg2maxVal ) return []; + if ( seg1minVal === seg2maxVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg1min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; + return [ seg1min, seg2max ]; + + } + + } + + } + + function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { + + // The order of legs is important + + // translation of all points, so that Vertex is at (0,0) + var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; + var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; + var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; + + // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. + var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; + var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; + + if ( Math.abs( from2toAngle ) > Number.EPSILON ) { + + // angle != 180 deg. + + var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; + // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); + + if ( from2toAngle > 0 ) { + + // main angle < 180 deg. + return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); + + } else { + + // main angle > 180 deg. + return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); + + } + + } else { + + // angle == 180 deg. + // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); + return ( from2otherAngle > 0 ); + + } + + } + + + function removeHoles( contour, holes ) { + + var shape = contour.concat(); // work on this shape + var hole; + + function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { + + // Check if hole point lies within angle around shape point + var lastShapeIdx = shape.length - 1; + + var prevShapeIdx = inShapeIdx - 1; + if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; + + var nextShapeIdx = inShapeIdx + 1; + if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; + + var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); + return false; + + } + + // Check if shape point lies within angle around hole point + var lastHoleIdx = hole.length - 1; + + var prevHoleIdx = inHoleIdx - 1; + if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; + + var nextHoleIdx = inHoleIdx + 1; + if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; + + insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); + return false; + + } + + return true; + + } + + function intersectsShapeEdge( inShapePt, inHolePt ) { + + // checks for intersections with shape edges + var sIdx, nextIdx, intersection; + for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { + + nextIdx = sIdx + 1; nextIdx %= shape.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + return false; + + } + + var indepHoles = []; + + function intersectsHoleEdge( inShapePt, inHolePt ) { + + // checks for intersections with hole edges + var ihIdx, chkHole, + hIdx, nextIdx, intersection; + for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { + + chkHole = holes[ indepHoles[ ihIdx ]]; + for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { + + nextIdx = hIdx + 1; nextIdx %= chkHole.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + } + return false; + + } + + var holeIndex, shapeIndex, + shapePt, holePt, + holeIdx, cutKey, failedCuts = [], + tmpShape1, tmpShape2, + tmpHole1, tmpHole2; + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + indepHoles.push( h ); + + } + + var minShapeIndex = 0; + var counter = indepHoles.length * 2; + while ( indepHoles.length > 0 ) { + + counter --; + if ( counter < 0 ) { + + console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); + break; + + } + + // search for shape-vertex and hole-vertex, + // which can be connected without intersections + for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { + + shapePt = shape[ shapeIndex ]; + holeIndex = - 1; + + // search for hole which can be reached without intersections + for ( var h = 0; h < indepHoles.length; h ++ ) { + + holeIdx = indepHoles[ h ]; + + // prevent multiple checks + cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; + if ( failedCuts[ cutKey ] !== undefined ) continue; + + hole = holes[ holeIdx ]; + for ( var h2 = 0; h2 < hole.length; h2 ++ ) { + + holePt = hole[ h2 ]; + if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; + if ( intersectsShapeEdge( shapePt, holePt ) ) continue; + if ( intersectsHoleEdge( shapePt, holePt ) ) continue; + + holeIndex = h2; + indepHoles.splice( h, 1 ); + + tmpShape1 = shape.slice( 0, shapeIndex + 1 ); + tmpShape2 = shape.slice( shapeIndex ); + tmpHole1 = hole.slice( holeIndex ); + tmpHole2 = hole.slice( 0, holeIndex + 1 ); + + shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); + + minShapeIndex = shapeIndex; + + // Debug only, to show the selected cuts + // glob_CutLines.push( [ shapePt, holePt ] ); + + break; + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + failedCuts[ cutKey ] = true; // remember failure + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + } + + } + + return shape; /* shape with no holes */ + + } + + + var i, il, f, face, + key, index, + allPointsMap = {}; + + // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. + + var allpoints = contour.concat(); + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + Array.prototype.push.apply( allpoints, holes[ h ] ); + + } + + //console.log( "allpoints",allpoints, allpoints.length ); + + // prepare all points map + + for ( i = 0, il = allpoints.length; i < il; i ++ ) { + + key = allpoints[ i ].x + ":" + allpoints[ i ].y; + + if ( allPointsMap[ key ] !== undefined ) { + + console.warn( "THREE.Shape: Duplicate point", key ); + + } + + allPointsMap[ key ] = i; + + } + + // remove holes by cutting paths to holes and adding them to the shape + var shapeWithoutHoles = removeHoles( contour, holes ); + + var triangles = THREE.ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape + //console.log( "triangles",triangles, triangles.length ); + + // check all face vertices against all points map + + for ( i = 0, il = triangles.length; i < il; i ++ ) { + + face = triangles[ i ]; + + for ( f = 0; f < 3; f ++ ) { + + key = face[ f ].x + ":" + face[ f ].y; + + index = allPointsMap[ key ]; + + if ( index !== undefined ) { + + face[ f ] = index; + + } + + } + + } + + return triangles.concat(); + + }, + + isClockWise: function ( pts ) { + + return THREE.ShapeUtils.area( pts ) < 0; + + }, + + // Bezier Curves formulas obtained from + // http://en.wikipedia.org/wiki/B%C3%A9zier_curve + + // Quad Bezier Functions + + b2: ( function () { + + function b2p0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function b2p1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function b2p2( t, p ) { + + return t * t * p; + + } + + return function ( t, p0, p1, p2 ) { + + return b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 ); + + }; + + } )(), + + // Cubic Bezier Functions + + b3: ( function () { + + function b3p0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function b3p1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function b3p2( t, p ) { + + var k = 1 - t; + return 3 * k * t * t * p; + + } + + function b3p3( t, p ) { + + return t * t * t * p; + + } + + return function ( t, p0, p1, p2, p3 ) { + + return b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 ); + + }; + + } )() + +}; + +// File:src/extras/audio/Audio.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Audio = function ( listener ) { + + THREE.Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + this.source = this.context.createBufferSource(); + this.source.onended = this.onEnded.bind( this ); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + this.autoplay = false; + + this.startTime = 0; + this.playbackRate = 1; + this.isPlaying = false; + +}; + +THREE.Audio.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Audio.prototype.constructor = THREE.Audio; + +THREE.Audio.prototype.load = function ( file ) { + + var scope = this; + + var request = new XMLHttpRequest(); + request.open( 'GET', file, true ); + request.responseType = 'arraybuffer'; + request.onload = function ( e ) { + + scope.context.decodeAudioData( this.response, function ( buffer ) { + + scope.source.buffer = buffer; + + if ( scope.autoplay ) scope.play(); + + } ); + + }; + request.send(); + + return this; + +}; + +THREE.Audio.prototype.play = function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.source.buffer; + source.loop = this.source.loop; + source.onended = this.source.onended; + source.start( 0, this.startTime ); + source.playbackRate.value = this.playbackRate; + + this.isPlaying = true; + + this.source = source; + + this.connect(); + +}; + +THREE.Audio.prototype.pause = function () { + + this.source.stop(); + this.startTime = this.context.currentTime; + +}; + +THREE.Audio.prototype.stop = function () { + + this.source.stop(); + this.startTime = 0; + +}; + +THREE.Audio.prototype.connect = function () { + + if ( this.filter !== undefined ) { + + this.source.connect( this.filter ); + this.filter.connect( this.panner ); + + } else { + + this.source.connect( this.panner ); + + } + +}; + +THREE.Audio.prototype.disconnect = function () { + + if ( this.filter !== undefined ) { + + this.source.disconnect( this.filter ); + this.filter.disconnect( this.panner ); + + } else { + + this.source.disconnect( this.panner ); + + } + +}; + +THREE.Audio.prototype.setFilter = function ( value ) { + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filter = value; + this.connect(); + + } else { + + this.filter = value; + + } + +}; + +THREE.Audio.prototype.getFilter = function () { + + return this.filter; + +}; + +THREE.Audio.prototype.setPlaybackRate = function ( value ) { + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.value = this.playbackRate; + + } + +}; + +THREE.Audio.prototype.getPlaybackRate = function () { + + return this.playbackRate; + +}; + +THREE.Audio.prototype.onEnded = function() { + + this.isPlaying = false; + +}; + +THREE.Audio.prototype.setLoop = function ( value ) { + + this.source.loop = value; + +}; + +THREE.Audio.prototype.getLoop = function () { + + return this.source.loop; + +}; + +THREE.Audio.prototype.setRefDistance = function ( value ) { + + this.panner.refDistance = value; + +}; + +THREE.Audio.prototype.getRefDistance = function () { + + return this.panner.refDistance; + +}; + +THREE.Audio.prototype.setRolloffFactor = function ( value ) { + + this.panner.rolloffFactor = value; + +}; + +THREE.Audio.prototype.getRolloffFactor = function () { + + return this.panner.rolloffFactor; + +}; + +THREE.Audio.prototype.setVolume = function ( value ) { + + this.gain.gain.value = value; + +}; + +THREE.Audio.prototype.getVolume = function () { + + return this.gain.gain.value; + +}; + +THREE.Audio.prototype.updateMatrixWorld = ( function () { + + var position = new THREE.Vector3(); + + return function updateMatrixWorld( force ) { + + THREE.Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + +} )(); + +// File:src/extras/audio/AudioListener.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.AudioListener = function () { + + THREE.Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = new ( window.AudioContext || window.webkitAudioContext )(); + +}; + +THREE.AudioListener.prototype = Object.create( THREE.Object3D.prototype ); +THREE.AudioListener.prototype.constructor = THREE.AudioListener; + +THREE.AudioListener.prototype.updateMatrixWorld = ( function () { + + var position = new THREE.Vector3(); + var quaternion = new THREE.Quaternion(); + var scale = new THREE.Vector3(); + + var orientation = new THREE.Vector3(); + + return function updateMatrixWorld( force ) { + + THREE.Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + }; + +} )(); + +// File:src/extras/core/Curve.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of Curve methods + * .getPoint(t), getTangent(t) + * .getPointAt(u), getTagentAt(u) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following classes subclasses THREE.Curve: + * + * -- 2d classes -- + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.CubicBezierCurve + * THREE.SplineCurve + * THREE.ArcCurve + * THREE.EllipseCurve + * + * -- 3d classes -- + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * THREE.CubicBezierCurve3 + * THREE.SplineCurve3 + * THREE.ClosedSplineCurve3 + * + * A series of curves can be represented as a THREE.CurvePath + * + **/ + +/************************************************************** + * Abstract Curve base class + **************************************************************/ + +THREE.Curve = function () { + +}; + +THREE.Curve.prototype = { + + constructor: THREE.Curve, + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( t ) { + + console.warn( "THREE.Curve: Warning, getPoint() not implemented!" ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( ! divisions ) divisions = 5; + + var d, pts = []; + + for ( d = 0; d <= divisions; d ++ ) { + + pts.push( this.getPoint( d / divisions ) ); + + } + + return pts; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( ! divisions ) divisions = 5; + + var d, pts = []; + + for ( d = 0; d <= divisions; d ++ ) { + + pts.push( this.getPointAt( d / divisions ) ); + + } + + return pts; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200; + + if ( this.cacheArcLengths + && ( this.cacheArcLengths.length === divisions + 1 ) + && ! this.needsUpdate ) { + + //console.log( "cached", this.cacheArcLengths ); + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint ( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum:sum }; Sum is in the last element. + + }, + + updateArcLengths: function() { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + //var time = Date.now(); + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + //console.log('b' , i, low, high, Date.now()- time); + + if ( arcLengths[ i ] === targetArcLength ) { + + var t = i / ( il - 1 ); + return t; + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + } + +} + +THREE.Curve.Utils = THREE.CurveUtils; // backwards compatibility + +// TODO: Transformation for Curves? + +/************************************************************** + * 3D Curves + **************************************************************/ + +// A Factory method for creating new curve subclasses + +THREE.Curve.create = function ( constructor, getPointFunc ) { + + constructor.prototype = Object.create( THREE.Curve.prototype ); + constructor.prototype.constructor = constructor; + constructor.prototype.getPoint = getPointFunc; + + return constructor; + +}; + +// File:src/extras/core/CurvePath.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + +/************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + +THREE.CurvePath = function () { + + this.curves = []; + + this.autoClose = false; // Automatically closes the path + +}; + +THREE.CurvePath.prototype = Object.create( THREE.Curve.prototype ); +THREE.CurvePath.prototype.constructor = THREE.CurvePath; + +THREE.CurvePath.prototype.add = function ( curve ) { + + this.curves.push( curve ); + +}; + +/* +THREE.CurvePath.prototype.checkConnection = function() { + // TODO + // If the ending of curve is not connected to the starting + // or the next curve, then, this is not a real path +}; +*/ + +THREE.CurvePath.prototype.closePath = function() { + + // TODO Test + // and verify for vector3 (needs to implement equals) + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new THREE.LineCurve( endPoint, startPoint ) ); + + } + +}; + +// To get accurate point with reference to +// entire path distance at time t, +// following has to be done: + +// 1. Length of each sub path have to be known +// 2. Locate and identify type of curve +// 3. Get t for the curve +// 4. Return curve.getPointAt(t') + +THREE.CurvePath.prototype.getPoint = function( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var u = 1 - diff / curve.getLength(); + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 0 ) { + + laste = points[ points.length - 1 ]; + + cpx0 = laste.x; + cpy0 = laste.y; + + } else { + + laste = this.actions[ i - 1 ].args; + + cpx0 = laste[ laste.length - 2 ]; + cpy0 = laste[ laste.length - 1 ]; + + } + + for ( var j = 1; j <= divisions; j ++ ) { + + var t = j / divisions; + + tx = b2( t, cpx0, cpx1, cpx ); + ty = b2( t, cpy0, cpy1, cpy ); + + points.push( new THREE.Vector2( tx, ty ) ); + + } + + break; + + case 'bezierCurveTo': + + cpx = args[ 4 ]; + cpy = args[ 5 ]; + + cpx1 = args[ 0 ]; + cpy1 = args[ 1 ]; + + cpx2 = args[ 2 ]; + cpy2 = args[ 3 ]; + + if ( points.length > 0 ) { + + laste = points[ points.length - 1 ]; + + cpx0 = laste.x; + cpy0 = laste.y; + + } else { + + laste = this.actions[ i - 1 ].args; + + cpx0 = laste[ laste.length - 2 ]; + cpy0 = laste[ laste.length - 1 ]; + + } + + + for ( var j = 1; j <= divisions; j ++ ) { + + var t = j / divisions; + + tx = b3( t, cpx0, cpx1, cpx2, cpx ); + ty = b3( t, cpy0, cpy1, cpy2, cpy ); + + points.push( new THREE.Vector2( tx, ty ) ); + + } + + break; + + case 'splineThru': + + laste = this.actions[ i - 1 ].args; + + var last = new THREE.Vector2( laste[ laste.length - 2 ], laste[ laste.length - 1 ] ); + var spts = [ last ]; + + var n = divisions * args[ 0 ].length; + + spts = spts.concat( args[ 0 ] ); + + var spline = new THREE.SplineCurve( spts ); + + for ( var j = 1; j <= n; j ++ ) { + + points.push( spline.getPointAt( j / n ) ); + + } + + break; + + case 'arc': + + var aX = args[ 0 ], aY = args[ 1 ], + aRadius = args[ 2 ], + aStartAngle = args[ 3 ], aEndAngle = args[ 4 ], + aClockwise = !! args[ 5 ]; + + var deltaAngle = aEndAngle - aStartAngle; + var angle; + var tdivisions = divisions * 2; + + for ( var j = 1; j <= tdivisions; j ++ ) { + + var t = j / tdivisions; + + if ( ! aClockwise ) { + + t = 1 - t; + + } + + angle = aStartAngle + t * deltaAngle; + + tx = aX + aRadius * Math.cos( angle ); + ty = aY + aRadius * Math.sin( angle ); + + //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty); + + points.push( new THREE.Vector2( tx, ty ) ); + + } + + //console.log(points); + + break; + + case 'ellipse': + + var aX = args[ 0 ], aY = args[ 1 ], + xRadius = args[ 2 ], + yRadius = args[ 3 ], + aStartAngle = args[ 4 ], aEndAngle = args[ 5 ], + aClockwise = !! args[ 6 ], + aRotation = args[ 7 ]; + + + var deltaAngle = aEndAngle - aStartAngle; + var angle; + var tdivisions = divisions * 2; + + var cos, sin; + if ( aRotation !== 0 ) { + + cos = Math.cos( aRotation ); + sin = Math.sin( aRotation ); + + } + + for ( var j = 1; j <= tdivisions; j ++ ) { + + var t = j / tdivisions; + + if ( ! aClockwise ) { + + t = 1 - t; + + } + + angle = aStartAngle + t * deltaAngle; + + tx = aX + xRadius * Math.cos( angle ); + ty = aY + yRadius * Math.sin( angle ); + + if ( aRotation !== 0 ) { + + var x = tx, y = ty; + + // Rotate the point about the center of the ellipse. + tx = ( x - aX ) * cos - ( y - aY ) * sin + aX; + ty = ( x - aX ) * sin + ( y - aY ) * cos + aY; + + } + + //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty); + + points.push( new THREE.Vector2( tx, ty ) ); + + } + + //console.log(points); + + break; + + } // end switch + + } + + + + // Normalize to remove the closing point by default. + var lastPoint = points[ points.length - 1 ]; + if ( Math.abs( lastPoint.x - points[ 0 ].x ) < Number.EPSILON && + Math.abs( lastPoint.y - points[ 0 ].y ) < Number.EPSILON ) + points.splice( points.length - 1, 1 ); + if ( closedPath ) { + + points.push( points[ 0 ] ); + + } + + return points; + +}; + +// +// Breaks path into shapes +// +// Assumptions (if parameter isCCW==true the opposite holds): +// - solid shapes are defined clockwise (CW) +// - holes are defined counterclockwise (CCW) +// +// If parameter noHoles==true: +// - all subPaths are regarded as solid shapes +// - definition order CW/CCW has no relevance +// + +THREE.Path.prototype.toShapes = function( isCCW, noHoles ) { + + function extractSubpaths( inActions ) { + + var subPaths = [], lastPath = new THREE.Path(); + + for ( var i = 0, l = inActions.length; i < l; i ++ ) { + + var item = inActions[ i ]; + + var args = item.args; + var action = item.action; + + if ( action === 'moveTo' ) { + + if ( lastPath.actions.length !== 0 ) { + + subPaths.push( lastPath ); + lastPath = new THREE.Path(); + + } + + } + + lastPath[ action ].apply( lastPath, args ); + + } + + if ( lastPath.actions.length !== 0 ) { + + subPaths.push( lastPath ); + + } + + // console.log(subPaths); + + return subPaths; + + } + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new THREE.Shape(); + tmpShape.actions = tmpPath.actions; + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + //console.log("shape", shapes); + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = THREE.ShapeUtils.isClockWise; + + var subPaths = extractSubpaths( this.actions ); + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new THREE.Shape(); + tmpShape.actions = tmpPath.actions; + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new THREE.Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.actions = tmpPath.actions; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + +}; + +// File:src/extras/core/Shape.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + +// STEP 1 Create a path. +// STEP 2 Turn path into shape. +// STEP 3 ExtrudeGeometry takes in Shape/Shapes +// STEP 3a - Extract points from each shape, turn to vertices +// STEP 3b - Triangulate each shape, add faces. + +THREE.Shape = function () { + + THREE.Path.apply( this, arguments ); + + this.holes = []; + +}; + +THREE.Shape.prototype = Object.create( THREE.Path.prototype ); +THREE.Shape.prototype.constructor = THREE.Shape; + +// Convenience method to return ExtrudeGeometry + +THREE.Shape.prototype.extrude = function ( options ) { + + return new THREE.ExtrudeGeometry( this, options ); + +}; + +// Convenience method to return ShapeGeometry + +THREE.Shape.prototype.makeGeometry = function ( options ) { + + return new THREE.ShapeGeometry( this, options ); + +}; + +// Get points of holes + +THREE.Shape.prototype.getPointsHoles = function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + +}; + + +// Get points of shape and holes (keypoints based on segments parameter) + +THREE.Shape.prototype.extractAllPoints = function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + +}; + +THREE.Shape.prototype.extractPoints = function ( divisions ) { + + return this.extractAllPoints( divisions ); + +}; + +THREE.Shape.Utils = THREE.ShapeUtils; // backwards compatibility + +// File:src/extras/curves/LineCurve.js + +/************************************************************** + * Line + **************************************************************/ + +THREE.LineCurve = function ( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + +}; + +THREE.LineCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.LineCurve.prototype.constructor = THREE.LineCurve; + +THREE.LineCurve.prototype.getPoint = function ( t ) { + + var point = this.v2.clone().sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + return point; + +}; + +// Line curve is linear, so we can overwrite default getPointAt + +THREE.LineCurve.prototype.getPointAt = function ( u ) { + + return this.getPoint( u ); + +}; + +THREE.LineCurve.prototype.getTangent = function( t ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + +}; + +// File:src/extras/curves/QuadraticBezierCurve.js + +/************************************************************** + * Quadratic Bezier curve + **************************************************************/ + + +THREE.QuadraticBezierCurve = function ( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + +}; + +THREE.QuadraticBezierCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.QuadraticBezierCurve.prototype.constructor = THREE.QuadraticBezierCurve; + + +THREE.QuadraticBezierCurve.prototype.getPoint = function ( t ) { + + var b2 = THREE.ShapeUtils.b2; + + return new THREE.Vector2( + b2( t, this.v0.x, this.v1.x, this.v2.x ), + b2( t, this.v0.y, this.v1.y, this.v2.y ) + ); + +}; + + +THREE.QuadraticBezierCurve.prototype.getTangent = function( t ) { + + var tangentQuadraticBezier = THREE.CurveUtils.tangentQuadraticBezier; + + return new THREE.Vector2( + tangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ), + tangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y ) + ).normalize(); + +}; + +// File:src/extras/curves/CubicBezierCurve.js + +/************************************************************** + * Cubic Bezier curve + **************************************************************/ + +THREE.CubicBezierCurve = function ( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + +}; + +THREE.CubicBezierCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.CubicBezierCurve.prototype.constructor = THREE.CubicBezierCurve; + +THREE.CubicBezierCurve.prototype.getPoint = function ( t ) { + + var b3 = THREE.ShapeUtils.b3; + + return new THREE.Vector2( + b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ) + ); + +}; + +THREE.CubicBezierCurve.prototype.getTangent = function( t ) { + + var tangentCubicBezier = THREE.CurveUtils.tangentCubicBezier; + + return new THREE.Vector2( + tangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + tangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ) + ).normalize(); + +}; + +// File:src/extras/curves/SplineCurve.js + +/************************************************************** + * Spline curve + **************************************************************/ + +THREE.SplineCurve = function ( points /* array of Vector2 */ ) { + + this.points = ( points == undefined ) ? [] : points; + +}; + +THREE.SplineCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.SplineCurve.prototype.constructor = THREE.SplineCurve; + +THREE.SplineCurve.prototype.getPoint = function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + var interpolate = THREE.CurveUtils.interpolate; + + return new THREE.Vector2( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ) + ); + +}; + +// File:src/extras/curves/EllipseCurve.js + +/************************************************************** + * Ellipse curve + **************************************************************/ + +THREE.EllipseCurve = function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation || 0; + +}; + +THREE.EllipseCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.EllipseCurve.prototype.constructor = THREE.EllipseCurve; + +THREE.EllipseCurve.prototype.getPoint = function ( t ) { + + var deltaAngle = this.aEndAngle - this.aStartAngle; + + if ( deltaAngle < 0 ) deltaAngle += Math.PI * 2; + if ( deltaAngle > Math.PI * 2 ) deltaAngle -= Math.PI * 2; + + var angle; + + if ( this.aClockwise === true ) { + + angle = this.aEndAngle + ( 1 - t ) * ( Math.PI * 2 - deltaAngle ); + + } else { + + angle = this.aStartAngle + t * deltaAngle; + + } + + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x, ty = y; + + // Rotate the point about the center of the ellipse. + x = ( tx - this.aX ) * cos - ( ty - this.aY ) * sin + this.aX; + y = ( tx - this.aX ) * sin + ( ty - this.aY ) * cos + this.aY; + + } + + return new THREE.Vector2( x, y ); + +}; + +// File:src/extras/curves/ArcCurve.js + +/************************************************************** + * Arc curve + **************************************************************/ + +THREE.ArcCurve = function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + THREE.EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + +}; + +THREE.ArcCurve.prototype = Object.create( THREE.EllipseCurve.prototype ); +THREE.ArcCurve.prototype.constructor = THREE.ArcCurve; + +// File:src/extras/curves/LineCurve3.js + +/************************************************************** + * Line3D + **************************************************************/ + +THREE.LineCurve3 = THREE.Curve.create( + + function ( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + + }, + + function ( t ) { + + var vector = new THREE.Vector3(); + + vector.subVectors( this.v2, this.v1 ); // diff + vector.multiplyScalar( t ); + vector.add( this.v1 ); + + return vector; + + } + +); + +// File:src/extras/curves/QuadraticBezierCurve3.js + +/************************************************************** + * Quadratic Bezier 3D curve + **************************************************************/ + +THREE.QuadraticBezierCurve3 = THREE.Curve.create( + + function ( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + }, + + function ( t ) { + + var b2 = THREE.ShapeUtils.b2; + + return new THREE.Vector3( + b2( t, this.v0.x, this.v1.x, this.v2.x ), + b2( t, this.v0.y, this.v1.y, this.v2.y ), + b2( t, this.v0.z, this.v1.z, this.v2.z ) + ); + + } + +); + +// File:src/extras/curves/CubicBezierCurve3.js + +/************************************************************** + * Cubic Bezier 3D curve + **************************************************************/ + +THREE.CubicBezierCurve3 = THREE.Curve.create( + + function ( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + }, + + function ( t ) { + + var b3 = THREE.ShapeUtils.b3; + + return new THREE.Vector3( + b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ), + b3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z ) + ); + + } + +); + +// File:src/extras/curves/SplineCurve3.js + +/************************************************************** + * Spline 3D curve + **************************************************************/ + + +THREE.SplineCurve3 = THREE.Curve.create( + + function ( points /* array of Vector3 */ ) { + + console.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' ); + this.points = ( points == undefined ) ? [] : points; + + }, + + function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + var interpolate = THREE.CurveUtils.interpolate; + + return new THREE.Vector3( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ), + interpolate( point0.z, point1.z, point2.z, point3.z, weight ) + ); + + } + +); + +// File:src/extras/curves/CatmullRomCurve3.js + +/** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + +THREE.CatmullRomCurve3 = ( function() { + + var + tmp = new THREE.Vector3(), + px = new CubicPoly(), + py = new CubicPoly(), + pz = new CubicPoly(); + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + } + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + CubicPoly.prototype.init = function( x0, x1, t0, t1 ) { + + this.c0 = x0; + this.c1 = t0; + this.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + this.c3 = 2 * x0 - 2 * x1 + t0 + t1; + + }; + + CubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + // initCubicPoly + this.init( x1, x2, t1, t2 ); + + }; + + // standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4 + CubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) { + + this.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }; + + CubicPoly.prototype.calc = function( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3; + + }; + + // Subclass Three.js curve + return THREE.Curve.create( + + function ( p /* array of Vector3 */ ) { + + this.points = p || []; + + }, + + function ( t ) { + + var points = this.points, + point, intPoint, weight, l; + + l = points.length; + + if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); + + point = ( l - 1 ) * t; + intPoint = Math.floor( point ); + weight = point - intPoint; + + if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; + + if ( intPoint === 0 ) { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } else { + + p0 = points[ intPoint - 1 ]; + + } + + p1 = points[ intPoint ]; + p2 = points[ intPoint + 1 ]; + + if ( intPoint + 2 < l ) { + + p3 = points[ intPoint + 2 ] + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 2 ] ); + p3 = tmp; + + } + + if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.type === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.type === 'catmullrom' ) { + + var tension = this.tension !== undefined ? this.tension : 0.5; + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); + + } + + var v = new THREE.Vector3( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return v; + + } + + ); + +} )(); + +// File:src/extras/curves/ClosedSplineCurve3.js + +/************************************************************** + * Closed Spline 3D curve + **************************************************************/ + + +THREE.ClosedSplineCurve3 = THREE.Curve.create( + + function ( points /* array of Vector3 */ ) { + + this.points = ( points == undefined ) ? [] : points; + + }, + + function ( t ) { + + var points = this.points; + var point = ( points.length - 0 ) * t; // This needs to be from 0-length +1 + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; + + var point0 = points[ ( intPoint - 1 ) % points.length ]; + var point1 = points[ ( intPoint ) % points.length ]; + var point2 = points[ ( intPoint + 1 ) % points.length ]; + var point3 = points[ ( intPoint + 2 ) % points.length ]; + + var interpolate = THREE.CurveUtils.interpolate; + + return new THREE.Vector3( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ), + interpolate( point0.z, point1.z, point2.z, point3.z, weight ) + ); + + } + +); + +// File:src/extras/geometries/BoxGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as + */ + +THREE.BoxGeometry = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + THREE.Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.widthSegments = widthSegments || 1; + this.heightSegments = heightSegments || 1; + this.depthSegments = depthSegments || 1; + + var scope = this; + + var width_half = width / 2; + var height_half = height / 2; + var depth_half = depth / 2; + + buildPlane( 'z', 'y', - 1, - 1, depth, height, width_half, 0 ); // px + buildPlane( 'z', 'y', 1, - 1, depth, height, - width_half, 1 ); // nx + buildPlane( 'x', 'z', 1, 1, width, depth, height_half, 2 ); // py + buildPlane( 'x', 'z', 1, - 1, width, depth, - height_half, 3 ); // ny + buildPlane( 'x', 'y', 1, - 1, width, height, depth_half, 4 ); // pz + buildPlane( 'x', 'y', - 1, - 1, width, height, - depth_half, 5 ); // nz + + function buildPlane( u, v, udir, vdir, width, height, depth, materialIndex ) { + + var w, ix, iy, + gridX = scope.widthSegments, + gridY = scope.heightSegments, + width_half = width / 2, + height_half = height / 2, + offset = scope.vertices.length; + + if ( ( u === 'x' && v === 'y' ) || ( u === 'y' && v === 'x' ) ) { + + w = 'z'; + + } else if ( ( u === 'x' && v === 'z' ) || ( u === 'z' && v === 'x' ) ) { + + w = 'y'; + gridY = scope.depthSegments; + + } else if ( ( u === 'z' && v === 'y' ) || ( u === 'y' && v === 'z' ) ) { + + w = 'x'; + gridX = scope.depthSegments; + + } + + var gridX1 = gridX + 1, + gridY1 = gridY + 1, + segment_width = width / gridX, + segment_height = height / gridY, + normal = new THREE.Vector3(); + + normal[ w ] = depth > 0 ? 1 : - 1; + + for ( iy = 0; iy < gridY1; iy ++ ) { + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var vector = new THREE.Vector3(); + vector[ u ] = ( ix * segment_width - width_half ) * udir; + vector[ v ] = ( iy * segment_height - height_half ) * vdir; + vector[ w ] = depth; + + scope.vertices.push( vector ); + + } + + } + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + var uva = new THREE.Vector2( ix / gridX, 1 - iy / gridY ); + var uvb = new THREE.Vector2( ix / gridX, 1 - ( iy + 1 ) / gridY ); + var uvc = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - ( iy + 1 ) / gridY ); + var uvd = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - iy / gridY ); + + var face = new THREE.Face3( a + offset, b + offset, d + offset ); + face.normal.copy( normal ); + face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() ); + face.materialIndex = materialIndex; + + scope.faces.push( face ); + scope.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); + + face = new THREE.Face3( b + offset, c + offset, d + offset ); + face.normal.copy( normal ); + face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() ); + face.materialIndex = materialIndex; + + scope.faces.push( face ); + scope.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); + + } + + } + + } + + this.mergeVertices(); + +}; + +THREE.BoxGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.BoxGeometry.prototype.constructor = THREE.BoxGeometry; + +THREE.BoxGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.BoxGeometry( + parameters.width, + parameters.height, + parameters.depth, + parameters.widthSegments, + parameters.heightSegments, + parameters.depthSegments + ); + +}; + +THREE.CubeGeometry = THREE.BoxGeometry; // backwards compatibility + +// File:src/extras/geometries/CircleGeometry.js + +/** + * @author hughes + */ + +THREE.CircleGeometry = function ( radius, segments, thetaStart, thetaLength ) { + + THREE.Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new THREE.CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + +}; + +THREE.CircleGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.CircleGeometry.prototype.constructor = THREE.CircleGeometry; + +THREE.CircleGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.CircleGeometry( + parameters.radius, + parameters.segments, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/CircleBufferGeometry.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.CircleBufferGeometry = function ( radius, segments, thetaStart, thetaLength ) { + + THREE.BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + var vertices = segments + 2; + + var positions = new Float32Array( vertices * 3 ); + var normals = new Float32Array( vertices * 3 ); + var uvs = new Float32Array( vertices * 2 ); + + // center data is already zero, but need to set a few extras + normals[ 2 ] = 1.0; + uvs[ 0 ] = 0.5; + uvs[ 1 ] = 0.5; + + for ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) { + + var segment = thetaStart + s / segments * thetaLength; + + positions[ i ] = radius * Math.cos( segment ); + positions[ i + 1 ] = radius * Math.sin( segment ); + + normals[ i + 2 ] = 1; // normal z + + uvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2; + uvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2; + + } + + var indices = []; + + for ( var i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + this.setIndex( new THREE.BufferAttribute( new Uint16Array( indices ), 1 ) ); + this.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) ); + this.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) ); + + this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); + +}; + +THREE.CircleBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.CircleBufferGeometry.prototype.constructor = THREE.CircleBufferGeometry; + +THREE.CircleBufferGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.CircleBufferGeometry( + parameters.radius, + parameters.segments, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/CylinderGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.CylinderGeometry = function ( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + THREE.Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radiusTop = radiusTop !== undefined ? radiusTop : 20; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; + height = height !== undefined ? height : 100; + + radialSegments = radialSegments || 8; + heightSegments = heightSegments || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : 2 * Math.PI; + + var heightHalf = height / 2; + + var x, y, vertices = [], uvs = []; + + for ( y = 0; y <= heightSegments; y ++ ) { + + var verticesRow = []; + var uvsRow = []; + + var v = y / heightSegments; + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var vertex = new THREE.Vector3(); + vertex.x = radius * Math.sin( u * thetaLength + thetaStart ); + vertex.y = - v * height + heightHalf; + vertex.z = radius * Math.cos( u * thetaLength + thetaStart ); + + this.vertices.push( vertex ); + + verticesRow.push( this.vertices.length - 1 ); + uvsRow.push( new THREE.Vector2( u, 1 - v ) ); + + } + + vertices.push( verticesRow ); + uvs.push( uvsRow ); + + } + + var tanTheta = ( radiusBottom - radiusTop ) / height; + var na, nb; + + for ( x = 0; x < radialSegments; x ++ ) { + + if ( radiusTop !== 0 ) { + + na = this.vertices[ vertices[ 0 ][ x ] ].clone(); + nb = this.vertices[ vertices[ 0 ][ x + 1 ] ].clone(); + + } else { + + na = this.vertices[ vertices[ 1 ][ x ] ].clone(); + nb = this.vertices[ vertices[ 1 ][ x + 1 ] ].clone(); + + } + + na.setY( Math.sqrt( na.x * na.x + na.z * na.z ) * tanTheta ).normalize(); + nb.setY( Math.sqrt( nb.x * nb.x + nb.z * nb.z ) * tanTheta ).normalize(); + + for ( y = 0; y < heightSegments; y ++ ) { + + var v1 = vertices[ y ][ x ]; + var v2 = vertices[ y + 1 ][ x ]; + var v3 = vertices[ y + 1 ][ x + 1 ]; + var v4 = vertices[ y ][ x + 1 ]; + + var n1 = na.clone(); + var n2 = na.clone(); + var n3 = nb.clone(); + var n4 = nb.clone(); + + var uv1 = uvs[ y ][ x ].clone(); + var uv2 = uvs[ y + 1 ][ x ].clone(); + var uv3 = uvs[ y + 1 ][ x + 1 ].clone(); + var uv4 = uvs[ y ][ x + 1 ].clone(); + + this.faces.push( new THREE.Face3( v1, v2, v4, [ n1, n2, n4 ] ) ); + this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv4 ] ); + + this.faces.push( new THREE.Face3( v2, v3, v4, [ n2.clone(), n3, n4.clone() ] ) ); + this.faceVertexUvs[ 0 ].push( [ uv2.clone(), uv3, uv4.clone() ] ); + + } + + } + + // top cap + + if ( openEnded === false && radiusTop > 0 ) { + + this.vertices.push( new THREE.Vector3( 0, heightHalf, 0 ) ); + + for ( x = 0; x < radialSegments; x ++ ) { + + var v1 = vertices[ 0 ][ x ]; + var v2 = vertices[ 0 ][ x + 1 ]; + var v3 = this.vertices.length - 1; + + var n1 = new THREE.Vector3( 0, 1, 0 ); + var n2 = new THREE.Vector3( 0, 1, 0 ); + var n3 = new THREE.Vector3( 0, 1, 0 ); + + var uv1 = uvs[ 0 ][ x ].clone(); + var uv2 = uvs[ 0 ][ x + 1 ].clone(); + var uv3 = new THREE.Vector2( uv2.x, 0 ); + + this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ], undefined, 1 ) ); + this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); + + } + + } + + // bottom cap + + if ( openEnded === false && radiusBottom > 0 ) { + + this.vertices.push( new THREE.Vector3( 0, - heightHalf, 0 ) ); + + for ( x = 0; x < radialSegments; x ++ ) { + + var v1 = vertices[ heightSegments ][ x + 1 ]; + var v2 = vertices[ heightSegments ][ x ]; + var v3 = this.vertices.length - 1; + + var n1 = new THREE.Vector3( 0, - 1, 0 ); + var n2 = new THREE.Vector3( 0, - 1, 0 ); + var n3 = new THREE.Vector3( 0, - 1, 0 ); + + var uv1 = uvs[ heightSegments ][ x + 1 ].clone(); + var uv2 = uvs[ heightSegments ][ x ].clone(); + var uv3 = new THREE.Vector2( uv2.x, 1 ); + + this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ], undefined, 2 ) ); + this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); + + } + + } + + this.computeFaceNormals(); + +}; + +THREE.CylinderGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.CylinderGeometry.prototype.constructor = THREE.CylinderGeometry; + +THREE.CylinderGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.CylinderGeometry( + parameters.radiusTop, + parameters.radiusBottom, + parameters.height, + parameters.radialSegments, + parameters.heightSegments, + parameters.openEnded, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/EdgesGeometry.js + +/** + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.EdgesGeometry = function ( geometry, thresholdAngle ) { + + THREE.BufferGeometry.call( this ); + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + var thresholdDot = Math.cos( THREE.Math.degToRad( thresholdAngle ) ); + + var edge = [ 0, 0 ], hash = {}; + + function sortFunction( a, b ) { + + return a - b; + + } + + var keys = [ 'a', 'b', 'c' ]; + + var geometry2; + + if ( geometry instanceof THREE.BufferGeometry ) { + + geometry2 = new THREE.Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var vertices = geometry2.vertices; + var faces = geometry2.faces; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + hash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + hash[ key ].face2 = i; + + } + + } + + } + + var coords = []; + + for ( var key in hash ) { + + var h = hash[ key ]; + + if ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) { + + var vertex = vertices[ h.vert1 ]; + coords.push( vertex.x ); + coords.push( vertex.y ); + coords.push( vertex.z ); + + vertex = vertices[ h.vert2 ]; + coords.push( vertex.x ); + coords.push( vertex.y ); + coords.push( vertex.z ); + + } + + } + + this.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( coords ), 3 ) ); + +}; + +THREE.EdgesGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.EdgesGeometry.prototype.constructor = THREE.EdgesGeometry; + +// File:src/extras/geometries/ExtrudeGeometry.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined) + * frames: // containing arrays of tangents, normals, binormals + * + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + +THREE.ExtrudeGeometry = function ( shapes, options ) { + + if ( typeof( shapes ) === "undefined" ) { + + shapes = []; + return; + + } + + THREE.Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + +}; + +THREE.ExtrudeGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.ExtrudeGeometry.prototype.constructor = THREE.ExtrudeGeometry; + +THREE.ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) { + + var sl = shapes.length; + + for ( var s = 0; s < sl; s ++ ) { + + var shape = shapes[ s ]; + this.addShape( shape, options ); + + } + +}; + +THREE.ExtrudeGeometry.prototype.addShape = function ( shape, options ) { + + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var steps = options.steps !== undefined ? options.steps : 1; + + var extrudePath = options.extrudePath; + var extrudePts, extrudeByPath = false; + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator; + + var splineTube, binormal, normal, position2; + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // Reuse TNB from TubeGeomtry for now. + // TODO1 - have a .isClosed in spline? + + splineTube = options.frames !== undefined ? options.frames : new THREE.TubeGeometry.FrenetFrames( extrudePath, steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new THREE.Vector3(); + normal = new THREE.Vector3(); + position2 = new THREE.Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + var scope = this; + + var shapesOffset = this.vertices.length; + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! THREE.ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( THREE.ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! + + } + + + var faces = THREE.ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2 ( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new THREE.Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new THREE.Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * ( 1 - t ); + + //z = bevelThickness * t; + bs = bevelSize * ( Math.sin ( t * Math.PI / 2 ) ); // curved + //bs = bevelSize * t; // linear + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * ( 1 - t ); + //bs = bevelSize * ( 1-Math.sin ( ( 1 - t ) * Math.PI/2 ) ); + bs = bevelSize * Math.sin ( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d, contour, s, sl, j, k ); + + } + + } + + } + + + function v( x, y, z ) { + + scope.vertices.push( new THREE.Vector3( x, y, z ) ); + + } + + function f3( a, b, c ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + + scope.faces.push( new THREE.Face3( a, b, c, null, null, 0 ) ); + + var uvs = uvgen.generateTopUV( scope, a, b, c ); + + scope.faceVertexUvs[ 0 ].push( uvs ); + + } + + function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + d += shapesOffset; + + scope.faces.push( new THREE.Face3( a, b, d, null, null, 1 ) ); + scope.faces.push( new THREE.Face3( b, c, d, null, null, 1 ) ); + + var uvs = uvgen.generateSideWallUV( scope, a, b, c, d ); + + scope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] ); + scope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] ); + + } + +}; + +THREE.ExtrudeGeometry.WorldUVGenerator = { + + generateTopUV: function ( geometry, indexA, indexB, indexC ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + + return [ + new THREE.Vector2( a.x, a.y ), + new THREE.Vector2( b.x, b.y ), + new THREE.Vector2( c.x, c.y ) + ]; + + }, + + generateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + var d = vertices[ indexD ]; + + if ( Math.abs( a.y - b.y ) < 0.01 ) { + + return [ + new THREE.Vector2( a.x, 1 - a.z ), + new THREE.Vector2( b.x, 1 - b.z ), + new THREE.Vector2( c.x, 1 - c.z ), + new THREE.Vector2( d.x, 1 - d.z ) + ]; + + } else { + + return [ + new THREE.Vector2( a.y, 1 - a.z ), + new THREE.Vector2( b.y, 1 - b.z ), + new THREE.Vector2( c.y, 1 - c.z ), + new THREE.Vector2( d.y, 1 - d.z ) + ]; + + } + + } +}; + +// File:src/extras/geometries/ShapeGeometry.js + +/** + * @author jonobr1 / http://jonobr1.com + * + * Creates a one-sided polygonal geometry from a path shape. Similar to + * ExtrudeGeometry. + * + * parameters = { + * + * curveSegments: , // number of points on the curves. NOT USED AT THE MOMENT. + * + * material: // material index for front and back faces + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + +THREE.ShapeGeometry = function ( shapes, options ) { + + THREE.Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( Array.isArray( shapes ) === false ) shapes = [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + +}; + +THREE.ShapeGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.ShapeGeometry.prototype.constructor = THREE.ShapeGeometry; + +/** + * Add an array of shapes to THREE.ShapeGeometry. + */ +THREE.ShapeGeometry.prototype.addShapeList = function ( shapes, options ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + this.addShape( shapes[ i ], options ); + + } + + return this; + +}; + +/** + * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry. + */ +THREE.ShapeGeometry.prototype.addShape = function ( shape, options ) { + + if ( options === undefined ) options = {}; + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var material = options.material; + var uvgen = options.UVGenerator === undefined ? THREE.ExtrudeGeometry.WorldUVGenerator : options.UVGenerator; + + // + + var i, l, hole; + + var shapesOffset = this.vertices.length; + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! THREE.ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe... + + for ( i = 0, l = holes.length; i < l; i ++ ) { + + hole = holes[ i ]; + + if ( THREE.ShapeUtils.isClockWise( hole ) ) { + + holes[ i ] = hole.reverse(); + + } + + } + + reverse = false; + + } + + var faces = THREE.ShapeUtils.triangulateShape( vertices, holes ); + + // Vertices + + for ( i = 0, l = holes.length; i < l; i ++ ) { + + hole = holes[ i ]; + vertices = vertices.concat( hole ); + + } + + // + + var vert, vlen = vertices.length; + var face, flen = faces.length; + + for ( i = 0; i < vlen; i ++ ) { + + vert = vertices[ i ]; + + this.vertices.push( new THREE.Vector3( vert.x, vert.y, 0 ) ); + + } + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + + var a = face[ 0 ] + shapesOffset; + var b = face[ 1 ] + shapesOffset; + var c = face[ 2 ] + shapesOffset; + + this.faces.push( new THREE.Face3( a, b, c, null, null, material ) ); + this.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) ); + + } + +}; + +// File:src/extras/geometries/LatheGeometry.js + +/** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + */ + +// points - to create a closed torus, one must use a set of points +// like so: [ a, b, c, d, a ], see first is the same as last. +// segments - the number of circumference segments to create +// phiStart - the starting radian +// phiLength - the radian (0 to 2*PI) range of the lathed section +// 2*pi is a closed lathe, less than 2PI is a portion. + +THREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) { + + THREE.Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = segments || 12; + phiStart = phiStart || 0; + phiLength = phiLength || 2 * Math.PI; + + var inversePointLength = 1.0 / ( points.length - 1 ); + var inverseSegments = 1.0 / segments; + + for ( var i = 0, il = segments; i <= il; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var c = Math.cos( phi ), + s = Math.sin( phi ); + + for ( var j = 0, jl = points.length; j < jl; j ++ ) { + + var pt = points[ j ]; + + var vertex = new THREE.Vector3(); + + vertex.x = c * pt.x - s * pt.y; + vertex.y = s * pt.x + c * pt.y; + vertex.z = pt.z; + + this.vertices.push( vertex ); + + } + + } + + var np = points.length; + + for ( var i = 0, il = segments; i < il; i ++ ) { + + for ( var j = 0, jl = points.length - 1; j < jl; j ++ ) { + + var base = j + np * i; + var a = base; + var b = base + np; + var c = base + 1 + np; + var d = base + 1; + + var u0 = i * inverseSegments; + var v0 = j * inversePointLength; + var u1 = u0 + inverseSegments; + var v1 = v0 + inversePointLength; + + this.faces.push( new THREE.Face3( a, b, d ) ); + + this.faceVertexUvs[ 0 ].push( [ + + new THREE.Vector2( u0, v0 ), + new THREE.Vector2( u1, v0 ), + new THREE.Vector2( u0, v1 ) + + ] ); + + this.faces.push( new THREE.Face3( b, c, d ) ); + + this.faceVertexUvs[ 0 ].push( [ + + new THREE.Vector2( u1, v0 ), + new THREE.Vector2( u1, v1 ), + new THREE.Vector2( u0, v1 ) + + ] ); + + + } + + } + + this.mergeVertices(); + this.computeFaceNormals(); + this.computeVertexNormals(); + +}; + +THREE.LatheGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.LatheGeometry.prototype.constructor = THREE.LatheGeometry; + +// File:src/extras/geometries/PlaneGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + +THREE.PlaneGeometry = function ( width, height, widthSegments, heightSegments ) { + + THREE.Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new THREE.PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + +}; + +THREE.PlaneGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.PlaneGeometry.prototype.constructor = THREE.PlaneGeometry; + +THREE.PlaneGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.PlaneGeometry( + parameters.width, + parameters.height, + parameters.widthSegments, + parameters.heightSegments + ); + +}; + +// File:src/extras/geometries/PlaneBufferGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + +THREE.PlaneBufferGeometry = function ( width, height, widthSegments, heightSegments ) { + + THREE.BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var vertices = new Float32Array( gridX1 * gridY1 * 3 ); + var normals = new Float32Array( gridX1 * gridY1 * 3 ); + var uvs = new Float32Array( gridX1 * gridY1 * 2 ); + + var offset = 0; + var offset2 = 0; + + for ( var iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( var ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices[ offset ] = x; + vertices[ offset + 1 ] = - y; + + normals[ offset + 2 ] = 1; + + uvs[ offset2 ] = ix / gridX; + uvs[ offset2 + 1 ] = 1 - ( iy / gridY ); + + offset += 3; + offset2 += 2; + + } + + } + + offset = 0; + + var indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 ); + + for ( var iy = 0; iy < gridY; iy ++ ) { + + for ( var ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + indices[ offset ] = a; + indices[ offset + 1 ] = b; + indices[ offset + 2 ] = d; + + indices[ offset + 3 ] = b; + indices[ offset + 4 ] = c; + indices[ offset + 5 ] = d; + + offset += 6; + + } + + } + + this.setIndex( new THREE.BufferAttribute( indices, 1 ) ); + this.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) ); + +}; + +THREE.PlaneBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.PlaneBufferGeometry.prototype.constructor = THREE.PlaneBufferGeometry; + +THREE.PlaneBufferGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.PlaneBufferGeometry( + parameters.width, + parameters.height, + parameters.widthSegments, + parameters.heightSegments + ); + +}; + +// File:src/extras/geometries/RingGeometry.js + +/** + * @author Kaleb Murphy + */ + +THREE.RingGeometry = function ( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + THREE.Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 0; + outerRadius = outerRadius || 50; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 8; + + var i, o, uvs = [], radius = innerRadius, radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + + for ( i = 0; i < phiSegments + 1; i ++ ) { + + // concentric circles inside ring + + for ( o = 0; o < thetaSegments + 1; o ++ ) { + + // number of segments per circle + + var vertex = new THREE.Vector3(); + var segment = thetaStart + o / thetaSegments * thetaLength; + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + this.vertices.push( vertex ); + uvs.push( new THREE.Vector2( ( vertex.x / outerRadius + 1 ) / 2, ( vertex.y / outerRadius + 1 ) / 2 ) ); + + } + + radius += radiusStep; + + } + + var n = new THREE.Vector3( 0, 0, 1 ); + + for ( i = 0; i < phiSegments; i ++ ) { + + // concentric circles inside ring + + var thetaSegment = i * ( thetaSegments + 1 ); + + for ( o = 0; o < thetaSegments ; o ++ ) { + + // number of segments per circle + + var segment = o + thetaSegment; + + var v1 = segment; + var v2 = segment + thetaSegments + 1; + var v3 = segment + thetaSegments + 2; + + this.faces.push( new THREE.Face3( v1, v2, v3, [ n.clone(), n.clone(), n.clone() ] ) ); + this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ].clone(), uvs[ v2 ].clone(), uvs[ v3 ].clone() ] ); + + v1 = segment; + v2 = segment + thetaSegments + 2; + v3 = segment + 1; + + this.faces.push( new THREE.Face3( v1, v2, v3, [ n.clone(), n.clone(), n.clone() ] ) ); + this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ].clone(), uvs[ v2 ].clone(), uvs[ v3 ].clone() ] ); + + } + + } + + this.computeFaceNormals(); + + this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); + +}; + +THREE.RingGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.RingGeometry.prototype.constructor = THREE.RingGeometry; + +THREE.RingGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.RingGeometry( + parameters.innerRadius, + parameters.outerRadius, + parameters.thetaSegments, + parameters.phiSegments, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/SphereGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.SphereGeometry = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + THREE.Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new THREE.SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + +}; + +THREE.SphereGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.SphereGeometry.prototype.constructor = THREE.SphereGeometry; + +THREE.SphereGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.SphereGeometry( + parameters.radius, + parameters.widthSegments, + parameters.heightSegments, + parameters.phiStart, + parameters.phiLength, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/SphereBufferGeometry.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + * based on THREE.SphereGeometry + */ + +THREE.SphereBufferGeometry = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + THREE.BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) ); + + var positions = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new THREE.BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + var index = 0, vertices = [], normal = new THREE.Vector3(); + + for ( var y = 0; y <= heightSegments; y ++ ) { + + var verticesRow = []; + + var v = y / heightSegments; + + for ( var x = 0; x <= widthSegments; x ++ ) { + + var u = x / widthSegments; + + var px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + var py = radius * Math.cos( thetaStart + v * thetaLength ); + var pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + normal.set( px, py, pz ).normalize(); + + positions.setXYZ( index, px, py, pz ); + normals.setXYZ( index, normal.x, normal.y, normal.z ); + uvs.setXY( index, u, 1 - v ); + + verticesRow.push( index ); + + index ++; + + } + + vertices.push( verticesRow ); + + } + + var indices = []; + + for ( var y = 0; y < heightSegments; y ++ ) { + + for ( var x = 0; x < widthSegments; x ++ ) { + + var v1 = vertices[ y ][ x + 1 ]; + var v2 = vertices[ y ][ x ]; + var v3 = vertices[ y + 1 ][ x ]; + var v4 = vertices[ y + 1 ][ x + 1 ]; + + if ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 ); + if ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 ); + + } + + } + + this.setIndex( new ( positions.count > 65535 ? THREE.Uint32Attribute : THREE.Uint16Attribute )( indices, 1 ) ); + this.addAttribute( 'position', positions ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); + +}; + +THREE.SphereBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.SphereBufferGeometry.prototype.constructor = THREE.SphereBufferGeometry; + +THREE.SphereBufferGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.SphereBufferGeometry( + parameters.radius, + parameters.widthSegments, + parameters.heightSegments, + parameters.phiStart, + parameters.phiLength, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/TorusGeometry.js + +/** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888 + */ + +THREE.TorusGeometry = function ( radius, tube, radialSegments, tubularSegments, arc ) { + + THREE.Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = radialSegments || 8; + tubularSegments = tubularSegments || 6; + arc = arc || Math.PI * 2; + + var center = new THREE.Vector3(), uvs = [], normals = []; + + for ( var j = 0; j <= radialSegments; j ++ ) { + + for ( var i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + + var vertex = new THREE.Vector3(); + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + this.vertices.push( vertex ); + + uvs.push( new THREE.Vector2( i / tubularSegments, j / radialSegments ) ); + normals.push( vertex.clone().sub( center ).normalize() ); + + } + + } + + for ( var j = 1; j <= radialSegments; j ++ ) { + + for ( var i = 1; i <= tubularSegments; i ++ ) { + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + var face = new THREE.Face3( a, b, d, [ normals[ a ].clone(), normals[ b ].clone(), normals[ d ].clone() ] ); + this.faces.push( face ); + this.faceVertexUvs[ 0 ].push( [ uvs[ a ].clone(), uvs[ b ].clone(), uvs[ d ].clone() ] ); + + face = new THREE.Face3( b, c, d, [ normals[ b ].clone(), normals[ c ].clone(), normals[ d ].clone() ] ); + this.faces.push( face ); + this.faceVertexUvs[ 0 ].push( [ uvs[ b ].clone(), uvs[ c ].clone(), uvs[ d ].clone() ] ); + + } + + } + + this.computeFaceNormals(); + +}; + +THREE.TorusGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.TorusGeometry.prototype.constructor = THREE.TorusGeometry; + +THREE.TorusGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.TorusGeometry( + parameters.radius, + parameters.tube, + parameters.radialSegments, + parameters.tubularSegments, + parameters.arc + ); + +}; + +// File:src/extras/geometries/TorusKnotGeometry.js + +/** + * @author oosmoxiecode + * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473 + */ + +THREE.TorusKnotGeometry = function ( radius, tube, radialSegments, tubularSegments, p, q, heightScale ) { + + THREE.Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + p: p, + q: q, + heightScale: heightScale + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = radialSegments || 64; + tubularSegments = tubularSegments || 8; + p = p || 2; + q = q || 3; + heightScale = heightScale || 1; + + var grid = new Array( radialSegments ); + var tang = new THREE.Vector3(); + var n = new THREE.Vector3(); + var bitan = new THREE.Vector3(); + + for ( var i = 0; i < radialSegments; ++ i ) { + + grid[ i ] = new Array( tubularSegments ); + var u = i / radialSegments * 2 * p * Math.PI; + var p1 = getPos( u, q, p, radius, heightScale ); + var p2 = getPos( u + 0.01, q, p, radius, heightScale ); + tang.subVectors( p2, p1 ); + n.addVectors( p2, p1 ); + + bitan.crossVectors( tang, n ); + n.crossVectors( bitan, tang ); + bitan.normalize(); + n.normalize(); + + for ( var j = 0; j < tubularSegments; ++ j ) { + + var v = j / tubularSegments * 2 * Math.PI; + var cx = - tube * Math.cos( v ); // TODO: Hack: Negating it so it faces outside. + var cy = tube * Math.sin( v ); + + var pos = new THREE.Vector3(); + pos.x = p1.x + cx * n.x + cy * bitan.x; + pos.y = p1.y + cx * n.y + cy * bitan.y; + pos.z = p1.z + cx * n.z + cy * bitan.z; + + grid[ i ][ j ] = this.vertices.push( pos ) - 1; + + } + + } + + for ( var i = 0; i < radialSegments; ++ i ) { + + for ( var j = 0; j < tubularSegments; ++ j ) { + + var ip = ( i + 1 ) % radialSegments; + var jp = ( j + 1 ) % tubularSegments; + + var a = grid[ i ][ j ]; + var b = grid[ ip ][ j ]; + var c = grid[ ip ][ jp ]; + var d = grid[ i ][ jp ]; + + var uva = new THREE.Vector2( i / radialSegments, j / tubularSegments ); + var uvb = new THREE.Vector2( ( i + 1 ) / radialSegments, j / tubularSegments ); + var uvc = new THREE.Vector2( ( i + 1 ) / radialSegments, ( j + 1 ) / tubularSegments ); + var uvd = new THREE.Vector2( i / radialSegments, ( j + 1 ) / tubularSegments ); + + this.faces.push( new THREE.Face3( a, b, d ) ); + this.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); + + this.faces.push( new THREE.Face3( b, c, d ) ); + this.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); + + } + + } + + this.computeFaceNormals(); + this.computeVertexNormals(); + + function getPos( u, in_q, in_p, radius, heightScale ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = in_q / in_p * u; + var cs = Math.cos( quOverP ); + + var tx = radius * ( 2 + cs ) * 0.5 * cu; + var ty = radius * ( 2 + cs ) * su * 0.5; + var tz = heightScale * radius * Math.sin( quOverP ) * 0.5; + + return new THREE.Vector3( tx, ty, tz ); + + } + +}; + +THREE.TorusKnotGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.TorusKnotGeometry.prototype.constructor = THREE.TorusKnotGeometry; + +THREE.TorusKnotGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.TorusKnotGeometry( + parameters.radius, + parameters.tube, + parameters.radialSegments, + parameters.tubularSegments, + parameters.p, + parameters.q, + parameters.heightScale + ); + +}; + +// File:src/extras/geometries/TubeGeometry.js + +/** + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * + * Modified from the TorusKnotGeometry by @oosmoxiecode + * + * Creates a tube which extrudes along a 3d spline + * + * Uses parallel transport frames as described in + * http://www.cs.indiana.edu/pub/techreports/TR425.pdf + */ + +THREE.TubeGeometry = function ( path, segments, radius, radialSegments, closed, taper ) { + + THREE.Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + segments: segments, + radius: radius, + radialSegments: radialSegments, + closed: closed, + taper: taper + }; + + segments = segments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + taper = taper || THREE.TubeGeometry.NoTaper; + + var grid = []; + + var scope = this, + + tangent, + normal, + binormal, + + numpoints = segments + 1, + + u, v, r, + + cx, cy, + pos, pos2 = new THREE.Vector3(), + i, j, + ip, jp, + a, b, c, d, + uva, uvb, uvc, uvd; + + var frames = new THREE.TubeGeometry.FrenetFrames( path, segments, closed ), + tangents = frames.tangents, + normals = frames.normals, + binormals = frames.binormals; + + // proxy internals + this.tangents = tangents; + this.normals = normals; + this.binormals = binormals; + + function vert( x, y, z ) { + + return scope.vertices.push( new THREE.Vector3( x, y, z ) ) - 1; + + } + + // construct the grid + + for ( i = 0; i < numpoints; i ++ ) { + + grid[ i ] = []; + + u = i / ( numpoints - 1 ); + + pos = path.getPointAt( u ); + + tangent = tangents[ i ]; + normal = normals[ i ]; + binormal = binormals[ i ]; + + r = radius * taper( u ); + + for ( j = 0; j < radialSegments; j ++ ) { + + v = j / radialSegments * 2 * Math.PI; + + cx = - r * Math.cos( v ); // TODO: Hack: Negating it so it faces outside. + cy = r * Math.sin( v ); + + pos2.copy( pos ); + pos2.x += cx * normal.x + cy * binormal.x; + pos2.y += cx * normal.y + cy * binormal.y; + pos2.z += cx * normal.z + cy * binormal.z; + + grid[ i ][ j ] = vert( pos2.x, pos2.y, pos2.z ); + + } + + } + + + // construct the mesh + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < radialSegments; j ++ ) { + + ip = ( closed ) ? ( i + 1 ) % segments : i + 1; + jp = ( j + 1 ) % radialSegments; + + a = grid[ i ][ j ]; // *** NOT NECESSARILY PLANAR ! *** + b = grid[ ip ][ j ]; + c = grid[ ip ][ jp ]; + d = grid[ i ][ jp ]; + + uva = new THREE.Vector2( i / segments, j / radialSegments ); + uvb = new THREE.Vector2( ( i + 1 ) / segments, j / radialSegments ); + uvc = new THREE.Vector2( ( i + 1 ) / segments, ( j + 1 ) / radialSegments ); + uvd = new THREE.Vector2( i / segments, ( j + 1 ) / radialSegments ); + + this.faces.push( new THREE.Face3( a, b, d ) ); + this.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); + + this.faces.push( new THREE.Face3( b, c, d ) ); + this.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); + + } + + } + + this.computeFaceNormals(); + this.computeVertexNormals(); + +}; + +THREE.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.TubeGeometry.prototype.constructor = THREE.TubeGeometry; +THREE.TubeGeometry.prototype.clone = function() { + + return new this.constructor( this.parameters.path, + this.parameters.segments, this.parameters.radius, this.parameters.radialSegments, + this.parameters.closed, this.parameters.taper + ); + +}; + +THREE.TubeGeometry.NoTaper = function ( u ) { + + return 1; + +}; + +THREE.TubeGeometry.SinusoidalTaper = function ( u ) { + + return Math.sin( Math.PI * u ); + +}; + +// For computing of Frenet frames, exposing the tangents, normals and binormals the spline +THREE.TubeGeometry.FrenetFrames = function ( path, segments, closed ) { + + var normal = new THREE.Vector3(), + + tangents = [], + normals = [], + binormals = [], + + vec = new THREE.Vector3(), + mat = new THREE.Matrix4(), + + numpoints = segments + 1, + theta, + smallest, + + tx, ty, tz, + i, u; + + + // expose internals + this.tangents = tangents; + this.normals = normals; + this.binormals = binormals; + + // compute the tangent vectors for each segment on the path + + for ( i = 0; i < numpoints; i ++ ) { + + u = i / ( numpoints - 1 ); + + tangents[ i ] = path.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + initialNormal3(); + + /* + function initialNormal1(lastBinormal) { + // fixed start binormal. Has dangers of 0 vectors + normals[ 0 ] = new THREE.Vector3(); + binormals[ 0 ] = new THREE.Vector3(); + if (lastBinormal===undefined) lastBinormal = new THREE.Vector3( 0, 0, 1 ); + normals[ 0 ].crossVectors( lastBinormal, tangents[ 0 ] ).normalize(); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize(); + } + + function initialNormal2() { + + // This uses the Frenet-Serret formula for deriving binormal + var t2 = path.getTangentAt( epsilon ); + + normals[ 0 ] = new THREE.Vector3().subVectors( t2, tangents[ 0 ] ).normalize(); + binormals[ 0 ] = new THREE.Vector3().crossVectors( tangents[ 0 ], normals[ 0 ] ); + + normals[ 0 ].crossVectors( binormals[ 0 ], tangents[ 0 ] ).normalize(); // last binormal x tangent + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize(); + + } + */ + + function initialNormal3() { + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the smallest tangent xyz component + + normals[ 0 ] = new THREE.Vector3(); + binormals[ 0 ] = new THREE.Vector3(); + smallest = Number.MAX_VALUE; + tx = Math.abs( tangents[ 0 ].x ); + ty = Math.abs( tangents[ 0 ].y ); + tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= smallest ) { + + smallest = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= smallest ) { + + smallest = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= smallest ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + } + + + // compute the slowly-varying normal and binormal vectors for each segment on the path + + for ( i = 1; i < numpoints; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( THREE.Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed ) { + + theta = Math.acos( THREE.Math.clamp( normals[ 0 ].dot( normals[ numpoints - 1 ] ), - 1, 1 ) ); + theta /= ( numpoints - 1 ); + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ numpoints - 1 ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i < numpoints; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + +}; + +// File:src/extras/geometries/PolyhedronGeometry.js + +/** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.PolyhedronGeometry = function ( vertices, indices, radius, detail ) { + + THREE.Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + var that = this; + + for ( var i = 0, l = vertices.length; i < l; i += 3 ) { + + prepare( new THREE.Vector3( vertices[ i ], vertices[ i + 1 ], vertices[ i + 2 ] ) ); + + } + + var p = this.vertices; + + var faces = []; + + for ( var i = 0, j = 0, l = indices.length; i < l; i += 3, j ++ ) { + + var v1 = p[ indices[ i ] ]; + var v2 = p[ indices[ i + 1 ] ]; + var v3 = p[ indices[ i + 2 ] ]; + + faces[ j ] = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ], undefined, j ); + + } + + var centroid = new THREE.Vector3(); + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + subdivide( faces[ i ], detail ); + + } + + + // Handle case when face straddles the seam + + for ( var i = 0, l = this.faceVertexUvs[ 0 ].length; i < l; i ++ ) { + + var uvs = this.faceVertexUvs[ 0 ][ i ]; + + var x0 = uvs[ 0 ].x; + var x1 = uvs[ 1 ].x; + var x2 = uvs[ 2 ].x; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + if ( max > 0.9 && min < 0.1 ) { + + // 0.9 is somewhat arbitrary + + if ( x0 < 0.2 ) uvs[ 0 ].x += 1; + if ( x1 < 0.2 ) uvs[ 1 ].x += 1; + if ( x2 < 0.2 ) uvs[ 2 ].x += 1; + + } + + } + + + // Apply radius + + for ( var i = 0, l = this.vertices.length; i < l; i ++ ) { + + this.vertices[ i ].multiplyScalar( radius ); + + } + + + // Merge vertices + + this.mergeVertices(); + + this.computeFaceNormals(); + + this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); + + + // Project vector onto sphere's surface + + function prepare( vector ) { + + var vertex = vector.normalize().clone(); + vertex.index = that.vertices.push( vertex ) - 1; + + // Texture coords are equivalent to map coords, calculate angle and convert to fraction of a circle. + + var u = azimuth( vector ) / 2 / Math.PI + 0.5; + var v = inclination( vector ) / Math.PI + 0.5; + vertex.uv = new THREE.Vector2( u, 1 - v ); + + return vertex; + + } + + + // Approximate a curved face with recursively sub-divided triangles. + + function make( v1, v2, v3, materialIndex ) { + + var face = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ], undefined, materialIndex ); + that.faces.push( face ); + + centroid.copy( v1 ).add( v2 ).add( v3 ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + that.faceVertexUvs[ 0 ].push( [ + correctUV( v1.uv, v1, azi ), + correctUV( v2.uv, v2, azi ), + correctUV( v3.uv, v3, azi ) + ] ); + + } + + + // Analytically subdivide a face to the required detail level. + + function subdivide( face, detail ) { + + var cols = Math.pow( 2, detail ); + var a = prepare( that.vertices[ face.a ] ); + var b = prepare( that.vertices[ face.b ] ); + var c = prepare( that.vertices[ face.c ] ); + var v = []; + + var materialIndex = face.materialIndex; + + // Construct all of the vertices for this subdivision. + + for ( var i = 0 ; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = prepare( a.clone().lerp( c, i / cols ) ); + var bj = prepare( b.clone().lerp( c, i / cols ) ); + var rows = cols - i; + + for ( var j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = prepare( aj.clone().lerp( bj, j / rows ) ); + + } + + } + + } + + // Construct all of the faces. + + for ( var i = 0; i < cols ; i ++ ) { + + for ( var j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + make( + v[ i ][ k + 1 ], + v[ i + 1 ][ k ], + v[ i ][ k ], + materialIndex + ); + + } else { + + make( + v[ i ][ k + 1 ], + v[ i + 1 ][ k + 1 ], + v[ i + 1 ][ k ], + materialIndex + ); + + } + + } + + } + + } + + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + + // Texture fixing helper. Spheres have some odd behaviours. + + function correctUV( uv, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) uv = new THREE.Vector2( uv.x - 1, uv.y ); + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) uv = new THREE.Vector2( azimuth / 2 / Math.PI + 0.5, uv.y ); + return uv.clone(); + + } + + +}; + +THREE.PolyhedronGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.PolyhedronGeometry.prototype.constructor = THREE.PolyhedronGeometry; + +THREE.PolyhedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.PolyhedronGeometry( + parameters.vertices, + parameters.indices, + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/DodecahedronGeometry.js + +/** + * @author Abe Pazos / https://hamoid.com + */ + +THREE.DodecahedronGeometry = function ( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±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, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + THREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +}; + +THREE.DodecahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype ); +THREE.DodecahedronGeometry.prototype.constructor = THREE.DodecahedronGeometry; + +THREE.DodecahedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.DodecahedronGeometry( + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/IcosahedronGeometry.js + +/** + * @author timothypratley / https://github.com/timothypratley + */ + +THREE.IcosahedronGeometry = function ( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + THREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +}; + +THREE.IcosahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype ); +THREE.IcosahedronGeometry.prototype.constructor = THREE.IcosahedronGeometry; + +THREE.IcosahedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.IcosahedronGeometry( + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/OctahedronGeometry.js + +/** + * @author timothypratley / https://github.com/timothypratley + */ + +THREE.OctahedronGeometry = function ( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 + ]; + + THREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +}; + +THREE.OctahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype ); +THREE.OctahedronGeometry.prototype.constructor = THREE.OctahedronGeometry; + +THREE.OctahedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.OctahedronGeometry( + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/TetrahedronGeometry.js + +/** + * @author timothypratley / https://github.com/timothypratley + */ + +THREE.TetrahedronGeometry = function ( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + THREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +}; + +THREE.TetrahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype ); +THREE.TetrahedronGeometry.prototype.constructor = THREE.TetrahedronGeometry; + +THREE.TetrahedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.TetrahedronGeometry( + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/ParametricGeometry.js + +/** + * @author zz85 / https://github.com/zz85 + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + * + * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements ); + * + */ + +THREE.ParametricGeometry = function ( func, slices, stacks ) { + + THREE.Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + var verts = this.vertices; + var faces = this.faces; + var uvs = this.faceVertexUvs[ 0 ]; + + var i, j, p; + var u, v; + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + u = j / slices; + + p = func( u, v ); + verts.push( p ); + + } + + } + + var a, b, c, d; + var uva, uvb, uvc, uvd; + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + a = i * sliceCount + j; + b = i * sliceCount + j + 1; + c = ( i + 1 ) * sliceCount + j + 1; + d = ( i + 1 ) * sliceCount + j; + + uva = new THREE.Vector2( j / slices, i / stacks ); + uvb = new THREE.Vector2( ( j + 1 ) / slices, i / stacks ); + uvc = new THREE.Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks ); + uvd = new THREE.Vector2( j / slices, ( i + 1 ) / stacks ); + + faces.push( new THREE.Face3( a, b, d ) ); + uvs.push( [ uva, uvb, uvd ] ); + + faces.push( new THREE.Face3( b, c, d ) ); + uvs.push( [ uvb.clone(), uvc, uvd.clone() ] ); + + } + + } + + // console.log(this); + + // magic bullet + // var diff = this.mergeVertices(); + // console.log('removed ', diff, ' vertices by merging'); + + this.computeFaceNormals(); + this.computeVertexNormals(); + +}; + +THREE.ParametricGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.ParametricGeometry.prototype.constructor = THREE.ParametricGeometry; + +// File:src/extras/geometries/WireframeGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.WireframeGeometry = function ( geometry ) { + + THREE.BufferGeometry.call( this ); + + var edge = [ 0, 0 ], hash = {}; + + function sortFunction( a, b ) { + + return a - b; + + } + + var keys = [ 'a', 'b', 'c' ]; + + if ( geometry instanceof THREE.Geometry ) { + + var vertices = geometry.vertices; + var faces = geometry.faces; + var numEdges = 0; + + // allocate maximal size + var edges = new Uint32Array( 6 * faces.length ); + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + edges[ 2 * numEdges ] = edge[ 0 ]; + edges[ 2 * numEdges + 1 ] = edge[ 1 ]; + hash[ key ] = true; + numEdges ++; + + } + + } + + } + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numEdges; i < l; i ++ ) { + + for ( var j = 0; j < 2; j ++ ) { + + var vertex = vertices[ edges [ 2 * i + j ] ]; + + var index = 6 * i + 3 * j; + coords[ index + 0 ] = vertex.x; + coords[ index + 1 ] = vertex.y; + coords[ index + 2 ] = vertex.z; + + } + + } + + this.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) ); + + } else if ( geometry instanceof THREE.BufferGeometry ) { + + if ( geometry.index !== null ) { + + // Indexed BufferGeometry + + var indices = geometry.index.array; + var vertices = geometry.attributes.position; + var drawcalls = geometry.drawcalls; + var numEdges = 0; + + if ( drawcalls.length === 0 ) { + + geometry.addGroup( 0, indices.length ); + + } + + // allocate maximal size + var edges = new Uint32Array( 2 * indices.length ); + + for ( var o = 0, ol = drawcalls.length; o < ol; ++ o ) { + + var drawcall = drawcalls[ o ]; + + var start = drawcall.start; + var count = drawcall.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = indices[ i + j ]; + edge[ 1 ] = indices[ i + ( j + 1 ) % 3 ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + edges[ 2 * numEdges ] = edge[ 0 ]; + edges[ 2 * numEdges + 1 ] = edge[ 1 ]; + hash[ key ] = true; + numEdges ++; + + } + + } + + } + + } + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numEdges; i < l; i ++ ) { + + for ( var j = 0; j < 2; j ++ ) { + + var index = 6 * i + 3 * j; + var index2 = edges[ 2 * i + j ]; + + coords[ index + 0 ] = vertices.getX( index2 ); + coords[ index + 1 ] = vertices.getY( index2 ); + coords[ index + 2 ] = vertices.getZ( index2 ); + + } + + } + + this.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) ); + + } else { + + // non-indexed BufferGeometry + + var vertices = geometry.attributes.position.array; + var numEdges = vertices.length / 3; + var numTris = numEdges / 3; + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numTris; i < l; i ++ ) { + + for ( var j = 0; j < 3; j ++ ) { + + var index = 18 * i + 6 * j; + + var index1 = 9 * i + 3 * j; + coords[ index + 0 ] = vertices[ index1 ]; + coords[ index + 1 ] = vertices[ index1 + 1 ]; + coords[ index + 2 ] = vertices[ index1 + 2 ]; + + var index2 = 9 * i + 3 * ( ( j + 1 ) % 3 ); + coords[ index + 3 ] = vertices[ index2 ]; + coords[ index + 4 ] = vertices[ index2 + 1 ]; + coords[ index + 5 ] = vertices[ index2 + 2 ]; + + } + + } + + this.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) ); + + } + + } + +}; + +THREE.WireframeGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.WireframeGeometry.prototype.constructor = THREE.WireframeGeometry; + +// File:src/extras/helpers/AxisHelper.js + +/** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.AxisHelper = function ( size ) { + + size = size || 1; + + var vertices = new Float32Array( [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ] ); + + var colors = new Float32Array( [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ] ); + + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ) ); + + var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } ); + + THREE.LineSegments.call( this, geometry, material ); + +}; + +THREE.AxisHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.AxisHelper.prototype.constructor = THREE.AxisHelper; + +// File:src/extras/helpers/ArrowHelper.js + +/** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + +THREE.ArrowHelper = ( function () { + + var lineGeometry = new THREE.Geometry(); + lineGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 1, 0 ) ); + + var coneGeometry = new THREE.CylinderGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + return function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + THREE.Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.position.copy( origin ); + + if ( headLength < length ) { + this.line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + } + + this.cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + +}() ); + +THREE.ArrowHelper.prototype = Object.create( THREE.Object3D.prototype ); +THREE.ArrowHelper.prototype.constructor = THREE.ArrowHelper; + +THREE.ArrowHelper.prototype.setDirection = ( function () { + + var axis = new THREE.Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + +}() ); + +THREE.ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( headLength < length ){ + this.line.scale.set( 1, length - headLength, 1 ); + this.line.updateMatrix(); + } + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + +}; + +THREE.ArrowHelper.prototype.setColor = function ( color ) { + + if ( this.line !== undefined ) this.line.material.color.set( color ); + this.cone.material.color.set( color ); + +}; + +// File:src/extras/helpers/BoxHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.BoxHelper = function ( object ) { + + var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new THREE.BufferGeometry(); + geometry.setIndex( new THREE.BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) ); + + THREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: 0xffff00 } ) ); + + if ( object !== undefined ) { + + this.update( object ); + + } + +}; + +THREE.BoxHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.BoxHelper.prototype.constructor = THREE.BoxHelper; + +THREE.BoxHelper.prototype.update = ( function () { + + var box = new THREE.Box3(); + + return function ( object ) { + + box.setFromObject( object ); + + if ( box.empty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + } + +} )(); + +// File:src/extras/helpers/BoundingBoxHelper.js + +/** + * @author WestLangley / http://github.com/WestLangley + */ + +// a helper to show the world-axis-aligned bounding box for an object + +THREE.BoundingBoxHelper = function ( object, hex ) { + + var color = ( hex !== undefined ) ? hex : 0x888888; + + this.object = object; + + this.box = new THREE.Box3(); + + THREE.Mesh.call( this, new THREE.BoxGeometry( 1, 1, 1 ), new THREE.MeshBasicMaterial( { color: color, wireframe: true } ) ); + +}; + +THREE.BoundingBoxHelper.prototype = Object.create( THREE.Mesh.prototype ); +THREE.BoundingBoxHelper.prototype.constructor = THREE.BoundingBoxHelper; + +THREE.BoundingBoxHelper.prototype.update = function () { + + this.box.setFromObject( this.object ); + + this.box.size( this.scale ); + + this.box.center( this.position ); + +}; + +// File:src/extras/helpers/CameraHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + +THREE.CameraHelper = function ( camera ) { + + var geometry = new THREE.Geometry(); + var material = new THREE.LineBasicMaterial( { color: 0xffffff, vertexColors: THREE.FaceColors } ); + + var pointMap = {}; + + // colors + + var hexFrustum = 0xffaa00; + var hexCone = 0xff0000; + var hexUp = 0x00aaff; + var hexTarget = 0xffffff; + var hexCross = 0x333333; + + // near + + addLine( "n1", "n2", hexFrustum ); + addLine( "n2", "n4", hexFrustum ); + addLine( "n4", "n3", hexFrustum ); + addLine( "n3", "n1", hexFrustum ); + + // far + + addLine( "f1", "f2", hexFrustum ); + addLine( "f2", "f4", hexFrustum ); + addLine( "f4", "f3", hexFrustum ); + addLine( "f3", "f1", hexFrustum ); + + // sides + + addLine( "n1", "f1", hexFrustum ); + addLine( "n2", "f2", hexFrustum ); + addLine( "n3", "f3", hexFrustum ); + addLine( "n4", "f4", hexFrustum ); + + // cone + + addLine( "p", "n1", hexCone ); + addLine( "p", "n2", hexCone ); + addLine( "p", "n3", hexCone ); + addLine( "p", "n4", hexCone ); + + // up + + addLine( "u1", "u2", hexUp ); + addLine( "u2", "u3", hexUp ); + addLine( "u3", "u1", hexUp ); + + // target + + addLine( "c", "t", hexTarget ); + addLine( "p", "c", hexCross ); + + // cross + + addLine( "cn1", "cn2", hexCross ); + addLine( "cn3", "cn4", hexCross ); + + addLine( "cf1", "cf2", hexCross ); + addLine( "cf3", "cf4", hexCross ); + + function addLine( a, b, hex ) { + + addPoint( a, hex ); + addPoint( b, hex ); + + } + + function addPoint( id, hex ) { + + geometry.vertices.push( new THREE.Vector3() ); + geometry.colors.push( new THREE.Color( hex ) ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( geometry.vertices.length - 1 ); + + } + + THREE.LineSegments.call( this, geometry, material ); + + this.camera = camera; + this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + +}; + +THREE.CameraHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.CameraHelper.prototype.constructor = THREE.CameraHelper; + +THREE.CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new THREE.Vector3(); + var camera = new THREE.Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + geometry.vertices[ points[ i ] ].copy( vector ); + + } + + } + + } + + return function () { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( "c", 0, 0, - 1 ); + setPoint( "t", 0, 0, 1 ); + + // near + + setPoint( "n1", - w, - h, - 1 ); + setPoint( "n2", w, - h, - 1 ); + setPoint( "n3", - w, h, - 1 ); + setPoint( "n4", w, h, - 1 ); + + // far + + setPoint( "f1", - w, - h, 1 ); + setPoint( "f2", w, - h, 1 ); + setPoint( "f3", - w, h, 1 ); + setPoint( "f4", w, h, 1 ); + + // up + + setPoint( "u1", w * 0.7, h * 1.1, - 1 ); + setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); + setPoint( "u3", 0, h * 2, - 1 ); + + // cross + + setPoint( "cf1", - w, 0, 1 ); + setPoint( "cf2", w, 0, 1 ); + setPoint( "cf3", 0, - h, 1 ); + setPoint( "cf4", 0, h, 1 ); + + setPoint( "cn1", - w, 0, - 1 ); + setPoint( "cn2", w, 0, - 1 ); + setPoint( "cn3", 0, - h, - 1 ); + setPoint( "cn4", 0, h, - 1 ); + + geometry.verticesNeedUpdate = true; + + }; + +}(); + +// File:src/extras/helpers/DirectionalLightHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.DirectionalLightHelper = function ( light, size ) { + + THREE.Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + size = size || 1; + + var geometry = new THREE.Geometry(); + geometry.vertices.push( + new THREE.Vector3( - size, size, 0 ), + new THREE.Vector3( size, size, 0 ), + new THREE.Vector3( size, - size, 0 ), + new THREE.Vector3( - size, - size, 0 ), + new THREE.Vector3( - size, size, 0 ) + ); + + var material = new THREE.LineBasicMaterial( { fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + this.lightPlane = new THREE.Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new THREE.Geometry(); + geometry.vertices.push( + new THREE.Vector3(), + new THREE.Vector3() + ); + + material = new THREE.LineBasicMaterial( { fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + this.targetLine = new THREE.Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + +}; + +THREE.DirectionalLightHelper.prototype = Object.create( THREE.Object3D.prototype ); +THREE.DirectionalLightHelper.prototype.constructor = THREE.DirectionalLightHelper; + +THREE.DirectionalLightHelper.prototype.dispose = function () { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + +}; + +THREE.DirectionalLightHelper.prototype.update = function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + var v3 = new THREE.Vector3(); + + return function () { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + this.lightPlane.lookAt( v3 ); + this.lightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + this.targetLine.geometry.vertices[ 1 ].copy( v3 ); + this.targetLine.geometry.verticesNeedUpdate = true; + this.targetLine.material.color.copy( this.lightPlane.material.color ); + + }; + +}(); + +// File:src/extras/helpers/EdgesHelper.js + +/** + * @author WestLangley / http://github.com/WestLangley + * @param object THREE.Mesh whose geometry will be used + * @param hex line color + * @param thresholdAngle the minimum angle (in degrees), + * between the face normals of adjacent faces, + * that is required to render an edge. A value of 10 means + * an edge is only rendered if the angle is at least 10 degrees. + */ + +THREE.EdgesHelper = function ( object, hex, thresholdAngle ) { + + var color = ( hex !== undefined ) ? hex : 0xffffff; + + THREE.LineSegments.call( this, new THREE.EdgesGeometry( object.geometry, thresholdAngle ), new THREE.LineBasicMaterial( { color: color } ) ); + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + +}; + +THREE.EdgesHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.EdgesHelper.prototype.constructor = THREE.EdgesHelper; + +// File:src/extras/helpers/FaceNormalsHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.FaceNormalsHelper = function ( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry instanceof THREE.Geometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new THREE.BufferGeometry(); + + var positions = new THREE.Float32Attribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + THREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + +}; + +THREE.FaceNormalsHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.FaceNormalsHelper.prototype.constructor = THREE.FaceNormalsHelper; + +THREE.FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + var normalMatrix = new THREE.Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + return this; + + } + +}() ); + +// File:src/extras/helpers/GridHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.GridHelper = function ( size, step ) { + + var geometry = new THREE.Geometry(); + var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } ); + + this.color1 = new THREE.Color( 0x444444 ); + this.color2 = new THREE.Color( 0x888888 ); + + for ( var i = - size; i <= size; i += step ) { + + geometry.vertices.push( + new THREE.Vector3( - size, 0, i ), new THREE.Vector3( size, 0, i ), + new THREE.Vector3( i, 0, - size ), new THREE.Vector3( i, 0, size ) + ); + + var color = i === 0 ? this.color1 : this.color2; + + geometry.colors.push( color, color, color, color ); + + } + + THREE.LineSegments.call( this, geometry, material ); + +}; + +THREE.GridHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.GridHelper.prototype.constructor = THREE.GridHelper; + +THREE.GridHelper.prototype.setColors = function( colorCenterLine, colorGrid ) { + + this.color1.set( colorCenterLine ); + this.color2.set( colorGrid ); + + this.geometry.colorsNeedUpdate = true; + +}; + +// File:src/extras/helpers/HemisphereLightHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.HemisphereLightHelper = function ( light, sphereSize ) { + + THREE.Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.colors = [ new THREE.Color(), new THREE.Color() ]; + + var geometry = new THREE.SphereGeometry( sphereSize, 4, 2 ); + geometry.rotateX( - Math.PI / 2 ); + + for ( var i = 0, il = 8; i < il; i ++ ) { + + geometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ]; + + } + + var material = new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors, wireframe: true } ); + + this.lightSphere = new THREE.Mesh( geometry, material ); + this.add( this.lightSphere ); + + this.update(); + +}; + +THREE.HemisphereLightHelper.prototype = Object.create( THREE.Object3D.prototype ); +THREE.HemisphereLightHelper.prototype.constructor = THREE.HemisphereLightHelper; + +THREE.HemisphereLightHelper.prototype.dispose = function () { + + this.lightSphere.geometry.dispose(); + this.lightSphere.material.dispose(); + +}; + +THREE.HemisphereLightHelper.prototype.update = function () { + + var vector = new THREE.Vector3(); + + return function () { + + this.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity ); + this.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity ); + + this.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + this.lightSphere.geometry.colorsNeedUpdate = true; + + } + +}(); + +// File:src/extras/helpers/PointLightHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.PointLightHelper = function ( light, sphereSize ) { + + this.light = light; + this.light.updateMatrixWorld(); + + var geometry = new THREE.SphereGeometry( sphereSize, 4, 2 ); + var material = new THREE.MeshBasicMaterial( { wireframe: true, fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + THREE.Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + +}; + +THREE.PointLightHelper.prototype = Object.create( THREE.Mesh.prototype ); +THREE.PointLightHelper.prototype.constructor = THREE.PointLightHelper; + +THREE.PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + +}; + +THREE.PointLightHelper.prototype.update = function () { + + this.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + +}; + +// File:src/extras/helpers/SkeletonHelper.js + +/** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + */ + +THREE.SkeletonHelper = function ( object ) { + + this.bones = this.getBoneList( object ); + + var geometry = new THREE.Geometry(); + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent instanceof THREE.Bone ) { + + geometry.vertices.push( new THREE.Vector3() ); + geometry.vertices.push( new THREE.Vector3() ); + geometry.colors.push( new THREE.Color( 0, 0, 1 ) ); + geometry.colors.push( new THREE.Color( 0, 1, 0 ) ); + + } + + } + + geometry.dynamic = true; + + var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + THREE.LineSegments.call( this, geometry, material ); + + this.root = object; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + +}; + + +THREE.SkeletonHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.SkeletonHelper.prototype.constructor = THREE.SkeletonHelper; + +THREE.SkeletonHelper.prototype.getBoneList = function( object ) { + + var boneList = []; + + if ( object instanceof THREE.Bone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); + + } + + return boneList; + +}; + +THREE.SkeletonHelper.prototype.update = function () { + + var geometry = this.geometry; + + var matrixWorldInv = new THREE.Matrix4().getInverse( this.root.matrixWorld ); + + var boneMatrix = new THREE.Matrix4(); + + var j = 0; + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent instanceof THREE.Bone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + geometry.vertices[ j ].setFromMatrixPosition( boneMatrix ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + geometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix ); + + j += 2; + + } + + } + + geometry.verticesNeedUpdate = true; + + geometry.computeBoundingSphere(); + +}; + +// File:src/extras/helpers/SpotLightHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.SpotLightHelper = function ( light ) { + + THREE.Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new THREE.CylinderGeometry( 0, 1, 1, 8, 1, true ); + + geometry.translate( 0, - 0.5, 0 ); + geometry.rotateX( - Math.PI / 2 ); + + var material = new THREE.MeshBasicMaterial( { wireframe: true, fog: false } ); + + this.cone = new THREE.Mesh( geometry, material ); + this.add( this.cone ); + + this.update(); + +}; + +THREE.SpotLightHelper.prototype = Object.create( THREE.Object3D.prototype ); +THREE.SpotLightHelper.prototype.constructor = THREE.SpotLightHelper; + +THREE.SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + +}; + +THREE.SpotLightHelper.prototype.update = function () { + + var vector = new THREE.Vector3(); + var vector2 = new THREE.Vector3(); + + return function () { + + var coneLength = this.light.distance ? this.light.distance : 10000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + this.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + }; + +}(); + +// File:src/extras/helpers/VertexNormalsHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.VertexNormalsHelper = function ( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry instanceof THREE.Geometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry instanceof THREE.BufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count + + } + + // + + var geometry = new THREE.BufferGeometry(); + + var positions = new THREE.Float32Attribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + THREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + +}; + +THREE.VertexNormalsHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.VertexNormalsHelper.prototype.constructor = THREE.VertexNormalsHelper; + +THREE.VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + var normalMatrix = new THREE.Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry instanceof THREE.Geometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry instanceof THREE.BufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + return this; + + } + +}() ); + +// File:src/extras/helpers/WireframeHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.WireframeHelper = function ( object, hex ) { + + var color = ( hex !== undefined ) ? hex : 0xffffff; + + THREE.LineSegments.call( this, new THREE.WireframeGeometry( object.geometry ), new THREE.LineBasicMaterial( { color: color } ) ); + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + +}; + +THREE.WireframeHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.WireframeHelper.prototype.constructor = THREE.WireframeHelper; + +// File:src/extras/objects/ImmediateRenderObject.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.ImmediateRenderObject = function ( material ) { + + THREE.Object3D.call( this ); + + this.material = material; + this.render = function ( renderCallback ) {}; + +}; + +THREE.ImmediateRenderObject.prototype = Object.create( THREE.Object3D.prototype ); +THREE.ImmediateRenderObject.prototype.constructor = THREE.ImmediateRenderObject; + +// File:src/extras/objects/MorphBlendMesh.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.MorphBlendMesh = function( geometry, material ) { + + THREE.Mesh.call( this, geometry, material ); + + this.animationsMap = {}; + this.animationsList = []; + + // prepare default animation + // (all frames played together in 1 second) + + var numFrames = this.geometry.morphTargets.length; + + var name = "__default"; + + var startFrame = 0; + var endFrame = numFrames - 1; + + var fps = numFrames / 1; + + this.createAnimation( name, startFrame, endFrame, fps ); + this.setAnimationWeight( name, 1 ); + +}; + +THREE.MorphBlendMesh.prototype = Object.create( THREE.Mesh.prototype ); +THREE.MorphBlendMesh.prototype.constructor = THREE.MorphBlendMesh; + +THREE.MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { + + var animation = { + + start: start, + end: end, + + length: end - start + 1, + + fps: fps, + duration: ( end - start ) / fps, + + lastFrame: 0, + currentFrame: 0, + + active: false, + + time: 0, + direction: 1, + weight: 1, + + directionBackwards: false, + mirroredLoop: false + + }; + + this.animationsMap[ name ] = animation; + this.animationsList.push( animation ); + +}; + +THREE.MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { + + var pattern = /([a-z]+)_?(\d+)/; + + var firstAnimation, frameRanges = {}; + + var geometry = this.geometry; + + for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { + + var morph = geometry.morphTargets[ i ]; + var chunks = morph.name.match( pattern ); + + if ( chunks && chunks.length > 1 ) { + + var name = chunks[ 1 ]; + + if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; + + var range = frameRanges[ name ]; + + if ( i < range.start ) range.start = i; + if ( i > range.end ) range.end = i; + + if ( ! firstAnimation ) firstAnimation = name; + + } + + } + + for ( var name in frameRanges ) { + + var range = frameRanges[ name ]; + this.createAnimation( name, range.start, range.end, fps ); + + } + + this.firstAnimation = firstAnimation; + +}; + +THREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = 1; + animation.directionBackwards = false; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = - 1; + animation.directionBackwards = true; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.fps = fps; + animation.duration = ( animation.end - animation.start ) / animation.fps; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.duration = duration; + animation.fps = ( animation.end - animation.start ) / animation.duration; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.weight = weight; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = time; + + } + +}; + +THREE.MorphBlendMesh.prototype.getAnimationTime = function ( name ) { + + var time = 0; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + time = animation.time; + + } + + return time; + +}; + +THREE.MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { + + var duration = - 1; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + duration = animation.duration; + + } + + return duration; + +}; + +THREE.MorphBlendMesh.prototype.playAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = 0; + animation.active = true; + + } else { + + console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); + + } + +}; + +THREE.MorphBlendMesh.prototype.stopAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.active = false; + + } + +}; + +THREE.MorphBlendMesh.prototype.update = function ( delta ) { + + for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { + + var animation = this.animationsList[ i ]; + + if ( ! animation.active ) continue; + + var frameTime = animation.duration / animation.length; + + animation.time += animation.direction * delta; + + if ( animation.mirroredLoop ) { + + if ( animation.time > animation.duration || animation.time < 0 ) { + + animation.direction *= - 1; + + if ( animation.time > animation.duration ) { + + animation.time = animation.duration; + animation.directionBackwards = true; + + } + + if ( animation.time < 0 ) { + + animation.time = 0; + animation.directionBackwards = false; + + } + + } + + } else { + + animation.time = animation.time % animation.duration; + + if ( animation.time < 0 ) animation.time += animation.duration; + + } + + var keyframe = animation.start + THREE.Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); + var weight = animation.weight; + + if ( keyframe !== animation.currentFrame ) { + + this.morphTargetInfluences[ animation.lastFrame ] = 0; + this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; + + this.morphTargetInfluences[ keyframe ] = 0; + + animation.lastFrame = animation.currentFrame; + animation.currentFrame = keyframe; + + } + + var mix = ( animation.time % frameTime ) / frameTime; + + if ( animation.directionBackwards ) mix = 1 - mix; + + if ( animation.currentFrame !== animation.lastFrame ) { + + this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; + this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; + + } else { + + this.morphTargetInfluences[ animation.currentFrame ] = weight; + + } + + } + +}; + + +// Export the THREE object for **Node.js**, with +// backwards-compatibility for the old `require()` API. If we're in +// the browser, add `_` as a global object via a string identifier, +// for Closure Compiler "advanced" mode. +if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = THREE; + } + exports.THREE = THREE; +} else { + this['THREE'] = THREE; +} + +},{}],6:[function(_dereq_,module,exports){ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 0.0 && abs(vUV.x - 0.5) < .001) {', + // Don't render the divider, since it's rendered in HTML. + //'gl_FragColor = dividerColor;', + '} else if (a.x < 0.0 || a.x > 1.0 || a.y < 0.0 || a.y > 1.0) {', + 'gl_FragColor = backgroundColor;', + '} else {', + 'gl_FragColor = texture2D(texture, vec2(a.x * 0.5 + (vUV.x < 0.5 ? 0.0 : 0.5), a.y));', + '}', + '}' + + ].join('\n') +}; + +module.exports = BarrelDistortionFragment; + +},{}],6:[function(_dereq_,module,exports){ +/** + * TODO(smus): Implement coefficient inversion. + */ +function Distortion(coefficients) { + this.coefficients = coefficients; +} + +/** + * Calculates the inverse distortion for a radius. + *

+ * Allows to compute the original undistorted radius from a distorted one. + * See also getApproximateInverseDistortion() for a faster but potentially + * less accurate method. + * + * @param {Number} radius Distorted radius from the lens center in tan-angle units. + * @return {Number} The undistorted radius in tan-angle units. + */ +Distortion.prototype.distortInverse = function(radius) { + // Secant method. + var r0 = radius / 0.9; + var r1 = radius * 0.9; + var dr0 = radius - this.distort(r0); + while (Math.abs(r1 - r0) > 0.0001 /** 0.1mm */) { + var dr1 = radius - this.distort(r1); + var r2 = r1 - dr1 * ((r1 - r0) / (dr1 - dr0)); + r0 = r1; + r1 = r2; + dr0 = dr1; + } + return r1; +} + + +/** + * Distorts a radius by its distortion factor from the center of the lenses. + * + * @param {Number} radius Radius from the lens center in tan-angle units. + * @return {Number} The distorted radius in tan-angle units. + */ +Distortion.prototype.distort = function(radius) { + return radius * this.distortionFactor_(radius); +} + +/** + * Returns the distortion factor of a point. + * + * @param {Number} radius Radius of the point from the lens center in tan-angle units. + * @return {Number} The distortion factor. Multiply by this factor to distort points. + */ +Distortion.prototype.distortionFactor_ = function(radius) { + var result = 1.0; + var rFactor = 1.0; + var rSquared = radius * radius; + + for (var i = 0; i < this.coefficients.length; i++) { + var ki = this.coefficients[i]; + rFactor *= rSquared; + result += ki * rFactor; + } + + return result; +} + +module.exports = Distortion; + +},{}],7:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * DPDB cache. + */ +var DPDB_CACHE = { + "format": 1, + "last_updated": "2016-01-26T23:11:18Z", + "devices": [ + { + "type": "android", + "rules": [ + { "mdmh": "asus/*/Nexus 7/*" }, + { "ua": "Nexus 7" } + ], + "dpi": [ 320.8, 323.0 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "asus/*/ASUS_Z00AD/*" }, + { "ua": "ASUS_Z00AD" } + ], + "dpi": [ 403.0, 404.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC6435LVW/*" }, + { "ua": "HTC6435LVW" } + ], + "dpi": [ 449.7, 443.3 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC One XL/*" }, + { "ua": "HTC One XL" } + ], + "dpi": [ 315.3, 314.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "htc/*/Nexus 9/*" }, + { "ua": "Nexus 9" } + ], + "dpi": 289.0, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC One M9/*" }, + { "ua": "HTC One M9" } + ], + "dpi": [ 442.5, 443.3 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC One_M8/*" }, + { "ua": "HTC One_M8" } + ], + "dpi": [ 449.7, 447.4 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC One/*" }, + { "ua": "HTC One" } + ], + "dpi": 472.8, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Huawei/*/Nexus 6P/*" }, + { "ua": "Nexus 6P" } + ], + "dpi": [ 515.1, 518.0 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/Nexus 5X/*" }, + { "ua": "Nexus 5X" } + ], + "dpi": [ 422.0, 419.9 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LGMS345/*" }, + { "ua": "LGMS345" } + ], + "dpi": [ 221.7, 219.1 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LG-D800/*" }, + { "ua": "LG-D800" } + ], + "dpi": [ 422.0, 424.1 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LG-D850/*" }, + { "ua": "LG-D850" } + ], + "dpi": [ 537.9, 541.9 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/VS985 4G/*" }, + { "ua": "VS985 4G" } + ], + "dpi": [ 537.9, 535.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/Nexus 5/*" }, + { "ua": "Nexus 5 B" } + ], + "dpi": [ 442.4, 444.8 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/Nexus 4/*" }, + { "ua": "Nexus 4" } + ], + "dpi": [ 319.8, 318.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LG-P769/*" }, + { "ua": "LG-P769" } + ], + "dpi": [ 240.6, 247.5 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LGMS323/*" }, + { "ua": "LGMS323" } + ], + "dpi": [ 206.6, 204.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LGLS996/*" }, + { "ua": "LGLS996" } + ], + "dpi": [ 403.4, 401.5 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Micromax/*/4560MMX/*" }, + { "ua": "4560MMX" } + ], + "dpi": [ 240.0, 219.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Micromax/*/A250/*" }, + { "ua": "Micromax A250" } + ], + "dpi": [ 480.0, 446.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Micromax/*/Micromax AQ4501/*" }, + { "ua": "Micromax AQ4501" } + ], + "dpi": 240.0, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/DROID RAZR/*" }, + { "ua": "DROID RAZR" } + ], + "dpi": [ 368.1, 256.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT830C/*" }, + { "ua": "XT830C" } + ], + "dpi": [ 254.0, 255.9 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1021/*" }, + { "ua": "XT1021" } + ], + "dpi": [ 254.0, 256.7 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1023/*" }, + { "ua": "XT1023" } + ], + "dpi": [ 254.0, 256.7 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1028/*" }, + { "ua": "XT1028" } + ], + "dpi": [ 326.6, 327.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1034/*" }, + { "ua": "XT1034" } + ], + "dpi": [ 326.6, 328.4 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1053/*" }, + { "ua": "XT1053" } + ], + "dpi": [ 315.3, 316.1 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1562/*" }, + { "ua": "XT1562" } + ], + "dpi": [ 403.4, 402.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/Nexus 6/*" }, + { "ua": "Nexus 6 B" } + ], + "dpi": [ 494.3, 489.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1063/*" }, + { "ua": "XT1063" } + ], + "dpi": [ 295.0, 296.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1064/*" }, + { "ua": "XT1064" } + ], + "dpi": [ 295.0, 295.6 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1092/*" }, + { "ua": "XT1092" } + ], + "dpi": [ 422.0, 424.1 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1095/*" }, + { "ua": "XT1095" } + ], + "dpi": [ 422.0, 423.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "OnePlus/*/A0001/*" }, + { "ua": "A0001" } + ], + "dpi": [ 403.4, 401.0 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "OnePlus/*/ONE E1005/*" }, + { "ua": "ONE E1005" } + ], + "dpi": [ 442.4, 441.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "OnePlus/*/ONE A2005/*" }, + { "ua": "ONE A2005" } + ], + "dpi": [ 391.9, 405.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "OPPO/*/X909/*" }, + { "ua": "X909" } + ], + "dpi": [ 442.4, 444.1 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9082/*" }, + { "ua": "GT-I9082" } + ], + "dpi": [ 184.7, 185.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G360P/*" }, + { "ua": "SM-G360P" } + ], + "dpi": [ 196.7, 205.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/Nexus S/*" }, + { "ua": "Nexus S" } + ], + "dpi": [ 234.5, 229.8 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9300/*" }, + { "ua": "GT-I9300" } + ], + "dpi": [ 304.8, 303.9 ], + "bw": 5, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-T230NU/*" }, + { "ua": "SM-T230NU" } + ], + "dpi": 216.0, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SGH-T399/*" }, + { "ua": "SGH-T399" } + ], + "dpi": [ 217.7, 231.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-N9005/*" }, + { "ua": "SM-N9005" } + ], + "dpi": [ 386.4, 387.0 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SAMSUNG-SM-N900A/*" }, + { "ua": "SAMSUNG-SM-N900A" } + ], + "dpi": [ 386.4, 387.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9500/*" }, + { "ua": "GT-I9500" } + ], + "dpi": [ 442.5, 443.3 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9505/*" }, + { "ua": "GT-I9505" } + ], + "dpi": 439.4, + "bw": 4, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G900F/*" }, + { "ua": "SM-G900F" } + ], + "dpi": [ 415.6, 431.6 ], + "bw": 5, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G900M/*" }, + { "ua": "SM-G900M" } + ], + "dpi": [ 415.6, 431.6 ], + "bw": 5, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G800F/*" }, + { "ua": "SM-G800F" } + ], + "dpi": 326.8, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G906S/*" }, + { "ua": "SM-G906S" } + ], + "dpi": [ 562.7, 572.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9300/*" }, + { "ua": "GT-I9300" } + ], + "dpi": [ 306.7, 304.8 ], + "bw": 5, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-T535/*" }, + { "ua": "SM-T535" } + ], + "dpi": [ 142.6, 136.4 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-N920C/*" }, + { "ua": "SM-N920C" } + ], + "dpi": [ 515.1, 518.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9300I/*" }, + { "ua": "GT-I9300I" } + ], + "dpi": [ 304.8, 305.8 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9195/*" }, + { "ua": "GT-I9195" } + ], + "dpi": [ 249.4, 256.7 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SPH-L520/*" }, + { "ua": "SPH-L520" } + ], + "dpi": [ 249.4, 255.9 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SAMSUNG-SGH-I717/*" }, + { "ua": "SAMSUNG-SGH-I717" } + ], + "dpi": 285.8, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SPH-D710/*" }, + { "ua": "SPH-D710" } + ], + "dpi": [ 217.7, 204.2 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-N7100/*" }, + { "ua": "GT-N7100" } + ], + "dpi": 265.1, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SCH-I605/*" }, + { "ua": "SCH-I605" } + ], + "dpi": 265.1, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/Galaxy Nexus/*" }, + { "ua": "Galaxy Nexus" } + ], + "dpi": [ 315.3, 314.2 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-N910H/*" }, + { "ua": "SM-N910H" } + ], + "dpi": [ 515.1, 518.0 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-N910C/*" }, + { "ua": "SM-N910C" } + ], + "dpi": [ 515.2, 520.2 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G130M/*" }, + { "ua": "SM-G130M" } + ], + "dpi": [ 165.9, 164.8 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G928I/*" }, + { "ua": "SM-G928I" } + ], + "dpi": [ 515.1, 518.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G920F/*" }, + { "ua": "SM-G920F" } + ], + "dpi": 580.6, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G920P/*" }, + { "ua": "SM-G920P" } + ], + "dpi": [ 522.5, 577.0 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G925F/*" }, + { "ua": "SM-G925F" } + ], + "dpi": 580.6, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G925V/*" }, + { "ua": "SM-G925V" } + ], + "dpi": [ 522.5, 576.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/C6903/*" }, + { "ua": "C6903" } + ], + "dpi": [ 442.5, 443.3 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/D6653/*" }, + { "ua": "D6653" } + ], + "dpi": [ 428.6, 427.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/E6653/*" }, + { "ua": "E6653" } + ], + "dpi": [ 428.6, 425.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/E6853/*" }, + { "ua": "E6853" } + ], + "dpi": [ 403.4, 401.9 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/SGP321/*" }, + { "ua": "SGP321" } + ], + "dpi": [ 224.7, 224.1 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "TCT/*/ALCATEL ONE TOUCH Fierce/*" }, + { "ua": "ALCATEL ONE TOUCH Fierce" } + ], + "dpi": [ 240.0, 247.5 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "THL/*/thl 5000/*" }, + { "ua": "thl 5000" } + ], + "dpi": [ 480.0, 443.3 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "ZTE/*/ZTE Blade L2/*" }, + { "ua": "ZTE Blade L2" } + ], + "dpi": 240.0, + "bw": 3, + "ac": 500 + }, + { + "type": "ios", + "rules": [ { "res": [ 640, 960 ] } ], + "dpi": [ 325.1, 328.4 ], + "bw": 4, + "ac": 1000 + }, + { + "type": "ios", + "rules": [ { "res": [ 640, 1136 ] } ], + "dpi": [ 317.1, 320.2 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "ios", + "rules": [ { "res": [ 750, 1334 ] } ], + "dpi": 326.4, + "bw": 4, + "ac": 1000 + }, + { + "type": "ios", + "rules": [ { "res": [ 1242, 2208 ] } ], + "dpi": [ 453.6, 458.4 ], + "bw": 4, + "ac": 1000 + }, + { + "type": "ios", + "rules": [ { "res": [ 1125, 2001 ] } ], + "dpi": [ 410.9, 415.4 ], + "bw": 4, + "ac": 1000 + } +]}; + +module.exports = DPDB_CACHE; + + +},{}],8:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Offline cache of the DPDB, to be used until we load the online one (and +// as a fallback in case we can't load the online one). +var DPDB_CACHE = _dereq_('./dpdb-cache.js'); +var Util = _dereq_('./util.js'); + +// Online DPDB URL. +var ONLINE_DPDB_URL = 'https://storage.googleapis.com/cardboard-dpdb/dpdb.json'; + +/** + * Calculates device parameters based on the DPDB (Device Parameter Database). + * Initially, uses the cached DPDB values. + * + * If fetchOnline == true, then this object tries to fetch the online version + * of the DPDB and updates the device info if a better match is found. + * Calls the onDeviceParamsUpdated callback when there is an update to the + * device information. + */ +function Dpdb(fetchOnline, onDeviceParamsUpdated) { + // Start with the offline DPDB cache while we are loading the real one. + this.dpdb = DPDB_CACHE; + + // Calculate device params based on the offline version of the DPDB. + this.recalculateDeviceParams_(); + + // XHR to fetch online DPDB file, if requested. + if (fetchOnline) { + // Set the callback. + this.onDeviceParamsUpdated = onDeviceParamsUpdated; + + console.log('Fetching DPDB...'); + var xhr = new XMLHttpRequest(); + var obj = this; + xhr.open('GET', ONLINE_DPDB_URL, true); + xhr.addEventListener('load', function() { + obj.loading = false; + if (xhr.status >= 200 && xhr.status <= 299) { + // Success. + console.log('Successfully loaded online DPDB.'); + obj.dpdb = JSON.parse(xhr.response); + obj.recalculateDeviceParams_(); + } else { + // Error loading the DPDB. + console.error('Error loading online DPDB!'); + } + }); + xhr.send(); + } +} + +// Returns the current device parameters. +Dpdb.prototype.getDeviceParams = function() { + return this.deviceParams; +}; + +// Recalculates this device's parameters based on the DPDB. +Dpdb.prototype.recalculateDeviceParams_ = function() { + console.log('Recalculating device params.'); + var newDeviceParams = this.calcDeviceParams_(); + console.log('New device parameters:'); + console.log(newDeviceParams); + if (newDeviceParams) { + this.deviceParams = newDeviceParams; + // Invoke callback, if it is set. + if (this.onDeviceParamsUpdated) { + this.onDeviceParamsUpdated(this.deviceParams); + } + } else { + console.warn('Failed to recalculate device parameters.'); + } +}; + +// Returns a DeviceParams object that represents the best guess as to this +// device's parameters. Can return null if the device does not match any +// known devices. +Dpdb.prototype.calcDeviceParams_ = function() { + var db = this.dpdb; // shorthand + if (!db) { + console.error('DPDB not available.'); + return null; + } + if (db.format != 1) { + console.error('DPDB has unexpected format version.'); + return null; + } + if (!db.devices || !db.devices.length) { + console.error('DPDB does not have a devices section.'); + return null; + } + + // Get the actual user agent and screen dimensions in pixels. + var userAgent = navigator.userAgent || navigator.vendor || window.opera; + var width = Util.getScreenWidth(); + var height = Util.getScreenHeight(); + console.log('User agent: ' + userAgent); + console.log('Pixel width: ' + width); + console.log('Pixel height: ' + height); + + if (!db.devices) { + console.error('DPDB has no devices section.'); + return null; + } + + for (var i = 0; i < db.devices.length; i++) { + var device = db.devices[i]; + if (!device.rules) { + console.warn('Device[' + i + '] has no rules section.'); + continue; + } + + if (device.type != 'ios' && device.type != 'android') { + console.warn('Device[' + i + '] has invalid type.'); + continue; + } + + // See if this device is of the appropriate type. + if (Util.isIOS() != (device.type == 'ios')) continue; + + // See if this device matches any of the rules: + var matched = false; + for (var j = 0; j < device.rules.length; j++) { + var rule = device.rules[j]; + if (this.matchRule_(rule, userAgent, width, height)) { + console.log('Rule matched:'); + console.log(rule); + matched = true; + break; + } + } + if (!matched) continue; + + // device.dpi might be an array of [ xdpi, ydpi] or just a scalar. + var xdpi = device.dpi[0] || device.dpi; + var ydpi = device.dpi[1] || device.dpi; + + return new DeviceParams({ xdpi: xdpi, ydpi: ydpi, bevelMm: device.bw }); + } + + console.warn('No DPDB device match.'); + return null; +}; + +Dpdb.prototype.matchRule_ = function(rule, ua, screenWidth, screenHeight) { + // We can only match 'ua' and 'res' rules, not other types like 'mdmh' + // (which are meant for native platforms). + if (!rule.ua && !rule.res) return false; + + // If our user agent string doesn't contain the indicated user agent string, + // the match fails. + if (rule.ua && ua.indexOf(rule.ua) < 0) return false; + + // If the rule specifies screen dimensions that don't correspond to ours, + // the match fails. + if (rule.res) { + if (!rule.res[0] || !rule.res[1]) return false; + var resX = rule.res[0]; + var resY = rule.res[1]; + // Compare min and max so as to make the order not matter, i.e., it should + // be true that 640x480 == 480x640. + if (Math.min(screenWidth, screenHeight) != Math.min(resX, resY) || + (Math.max(screenWidth, screenHeight) != Math.max(resX, resY))) { + return false; + } + } + + return true; +} + +function DeviceParams(params) { + this.xdpi = params.xdpi; + this.ydpi = params.ydpi; + this.bevelMm = params.bevelMm; +} + +module.exports = Dpdb; + +},{"./dpdb-cache.js":7,"./util.js":13}],9:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function Emitter() { + this.callbacks = {}; +} + +Emitter.prototype.emit = function(eventName) { + var callbacks = this.callbacks[eventName]; + if (!callbacks) { + //console.log('No valid callback specified.'); + return; + } + var args = [].slice.call(arguments); + // Eliminate the first param (the callback). + args.shift(); + for (var i = 0; i < callbacks.length; i++) { + callbacks[i].apply(this, args); + } +}; + +Emitter.prototype.on = function(eventName, callback) { + if (eventName in this.callbacks) { + this.callbacks[eventName].push(callback); + } else { + this.callbacks[eventName] = [callback]; + } +}; + +module.exports = Emitter; + +},{}],10:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var WebVRManager = _dereq_('./webvr-manager.js'); + +window.WebVRConfig = window.WebVRConfig || {}; +window.WebVRManager = WebVRManager; + +},{"./webvr-manager.js":16}],11:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Modes = { + UNKNOWN: 0, + // Not fullscreen, just tracking. + NORMAL: 1, + // Magic window immersive mode. + MAGIC_WINDOW: 2, + // Full screen split screen VR mode. + VR: 3, +}; + +module.exports = Modes; + +},{}],12:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Util = _dereq_('./util.js'); + +function RotateInstructions() { + this.loadIcon_(); + + var overlay = document.createElement('div'); + var s = overlay.style; + s.position = 'fixed'; + s.top = 0; + s.right = 0; + s.bottom = 0; + s.left = 0; + s.backgroundColor = 'gray'; + s.fontFamily = 'sans-serif'; + + var img = document.createElement('img'); + img.src = this.icon; + var s = img.style; + s.marginLeft = '25%'; + s.marginTop = '25%'; + s.width = '50%'; + overlay.appendChild(img); + + var text = document.createElement('div'); + var s = text.style; + s.textAlign = 'center'; + s.fontSize = '16px'; + s.lineHeight = '24px'; + s.margin = '24px 25%'; + s.width = '50%'; + text.innerHTML = 'Place your phone into your Cardboard viewer.'; + overlay.appendChild(text); + + var snackbar = document.createElement('div'); + var s = snackbar.style; + s.backgroundColor = '#CFD8DC'; + s.position = 'fixed'; + s.bottom = 0; + s.width = '100%'; + s.height = '48px'; + s.padding = '14px 24px'; + s.boxSizing = 'border-box'; + s.color = '#656A6B'; + overlay.appendChild(snackbar); + + var snackbarText = document.createElement('div'); + snackbarText.style.float = 'left'; + snackbarText.innerHTML = 'No Cardboard viewer?'; + + var snackbarButton = document.createElement('a'); + snackbarButton.href = 'https://www.google.com/get/cardboard/get-cardboard/'; + snackbarButton.innerHTML = 'get one'; + snackbarButton.target = '_blank'; + var s = snackbarButton.style; + s.float = 'right'; + s.fontWeight = 600; + s.textTransform = 'uppercase'; + s.borderLeft = '1px solid gray'; + s.paddingLeft = '24px'; + s.textDecoration = 'none'; + s.color = '#656A6B'; + + snackbar.appendChild(snackbarText); + snackbar.appendChild(snackbarButton); + + this.overlay = overlay; + this.text = text; + document.body.appendChild(overlay); + + this.hide(); +} + +RotateInstructions.prototype.show = function() { + this.overlay.style.display = 'block'; + + var img = this.overlay.querySelector('img'); + var s = img.style; + + if (Util.isLandscapeMode()) { + s.width = '20%'; + s.marginLeft = '40%'; + s.marginTop = '3%'; + } else { + s.width = '50%'; + s.marginLeft = '25%'; + s.marginTop = '25%'; + } +}; + +RotateInstructions.prototype.hide = function() { + this.overlay.style.display = 'none'; +}; + +RotateInstructions.prototype.showTemporarily = function(ms) { + this.show(); + this.timer = setTimeout(this.hide.bind(this), ms); +}; + +RotateInstructions.prototype.disableShowTemporarily = function() { + clearTimeout(this.timer); +}; + +RotateInstructions.prototype.loadIcon_ = function() { + // Encoded asset_src/rotate-instructions.svg + this.icon = Util.base64('image/svg+xml', 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE5OHB4IiBoZWlnaHQ9IjI0MHB4IiB2aWV3Qm94PSIwIDAgMTk4IDI0MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4zICgxMjA4MSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+dHJhbnNpdGlvbjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgogICAgICAgIDxnIGlkPSJ0cmFuc2l0aW9uIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KICAgICAgICAgICAgPGcgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTQtKy1JbXBvcnRlZC1MYXllcnMtQ29weS0rLUltcG9ydGVkLUxheWVycy1Db3B5LTItQ29weSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHktNCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwNy4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjYyNSwyLjUyNyBDMTQ5LjYyNSwyLjUyNyAxNTUuODA1LDYuMDk2IDE1Ni4zNjIsNi40MTggTDE1Ni4zNjIsNy4zMDQgQzE1Ni4zNjIsNy40ODEgMTU2LjM3NSw3LjY2NCAxNTYuNCw3Ljg1MyBDMTU2LjQxLDcuOTM0IDE1Ni40Miw4LjAxNSAxNTYuNDI3LDguMDk1IEMxNTYuNTY3LDkuNTEgMTU3LjQwMSwxMS4wOTMgMTU4LjUzMiwxMi4wOTQgTDE2NC4yNTIsMTcuMTU2IEwxNjQuMzMzLDE3LjA2NiBDMTY0LjMzMywxNy4wNjYgMTY4LjcxNSwxNC41MzYgMTY5LjU2OCwxNC4wNDIgQzE3MS4wMjUsMTQuODgzIDE5NS41MzgsMjkuMDM1IDE5NS41MzgsMjkuMDM1IEwxOTUuNTM4LDgzLjAzNiBDMTk1LjUzOCw4My44MDcgMTk1LjE1Miw4NC4yNTMgMTk0LjU5LDg0LjI1MyBDMTk0LjM1Nyw4NC4yNTMgMTk0LjA5NSw4NC4xNzcgMTkzLjgxOCw4NC4wMTcgTDE2OS44NTEsNzAuMTc5IEwxNjkuODM3LDcwLjIwMyBMMTQyLjUxNSw4NS45NzggTDE0MS42NjUsODQuNjU1IEMxMzYuOTM0LDgzLjEyNiAxMzEuOTE3LDgxLjkxNSAxMjYuNzE0LDgxLjA0NSBDMTI2LjcwOSw4MS4wNiAxMjYuNzA3LDgxLjA2OSAxMjYuNzA3LDgxLjA2OSBMMTIxLjY0LDk4LjAzIEwxMTMuNzQ5LDEwMi41ODYgTDExMy43MTIsMTAyLjUyMyBMMTEzLjcxMiwxMzAuMTEzIEMxMTMuNzEyLDEzMC44ODUgMTEzLjMyNiwxMzEuMzMgMTEyLjc2NCwxMzEuMzMgQzExMi41MzIsMTMxLjMzIDExMi4yNjksMTMxLjI1NCAxMTEuOTkyLDEzMS4wOTQgTDY5LjUxOSwxMDYuNTcyIEM2OC41NjksMTA2LjAyMyA2Ny43OTksMTA0LjY5NSA2Ny43OTksMTAzLjYwNSBMNjcuNzk5LDEwMi41NyBMNjcuNzc4LDEwMi42MTcgQzY3LjI3LDEwMi4zOTMgNjYuNjQ4LDEwMi4yNDkgNjUuOTYyLDEwMi4yMTggQzY1Ljg3NSwxMDIuMjE0IDY1Ljc4OCwxMDIuMjEyIDY1LjcwMSwxMDIuMjEyIEM2NS42MDYsMTAyLjIxMiA2NS41MTEsMTAyLjIxNSA2NS40MTYsMTAyLjIxOSBDNjUuMTk1LDEwMi4yMjkgNjQuOTc0LDEwMi4yMzUgNjQuNzU0LDEwMi4yMzUgQzY0LjMzMSwxMDIuMjM1IDYzLjkxMSwxMDIuMjE2IDYzLjQ5OCwxMDIuMTc4IEM2MS44NDMsMTAyLjAyNSA2MC4yOTgsMTAxLjU3OCA1OS4wOTQsMTAwLjg4MiBMMTIuNTE4LDczLjk5MiBMMTIuNTIzLDc0LjAwNCBMMi4yNDUsNTUuMjU0IEMxLjI0NCw1My40MjcgMi4wMDQsNTEuMDM4IDMuOTQzLDQ5LjkxOCBMNTkuOTU0LDE3LjU3MyBDNjAuNjI2LDE3LjE4NSA2MS4zNSwxNy4wMDEgNjIuMDUzLDE3LjAwMSBDNjMuMzc5LDE3LjAwMSA2NC42MjUsMTcuNjYgNjUuMjgsMTguODU0IEw2NS4yODUsMTguODUxIEw2NS41MTIsMTkuMjY0IEw2NS41MDYsMTkuMjY4IEM2NS45MDksMjAuMDAzIDY2LjQwNSwyMC42OCA2Ni45ODMsMjEuMjg2IEw2Ny4yNiwyMS41NTYgQzY5LjE3NCwyMy40MDYgNzEuNzI4LDI0LjM1NyA3NC4zNzMsMjQuMzU3IEM3Ni4zMjIsMjQuMzU3IDc4LjMyMSwyMy44NCA4MC4xNDgsMjIuNzg1IEM4MC4xNjEsMjIuNzg1IDg3LjQ2NywxOC41NjYgODcuNDY3LDE4LjU2NiBDODguMTM5LDE4LjE3OCA4OC44NjMsMTcuOTk0IDg5LjU2NiwxNy45OTQgQzkwLjg5MiwxNy45OTQgOTIuMTM4LDE4LjY1MiA5Mi43OTIsMTkuODQ3IEw5Ni4wNDIsMjUuNzc1IEw5Ni4wNjQsMjUuNzU3IEwxMDIuODQ5LDI5LjY3NCBMMTAyLjc0NCwyOS40OTIgTDE0OS42MjUsMi41MjcgTTE0OS42MjUsMC44OTIgQzE0OS4zNDMsMC44OTIgMTQ5LjA2MiwwLjk2NSAxNDguODEsMS4xMSBMMTAyLjY0MSwyNy42NjYgTDk3LjIzMSwyNC41NDIgTDk0LjIyNiwxOS4wNjEgQzkzLjMxMywxNy4zOTQgOTEuNTI3LDE2LjM1OSA4OS41NjYsMTYuMzU4IEM4OC41NTUsMTYuMzU4IDg3LjU0NiwxNi42MzIgODYuNjQ5LDE3LjE1IEM4My44NzgsMTguNzUgNzkuNjg3LDIxLjE2OSA3OS4zNzQsMjEuMzQ1IEM3OS4zNTksMjEuMzUzIDc5LjM0NSwyMS4zNjEgNzkuMzMsMjEuMzY5IEM3Ny43OTgsMjIuMjU0IDc2LjA4NCwyMi43MjIgNzQuMzczLDIyLjcyMiBDNzIuMDgxLDIyLjcyMiA2OS45NTksMjEuODkgNjguMzk3LDIwLjM4IEw2OC4xNDUsMjAuMTM1IEM2Ny43MDYsMTkuNjcyIDY3LjMyMywxOS4xNTYgNjcuMDA2LDE4LjYwMSBDNjYuOTg4LDE4LjU1OSA2Ni45NjgsMTguNTE5IDY2Ljk0NiwxOC40NzkgTDY2LjcxOSwxOC4wNjUgQzY2LjY5LDE4LjAxMiA2Ni42NTgsMTcuOTYgNjYuNjI0LDE3LjkxMSBDNjUuNjg2LDE2LjMzNyA2My45NTEsMTUuMzY2IDYyLjA1MywxNS4zNjYgQzYxLjA0MiwxNS4zNjYgNjAuMDMzLDE1LjY0IDU5LjEzNiwxNi4xNTggTDMuMTI1LDQ4LjUwMiBDMC40MjYsNTAuMDYxIC0wLjYxMyw1My40NDIgMC44MTEsNTYuMDQgTDExLjA4OSw3NC43OSBDMTEuMjY2LDc1LjExMyAxMS41MzcsNzUuMzUzIDExLjg1LDc1LjQ5NCBMNTguMjc2LDEwMi4yOTggQzU5LjY3OSwxMDMuMTA4IDYxLjQzMywxMDMuNjMgNjMuMzQ4LDEwMy44MDYgQzYzLjgxMiwxMDMuODQ4IDY0LjI4NSwxMDMuODcgNjQuNzU0LDEwMy44NyBDNjUsMTAzLjg3IDY1LjI0OSwxMDMuODY0IDY1LjQ5NCwxMDMuODUyIEM2NS41NjMsMTAzLjg0OSA2NS42MzIsMTAzLjg0NyA2NS43MDEsMTAzLjg0NyBDNjUuNzY0LDEwMy44NDcgNjUuODI4LDEwMy44NDkgNjUuODksMTAzLjg1MiBDNjUuOTg2LDEwMy44NTYgNjYuMDgsMTAzLjg2MyA2Ni4xNzMsMTAzLjg3NCBDNjYuMjgyLDEwNS40NjcgNjcuMzMyLDEwNy4xOTcgNjguNzAyLDEwNy45ODggTDExMS4xNzQsMTMyLjUxIEMxMTEuNjk4LDEzMi44MTIgMTEyLjIzMiwxMzIuOTY1IDExMi43NjQsMTMyLjk2NSBDMTE0LjI2MSwxMzIuOTY1IDExNS4zNDcsMTMxLjc2NSAxMTUuMzQ3LDEzMC4xMTMgTDExNS4zNDcsMTAzLjU1MSBMMTIyLjQ1OCw5OS40NDYgQzEyMi44MTksOTkuMjM3IDEyMy4wODcsOTguODk4IDEyMy4yMDcsOTguNDk4IEwxMjcuODY1LDgyLjkwNSBDMTMyLjI3OSw4My43MDIgMTM2LjU1Nyw4NC43NTMgMTQwLjYwNyw4Ni4wMzMgTDE0MS4xNCw4Ni44NjIgQzE0MS40NTEsODcuMzQ2IDE0MS45NzcsODcuNjEzIDE0Mi41MTYsODcuNjEzIEMxNDIuNzk0LDg3LjYxMyAxNDMuMDc2LDg3LjU0MiAxNDMuMzMzLDg3LjM5MyBMMTY5Ljg2NSw3Mi4wNzYgTDE5Myw4NS40MzMgQzE5My41MjMsODUuNzM1IDE5NC4wNTgsODUuODg4IDE5NC41OSw4NS44ODggQzE5Ni4wODcsODUuODg4IDE5Ny4xNzMsODQuNjg5IDE5Ny4xNzMsODMuMDM2IEwxOTcuMTczLDI5LjAzNSBDMTk3LjE3MywyOC40NTEgMTk2Ljg2MSwyNy45MTEgMTk2LjM1NSwyNy42MTkgQzE5Ni4zNTUsMjcuNjE5IDE3MS44NDMsMTMuNDY3IDE3MC4zODUsMTIuNjI2IEMxNzAuMTMyLDEyLjQ4IDE2OS44NSwxMi40MDcgMTY5LjU2OCwxMi40MDcgQzE2OS4yODUsMTIuNDA3IDE2OS4wMDIsMTIuNDgxIDE2OC43NDksMTIuNjI3IEMxNjguMTQzLDEyLjk3OCAxNjUuNzU2LDE0LjM1NyAxNjQuNDI0LDE1LjEyNSBMMTU5LjYxNSwxMC44NyBDMTU4Ljc5NiwxMC4xNDUgMTU4LjE1NCw4LjkzNyAxNTguMDU0LDcuOTM0IEMxNTguMDQ1LDcuODM3IDE1OC4wMzQsNy43MzkgMTU4LjAyMSw3LjY0IEMxNTguMDA1LDcuNTIzIDE1Ny45OTgsNy40MSAxNTcuOTk4LDcuMzA0IEwxNTcuOTk4LDYuNDE4IEMxNTcuOTk4LDUuODM0IDE1Ny42ODYsNS4yOTUgMTU3LjE4MSw1LjAwMiBDMTU2LjYyNCw0LjY4IDE1MC40NDIsMS4xMTEgMTUwLjQ0MiwxLjExMSBDMTUwLjE4OSwwLjk2NSAxNDkuOTA3LDAuODkyIDE0OS42MjUsMC44OTIiIGlkPSJGaWxsLTEiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTYuMDI3LDI1LjYzNiBMMTQyLjYwMyw1Mi41MjcgQzE0My44MDcsNTMuMjIyIDE0NC41ODIsNTQuMTE0IDE0NC44NDUsNTUuMDY4IEwxNDQuODM1LDU1LjA3NSBMNjMuNDYxLDEwMi4wNTcgTDYzLjQ2LDEwMi4wNTcgQzYxLjgwNiwxMDEuOTA1IDYwLjI2MSwxMDEuNDU3IDU5LjA1NywxMDAuNzYyIEwxMi40ODEsNzMuODcxIEw5Ni4wMjcsMjUuNjM2IiBpZD0iRmlsbC0yIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYzLjQ2MSwxMDIuMTc0IEM2My40NTMsMTAyLjE3NCA2My40NDYsMTAyLjE3NCA2My40MzksMTAyLjE3MiBDNjEuNzQ2LDEwMi4wMTYgNjAuMjExLDEwMS41NjMgNTguOTk4LDEwMC44NjMgTDEyLjQyMiw3My45NzMgQzEyLjM4Niw3My45NTIgMTIuMzY0LDczLjkxNCAxMi4zNjQsNzMuODcxIEMxMi4zNjQsNzMuODMgMTIuMzg2LDczLjc5MSAxMi40MjIsNzMuNzcgTDk1Ljk2OCwyNS41MzUgQzk2LjAwNCwyNS41MTQgOTYuMDQ5LDI1LjUxNCA5Ni4wODUsMjUuNTM1IEwxNDIuNjYxLDUyLjQyNiBDMTQzLjg4OCw1My4xMzQgMTQ0LjY4Miw1NC4wMzggMTQ0Ljk1Nyw1NS4wMzcgQzE0NC45Nyw1NS4wODMgMTQ0Ljk1Myw1NS4xMzMgMTQ0LjkxNSw1NS4xNjEgQzE0NC45MTEsNTUuMTY1IDE0NC44OTgsNTUuMTc0IDE0NC44OTQsNTUuMTc3IEw2My41MTksMTAyLjE1OCBDNjMuNTAxLDEwMi4xNjkgNjMuNDgxLDEwMi4xNzQgNjMuNDYxLDEwMi4xNzQgTDYzLjQ2MSwxMDIuMTc0IFogTTEyLjcxNCw3My44NzEgTDU5LjExNSwxMDAuNjYxIEM2MC4yOTMsMTAxLjM0MSA2MS43ODYsMTAxLjc4MiA2My40MzUsMTAxLjkzNyBMMTQ0LjcwNyw1NS4wMTUgQzE0NC40MjgsNTQuMTA4IDE0My42ODIsNTMuMjg1IDE0Mi41NDQsNTIuNjI4IEw5Ni4wMjcsMjUuNzcxIEwxMi43MTQsNzMuODcxIEwxMi43MTQsNzMuODcxIFoiIGlkPSJGaWxsLTMiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ4LjMyNyw1OC40NzEgQzE0OC4xNDUsNTguNDggMTQ3Ljk2Miw1OC40OCAxNDcuNzgxLDU4LjQ3MiBDMTQ1Ljg4Nyw1OC4zODkgMTQ0LjQ3OSw1Ny40MzQgMTQ0LjYzNiw1Ni4zNCBDMTQ0LjY4OSw1NS45NjcgMTQ0LjY2NCw1NS41OTcgMTQ0LjU2NCw1NS4yMzUgTDYzLjQ2MSwxMDIuMDU3IEM2NC4wODksMTAyLjExNSA2NC43MzMsMTAyLjEzIDY1LjM3OSwxMDIuMDk5IEM2NS41NjEsMTAyLjA5IDY1Ljc0MywxMDIuMDkgNjUuOTI1LDEwMi4wOTggQzY3LjgxOSwxMDIuMTgxIDY5LjIyNywxMDMuMTM2IDY5LjA3LDEwNC4yMyBMMTQ4LjMyNyw1OC40NzEiIGlkPSJGaWxsLTQiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjkuMDcsMTA0LjM0NyBDNjkuMDQ4LDEwNC4zNDcgNjkuMDI1LDEwNC4zNCA2OS4wMDUsMTA0LjMyNyBDNjguOTY4LDEwNC4zMDEgNjguOTQ4LDEwNC4yNTcgNjguOTU1LDEwNC4yMTMgQzY5LDEwMy44OTYgNjguODk4LDEwMy41NzYgNjguNjU4LDEwMy4yODggQzY4LjE1MywxMDIuNjc4IDY3LjEwMywxMDIuMjY2IDY1LjkyLDEwMi4yMTQgQzY1Ljc0MiwxMDIuMjA2IDY1LjU2MywxMDIuMjA3IDY1LjM4NSwxMDIuMjE1IEM2NC43NDIsMTAyLjI0NiA2NC4wODcsMTAyLjIzMiA2My40NSwxMDIuMTc0IEM2My4zOTksMTAyLjE2OSA2My4zNTgsMTAyLjEzMiA2My4zNDcsMTAyLjA4MiBDNjMuMzM2LDEwMi4wMzMgNjMuMzU4LDEwMS45ODEgNjMuNDAyLDEwMS45NTYgTDE0NC41MDYsNTUuMTM0IEMxNDQuNTM3LDU1LjExNiAxNDQuNTc1LDU1LjExMyAxNDQuNjA5LDU1LjEyNyBDMTQ0LjY0Miw1NS4xNDEgMTQ0LjY2OCw1NS4xNyAxNDQuNjc3LDU1LjIwNCBDMTQ0Ljc4MSw1NS41ODUgMTQ0LjgwNiw1NS45NzIgMTQ0Ljc1MSw1Ni4zNTcgQzE0NC43MDYsNTYuNjczIDE0NC44MDgsNTYuOTk0IDE0NS4wNDcsNTcuMjgyIEMxNDUuNTUzLDU3Ljg5MiAxNDYuNjAyLDU4LjMwMyAxNDcuNzg2LDU4LjM1NSBDMTQ3Ljk2NCw1OC4zNjMgMTQ4LjE0Myw1OC4zNjMgMTQ4LjMyMSw1OC4zNTQgQzE0OC4zNzcsNTguMzUyIDE0OC40MjQsNTguMzg3IDE0OC40MzksNTguNDM4IEMxNDguNDU0LDU4LjQ5IDE0OC40MzIsNTguNTQ1IDE0OC4zODUsNTguNTcyIEw2OS4xMjksMTA0LjMzMSBDNjkuMTExLDEwNC4zNDIgNjkuMDksMTA0LjM0NyA2OS4wNywxMDQuMzQ3IEw2OS4wNywxMDQuMzQ3IFogTTY1LjY2NSwxMDEuOTc1IEM2NS43NTQsMTAxLjk3NSA2NS44NDIsMTAxLjk3NyA2NS45MywxMDEuOTgxIEM2Ny4xOTYsMTAyLjAzNyA2OC4yODMsMTAyLjQ2OSA2OC44MzgsMTAzLjEzOSBDNjkuMDY1LDEwMy40MTMgNjkuMTg4LDEwMy43MTQgNjkuMTk4LDEwNC4wMjEgTDE0Ny44ODMsNTguNTkyIEMxNDcuODQ3LDU4LjU5MiAxNDcuODExLDU4LjU5MSAxNDcuNzc2LDU4LjU4OSBDMTQ2LjUwOSw1OC41MzMgMTQ1LjQyMiw1OC4xIDE0NC44NjcsNTcuNDMxIEMxNDQuNTg1LDU3LjA5MSAxNDQuNDY1LDU2LjcwNyAxNDQuNTIsNTYuMzI0IEMxNDQuNTYzLDU2LjAyMSAxNDQuNTUyLDU1LjcxNiAxNDQuNDg4LDU1LjQxNCBMNjMuODQ2LDEwMS45NyBDNjQuMzUzLDEwMi4wMDIgNjQuODY3LDEwMi4wMDYgNjUuMzc0LDEwMS45ODIgQzY1LjQ3MSwxMDEuOTc3IDY1LjU2OCwxMDEuOTc1IDY1LjY2NSwxMDEuOTc1IEw2NS42NjUsMTAxLjk3NSBaIiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIuMjA4LDU1LjEzNCBDMS4yMDcsNTMuMzA3IDEuOTY3LDUwLjkxNyAzLjkwNiw0OS43OTcgTDU5LjkxNywxNy40NTMgQzYxLjg1NiwxNi4zMzMgNjQuMjQxLDE2LjkwNyA2NS4yNDMsMTguNzM0IEw2NS40NzUsMTkuMTQ0IEM2NS44NzIsMTkuODgyIDY2LjM2OCwyMC41NiA2Ni45NDUsMjEuMTY1IEw2Ny4yMjMsMjEuNDM1IEM3MC41NDgsMjQuNjQ5IDc1LjgwNiwyNS4xNTEgODAuMTExLDIyLjY2NSBMODcuNDMsMTguNDQ1IEM4OS4zNywxNy4zMjYgOTEuNzU0LDE3Ljg5OSA5Mi43NTUsMTkuNzI3IEw5Ni4wMDUsMjUuNjU1IEwxMi40ODYsNzMuODg0IEwyLjIwOCw1NS4xMzQgWiIgaWQ9IkZpbGwtNiIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi40ODYsNzQuMDAxIEMxMi40NzYsNzQuMDAxIDEyLjQ2NSw3My45OTkgMTIuNDU1LDczLjk5NiBDMTIuNDI0LDczLjk4OCAxMi4zOTksNzMuOTY3IDEyLjM4NCw3My45NCBMMi4xMDYsNTUuMTkgQzEuMDc1LDUzLjMxIDEuODU3LDUwLjg0NSAzLjg0OCw0OS42OTYgTDU5Ljg1OCwxNy4zNTIgQzYwLjUyNSwxNi45NjcgNjEuMjcxLDE2Ljc2NCA2Mi4wMTYsMTYuNzY0IEM2My40MzEsMTYuNzY0IDY0LjY2NiwxNy40NjYgNjUuMzI3LDE4LjY0NiBDNjUuMzM3LDE4LjY1NCA2NS4zNDUsMTguNjYzIDY1LjM1MSwxOC42NzQgTDY1LjU3OCwxOS4wODggQzY1LjU4NCwxOS4xIDY1LjU4OSwxOS4xMTIgNjUuNTkxLDE5LjEyNiBDNjUuOTg1LDE5LjgzOCA2Ni40NjksMjAuNDk3IDY3LjAzLDIxLjA4NSBMNjcuMzA1LDIxLjM1MSBDNjkuMTUxLDIzLjEzNyA3MS42NDksMjQuMTIgNzQuMzM2LDI0LjEyIEM3Ni4zMTMsMjQuMTIgNzguMjksMjMuNTgyIDgwLjA1MywyMi41NjMgQzgwLjA2NCwyMi41NTcgODAuMDc2LDIyLjU1MyA4MC4wODgsMjIuNTUgTDg3LjM3MiwxOC4zNDQgQzg4LjAzOCwxNy45NTkgODguNzg0LDE3Ljc1NiA4OS41MjksMTcuNzU2IEM5MC45NTYsMTcuNzU2IDkyLjIwMSwxOC40NzIgOTIuODU4LDE5LjY3IEw5Ni4xMDcsMjUuNTk5IEM5Ni4xMzgsMjUuNjU0IDk2LjExOCwyNS43MjQgOTYuMDYzLDI1Ljc1NiBMMTIuNTQ1LDczLjk4NSBDMTIuNTI2LDczLjk5NiAxMi41MDYsNzQuMDAxIDEyLjQ4Niw3NC4wMDEgTDEyLjQ4Niw3NC4wMDEgWiBNNjIuMDE2LDE2Ljk5NyBDNjEuMzEyLDE2Ljk5NyA2MC42MDYsMTcuMTkgNTkuOTc1LDE3LjU1NCBMMy45NjUsNDkuODk5IEMyLjA4Myw1MC45ODUgMS4zNDEsNTMuMzA4IDIuMzEsNTUuMDc4IEwxMi41MzEsNzMuNzIzIEw5NS44NDgsMjUuNjExIEw5Mi42NTMsMTkuNzgyIEM5Mi4wMzgsMTguNjYgOTAuODcsMTcuOTkgODkuNTI5LDE3Ljk5IEM4OC44MjUsMTcuOTkgODguMTE5LDE4LjE4MiA4Ny40ODksMTguNTQ3IEw4MC4xNzIsMjIuNzcyIEM4MC4xNjEsMjIuNzc4IDgwLjE0OSwyMi43ODIgODAuMTM3LDIyLjc4NSBDNzguMzQ2LDIzLjgxMSA3Ni4zNDEsMjQuMzU0IDc0LjMzNiwyNC4zNTQgQzcxLjU4OCwyNC4zNTQgNjkuMDMzLDIzLjM0NyA2Ny4xNDIsMjEuNTE5IEw2Ni44NjQsMjEuMjQ5IEM2Ni4yNzcsMjAuNjM0IDY1Ljc3NCwxOS45NDcgNjUuMzY3LDE5LjIwMyBDNjUuMzYsMTkuMTkyIDY1LjM1NiwxOS4xNzkgNjUuMzU0LDE5LjE2NiBMNjUuMTYzLDE4LjgxOSBDNjUuMTU0LDE4LjgxMSA2NS4xNDYsMTguODAxIDY1LjE0LDE4Ljc5IEM2NC41MjUsMTcuNjY3IDYzLjM1NywxNi45OTcgNjIuMDE2LDE2Ljk5NyBMNjIuMDE2LDE2Ljk5NyBaIiBpZD0iRmlsbC03IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQyLjQzNCw0OC44MDggTDQyLjQzNCw0OC44MDggQzM5LjkyNCw0OC44MDcgMzcuNzM3LDQ3LjU1IDM2LjU4Miw0NS40NDMgQzM0Ljc3MSw0Mi4xMzkgMzYuMTQ0LDM3LjgwOSAzOS42NDEsMzUuNzg5IEw1MS45MzIsMjguNjkxIEM1My4xMDMsMjguMDE1IDU0LjQxMywyNy42NTggNTUuNzIxLDI3LjY1OCBDNTguMjMxLDI3LjY1OCA2MC40MTgsMjguOTE2IDYxLjU3MywzMS4wMjMgQzYzLjM4NCwzNC4zMjcgNjIuMDEyLDM4LjY1NyA1OC41MTQsNDAuNjc3IEw0Ni4yMjMsNDcuNzc1IEM0NS4wNTMsNDguNDUgNDMuNzQyLDQ4LjgwOCA0Mi40MzQsNDguODA4IEw0Mi40MzQsNDguODA4IFogTTU1LjcyMSwyOC4xMjUgQzU0LjQ5NSwyOC4xMjUgNTMuMjY1LDI4LjQ2MSA1Mi4xNjYsMjkuMDk2IEwzOS44NzUsMzYuMTk0IEMzNi41OTYsMzguMDg3IDM1LjMwMiw0Mi4xMzYgMzYuOTkyLDQ1LjIxOCBDMzguMDYzLDQ3LjE3MyA0MC4wOTgsNDguMzQgNDIuNDM0LDQ4LjM0IEM0My42NjEsNDguMzQgNDQuODksNDguMDA1IDQ1Ljk5LDQ3LjM3IEw1OC4yODEsNDAuMjcyIEM2MS41NiwzOC4zNzkgNjIuODUzLDM0LjMzIDYxLjE2NCwzMS4yNDggQzYwLjA5MiwyOS4yOTMgNTguMDU4LDI4LjEyNSA1NS43MjEsMjguMTI1IEw1NS43MjEsMjguMTI1IFoiIGlkPSJGaWxsLTgiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjU4OCwyLjQwNyBDMTQ5LjU4OCwyLjQwNyAxNTUuNzY4LDUuOTc1IDE1Ni4zMjUsNi4yOTcgTDE1Ni4zMjUsNy4xODQgQzE1Ni4zMjUsNy4zNiAxNTYuMzM4LDcuNTQ0IDE1Ni4zNjIsNy43MzMgQzE1Ni4zNzMsNy44MTQgMTU2LjM4Miw3Ljg5NCAxNTYuMzksNy45NzUgQzE1Ni41Myw5LjM5IDE1Ny4zNjMsMTAuOTczIDE1OC40OTUsMTEuOTc0IEwxNjUuODkxLDE4LjUxOSBDMTY2LjA2OCwxOC42NzUgMTY2LjI0OSwxOC44MTQgMTY2LjQzMiwxOC45MzQgQzE2OC4wMTEsMTkuOTc0IDE2OS4zODIsMTkuNCAxNjkuNDk0LDE3LjY1MiBDMTY5LjU0MywxNi44NjggMTY5LjU1MSwxNi4wNTcgMTY5LjUxNywxNS4yMjMgTDE2OS41MTQsMTUuMDYzIEwxNjkuNTE0LDEzLjkxMiBDMTcwLjc4LDE0LjY0MiAxOTUuNTAxLDI4LjkxNSAxOTUuNTAxLDI4LjkxNSBMMTk1LjUwMSw4Mi45MTUgQzE5NS41MDEsODQuMDA1IDE5NC43MzEsODQuNDQ1IDE5My43ODEsODMuODk3IEwxNTEuMzA4LDU5LjM3NCBDMTUwLjM1OCw1OC44MjYgMTQ5LjU4OCw1Ny40OTcgMTQ5LjU4OCw1Ni40MDggTDE0OS41ODgsMjIuMzc1IiBpZD0iRmlsbC05IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE5NC41NTMsODQuMjUgQzE5NC4yOTYsODQuMjUgMTk0LjAxMyw4NC4xNjUgMTkzLjcyMiw4My45OTcgTDE1MS4yNSw1OS40NzYgQzE1MC4yNjksNTguOTA5IDE0OS40NzEsNTcuNTMzIDE0OS40NzEsNTYuNDA4IEwxNDkuNDcxLDIyLjM3NSBMMTQ5LjcwNSwyMi4zNzUgTDE0OS43MDUsNTYuNDA4IEMxNDkuNzA1LDU3LjQ1OSAxNTAuNDUsNTguNzQ0IDE1MS4zNjYsNTkuMjc0IEwxOTMuODM5LDgzLjc5NSBDMTk0LjI2Myw4NC4wNCAxOTQuNjU1LDg0LjA4MyAxOTQuOTQyLDgzLjkxNyBDMTk1LjIyNyw4My43NTMgMTk1LjM4NCw4My4zOTcgMTk1LjM4NCw4Mi45MTUgTDE5NS4zODQsMjguOTgyIEMxOTQuMTAyLDI4LjI0MiAxNzIuMTA0LDE1LjU0MiAxNjkuNjMxLDE0LjExNCBMMTY5LjYzNCwxNS4yMiBDMTY5LjY2OCwxNi4wNTIgMTY5LjY2LDE2Ljg3NCAxNjkuNjEsMTcuNjU5IEMxNjkuNTU2LDE4LjUwMyAxNjkuMjE0LDE5LjEyMyAxNjguNjQ3LDE5LjQwNSBDMTY4LjAyOCwxOS43MTQgMTY3LjE5NywxOS41NzggMTY2LjM2NywxOS4wMzIgQzE2Ni4xODEsMTguOTA5IDE2NS45OTUsMTguNzY2IDE2NS44MTQsMTguNjA2IEwxNTguNDE3LDEyLjA2MiBDMTU3LjI1OSwxMS4wMzYgMTU2LjQxOCw5LjQzNyAxNTYuMjc0LDcuOTg2IEMxNTYuMjY2LDcuOTA3IDE1Ni4yNTcsNy44MjcgMTU2LjI0Nyw3Ljc0OCBDMTU2LjIyMSw3LjU1NSAxNTYuMjA5LDcuMzY1IDE1Ni4yMDksNy4xODQgTDE1Ni4yMDksNi4zNjQgQzE1NS4zNzUsNS44ODMgMTQ5LjUyOSwyLjUwOCAxNDkuNTI5LDIuNTA4IEwxNDkuNjQ2LDIuMzA2IEMxNDkuNjQ2LDIuMzA2IDE1NS44MjcsNS44NzQgMTU2LjM4NCw2LjE5NiBMMTU2LjQ0Miw2LjIzIEwxNTYuNDQyLDcuMTg0IEMxNTYuNDQyLDcuMzU1IDE1Ni40NTQsNy41MzUgMTU2LjQ3OCw3LjcxNyBDMTU2LjQ4OSw3LjggMTU2LjQ5OSw3Ljg4MiAxNTYuNTA3LDcuOTYzIEMxNTYuNjQ1LDkuMzU4IDE1Ny40NTUsMTAuODk4IDE1OC41NzIsMTEuODg2IEwxNjUuOTY5LDE4LjQzMSBDMTY2LjE0MiwxOC41ODQgMTY2LjMxOSwxOC43MiAxNjYuNDk2LDE4LjgzNyBDMTY3LjI1NCwxOS4zMzYgMTY4LDE5LjQ2NyAxNjguNTQzLDE5LjE5NiBDMTY5LjAzMywxOC45NTMgMTY5LjMyOSwxOC40MDEgMTY5LjM3NywxNy42NDUgQzE2OS40MjcsMTYuODY3IDE2OS40MzQsMTYuMDU0IDE2OS40MDEsMTUuMjI4IEwxNjkuMzk3LDE1LjA2NSBMMTY5LjM5NywxMy43MSBMMTY5LjU3MiwxMy44MSBDMTcwLjgzOSwxNC41NDEgMTk1LjU1OSwyOC44MTQgMTk1LjU1OSwyOC44MTQgTDE5NS42MTgsMjguODQ3IEwxOTUuNjE4LDgyLjkxNSBDMTk1LjYxOCw4My40ODQgMTk1LjQyLDgzLjkxMSAxOTUuMDU5LDg0LjExOSBDMTk0LjkwOCw4NC4yMDYgMTk0LjczNyw4NC4yNSAxOTQuNTUzLDg0LjI1IiBpZD0iRmlsbC0xMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDUuNjg1LDU2LjE2MSBMMTY5LjgsNzAuMDgzIEwxNDMuODIyLDg1LjA4MSBMMTQyLjM2LDg0Ljc3NCBDMTM1LjgyNiw4Mi42MDQgMTI4LjczMiw4MS4wNDYgMTIxLjM0MSw4MC4xNTggQzExNi45NzYsNzkuNjM0IDExMi42NzgsODEuMjU0IDExMS43NDMsODMuNzc4IEMxMTEuNTA2LDg0LjQxNCAxMTEuNTAzLDg1LjA3MSAxMTEuNzMyLDg1LjcwNiBDMTEzLjI3LDg5Ljk3MyAxMTUuOTY4LDk0LjA2OSAxMTkuNzI3LDk3Ljg0MSBMMTIwLjI1OSw5OC42ODYgQzEyMC4yNiw5OC42ODUgOTQuMjgyLDExMy42ODMgOTQuMjgyLDExMy42ODMgTDcwLjE2Nyw5OS43NjEgTDE0NS42ODUsNTYuMTYxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NC4yODIsMTEzLjgxOCBMOTQuMjIzLDExMy43ODUgTDY5LjkzMyw5OS43NjEgTDcwLjEwOCw5OS42NiBMMTQ1LjY4NSw1Ni4wMjYgTDE0NS43NDMsNTYuMDU5IEwxNzAuMDMzLDcwLjA4MyBMMTQzLjg0Miw4NS4yMDUgTDE0My43OTcsODUuMTk1IEMxNDMuNzcyLDg1LjE5IDE0Mi4zMzYsODQuODg4IDE0Mi4zMzYsODQuODg4IEMxMzUuNzg3LDgyLjcxNCAxMjguNzIzLDgxLjE2MyAxMjEuMzI3LDgwLjI3NCBDMTIwLjc4OCw4MC4yMDkgMTIwLjIzNiw4MC4xNzcgMTE5LjY4OSw4MC4xNzcgQzExNS45MzEsODAuMTc3IDExMi42MzUsODEuNzA4IDExMS44NTIsODMuODE5IEMxMTEuNjI0LDg0LjQzMiAxMTEuNjIxLDg1LjA1MyAxMTEuODQyLDg1LjY2NyBDMTEzLjM3Nyw4OS45MjUgMTE2LjA1OCw5My45OTMgMTE5LjgxLDk3Ljc1OCBMMTE5LjgyNiw5Ny43NzkgTDEyMC4zNTIsOTguNjE0IEMxMjAuMzU0LDk4LjYxNyAxMjAuMzU2LDk4LjYyIDEyMC4zNTgsOTguNjI0IEwxMjAuNDIyLDk4LjcyNiBMMTIwLjMxNyw5OC43ODcgQzEyMC4yNjQsOTguODE4IDk0LjU5OSwxMTMuNjM1IDk0LjM0LDExMy43ODUgTDk0LjI4MiwxMTMuODE4IEw5NC4yODIsMTEzLjgxOCBaIE03MC40MDEsOTkuNzYxIEw5NC4yODIsMTEzLjU0OSBMMTE5LjA4NCw5OS4yMjkgQzExOS42Myw5OC45MTQgMTE5LjkzLDk4Ljc0IDEyMC4xMDEsOTguNjU0IEwxMTkuNjM1LDk3LjkxNCBDMTE1Ljg2NCw5NC4xMjcgMTEzLjE2OCw5MC4wMzMgMTExLjYyMiw4NS43NDYgQzExMS4zODIsODUuMDc5IDExMS4zODYsODQuNDA0IDExMS42MzMsODMuNzM4IEMxMTIuNDQ4LDgxLjUzOSAxMTUuODM2LDc5Ljk0MyAxMTkuNjg5LDc5Ljk0MyBDMTIwLjI0Niw3OS45NDMgMTIwLjgwNiw3OS45NzYgMTIxLjM1NSw4MC4wNDIgQzEyOC43NjcsODAuOTMzIDEzNS44NDYsODIuNDg3IDE0Mi4zOTYsODQuNjYzIEMxNDMuMjMyLDg0LjgzOCAxNDMuNjExLDg0LjkxNyAxNDMuNzg2LDg0Ljk2NyBMMTY5LjU2Niw3MC4wODMgTDE0NS42ODUsNTYuMjk1IEw3MC40MDEsOTkuNzYxIEw3MC40MDEsOTkuNzYxIFoiIGlkPSJGaWxsLTEyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2Ny4yMywxOC45NzkgTDE2Ny4yMyw2OS44NSBMMTM5LjkwOSw4NS42MjMgTDEzMy40NDgsNzEuNDU2IEMxMzIuNTM4LDY5LjQ2IDEzMC4wMiw2OS43MTggMTI3LjgyNCw3Mi4wMyBDMTI2Ljc2OSw3My4xNCAxMjUuOTMxLDc0LjU4NSAxMjUuNDk0LDc2LjA0OCBMMTE5LjAzNCw5Ny42NzYgTDkxLjcxMiwxMTMuNDUgTDkxLjcxMiw2Mi41NzkgTDE2Ny4yMywxOC45NzkiIGlkPSJGaWxsLTEzIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTkxLjcxMiwxMTMuNTY3IEM5MS42OTIsMTEzLjU2NyA5MS42NzIsMTEzLjU2MSA5MS42NTMsMTEzLjU1MSBDOTEuNjE4LDExMy41MyA5MS41OTUsMTEzLjQ5MiA5MS41OTUsMTEzLjQ1IEw5MS41OTUsNjIuNTc5IEM5MS41OTUsNjIuNTM3IDkxLjYxOCw2Mi40OTkgOTEuNjUzLDYyLjQ3OCBMMTY3LjE3MiwxOC44NzggQzE2Ny4yMDgsMTguODU3IDE2Ny4yNTIsMTguODU3IDE2Ny4yODgsMTguODc4IEMxNjcuMzI0LDE4Ljg5OSAxNjcuMzQ3LDE4LjkzNyAxNjcuMzQ3LDE4Ljk3OSBMMTY3LjM0Nyw2OS44NSBDMTY3LjM0Nyw2OS44OTEgMTY3LjMyNCw2OS45MyAxNjcuMjg4LDY5Ljk1IEwxMzkuOTY3LDg1LjcyNSBDMTM5LjkzOSw4NS43NDEgMTM5LjkwNSw4NS43NDUgMTM5Ljg3Myw4NS43MzUgQzEzOS44NDIsODUuNzI1IDEzOS44MTYsODUuNzAyIDEzOS44MDIsODUuNjcyIEwxMzMuMzQyLDcxLjUwNCBDMTMyLjk2Nyw3MC42ODIgMTMyLjI4LDcwLjIyOSAxMzEuNDA4LDcwLjIyOSBDMTMwLjMxOSw3MC4yMjkgMTI5LjA0NCw3MC45MTUgMTI3LjkwOCw3Mi4xMSBDMTI2Ljg3NCw3My4yIDEyNi4wMzQsNzQuNjQ3IDEyNS42MDYsNzYuMDgyIEwxMTkuMTQ2LDk3LjcwOSBDMTE5LjEzNyw5Ny43MzggMTE5LjExOCw5Ny43NjIgMTE5LjA5Miw5Ny43NzcgTDkxLjc3LDExMy41NTEgQzkxLjc1MiwxMTMuNTYxIDkxLjczMiwxMTMuNTY3IDkxLjcxMiwxMTMuNTY3IEw5MS43MTIsMTEzLjU2NyBaIE05MS44MjksNjIuNjQ3IEw5MS44MjksMTEzLjI0OCBMMTE4LjkzNSw5Ny41OTggTDEyNS4zODIsNzYuMDE1IEMxMjUuODI3LDc0LjUyNSAxMjYuNjY0LDczLjA4MSAxMjcuNzM5LDcxLjk1IEMxMjguOTE5LDcwLjcwOCAxMzAuMjU2LDY5Ljk5NiAxMzEuNDA4LDY5Ljk5NiBDMTMyLjM3Nyw2OS45OTYgMTMzLjEzOSw3MC40OTcgMTMzLjU1NCw3MS40MDcgTDEzOS45NjEsODUuNDU4IEwxNjcuMTEzLDY5Ljc4MiBMMTY3LjExMywxOS4xODEgTDkxLjgyOSw2Mi42NDcgTDkxLjgyOSw2Mi42NDcgWiIgaWQ9IkZpbGwtMTQiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTY4LjU0MywxOS4yMTMgTDE2OC41NDMsNzAuMDgzIEwxNDEuMjIxLDg1Ljg1NyBMMTM0Ljc2MSw3MS42ODkgQzEzMy44NTEsNjkuNjk0IDEzMS4zMzMsNjkuOTUxIDEyOS4xMzcsNzIuMjYzIEMxMjguMDgyLDczLjM3NCAxMjcuMjQ0LDc0LjgxOSAxMjYuODA3LDc2LjI4MiBMMTIwLjM0Niw5Ny45MDkgTDkzLjAyNSwxMTMuNjgzIEw5My4wMjUsNjIuODEzIEwxNjguNTQzLDE5LjIxMyIgaWQ9IkZpbGwtMTUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTMuMDI1LDExMy44IEM5My4wMDUsMTEzLjggOTIuOTg0LDExMy43OTUgOTIuOTY2LDExMy43ODUgQzkyLjkzMSwxMTMuNzY0IDkyLjkwOCwxMTMuNzI1IDkyLjkwOCwxMTMuNjg0IEw5Mi45MDgsNjIuODEzIEM5Mi45MDgsNjIuNzcxIDkyLjkzMSw2Mi43MzMgOTIuOTY2LDYyLjcxMiBMMTY4LjQ4NCwxOS4xMTIgQzE2OC41MiwxOS4wOSAxNjguNTY1LDE5LjA5IDE2OC42MDEsMTkuMTEyIEMxNjguNjM3LDE5LjEzMiAxNjguNjYsMTkuMTcxIDE2OC42NiwxOS4yMTIgTDE2OC42Niw3MC4wODMgQzE2OC42Niw3MC4xMjUgMTY4LjYzNyw3MC4xNjQgMTY4LjYwMSw3MC4xODQgTDE0MS4yOCw4NS45NTggQzE0MS4yNTEsODUuOTc1IDE0MS4yMTcsODUuOTc5IDE0MS4xODYsODUuOTY4IEMxNDEuMTU0LDg1Ljk1OCAxNDEuMTI5LDg1LjkzNiAxNDEuMTE1LDg1LjkwNiBMMTM0LjY1NSw3MS43MzggQzEzNC4yOCw3MC45MTUgMTMzLjU5Myw3MC40NjMgMTMyLjcyLDcwLjQ2MyBDMTMxLjYzMiw3MC40NjMgMTMwLjM1Nyw3MS4xNDggMTI5LjIyMSw3Mi4zNDQgQzEyOC4xODYsNzMuNDMzIDEyNy4zNDcsNzQuODgxIDEyNi45MTksNzYuMzE1IEwxMjAuNDU4LDk3Ljk0MyBDMTIwLjQ1LDk3Ljk3MiAxMjAuNDMxLDk3Ljk5NiAxMjAuNDA1LDk4LjAxIEw5My4wODMsMTEzLjc4NSBDOTMuMDY1LDExMy43OTUgOTMuMDQ1LDExMy44IDkzLjAyNSwxMTMuOCBMOTMuMDI1LDExMy44IFogTTkzLjE0Miw2Mi44ODEgTDkzLjE0MiwxMTMuNDgxIEwxMjAuMjQ4LDk3LjgzMiBMMTI2LjY5NSw3Ni4yNDggQzEyNy4xNCw3NC43NTggMTI3Ljk3Nyw3My4zMTUgMTI5LjA1Miw3Mi4xODMgQzEzMC4yMzEsNzAuOTQyIDEzMS41NjgsNzAuMjI5IDEzMi43Miw3MC4yMjkgQzEzMy42ODksNzAuMjI5IDEzNC40NTIsNzAuNzMxIDEzNC44NjcsNzEuNjQxIEwxNDEuMjc0LDg1LjY5MiBMMTY4LjQyNiw3MC4wMTYgTDE2OC40MjYsMTkuNDE1IEw5My4xNDIsNjIuODgxIEw5My4xNDIsNjIuODgxIFoiIGlkPSJGaWxsLTE2IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS44LDcwLjA4MyBMMTQyLjQ3OCw4NS44NTcgTDEzNi4wMTgsNzEuNjg5IEMxMzUuMTA4LDY5LjY5NCAxMzIuNTksNjkuOTUxIDEzMC4zOTMsNzIuMjYzIEMxMjkuMzM5LDczLjM3NCAxMjguNSw3NC44MTkgMTI4LjA2NCw3Ni4yODIgTDEyMS42MDMsOTcuOTA5IEw5NC4yODIsMTEzLjY4MyBMOTQuMjgyLDYyLjgxMyBMMTY5LjgsMTkuMjEzIEwxNjkuOCw3MC4wODMgWiIgaWQ9IkZpbGwtMTciIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTQuMjgyLDExMy45MTcgQzk0LjI0MSwxMTMuOTE3IDk0LjIwMSwxMTMuOTA3IDk0LjE2NSwxMTMuODg2IEM5NC4wOTMsMTEzLjg0NSA5NC4wNDgsMTEzLjc2NyA5NC4wNDgsMTEzLjY4NCBMOTQuMDQ4LDYyLjgxMyBDOTQuMDQ4LDYyLjczIDk0LjA5Myw2Mi42NTIgOTQuMTY1LDYyLjYxMSBMMTY5LjY4MywxOS4wMSBDMTY5Ljc1NSwxOC45NjkgMTY5Ljg0NCwxOC45NjkgMTY5LjkxNywxOS4wMSBDMTY5Ljk4OSwxOS4wNTIgMTcwLjAzMywxOS4xMjkgMTcwLjAzMywxOS4yMTIgTDE3MC4wMzMsNzAuMDgzIEMxNzAuMDMzLDcwLjE2NiAxNjkuOTg5LDcwLjI0NCAxNjkuOTE3LDcwLjI4NSBMMTQyLjU5NSw4Ni4wNiBDMTQyLjUzOCw4Ni4wOTIgMTQyLjQ2OSw4Ni4xIDE0Mi40MDcsODYuMDggQzE0Mi4zNDQsODYuMDYgMTQyLjI5Myw4Ni4wMTQgMTQyLjI2Niw4NS45NTQgTDEzNS44MDUsNzEuNzg2IEMxMzUuNDQ1LDcwLjk5NyAxMzQuODEzLDcwLjU4IDEzMy45NzcsNzAuNTggQzEzMi45MjEsNzAuNTggMTMxLjY3Niw3MS4yNTIgMTMwLjU2Miw3Mi40MjQgQzEyOS41NCw3My41MDEgMTI4LjcxMSw3NC45MzEgMTI4LjI4Nyw3Ni4zNDggTDEyMS44MjcsOTcuOTc2IEMxMjEuODEsOTguMDM0IDEyMS43NzEsOTguMDgyIDEyMS43Miw5OC4xMTIgTDk0LjM5OCwxMTMuODg2IEM5NC4zNjIsMTEzLjkwNyA5NC4zMjIsMTEzLjkxNyA5NC4yODIsMTEzLjkxNyBMOTQuMjgyLDExMy45MTcgWiBNOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDExMy4yNzkgTDEyMS40MDYsOTcuNzU0IEwxMjcuODQsNzYuMjE1IEMxMjguMjksNzQuNzA4IDEyOS4xMzcsNzMuMjQ3IDEzMC4yMjQsNzIuMTAzIEMxMzEuNDI1LDcwLjgzOCAxMzIuNzkzLDcwLjExMiAxMzMuOTc3LDcwLjExMiBDMTM0Ljk5NSw3MC4xMTIgMTM1Ljc5NSw3MC42MzggMTM2LjIzLDcxLjU5MiBMMTQyLjU4NCw4NS41MjYgTDE2OS41NjYsNjkuOTQ4IEwxNjkuNTY2LDE5LjYxNyBMOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDYyLjk0OCBaIiBpZD0iRmlsbC0xOCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDkuODk0LDkyLjk0MyBMMTA5Ljg5NCw5Mi45NDMgQzEwOC4xMiw5Mi45NDMgMTA2LjY1Myw5Mi4yMTggMTA1LjY1LDkwLjgyMyBDMTA1LjU4Myw5MC43MzEgMTA1LjU5Myw5MC42MSAxMDUuNjczLDkwLjUyOSBDMTA1Ljc1Myw5MC40NDggMTA1Ljg4LDkwLjQ0IDEwNS45NzQsOTAuNTA2IEMxMDYuNzU0LDkxLjA1MyAxMDcuNjc5LDkxLjMzMyAxMDguNzI0LDkxLjMzMyBDMTEwLjA0Nyw5MS4zMzMgMTExLjQ3OCw5MC44OTQgMTEyLjk4LDkwLjAyNyBDMTE4LjI5MSw4Ni45NiAxMjIuNjExLDc5LjUwOSAxMjIuNjExLDczLjQxNiBDMTIyLjYxMSw3MS40ODkgMTIyLjE2OSw2OS44NTYgMTIxLjMzMyw2OC42OTIgQzEyMS4yNjYsNjguNiAxMjEuMjc2LDY4LjQ3MyAxMjEuMzU2LDY4LjM5MiBDMTIxLjQzNiw2OC4zMTEgMTIxLjU2Myw2OC4yOTkgMTIxLjY1Niw2OC4zNjUgQzEyMy4zMjcsNjkuNTM3IDEyNC4yNDcsNzEuNzQ2IDEyNC4yNDcsNzQuNTg0IEMxMjQuMjQ3LDgwLjgyNiAxMTkuODIxLDg4LjQ0NyAxMTQuMzgyLDkxLjU4NyBDMTEyLjgwOCw5Mi40OTUgMTExLjI5OCw5Mi45NDMgMTA5Ljg5NCw5Mi45NDMgTDEwOS44OTQsOTIuOTQzIFogTTEwNi45MjUsOTEuNDAxIEMxMDcuNzM4LDkyLjA1MiAxMDguNzQ1LDkyLjI3OCAxMDkuODkzLDkyLjI3OCBMMTA5Ljg5NCw5Mi4yNzggQzExMS4yMTUsOTIuMjc4IDExMi42NDcsOTEuOTUxIDExNC4xNDgsOTEuMDg0IEMxMTkuNDU5LDg4LjAxNyAxMjMuNzgsODAuNjIxIDEyMy43OCw3NC41MjggQzEyMy43OCw3Mi41NDkgMTIzLjMxNyw3MC45MjkgMTIyLjQ1NCw2OS43NjcgQzEyMi44NjUsNzAuODAyIDEyMy4wNzksNzIuMDQyIDEyMy4wNzksNzMuNDAyIEMxMjMuMDc5LDc5LjY0NSAxMTguNjUzLDg3LjI4NSAxMTMuMjE0LDkwLjQyNSBDMTExLjY0LDkxLjMzNCAxMTAuMTMsOTEuNzQyIDEwOC43MjQsOTEuNzQyIEMxMDguMDgzLDkxLjc0MiAxMDcuNDgxLDkxLjU5MyAxMDYuOTI1LDkxLjQwMSBMMTA2LjkyNSw5MS40MDEgWiIgaWQ9IkZpbGwtMTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjA5Nyw5MC4yMyBDMTE4LjQ4MSw4Ny4xMjIgMTIyLjg0NSw3OS41OTQgMTIyLjg0NSw3My40MTYgQzEyMi44NDUsNzEuMzY1IDEyMi4zNjIsNjkuNzI0IDEyMS41MjIsNjguNTU2IEMxMTkuNzM4LDY3LjMwNCAxMTcuMTQ4LDY3LjM2MiAxMTQuMjY1LDY5LjAyNiBDMTA4Ljg4MSw3Mi4xMzQgMTA0LjUxNyw3OS42NjIgMTA0LjUxNyw4NS44NCBDMTA0LjUxNyw4Ny44OTEgMTA1LDg5LjUzMiAxMDUuODQsOTAuNyBDMTA3LjYyNCw5MS45NTIgMTEwLjIxNCw5MS44OTQgMTEzLjA5Nyw5MC4yMyIgaWQ9IkZpbGwtMjAiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTA4LjcyNCw5MS42MTQgTDEwOC43MjQsOTEuNjE0IEMxMDcuNTgyLDkxLjYxNCAxMDYuNTY2LDkxLjQwMSAxMDUuNzA1LDkwLjc5NyBDMTA1LjY4NCw5MC43ODMgMTA1LjY2NSw5MC44MTEgMTA1LjY1LDkwLjc5IEMxMDQuNzU2LDg5LjU0NiAxMDQuMjgzLDg3Ljg0MiAxMDQuMjgzLDg1LjgxNyBDMTA0LjI4Myw3OS41NzUgMTA4LjcwOSw3MS45NTMgMTE0LjE0OCw2OC44MTIgQzExNS43MjIsNjcuOTA0IDExNy4yMzIsNjcuNDQ5IDExOC42MzgsNjcuNDQ5IEMxMTkuNzgsNjcuNDQ5IDEyMC43OTYsNjcuNzU4IDEyMS42NTYsNjguMzYyIEMxMjEuNjc4LDY4LjM3NyAxMjEuNjk3LDY4LjM5NyAxMjEuNzEyLDY4LjQxOCBDMTIyLjYwNiw2OS42NjIgMTIzLjA3OSw3MS4zOSAxMjMuMDc5LDczLjQxNSBDMTIzLjA3OSw3OS42NTggMTE4LjY1Myw4Ny4xOTggMTEzLjIxNCw5MC4zMzggQzExMS42NCw5MS4yNDcgMTEwLjEzLDkxLjYxNCAxMDguNzI0LDkxLjYxNCBMMTA4LjcyNCw5MS42MTQgWiBNMTA2LjAwNiw5MC41MDUgQzEwNi43OCw5MS4wMzcgMTA3LjY5NCw5MS4yODEgMTA4LjcyNCw5MS4yODEgQzExMC4wNDcsOTEuMjgxIDExMS40NzgsOTAuODY4IDExMi45OCw5MC4wMDEgQzExOC4yOTEsODYuOTM1IDEyMi42MTEsNzkuNDk2IDEyMi42MTEsNzMuNDAzIEMxMjIuNjExLDcxLjQ5NCAxMjIuMTc3LDY5Ljg4IDEyMS4zNTYsNjguNzE4IEMxMjAuNTgyLDY4LjE4NSAxMTkuNjY4LDY3LjkxOSAxMTguNjM4LDY3LjkxOSBDMTE3LjMxNSw2Ny45MTkgMTE1Ljg4Myw2OC4zNiAxMTQuMzgyLDY5LjIyNyBDMTA5LjA3MSw3Mi4yOTMgMTA0Ljc1MSw3OS43MzMgMTA0Ljc1MSw4NS44MjYgQzEwNC43NTEsODcuNzM1IDEwNS4xODUsODkuMzQzIDEwNi4wMDYsOTAuNTA1IEwxMDYuMDA2LDkwLjUwNSBaIiBpZD0iRmlsbC0yMSIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDkuMzE4LDcuMjYyIEwxMzkuMzM0LDE2LjE0IEwxNTUuMjI3LDI3LjE3MSBMMTYwLjgxNiwyMS4wNTkgTDE0OS4zMTgsNy4yNjIiIGlkPSJGaWxsLTIyIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS42NzYsMTMuODQgTDE1OS45MjgsMTkuNDY3IEMxNTYuMjg2LDIxLjU3IDE1MC40LDIxLjU4IDE0Ni43ODEsMTkuNDkxIEMxNDMuMTYxLDE3LjQwMiAxNDMuMTgsMTQuMDAzIDE0Ni44MjIsMTEuOSBMMTU2LjMxNyw2LjI5MiBMMTQ5LjU4OCwyLjQwNyBMNjcuNzUyLDQ5LjQ3OCBMMTEzLjY3NSw3NS45OTIgTDExNi43NTYsNzQuMjEzIEMxMTcuMzg3LDczLjg0OCAxMTcuNjI1LDczLjMxNSAxMTcuMzc0LDcyLjgyMyBDMTE1LjAxNyw2OC4xOTEgMTE0Ljc4MSw2My4yNzcgMTE2LjY5MSw1OC41NjEgQzEyMi4zMjksNDQuNjQxIDE0MS4yLDMzLjc0NiAxNjUuMzA5LDMwLjQ5MSBDMTczLjQ3OCwyOS4zODggMTgxLjk4OSwyOS41MjQgMTkwLjAxMywzMC44ODUgQzE5MC44NjUsMzEuMDMgMTkxLjc4OSwzMC44OTMgMTkyLjQyLDMwLjUyOCBMMTk1LjUwMSwyOC43NSBMMTY5LjY3NiwxMy44NCIgaWQ9IkZpbGwtMjMiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3Ni40NTkgQzExMy41OTQsNzYuNDU5IDExMy41MTQsNzYuNDM4IDExMy40NDIsNzYuMzk3IEw2Ny41MTgsNDkuODgyIEM2Ny4zNzQsNDkuNzk5IDY3LjI4NCw0OS42NDUgNjcuMjg1LDQ5LjQ3OCBDNjcuMjg1LDQ5LjMxMSA2Ny4zNzQsNDkuMTU3IDY3LjUxOSw0OS4wNzMgTDE0OS4zNTUsMi4wMDIgQzE0OS40OTksMS45MTkgMTQ5LjY3NywxLjkxOSAxNDkuODIxLDIuMDAyIEwxNTYuNTUsNS44ODcgQzE1Ni43NzQsNi4wMTcgMTU2Ljg1LDYuMzAyIDE1Ni43MjIsNi41MjYgQzE1Ni41OTIsNi43NDkgMTU2LjMwNyw2LjgyNiAxNTYuMDgzLDYuNjk2IEwxNDkuNTg3LDIuOTQ2IEw2OC42ODcsNDkuNDc5IEwxMTMuNjc1LDc1LjQ1MiBMMTE2LjUyMyw3My44MDggQzExNi43MTUsNzMuNjk3IDExNy4xNDMsNzMuMzk5IDExNi45NTgsNzMuMDM1IEMxMTQuNTQyLDY4LjI4NyAxMTQuMyw2My4yMjEgMTE2LjI1OCw1OC4zODUgQzExOS4wNjQsNTEuNDU4IDEyNS4xNDMsNDUuMTQzIDEzMy44NCw0MC4xMjIgQzE0Mi40OTcsMzUuMTI0IDE1My4zNTgsMzEuNjMzIDE2NS4yNDcsMzAuMDI4IEMxNzMuNDQ1LDI4LjkyMSAxODIuMDM3LDI5LjA1OCAxOTAuMDkxLDMwLjQyNSBDMTkwLjgzLDMwLjU1IDE5MS42NTIsMzAuNDMyIDE5Mi4xODYsMzAuMTI0IEwxOTQuNTY3LDI4Ljc1IEwxNjkuNDQyLDE0LjI0NCBDMTY5LjIxOSwxNC4xMTUgMTY5LjE0MiwxMy44MjkgMTY5LjI3MSwxMy42MDYgQzE2OS40LDEzLjM4MiAxNjkuNjg1LDEzLjMwNiAxNjkuOTA5LDEzLjQzNSBMMTk1LjczNCwyOC4zNDUgQzE5NS44NzksMjguNDI4IDE5NS45NjgsMjguNTgzIDE5NS45NjgsMjguNzUgQzE5NS45NjgsMjguOTE2IDE5NS44NzksMjkuMDcxIDE5NS43MzQsMjkuMTU0IEwxOTIuNjUzLDMwLjkzMyBDMTkxLjkzMiwzMS4zNSAxOTAuODksMzEuNTA4IDE4OS45MzUsMzEuMzQ2IEMxODEuOTcyLDI5Ljk5NSAxNzMuNDc4LDI5Ljg2IDE2NS4zNzIsMzAuOTU0IEMxNTMuNjAyLDMyLjU0MyAxNDIuODYsMzUuOTkzIDEzNC4zMDcsNDAuOTMxIEMxMjUuNzkzLDQ1Ljg0NyAxMTkuODUxLDUyLjAwNCAxMTcuMTI0LDU4LjczNiBDMTE1LjI3LDYzLjMxNCAxMTUuNTAxLDY4LjExMiAxMTcuNzksNzIuNjExIEMxMTguMTYsNzMuMzM2IDExNy44NDUsNzQuMTI0IDExNi45OSw3NC42MTcgTDExMy45MDksNzYuMzk3IEMxMTMuODM2LDc2LjQzOCAxMTMuNzU2LDc2LjQ1OSAxMTMuNjc1LDc2LjQ1OSIgaWQ9IkZpbGwtMjQiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUzLjMxNiwyMS4yNzkgQzE1MC45MDMsMjEuMjc5IDE0OC40OTUsMjAuNzUxIDE0Ni42NjQsMTkuNjkzIEMxNDQuODQ2LDE4LjY0NCAxNDMuODQ0LDE3LjIzMiAxNDMuODQ0LDE1LjcxOCBDMTQzLjg0NCwxNC4xOTEgMTQ0Ljg2LDEyLjc2MyAxNDYuNzA1LDExLjY5OCBMMTU2LjE5OCw2LjA5MSBDMTU2LjMwOSw2LjAyNSAxNTYuNDUyLDYuMDYyIDE1Ni41MTgsNi4xNzMgQzE1Ni41ODMsNi4yODQgMTU2LjU0Nyw2LjQyNyAxNTYuNDM2LDYuNDkzIEwxNDYuOTQsMTIuMTAyIEMxNDUuMjQ0LDEzLjA4MSAxNDQuMzEyLDE0LjM2NSAxNDQuMzEyLDE1LjcxOCBDMTQ0LjMxMiwxNy4wNTggMTQ1LjIzLDE4LjMyNiAxNDYuODk3LDE5LjI4OSBDMTUwLjQ0NiwyMS4zMzggMTU2LjI0LDIxLjMyNyAxNTkuODExLDE5LjI2NSBMMTY5LjU1OSwxMy42MzcgQzE2OS42NywxMy41NzMgMTY5LjgxMywxMy42MTEgMTY5Ljg3OCwxMy43MjMgQzE2OS45NDMsMTMuODM0IDE2OS45MDQsMTMuOTc3IDE2OS43OTMsMTQuMDQyIEwxNjAuMDQ1LDE5LjY3IEMxNTguMTg3LDIwLjc0MiAxNTUuNzQ5LDIxLjI3OSAxNTMuMzE2LDIxLjI3OSIgaWQ9IkZpbGwtMjUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3NS45OTIgTDY3Ljc2Miw0OS40ODQiIGlkPSJGaWxsLTI2IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMy42NzUsNzYuMzQyIEMxMTMuNjE1LDc2LjM0MiAxMTMuNTU1LDc2LjMyNyAxMTMuNSw3Ni4yOTUgTDY3LjU4Nyw0OS43ODcgQzY3LjQxOSw0OS42OSA2Ny4zNjIsNDkuNDc2IDY3LjQ1OSw0OS4zMDkgQzY3LjU1Niw0OS4xNDEgNjcuNzcsNDkuMDgzIDY3LjkzNyw0OS4xOCBMMTEzLjg1LDc1LjY4OCBDMTE0LjAxOCw3NS43ODUgMTE0LjA3NSw3NiAxMTMuOTc4LDc2LjE2NyBDMTEzLjkxNCw3Ni4yNzkgMTEzLjc5Niw3Ni4zNDIgMTEzLjY3NSw3Ni4zNDIiIGlkPSJGaWxsLTI3IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY3Ljc2Miw0OS40ODQgTDY3Ljc2MiwxMDMuNDg1IEM2Ny43NjIsMTA0LjU3NSA2OC41MzIsMTA1LjkwMyA2OS40ODIsMTA2LjQ1MiBMMTExLjk1NSwxMzAuOTczIEMxMTIuOTA1LDEzMS41MjIgMTEzLjY3NSwxMzEuMDgzIDExMy42NzUsMTI5Ljk5MyBMMTEzLjY3NSw3NS45OTIiIGlkPSJGaWxsLTI4IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMi43MjcsMTMxLjU2MSBDMTEyLjQzLDEzMS41NjEgMTEyLjEwNywxMzEuNDY2IDExMS43OCwxMzEuMjc2IEw2OS4zMDcsMTA2Ljc1NSBDNjguMjQ0LDEwNi4xNDIgNjcuNDEyLDEwNC43MDUgNjcuNDEyLDEwMy40ODUgTDY3LjQxMiw0OS40ODQgQzY3LjQxMiw0OS4yOSA2Ny41NjksNDkuMTM0IDY3Ljc2Miw0OS4xMzQgQzY3Ljk1Niw0OS4xMzQgNjguMTEzLDQ5LjI5IDY4LjExMyw0OS40ODQgTDY4LjExMywxMDMuNDg1IEM2OC4xMTMsMTA0LjQ0NSA2OC44MiwxMDUuNjY1IDY5LjY1NywxMDYuMTQ4IEwxMTIuMTMsMTMwLjY3IEMxMTIuNDc0LDEzMC44NjggMTEyLjc5MSwxMzAuOTEzIDExMywxMzAuNzkyIEMxMTMuMjA2LDEzMC42NzMgMTEzLjMyNSwxMzAuMzgxIDExMy4zMjUsMTI5Ljk5MyBMMTEzLjMyNSw3NS45OTIgQzExMy4zMjUsNzUuNzk4IDExMy40ODIsNzUuNjQxIDExMy42NzUsNzUuNjQxIEMxMTMuODY5LDc1LjY0MSAxMTQuMDI1LDc1Ljc5OCAxMTQuMDI1LDc1Ljk5MiBMMTE0LjAyNSwxMjkuOTkzIEMxMTQuMDI1LDEzMC42NDggMTEzLjc4NiwxMzEuMTQ3IDExMy4zNSwxMzEuMzk5IEMxMTMuMTYyLDEzMS41MDcgMTEyLjk1MiwxMzEuNTYxIDExMi43MjcsMTMxLjU2MSIgaWQ9IkZpbGwtMjkiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEyLjg2LDQwLjUxMiBDMTEyLjg2LDQwLjUxMiAxMTIuODYsNDAuNTEyIDExMi44NTksNDAuNTEyIEMxMTAuNTQxLDQwLjUxMiAxMDguMzYsMzkuOTkgMTA2LjcxNywzOS4wNDEgQzEwNS4wMTIsMzguMDU3IDEwNC4wNzQsMzYuNzI2IDEwNC4wNzQsMzUuMjkyIEMxMDQuMDc0LDMzLjg0NyAxMDUuMDI2LDMyLjUwMSAxMDYuNzU0LDMxLjUwNCBMMTE4Ljc5NSwyNC41NTEgQzEyMC40NjMsMjMuNTg5IDEyMi42NjksMjMuMDU4IDEyNS4wMDcsMjMuMDU4IEMxMjcuMzI1LDIzLjA1OCAxMjkuNTA2LDIzLjU4MSAxMzEuMTUsMjQuNTMgQzEzMi44NTQsMjUuNTE0IDEzMy43OTMsMjYuODQ1IDEzMy43OTMsMjguMjc4IEMxMzMuNzkzLDI5LjcyNCAxMzIuODQxLDMxLjA2OSAxMzEuMTEzLDMyLjA2NyBMMTE5LjA3MSwzOS4wMTkgQzExNy40MDMsMzkuOTgyIDExNS4xOTcsNDAuNTEyIDExMi44Niw0MC41MTIgTDExMi44Niw0MC41MTIgWiBNMTI1LjAwNywyMy43NTkgQzEyMi43OSwyMy43NTkgMTIwLjcwOSwyNC4yNTYgMTE5LjE0NiwyNS4xNTggTDEwNy4xMDQsMzIuMTEgQzEwNS42MDIsMzIuOTc4IDEwNC43NzQsMzQuMTA4IDEwNC43NzQsMzUuMjkyIEMxMDQuNzc0LDM2LjQ2NSAxMDUuNTg5LDM3LjU4MSAxMDcuMDY3LDM4LjQzNCBDMTA4LjYwNSwzOS4zMjMgMTEwLjY2MywzOS44MTIgMTEyLjg1OSwzOS44MTIgTDExMi44NiwzOS44MTIgQzExNS4wNzYsMzkuODEyIDExNy4xNTgsMzkuMzE1IDExOC43MjEsMzguNDEzIEwxMzAuNzYyLDMxLjQ2IEMxMzIuMjY0LDMwLjU5MyAxMzMuMDkyLDI5LjQ2MyAxMzMuMDkyLDI4LjI3OCBDMTMzLjA5MiwyNy4xMDYgMTMyLjI3OCwyNS45OSAxMzAuOCwyNS4xMzYgQzEyOS4yNjEsMjQuMjQ4IDEyNy4yMDQsMjMuNzU5IDEyNS4wMDcsMjMuNzU5IEwxMjUuMDA3LDIzLjc1OSBaIiBpZD0iRmlsbC0zMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNjUuNjMsMTYuMjE5IEwxNTkuODk2LDE5LjUzIEMxNTYuNzI5LDIxLjM1OCAxNTEuNjEsMjEuMzY3IDE0OC40NjMsMTkuNTUgQzE0NS4zMTYsMTcuNzMzIDE0NS4zMzIsMTQuNzc4IDE0OC40OTksMTIuOTQ5IEwxNTQuMjMzLDkuNjM5IEwxNjUuNjMsMTYuMjE5IiBpZD0iRmlsbC0zMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNTQuMjMzLDEwLjQ0OCBMMTY0LjIyOCwxNi4yMTkgTDE1OS41NDYsMTguOTIzIEMxNTguMTEyLDE5Ljc1IDE1Ni4xOTQsMjAuMjA2IDE1NC4xNDcsMjAuMjA2IEMxNTIuMTE4LDIwLjIwNiAxNTAuMjI0LDE5Ljc1NyAxNDguODE0LDE4Ljk0MyBDMTQ3LjUyNCwxOC4xOTkgMTQ2LjgxNCwxNy4yNDkgMTQ2LjgxNCwxNi4yNjkgQzE0Ni44MTQsMTUuMjc4IDE0Ny41MzcsMTQuMzE0IDE0OC44NSwxMy41NTYgTDE1NC4yMzMsMTAuNDQ4IE0xNTQuMjMzLDkuNjM5IEwxNDguNDk5LDEyLjk0OSBDMTQ1LjMzMiwxNC43NzggMTQ1LjMxNiwxNy43MzMgMTQ4LjQ2MywxOS41NSBDMTUwLjAzMSwyMC40NTUgMTUyLjA4NiwyMC45MDcgMTU0LjE0NywyMC45MDcgQzE1Ni4yMjQsMjAuOTA3IDE1OC4zMDYsMjAuNDQ3IDE1OS44OTYsMTkuNTMgTDE2NS42MywxNi4yMTkgTDE1NC4yMzMsOS42MzkiIGlkPSJGaWxsLTMyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NS40NDUsNzIuNjY3IEwxNDUuNDQ1LDcyLjY2NyBDMTQzLjY3Miw3Mi42NjcgMTQyLjIwNCw3MS44MTcgMTQxLjIwMiw3MC40MjIgQzE0MS4xMzUsNzAuMzMgMTQxLjE0NSw3MC4xNDcgMTQxLjIyNSw3MC4wNjYgQzE0MS4zMDUsNjkuOTg1IDE0MS40MzIsNjkuOTQ2IDE0MS41MjUsNzAuMDExIEMxNDIuMzA2LDcwLjU1OSAxNDMuMjMxLDcwLjgyMyAxNDQuMjc2LDcwLjgyMiBDMTQ1LjU5OCw3MC44MjIgMTQ3LjAzLDcwLjM3NiAxNDguNTMyLDY5LjUwOSBDMTUzLjg0Miw2Ni40NDMgMTU4LjE2Myw1OC45ODcgMTU4LjE2Myw1Mi44OTQgQzE1OC4xNjMsNTAuOTY3IDE1Ny43MjEsNDkuMzMyIDE1Ni44ODQsNDguMTY4IEMxNTYuODE4LDQ4LjA3NiAxNTYuODI4LDQ3Ljk0OCAxNTYuOTA4LDQ3Ljg2NyBDMTU2Ljk4OCw0Ny43ODYgMTU3LjExNCw0Ny43NzQgMTU3LjIwOCw0Ny44NCBDMTU4Ljg3OCw0OS4wMTIgMTU5Ljc5OCw1MS4yMiAxNTkuNzk4LDU0LjA1OSBDMTU5Ljc5OCw2MC4zMDEgMTU1LjM3Myw2OC4wNDYgMTQ5LjkzMyw3MS4xODYgQzE0OC4zNiw3Mi4wOTQgMTQ2Ljg1LDcyLjY2NyAxNDUuNDQ1LDcyLjY2NyBMMTQ1LjQ0NSw3Mi42NjcgWiBNMTQyLjQ3Niw3MSBDMTQzLjI5LDcxLjY1MSAxNDQuMjk2LDcyLjAwMiAxNDUuNDQ1LDcyLjAwMiBDMTQ2Ljc2Nyw3Mi4wMDIgMTQ4LjE5OCw3MS41NSAxNDkuNyw3MC42ODIgQzE1NS4wMSw2Ny42MTcgMTU5LjMzMSw2MC4xNTkgMTU5LjMzMSw1NC4wNjUgQzE1OS4zMzEsNTIuMDg1IDE1OC44NjgsNTAuNDM1IDE1OC4wMDYsNDkuMjcyIEMxNTguNDE3LDUwLjMwNyAxNTguNjMsNTEuNTMyIDE1OC42Myw1Mi44OTIgQzE1OC42Myw1OS4xMzQgMTU0LjIwNSw2Ni43NjcgMTQ4Ljc2NSw2OS45MDcgQzE0Ny4xOTIsNzAuODE2IDE0NS42ODEsNzEuMjgzIDE0NC4yNzYsNzEuMjgzIEMxNDMuNjM0LDcxLjI4MyAxNDMuMDMzLDcxLjE5MiAxNDIuNDc2LDcxIEwxNDIuNDc2LDcxIFoiIGlkPSJGaWxsLTMzIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0OC42NDgsNjkuNzA0IEMxNTQuMDMyLDY2LjU5NiAxNTguMzk2LDU5LjA2OCAxNTguMzk2LDUyLjg5MSBDMTU4LjM5Niw1MC44MzkgMTU3LjkxMyw0OS4xOTggMTU3LjA3NCw0OC4wMyBDMTU1LjI4OSw0Ni43NzggMTUyLjY5OSw0Ni44MzYgMTQ5LjgxNiw0OC41MDEgQzE0NC40MzMsNTEuNjA5IDE0MC4wNjgsNTkuMTM3IDE0MC4wNjgsNjUuMzE0IEMxNDAuMDY4LDY3LjM2NSAxNDAuNTUyLDY5LjAwNiAxNDEuMzkxLDcwLjE3NCBDMTQzLjE3Niw3MS40MjcgMTQ1Ljc2NSw3MS4zNjkgMTQ4LjY0OCw2OS43MDQiIGlkPSJGaWxsLTM0IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NC4yNzYsNzEuMjc2IEwxNDQuMjc2LDcxLjI3NiBDMTQzLjEzMyw3MS4yNzYgMTQyLjExOCw3MC45NjkgMTQxLjI1Nyw3MC4zNjUgQzE0MS4yMzYsNzAuMzUxIDE0MS4yMTcsNzAuMzMyIDE0MS4yMDIsNzAuMzExIEMxNDAuMzA3LDY5LjA2NyAxMzkuODM1LDY3LjMzOSAxMzkuODM1LDY1LjMxNCBDMTM5LjgzNSw1OS4wNzMgMTQ0LjI2LDUxLjQzOSAxNDkuNyw0OC4yOTggQzE1MS4yNzMsNDcuMzkgMTUyLjc4NCw0Ni45MjkgMTU0LjE4OSw0Ni45MjkgQzE1NS4zMzIsNDYuOTI5IDE1Ni4zNDcsNDcuMjM2IDE1Ny4yMDgsNDcuODM5IEMxNTcuMjI5LDQ3Ljg1NCAxNTcuMjQ4LDQ3Ljg3MyAxNTcuMjYzLDQ3Ljg5NCBDMTU4LjE1Nyw0OS4xMzggMTU4LjYzLDUwLjg2NSAxNTguNjMsNTIuODkxIEMxNTguNjMsNTkuMTMyIDE1NC4yMDUsNjYuNzY2IDE0OC43NjUsNjkuOTA3IEMxNDcuMTkyLDcwLjgxNSAxNDUuNjgxLDcxLjI3NiAxNDQuMjc2LDcxLjI3NiBMMTQ0LjI3Niw3MS4yNzYgWiBNMTQxLjU1OCw3MC4xMDQgQzE0Mi4zMzEsNzAuNjM3IDE0My4yNDUsNzEuMDA1IDE0NC4yNzYsNzEuMDA1IEMxNDUuNTk4LDcxLjAwNSAxNDcuMDMsNzAuNDY3IDE0OC41MzIsNjkuNiBDMTUzLjg0Miw2Ni41MzQgMTU4LjE2Myw1OS4wMzMgMTU4LjE2Myw1Mi45MzkgQzE1OC4xNjMsNTEuMDMxIDE1Ny43MjksNDkuMzg1IDE1Ni45MDcsNDguMjIzIEMxNTYuMTMzLDQ3LjY5MSAxNTUuMjE5LDQ3LjQwOSAxNTQuMTg5LDQ3LjQwOSBDMTUyLjg2Nyw0Ny40MDkgMTUxLjQzNSw0Ny44NDIgMTQ5LjkzMyw0OC43MDkgQzE0NC42MjMsNTEuNzc1IDE0MC4zMDIsNTkuMjczIDE0MC4zMDIsNjUuMzY2IEMxNDAuMzAyLDY3LjI3NiAxNDAuNzM2LDY4Ljk0MiAxNDEuNTU4LDcwLjEwNCBMMTQxLjU1OCw3MC4xMDQgWiIgaWQ9IkZpbGwtMzUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUwLjcyLDY1LjM2MSBMMTUwLjM1Nyw2NS4wNjYgQzE1MS4xNDcsNjQuMDkyIDE1MS44NjksNjMuMDQgMTUyLjUwNSw2MS45MzggQzE1My4zMTMsNjAuNTM5IDE1My45NzgsNTkuMDY3IDE1NC40ODIsNTcuNTYzIEwxNTQuOTI1LDU3LjcxMiBDMTU0LjQxMiw1OS4yNDUgMTUzLjczMyw2MC43NDUgMTUyLjkxLDYyLjE3MiBDMTUyLjI2Miw2My4yOTUgMTUxLjUyNSw2NC4zNjggMTUwLjcyLDY1LjM2MSIgaWQ9IkZpbGwtMzYiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE1LjkxNyw4NC41MTQgTDExNS41NTQsODQuMjIgQzExNi4zNDQsODMuMjQ1IDExNy4wNjYsODIuMTk0IDExNy43MDIsODEuMDkyIEMxMTguNTEsNzkuNjkyIDExOS4xNzUsNzguMjIgMTE5LjY3OCw3Ni43MTcgTDEyMC4xMjEsNzYuODY1IEMxMTkuNjA4LDc4LjM5OCAxMTguOTMsNzkuODk5IDExOC4xMDYsODEuMzI2IEMxMTcuNDU4LDgyLjQ0OCAxMTYuNzIyLDgzLjUyMSAxMTUuOTE3LDg0LjUxNCIgaWQ9IkZpbGwtMzciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE0LDEzMC40NzYgTDExNCwxMzAuMDA4IEwxMTQsNzYuMDUyIEwxMTQsNzUuNTg0IEwxMTQsNzYuMDUyIEwxMTQsMTMwLjAwOCBMMTE0LDEzMC40NzYiIGlkPSJGaWxsLTM4IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyLjAwMDAwMCwgMC4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTkuODIyLDM3LjQ3NCBDMTkuODM5LDM3LjMzOSAxOS43NDcsMzcuMTk0IDE5LjU1NSwzNy4wODIgQzE5LjIyOCwzNi44OTQgMTguNzI5LDM2Ljg3MiAxOC40NDYsMzcuMDM3IEwxMi40MzQsNDAuNTA4IEMxMi4zMDMsNDAuNTg0IDEyLjI0LDQwLjY4NiAxMi4yNDMsNDAuNzkzIEMxMi4yNDUsNDAuOTI1IDEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQxLjM3MSBMMTIuMjQ1LDQxLjQxNCBMMTIuMjM4LDQxLjU0MiBDOC4xNDgsNDMuODg3IDUuNjQ3LDQ1LjMyMSA1LjY0Nyw0NS4zMjEgQzUuNjQ2LDQ1LjMyMSAzLjU3LDQ2LjM2NyAyLjg2LDUwLjUxMyBDMi44Niw1MC41MTMgMS45NDgsNTcuNDc0IDEuOTYyLDcwLjI1OCBDMS45NzcsODIuODI4IDIuNTY4LDg3LjMyOCAzLjEyOSw5MS42MDkgQzMuMzQ5LDkzLjI5MyA2LjEzLDkzLjczNCA2LjEzLDkzLjczNCBDNi40NjEsOTMuNzc0IDYuODI4LDkzLjcwNyA3LjIxLDkzLjQ4NiBMODIuNDgzLDQ5LjkzNSBDODQuMjkxLDQ4Ljg2NiA4NS4xNSw0Ni4yMTYgODUuNTM5LDQzLjY1MSBDODYuNzUyLDM1LjY2MSA4Ny4yMTQsMTAuNjczIDg1LjI2NCwzLjc3MyBDODUuMDY4LDMuMDggODQuNzU0LDIuNjkgODQuMzk2LDIuNDkxIEw4Mi4zMSwxLjcwMSBDODEuNTgzLDEuNzI5IDgwLjg5NCwyLjE2OCA4MC43NzYsMi4yMzYgQzgwLjYzNiwyLjMxNyA0MS44MDcsMjQuNTg1IDIwLjAzMiwzNy4wNzIgTDE5LjgyMiwzNy40NzQiIGlkPSJGaWxsLTEiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODIuMzExLDEuNzAxIEw4NC4zOTYsMi40OTEgQzg0Ljc1NCwyLjY5IDg1LjA2OCwzLjA4IDg1LjI2NCwzLjc3MyBDODcuMjEzLDEwLjY3MyA4Ni43NTEsMzUuNjYgODUuNTM5LDQzLjY1MSBDODUuMTQ5LDQ2LjIxNiA4NC4yOSw0OC44NjYgODIuNDgzLDQ5LjkzNSBMNy4yMSw5My40ODYgQzYuODk3LDkzLjY2NyA2LjU5NSw5My43NDQgNi4zMTQsOTMuNzQ0IEw2LjEzMSw5My43MzMgQzYuMTMxLDkzLjczNCAzLjM0OSw5My4yOTMgMy4xMjgsOTEuNjA5IEMyLjU2OCw4Ny4zMjcgMS45NzcsODIuODI4IDEuOTYzLDcwLjI1OCBDMS45NDgsNTcuNDc0IDIuODYsNTAuNTEzIDIuODYsNTAuNTEzIEMzLjU3LDQ2LjM2NyA1LjY0Nyw0NS4zMjEgNS42NDcsNDUuMzIxIEM1LjY0Nyw0NS4zMjEgOC4xNDgsNDMuODg3IDEyLjIzOCw0MS41NDIgTDEyLjI0NSw0MS40MTQgTDEyLjI0NSw0MS4zNzEgQzEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQwLjkyNSAxMi4yNDMsNDAuNzkzIEMxMi4yNCw0MC42ODYgMTIuMzAyLDQwLjU4MyAxMi40MzQsNDAuNTA4IEwxOC40NDYsMzcuMDM2IEMxOC41NzQsMzYuOTYyIDE4Ljc0NiwzNi45MjYgMTguOTI3LDM2LjkyNiBDMTkuMTQ1LDM2LjkyNiAxOS4zNzYsMzYuOTc5IDE5LjU1NCwzNy4wODIgQzE5Ljc0NywzNy4xOTQgMTkuODM5LDM3LjM0IDE5LjgyMiwzNy40NzQgTDIwLjAzMywzNy4wNzIgQzQxLjgwNiwyNC41ODUgODAuNjM2LDIuMzE4IDgwLjc3NywyLjIzNiBDODAuODk0LDIuMTY4IDgxLjU4MywxLjcyOSA4Mi4zMTEsMS43MDEgTTgyLjMxMSwwLjcwNCBMODIuMjcyLDAuNzA1IEM4MS42NTQsMC43MjggODAuOTg5LDAuOTQ5IDgwLjI5OCwxLjM2MSBMODAuMjc3LDEuMzczIEM4MC4xMjksMS40NTggNTkuNzY4LDEzLjEzNSAxOS43NTgsMzYuMDc5IEMxOS41LDM1Ljk4MSAxOS4yMTQsMzUuOTI5IDE4LjkyNywzNS45MjkgQzE4LjU2MiwzNS45MjkgMTguMjIzLDM2LjAxMyAxNy45NDcsMzYuMTczIEwxMS45MzUsMzkuNjQ0IEMxMS40OTMsMzkuODk5IDExLjIzNiw0MC4zMzQgMTEuMjQ2LDQwLjgxIEwxMS4yNDcsNDAuOTYgTDUuMTY3LDQ0LjQ0NyBDNC43OTQsNDQuNjQ2IDIuNjI1LDQ1Ljk3OCAxLjg3Nyw1MC4zNDUgTDEuODcxLDUwLjM4NCBDMS44NjIsNTAuNDU0IDAuOTUxLDU3LjU1NyAwLjk2NSw3MC4yNTkgQzAuOTc5LDgyLjg3OSAxLjU2OCw4Ny4zNzUgMi4xMzcsOTEuNzI0IEwyLjEzOSw5MS43MzkgQzIuNDQ3LDk0LjA5NCA1LjYxNCw5NC42NjIgNS45NzUsOTQuNzE5IEw2LjAwOSw5NC43MjMgQzYuMTEsOTQuNzM2IDYuMjEzLDk0Ljc0MiA2LjMxNCw5NC43NDIgQzYuNzksOTQuNzQyIDcuMjYsOTQuNjEgNy43MSw5NC4zNSBMODIuOTgzLDUwLjc5OCBDODQuNzk0LDQ5LjcyNyA4NS45ODIsNDcuMzc1IDg2LjUyNSw0My44MDEgQzg3LjcxMSwzNS45ODcgODguMjU5LDEwLjcwNSA4Ni4yMjQsMy41MDIgQzg1Ljk3MSwyLjYwOSA4NS41MiwxLjk3NSA4NC44ODEsMS42MiBMODQuNzQ5LDEuNTU4IEw4Mi42NjQsMC43NjkgQzgyLjU1MSwwLjcyNSA4Mi40MzEsMC43MDQgODIuMzExLDAuNzA0IiBpZD0iRmlsbC0yIiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY2LjI2NywxMS41NjUgTDY3Ljc2MiwxMS45OTkgTDExLjQyMyw0NC4zMjUiIGlkPSJGaWxsLTMiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMjAyLDkwLjU0NSBDMTIuMDI5LDkwLjU0NSAxMS44NjIsOTAuNDU1IDExLjc2OSw5MC4yOTUgQzExLjYzMiw5MC4wNTcgMTEuNzEzLDg5Ljc1MiAxMS45NTIsODkuNjE0IEwzMC4zODksNzguOTY5IEMzMC42MjgsNzguODMxIDMwLjkzMyw3OC45MTMgMzEuMDcxLDc5LjE1MiBDMzEuMjA4LDc5LjM5IDMxLjEyNyw3OS42OTYgMzAuODg4LDc5LjgzMyBMMTIuNDUxLDkwLjQ3OCBMMTIuMjAyLDkwLjU0NSIgaWQ9IkZpbGwtNCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy43NjQsNDIuNjU0IEwxMy42NTYsNDIuNTkyIEwxMy43MDIsNDIuNDIxIEwxOC44MzcsMzkuNDU3IEwxOS4wMDcsMzkuNTAyIEwxOC45NjIsMzkuNjczIEwxMy44MjcsNDIuNjM3IEwxMy43NjQsNDIuNjU0IiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTguNTIsOTAuMzc1IEw4LjUyLDQ2LjQyMSBMOC41ODMsNDYuMzg1IEw3NS44NCw3LjU1NCBMNzUuODQsNTEuNTA4IEw3NS43NzgsNTEuNTQ0IEw4LjUyLDkwLjM3NSBMOC41Miw5MC4zNzUgWiBNOC43Nyw0Ni41NjQgTDguNzcsODkuOTQ0IEw3NS41OTEsNTEuMzY1IEw3NS41OTEsNy45ODUgTDguNzcsNDYuNTY0IEw4Ljc3LDQ2LjU2NCBaIiBpZD0iRmlsbC02IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0Ljk4Niw4My4xODIgQzI0Ljc1Niw4My4zMzEgMjQuMzc0LDgzLjU2NiAyNC4xMzcsODMuNzA1IEwxMi42MzIsOTAuNDA2IEMxMi4zOTUsOTAuNTQ1IDEyLjQyNiw5MC42NTggMTIuNyw5MC42NTggTDEzLjI2NSw5MC42NTggQzEzLjU0LDkwLjY1OCAxMy45NTgsOTAuNTQ1IDE0LjE5NSw5MC40MDYgTDI1LjcsODMuNzA1IEMyNS45MzcsODMuNTY2IDI2LjEyOCw4My40NTIgMjYuMTI1LDgzLjQ0OSBDMjYuMTIyLDgzLjQ0NyAyNi4xMTksODMuMjIgMjYuMTE5LDgyLjk0NiBDMjYuMTE5LDgyLjY3MiAyNS45MzEsODIuNTY5IDI1LjcwMSw4Mi43MTkgTDI0Ljk4Niw4My4xODIiIGlkPSJGaWxsLTciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuMjY2LDkwLjc4MiBMMTIuNyw5MC43ODIgQzEyLjUsOTAuNzgyIDEyLjM4NCw5MC43MjYgMTIuMzU0LDkwLjYxNiBDMTIuMzI0LDkwLjUwNiAxMi4zOTcsOTAuMzk5IDEyLjU2OSw5MC4yOTkgTDI0LjA3NCw4My41OTcgQzI0LjMxLDgzLjQ1OSAyNC42ODksODMuMjI2IDI0LjkxOCw4My4wNzggTDI1LjYzMyw4Mi42MTQgQzI1LjcyMyw4Mi41NTUgMjUuODEzLDgyLjUyNSAyNS44OTksODIuNTI1IEMyNi4wNzEsODIuNTI1IDI2LjI0NCw4Mi42NTUgMjYuMjQ0LDgyLjk0NiBDMjYuMjQ0LDgzLjE2IDI2LjI0NSw4My4zMDkgMjYuMjQ3LDgzLjM4MyBMMjYuMjUzLDgzLjM4NyBMMjYuMjQ5LDgzLjQ1NiBDMjYuMjQ2LDgzLjUzMSAyNi4yNDYsODMuNTMxIDI1Ljc2Myw4My44MTIgTDE0LjI1OCw5MC41MTQgQzE0LDkwLjY2NSAxMy41NjQsOTAuNzgyIDEzLjI2Niw5MC43ODIgTDEzLjI2Niw5MC43ODIgWiBNMTIuNjY2LDkwLjUzMiBMMTIuNyw5MC41MzMgTDEzLjI2Niw5MC41MzMgQzEzLjUxOCw5MC41MzMgMTMuOTE1LDkwLjQyNSAxNC4xMzIsOTAuMjk5IEwyNS42MzcsODMuNTk3IEMyNS44MDUsODMuNDk5IDI1LjkzMSw4My40MjQgMjUuOTk4LDgzLjM4MyBDMjUuOTk0LDgzLjI5OSAyNS45OTQsODMuMTY1IDI1Ljk5NCw4Mi45NDYgTDI1Ljg5OSw4Mi43NzUgTDI1Ljc2OCw4Mi44MjQgTDI1LjA1NCw4My4yODcgQzI0LjgyMiw4My40MzcgMjQuNDM4LDgzLjY3MyAyNC4yLDgzLjgxMiBMMTIuNjk1LDkwLjUxNCBMMTIuNjY2LDkwLjUzMiBMMTIuNjY2LDkwLjUzMiBaIiBpZD0iRmlsbC04IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEzLjI2Niw4OS44NzEgTDEyLjcsODkuODcxIEMxMi41LDg5Ljg3MSAxMi4zODQsODkuODE1IDEyLjM1NCw4OS43MDUgQzEyLjMyNCw4OS41OTUgMTIuMzk3LDg5LjQ4OCAxMi41NjksODkuMzg4IEwyNC4wNzQsODIuNjg2IEMyNC4zMzIsODIuNTM1IDI0Ljc2OCw4Mi40MTggMjUuMDY3LDgyLjQxOCBMMjUuNjMyLDgyLjQxOCBDMjUuODMyLDgyLjQxOCAyNS45NDgsODIuNDc0IDI1Ljk3OCw4Mi41ODQgQzI2LjAwOCw4Mi42OTQgMjUuOTM1LDgyLjgwMSAyNS43NjMsODIuOTAxIEwxNC4yNTgsODkuNjAzIEMxNCw4OS43NTQgMTMuNTY0LDg5Ljg3MSAxMy4yNjYsODkuODcxIEwxMy4yNjYsODkuODcxIFogTTEyLjY2Niw4OS42MjEgTDEyLjcsODkuNjIyIEwxMy4yNjYsODkuNjIyIEMxMy41MTgsODkuNjIyIDEzLjkxNSw4OS41MTUgMTQuMTMyLDg5LjM4OCBMMjUuNjM3LDgyLjY4NiBMMjUuNjY3LDgyLjY2OCBMMjUuNjMyLDgyLjY2NyBMMjUuMDY3LDgyLjY2NyBDMjQuODE1LDgyLjY2NyAyNC40MTgsODIuNzc1IDI0LjIsODIuOTAxIEwxMi42OTUsODkuNjAzIEwxMi42NjYsODkuNjIxIEwxMi42NjYsODkuNjIxIFoiIGlkPSJGaWxsLTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMzcsOTAuODAxIEwxMi4zNyw4OS41NTQgTDEyLjM3LDkwLjgwMSIgaWQ9IkZpbGwtMTAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNi4xMyw5My45MDEgQzUuMzc5LDkzLjgwOCA0LjgxNiw5My4xNjQgNC42OTEsOTIuNTI1IEMzLjg2LDg4LjI4NyAzLjU0LDgzLjc0MyAzLjUyNiw3MS4xNzMgQzMuNTExLDU4LjM4OSA0LjQyMyw1MS40MjggNC40MjMsNTEuNDI4IEM1LjEzNCw0Ny4yODIgNy4yMSw0Ni4yMzYgNy4yMSw0Ni4yMzYgQzcuMjEsNDYuMjM2IDgxLjY2NywzLjI1IDgyLjA2OSwzLjAxNyBDODIuMjkyLDIuODg4IDg0LjU1NiwxLjQzMyA4NS4yNjQsMy45NCBDODcuMjE0LDEwLjg0IDg2Ljc1MiwzNS44MjcgODUuNTM5LDQzLjgxOCBDODUuMTUsNDYuMzgzIDg0LjI5MSw0OS4wMzMgODIuNDgzLDUwLjEwMSBMNy4yMSw5My42NTMgQzYuODI4LDkzLjg3NCA2LjQ2MSw5My45NDEgNi4xMyw5My45MDEgQzYuMTMsOTMuOTAxIDMuMzQ5LDkzLjQ2IDMuMTI5LDkxLjc3NiBDMi41NjgsODcuNDk1IDEuOTc3LDgyLjk5NSAxLjk2Miw3MC40MjUgQzEuOTQ4LDU3LjY0MSAyLjg2LDUwLjY4IDIuODYsNTAuNjggQzMuNTcsNDYuNTM0IDUuNjQ3LDQ1LjQ4OSA1LjY0Nyw0NS40ODkgQzUuNjQ2LDQ1LjQ4OSA4LjA2NSw0NC4wOTIgMTIuMjQ1LDQxLjY3OSBMMTMuMTE2LDQxLjU2IEwxOS43MTUsMzcuNzMgTDE5Ljc2MSwzNy4yNjkgTDYuMTMsOTMuOTAxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjMxNyw5NC4xNjEgTDYuMTAyLDk0LjE0OCBMNi4xMDEsOTQuMTQ4IEw1Ljg1Nyw5NC4xMDEgQzUuMTM4LDkzLjk0NSAzLjA4NSw5My4zNjUgMi44ODEsOTEuODA5IEMyLjMxMyw4Ny40NjkgMS43MjcsODIuOTk2IDEuNzEzLDcwLjQyNSBDMS42OTksNTcuNzcxIDIuNjA0LDUwLjcxOCAyLjYxMyw1MC42NDggQzMuMzM4LDQ2LjQxNyA1LjQ0NSw0NS4zMSA1LjUzNSw0NS4yNjYgTDEyLjE2Myw0MS40MzkgTDEzLjAzMyw0MS4zMiBMMTkuNDc5LDM3LjU3OCBMMTkuNTEzLDM3LjI0NCBDMTkuNTI2LDM3LjEwNyAxOS42NDcsMzcuMDA4IDE5Ljc4NiwzNy4wMjEgQzE5LjkyMiwzNy4wMzQgMjAuMDIzLDM3LjE1NiAyMC4wMDksMzcuMjkzIEwxOS45NSwzNy44ODIgTDEzLjE5OCw0MS44MDEgTDEyLjMyOCw0MS45MTkgTDUuNzcyLDQ1LjcwNCBDNS43NDEsNDUuNzIgMy43ODIsNDYuNzcyIDMuMTA2LDUwLjcyMiBDMy4wOTksNTAuNzgyIDIuMTk4LDU3LjgwOCAyLjIxMiw3MC40MjQgQzIuMjI2LDgyLjk2MyAyLjgwOSw4Ny40MiAzLjM3Myw5MS43MjkgQzMuNDY0LDkyLjQyIDQuMDYyLDkyLjg4MyA0LjY4Miw5My4xODEgQzQuNTY2LDkyLjk4NCA0LjQ4Niw5Mi43NzYgNC40NDYsOTIuNTcyIEMzLjY2NSw4OC41ODggMy4yOTEsODQuMzcgMy4yNzYsNzEuMTczIEMzLjI2Miw1OC41MiA0LjE2Nyw1MS40NjYgNC4xNzYsNTEuMzk2IEM0LjkwMSw0Ny4xNjUgNy4wMDgsNDYuMDU5IDcuMDk4LDQ2LjAxNCBDNy4wOTQsNDYuMDE1IDgxLjU0MiwzLjAzNCA4MS45NDQsMi44MDIgTDgxLjk3MiwyLjc4NSBDODIuODc2LDIuMjQ3IDgzLjY5MiwyLjA5NyA4NC4zMzIsMi4zNTIgQzg0Ljg4NywyLjU3MyA4NS4yODEsMy4wODUgODUuNTA0LDMuODcyIEM4Ny41MTgsMTEgODYuOTY0LDM2LjA5MSA4NS43ODUsNDMuODU1IEM4NS4yNzgsNDcuMTk2IDg0LjIxLDQ5LjM3IDgyLjYxLDUwLjMxNyBMNy4zMzUsOTMuODY5IEM2Ljk5OSw5NC4wNjMgNi42NTgsOTQuMTYxIDYuMzE3LDk0LjE2MSBMNi4zMTcsOTQuMTYxIFogTTYuMTcsOTMuNjU0IEM2LjQ2Myw5My42OSA2Ljc3NCw5My42MTcgNy4wODUsOTMuNDM3IEw4Mi4zNTgsNDkuODg2IEM4NC4xODEsNDguODA4IDg0Ljk2LDQ1Ljk3MSA4NS4yOTIsNDMuNzggQzg2LjQ2NiwzNi4wNDkgODcuMDIzLDExLjA4NSA4NS4wMjQsNC4wMDggQzg0Ljg0NiwzLjM3NyA4NC41NTEsMi45NzYgODQuMTQ4LDIuODE2IEM4My42NjQsMi42MjMgODIuOTgyLDIuNzY0IDgyLjIyNywzLjIxMyBMODIuMTkzLDMuMjM0IEM4MS43OTEsMy40NjYgNy4zMzUsNDYuNDUyIDcuMzM1LDQ2LjQ1MiBDNy4zMDQsNDYuNDY5IDUuMzQ2LDQ3LjUyMSA0LjY2OSw1MS40NzEgQzQuNjYyLDUxLjUzIDMuNzYxLDU4LjU1NiAzLjc3NSw3MS4xNzMgQzMuNzksODQuMzI4IDQuMTYxLDg4LjUyNCA0LjkzNiw5Mi40NzYgQzUuMDI2LDkyLjkzNyA1LjQxMiw5My40NTkgNS45NzMsOTMuNjE1IEM2LjA4Nyw5My42NCA2LjE1OCw5My42NTIgNi4xNjksOTMuNjU0IEw2LjE3LDkzLjY1NCBMNi4xNyw5My42NTQgWiIgaWQ9IkZpbGwtMTIiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4zMTcsNjguOTgyIEM3LjgwNiw2OC43MDEgOC4yMDIsNjguOTI2IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNi44MjksNzEuMjk0IDYuNDMzLDcxLjA2OSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIiBpZD0iRmlsbC0xMyIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjkyLDcxLjEzMyBDNi42MzEsNzEuMTMzIDYuNDMzLDcwLjkwNSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIEM3LjQ2LDY4LjkgNy41OTUsNjguODYxIDcuNzE0LDY4Ljg2MSBDOC4wMDMsNjguODYxIDguMjAyLDY5LjA5IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNy4xNzQsNzEuMDk0IDcuMDM5LDcxLjEzMyA2LjkyLDcxLjEzMyBNNy43MTQsNjguNjc0IEM3LjU1Nyw2OC42NzQgNy4zOTIsNjguNzIzIDcuMjI0LDY4LjgyMSBDNi42NzYsNjkuMTM4IDYuMjQ2LDY5Ljg3OSA2LjI0Niw3MC41MDggQzYuMjQ2LDcwLjk5NCA2LjUxNyw3MS4zMiA2LjkyLDcxLjMyIEM3LjA3OCw3MS4zMiA3LjI0Myw3MS4yNzEgNy40MTEsNzEuMTc0IEM3Ljk1OSw3MC44NTcgOC4zODksNzAuMTE3IDguMzg5LDY5LjQ4NyBDOC4zODksNjkuMDAxIDguMTE3LDY4LjY3NCA3LjcxNCw2OC42NzQiIGlkPSJGaWxsLTE0IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYuOTIsNzAuOTQ3IEM2LjY0OSw3MC45NDcgNi42MjEsNzAuNjQgNi42MjEsNzAuNTA4IEM2LjYyMSw3MC4wMTcgNi45ODIsNjkuMzkyIDcuNDExLDY5LjE0NSBDNy41MjEsNjkuMDgyIDcuNjI1LDY5LjA0OSA3LjcxNCw2OS4wNDkgQzcuOTg2LDY5LjA0OSA4LjAxNSw2OS4zNTUgOC4wMTUsNjkuNDg3IEM4LjAxNSw2OS45NzggNy42NTIsNzAuNjAzIDcuMjI0LDcwLjg1MSBDNy4xMTUsNzAuOTE0IDcuMDEsNzAuOTQ3IDYuOTIsNzAuOTQ3IE03LjcxNCw2OC44NjEgQzcuNTk1LDY4Ljg2MSA3LjQ2LDY4LjkgNy4zMTcsNjguOTgyIEM2LjgyOSw2OS4yNjUgNi40MzMsNjkuOTQ4IDYuNDMzLDcwLjUwOCBDNi40MzMsNzAuOTA1IDYuNjMxLDcxLjEzMyA2LjkyLDcxLjEzMyBDNy4wMzksNzEuMTMzIDcuMTc0LDcxLjA5NCA3LjMxNyw3MS4wMTIgQzcuODA2LDcwLjczIDguMjAyLDcwLjA0NyA4LjIwMiw2OS40ODcgQzguMjAyLDY5LjA5IDguMDAzLDY4Ljg2MSA3LjcxNCw2OC44NjEiIGlkPSJGaWxsLTE1IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuNDQ0LDg1LjM1IEM3LjcwOCw4NS4xOTggNy45MjEsODUuMzE5IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuOTI1IDcuNzA4LDg2LjI5MiA3LjQ0NCw4Ni40NDQgQzcuMTgxLDg2LjU5NyA2Ljk2Nyw4Ni40NzUgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IiBpZD0iRmlsbC0xNiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik03LjIzLDg2LjUxIEM3LjA3NCw4Ni41MSA2Ljk2Nyw4Ni4zODcgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IEM3LjUyMSw4NS4zMDUgNy41OTQsODUuMjg0IDcuNjU4LDg1LjI4NCBDNy44MTQsODUuMjg0IDcuOTIxLDg1LjQwOCA3LjkyMSw4NS42MjIgQzcuOTIxLDg1LjkyNSA3LjcwOCw4Ni4yOTIgNy40NDQsODYuNDQ0IEM3LjM2Nyw4Ni40ODkgNy4yOTQsODYuNTEgNy4yMyw4Ni41MSBNNy42NTgsODUuMDk4IEM3LjU1OCw4NS4wOTggNy40NTUsODUuMTI3IDcuMzUxLDg1LjE4OCBDNy4wMzEsODUuMzczIDYuNzgxLDg1LjgwNiA2Ljc4MSw4Ni4xNzMgQzYuNzgxLDg2LjQ4MiA2Ljk2Niw4Ni42OTcgNy4yMyw4Ni42OTcgQzcuMzMsODYuNjk3IDcuNDMzLDg2LjY2NiA3LjUzOCw4Ni42MDcgQzcuODU4LDg2LjQyMiA4LjEwOCw4NS45ODkgOC4xMDgsODUuNjIyIEM4LjEwOCw4NS4zMTMgNy45MjMsODUuMDk4IDcuNjU4LDg1LjA5OCIgaWQ9IkZpbGwtMTciIGZpbGw9IiM4MDk3QTIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4yMyw4Ni4zMjIgTDcuMTU0LDg2LjE3MyBDNy4xNTQsODUuOTM4IDcuMzMzLDg1LjYyOSA3LjUzOCw4NS41MTIgTDcuNjU4LDg1LjQ3MSBMNy43MzQsODUuNjIyIEM3LjczNCw4NS44NTYgNy41NTUsODYuMTY0IDcuMzUxLDg2LjI4MiBMNy4yMyw4Ni4zMjIgTTcuNjU4LDg1LjI4NCBDNy41OTQsODUuMjg0IDcuNTIxLDg1LjMwNSA3LjQ0NCw4NS4zNSBDNy4xODEsODUuNTAyIDYuOTY3LDg1Ljg3MSA2Ljk2Nyw4Ni4xNzMgQzYuOTY3LDg2LjM4NyA3LjA3NCw4Ni41MSA3LjIzLDg2LjUxIEM3LjI5NCw4Ni41MSA3LjM2Nyw4Ni40ODkgNy40NDQsODYuNDQ0IEM3LjcwOCw4Ni4yOTIgNy45MjEsODUuOTI1IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuNDA4IDcuODE0LDg1LjI4NCA3LjY1OCw4NS4yODQiIGlkPSJGaWxsLTE4IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTc3LjI3OCw3Ljc2OSBMNzcuMjc4LDUxLjQzNiBMMTAuMjA4LDkwLjE2IEwxMC4yMDgsNDYuNDkzIEw3Ny4yNzgsNy43NjkiIGlkPSJGaWxsLTE5IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEwLjA4Myw5MC4zNzUgTDEwLjA4Myw0Ni40MjEgTDEwLjE0Niw0Ni4zODUgTDc3LjQwMyw3LjU1NCBMNzcuNDAzLDUxLjUwOCBMNzcuMzQxLDUxLjU0NCBMMTAuMDgzLDkwLjM3NSBMMTAuMDgzLDkwLjM3NSBaIE0xMC4zMzMsNDYuNTY0IEwxMC4zMzMsODkuOTQ0IEw3Ny4xNTQsNTEuMzY1IEw3Ny4xNTQsNy45ODUgTDEwLjMzMyw0Ni41NjQgTDEwLjMzMyw0Ni41NjQgWiIgaWQ9IkZpbGwtMjAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMjUuNzM3LDg4LjY0NyBMMTE4LjA5OCw5MS45ODEgTDExOC4wOTgsODQgTDEwNi42MzksODguNzEzIEwxMDYuNjM5LDk2Ljk4MiBMOTksMTAwLjMxNSBMMTEyLjM2OSwxMDMuOTYxIEwxMjUuNzM3LDg4LjY0NyIgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTIiIGZpbGw9IiM0NTVBNjQiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'); +}; + +module.exports = RotateInstructions; + +},{"./util.js":13}],13:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Util = {}; + +Util.base64 = function(mimeType, base64) { + return 'data:' + mimeType + ';base64,' + base64; +}; + +Util.isMobile = function() { + var check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); + return check; +}; + +Util.isFirefox = function() { + return /firefox/i.test(navigator.userAgent); +}; + +Util.isIOS = function() { + return /(iPad|iPhone|iPod)/g.test(navigator.userAgent); +}; + +Util.isIFrame = function() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } +}; + +Util.appendQueryParameter = function(url, key, value) { + // Determine delimiter based on if the URL already GET parameters in it. + var delimiter = (url.indexOf('?') < 0 ? '?' : '&'); + url += delimiter + key + '=' + value; + return url; +}; + +// From http://goo.gl/4WX3tg +Util.getQueryParameter = function(name) { + name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), + results = regex.exec(location.search); + return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); +}; + +Util.isLandscapeMode = function() { + return (window.orientation == 90 || window.orientation == -90); +}; + +Util.getScreenWidth = function() { + return Math.max(window.screen.width, window.screen.height) * + window.devicePixelRatio; +}; + +Util.getScreenHeight = function() { + return Math.min(window.screen.width, window.screen.height) * + window.devicePixelRatio; +}; + +/** + * Utility to convert the projection matrix to a vector accepted by the shader. + * + * @param {Object} opt_params A rectangle to scale this vector by. + */ +Util.projectionMatrixToVector_ = function(matrix, opt_params) { + var params = opt_params || {}; + var xScale = params.xScale || 1; + var yScale = params.yScale || 1; + var xTrans = params.xTrans || 0; + var yTrans = params.yTrans || 0; + + var elements = matrix.elements; + var vec = new THREE.Vector4(); + vec.set(elements[4*0 + 0] * xScale, + elements[4*1 + 1] * yScale, + elements[4*2 + 0] - 1 - xTrans, + elements[4*2 + 1] - 1 - yTrans).divideScalar(2); + return vec; +}; + +Util.leftProjectionVectorToRight_ = function(left) { + //projectionLeft + vec4(0.0, 0.0, 1.0, 0.0)) * vec4(1.0, 1.0, -1.0, 1.0); + var out = new THREE.Vector4(0, 0, 1, 0); + out.add(left); // out = left + (0, 0, 1, 0). + out.z *= -1; // Flip z. + + return out; +}; + +module.exports = Util; + +},{}],14:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Emitter = _dereq_('./emitter.js'); +var Util = _dereq_('./util.js'); + +var DEFAULT_VIEWER = 'CardboardV1'; +var VIEWER_KEY = 'WEBVR_CARDBOARD_VIEWER'; + +/** + * Creates a viewer selector with the options specified. Supports being shown + * and hidden. Generates events when viewer parameters change. Also supports + * saving the currently selected index in localStorage. + * + * @param {Object} options Option labels for all valid selections {name: index}. + */ +function ViewerSelector(options) { + // Try to load the selected key from local storage. If none exists, use the + // default key. + try { + this.selectedKey = localStorage.getItem(VIEWER_KEY) || DEFAULT_VIEWER; + } catch(error) { + console.error('Failed to load viewer profile: %s', error); + } + this.dialog = this.createDialog_(options); + this.options = options; + document.body.appendChild(this.dialog); +} +ViewerSelector.prototype = new Emitter(); + +ViewerSelector.prototype.show = function() { + //console.log('ViewerSelector.show'); + + // Ensure the currently selected item is checked. + var selected = this.dialog.querySelector('#' + this.selectedKey); + selected.checked = true; + + // Show the UI. + this.dialog.style.display = 'block'; +}; + +ViewerSelector.prototype.hide = function() { + //console.log('ViewerSelector.hide'); + this.dialog.style.display = 'none'; +}; + +ViewerSelector.prototype.getSelectedKey_ = function() { + var input = this.dialog.querySelector('input[name=field]:checked'); + if (input) { + return input.id; + } + return null; +}; + +ViewerSelector.prototype.onSave_ = function() { + this.selectedKey = this.getSelectedKey_(); + if (!this.selectedKey || !this.options[this.selectedKey]) { + console.error('ViewerSelector.onSave_: this should never happen!'); + return; + } + + this.emit('change', this.options[this.selectedKey]); + + // Attempt to save the viewer profile, but fails in private mode. + try { + localStorage.setItem(VIEWER_KEY, this.selectedKey); + } catch(error) { + console.error('Failed to save viewer profile: %s', error); + } + this.hide(); +}; + +/** + * Creates the dialog. + */ +ViewerSelector.prototype.createDialog_ = function(options) { + var container = document.createElement('div'); + container.style.display = 'none'; + // Create an overlay that dims the background, and which goes away when you + // tap it. + var overlay = document.createElement('div'); + var s = overlay.style; + s.position = 'fixed'; + s.left = 0; + s.top = 0; + s.width = '100%'; + s.height = '100%'; + s.background = 'rgba(0, 0, 0, 0.3)'; + overlay.addEventListener('click', this.hide.bind(this)); + + var width = 280; + var dialog = document.createElement('div'); + var s = dialog.style; + s.boxSizing = 'border-box'; + s.position = 'fixed'; + s.top = '24px'; + s.left = '50%'; + s.marginLeft = (-width/2) + 'px'; + s.width = width + 'px'; + s.padding = '24px'; + s.overflow = 'hidden'; + s.background = '#fafafa'; + s.fontFamily = "'Roboto', sans-serif"; + s.boxShadow = '0px 5px 20px #666'; + + dialog.appendChild(this.createH1_('Select your viewer')); + for (var id in options) { + dialog.appendChild(this.createChoice_(id, options[id].label)); + } + dialog.appendChild(this.createButton_('Save', this.onSave_.bind(this))); + + container.appendChild(overlay); + container.appendChild(dialog); + + return container; +}; + +ViewerSelector.prototype.createH1_ = function(name) { + var h1 = document.createElement('h1'); + var s = h1.style; + s.color = 'black'; + s.fontSize = '20px'; + s.fontWeight = 'bold'; + s.marginTop = 0; + s.marginBottom = '24px'; + h1.innerHTML = name; + return h1; +}; + +ViewerSelector.prototype.createChoice_ = function(id, name) { + /* +

+ + +
+ */ + var div = document.createElement('div'); + div.style.marginTop = '8px'; + div.style.color = 'black'; + + var input = document.createElement('input'); + input.style.fontSize = '30px'; + input.setAttribute('id', id); + input.setAttribute('type', 'radio'); + input.setAttribute('value', id); + input.setAttribute('name', 'field'); + + var label = document.createElement('label'); + label.style.marginLeft = '4px'; + label.setAttribute('for', id); + label.innerHTML = name; + + div.appendChild(input); + div.appendChild(label); + + return div; +}; + +ViewerSelector.prototype.createButton_ = function(label, onclick) { + var button = document.createElement('button'); + button.innerHTML = label; + var s = button.style; + s.float = 'right'; + s.textTransform = 'uppercase'; + s.color = '#1094f7'; + s.fontSize = '14px'; + s.letterSpacing = 0; + s.border = 0; + s.background = 'none'; + s.marginTop = '16px'; + + button.addEventListener('click', onclick); + + return button; +}; + +module.exports = ViewerSelector; + +},{"./emitter.js":9,"./util.js":13}],15:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Util = _dereq_('./util.js'); + +/** + * Android and iOS compatible wakelock implementation. + * + * Refactored thanks to dkovalev@. + */ +function AndroidWakeLock() { + var video = document.createElement('video'); + + video.addEventListener('ended', function() { + video.play(); + }); + + this.request = function() { + if (video.paused) { + // Base64 version of videos_src/no-sleep-120s.mp4. + video.src = Util.base64('video/mp4', 'AAAAGGZ0eXBpc29tAAAAAG1wNDFhdmMxAAAIA21vb3YAAABsbXZoZAAAAADSa9v60mvb+gABX5AAlw/gAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAdkdHJhawAAAFx0a2hkAAAAAdJr2/rSa9v6AAAAAQAAAAAAlw/gAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAQAAAAHAAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAJcP4AAAAAAAAQAAAAAG3G1kaWEAAAAgbWRoZAAAAADSa9v60mvb+gAPQkAGjneAFccAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAABodtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAZHc3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAMABwASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQAC//hABlnZAALrNlfllw4QAAAAwBAAAADAKPFCmWAAQAFaOvssiwAAAAYc3R0cwAAAAAAAAABAAAAbgAPQkAAAAAUc3RzcwAAAAAAAAABAAAAAQAAA4BjdHRzAAAAAAAAAG4AAAABAD0JAAAAAAEAehIAAAAAAQA9CQAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEALcbAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAABuAAAAAQAAAcxzdHN6AAAAAAAAAAAAAABuAAADCQAAABgAAAAOAAAADgAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABMAAAAUc3RjbwAAAAAAAAABAAAIKwAAACt1ZHRhAAAAI6llbmMAFwAAdmxjIDIuMi4xIHN0cmVhbSBvdXRwdXQAAAAId2lkZQAACRRtZGF0AAACrgX//6vcRem95tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTQyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVmPTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9MTIgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1hYnIgbWJ0cmVlPTEgYml0cmF0ZT0xMDAgcmF0ZXRvbD0xLjAgcWNvbXA9MC42MCBxcG1pbj0xMCBxcG1heD01MSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAU2WIhAAQ/8ltlOe+cTZuGkKg+aRtuivcDZ0pBsfsEi9p/i1yU9DxS2lq4dXTinViF1URBKXgnzKBd/Uh1bkhHtMrwrRcOJslD01UB+fyaL6ef+DBAAAAFEGaJGxBD5B+v+a+4QqF3MgBXz9MAAAACkGeQniH/+94r6EAAAAKAZ5hdEN/8QytwAAAAAgBnmNqQ3/EgQAAAA5BmmhJqEFomUwIIf/+4QAAAApBnoZFESw//76BAAAACAGepXRDf8SBAAAACAGep2pDf8SAAAAADkGarEmoQWyZTAgh//7gAAAACkGeykUVLD//voEAAAAIAZ7pdEN/xIAAAAAIAZ7rakN/xIAAAAAOQZrwSahBbJlMCCH//uEAAAAKQZ8ORRUsP/++gQAAAAgBny10Q3/EgQAAAAgBny9qQ3/EgAAAAA5BmzRJqEFsmUwIIf/+4AAAAApBn1JFFSw//76BAAAACAGfcXRDf8SAAAAACAGfc2pDf8SAAAAADkGbeEmoQWyZTAgh//7hAAAACkGflkUVLD//voAAAAAIAZ+1dEN/xIEAAAAIAZ+3akN/xIEAAAAOQZu8SahBbJlMCCH//uAAAAAKQZ/aRRUsP/++gQAAAAgBn/l0Q3/EgAAAAAgBn/tqQ3/EgQAAAA5Bm+BJqEFsmUwIIf/+4QAAAApBnh5FFSw//76AAAAACAGePXRDf8SAAAAACAGeP2pDf8SBAAAADkGaJEmoQWyZTAgh//7gAAAACkGeQkUVLD//voEAAAAIAZ5hdEN/xIAAAAAIAZ5jakN/xIEAAAAOQZpoSahBbJlMCCH//uEAAAAKQZ6GRRUsP/++gQAAAAgBnqV0Q3/EgQAAAAgBnqdqQ3/EgAAAAA5BmqxJqEFsmUwIIf/+4AAAAApBnspFFSw//76BAAAACAGe6XRDf8SAAAAACAGe62pDf8SAAAAADkGa8EmoQWyZTAgh//7hAAAACkGfDkUVLD//voEAAAAIAZ8tdEN/xIEAAAAIAZ8vakN/xIAAAAAOQZs0SahBbJlMCCH//uAAAAAKQZ9SRRUsP/++gQAAAAgBn3F0Q3/EgAAAAAgBn3NqQ3/EgAAAAA5Bm3hJqEFsmUwIIf/+4QAAAApBn5ZFFSw//76AAAAACAGftXRDf8SBAAAACAGft2pDf8SBAAAADkGbvEmoQWyZTAgh//7gAAAACkGf2kUVLD//voEAAAAIAZ/5dEN/xIAAAAAIAZ/7akN/xIEAAAAOQZvgSahBbJlMCCH//uEAAAAKQZ4eRRUsP/++gAAAAAgBnj10Q3/EgAAAAAgBnj9qQ3/EgQAAAA5BmiRJqEFsmUwIIf/+4AAAAApBnkJFFSw//76BAAAACAGeYXRDf8SAAAAACAGeY2pDf8SBAAAADkGaaEmoQWyZTAgh//7hAAAACkGehkUVLD//voEAAAAIAZ6ldEN/xIEAAAAIAZ6nakN/xIAAAAAOQZqsSahBbJlMCCH//uAAAAAKQZ7KRRUsP/++gQAAAAgBnul0Q3/EgAAAAAgBnutqQ3/EgAAAAA5BmvBJqEFsmUwIIf/+4QAAAApBnw5FFSw//76BAAAACAGfLXRDf8SBAAAACAGfL2pDf8SAAAAADkGbNEmoQWyZTAgh//7gAAAACkGfUkUVLD//voEAAAAIAZ9xdEN/xIAAAAAIAZ9zakN/xIAAAAAOQZt4SahBbJlMCCH//uEAAAAKQZ+WRRUsP/++gAAAAAgBn7V0Q3/EgQAAAAgBn7dqQ3/EgQAAAA5Bm7xJqEFsmUwIIf/+4AAAAApBn9pFFSw//76BAAAACAGf+XRDf8SAAAAACAGf+2pDf8SBAAAADkGb4EmoQWyZTAgh//7hAAAACkGeHkUVLD//voAAAAAIAZ49dEN/xIAAAAAIAZ4/akN/xIEAAAAOQZokSahBbJlMCCH//uAAAAAKQZ5CRRUsP/++gQAAAAgBnmF0Q3/EgAAAAAgBnmNqQ3/EgQAAAA5BmmhJqEFsmUwIIf/+4QAAAApBnoZFFSw//76BAAAACAGepXRDf8SBAAAACAGep2pDf8SAAAAADkGarEmoQWyZTAgh//7gAAAACkGeykUVLD//voEAAAAIAZ7pdEN/xIAAAAAIAZ7rakN/xIAAAAAPQZruSahBbJlMFEw3//7B'); + video.play(); + } + }; + + this.release = function() { + video.pause(); + video.src = ''; + }; +} + +function iOSWakeLock() { + var timer = null; + + this.request = function() { + if (!timer) { + timer = setInterval(function() { + window.location = window.location; + setTimeout(window.stop, 0); + }, 30000); + } + } + + this.release = function() { + if (timer) { + clearInterval(timer); + timer = null; + } + } +} + + +function getWakeLock() { + var userAgent = navigator.userAgent || navigator.vendor || window.opera; + if (userAgent.match(/iPhone/i) || userAgent.match(/iPod/i)) { + return iOSWakeLock; + } else { + return AndroidWakeLock; + } +} + +module.exports = getWakeLock(); + +},{"./util.js":13}],16:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var ButtonManager = _dereq_('./button-manager.js'); +var CardboardDistorter = _dereq_('./cardboard-distorter.js'); +var DeviceInfo = _dereq_('./device-info.js'); +var Dpdb = _dereq_('./dpdb.js'); +var Emitter = _dereq_('./emitter.js'); +var Modes = _dereq_('./modes.js'); +var RotateInstructions = _dereq_('./rotate-instructions.js'); +var Util = _dereq_('./util.js'); +var ViewerSelector = _dereq_('./viewer-selector.js'); +var Wakelock = _dereq_('./wakelock.js'); + +/** + * Helper for getting in and out of VR mode. + * Here we assume VR mode == full screen mode. + * + * 1. Detects whether or not VR mode is possible by feature detecting for + * WebVR (or polyfill). + * + * 2. If WebVR is available, shows a button that lets you enter VR mode. + * + * 3. Provides Cardboard-style distortion if the webvr-polyfill is being used. + * + * 4. Provides best practices while in VR mode. + * - Full screen + * - Wake lock + * - Orientation lock (mobile only) + */ +function WebVRManager(renderer, effect, params) { + this.params = params || {}; + + this.mode = Modes.UNKNOWN; + + // Set option to hide the button. + this.hideButton = this.params.hideButton || false; + // Whether or not the FOV should be distorted or un-distorted. By default, it + // should be distorted, but in the case of vertex shader based distortion, + // ensure that we use undistorted parameters. + this.isUndistorted = !!this.params.isUndistorted; + + // Save the THREE.js renderer and effect for later. + this.renderer = renderer; + this.effect = effect; + this.button = new ButtonManager(); + this.rotateInstructions = new RotateInstructions(); + this.viewerSelector = new ViewerSelector(DeviceInfo.Viewers); + + // Load the DPDB. + var shouldFetch = !WebVRConfig.NO_DPDB_FETCH; + this.dpdb = new Dpdb(shouldFetch, this.onDeviceParamsUpdated_.bind(this)); + + // Create device info and set the correct default viewer. + this.deviceInfo = new DeviceInfo(this.dpdb.getDeviceParams()); + this.deviceInfo.viewer = DeviceInfo.Viewers[this.viewerSelector.selectedKey]; + console.log('Using the %s viewer.', this.getViewer().label); + + this.distorter = new CardboardDistorter(renderer); + this.distorter.updateDeviceInfo(this.deviceInfo); + + this.isVRCompatible = false; + this.isFullscreenDisabled = !!Util.getQueryParameter('no_fullscreen'); + this.startMode = Modes.NORMAL; + var startModeParam = parseInt(Util.getQueryParameter('start_mode')); + if (!isNaN(startModeParam)) { + this.startMode = startModeParam; + } + + // Set the correct viewer profile, but only if this is Cardboard. + if (Util.isMobile()) { + this.onViewerChanged_(this.getViewer()); + } + // Listen for changes to the viewer. + this.viewerSelector.on('change', this.onViewerChanged_.bind(this)); + + if (this.hideButton) { + this.button.setVisibility(false); + } + + // Check if the browser is compatible with WebVR. + this.getDeviceByType_(HMDVRDevice).then(function(hmd) { + // Activate either VR or Immersive mode. + if (WebVRConfig.FORCE_DISTORTION) { + this.distorter.setActive(true); + this.isVRCompatible = true; + } else if (hmd) { + this.isVRCompatible = true; + // Only enable distortion if we are dealing using the polyfill, we have a + // perfect device match, and it's not prevented via configuration. + if (hmd.deviceName.indexOf('webvr-polyfill') == 0 && this.deviceInfo.getDevice() && + !WebVRConfig.PREVENT_DISTORTION) { + this.distorter.setActive(true); + } + this.hmd = hmd; + } + // Set the right mode. + switch (this.startMode) { + case Modes.MAGIC_WINDOW: + this.normalToMagicWindow_(); + this.setMode_(Modes.MAGIC_WINDOW); + break; + case Modes.VR: + this.anyModeToVR_(); + this.setMode_(Modes.VR); + break; + default: + this.setMode_(Modes.NORMAL); + } + this.button.on('fs', this.onFSClick_.bind(this)); + this.button.on('vr', this.onVRClick_.bind(this)); + this.button.on('back', this.onBackClick_.bind(this)); + this.button.on('settings', this.onSettingsClick_.bind(this)); + this.emit('initialized'); + }.bind(this)); + + // Save the input device for later sending timing data. + this.getDeviceByType_(PositionSensorVRDevice).then(function(input) { + this.input = input; + }.bind(this)); + + // Whenever we enter fullscreen, we are entering VR or immersive mode. + document.addEventListener('webkitfullscreenchange', + this.onFullscreenChange_.bind(this)); + document.addEventListener('mozfullscreenchange', + this.onFullscreenChange_.bind(this)); + document.addEventListener('MSFullscreenChange', + this.onFullscreenChange_.bind(this)); + window.addEventListener('orientationchange', + this.onOrientationChange_.bind(this)); + + // Create the necessary elements for wake lock to work. + this.wakelock = new Wakelock(); + + // Save whether or not we want the touch panner to be enabled or disabled by + // default. + this.isTouchPannerEnabled = !WebVRConfig.TOUCH_PANNER_DISABLED; + +} + +WebVRManager.prototype = new Emitter(); + +// Expose these values externally. +WebVRManager.Modes = Modes; + +/** + * Promise returns true if there is at least one HMD device available. + */ +WebVRManager.prototype.getDeviceByType_ = function(type) { + return new Promise(function(resolve, reject) { + navigator.getVRDevices().then(function(devices) { + // Promise succeeds, but check if there are any devices actually. + for (var i = 0; i < devices.length; i++) { + if (devices[i] instanceof type) { + resolve(devices[i]); + break; + } + } + resolve(null); + }, function() { + // No devices are found. + resolve(null); + }); + }); +}; + +WebVRManager.prototype.isVRMode = function() { + return this.mode == Modes.VR; +}; + +WebVRManager.prototype.getViewer = function() { + return this.deviceInfo.viewer; +}; + +WebVRManager.prototype.getDevice = function() { + return this.deviceInfo.device; +}; + +WebVRManager.prototype.getDeviceInfo = function() { + return this.deviceInfo; +}; + +WebVRManager.prototype.render = function(scene, camera, timestamp) { + this.camera = camera; + + this.resizeIfNeeded_(camera); + + if (this.isVRMode()) { + this.distorter.preRender(); + this.effect.render(scene, camera); + this.distorter.postRender(); + } else { + // Scene may be an array of two scenes, one for each eye. + if (scene instanceof Array) { + this.renderer.render(scene[0], camera); + } else { + this.renderer.render(scene, camera); + } + } +}; + + +WebVRManager.prototype.setMode_ = function(mode) { + var oldMode = this.mode; + if (mode == this.mode) { + console.error('Not changing modes, already in %s', mode); + return; + } + console.log('Mode change: %s => %s', this.mode, mode); + this.mode = mode; + this.button.setMode(mode, this.isVRCompatible); + + if (this.mode == Modes.VR && Util.isLandscapeMode() && Util.isMobile()) { + // In landscape mode, temporarily show the "put into Cardboard" + // interstitial. Otherwise, do the default thing. + this.rotateInstructions.showTemporarily(3000); + } else { + this.updateRotateInstructions_(); + } + + // Also hide the viewer selector. + this.viewerSelector.hide(); + + // Emit an event indicating the mode changed. + this.emit('modechange', mode, oldMode); + + // Note: This is a nasty hack since we need to communicate to the polyfill + // that touch panning is disabled, and the only way to do this currently is + // via WebVRConfig. + // TODO: Maybe move touch panning to the boilerplate to eliminate the hack. + // + // If we are in VR mode, always disable touch panning. + if (this.isTouchPannerEnabled) { + if (this.mode == Modes.VR) { + WebVRConfig.TOUCH_PANNER_DISABLED = true; + } else { + WebVRConfig.TOUCH_PANNER_DISABLED = false; + } + } + + if (this.mode == Modes.VR) { + // In VR mode, set the HMDVRDevice parameters. + this.setHMDVRDeviceParams_(this.getViewer()); + } +}; + +/** + * Main button was clicked. + */ +WebVRManager.prototype.onFSClick_ = function() { + switch (this.mode) { + case Modes.NORMAL: + // TODO: Remove this hack when iOS has fullscreen mode. + // If this is an iframe on iOS, break out and open in no_fullscreen mode. + if (Util.isIOS() && Util.isIFrame()) { + var url = window.location.href; + url = Util.appendQueryParameter(url, 'no_fullscreen', 'true'); + url = Util.appendQueryParameter(url, 'start_mode', Modes.MAGIC_WINDOW); + top.location.href = url; + return; + } + this.normalToMagicWindow_(); + this.setMode_(Modes.MAGIC_WINDOW); + break; + case Modes.MAGIC_WINDOW: + if (this.isFullscreenDisabled) { + window.history.back(); + } else { + this.anyModeToNormal_(); + this.setMode_(Modes.NORMAL); + } + break; + } +}; + +/** + * The VR button was clicked. + */ +WebVRManager.prototype.onVRClick_ = function() { + // TODO: Remove this hack when iOS has fullscreen mode. + // If this is an iframe on iOS, break out and open in no_fullscreen mode. + if (this.mode == Modes.NORMAL && Util.isIOS() && Util.isIFrame()) { + var url = window.location.href; + url = Util.appendQueryParameter(url, 'no_fullscreen', 'true'); + url = Util.appendQueryParameter(url, 'start_mode', Modes.VR); + top.location.href = url; + return; + } + this.anyModeToVR_(); + this.setMode_(Modes.VR); +}; + +/** + * Back button was clicked. + */ +WebVRManager.prototype.onBackClick_ = function() { + if (this.isFullscreenDisabled) { + window.history.back(); + } else { + this.anyModeToNormal_(); + this.setMode_(Modes.NORMAL); + } +}; + +WebVRManager.prototype.onSettingsClick_ = function() { + // Show the viewer selection dialog. + this.viewerSelector.show(); +}; + +/** + * + * Methods to go between modes. + * + */ +WebVRManager.prototype.normalToMagicWindow_ = function() { + // TODO: Re-enable pointer lock after debugging. + //this.requestPointerLock_(); + this.requestFullscreen_(); + this.wakelock.request(); +}; + +WebVRManager.prototype.anyModeToVR_ = function() { + // Don't do orientation locking for consistency. + //this.requestOrientationLock_(); + this.requestFullscreen_(); + //this.effect.setFullScreen(true); + this.wakelock.request(); + this.distorter.patch(); +}; + +WebVRManager.prototype.vrToMagicWindow_ = function() { + //this.releaseOrientationLock_(); + this.distorter.unpatch(); + + // Android bug: when returning from VR, resize the effect. + this.resize_(); +} + +WebVRManager.prototype.anyModeToNormal_ = function() { + //this.effect.setFullScreen(false); + this.exitFullscreen_(); + //this.releaseOrientationLock_(); + this.releasePointerLock_(); + this.wakelock.release(); + this.distorter.unpatch(); + + // Android bug: when returning from VR, resize the effect. + this.resize_(); +}; + +WebVRManager.prototype.resizeIfNeeded_ = function(camera) { + // Only resize the canvas if it needs to be resized. + var size = this.renderer.getSize(); + if (size.width != window.innerWidth || size.height != window.innerHeight) { + this.resize_(); + } +}; + +WebVRManager.prototype.resize_ = function() { + this.effect.setSize(window.innerWidth, window.innerHeight); + if (this.camera) { + this.camera.aspect = window.innerWidth / window.innerHeight; + this.camera.updateProjectionMatrix(); + } +}; + +WebVRManager.prototype.onOrientationChange_ = function(e) { + this.updateRotateInstructions_(); + // Also hide the viewer selector. + this.viewerSelector.hide(); +}; + +WebVRManager.prototype.updateRotateInstructions_ = function() { + this.rotateInstructions.disableShowTemporarily(); + // In portrait VR mode, tell the user to rotate to landscape. + if (this.mode == Modes.VR && !Util.isLandscapeMode() && Util.isMobile()) { + this.rotateInstructions.show(); + } else { + this.rotateInstructions.hide(); + } +}; + +WebVRManager.prototype.onFullscreenChange_ = function(e) { + // If we leave full-screen, go back to normal mode. + if (document.webkitFullscreenElement === null || + document.mozFullScreenElement === null) { + this.anyModeToNormal_(); + this.setMode_(Modes.NORMAL); + } +}; + +WebVRManager.prototype.requestPointerLock_ = function() { + var canvas = this.renderer.domElement; + canvas.requestPointerLock = canvas.requestPointerLock || + canvas.mozRequestPointerLock || + canvas.webkitRequestPointerLock; + + if (canvas.requestPointerLock) { + canvas.requestPointerLock(); + } +}; + +WebVRManager.prototype.releasePointerLock_ = function() { + document.exitPointerLock = document.exitPointerLock || + document.mozExitPointerLock || + document.webkitExitPointerLock; + + if (document.exitPointerLock) { + document.exitPointerLock(); + } +}; + +WebVRManager.prototype.requestOrientationLock_ = function() { + if (screen.orientation && Util.isMobile()) { + screen.orientation.lock('landscape'); + } +}; + +WebVRManager.prototype.releaseOrientationLock_ = function() { + if (screen.orientation) { + screen.orientation.unlock(); + } +}; + +WebVRManager.prototype.requestFullscreen_ = function() { + var canvas = document.body; + //var canvas = this.renderer.domElement; + if (canvas.requestFullscreen) { + canvas.requestFullscreen(); + } else if (canvas.mozRequestFullScreen) { + canvas.mozRequestFullScreen({vrDisplay: this.hmd}); + } else if (canvas.webkitRequestFullscreen) { + canvas.webkitRequestFullscreen({vrDisplay: this.hmd}); + } else if (canvas.msRequestFullscreen) { + canvas.msRequestFullscreen({vrDisplay: this.hmd}); + } +}; + +WebVRManager.prototype.exitFullscreen_ = function() { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } +}; + +WebVRManager.prototype.onViewerChanged_ = function(viewer) { + this.deviceInfo.setViewer(viewer); + + // Update the distortion appropriately. + this.distorter.updateDeviceInfo(this.deviceInfo); + + // And update the HMDVRDevice parameters. + this.setHMDVRDeviceParams_(viewer); + + // Notify anyone interested in this event. + this.emit('viewerchange', viewer); +}; + +/** + * Sets parameters on CardboardHMDVRDevice. These changes are ultimately handled + * by VREffect. + */ +WebVRManager.prototype.setHMDVRDeviceParams_ = function(viewer) { + this.getDeviceByType_(HMDVRDevice).then(function(hmd) { + if (!hmd) { + return; + } + + // If we can set fields of view, do that now. + if (hmd.setFieldOfView) { + // Calculate the optimal field of view for each eye. + hmd.setFieldOfView(this.deviceInfo.getFieldOfViewLeftEye(this.isUndistorted), + this.deviceInfo.getFieldOfViewRightEye(this.isUndistorted)); + } + + // Note: setInterpupillaryDistance is not part of the WebVR standard. + if (hmd.setInterpupillaryDistance) { + hmd.setInterpupillaryDistance(viewer.interLensDistance); + } + }.bind(this)); +}; + +WebVRManager.prototype.onDeviceParamsUpdated_ = function(newParams) { + console.log('DPDB reported that device params were updated.'); + this.deviceInfo.updateDeviceParams(newParams); + this.distorter.updateDeviceInfo(this.deviceInfo); +}; + +module.exports = WebVRManager; + +},{"./button-manager.js":2,"./cardboard-distorter.js":3,"./device-info.js":4,"./dpdb.js":8,"./emitter.js":9,"./modes.js":11,"./rotate-instructions.js":12,"./util.js":13,"./viewer-selector.js":14,"./wakelock.js":15}]},{},[10]); + +},{}],7:[function(_dereq_,module,exports){ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o Util.MAX_TIMESTEP) { + console.warn('Invalid timestamps detected. Time step between successive ' + + 'gyroscope sensor samples is very small or not monotonic'); + this.previousTimestampS = timestampS; + return; + } + this.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z); + this.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma); + + // With iOS and Firefox Android, rotationRate is reported in degrees, + // so we first convert to radians. + if (this.isIOS || this.isFirefoxAndroid) { + this.gyroscope.multiplyScalar(Math.PI / 180); + } + + this.filter.addAccelMeasurement(this.accelerometer, timestampS); + this.filter.addGyroMeasurement(this.gyroscope, timestampS); + + this.previousTimestampS = timestampS; +}; + +FusionPositionSensorVRDevice.prototype.onScreenOrientationChange_ = + function(screenOrientation) { + this.setScreenTransform_(); +}; + +FusionPositionSensorVRDevice.prototype.setScreenTransform_ = function() { + this.worldToScreenQ.set(0, 0, 0, 1); + switch (window.orientation) { + case 0: + break; + case 90: + this.worldToScreenQ.setFromAxisAngle(new THREE.Vector3(0, 0, 1), -Math.PI/2); + break; + case -90: + this.worldToScreenQ.setFromAxisAngle(new THREE.Vector3(0, 0, 1), Math.PI/2); + break; + case 180: + // TODO. + break; + } +}; + + +module.exports = FusionPositionSensorVRDevice; + +},{"./base.js":1,"./complementary-filter.js":3,"./pose-predictor.js":7,"./three-math.js":9,"./touch-panner.js":10,"./util.js":11}],5:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var WebVRPolyfill = _dereq_('./webvr-polyfill.js'); + +// Initialize a WebVRConfig just in case. +window.WebVRConfig = window.WebVRConfig || {}; +new WebVRPolyfill(); + +},{"./webvr-polyfill.js":12}],6:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var PositionSensorVRDevice = _dereq_('./base.js').PositionSensorVRDevice; +var THREE = _dereq_('./three-math.js'); +var Util = _dereq_('./util.js'); + +// How much to rotate per key stroke. +var KEY_SPEED = 0.15; +var KEY_ANIMATION_DURATION = 80; + +// How much to rotate for mouse events. +var MOUSE_SPEED_X = 0.5; +var MOUSE_SPEED_Y = 0.3; + +/** + * A virtual position sensor, implemented using keyboard and + * mouse APIs. This is designed as for desktops/laptops where no Device* + * events work. + */ +function MouseKeyboardPositionSensorVRDevice() { + this.deviceId = 'webvr-polyfill:mouse-keyboard'; + this.deviceName = 'VR Position Device (webvr-polyfill:mouse-keyboard)'; + + // Attach to mouse and keyboard events. + window.addEventListener('keydown', this.onKeyDown_.bind(this)); + window.addEventListener('mousemove', this.onMouseMove_.bind(this)); + window.addEventListener('mousedown', this.onMouseDown_.bind(this)); + window.addEventListener('mouseup', this.onMouseUp_.bind(this)); + + this.phi = 0; + this.theta = 0; + + // Variables for keyboard-based rotation animation. + this.targetAngle = null; + + // State variables for calculations. + this.euler = new THREE.Euler(); + this.orientation = new THREE.Quaternion(); + + // Variables for mouse-based rotation. + this.rotateStart = new THREE.Vector2(); + this.rotateEnd = new THREE.Vector2(); + this.rotateDelta = new THREE.Vector2(); +} +MouseKeyboardPositionSensorVRDevice.prototype = new PositionSensorVRDevice(); + +/** + * Returns {orientation: {x,y,z,w}, position: null}. + * Position is not supported for parity with other PositionSensors. + */ +MouseKeyboardPositionSensorVRDevice.prototype.getState = function() { + this.euler.set(this.phi, this.theta, 0, 'YXZ'); + this.orientation.setFromEuler(this.euler); + + return { + hasOrientation: true, + orientation: this.orientation, + hasPosition: false, + position: null + } +}; + +MouseKeyboardPositionSensorVRDevice.prototype.onKeyDown_ = function(e) { + // Track WASD and arrow keys. + if (e.keyCode == 38) { // Up key. + this.animatePhi_(this.phi + KEY_SPEED); + } else if (e.keyCode == 39) { // Right key. + this.animateTheta_(this.theta - KEY_SPEED); + } else if (e.keyCode == 40) { // Down key. + this.animatePhi_(this.phi - KEY_SPEED); + } else if (e.keyCode == 37) { // Left key. + this.animateTheta_(this.theta + KEY_SPEED); + } +}; + +MouseKeyboardPositionSensorVRDevice.prototype.animateTheta_ = function(targetAngle) { + this.animateKeyTransitions_('theta', targetAngle); +}; + +MouseKeyboardPositionSensorVRDevice.prototype.animatePhi_ = function(targetAngle) { + // Prevent looking too far up or down. + targetAngle = Util.clamp(targetAngle, -Math.PI/2, Math.PI/2); + this.animateKeyTransitions_('phi', targetAngle); +}; + +/** + * Start an animation to transition an angle from one value to another. + */ +MouseKeyboardPositionSensorVRDevice.prototype.animateKeyTransitions_ = function(angleName, targetAngle) { + // If an animation is currently running, cancel it. + if (this.angleAnimation) { + clearInterval(this.angleAnimation); + } + var startAngle = this[angleName]; + var startTime = new Date(); + // Set up an interval timer to perform the animation. + this.angleAnimation = setInterval(function() { + // Once we're finished the animation, we're done. + var elapsed = new Date() - startTime; + if (elapsed >= KEY_ANIMATION_DURATION) { + this[angleName] = targetAngle; + clearInterval(this.angleAnimation); + return; + } + // Linearly interpolate the angle some amount. + var percent = elapsed / KEY_ANIMATION_DURATION; + this[angleName] = startAngle + (targetAngle - startAngle) * percent; + }.bind(this), 1000/60); +}; + +MouseKeyboardPositionSensorVRDevice.prototype.onMouseDown_ = function(e) { + this.rotateStart.set(e.clientX, e.clientY); + this.isDragging = true; +}; + +// Very similar to https://gist.github.com/mrflix/8351020 +MouseKeyboardPositionSensorVRDevice.prototype.onMouseMove_ = function(e) { + if (!this.isDragging && !this.isPointerLocked_()) { + return; + } + // Support pointer lock API. + if (this.isPointerLocked_()) { + var movementX = e.movementX || e.mozMovementX || 0; + var movementY = e.movementY || e.mozMovementY || 0; + this.rotateEnd.set(this.rotateStart.x - movementX, this.rotateStart.y - movementY); + } else { + this.rotateEnd.set(e.clientX, e.clientY); + } + // Calculate how much we moved in mouse space. + this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart); + this.rotateStart.copy(this.rotateEnd); + + // Keep track of the cumulative euler angles. + var element = document.body; + this.phi += 2 * Math.PI * this.rotateDelta.y / element.clientHeight * MOUSE_SPEED_Y; + this.theta += 2 * Math.PI * this.rotateDelta.x / element.clientWidth * MOUSE_SPEED_X; + + // Prevent looking too far up or down. + this.phi = Util.clamp(this.phi, -Math.PI/2, Math.PI/2); +}; + +MouseKeyboardPositionSensorVRDevice.prototype.onMouseUp_ = function(e) { + this.isDragging = false; +}; + +MouseKeyboardPositionSensorVRDevice.prototype.isPointerLocked_ = function() { + var el = document.pointerLockElement || document.mozPointerLockElement || + document.webkitPointerLockElement; + return el !== undefined; +}; + +MouseKeyboardPositionSensorVRDevice.prototype.resetSensor = function() { + console.error('Not implemented yet.'); +}; + +module.exports = MouseKeyboardPositionSensorVRDevice; + +},{"./base.js":1,"./three-math.js":9,"./util.js":11}],7:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var THREE = _dereq_('./three-math.js'); + +var DEBUG = false; + +/** + * Given an orientation and the gyroscope data, predicts the future orientation + * of the head. This makes rendering appear faster. + * + * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf + * + * @param {Number} predictionTimeS time from head movement to the appearance of + * the corresponding image. + */ +function PosePredictor(predictionTimeS) { + this.predictionTimeS = predictionTimeS; + + // The quaternion corresponding to the previous state. + this.previousQ = new THREE.Quaternion(); + // Previous time a prediction occurred. + this.previousTimestampS = null; + + // The delta quaternion that adjusts the current pose. + this.deltaQ = new THREE.Quaternion(); + // The output quaternion. + this.outQ = new THREE.Quaternion(); +} + +PosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) { + if (!this.previousTimestampS) { + this.previousQ.copy(currentQ); + this.previousTimestampS = timestampS; + return currentQ; + } + + // Calculate axis and angle based on gyroscope rotation rate data. + var axis = new THREE.Vector3(); + axis.copy(gyro); + axis.normalize(); + + var angularSpeed = gyro.length(); + + // If we're rotating slowly, don't do prediction. + if (angularSpeed < THREE.Math.degToRad(20)) { + if (DEBUG) { + console.log('Moving slowly, at %s deg/s: no prediction', + THREE.Math.radToDeg(angularSpeed).toFixed(1)); + } + this.outQ.copy(currentQ); + this.previousQ.copy(currentQ); + return this.outQ; + } + + // Get the predicted angle based on the time delta and latency. + var deltaT = timestampS - this.previousTimestampS; + var predictAngle = angularSpeed * this.predictionTimeS; + + this.deltaQ.setFromAxisAngle(axis, predictAngle); + this.outQ.copy(this.previousQ); + this.outQ.multiply(this.deltaQ); + + this.previousQ.copy(currentQ); + + return this.outQ; +}; + + +module.exports = PosePredictor; + +},{"./three-math.js":9}],8:[function(_dereq_,module,exports){ +function SensorSample(sample, timestampS) { + this.set(sample, timestampS); +}; + +SensorSample.prototype.set = function(sample, timestampS) { + this.sample = sample; + this.timestampS = timestampS; +}; + +SensorSample.prototype.copy = function(sensorSample) { + this.set(sensorSample.sample, sensorSample.timestampS); +}; + +module.exports = SensorSample; + +},{}],9:[function(_dereq_,module,exports){ +/* + * A subset of THREE.js, providing mostly quaternion and euler-related + * operations, manually lifted from + * https://github.com/mrdoob/three.js/tree/master/src/math, as of 9c30286b38df039fca389989ff06ea1c15d6bad1 + */ + +// Only use if the real THREE is not provided. +var THREE = window.THREE || {}; + +// If some piece of THREE is missing, fill it in here. +if (!THREE.Quaternion || !THREE.Vector3 || !THREE.Vector2 || !THREE.Euler || !THREE.Math) { +console.log('No THREE.js found.'); + + +/*** START Quaternion ***/ + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://exocortex.com + */ + +THREE.Quaternion = function ( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + +}; + +THREE.Quaternion.prototype = { + + constructor: THREE.Quaternion, + + _x: 0,_y: 0, _z: 0, _w: 0, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get w () { + + return this._w; + + }, + + set w ( value ) { + + this._w = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( euler instanceof THREE.Euler === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + } + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var c1 = Math.cos( euler._x / 2 ); + var c2 = Math.cos( euler._y / 2 ); + var c3 = Math.cos( euler._z / 2 ); + var s1 = Math.sin( euler._x / 2 ); + var s2 = Math.sin( euler._y / 2 ); + var s3 = Math.sin( euler._z / 2 ); + + if ( euler.order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( euler.order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( euler.order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( euler.order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( euler.order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( euler.order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final + + // assumes direction vectors vFrom and vTo are normalized + + var v1, r; + + var EPS = 0.000001; + + return function ( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + this.normalize(); + + return this; + + } + + }(), + + inverse: function () { + + this.conjugate().normalize(); + + return this; + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var halfTheta = Math.acos( cosHalfTheta ); + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {}, + + clone: function () { + + return new THREE.Quaternion( this._x, this._y, this._z, this._w ); + + } + +}; + +THREE.Quaternion.slerp = function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + +} + +/*** END Quaternion ***/ +/*** START Vector2 ***/ +/** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.Vector2 = function ( x, y ) { + + this.x = x || 0; + this.y = y || 0; + +}; + +THREE.Vector2.prototype = { + + constructor: THREE.Vector2, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.x *= s; + this.y *= s; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + if ( scalar !== 0 ) { + + var invScalar = 1 / scalar; + + this.x *= invScalar; + this.y *= invScalar; + + } else { + + this.x = 0; + this.y = 0; + + } + + return this; + + }, + + min: function ( v ) { + + if ( this.x > v.x ) { + + this.x = v.x; + + } + + if ( this.y > v.y ) { + + this.y = v.y; + + } + + return this; + + }, + + max: function ( v ) { + + if ( this.x < v.x ) { + + this.x = v.x; + + } + + if ( this.y < v.y ) { + + this.y = v.y; + + } + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + if ( this.x < min.x ) { + + this.x = min.x; + + } else if ( this.x > max.x ) { + + this.x = max.x; + + } + + if ( this.y < min.y ) { + + this.y = min.y; + + } else if ( this.y > max.y ) { + + this.y = max.y; + + } + + return this; + }, + + clampScalar: ( function () { + + var min, max; + + return function ( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector2(); + max = new THREE.Vector2(); + + } + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + } )(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + setLength: function ( l ) { + + var oldLength = this.length(); + + if ( oldLength !== 0 && l !== oldLength ) { + + this.multiplyScalar( l / oldLength ); + } + + return this; + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + + return this; + + }, + + clone: function () { + + return new THREE.Vector2( this.x, this.y ); + + } + +}; +/*** END Vector2 ***/ +/*** START Vector3 ***/ + +/** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Vector3 = function ( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + +}; + +THREE.Vector3.prototype = { + + constructor: THREE.Vector3, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion; + + return function ( euler ) { + + if ( euler instanceof THREE.Euler === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); + + this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + return this; + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion; + + return function ( axis, angle ) { + + if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); + + this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + return this; + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x; + var y = this.y; + var z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + // input: THREE.Matrix4 affine matrix + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + + return this; + + }, + + applyProjection: function ( m ) { + + // input: THREE.Matrix4 projection matrix + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + var d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x; + var y = this.y; + var z = this.z; + + var qx = q.x; + var qy = q.y; + var qz = q.z; + var qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix; + + return function ( camera ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix; + + return function ( camera ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + this.normalize(); + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + if ( scalar !== 0 ) { + + var invScalar = 1 / scalar; + + this.x *= invScalar; + this.y *= invScalar; + this.z *= invScalar; + + } else { + + this.x = 0; + this.y = 0; + this.z = 0; + + } + + return this; + + }, + + min: function ( v ) { + + if ( this.x > v.x ) { + + this.x = v.x; + + } + + if ( this.y > v.y ) { + + this.y = v.y; + + } + + if ( this.z > v.z ) { + + this.z = v.z; + + } + + return this; + + }, + + max: function ( v ) { + + if ( this.x < v.x ) { + + this.x = v.x; + + } + + if ( this.y < v.y ) { + + this.y = v.y; + + } + + if ( this.z < v.z ) { + + this.z = v.z; + + } + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + if ( this.x < min.x ) { + + this.x = min.x; + + } else if ( this.x > max.x ) { + + this.x = max.x; + + } + + if ( this.y < min.y ) { + + this.y = min.y; + + } else if ( this.y > max.y ) { + + this.y = max.y; + + } + + if ( this.z < min.z ) { + + this.z = min.z; + + } else if ( this.z > max.z ) { + + this.z = max.z; + + } + + return this; + + }, + + clampScalar: ( function () { + + var min, max; + + return function ( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector3(); + max = new THREE.Vector3(); + + } + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + } )(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( l ) { + + var oldLength = this.length(); + + if ( oldLength !== 0 && l !== oldLength ) { + + this.multiplyScalar( l / oldLength ); + } + + return this; + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function () { + + var v1, dot; + + return function ( vector ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + v1.copy( vector ).normalize(); + + dot = this.dot( v1 ); + + return this.copy( v1 ).multiplyScalar( dot ); + + }; + + }(), + + projectOnPlane: function () { + + var v1; + + return function ( planeNormal ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + } + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1; + + return function ( normal ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + } + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( this.length() * v.length() ); + + // clamp, to handle numerical problems + + return Math.acos( THREE.Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x; + var dy = this.y - v.y; + var dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + setEulerFromRotationMatrix: function ( m, order ) { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + + setEulerFromQuaternion: function ( q, order ) { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + + return this.setFromMatrixPosition( m ); + + }, + + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + + return this.setFromMatrixScale( m ); + }, + + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + + return this.setFromMatrixColumn( index, matrix ); + + }, + + setFromMatrixPosition: function ( m ) { + + this.x = m.elements[ 12 ]; + this.y = m.elements[ 13 ]; + this.z = m.elements[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.set( m.elements[ 0 ], m.elements[ 1 ], m.elements[ 2 ] ).length(); + var sy = this.set( m.elements[ 4 ], m.elements[ 5 ], m.elements[ 6 ] ).length(); + var sz = this.set( m.elements[ 8 ], m.elements[ 9 ], m.elements[ 10 ] ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + }, + + setFromMatrixColumn: function ( index, matrix ) { + + var offset = index * 4; + + var me = matrix.elements; + + this.x = me[ offset ]; + this.y = me[ offset + 1 ]; + this.z = me[ offset + 2 ]; + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + + return this; + + }, + + clone: function () { + + return new THREE.Vector3( this.x, this.y, this.z ); + + } + +}; +/*** END Vector3 ***/ +/*** START Euler ***/ +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://exocortex.com + */ + +THREE.Euler = function ( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || THREE.Euler.DefaultOrder; + +}; + +THREE.Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + +THREE.Euler.DefaultOrder = 'XYZ'; + +THREE.Euler.prototype = { + + constructor: THREE.Euler, + + _x: 0, _y: 0, _z: 0, _order: THREE.Euler.DefaultOrder, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get order () { + + return this._order; + + }, + + set order ( value ) { + + this._order = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = THREE.Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ) + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix; + + return function ( q, order, update ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + matrix.makeRotationFromQuaternion( q ); + this.setFromRotationMatrix( matrix, order, update ); + + return this; + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new THREE.Quaternion(); + + return function ( newOrder ) { + + q.setFromEuler( this ); + this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function () { + + return [ this._x, this._y, this._z, this._order ]; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new THREE.Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {}, + + clone: function () { + + return new THREE.Euler( this._x, this._y, this._z, this._order ); + + } + +}; +/*** END Euler ***/ +/*** START Math ***/ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Math = { + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function () { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i == 8 || i == 13 || i == 18 || i == 23 ) { + + uuid[ i ] = '-'; + + } else if ( i == 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i == 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + } + + return uuid.join( '' ); + + }; + + }(), + + // Clamp value to range + + clamp: function ( x, a, b ) { + + return ( x < a ) ? a : ( ( x > b ) ? b : x ); + + }, + + // Clamp value to range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random float from <0, 1> with 16 bits of randomness + // (standard Math.random() creates repetitive patterns when applied over larger space) + + random16: function () { + + return ( 65280 * Math.random() + 255 * Math.random() ) / 65535; + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return Math.floor( this.randFloat( low, high ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function () { + + var degreeToRadiansFactor = Math.PI / 180; + + return function ( degrees ) { + + return degrees * degreeToRadiansFactor; + + }; + + }(), + + radToDeg: function () { + + var radianToDegreesFactor = 180 / Math.PI; + + return function ( radians ) { + + return radians * radianToDegreesFactor; + + }; + + }(), + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + } + +}; + +/*** END Math ***/ + +} + +module.exports = THREE; + +},{}],10:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var THREE = _dereq_('./three-math.js'); +var Util = _dereq_('./util.js'); + +var ROTATE_SPEED = 0.5; +/** + * Provides a quaternion responsible for pre-panning the scene before further + * transformations due to device sensors. + */ +function TouchPanner() { + window.addEventListener('touchstart', this.onTouchStart_.bind(this)); + window.addEventListener('touchmove', this.onTouchMove_.bind(this)); + window.addEventListener('touchend', this.onTouchEnd_.bind(this)); + + this.isTouching = false; + this.rotateStart = new THREE.Vector2(); + this.rotateEnd = new THREE.Vector2(); + this.rotateDelta = new THREE.Vector2(); + + this.theta = 0; + this.orientation = new THREE.Quaternion(); +} + +TouchPanner.prototype.getOrientation = function() { + this.orientation.setFromEuler(new THREE.Euler(0, 0, this.theta)); + return this.orientation; +}; + +TouchPanner.prototype.resetSensor = function() { + this.theta = 0; +}; + +TouchPanner.prototype.onTouchStart_ = function(e) { + // Only respond if there is exactly one touch. + if (e.touches.length != 1) { + return; + } + this.rotateStart.set(e.touches[0].pageX, e.touches[0].pageY); + this.isTouching = true; +}; + +TouchPanner.prototype.onTouchMove_ = function(e) { + if (!this.isTouching) { + return; + } + this.rotateEnd.set(e.touches[0].pageX, e.touches[0].pageY); + this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart); + this.rotateStart.copy(this.rotateEnd); + + // On iOS, direction is inverted. + if (Util.isIOS()) { + this.rotateDelta.x *= -1; + } + + var element = document.body; + this.theta += 2 * Math.PI * this.rotateDelta.x / element.clientWidth * ROTATE_SPEED; +}; + +TouchPanner.prototype.onTouchEnd_ = function(e) { + this.isTouching = false; +}; + +module.exports = TouchPanner; + +},{"./three-math.js":9,"./util.js":11}],11:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var Util = window.Util || {}; + +Util.MIN_TIMESTEP = 0.001; +Util.MAX_TIMESTEP = 1; + +Util.clamp = function(value, min, max) { + return Math.min(Math.max(min, value), max); +}; + +Util.isIOS = function() { + return /iPad|iPhone|iPod/.test(navigator.platform); +}; + +Util.isFirefoxAndroid = function() { + return navigator.userAgent.indexOf('Firefox') !== -1 && navigator.userAgent.indexOf('Android') !== -1; +} + +// Helper method to validate the time steps of sensor timestamps. +Util.isTimestampDeltaValid = function(timestampDeltaS) { + if (isNaN(timestampDeltaS)) { + return false; + } + if (timestampDeltaS <= Util.MIN_TIMESTEP) { + return false; + } + if (timestampDeltaS > Util.MAX_TIMESTEP) { + return false; + } + return true; +} + +module.exports = Util; + +},{}],12:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var CardboardHMDVRDevice = _dereq_('./cardboard-hmd-vr-device.js'); +//var OrientationPositionSensorVRDevice = require('./orientation-position-sensor-vr-device.js'); +var FusionPositionSensorVRDevice = _dereq_('./fusion-position-sensor-vr-device.js'); +var MouseKeyboardPositionSensorVRDevice = _dereq_('./mouse-keyboard-position-sensor-vr-device.js'); +// Uncomment to add positional tracking via webcam. +//var WebcamPositionSensorVRDevice = require('./webcam-position-sensor-vr-device.js'); +var HMDVRDevice = _dereq_('./base.js').HMDVRDevice; +var PositionSensorVRDevice = _dereq_('./base.js').PositionSensorVRDevice; + +function WebVRPolyfill() { + this.devices = []; + + if (!this.isWebVRAvailable()) { + this.enablePolyfill(); + } +} + +WebVRPolyfill.prototype.isWebVRAvailable = function() { + return ('getVRDevices' in navigator) || ('mozGetVRDevices' in navigator); +}; + + +WebVRPolyfill.prototype.enablePolyfill = function() { + // Initialize our virtual VR devices. + if (this.isCardboardCompatible()) { + this.devices.push(new CardboardHMDVRDevice()); + } + + // Polyfill using the right position sensor. + if (this.isMobile()) { + //this.devices.push(new OrientationPositionSensorVRDevice()); + this.devices.push(new FusionPositionSensorVRDevice()); + } else { + if (!WebVRConfig.MOUSE_KEYBOARD_CONTROLS_DISABLED) { + this.devices.push(new MouseKeyboardPositionSensorVRDevice()); + } + // Uncomment to add positional tracking via webcam. + //this.devices.push(new WebcamPositionSensorVRDevice()); + } + + // Provide navigator.getVRDevices. + navigator.getVRDevices = this.getVRDevices.bind(this); + + // Provide the CardboardHMDVRDevice and PositionSensorVRDevice objects. + window.HMDVRDevice = HMDVRDevice; + window.PositionSensorVRDevice = PositionSensorVRDevice; +}; + +WebVRPolyfill.prototype.getVRDevices = function() { + var devices = this.devices; + return new Promise(function(resolve, reject) { + try { + resolve(devices); + } catch (e) { + reject(e); + } + }); +}; + +/** + * Determine if a device is mobile. + */ +WebVRPolyfill.prototype.isMobile = function() { + return /Android/i.test(navigator.userAgent) || + /iPhone|iPad|iPod/i.test(navigator.userAgent); +}; + +WebVRPolyfill.prototype.isCardboardCompatible = function() { + // For now, support all iOS and Android devices. + // Also enable the WebVRConfig.FORCE_VR flag for debugging. + return this.isMobile() || WebVRConfig.FORCE_ENABLE_VR; +}; + +module.exports = WebVRPolyfill; + +},{"./base.js":1,"./cardboard-hmd-vr-device.js":2,"./fusion-position-sensor-vr-device.js":4,"./mouse-keyboard-position-sensor-vr-device.js":6}]},{},[5]); + +},{}],8:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var MODE_LABELS = { + 0: 'UNKNOWN', + 1: 'NORMAL', + 2: 'MAGIC_WINDOW', + 3: 'VR' +}; + +function Analytics() { + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-35315454-8', 'auto'); + ga('send', 'pageview'); + + this.lastModeChangeTime = window.performance.now(); + this.lastModeLabel = WebVRManager.Modes.UNKNOWN; +} + +Analytics.prototype.logModeChanged = function(mode) { + var modeLabel = MODE_LABELS[mode]; + var lastModeLabel = MODE_LABELS[this.lastMode]; + + console.log('Analytics: going from mode %s to %s', lastModeLabel, modeLabel); + + ga('send', 'screenview', { + appName: 'EmbedVR', + screenName: modeLabel + }); + + var now = window.performance.now(); + var msSinceLastModeChange = Math.round(now - this.lastModeChangeTime); + ga('send', 'timing', 'Time spent in mode', lastModeLabel, msSinceLastModeChange); + + this.lastModeChangeTime = now; + this.lastMode = mode; +} + +window.analytics = new Analytics(); + +},{}],9:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/** + * Sits in an embedded iframe, receiving DeviceMotion messages from a containing + * iFrame. These messages are converted into synthetic DeviceMotion events. + * + * This is a workaround for https://bugs.webkit.org/show_bug.cgi?id=150072. + */ +function DeviceMotionReceiver() { + window.addEventListener('message', this.onMessage_.bind(this), false); +} + +DeviceMotionReceiver.prototype.onMessage_ = function(event) { + var message = event.data; + if (message.type !== 'DeviceMotion') { + console.warn('Got unknown message of type %s from %s', message.type, message.origin); + return; + } + + console.log('onMessage_', event); + + // Synthesize a DeviceMotion event. + this.synthesizeDeviceMotionEvent_(message.deviceMotionEvent); +}; + +DeviceMotionReceiver.prototype.synthesizeDeviceMotionEvent_ = function(eventData) { + var type = 'devicemotion-iframe'; + var canBubble = false; + var cancelable = false; + + var dme = document.createEvent('DeviceMotionEvent'); + dme.initDeviceMotionEvent(type, canBubble, cancelable, + eventData.acceleration, + eventData.accelerationIncludingGravity, + eventData.rotationRate, + eventData.interval); + + window.dispatchEvent(dme); +}; + +module.exports = DeviceMotionReceiver; + +},{}],10:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +function Emitter() { + this.initEmitter(); +} + +Emitter.prototype.initEmitter = function() { + this.callbacks = {}; +}; + +Emitter.prototype.emit = function(eventName) { + var callbacks = this.callbacks[eventName]; + if (!callbacks) { + console.log('No valid callback specified.'); + return; + } + var args = [].slice.call(arguments) + // Eliminate the first param (the callback). + args.shift(); + for (var i = 0; i < callbacks.length; i++) { + callbacks[i].apply(this, args); + } +}; + +Emitter.prototype.on = function(eventName, callback) { + if (eventName in this.callbacks) { + var cbs = this.callbacks[eventName] + if (cbs.indexOf(callback) == -1) { + cbs.push(callback); + } + } else { + this.callbacks[eventName] = [callback]; + } +}; + +Emitter.prototype.removeListener = function(eventName, callback) { + if (!(eventName in this.callbacks)) { + return; + } + var cbs = this.callbacks[eventName]; + var ind = cbs.indexOf(callback); + if (ind == -1) { + console.warn('No matching callback found'); + return; + } + cbs.splice(ind, 1); +}; + +module.exports = Emitter; + +},{}],11:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var Eyes = { + LEFT: 0, + RIGHT: 1 +}; + +module.exports = Eyes; + +},{}],12:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Shows a 2D loading indicator while various pieces of EmbedVR load. + */ +function LoadingIndicator() { + this.el = this.build_(); + document.body.appendChild(this.el); + this.show(); +} + +LoadingIndicator.prototype.build_ = function() { + var overlay = document.createElement('div'); + var s = overlay.style; + s.position = 'fixed'; + s.top = 0; + s.left = 0; + s.width = '100%'; + s.height = '100%'; + s.background = '#eee'; + var img = document.createElement('img'); + img.src = 'images/loading.gif'; + var s = img.style; + s.position = 'absolute'; + s.top = '50%'; + s.left = '50%'; + s.transform = 'translate(-50%, -50%)'; + + overlay.appendChild(img); + return overlay; +}; + +LoadingIndicator.prototype.hide = function() { + this.el.style.display = 'none'; +}; + +LoadingIndicator.prototype.show = function() { + this.el.style.display = 'block'; +}; + +module.exports = LoadingIndicator; + +},{}],13:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Disable distortion provided by the boilerplate because we are doing +// vertex-based distortion. +WebVRConfig = window.WebVRConfig || {} +WebVRConfig.PREVENT_DISTORTION = true; + +// Initialize the loading indicator as quickly as possible to give the user +// immediate feedback. +var LoadingIndicator = _dereq_('./loading-indicator'); +var loadIndicator = new LoadingIndicator(); + +// Include relevant polyfills. +_dereq_('../node_modules/webvr-polyfill/build/webvr-polyfill'); +var ES6Promise = _dereq_('../node_modules/es6-promise/dist/es6-promise.min'); +// Polyfill ES6 promises for IE. +ES6Promise.polyfill(); + +var PhotosphereRenderer = _dereq_('./photosphere-renderer'); +var SceneLoader = _dereq_('./scene-loader'); +var Stats = _dereq_('../node_modules/stats-js/build/stats.min'); +var Util = _dereq_('./util'); + +// Include the DeviceMotionReceiver for the iOS cross domain iframe workaround. +// This is a workaround for https://bugs.webkit.org/show_bug.cgi?id=150072. +var DeviceMotionReceiver = _dereq_('./device-motion-receiver'); +var dmr = new DeviceMotionReceiver(); + + +window.addEventListener('load', init); + +var stats = new Stats(); + +var loader = new SceneLoader(); +loader.on('error', onSceneError); +loader.on('load', onSceneLoad); + +var renderer = new PhotosphereRenderer(); +renderer.on('error', onRenderError); + +var videoElement = null; +// TODO: Make this not global. +// Currently global in order to allow callbacks. +var loadedScene = null; + +function init() { + if (!Util.isWebGLEnabled()) { + showError('WebGL not supported.'); + return; + } + // Load the scene. + loader.loadScene(); + + if (Util.getQueryParameter('debug')) { + showStats(); + } +} + +function loadImage(src, params) { + renderer.on('load', onRenderLoad); + renderer.setPhotosphere(src, params); +} + +function onSceneLoad(scene) { + if (!scene || !scene.isComplete()) { + showError('Scene failed to load'); + return; + } + + loadedScene = scene; + + var params = { + isStereo: scene.isStereo, + } + renderer.setDefaultLookDirection(scene.yaw || 0); + + if (scene.preview) { + var onPreviewLoad = function() { + loadIndicator.hide(); + renderer.removeListener('load', onPreviewLoad); + renderer.setPhotosphere(scene.image, params); + } + renderer.removeListener('load', onRenderLoad); + renderer.on('load', onPreviewLoad); + renderer.setPhotosphere(scene.preview, params); + } else if (scene.video) { + if (Util.isIOS() || Util.isIE11()) { + // On iOS and IE 11, if an 'image' param is provided, load it instead of + // showing an error. + // + // TODO(smus): Once video textures are supported, remove this fallback. + if (scene.image) { + loadImage(scene.image, params); + } else { + showError('Video is not supported on this platform (iOS or IE11).'); + } + } else { + // Load the video element. + videoElement = document.createElement('video'); + videoElement.src = scene.video; + videoElement.loop = true; + videoElement.setAttribute('crossorigin', 'anonymous'); + videoElement.addEventListener('canplaythrough', onVideoLoad); + videoElement.addEventListener('error', onVideoError); + } + } else if (scene.image) { + // Otherwise, just render the photosphere. + loadImage(scene.image, params); + } + + console.log('Loaded scene', scene); +} + +function onVideoLoad() { + // Render the stereo video. + var params = { + isStereo: loadedScene.isStereo, + } + renderer.set360Video(videoElement, params); + + // On mobile, tell the user they need to tap to start. Otherwise, autoplay. + if (!Util.isMobile()) { + // Hide loading indicator. + loadIndicator.hide(); + // Autoplay the video on desktop. + videoElement.play(); + } else { + // Tell user to tap to start. + showError('Tap to start video', 'Play'); + document.body.addEventListener('touchend', onVideoTap); + } + + // Prevent onVideoLoad from firing multiple times. + videoElement.removeEventListener('canplaythrough', onVideoLoad); +} + +function onVideoTap() { + hideError(); + videoElement.play(); + + // Prevent multiple play() calls on the video element. + document.body.removeEventListener('touchend', onVideoTap); +} + +function onRenderLoad() { + // Hide loading indicator. + loadIndicator.hide(); +} + +function onSceneError(message) { + showError('Loader: ' + message); +} + +function onRenderError(message) { + showError('Render: ' + message); +} + +function onVideoError(e) { + showError('Video load error'); + console.log(e); +} + +function showError(message, opt_title) { + // Hide loading indicator. + loadIndicator.hide(); + + var error = document.querySelector('#error'); + error.classList.add('visible'); + error.querySelector('.message').innerHTML = message; + + var title = (opt_title !== undefined ? opt_title : 'Error'); + error.querySelector('.title').innerHTML = title; +} + +function hideError() { + var error = document.querySelector('#error'); + error.classList.remove('visible'); +} + +function showStats() { + stats.setMode(0); // 0: fps, 1: ms + + // Align bottom-left. + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.bottom = '0px'; + document.body.appendChild(stats.domElement); +} + +function loop(time) { + stats.begin(); + renderer.render(time); + stats.end(); + requestAnimationFrame(loop); +} +requestAnimationFrame(loop); + +},{"../node_modules/es6-promise/dist/es6-promise.min":1,"../node_modules/stats-js/build/stats.min":2,"../node_modules/webvr-polyfill/build/webvr-polyfill":7,"./device-motion-receiver":9,"./loading-indicator":12,"./photosphere-renderer":14,"./scene-loader":16,"./util":17}],14:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Emitter = _dereq_('./emitter'); +var Eyes = _dereq_('./eyes'); +var THREE = _dereq_('../node_modules/three/three'); +THREE.VRControls = _dereq_('../node_modules/three/examples/js/controls/VRControls'); +THREE.VREffect = _dereq_('../node_modules/three/examples/js/effects/VREffect'); +var Util = _dereq_('./util'); +var VertexDistorter = _dereq_('./vertex-distorter'); +_dereq_('../node_modules/webvr-boilerplate/build/webvr-manager'); + +function PhotosphereRenderer() { + this.init(); +} +PhotosphereRenderer.prototype = new Emitter(); + +PhotosphereRenderer.prototype.init = function() { + var container = document.querySelector('body'); + var camera = new THREE.PerspectiveCamera(80, window.innerWidth / window.innerHeight, 0.1, 100); + var cameraDummy = new THREE.Object3D(); + cameraDummy.add(camera); + + // Antialiasing temporarily disabled to improve performance. + var renderer = new THREE.WebGLRenderer({antialias: false}); + renderer.setClearColor(0x000000, 0); + renderer.setSize(window.innerWidth, window.innerHeight); + + // Round down fractional DPR values for better performance. + renderer.setPixelRatio(Math.floor(window.devicePixelRatio)); + container.appendChild(renderer.domElement); + + var controls = new THREE.VRControls(camera); + var effect = new THREE.VREffect(renderer); + effect.setSize(window.innerWidth, window.innerHeight); + + this.camera = camera; + this.renderer = renderer; + this.effect = effect; + this.controls = controls; + this.manager = new WebVRManager(renderer, effect, {isUndistorted: true}); + + this.initScenes_(); + + // The vertex distorter. + this.distorter = new VertexDistorter(this.manager.getDeviceInfo()); + + this.manager.on('modechange', this.onModeChange_.bind(this)); + this.manager.on('viewerchange', this.onViewerChange_.bind(this)); + + // Watch the resize event. + window.addEventListener('resize', this.onResize_.bind(this)); + + var that = this; + navigator.getVRDevices().then(function(devices) { + devices.forEach(function(device) { + if (device instanceof HMDVRDevice) { + that.hmd = device; + } + }); + }); +}; + +PhotosphereRenderer.prototype.render = function(timestamp) { + this.controls.update(); + this.manager.render(this.scenes, this.camera, timestamp); +}; + +PhotosphereRenderer.prototype.setDefaultLookDirection = function(phi) { + // Rotate the camera parent to take into account the scene's rotation. + this.camera.parent.rotation.y = phi; +}; + +/** + * Sets the photosphere based on the image in the source. Supports stereo and + * mono photospheres. + * + * Emits 'load' and 'error' events. + */ +PhotosphereRenderer.prototype.setPhotosphere = function(src, opt_params) { + var params = opt_params || {}; + + this.isStereo = !!params.isStereo; + this.src = src; + + // Load texture. + var loader = new THREE.TextureLoader(); + loader.crossOrigin = 'anonymous'; + loader.load(src, this.onTextureLoaded_.bind(this), null, + this.onTextureError_.bind(this)); +}; + +PhotosphereRenderer.prototype.set360Video = function(videoElement, opt_params) { + var params = opt_params || {}; + + this.isStereo = !!params.isStereo; + + // Load the video texture. + var videoTexture = new THREE.VideoTexture(videoElement); + videoTexture.minFilter = THREE.LinearFilter; + videoTexture.magFilter = THREE.LinearFilter; + videoTexture.format = THREE.RGBFormat; + videoTexture.generateMipmaps = false; + videoTexture.needsUpdate = true; + + this.onTextureLoaded_(videoTexture); +}; + +PhotosphereRenderer.prototype.initScenes_ = function() { + this.sceneLeft = this.createScene_(); + this.sceneRight = this.createScene_(); + this.sceneLeft.add(this.camera.parent); + + this.scenes = [this.sceneLeft, this.sceneRight]; + this.eyes = [Eyes.LEFT, Eyes.RIGHT]; +}; + +PhotosphereRenderer.prototype.onTextureLoaded_ = function(texture) { + var sphereLeft; + var sphereRight; + if (this.isStereo) { + sphereLeft = this.createPhotosphere_(texture, {offsetY: 0.5, scaleY: 0.5}); + sphereRight = this.createPhotosphere_(texture, {offsetY: 0, scaleY: 0.5}); + } else { + sphereLeft = this.createPhotosphere_(texture); + sphereRight = this.createPhotosphere_(texture); + } + + this.sceneLeft.getObjectByName('photo').children = [sphereLeft]; + this.sceneRight.getObjectByName('photo').children = [sphereRight]; + + this.emit('load'); +}; + +PhotosphereRenderer.prototype.onTextureError_ = function(error) { + this.emit('error', 'Unable to load texture from ' + this.src); +}; + + +PhotosphereRenderer.prototype.createPhotosphere_ = function(texture, opt_params) { + var p = opt_params || {}; + p.scaleX = p.scaleX || 1; + p.scaleY = p.scaleY || 1; + p.offsetX = p.offsetX || 0; + p.offsetY = p.offsetY || 0; + p.phiStart = p.phiStart || 0; + p.phiLength = p.phiLength || Math.PI * 2; + p.thetaStart = p.thetaStart || 0; + p.thetaLength = p.thetaLength || Math.PI; + + var geometry = new THREE.SphereGeometry(1, 48, 48, + p.phiStart, p.phiLength, p.thetaStart, p.thetaLength); + geometry.applyMatrix(new THREE.Matrix4().makeScale(-1, 1, 1)); + var uvs = geometry.faceVertexUvs[0]; + for (var i = 0; i < uvs.length; i ++) { + for (var j = 0; j < 3; j ++) { + uvs[i][j].x *= p.scaleX; + uvs[i][j].x += p.offsetX; + uvs[i][j].y *= p.scaleY; + uvs[i][j].y += p.offsetY; + } + } + + var material = new THREE.MeshBasicMaterial({ map: texture }); + this.distorter.setMap(texture); + var out = new THREE.Mesh(geometry, material); + out.renderOrder = -1; + return out; +}; + +PhotosphereRenderer.prototype.createScene_ = function(opt_params) { + var scene = new THREE.Scene(); + // Add a light. + scene.add(new THREE.PointLight(0xFFFFFF)); + + // Add a group for the photosphere. + var photoGroup = new THREE.Object3D(); + photoGroup.name = 'photo'; + scene.add(photoGroup); + + return scene; +}; + +PhotosphereRenderer.prototype.updateMaterial_ = function(material_FOO) { + for (var i = 0; i < this.scenes.length; i++) { + var eye = this.eyes[i]; + var material = this.distorter.getShaderMaterial(eye); + var scene = this.scenes[i]; + var children = scene.getObjectByName('photo').children; + for (var j = 0; j < children.length; j++) { + var child = children[j]; + child.material = material; + child.material.needsUpdate = true; + } + } +}; + +PhotosphereRenderer.prototype.updateRenderRect_ = function() { + if (this.hmd && this.hmd.setRenderRect) { + var deviceInfo = this.manager.getDeviceInfo(); + var leftRect = deviceInfo.getUndistortedViewportLeftEye(); + var dpr = window.devicePixelRatio; + leftRect.x /= dpr; + leftRect.y /= dpr; + leftRect.width /= dpr; + leftRect.height /= dpr; + + var rightRect = Util.clone(leftRect); + rightRect.x = (window.innerWidth - leftRect.x) - leftRect.width; + + this.hmd.setRenderRect(leftRect, rightRect); + } +}; + +PhotosphereRenderer.prototype.onModeChange_ = function(newMode, oldMode) { + console.log('onModeChange_', newMode); + + var coefficients; + if (newMode == WebVRManager.Modes.VR) { + // Entering VR mode. + this.distorter.setEnabled(true); + this.updateMaterial_(); + } else if (oldMode == WebVRManager.Modes.VR) { + // Leaving VR mode. + this.distorter.setEnabled(false); + this.updateMaterial_(); + } + + if (window.analytics) { + analytics.logModeChanged(newMode); + } +}; + +PhotosphereRenderer.prototype.onViewerChange_ = function(newViewer) { + console.log('onViewerChange_', newViewer); + + // Reset the photosphere with new coefficients. + this.updateMaterial_(); + this.updateRenderRect_(); +}; + +PhotosphereRenderer.prototype.onResize_ = function() { + this.updateRenderRect_(); +}; + +module.exports = PhotosphereRenderer; + +},{"../node_modules/three/examples/js/controls/VRControls":3,"../node_modules/three/examples/js/effects/VREffect":4,"../node_modules/three/three":5,"../node_modules/webvr-boilerplate/build/webvr-manager":6,"./emitter":10,"./eyes":11,"./util":17,"./vertex-distorter":18}],15:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Contains all information about a given scene, including the photosphere asset, + * background music. + */ +function SceneInfo(opt_params) { + var params = opt_params || {}; + this.id = params.id; + this.title = params.title; + this.image = params.image; + this.preview = params.preview; + this.isStereo = !!params.isStereo; + this.audio = params.audio; + this.video = params.video; + this.yaw = params.yaw || 0; + this.isYawOnly = params.isYawOnly; +} + +SceneInfo.prototype.isComplete = function() { + return !!this.image || !!this.video; +}; + +SceneInfo.prototype.toObject = function() { + return { + id: this.id || null, + title: this.title || null, + image: this.image, + preview: this.preview, + isStereo: this.isStereo, + audio: this.audio, + yaw: this.yaw || null, + video: this.video || null, + }; +}; + +SceneInfo.prototype.isImageDataURI = function() { + return this.image.indexOf('data:') == 0; +}; + + +module.exports = SceneInfo; + +},{}],16:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var Emitter = _dereq_('./emitter'); +var SceneInfo = _dereq_('./scene-info'); + +var Query = { + JSON_URL: 'url', + VIDEO_URL: 'video', + OBJECT_URL: 'object', + IMAGE_URL: 'image', + PREVIEW_URL: 'preview', + IS_STEREO: 'is_stereo', + AUDIO_URL: 'audio', + START_YAW: 'start_yaw', + IS_YAW_ONLY: 'is_yaw_only', +}; + +function SceneLoader() { +} +SceneLoader.prototype = new Emitter(); + +/** + * Loads a scene from a JSON file. + */ +SceneLoader.prototype.loadFromJson_ = function(url, callback) { + // XHR to fetch the JSON. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url); + var that = this; + xhr.onload = function(e) { + try { + var jsonObj = JSON.parse(this.response); + } catch (e) { + that.emit('error', 'Invalid JSON at ' + url + '.'); + return; + } + var labelObjects = {}; + var labels = jsonObj.labels || []; + // Go through the labels in the data and objectify them. + for (var i = 0; i < labels.length; i++) { + var label = new Label(labels[i]); + labelObjects[label.id] = label; + } + jsonObj.labels = labelObjects; + var scene = new SceneInfo(jsonObj); + that.emit('load', scene); + }; + xhr.send(); +}; + +/** + * Parse out GET parameters from the URL string and load the scene. + */ +SceneLoader.prototype.loadFromGetParams_ = function() { + var params = { + image: Util.getQueryParameter(Query.IMAGE_URL), + video: Util.getQueryParameter(Query.VIDEO_URL), + object: Util.getQueryParameter(Query.OBJECT_URL), + preview: Util.getQueryParameter(Query.PREVIEW_URL), + isStereo: this.parseBoolean_(Util.getQueryParameter(Query.IS_STEREO)), + audio: Util.getQueryParameter(Query.AUDIO_URL), + isYawOnly: this.parseBoolean_(Util.getQueryParameter(Query.IS_YAW_ONLY)), + yaw: THREE.Math.degToRad(Util.getQueryParameter(Query.START_YAW)), + }; + + var count = 0; + count += (params[Query.IMAGE_URL] ? 1 : 0); + count += (params[Query.VIDEO_URL] ? 1 : 0); + count += (params[Query.OBJECT_URL] ? 1 : 0); + // Validate this. + if (count == 0) { + this.emit('error', 'Either "image", "video", or "object" GET parameter is required.'); + return; + } + + var scene = new SceneInfo(params); + this.emit('load', scene); +}; + +SceneLoader.prototype.parseBoolean_ = function(value) { + if (value == 'false') { + return false; + } + return !!value; +}; + +SceneLoader.prototype.loadScene = function(callback) { + // If there's a url param specified, try loading from JSON. + var url = Util.getQueryParameter('url'); + var image = Util.getQueryParameter('image'); + var video = Util.getQueryParameter('video'); + var object = Util.getQueryParameter('object'); + if (url) { + this.loadFromJson_(url); + } else if (image || video || object) { + // Otherwise, try loading from URL parameters. + this.loadFromGetParams_(); + } else { + // If it fails, throw an exception. + this.emit('error', 'Unable to load scene. Required parameter missing.'); + } +}; + +module.exports = SceneLoader; + +},{"./emitter":10,"./scene-info":15}],17:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Util = window.Util || {}; + +Util.isDataURI = function(src) { + return src && src.indexOf('data:') == 0; +}; + +Util.generateUUID = function() { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000) + .toString(16) + .substring(1); + } + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + + s4() + '-' + s4() + s4() + s4(); +}; + +Util.isMobile = function() { + var check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); + return check; +}; + +Util.isIOS = function() { + return /(iPad|iPhone|iPod)/g.test(navigator.userAgent); +}; + +Util.cloneObject = function(obj) { + var out = {}; + for (key in obj) { + out[key] = obj[key]; + } + return out; +}; + +Util.hashCode = function(s) { + return s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0); +}; + +Util.loadTrackSrc = function(context, src, callback, opt_progressCallback) { + var request = new XMLHttpRequest(); + request.open('GET', src, true); + request.responseType = 'arraybuffer'; + + // Decode asynchronously. + request.onload = function() { + context.decodeAudioData(request.response, function(buffer) { + callback(buffer); + }, function(e) { + console.error(e); + }); + }; + if (opt_progressCallback) { + request.onprogress = function(e) { + var percent = e.loaded / e.total; + opt_progressCallback(percent); + }; + } + request.send(); +}; + +Util.isPow2 = function(n) { + return (n & (n - 1)) == 0; +}; + +Util.capitalize = function(s) { + return s.charAt(0).toUpperCase() + s.slice(1); +}; + +Util.isIFrame = function() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } +}; + +// From http://goo.gl/4WX3tg +Util.getQueryParameter = function(name) { + name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), + results = regex.exec(location.search); + return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); +}; + + +// From http://stackoverflow.com/questions/11871077/proper-way-to-detect-webgl-support. +Util.isWebGLEnabled = function() { + var canvas = document.createElement('canvas'); + try { gl = canvas.getContext("webgl"); } + catch (x) { gl = null; } + + if (gl == null) { + try { gl = canvas.getContext("experimental-webgl"); experimental = true; } + catch (x) { gl = null; } + } + return !!gl; +}; + +Util.clone = function(obj) { + return JSON.parse(JSON.stringify(obj)); +}; + +// From http://stackoverflow.com/questions/10140604/fastest-hypotenuse-in-javascript +Util.hypot = Math.hypot || function(x, y) { + return Math.sqrt(x*x + y*y); +}; + +// From http://stackoverflow.com/a/17447718/693934 +Util.isIE11 = function() { + return navigator.userAgent.match(/Trident/); +}; + +module.exports = Util; + +},{}],18:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +THREE = _dereq_('../node_modules/three/three'); +var Eyes = _dereq_('./eyes'); +var Util = _dereq_('./util'); + +var DEFAULT_FOV = 40; +var NO_DISTORTION = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +/** + * Responsible for distortion correction by pre-distorting the vertex geometry + * so that a second shader pass is not needed. This is intended to greatly + * optimize the rendering process. + */ +function VertexDistorter(deviceInfo) { + this.texture = null; + this.isEnabled = false; + + this.deviceInfo = deviceInfo; +} + +VertexDistorter.prototype.setEnabled = function(isEnabled) { + this.isEnabled = isEnabled; +} + +/** + * Sets the texture that is used to render this photosphere. + */ +VertexDistorter.prototype.setMap = function(texture) { + this.texture = texture; +}; + +VertexDistorter.prototype.getVertexShader_ = function() { + return [ + '#ifdef GL_ES', + 'precision highp float;', + '#endif', + + 'varying vec2 vUV;', + + this.getDistortionInclude_(), + + 'void main() {', + // Pass through texture coordinates to the fragment shader. + 'vUV = uv;', + + // Here, we want to ensure that we are using an undistorted projection + // matrix. By setting isUndistorted: true in the WebVRManager, we + // guarantee this. + 'vec4 pos = projectionMatrix * modelViewMatrix * vec4(position, 1.0);', + + 'gl_Position = Distort(pos);', + '}' + ].join('\n'); +}; + +VertexDistorter.prototype.getNoopVertexShader_ = function() { + return [ + '#ifdef GL_ES', + 'precision highp float;', + '#endif', + + 'varying vec2 vUV;', + + 'void main() {', + 'gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);', + 'vUV = uv;', + '}' + ].join('\n'); +}; + +VertexDistorter.prototype.getFragmentShader_ = function() { + return [ + '#ifdef GL_ES', + 'precision highp float;', + '#endif', + + 'varying vec2 vUV;', + 'uniform sampler2D texture;', + + 'void main() {', + 'gl_FragColor = texture2D(texture, vUV);', + '}' + ].join('\n'); +}; + +VertexDistorter.prototype.getNoopDistortionInclude_ = function() { + return [ + 'vec4 Distort(vec4 point) {', + 'return point;', + '}' + ].join('\n'); +}; + +VertexDistorter.prototype.getDistortionInclude_ = function() { + return [ + 'uniform float uDistortionCoefficients[12];', + 'uniform float uDistortionMaxFovSquared;', + 'uniform vec2 uDistortionFovOffset;', + 'uniform vec2 uDistortionFovScale;', + + // Returns a scalar to distort a point; computed in reverse via the polynomial approximation: + // r' = 1 + Σ_i (uDistortionCoefficients[i] rSquared^(i+1)) i=[0..11] + // where rSquared is the squared radius of an undistorted point in tan-angle space. + // See {@link Distortion} for more information. + 'float DistortionFactor(float rSquared) {', + 'float ret = 0.0;', + 'rSquared = min(uDistortionMaxFovSquared, rSquared);', + 'ret = rSquared * (ret + uDistortionCoefficients[11]);', + 'ret = rSquared * (ret + uDistortionCoefficients[10]);', + 'ret = rSquared * (ret + uDistortionCoefficients[9]);', + 'ret = rSquared * (ret + uDistortionCoefficients[8]);', + 'ret = rSquared * (ret + uDistortionCoefficients[7]);', + 'ret = rSquared * (ret + uDistortionCoefficients[6]);', + 'ret = rSquared * (ret + uDistortionCoefficients[5]);', + 'ret = rSquared * (ret + uDistortionCoefficients[4]);', + 'ret = rSquared * (ret + uDistortionCoefficients[3]);', + 'ret = rSquared * (ret + uDistortionCoefficients[2]);', + 'ret = rSquared * (ret + uDistortionCoefficients[1]);', + 'ret = rSquared * (ret + uDistortionCoefficients[0]);', + 'return ret + 1.0;', + '}', + + // Given a point in clip space, distort the point according to the coefficients stored in + // uDistortionCoefficients and the field of view (FOV) specified in uDistortionFovOffset and + // uDistortionFovScale. + // Returns the distorted point in clip space, with its Z untouched. + 'vec4 Distort(vec4 point) {', + // Put point into normalized device coordinates (NDC), [(-1, -1, -1) to (1, 1, 1)]. + 'vec3 pointNdc = point.xyz / point.w;', + // Throw away the Z coordinate and map the point to the unit square, [(0, 0) to (1, 1)]. + 'vec2 pointUnitSquare = (pointNdc.xy + vec2(1.0)) / 2.0;', + // Map the point into FOV tan-angle space. + 'vec2 pointTanAngle = pointUnitSquare * uDistortionFovScale - uDistortionFovOffset;', + 'float radiusSquared = dot(pointTanAngle, pointTanAngle);', + 'float distortionFactor = DistortionFactor(radiusSquared);', + //'float distortionFactor = 2.0;', + 'vec2 distortedPointTanAngle = pointTanAngle * distortionFactor;', + // Reverse the mappings above to bring the distorted point back into NDC space. + 'vec2 distortedPointUnitSquare = (distortedPointTanAngle + uDistortionFovOffset)', + '/ uDistortionFovScale;', + 'vec3 distortedPointNdc = vec3(distortedPointUnitSquare * 2.0 - vec2(1.0), pointNdc.z);', + // Convert the point into clip space before returning in case any operations are done after. + 'return vec4(distortedPointNdc, 1.0) * point.w;', + '}', + ].join('\n'); +}; + +VertexDistorter.prototype.getDistortionMaxFovSquared_ = function() { + var fov = this.getFov_(); + var maxFov = Util.hypot( + Math.tan(THREE.Math.degToRad(Math.max(fov.leftDegrees, fov.rightDegrees))), + Math.tan(THREE.Math.degToRad(Math.max(fov.downDegrees, fov.upDegrees)))); + return maxFov * maxFov; +}; + +VertexDistorter.prototype.getDistortionCoefficients_ = function() { + var viewer = this.deviceInfo.viewer; + return this.isEnabled ? viewer.inverseCoefficients : NO_DISTORTION; +}; + +VertexDistorter.prototype.getDistortionFovOffset_ = function(eye) { + var fov = this.getFov_(eye); + /* + var sideDegrees = Math.min(fov.leftDegrees, fov.rightDegrees); + var left = Math.tan(THREE.Math.degToRad(sideDegrees)); + */ + var left = Math.tan(THREE.Math.degToRad(fov.leftDegrees)); + var down = Math.tan(THREE.Math.degToRad(fov.downDegrees)); + return new THREE.Vector2(left, down); +}; + +VertexDistorter.prototype.getDistortionFovScale_ = function() { + var fov = this.getFov_(); + var left = Math.tan(THREE.Math.degToRad(fov.leftDegrees)); + var right = Math.tan(THREE.Math.degToRad(fov.rightDegrees)); + var up = Math.tan(THREE.Math.degToRad(fov.upDegrees)); + var down = Math.tan(THREE.Math.degToRad(fov.downDegrees)); + return new THREE.Vector2(left + right, up + down); +}; + + +VertexDistorter.prototype.getUniforms_ = function(eye) { + return { + texture: { + type: 't', + value: this.texture + }, + uDistortionCoefficients: { + type: 'fv1', + value: this.getDistortionCoefficients_() + }, + uDistortionMaxFovSquared: { + type: 'f', + value: this.getDistortionMaxFovSquared_() + }, + uDistortionFovOffset: { + type: 'v2', + value: this.getDistortionFovOffset_(eye) + }, + uDistortionFovScale: { + type: 'v2', + value: this.getDistortionFovScale_() + } + }; +}; + +VertexDistorter.prototype.getShaderMaterial = function(eye) { + var uniforms = this.getUniforms_(eye); + return new THREE.ShaderMaterial({ + uniforms: uniforms, + vertexShader: this.getVertexShader_(), + fragmentShader: this.getFragmentShader_() + }); +}; + +VertexDistorter.prototype.getFov_ = function(opt_eye) { + var eye = opt_eye || Eyes.LEFT; + + if (eye == Eyes.LEFT) { + return this.deviceInfo.getFieldOfViewLeftEye(true); + } + if (eye == Eyes.RIGHT) { + return this.deviceInfo.getFieldOfViewRightEye(true); + } + return null; +}; + +module.exports = VertexDistorter; + +},{"../node_modules/three/three":5,"./eyes":11,"./util":17}],19:[function(_dereq_,module,exports){ +// Load EmbedVR. +_dereq_('./main'); + +// Load Analytics for EmbedVR. +_dereq_('./analytics'); + +},{"./analytics":8,"./main":13}],20:[function(_dereq_,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}]},{},[19]); diff --git a/build/vrview-analytics.min.js b/build/vrview-analytics.min.js new file mode 100644 index 00000000..fab26f84 --- /dev/null +++ b/build/vrview-analytics.min.js @@ -0,0 +1,22 @@ +!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;ot;t+=2){var e=X[t],n=X[t+1];e(n),X[t]=void 0,X[t+1]=void 0}G=0}function f(){try{var t=_dereq_,e=t("vertx");return U=e.runOnLoop||e.runOnContext,i()}catch(n){return c()}}function l(t,e){var n=this,r=n._state;if(r===et&&!t||r===nt&&!e)return this;var o=new this.constructor(p),i=n._result;if(r){var s=arguments[r-1];H(function(){C(r,o,s,i)})}else j(n,o,t,e);return o}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(p);return g(n,t),n}function p(){}function _(){return new TypeError("You cannot resolve a promise with itself")}function v(){return new TypeError("A promises callback cannot return that same promise.")}function d(t){try{return t.then}catch(e){return rt.error=e,rt}}function y(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function m(t,e,n){H(function(t){var r=!1,o=y(n,e,function(n){r||(r=!0,e!==n?g(t,n):E(t,n))},function(e){r||(r=!0,S(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,S(t,o))},t)}function w(t,e){e._state===et?E(t,e._result):e._state===nt?S(t,e._result):j(e,void 0,function(e){g(t,e)},function(e){S(t,e)})}function b(t,n,r){n.constructor===t.constructor&&r===Z&&constructor.resolve===$?w(t,n):r===rt?S(t,rt.error):void 0===r?E(t,n):e(r)?m(t,n,r):E(t,n)}function g(e,n){e===n?S(e,_()):t(n)?b(e,n,d(n)):E(e,n)}function A(t){t._onerror&&t._onerror(t._result),T(t)}function E(t,e){t._state===tt&&(t._result=e,t._state=et,0!==t._subscribers.length&&H(T,t))}function S(t,e){t._state===tt&&(t._state=nt,t._result=e,H(A,t))}function j(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+et]=n,o[i+nt]=r,0===i&&t._state&&H(T,t)}function T(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r,o,i=t._result,s=0;ss;s++)j(r.resolve(t[s]),void 0,e,n);return o}function Y(t){var e=this,n=new e(p);return S(n,t),n}function q(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function F(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function D(t){this._id=ct++,this._state=void 0,this._result=void 0,this._subscribers=[],p!==t&&("function"!=typeof t&&q(),this instanceof D?M(this,t):F())}function K(t,e){this._instanceConstructor=t,this.promise=new t(p),Array.isArray(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?E(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&E(this.promise,this._result))):S(this.promise,this._validationError())}function L(){var t;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;(!n||"[object Promise]"!==Object.prototype.toString.call(n.resolve())||n.cast)&&(t.Promise=at)}var N;N=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var U,W,z,B=N,G=0,H=function(t,e){X[G]=t,X[G+1]=e,G+=2,2===G&&(W?W(a):z())},I="undefined"!=typeof window?window:void 0,J=I||{},Q=J.MutationObserver||J.WebKitMutationObserver,R="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),V="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,X=new Array(1e3);z=R?o():Q?s():V?u():void 0===I&&"function"==typeof _dereq_?f():c();var Z=l,$=h,tt=void 0,et=1,nt=2,rt=new P,ot=new P,it=O,st=k,ut=Y,ct=0,at=D;D.all=it,D.race=st,D.resolve=$,D.reject=ut,D._setScheduler=n,D._setAsap=r,D._asap=H,D.prototype={constructor:D,then:Z,"catch":function(t){return this.then(null,t)}};var ft=K;K.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},K.prototype._enumerate=function(){for(var t=this.length,e=this._input,n=0;this._state===tt&&t>n;n++)this._eachEntry(e[n],n)},K.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===$){var o=d(t);if(o===Z&&t._state!==tt)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===at){var i=new n(p);b(i,t,o),this._willSettleAt(i,e)}else this._willSettleAt(new n(function(e){e(t)}),e)}else this._willSettleAt(r(t),e)},K.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===tt&&(this._remaining--,t===nt?S(r,n):this._result[e]=n),0===this._remaining&&E(r,this._result)},K.prototype._willSettleAt=function(t,e){var n=this;j(t,void 0,function(t){n._settledAt(et,e,t)},function(t){n._settledAt(nt,e,t)})};var lt=L,ht={Promise:at,polyfill:lt};"function"==typeof define&&define.amd?define(function(){return ht}):"undefined"!=typeof module&&module.exports?module.exports=ht:"undefined"!=typeof this&&(this.ES6Promise=ht),lt()}).call(this)}).call(this,_dereq_("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:20}],2:[function(_dereq_,module,exports){var Stats=function(){var l=Date.now(),m=l,g=0,n=1/0,o=0,h=0,p=1/0,q=0,r=0,s=0,f=document.createElement("div");f.id="stats",f.addEventListener("mousedown",function(b){b.preventDefault(),t(++s%2)},!1),f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps",a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002",f.appendChild(a);var i=document.createElement("div");i.id="fpsText",i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px",i.innerHTML="FPS",a.appendChild(i);var c=document.createElement("div");for(c.id="fpsGraph",c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff",a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113",c.appendChild(j)}var d=document.createElement("div");d.id="ms",d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none",f.appendChild(d);var k=document.createElement("div");k.id="msText",k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px",k.innerHTML="MS",d.appendChild(k);var e=document.createElement("div");for(e.id="msGraph",e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0",d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){switch(s=b){case 0:a.style.display="block",d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l,n=Math.min(n,g),o=Math.max(o,g),k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));return e.appendChild(e.firstChild).style.height=a+"px",r++,b>m+1e3&&(h=Math.round(1e3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=a+"px",m=b,r=0),b},update:function(){l=this.end()}}};"object"==typeof module&&(module.exports=Stats)},{}],3:[function(_dereq_,module,exports){var VRControls=function(object,onError){function filterInvalidDevices(devices){var oculusDevices=devices.filter(function(device){return-1!==device.deviceName.toLowerCase().indexOf("oculus")});return oculusDevices.length>=1?devices.filter(function(device){return-1===device.deviceName.toLowerCase().indexOf("cardboard")}):devices}function gotVRDevices(devices){devices=filterInvalidDevices(devices);for(var i=0;ix?-1:x>0?1:+x}),void 0===Function.prototype.name&&void 0!==Object.defineProperty&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1]}}),THREE.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2},THREE.CullFaceNone=0,THREE.CullFaceBack=1,THREE.CullFaceFront=2,THREE.CullFaceFrontBack=3,THREE.FrontFaceDirectionCW=0,THREE.FrontFaceDirectionCCW=1,THREE.BasicShadowMap=0,THREE.PCFShadowMap=1,THREE.PCFSoftShadowMap=2,THREE.FrontSide=0,THREE.BackSide=1,THREE.DoubleSide=2,THREE.FlatShading=1,THREE.SmoothShading=2,THREE.NoColors=0,THREE.FaceColors=1,THREE.VertexColors=2,THREE.NoBlending=0,THREE.NormalBlending=1,THREE.AdditiveBlending=2,THREE.SubtractiveBlending=3,THREE.MultiplyBlending=4,THREE.CustomBlending=5,THREE.AddEquation=100,THREE.SubtractEquation=101,THREE.ReverseSubtractEquation=102,THREE.MinEquation=103,THREE.MaxEquation=104,THREE.ZeroFactor=200,THREE.OneFactor=201,THREE.SrcColorFactor=202,THREE.OneMinusSrcColorFactor=203,THREE.SrcAlphaFactor=204,THREE.OneMinusSrcAlphaFactor=205,THREE.DstAlphaFactor=206,THREE.OneMinusDstAlphaFactor=207,THREE.DstColorFactor=208,THREE.OneMinusDstColorFactor=209,THREE.SrcAlphaSaturateFactor=210,THREE.NeverDepth=0,THREE.AlwaysDepth=1,THREE.LessDepth=2,THREE.LessEqualDepth=3,THREE.EqualDepth=4,THREE.GreaterEqualDepth=5,THREE.GreaterDepth=6,THREE.NotEqualDepth=7,THREE.MultiplyOperation=0,THREE.MixOperation=1,THREE.AddOperation=2,THREE.UVMapping=300,THREE.CubeReflectionMapping=301,THREE.CubeRefractionMapping=302,THREE.EquirectangularReflectionMapping=303,THREE.EquirectangularRefractionMapping=304,THREE.SphericalReflectionMapping=305,THREE.RepeatWrapping=1e3,THREE.ClampToEdgeWrapping=1001,THREE.MirroredRepeatWrapping=1002,THREE.NearestFilter=1003,THREE.NearestMipMapNearestFilter=1004,THREE.NearestMipMapLinearFilter=1005,THREE.LinearFilter=1006,THREE.LinearMipMapNearestFilter=1007,THREE.LinearMipMapLinearFilter=1008,THREE.UnsignedByteType=1009,THREE.ByteType=1010,THREE.ShortType=1011,THREE.UnsignedShortType=1012,THREE.IntType=1013,THREE.UnsignedIntType=1014,THREE.FloatType=1015,THREE.HalfFloatType=1025,THREE.UnsignedShort4444Type=1016,THREE.UnsignedShort5551Type=1017,THREE.UnsignedShort565Type=1018,THREE.AlphaFormat=1019,THREE.RGBFormat=1020,THREE.RGBAFormat=1021,THREE.LuminanceFormat=1022,THREE.LuminanceAlphaFormat=1023,THREE.RGBEFormat=THREE.RGBAFormat,THREE.RGB_S3TC_DXT1_Format=2001,THREE.RGBA_S3TC_DXT1_Format=2002,THREE.RGBA_S3TC_DXT3_Format=2003,THREE.RGBA_S3TC_DXT5_Format=2004,THREE.RGB_PVRTC_4BPPV1_Format=2100,THREE.RGB_PVRTC_2BPPV1_Format=2101,THREE.RGBA_PVRTC_4BPPV1_Format=2102,THREE.RGBA_PVRTC_2BPPV1_Format=2103,THREE.LoopOnce=2200,THREE.LoopRepeat=2201,THREE.LoopPingPong=2202,THREE.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js."),this.projectVector=function(vector,camera){console.warn("THREE.Projector: .projectVector() is now vector.project()."),vector.project(camera)},this.unprojectVector=function(vector,camera){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."),vector.unproject(camera)},this.pickingRay=function(vector,camera){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}},THREE.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"),this.domElement=document.createElement("canvas"),this.clear=function(){},this.render=function(){},this.setClearColor=function(){},this.setSize=function(){}},THREE.Color=function(color){return 3===arguments.length?this.fromArray(arguments):this.set(color)},THREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,set:function(value){return value instanceof THREE.Color?this.copy(value):"number"==typeof value?this.setHex(value):"string"==typeof value&&this.setStyle(value),this},setHex:function(hex){return hex=Math.floor(hex),this.r=(hex>>16&255)/255,this.g=(hex>>8&255)/255,this.b=(255&hex)/255,this},setRGB:function(r,g,b){return this.r=r,this.g=g,this.b=b,this},setHSL:function(){function hue2rgb(p,q,t){return 0>t&&(t+=1),t>1&&(t-=1),1/6>t?p+6*(q-p)*t:.5>t?q:2/3>t?p+6*(q-p)*(2/3-t):p}return function(h,s,l){if(h=THREE.Math.euclideanModulo(h,1),s=THREE.Math.clamp(s,0,1),l=THREE.Math.clamp(l,0,1),0===s)this.r=this.g=this.b=l;else{var p=.5>=l?l*(1+s):l+s-l*s,q=2*l-p;this.r=hue2rgb(q,p,h+1/3),this.g=hue2rgb(q,p,h),this.b=hue2rgb(q,p,h-1/3)}return this}}(),setStyle:function(style){function handleAlpha(string){void 0!==string&&parseFloat(string)<1&&console.warn("THREE.Color: Alpha component of "+style+" will be ignored.")}var m;if(m=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style)){var color,name=m[1],components=m[2];switch(name){case"rgb":case"rgba":if(color=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components))return this.r=Math.min(255,parseInt(color[1],10))/255,this.g=Math.min(255,parseInt(color[2],10))/255,this.b=Math.min(255,parseInt(color[3],10))/255,handleAlpha(color[5]),this;if(color=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components))return this.r=Math.min(100,parseInt(color[1],10))/100,this.g=Math.min(100,parseInt(color[2],10))/100,this.b=Math.min(100,parseInt(color[3],10))/100,handleAlpha(color[5]),this;break;case"hsl":case"hsla":if(color=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){var h=parseFloat(color[1])/360,s=parseInt(color[2],10)/100,l=parseInt(color[3],10)/100;return handleAlpha(color[5]),this.setHSL(h,s,l)}}}else if(m=/^\#([A-Fa-f0-9]+)$/.exec(style)){var hex=m[1],size=hex.length;if(3===size)return this.r=parseInt(hex.charAt(0)+hex.charAt(0),16)/255,this.g=parseInt(hex.charAt(1)+hex.charAt(1),16)/255,this.b=parseInt(hex.charAt(2)+hex.charAt(2),16)/255,this;if(6===size)return this.r=parseInt(hex.charAt(0)+hex.charAt(1),16)/255,this.g=parseInt(hex.charAt(2)+hex.charAt(3),16)/255,this.b=parseInt(hex.charAt(4)+hex.charAt(5),16)/255,this}if(style&&style.length>0){var hex=THREE.ColorKeywords[style];void 0!==hex?this.setHex(hex):console.warn("THREE.Color: Unknown color "+style)}return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(color){return this.r=color.r,this.g=color.g,this.b=color.b,this},copyGammaToLinear:function(color,gammaFactor){return void 0===gammaFactor&&(gammaFactor=2),this.r=Math.pow(color.r,gammaFactor),this.g=Math.pow(color.g,gammaFactor),this.b=Math.pow(color.b,gammaFactor),this},copyLinearToGamma:function(color,gammaFactor){void 0===gammaFactor&&(gammaFactor=2);var safeInverse=gammaFactor>0?1/gammaFactor:1;return this.r=Math.pow(color.r,safeInverse),this.g=Math.pow(color.g,safeInverse),this.b=Math.pow(color.b,safeInverse),this},convertGammaToLinear:function(){var r=this.r,g=this.g,b=this.b;return this.r=r*r,this.g=g*g,this.b=b*b,this},convertLinearToGamma:function(){return this.r=Math.sqrt(this.r),this.g=Math.sqrt(this.g),this.b=Math.sqrt(this.b),this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(optionalTarget){var hue,saturation,hsl=optionalTarget||{h:0,s:0,l:0},r=this.r,g=this.g,b=this.b,max=Math.max(r,g,b),min=Math.min(r,g,b),lightness=(min+max)/2;if(min===max)hue=0,saturation=0;else{var delta=max-min;switch(saturation=.5>=lightness?delta/(max+min):delta/(2-max-min),max){case r:hue=(g-b)/delta+(b>g?6:0);break;case g:hue=(b-r)/delta+2;break;case b:hue=(r-g)/delta+4}hue/=6}return hsl.h=hue,hsl.s=saturation,hsl.l=lightness,hsl},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(h,s,l){var hsl=this.getHSL();return hsl.h+=h,hsl.s+=s,hsl.l+=l,this.setHSL(hsl.h,hsl.s,hsl.l),this},add:function(color){return this.r+=color.r,this.g+=color.g,this.b+=color.b,this},addColors:function(color1,color2){return this.r=color1.r+color2.r,this.g=color1.g+color2.g,this.b=color1.b+color2.b,this},addScalar:function(s){return this.r+=s,this.g+=s,this.b+=s,this},multiply:function(color){return this.r*=color.r,this.g*=color.g,this.b*=color.b,this},multiplyScalar:function(s){return this.r*=s,this.g*=s,this.b*=s,this},lerp:function(color,alpha){return this.r+=(color.r-this.r)*alpha,this.g+=(color.g-this.g)*alpha,this.b+=(color.b-this.b)*alpha,this},equals:function(c){return c.r===this.r&&c.g===this.g&&c.b===this.b},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.r=array[offset],this.g=array[offset+1],this.b=array[offset+2],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.r,array[offset+1]=this.g,array[offset+2]=this.b,array}},THREE.ColorKeywords={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},THREE.Quaternion=function(x,y,z,w){this._x=x||0,this._y=y||0,this._z=z||0,this._w=void 0!==w?w:1},THREE.Quaternion.prototype={constructor:THREE.Quaternion,get x(){return this._x},set x(value){this._x=value,this.onChangeCallback()},get y(){return this._y},set y(value){this._y=value,this.onChangeCallback()},get z(){return this._z},set z(value){this._z=value,this.onChangeCallback()},get w(){return this._w},set w(value){this._w=value,this.onChangeCallback()},set:function(x,y,z,w){return this._x=x,this._y=y,this._z=z,this._w=w,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(quaternion){return this._x=quaternion.x,this._y=quaternion.y,this._z=quaternion.z,this._w=quaternion.w,this.onChangeCallback(),this},setFromEuler:function(euler,update){if(euler instanceof THREE.Euler==!1)throw new Error("THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var c1=Math.cos(euler._x/2),c2=Math.cos(euler._y/2),c3=Math.cos(euler._z/2),s1=Math.sin(euler._x/2),s2=Math.sin(euler._y/2),s3=Math.sin(euler._z/2),order=euler.order;return"XYZ"===order?(this._x=s1*c2*c3+c1*s2*s3,this._y=c1*s2*c3-s1*c2*s3,this._z=c1*c2*s3+s1*s2*c3,this._w=c1*c2*c3-s1*s2*s3):"YXZ"===order?(this._x=s1*c2*c3+c1*s2*s3,this._y=c1*s2*c3-s1*c2*s3,this._z=c1*c2*s3-s1*s2*c3,this._w=c1*c2*c3+s1*s2*s3):"ZXY"===order?(this._x=s1*c2*c3-c1*s2*s3,this._y=c1*s2*c3+s1*c2*s3,this._z=c1*c2*s3+s1*s2*c3,this._w=c1*c2*c3-s1*s2*s3):"ZYX"===order?(this._x=s1*c2*c3-c1*s2*s3,this._y=c1*s2*c3+s1*c2*s3,this._z=c1*c2*s3-s1*s2*c3,this._w=c1*c2*c3+s1*s2*s3):"YZX"===order?(this._x=s1*c2*c3+c1*s2*s3,this._y=c1*s2*c3+s1*c2*s3,this._z=c1*c2*s3-s1*s2*c3,this._w=c1*c2*c3-s1*s2*s3):"XZY"===order&&(this._x=s1*c2*c3-c1*s2*s3,this._y=c1*s2*c3-s1*c2*s3,this._z=c1*c2*s3+s1*s2*c3,this._w=c1*c2*c3+s1*s2*s3),update!==!1&&this.onChangeCallback(),this},setFromAxisAngle:function(axis,angle){var halfAngle=angle/2,s=Math.sin(halfAngle);return this._x=axis.x*s,this._y=axis.y*s,this._z=axis.z*s,this._w=Math.cos(halfAngle),this.onChangeCallback(),this},setFromRotationMatrix:function(m){var s,te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10],trace=m11+m22+m33;return trace>0?(s=.5/Math.sqrt(trace+1),this._w=.25/s,this._x=(m32-m23)*s,this._y=(m13-m31)*s,this._z=(m21-m12)*s):m11>m22&&m11>m33?(s=2*Math.sqrt(1+m11-m22-m33),this._w=(m32-m23)/s,this._x=.25*s,this._y=(m12+m21)/s,this._z=(m13+m31)/s):m22>m33?(s=2*Math.sqrt(1+m22-m11-m33),this._w=(m13-m31)/s,this._x=(m12+m21)/s,this._y=.25*s,this._z=(m23+m32)/s):(s=2*Math.sqrt(1+m33-m11-m22),this._w=(m21-m12)/s,this._x=(m13+m31)/s,this._y=(m23+m32)/s,this._z=.25*s),this.onChangeCallback(),this},setFromUnitVectors:function(){var v1,r,EPS=1e-6;return function(vFrom,vTo){return void 0===v1&&(v1=new THREE.Vector3),r=vFrom.dot(vTo)+1,EPS>r?(r=0,Math.abs(vFrom.x)>Math.abs(vFrom.z)?v1.set(-vFrom.y,vFrom.x,0):v1.set(0,-vFrom.z,vFrom.y)):v1.crossVectors(vFrom,vTo),this._x=v1.x,this._y=v1.y,this._z=v1.z,this._w=r,this.normalize(),this}}(),inverse:function(){return this.conjugate().normalize(),this},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this.onChangeCallback(),this},dot:function(v){return this._x*v._x+this._y*v._y+this._z*v._z+this._w*v._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var l=this.length();return 0===l?(this._x=0,this._y=0,this._z=0,this._w=1):(l=1/l,this._x=this._x*l,this._y=this._y*l,this._z=this._z*l,this._w=this._w*l),this.onChangeCallback(),this},multiply:function(q,p){return void 0!==p?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(q,p)):this.multiplyQuaternions(this,q)},multiplyQuaternions:function(a,b){var qax=a._x,qay=a._y,qaz=a._z,qaw=a._w,qbx=b._x,qby=b._y,qbz=b._z,qbw=b._w;return this._x=qax*qbw+qaw*qbx+qay*qbz-qaz*qby,this._y=qay*qbw+qaw*qby+qaz*qbx-qax*qbz,this._z=qaz*qbw+qaw*qbz+qax*qby-qay*qbx,this._w=qaw*qbw-qax*qbx-qay*qby-qaz*qbz,this.onChangeCallback(),this},multiplyVector3:function(vector){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),vector.applyQuaternion(this)},slerp:function(qb,t){if(0===t)return this;if(1===t)return this.copy(qb);var x=this._x,y=this._y,z=this._z,w=this._w,cosHalfTheta=w*qb._w+x*qb._x+y*qb._y+z*qb._z;if(0>cosHalfTheta?(this._w=-qb._w,this._x=-qb._x,this._y=-qb._y,this._z=-qb._z,cosHalfTheta=-cosHalfTheta):this.copy(qb),cosHalfTheta>=1)return this._w=w,this._x=x,this._y=y,this._z=z,this;var halfTheta=Math.acos(cosHalfTheta),sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta); +if(Math.abs(sinHalfTheta)<.001)return this._w=.5*(w+this._w),this._x=.5*(x+this._x),this._y=.5*(y+this._y),this._z=.5*(z+this._z),this;var ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta,ratioB=Math.sin(t*halfTheta)/sinHalfTheta;return this._w=w*ratioA+this._w*ratioB,this._x=x*ratioA+this._x*ratioB,this._y=y*ratioA+this._y*ratioB,this._z=z*ratioA+this._z*ratioB,this.onChangeCallback(),this},equals:function(quaternion){return quaternion._x===this._x&&quaternion._y===this._y&&quaternion._z===this._z&&quaternion._w===this._w},fromArray:function(array,offset){return void 0===offset&&(offset=0),this._x=array[offset],this._y=array[offset+1],this._z=array[offset+2],this._w=array[offset+3],this.onChangeCallback(),this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this._x,array[offset+1]=this._y,array[offset+2]=this._z,array[offset+3]=this._w,array},onChange:function(callback){return this.onChangeCallback=callback,this},onChangeCallback:function(){}},THREE.Quaternion.slerp=function(qa,qb,qm,t){return qm.copy(qa).slerp(qb,t)},THREE.Vector2=function(x,y){this.x=x||0,this.y=y||0},THREE.Vector2.prototype={constructor:THREE.Vector2,get width(){return this.x},set width(value){this.x=value},get height(){return this.y},set height(value){this.y=value},set:function(x,y){return this.x=x,this.y=y,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+index)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(v){return this.x=v.x,this.y=v.y,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this)},addScalar:function(s){return this.x+=s,this.y+=s,this},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this},addScaledVector:function(v,s){return this.x+=v.x*s,this.y+=v.y*s,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this)},subScalar:function(s){return this.x-=s,this.y-=s,this},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this},multiply:function(v){return this.x*=v.x,this.y*=v.y,this},multiplyScalar:function(scalar){return isFinite(scalar)?(this.x*=scalar,this.y*=scalar):(this.x=0,this.y=0),this},divide:function(v){return this.x/=v.x,this.y/=v.y,this},divideScalar:function(scalar){return this.multiplyScalar(1/scalar)},min:function(v){return this.x=Math.min(this.x,v.x),this.y=Math.min(this.y,v.y),this},max:function(v){return this.x=Math.max(this.x,v.x),this.y=Math.max(this.y,v.y),this},clamp:function(min,max){return this.x=Math.max(min.x,Math.min(max.x,this.x)),this.y=Math.max(min.y,Math.min(max.y,this.y)),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector2,max=new THREE.Vector2),min.set(minVal,minVal),max.set(maxVal,maxVal),this.clamp(min,max)}}(),clampLength:function(min,max){var length=this.length();return this.multiplyScalar(Math.max(min,Math.min(max,length))/length),this},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(v){return this.x*v.x+this.y*v.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy},setLength:function(length){return this.multiplyScalar(length/this.length())},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1),this},equals:function(v){return v.x===this.x&&v.y===this.y},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this},rotateAround:function(center,angle){var c=Math.cos(angle),s=Math.sin(angle),x=this.x-center.x,y=this.y-center.y;return this.x=x*c-y*s+center.x,this.y=x*s+y*c+center.y,this}},THREE.Vector3=function(x,y,z){this.x=x||0,this.y=y||0,this.z=z||0},THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(x,y,z){return this.x=x,this.y=y,this.z=z,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setZ:function(z){return this.z=z,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+index)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(v){return this.x=v.x,this.y=v.y,this.z=v.z,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this.z+=v.z,this)},addScalar:function(s){return this.x+=s,this.y+=s,this.z+=s,this},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this.z=a.z+b.z,this},addScaledVector:function(v,s){return this.x+=v.x*s,this.y+=v.y*s,this.z+=v.z*s,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this.z-=v.z,this)},subScalar:function(s){return this.x-=s,this.y-=s,this.z-=s,this},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this.z=a.z-b.z,this},multiply:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(v,w)):(this.x*=v.x,this.y*=v.y,this.z*=v.z,this)},multiplyScalar:function(scalar){return isFinite(scalar)?(this.x*=scalar,this.y*=scalar,this.z*=scalar):(this.x=0,this.y=0,this.z=0),this},multiplyVectors:function(a,b){return this.x=a.x*b.x,this.y=a.y*b.y,this.z=a.z*b.z,this},applyEuler:function(){var quaternion;return function(euler){return euler instanceof THREE.Euler==!1&&console.error("THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order."),void 0===quaternion&&(quaternion=new THREE.Quaternion),this.applyQuaternion(quaternion.setFromEuler(euler)),this}}(),applyAxisAngle:function(){var quaternion;return function(axis,angle){return void 0===quaternion&&(quaternion=new THREE.Quaternion),this.applyQuaternion(quaternion.setFromAxisAngle(axis,angle)),this}}(),applyMatrix3:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[3]*y+e[6]*z,this.y=e[1]*x+e[4]*y+e[7]*z,this.z=e[2]*x+e[5]*y+e[8]*z,this},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z+e[12],this.y=e[1]*x+e[5]*y+e[9]*z+e[13],this.z=e[2]*x+e[6]*y+e[10]*z+e[14],this},applyProjection:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements,d=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);return this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*d,this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*d,this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*d,this},applyQuaternion:function(q){var x=this.x,y=this.y,z=this.z,qx=q.x,qy=q.y,qz=q.z,qw=q.w,ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;return this.x=ix*qw+iw*-qx+iy*-qz-iz*-qy,this.y=iy*qw+iw*-qy+iz*-qx-ix*-qz,this.z=iz*qw+iw*-qz+ix*-qy-iy*-qx,this},project:function(){var matrix;return function(camera){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.multiplyMatrices(camera.projectionMatrix,matrix.getInverse(camera.matrixWorld)),this.applyProjection(matrix)}}(),unproject:function(){var matrix;return function(camera){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.multiplyMatrices(camera.matrixWorld,matrix.getInverse(camera.projectionMatrix)),this.applyProjection(matrix)}}(),transformDirection:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z,this.y=e[1]*x+e[5]*y+e[9]*z,this.z=e[2]*x+e[6]*y+e[10]*z,this.normalize(),this},divide:function(v){return this.x/=v.x,this.y/=v.y,this.z/=v.z,this},divideScalar:function(scalar){return this.multiplyScalar(1/scalar)},min:function(v){return this.x=Math.min(this.x,v.x),this.y=Math.min(this.y,v.y),this.z=Math.min(this.z,v.z),this},max:function(v){return this.x=Math.max(this.x,v.x),this.y=Math.max(this.y,v.y),this.z=Math.max(this.z,v.z),this},clamp:function(min,max){return this.x=Math.max(min.x,Math.min(max.x,this.x)),this.y=Math.max(min.y,Math.min(max.y,this.y)),this.z=Math.max(min.z,Math.min(max.z,this.z)),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector3,max=new THREE.Vector3),min.set(minVal,minVal,minVal),max.set(maxVal,maxVal,maxVal),this.clamp(min,max)}}(),clampLength:function(min,max){var length=this.length();return this.multiplyScalar(Math.max(min,Math.min(max,length))/length),this},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(length){return this.multiplyScalar(length/this.length())},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this.z+=(v.z-this.z)*alpha,this},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1),this},cross:function(v,w){if(void 0!==w)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(v,w);var x=this.x,y=this.y,z=this.z;return this.x=y*v.z-z*v.y,this.y=z*v.x-x*v.z,this.z=x*v.y-y*v.x,this},crossVectors:function(a,b){var ax=a.x,ay=a.y,az=a.z,bx=b.x,by=b.y,bz=b.z;return this.x=ay*bz-az*by,this.y=az*bx-ax*bz,this.z=ax*by-ay*bx,this},projectOnVector:function(){var v1,dot;return function(vector){return void 0===v1&&(v1=new THREE.Vector3),v1.copy(vector).normalize(),dot=this.dot(v1),this.copy(v1).multiplyScalar(dot)}}(),projectOnPlane:function(){var v1;return function(planeNormal){return void 0===v1&&(v1=new THREE.Vector3),v1.copy(this).projectOnVector(planeNormal),this.sub(v1)}}(),reflect:function(){var v1;return function(normal){return void 0===v1&&(v1=new THREE.Vector3),this.sub(v1.copy(normal).multiplyScalar(2*this.dot(normal)))}}(),angleTo:function(v){var theta=this.dot(v)/(this.length()*v.length());return Math.acos(THREE.Math.clamp(theta,-1,1))},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz},setEulerFromRotationMatrix:function(m,order){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(q,order){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(m){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(m)},getScaleFromMatrix:function(m){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(m)},getColumnFromMatrix:function(index,matrix){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(index,matrix)},setFromMatrixPosition:function(m){return this.x=m.elements[12],this.y=m.elements[13],this.z=m.elements[14],this},setFromMatrixScale:function(m){var sx=this.set(m.elements[0],m.elements[1],m.elements[2]).length(),sy=this.set(m.elements[4],m.elements[5],m.elements[6]).length(),sz=this.set(m.elements[8],m.elements[9],m.elements[10]).length();return this.x=sx,this.y=sy,this.z=sz,this},setFromMatrixColumn:function(index,matrix){var offset=4*index,me=matrix.elements;return this.x=me[offset],this.y=me[offset+1],this.z=me[offset+2],this},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this.z=array[offset+2],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array[offset+2]=this.z,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this.z=attribute.array[index+2],this}},THREE.Vector4=function(x,y,z,w){this.x=x||0,this.y=y||0,this.z=z||0,this.w=void 0!==w?w:1},THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(x,y,z,w){return this.x=x,this.y=y,this.z=z,this.w=w,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setZ:function(z){return this.z=z,this},setW:function(w){return this.w=w,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;case 3:this.w=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+index)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(v){return this.x=v.x,this.y=v.y,this.z=v.z,this.w=void 0!==v.w?v.w:1,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this.z+=v.z,this.w+=v.w,this)},addScalar:function(s){return this.x+=s,this.y+=s,this.z+=s,this.w+=s,this},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this.z=a.z+b.z,this.w=a.w+b.w,this},addScaledVector:function(v,s){return this.x+=v.x*s,this.y+=v.y*s,this.z+=v.z*s,this.w+=v.w*s,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this.z-=v.z,this.w-=v.w,this)},subScalar:function(s){return this.x-=s,this.y-=s,this.z-=s,this.w-=s,this},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this.z=a.z-b.z,this.w=a.w-b.w,this},multiplyScalar:function(scalar){return isFinite(scalar)?(this.x*=scalar,this.y*=scalar,this.z*=scalar,this.w*=scalar):(this.x=0,this.y=0,this.z=0,this.w=0),this},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z,w=this.w,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z+e[12]*w,this.y=e[1]*x+e[5]*y+e[9]*z+e[13]*w,this.z=e[2]*x+e[6]*y+e[10]*z+e[14]*w,this.w=e[3]*x+e[7]*y+e[11]*z+e[15]*w,this},divideScalar:function(scalar){return this.multiplyScalar(1/scalar)},setAxisAngleFromQuaternion:function(q){this.w=2*Math.acos(q.w);var s=Math.sqrt(1-q.w*q.w);return 1e-4>s?(this.x=1,this.y=0,this.z=0):(this.x=q.x/s,this.y=q.y/s,this.z=q.z/s),this},setAxisAngleFromRotationMatrix:function(m){var angle,x,y,z,epsilon=.01,epsilon2=.1,te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10];if(Math.abs(m12-m21)yy&&xx>zz?epsilon>xx?(x=0,y=.707106781,z=.707106781):(x=Math.sqrt(xx),y=xy/x,z=xz/x):yy>zz?epsilon>yy?(x=.707106781,y=0,z=.707106781):(y=Math.sqrt(yy),x=xy/y,z=yz/y):epsilon>zz?(x=.707106781,y=.707106781,z=0):(z=Math.sqrt(zz),x=xz/z,y=yz/z),this.set(x,y,z,angle),this}var s=Math.sqrt((m32-m23)*(m32-m23)+(m13-m31)*(m13-m31)+(m21-m12)*(m21-m12));return Math.abs(s)<.001&&(s=1),this.x=(m32-m23)/s,this.y=(m13-m31)/s,this.z=(m21-m12)/s,this.w=Math.acos((m11+m22+m33-1)/2),this},min:function(v){return this.x=Math.min(this.x,v.x),this.y=Math.min(this.y,v.y),this.z=Math.min(this.z,v.z),this.w=Math.min(this.w,v.w),this},max:function(v){return this.x=Math.max(this.x,v.x),this.y=Math.max(this.y,v.y),this.z=Math.max(this.z,v.z),this.w=Math.max(this.w,v.w),this},clamp:function(min,max){return this.x=Math.max(min.x,Math.min(max.x,this.x)),this.y=Math.max(min.y,Math.min(max.y,this.y)),this.z=Math.max(min.z,Math.min(max.z,this.z)),this.w=Math.max(min.w,Math.min(max.w,this.w)),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector4,max=new THREE.Vector4),min.set(minVal,minVal,minVal,minVal),max.set(maxVal,maxVal,maxVal,maxVal),this.clamp(min,max)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z+this.w*v.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},setLength:function(length){return this.multiplyScalar(length/this.length())},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this.z+=(v.z-this.z)*alpha,this.w+=(v.w-this.w)*alpha,this},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1),this},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z&&v.w===this.w},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this.z=array[offset+2],this.w=array[offset+3],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array[offset+2]=this.z,array[offset+3]=this.w,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this.z=attribute.array[index+2],this.w=attribute.array[index+3],this}},THREE.Euler=function(x,y,z,order){this._x=x||0,this._y=y||0,this._z=z||0,this._order=order||THREE.Euler.DefaultOrder},THREE.Euler.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],THREE.Euler.DefaultOrder="XYZ",THREE.Euler.prototype={constructor:THREE.Euler,get x(){return this._x},set x(value){this._x=value,this.onChangeCallback()},get y(){return this._y},set y(value){this._y=value,this.onChangeCallback()},get z(){return this._z},set z(value){this._z=value,this.onChangeCallback()},get order(){return this._order},set order(value){this._order=value,this.onChangeCallback()},set:function(x,y,z,order){return this._x=x,this._y=y,this._z=z,this._order=order||this._order,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(euler){return this._x=euler._x,this._y=euler._y,this._z=euler._z,this._order=euler._order,this.onChangeCallback(),this},setFromRotationMatrix:function(m,order,update){var clamp=THREE.Math.clamp,te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10];return order=order||this._order,"XYZ"===order?(this._y=Math.asin(clamp(m13,-1,1)),Math.abs(m13)<.99999?(this._x=Math.atan2(-m23,m33),this._z=Math.atan2(-m12,m11)):(this._x=Math.atan2(m32,m22),this._z=0)):"YXZ"===order?(this._x=Math.asin(-clamp(m23,-1,1)),Math.abs(m23)<.99999?(this._y=Math.atan2(m13,m33),this._z=Math.atan2(m21,m22)):(this._y=Math.atan2(-m31,m11),this._z=0)):"ZXY"===order?(this._x=Math.asin(clamp(m32,-1,1)),Math.abs(m32)<.99999?(this._y=Math.atan2(-m31,m33),this._z=Math.atan2(-m12,m22)):(this._y=0,this._z=Math.atan2(m21,m11))):"ZYX"===order?(this._y=Math.asin(-clamp(m31,-1,1)),Math.abs(m31)<.99999?(this._x=Math.atan2(m32,m33),this._z=Math.atan2(m21,m11)):(this._x=0,this._z=Math.atan2(-m12,m22))):"YZX"===order?(this._z=Math.asin(clamp(m21,-1,1)),Math.abs(m21)<.99999?(this._x=Math.atan2(-m23,m22),this._y=Math.atan2(-m31,m11)):(this._x=0,this._y=Math.atan2(m13,m33))):"XZY"===order?(this._z=Math.asin(-clamp(m12,-1,1)),Math.abs(m12)<.99999?(this._x=Math.atan2(m32,m22),this._y=Math.atan2(m13,m11)):(this._x=Math.atan2(-m23,m33),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+order),this._order=order,update!==!1&&this.onChangeCallback(),this},setFromQuaternion:function(){var matrix;return function(q,order,update){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.makeRotationFromQuaternion(q),this.setFromRotationMatrix(matrix,order,update),this}}(),setFromVector3:function(v,order){return this.set(v.x,v.y,v.z,order||this._order)},reorder:function(){var q=new THREE.Quaternion;return function(newOrder){q.setFromEuler(this),this.setFromQuaternion(q,newOrder)}}(),equals:function(euler){return euler._x===this._x&&euler._y===this._y&&euler._z===this._z&&euler._order===this._order},fromArray:function(array){return this._x=array[0],this._y=array[1],this._z=array[2],void 0!==array[3]&&(this._order=array[3]),this.onChangeCallback(),this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this._x,array[offset+1]=this._y,array[offset+2]=this._z,array[offset+3]=this._order,array},toVector3:function(optionalResult){return optionalResult?optionalResult.set(this._x,this._y,this._z):new THREE.Vector3(this._x,this._y,this._z)},onChange:function(callback){return this.onChangeCallback=callback,this},onChangeCallback:function(){}},THREE.Line3=function(start,end){this.start=void 0!==start?start:new THREE.Vector3,this.end=void 0!==end?end:new THREE.Vector3},THREE.Line3.prototype={constructor:THREE.Line3,set:function(start,end){return this.start.copy(start),this.end.copy(end),this},clone:function(){return(new this.constructor).copy(this)},copy:function(line){return this.start.copy(line.start),this.end.copy(line.end),this},center:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(t,optionalTarget){var result=optionalTarget||new THREE.Vector3;return this.delta(result).multiplyScalar(t).add(this.start)},closestPointToPointParameter:function(){var startP=new THREE.Vector3,startEnd=new THREE.Vector3;return function(point,clampToLine){startP.subVectors(point,this.start),startEnd.subVectors(this.end,this.start);var startEnd2=startEnd.dot(startEnd),startEnd_startP=startEnd.dot(startP),t=startEnd_startP/startEnd2;return clampToLine&&(t=THREE.Math.clamp(t,0,1)),t}}(),closestPointToPoint:function(point,clampToLine,optionalTarget){var t=this.closestPointToPointParameter(point,clampToLine),result=optionalTarget||new THREE.Vector3;return this.delta(result).multiplyScalar(t).add(this.start)},applyMatrix4:function(matrix){return this.start.applyMatrix4(matrix),this.end.applyMatrix4(matrix),this},equals:function(line){return line.start.equals(this.start)&&line.end.equals(this.end)}},THREE.Box2=function(min,max){this.min=void 0!==min?min:new THREE.Vector2(1/0,1/0),this.max=void 0!==max?max:new THREE.Vector2(-(1/0),-(1/0))},THREE.Box2.prototype={constructor:THREE.Box2,set:function(min,max){return this.min.copy(min),this.max.copy(max),this},setFromPoints:function(points){this.makeEmpty();for(var i=0,il=points.length;il>i;i++)this.expandByPoint(points[i]);return this},setFromCenterAndSize:function(){var v1=new THREE.Vector2;return function(center,size){var halfSize=v1.copy(size).multiplyScalar(.5);return this.min.copy(center).sub(halfSize),this.max.copy(center).add(halfSize),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(box){return this.min.copy(box.min),this.max.copy(box.max),this},makeEmpty:function(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-(1/0),this},empty:function(){return this.max.xthis.max.x||point.ythis.max.y)},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y},getParameter:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector2;return result.set((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(box){return!(box.max.xthis.max.x||box.max.ythis.max.y)},clampPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector2;return result.copy(point).clamp(this.min,this.max)},distanceToPoint:function(){var v1=new THREE.Vector2;return function(point){var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length()}}(),intersect:function(box){return this.min.max(box.min),this.max.min(box.max),this},union:function(box){return this.min.min(box.min),this.max.max(box.max),this},translate:function(offset){return this.min.add(offset),this.max.add(offset),this},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max)}},THREE.Box3=function(min,max){this.min=void 0!==min?min:new THREE.Vector3(1/0,1/0,1/0),this.max=void 0!==max?max:new THREE.Vector3(-(1/0),-(1/0),-(1/0))},THREE.Box3.prototype={constructor:THREE.Box3,set:function(min,max){return this.min.copy(min),this.max.copy(max),this},setFromPoints:function(points){this.makeEmpty();for(var i=0,il=points.length;il>i;i++)this.expandByPoint(points[i]);return this},setFromCenterAndSize:function(){var v1=new THREE.Vector3;return function(center,size){var halfSize=v1.copy(size).multiplyScalar(.5);return this.min.copy(center).sub(halfSize),this.max.copy(center).add(halfSize),this}}(),setFromObject:function(){var v1=new THREE.Vector3;return function(object){var scope=this;return object.updateMatrixWorld(!0),this.makeEmpty(),object.traverse(function(node){var geometry=node.geometry;if(void 0!==geometry)if(geometry instanceof THREE.Geometry)for(var vertices=geometry.vertices,i=0,il=vertices.length;il>i;i++)v1.copy(vertices[i]),v1.applyMatrix4(node.matrixWorld),scope.expandByPoint(v1);else if(geometry instanceof THREE.BufferGeometry&&void 0!==geometry.attributes.position)for(var positions=geometry.attributes.position.array,i=0,il=positions.length;il>i;i+=3)v1.set(positions[i],positions[i+1],positions[i+2]),v1.applyMatrix4(node.matrixWorld),scope.expandByPoint(v1)}),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(box){return this.min.copy(box.min),this.max.copy(box.max),this},makeEmpty:function(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-(1/0),this},empty:function(){return this.max.xthis.max.x||point.ythis.max.y||point.zthis.max.z)},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y&&this.min.z<=box.min.z&&box.max.z<=this.max.z},getParameter:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.set((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y),(point.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(box){return!(box.max.xthis.max.x||box.max.ythis.max.y||box.max.zthis.max.z)},clampPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(point).clamp(this.min,this.max)},distanceToPoint:function(){var v1=new THREE.Vector3;return function(point){ +var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length()}}(),getBoundingSphere:function(){var v1=new THREE.Vector3;return function(optionalTarget){var result=optionalTarget||new THREE.Sphere;return result.center=this.center(),result.radius=.5*this.size(v1).length(),result}}(),intersect:function(box){return this.min.max(box.min),this.max.min(box.max),this},union:function(box){return this.min.min(box.min),this.max.max(box.max),this},applyMatrix4:function(){var points=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(matrix){return points[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(matrix),points[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(matrix),points[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(matrix),points[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(matrix),points[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(matrix),points[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(matrix),points[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(matrix),points[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(matrix),this.makeEmpty(),this.setFromPoints(points),this}}(),translate:function(offset){return this.min.add(offset),this.max.add(offset),this},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max)}},THREE.Matrix3=function(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1]),arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")},THREE.Matrix3.prototype={constructor:THREE.Matrix3,set:function(n11,n12,n13,n21,n22,n23,n31,n32,n33){var te=this.elements;return te[0]=n11,te[3]=n12,te[6]=n13,te[1]=n21,te[4]=n22,te[7]=n23,te[2]=n31,te[5]=n32,te[8]=n33,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(m){var me=m.elements;return this.set(me[0],me[3],me[6],me[1],me[4],me[7],me[2],me[5],me[8]),this},multiplyVector3:function(vector){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),vector.applyMatrix3(this)},multiplyVector3Array:function(a){return console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."),this.applyToVector3Array(a)},applyToVector3Array:function(){var v1;return function(array,offset,length){void 0===v1&&(v1=new THREE.Vector3),void 0===offset&&(offset=0),void 0===length&&(length=array.length);for(var i=0,j=offset;length>i;i+=3,j+=3)v1.fromArray(array,j),v1.applyMatrix3(this),v1.toArray(array,j);return array}}(),applyToBuffer:function(){var v1;return function(buffer,offset,length){void 0===v1&&(v1=new THREE.Vector3),void 0===offset&&(offset=0),void 0===length&&(length=buffer.length/buffer.itemSize);for(var i=0,j=offset;length>i;i++,j++)v1.x=buffer.getX(j),v1.y=buffer.getY(j),v1.z=buffer.getZ(j),v1.applyMatrix3(this),buffer.setXYZ(v1.x,v1.y,v1.z);return buffer}}(),multiplyScalar:function(s){var te=this.elements;return te[0]*=s,te[3]*=s,te[6]*=s,te[1]*=s,te[4]*=s,te[7]*=s,te[2]*=s,te[5]*=s,te[8]*=s,this},determinant:function(){var te=this.elements,a=te[0],b=te[1],c=te[2],d=te[3],e=te[4],f=te[5],g=te[6],h=te[7],i=te[8];return a*e*i-a*f*h-b*d*i+b*f*g+c*d*h-c*e*g},getInverse:function(matrix,throwOnInvertible){var me=matrix.elements,te=this.elements;te[0]=me[10]*me[5]-me[6]*me[9],te[1]=-me[10]*me[1]+me[2]*me[9],te[2]=me[6]*me[1]-me[2]*me[5],te[3]=-me[10]*me[4]+me[6]*me[8],te[4]=me[10]*me[0]-me[2]*me[8],te[5]=-me[6]*me[0]+me[2]*me[4],te[6]=me[9]*me[4]-me[5]*me[8],te[7]=-me[9]*me[0]+me[1]*me[8],te[8]=me[5]*me[0]-me[1]*me[4];var det=me[0]*te[0]+me[1]*te[3]+me[2]*te[6];if(0===det){var msg="Matrix3.getInverse(): can't invert matrix, determinant is 0";if(throwOnInvertible)throw new Error(msg);return console.warn(msg),this.identity(),this}return this.multiplyScalar(1/det),this},transpose:function(){var tmp,m=this.elements;return tmp=m[1],m[1]=m[3],m[3]=tmp,tmp=m[2],m[2]=m[6],m[6]=tmp,tmp=m[5],m[5]=m[7],m[7]=tmp,this},flattenToArrayOffset:function(array,offset){var te=this.elements;return array[offset]=te[0],array[offset+1]=te[1],array[offset+2]=te[2],array[offset+3]=te[3],array[offset+4]=te[4],array[offset+5]=te[5],array[offset+6]=te[6],array[offset+7]=te[7],array[offset+8]=te[8],array},getNormalMatrix:function(m){return this.getInverse(m).transpose(),this},transposeIntoArray:function(r){var m=this.elements;return r[0]=m[0],r[1]=m[3],r[2]=m[6],r[3]=m[1],r[4]=m[4],r[5]=m[7],r[6]=m[2],r[7]=m[5],r[8]=m[8],this},fromArray:function(array){return this.elements.set(array),this},toArray:function(){var te=this.elements;return[te[0],te[1],te[2],te[3],te[4],te[5],te[6],te[7],te[8]]}},THREE.Matrix4=function(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")},THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){var te=this.elements;return te[0]=n11,te[4]=n12,te[8]=n13,te[12]=n14,te[1]=n21,te[5]=n22,te[9]=n23,te[13]=n24,te[2]=n31,te[6]=n32,te[10]=n33,te[14]=n34,te[3]=n41,te[7]=n42,te[11]=n43,te[15]=n44,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new THREE.Matrix4).fromArray(this.elements)},copy:function(m){return this.elements.set(m.elements),this},extractPosition:function(m){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(m)},copyPosition:function(m){var te=this.elements,me=m.elements;return te[12]=me[12],te[13]=me[13],te[14]=me[14],this},extractBasis:function(xAxis,yAxis,zAxis){var te=this.elements;return xAxis.set(te[0],te[1],te[2]),yAxis.set(te[4],te[5],te[6]),zAxis.set(te[8],te[9],te[10]),this},makeBasis:function(xAxis,yAxis,zAxis){return this.set(xAxis.x,yAxis.x,zAxis.x,0,xAxis.y,yAxis.y,zAxis.y,0,xAxis.z,yAxis.z,zAxis.z,0,0,0,0,1),this},extractRotation:function(){var v1;return function(m){void 0===v1&&(v1=new THREE.Vector3);var te=this.elements,me=m.elements,scaleX=1/v1.set(me[0],me[1],me[2]).length(),scaleY=1/v1.set(me[4],me[5],me[6]).length(),scaleZ=1/v1.set(me[8],me[9],me[10]).length();return te[0]=me[0]*scaleX,te[1]=me[1]*scaleX,te[2]=me[2]*scaleX,te[4]=me[4]*scaleY,te[5]=me[5]*scaleY,te[6]=me[6]*scaleY,te[8]=me[8]*scaleZ,te[9]=me[9]*scaleZ,te[10]=me[10]*scaleZ,this}}(),makeRotationFromEuler:function(euler){euler instanceof THREE.Euler==!1&&console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var te=this.elements,x=euler.x,y=euler.y,z=euler.z,a=Math.cos(x),b=Math.sin(x),c=Math.cos(y),d=Math.sin(y),e=Math.cos(z),f=Math.sin(z);if("XYZ"===euler.order){var ae=a*e,af=a*f,be=b*e,bf=b*f;te[0]=c*e,te[4]=-c*f,te[8]=d,te[1]=af+be*d,te[5]=ae-bf*d,te[9]=-b*c,te[2]=bf-ae*d,te[6]=be+af*d,te[10]=a*c}else if("YXZ"===euler.order){var ce=c*e,cf=c*f,de=d*e,df=d*f;te[0]=ce+df*b,te[4]=de*b-cf,te[8]=a*d,te[1]=a*f,te[5]=a*e,te[9]=-b,te[2]=cf*b-de,te[6]=df+ce*b,te[10]=a*c}else if("ZXY"===euler.order){var ce=c*e,cf=c*f,de=d*e,df=d*f;te[0]=ce-df*b,te[4]=-a*f,te[8]=de+cf*b,te[1]=cf+de*b,te[5]=a*e,te[9]=df-ce*b,te[2]=-a*d,te[6]=b,te[10]=a*c}else if("ZYX"===euler.order){var ae=a*e,af=a*f,be=b*e,bf=b*f;te[0]=c*e,te[4]=be*d-af,te[8]=ae*d+bf,te[1]=c*f,te[5]=bf*d+ae,te[9]=af*d-be,te[2]=-d,te[6]=b*c,te[10]=a*c}else if("YZX"===euler.order){var ac=a*c,ad=a*d,bc=b*c,bd=b*d;te[0]=c*e,te[4]=bd-ac*f,te[8]=bc*f+ad,te[1]=f,te[5]=a*e,te[9]=-b*e,te[2]=-d*e,te[6]=ad*f+bc,te[10]=ac-bd*f}else if("XZY"===euler.order){var ac=a*c,ad=a*d,bc=b*c,bd=b*d;te[0]=c*e,te[4]=-f,te[8]=d*e,te[1]=ac*f+bd,te[5]=a*e,te[9]=ad*f-bc,te[2]=bc*f-ad,te[6]=b*e,te[10]=bd*f+ac}return te[3]=0,te[7]=0,te[11]=0,te[12]=0,te[13]=0,te[14]=0,te[15]=1,this},setRotationFromQuaternion:function(q){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(q)},makeRotationFromQuaternion:function(q){var te=this.elements,x=q.x,y=q.y,z=q.z,w=q.w,x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;return te[0]=1-(yy+zz),te[4]=xy-wz,te[8]=xz+wy,te[1]=xy+wz,te[5]=1-(xx+zz),te[9]=yz-wx,te[2]=xz-wy,te[6]=yz+wx,te[10]=1-(xx+yy),te[3]=0,te[7]=0,te[11]=0,te[12]=0,te[13]=0,te[14]=0,te[15]=1,this},lookAt:function(){var x,y,z;return function(eye,target,up){void 0===x&&(x=new THREE.Vector3),void 0===y&&(y=new THREE.Vector3),void 0===z&&(z=new THREE.Vector3);var te=this.elements;return z.subVectors(eye,target).normalize(),0===z.lengthSq()&&(z.z=1),x.crossVectors(up,z).normalize(),0===x.lengthSq()&&(z.x+=1e-4,x.crossVectors(up,z).normalize()),y.crossVectors(z,x),te[0]=x.x,te[4]=y.x,te[8]=z.x,te[1]=x.y,te[5]=y.y,te[9]=z.y,te[2]=x.z,te[6]=y.z,te[10]=z.z,this}}(),multiply:function(m,n){return void 0!==n?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(m,n)):this.multiplyMatrices(this,m)},multiplyMatrices:function(a,b){var ae=a.elements,be=b.elements,te=this.elements,a11=ae[0],a12=ae[4],a13=ae[8],a14=ae[12],a21=ae[1],a22=ae[5],a23=ae[9],a24=ae[13],a31=ae[2],a32=ae[6],a33=ae[10],a34=ae[14],a41=ae[3],a42=ae[7],a43=ae[11],a44=ae[15],b11=be[0],b12=be[4],b13=be[8],b14=be[12],b21=be[1],b22=be[5],b23=be[9],b24=be[13],b31=be[2],b32=be[6],b33=be[10],b34=be[14],b41=be[3],b42=be[7],b43=be[11],b44=be[15];return te[0]=a11*b11+a12*b21+a13*b31+a14*b41,te[4]=a11*b12+a12*b22+a13*b32+a14*b42,te[8]=a11*b13+a12*b23+a13*b33+a14*b43,te[12]=a11*b14+a12*b24+a13*b34+a14*b44,te[1]=a21*b11+a22*b21+a23*b31+a24*b41,te[5]=a21*b12+a22*b22+a23*b32+a24*b42,te[9]=a21*b13+a22*b23+a23*b33+a24*b43,te[13]=a21*b14+a22*b24+a23*b34+a24*b44,te[2]=a31*b11+a32*b21+a33*b31+a34*b41,te[6]=a31*b12+a32*b22+a33*b32+a34*b42,te[10]=a31*b13+a32*b23+a33*b33+a34*b43,te[14]=a31*b14+a32*b24+a33*b34+a34*b44,te[3]=a41*b11+a42*b21+a43*b31+a44*b41,te[7]=a41*b12+a42*b22+a43*b32+a44*b42,te[11]=a41*b13+a42*b23+a43*b33+a44*b43,te[15]=a41*b14+a42*b24+a43*b34+a44*b44,this},multiplyToArray:function(a,b,r){var te=this.elements;return this.multiplyMatrices(a,b),r[0]=te[0],r[1]=te[1],r[2]=te[2],r[3]=te[3],r[4]=te[4],r[5]=te[5],r[6]=te[6],r[7]=te[7],r[8]=te[8],r[9]=te[9],r[10]=te[10],r[11]=te[11],r[12]=te[12],r[13]=te[13],r[14]=te[14],r[15]=te[15],this},multiplyScalar:function(s){var te=this.elements;return te[0]*=s,te[4]*=s,te[8]*=s,te[12]*=s,te[1]*=s,te[5]*=s,te[9]*=s,te[13]*=s,te[2]*=s,te[6]*=s,te[10]*=s,te[14]*=s,te[3]*=s,te[7]*=s,te[11]*=s,te[15]*=s,this},multiplyVector3:function(vector){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead."),vector.applyProjection(this)},multiplyVector4:function(vector){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),vector.applyMatrix4(this)},multiplyVector3Array:function(a){return console.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."),this.applyToVector3Array(a)},applyToVector3Array:function(){var v1;return function(array,offset,length){void 0===v1&&(v1=new THREE.Vector3),void 0===offset&&(offset=0),void 0===length&&(length=array.length);for(var i=0,j=offset;length>i;i+=3,j+=3)v1.fromArray(array,j),v1.applyMatrix4(this),v1.toArray(array,j);return array}}(),applyToBuffer:function(){var v1;return function(buffer,offset,length){void 0===v1&&(v1=new THREE.Vector3),void 0===offset&&(offset=0),void 0===length&&(length=buffer.length/buffer.itemSize);for(var i=0,j=offset;length>i;i++,j++)v1.x=buffer.getX(j),v1.y=buffer.getY(j),v1.z=buffer.getZ(j),v1.applyMatrix4(this),buffer.setXYZ(v1.x,v1.y,v1.z);return buffer}}(),rotateAxis:function(v){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),v.transformDirection(this)},crossVector:function(vector){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),vector.applyMatrix4(this)},determinant:function(){var te=this.elements,n11=te[0],n12=te[4],n13=te[8],n14=te[12],n21=te[1],n22=te[5],n23=te[9],n24=te[13],n31=te[2],n32=te[6],n33=te[10],n34=te[14],n41=te[3],n42=te[7],n43=te[11],n44=te[15];return n41*(+n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34)+n42*(+n11*n23*n34-n11*n24*n33+n14*n21*n33-n13*n21*n34+n13*n24*n31-n14*n23*n31)+n43*(+n11*n24*n32-n11*n22*n34-n14*n21*n32+n12*n21*n34+n14*n22*n31-n12*n24*n31)+n44*(-n13*n22*n31-n11*n23*n32+n11*n22*n33+n13*n21*n32-n12*n21*n33+n12*n23*n31)},transpose:function(){var tmp,te=this.elements;return tmp=te[1],te[1]=te[4],te[4]=tmp,tmp=te[2],te[2]=te[8],te[8]=tmp,tmp=te[6],te[6]=te[9],te[9]=tmp,tmp=te[3],te[3]=te[12],te[12]=tmp,tmp=te[7],te[7]=te[13],te[13]=tmp,tmp=te[11],te[11]=te[14],te[14]=tmp,this},flattenToArrayOffset:function(array,offset){var te=this.elements;return array[offset]=te[0],array[offset+1]=te[1],array[offset+2]=te[2],array[offset+3]=te[3],array[offset+4]=te[4],array[offset+5]=te[5],array[offset+6]=te[6],array[offset+7]=te[7],array[offset+8]=te[8],array[offset+9]=te[9],array[offset+10]=te[10],array[offset+11]=te[11],array[offset+12]=te[12],array[offset+13]=te[13],array[offset+14]=te[14],array[offset+15]=te[15],array},getPosition:function(){var v1;return function(){void 0===v1&&(v1=new THREE.Vector3),console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");var te=this.elements;return v1.set(te[12],te[13],te[14])}}(),setPosition:function(v){var te=this.elements;return te[12]=v.x,te[13]=v.y,te[14]=v.z,this},getInverse:function(m,throwOnInvertible){var te=this.elements,me=m.elements,n11=me[0],n12=me[4],n13=me[8],n14=me[12],n21=me[1],n22=me[5],n23=me[9],n24=me[13],n31=me[2],n32=me[6],n33=me[10],n34=me[14],n41=me[3],n42=me[7],n43=me[11],n44=me[15];te[0]=n23*n34*n42-n24*n33*n42+n24*n32*n43-n22*n34*n43-n23*n32*n44+n22*n33*n44,te[4]=n14*n33*n42-n13*n34*n42-n14*n32*n43+n12*n34*n43+n13*n32*n44-n12*n33*n44,te[8]=n13*n24*n42-n14*n23*n42+n14*n22*n43-n12*n24*n43-n13*n22*n44+n12*n23*n44,te[12]=n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34,te[1]=n24*n33*n41-n23*n34*n41-n24*n31*n43+n21*n34*n43+n23*n31*n44-n21*n33*n44,te[5]=n13*n34*n41-n14*n33*n41+n14*n31*n43-n11*n34*n43-n13*n31*n44+n11*n33*n44,te[9]=n14*n23*n41-n13*n24*n41-n14*n21*n43+n11*n24*n43+n13*n21*n44-n11*n23*n44,te[13]=n13*n24*n31-n14*n23*n31+n14*n21*n33-n11*n24*n33-n13*n21*n34+n11*n23*n34,te[2]=n22*n34*n41-n24*n32*n41+n24*n31*n42-n21*n34*n42-n22*n31*n44+n21*n32*n44,te[6]=n14*n32*n41-n12*n34*n41-n14*n31*n42+n11*n34*n42+n12*n31*n44-n11*n32*n44,te[10]=n12*n24*n41-n14*n22*n41+n14*n21*n42-n11*n24*n42-n12*n21*n44+n11*n22*n44,te[14]=n14*n22*n31-n12*n24*n31-n14*n21*n32+n11*n24*n32+n12*n21*n34-n11*n22*n34,te[3]=n23*n32*n41-n22*n33*n41-n23*n31*n42+n21*n33*n42+n22*n31*n43-n21*n32*n43,te[7]=n12*n33*n41-n13*n32*n41+n13*n31*n42-n11*n33*n42-n12*n31*n43+n11*n32*n43,te[11]=n13*n22*n41-n12*n23*n41-n13*n21*n42+n11*n23*n42+n12*n21*n43-n11*n22*n43,te[15]=n12*n23*n31-n13*n22*n31+n13*n21*n32-n11*n23*n32-n12*n21*n33+n11*n22*n33;var det=n11*te[0]+n21*te[4]+n31*te[8]+n41*te[12];if(0===det){var msg="THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0";if(throwOnInvertible)throw new Error(msg);return console.warn(msg),this.identity(),this}return this.multiplyScalar(1/det),this},translate:function(v){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(angle){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(angle){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(angle){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(axis,angle){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},scale:function(v){var te=this.elements,x=v.x,y=v.y,z=v.z;return te[0]*=x,te[4]*=y,te[8]*=z,te[1]*=x,te[5]*=y,te[9]*=z,te[2]*=x,te[6]*=y,te[10]*=z,te[3]*=x,te[7]*=y,te[11]*=z,this},getMaxScaleOnAxis:function(){var te=this.elements,scaleXSq=te[0]*te[0]+te[1]*te[1]+te[2]*te[2],scaleYSq=te[4]*te[4]+te[5]*te[5]+te[6]*te[6],scaleZSq=te[8]*te[8]+te[9]*te[9]+te[10]*te[10];return Math.sqrt(Math.max(scaleXSq,scaleYSq,scaleZSq))},makeTranslation:function(x,y,z){return this.set(1,0,0,x,0,1,0,y,0,0,1,z,0,0,0,1),this},makeRotationX:function(theta){var c=Math.cos(theta),s=Math.sin(theta);return this.set(1,0,0,0,0,c,-s,0,0,s,c,0,0,0,0,1),this},makeRotationY:function(theta){var c=Math.cos(theta),s=Math.sin(theta);return this.set(c,0,s,0,0,1,0,0,-s,0,c,0,0,0,0,1),this},makeRotationZ:function(theta){var c=Math.cos(theta),s=Math.sin(theta);return this.set(c,-s,0,0,s,c,0,0,0,0,1,0,0,0,0,1),this},makeRotationAxis:function(axis,angle){var c=Math.cos(angle),s=Math.sin(angle),t=1-c,x=axis.x,y=axis.y,z=axis.z,tx=t*x,ty=t*y;return this.set(tx*x+c,tx*y-s*z,tx*z+s*y,0,tx*y+s*z,ty*y+c,ty*z-s*x,0,tx*z-s*y,ty*z+s*x,t*z*z+c,0,0,0,0,1),this},makeScale:function(x,y,z){return this.set(x,0,0,0,0,y,0,0,0,0,z,0,0,0,0,1),this},compose:function(position,quaternion,scale){return this.makeRotationFromQuaternion(quaternion),this.scale(scale),this.setPosition(position),this},decompose:function(){var vector,matrix;return function(position,quaternion,scale){void 0===vector&&(vector=new THREE.Vector3),void 0===matrix&&(matrix=new THREE.Matrix4);var te=this.elements,sx=vector.set(te[0],te[1],te[2]).length(),sy=vector.set(te[4],te[5],te[6]).length(),sz=vector.set(te[8],te[9],te[10]).length(),det=this.determinant();0>det&&(sx=-sx),position.x=te[12],position.y=te[13],position.z=te[14],matrix.elements.set(this.elements);var invSX=1/sx,invSY=1/sy,invSZ=1/sz;return matrix.elements[0]*=invSX,matrix.elements[1]*=invSX,matrix.elements[2]*=invSX,matrix.elements[4]*=invSY,matrix.elements[5]*=invSY,matrix.elements[6]*=invSY,matrix.elements[8]*=invSZ,matrix.elements[9]*=invSZ,matrix.elements[10]*=invSZ,quaternion.setFromRotationMatrix(matrix),scale.x=sx,scale.y=sy,scale.z=sz,this}}(),makeFrustum:function(left,right,bottom,top,near,far){var te=this.elements,x=2*near/(right-left),y=2*near/(top-bottom),a=(right+left)/(right-left),b=(top+bottom)/(top-bottom),c=-(far+near)/(far-near),d=-2*far*near/(far-near);return te[0]=x,te[4]=0,te[8]=a,te[12]=0,te[1]=0,te[5]=y,te[9]=b,te[13]=0,te[2]=0,te[6]=0,te[10]=c,te[14]=d,te[3]=0,te[7]=0,te[11]=-1,te[15]=0,this},makePerspective:function(fov,aspect,near,far){var ymax=near*Math.tan(THREE.Math.degToRad(.5*fov)),ymin=-ymax,xmin=ymin*aspect,xmax=ymax*aspect;return this.makeFrustum(xmin,xmax,ymin,ymax,near,far)},makeOrthographic:function(left,right,top,bottom,near,far){var te=this.elements,w=right-left,h=top-bottom,p=far-near,x=(right+left)/w,y=(top+bottom)/h,z=(far+near)/p;return te[0]=2/w,te[4]=0,te[8]=0,te[12]=-x,te[1]=0,te[5]=2/h,te[9]=0,te[13]=-y,te[2]=0,te[6]=0,te[10]=-2/p,te[14]=-z,te[3]=0,te[7]=0,te[11]=0,te[15]=1,this},equals:function(matrix){for(var te=this.elements,me=matrix.elements,i=0;16>i;i++)if(te[i]!==me[i])return!1;return!0},fromArray:function(array){return this.elements.set(array),this},toArray:function(){var te=this.elements;return[te[0],te[1],te[2],te[3],te[4],te[5],te[6],te[7],te[8],te[9],te[10],te[11],te[12],te[13],te[14],te[15]]}},THREE.Ray=function(origin,direction){this.origin=void 0!==origin?origin:new THREE.Vector3,this.direction=void 0!==direction?direction:new THREE.Vector3},THREE.Ray.prototype={constructor:THREE.Ray,set:function(origin,direction){return this.origin.copy(origin),this.direction.copy(direction),this},clone:function(){return(new this.constructor).copy(this)},copy:function(ray){return this.origin.copy(ray.origin),this.direction.copy(ray.direction),this},at:function(t,optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(this.direction).multiplyScalar(t).add(this.origin)},recast:function(){var v1=new THREE.Vector3;return function(t){return this.origin.copy(this.at(t,v1)),this}}(),closestPointToPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector3;result.subVectors(point,this.origin);var directionDistance=result.dot(this.direction);return 0>directionDistance?result.copy(this.origin):result.copy(this.direction).multiplyScalar(directionDistance).add(this.origin)},distanceToPoint:function(point){return Math.sqrt(this.distanceSqToPoint(point))},distanceSqToPoint:function(){var v1=new THREE.Vector3;return function(point){var directionDistance=v1.subVectors(point,this.origin).dot(this.direction);return 0>directionDistance?this.origin.distanceToSquared(point):(v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin),v1.distanceToSquared(point))}}(),distanceSqToSegment:function(){var segCenter=new THREE.Vector3,segDir=new THREE.Vector3,diff=new THREE.Vector3;return function(v0,v1,optionalPointOnRay,optionalPointOnSegment){segCenter.copy(v0).add(v1).multiplyScalar(.5),segDir.copy(v1).sub(v0).normalize(),diff.copy(this.origin).sub(segCenter);var s0,s1,sqrDist,extDet,segExtent=.5*v0.distanceTo(v1),a01=-this.direction.dot(segDir),b0=diff.dot(this.direction),b1=-diff.dot(segDir),c=diff.lengthSq(),det=Math.abs(1-a01*a01);if(det>0)if(s0=a01*b1-b0,s1=a01*b0-b1,extDet=segExtent*det,s0>=0)if(s1>=-extDet)if(extDet>=s1){var invDet=1/det;s0*=invDet,s1*=invDet,sqrDist=s0*(s0+a01*s1+2*b0)+s1*(a01*s0+s1+2*b1)+c}else s1=segExtent,s0=Math.max(0,-(a01*s1+b0)),sqrDist=-s0*s0+s1*(s1+2*b1)+c;else s1=-segExtent,s0=Math.max(0,-(a01*s1+b0)),sqrDist=-s0*s0+s1*(s1+2*b1)+c;else-extDet>=s1?(s0=Math.max(0,-(-a01*segExtent+b0)),s1=s0>0?-segExtent:Math.min(Math.max(-segExtent,-b1),segExtent),sqrDist=-s0*s0+s1*(s1+2*b1)+c):extDet>=s1?(s0=0,s1=Math.min(Math.max(-segExtent,-b1),segExtent),sqrDist=s1*(s1+2*b1)+c):(s0=Math.max(0,-(a01*segExtent+b0)),s1=s0>0?segExtent:Math.min(Math.max(-segExtent,-b1),segExtent),sqrDist=-s0*s0+s1*(s1+2*b1)+c);else s1=a01>0?-segExtent:segExtent,s0=Math.max(0,-(a01*s1+b0)),sqrDist=-s0*s0+s1*(s1+2*b1)+c;return optionalPointOnRay&&optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin),optionalPointOnSegment&&optionalPointOnSegment.copy(segDir).multiplyScalar(s1).add(segCenter),sqrDist}}(),isIntersectionSphere:function(sphere){return this.distanceToPoint(sphere.center)<=sphere.radius},intersectSphere:function(){var v1=new THREE.Vector3;return function(sphere,optionalTarget){v1.subVectors(sphere.center,this.origin);var tca=v1.dot(this.direction),d2=v1.dot(v1)-tca*tca,radius2=sphere.radius*sphere.radius;if(d2>radius2)return null;var thc=Math.sqrt(radius2-d2),t0=tca-thc,t1=tca+thc;return 0>t0&&0>t1?null:0>t0?this.at(t1,optionalTarget):this.at(t0,optionalTarget)}}(),isIntersectionPlane:function(plane){var distToPoint=plane.distanceToPoint(this.origin);if(0===distToPoint)return!0;var denominator=plane.normal.dot(this.direction);return 0>denominator*distToPoint},distanceToPlane:function(plane){var denominator=plane.normal.dot(this.direction);if(0===denominator)return 0===plane.distanceToPoint(this.origin)?0:null;var t=-(this.origin.dot(plane.normal)+plane.constant)/denominator;return t>=0?t:null},intersectPlane:function(plane,optionalTarget){var t=this.distanceToPlane(plane);return null===t?null:this.at(t,optionalTarget)},isIntersectionBox:function(){var v=new THREE.Vector3;return function(box){return null!==this.intersectBox(box,v)}}(),intersectBox:function(box,optionalTarget){var tmin,tmax,tymin,tymax,tzmin,tzmax,invdirx=1/this.direction.x,invdiry=1/this.direction.y,invdirz=1/this.direction.z,origin=this.origin;return invdirx>=0?(tmin=(box.min.x-origin.x)*invdirx,tmax=(box.max.x-origin.x)*invdirx):(tmin=(box.max.x-origin.x)*invdirx,tmax=(box.min.x-origin.x)*invdirx),invdiry>=0?(tymin=(box.min.y-origin.y)*invdiry,tymax=(box.max.y-origin.y)*invdiry):(tymin=(box.max.y-origin.y)*invdiry,tymax=(box.min.y-origin.y)*invdiry),tmin>tymax||tymin>tmax?null:((tymin>tmin||tmin!==tmin)&&(tmin=tymin),(tmax>tymax||tmax!==tmax)&&(tmax=tymax),invdirz>=0?(tzmin=(box.min.z-origin.z)*invdirz,tzmax=(box.max.z-origin.z)*invdirz):(tzmin=(box.max.z-origin.z)*invdirz,tzmax=(box.min.z-origin.z)*invdirz),tmin>tzmax||tzmin>tmax?null:((tzmin>tmin||tmin!==tmin)&&(tmin=tzmin),(tmax>tzmax||tmax!==tmax)&&(tmax=tzmax),0>tmax?null:this.at(tmin>=0?tmin:tmax,optionalTarget)))},intersectTriangle:function(){var diff=new THREE.Vector3,edge1=new THREE.Vector3,edge2=new THREE.Vector3,normal=new THREE.Vector3;return function(a,b,c,backfaceCulling,optionalTarget){edge1.subVectors(b,a),edge2.subVectors(c,a),normal.crossVectors(edge1,edge2);var sign,DdN=this.direction.dot(normal);if(DdN>0){if(backfaceCulling)return null;sign=1}else{if(!(0>DdN))return null;sign=-1,DdN=-DdN}diff.subVectors(this.origin,a);var DdQxE2=sign*this.direction.dot(edge2.crossVectors(diff,edge2));if(0>DdQxE2)return null;var DdE1xQ=sign*this.direction.dot(edge1.cross(diff));if(0>DdE1xQ)return null;if(DdQxE2+DdE1xQ>DdN)return null;var QdN=-sign*diff.dot(normal);return 0>QdN?null:this.at(QdN/DdN,optionalTarget)}}(),applyMatrix4:function(matrix4){return this.direction.add(this.origin).applyMatrix4(matrix4),this.origin.applyMatrix4(matrix4),this.direction.sub(this.origin),this.direction.normalize(),this},equals:function(ray){return ray.origin.equals(this.origin)&&ray.direction.equals(this.direction)}},THREE.Sphere=function(center,radius){this.center=void 0!==center?center:new THREE.Vector3,this.radius=void 0!==radius?radius:0},THREE.Sphere.prototype={constructor:THREE.Sphere,set:function(center,radius){return this.center.copy(center),this.radius=radius,this},setFromPoints:function(){var box=new THREE.Box3;return function(points,optionalCenter){var center=this.center;void 0!==optionalCenter?center.copy(optionalCenter):box.setFromPoints(points).center(center);for(var maxRadiusSq=0,i=0,il=points.length;il>i;i++)maxRadiusSq=Math.max(maxRadiusSq,center.distanceToSquared(points[i]));return this.radius=Math.sqrt(maxRadiusSq),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(sphere){return this.center.copy(sphere.center),this.radius=sphere.radius,this},empty:function(){return this.radius<=0},containsPoint:function(point){return point.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(point){return point.distanceTo(this.center)-this.radius},intersectsSphere:function(sphere){var radiusSum=this.radius+sphere.radius;return sphere.center.distanceToSquared(this.center)<=radiusSum*radiusSum},clampPoint:function(point,optionalTarget){var deltaLengthSq=this.center.distanceToSquared(point),result=optionalTarget||new THREE.Vector3;return result.copy(point),deltaLengthSq>this.radius*this.radius&&(result.sub(this.center).normalize(),result.multiplyScalar(this.radius).add(this.center)),result},getBoundingBox:function(optionalTarget){var box=optionalTarget||new THREE.Box3;return box.set(this.center,this.center),box.expandByScalar(this.radius),box},applyMatrix4:function(matrix){return this.center.applyMatrix4(matrix),this.radius=this.radius*matrix.getMaxScaleOnAxis(),this},translate:function(offset){return this.center.add(offset),this},equals:function(sphere){return sphere.center.equals(this.center)&&sphere.radius===this.radius}},THREE.Frustum=function(p0,p1,p2,p3,p4,p5){this.planes=[void 0!==p0?p0:new THREE.Plane,void 0!==p1?p1:new THREE.Plane,void 0!==p2?p2:new THREE.Plane,void 0!==p3?p3:new THREE.Plane,void 0!==p4?p4:new THREE.Plane,void 0!==p5?p5:new THREE.Plane]},THREE.Frustum.prototype={constructor:THREE.Frustum,set:function(p0,p1,p2,p3,p4,p5){var planes=this.planes;return planes[0].copy(p0),planes[1].copy(p1),planes[2].copy(p2),planes[3].copy(p3),planes[4].copy(p4),planes[5].copy(p5),this},clone:function(){return(new this.constructor).copy(this)},copy:function(frustum){for(var planes=this.planes,i=0;6>i;i++)planes[i].copy(frustum.planes[i]);return this},setFromMatrix:function(m){var planes=this.planes,me=m.elements,me0=me[0],me1=me[1],me2=me[2],me3=me[3],me4=me[4],me5=me[5],me6=me[6],me7=me[7],me8=me[8],me9=me[9],me10=me[10],me11=me[11],me12=me[12],me13=me[13],me14=me[14],me15=me[15];return planes[0].setComponents(me3-me0,me7-me4,me11-me8,me15-me12).normalize(),planes[1].setComponents(me3+me0,me7+me4,me11+me8,me15+me12).normalize(),planes[2].setComponents(me3+me1,me7+me5,me11+me9,me15+me13).normalize(),planes[3].setComponents(me3-me1,me7-me5,me11-me9,me15-me13).normalize(),planes[4].setComponents(me3-me2,me7-me6,me11-me10,me15-me14).normalize(),planes[5].setComponents(me3+me2,me7+me6,me11+me10,me15+me14).normalize(),this},intersectsObject:function(){var sphere=new THREE.Sphere;return function(object){var geometry=object.geometry;return null===geometry.boundingSphere&&geometry.computeBoundingSphere(),sphere.copy(geometry.boundingSphere),sphere.applyMatrix4(object.matrixWorld),this.intersectsSphere(sphere)}}(),intersectsSphere:function(sphere){for(var planes=this.planes,center=sphere.center,negRadius=-sphere.radius,i=0;6>i;i++){var distance=planes[i].distanceToPoint(center);if(negRadius>distance)return!1}return!0},intersectsBox:function(){var p1=new THREE.Vector3,p2=new THREE.Vector3;return function(box){for(var planes=this.planes,i=0;6>i;i++){var plane=planes[i];p1.x=plane.normal.x>0?box.min.x:box.max.x,p2.x=plane.normal.x>0?box.max.x:box.min.x,p1.y=plane.normal.y>0?box.min.y:box.max.y,p2.y=plane.normal.y>0?box.max.y:box.min.y,p1.z=plane.normal.z>0?box.min.z:box.max.z,p2.z=plane.normal.z>0?box.max.z:box.min.z;var d1=plane.distanceToPoint(p1),d2=plane.distanceToPoint(p2);if(0>d1&&0>d2)return!1}return!0}}(),containsPoint:function(point){for(var planes=this.planes,i=0;6>i;i++)if(planes[i].distanceToPoint(point)<0)return!1;return!0}},THREE.Plane=function(normal,constant){this.normal=void 0!==normal?normal:new THREE.Vector3(1,0,0),this.constant=void 0!==constant?constant:0},THREE.Plane.prototype={constructor:THREE.Plane,set:function(normal,constant){return this.normal.copy(normal),this.constant=constant,this},setComponents:function(x,y,z,w){return this.normal.set(x,y,z),this.constant=w,this},setFromNormalAndCoplanarPoint:function(normal,point){return this.normal.copy(normal),this.constant=-point.dot(this.normal),this},setFromCoplanarPoints:function(){var v1=new THREE.Vector3,v2=new THREE.Vector3;return function(a,b,c){var normal=v1.subVectors(c,b).cross(v2.subVectors(a,b)).normalize();return this.setFromNormalAndCoplanarPoint(normal,a),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(plane){return this.normal.copy(plane.normal),this.constant=plane.constant,this},normalize:function(){var inverseNormalLength=1/this.normal.length();return this.normal.multiplyScalar(inverseNormalLength),this.constant*=inverseNormalLength,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(point){return this.normal.dot(point)+this.constant},distanceToSphere:function(sphere){return this.distanceToPoint(sphere.center)-sphere.radius},projectPoint:function(point,optionalTarget){return this.orthoPoint(point,optionalTarget).sub(point).negate()},orthoPoint:function(point,optionalTarget){var perpendicularMagnitude=this.distanceToPoint(point),result=optionalTarget||new THREE.Vector3;return result.copy(this.normal).multiplyScalar(perpendicularMagnitude)},isIntersectionLine:function(line){var startSign=this.distanceToPoint(line.start),endSign=this.distanceToPoint(line.end);return 0>startSign&&endSign>0||0>endSign&&startSign>0},intersectLine:function(){var v1=new THREE.Vector3;return function(line,optionalTarget){var result=optionalTarget||new THREE.Vector3,direction=line.delta(v1),denominator=this.normal.dot(direction);if(0!==denominator){var t=-(line.start.dot(this.normal)+this.constant)/denominator;if(!(0>t||t>1))return result.copy(direction).multiplyScalar(t).add(line.start); +}else if(0===this.distanceToPoint(line.start))return result.copy(line.start)}}(),coplanarPoint:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var v1=new THREE.Vector3,v2=new THREE.Vector3,m1=new THREE.Matrix3;return function(matrix,optionalNormalMatrix){var normalMatrix=optionalNormalMatrix||m1.getNormalMatrix(matrix),newNormal=v1.copy(this.normal).applyMatrix3(normalMatrix),newCoplanarPoint=this.coplanarPoint(v2);return newCoplanarPoint.applyMatrix4(matrix),this.setFromNormalAndCoplanarPoint(newNormal,newCoplanarPoint),this}}(),translate:function(offset){return this.constant=this.constant-offset.dot(this.normal),this},equals:function(plane){return plane.normal.equals(this.normal)&&plane.constant===this.constant}},THREE.Math={generateUUID:function(){var r,chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),uuid=new Array(36),rnd=0;return function(){for(var i=0;36>i;i++)8===i||13===i||18===i||23===i?uuid[i]="-":14===i?uuid[i]="4":(2>=rnd&&(rnd=33554432+16777216*Math.random()|0),r=15&rnd,rnd>>=4,uuid[i]=chars[19===i?3&r|8:r]);return uuid.join("")}}(),clamp:function(value,min,max){return Math.max(min,Math.min(max,value))},euclideanModulo:function(n,m){return(n%m+m)%m},mapLinear:function(x,a1,a2,b1,b2){return b1+(x-a1)*(b2-b1)/(a2-a1)},smoothstep:function(x,min,max){return min>=x?0:x>=max?1:(x=(x-min)/(max-min),x*x*(3-2*x))},smootherstep:function(x,min,max){return min>=x?0:x>=max?1:(x=(x-min)/(max-min),x*x*x*(x*(6*x-15)+10))},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(low,high){return low+Math.floor(Math.random()*(high-low+1))},randFloat:function(low,high){return low+Math.random()*(high-low)},randFloatSpread:function(range){return range*(.5-Math.random())},degToRad:function(){var degreeToRadiansFactor=Math.PI/180;return function(degrees){return degrees*degreeToRadiansFactor}}(),radToDeg:function(){var radianToDegreesFactor=180/Math.PI;return function(radians){return radians*radianToDegreesFactor}}(),isPowerOfTwo:function(value){return 0===(value&value-1)&&0!==value},nearestPowerOfTwo:function(value){return Math.pow(2,Math.round(Math.log(value)/Math.LN2))},nextPowerOfTwo:function(value){return value--,value|=value>>1,value|=value>>2,value|=value>>4,value|=value>>8,value|=value>>16,value++,value}},THREE.Spline=function(points){function interpolate(p0,p1,p2,p3,t,t2,t3){var v0=.5*(p2-p0),v1=.5*(p3-p1);return(2*(p1-p2)+v0+v1)*t3+(-3*(p1-p2)-2*v0-v1)*t2+v0*t+p1}this.points=points;var point,intPoint,weight,w2,w3,pa,pb,pc,pd,c=[],v3={x:0,y:0,z:0};this.initFromArray=function(a){this.points=[];for(var i=0;ithis.points.length-2?this.points.length-1:intPoint+1,c[3]=intPoint>this.points.length-3?this.points.length-1:intPoint+2,pa=this.points[c[0]],pb=this.points[c[1]],pc=this.points[c[2]],pd=this.points[c[3]],w2=weight*weight,w3=weight*w2,v3.x=interpolate(pa.x,pb.x,pc.x,pd.x,weight,w2,w3),v3.y=interpolate(pa.y,pb.y,pc.y,pd.y,weight,w2,w3),v3.z=interpolate(pa.z,pb.z,pc.z,pd.z,weight,w2,w3),v3},this.getControlPointsArray=function(){var i,p,l=this.points.length,coords=[];for(i=0;l>i;i++)p=this.points[i],coords[i]=[p.x,p.y,p.z];return coords},this.getLength=function(nSubDivisions){var i,index,nSamples,position,point=0,intPoint=0,oldIntPoint=0,oldPosition=new THREE.Vector3,tmpVec=new THREE.Vector3,chunkLengths=[],totalLength=0;for(chunkLengths[0]=0,nSubDivisions||(nSubDivisions=100),nSamples=this.points.length*nSubDivisions,oldPosition.copy(this.points[0]),i=1;nSamples>i;i++)index=i/nSamples,position=this.getPoint(index),tmpVec.copy(position),totalLength+=tmpVec.distanceTo(oldPosition),oldPosition.copy(position),point=(this.points.length-1)*index,intPoint=Math.floor(point),intPoint!==oldIntPoint&&(chunkLengths[intPoint]=totalLength,oldIntPoint=intPoint);return chunkLengths[chunkLengths.length]=totalLength,{chunks:chunkLengths,total:totalLength}},this.reparametrizeByArcLength=function(samplingCoef){var i,j,index,indexCurrent,indexNext,realDistance,sampling,position,newpoints=[],tmpVec=new THREE.Vector3,sl=this.getLength();for(newpoints.push(tmpVec.copy(this.points[0]).clone()),i=1;ij;j++)index=indexCurrent+j*(1/sampling)*(indexNext-indexCurrent),position=this.getPoint(index),newpoints.push(tmpVec.copy(position).clone());newpoints.push(tmpVec.copy(this.points[i]).clone())}this.points=newpoints}},THREE.Triangle=function(a,b,c){this.a=void 0!==a?a:new THREE.Vector3,this.b=void 0!==b?b:new THREE.Vector3,this.c=void 0!==c?c:new THREE.Vector3},THREE.Triangle.normal=function(){var v0=new THREE.Vector3;return function(a,b,c,optionalTarget){var result=optionalTarget||new THREE.Vector3;result.subVectors(c,b),v0.subVectors(a,b),result.cross(v0);var resultLengthSq=result.lengthSq();return resultLengthSq>0?result.multiplyScalar(1/Math.sqrt(resultLengthSq)):result.set(0,0,0)}}(),THREE.Triangle.barycoordFromPoint=function(){var v0=new THREE.Vector3,v1=new THREE.Vector3,v2=new THREE.Vector3;return function(point,a,b,c,optionalTarget){v0.subVectors(c,a),v1.subVectors(b,a),v2.subVectors(point,a);var dot00=v0.dot(v0),dot01=v0.dot(v1),dot02=v0.dot(v2),dot11=v1.dot(v1),dot12=v1.dot(v2),denom=dot00*dot11-dot01*dot01,result=optionalTarget||new THREE.Vector3;if(0===denom)return result.set(-2,-1,-1);var invDenom=1/denom,u=(dot11*dot02-dot01*dot12)*invDenom,v=(dot00*dot12-dot01*dot02)*invDenom;return result.set(1-u-v,v,u)}}(),THREE.Triangle.containsPoint=function(){var v1=new THREE.Vector3;return function(point,a,b,c){var result=THREE.Triangle.barycoordFromPoint(point,a,b,c,v1);return result.x>=0&&result.y>=0&&result.x+result.y<=1}}(),THREE.Triangle.prototype={constructor:THREE.Triangle,set:function(a,b,c){return this.a.copy(a),this.b.copy(b),this.c.copy(c),this},setFromPointsAndIndices:function(points,i0,i1,i2){return this.a.copy(points[i0]),this.b.copy(points[i1]),this.c.copy(points[i2]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(triangle){return this.a.copy(triangle.a),this.b.copy(triangle.b),this.c.copy(triangle.c),this},area:function(){var v0=new THREE.Vector3,v1=new THREE.Vector3;return function(){return v0.subVectors(this.c,this.b),v1.subVectors(this.a,this.b),.5*v0.cross(v1).length()}}(),midpoint:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(optionalTarget){return THREE.Triangle.normal(this.a,this.b,this.c,optionalTarget)},plane:function(optionalTarget){var result=optionalTarget||new THREE.Plane;return result.setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(point,optionalTarget){return THREE.Triangle.barycoordFromPoint(point,this.a,this.b,this.c,optionalTarget)},containsPoint:function(point){return THREE.Triangle.containsPoint(point,this.a,this.b,this.c)},equals:function(triangle){return triangle.a.equals(this.a)&&triangle.b.equals(this.b)&&triangle.c.equals(this.c)}},THREE.Channels=function(){this.mask=1},THREE.Channels.prototype={constructor:THREE.Channels,set:function(channel){this.mask=1<i;i++)array[i]=listenerArray[i];for(var i=0;length>i;i++)array[i].call(this,event)}}}},function(THREE){function descSort(a,b){return a.distance-b.distance}function intersectObject(object,raycaster,intersects,recursive){if(object.visible!==!1&&(object.raycast(raycaster,intersects),recursive===!0))for(var children=object.children,i=0,l=children.length;l>i;i++)intersectObject(children[i],raycaster,intersects,!0)}THREE.Raycaster=function(origin,direction,near,far){this.ray=new THREE.Ray(origin,direction),this.near=near||0,this.far=far||1/0,this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})},THREE.Raycaster.prototype={constructor:THREE.Raycaster,linePrecision:1,set:function(origin,direction){this.ray.set(origin,direction)},setFromCamera:function(coords,camera){camera instanceof THREE.PerspectiveCamera?(this.ray.origin.setFromMatrixPosition(camera.matrixWorld),this.ray.direction.set(coords.x,coords.y,.5).unproject(camera).sub(this.ray.origin).normalize()):camera instanceof THREE.OrthographicCamera?(this.ray.origin.set(coords.x,coords.y,-1).unproject(camera),this.ray.direction.set(0,0,-1).transformDirection(camera.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(object,recursive){var intersects=[];return intersectObject(object,this,intersects,recursive),intersects.sort(descSort),intersects},intersectObjects:function(objects,recursive){var intersects=[];if(Array.isArray(objects)===!1)return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),intersects;for(var i=0,l=objects.length;l>i;i++)intersectObject(objects[i],this,intersects,recursive);return intersects.sort(descSort),intersects}}}(THREE),THREE.Object3D=function(){function onRotationChange(){quaternion.setFromEuler(rotation,!1)}function onQuaternionChange(){rotation.setFromQuaternion(quaternion,void 0,!1)}Object.defineProperty(this,"id",{value:THREE.Object3DIdCount++}),this.uuid=THREE.Math.generateUUID(),this.name="",this.type="Object3D",this.parent=null,this.channels=new THREE.Channels,this.children=[],this.up=THREE.Object3D.DefaultUp.clone();var position=new THREE.Vector3,rotation=new THREE.Euler,quaternion=new THREE.Quaternion,scale=new THREE.Vector3(1,1,1);rotation.onChange(onRotationChange),quaternion.onChange(onQuaternionChange),Object.defineProperties(this,{position:{enumerable:!0,value:position},rotation:{enumerable:!0,value:rotation},quaternion:{enumerable:!0,value:quaternion},scale:{enumerable:!0,value:scale},modelViewMatrix:{value:new THREE.Matrix4},normalMatrix:{value:new THREE.Matrix3}}),this.rotationAutoUpdate=!0,this.matrix=new THREE.Matrix4,this.matrixWorld=new THREE.Matrix4,this.matrixAutoUpdate=THREE.Object3D.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.userData={}},THREE.Object3D.DefaultUp=new THREE.Vector3(0,1,0),THREE.Object3D.DefaultMatrixAutoUpdate=!0,THREE.Object3D.prototype={constructor:THREE.Object3D,get eulerOrder(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set eulerOrder(value){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=value},get useQuaternion(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set useQuaternion(value){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set renderDepth(value){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},applyMatrix:function(matrix){this.matrix.multiplyMatrices(matrix,this.matrix),this.matrix.decompose(this.position,this.quaternion,this.scale)},setRotationFromAxisAngle:function(axis,angle){this.quaternion.setFromAxisAngle(axis,angle)},setRotationFromEuler:function(euler){this.quaternion.setFromEuler(euler,!0)},setRotationFromMatrix:function(m){this.quaternion.setFromRotationMatrix(m)},setRotationFromQuaternion:function(q){this.quaternion.copy(q)},rotateOnAxis:function(){var q1=new THREE.Quaternion;return function(axis,angle){return q1.setFromAxisAngle(axis,angle),this.quaternion.multiply(q1),this}}(),rotateX:function(){var v1=new THREE.Vector3(1,0,0);return function(angle){return this.rotateOnAxis(v1,angle)}}(),rotateY:function(){var v1=new THREE.Vector3(0,1,0);return function(angle){return this.rotateOnAxis(v1,angle)}}(),rotateZ:function(){var v1=new THREE.Vector3(0,0,1);return function(angle){return this.rotateOnAxis(v1,angle)}}(),translateOnAxis:function(){var v1=new THREE.Vector3;return function(axis,distance){return v1.copy(axis).applyQuaternion(this.quaternion),this.position.add(v1.multiplyScalar(distance)),this}}(),translate:function(distance,axis){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(axis,distance)},translateX:function(){var v1=new THREE.Vector3(1,0,0);return function(distance){return this.translateOnAxis(v1,distance)}}(),translateY:function(){var v1=new THREE.Vector3(0,1,0);return function(distance){return this.translateOnAxis(v1,distance)}}(),translateZ:function(){var v1=new THREE.Vector3(0,0,1);return function(distance){return this.translateOnAxis(v1,distance)}}(),localToWorld:function(vector){return vector.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var m1=new THREE.Matrix4;return function(vector){return vector.applyMatrix4(m1.getInverse(this.matrixWorld))}}(),lookAt:function(){var m1=new THREE.Matrix4;return function(vector){m1.lookAt(vector,this.position,this.up),this.quaternion.setFromRotationMatrix(m1)}}(),add:function(object){if(arguments.length>1){for(var i=0;i1)for(var i=0;ii;i++){var child=this.children[i],object=child.getObjectByProperty(name,value);if(void 0!==object)return object}},getWorldPosition:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return this.updateMatrixWorld(!0),result.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var position=new THREE.Vector3,scale=new THREE.Vector3;return function(optionalTarget){var result=optionalTarget||new THREE.Quaternion;return this.updateMatrixWorld(!0),this.matrixWorld.decompose(position,result,scale),result}}(),getWorldRotation:function(){var quaternion=new THREE.Quaternion;return function(optionalTarget){var result=optionalTarget||new THREE.Euler;return this.getWorldQuaternion(quaternion),result.setFromQuaternion(quaternion,this.rotation.order,!1)}}(),getWorldScale:function(){var position=new THREE.Vector3,quaternion=new THREE.Quaternion;return function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return this.updateMatrixWorld(!0),this.matrixWorld.decompose(position,quaternion,result),result}}(),getWorldDirection:function(){var quaternion=new THREE.Quaternion;return function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return this.getWorldQuaternion(quaternion),result.set(0,0,1).applyQuaternion(quaternion)}}(),raycast:function(){},traverse:function(callback){callback(this);for(var children=this.children,i=0,l=children.length;l>i;i++)children[i].traverse(callback)},traverseVisible:function(callback){if(this.visible!==!1){callback(this);for(var children=this.children,i=0,l=children.length;l>i;i++)children[i].traverseVisible(callback)}},traverseAncestors:function(callback){var parent=this.parent;null!==parent&&(callback(parent),parent.traverseAncestors(callback))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(force){this.matrixAutoUpdate===!0&&this.updateMatrix(),this.matrixWorldNeedsUpdate!==!0&&force!==!0||(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,force=!0);for(var i=0,l=this.children.length;l>i;i++)this.children[i].updateMatrixWorld(force)},toJSON:function(meta){function extractFromCache(cache){var values=[];for(var key in cache){var data=cache[key];delete data.metadata,values.push(data)}return values}var isRootObject=void 0===meta,output={};isRootObject&&(meta={geometries:{},materials:{},textures:{},images:{}},output.metadata={version:4.4,type:"Object",generator:"Object3D.toJSON"});var object={};if(object.uuid=this.uuid,object.type=this.type,""!==this.name&&(object.name=this.name),"{}"!==JSON.stringify(this.userData)&&(object.userData=this.userData),this.castShadow===!0&&(object.castShadow=!0),this.receiveShadow===!0&&(object.receiveShadow=!0),this.visible===!1&&(object.visible=!1),object.matrix=this.matrix.toArray(),void 0!==this.geometry&&(void 0===meta.geometries[this.geometry.uuid]&&(meta.geometries[this.geometry.uuid]=this.geometry.toJSON(meta)),object.geometry=this.geometry.uuid),void 0!==this.material&&(void 0===meta.materials[this.material.uuid]&&(meta.materials[this.material.uuid]=this.material.toJSON(meta)),object.material=this.material.uuid),this.children.length>0){object.children=[];for(var i=0;i0&&(output.geometries=geometries),materials.length>0&&(output.materials=materials),textures.length>0&&(output.textures=textures),images.length>0&&(output.images=images)}return output.object=object,output},clone:function(recursive){return(new this.constructor).copy(this,recursive)},copy:function(source,recursive){if(void 0===recursive&&(recursive=!0),this.name=source.name,this.up.copy(source.up),this.position.copy(source.position),this.quaternion.copy(source.quaternion),this.scale.copy(source.scale),this.rotationAutoUpdate=source.rotationAutoUpdate,this.matrix.copy(source.matrix),this.matrixWorld.copy(source.matrixWorld),this.matrixAutoUpdate=source.matrixAutoUpdate,this.matrixWorldNeedsUpdate=source.matrixWorldNeedsUpdate,this.visible=source.visible,this.castShadow=source.castShadow,this.receiveShadow=source.receiveShadow,this.frustumCulled=source.frustumCulled,this.renderOrder=source.renderOrder,this.userData=JSON.parse(JSON.stringify(source.userData)),recursive===!0)for(var i=0;ii;i++)this.vertexNormals[i]=source.vertexNormals[i].clone();for(var i=0,il=source.vertexColors.length;il>i;i++)this.vertexColors[i]=source.vertexColors[i].clone();return this}},THREE.Face4=function(a,b,c,d,normal,color,materialIndex){return console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead."),new THREE.Face3(a,b,c,normal,color,materialIndex)},THREE.BufferAttribute=function(array,itemSize){this.uuid=THREE.Math.generateUUID(),this.array=array,this.itemSize=itemSize,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.version=0},THREE.BufferAttribute.prototype={constructor:THREE.BufferAttribute,get length(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count."),this.array.length},get count(){return this.array.length/this.itemSize},set needsUpdate(value){value===!0&&this.version++},setDynamic:function(value){return this.dynamic=value,this},copy:function(source){return this.array=new source.array.constructor(source.array),this.itemSize=source.itemSize,this.dynamic=source.dynamic,this},copyAt:function(index1,attribute,index2){index1*=this.itemSize,index2*=attribute.itemSize;for(var i=0,l=this.itemSize;l>i;i++)this.array[index1+i]=attribute.array[index2+i];return this},copyArray:function(array){return this.array.set(array),this},copyColorsArray:function(colors){for(var array=this.array,offset=0,i=0,l=colors.length;l>i;i++){var color=colors[i];void 0===color&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",i),color=new THREE.Color),array[offset++]=color.r,array[offset++]=color.g,array[offset++]=color.b}return this},copyIndicesArray:function(indices){for(var array=this.array,offset=0,i=0,l=indices.length;l>i;i++){var index=indices[i];array[offset++]=index.a,array[offset++]=index.b,array[offset++]=index.c}return this},copyVector2sArray:function(vectors){for(var array=this.array,offset=0,i=0,l=vectors.length;l>i;i++){var vector=vectors[i];void 0===vector&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",i),vector=new THREE.Vector2),array[offset++]=vector.x,array[offset++]=vector.y}return this},copyVector3sArray:function(vectors){for(var array=this.array,offset=0,i=0,l=vectors.length;l>i;i++){var vector=vectors[i];void 0===vector&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",i),vector=new THREE.Vector3),array[offset++]=vector.x,array[offset++]=vector.y,array[offset++]=vector.z}return this},copyVector4sArray:function(vectors){for(var array=this.array,offset=0,i=0,l=vectors.length;l>i;i++){var vector=vectors[i];void 0===vector&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",i),vector=new THREE.Vector4),array[offset++]=vector.x,array[offset++]=vector.y,array[offset++]=vector.z,array[offset++]=vector.w}return this},set:function(value,offset){return void 0===offset&&(offset=0),this.array.set(value,offset),this},getX:function(index){return this.array[index*this.itemSize]},setX:function(index,x){return this.array[index*this.itemSize]=x,this},getY:function(index){return this.array[index*this.itemSize+1]},setY:function(index,y){return this.array[index*this.itemSize+1]=y,this},getZ:function(index){return this.array[index*this.itemSize+2]},setZ:function(index,z){return this.array[index*this.itemSize+2]=z,this},getW:function(index){return this.array[index*this.itemSize+3]},setW:function(index,w){return this.array[index*this.itemSize+3]=w,this},setXY:function(index,x,y){return index*=this.itemSize,this.array[index+0]=x,this.array[index+1]=y,this},setXYZ:function(index,x,y,z){return index*=this.itemSize,this.array[index+0]=x,this.array[index+1]=y,this.array[index+2]=z,this},setXYZW:function(index,x,y,z,w){return index*=this.itemSize,this.array[index+0]=x,this.array[index+1]=y,this.array[index+2]=z,this.array[index+3]=w,this},clone:function(){return(new this.constructor).copy(this)}},THREE.Int8Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Int8Array(array),itemSize)},THREE.Uint8Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Uint8Array(array),itemSize)},THREE.Uint8ClampedAttribute=function(array,itemSize){return new THREE.BufferAttribute(new Uint8ClampedArray(array),itemSize)},THREE.Int16Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Int16Array(array),itemSize)},THREE.Uint16Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Uint16Array(array),itemSize)},THREE.Int32Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Int32Array(array),itemSize)},THREE.Uint32Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Uint32Array(array),itemSize)},THREE.Float32Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Float32Array(array),itemSize)},THREE.Float64Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Float64Array(array),itemSize)},THREE.DynamicBufferAttribute=function(array,itemSize){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead."),new THREE.BufferAttribute(array,itemSize).setDynamic(!0)},THREE.InstancedBufferAttribute=function(array,itemSize,meshPerAttribute){THREE.BufferAttribute.call(this,array,itemSize),this.meshPerAttribute=meshPerAttribute||1},THREE.InstancedBufferAttribute.prototype=Object.create(THREE.BufferAttribute.prototype),THREE.InstancedBufferAttribute.prototype.constructor=THREE.InstancedBufferAttribute,THREE.InstancedBufferAttribute.prototype.copy=function(source){return THREE.BufferAttribute.prototype.copy.call(this,source),this.meshPerAttribute=source.meshPerAttribute,this},THREE.InterleavedBuffer=function(array,stride){this.uuid=THREE.Math.generateUUID(),this.array=array,this.stride=stride,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.version=0},THREE.InterleavedBuffer.prototype={constructor:THREE.InterleavedBuffer,get length(){return this.array.length},get count(){return this.array.length/this.stride},set needsUpdate(value){value===!0&&this.version++},setDynamic:function(value){return this.dynamic=value,this},copy:function(source){this.array=new source.array.constructor(source.array),this.stride=source.stride,this.dynamic=source.dynamic},copyAt:function(index1,attribute,index2){index1*=this.stride,index2*=attribute.stride;for(var i=0,l=this.stride;l>i;i++)this.array[index1+i]=attribute.array[index2+i];return this},set:function(value,offset){return void 0===offset&&(offset=0),this.array.set(value,offset),this},clone:function(){return(new this.constructor).copy(this)}},THREE.InstancedInterleavedBuffer=function(array,stride,meshPerAttribute){THREE.InterleavedBuffer.call(this,array,stride),this.meshPerAttribute=meshPerAttribute||1},THREE.InstancedInterleavedBuffer.prototype=Object.create(THREE.InterleavedBuffer.prototype),THREE.InstancedInterleavedBuffer.prototype.constructor=THREE.InstancedInterleavedBuffer,THREE.InstancedInterleavedBuffer.prototype.copy=function(source){return THREE.InterleavedBuffer.prototype.copy.call(this,source),this.meshPerAttribute=source.meshPerAttribute,this},THREE.InterleavedBufferAttribute=function(interleavedBuffer,itemSize,offset){this.uuid=THREE.Math.generateUUID(),this.data=interleavedBuffer,this.itemSize=itemSize,this.offset=offset},THREE.InterleavedBufferAttribute.prototype={constructor:THREE.InterleavedBufferAttribute,get length(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count."),this.array.length},get count(){return this.data.array.length/this.data.stride},setX:function(index,x){return this.data.array[index*this.data.stride+this.offset]=x,this},setY:function(index,y){return this.data.array[index*this.data.stride+this.offset+1]=y,this},setZ:function(index,z){return this.data.array[index*this.data.stride+this.offset+2]=z,this},setW:function(index,w){return this.data.array[index*this.data.stride+this.offset+3]=w,this},getX:function(index){return this.data.array[index*this.data.stride+this.offset]},getY:function(index){return this.data.array[index*this.data.stride+this.offset+1]},getZ:function(index){return this.data.array[index*this.data.stride+this.offset+2]},getW:function(index){return this.data.array[index*this.data.stride+this.offset+3]},setXY:function(index,x,y){return index=index*this.data.stride+this.offset,this.data.array[index+0]=x,this.data.array[index+1]=y,this},setXYZ:function(index,x,y,z){return index=index*this.data.stride+this.offset,this.data.array[index+0]=x,this.data.array[index+1]=y,this.data.array[index+2]=z,this},setXYZW:function(index,x,y,z,w){return index=index*this.data.stride+this.offset,this.data.array[index+0]=x,this.data.array[index+1]=y,this.data.array[index+2]=z,this.data.array[index+3]=w,this}},THREE.Geometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++}),this.uuid=THREE.Math.generateUUID(),this.name="",this.type="Geometry",this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.verticesNeedUpdate=!1,this.elementsNeedUpdate=!1,this.uvsNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.lineDistancesNeedUpdate=!1,this.groupsNeedUpdate=!1},THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(matrix){for(var normalMatrix=(new THREE.Matrix3).getNormalMatrix(matrix),i=0,il=this.vertices.length;il>i;i++){var vertex=this.vertices[i];vertex.applyMatrix4(matrix)}for(var i=0,il=this.faces.length;il>i;i++){var face=this.faces[i];face.normal.applyMatrix3(normalMatrix).normalize();for(var j=0,jl=face.vertexNormals.length;jl>j;j++)face.vertexNormals[j].applyMatrix3(normalMatrix).normalize(); +}null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this.verticesNeedUpdate=!0,this.normalsNeedUpdate=!0},rotateX:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationX(angle),this.applyMatrix(m1),this}}(),rotateY:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationY(angle),this.applyMatrix(m1),this}}(),rotateZ:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationZ(angle),this.applyMatrix(m1),this}}(),translate:function(){var m1;return function(x,y,z){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeTranslation(x,y,z),this.applyMatrix(m1),this}}(),scale:function(){var m1;return function(x,y,z){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeScale(x,y,z),this.applyMatrix(m1),this}}(),lookAt:function(){var obj;return function(vector){void 0===obj&&(obj=new THREE.Object3D),obj.lookAt(vector),obj.updateMatrix(),this.applyMatrix(obj.matrix)}}(),fromBufferGeometry:function(geometry){function addFace(a,b,c){var vertexNormals=void 0!==normals?[tempNormals[a].clone(),tempNormals[b].clone(),tempNormals[c].clone()]:[],vertexColors=void 0!==colors?[scope.colors[a].clone(),scope.colors[b].clone(),scope.colors[c].clone()]:[],face=new THREE.Face3(a,b,c,vertexNormals,vertexColors);scope.faces.push(face),void 0!==uvs&&scope.faceVertexUvs[0].push([tempUVs[a].clone(),tempUVs[b].clone(),tempUVs[c].clone()]),void 0!==uvs2&&scope.faceVertexUvs[1].push([tempUVs2[a].clone(),tempUVs2[b].clone(),tempUVs2[c].clone()])}var scope=this,indices=null!==geometry.index?geometry.index.array:void 0,attributes=geometry.attributes,vertices=attributes.position.array,normals=void 0!==attributes.normal?attributes.normal.array:void 0,colors=void 0!==attributes.color?attributes.color.array:void 0,uvs=void 0!==attributes.uv?attributes.uv.array:void 0,uvs2=void 0!==attributes.uv2?attributes.uv2.array:void 0;void 0!==uvs2&&(this.faceVertexUvs[1]=[]);for(var tempNormals=[],tempUVs=[],tempUVs2=[],i=0,j=0,k=0;i0)for(var i=0;ij;j+=3)addFace(indices[j],indices[j+1],indices[j+2]);else for(var i=0;if;f++){var face=this.faces[f],vA=this.vertices[face.a],vB=this.vertices[face.b],vC=this.vertices[face.c];cb.subVectors(vC,vB),ab.subVectors(vA,vB),cb.cross(ab),cb.normalize(),face.normal.copy(cb)}},computeVertexNormals:function(areaWeighted){var v,vl,f,fl,face,vertices;for(vertices=new Array(this.vertices.length),v=0,vl=this.vertices.length;vl>v;v++)vertices[v]=new THREE.Vector3;if(areaWeighted){var vA,vB,vC,cb=new THREE.Vector3,ab=new THREE.Vector3;for(f=0,fl=this.faces.length;fl>f;f++)face=this.faces[f],vA=this.vertices[face.a],vB=this.vertices[face.b],vC=this.vertices[face.c],cb.subVectors(vC,vB),ab.subVectors(vA,vB),cb.cross(ab),vertices[face.a].add(cb),vertices[face.b].add(cb),vertices[face.c].add(cb)}else for(f=0,fl=this.faces.length;fl>f;f++)face=this.faces[f],vertices[face.a].add(face.normal),vertices[face.b].add(face.normal),vertices[face.c].add(face.normal);for(v=0,vl=this.vertices.length;vl>v;v++)vertices[v].normalize();for(f=0,fl=this.faces.length;fl>f;f++){face=this.faces[f];var vertexNormals=face.vertexNormals;3===vertexNormals.length?(vertexNormals[0].copy(vertices[face.a]),vertexNormals[1].copy(vertices[face.b]),vertexNormals[2].copy(vertices[face.c])):(vertexNormals[0]=vertices[face.a].clone(),vertexNormals[1]=vertices[face.b].clone(),vertexNormals[2]=vertices[face.c].clone())}},computeMorphNormals:function(){var i,il,f,fl,face;for(f=0,fl=this.faces.length;fl>f;f++)for(face=this.faces[f],face.__originalFaceNormal?face.__originalFaceNormal.copy(face.normal):face.__originalFaceNormal=face.normal.clone(),face.__originalVertexNormals||(face.__originalVertexNormals=[]),i=0,il=face.vertexNormals.length;il>i;i++)face.__originalVertexNormals[i]?face.__originalVertexNormals[i].copy(face.vertexNormals[i]):face.__originalVertexNormals[i]=face.vertexNormals[i].clone();var tmpGeo=new THREE.Geometry;for(tmpGeo.faces=this.faces,i=0,il=this.morphTargets.length;il>i;i++){if(!this.morphNormals[i]){this.morphNormals[i]={},this.morphNormals[i].faceNormals=[],this.morphNormals[i].vertexNormals=[];var faceNormal,vertexNormals,dstNormalsFace=this.morphNormals[i].faceNormals,dstNormalsVertex=this.morphNormals[i].vertexNormals;for(f=0,fl=this.faces.length;fl>f;f++)faceNormal=new THREE.Vector3,vertexNormals={a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3},dstNormalsFace.push(faceNormal),dstNormalsVertex.push(vertexNormals)}var morphNormals=this.morphNormals[i];tmpGeo.vertices=this.morphTargets[i].vertices,tmpGeo.computeFaceNormals(),tmpGeo.computeVertexNormals();var faceNormal,vertexNormals;for(f=0,fl=this.faces.length;fl>f;f++)face=this.faces[f],faceNormal=morphNormals.faceNormals[f],vertexNormals=morphNormals.vertexNormals[f],faceNormal.copy(face.normal),vertexNormals.a.copy(face.vertexNormals[0]),vertexNormals.b.copy(face.vertexNormals[1]),vertexNormals.c.copy(face.vertexNormals[2])}for(f=0,fl=this.faces.length;fl>f;f++)face=this.faces[f],face.normal=face.__originalFaceNormal,face.vertexNormals=face.__originalVertexNormals},computeTangents:function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){for(var d=0,vertices=this.vertices,i=0,il=vertices.length;il>i;i++)i>0&&(d+=vertices[i].distanceTo(vertices[i-1])),this.lineDistances[i]=d},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3),this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere),this.boundingSphere.setFromPoints(this.vertices)},merge:function(geometry,matrix,materialIndexOffset){if(geometry instanceof THREE.Geometry==!1)return void console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",geometry);var normalMatrix,vertexOffset=this.vertices.length,vertices1=this.vertices,vertices2=geometry.vertices,faces1=this.faces,faces2=geometry.faces,uvs1=this.faceVertexUvs[0],uvs2=geometry.faceVertexUvs[0];void 0===materialIndexOffset&&(materialIndexOffset=0),void 0!==matrix&&(normalMatrix=(new THREE.Matrix3).getNormalMatrix(matrix));for(var i=0,il=vertices2.length;il>i;i++){var vertex=vertices2[i],vertexCopy=vertex.clone();void 0!==matrix&&vertexCopy.applyMatrix4(matrix),vertices1.push(vertexCopy)}for(i=0,il=faces2.length;il>i;i++){var faceCopy,normal,color,face=faces2[i],faceVertexNormals=face.vertexNormals,faceVertexColors=face.vertexColors;faceCopy=new THREE.Face3(face.a+vertexOffset,face.b+vertexOffset,face.c+vertexOffset),faceCopy.normal.copy(face.normal),void 0!==normalMatrix&&faceCopy.normal.applyMatrix3(normalMatrix).normalize();for(var j=0,jl=faceVertexNormals.length;jl>j;j++)normal=faceVertexNormals[j].clone(),void 0!==normalMatrix&&normal.applyMatrix3(normalMatrix).normalize(),faceCopy.vertexNormals.push(normal);faceCopy.color.copy(face.color);for(var j=0,jl=faceVertexColors.length;jl>j;j++)color=faceVertexColors[j],faceCopy.vertexColors.push(color.clone());faceCopy.materialIndex=face.materialIndex+materialIndexOffset,faces1.push(faceCopy)}for(i=0,il=uvs2.length;il>i;i++){var uv=uvs2[i],uvCopy=[];if(void 0!==uv){for(var j=0,jl=uv.length;jl>j;j++)uvCopy.push(uv[j].clone());uvs1.push(uvCopy)}}},mergeMesh:function(mesh){return mesh instanceof THREE.Mesh==!1?void console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",mesh):(mesh.matrixAutoUpdate&&mesh.updateMatrix(),void this.merge(mesh.geometry,mesh.matrix))},mergeVertices:function(){var v,key,i,il,face,indices,j,jl,verticesMap={},unique=[],changes=[],precisionPoints=4,precision=Math.pow(10,precisionPoints);for(i=0,il=this.vertices.length;il>i;i++)v=this.vertices[i],key=Math.round(v.x*precision)+"_"+Math.round(v.y*precision)+"_"+Math.round(v.z*precision),void 0===verticesMap[key]?(verticesMap[key]=i,unique.push(this.vertices[i]),changes[i]=unique.length-1):changes[i]=changes[verticesMap[key]];var faceIndicesToRemove=[];for(i=0,il=this.faces.length;il>i;i++){face=this.faces[i],face.a=changes[face.a],face.b=changes[face.b],face.c=changes[face.c],indices=[face.a,face.b,face.c];for(var dupIndex=-1,n=0;3>n;n++)if(indices[n]===indices[(n+1)%3]){dupIndex=n,faceIndicesToRemove.push(i);break}}for(i=faceIndicesToRemove.length-1;i>=0;i--){var idx=faceIndicesToRemove[i];for(this.faces.splice(idx,1),j=0,jl=this.faceVertexUvs.length;jl>j;j++)this.faceVertexUvs[j].splice(idx,1)}var diff=this.vertices.length-unique.length;return this.vertices=unique,diff},sortFacesByMaterialIndex:function(){function materialIndexSort(a,b){return a.materialIndex-b.materialIndex}for(var faces=this.faces,length=faces.length,i=0;length>i;i++)faces[i]._id=i;faces.sort(materialIndexSort);var newUvs1,newUvs2,uvs1=this.faceVertexUvs[0],uvs2=this.faceVertexUvs[1];uvs1&&uvs1.length===length&&(newUvs1=[]),uvs2&&uvs2.length===length&&(newUvs2=[]);for(var i=0;length>i;i++){var id=faces[i]._id;newUvs1&&newUvs1.push(uvs1[id]),newUvs2&&newUvs2.push(uvs2[id])}newUvs1&&(this.faceVertexUvs[0]=newUvs1),newUvs2&&(this.faceVertexUvs[1]=newUvs2)},toJSON:function(){function setBit(value,position,enabled){return enabled?value|1<0,hasFaceVertexNormal=face.vertexNormals.length>0,hasFaceColor=1!==face.color.r||1!==face.color.g||1!==face.color.b,hasFaceVertexColor=face.vertexColors.length>0,faceType=0;if(faceType=setBit(faceType,0,0),faceType=setBit(faceType,1,hasMaterial),faceType=setBit(faceType,2,hasFaceUv),faceType=setBit(faceType,3,hasFaceVertexUv),faceType=setBit(faceType,4,hasFaceNormal),faceType=setBit(faceType,5,hasFaceVertexNormal),faceType=setBit(faceType,6,hasFaceColor),faceType=setBit(faceType,7,hasFaceVertexColor),faces.push(faceType),faces.push(face.a,face.b,face.c),hasFaceVertexUv){var faceVertexUvs=this.faceVertexUvs[0][i];faces.push(getUvIndex(faceVertexUvs[0]),getUvIndex(faceVertexUvs[1]),getUvIndex(faceVertexUvs[2]))}if(hasFaceNormal&&faces.push(getNormalIndex(face.normal)),hasFaceVertexNormal){var vertexNormals=face.vertexNormals;faces.push(getNormalIndex(vertexNormals[0]),getNormalIndex(vertexNormals[1]),getNormalIndex(vertexNormals[2]))}if(hasFaceColor&&faces.push(getColorIndex(face.color)),hasFaceVertexColor){var vertexColors=face.vertexColors;faces.push(getColorIndex(vertexColors[0]),getColorIndex(vertexColors[1]),getColorIndex(vertexColors[2]))}}return data.data={},data.data.vertices=vertices,data.data.normals=normals,colors.length>0&&(data.data.colors=colors),uvs.length>0&&(data.data.uvs=[uvs]),data.data.faces=faces,data},clone:function(){return(new this.constructor).copy(this)},copy:function(source){this.vertices=[],this.faces=[],this.faceVertexUvs=[[]];for(var vertices=source.vertices,i=0,il=vertices.length;il>i;i++)this.vertices.push(vertices[i].clone());for(var faces=source.faces,i=0,il=faces.length;il>i;i++)this.faces.push(faces[i].clone());for(var i=0,il=source.faceVertexUvs.length;il>i;i++){var faceVertexUvs=source.faceVertexUvs[i];void 0===this.faceVertexUvs[i]&&(this.faceVertexUvs[i]=[]);for(var j=0,jl=faceVertexUvs.length;jl>j;j++){for(var uvs=faceVertexUvs[j],uvsCopy=[],k=0,kl=uvs.length;kl>k;k++){var uv=uvs[k];uvsCopy.push(uv.clone())}this.faceVertexUvs[i].push(uvsCopy)}}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}},THREE.EventDispatcher.prototype.apply(THREE.Geometry.prototype),THREE.GeometryIdCount=0,THREE.DirectGeometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++}),this.uuid=THREE.Math.generateUUID(),this.name="",this.type="DirectGeometry",this.indices=[],this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.uvs2=[],this.groups=[],this.morphTargets={},this.skinWeights=[],this.skinIndices=[],this.boundingBox=null,this.boundingSphere=null,this.verticesNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.uvsNeedUpdate=!1,this.groupsNeedUpdate=!1},THREE.DirectGeometry.prototype={constructor:THREE.DirectGeometry,computeBoundingBox:THREE.Geometry.prototype.computeBoundingBox,computeBoundingSphere:THREE.Geometry.prototype.computeBoundingSphere,computeFaceNormals:function(){console.warn("THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.")},computeVertexNormals:function(){console.warn("THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.")},computeGroups:function(geometry){for(var group,materialIndex,groups=[],faces=geometry.faces,i=0;i0,hasFaceVertexUv2=faceVertexUvs[1]&&faceVertexUvs[1].length>0,morphTargets=geometry.morphTargets,morphTargetsLength=morphTargets.length;if(morphTargetsLength>0){for(var morphTargetsPosition=[],i=0;morphTargetsLength>i;i++)morphTargetsPosition[i]=[];this.morphTargets.position=morphTargetsPosition}var morphNormals=geometry.morphNormals,morphNormalsLength=morphNormals.length;if(morphNormalsLength>0){for(var morphTargetsNormal=[],i=0;morphNormalsLength>i;i++)morphTargetsNormal[i]=[];this.morphTargets.normal=morphTargetsNormal}for(var skinIndices=geometry.skinIndices,skinWeights=geometry.skinWeights,hasSkinIndices=skinIndices.length===vertices.length,hasSkinWeights=skinWeights.length===vertices.length,i=0;ij;j++){var morphTarget=morphTargets[j].vertices;morphTargetsPosition[j].push(morphTarget[face.a],morphTarget[face.b],morphTarget[face.c])}for(var j=0;morphNormalsLength>j;j++){var morphNormal=morphNormals[j].vertexNormals[i];morphTargetsNormal[j].push(morphNormal.a,morphNormal.b,morphNormal.c)}hasSkinIndices&&this.skinIndices.push(skinIndices[face.a],skinIndices[face.b],skinIndices[face.c]),hasSkinWeights&&this.skinWeights.push(skinWeights[face.a],skinWeights[face.b],skinWeights[face.c])}return this.computeGroups(geometry),this.verticesNeedUpdate=geometry.verticesNeedUpdate,this.normalsNeedUpdate=geometry.normalsNeedUpdate,this.colorsNeedUpdate=geometry.colorsNeedUpdate,this.uvsNeedUpdate=geometry.uvsNeedUpdate,this.groupsNeedUpdate=geometry.groupsNeedUpdate,this},dispose:function(){this.dispatchEvent({type:"dispose"})}},THREE.EventDispatcher.prototype.apply(THREE.DirectGeometry.prototype),THREE.BufferGeometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++}),this.uuid=THREE.Math.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0}},THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,addIndex:function(index){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(index)},getIndex:function(){return this.index},setIndex:function(index){this.index=index},addAttribute:function(name,attribute){return attribute instanceof THREE.BufferAttribute==!1&&attribute instanceof THREE.InterleavedBufferAttribute==!1?(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),void this.addAttribute(name,new THREE.BufferAttribute(arguments[1],arguments[2]))):"index"===name?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),void this.setIndex(attribute)):void(this.attributes[name]=attribute)},getAttribute:function(name){return this.attributes[name]},removeAttribute:function(name){delete this.attributes[name]},get drawcalls(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups},get offsets(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups},addDrawCall:function(start,count,indexOffset){void 0!==indexOffset&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(start,count)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},addGroup:function(start,count,materialIndex){this.groups.push({start:start,count:count,materialIndex:void 0!==materialIndex?materialIndex:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(start,count){this.drawRange.start=start,this.drawRange.count=count},applyMatrix:function(matrix){var position=this.attributes.position;void 0!==position&&(matrix.applyToVector3Array(position.array),position.needsUpdate=!0);var normal=this.attributes.normal;if(void 0!==normal){var normalMatrix=(new THREE.Matrix3).getNormalMatrix(matrix);normalMatrix.applyToVector3Array(normal.array),normal.needsUpdate=!0}null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere()},rotateX:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationX(angle),this.applyMatrix(m1),this}}(),rotateY:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationY(angle),this.applyMatrix(m1),this}}(),rotateZ:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationZ(angle),this.applyMatrix(m1),this}}(),translate:function(){var m1;return function(x,y,z){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeTranslation(x,y,z),this.applyMatrix(m1),this}}(),scale:function(){var m1;return function(x,y,z){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeScale(x,y,z),this.applyMatrix(m1),this}}(),lookAt:function(){var obj;return function(vector){void 0===obj&&(obj=new THREE.Object3D),obj.lookAt(vector),obj.updateMatrix(),this.applyMatrix(obj.matrix)}}(),center:function(){this.computeBoundingBox();var offset=this.boundingBox.center().negate();return this.translate(offset.x,offset.y,offset.z),offset},setFromObject:function(object){var geometry=object.geometry;if(object instanceof THREE.Points||object instanceof THREE.Line){var positions=new THREE.Float32Attribute(3*geometry.vertices.length,3),colors=new THREE.Float32Attribute(3*geometry.colors.length,3);if(this.addAttribute("position",positions.copyVector3sArray(geometry.vertices)),this.addAttribute("color",colors.copyColorsArray(geometry.colors)),geometry.lineDistances&&geometry.lineDistances.length===geometry.vertices.length){var lineDistances=new THREE.Float32Attribute(geometry.lineDistances.length,1);this.addAttribute("lineDistance",lineDistances.copyArray(geometry.lineDistances))}null!==geometry.boundingSphere&&(this.boundingSphere=geometry.boundingSphere.clone()),null!==geometry.boundingBox&&(this.boundingBox=geometry.boundingBox.clone())}else object instanceof THREE.Mesh&&geometry instanceof THREE.Geometry&&this.fromGeometry(geometry);return this},updateFromObject:function(object){var geometry=object.geometry;if(object instanceof THREE.Mesh){var direct=geometry.__directGeometry;if(void 0===direct)return this.fromGeometry(geometry);direct.verticesNeedUpdate=geometry.verticesNeedUpdate,direct.normalsNeedUpdate=geometry.normalsNeedUpdate,direct.colorsNeedUpdate=geometry.colorsNeedUpdate,direct.uvsNeedUpdate=geometry.uvsNeedUpdate,direct.groupsNeedUpdate=geometry.groupsNeedUpdate,geometry.verticesNeedUpdate=!1,geometry.normalsNeedUpdate=!1,geometry.colorsNeedUpdate=!1,geometry.uvsNeedUpdate=!1,geometry.groupsNeedUpdate=!1,geometry=direct}if(geometry.verticesNeedUpdate===!0){var attribute=this.attributes.position;void 0!==attribute&&(attribute.copyVector3sArray(geometry.vertices),attribute.needsUpdate=!0),geometry.verticesNeedUpdate=!1}if(geometry.normalsNeedUpdate===!0){var attribute=this.attributes.normal;void 0!==attribute&&(attribute.copyVector3sArray(geometry.normals),attribute.needsUpdate=!0),geometry.normalsNeedUpdate=!1}if(geometry.colorsNeedUpdate===!0){var attribute=this.attributes.color;void 0!==attribute&&(attribute.copyColorsArray(geometry.colors),attribute.needsUpdate=!0),geometry.colorsNeedUpdate=!1}if(geometry.uvsNeedUpdate){var attribute=this.attributes.uv;void 0!==attribute&&(attribute.copyVector2sArray(geometry.uvs),attribute.needsUpdate=!0),geometry.uvsNeedUpdate=!1}if(geometry.lineDistancesNeedUpdate){var attribute=this.attributes.lineDistance;void 0!==attribute&&(attribute.copyArray(geometry.lineDistances),attribute.needsUpdate=!0),geometry.lineDistancesNeedUpdate=!1}return geometry.groupsNeedUpdate&&(geometry.computeGroups(object.geometry),this.groups=geometry.groups,geometry.groupsNeedUpdate=!1),this},fromGeometry:function(geometry){return geometry.__directGeometry=(new THREE.DirectGeometry).fromGeometry(geometry),this.fromDirectGeometry(geometry.__directGeometry)},fromDirectGeometry:function(geometry){var positions=new Float32Array(3*geometry.vertices.length);if(this.addAttribute("position",new THREE.BufferAttribute(positions,3).copyVector3sArray(geometry.vertices)),geometry.normals.length>0){var normals=new Float32Array(3*geometry.normals.length);this.addAttribute("normal",new THREE.BufferAttribute(normals,3).copyVector3sArray(geometry.normals))}if(geometry.colors.length>0){var colors=new Float32Array(3*geometry.colors.length);this.addAttribute("color",new THREE.BufferAttribute(colors,3).copyColorsArray(geometry.colors))}if(geometry.uvs.length>0){var uvs=new Float32Array(2*geometry.uvs.length);this.addAttribute("uv",new THREE.BufferAttribute(uvs,2).copyVector2sArray(geometry.uvs))}if(geometry.uvs2.length>0){var uvs2=new Float32Array(2*geometry.uvs2.length);this.addAttribute("uv2",new THREE.BufferAttribute(uvs2,2).copyVector2sArray(geometry.uvs2))}if(geometry.indices.length>0){var TypeArray=geometry.vertices.length>65535?Uint32Array:Uint16Array,indices=new TypeArray(3*geometry.indices.length);this.setIndex(new THREE.BufferAttribute(indices,1).copyIndicesArray(geometry.indices))}this.groups=geometry.groups;for(var name in geometry.morphTargets){for(var array=[],morphTargets=geometry.morphTargets[name],i=0,l=morphTargets.length;l>i;i++){var morphTarget=morphTargets[i],attribute=new THREE.Float32Attribute(3*morphTarget.length,3);array.push(attribute.copyVector3sArray(morphTarget))}this.morphAttributes[name]=array}if(geometry.skinIndices.length>0){var skinIndices=new THREE.Float32Attribute(4*geometry.skinIndices.length,4);this.addAttribute("skinIndex",skinIndices.copyVector4sArray(geometry.skinIndices))}if(geometry.skinWeights.length>0){var skinWeights=new THREE.Float32Attribute(4*geometry.skinWeights.length,4);this.addAttribute("skinWeight",skinWeights.copyVector4sArray(geometry.skinWeights))}return null!==geometry.boundingSphere&&(this.boundingSphere=geometry.boundingSphere.clone()),null!==geometry.boundingBox&&(this.boundingBox=geometry.boundingBox.clone()),this},computeBoundingBox:function(){var vector=new THREE.Vector3;return function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);var positions=this.attributes.position.array;if(positions){var bb=this.boundingBox;bb.makeEmpty();for(var i=0,il=positions.length;il>i;i+=3)vector.fromArray(positions,i),bb.expandByPoint(vector)}void 0!==positions&&0!==positions.length||(this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)),(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)}}(),computeBoundingSphere:function(){var box=new THREE.Box3,vector=new THREE.Vector3;return function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var positions=this.attributes.position.array;if(positions){box.makeEmpty();for(var center=this.boundingSphere.center,i=0,il=positions.length;il>i;i+=3)vector.fromArray(positions,i),box.expandByPoint(vector);box.center(center);for(var maxRadiusSq=0,i=0,il=positions.length;il>i;i+=3)vector.fromArray(positions,i),maxRadiusSq=Math.max(maxRadiusSq,center.distanceToSquared(vector));this.boundingSphere.radius=Math.sqrt(maxRadiusSq),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var index=this.index,attributes=this.attributes,groups=this.groups;if(attributes.position){var positions=attributes.position.array;if(void 0===attributes.normal)this.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(positions.length),3));else for(var normals=attributes.normal.array,i=0,il=normals.length;il>i;i++)normals[i]=0;var vA,vB,vC,normals=attributes.normal.array,pA=new THREE.Vector3,pB=new THREE.Vector3,pC=new THREE.Vector3,cb=new THREE.Vector3,ab=new THREE.Vector3;if(index){var indices=index.array;0===groups.length&&this.addGroup(0,indices.length);for(var j=0,jl=groups.length;jl>j;++j)for(var group=groups[j],start=group.start,count=group.count,i=start,il=start+count;il>i;i+=3)vA=3*indices[i+0],vB=3*indices[i+1],vC=3*indices[i+2],pA.fromArray(positions,vA),pB.fromArray(positions,vB),pC.fromArray(positions,vC),cb.subVectors(pC,pB),ab.subVectors(pA,pB),cb.cross(ab),normals[vA]+=cb.x,normals[vA+1]+=cb.y,normals[vA+2]+=cb.z,normals[vB]+=cb.x,normals[vB+1]+=cb.y,normals[vB+2]+=cb.z,normals[vC]+=cb.x,normals[vC+1]+=cb.y,normals[vC+2]+=cb.z}else for(var i=0,il=positions.length;il>i;i+=9)pA.fromArray(positions,i),pB.fromArray(positions,i+3),pC.fromArray(positions,i+6),cb.subVectors(pC,pB),ab.subVectors(pA,pB),cb.cross(ab),normals[i]=cb.x,normals[i+1]=cb.y,normals[i+2]=cb.z,normals[i+3]=cb.x,normals[i+4]=cb.y,normals[i+5]=cb.z,normals[i+6]=cb.x,normals[i+7]=cb.y,normals[i+8]=cb.z;this.normalizeNormals(),attributes.normal.needsUpdate=!0}},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(size){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},merge:function(geometry,offset){if(geometry instanceof THREE.BufferGeometry==!1)return void console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",geometry);void 0===offset&&(offset=0);var attributes=this.attributes;for(var key in attributes)if(void 0!==geometry.attributes[key])for(var attribute1=attributes[key],attributeArray1=attribute1.array,attribute2=geometry.attributes[key],attributeArray2=attribute2.array,attributeSize=attribute2.itemSize,i=0,j=attributeSize*offset;ii;i+=3)x=normals[i],y=normals[i+1],z=normals[i+2],n=1/Math.sqrt(x*x+y*y+z*z),normals[i]*=n,normals[i+1]*=n,normals[i+2]*=n},toJSON:function(){var data={metadata:{version:4.4,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(data.uuid=this.uuid,data.type=this.type,""!==this.name&&(data.name=this.name),void 0!==this.parameters){var parameters=this.parameters;for(var key in parameters)void 0!==parameters[key]&&(data[key]=parameters[key]);return data}data.data={attributes:{}};var index=this.index;if(null!==index){var array=Array.prototype.slice.call(index.array);data.data.index={type:index.array.constructor.name,array:array}}var attributes=this.attributes;for(var key in attributes){var attribute=attributes[key],array=Array.prototype.slice.call(attribute.array);data.data.attributes[key]={itemSize:attribute.itemSize,type:attribute.array.constructor.name,array:array}}var groups=this.groups;groups.length>0&&(data.data.groups=JSON.parse(JSON.stringify(groups)));var boundingSphere=this.boundingSphere;return null!==boundingSphere&&(data.data.boundingSphere={center:boundingSphere.center.toArray(),radius:boundingSphere.radius}),data},clone:function(){return(new this.constructor).copy(this); +},copy:function(source){var index=source.index;null!==index&&this.setIndex(index.clone());var attributes=source.attributes;for(var name in attributes){var attribute=attributes[name];this.addAttribute(name,attribute.clone())}for(var groups=source.groups,i=0,l=groups.length;l>i;i++){var group=groups[i];this.addGroup(group.start,group.count)}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}},THREE.EventDispatcher.prototype.apply(THREE.BufferGeometry.prototype),THREE.BufferGeometry.MaxIndex=65535,THREE.InstancedBufferGeometry=function(){THREE.BufferGeometry.call(this),this.type="InstancedBufferGeometry",this.maxInstancedCount=void 0},THREE.InstancedBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.InstancedBufferGeometry.prototype.constructor=THREE.InstancedBufferGeometry,THREE.InstancedBufferGeometry.prototype.addGroup=function(start,count,instances){this.groups.push({start:start,count:count,instances:instances})},THREE.InstancedBufferGeometry.prototype.copy=function(source){var index=source.index;null!==index&&this.setIndex(index.clone());var attributes=source.attributes;for(var name in attributes){var attribute=attributes[name];this.addAttribute(name,attribute.clone())}for(var groups=source.groups,i=0,l=groups.length;l>i;i++){var group=groups[i];this.addGroup(group.start,group.count,group.instances)}return this},THREE.EventDispatcher.prototype.apply(THREE.InstancedBufferGeometry.prototype),THREE.AnimationAction=function(clip,startTime,timeScale,weight,loop){if(void 0===clip)throw new Error("clip is null");this.clip=clip,this.localRoot=null,this.startTime=startTime||0,this.timeScale=timeScale||1,this.weight=weight||1,this.loop=loop||THREE.LoopRepeat,this.loopCount=0,this.enabled=!0,this.actionTime=-this.startTime,this.clipTime=0,this.propertyBindings=[]},THREE.AnimationAction.prototype={constructor:THREE.AnimationAction,setLocalRoot:function(localRoot){return this.localRoot=localRoot,this},updateTime:function(clipDeltaTime){var previousClipTime=this.clipTime,previousLoopCount=this.loopCount,duration=(this.actionTime,this.clip.duration);if(this.actionTime=this.actionTime+clipDeltaTime,this.loop===THREE.LoopOnce)return this.loopCount=0,this.clipTime=Math.min(Math.max(this.actionTime,0),duration),this.clipTime!==previousClipTime&&(this.clipTime===duration?this.mixer.dispatchEvent({type:"finished",action:this,direction:1}):0===this.clipTime&&this.mixer.dispatchEvent({type:"finished",action:this,direction:-1})),this.clipTime;this.loopCount=Math.floor(this.actionTime/duration);var newClipTime=this.actionTime-this.loopCount*duration;return newClipTime%=duration,this.loop==THREE.LoopPingPong&&1===Math.abs(this.loopCount%2)&&(newClipTime=duration-newClipTime),this.clipTime=newClipTime,this.loopCount!==previousLoopCount&&this.mixer.dispatchEvent({type:"loop",action:this,loopDelta:this.loopCount-this.loopCount}),this.clipTime},syncWith:function(action){return this.actionTime=action.actionTime,this.timeScale=action.timeScale,this},warpToDuration:function(duration){return this.timeScale=this.clip.duration/duration,this},init:function(time){return this.clipTime=time-this.startTime,this},update:function(clipDeltaTime){this.updateTime(clipDeltaTime);var clipResults=this.clip.getAt(this.clipTime);return clipResults},getTimeScaleAt:function(time){return this.timeScale.getAt?this.timeScale.getAt(time):this.timeScale},getWeightAt:function(time){return this.weight.getAt?this.weight.getAt(time):this.weight}},THREE.AnimationClip=function(name,duration,tracks){if(this.name=name,this.tracks=tracks,this.duration=void 0!==duration?duration:-1,this.duration<0)for(var i=0;ii;i++){var keys=[];keys.push({time:(i+numMorphTargets-1)%numMorphTargets,value:0}),keys.push({time:i,value:1}),keys.push({time:(i+1)%numMorphTargets,value:0}),keys.sort(THREE.KeyframeTrack.keyComparer),0===keys[0].time&&keys.push({time:numMorphTargets,value:keys[0].value}),tracks.push(new THREE.NumberKeyframeTrack(".morphTargetInfluences["+morphTargetSequence[i].name+"]",keys).scale(1/fps))}return new THREE.AnimationClip(name,-1,tracks)},THREE.AnimationClip.findByName=function(clipArray,name){for(var i=0;ii;i++){var morphTarget=morphTargets[i],parts=morphTarget.name.match(pattern);if(parts&&parts.length>1){var name=parts[1],animationMorphTargets=animationToMorphTargets[name];animationMorphTargets||(animationToMorphTargets[name]=animationMorphTargets=[]),animationMorphTargets.push(morphTarget)}}var clips=[];for(var name in animationToMorphTargets)clips.push(THREE.AnimationClip.CreateFromMorphTargetSequence(name,animationToMorphTargets[name],fps));return clips},THREE.AnimationClip.parse=function(json){for(var tracks=[],i=0;i0?new trackType(trackName,keys):null},tracks=[],clipName=animation.name||"default",duration=animation.length||-1,fps=animation.fps||30,hierarchyTracks=animation.hierarchy||[],h=0;halpha?a:b},lerp_boolean_immediate:function(a,b,alpha){return a},lerp_string:function(a,b,alpha){return.5>alpha?a:b},lerp_string_immediate:function(a,b,alpha){return a},getLerpFunc:function(exemplarValue,interTrack){if(void 0===exemplarValue||null===exemplarValue)throw new Error("examplarValue is null");var typeName=typeof exemplarValue;switch(typeName){case"object":if(exemplarValue.lerp)return THREE.AnimationUtils.lerp_object;if(exemplarValue.slerp)return THREE.AnimationUtils.slerp_object;break;case"number":return THREE.AnimationUtils.lerp_number;case"boolean":return interTrack?THREE.AnimationUtils.lerp_boolean:THREE.AnimationUtils.lerp_boolean_immediate;case"string":return interTrack?THREE.AnimationUtils.lerp_string:THREE.AnimationUtils.lerp_string_immediate}}},THREE.KeyframeTrack=function(name,keys){if(void 0===name)throw new Error("track name is undefined");if(void 0===keys||0===keys.length)throw new Error("no keys in track named "+name);this.name=name,this.keys=keys,this.lastIndex=0,this.validate(),this.optimize()},THREE.KeyframeTrack.prototype={constructor:THREE.KeyframeTrack,getAt:function(time){for(;this.lastIndex=this.keys[this.lastIndex].time;)this.lastIndex++;for(;this.lastIndex>0&&time=this.keys.length)return this.setResult(this.keys[this.keys.length-1].value),this.result;if(0===this.lastIndex)return this.setResult(this.keys[0].value),this.result;var prevKey=this.keys[this.lastIndex-1];if(this.setResult(prevKey.value),prevKey.constantToNext)return this.result;var currentKey=this.keys[this.lastIndex],alpha=(time-prevKey.time)/(currentKey.time-prevKey.time);return this.result=this.lerpValues(this.result,currentKey.value,alpha),this.result},shift:function(timeOffset){if(0!==timeOffset)for(var i=0;i0&&this.keys[i]>=endTime;i++)lastKeysToRemove++;return firstKeysToRemove+lastKeysToRemove>0&&(this.keys=this.keys.splice(firstKeysToRemove,this.keys.length-lastKeysToRemove-firstKeysToRemove)),this},validate:function(){var prevKey=null;if(0===this.keys.length)return void console.error(" track is empty, no keys",this);for(var i=0;icurrKey.time)return void console.error(" key.time is less than previous key time, out of order keys",this,i,currKey,prevKey);prevKey=currKey}return this},optimize:function(){var newKeys=[],prevKey=this.keys[0];newKeys.push(prevKey);for(var i=(THREE.AnimationUtils.getEqualsFunc(prevKey.value),1);i0&&(null===this.cumulativeValue&&(this.cumulativeValue=THREE.AnimationUtils.clone(value)),this.cumulativeWeight=weight);else{var lerpAlpha=weight/(this.cumulativeWeight+weight);this.cumulativeValue=this.lerpValue(this.cumulativeValue,value,lerpAlpha),this.cumulativeWeight+=weight}},unbind:function(){this.isBound&&(this.setValue(this.originalValue),this.setValue=null,this.getValue=null,this.lerpValue=null,this.equalsValue=null,this.triggerDirty=null,this.isBound=!1)},bind:function(){if(!this.isBound){var targetObject=this.node;if(!targetObject)return void console.error(" trying to update node for track: "+this.trackName+" but it wasn't found.");if(this.objectName){if("materials"===this.objectName){if(!targetObject.material)return void console.error(" can not bind to material as node does not have a material",this);if(!targetObject.material.materials)return void console.error(" can not bind to material.materials as node.material does not have a materials array",this);targetObject=targetObject.material.materials}else if("bones"===this.objectName){if(!targetObject.skeleton)return void console.error(" can not bind to bones as node does not have a skeleton",this);targetObject=targetObject.skeleton.bones;for(var i=0;i0){if(this.cumulativeWeight<1){var remainingWeight=1-this.cumulativeWeight,lerpAlpha=remainingWeight/(this.cumulativeWeight+remainingWeight);this.cumulativeValue=this.lerpValue(this.cumulativeValue,this.originalValue,lerpAlpha)}var valueChanged=this.setValue(this.cumulativeValue);valueChanged&&this.triggerDirty&&this.triggerDirty(),this.cumulativeValue=null,this.cumulativeWeight=0}}},THREE.PropertyBinding.parseTrackName=function(trackName){var re=/^(([\w]+\/)*)([\w-\d]+)?(\.([\w]+)(\[([\w\d\[\]\_. ]+)\])?)?(\.([\w.]+)(\[([\w\d\[\]\_. ]+)\])?)$/,matches=re.exec(trackName);if(!matches)throw new Error("cannot parse trackName at all: "+trackName);matches.index===re.lastIndex&&re.lastIndex++;var results={directoryName:matches[1],nodeName:matches[3],objectName:matches[5],objectIndex:matches[7],propertyName:matches[9],propertyIndex:matches[11]};if(null===results.propertyName||0===results.propertyName.length)throw new Error("can not parse propertyName from trackName: "+trackName);return results},THREE.PropertyBinding.findNode=function(root,nodeName){function searchSkeleton(skeleton){for(var i=0;ialpha?value0:value1},THREE.StringKeyframeTrack.prototype.compareValues=function(value0,value1){return value0===value1},THREE.StringKeyframeTrack.prototype.clone=function(){for(var clonedKeys=[],i=0;ialpha?value0:value1},THREE.BooleanKeyframeTrack.prototype.compareValues=function(value0,value1){return value0===value1},THREE.BooleanKeyframeTrack.prototype.clone=function(){for(var clonedKeys=[],i=0;ii;i+=2){var regex=handlers[i],loader=handlers[i+1];if(regex.test(file))return loader}return null}},THREE.XHRLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager},THREE.XHRLoader.prototype={constructor:THREE.XHRLoader,load:function(url,onLoad,onProgress,onError){var scope=this,cached=THREE.Cache.get(url);if(void 0!==cached)return onLoad&&setTimeout(function(){onLoad(cached)},0),cached;var request=new XMLHttpRequest;return request.open("GET",url,!0),request.addEventListener("load",function(event){var response=event.target.response;THREE.Cache.add(url,response),onLoad&&onLoad(response),scope.manager.itemEnd(url)},!1),void 0!==onProgress&&request.addEventListener("progress",function(event){onProgress(event)},!1),request.addEventListener("error",function(event){onError&&onError(event),scope.manager.itemError(url)},!1),void 0!==this.crossOrigin&&(request.crossOrigin=this.crossOrigin),void 0!==this.responseType&&(request.responseType=this.responseType),void 0!==this.withCredentials&&(request.withCredentials=this.withCredentials),request.send(null),scope.manager.itemStart(url),request},setResponseType:function(value){this.responseType=value},setCrossOrigin:function(value){this.crossOrigin=value},setWithCredentials:function(value){this.withCredentials=value}},THREE.ImageLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager},THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(url,onLoad,onProgress,onError){var scope=this,cached=THREE.Cache.get(url);if(void 0!==cached)return scope.manager.itemStart(url),onLoad?setTimeout(function(){onLoad(cached),scope.manager.itemEnd(url)},0):scope.manager.itemEnd(url),cached;var image=document.createElement("img");return image.addEventListener("load",function(event){THREE.Cache.add(url,this),onLoad&&onLoad(this),scope.manager.itemEnd(url)},!1),void 0!==onProgress&&image.addEventListener("progress",function(event){onProgress(event)},!1),image.addEventListener("error",function(event){onError&&onError(event),scope.manager.itemError(url)},!1),void 0!==this.crossOrigin&&(image.crossOrigin=this.crossOrigin),scope.manager.itemStart(url),image.src=url,image},setCrossOrigin:function(value){this.crossOrigin=value}},THREE.JSONLoader=function(manager){"boolean"==typeof manager&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),manager=void 0),this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager,this.withCredentials=!1},THREE.JSONLoader.prototype={constructor:THREE.JSONLoader,get statusDomElement(){return void 0===this._statusDomElement&&(this._statusDomElement=document.createElement("div")),console.warn("THREE.JSONLoader: .statusDomElement has been removed."),this._statusDomElement},load:function(url,onLoad,onProgress,onError){var scope=this,texturePath=this.texturePath&&"string"==typeof this.texturePath?this.texturePath:THREE.Loader.prototype.extractUrlBase(url),loader=new THREE.XHRLoader(this.manager);loader.setCrossOrigin(this.crossOrigin),loader.setWithCredentials(this.withCredentials),loader.load(url,function(text){var json=JSON.parse(text),metadata=json.metadata;if(void 0!==metadata){if("object"===metadata.type)return void console.error("THREE.JSONLoader: "+url+" should be loaded with THREE.ObjectLoader instead.");if("scene"===metadata.type)return void console.error("THREE.JSONLoader: "+url+" should be loaded with THREE.SceneLoader instead.")}var object=scope.parse(json,texturePath);onLoad(object.geometry,object.materials)})},setCrossOrigin:function(value){this.crossOrigin=value},setTexturePath:function(value){this.texturePath=value},parse:function(json,texturePath){function parseModel(scale){function isBitSet(value,position){return value&1<i;i++)geometry.faceVertexUvs[i]=[]}for(offset=0,zLength=vertices.length;zLength>offset;)vertex=new THREE.Vector3,vertex.x=vertices[offset++]*scale,vertex.y=vertices[offset++]*scale,vertex.z=vertices[offset++]*scale,geometry.vertices.push(vertex);for(offset=0,zLength=faces.length;zLength>offset;)if(type=faces[offset++],isQuad=isBitSet(type,0),hasMaterial=isBitSet(type,1),hasFaceVertexUv=isBitSet(type,3),hasFaceNormal=isBitSet(type,4),hasFaceVertexNormal=isBitSet(type,5),hasFaceColor=isBitSet(type,6),hasFaceVertexColor=isBitSet(type,7),isQuad){if(faceA=new THREE.Face3,faceA.a=faces[offset],faceA.b=faces[offset+1],faceA.c=faces[offset+3],faceB=new THREE.Face3,faceB.a=faces[offset+1],faceB.b=faces[offset+2],faceB.c=faces[offset+3],offset+=4,hasMaterial&&(materialIndex=faces[offset++],faceA.materialIndex=materialIndex,faceB.materialIndex=materialIndex),fi=geometry.faces.length,hasFaceVertexUv)for(i=0;nUvLayers>i;i++)for(uvLayer=json.uvs[i],geometry.faceVertexUvs[i][fi]=[],geometry.faceVertexUvs[i][fi+1]=[],j=0;4>j;j++)uvIndex=faces[offset++],u=uvLayer[2*uvIndex],v=uvLayer[2*uvIndex+1],uv=new THREE.Vector2(u,v),2!==j&&geometry.faceVertexUvs[i][fi].push(uv),0!==j&&geometry.faceVertexUvs[i][fi+1].push(uv);if(hasFaceNormal&&(normalIndex=3*faces[offset++],faceA.normal.set(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]),faceB.normal.copy(faceA.normal)),hasFaceVertexNormal)for(i=0;4>i;i++)normalIndex=3*faces[offset++],normal=new THREE.Vector3(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]),2!==i&&faceA.vertexNormals.push(normal),0!==i&&faceB.vertexNormals.push(normal);if(hasFaceColor&&(colorIndex=faces[offset++],hex=colors[colorIndex],faceA.color.setHex(hex),faceB.color.setHex(hex)),hasFaceVertexColor)for(i=0;4>i;i++)colorIndex=faces[offset++],hex=colors[colorIndex],2!==i&&faceA.vertexColors.push(new THREE.Color(hex)),0!==i&&faceB.vertexColors.push(new THREE.Color(hex));geometry.faces.push(faceA),geometry.faces.push(faceB)}else{if(face=new THREE.Face3,face.a=faces[offset++],face.b=faces[offset++],face.c=faces[offset++],hasMaterial&&(materialIndex=faces[offset++],face.materialIndex=materialIndex),fi=geometry.faces.length,hasFaceVertexUv)for(i=0;nUvLayers>i;i++)for(uvLayer=json.uvs[i],geometry.faceVertexUvs[i][fi]=[],j=0;3>j;j++)uvIndex=faces[offset++],u=uvLayer[2*uvIndex],v=uvLayer[2*uvIndex+1],uv=new THREE.Vector2(u,v),geometry.faceVertexUvs[i][fi].push(uv);if(hasFaceNormal&&(normalIndex=3*faces[offset++],face.normal.set(normals[normalIndex++],normals[normalIndex++],normals[normalIndex])),hasFaceVertexNormal)for(i=0;3>i;i++)normalIndex=3*faces[offset++],normal=new THREE.Vector3(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]),face.vertexNormals.push(normal);if(hasFaceColor&&(colorIndex=faces[offset++],face.color.setHex(colors[colorIndex])),hasFaceVertexColor)for(i=0;3>i;i++)colorIndex=faces[offset++],face.vertexColors.push(new THREE.Color(colors[colorIndex]));geometry.faces.push(face)}}function parseSkin(){var influencesPerVertex=void 0!==json.influencesPerVertex?json.influencesPerVertex:2;if(json.skinWeights)for(var i=0,l=json.skinWeights.length;l>i;i+=influencesPerVertex){var x=json.skinWeights[i],y=influencesPerVertex>1?json.skinWeights[i+1]:0,z=influencesPerVertex>2?json.skinWeights[i+2]:0,w=influencesPerVertex>3?json.skinWeights[i+3]:0;geometry.skinWeights.push(new THREE.Vector4(x,y,z,w))}if(json.skinIndices)for(var i=0,l=json.skinIndices.length;l>i;i+=influencesPerVertex){var a=json.skinIndices[i],b=influencesPerVertex>1?json.skinIndices[i+1]:0,c=influencesPerVertex>2?json.skinIndices[i+2]:0,d=influencesPerVertex>3?json.skinIndices[i+3]:0;geometry.skinIndices.push(new THREE.Vector4(a,b,c,d))}geometry.bones=json.bones,geometry.bones&&geometry.bones.length>0&&(geometry.skinWeights.length!==geometry.skinIndices.length||geometry.skinIndices.length!==geometry.vertices.length)&&console.warn("When skinning, number of vertices ("+geometry.vertices.length+"), skinIndices ("+geometry.skinIndices.length+"), and skinWeights ("+geometry.skinWeights.length+") should match.")}function parseMorphing(scale){if(void 0!==json.morphTargets)for(var i=0,l=json.morphTargets.length;l>i;i++){geometry.morphTargets[i]={},geometry.morphTargets[i].name=json.morphTargets[i].name,geometry.morphTargets[i].vertices=[];for(var dstVertices=geometry.morphTargets[i].vertices,srcVertices=json.morphTargets[i].vertices,v=0,vl=srcVertices.length;vl>v;v+=3){var vertex=new THREE.Vector3;vertex.x=srcVertices[v]*scale,vertex.y=srcVertices[v+1]*scale,vertex.z=srcVertices[v+2]*scale,dstVertices.push(vertex)}}if(void 0!==json.morphColors&&json.morphColors.length>0){console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.');for(var faces=geometry.faces,morphColors=json.morphColors[0].colors,i=0,l=faces.length;l>i;i++)faces[i].color.fromArray(morphColors,3*i)}}function parseAnimations(){var outputAnimations=[],animations=[];void 0!==json.animation&&animations.push(json.animation),void 0!==json.animations&&(json.animations.length?animations=animations.concat(json.animations):animations.push(json.animations));for(var i=0;i0&&(geometry.animations=outputAnimations)}var geometry=new THREE.Geometry,scale=void 0!==json.scale?1/json.scale:1;if(parseModel(scale),parseSkin(),parseMorphing(scale),parseAnimations(),geometry.computeFaceNormals(),geometry.computeBoundingSphere(),void 0===json.materials||0===json.materials.length)return{geometry:geometry};var materials=THREE.Loader.prototype.initMaterials(json.materials,texturePath,this.crossOrigin);return{geometry:geometry,materials:materials}}},THREE.LoadingManager=function(onLoad,onProgress,onError){var scope=this,isLoading=!1,itemsLoaded=0,itemsTotal=0;this.onStart=void 0,this.onLoad=onLoad,this.onProgress=onProgress,this.onError=onError,this.itemStart=function(url){itemsTotal++,isLoading===!1&&void 0!==scope.onStart&&scope.onStart(url,itemsLoaded,itemsTotal),isLoading=!0},this.itemEnd=function(url){itemsLoaded++,void 0!==scope.onProgress&&scope.onProgress(url,itemsLoaded,itemsTotal),itemsLoaded===itemsTotal&&(isLoading=!1,void 0!==scope.onLoad&&scope.onLoad())},this.itemError=function(url){void 0!==scope.onError&&scope.onError(url)}},THREE.DefaultLoadingManager=new THREE.LoadingManager,THREE.BufferGeometryLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager},THREE.BufferGeometryLoader.prototype={constructor:THREE.BufferGeometryLoader,load:function(url,onLoad,onProgress,onError){var scope=this,loader=new THREE.XHRLoader(scope.manager);loader.setCrossOrigin(this.crossOrigin),loader.load(url,function(text){onLoad(scope.parse(JSON.parse(text)))},onProgress,onError)},setCrossOrigin:function(value){this.crossOrigin=value},parse:function(json){var geometry=new THREE.BufferGeometry,index=json.data.index;if(void 0!==index){var typedArray=new self[index.type](index.array);geometry.setIndex(new THREE.BufferAttribute(typedArray,1))}var attributes=json.data.attributes;for(var key in attributes){var attribute=attributes[key],typedArray=new self[attribute.type](attribute.array);geometry.addAttribute(key,new THREE.BufferAttribute(typedArray,attribute.itemSize))}var groups=json.data.groups||json.data.drawcalls||json.data.offsets;if(void 0!==groups)for(var i=0,n=groups.length;i!==n;++i){var group=groups[i];geometry.addGroup(group.start,group.count)}var boundingSphere=json.data.boundingSphere;if(void 0!==boundingSphere){var center=new THREE.Vector3;void 0!==boundingSphere.center&¢er.fromArray(boundingSphere.center),geometry.boundingSphere=new THREE.Sphere(center,boundingSphere.radius)}return geometry}},THREE.MaterialLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager,this.textures={}},THREE.MaterialLoader.prototype={constructor:THREE.MaterialLoader,load:function(url,onLoad,onProgress,onError){var scope=this,loader=new THREE.XHRLoader(scope.manager);loader.setCrossOrigin(this.crossOrigin),loader.load(url,function(text){onLoad(scope.parse(JSON.parse(text)))},onProgress,onError)},setCrossOrigin:function(value){this.crossOrigin=value},setTextures:function(value){this.textures=value},getTexture:function(name){var textures=this.textures;return void 0===textures[name]&&console.warn("THREE.MaterialLoader: Undefined texture",name),textures[name]},parse:function(json){var material=new THREE[json.type];if(material.uuid=json.uuid,void 0!==json.name&&(material.name=json.name),void 0!==json.color&&material.color.setHex(json.color),void 0!==json.emissive&&material.emissive.setHex(json.emissive),void 0!==json.specular&&material.specular.setHex(json.specular),void 0!==json.shininess&&(material.shininess=json.shininess),void 0!==json.uniforms&&(material.uniforms=json.uniforms),void 0!==json.vertexShader&&(material.vertexShader=json.vertexShader),void 0!==json.fragmentShader&&(material.fragmentShader=json.fragmentShader),void 0!==json.vertexColors&&(material.vertexColors=json.vertexColors),void 0!==json.shading&&(material.shading=json.shading),void 0!==json.blending&&(material.blending=json.blending),void 0!==json.side&&(material.side=json.side),void 0!==json.opacity&&(material.opacity=json.opacity),void 0!==json.transparent&&(material.transparent=json.transparent),void 0!==json.alphaTest&&(material.alphaTest=json.alphaTest),void 0!==json.depthTest&&(material.depthTest=json.depthTest),void 0!==json.depthWrite&&(material.depthWrite=json.depthWrite),void 0!==json.wireframe&&(material.wireframe=json.wireframe),void 0!==json.wireframeLinewidth&&(material.wireframeLinewidth=json.wireframeLinewidth),void 0!==json.size&&(material.size=json.size),void 0!==json.sizeAttenuation&&(material.sizeAttenuation=json.sizeAttenuation),void 0!==json.map&&(material.map=this.getTexture(json.map)),void 0!==json.alphaMap&&(material.alphaMap=this.getTexture(json.alphaMap),material.transparent=!0),void 0!==json.bumpMap&&(material.bumpMap=this.getTexture(json.bumpMap)),void 0!==json.bumpScale&&(material.bumpScale=json.bumpScale),void 0!==json.normalMap&&(material.normalMap=this.getTexture(json.normalMap)),json.normalScale&&(material.normalScale=new THREE.Vector2(json.normalScale,json.normalScale)),void 0!==json.displacementMap&&(material.displacementMap=this.getTexture(json.displacementMap)),void 0!==json.displacementScale&&(material.displacementScale=json.displacementScale),void 0!==json.displacementBias&&(material.displacementBias=json.displacementBias),void 0!==json.specularMap&&(material.specularMap=this.getTexture(json.specularMap)),void 0!==json.envMap&&(material.envMap=this.getTexture(json.envMap),material.combine=THREE.MultiplyOperation),json.reflectivity&&(material.reflectivity=json.reflectivity),void 0!==json.lightMap&&(material.lightMap=this.getTexture(json.lightMap)),void 0!==json.lightMapIntensity&&(material.lightMapIntensity=json.lightMapIntensity),void 0!==json.aoMap&&(material.aoMap=this.getTexture(json.aoMap)),void 0!==json.aoMapIntensity&&(material.aoMapIntensity=json.aoMapIntensity),void 0!==json.materials)for(var i=0,l=json.materials.length;l>i;i++)material.materials.push(this.parse(json.materials[i]));return material}},THREE.ObjectLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager,this.texturePath=""},THREE.ObjectLoader.prototype={constructor:THREE.ObjectLoader,load:function(url,onLoad,onProgress,onError){""===this.texturePath&&(this.texturePath=url.substring(0,url.lastIndexOf("/")+1));var scope=this,loader=new THREE.XHRLoader(scope.manager);loader.setCrossOrigin(this.crossOrigin),loader.load(url,function(text){scope.parse(JSON.parse(text),onLoad)},onProgress,onError)},setTexturePath:function(value){this.texturePath=value},setCrossOrigin:function(value){this.crossOrigin=value},parse:function(json,onLoad){var geometries=this.parseGeometries(json.geometries),images=this.parseImages(json.images,function(){void 0!==onLoad&&onLoad(object)}),textures=this.parseTextures(json.textures,images),materials=this.parseMaterials(json.materials,textures),object=this.parseObject(json.object,geometries,materials);return json.animations&&(object.animations=this.parseAnimations(json.animations)),void 0!==json.images&&0!==json.images.length||void 0!==onLoad&&onLoad(object),object},parseGeometries:function(json){var geometries={};if(void 0!==json)for(var geometryLoader=new THREE.JSONLoader,bufferGeometryLoader=new THREE.BufferGeometryLoader,i=0,l=json.length;l>i;i++){var geometry,data=json[i];switch(data.type){case"PlaneGeometry":case"PlaneBufferGeometry":geometry=new THREE[data.type](data.width,data.height,data.widthSegments,data.heightSegments);break;case"BoxGeometry":case"CubeGeometry":geometry=new THREE.BoxGeometry(data.width,data.height,data.depth,data.widthSegments,data.heightSegments,data.depthSegments);break;case"CircleBufferGeometry":geometry=new THREE.CircleBufferGeometry(data.radius,data.segments,data.thetaStart,data.thetaLength);break;case"CircleGeometry":geometry=new THREE.CircleGeometry(data.radius,data.segments,data.thetaStart,data.thetaLength);break;case"CylinderGeometry":geometry=new THREE.CylinderGeometry(data.radiusTop,data.radiusBottom,data.height,data.radialSegments,data.heightSegments,data.openEnded,data.thetaStart,data.thetaLength);break;case"SphereGeometry":geometry=new THREE.SphereGeometry(data.radius,data.widthSegments,data.heightSegments,data.phiStart,data.phiLength,data.thetaStart,data.thetaLength);break;case"SphereBufferGeometry":geometry=new THREE.SphereBufferGeometry(data.radius,data.widthSegments,data.heightSegments,data.phiStart,data.phiLength,data.thetaStart,data.thetaLength);break;case"DodecahedronGeometry":geometry=new THREE.DodecahedronGeometry(data.radius,data.detail);break;case"IcosahedronGeometry":geometry=new THREE.IcosahedronGeometry(data.radius,data.detail);break;case"OctahedronGeometry":geometry=new THREE.OctahedronGeometry(data.radius,data.detail);break;case"TetrahedronGeometry":geometry=new THREE.TetrahedronGeometry(data.radius,data.detail);break;case"RingGeometry":geometry=new THREE.RingGeometry(data.innerRadius,data.outerRadius,data.thetaSegments,data.phiSegments,data.thetaStart,data.thetaLength);break;case"TorusGeometry":geometry=new THREE.TorusGeometry(data.radius,data.tube,data.radialSegments,data.tubularSegments,data.arc);break;case"TorusKnotGeometry":geometry=new THREE.TorusKnotGeometry(data.radius,data.tube,data.radialSegments,data.tubularSegments,data.p,data.q,data.heightScale);break;case"BufferGeometry":geometry=bufferGeometryLoader.parse(data);break;case"Geometry": +geometry=geometryLoader.parse(data.data,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+data.type+'"');continue}geometry.uuid=data.uuid,void 0!==data.name&&(geometry.name=data.name),geometries[data.uuid]=geometry}return geometries},parseMaterials:function(json,textures){var materials={};if(void 0!==json){var loader=new THREE.MaterialLoader;loader.setTextures(textures);for(var i=0,l=json.length;l>i;i++){var material=loader.parse(json[i]);materials[material.uuid]=material}}return materials},parseAnimations:function(json){for(var animations=[],i=0;i0){var manager=new THREE.LoadingManager(onLoad),loader=new THREE.ImageLoader(manager);loader.setCrossOrigin(this.crossOrigin);for(var i=0,l=json.length;l>i;i++){var image=json[i],path=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url)?image.url:scope.texturePath+image.url;images[image.uuid]=loadImage(path)}}return images},parseTextures:function(json,images){function parseConstant(value){return"number"==typeof value?value:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",value),THREE[value])}var textures={};if(void 0!==json)for(var i=0,l=json.length;l>i;i++){var data=json[i];void 0===data.image&&console.warn('THREE.ObjectLoader: No "image" specified for',data.uuid),void 0===images[data.image]&&console.warn("THREE.ObjectLoader: Undefined image",data.image);var texture=new THREE.Texture(images[data.image]);texture.needsUpdate=!0,texture.uuid=data.uuid,void 0!==data.name&&(texture.name=data.name),void 0!==data.mapping&&(texture.mapping=parseConstant(data.mapping)),void 0!==data.offset&&(texture.offset=new THREE.Vector2(data.offset[0],data.offset[1])),void 0!==data.repeat&&(texture.repeat=new THREE.Vector2(data.repeat[0],data.repeat[1])),void 0!==data.minFilter&&(texture.minFilter=parseConstant(data.minFilter)),void 0!==data.magFilter&&(texture.magFilter=parseConstant(data.magFilter)),void 0!==data.anisotropy&&(texture.anisotropy=data.anisotropy),Array.isArray(data.wrap)&&(texture.wrapS=parseConstant(data.wrap[0]),texture.wrapT=parseConstant(data.wrap[1])),textures[data.uuid]=texture}return textures},parseObject:function(){var matrix=new THREE.Matrix4;return function(data,geometries,materials){function getGeometry(name){return void 0===geometries[name]&&console.warn("THREE.ObjectLoader: Undefined geometry",name),geometries[name]}function getMaterial(name){return void 0!==name?(void 0===materials[name]&&console.warn("THREE.ObjectLoader: Undefined material",name),materials[name]):void 0}var object;switch(data.type){case"Scene":object=new THREE.Scene;break;case"PerspectiveCamera":object=new THREE.PerspectiveCamera(data.fov,data.aspect,data.near,data.far);break;case"OrthographicCamera":object=new THREE.OrthographicCamera(data.left,data.right,data.top,data.bottom,data.near,data.far);break;case"AmbientLight":object=new THREE.AmbientLight(data.color);break;case"DirectionalLight":object=new THREE.DirectionalLight(data.color,data.intensity);break;case"PointLight":object=new THREE.PointLight(data.color,data.intensity,data.distance,data.decay);break;case"SpotLight":object=new THREE.SpotLight(data.color,data.intensity,data.distance,data.angle,data.exponent,data.decay);break;case"HemisphereLight":object=new THREE.HemisphereLight(data.color,data.groundColor,data.intensity);break;case"Mesh":object=new THREE.Mesh(getGeometry(data.geometry),getMaterial(data.material));break;case"LOD":object=new THREE.LOD;break;case"Line":object=new THREE.Line(getGeometry(data.geometry),getMaterial(data.material),data.mode);break;case"PointCloud":case"Points":object=new THREE.Points(getGeometry(data.geometry),getMaterial(data.material));break;case"Sprite":object=new THREE.Sprite(getMaterial(data.material));break;case"Group":object=new THREE.Group;break;default:object=new THREE.Object3D}if(object.uuid=data.uuid,void 0!==data.name&&(object.name=data.name),void 0!==data.matrix?(matrix.fromArray(data.matrix),matrix.decompose(object.position,object.quaternion,object.scale)):(void 0!==data.position&&object.position.fromArray(data.position),void 0!==data.rotation&&object.rotation.fromArray(data.rotation),void 0!==data.scale&&object.scale.fromArray(data.scale)),void 0!==data.castShadow&&(object.castShadow=data.castShadow),void 0!==data.receiveShadow&&(object.receiveShadow=data.receiveShadow),void 0!==data.visible&&(object.visible=data.visible),void 0!==data.userData&&(object.userData=data.userData),void 0!==data.children)for(var child in data.children)object.add(this.parseObject(data.children[child],geometries,materials));if("LOD"===data.type)for(var levels=data.levels,l=0;li;++i)loadTexture(i);else loader.load(url,function(buffer){var texDatas=scope._parser(buffer,!0);if(texDatas.isCubemap)for(var faces=texDatas.mipmaps.length/texDatas.mipmapCount,f=0;faces>f;f++){images[f]={mipmaps:[]};for(var i=0;i0&&(data.alphaTest=this.alphaTest),this.wireframe===!0&&(data.wireframe=this.wireframe),this.wireframeLinewidth>1&&(data.wireframeLinewidth=this.wireframeLinewidth),data},clone:function(){return(new this.constructor).copy(this)},copy:function(source){return this.name=source.name,this.side=source.side,this.opacity=source.opacity,this.transparent=source.transparent,this.blending=source.blending,this.blendSrc=source.blendSrc,this.blendDst=source.blendDst,this.blendEquation=source.blendEquation,this.blendSrcAlpha=source.blendSrcAlpha,this.blendDstAlpha=source.blendDstAlpha,this.blendEquationAlpha=source.blendEquationAlpha,this.depthFunc=source.depthFunc,this.depthTest=source.depthTest,this.depthWrite=source.depthWrite,this.precision=source.precision,this.polygonOffset=source.polygonOffset,this.polygonOffsetFactor=source.polygonOffsetFactor,this.polygonOffsetUnits=source.polygonOffsetUnits,this.alphaTest=source.alphaTest,this.overdraw=source.overdraw,this.visible=source.visible,this},update:function(){this.dispatchEvent({type:"update"})},dispose:function(){this.dispatchEvent({type:"dispose"})},get wrapAround(){console.warn("THREE."+this.type+": .wrapAround has been removed.")},set wrapAround(boolean){console.warn("THREE."+this.type+": .wrapAround has been removed.")},get wrapRGB(){return console.warn("THREE."+this.type+": .wrapRGB has been removed."),new THREE.Color}},THREE.EventDispatcher.prototype.apply(THREE.Material.prototype),THREE.MaterialIdCount=0,THREE.LineBasicMaterial=function(parameters){THREE.Material.call(this),this.type="LineBasicMaterial",this.color=new THREE.Color(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.vertexColors=THREE.NoColors,this.fog=!0,this.setValues(parameters)},THREE.LineBasicMaterial.prototype=Object.create(THREE.Material.prototype),THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial,THREE.LineBasicMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.linewidth=source.linewidth,this.linecap=source.linecap,this.linejoin=source.linejoin,this.vertexColors=source.vertexColors,this.fog=source.fog,this},THREE.LineDashedMaterial=function(parameters){THREE.Material.call(this),this.type="LineDashedMaterial",this.color=new THREE.Color(16777215),this.linewidth=1,this.scale=1,this.dashSize=3,this.gapSize=1,this.vertexColors=!1,this.fog=!0,this.setValues(parameters)},THREE.LineDashedMaterial.prototype=Object.create(THREE.Material.prototype),THREE.LineDashedMaterial.prototype.constructor=THREE.LineDashedMaterial,THREE.LineDashedMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.linewidth=source.linewidth,this.scale=source.scale,this.dashSize=source.dashSize,this.gapSize=source.gapSize,this.vertexColors=source.vertexColors,this.fog=source.fog,this},THREE.MeshBasicMaterial=function(parameters){THREE.Material.call(this),this.type="MeshBasicMaterial",this.color=new THREE.Color(16777215),this.map=null,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=THREE.MultiplyOperation,this.reflectivity=1,this.refractionRatio=.98,this.fog=!0,this.shading=THREE.SmoothShading,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.vertexColors=THREE.NoColors,this.skinning=!1,this.morphTargets=!1,this.setValues(parameters)},THREE.MeshBasicMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial,THREE.MeshBasicMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.map=source.map,this.aoMap=source.aoMap,this.aoMapIntensity=source.aoMapIntensity,this.specularMap=source.specularMap,this.alphaMap=source.alphaMap,this.envMap=source.envMap,this.combine=source.combine,this.reflectivity=source.reflectivity,this.refractionRatio=source.refractionRatio,this.fog=source.fog,this.shading=source.shading,this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this.wireframeLinecap=source.wireframeLinecap,this.wireframeLinejoin=source.wireframeLinejoin,this.vertexColors=source.vertexColors,this.skinning=source.skinning,this.morphTargets=source.morphTargets,this},THREE.MeshLambertMaterial=function(parameters){THREE.Material.call(this),this.type="MeshLambertMaterial",this.color=new THREE.Color(16777215),this.emissive=new THREE.Color(0),this.map=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=THREE.MultiplyOperation,this.reflectivity=1,this.refractionRatio=.98,this.fog=!0,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.vertexColors=THREE.NoColors,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(parameters)},THREE.MeshLambertMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial,THREE.MeshLambertMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.emissive.copy(source.emissive),this.map=source.map,this.specularMap=source.specularMap,this.alphaMap=source.alphaMap,this.envMap=source.envMap,this.combine=source.combine,this.reflectivity=source.reflectivity,this.refractionRatio=source.refractionRatio,this.fog=source.fog,this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this.wireframeLinecap=source.wireframeLinecap,this.wireframeLinejoin=source.wireframeLinejoin,this.vertexColors=source.vertexColors,this.skinning=source.skinning,this.morphTargets=source.morphTargets,this.morphNormals=source.morphNormals,this},THREE.MeshPhongMaterial=function(parameters){THREE.Material.call(this),this.type="MeshPhongMaterial",this.color=new THREE.Color(16777215),this.emissive=new THREE.Color(0),this.specular=new THREE.Color(1118481),this.shininess=30,this.metal=!1,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalScale=new THREE.Vector2(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=THREE.MultiplyOperation,this.reflectivity=1,this.refractionRatio=.98,this.fog=!0,this.shading=THREE.SmoothShading,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.vertexColors=THREE.NoColors,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(parameters)},THREE.MeshPhongMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial,THREE.MeshPhongMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.emissive.copy(source.emissive),this.specular.copy(source.specular),this.shininess=source.shininess,this.metal=source.metal,this.map=source.map,this.lightMap=source.lightMap,this.lightMapIntensity=source.lightMapIntensity,this.aoMap=source.aoMap,this.aoMapIntensity=source.aoMapIntensity,this.emissiveMap=source.emissiveMap,this.bumpMap=source.bumpMap,this.bumpScale=source.bumpScale,this.normalMap=source.normalMap,this.normalScale.copy(source.normalScale),this.displacementMap=source.displacementMap,this.displacementScale=source.displacementScale,this.displacementBias=source.displacementBias,this.specularMap=source.specularMap,this.alphaMap=source.alphaMap,this.envMap=source.envMap,this.combine=source.combine,this.reflectivity=source.reflectivity,this.refractionRatio=source.refractionRatio,this.fog=source.fog,this.shading=source.shading,this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this.wireframeLinecap=source.wireframeLinecap,this.wireframeLinejoin=source.wireframeLinejoin,this.vertexColors=source.vertexColors,this.skinning=source.skinning,this.morphTargets=source.morphTargets,this.morphNormals=source.morphNormals,this},THREE.MeshDepthMaterial=function(parameters){THREE.Material.call(this),this.type="MeshDepthMaterial",this.morphTargets=!1,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(parameters)},THREE.MeshDepthMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial,THREE.MeshDepthMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this},THREE.MeshNormalMaterial=function(parameters){THREE.Material.call(this,parameters),this.type="MeshNormalMaterial",this.wireframe=!1,this.wireframeLinewidth=1,this.morphTargets=!1,this.setValues(parameters)},THREE.MeshNormalMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial,THREE.MeshNormalMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this},THREE.MultiMaterial=function(materials){this.uuid=THREE.Math.generateUUID(),this.type="MultiMaterial",this.materials=materials instanceof Array?materials:[],this.visible=!0},THREE.MultiMaterial.prototype={constructor:THREE.MultiMaterial,toJSON:function(){for(var output={metadata:{version:4.2,type:"material",generator:"MaterialExporter"},uuid:this.uuid,type:this.type,materials:[]},i=0,l=this.materials.length;l>i;i++)output.materials.push(this.materials[i].toJSON());return output.visible=this.visible,output},clone:function(){for(var material=new this.constructor,i=0;i2048||canvas.height>2048?canvas.toDataURL("image/jpeg",.6):canvas.toDataURL("image/png")}if(void 0!==meta.textures[this.uuid])return meta.textures[this.uuid];var output={metadata:{version:4.4,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy};if(void 0!==this.image){var image=this.image;void 0===image.uuid&&(image.uuid=THREE.Math.generateUUID()),void 0===meta.images[image.uuid]&&(meta.images[image.uuid]={uuid:image.uuid,url:getDataURL(image)}),output.image=image.uuid}return meta.textures[this.uuid]=output,output},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(uv){if(this.mapping===THREE.UVMapping){if(uv.multiply(this.repeat),uv.add(this.offset),uv.x<0||uv.x>1)switch(this.wrapS){case THREE.RepeatWrapping:uv.x=uv.x-Math.floor(uv.x);break;case THREE.ClampToEdgeWrapping:uv.x=uv.x<0?0:1;break;case THREE.MirroredRepeatWrapping:1===Math.abs(Math.floor(uv.x)%2)?uv.x=Math.ceil(uv.x)-uv.x:uv.x=uv.x-Math.floor(uv.x)}if(uv.y<0||uv.y>1)switch(this.wrapT){case THREE.RepeatWrapping:uv.y=uv.y-Math.floor(uv.y);break;case THREE.ClampToEdgeWrapping:uv.y=uv.y<0?0:1;break;case THREE.MirroredRepeatWrapping:1===Math.abs(Math.floor(uv.y)%2)?uv.y=Math.ceil(uv.y)-uv.y:uv.y=uv.y-Math.floor(uv.y)}this.flipY&&(uv.y=1-uv.y)}}},THREE.EventDispatcher.prototype.apply(THREE.Texture.prototype),THREE.TextureIdCount=0,THREE.CanvasTexture=function(canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){THREE.Texture.call(this,canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.needsUpdate=!0},THREE.CanvasTexture.prototype=Object.create(THREE.Texture.prototype),THREE.CanvasTexture.prototype.constructor=THREE.CanvasTexture,THREE.CubeTexture=function(images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){mapping=void 0!==mapping?mapping:THREE.CubeReflectionMapping,THREE.Texture.call(this,images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.images=images,this.flipY=!1},THREE.CubeTexture.prototype=Object.create(THREE.Texture.prototype),THREE.CubeTexture.prototype.constructor=THREE.CubeTexture,THREE.CubeTexture.prototype.copy=function(source){return THREE.Texture.prototype.copy.call(this,source),this.images=source.images,this},THREE.CompressedTexture=function(mipmaps,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy){THREE.Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.image={width:width,height:height},this.mipmaps=mipmaps,this.flipY=!1,this.generateMipmaps=!1},THREE.CompressedTexture.prototype=Object.create(THREE.Texture.prototype),THREE.CompressedTexture.prototype.constructor=THREE.CompressedTexture,THREE.DataTexture=function(data,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy){THREE.Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.image={data:data,width:width,height:height +},this.magFilter=void 0!==magFilter?magFilter:THREE.NearestFilter,this.minFilter=void 0!==minFilter?minFilter:THREE.NearestFilter,this.flipY=!1,this.generateMipmaps=!1},THREE.DataTexture.prototype=Object.create(THREE.Texture.prototype),THREE.DataTexture.prototype.constructor=THREE.DataTexture,THREE.VideoTexture=function(video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){function update(){requestAnimationFrame(update),video.readyState===video.HAVE_ENOUGH_DATA&&(scope.needsUpdate=!0)}THREE.Texture.call(this,video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.generateMipmaps=!1;var scope=this;update()},THREE.VideoTexture.prototype=Object.create(THREE.Texture.prototype),THREE.VideoTexture.prototype.constructor=THREE.VideoTexture,THREE.Group=function(){THREE.Object3D.call(this),this.type="Group"},THREE.Group.prototype=Object.create(THREE.Object3D.prototype),THREE.Group.prototype.constructor=THREE.Group,THREE.Points=function(geometry,material){THREE.Object3D.call(this),this.type="Points",this.geometry=void 0!==geometry?geometry:new THREE.Geometry,this.material=void 0!==material?material:new THREE.PointsMaterial({color:16777215*Math.random()})},THREE.Points.prototype=Object.create(THREE.Object3D.prototype),THREE.Points.prototype.constructor=THREE.Points,THREE.Points.prototype.raycast=function(){var inverseMatrix=new THREE.Matrix4,ray=new THREE.Ray;return function(raycaster,intersects){function testPoint(point,index){var rayPointDistanceSq=ray.distanceSqToPoint(point);if(localThresholdSq>rayPointDistanceSq){var intersectPoint=ray.closestPointToPoint(point);intersectPoint.applyMatrix4(object.matrixWorld);var distance=raycaster.ray.origin.distanceTo(intersectPoint);if(distanceraycaster.far)return;intersects.push({distance:distance,distanceToRay:Math.sqrt(rayPointDistanceSq),point:intersectPoint.clone(),index:index,face:null,object:object})}}var object=this,geometry=object.geometry,threshold=raycaster.params.Points.threshold;if(inverseMatrix.getInverse(this.matrixWorld),ray.copy(raycaster.ray).applyMatrix4(inverseMatrix),null===geometry.boundingBox||ray.isIntersectionBox(geometry.boundingBox)!==!1){var localThreshold=threshold/((this.scale.x+this.scale.y+this.scale.z)/3),localThresholdSq=localThreshold*localThreshold,position=new THREE.Vector3;if(geometry instanceof THREE.BufferGeometry){var index=geometry.index,attributes=geometry.attributes,positions=attributes.position.array;if(null!==index)for(var indices=index.array,i=0,il=indices.length;il>i;i++){var a=indices[i];position.fromArray(positions,3*a),testPoint(position,a)}else for(var i=0,l=positions.length/3;l>i;i++)position.fromArray(positions,3*i),testPoint(position,i)}else for(var vertices=geometry.vertices,i=0,l=vertices.length;l>i;i++)testPoint(vertices[i],i)}}}(),THREE.Points.prototype.clone=function(){return new this.constructor(this.geometry,this.material).copy(this)},THREE.PointCloud=function(geometry,material){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new THREE.Points(geometry,material)},THREE.ParticleSystem=function(geometry,material){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new THREE.Points(geometry,material)},THREE.Line=function(geometry,material,mode){return 1===mode?(console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new THREE.LineSegments(geometry,material)):(THREE.Object3D.call(this),this.type="Line",this.geometry=void 0!==geometry?geometry:new THREE.Geometry,void(this.material=void 0!==material?material:new THREE.LineBasicMaterial({color:16777215*Math.random()})))},THREE.Line.prototype=Object.create(THREE.Object3D.prototype),THREE.Line.prototype.constructor=THREE.Line,THREE.Line.prototype.raycast=function(){var inverseMatrix=new THREE.Matrix4,ray=new THREE.Ray,sphere=new THREE.Sphere;return function(raycaster,intersects){var precision=raycaster.linePrecision,precisionSq=precision*precision,geometry=this.geometry;if(null===geometry.boundingSphere&&geometry.computeBoundingSphere(),sphere.copy(geometry.boundingSphere),sphere.applyMatrix4(this.matrixWorld),raycaster.ray.isIntersectionSphere(sphere)!==!1){inverseMatrix.getInverse(this.matrixWorld),ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);var vStart=new THREE.Vector3,vEnd=new THREE.Vector3,interSegment=new THREE.Vector3,interRay=new THREE.Vector3,step=this instanceof THREE.LineSegments?2:1;if(geometry instanceof THREE.BufferGeometry){var index=geometry.index,attributes=geometry.attributes;if(null!==index)for(var indices=index.array,positions=attributes.position.array,i=0,l=indices.length-1;l>i;i+=step){var a=indices[i],b=indices[i+1];vStart.fromArray(positions,3*a),vEnd.fromArray(positions,3*b);var distSq=ray.distanceSqToSegment(vStart,vEnd,interRay,interSegment);if(!(distSq>precisionSq)){interRay.applyMatrix4(this.matrixWorld);var distance=raycaster.ray.origin.distanceTo(interRay);distanceraycaster.far||intersects.push({distance:distance,point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else for(var positions=attributes.position.array,i=0,l=positions.length/3-1;l>i;i+=step){vStart.fromArray(positions,3*i),vEnd.fromArray(positions,3*i+3);var distSq=ray.distanceSqToSegment(vStart,vEnd,interRay,interSegment);if(!(distSq>precisionSq)){interRay.applyMatrix4(this.matrixWorld);var distance=raycaster.ray.origin.distanceTo(interRay);distanceraycaster.far||intersects.push({distance:distance,point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}else if(geometry instanceof THREE.Geometry)for(var vertices=geometry.vertices,nbVertices=vertices.length,i=0;nbVertices-1>i;i+=step){var distSq=ray.distanceSqToSegment(vertices[i],vertices[i+1],interRay,interSegment);if(!(distSq>precisionSq)){interRay.applyMatrix4(this.matrixWorld);var distance=raycaster.ray.origin.distanceTo(interRay);distanceraycaster.far||intersects.push({distance:distance,point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}}}(),THREE.Line.prototype.clone=function(){return new this.constructor(this.geometry,this.material).copy(this)},THREE.LineStrip=0,THREE.LinePieces=1,THREE.LineSegments=function(geometry,material){THREE.Line.call(this,geometry,material),this.type="LineSegments"},THREE.LineSegments.prototype=Object.create(THREE.Line.prototype),THREE.LineSegments.prototype.constructor=THREE.LineSegments,THREE.Mesh=function(geometry,material){THREE.Object3D.call(this),this.type="Mesh",this.geometry=void 0!==geometry?geometry:new THREE.Geometry,this.material=void 0!==material?material:new THREE.MeshBasicMaterial({color:16777215*Math.random()}),this.updateMorphTargets()},THREE.Mesh.prototype=Object.create(THREE.Object3D.prototype),THREE.Mesh.prototype.constructor=THREE.Mesh,THREE.Mesh.prototype.updateMorphTargets=function(){if(void 0!==this.geometry.morphTargets&&this.geometry.morphTargets.length>0){this.morphTargetBase=-1,this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var m=0,ml=this.geometry.morphTargets.length;ml>m;m++)this.morphTargetInfluences.push(0),this.morphTargetDictionary[this.geometry.morphTargets[m].name]=m}},THREE.Mesh.prototype.getMorphTargetIndexByName=function(name){return void 0!==this.morphTargetDictionary[name]?this.morphTargetDictionary[name]:(console.warn("THREE.Mesh.getMorphTargetIndexByName: morph target "+name+" does not exist. Returning 0."),0)},THREE.Mesh.prototype.raycast=function(){function uvIntersection(point,p1,p2,p3,uv1,uv2,uv3){return THREE.Triangle.barycoordFromPoint(point,p1,p2,p3,barycoord),uv1.multiplyScalar(barycoord.x),uv2.multiplyScalar(barycoord.y),uv3.multiplyScalar(barycoord.z),uv1.add(uv2).add(uv3),uv1.clone()}function checkIntersection(object,raycaster,ray,pA,pB,pC,point){var intersect,material=object.material;if(intersect=material.side===THREE.BackSide?ray.intersectTriangle(pC,pB,pA,!0,point):ray.intersectTriangle(pA,pB,pC,material.side!==THREE.DoubleSide,point),null===intersect)return null;intersectionPointWorld.copy(point),intersectionPointWorld.applyMatrix4(object.matrixWorld);var distance=raycaster.ray.origin.distanceTo(intersectionPointWorld);return distanceraycaster.far?null:{distance:distance,point:intersectionPointWorld.clone(),object:object}}function checkBufferGeometryIntersection(object,raycaster,ray,positions,uvs,a,b,c){vA.fromArray(positions,3*a),vB.fromArray(positions,3*b),vC.fromArray(positions,3*c);var intersection=checkIntersection(object,raycaster,ray,vA,vB,vC,intersectionPoint);return intersection&&(uvs&&(uvA.fromArray(uvs,2*a),uvB.fromArray(uvs,2*b),uvC.fromArray(uvs,2*c),intersection.uv=uvIntersection(intersectionPoint,vA,vB,vC,uvA,uvB,uvC)),intersection.face=new THREE.Face3(a,b,c,THREE.Triangle.normal(vA,vB,vC)),intersection.faceIndex=a),intersection}var inverseMatrix=new THREE.Matrix4,ray=new THREE.Ray,sphere=new THREE.Sphere,vA=new THREE.Vector3,vB=new THREE.Vector3,vC=new THREE.Vector3,tempA=new THREE.Vector3,tempB=new THREE.Vector3,tempC=new THREE.Vector3,uvA=new THREE.Vector2,uvB=new THREE.Vector2,uvC=new THREE.Vector2,barycoord=new THREE.Vector3,intersectionPoint=new THREE.Vector3,intersectionPointWorld=new THREE.Vector3;return function(raycaster,intersects){var geometry=this.geometry,material=this.material;if(void 0!==material){null===geometry.boundingSphere&&geometry.computeBoundingSphere();var matrixWorld=this.matrixWorld;if(sphere.copy(geometry.boundingSphere),sphere.applyMatrix4(matrixWorld),raycaster.ray.isIntersectionSphere(sphere)!==!1&&(inverseMatrix.getInverse(matrixWorld),ray.copy(raycaster.ray).applyMatrix4(inverseMatrix),null===geometry.boundingBox||ray.isIntersectionBox(geometry.boundingBox)!==!1)){var uvs,intersection;if(geometry instanceof THREE.BufferGeometry){var a,b,c,index=geometry.index,attributes=geometry.attributes,positions=attributes.position.array;if(void 0!==attributes.uv&&(uvs=attributes.uv.array),null!==index)for(var indices=index.array,i=0,l=indices.length;l>i;i+=3)a=indices[i],b=indices[i+1],c=indices[i+2],intersection=checkBufferGeometryIntersection(this,raycaster,ray,positions,uvs,a,b,c),intersection&&(intersection.faceIndex=Math.floor(i/3),intersects.push(intersection));else for(var i=0,l=positions.length;l>i;i+=9)a=i/3,b=a+1,c=a+2,intersection=checkBufferGeometryIntersection(this,raycaster,ray,positions,uvs,a,b,c),intersection&&(intersection.index=a,intersects.push(intersection))}else if(geometry instanceof THREE.Geometry){var fvA,fvB,fvC,isFaceMaterial=material instanceof THREE.MeshFaceMaterial,materials=isFaceMaterial===!0?material.materials:null,vertices=geometry.vertices,faces=geometry.faces,faceVertexUvs=geometry.faceVertexUvs[0];faceVertexUvs.length>0&&(uvs=faceVertexUvs);for(var f=0,fl=faces.length;fl>f;f++){var face=faces[f],faceMaterial=isFaceMaterial===!0?materials[face.materialIndex]:material;if(void 0!==faceMaterial){if(fvA=vertices[face.a],fvB=vertices[face.b],fvC=vertices[face.c],faceMaterial.morphTargets===!0){var morphTargets=geometry.morphTargets,morphInfluences=this.morphTargetInfluences;vA.set(0,0,0),vB.set(0,0,0),vC.set(0,0,0);for(var t=0,tl=morphTargets.length;tl>t;t++){var influence=morphInfluences[t];if(0!==influence){var targets=morphTargets[t].vertices;vA.addScaledVector(tempA.subVectors(targets[face.a],fvA),influence),vB.addScaledVector(tempB.subVectors(targets[face.b],fvB),influence),vC.addScaledVector(tempC.subVectors(targets[face.c],fvC),influence)}}vA.add(fvA),vB.add(fvB),vC.add(fvC),fvA=vA,fvB=vB,fvC=vC}if(intersection=checkIntersection(this,raycaster,ray,fvA,fvB,fvC,intersectionPoint)){if(uvs){var uvs_f=uvs[f];uvA.copy(uvs_f[0]),uvB.copy(uvs_f[1]),uvC.copy(uvs_f[2]),intersection.uv=uvIntersection(intersectionPoint,fvA,fvB,fvC,uvA,uvB,uvC)}intersection.face=face,intersection.faceIndex=f,intersects.push(intersection)}}}}}}}}(),THREE.Mesh.prototype.clone=function(){return new this.constructor(this.geometry,this.material).copy(this)},THREE.Bone=function(skin){THREE.Object3D.call(this),this.type="Bone",this.skin=skin},THREE.Bone.prototype=Object.create(THREE.Object3D.prototype),THREE.Bone.prototype.constructor=THREE.Bone,THREE.Bone.prototype.copy=function(source){return THREE.Object3D.prototype.copy.call(this,source),this.skin=source.skin,this},THREE.Skeleton=function(bones,boneInverses,useVertexTexture){if(this.useVertexTexture=void 0!==useVertexTexture?useVertexTexture:!0,this.identityMatrix=new THREE.Matrix4,bones=bones||[],this.bones=bones.slice(0),this.useVertexTexture){var size=Math.sqrt(4*this.bones.length);size=THREE.Math.nextPowerOfTwo(Math.ceil(size)),size=Math.max(size,4),this.boneTextureWidth=size,this.boneTextureHeight=size,this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4),this.boneTexture=new THREE.DataTexture(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,THREE.RGBAFormat,THREE.FloatType)}else this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===boneInverses)this.calculateInverses();else if(this.bones.length===boneInverses.length)this.boneInverses=boneInverses.slice(0);else{console.warn("THREE.Skeleton bonInverses is the wrong length."),this.boneInverses=[];for(var b=0,bl=this.bones.length;bl>b;b++)this.boneInverses.push(new THREE.Matrix4)}},THREE.Skeleton.prototype.calculateInverses=function(){this.boneInverses=[];for(var b=0,bl=this.bones.length;bl>b;b++){var inverse=new THREE.Matrix4;this.bones[b]&&inverse.getInverse(this.bones[b].matrixWorld),this.boneInverses.push(inverse)}},THREE.Skeleton.prototype.pose=function(){for(var bone,b=0,bl=this.bones.length;bl>b;b++)bone=this.bones[b],bone&&bone.matrixWorld.getInverse(this.boneInverses[b]);for(var b=0,bl=this.bones.length;bl>b;b++)bone=this.bones[b],bone&&(bone.parent?(bone.matrix.getInverse(bone.parent.matrixWorld),bone.matrix.multiply(bone.matrixWorld)):bone.matrix.copy(bone.matrixWorld),bone.matrix.decompose(bone.position,bone.quaternion,bone.scale))},THREE.Skeleton.prototype.update=function(){var offsetMatrix=new THREE.Matrix4;return function(){for(var b=0,bl=this.bones.length;bl>b;b++){var matrix=this.bones[b]?this.bones[b].matrixWorld:this.identityMatrix;offsetMatrix.multiplyMatrices(matrix,this.boneInverses[b]),offsetMatrix.flattenToArrayOffset(this.boneMatrices,16*b)}this.useVertexTexture&&(this.boneTexture.needsUpdate=!0)}}(),THREE.Skeleton.prototype.clone=function(){return new THREE.Skeleton(this.bones,this.boneInverses,this.useVertexTexture)},THREE.SkinnedMesh=function(geometry,material,useVertexTexture){THREE.Mesh.call(this,geometry,material),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new THREE.Matrix4,this.bindMatrixInverse=new THREE.Matrix4;var bones=[];if(this.geometry&&void 0!==this.geometry.bones){for(var bone,gbone,b=0,bl=this.geometry.bones.length;bl>b;++b)gbone=this.geometry.bones[b],bone=new THREE.Bone(this),bones.push(bone),bone.name=gbone.name,bone.position.fromArray(gbone.pos),bone.quaternion.fromArray(gbone.rotq),void 0!==gbone.scl&&bone.scale.fromArray(gbone.scl);for(var b=0,bl=this.geometry.bones.length;bl>b;++b)gbone=this.geometry.bones[b],-1!==gbone.parent&&null!==gbone.parent?bones[gbone.parent].add(bones[b]):this.add(bones[b])}this.normalizeSkinWeights(),this.updateMatrixWorld(!0),this.bind(new THREE.Skeleton(bones,void 0,useVertexTexture),this.matrixWorld)},THREE.SkinnedMesh.prototype=Object.create(THREE.Mesh.prototype),THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh,THREE.SkinnedMesh.prototype.bind=function(skeleton,bindMatrix){this.skeleton=skeleton,void 0===bindMatrix&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),bindMatrix=this.matrixWorld),this.bindMatrix.copy(bindMatrix),this.bindMatrixInverse.getInverse(bindMatrix)},THREE.SkinnedMesh.prototype.pose=function(){this.skeleton.pose()},THREE.SkinnedMesh.prototype.normalizeSkinWeights=function(){if(this.geometry instanceof THREE.Geometry)for(var i=0;ii&&!(distance1){v1.setFromMatrixPosition(camera.matrixWorld),v2.setFromMatrixPosition(this.matrixWorld);var distance=v1.distanceTo(v2);levels[0].object.visible=!0;for(var i=1,l=levels.length;l>i&&distance>=levels[i].distance;i++)levels[i-1].object.visible=!1,levels[i].object.visible=!0;for(;l>i;i++)levels[i].object.visible=!1}}}(),THREE.LOD.prototype.copy=function(source){THREE.Object3D.prototype.copy.call(this,source,!1);for(var levels=source.levels,i=0,l=levels.length;l>i;i++){var level=levels[i];this.addLevel(level.object.clone(),level.distance)}return this},THREE.LOD.prototype.toJSON=function(meta){var data=THREE.Object3D.prototype.toJSON.call(this,meta);data.object.levels=[];for(var levels=this.levels,i=0,l=levels.length;l>i;i++){var level=levels[i];data.object.levels.push({object:level.object.uuid,distance:level.distance})}return data},THREE.Sprite=function(){var indices=new Uint16Array([0,1,2,0,2,3]),vertices=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),uvs=new Float32Array([0,0,1,0,1,1,0,1]),geometry=new THREE.BufferGeometry;return geometry.setIndex(new THREE.BufferAttribute(indices,1)),geometry.addAttribute("position",new THREE.BufferAttribute(vertices,3)),geometry.addAttribute("uv",new THREE.BufferAttribute(uvs,2)),function(material){THREE.Object3D.call(this),this.type="Sprite",this.geometry=geometry,this.material=void 0!==material?material:new THREE.SpriteMaterial}}(),THREE.Sprite.prototype=Object.create(THREE.Object3D.prototype),THREE.Sprite.prototype.constructor=THREE.Sprite,THREE.Sprite.prototype.raycast=function(){var matrixPosition=new THREE.Vector3;return function(raycaster,intersects){matrixPosition.setFromMatrixPosition(this.matrixWorld);var distanceSq=raycaster.ray.distanceSqToPoint(matrixPosition),guessSizeSq=this.scale.x*this.scale.y;distanceSq>guessSizeSq||intersects.push({distance:Math.sqrt(distanceSq),point:this.position,face:null,object:this})}}(),THREE.Sprite.prototype.clone=function(){return new this.constructor(this.material).copy(this)},THREE.Particle=THREE.Sprite,THREE.LensFlare=function(texture,size,distance,blending,color){THREE.Object3D.call(this),this.lensFlares=[],this.positionScreen=new THREE.Vector3,this.customUpdateCallback=void 0,void 0!==texture&&this.add(texture,size,distance,blending,color)},THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype),THREE.LensFlare.prototype.constructor=THREE.LensFlare,THREE.LensFlare.prototype.add=function(texture,size,distance,blending,color,opacity){void 0===size&&(size=-1),void 0===distance&&(distance=0),void 0===opacity&&(opacity=1),void 0===color&&(color=new THREE.Color(16777215)),void 0===blending&&(blending=THREE.NormalBlending),distance=Math.min(distance,Math.max(0,distance)),this.lensFlares.push({texture:texture,size:size,distance:distance,x:0,y:0,z:0,scale:1,rotation:0,opacity:opacity,color:color,blending:blending})},THREE.LensFlare.prototype.updateLensFlares=function(){var f,flare,fl=this.lensFlares.length,vecX=2*-this.positionScreen.x,vecY=2*-this.positionScreen.y;for(f=0;fl>f;f++)flare=this.lensFlares[f],flare.x=this.positionScreen.x+vecX*flare.distance,flare.y=this.positionScreen.y+vecY*flare.distance,flare.wantedRotation=flare.x*Math.PI*.25,flare.rotation+=.25*(flare.wantedRotation-flare.rotation)},THREE.LensFlare.prototype.copy=function(source){THREE.Object3D.prototype.copy.call(this,source),this.positionScreen.copy(source.positionScreen),this.customUpdateCallback=source.customUpdateCallback;for(var i=0,l=source.lensFlares.length;l>i;i++)this.lensFlares.push(source.lensFlares[i]);return this},THREE.Scene=function(){THREE.Object3D.call(this),this.type="Scene",this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0},THREE.Scene.prototype=Object.create(THREE.Object3D.prototype),THREE.Scene.prototype.constructor=THREE.Scene,THREE.Scene.prototype.copy=function(source){return THREE.Object3D.prototype.copy.call(this,source),null!==source.fog&&(this.fog=source.fog.clone()),null!==source.overrideMaterial&&(this.overrideMaterial=source.overrideMaterial.clone()),this.autoUpdate=source.autoUpdate,this.matrixAutoUpdate=source.matrixAutoUpdate,this},THREE.Fog=function(color,near,far){this.name="",this.color=new THREE.Color(color),this.near=void 0!==near?near:1,this.far=void 0!==far?far:1e3},THREE.Fog.prototype.clone=function(){return new THREE.Fog(this.color.getHex(),this.near,this.far)},THREE.FogExp2=function(color,density){this.name="",this.color=new THREE.Color(color),this.density=void 0!==density?density:25e-5},THREE.FogExp2.prototype.clone=function(){return new THREE.FogExp2(this.color.getHex(),this.density)},THREE.ShaderChunk={},THREE.ShaderChunk.alphamap_fragment="#ifdef USE_ALPHAMAP\n\n diffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n",THREE.ShaderChunk.alphamap_pars_fragment="#ifdef USE_ALPHAMAP\n\n uniform sampler2D alphaMap;\n\n#endif\n",THREE.ShaderChunk.alphatest_fragment="#ifdef ALPHATEST\n\n if ( diffuseColor.a < ALPHATEST ) discard;\n\n#endif\n",THREE.ShaderChunk.aomap_fragment="#ifdef USE_AOMAP\n\n totalAmbientLight *= ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n#endif\n",THREE.ShaderChunk.aomap_pars_fragment="#ifdef USE_AOMAP\n\n uniform sampler2D aoMap;\n uniform float aoMapIntensity;\n\n#endif",THREE.ShaderChunk.begin_vertex="\nvec3 transformed = vec3( position );\n",THREE.ShaderChunk.beginnormal_vertex="\nvec3 objectNormal = vec3( normal );\n",THREE.ShaderChunk.bumpmap_pars_fragment="#ifdef USE_BUMPMAP\n\n uniform sampler2D bumpMap;\n uniform float bumpScale;\n\n\n\n vec2 dHdxy_fwd() {\n\n vec2 dSTdx = dFdx( vUv );\n vec2 dSTdy = dFdy( vUv );\n\n float Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n return vec2( dBx, dBy );\n\n }\n\n vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\n vec3 vSigmaX = dFdx( surf_pos );\n vec3 vSigmaY = dFdy( surf_pos );\n vec3 vN = surf_norm;\n vec3 R1 = cross( vSigmaY, vN );\n vec3 R2 = cross( vN, vSigmaX );\n\n float fDet = dot( vSigmaX, R1 );\n\n vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n return normalize( abs( fDet ) * surf_norm - vGrad );\n\n }\n\n#endif\n",THREE.ShaderChunk.color_fragment="#ifdef USE_COLOR\n\n diffuseColor.rgb *= vColor;\n\n#endif",THREE.ShaderChunk.color_pars_fragment="#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif\n",THREE.ShaderChunk.color_pars_vertex="#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif",THREE.ShaderChunk.color_vertex="#ifdef USE_COLOR\n\n vColor.xyz = color.xyz;\n\n#endif",THREE.ShaderChunk.common="#define PI 3.14159\n#define PI2 6.28318\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\n\nvec3 transformDirection( in vec3 normal, in mat4 matrix ) {\n\n return normalize( ( matrix * vec4( normal, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {\n\n return normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );\n\n}\n\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n float distance = dot( planeNormal, point - pointOnPlane );\n\n return - distance * planeNormal + point;\n\n}\n\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n return sign( dot( point - pointOnPlane, planeNormal ) );\n\n}\n\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n return lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n\n}\n\nfloat calcLightAttenuation( float lightDistance, float cutoffDistance, float decayExponent ) {\n\n if ( decayExponent > 0.0 ) {\n\n return pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n }\n\n return 1.0;\n\n}\n\nvec3 F_Schlick( in vec3 specularColor, in float dotLH ) {\n\n\n float fresnel = exp2( ( -5.55437 * dotLH - 6.98316 ) * dotLH );\n\n return ( 1.0 - specularColor ) * fresnel + specularColor;\n\n}\n\nfloat G_BlinnPhong_Implicit( /* in float dotNL, in float dotNV */ ) {\n\n\n return 0.25;\n\n}\n\nfloat D_BlinnPhong( in float shininess, in float dotNH ) {\n\n\n return ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( in vec3 specularColor, in float shininess, in vec3 normal, in vec3 lightDir, in vec3 viewDir ) {\n\n vec3 halfDir = normalize( lightDir + viewDir );\n\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotLH = saturate( dot( lightDir, halfDir ) );\n\n vec3 F = F_Schlick( specularColor, dotLH );\n\n float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n float D = D_BlinnPhong( shininess, dotNH );\n\n return F * G * D;\n\n}\n\nvec3 inputToLinear( in vec3 a ) {\n\n #ifdef GAMMA_INPUT\n\n return pow( a, vec3( float( GAMMA_FACTOR ) ) );\n\n #else\n\n return a;\n\n #endif\n\n}\n\nvec3 linearToOutput( in vec3 a ) {\n\n #ifdef GAMMA_OUTPUT\n\n return pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );\n\n #else\n\n return a;\n\n #endif\n\n}\n",THREE.ShaderChunk.defaultnormal_vertex="#ifdef FLIP_SIDED\n\n objectNormal = -objectNormal;\n\n#endif\n\nvec3 transformedNormal = normalMatrix * objectNormal;\n",THREE.ShaderChunk.displacementmap_vertex="#ifdef USE_DISPLACEMENTMAP\n\n transformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n\n#endif\n",THREE.ShaderChunk.displacementmap_pars_vertex="#ifdef USE_DISPLACEMENTMAP\n\n uniform sampler2D displacementMap;\n uniform float displacementScale;\n uniform float displacementBias;\n\n#endif\n",THREE.ShaderChunk.emissivemap_fragment="#ifdef USE_EMISSIVEMAP\n\n vec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n emissiveColor.rgb = inputToLinear( emissiveColor.rgb );\n\n totalEmissiveLight *= emissiveColor.rgb;\n\n#endif\n",THREE.ShaderChunk.emissivemap_pars_fragment="#ifdef USE_EMISSIVEMAP\n\n uniform sampler2D emissiveMap;\n\n#endif\n",THREE.ShaderChunk.envmap_fragment="#ifdef USE_ENVMAP\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n #else\n\n vec3 reflectVec = vReflect;\n\n #endif\n\n #ifdef DOUBLE_SIDED\n float flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n #else\n float flipNormal = 1.0;\n #endif\n\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n #elif defined( ENVMAP_TYPE_EQUIREC )\n vec2 sampleUV;\n sampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n sampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n vec4 envColor = texture2D( envMap, sampleUV );\n\n #elif defined( ENVMAP_TYPE_SPHERE )\n vec3 reflectView = flipNormal * normalize((viewMatrix * vec4( reflectVec, 0.0 )).xyz + vec3(0.0,0.0,1.0));\n vec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n #endif\n\n envColor.xyz = inputToLinear( envColor.xyz );\n\n #ifdef ENVMAP_BLENDING_MULTIPLY\n\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_MIX )\n\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_ADD )\n\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n #endif\n\n#endif\n",THREE.ShaderChunk.envmap_pars_fragment="#ifdef USE_ENVMAP\n\n uniform float reflectivity;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n uniform float flipEnvMap;\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n uniform float refractionRatio;\n\n #else\n\n varying vec3 vReflect;\n\n #endif\n\n#endif\n",THREE.ShaderChunk.envmap_pars_vertex="#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n varying vec3 vReflect;\n\n uniform float refractionRatio;\n\n#endif\n",THREE.ShaderChunk.envmap_vertex="#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vReflect = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n#endif\n",THREE.ShaderChunk.fog_fragment="#ifdef USE_FOG\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n float depth = gl_FragDepthEXT / gl_FragCoord.w;\n\n #else\n\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n\n #endif\n\n #ifdef FOG_EXP2\n\n float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\n #else\n\n float fogFactor = smoothstep( fogNear, fogFar, depth );\n\n #endif\n \n outgoingLight = mix( outgoingLight, fogColor, fogFactor );\n\n#endif",THREE.ShaderChunk.fog_pars_fragment="#ifdef USE_FOG\n\n uniform vec3 fogColor;\n\n #ifdef FOG_EXP2\n\n uniform float fogDensity;\n\n #else\n\n uniform float fogNear;\n uniform float fogFar;\n #endif\n\n#endif",THREE.ShaderChunk.hemilight_fragment="#if MAX_HEMI_LIGHTS > 0\n\n for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lightDir = hemisphereLightDirection[ i ];\n\n float dotProduct = dot( normal, lightDir );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vec3 lightColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n totalAmbientLight += lightColor;\n\n }\n\n#endif\n\n", +THREE.ShaderChunk.lightmap_fragment="#ifdef USE_LIGHTMAP\n\n totalAmbientLight += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\n#endif\n",THREE.ShaderChunk.lightmap_pars_fragment="#ifdef USE_LIGHTMAP\n\n uniform sampler2D lightMap;\n uniform float lightMapIntensity;\n\n#endif",THREE.ShaderChunk.lights_lambert_pars_vertex="#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n",THREE.ShaderChunk.lights_lambert_vertex="vLightFront = vec3( 0.0 );\n\n#ifdef DOUBLE_SIDED\n\n vLightBack = vec3( 0.0 );\n\n#endif\n\nvec3 normal = normalize( transformedNormal );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec3 lightColor = pointLightColor[ i ];\n\n vec3 lVector = pointLightPosition[ i ] - mvPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * attenuation * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n #endif\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec3 lightColor = spotLightColor[ i ];\n\n vec3 lightPosition = spotLightPosition[ i ];\n vec3 lVector = lightPosition - mvPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n attenuation *= spotEffect;\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * attenuation * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n #endif\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 lightColor = directionalLightColor[ i ];\n\n vec3 lightDir = directionalLightDirection[ i ];\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * saturate( - dotProduct );\n\n #endif\n\n }\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lightDir = hemisphereLightDirection[ i ];\n\n\n float dotProduct = dot( normal, lightDir );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n #ifdef DOUBLE_SIDED\n\n float hemiDiffuseWeightBack = - 0.5 * dotProduct + 0.5;\n\n vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n\n #endif\n\n }\n\n#endif\n",THREE.ShaderChunk.lights_phong_fragment="vec3 viewDir = normalize( vViewPosition );\n\nvec3 totalDiffuseLight = vec3( 0.0 );\nvec3 totalSpecularLight = vec3( 0.0 );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec3 lightColor = pointLightColor[ i ];\n\n vec3 lightPosition = pointLightPosition[ i ];\n vec3 lVector = lightPosition + vViewPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec3 lightColor = spotLightColor[ i ];\n\n vec3 lightPosition = spotLightPosition[ i ];\n vec3 lVector = lightPosition + vViewPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n attenuation *= spotEffect;\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 lightColor = directionalLightColor[ i ];\n\n vec3 lightDir = directionalLightDirection[ i ];\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * cosineTerm;\n\n }\n\n#endif\n",THREE.ShaderChunk.lights_phong_pars_fragment="uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\nvarying vec3 vViewPosition;\n\n#ifndef FLAT_SHADED\n\n varying vec3 vNormal;\n\n#endif\n",THREE.ShaderChunk.lights_phong_pars_vertex="#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\n#endif\n",THREE.ShaderChunk.lights_phong_vertex="#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n vWorldPosition = worldPosition.xyz;\n\n#endif\n",THREE.ShaderChunk.linear_to_gamma_fragment="\n outgoingLight = linearToOutput( outgoingLight );\n",THREE.ShaderChunk.logdepthbuf_fragment="#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\n gl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n\n#endif",THREE.ShaderChunk.logdepthbuf_pars_fragment="#ifdef USE_LOGDEPTHBUF\n\n uniform float logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n#endif\n",THREE.ShaderChunk.logdepthbuf_pars_vertex="#ifdef USE_LOGDEPTHBUF\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n uniform float logDepthBufFC;\n\n#endif",THREE.ShaderChunk.logdepthbuf_vertex="#ifdef USE_LOGDEPTHBUF\n\n gl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n vFragDepth = 1.0 + gl_Position.w;\n\n#else\n\n gl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\n #endif\n\n#endif",THREE.ShaderChunk.map_fragment="#ifdef USE_MAP\n\n vec4 texelColor = texture2D( map, vUv );\n\n texelColor.xyz = inputToLinear( texelColor.xyz );\n\n diffuseColor *= texelColor;\n\n#endif\n",THREE.ShaderChunk.map_pars_fragment="#ifdef USE_MAP\n\n uniform sampler2D map;\n\n#endif",THREE.ShaderChunk.map_particle_fragment="#ifdef USE_MAP\n\n diffuseColor *= texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\n#endif\n",THREE.ShaderChunk.map_particle_pars_fragment="#ifdef USE_MAP\n\n uniform vec4 offsetRepeat;\n uniform sampler2D map;\n\n#endif\n",THREE.ShaderChunk.morphnormal_vertex="#ifdef USE_MORPHNORMALS\n\n objectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n objectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n objectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n objectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n\n#endif\n",THREE.ShaderChunk.morphtarget_pars_vertex="#ifdef USE_MORPHTARGETS\n\n #ifndef USE_MORPHNORMALS\n\n uniform float morphTargetInfluences[ 8 ];\n\n #else\n\n uniform float morphTargetInfluences[ 4 ];\n\n #endif\n\n#endif",THREE.ShaderChunk.morphtarget_vertex="#ifdef USE_MORPHTARGETS\n\n transformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n transformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n transformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n transformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\n #ifndef USE_MORPHNORMALS\n\n transformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n transformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n transformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n transformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\n #endif\n\n#endif\n",THREE.ShaderChunk.normal_phong_fragment="#ifndef FLAT_SHADED\n\n vec3 normal = normalize( vNormal );\n\n #ifdef DOUBLE_SIDED\n\n normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n\n #endif\n\n#else\n\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n\n#endif\n\n#ifdef USE_NORMALMAP\n\n normal = perturbNormal2Arb( -vViewPosition, normal );\n\n#elif defined( USE_BUMPMAP )\n\n normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n\n#endif\n\n",THREE.ShaderChunk.normalmap_pars_fragment="#ifdef USE_NORMALMAP\n\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n\n\n vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\n vec3 q0 = dFdx( eye_pos.xyz );\n vec3 q1 = dFdy( eye_pos.xyz );\n vec2 st0 = dFdx( vUv.st );\n vec2 st1 = dFdy( vUv.st );\n\n vec3 S = normalize( q0 * st1.t - q1 * st0.t );\n vec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n vec3 N = normalize( surf_norm );\n\n vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n mapN.xy = normalScale * mapN.xy;\n mat3 tsn = mat3( S, T, N );\n return normalize( tsn * mapN );\n\n }\n\n#endif\n",THREE.ShaderChunk.project_vertex="#ifdef USE_SKINNING\n\n vec4 mvPosition = modelViewMatrix * skinned;\n\n#else\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\n#endif\n\ngl_Position = projectionMatrix * mvPosition;\n",THREE.ShaderChunk.shadowmap_fragment="#ifdef USE_SHADOWMAP\n\n for ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n float texelSizeY = 1.0 / shadowMapSize[ i ].y;\n\n float shadow = 0.0;\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n bool isPointLight = shadowDarkness[ i ] < 0.0;\n\n if ( isPointLight ) {\n\n float realShadowDarkness = abs( shadowDarkness[ i ] );\n\n vec3 lightToPosition = vShadowCoord[ i ].xyz;\n\n #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n vec3 bd3D = normalize( lightToPosition );\n float dp = length( lightToPosition );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n\n #if defined( SHADOWMAP_TYPE_PCF )\n const float Dr = 1.25;\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n const float Dr = 2.25;\n #endif\n\n float os = Dr * 2.0 * texelSizeY;\n\n const vec3 Gsd = vec3( - 1, 0, 1 );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n shadow *= realShadowDarkness * ( 1.0 / 21.0 );\n\n #else \n vec3 bd3D = normalize( lightToPosition );\n float dp = length( lightToPosition );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n shadow *= realShadowDarkness;\n\n #endif\n\n } else {\n\n#endif \n float texelSizeX = 1.0 / shadowMapSize[ i ].x;\n\n vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\n\n\n bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n bool inFrustum = all( inFrustumVec );\n\n bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n bool frustumTest = all( frustumTestVec );\n\n if ( frustumTest ) {\n\n #if defined( SHADOWMAP_TYPE_PCF )\n\n\n /*\n for ( float y = -1.25; y <= 1.25; y += 1.25 )\n for ( float x = -1.25; x <= 1.25; x += 1.25 ) {\n vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n if ( fDepth < shadowCoord.z )\n shadow += 1.0;\n }\n shadow /= 9.0;\n */\n\n shadowCoord.z += shadowBias[ i ];\n\n const float ShadowDelta = 1.0 / 9.0;\n\n float xPixelOffset = texelSizeX;\n float yPixelOffset = texelSizeY;\n\n float dx0 = - 1.25 * xPixelOffset;\n float dy0 = - 1.25 * yPixelOffset;\n float dx1 = 1.25 * xPixelOffset;\n float dy1 = 1.25 * yPixelOffset;\n\n float fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n shadow *= shadowDarkness[ i ];\n\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\n shadowCoord.z += shadowBias[ i ];\n\n float xPixelOffset = texelSizeX;\n float yPixelOffset = texelSizeY;\n\n float dx0 = - 1.0 * xPixelOffset;\n float dy0 = - 1.0 * yPixelOffset;\n float dx1 = 1.0 * xPixelOffset;\n float dy1 = 1.0 * yPixelOffset;\n\n mat3 shadowKernel;\n mat3 depthKernel;\n\n depthKernel[ 0 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n depthKernel[ 0 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n depthKernel[ 0 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n depthKernel[ 1 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n depthKernel[ 1 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n depthKernel[ 1 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n depthKernel[ 2 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n depthKernel[ 2 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n depthKernel[ 2 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\n vec3 shadowZ = vec3( shadowCoord.z );\n shadowKernel[ 0 ] = vec3( lessThan( depthKernel[ 0 ], shadowZ ) );\n shadowKernel[ 0 ] *= vec3( 0.25 );\n\n shadowKernel[ 1 ] = vec3( lessThan( depthKernel[ 1 ], shadowZ ) );\n shadowKernel[ 1 ] *= vec3( 0.25 );\n\n shadowKernel[ 2 ] = vec3( lessThan( depthKernel[ 2 ], shadowZ ) );\n shadowKernel[ 2 ] *= vec3( 0.25 );\n\n vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[ i ].xy );\n\n shadowKernel[ 0 ] = mix( shadowKernel[ 1 ], shadowKernel[ 0 ], fractionalCoord.x );\n shadowKernel[ 1 ] = mix( shadowKernel[ 2 ], shadowKernel[ 1 ], fractionalCoord.x );\n\n vec4 shadowValues;\n shadowValues.x = mix( shadowKernel[ 0 ][ 1 ], shadowKernel[ 0 ][ 0 ], fractionalCoord.y );\n shadowValues.y = mix( shadowKernel[ 0 ][ 2 ], shadowKernel[ 0 ][ 1 ], fractionalCoord.y );\n shadowValues.z = mix( shadowKernel[ 1 ][ 1 ], shadowKernel[ 1 ][ 0 ], fractionalCoord.y );\n shadowValues.w = mix( shadowKernel[ 1 ][ 2 ], shadowKernel[ 1 ][ 1 ], fractionalCoord.y );\n\n shadow = dot( shadowValues, vec4( 1.0 ) ) * shadowDarkness[ i ];\n\n #else \n shadowCoord.z += shadowBias[ i ];\n\n vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n\n if ( fDepth < shadowCoord.z )\n shadow = shadowDarkness[ i ];\n\n #endif\n\n }\n\n#ifdef SHADOWMAP_DEBUG\n\n if ( inFrustum ) {\n\n if ( i == 0 ) {\n\n outgoingLight *= vec3( 1.0, 0.5, 0.0 );\n\n } else if ( i == 1 ) {\n\n outgoingLight *= vec3( 0.0, 1.0, 0.8 );\n\n } else {\n\n outgoingLight *= vec3( 0.0, 0.5, 1.0 );\n\n }\n\n }\n\n#endif\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n }\n\n#endif\n\n shadowMask = shadowMask * vec3( 1.0 - shadow );\n\n }\n\n#endif\n",THREE.ShaderChunk.shadowmap_pars_fragment="#ifdef USE_SHADOWMAP\n\n uniform sampler2D shadowMap[ MAX_SHADOWS ];\n uniform vec2 shadowMapSize[ MAX_SHADOWS ];\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform float shadowBias[ MAX_SHADOWS ];\n\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n float unpackDepth( const in vec4 rgba_depth ) {\n\n const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n float depth = dot( rgba_depth, bit_shift );\n return depth;\n\n }\n\n #if defined(POINT_LIGHT_SHADOWS)\n\n\n void adjustShadowValue1K( const float testDepth, const vec4 textureData, const float bias, inout float shadowValue ) {\n\n const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n if ( testDepth >= dot( textureData, bitSh ) * 1000.0 + bias )\n shadowValue += 1.0;\n\n }\n\n\n vec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\n vec3 absV = abs( v );\n\n\n float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n absV *= scaleToCube;\n\n\n v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\n\n vec2 planar = v.xy;\n\n float almostATexel = 1.5 * texelSizeY;\n float almostOne = 1.0 - almostATexel;\n\n if ( absV.z >= almostOne ) {\n\n if ( v.z > 0.0 )\n planar.x = 4.0 - v.x;\n\n } else if ( absV.x >= almostOne ) {\n\n float signX = sign( v.x );\n planar.x = v.z * signX + 2.0 * signX;\n\n } else if ( absV.y >= almostOne ) {\n\n float signY = sign( v.y );\n planar.x = v.x + 2.0 * signY + 2.0;\n planar.y = v.z * signY - 2.0;\n\n }\n\n\n return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n }\n\n #endif\n\n#endif\n",THREE.ShaderChunk.shadowmap_pars_vertex="#ifdef USE_SHADOWMAP\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform mat4 shadowMatrix[ MAX_SHADOWS ];\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n#endif",THREE.ShaderChunk.shadowmap_vertex="#ifdef USE_SHADOWMAP\n\n for ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n\n }\n\n#endif",THREE.ShaderChunk.skinbase_vertex="#ifdef USE_SKINNING\n\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif",THREE.ShaderChunk.skinning_pars_vertex="#ifdef USE_SKINNING\n\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n\n #ifdef BONE_TEXTURE\n\n uniform sampler2D boneTexture;\n uniform int boneTextureWidth;\n uniform int boneTextureHeight;\n\n mat4 getBoneMatrix( const in float i ) {\n\n float j = i * 4.0;\n float x = mod( j, float( boneTextureWidth ) );\n float y = floor( j / float( boneTextureWidth ) );\n\n float dx = 1.0 / float( boneTextureWidth );\n float dy = 1.0 / float( boneTextureHeight );\n\n y = dy * ( y + 0.5 );\n\n vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n mat4 bone = mat4( v1, v2, v3, v4 );\n\n return bone;\n\n }\n\n #else\n\n uniform mat4 boneGlobalMatrices[ MAX_BONES ];\n\n mat4 getBoneMatrix( const in float i ) {\n\n mat4 bone = boneGlobalMatrices[ int(i) ];\n return bone;\n\n }\n\n #endif\n\n#endif\n",THREE.ShaderChunk.skinning_vertex="#ifdef USE_SKINNING\n\n vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\n vec4 skinned = vec4( 0.0 );\n skinned += boneMatX * skinVertex * skinWeight.x;\n skinned += boneMatY * skinVertex * skinWeight.y;\n skinned += boneMatZ * skinVertex * skinWeight.z;\n skinned += boneMatW * skinVertex * skinWeight.w;\n skinned = bindMatrixInverse * skinned;\n\n#endif\n",THREE.ShaderChunk.skinnormal_vertex="#ifdef USE_SKINNING\n\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n#endif\n",THREE.ShaderChunk.specularmap_fragment="float specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n vec4 texelSpecular = texture2D( specularMap, vUv );\n specularStrength = texelSpecular.r;\n\n#else\n\n specularStrength = 1.0;\n\n#endif",THREE.ShaderChunk.specularmap_pars_fragment="#ifdef USE_SPECULARMAP\n\n uniform sampler2D specularMap;\n\n#endif",THREE.ShaderChunk.uv2_pars_fragment="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n varying vec2 vUv2;\n\n#endif",THREE.ShaderChunk.uv2_pars_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n attribute vec2 uv2;\n varying vec2 vUv2;\n\n#endif",THREE.ShaderChunk.uv2_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n vUv2 = uv2;\n\n#endif",THREE.ShaderChunk.uv_pars_fragment="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n varying vec2 vUv;\n\n#endif",THREE.ShaderChunk.uv_pars_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n varying vec2 vUv;\n uniform vec4 offsetRepeat;\n\n#endif\n",THREE.ShaderChunk.uv_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n vUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n\n#endif",THREE.ShaderChunk.worldpos_vertex="#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\n #ifdef USE_SKINNING\n\n vec4 worldPosition = modelMatrix * skinned;\n\n #else\n\n vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\n #endif\n\n#endif\n",THREE.UniformsUtils={merge:function(uniforms){for(var merged={},u=0;u dashSize ) {"," discard;"," }"," vec3 outgoingLight = vec3( 0.0 );"," vec4 diffuseColor = vec4( diffuse, opacity );",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.color_fragment," outgoingLight = diffuseColor.rgb;",THREE.ShaderChunk.fog_fragment," gl_FragColor = vec4( outgoingLight, diffuseColor.a );","}"].join("\n")},depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2e3},opacity:{type:"f",value:1}},vertexShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform float mNear;","uniform float mFar;","uniform float opacity;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {",THREE.ShaderChunk.logdepthbuf_fragment," #ifdef USE_LOGDEPTHBUF_EXT"," float depth = gl_FragDepthEXT / gl_FragCoord.w;"," #else"," float depth = gl_FragCoord.z / gl_FragCoord.w;"," #endif"," float color = 1.0 - smoothstep( mNear, mFar, depth );"," gl_FragColor = vec4( vec3( color ), opacity );","}"].join("\n")},normal:{uniforms:{opacity:{type:"f",value:1}},vertexShader:["varying vec3 vNormal;",THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {"," vNormal = normalize( normalMatrix * normal );",THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform float opacity;","varying vec3 vNormal;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {"," gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},cube:{uniforms:{tCube:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {"," vWorldPosition = transformDirection( position, modelMatrix );"," gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform samplerCube tCube;","uniform float tFlip;","varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {"," gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},equirect:{uniforms:{tEquirect:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {"," vWorldPosition = transformDirection( position, modelMatrix );"," gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform sampler2D tEquirect;","uniform float tFlip;","varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {","vec3 direction = normalize( vWorldPosition );","vec2 sampleUV;","sampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );","sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;","gl_FragColor = texture2D( tEquirect, sampleUV );",THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"vec4 pack_depth( const in float depth ) {"," const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );"," const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );"," vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );"," res -= res.xxyz * bit_mask;"," return res;","}","void main() {",THREE.ShaderChunk.logdepthbuf_fragment," #ifdef USE_LOGDEPTHBUF_EXT"," gl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );"," #else"," gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );"," #endif","}"].join("\n")},distanceRGBA:{uniforms:{lightPos:{type:"v3",value:new THREE.Vector3(0,0,0)}},vertexShader:["varying vec4 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.worldpos_vertex,"vWorldPosition = worldPosition;","}"].join("\n"),fragmentShader:["uniform vec3 lightPos;","varying vec4 vWorldPosition;",THREE.ShaderChunk.common,"vec4 pack1K ( float depth ) {"," depth /= 1000.0;"," const vec4 bitSh = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );"," const vec4 bitMsk = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );"," vec4 res = fract( depth * bitSh );"," res -= res.xxyz * bitMsk;"," return res; ","}","float unpack1K ( vec4 color ) {"," const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );"," return dot( color, bitSh ) * 1000.0;","}","void main () {"," gl_FragColor = pack1K( length( vWorldPosition.xyz - lightPos.xyz ) );","}"].join("\n")}},THREE.WebGLRenderer=function(parameters){function glClearColor(r,g,b,a){_premultipliedAlpha===!0&&(r*=a,g*=a,b*=a),_gl.clearColor(r,g,b,a)}function setDefaultGLState(){state.init(),_gl.viewport(_viewportX,_viewportY,_viewportWidth,_viewportHeight),glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)}function resetGLState(){_currentProgram=null,_currentCamera=null,_currentGeometryProgram="",_currentMaterialId=-1,_lightsNeedUpdate=!0,state.reset()}function onContextLost(event){event.preventDefault(),resetGLState(),setDefaultGLState(),properties.clear()}function onTextureDispose(event){var texture=event.target;texture.removeEventListener("dispose",onTextureDispose),deallocateTexture(texture),_infoMemory.textures--}function onRenderTargetDispose(event){var renderTarget=event.target;renderTarget.removeEventListener("dispose",onRenderTargetDispose),deallocateRenderTarget(renderTarget),_infoMemory.textures--}function onMaterialDispose(event){var material=event.target;material.removeEventListener("dispose",onMaterialDispose),deallocateMaterial(material)}function deallocateTexture(texture){var textureProperties=properties.get(texture);if(texture.image&&textureProperties.__image__webglTextureCube)_gl.deleteTexture(textureProperties.__image__webglTextureCube);else{if(void 0===textureProperties.__webglInit)return;_gl.deleteTexture(textureProperties.__webglTexture)}properties["delete"](texture)}function deallocateRenderTarget(renderTarget){var renderTargetProperties=properties.get(renderTarget),textureProperties=properties.get(renderTarget.texture);if(renderTarget&&void 0!==textureProperties.__webglTexture){if(_gl.deleteTexture(textureProperties.__webglTexture),renderTarget instanceof THREE.WebGLRenderTargetCube)for(var i=0;6>i;i++)_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]),_gl.deleteRenderbuffer(renderTargetProperties.__webglRenderbuffer[i]);else _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer),_gl.deleteRenderbuffer(renderTargetProperties.__webglRenderbuffer);properties["delete"](renderTarget.texture),properties["delete"](renderTarget)}}function deallocateMaterial(material){releaseMaterialProgramReference(material),properties["delete"](material)}function releaseMaterialProgramReference(material){var programInfo=properties.get(material).program;material.program=void 0,void 0!==programInfo&&programCache.releaseProgram(programInfo)}function setupVertexAttributes(material,program,geometry,startIndex){var extension;if(geometry instanceof THREE.InstancedBufferGeometry&&(extension=extensions.get("ANGLE_instanced_arrays"),null===extension))return void console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");void 0===startIndex&&(startIndex=0),state.initAttributes();var geometryAttributes=geometry.attributes,programAttributes=program.getAttributes(),materialDefaultAttributeValues=material.defaultAttributeValues;for(var name in programAttributes){var programAttribute=programAttributes[name];if(programAttribute>=0){var geometryAttribute=geometryAttributes[name];if(void 0!==geometryAttribute){var size=geometryAttribute.itemSize,buffer=objects.getAttributeBuffer(geometryAttribute);if(geometryAttribute instanceof THREE.InterleavedBufferAttribute){var data=geometryAttribute.data,stride=data.stride,offset=geometryAttribute.offset;data instanceof THREE.InstancedInterleavedBuffer?(state.enableAttributeAndDivisor(programAttribute,data.meshPerAttribute,extension),void 0===geometry.maxInstancedCount&&(geometry.maxInstancedCount=data.meshPerAttribute*data.count)):state.enableAttribute(programAttribute),_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer),_gl.vertexAttribPointer(programAttribute,size,_gl.FLOAT,!1,stride*data.array.BYTES_PER_ELEMENT,(startIndex*stride+offset)*data.array.BYTES_PER_ELEMENT)}else geometryAttribute instanceof THREE.InstancedBufferAttribute?(state.enableAttributeAndDivisor(programAttribute,geometryAttribute.meshPerAttribute,extension),void 0===geometry.maxInstancedCount&&(geometry.maxInstancedCount=geometryAttribute.meshPerAttribute*geometryAttribute.count)):state.enableAttribute(programAttribute),_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer),_gl.vertexAttribPointer(programAttribute,size,_gl.FLOAT,!1,0,startIndex*size*4)}else if(void 0!==materialDefaultAttributeValues){var value=materialDefaultAttributeValues[name];if(void 0!==value)switch(value.length){case 2:_gl.vertexAttrib2fv(programAttribute,value);break;case 3:_gl.vertexAttrib3fv(programAttribute,value);break;case 4:_gl.vertexAttrib4fv(programAttribute,value);break;default:_gl.vertexAttrib1fv(programAttribute,value)}}}}state.disableUnusedAttributes()}function numericalSort(a,b){return b[0]-a[0]}function painterSortStable(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function reversePainterSortStable(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function pushRenderItem(object,geometry,material,z,group){var array,index;material.transparent?(array=transparentObjects,index=++transparentObjectsLastIndex):(array=opaqueObjects,index=++opaqueObjectsLastIndex);var renderItem=array[index];void 0!==renderItem?(renderItem.id=object.id,renderItem.object=object,renderItem.geometry=geometry,renderItem.material=material,renderItem.z=_vector3.z,renderItem.group=group):(renderItem={id:object.id,object:object,geometry:geometry,material:material,z:_vector3.z,group:group},array.push(renderItem))}function projectObject(object,camera){if(object.visible!==!1){if(0!==(object.channels.mask&camera.channels.mask))if(object instanceof THREE.Light)lights.push(object);else if(object instanceof THREE.Sprite)sprites.push(object);else if(object instanceof THREE.LensFlare)lensFlares.push(object);else if(object instanceof THREE.ImmediateRenderObject)_this.sortObjects===!0&&(_vector3.setFromMatrixPosition(object.matrixWorld),_vector3.applyProjection(_projScreenMatrix)),pushRenderItem(object,null,object.material,_vector3.z,null);else if((object instanceof THREE.Mesh||object instanceof THREE.Line||object instanceof THREE.Points)&&(object instanceof THREE.SkinnedMesh&&object.skeleton.update(),object.frustumCulled===!1||_frustum.intersectsObject(object)===!0)){var material=object.material;if(material.visible===!0){_this.sortObjects===!0&&(_vector3.setFromMatrixPosition(object.matrixWorld),_vector3.applyProjection(_projScreenMatrix));var geometry=objects.update(object);if(material instanceof THREE.MeshFaceMaterial)for(var groups=geometry.groups,materials=material.materials,i=0,l=groups.length;l>i;i++){var group=groups[i],groupMaterial=materials[group.materialIndex];groupMaterial.visible===!0&&pushRenderItem(object,geometry,groupMaterial,_vector3.z,group)}else pushRenderItem(object,geometry,material,_vector3.z,null)}}for(var children=object.children,i=0,l=children.length;l>i;i++)projectObject(children[i],camera)}}function renderObjects(renderList,camera,lights,fog,overrideMaterial){for(var i=0,l=renderList.length;l>i;i++){var renderItem=renderList[i],object=renderItem.object,geometry=renderItem.geometry,material=void 0===overrideMaterial?renderItem.material:overrideMaterial,group=renderItem.group;if(object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld),object.normalMatrix.getNormalMatrix(object.modelViewMatrix),object instanceof THREE.ImmediateRenderObject){setMaterial(material);var program=setProgram(camera,lights,fog,material,object);_currentGeometryProgram="",object.render(function(object){_this.renderBufferImmediate(object,program,material)})}else _this.renderBufferDirect(camera,lights,fog,geometry,material,object,group)}}function initMaterial(material,lights,fog,object){var materialProperties=properties.get(material),parameters=programCache.getParameters(material,lights,fog,object),code=programCache.getProgramCode(material,parameters),program=materialProperties.program,programChange=!0;if(void 0===program)material.addEventListener("dispose",onMaterialDispose);else if(program.code!==code)releaseMaterialProgramReference(material);else{if(void 0!==parameters.shaderID)return;programChange=!1}if(programChange){if(parameters.shaderID){var shader=THREE.ShaderLib[parameters.shaderID];materialProperties.__webglShader={name:material.type,uniforms:THREE.UniformsUtils.clone(shader.uniforms),vertexShader:shader.vertexShader,fragmentShader:shader.fragmentShader}}else materialProperties.__webglShader={name:material.type,uniforms:material.uniforms,vertexShader:material.vertexShader,fragmentShader:material.fragmentShader};material.__webglShader=materialProperties.__webglShader,program=programCache.acquireProgram(material,parameters,code),materialProperties.program=program,material.program=program}var attributes=program.getAttributes();if(material.morphTargets){material.numSupportedMorphTargets=0;for(var i=0;i<_this.maxMorphTargets;i++)attributes["morphTarget"+i]>=0&&material.numSupportedMorphTargets++}if(material.morphNormals)for(material.numSupportedMorphNormals=0,i=0;i<_this.maxMorphNormals;i++)attributes["morphNormal"+i]>=0&&material.numSupportedMorphNormals++;materialProperties.uniformsList=[];var uniformLocations=materialProperties.program.getUniforms();for(var u in materialProperties.__webglShader.uniforms){var location=uniformLocations[u];location&&materialProperties.uniformsList.push([materialProperties.__webglShader.uniforms[u],location])}}function setMaterial(material){setMaterialFaces(material),material.transparent===!0?state.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst,material.blendEquationAlpha,material.blendSrcAlpha,material.blendDstAlpha):state.setBlending(THREE.NoBlending),state.setDepthFunc(material.depthFunc),state.setDepthTest(material.depthTest),state.setDepthWrite(material.depthWrite),state.setColorWrite(material.colorWrite),state.setPolygonOffset(material.polygonOffset,material.polygonOffsetFactor,material.polygonOffsetUnits)}function setMaterialFaces(material){material.side!==THREE.DoubleSide?state.enable(_gl.CULL_FACE):state.disable(_gl.CULL_FACE),state.setFlipSided(material.side===THREE.BackSide)}function setProgram(camera,lights,fog,material,object){_usedTextureUnits=0;var materialProperties=properties.get(material);!material.needsUpdate&&materialProperties.program||(initMaterial(material,lights,fog,object),material.needsUpdate=!1);var refreshProgram=!1,refreshMaterial=!1,refreshLights=!1,program=materialProperties.program,p_uniforms=program.getUniforms(),m_uniforms=materialProperties.__webglShader.uniforms;if(program.id!==_currentProgram&&(_gl.useProgram(program.program),_currentProgram=program.id,refreshProgram=!0,refreshMaterial=!0,refreshLights=!0),material.id!==_currentMaterialId&&(-1===_currentMaterialId&&(refreshLights=!0),_currentMaterialId=material.id,refreshMaterial=!0),(refreshProgram||camera!==_currentCamera)&&(_gl.uniformMatrix4fv(p_uniforms.projectionMatrix,!1,camera.projectionMatrix.elements),capabilities.logarithmicDepthBuffer&&_gl.uniform1f(p_uniforms.logDepthBufFC,2/(Math.log(camera.far+1)/Math.LN2)),camera!==_currentCamera&&(_currentCamera=camera),(material instanceof THREE.ShaderMaterial||material instanceof THREE.MeshPhongMaterial||material.envMap)&&void 0!==p_uniforms.cameraPosition&&(_vector3.setFromMatrixPosition(camera.matrixWorld),_gl.uniform3f(p_uniforms.cameraPosition,_vector3.x,_vector3.y,_vector3.z)),(material instanceof THREE.MeshPhongMaterial||material instanceof THREE.MeshLambertMaterial||material instanceof THREE.MeshBasicMaterial||material instanceof THREE.ShaderMaterial||material.skinning)&&void 0!==p_uniforms.viewMatrix&&_gl.uniformMatrix4fv(p_uniforms.viewMatrix,!1,camera.matrixWorldInverse.elements)),material.skinning)if(object.bindMatrix&&void 0!==p_uniforms.bindMatrix&&_gl.uniformMatrix4fv(p_uniforms.bindMatrix,!1,object.bindMatrix.elements),object.bindMatrixInverse&&void 0!==p_uniforms.bindMatrixInverse&&_gl.uniformMatrix4fv(p_uniforms.bindMatrixInverse,!1,object.bindMatrixInverse.elements),capabilities.floatVertexTextures&&object.skeleton&&object.skeleton.useVertexTexture){if(void 0!==p_uniforms.boneTexture){var textureUnit=getTextureUnit();_gl.uniform1i(p_uniforms.boneTexture,textureUnit),_this.setTexture(object.skeleton.boneTexture,textureUnit)}void 0!==p_uniforms.boneTextureWidth&&_gl.uniform1i(p_uniforms.boneTextureWidth,object.skeleton.boneTextureWidth),void 0!==p_uniforms.boneTextureHeight&&_gl.uniform1i(p_uniforms.boneTextureHeight,object.skeleton.boneTextureHeight)}else object.skeleton&&object.skeleton.boneMatrices&&void 0!==p_uniforms.boneGlobalMatrices&&_gl.uniformMatrix4fv(p_uniforms.boneGlobalMatrices,!1,object.skeleton.boneMatrices);return refreshMaterial&&(fog&&material.fog&&refreshUniformsFog(m_uniforms,fog),(material instanceof THREE.MeshPhongMaterial||material instanceof THREE.MeshLambertMaterial||material.lights)&&(_lightsNeedUpdate&&(refreshLights=!0,setupLights(lights,camera),_lightsNeedUpdate=!1),refreshLights?(refreshUniformsLights(m_uniforms,_lights),markUniformsLightsNeedsUpdate(m_uniforms,!0)):markUniformsLightsNeedsUpdate(m_uniforms,!1)),(material instanceof THREE.MeshBasicMaterial||material instanceof THREE.MeshLambertMaterial||material instanceof THREE.MeshPhongMaterial)&&refreshUniformsCommon(m_uniforms,material),material instanceof THREE.LineBasicMaterial?refreshUniformsLine(m_uniforms,material):material instanceof THREE.LineDashedMaterial?(refreshUniformsLine(m_uniforms,material),refreshUniformsDash(m_uniforms,material)):material instanceof THREE.PointsMaterial?refreshUniformsParticle(m_uniforms,material):material instanceof THREE.MeshPhongMaterial?refreshUniformsPhong(m_uniforms,material):material instanceof THREE.MeshDepthMaterial?(m_uniforms.mNear.value=camera.near,m_uniforms.mFar.value=camera.far,m_uniforms.opacity.value=material.opacity):material instanceof THREE.MeshNormalMaterial&&(m_uniforms.opacity.value=material.opacity),object.receiveShadow&&!material._shadowPass&&refreshUniformsShadow(m_uniforms,lights,camera),loadUniformsGeneric(materialProperties.uniformsList)),loadUniformsMatrices(p_uniforms,object),void 0!==p_uniforms.modelMatrix&&_gl.uniformMatrix4fv(p_uniforms.modelMatrix,!1,object.matrixWorld.elements),program}function refreshUniformsCommon(uniforms,material){uniforms.opacity.value=material.opacity,uniforms.diffuse.value=material.color,material.emissive&&(uniforms.emissive.value=material.emissive),uniforms.map.value=material.map,uniforms.specularMap.value=material.specularMap,uniforms.alphaMap.value=material.alphaMap,material.aoMap&&(uniforms.aoMap.value=material.aoMap,uniforms.aoMapIntensity.value=material.aoMapIntensity);var uvScaleMap;if(material.map?uvScaleMap=material.map:material.specularMap?uvScaleMap=material.specularMap:material.displacementMap?uvScaleMap=material.displacementMap:material.normalMap?uvScaleMap=material.normalMap:material.bumpMap?uvScaleMap=material.bumpMap:material.alphaMap?uvScaleMap=material.alphaMap:material.emissiveMap&&(uvScaleMap=material.emissiveMap),void 0!==uvScaleMap){uvScaleMap instanceof THREE.WebGLRenderTarget&&(uvScaleMap=uvScaleMap.texture);var offset=uvScaleMap.offset,repeat=uvScaleMap.repeat;uniforms.offsetRepeat.value.set(offset.x,offset.y,repeat.x,repeat.y)}uniforms.envMap.value=material.envMap,uniforms.flipEnvMap.value=material.envMap instanceof THREE.WebGLRenderTargetCube?1:-1,uniforms.reflectivity.value=material.reflectivity,uniforms.refractionRatio.value=material.refractionRatio}function refreshUniformsLine(uniforms,material){uniforms.diffuse.value=material.color,uniforms.opacity.value=material.opacity; +}function refreshUniformsDash(uniforms,material){uniforms.dashSize.value=material.dashSize,uniforms.totalSize.value=material.dashSize+material.gapSize,uniforms.scale.value=material.scale}function refreshUniformsParticle(uniforms,material){if(uniforms.psColor.value=material.color,uniforms.opacity.value=material.opacity,uniforms.size.value=material.size,uniforms.scale.value=_canvas.height/2,uniforms.map.value=material.map,null!==material.map){var offset=material.map.offset,repeat=material.map.repeat;uniforms.offsetRepeat.value.set(offset.x,offset.y,repeat.x,repeat.y)}}function refreshUniformsFog(uniforms,fog){uniforms.fogColor.value=fog.color,fog instanceof THREE.Fog?(uniforms.fogNear.value=fog.near,uniforms.fogFar.value=fog.far):fog instanceof THREE.FogExp2&&(uniforms.fogDensity.value=fog.density)}function refreshUniformsPhong(uniforms,material){uniforms.specular.value=material.specular,uniforms.shininess.value=Math.max(material.shininess,1e-4),material.lightMap&&(uniforms.lightMap.value=material.lightMap,uniforms.lightMapIntensity.value=material.lightMapIntensity),material.emissiveMap&&(uniforms.emissiveMap.value=material.emissiveMap),material.bumpMap&&(uniforms.bumpMap.value=material.bumpMap,uniforms.bumpScale.value=material.bumpScale),material.normalMap&&(uniforms.normalMap.value=material.normalMap,uniforms.normalScale.value.copy(material.normalScale)),material.displacementMap&&(uniforms.displacementMap.value=material.displacementMap,uniforms.displacementScale.value=material.displacementScale,uniforms.displacementBias.value=material.displacementBias)}function refreshUniformsLights(uniforms,lights){uniforms.ambientLightColor.value=lights.ambient,uniforms.directionalLightColor.value=lights.directional.colors,uniforms.directionalLightDirection.value=lights.directional.positions,uniforms.pointLightColor.value=lights.point.colors,uniforms.pointLightPosition.value=lights.point.positions,uniforms.pointLightDistance.value=lights.point.distances,uniforms.pointLightDecay.value=lights.point.decays,uniforms.spotLightColor.value=lights.spot.colors,uniforms.spotLightPosition.value=lights.spot.positions,uniforms.spotLightDistance.value=lights.spot.distances,uniforms.spotLightDirection.value=lights.spot.directions,uniforms.spotLightAngleCos.value=lights.spot.anglesCos,uniforms.spotLightExponent.value=lights.spot.exponents,uniforms.spotLightDecay.value=lights.spot.decays,uniforms.hemisphereLightSkyColor.value=lights.hemi.skyColors,uniforms.hemisphereLightGroundColor.value=lights.hemi.groundColors,uniforms.hemisphereLightDirection.value=lights.hemi.positions}function markUniformsLightsNeedsUpdate(uniforms,value){uniforms.ambientLightColor.needsUpdate=value,uniforms.directionalLightColor.needsUpdate=value,uniforms.directionalLightDirection.needsUpdate=value,uniforms.pointLightColor.needsUpdate=value,uniforms.pointLightPosition.needsUpdate=value,uniforms.pointLightDistance.needsUpdate=value,uniforms.pointLightDecay.needsUpdate=value,uniforms.spotLightColor.needsUpdate=value,uniforms.spotLightPosition.needsUpdate=value,uniforms.spotLightDistance.needsUpdate=value,uniforms.spotLightDirection.needsUpdate=value,uniforms.spotLightAngleCos.needsUpdate=value,uniforms.spotLightExponent.needsUpdate=value,uniforms.spotLightDecay.needsUpdate=value,uniforms.hemisphereLightSkyColor.needsUpdate=value,uniforms.hemisphereLightGroundColor.needsUpdate=value,uniforms.hemisphereLightDirection.needsUpdate=value}function refreshUniformsShadow(uniforms,lights,camera){if(uniforms.shadowMatrix)for(var j=0,i=0,il=lights.length;il>i;i++){var light=lights[i];if(light.castShadow===!0&&(light instanceof THREE.PointLight||light instanceof THREE.SpotLight||light instanceof THREE.DirectionalLight)){var shadow=light.shadow;light instanceof THREE.PointLight?(_vector3.setFromMatrixPosition(light.matrixWorld).negate(),shadow.matrix.identity().setPosition(_vector3),uniforms.shadowDarkness.value[j]=-shadow.darkness):uniforms.shadowDarkness.value[j]=shadow.darkness,uniforms.shadowMatrix.value[j]=shadow.matrix,uniforms.shadowMap.value[j]=shadow.map,uniforms.shadowMapSize.value[j]=shadow.mapSize,uniforms.shadowBias.value[j]=shadow.bias,j++}}}function loadUniformsMatrices(uniforms,object){_gl.uniformMatrix4fv(uniforms.modelViewMatrix,!1,object.modelViewMatrix.elements),uniforms.normalMatrix&&_gl.uniformMatrix3fv(uniforms.normalMatrix,!1,object.normalMatrix.elements)}function getTextureUnit(){var textureUnit=_usedTextureUnits;return textureUnit>=capabilities.maxTextures&&console.warn("WebGLRenderer: trying to use "+textureUnit+" texture units while this GPU supports only "+capabilities.maxTextures),_usedTextureUnits+=1,textureUnit}function loadUniformsGeneric(uniforms){for(var texture,textureUnit,j=0,jl=uniforms.length;jl>j;j++){var uniform=uniforms[j][0];if(uniform.needsUpdate!==!1){var type=uniform.type,value=uniform.value,location=uniforms[j][1];switch(type){case"1i":_gl.uniform1i(location,value);break;case"1f":_gl.uniform1f(location,value);break;case"2f":_gl.uniform2f(location,value[0],value[1]);break;case"3f":_gl.uniform3f(location,value[0],value[1],value[2]);break;case"4f":_gl.uniform4f(location,value[0],value[1],value[2],value[3]);break;case"1iv":_gl.uniform1iv(location,value);break;case"3iv":_gl.uniform3iv(location,value);break;case"1fv":_gl.uniform1fv(location,value);break;case"2fv":_gl.uniform2fv(location,value);break;case"3fv":_gl.uniform3fv(location,value);break;case"4fv":_gl.uniform4fv(location,value);break;case"Matrix3fv":_gl.uniformMatrix3fv(location,!1,value);break;case"Matrix4fv":_gl.uniformMatrix4fv(location,!1,value);break;case"i":_gl.uniform1i(location,value);break;case"f":_gl.uniform1f(location,value);break;case"v2":_gl.uniform2f(location,value.x,value.y);break;case"v3":_gl.uniform3f(location,value.x,value.y,value.z);break;case"v4":_gl.uniform4f(location,value.x,value.y,value.z,value.w);break;case"c":_gl.uniform3f(location,value.r,value.g,value.b);break;case"iv1":_gl.uniform1iv(location,value);break;case"iv":_gl.uniform3iv(location,value);break;case"fv1":_gl.uniform1fv(location,value);break;case"fv":_gl.uniform3fv(location,value);break;case"v2v":void 0===uniform._array&&(uniform._array=new Float32Array(2*value.length));for(var i=0,i2=0,il=value.length;il>i;i++,i2+=2)uniform._array[i2+0]=value[i].x,uniform._array[i2+1]=value[i].y;_gl.uniform2fv(location,uniform._array);break;case"v3v":void 0===uniform._array&&(uniform._array=new Float32Array(3*value.length));for(var i=0,i3=0,il=value.length;il>i;i++,i3+=3)uniform._array[i3+0]=value[i].x,uniform._array[i3+1]=value[i].y,uniform._array[i3+2]=value[i].z;_gl.uniform3fv(location,uniform._array);break;case"v4v":void 0===uniform._array&&(uniform._array=new Float32Array(4*value.length));for(var i=0,i4=0,il=value.length;il>i;i++,i4+=4)uniform._array[i4+0]=value[i].x,uniform._array[i4+1]=value[i].y,uniform._array[i4+2]=value[i].z,uniform._array[i4+3]=value[i].w;_gl.uniform4fv(location,uniform._array);break;case"m3":_gl.uniformMatrix3fv(location,!1,value.elements);break;case"m3v":void 0===uniform._array&&(uniform._array=new Float32Array(9*value.length));for(var i=0,il=value.length;il>i;i++)value[i].flattenToArrayOffset(uniform._array,9*i);_gl.uniformMatrix3fv(location,!1,uniform._array);break;case"m4":_gl.uniformMatrix4fv(location,!1,value.elements);break;case"m4v":void 0===uniform._array&&(uniform._array=new Float32Array(16*value.length));for(var i=0,il=value.length;il>i;i++)value[i].flattenToArrayOffset(uniform._array,16*i);_gl.uniformMatrix4fv(location,!1,uniform._array);break;case"t":if(texture=value,textureUnit=getTextureUnit(),_gl.uniform1i(location,textureUnit),!texture)continue;texture instanceof THREE.CubeTexture||Array.isArray(texture.image)&&6===texture.image.length?setCubeTexture(texture,textureUnit):texture instanceof THREE.WebGLRenderTargetCube?setCubeTextureDynamic(texture.texture,textureUnit):texture instanceof THREE.WebGLRenderTarget?_this.setTexture(texture.texture,textureUnit):_this.setTexture(texture,textureUnit);break;case"tv":void 0===uniform._array&&(uniform._array=[]);for(var i=0,il=uniform.value.length;il>i;i++)uniform._array[i]=getTextureUnit();_gl.uniform1iv(location,uniform._array);for(var i=0,il=uniform.value.length;il>i;i++)texture=uniform.value[i],textureUnit=uniform._array[i],texture&&(texture instanceof THREE.CubeTexture||texture.image instanceof Array&&6===texture.image.length?setCubeTexture(texture,textureUnit):texture instanceof THREE.WebGLRenderTarget?_this.setTexture(texture.texture,textureUnit):texture instanceof THREE.WebGLRenderTargetCube?setCubeTextureDynamic(texture.texture,textureUnit):_this.setTexture(texture,textureUnit));break;default:console.warn("THREE.WebGLRenderer: Unknown uniform type: "+type)}}}}function setColorLinear(array,offset,color,intensity){array[offset+0]=color.r*intensity,array[offset+1]=color.g*intensity,array[offset+2]=color.b*intensity}function setupLights(lights,camera){var l,ll,light,color,skyColor,groundColor,intensity,distance,r=0,g=0,b=0,zlights=_lights,viewMatrix=camera.matrixWorldInverse,dirColors=zlights.directional.colors,dirPositions=zlights.directional.positions,pointColors=zlights.point.colors,pointPositions=zlights.point.positions,pointDistances=zlights.point.distances,pointDecays=zlights.point.decays,spotColors=zlights.spot.colors,spotPositions=zlights.spot.positions,spotDistances=zlights.spot.distances,spotDirections=zlights.spot.directions,spotAnglesCos=zlights.spot.anglesCos,spotExponents=zlights.spot.exponents,spotDecays=zlights.spot.decays,hemiSkyColors=zlights.hemi.skyColors,hemiGroundColors=zlights.hemi.groundColors,hemiPositions=zlights.hemi.positions,dirLength=0,pointLength=0,spotLength=0,hemiLength=0,dirCount=0,pointCount=0,spotCount=0,hemiCount=0,dirOffset=0,pointOffset=0,spotOffset=0,hemiOffset=0;for(l=0,ll=lights.length;ll>l;l++)if(light=lights[l],color=light.color,intensity=light.intensity,distance=light.distance,light instanceof THREE.AmbientLight){if(!light.visible)continue;r+=color.r,g+=color.g,b+=color.b}else if(light instanceof THREE.DirectionalLight){if(dirCount+=1,!light.visible)continue;_direction.setFromMatrixPosition(light.matrixWorld),_vector3.setFromMatrixPosition(light.target.matrixWorld),_direction.sub(_vector3),_direction.transformDirection(viewMatrix),dirOffset=3*dirLength,dirPositions[dirOffset+0]=_direction.x,dirPositions[dirOffset+1]=_direction.y,dirPositions[dirOffset+2]=_direction.z,setColorLinear(dirColors,dirOffset,color,intensity),dirLength+=1}else if(light instanceof THREE.PointLight){if(pointCount+=1,!light.visible)continue;pointOffset=3*pointLength,setColorLinear(pointColors,pointOffset,color,intensity),_vector3.setFromMatrixPosition(light.matrixWorld),_vector3.applyMatrix4(viewMatrix),pointPositions[pointOffset+0]=_vector3.x,pointPositions[pointOffset+1]=_vector3.y,pointPositions[pointOffset+2]=_vector3.z,pointDistances[pointLength]=distance,pointDecays[pointLength]=0===light.distance?0:light.decay,pointLength+=1}else if(light instanceof THREE.SpotLight){if(spotCount+=1,!light.visible)continue;spotOffset=3*spotLength,setColorLinear(spotColors,spotOffset,color,intensity),_direction.setFromMatrixPosition(light.matrixWorld),_vector3.copy(_direction).applyMatrix4(viewMatrix),spotPositions[spotOffset+0]=_vector3.x,spotPositions[spotOffset+1]=_vector3.y,spotPositions[spotOffset+2]=_vector3.z,spotDistances[spotLength]=distance,_vector3.setFromMatrixPosition(light.target.matrixWorld),_direction.sub(_vector3),_direction.transformDirection(viewMatrix),spotDirections[spotOffset+0]=_direction.x,spotDirections[spotOffset+1]=_direction.y,spotDirections[spotOffset+2]=_direction.z,spotAnglesCos[spotLength]=Math.cos(light.angle),spotExponents[spotLength]=light.exponent,spotDecays[spotLength]=0===light.distance?0:light.decay,spotLength+=1}else if(light instanceof THREE.HemisphereLight){if(hemiCount+=1,!light.visible)continue;_direction.setFromMatrixPosition(light.matrixWorld),_direction.transformDirection(viewMatrix),hemiOffset=3*hemiLength,hemiPositions[hemiOffset+0]=_direction.x,hemiPositions[hemiOffset+1]=_direction.y,hemiPositions[hemiOffset+2]=_direction.z,skyColor=light.color,groundColor=light.groundColor,setColorLinear(hemiSkyColors,hemiOffset,skyColor,intensity),setColorLinear(hemiGroundColors,hemiOffset,groundColor,intensity),hemiLength+=1}for(l=3*dirLength,ll=Math.max(dirColors.length,3*dirCount);ll>l;l++)dirColors[l]=0;for(l=3*pointLength,ll=Math.max(pointColors.length,3*pointCount);ll>l;l++)pointColors[l]=0;for(l=3*spotLength,ll=Math.max(spotColors.length,3*spotCount);ll>l;l++)spotColors[l]=0;for(l=3*hemiLength,ll=Math.max(hemiSkyColors.length,3*hemiCount);ll>l;l++)hemiSkyColors[l]=0;for(l=3*hemiLength,ll=Math.max(hemiGroundColors.length,3*hemiCount);ll>l;l++)hemiGroundColors[l]=0;zlights.directional.length=dirLength,zlights.point.length=pointLength,zlights.spot.length=spotLength,zlights.hemi.length=hemiLength,zlights.ambient[0]=r,zlights.ambient[1]=g,zlights.ambient[2]=b}function setTextureParameters(textureType,texture,isImagePowerOfTwo){var extension;if(isImagePowerOfTwo?(_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,paramThreeToGL(texture.wrapS)),_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,paramThreeToGL(texture.wrapT)),_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,paramThreeToGL(texture.magFilter)),_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,paramThreeToGL(texture.minFilter))):(_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,_gl.CLAMP_TO_EDGE),_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,_gl.CLAMP_TO_EDGE),texture.wrapS===THREE.ClampToEdgeWrapping&&texture.wrapT===THREE.ClampToEdgeWrapping||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",texture),_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,filterFallback(texture.magFilter)),_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,filterFallback(texture.minFilter)),texture.minFilter!==THREE.NearestFilter&&texture.minFilter!==THREE.LinearFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",texture)),extension=extensions.get("EXT_texture_filter_anisotropic")){if(texture.type===THREE.FloatType&&null===extensions.get("OES_texture_float_linear"))return;if(texture.type===THREE.HalfFloatType&&null===extensions.get("OES_texture_half_float_linear"))return;(texture.anisotropy>1||properties.get(texture).__currentAnisotropy)&&(_gl.texParameterf(textureType,extension.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(texture.anisotropy,_this.getMaxAnisotropy())),properties.get(texture).__currentAnisotropy=texture.anisotropy)}}function uploadTexture(textureProperties,texture,slot){void 0===textureProperties.__webglInit&&(textureProperties.__webglInit=!0,texture.addEventListener("dispose",onTextureDispose),textureProperties.__webglTexture=_gl.createTexture(),_infoMemory.textures++),state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture),_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY),_gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL,texture.premultiplyAlpha),_gl.pixelStorei(_gl.UNPACK_ALIGNMENT,texture.unpackAlignment),texture.image=clampToMaxSize(texture.image,capabilities.maxTextureSize),textureNeedsPowerOfTwo(texture)&&isPowerOfTwo(texture.image)===!1&&(texture.image=makePowerOfTwo(texture.image));var image=texture.image,isImagePowerOfTwo=isPowerOfTwo(image),glFormat=paramThreeToGL(texture.format),glType=paramThreeToGL(texture.type);setTextureParameters(_gl.TEXTURE_2D,texture,isImagePowerOfTwo);var mipmap,mipmaps=texture.mipmaps;if(texture instanceof THREE.DataTexture)if(mipmaps.length>0&&isImagePowerOfTwo){for(var i=0,il=mipmaps.length;il>i;i++)mipmap=mipmaps[i],state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);texture.generateMipmaps=!1}else state.texImage2D(_gl.TEXTURE_2D,0,glFormat,image.width,image.height,0,glFormat,glType,image.data);else if(texture instanceof THREE.CompressedTexture)for(var i=0,il=mipmaps.length;il>i;i++)mipmap=mipmaps[i],texture.format!==THREE.RGBAFormat&&texture.format!==THREE.RGBFormat?state.getCompressedTextureFormats().indexOf(glFormat)>-1?state.compressedTexImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,mipmap.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);else if(mipmaps.length>0&&isImagePowerOfTwo){for(var i=0,il=mipmaps.length;il>i;i++)mipmap=mipmaps[i],state.texImage2D(_gl.TEXTURE_2D,i,glFormat,glFormat,glType,mipmap);texture.generateMipmaps=!1}else state.texImage2D(_gl.TEXTURE_2D,0,glFormat,glFormat,glType,texture.image);texture.generateMipmaps&&isImagePowerOfTwo&&_gl.generateMipmap(_gl.TEXTURE_2D),textureProperties.__version=texture.version,texture.onUpdate&&texture.onUpdate(texture)}function clampToMaxSize(image,maxSize){if(image.width>maxSize||image.height>maxSize){var scale=maxSize/Math.max(image.width,image.height),canvas=document.createElement("canvas");canvas.width=Math.floor(image.width*scale),canvas.height=Math.floor(image.height*scale);var context=canvas.getContext("2d");return context.drawImage(image,0,0,image.width,image.height,0,0,canvas.width,canvas.height),console.warn("THREE.WebGLRenderer: image is too big ("+image.width+"x"+image.height+"). Resized to "+canvas.width+"x"+canvas.height,image),canvas}return image}function isPowerOfTwo(image){return THREE.Math.isPowerOfTwo(image.width)&&THREE.Math.isPowerOfTwo(image.height)}function textureNeedsPowerOfTwo(texture){return texture.wrapS!==THREE.ClampToEdgeWrapping||texture.wrapT!==THREE.ClampToEdgeWrapping?!0:texture.minFilter!==THREE.NearestFilter&&texture.minFilter!==THREE.LinearFilter}function makePowerOfTwo(image){if(image instanceof HTMLImageElement||image instanceof HTMLCanvasElement){var canvas=document.createElement("canvas");canvas.width=THREE.Math.nearestPowerOfTwo(image.width),canvas.height=THREE.Math.nearestPowerOfTwo(image.height);var context=canvas.getContext("2d");return context.drawImage(image,0,0,canvas.width,canvas.height),console.warn("THREE.WebGLRenderer: image is not power of two ("+image.width+"x"+image.height+"). Resized to "+canvas.width+"x"+canvas.height,image),canvas}return image}function setCubeTexture(texture,slot){var textureProperties=properties.get(texture);if(6===texture.image.length)if(texture.version>0&&textureProperties.__version!==texture.version){textureProperties.__image__webglTextureCube||(texture.addEventListener("dispose",onTextureDispose),textureProperties.__image__webglTextureCube=_gl.createTexture(),_infoMemory.textures++),state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube),_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);for(var isCompressed=texture instanceof THREE.CompressedTexture,isDataTexture=texture.image[0]instanceof THREE.DataTexture,cubeImage=[],i=0;6>i;i++)!_this.autoScaleCubemaps||isCompressed||isDataTexture?cubeImage[i]=isDataTexture?texture.image[i].image:texture.image[i]:cubeImage[i]=clampToMaxSize(texture.image[i],capabilities.maxCubemapSize);var image=cubeImage[0],isImagePowerOfTwo=isPowerOfTwo(image),glFormat=paramThreeToGL(texture.format),glType=paramThreeToGL(texture.type);setTextureParameters(_gl.TEXTURE_CUBE_MAP,texture,isImagePowerOfTwo);for(var i=0;6>i;i++)if(isCompressed)for(var mipmap,mipmaps=cubeImage[i].mipmaps,j=0,jl=mipmaps.length;jl>j;j++)mipmap=mipmaps[j],texture.format!==THREE.RGBAFormat&&texture.format!==THREE.RGBFormat?state.getCompressedTextureFormats().indexOf(glFormat)>-1?state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,mipmap.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()"):state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);else isDataTexture?state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,cubeImage[i].width,cubeImage[i].height,0,glFormat,glType,cubeImage[i].data):state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,glFormat,glType,cubeImage[i]);texture.generateMipmaps&&isImagePowerOfTwo&&_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP),textureProperties.__version=texture.version,texture.onUpdate&&texture.onUpdate(texture)}else state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube)}function setCubeTextureDynamic(texture,slot){state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_CUBE_MAP,properties.get(texture).__webglTexture)}function setupFrameBuffer(framebuffer,renderTarget,textureTarget){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer),_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.COLOR_ATTACHMENT0,textureTarget,properties.get(renderTarget.texture).__webglTexture,0)}function setupRenderBuffer(renderbuffer,renderTarget){_gl.bindRenderbuffer(_gl.RENDERBUFFER,renderbuffer),renderTarget.depthBuffer&&!renderTarget.stencilBuffer?(_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.DEPTH_COMPONENT16,renderTarget.width,renderTarget.height),_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.RENDERBUFFER,renderbuffer)):renderTarget.depthBuffer&&renderTarget.stencilBuffer?(_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.DEPTH_STENCIL,renderTarget.width,renderTarget.height),_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.RENDERBUFFER,renderbuffer)):_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.RGBA4,renderTarget.width,renderTarget.height)}function updateRenderTargetMipmap(renderTarget){var target=renderTarget instanceof THREE.WebGLRenderTargetCube?_gl.TEXTURE_CUBE_MAP:_gl.TEXTURE_2D,texture=properties.get(renderTarget.texture).__webglTexture;state.bindTexture(target,texture),_gl.generateMipmap(target),state.bindTexture(target,null)}function filterFallback(f){return f===THREE.NearestFilter||f===THREE.NearestMipMapNearestFilter||f===THREE.NearestMipMapLinearFilter?_gl.NEAREST:_gl.LINEAR}function paramThreeToGL(p){var extension;if(p===THREE.RepeatWrapping)return _gl.REPEAT;if(p===THREE.ClampToEdgeWrapping)return _gl.CLAMP_TO_EDGE;if(p===THREE.MirroredRepeatWrapping)return _gl.MIRRORED_REPEAT;if(p===THREE.NearestFilter)return _gl.NEAREST;if(p===THREE.NearestMipMapNearestFilter)return _gl.NEAREST_MIPMAP_NEAREST;if(p===THREE.NearestMipMapLinearFilter)return _gl.NEAREST_MIPMAP_LINEAR;if(p===THREE.LinearFilter)return _gl.LINEAR;if(p===THREE.LinearMipMapNearestFilter)return _gl.LINEAR_MIPMAP_NEAREST;if(p===THREE.LinearMipMapLinearFilter)return _gl.LINEAR_MIPMAP_LINEAR;if(p===THREE.UnsignedByteType)return _gl.UNSIGNED_BYTE;if(p===THREE.UnsignedShort4444Type)return _gl.UNSIGNED_SHORT_4_4_4_4;if(p===THREE.UnsignedShort5551Type)return _gl.UNSIGNED_SHORT_5_5_5_1;if(p===THREE.UnsignedShort565Type)return _gl.UNSIGNED_SHORT_5_6_5;if(p===THREE.ByteType)return _gl.BYTE;if(p===THREE.ShortType)return _gl.SHORT;if(p===THREE.UnsignedShortType)return _gl.UNSIGNED_SHORT;if(p===THREE.IntType)return _gl.INT;if(p===THREE.UnsignedIntType)return _gl.UNSIGNED_INT;if(p===THREE.FloatType)return _gl.FLOAT;if(extension=extensions.get("OES_texture_half_float"),null!==extension&&p===THREE.HalfFloatType)return extension.HALF_FLOAT_OES;if(p===THREE.AlphaFormat)return _gl.ALPHA;if(p===THREE.RGBFormat)return _gl.RGB;if(p===THREE.RGBAFormat)return _gl.RGBA;if(p===THREE.LuminanceFormat)return _gl.LUMINANCE;if(p===THREE.LuminanceAlphaFormat)return _gl.LUMINANCE_ALPHA;if(p===THREE.AddEquation)return _gl.FUNC_ADD;if(p===THREE.SubtractEquation)return _gl.FUNC_SUBTRACT;if(p===THREE.ReverseSubtractEquation)return _gl.FUNC_REVERSE_SUBTRACT;if(p===THREE.ZeroFactor)return _gl.ZERO;if(p===THREE.OneFactor)return _gl.ONE;if(p===THREE.SrcColorFactor)return _gl.SRC_COLOR;if(p===THREE.OneMinusSrcColorFactor)return _gl.ONE_MINUS_SRC_COLOR;if(p===THREE.SrcAlphaFactor)return _gl.SRC_ALPHA;if(p===THREE.OneMinusSrcAlphaFactor)return _gl.ONE_MINUS_SRC_ALPHA;if(p===THREE.DstAlphaFactor)return _gl.DST_ALPHA;if(p===THREE.OneMinusDstAlphaFactor)return _gl.ONE_MINUS_DST_ALPHA;if(p===THREE.DstColorFactor)return _gl.DST_COLOR;if(p===THREE.OneMinusDstColorFactor)return _gl.ONE_MINUS_DST_COLOR;if(p===THREE.SrcAlphaSaturateFactor)return _gl.SRC_ALPHA_SATURATE;if(extension=extensions.get("WEBGL_compressed_texture_s3tc"),null!==extension){if(p===THREE.RGB_S3TC_DXT1_Format)return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;if(p===THREE.RGBA_S3TC_DXT1_Format)return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(p===THREE.RGBA_S3TC_DXT3_Format)return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(p===THREE.RGBA_S3TC_DXT5_Format)return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(extension=extensions.get("WEBGL_compressed_texture_pvrtc"),null!==extension){if(p===THREE.RGB_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(p===THREE.RGB_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(p===THREE.RGBA_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(p===THREE.RGBA_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(extension=extensions.get("EXT_blend_minmax"),null!==extension){if(p===THREE.MinEquation)return extension.MIN_EXT;if(p===THREE.MaxEquation)return extension.MAX_EXT}return 0}console.log("THREE.WebGLRenderer",THREE.REVISION),parameters=parameters||{};var _canvas=void 0!==parameters.canvas?parameters.canvas:document.createElement("canvas"),_context=void 0!==parameters.context?parameters.context:null,_width=_canvas.width,_height=_canvas.height,pixelRatio=1,_alpha=void 0!==parameters.alpha?parameters.alpha:!1,_depth=void 0!==parameters.depth?parameters.depth:!0,_stencil=void 0!==parameters.stencil?parameters.stencil:!0,_antialias=void 0!==parameters.antialias?parameters.antialias:!1,_premultipliedAlpha=void 0!==parameters.premultipliedAlpha?parameters.premultipliedAlpha:!0,_preserveDrawingBuffer=void 0!==parameters.preserveDrawingBuffer?parameters.preserveDrawingBuffer:!1,_clearColor=new THREE.Color(0),_clearAlpha=0,lights=[],opaqueObjects=[],opaqueObjectsLastIndex=-1,transparentObjects=[],transparentObjectsLastIndex=-1,morphInfluences=new Float32Array(8),sprites=[],lensFlares=[];this.domElement=_canvas,this.context=null,this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.gammaFactor=2,this.gammaInput=!1,this.gammaOutput=!1,this.maxMorphTargets=8,this.maxMorphNormals=4,this.autoScaleCubemaps=!0;var _this=this,_currentProgram=null,_currentFramebuffer=null,_currentMaterialId=-1,_currentGeometryProgram="",_currentCamera=null,_usedTextureUnits=0,_viewportX=0,_viewportY=0,_viewportWidth=_canvas.width,_viewportHeight=_canvas.height,_currentWidth=0,_currentHeight=0,_frustum=new THREE.Frustum,_projScreenMatrix=new THREE.Matrix4,_vector3=new THREE.Vector3,_direction=new THREE.Vector3,_lightsNeedUpdate=!0,_lights={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[],decays:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],anglesCos:[],exponents:[],decays:[]},hemi:{length:0,skyColors:[],groundColors:[],positions:[]}},_infoMemory={geometries:0,textures:0},_infoRender={calls:0,vertices:0,faces:0,points:0};this.info={render:_infoRender,memory:_infoMemory,programs:null};var _gl;try{var attributes={alpha:_alpha,depth:_depth,stencil:_stencil,antialias:_antialias,premultipliedAlpha:_premultipliedAlpha,preserveDrawingBuffer:_preserveDrawingBuffer};if(_gl=_context||_canvas.getContext("webgl",attributes)||_canvas.getContext("experimental-webgl",attributes),null===_gl)throw null!==_canvas.getContext("webgl")?"Error creating WebGL context with your selected attributes.":"Error creating WebGL context.";_canvas.addEventListener("webglcontextlost",onContextLost,!1)}catch(error){console.error("THREE.WebGLRenderer: "+error)}var extensions=new THREE.WebGLExtensions(_gl);extensions.get("OES_texture_float"),extensions.get("OES_texture_float_linear"),extensions.get("OES_texture_half_float"),extensions.get("OES_texture_half_float_linear"),extensions.get("OES_standard_derivatives"),extensions.get("ANGLE_instanced_arrays"),extensions.get("OES_element_index_uint")&&(THREE.BufferGeometry.MaxIndex=4294967296);var capabilities=new THREE.WebGLCapabilities(_gl,extensions,parameters),state=new THREE.WebGLState(_gl,extensions,paramThreeToGL),properties=new THREE.WebGLProperties,objects=new THREE.WebGLObjects(_gl,properties,this.info),programCache=new THREE.WebGLPrograms(this,capabilities);this.info.programs=programCache.programs;var bufferRenderer=new THREE.WebGLBufferRenderer(_gl,extensions,_infoRender),indexedBufferRenderer=new THREE.WebGLIndexedBufferRenderer(_gl,extensions,_infoRender);setDefaultGLState(),this.context=_gl,this.capabilities=capabilities,this.extensions=extensions,this.state=state;var shadowMap=new THREE.WebGLShadowMap(this,lights,objects);this.shadowMap=shadowMap;var spritePlugin=new THREE.SpritePlugin(this,sprites),lensFlarePlugin=new THREE.LensFlarePlugin(this,lensFlares);this.getContext=function(){return _gl},this.getContextAttributes=function(){return _gl.getContextAttributes()},this.forceContextLoss=function(){extensions.get("WEBGL_lose_context").loseContext()},this.getMaxAnisotropy=function(){var value;return function(){if(void 0!==value)return value;var extension=extensions.get("EXT_texture_filter_anisotropic");return value=null!==extension?_gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0}}(),this.getPrecision=function(){return capabilities.precision},this.getPixelRatio=function(){return pixelRatio},this.setPixelRatio=function(value){void 0!==value&&(pixelRatio=value)},this.getSize=function(){return{width:_width,height:_height}},this.setSize=function(width,height,updateStyle){_width=width,_height=height,_canvas.width=width*pixelRatio,_canvas.height=height*pixelRatio,updateStyle!==!1&&(_canvas.style.width=width+"px",_canvas.style.height=height+"px"),this.setViewport(0,0,width,height)},this.setViewport=function(x,y,width,height){_viewportX=x*pixelRatio,_viewportY=y*pixelRatio,_viewportWidth=width*pixelRatio,_viewportHeight=height*pixelRatio,_gl.viewport(_viewportX,_viewportY,_viewportWidth,_viewportHeight)},this.getViewport=function(dimensions){dimensions.x=_viewportX/pixelRatio,dimensions.y=_viewportY/pixelRatio,dimensions.z=_viewportWidth/pixelRatio,dimensions.w=_viewportHeight/pixelRatio},this.setScissor=function(x,y,width,height){_gl.scissor(x*pixelRatio,y*pixelRatio,width*pixelRatio,height*pixelRatio)},this.enableScissorTest=function(boolean){state.setScissorTest(boolean)},this.getClearColor=function(){return _clearColor},this.setClearColor=function(color,alpha){_clearColor.set(color),_clearAlpha=void 0!==alpha?alpha:1,glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)},this.getClearAlpha=function(){return _clearAlpha},this.setClearAlpha=function(alpha){_clearAlpha=alpha,glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)},this.clear=function(color,depth,stencil){var bits=0;(void 0===color||color)&&(bits|=_gl.COLOR_BUFFER_BIT),(void 0===depth||depth)&&(bits|=_gl.DEPTH_BUFFER_BIT),(void 0===stencil||stencil)&&(bits|=_gl.STENCIL_BUFFER_BIT),_gl.clear(bits)},this.clearColor=function(){_gl.clear(_gl.COLOR_BUFFER_BIT)},this.clearDepth=function(){_gl.clear(_gl.DEPTH_BUFFER_BIT)},this.clearStencil=function(){_gl.clear(_gl.STENCIL_BUFFER_BIT)},this.clearTarget=function(renderTarget,color,depth,stencil){this.setRenderTarget(renderTarget),this.clear(color,depth,stencil)},this.resetGLState=resetGLState,this.dispose=function(){_canvas.removeEventListener("webglcontextlost",onContextLost,!1)},this.renderBufferImmediate=function(object,program,material){state.initAttributes();var buffers=properties.get(object);object.hasPositions&&!buffers.position&&(buffers.position=_gl.createBuffer()), +object.hasNormals&&!buffers.normal&&(buffers.normal=_gl.createBuffer()),object.hasUvs&&!buffers.uv&&(buffers.uv=_gl.createBuffer()),object.hasColors&&!buffers.color&&(buffers.color=_gl.createBuffer());var attributes=program.getAttributes();if(object.hasPositions&&(_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.position),_gl.bufferData(_gl.ARRAY_BUFFER,object.positionArray,_gl.DYNAMIC_DRAW),state.enableAttribute(attributes.position),_gl.vertexAttribPointer(attributes.position,3,_gl.FLOAT,!1,0,0)),object.hasNormals){if(_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.normal),"MeshPhongMaterial"!==material.type&&material.shading===THREE.FlatShading)for(var i=0,l=3*object.count;l>i;i+=9){var array=object.normalArray,nx=(array[i+0]+array[i+3]+array[i+6])/3,ny=(array[i+1]+array[i+4]+array[i+7])/3,nz=(array[i+2]+array[i+5]+array[i+8])/3;array[i+0]=nx,array[i+1]=ny,array[i+2]=nz,array[i+3]=nx,array[i+4]=ny,array[i+5]=nz,array[i+6]=nx,array[i+7]=ny,array[i+8]=nz}_gl.bufferData(_gl.ARRAY_BUFFER,object.normalArray,_gl.DYNAMIC_DRAW),state.enableAttribute(attributes.normal),_gl.vertexAttribPointer(attributes.normal,3,_gl.FLOAT,!1,0,0)}object.hasUvs&&material.map&&(_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.uv),_gl.bufferData(_gl.ARRAY_BUFFER,object.uvArray,_gl.DYNAMIC_DRAW),state.enableAttribute(attributes.uv),_gl.vertexAttribPointer(attributes.uv,2,_gl.FLOAT,!1,0,0)),object.hasColors&&material.vertexColors!==THREE.NoColors&&(_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.color),_gl.bufferData(_gl.ARRAY_BUFFER,object.colorArray,_gl.DYNAMIC_DRAW),state.enableAttribute(attributes.color),_gl.vertexAttribPointer(attributes.color,3,_gl.FLOAT,!1,0,0)),state.disableUnusedAttributes(),_gl.drawArrays(_gl.TRIANGLES,0,object.count),object.count=0},this.renderBufferDirect=function(camera,lights,fog,geometry,material,object,group){setMaterial(material);var program=setProgram(camera,lights,fog,material,object),updateBuffers=!1,geometryProgram=geometry.id+"_"+program.id+"_"+material.wireframe;geometryProgram!==_currentGeometryProgram&&(_currentGeometryProgram=geometryProgram,updateBuffers=!0);var morphTargetInfluences=object.morphTargetInfluences;if(void 0!==morphTargetInfluences){for(var activeInfluences=[],i=0,l=morphTargetInfluences.length;l>i;i++){var influence=morphTargetInfluences[i];activeInfluences.push([influence,i])}activeInfluences.sort(numericalSort),activeInfluences.length>8&&(activeInfluences.length=8);for(var morphAttributes=geometry.morphAttributes,i=0,l=activeInfluences.length;l>i;i++){var influence=activeInfluences[i];if(morphInfluences[i]=influence[0],0!==influence[0]){var index=influence[1];material.morphTargets===!0&&morphAttributes.position&&geometry.addAttribute("morphTarget"+i,morphAttributes.position[index]),material.morphNormals===!0&&morphAttributes.normal&&geometry.addAttribute("morphNormal"+i,morphAttributes.normal[index])}else material.morphTargets===!0&&geometry.removeAttribute("morphTarget"+i),material.morphNormals===!0&&geometry.removeAttribute("morphNormal"+i)}var uniforms=program.getUniforms();null!==uniforms.morphTargetInfluences&&_gl.uniform1fv(uniforms.morphTargetInfluences,morphInfluences),updateBuffers=!0}var index=geometry.index,position=geometry.attributes.position;material.wireframe===!0&&(index=objects.getWireframeAttribute(geometry));var renderer;null!==index?(renderer=indexedBufferRenderer,renderer.setIndex(index)):renderer=bufferRenderer,updateBuffers&&(setupVertexAttributes(material,program,geometry),null!==index&&_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,objects.getAttributeBuffer(index)));var dataStart=0,dataCount=1/0;null!==index?dataCount=index.count:void 0!==position&&(dataCount=position.count);var rangeStart=geometry.drawRange.start,rangeCount=geometry.drawRange.count,groupStart=null!==group?group.start:0,groupCount=null!==group?group.count:1/0,drawStart=Math.max(dataStart,rangeStart,groupStart),drawEnd=Math.min(dataStart+dataCount,rangeStart+rangeCount,groupStart+groupCount)-1,drawCount=Math.max(0,drawEnd-drawStart+1);if(object instanceof THREE.Mesh)material.wireframe===!0?(state.setLineWidth(material.wireframeLinewidth*pixelRatio),renderer.setMode(_gl.LINES)):renderer.setMode(_gl.TRIANGLES),geometry instanceof THREE.InstancedBufferGeometry&&geometry.maxInstancedCount>0?renderer.renderInstances(geometry):renderer.render(drawStart,drawCount);else if(object instanceof THREE.Line){var lineWidth=material.linewidth;void 0===lineWidth&&(lineWidth=1),state.setLineWidth(lineWidth*pixelRatio),object instanceof THREE.LineSegments?renderer.setMode(_gl.LINES):renderer.setMode(_gl.LINE_STRIP),renderer.render(drawStart,drawCount)}else object instanceof THREE.Points&&(renderer.setMode(_gl.POINTS),renderer.render(drawStart,drawCount))},this.render=function(scene,camera,renderTarget,forceClear){if(camera instanceof THREE.Camera==!1)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");var fog=scene.fog;if(_currentGeometryProgram="",_currentMaterialId=-1,_currentCamera=null,_lightsNeedUpdate=!0,scene.autoUpdate===!0&&scene.updateMatrixWorld(),null===camera.parent&&camera.updateMatrixWorld(),camera.matrixWorldInverse.getInverse(camera.matrixWorld),_projScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse),_frustum.setFromMatrix(_projScreenMatrix),lights.length=0,opaqueObjectsLastIndex=-1,transparentObjectsLastIndex=-1,sprites.length=0,lensFlares.length=0,projectObject(scene,camera),opaqueObjects.length=opaqueObjectsLastIndex+1,transparentObjects.length=transparentObjectsLastIndex+1,_this.sortObjects===!0&&(opaqueObjects.sort(painterSortStable),transparentObjects.sort(reversePainterSortStable)),shadowMap.render(scene),_infoRender.calls=0,_infoRender.vertices=0,_infoRender.faces=0,_infoRender.points=0,this.setRenderTarget(renderTarget),(this.autoClear||forceClear)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil),scene.overrideMaterial){var overrideMaterial=scene.overrideMaterial;renderObjects(opaqueObjects,camera,lights,fog,overrideMaterial),renderObjects(transparentObjects,camera,lights,fog,overrideMaterial)}else state.setBlending(THREE.NoBlending),renderObjects(opaqueObjects,camera,lights,fog),renderObjects(transparentObjects,camera,lights,fog);if(spritePlugin.render(scene,camera),lensFlarePlugin.render(scene,camera,_currentWidth,_currentHeight),renderTarget){var texture=renderTarget.texture,isTargetPowerOfTwo=isPowerOfTwo(renderTarget);texture.generateMipmaps&&isTargetPowerOfTwo&&texture.minFilter!==THREE.NearestFilter&&texture.minFilter!==THREE.LinearFilter&&updateRenderTargetMipmap(renderTarget)}state.setDepthTest(!0),state.setDepthWrite(!0),state.setColorWrite(!0)},this.setFaceCulling=function(cullFace,frontFaceDirection){cullFace===THREE.CullFaceNone?state.disable(_gl.CULL_FACE):(frontFaceDirection===THREE.FrontFaceDirectionCW?_gl.frontFace(_gl.CW):_gl.frontFace(_gl.CCW),cullFace===THREE.CullFaceBack?_gl.cullFace(_gl.BACK):cullFace===THREE.CullFaceFront?_gl.cullFace(_gl.FRONT):_gl.cullFace(_gl.FRONT_AND_BACK),state.enable(_gl.CULL_FACE))},this.setTexture=function(texture,slot){var textureProperties=properties.get(texture);if(texture.version>0&&textureProperties.__version!==texture.version){var image=texture.image;return void 0===image?void console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",texture):image.complete===!1?void console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",texture):void uploadTexture(textureProperties,texture,slot)}state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture)},this.setRenderTarget=function(renderTarget){var isCube=renderTarget instanceof THREE.WebGLRenderTargetCube;if(renderTarget&&void 0===properties.get(renderTarget).__webglFramebuffer){var renderTargetProperties=properties.get(renderTarget),textureProperties=properties.get(renderTarget.texture);void 0===renderTarget.depthBuffer&&(renderTarget.depthBuffer=!0),void 0===renderTarget.stencilBuffer&&(renderTarget.stencilBuffer=!0),renderTarget.addEventListener("dispose",onRenderTargetDispose),textureProperties.__webglTexture=_gl.createTexture(),_infoMemory.textures++;var isTargetPowerOfTwo=isPowerOfTwo(renderTarget),glFormat=paramThreeToGL(renderTarget.texture.format),glType=paramThreeToGL(renderTarget.texture.type);if(isCube){renderTargetProperties.__webglFramebuffer=[],renderTargetProperties.__webglRenderbuffer=[],state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__webglTexture),setTextureParameters(_gl.TEXTURE_CUBE_MAP,renderTarget.texture,isTargetPowerOfTwo);for(var i=0;6>i;i++)renderTargetProperties.__webglFramebuffer[i]=_gl.createFramebuffer(),renderTargetProperties.__webglRenderbuffer[i]=_gl.createRenderbuffer(),state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,renderTarget.width,renderTarget.height,0,glFormat,glType,null),setupFrameBuffer(renderTargetProperties.__webglFramebuffer[i],renderTarget,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i),setupRenderBuffer(renderTargetProperties.__webglRenderbuffer[i],renderTarget);renderTarget.texture.generateMipmaps&&isTargetPowerOfTwo&&_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP)}else renderTargetProperties.__webglFramebuffer=_gl.createFramebuffer(),renderTarget.shareDepthFrom?renderTargetProperties.__webglRenderbuffer=renderTarget.shareDepthFrom.__webglRenderbuffer:renderTargetProperties.__webglRenderbuffer=_gl.createRenderbuffer(),state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture),setTextureParameters(_gl.TEXTURE_2D,renderTarget.texture,isTargetPowerOfTwo),state.texImage2D(_gl.TEXTURE_2D,0,glFormat,renderTarget.width,renderTarget.height,0,glFormat,glType,null),setupFrameBuffer(renderTargetProperties.__webglFramebuffer,renderTarget,_gl.TEXTURE_2D),renderTarget.shareDepthFrom?renderTarget.depthBuffer&&!renderTarget.stencilBuffer?_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.RENDERBUFFER,renderTargetProperties.__webglRenderbuffer):renderTarget.depthBuffer&&renderTarget.stencilBuffer&&_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.RENDERBUFFER,renderTargetProperties.__webglRenderbuffer):setupRenderBuffer(renderTargetProperties.__webglRenderbuffer,renderTarget),renderTarget.texture.generateMipmaps&&isTargetPowerOfTwo&&_gl.generateMipmap(_gl.TEXTURE_2D);isCube?state.bindTexture(_gl.TEXTURE_CUBE_MAP,null):state.bindTexture(_gl.TEXTURE_2D,null),_gl.bindRenderbuffer(_gl.RENDERBUFFER,null),_gl.bindFramebuffer(_gl.FRAMEBUFFER,null)}var framebuffer,width,height,vx,vy;if(renderTarget){var renderTargetProperties=properties.get(renderTarget);framebuffer=isCube?renderTargetProperties.__webglFramebuffer[renderTarget.activeCubeFace]:renderTargetProperties.__webglFramebuffer,width=renderTarget.width,height=renderTarget.height,vx=0,vy=0}else framebuffer=null,width=_viewportWidth,height=_viewportHeight,vx=_viewportX,vy=_viewportY;if(framebuffer!==_currentFramebuffer&&(_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer),_gl.viewport(vx,vy,width,height),_currentFramebuffer=framebuffer),isCube){var textureProperties=properties.get(renderTarget.texture);_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+renderTarget.activeCubeFace,textureProperties.__webglTexture,0)}_currentWidth=width,_currentHeight=height},this.readRenderTargetPixels=function(renderTarget,x,y,width,height,buffer){if(renderTarget instanceof THREE.WebGLRenderTarget==!1)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");var framebuffer=properties.get(renderTarget).__webglFramebuffer;if(framebuffer){var restore=!1;framebuffer!==_currentFramebuffer&&(_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer),restore=!0);try{var texture=renderTarget.texture;if(texture.format!==THREE.RGBAFormat&¶mThreeToGL(texture.format)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_FORMAT))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!(texture.type===THREE.UnsignedByteType||paramThreeToGL(texture.type)===_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_TYPE)||texture.type===THREE.FloatType&&extensions.get("WEBGL_color_buffer_float")||texture.type===THREE.HalfFloatType&&extensions.get("EXT_color_buffer_half_float")))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");_gl.checkFramebufferStatus(_gl.FRAMEBUFFER)===_gl.FRAMEBUFFER_COMPLETE?_gl.readPixels(x,y,width,height,paramThreeToGL(texture.format),paramThreeToGL(texture.type),buffer):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{restore&&_gl.bindFramebuffer(_gl.FRAMEBUFFER,_currentFramebuffer)}}},this.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),extensions.get("OES_texture_float")},this.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),extensions.get("OES_texture_half_float")},this.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),extensions.get("OES_standard_derivatives")},this.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),extensions.get("WEBGL_compressed_texture_s3tc")},this.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),extensions.get("WEBGL_compressed_texture_pvrtc")},this.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),extensions.get("EXT_blend_minmax")},this.supportsVertexTextures=function(){return capabilities.vertexTextures},this.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),extensions.get("ANGLE_instanced_arrays")},this.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},this.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},this.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},this.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},Object.defineProperties(this,{shadowMapEnabled:{get:function(){return shadowMap.enabled},set:function(value){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),shadowMap.enabled=value}},shadowMapType:{get:function(){return shadowMap.type},set:function(value){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),shadowMap.type=value}},shadowMapCullFace:{get:function(){return shadowMap.cullFace},set:function(value){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace."),shadowMap.cullFace=value}},shadowMapDebug:{get:function(){return shadowMap.debug},set:function(value){console.warn("THREE.WebGLRenderer: .shadowMapDebug is now .shadowMap.debug."),shadowMap.debug=value}}})},THREE.WebGLRenderTarget=function(width,height,options){this.uuid=THREE.Math.generateUUID(),this.width=width,this.height=height,options=options||{},void 0===options.minFilter&&(options.minFilter=THREE.LinearFilter),this.texture=new THREE.Texture(void 0,void 0,options.wrapS,options.wrapT,options.magFilter,options.minFilter,options.format,options.type,options.anisotropy),this.depthBuffer=void 0!==options.depthBuffer?options.depthBuffer:!0,this.stencilBuffer=void 0!==options.stencilBuffer?options.stencilBuffer:!0,this.shareDepthFrom=void 0!==options.shareDepthFrom?options.shareDepthFrom:null},THREE.WebGLRenderTarget.prototype={constructor:THREE.WebGLRenderTarget,get wrapS(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set wrapS(value){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=value},get wrapT(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set wrapT(value){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=value},get magFilter(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set magFilter(value){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=value},get minFilter(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set minFilter(value){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=value},get anisotropy(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set anisotropy(value){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=value},get offset(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set offset(value){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=value},get repeat(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set repeat(value){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=value},get format(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set format(value){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=value},get type(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set type(value){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=value},get generateMipmaps(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set generateMipmaps(value){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=value},setSize:function(width,height){this.width===width&&this.height===height||(this.width=width,this.height=height,this.dispose())},clone:function(){return(new this.constructor).copy(this)},copy:function(source){return this.width=source.width,this.height=source.height,this.texture=source.texture.clone(),this.depthBuffer=source.depthBuffer,this.stencilBuffer=source.stencilBuffer,this.shareDepthFrom=source.shareDepthFrom,this},dispose:function(){this.dispatchEvent({type:"dispose"})}},THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype),THREE.WebGLRenderTargetCube=function(width,height,options){THREE.WebGLRenderTarget.call(this,width,height,options),this.activeCubeFace=0},THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype),THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube,THREE.WebGLBufferRenderer=function(_gl,extensions,_infoRender){function setMode(value){mode=value}function render(start,count){_gl.drawArrays(mode,start,count),_infoRender.calls++,_infoRender.vertices+=count,mode===_gl.TRIANGLES&&(_infoRender.faces+=count/3)}function renderInstances(geometry){var extension=extensions.get("ANGLE_instanced_arrays");if(null===extension)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");var position=geometry.attributes.position;position instanceof THREE.InterleavedBufferAttribute?extension.drawArraysInstancedANGLE(mode,0,position.data.count,geometry.maxInstancedCount):extension.drawArraysInstancedANGLE(mode,0,position.count,geometry.maxInstancedCount)}var mode;this.setMode=setMode,this.render=render,this.renderInstances=renderInstances},THREE.WebGLIndexedBufferRenderer=function(_gl,extensions,_infoRender){function setMode(value){mode=value}function setIndex(index){index.array instanceof Uint32Array&&extensions.get("OES_element_index_uint")?(type=_gl.UNSIGNED_INT,size=4):(type=_gl.UNSIGNED_SHORT,size=2)}function render(start,count){_gl.drawElements(mode,count,type,start*size),_infoRender.calls++,_infoRender.vertices+=count,mode===_gl.TRIANGLES&&(_infoRender.faces+=count/3)}function renderInstances(geometry){var extension=extensions.get("ANGLE_instanced_arrays");if(null===extension)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");var index=geometry.index;extension.drawElementsInstancedANGLE(mode,index.array.length,type,0,geometry.maxInstancedCount)}var mode,type,size;this.setMode=setMode,this.setIndex=setIndex,this.render=render,this.renderInstances=renderInstances},THREE.WebGLExtensions=function(gl){var extensions={};this.get=function(name){if(void 0!==extensions[name])return extensions[name];var extension;switch(name){case"EXT_texture_filter_anisotropic":extension=gl.getExtension("EXT_texture_filter_anisotropic")||gl.getExtension("MOZ_EXT_texture_filter_anisotropic")||gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":extension=gl.getExtension("WEBGL_compressed_texture_s3tc")||gl.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":extension=gl.getExtension("WEBGL_compressed_texture_pvrtc")||gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:extension=gl.getExtension(name)}return null===extension&&console.warn("THREE.WebGLRenderer: "+name+" extension not supported."),extensions[name]=extension,extension}},THREE.WebGLCapabilities=function(gl,extensions,parameters){function getMaxPrecision(precision){if("highp"===precision){if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.HIGH_FLOAT).precision>0&&gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.HIGH_FLOAT).precision>0)return"highp";precision="mediump"}return"mediump"===precision&&gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.MEDIUM_FLOAT).precision>0&&gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}this.getMaxPrecision=getMaxPrecision,this.precision=void 0!==parameters.precision?parameters.precision:"highp",this.logarithmicDepthBuffer=void 0!==parameters.logarithmicDepthBuffer?parameters.logarithmicDepthBuffer:!1,this.maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS),this.maxVertexTextures=gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),this.maxTextureSize=gl.getParameter(gl.MAX_TEXTURE_SIZE),this.maxCubemapSize=gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE),this.maxAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS),this.maxVertexUniforms=gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS),this.maxVaryings=gl.getParameter(gl.MAX_VARYING_VECTORS),this.maxFragmentUniforms=gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS),this.vertexTextures=this.maxVertexTextures>0,this.floatFragmentTextures=!!extensions.get("OES_texture_float"),this.floatVertexTextures=this.vertexTextures&&this.floatFragmentTextures;var _maxPrecision=getMaxPrecision(this.precision);_maxPrecision!==this.precision&&(console.warn("THREE.WebGLRenderer:",this.precision,"not supported, using",_maxPrecision,"instead."),this.precision=_maxPrecision),this.logarithmicDepthBuffer&&(this.logarithmicDepthBuffer=!!extensions.get("EXT_frag_depth"))},THREE.WebGLGeometries=function(gl,properties,info){function get(object){var geometry=object.geometry;if(void 0!==geometries[geometry.id])return geometries[geometry.id];geometry.addEventListener("dispose",onGeometryDispose);var buffergeometry;return geometry instanceof THREE.BufferGeometry?buffergeometry=geometry:geometry instanceof THREE.Geometry&&(void 0===geometry._bufferGeometry&&(geometry._bufferGeometry=(new THREE.BufferGeometry).setFromObject(object)),buffergeometry=geometry._bufferGeometry),geometries[geometry.id]=buffergeometry,info.memory.geometries++,buffergeometry}function onGeometryDispose(event){var geometry=event.target,buffergeometry=geometries[geometry.id];deleteAttributes(buffergeometry.attributes),geometry.removeEventListener("dispose",onGeometryDispose),delete geometries[geometry.id];var property=properties.get(geometry);property.wireframe&&deleteAttribute(property.wireframe),info.memory.geometries--}function getAttributeBuffer(attribute){return attribute instanceof THREE.InterleavedBufferAttribute?properties.get(attribute.data).__webglBuffer:properties.get(attribute).__webglBuffer}function deleteAttribute(attribute){var buffer=getAttributeBuffer(attribute);void 0!==buffer&&(gl.deleteBuffer(buffer),removeAttributeBuffer(attribute))}function deleteAttributes(attributes){for(var name in attributes)deleteAttribute(attributes[name])}function removeAttributeBuffer(attribute){attribute instanceof THREE.InterleavedBufferAttribute?properties["delete"](attribute.data):properties["delete"](attribute)}var geometries={};this.get=get},THREE.WebGLObjects=function(gl,properties,info){function update(object){var geometry=geometries.get(object);object.geometry instanceof THREE.Geometry&&geometry.updateFromObject(object);var index=geometry.index,attributes=geometry.attributes;null!==index&&updateAttribute(index,gl.ELEMENT_ARRAY_BUFFER);for(var name in attributes)updateAttribute(attributes[name],gl.ARRAY_BUFFER);var morphAttributes=geometry.morphAttributes;for(var name in morphAttributes)for(var array=morphAttributes[name],i=0,l=array.length;l>i;i++)updateAttribute(array[i],gl.ARRAY_BUFFER);return geometry}function updateAttribute(attribute,bufferType){var data=attribute instanceof THREE.InterleavedBufferAttribute?attribute.data:attribute,attributeProperties=properties.get(data);void 0===attributeProperties.__webglBuffer?createBuffer(attributeProperties,data,bufferType):attributeProperties.version!==data.version&&updateBuffer(attributeProperties,data,bufferType)}function createBuffer(attributeProperties,data,bufferType){attributeProperties.__webglBuffer=gl.createBuffer(),gl.bindBuffer(bufferType,attributeProperties.__webglBuffer);var usage=data.dynamic?gl.DYNAMIC_DRAW:gl.STATIC_DRAW;gl.bufferData(bufferType,data.array,usage),attributeProperties.version=data.version}function updateBuffer(attributeProperties,data,bufferType){gl.bindBuffer(bufferType,attributeProperties.__webglBuffer),data.dynamic===!1||-1===data.updateRange.count?gl.bufferSubData(bufferType,0,data.array):0===data.updateRange.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(gl.bufferSubData(bufferType,data.updateRange.offset*data.array.BYTES_PER_ELEMENT,data.array.subarray(data.updateRange.offset,data.updateRange.offset+data.updateRange.count)),data.updateRange.count=0),attributeProperties.version=data.version}function getAttributeBuffer(attribute){return attribute instanceof THREE.InterleavedBufferAttribute?properties.get(attribute.data).__webglBuffer:properties.get(attribute).__webglBuffer}function getWireframeAttribute(geometry){var property=properties.get(geometry);if(void 0!==property.wireframe)return property.wireframe;var indices=[],index=geometry.index,attributes=geometry.attributes,position=attributes.position;if(null!==index)for(var edges={},array=index.array,i=0,l=array.length;l>i;i+=3){var a=array[i+0],b=array[i+1],c=array[i+2];checkEdge(edges,a,b)&&indices.push(a,b),checkEdge(edges,b,c)&&indices.push(b,c),checkEdge(edges,c,a)&&indices.push(c,a)}else for(var array=attributes.position.array,i=0,l=array.length/3-1;l>i;i+=3){var a=i+0,b=i+1,c=i+2;indices.push(a,b,b,c,c,a)}var TypeArray=position.count>65535?Uint32Array:Uint16Array,attribute=new THREE.BufferAttribute(new TypeArray(indices),1);return updateAttribute(attribute,gl.ELEMENT_ARRAY_BUFFER),property.wireframe=attribute,attribute}function checkEdge(edges,a,b){if(a>b){var tmp=a;a=b,b=tmp}var list=edges[a];return void 0===list?(edges[a]=[b],!0):-1===list.indexOf(b)?(list.push(b),!0):!1}var geometries=new THREE.WebGLGeometries(gl,properties,info);this.getAttributeBuffer=getAttributeBuffer,this.getWireframeAttribute=getWireframeAttribute,this.update=update},THREE.WebGLProgram=function(){function generateDefines(defines){var chunks=[];for(var name in defines){var value=defines[name];value!==!1&&chunks.push("#define "+name+" "+value)}return chunks.join("\n")}function fetchUniformLocations(gl,program,identifiers){for(var uniforms={},n=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS),i=0;n>i;i++){var info=gl.getActiveUniform(program,i),name=info.name,location=gl.getUniformLocation(program,name),suffixPos=name.lastIndexOf("[0]");-1!==suffixPos&&suffixPos===name.length-3&&(uniforms[name.substr(0,suffixPos)]=location),uniforms[name]=location}return uniforms}function fetchAttributeLocations(gl,program,identifiers){for(var attributes={},n=gl.getProgramParameter(program,gl.ACTIVE_ATTRIBUTES),i=0;n>i;i++){var info=gl.getActiveAttrib(program,i),name=info.name;attributes[name]=gl.getAttribLocation(program,name)}return attributes}function filterEmptyLine(string){return""!==string}var programIdCount=0;return function(renderer,code,material,parameters){var gl=renderer.context,defines=material.defines,vertexShader=material.__webglShader.vertexShader,fragmentShader=material.__webglShader.fragmentShader,shadowMapTypeDefine="SHADOWMAP_TYPE_BASIC";parameters.shadowMapType===THREE.PCFShadowMap?shadowMapTypeDefine="SHADOWMAP_TYPE_PCF":parameters.shadowMapType===THREE.PCFSoftShadowMap&&(shadowMapTypeDefine="SHADOWMAP_TYPE_PCF_SOFT");var envMapTypeDefine="ENVMAP_TYPE_CUBE",envMapModeDefine="ENVMAP_MODE_REFLECTION",envMapBlendingDefine="ENVMAP_BLENDING_MULTIPLY";if(parameters.envMap){switch(material.envMap.mapping){case THREE.CubeReflectionMapping:case THREE.CubeRefractionMapping:envMapTypeDefine="ENVMAP_TYPE_CUBE";break;case THREE.EquirectangularReflectionMapping:case THREE.EquirectangularRefractionMapping:envMapTypeDefine="ENVMAP_TYPE_EQUIREC";break;case THREE.SphericalReflectionMapping:envMapTypeDefine="ENVMAP_TYPE_SPHERE"}switch(material.envMap.mapping){case THREE.CubeRefractionMapping:case THREE.EquirectangularRefractionMapping:envMapModeDefine="ENVMAP_MODE_REFRACTION"}switch(material.combine){case THREE.MultiplyOperation:envMapBlendingDefine="ENVMAP_BLENDING_MULTIPLY";break;case THREE.MixOperation:envMapBlendingDefine="ENVMAP_BLENDING_MIX";break;case THREE.AddOperation:envMapBlendingDefine="ENVMAP_BLENDING_ADD"}}var prefixVertex,prefixFragment,gammaFactorDefine=renderer.gammaFactor>0?renderer.gammaFactor:1,customDefines=generateDefines(defines),program=gl.createProgram();material instanceof THREE.RawShaderMaterial?(prefixVertex="",prefixFragment=""):(prefixVertex=["precision "+parameters.precision+" float;","precision "+parameters.precision+" int;","#define SHADER_NAME "+material.__webglShader.name,customDefines,parameters.supportsVertexTextures?"#define VERTEX_TEXTURES":"",renderer.gammaInput?"#define GAMMA_INPUT":"",renderer.gammaOutput?"#define GAMMA_OUTPUT":"","#define GAMMA_FACTOR "+gammaFactorDefine,"#define MAX_DIR_LIGHTS "+parameters.maxDirLights,"#define MAX_POINT_LIGHTS "+parameters.maxPointLights,"#define MAX_SPOT_LIGHTS "+parameters.maxSpotLights,"#define MAX_HEMI_LIGHTS "+parameters.maxHemiLights,"#define MAX_SHADOWS "+parameters.maxShadows,"#define MAX_BONES "+parameters.maxBones,parameters.map?"#define USE_MAP":"",parameters.envMap?"#define USE_ENVMAP":"",parameters.envMap?"#define "+envMapModeDefine:"",parameters.lightMap?"#define USE_LIGHTMAP":"",parameters.aoMap?"#define USE_AOMAP":"",parameters.emissiveMap?"#define USE_EMISSIVEMAP":"",parameters.bumpMap?"#define USE_BUMPMAP":"",parameters.normalMap?"#define USE_NORMALMAP":"",parameters.displacementMap&¶meters.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",parameters.specularMap?"#define USE_SPECULARMAP":"",parameters.alphaMap?"#define USE_ALPHAMAP":"",parameters.vertexColors?"#define USE_COLOR":"",parameters.flatShading?"#define FLAT_SHADED":"",parameters.skinning?"#define USE_SKINNING":"",parameters.useVertexTexture?"#define BONE_TEXTURE":"",parameters.morphTargets?"#define USE_MORPHTARGETS":"",parameters.morphNormals&¶meters.flatShading===!1?"#define USE_MORPHNORMALS":"",parameters.doubleSided?"#define DOUBLE_SIDED":"",parameters.flipSided?"#define FLIP_SIDED":"",parameters.shadowMapEnabled?"#define USE_SHADOWMAP":"",parameters.shadowMapEnabled?"#define "+shadowMapTypeDefine:"",parameters.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",parameters.pointLightShadows>0?"#define POINT_LIGHT_SHADOWS":"",parameters.sizeAttenuation?"#define USE_SIZEATTENUATION":"",parameters.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",parameters.logarithmicDepthBuffer&&renderer.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR"," attribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS"," attribute vec3 morphTarget0;"," attribute vec3 morphTarget1;"," attribute vec3 morphTarget2;"," attribute vec3 morphTarget3;"," #ifdef USE_MORPHNORMALS"," attribute vec3 morphNormal0;"," attribute vec3 morphNormal1;"," attribute vec3 morphNormal2;"," attribute vec3 morphNormal3;"," #else"," attribute vec3 morphTarget4;"," attribute vec3 morphTarget5;"," attribute vec3 morphTarget6;"," attribute vec3 morphTarget7;"," #endif","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif","\n"].filter(filterEmptyLine).join("\n"), +prefixFragment=[parameters.bumpMap||parameters.normalMap||parameters.flatShading||material.derivatives?"#extension GL_OES_standard_derivatives : enable":"",parameters.logarithmicDepthBuffer&&renderer.extensions.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"","precision "+parameters.precision+" float;","precision "+parameters.precision+" int;","#define SHADER_NAME "+material.__webglShader.name,customDefines,"#define MAX_DIR_LIGHTS "+parameters.maxDirLights,"#define MAX_POINT_LIGHTS "+parameters.maxPointLights,"#define MAX_SPOT_LIGHTS "+parameters.maxSpotLights,"#define MAX_HEMI_LIGHTS "+parameters.maxHemiLights,"#define MAX_SHADOWS "+parameters.maxShadows,parameters.alphaTest?"#define ALPHATEST "+parameters.alphaTest:"",renderer.gammaInput?"#define GAMMA_INPUT":"",renderer.gammaOutput?"#define GAMMA_OUTPUT":"","#define GAMMA_FACTOR "+gammaFactorDefine,parameters.useFog&¶meters.fog?"#define USE_FOG":"",parameters.useFog&¶meters.fogExp?"#define FOG_EXP2":"",parameters.map?"#define USE_MAP":"",parameters.envMap?"#define USE_ENVMAP":"",parameters.envMap?"#define "+envMapTypeDefine:"",parameters.envMap?"#define "+envMapModeDefine:"",parameters.envMap?"#define "+envMapBlendingDefine:"",parameters.lightMap?"#define USE_LIGHTMAP":"",parameters.aoMap?"#define USE_AOMAP":"",parameters.emissiveMap?"#define USE_EMISSIVEMAP":"",parameters.bumpMap?"#define USE_BUMPMAP":"",parameters.normalMap?"#define USE_NORMALMAP":"",parameters.specularMap?"#define USE_SPECULARMAP":"",parameters.alphaMap?"#define USE_ALPHAMAP":"",parameters.vertexColors?"#define USE_COLOR":"",parameters.flatShading?"#define FLAT_SHADED":"",parameters.metal?"#define METAL":"",parameters.doubleSided?"#define DOUBLE_SIDED":"",parameters.flipSided?"#define FLIP_SIDED":"",parameters.shadowMapEnabled?"#define USE_SHADOWMAP":"",parameters.shadowMapEnabled?"#define "+shadowMapTypeDefine:"",parameters.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",parameters.pointLightShadows>0?"#define POINT_LIGHT_SHADOWS":"",parameters.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",parameters.logarithmicDepthBuffer&&renderer.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","\n"].filter(filterEmptyLine).join("\n"));var vertexGlsl=prefixVertex+vertexShader,fragmentGlsl=prefixFragment+fragmentShader,glVertexShader=THREE.WebGLShader(gl,gl.VERTEX_SHADER,vertexGlsl),glFragmentShader=THREE.WebGLShader(gl,gl.FRAGMENT_SHADER,fragmentGlsl);gl.attachShader(program,glVertexShader),gl.attachShader(program,glFragmentShader),void 0!==material.index0AttributeName?gl.bindAttribLocation(program,0,material.index0AttributeName):parameters.morphTargets===!0&&gl.bindAttribLocation(program,0,"position"),gl.linkProgram(program);var programLog=gl.getProgramInfoLog(program),vertexLog=gl.getShaderInfoLog(glVertexShader),fragmentLog=gl.getShaderInfoLog(glFragmentShader),runnable=!0,haveDiagnostics=!0;gl.getProgramParameter(program,gl.LINK_STATUS)===!1?(runnable=!1,console.error("THREE.WebGLProgram: shader error: ",gl.getError(),"gl.VALIDATE_STATUS",gl.getProgramParameter(program,gl.VALIDATE_STATUS),"gl.getProgramInfoLog",programLog,vertexLog,fragmentLog)):""!==programLog?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",programLog):""!==vertexLog&&""!==fragmentLog||(haveDiagnostics=!1),haveDiagnostics&&(this.diagnostics={runnable:runnable,material:material,programLog:programLog,vertexShader:{log:vertexLog,prefix:prefixVertex},fragmentShader:{log:fragmentLog,prefix:prefixFragment}}),gl.deleteShader(glVertexShader),gl.deleteShader(glFragmentShader);var cachedUniforms;this.getUniforms=function(){return void 0===cachedUniforms&&(cachedUniforms=fetchUniformLocations(gl,program)),cachedUniforms};var cachedAttributes;return this.getAttributes=function(){return void 0===cachedAttributes&&(cachedAttributes=fetchAttributeLocations(gl,program)),cachedAttributes},this.destroy=function(){gl.deleteProgram(program),this.program=void 0},Object.defineProperties(this,{uniforms:{get:function(){return console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms()."),this.getUniforms()}},attributes:{get:function(){return console.warn("THREE.WebGLProgram: .attributes is now .getAttributes()."),this.getAttributes()}}}),this.id=programIdCount++,this.code=code,this.usedTimes=1,this.program=program,this.vertexShader=glVertexShader,this.fragmentShader=glFragmentShader,this}}(),THREE.WebGLPrograms=function(renderer,capabilities){function allocateBones(object){if(capabilities.floatVertexTextures&&object&&object.skeleton&&object.skeleton.useVertexTexture)return 1024;var nVertexUniforms=capabilities.maxVertexUniforms,nVertexMatrices=Math.floor((nVertexUniforms-20)/4),maxBones=nVertexMatrices;return void 0!==object&&object instanceof THREE.SkinnedMesh&&(maxBones=Math.min(object.skeleton.bones.length,maxBones),maxBonesl;l++){var light=lights[l];light.visible!==!1&&(light instanceof THREE.DirectionalLight&&dirLights++,light instanceof THREE.PointLight&&pointLights++,light instanceof THREE.SpotLight&&spotLights++,light instanceof THREE.HemisphereLight&&hemiLights++)}return{directional:dirLights,point:pointLights,spot:spotLights,hemi:hemiLights}}function allocateShadows(lights){for(var maxShadows=0,pointLightShadows=0,l=0,ll=lights.length;ll>l;l++){var light=lights[l];light.castShadow&&((light instanceof THREE.SpotLight||light instanceof THREE.DirectionalLight)&&maxShadows++,light instanceof THREE.PointLight&&(maxShadows++,pointLightShadows++))}return{maxShadows:maxShadows,pointLightShadows:pointLightShadows}}var programs=[],shaderIDs={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},parameterNames=["precision","supportsVertexTextures","map","envMap","envMapMode","lightMap","aoMap","emissiveMap","bumpMap","normalMap","displacementMap","specularMap","alphaMap","combine","vertexColors","fog","useFog","fogExp","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","maxMorphTargets","maxMorphNormals","maxDirLights","maxPointLights","maxSpotLights","maxHemiLights","maxShadows","shadowMapEnabled","pointLightShadows","shadowMapType","shadowMapDebug","alphaTest","metal","doubleSided","flipSided"];this.getParameters=function(material,lights,fog,object){var shaderID=shaderIDs[material.type],maxLightCount=allocateLights(lights),allocatedShadows=allocateShadows(lights),maxBones=allocateBones(object),precision=renderer.getPrecision();null!==material.precision&&(precision=capabilities.getMaxPrecision(material.precision),precision!==material.precision&&console.warn("THREE.WebGLRenderer.initMaterial:",material.precision,"not supported, using",precision,"instead."));var parameters={shaderID:shaderID,precision:precision,supportsVertexTextures:capabilities.vertexTextures,map:!!material.map,envMap:!!material.envMap,envMapMode:material.envMap&&material.envMap.mapping,lightMap:!!material.lightMap,aoMap:!!material.aoMap,emissiveMap:!!material.emissiveMap,bumpMap:!!material.bumpMap,normalMap:!!material.normalMap,displacementMap:!!material.displacementMap,specularMap:!!material.specularMap,alphaMap:!!material.alphaMap,combine:material.combine,vertexColors:material.vertexColors,fog:fog,useFog:material.fog,fogExp:fog instanceof THREE.FogExp2,flatShading:material.shading===THREE.FlatShading,sizeAttenuation:material.sizeAttenuation,logarithmicDepthBuffer:capabilities.logarithmicDepthBuffer,skinning:material.skinning,maxBones:maxBones,useVertexTexture:capabilities.floatVertexTextures&&object&&object.skeleton&&object.skeleton.useVertexTexture,morphTargets:material.morphTargets,morphNormals:material.morphNormals,maxMorphTargets:renderer.maxMorphTargets,maxMorphNormals:renderer.maxMorphNormals,maxDirLights:maxLightCount.directional,maxPointLights:maxLightCount.point,maxSpotLights:maxLightCount.spot,maxHemiLights:maxLightCount.hemi,maxShadows:allocatedShadows.maxShadows,pointLightShadows:allocatedShadows.pointLightShadows,shadowMapEnabled:renderer.shadowMap.enabled&&object.receiveShadow&&allocatedShadows.maxShadows>0,shadowMapType:renderer.shadowMap.type,shadowMapDebug:renderer.shadowMap.debug,alphaTest:material.alphaTest,metal:material.metal,doubleSided:material.side===THREE.DoubleSide,flipSided:material.side===THREE.BackSide};return parameters},this.getProgramCode=function(material,parameters){var chunks=[];if(parameters.shaderID?chunks.push(parameters.shaderID):(chunks.push(material.fragmentShader),chunks.push(material.vertexShader)),void 0!==material.defines)for(var name in material.defines)chunks.push(name),chunks.push(material.defines[name]);for(var i=0;ip;p++){var programInfo=programs[p];if(programInfo.code===code){program=programInfo,++program.usedTimes;break}}return void 0===program&&(program=new THREE.WebGLProgram(renderer,code,material,parameters),programs.push(program)),program},this.releaseProgram=function(program){if(0===--program.usedTimes){var i=programs.indexOf(program);programs[i]=programs[programs.length-1],programs.pop(),program.destroy()}},this.programs=programs},THREE.WebGLProperties=function(){var properties={};this.get=function(object){var uuid=object.uuid,map=properties[uuid];return void 0===map&&(map={},properties[uuid]=map),map},this["delete"]=function(object){delete properties[object.uuid]},this.clear=function(){properties={}}},THREE.WebGLShader=function(){function addLineNumbers(string){for(var lines=string.split("\n"),i=0;i0&&material.morphTargets,useSkinning=object instanceof THREE.SkinnedMesh&&material.skinning,variantIndex=0;useMorphing&&(variantIndex|=_MorphingFlag),useSkinning&&(variantIndex|=_SkinningFlag),newMaterial=materialVariants[variantIndex]}return newMaterial.visible=material.visible,newMaterial.wireframe=material.wireframe,newMaterial.wireframeLinewidth=material.wireframeLinewidth,isPointLight&&void 0!==newMaterial.uniforms.lightPos&&newMaterial.uniforms.lightPos.value.copy(lightPositionWorld),newMaterial}function projectObject(object,camera){if(object.visible!==!1){if((object instanceof THREE.Mesh||object instanceof THREE.Line||object instanceof THREE.Points)&&object.castShadow&&(object.frustumCulled===!1||_frustum.intersectsObject(object)===!0)){var material=object.material;material.visible===!0&&(object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld),_renderList.push(object))}for(var children=object.children,i=0,l=children.length;l>i;i++)projectObject(children[i],camera)}}for(var _gl=_renderer.context,_state=_renderer.state,_frustum=new THREE.Frustum,_projScreenMatrix=new THREE.Matrix4,_lookTarget=(new THREE.Vector3,new THREE.Vector3,new THREE.Vector3),_lightPositionWorld=new THREE.Vector3,_renderList=[],_MorphingFlag=1,_SkinningFlag=2,_NumberOfMaterialVariants=(_MorphingFlag|_SkinningFlag)+1,_depthMaterials=new Array(_NumberOfMaterialVariants),_distanceMaterials=new Array(_NumberOfMaterialVariants),cubeDirections=[new THREE.Vector3(1,0,0),new THREE.Vector3(-1,0,0),new THREE.Vector3(0,0,1),new THREE.Vector3(0,0,-1),new THREE.Vector3(0,1,0),new THREE.Vector3(0,-1,0)],cubeUps=[new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,0,1),new THREE.Vector3(0,0,-1)],cube2DViewPorts=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],_vector4=new THREE.Vector4,depthShader=THREE.ShaderLib.depthRGBA,depthUniforms=THREE.UniformsUtils.clone(depthShader.uniforms),distanceShader=THREE.ShaderLib.distanceRGBA,distanceUniforms=THREE.UniformsUtils.clone(distanceShader.uniforms),i=0;i!==_NumberOfMaterialVariants;++i){var useMorphing=0!==(i&_MorphingFlag),useSkinning=0!==(i&_SkinningFlag),depthMaterial=new THREE.ShaderMaterial({uniforms:depthUniforms,vertexShader:depthShader.vertexShader,fragmentShader:depthShader.fragmentShader,morphTargets:useMorphing,skinning:useSkinning});depthMaterial._shadowPass=!0,_depthMaterials[i]=depthMaterial;var distanceMaterial=new THREE.ShaderMaterial({uniforms:distanceUniforms,vertexShader:distanceShader.vertexShader,fragmentShader:distanceShader.fragmentShader,morphTargets:useMorphing,skinning:useSkinning});distanceMaterial._shadowPass=!0,_distanceMaterials[i]=distanceMaterial}var scope=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=THREE.PCFShadowMap,this.cullFace=THREE.CullFaceFront,this.render=function(scene){var faceCount,isPointLight;if(scope.enabled!==!1&&(scope.autoUpdate!==!1||scope.needsUpdate!==!1)){_gl.clearColor(1,1,1,1),_state.disable(_gl.BLEND),_state.enable(_gl.CULL_FACE),_gl.frontFace(_gl.CCW),_gl.cullFace(scope.cullFace===THREE.CullFaceFront?_gl.FRONT:_gl.BACK),_state.setDepthTest(!0),_renderer.getViewport(_vector4);for(var i=0,il=_lights.length;il>i;i++){var light=_lights[i];if(light.castShadow===!0){var shadow=light.shadow,shadowCamera=shadow.camera,shadowMapSize=shadow.mapSize;if(light instanceof THREE.PointLight){faceCount=6,isPointLight=!0;var vpWidth=shadowMapSize.x/4,vpHeight=shadowMapSize.y/2;cube2DViewPorts[0].set(2*vpWidth,vpHeight,vpWidth,vpHeight),cube2DViewPorts[1].set(0,vpHeight,vpWidth,vpHeight),cube2DViewPorts[2].set(3*vpWidth,vpHeight,vpWidth,vpHeight),cube2DViewPorts[3].set(vpWidth,vpHeight,vpWidth,vpHeight),cube2DViewPorts[4].set(3*vpWidth,0,vpWidth,vpHeight),cube2DViewPorts[5].set(vpWidth,0,vpWidth,vpHeight)}else faceCount=1,isPointLight=!1;if(null===shadow.map){var shadowFilter=THREE.LinearFilter;scope.type===THREE.PCFSoftShadowMap&&(shadowFilter=THREE.NearestFilter);var pars={minFilter:shadowFilter,magFilter:shadowFilter,format:THREE.RGBAFormat};shadow.map=new THREE.WebGLRenderTarget(shadowMapSize.x,shadowMapSize.y,pars),shadow.matrix=new THREE.Matrix4,light instanceof THREE.SpotLight&&(shadowCamera.aspect=shadowMapSize.x/shadowMapSize.y),shadowCamera.updateProjectionMatrix()}var shadowMap=shadow.map,shadowMatrix=shadow.matrix;_lightPositionWorld.setFromMatrixPosition(light.matrixWorld),shadowCamera.position.copy(_lightPositionWorld),_renderer.setRenderTarget(shadowMap),_renderer.clear();for(var face=0;faceCount>face;face++){if(isPointLight){_lookTarget.copy(shadowCamera.position),_lookTarget.add(cubeDirections[face]),shadowCamera.up.copy(cubeUps[face]),shadowCamera.lookAt(_lookTarget);var vpDimensions=cube2DViewPorts[face];_renderer.setViewport(vpDimensions.x,vpDimensions.y,vpDimensions.z,vpDimensions.w)}else _lookTarget.setFromMatrixPosition(light.target.matrixWorld),shadowCamera.lookAt(_lookTarget);shadowCamera.updateMatrixWorld(),shadowCamera.matrixWorldInverse.getInverse(shadowCamera.matrixWorld),shadowMatrix.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),shadowMatrix.multiply(shadowCamera.projectionMatrix),shadowMatrix.multiply(shadowCamera.matrixWorldInverse),_projScreenMatrix.multiplyMatrices(shadowCamera.projectionMatrix,shadowCamera.matrixWorldInverse),_frustum.setFromMatrix(_projScreenMatrix),_renderList.length=0,projectObject(scene,shadowCamera);for(var j=0,jl=_renderList.length;jl>j;j++){var object=_renderList[j],geometry=_objects.update(object),material=object.material;if(material instanceof THREE.MeshFaceMaterial)for(var groups=geometry.groups,materials=material.materials,k=0,kl=groups.length;kl>k;k++){var group=groups[k],groupMaterial=materials[group.materialIndex];if(groupMaterial.visible===!0){var depthMaterial=getDepthMaterial(object,groupMaterial,isPointLight,_lightPositionWorld);_renderer.renderBufferDirect(shadowCamera,_lights,null,geometry,depthMaterial,object,group)}}else{var depthMaterial=getDepthMaterial(object,material,isPointLight,_lightPositionWorld);_renderer.renderBufferDirect(shadowCamera,_lights,null,geometry,depthMaterial,object,null)}}}_renderer.resetGLState()}}_renderer.setViewport(_vector4.x,_vector4.y,_vector4.z,_vector4.w);var clearColor=_renderer.getClearColor(),clearAlpha=_renderer.getClearAlpha();_renderer.setClearColor(clearColor,clearAlpha),_state.enable(_gl.BLEND),scope.cullFace===THREE.CullFaceFront&&_gl.cullFace(_gl.BACK),_renderer.resetGLState(),scope.needsUpdate=!1}}},THREE.WebGLState=function(gl,extensions,paramThreeToGL){var _this=this,newAttributes=new Uint8Array(16),enabledAttributes=new Uint8Array(16),attributeDivisors=new Uint8Array(16),capabilities={},compressedTextureFormats=null,currentBlending=null,currentBlendEquation=null,currentBlendSrc=null,currentBlendDst=null,currentBlendEquationAlpha=null,currentBlendSrcAlpha=null,currentBlendDstAlpha=null,currentDepthFunc=null,currentDepthWrite=null,currentColorWrite=null,currentFlipSided=null,currentLineWidth=null,currentPolygonOffsetFactor=null,currentPolygonOffsetUnits=null,maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS),currentTextureSlot=void 0,currentBoundTextures={};this.init=function(){gl.clearColor(0,0,0,1),gl.clearDepth(1),gl.clearStencil(0),this.enable(gl.DEPTH_TEST),gl.depthFunc(gl.LEQUAL),gl.frontFace(gl.CCW),gl.cullFace(gl.BACK),this.enable(gl.CULL_FACE),this.enable(gl.BLEND),gl.blendEquation(gl.FUNC_ADD),gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA)},this.initAttributes=function(){for(var i=0,l=newAttributes.length;l>i;i++)newAttributes[i]=0},this.enableAttribute=function(attribute){if(newAttributes[attribute]=1,0===enabledAttributes[attribute]&&(gl.enableVertexAttribArray(attribute),enabledAttributes[attribute]=1),0!==attributeDivisors[attribute]){var extension=extensions.get("ANGLE_instanced_arrays");extension.vertexAttribDivisorANGLE(attribute,0),attributeDivisors[attribute]=0}},this.enableAttributeAndDivisor=function(attribute,meshPerAttribute,extension){newAttributes[attribute]=1,0===enabledAttributes[attribute]&&(gl.enableVertexAttribArray(attribute),enabledAttributes[attribute]=1),attributeDivisors[attribute]!==meshPerAttribute&&(extension.vertexAttribDivisorANGLE(attribute,meshPerAttribute),attributeDivisors[attribute]=meshPerAttribute)},this.disableUnusedAttributes=function(){for(var i=0,l=enabledAttributes.length;l>i;i++)enabledAttributes[i]!==newAttributes[i]&&(gl.disableVertexAttribArray(i),enabledAttributes[i]=0)},this.enable=function(id){capabilities[id]!==!0&&(gl.enable(id),capabilities[id]=!0)},this.disable=function(id){capabilities[id]!==!1&&(gl.disable(id),capabilities[id]=!1)},this.getCompressedTextureFormats=function(){if(null===compressedTextureFormats&&(compressedTextureFormats=[],extensions.get("WEBGL_compressed_texture_pvrtc")||extensions.get("WEBGL_compressed_texture_s3tc")))for(var formats=gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS),i=0;i0;var shader;shader=hasVertexTexture?{vertexShader:["uniform lowp int renderType;","uniform vec3 screenPosition;","uniform vec2 scale;","uniform float rotation;","uniform sampler2D occlusionMap;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","varying float vVisibility;","void main() {","vUV = uv;","vec2 pos = position;","if ( renderType == 2 ) {","vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );","vVisibility = visibility.r / 9.0;","vVisibility *= 1.0 - visibility.g / 9.0;","vVisibility *= visibility.b / 9.0;","vVisibility *= 1.0 - visibility.a / 9.0;","pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;","pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;","}","gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );","}"].join("\n"),fragmentShader:["uniform lowp int renderType;","uniform sampler2D map;","uniform float opacity;","uniform vec3 color;","varying vec2 vUV;","varying float vVisibility;","void main() {","if ( renderType == 0 ) {","gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );","} else if ( renderType == 1 ) {","gl_FragColor = texture2D( map, vUV );","} else {","vec4 texture = texture2D( map, vUV );","texture.a *= opacity * vVisibility;","gl_FragColor = texture;","gl_FragColor.rgb *= color;","}","}"].join("\n")}:{vertexShader:["uniform lowp int renderType;","uniform vec3 screenPosition;","uniform vec2 scale;","uniform float rotation;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","void main() {","vUV = uv;","vec2 pos = position;","if ( renderType == 2 ) {","pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;","pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;","}","gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );","}"].join("\n"),fragmentShader:["precision mediump float;","uniform lowp int renderType;","uniform sampler2D map;","uniform sampler2D occlusionMap;","uniform float opacity;","uniform vec3 color;","varying vec2 vUV;","void main() {","if ( renderType == 0 ) {","gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );","} else if ( renderType == 1 ) {","gl_FragColor = texture2D( map, vUV );","} else {","float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;","visibility = ( 1.0 - visibility / 4.0 );","vec4 texture = texture2D( map, vUV );","texture.a *= opacity * visibility;","gl_FragColor = texture;","gl_FragColor.rgb *= color;","}","}"].join("\n")},program=createProgram(shader),attributes={vertex:gl.getAttribLocation(program,"position"),uv:gl.getAttribLocation(program,"uv")},uniforms={renderType:gl.getUniformLocation(program,"renderType"),map:gl.getUniformLocation(program,"map"),occlusionMap:gl.getUniformLocation(program,"occlusionMap"),opacity:gl.getUniformLocation(program,"opacity"),color:gl.getUniformLocation(program,"color"),scale:gl.getUniformLocation(program,"scale"),rotation:gl.getUniformLocation(program,"rotation"),screenPosition:gl.getUniformLocation(program,"screenPosition")}}function createProgram(shader){var program=gl.createProgram(),fragmentShader=gl.createShader(gl.FRAGMENT_SHADER),vertexShader=gl.createShader(gl.VERTEX_SHADER),prefix="precision "+renderer.getPrecision()+" float;\n";return gl.shaderSource(fragmentShader,prefix+shader.fragmentShader),gl.shaderSource(vertexShader,prefix+shader.vertexShader),gl.compileShader(fragmentShader),gl.compileShader(vertexShader),gl.attachShader(program,fragmentShader),gl.attachShader(program,vertexShader),gl.linkProgram(program),program}var vertexBuffer,elementBuffer,program,attributes,uniforms,hasVertexTexture,tempTexture,occlusionTexture,gl=renderer.context,state=renderer.state;this.render=function(scene,camera,viewportWidth,viewportHeight){if(0!==flares.length){var tempPosition=new THREE.Vector3,invAspect=viewportHeight/viewportWidth,halfViewportWidth=.5*viewportWidth,halfViewportHeight=.5*viewportHeight,size=16/viewportHeight,scale=new THREE.Vector2(size*invAspect,size),screenPosition=new THREE.Vector3(1,1,0),screenPositionPixels=new THREE.Vector2(1,1);void 0===program&&init(),gl.useProgram(program),state.initAttributes(),state.enableAttribute(attributes.vertex),state.enableAttribute(attributes.uv),state.disableUnusedAttributes(),gl.uniform1i(uniforms.occlusionMap,0),gl.uniform1i(uniforms.map,1),gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer),gl.vertexAttribPointer(attributes.vertex,2,gl.FLOAT,!1,16,0),gl.vertexAttribPointer(attributes.uv,2,gl.FLOAT,!1,16,8),gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer),state.disable(gl.CULL_FACE),gl.depthMask(!1);for(var i=0,l=flares.length;l>i;i++){size=16/viewportHeight,scale.set(size*invAspect,size);var flare=flares[i];if(tempPosition.set(flare.matrixWorld.elements[12],flare.matrixWorld.elements[13],flare.matrixWorld.elements[14]),tempPosition.applyMatrix4(camera.matrixWorldInverse),tempPosition.applyProjection(camera.projectionMatrix),screenPosition.copy(tempPosition),screenPositionPixels.x=screenPosition.x*halfViewportWidth+halfViewportWidth,screenPositionPixels.y=screenPosition.y*halfViewportHeight+halfViewportHeight, +hasVertexTexture||screenPositionPixels.x>0&&screenPositionPixels.x0&&screenPositionPixels.yj;j++){var sprite=flare.lensFlares[j];sprite.opacity>.001&&sprite.scale>.001&&(screenPosition.x=sprite.x,screenPosition.y=sprite.y,screenPosition.z=sprite.z,size=sprite.size*sprite.scale/viewportHeight,scale.x=size*invAspect,scale.y=size,gl.uniform3f(uniforms.screenPosition,screenPosition.x,screenPosition.y,screenPosition.z),gl.uniform2f(uniforms.scale,scale.x,scale.y),gl.uniform1f(uniforms.rotation,sprite.rotation),gl.uniform1f(uniforms.opacity,sprite.opacity),gl.uniform3f(uniforms.color,sprite.color.r,sprite.color.g,sprite.color.b),state.setBlending(sprite.blending,sprite.blendEquation,sprite.blendSrc,sprite.blendDst),renderer.setTexture(sprite.texture,1),gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0))}}}state.enable(gl.CULL_FACE),state.enable(gl.DEPTH_TEST),gl.depthMask(!0),renderer.resetGLState()}}},THREE.SpritePlugin=function(renderer,sprites){function init(){var vertices=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),faces=new Uint16Array([0,1,2,0,2,3]);vertexBuffer=gl.createBuffer(),elementBuffer=gl.createBuffer(),gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer),gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW),gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer),gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,faces,gl.STATIC_DRAW),program=createProgram(),attributes={position:gl.getAttribLocation(program,"position"),uv:gl.getAttribLocation(program,"uv")},uniforms={uvOffset:gl.getUniformLocation(program,"uvOffset"),uvScale:gl.getUniformLocation(program,"uvScale"),rotation:gl.getUniformLocation(program,"rotation"),scale:gl.getUniformLocation(program,"scale"),color:gl.getUniformLocation(program,"color"),map:gl.getUniformLocation(program,"map"),opacity:gl.getUniformLocation(program,"opacity"),modelViewMatrix:gl.getUniformLocation(program,"modelViewMatrix"),projectionMatrix:gl.getUniformLocation(program,"projectionMatrix"),fogType:gl.getUniformLocation(program,"fogType"),fogDensity:gl.getUniformLocation(program,"fogDensity"),fogNear:gl.getUniformLocation(program,"fogNear"),fogFar:gl.getUniformLocation(program,"fogFar"),fogColor:gl.getUniformLocation(program,"fogColor"),alphaTest:gl.getUniformLocation(program,"alphaTest")};var canvas=document.createElement("canvas");canvas.width=8,canvas.height=8;var context=canvas.getContext("2d");context.fillStyle="white",context.fillRect(0,0,8,8),texture=new THREE.Texture(canvas),texture.needsUpdate=!0}function createProgram(){var program=gl.createProgram(),vertexShader=gl.createShader(gl.VERTEX_SHADER),fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);return gl.shaderSource(vertexShader,["precision "+renderer.getPrecision()+" float;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform float rotation;","uniform vec2 scale;","uniform vec2 uvOffset;","uniform vec2 uvScale;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","void main() {","vUV = uvOffset + uv * uvScale;","vec2 alignedPosition = position * scale;","vec2 rotatedPosition;","rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;","rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;","vec4 finalPosition;","finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );","finalPosition.xy += rotatedPosition;","finalPosition = projectionMatrix * finalPosition;","gl_Position = finalPosition;","}"].join("\n")),gl.shaderSource(fragmentShader,["precision "+renderer.getPrecision()+" float;","uniform vec3 color;","uniform sampler2D map;","uniform float opacity;","uniform int fogType;","uniform vec3 fogColor;","uniform float fogDensity;","uniform float fogNear;","uniform float fogFar;","uniform float alphaTest;","varying vec2 vUV;","void main() {","vec4 texture = texture2D( map, vUV );","if ( texture.a < alphaTest ) discard;","gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );","if ( fogType > 0 ) {","float depth = gl_FragCoord.z / gl_FragCoord.w;","float fogFactor = 0.0;","if ( fogType == 1 ) {","fogFactor = smoothstep( fogNear, fogFar, depth );","} else {","const float LOG2 = 1.442695;","fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );","fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );","}","gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );","}","}"].join("\n")),gl.compileShader(vertexShader),gl.compileShader(fragmentShader),gl.attachShader(program,vertexShader),gl.attachShader(program,fragmentShader),gl.linkProgram(program),program}function painterSortStable(a,b){return a.z!==b.z?b.z-a.z:b.id-a.id}var vertexBuffer,elementBuffer,program,attributes,uniforms,texture,gl=renderer.context,state=renderer.state,spritePosition=new THREE.Vector3,spriteRotation=new THREE.Quaternion,spriteScale=new THREE.Vector3;this.render=function(scene,camera){if(0!==sprites.length){void 0===program&&init(),gl.useProgram(program),state.initAttributes(),state.enableAttribute(attributes.position),state.enableAttribute(attributes.uv),state.disableUnusedAttributes(),state.disable(gl.CULL_FACE),state.enable(gl.BLEND),gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer),gl.vertexAttribPointer(attributes.position,2,gl.FLOAT,!1,16,0),gl.vertexAttribPointer(attributes.uv,2,gl.FLOAT,!1,16,8),gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer),gl.uniformMatrix4fv(uniforms.projectionMatrix,!1,camera.projectionMatrix.elements),state.activeTexture(gl.TEXTURE0),gl.uniform1i(uniforms.map,0);var oldFogType=0,sceneFogType=0,fog=scene.fog;fog?(gl.uniform3f(uniforms.fogColor,fog.color.r,fog.color.g,fog.color.b),fog instanceof THREE.Fog?(gl.uniform1f(uniforms.fogNear,fog.near),gl.uniform1f(uniforms.fogFar,fog.far),gl.uniform1i(uniforms.fogType,1),oldFogType=1,sceneFogType=1):fog instanceof THREE.FogExp2&&(gl.uniform1f(uniforms.fogDensity,fog.density),gl.uniform1i(uniforms.fogType,2),oldFogType=2,sceneFogType=2)):(gl.uniform1i(uniforms.fogType,0),oldFogType=0,sceneFogType=0);for(var i=0,l=sprites.length;l>i;i++){var sprite=sprites[i];sprite.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,sprite.matrixWorld),sprite.z=-sprite.modelViewMatrix.elements[14]}sprites.sort(painterSortStable);for(var scale=[],i=0,l=sprites.length;l>i;i++){var sprite=sprites[i],material=sprite.material;gl.uniform1f(uniforms.alphaTest,material.alphaTest),gl.uniformMatrix4fv(uniforms.modelViewMatrix,!1,sprite.modelViewMatrix.elements),sprite.matrixWorld.decompose(spritePosition,spriteRotation,spriteScale),scale[0]=spriteScale.x,scale[1]=spriteScale.y;var fogType=0;scene.fog&&material.fog&&(fogType=sceneFogType),oldFogType!==fogType&&(gl.uniform1i(uniforms.fogType,fogType),oldFogType=fogType),null!==material.map?(gl.uniform2f(uniforms.uvOffset,material.map.offset.x,material.map.offset.y),gl.uniform2f(uniforms.uvScale,material.map.repeat.x,material.map.repeat.y)):(gl.uniform2f(uniforms.uvOffset,0,0),gl.uniform2f(uniforms.uvScale,1,1)),gl.uniform1f(uniforms.opacity,material.opacity),gl.uniform3f(uniforms.color,material.color.r,material.color.g,material.color.b),gl.uniform1f(uniforms.rotation,material.rotation),gl.uniform2fv(uniforms.scale,scale),state.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst),state.setDepthTest(material.depthTest),state.setDepthWrite(material.depthWrite),material.map&&material.map.image&&material.map.image.width?renderer.setTexture(material.map,0):renderer.setTexture(texture,0),gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0)}state.enable(gl.CULL_FACE),renderer.resetGLState()}}},THREE.CurveUtils={tangentQuadraticBezier:function(t,p0,p1,p2){return 2*(1-t)*(p1-p0)+2*t*(p2-p1)},tangentCubicBezier:function(t,p0,p1,p2,p3){return-3*p0*(1-t)*(1-t)+3*p1*(1-t)*(1-t)-6*t*p1*(1-t)+6*t*p2*(1-t)-3*t*t*p2+3*t*t*p3},tangentSpline:function(t,p0,p1,p2,p3){var h00=6*t*t-6*t,h10=3*t*t-4*t+1,h01=-6*t*t+6*t,h11=3*t*t-2*t;return h00+h10+h01+h11},interpolate:function(p0,p1,p2,p3,t){var v0=.5*(p2-p0),v1=.5*(p3-p1),t2=t*t,t3=t*t2;return(2*p1-2*p2+v0+v1)*t3+(-3*p1+3*p2-2*v0-v1)*t2+v0*t+p1}},THREE.GeometryUtils={merge:function(geometry1,geometry2,materialIndexOffset){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");var matrix;geometry2 instanceof THREE.Mesh&&(geometry2.matrixAutoUpdate&&geometry2.updateMatrix(),matrix=geometry2.matrix,geometry2=geometry2.geometry),geometry1.merge(geometry2,matrix,materialIndexOffset)},center:function(geometry){return console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead."),geometry.center()}},THREE.ImageUtils={crossOrigin:void 0,loadTexture:function(url,mapping,onLoad,onError){console.warn("THREE.ImageUtils.loadTexture is being deprecated. Use THREE.TextureLoader() instead.");var loader=new THREE.TextureLoader;loader.setCrossOrigin(this.crossOrigin);var texture=loader.load(url,onLoad,void 0,onError);return mapping&&(texture.mapping=mapping),texture},loadTextureCube:function(urls,mapping,onLoad,onError){console.warn("THREE.ImageUtils.loadTextureCube is being deprecated. Use THREE.CubeTextureLoader() instead.");var loader=new THREE.CubeTextureLoader;loader.setCrossOrigin(this.crossOrigin);var texture=loader.load(urls,onLoad,void 0,onError);return mapping&&(texture.mapping=mapping),texture},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}},THREE.SceneUtils={createMultiMaterialObject:function(geometry,materials){for(var group=new THREE.Group,i=0,l=materials.length;l>i;i++)group.add(new THREE.Mesh(geometry,materials[i]));return group},detach:function(child,parent,scene){child.applyMatrix(parent.matrixWorld),parent.remove(child),scene.add(child)},attach:function(child,scene,parent){var matrixWorldInverse=new THREE.Matrix4;matrixWorldInverse.getInverse(parent.matrixWorld),child.applyMatrix(matrixWorldInverse),scene.remove(child),parent.add(child)}},THREE.ShapeUtils={area:function(contour){for(var n=contour.length,a=0,p=n-1,q=0;n>q;p=q++)a+=contour[p].x*contour[q].y-contour[q].x*contour[p].y;return.5*a},triangulate:function(){function snip(contour,u,v,w,n,verts){var p,ax,ay,bx,by,cx,cy,px,py;if(ax=contour[verts[u]].x,ay=contour[verts[u]].y,bx=contour[verts[v]].x,by=contour[verts[v]].y,cx=contour[verts[w]].x,cy=contour[verts[w]].y,Number.EPSILON>(bx-ax)*(cy-ay)-(by-ay)*(cx-ax))return!1;var aX,aY,bX,bY,cX,cY,apx,apy,bpx,bpy,cpx,cpy,cCROSSap,bCROSScp,aCROSSbp;for(aX=cx-bx,aY=cy-by,bX=ax-cx,bY=ay-cy,cX=bx-ax,cY=by-ay,p=0;n>p;p++)if(px=contour[verts[p]].x,py=contour[verts[p]].y,!(px===ax&&py===ay||px===bx&&py===by||px===cx&&py===cy)&&(apx=px-ax,apy=py-ay,bpx=px-bx,bpy=py-by,cpx=px-cx,cpy=py-cy,aCROSSbp=aX*bpy-aY*bpx,cCROSSap=cX*apy-cY*apx,bCROSScp=bX*cpy-bY*cpx,aCROSSbp>=-Number.EPSILON&&bCROSScp>=-Number.EPSILON&&cCROSSap>=-Number.EPSILON))return!1;return!0}return function(contour,indices){var n=contour.length;if(3>n)return null;var u,v,w,result=[],verts=[],vertIndices=[];if(THREE.ShapeUtils.area(contour)>0)for(v=0;n>v;v++)verts[v]=v;else for(v=0;n>v;v++)verts[v]=n-1-v;var nv=n,count=2*nv;for(v=nv-1;nv>2;){if(count--<=0)return console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()"),indices?vertIndices:result;if(u=v,u>=nv&&(u=0),v=u+1,v>=nv&&(v=0),w=v+1,w>=nv&&(w=0),snip(contour,u,v,w,nv,verts)){var a,b,c,s,t;for(a=verts[u],b=verts[v],c=verts[w],result.push([contour[a],contour[b],contour[c]]),vertIndices.push([verts[u],verts[v],verts[w]]),s=v,t=v+1;nv>t;s++,t++)verts[s]=verts[t];nv--,count=2*nv}}return indices?vertIndices:result}}(),triangulateShape:function(contour,holes){function point_in_segment_2D_colin(inSegPt1,inSegPt2,inOtherPt){return inSegPt1.x!==inSegPt2.x?inSegPt1.xNumber.EPSILON){var perpSeg2;if(limit>0){if(0>perpSeg1||perpSeg1>limit)return[];if(perpSeg2=seg2dy*seg1seg2dx-seg2dx*seg1seg2dy,0>perpSeg2||perpSeg2>limit)return[]}else{if(perpSeg1>0||limit>perpSeg1)return[];if(perpSeg2=seg2dy*seg1seg2dx-seg2dx*seg1seg2dy,perpSeg2>0||limit>perpSeg2)return[]}if(0===perpSeg2)return!inExcludeAdjacentSegs||0!==perpSeg1&&perpSeg1!==limit?[inSeg1Pt1]:[];if(perpSeg2===limit)return!inExcludeAdjacentSegs||0!==perpSeg1&&perpSeg1!==limit?[inSeg1Pt2]:[];if(0===perpSeg1)return[inSeg2Pt1];if(perpSeg1===limit)return[inSeg2Pt2];var factorSeg1=perpSeg2/limit;return[{x:inSeg1Pt1.x+factorSeg1*seg1dx,y:inSeg1Pt1.y+factorSeg1*seg1dy}]}if(0!==perpSeg1||seg2dy*seg1seg2dx!==seg2dx*seg1seg2dy)return[];var seg1Pt=0===seg1dx&&0===seg1dy,seg2Pt=0===seg2dx&&0===seg2dy;if(seg1Pt&&seg2Pt)return inSeg1Pt1.x!==inSeg2Pt1.x||inSeg1Pt1.y!==inSeg2Pt1.y?[]:[inSeg1Pt1];if(seg1Pt)return point_in_segment_2D_colin(inSeg2Pt1,inSeg2Pt2,inSeg1Pt1)?[inSeg1Pt1]:[];if(seg2Pt)return point_in_segment_2D_colin(inSeg1Pt1,inSeg1Pt2,inSeg2Pt1)?[inSeg2Pt1]:[];var seg1min,seg1max,seg1minVal,seg1maxVal,seg2min,seg2max,seg2minVal,seg2maxVal;return 0!==seg1dx?(inSeg1Pt1.x=seg1minVal?seg2minVal>seg1maxVal?[]:seg1maxVal===seg2minVal?inExcludeAdjacentSegs?[]:[seg2min]:seg2maxVal>=seg1maxVal?[seg2min,seg1max]:[seg2min,seg2max]:seg1minVal>seg2maxVal?[]:seg1minVal===seg2maxVal?inExcludeAdjacentSegs?[]:[seg1min]:seg2maxVal>=seg1maxVal?[seg1min,seg1max]:[seg1min,seg2max]}function isPointInsideAngle(inVertex,inLegFromPt,inLegToPt,inOtherPt){var legFromPtX=inLegFromPt.x-inVertex.x,legFromPtY=inLegFromPt.y-inVertex.y,legToPtX=inLegToPt.x-inVertex.x,legToPtY=inLegToPt.y-inVertex.y,otherPtX=inOtherPt.x-inVertex.x,otherPtY=inOtherPt.y-inVertex.y,from2toAngle=legFromPtX*legToPtY-legFromPtY*legToPtX,from2otherAngle=legFromPtX*otherPtY-legFromPtY*otherPtX;if(Math.abs(from2toAngle)>Number.EPSILON){var other2toAngle=otherPtX*legToPtY-otherPtY*legToPtX;return from2toAngle>0?from2otherAngle>=0&&other2toAngle>=0:from2otherAngle>=0||other2toAngle>=0}return from2otherAngle>0}function removeHoles(contour,holes){function isCutLineInsideAngles(inShapeIdx,inHoleIdx){var lastShapeIdx=shape.length-1,prevShapeIdx=inShapeIdx-1;0>prevShapeIdx&&(prevShapeIdx=lastShapeIdx);var nextShapeIdx=inShapeIdx+1;nextShapeIdx>lastShapeIdx&&(nextShapeIdx=0);var insideAngle=isPointInsideAngle(shape[inShapeIdx],shape[prevShapeIdx],shape[nextShapeIdx],hole[inHoleIdx]);if(!insideAngle)return!1;var lastHoleIdx=hole.length-1,prevHoleIdx=inHoleIdx-1;0>prevHoleIdx&&(prevHoleIdx=lastHoleIdx);var nextHoleIdx=inHoleIdx+1;return nextHoleIdx>lastHoleIdx&&(nextHoleIdx=0),insideAngle=isPointInsideAngle(hole[inHoleIdx],hole[prevHoleIdx],hole[nextHoleIdx],shape[inShapeIdx]),!!insideAngle}function intersectsShapeEdge(inShapePt,inHolePt){var sIdx,nextIdx,intersection;for(sIdx=0;sIdx0)return!0;return!1}function intersectsHoleEdge(inShapePt,inHolePt){var ihIdx,chkHole,hIdx,nextIdx,intersection;for(ihIdx=0;ihIdx0)return!0;return!1}for(var hole,holeIndex,shapeIndex,shapePt,holePt,holeIdx,cutKey,tmpShape1,tmpShape2,tmpHole1,tmpHole2,shape=contour.concat(),indepHoles=[],failedCuts=[],h=0,hl=holes.length;hl>h;h++)indepHoles.push(h);for(var minShapeIndex=0,counter=2*indepHoles.length;indepHoles.length>0;){if(counter--,0>counter){console.log("Infinite Loop! Holes left:"+indepHoles.length+", Probably Hole outside Shape!");break}for(shapeIndex=minShapeIndex;shapeIndex=0)break;failedCuts[cutKey]=!0}if(holeIndex>=0)break}}return shape}for(var i,il,f,face,key,index,allPointsMap={},allpoints=contour.concat(),h=0,hl=holes.length;hl>h;h++)Array.prototype.push.apply(allpoints,holes[h]);for(i=0,il=allpoints.length;il>i;i++)key=allpoints[i].x+":"+allpoints[i].y,void 0!==allPointsMap[key]&&console.warn("THREE.Shape: Duplicate point",key),allPointsMap[key]=i;var shapeWithoutHoles=removeHoles(contour,holes),triangles=THREE.ShapeUtils.triangulate(shapeWithoutHoles,!1);for(i=0,il=triangles.length;il>i;i++)for(face=triangles[i],f=0;3>f;f++)key=face[f].x+":"+face[f].y,index=allPointsMap[key],void 0!==index&&(face[f]=index);return triangles.concat()},isClockWise:function(pts){return THREE.ShapeUtils.area(pts)<0},b2:function(){function b2p0(t,p){var k=1-t;return k*k*p}function b2p1(t,p){return 2*(1-t)*t*p}function b2p2(t,p){return t*t*p}return function(t,p0,p1,p2){return b2p0(t,p0)+b2p1(t,p1)+b2p2(t,p2)}}(),b3:function(){function b3p0(t,p){var k=1-t;return k*k*k*p}function b3p1(t,p){var k=1-t;return 3*k*k*t*p}function b3p2(t,p){var k=1-t;return 3*k*t*t*p}function b3p3(t,p){return t*t*t*p}return function(t,p0,p1,p2,p3){return b3p0(t,p0)+b3p1(t,p1)+b3p2(t,p2)+b3p3(t,p3)}}()},THREE.Audio=function(listener){THREE.Object3D.call(this),this.type="Audio",this.context=listener.context,this.source=this.context.createBufferSource(),this.source.onended=this.onEnded.bind(this),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.panner=this.context.createPanner(),this.panner.connect(this.gain),this.autoplay=!1,this.startTime=0,this.playbackRate=1,this.isPlaying=!1},THREE.Audio.prototype=Object.create(THREE.Object3D.prototype),THREE.Audio.prototype.constructor=THREE.Audio,THREE.Audio.prototype.load=function(file){var scope=this,request=new XMLHttpRequest;return request.open("GET",file,!0),request.responseType="arraybuffer",request.onload=function(e){scope.context.decodeAudioData(this.response,function(buffer){scope.source.buffer=buffer,scope.autoplay&&scope.play()})},request.send(),this},THREE.Audio.prototype.play=function(){if(this.isPlaying===!0)return void console.warn("THREE.Audio: Audio is already playing.");var source=this.context.createBufferSource();source.buffer=this.source.buffer,source.loop=this.source.loop,source.onended=this.source.onended,source.start(0,this.startTime),source.playbackRate.value=this.playbackRate,this.isPlaying=!0,this.source=source,this.connect()},THREE.Audio.prototype.pause=function(){this.source.stop(),this.startTime=this.context.currentTime},THREE.Audio.prototype.stop=function(){this.source.stop(),this.startTime=0},THREE.Audio.prototype.connect=function(){void 0!==this.filter?(this.source.connect(this.filter),this.filter.connect(this.panner)):this.source.connect(this.panner)},THREE.Audio.prototype.disconnect=function(){void 0!==this.filter?(this.source.disconnect(this.filter),this.filter.disconnect(this.panner)):this.source.disconnect(this.panner)},THREE.Audio.prototype.setFilter=function(value){this.isPlaying===!0?(this.disconnect(),this.filter=value,this.connect()):this.filter=value},THREE.Audio.prototype.getFilter=function(){return this.filter},THREE.Audio.prototype.setPlaybackRate=function(value){this.playbackRate=value,this.isPlaying===!0&&(this.source.playbackRate.value=this.playbackRate)},THREE.Audio.prototype.getPlaybackRate=function(){return this.playbackRate},THREE.Audio.prototype.onEnded=function(){this.isPlaying=!1},THREE.Audio.prototype.setLoop=function(value){this.source.loop=value},THREE.Audio.prototype.getLoop=function(){return this.source.loop},THREE.Audio.prototype.setRefDistance=function(value){this.panner.refDistance=value},THREE.Audio.prototype.getRefDistance=function(){return this.panner.refDistance},THREE.Audio.prototype.setRolloffFactor=function(value){this.panner.rolloffFactor=value},THREE.Audio.prototype.getRolloffFactor=function(){return this.panner.rolloffFactor},THREE.Audio.prototype.setVolume=function(value){this.gain.gain.value=value},THREE.Audio.prototype.getVolume=function(){return this.gain.gain.value},THREE.Audio.prototype.updateMatrixWorld=function(){var position=new THREE.Vector3;return function(force){THREE.Object3D.prototype.updateMatrixWorld.call(this,force),position.setFromMatrixPosition(this.matrixWorld),this.panner.setPosition(position.x,position.y,position.z)}}(),THREE.AudioListener=function(){THREE.Object3D.call(this),this.type="AudioListener",this.context=new(window.AudioContext||window.webkitAudioContext)},THREE.AudioListener.prototype=Object.create(THREE.Object3D.prototype),THREE.AudioListener.prototype.constructor=THREE.AudioListener,THREE.AudioListener.prototype.updateMatrixWorld=function(){var position=new THREE.Vector3,quaternion=new THREE.Quaternion,scale=new THREE.Vector3,orientation=new THREE.Vector3;return function(force){THREE.Object3D.prototype.updateMatrixWorld.call(this,force);var listener=this.context.listener,up=this.up;this.matrixWorld.decompose(position,quaternion,scale),orientation.set(0,0,-1).applyQuaternion(quaternion),listener.setPosition(position.x,position.y,position.z),listener.setOrientation(orientation.x,orientation.y,orientation.z,up.x,up.y,up.z)}}(),THREE.Curve=function(){},THREE.Curve.prototype={constructor:THREE.Curve,getPoint:function(t){return console.warn("THREE.Curve: Warning, getPoint() not implemented!"),null},getPointAt:function(u){var t=this.getUtoTmapping(u);return this.getPoint(t)},getPoints:function(divisions){divisions||(divisions=5);var d,pts=[];for(d=0;divisions>=d;d++)pts.push(this.getPoint(d/divisions));return pts},getSpacedPoints:function(divisions){divisions||(divisions=5);var d,pts=[];for(d=0;divisions>=d;d++)pts.push(this.getPointAt(d/divisions));return pts},getLength:function(){var lengths=this.getLengths();return lengths[lengths.length-1]},getLengths:function(divisions){if(divisions||(divisions=this.__arcLengthDivisions?this.__arcLengthDivisions:200),this.cacheArcLengths&&this.cacheArcLengths.length===divisions+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var current,p,cache=[],last=this.getPoint(0),sum=0;for(cache.push(0),p=1;divisions>=p;p++)current=this.getPoint(p/divisions),sum+=current.distanceTo(last),cache.push(sum),last=current;return this.cacheArcLengths=cache,cache},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(u,distance){var targetArcLength,arcLengths=this.getLengths(),i=0,il=arcLengths.length;targetArcLength=distance?distance:u*arcLengths[il-1];for(var comparison,low=0,high=il-1;high>=low;)if(i=Math.floor(low+(high-low)/2),comparison=arcLengths[i]-targetArcLength,0>comparison)low=i+1;else{if(!(comparison>0)){high=i;break}high=i-1}if(i=high,arcLengths[i]===targetArcLength){var t=i/(il-1);return t}var lengthBefore=arcLengths[i],lengthAfter=arcLengths[i+1],segmentLength=lengthAfter-lengthBefore,segmentFraction=(targetArcLength-lengthBefore)/segmentLength,t=(i+segmentFraction)/(il-1);return t},getTangent:function(t){var delta=1e-4,t1=t-delta,t2=t+delta;0>t1&&(t1=0),t2>1&&(t2=1);var pt1=this.getPoint(t1),pt2=this.getPoint(t2),vec=pt2.clone().sub(pt1);return vec.normalize()},getTangentAt:function(u){var t=this.getUtoTmapping(u);return this.getTangent(t)}},THREE.Curve.Utils=THREE.CurveUtils,THREE.Curve.create=function(constructor,getPointFunc){return constructor.prototype=Object.create(THREE.Curve.prototype),constructor.prototype.constructor=constructor,constructor.prototype.getPoint=getPointFunc,constructor},THREE.CurvePath=function(){this.curves=[],this.autoClose=!1},THREE.CurvePath.prototype=Object.create(THREE.Curve.prototype),THREE.CurvePath.prototype.constructor=THREE.CurvePath,THREE.CurvePath.prototype.add=function(curve){this.curves.push(curve)},THREE.CurvePath.prototype.closePath=function(){var startPoint=this.curves[0].getPoint(0),endPoint=this.curves[this.curves.length-1].getPoint(1);startPoint.equals(endPoint)||this.curves.push(new THREE.LineCurve(endPoint,startPoint))},THREE.CurvePath.prototype.getPoint=function(t){for(var d=t*this.getLength(),curveLengths=this.getCurveLengths(),i=0;i=d){var diff=curveLengths[i]-d,curve=this.curves[i],u=1-diff/curve.getLength();return curve.getPointAt(u)}i++}return null},THREE.CurvePath.prototype.getLength=function(){var lens=this.getCurveLengths();return lens[lens.length-1]},THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var lengths=[],sums=0,i=0,l=this.curves.length;l>i;i++)sums+=this.curves[i].getLength(),lengths.push(sums);return this.cacheLengths=lengths,lengths},THREE.CurvePath.prototype.createPointsGeometry=function(divisions){var pts=this.getPoints(divisions,!0);return this.createGeometry(pts)},THREE.CurvePath.prototype.createSpacedPointsGeometry=function(divisions){var pts=this.getSpacedPoints(divisions,!0);return this.createGeometry(pts)},THREE.CurvePath.prototype.createGeometry=function(points){for(var geometry=new THREE.Geometry,i=0,l=points.length;l>i;i++){var point=points[i];geometry.vertices.push(new THREE.Vector3(point.x,point.y,point.z||0))}return geometry},THREE.Path=function(points){THREE.CurvePath.call(this),this.actions=[],points&&this.fromPoints(points)},THREE.Path.prototype=Object.create(THREE.CurvePath.prototype),THREE.Path.prototype.constructor=THREE.Path,THREE.Path.prototype.fromPoints=function(vectors){this.moveTo(vectors[0].x,vectors[0].y);for(var i=1,l=vectors.length;l>i;i++)this.lineTo(vectors[i].x,vectors[i].y)},THREE.Path.prototype.moveTo=function(x,y){this.actions.push({action:"moveTo",args:[x,y]})},THREE.Path.prototype.lineTo=function(x,y){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1],curve=new THREE.LineCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(x,y));this.curves.push(curve),this.actions.push({action:"lineTo",args:[x,y]})},THREE.Path.prototype.quadraticCurveTo=function(aCPx,aCPy,aX,aY){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1],curve=new THREE.QuadraticBezierCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(aCPx,aCPy),new THREE.Vector2(aX,aY));this.curves.push(curve),this.actions.push({action:"quadraticCurveTo",args:[aCPx,aCPy,aX,aY]})},THREE.Path.prototype.bezierCurveTo=function(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1],curve=new THREE.CubicBezierCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(aCP1x,aCP1y),new THREE.Vector2(aCP2x,aCP2y),new THREE.Vector2(aX,aY));this.curves.push(curve),this.actions.push({action:"bezierCurveTo",args:[aCP1x,aCP1y,aCP2x,aCP2y,aX,aY]})},THREE.Path.prototype.splineThru=function(pts){var args=Array.prototype.slice.call(arguments),lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1],npts=[new THREE.Vector2(x0,y0)];Array.prototype.push.apply(npts,pts);var curve=new THREE.SplineCurve(npts);this.curves.push(curve),this.actions.push({action:"splineThru",args:args})},THREE.Path.prototype.arc=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1];this.absarc(aX+x0,aY+y0,aRadius,aStartAngle,aEndAngle,aClockwise)},THREE.Path.prototype.absarc=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){this.absellipse(aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise)},THREE.Path.prototype.ellipse=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1];this.absellipse(aX+x0,aY+y0,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation)},THREE.Path.prototype.absellipse=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){var args=[aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation||0],curve=new THREE.EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation);this.curves.push(curve);var lastPoint=curve.getPoint(1);args.push(lastPoint.x),args.push(lastPoint.y),this.actions.push({action:"ellipse",args:args})},THREE.Path.prototype.getSpacedPoints=function(divisions,closedPath){divisions||(divisions=40);for(var points=[],i=0;divisions>i;i++)points.push(this.getPoint(i/divisions));return points},THREE.Path.prototype.getPoints=function(divisions,closedPath){divisions=divisions||12;for(var cpx,cpy,cpx2,cpy2,cpx1,cpy1,cpx0,cpy0,laste,tx,ty,b2=THREE.ShapeUtils.b2,b3=THREE.ShapeUtils.b3,points=[],i=0,l=this.actions.length;l>i;i++){var item=this.actions[i],action=item.action,args=item.args;switch(action){case"moveTo":points.push(new THREE.Vector2(args[0],args[1]));break;case"lineTo":points.push(new THREE.Vector2(args[0],args[1])); +break;case"quadraticCurveTo":cpx=args[2],cpy=args[3],cpx1=args[0],cpy1=args[1],points.length>0?(laste=points[points.length-1],cpx0=laste.x,cpy0=laste.y):(laste=this.actions[i-1].args,cpx0=laste[laste.length-2],cpy0=laste[laste.length-1]);for(var j=1;divisions>=j;j++){var t=j/divisions;tx=b2(t,cpx0,cpx1,cpx),ty=b2(t,cpy0,cpy1,cpy),points.push(new THREE.Vector2(tx,ty))}break;case"bezierCurveTo":cpx=args[4],cpy=args[5],cpx1=args[0],cpy1=args[1],cpx2=args[2],cpy2=args[3],points.length>0?(laste=points[points.length-1],cpx0=laste.x,cpy0=laste.y):(laste=this.actions[i-1].args,cpx0=laste[laste.length-2],cpy0=laste[laste.length-1]);for(var j=1;divisions>=j;j++){var t=j/divisions;tx=b3(t,cpx0,cpx1,cpx2,cpx),ty=b3(t,cpy0,cpy1,cpy2,cpy),points.push(new THREE.Vector2(tx,ty))}break;case"splineThru":laste=this.actions[i-1].args;var last=new THREE.Vector2(laste[laste.length-2],laste[laste.length-1]),spts=[last],n=divisions*args[0].length;spts=spts.concat(args[0]);for(var spline=new THREE.SplineCurve(spts),j=1;n>=j;j++)points.push(spline.getPointAt(j/n));break;case"arc":for(var angle,aX=args[0],aY=args[1],aRadius=args[2],aStartAngle=args[3],aEndAngle=args[4],aClockwise=!!args[5],deltaAngle=aEndAngle-aStartAngle,tdivisions=2*divisions,j=1;tdivisions>=j;j++){var t=j/tdivisions;aClockwise||(t=1-t),angle=aStartAngle+t*deltaAngle,tx=aX+aRadius*Math.cos(angle),ty=aY+aRadius*Math.sin(angle),points.push(new THREE.Vector2(tx,ty))}break;case"ellipse":var angle,cos,sin,aX=args[0],aY=args[1],xRadius=args[2],yRadius=args[3],aStartAngle=args[4],aEndAngle=args[5],aClockwise=!!args[6],aRotation=args[7],deltaAngle=aEndAngle-aStartAngle,tdivisions=2*divisions;0!==aRotation&&(cos=Math.cos(aRotation),sin=Math.sin(aRotation));for(var j=1;tdivisions>=j;j++){var t=j/tdivisions;if(aClockwise||(t=1-t),angle=aStartAngle+t*deltaAngle,tx=aX+xRadius*Math.cos(angle),ty=aY+yRadius*Math.sin(angle),0!==aRotation){var x=tx,y=ty;tx=(x-aX)*cos-(y-aY)*sin+aX,ty=(x-aX)*sin+(y-aY)*cos+aY}points.push(new THREE.Vector2(tx,ty))}}}var lastPoint=points[points.length-1];return Math.abs(lastPoint.x-points[0].x)i;i++){var item=inActions[i],args=item.args,action=item.action;"moveTo"===action&&0!==lastPath.actions.length&&(subPaths.push(lastPath),lastPath=new THREE.Path),lastPath[action].apply(lastPath,args)}return 0!==lastPath.actions.length&&subPaths.push(lastPath),subPaths}function toShapesNoHoles(inSubpaths){for(var shapes=[],i=0,l=inSubpaths.length;l>i;i++){var tmpPath=inSubpaths[i],tmpShape=new THREE.Shape;tmpShape.actions=tmpPath.actions,tmpShape.curves=tmpPath.curves,shapes.push(tmpShape)}return shapes}function isPointInsidePolygon(inPt,inPolygon){for(var polyLen=inPolygon.length,inside=!1,p=polyLen-1,q=0;polyLen>q;p=q++){var edgeLowPt=inPolygon[p],edgeHighPt=inPolygon[q],edgeDx=edgeHighPt.x-edgeLowPt.x,edgeDy=edgeHighPt.y-edgeLowPt.y;if(Math.abs(edgeDy)>Number.EPSILON){if(0>edgeDy&&(edgeLowPt=inPolygon[q],edgeDx=-edgeDx,edgeHighPt=inPolygon[p],edgeDy=-edgeDy),inPt.yedgeHighPt.y)continue;if(inPt.y===edgeLowPt.y){if(inPt.x===edgeLowPt.x)return!0}else{var perpEdge=edgeDy*(inPt.x-edgeLowPt.x)-edgeDx*(inPt.y-edgeLowPt.y);if(0===perpEdge)return!0;if(0>perpEdge)continue;inside=!inside}}else{if(inPt.y!==edgeLowPt.y)continue;if(edgeHighPt.x<=inPt.x&&inPt.x<=edgeLowPt.x||edgeLowPt.x<=inPt.x&&inPt.x<=edgeHighPt.x)return!0}}return inside}var isClockWise=THREE.ShapeUtils.isClockWise,subPaths=extractSubpaths(this.actions);if(0===subPaths.length)return[];if(noHoles===!0)return toShapesNoHoles(subPaths);var solid,tmpPath,tmpShape,shapes=[];if(1===subPaths.length)return tmpPath=subPaths[0],tmpShape=new THREE.Shape,tmpShape.actions=tmpPath.actions,tmpShape.curves=tmpPath.curves,shapes.push(tmpShape),shapes;var holesFirst=!isClockWise(subPaths[0].getPoints());holesFirst=isCCW?!holesFirst:holesFirst;var tmpPoints,betterShapeHoles=[],newShapes=[],newShapeHoles=[],mainIdx=0;newShapes[mainIdx]=void 0,newShapeHoles[mainIdx]=[];for(var i=0,l=subPaths.length;l>i;i++)tmpPath=subPaths[i],tmpPoints=tmpPath.getPoints(),solid=isClockWise(tmpPoints),solid=isCCW?!solid:solid,solid?(!holesFirst&&newShapes[mainIdx]&&mainIdx++,newShapes[mainIdx]={s:new THREE.Shape,p:tmpPoints},newShapes[mainIdx].s.actions=tmpPath.actions,newShapes[mainIdx].s.curves=tmpPath.curves,holesFirst&&mainIdx++,newShapeHoles[mainIdx]=[]):newShapeHoles[mainIdx].push({h:tmpPath,p:tmpPoints[0]});if(!newShapes[0])return toShapesNoHoles(subPaths);if(newShapes.length>1){for(var ambiguous=!1,toChange=[],sIdx=0,sLen=newShapes.length;sLen>sIdx;sIdx++)betterShapeHoles[sIdx]=[];for(var sIdx=0,sLen=newShapes.length;sLen>sIdx;sIdx++)for(var sho=newShapeHoles[sIdx],hIdx=0;hIdx0&&(ambiguous||(newShapeHoles=betterShapeHoles))}for(var tmpHoles,i=0,il=newShapes.length;il>i;i++){tmpShape=newShapes[i].s,shapes.push(tmpShape),tmpHoles=newShapeHoles[i];for(var j=0,jl=tmpHoles.length;jl>j;j++)tmpShape.holes.push(tmpHoles[j].h)}return shapes},THREE.Shape=function(){THREE.Path.apply(this,arguments),this.holes=[]},THREE.Shape.prototype=Object.create(THREE.Path.prototype),THREE.Shape.prototype.constructor=THREE.Shape,THREE.Shape.prototype.extrude=function(options){return new THREE.ExtrudeGeometry(this,options)},THREE.Shape.prototype.makeGeometry=function(options){return new THREE.ShapeGeometry(this,options)},THREE.Shape.prototype.getPointsHoles=function(divisions){for(var holesPts=[],i=0,l=this.holes.length;l>i;i++)holesPts[i]=this.holes[i].getPoints(divisions);return holesPts},THREE.Shape.prototype.extractAllPoints=function(divisions){return{shape:this.getPoints(divisions),holes:this.getPointsHoles(divisions)}},THREE.Shape.prototype.extractPoints=function(divisions){return this.extractAllPoints(divisions)},THREE.Shape.Utils=THREE.ShapeUtils,THREE.LineCurve=function(v1,v2){this.v1=v1,this.v2=v2},THREE.LineCurve.prototype=Object.create(THREE.Curve.prototype),THREE.LineCurve.prototype.constructor=THREE.LineCurve,THREE.LineCurve.prototype.getPoint=function(t){var point=this.v2.clone().sub(this.v1);return point.multiplyScalar(t).add(this.v1),point},THREE.LineCurve.prototype.getPointAt=function(u){return this.getPoint(u)},THREE.LineCurve.prototype.getTangent=function(t){var tangent=this.v2.clone().sub(this.v1);return tangent.normalize()},THREE.QuadraticBezierCurve=function(v0,v1,v2){this.v0=v0,this.v1=v1,this.v2=v2},THREE.QuadraticBezierCurve.prototype=Object.create(THREE.Curve.prototype),THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve,THREE.QuadraticBezierCurve.prototype.getPoint=function(t){var b2=THREE.ShapeUtils.b2;return new THREE.Vector2(b2(t,this.v0.x,this.v1.x,this.v2.x),b2(t,this.v0.y,this.v1.y,this.v2.y))},THREE.QuadraticBezierCurve.prototype.getTangent=function(t){var tangentQuadraticBezier=THREE.CurveUtils.tangentQuadraticBezier;return new THREE.Vector2(tangentQuadraticBezier(t,this.v0.x,this.v1.x,this.v2.x),tangentQuadraticBezier(t,this.v0.y,this.v1.y,this.v2.y)).normalize()},THREE.CubicBezierCurve=function(v0,v1,v2,v3){this.v0=v0,this.v1=v1,this.v2=v2,this.v3=v3},THREE.CubicBezierCurve.prototype=Object.create(THREE.Curve.prototype),THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve,THREE.CubicBezierCurve.prototype.getPoint=function(t){var b3=THREE.ShapeUtils.b3;return new THREE.Vector2(b3(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b3(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y))},THREE.CubicBezierCurve.prototype.getTangent=function(t){var tangentCubicBezier=THREE.CurveUtils.tangentCubicBezier;return new THREE.Vector2(tangentCubicBezier(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),tangentCubicBezier(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y)).normalize()},THREE.SplineCurve=function(points){this.points=void 0==points?[]:points},THREE.SplineCurve.prototype=Object.create(THREE.Curve.prototype),THREE.SplineCurve.prototype.constructor=THREE.SplineCurve,THREE.SplineCurve.prototype.getPoint=function(t){var points=this.points,point=(points.length-1)*t,intPoint=Math.floor(point),weight=point-intPoint,point0=points[0===intPoint?intPoint:intPoint-1],point1=points[intPoint],point2=points[intPoint>points.length-2?points.length-1:intPoint+1],point3=points[intPoint>points.length-3?points.length-1:intPoint+2],interpolate=THREE.CurveUtils.interpolate;return new THREE.Vector2(interpolate(point0.x,point1.x,point2.x,point3.x,weight),interpolate(point0.y,point1.y,point2.y,point3.y,weight))},THREE.EllipseCurve=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){this.aX=aX,this.aY=aY,this.xRadius=xRadius,this.yRadius=yRadius,this.aStartAngle=aStartAngle,this.aEndAngle=aEndAngle,this.aClockwise=aClockwise,this.aRotation=aRotation||0},THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype),THREE.EllipseCurve.prototype.constructor=THREE.EllipseCurve,THREE.EllipseCurve.prototype.getPoint=function(t){var deltaAngle=this.aEndAngle-this.aStartAngle;0>deltaAngle&&(deltaAngle+=2*Math.PI),deltaAngle>2*Math.PI&&(deltaAngle-=2*Math.PI);var angle;angle=this.aClockwise===!0?this.aEndAngle+(1-t)*(2*Math.PI-deltaAngle):this.aStartAngle+t*deltaAngle;var x=this.aX+this.xRadius*Math.cos(angle),y=this.aY+this.yRadius*Math.sin(angle);if(0!==this.aRotation){var cos=Math.cos(this.aRotation),sin=Math.sin(this.aRotation),tx=x,ty=y;x=(tx-this.aX)*cos-(ty-this.aY)*sin+this.aX,y=(tx-this.aX)*sin+(ty-this.aY)*cos+this.aY}return new THREE.Vector2(x,y)},THREE.ArcCurve=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){THREE.EllipseCurve.call(this,aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise)},THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype),THREE.ArcCurve.prototype.constructor=THREE.ArcCurve,THREE.LineCurve3=THREE.Curve.create(function(v1,v2){this.v1=v1,this.v2=v2},function(t){var vector=new THREE.Vector3;return vector.subVectors(this.v2,this.v1),vector.multiplyScalar(t),vector.add(this.v1),vector}),THREE.QuadraticBezierCurve3=THREE.Curve.create(function(v0,v1,v2){this.v0=v0,this.v1=v1,this.v2=v2},function(t){var b2=THREE.ShapeUtils.b2;return new THREE.Vector3(b2(t,this.v0.x,this.v1.x,this.v2.x),b2(t,this.v0.y,this.v1.y,this.v2.y),b2(t,this.v0.z,this.v1.z,this.v2.z))}),THREE.CubicBezierCurve3=THREE.Curve.create(function(v0,v1,v2,v3){this.v0=v0,this.v1=v1,this.v2=v2,this.v3=v3},function(t){var b3=THREE.ShapeUtils.b3;return new THREE.Vector3(b3(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b3(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y),b3(t,this.v0.z,this.v1.z,this.v2.z,this.v3.z))}),THREE.SplineCurve3=THREE.Curve.create(function(points){console.warn("THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3"),this.points=void 0==points?[]:points},function(t){var points=this.points,point=(points.length-1)*t,intPoint=Math.floor(point),weight=point-intPoint,point0=points[0==intPoint?intPoint:intPoint-1],point1=points[intPoint],point2=points[intPoint>points.length-2?points.length-1:intPoint+1],point3=points[intPoint>points.length-3?points.length-1:intPoint+2],interpolate=THREE.CurveUtils.interpolate;return new THREE.Vector3(interpolate(point0.x,point1.x,point2.x,point3.x,weight),interpolate(point0.y,point1.y,point2.y,point3.y,weight),interpolate(point0.z,point1.z,point2.z,point3.z,weight))}),THREE.CatmullRomCurve3=function(){function CubicPoly(){}var tmp=new THREE.Vector3,px=new CubicPoly,py=new CubicPoly,pz=new CubicPoly;return CubicPoly.prototype.init=function(x0,x1,t0,t1){this.c0=x0,this.c1=t0,this.c2=-3*x0+3*x1-2*t0-t1,this.c3=2*x0-2*x1+t0+t1},CubicPoly.prototype.initNonuniformCatmullRom=function(x0,x1,x2,x3,dt0,dt1,dt2){var t1=(x1-x0)/dt0-(x2-x0)/(dt0+dt1)+(x2-x1)/dt1,t2=(x2-x1)/dt1-(x3-x1)/(dt1+dt2)+(x3-x2)/dt2;t1*=dt1,t2*=dt1,this.init(x1,x2,t1,t2)},CubicPoly.prototype.initCatmullRom=function(x0,x1,x2,x3,tension){this.init(x1,x2,tension*(x2-x0),tension*(x3-x1))},CubicPoly.prototype.calc=function(t){var t2=t*t,t3=t2*t;return this.c0+this.c1*t+this.c2*t2+this.c3*t3},THREE.Curve.create(function(p){this.points=p||[]},function(t){var point,intPoint,weight,l,points=this.points;l=points.length,2>l&&console.log("duh, you need at least 2 points"),point=(l-1)*t,intPoint=Math.floor(point),weight=point-intPoint,0===weight&&intPoint===l-1&&(intPoint=l-2,weight=1);var p0,p1,p2,p3;if(0===intPoint?(tmp.subVectors(points[0],points[1]).add(points[0]),p0=tmp):p0=points[intPoint-1],p1=points[intPoint],p2=points[intPoint+1],l>intPoint+2?p3=points[intPoint+2]:(tmp.subVectors(points[l-1],points[l-2]).add(points[l-2]),p3=tmp),void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var pow="chordal"===this.type?.5:.25,dt0=Math.pow(p0.distanceToSquared(p1),pow),dt1=Math.pow(p1.distanceToSquared(p2),pow),dt2=Math.pow(p2.distanceToSquared(p3),pow);1e-4>dt1&&(dt1=1),1e-4>dt0&&(dt0=dt1),1e-4>dt2&&(dt2=dt1),px.initNonuniformCatmullRom(p0.x,p1.x,p2.x,p3.x,dt0,dt1,dt2),py.initNonuniformCatmullRom(p0.y,p1.y,p2.y,p3.y,dt0,dt1,dt2),pz.initNonuniformCatmullRom(p0.z,p1.z,p2.z,p3.z,dt0,dt1,dt2)}else if("catmullrom"===this.type){var tension=void 0!==this.tension?this.tension:.5;px.initCatmullRom(p0.x,p1.x,p2.x,p3.x,tension),py.initCatmullRom(p0.y,p1.y,p2.y,p3.y,tension),pz.initCatmullRom(p0.z,p1.z,p2.z,p3.z,tension)}var v=new THREE.Vector3(px.calc(weight),py.calc(weight),pz.calc(weight));return v})}(),THREE.ClosedSplineCurve3=THREE.Curve.create(function(points){this.points=void 0==points?[]:points},function(t){var points=this.points,point=(points.length-0)*t,intPoint=Math.floor(point),weight=point-intPoint;intPoint+=intPoint>0?0:(Math.floor(Math.abs(intPoint)/points.length)+1)*points.length;var point0=points[(intPoint-1)%points.length],point1=points[intPoint%points.length],point2=points[(intPoint+1)%points.length],point3=points[(intPoint+2)%points.length],interpolate=THREE.CurveUtils.interpolate;return new THREE.Vector3(interpolate(point0.x,point1.x,point2.x,point3.x,weight),interpolate(point0.y,point1.y,point2.y,point3.y,weight),interpolate(point0.z,point1.z,point2.z,point3.z,weight))}),THREE.BoxGeometry=function(width,height,depth,widthSegments,heightSegments,depthSegments){function buildPlane(u,v,udir,vdir,width,height,depth,materialIndex){var w,ix,iy,gridX=scope.widthSegments,gridY=scope.heightSegments,width_half=width/2,height_half=height/2,offset=scope.vertices.length;"x"===u&&"y"===v||"y"===u&&"x"===v?w="z":"x"===u&&"z"===v||"z"===u&&"x"===v?(w="y",gridY=scope.depthSegments):("z"===u&&"y"===v||"y"===u&&"z"===v)&&(w="x",gridX=scope.depthSegments);var gridX1=gridX+1,gridY1=gridY+1,segment_width=width/gridX,segment_height=height/gridY,normal=new THREE.Vector3;for(normal[w]=depth>0?1:-1,iy=0;gridY1>iy;iy++)for(ix=0;gridX1>ix;ix++){var vector=new THREE.Vector3;vector[u]=(ix*segment_width-width_half)*udir,vector[v]=(iy*segment_height-height_half)*vdir,vector[w]=depth,scope.vertices.push(vector)}for(iy=0;gridY>iy;iy++)for(ix=0;gridX>ix;ix++){var a=ix+gridX1*iy,b=ix+gridX1*(iy+1),c=ix+1+gridX1*(iy+1),d=ix+1+gridX1*iy,uva=new THREE.Vector2(ix/gridX,1-iy/gridY),uvb=new THREE.Vector2(ix/gridX,1-(iy+1)/gridY),uvc=new THREE.Vector2((ix+1)/gridX,1-(iy+1)/gridY),uvd=new THREE.Vector2((ix+1)/gridX,1-iy/gridY),face=new THREE.Face3(a+offset,b+offset,d+offset);face.normal.copy(normal),face.vertexNormals.push(normal.clone(),normal.clone(),normal.clone()),face.materialIndex=materialIndex,scope.faces.push(face),scope.faceVertexUvs[0].push([uva,uvb,uvd]),face=new THREE.Face3(b+offset,c+offset,d+offset),face.normal.copy(normal),face.vertexNormals.push(normal.clone(),normal.clone(),normal.clone()),face.materialIndex=materialIndex,scope.faces.push(face),scope.faceVertexUvs[0].push([uvb.clone(),uvc,uvd.clone()])}}THREE.Geometry.call(this),this.type="BoxGeometry",this.parameters={width:width,height:height,depth:depth,widthSegments:widthSegments,heightSegments:heightSegments,depthSegments:depthSegments},this.widthSegments=widthSegments||1,this.heightSegments=heightSegments||1,this.depthSegments=depthSegments||1;var scope=this,width_half=width/2,height_half=height/2,depth_half=depth/2;buildPlane("z","y",-1,-1,depth,height,width_half,0),buildPlane("z","y",1,-1,depth,height,-width_half,1),buildPlane("x","z",1,1,width,depth,height_half,2),buildPlane("x","z",1,-1,width,depth,-height_half,3),buildPlane("x","y",1,-1,width,height,depth_half,4),buildPlane("x","y",-1,-1,width,height,-depth_half,5),this.mergeVertices()},THREE.BoxGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.BoxGeometry.prototype.constructor=THREE.BoxGeometry,THREE.BoxGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.BoxGeometry(parameters.width,parameters.height,parameters.depth,parameters.widthSegments,parameters.heightSegments,parameters.depthSegments)},THREE.CubeGeometry=THREE.BoxGeometry,THREE.CircleGeometry=function(radius,segments,thetaStart,thetaLength){THREE.Geometry.call(this),this.type="CircleGeometry",this.parameters={radius:radius,segments:segments,thetaStart:thetaStart,thetaLength:thetaLength},this.fromBufferGeometry(new THREE.CircleBufferGeometry(radius,segments,thetaStart,thetaLength))},THREE.CircleGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.CircleGeometry.prototype.constructor=THREE.CircleGeometry,THREE.CircleGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.CircleGeometry(parameters.radius,parameters.segments,parameters.thetaStart,parameters.thetaLength)},THREE.CircleBufferGeometry=function(radius,segments,thetaStart,thetaLength){THREE.BufferGeometry.call(this),this.type="CircleBufferGeometry",this.parameters={radius:radius,segments:segments,thetaStart:thetaStart,thetaLength:thetaLength},radius=radius||50,segments=void 0!==segments?Math.max(3,segments):8,thetaStart=void 0!==thetaStart?thetaStart:0,thetaLength=void 0!==thetaLength?thetaLength:2*Math.PI;var vertices=segments+2,positions=new Float32Array(3*vertices),normals=new Float32Array(3*vertices),uvs=new Float32Array(2*vertices);normals[2]=1,uvs[0]=.5,uvs[1]=.5;for(var s=0,i=3,ii=2;segments>=s;s++,i+=3,ii+=2){var segment=thetaStart+s/segments*thetaLength;positions[i]=radius*Math.cos(segment),positions[i+1]=radius*Math.sin(segment),normals[i+2]=1,uvs[ii]=(positions[i]/radius+1)/2,uvs[ii+1]=(positions[i+1]/radius+1)/2}for(var indices=[],i=1;segments>=i;i++)indices.push(i,i+1,0);this.setIndex(new THREE.BufferAttribute(new Uint16Array(indices),1)),this.addAttribute("position",new THREE.BufferAttribute(positions,3)),this.addAttribute("normal",new THREE.BufferAttribute(normals,3)),this.addAttribute("uv",new THREE.BufferAttribute(uvs,2)),this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)},THREE.CircleBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.CircleBufferGeometry.prototype.constructor=THREE.CircleBufferGeometry,THREE.CircleBufferGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.CircleBufferGeometry(parameters.radius,parameters.segments,parameters.thetaStart,parameters.thetaLength)},THREE.CylinderGeometry=function(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){THREE.Geometry.call(this),this.type="CylinderGeometry",this.parameters={radiusTop:radiusTop,radiusBottom:radiusBottom,height:height,radialSegments:radialSegments,heightSegments:heightSegments,openEnded:openEnded,thetaStart:thetaStart,thetaLength:thetaLength},radiusTop=void 0!==radiusTop?radiusTop:20,radiusBottom=void 0!==radiusBottom?radiusBottom:20,height=void 0!==height?height:100,radialSegments=radialSegments||8,heightSegments=heightSegments||1,openEnded=void 0!==openEnded?openEnded:!1,thetaStart=void 0!==thetaStart?thetaStart:0,thetaLength=void 0!==thetaLength?thetaLength:2*Math.PI;var x,y,heightHalf=height/2,vertices=[],uvs=[];for(y=0;heightSegments>=y;y++){var verticesRow=[],uvsRow=[],v=y/heightSegments,radius=v*(radiusBottom-radiusTop)+radiusTop;for(x=0;radialSegments>=x;x++){var u=x/radialSegments,vertex=new THREE.Vector3;vertex.x=radius*Math.sin(u*thetaLength+thetaStart),vertex.y=-v*height+heightHalf,vertex.z=radius*Math.cos(u*thetaLength+thetaStart),this.vertices.push(vertex),verticesRow.push(this.vertices.length-1),uvsRow.push(new THREE.Vector2(u,1-v))}vertices.push(verticesRow),uvs.push(uvsRow)}var na,nb,tanTheta=(radiusBottom-radiusTop)/height;for(x=0;radialSegments>x;x++)for(0!==radiusTop?(na=this.vertices[vertices[0][x]].clone(),nb=this.vertices[vertices[0][x+1]].clone()):(na=this.vertices[vertices[1][x]].clone(),nb=this.vertices[vertices[1][x+1]].clone()),na.setY(Math.sqrt(na.x*na.x+na.z*na.z)*tanTheta).normalize(),nb.setY(Math.sqrt(nb.x*nb.x+nb.z*nb.z)*tanTheta).normalize(),y=0;heightSegments>y;y++){var v1=vertices[y][x],v2=vertices[y+1][x],v3=vertices[y+1][x+1],v4=vertices[y][x+1],n1=na.clone(),n2=na.clone(),n3=nb.clone(),n4=nb.clone(),uv1=uvs[y][x].clone(),uv2=uvs[y+1][x].clone(),uv3=uvs[y+1][x+1].clone(),uv4=uvs[y][x+1].clone();this.faces.push(new THREE.Face3(v1,v2,v4,[n1,n2,n4])),this.faceVertexUvs[0].push([uv1,uv2,uv4]),this.faces.push(new THREE.Face3(v2,v3,v4,[n2.clone(),n3,n4.clone()])),this.faceVertexUvs[0].push([uv2.clone(),uv3,uv4.clone()])}if(openEnded===!1&&radiusTop>0)for(this.vertices.push(new THREE.Vector3(0,heightHalf,0)),x=0;radialSegments>x;x++){var v1=vertices[0][x],v2=vertices[0][x+1],v3=this.vertices.length-1,n1=new THREE.Vector3(0,1,0),n2=new THREE.Vector3(0,1,0),n3=new THREE.Vector3(0,1,0),uv1=uvs[0][x].clone(),uv2=uvs[0][x+1].clone(),uv3=new THREE.Vector2(uv2.x,0);this.faces.push(new THREE.Face3(v1,v2,v3,[n1,n2,n3],void 0,1)),this.faceVertexUvs[0].push([uv1,uv2,uv3])}if(openEnded===!1&&radiusBottom>0)for(this.vertices.push(new THREE.Vector3(0,-heightHalf,0)),x=0;radialSegments>x;x++){var v1=vertices[heightSegments][x+1],v2=vertices[heightSegments][x],v3=this.vertices.length-1,n1=new THREE.Vector3(0,-1,0),n2=new THREE.Vector3(0,-1,0),n3=new THREE.Vector3(0,-1,0),uv1=uvs[heightSegments][x+1].clone(),uv2=uvs[heightSegments][x].clone(),uv3=new THREE.Vector2(uv2.x,1);this.faces.push(new THREE.Face3(v1,v2,v3,[n1,n2,n3],void 0,2)),this.faceVertexUvs[0].push([uv1,uv2,uv3])}this.computeFaceNormals()},THREE.CylinderGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry,THREE.CylinderGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.CylinderGeometry(parameters.radiusTop,parameters.radiusBottom,parameters.height,parameters.radialSegments,parameters.heightSegments,parameters.openEnded,parameters.thetaStart,parameters.thetaLength)},THREE.EdgesGeometry=function(geometry,thresholdAngle){function sortFunction(a,b){return a-b}THREE.BufferGeometry.call(this),thresholdAngle=void 0!==thresholdAngle?thresholdAngle:1;var geometry2,thresholdDot=Math.cos(THREE.Math.degToRad(thresholdAngle)),edge=[0,0],hash={},keys=["a","b","c"];geometry instanceof THREE.BufferGeometry?(geometry2=new THREE.Geometry,geometry2.fromBufferGeometry(geometry)):geometry2=geometry.clone(),geometry2.mergeVertices(),geometry2.computeFaceNormals();for(var vertices=geometry2.vertices,faces=geometry2.faces,i=0,l=faces.length;l>i;i++)for(var face=faces[i],j=0;3>j;j++){edge[0]=face[keys[j]],edge[1]=face[keys[(j+1)%3]],edge.sort(sortFunction);var key=edge.toString();void 0===hash[key]?hash[key]={vert1:edge[0],vert2:edge[1],face1:i,face2:void 0}:hash[key].face2=i}var coords=[];for(var key in hash){var h=hash[key];if(void 0===h.face2||faces[h.face1].normal.dot(faces[h.face2].normal)<=thresholdDot){var vertex=vertices[h.vert1];coords.push(vertex.x),coords.push(vertex.y),coords.push(vertex.z),vertex=vertices[h.vert2],coords.push(vertex.x),coords.push(vertex.y),coords.push(vertex.z)}}this.addAttribute("position",new THREE.BufferAttribute(new Float32Array(coords),3))},THREE.EdgesGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.EdgesGeometry.prototype.constructor=THREE.EdgesGeometry,THREE.ExtrudeGeometry=function(shapes,options){return"undefined"==typeof shapes?void(shapes=[]):(THREE.Geometry.call(this),this.type="ExtrudeGeometry",shapes=Array.isArray(shapes)?shapes:[shapes],this.addShapeList(shapes,options),void this.computeFaceNormals())},THREE.ExtrudeGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry,THREE.ExtrudeGeometry.prototype.addShapeList=function(shapes,options){for(var sl=shapes.length,s=0;sl>s;s++){var shape=shapes[s];this.addShape(shape,options)}},THREE.ExtrudeGeometry.prototype.addShape=function(shape,options){function scalePt2(pt,vec,size){return vec||console.error("THREE.ExtrudeGeometry: vec does not exist"),vec.clone().multiplyScalar(size).add(pt)}function getBevelVec(inPt,inPrev,inNext){var v_trans_x,v_trans_y,shrink_by=1,v_prev_x=inPt.x-inPrev.x,v_prev_y=inPt.y-inPrev.y,v_next_x=inNext.x-inPt.x,v_next_y=inNext.y-inPt.y,v_prev_lensq=v_prev_x*v_prev_x+v_prev_y*v_prev_y,collinear0=v_prev_x*v_next_y-v_prev_y*v_next_x;if(Math.abs(collinear0)>Number.EPSILON){var v_prev_len=Math.sqrt(v_prev_lensq),v_next_len=Math.sqrt(v_next_x*v_next_x+v_next_y*v_next_y),ptPrevShift_x=inPrev.x-v_prev_y/v_prev_len,ptPrevShift_y=inPrev.y+v_prev_x/v_prev_len,ptNextShift_x=inNext.x-v_next_y/v_next_len,ptNextShift_y=inNext.y+v_next_x/v_next_len,sf=((ptNextShift_x-ptPrevShift_x)*v_next_y-(ptNextShift_y-ptPrevShift_y)*v_next_x)/(v_prev_x*v_next_y-v_prev_y*v_next_x);v_trans_x=ptPrevShift_x+v_prev_x*sf-inPt.x,v_trans_y=ptPrevShift_y+v_prev_y*sf-inPt.y;var v_trans_lensq=v_trans_x*v_trans_x+v_trans_y*v_trans_y;if(2>=v_trans_lensq)return new THREE.Vector2(v_trans_x,v_trans_y);shrink_by=Math.sqrt(v_trans_lensq/2)}else{var direction_eq=!1;v_prev_x>Number.EPSILON?v_next_x>Number.EPSILON&&(direction_eq=!0):v_prev_x<-Number.EPSILON?v_next_x<-Number.EPSILON&&(direction_eq=!0):Math.sign(v_prev_y)===Math.sign(v_next_y)&&(direction_eq=!0),direction_eq?(v_trans_x=-v_prev_y,v_trans_y=v_prev_x,shrink_by=Math.sqrt(v_prev_lensq)):(v_trans_x=v_prev_x,v_trans_y=v_prev_y,shrink_by=Math.sqrt(v_prev_lensq/2))}return new THREE.Vector2(v_trans_x/shrink_by,v_trans_y/shrink_by)}function buildLidFaces(){if(bevelEnabled){var layer=0,offset=vlen*layer;for(i=0;flen>i;i++)face=faces[i],f3(face[2]+offset,face[1]+offset,face[0]+offset);for(layer=steps+2*bevelSegments,offset=vlen*layer,i=0;flen>i;i++)face=faces[i],f3(face[0]+offset,face[1]+offset,face[2]+offset)}else{for(i=0;flen>i;i++)face=faces[i],f3(face[2],face[1],face[0]);for(i=0;flen>i;i++)face=faces[i],f3(face[0]+vlen*steps,face[1]+vlen*steps,face[2]+vlen*steps)}}function buildSideFaces(){var layeroffset=0;for(sidewalls(contour,layeroffset),layeroffset+=contour.length,h=0,hl=holes.length;hl>h;h++)ahole=holes[h],sidewalls(ahole,layeroffset),layeroffset+=ahole.length}function sidewalls(contour,layeroffset){var j,k;for(i=contour.length;--i>=0;){j=i,k=i-1,0>k&&(k=contour.length-1);var s=0,sl=steps+2*bevelSegments;for(s=0;sl>s;s++){var slen1=vlen*s,slen2=vlen*(s+1),a=layeroffset+j+slen1,b=layeroffset+k+slen1,c=layeroffset+k+slen2,d=layeroffset+j+slen2;f4(a,b,c,d,contour,s,sl,j,k)}}}function v(x,y,z){scope.vertices.push(new THREE.Vector3(x,y,z))}function f3(a,b,c){a+=shapesOffset,b+=shapesOffset,c+=shapesOffset,scope.faces.push(new THREE.Face3(a,b,c,null,null,0));var uvs=uvgen.generateTopUV(scope,a,b,c);scope.faceVertexUvs[0].push(uvs)}function f4(a,b,c,d,wallContour,stepIndex,stepsLength,contourIndex1,contourIndex2){a+=shapesOffset,b+=shapesOffset,c+=shapesOffset,d+=shapesOffset,scope.faces.push(new THREE.Face3(a,b,d,null,null,1)),scope.faces.push(new THREE.Face3(b,c,d,null,null,1));var uvs=uvgen.generateSideWallUV(scope,a,b,c,d);scope.faceVertexUvs[0].push([uvs[0],uvs[1],uvs[3]]),scope.faceVertexUvs[0].push([uvs[1],uvs[2],uvs[3]])}var extrudePts,splineTube,binormal,normal,position2,amount=void 0!==options.amount?options.amount:100,bevelThickness=void 0!==options.bevelThickness?options.bevelThickness:6,bevelSize=void 0!==options.bevelSize?options.bevelSize:bevelThickness-2,bevelSegments=void 0!==options.bevelSegments?options.bevelSegments:3,bevelEnabled=void 0!==options.bevelEnabled?options.bevelEnabled:!0,curveSegments=void 0!==options.curveSegments?options.curveSegments:12,steps=void 0!==options.steps?options.steps:1,extrudePath=options.extrudePath,extrudeByPath=!1,uvgen=void 0!==options.UVGenerator?options.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator;extrudePath&&(extrudePts=extrudePath.getSpacedPoints(steps),extrudeByPath=!0,bevelEnabled=!1,splineTube=void 0!==options.frames?options.frames:new THREE.TubeGeometry.FrenetFrames(extrudePath,steps,!1),binormal=new THREE.Vector3,normal=new THREE.Vector3,position2=new THREE.Vector3),bevelEnabled||(bevelSegments=0,bevelThickness=0,bevelSize=0);var ahole,h,hl,scope=this,shapesOffset=this.vertices.length,shapePoints=shape.extractPoints(curveSegments),vertices=shapePoints.shape,holes=shapePoints.holes,reverse=!THREE.ShapeUtils.isClockWise(vertices);if(reverse){for(vertices=vertices.reverse(),h=0,hl=holes.length;hl>h;h++)ahole=holes[h],THREE.ShapeUtils.isClockWise(ahole)&&(holes[h]=ahole.reverse());reverse=!1}var faces=THREE.ShapeUtils.triangulateShape(vertices,holes),contour=vertices;for(h=0,hl=holes.length;hl>h;h++)ahole=holes[h],vertices=vertices.concat(ahole);for(var b,bs,t,z,vert,face,vlen=vertices.length,flen=faces.length,contourMovements=[],i=0,il=contour.length,j=il-1,k=i+1;il>i;i++,j++,k++)j===il&&(j=0),k===il&&(k=0),contourMovements[i]=getBevelVec(contour[i],contour[j],contour[k]);var oneHoleMovements,holesMovements=[],verticesMovements=contourMovements.concat();for(h=0,hl=holes.length;hl>h;h++){for(ahole=holes[h],oneHoleMovements=[],i=0,il=ahole.length,j=il-1,k=i+1;il>i;i++,j++,k++)j===il&&(j=0),k===il&&(k=0),oneHoleMovements[i]=getBevelVec(ahole[i],ahole[j],ahole[k]);holesMovements.push(oneHoleMovements),verticesMovements=verticesMovements.concat(oneHoleMovements)}for(b=0;bevelSegments>b;b++){for(t=b/bevelSegments,z=bevelThickness*(1-t),bs=bevelSize*Math.sin(t*Math.PI/2),i=0,il=contour.length;il>i;i++)vert=scalePt2(contour[i],contourMovements[i],bs),v(vert.x,vert.y,-z);for(h=0,hl=holes.length;hl>h;h++)for(ahole=holes[h],oneHoleMovements=holesMovements[h],i=0,il=ahole.length;il>i;i++)vert=scalePt2(ahole[i],oneHoleMovements[i],bs),v(vert.x,vert.y,-z)}for(bs=bevelSize,i=0;vlen>i;i++)vert=bevelEnabled?scalePt2(vertices[i],verticesMovements[i],bs):vertices[i],extrudeByPath?(normal.copy(splineTube.normals[0]).multiplyScalar(vert.x),binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y),position2.copy(extrudePts[0]).add(normal).add(binormal),v(position2.x,position2.y,position2.z)):v(vert.x,vert.y,0);var s;for(s=1;steps>=s;s++)for(i=0;vlen>i;i++)vert=bevelEnabled?scalePt2(vertices[i],verticesMovements[i],bs):vertices[i],extrudeByPath?(normal.copy(splineTube.normals[s]).multiplyScalar(vert.x),binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y),position2.copy(extrudePts[s]).add(normal).add(binormal),v(position2.x,position2.y,position2.z)):v(vert.x,vert.y,amount/steps*s);for(b=bevelSegments-1;b>=0;b--){for(t=b/bevelSegments,z=bevelThickness*(1-t),bs=bevelSize*Math.sin(t*Math.PI/2),i=0,il=contour.length;il>i;i++)vert=scalePt2(contour[i],contourMovements[i],bs),v(vert.x,vert.y,amount+z);for(h=0,hl=holes.length;hl>h;h++)for(ahole=holes[h],oneHoleMovements=holesMovements[h],i=0,il=ahole.length;il>i;i++)vert=scalePt2(ahole[i],oneHoleMovements[i],bs),extrudeByPath?v(vert.x,vert.y+extrudePts[steps-1].y,extrudePts[steps-1].x+z):v(vert.x,vert.y,amount+z)}buildLidFaces(),buildSideFaces()}, +THREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(geometry,indexA,indexB,indexC){var vertices=geometry.vertices,a=vertices[indexA],b=vertices[indexB],c=vertices[indexC];return[new THREE.Vector2(a.x,a.y),new THREE.Vector2(b.x,b.y),new THREE.Vector2(c.x,c.y)]},generateSideWallUV:function(geometry,indexA,indexB,indexC,indexD){var vertices=geometry.vertices,a=vertices[indexA],b=vertices[indexB],c=vertices[indexC],d=vertices[indexD];return Math.abs(a.y-b.y)<.01?[new THREE.Vector2(a.x,1-a.z),new THREE.Vector2(b.x,1-b.z),new THREE.Vector2(c.x,1-c.z),new THREE.Vector2(d.x,1-d.z)]:[new THREE.Vector2(a.y,1-a.z),new THREE.Vector2(b.y,1-b.z),new THREE.Vector2(c.y,1-c.z),new THREE.Vector2(d.y,1-d.z)]}},THREE.ShapeGeometry=function(shapes,options){THREE.Geometry.call(this),this.type="ShapeGeometry",Array.isArray(shapes)===!1&&(shapes=[shapes]),this.addShapeList(shapes,options),this.computeFaceNormals()},THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.ShapeGeometry.prototype.constructor=THREE.ShapeGeometry,THREE.ShapeGeometry.prototype.addShapeList=function(shapes,options){for(var i=0,l=shapes.length;l>i;i++)this.addShape(shapes[i],options);return this},THREE.ShapeGeometry.prototype.addShape=function(shape,options){void 0===options&&(options={});var i,l,hole,curveSegments=void 0!==options.curveSegments?options.curveSegments:12,material=options.material,uvgen=void 0===options.UVGenerator?THREE.ExtrudeGeometry.WorldUVGenerator:options.UVGenerator,shapesOffset=this.vertices.length,shapePoints=shape.extractPoints(curveSegments),vertices=shapePoints.shape,holes=shapePoints.holes,reverse=!THREE.ShapeUtils.isClockWise(vertices);if(reverse){for(vertices=vertices.reverse(),i=0,l=holes.length;l>i;i++)hole=holes[i],THREE.ShapeUtils.isClockWise(hole)&&(holes[i]=hole.reverse());reverse=!1}var faces=THREE.ShapeUtils.triangulateShape(vertices,holes);for(i=0,l=holes.length;l>i;i++)hole=holes[i],vertices=vertices.concat(hole);var vert,face,vlen=vertices.length,flen=faces.length;for(i=0;vlen>i;i++)vert=vertices[i],this.vertices.push(new THREE.Vector3(vert.x,vert.y,0));for(i=0;flen>i;i++){face=faces[i];var a=face[0]+shapesOffset,b=face[1]+shapesOffset,c=face[2]+shapesOffset;this.faces.push(new THREE.Face3(a,b,c,null,null,material)),this.faceVertexUvs[0].push(uvgen.generateTopUV(this,a,b,c))}},THREE.LatheGeometry=function(points,segments,phiStart,phiLength){THREE.Geometry.call(this),this.type="LatheGeometry",this.parameters={points:points,segments:segments,phiStart:phiStart,phiLength:phiLength},segments=segments||12,phiStart=phiStart||0,phiLength=phiLength||2*Math.PI;for(var inversePointLength=1/(points.length-1),inverseSegments=1/segments,i=0,il=segments;il>=i;i++)for(var phi=phiStart+i*inverseSegments*phiLength,c=Math.cos(phi),s=Math.sin(phi),j=0,jl=points.length;jl>j;j++){var pt=points[j],vertex=new THREE.Vector3;vertex.x=c*pt.x-s*pt.y,vertex.y=s*pt.x+c*pt.y,vertex.z=pt.z,this.vertices.push(vertex)}for(var np=points.length,i=0,il=segments;il>i;i++)for(var j=0,jl=points.length-1;jl>j;j++){var base=j+np*i,a=base,b=base+np,c=base+1+np,d=base+1,u0=i*inverseSegments,v0=j*inversePointLength,u1=u0+inverseSegments,v1=v0+inversePointLength;this.faces.push(new THREE.Face3(a,b,d)),this.faceVertexUvs[0].push([new THREE.Vector2(u0,v0),new THREE.Vector2(u1,v0),new THREE.Vector2(u0,v1)]),this.faces.push(new THREE.Face3(b,c,d)),this.faceVertexUvs[0].push([new THREE.Vector2(u1,v0),new THREE.Vector2(u1,v1),new THREE.Vector2(u0,v1)])}this.mergeVertices(),this.computeFaceNormals(),this.computeVertexNormals()},THREE.LatheGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry,THREE.PlaneGeometry=function(width,height,widthSegments,heightSegments){THREE.Geometry.call(this),this.type="PlaneGeometry",this.parameters={width:width,height:height,widthSegments:widthSegments,heightSegments:heightSegments},this.fromBufferGeometry(new THREE.PlaneBufferGeometry(width,height,widthSegments,heightSegments))},THREE.PlaneGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry,THREE.PlaneGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.PlaneGeometry(parameters.width,parameters.height,parameters.widthSegments,parameters.heightSegments)},THREE.PlaneBufferGeometry=function(width,height,widthSegments,heightSegments){THREE.BufferGeometry.call(this),this.type="PlaneBufferGeometry",this.parameters={width:width,height:height,widthSegments:widthSegments,heightSegments:heightSegments};for(var width_half=width/2,height_half=height/2,gridX=Math.floor(widthSegments)||1,gridY=Math.floor(heightSegments)||1,gridX1=gridX+1,gridY1=gridY+1,segment_width=width/gridX,segment_height=height/gridY,vertices=new Float32Array(gridX1*gridY1*3),normals=new Float32Array(gridX1*gridY1*3),uvs=new Float32Array(gridX1*gridY1*2),offset=0,offset2=0,iy=0;gridY1>iy;iy++)for(var y=iy*segment_height-height_half,ix=0;gridX1>ix;ix++){var x=ix*segment_width-width_half;vertices[offset]=x,vertices[offset+1]=-y,normals[offset+2]=1,uvs[offset2]=ix/gridX,uvs[offset2+1]=1-iy/gridY,offset+=3,offset2+=2}offset=0;for(var indices=new(vertices.length/3>65535?Uint32Array:Uint16Array)(gridX*gridY*6),iy=0;gridY>iy;iy++)for(var ix=0;gridX>ix;ix++){var a=ix+gridX1*iy,b=ix+gridX1*(iy+1),c=ix+1+gridX1*(iy+1),d=ix+1+gridX1*iy;indices[offset]=a,indices[offset+1]=b,indices[offset+2]=d,indices[offset+3]=b,indices[offset+4]=c,indices[offset+5]=d,offset+=6}this.setIndex(new THREE.BufferAttribute(indices,1)),this.addAttribute("position",new THREE.BufferAttribute(vertices,3)),this.addAttribute("normal",new THREE.BufferAttribute(normals,3)),this.addAttribute("uv",new THREE.BufferAttribute(uvs,2))},THREE.PlaneBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.PlaneBufferGeometry.prototype.constructor=THREE.PlaneBufferGeometry,THREE.PlaneBufferGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.PlaneBufferGeometry(parameters.width,parameters.height,parameters.widthSegments,parameters.heightSegments)},THREE.RingGeometry=function(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength){THREE.Geometry.call(this),this.type="RingGeometry",this.parameters={innerRadius:innerRadius,outerRadius:outerRadius,thetaSegments:thetaSegments,phiSegments:phiSegments,thetaStart:thetaStart,thetaLength:thetaLength},innerRadius=innerRadius||0,outerRadius=outerRadius||50,thetaStart=void 0!==thetaStart?thetaStart:0,thetaLength=void 0!==thetaLength?thetaLength:2*Math.PI,thetaSegments=void 0!==thetaSegments?Math.max(3,thetaSegments):8,phiSegments=void 0!==phiSegments?Math.max(1,phiSegments):8;var i,o,uvs=[],radius=innerRadius,radiusStep=(outerRadius-innerRadius)/phiSegments;for(i=0;phiSegments+1>i;i++){for(o=0;thetaSegments+1>o;o++){var vertex=new THREE.Vector3,segment=thetaStart+o/thetaSegments*thetaLength;vertex.x=radius*Math.cos(segment),vertex.y=radius*Math.sin(segment),this.vertices.push(vertex),uvs.push(new THREE.Vector2((vertex.x/outerRadius+1)/2,(vertex.y/outerRadius+1)/2))}radius+=radiusStep}var n=new THREE.Vector3(0,0,1);for(i=0;phiSegments>i;i++){var thetaSegment=i*(thetaSegments+1);for(o=0;thetaSegments>o;o++){var segment=o+thetaSegment,v1=segment,v2=segment+thetaSegments+1,v3=segment+thetaSegments+2;this.faces.push(new THREE.Face3(v1,v2,v3,[n.clone(),n.clone(),n.clone()])),this.faceVertexUvs[0].push([uvs[v1].clone(),uvs[v2].clone(),uvs[v3].clone()]),v1=segment,v2=segment+thetaSegments+2,v3=segment+1,this.faces.push(new THREE.Face3(v1,v2,v3,[n.clone(),n.clone(),n.clone()])),this.faceVertexUvs[0].push([uvs[v1].clone(),uvs[v2].clone(),uvs[v3].clone()])}}this.computeFaceNormals(),this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)},THREE.RingGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.RingGeometry.prototype.constructor=THREE.RingGeometry,THREE.RingGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.RingGeometry(parameters.innerRadius,parameters.outerRadius,parameters.thetaSegments,parameters.phiSegments,parameters.thetaStart,parameters.thetaLength)},THREE.SphereGeometry=function(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){THREE.Geometry.call(this),this.type="SphereGeometry",this.parameters={radius:radius,widthSegments:widthSegments,heightSegments:heightSegments,phiStart:phiStart,phiLength:phiLength,thetaStart:thetaStart,thetaLength:thetaLength},this.fromBufferGeometry(new THREE.SphereBufferGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength))},THREE.SphereGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry,THREE.SphereGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.SphereGeometry(parameters.radius,parameters.widthSegments,parameters.heightSegments,parameters.phiStart,parameters.phiLength,parameters.thetaStart,parameters.thetaLength)},THREE.SphereBufferGeometry=function(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){THREE.BufferGeometry.call(this),this.type="SphereBufferGeometry",this.parameters={radius:radius,widthSegments:widthSegments,heightSegments:heightSegments,phiStart:phiStart,phiLength:phiLength,thetaStart:thetaStart,thetaLength:thetaLength},radius=radius||50,widthSegments=Math.max(3,Math.floor(widthSegments)||8),heightSegments=Math.max(2,Math.floor(heightSegments)||6),phiStart=void 0!==phiStart?phiStart:0,phiLength=void 0!==phiLength?phiLength:2*Math.PI,thetaStart=void 0!==thetaStart?thetaStart:0,thetaLength=void 0!==thetaLength?thetaLength:Math.PI;for(var thetaEnd=thetaStart+thetaLength,vertexCount=(widthSegments+1)*(heightSegments+1),positions=new THREE.BufferAttribute(new Float32Array(3*vertexCount),3),normals=new THREE.BufferAttribute(new Float32Array(3*vertexCount),3),uvs=new THREE.BufferAttribute(new Float32Array(2*vertexCount),2),index=0,vertices=[],normal=new THREE.Vector3,y=0;heightSegments>=y;y++){for(var verticesRow=[],v=y/heightSegments,x=0;widthSegments>=x;x++){var u=x/widthSegments,px=-radius*Math.cos(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength),py=radius*Math.cos(thetaStart+v*thetaLength),pz=radius*Math.sin(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);normal.set(px,py,pz).normalize(),positions.setXYZ(index,px,py,pz),normals.setXYZ(index,normal.x,normal.y,normal.z),uvs.setXY(index,u,1-v),verticesRow.push(index),index++}vertices.push(verticesRow)}for(var indices=[],y=0;heightSegments>y;y++)for(var x=0;widthSegments>x;x++){var v1=vertices[y][x+1],v2=vertices[y][x],v3=vertices[y+1][x],v4=vertices[y+1][x+1];(0!==y||thetaStart>0)&&indices.push(v1,v2,v4),(y!==heightSegments-1||thetaEnd65535?THREE.Uint32Attribute:THREE.Uint16Attribute)(indices,1)),this.addAttribute("position",positions),this.addAttribute("normal",normals),this.addAttribute("uv",uvs),this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)},THREE.SphereBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.SphereBufferGeometry.prototype.constructor=THREE.SphereBufferGeometry,THREE.SphereBufferGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.SphereBufferGeometry(parameters.radius,parameters.widthSegments,parameters.heightSegments,parameters.phiStart,parameters.phiLength,parameters.thetaStart,parameters.thetaLength)},THREE.TorusGeometry=function(radius,tube,radialSegments,tubularSegments,arc){THREE.Geometry.call(this),this.type="TorusGeometry",this.parameters={radius:radius,tube:tube,radialSegments:radialSegments,tubularSegments:tubularSegments,arc:arc},radius=radius||100,tube=tube||40,radialSegments=radialSegments||8,tubularSegments=tubularSegments||6,arc=arc||2*Math.PI;for(var center=new THREE.Vector3,uvs=[],normals=[],j=0;radialSegments>=j;j++)for(var i=0;tubularSegments>=i;i++){var u=i/tubularSegments*arc,v=j/radialSegments*Math.PI*2;center.x=radius*Math.cos(u),center.y=radius*Math.sin(u);var vertex=new THREE.Vector3;vertex.x=(radius+tube*Math.cos(v))*Math.cos(u),vertex.y=(radius+tube*Math.cos(v))*Math.sin(u),vertex.z=tube*Math.sin(v),this.vertices.push(vertex),uvs.push(new THREE.Vector2(i/tubularSegments,j/radialSegments)),normals.push(vertex.clone().sub(center).normalize())}for(var j=1;radialSegments>=j;j++)for(var i=1;tubularSegments>=i;i++){var a=(tubularSegments+1)*j+i-1,b=(tubularSegments+1)*(j-1)+i-1,c=(tubularSegments+1)*(j-1)+i,d=(tubularSegments+1)*j+i,face=new THREE.Face3(a,b,d,[normals[a].clone(),normals[b].clone(),normals[d].clone()]);this.faces.push(face),this.faceVertexUvs[0].push([uvs[a].clone(),uvs[b].clone(),uvs[d].clone()]),face=new THREE.Face3(b,c,d,[normals[b].clone(),normals[c].clone(),normals[d].clone()]),this.faces.push(face),this.faceVertexUvs[0].push([uvs[b].clone(),uvs[c].clone(),uvs[d].clone()])}this.computeFaceNormals()},THREE.TorusGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry,THREE.TorusGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.TorusGeometry(parameters.radius,parameters.tube,parameters.radialSegments,parameters.tubularSegments,parameters.arc)},THREE.TorusKnotGeometry=function(radius,tube,radialSegments,tubularSegments,p,q,heightScale){function getPos(u,in_q,in_p,radius,heightScale){var cu=Math.cos(u),su=Math.sin(u),quOverP=in_q/in_p*u,cs=Math.cos(quOverP),tx=radius*(2+cs)*.5*cu,ty=radius*(2+cs)*su*.5,tz=heightScale*radius*Math.sin(quOverP)*.5;return new THREE.Vector3(tx,ty,tz)}THREE.Geometry.call(this),this.type="TorusKnotGeometry",this.parameters={radius:radius,tube:tube,radialSegments:radialSegments,tubularSegments:tubularSegments,p:p,q:q,heightScale:heightScale},radius=radius||100,tube=tube||40,radialSegments=radialSegments||64,tubularSegments=tubularSegments||8,p=p||2,q=q||3,heightScale=heightScale||1;for(var grid=new Array(radialSegments),tang=new THREE.Vector3,n=new THREE.Vector3,bitan=new THREE.Vector3,i=0;radialSegments>i;++i){grid[i]=new Array(tubularSegments);var u=i/radialSegments*2*p*Math.PI,p1=getPos(u,q,p,radius,heightScale),p2=getPos(u+.01,q,p,radius,heightScale);tang.subVectors(p2,p1),n.addVectors(p2,p1),bitan.crossVectors(tang,n),n.crossVectors(bitan,tang),bitan.normalize(),n.normalize();for(var j=0;tubularSegments>j;++j){var v=j/tubularSegments*2*Math.PI,cx=-tube*Math.cos(v),cy=tube*Math.sin(v),pos=new THREE.Vector3;pos.x=p1.x+cx*n.x+cy*bitan.x,pos.y=p1.y+cx*n.y+cy*bitan.y,pos.z=p1.z+cx*n.z+cy*bitan.z,grid[i][j]=this.vertices.push(pos)-1}}for(var i=0;radialSegments>i;++i)for(var j=0;tubularSegments>j;++j){var ip=(i+1)%radialSegments,jp=(j+1)%tubularSegments,a=grid[i][j],b=grid[ip][j],c=grid[ip][jp],d=grid[i][jp],uva=new THREE.Vector2(i/radialSegments,j/tubularSegments),uvb=new THREE.Vector2((i+1)/radialSegments,j/tubularSegments),uvc=new THREE.Vector2((i+1)/radialSegments,(j+1)/tubularSegments),uvd=new THREE.Vector2(i/radialSegments,(j+1)/tubularSegments);this.faces.push(new THREE.Face3(a,b,d)),this.faceVertexUvs[0].push([uva,uvb,uvd]),this.faces.push(new THREE.Face3(b,c,d)),this.faceVertexUvs[0].push([uvb.clone(),uvc,uvd.clone()])}this.computeFaceNormals(),this.computeVertexNormals()},THREE.TorusKnotGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry,THREE.TorusKnotGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.TorusKnotGeometry(parameters.radius,parameters.tube,parameters.radialSegments,parameters.tubularSegments,parameters.p,parameters.q,parameters.heightScale)},THREE.TubeGeometry=function(path,segments,radius,radialSegments,closed,taper){function vert(x,y,z){return scope.vertices.push(new THREE.Vector3(x,y,z))-1}THREE.Geometry.call(this),this.type="TubeGeometry",this.parameters={path:path,segments:segments,radius:radius,radialSegments:radialSegments,closed:closed,taper:taper},segments=segments||64,radius=radius||1,radialSegments=radialSegments||8,closed=closed||!1,taper=taper||THREE.TubeGeometry.NoTaper;var tangent,normal,binormal,u,v,r,cx,cy,pos,i,j,ip,jp,a,b,c,d,uva,uvb,uvc,uvd,grid=[],scope=this,numpoints=segments+1,pos2=new THREE.Vector3,frames=new THREE.TubeGeometry.FrenetFrames(path,segments,closed),tangents=frames.tangents,normals=frames.normals,binormals=frames.binormals;for(this.tangents=tangents,this.normals=normals,this.binormals=binormals,i=0;numpoints>i;i++)for(grid[i]=[],u=i/(numpoints-1),pos=path.getPointAt(u),tangent=tangents[i],normal=normals[i],binormal=binormals[i],r=radius*taper(u),j=0;radialSegments>j;j++)v=j/radialSegments*2*Math.PI,cx=-r*Math.cos(v),cy=r*Math.sin(v),pos2.copy(pos),pos2.x+=cx*normal.x+cy*binormal.x,pos2.y+=cx*normal.y+cy*binormal.y,pos2.z+=cx*normal.z+cy*binormal.z,grid[i][j]=vert(pos2.x,pos2.y,pos2.z);for(i=0;segments>i;i++)for(j=0;radialSegments>j;j++)ip=closed?(i+1)%segments:i+1,jp=(j+1)%radialSegments,a=grid[i][j],b=grid[ip][j],c=grid[ip][jp],d=grid[i][jp],uva=new THREE.Vector2(i/segments,j/radialSegments),uvb=new THREE.Vector2((i+1)/segments,j/radialSegments),uvc=new THREE.Vector2((i+1)/segments,(j+1)/radialSegments),uvd=new THREE.Vector2(i/segments,(j+1)/radialSegments),this.faces.push(new THREE.Face3(a,b,d)),this.faceVertexUvs[0].push([uva,uvb,uvd]),this.faces.push(new THREE.Face3(b,c,d)),this.faceVertexUvs[0].push([uvb.clone(),uvc,uvd.clone()]);this.computeFaceNormals(),this.computeVertexNormals()},THREE.TubeGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry,THREE.TubeGeometry.prototype.clone=function(){return new this.constructor(this.parameters.path,this.parameters.segments,this.parameters.radius,this.parameters.radialSegments,this.parameters.closed,this.parameters.taper)},THREE.TubeGeometry.NoTaper=function(u){return 1},THREE.TubeGeometry.SinusoidalTaper=function(u){return Math.sin(Math.PI*u)},THREE.TubeGeometry.FrenetFrames=function(path,segments,closed){function initialNormal3(){normals[0]=new THREE.Vector3,binormals[0]=new THREE.Vector3,smallest=Number.MAX_VALUE,tx=Math.abs(tangents[0].x),ty=Math.abs(tangents[0].y),tz=Math.abs(tangents[0].z),smallest>=tx&&(smallest=tx,normal.set(1,0,0)),smallest>=ty&&(smallest=ty,normal.set(0,1,0)),smallest>=tz&&normal.set(0,0,1),vec.crossVectors(tangents[0],normal).normalize(),normals[0].crossVectors(tangents[0],vec),binormals[0].crossVectors(tangents[0],normals[0])}var theta,smallest,tx,ty,tz,i,u,normal=new THREE.Vector3,tangents=[],normals=[],binormals=[],vec=new THREE.Vector3,mat=new THREE.Matrix4,numpoints=segments+1;for(this.tangents=tangents,this.normals=normals,this.binormals=binormals,i=0;numpoints>i;i++)u=i/(numpoints-1),tangents[i]=path.getTangentAt(u),tangents[i].normalize();for(initialNormal3(),i=1;numpoints>i;i++)normals[i]=normals[i-1].clone(),binormals[i]=binormals[i-1].clone(),vec.crossVectors(tangents[i-1],tangents[i]),vec.length()>Number.EPSILON&&(vec.normalize(),theta=Math.acos(THREE.Math.clamp(tangents[i-1].dot(tangents[i]),-1,1)),normals[i].applyMatrix4(mat.makeRotationAxis(vec,theta))),binormals[i].crossVectors(tangents[i],normals[i]);if(closed)for(theta=Math.acos(THREE.Math.clamp(normals[0].dot(normals[numpoints-1]),-1,1)),theta/=numpoints-1,tangents[0].dot(vec.crossVectors(normals[0],normals[numpoints-1]))>0&&(theta=-theta),i=1;numpoints>i;i++)normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i],theta*i)),binormals[i].crossVectors(tangents[i],normals[i])},THREE.PolyhedronGeometry=function(vertices,indices,radius,detail){function prepare(vector){var vertex=vector.normalize().clone();vertex.index=that.vertices.push(vertex)-1;var u=azimuth(vector)/2/Math.PI+.5,v=inclination(vector)/Math.PI+.5;return vertex.uv=new THREE.Vector2(u,1-v),vertex}function make(v1,v2,v3,materialIndex){var face=new THREE.Face3(v1.index,v2.index,v3.index,[v1.clone(),v2.clone(),v3.clone()],void 0,materialIndex);that.faces.push(face),centroid.copy(v1).add(v2).add(v3).divideScalar(3);var azi=azimuth(centroid);that.faceVertexUvs[0].push([correctUV(v1.uv,v1,azi),correctUV(v2.uv,v2,azi),correctUV(v3.uv,v3,azi)])}function subdivide(face,detail){for(var cols=Math.pow(2,detail),a=prepare(that.vertices[face.a]),b=prepare(that.vertices[face.b]),c=prepare(that.vertices[face.c]),v=[],materialIndex=face.materialIndex,i=0;cols>=i;i++){v[i]=[];for(var aj=prepare(a.clone().lerp(c,i/cols)),bj=prepare(b.clone().lerp(c,i/cols)),rows=cols-i,j=0;rows>=j;j++)0===j&&i===cols?v[i][j]=aj:v[i][j]=prepare(aj.clone().lerp(bj,j/rows))}for(var i=0;cols>i;i++)for(var j=0;2*(cols-i)-1>j;j++){var k=Math.floor(j/2);j%2===0?make(v[i][k+1],v[i+1][k],v[i][k],materialIndex):make(v[i][k+1],v[i+1][k+1],v[i+1][k],materialIndex)}}function azimuth(vector){return Math.atan2(vector.z,-vector.x)}function inclination(vector){return Math.atan2(-vector.y,Math.sqrt(vector.x*vector.x+vector.z*vector.z))}function correctUV(uv,vector,azimuth){return 0>azimuth&&1===uv.x&&(uv=new THREE.Vector2(uv.x-1,uv.y)),0===vector.x&&0===vector.z&&(uv=new THREE.Vector2(azimuth/2/Math.PI+.5,uv.y)),uv.clone()}THREE.Geometry.call(this),this.type="PolyhedronGeometry",this.parameters={vertices:vertices,indices:indices,radius:radius,detail:detail},radius=radius||1,detail=detail||0;for(var that=this,i=0,l=vertices.length;l>i;i+=3)prepare(new THREE.Vector3(vertices[i],vertices[i+1],vertices[i+2]));for(var p=this.vertices,faces=[],i=0,j=0,l=indices.length;l>i;i+=3,j++){var v1=p[indices[i]],v2=p[indices[i+1]],v3=p[indices[i+2]];faces[j]=new THREE.Face3(v1.index,v2.index,v3.index,[v1.clone(),v2.clone(),v3.clone()],void 0,j)}for(var centroid=new THREE.Vector3,i=0,l=faces.length;l>i;i++)subdivide(faces[i],detail);for(var i=0,l=this.faceVertexUvs[0].length;l>i;i++){var uvs=this.faceVertexUvs[0][i],x0=uvs[0].x,x1=uvs[1].x,x2=uvs[2].x,max=Math.max(x0,x1,x2),min=Math.min(x0,x1,x2);max>.9&&.1>min&&(.2>x0&&(uvs[0].x+=1),.2>x1&&(uvs[1].x+=1),.2>x2&&(uvs[2].x+=1))}for(var i=0,l=this.vertices.length;l>i;i++)this.vertices[i].multiplyScalar(radius);this.mergeVertices(),this.computeFaceNormals(),this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)},THREE.PolyhedronGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry,THREE.PolyhedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.PolyhedronGeometry(parameters.vertices,parameters.indices,parameters.radius,parameters.detail)},THREE.DodecahedronGeometry=function(radius,detail){var t=(1+Math.sqrt(5))/2,r=1/t,vertices=[-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,-r,-t,0,-r,t,0,r,-t,0,r,t,-r,-t,0,-r,t,0,r,-t,0,r,t,0,-t,0,-r,t,0,-r,-t,0,r,t,0,r],indices=[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9];THREE.PolyhedronGeometry.call(this,vertices,indices,radius,detail),this.type="DodecahedronGeometry",this.parameters={radius:radius,detail:detail}},THREE.DodecahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype),THREE.DodecahedronGeometry.prototype.constructor=THREE.DodecahedronGeometry,THREE.DodecahedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.DodecahedronGeometry(parameters.radius,parameters.detail)},THREE.IcosahedronGeometry=function(radius,detail){var t=(1+Math.sqrt(5))/2,vertices=[-1,t,0,1,t,0,-1,-t,0,1,-t,0,0,-1,t,0,1,t,0,-1,-t,0,1,-t,t,0,-1,t,0,1,-t,0,-1,-t,0,1],indices=[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1];THREE.PolyhedronGeometry.call(this,vertices,indices,radius,detail),this.type="IcosahedronGeometry",this.parameters={radius:radius,detail:detail}},THREE.IcosahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype),THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry,THREE.IcosahedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.IcosahedronGeometry(parameters.radius,parameters.detail)},THREE.OctahedronGeometry=function(radius,detail){var vertices=[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],indices=[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2];THREE.PolyhedronGeometry.call(this,vertices,indices,radius,detail),this.type="OctahedronGeometry",this.parameters={radius:radius,detail:detail}},THREE.OctahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype),THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry,THREE.OctahedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.OctahedronGeometry(parameters.radius,parameters.detail)},THREE.TetrahedronGeometry=function(radius,detail){var vertices=[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],indices=[2,1,0,0,3,2,1,3,0,2,3,1];THREE.PolyhedronGeometry.call(this,vertices,indices,radius,detail),this.type="TetrahedronGeometry",this.parameters={radius:radius,detail:detail}},THREE.TetrahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype),THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry,THREE.TetrahedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.TetrahedronGeometry(parameters.radius,parameters.detail)},THREE.ParametricGeometry=function(func,slices,stacks){THREE.Geometry.call(this),this.type="ParametricGeometry",this.parameters={func:func,slices:slices,stacks:stacks};var i,j,p,u,v,verts=this.vertices,faces=this.faces,uvs=this.faceVertexUvs[0],sliceCount=slices+1;for(i=0;stacks>=i;i++)for(v=i/stacks,j=0;slices>=j;j++)u=j/slices,p=func(u,v),verts.push(p);var a,b,c,d,uva,uvb,uvc,uvd;for(i=0;stacks>i;i++)for(j=0;slices>j;j++)a=i*sliceCount+j,b=i*sliceCount+j+1,c=(i+1)*sliceCount+j+1,d=(i+1)*sliceCount+j,uva=new THREE.Vector2(j/slices,i/stacks),uvb=new THREE.Vector2((j+1)/slices,i/stacks),uvc=new THREE.Vector2((j+1)/slices,(i+1)/stacks),uvd=new THREE.Vector2(j/slices,(i+1)/stacks),faces.push(new THREE.Face3(a,b,d)),uvs.push([uva,uvb,uvd]),faces.push(new THREE.Face3(b,c,d)),uvs.push([uvb.clone(),uvc,uvd.clone()]);this.computeFaceNormals(),this.computeVertexNormals()},THREE.ParametricGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry,THREE.WireframeGeometry=function(geometry){function sortFunction(a,b){return a-b}THREE.BufferGeometry.call(this);var edge=[0,0],hash={},keys=["a","b","c"];if(geometry instanceof THREE.Geometry){for(var vertices=geometry.vertices,faces=geometry.faces,numEdges=0,edges=new Uint32Array(6*faces.length),i=0,l=faces.length;l>i;i++)for(var face=faces[i],j=0;3>j;j++){edge[0]=face[keys[j]],edge[1]=face[keys[(j+1)%3]],edge.sort(sortFunction);var key=edge.toString();void 0===hash[key]&&(edges[2*numEdges]=edge[0],edges[2*numEdges+1]=edge[1],hash[key]=!0,numEdges++)}for(var coords=new Float32Array(2*numEdges*3),i=0,l=numEdges;l>i;i++)for(var j=0;2>j;j++){var vertex=vertices[edges[2*i+j]],index=6*i+3*j;coords[index+0]=vertex.x,coords[index+1]=vertex.y,coords[index+2]=vertex.z}this.addAttribute("position",new THREE.BufferAttribute(coords,3))}else if(geometry instanceof THREE.BufferGeometry)if(null!==geometry.index){var indices=geometry.index.array,vertices=geometry.attributes.position,drawcalls=geometry.drawcalls,numEdges=0;0===drawcalls.length&&geometry.addGroup(0,indices.length);for(var edges=new Uint32Array(2*indices.length),o=0,ol=drawcalls.length;ol>o;++o)for(var drawcall=drawcalls[o],start=drawcall.start,count=drawcall.count,i=start,il=start+count;il>i;i+=3)for(var j=0;3>j;j++){edge[0]=indices[i+j],edge[1]=indices[i+(j+1)%3],edge.sort(sortFunction);var key=edge.toString();void 0===hash[key]&&(edges[2*numEdges]=edge[0],edges[2*numEdges+1]=edge[1],hash[key]=!0,numEdges++)}for(var coords=new Float32Array(2*numEdges*3),i=0,l=numEdges;l>i;i++)for(var j=0;2>j;j++){var index=6*i+3*j,index2=edges[2*i+j];coords[index+0]=vertices.getX(index2),coords[index+1]=vertices.getY(index2),coords[index+2]=vertices.getZ(index2)}this.addAttribute("position",new THREE.BufferAttribute(coords,3))}else{for(var vertices=geometry.attributes.position.array,numEdges=vertices.length/3,numTris=numEdges/3,coords=new Float32Array(2*numEdges*3),i=0,l=numTris;l>i;i++)for(var j=0;3>j;j++){var index=18*i+6*j,index1=9*i+3*j;coords[index+0]=vertices[index1],coords[index+1]=vertices[index1+1],coords[index+2]=vertices[index1+2];var index2=9*i+3*((j+1)%3);coords[index+3]=vertices[index2],coords[index+4]=vertices[index2+1],coords[index+5]=vertices[index2+2]}this.addAttribute("position",new THREE.BufferAttribute(coords,3))}},THREE.WireframeGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.WireframeGeometry.prototype.constructor=THREE.WireframeGeometry,THREE.AxisHelper=function(size){size=size||1;var vertices=new Float32Array([0,0,0,size,0,0,0,0,0,0,size,0,0,0,0,0,0,size]),colors=new Float32Array([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1]),geometry=new THREE.BufferGeometry;geometry.addAttribute("position",new THREE.BufferAttribute(vertices,3)),geometry.addAttribute("color",new THREE.BufferAttribute(colors,3));var material=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});THREE.LineSegments.call(this,geometry,material)},THREE.AxisHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.AxisHelper.prototype.constructor=THREE.AxisHelper,THREE.ArrowHelper=function(){var lineGeometry=new THREE.Geometry;lineGeometry.vertices.push(new THREE.Vector3(0,0,0),new THREE.Vector3(0,1,0));var coneGeometry=new THREE.CylinderGeometry(0,.5,1,5,1);return coneGeometry.translate(0,-.5,0),function(dir,origin,length,color,headLength,headWidth){THREE.Object3D.call(this),void 0===color&&(color=16776960),void 0===length&&(length=1),void 0===headLength&&(headLength=.2*length),void 0===headWidth&&(headWidth=.2*headLength),this.position.copy(origin),length>headLength&&(this.line=new THREE.Line(lineGeometry,new THREE.LineBasicMaterial({color:color})),this.line.matrixAutoUpdate=!1,this.add(this.line)),this.cone=new THREE.Mesh(coneGeometry,new THREE.MeshBasicMaterial({color:color})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(dir),this.setLength(length,headLength,headWidth)}}(),THREE.ArrowHelper.prototype=Object.create(THREE.Object3D.prototype),THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper,THREE.ArrowHelper.prototype.setDirection=function(){var radians,axis=new THREE.Vector3;return function(dir){dir.y>.99999?this.quaternion.set(0,0,0,1):dir.y<-.99999?this.quaternion.set(1,0,0,0):(axis.set(dir.z,0,-dir.x).normalize(),radians=Math.acos(dir.y),this.quaternion.setFromAxisAngle(axis,radians))}}(),THREE.ArrowHelper.prototype.setLength=function(length,headLength,headWidth){void 0===headLength&&(headLength=.2*length),void 0===headWidth&&(headWidth=.2*headLength),length>headLength&&(this.line.scale.set(1,length-headLength,1),this.line.updateMatrix()),this.cone.scale.set(headWidth,headLength,headWidth),this.cone.position.y=length,this.cone.updateMatrix()},THREE.ArrowHelper.prototype.setColor=function(color){void 0!==this.line&&this.line.material.color.set(color),this.cone.material.color.set(color)},THREE.BoxHelper=function(object){var indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),positions=new Float32Array(24),geometry=new THREE.BufferGeometry;geometry.setIndex(new THREE.BufferAttribute(indices,1)),geometry.addAttribute("position",new THREE.BufferAttribute(positions,3)),THREE.LineSegments.call(this,geometry,new THREE.LineBasicMaterial({color:16776960})),void 0!==object&&this.update(object)},THREE.BoxHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.BoxHelper.prototype.constructor=THREE.BoxHelper, +THREE.BoxHelper.prototype.update=function(){var box=new THREE.Box3;return function(object){if(box.setFromObject(object),!box.empty()){var min=box.min,max=box.max,position=this.geometry.attributes.position,array=position.array;array[0]=max.x,array[1]=max.y,array[2]=max.z,array[3]=min.x,array[4]=max.y,array[5]=max.z,array[6]=min.x,array[7]=min.y,array[8]=max.z,array[9]=max.x,array[10]=min.y,array[11]=max.z,array[12]=max.x,array[13]=max.y,array[14]=min.z,array[15]=min.x,array[16]=max.y,array[17]=min.z,array[18]=min.x,array[19]=min.y,array[20]=min.z,array[21]=max.x,array[22]=min.y,array[23]=min.z,position.needsUpdate=!0,this.geometry.computeBoundingSphere()}}}(),THREE.BoundingBoxHelper=function(object,hex){var color=void 0!==hex?hex:8947848;this.object=object,this.box=new THREE.Box3,THREE.Mesh.call(this,new THREE.BoxGeometry(1,1,1),new THREE.MeshBasicMaterial({color:color,wireframe:!0}))},THREE.BoundingBoxHelper.prototype=Object.create(THREE.Mesh.prototype),THREE.BoundingBoxHelper.prototype.constructor=THREE.BoundingBoxHelper,THREE.BoundingBoxHelper.prototype.update=function(){this.box.setFromObject(this.object),this.box.size(this.scale),this.box.center(this.position)},THREE.CameraHelper=function(camera){function addLine(a,b,hex){addPoint(a,hex),addPoint(b,hex)}function addPoint(id,hex){geometry.vertices.push(new THREE.Vector3),geometry.colors.push(new THREE.Color(hex)),void 0===pointMap[id]&&(pointMap[id]=[]),pointMap[id].push(geometry.vertices.length-1)}var geometry=new THREE.Geometry,material=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors}),pointMap={},hexFrustum=16755200,hexCone=16711680,hexUp=43775,hexTarget=16777215,hexCross=3355443;addLine("n1","n2",hexFrustum),addLine("n2","n4",hexFrustum),addLine("n4","n3",hexFrustum),addLine("n3","n1",hexFrustum),addLine("f1","f2",hexFrustum),addLine("f2","f4",hexFrustum),addLine("f4","f3",hexFrustum),addLine("f3","f1",hexFrustum),addLine("n1","f1",hexFrustum),addLine("n2","f2",hexFrustum),addLine("n3","f3",hexFrustum),addLine("n4","f4",hexFrustum),addLine("p","n1",hexCone),addLine("p","n2",hexCone),addLine("p","n3",hexCone),addLine("p","n4",hexCone),addLine("u1","u2",hexUp),addLine("u2","u3",hexUp),addLine("u3","u1",hexUp),addLine("c","t",hexTarget),addLine("p","c",hexCross),addLine("cn1","cn2",hexCross),addLine("cn3","cn4",hexCross),addLine("cf1","cf2",hexCross),addLine("cf3","cf4",hexCross),THREE.LineSegments.call(this,geometry,material),this.camera=camera,this.camera.updateProjectionMatrix(),this.matrix=camera.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=pointMap,this.update()},THREE.CameraHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.CameraHelper.prototype.constructor=THREE.CameraHelper,THREE.CameraHelper.prototype.update=function(){function setPoint(point,x,y,z){vector.set(x,y,z).unproject(camera);var points=pointMap[point];if(void 0!==points)for(var i=0,il=points.length;il>i;i++)geometry.vertices[points[i]].copy(vector)}var geometry,pointMap,vector=new THREE.Vector3,camera=new THREE.Camera;return function(){geometry=this.geometry,pointMap=this.pointMap;var w=1,h=1;camera.projectionMatrix.copy(this.camera.projectionMatrix),setPoint("c",0,0,-1),setPoint("t",0,0,1),setPoint("n1",-w,-h,-1),setPoint("n2",w,-h,-1),setPoint("n3",-w,h,-1),setPoint("n4",w,h,-1),setPoint("f1",-w,-h,1),setPoint("f2",w,-h,1),setPoint("f3",-w,h,1),setPoint("f4",w,h,1),setPoint("u1",.7*w,1.1*h,-1),setPoint("u2",.7*-w,1.1*h,-1),setPoint("u3",0,2*h,-1),setPoint("cf1",-w,0,1),setPoint("cf2",w,0,1),setPoint("cf3",0,-h,1),setPoint("cf4",0,h,1),setPoint("cn1",-w,0,-1),setPoint("cn2",w,0,-1),setPoint("cn3",0,-h,-1),setPoint("cn4",0,h,-1),geometry.verticesNeedUpdate=!0}}(),THREE.DirectionalLightHelper=function(light,size){THREE.Object3D.call(this),this.light=light,this.light.updateMatrixWorld(),this.matrix=light.matrixWorld,this.matrixAutoUpdate=!1,size=size||1;var geometry=new THREE.Geometry;geometry.vertices.push(new THREE.Vector3(-size,size,0),new THREE.Vector3(size,size,0),new THREE.Vector3(size,-size,0),new THREE.Vector3(-size,-size,0),new THREE.Vector3(-size,size,0));var material=new THREE.LineBasicMaterial({fog:!1});material.color.copy(this.light.color).multiplyScalar(this.light.intensity),this.lightPlane=new THREE.Line(geometry,material),this.add(this.lightPlane),geometry=new THREE.Geometry,geometry.vertices.push(new THREE.Vector3,new THREE.Vector3),material=new THREE.LineBasicMaterial({fog:!1}),material.color.copy(this.light.color).multiplyScalar(this.light.intensity),this.targetLine=new THREE.Line(geometry,material),this.add(this.targetLine),this.update()},THREE.DirectionalLightHelper.prototype=Object.create(THREE.Object3D.prototype),THREE.DirectionalLightHelper.prototype.constructor=THREE.DirectionalLightHelper,THREE.DirectionalLightHelper.prototype.dispose=function(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()},THREE.DirectionalLightHelper.prototype.update=function(){var v1=new THREE.Vector3,v2=new THREE.Vector3,v3=new THREE.Vector3;return function(){v1.setFromMatrixPosition(this.light.matrixWorld),v2.setFromMatrixPosition(this.light.target.matrixWorld),v3.subVectors(v2,v1),this.lightPlane.lookAt(v3),this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity),this.targetLine.geometry.vertices[1].copy(v3),this.targetLine.geometry.verticesNeedUpdate=!0,this.targetLine.material.color.copy(this.lightPlane.material.color)}}(),THREE.EdgesHelper=function(object,hex,thresholdAngle){var color=void 0!==hex?hex:16777215;THREE.LineSegments.call(this,new THREE.EdgesGeometry(object.geometry,thresholdAngle),new THREE.LineBasicMaterial({color:color})),this.matrix=object.matrixWorld,this.matrixAutoUpdate=!1},THREE.EdgesHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.EdgesHelper.prototype.constructor=THREE.EdgesHelper,THREE.FaceNormalsHelper=function(object,size,hex,linewidth){this.object=object,this.size=void 0!==size?size:1;var color=void 0!==hex?hex:16776960,width=void 0!==linewidth?linewidth:1,nNormals=0,objGeometry=this.object.geometry;objGeometry instanceof THREE.Geometry?nNormals=objGeometry.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");var geometry=new THREE.BufferGeometry,positions=new THREE.Float32Attribute(2*nNormals*3,3);geometry.addAttribute("position",positions),THREE.LineSegments.call(this,geometry,new THREE.LineBasicMaterial({color:color,linewidth:width})),this.matrixAutoUpdate=!1,this.update()},THREE.FaceNormalsHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.FaceNormalsHelper.prototype.constructor=THREE.FaceNormalsHelper,THREE.FaceNormalsHelper.prototype.update=function(){var v1=new THREE.Vector3,v2=new THREE.Vector3,normalMatrix=new THREE.Matrix3;return function(){this.object.updateMatrixWorld(!0),normalMatrix.getNormalMatrix(this.object.matrixWorld);for(var matrixWorld=this.object.matrixWorld,position=this.geometry.attributes.position,objGeometry=this.object.geometry,vertices=objGeometry.vertices,faces=objGeometry.faces,idx=0,i=0,l=faces.length;l>i;i++){var face=faces[i],normal=face.normal;v1.copy(vertices[face.a]).add(vertices[face.b]).add(vertices[face.c]).divideScalar(3).applyMatrix4(matrixWorld),v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1),position.setXYZ(idx,v1.x,v1.y,v1.z),idx+=1,position.setXYZ(idx,v2.x,v2.y,v2.z),idx+=1}return position.needsUpdate=!0,this}}(),THREE.GridHelper=function(size,step){var geometry=new THREE.Geometry,material=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});this.color1=new THREE.Color(4473924),this.color2=new THREE.Color(8947848);for(var i=-size;size>=i;i+=step){geometry.vertices.push(new THREE.Vector3(-size,0,i),new THREE.Vector3(size,0,i),new THREE.Vector3(i,0,-size),new THREE.Vector3(i,0,size));var color=0===i?this.color1:this.color2;geometry.colors.push(color,color,color,color)}THREE.LineSegments.call(this,geometry,material)},THREE.GridHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.GridHelper.prototype.constructor=THREE.GridHelper,THREE.GridHelper.prototype.setColors=function(colorCenterLine,colorGrid){this.color1.set(colorCenterLine),this.color2.set(colorGrid),this.geometry.colorsNeedUpdate=!0},THREE.HemisphereLightHelper=function(light,sphereSize){THREE.Object3D.call(this),this.light=light,this.light.updateMatrixWorld(),this.matrix=light.matrixWorld,this.matrixAutoUpdate=!1,this.colors=[new THREE.Color,new THREE.Color];var geometry=new THREE.SphereGeometry(sphereSize,4,2);geometry.rotateX(-Math.PI/2);for(var i=0,il=8;il>i;i++)geometry.faces[i].color=this.colors[4>i?0:1];var material=new THREE.MeshBasicMaterial({vertexColors:THREE.FaceColors,wireframe:!0});this.lightSphere=new THREE.Mesh(geometry,material),this.add(this.lightSphere),this.update()},THREE.HemisphereLightHelper.prototype=Object.create(THREE.Object3D.prototype),THREE.HemisphereLightHelper.prototype.constructor=THREE.HemisphereLightHelper,THREE.HemisphereLightHelper.prototype.dispose=function(){this.lightSphere.geometry.dispose(),this.lightSphere.material.dispose()},THREE.HemisphereLightHelper.prototype.update=function(){var vector=new THREE.Vector3;return function(){this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity),this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity),this.lightSphere.lookAt(vector.setFromMatrixPosition(this.light.matrixWorld).negate()),this.lightSphere.geometry.colorsNeedUpdate=!0}}(),THREE.PointLightHelper=function(light,sphereSize){this.light=light,this.light.updateMatrixWorld();var geometry=new THREE.SphereGeometry(sphereSize,4,2),material=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});material.color.copy(this.light.color).multiplyScalar(this.light.intensity),THREE.Mesh.call(this,geometry,material),this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1},THREE.PointLightHelper.prototype=Object.create(THREE.Mesh.prototype),THREE.PointLightHelper.prototype.constructor=THREE.PointLightHelper,THREE.PointLightHelper.prototype.dispose=function(){this.geometry.dispose(),this.material.dispose()},THREE.PointLightHelper.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)},THREE.SkeletonHelper=function(object){this.bones=this.getBoneList(object);for(var geometry=new THREE.Geometry,i=0;ii;i++)for(var face=faces[i],j=0,jl=face.vertexNormals.length;jl>j;j++){var vertex=vertices[face[keys[j]]],normal=face.vertexNormals[j];v1.copy(vertex).applyMatrix4(matrixWorld),v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1),position.setXYZ(idx,v1.x,v1.y,v1.z),idx+=1,position.setXYZ(idx,v2.x,v2.y,v2.z),idx+=1}else if(objGeometry instanceof THREE.BufferGeometry)for(var objPos=objGeometry.attributes.position,objNorm=objGeometry.attributes.normal,idx=0,j=0,jl=objPos.count;jl>j;j++)v1.set(objPos.getX(j),objPos.getY(j),objPos.getZ(j)).applyMatrix4(matrixWorld),v2.set(objNorm.getX(j),objNorm.getY(j),objNorm.getZ(j)),v2.applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1),position.setXYZ(idx,v1.x,v1.y,v1.z),idx+=1,position.setXYZ(idx,v2.x,v2.y,v2.z),idx+=1;return position.needsUpdate=!0,this}}(),THREE.WireframeHelper=function(object,hex){var color=void 0!==hex?hex:16777215;THREE.LineSegments.call(this,new THREE.WireframeGeometry(object.geometry),new THREE.LineBasicMaterial({color:color})),this.matrix=object.matrixWorld,this.matrixAutoUpdate=!1},THREE.WireframeHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.WireframeHelper.prototype.constructor=THREE.WireframeHelper,THREE.ImmediateRenderObject=function(material){THREE.Object3D.call(this),this.material=material,this.render=function(renderCallback){}},THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype),THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject,THREE.MorphBlendMesh=function(geometry,material){THREE.Mesh.call(this,geometry,material),this.animationsMap={},this.animationsList=[];var numFrames=this.geometry.morphTargets.length,name="__default",startFrame=0,endFrame=numFrames-1,fps=numFrames/1;this.createAnimation(name,startFrame,endFrame,fps),this.setAnimationWeight(name,1)},THREE.MorphBlendMesh.prototype=Object.create(THREE.Mesh.prototype),THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh,THREE.MorphBlendMesh.prototype.createAnimation=function(name,start,end,fps){var animation={start:start,end:end,length:end-start+1,fps:fps,duration:(end-start)/fps,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[name]=animation,this.animationsList.push(animation)},THREE.MorphBlendMesh.prototype.autoCreateAnimations=function(fps){for(var firstAnimation,pattern=/([a-z]+)_?(\d+)/,frameRanges={},geometry=this.geometry,i=0,il=geometry.morphTargets.length;il>i;i++){var morph=geometry.morphTargets[i],chunks=morph.name.match(pattern);if(chunks&&chunks.length>1){var name=chunks[1];frameRanges[name]||(frameRanges[name]={start:1/0,end:-(1/0)});var range=frameRanges[name];irange.end&&(range.end=i),firstAnimation||(firstAnimation=name)}}for(var name in frameRanges){var range=frameRanges[name];this.createAnimation(name,range.start,range.end,fps)}this.firstAnimation=firstAnimation},THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(name){var animation=this.animationsMap[name];animation&&(animation.direction=1,animation.directionBackwards=!1)},THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(name){var animation=this.animationsMap[name];animation&&(animation.direction=-1,animation.directionBackwards=!0)},THREE.MorphBlendMesh.prototype.setAnimationFPS=function(name,fps){var animation=this.animationsMap[name];animation&&(animation.fps=fps,animation.duration=(animation.end-animation.start)/animation.fps)},THREE.MorphBlendMesh.prototype.setAnimationDuration=function(name,duration){var animation=this.animationsMap[name];animation&&(animation.duration=duration,animation.fps=(animation.end-animation.start)/animation.duration)},THREE.MorphBlendMesh.prototype.setAnimationWeight=function(name,weight){var animation=this.animationsMap[name];animation&&(animation.weight=weight)},THREE.MorphBlendMesh.prototype.setAnimationTime=function(name,time){var animation=this.animationsMap[name];animation&&(animation.time=time)},THREE.MorphBlendMesh.prototype.getAnimationTime=function(name){var time=0,animation=this.animationsMap[name];return animation&&(time=animation.time),time},THREE.MorphBlendMesh.prototype.getAnimationDuration=function(name){var duration=-1,animation=this.animationsMap[name];return animation&&(duration=animation.duration),duration},THREE.MorphBlendMesh.prototype.playAnimation=function(name){var animation=this.animationsMap[name];animation?(animation.time=0,animation.active=!0):console.warn("THREE.MorphBlendMesh: animation["+name+"] undefined in .playAnimation()")},THREE.MorphBlendMesh.prototype.stopAnimation=function(name){var animation=this.animationsMap[name];animation&&(animation.active=!1)},THREE.MorphBlendMesh.prototype.update=function(delta){for(var i=0,il=this.animationsList.length;il>i;i++){var animation=this.animationsList[i];if(animation.active){var frameTime=animation.duration/animation.length;animation.time+=animation.direction*delta,animation.mirroredLoop?(animation.time>animation.duration||animation.time<0)&&(animation.direction*=-1,animation.time>animation.duration&&(animation.time=animation.duration,animation.directionBackwards=!0),animation.time<0&&(animation.time=0,animation.directionBackwards=!1)):(animation.time=animation.time%animation.duration,animation.time<0&&(animation.time+=animation.duration));var keyframe=animation.start+THREE.Math.clamp(Math.floor(animation.time/frameTime),0,animation.length-1),weight=animation.weight;keyframe!==animation.currentFrame&&(this.morphTargetInfluences[animation.lastFrame]=0,this.morphTargetInfluences[animation.currentFrame]=1*weight,this.morphTargetInfluences[keyframe]=0,animation.lastFrame=animation.currentFrame,animation.currentFrame=keyframe);var mix=animation.time%frameTime/frameTime;animation.directionBackwards&&(mix=1-mix),animation.currentFrame!==animation.lastFrame?(this.morphTargetInfluences[animation.currentFrame]=mix*weight,this.morphTargetInfluences[animation.lastFrame]=(1-mix)*weight):this.morphTargetInfluences[animation.currentFrame]=weight}}},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=THREE),exports.THREE=THREE):this.THREE=THREE},{}],6:[function(_dereq_,module,exports){!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof _dereq_&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof _dereq_&&_dereq_,o=0;o 0.0 && abs(vUV.x - 0.5) < .001) {","} else if (a.x < 0.0 || a.x > 1.0 || a.y < 0.0 || a.y > 1.0) {","gl_FragColor = backgroundColor;","} else {","gl_FragColor = texture2D(texture, vec2(a.x * 0.5 + (vUV.x < 0.5 ? 0.0 : 0.5), a.y));","}","}"].join("\n")};module.exports=BarrelDistortionFragment},{}],6:[function(_dereq_,module,exports){function Distortion(coefficients){this.coefficients=coefficients}Distortion.prototype.distortInverse=function(radius){for(var r0=radius/.9,r1=.9*radius,dr0=radius-this.distort(r0);Math.abs(r1-r0)>1e-4;){var dr1=radius-this.distort(r1),r2=r1-dr1*((r1-r0)/(dr1-dr0));r0=r1,r1=r2,dr0=dr1}return r1},Distortion.prototype.distort=function(radius){return radius*this.distortionFactor_(radius)},Distortion.prototype.distortionFactor_=function(radius){for(var result=1,rFactor=1,rSquared=radius*radius,i=0;i=200&&xhr.status<=299?(console.log("Successfully loaded online DPDB."),obj.dpdb=JSON.parse(xhr.response),obj.recalculateDeviceParams_()):console.error("Error loading online DPDB!")}),xhr.send()}}function DeviceParams(params){this.xdpi=params.xdpi,this.ydpi=params.ydpi,this.bevelMm=params.bevelMm}var DPDB_CACHE=_dereq_("./dpdb-cache.js"),Util=_dereq_("./util.js"),ONLINE_DPDB_URL="https://storage.googleapis.com/cardboard-dpdb/dpdb.json";Dpdb.prototype.getDeviceParams=function(){return this.deviceParams},Dpdb.prototype.recalculateDeviceParams_=function(){console.log("Recalculating device params.");var newDeviceParams=this.calcDeviceParams_();console.log("New device parameters:"),console.log(newDeviceParams),newDeviceParams?(this.deviceParams=newDeviceParams,this.onDeviceParamsUpdated&&this.onDeviceParamsUpdated(this.deviceParams)):console.warn("Failed to recalculate device parameters.")},Dpdb.prototype.calcDeviceParams_=function(){var db=this.dpdb;if(!db)return console.error("DPDB not available."),null;if(1!=db.format)return console.error("DPDB has unexpected format version."),null;if(!db.devices||!db.devices.length)return console.error("DPDB does not have a devices section."),null;var userAgent=navigator.userAgent||navigator.vendor||window.opera,width=Util.getScreenWidth(),height=Util.getScreenHeight();if(console.log("User agent: "+userAgent),console.log("Pixel width: "+width),console.log("Pixel height: "+height),!db.devices)return console.error("DPDB has no devices section."),null;for(var i=0;i %s",this.mode,mode),this.mode=mode,this.button.setMode(mode,this.isVRCompatible),this.mode==Modes.VR&&Util.isLandscapeMode()&&Util.isMobile()?this.rotateInstructions.showTemporarily(3e3):this.updateRotateInstructions_(),this.viewerSelector.hide(),this.emit("modechange",mode,oldMode),this.isTouchPannerEnabled&&(this.mode==Modes.VR?WebVRConfig.TOUCH_PANNER_DISABLED=!0:WebVRConfig.TOUCH_PANNER_DISABLED=!1),void(this.mode==Modes.VR&&this.setHMDVRDeviceParams_(this.getViewer())))},WebVRManager.prototype.onFSClick_=function(){switch(this.mode){case Modes.NORMAL:if(Util.isIOS()&&Util.isIFrame()){var url=window.location.href;return url=Util.appendQueryParameter(url,"no_fullscreen","true"),url=Util.appendQueryParameter(url,"start_mode",Modes.MAGIC_WINDOW),void(top.location.href=url)}this.normalToMagicWindow_(),this.setMode_(Modes.MAGIC_WINDOW);break;case Modes.MAGIC_WINDOW:this.isFullscreenDisabled?window.history.back():(this.anyModeToNormal_(),this.setMode_(Modes.NORMAL))}},WebVRManager.prototype.onVRClick_=function(){if(this.mode==Modes.NORMAL&&Util.isIOS()&&Util.isIFrame()){var url=window.location.href;return url=Util.appendQueryParameter(url,"no_fullscreen","true"),url=Util.appendQueryParameter(url,"start_mode",Modes.VR),void(top.location.href=url)}this.anyModeToVR_(),this.setMode_(Modes.VR)},WebVRManager.prototype.onBackClick_=function(){this.isFullscreenDisabled?window.history.back():(this.anyModeToNormal_(),this.setMode_(Modes.NORMAL))},WebVRManager.prototype.onSettingsClick_=function(){this.viewerSelector.show()},WebVRManager.prototype.normalToMagicWindow_=function(){this.requestFullscreen_(),this.wakelock.request()},WebVRManager.prototype.anyModeToVR_=function(){this.requestFullscreen_(),this.wakelock.request(),this.distorter.patch()},WebVRManager.prototype.vrToMagicWindow_=function(){this.distorter.unpatch(),this.resize_()},WebVRManager.prototype.anyModeToNormal_=function(){this.exitFullscreen_(),this.releasePointerLock_(),this.wakelock.release(),this.distorter.unpatch(),this.resize_()},WebVRManager.prototype.resizeIfNeeded_=function(camera){var size=this.renderer.getSize();size.width==window.innerWidth&&size.height==window.innerHeight||this.resize_()},WebVRManager.prototype.resize_=function(){this.effect.setSize(window.innerWidth,window.innerHeight),this.camera&&(this.camera.aspect=window.innerWidth/window.innerHeight,this.camera.updateProjectionMatrix())},WebVRManager.prototype.onOrientationChange_=function(e){this.updateRotateInstructions_(),this.viewerSelector.hide()},WebVRManager.prototype.updateRotateInstructions_=function(){this.rotateInstructions.disableShowTemporarily(),this.mode==Modes.VR&&!Util.isLandscapeMode()&&Util.isMobile()?this.rotateInstructions.show():this.rotateInstructions.hide()},WebVRManager.prototype.onFullscreenChange_=function(e){null!==document.webkitFullscreenElement&&null!==document.mozFullScreenElement||(this.anyModeToNormal_(),this.setMode_(Modes.NORMAL))},WebVRManager.prototype.requestPointerLock_=function(){var canvas=this.renderer.domElement;canvas.requestPointerLock=canvas.requestPointerLock||canvas.mozRequestPointerLock||canvas.webkitRequestPointerLock,canvas.requestPointerLock&&canvas.requestPointerLock()},WebVRManager.prototype.releasePointerLock_=function(){document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock,document.exitPointerLock&&document.exitPointerLock()},WebVRManager.prototype.requestOrientationLock_=function(){screen.orientation&&Util.isMobile()&&screen.orientation.lock("landscape")},WebVRManager.prototype.releaseOrientationLock_=function(){screen.orientation&&screen.orientation.unlock()},WebVRManager.prototype.requestFullscreen_=function(){var canvas=document.body;canvas.requestFullscreen?canvas.requestFullscreen():canvas.mozRequestFullScreen?canvas.mozRequestFullScreen({vrDisplay:this.hmd}):canvas.webkitRequestFullscreen?canvas.webkitRequestFullscreen({vrDisplay:this.hmd}):canvas.msRequestFullscreen&&canvas.msRequestFullscreen({vrDisplay:this.hmd})},WebVRManager.prototype.exitFullscreen_=function(){document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.msExitFullscreen&&document.msExitFullscreen()},WebVRManager.prototype.onViewerChanged_=function(viewer){this.deviceInfo.setViewer(viewer),this.distorter.updateDeviceInfo(this.deviceInfo),this.setHMDVRDeviceParams_(viewer),this.emit("viewerchange",viewer)},WebVRManager.prototype.setHMDVRDeviceParams_=function(viewer){this.getDeviceByType_(HMDVRDevice).then(function(hmd){hmd&&(hmd.setFieldOfView&&hmd.setFieldOfView(this.deviceInfo.getFieldOfViewLeftEye(this.isUndistorted),this.deviceInfo.getFieldOfViewRightEye(this.isUndistorted)),hmd.setInterpupillaryDistance&&hmd.setInterpupillaryDistance(viewer.interLensDistance))}.bind(this))},WebVRManager.prototype.onDeviceParamsUpdated_=function(newParams){console.log("DPDB reported that device params were updated."),this.deviceInfo.updateDeviceParams(newParams),this.distorter.updateDeviceInfo(this.deviceInfo)},module.exports=WebVRManager},{"./button-manager.js":2,"./cardboard-distorter.js":3,"./device-info.js":4,"./dpdb.js":8,"./emitter.js":9,"./modes.js":11,"./rotate-instructions.js":12,"./util.js":13,"./viewer-selector.js":14,"./wakelock.js":15}]},{},[10])},{}],7:[function(_dereq_,module,exports){!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof _dereq_&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof _dereq_&&_dereq_,o=0;oUtil.MAX_TIMESTEP?(console.warn("Invalid timestamps detected. Time step between successive gyroscope sensor samples is very small or not monotonic"),void(this.previousTimestampS=timestampS)):(this.accelerometer.set(-accGravity.x,-accGravity.y,-accGravity.z), +this.gyroscope.set(rotRate.alpha,rotRate.beta,rotRate.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,timestampS),this.filter.addGyroMeasurement(this.gyroscope,timestampS),void(this.previousTimestampS=timestampS))},FusionPositionSensorVRDevice.prototype.onScreenOrientationChange_=function(screenOrientation){this.setScreenTransform_()},FusionPositionSensorVRDevice.prototype.setScreenTransform_=function(){switch(this.worldToScreenQ.set(0,0,0,1),window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new THREE.Vector3(0,0,1),-Math.PI/2);break;case-90:this.worldToScreenQ.setFromAxisAngle(new THREE.Vector3(0,0,1),Math.PI/2);break;case 180:}},module.exports=FusionPositionSensorVRDevice},{"./base.js":1,"./complementary-filter.js":3,"./pose-predictor.js":7,"./three-math.js":9,"./touch-panner.js":10,"./util.js":11}],5:[function(_dereq_,module,exports){var WebVRPolyfill=_dereq_("./webvr-polyfill.js");window.WebVRConfig=window.WebVRConfig||{},new WebVRPolyfill},{"./webvr-polyfill.js":12}],6:[function(_dereq_,module,exports){function MouseKeyboardPositionSensorVRDevice(){this.deviceId="webvr-polyfill:mouse-keyboard",this.deviceName="VR Position Device (webvr-polyfill:mouse-keyboard)",window.addEventListener("keydown",this.onKeyDown_.bind(this)),window.addEventListener("mousemove",this.onMouseMove_.bind(this)),window.addEventListener("mousedown",this.onMouseDown_.bind(this)),window.addEventListener("mouseup",this.onMouseUp_.bind(this)),this.phi=0,this.theta=0,this.targetAngle=null,this.euler=new THREE.Euler,this.orientation=new THREE.Quaternion,this.rotateStart=new THREE.Vector2,this.rotateEnd=new THREE.Vector2,this.rotateDelta=new THREE.Vector2}var PositionSensorVRDevice=_dereq_("./base.js").PositionSensorVRDevice,THREE=_dereq_("./three-math.js"),Util=_dereq_("./util.js"),KEY_SPEED=.15,KEY_ANIMATION_DURATION=80,MOUSE_SPEED_X=.5,MOUSE_SPEED_Y=.3;MouseKeyboardPositionSensorVRDevice.prototype=new PositionSensorVRDevice,MouseKeyboardPositionSensorVRDevice.prototype.getState=function(){return this.euler.set(this.phi,this.theta,0,"YXZ"),this.orientation.setFromEuler(this.euler),{hasOrientation:!0,orientation:this.orientation,hasPosition:!1,position:null}},MouseKeyboardPositionSensorVRDevice.prototype.onKeyDown_=function(e){38==e.keyCode?this.animatePhi_(this.phi+KEY_SPEED):39==e.keyCode?this.animateTheta_(this.theta-KEY_SPEED):40==e.keyCode?this.animatePhi_(this.phi-KEY_SPEED):37==e.keyCode&&this.animateTheta_(this.theta+KEY_SPEED)},MouseKeyboardPositionSensorVRDevice.prototype.animateTheta_=function(targetAngle){this.animateKeyTransitions_("theta",targetAngle)},MouseKeyboardPositionSensorVRDevice.prototype.animatePhi_=function(targetAngle){targetAngle=Util.clamp(targetAngle,-Math.PI/2,Math.PI/2),this.animateKeyTransitions_("phi",targetAngle)},MouseKeyboardPositionSensorVRDevice.prototype.animateKeyTransitions_=function(angleName,targetAngle){this.angleAnimation&&clearInterval(this.angleAnimation);var startAngle=this[angleName],startTime=new Date;this.angleAnimation=setInterval(function(){var elapsed=new Date-startTime;if(elapsed>=KEY_ANIMATION_DURATION)return this[angleName]=targetAngle,void clearInterval(this.angleAnimation);var percent=elapsed/KEY_ANIMATION_DURATION;this[angleName]=startAngle+(targetAngle-startAngle)*percent}.bind(this),1e3/60)},MouseKeyboardPositionSensorVRDevice.prototype.onMouseDown_=function(e){this.rotateStart.set(e.clientX,e.clientY),this.isDragging=!0},MouseKeyboardPositionSensorVRDevice.prototype.onMouseMove_=function(e){if(this.isDragging||this.isPointerLocked_()){if(this.isPointerLocked_()){var movementX=e.movementX||e.mozMovementX||0,movementY=e.movementY||e.mozMovementY||0;this.rotateEnd.set(this.rotateStart.x-movementX,this.rotateStart.y-movementY)}else this.rotateEnd.set(e.clientX,e.clientY);this.rotateDelta.subVectors(this.rotateEnd,this.rotateStart),this.rotateStart.copy(this.rotateEnd);var element=document.body;this.phi+=2*Math.PI*this.rotateDelta.y/element.clientHeight*MOUSE_SPEED_Y,this.theta+=2*Math.PI*this.rotateDelta.x/element.clientWidth*MOUSE_SPEED_X,this.phi=Util.clamp(this.phi,-Math.PI/2,Math.PI/2)}},MouseKeyboardPositionSensorVRDevice.prototype.onMouseUp_=function(e){this.isDragging=!1},MouseKeyboardPositionSensorVRDevice.prototype.isPointerLocked_=function(){var el=document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement;return void 0!==el},MouseKeyboardPositionSensorVRDevice.prototype.resetSensor=function(){console.error("Not implemented yet.")},module.exports=MouseKeyboardPositionSensorVRDevice},{"./base.js":1,"./three-math.js":9,"./util.js":11}],7:[function(_dereq_,module,exports){function PosePredictor(predictionTimeS){this.predictionTimeS=predictionTimeS,this.previousQ=new THREE.Quaternion,this.previousTimestampS=null,this.deltaQ=new THREE.Quaternion,this.outQ=new THREE.Quaternion}var THREE=_dereq_("./three-math.js"),DEBUG=!1;PosePredictor.prototype.getPrediction=function(currentQ,gyro,timestampS){if(!this.previousTimestampS)return this.previousQ.copy(currentQ),this.previousTimestampS=timestampS,currentQ;var axis=new THREE.Vector3;axis.copy(gyro),axis.normalize();var angularSpeed=gyro.length();if(angularSpeed0?(s=.5/Math.sqrt(trace+1),this._w=.25/s,this._x=(m32-m23)*s,this._y=(m13-m31)*s,this._z=(m21-m12)*s):m11>m22&&m11>m33?(s=2*Math.sqrt(1+m11-m22-m33),this._w=(m32-m23)/s,this._x=.25*s,this._y=(m12+m21)/s,this._z=(m13+m31)/s):m22>m33?(s=2*Math.sqrt(1+m22-m11-m33),this._w=(m13-m31)/s,this._x=(m12+m21)/s,this._y=.25*s,this._z=(m23+m32)/s):(s=2*Math.sqrt(1+m33-m11-m22),this._w=(m21-m12)/s,this._x=(m13+m31)/s,this._y=(m23+m32)/s,this._z=.25*s),this.onChangeCallback(),this},setFromUnitVectors:function(){var v1,r,EPS=1e-6;return function(vFrom,vTo){return void 0===v1&&(v1=new THREE.Vector3),r=vFrom.dot(vTo)+1,EPS>r?(r=0,Math.abs(vFrom.x)>Math.abs(vFrom.z)?v1.set(-vFrom.y,vFrom.x,0):v1.set(0,-vFrom.z,vFrom.y)):v1.crossVectors(vFrom,vTo),this._x=v1.x,this._y=v1.y,this._z=v1.z,this._w=r,this.normalize(),this}}(),inverse:function(){return this.conjugate().normalize(),this},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this.onChangeCallback(),this},dot:function(v){return this._x*v._x+this._y*v._y+this._z*v._z+this._w*v._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var l=this.length();return 0===l?(this._x=0,this._y=0,this._z=0,this._w=1):(l=1/l,this._x=this._x*l,this._y=this._y*l,this._z=this._z*l,this._w=this._w*l),this.onChangeCallback(),this},multiply:function(q,p){return void 0!==p?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(q,p)):this.multiplyQuaternions(this,q)},multiplyQuaternions:function(a,b){var qax=a._x,qay=a._y,qaz=a._z,qaw=a._w,qbx=b._x,qby=b._y,qbz=b._z,qbw=b._w;return this._x=qax*qbw+qaw*qbx+qay*qbz-qaz*qby,this._y=qay*qbw+qaw*qby+qaz*qbx-qax*qbz,this._z=qaz*qbw+qaw*qbz+qax*qby-qay*qbx,this._w=qaw*qbw-qax*qbx-qay*qby-qaz*qbz,this.onChangeCallback(),this},multiplyVector3:function(vector){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),vector.applyQuaternion(this)},slerp:function(qb,t){if(0===t)return this;if(1===t)return this.copy(qb);var x=this._x,y=this._y,z=this._z,w=this._w,cosHalfTheta=w*qb._w+x*qb._x+y*qb._y+z*qb._z;if(0>cosHalfTheta?(this._w=-qb._w,this._x=-qb._x,this._y=-qb._y,this._z=-qb._z,cosHalfTheta=-cosHalfTheta):this.copy(qb),cosHalfTheta>=1)return this._w=w,this._x=x,this._y=y,this._z=z,this;var halfTheta=Math.acos(cosHalfTheta),sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001)return this._w=.5*(w+this._w),this._x=.5*(x+this._x),this._y=.5*(y+this._y),this._z=.5*(z+this._z),this;var ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta,ratioB=Math.sin(t*halfTheta)/sinHalfTheta;return this._w=w*ratioA+this._w*ratioB,this._x=x*ratioA+this._x*ratioB,this._y=y*ratioA+this._y*ratioB,this._z=z*ratioA+this._z*ratioB,this.onChangeCallback(),this},equals:function(quaternion){return quaternion._x===this._x&&quaternion._y===this._y&&quaternion._z===this._z&&quaternion._w===this._w},fromArray:function(array,offset){return void 0===offset&&(offset=0),this._x=array[offset],this._y=array[offset+1],this._z=array[offset+2],this._w=array[offset+3],this.onChangeCallback(),this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this._x,array[offset+1]=this._y,array[offset+2]=this._z,array[offset+3]=this._w,array},onChange:function(callback){return this.onChangeCallback=callback,this},onChangeCallback:function(){},clone:function(){return new THREE.Quaternion(this._x,this._y,this._z,this._w)}},THREE.Quaternion.slerp=function(qa,qb,qm,t){return qm.copy(qa).slerp(qb,t)},THREE.Vector2=function(x,y){this.x=x||0,this.y=y||0},THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(x,y){return this.x=x,this.y=y,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+index)}},copy:function(v){return this.x=v.x,this.y=v.y,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this)},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this},addScalar:function(s){return this.x+=s,this.y+=s,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this)},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this},multiply:function(v){return this.x*=v.x,this.y*=v.y,this},multiplyScalar:function(s){return this.x*=s,this.y*=s,this},divide:function(v){return this.x/=v.x,this.y/=v.y,this},divideScalar:function(scalar){if(0!==scalar){var invScalar=1/scalar;this.x*=invScalar,this.y*=invScalar}else this.x=0,this.y=0;return this},min:function(v){return this.x>v.x&&(this.x=v.x),this.y>v.y&&(this.y=v.y),this},max:function(v){return this.xmax.x&&(this.x=max.x),this.ymax.y&&(this.y=max.y),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector2,max=new THREE.Vector2),min.set(minVal,minVal),max.set(maxVal,maxVal),this.clamp(min,max)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(v){return this.x*v.x+this.y*v.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy},setLength:function(l){var oldLength=this.length();return 0!==oldLength&&l!==oldLength&&this.multiplyScalar(l/oldLength),this},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this},equals:function(v){return v.x===this.x&&v.y===this.y},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this},clone:function(){return new THREE.Vector2(this.x,this.y)}},THREE.Vector3=function(x,y,z){this.x=x||0,this.y=y||0,this.z=z||0},THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(x,y,z){return this.x=x,this.y=y,this.z=z,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setZ:function(z){return this.z=z,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+index)}},copy:function(v){return this.x=v.x,this.y=v.y,this.z=v.z,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this.z+=v.z,this)},addScalar:function(s){return this.x+=s,this.y+=s,this.z+=s,this},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this.z=a.z+b.z,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this.z-=v.z,this)},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this.z=a.z-b.z,this},multiply:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(v,w)):(this.x*=v.x,this.y*=v.y,this.z*=v.z,this)},multiplyScalar:function(scalar){return this.x*=scalar,this.y*=scalar,this.z*=scalar,this},multiplyVectors:function(a,b){return this.x=a.x*b.x,this.y=a.y*b.y,this.z=a.z*b.z,this},applyEuler:function(){var quaternion;return function(euler){return euler instanceof THREE.Euler==!1&&console.error("THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order."),void 0===quaternion&&(quaternion=new THREE.Quaternion),this.applyQuaternion(quaternion.setFromEuler(euler)),this}}(),applyAxisAngle:function(){var quaternion;return function(axis,angle){return void 0===quaternion&&(quaternion=new THREE.Quaternion),this.applyQuaternion(quaternion.setFromAxisAngle(axis,angle)),this}}(),applyMatrix3:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[3]*y+e[6]*z,this.y=e[1]*x+e[4]*y+e[7]*z,this.z=e[2]*x+e[5]*y+e[8]*z,this},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z+e[12],this.y=e[1]*x+e[5]*y+e[9]*z+e[13],this.z=e[2]*x+e[6]*y+e[10]*z+e[14],this},applyProjection:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements,d=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);return this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*d,this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*d,this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*d,this},applyQuaternion:function(q){var x=this.x,y=this.y,z=this.z,qx=q.x,qy=q.y,qz=q.z,qw=q.w,ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;return this.x=ix*qw+iw*-qx+iy*-qz-iz*-qy,this.y=iy*qw+iw*-qy+iz*-qx-ix*-qz,this.z=iz*qw+iw*-qz+ix*-qy-iy*-qx,this},project:function(){var matrix;return function(camera){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.multiplyMatrices(camera.projectionMatrix,matrix.getInverse(camera.matrixWorld)),this.applyProjection(matrix)}}(),unproject:function(){var matrix;return function(camera){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.multiplyMatrices(camera.matrixWorld,matrix.getInverse(camera.projectionMatrix)),this.applyProjection(matrix)}}(),transformDirection:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z,this.y=e[1]*x+e[5]*y+e[9]*z,this.z=e[2]*x+e[6]*y+e[10]*z,this.normalize(),this},divide:function(v){return this.x/=v.x,this.y/=v.y,this.z/=v.z,this},divideScalar:function(scalar){if(0!==scalar){var invScalar=1/scalar;this.x*=invScalar,this.y*=invScalar,this.z*=invScalar}else this.x=0,this.y=0,this.z=0;return this},min:function(v){return this.x>v.x&&(this.x=v.x),this.y>v.y&&(this.y=v.y),this.z>v.z&&(this.z=v.z),this},max:function(v){return this.xmax.x&&(this.x=max.x),this.ymax.y&&(this.y=max.y),this.zmax.z&&(this.z=max.z),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector3,max=new THREE.Vector3),min.set(minVal,minVal,minVal),max.set(maxVal,maxVal,maxVal),this.clamp(min,max)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(l){var oldLength=this.length();return 0!==oldLength&&l!==oldLength&&this.multiplyScalar(l/oldLength),this},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this.z+=(v.z-this.z)*alpha,this},cross:function(v,w){if(void 0!==w)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(v,w);var x=this.x,y=this.y,z=this.z;return this.x=y*v.z-z*v.y,this.y=z*v.x-x*v.z,this.z=x*v.y-y*v.x,this},crossVectors:function(a,b){var ax=a.x,ay=a.y,az=a.z,bx=b.x,by=b.y,bz=b.z;return this.x=ay*bz-az*by,this.y=az*bx-ax*bz,this.z=ax*by-ay*bx,this},projectOnVector:function(){var v1,dot;return function(vector){return void 0===v1&&(v1=new THREE.Vector3),v1.copy(vector).normalize(),dot=this.dot(v1),this.copy(v1).multiplyScalar(dot)}}(),projectOnPlane:function(){var v1;return function(planeNormal){return void 0===v1&&(v1=new THREE.Vector3),v1.copy(this).projectOnVector(planeNormal),this.sub(v1)}}(),reflect:function(){var v1;return function(normal){return void 0===v1&&(v1=new THREE.Vector3),this.sub(v1.copy(normal).multiplyScalar(2*this.dot(normal)))}}(),angleTo:function(v){var theta=this.dot(v)/(this.length()*v.length());return Math.acos(THREE.Math.clamp(theta,-1,1))},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz},setEulerFromRotationMatrix:function(m,order){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(q,order){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(m){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(m)},getScaleFromMatrix:function(m){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(m)},getColumnFromMatrix:function(index,matrix){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(index,matrix)},setFromMatrixPosition:function(m){return this.x=m.elements[12],this.y=m.elements[13],this.z=m.elements[14],this},setFromMatrixScale:function(m){var sx=this.set(m.elements[0],m.elements[1],m.elements[2]).length(),sy=this.set(m.elements[4],m.elements[5],m.elements[6]).length(),sz=this.set(m.elements[8],m.elements[9],m.elements[10]).length();return this.x=sx,this.y=sy,this.z=sz,this},setFromMatrixColumn:function(index,matrix){var offset=4*index,me=matrix.elements;return this.x=me[offset],this.y=me[offset+1],this.z=me[offset+2],this},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this.z=array[offset+2],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array[offset+2]=this.z,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this.z=attribute.array[index+2],this},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}},THREE.Euler=function(x,y,z,order){this._x=x||0,this._y=y||0,this._z=z||0,this._order=order||THREE.Euler.DefaultOrder},THREE.Euler.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],THREE.Euler.DefaultOrder="XYZ",THREE.Euler.prototype={constructor:THREE.Euler,_x:0,_y:0,_z:0,_order:THREE.Euler.DefaultOrder,get x(){return this._x},set x(value){this._x=value,this.onChangeCallback()},get y(){return this._y},set y(value){this._y=value,this.onChangeCallback()},get z(){return this._z},set z(value){this._z=value,this.onChangeCallback()},get order(){return this._order},set order(value){this._order=value,this.onChangeCallback()},set:function(x,y,z,order){return this._x=x,this._y=y,this._z=z,this._order=order||this._order,this.onChangeCallback(),this},copy:function(euler){return this._x=euler._x,this._y=euler._y,this._z=euler._z,this._order=euler._order,this.onChangeCallback(),this},setFromRotationMatrix:function(m,order,update){var clamp=THREE.Math.clamp,te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10];return order=order||this._order,"XYZ"===order?(this._y=Math.asin(clamp(m13,-1,1)),Math.abs(m13)<.99999?(this._x=Math.atan2(-m23,m33),this._z=Math.atan2(-m12,m11)):(this._x=Math.atan2(m32,m22),this._z=0)):"YXZ"===order?(this._x=Math.asin(-clamp(m23,-1,1)),Math.abs(m23)<.99999?(this._y=Math.atan2(m13,m33),this._z=Math.atan2(m21,m22)):(this._y=Math.atan2(-m31,m11),this._z=0)):"ZXY"===order?(this._x=Math.asin(clamp(m32,-1,1)),Math.abs(m32)<.99999?(this._y=Math.atan2(-m31,m33),this._z=Math.atan2(-m12,m22)):(this._y=0,this._z=Math.atan2(m21,m11))):"ZYX"===order?(this._y=Math.asin(-clamp(m31,-1,1)),Math.abs(m31)<.99999?(this._x=Math.atan2(m32,m33),this._z=Math.atan2(m21,m11)):(this._x=0,this._z=Math.atan2(-m12,m22))):"YZX"===order?(this._z=Math.asin(clamp(m21,-1,1)),Math.abs(m21)<.99999?(this._x=Math.atan2(-m23,m22),this._y=Math.atan2(-m31,m11)):(this._x=0,this._y=Math.atan2(m13,m33))):"XZY"===order?(this._z=Math.asin(-clamp(m12,-1,1)),Math.abs(m12)<.99999?(this._x=Math.atan2(m32,m22),this._y=Math.atan2(m13,m11)):(this._x=Math.atan2(-m23,m33),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+order),this._order=order,update!==!1&&this.onChangeCallback(),this},setFromQuaternion:function(){var matrix;return function(q,order,update){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.makeRotationFromQuaternion(q),this.setFromRotationMatrix(matrix,order,update),this}}(),setFromVector3:function(v,order){return this.set(v.x,v.y,v.z,order||this._order)},reorder:function(){var q=new THREE.Quaternion;return function(newOrder){q.setFromEuler(this),this.setFromQuaternion(q,newOrder)}}(),equals:function(euler){return euler._x===this._x&&euler._y===this._y&&euler._z===this._z&&euler._order===this._order},fromArray:function(array){return this._x=array[0],this._y=array[1],this._z=array[2],void 0!==array[3]&&(this._order=array[3]),this.onChangeCallback(),this},toArray:function(){return[this._x,this._y,this._z,this._order]},toVector3:function(optionalResult){return optionalResult?optionalResult.set(this._x,this._y,this._z):new THREE.Vector3(this._x,this._y,this._z)},onChange:function(callback){return this.onChangeCallback=callback,this},onChangeCallback:function(){},clone:function(){return new THREE.Euler(this._x,this._y,this._z,this._order)}},THREE.Math={generateUUID:function(){var r,chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),uuid=new Array(36),rnd=0;return function(){for(var i=0;36>i;i++)8==i||13==i||18==i||23==i?uuid[i]="-":14==i?uuid[i]="4":(2>=rnd&&(rnd=33554432+16777216*Math.random()|0),r=15&rnd,rnd>>=4,uuid[i]=chars[19==i?3&r|8:r]);return uuid.join("")}}(),clamp:function(x,a,b){return a>x?a:x>b?b:x},clampBottom:function(x,a){return a>x?a:x},mapLinear:function(x,a1,a2,b1,b2){return b1+(x-a1)*(b2-b1)/(a2-a1)},smoothstep:function(x,min,max){return min>=x?0:x>=max?1:(x=(x-min)/(max-min),x*x*(3-2*x))},smootherstep:function(x,min,max){return min>=x?0:x>=max?1:(x=(x-min)/(max-min),x*x*x*(x*(6*x-15)+10))},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(low,high){return Math.floor(this.randFloat(low,high))},randFloat:function(low,high){return low+Math.random()*(high-low)},randFloatSpread:function(range){return range*(.5-Math.random())},degToRad:function(){var degreeToRadiansFactor=Math.PI/180;return function(degrees){return degrees*degreeToRadiansFactor}}(),radToDeg:function(){var radianToDegreesFactor=180/Math.PI;return function(radians){return radians*radianToDegreesFactor}}(),isPowerOfTwo:function(value){return 0===(value&value-1)&&0!==value},nextPowerOfTwo:function(value){return value--,value|=value>>1,value|=value>>2,value|=value>>4,value|=value>>8,value|=value>>16,value++,value}}),module.exports=THREE},{}],10:[function(_dereq_,module,exports){function TouchPanner(){window.addEventListener("touchstart",this.onTouchStart_.bind(this)),window.addEventListener("touchmove",this.onTouchMove_.bind(this)),window.addEventListener("touchend",this.onTouchEnd_.bind(this)),this.isTouching=!1,this.rotateStart=new THREE.Vector2,this.rotateEnd=new THREE.Vector2,this.rotateDelta=new THREE.Vector2,this.theta=0,this.orientation=new THREE.Quaternion}var THREE=_dereq_("./three-math.js"),Util=_dereq_("./util.js"),ROTATE_SPEED=.5;TouchPanner.prototype.getOrientation=function(){return this.orientation.setFromEuler(new THREE.Euler(0,0,this.theta)),this.orientation},TouchPanner.prototype.resetSensor=function(){this.theta=0},TouchPanner.prototype.onTouchStart_=function(e){1==e.touches.length&&(this.rotateStart.set(e.touches[0].pageX,e.touches[0].pageY),this.isTouching=!0)},TouchPanner.prototype.onTouchMove_=function(e){if(this.isTouching){this.rotateEnd.set(e.touches[0].pageX,e.touches[0].pageY),this.rotateDelta.subVectors(this.rotateEnd,this.rotateStart),this.rotateStart.copy(this.rotateEnd),Util.isIOS()&&(this.rotateDelta.x*=-1);var element=document.body;this.theta+=2*Math.PI*this.rotateDelta.x/element.clientWidth*ROTATE_SPEED}},TouchPanner.prototype.onTouchEnd_=function(e){this.isTouching=!1},module.exports=TouchPanner},{"./three-math.js":9,"./util.js":11}],11:[function(_dereq_,module,exports){var Util=window.Util||{};Util.MIN_TIMESTEP=.001,Util.MAX_TIMESTEP=1,Util.clamp=function(value,min,max){return Math.min(Math.max(min,value),max)},Util.isIOS=function(){return/iPad|iPhone|iPod/.test(navigator.platform)},Util.isFirefoxAndroid=function(){return-1!==navigator.userAgent.indexOf("Firefox")&&-1!==navigator.userAgent.indexOf("Android")},Util.isTimestampDeltaValid=function(timestampDeltaS){return isNaN(timestampDeltaS)?!1:timestampDeltaS<=Util.MIN_TIMESTEP?!1:!(timestampDeltaS>Util.MAX_TIMESTEP)},module.exports=Util},{}],12:[function(_dereq_,module,exports){function WebVRPolyfill(){this.devices=[],this.isWebVRAvailable()||this.enablePolyfill()}var CardboardHMDVRDevice=_dereq_("./cardboard-hmd-vr-device.js"),FusionPositionSensorVRDevice=_dereq_("./fusion-position-sensor-vr-device.js"),MouseKeyboardPositionSensorVRDevice=_dereq_("./mouse-keyboard-position-sensor-vr-device.js"),HMDVRDevice=_dereq_("./base.js").HMDVRDevice,PositionSensorVRDevice=_dereq_("./base.js").PositionSensorVRDevice; +WebVRPolyfill.prototype.isWebVRAvailable=function(){return"getVRDevices"in navigator||"mozGetVRDevices"in navigator},WebVRPolyfill.prototype.enablePolyfill=function(){this.isCardboardCompatible()&&this.devices.push(new CardboardHMDVRDevice),this.isMobile()?this.devices.push(new FusionPositionSensorVRDevice):WebVRConfig.MOUSE_KEYBOARD_CONTROLS_DISABLED||this.devices.push(new MouseKeyboardPositionSensorVRDevice),navigator.getVRDevices=this.getVRDevices.bind(this),window.HMDVRDevice=HMDVRDevice,window.PositionSensorVRDevice=PositionSensorVRDevice},WebVRPolyfill.prototype.getVRDevices=function(){var devices=this.devices;return new Promise(function(resolve,reject){try{resolve(devices)}catch(e){reject(e)}})},WebVRPolyfill.prototype.isMobile=function(){return/Android/i.test(navigator.userAgent)||/iPhone|iPad|iPod/i.test(navigator.userAgent)},WebVRPolyfill.prototype.isCardboardCompatible=function(){return this.isMobile()||WebVRConfig.FORCE_ENABLE_VR},module.exports=WebVRPolyfill},{"./base.js":1,"./cardboard-hmd-vr-device.js":2,"./fusion-position-sensor-vr-device.js":4,"./mouse-keyboard-position-sensor-vr-device.js":6}]},{},[5])},{}],8:[function(_dereq_,module,exports){function Analytics(){!function(i,s,o,g,r,a,m){i.GoogleAnalyticsObject=r,i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date,a=s.createElement(o),m=s.getElementsByTagName(o)[0],a.async=1,a.src=g,m.parentNode.insertBefore(a,m)}(window,document,"script","//www.google-analytics.com/analytics.js","ga"),ga("create","UA-35315454-8","auto"),ga("send","pageview"),this.lastModeChangeTime=window.performance.now(),this.lastModeLabel=WebVRManager.Modes.UNKNOWN}var MODE_LABELS={0:"UNKNOWN",1:"NORMAL",2:"MAGIC_WINDOW",3:"VR"};Analytics.prototype.logModeChanged=function(mode){var modeLabel=MODE_LABELS[mode],lastModeLabel=MODE_LABELS[this.lastMode];console.log("Analytics: going from mode %s to %s",lastModeLabel,modeLabel),ga("send","screenview",{appName:"EmbedVR",screenName:modeLabel});var now=window.performance.now(),msSinceLastModeChange=Math.round(now-this.lastModeChangeTime);ga("send","timing","Time spent in mode",lastModeLabel,msSinceLastModeChange),this.lastModeChangeTime=now,this.lastMode=mode},window.analytics=new Analytics},{}],9:[function(_dereq_,module,exports){function DeviceMotionReceiver(){window.addEventListener("message",this.onMessage_.bind(this),!1)}DeviceMotionReceiver.prototype.onMessage_=function(event){var message=event.data;return"DeviceMotion"!==message.type?void console.warn("Got unknown message of type %s from %s",message.type,message.origin):(console.log("onMessage_",event),void this.synthesizeDeviceMotionEvent_(message.deviceMotionEvent))},DeviceMotionReceiver.prototype.synthesizeDeviceMotionEvent_=function(eventData){var type="devicemotion-iframe",canBubble=!1,cancelable=!1,dme=document.createEvent("DeviceMotionEvent");dme.initDeviceMotionEvent(type,canBubble,cancelable,eventData.acceleration,eventData.accelerationIncludingGravity,eventData.rotationRate,eventData.interval),window.dispatchEvent(dme)},module.exports=DeviceMotionReceiver},{}],10:[function(_dereq_,module,exports){function Emitter(){this.initEmitter()}Emitter.prototype.initEmitter=function(){this.callbacks={}},Emitter.prototype.emit=function(eventName){var callbacks=this.callbacks[eventName];if(!callbacks)return void console.log("No valid callback specified.");var args=[].slice.call(arguments);args.shift();for(var i=0;ij;j++)uvs[i][j].x*=p.scaleX,uvs[i][j].x+=p.offsetX,uvs[i][j].y*=p.scaleY,uvs[i][j].y+=p.offsetY;var material=new THREE.MeshBasicMaterial({map:texture});this.distorter.setMap(texture);var out=new THREE.Mesh(geometry,material);return out.renderOrder=-1,out},PhotosphereRenderer.prototype.createScene_=function(opt_params){var scene=new THREE.Scene;scene.add(new THREE.PointLight(16777215));var photoGroup=new THREE.Object3D;return photoGroup.name="photo",scene.add(photoGroup),scene},PhotosphereRenderer.prototype.updateMaterial_=function(material_FOO){for(var i=0;i1)for(var i=1;it;t+=2){var e=X[t],n=X[t+1];e(n),X[t]=void 0,X[t+1]=void 0}G=0}function f(){try{var t=_dereq_,e=t("vertx");return U=e.runOnLoop||e.runOnContext,i()}catch(n){return c()}}function l(t,e){var n=this,r=n._state;if(r===et&&!t||r===nt&&!e)return this;var o=new this.constructor(p),i=n._result;if(r){var s=arguments[r-1];H(function(){C(r,o,s,i)})}else j(n,o,t,e);return o}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(p);return g(n,t),n}function p(){}function _(){return new TypeError("You cannot resolve a promise with itself")}function v(){return new TypeError("A promises callback cannot return that same promise.")}function d(t){try{return t.then}catch(e){return rt.error=e,rt}}function y(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function m(t,e,n){H(function(t){var r=!1,o=y(n,e,function(n){r||(r=!0,e!==n?g(t,n):E(t,n))},function(e){r||(r=!0,S(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,S(t,o))},t)}function w(t,e){e._state===et?E(t,e._result):e._state===nt?S(t,e._result):j(e,void 0,function(e){g(t,e)},function(e){S(t,e)})}function b(t,n,r){n.constructor===t.constructor&&r===Z&&constructor.resolve===$?w(t,n):r===rt?S(t,rt.error):void 0===r?E(t,n):e(r)?m(t,n,r):E(t,n)}function g(e,n){e===n?S(e,_()):t(n)?b(e,n,d(n)):E(e,n)}function A(t){t._onerror&&t._onerror(t._result),T(t)}function E(t,e){t._state===tt&&(t._result=e,t._state=et,0!==t._subscribers.length&&H(T,t))}function S(t,e){t._state===tt&&(t._state=nt,t._result=e,H(A,t))}function j(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+et]=n,o[i+nt]=r,0===i&&t._state&&H(T,t)}function T(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r,o,i=t._result,s=0;ss;s++)j(r.resolve(t[s]),void 0,e,n);return o}function Y(t){var e=this,n=new e(p);return S(n,t),n}function q(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function F(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function D(t){this._id=ct++,this._state=void 0,this._result=void 0,this._subscribers=[],p!==t&&("function"!=typeof t&&q(),this instanceof D?M(this,t):F())}function K(t,e){this._instanceConstructor=t,this.promise=new t(p),Array.isArray(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?E(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&E(this.promise,this._result))):S(this.promise,this._validationError())}function L(){var t;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;(!n||"[object Promise]"!==Object.prototype.toString.call(n.resolve())||n.cast)&&(t.Promise=at)}var N;N=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var U,W,z,B=N,G=0,H=function(t,e){X[G]=t,X[G+1]=e,G+=2,2===G&&(W?W(a):z())},I="undefined"!=typeof window?window:void 0,J=I||{},Q=J.MutationObserver||J.WebKitMutationObserver,R="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),V="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,X=new Array(1e3);z=R?o():Q?s():V?u():void 0===I&&"function"==typeof _dereq_?f():c();var Z=l,$=h,tt=void 0,et=1,nt=2,rt=new P,ot=new P,it=O,st=k,ut=Y,ct=0,at=D;D.all=it,D.race=st,D.resolve=$,D.reject=ut,D._setScheduler=n,D._setAsap=r,D._asap=H,D.prototype={constructor:D,then:Z,"catch":function(t){return this.then(null,t)}};var ft=K;K.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},K.prototype._enumerate=function(){for(var t=this.length,e=this._input,n=0;this._state===tt&&t>n;n++)this._eachEntry(e[n],n)},K.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===$){var o=d(t);if(o===Z&&t._state!==tt)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===at){var i=new n(p);b(i,t,o),this._willSettleAt(i,e)}else this._willSettleAt(new n(function(e){e(t)}),e)}else this._willSettleAt(r(t),e)},K.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===tt&&(this._remaining--,t===nt?S(r,n):this._result[e]=n),0===this._remaining&&E(r,this._result)},K.prototype._willSettleAt=function(t,e){var n=this;j(t,void 0,function(t){n._settledAt(et,e,t)},function(t){n._settledAt(nt,e,t)})};var lt=L,ht={Promise:at,polyfill:lt};"function"==typeof define&&define.amd?define(function(){return ht}):"undefined"!=typeof module&&module.exports?module.exports=ht:"undefined"!=typeof this&&(this.ES6Promise=ht),lt()}).call(this); +}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"_process":18}],2:[function(_dereq_,module,exports){ +// stats.js - http://github.com/mrdoob/stats.js +var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px"; +i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div"); +k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display= +"block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height= +a+"px",m=b,r=0);return b},update:function(){l=this.end()}}};"object"===typeof module&&(module.exports=Stats); + +},{}],3:[function(_dereq_,module,exports){ +/** + * @author dmarcos / https://github.com/dmarcos + * @author mrdoob / http://mrdoob.com + */ + +var VRControls = function ( object, onError ) { + + var scope = this; + + var vrInputs = []; + + function filterInvalidDevices( devices ) { + + // Exclude Cardboard position sensor if Oculus exists. + + var oculusDevices = devices.filter( function ( device ) { + + return device.deviceName.toLowerCase().indexOf( 'oculus' ) !== - 1; + + } ); + + if ( oculusDevices.length >= 1 ) { + + return devices.filter( function ( device ) { + + return device.deviceName.toLowerCase().indexOf( 'cardboard' ) === - 1; + + } ); + + } else { + + return devices; + + } + + } + + function gotVRDevices( devices ) { + + devices = filterInvalidDevices( devices ); + + for ( var i = 0; i < devices.length; i ++ ) { + + if ( devices[ i ] instanceof PositionSensorVRDevice ) { + + vrInputs.push( devices[ i ] ); + + } + + } + + if ( onError ) onError( 'HMD not available' ); + + } + + if ( navigator.getVRDevices ) { + + navigator.getVRDevices().then( gotVRDevices ); + + } + + // the Rift SDK returns the position in meters + // this scale factor allows the user to define how meters + // are converted to scene units. + + this.scale = 1; + + this.update = function () { + + for ( var i = 0; i < vrInputs.length; i ++ ) { + + var vrInput = vrInputs[ i ]; + + var state = vrInput.getState(); + + if ( state.orientation !== null ) { + + object.quaternion.copy( state.orientation ); + + } + + if ( state.position !== null ) { + + object.position.copy( state.position ).multiplyScalar( scope.scale ); + + } + + } + + }; + + this.resetSensor = function () { + + for ( var i = 0; i < vrInputs.length; i ++ ) { + + var vrInput = vrInputs[ i ]; + + if ( vrInput.resetSensor !== undefined ) { + + vrInput.resetSensor(); + + } else if ( vrInput.zeroSensor !== undefined ) { + + vrInput.zeroSensor(); + + } + + } + + }; + + this.zeroSensor = function () { + + console.warn( 'THREE.VRControls: .zeroSensor() is now .resetSensor().' ); + this.resetSensor(); + + }; + + this.dispose = function () { + + vrInputs = []; + + }; + +}; + +try { + module.exports = VRControls; +} catch (e) { + THREE.VRControls = VRControls; +} + +},{}],4:[function(_dereq_,module,exports){ +/** + * @author dmarcos / https://github.com/dmarcos + * @author mrdoob / http://mrdoob.com + * + * WebVR Spec: http://mozvr.github.io/webvr-spec/webvr.html + * + * Firefox: http://mozvr.com/downloads/ + * Chromium: https://drive.google.com/folderview?id=0BzudLt22BqGRbW9WTHMtOWMzNjQ&usp=sharing#list + * + */ + +var VREffect = function ( renderer, onError ) { + + var vrHMD; + var eyeTranslationL, eyeFOVL, rectL; + var eyeTranslationR, eyeFOVR, rectR; + + function gotVRDevices( devices ) { + + for ( var i = 0; i < devices.length; i ++ ) { + + if ( devices[ i ] instanceof HMDVRDevice ) { + + vrHMD = devices[ i ]; + + break; // We keep the first we encounter + + } + + } + + if ( vrHMD === undefined ) { + + if ( onError ) onError( 'HMD not available' ); + + } + + } + + if ( navigator.getVRDevices ) { + + navigator.getVRDevices().then( gotVRDevices ); + + } + + // + + this.scale = 1; + + this.setSize = function( width, height ) { + + renderer.setSize( width, height ); + + }; + + // fullscreen + + var isFullscreen = false; + + var canvas = renderer.domElement; + var fullscreenchange = canvas.mozRequestFullScreen ? 'mozfullscreenchange' : 'webkitfullscreenchange'; + + document.addEventListener( fullscreenchange, function ( event ) { + + isFullscreen = document.mozFullScreenElement || document.webkitFullscreenElement; + + }, false ); + + this.setFullScreen = function ( boolean ) { + + if ( vrHMD === undefined ) return; + if ( isFullscreen === boolean ) return; + + if ( canvas.mozRequestFullScreen ) { + + canvas.mozRequestFullScreen( { vrDisplay: vrHMD } ); + + } else if ( canvas.webkitRequestFullscreen ) { + + canvas.webkitRequestFullscreen( { vrDisplay: vrHMD } ); + + } + + }; + + // render + + var cameraL = new THREE.PerspectiveCamera(); + var cameraR = new THREE.PerspectiveCamera(); + + this.render = function ( scene, camera ) { + + if ( vrHMD ) { + + var eyeParamsL = vrHMD.getEyeParameters( 'left' ); + var eyeParamsR = vrHMD.getEyeParameters( 'right' ); + + eyeTranslationL = eyeParamsL.eyeTranslation; + eyeTranslationR = eyeParamsR.eyeTranslation; + eyeFOVL = eyeParamsL.recommendedFieldOfView; + eyeFOVR = eyeParamsR.recommendedFieldOfView; + rectL = eyeParamsL.renderRect; + rectR = eyeParamsR.renderRect; + + var sceneL, sceneR; + + if ( Array.isArray( scene ) ) { + + sceneL = scene[ 0 ]; + sceneR = scene[ 1 ]; + + } else { + + sceneL = scene; + sceneR = scene; + + } + + var size = renderer.getSize(); + size.width /= 2; + + renderer.enableScissorTest( true ); + renderer.clear(); + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + cameraL.projectionMatrix = fovToProjection( eyeFOVL, true, camera.near, camera.far ); + cameraR.projectionMatrix = fovToProjection( eyeFOVR, true, camera.near, camera.far ); + + camera.matrixWorld.decompose( cameraL.position, cameraL.quaternion, cameraL.scale ); + camera.matrixWorld.decompose( cameraR.position, cameraR.quaternion, cameraR.scale ); + + cameraL.translateX( eyeTranslationL.x * this.scale ); + cameraR.translateX( eyeTranslationR.x * this.scale ); + + // render left eye + if ( rectL ) { + + renderer.setViewport( rectL.x, rectL.y, rectL.width, rectL.height ); + renderer.setScissor( rectL.x, rectL.y, rectL.width, rectL.height ); + + } else { + + renderer.setViewport( 0, 0, size.width, size.height ); + renderer.setScissor( 0, 0, size.width, size.height ); + + } + renderer.render( sceneL, cameraL ); + + // render right eye + if ( rectR ) { + + renderer.setViewport( rectR.x, rectR.y, rectR.width, rectR.height ); + renderer.setScissor( rectR.x, rectR.y, rectR.width, rectR.height ); + + } else { + + renderer.setViewport( size.width, 0, size.width, size.height ); + renderer.setScissor( size.width, 0, size.width, size.height ); + + } + renderer.render( sceneR, cameraR ); + + renderer.enableScissorTest( false ); + + return; + + } + + // Regular render mode if not HMD + + if ( Array.isArray( scene ) ) scene = scene[ 0 ]; + + renderer.render( scene, camera ); + + }; + + // + + function fovToNDCScaleOffset( fov ) { + + var pxscale = 2.0 / ( fov.leftTan + fov.rightTan ); + var pxoffset = ( fov.leftTan - fov.rightTan ) * pxscale * 0.5; + var pyscale = 2.0 / ( fov.upTan + fov.downTan ); + var pyoffset = ( fov.upTan - fov.downTan ) * pyscale * 0.5; + return { scale: [ pxscale, pyscale ], offset: [ pxoffset, pyoffset ] }; + + } + + function fovPortToProjection( fov, rightHanded, zNear, zFar ) { + + rightHanded = rightHanded === undefined ? true : rightHanded; + zNear = zNear === undefined ? 0.01 : zNear; + zFar = zFar === undefined ? 10000.0 : zFar; + + var handednessScale = rightHanded ? - 1.0 : 1.0; + + // start with an identity matrix + var mobj = new THREE.Matrix4(); + var m = mobj.elements; + + // and with scale/offset info for normalized device coords + var scaleAndOffset = fovToNDCScaleOffset( fov ); + + // X result, map clip edges to [-w,+w] + m[ 0 * 4 + 0 ] = scaleAndOffset.scale[ 0 ]; + m[ 0 * 4 + 1 ] = 0.0; + m[ 0 * 4 + 2 ] = scaleAndOffset.offset[ 0 ] * handednessScale; + m[ 0 * 4 + 3 ] = 0.0; + + // Y result, map clip edges to [-w,+w] + // Y offset is negated because this proj matrix transforms from world coords with Y=up, + // but the NDC scaling has Y=down (thanks D3D?) + m[ 1 * 4 + 0 ] = 0.0; + m[ 1 * 4 + 1 ] = scaleAndOffset.scale[ 1 ]; + m[ 1 * 4 + 2 ] = - scaleAndOffset.offset[ 1 ] * handednessScale; + m[ 1 * 4 + 3 ] = 0.0; + + // Z result (up to the app) + m[ 2 * 4 + 0 ] = 0.0; + m[ 2 * 4 + 1 ] = 0.0; + m[ 2 * 4 + 2 ] = zFar / ( zNear - zFar ) * - handednessScale; + m[ 2 * 4 + 3 ] = ( zFar * zNear ) / ( zNear - zFar ); + + // W result (= Z in) + m[ 3 * 4 + 0 ] = 0.0; + m[ 3 * 4 + 1 ] = 0.0; + m[ 3 * 4 + 2 ] = handednessScale; + m[ 3 * 4 + 3 ] = 0.0; + + mobj.transpose(); + + return mobj; + + } + + function fovToProjection( fov, rightHanded, zNear, zFar ) { + + var DEG2RAD = Math.PI / 180.0; + + var fovPort = { + upTan: Math.tan( fov.upDegrees * DEG2RAD ), + downTan: Math.tan( fov.downDegrees * DEG2RAD ), + leftTan: Math.tan( fov.leftDegrees * DEG2RAD ), + rightTan: Math.tan( fov.rightDegrees * DEG2RAD ) + }; + + return fovPortToProjection( fovPort, rightHanded, zNear, zFar ); + + } + +}; + +try { + module.exports = VREffect; +} catch (e) { + THREE.VREffect = VREffect; +} + +},{}],5:[function(_dereq_,module,exports){ +var self = self || {};// File:src/Three.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var THREE = { REVISION: '73' }; + +// + +if ( typeof define === 'function' && define.amd ) { + + define( 'three', THREE ); + +} else if ( 'undefined' !== typeof exports && 'undefined' !== typeof module ) { + + module.exports = THREE; + +} + + +// polyfills + +if ( self.requestAnimationFrame === undefined || self.cancelAnimationFrame === undefined ) { + + // Missing in Android stock browser. + + ( function () { + + var lastTime = 0; + var vendors = [ 'ms', 'moz', 'webkit', 'o' ]; + + for ( var x = 0; x < vendors.length && ! self.requestAnimationFrame; ++ x ) { + + self.requestAnimationFrame = self[ vendors[ x ] + 'RequestAnimationFrame' ]; + self.cancelAnimationFrame = self[ vendors[ x ] + 'CancelAnimationFrame' ] || self[ vendors[ x ] + 'CancelRequestAnimationFrame' ]; + + } + + if ( self.requestAnimationFrame === undefined && self.setTimeout !== undefined ) { + + self.requestAnimationFrame = function ( callback ) { + + var currTime = Date.now(), timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) ); + var id = self.setTimeout( function () { + + callback( currTime + timeToCall ); + + }, timeToCall ); + lastTime = currTime + timeToCall; + return id; + + }; + + } + + if ( self.cancelAnimationFrame === undefined && self.clearTimeout !== undefined ) { + + self.cancelAnimationFrame = function ( id ) { + + self.clearTimeout( id ); + + }; + + } + + } )(); + +} + +// + +if ( self.performance === undefined ) { + + self.performance = {}; + +} + +if ( self.performance.now === undefined ) { + + ( function () { + + var start = Date.now(); + + self.performance.now = function () { + + return Date.now() - start; + + } + + } )(); + +} + +// + +if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, -52 ); + +} + +// + +if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + +} + +if ( Function.prototype.name === undefined && Object.defineProperty !== undefined ) { + + // Missing in IE9-11. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*(\S*)\s*\(/ )[ 1 ]; + + } + + } ); + +} + +// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent.button + +THREE.MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + +// GL STATE CONSTANTS + +THREE.CullFaceNone = 0; +THREE.CullFaceBack = 1; +THREE.CullFaceFront = 2; +THREE.CullFaceFrontBack = 3; + +THREE.FrontFaceDirectionCW = 0; +THREE.FrontFaceDirectionCCW = 1; + +// SHADOWING TYPES + +THREE.BasicShadowMap = 0; +THREE.PCFShadowMap = 1; +THREE.PCFSoftShadowMap = 2; + +// MATERIAL CONSTANTS + +// side + +THREE.FrontSide = 0; +THREE.BackSide = 1; +THREE.DoubleSide = 2; + +// shading + +THREE.FlatShading = 1; +THREE.SmoothShading = 2; + +// colors + +THREE.NoColors = 0; +THREE.FaceColors = 1; +THREE.VertexColors = 2; + +// blending modes + +THREE.NoBlending = 0; +THREE.NormalBlending = 1; +THREE.AdditiveBlending = 2; +THREE.SubtractiveBlending = 3; +THREE.MultiplyBlending = 4; +THREE.CustomBlending = 5; + +// custom blending equations +// (numbers start from 100 not to clash with other +// mappings to OpenGL constants defined in Texture.js) + +THREE.AddEquation = 100; +THREE.SubtractEquation = 101; +THREE.ReverseSubtractEquation = 102; +THREE.MinEquation = 103; +THREE.MaxEquation = 104; + +// custom blending destination factors + +THREE.ZeroFactor = 200; +THREE.OneFactor = 201; +THREE.SrcColorFactor = 202; +THREE.OneMinusSrcColorFactor = 203; +THREE.SrcAlphaFactor = 204; +THREE.OneMinusSrcAlphaFactor = 205; +THREE.DstAlphaFactor = 206; +THREE.OneMinusDstAlphaFactor = 207; + +// custom blending source factors + +//THREE.ZeroFactor = 200; +//THREE.OneFactor = 201; +//THREE.SrcAlphaFactor = 204; +//THREE.OneMinusSrcAlphaFactor = 205; +//THREE.DstAlphaFactor = 206; +//THREE.OneMinusDstAlphaFactor = 207; +THREE.DstColorFactor = 208; +THREE.OneMinusDstColorFactor = 209; +THREE.SrcAlphaSaturateFactor = 210; + +// depth modes + +THREE.NeverDepth = 0; +THREE.AlwaysDepth = 1; +THREE.LessDepth = 2; +THREE.LessEqualDepth = 3; +THREE.EqualDepth = 4; +THREE.GreaterEqualDepth = 5; +THREE.GreaterDepth = 6; +THREE.NotEqualDepth = 7; + + +// TEXTURE CONSTANTS + +THREE.MultiplyOperation = 0; +THREE.MixOperation = 1; +THREE.AddOperation = 2; + +// Mapping modes + +THREE.UVMapping = 300; + +THREE.CubeReflectionMapping = 301; +THREE.CubeRefractionMapping = 302; + +THREE.EquirectangularReflectionMapping = 303; +THREE.EquirectangularRefractionMapping = 304; + +THREE.SphericalReflectionMapping = 305; + +// Wrapping modes + +THREE.RepeatWrapping = 1000; +THREE.ClampToEdgeWrapping = 1001; +THREE.MirroredRepeatWrapping = 1002; + +// Filters + +THREE.NearestFilter = 1003; +THREE.NearestMipMapNearestFilter = 1004; +THREE.NearestMipMapLinearFilter = 1005; +THREE.LinearFilter = 1006; +THREE.LinearMipMapNearestFilter = 1007; +THREE.LinearMipMapLinearFilter = 1008; + +// Data types + +THREE.UnsignedByteType = 1009; +THREE.ByteType = 1010; +THREE.ShortType = 1011; +THREE.UnsignedShortType = 1012; +THREE.IntType = 1013; +THREE.UnsignedIntType = 1014; +THREE.FloatType = 1015; +THREE.HalfFloatType = 1025; + +// Pixel types + +//THREE.UnsignedByteType = 1009; +THREE.UnsignedShort4444Type = 1016; +THREE.UnsignedShort5551Type = 1017; +THREE.UnsignedShort565Type = 1018; + +// Pixel formats + +THREE.AlphaFormat = 1019; +THREE.RGBFormat = 1020; +THREE.RGBAFormat = 1021; +THREE.LuminanceFormat = 1022; +THREE.LuminanceAlphaFormat = 1023; +// THREE.RGBEFormat handled as THREE.RGBAFormat in shaders +THREE.RGBEFormat = THREE.RGBAFormat; //1024; + +// DDS / ST3C Compressed texture formats + +THREE.RGB_S3TC_DXT1_Format = 2001; +THREE.RGBA_S3TC_DXT1_Format = 2002; +THREE.RGBA_S3TC_DXT3_Format = 2003; +THREE.RGBA_S3TC_DXT5_Format = 2004; + + +// PVRTC compressed texture formats + +THREE.RGB_PVRTC_4BPPV1_Format = 2100; +THREE.RGB_PVRTC_2BPPV1_Format = 2101; +THREE.RGBA_PVRTC_4BPPV1_Format = 2102; +THREE.RGBA_PVRTC_2BPPV1_Format = 2103; + +// Loop styles for AnimationAction + +THREE.LoopOnce = 2200; +THREE.LoopRepeat = 2201; +THREE.LoopPingPong = 2202; + +// DEPRECATED + +THREE.Projector = function () { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function ( vector, camera ) { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + +}; + +THREE.CanvasRenderer = function () { + + console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' ); + + this.domElement = document.createElement( 'canvas' ); + this.clear = function () {}; + this.render = function () {}; + this.setClearColor = function () {}; + this.setSize = function () {}; + +}; + +// File:src/math/Color.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Color = function ( color ) { + + if ( arguments.length === 3 ) { + + return this.fromArray( arguments ); + + } + + return this.set( color ); + +}; + +THREE.Color.prototype = { + + constructor: THREE.Color, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( value instanceof THREE.Color ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function ( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = THREE.Math.euclideanModulo( h, 1 ); + s = THREE.Math.clamp( s, 0, 1 ); + l = THREE.Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = THREE.ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( optionalTarget ) { + + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + hsl.h = hue; + hsl.s = saturation; + hsl.l = lightness; + + return hsl; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function ( h, s, l ) { + + var hsl = this.getHSL(); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }, + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + } + +}; + +THREE.ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, +'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, +'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, +'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, +'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, +'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, +'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, +'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, +'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, +'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, +'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, +'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, +'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, +'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, +'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, +'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, +'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, +'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, +'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, +'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, +'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, +'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, +'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, +'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + +// File:src/math/Quaternion.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +THREE.Quaternion = function ( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + +}; + +THREE.Quaternion.prototype = { + + constructor: THREE.Quaternion, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get w () { + + return this._w; + + }, + + set w ( value ) { + + this._w = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( euler instanceof THREE.Euler === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var c1 = Math.cos( euler._x / 2 ); + var c2 = Math.cos( euler._y / 2 ); + var c3 = Math.cos( euler._z / 2 ); + var s1 = Math.sin( euler._x / 2 ); + var s2 = Math.sin( euler._y / 2 ); + var s3 = Math.sin( euler._z / 2 ); + + var order = euler.order; + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final + + // assumes direction vectors vFrom and vTo are normalized + + var v1, r; + + var EPS = 0.000001; + + return function ( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + this.normalize(); + + return this; + + } + + }(), + + inverse: function () { + + this.conjugate().normalize(); + + return this; + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var halfTheta = Math.acos( cosHalfTheta ); + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + +}; + +THREE.Quaternion.slerp = function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + +}; + +// File:src/math/Vector2.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.Vector2 = function ( x, y ) { + + this.x = x || 0; + this.y = y || 0; + +}; + +THREE.Vector2.prototype = { + + constructor: THREE.Vector2, + + get width() { return this.x }, + set width( value ) { this.x = value }, + + get height() { return this.y }, + set height( value ) { this.y = value }, + + // + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + this.x *= scalar; + this.y *= scalar; + } else { + this.x = 0; + this.y = 0; + } + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector2(); + max = new THREE.Vector2(); + + } + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + return this; + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + lengthManhattan: function() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + +}; + +// File:src/math/Vector3.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Vector3 = function ( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + +}; + +THREE.Vector3.prototype = { + + constructor: THREE.Vector3, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + } else { + this.x = 0; + this.y = 0; + this.z = 0; + } + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion; + + return function applyEuler( euler ) { + + if ( euler instanceof THREE.Euler === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); + + this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + return this; + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion; + + return function applyAxisAngle( axis, angle ) { + + if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); + + this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + return this; + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x; + var y = this.y; + var z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + // input: THREE.Matrix4 affine matrix + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + + return this; + + }, + + applyProjection: function ( m ) { + + // input: THREE.Matrix4 projection matrix + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + var d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x; + var y = this.y; + var z = this.z; + + var qx = q.x; + var qy = q.y; + var qz = q.z; + var qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix; + + return function project( camera ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix; + + return function unproject( camera ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + this.normalize(); + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector3(); + max = new THREE.Vector3(); + + } + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + return this; + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + return this; + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function () { + + var v1, dot; + + return function projectOnVector( vector ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + v1.copy( vector ).normalize(); + + dot = this.dot( v1 ); + + return this.copy( v1 ).multiplyScalar( dot ); + + }; + + }(), + + projectOnPlane: function () { + + var v1; + + return function projectOnPlane( planeNormal ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + } + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1; + + return function reflect( normal ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + } + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( this.length() * v.length() ); + + // clamp, to handle numerical problems + + return Math.acos( THREE.Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x; + var dy = this.y - v.y; + var dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + setEulerFromRotationMatrix: function ( m, order ) { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + + setEulerFromQuaternion: function ( q, order ) { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + + return this.setFromMatrixPosition( m ); + + }, + + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + + return this.setFromMatrixScale( m ); + + }, + + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + + return this.setFromMatrixColumn( index, matrix ); + + }, + + setFromMatrixPosition: function ( m ) { + + this.x = m.elements[ 12 ]; + this.y = m.elements[ 13 ]; + this.z = m.elements[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.set( m.elements[ 0 ], m.elements[ 1 ], m.elements[ 2 ] ).length(); + var sy = this.set( m.elements[ 4 ], m.elements[ 5 ], m.elements[ 6 ] ).length(); + var sz = this.set( m.elements[ 8 ], m.elements[ 9 ], m.elements[ 10 ] ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( index, matrix ) { + + var offset = index * 4; + + var me = matrix.elements; + + this.x = me[ offset ]; + this.y = me[ offset + 1 ]; + this.z = me[ offset + 2 ]; + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + + return this; + + } + +}; + +// File:src/math/Vector4.js + +/** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Vector4 = function ( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + +}; + +THREE.Vector4.prototype = { + + constructor: THREE.Vector4, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + } else { + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 0; + } + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x; + var y = this.y; + var z = this.z; + var w = this.w; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) + && ( Math.abs( m13 - m31 ) < epsilon ) + && ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) + && ( Math.abs( m13 + m31 ) < epsilon2 ) + && ( Math.abs( m23 + m32 ) < epsilon2 ) + && ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector4(); + max = new THREE.Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + this.w = attribute.array[ index + 3 ]; + + return this; + + } + +}; + +// File:src/math/Euler.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +THREE.Euler = function ( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || THREE.Euler.DefaultOrder; + +}; + +THREE.Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + +THREE.Euler.DefaultOrder = 'XYZ'; + +THREE.Euler.prototype = { + + constructor: THREE.Euler, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get order () { + + return this._order; + + }, + + set order ( value ) { + + this._order = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = THREE.Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ) + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix; + + return function ( q, order, update ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + matrix.makeRotationFromQuaternion( q ); + this.setFromRotationMatrix( matrix, order, update ); + + return this; + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new THREE.Quaternion(); + + return function ( newOrder ) { + + q.setFromEuler( this ); + this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new THREE.Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + +}; + +// File:src/math/Line3.js + +/** + * @author bhouston / http://clara.io + */ + +THREE.Line3 = function ( start, end ) { + + this.start = ( start !== undefined ) ? start : new THREE.Vector3(); + this.end = ( end !== undefined ) ? end : new THREE.Vector3(); + +}; + +THREE.Line3.prototype = { + + constructor: THREE.Line3, + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + center: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new THREE.Vector3(); + var startEnd = new THREE.Vector3(); + + return function ( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = THREE.Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, optionalTarget ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + var result = optionalTarget || new THREE.Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + +}; + +// File:src/math/Box2.js + +/** + * @author bhouston / http://clara.io + */ + +THREE.Box2 = function ( min, max ) { + + this.min = ( min !== undefined ) ? min : new THREE.Vector2( Infinity, Infinity ); + this.max = ( max !== undefined ) ? max : new THREE.Vector2( - Infinity, - Infinity ); + +}; + +THREE.Box2.prototype = { + + constructor: THREE.Box2, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ) + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new THREE.Vector2(); + + return function ( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + empty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + center: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector2(); + return result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + size: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector2(); + return result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + if ( point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ) { + + return false; + + } + + return true; + + }, + + containsBox: function ( box ) { + + if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && + ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) { + + return true; + + } + + return false; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new THREE.Vector2(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + isIntersectionBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + + if ( box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ) { + + return false; + + } + + return true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector2(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new THREE.Vector2(); + + return function ( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +}; + +// File:src/math/Box3.js + +/** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Box3 = function ( min, max ) { + + this.min = ( min !== undefined ) ? min : new THREE.Vector3( Infinity, Infinity, Infinity ); + this.max = ( max !== undefined ) ? max : new THREE.Vector3( - Infinity, - Infinity, - Infinity ); + +}; + +THREE.Box3.prototype = { + + constructor: THREE.Box3, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new THREE.Vector3(); + + return function ( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var v1 = new THREE.Vector3(); + + return function ( object ) { + + var scope = this; + + object.updateMatrixWorld( true ); + + this.makeEmpty(); + + object.traverse( function ( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( geometry instanceof THREE.Geometry ) { + + var vertices = geometry.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + v1.copy( vertices[ i ] ); + + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( geometry instanceof THREE.BufferGeometry && geometry.attributes[ 'position' ] !== undefined ) { + + var positions = geometry.attributes[ 'position' ].array; + + for ( var i = 0, il = positions.length; i < il; i += 3 ) { + + v1.set( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ); + + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + empty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + center: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + size: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + if ( point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ) { + + return false; + + } + + return true; + + }, + + containsBox: function ( box ) { + + if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && + ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) && + ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) { + + return true; + + } + + return false; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new THREE.Vector3(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + isIntersectionBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + + if ( box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ) { + + return false; + + } + + return true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new THREE.Vector3(); + + return function ( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new THREE.Vector3(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Sphere(); + + result.center = this.center(); + result.radius = this.size( v1 ).length() * 0.5; + + return result; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3(), + new THREE.Vector3() + ]; + + return function ( matrix ) { + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.makeEmpty(); + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + +}; + +// File:src/math/Matrix3.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + +THREE.Matrix3 = function () { + + this.elements = new Float32Array( [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + +}; + +THREE.Matrix3.prototype = { + + constructor: THREE.Matrix3, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 3 ] = n12; te[ 6 ] = n13; + te[ 1 ] = n21; te[ 4 ] = n22; te[ 7 ] = n23; + te[ 2 ] = n31; te[ 5 ] = n32; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 3 ], me[ 6 ], + me[ 1 ], me[ 4 ], me[ 7 ], + me[ 2 ], me[ 5 ], me[ 8 ] + + ); + + return this; + + }, + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + + }, + + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + + applyToVector3Array: function () { + + var v1; + + return function ( array, offset, length ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = array.length; + + for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) { + + v1.fromArray( array, j ); + v1.applyMatrix3( this ); + v1.toArray( array, j ); + + } + + return array; + + }; + + }(), + + applyToBuffer: function () { + + var v1; + + return function applyToBuffer( buffer, offset, length ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = buffer.length / buffer.itemSize; + + for ( var i = 0, j = offset; i < length; i ++, j ++ ) { + + v1.x = buffer.getX( j ); + v1.y = buffer.getY( j ); + v1.z = buffer.getZ( j ); + + v1.applyMatrix3( this ); + + buffer.setXYZ( v1.x, v1.y, v1.z ); + + } + + return buffer; + + }; + + }(), + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnInvertible ) { + + // input: THREE.Matrix4 + // ( based on http://code.google.com/p/webgl-mjs/ ) + + var me = matrix.elements; + var te = this.elements; + + te[ 0 ] = me[ 10 ] * me[ 5 ] - me[ 6 ] * me[ 9 ]; + te[ 1 ] = - me[ 10 ] * me[ 1 ] + me[ 2 ] * me[ 9 ]; + te[ 2 ] = me[ 6 ] * me[ 1 ] - me[ 2 ] * me[ 5 ]; + te[ 3 ] = - me[ 10 ] * me[ 4 ] + me[ 6 ] * me[ 8 ]; + te[ 4 ] = me[ 10 ] * me[ 0 ] - me[ 2 ] * me[ 8 ]; + te[ 5 ] = - me[ 6 ] * me[ 0 ] + me[ 2 ] * me[ 4 ]; + te[ 6 ] = me[ 9 ] * me[ 4 ] - me[ 5 ] * me[ 8 ]; + te[ 7 ] = - me[ 9 ] * me[ 0 ] + me[ 1 ] * me[ 8 ]; + te[ 8 ] = me[ 5 ] * me[ 0 ] - me[ 1 ] * me[ 4 ]; + + var det = me[ 0 ] * te[ 0 ] + me[ 1 ] * te[ 3 ] + me[ 2 ] * te[ 6 ]; + + // no inverse + + if ( det === 0 ) { + + var msg = "Matrix3.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnInvertible || false ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + this.identity(); + + return this; + + } + + this.multiplyScalar( 1.0 / det ); + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + flattenToArrayOffset: function ( array, offset ) { + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + }, + + getNormalMatrix: function ( m ) { + + // input: THREE.Matrix4 + + this.getInverse( m ).transpose(); + + return this; + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + fromArray: function ( array ) { + + this.elements.set( array ); + + return this; + + }, + + toArray: function () { + + var te = this.elements; + + return [ + te[ 0 ], te[ 1 ], te[ 2 ], + te[ 3 ], te[ 4 ], te[ 5 ], + te[ 6 ], te[ 7 ], te[ 8 ] + ]; + + } + +}; + +// File:src/math/Matrix4.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Matrix4 = function () { + + this.elements = new Float32Array( [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + +}; + +THREE.Matrix4.prototype = { + + constructor: THREE.Matrix4, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new THREE.Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + this.elements.set( m.elements ); + + return this; + + }, + + extractPosition: function ( m ) { + + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + + }, + + copyPosition: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + var te = this.elements; + + xAxis.set( te[ 0 ], te[ 1 ], te[ 2 ] ); + yAxis.set( te[ 4 ], te[ 5 ], te[ 6 ] ); + zAxis.set( te[ 8 ], te[ 9 ], te[ 10 ] ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1; + + return function ( m ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.set( me[ 0 ], me[ 1 ], me[ 2 ] ).length(); + var scaleY = 1 / v1.set( me[ 4 ], me[ 5 ], me[ 6 ] ).length(); + var scaleZ = 1 / v1.set( me[ 8 ], me[ 9 ], me[ 10 ] ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( euler instanceof THREE.Euler === false ) { + + console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + setRotationFromQuaternion: function ( q ) { + + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + + return this.makeRotationFromQuaternion( q ); + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q.x, y = q.y, z = q.z, w = q.w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x, y, z; + + return function ( eye, target, up ) { + + if ( x === undefined ) x = new THREE.Vector3(); + if ( y === undefined ) y = new THREE.Vector3(); + if ( z === undefined ) z = new THREE.Vector3(); + + var te = this.elements; + + z.subVectors( eye, target ).normalize(); + + if ( z.lengthSq() === 0 ) { + + z.z = 1; + + } + + x.crossVectors( up, z ).normalize(); + + if ( x.lengthSq() === 0 ) { + + z.x += 0.0001; + x.crossVectors( up, z ).normalize(); + + } + + y.crossVectors( z, x ); + + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyToArray: function ( a, b, r ) { + + var te = this.elements; + + this.multiplyMatrices( a, b ); + + r[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ]; + r[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ]; + r[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ]; + r[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ]; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' ); + return vector.applyProjection( this ); + + }, + + multiplyVector4: function ( vector ) { + + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + + multiplyVector3Array: function ( a ) { + + console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + + }, + + applyToVector3Array: function () { + + var v1; + + return function ( array, offset, length ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = array.length; + + for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) { + + v1.fromArray( array, j ); + v1.applyMatrix4( this ); + v1.toArray( array, j ); + + } + + return array; + + }; + + }(), + + applyToBuffer: function () { + + var v1; + + return function applyToBuffer( buffer, offset, length ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = buffer.length / buffer.itemSize; + + for ( var i = 0, j = offset; i < length; i ++, j ++ ) { + + v1.x = buffer.getX( j ); + v1.y = buffer.getY( j ); + v1.z = buffer.getZ( j ); + + v1.applyMatrix4( this ); + + buffer.setXYZ( v1.x, v1.y, v1.z ); + + } + + return buffer; + + }; + + }(), + + rotateAxis: function ( v ) { + + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + + v.transformDirection( this ); + + }, + + crossVector: function ( vector ) { + + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + + }, + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + flattenToArrayOffset: function ( array, offset ) { + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + }, + + getPosition: function () { + + var v1; + + return function () { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + + var te = this.elements; + return v1.set( te[ 12 ], te[ 13 ], te[ 14 ] ); + + }; + + }(), + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnInvertible ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements; + var me = m.elements; + + var n11 = me[ 0 ], n12 = me[ 4 ], n13 = me[ 8 ], n14 = me[ 12 ]; + var n21 = me[ 1 ], n22 = me[ 5 ], n23 = me[ 9 ], n24 = me[ 13 ]; + var n31 = me[ 2 ], n32 = me[ 6 ], n33 = me[ 10 ], n34 = me[ 14 ]; + var n41 = me[ 3 ], n42 = me[ 7 ], n43 = me[ 11 ], n44 = me[ 15 ]; + + te[ 0 ] = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44; + te[ 4 ] = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44; + te[ 8 ] = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44; + te[ 12 ] = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + te[ 1 ] = n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44; + te[ 5 ] = n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44; + te[ 9 ] = n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44; + te[ 13 ] = n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34; + te[ 2 ] = n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44; + te[ 6 ] = n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44; + te[ 10 ] = n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44; + te[ 14 ] = n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34; + te[ 3 ] = n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43; + te[ 7 ] = n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43; + te[ 11 ] = n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43; + te[ 15 ] = n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33; + + var det = n11 * te[ 0 ] + n21 * te[ 4 ] + n31 * te[ 8 ] + n41 * te[ 12 ]; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnInvertible || false ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + this.identity(); + + return this; + + } + + this.multiplyScalar( 1 / det ); + + return this; + + }, + + translate: function ( v ) { + + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + + }, + + rotateX: function ( angle ) { + + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + + }, + + rotateY: function ( angle ) { + + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + + }, + + rotateZ: function ( angle ) { + + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + + }, + + rotateByAxis: function ( axis, angle ) { + + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector, matrix; + + return function ( position, quaternion, scale ) { + + if ( vector === undefined ) vector = new THREE.Vector3(); + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) { + + sx = - sx; + + } + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + + matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy() + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makeFrustum: function ( left, right, bottom, top, near, far ) { + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makePerspective: function ( fov, aspect, near, far ) { + + var ymax = near * Math.tan( THREE.Math.degToRad( fov * 0.5 ) ); + var ymin = - ymax; + var xmin = ymin * aspect; + var xmax = ymax * aspect; + + return this.makeFrustum( xmin, xmax, ymin, ymax, near, far ); + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = right - left; + var h = top - bottom; + var p = far - near; + + var x = ( right + left ) / w; + var y = ( top + bottom ) / h; + var z = ( far + near ) / p; + + te[ 0 ] = 2 / w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 / h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 / p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array ) { + + this.elements.set( array ); + + return this; + + }, + + toArray: function () { + + var te = this.elements; + + return [ + te[ 0 ], te[ 1 ], te[ 2 ], te[ 3 ], + te[ 4 ], te[ 5 ], te[ 6 ], te[ 7 ], + te[ 8 ], te[ 9 ], te[ 10 ], te[ 11 ], + te[ 12 ], te[ 13 ], te[ 14 ], te[ 15 ] + ]; + + } + +}; + +// File:src/math/Ray.js + +/** + * @author bhouston / http://clara.io + */ + +THREE.Ray = function ( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new THREE.Vector3(); + this.direction = ( direction !== undefined ) ? direction : new THREE.Vector3(); + +}; + +THREE.Ray.prototype = { + + constructor: THREE.Ray, + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + recast: function () { + + var v1 = new THREE.Vector3(); + + return function ( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + result.subVectors( point, this.origin ); + var directionDistance = result.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return result.copy( this.origin ); + + } + + return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new THREE.Vector3(); + + return function ( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new THREE.Vector3(); + var segDir = new THREE.Vector3(); + var diff = new THREE.Vector3(); + + return function ( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/LibMathematics/Distance/Wm5DistRay3Segment3.cpp + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + + isIntersectionSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + intersectSphere: function () { + + // from http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-7-intersecting-simple-shapes/ray-sphere-intersection/ + + var v1 = new THREE.Vector3(); + + return function ( sphere, optionalTarget ) { + + v1.subVectors( sphere.center, this.origin ); + + var tca = v1.dot( this.direction ); + + var d2 = v1.dot( v1 ) - tca * tca; + + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, optionalTarget ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, optionalTarget ); + + } + + }(), + + isIntersectionPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, optionalTarget ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, optionalTarget ); + + }, + + isIntersectionBox: function () { + + var v = new THREE.Vector3(); + + return function ( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + }(), + + intersectBox: function ( box, optionalTarget ) { + + // http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-7-intersecting-simple-shapes/ray-box-intersection/ + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); + + }, + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new THREE.Vector3(); + var edge1 = new THREE.Vector3(); + var edge2 = new THREE.Vector3(); + var normal = new THREE.Vector3(); + + return function ( a, b, c, backfaceCulling, optionalTarget ) { + + // from http://www.geometrictools.com/LibMathematics/Intersection/Wm5IntrRay3Triangle3.cpp + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, optionalTarget ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.direction.add( this.origin ).applyMatrix4( matrix4 ); + this.origin.applyMatrix4( matrix4 ); + this.direction.sub( this.origin ); + this.direction.normalize(); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + +}; + +// File:src/math/Sphere.js + +/** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Sphere = function ( center, radius ) { + + this.center = ( center !== undefined ) ? center : new THREE.Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + +}; + +THREE.Sphere.prototype = { + + constructor: THREE.Sphere, + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new THREE.Box3(); + + return function ( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).center( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + clampPoint: function ( point, optionalTarget ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + var result = optionalTarget || new THREE.Vector3(); + result.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + result.sub( this.center ).normalize(); + result.multiplyScalar( this.radius ).add( this.center ); + + } + + return result; + + }, + + getBoundingBox: function ( optionalTarget ) { + + var box = optionalTarget || new THREE.Box3(); + + box.set( this.center, this.center ); + box.expandByScalar( this.radius ); + + return box; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + +}; + +// File:src/math/Frustum.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + +THREE.Frustum = function ( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new THREE.Plane(), + ( p1 !== undefined ) ? p1 : new THREE.Plane(), + ( p2 !== undefined ) ? p2 : new THREE.Plane(), + ( p3 !== undefined ) ? p3 : new THREE.Plane(), + ( p4 !== undefined ) ? p4 : new THREE.Plane(), + ( p5 !== undefined ) ? p5 : new THREE.Plane() + + ]; + +}; + +THREE.Frustum.prototype = { + + constructor: THREE.Frustum, + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new THREE.Sphere(); + + return function ( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new THREE.Vector3(), + p2 = new THREE.Vector3(); + + return function ( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6 ; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + +}; + +// File:src/math/Plane.js + +/** + * @author bhouston / http://clara.io + */ + +THREE.Plane = function ( normal, constant ) { + + this.normal = ( normal !== undefined ) ? normal : new THREE.Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + +}; + +THREE.Plane.prototype = { + + constructor: THREE.Plane, + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + + return function ( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, optionalTarget ) { + + return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); + + }, + + orthoPoint: function ( point, optionalTarget ) { + + var perpendicularMagnitude = this.distanceToPoint( point ); + + var result = optionalTarget || new THREE.Vector3(); + return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); + + }, + + isIntersectionLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectLine: function () { + + var v1 = new THREE.Vector3(); + + return function ( line, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return result.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return result.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + + coplanarPoint: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + var m1 = new THREE.Matrix3(); + + return function ( matrix, optionalNormalMatrix ) { + + // compute new normal based on theory here: + // http://www.songho.ca/opengl/gl_normaltransform.html + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + var newNormal = v1.copy( this.normal ).applyMatrix3( normalMatrix ); + + var newCoplanarPoint = this.coplanarPoint( v2 ); + newCoplanarPoint.applyMatrix4( matrix ); + + this.setFromNormalAndCoplanarPoint( newNormal, newCoplanarPoint ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant = this.constant - offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + +}; + +// File:src/math/Math.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Math = { + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function () { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i === 8 || i === 13 || i === 18 || i === 23 ) { + + uuid[ i ] = '-'; + + } else if ( i === 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + + } + + return uuid.join( '' ); + + }; + + }(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random float from <0, 1> with 16 bits of randomness + // (standard Math.random() creates repetitive patterns when applied over larger space) + + random16: function () { + + return ( 65280 * Math.random() + 255 * Math.random() ) / 65535; + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function () { + + var degreeToRadiansFactor = Math.PI / 180; + + return function ( degrees ) { + + return degrees * degreeToRadiansFactor; + + }; + + }(), + + radToDeg: function () { + + var radianToDegreesFactor = 180 / Math.PI; + + return function ( radians ) { + + return radians * radianToDegreesFactor; + + }; + + }(), + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nearestPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + + } + +}; + +// File:src/math/Spline.js + +/** + * Spline from Tween.js, slightly optimized (and trashed) + * http://sole.github.com/tween.js/examples/05_spline.html + * + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Spline = function ( points ) { + + this.points = points; + + var c = [], v3 = { x: 0, y: 0, z: 0 }, + point, intPoint, weight, w2, w3, + pa, pb, pc, pd; + + this.initFromArray = function ( a ) { + + this.points = []; + + for ( var i = 0; i < a.length; i ++ ) { + + this.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] }; + + } + + }; + + this.getPoint = function ( k ) { + + point = ( this.points.length - 1 ) * k; + intPoint = Math.floor( point ); + weight = point - intPoint; + + c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1; + c[ 1 ] = intPoint; + c[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1; + c[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2; + + pa = this.points[ c[ 0 ] ]; + pb = this.points[ c[ 1 ] ]; + pc = this.points[ c[ 2 ] ]; + pd = this.points[ c[ 3 ] ]; + + w2 = weight * weight; + w3 = weight * w2; + + v3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 ); + v3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 ); + v3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 ); + + return v3; + + }; + + this.getControlPointsArray = function () { + + var i, p, l = this.points.length, + coords = []; + + for ( i = 0; i < l; i ++ ) { + + p = this.points[ i ]; + coords[ i ] = [ p.x, p.y, p.z ]; + + } + + return coords; + + }; + + // approximate length by summing linear segments + + this.getLength = function ( nSubDivisions ) { + + var i, index, nSamples, position, + point = 0, intPoint = 0, oldIntPoint = 0, + oldPosition = new THREE.Vector3(), + tmpVec = new THREE.Vector3(), + chunkLengths = [], + totalLength = 0; + + // first point has 0 length + + chunkLengths[ 0 ] = 0; + + if ( ! nSubDivisions ) nSubDivisions = 100; + + nSamples = this.points.length * nSubDivisions; + + oldPosition.copy( this.points[ 0 ] ); + + for ( i = 1; i < nSamples; i ++ ) { + + index = i / nSamples; + + position = this.getPoint( index ); + tmpVec.copy( position ); + + totalLength += tmpVec.distanceTo( oldPosition ); + + oldPosition.copy( position ); + + point = ( this.points.length - 1 ) * index; + intPoint = Math.floor( point ); + + if ( intPoint !== oldIntPoint ) { + + chunkLengths[ intPoint ] = totalLength; + oldIntPoint = intPoint; + + } + + } + + // last point ends with total length + + chunkLengths[ chunkLengths.length ] = totalLength; + + return { chunks: chunkLengths, total: totalLength }; + + }; + + this.reparametrizeByArcLength = function ( samplingCoef ) { + + var i, j, + index, indexCurrent, indexNext, + realDistance, + sampling, position, + newpoints = [], + tmpVec = new THREE.Vector3(), + sl = this.getLength(); + + newpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() ); + + for ( i = 1; i < this.points.length; i ++ ) { + + //tmpVec.copy( this.points[ i - 1 ] ); + //linearDistance = tmpVec.distanceTo( this.points[ i ] ); + + realDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ]; + + sampling = Math.ceil( samplingCoef * realDistance / sl.total ); + + indexCurrent = ( i - 1 ) / ( this.points.length - 1 ); + indexNext = i / ( this.points.length - 1 ); + + for ( j = 1; j < sampling - 1; j ++ ) { + + index = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent ); + + position = this.getPoint( index ); + newpoints.push( tmpVec.copy( position ).clone() ); + + } + + newpoints.push( tmpVec.copy( this.points[ i ] ).clone() ); + + } + + this.points = newpoints; + + }; + + // Catmull-Rom + + function interpolate( p0, p1, p2, p3, t, t2, t3 ) { + + var v0 = ( p2 - p0 ) * 0.5, + v1 = ( p3 - p1 ) * 0.5; + + return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + +}; + +// File:src/math/Triangle.js + +/** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Triangle = function ( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new THREE.Vector3(); + this.b = ( b !== undefined ) ? b : new THREE.Vector3(); + this.c = ( c !== undefined ) ? c : new THREE.Vector3(); + +}; + +THREE.Triangle.normal = function () { + + var v0 = new THREE.Vector3(); + + return function ( a, b, c, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + result.subVectors( c, b ); + v0.subVectors( a, b ); + result.cross( v0 ); + + var resultLengthSq = result.lengthSq(); + if ( resultLengthSq > 0 ) { + + return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); + + } + + return result.set( 0, 0, 0 ); + + }; + +}(); + +// static/instance method to calculate barycentric coordinates +// based on: http://www.blackpawn.com/texts/pointinpoly/default.html +THREE.Triangle.barycoordFromPoint = function () { + + var v0 = new THREE.Vector3(); + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + + return function ( point, a, b, c, optionalTarget ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + var result = optionalTarget || new THREE.Vector3(); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return result.set( 1 - u - v, v, u ); + + }; + +}(); + +THREE.Triangle.containsPoint = function () { + + var v1 = new THREE.Vector3(); + + return function ( point, a, b, c ) { + + var result = THREE.Triangle.barycoordFromPoint( point, a, b, c, v1 ); + + return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); + + }; + +}(); + +THREE.Triangle.prototype = { + + constructor: THREE.Triangle, + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + area: function () { + + var v0 = new THREE.Vector3(); + var v1 = new THREE.Vector3(); + + return function () { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + midpoint: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + normal: function ( optionalTarget ) { + + return THREE.Triangle.normal( this.a, this.b, this.c, optionalTarget ); + + }, + + plane: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Plane(); + + return result.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + barycoordFromPoint: function ( point, optionalTarget ) { + + return THREE.Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); + + }, + + containsPoint: function ( point ) { + + return THREE.Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + +}; + +// File:src/core/Channels.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Channels = function () { + + this.mask = 1; + +}; + +THREE.Channels.prototype = { + + constructor: THREE.Channels, + + set: function ( channel ) { + + this.mask = 1 << channel; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel ); + + } + +}; + +// File:src/core/Clock.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Clock = function ( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + +}; + +THREE.Clock.prototype = { + + constructor: THREE.Clock, + + start: function () { + + this.startTime = self.performance.now(); + + this.oldTime = this.startTime; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + + } + + if ( this.running ) { + + var newTime = self.performance.now(); + + diff = 0.001 * ( newTime - this.oldTime ); + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + +}; + +// File:src/core/EventDispatcher.js + +/** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + +THREE.EventDispatcher = function () {}; + +THREE.EventDispatcher.prototype = { + + constructor: THREE.EventDispatcher, + + apply: function ( object ) { + + object.addEventListener = THREE.EventDispatcher.prototype.addEventListener; + object.hasEventListener = THREE.EventDispatcher.prototype.hasEventListener; + object.removeEventListener = THREE.EventDispatcher.prototype.removeEventListener; + object.dispatchEvent = THREE.EventDispatcher.prototype.dispatchEvent; + + }, + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) { + + return true; + + } + + return false; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = []; + var length = listenerArray.length; + + for ( var i = 0; i < length; i ++ ) { + + array[ i ] = listenerArray[ i ]; + + } + + for ( var i = 0; i < length; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + +}; + +// File:src/core/Raycaster.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + +( function ( THREE ) { + + THREE.Raycaster = function ( origin, direction, near, far ) { + + this.ray = new THREE.Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + } + } + } ); + + }; + + function descSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + // + + THREE.Raycaster.prototype = { + + constructor: THREE.Raycaster, + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( camera instanceof THREE.PerspectiveCamera ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( camera instanceof THREE.OrthographicCamera ) { + + this.ray.origin.set( coords.x, coords.y, - 1 ).unproject( camera ); + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive ) { + + var intersects = []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( descSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive ) { + + var intersects = []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( descSort ); + + return intersects; + + } + + }; + +}( THREE ) ); + +// File:src/core/Object3D.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + +THREE.Object3D = function () { + + Object.defineProperty( this, 'id', { value: THREE.Object3DIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.channels = new THREE.Channels(); + this.children = []; + + this.up = THREE.Object3D.DefaultUp.clone(); + + var position = new THREE.Vector3(); + var rotation = new THREE.Euler(); + var quaternion = new THREE.Quaternion(); + var scale = new THREE.Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new THREE.Matrix4() + }, + normalMatrix: { + value: new THREE.Matrix3() + } + } ); + + this.rotationAutoUpdate = true; + + this.matrix = new THREE.Matrix4(); + this.matrixWorld = new THREE.Matrix4(); + + this.matrixAutoUpdate = THREE.Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + +}; + +THREE.Object3D.DefaultUp = new THREE.Vector3( 0, 1, 0 ); +THREE.Object3D.DefaultMatrixAutoUpdate = true; + +THREE.Object3D.prototype = { + + constructor: THREE.Object3D, + + get eulerOrder () { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + + return this.rotation.order; + + }, + + set eulerOrder ( value ) { + + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + + this.rotation.order = value; + + }, + + get useQuaternion () { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + + set useQuaternion ( value ) { + + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + + }, + + set renderDepth ( value ) { + + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + + }, + + // + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new THREE.Quaternion(); + + return function ( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new THREE.Vector3( 1, 0, 0 ); + + return function ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new THREE.Vector3( 0, 1, 0 ); + + return function ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new THREE.Vector3( 0, 0, 1 ); + + return function ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new THREE.Vector3(); + + return function ( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translate: function ( distance, axis ) { + + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + + }, + + translateX: function () { + + var v1 = new THREE.Vector3( 1, 0, 0 ); + + return function ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new THREE.Vector3( 0, 1, 0 ); + + return function ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new THREE.Vector3( 0, 0, 1 ); + + return function ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new THREE.Matrix4(); + + return function ( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This routine does not support objects with rotated and/or translated parent(s) + + var m1 = new THREE.Matrix4(); + + return function ( vector ) { + + m1.lookAt( vector, this.position, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( object instanceof THREE.Object3D ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + }, + + getChildByName: function ( name ) { + + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + this.updateMatrixWorld( true ); + + return result.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new THREE.Vector3(); + var scale = new THREE.Vector3(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Quaternion(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, result, scale ); + + return result; + + }; + + }(), + + getWorldRotation: function () { + + var quaternion = new THREE.Quaternion(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Euler(); + + this.getWorldQuaternion( quaternion ); + + return result.setFromQuaternion( quaternion, this.rotation.order, false ); + + }; + + }(), + + getWorldScale: function () { + + var position = new THREE.Vector3(); + var quaternion = new THREE.Quaternion(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, result ); + + return result; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new THREE.Quaternion(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate === true ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate === true || force === true ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + this.children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + var isRootObject = ( meta === undefined ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {} + }; + + output.metadata = { + version: 4.4, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + + object.matrix = this.matrix.toArray(); + + // + + if ( this.geometry !== undefined ) { + + if ( meta.geometries[ this.geometry.uuid ] === undefined ) { + + meta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta ); + + } + + object.geometry = this.geometry.uuid; + + } + + if ( this.material !== undefined ) { + + if ( meta.materials[ this.material.uuid ] === undefined ) { + + meta.materials[ this.material.uuid ] = this.material.toJSON( meta ); + + } + + object.material = this.material.uuid; + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache ( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.rotationAutoUpdate = source.rotationAutoUpdate; + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.Object3D.prototype ); + +THREE.Object3DIdCount = 0; + +// File:src/core/Face3.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Face3 = function ( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = color instanceof THREE.Color ? color : new THREE.Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + +}; + +THREE.Face3.prototype = { + + constructor: THREE.Face3, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + +}; + +// File:src/core/Face4.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) { + + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new THREE.Face3( a, b, c, normal, color, materialIndex ); + +}; + +// File:src/core/BufferAttribute.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.BufferAttribute = function ( array, itemSize ) { + + this.uuid = THREE.Math.generateUUID(); + + this.array = array; + this.itemSize = itemSize; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + +}; + +THREE.BufferAttribute.prototype = { + + constructor: THREE.BufferAttribute, + + get length() { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' ); + return this.array.length; + + }, + + get count() { + + return this.array.length / this.itemSize; + + }, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new THREE.Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyIndicesArray: function ( indices ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + var index = indices[ i ]; + + array[ offset ++ ] = index.a; + array[ offset ++ ] = index.b; + array[ offset ++ ] = index.c; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new THREE.Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new THREE.Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new THREE.Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +}; + +// + +THREE.Int8Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Int8Array( array ), itemSize ); + +}; + +THREE.Uint8Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Uint8Array( array ), itemSize ); + +}; + +THREE.Uint8ClampedAttribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Uint8ClampedArray( array ), itemSize ); + +}; + +THREE.Int16Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Int16Array( array ), itemSize ); + +}; + +THREE.Uint16Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Uint16Array( array ), itemSize ); + +}; + +THREE.Int32Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Int32Array( array ), itemSize ); + +}; + +THREE.Uint32Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Uint32Array( array ), itemSize ); + +}; + +THREE.Float32Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Float32Array( array ), itemSize ); + +}; + +THREE.Float64Attribute = function ( array, itemSize ) { + + return new THREE.BufferAttribute( new Float64Array( array ), itemSize ); + +}; + + +// Deprecated + +THREE.DynamicBufferAttribute = function ( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new THREE.BufferAttribute( array, itemSize ).setDynamic( true ); + +}; + +// File:src/core/InstancedBufferAttribute.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InstancedBufferAttribute = function ( array, itemSize, meshPerAttribute ) { + + THREE.BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + +}; + +THREE.InstancedBufferAttribute.prototype = Object.create( THREE.BufferAttribute.prototype ); +THREE.InstancedBufferAttribute.prototype.constructor = THREE.InstancedBufferAttribute; + +THREE.InstancedBufferAttribute.prototype.copy = function ( source ) { + + THREE.BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + +}; + +// File:src/core/InterleavedBuffer.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InterleavedBuffer = function ( array, stride ) { + + this.uuid = THREE.Math.generateUUID(); + + this.array = array; + this.stride = stride; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + +}; + +THREE.InterleavedBuffer.prototype = { + + constructor: THREE.InterleavedBuffer, + + get length () { + + return this.array.length; + + }, + + get count () { + + return this.array.length / this.stride; + + }, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.stride = source.stride; + this.dynamic = source.dynamic; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +}; + +// File:src/core/InstancedInterleavedBuffer.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InstancedInterleavedBuffer = function ( array, stride, meshPerAttribute ) { + + THREE.InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + +}; + +THREE.InstancedInterleavedBuffer.prototype = Object.create( THREE.InterleavedBuffer.prototype ); +THREE.InstancedInterleavedBuffer.prototype.constructor = THREE.InstancedInterleavedBuffer; + +THREE.InstancedInterleavedBuffer.prototype.copy = function ( source ) { + + THREE.InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + +}; + +// File:src/core/InterleavedBufferAttribute.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InterleavedBufferAttribute = function ( interleavedBuffer, itemSize, offset ) { + + this.uuid = THREE.Math.generateUUID(); + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + +}; + + +THREE.InterleavedBufferAttribute.prototype = { + + constructor: THREE.InterleavedBufferAttribute, + + get length() { + + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' ); + return this.array.length; + + }, + + get count() { + + return this.data.array.length / this.data.stride; + + }, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + +}; + +// File:src/core/Geometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + +THREE.Geometry = function () { + + Object.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [ [] ]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.elementsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + +}; + +THREE.Geometry.prototype = { + + constructor: THREE.Geometry, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new THREE.Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var vertices = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0, k = 0; i < vertices.length; i += 3, j += 2, k += 4 ) { + + scope.vertices.push( new THREE.Vector3( vertices[ i ], vertices[ i + 1 ], vertices[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new THREE.Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new THREE.Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new THREE.Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new THREE.Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new THREE.Face3( a, b, c, vertexNormals, vertexColors ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + }; + + if ( indices !== undefined ) { + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ] ); + + } + + } + + } else { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } + + } else { + + for ( var i = 0; i < vertices.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.center().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new THREE.Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new THREE.Vector3(), ab = new THREE.Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new THREE.Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new THREE.Vector3(), ab = new THREE.Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new THREE.Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new THREE.Vector3(); + vertexNormals = { a: new THREE.Vector3(), b: new THREE.Vector3(), c: new THREE.Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeTangents: function () { + + console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + + computeLineDistances: function () { + + var d = 0; + var vertices = this.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + if ( i > 0 ) { + + d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); + + } + + this.lineDistances[ i ] = d; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new THREE.Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new THREE.Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( geometry instanceof THREE.Geometry === false ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ]; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( mesh instanceof THREE.Mesh === false ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + mesh.matrixAutoUpdate && mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + var dupIndex = - 1; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + dupIndex = n; + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = false; // face.materialIndex !== undefined; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.vertices = []; + this.faces = []; + this.faceVertexUvs = [ [] ]; + + var vertices = source.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + var faces = source.faces; + + for ( var i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + for ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( var k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.Geometry.prototype ); + +THREE.GeometryIdCount = 0; + +// File:src/core/DirectGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.DirectGeometry = function () { + + Object.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'DirectGeometry'; + + this.indices = []; + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + +}; + +THREE.DirectGeometry.prototype = { + + constructor: THREE.DirectGeometry, + + computeBoundingBox: THREE.Geometry.prototype.computeBoundingBox, + computeBoundingSphere: THREE.Geometry.prototype.computeBoundingSphere, + + computeFaceNormals: function () { + + console.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' ); + + }, + + computeVertexNormals: function () { + + console.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' ); + + }, + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + if ( morphTargetsLength > 0 ) { + + var morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + if ( morphNormalsLength > 0 ) { + + var morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.DirectGeometry.prototype ); + +// File:src/core/BufferGeometry.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.BufferGeometry = function () { + + Object.defineProperty( this, 'id', { value: THREE.GeometryIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + +}; + +THREE.BufferGeometry.prototype = { + + constructor: THREE.BufferGeometry, + + addIndex: function ( index ) { + + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + + }, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + this.index = index; + + }, + + addAttribute: function ( name, attribute ) { + + if ( attribute instanceof THREE.BufferAttribute === false && attribute instanceof THREE.InterleavedBufferAttribute === false ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new THREE.BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + }, + + get drawcalls() { + + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + + }, + + get offsets() { + + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + + }, + + addDrawCall: function ( start, count, indexOffset ) { + + if ( indexOffset !== undefined ) { + + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + + } + + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + + }, + + clearDrawCalls: function () { + + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToVector3Array( position.array ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToVector3Array( normal.array ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new THREE.Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new THREE.Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.center().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( object instanceof THREE.Points || object instanceof THREE.Line ) { + + var positions = new THREE.Float32Attribute( geometry.vertices.length * 3, 3 ); + var colors = new THREE.Float32Attribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new THREE.Float32Attribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( object instanceof THREE.Mesh ) { + + if ( geometry instanceof THREE.Geometry ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( object instanceof THREE.Mesh ) { + + var direct = geometry.__directGeometry; + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + if ( geometry.verticesNeedUpdate === true ) { + + var attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + var attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + var attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + var attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + var attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new THREE.DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new THREE.BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + if ( geometry.indices.length > 0 ) { + + var TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array; + var indices = new TypeArray( geometry.indices.length * 3 ); + this.setIndex( new THREE.BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new THREE.Float32Attribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new THREE.Float32Attribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new THREE.Float32Attribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + var vector = new THREE.Vector3(); + + return function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new THREE.Box3(); + + } + + var positions = this.attributes.position.array; + + if ( positions ) { + + var bb = this.boundingBox; + bb.makeEmpty(); + + for ( var i = 0, il = positions.length; i < il; i += 3 ) { + + vector.fromArray( positions, i ); + bb.expandByPoint( vector ); + + } + + } + + if ( positions === undefined || positions.length === 0 ) { + + this.boundingBox.min.set( 0, 0, 0 ); + this.boundingBox.max.set( 0, 0, 0 ); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }; + + }(), + + computeBoundingSphere: function () { + + var box = new THREE.Box3(); + var vector = new THREE.Vector3(); + + return function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new THREE.Sphere(); + + } + + var positions = this.attributes.position.array; + + if ( positions ) { + + box.makeEmpty(); + + var center = this.boundingSphere.center; + + for ( var i = 0, il = positions.length; i < il; i += 3 ) { + + vector.fromArray( positions, i ); + box.expandByPoint( vector ); + + } + + box.center( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = positions.length; i < il; i += 3 ) { + + vector.fromArray( positions, i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var normals = attributes.normal.array; + + for ( var i = 0, il = normals.length; i < il; i ++ ) { + + normals[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC, + + pA = new THREE.Vector3(), + pB = new THREE.Vector3(), + pC = new THREE.Vector3(), + + cb = new THREE.Vector3(), + ab = new THREE.Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + computeTangents: function () { + + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + + }, + + computeOffsets: function ( size ) { + + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.') + + }, + + merge: function ( geometry, offset ) { + + if ( geometry instanceof THREE.BufferGeometry === false ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) offset = 0; + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var normals = this.attributes.normal.array; + + var x, y, z, n; + + for ( var i = 0, il = normals.length; i < il; i += 3 ) { + + x = normals[ i ]; + y = normals[ i + 1 ]; + z = normals[ i + 2 ]; + + n = 1.0 / Math.sqrt( x * x + y * y + z * z ); + + normals[ i ] *= n; + normals[ i + 1 ] *= n; + normals[ i + 2 ] *= n; + + } + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count ); + + } + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.BufferGeometry.prototype ); + +THREE.BufferGeometry.MaxIndex = 65535; + +// File:src/core/InstancedBufferGeometry.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.InstancedBufferGeometry = function () { + + THREE.BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + +}; + +THREE.InstancedBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.InstancedBufferGeometry.prototype.constructor = THREE.InstancedBufferGeometry; + +THREE.InstancedBufferGeometry.prototype.addGroup = function ( start, count, instances ) { + + this.groups.push( { + + start: start, + count: count, + instances: instances + + } ); + +}; + +THREE.InstancedBufferGeometry.prototype.copy = function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.instances ); + + } + + return this; + +}; + +THREE.EventDispatcher.prototype.apply( THREE.InstancedBufferGeometry.prototype ); + +// File:src/animation/AnimationAction.js + +/** + * + * A clip that has been explicitly scheduled. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.AnimationAction = function ( clip, startTime, timeScale, weight, loop ) { + + if ( clip === undefined ) throw new Error( 'clip is null' ); + this.clip = clip; + this.localRoot = null; + this.startTime = startTime || 0; + this.timeScale = timeScale || 1; + this.weight = weight || 1; + this.loop = loop || THREE.LoopRepeat; + this.loopCount = 0; + this.enabled = true; // allow for easy disabling of the action. + + this.actionTime = - this.startTime; + this.clipTime = 0; + + this.propertyBindings = []; +}; + +/* +THREE.LoopOnce = 2200; +THREE.LoopRepeat = 2201; +THREE.LoopPingPing = 2202; +*/ + +THREE.AnimationAction.prototype = { + + constructor: THREE.AnimationAction, + + setLocalRoot: function( localRoot ) { + + this.localRoot = localRoot; + + return this; + + }, + + updateTime: function( clipDeltaTime ) { + + var previousClipTime = this.clipTime; + var previousLoopCount = this.loopCount; + var previousActionTime = this.actionTime; + + var duration = this.clip.duration; + + this.actionTime = this.actionTime + clipDeltaTime; + + if ( this.loop === THREE.LoopOnce ) { + + this.loopCount = 0; + this.clipTime = Math.min( Math.max( this.actionTime, 0 ), duration ); + + // if time is changed since last time, see if we have hit a start/end limit + if ( this.clipTime !== previousClipTime ) { + + if ( this.clipTime === duration ) { + + this.mixer.dispatchEvent( { type: 'finished', action: this, direction: 1 } ); + + } else if ( this.clipTime === 0 ) { + + this.mixer.dispatchEvent( { type: 'finished', action: this, direction: -1 } ); + + } + + } + + + return this.clipTime; + + } + + this.loopCount = Math.floor( this.actionTime / duration ); + + var newClipTime = this.actionTime - this.loopCount * duration; + newClipTime = newClipTime % duration; + + // if we are ping pong looping, ensure that we go backwards when appropriate + if ( this.loop == THREE.LoopPingPong ) { + + if ( Math.abs( this.loopCount % 2 ) === 1 ) { + + newClipTime = duration - newClipTime; + + } + + } + + this.clipTime = newClipTime; + + if ( this.loopCount !== previousLoopCount ) { + + this.mixer.dispatchEvent( { type: 'loop', action: this, loopDelta: ( this.loopCount - this.loopCount ) } ); + + } + + return this.clipTime; + + }, + + syncWith: function( action ) { + + this.actionTime = action.actionTime; + this.timeScale = action.timeScale; + + return this; + }, + + warpToDuration: function( duration ) { + + this.timeScale = this.clip.duration / duration; + + return this; + }, + + init: function( time ) { + + this.clipTime = time - this.startTime; + + return this; + + }, + + update: function( clipDeltaTime ) { + + this.updateTime( clipDeltaTime ); + + var clipResults = this.clip.getAt( this.clipTime ); + + return clipResults; + + }, + + getTimeScaleAt: function( time ) { + + if ( this.timeScale.getAt ) { + // pass in time, not clip time, allows for fadein/fadeout across multiple loops of the clip + return this.timeScale.getAt( time ); + + } + + return this.timeScale; + + }, + + getWeightAt: function( time ) { + + if ( this.weight.getAt ) { + // pass in time, not clip time, allows for fadein/fadeout across multiple loops of the clip + return this.weight.getAt( time ); + + } + + return this.weight; + + } + +}; + +// File:src/animation/AnimationClip.js + +/** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.AnimationClip = function ( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : -1; + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + for ( var i = 0; i < this.tracks.length; i ++ ) { + var track = this.tracks[i]; + this.duration = Math.max( track.keys[ track.keys.length - 1 ].time ); + } + } + + // maybe only do these on demand, as doing them here could potentially slow down loading + // but leaving these here during development as this ensures a lot of testing of these functions + this.trim(); + this.optimize(); + + this.results = []; + +}; + +THREE.AnimationClip.prototype = { + + constructor: THREE.AnimationClip, + + getAt: function( clipTime ) { + + clipTime = Math.max( 0, Math.min( clipTime, this.duration ) ); + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + var track = this.tracks[ i ]; + + this.results[ i ] = track.getAt( clipTime ); + + } + + return this.results; + }, + + trim: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + +}; + + +THREE.AnimationClip.CreateFromMorphTargetSequence = function( name, morphTargetSequence, fps ) { + + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var keys = []; + + keys.push( { time: ( i + numMorphTargets - 1 ) % numMorphTargets, value: 0 } ); + keys.push( { time: i, value: 1 } ); + keys.push( { time: ( i + 1 ) % numMorphTargets, value: 0 } ); + + keys.sort( THREE.KeyframeTrack.keyComparer ); + + // if there is a key at the first frame, duplicate it as the last frame as well for perfect loop. + if ( keys[0].time === 0 ) { + keys.push( { + time: numMorphTargets, + value: keys[0].value + }); + } + + tracks.push( new THREE.NumberKeyframeTrack( '.morphTargetInfluences[' + morphTargetSequence[i].name + ']', keys ).scale( 1.0 / fps ) ); + } + + return new THREE.AnimationClip( name, -1, tracks ); + +}; + +THREE.AnimationClip.findByName = function( clipArray, name ) { + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[i].name === name ) { + + return clipArray[i]; + + } + } + + return null; + +}; + +THREE.AnimationClip.CreateClipsFromMorphTargetSequences = function( morphTargets, fps ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + animationToMorphTargets[ name ] = animationMorphTargets = []; + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( THREE.AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps ) ); + } + + return clips; + +}; + +// parse the standard JSON format for clips +THREE.AnimationClip.parse = function( json ) { + + var tracks = []; + + for ( var i = 0; i < json.tracks.length; i ++ ) { + + tracks.push( THREE.KeyframeTrack.parse( json.tracks[i] ).scale( 1.0 / json.fps ) ); + + } + + return new THREE.AnimationClip( json.name, json.duration, tracks ); + +}; + + +// parse the animation.hierarchy format +THREE.AnimationClip.parseAnimation = function( animation, bones, nodeName ) { + + if ( ! animation ) { + console.error( " no animation in JSONLoader data" ); + return null; + } + + var convertTrack = function( trackName, animationKeys, propertyName, trackType, animationKeyToValueFunc ) { + + var keys = []; + + for ( var k = 0; k < animationKeys.length; k ++ ) { + + var animationKey = animationKeys[k]; + + if ( animationKey[propertyName] !== undefined ) { + + keys.push( { time: animationKey.time, value: animationKeyToValueFunc( animationKey ) } ); + } + + } + + // only return track if there are actually keys. + if ( keys.length > 0 ) { + + return new trackType( trackName, keys ); + + } + + return null; + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + var duration = animation.length || -1; // automatic length determination in AnimationClip. + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length == 0 ) { + continue; + } + + // process morph targets in a way exactly compatible with AnimationHandler.init( animation ) + if ( animationKeys[0].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[k].morphTargets ) { + for ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[k].morphTargets[m] ] = -1; + } + } + + } + + // create a track for each morph target with all zero morphTargetInfluences except for the keys in which the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var keys = []; + + for ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) { + + var animationKey = animationKeys[k]; + + keys.push( { + time: animationKey.time, + value: (( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ) + }); + + } + + tracks.push( new THREE.NumberKeyframeTrack( nodeName + '.morphTargetInfluence[' + morphTargetName + ']', keys ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + + var boneName = nodeName + '.bones[' + bones[ h ].name + ']'; + + // track contains positions... + var positionTrack = convertTrack( boneName + '.position', animationKeys, 'pos', THREE.VectorKeyframeTrack, function( animationKey ) { + return new THREE.Vector3().fromArray( animationKey.pos ) + } ); + + if ( positionTrack ) tracks.push( positionTrack ); + + // track contains quaternions... + var quaternionTrack = convertTrack( boneName + '.quaternion', animationKeys, 'rot', THREE.QuaternionKeyframeTrack, function( animationKey ) { + if ( animationKey.rot.slerp ) { + return animationKey.rot.clone(); + } else { + return new THREE.Quaternion().fromArray( animationKey.rot ); + } + } ); + + if ( quaternionTrack ) tracks.push( quaternionTrack ); + + // track contains quaternions... + var scaleTrack = convertTrack( boneName + '.scale', animationKeys, 'scl', THREE.VectorKeyframeTrack, function( animationKey ) { + return new THREE.Vector3().fromArray( animationKey.scl ) + } ); + + if ( scaleTrack ) tracks.push( scaleTrack ); + + } + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new THREE.AnimationClip( clipName, duration, tracks ); + + return clip; + +}; + +// File:src/animation/AnimationMixer.js + +/** + * + * Mixes together the AnimationClips scheduled by AnimationActions and applies them to the root and subtree + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.AnimationMixer = function( root ) { + + this.root = root; + this.time = 0; + this.timeScale = 1.0; + this.actions = []; + this.propertyBindingMap = {}; + +}; + +THREE.AnimationMixer.prototype = { + + constructor: THREE.AnimationMixer, + + addAction: function( action ) { + + // TODO: check for duplicate action names? Or provide each action with a UUID? + + this.actions.push( action ); + action.init( this.time ); + action.mixer = this; + + var tracks = action.clip.tracks; + + var root = action.localRoot || this.root; + + for ( var i = 0; i < tracks.length; i ++ ) { + + var track = tracks[ i ]; + + var propertyBindingKey = root.uuid + '-' + track.name; + var propertyBinding = this.propertyBindingMap[ propertyBindingKey ]; + + if ( propertyBinding === undefined ) { + + propertyBinding = new THREE.PropertyBinding( root, track.name ); + this.propertyBindingMap[ propertyBindingKey ] = propertyBinding; + + } + + // push in the same order as the tracks. + action.propertyBindings.push( propertyBinding ); + + // track usages of shared property bindings, because if we leave too many around, the mixer can get slow + propertyBinding.referenceCount += 1; + + } + + }, + + removeAllActions: function() { + + for ( var i = 0; i < this.actions.length; i ++ ) { + + this.actions[i].mixer = null; + + } + + // unbind all property bindings + for ( var properyBindingKey in this.propertyBindingMap ) { + + this.propertyBindingMap[ properyBindingKey ].unbind(); + + } + + this.actions = []; + this.propertyBindingMap = {}; + + return this; + + }, + + removeAction: function( action ) { + + var index = this.actions.indexOf( action ); + + if ( index !== - 1 ) { + + this.actions.splice( index, 1 ); + action.mixer = null; + + } + + + // remove unused property bindings because if we leave them around the mixer can get slow + var root = action.localRoot || this.root; + var tracks = action.clip.tracks; + + for ( var i = 0; i < tracks.length; i ++ ) { + + var track = tracks[ i ]; + + var propertyBindingKey = root.uuid + '-' + track.name; + var propertyBinding = this.propertyBindingMap[ propertyBindingKey ]; + + propertyBinding.referenceCount -= 1; + + if ( propertyBinding.referenceCount <= 0 ) { + + propertyBinding.unbind(); + + delete this.propertyBindingMap[ propertyBindingKey ]; + + } + } + + return this; + + }, + + // can be optimized if needed + findActionByName: function( name ) { + + for ( var i = 0; i < this.actions.length; i ++ ) { + + if ( this.actions[i].name === name ) return this.actions[i]; + + } + + return null; + + }, + + play: function( action, optionalFadeInDuration ) { + + action.startTime = this.time; + this.addAction( action ); + + return this; + + }, + + fadeOut: function( action, duration ) { + + var keys = []; + + keys.push( { time: this.time, value: 1 } ); + keys.push( { time: this.time + duration, value: 0 } ); + + action.weight = new THREE.NumberKeyframeTrack( "weight", keys ); + + return this; + + }, + + fadeIn: function( action, duration ) { + + var keys = []; + + keys.push( { time: this.time, value: 0 } ); + keys.push( { time: this.time + duration, value: 1 } ); + + action.weight = new THREE.NumberKeyframeTrack( "weight", keys ); + + return this; + + }, + + warp: function( action, startTimeScale, endTimeScale, duration ) { + + var keys = []; + + keys.push( { time: this.time, value: startTimeScale } ); + keys.push( { time: this.time + duration, value: endTimeScale } ); + + action.timeScale = new THREE.NumberKeyframeTrack( "timeScale", keys ); + + return this; + + }, + + crossFade: function( fadeOutAction, fadeInAction, duration, warp ) { + + this.fadeOut( fadeOutAction, duration ); + this.fadeIn( fadeInAction, duration ); + + if ( warp ) { + + var startEndRatio = fadeOutAction.clip.duration / fadeInAction.clip.duration; + var endStartRatio = 1.0 / startEndRatio; + + this.warp( fadeOutAction, 1.0, startEndRatio, duration ); + this.warp( fadeInAction, endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + update: function( deltaTime ) { + + var mixerDeltaTime = deltaTime * this.timeScale; + this.time += mixerDeltaTime; + + for ( var i = 0; i < this.actions.length; i ++ ) { + + var action = this.actions[i]; + + var weight = action.getWeightAt( this.time ); + + var actionTimeScale = action.getTimeScaleAt( this.time ); + var actionDeltaTime = mixerDeltaTime * actionTimeScale; + + var actionResults = action.update( actionDeltaTime ); + + if ( action.weight <= 0 || ! action.enabled ) continue; + + for ( var j = 0; j < actionResults.length; j ++ ) { + + var name = action.clip.tracks[j].name; + + action.propertyBindings[ j ].accumulate( actionResults[j], weight ); + + } + + } + + // apply to nodes + for ( var propertyBindingKey in this.propertyBindingMap ) { + + this.propertyBindingMap[ propertyBindingKey ].apply(); + + } + + return this; + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.AnimationMixer.prototype ); + +// File:src/animation/AnimationUtils.js + +/** + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.AnimationUtils = { + + getEqualsFunc: function( exemplarValue ) { + + if ( exemplarValue.equals ) { + return function equals_object( a, b ) { + return a.equals( b ); + } + } + + return function equals_primitive( a, b ) { + return ( a === b ); + }; + + }, + + clone: function( exemplarValue ) { + + var typeName = typeof exemplarValue; + if ( typeName === "object" ) { + if ( exemplarValue.clone ) { + return exemplarValue.clone(); + } + console.error( "can not figure out how to copy exemplarValue", exemplarValue ); + } + + return exemplarValue; + + }, + + lerp: function( a, b, alpha, interTrack ) { + + var lerpFunc = THREE.AnimationUtils.getLerpFunc( a, interTrack ); + + return lerpFunc( a, b, alpha ); + + }, + + lerp_object: function( a, b, alpha ) { + return a.lerp( b, alpha ); + }, + + slerp_object: function( a, b, alpha ) { + return a.slerp( b, alpha ); + }, + + lerp_number: function( a, b, alpha ) { + return a * ( 1 - alpha ) + b * alpha; + }, + + lerp_boolean: function( a, b, alpha ) { + return ( alpha < 0.5 ) ? a : b; + }, + + lerp_boolean_immediate: function( a, b, alpha ) { + return a; + }, + + lerp_string: function( a, b, alpha ) { + return ( alpha < 0.5 ) ? a : b; + }, + + lerp_string_immediate: function( a, b, alpha ) { + return a; + }, + + // NOTE: this is an accumulator function that modifies the first argument (e.g. a). This is to minimize memory alocations. + getLerpFunc: function( exemplarValue, interTrack ) { + + if ( exemplarValue === undefined || exemplarValue === null ) throw new Error( "examplarValue is null" ); + + var typeName = typeof exemplarValue; + + switch( typeName ) { + + case "object": + if ( exemplarValue.lerp ) { + return THREE.AnimationUtils.lerp_object; + } + + if ( exemplarValue.slerp ) { + return THREE.AnimationUtils.slerp_object; + } + break; + + case "number": + return THREE.AnimationUtils.lerp_number; + + case "boolean": + if ( interTrack ) { + return THREE.AnimationUtils.lerp_boolean; + } else { + return THREE.AnimationUtils.lerp_boolean_immediate; + } + + case "string": + if ( interTrack ) { + return THREE.AnimationUtils.lerp_string; + } else { + return THREE.AnimationUtils.lerp_string_immediate; + } + + } + + } + +}; + +// File:src/animation/KeyframeTrack.js + +/** + * + * A Track that returns a keyframe interpolated value, currently linearly interpolated + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.KeyframeTrack = function ( name, keys ) { + + if ( name === undefined ) throw new Error( "track name is undefined" ); + if ( keys === undefined || keys.length === 0 ) throw new Error( "no keys in track named " + name ); + + this.name = name; + this.keys = keys; // time in seconds, value as value + + // the index of the last result, used as a starting point for local search. + this.lastIndex = 0; + + this.validate(); + this.optimize(); + +}; + +THREE.KeyframeTrack.prototype = { + + constructor: THREE.KeyframeTrack, + + getAt: function( time ) { + + + // this can not go higher than this.keys.length. + while( ( this.lastIndex < this.keys.length ) && ( time >= this.keys[this.lastIndex].time ) ) { + this.lastIndex ++; + }; + + // this can not go lower than 0. + while( ( this.lastIndex > 0 ) && ( time < this.keys[this.lastIndex - 1].time ) ) { + this.lastIndex --; + } + + if ( this.lastIndex >= this.keys.length ) { + + this.setResult( this.keys[ this.keys.length - 1 ].value ); + + return this.result; + + } + + if ( this.lastIndex === 0 ) { + + this.setResult( this.keys[ 0 ].value ); + + return this.result; + + } + + var prevKey = this.keys[ this.lastIndex - 1 ]; + this.setResult( prevKey.value ); + + // if true, means that prev/current keys are identical, thus no interpolation required. + if ( prevKey.constantToNext ) { + + return this.result; + + } + + // linear interpolation to start with + var currentKey = this.keys[ this.lastIndex ]; + var alpha = ( time - prevKey.time ) / ( currentKey.time - prevKey.time ); + this.result = this.lerpValues( this.result, currentKey.value, alpha ); + + return this.result; + + }, + + // move all keyframes either forwards or backwards in time + shift: function( timeOffset ) { + + if ( timeOffset !== 0.0 ) { + + for ( var i = 0; i < this.keys.length; i ++ ) { + this.keys[i].time += timeOffset; + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function( timeScale ) { + + if ( timeScale !== 1.0 ) { + + for ( var i = 0; i < this.keys.length; i ++ ) { + this.keys[i].time *= timeScale; + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function( startTime, endTime ) { + + var firstKeysToRemove = 0; + for ( var i = 1; i < this.keys.length; i ++ ) { + if ( this.keys[i] <= startTime ) { + firstKeysToRemove ++; + } + } + + var lastKeysToRemove = 0; + for ( var i = this.keys.length - 2; i > 0; i ++ ) { + if ( this.keys[i] >= endTime ) { + lastKeysToRemove ++; + } else { + break; + } + } + + // remove last keys first because it doesn't affect the position of the first keys (the otherway around doesn't work as easily) + if ( ( firstKeysToRemove + lastKeysToRemove ) > 0 ) { + this.keys = this.keys.splice( firstKeysToRemove, this.keys.length - lastKeysToRemove - firstKeysToRemove );; + } + + return this; + + }, + + /* NOTE: This is commented out because we really shouldn't have to handle unsorted key lists + Tracks with out of order keys should be considered to be invalid. - bhouston + sort: function() { + + this.keys.sort( THREE.KeyframeTrack.keyComparer ); + + return this; + + },*/ + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + // One could eventually ensure that all key.values in a track are all of the same type (otherwise interpolation makes no sense.) + validate: function() { + + var prevKey = null; + + if ( this.keys.length === 0 ) { + console.error( " track is empty, no keys", this ); + return; + } + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var currKey = this.keys[i]; + + if ( ! currKey ) { + console.error( " key is null in track", this, i ); + return; + } + + if ( ( typeof currKey.time ) !== 'number' || isNaN( currKey.time ) ) { + console.error( " key.time is not a valid number", this, i, currKey ); + return; + } + + if ( currKey.value === undefined || currKey.value === null) { + console.error( " key.value is null in track", this, i, currKey ); + return; + } + + if ( prevKey && prevKey.time > currKey.time ) { + console.error( " key.time is less than previous key time, out of order keys", this, i, currKey, prevKey ); + return; + } + + prevKey = currKey; + + } + + return this; + + }, + + // currently only removes equivalent sequential keys (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0), which are common in morph target animations + optimize: function() { + + var newKeys = []; + var prevKey = this.keys[0]; + newKeys.push( prevKey ); + + var equalsFunc = THREE.AnimationUtils.getEqualsFunc( prevKey.value ); + + for ( var i = 1; i < this.keys.length - 1; i ++ ) { + var currKey = this.keys[i]; + var nextKey = this.keys[i+1]; + + // if prevKey & currKey are the same time, remove currKey. If you want immediate adjacent keys, use an epsilon offset + // it is not possible to have two keys at the same time as we sort them. The sort is not stable on keys with the same time. + if ( ( prevKey.time === currKey.time ) ) { + + continue; + + } + + // remove completely unnecessary keyframes that are the same as their prev and next keys + if ( this.compareValues( prevKey.value, currKey.value ) && this.compareValues( currKey.value, nextKey.value ) ) { + + continue; + + } + + // determine if interpolation is required + prevKey.constantToNext = this.compareValues( prevKey.value, currKey.value ); + + newKeys.push( currKey ); + prevKey = currKey; + } + newKeys.push( this.keys[ this.keys.length - 1 ] ); + + this.keys = newKeys; + + return this; + + } + +}; + +THREE.KeyframeTrack.keyComparer = function keyComparator(key0, key1) { + return key0.time - key1.time; +}; + +THREE.KeyframeTrack.parse = function( json ) { + + if ( json.type === undefined ) throw new Error( "track type undefined, can not parse" ); + + var trackType = THREE.KeyframeTrack.GetTrackTypeForTypeName( json.type ); + + return trackType.parse( json ); + +}; + +THREE.KeyframeTrack.GetTrackTypeForTypeName = function( typeName ) { + switch( typeName.toLowerCase() ) { + case "vector": + case "vector2": + case "vector3": + case "vector4": + return THREE.VectorKeyframeTrack; + + case "quaternion": + return THREE.QuaternionKeyframeTrack; + + case "integer": + case "scalar": + case "double": + case "float": + case "number": + return THREE.NumberKeyframeTrack; + + case "bool": + case "boolean": + return THREE.BooleanKeyframeTrack; + + case "string": + return THREE.StringKeyframeTrack; + }; + + throw new Error( "Unsupported typeName: " + typeName ); +}; + +// File:src/animation/PropertyBinding.js + +/** + * + * A track bound to a real value in the scene graph. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.PropertyBinding = function ( rootNode, trackName ) { + + this.rootNode = rootNode; + this.trackName = trackName; + this.referenceCount = 0; + this.originalValue = null; // the value of the property before it was controlled by this binding + + var parseResults = THREE.PropertyBinding.parseTrackName( trackName ); + + this.directoryName = parseResults.directoryName; + this.nodeName = parseResults.nodeName; + this.objectName = parseResults.objectName; + this.objectIndex = parseResults.objectIndex; + this.propertyName = parseResults.propertyName; + this.propertyIndex = parseResults.propertyIndex; + + this.node = THREE.PropertyBinding.findNode( rootNode, this.nodeName ) || rootNode; + + this.cumulativeValue = null; + this.cumulativeWeight = 0; +}; + +THREE.PropertyBinding.prototype = { + + constructor: THREE.PropertyBinding, + + reset: function() { + + this.cumulativeValue = null; + this.cumulativeWeight = 0; + + }, + + accumulate: function( value, weight ) { + + if ( ! this.isBound ) this.bind(); + + if ( this.cumulativeWeight === 0 ) { + + if ( weight > 0 ) { + + if ( this.cumulativeValue === null ) { + this.cumulativeValue = THREE.AnimationUtils.clone( value ); + } + this.cumulativeWeight = weight; + + } + + } else { + + var lerpAlpha = weight / ( this.cumulativeWeight + weight ); + this.cumulativeValue = this.lerpValue( this.cumulativeValue, value, lerpAlpha ); + this.cumulativeWeight += weight; + + } + + }, + + unbind: function() { + + if ( ! this.isBound ) return; + + this.setValue( this.originalValue ); + + this.setValue = null; + this.getValue = null; + this.lerpValue = null; + this.equalsValue = null; + this.triggerDirty = null; + this.isBound = false; + + }, + + // bind to the real property in the scene graph, remember original value, memorize various accessors for speed/inefficiency + bind: function() { + + if ( this.isBound ) return; + + var targetObject = this.node; + + // ensure there is a value node + if ( ! targetObject ) { + console.error( " trying to update node for track: " + this.trackName + " but it wasn't found." ); + return; + } + + if ( this.objectName ) { + // special case were we need to reach deeper into the hierarchy to get the face materials.... + if ( this.objectName === "materials" ) { + if ( ! targetObject.material ) { + console.error( ' can not bind to material as node does not have a material', this ); + return; + } + if ( ! targetObject.material.materials ) { + console.error( ' can not bind to material.materials as node.material does not have a materials array', this ); + return; + } + targetObject = targetObject.material.materials; + } else if ( this.objectName === "bones" ) { + if ( ! targetObject.skeleton ) { + console.error( ' can not bind to bones as node does not have a skeleton', this ); + return; + } + // potential future optimization: skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + if ( targetObject[i].name === this.objectIndex ) { + this.objectIndex = i; + break; + } + } + } else { + + if ( targetObject[ this.objectName ] === undefined ) { + console.error( ' can not bind to objectName of node, undefined', this ); + return; + } + targetObject = targetObject[ this.objectName ]; + } + + if ( this.objectIndex !== undefined ) { + if ( targetObject[ this.objectIndex ] === undefined ) { + console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject ); + return; + } + + targetObject = targetObject[ this.objectIndex ]; + } + + } + + // special case mappings + var nodeProperty = targetObject[ this.propertyName ]; + if ( ! nodeProperty ) { + console.error( " trying to update property for track: " + this.nodeName + '.' + this.propertyName + " but it wasn't found.", targetObject ); + return; + } + + // access a sub element of the property array (only primitives are supported right now) + if ( this.propertyIndex !== undefined ) { + + if ( this.propertyName === "morphTargetInfluences" ) { + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); + } + if ( ! targetObject.geometry.morphTargets ) { + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this ); + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + if ( targetObject.geometry.morphTargets[i].name === this.propertyIndex ) { + this.propertyIndex = i; + break; + } + } + } + + this.setValue = function setValue_propertyIndexed( value ) { + if ( ! this.equalsValue( nodeProperty[ this.propertyIndex ], value ) ) { + nodeProperty[ this.propertyIndex ] = value; + return true; + } + return false; + }; + + this.getValue = function getValue_propertyIndexed() { + return nodeProperty[ this.propertyIndex ]; + }; + + } + // must use copy for Object3D.Euler/Quaternion + else if ( nodeProperty.copy ) { + + this.setValue = function setValue_propertyObject( value ) { + if ( ! this.equalsValue( nodeProperty, value ) ) { + nodeProperty.copy( value ); + return true; + } + return false; + } + + this.getValue = function getValue_propertyObject() { + return nodeProperty; + }; + + } + // otherwise just set the property directly on the node (do not use nodeProperty as it may not be a reference object) + else { + + this.setValue = function setValue_property( value ) { + if ( ! this.equalsValue( targetObject[ this.propertyName ], value ) ) { + targetObject[ this.propertyName ] = value; + return true; + } + return false; + } + + this.getValue = function getValue_property() { + return targetObject[ this.propertyName ]; + }; + + } + + // trigger node dirty + if ( targetObject.needsUpdate !== undefined ) { // material + + this.triggerDirty = function triggerDirty_needsUpdate() { + this.node.needsUpdate = true; + } + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + this.triggerDirty = function triggerDirty_matrixWorldNeedsUpdate() { + targetObject.matrixWorldNeedsUpdate = true; + } + + } + + this.originalValue = this.getValue(); + + this.equalsValue = THREE.AnimationUtils.getEqualsFunc( this.originalValue ); + this.lerpValue = THREE.AnimationUtils.getLerpFunc( this.originalValue, true ); + + this.isBound = true; + + }, + + apply: function() { + + // for speed capture the setter pattern as a closure (sort of a memoization pattern: https://en.wikipedia.org/wiki/Memoization) + if ( ! this.isBound ) this.bind(); + + // early exit if there is nothing to apply. + if ( this.cumulativeWeight > 0 ) { + + // blend with original value + if ( this.cumulativeWeight < 1 ) { + + var remainingWeight = 1 - this.cumulativeWeight; + var lerpAlpha = remainingWeight / ( this.cumulativeWeight + remainingWeight ); + this.cumulativeValue = this.lerpValue( this.cumulativeValue, this.originalValue, lerpAlpha ); + + } + + var valueChanged = this.setValue( this.cumulativeValue ); + + if ( valueChanged && this.triggerDirty ) { + this.triggerDirty(); + } + + // reset accumulator + this.cumulativeValue = null; + this.cumulativeWeight = 0; + + } + } + +}; + + +THREE.PropertyBinding.parseTrackName = function( trackName ) { + + // matches strings in the form of: + // nodeName.property + // nodeName.property[accessor] + // nodeName.material.property[accessor] + // uuid.property[accessor] + // uuid.objectName[objectIndex].propertyName[propertyIndex] + // parentName/nodeName.property + // parentName/parentName/nodeName.property[index] + // .bone[Armature.DEF_cog].position + // created and tested via https://regex101.com/#javascript + + var re = /^(([\w]+\/)*)([\w-\d]+)?(\.([\w]+)(\[([\w\d\[\]\_. ]+)\])?)?(\.([\w.]+)(\[([\w\d\[\]\_. ]+)\])?)$/; + var matches = re.exec(trackName); + + if ( ! matches ) { + throw new Error( "cannot parse trackName at all: " + trackName ); + } + + if (matches.index === re.lastIndex) { + re.lastIndex++; + } + + var results = { + directoryName: matches[1], + nodeName: matches[3], // allowed to be null, specified root node. + objectName: matches[5], + objectIndex: matches[7], + propertyName: matches[9], + propertyIndex: matches[11] // allowed to be null, specifies that the whole property is set. + }; + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + throw new Error( "can not parse propertyName from trackName: " + trackName ); + } + + return results; + +}; + +THREE.PropertyBinding.findNode = function( root, nodeName ) { + + function searchSkeleton( skeleton ) { + + for ( var i = 0; i < skeleton.bones.length; i ++ ) { + + var bone = skeleton.bones[i]; + + if ( bone.name === nodeName ) { + + return bone; + + } + } + + return null; + + } + + function searchNodeSubtree( children ) { + + for ( var i = 0; i < children.length; i ++ ) { + + var childNode = children[i]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + } + + // + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var bone = searchSkeleton( root.skeleton ); + + if ( bone ) { + + return bone; + + } + } + + // search into node subtree. + if ( root.children ) { + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; +} + +// File:src/animation/tracks/VectorKeyframeTrack.js + +/** + * + * A Track that interpolates Vectors + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.VectorKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value.clone(); + +}; + +THREE.VectorKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.VectorKeyframeTrack.prototype.constructor = THREE.VectorKeyframeTrack; + +THREE.VectorKeyframeTrack.prototype.setResult = function( value ) { + + this.result.copy( value ); + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.VectorKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return value0.lerp( value1, alpha ); + +}; + +THREE.VectorKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return value0.equals( value1 ); + +}; + +THREE.VectorKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value.clone() + } ); + } + + return new THREE.VectorKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.VectorKeyframeTrack.parse = function( json ) { + + var elementCount = json.keys[0].value.length; + var valueType = THREE[ 'Vector' + elementCount ]; + + var keys = []; + + for ( var i = 0; i < json.keys.length; i ++ ) { + var jsonKey = json.keys[i]; + keys.push( { + value: new valueType().fromArray( jsonKey.value ), + time: jsonKey.time + } ); + } + + return new THREE.VectorKeyframeTrack( json.name, keys ); + +}; + +// File:src/animation/tracks/QuaternionKeyframeTrack.js + +/** + * + * A Track that interpolates Quaternion + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.QuaternionKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value.clone(); + +}; + +THREE.QuaternionKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.QuaternionKeyframeTrack.prototype.constructor = THREE.QuaternionKeyframeTrack; + +THREE.QuaternionKeyframeTrack.prototype.setResult = function( value ) { + + this.result.copy( value ); + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.QuaternionKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return value0.slerp( value1, alpha ); + +}; + +THREE.QuaternionKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return value0.equals( value1 ); + +}; + +THREE.QuaternionKeyframeTrack.prototype.multiply = function( quat ) { + + for ( var i = 0; i < this.keys.length; i ++ ) { + + this.keys[i].value.multiply( quat ); + + } + + return this; + +}; + +THREE.QuaternionKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value.clone() + } ); + } + + return new THREE.QuaternionKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.QuaternionKeyframeTrack.parse = function( json ) { + + var keys = []; + + for ( var i = 0; i < json.keys.length; i ++ ) { + var jsonKey = json.keys[i]; + keys.push( { + value: new THREE.Quaternion().fromArray( jsonKey.value ), + time: jsonKey.time + } ); + } + + return new THREE.QuaternionKeyframeTrack( json.name, keys ); + +}; + +// File:src/animation/tracks/StringKeyframeTrack.js + +/** + * + * A Track that interpolates Strings + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.StringKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value; + +}; + +THREE.StringKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.StringKeyframeTrack.prototype.constructor = THREE.StringKeyframeTrack; + +THREE.StringKeyframeTrack.prototype.setResult = function( value ) { + + this.result = value; + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.StringKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return ( alpha < 1.0 ) ? value0 : value1; + +}; + +THREE.StringKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return ( value0 === value1 ); + +}; + +THREE.StringKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value + } ); + } + + return new THREE.StringKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.StringKeyframeTrack.parse = function( json ) { + + return new THREE.StringKeyframeTrack( json.name, json.keys ); + +}; + +// File:src/animation/tracks/BooleanKeyframeTrack.js + +/** + * + * A Track that interpolates Boolean + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.BooleanKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value; + +}; + +THREE.BooleanKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.BooleanKeyframeTrack.prototype.constructor = THREE.BooleanKeyframeTrack; + +THREE.BooleanKeyframeTrack.prototype.setResult = function( value ) { + + this.result = value; + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.BooleanKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return ( alpha < 1.0 ) ? value0 : value1; + +}; + +THREE.BooleanKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return ( value0 === value1 ); + +}; + +THREE.BooleanKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value + } ); + } + + return new THREE.BooleanKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.BooleanKeyframeTrack.parse = function( json ) { + + return new THREE.BooleanKeyframeTrack( json.name, json.keys ); + +}; + +// File:src/animation/tracks/NumberKeyframeTrack.js + +/** + * + * A Track that interpolates Numbers + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + +THREE.NumberKeyframeTrack = function ( name, keys ) { + + THREE.KeyframeTrack.call( this, name, keys ); + + // local cache of value type to avoid allocations during runtime. + this.result = this.keys[0].value; + +}; + +THREE.NumberKeyframeTrack.prototype = Object.create( THREE.KeyframeTrack.prototype ); + +THREE.NumberKeyframeTrack.prototype.constructor = THREE.NumberKeyframeTrack; + +THREE.NumberKeyframeTrack.prototype.setResult = function( value ) { + + this.result = value; + +}; + +// memoization of the lerp function for speed. +// NOTE: Do not optimize as a prototype initialization closure, as value0 will be different on a per class basis. +THREE.NumberKeyframeTrack.prototype.lerpValues = function( value0, value1, alpha ) { + + return value0 * ( 1 - alpha ) + value1 * alpha; + +}; + +THREE.NumberKeyframeTrack.prototype.compareValues = function( value0, value1 ) { + + return ( value0 === value1 ); + +}; + +THREE.NumberKeyframeTrack.prototype.clone = function() { + + var clonedKeys = []; + + for ( var i = 0; i < this.keys.length; i ++ ) { + + var key = this.keys[i]; + clonedKeys.push( { + time: key.time, + value: key.value + } ); + } + + return new THREE.NumberKeyframeTrack( this.name, clonedKeys ); + +}; + +THREE.NumberKeyframeTrack.parse = function( json ) { + + return new THREE.NumberKeyframeTrack( json.name, json.keys ); + +}; + +// File:src/cameras/Camera.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.Camera = function () { + + THREE.Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new THREE.Matrix4(); + this.projectionMatrix = new THREE.Matrix4(); + +}; + +THREE.Camera.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Camera.prototype.constructor = THREE.Camera; + +THREE.Camera.prototype.getWorldDirection = function () { + + var quaternion = new THREE.Quaternion(); + + return function ( optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + +}(); + +THREE.Camera.prototype.lookAt = function () { + + // This routine does not support cameras with rotated and/or translated parent(s) + + var m1 = new THREE.Matrix4(); + + return function ( vector ) { + + m1.lookAt( this.position, vector, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + +}(); + +THREE.Camera.prototype.clone = function () { + + return new this.constructor().copy( this ); + +}; + +THREE.Camera.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + +}; + +// File:src/cameras/CubeCamera.js + +/** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.CubeCamera = function ( near, far, cubeResolution ) { + + THREE.Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new THREE.Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new THREE.Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new THREE.Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new THREE.Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new THREE.Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new THREE.PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new THREE.Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + this.renderTarget = new THREE.WebGLRenderTargetCube( cubeResolution, cubeResolution, { format: THREE.RGBFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter } ); + + this.updateCubeMap = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + +}; + +THREE.CubeCamera.prototype = Object.create( THREE.Object3D.prototype ); +THREE.CubeCamera.prototype.constructor = THREE.CubeCamera; + +// File:src/cameras/OrthographicCamera.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.OrthographicCamera = function ( left, right, top, bottom, near, far ) { + + THREE.Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + +}; + +THREE.OrthographicCamera.prototype = Object.create( THREE.Camera.prototype ); +THREE.OrthographicCamera.prototype.constructor = THREE.OrthographicCamera; + +THREE.OrthographicCamera.prototype.updateProjectionMatrix = function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + this.projectionMatrix.makeOrthographic( cx - dx, cx + dx, cy + dy, cy - dy, this.near, this.far ); + +}; + +THREE.OrthographicCamera.prototype.copy = function ( source ) { + + THREE.Camera.prototype.copy.call( this, source ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + + return this; + +}; + +THREE.OrthographicCamera.prototype.toJSON = function ( meta ) { + + var data = THREE.Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + return data; + +}; + +// File:src/cameras/PerspectiveCamera.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.PerspectiveCamera = function ( fov, aspect, near, far ) { + + THREE.Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.zoom = 1; + + this.fov = fov !== undefined ? fov : 50; + this.aspect = aspect !== undefined ? aspect : 1; + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + + this.updateProjectionMatrix(); + +}; + +THREE.PerspectiveCamera.prototype = Object.create( THREE.Camera.prototype ); +THREE.PerspectiveCamera.prototype.constructor = THREE.PerspectiveCamera; + + +/** + * Uses Focal Length (in mm) to estimate and set FOV + * 35mm (full-frame) camera is used if frame size is not specified; + * Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html + */ + +THREE.PerspectiveCamera.prototype.setLens = function ( focalLength, frameHeight ) { + + if ( frameHeight === undefined ) frameHeight = 24; + + this.fov = 2 * THREE.Math.radToDeg( Math.atan( frameHeight / ( focalLength * 2 ) ) ); + this.updateProjectionMatrix(); + +}; + + +/** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + +THREE.PerspectiveCamera.prototype.setViewOffset = function ( fullWidth, fullHeight, x, y, width, height ) { + + this.fullWidth = fullWidth; + this.fullHeight = fullHeight; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + + this.updateProjectionMatrix(); + +}; + + +THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function () { + + var fov = THREE.Math.radToDeg( 2 * Math.atan( Math.tan( THREE.Math.degToRad( this.fov ) * 0.5 ) / this.zoom ) ); + + if ( this.fullWidth ) { + + var aspect = this.fullWidth / this.fullHeight; + var top = Math.tan( THREE.Math.degToRad( fov * 0.5 ) ) * this.near; + var bottom = - top; + var left = aspect * bottom; + var right = aspect * top; + var width = Math.abs( right - left ); + var height = Math.abs( top - bottom ); + + this.projectionMatrix.makeFrustum( + left + this.x * width / this.fullWidth, + left + ( this.x + this.width ) * width / this.fullWidth, + top - ( this.y + this.height ) * height / this.fullHeight, + top - this.y * height / this.fullHeight, + this.near, + this.far + ); + + } else { + + this.projectionMatrix.makePerspective( fov, this.aspect, this.near, this.far ); + + } + +}; + +THREE.PerspectiveCamera.prototype.copy = function ( source ) { + + THREE.Camera.prototype.copy.call( this, source ); + + this.fov = source.fov; + this.aspect = source.aspect; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + + return this; + +}; + +THREE.PerspectiveCamera.prototype.toJSON = function ( meta ) { + + var data = THREE.Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.fov = this.fov; + data.object.aspect = this.aspect; + data.object.near = this.near; + data.object.far = this.far; + + return data; + +}; + +// File:src/lights/Light.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Light = function ( color ) { + + THREE.Object3D.call( this ); + + this.type = 'Light'; + + this.color = new THREE.Color( color ); + + this.receiveShadow = undefined; + +}; + +THREE.Light.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Light.prototype.constructor = THREE.Light; + +Object.defineProperties( THREE.Light.prototype, { + onlyShadow: { + set: function ( value ) { + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + } + }, + shadowCameraFov: { + set: function ( value ) { + this.shadow.camera.fov = value; + } + }, + shadowCameraLeft: { + set: function ( value ) { + this.shadow.camera.left = value; + } + }, + shadowCameraRight: { + set: function ( value ) { + this.shadow.camera.right = value; + } + }, + shadowCameraTop: { + set: function ( value ) { + this.shadow.camera.top = value; + } + }, + shadowCameraBottom: { + set: function ( value ) { + this.shadow.camera.bottom = value; + } + }, + shadowCameraNear: { + set: function ( value ) { + this.shadow.camera.near = value; + } + }, + shadowCameraFar: { + set: function ( value ) { + this.shadow.camera.far = value; + } + }, + shadowCameraVisible: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow ) instead.' ); + } + }, + shadowBias: { + set: function ( value ) { + this.shadow.bias = value; + } + }, + shadowDarkness: { + set: function ( value ) { + this.shadow.darkness = value; + } + }, + shadowMapWidth: { + set: function ( value ) { + this.shadow.mapSize.width = value; + } + }, + shadowMapHeight: { + set: function ( value ) { + this.shadow.mapSize.height = value; + } + } +} ); + +THREE.Light.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + return this; + +}; + +THREE.Light.prototype.toJSON = function ( meta ) { + + var data = THREE.Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.intensity !== undefined ) data.object.intensity = this.intensity; + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.exponent !== undefined ) data.object.exponent = this.exponent; + + return data; + +}; + +// File:src/lights/LightShadow.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.LightShadow = function ( camera ) { + + this.camera = camera; + + this.bias = 0; + this.darkness = 1; + + this.mapSize = new THREE.Vector2( 512, 512 ); + + this.map = null; + this.matrix = null; + +}; + +THREE.LightShadow.prototype = { + + constructor: THREE.LightShadow, + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.darkness = source.darkness; + + this.mapSize.copy( source.mapSize ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + +}; + +// File:src/lights/AmbientLight.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.AmbientLight = function ( color ) { + + THREE.Light.call( this, color ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + +}; + +THREE.AmbientLight.prototype = Object.create( THREE.Light.prototype ); +THREE.AmbientLight.prototype.constructor = THREE.AmbientLight; + +// File:src/lights/DirectionalLight.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.DirectionalLight = function ( color, intensity ) { + + THREE.Light.call( this, color ); + + this.type = 'DirectionalLight'; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.target = new THREE.Object3D(); + + this.intensity = ( intensity !== undefined ) ? intensity : 1; + + this.shadow = new THREE.LightShadow( new THREE.OrthographicCamera( - 500, 500, 500, - 500, 50, 5000 ) ); + +}; + +THREE.DirectionalLight.prototype = Object.create( THREE.Light.prototype ); +THREE.DirectionalLight.prototype.constructor = THREE.DirectionalLight; + +THREE.DirectionalLight.prototype.copy = function ( source ) { + + THREE.Light.prototype.copy.call( this, source ); + + this.intensity = source.intensity; + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + +}; + +// File:src/lights/HemisphereLight.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.HemisphereLight = function ( skyColor, groundColor, intensity ) { + + THREE.Light.call( this, skyColor ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.groundColor = new THREE.Color( groundColor ); + this.intensity = ( intensity !== undefined ) ? intensity : 1; + +}; + +THREE.HemisphereLight.prototype = Object.create( THREE.Light.prototype ); +THREE.HemisphereLight.prototype.constructor = THREE.HemisphereLight; + +THREE.HemisphereLight.prototype.copy = function ( source ) { + + THREE.Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + this.intensity = source.intensity; + + return this; + +}; + +// File:src/lights/PointLight.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + + +THREE.PointLight = function ( color, intensity, distance, decay ) { + + THREE.Light.call( this, color ); + + this.type = 'PointLight'; + + this.intensity = ( intensity !== undefined ) ? intensity : 1; + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new THREE.LightShadow( new THREE.PerspectiveCamera( 90, 1, 1, 500 ) ); + +}; + +THREE.PointLight.prototype = Object.create( THREE.Light.prototype ); +THREE.PointLight.prototype.constructor = THREE.PointLight; + +THREE.PointLight.prototype.copy = function ( source ) { + + THREE.Light.prototype.copy.call( this, source ); + + this.intensity = source.intensity; + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + +}; + +// File:src/lights/SpotLight.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.SpotLight = function ( color, intensity, distance, angle, exponent, decay ) { + + THREE.Light.call( this, color ); + + this.type = 'SpotLight'; + + this.position.set( 0, 1, 0 ); + this.updateMatrix(); + + this.target = new THREE.Object3D(); + + this.intensity = ( intensity !== undefined ) ? intensity : 1; + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.exponent = ( exponent !== undefined ) ? exponent : 10; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new THREE.LightShadow( new THREE.PerspectiveCamera( 50, 1, 50, 5000 ) ); + +}; + +THREE.SpotLight.prototype = Object.create( THREE.Light.prototype ); +THREE.SpotLight.prototype.constructor = THREE.SpotLight; + +THREE.SpotLight.prototype.copy = function ( source ) { + + THREE.Light.prototype.copy.call( this, source ); + + this.intensity = source.intensity; + this.distance = source.distance; + this.angle = source.angle; + this.exponent = source.exponent; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + +}; + +// File:src/loaders/Cache.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + +}; + +// File:src/loaders/Loader.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Loader = function () { + + this.onLoadStart = function () {}; + this.onLoadProgress = function () {}; + this.onLoadComplete = function () {}; + +}; + +THREE.Loader.prototype = { + + constructor: THREE.Loader, + + crossOrigin: undefined, + + extractUrlBase: function ( url ) { + + var parts = url.split( '/' ); + + if ( parts.length === 1 ) return './'; + + parts.pop(); + + return parts.join( '/' ) + '/'; + + }, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var color, textureLoader, materialLoader; + + return function ( m, texturePath, crossOrigin ) { + + if ( color === undefined ) color = new THREE.Color(); + if ( textureLoader === undefined ) textureLoader = new THREE.TextureLoader(); + if ( materialLoader === undefined ) materialLoader = new THREE.MaterialLoader(); + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = THREE.Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = THREE.RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = THREE.MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = THREE.RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = THREE.MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = THREE.Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: THREE.Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + case 'DbgColor': + json.color = value; + break; + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + // These were never supported + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = THREE[ value ]; + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = [ value, value ]; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = THREE.BackSide; + break; + case 'doubleSided': + json.side = THREE.DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'opacity': + case 'transparent': + case 'depthTest': + case 'depthWrite': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = THREE.VertexColors; + if ( value === 'face' ) json.vertexColors = THREE.FaceColors; + break; + default: + console.error( 'Loader.createMaterial: Unsupported', name, value ); + break; + } + + } + + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + +}; + +THREE.Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + +}; + +// File:src/loaders/XHRLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.XHRLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.XHRLoader.prototype = { + + constructor: THREE.XHRLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var cached = THREE.Cache.get( url ); + + if ( cached !== undefined ) { + + if ( onLoad ) { + + setTimeout( function () { + + onLoad( cached ); + + }, 0 ); + + } + + return cached; + + } + + var request = new XMLHttpRequest(); + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = event.target.response; + + THREE.Cache.add( url, response ); + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, false ); + + if ( onProgress !== undefined ) { + + request.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + }, false ); + + if ( this.crossOrigin !== undefined ) request.crossOrigin = this.crossOrigin; + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + request.send( null ); + + scope.manager.itemStart( url ); + + return request; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + + } + +}; + +// File:src/loaders/ImageLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.ImageLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.ImageLoader.prototype = { + + constructor: THREE.ImageLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var cached = THREE.Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + if ( onLoad ) { + + setTimeout( function () { + + onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + } else { + + scope.manager.itemEnd( url ); + + } + + return cached; + + } + + var image = document.createElement( 'img' ); + + image.addEventListener( 'load', function ( event ) { + + THREE.Cache.add( url, this ); + + if ( onLoad ) onLoad( this ); + + scope.manager.itemEnd( url ); + + }, false ); + + if ( onProgress !== undefined ) { + + image.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + image.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + }, false ); + + if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; + + scope.manager.itemStart( url ); + + image.src = url; + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/loaders/JSONLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.JSONLoader = function ( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + this.withCredentials = false; + +}; + +THREE.JSONLoader.prototype = { + + constructor: THREE.JSONLoader, + + // Deprecated + + get statusDomElement () { + + if ( this._statusDomElement === undefined ) { + + this._statusDomElement = document.createElement( 'div' ); + + } + + console.warn( 'THREE.JSONLoader: .statusDomElement has been removed.' ); + return this._statusDomElement; + + }, + + load: function( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : THREE.Loader.prototype.extractUrlBase( url ); + + var loader = new THREE.XHRLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + if ( metadata.type === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + if ( metadata.type === 'scene' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); + return; + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + } ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: function ( json, texturePath ) { + + var geometry = new THREE.Geometry(), + scale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0; + + parseModel( scale ); + + parseSkin(); + parseMorphing( scale ); + parseAnimations(); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + function parseModel( scale ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + nUvLayers = 0; + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new THREE.Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new THREE.Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new THREE.Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new THREE.Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new THREE.Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new THREE.Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new THREE.Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new THREE.Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new THREE.Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new THREE.Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new THREE.Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + }; + + function parseSkin() { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + }; + + function parseMorphing( scale ) { + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new THREE.Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations() { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + if ( json.animation !== undefined ) { + animations.push( json.animation ); + } + if ( json.animations !== undefined ) { + if ( json.animations.length ) { + animations = animations.concat( json.animations ); + } else { + animations.push( json.animations ); + } + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = THREE.AnimationClip.parseAnimation( animations[i], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = THREE.AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + }; + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = THREE.Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + } + +}; + +// File:src/loaders/LoadingManager.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.LoadingManager = function ( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false, itemsLoaded = 0, itemsTotal = 0; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + +}; + +THREE.DefaultLoadingManager = new THREE.LoadingManager(); + +// File:src/loaders/BufferGeometryLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.BufferGeometryLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.BufferGeometryLoader.prototype = { + + constructor: THREE.BufferGeometryLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.XHRLoader( scope.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json ) { + + var geometry = new THREE.BufferGeometry(); + + var index = json.data.index; + + if ( index !== undefined ) { + + var typedArray = new self[ index.type ]( index.array ); + geometry.setIndex( new THREE.BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new self[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new THREE.BufferAttribute( typedArray, attribute.itemSize ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new THREE.Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new THREE.Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + +}; + +// File:src/loaders/MaterialLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.MaterialLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + this.textures = {}; + +}; + +THREE.MaterialLoader.prototype = { + + constructor: THREE.MaterialLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.XHRLoader( scope.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + getTexture: function ( name ) { + + var textures = this.textures; + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + }, + + parse: function ( json ) { + + var material = new THREE[ json.type ]; + material.uuid = json.uuid; + + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.shading !== undefined ) material.shading = json.shading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + + // for PointsMaterial + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = this.getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = this.getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = this.getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = this.getTexture( json.normalMap ); + if ( json.normalScale ) material.normalScale = new THREE.Vector2( json.normalScale, json.normalScale ); + + if ( json.displacementMap !== undefined ) material.displacementMap = this.getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.specularMap !== undefined ) material.specularMap = this.getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) { + + material.envMap = this.getTexture( json.envMap ); + material.combine = THREE.MultiplyOperation; + + } + + if ( json.reflectivity ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = this.getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = this.getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + // MeshFaceMaterial + + if ( json.materials !== undefined ) { + + for ( var i = 0, l = json.materials.length; i < l; i ++ ) { + + material.materials.push( this.parse( json.materials[ i ] ) ); + + } + + } + + return material; + + } + +}; + +// File:src/loaders/ObjectLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.ObjectLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + this.texturePath = ''; + +}; + +THREE.ObjectLoader.prototype = { + + constructor: THREE.ObjectLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new THREE.XHRLoader( scope.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( text ) { + + scope.parse( JSON.parse( text ), onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var geometries = this.parseGeometries( json.geometries ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseGeometries: function ( json ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new THREE.JSONLoader(); + var bufferGeometryLoader = new THREE.BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new THREE[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new THREE.BoxGeometry( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleBufferGeometry': + + geometry = new THREE.CircleBufferGeometry( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CircleGeometry': + + geometry = new THREE.CircleGeometry( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + + geometry = new THREE.CylinderGeometry( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + + geometry = new THREE.SphereGeometry( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereBufferGeometry': + + geometry = new THREE.SphereBufferGeometry( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + + geometry = new THREE.DodecahedronGeometry( + data.radius, + data.detail + ); + + break; + + case 'IcosahedronGeometry': + + geometry = new THREE.IcosahedronGeometry( + data.radius, + data.detail + ); + + break; + + case 'OctahedronGeometry': + + geometry = new THREE.OctahedronGeometry( + data.radius, + data.detail + ); + + break; + + case 'TetrahedronGeometry': + + geometry = new THREE.TetrahedronGeometry( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + + geometry = new THREE.RingGeometry( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + + geometry = new THREE.TorusGeometry( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + + geometry = new THREE.TorusKnotGeometry( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.p, + data.q, + data.heightScale + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data.data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new THREE.MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var material = loader.parse( json[ i ] ); + materials[ material.uuid ] = material; + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = THREE.AnimationClip.parse( json[i] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new THREE.LoadingManager( onLoad ); + + var loader = new THREE.ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value ) { + + if ( typeof( value ) === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return THREE[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new THREE.Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping ); + if ( data.offset !== undefined ) texture.offset = new THREE.Vector2( data.offset[ 0 ], data.offset[ 1 ] ); + if ( data.repeat !== undefined ) texture.repeat = new THREE.Vector2( data.repeat[ 0 ], data.repeat[ 1 ] ); + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + if ( Array.isArray( data.wrap ) ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ] ); + texture.wrapT = parseConstant( data.wrap[ 1 ] ); + + } + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function () { + + var matrix = new THREE.Matrix4(); + + return function ( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new THREE.Scene(); + + break; + + case 'PerspectiveCamera': + + object = new THREE.PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + break; + + case 'OrthographicCamera': + + object = new THREE.OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new THREE.AmbientLight( data.color ); + + break; + + case 'DirectionalLight': + + object = new THREE.DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new THREE.PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'SpotLight': + + object = new THREE.SpotLight( data.color, data.intensity, data.distance, data.angle, data.exponent, data.decay ); + + break; + + case 'HemisphereLight': + + object = new THREE.HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'Mesh': + + object = new THREE.Mesh( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'LOD': + + object = new THREE.LOD(); + + break; + + case 'Line': + + object = new THREE.Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'PointCloud': + case 'Points': + + object = new THREE.Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new THREE.Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new THREE.Group(); + + break; + + default: + + object = new THREE.Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + matrix.fromArray( data.matrix ); + matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + for ( var child in data.children ) { + + object.add( this.parseObject( data.children[ child ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + } + + }() + +}; + +// File:src/loaders/TextureLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.TextureLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.TextureLoader.prototype = { + + constructor: THREE.TextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new THREE.Texture(); + + var loader = new THREE.ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( image ) { + + texture.image = image; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/loaders/CubeTextureLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.CubeTextureLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + +}; + +THREE.CubeTextureLoader.prototype = { + + constructor: THREE.CubeTextureLoader, + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new THREE.CubeTexture( [] ); + + var loader = new THREE.ImageLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/loaders/BinaryTextureLoader.js + +/** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + +THREE.DataTextureLoader = THREE.BinaryTextureLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + // override in sub classes + this._parser = null; + +}; + +THREE.BinaryTextureLoader.prototype = { + + constructor: THREE.BinaryTextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new THREE.DataTexture(); + + var loader = new THREE.XHRLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : THREE.ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : THREE.ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : THREE.LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : THREE.LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = THREE.LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/loaders/CompressedTextureLoader.js + +/** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + +THREE.CompressedTextureLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + // override in sub classes + this._parser = null; + +}; + + +THREE.CompressedTextureLoader.prototype = { + + constructor: THREE.CompressedTextureLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new THREE.CompressedTexture(); + texture.image = images; + + var loader = new THREE.XHRLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setResponseType( 'arraybuffer' ); + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + var loadTexture = function ( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = THREE.LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + }; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = THREE.LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + } + +}; + +// File:src/materials/Material.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Material = function () { + + Object.defineProperty( this, 'id', { value: THREE.MaterialIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.side = THREE.FrontSide; + + this.opacity = 1; + this.transparent = false; + + this.blending = THREE.NormalBlending; + + this.blendSrc = THREE.SrcAlphaFactor; + this.blendDst = THREE.OneMinusSrcAlphaFactor; + this.blendEquation = THREE.AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = THREE.LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.alphaTest = 0; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this._needsUpdate = true; + +}; + +THREE.Material.prototype = { + + constructor: THREE.Material, + + get needsUpdate () { + + return this._needsUpdate; + + }, + + set needsUpdate ( value ) { + + if ( value === true ) this.update(); + + this._needsUpdate = value; + + }, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( currentValue instanceof THREE.Color ) { + + currentValue.set( newValue ); + + } else if ( currentValue instanceof THREE.Vector3 && newValue instanceof THREE.Vector3 ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var data = { + metadata: { + version: 4.4, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.color instanceof THREE.Color ) data.color = this.color.getHex(); + if ( this.emissive instanceof THREE.Color ) data.emissive = this.emissive.getHex(); + if ( this.specular instanceof THREE.Color ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + + if ( this.map instanceof THREE.Texture ) data.map = this.map.toJSON( meta ).uuid; + if ( this.alphaMap instanceof THREE.Texture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( this.lightMap instanceof THREE.Texture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( this.bumpMap instanceof THREE.Texture ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( this.normalMap instanceof THREE.Texture ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale; // Removed for now, causes issue in editor ui.js + + } + if ( this.displacementMap instanceof THREE.Texture ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( this.specularMap instanceof THREE.Texture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + if ( this.envMap instanceof THREE.Texture ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.vertexColors !== undefined && this.vertexColors !== THREE.NoColors ) data.vertexColors = this.vertexColors; + if ( this.shading !== undefined && this.shading !== THREE.SmoothShading ) data.shading = this.shading; + if ( this.blending !== undefined && this.blending !== THREE.NormalBlending ) data.blending = this.blending; + if ( this.side !== undefined && this.side !== THREE.FrontSide ) data.side = this.side; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.side = source.side; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blending = source.blending; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.alphaTest = source.alphaTest; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + + return this; + + }, + + update: function () { + + this.dispatchEvent( { type: 'update' } ); + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + // Deprecated + + get wrapAround () { + + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + + }, + + set wrapAround ( boolean ) { + + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + + }, + + get wrapRGB () { + + console.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' ); + return new THREE.Color(); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.Material.prototype ); + +THREE.MaterialIdCount = 0; + +// File:src/materials/LineBasicMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round", + * + * vertexColors: + * + * fog: + * } + */ + +THREE.LineBasicMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new THREE.Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.vertexColors = THREE.NoColors; + + this.fog = true; + + this.setValues( parameters ); + +}; + +THREE.LineBasicMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.LineBasicMaterial.prototype.constructor = THREE.LineBasicMaterial; + +THREE.LineBasicMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + this.vertexColors = source.vertexColors; + + this.fog = source.fog; + + return this; + +}; + +// File:src/materials/LineDashedMaterial.js + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: , + * + * vertexColors: + * + * fog: + * } + */ + +THREE.LineDashedMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'LineDashedMaterial'; + + this.color = new THREE.Color( 0xffffff ); + + this.linewidth = 1; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.vertexColors = false; + + this.fog = true; + + this.setValues( parameters ); + +}; + +THREE.LineDashedMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.LineDashedMaterial.prototype.constructor = THREE.LineDashedMaterial; + +THREE.LineDashedMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + this.vertexColors = source.vertexColors; + + this.fog = source.fog; + + return this; + +}; + +// File:src/materials/MeshBasicMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * shading: THREE.SmoothShading, + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, + * + * skinning: , + * morphTargets: , + * + * fog: + * } + */ + +THREE.MeshBasicMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new THREE.Color( 0xffffff ); // emissive + + this.map = null; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = THREE.MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.fog = true; + + this.shading = THREE.SmoothShading; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.vertexColors = THREE.NoColors; + + this.skinning = false; + this.morphTargets = false; + + this.setValues( parameters ); + +}; + +THREE.MeshBasicMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshBasicMaterial.prototype.constructor = THREE.MeshBasicMaterial; + +THREE.MeshBasicMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.fog = source.fog; + + this.shading = source.shading; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.vertexColors = source.vertexColors; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + +}; + +// File:src/materials/MeshLambertMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * emissive: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, + * + * skinning: , + * morphTargets: , + * morphNormals: , + * + * fog: + * } + */ + +THREE.MeshLambertMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new THREE.Color( 0xffffff ); // diffuse + this.emissive = new THREE.Color( 0x000000 ); + + this.map = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = THREE.MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.fog = true; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.vertexColors = THREE.NoColors; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +}; + +THREE.MeshLambertMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshLambertMaterial.prototype.constructor = THREE.MeshLambertMaterial; + +THREE.MeshLambertMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.emissive.copy( source.emissive ); + + this.map = source.map; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.fog = source.fog; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.vertexColors = source.vertexColors; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + +// File:src/materials/MeshPhongMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * emissive: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * shading: THREE.SmoothShading, + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, + * + * skinning: , + * morphTargets: , + * morphNormals: , + * + * fog: + * } + */ + +THREE.MeshPhongMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new THREE.Color( 0xffffff ); // diffuse + this.emissive = new THREE.Color( 0x000000 ); + this.specular = new THREE.Color( 0x111111 ); + this.shininess = 30; + + this.metal = false; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new THREE.Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = THREE.MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.fog = true; + + this.shading = THREE.SmoothShading; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.vertexColors = THREE.NoColors; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + +}; + +THREE.MeshPhongMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshPhongMaterial.prototype.constructor = THREE.MeshPhongMaterial; + +THREE.MeshPhongMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.emissive.copy( source.emissive ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.metal = source.metal; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissiveMap = source.emissiveMap; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.fog = source.fog; + + this.shading = source.shading; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.vertexColors = source.vertexColors; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + +}; + +// File:src/materials/MeshDepthMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * opacity: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + +THREE.MeshDepthMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.morphTargets = false; + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.setValues( parameters ); + +}; + +THREE.MeshDepthMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshDepthMaterial.prototype.constructor = THREE.MeshDepthMaterial; + +THREE.MeshDepthMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + +}; + +// File:src/materials/MeshNormalMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * opacity: , + * + * shading: THREE.FlatShading, + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + +THREE.MeshNormalMaterial = function ( parameters ) { + + THREE.Material.call( this, parameters ); + + this.type = 'MeshNormalMaterial'; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.morphTargets = false; + + this.setValues( parameters ); + +}; + +THREE.MeshNormalMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.MeshNormalMaterial.prototype.constructor = THREE.MeshNormalMaterial; + +THREE.MeshNormalMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + +}; + +// File:src/materials/MultiMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.MultiMaterial = function ( materials ) { + + this.uuid = THREE.Math.generateUUID(); + + this.type = 'MultiMaterial'; + + this.materials = materials instanceof Array ? materials : []; + + this.visible = true; + +}; + +THREE.MultiMaterial.prototype = { + + constructor: THREE.MultiMaterial, + + toJSON: function () { + + var output = { + metadata: { + version: 4.2, + type: 'material', + generator: 'MaterialExporter' + }, + uuid: this.uuid, + type: this.type, + materials: [] + }; + + for ( var i = 0, l = this.materials.length; i < l; i ++ ) { + + output.materials.push( this.materials[ i ].toJSON() ); + + } + + output.visible = this.visible; + + return output; + + }, + + clone: function () { + + var material = new this.constructor(); + + for ( var i = 0; i < this.materials.length; i ++ ) { + + material.materials.push( this.materials[ i ].clone() ); + + } + + material.visible = this.visible; + + return material; + + } + +}; + +// backwards compatibility + +THREE.MeshFaceMaterial = THREE.MultiMaterial; + +// File:src/materials/PointsMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: , + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * vertexColors: , + * + * fog: + * } + */ + +THREE.PointsMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new THREE.Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.vertexColors = THREE.NoColors; + + this.fog = true; + + this.setValues( parameters ); + +}; + +THREE.PointsMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.PointsMaterial.prototype.constructor = THREE.PointsMaterial; + +THREE.PointsMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + this.vertexColors = source.vertexColors; + + this.fog = source.fog; + + return this; + +}; + +// backwards compatibility + +THREE.PointCloudMaterial = function ( parameters ) { + + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new THREE.PointsMaterial( parameters ); + +}; + +THREE.ParticleBasicMaterial = function ( parameters ) { + + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new THREE.PointsMaterial( parameters ); + +}; + +THREE.ParticleSystemMaterial = function ( parameters ) { + + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new THREE.PointsMaterial( parameters ); + +}; + +// File:src/materials/ShaderMaterial.js + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { type: "f", value: 1.0 }, "parameter2": { type: "i" value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * shading: THREE.SmoothShading, + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, + * + * skinning: , + * morphTargets: , + * morphNormals: , + * + * fog: + * } + */ + +THREE.ShaderMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.shading = THREE.SmoothShading; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + + this.lights = false; // set to use scene lights + + this.vertexColors = THREE.NoColors; // set to use "color" attribute stream + + this.skinning = false; // set to use skinning attribute streams + + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.derivatives = false; // set to use derivatives + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + +}; + +THREE.ShaderMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.ShaderMaterial.prototype.constructor = THREE.ShaderMaterial; + +THREE.ShaderMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = THREE.UniformsUtils.clone( source.uniforms ); + + this.attributes = source.attributes; + this.defines = source.defines; + + this.shading = source.shading; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.fog = source.fog; + + this.lights = source.lights; + + this.vertexColors = source.vertexColors; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.derivatives = source.derivatives; + + return this; + +}; + +THREE.ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = THREE.Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.attributes = this.attributes; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + +}; + +// File:src/materials/RawShaderMaterial.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.RawShaderMaterial = function ( parameters ) { + + THREE.ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + +}; + +THREE.RawShaderMaterial.prototype = Object.create( THREE.ShaderMaterial.prototype ); +THREE.RawShaderMaterial.prototype.constructor = THREE.RawShaderMaterial; +// File:src/materials/SpriteMaterial.js + +/** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * blending: THREE.NormalBlending, + * depthTest: , + * depthWrite: , + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2(), + * + * fog: + * } + */ + +THREE.SpriteMaterial = function ( parameters ) { + + THREE.Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new THREE.Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + + // set parameters + + this.setValues( parameters ); + +}; + +THREE.SpriteMaterial.prototype = Object.create( THREE.Material.prototype ); +THREE.SpriteMaterial.prototype.constructor = THREE.SpriteMaterial; + +THREE.SpriteMaterial.prototype.copy = function ( source ) { + + THREE.Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + this.fog = source.fog; + + return this; + +}; + +// File:src/textures/Texture.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + +THREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Object.defineProperty( this, 'id', { value: THREE.TextureIdCount ++ } ); + + this.uuid = THREE.Math.generateUUID(); + + this.name = ''; + this.sourceFile = ''; + + this.image = image !== undefined ? image : THREE.Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : THREE.Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : THREE.RGBAFormat; + this.type = type !== undefined ? type : THREE.UnsignedByteType; + + this.offset = new THREE.Vector2( 0, 0 ); + this.repeat = new THREE.Vector2( 1, 1 ); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + this.version = 0; + this.onUpdate = null; + +}; + +THREE.Texture.DEFAULT_IMAGE = undefined; +THREE.Texture.DEFAULT_MAPPING = THREE.UVMapping; + +THREE.Texture.prototype = { + + constructor: THREE.Texture, + + set needsUpdate ( value ) { + + if ( value === true ) this.version ++; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + + return this; + + }, + + toJSON: function ( meta ) { + + if ( meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image.toDataURL !== undefined ) { + + canvas = image; + + } else { + + canvas = document.createElement( 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + metadata: { + version: 4.4, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + wrap: [ this.wrapS, this.wrapT ], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = THREE.Math.generateUUID(); // UGH + + } + + if ( meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + meta.textures[ this.uuid ] = output; + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== THREE.UVMapping ) return; + + uv.multiply( this.repeat ); + uv.add( this.offset ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case THREE.RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case THREE.ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case THREE.MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case THREE.RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case THREE.ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case THREE.MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.Texture.prototype ); + +THREE.TextureIdCount = 0; + +// File:src/textures/CanvasTexture.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.CanvasTexture = function ( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + THREE.Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + +}; + +THREE.CanvasTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.CanvasTexture.prototype.constructor = THREE.CanvasTexture; + +// File:src/textures/CubeTexture.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.CubeTexture = function ( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + mapping = mapping !== undefined ? mapping : THREE.CubeReflectionMapping; + + THREE.Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.images = images; + this.flipY = false; + +}; + +THREE.CubeTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.CubeTexture.prototype.constructor = THREE.CubeTexture; + +THREE.CubeTexture.prototype.copy = function ( source ) { + + THREE.Texture.prototype.copy.call( this, source ); + + this.images = source.images; + + return this; + +}; +// File:src/textures/CompressedTexture.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.CompressedTexture = function ( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) { + + THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + +}; + +THREE.CompressedTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.CompressedTexture.prototype.constructor = THREE.CompressedTexture; + +// File:src/textures/DataTexture.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.DataTexture = function ( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) { + + THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : THREE.NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : THREE.NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + +}; + +THREE.DataTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.DataTexture.prototype.constructor = THREE.DataTexture; + +// File:src/textures/VideoTexture.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.VideoTexture = function ( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + THREE.Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + var scope = this; + + function update() { + + requestAnimationFrame( update ); + + if ( video.readyState === video.HAVE_ENOUGH_DATA ) { + + scope.needsUpdate = true; + + } + + } + + update(); + +}; + +THREE.VideoTexture.prototype = Object.create( THREE.Texture.prototype ); +THREE.VideoTexture.prototype.constructor = THREE.VideoTexture; + +// File:src/objects/Group.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Group = function () { + + THREE.Object3D.call( this ); + + this.type = 'Group'; + +}; + +THREE.Group.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Group.prototype.constructor = THREE.Group; +// File:src/objects/Points.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Points = function ( geometry, material ) { + + THREE.Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); + this.material = material !== undefined ? material : new THREE.PointsMaterial( { color: Math.random() * 0xffffff } ); + +}; + +THREE.Points.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Points.prototype.constructor = THREE.Points; + +THREE.Points.prototype.raycast = ( function () { + + var inverseMatrix = new THREE.Matrix4(); + var ray = new THREE.Ray(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = object.geometry; + var threshold = raycaster.params.Points.threshold; + + inverseMatrix.getInverse( this.matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + if ( geometry.boundingBox !== null ) { + + if ( ray.isIntersectionBox( geometry.boundingBox ) === false ) { + + return; + + } + + } + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new THREE.Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + var intersectPoint = ray.closestPointToPoint( point ); + intersectPoint.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( geometry instanceof THREE.BufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + +}() ); + +THREE.Points.prototype.clone = function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + +}; + +// Backwards compatibility + +THREE.PointCloud = function ( geometry, material ) { + + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new THREE.Points( geometry, material ); + +}; + +THREE.ParticleSystem = function ( geometry, material ) { + + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new THREE.Points( geometry, material ); + +}; + +// File:src/objects/Line.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Line = function ( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new THREE.LineSegments( geometry, material ); + + } + + THREE.Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); + this.material = material !== undefined ? material : new THREE.LineBasicMaterial( { color: Math.random() * 0xffffff } ); + +}; + +THREE.Line.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Line.prototype.constructor = THREE.Line; + +THREE.Line.prototype.raycast = ( function () { + + var inverseMatrix = new THREE.Matrix4(); + var ray = new THREE.Ray(); + var sphere = new THREE.Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + // Checking boundingSphere distance to ray + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( this.matrixWorld ); + + if ( raycaster.ray.isIntersectionSphere( sphere ) === false ) { + + return; + + } + + inverseMatrix.getInverse( this.matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new THREE.Vector3(); + var vEnd = new THREE.Vector3(); + var interSegment = new THREE.Vector3(); + var interRay = new THREE.Vector3(); + var step = this instanceof THREE.LineSegments ? 2 : 1; + + if ( geometry instanceof THREE.BufferGeometry ) { + + var index = geometry.index; + var attributes = geometry.attributes; + + if ( index !== null ) { + + var indices = index.array; + var positions = attributes.position.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + var positions = attributes.position.array; + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( geometry instanceof THREE.Geometry ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + +}() ); + +THREE.Line.prototype.clone = function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + +}; + +// DEPRECATED + +THREE.LineStrip = 0; +THREE.LinePieces = 1; + +// File:src/objects/LineSegments.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.LineSegments = function ( geometry, material ) { + + THREE.Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + +}; + +THREE.LineSegments.prototype = Object.create( THREE.Line.prototype ); +THREE.LineSegments.prototype.constructor = THREE.LineSegments; + +// File:src/objects/Mesh.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + +THREE.Mesh = function ( geometry, material ) { + + THREE.Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); + this.material = material !== undefined ? material : new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.updateMorphTargets(); + +}; + +THREE.Mesh.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Mesh.prototype.constructor = THREE.Mesh; + +THREE.Mesh.prototype.updateMorphTargets = function () { + + if ( this.geometry.morphTargets !== undefined && this.geometry.morphTargets.length > 0 ) { + + this.morphTargetBase = - 1; + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( var m = 0, ml = this.geometry.morphTargets.length; m < ml; m ++ ) { + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ this.geometry.morphTargets[ m ].name ] = m; + + } + + } + +}; + +THREE.Mesh.prototype.getMorphTargetIndexByName = function ( name ) { + + if ( this.morphTargetDictionary[ name ] !== undefined ) { + + return this.morphTargetDictionary[ name ]; + + } + + console.warn( 'THREE.Mesh.getMorphTargetIndexByName: morph target ' + name + ' does not exist. Returning 0.' ); + + return 0; + +}; + + +THREE.Mesh.prototype.raycast = ( function () { + + var inverseMatrix = new THREE.Matrix4(); + var ray = new THREE.Ray(); + var sphere = new THREE.Sphere(); + + var vA = new THREE.Vector3(); + var vB = new THREE.Vector3(); + var vC = new THREE.Vector3(); + + var tempA = new THREE.Vector3(); + var tempB = new THREE.Vector3(); + var tempC = new THREE.Vector3(); + + var uvA = new THREE.Vector2(); + var uvB = new THREE.Vector2(); + var uvC = new THREE.Vector2(); + + var barycoord = new THREE.Vector3(); + + var intersectionPoint = new THREE.Vector3(); + var intersectionPointWorld = new THREE.Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + THREE.Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, raycaster, ray, pA, pB, pC, point ){ + + var intersect; + var material = object.material; + + if ( material.side === THREE.BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== THREE.DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) { + + vA.fromArray( positions, a * 3 ); + vB.fromArray( positions, b * 3 ); + vC.fromArray( positions, c * 3 ); + + var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + uvA.fromArray( uvs, a * 2 ); + uvB.fromArray( uvs, b * 2 ); + uvC.fromArray( uvs, c * 2 ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + intersection.face = new THREE.Face3( a, b, c, THREE.Triangle.normal( vA, vB, vC ) ); + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + var matrixWorld = this.matrixWorld; + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.isIntersectionSphere( sphere ) === false ) return; + + // Check boundingBox before continuing + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + if ( geometry.boundingBox !== null ) { + + if ( ray.isIntersectionBox( geometry.boundingBox ) === false ) return; + + } + + var uvs, intersection; + + if ( geometry instanceof THREE.BufferGeometry ) { + + var a, b, c; + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( attributes.uv !== undefined ){ + + uvs = attributes.uv.array; + + } + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length; i < l; i += 3 ) { + + a = indices[ i ]; + b = indices[ i + 1 ]; + c = indices[ i + 2 ]; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else { + + + for ( var i = 0, l = positions.length; i < l; i += 9 ) { + + a = i / 3; + b = a + 1; + c = a + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c ); + + if ( intersection ) { + + intersection.index = a; // triangle number in positions buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( geometry instanceof THREE.Geometry ) { + + var fvA, fvB, fvC; + var isFaceMaterial = material instanceof THREE.MeshFaceMaterial; + var materials = isFaceMaterial === true ? material.materials : null; + + var vertices = geometry.vertices; + var faces = geometry.faces; + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + +}() ); + +THREE.Mesh.prototype.clone = function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + +}; + +// File:src/objects/Bone.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + +THREE.Bone = function ( skin ) { + + THREE.Object3D.call( this ); + + this.type = 'Bone'; + + this.skin = skin; + +}; + +THREE.Bone.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Bone.prototype.constructor = THREE.Bone; + +THREE.Bone.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + this.skin = source.skin; + + return this; + +}; + +// File:src/objects/Skeleton.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + +THREE.Skeleton = function ( bones, boneInverses, useVertexTexture ) { + + this.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true; + + this.identityMatrix = new THREE.Matrix4(); + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + + // create a bone texture or an array of floats + + if ( this.useVertexTexture ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix + size = THREE.Math.nextPowerOfTwo( Math.ceil( size ) ); + size = Math.max( size, 4 ); + + this.boneTextureWidth = size; + this.boneTextureHeight = size; + + this.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel + this.boneTexture = new THREE.DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType ); + + } else { + + this.boneMatrices = new Float32Array( 16 * this.bones.length ); + + } + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton bonInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + this.boneInverses.push( new THREE.Matrix4() ); + + } + + } + + } + +}; + +THREE.Skeleton.prototype.calculateInverses = function () { + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + var inverse = new THREE.Matrix4(); + + if ( this.bones[ b ] ) { + + inverse.getInverse( this.bones[ b ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + +}; + +THREE.Skeleton.prototype.pose = function () { + + var bone; + + // recover the bind-time world matrices + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ b ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + if ( bone.parent ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + +}; + +THREE.Skeleton.prototype.update = ( function () { + + var offsetMatrix = new THREE.Matrix4(); + + return function update() { + + // flatten bone matrices to array + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + // compute the offset between the current and the original transform + + var matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] ); + offsetMatrix.flattenToArrayOffset( this.boneMatrices, b * 16 ); + + } + + if ( this.useVertexTexture ) { + + this.boneTexture.needsUpdate = true; + + } + + }; + +} )(); + +THREE.Skeleton.prototype.clone = function () { + + return new THREE.Skeleton( this.bones, this.boneInverses, this.useVertexTexture ); + +}; + +// File:src/objects/SkinnedMesh.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + +THREE.SkinnedMesh = function ( geometry, material, useVertexTexture ) { + + THREE.Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = "attached"; + this.bindMatrix = new THREE.Matrix4(); + this.bindMatrixInverse = new THREE.Matrix4(); + + // init bones + + // TODO: remove bone creation as there is no reason (other than + // convenience) for THREE.SkinnedMesh to do this. + + var bones = []; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + var bone, gbone; + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + bone = new THREE.Bone( this ); + bones.push( bone ); + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + if ( gbone.parent !== - 1 && gbone.parent !== null) { + + bones[ gbone.parent ].add( bones[ b ] ); + + } else { + + this.add( bones[ b ] ); + + } + + } + + } + + this.normalizeSkinWeights(); + + this.updateMatrixWorld( true ); + this.bind( new THREE.Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld ); + +}; + + +THREE.SkinnedMesh.prototype = Object.create( THREE.Mesh.prototype ); +THREE.SkinnedMesh.prototype.constructor = THREE.SkinnedMesh; + +THREE.SkinnedMesh.prototype.bind = function( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + +}; + +THREE.SkinnedMesh.prototype.pose = function () { + + this.skeleton.pose(); + +}; + +THREE.SkinnedMesh.prototype.normalizeSkinWeights = function () { + + if ( this.geometry instanceof THREE.Geometry ) { + + for ( var i = 0; i < this.geometry.skinIndices.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + var scale = 1.0 / sw.lengthManhattan(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1 ); // this will be normalized by the shader anyway + + } + + } + + } else { + + // skinning weights assumed to be normalized for THREE.BufferGeometry + + } + +}; + +THREE.SkinnedMesh.prototype.updateMatrixWorld = function( force ) { + + THREE.Mesh.prototype.updateMatrixWorld.call( this, true ); + + if ( this.bindMode === "attached" ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === "detached" ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode ); + + } + +}; + +THREE.SkinnedMesh.prototype.clone = function() { + + return new this.constructor( this.geometry, this.material, this.useVertexTexture ).copy( this ); + +}; + +// File:src/objects/LOD.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.LOD = function () { + + THREE.Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + }, + objects: { + get: function () { + + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + + } + } + } ); + +}; + + +THREE.LOD.prototype = Object.create( THREE.Object3D.prototype ); +THREE.LOD.prototype.constructor = THREE.LOD; + +THREE.LOD.prototype.addLevel = function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + +}; + +THREE.LOD.prototype.getObjectForDistance = function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + +}; + +THREE.LOD.prototype.raycast = ( function () { + + var matrixPosition = new THREE.Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + +}() ); + +THREE.LOD.prototype.update = function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + +}(); + +THREE.LOD.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + +}; + +THREE.LOD.prototype.toJSON = function ( meta ) { + + var data = THREE.Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + +}; + +// File:src/objects/Sprite.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Sprite = ( function () { + + var indices = new Uint16Array( [ 0, 1, 2, 0, 2, 3 ] ); + var vertices = new Float32Array( [ - 0.5, - 0.5, 0, 0.5, - 0.5, 0, 0.5, 0.5, 0, - 0.5, 0.5, 0 ] ); + var uvs = new Float32Array( [ 0, 0, 1, 0, 1, 1, 0, 1 ] ); + + var geometry = new THREE.BufferGeometry(); + geometry.setIndex( new THREE.BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) ); + + return function Sprite( material ) { + + THREE.Object3D.call( this ); + + this.type = 'Sprite'; + + this.geometry = geometry; + this.material = ( material !== undefined ) ? material : new THREE.SpriteMaterial(); + + }; + +} )(); + +THREE.Sprite.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Sprite.prototype.constructor = THREE.Sprite; + +THREE.Sprite.prototype.raycast = ( function () { + + var matrixPosition = new THREE.Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition ); + var guessSizeSq = this.scale.x * this.scale.y; + + if ( distanceSq > guessSizeSq ) { + + return; + + } + + intersects.push( { + + distance: Math.sqrt( distanceSq ), + point: this.position, + face: null, + object: this + + } ); + + }; + +}() ); + +THREE.Sprite.prototype.clone = function () { + + return new this.constructor( this.material ).copy( this ); + +}; + +// Backwards compatibility + +THREE.Particle = THREE.Sprite; + +// File:src/objects/LensFlare.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.LensFlare = function ( texture, size, distance, blending, color ) { + + THREE.Object3D.call( this ); + + this.lensFlares = []; + + this.positionScreen = new THREE.Vector3(); + this.customUpdateCallback = undefined; + + if ( texture !== undefined ) { + + this.add( texture, size, distance, blending, color ); + + } + +}; + +THREE.LensFlare.prototype = Object.create( THREE.Object3D.prototype ); +THREE.LensFlare.prototype.constructor = THREE.LensFlare; + + +/* + * Add: adds another flare + */ + +THREE.LensFlare.prototype.add = function ( texture, size, distance, blending, color, opacity ) { + + if ( size === undefined ) size = - 1; + if ( distance === undefined ) distance = 0; + if ( opacity === undefined ) opacity = 1; + if ( color === undefined ) color = new THREE.Color( 0xffffff ); + if ( blending === undefined ) blending = THREE.NormalBlending; + + distance = Math.min( distance, Math.max( 0, distance ) ); + + this.lensFlares.push( { + texture: texture, // THREE.Texture + size: size, // size in pixels (-1 = use texture.width) + distance: distance, // distance (0-1) from light source (0=at light source) + x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back + scale: 1, // scale + rotation: 0, // rotation + opacity: opacity, // opacity + color: color, // color + blending: blending // blending + } ); + +}; + +/* + * Update lens flares update positions on all flares based on the screen position + * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. + */ + +THREE.LensFlare.prototype.updateLensFlares = function () { + + var f, fl = this.lensFlares.length; + var flare; + var vecX = - this.positionScreen.x * 2; + var vecY = - this.positionScreen.y * 2; + + for ( f = 0; f < fl; f ++ ) { + + flare = this.lensFlares[ f ]; + + flare.x = this.positionScreen.x + vecX * flare.distance; + flare.y = this.positionScreen.y + vecY * flare.distance; + + flare.wantedRotation = flare.x * Math.PI * 0.25; + flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; + + } + +}; + +THREE.LensFlare.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + this.positionScreen.copy( source.positionScreen ); + this.customUpdateCallback = source.customUpdateCallback; + + for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { + + this.lensFlares.push( source.lensFlares[ i ] ); + + } + + return this; + +}; + +// File:src/scenes/Scene.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Scene = function () { + + THREE.Object3D.call( this ); + + this.type = 'Scene'; + + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + +}; + +THREE.Scene.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Scene.prototype.constructor = THREE.Scene; + +THREE.Scene.prototype.copy = function ( source ) { + + THREE.Object3D.prototype.copy.call( this, source ); + + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + +}; + +// File:src/scenes/Fog.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.Fog = function ( color, near, far ) { + + this.name = ''; + + this.color = new THREE.Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + +}; + +THREE.Fog.prototype.clone = function () { + + return new THREE.Fog( this.color.getHex(), this.near, this.far ); + +}; + +// File:src/scenes/FogExp2.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.FogExp2 = function ( color, density ) { + + this.name = ''; + + this.color = new THREE.Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + +}; + +THREE.FogExp2.prototype.clone = function () { + + return new THREE.FogExp2( this.color.getHex(), this.density ); + +}; + +// File:src/renderers/shaders/ShaderChunk.js + +THREE.ShaderChunk = {}; + +// File:src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl + +THREE.ShaderChunk[ 'alphamap_fragment'] = "#ifdef USE_ALPHAMAP\n\n diffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl + +THREE.ShaderChunk[ 'alphamap_pars_fragment'] = "#ifdef USE_ALPHAMAP\n\n uniform sampler2D alphaMap;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl + +THREE.ShaderChunk[ 'alphatest_fragment'] = "#ifdef ALPHATEST\n\n if ( diffuseColor.a < ALPHATEST ) discard;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/aomap_fragment.glsl + +THREE.ShaderChunk[ 'aomap_fragment'] = "#ifdef USE_AOMAP\n\n totalAmbientLight *= ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl + +THREE.ShaderChunk[ 'aomap_pars_fragment'] = "#ifdef USE_AOMAP\n\n uniform sampler2D aoMap;\n uniform float aoMapIntensity;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/begin_vertex.glsl + +THREE.ShaderChunk[ 'begin_vertex'] = "\nvec3 transformed = vec3( position );\n"; + +// File:src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl + +THREE.ShaderChunk[ 'beginnormal_vertex'] = "\nvec3 objectNormal = vec3( normal );\n"; + +// File:src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'bumpmap_pars_fragment'] = "#ifdef USE_BUMPMAP\n\n uniform sampler2D bumpMap;\n uniform float bumpScale;\n\n\n\n vec2 dHdxy_fwd() {\n\n vec2 dSTdx = dFdx( vUv );\n vec2 dSTdy = dFdy( vUv );\n\n float Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n return vec2( dBx, dBy );\n\n }\n\n vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\n vec3 vSigmaX = dFdx( surf_pos );\n vec3 vSigmaY = dFdy( surf_pos );\n vec3 vN = surf_norm;\n vec3 R1 = cross( vSigmaY, vN );\n vec3 R2 = cross( vN, vSigmaX );\n\n float fDet = dot( vSigmaX, R1 );\n\n vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n return normalize( abs( fDet ) * surf_norm - vGrad );\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/color_fragment.glsl + +THREE.ShaderChunk[ 'color_fragment'] = "#ifdef USE_COLOR\n\n diffuseColor.rgb *= vColor;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl + +THREE.ShaderChunk[ 'color_pars_fragment'] = "#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl + +THREE.ShaderChunk[ 'color_pars_vertex'] = "#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/color_vertex.glsl + +THREE.ShaderChunk[ 'color_vertex'] = "#ifdef USE_COLOR\n\n vColor.xyz = color.xyz;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/common.glsl + +THREE.ShaderChunk[ 'common'] = "#define PI 3.14159\n#define PI2 6.28318\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\n\nvec3 transformDirection( in vec3 normal, in mat4 matrix ) {\n\n return normalize( ( matrix * vec4( normal, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {\n\n return normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );\n\n}\n\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n float distance = dot( planeNormal, point - pointOnPlane );\n\n return - distance * planeNormal + point;\n\n}\n\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n return sign( dot( point - pointOnPlane, planeNormal ) );\n\n}\n\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n return lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n\n}\n\nfloat calcLightAttenuation( float lightDistance, float cutoffDistance, float decayExponent ) {\n\n if ( decayExponent > 0.0 ) {\n\n return pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n }\n\n return 1.0;\n\n}\n\nvec3 F_Schlick( in vec3 specularColor, in float dotLH ) {\n\n\n float fresnel = exp2( ( -5.55437 * dotLH - 6.98316 ) * dotLH );\n\n return ( 1.0 - specularColor ) * fresnel + specularColor;\n\n}\n\nfloat G_BlinnPhong_Implicit( /* in float dotNL, in float dotNV */ ) {\n\n\n return 0.25;\n\n}\n\nfloat D_BlinnPhong( in float shininess, in float dotNH ) {\n\n\n return ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( in vec3 specularColor, in float shininess, in vec3 normal, in vec3 lightDir, in vec3 viewDir ) {\n\n vec3 halfDir = normalize( lightDir + viewDir );\n\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotLH = saturate( dot( lightDir, halfDir ) );\n\n vec3 F = F_Schlick( specularColor, dotLH );\n\n float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n float D = D_BlinnPhong( shininess, dotNH );\n\n return F * G * D;\n\n}\n\nvec3 inputToLinear( in vec3 a ) {\n\n #ifdef GAMMA_INPUT\n\n return pow( a, vec3( float( GAMMA_FACTOR ) ) );\n\n #else\n\n return a;\n\n #endif\n\n}\n\nvec3 linearToOutput( in vec3 a ) {\n\n #ifdef GAMMA_OUTPUT\n\n return pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );\n\n #else\n\n return a;\n\n #endif\n\n}\n"; + +// File:src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl + +THREE.ShaderChunk[ 'defaultnormal_vertex'] = "#ifdef FLIP_SIDED\n\n objectNormal = -objectNormal;\n\n#endif\n\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; + +// File:src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl + +THREE.ShaderChunk[ 'displacementmap_vertex'] = "#ifdef USE_DISPLACEMENTMAP\n\n transformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl + +THREE.ShaderChunk[ 'displacementmap_pars_vertex'] = "#ifdef USE_DISPLACEMENTMAP\n\n uniform sampler2D displacementMap;\n uniform float displacementScale;\n uniform float displacementBias;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl + +THREE.ShaderChunk[ 'emissivemap_fragment'] = "#ifdef USE_EMISSIVEMAP\n\n vec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n emissiveColor.rgb = inputToLinear( emissiveColor.rgb );\n\n totalEmissiveLight *= emissiveColor.rgb;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl + +THREE.ShaderChunk[ 'emissivemap_pars_fragment'] = "#ifdef USE_EMISSIVEMAP\n\n uniform sampler2D emissiveMap;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/envmap_fragment.glsl + +THREE.ShaderChunk[ 'envmap_fragment'] = "#ifdef USE_ENVMAP\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n #else\n\n vec3 reflectVec = vReflect;\n\n #endif\n\n #ifdef DOUBLE_SIDED\n float flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n #else\n float flipNormal = 1.0;\n #endif\n\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n #elif defined( ENVMAP_TYPE_EQUIREC )\n vec2 sampleUV;\n sampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n sampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n vec4 envColor = texture2D( envMap, sampleUV );\n\n #elif defined( ENVMAP_TYPE_SPHERE )\n vec3 reflectView = flipNormal * normalize((viewMatrix * vec4( reflectVec, 0.0 )).xyz + vec3(0.0,0.0,1.0));\n vec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n #endif\n\n envColor.xyz = inputToLinear( envColor.xyz );\n\n #ifdef ENVMAP_BLENDING_MULTIPLY\n\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_MIX )\n\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_ADD )\n\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'envmap_pars_fragment'] = "#ifdef USE_ENVMAP\n\n uniform float reflectivity;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n uniform float flipEnvMap;\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n uniform float refractionRatio;\n\n #else\n\n varying vec3 vReflect;\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl + +THREE.ShaderChunk[ 'envmap_pars_vertex'] = "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n varying vec3 vReflect;\n\n uniform float refractionRatio;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/envmap_vertex.glsl + +THREE.ShaderChunk[ 'envmap_vertex'] = "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vReflect = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/fog_fragment.glsl + +THREE.ShaderChunk[ 'fog_fragment'] = "#ifdef USE_FOG\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n float depth = gl_FragDepthEXT / gl_FragCoord.w;\n\n #else\n\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n\n #endif\n\n #ifdef FOG_EXP2\n\n float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\n #else\n\n float fogFactor = smoothstep( fogNear, fogFar, depth );\n\n #endif\n \n outgoingLight = mix( outgoingLight, fogColor, fogFactor );\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl + +THREE.ShaderChunk[ 'fog_pars_fragment'] = "#ifdef USE_FOG\n\n uniform vec3 fogColor;\n\n #ifdef FOG_EXP2\n\n uniform float fogDensity;\n\n #else\n\n uniform float fogNear;\n uniform float fogFar;\n #endif\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/hemilight_fragment.glsl + +THREE.ShaderChunk[ 'hemilight_fragment'] = "#if MAX_HEMI_LIGHTS > 0\n\n for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lightDir = hemisphereLightDirection[ i ];\n\n float dotProduct = dot( normal, lightDir );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vec3 lightColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n totalAmbientLight += lightColor;\n\n }\n\n#endif\n\n"; + +// File:src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl + +THREE.ShaderChunk[ 'lightmap_fragment'] = "#ifdef USE_LIGHTMAP\n\n totalAmbientLight += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'lightmap_pars_fragment'] = "#ifdef USE_LIGHTMAP\n\n uniform sampler2D lightMap;\n uniform float lightMapIntensity;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/lights_lambert_pars_vertex.glsl + +THREE.ShaderChunk[ 'lights_lambert_pars_vertex'] = "#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl + +THREE.ShaderChunk[ 'lights_lambert_vertex'] = "vLightFront = vec3( 0.0 );\n\n#ifdef DOUBLE_SIDED\n\n vLightBack = vec3( 0.0 );\n\n#endif\n\nvec3 normal = normalize( transformedNormal );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec3 lightColor = pointLightColor[ i ];\n\n vec3 lVector = pointLightPosition[ i ] - mvPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * attenuation * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n #endif\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec3 lightColor = spotLightColor[ i ];\n\n vec3 lightPosition = spotLightPosition[ i ];\n vec3 lVector = lightPosition - mvPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n attenuation *= spotEffect;\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * attenuation * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n #endif\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 lightColor = directionalLightColor[ i ];\n\n vec3 lightDir = directionalLightDirection[ i ];\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * saturate( - dotProduct );\n\n #endif\n\n }\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lightDir = hemisphereLightDirection[ i ];\n\n\n float dotProduct = dot( normal, lightDir );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n #ifdef DOUBLE_SIDED\n\n float hemiDiffuseWeightBack = - 0.5 * dotProduct + 0.5;\n\n vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n\n #endif\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl + +THREE.ShaderChunk[ 'lights_phong_fragment'] = "vec3 viewDir = normalize( vViewPosition );\n\nvec3 totalDiffuseLight = vec3( 0.0 );\nvec3 totalSpecularLight = vec3( 0.0 );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec3 lightColor = pointLightColor[ i ];\n\n vec3 lightPosition = pointLightPosition[ i ];\n vec3 lVector = lightPosition + vViewPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec3 lightColor = spotLightColor[ i ];\n\n vec3 lightPosition = spotLightPosition[ i ];\n vec3 lVector = lightPosition + vViewPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n attenuation *= spotEffect;\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 lightColor = directionalLightColor[ i ];\n\n vec3 lightDir = directionalLightDirection[ i ];\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * cosineTerm;\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl + +THREE.ShaderChunk[ 'lights_phong_pars_fragment'] = "uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\nvarying vec3 vViewPosition;\n\n#ifndef FLAT_SHADED\n\n varying vec3 vNormal;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_phong_pars_vertex.glsl + +THREE.ShaderChunk[ 'lights_phong_pars_vertex'] = "#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/lights_phong_vertex.glsl + +THREE.ShaderChunk[ 'lights_phong_vertex'] = "#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n vWorldPosition = worldPosition.xyz;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl + +THREE.ShaderChunk[ 'linear_to_gamma_fragment'] = "\n outgoingLight = linearToOutput( outgoingLight );\n"; + +// File:src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl + +THREE.ShaderChunk[ 'logdepthbuf_fragment'] = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\n gl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl + +THREE.ShaderChunk[ 'logdepthbuf_pars_fragment'] = "#ifdef USE_LOGDEPTHBUF\n\n uniform float logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl + +THREE.ShaderChunk[ 'logdepthbuf_pars_vertex'] = "#ifdef USE_LOGDEPTHBUF\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n uniform float logDepthBufFC;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl + +THREE.ShaderChunk[ 'logdepthbuf_vertex'] = "#ifdef USE_LOGDEPTHBUF\n\n gl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n vFragDepth = 1.0 + gl_Position.w;\n\n#else\n\n gl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\n #endif\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/map_fragment.glsl + +THREE.ShaderChunk[ 'map_fragment'] = "#ifdef USE_MAP\n\n vec4 texelColor = texture2D( map, vUv );\n\n texelColor.xyz = inputToLinear( texelColor.xyz );\n\n diffuseColor *= texelColor;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl + +THREE.ShaderChunk[ 'map_pars_fragment'] = "#ifdef USE_MAP\n\n uniform sampler2D map;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl + +THREE.ShaderChunk[ 'map_particle_fragment'] = "#ifdef USE_MAP\n\n diffuseColor *= texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl + +THREE.ShaderChunk[ 'map_particle_pars_fragment'] = "#ifdef USE_MAP\n\n uniform vec4 offsetRepeat;\n uniform sampler2D map;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl + +THREE.ShaderChunk[ 'morphnormal_vertex'] = "#ifdef USE_MORPHNORMALS\n\n objectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n objectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n objectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n objectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl + +THREE.ShaderChunk[ 'morphtarget_pars_vertex'] = "#ifdef USE_MORPHTARGETS\n\n #ifndef USE_MORPHNORMALS\n\n uniform float morphTargetInfluences[ 8 ];\n\n #else\n\n uniform float morphTargetInfluences[ 4 ];\n\n #endif\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl + +THREE.ShaderChunk[ 'morphtarget_vertex'] = "#ifdef USE_MORPHTARGETS\n\n transformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n transformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n transformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n transformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\n #ifndef USE_MORPHNORMALS\n\n transformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n transformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n transformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n transformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/normal_phong_fragment.glsl + +THREE.ShaderChunk[ 'normal_phong_fragment'] = "#ifndef FLAT_SHADED\n\n vec3 normal = normalize( vNormal );\n\n #ifdef DOUBLE_SIDED\n\n normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n\n #endif\n\n#else\n\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n\n#endif\n\n#ifdef USE_NORMALMAP\n\n normal = perturbNormal2Arb( -vViewPosition, normal );\n\n#elif defined( USE_BUMPMAP )\n\n normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n\n#endif\n\n"; + +// File:src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'normalmap_pars_fragment'] = "#ifdef USE_NORMALMAP\n\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n\n\n vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\n vec3 q0 = dFdx( eye_pos.xyz );\n vec3 q1 = dFdy( eye_pos.xyz );\n vec2 st0 = dFdx( vUv.st );\n vec2 st1 = dFdy( vUv.st );\n\n vec3 S = normalize( q0 * st1.t - q1 * st0.t );\n vec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n vec3 N = normalize( surf_norm );\n\n vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n mapN.xy = normalScale * mapN.xy;\n mat3 tsn = mat3( S, T, N );\n return normalize( tsn * mapN );\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/project_vertex.glsl + +THREE.ShaderChunk[ 'project_vertex'] = "#ifdef USE_SKINNING\n\n vec4 mvPosition = modelViewMatrix * skinned;\n\n#else\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\n#endif\n\ngl_Position = projectionMatrix * mvPosition;\n"; + +// File:src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl + +THREE.ShaderChunk[ 'shadowmap_fragment'] = "#ifdef USE_SHADOWMAP\n\n for ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n float texelSizeY = 1.0 / shadowMapSize[ i ].y;\n\n float shadow = 0.0;\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n bool isPointLight = shadowDarkness[ i ] < 0.0;\n\n if ( isPointLight ) {\n\n float realShadowDarkness = abs( shadowDarkness[ i ] );\n\n vec3 lightToPosition = vShadowCoord[ i ].xyz;\n\n #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n vec3 bd3D = normalize( lightToPosition );\n float dp = length( lightToPosition );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n\n #if defined( SHADOWMAP_TYPE_PCF )\n const float Dr = 1.25;\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n const float Dr = 2.25;\n #endif\n\n float os = Dr * 2.0 * texelSizeY;\n\n const vec3 Gsd = vec3( - 1, 0, 1 );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n shadow *= realShadowDarkness * ( 1.0 / 21.0 );\n\n #else \n vec3 bd3D = normalize( lightToPosition );\n float dp = length( lightToPosition );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n shadow *= realShadowDarkness;\n\n #endif\n\n } else {\n\n#endif \n float texelSizeX = 1.0 / shadowMapSize[ i ].x;\n\n vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\n\n\n bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n bool inFrustum = all( inFrustumVec );\n\n bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n bool frustumTest = all( frustumTestVec );\n\n if ( frustumTest ) {\n\n #if defined( SHADOWMAP_TYPE_PCF )\n\n\n /*\n for ( float y = -1.25; y <= 1.25; y += 1.25 )\n for ( float x = -1.25; x <= 1.25; x += 1.25 ) {\n vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n if ( fDepth < shadowCoord.z )\n shadow += 1.0;\n }\n shadow /= 9.0;\n */\n\n shadowCoord.z += shadowBias[ i ];\n\n const float ShadowDelta = 1.0 / 9.0;\n\n float xPixelOffset = texelSizeX;\n float yPixelOffset = texelSizeY;\n\n float dx0 = - 1.25 * xPixelOffset;\n float dy0 = - 1.25 * yPixelOffset;\n float dx1 = 1.25 * xPixelOffset;\n float dy1 = 1.25 * yPixelOffset;\n\n float fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n shadow *= shadowDarkness[ i ];\n\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\n shadowCoord.z += shadowBias[ i ];\n\n float xPixelOffset = texelSizeX;\n float yPixelOffset = texelSizeY;\n\n float dx0 = - 1.0 * xPixelOffset;\n float dy0 = - 1.0 * yPixelOffset;\n float dx1 = 1.0 * xPixelOffset;\n float dy1 = 1.0 * yPixelOffset;\n\n mat3 shadowKernel;\n mat3 depthKernel;\n\n depthKernel[ 0 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n depthKernel[ 0 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n depthKernel[ 0 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n depthKernel[ 1 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n depthKernel[ 1 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n depthKernel[ 1 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n depthKernel[ 2 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n depthKernel[ 2 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n depthKernel[ 2 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\n vec3 shadowZ = vec3( shadowCoord.z );\n shadowKernel[ 0 ] = vec3( lessThan( depthKernel[ 0 ], shadowZ ) );\n shadowKernel[ 0 ] *= vec3( 0.25 );\n\n shadowKernel[ 1 ] = vec3( lessThan( depthKernel[ 1 ], shadowZ ) );\n shadowKernel[ 1 ] *= vec3( 0.25 );\n\n shadowKernel[ 2 ] = vec3( lessThan( depthKernel[ 2 ], shadowZ ) );\n shadowKernel[ 2 ] *= vec3( 0.25 );\n\n vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[ i ].xy );\n\n shadowKernel[ 0 ] = mix( shadowKernel[ 1 ], shadowKernel[ 0 ], fractionalCoord.x );\n shadowKernel[ 1 ] = mix( shadowKernel[ 2 ], shadowKernel[ 1 ], fractionalCoord.x );\n\n vec4 shadowValues;\n shadowValues.x = mix( shadowKernel[ 0 ][ 1 ], shadowKernel[ 0 ][ 0 ], fractionalCoord.y );\n shadowValues.y = mix( shadowKernel[ 0 ][ 2 ], shadowKernel[ 0 ][ 1 ], fractionalCoord.y );\n shadowValues.z = mix( shadowKernel[ 1 ][ 1 ], shadowKernel[ 1 ][ 0 ], fractionalCoord.y );\n shadowValues.w = mix( shadowKernel[ 1 ][ 2 ], shadowKernel[ 1 ][ 1 ], fractionalCoord.y );\n\n shadow = dot( shadowValues, vec4( 1.0 ) ) * shadowDarkness[ i ];\n\n #else \n shadowCoord.z += shadowBias[ i ];\n\n vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n\n if ( fDepth < shadowCoord.z )\n shadow = shadowDarkness[ i ];\n\n #endif\n\n }\n\n#ifdef SHADOWMAP_DEBUG\n\n if ( inFrustum ) {\n\n if ( i == 0 ) {\n\n outgoingLight *= vec3( 1.0, 0.5, 0.0 );\n\n } else if ( i == 1 ) {\n\n outgoingLight *= vec3( 0.0, 1.0, 0.8 );\n\n } else {\n\n outgoingLight *= vec3( 0.0, 0.5, 1.0 );\n\n }\n\n }\n\n#endif\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n }\n\n#endif\n\n shadowMask = shadowMask * vec3( 1.0 - shadow );\n\n }\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'shadowmap_pars_fragment'] = "#ifdef USE_SHADOWMAP\n\n uniform sampler2D shadowMap[ MAX_SHADOWS ];\n uniform vec2 shadowMapSize[ MAX_SHADOWS ];\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform float shadowBias[ MAX_SHADOWS ];\n\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n float unpackDepth( const in vec4 rgba_depth ) {\n\n const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n float depth = dot( rgba_depth, bit_shift );\n return depth;\n\n }\n\n #if defined(POINT_LIGHT_SHADOWS)\n\n\n void adjustShadowValue1K( const float testDepth, const vec4 textureData, const float bias, inout float shadowValue ) {\n\n const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n if ( testDepth >= dot( textureData, bitSh ) * 1000.0 + bias )\n shadowValue += 1.0;\n\n }\n\n\n vec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\n vec3 absV = abs( v );\n\n\n float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n absV *= scaleToCube;\n\n\n v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\n\n vec2 planar = v.xy;\n\n float almostATexel = 1.5 * texelSizeY;\n float almostOne = 1.0 - almostATexel;\n\n if ( absV.z >= almostOne ) {\n\n if ( v.z > 0.0 )\n planar.x = 4.0 - v.x;\n\n } else if ( absV.x >= almostOne ) {\n\n float signX = sign( v.x );\n planar.x = v.z * signX + 2.0 * signX;\n\n } else if ( absV.y >= almostOne ) {\n\n float signY = sign( v.y );\n planar.x = v.x + 2.0 * signY + 2.0;\n planar.y = v.z * signY - 2.0;\n\n }\n\n\n return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n }\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl + +THREE.ShaderChunk[ 'shadowmap_pars_vertex'] = "#ifdef USE_SHADOWMAP\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform mat4 shadowMatrix[ MAX_SHADOWS ];\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl + +THREE.ShaderChunk[ 'shadowmap_vertex'] = "#ifdef USE_SHADOWMAP\n\n for ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n\n }\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl + +THREE.ShaderChunk[ 'skinbase_vertex'] = "#ifdef USE_SKINNING\n\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl + +THREE.ShaderChunk[ 'skinning_pars_vertex'] = "#ifdef USE_SKINNING\n\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n\n #ifdef BONE_TEXTURE\n\n uniform sampler2D boneTexture;\n uniform int boneTextureWidth;\n uniform int boneTextureHeight;\n\n mat4 getBoneMatrix( const in float i ) {\n\n float j = i * 4.0;\n float x = mod( j, float( boneTextureWidth ) );\n float y = floor( j / float( boneTextureWidth ) );\n\n float dx = 1.0 / float( boneTextureWidth );\n float dy = 1.0 / float( boneTextureHeight );\n\n y = dy * ( y + 0.5 );\n\n vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n mat4 bone = mat4( v1, v2, v3, v4 );\n\n return bone;\n\n }\n\n #else\n\n uniform mat4 boneGlobalMatrices[ MAX_BONES ];\n\n mat4 getBoneMatrix( const in float i ) {\n\n mat4 bone = boneGlobalMatrices[ int(i) ];\n return bone;\n\n }\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/skinning_vertex.glsl + +THREE.ShaderChunk[ 'skinning_vertex'] = "#ifdef USE_SKINNING\n\n vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\n vec4 skinned = vec4( 0.0 );\n skinned += boneMatX * skinVertex * skinWeight.x;\n skinned += boneMatY * skinVertex * skinWeight.y;\n skinned += boneMatZ * skinVertex * skinWeight.z;\n skinned += boneMatW * skinVertex * skinWeight.w;\n skinned = bindMatrixInverse * skinned;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl + +THREE.ShaderChunk[ 'skinnormal_vertex'] = "#ifdef USE_SKINNING\n\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl + +THREE.ShaderChunk[ 'specularmap_fragment'] = "float specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n vec4 texelSpecular = texture2D( specularMap, vUv );\n specularStrength = texelSpecular.r;\n\n#else\n\n specularStrength = 1.0;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl + +THREE.ShaderChunk[ 'specularmap_pars_fragment'] = "#ifdef USE_SPECULARMAP\n\n uniform sampler2D specularMap;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl + +THREE.ShaderChunk[ 'uv2_pars_fragment'] = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n varying vec2 vUv2;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl + +THREE.ShaderChunk[ 'uv2_pars_vertex'] = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n attribute vec2 uv2;\n varying vec2 vUv2;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv2_vertex.glsl + +THREE.ShaderChunk[ 'uv2_vertex'] = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n vUv2 = uv2;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl + +THREE.ShaderChunk[ 'uv_pars_fragment'] = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n varying vec2 vUv;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl + +THREE.ShaderChunk[ 'uv_pars_vertex'] = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n varying vec2 vUv;\n uniform vec4 offsetRepeat;\n\n#endif\n"; + +// File:src/renderers/shaders/ShaderChunk/uv_vertex.glsl + +THREE.ShaderChunk[ 'uv_vertex'] = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n vUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n\n#endif"; + +// File:src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl + +THREE.ShaderChunk[ 'worldpos_vertex'] = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\n #ifdef USE_SKINNING\n\n vec4 worldPosition = modelMatrix * skinned;\n\n #else\n\n vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\n #endif\n\n#endif\n"; + +// File:src/renderers/shaders/UniformsUtils.js + +/** + * Uniform Utilities + */ + +THREE.UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src instanceof THREE.Color || + parameter_src instanceof THREE.Vector2 || + parameter_src instanceof THREE.Vector3 || + parameter_src instanceof THREE.Vector4 || + parameter_src instanceof THREE.Matrix3 || + parameter_src instanceof THREE.Matrix4 || + parameter_src instanceof THREE.Texture ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + +}; + +// File:src/renderers/shaders/UniformsLib.js + +/** + * Uniforms library for shared webgl shaders + */ + +THREE.UniformsLib = { + + common: { + + "diffuse" : { type: "c", value: new THREE.Color( 0xeeeeee ) }, + "opacity" : { type: "f", value: 1.0 }, + + "map" : { type: "t", value: null }, + "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) }, + + "specularMap" : { type: "t", value: null }, + "alphaMap" : { type: "t", value: null }, + + "envMap" : { type: "t", value: null }, + "flipEnvMap" : { type: "f", value: - 1 }, + "reflectivity" : { type: "f", value: 1.0 }, + "refractionRatio" : { type: "f", value: 0.98 } + + }, + + aomap: { + + "aoMap" : { type: "t", value: null }, + "aoMapIntensity" : { type: "f", value: 1 }, + + }, + + lightmap: { + + "lightMap" : { type: "t", value: null }, + "lightMapIntensity" : { type: "f", value: 1 }, + + }, + + emissivemap: { + + "emissiveMap" : { type: "t", value: null }, + + }, + + bumpmap: { + + "bumpMap" : { type: "t", value: null }, + "bumpScale" : { type: "f", value: 1 } + + }, + + normalmap: { + + "normalMap" : { type: "t", value: null }, + "normalScale" : { type: "v2", value: new THREE.Vector2( 1, 1 ) } + + }, + + displacementmap: { + + "displacementMap" : { type: "t", value: null }, + "displacementScale" : { type: "f", value: 1 }, + "displacementBias" : { type: "f", value: 0 } + + }, + + fog : { + + "fogDensity" : { type: "f", value: 0.00025 }, + "fogNear" : { type: "f", value: 1 }, + "fogFar" : { type: "f", value: 2000 }, + "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) } + + }, + + lights: { + + "ambientLightColor" : { type: "fv", value: [] }, + + "directionalLightDirection" : { type: "fv", value: [] }, + "directionalLightColor" : { type: "fv", value: [] }, + + "hemisphereLightDirection" : { type: "fv", value: [] }, + "hemisphereLightSkyColor" : { type: "fv", value: [] }, + "hemisphereLightGroundColor" : { type: "fv", value: [] }, + + "pointLightColor" : { type: "fv", value: [] }, + "pointLightPosition" : { type: "fv", value: [] }, + "pointLightDistance" : { type: "fv1", value: [] }, + "pointLightDecay" : { type: "fv1", value: [] }, + + "spotLightColor" : { type: "fv", value: [] }, + "spotLightPosition" : { type: "fv", value: [] }, + "spotLightDirection" : { type: "fv", value: [] }, + "spotLightDistance" : { type: "fv1", value: [] }, + "spotLightAngleCos" : { type: "fv1", value: [] }, + "spotLightExponent" : { type: "fv1", value: [] }, + "spotLightDecay" : { type: "fv1", value: [] } + + }, + + points: { + + "psColor" : { type: "c", value: new THREE.Color( 0xeeeeee ) }, + "opacity" : { type: "f", value: 1.0 }, + "size" : { type: "f", value: 1.0 }, + "scale" : { type: "f", value: 1.0 }, + "map" : { type: "t", value: null }, + "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) }, + + "fogDensity" : { type: "f", value: 0.00025 }, + "fogNear" : { type: "f", value: 1 }, + "fogFar" : { type: "f", value: 2000 }, + "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) } + + }, + + shadowmap: { + + "shadowMap": { type: "tv", value: [] }, + "shadowMapSize": { type: "v2v", value: [] }, + + "shadowBias" : { type: "fv1", value: [] }, + "shadowDarkness": { type: "fv1", value: [] }, + + "shadowMatrix" : { type: "m4v", value: [] } + + } + +}; + +// File:src/renderers/shaders/ShaderLib.js + +/** + * Webgl Shader Library for three.js + * + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + +THREE.ShaderLib = { + + 'basic': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "common" ], + THREE.UniformsLib[ "aomap" ], + THREE.UniformsLib[ "fog" ], + THREE.UniformsLib[ "shadowmap" ] + + ] ), + + vertexShader: [ + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "uv_pars_vertex" ], + THREE.ShaderChunk[ "uv2_pars_vertex" ], + THREE.ShaderChunk[ "envmap_pars_vertex" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + THREE.ShaderChunk[ "shadowmap_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "uv_vertex" ], + THREE.ShaderChunk[ "uv2_vertex" ], + THREE.ShaderChunk[ "color_vertex" ], + THREE.ShaderChunk[ "skinbase_vertex" ], + + " #ifdef USE_ENVMAP", + + THREE.ShaderChunk[ "beginnormal_vertex" ], + THREE.ShaderChunk[ "morphnormal_vertex" ], + THREE.ShaderChunk[ "skinnormal_vertex" ], + THREE.ShaderChunk[ "defaultnormal_vertex" ], + + " #endif", + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + THREE.ShaderChunk[ "worldpos_vertex" ], + THREE.ShaderChunk[ "envmap_vertex" ], + THREE.ShaderChunk[ "shadowmap_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 diffuse;", + "uniform float opacity;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "uv_pars_fragment" ], + THREE.ShaderChunk[ "uv2_pars_fragment" ], + THREE.ShaderChunk[ "map_pars_fragment" ], + THREE.ShaderChunk[ "alphamap_pars_fragment" ], + THREE.ShaderChunk[ "aomap_pars_fragment" ], + THREE.ShaderChunk[ "envmap_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "specularmap_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vec4( diffuse, opacity );", + " vec3 totalAmbientLight = vec3( 1.0 );", // hardwired + " vec3 shadowMask = vec3( 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "map_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + THREE.ShaderChunk[ "alphamap_fragment" ], + THREE.ShaderChunk[ "alphatest_fragment" ], + THREE.ShaderChunk[ "specularmap_fragment" ], + THREE.ShaderChunk[ "aomap_fragment" ], + THREE.ShaderChunk[ "shadowmap_fragment" ], + + " outgoingLight = diffuseColor.rgb * totalAmbientLight * shadowMask;", + + THREE.ShaderChunk[ "envmap_fragment" ], + + THREE.ShaderChunk[ "linear_to_gamma_fragment" ], + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'lambert': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "common" ], + THREE.UniformsLib[ "fog" ], + THREE.UniformsLib[ "lights" ], + THREE.UniformsLib[ "shadowmap" ], + + { + "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) } + } + + ] ), + + vertexShader: [ + + "#define LAMBERT", + + "varying vec3 vLightFront;", + + "#ifdef DOUBLE_SIDED", + + " varying vec3 vLightBack;", + + "#endif", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "uv_pars_vertex" ], + THREE.ShaderChunk[ "uv2_pars_vertex" ], + THREE.ShaderChunk[ "envmap_pars_vertex" ], + THREE.ShaderChunk[ "lights_lambert_pars_vertex" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + THREE.ShaderChunk[ "shadowmap_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "uv_vertex" ], + THREE.ShaderChunk[ "uv2_vertex" ], + THREE.ShaderChunk[ "color_vertex" ], + + THREE.ShaderChunk[ "beginnormal_vertex" ], + THREE.ShaderChunk[ "morphnormal_vertex" ], + THREE.ShaderChunk[ "skinbase_vertex" ], + THREE.ShaderChunk[ "skinnormal_vertex" ], + THREE.ShaderChunk[ "defaultnormal_vertex" ], + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + THREE.ShaderChunk[ "worldpos_vertex" ], + THREE.ShaderChunk[ "envmap_vertex" ], + THREE.ShaderChunk[ "lights_lambert_vertex" ], + THREE.ShaderChunk[ "shadowmap_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 diffuse;", + "uniform vec3 emissive;", + "uniform float opacity;", + + "uniform vec3 ambientLightColor;", + + "varying vec3 vLightFront;", + + "#ifdef DOUBLE_SIDED", + + " varying vec3 vLightBack;", + + "#endif", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "uv_pars_fragment" ], + THREE.ShaderChunk[ "uv2_pars_fragment" ], + THREE.ShaderChunk[ "map_pars_fragment" ], + THREE.ShaderChunk[ "alphamap_pars_fragment" ], + THREE.ShaderChunk[ "envmap_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "specularmap_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " vec3 outgoingLight = vec3( 0.0 );", // outgoing light does not have an alpha, the surface does + " vec4 diffuseColor = vec4( diffuse, opacity );", + " vec3 totalAmbientLight = ambientLightColor;", + " vec3 shadowMask = vec3( 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "map_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + THREE.ShaderChunk[ "alphamap_fragment" ], + THREE.ShaderChunk[ "alphatest_fragment" ], + THREE.ShaderChunk[ "specularmap_fragment" ], + THREE.ShaderChunk[ "shadowmap_fragment" ], + + " #ifdef DOUBLE_SIDED", + + " if ( gl_FrontFacing )", + " outgoingLight += diffuseColor.rgb * ( vLightFront * shadowMask + totalAmbientLight ) + emissive;", + " else", + " outgoingLight += diffuseColor.rgb * ( vLightBack * shadowMask + totalAmbientLight ) + emissive;", + + " #else", + + " outgoingLight += diffuseColor.rgb * ( vLightFront * shadowMask + totalAmbientLight ) + emissive;", + + " #endif", + + THREE.ShaderChunk[ "envmap_fragment" ], + + THREE.ShaderChunk[ "linear_to_gamma_fragment" ], + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'phong': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "common" ], + THREE.UniformsLib[ "aomap" ], + THREE.UniformsLib[ "lightmap" ], + THREE.UniformsLib[ "emissivemap" ], + THREE.UniformsLib[ "bumpmap" ], + THREE.UniformsLib[ "normalmap" ], + THREE.UniformsLib[ "displacementmap" ], + THREE.UniformsLib[ "fog" ], + THREE.UniformsLib[ "lights" ], + THREE.UniformsLib[ "shadowmap" ], + + { + "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) }, + "specular" : { type: "c", value: new THREE.Color( 0x111111 ) }, + "shininess": { type: "f", value: 30 } + } + + ] ), + + vertexShader: [ + + "#define PHONG", + + "varying vec3 vViewPosition;", + + "#ifndef FLAT_SHADED", + + " varying vec3 vNormal;", + + "#endif", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "uv_pars_vertex" ], + THREE.ShaderChunk[ "uv2_pars_vertex" ], + THREE.ShaderChunk[ "displacementmap_pars_vertex" ], + THREE.ShaderChunk[ "envmap_pars_vertex" ], + THREE.ShaderChunk[ "lights_phong_pars_vertex" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + THREE.ShaderChunk[ "shadowmap_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "uv_vertex" ], + THREE.ShaderChunk[ "uv2_vertex" ], + THREE.ShaderChunk[ "color_vertex" ], + + THREE.ShaderChunk[ "beginnormal_vertex" ], + THREE.ShaderChunk[ "morphnormal_vertex" ], + THREE.ShaderChunk[ "skinbase_vertex" ], + THREE.ShaderChunk[ "skinnormal_vertex" ], + THREE.ShaderChunk[ "defaultnormal_vertex" ], + + "#ifndef FLAT_SHADED", // Normal computed with derivatives when FLAT_SHADED + + " vNormal = normalize( transformedNormal );", + + "#endif", + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "displacementmap_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + " vViewPosition = - mvPosition.xyz;", + + THREE.ShaderChunk[ "worldpos_vertex" ], + THREE.ShaderChunk[ "envmap_vertex" ], + THREE.ShaderChunk[ "lights_phong_vertex" ], + THREE.ShaderChunk[ "shadowmap_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "#define PHONG", + + "uniform vec3 diffuse;", + "uniform vec3 emissive;", + "uniform vec3 specular;", + "uniform float shininess;", + "uniform float opacity;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "uv_pars_fragment" ], + THREE.ShaderChunk[ "uv2_pars_fragment" ], + THREE.ShaderChunk[ "map_pars_fragment" ], + THREE.ShaderChunk[ "alphamap_pars_fragment" ], + THREE.ShaderChunk[ "aomap_pars_fragment" ], + THREE.ShaderChunk[ "lightmap_pars_fragment" ], + THREE.ShaderChunk[ "emissivemap_pars_fragment" ], + THREE.ShaderChunk[ "envmap_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "lights_phong_pars_fragment" ], + THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "bumpmap_pars_fragment" ], + THREE.ShaderChunk[ "normalmap_pars_fragment" ], + THREE.ShaderChunk[ "specularmap_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vec4( diffuse, opacity );", + " vec3 totalAmbientLight = ambientLightColor;", + " vec3 totalEmissiveLight = emissive;", + " vec3 shadowMask = vec3( 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "map_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + THREE.ShaderChunk[ "alphamap_fragment" ], + THREE.ShaderChunk[ "alphatest_fragment" ], + THREE.ShaderChunk[ "specularmap_fragment" ], + THREE.ShaderChunk[ "normal_phong_fragment" ], + THREE.ShaderChunk[ "lightmap_fragment" ], + THREE.ShaderChunk[ "hemilight_fragment" ], + THREE.ShaderChunk[ "aomap_fragment" ], + THREE.ShaderChunk[ "emissivemap_fragment" ], + + THREE.ShaderChunk[ "lights_phong_fragment" ], + THREE.ShaderChunk[ "shadowmap_fragment" ], + + "totalDiffuseLight *= shadowMask;", + "totalSpecularLight *= shadowMask;", + + "#ifdef METAL", + + " outgoingLight += diffuseColor.rgb * ( totalDiffuseLight + totalAmbientLight ) * specular + totalSpecularLight + totalEmissiveLight;", + + "#else", + + " outgoingLight += diffuseColor.rgb * ( totalDiffuseLight + totalAmbientLight ) + totalSpecularLight + totalEmissiveLight;", + + "#endif", + + THREE.ShaderChunk[ "envmap_fragment" ], + + THREE.ShaderChunk[ "linear_to_gamma_fragment" ], + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'points': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "points" ], + THREE.UniformsLib[ "shadowmap" ] + + ] ), + + vertexShader: [ + + "uniform float size;", + "uniform float scale;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "shadowmap_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "color_vertex" ], + + " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", + + " #ifdef USE_SIZEATTENUATION", + " gl_PointSize = size * ( scale / length( mvPosition.xyz ) );", + " #else", + " gl_PointSize = size;", + " #endif", + + " gl_Position = projectionMatrix * mvPosition;", + + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + THREE.ShaderChunk[ "worldpos_vertex" ], + THREE.ShaderChunk[ "shadowmap_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 psColor;", + "uniform float opacity;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "map_particle_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "shadowmap_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vec4( psColor, opacity );", + " vec3 shadowMask = vec3( 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "map_particle_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + THREE.ShaderChunk[ "alphatest_fragment" ], + THREE.ShaderChunk[ "shadowmap_fragment" ], + + " outgoingLight = diffuseColor.rgb * shadowMask;", + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'dashed': { + + uniforms: THREE.UniformsUtils.merge( [ + + THREE.UniformsLib[ "common" ], + THREE.UniformsLib[ "fog" ], + + { + "scale" : { type: "f", value: 1 }, + "dashSize" : { type: "f", value: 1 }, + "totalSize": { type: "f", value: 2 } + } + + ] ), + + vertexShader: [ + + "uniform float scale;", + "attribute float lineDistance;", + + "varying float vLineDistance;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "color_vertex" ], + + " vLineDistance = scale * lineDistance;", + + " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", + " gl_Position = projectionMatrix * mvPosition;", + + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 diffuse;", + "uniform float opacity;", + + "uniform float dashSize;", + "uniform float totalSize;", + + "varying float vLineDistance;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "color_pars_fragment" ], + THREE.ShaderChunk[ "fog_pars_fragment" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " if ( mod( vLineDistance, totalSize ) > dashSize ) {", + + " discard;", + + " }", + + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vec4( diffuse, opacity );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + THREE.ShaderChunk[ "color_fragment" ], + + " outgoingLight = diffuseColor.rgb;", // simple shader + + THREE.ShaderChunk[ "fog_fragment" ], + + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + + "}" + + ].join( "\n" ) + + }, + + 'depth': { + + uniforms: { + + "mNear": { type: "f", value: 1.0 }, + "mFar" : { type: "f", value: 2000.0 }, + "opacity" : { type: "f", value: 1.0 } + + }, + + vertexShader: [ + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform float mNear;", + "uniform float mFar;", + "uniform float opacity;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + " #ifdef USE_LOGDEPTHBUF_EXT", + + " float depth = gl_FragDepthEXT / gl_FragCoord.w;", + + " #else", + + " float depth = gl_FragCoord.z / gl_FragCoord.w;", + + " #endif", + + " float color = 1.0 - smoothstep( mNear, mFar, depth );", + " gl_FragColor = vec4( vec3( color ), opacity );", + + "}" + + ].join( "\n" ) + + }, + + 'normal': { + + uniforms: { + + "opacity" : { type: "f", value: 1.0 } + + }, + + vertexShader: [ + + "varying vec3 vNormal;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + " vNormal = normalize( normalMatrix * normal );", + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform float opacity;", + "varying vec3 vNormal;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + "}" + + ].join( "\n" ) + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + 'cube': { + + uniforms: { "tCube": { type: "t", value: null }, + "tFlip": { type: "f", value: - 1 } }, + + vertexShader: [ + + "varying vec3 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + " vWorldPosition = transformDirection( position, modelMatrix );", + + " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform samplerCube tCube;", + "uniform float tFlip;", + + "varying vec3 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + "}" + + ].join( "\n" ) + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + 'equirect': { + + uniforms: { "tEquirect": { type: "t", value: null }, + "tFlip": { type: "f", value: - 1 } }, + + vertexShader: [ + + "varying vec3 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + " vWorldPosition = transformDirection( position, modelMatrix );", + + " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform sampler2D tEquirect;", + "uniform float tFlip;", + + "varying vec3 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "void main() {", + + // " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );", + "vec3 direction = normalize( vWorldPosition );", + "vec2 sampleUV;", + "sampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );", + "sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;", + "gl_FragColor = texture2D( tEquirect, sampleUV );", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + "}" + + ].join( "\n" ) + + }, + + /* Depth encoding into RGBA texture + * + * based on SpiderGL shadow map example + * http://spidergl.org/example.php?id=6 + * + * originally from + * http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD + * + * see also + * http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ + */ + + 'depthRGBA': { + + uniforms: {}, + + vertexShader: [ + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "skinbase_vertex" ], + + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "logdepthbuf_vertex" ], + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], + + "vec4 pack_depth( const in float depth ) {", + + " const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );", + " const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );", + " vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );", // " vec4 res = fract( depth * bit_shift );", + " res -= res.xxyz * bit_mask;", + " return res;", + + "}", + + "void main() {", + + THREE.ShaderChunk[ "logdepthbuf_fragment" ], + + " #ifdef USE_LOGDEPTHBUF_EXT", + + " gl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );", + + " #else", + + " gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );", + + " #endif", + + //"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );", + //"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );", + //"gl_FragData[ 0 ] = pack_depth( z );", + //"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );", + + "}" + + ].join( "\n" ) + + }, + + + 'distanceRGBA': { + + uniforms: { + + "lightPos": { type: "v3", value: new THREE.Vector3( 0, 0, 0 ) } + + }, + + vertexShader: [ + + "varying vec4 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + THREE.ShaderChunk[ "morphtarget_pars_vertex" ], + THREE.ShaderChunk[ "skinning_pars_vertex" ], + + "void main() {", + + THREE.ShaderChunk[ "skinbase_vertex" ], + THREE.ShaderChunk[ "begin_vertex" ], + THREE.ShaderChunk[ "morphtarget_vertex" ], + THREE.ShaderChunk[ "skinning_vertex" ], + THREE.ShaderChunk[ "project_vertex" ], + THREE.ShaderChunk[ "worldpos_vertex" ], + + "vWorldPosition = worldPosition;", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform vec3 lightPos;", + "varying vec4 vWorldPosition;", + + THREE.ShaderChunk[ "common" ], + + "vec4 pack1K ( float depth ) {", + + " depth /= 1000.0;", + " const vec4 bitSh = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );", + " const vec4 bitMsk = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );", + " vec4 res = fract( depth * bitSh );", + " res -= res.xxyz * bitMsk;", + " return res; ", + + "}", + + "float unpack1K ( vec4 color ) {", + + " const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );", + " return dot( color, bitSh ) * 1000.0;", + + "}", + + "void main () {", + + " gl_FragColor = pack1K( length( vWorldPosition.xyz - lightPos.xyz ) );", + + "}" + + ].join( "\n" ) + + } + +}; + +// File:src/renderers/WebGLRenderer.js + +/** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + +THREE.WebGLRenderer = function ( parameters ) { + + console.log( 'THREE.WebGLRenderer', THREE.REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _width = _canvas.width, + _height = _canvas.height, + + pixelRatio = 1, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, + + _clearColor = new THREE.Color( 0x000000 ), + _clearAlpha = 0; + + var lights = []; + + var opaqueObjects = []; + var opaqueObjectsLastIndex = - 1; + var transparentObjects = []; + var transparentObjectsLastIndex = - 1; + + var morphInfluences = new Float32Array( 8 ); + + + var sprites = []; + var lensFlares = []; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // flags + + this.autoScaleCubemaps = true; + + // internal properties + + var _this = this, + + // internal state cache + + _currentProgram = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + _currentCamera = null, + + _usedTextureUnits = 0, + + _viewportX = 0, + _viewportY = 0, + _viewportWidth = _canvas.width, + _viewportHeight = _canvas.height, + _currentWidth = 0, + _currentHeight = 0, + + // frustum + + _frustum = new THREE.Frustum(), + + // camera matrices cache + + _projScreenMatrix = new THREE.Matrix4(), + + _vector3 = new THREE.Vector3(), + + // light arrays cache + + _direction = new THREE.Vector3(), + + _lightsNeedUpdate = true, + + _lights = { + + ambient: [ 0, 0, 0 ], + directional: { length: 0, colors: [], positions: [] }, + point: { length: 0, colors: [], positions: [], distances: [], decays: [] }, + spot: { length: 0, colors: [], positions: [], distances: [], directions: [], anglesCos: [], exponents: [], decays: [] }, + hemi: { length: 0, skyColors: [], groundColors: [], positions: [] } + + }, + + // info + + _infoMemory = { + + geometries: 0, + textures: 0 + + }, + + _infoRender = { + + calls: 0, + vertices: 0, + faces: 0, + points: 0 + + }; + + this.info = { + + render: _infoRender, + memory: _infoMemory, + programs: null + + }; + + + // initialize + + var _gl; + + try { + + var attributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer + }; + + _gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw 'Error creating WebGL context with your selected attributes.'; + + } else { + + throw 'Error creating WebGL context.'; + + } + + } + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error ); + + } + + var extensions = new THREE.WebGLExtensions( _gl ); + + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extensions.get( 'OES_element_index_uint' ) ) { + + THREE.BufferGeometry.MaxIndex = 4294967296; + + } + + var capabilities = new THREE.WebGLCapabilities( _gl, extensions, parameters ); + + var state = new THREE.WebGLState( _gl, extensions, paramThreeToGL ); + var properties = new THREE.WebGLProperties(); + var objects = new THREE.WebGLObjects( _gl, properties, this.info ); + var programCache = new THREE.WebGLPrograms( this, capabilities ); + + this.info.programs = programCache.programs; + + var bufferRenderer = new THREE.WebGLBufferRenderer( _gl, extensions, _infoRender ); + var indexedBufferRenderer = new THREE.WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ); + + // + + function glClearColor( r, g, b, a ) { + + if ( _premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + _gl.clearColor( r, g, b, a ); + + } + + function setDefaultGLState() { + + state.init(); + + _gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight ); + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + } + + function resetGLState() { + + _currentProgram = null; + _currentCamera = null; + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + + _lightsNeedUpdate = true; + + state.reset(); + + } + + setDefaultGLState(); + + this.context = _gl; + this.capabilities = capabilities; + this.extensions = extensions; + this.state = state; + + // shadow map + + var shadowMap = new THREE.WebGLShadowMap( this, lights, objects ); + + this.shadowMap = shadowMap; + + + // Plugins + + var spritePlugin = new THREE.SpritePlugin( this, sprites ); + var lensFlarePlugin = new THREE.LensFlarePlugin( this, lensFlares ); + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + extensions.get( 'WEBGL_lose_context' ).loseContext(); + + }; + + this.getMaxAnisotropy = ( function () { + + var value; + + return function getMaxAnisotropy() { + + if ( value !== undefined ) return value; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + value = _gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + value = 0; + + } + + return value; + + } + + } )(); + + this.getPrecision = function () { + + return capabilities.precision; + + }; + + this.getPixelRatio = function () { + + return pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value !== undefined ) pixelRatio = value; + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * pixelRatio; + _canvas.height = height * pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + _viewportX = x * pixelRatio; + _viewportY = y * pixelRatio; + + _viewportWidth = width * pixelRatio; + _viewportHeight = height * pixelRatio; + + _gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight ); + + }; + + this.getViewport = function ( dimensions ) { + + dimensions.x = _viewportX / pixelRatio; + dimensions.y = _viewportY / pixelRatio; + + dimensions.z = _viewportWidth / pixelRatio; + dimensions.w = _viewportHeight / pixelRatio; + + }; + + this.setScissor = function ( x, y, width, height ) { + + _gl.scissor( + x * pixelRatio, + y * pixelRatio, + width * pixelRatio, + height * pixelRatio + ); + + }; + + this.enableScissorTest = function ( boolean ) { + + state.setScissorTest( boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return _clearColor; + + }; + + this.setClearColor = function ( color, alpha ) { + + _clearColor.set( color ); + + _clearAlpha = alpha !== undefined ? alpha : 1; + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + }; + + this.getClearAlpha = function () { + + return _clearAlpha; + + }; + + this.setClearAlpha = function ( alpha ) { + + _clearAlpha = alpha; + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + _gl.clear( _gl.COLOR_BUFFER_BIT ); + + }; + + this.clearDepth = function () { + + _gl.clear( _gl.DEPTH_BUFFER_BIT ); + + }; + + this.clearStencil = function () { + + _gl.clear( _gl.STENCIL_BUFFER_BIT ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // Reset + + this.resetGLState = resetGLState; + + this.dispose = function() { + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + resetGLState(); + setDefaultGLState(); + + properties.clear(); + + }; + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + _infoMemory.textures --; + + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + _infoMemory.textures --; + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.delete( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget || textureProperties.__webglTexture === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + _gl.deleteRenderbuffer( renderTargetProperties.__webglRenderbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + _gl.deleteRenderbuffer( renderTargetProperties.__webglRenderbuffer ); + + } + + properties.delete( renderTarget.texture ); + properties.delete( renderTarget ); + + } + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.delete( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var attributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.position ); + _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( material.type !== 'MeshPhongMaterial' && material.shading === THREE.FlatShading ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.normal ); + + _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.uv ); + + _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== THREE.NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.color ); + + _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, lights, fog, geometry, material, object, group ) { + + setMaterial( material ); + + var program = setProgram( camera, lights, fog, material, object ); + + var updateBuffers = false; + var geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + var activeInfluences = []; + + for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { + + var influence = morphTargetInfluences[ i ]; + activeInfluences.push( [ influence, i ] ); + + } + + activeInfluences.sort( numericalSort ); + + if ( activeInfluences.length > 8 ) { + + activeInfluences.length = 8; + + } + + var morphAttributes = geometry.morphAttributes; + + for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var index = influence[ 1 ]; + + if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); + if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); + + } else { + + if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); + if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + var uniforms = program.getUniforms(); + + if ( uniforms.morphTargetInfluences !== null ) { + + _gl.uniform1fv( uniforms.morphTargetInfluences, morphInfluences ); + + } + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + + if ( material.wireframe === true ) { + + index = objects.getWireframeAttribute( geometry ); + + } + + var renderer; + + if ( index !== null ) { + + renderer = indexedBufferRenderer; + renderer.setIndex( index ); + + } else { + + renderer = bufferRenderer; + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) ); + + } + + } + + // + + var dataStart = 0; + var dataCount = Infinity; + + if ( index !== null ) { + + dataCount = index.count + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start; + var rangeCount = geometry.drawRange.count; + + var groupStart = group !== null ? group.start : 0; + var groupCount = group !== null ? group.count : Infinity; + + var drawStart = Math.max( dataStart, rangeStart, groupStart ); + var drawEnd = Math.min( dataStart + dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + // + + if ( object instanceof THREE.Mesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * pixelRatio ); + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.TRIANGLES ); + + } + + if ( geometry instanceof THREE.InstancedBufferGeometry && geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry ); + + } else { + + renderer.render( drawStart, drawCount ); + + } + + } else if ( object instanceof THREE.Line ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * pixelRatio ); + + if ( object instanceof THREE.LineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + renderer.render( drawStart, drawCount ); + + } else if ( object instanceof THREE.Points ) { + + renderer.setMode( _gl.POINTS ); + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry, startIndex ) { + + var extension; + + if ( geometry instanceof THREE.InstancedBufferGeometry ) { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + if ( startIndex === undefined ) startIndex = 0; + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var size = geometryAttribute.itemSize; + var buffer = objects.getAttributeBuffer( geometryAttribute ); + + if ( geometryAttribute instanceof THREE.InterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data instanceof THREE.InstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT ); + + } else { + + if ( geometryAttribute instanceof THREE.InstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, 0, startIndex * size * 4 ); // 4 bytes per Float32 + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Sorting + + function numericalSort ( a, b ) { + + return b[ 0 ] - a[ 0 ]; + + } + + function painterSortStable ( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable ( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( camera instanceof THREE.Camera === false ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + var fog = scene.fog; + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + _lightsNeedUpdate = true; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + lights.length = 0; + + opaqueObjectsLastIndex = - 1; + transparentObjectsLastIndex = - 1; + + sprites.length = 0; + lensFlares.length = 0; + + projectObject( scene, camera ); + + opaqueObjects.length = opaqueObjectsLastIndex + 1; + transparentObjects.length = transparentObjectsLastIndex + 1; + + if ( _this.sortObjects === true ) { + + opaqueObjects.sort( painterSortStable ); + transparentObjects.sort( reversePainterSortStable ); + + } + + // + + shadowMap.render( scene ); + + // + + _infoRender.calls = 0; + _infoRender.vertices = 0; + _infoRender.faces = 0; + _infoRender.points = 0; + + this.setRenderTarget( renderTarget ); + + if ( this.autoClear || forceClear ) { + + this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); + + } + + // + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + renderObjects( opaqueObjects, camera, lights, fog, overrideMaterial ); + renderObjects( transparentObjects, camera, lights, fog, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + state.setBlending( THREE.NoBlending ); + renderObjects( opaqueObjects, camera, lights, fog ); + + // transparent pass (back-to-front order) + + renderObjects( transparentObjects, camera, lights, fog ); + + } + + // custom render plugins (post pass) + + spritePlugin.render( scene, camera ); + lensFlarePlugin.render( scene, camera, _currentWidth, _currentHeight ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + var texture = renderTarget.texture; + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + if ( texture.generateMipmaps && isTargetPowerOfTwo && texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) { + + updateRenderTargetMipmap( renderTarget ); + + } + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.setDepthTest( true ); + state.setDepthWrite( true ); + state.setColorWrite( true ); + + // _gl.finish(); + + }; + + function pushRenderItem( object, geometry, material, z, group ) { + + var array, index; + + // allocate the next position in the appropriate array + + if ( material.transparent ) { + + array = transparentObjects; + index = ++ transparentObjectsLastIndex; + + } else { + + array = opaqueObjects; + index = ++ opaqueObjectsLastIndex; + + } + + // recycle existing render item or grow the array + + var renderItem = array[ index ]; + + if ( renderItem !== undefined ) { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.z = _vector3.z; + renderItem.group = group; + + } else { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + z: _vector3.z, + group: group + }; + + // assert( index === array.length ); + array.push( renderItem ); + + } + + } + + function projectObject( object, camera ) { + + if ( object.visible === false ) return; + + if ( ( object.channels.mask & camera.channels.mask ) !== 0 ) { + + if ( object instanceof THREE.Light ) { + + lights.push( object ); + + } else if ( object instanceof THREE.Sprite ) { + + sprites.push( object ); + + } else if ( object instanceof THREE.LensFlare ) { + + lensFlares.push( object ); + + } else if ( object instanceof THREE.ImmediateRenderObject ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyProjection( _projScreenMatrix ); + + } + + pushRenderItem( object, null, object.material, _vector3.z, null ); + + } else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) { + + if ( object instanceof THREE.SkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) { + + var material = object.material; + + if ( material.visible === true ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyProjection( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + + if ( material instanceof THREE.MeshFaceMaterial ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + pushRenderItem( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else { + + pushRenderItem( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera ); + + } + + } + + function renderObjects( renderList, camera, lights, fog, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object instanceof THREE.ImmediateRenderObject ) { + + setMaterial( material ); + + var program = setProgram( camera, lights, fog, material, object ); + + _currentGeometryProgram = ''; + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } else { + + _this.renderBufferDirect( camera, lights, fog, geometry, material, object, group ); + + } + + } + + } + + function initMaterial( material, lights, fog, object ) { + + var materialProperties = properties.get( material ); + + var parameters = programCache.getParameters( material, lights, fog, object ); + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = THREE.ShaderLib[ parameters.shaderID ]; + + materialProperties.__webglShader = { + name: material.type, + uniforms: THREE.UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.__webglShader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.__webglShader = materialProperties.__webglShader; + + program = programCache.acquireProgram( material, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var attributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( attributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( attributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + materialProperties.uniformsList = []; + + var uniformLocations = materialProperties.program.getUniforms(); + + for ( var u in materialProperties.__webglShader.uniforms ) { + + var location = uniformLocations[ u ]; + + if ( location ) { + + materialProperties.uniformsList.push( [ materialProperties.__webglShader.uniforms[ u ], location ] ); + + } + + } + + } + + function setMaterial( material ) { + + setMaterialFaces( material ); + + if ( material.transparent === true ) { + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha ); + + } else { + + state.setBlending( THREE.NoBlending ); + + } + + state.setDepthFunc( material.depthFunc ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + state.setColorWrite( material.colorWrite ); + state.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + function setMaterialFaces( material ) { + + material.side !== THREE.DoubleSide ? state.enable( _gl.CULL_FACE ) : state.disable( _gl.CULL_FACE ); + state.setFlipSided( material.side === THREE.BackSide ); + + } + + function setProgram( camera, lights, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + + if ( material.needsUpdate || ! materialProperties.program ) { + + initMaterial( material, lights, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.__webglShader.uniforms; + + if ( program.id !== _currentProgram ) { + + _gl.useProgram( program.program ); + _currentProgram = program.id; + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + if ( _currentMaterialId === - 1 ) refreshLights = true; + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + _gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + if ( capabilities.logarithmicDepthBuffer ) { + + _gl.uniform1f( p_uniforms.logDepthBufFC, 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + + if ( camera !== _currentCamera ) _currentCamera = camera; + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material instanceof THREE.ShaderMaterial || + material instanceof THREE.MeshPhongMaterial || + material.envMap ) { + + if ( p_uniforms.cameraPosition !== undefined ) { + + _vector3.setFromMatrixPosition( camera.matrixWorld ); + _gl.uniform3f( p_uniforms.cameraPosition, _vector3.x, _vector3.y, _vector3.z ); + + } + + } + + if ( material instanceof THREE.MeshPhongMaterial || + material instanceof THREE.MeshLambertMaterial || + material instanceof THREE.MeshBasicMaterial || + material instanceof THREE.ShaderMaterial || + material.skinning ) { + + if ( p_uniforms.viewMatrix !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera.matrixWorldInverse.elements ); + + } + + } + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + if ( object.bindMatrix && p_uniforms.bindMatrix !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.bindMatrix, false, object.bindMatrix.elements ); + + } + + if ( object.bindMatrixInverse && p_uniforms.bindMatrixInverse !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.bindMatrixInverse, false, object.bindMatrixInverse.elements ); + + } + + if ( capabilities.floatVertexTextures && object.skeleton && object.skeleton.useVertexTexture ) { + + if ( p_uniforms.boneTexture !== undefined ) { + + var textureUnit = getTextureUnit(); + + _gl.uniform1i( p_uniforms.boneTexture, textureUnit ); + _this.setTexture( object.skeleton.boneTexture, textureUnit ); + + } + + if ( p_uniforms.boneTextureWidth !== undefined ) { + + _gl.uniform1i( p_uniforms.boneTextureWidth, object.skeleton.boneTextureWidth ); + + } + + if ( p_uniforms.boneTextureHeight !== undefined ) { + + _gl.uniform1i( p_uniforms.boneTextureHeight, object.skeleton.boneTextureHeight ); + + } + + } else if ( object.skeleton && object.skeleton.boneMatrices ) { + + if ( p_uniforms.boneGlobalMatrices !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.boneGlobalMatrices, false, object.skeleton.boneMatrices ); + + } + + } + + } + + if ( refreshMaterial ) { + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material instanceof THREE.MeshPhongMaterial || + material instanceof THREE.MeshLambertMaterial || + material.lights ) { + + if ( _lightsNeedUpdate ) { + + refreshLights = true; + setupLights( lights, camera ); + _lightsNeedUpdate = false; + + } + + if ( refreshLights ) { + + refreshUniformsLights( m_uniforms, _lights ); + markUniformsLightsNeedsUpdate( m_uniforms, true ); + + } else { + + markUniformsLightsNeedsUpdate( m_uniforms, false ); + + } + + } + + if ( material instanceof THREE.MeshBasicMaterial || + material instanceof THREE.MeshLambertMaterial || + material instanceof THREE.MeshPhongMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } + + // refresh single material specific uniforms + + if ( material instanceof THREE.LineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + } else if ( material instanceof THREE.LineDashedMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + refreshUniformsDash( m_uniforms, material ); + + } else if ( material instanceof THREE.PointsMaterial ) { + + refreshUniformsParticle( m_uniforms, material ); + + } else if ( material instanceof THREE.MeshPhongMaterial ) { + + refreshUniformsPhong( m_uniforms, material ); + + } else if ( material instanceof THREE.MeshDepthMaterial ) { + + m_uniforms.mNear.value = camera.near; + m_uniforms.mFar.value = camera.far; + m_uniforms.opacity.value = material.opacity; + + } else if ( material instanceof THREE.MeshNormalMaterial ) { + + m_uniforms.opacity.value = material.opacity; + + } + + if ( object.receiveShadow && ! material._shadowPass ) { + + refreshUniformsShadow( m_uniforms, lights, camera ); + + } + + // load common uniforms + + loadUniformsGeneric( materialProperties.uniformsList ); + + } + + loadUniformsMatrices( p_uniforms, object ); + + if ( p_uniforms.modelMatrix !== undefined ) { + + _gl.uniformMatrix4fv( p_uniforms.modelMatrix, false, object.matrixWorld.elements ); + + } + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon ( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value = material.color; + + if ( material.emissive ) { + + uniforms.emissive.value = material.emissive; + + } + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + if ( uvScaleMap instanceof THREE.WebGLRenderTarget ) uvScaleMap = uvScaleMap.texture; + var offset = uvScaleMap.offset; + var repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + uniforms.envMap.value = material.envMap; + uniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + function refreshUniformsLine ( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash ( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsParticle ( uniforms, material ) { + + uniforms.psColor.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size; + uniforms.scale.value = _canvas.height / 2.0; // TODO: Cache this. + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + var offset = material.map.offset; + var repeat = material.map.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + } + + function refreshUniformsFog ( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog instanceof THREE.Fog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog instanceof THREE.FogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsPhong ( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsLights ( uniforms, lights ) { + + uniforms.ambientLightColor.value = lights.ambient; + + uniforms.directionalLightColor.value = lights.directional.colors; + uniforms.directionalLightDirection.value = lights.directional.positions; + + uniforms.pointLightColor.value = lights.point.colors; + uniforms.pointLightPosition.value = lights.point.positions; + uniforms.pointLightDistance.value = lights.point.distances; + uniforms.pointLightDecay.value = lights.point.decays; + + uniforms.spotLightColor.value = lights.spot.colors; + uniforms.spotLightPosition.value = lights.spot.positions; + uniforms.spotLightDistance.value = lights.spot.distances; + uniforms.spotLightDirection.value = lights.spot.directions; + uniforms.spotLightAngleCos.value = lights.spot.anglesCos; + uniforms.spotLightExponent.value = lights.spot.exponents; + uniforms.spotLightDecay.value = lights.spot.decays; + + uniforms.hemisphereLightSkyColor.value = lights.hemi.skyColors; + uniforms.hemisphereLightGroundColor.value = lights.hemi.groundColors; + uniforms.hemisphereLightDirection.value = lights.hemi.positions; + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate ( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLightColor.needsUpdate = value; + uniforms.directionalLightDirection.needsUpdate = value; + + uniforms.pointLightColor.needsUpdate = value; + uniforms.pointLightPosition.needsUpdate = value; + uniforms.pointLightDistance.needsUpdate = value; + uniforms.pointLightDecay.needsUpdate = value; + + uniforms.spotLightColor.needsUpdate = value; + uniforms.spotLightPosition.needsUpdate = value; + uniforms.spotLightDistance.needsUpdate = value; + uniforms.spotLightDirection.needsUpdate = value; + uniforms.spotLightAngleCos.needsUpdate = value; + uniforms.spotLightExponent.needsUpdate = value; + uniforms.spotLightDecay.needsUpdate = value; + + uniforms.hemisphereLightSkyColor.needsUpdate = value; + uniforms.hemisphereLightGroundColor.needsUpdate = value; + uniforms.hemisphereLightDirection.needsUpdate = value; + + } + + function refreshUniformsShadow ( uniforms, lights, camera ) { + + if ( uniforms.shadowMatrix ) { + + var j = 0; + + for ( var i = 0, il = lights.length; i < il; i ++ ) { + + var light = lights[ i ]; + + if ( light.castShadow === true ) { + + if ( light instanceof THREE.PointLight || light instanceof THREE.SpotLight || light instanceof THREE.DirectionalLight ) { + + var shadow = light.shadow; + + if ( light instanceof THREE.PointLight ) { + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + _vector3.setFromMatrixPosition( light.matrixWorld ).negate(); + shadow.matrix.identity().setPosition( _vector3 ); + + // for point lights we set the sign of the shadowDarkness uniform to be negative + uniforms.shadowDarkness.value[ j ] = - shadow.darkness; + + } else { + + uniforms.shadowDarkness.value[ j ] = shadow.darkness; + + } + + uniforms.shadowMatrix.value[ j ] = shadow.matrix; + uniforms.shadowMap.value[ j ] = shadow.map; + uniforms.shadowMapSize.value[ j ] = shadow.mapSize; + uniforms.shadowBias.value[ j ] = shadow.bias; + + j ++; + + } + + } + + } + + } + + } + + // Uniforms (load to GPU) + + function loadUniformsMatrices ( uniforms, object ) { + + _gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object.modelViewMatrix.elements ); + + if ( uniforms.normalMatrix ) { + + _gl.uniformMatrix3fv( uniforms.normalMatrix, false, object.normalMatrix.elements ); + + } + + } + + function getTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + function loadUniformsGeneric ( uniforms ) { + + var texture, textureUnit; + + for ( var j = 0, jl = uniforms.length; j < jl; j ++ ) { + + var uniform = uniforms[ j ][ 0 ]; + + // needsUpdate property is not added to all uniforms. + if ( uniform.needsUpdate === false ) continue; + + var type = uniform.type; + var value = uniform.value; + var location = uniforms[ j ][ 1 ]; + + switch ( type ) { + + case '1i': + _gl.uniform1i( location, value ); + break; + + case '1f': + _gl.uniform1f( location, value ); + break; + + case '2f': + _gl.uniform2f( location, value[ 0 ], value[ 1 ] ); + break; + + case '3f': + _gl.uniform3f( location, value[ 0 ], value[ 1 ], value[ 2 ] ); + break; + + case '4f': + _gl.uniform4f( location, value[ 0 ], value[ 1 ], value[ 2 ], value[ 3 ] ); + break; + + case '1iv': + _gl.uniform1iv( location, value ); + break; + + case '3iv': + _gl.uniform3iv( location, value ); + break; + + case '1fv': + _gl.uniform1fv( location, value ); + break; + + case '2fv': + _gl.uniform2fv( location, value ); + break; + + case '3fv': + _gl.uniform3fv( location, value ); + break; + + case '4fv': + _gl.uniform4fv( location, value ); + break; + + case 'Matrix3fv': + _gl.uniformMatrix3fv( location, false, value ); + break; + + case 'Matrix4fv': + _gl.uniformMatrix4fv( location, false, value ); + break; + + // + + case 'i': + + // single integer + _gl.uniform1i( location, value ); + + break; + + case 'f': + + // single float + _gl.uniform1f( location, value ); + + break; + + case 'v2': + + // single THREE.Vector2 + _gl.uniform2f( location, value.x, value.y ); + + break; + + case 'v3': + + // single THREE.Vector3 + _gl.uniform3f( location, value.x, value.y, value.z ); + + break; + + case 'v4': + + // single THREE.Vector4 + _gl.uniform4f( location, value.x, value.y, value.z, value.w ); + + break; + + case 'c': + + // single THREE.Color + _gl.uniform3f( location, value.r, value.g, value.b ); + + break; + + case 'iv1': + + // flat array of integers (JS or typed array) + _gl.uniform1iv( location, value ); + + break; + + case 'iv': + + // flat array of integers with 3 x N size (JS or typed array) + _gl.uniform3iv( location, value ); + + break; + + case 'fv1': + + // flat array of floats (JS or typed array) + _gl.uniform1fv( location, value ); + + break; + + case 'fv': + + // flat array of floats with 3 x N size (JS or typed array) + _gl.uniform3fv( location, value ); + + break; + + case 'v2v': + + // array of THREE.Vector2 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 2 * value.length ); + + } + + for ( var i = 0, i2 = 0, il = value.length; i < il; i ++, i2 += 2 ) { + + uniform._array[ i2 + 0 ] = value[ i ].x; + uniform._array[ i2 + 1 ] = value[ i ].y; + + } + + _gl.uniform2fv( location, uniform._array ); + + break; + + case 'v3v': + + // array of THREE.Vector3 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 3 * value.length ); + + } + + for ( var i = 0, i3 = 0, il = value.length; i < il; i ++, i3 += 3 ) { + + uniform._array[ i3 + 0 ] = value[ i ].x; + uniform._array[ i3 + 1 ] = value[ i ].y; + uniform._array[ i3 + 2 ] = value[ i ].z; + + } + + _gl.uniform3fv( location, uniform._array ); + + break; + + case 'v4v': + + // array of THREE.Vector4 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 4 * value.length ); + + } + + for ( var i = 0, i4 = 0, il = value.length; i < il; i ++, i4 += 4 ) { + + uniform._array[ i4 + 0 ] = value[ i ].x; + uniform._array[ i4 + 1 ] = value[ i ].y; + uniform._array[ i4 + 2 ] = value[ i ].z; + uniform._array[ i4 + 3 ] = value[ i ].w; + + } + + _gl.uniform4fv( location, uniform._array ); + + break; + + case 'm3': + + // single THREE.Matrix3 + _gl.uniformMatrix3fv( location, false, value.elements ); + + break; + + case 'm3v': + + // array of THREE.Matrix3 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 9 * value.length ); + + } + + for ( var i = 0, il = value.length; i < il; i ++ ) { + + value[ i ].flattenToArrayOffset( uniform._array, i * 9 ); + + } + + _gl.uniformMatrix3fv( location, false, uniform._array ); + + break; + + case 'm4': + + // single THREE.Matrix4 + _gl.uniformMatrix4fv( location, false, value.elements ); + + break; + + case 'm4v': + + // array of THREE.Matrix4 + + if ( uniform._array === undefined ) { + + uniform._array = new Float32Array( 16 * value.length ); + + } + + for ( var i = 0, il = value.length; i < il; i ++ ) { + + value[ i ].flattenToArrayOffset( uniform._array, i * 16 ); + + } + + _gl.uniformMatrix4fv( location, false, uniform._array ); + + break; + + case 't': + + // single THREE.Texture (2d or cube) + + texture = value; + textureUnit = getTextureUnit(); + + _gl.uniform1i( location, textureUnit ); + + if ( ! texture ) continue; + + if ( texture instanceof THREE.CubeTexture || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + setCubeTexture( texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTargetCube ) { + + setCubeTextureDynamic( texture.texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTarget ) { + + _this.setTexture( texture.texture, textureUnit ); + + } else { + + _this.setTexture( texture, textureUnit ); + + } + + break; + + case 'tv': + + // array of THREE.Texture (2d or cube) + + if ( uniform._array === undefined ) { + + uniform._array = []; + + } + + for ( var i = 0, il = uniform.value.length; i < il; i ++ ) { + + uniform._array[ i ] = getTextureUnit(); + + } + + _gl.uniform1iv( location, uniform._array ); + + for ( var i = 0, il = uniform.value.length; i < il; i ++ ) { + + texture = uniform.value[ i ]; + textureUnit = uniform._array[ i ]; + + if ( ! texture ) continue; + + if ( texture instanceof THREE.CubeTexture || + ( texture.image instanceof Array && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + setCubeTexture( texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTarget ) { + + _this.setTexture( texture.texture, textureUnit ); + + } else if ( texture instanceof THREE.WebGLRenderTargetCube ) { + + setCubeTextureDynamic( texture.texture, textureUnit ); + + } else { + + _this.setTexture( texture, textureUnit ); + + } + + } + + break; + + default: + + console.warn( 'THREE.WebGLRenderer: Unknown uniform type: ' + type ); + + } + + } + + } + + function setColorLinear( array, offset, color, intensity ) { + + array[ offset + 0 ] = color.r * intensity; + array[ offset + 1 ] = color.g * intensity; + array[ offset + 2 ] = color.b * intensity; + + } + + function setupLights ( lights, camera ) { + + var l, ll, light, + r = 0, g = 0, b = 0, + color, skyColor, groundColor, + intensity, + distance, + + zlights = _lights, + + viewMatrix = camera.matrixWorldInverse, + + dirColors = zlights.directional.colors, + dirPositions = zlights.directional.positions, + + pointColors = zlights.point.colors, + pointPositions = zlights.point.positions, + pointDistances = zlights.point.distances, + pointDecays = zlights.point.decays, + + spotColors = zlights.spot.colors, + spotPositions = zlights.spot.positions, + spotDistances = zlights.spot.distances, + spotDirections = zlights.spot.directions, + spotAnglesCos = zlights.spot.anglesCos, + spotExponents = zlights.spot.exponents, + spotDecays = zlights.spot.decays, + + hemiSkyColors = zlights.hemi.skyColors, + hemiGroundColors = zlights.hemi.groundColors, + hemiPositions = zlights.hemi.positions, + + dirLength = 0, + pointLength = 0, + spotLength = 0, + hemiLength = 0, + + dirCount = 0, + pointCount = 0, + spotCount = 0, + hemiCount = 0, + + dirOffset = 0, + pointOffset = 0, + spotOffset = 0, + hemiOffset = 0; + + for ( l = 0, ll = lights.length; l < ll; l ++ ) { + + light = lights[ l ]; + + color = light.color; + intensity = light.intensity; + distance = light.distance; + + if ( light instanceof THREE.AmbientLight ) { + + if ( ! light.visible ) continue; + + r += color.r; + g += color.g; + b += color.b; + + } else if ( light instanceof THREE.DirectionalLight ) { + + dirCount += 1; + + if ( ! light.visible ) continue; + + _direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + _direction.sub( _vector3 ); + _direction.transformDirection( viewMatrix ); + + dirOffset = dirLength * 3; + + dirPositions[ dirOffset + 0 ] = _direction.x; + dirPositions[ dirOffset + 1 ] = _direction.y; + dirPositions[ dirOffset + 2 ] = _direction.z; + + setColorLinear( dirColors, dirOffset, color, intensity ); + + dirLength += 1; + + } else if ( light instanceof THREE.PointLight ) { + + pointCount += 1; + + if ( ! light.visible ) continue; + + pointOffset = pointLength * 3; + + setColorLinear( pointColors, pointOffset, color, intensity ); + + _vector3.setFromMatrixPosition( light.matrixWorld ); + _vector3.applyMatrix4( viewMatrix ); + + pointPositions[ pointOffset + 0 ] = _vector3.x; + pointPositions[ pointOffset + 1 ] = _vector3.y; + pointPositions[ pointOffset + 2 ] = _vector3.z; + + // distance is 0 if decay is 0, because there is no attenuation at all. + pointDistances[ pointLength ] = distance; + pointDecays[ pointLength ] = ( light.distance === 0 ) ? 0.0 : light.decay; + + pointLength += 1; + + } else if ( light instanceof THREE.SpotLight ) { + + spotCount += 1; + + if ( ! light.visible ) continue; + + spotOffset = spotLength * 3; + + setColorLinear( spotColors, spotOffset, color, intensity ); + + _direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.copy( _direction ).applyMatrix4( viewMatrix ); + + spotPositions[ spotOffset + 0 ] = _vector3.x; + spotPositions[ spotOffset + 1 ] = _vector3.y; + spotPositions[ spotOffset + 2 ] = _vector3.z; + + spotDistances[ spotLength ] = distance; + + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + _direction.sub( _vector3 ); + _direction.transformDirection( viewMatrix ); + + spotDirections[ spotOffset + 0 ] = _direction.x; + spotDirections[ spotOffset + 1 ] = _direction.y; + spotDirections[ spotOffset + 2 ] = _direction.z; + + spotAnglesCos[ spotLength ] = Math.cos( light.angle ); + spotExponents[ spotLength ] = light.exponent; + spotDecays[ spotLength ] = ( light.distance === 0 ) ? 0.0 : light.decay; + + spotLength += 1; + + } else if ( light instanceof THREE.HemisphereLight ) { + + hemiCount += 1; + + if ( ! light.visible ) continue; + + _direction.setFromMatrixPosition( light.matrixWorld ); + _direction.transformDirection( viewMatrix ); + + hemiOffset = hemiLength * 3; + + hemiPositions[ hemiOffset + 0 ] = _direction.x; + hemiPositions[ hemiOffset + 1 ] = _direction.y; + hemiPositions[ hemiOffset + 2 ] = _direction.z; + + skyColor = light.color; + groundColor = light.groundColor; + + setColorLinear( hemiSkyColors, hemiOffset, skyColor, intensity ); + setColorLinear( hemiGroundColors, hemiOffset, groundColor, intensity ); + + hemiLength += 1; + + } + + } + + // null eventual remains from removed lights + // (this is to avoid if in shader) + + for ( l = dirLength * 3, ll = Math.max( dirColors.length, dirCount * 3 ); l < ll; l ++ ) dirColors[ l ] = 0.0; + for ( l = pointLength * 3, ll = Math.max( pointColors.length, pointCount * 3 ); l < ll; l ++ ) pointColors[ l ] = 0.0; + for ( l = spotLength * 3, ll = Math.max( spotColors.length, spotCount * 3 ); l < ll; l ++ ) spotColors[ l ] = 0.0; + for ( l = hemiLength * 3, ll = Math.max( hemiSkyColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiSkyColors[ l ] = 0.0; + for ( l = hemiLength * 3, ll = Math.max( hemiGroundColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiGroundColors[ l ] = 0.0; + + zlights.directional.length = dirLength; + zlights.point.length = pointLength; + zlights.spot.length = spotLength; + zlights.hemi.length = hemiLength; + + zlights.ambient[ 0 ] = r; + zlights.ambient[ 1 ] = g; + zlights.ambient[ 2 ] = b; + + } + + // GL state setting + + this.setFaceCulling = function ( cullFace, frontFaceDirection ) { + + if ( cullFace === THREE.CullFaceNone ) { + + state.disable( _gl.CULL_FACE ); + + } else { + + if ( frontFaceDirection === THREE.FrontFaceDirectionCW ) { + + _gl.frontFace( _gl.CW ); + + } else { + + _gl.frontFace( _gl.CCW ); + + } + + if ( cullFace === THREE.CullFaceBack ) { + + _gl.cullFace( _gl.BACK ); + + } else if ( cullFace === THREE.CullFaceFront ) { + + _gl.cullFace( _gl.FRONT ); + + } else { + + _gl.cullFace( _gl.FRONT_AND_BACK ); + + } + + state.enable( _gl.CULL_FACE ); + + } + + }; + + // Textures + + function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) { + + var extension; + + if ( isImagePowerOfTwo ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== THREE.ClampToEdgeWrapping || texture.wrapT !== THREE.ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === THREE.FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === THREE.HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, _this.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + texture.image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false ) { + + texture.image = makePowerOfTwo( texture.image ); + + } + + var image = texture.image, + isImagePowerOfTwo = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( texture instanceof THREE.DataTexture ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isImagePowerOfTwo ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } else if ( texture instanceof THREE.CompressedTexture ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== THREE.RGBAFormat && texture.format !== THREE.RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isImagePowerOfTwo ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image ); + + } + + } + + if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + this.setTexture = function ( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + return; + + } + + if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + return; + + } + + uploadTexture( textureProperties, texture, slot ); + + return; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + }; + + function clampToMaxSize ( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElement( 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ); + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( texture.wrapS !== THREE.ClampToEdgeWrapping || texture.wrapT !== THREE.ClampToEdgeWrapping ) return true; + if ( texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) return true; + + return false; + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { + + var canvas = document.createElement( 'canvas' ); + canvas.width = THREE.Math.nearestPowerOfTwo( image.width ); + canvas.height = THREE.Math.nearestPowerOfTwo( image.height ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function setCubeTexture ( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = texture instanceof THREE.CompressedTexture; + var isDataTexture = texture.image[ 0 ] instanceof THREE.DataTexture; + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( _this.autoScaleCubemaps && ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isImagePowerOfTwo = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== THREE.RGBAFormat && texture.format !== THREE.RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( texture.generateMipmaps && isImagePowerOfTwo ) { + + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setCubeTextureDynamic ( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + // Render targets + + function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + + } + + function setupRenderBuffer ( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + /* For some reason this is not working. Defaulting to RGBA4. + } else if ( ! renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + */ + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + } + + this.setRenderTarget = function ( renderTarget ) { + + var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube ); + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true; + if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true; + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + // Setup texture, create render and frame buffers + + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ), + glFormat = paramThreeToGL( renderTarget.texture.format ), + glType = paramThreeToGL( renderTarget.texture.type ); + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + renderTargetProperties.__webglRenderbuffer = []; + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + renderTargetProperties.__webglRenderbuffer[ i ] = _gl.createRenderbuffer(); + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + + setupFrameBuffer( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + setupRenderBuffer( renderTargetProperties.__webglRenderbuffer[ i ], renderTarget ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + if ( renderTarget.shareDepthFrom ) { + + renderTargetProperties.__webglRenderbuffer = renderTarget.shareDepthFrom.__webglRenderbuffer; + + } else { + + renderTargetProperties.__webglRenderbuffer = _gl.createRenderbuffer(); + + } + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + + setupFrameBuffer( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D ); + + if ( renderTarget.shareDepthFrom ) { + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer ); + + } + + } else { + + setupRenderBuffer( renderTargetProperties.__webglRenderbuffer, renderTarget ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + } + + // Release everything + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + var framebuffer, width, height, vx, vy; + + if ( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + if ( isCube ) { + + framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; + + } else { + + framebuffer = renderTargetProperties.__webglFramebuffer; + + } + + width = renderTarget.width; + height = renderTarget.height; + + vx = 0; + vy = 0; + + } else { + + framebuffer = null; + + width = _viewportWidth; + height = _viewportHeight; + + vx = _viewportX; + vy = _viewportY; + + } + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.viewport( vx, vy, width, height ); + + _currentFramebuffer = framebuffer; + + } + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, 0 ); + + } + + _currentWidth = width; + _currentHeight = height; + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( renderTarget instanceof THREE.WebGLRenderTarget === false ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + + if ( texture.format !== THREE.RGBAFormat + && paramThreeToGL( texture.format ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( texture.type !== THREE.UnsignedByteType + && paramThreeToGL( texture.type ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) + && ! ( texture.type === THREE.FloatType && extensions.get( 'WEBGL_color_buffer_float' ) ) + && ! ( texture.type === THREE.HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + _gl.readPixels( x, y, width, height, paramThreeToGL( texture.format ), paramThreeToGL( texture.type ), buffer ); + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + function updateRenderTargetMipmap( renderTarget ) { + + var target = renderTarget instanceof THREE.WebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var texture = properties.get( renderTarget.texture ).__webglTexture; + + state.bindTexture( target, texture ); + _gl.generateMipmap( target ); + state.bindTexture( target, null ); + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback ( f ) { + + if ( f === THREE.NearestFilter || f === THREE.NearestMipMapNearestFilter || f === THREE.NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // Map three.js constants to WebGL constants + + function paramThreeToGL ( p ) { + + var extension; + + if ( p === THREE.RepeatWrapping ) return _gl.REPEAT; + if ( p === THREE.ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; + if ( p === THREE.MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; + + if ( p === THREE.NearestFilter ) return _gl.NEAREST; + if ( p === THREE.NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; + if ( p === THREE.NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; + + if ( p === THREE.LinearFilter ) return _gl.LINEAR; + if ( p === THREE.LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; + if ( p === THREE.LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; + + if ( p === THREE.UnsignedByteType ) return _gl.UNSIGNED_BYTE; + if ( p === THREE.UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === THREE.UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === THREE.UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; + + if ( p === THREE.ByteType ) return _gl.BYTE; + if ( p === THREE.ShortType ) return _gl.SHORT; + if ( p === THREE.UnsignedShortType ) return _gl.UNSIGNED_SHORT; + if ( p === THREE.IntType ) return _gl.INT; + if ( p === THREE.UnsignedIntType ) return _gl.UNSIGNED_INT; + if ( p === THREE.FloatType ) return _gl.FLOAT; + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) { + + if ( p === THREE.HalfFloatType ) return extension.HALF_FLOAT_OES; + + } + + if ( p === THREE.AlphaFormat ) return _gl.ALPHA; + if ( p === THREE.RGBFormat ) return _gl.RGB; + if ( p === THREE.RGBAFormat ) return _gl.RGBA; + if ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE; + if ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; + + if ( p === THREE.AddEquation ) return _gl.FUNC_ADD; + if ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT; + if ( p === THREE.ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; + + if ( p === THREE.ZeroFactor ) return _gl.ZERO; + if ( p === THREE.OneFactor ) return _gl.ONE; + if ( p === THREE.SrcColorFactor ) return _gl.SRC_COLOR; + if ( p === THREE.OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; + if ( p === THREE.SrcAlphaFactor ) return _gl.SRC_ALPHA; + if ( p === THREE.OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; + if ( p === THREE.DstAlphaFactor ) return _gl.DST_ALPHA; + if ( p === THREE.OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; + + if ( p === THREE.DstColorFactor ) return _gl.DST_COLOR; + if ( p === THREE.OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; + if ( p === THREE.SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === THREE.RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === THREE.RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === THREE.RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === THREE.RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === THREE.RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === THREE.RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === THREE.RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === THREE.RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === THREE.MinEquation ) return extension.MIN_EXT; + if ( p === THREE.MaxEquation ) return extension.MAX_EXT; + + } + + return 0; + + } + + // DEPRECATED + + this.supportsFloatTextures = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return extensions.get( 'OES_texture_float' ); + + }; + + this.supportsHalfFloatTextures = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return extensions.get( 'OES_texture_half_float' ); + + }; + + this.supportsStandardDerivatives = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return extensions.get( 'OES_standard_derivatives' ); + + }; + + this.supportsCompressedTextureS3TC = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + }; + + this.supportsCompressedTexturePVRTC = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + }; + + this.supportsBlendMinMax = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return extensions.get( 'EXT_blend_minmax' ); + + }; + + this.supportsVertexTextures = function () { + + return capabilities.vertexTextures; + + }; + + this.supportsInstancedArrays = function () { + + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return extensions.get( 'ANGLE_instanced_arrays' ); + + }; + + // + + this.initMaterial = function () { + + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + + }; + + this.addPrePlugin = function () { + + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + + }; + + this.addPostPlugin = function () { + + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + + }; + + this.updateShadowMap = function () { + + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + + }; + + Object.defineProperties( this, { + shadowMapEnabled: { + get: function () { + + return shadowMap.enabled; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + shadowMap.enabled = value; + + } + }, + shadowMapType: { + get: function () { + + return shadowMap.type; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + shadowMap.type = value; + + } + }, + shadowMapCullFace: { + get: function () { + + return shadowMap.cullFace; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); + shadowMap.cullFace = value; + + } + }, + shadowMapDebug: { + get: function () { + + return shadowMap.debug; + + }, + set: function ( value ) { + + console.warn( 'THREE.WebGLRenderer: .shadowMapDebug is now .shadowMap.debug.' ); + shadowMap.debug = value; + + } + } + } ); + +}; + +// File:src/renderers/WebGLRenderTarget.js + +/** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.WebGLRenderTarget = function ( width, height, options ) { + + this.uuid = THREE.Math.generateUUID(); + + this.width = width; + this.height = height; + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = THREE.LinearFilter; + + this.texture = new THREE.Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + + this.shareDepthFrom = options.shareDepthFrom !== undefined ? options.shareDepthFrom : null; + +}; + +THREE.WebGLRenderTarget.prototype = { + + constructor: THREE.WebGLRenderTarget, + + get wrapS() { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + + return this.texture.wrapS; + + }, + + set wrapS( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + + this.texture.wrapS = value; + + }, + + get wrapT() { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + + return this.texture.wrapT; + + }, + + set wrapT( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + + this.texture.wrapT = value; + + }, + + get magFilter() { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + + return this.texture.magFilter; + + }, + + set magFilter( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + + this.texture.magFilter = value; + + }, + + get minFilter() { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + + return this.texture.minFilter; + + }, + + set minFilter( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + + this.texture.minFilter = value; + + }, + + get anisotropy() { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + + return this.texture.anisotropy; + + }, + + set anisotropy( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + + this.texture.anisotropy = value; + + }, + + get offset() { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + + return this.texture.offset; + + }, + + set offset( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + + this.texture.offset = value; + + }, + + get repeat() { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + + return this.texture.repeat; + + }, + + set repeat( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + + this.texture.repeat = value; + + }, + + get format() { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + + return this.texture.format; + + }, + + set format( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + + this.texture.format = value; + + }, + + get type() { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + + return this.texture.type; + + }, + + set type( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + + this.texture.type = value; + + }, + + get generateMipmaps() { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + + return this.texture.generateMipmaps; + + }, + + set generateMipmaps( value ) { + + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + + this.texture.generateMipmaps = value; + + }, + + // + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + + this.shareDepthFrom = source.shareDepthFrom; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + +}; + +THREE.EventDispatcher.prototype.apply( THREE.WebGLRenderTarget.prototype ); + +// File:src/renderers/WebGLRenderTargetCube.js + +/** + * @author alteredq / http://alteredqualia.com + */ + +THREE.WebGLRenderTargetCube = function ( width, height, options ) { + + THREE.WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + +}; + +THREE.WebGLRenderTargetCube.prototype = Object.create( THREE.WebGLRenderTarget.prototype ); +THREE.WebGLRenderTargetCube.prototype.constructor = THREE.WebGLRenderTargetCube; + +// File:src/renderers/webgl/WebGLBufferRenderer.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLBufferRenderer = function ( _gl, extensions, _infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + _gl.drawArrays( mode, start, count ); + + _infoRender.calls ++; + _infoRender.vertices += count; + if ( mode === _gl.TRIANGLES ) _infoRender.faces += count / 3; + + } + + function renderInstances( geometry ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + if ( position instanceof THREE.InterleavedBufferAttribute ) { + + extension.drawArraysInstancedANGLE( mode, 0, position.data.count, geometry.maxInstancedCount ); + + } else { + + extension.drawArraysInstancedANGLE( mode, 0, position.count, geometry.maxInstancedCount ); + + } + + } + + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + +}; + +// File:src/renderers/webgl/WebGLIndexedBufferRenderer.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLIndexedBufferRenderer = function ( _gl, extensions, _infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, size; + + function setIndex( index ) { + + if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { + + type = _gl.UNSIGNED_INT; + size = 4; + + } else { + + type = _gl.UNSIGNED_SHORT; + size = 2; + + } + + } + + function render( start, count ) { + + _gl.drawElements( mode, count, type, start * size ); + + _infoRender.calls ++; + _infoRender.vertices += count; + if ( mode === _gl.TRIANGLES ) _infoRender.faces += count / 3; + + } + + function renderInstances( geometry ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var index = geometry.index; + + extension.drawElementsInstancedANGLE( mode, index.array.length, type, 0, geometry.maxInstancedCount ); + + } + + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + +}; + +// File:src/renderers/webgl/WebGLExtensions.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLExtensions = function ( gl ) { + + var extensions = {}; + + this.get = function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + }; + +}; + +// File:src/renderers/webgl/WebGLCapabilities.js + +THREE.WebGLCapabilities = function ( gl, extensions, parameters ) { + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + this.getMaxPrecision = getMaxPrecision; + + this.precision = parameters.precision !== undefined ? parameters.precision : 'highp', + this.logarithmicDepthBuffer = parameters.logarithmicDepthBuffer !== undefined ? parameters.logarithmicDepthBuffer : false; + + this.maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + this.maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + this.maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + this.maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + this.maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + this.maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + this.maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + this.maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + this.vertexTextures = this.maxVertexTextures > 0; + this.floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + this.floatVertexTextures = this.vertexTextures && this.floatFragmentTextures; + + var _maxPrecision = getMaxPrecision( this.precision ); + + if ( _maxPrecision !== this.precision ) { + + console.warn( 'THREE.WebGLRenderer:', this.precision, 'not supported, using', _maxPrecision, 'instead.' ); + this.precision = _maxPrecision; + + } + + if ( this.logarithmicDepthBuffer ) { + + this.logarithmicDepthBuffer = !! extensions.get( 'EXT_frag_depth' ); + + } + +}; + +// File:src/renderers/webgl/WebGLGeometries.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLGeometries = function ( gl, properties, info ) { + + var geometries = {}; + + function get( object ) { + + var geometry = object.geometry; + + if ( geometries[ geometry.id ] !== undefined ) { + + return geometries[ geometry.id ]; + + } + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + var buffergeometry; + + if ( geometry instanceof THREE.BufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry instanceof THREE.Geometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new THREE.BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + deleteAttributes( buffergeometry.attributes ); + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + var property = properties.get( geometry ); + if ( property.wireframe ) deleteAttribute( property.wireframe ); + + info.memory.geometries --; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute instanceof THREE.InterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function deleteAttribute( attribute ) { + + var buffer = getAttributeBuffer( attribute ); + + if ( buffer !== undefined ) { + + gl.deleteBuffer( buffer ); + removeAttributeBuffer( attribute ); + + } + + } + + function deleteAttributes( attributes ) { + + for ( var name in attributes ) { + + deleteAttribute( attributes[ name ] ); + + } + + } + + function removeAttributeBuffer( attribute ) { + + if ( attribute instanceof THREE.InterleavedBufferAttribute ) { + + properties.delete( attribute.data ); + + } else { + + properties.delete( attribute ); + + } + + } + + this.get = get; + +}; + +// File:src/renderers/webgl/WebGLObjects.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLObjects = function ( gl, properties, info ) { + + var geometries = new THREE.WebGLGeometries( gl, properties, info ); + + // + + function update( object ) { + + // TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter. + + var geometry = geometries.get( object ); + + if ( object.geometry instanceof THREE.Geometry ) { + + geometry.updateFromObject( object ); + + } + + var index = geometry.index; + var attributes = geometry.attributes; + + if ( index !== null ) { + + updateAttribute( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in attributes ) { + + updateAttribute( attributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + updateAttribute( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + return geometry; + + } + + function updateAttribute( attribute, bufferType ) { + + var data = ( attribute instanceof THREE.InterleavedBufferAttribute ) ? attribute.data : attribute; + + var attributeProperties = properties.get( data ); + + if ( attributeProperties.__webglBuffer === undefined ) { + + createBuffer( attributeProperties, data, bufferType ); + + } else if ( attributeProperties.version !== data.version ) { + + updateBuffer( attributeProperties, data, bufferType ); + + } + + } + + function createBuffer( attributeProperties, data, bufferType ) { + + attributeProperties.__webglBuffer = gl.createBuffer(); + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + var usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + gl.bufferData( bufferType, data.array, usage ); + + attributeProperties.version = data.version; + + } + + function updateBuffer( attributeProperties, data, bufferType ) { + + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + if ( data.dynamic === false || data.updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, data.array ); + + } else if ( data.updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT, + data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) ); + + data.updateRange.count = 0; // reset range + + } + + attributeProperties.version = data.version; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute instanceof THREE.InterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function getWireframeAttribute( geometry ) { + + var property = properties.get( geometry ); + + if ( property.wireframe !== undefined ) { + + return property.wireframe; + + } + + var indices = []; + + var index = geometry.index; + var attributes = geometry.attributes; + var position = attributes.position; + + // console.time( 'wireframe' ); + + if ( index !== null ) { + + var edges = {}; + var array = index.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + if ( checkEdge( edges, a, b ) ) indices.push( a, b ); + if ( checkEdge( edges, b, c ) ) indices.push( b, c ); + if ( checkEdge( edges, c, a ) ) indices.push( c, a ); + + } + + } else { + + var array = attributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + var TypeArray = position.count > 65535 ? Uint32Array : Uint16Array; + var attribute = new THREE.BufferAttribute( new TypeArray( indices ), 1 ); + + updateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + property.wireframe = attribute; + + return attribute; + + } + + function checkEdge( edges, a, b ) { + + if ( a > b ) { + + var tmp = a; + a = b; + b = tmp; + + } + + var list = edges[ a ]; + + if ( list === undefined ) { + + edges[ a ] = [ b ]; + return true; + + } else if ( list.indexOf( b ) === -1 ) { + + list.push( b ); + return true; + + } + + return false; + + } + + this.getAttributeBuffer = getAttributeBuffer; + this.getWireframeAttribute = getWireframeAttribute; + + this.update = update; + +}; + +// File:src/renderers/webgl/WebGLProgram.js + +THREE.WebGLProgram = ( function () { + + var programIdCount = 0; + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchUniformLocations( gl, program, identifiers ) { + + var uniforms = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveUniform( program, i ); + var name = info.name; + var location = gl.getUniformLocation( program, name ); + + // console.log("THREE.WebGLProgram: ACTIVE UNIFORM:", name); + + var suffixPos = name.lastIndexOf( '[0]' ); + if ( suffixPos !== - 1 && suffixPos === name.length - 3 ) { + + uniforms[ name.substr( 0, suffixPos ) ] = location; + + } + + uniforms[ name ] = location; + + } + + return uniforms; + + } + + function fetchAttributeLocations( gl, program, identifiers ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + return function WebGLProgram( renderer, code, material, parameters ) { + + var gl = renderer.context; + + var defines = material.defines; + + var vertexShader = material.__webglShader.vertexShader; + var fragmentShader = material.__webglShader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === THREE.PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case THREE.CubeReflectionMapping: + case THREE.CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case THREE.EquirectangularReflectionMapping: + case THREE.EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case THREE.SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case THREE.CubeRefractionMapping: + case THREE.EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case THREE.MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case THREE.MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case THREE.AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material instanceof THREE.RawShaderMaterial ) { + + prefixVertex = ''; + prefixFragment = ''; + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + renderer.gammaInput ? '#define GAMMA_INPUT' : '', + renderer.gammaOutput ? '#define GAMMA_OUTPUT' : '', + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_DIR_LIGHTS ' + parameters.maxDirLights, + '#define MAX_POINT_LIGHTS ' + parameters.maxPointLights, + '#define MAX_SPOT_LIGHTS ' + parameters.maxSpotLights, + '#define MAX_HEMI_LIGHTS ' + parameters.maxHemiLights, + + '#define MAX_SHADOWS ' + parameters.maxShadows, + + '#define MAX_BONES ' + parameters.maxBones, + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + parameters.shadowMapDebug ? '#define SHADOWMAP_DEBUG' : '', + parameters.pointLightShadows > 0 ? '#define POINT_LIGHT_SHADOWS' : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + parameters.bumpMap || parameters.normalMap || parameters.flatShading || material.derivatives ? '#extension GL_OES_standard_derivatives : enable' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + '#define MAX_DIR_LIGHTS ' + parameters.maxDirLights, + '#define MAX_POINT_LIGHTS ' + parameters.maxPointLights, + '#define MAX_SPOT_LIGHTS ' + parameters.maxSpotLights, + '#define MAX_HEMI_LIGHTS ' + parameters.maxHemiLights, + + '#define MAX_SHADOWS ' + parameters.maxShadows, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + renderer.gammaInput ? '#define GAMMA_INPUT' : '', + renderer.gammaOutput ? '#define GAMMA_OUTPUT' : '', + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.metal ? '#define METAL' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + parameters.shadowMapDebug ? '#define SHADOWMAP_DEBUG' : '', + parameters.pointLightShadows > 0 ? '#define POINT_LIGHT_SHADOWS' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + var glVertexShader = THREE.WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = THREE.WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ); + var vertexLog = gl.getShaderInfoLog( glVertexShader ); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); + + var runnable = true; + var haveDiagnostics = true; + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function() { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = fetchUniformLocations( gl, program ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function() { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function() { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + }; + +} )(); + +// File:src/renderers/webgl/WebGLPrograms.js + +THREE.WebGLPrograms = function ( renderer, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "envMap", "envMapMode", + "lightMap", "aoMap", "emissiveMap", "bumpMap", "normalMap", "displacementMap", "specularMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "maxDirLights", "maxPointLights", + "maxSpotLights", "maxHemiLights", "maxShadows", "shadowMapEnabled", "pointLightShadows", + "shadowMapType", "shadowMapDebug", "alphaTest", "metal", "doubleSided", + "flipSided" + ]; + + + function allocateBones ( object ) { + + if ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = nVertexMatrices; + + if ( object !== undefined && object instanceof THREE.SkinnedMesh ) { + + maxBones = Math.min( object.skeleton.bones.length, maxBones ); + + if ( maxBones < object.skeleton.bones.length ) { + + console.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' ); + + } + + } + + return maxBones; + + } + + } + + function allocateLights( lights ) { + + var dirLights = 0; + var pointLights = 0; + var spotLights = 0; + var hemiLights = 0; + + for ( var l = 0, ll = lights.length; l < ll; l ++ ) { + + var light = lights[ l ]; + + if ( light.visible === false ) continue; + + if ( light instanceof THREE.DirectionalLight ) dirLights ++; + if ( light instanceof THREE.PointLight ) pointLights ++; + if ( light instanceof THREE.SpotLight ) spotLights ++; + if ( light instanceof THREE.HemisphereLight ) hemiLights ++; + + } + + return { 'directional': dirLights, 'point': pointLights, 'spot': spotLights, 'hemi': hemiLights }; + + } + + function allocateShadows( lights ) { + + var maxShadows = 0; + var pointLightShadows = 0; + + for ( var l = 0, ll = lights.length; l < ll; l ++ ) { + + var light = lights[ l ]; + + if ( ! light.castShadow ) continue; + + if ( light instanceof THREE.SpotLight || light instanceof THREE.DirectionalLight ) maxShadows ++; + if ( light instanceof THREE.PointLight ) { + + maxShadows ++; + pointLightShadows ++; + + } + + } + + return { 'maxShadows': maxShadows, 'pointLightShadows': pointLightShadows }; + + } + + this.getParameters = function ( material, lights, fog, object ) { + + var shaderID = shaderIDs[ material.type ]; + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxLightCount = allocateLights( lights ); + var allocatedShadows = allocateShadows( lights ); + var maxBones = allocateBones( object ); + var precision = renderer.getPrecision(); + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLRenderer.initMaterial:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + + map: !! material.map, + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: fog, + useFog: material.fog, + fogExp: fog instanceof THREE.FogExp2, + + flatShading: material.shading === THREE.FlatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + maxDirLights: maxLightCount.directional, + maxPointLights: maxLightCount.point, + maxSpotLights: maxLightCount.spot, + maxHemiLights: maxLightCount.hemi, + + maxShadows: allocatedShadows.maxShadows, + pointLightShadows: allocatedShadows.pointLightShadows, + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && allocatedShadows.maxShadows > 0, + shadowMapType: renderer.shadowMap.type, + shadowMapDebug: renderer.shadowMap.debug, + + alphaTest: material.alphaTest, + metal: material.metal, + doubleSided: material.side === THREE.DoubleSide, + flipSided: material.side === THREE.BackSide + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var chunks = []; + + if ( parameters.shaderID ) { + + chunks.push( parameters.shaderID ); + + } else { + + chunks.push( material.fragmentShader ); + chunks.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + chunks.push( name ); + chunks.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + var parameterName = parameterNames[ i ]; + chunks.push( parameterName ); + chunks.push( parameters[ parameterName ] ); + + } + + return chunks.join(); + + }; + + this.acquireProgram = function ( material, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new THREE.WebGLProgram( renderer, code, material, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + +}; + +// File:src/renderers/webgl/WebGLProperties.js + +/** +* @author fordacious / fordacious.github.io +*/ + +THREE.WebGLProperties = function () { + + var properties = {}; + + this.get = function ( object ) { + + var uuid = object.uuid; + var map = properties[ uuid ]; + + if ( map === undefined ) { + + map = {}; + properties[ uuid ] = map; + + } + + return map; + + }; + + this.delete = function ( object ) { + + delete properties[ object.uuid ]; + + }; + + this.clear = function () { + + properties = {}; + + }; + +}; + +// File:src/renderers/webgl/WebGLShader.js + +THREE.WebGLShader = ( function () { + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + return function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + }; + +} )(); + +// File:src/renderers/webgl/WebGLShadowMap.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) { + + var _gl = _renderer.context, + _state = _renderer.state, + _frustum = new THREE.Frustum(), + _projScreenMatrix = new THREE.Matrix4(), + + _min = new THREE.Vector3(), + _max = new THREE.Vector3(), + + _lookTarget = new THREE.Vector3(), + _lightPositionWorld = new THREE.Vector3(), + + _renderList = [], + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ); + + var cubeDirections = [ + new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( - 1, 0, 0 ), new THREE.Vector3( 0, 0, 1 ), + new THREE.Vector3( 0, 0, - 1 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), + new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 1 ), new THREE.Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new THREE.Vector4(), new THREE.Vector4(), new THREE.Vector4(), + new THREE.Vector4(), new THREE.Vector4(), new THREE.Vector4() + ]; + + var _vector4 = new THREE.Vector4(); + + // init + + var depthShader = THREE.ShaderLib[ "depthRGBA" ]; + var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms ); + + var distanceShader = THREE.ShaderLib[ "distanceRGBA" ]; + var distanceUniforms = THREE.UniformsUtils.clone( distanceShader.uniforms ); + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = new THREE.ShaderMaterial( { + uniforms: depthUniforms, + vertexShader: depthShader.vertexShader, + fragmentShader: depthShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning + } ); + + depthMaterial._shadowPass = true; + + _depthMaterials[ i ] = depthMaterial; + + var distanceMaterial = new THREE.ShaderMaterial( { + uniforms: distanceUniforms, + vertexShader: distanceShader.vertexShader, + fragmentShader: distanceShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning + } ); + + distanceMaterial._shadowPass = true; + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = THREE.PCFShadowMap; + this.cullFace = THREE.CullFaceFront; + + this.render = function ( scene ) { + + var faceCount, isPointLight; + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + // Set GL state for depth map. + _gl.clearColor( 1, 1, 1, 1 ); + _state.disable( _gl.BLEND ); + _state.enable( _gl.CULL_FACE ); + _gl.frontFace( _gl.CCW ); + _gl.cullFace( scope.cullFace === THREE.CullFaceFront ? _gl.FRONT : _gl.BACK ); + _state.setDepthTest( true ); + + // save the existing viewport so it can be restored later + _renderer.getViewport( _vector4 ); + + // render depth map + + for ( var i = 0, il = _lights.length; i < il; i ++ ) { + + var light = _lights[ i ]; + + if ( light.castShadow === true ) { + + var shadow = light.shadow; + var shadowCamera = shadow.camera; + var shadowMapSize = shadow.mapSize; + + if ( light instanceof THREE.PointLight ) { + + faceCount = 6; + isPointLight = true; + + var vpWidth = shadowMapSize.x / 4.0; + var vpHeight = shadowMapSize.y / 2.0; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + } else { + + faceCount = 1; + isPointLight = false; + + } + + if ( shadow.map === null ) { + + var shadowFilter = THREE.LinearFilter; + + if ( scope.type === THREE.PCFSoftShadowMap ) { + + shadowFilter = THREE.NearestFilter; + + } + + var pars = { minFilter: shadowFilter, magFilter: shadowFilter, format: THREE.RGBAFormat }; + + shadow.map = new THREE.WebGLRenderTarget( shadowMapSize.x, shadowMapSize.y, pars ); + shadow.matrix = new THREE.Matrix4(); + + // + + if ( light instanceof THREE.SpotLight ) { + + shadowCamera.aspect = shadowMapSize.x / shadowMapSize.y; + + } + + shadowCamera.updateProjectionMatrix(); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + var vpDimensions = cube2DViewPorts[ face ]; + _renderer.setViewport( vpDimensions.x, vpDimensions.y, vpDimensions.z, vpDimensions.w ); + + } else { + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + + } + + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + _renderList.length = 0; + + projectObject( scene, shadowCamera ); + + // render shadow map + // render regular objects + + for ( var j = 0, jl = _renderList.length; j < jl; j ++ ) { + + var object = _renderList[ j ]; + var geometry = _objects.update( object ); + var material = object.material; + + if ( material instanceof THREE.MeshFaceMaterial ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, _lights, null, geometry, depthMaterial, object, group ); + + } + + } + + } else { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, _lights, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + // We must call _renderer.resetGLState() at the end of each iteration of + // the light loop in order to force material updates for each light. + _renderer.resetGLState(); + + } + + } + + _renderer.setViewport( _vector4.x, _vector4.y, _vector4.z, _vector4.w ); + + // Restore GL state. + var clearColor = _renderer.getClearColor(), + clearAlpha = _renderer.getClearAlpha(); + _renderer.setClearColor( clearColor, clearAlpha ); + _state.enable( _gl.BLEND ); + + if ( scope.cullFace === THREE.CullFaceFront ) { + + _gl.cullFace( _gl.BACK ); + + } + + _renderer.resetGLState(); + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { + + var geometry = object.geometry; + + var newMaterial = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = geometry.morphTargets !== undefined && + geometry.morphTargets.length > 0 && material.morphTargets; + + var useSkinning = object instanceof THREE.SkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + newMaterial = materialVariants[ variantIndex ]; + + } else { + + newMaterial = customMaterial; + + } + + newMaterial.visible = material.visible; + newMaterial.wireframe = material.wireframe; + newMaterial.wireframeLinewidth = material.wireframeLinewidth; + + if ( isPointLight && newMaterial.uniforms.lightPos !== undefined ) { + + newMaterial.uniforms.lightPos.value.copy( lightPositionWorld ); + + } + + return newMaterial; + + } + + function projectObject( object, camera ) { + + if ( object.visible === false ) return; + + if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) { + + if ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) { + + var material = object.material; + + if ( material.visible === true ) { + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + _renderList.push( object ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera ); + + } + + } + +}; + +// File:src/renderers/webgl/WebGLState.js + +/** +* @author mrdoob / http://mrdoob.com/ +*/ + +THREE.WebGLState = function ( gl, extensions, paramThreeToGL ) { + + var _this = this; + + var newAttributes = new Uint8Array( 16 ); + var enabledAttributes = new Uint8Array( 16 ); + var attributeDivisors = new Uint8Array( 16 ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + + var currentDepthFunc = null; + var currentDepthWrite = null; + + var currentColorWrite = null; + + var currentFlipSided = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + + var currentTextureSlot = undefined; + var currentBoundTextures = {}; + + this.init = function () { + + gl.clearColor( 0, 0, 0, 1 ); + gl.clearDepth( 1 ); + gl.clearStencil( 0 ); + + this.enable( gl.DEPTH_TEST ); + gl.depthFunc( gl.LEQUAL ); + + gl.frontFace( gl.CCW ); + gl.cullFace( gl.BACK ); + this.enable( gl.CULL_FACE ); + + this.enable( gl.BLEND ); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA ); + + }; + + this.initAttributes = function () { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + }; + + this.enableAttribute = function ( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + }; + + this.enableAttributeAndDivisor = function ( attribute, meshPerAttribute, extension ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + }; + + this.disableUnusedAttributes = function () { + + for ( var i = 0, l = enabledAttributes.length; i < l; i ++ ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + }; + + this.enable = function ( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + }; + + this.disable = function ( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + }; + + this.getCompressedTextureFormats = function () { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + }; + + this.setBlending = function ( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha ) { + + if ( blending !== currentBlending ) { + + if ( blending === THREE.NoBlending ) { + + this.disable( gl.BLEND ); + + } else if ( blending === THREE.AdditiveBlending ) { + + this.enable( gl.BLEND ); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } else if ( blending === THREE.SubtractiveBlending ) { + + // TODO: Find blendFuncSeparate() combination + + this.enable( gl.BLEND ); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } else if ( blending === THREE.MultiplyBlending ) { + + // TODO: Find blendFuncSeparate() combination + + this.enable( gl.BLEND ); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } else if ( blending === THREE.CustomBlending ) { + + this.enable( gl.BLEND ); + + } else { + + this.enable( gl.BLEND ); + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + currentBlending = blending; + + } + + if ( blending === THREE.CustomBlending ) { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } else { + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } + + }; + + this.setDepthFunc = function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case THREE.NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case THREE.AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case THREE.LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case THREE.LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case THREE.EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case THREE.GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case THREE.GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case THREE.NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }; + + this.setDepthTest = function ( depthTest ) { + + if ( depthTest ) { + + this.enable( gl.DEPTH_TEST ); + + } else { + + this.disable( gl.DEPTH_TEST ); + + } + + }; + + this.setDepthWrite = function ( depthWrite ) { + + if ( currentDepthWrite !== depthWrite ) { + + gl.depthMask( depthWrite ); + currentDepthWrite = depthWrite; + + } + + }; + + this.setColorWrite = function ( colorWrite ) { + + if ( currentColorWrite !== colorWrite ) { + + gl.colorMask( colorWrite, colorWrite, colorWrite, colorWrite ); + currentColorWrite = colorWrite; + + } + + }; + + this.setFlipSided = function ( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + }; + + this.setLineWidth = function ( width ) { + + if ( width !== currentLineWidth ) { + + gl.lineWidth( width ); + + currentLineWidth = width; + + } + + }; + + this.setPolygonOffset = function ( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + this.enable( gl.POLYGON_OFFSET_FILL ); + + } else { + + this.disable( gl.POLYGON_OFFSET_FILL ); + + } + + if ( polygonOffset && ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + }; + + this.setScissorTest = function ( scissorTest ) { + + if ( scissorTest ) { + + this.enable( gl.SCISSOR_TEST ); + + } else { + + this.disable( gl.SCISSOR_TEST ); + + } + + }; + + // texture + + this.activeTexture = function ( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + this.bindTexture = function ( webglType, webglTexture ) { + + if ( currentTextureSlot === undefined ) { + + _this.activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + }; + + this.compressedTexImage2D = function () { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + }; + + this.texImage2D = function () { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + }; + + // + + this.reset = function () { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentBlending = null; + + currentDepthWrite = null; + currentColorWrite = null; + + currentFlipSided = null; + + }; + +}; + +// File:src/renderers/webgl/plugins/LensFlarePlugin.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.LensFlarePlugin = function ( renderer, flares ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + var hasVertexTexture; + + var tempTexture, occlusionTexture; + + function init() { + + var vertices = new Float32Array( [ + - 1, - 1, 0, 0, + 1, - 1, 1, 0, + 1, 1, 1, 1, + - 1, 1, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + // buffers + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + // textures + + tempTexture = gl.createTexture(); + occlusionTexture = gl.createTexture(); + + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + hasVertexTexture = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ) > 0; + + var shader; + + if ( hasVertexTexture ) { + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "uniform sampler2D occlusionMap;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", + + "vVisibility = visibility.r / 9.0;", + "vVisibility *= 1.0 - visibility.g / 9.0;", + "vVisibility *= visibility.b / 9.0;", + "vVisibility *= 1.0 - visibility.a / 9.0;", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * vVisibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + } else { + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "precision mediump float;", + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform sampler2D occlusionMap;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;", + "visibility = ( 1.0 - visibility / 4.0 );", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * visibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + } + + program = createProgram( shader ); + + attributes = { + vertex: gl.getAttribLocation ( program, "position" ), + uv: gl.getAttribLocation ( program, "uv" ) + }; + + uniforms = { + renderType: gl.getUniformLocation( program, "renderType" ), + map: gl.getUniformLocation( program, "map" ), + occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), + opacity: gl.getUniformLocation( program, "opacity" ), + color: gl.getUniformLocation( program, "color" ), + scale: gl.getUniformLocation( program, "scale" ), + rotation: gl.getUniformLocation( program, "rotation" ), + screenPosition: gl.getUniformLocation( program, "screenPosition" ) + }; + + } + + /* + * Render lens flares + * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, + * reads these back and calculates occlusion. + */ + + this.render = function ( scene, camera, viewportWidth, viewportHeight ) { + + if ( flares.length === 0 ) return; + + var tempPosition = new THREE.Vector3(); + + var invAspect = viewportHeight / viewportWidth, + halfViewportWidth = viewportWidth * 0.5, + halfViewportHeight = viewportHeight * 0.5; + + var size = 16 / viewportHeight, + scale = new THREE.Vector2( size * invAspect, size ); + + var screenPosition = new THREE.Vector3( 1, 1, 0 ), + screenPositionPixels = new THREE.Vector2( 1, 1 ); + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.vertex ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + // loop through all lens flares to update their occlusion and positions + // setup gl and common used attribs/uniforms + + gl.uniform1i( uniforms.occlusionMap, 0 ); + gl.uniform1i( uniforms.map, 1 ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + state.disable( gl.CULL_FACE ); + gl.depthMask( false ); + + for ( var i = 0, l = flares.length; i < l; i ++ ) { + + size = 16 / viewportHeight; + scale.set( size * invAspect, size ); + + // calc object screen position + + var flare = flares[ i ]; + + tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); + + tempPosition.applyMatrix4( camera.matrixWorldInverse ); + tempPosition.applyProjection( camera.projectionMatrix ); + + // setup arrays for gl programs + + screenPosition.copy( tempPosition ); + + screenPositionPixels.x = screenPosition.x * halfViewportWidth + halfViewportWidth; + screenPositionPixels.y = screenPosition.y * halfViewportHeight + halfViewportHeight; + + // screen cull + + if ( hasVertexTexture || ( + screenPositionPixels.x > 0 && + screenPositionPixels.x < viewportWidth && + screenPositionPixels.y > 0 && + screenPositionPixels.y < viewportHeight ) ) { + + // save current RGB to temp texture + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, null ); + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 ); + + + // render pink quad + + gl.uniform1i( uniforms.renderType, 0 ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + + state.disable( gl.BLEND ); + state.enable( gl.DEPTH_TEST ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // copy result to occlusionMap + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 ); + + + // restore graphics + + gl.uniform1i( uniforms.renderType, 1 ); + state.disable( gl.DEPTH_TEST ); + + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // update object positions + + flare.positionScreen.copy( screenPosition ); + + if ( flare.customUpdateCallback ) { + + flare.customUpdateCallback( flare ); + + } else { + + flare.updateLensFlares(); + + } + + // render flares + + gl.uniform1i( uniforms.renderType, 2 ); + state.enable( gl.BLEND ); + + for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { + + var sprite = flare.lensFlares[ j ]; + + if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { + + screenPosition.x = sprite.x; + screenPosition.y = sprite.y; + screenPosition.z = sprite.z; + + size = sprite.size * sprite.scale / viewportHeight; + + scale.x = size * invAspect; + scale.y = size; + + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform1f( uniforms.rotation, sprite.rotation ); + + gl.uniform1f( uniforms.opacity, sprite.opacity ); + gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); + + state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); + renderer.setTexture( sprite.texture, 1 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + } + + } + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + state.enable( gl.DEPTH_TEST ); + gl.depthMask( true ); + + renderer.resetGLState(); + + }; + + function createProgram ( shader ) { + + var program = gl.createProgram(); + + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + + var prefix = "precision " + renderer.getPrecision() + " float;\n"; + + gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); + gl.shaderSource( vertexShader, prefix + shader.vertexShader ); + + gl.compileShader( fragmentShader ); + gl.compileShader( vertexShader ); + + gl.attachShader( program, fragmentShader ); + gl.attachShader( program, vertexShader ); + + gl.linkProgram( program ); + + return program; + + } + +}; + +// File:src/renderers/webgl/plugins/SpritePlugin.js + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.SpritePlugin = function ( renderer, sprites ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new THREE.Vector3(); + var spriteRotation = new THREE.Quaternion(); + var spriteScale = new THREE.Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation ( program, 'position' ), + uv: gl.getAttribLocation ( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElement( 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new THREE.Texture( canvas ); + texture.needsUpdate = true; + + } + + this.render = function ( scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( fog instanceof THREE.Fog ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( fog instanceof THREE.FogExp2 ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + + if ( material.map && material.map.image && material.map.image.width ) { + + renderer.setTexture( material.map, 0 ); + + } else { + + renderer.setTexture( texture, 0 ); + + } + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + renderer.resetGLState(); + + }; + + function createProgram () { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vUV = uvOffset + uv * uvScale;', + + 'vec2 alignedPosition = position * scale;', + + 'vec2 rotatedPosition;', + 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + 'vec4 finalPosition;', + + 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + 'finalPosition.xy += rotatedPosition;', + 'finalPosition = projectionMatrix * finalPosition;', + + 'gl_Position = finalPosition;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vec4 texture = texture2D( map, vUV );', + + 'if ( texture.a < alphaTest ) discard;', + + 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + 'if ( fogType > 0 ) {', + + 'float depth = gl_FragCoord.z / gl_FragCoord.w;', + 'float fogFactor = 0.0;', + + 'if ( fogType == 1 ) {', + + 'fogFactor = smoothstep( fogNear, fogFar, depth );', + + '} else {', + + 'const float LOG2 = 1.442695;', + 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', + 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + '}', + + 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', + + '}', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable ( a, b ) { + + if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + +}; + +// File:src/extras/CurveUtils.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.CurveUtils = { + + tangentQuadraticBezier: function ( t, p0, p1, p2 ) { + + return 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 ); + + }, + + // Puay Bing, thanks for helping with this derivative! + + tangentCubicBezier: function ( t, p0, p1, p2, p3 ) { + + return - 3 * p0 * ( 1 - t ) * ( 1 - t ) + + 3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) + + 6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 + + 3 * t * t * p3; + + }, + + tangentSpline: function ( t, p0, p1, p2, p3 ) { + + // To check if my formulas are correct + + var h00 = 6 * t * t - 6 * t; // derived from 2t^3 − 3t^2 + 1 + var h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t + var h01 = - 6 * t * t + 6 * t; // − 2t3 + 3t2 + var h11 = 3 * t * t - 2 * t; // t3 − t2 + + return h00 + h10 + h01 + h11; + + }, + + // Catmull-Rom + + interpolate: function( p0, p1, p2, p3, t ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + +}; + +// File:src/extras/GeometryUtils.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + + var matrix; + + if ( geometry2 instanceof THREE.Mesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + +}; + +// File:src/extras/ImageUtils.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author Daosheng Mu / https://github.com/DaoshengMu/ + */ + +THREE.ImageUtils = { + + crossOrigin: undefined, + + loadTexture: function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture is being deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new THREE.TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadTextureCube: function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube is being deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new THREE.CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadCompressedTexture: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ) + + }, + + loadCompressedTextureCube: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ) + + } + +}; + +// File:src/extras/SceneUtils.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.SceneUtils = { + + createMultiMaterialObject: function ( geometry, materials ) { + + var group = new THREE.Group(); + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + group.add( new THREE.Mesh( geometry, materials[ i ] ) ); + + } + + return group; + + }, + + detach: function ( child, parent, scene ) { + + child.applyMatrix( parent.matrixWorld ); + parent.remove( child ); + scene.add( child ); + + }, + + attach: function ( child, scene, parent ) { + + var matrixWorldInverse = new THREE.Matrix4(); + matrixWorldInverse.getInverse( parent.matrixWorld ); + child.applyMatrix( matrixWorldInverse ); + + scene.remove( child ); + parent.add( child ); + + } + +}; + +// File:src/extras/ShapeUtils.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + triangulate: ( function () { + + /** + * This code is a quick port of code written in C++ which was submitted to + * flipcode.com by John W. Ratcliff // July 22, 2000 + * See original code and more information here: + * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml + * + * ported to actionscript by Zevan Rosser + * www.actionsnippet.com + * + * ported to javascript by Joshua Koo + * http://www.lab4games.net/zz85/blog + * + */ + + function snip( contour, u, v, w, n, verts ) { + + var p; + var ax, ay, bx, by; + var cx, cy, px, py; + + ax = contour[ verts[ u ] ].x; + ay = contour[ verts[ u ] ].y; + + bx = contour[ verts[ v ] ].x; + by = contour[ verts[ v ] ].y; + + cx = contour[ verts[ w ] ].x; + cy = contour[ verts[ w ] ].y; + + if ( Number.EPSILON > ( ( ( bx - ax ) * ( cy - ay ) ) - ( ( by - ay ) * ( cx - ax ) ) ) ) return false; + + var aX, aY, bX, bY, cX, cY; + var apx, apy, bpx, bpy, cpx, cpy; + var cCROSSap, bCROSScp, aCROSSbp; + + aX = cx - bx; aY = cy - by; + bX = ax - cx; bY = ay - cy; + cX = bx - ax; cY = by - ay; + + for ( p = 0; p < n; p ++ ) { + + px = contour[ verts[ p ] ].x; + py = contour[ verts[ p ] ].y; + + if ( ( ( px === ax ) && ( py === ay ) ) || + ( ( px === bx ) && ( py === by ) ) || + ( ( px === cx ) && ( py === cy ) ) ) continue; + + apx = px - ax; apy = py - ay; + bpx = px - bx; bpy = py - by; + cpx = px - cx; cpy = py - cy; + + // see if p is inside triangle abc + + aCROSSbp = aX * bpy - aY * bpx; + cCROSSap = cX * apy - cY * apx; + bCROSScp = bX * cpy - bY * cpx; + + if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; + + } + + return true; + + } + + // takes in an contour array and returns + + return function ( contour, indices ) { + + var n = contour.length; + + if ( n < 3 ) return null; + + var result = [], + verts = [], + vertIndices = []; + + /* we want a counter-clockwise polygon in verts */ + + var u, v, w; + + if ( THREE.ShapeUtils.area( contour ) > 0.0 ) { + + for ( v = 0; v < n; v ++ ) verts[ v ] = v; + + } else { + + for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; + + } + + var nv = n; + + /* remove nv - 2 vertices, creating 1 triangle every time */ + + var count = 2 * nv; /* error detection */ + + for ( v = nv - 1; nv > 2; ) { + + /* if we loop, it is probably a non-simple polygon */ + + if ( ( count -- ) <= 0 ) { + + //** Triangulate: ERROR - probable bad polygon! + + //throw ( "Warning, unable to triangulate polygon!" ); + //return null; + // Sometimes warning is fine, especially polygons are triangulated in reverse. + console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); + + if ( indices ) return vertIndices; + return result; + + } + + /* three consecutive vertices in current polygon, */ + + u = v; if ( nv <= u ) u = 0; /* previous */ + v = u + 1; if ( nv <= v ) v = 0; /* new v */ + w = v + 1; if ( nv <= w ) w = 0; /* next */ + + if ( snip( contour, u, v, w, nv, verts ) ) { + + var a, b, c, s, t; + + /* true names of the vertices */ + + a = verts[ u ]; + b = verts[ v ]; + c = verts[ w ]; + + /* output Triangle */ + + result.push( [ contour[ a ], + contour[ b ], + contour[ c ] ] ); + + + vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); + + /* remove v from the remaining polygon */ + + for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { + + verts[ s ] = verts[ t ]; + + } + + nv --; + + /* reset error detection counter */ + + count = 2 * nv; + + } + + } + + if ( indices ) return vertIndices; + return result; + + } + + } )(), + + triangulateShape: function ( contour, holes ) { + + function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { + + // inOtherPt needs to be collinear to the inSegment + if ( inSegPt1.x !== inSegPt2.x ) { + + if ( inSegPt1.x < inSegPt2.x ) { + + return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); + + } else { + + return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); + + } + + } else { + + if ( inSegPt1.y < inSegPt2.y ) { + + return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); + + } else { + + return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); + + } + + } + + } + + function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { + + var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; + var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; + + var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; + var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; + + var limit = seg1dy * seg2dx - seg1dx * seg2dy; + var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; + + if ( Math.abs( limit ) > Number.EPSILON ) { + + // not parallel + + var perpSeg2; + if ( limit > 0 ) { + + if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; + + } else { + + if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; + + } + + // i.e. to reduce rounding errors + // intersection at endpoint of segment#1? + if ( perpSeg2 === 0 ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt1 ]; + + } + if ( perpSeg2 === limit ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt2 ]; + + } + // intersection at endpoint of segment#2? + if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; + if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; + + // return real intersection point + var factorSeg1 = perpSeg2 / limit; + return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, + y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; + + } else { + + // parallel or collinear + if ( ( perpSeg1 !== 0 ) || + ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; + + // they are collinear or degenerate + var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? + var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? + // both segments are points + if ( seg1Pt && seg2Pt ) { + + if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || + ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points + return [ inSeg1Pt1 ]; // they are the same point + + } + // segment#1 is a single point + if ( seg1Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 + return [ inSeg1Pt1 ]; + + } + // segment#2 is a single point + if ( seg2Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 + return [ inSeg2Pt1 ]; + + } + + // they are collinear segments, which might overlap + var seg1min, seg1max, seg1minVal, seg1maxVal; + var seg2min, seg2max, seg2minVal, seg2maxVal; + if ( seg1dx !== 0 ) { + + // the segments are NOT on a vertical line + if ( inSeg1Pt1.x < inSeg1Pt2.x ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; + + } + if ( inSeg2Pt1.x < inSeg2Pt2.x ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; + + } + + } else { + + // the segments are on a vertical line + if ( inSeg1Pt1.y < inSeg1Pt2.y ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; + + } + if ( inSeg2Pt1.y < inSeg2Pt2.y ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; + + } + + } + if ( seg1minVal <= seg2minVal ) { + + if ( seg1maxVal < seg2minVal ) return []; + if ( seg1maxVal === seg2minVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg2min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; + return [ seg2min, seg2max ]; + + } else { + + if ( seg1minVal > seg2maxVal ) return []; + if ( seg1minVal === seg2maxVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg1min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; + return [ seg1min, seg2max ]; + + } + + } + + } + + function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { + + // The order of legs is important + + // translation of all points, so that Vertex is at (0,0) + var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; + var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; + var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; + + // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. + var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; + var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; + + if ( Math.abs( from2toAngle ) > Number.EPSILON ) { + + // angle != 180 deg. + + var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; + // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); + + if ( from2toAngle > 0 ) { + + // main angle < 180 deg. + return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); + + } else { + + // main angle > 180 deg. + return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); + + } + + } else { + + // angle == 180 deg. + // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); + return ( from2otherAngle > 0 ); + + } + + } + + + function removeHoles( contour, holes ) { + + var shape = contour.concat(); // work on this shape + var hole; + + function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { + + // Check if hole point lies within angle around shape point + var lastShapeIdx = shape.length - 1; + + var prevShapeIdx = inShapeIdx - 1; + if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; + + var nextShapeIdx = inShapeIdx + 1; + if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; + + var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); + return false; + + } + + // Check if shape point lies within angle around hole point + var lastHoleIdx = hole.length - 1; + + var prevHoleIdx = inHoleIdx - 1; + if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; + + var nextHoleIdx = inHoleIdx + 1; + if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; + + insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); + return false; + + } + + return true; + + } + + function intersectsShapeEdge( inShapePt, inHolePt ) { + + // checks for intersections with shape edges + var sIdx, nextIdx, intersection; + for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { + + nextIdx = sIdx + 1; nextIdx %= shape.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + return false; + + } + + var indepHoles = []; + + function intersectsHoleEdge( inShapePt, inHolePt ) { + + // checks for intersections with hole edges + var ihIdx, chkHole, + hIdx, nextIdx, intersection; + for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { + + chkHole = holes[ indepHoles[ ihIdx ]]; + for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { + + nextIdx = hIdx + 1; nextIdx %= chkHole.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + } + return false; + + } + + var holeIndex, shapeIndex, + shapePt, holePt, + holeIdx, cutKey, failedCuts = [], + tmpShape1, tmpShape2, + tmpHole1, tmpHole2; + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + indepHoles.push( h ); + + } + + var minShapeIndex = 0; + var counter = indepHoles.length * 2; + while ( indepHoles.length > 0 ) { + + counter --; + if ( counter < 0 ) { + + console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); + break; + + } + + // search for shape-vertex and hole-vertex, + // which can be connected without intersections + for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { + + shapePt = shape[ shapeIndex ]; + holeIndex = - 1; + + // search for hole which can be reached without intersections + for ( var h = 0; h < indepHoles.length; h ++ ) { + + holeIdx = indepHoles[ h ]; + + // prevent multiple checks + cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; + if ( failedCuts[ cutKey ] !== undefined ) continue; + + hole = holes[ holeIdx ]; + for ( var h2 = 0; h2 < hole.length; h2 ++ ) { + + holePt = hole[ h2 ]; + if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; + if ( intersectsShapeEdge( shapePt, holePt ) ) continue; + if ( intersectsHoleEdge( shapePt, holePt ) ) continue; + + holeIndex = h2; + indepHoles.splice( h, 1 ); + + tmpShape1 = shape.slice( 0, shapeIndex + 1 ); + tmpShape2 = shape.slice( shapeIndex ); + tmpHole1 = hole.slice( holeIndex ); + tmpHole2 = hole.slice( 0, holeIndex + 1 ); + + shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); + + minShapeIndex = shapeIndex; + + // Debug only, to show the selected cuts + // glob_CutLines.push( [ shapePt, holePt ] ); + + break; + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + failedCuts[ cutKey ] = true; // remember failure + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + } + + } + + return shape; /* shape with no holes */ + + } + + + var i, il, f, face, + key, index, + allPointsMap = {}; + + // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. + + var allpoints = contour.concat(); + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + Array.prototype.push.apply( allpoints, holes[ h ] ); + + } + + //console.log( "allpoints",allpoints, allpoints.length ); + + // prepare all points map + + for ( i = 0, il = allpoints.length; i < il; i ++ ) { + + key = allpoints[ i ].x + ":" + allpoints[ i ].y; + + if ( allPointsMap[ key ] !== undefined ) { + + console.warn( "THREE.Shape: Duplicate point", key ); + + } + + allPointsMap[ key ] = i; + + } + + // remove holes by cutting paths to holes and adding them to the shape + var shapeWithoutHoles = removeHoles( contour, holes ); + + var triangles = THREE.ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape + //console.log( "triangles",triangles, triangles.length ); + + // check all face vertices against all points map + + for ( i = 0, il = triangles.length; i < il; i ++ ) { + + face = triangles[ i ]; + + for ( f = 0; f < 3; f ++ ) { + + key = face[ f ].x + ":" + face[ f ].y; + + index = allPointsMap[ key ]; + + if ( index !== undefined ) { + + face[ f ] = index; + + } + + } + + } + + return triangles.concat(); + + }, + + isClockWise: function ( pts ) { + + return THREE.ShapeUtils.area( pts ) < 0; + + }, + + // Bezier Curves formulas obtained from + // http://en.wikipedia.org/wiki/B%C3%A9zier_curve + + // Quad Bezier Functions + + b2: ( function () { + + function b2p0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function b2p1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function b2p2( t, p ) { + + return t * t * p; + + } + + return function ( t, p0, p1, p2 ) { + + return b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 ); + + }; + + } )(), + + // Cubic Bezier Functions + + b3: ( function () { + + function b3p0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function b3p1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function b3p2( t, p ) { + + var k = 1 - t; + return 3 * k * t * t * p; + + } + + function b3p3( t, p ) { + + return t * t * t * p; + + } + + return function ( t, p0, p1, p2, p3 ) { + + return b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 ); + + }; + + } )() + +}; + +// File:src/extras/audio/Audio.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Audio = function ( listener ) { + + THREE.Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + this.source = this.context.createBufferSource(); + this.source.onended = this.onEnded.bind( this ); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + this.autoplay = false; + + this.startTime = 0; + this.playbackRate = 1; + this.isPlaying = false; + +}; + +THREE.Audio.prototype = Object.create( THREE.Object3D.prototype ); +THREE.Audio.prototype.constructor = THREE.Audio; + +THREE.Audio.prototype.load = function ( file ) { + + var scope = this; + + var request = new XMLHttpRequest(); + request.open( 'GET', file, true ); + request.responseType = 'arraybuffer'; + request.onload = function ( e ) { + + scope.context.decodeAudioData( this.response, function ( buffer ) { + + scope.source.buffer = buffer; + + if ( scope.autoplay ) scope.play(); + + } ); + + }; + request.send(); + + return this; + +}; + +THREE.Audio.prototype.play = function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.source.buffer; + source.loop = this.source.loop; + source.onended = this.source.onended; + source.start( 0, this.startTime ); + source.playbackRate.value = this.playbackRate; + + this.isPlaying = true; + + this.source = source; + + this.connect(); + +}; + +THREE.Audio.prototype.pause = function () { + + this.source.stop(); + this.startTime = this.context.currentTime; + +}; + +THREE.Audio.prototype.stop = function () { + + this.source.stop(); + this.startTime = 0; + +}; + +THREE.Audio.prototype.connect = function () { + + if ( this.filter !== undefined ) { + + this.source.connect( this.filter ); + this.filter.connect( this.panner ); + + } else { + + this.source.connect( this.panner ); + + } + +}; + +THREE.Audio.prototype.disconnect = function () { + + if ( this.filter !== undefined ) { + + this.source.disconnect( this.filter ); + this.filter.disconnect( this.panner ); + + } else { + + this.source.disconnect( this.panner ); + + } + +}; + +THREE.Audio.prototype.setFilter = function ( value ) { + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filter = value; + this.connect(); + + } else { + + this.filter = value; + + } + +}; + +THREE.Audio.prototype.getFilter = function () { + + return this.filter; + +}; + +THREE.Audio.prototype.setPlaybackRate = function ( value ) { + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.value = this.playbackRate; + + } + +}; + +THREE.Audio.prototype.getPlaybackRate = function () { + + return this.playbackRate; + +}; + +THREE.Audio.prototype.onEnded = function() { + + this.isPlaying = false; + +}; + +THREE.Audio.prototype.setLoop = function ( value ) { + + this.source.loop = value; + +}; + +THREE.Audio.prototype.getLoop = function () { + + return this.source.loop; + +}; + +THREE.Audio.prototype.setRefDistance = function ( value ) { + + this.panner.refDistance = value; + +}; + +THREE.Audio.prototype.getRefDistance = function () { + + return this.panner.refDistance; + +}; + +THREE.Audio.prototype.setRolloffFactor = function ( value ) { + + this.panner.rolloffFactor = value; + +}; + +THREE.Audio.prototype.getRolloffFactor = function () { + + return this.panner.rolloffFactor; + +}; + +THREE.Audio.prototype.setVolume = function ( value ) { + + this.gain.gain.value = value; + +}; + +THREE.Audio.prototype.getVolume = function () { + + return this.gain.gain.value; + +}; + +THREE.Audio.prototype.updateMatrixWorld = ( function () { + + var position = new THREE.Vector3(); + + return function updateMatrixWorld( force ) { + + THREE.Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + +} )(); + +// File:src/extras/audio/AudioListener.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.AudioListener = function () { + + THREE.Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = new ( window.AudioContext || window.webkitAudioContext )(); + +}; + +THREE.AudioListener.prototype = Object.create( THREE.Object3D.prototype ); +THREE.AudioListener.prototype.constructor = THREE.AudioListener; + +THREE.AudioListener.prototype.updateMatrixWorld = ( function () { + + var position = new THREE.Vector3(); + var quaternion = new THREE.Quaternion(); + var scale = new THREE.Vector3(); + + var orientation = new THREE.Vector3(); + + return function updateMatrixWorld( force ) { + + THREE.Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + }; + +} )(); + +// File:src/extras/core/Curve.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of Curve methods + * .getPoint(t), getTangent(t) + * .getPointAt(u), getTagentAt(u) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following classes subclasses THREE.Curve: + * + * -- 2d classes -- + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.CubicBezierCurve + * THREE.SplineCurve + * THREE.ArcCurve + * THREE.EllipseCurve + * + * -- 3d classes -- + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * THREE.CubicBezierCurve3 + * THREE.SplineCurve3 + * THREE.ClosedSplineCurve3 + * + * A series of curves can be represented as a THREE.CurvePath + * + **/ + +/************************************************************** + * Abstract Curve base class + **************************************************************/ + +THREE.Curve = function () { + +}; + +THREE.Curve.prototype = { + + constructor: THREE.Curve, + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( t ) { + + console.warn( "THREE.Curve: Warning, getPoint() not implemented!" ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( ! divisions ) divisions = 5; + + var d, pts = []; + + for ( d = 0; d <= divisions; d ++ ) { + + pts.push( this.getPoint( d / divisions ) ); + + } + + return pts; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( ! divisions ) divisions = 5; + + var d, pts = []; + + for ( d = 0; d <= divisions; d ++ ) { + + pts.push( this.getPointAt( d / divisions ) ); + + } + + return pts; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200; + + if ( this.cacheArcLengths + && ( this.cacheArcLengths.length === divisions + 1 ) + && ! this.needsUpdate ) { + + //console.log( "cached", this.cacheArcLengths ); + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint ( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum:sum }; Sum is in the last element. + + }, + + updateArcLengths: function() { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + //var time = Date.now(); + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + //console.log('b' , i, low, high, Date.now()- time); + + if ( arcLengths[ i ] === targetArcLength ) { + + var t = i / ( il - 1 ); + return t; + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + } + +} + +THREE.Curve.Utils = THREE.CurveUtils; // backwards compatibility + +// TODO: Transformation for Curves? + +/************************************************************** + * 3D Curves + **************************************************************/ + +// A Factory method for creating new curve subclasses + +THREE.Curve.create = function ( constructor, getPointFunc ) { + + constructor.prototype = Object.create( THREE.Curve.prototype ); + constructor.prototype.constructor = constructor; + constructor.prototype.getPoint = getPointFunc; + + return constructor; + +}; + +// File:src/extras/core/CurvePath.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + +/************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + +THREE.CurvePath = function () { + + this.curves = []; + + this.autoClose = false; // Automatically closes the path + +}; + +THREE.CurvePath.prototype = Object.create( THREE.Curve.prototype ); +THREE.CurvePath.prototype.constructor = THREE.CurvePath; + +THREE.CurvePath.prototype.add = function ( curve ) { + + this.curves.push( curve ); + +}; + +/* +THREE.CurvePath.prototype.checkConnection = function() { + // TODO + // If the ending of curve is not connected to the starting + // or the next curve, then, this is not a real path +}; +*/ + +THREE.CurvePath.prototype.closePath = function() { + + // TODO Test + // and verify for vector3 (needs to implement equals) + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new THREE.LineCurve( endPoint, startPoint ) ); + + } + +}; + +// To get accurate point with reference to +// entire path distance at time t, +// following has to be done: + +// 1. Length of each sub path have to be known +// 2. Locate and identify type of curve +// 3. Get t for the curve +// 4. Return curve.getPointAt(t') + +THREE.CurvePath.prototype.getPoint = function( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var u = 1 - diff / curve.getLength(); + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 0 ) { + + laste = points[ points.length - 1 ]; + + cpx0 = laste.x; + cpy0 = laste.y; + + } else { + + laste = this.actions[ i - 1 ].args; + + cpx0 = laste[ laste.length - 2 ]; + cpy0 = laste[ laste.length - 1 ]; + + } + + for ( var j = 1; j <= divisions; j ++ ) { + + var t = j / divisions; + + tx = b2( t, cpx0, cpx1, cpx ); + ty = b2( t, cpy0, cpy1, cpy ); + + points.push( new THREE.Vector2( tx, ty ) ); + + } + + break; + + case 'bezierCurveTo': + + cpx = args[ 4 ]; + cpy = args[ 5 ]; + + cpx1 = args[ 0 ]; + cpy1 = args[ 1 ]; + + cpx2 = args[ 2 ]; + cpy2 = args[ 3 ]; + + if ( points.length > 0 ) { + + laste = points[ points.length - 1 ]; + + cpx0 = laste.x; + cpy0 = laste.y; + + } else { + + laste = this.actions[ i - 1 ].args; + + cpx0 = laste[ laste.length - 2 ]; + cpy0 = laste[ laste.length - 1 ]; + + } + + + for ( var j = 1; j <= divisions; j ++ ) { + + var t = j / divisions; + + tx = b3( t, cpx0, cpx1, cpx2, cpx ); + ty = b3( t, cpy0, cpy1, cpy2, cpy ); + + points.push( new THREE.Vector2( tx, ty ) ); + + } + + break; + + case 'splineThru': + + laste = this.actions[ i - 1 ].args; + + var last = new THREE.Vector2( laste[ laste.length - 2 ], laste[ laste.length - 1 ] ); + var spts = [ last ]; + + var n = divisions * args[ 0 ].length; + + spts = spts.concat( args[ 0 ] ); + + var spline = new THREE.SplineCurve( spts ); + + for ( var j = 1; j <= n; j ++ ) { + + points.push( spline.getPointAt( j / n ) ); + + } + + break; + + case 'arc': + + var aX = args[ 0 ], aY = args[ 1 ], + aRadius = args[ 2 ], + aStartAngle = args[ 3 ], aEndAngle = args[ 4 ], + aClockwise = !! args[ 5 ]; + + var deltaAngle = aEndAngle - aStartAngle; + var angle; + var tdivisions = divisions * 2; + + for ( var j = 1; j <= tdivisions; j ++ ) { + + var t = j / tdivisions; + + if ( ! aClockwise ) { + + t = 1 - t; + + } + + angle = aStartAngle + t * deltaAngle; + + tx = aX + aRadius * Math.cos( angle ); + ty = aY + aRadius * Math.sin( angle ); + + //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty); + + points.push( new THREE.Vector2( tx, ty ) ); + + } + + //console.log(points); + + break; + + case 'ellipse': + + var aX = args[ 0 ], aY = args[ 1 ], + xRadius = args[ 2 ], + yRadius = args[ 3 ], + aStartAngle = args[ 4 ], aEndAngle = args[ 5 ], + aClockwise = !! args[ 6 ], + aRotation = args[ 7 ]; + + + var deltaAngle = aEndAngle - aStartAngle; + var angle; + var tdivisions = divisions * 2; + + var cos, sin; + if ( aRotation !== 0 ) { + + cos = Math.cos( aRotation ); + sin = Math.sin( aRotation ); + + } + + for ( var j = 1; j <= tdivisions; j ++ ) { + + var t = j / tdivisions; + + if ( ! aClockwise ) { + + t = 1 - t; + + } + + angle = aStartAngle + t * deltaAngle; + + tx = aX + xRadius * Math.cos( angle ); + ty = aY + yRadius * Math.sin( angle ); + + if ( aRotation !== 0 ) { + + var x = tx, y = ty; + + // Rotate the point about the center of the ellipse. + tx = ( x - aX ) * cos - ( y - aY ) * sin + aX; + ty = ( x - aX ) * sin + ( y - aY ) * cos + aY; + + } + + //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty); + + points.push( new THREE.Vector2( tx, ty ) ); + + } + + //console.log(points); + + break; + + } // end switch + + } + + + + // Normalize to remove the closing point by default. + var lastPoint = points[ points.length - 1 ]; + if ( Math.abs( lastPoint.x - points[ 0 ].x ) < Number.EPSILON && + Math.abs( lastPoint.y - points[ 0 ].y ) < Number.EPSILON ) + points.splice( points.length - 1, 1 ); + if ( closedPath ) { + + points.push( points[ 0 ] ); + + } + + return points; + +}; + +// +// Breaks path into shapes +// +// Assumptions (if parameter isCCW==true the opposite holds): +// - solid shapes are defined clockwise (CW) +// - holes are defined counterclockwise (CCW) +// +// If parameter noHoles==true: +// - all subPaths are regarded as solid shapes +// - definition order CW/CCW has no relevance +// + +THREE.Path.prototype.toShapes = function( isCCW, noHoles ) { + + function extractSubpaths( inActions ) { + + var subPaths = [], lastPath = new THREE.Path(); + + for ( var i = 0, l = inActions.length; i < l; i ++ ) { + + var item = inActions[ i ]; + + var args = item.args; + var action = item.action; + + if ( action === 'moveTo' ) { + + if ( lastPath.actions.length !== 0 ) { + + subPaths.push( lastPath ); + lastPath = new THREE.Path(); + + } + + } + + lastPath[ action ].apply( lastPath, args ); + + } + + if ( lastPath.actions.length !== 0 ) { + + subPaths.push( lastPath ); + + } + + // console.log(subPaths); + + return subPaths; + + } + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new THREE.Shape(); + tmpShape.actions = tmpPath.actions; + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + //console.log("shape", shapes); + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = THREE.ShapeUtils.isClockWise; + + var subPaths = extractSubpaths( this.actions ); + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new THREE.Shape(); + tmpShape.actions = tmpPath.actions; + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new THREE.Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.actions = tmpPath.actions; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + +}; + +// File:src/extras/core/Shape.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + +// STEP 1 Create a path. +// STEP 2 Turn path into shape. +// STEP 3 ExtrudeGeometry takes in Shape/Shapes +// STEP 3a - Extract points from each shape, turn to vertices +// STEP 3b - Triangulate each shape, add faces. + +THREE.Shape = function () { + + THREE.Path.apply( this, arguments ); + + this.holes = []; + +}; + +THREE.Shape.prototype = Object.create( THREE.Path.prototype ); +THREE.Shape.prototype.constructor = THREE.Shape; + +// Convenience method to return ExtrudeGeometry + +THREE.Shape.prototype.extrude = function ( options ) { + + return new THREE.ExtrudeGeometry( this, options ); + +}; + +// Convenience method to return ShapeGeometry + +THREE.Shape.prototype.makeGeometry = function ( options ) { + + return new THREE.ShapeGeometry( this, options ); + +}; + +// Get points of holes + +THREE.Shape.prototype.getPointsHoles = function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + +}; + + +// Get points of shape and holes (keypoints based on segments parameter) + +THREE.Shape.prototype.extractAllPoints = function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + +}; + +THREE.Shape.prototype.extractPoints = function ( divisions ) { + + return this.extractAllPoints( divisions ); + +}; + +THREE.Shape.Utils = THREE.ShapeUtils; // backwards compatibility + +// File:src/extras/curves/LineCurve.js + +/************************************************************** + * Line + **************************************************************/ + +THREE.LineCurve = function ( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + +}; + +THREE.LineCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.LineCurve.prototype.constructor = THREE.LineCurve; + +THREE.LineCurve.prototype.getPoint = function ( t ) { + + var point = this.v2.clone().sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + return point; + +}; + +// Line curve is linear, so we can overwrite default getPointAt + +THREE.LineCurve.prototype.getPointAt = function ( u ) { + + return this.getPoint( u ); + +}; + +THREE.LineCurve.prototype.getTangent = function( t ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + +}; + +// File:src/extras/curves/QuadraticBezierCurve.js + +/************************************************************** + * Quadratic Bezier curve + **************************************************************/ + + +THREE.QuadraticBezierCurve = function ( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + +}; + +THREE.QuadraticBezierCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.QuadraticBezierCurve.prototype.constructor = THREE.QuadraticBezierCurve; + + +THREE.QuadraticBezierCurve.prototype.getPoint = function ( t ) { + + var b2 = THREE.ShapeUtils.b2; + + return new THREE.Vector2( + b2( t, this.v0.x, this.v1.x, this.v2.x ), + b2( t, this.v0.y, this.v1.y, this.v2.y ) + ); + +}; + + +THREE.QuadraticBezierCurve.prototype.getTangent = function( t ) { + + var tangentQuadraticBezier = THREE.CurveUtils.tangentQuadraticBezier; + + return new THREE.Vector2( + tangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ), + tangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y ) + ).normalize(); + +}; + +// File:src/extras/curves/CubicBezierCurve.js + +/************************************************************** + * Cubic Bezier curve + **************************************************************/ + +THREE.CubicBezierCurve = function ( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + +}; + +THREE.CubicBezierCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.CubicBezierCurve.prototype.constructor = THREE.CubicBezierCurve; + +THREE.CubicBezierCurve.prototype.getPoint = function ( t ) { + + var b3 = THREE.ShapeUtils.b3; + + return new THREE.Vector2( + b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ) + ); + +}; + +THREE.CubicBezierCurve.prototype.getTangent = function( t ) { + + var tangentCubicBezier = THREE.CurveUtils.tangentCubicBezier; + + return new THREE.Vector2( + tangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + tangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ) + ).normalize(); + +}; + +// File:src/extras/curves/SplineCurve.js + +/************************************************************** + * Spline curve + **************************************************************/ + +THREE.SplineCurve = function ( points /* array of Vector2 */ ) { + + this.points = ( points == undefined ) ? [] : points; + +}; + +THREE.SplineCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.SplineCurve.prototype.constructor = THREE.SplineCurve; + +THREE.SplineCurve.prototype.getPoint = function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + var interpolate = THREE.CurveUtils.interpolate; + + return new THREE.Vector2( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ) + ); + +}; + +// File:src/extras/curves/EllipseCurve.js + +/************************************************************** + * Ellipse curve + **************************************************************/ + +THREE.EllipseCurve = function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation || 0; + +}; + +THREE.EllipseCurve.prototype = Object.create( THREE.Curve.prototype ); +THREE.EllipseCurve.prototype.constructor = THREE.EllipseCurve; + +THREE.EllipseCurve.prototype.getPoint = function ( t ) { + + var deltaAngle = this.aEndAngle - this.aStartAngle; + + if ( deltaAngle < 0 ) deltaAngle += Math.PI * 2; + if ( deltaAngle > Math.PI * 2 ) deltaAngle -= Math.PI * 2; + + var angle; + + if ( this.aClockwise === true ) { + + angle = this.aEndAngle + ( 1 - t ) * ( Math.PI * 2 - deltaAngle ); + + } else { + + angle = this.aStartAngle + t * deltaAngle; + + } + + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x, ty = y; + + // Rotate the point about the center of the ellipse. + x = ( tx - this.aX ) * cos - ( ty - this.aY ) * sin + this.aX; + y = ( tx - this.aX ) * sin + ( ty - this.aY ) * cos + this.aY; + + } + + return new THREE.Vector2( x, y ); + +}; + +// File:src/extras/curves/ArcCurve.js + +/************************************************************** + * Arc curve + **************************************************************/ + +THREE.ArcCurve = function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + THREE.EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + +}; + +THREE.ArcCurve.prototype = Object.create( THREE.EllipseCurve.prototype ); +THREE.ArcCurve.prototype.constructor = THREE.ArcCurve; + +// File:src/extras/curves/LineCurve3.js + +/************************************************************** + * Line3D + **************************************************************/ + +THREE.LineCurve3 = THREE.Curve.create( + + function ( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + + }, + + function ( t ) { + + var vector = new THREE.Vector3(); + + vector.subVectors( this.v2, this.v1 ); // diff + vector.multiplyScalar( t ); + vector.add( this.v1 ); + + return vector; + + } + +); + +// File:src/extras/curves/QuadraticBezierCurve3.js + +/************************************************************** + * Quadratic Bezier 3D curve + **************************************************************/ + +THREE.QuadraticBezierCurve3 = THREE.Curve.create( + + function ( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + }, + + function ( t ) { + + var b2 = THREE.ShapeUtils.b2; + + return new THREE.Vector3( + b2( t, this.v0.x, this.v1.x, this.v2.x ), + b2( t, this.v0.y, this.v1.y, this.v2.y ), + b2( t, this.v0.z, this.v1.z, this.v2.z ) + ); + + } + +); + +// File:src/extras/curves/CubicBezierCurve3.js + +/************************************************************** + * Cubic Bezier 3D curve + **************************************************************/ + +THREE.CubicBezierCurve3 = THREE.Curve.create( + + function ( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + }, + + function ( t ) { + + var b3 = THREE.ShapeUtils.b3; + + return new THREE.Vector3( + b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ), + b3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z ) + ); + + } + +); + +// File:src/extras/curves/SplineCurve3.js + +/************************************************************** + * Spline 3D curve + **************************************************************/ + + +THREE.SplineCurve3 = THREE.Curve.create( + + function ( points /* array of Vector3 */ ) { + + console.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' ); + this.points = ( points == undefined ) ? [] : points; + + }, + + function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + var interpolate = THREE.CurveUtils.interpolate; + + return new THREE.Vector3( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ), + interpolate( point0.z, point1.z, point2.z, point3.z, weight ) + ); + + } + +); + +// File:src/extras/curves/CatmullRomCurve3.js + +/** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + +THREE.CatmullRomCurve3 = ( function() { + + var + tmp = new THREE.Vector3(), + px = new CubicPoly(), + py = new CubicPoly(), + pz = new CubicPoly(); + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() { + + } + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + CubicPoly.prototype.init = function( x0, x1, t0, t1 ) { + + this.c0 = x0; + this.c1 = t0; + this.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + this.c3 = 2 * x0 - 2 * x1 + t0 + t1; + + }; + + CubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + // initCubicPoly + this.init( x1, x2, t1, t2 ); + + }; + + // standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4 + CubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) { + + this.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }; + + CubicPoly.prototype.calc = function( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3; + + }; + + // Subclass Three.js curve + return THREE.Curve.create( + + function ( p /* array of Vector3 */ ) { + + this.points = p || []; + + }, + + function ( t ) { + + var points = this.points, + point, intPoint, weight, l; + + l = points.length; + + if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); + + point = ( l - 1 ) * t; + intPoint = Math.floor( point ); + weight = point - intPoint; + + if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; + + if ( intPoint === 0 ) { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } else { + + p0 = points[ intPoint - 1 ]; + + } + + p1 = points[ intPoint ]; + p2 = points[ intPoint + 1 ]; + + if ( intPoint + 2 < l ) { + + p3 = points[ intPoint + 2 ] + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 2 ] ); + p3 = tmp; + + } + + if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.type === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.type === 'catmullrom' ) { + + var tension = this.tension !== undefined ? this.tension : 0.5; + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); + + } + + var v = new THREE.Vector3( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return v; + + } + + ); + +} )(); + +// File:src/extras/curves/ClosedSplineCurve3.js + +/************************************************************** + * Closed Spline 3D curve + **************************************************************/ + + +THREE.ClosedSplineCurve3 = THREE.Curve.create( + + function ( points /* array of Vector3 */ ) { + + this.points = ( points == undefined ) ? [] : points; + + }, + + function ( t ) { + + var points = this.points; + var point = ( points.length - 0 ) * t; // This needs to be from 0-length +1 + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; + + var point0 = points[ ( intPoint - 1 ) % points.length ]; + var point1 = points[ ( intPoint ) % points.length ]; + var point2 = points[ ( intPoint + 1 ) % points.length ]; + var point3 = points[ ( intPoint + 2 ) % points.length ]; + + var interpolate = THREE.CurveUtils.interpolate; + + return new THREE.Vector3( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ), + interpolate( point0.z, point1.z, point2.z, point3.z, weight ) + ); + + } + +); + +// File:src/extras/geometries/BoxGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as + */ + +THREE.BoxGeometry = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + THREE.Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.widthSegments = widthSegments || 1; + this.heightSegments = heightSegments || 1; + this.depthSegments = depthSegments || 1; + + var scope = this; + + var width_half = width / 2; + var height_half = height / 2; + var depth_half = depth / 2; + + buildPlane( 'z', 'y', - 1, - 1, depth, height, width_half, 0 ); // px + buildPlane( 'z', 'y', 1, - 1, depth, height, - width_half, 1 ); // nx + buildPlane( 'x', 'z', 1, 1, width, depth, height_half, 2 ); // py + buildPlane( 'x', 'z', 1, - 1, width, depth, - height_half, 3 ); // ny + buildPlane( 'x', 'y', 1, - 1, width, height, depth_half, 4 ); // pz + buildPlane( 'x', 'y', - 1, - 1, width, height, - depth_half, 5 ); // nz + + function buildPlane( u, v, udir, vdir, width, height, depth, materialIndex ) { + + var w, ix, iy, + gridX = scope.widthSegments, + gridY = scope.heightSegments, + width_half = width / 2, + height_half = height / 2, + offset = scope.vertices.length; + + if ( ( u === 'x' && v === 'y' ) || ( u === 'y' && v === 'x' ) ) { + + w = 'z'; + + } else if ( ( u === 'x' && v === 'z' ) || ( u === 'z' && v === 'x' ) ) { + + w = 'y'; + gridY = scope.depthSegments; + + } else if ( ( u === 'z' && v === 'y' ) || ( u === 'y' && v === 'z' ) ) { + + w = 'x'; + gridX = scope.depthSegments; + + } + + var gridX1 = gridX + 1, + gridY1 = gridY + 1, + segment_width = width / gridX, + segment_height = height / gridY, + normal = new THREE.Vector3(); + + normal[ w ] = depth > 0 ? 1 : - 1; + + for ( iy = 0; iy < gridY1; iy ++ ) { + + for ( ix = 0; ix < gridX1; ix ++ ) { + + var vector = new THREE.Vector3(); + vector[ u ] = ( ix * segment_width - width_half ) * udir; + vector[ v ] = ( iy * segment_height - height_half ) * vdir; + vector[ w ] = depth; + + scope.vertices.push( vector ); + + } + + } + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + var uva = new THREE.Vector2( ix / gridX, 1 - iy / gridY ); + var uvb = new THREE.Vector2( ix / gridX, 1 - ( iy + 1 ) / gridY ); + var uvc = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - ( iy + 1 ) / gridY ); + var uvd = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - iy / gridY ); + + var face = new THREE.Face3( a + offset, b + offset, d + offset ); + face.normal.copy( normal ); + face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() ); + face.materialIndex = materialIndex; + + scope.faces.push( face ); + scope.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); + + face = new THREE.Face3( b + offset, c + offset, d + offset ); + face.normal.copy( normal ); + face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() ); + face.materialIndex = materialIndex; + + scope.faces.push( face ); + scope.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); + + } + + } + + } + + this.mergeVertices(); + +}; + +THREE.BoxGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.BoxGeometry.prototype.constructor = THREE.BoxGeometry; + +THREE.BoxGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.BoxGeometry( + parameters.width, + parameters.height, + parameters.depth, + parameters.widthSegments, + parameters.heightSegments, + parameters.depthSegments + ); + +}; + +THREE.CubeGeometry = THREE.BoxGeometry; // backwards compatibility + +// File:src/extras/geometries/CircleGeometry.js + +/** + * @author hughes + */ + +THREE.CircleGeometry = function ( radius, segments, thetaStart, thetaLength ) { + + THREE.Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new THREE.CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + +}; + +THREE.CircleGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.CircleGeometry.prototype.constructor = THREE.CircleGeometry; + +THREE.CircleGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.CircleGeometry( + parameters.radius, + parameters.segments, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/CircleBufferGeometry.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + */ + +THREE.CircleBufferGeometry = function ( radius, segments, thetaStart, thetaLength ) { + + THREE.BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + var vertices = segments + 2; + + var positions = new Float32Array( vertices * 3 ); + var normals = new Float32Array( vertices * 3 ); + var uvs = new Float32Array( vertices * 2 ); + + // center data is already zero, but need to set a few extras + normals[ 2 ] = 1.0; + uvs[ 0 ] = 0.5; + uvs[ 1 ] = 0.5; + + for ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) { + + var segment = thetaStart + s / segments * thetaLength; + + positions[ i ] = radius * Math.cos( segment ); + positions[ i + 1 ] = radius * Math.sin( segment ); + + normals[ i + 2 ] = 1; // normal z + + uvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2; + uvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2; + + } + + var indices = []; + + for ( var i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + this.setIndex( new THREE.BufferAttribute( new Uint16Array( indices ), 1 ) ); + this.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) ); + this.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) ); + + this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); + +}; + +THREE.CircleBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.CircleBufferGeometry.prototype.constructor = THREE.CircleBufferGeometry; + +THREE.CircleBufferGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.CircleBufferGeometry( + parameters.radius, + parameters.segments, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/CylinderGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.CylinderGeometry = function ( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + THREE.Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radiusTop = radiusTop !== undefined ? radiusTop : 20; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; + height = height !== undefined ? height : 100; + + radialSegments = radialSegments || 8; + heightSegments = heightSegments || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : 2 * Math.PI; + + var heightHalf = height / 2; + + var x, y, vertices = [], uvs = []; + + for ( y = 0; y <= heightSegments; y ++ ) { + + var verticesRow = []; + var uvsRow = []; + + var v = y / heightSegments; + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var vertex = new THREE.Vector3(); + vertex.x = radius * Math.sin( u * thetaLength + thetaStart ); + vertex.y = - v * height + heightHalf; + vertex.z = radius * Math.cos( u * thetaLength + thetaStart ); + + this.vertices.push( vertex ); + + verticesRow.push( this.vertices.length - 1 ); + uvsRow.push( new THREE.Vector2( u, 1 - v ) ); + + } + + vertices.push( verticesRow ); + uvs.push( uvsRow ); + + } + + var tanTheta = ( radiusBottom - radiusTop ) / height; + var na, nb; + + for ( x = 0; x < radialSegments; x ++ ) { + + if ( radiusTop !== 0 ) { + + na = this.vertices[ vertices[ 0 ][ x ] ].clone(); + nb = this.vertices[ vertices[ 0 ][ x + 1 ] ].clone(); + + } else { + + na = this.vertices[ vertices[ 1 ][ x ] ].clone(); + nb = this.vertices[ vertices[ 1 ][ x + 1 ] ].clone(); + + } + + na.setY( Math.sqrt( na.x * na.x + na.z * na.z ) * tanTheta ).normalize(); + nb.setY( Math.sqrt( nb.x * nb.x + nb.z * nb.z ) * tanTheta ).normalize(); + + for ( y = 0; y < heightSegments; y ++ ) { + + var v1 = vertices[ y ][ x ]; + var v2 = vertices[ y + 1 ][ x ]; + var v3 = vertices[ y + 1 ][ x + 1 ]; + var v4 = vertices[ y ][ x + 1 ]; + + var n1 = na.clone(); + var n2 = na.clone(); + var n3 = nb.clone(); + var n4 = nb.clone(); + + var uv1 = uvs[ y ][ x ].clone(); + var uv2 = uvs[ y + 1 ][ x ].clone(); + var uv3 = uvs[ y + 1 ][ x + 1 ].clone(); + var uv4 = uvs[ y ][ x + 1 ].clone(); + + this.faces.push( new THREE.Face3( v1, v2, v4, [ n1, n2, n4 ] ) ); + this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv4 ] ); + + this.faces.push( new THREE.Face3( v2, v3, v4, [ n2.clone(), n3, n4.clone() ] ) ); + this.faceVertexUvs[ 0 ].push( [ uv2.clone(), uv3, uv4.clone() ] ); + + } + + } + + // top cap + + if ( openEnded === false && radiusTop > 0 ) { + + this.vertices.push( new THREE.Vector3( 0, heightHalf, 0 ) ); + + for ( x = 0; x < radialSegments; x ++ ) { + + var v1 = vertices[ 0 ][ x ]; + var v2 = vertices[ 0 ][ x + 1 ]; + var v3 = this.vertices.length - 1; + + var n1 = new THREE.Vector3( 0, 1, 0 ); + var n2 = new THREE.Vector3( 0, 1, 0 ); + var n3 = new THREE.Vector3( 0, 1, 0 ); + + var uv1 = uvs[ 0 ][ x ].clone(); + var uv2 = uvs[ 0 ][ x + 1 ].clone(); + var uv3 = new THREE.Vector2( uv2.x, 0 ); + + this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ], undefined, 1 ) ); + this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); + + } + + } + + // bottom cap + + if ( openEnded === false && radiusBottom > 0 ) { + + this.vertices.push( new THREE.Vector3( 0, - heightHalf, 0 ) ); + + for ( x = 0; x < radialSegments; x ++ ) { + + var v1 = vertices[ heightSegments ][ x + 1 ]; + var v2 = vertices[ heightSegments ][ x ]; + var v3 = this.vertices.length - 1; + + var n1 = new THREE.Vector3( 0, - 1, 0 ); + var n2 = new THREE.Vector3( 0, - 1, 0 ); + var n3 = new THREE.Vector3( 0, - 1, 0 ); + + var uv1 = uvs[ heightSegments ][ x + 1 ].clone(); + var uv2 = uvs[ heightSegments ][ x ].clone(); + var uv3 = new THREE.Vector2( uv2.x, 1 ); + + this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ], undefined, 2 ) ); + this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); + + } + + } + + this.computeFaceNormals(); + +}; + +THREE.CylinderGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.CylinderGeometry.prototype.constructor = THREE.CylinderGeometry; + +THREE.CylinderGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.CylinderGeometry( + parameters.radiusTop, + parameters.radiusBottom, + parameters.height, + parameters.radialSegments, + parameters.heightSegments, + parameters.openEnded, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/EdgesGeometry.js + +/** + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.EdgesGeometry = function ( geometry, thresholdAngle ) { + + THREE.BufferGeometry.call( this ); + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + var thresholdDot = Math.cos( THREE.Math.degToRad( thresholdAngle ) ); + + var edge = [ 0, 0 ], hash = {}; + + function sortFunction( a, b ) { + + return a - b; + + } + + var keys = [ 'a', 'b', 'c' ]; + + var geometry2; + + if ( geometry instanceof THREE.BufferGeometry ) { + + geometry2 = new THREE.Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var vertices = geometry2.vertices; + var faces = geometry2.faces; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + hash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + hash[ key ].face2 = i; + + } + + } + + } + + var coords = []; + + for ( var key in hash ) { + + var h = hash[ key ]; + + if ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) { + + var vertex = vertices[ h.vert1 ]; + coords.push( vertex.x ); + coords.push( vertex.y ); + coords.push( vertex.z ); + + vertex = vertices[ h.vert2 ]; + coords.push( vertex.x ); + coords.push( vertex.y ); + coords.push( vertex.z ); + + } + + } + + this.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( coords ), 3 ) ); + +}; + +THREE.EdgesGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.EdgesGeometry.prototype.constructor = THREE.EdgesGeometry; + +// File:src/extras/geometries/ExtrudeGeometry.js + +/** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined) + * frames: // containing arrays of tangents, normals, binormals + * + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + +THREE.ExtrudeGeometry = function ( shapes, options ) { + + if ( typeof( shapes ) === "undefined" ) { + + shapes = []; + return; + + } + + THREE.Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + +}; + +THREE.ExtrudeGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.ExtrudeGeometry.prototype.constructor = THREE.ExtrudeGeometry; + +THREE.ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) { + + var sl = shapes.length; + + for ( var s = 0; s < sl; s ++ ) { + + var shape = shapes[ s ]; + this.addShape( shape, options ); + + } + +}; + +THREE.ExtrudeGeometry.prototype.addShape = function ( shape, options ) { + + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var steps = options.steps !== undefined ? options.steps : 1; + + var extrudePath = options.extrudePath; + var extrudePts, extrudeByPath = false; + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator; + + var splineTube, binormal, normal, position2; + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // Reuse TNB from TubeGeomtry for now. + // TODO1 - have a .isClosed in spline? + + splineTube = options.frames !== undefined ? options.frames : new THREE.TubeGeometry.FrenetFrames( extrudePath, steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new THREE.Vector3(); + normal = new THREE.Vector3(); + position2 = new THREE.Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + var scope = this; + + var shapesOffset = this.vertices.length; + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! THREE.ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( THREE.ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! + + } + + + var faces = THREE.ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2 ( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new THREE.Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new THREE.Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * ( 1 - t ); + + //z = bevelThickness * t; + bs = bevelSize * ( Math.sin ( t * Math.PI / 2 ) ); // curved + //bs = bevelSize * t; // linear + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * ( 1 - t ); + //bs = bevelSize * ( 1-Math.sin ( ( 1 - t ) * Math.PI/2 ) ); + bs = bevelSize * Math.sin ( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d, contour, s, sl, j, k ); + + } + + } + + } + + + function v( x, y, z ) { + + scope.vertices.push( new THREE.Vector3( x, y, z ) ); + + } + + function f3( a, b, c ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + + scope.faces.push( new THREE.Face3( a, b, c, null, null, 0 ) ); + + var uvs = uvgen.generateTopUV( scope, a, b, c ); + + scope.faceVertexUvs[ 0 ].push( uvs ); + + } + + function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + d += shapesOffset; + + scope.faces.push( new THREE.Face3( a, b, d, null, null, 1 ) ); + scope.faces.push( new THREE.Face3( b, c, d, null, null, 1 ) ); + + var uvs = uvgen.generateSideWallUV( scope, a, b, c, d ); + + scope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] ); + scope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] ); + + } + +}; + +THREE.ExtrudeGeometry.WorldUVGenerator = { + + generateTopUV: function ( geometry, indexA, indexB, indexC ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + + return [ + new THREE.Vector2( a.x, a.y ), + new THREE.Vector2( b.x, b.y ), + new THREE.Vector2( c.x, c.y ) + ]; + + }, + + generateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + var d = vertices[ indexD ]; + + if ( Math.abs( a.y - b.y ) < 0.01 ) { + + return [ + new THREE.Vector2( a.x, 1 - a.z ), + new THREE.Vector2( b.x, 1 - b.z ), + new THREE.Vector2( c.x, 1 - c.z ), + new THREE.Vector2( d.x, 1 - d.z ) + ]; + + } else { + + return [ + new THREE.Vector2( a.y, 1 - a.z ), + new THREE.Vector2( b.y, 1 - b.z ), + new THREE.Vector2( c.y, 1 - c.z ), + new THREE.Vector2( d.y, 1 - d.z ) + ]; + + } + + } +}; + +// File:src/extras/geometries/ShapeGeometry.js + +/** + * @author jonobr1 / http://jonobr1.com + * + * Creates a one-sided polygonal geometry from a path shape. Similar to + * ExtrudeGeometry. + * + * parameters = { + * + * curveSegments: , // number of points on the curves. NOT USED AT THE MOMENT. + * + * material: // material index for front and back faces + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + +THREE.ShapeGeometry = function ( shapes, options ) { + + THREE.Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( Array.isArray( shapes ) === false ) shapes = [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + +}; + +THREE.ShapeGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.ShapeGeometry.prototype.constructor = THREE.ShapeGeometry; + +/** + * Add an array of shapes to THREE.ShapeGeometry. + */ +THREE.ShapeGeometry.prototype.addShapeList = function ( shapes, options ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + this.addShape( shapes[ i ], options ); + + } + + return this; + +}; + +/** + * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry. + */ +THREE.ShapeGeometry.prototype.addShape = function ( shape, options ) { + + if ( options === undefined ) options = {}; + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var material = options.material; + var uvgen = options.UVGenerator === undefined ? THREE.ExtrudeGeometry.WorldUVGenerator : options.UVGenerator; + + // + + var i, l, hole; + + var shapesOffset = this.vertices.length; + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! THREE.ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe... + + for ( i = 0, l = holes.length; i < l; i ++ ) { + + hole = holes[ i ]; + + if ( THREE.ShapeUtils.isClockWise( hole ) ) { + + holes[ i ] = hole.reverse(); + + } + + } + + reverse = false; + + } + + var faces = THREE.ShapeUtils.triangulateShape( vertices, holes ); + + // Vertices + + for ( i = 0, l = holes.length; i < l; i ++ ) { + + hole = holes[ i ]; + vertices = vertices.concat( hole ); + + } + + // + + var vert, vlen = vertices.length; + var face, flen = faces.length; + + for ( i = 0; i < vlen; i ++ ) { + + vert = vertices[ i ]; + + this.vertices.push( new THREE.Vector3( vert.x, vert.y, 0 ) ); + + } + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + + var a = face[ 0 ] + shapesOffset; + var b = face[ 1 ] + shapesOffset; + var c = face[ 2 ] + shapesOffset; + + this.faces.push( new THREE.Face3( a, b, c, null, null, material ) ); + this.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) ); + + } + +}; + +// File:src/extras/geometries/LatheGeometry.js + +/** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + */ + +// points - to create a closed torus, one must use a set of points +// like so: [ a, b, c, d, a ], see first is the same as last. +// segments - the number of circumference segments to create +// phiStart - the starting radian +// phiLength - the radian (0 to 2*PI) range of the lathed section +// 2*pi is a closed lathe, less than 2PI is a portion. + +THREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) { + + THREE.Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = segments || 12; + phiStart = phiStart || 0; + phiLength = phiLength || 2 * Math.PI; + + var inversePointLength = 1.0 / ( points.length - 1 ); + var inverseSegments = 1.0 / segments; + + for ( var i = 0, il = segments; i <= il; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var c = Math.cos( phi ), + s = Math.sin( phi ); + + for ( var j = 0, jl = points.length; j < jl; j ++ ) { + + var pt = points[ j ]; + + var vertex = new THREE.Vector3(); + + vertex.x = c * pt.x - s * pt.y; + vertex.y = s * pt.x + c * pt.y; + vertex.z = pt.z; + + this.vertices.push( vertex ); + + } + + } + + var np = points.length; + + for ( var i = 0, il = segments; i < il; i ++ ) { + + for ( var j = 0, jl = points.length - 1; j < jl; j ++ ) { + + var base = j + np * i; + var a = base; + var b = base + np; + var c = base + 1 + np; + var d = base + 1; + + var u0 = i * inverseSegments; + var v0 = j * inversePointLength; + var u1 = u0 + inverseSegments; + var v1 = v0 + inversePointLength; + + this.faces.push( new THREE.Face3( a, b, d ) ); + + this.faceVertexUvs[ 0 ].push( [ + + new THREE.Vector2( u0, v0 ), + new THREE.Vector2( u1, v0 ), + new THREE.Vector2( u0, v1 ) + + ] ); + + this.faces.push( new THREE.Face3( b, c, d ) ); + + this.faceVertexUvs[ 0 ].push( [ + + new THREE.Vector2( u1, v0 ), + new THREE.Vector2( u1, v1 ), + new THREE.Vector2( u0, v1 ) + + ] ); + + + } + + } + + this.mergeVertices(); + this.computeFaceNormals(); + this.computeVertexNormals(); + +}; + +THREE.LatheGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.LatheGeometry.prototype.constructor = THREE.LatheGeometry; + +// File:src/extras/geometries/PlaneGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + +THREE.PlaneGeometry = function ( width, height, widthSegments, heightSegments ) { + + THREE.Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new THREE.PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + +}; + +THREE.PlaneGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.PlaneGeometry.prototype.constructor = THREE.PlaneGeometry; + +THREE.PlaneGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.PlaneGeometry( + parameters.width, + parameters.height, + parameters.widthSegments, + parameters.heightSegments + ); + +}; + +// File:src/extras/geometries/PlaneBufferGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + +THREE.PlaneBufferGeometry = function ( width, height, widthSegments, heightSegments ) { + + THREE.BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var vertices = new Float32Array( gridX1 * gridY1 * 3 ); + var normals = new Float32Array( gridX1 * gridY1 * 3 ); + var uvs = new Float32Array( gridX1 * gridY1 * 2 ); + + var offset = 0; + var offset2 = 0; + + for ( var iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( var ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices[ offset ] = x; + vertices[ offset + 1 ] = - y; + + normals[ offset + 2 ] = 1; + + uvs[ offset2 ] = ix / gridX; + uvs[ offset2 + 1 ] = 1 - ( iy / gridY ); + + offset += 3; + offset2 += 2; + + } + + } + + offset = 0; + + var indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 ); + + for ( var iy = 0; iy < gridY; iy ++ ) { + + for ( var ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + indices[ offset ] = a; + indices[ offset + 1 ] = b; + indices[ offset + 2 ] = d; + + indices[ offset + 3 ] = b; + indices[ offset + 4 ] = c; + indices[ offset + 5 ] = d; + + offset += 6; + + } + + } + + this.setIndex( new THREE.BufferAttribute( indices, 1 ) ); + this.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) ); + +}; + +THREE.PlaneBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.PlaneBufferGeometry.prototype.constructor = THREE.PlaneBufferGeometry; + +THREE.PlaneBufferGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.PlaneBufferGeometry( + parameters.width, + parameters.height, + parameters.widthSegments, + parameters.heightSegments + ); + +}; + +// File:src/extras/geometries/RingGeometry.js + +/** + * @author Kaleb Murphy + */ + +THREE.RingGeometry = function ( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + THREE.Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 0; + outerRadius = outerRadius || 50; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 8; + + var i, o, uvs = [], radius = innerRadius, radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + + for ( i = 0; i < phiSegments + 1; i ++ ) { + + // concentric circles inside ring + + for ( o = 0; o < thetaSegments + 1; o ++ ) { + + // number of segments per circle + + var vertex = new THREE.Vector3(); + var segment = thetaStart + o / thetaSegments * thetaLength; + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + + this.vertices.push( vertex ); + uvs.push( new THREE.Vector2( ( vertex.x / outerRadius + 1 ) / 2, ( vertex.y / outerRadius + 1 ) / 2 ) ); + + } + + radius += radiusStep; + + } + + var n = new THREE.Vector3( 0, 0, 1 ); + + for ( i = 0; i < phiSegments; i ++ ) { + + // concentric circles inside ring + + var thetaSegment = i * ( thetaSegments + 1 ); + + for ( o = 0; o < thetaSegments ; o ++ ) { + + // number of segments per circle + + var segment = o + thetaSegment; + + var v1 = segment; + var v2 = segment + thetaSegments + 1; + var v3 = segment + thetaSegments + 2; + + this.faces.push( new THREE.Face3( v1, v2, v3, [ n.clone(), n.clone(), n.clone() ] ) ); + this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ].clone(), uvs[ v2 ].clone(), uvs[ v3 ].clone() ] ); + + v1 = segment; + v2 = segment + thetaSegments + 2; + v3 = segment + 1; + + this.faces.push( new THREE.Face3( v1, v2, v3, [ n.clone(), n.clone(), n.clone() ] ) ); + this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ].clone(), uvs[ v2 ].clone(), uvs[ v3 ].clone() ] ); + + } + + } + + this.computeFaceNormals(); + + this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); + +}; + +THREE.RingGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.RingGeometry.prototype.constructor = THREE.RingGeometry; + +THREE.RingGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.RingGeometry( + parameters.innerRadius, + parameters.outerRadius, + parameters.thetaSegments, + parameters.phiSegments, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/SphereGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.SphereGeometry = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + THREE.Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new THREE.SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + +}; + +THREE.SphereGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.SphereGeometry.prototype.constructor = THREE.SphereGeometry; + +THREE.SphereGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.SphereGeometry( + parameters.radius, + parameters.widthSegments, + parameters.heightSegments, + parameters.phiStart, + parameters.phiLength, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/SphereBufferGeometry.js + +/** + * @author benaadams / https://twitter.com/ben_a_adams + * based on THREE.SphereGeometry + */ + +THREE.SphereBufferGeometry = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + THREE.BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) ); + + var positions = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new THREE.BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new THREE.BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + var index = 0, vertices = [], normal = new THREE.Vector3(); + + for ( var y = 0; y <= heightSegments; y ++ ) { + + var verticesRow = []; + + var v = y / heightSegments; + + for ( var x = 0; x <= widthSegments; x ++ ) { + + var u = x / widthSegments; + + var px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + var py = radius * Math.cos( thetaStart + v * thetaLength ); + var pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + normal.set( px, py, pz ).normalize(); + + positions.setXYZ( index, px, py, pz ); + normals.setXYZ( index, normal.x, normal.y, normal.z ); + uvs.setXY( index, u, 1 - v ); + + verticesRow.push( index ); + + index ++; + + } + + vertices.push( verticesRow ); + + } + + var indices = []; + + for ( var y = 0; y < heightSegments; y ++ ) { + + for ( var x = 0; x < widthSegments; x ++ ) { + + var v1 = vertices[ y ][ x + 1 ]; + var v2 = vertices[ y ][ x ]; + var v3 = vertices[ y + 1 ][ x ]; + var v4 = vertices[ y + 1 ][ x + 1 ]; + + if ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 ); + if ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 ); + + } + + } + + this.setIndex( new ( positions.count > 65535 ? THREE.Uint32Attribute : THREE.Uint16Attribute )( indices, 1 ) ); + this.addAttribute( 'position', positions ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); + +}; + +THREE.SphereBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.SphereBufferGeometry.prototype.constructor = THREE.SphereBufferGeometry; + +THREE.SphereBufferGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.SphereBufferGeometry( + parameters.radius, + parameters.widthSegments, + parameters.heightSegments, + parameters.phiStart, + parameters.phiLength, + parameters.thetaStart, + parameters.thetaLength + ); + +}; + +// File:src/extras/geometries/TorusGeometry.js + +/** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888 + */ + +THREE.TorusGeometry = function ( radius, tube, radialSegments, tubularSegments, arc ) { + + THREE.Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = radialSegments || 8; + tubularSegments = tubularSegments || 6; + arc = arc || Math.PI * 2; + + var center = new THREE.Vector3(), uvs = [], normals = []; + + for ( var j = 0; j <= radialSegments; j ++ ) { + + for ( var i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + + var vertex = new THREE.Vector3(); + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + this.vertices.push( vertex ); + + uvs.push( new THREE.Vector2( i / tubularSegments, j / radialSegments ) ); + normals.push( vertex.clone().sub( center ).normalize() ); + + } + + } + + for ( var j = 1; j <= radialSegments; j ++ ) { + + for ( var i = 1; i <= tubularSegments; i ++ ) { + + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + var face = new THREE.Face3( a, b, d, [ normals[ a ].clone(), normals[ b ].clone(), normals[ d ].clone() ] ); + this.faces.push( face ); + this.faceVertexUvs[ 0 ].push( [ uvs[ a ].clone(), uvs[ b ].clone(), uvs[ d ].clone() ] ); + + face = new THREE.Face3( b, c, d, [ normals[ b ].clone(), normals[ c ].clone(), normals[ d ].clone() ] ); + this.faces.push( face ); + this.faceVertexUvs[ 0 ].push( [ uvs[ b ].clone(), uvs[ c ].clone(), uvs[ d ].clone() ] ); + + } + + } + + this.computeFaceNormals(); + +}; + +THREE.TorusGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.TorusGeometry.prototype.constructor = THREE.TorusGeometry; + +THREE.TorusGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.TorusGeometry( + parameters.radius, + parameters.tube, + parameters.radialSegments, + parameters.tubularSegments, + parameters.arc + ); + +}; + +// File:src/extras/geometries/TorusKnotGeometry.js + +/** + * @author oosmoxiecode + * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473 + */ + +THREE.TorusKnotGeometry = function ( radius, tube, radialSegments, tubularSegments, p, q, heightScale ) { + + THREE.Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + p: p, + q: q, + heightScale: heightScale + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = radialSegments || 64; + tubularSegments = tubularSegments || 8; + p = p || 2; + q = q || 3; + heightScale = heightScale || 1; + + var grid = new Array( radialSegments ); + var tang = new THREE.Vector3(); + var n = new THREE.Vector3(); + var bitan = new THREE.Vector3(); + + for ( var i = 0; i < radialSegments; ++ i ) { + + grid[ i ] = new Array( tubularSegments ); + var u = i / radialSegments * 2 * p * Math.PI; + var p1 = getPos( u, q, p, radius, heightScale ); + var p2 = getPos( u + 0.01, q, p, radius, heightScale ); + tang.subVectors( p2, p1 ); + n.addVectors( p2, p1 ); + + bitan.crossVectors( tang, n ); + n.crossVectors( bitan, tang ); + bitan.normalize(); + n.normalize(); + + for ( var j = 0; j < tubularSegments; ++ j ) { + + var v = j / tubularSegments * 2 * Math.PI; + var cx = - tube * Math.cos( v ); // TODO: Hack: Negating it so it faces outside. + var cy = tube * Math.sin( v ); + + var pos = new THREE.Vector3(); + pos.x = p1.x + cx * n.x + cy * bitan.x; + pos.y = p1.y + cx * n.y + cy * bitan.y; + pos.z = p1.z + cx * n.z + cy * bitan.z; + + grid[ i ][ j ] = this.vertices.push( pos ) - 1; + + } + + } + + for ( var i = 0; i < radialSegments; ++ i ) { + + for ( var j = 0; j < tubularSegments; ++ j ) { + + var ip = ( i + 1 ) % radialSegments; + var jp = ( j + 1 ) % tubularSegments; + + var a = grid[ i ][ j ]; + var b = grid[ ip ][ j ]; + var c = grid[ ip ][ jp ]; + var d = grid[ i ][ jp ]; + + var uva = new THREE.Vector2( i / radialSegments, j / tubularSegments ); + var uvb = new THREE.Vector2( ( i + 1 ) / radialSegments, j / tubularSegments ); + var uvc = new THREE.Vector2( ( i + 1 ) / radialSegments, ( j + 1 ) / tubularSegments ); + var uvd = new THREE.Vector2( i / radialSegments, ( j + 1 ) / tubularSegments ); + + this.faces.push( new THREE.Face3( a, b, d ) ); + this.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); + + this.faces.push( new THREE.Face3( b, c, d ) ); + this.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); + + } + + } + + this.computeFaceNormals(); + this.computeVertexNormals(); + + function getPos( u, in_q, in_p, radius, heightScale ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = in_q / in_p * u; + var cs = Math.cos( quOverP ); + + var tx = radius * ( 2 + cs ) * 0.5 * cu; + var ty = radius * ( 2 + cs ) * su * 0.5; + var tz = heightScale * radius * Math.sin( quOverP ) * 0.5; + + return new THREE.Vector3( tx, ty, tz ); + + } + +}; + +THREE.TorusKnotGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.TorusKnotGeometry.prototype.constructor = THREE.TorusKnotGeometry; + +THREE.TorusKnotGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.TorusKnotGeometry( + parameters.radius, + parameters.tube, + parameters.radialSegments, + parameters.tubularSegments, + parameters.p, + parameters.q, + parameters.heightScale + ); + +}; + +// File:src/extras/geometries/TubeGeometry.js + +/** + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * + * Modified from the TorusKnotGeometry by @oosmoxiecode + * + * Creates a tube which extrudes along a 3d spline + * + * Uses parallel transport frames as described in + * http://www.cs.indiana.edu/pub/techreports/TR425.pdf + */ + +THREE.TubeGeometry = function ( path, segments, radius, radialSegments, closed, taper ) { + + THREE.Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + segments: segments, + radius: radius, + radialSegments: radialSegments, + closed: closed, + taper: taper + }; + + segments = segments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + taper = taper || THREE.TubeGeometry.NoTaper; + + var grid = []; + + var scope = this, + + tangent, + normal, + binormal, + + numpoints = segments + 1, + + u, v, r, + + cx, cy, + pos, pos2 = new THREE.Vector3(), + i, j, + ip, jp, + a, b, c, d, + uva, uvb, uvc, uvd; + + var frames = new THREE.TubeGeometry.FrenetFrames( path, segments, closed ), + tangents = frames.tangents, + normals = frames.normals, + binormals = frames.binormals; + + // proxy internals + this.tangents = tangents; + this.normals = normals; + this.binormals = binormals; + + function vert( x, y, z ) { + + return scope.vertices.push( new THREE.Vector3( x, y, z ) ) - 1; + + } + + // construct the grid + + for ( i = 0; i < numpoints; i ++ ) { + + grid[ i ] = []; + + u = i / ( numpoints - 1 ); + + pos = path.getPointAt( u ); + + tangent = tangents[ i ]; + normal = normals[ i ]; + binormal = binormals[ i ]; + + r = radius * taper( u ); + + for ( j = 0; j < radialSegments; j ++ ) { + + v = j / radialSegments * 2 * Math.PI; + + cx = - r * Math.cos( v ); // TODO: Hack: Negating it so it faces outside. + cy = r * Math.sin( v ); + + pos2.copy( pos ); + pos2.x += cx * normal.x + cy * binormal.x; + pos2.y += cx * normal.y + cy * binormal.y; + pos2.z += cx * normal.z + cy * binormal.z; + + grid[ i ][ j ] = vert( pos2.x, pos2.y, pos2.z ); + + } + + } + + + // construct the mesh + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < radialSegments; j ++ ) { + + ip = ( closed ) ? ( i + 1 ) % segments : i + 1; + jp = ( j + 1 ) % radialSegments; + + a = grid[ i ][ j ]; // *** NOT NECESSARILY PLANAR ! *** + b = grid[ ip ][ j ]; + c = grid[ ip ][ jp ]; + d = grid[ i ][ jp ]; + + uva = new THREE.Vector2( i / segments, j / radialSegments ); + uvb = new THREE.Vector2( ( i + 1 ) / segments, j / radialSegments ); + uvc = new THREE.Vector2( ( i + 1 ) / segments, ( j + 1 ) / radialSegments ); + uvd = new THREE.Vector2( i / segments, ( j + 1 ) / radialSegments ); + + this.faces.push( new THREE.Face3( a, b, d ) ); + this.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); + + this.faces.push( new THREE.Face3( b, c, d ) ); + this.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); + + } + + } + + this.computeFaceNormals(); + this.computeVertexNormals(); + +}; + +THREE.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.TubeGeometry.prototype.constructor = THREE.TubeGeometry; +THREE.TubeGeometry.prototype.clone = function() { + + return new this.constructor( this.parameters.path, + this.parameters.segments, this.parameters.radius, this.parameters.radialSegments, + this.parameters.closed, this.parameters.taper + ); + +}; + +THREE.TubeGeometry.NoTaper = function ( u ) { + + return 1; + +}; + +THREE.TubeGeometry.SinusoidalTaper = function ( u ) { + + return Math.sin( Math.PI * u ); + +}; + +// For computing of Frenet frames, exposing the tangents, normals and binormals the spline +THREE.TubeGeometry.FrenetFrames = function ( path, segments, closed ) { + + var normal = new THREE.Vector3(), + + tangents = [], + normals = [], + binormals = [], + + vec = new THREE.Vector3(), + mat = new THREE.Matrix4(), + + numpoints = segments + 1, + theta, + smallest, + + tx, ty, tz, + i, u; + + + // expose internals + this.tangents = tangents; + this.normals = normals; + this.binormals = binormals; + + // compute the tangent vectors for each segment on the path + + for ( i = 0; i < numpoints; i ++ ) { + + u = i / ( numpoints - 1 ); + + tangents[ i ] = path.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + initialNormal3(); + + /* + function initialNormal1(lastBinormal) { + // fixed start binormal. Has dangers of 0 vectors + normals[ 0 ] = new THREE.Vector3(); + binormals[ 0 ] = new THREE.Vector3(); + if (lastBinormal===undefined) lastBinormal = new THREE.Vector3( 0, 0, 1 ); + normals[ 0 ].crossVectors( lastBinormal, tangents[ 0 ] ).normalize(); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize(); + } + + function initialNormal2() { + + // This uses the Frenet-Serret formula for deriving binormal + var t2 = path.getTangentAt( epsilon ); + + normals[ 0 ] = new THREE.Vector3().subVectors( t2, tangents[ 0 ] ).normalize(); + binormals[ 0 ] = new THREE.Vector3().crossVectors( tangents[ 0 ], normals[ 0 ] ); + + normals[ 0 ].crossVectors( binormals[ 0 ], tangents[ 0 ] ).normalize(); // last binormal x tangent + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize(); + + } + */ + + function initialNormal3() { + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the smallest tangent xyz component + + normals[ 0 ] = new THREE.Vector3(); + binormals[ 0 ] = new THREE.Vector3(); + smallest = Number.MAX_VALUE; + tx = Math.abs( tangents[ 0 ].x ); + ty = Math.abs( tangents[ 0 ].y ); + tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= smallest ) { + + smallest = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= smallest ) { + + smallest = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= smallest ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + } + + + // compute the slowly-varying normal and binormal vectors for each segment on the path + + for ( i = 1; i < numpoints; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( THREE.Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed ) { + + theta = Math.acos( THREE.Math.clamp( normals[ 0 ].dot( normals[ numpoints - 1 ] ), - 1, 1 ) ); + theta /= ( numpoints - 1 ); + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ numpoints - 1 ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i < numpoints; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + +}; + +// File:src/extras/geometries/PolyhedronGeometry.js + +/** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.PolyhedronGeometry = function ( vertices, indices, radius, detail ) { + + THREE.Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + var that = this; + + for ( var i = 0, l = vertices.length; i < l; i += 3 ) { + + prepare( new THREE.Vector3( vertices[ i ], vertices[ i + 1 ], vertices[ i + 2 ] ) ); + + } + + var p = this.vertices; + + var faces = []; + + for ( var i = 0, j = 0, l = indices.length; i < l; i += 3, j ++ ) { + + var v1 = p[ indices[ i ] ]; + var v2 = p[ indices[ i + 1 ] ]; + var v3 = p[ indices[ i + 2 ] ]; + + faces[ j ] = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ], undefined, j ); + + } + + var centroid = new THREE.Vector3(); + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + subdivide( faces[ i ], detail ); + + } + + + // Handle case when face straddles the seam + + for ( var i = 0, l = this.faceVertexUvs[ 0 ].length; i < l; i ++ ) { + + var uvs = this.faceVertexUvs[ 0 ][ i ]; + + var x0 = uvs[ 0 ].x; + var x1 = uvs[ 1 ].x; + var x2 = uvs[ 2 ].x; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + if ( max > 0.9 && min < 0.1 ) { + + // 0.9 is somewhat arbitrary + + if ( x0 < 0.2 ) uvs[ 0 ].x += 1; + if ( x1 < 0.2 ) uvs[ 1 ].x += 1; + if ( x2 < 0.2 ) uvs[ 2 ].x += 1; + + } + + } + + + // Apply radius + + for ( var i = 0, l = this.vertices.length; i < l; i ++ ) { + + this.vertices[ i ].multiplyScalar( radius ); + + } + + + // Merge vertices + + this.mergeVertices(); + + this.computeFaceNormals(); + + this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); + + + // Project vector onto sphere's surface + + function prepare( vector ) { + + var vertex = vector.normalize().clone(); + vertex.index = that.vertices.push( vertex ) - 1; + + // Texture coords are equivalent to map coords, calculate angle and convert to fraction of a circle. + + var u = azimuth( vector ) / 2 / Math.PI + 0.5; + var v = inclination( vector ) / Math.PI + 0.5; + vertex.uv = new THREE.Vector2( u, 1 - v ); + + return vertex; + + } + + + // Approximate a curved face with recursively sub-divided triangles. + + function make( v1, v2, v3, materialIndex ) { + + var face = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ], undefined, materialIndex ); + that.faces.push( face ); + + centroid.copy( v1 ).add( v2 ).add( v3 ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + that.faceVertexUvs[ 0 ].push( [ + correctUV( v1.uv, v1, azi ), + correctUV( v2.uv, v2, azi ), + correctUV( v3.uv, v3, azi ) + ] ); + + } + + + // Analytically subdivide a face to the required detail level. + + function subdivide( face, detail ) { + + var cols = Math.pow( 2, detail ); + var a = prepare( that.vertices[ face.a ] ); + var b = prepare( that.vertices[ face.b ] ); + var c = prepare( that.vertices[ face.c ] ); + var v = []; + + var materialIndex = face.materialIndex; + + // Construct all of the vertices for this subdivision. + + for ( var i = 0 ; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = prepare( a.clone().lerp( c, i / cols ) ); + var bj = prepare( b.clone().lerp( c, i / cols ) ); + var rows = cols - i; + + for ( var j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = prepare( aj.clone().lerp( bj, j / rows ) ); + + } + + } + + } + + // Construct all of the faces. + + for ( var i = 0; i < cols ; i ++ ) { + + for ( var j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + make( + v[ i ][ k + 1 ], + v[ i + 1 ][ k ], + v[ i ][ k ], + materialIndex + ); + + } else { + + make( + v[ i ][ k + 1 ], + v[ i + 1 ][ k + 1 ], + v[ i + 1 ][ k ], + materialIndex + ); + + } + + } + + } + + } + + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + + // Texture fixing helper. Spheres have some odd behaviours. + + function correctUV( uv, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) uv = new THREE.Vector2( uv.x - 1, uv.y ); + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) uv = new THREE.Vector2( azimuth / 2 / Math.PI + 0.5, uv.y ); + return uv.clone(); + + } + + +}; + +THREE.PolyhedronGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.PolyhedronGeometry.prototype.constructor = THREE.PolyhedronGeometry; + +THREE.PolyhedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.PolyhedronGeometry( + parameters.vertices, + parameters.indices, + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/DodecahedronGeometry.js + +/** + * @author Abe Pazos / https://hamoid.com + */ + +THREE.DodecahedronGeometry = function ( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±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, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + THREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +}; + +THREE.DodecahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype ); +THREE.DodecahedronGeometry.prototype.constructor = THREE.DodecahedronGeometry; + +THREE.DodecahedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.DodecahedronGeometry( + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/IcosahedronGeometry.js + +/** + * @author timothypratley / https://github.com/timothypratley + */ + +THREE.IcosahedronGeometry = function ( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + THREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +}; + +THREE.IcosahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype ); +THREE.IcosahedronGeometry.prototype.constructor = THREE.IcosahedronGeometry; + +THREE.IcosahedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.IcosahedronGeometry( + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/OctahedronGeometry.js + +/** + * @author timothypratley / https://github.com/timothypratley + */ + +THREE.OctahedronGeometry = function ( radius, detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 + ]; + + THREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +}; + +THREE.OctahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype ); +THREE.OctahedronGeometry.prototype.constructor = THREE.OctahedronGeometry; + +THREE.OctahedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.OctahedronGeometry( + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/TetrahedronGeometry.js + +/** + * @author timothypratley / https://github.com/timothypratley + */ + +THREE.TetrahedronGeometry = function ( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + THREE.PolyhedronGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + +}; + +THREE.TetrahedronGeometry.prototype = Object.create( THREE.PolyhedronGeometry.prototype ); +THREE.TetrahedronGeometry.prototype.constructor = THREE.TetrahedronGeometry; + +THREE.TetrahedronGeometry.prototype.clone = function () { + + var parameters = this.parameters; + + return new THREE.TetrahedronGeometry( + parameters.radius, + parameters.detail + ); + +}; + +// File:src/extras/geometries/ParametricGeometry.js + +/** + * @author zz85 / https://github.com/zz85 + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + * + * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements ); + * + */ + +THREE.ParametricGeometry = function ( func, slices, stacks ) { + + THREE.Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + var verts = this.vertices; + var faces = this.faces; + var uvs = this.faceVertexUvs[ 0 ]; + + var i, j, p; + var u, v; + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + u = j / slices; + + p = func( u, v ); + verts.push( p ); + + } + + } + + var a, b, c, d; + var uva, uvb, uvc, uvd; + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + a = i * sliceCount + j; + b = i * sliceCount + j + 1; + c = ( i + 1 ) * sliceCount + j + 1; + d = ( i + 1 ) * sliceCount + j; + + uva = new THREE.Vector2( j / slices, i / stacks ); + uvb = new THREE.Vector2( ( j + 1 ) / slices, i / stacks ); + uvc = new THREE.Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks ); + uvd = new THREE.Vector2( j / slices, ( i + 1 ) / stacks ); + + faces.push( new THREE.Face3( a, b, d ) ); + uvs.push( [ uva, uvb, uvd ] ); + + faces.push( new THREE.Face3( b, c, d ) ); + uvs.push( [ uvb.clone(), uvc, uvd.clone() ] ); + + } + + } + + // console.log(this); + + // magic bullet + // var diff = this.mergeVertices(); + // console.log('removed ', diff, ' vertices by merging'); + + this.computeFaceNormals(); + this.computeVertexNormals(); + +}; + +THREE.ParametricGeometry.prototype = Object.create( THREE.Geometry.prototype ); +THREE.ParametricGeometry.prototype.constructor = THREE.ParametricGeometry; + +// File:src/extras/geometries/WireframeGeometry.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.WireframeGeometry = function ( geometry ) { + + THREE.BufferGeometry.call( this ); + + var edge = [ 0, 0 ], hash = {}; + + function sortFunction( a, b ) { + + return a - b; + + } + + var keys = [ 'a', 'b', 'c' ]; + + if ( geometry instanceof THREE.Geometry ) { + + var vertices = geometry.vertices; + var faces = geometry.faces; + var numEdges = 0; + + // allocate maximal size + var edges = new Uint32Array( 6 * faces.length ); + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + edges[ 2 * numEdges ] = edge[ 0 ]; + edges[ 2 * numEdges + 1 ] = edge[ 1 ]; + hash[ key ] = true; + numEdges ++; + + } + + } + + } + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numEdges; i < l; i ++ ) { + + for ( var j = 0; j < 2; j ++ ) { + + var vertex = vertices[ edges [ 2 * i + j ] ]; + + var index = 6 * i + 3 * j; + coords[ index + 0 ] = vertex.x; + coords[ index + 1 ] = vertex.y; + coords[ index + 2 ] = vertex.z; + + } + + } + + this.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) ); + + } else if ( geometry instanceof THREE.BufferGeometry ) { + + if ( geometry.index !== null ) { + + // Indexed BufferGeometry + + var indices = geometry.index.array; + var vertices = geometry.attributes.position; + var drawcalls = geometry.drawcalls; + var numEdges = 0; + + if ( drawcalls.length === 0 ) { + + geometry.addGroup( 0, indices.length ); + + } + + // allocate maximal size + var edges = new Uint32Array( 2 * indices.length ); + + for ( var o = 0, ol = drawcalls.length; o < ol; ++ o ) { + + var drawcall = drawcalls[ o ]; + + var start = drawcall.start; + var count = drawcall.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = indices[ i + j ]; + edge[ 1 ] = indices[ i + ( j + 1 ) % 3 ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + edges[ 2 * numEdges ] = edge[ 0 ]; + edges[ 2 * numEdges + 1 ] = edge[ 1 ]; + hash[ key ] = true; + numEdges ++; + + } + + } + + } + + } + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numEdges; i < l; i ++ ) { + + for ( var j = 0; j < 2; j ++ ) { + + var index = 6 * i + 3 * j; + var index2 = edges[ 2 * i + j ]; + + coords[ index + 0 ] = vertices.getX( index2 ); + coords[ index + 1 ] = vertices.getY( index2 ); + coords[ index + 2 ] = vertices.getZ( index2 ); + + } + + } + + this.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) ); + + } else { + + // non-indexed BufferGeometry + + var vertices = geometry.attributes.position.array; + var numEdges = vertices.length / 3; + var numTris = numEdges / 3; + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numTris; i < l; i ++ ) { + + for ( var j = 0; j < 3; j ++ ) { + + var index = 18 * i + 6 * j; + + var index1 = 9 * i + 3 * j; + coords[ index + 0 ] = vertices[ index1 ]; + coords[ index + 1 ] = vertices[ index1 + 1 ]; + coords[ index + 2 ] = vertices[ index1 + 2 ]; + + var index2 = 9 * i + 3 * ( ( j + 1 ) % 3 ); + coords[ index + 3 ] = vertices[ index2 ]; + coords[ index + 4 ] = vertices[ index2 + 1 ]; + coords[ index + 5 ] = vertices[ index2 + 2 ]; + + } + + } + + this.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) ); + + } + + } + +}; + +THREE.WireframeGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); +THREE.WireframeGeometry.prototype.constructor = THREE.WireframeGeometry; + +// File:src/extras/helpers/AxisHelper.js + +/** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.AxisHelper = function ( size ) { + + size = size || 1; + + var vertices = new Float32Array( [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ] ); + + var colors = new Float32Array( [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ] ); + + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ) ); + + var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } ); + + THREE.LineSegments.call( this, geometry, material ); + +}; + +THREE.AxisHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.AxisHelper.prototype.constructor = THREE.AxisHelper; + +// File:src/extras/helpers/ArrowHelper.js + +/** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + +THREE.ArrowHelper = ( function () { + + var lineGeometry = new THREE.Geometry(); + lineGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 1, 0 ) ); + + var coneGeometry = new THREE.CylinderGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + return function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + THREE.Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.position.copy( origin ); + + if ( headLength < length ) { + this.line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + } + + this.cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + +}() ); + +THREE.ArrowHelper.prototype = Object.create( THREE.Object3D.prototype ); +THREE.ArrowHelper.prototype.constructor = THREE.ArrowHelper; + +THREE.ArrowHelper.prototype.setDirection = ( function () { + + var axis = new THREE.Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + +}() ); + +THREE.ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + if ( headLength < length ){ + this.line.scale.set( 1, length - headLength, 1 ); + this.line.updateMatrix(); + } + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + +}; + +THREE.ArrowHelper.prototype.setColor = function ( color ) { + + if ( this.line !== undefined ) this.line.material.color.set( color ); + this.cone.material.color.set( color ); + +}; + +// File:src/extras/helpers/BoxHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.BoxHelper = function ( object ) { + + var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new THREE.BufferGeometry(); + geometry.setIndex( new THREE.BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) ); + + THREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: 0xffff00 } ) ); + + if ( object !== undefined ) { + + this.update( object ); + + } + +}; + +THREE.BoxHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.BoxHelper.prototype.constructor = THREE.BoxHelper; + +THREE.BoxHelper.prototype.update = ( function () { + + var box = new THREE.Box3(); + + return function ( object ) { + + box.setFromObject( object ); + + if ( box.empty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + } + +} )(); + +// File:src/extras/helpers/BoundingBoxHelper.js + +/** + * @author WestLangley / http://github.com/WestLangley + */ + +// a helper to show the world-axis-aligned bounding box for an object + +THREE.BoundingBoxHelper = function ( object, hex ) { + + var color = ( hex !== undefined ) ? hex : 0x888888; + + this.object = object; + + this.box = new THREE.Box3(); + + THREE.Mesh.call( this, new THREE.BoxGeometry( 1, 1, 1 ), new THREE.MeshBasicMaterial( { color: color, wireframe: true } ) ); + +}; + +THREE.BoundingBoxHelper.prototype = Object.create( THREE.Mesh.prototype ); +THREE.BoundingBoxHelper.prototype.constructor = THREE.BoundingBoxHelper; + +THREE.BoundingBoxHelper.prototype.update = function () { + + this.box.setFromObject( this.object ); + + this.box.size( this.scale ); + + this.box.center( this.position ); + +}; + +// File:src/extras/helpers/CameraHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + +THREE.CameraHelper = function ( camera ) { + + var geometry = new THREE.Geometry(); + var material = new THREE.LineBasicMaterial( { color: 0xffffff, vertexColors: THREE.FaceColors } ); + + var pointMap = {}; + + // colors + + var hexFrustum = 0xffaa00; + var hexCone = 0xff0000; + var hexUp = 0x00aaff; + var hexTarget = 0xffffff; + var hexCross = 0x333333; + + // near + + addLine( "n1", "n2", hexFrustum ); + addLine( "n2", "n4", hexFrustum ); + addLine( "n4", "n3", hexFrustum ); + addLine( "n3", "n1", hexFrustum ); + + // far + + addLine( "f1", "f2", hexFrustum ); + addLine( "f2", "f4", hexFrustum ); + addLine( "f4", "f3", hexFrustum ); + addLine( "f3", "f1", hexFrustum ); + + // sides + + addLine( "n1", "f1", hexFrustum ); + addLine( "n2", "f2", hexFrustum ); + addLine( "n3", "f3", hexFrustum ); + addLine( "n4", "f4", hexFrustum ); + + // cone + + addLine( "p", "n1", hexCone ); + addLine( "p", "n2", hexCone ); + addLine( "p", "n3", hexCone ); + addLine( "p", "n4", hexCone ); + + // up + + addLine( "u1", "u2", hexUp ); + addLine( "u2", "u3", hexUp ); + addLine( "u3", "u1", hexUp ); + + // target + + addLine( "c", "t", hexTarget ); + addLine( "p", "c", hexCross ); + + // cross + + addLine( "cn1", "cn2", hexCross ); + addLine( "cn3", "cn4", hexCross ); + + addLine( "cf1", "cf2", hexCross ); + addLine( "cf3", "cf4", hexCross ); + + function addLine( a, b, hex ) { + + addPoint( a, hex ); + addPoint( b, hex ); + + } + + function addPoint( id, hex ) { + + geometry.vertices.push( new THREE.Vector3() ); + geometry.colors.push( new THREE.Color( hex ) ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( geometry.vertices.length - 1 ); + + } + + THREE.LineSegments.call( this, geometry, material ); + + this.camera = camera; + this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + +}; + +THREE.CameraHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.CameraHelper.prototype.constructor = THREE.CameraHelper; + +THREE.CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new THREE.Vector3(); + var camera = new THREE.Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + geometry.vertices[ points[ i ] ].copy( vector ); + + } + + } + + } + + return function () { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( "c", 0, 0, - 1 ); + setPoint( "t", 0, 0, 1 ); + + // near + + setPoint( "n1", - w, - h, - 1 ); + setPoint( "n2", w, - h, - 1 ); + setPoint( "n3", - w, h, - 1 ); + setPoint( "n4", w, h, - 1 ); + + // far + + setPoint( "f1", - w, - h, 1 ); + setPoint( "f2", w, - h, 1 ); + setPoint( "f3", - w, h, 1 ); + setPoint( "f4", w, h, 1 ); + + // up + + setPoint( "u1", w * 0.7, h * 1.1, - 1 ); + setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); + setPoint( "u3", 0, h * 2, - 1 ); + + // cross + + setPoint( "cf1", - w, 0, 1 ); + setPoint( "cf2", w, 0, 1 ); + setPoint( "cf3", 0, - h, 1 ); + setPoint( "cf4", 0, h, 1 ); + + setPoint( "cn1", - w, 0, - 1 ); + setPoint( "cn2", w, 0, - 1 ); + setPoint( "cn3", 0, - h, - 1 ); + setPoint( "cn4", 0, h, - 1 ); + + geometry.verticesNeedUpdate = true; + + }; + +}(); + +// File:src/extras/helpers/DirectionalLightHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.DirectionalLightHelper = function ( light, size ) { + + THREE.Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + size = size || 1; + + var geometry = new THREE.Geometry(); + geometry.vertices.push( + new THREE.Vector3( - size, size, 0 ), + new THREE.Vector3( size, size, 0 ), + new THREE.Vector3( size, - size, 0 ), + new THREE.Vector3( - size, - size, 0 ), + new THREE.Vector3( - size, size, 0 ) + ); + + var material = new THREE.LineBasicMaterial( { fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + this.lightPlane = new THREE.Line( geometry, material ); + this.add( this.lightPlane ); + + geometry = new THREE.Geometry(); + geometry.vertices.push( + new THREE.Vector3(), + new THREE.Vector3() + ); + + material = new THREE.LineBasicMaterial( { fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + this.targetLine = new THREE.Line( geometry, material ); + this.add( this.targetLine ); + + this.update(); + +}; + +THREE.DirectionalLightHelper.prototype = Object.create( THREE.Object3D.prototype ); +THREE.DirectionalLightHelper.prototype.constructor = THREE.DirectionalLightHelper; + +THREE.DirectionalLightHelper.prototype.dispose = function () { + + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + +}; + +THREE.DirectionalLightHelper.prototype.update = function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + var v3 = new THREE.Vector3(); + + return function () { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + this.lightPlane.lookAt( v3 ); + this.lightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + this.targetLine.geometry.vertices[ 1 ].copy( v3 ); + this.targetLine.geometry.verticesNeedUpdate = true; + this.targetLine.material.color.copy( this.lightPlane.material.color ); + + }; + +}(); + +// File:src/extras/helpers/EdgesHelper.js + +/** + * @author WestLangley / http://github.com/WestLangley + * @param object THREE.Mesh whose geometry will be used + * @param hex line color + * @param thresholdAngle the minimum angle (in degrees), + * between the face normals of adjacent faces, + * that is required to render an edge. A value of 10 means + * an edge is only rendered if the angle is at least 10 degrees. + */ + +THREE.EdgesHelper = function ( object, hex, thresholdAngle ) { + + var color = ( hex !== undefined ) ? hex : 0xffffff; + + THREE.LineSegments.call( this, new THREE.EdgesGeometry( object.geometry, thresholdAngle ), new THREE.LineBasicMaterial( { color: color } ) ); + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + +}; + +THREE.EdgesHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.EdgesHelper.prototype.constructor = THREE.EdgesHelper; + +// File:src/extras/helpers/FaceNormalsHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.FaceNormalsHelper = function ( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry instanceof THREE.Geometry ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new THREE.BufferGeometry(); + + var positions = new THREE.Float32Attribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + THREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + +}; + +THREE.FaceNormalsHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.FaceNormalsHelper.prototype.constructor = THREE.FaceNormalsHelper; + +THREE.FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + var normalMatrix = new THREE.Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + return this; + + } + +}() ); + +// File:src/extras/helpers/GridHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.GridHelper = function ( size, step ) { + + var geometry = new THREE.Geometry(); + var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } ); + + this.color1 = new THREE.Color( 0x444444 ); + this.color2 = new THREE.Color( 0x888888 ); + + for ( var i = - size; i <= size; i += step ) { + + geometry.vertices.push( + new THREE.Vector3( - size, 0, i ), new THREE.Vector3( size, 0, i ), + new THREE.Vector3( i, 0, - size ), new THREE.Vector3( i, 0, size ) + ); + + var color = i === 0 ? this.color1 : this.color2; + + geometry.colors.push( color, color, color, color ); + + } + + THREE.LineSegments.call( this, geometry, material ); + +}; + +THREE.GridHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.GridHelper.prototype.constructor = THREE.GridHelper; + +THREE.GridHelper.prototype.setColors = function( colorCenterLine, colorGrid ) { + + this.color1.set( colorCenterLine ); + this.color2.set( colorGrid ); + + this.geometry.colorsNeedUpdate = true; + +}; + +// File:src/extras/helpers/HemisphereLightHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.HemisphereLightHelper = function ( light, sphereSize ) { + + THREE.Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.colors = [ new THREE.Color(), new THREE.Color() ]; + + var geometry = new THREE.SphereGeometry( sphereSize, 4, 2 ); + geometry.rotateX( - Math.PI / 2 ); + + for ( var i = 0, il = 8; i < il; i ++ ) { + + geometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ]; + + } + + var material = new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors, wireframe: true } ); + + this.lightSphere = new THREE.Mesh( geometry, material ); + this.add( this.lightSphere ); + + this.update(); + +}; + +THREE.HemisphereLightHelper.prototype = Object.create( THREE.Object3D.prototype ); +THREE.HemisphereLightHelper.prototype.constructor = THREE.HemisphereLightHelper; + +THREE.HemisphereLightHelper.prototype.dispose = function () { + + this.lightSphere.geometry.dispose(); + this.lightSphere.material.dispose(); + +}; + +THREE.HemisphereLightHelper.prototype.update = function () { + + var vector = new THREE.Vector3(); + + return function () { + + this.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity ); + this.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity ); + + this.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + this.lightSphere.geometry.colorsNeedUpdate = true; + + } + +}(); + +// File:src/extras/helpers/PointLightHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.PointLightHelper = function ( light, sphereSize ) { + + this.light = light; + this.light.updateMatrixWorld(); + + var geometry = new THREE.SphereGeometry( sphereSize, 4, 2 ); + var material = new THREE.MeshBasicMaterial( { wireframe: true, fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + THREE.Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + +}; + +THREE.PointLightHelper.prototype = Object.create( THREE.Mesh.prototype ); +THREE.PointLightHelper.prototype.constructor = THREE.PointLightHelper; + +THREE.PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + +}; + +THREE.PointLightHelper.prototype.update = function () { + + this.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + +}; + +// File:src/extras/helpers/SkeletonHelper.js + +/** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + */ + +THREE.SkeletonHelper = function ( object ) { + + this.bones = this.getBoneList( object ); + + var geometry = new THREE.Geometry(); + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent instanceof THREE.Bone ) { + + geometry.vertices.push( new THREE.Vector3() ); + geometry.vertices.push( new THREE.Vector3() ); + geometry.colors.push( new THREE.Color( 0, 0, 1 ) ); + geometry.colors.push( new THREE.Color( 0, 1, 0 ) ); + + } + + } + + geometry.dynamic = true; + + var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + THREE.LineSegments.call( this, geometry, material ); + + this.root = object; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + +}; + + +THREE.SkeletonHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.SkeletonHelper.prototype.constructor = THREE.SkeletonHelper; + +THREE.SkeletonHelper.prototype.getBoneList = function( object ) { + + var boneList = []; + + if ( object instanceof THREE.Bone ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); + + } + + return boneList; + +}; + +THREE.SkeletonHelper.prototype.update = function () { + + var geometry = this.geometry; + + var matrixWorldInv = new THREE.Matrix4().getInverse( this.root.matrixWorld ); + + var boneMatrix = new THREE.Matrix4(); + + var j = 0; + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( bone.parent instanceof THREE.Bone ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + geometry.vertices[ j ].setFromMatrixPosition( boneMatrix ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + geometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix ); + + j += 2; + + } + + } + + geometry.verticesNeedUpdate = true; + + geometry.computeBoundingSphere(); + +}; + +// File:src/extras/helpers/SpotLightHelper.js + +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.SpotLightHelper = function ( light ) { + + THREE.Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new THREE.CylinderGeometry( 0, 1, 1, 8, 1, true ); + + geometry.translate( 0, - 0.5, 0 ); + geometry.rotateX( - Math.PI / 2 ); + + var material = new THREE.MeshBasicMaterial( { wireframe: true, fog: false } ); + + this.cone = new THREE.Mesh( geometry, material ); + this.add( this.cone ); + + this.update(); + +}; + +THREE.SpotLightHelper.prototype = Object.create( THREE.Object3D.prototype ); +THREE.SpotLightHelper.prototype.constructor = THREE.SpotLightHelper; + +THREE.SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + +}; + +THREE.SpotLightHelper.prototype.update = function () { + + var vector = new THREE.Vector3(); + var vector2 = new THREE.Vector3(); + + return function () { + + var coneLength = this.light.distance ? this.light.distance : 10000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + this.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + }; + +}(); + +// File:src/extras/helpers/VertexNormalsHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley +*/ + +THREE.VertexNormalsHelper = function ( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( objGeometry instanceof THREE.Geometry ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( objGeometry instanceof THREE.BufferGeometry ) { + + nNormals = objGeometry.attributes.normal.count + + } + + // + + var geometry = new THREE.BufferGeometry(); + + var positions = new THREE.Float32Attribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + THREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + +}; + +THREE.VertexNormalsHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.VertexNormalsHelper.prototype.constructor = THREE.VertexNormalsHelper; + +THREE.VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new THREE.Vector3(); + var v2 = new THREE.Vector3(); + var normalMatrix = new THREE.Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( objGeometry instanceof THREE.Geometry ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( objGeometry instanceof THREE.BufferGeometry ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + return this; + + } + +}() ); + +// File:src/extras/helpers/WireframeHelper.js + +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.WireframeHelper = function ( object, hex ) { + + var color = ( hex !== undefined ) ? hex : 0xffffff; + + THREE.LineSegments.call( this, new THREE.WireframeGeometry( object.geometry ), new THREE.LineBasicMaterial( { color: color } ) ); + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + +}; + +THREE.WireframeHelper.prototype = Object.create( THREE.LineSegments.prototype ); +THREE.WireframeHelper.prototype.constructor = THREE.WireframeHelper; + +// File:src/extras/objects/ImmediateRenderObject.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.ImmediateRenderObject = function ( material ) { + + THREE.Object3D.call( this ); + + this.material = material; + this.render = function ( renderCallback ) {}; + +}; + +THREE.ImmediateRenderObject.prototype = Object.create( THREE.Object3D.prototype ); +THREE.ImmediateRenderObject.prototype.constructor = THREE.ImmediateRenderObject; + +// File:src/extras/objects/MorphBlendMesh.js + +/** + * @author alteredq / http://alteredqualia.com/ + */ + +THREE.MorphBlendMesh = function( geometry, material ) { + + THREE.Mesh.call( this, geometry, material ); + + this.animationsMap = {}; + this.animationsList = []; + + // prepare default animation + // (all frames played together in 1 second) + + var numFrames = this.geometry.morphTargets.length; + + var name = "__default"; + + var startFrame = 0; + var endFrame = numFrames - 1; + + var fps = numFrames / 1; + + this.createAnimation( name, startFrame, endFrame, fps ); + this.setAnimationWeight( name, 1 ); + +}; + +THREE.MorphBlendMesh.prototype = Object.create( THREE.Mesh.prototype ); +THREE.MorphBlendMesh.prototype.constructor = THREE.MorphBlendMesh; + +THREE.MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { + + var animation = { + + start: start, + end: end, + + length: end - start + 1, + + fps: fps, + duration: ( end - start ) / fps, + + lastFrame: 0, + currentFrame: 0, + + active: false, + + time: 0, + direction: 1, + weight: 1, + + directionBackwards: false, + mirroredLoop: false + + }; + + this.animationsMap[ name ] = animation; + this.animationsList.push( animation ); + +}; + +THREE.MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { + + var pattern = /([a-z]+)_?(\d+)/; + + var firstAnimation, frameRanges = {}; + + var geometry = this.geometry; + + for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { + + var morph = geometry.morphTargets[ i ]; + var chunks = morph.name.match( pattern ); + + if ( chunks && chunks.length > 1 ) { + + var name = chunks[ 1 ]; + + if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; + + var range = frameRanges[ name ]; + + if ( i < range.start ) range.start = i; + if ( i > range.end ) range.end = i; + + if ( ! firstAnimation ) firstAnimation = name; + + } + + } + + for ( var name in frameRanges ) { + + var range = frameRanges[ name ]; + this.createAnimation( name, range.start, range.end, fps ); + + } + + this.firstAnimation = firstAnimation; + +}; + +THREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = 1; + animation.directionBackwards = false; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = - 1; + animation.directionBackwards = true; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.fps = fps; + animation.duration = ( animation.end - animation.start ) / animation.fps; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.duration = duration; + animation.fps = ( animation.end - animation.start ) / animation.duration; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.weight = weight; + + } + +}; + +THREE.MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = time; + + } + +}; + +THREE.MorphBlendMesh.prototype.getAnimationTime = function ( name ) { + + var time = 0; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + time = animation.time; + + } + + return time; + +}; + +THREE.MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { + + var duration = - 1; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + duration = animation.duration; + + } + + return duration; + +}; + +THREE.MorphBlendMesh.prototype.playAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = 0; + animation.active = true; + + } else { + + console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); + + } + +}; + +THREE.MorphBlendMesh.prototype.stopAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.active = false; + + } + +}; + +THREE.MorphBlendMesh.prototype.update = function ( delta ) { + + for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { + + var animation = this.animationsList[ i ]; + + if ( ! animation.active ) continue; + + var frameTime = animation.duration / animation.length; + + animation.time += animation.direction * delta; + + if ( animation.mirroredLoop ) { + + if ( animation.time > animation.duration || animation.time < 0 ) { + + animation.direction *= - 1; + + if ( animation.time > animation.duration ) { + + animation.time = animation.duration; + animation.directionBackwards = true; + + } + + if ( animation.time < 0 ) { + + animation.time = 0; + animation.directionBackwards = false; + + } + + } + + } else { + + animation.time = animation.time % animation.duration; + + if ( animation.time < 0 ) animation.time += animation.duration; + + } + + var keyframe = animation.start + THREE.Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); + var weight = animation.weight; + + if ( keyframe !== animation.currentFrame ) { + + this.morphTargetInfluences[ animation.lastFrame ] = 0; + this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; + + this.morphTargetInfluences[ keyframe ] = 0; + + animation.lastFrame = animation.currentFrame; + animation.currentFrame = keyframe; + + } + + var mix = ( animation.time % frameTime ) / frameTime; + + if ( animation.directionBackwards ) mix = 1 - mix; + + if ( animation.currentFrame !== animation.lastFrame ) { + + this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; + this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; + + } else { + + this.morphTargetInfluences[ animation.currentFrame ] = weight; + + } + + } + +}; + + +// Export the THREE object for **Node.js**, with +// backwards-compatibility for the old `require()` API. If we're in +// the browser, add `_` as a global object via a string identifier, +// for Closure Compiler "advanced" mode. +if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = THREE; + } + exports.THREE = THREE; +} else { + this['THREE'] = THREE; +} + +},{}],6:[function(_dereq_,module,exports){ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 0.0 && abs(vUV.x - 0.5) < .001) {', + // Don't render the divider, since it's rendered in HTML. + //'gl_FragColor = dividerColor;', + '} else if (a.x < 0.0 || a.x > 1.0 || a.y < 0.0 || a.y > 1.0) {', + 'gl_FragColor = backgroundColor;', + '} else {', + 'gl_FragColor = texture2D(texture, vec2(a.x * 0.5 + (vUV.x < 0.5 ? 0.0 : 0.5), a.y));', + '}', + '}' + + ].join('\n') +}; + +module.exports = BarrelDistortionFragment; + +},{}],6:[function(_dereq_,module,exports){ +/** + * TODO(smus): Implement coefficient inversion. + */ +function Distortion(coefficients) { + this.coefficients = coefficients; +} + +/** + * Calculates the inverse distortion for a radius. + *

+ * Allows to compute the original undistorted radius from a distorted one. + * See also getApproximateInverseDistortion() for a faster but potentially + * less accurate method. + * + * @param {Number} radius Distorted radius from the lens center in tan-angle units. + * @return {Number} The undistorted radius in tan-angle units. + */ +Distortion.prototype.distortInverse = function(radius) { + // Secant method. + var r0 = radius / 0.9; + var r1 = radius * 0.9; + var dr0 = radius - this.distort(r0); + while (Math.abs(r1 - r0) > 0.0001 /** 0.1mm */) { + var dr1 = radius - this.distort(r1); + var r2 = r1 - dr1 * ((r1 - r0) / (dr1 - dr0)); + r0 = r1; + r1 = r2; + dr0 = dr1; + } + return r1; +} + + +/** + * Distorts a radius by its distortion factor from the center of the lenses. + * + * @param {Number} radius Radius from the lens center in tan-angle units. + * @return {Number} The distorted radius in tan-angle units. + */ +Distortion.prototype.distort = function(radius) { + return radius * this.distortionFactor_(radius); +} + +/** + * Returns the distortion factor of a point. + * + * @param {Number} radius Radius of the point from the lens center in tan-angle units. + * @return {Number} The distortion factor. Multiply by this factor to distort points. + */ +Distortion.prototype.distortionFactor_ = function(radius) { + var result = 1.0; + var rFactor = 1.0; + var rSquared = radius * radius; + + for (var i = 0; i < this.coefficients.length; i++) { + var ki = this.coefficients[i]; + rFactor *= rSquared; + result += ki * rFactor; + } + + return result; +} + +module.exports = Distortion; + +},{}],7:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * DPDB cache. + */ +var DPDB_CACHE = { + "format": 1, + "last_updated": "2016-01-26T23:11:18Z", + "devices": [ + { + "type": "android", + "rules": [ + { "mdmh": "asus/*/Nexus 7/*" }, + { "ua": "Nexus 7" } + ], + "dpi": [ 320.8, 323.0 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "asus/*/ASUS_Z00AD/*" }, + { "ua": "ASUS_Z00AD" } + ], + "dpi": [ 403.0, 404.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC6435LVW/*" }, + { "ua": "HTC6435LVW" } + ], + "dpi": [ 449.7, 443.3 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC One XL/*" }, + { "ua": "HTC One XL" } + ], + "dpi": [ 315.3, 314.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "htc/*/Nexus 9/*" }, + { "ua": "Nexus 9" } + ], + "dpi": 289.0, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC One M9/*" }, + { "ua": "HTC One M9" } + ], + "dpi": [ 442.5, 443.3 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC One_M8/*" }, + { "ua": "HTC One_M8" } + ], + "dpi": [ 449.7, 447.4 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "HTC/*/HTC One/*" }, + { "ua": "HTC One" } + ], + "dpi": 472.8, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Huawei/*/Nexus 6P/*" }, + { "ua": "Nexus 6P" } + ], + "dpi": [ 515.1, 518.0 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/Nexus 5X/*" }, + { "ua": "Nexus 5X" } + ], + "dpi": [ 422.0, 419.9 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LGMS345/*" }, + { "ua": "LGMS345" } + ], + "dpi": [ 221.7, 219.1 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LG-D800/*" }, + { "ua": "LG-D800" } + ], + "dpi": [ 422.0, 424.1 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LG-D850/*" }, + { "ua": "LG-D850" } + ], + "dpi": [ 537.9, 541.9 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/VS985 4G/*" }, + { "ua": "VS985 4G" } + ], + "dpi": [ 537.9, 535.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/Nexus 5/*" }, + { "ua": "Nexus 5 B" } + ], + "dpi": [ 442.4, 444.8 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/Nexus 4/*" }, + { "ua": "Nexus 4" } + ], + "dpi": [ 319.8, 318.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LG-P769/*" }, + { "ua": "LG-P769" } + ], + "dpi": [ 240.6, 247.5 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LGMS323/*" }, + { "ua": "LGMS323" } + ], + "dpi": [ 206.6, 204.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "LGE/*/LGLS996/*" }, + { "ua": "LGLS996" } + ], + "dpi": [ 403.4, 401.5 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Micromax/*/4560MMX/*" }, + { "ua": "4560MMX" } + ], + "dpi": [ 240.0, 219.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Micromax/*/A250/*" }, + { "ua": "Micromax A250" } + ], + "dpi": [ 480.0, 446.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Micromax/*/Micromax AQ4501/*" }, + { "ua": "Micromax AQ4501" } + ], + "dpi": 240.0, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/DROID RAZR/*" }, + { "ua": "DROID RAZR" } + ], + "dpi": [ 368.1, 256.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT830C/*" }, + { "ua": "XT830C" } + ], + "dpi": [ 254.0, 255.9 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1021/*" }, + { "ua": "XT1021" } + ], + "dpi": [ 254.0, 256.7 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1023/*" }, + { "ua": "XT1023" } + ], + "dpi": [ 254.0, 256.7 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1028/*" }, + { "ua": "XT1028" } + ], + "dpi": [ 326.6, 327.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1034/*" }, + { "ua": "XT1034" } + ], + "dpi": [ 326.6, 328.4 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1053/*" }, + { "ua": "XT1053" } + ], + "dpi": [ 315.3, 316.1 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1562/*" }, + { "ua": "XT1562" } + ], + "dpi": [ 403.4, 402.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/Nexus 6/*" }, + { "ua": "Nexus 6 B" } + ], + "dpi": [ 494.3, 489.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1063/*" }, + { "ua": "XT1063" } + ], + "dpi": [ 295.0, 296.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1064/*" }, + { "ua": "XT1064" } + ], + "dpi": [ 295.0, 295.6 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1092/*" }, + { "ua": "XT1092" } + ], + "dpi": [ 422.0, 424.1 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "motorola/*/XT1095/*" }, + { "ua": "XT1095" } + ], + "dpi": [ 422.0, 423.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "OnePlus/*/A0001/*" }, + { "ua": "A0001" } + ], + "dpi": [ 403.4, 401.0 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "OnePlus/*/ONE E1005/*" }, + { "ua": "ONE E1005" } + ], + "dpi": [ 442.4, 441.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "OnePlus/*/ONE A2005/*" }, + { "ua": "ONE A2005" } + ], + "dpi": [ 391.9, 405.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "OPPO/*/X909/*" }, + { "ua": "X909" } + ], + "dpi": [ 442.4, 444.1 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9082/*" }, + { "ua": "GT-I9082" } + ], + "dpi": [ 184.7, 185.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G360P/*" }, + { "ua": "SM-G360P" } + ], + "dpi": [ 196.7, 205.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/Nexus S/*" }, + { "ua": "Nexus S" } + ], + "dpi": [ 234.5, 229.8 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9300/*" }, + { "ua": "GT-I9300" } + ], + "dpi": [ 304.8, 303.9 ], + "bw": 5, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-T230NU/*" }, + { "ua": "SM-T230NU" } + ], + "dpi": 216.0, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SGH-T399/*" }, + { "ua": "SGH-T399" } + ], + "dpi": [ 217.7, 231.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-N9005/*" }, + { "ua": "SM-N9005" } + ], + "dpi": [ 386.4, 387.0 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SAMSUNG-SM-N900A/*" }, + { "ua": "SAMSUNG-SM-N900A" } + ], + "dpi": [ 386.4, 387.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9500/*" }, + { "ua": "GT-I9500" } + ], + "dpi": [ 442.5, 443.3 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9505/*" }, + { "ua": "GT-I9505" } + ], + "dpi": 439.4, + "bw": 4, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G900F/*" }, + { "ua": "SM-G900F" } + ], + "dpi": [ 415.6, 431.6 ], + "bw": 5, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G900M/*" }, + { "ua": "SM-G900M" } + ], + "dpi": [ 415.6, 431.6 ], + "bw": 5, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G800F/*" }, + { "ua": "SM-G800F" } + ], + "dpi": 326.8, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G906S/*" }, + { "ua": "SM-G906S" } + ], + "dpi": [ 562.7, 572.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9300/*" }, + { "ua": "GT-I9300" } + ], + "dpi": [ 306.7, 304.8 ], + "bw": 5, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-T535/*" }, + { "ua": "SM-T535" } + ], + "dpi": [ 142.6, 136.4 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-N920C/*" }, + { "ua": "SM-N920C" } + ], + "dpi": [ 515.1, 518.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9300I/*" }, + { "ua": "GT-I9300I" } + ], + "dpi": [ 304.8, 305.8 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-I9195/*" }, + { "ua": "GT-I9195" } + ], + "dpi": [ 249.4, 256.7 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SPH-L520/*" }, + { "ua": "SPH-L520" } + ], + "dpi": [ 249.4, 255.9 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SAMSUNG-SGH-I717/*" }, + { "ua": "SAMSUNG-SGH-I717" } + ], + "dpi": 285.8, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SPH-D710/*" }, + { "ua": "SPH-D710" } + ], + "dpi": [ 217.7, 204.2 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/GT-N7100/*" }, + { "ua": "GT-N7100" } + ], + "dpi": 265.1, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SCH-I605/*" }, + { "ua": "SCH-I605" } + ], + "dpi": 265.1, + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/Galaxy Nexus/*" }, + { "ua": "Galaxy Nexus" } + ], + "dpi": [ 315.3, 314.2 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-N910H/*" }, + { "ua": "SM-N910H" } + ], + "dpi": [ 515.1, 518.0 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-N910C/*" }, + { "ua": "SM-N910C" } + ], + "dpi": [ 515.2, 520.2 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G130M/*" }, + { "ua": "SM-G130M" } + ], + "dpi": [ 165.9, 164.8 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G928I/*" }, + { "ua": "SM-G928I" } + ], + "dpi": [ 515.1, 518.4 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G920F/*" }, + { "ua": "SM-G920F" } + ], + "dpi": 580.6, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G920P/*" }, + { "ua": "SM-G920P" } + ], + "dpi": [ 522.5, 577.0 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G925F/*" }, + { "ua": "SM-G925F" } + ], + "dpi": 580.6, + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "samsung/*/SM-G925V/*" }, + { "ua": "SM-G925V" } + ], + "dpi": [ 522.5, 576.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/C6903/*" }, + { "ua": "C6903" } + ], + "dpi": [ 442.5, 443.3 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/D6653/*" }, + { "ua": "D6653" } + ], + "dpi": [ 428.6, 427.6 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/E6653/*" }, + { "ua": "E6653" } + ], + "dpi": [ 428.6, 425.7 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/E6853/*" }, + { "ua": "E6853" } + ], + "dpi": [ 403.4, 401.9 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "Sony/*/SGP321/*" }, + { "ua": "SGP321" } + ], + "dpi": [ 224.7, 224.1 ], + "bw": 3, + "ac": 500 + }, + { + "type": "android", + "rules": [ + { "mdmh": "TCT/*/ALCATEL ONE TOUCH Fierce/*" }, + { "ua": "ALCATEL ONE TOUCH Fierce" } + ], + "dpi": [ 240.0, 247.5 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "THL/*/thl 5000/*" }, + { "ua": "thl 5000" } + ], + "dpi": [ 480.0, 443.3 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "android", + "rules": [ + { "mdmh": "ZTE/*/ZTE Blade L2/*" }, + { "ua": "ZTE Blade L2" } + ], + "dpi": 240.0, + "bw": 3, + "ac": 500 + }, + { + "type": "ios", + "rules": [ { "res": [ 640, 960 ] } ], + "dpi": [ 325.1, 328.4 ], + "bw": 4, + "ac": 1000 + }, + { + "type": "ios", + "rules": [ { "res": [ 640, 1136 ] } ], + "dpi": [ 317.1, 320.2 ], + "bw": 3, + "ac": 1000 + }, + { + "type": "ios", + "rules": [ { "res": [ 750, 1334 ] } ], + "dpi": 326.4, + "bw": 4, + "ac": 1000 + }, + { + "type": "ios", + "rules": [ { "res": [ 1242, 2208 ] } ], + "dpi": [ 453.6, 458.4 ], + "bw": 4, + "ac": 1000 + }, + { + "type": "ios", + "rules": [ { "res": [ 1125, 2001 ] } ], + "dpi": [ 410.9, 415.4 ], + "bw": 4, + "ac": 1000 + } +]}; + +module.exports = DPDB_CACHE; + + +},{}],8:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Offline cache of the DPDB, to be used until we load the online one (and +// as a fallback in case we can't load the online one). +var DPDB_CACHE = _dereq_('./dpdb-cache.js'); +var Util = _dereq_('./util.js'); + +// Online DPDB URL. +var ONLINE_DPDB_URL = 'https://storage.googleapis.com/cardboard-dpdb/dpdb.json'; + +/** + * Calculates device parameters based on the DPDB (Device Parameter Database). + * Initially, uses the cached DPDB values. + * + * If fetchOnline == true, then this object tries to fetch the online version + * of the DPDB and updates the device info if a better match is found. + * Calls the onDeviceParamsUpdated callback when there is an update to the + * device information. + */ +function Dpdb(fetchOnline, onDeviceParamsUpdated) { + // Start with the offline DPDB cache while we are loading the real one. + this.dpdb = DPDB_CACHE; + + // Calculate device params based on the offline version of the DPDB. + this.recalculateDeviceParams_(); + + // XHR to fetch online DPDB file, if requested. + if (fetchOnline) { + // Set the callback. + this.onDeviceParamsUpdated = onDeviceParamsUpdated; + + console.log('Fetching DPDB...'); + var xhr = new XMLHttpRequest(); + var obj = this; + xhr.open('GET', ONLINE_DPDB_URL, true); + xhr.addEventListener('load', function() { + obj.loading = false; + if (xhr.status >= 200 && xhr.status <= 299) { + // Success. + console.log('Successfully loaded online DPDB.'); + obj.dpdb = JSON.parse(xhr.response); + obj.recalculateDeviceParams_(); + } else { + // Error loading the DPDB. + console.error('Error loading online DPDB!'); + } + }); + xhr.send(); + } +} + +// Returns the current device parameters. +Dpdb.prototype.getDeviceParams = function() { + return this.deviceParams; +}; + +// Recalculates this device's parameters based on the DPDB. +Dpdb.prototype.recalculateDeviceParams_ = function() { + console.log('Recalculating device params.'); + var newDeviceParams = this.calcDeviceParams_(); + console.log('New device parameters:'); + console.log(newDeviceParams); + if (newDeviceParams) { + this.deviceParams = newDeviceParams; + // Invoke callback, if it is set. + if (this.onDeviceParamsUpdated) { + this.onDeviceParamsUpdated(this.deviceParams); + } + } else { + console.warn('Failed to recalculate device parameters.'); + } +}; + +// Returns a DeviceParams object that represents the best guess as to this +// device's parameters. Can return null if the device does not match any +// known devices. +Dpdb.prototype.calcDeviceParams_ = function() { + var db = this.dpdb; // shorthand + if (!db) { + console.error('DPDB not available.'); + return null; + } + if (db.format != 1) { + console.error('DPDB has unexpected format version.'); + return null; + } + if (!db.devices || !db.devices.length) { + console.error('DPDB does not have a devices section.'); + return null; + } + + // Get the actual user agent and screen dimensions in pixels. + var userAgent = navigator.userAgent || navigator.vendor || window.opera; + var width = Util.getScreenWidth(); + var height = Util.getScreenHeight(); + console.log('User agent: ' + userAgent); + console.log('Pixel width: ' + width); + console.log('Pixel height: ' + height); + + if (!db.devices) { + console.error('DPDB has no devices section.'); + return null; + } + + for (var i = 0; i < db.devices.length; i++) { + var device = db.devices[i]; + if (!device.rules) { + console.warn('Device[' + i + '] has no rules section.'); + continue; + } + + if (device.type != 'ios' && device.type != 'android') { + console.warn('Device[' + i + '] has invalid type.'); + continue; + } + + // See if this device is of the appropriate type. + if (Util.isIOS() != (device.type == 'ios')) continue; + + // See if this device matches any of the rules: + var matched = false; + for (var j = 0; j < device.rules.length; j++) { + var rule = device.rules[j]; + if (this.matchRule_(rule, userAgent, width, height)) { + console.log('Rule matched:'); + console.log(rule); + matched = true; + break; + } + } + if (!matched) continue; + + // device.dpi might be an array of [ xdpi, ydpi] or just a scalar. + var xdpi = device.dpi[0] || device.dpi; + var ydpi = device.dpi[1] || device.dpi; + + return new DeviceParams({ xdpi: xdpi, ydpi: ydpi, bevelMm: device.bw }); + } + + console.warn('No DPDB device match.'); + return null; +}; + +Dpdb.prototype.matchRule_ = function(rule, ua, screenWidth, screenHeight) { + // We can only match 'ua' and 'res' rules, not other types like 'mdmh' + // (which are meant for native platforms). + if (!rule.ua && !rule.res) return false; + + // If our user agent string doesn't contain the indicated user agent string, + // the match fails. + if (rule.ua && ua.indexOf(rule.ua) < 0) return false; + + // If the rule specifies screen dimensions that don't correspond to ours, + // the match fails. + if (rule.res) { + if (!rule.res[0] || !rule.res[1]) return false; + var resX = rule.res[0]; + var resY = rule.res[1]; + // Compare min and max so as to make the order not matter, i.e., it should + // be true that 640x480 == 480x640. + if (Math.min(screenWidth, screenHeight) != Math.min(resX, resY) || + (Math.max(screenWidth, screenHeight) != Math.max(resX, resY))) { + return false; + } + } + + return true; +} + +function DeviceParams(params) { + this.xdpi = params.xdpi; + this.ydpi = params.ydpi; + this.bevelMm = params.bevelMm; +} + +module.exports = Dpdb; + +},{"./dpdb-cache.js":7,"./util.js":13}],9:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function Emitter() { + this.callbacks = {}; +} + +Emitter.prototype.emit = function(eventName) { + var callbacks = this.callbacks[eventName]; + if (!callbacks) { + //console.log('No valid callback specified.'); + return; + } + var args = [].slice.call(arguments); + // Eliminate the first param (the callback). + args.shift(); + for (var i = 0; i < callbacks.length; i++) { + callbacks[i].apply(this, args); + } +}; + +Emitter.prototype.on = function(eventName, callback) { + if (eventName in this.callbacks) { + this.callbacks[eventName].push(callback); + } else { + this.callbacks[eventName] = [callback]; + } +}; + +module.exports = Emitter; + +},{}],10:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var WebVRManager = _dereq_('./webvr-manager.js'); + +window.WebVRConfig = window.WebVRConfig || {}; +window.WebVRManager = WebVRManager; + +},{"./webvr-manager.js":16}],11:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Modes = { + UNKNOWN: 0, + // Not fullscreen, just tracking. + NORMAL: 1, + // Magic window immersive mode. + MAGIC_WINDOW: 2, + // Full screen split screen VR mode. + VR: 3, +}; + +module.exports = Modes; + +},{}],12:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Util = _dereq_('./util.js'); + +function RotateInstructions() { + this.loadIcon_(); + + var overlay = document.createElement('div'); + var s = overlay.style; + s.position = 'fixed'; + s.top = 0; + s.right = 0; + s.bottom = 0; + s.left = 0; + s.backgroundColor = 'gray'; + s.fontFamily = 'sans-serif'; + + var img = document.createElement('img'); + img.src = this.icon; + var s = img.style; + s.marginLeft = '25%'; + s.marginTop = '25%'; + s.width = '50%'; + overlay.appendChild(img); + + var text = document.createElement('div'); + var s = text.style; + s.textAlign = 'center'; + s.fontSize = '16px'; + s.lineHeight = '24px'; + s.margin = '24px 25%'; + s.width = '50%'; + text.innerHTML = 'Place your phone into your Cardboard viewer.'; + overlay.appendChild(text); + + var snackbar = document.createElement('div'); + var s = snackbar.style; + s.backgroundColor = '#CFD8DC'; + s.position = 'fixed'; + s.bottom = 0; + s.width = '100%'; + s.height = '48px'; + s.padding = '14px 24px'; + s.boxSizing = 'border-box'; + s.color = '#656A6B'; + overlay.appendChild(snackbar); + + var snackbarText = document.createElement('div'); + snackbarText.style.float = 'left'; + snackbarText.innerHTML = 'No Cardboard viewer?'; + + var snackbarButton = document.createElement('a'); + snackbarButton.href = 'https://www.google.com/get/cardboard/get-cardboard/'; + snackbarButton.innerHTML = 'get one'; + snackbarButton.target = '_blank'; + var s = snackbarButton.style; + s.float = 'right'; + s.fontWeight = 600; + s.textTransform = 'uppercase'; + s.borderLeft = '1px solid gray'; + s.paddingLeft = '24px'; + s.textDecoration = 'none'; + s.color = '#656A6B'; + + snackbar.appendChild(snackbarText); + snackbar.appendChild(snackbarButton); + + this.overlay = overlay; + this.text = text; + document.body.appendChild(overlay); + + this.hide(); +} + +RotateInstructions.prototype.show = function() { + this.overlay.style.display = 'block'; + + var img = this.overlay.querySelector('img'); + var s = img.style; + + if (Util.isLandscapeMode()) { + s.width = '20%'; + s.marginLeft = '40%'; + s.marginTop = '3%'; + } else { + s.width = '50%'; + s.marginLeft = '25%'; + s.marginTop = '25%'; + } +}; + +RotateInstructions.prototype.hide = function() { + this.overlay.style.display = 'none'; +}; + +RotateInstructions.prototype.showTemporarily = function(ms) { + this.show(); + this.timer = setTimeout(this.hide.bind(this), ms); +}; + +RotateInstructions.prototype.disableShowTemporarily = function() { + clearTimeout(this.timer); +}; + +RotateInstructions.prototype.loadIcon_ = function() { + // Encoded asset_src/rotate-instructions.svg + this.icon = Util.base64('image/svg+xml', 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE5OHB4IiBoZWlnaHQ9IjI0MHB4IiB2aWV3Qm94PSIwIDAgMTk4IDI0MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4zICgxMjA4MSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+dHJhbnNpdGlvbjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgogICAgICAgIDxnIGlkPSJ0cmFuc2l0aW9uIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KICAgICAgICAgICAgPGcgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTQtKy1JbXBvcnRlZC1MYXllcnMtQ29weS0rLUltcG9ydGVkLUxheWVycy1Db3B5LTItQ29weSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHktNCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwNy4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjYyNSwyLjUyNyBDMTQ5LjYyNSwyLjUyNyAxNTUuODA1LDYuMDk2IDE1Ni4zNjIsNi40MTggTDE1Ni4zNjIsNy4zMDQgQzE1Ni4zNjIsNy40ODEgMTU2LjM3NSw3LjY2NCAxNTYuNCw3Ljg1MyBDMTU2LjQxLDcuOTM0IDE1Ni40Miw4LjAxNSAxNTYuNDI3LDguMDk1IEMxNTYuNTY3LDkuNTEgMTU3LjQwMSwxMS4wOTMgMTU4LjUzMiwxMi4wOTQgTDE2NC4yNTIsMTcuMTU2IEwxNjQuMzMzLDE3LjA2NiBDMTY0LjMzMywxNy4wNjYgMTY4LjcxNSwxNC41MzYgMTY5LjU2OCwxNC4wNDIgQzE3MS4wMjUsMTQuODgzIDE5NS41MzgsMjkuMDM1IDE5NS41MzgsMjkuMDM1IEwxOTUuNTM4LDgzLjAzNiBDMTk1LjUzOCw4My44MDcgMTk1LjE1Miw4NC4yNTMgMTk0LjU5LDg0LjI1MyBDMTk0LjM1Nyw4NC4yNTMgMTk0LjA5NSw4NC4xNzcgMTkzLjgxOCw4NC4wMTcgTDE2OS44NTEsNzAuMTc5IEwxNjkuODM3LDcwLjIwMyBMMTQyLjUxNSw4NS45NzggTDE0MS42NjUsODQuNjU1IEMxMzYuOTM0LDgzLjEyNiAxMzEuOTE3LDgxLjkxNSAxMjYuNzE0LDgxLjA0NSBDMTI2LjcwOSw4MS4wNiAxMjYuNzA3LDgxLjA2OSAxMjYuNzA3LDgxLjA2OSBMMTIxLjY0LDk4LjAzIEwxMTMuNzQ5LDEwMi41ODYgTDExMy43MTIsMTAyLjUyMyBMMTEzLjcxMiwxMzAuMTEzIEMxMTMuNzEyLDEzMC44ODUgMTEzLjMyNiwxMzEuMzMgMTEyLjc2NCwxMzEuMzMgQzExMi41MzIsMTMxLjMzIDExMi4yNjksMTMxLjI1NCAxMTEuOTkyLDEzMS4wOTQgTDY5LjUxOSwxMDYuNTcyIEM2OC41NjksMTA2LjAyMyA2Ny43OTksMTA0LjY5NSA2Ny43OTksMTAzLjYwNSBMNjcuNzk5LDEwMi41NyBMNjcuNzc4LDEwMi42MTcgQzY3LjI3LDEwMi4zOTMgNjYuNjQ4LDEwMi4yNDkgNjUuOTYyLDEwMi4yMTggQzY1Ljg3NSwxMDIuMjE0IDY1Ljc4OCwxMDIuMjEyIDY1LjcwMSwxMDIuMjEyIEM2NS42MDYsMTAyLjIxMiA2NS41MTEsMTAyLjIxNSA2NS40MTYsMTAyLjIxOSBDNjUuMTk1LDEwMi4yMjkgNjQuOTc0LDEwMi4yMzUgNjQuNzU0LDEwMi4yMzUgQzY0LjMzMSwxMDIuMjM1IDYzLjkxMSwxMDIuMjE2IDYzLjQ5OCwxMDIuMTc4IEM2MS44NDMsMTAyLjAyNSA2MC4yOTgsMTAxLjU3OCA1OS4wOTQsMTAwLjg4MiBMMTIuNTE4LDczLjk5MiBMMTIuNTIzLDc0LjAwNCBMMi4yNDUsNTUuMjU0IEMxLjI0NCw1My40MjcgMi4wMDQsNTEuMDM4IDMuOTQzLDQ5LjkxOCBMNTkuOTU0LDE3LjU3MyBDNjAuNjI2LDE3LjE4NSA2MS4zNSwxNy4wMDEgNjIuMDUzLDE3LjAwMSBDNjMuMzc5LDE3LjAwMSA2NC42MjUsMTcuNjYgNjUuMjgsMTguODU0IEw2NS4yODUsMTguODUxIEw2NS41MTIsMTkuMjY0IEw2NS41MDYsMTkuMjY4IEM2NS45MDksMjAuMDAzIDY2LjQwNSwyMC42OCA2Ni45ODMsMjEuMjg2IEw2Ny4yNiwyMS41NTYgQzY5LjE3NCwyMy40MDYgNzEuNzI4LDI0LjM1NyA3NC4zNzMsMjQuMzU3IEM3Ni4zMjIsMjQuMzU3IDc4LjMyMSwyMy44NCA4MC4xNDgsMjIuNzg1IEM4MC4xNjEsMjIuNzg1IDg3LjQ2NywxOC41NjYgODcuNDY3LDE4LjU2NiBDODguMTM5LDE4LjE3OCA4OC44NjMsMTcuOTk0IDg5LjU2NiwxNy45OTQgQzkwLjg5MiwxNy45OTQgOTIuMTM4LDE4LjY1MiA5Mi43OTIsMTkuODQ3IEw5Ni4wNDIsMjUuNzc1IEw5Ni4wNjQsMjUuNzU3IEwxMDIuODQ5LDI5LjY3NCBMMTAyLjc0NCwyOS40OTIgTDE0OS42MjUsMi41MjcgTTE0OS42MjUsMC44OTIgQzE0OS4zNDMsMC44OTIgMTQ5LjA2MiwwLjk2NSAxNDguODEsMS4xMSBMMTAyLjY0MSwyNy42NjYgTDk3LjIzMSwyNC41NDIgTDk0LjIyNiwxOS4wNjEgQzkzLjMxMywxNy4zOTQgOTEuNTI3LDE2LjM1OSA4OS41NjYsMTYuMzU4IEM4OC41NTUsMTYuMzU4IDg3LjU0NiwxNi42MzIgODYuNjQ5LDE3LjE1IEM4My44NzgsMTguNzUgNzkuNjg3LDIxLjE2OSA3OS4zNzQsMjEuMzQ1IEM3OS4zNTksMjEuMzUzIDc5LjM0NSwyMS4zNjEgNzkuMzMsMjEuMzY5IEM3Ny43OTgsMjIuMjU0IDc2LjA4NCwyMi43MjIgNzQuMzczLDIyLjcyMiBDNzIuMDgxLDIyLjcyMiA2OS45NTksMjEuODkgNjguMzk3LDIwLjM4IEw2OC4xNDUsMjAuMTM1IEM2Ny43MDYsMTkuNjcyIDY3LjMyMywxOS4xNTYgNjcuMDA2LDE4LjYwMSBDNjYuOTg4LDE4LjU1OSA2Ni45NjgsMTguNTE5IDY2Ljk0NiwxOC40NzkgTDY2LjcxOSwxOC4wNjUgQzY2LjY5LDE4LjAxMiA2Ni42NTgsMTcuOTYgNjYuNjI0LDE3LjkxMSBDNjUuNjg2LDE2LjMzNyA2My45NTEsMTUuMzY2IDYyLjA1MywxNS4zNjYgQzYxLjA0MiwxNS4zNjYgNjAuMDMzLDE1LjY0IDU5LjEzNiwxNi4xNTggTDMuMTI1LDQ4LjUwMiBDMC40MjYsNTAuMDYxIC0wLjYxMyw1My40NDIgMC44MTEsNTYuMDQgTDExLjA4OSw3NC43OSBDMTEuMjY2LDc1LjExMyAxMS41MzcsNzUuMzUzIDExLjg1LDc1LjQ5NCBMNTguMjc2LDEwMi4yOTggQzU5LjY3OSwxMDMuMTA4IDYxLjQzMywxMDMuNjMgNjMuMzQ4LDEwMy44MDYgQzYzLjgxMiwxMDMuODQ4IDY0LjI4NSwxMDMuODcgNjQuNzU0LDEwMy44NyBDNjUsMTAzLjg3IDY1LjI0OSwxMDMuODY0IDY1LjQ5NCwxMDMuODUyIEM2NS41NjMsMTAzLjg0OSA2NS42MzIsMTAzLjg0NyA2NS43MDEsMTAzLjg0NyBDNjUuNzY0LDEwMy44NDcgNjUuODI4LDEwMy44NDkgNjUuODksMTAzLjg1MiBDNjUuOTg2LDEwMy44NTYgNjYuMDgsMTAzLjg2MyA2Ni4xNzMsMTAzLjg3NCBDNjYuMjgyLDEwNS40NjcgNjcuMzMyLDEwNy4xOTcgNjguNzAyLDEwNy45ODggTDExMS4xNzQsMTMyLjUxIEMxMTEuNjk4LDEzMi44MTIgMTEyLjIzMiwxMzIuOTY1IDExMi43NjQsMTMyLjk2NSBDMTE0LjI2MSwxMzIuOTY1IDExNS4zNDcsMTMxLjc2NSAxMTUuMzQ3LDEzMC4xMTMgTDExNS4zNDcsMTAzLjU1MSBMMTIyLjQ1OCw5OS40NDYgQzEyMi44MTksOTkuMjM3IDEyMy4wODcsOTguODk4IDEyMy4yMDcsOTguNDk4IEwxMjcuODY1LDgyLjkwNSBDMTMyLjI3OSw4My43MDIgMTM2LjU1Nyw4NC43NTMgMTQwLjYwNyw4Ni4wMzMgTDE0MS4xNCw4Ni44NjIgQzE0MS40NTEsODcuMzQ2IDE0MS45NzcsODcuNjEzIDE0Mi41MTYsODcuNjEzIEMxNDIuNzk0LDg3LjYxMyAxNDMuMDc2LDg3LjU0MiAxNDMuMzMzLDg3LjM5MyBMMTY5Ljg2NSw3Mi4wNzYgTDE5Myw4NS40MzMgQzE5My41MjMsODUuNzM1IDE5NC4wNTgsODUuODg4IDE5NC41OSw4NS44ODggQzE5Ni4wODcsODUuODg4IDE5Ny4xNzMsODQuNjg5IDE5Ny4xNzMsODMuMDM2IEwxOTcuMTczLDI5LjAzNSBDMTk3LjE3MywyOC40NTEgMTk2Ljg2MSwyNy45MTEgMTk2LjM1NSwyNy42MTkgQzE5Ni4zNTUsMjcuNjE5IDE3MS44NDMsMTMuNDY3IDE3MC4zODUsMTIuNjI2IEMxNzAuMTMyLDEyLjQ4IDE2OS44NSwxMi40MDcgMTY5LjU2OCwxMi40MDcgQzE2OS4yODUsMTIuNDA3IDE2OS4wMDIsMTIuNDgxIDE2OC43NDksMTIuNjI3IEMxNjguMTQzLDEyLjk3OCAxNjUuNzU2LDE0LjM1NyAxNjQuNDI0LDE1LjEyNSBMMTU5LjYxNSwxMC44NyBDMTU4Ljc5NiwxMC4xNDUgMTU4LjE1NCw4LjkzNyAxNTguMDU0LDcuOTM0IEMxNTguMDQ1LDcuODM3IDE1OC4wMzQsNy43MzkgMTU4LjAyMSw3LjY0IEMxNTguMDA1LDcuNTIzIDE1Ny45OTgsNy40MSAxNTcuOTk4LDcuMzA0IEwxNTcuOTk4LDYuNDE4IEMxNTcuOTk4LDUuODM0IDE1Ny42ODYsNS4yOTUgMTU3LjE4MSw1LjAwMiBDMTU2LjYyNCw0LjY4IDE1MC40NDIsMS4xMTEgMTUwLjQ0MiwxLjExMSBDMTUwLjE4OSwwLjk2NSAxNDkuOTA3LDAuODkyIDE0OS42MjUsMC44OTIiIGlkPSJGaWxsLTEiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTYuMDI3LDI1LjYzNiBMMTQyLjYwMyw1Mi41MjcgQzE0My44MDcsNTMuMjIyIDE0NC41ODIsNTQuMTE0IDE0NC44NDUsNTUuMDY4IEwxNDQuODM1LDU1LjA3NSBMNjMuNDYxLDEwMi4wNTcgTDYzLjQ2LDEwMi4wNTcgQzYxLjgwNiwxMDEuOTA1IDYwLjI2MSwxMDEuNDU3IDU5LjA1NywxMDAuNzYyIEwxMi40ODEsNzMuODcxIEw5Ni4wMjcsMjUuNjM2IiBpZD0iRmlsbC0yIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYzLjQ2MSwxMDIuMTc0IEM2My40NTMsMTAyLjE3NCA2My40NDYsMTAyLjE3NCA2My40MzksMTAyLjE3MiBDNjEuNzQ2LDEwMi4wMTYgNjAuMjExLDEwMS41NjMgNTguOTk4LDEwMC44NjMgTDEyLjQyMiw3My45NzMgQzEyLjM4Niw3My45NTIgMTIuMzY0LDczLjkxNCAxMi4zNjQsNzMuODcxIEMxMi4zNjQsNzMuODMgMTIuMzg2LDczLjc5MSAxMi40MjIsNzMuNzcgTDk1Ljk2OCwyNS41MzUgQzk2LjAwNCwyNS41MTQgOTYuMDQ5LDI1LjUxNCA5Ni4wODUsMjUuNTM1IEwxNDIuNjYxLDUyLjQyNiBDMTQzLjg4OCw1My4xMzQgMTQ0LjY4Miw1NC4wMzggMTQ0Ljk1Nyw1NS4wMzcgQzE0NC45Nyw1NS4wODMgMTQ0Ljk1Myw1NS4xMzMgMTQ0LjkxNSw1NS4xNjEgQzE0NC45MTEsNTUuMTY1IDE0NC44OTgsNTUuMTc0IDE0NC44OTQsNTUuMTc3IEw2My41MTksMTAyLjE1OCBDNjMuNTAxLDEwMi4xNjkgNjMuNDgxLDEwMi4xNzQgNjMuNDYxLDEwMi4xNzQgTDYzLjQ2MSwxMDIuMTc0IFogTTEyLjcxNCw3My44NzEgTDU5LjExNSwxMDAuNjYxIEM2MC4yOTMsMTAxLjM0MSA2MS43ODYsMTAxLjc4MiA2My40MzUsMTAxLjkzNyBMMTQ0LjcwNyw1NS4wMTUgQzE0NC40MjgsNTQuMTA4IDE0My42ODIsNTMuMjg1IDE0Mi41NDQsNTIuNjI4IEw5Ni4wMjcsMjUuNzcxIEwxMi43MTQsNzMuODcxIEwxMi43MTQsNzMuODcxIFoiIGlkPSJGaWxsLTMiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ4LjMyNyw1OC40NzEgQzE0OC4xNDUsNTguNDggMTQ3Ljk2Miw1OC40OCAxNDcuNzgxLDU4LjQ3MiBDMTQ1Ljg4Nyw1OC4zODkgMTQ0LjQ3OSw1Ny40MzQgMTQ0LjYzNiw1Ni4zNCBDMTQ0LjY4OSw1NS45NjcgMTQ0LjY2NCw1NS41OTcgMTQ0LjU2NCw1NS4yMzUgTDYzLjQ2MSwxMDIuMDU3IEM2NC4wODksMTAyLjExNSA2NC43MzMsMTAyLjEzIDY1LjM3OSwxMDIuMDk5IEM2NS41NjEsMTAyLjA5IDY1Ljc0MywxMDIuMDkgNjUuOTI1LDEwMi4wOTggQzY3LjgxOSwxMDIuMTgxIDY5LjIyNywxMDMuMTM2IDY5LjA3LDEwNC4yMyBMMTQ4LjMyNyw1OC40NzEiIGlkPSJGaWxsLTQiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjkuMDcsMTA0LjM0NyBDNjkuMDQ4LDEwNC4zNDcgNjkuMDI1LDEwNC4zNCA2OS4wMDUsMTA0LjMyNyBDNjguOTY4LDEwNC4zMDEgNjguOTQ4LDEwNC4yNTcgNjguOTU1LDEwNC4yMTMgQzY5LDEwMy44OTYgNjguODk4LDEwMy41NzYgNjguNjU4LDEwMy4yODggQzY4LjE1MywxMDIuNjc4IDY3LjEwMywxMDIuMjY2IDY1LjkyLDEwMi4yMTQgQzY1Ljc0MiwxMDIuMjA2IDY1LjU2MywxMDIuMjA3IDY1LjM4NSwxMDIuMjE1IEM2NC43NDIsMTAyLjI0NiA2NC4wODcsMTAyLjIzMiA2My40NSwxMDIuMTc0IEM2My4zOTksMTAyLjE2OSA2My4zNTgsMTAyLjEzMiA2My4zNDcsMTAyLjA4MiBDNjMuMzM2LDEwMi4wMzMgNjMuMzU4LDEwMS45ODEgNjMuNDAyLDEwMS45NTYgTDE0NC41MDYsNTUuMTM0IEMxNDQuNTM3LDU1LjExNiAxNDQuNTc1LDU1LjExMyAxNDQuNjA5LDU1LjEyNyBDMTQ0LjY0Miw1NS4xNDEgMTQ0LjY2OCw1NS4xNyAxNDQuNjc3LDU1LjIwNCBDMTQ0Ljc4MSw1NS41ODUgMTQ0LjgwNiw1NS45NzIgMTQ0Ljc1MSw1Ni4zNTcgQzE0NC43MDYsNTYuNjczIDE0NC44MDgsNTYuOTk0IDE0NS4wNDcsNTcuMjgyIEMxNDUuNTUzLDU3Ljg5MiAxNDYuNjAyLDU4LjMwMyAxNDcuNzg2LDU4LjM1NSBDMTQ3Ljk2NCw1OC4zNjMgMTQ4LjE0Myw1OC4zNjMgMTQ4LjMyMSw1OC4zNTQgQzE0OC4zNzcsNTguMzUyIDE0OC40MjQsNTguMzg3IDE0OC40MzksNTguNDM4IEMxNDguNDU0LDU4LjQ5IDE0OC40MzIsNTguNTQ1IDE0OC4zODUsNTguNTcyIEw2OS4xMjksMTA0LjMzMSBDNjkuMTExLDEwNC4zNDIgNjkuMDksMTA0LjM0NyA2OS4wNywxMDQuMzQ3IEw2OS4wNywxMDQuMzQ3IFogTTY1LjY2NSwxMDEuOTc1IEM2NS43NTQsMTAxLjk3NSA2NS44NDIsMTAxLjk3NyA2NS45MywxMDEuOTgxIEM2Ny4xOTYsMTAyLjAzNyA2OC4yODMsMTAyLjQ2OSA2OC44MzgsMTAzLjEzOSBDNjkuMDY1LDEwMy40MTMgNjkuMTg4LDEwMy43MTQgNjkuMTk4LDEwNC4wMjEgTDE0Ny44ODMsNTguNTkyIEMxNDcuODQ3LDU4LjU5MiAxNDcuODExLDU4LjU5MSAxNDcuNzc2LDU4LjU4OSBDMTQ2LjUwOSw1OC41MzMgMTQ1LjQyMiw1OC4xIDE0NC44NjcsNTcuNDMxIEMxNDQuNTg1LDU3LjA5MSAxNDQuNDY1LDU2LjcwNyAxNDQuNTIsNTYuMzI0IEMxNDQuNTYzLDU2LjAyMSAxNDQuNTUyLDU1LjcxNiAxNDQuNDg4LDU1LjQxNCBMNjMuODQ2LDEwMS45NyBDNjQuMzUzLDEwMi4wMDIgNjQuODY3LDEwMi4wMDYgNjUuMzc0LDEwMS45ODIgQzY1LjQ3MSwxMDEuOTc3IDY1LjU2OCwxMDEuOTc1IDY1LjY2NSwxMDEuOTc1IEw2NS42NjUsMTAxLjk3NSBaIiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIuMjA4LDU1LjEzNCBDMS4yMDcsNTMuMzA3IDEuOTY3LDUwLjkxNyAzLjkwNiw0OS43OTcgTDU5LjkxNywxNy40NTMgQzYxLjg1NiwxNi4zMzMgNjQuMjQxLDE2LjkwNyA2NS4yNDMsMTguNzM0IEw2NS40NzUsMTkuMTQ0IEM2NS44NzIsMTkuODgyIDY2LjM2OCwyMC41NiA2Ni45NDUsMjEuMTY1IEw2Ny4yMjMsMjEuNDM1IEM3MC41NDgsMjQuNjQ5IDc1LjgwNiwyNS4xNTEgODAuMTExLDIyLjY2NSBMODcuNDMsMTguNDQ1IEM4OS4zNywxNy4zMjYgOTEuNzU0LDE3Ljg5OSA5Mi43NTUsMTkuNzI3IEw5Ni4wMDUsMjUuNjU1IEwxMi40ODYsNzMuODg0IEwyLjIwOCw1NS4xMzQgWiIgaWQ9IkZpbGwtNiIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi40ODYsNzQuMDAxIEMxMi40NzYsNzQuMDAxIDEyLjQ2NSw3My45OTkgMTIuNDU1LDczLjk5NiBDMTIuNDI0LDczLjk4OCAxMi4zOTksNzMuOTY3IDEyLjM4NCw3My45NCBMMi4xMDYsNTUuMTkgQzEuMDc1LDUzLjMxIDEuODU3LDUwLjg0NSAzLjg0OCw0OS42OTYgTDU5Ljg1OCwxNy4zNTIgQzYwLjUyNSwxNi45NjcgNjEuMjcxLDE2Ljc2NCA2Mi4wMTYsMTYuNzY0IEM2My40MzEsMTYuNzY0IDY0LjY2NiwxNy40NjYgNjUuMzI3LDE4LjY0NiBDNjUuMzM3LDE4LjY1NCA2NS4zNDUsMTguNjYzIDY1LjM1MSwxOC42NzQgTDY1LjU3OCwxOS4wODggQzY1LjU4NCwxOS4xIDY1LjU4OSwxOS4xMTIgNjUuNTkxLDE5LjEyNiBDNjUuOTg1LDE5LjgzOCA2Ni40NjksMjAuNDk3IDY3LjAzLDIxLjA4NSBMNjcuMzA1LDIxLjM1MSBDNjkuMTUxLDIzLjEzNyA3MS42NDksMjQuMTIgNzQuMzM2LDI0LjEyIEM3Ni4zMTMsMjQuMTIgNzguMjksMjMuNTgyIDgwLjA1MywyMi41NjMgQzgwLjA2NCwyMi41NTcgODAuMDc2LDIyLjU1MyA4MC4wODgsMjIuNTUgTDg3LjM3MiwxOC4zNDQgQzg4LjAzOCwxNy45NTkgODguNzg0LDE3Ljc1NiA4OS41MjksMTcuNzU2IEM5MC45NTYsMTcuNzU2IDkyLjIwMSwxOC40NzIgOTIuODU4LDE5LjY3IEw5Ni4xMDcsMjUuNTk5IEM5Ni4xMzgsMjUuNjU0IDk2LjExOCwyNS43MjQgOTYuMDYzLDI1Ljc1NiBMMTIuNTQ1LDczLjk4NSBDMTIuNTI2LDczLjk5NiAxMi41MDYsNzQuMDAxIDEyLjQ4Niw3NC4wMDEgTDEyLjQ4Niw3NC4wMDEgWiBNNjIuMDE2LDE2Ljk5NyBDNjEuMzEyLDE2Ljk5NyA2MC42MDYsMTcuMTkgNTkuOTc1LDE3LjU1NCBMMy45NjUsNDkuODk5IEMyLjA4Myw1MC45ODUgMS4zNDEsNTMuMzA4IDIuMzEsNTUuMDc4IEwxMi41MzEsNzMuNzIzIEw5NS44NDgsMjUuNjExIEw5Mi42NTMsMTkuNzgyIEM5Mi4wMzgsMTguNjYgOTAuODcsMTcuOTkgODkuNTI5LDE3Ljk5IEM4OC44MjUsMTcuOTkgODguMTE5LDE4LjE4MiA4Ny40ODksMTguNTQ3IEw4MC4xNzIsMjIuNzcyIEM4MC4xNjEsMjIuNzc4IDgwLjE0OSwyMi43ODIgODAuMTM3LDIyLjc4NSBDNzguMzQ2LDIzLjgxMSA3Ni4zNDEsMjQuMzU0IDc0LjMzNiwyNC4zNTQgQzcxLjU4OCwyNC4zNTQgNjkuMDMzLDIzLjM0NyA2Ny4xNDIsMjEuNTE5IEw2Ni44NjQsMjEuMjQ5IEM2Ni4yNzcsMjAuNjM0IDY1Ljc3NCwxOS45NDcgNjUuMzY3LDE5LjIwMyBDNjUuMzYsMTkuMTkyIDY1LjM1NiwxOS4xNzkgNjUuMzU0LDE5LjE2NiBMNjUuMTYzLDE4LjgxOSBDNjUuMTU0LDE4LjgxMSA2NS4xNDYsMTguODAxIDY1LjE0LDE4Ljc5IEM2NC41MjUsMTcuNjY3IDYzLjM1NywxNi45OTcgNjIuMDE2LDE2Ljk5NyBMNjIuMDE2LDE2Ljk5NyBaIiBpZD0iRmlsbC03IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQyLjQzNCw0OC44MDggTDQyLjQzNCw0OC44MDggQzM5LjkyNCw0OC44MDcgMzcuNzM3LDQ3LjU1IDM2LjU4Miw0NS40NDMgQzM0Ljc3MSw0Mi4xMzkgMzYuMTQ0LDM3LjgwOSAzOS42NDEsMzUuNzg5IEw1MS45MzIsMjguNjkxIEM1My4xMDMsMjguMDE1IDU0LjQxMywyNy42NTggNTUuNzIxLDI3LjY1OCBDNTguMjMxLDI3LjY1OCA2MC40MTgsMjguOTE2IDYxLjU3MywzMS4wMjMgQzYzLjM4NCwzNC4zMjcgNjIuMDEyLDM4LjY1NyA1OC41MTQsNDAuNjc3IEw0Ni4yMjMsNDcuNzc1IEM0NS4wNTMsNDguNDUgNDMuNzQyLDQ4LjgwOCA0Mi40MzQsNDguODA4IEw0Mi40MzQsNDguODA4IFogTTU1LjcyMSwyOC4xMjUgQzU0LjQ5NSwyOC4xMjUgNTMuMjY1LDI4LjQ2MSA1Mi4xNjYsMjkuMDk2IEwzOS44NzUsMzYuMTk0IEMzNi41OTYsMzguMDg3IDM1LjMwMiw0Mi4xMzYgMzYuOTkyLDQ1LjIxOCBDMzguMDYzLDQ3LjE3MyA0MC4wOTgsNDguMzQgNDIuNDM0LDQ4LjM0IEM0My42NjEsNDguMzQgNDQuODksNDguMDA1IDQ1Ljk5LDQ3LjM3IEw1OC4yODEsNDAuMjcyIEM2MS41NiwzOC4zNzkgNjIuODUzLDM0LjMzIDYxLjE2NCwzMS4yNDggQzYwLjA5MiwyOS4yOTMgNTguMDU4LDI4LjEyNSA1NS43MjEsMjguMTI1IEw1NS43MjEsMjguMTI1IFoiIGlkPSJGaWxsLTgiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjU4OCwyLjQwNyBDMTQ5LjU4OCwyLjQwNyAxNTUuNzY4LDUuOTc1IDE1Ni4zMjUsNi4yOTcgTDE1Ni4zMjUsNy4xODQgQzE1Ni4zMjUsNy4zNiAxNTYuMzM4LDcuNTQ0IDE1Ni4zNjIsNy43MzMgQzE1Ni4zNzMsNy44MTQgMTU2LjM4Miw3Ljg5NCAxNTYuMzksNy45NzUgQzE1Ni41Myw5LjM5IDE1Ny4zNjMsMTAuOTczIDE1OC40OTUsMTEuOTc0IEwxNjUuODkxLDE4LjUxOSBDMTY2LjA2OCwxOC42NzUgMTY2LjI0OSwxOC44MTQgMTY2LjQzMiwxOC45MzQgQzE2OC4wMTEsMTkuOTc0IDE2OS4zODIsMTkuNCAxNjkuNDk0LDE3LjY1MiBDMTY5LjU0MywxNi44NjggMTY5LjU1MSwxNi4wNTcgMTY5LjUxNywxNS4yMjMgTDE2OS41MTQsMTUuMDYzIEwxNjkuNTE0LDEzLjkxMiBDMTcwLjc4LDE0LjY0MiAxOTUuNTAxLDI4LjkxNSAxOTUuNTAxLDI4LjkxNSBMMTk1LjUwMSw4Mi45MTUgQzE5NS41MDEsODQuMDA1IDE5NC43MzEsODQuNDQ1IDE5My43ODEsODMuODk3IEwxNTEuMzA4LDU5LjM3NCBDMTUwLjM1OCw1OC44MjYgMTQ5LjU4OCw1Ny40OTcgMTQ5LjU4OCw1Ni40MDggTDE0OS41ODgsMjIuMzc1IiBpZD0iRmlsbC05IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE5NC41NTMsODQuMjUgQzE5NC4yOTYsODQuMjUgMTk0LjAxMyw4NC4xNjUgMTkzLjcyMiw4My45OTcgTDE1MS4yNSw1OS40NzYgQzE1MC4yNjksNTguOTA5IDE0OS40NzEsNTcuNTMzIDE0OS40NzEsNTYuNDA4IEwxNDkuNDcxLDIyLjM3NSBMMTQ5LjcwNSwyMi4zNzUgTDE0OS43MDUsNTYuNDA4IEMxNDkuNzA1LDU3LjQ1OSAxNTAuNDUsNTguNzQ0IDE1MS4zNjYsNTkuMjc0IEwxOTMuODM5LDgzLjc5NSBDMTk0LjI2Myw4NC4wNCAxOTQuNjU1LDg0LjA4MyAxOTQuOTQyLDgzLjkxNyBDMTk1LjIyNyw4My43NTMgMTk1LjM4NCw4My4zOTcgMTk1LjM4NCw4Mi45MTUgTDE5NS4zODQsMjguOTgyIEMxOTQuMTAyLDI4LjI0MiAxNzIuMTA0LDE1LjU0MiAxNjkuNjMxLDE0LjExNCBMMTY5LjYzNCwxNS4yMiBDMTY5LjY2OCwxNi4wNTIgMTY5LjY2LDE2Ljg3NCAxNjkuNjEsMTcuNjU5IEMxNjkuNTU2LDE4LjUwMyAxNjkuMjE0LDE5LjEyMyAxNjguNjQ3LDE5LjQwNSBDMTY4LjAyOCwxOS43MTQgMTY3LjE5NywxOS41NzggMTY2LjM2NywxOS4wMzIgQzE2Ni4xODEsMTguOTA5IDE2NS45OTUsMTguNzY2IDE2NS44MTQsMTguNjA2IEwxNTguNDE3LDEyLjA2MiBDMTU3LjI1OSwxMS4wMzYgMTU2LjQxOCw5LjQzNyAxNTYuMjc0LDcuOTg2IEMxNTYuMjY2LDcuOTA3IDE1Ni4yNTcsNy44MjcgMTU2LjI0Nyw3Ljc0OCBDMTU2LjIyMSw3LjU1NSAxNTYuMjA5LDcuMzY1IDE1Ni4yMDksNy4xODQgTDE1Ni4yMDksNi4zNjQgQzE1NS4zNzUsNS44ODMgMTQ5LjUyOSwyLjUwOCAxNDkuNTI5LDIuNTA4IEwxNDkuNjQ2LDIuMzA2IEMxNDkuNjQ2LDIuMzA2IDE1NS44MjcsNS44NzQgMTU2LjM4NCw2LjE5NiBMMTU2LjQ0Miw2LjIzIEwxNTYuNDQyLDcuMTg0IEMxNTYuNDQyLDcuMzU1IDE1Ni40NTQsNy41MzUgMTU2LjQ3OCw3LjcxNyBDMTU2LjQ4OSw3LjggMTU2LjQ5OSw3Ljg4MiAxNTYuNTA3LDcuOTYzIEMxNTYuNjQ1LDkuMzU4IDE1Ny40NTUsMTAuODk4IDE1OC41NzIsMTEuODg2IEwxNjUuOTY5LDE4LjQzMSBDMTY2LjE0MiwxOC41ODQgMTY2LjMxOSwxOC43MiAxNjYuNDk2LDE4LjgzNyBDMTY3LjI1NCwxOS4zMzYgMTY4LDE5LjQ2NyAxNjguNTQzLDE5LjE5NiBDMTY5LjAzMywxOC45NTMgMTY5LjMyOSwxOC40MDEgMTY5LjM3NywxNy42NDUgQzE2OS40MjcsMTYuODY3IDE2OS40MzQsMTYuMDU0IDE2OS40MDEsMTUuMjI4IEwxNjkuMzk3LDE1LjA2NSBMMTY5LjM5NywxMy43MSBMMTY5LjU3MiwxMy44MSBDMTcwLjgzOSwxNC41NDEgMTk1LjU1OSwyOC44MTQgMTk1LjU1OSwyOC44MTQgTDE5NS42MTgsMjguODQ3IEwxOTUuNjE4LDgyLjkxNSBDMTk1LjYxOCw4My40ODQgMTk1LjQyLDgzLjkxMSAxOTUuMDU5LDg0LjExOSBDMTk0LjkwOCw4NC4yMDYgMTk0LjczNyw4NC4yNSAxOTQuNTUzLDg0LjI1IiBpZD0iRmlsbC0xMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDUuNjg1LDU2LjE2MSBMMTY5LjgsNzAuMDgzIEwxNDMuODIyLDg1LjA4MSBMMTQyLjM2LDg0Ljc3NCBDMTM1LjgyNiw4Mi42MDQgMTI4LjczMiw4MS4wNDYgMTIxLjM0MSw4MC4xNTggQzExNi45NzYsNzkuNjM0IDExMi42NzgsODEuMjU0IDExMS43NDMsODMuNzc4IEMxMTEuNTA2LDg0LjQxNCAxMTEuNTAzLDg1LjA3MSAxMTEuNzMyLDg1LjcwNiBDMTEzLjI3LDg5Ljk3MyAxMTUuOTY4LDk0LjA2OSAxMTkuNzI3LDk3Ljg0MSBMMTIwLjI1OSw5OC42ODYgQzEyMC4yNiw5OC42ODUgOTQuMjgyLDExMy42ODMgOTQuMjgyLDExMy42ODMgTDcwLjE2Nyw5OS43NjEgTDE0NS42ODUsNTYuMTYxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NC4yODIsMTEzLjgxOCBMOTQuMjIzLDExMy43ODUgTDY5LjkzMyw5OS43NjEgTDcwLjEwOCw5OS42NiBMMTQ1LjY4NSw1Ni4wMjYgTDE0NS43NDMsNTYuMDU5IEwxNzAuMDMzLDcwLjA4MyBMMTQzLjg0Miw4NS4yMDUgTDE0My43OTcsODUuMTk1IEMxNDMuNzcyLDg1LjE5IDE0Mi4zMzYsODQuODg4IDE0Mi4zMzYsODQuODg4IEMxMzUuNzg3LDgyLjcxNCAxMjguNzIzLDgxLjE2MyAxMjEuMzI3LDgwLjI3NCBDMTIwLjc4OCw4MC4yMDkgMTIwLjIzNiw4MC4xNzcgMTE5LjY4OSw4MC4xNzcgQzExNS45MzEsODAuMTc3IDExMi42MzUsODEuNzA4IDExMS44NTIsODMuODE5IEMxMTEuNjI0LDg0LjQzMiAxMTEuNjIxLDg1LjA1MyAxMTEuODQyLDg1LjY2NyBDMTEzLjM3Nyw4OS45MjUgMTE2LjA1OCw5My45OTMgMTE5LjgxLDk3Ljc1OCBMMTE5LjgyNiw5Ny43NzkgTDEyMC4zNTIsOTguNjE0IEMxMjAuMzU0LDk4LjYxNyAxMjAuMzU2LDk4LjYyIDEyMC4zNTgsOTguNjI0IEwxMjAuNDIyLDk4LjcyNiBMMTIwLjMxNyw5OC43ODcgQzEyMC4yNjQsOTguODE4IDk0LjU5OSwxMTMuNjM1IDk0LjM0LDExMy43ODUgTDk0LjI4MiwxMTMuODE4IEw5NC4yODIsMTEzLjgxOCBaIE03MC40MDEsOTkuNzYxIEw5NC4yODIsMTEzLjU0OSBMMTE5LjA4NCw5OS4yMjkgQzExOS42Myw5OC45MTQgMTE5LjkzLDk4Ljc0IDEyMC4xMDEsOTguNjU0IEwxMTkuNjM1LDk3LjkxNCBDMTE1Ljg2NCw5NC4xMjcgMTEzLjE2OCw5MC4wMzMgMTExLjYyMiw4NS43NDYgQzExMS4zODIsODUuMDc5IDExMS4zODYsODQuNDA0IDExMS42MzMsODMuNzM4IEMxMTIuNDQ4LDgxLjUzOSAxMTUuODM2LDc5Ljk0MyAxMTkuNjg5LDc5Ljk0MyBDMTIwLjI0Niw3OS45NDMgMTIwLjgwNiw3OS45NzYgMTIxLjM1NSw4MC4wNDIgQzEyOC43NjcsODAuOTMzIDEzNS44NDYsODIuNDg3IDE0Mi4zOTYsODQuNjYzIEMxNDMuMjMyLDg0LjgzOCAxNDMuNjExLDg0LjkxNyAxNDMuNzg2LDg0Ljk2NyBMMTY5LjU2Niw3MC4wODMgTDE0NS42ODUsNTYuMjk1IEw3MC40MDEsOTkuNzYxIEw3MC40MDEsOTkuNzYxIFoiIGlkPSJGaWxsLTEyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2Ny4yMywxOC45NzkgTDE2Ny4yMyw2OS44NSBMMTM5LjkwOSw4NS42MjMgTDEzMy40NDgsNzEuNDU2IEMxMzIuNTM4LDY5LjQ2IDEzMC4wMiw2OS43MTggMTI3LjgyNCw3Mi4wMyBDMTI2Ljc2OSw3My4xNCAxMjUuOTMxLDc0LjU4NSAxMjUuNDk0LDc2LjA0OCBMMTE5LjAzNCw5Ny42NzYgTDkxLjcxMiwxMTMuNDUgTDkxLjcxMiw2Mi41NzkgTDE2Ny4yMywxOC45NzkiIGlkPSJGaWxsLTEzIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTkxLjcxMiwxMTMuNTY3IEM5MS42OTIsMTEzLjU2NyA5MS42NzIsMTEzLjU2MSA5MS42NTMsMTEzLjU1MSBDOTEuNjE4LDExMy41MyA5MS41OTUsMTEzLjQ5MiA5MS41OTUsMTEzLjQ1IEw5MS41OTUsNjIuNTc5IEM5MS41OTUsNjIuNTM3IDkxLjYxOCw2Mi40OTkgOTEuNjUzLDYyLjQ3OCBMMTY3LjE3MiwxOC44NzggQzE2Ny4yMDgsMTguODU3IDE2Ny4yNTIsMTguODU3IDE2Ny4yODgsMTguODc4IEMxNjcuMzI0LDE4Ljg5OSAxNjcuMzQ3LDE4LjkzNyAxNjcuMzQ3LDE4Ljk3OSBMMTY3LjM0Nyw2OS44NSBDMTY3LjM0Nyw2OS44OTEgMTY3LjMyNCw2OS45MyAxNjcuMjg4LDY5Ljk1IEwxMzkuOTY3LDg1LjcyNSBDMTM5LjkzOSw4NS43NDEgMTM5LjkwNSw4NS43NDUgMTM5Ljg3Myw4NS43MzUgQzEzOS44NDIsODUuNzI1IDEzOS44MTYsODUuNzAyIDEzOS44MDIsODUuNjcyIEwxMzMuMzQyLDcxLjUwNCBDMTMyLjk2Nyw3MC42ODIgMTMyLjI4LDcwLjIyOSAxMzEuNDA4LDcwLjIyOSBDMTMwLjMxOSw3MC4yMjkgMTI5LjA0NCw3MC45MTUgMTI3LjkwOCw3Mi4xMSBDMTI2Ljg3NCw3My4yIDEyNi4wMzQsNzQuNjQ3IDEyNS42MDYsNzYuMDgyIEwxMTkuMTQ2LDk3LjcwOSBDMTE5LjEzNyw5Ny43MzggMTE5LjExOCw5Ny43NjIgMTE5LjA5Miw5Ny43NzcgTDkxLjc3LDExMy41NTEgQzkxLjc1MiwxMTMuNTYxIDkxLjczMiwxMTMuNTY3IDkxLjcxMiwxMTMuNTY3IEw5MS43MTIsMTEzLjU2NyBaIE05MS44MjksNjIuNjQ3IEw5MS44MjksMTEzLjI0OCBMMTE4LjkzNSw5Ny41OTggTDEyNS4zODIsNzYuMDE1IEMxMjUuODI3LDc0LjUyNSAxMjYuNjY0LDczLjA4MSAxMjcuNzM5LDcxLjk1IEMxMjguOTE5LDcwLjcwOCAxMzAuMjU2LDY5Ljk5NiAxMzEuNDA4LDY5Ljk5NiBDMTMyLjM3Nyw2OS45OTYgMTMzLjEzOSw3MC40OTcgMTMzLjU1NCw3MS40MDcgTDEzOS45NjEsODUuNDU4IEwxNjcuMTEzLDY5Ljc4MiBMMTY3LjExMywxOS4xODEgTDkxLjgyOSw2Mi42NDcgTDkxLjgyOSw2Mi42NDcgWiIgaWQ9IkZpbGwtMTQiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTY4LjU0MywxOS4yMTMgTDE2OC41NDMsNzAuMDgzIEwxNDEuMjIxLDg1Ljg1NyBMMTM0Ljc2MSw3MS42ODkgQzEzMy44NTEsNjkuNjk0IDEzMS4zMzMsNjkuOTUxIDEyOS4xMzcsNzIuMjYzIEMxMjguMDgyLDczLjM3NCAxMjcuMjQ0LDc0LjgxOSAxMjYuODA3LDc2LjI4MiBMMTIwLjM0Niw5Ny45MDkgTDkzLjAyNSwxMTMuNjgzIEw5My4wMjUsNjIuODEzIEwxNjguNTQzLDE5LjIxMyIgaWQ9IkZpbGwtMTUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTMuMDI1LDExMy44IEM5My4wMDUsMTEzLjggOTIuOTg0LDExMy43OTUgOTIuOTY2LDExMy43ODUgQzkyLjkzMSwxMTMuNzY0IDkyLjkwOCwxMTMuNzI1IDkyLjkwOCwxMTMuNjg0IEw5Mi45MDgsNjIuODEzIEM5Mi45MDgsNjIuNzcxIDkyLjkzMSw2Mi43MzMgOTIuOTY2LDYyLjcxMiBMMTY4LjQ4NCwxOS4xMTIgQzE2OC41MiwxOS4wOSAxNjguNTY1LDE5LjA5IDE2OC42MDEsMTkuMTEyIEMxNjguNjM3LDE5LjEzMiAxNjguNjYsMTkuMTcxIDE2OC42NiwxOS4yMTIgTDE2OC42Niw3MC4wODMgQzE2OC42Niw3MC4xMjUgMTY4LjYzNyw3MC4xNjQgMTY4LjYwMSw3MC4xODQgTDE0MS4yOCw4NS45NTggQzE0MS4yNTEsODUuOTc1IDE0MS4yMTcsODUuOTc5IDE0MS4xODYsODUuOTY4IEMxNDEuMTU0LDg1Ljk1OCAxNDEuMTI5LDg1LjkzNiAxNDEuMTE1LDg1LjkwNiBMMTM0LjY1NSw3MS43MzggQzEzNC4yOCw3MC45MTUgMTMzLjU5Myw3MC40NjMgMTMyLjcyLDcwLjQ2MyBDMTMxLjYzMiw3MC40NjMgMTMwLjM1Nyw3MS4xNDggMTI5LjIyMSw3Mi4zNDQgQzEyOC4xODYsNzMuNDMzIDEyNy4zNDcsNzQuODgxIDEyNi45MTksNzYuMzE1IEwxMjAuNDU4LDk3Ljk0MyBDMTIwLjQ1LDk3Ljk3MiAxMjAuNDMxLDk3Ljk5NiAxMjAuNDA1LDk4LjAxIEw5My4wODMsMTEzLjc4NSBDOTMuMDY1LDExMy43OTUgOTMuMDQ1LDExMy44IDkzLjAyNSwxMTMuOCBMOTMuMDI1LDExMy44IFogTTkzLjE0Miw2Mi44ODEgTDkzLjE0MiwxMTMuNDgxIEwxMjAuMjQ4LDk3LjgzMiBMMTI2LjY5NSw3Ni4yNDggQzEyNy4xNCw3NC43NTggMTI3Ljk3Nyw3My4zMTUgMTI5LjA1Miw3Mi4xODMgQzEzMC4yMzEsNzAuOTQyIDEzMS41NjgsNzAuMjI5IDEzMi43Miw3MC4yMjkgQzEzMy42ODksNzAuMjI5IDEzNC40NTIsNzAuNzMxIDEzNC44NjcsNzEuNjQxIEwxNDEuMjc0LDg1LjY5MiBMMTY4LjQyNiw3MC4wMTYgTDE2OC40MjYsMTkuNDE1IEw5My4xNDIsNjIuODgxIEw5My4xNDIsNjIuODgxIFoiIGlkPSJGaWxsLTE2IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS44LDcwLjA4MyBMMTQyLjQ3OCw4NS44NTcgTDEzNi4wMTgsNzEuNjg5IEMxMzUuMTA4LDY5LjY5NCAxMzIuNTksNjkuOTUxIDEzMC4zOTMsNzIuMjYzIEMxMjkuMzM5LDczLjM3NCAxMjguNSw3NC44MTkgMTI4LjA2NCw3Ni4yODIgTDEyMS42MDMsOTcuOTA5IEw5NC4yODIsMTEzLjY4MyBMOTQuMjgyLDYyLjgxMyBMMTY5LjgsMTkuMjEzIEwxNjkuOCw3MC4wODMgWiIgaWQ9IkZpbGwtMTciIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTQuMjgyLDExMy45MTcgQzk0LjI0MSwxMTMuOTE3IDk0LjIwMSwxMTMuOTA3IDk0LjE2NSwxMTMuODg2IEM5NC4wOTMsMTEzLjg0NSA5NC4wNDgsMTEzLjc2NyA5NC4wNDgsMTEzLjY4NCBMOTQuMDQ4LDYyLjgxMyBDOTQuMDQ4LDYyLjczIDk0LjA5Myw2Mi42NTIgOTQuMTY1LDYyLjYxMSBMMTY5LjY4MywxOS4wMSBDMTY5Ljc1NSwxOC45NjkgMTY5Ljg0NCwxOC45NjkgMTY5LjkxNywxOS4wMSBDMTY5Ljk4OSwxOS4wNTIgMTcwLjAzMywxOS4xMjkgMTcwLjAzMywxOS4yMTIgTDE3MC4wMzMsNzAuMDgzIEMxNzAuMDMzLDcwLjE2NiAxNjkuOTg5LDcwLjI0NCAxNjkuOTE3LDcwLjI4NSBMMTQyLjU5NSw4Ni4wNiBDMTQyLjUzOCw4Ni4wOTIgMTQyLjQ2OSw4Ni4xIDE0Mi40MDcsODYuMDggQzE0Mi4zNDQsODYuMDYgMTQyLjI5Myw4Ni4wMTQgMTQyLjI2Niw4NS45NTQgTDEzNS44MDUsNzEuNzg2IEMxMzUuNDQ1LDcwLjk5NyAxMzQuODEzLDcwLjU4IDEzMy45NzcsNzAuNTggQzEzMi45MjEsNzAuNTggMTMxLjY3Niw3MS4yNTIgMTMwLjU2Miw3Mi40MjQgQzEyOS41NCw3My41MDEgMTI4LjcxMSw3NC45MzEgMTI4LjI4Nyw3Ni4zNDggTDEyMS44MjcsOTcuOTc2IEMxMjEuODEsOTguMDM0IDEyMS43NzEsOTguMDgyIDEyMS43Miw5OC4xMTIgTDk0LjM5OCwxMTMuODg2IEM5NC4zNjIsMTEzLjkwNyA5NC4zMjIsMTEzLjkxNyA5NC4yODIsMTEzLjkxNyBMOTQuMjgyLDExMy45MTcgWiBNOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDExMy4yNzkgTDEyMS40MDYsOTcuNzU0IEwxMjcuODQsNzYuMjE1IEMxMjguMjksNzQuNzA4IDEyOS4xMzcsNzMuMjQ3IDEzMC4yMjQsNzIuMTAzIEMxMzEuNDI1LDcwLjgzOCAxMzIuNzkzLDcwLjExMiAxMzMuOTc3LDcwLjExMiBDMTM0Ljk5NSw3MC4xMTIgMTM1Ljc5NSw3MC42MzggMTM2LjIzLDcxLjU5MiBMMTQyLjU4NCw4NS41MjYgTDE2OS41NjYsNjkuOTQ4IEwxNjkuNTY2LDE5LjYxNyBMOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDYyLjk0OCBaIiBpZD0iRmlsbC0xOCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDkuODk0LDkyLjk0MyBMMTA5Ljg5NCw5Mi45NDMgQzEwOC4xMiw5Mi45NDMgMTA2LjY1Myw5Mi4yMTggMTA1LjY1LDkwLjgyMyBDMTA1LjU4Myw5MC43MzEgMTA1LjU5Myw5MC42MSAxMDUuNjczLDkwLjUyOSBDMTA1Ljc1Myw5MC40NDggMTA1Ljg4LDkwLjQ0IDEwNS45NzQsOTAuNTA2IEMxMDYuNzU0LDkxLjA1MyAxMDcuNjc5LDkxLjMzMyAxMDguNzI0LDkxLjMzMyBDMTEwLjA0Nyw5MS4zMzMgMTExLjQ3OCw5MC44OTQgMTEyLjk4LDkwLjAyNyBDMTE4LjI5MSw4Ni45NiAxMjIuNjExLDc5LjUwOSAxMjIuNjExLDczLjQxNiBDMTIyLjYxMSw3MS40ODkgMTIyLjE2OSw2OS44NTYgMTIxLjMzMyw2OC42OTIgQzEyMS4yNjYsNjguNiAxMjEuMjc2LDY4LjQ3MyAxMjEuMzU2LDY4LjM5MiBDMTIxLjQzNiw2OC4zMTEgMTIxLjU2Myw2OC4yOTkgMTIxLjY1Niw2OC4zNjUgQzEyMy4zMjcsNjkuNTM3IDEyNC4yNDcsNzEuNzQ2IDEyNC4yNDcsNzQuNTg0IEMxMjQuMjQ3LDgwLjgyNiAxMTkuODIxLDg4LjQ0NyAxMTQuMzgyLDkxLjU4NyBDMTEyLjgwOCw5Mi40OTUgMTExLjI5OCw5Mi45NDMgMTA5Ljg5NCw5Mi45NDMgTDEwOS44OTQsOTIuOTQzIFogTTEwNi45MjUsOTEuNDAxIEMxMDcuNzM4LDkyLjA1MiAxMDguNzQ1LDkyLjI3OCAxMDkuODkzLDkyLjI3OCBMMTA5Ljg5NCw5Mi4yNzggQzExMS4yMTUsOTIuMjc4IDExMi42NDcsOTEuOTUxIDExNC4xNDgsOTEuMDg0IEMxMTkuNDU5LDg4LjAxNyAxMjMuNzgsODAuNjIxIDEyMy43OCw3NC41MjggQzEyMy43OCw3Mi41NDkgMTIzLjMxNyw3MC45MjkgMTIyLjQ1NCw2OS43NjcgQzEyMi44NjUsNzAuODAyIDEyMy4wNzksNzIuMDQyIDEyMy4wNzksNzMuNDAyIEMxMjMuMDc5LDc5LjY0NSAxMTguNjUzLDg3LjI4NSAxMTMuMjE0LDkwLjQyNSBDMTExLjY0LDkxLjMzNCAxMTAuMTMsOTEuNzQyIDEwOC43MjQsOTEuNzQyIEMxMDguMDgzLDkxLjc0MiAxMDcuNDgxLDkxLjU5MyAxMDYuOTI1LDkxLjQwMSBMMTA2LjkyNSw5MS40MDEgWiIgaWQ9IkZpbGwtMTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjA5Nyw5MC4yMyBDMTE4LjQ4MSw4Ny4xMjIgMTIyLjg0NSw3OS41OTQgMTIyLjg0NSw3My40MTYgQzEyMi44NDUsNzEuMzY1IDEyMi4zNjIsNjkuNzI0IDEyMS41MjIsNjguNTU2IEMxMTkuNzM4LDY3LjMwNCAxMTcuMTQ4LDY3LjM2MiAxMTQuMjY1LDY5LjAyNiBDMTA4Ljg4MSw3Mi4xMzQgMTA0LjUxNyw3OS42NjIgMTA0LjUxNyw4NS44NCBDMTA0LjUxNyw4Ny44OTEgMTA1LDg5LjUzMiAxMDUuODQsOTAuNyBDMTA3LjYyNCw5MS45NTIgMTEwLjIxNCw5MS44OTQgMTEzLjA5Nyw5MC4yMyIgaWQ9IkZpbGwtMjAiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTA4LjcyNCw5MS42MTQgTDEwOC43MjQsOTEuNjE0IEMxMDcuNTgyLDkxLjYxNCAxMDYuNTY2LDkxLjQwMSAxMDUuNzA1LDkwLjc5NyBDMTA1LjY4NCw5MC43ODMgMTA1LjY2NSw5MC44MTEgMTA1LjY1LDkwLjc5IEMxMDQuNzU2LDg5LjU0NiAxMDQuMjgzLDg3Ljg0MiAxMDQuMjgzLDg1LjgxNyBDMTA0LjI4Myw3OS41NzUgMTA4LjcwOSw3MS45NTMgMTE0LjE0OCw2OC44MTIgQzExNS43MjIsNjcuOTA0IDExNy4yMzIsNjcuNDQ5IDExOC42MzgsNjcuNDQ5IEMxMTkuNzgsNjcuNDQ5IDEyMC43OTYsNjcuNzU4IDEyMS42NTYsNjguMzYyIEMxMjEuNjc4LDY4LjM3NyAxMjEuNjk3LDY4LjM5NyAxMjEuNzEyLDY4LjQxOCBDMTIyLjYwNiw2OS42NjIgMTIzLjA3OSw3MS4zOSAxMjMuMDc5LDczLjQxNSBDMTIzLjA3OSw3OS42NTggMTE4LjY1Myw4Ny4xOTggMTEzLjIxNCw5MC4zMzggQzExMS42NCw5MS4yNDcgMTEwLjEzLDkxLjYxNCAxMDguNzI0LDkxLjYxNCBMMTA4LjcyNCw5MS42MTQgWiBNMTA2LjAwNiw5MC41MDUgQzEwNi43OCw5MS4wMzcgMTA3LjY5NCw5MS4yODEgMTA4LjcyNCw5MS4yODEgQzExMC4wNDcsOTEuMjgxIDExMS40NzgsOTAuODY4IDExMi45OCw5MC4wMDEgQzExOC4yOTEsODYuOTM1IDEyMi42MTEsNzkuNDk2IDEyMi42MTEsNzMuNDAzIEMxMjIuNjExLDcxLjQ5NCAxMjIuMTc3LDY5Ljg4IDEyMS4zNTYsNjguNzE4IEMxMjAuNTgyLDY4LjE4NSAxMTkuNjY4LDY3LjkxOSAxMTguNjM4LDY3LjkxOSBDMTE3LjMxNSw2Ny45MTkgMTE1Ljg4Myw2OC4zNiAxMTQuMzgyLDY5LjIyNyBDMTA5LjA3MSw3Mi4yOTMgMTA0Ljc1MSw3OS43MzMgMTA0Ljc1MSw4NS44MjYgQzEwNC43NTEsODcuNzM1IDEwNS4xODUsODkuMzQzIDEwNi4wMDYsOTAuNTA1IEwxMDYuMDA2LDkwLjUwNSBaIiBpZD0iRmlsbC0yMSIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDkuMzE4LDcuMjYyIEwxMzkuMzM0LDE2LjE0IEwxNTUuMjI3LDI3LjE3MSBMMTYwLjgxNiwyMS4wNTkgTDE0OS4zMTgsNy4yNjIiIGlkPSJGaWxsLTIyIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS42NzYsMTMuODQgTDE1OS45MjgsMTkuNDY3IEMxNTYuMjg2LDIxLjU3IDE1MC40LDIxLjU4IDE0Ni43ODEsMTkuNDkxIEMxNDMuMTYxLDE3LjQwMiAxNDMuMTgsMTQuMDAzIDE0Ni44MjIsMTEuOSBMMTU2LjMxNyw2LjI5MiBMMTQ5LjU4OCwyLjQwNyBMNjcuNzUyLDQ5LjQ3OCBMMTEzLjY3NSw3NS45OTIgTDExNi43NTYsNzQuMjEzIEMxMTcuMzg3LDczLjg0OCAxMTcuNjI1LDczLjMxNSAxMTcuMzc0LDcyLjgyMyBDMTE1LjAxNyw2OC4xOTEgMTE0Ljc4MSw2My4yNzcgMTE2LjY5MSw1OC41NjEgQzEyMi4zMjksNDQuNjQxIDE0MS4yLDMzLjc0NiAxNjUuMzA5LDMwLjQ5MSBDMTczLjQ3OCwyOS4zODggMTgxLjk4OSwyOS41MjQgMTkwLjAxMywzMC44ODUgQzE5MC44NjUsMzEuMDMgMTkxLjc4OSwzMC44OTMgMTkyLjQyLDMwLjUyOCBMMTk1LjUwMSwyOC43NSBMMTY5LjY3NiwxMy44NCIgaWQ9IkZpbGwtMjMiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3Ni40NTkgQzExMy41OTQsNzYuNDU5IDExMy41MTQsNzYuNDM4IDExMy40NDIsNzYuMzk3IEw2Ny41MTgsNDkuODgyIEM2Ny4zNzQsNDkuNzk5IDY3LjI4NCw0OS42NDUgNjcuMjg1LDQ5LjQ3OCBDNjcuMjg1LDQ5LjMxMSA2Ny4zNzQsNDkuMTU3IDY3LjUxOSw0OS4wNzMgTDE0OS4zNTUsMi4wMDIgQzE0OS40OTksMS45MTkgMTQ5LjY3NywxLjkxOSAxNDkuODIxLDIuMDAyIEwxNTYuNTUsNS44ODcgQzE1Ni43NzQsNi4wMTcgMTU2Ljg1LDYuMzAyIDE1Ni43MjIsNi41MjYgQzE1Ni41OTIsNi43NDkgMTU2LjMwNyw2LjgyNiAxNTYuMDgzLDYuNjk2IEwxNDkuNTg3LDIuOTQ2IEw2OC42ODcsNDkuNDc5IEwxMTMuNjc1LDc1LjQ1MiBMMTE2LjUyMyw3My44MDggQzExNi43MTUsNzMuNjk3IDExNy4xNDMsNzMuMzk5IDExNi45NTgsNzMuMDM1IEMxMTQuNTQyLDY4LjI4NyAxMTQuMyw2My4yMjEgMTE2LjI1OCw1OC4zODUgQzExOS4wNjQsNTEuNDU4IDEyNS4xNDMsNDUuMTQzIDEzMy44NCw0MC4xMjIgQzE0Mi40OTcsMzUuMTI0IDE1My4zNTgsMzEuNjMzIDE2NS4yNDcsMzAuMDI4IEMxNzMuNDQ1LDI4LjkyMSAxODIuMDM3LDI5LjA1OCAxOTAuMDkxLDMwLjQyNSBDMTkwLjgzLDMwLjU1IDE5MS42NTIsMzAuNDMyIDE5Mi4xODYsMzAuMTI0IEwxOTQuNTY3LDI4Ljc1IEwxNjkuNDQyLDE0LjI0NCBDMTY5LjIxOSwxNC4xMTUgMTY5LjE0MiwxMy44MjkgMTY5LjI3MSwxMy42MDYgQzE2OS40LDEzLjM4MiAxNjkuNjg1LDEzLjMwNiAxNjkuOTA5LDEzLjQzNSBMMTk1LjczNCwyOC4zNDUgQzE5NS44NzksMjguNDI4IDE5NS45NjgsMjguNTgzIDE5NS45NjgsMjguNzUgQzE5NS45NjgsMjguOTE2IDE5NS44NzksMjkuMDcxIDE5NS43MzQsMjkuMTU0IEwxOTIuNjUzLDMwLjkzMyBDMTkxLjkzMiwzMS4zNSAxOTAuODksMzEuNTA4IDE4OS45MzUsMzEuMzQ2IEMxODEuOTcyLDI5Ljk5NSAxNzMuNDc4LDI5Ljg2IDE2NS4zNzIsMzAuOTU0IEMxNTMuNjAyLDMyLjU0MyAxNDIuODYsMzUuOTkzIDEzNC4zMDcsNDAuOTMxIEMxMjUuNzkzLDQ1Ljg0NyAxMTkuODUxLDUyLjAwNCAxMTcuMTI0LDU4LjczNiBDMTE1LjI3LDYzLjMxNCAxMTUuNTAxLDY4LjExMiAxMTcuNzksNzIuNjExIEMxMTguMTYsNzMuMzM2IDExNy44NDUsNzQuMTI0IDExNi45OSw3NC42MTcgTDExMy45MDksNzYuMzk3IEMxMTMuODM2LDc2LjQzOCAxMTMuNzU2LDc2LjQ1OSAxMTMuNjc1LDc2LjQ1OSIgaWQ9IkZpbGwtMjQiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUzLjMxNiwyMS4yNzkgQzE1MC45MDMsMjEuMjc5IDE0OC40OTUsMjAuNzUxIDE0Ni42NjQsMTkuNjkzIEMxNDQuODQ2LDE4LjY0NCAxNDMuODQ0LDE3LjIzMiAxNDMuODQ0LDE1LjcxOCBDMTQzLjg0NCwxNC4xOTEgMTQ0Ljg2LDEyLjc2MyAxNDYuNzA1LDExLjY5OCBMMTU2LjE5OCw2LjA5MSBDMTU2LjMwOSw2LjAyNSAxNTYuNDUyLDYuMDYyIDE1Ni41MTgsNi4xNzMgQzE1Ni41ODMsNi4yODQgMTU2LjU0Nyw2LjQyNyAxNTYuNDM2LDYuNDkzIEwxNDYuOTQsMTIuMTAyIEMxNDUuMjQ0LDEzLjA4MSAxNDQuMzEyLDE0LjM2NSAxNDQuMzEyLDE1LjcxOCBDMTQ0LjMxMiwxNy4wNTggMTQ1LjIzLDE4LjMyNiAxNDYuODk3LDE5LjI4OSBDMTUwLjQ0NiwyMS4zMzggMTU2LjI0LDIxLjMyNyAxNTkuODExLDE5LjI2NSBMMTY5LjU1OSwxMy42MzcgQzE2OS42NywxMy41NzMgMTY5LjgxMywxMy42MTEgMTY5Ljg3OCwxMy43MjMgQzE2OS45NDMsMTMuODM0IDE2OS45MDQsMTMuOTc3IDE2OS43OTMsMTQuMDQyIEwxNjAuMDQ1LDE5LjY3IEMxNTguMTg3LDIwLjc0MiAxNTUuNzQ5LDIxLjI3OSAxNTMuMzE2LDIxLjI3OSIgaWQ9IkZpbGwtMjUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3NS45OTIgTDY3Ljc2Miw0OS40ODQiIGlkPSJGaWxsLTI2IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMy42NzUsNzYuMzQyIEMxMTMuNjE1LDc2LjM0MiAxMTMuNTU1LDc2LjMyNyAxMTMuNSw3Ni4yOTUgTDY3LjU4Nyw0OS43ODcgQzY3LjQxOSw0OS42OSA2Ny4zNjIsNDkuNDc2IDY3LjQ1OSw0OS4zMDkgQzY3LjU1Niw0OS4xNDEgNjcuNzcsNDkuMDgzIDY3LjkzNyw0OS4xOCBMMTEzLjg1LDc1LjY4OCBDMTE0LjAxOCw3NS43ODUgMTE0LjA3NSw3NiAxMTMuOTc4LDc2LjE2NyBDMTEzLjkxNCw3Ni4yNzkgMTEzLjc5Niw3Ni4zNDIgMTEzLjY3NSw3Ni4zNDIiIGlkPSJGaWxsLTI3IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY3Ljc2Miw0OS40ODQgTDY3Ljc2MiwxMDMuNDg1IEM2Ny43NjIsMTA0LjU3NSA2OC41MzIsMTA1LjkwMyA2OS40ODIsMTA2LjQ1MiBMMTExLjk1NSwxMzAuOTczIEMxMTIuOTA1LDEzMS41MjIgMTEzLjY3NSwxMzEuMDgzIDExMy42NzUsMTI5Ljk5MyBMMTEzLjY3NSw3NS45OTIiIGlkPSJGaWxsLTI4IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMi43MjcsMTMxLjU2MSBDMTEyLjQzLDEzMS41NjEgMTEyLjEwNywxMzEuNDY2IDExMS43OCwxMzEuMjc2IEw2OS4zMDcsMTA2Ljc1NSBDNjguMjQ0LDEwNi4xNDIgNjcuNDEyLDEwNC43MDUgNjcuNDEyLDEwMy40ODUgTDY3LjQxMiw0OS40ODQgQzY3LjQxMiw0OS4yOSA2Ny41NjksNDkuMTM0IDY3Ljc2Miw0OS4xMzQgQzY3Ljk1Niw0OS4xMzQgNjguMTEzLDQ5LjI5IDY4LjExMyw0OS40ODQgTDY4LjExMywxMDMuNDg1IEM2OC4xMTMsMTA0LjQ0NSA2OC44MiwxMDUuNjY1IDY5LjY1NywxMDYuMTQ4IEwxMTIuMTMsMTMwLjY3IEMxMTIuNDc0LDEzMC44NjggMTEyLjc5MSwxMzAuOTEzIDExMywxMzAuNzkyIEMxMTMuMjA2LDEzMC42NzMgMTEzLjMyNSwxMzAuMzgxIDExMy4zMjUsMTI5Ljk5MyBMMTEzLjMyNSw3NS45OTIgQzExMy4zMjUsNzUuNzk4IDExMy40ODIsNzUuNjQxIDExMy42NzUsNzUuNjQxIEMxMTMuODY5LDc1LjY0MSAxMTQuMDI1LDc1Ljc5OCAxMTQuMDI1LDc1Ljk5MiBMMTE0LjAyNSwxMjkuOTkzIEMxMTQuMDI1LDEzMC42NDggMTEzLjc4NiwxMzEuMTQ3IDExMy4zNSwxMzEuMzk5IEMxMTMuMTYyLDEzMS41MDcgMTEyLjk1MiwxMzEuNTYxIDExMi43MjcsMTMxLjU2MSIgaWQ9IkZpbGwtMjkiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEyLjg2LDQwLjUxMiBDMTEyLjg2LDQwLjUxMiAxMTIuODYsNDAuNTEyIDExMi44NTksNDAuNTEyIEMxMTAuNTQxLDQwLjUxMiAxMDguMzYsMzkuOTkgMTA2LjcxNywzOS4wNDEgQzEwNS4wMTIsMzguMDU3IDEwNC4wNzQsMzYuNzI2IDEwNC4wNzQsMzUuMjkyIEMxMDQuMDc0LDMzLjg0NyAxMDUuMDI2LDMyLjUwMSAxMDYuNzU0LDMxLjUwNCBMMTE4Ljc5NSwyNC41NTEgQzEyMC40NjMsMjMuNTg5IDEyMi42NjksMjMuMDU4IDEyNS4wMDcsMjMuMDU4IEMxMjcuMzI1LDIzLjA1OCAxMjkuNTA2LDIzLjU4MSAxMzEuMTUsMjQuNTMgQzEzMi44NTQsMjUuNTE0IDEzMy43OTMsMjYuODQ1IDEzMy43OTMsMjguMjc4IEMxMzMuNzkzLDI5LjcyNCAxMzIuODQxLDMxLjA2OSAxMzEuMTEzLDMyLjA2NyBMMTE5LjA3MSwzOS4wMTkgQzExNy40MDMsMzkuOTgyIDExNS4xOTcsNDAuNTEyIDExMi44Niw0MC41MTIgTDExMi44Niw0MC41MTIgWiBNMTI1LjAwNywyMy43NTkgQzEyMi43OSwyMy43NTkgMTIwLjcwOSwyNC4yNTYgMTE5LjE0NiwyNS4xNTggTDEwNy4xMDQsMzIuMTEgQzEwNS42MDIsMzIuOTc4IDEwNC43NzQsMzQuMTA4IDEwNC43NzQsMzUuMjkyIEMxMDQuNzc0LDM2LjQ2NSAxMDUuNTg5LDM3LjU4MSAxMDcuMDY3LDM4LjQzNCBDMTA4LjYwNSwzOS4zMjMgMTEwLjY2MywzOS44MTIgMTEyLjg1OSwzOS44MTIgTDExMi44NiwzOS44MTIgQzExNS4wNzYsMzkuODEyIDExNy4xNTgsMzkuMzE1IDExOC43MjEsMzguNDEzIEwxMzAuNzYyLDMxLjQ2IEMxMzIuMjY0LDMwLjU5MyAxMzMuMDkyLDI5LjQ2MyAxMzMuMDkyLDI4LjI3OCBDMTMzLjA5MiwyNy4xMDYgMTMyLjI3OCwyNS45OSAxMzAuOCwyNS4xMzYgQzEyOS4yNjEsMjQuMjQ4IDEyNy4yMDQsMjMuNzU5IDEyNS4wMDcsMjMuNzU5IEwxMjUuMDA3LDIzLjc1OSBaIiBpZD0iRmlsbC0zMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNjUuNjMsMTYuMjE5IEwxNTkuODk2LDE5LjUzIEMxNTYuNzI5LDIxLjM1OCAxNTEuNjEsMjEuMzY3IDE0OC40NjMsMTkuNTUgQzE0NS4zMTYsMTcuNzMzIDE0NS4zMzIsMTQuNzc4IDE0OC40OTksMTIuOTQ5IEwxNTQuMjMzLDkuNjM5IEwxNjUuNjMsMTYuMjE5IiBpZD0iRmlsbC0zMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNTQuMjMzLDEwLjQ0OCBMMTY0LjIyOCwxNi4yMTkgTDE1OS41NDYsMTguOTIzIEMxNTguMTEyLDE5Ljc1IDE1Ni4xOTQsMjAuMjA2IDE1NC4xNDcsMjAuMjA2IEMxNTIuMTE4LDIwLjIwNiAxNTAuMjI0LDE5Ljc1NyAxNDguODE0LDE4Ljk0MyBDMTQ3LjUyNCwxOC4xOTkgMTQ2LjgxNCwxNy4yNDkgMTQ2LjgxNCwxNi4yNjkgQzE0Ni44MTQsMTUuMjc4IDE0Ny41MzcsMTQuMzE0IDE0OC44NSwxMy41NTYgTDE1NC4yMzMsMTAuNDQ4IE0xNTQuMjMzLDkuNjM5IEwxNDguNDk5LDEyLjk0OSBDMTQ1LjMzMiwxNC43NzggMTQ1LjMxNiwxNy43MzMgMTQ4LjQ2MywxOS41NSBDMTUwLjAzMSwyMC40NTUgMTUyLjA4NiwyMC45MDcgMTU0LjE0NywyMC45MDcgQzE1Ni4yMjQsMjAuOTA3IDE1OC4zMDYsMjAuNDQ3IDE1OS44OTYsMTkuNTMgTDE2NS42MywxNi4yMTkgTDE1NC4yMzMsOS42MzkiIGlkPSJGaWxsLTMyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NS40NDUsNzIuNjY3IEwxNDUuNDQ1LDcyLjY2NyBDMTQzLjY3Miw3Mi42NjcgMTQyLjIwNCw3MS44MTcgMTQxLjIwMiw3MC40MjIgQzE0MS4xMzUsNzAuMzMgMTQxLjE0NSw3MC4xNDcgMTQxLjIyNSw3MC4wNjYgQzE0MS4zMDUsNjkuOTg1IDE0MS40MzIsNjkuOTQ2IDE0MS41MjUsNzAuMDExIEMxNDIuMzA2LDcwLjU1OSAxNDMuMjMxLDcwLjgyMyAxNDQuMjc2LDcwLjgyMiBDMTQ1LjU5OCw3MC44MjIgMTQ3LjAzLDcwLjM3NiAxNDguNTMyLDY5LjUwOSBDMTUzLjg0Miw2Ni40NDMgMTU4LjE2Myw1OC45ODcgMTU4LjE2Myw1Mi44OTQgQzE1OC4xNjMsNTAuOTY3IDE1Ny43MjEsNDkuMzMyIDE1Ni44ODQsNDguMTY4IEMxNTYuODE4LDQ4LjA3NiAxNTYuODI4LDQ3Ljk0OCAxNTYuOTA4LDQ3Ljg2NyBDMTU2Ljk4OCw0Ny43ODYgMTU3LjExNCw0Ny43NzQgMTU3LjIwOCw0Ny44NCBDMTU4Ljg3OCw0OS4wMTIgMTU5Ljc5OCw1MS4yMiAxNTkuNzk4LDU0LjA1OSBDMTU5Ljc5OCw2MC4zMDEgMTU1LjM3Myw2OC4wNDYgMTQ5LjkzMyw3MS4xODYgQzE0OC4zNiw3Mi4wOTQgMTQ2Ljg1LDcyLjY2NyAxNDUuNDQ1LDcyLjY2NyBMMTQ1LjQ0NSw3Mi42NjcgWiBNMTQyLjQ3Niw3MSBDMTQzLjI5LDcxLjY1MSAxNDQuMjk2LDcyLjAwMiAxNDUuNDQ1LDcyLjAwMiBDMTQ2Ljc2Nyw3Mi4wMDIgMTQ4LjE5OCw3MS41NSAxNDkuNyw3MC42ODIgQzE1NS4wMSw2Ny42MTcgMTU5LjMzMSw2MC4xNTkgMTU5LjMzMSw1NC4wNjUgQzE1OS4zMzEsNTIuMDg1IDE1OC44NjgsNTAuNDM1IDE1OC4wMDYsNDkuMjcyIEMxNTguNDE3LDUwLjMwNyAxNTguNjMsNTEuNTMyIDE1OC42Myw1Mi44OTIgQzE1OC42Myw1OS4xMzQgMTU0LjIwNSw2Ni43NjcgMTQ4Ljc2NSw2OS45MDcgQzE0Ny4xOTIsNzAuODE2IDE0NS42ODEsNzEuMjgzIDE0NC4yNzYsNzEuMjgzIEMxNDMuNjM0LDcxLjI4MyAxNDMuMDMzLDcxLjE5MiAxNDIuNDc2LDcxIEwxNDIuNDc2LDcxIFoiIGlkPSJGaWxsLTMzIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0OC42NDgsNjkuNzA0IEMxNTQuMDMyLDY2LjU5NiAxNTguMzk2LDU5LjA2OCAxNTguMzk2LDUyLjg5MSBDMTU4LjM5Niw1MC44MzkgMTU3LjkxMyw0OS4xOTggMTU3LjA3NCw0OC4wMyBDMTU1LjI4OSw0Ni43NzggMTUyLjY5OSw0Ni44MzYgMTQ5LjgxNiw0OC41MDEgQzE0NC40MzMsNTEuNjA5IDE0MC4wNjgsNTkuMTM3IDE0MC4wNjgsNjUuMzE0IEMxNDAuMDY4LDY3LjM2NSAxNDAuNTUyLDY5LjAwNiAxNDEuMzkxLDcwLjE3NCBDMTQzLjE3Niw3MS40MjcgMTQ1Ljc2NSw3MS4zNjkgMTQ4LjY0OCw2OS43MDQiIGlkPSJGaWxsLTM0IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NC4yNzYsNzEuMjc2IEwxNDQuMjc2LDcxLjI3NiBDMTQzLjEzMyw3MS4yNzYgMTQyLjExOCw3MC45NjkgMTQxLjI1Nyw3MC4zNjUgQzE0MS4yMzYsNzAuMzUxIDE0MS4yMTcsNzAuMzMyIDE0MS4yMDIsNzAuMzExIEMxNDAuMzA3LDY5LjA2NyAxMzkuODM1LDY3LjMzOSAxMzkuODM1LDY1LjMxNCBDMTM5LjgzNSw1OS4wNzMgMTQ0LjI2LDUxLjQzOSAxNDkuNyw0OC4yOTggQzE1MS4yNzMsNDcuMzkgMTUyLjc4NCw0Ni45MjkgMTU0LjE4OSw0Ni45MjkgQzE1NS4zMzIsNDYuOTI5IDE1Ni4zNDcsNDcuMjM2IDE1Ny4yMDgsNDcuODM5IEMxNTcuMjI5LDQ3Ljg1NCAxNTcuMjQ4LDQ3Ljg3MyAxNTcuMjYzLDQ3Ljg5NCBDMTU4LjE1Nyw0OS4xMzggMTU4LjYzLDUwLjg2NSAxNTguNjMsNTIuODkxIEMxNTguNjMsNTkuMTMyIDE1NC4yMDUsNjYuNzY2IDE0OC43NjUsNjkuOTA3IEMxNDcuMTkyLDcwLjgxNSAxNDUuNjgxLDcxLjI3NiAxNDQuMjc2LDcxLjI3NiBMMTQ0LjI3Niw3MS4yNzYgWiBNMTQxLjU1OCw3MC4xMDQgQzE0Mi4zMzEsNzAuNjM3IDE0My4yNDUsNzEuMDA1IDE0NC4yNzYsNzEuMDA1IEMxNDUuNTk4LDcxLjAwNSAxNDcuMDMsNzAuNDY3IDE0OC41MzIsNjkuNiBDMTUzLjg0Miw2Ni41MzQgMTU4LjE2Myw1OS4wMzMgMTU4LjE2Myw1Mi45MzkgQzE1OC4xNjMsNTEuMDMxIDE1Ny43MjksNDkuMzg1IDE1Ni45MDcsNDguMjIzIEMxNTYuMTMzLDQ3LjY5MSAxNTUuMjE5LDQ3LjQwOSAxNTQuMTg5LDQ3LjQwOSBDMTUyLjg2Nyw0Ny40MDkgMTUxLjQzNSw0Ny44NDIgMTQ5LjkzMyw0OC43MDkgQzE0NC42MjMsNTEuNzc1IDE0MC4zMDIsNTkuMjczIDE0MC4zMDIsNjUuMzY2IEMxNDAuMzAyLDY3LjI3NiAxNDAuNzM2LDY4Ljk0MiAxNDEuNTU4LDcwLjEwNCBMMTQxLjU1OCw3MC4xMDQgWiIgaWQ9IkZpbGwtMzUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUwLjcyLDY1LjM2MSBMMTUwLjM1Nyw2NS4wNjYgQzE1MS4xNDcsNjQuMDkyIDE1MS44NjksNjMuMDQgMTUyLjUwNSw2MS45MzggQzE1My4zMTMsNjAuNTM5IDE1My45NzgsNTkuMDY3IDE1NC40ODIsNTcuNTYzIEwxNTQuOTI1LDU3LjcxMiBDMTU0LjQxMiw1OS4yNDUgMTUzLjczMyw2MC43NDUgMTUyLjkxLDYyLjE3MiBDMTUyLjI2Miw2My4yOTUgMTUxLjUyNSw2NC4zNjggMTUwLjcyLDY1LjM2MSIgaWQ9IkZpbGwtMzYiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE1LjkxNyw4NC41MTQgTDExNS41NTQsODQuMjIgQzExNi4zNDQsODMuMjQ1IDExNy4wNjYsODIuMTk0IDExNy43MDIsODEuMDkyIEMxMTguNTEsNzkuNjkyIDExOS4xNzUsNzguMjIgMTE5LjY3OCw3Ni43MTcgTDEyMC4xMjEsNzYuODY1IEMxMTkuNjA4LDc4LjM5OCAxMTguOTMsNzkuODk5IDExOC4xMDYsODEuMzI2IEMxMTcuNDU4LDgyLjQ0OCAxMTYuNzIyLDgzLjUyMSAxMTUuOTE3LDg0LjUxNCIgaWQ9IkZpbGwtMzciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE0LDEzMC40NzYgTDExNCwxMzAuMDA4IEwxMTQsNzYuMDUyIEwxMTQsNzUuNTg0IEwxMTQsNzYuMDUyIEwxMTQsMTMwLjAwOCBMMTE0LDEzMC40NzYiIGlkPSJGaWxsLTM4IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyLjAwMDAwMCwgMC4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTkuODIyLDM3LjQ3NCBDMTkuODM5LDM3LjMzOSAxOS43NDcsMzcuMTk0IDE5LjU1NSwzNy4wODIgQzE5LjIyOCwzNi44OTQgMTguNzI5LDM2Ljg3MiAxOC40NDYsMzcuMDM3IEwxMi40MzQsNDAuNTA4IEMxMi4zMDMsNDAuNTg0IDEyLjI0LDQwLjY4NiAxMi4yNDMsNDAuNzkzIEMxMi4yNDUsNDAuOTI1IDEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQxLjM3MSBMMTIuMjQ1LDQxLjQxNCBMMTIuMjM4LDQxLjU0MiBDOC4xNDgsNDMuODg3IDUuNjQ3LDQ1LjMyMSA1LjY0Nyw0NS4zMjEgQzUuNjQ2LDQ1LjMyMSAzLjU3LDQ2LjM2NyAyLjg2LDUwLjUxMyBDMi44Niw1MC41MTMgMS45NDgsNTcuNDc0IDEuOTYyLDcwLjI1OCBDMS45NzcsODIuODI4IDIuNTY4LDg3LjMyOCAzLjEyOSw5MS42MDkgQzMuMzQ5LDkzLjI5MyA2LjEzLDkzLjczNCA2LjEzLDkzLjczNCBDNi40NjEsOTMuNzc0IDYuODI4LDkzLjcwNyA3LjIxLDkzLjQ4NiBMODIuNDgzLDQ5LjkzNSBDODQuMjkxLDQ4Ljg2NiA4NS4xNSw0Ni4yMTYgODUuNTM5LDQzLjY1MSBDODYuNzUyLDM1LjY2MSA4Ny4yMTQsMTAuNjczIDg1LjI2NCwzLjc3MyBDODUuMDY4LDMuMDggODQuNzU0LDIuNjkgODQuMzk2LDIuNDkxIEw4Mi4zMSwxLjcwMSBDODEuNTgzLDEuNzI5IDgwLjg5NCwyLjE2OCA4MC43NzYsMi4yMzYgQzgwLjYzNiwyLjMxNyA0MS44MDcsMjQuNTg1IDIwLjAzMiwzNy4wNzIgTDE5LjgyMiwzNy40NzQiIGlkPSJGaWxsLTEiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODIuMzExLDEuNzAxIEw4NC4zOTYsMi40OTEgQzg0Ljc1NCwyLjY5IDg1LjA2OCwzLjA4IDg1LjI2NCwzLjc3MyBDODcuMjEzLDEwLjY3MyA4Ni43NTEsMzUuNjYgODUuNTM5LDQzLjY1MSBDODUuMTQ5LDQ2LjIxNiA4NC4yOSw0OC44NjYgODIuNDgzLDQ5LjkzNSBMNy4yMSw5My40ODYgQzYuODk3LDkzLjY2NyA2LjU5NSw5My43NDQgNi4zMTQsOTMuNzQ0IEw2LjEzMSw5My43MzMgQzYuMTMxLDkzLjczNCAzLjM0OSw5My4yOTMgMy4xMjgsOTEuNjA5IEMyLjU2OCw4Ny4zMjcgMS45NzcsODIuODI4IDEuOTYzLDcwLjI1OCBDMS45NDgsNTcuNDc0IDIuODYsNTAuNTEzIDIuODYsNTAuNTEzIEMzLjU3LDQ2LjM2NyA1LjY0Nyw0NS4zMjEgNS42NDcsNDUuMzIxIEM1LjY0Nyw0NS4zMjEgOC4xNDgsNDMuODg3IDEyLjIzOCw0MS41NDIgTDEyLjI0NSw0MS40MTQgTDEyLjI0NSw0MS4zNzEgQzEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQwLjkyNSAxMi4yNDMsNDAuNzkzIEMxMi4yNCw0MC42ODYgMTIuMzAyLDQwLjU4MyAxMi40MzQsNDAuNTA4IEwxOC40NDYsMzcuMDM2IEMxOC41NzQsMzYuOTYyIDE4Ljc0NiwzNi45MjYgMTguOTI3LDM2LjkyNiBDMTkuMTQ1LDM2LjkyNiAxOS4zNzYsMzYuOTc5IDE5LjU1NCwzNy4wODIgQzE5Ljc0NywzNy4xOTQgMTkuODM5LDM3LjM0IDE5LjgyMiwzNy40NzQgTDIwLjAzMywzNy4wNzIgQzQxLjgwNiwyNC41ODUgODAuNjM2LDIuMzE4IDgwLjc3NywyLjIzNiBDODAuODk0LDIuMTY4IDgxLjU4MywxLjcyOSA4Mi4zMTEsMS43MDEgTTgyLjMxMSwwLjcwNCBMODIuMjcyLDAuNzA1IEM4MS42NTQsMC43MjggODAuOTg5LDAuOTQ5IDgwLjI5OCwxLjM2MSBMODAuMjc3LDEuMzczIEM4MC4xMjksMS40NTggNTkuNzY4LDEzLjEzNSAxOS43NTgsMzYuMDc5IEMxOS41LDM1Ljk4MSAxOS4yMTQsMzUuOTI5IDE4LjkyNywzNS45MjkgQzE4LjU2MiwzNS45MjkgMTguMjIzLDM2LjAxMyAxNy45NDcsMzYuMTczIEwxMS45MzUsMzkuNjQ0IEMxMS40OTMsMzkuODk5IDExLjIzNiw0MC4zMzQgMTEuMjQ2LDQwLjgxIEwxMS4yNDcsNDAuOTYgTDUuMTY3LDQ0LjQ0NyBDNC43OTQsNDQuNjQ2IDIuNjI1LDQ1Ljk3OCAxLjg3Nyw1MC4zNDUgTDEuODcxLDUwLjM4NCBDMS44NjIsNTAuNDU0IDAuOTUxLDU3LjU1NyAwLjk2NSw3MC4yNTkgQzAuOTc5LDgyLjg3OSAxLjU2OCw4Ny4zNzUgMi4xMzcsOTEuNzI0IEwyLjEzOSw5MS43MzkgQzIuNDQ3LDk0LjA5NCA1LjYxNCw5NC42NjIgNS45NzUsOTQuNzE5IEw2LjAwOSw5NC43MjMgQzYuMTEsOTQuNzM2IDYuMjEzLDk0Ljc0MiA2LjMxNCw5NC43NDIgQzYuNzksOTQuNzQyIDcuMjYsOTQuNjEgNy43MSw5NC4zNSBMODIuOTgzLDUwLjc5OCBDODQuNzk0LDQ5LjcyNyA4NS45ODIsNDcuMzc1IDg2LjUyNSw0My44MDEgQzg3LjcxMSwzNS45ODcgODguMjU5LDEwLjcwNSA4Ni4yMjQsMy41MDIgQzg1Ljk3MSwyLjYwOSA4NS41MiwxLjk3NSA4NC44ODEsMS42MiBMODQuNzQ5LDEuNTU4IEw4Mi42NjQsMC43NjkgQzgyLjU1MSwwLjcyNSA4Mi40MzEsMC43MDQgODIuMzExLDAuNzA0IiBpZD0iRmlsbC0yIiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY2LjI2NywxMS41NjUgTDY3Ljc2MiwxMS45OTkgTDExLjQyMyw0NC4zMjUiIGlkPSJGaWxsLTMiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMjAyLDkwLjU0NSBDMTIuMDI5LDkwLjU0NSAxMS44NjIsOTAuNDU1IDExLjc2OSw5MC4yOTUgQzExLjYzMiw5MC4wNTcgMTEuNzEzLDg5Ljc1MiAxMS45NTIsODkuNjE0IEwzMC4zODksNzguOTY5IEMzMC42MjgsNzguODMxIDMwLjkzMyw3OC45MTMgMzEuMDcxLDc5LjE1MiBDMzEuMjA4LDc5LjM5IDMxLjEyNyw3OS42OTYgMzAuODg4LDc5LjgzMyBMMTIuNDUxLDkwLjQ3OCBMMTIuMjAyLDkwLjU0NSIgaWQ9IkZpbGwtNCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy43NjQsNDIuNjU0IEwxMy42NTYsNDIuNTkyIEwxMy43MDIsNDIuNDIxIEwxOC44MzcsMzkuNDU3IEwxOS4wMDcsMzkuNTAyIEwxOC45NjIsMzkuNjczIEwxMy44MjcsNDIuNjM3IEwxMy43NjQsNDIuNjU0IiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTguNTIsOTAuMzc1IEw4LjUyLDQ2LjQyMSBMOC41ODMsNDYuMzg1IEw3NS44NCw3LjU1NCBMNzUuODQsNTEuNTA4IEw3NS43NzgsNTEuNTQ0IEw4LjUyLDkwLjM3NSBMOC41Miw5MC4zNzUgWiBNOC43Nyw0Ni41NjQgTDguNzcsODkuOTQ0IEw3NS41OTEsNTEuMzY1IEw3NS41OTEsNy45ODUgTDguNzcsNDYuNTY0IEw4Ljc3LDQ2LjU2NCBaIiBpZD0iRmlsbC02IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0Ljk4Niw4My4xODIgQzI0Ljc1Niw4My4zMzEgMjQuMzc0LDgzLjU2NiAyNC4xMzcsODMuNzA1IEwxMi42MzIsOTAuNDA2IEMxMi4zOTUsOTAuNTQ1IDEyLjQyNiw5MC42NTggMTIuNyw5MC42NTggTDEzLjI2NSw5MC42NTggQzEzLjU0LDkwLjY1OCAxMy45NTgsOTAuNTQ1IDE0LjE5NSw5MC40MDYgTDI1LjcsODMuNzA1IEMyNS45MzcsODMuNTY2IDI2LjEyOCw4My40NTIgMjYuMTI1LDgzLjQ0OSBDMjYuMTIyLDgzLjQ0NyAyNi4xMTksODMuMjIgMjYuMTE5LDgyLjk0NiBDMjYuMTE5LDgyLjY3MiAyNS45MzEsODIuNTY5IDI1LjcwMSw4Mi43MTkgTDI0Ljk4Niw4My4xODIiIGlkPSJGaWxsLTciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuMjY2LDkwLjc4MiBMMTIuNyw5MC43ODIgQzEyLjUsOTAuNzgyIDEyLjM4NCw5MC43MjYgMTIuMzU0LDkwLjYxNiBDMTIuMzI0LDkwLjUwNiAxMi4zOTcsOTAuMzk5IDEyLjU2OSw5MC4yOTkgTDI0LjA3NCw4My41OTcgQzI0LjMxLDgzLjQ1OSAyNC42ODksODMuMjI2IDI0LjkxOCw4My4wNzggTDI1LjYzMyw4Mi42MTQgQzI1LjcyMyw4Mi41NTUgMjUuODEzLDgyLjUyNSAyNS44OTksODIuNTI1IEMyNi4wNzEsODIuNTI1IDI2LjI0NCw4Mi42NTUgMjYuMjQ0LDgyLjk0NiBDMjYuMjQ0LDgzLjE2IDI2LjI0NSw4My4zMDkgMjYuMjQ3LDgzLjM4MyBMMjYuMjUzLDgzLjM4NyBMMjYuMjQ5LDgzLjQ1NiBDMjYuMjQ2LDgzLjUzMSAyNi4yNDYsODMuNTMxIDI1Ljc2Myw4My44MTIgTDE0LjI1OCw5MC41MTQgQzE0LDkwLjY2NSAxMy41NjQsOTAuNzgyIDEzLjI2Niw5MC43ODIgTDEzLjI2Niw5MC43ODIgWiBNMTIuNjY2LDkwLjUzMiBMMTIuNyw5MC41MzMgTDEzLjI2Niw5MC41MzMgQzEzLjUxOCw5MC41MzMgMTMuOTE1LDkwLjQyNSAxNC4xMzIsOTAuMjk5IEwyNS42MzcsODMuNTk3IEMyNS44MDUsODMuNDk5IDI1LjkzMSw4My40MjQgMjUuOTk4LDgzLjM4MyBDMjUuOTk0LDgzLjI5OSAyNS45OTQsODMuMTY1IDI1Ljk5NCw4Mi45NDYgTDI1Ljg5OSw4Mi43NzUgTDI1Ljc2OCw4Mi44MjQgTDI1LjA1NCw4My4yODcgQzI0LjgyMiw4My40MzcgMjQuNDM4LDgzLjY3MyAyNC4yLDgzLjgxMiBMMTIuNjk1LDkwLjUxNCBMMTIuNjY2LDkwLjUzMiBMMTIuNjY2LDkwLjUzMiBaIiBpZD0iRmlsbC04IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEzLjI2Niw4OS44NzEgTDEyLjcsODkuODcxIEMxMi41LDg5Ljg3MSAxMi4zODQsODkuODE1IDEyLjM1NCw4OS43MDUgQzEyLjMyNCw4OS41OTUgMTIuMzk3LDg5LjQ4OCAxMi41NjksODkuMzg4IEwyNC4wNzQsODIuNjg2IEMyNC4zMzIsODIuNTM1IDI0Ljc2OCw4Mi40MTggMjUuMDY3LDgyLjQxOCBMMjUuNjMyLDgyLjQxOCBDMjUuODMyLDgyLjQxOCAyNS45NDgsODIuNDc0IDI1Ljk3OCw4Mi41ODQgQzI2LjAwOCw4Mi42OTQgMjUuOTM1LDgyLjgwMSAyNS43NjMsODIuOTAxIEwxNC4yNTgsODkuNjAzIEMxNCw4OS43NTQgMTMuNTY0LDg5Ljg3MSAxMy4yNjYsODkuODcxIEwxMy4yNjYsODkuODcxIFogTTEyLjY2Niw4OS42MjEgTDEyLjcsODkuNjIyIEwxMy4yNjYsODkuNjIyIEMxMy41MTgsODkuNjIyIDEzLjkxNSw4OS41MTUgMTQuMTMyLDg5LjM4OCBMMjUuNjM3LDgyLjY4NiBMMjUuNjY3LDgyLjY2OCBMMjUuNjMyLDgyLjY2NyBMMjUuMDY3LDgyLjY2NyBDMjQuODE1LDgyLjY2NyAyNC40MTgsODIuNzc1IDI0LjIsODIuOTAxIEwxMi42OTUsODkuNjAzIEwxMi42NjYsODkuNjIxIEwxMi42NjYsODkuNjIxIFoiIGlkPSJGaWxsLTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMzcsOTAuODAxIEwxMi4zNyw4OS41NTQgTDEyLjM3LDkwLjgwMSIgaWQ9IkZpbGwtMTAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNi4xMyw5My45MDEgQzUuMzc5LDkzLjgwOCA0LjgxNiw5My4xNjQgNC42OTEsOTIuNTI1IEMzLjg2LDg4LjI4NyAzLjU0LDgzLjc0MyAzLjUyNiw3MS4xNzMgQzMuNTExLDU4LjM4OSA0LjQyMyw1MS40MjggNC40MjMsNTEuNDI4IEM1LjEzNCw0Ny4yODIgNy4yMSw0Ni4yMzYgNy4yMSw0Ni4yMzYgQzcuMjEsNDYuMjM2IDgxLjY2NywzLjI1IDgyLjA2OSwzLjAxNyBDODIuMjkyLDIuODg4IDg0LjU1NiwxLjQzMyA4NS4yNjQsMy45NCBDODcuMjE0LDEwLjg0IDg2Ljc1MiwzNS44MjcgODUuNTM5LDQzLjgxOCBDODUuMTUsNDYuMzgzIDg0LjI5MSw0OS4wMzMgODIuNDgzLDUwLjEwMSBMNy4yMSw5My42NTMgQzYuODI4LDkzLjg3NCA2LjQ2MSw5My45NDEgNi4xMyw5My45MDEgQzYuMTMsOTMuOTAxIDMuMzQ5LDkzLjQ2IDMuMTI5LDkxLjc3NiBDMi41NjgsODcuNDk1IDEuOTc3LDgyLjk5NSAxLjk2Miw3MC40MjUgQzEuOTQ4LDU3LjY0MSAyLjg2LDUwLjY4IDIuODYsNTAuNjggQzMuNTcsNDYuNTM0IDUuNjQ3LDQ1LjQ4OSA1LjY0Nyw0NS40ODkgQzUuNjQ2LDQ1LjQ4OSA4LjA2NSw0NC4wOTIgMTIuMjQ1LDQxLjY3OSBMMTMuMTE2LDQxLjU2IEwxOS43MTUsMzcuNzMgTDE5Ljc2MSwzNy4yNjkgTDYuMTMsOTMuOTAxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjMxNyw5NC4xNjEgTDYuMTAyLDk0LjE0OCBMNi4xMDEsOTQuMTQ4IEw1Ljg1Nyw5NC4xMDEgQzUuMTM4LDkzLjk0NSAzLjA4NSw5My4zNjUgMi44ODEsOTEuODA5IEMyLjMxMyw4Ny40NjkgMS43MjcsODIuOTk2IDEuNzEzLDcwLjQyNSBDMS42OTksNTcuNzcxIDIuNjA0LDUwLjcxOCAyLjYxMyw1MC42NDggQzMuMzM4LDQ2LjQxNyA1LjQ0NSw0NS4zMSA1LjUzNSw0NS4yNjYgTDEyLjE2Myw0MS40MzkgTDEzLjAzMyw0MS4zMiBMMTkuNDc5LDM3LjU3OCBMMTkuNTEzLDM3LjI0NCBDMTkuNTI2LDM3LjEwNyAxOS42NDcsMzcuMDA4IDE5Ljc4NiwzNy4wMjEgQzE5LjkyMiwzNy4wMzQgMjAuMDIzLDM3LjE1NiAyMC4wMDksMzcuMjkzIEwxOS45NSwzNy44ODIgTDEzLjE5OCw0MS44MDEgTDEyLjMyOCw0MS45MTkgTDUuNzcyLDQ1LjcwNCBDNS43NDEsNDUuNzIgMy43ODIsNDYuNzcyIDMuMTA2LDUwLjcyMiBDMy4wOTksNTAuNzgyIDIuMTk4LDU3LjgwOCAyLjIxMiw3MC40MjQgQzIuMjI2LDgyLjk2MyAyLjgwOSw4Ny40MiAzLjM3Myw5MS43MjkgQzMuNDY0LDkyLjQyIDQuMDYyLDkyLjg4MyA0LjY4Miw5My4xODEgQzQuNTY2LDkyLjk4NCA0LjQ4Niw5Mi43NzYgNC40NDYsOTIuNTcyIEMzLjY2NSw4OC41ODggMy4yOTEsODQuMzcgMy4yNzYsNzEuMTczIEMzLjI2Miw1OC41MiA0LjE2Nyw1MS40NjYgNC4xNzYsNTEuMzk2IEM0LjkwMSw0Ny4xNjUgNy4wMDgsNDYuMDU5IDcuMDk4LDQ2LjAxNCBDNy4wOTQsNDYuMDE1IDgxLjU0MiwzLjAzNCA4MS45NDQsMi44MDIgTDgxLjk3MiwyLjc4NSBDODIuODc2LDIuMjQ3IDgzLjY5MiwyLjA5NyA4NC4zMzIsMi4zNTIgQzg0Ljg4NywyLjU3MyA4NS4yODEsMy4wODUgODUuNTA0LDMuODcyIEM4Ny41MTgsMTEgODYuOTY0LDM2LjA5MSA4NS43ODUsNDMuODU1IEM4NS4yNzgsNDcuMTk2IDg0LjIxLDQ5LjM3IDgyLjYxLDUwLjMxNyBMNy4zMzUsOTMuODY5IEM2Ljk5OSw5NC4wNjMgNi42NTgsOTQuMTYxIDYuMzE3LDk0LjE2MSBMNi4zMTcsOTQuMTYxIFogTTYuMTcsOTMuNjU0IEM2LjQ2Myw5My42OSA2Ljc3NCw5My42MTcgNy4wODUsOTMuNDM3IEw4Mi4zNTgsNDkuODg2IEM4NC4xODEsNDguODA4IDg0Ljk2LDQ1Ljk3MSA4NS4yOTIsNDMuNzggQzg2LjQ2NiwzNi4wNDkgODcuMDIzLDExLjA4NSA4NS4wMjQsNC4wMDggQzg0Ljg0NiwzLjM3NyA4NC41NTEsMi45NzYgODQuMTQ4LDIuODE2IEM4My42NjQsMi42MjMgODIuOTgyLDIuNzY0IDgyLjIyNywzLjIxMyBMODIuMTkzLDMuMjM0IEM4MS43OTEsMy40NjYgNy4zMzUsNDYuNDUyIDcuMzM1LDQ2LjQ1MiBDNy4zMDQsNDYuNDY5IDUuMzQ2LDQ3LjUyMSA0LjY2OSw1MS40NzEgQzQuNjYyLDUxLjUzIDMuNzYxLDU4LjU1NiAzLjc3NSw3MS4xNzMgQzMuNzksODQuMzI4IDQuMTYxLDg4LjUyNCA0LjkzNiw5Mi40NzYgQzUuMDI2LDkyLjkzNyA1LjQxMiw5My40NTkgNS45NzMsOTMuNjE1IEM2LjA4Nyw5My42NCA2LjE1OCw5My42NTIgNi4xNjksOTMuNjU0IEw2LjE3LDkzLjY1NCBMNi4xNyw5My42NTQgWiIgaWQ9IkZpbGwtMTIiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4zMTcsNjguOTgyIEM3LjgwNiw2OC43MDEgOC4yMDIsNjguOTI2IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNi44MjksNzEuMjk0IDYuNDMzLDcxLjA2OSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIiBpZD0iRmlsbC0xMyIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjkyLDcxLjEzMyBDNi42MzEsNzEuMTMzIDYuNDMzLDcwLjkwNSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIEM3LjQ2LDY4LjkgNy41OTUsNjguODYxIDcuNzE0LDY4Ljg2MSBDOC4wMDMsNjguODYxIDguMjAyLDY5LjA5IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNy4xNzQsNzEuMDk0IDcuMDM5LDcxLjEzMyA2LjkyLDcxLjEzMyBNNy43MTQsNjguNjc0IEM3LjU1Nyw2OC42NzQgNy4zOTIsNjguNzIzIDcuMjI0LDY4LjgyMSBDNi42NzYsNjkuMTM4IDYuMjQ2LDY5Ljg3OSA2LjI0Niw3MC41MDggQzYuMjQ2LDcwLjk5NCA2LjUxNyw3MS4zMiA2LjkyLDcxLjMyIEM3LjA3OCw3MS4zMiA3LjI0Myw3MS4yNzEgNy40MTEsNzEuMTc0IEM3Ljk1OSw3MC44NTcgOC4zODksNzAuMTE3IDguMzg5LDY5LjQ4NyBDOC4zODksNjkuMDAxIDguMTE3LDY4LjY3NCA3LjcxNCw2OC42NzQiIGlkPSJGaWxsLTE0IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYuOTIsNzAuOTQ3IEM2LjY0OSw3MC45NDcgNi42MjEsNzAuNjQgNi42MjEsNzAuNTA4IEM2LjYyMSw3MC4wMTcgNi45ODIsNjkuMzkyIDcuNDExLDY5LjE0NSBDNy41MjEsNjkuMDgyIDcuNjI1LDY5LjA0OSA3LjcxNCw2OS4wNDkgQzcuOTg2LDY5LjA0OSA4LjAxNSw2OS4zNTUgOC4wMTUsNjkuNDg3IEM4LjAxNSw2OS45NzggNy42NTIsNzAuNjAzIDcuMjI0LDcwLjg1MSBDNy4xMTUsNzAuOTE0IDcuMDEsNzAuOTQ3IDYuOTIsNzAuOTQ3IE03LjcxNCw2OC44NjEgQzcuNTk1LDY4Ljg2MSA3LjQ2LDY4LjkgNy4zMTcsNjguOTgyIEM2LjgyOSw2OS4yNjUgNi40MzMsNjkuOTQ4IDYuNDMzLDcwLjUwOCBDNi40MzMsNzAuOTA1IDYuNjMxLDcxLjEzMyA2LjkyLDcxLjEzMyBDNy4wMzksNzEuMTMzIDcuMTc0LDcxLjA5NCA3LjMxNyw3MS4wMTIgQzcuODA2LDcwLjczIDguMjAyLDcwLjA0NyA4LjIwMiw2OS40ODcgQzguMjAyLDY5LjA5IDguMDAzLDY4Ljg2MSA3LjcxNCw2OC44NjEiIGlkPSJGaWxsLTE1IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuNDQ0LDg1LjM1IEM3LjcwOCw4NS4xOTggNy45MjEsODUuMzE5IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuOTI1IDcuNzA4LDg2LjI5MiA3LjQ0NCw4Ni40NDQgQzcuMTgxLDg2LjU5NyA2Ljk2Nyw4Ni40NzUgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IiBpZD0iRmlsbC0xNiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik03LjIzLDg2LjUxIEM3LjA3NCw4Ni41MSA2Ljk2Nyw4Ni4zODcgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IEM3LjUyMSw4NS4zMDUgNy41OTQsODUuMjg0IDcuNjU4LDg1LjI4NCBDNy44MTQsODUuMjg0IDcuOTIxLDg1LjQwOCA3LjkyMSw4NS42MjIgQzcuOTIxLDg1LjkyNSA3LjcwOCw4Ni4yOTIgNy40NDQsODYuNDQ0IEM3LjM2Nyw4Ni40ODkgNy4yOTQsODYuNTEgNy4yMyw4Ni41MSBNNy42NTgsODUuMDk4IEM3LjU1OCw4NS4wOTggNy40NTUsODUuMTI3IDcuMzUxLDg1LjE4OCBDNy4wMzEsODUuMzczIDYuNzgxLDg1LjgwNiA2Ljc4MSw4Ni4xNzMgQzYuNzgxLDg2LjQ4MiA2Ljk2Niw4Ni42OTcgNy4yMyw4Ni42OTcgQzcuMzMsODYuNjk3IDcuNDMzLDg2LjY2NiA3LjUzOCw4Ni42MDcgQzcuODU4LDg2LjQyMiA4LjEwOCw4NS45ODkgOC4xMDgsODUuNjIyIEM4LjEwOCw4NS4zMTMgNy45MjMsODUuMDk4IDcuNjU4LDg1LjA5OCIgaWQ9IkZpbGwtMTciIGZpbGw9IiM4MDk3QTIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4yMyw4Ni4zMjIgTDcuMTU0LDg2LjE3MyBDNy4xNTQsODUuOTM4IDcuMzMzLDg1LjYyOSA3LjUzOCw4NS41MTIgTDcuNjU4LDg1LjQ3MSBMNy43MzQsODUuNjIyIEM3LjczNCw4NS44NTYgNy41NTUsODYuMTY0IDcuMzUxLDg2LjI4MiBMNy4yMyw4Ni4zMjIgTTcuNjU4LDg1LjI4NCBDNy41OTQsODUuMjg0IDcuNTIxLDg1LjMwNSA3LjQ0NCw4NS4zNSBDNy4xODEsODUuNTAyIDYuOTY3LDg1Ljg3MSA2Ljk2Nyw4Ni4xNzMgQzYuOTY3LDg2LjM4NyA3LjA3NCw4Ni41MSA3LjIzLDg2LjUxIEM3LjI5NCw4Ni41MSA3LjM2Nyw4Ni40ODkgNy40NDQsODYuNDQ0IEM3LjcwOCw4Ni4yOTIgNy45MjEsODUuOTI1IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuNDA4IDcuODE0LDg1LjI4NCA3LjY1OCw4NS4yODQiIGlkPSJGaWxsLTE4IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTc3LjI3OCw3Ljc2OSBMNzcuMjc4LDUxLjQzNiBMMTAuMjA4LDkwLjE2IEwxMC4yMDgsNDYuNDkzIEw3Ny4yNzgsNy43NjkiIGlkPSJGaWxsLTE5IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEwLjA4Myw5MC4zNzUgTDEwLjA4Myw0Ni40MjEgTDEwLjE0Niw0Ni4zODUgTDc3LjQwMyw3LjU1NCBMNzcuNDAzLDUxLjUwOCBMNzcuMzQxLDUxLjU0NCBMMTAuMDgzLDkwLjM3NSBMMTAuMDgzLDkwLjM3NSBaIE0xMC4zMzMsNDYuNTY0IEwxMC4zMzMsODkuOTQ0IEw3Ny4xNTQsNTEuMzY1IEw3Ny4xNTQsNy45ODUgTDEwLjMzMyw0Ni41NjQgTDEwLjMzMyw0Ni41NjQgWiIgaWQ9IkZpbGwtMjAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMjUuNzM3LDg4LjY0NyBMMTE4LjA5OCw5MS45ODEgTDExOC4wOTgsODQgTDEwNi42MzksODguNzEzIEwxMDYuNjM5LDk2Ljk4MiBMOTksMTAwLjMxNSBMMTEyLjM2OSwxMDMuOTYxIEwxMjUuNzM3LDg4LjY0NyIgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTIiIGZpbGw9IiM0NTVBNjQiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'); +}; + +module.exports = RotateInstructions; + +},{"./util.js":13}],13:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Util = {}; + +Util.base64 = function(mimeType, base64) { + return 'data:' + mimeType + ';base64,' + base64; +}; + +Util.isMobile = function() { + var check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); + return check; +}; + +Util.isFirefox = function() { + return /firefox/i.test(navigator.userAgent); +}; + +Util.isIOS = function() { + return /(iPad|iPhone|iPod)/g.test(navigator.userAgent); +}; + +Util.isIFrame = function() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } +}; + +Util.appendQueryParameter = function(url, key, value) { + // Determine delimiter based on if the URL already GET parameters in it. + var delimiter = (url.indexOf('?') < 0 ? '?' : '&'); + url += delimiter + key + '=' + value; + return url; +}; + +// From http://goo.gl/4WX3tg +Util.getQueryParameter = function(name) { + name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), + results = regex.exec(location.search); + return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); +}; + +Util.isLandscapeMode = function() { + return (window.orientation == 90 || window.orientation == -90); +}; + +Util.getScreenWidth = function() { + return Math.max(window.screen.width, window.screen.height) * + window.devicePixelRatio; +}; + +Util.getScreenHeight = function() { + return Math.min(window.screen.width, window.screen.height) * + window.devicePixelRatio; +}; + +/** + * Utility to convert the projection matrix to a vector accepted by the shader. + * + * @param {Object} opt_params A rectangle to scale this vector by. + */ +Util.projectionMatrixToVector_ = function(matrix, opt_params) { + var params = opt_params || {}; + var xScale = params.xScale || 1; + var yScale = params.yScale || 1; + var xTrans = params.xTrans || 0; + var yTrans = params.yTrans || 0; + + var elements = matrix.elements; + var vec = new THREE.Vector4(); + vec.set(elements[4*0 + 0] * xScale, + elements[4*1 + 1] * yScale, + elements[4*2 + 0] - 1 - xTrans, + elements[4*2 + 1] - 1 - yTrans).divideScalar(2); + return vec; +}; + +Util.leftProjectionVectorToRight_ = function(left) { + //projectionLeft + vec4(0.0, 0.0, 1.0, 0.0)) * vec4(1.0, 1.0, -1.0, 1.0); + var out = new THREE.Vector4(0, 0, 1, 0); + out.add(left); // out = left + (0, 0, 1, 0). + out.z *= -1; // Flip z. + + return out; +}; + +module.exports = Util; + +},{}],14:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Emitter = _dereq_('./emitter.js'); +var Util = _dereq_('./util.js'); + +var DEFAULT_VIEWER = 'CardboardV1'; +var VIEWER_KEY = 'WEBVR_CARDBOARD_VIEWER'; + +/** + * Creates a viewer selector with the options specified. Supports being shown + * and hidden. Generates events when viewer parameters change. Also supports + * saving the currently selected index in localStorage. + * + * @param {Object} options Option labels for all valid selections {name: index}. + */ +function ViewerSelector(options) { + // Try to load the selected key from local storage. If none exists, use the + // default key. + try { + this.selectedKey = localStorage.getItem(VIEWER_KEY) || DEFAULT_VIEWER; + } catch(error) { + console.error('Failed to load viewer profile: %s', error); + } + this.dialog = this.createDialog_(options); + this.options = options; + document.body.appendChild(this.dialog); +} +ViewerSelector.prototype = new Emitter(); + +ViewerSelector.prototype.show = function() { + //console.log('ViewerSelector.show'); + + // Ensure the currently selected item is checked. + var selected = this.dialog.querySelector('#' + this.selectedKey); + selected.checked = true; + + // Show the UI. + this.dialog.style.display = 'block'; +}; + +ViewerSelector.prototype.hide = function() { + //console.log('ViewerSelector.hide'); + this.dialog.style.display = 'none'; +}; + +ViewerSelector.prototype.getSelectedKey_ = function() { + var input = this.dialog.querySelector('input[name=field]:checked'); + if (input) { + return input.id; + } + return null; +}; + +ViewerSelector.prototype.onSave_ = function() { + this.selectedKey = this.getSelectedKey_(); + if (!this.selectedKey || !this.options[this.selectedKey]) { + console.error('ViewerSelector.onSave_: this should never happen!'); + return; + } + + this.emit('change', this.options[this.selectedKey]); + + // Attempt to save the viewer profile, but fails in private mode. + try { + localStorage.setItem(VIEWER_KEY, this.selectedKey); + } catch(error) { + console.error('Failed to save viewer profile: %s', error); + } + this.hide(); +}; + +/** + * Creates the dialog. + */ +ViewerSelector.prototype.createDialog_ = function(options) { + var container = document.createElement('div'); + container.style.display = 'none'; + // Create an overlay that dims the background, and which goes away when you + // tap it. + var overlay = document.createElement('div'); + var s = overlay.style; + s.position = 'fixed'; + s.left = 0; + s.top = 0; + s.width = '100%'; + s.height = '100%'; + s.background = 'rgba(0, 0, 0, 0.3)'; + overlay.addEventListener('click', this.hide.bind(this)); + + var width = 280; + var dialog = document.createElement('div'); + var s = dialog.style; + s.boxSizing = 'border-box'; + s.position = 'fixed'; + s.top = '24px'; + s.left = '50%'; + s.marginLeft = (-width/2) + 'px'; + s.width = width + 'px'; + s.padding = '24px'; + s.overflow = 'hidden'; + s.background = '#fafafa'; + s.fontFamily = "'Roboto', sans-serif"; + s.boxShadow = '0px 5px 20px #666'; + + dialog.appendChild(this.createH1_('Select your viewer')); + for (var id in options) { + dialog.appendChild(this.createChoice_(id, options[id].label)); + } + dialog.appendChild(this.createButton_('Save', this.onSave_.bind(this))); + + container.appendChild(overlay); + container.appendChild(dialog); + + return container; +}; + +ViewerSelector.prototype.createH1_ = function(name) { + var h1 = document.createElement('h1'); + var s = h1.style; + s.color = 'black'; + s.fontSize = '20px'; + s.fontWeight = 'bold'; + s.marginTop = 0; + s.marginBottom = '24px'; + h1.innerHTML = name; + return h1; +}; + +ViewerSelector.prototype.createChoice_ = function(id, name) { + /* +

+ + +
+ */ + var div = document.createElement('div'); + div.style.marginTop = '8px'; + div.style.color = 'black'; + + var input = document.createElement('input'); + input.style.fontSize = '30px'; + input.setAttribute('id', id); + input.setAttribute('type', 'radio'); + input.setAttribute('value', id); + input.setAttribute('name', 'field'); + + var label = document.createElement('label'); + label.style.marginLeft = '4px'; + label.setAttribute('for', id); + label.innerHTML = name; + + div.appendChild(input); + div.appendChild(label); + + return div; +}; + +ViewerSelector.prototype.createButton_ = function(label, onclick) { + var button = document.createElement('button'); + button.innerHTML = label; + var s = button.style; + s.float = 'right'; + s.textTransform = 'uppercase'; + s.color = '#1094f7'; + s.fontSize = '14px'; + s.letterSpacing = 0; + s.border = 0; + s.background = 'none'; + s.marginTop = '16px'; + + button.addEventListener('click', onclick); + + return button; +}; + +module.exports = ViewerSelector; + +},{"./emitter.js":9,"./util.js":13}],15:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Util = _dereq_('./util.js'); + +/** + * Android and iOS compatible wakelock implementation. + * + * Refactored thanks to dkovalev@. + */ +function AndroidWakeLock() { + var video = document.createElement('video'); + + video.addEventListener('ended', function() { + video.play(); + }); + + this.request = function() { + if (video.paused) { + // Base64 version of videos_src/no-sleep-120s.mp4. + video.src = Util.base64('video/mp4', 'AAAAGGZ0eXBpc29tAAAAAG1wNDFhdmMxAAAIA21vb3YAAABsbXZoZAAAAADSa9v60mvb+gABX5AAlw/gAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAdkdHJhawAAAFx0a2hkAAAAAdJr2/rSa9v6AAAAAQAAAAAAlw/gAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAQAAAAHAAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAJcP4AAAAAAAAQAAAAAG3G1kaWEAAAAgbWRoZAAAAADSa9v60mvb+gAPQkAGjneAFccAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAABodtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAZHc3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAMABwASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQAC//hABlnZAALrNlfllw4QAAAAwBAAAADAKPFCmWAAQAFaOvssiwAAAAYc3R0cwAAAAAAAAABAAAAbgAPQkAAAAAUc3RzcwAAAAAAAAABAAAAAQAAA4BjdHRzAAAAAAAAAG4AAAABAD0JAAAAAAEAehIAAAAAAQA9CQAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEATEtAAAAAAQAehIAAAAABAAAAAAAAAAEAD0JAAAAAAQBMS0AAAAABAB6EgAAAAAEAAAAAAAAAAQAPQkAAAAABAExLQAAAAAEAHoSAAAAAAQAAAAAAAAABAA9CQAAAAAEALcbAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAABuAAAAAQAAAcxzdHN6AAAAAAAAAAAAAABuAAADCQAAABgAAAAOAAAADgAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABIAAAAOAAAADAAAAAwAAAASAAAADgAAAAwAAAAMAAAAEgAAAA4AAAAMAAAADAAAABMAAAAUc3RjbwAAAAAAAAABAAAIKwAAACt1ZHRhAAAAI6llbmMAFwAAdmxjIDIuMi4xIHN0cmVhbSBvdXRwdXQAAAAId2lkZQAACRRtZGF0AAACrgX//6vcRem95tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTQyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVmPTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9MTIgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1hYnIgbWJ0cmVlPTEgYml0cmF0ZT0xMDAgcmF0ZXRvbD0xLjAgcWNvbXA9MC42MCBxcG1pbj0xMCBxcG1heD01MSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAU2WIhAAQ/8ltlOe+cTZuGkKg+aRtuivcDZ0pBsfsEi9p/i1yU9DxS2lq4dXTinViF1URBKXgnzKBd/Uh1bkhHtMrwrRcOJslD01UB+fyaL6ef+DBAAAAFEGaJGxBD5B+v+a+4QqF3MgBXz9MAAAACkGeQniH/+94r6EAAAAKAZ5hdEN/8QytwAAAAAgBnmNqQ3/EgQAAAA5BmmhJqEFomUwIIf/+4QAAAApBnoZFESw//76BAAAACAGepXRDf8SBAAAACAGep2pDf8SAAAAADkGarEmoQWyZTAgh//7gAAAACkGeykUVLD//voEAAAAIAZ7pdEN/xIAAAAAIAZ7rakN/xIAAAAAOQZrwSahBbJlMCCH//uEAAAAKQZ8ORRUsP/++gQAAAAgBny10Q3/EgQAAAAgBny9qQ3/EgAAAAA5BmzRJqEFsmUwIIf/+4AAAAApBn1JFFSw//76BAAAACAGfcXRDf8SAAAAACAGfc2pDf8SAAAAADkGbeEmoQWyZTAgh//7hAAAACkGflkUVLD//voAAAAAIAZ+1dEN/xIEAAAAIAZ+3akN/xIEAAAAOQZu8SahBbJlMCCH//uAAAAAKQZ/aRRUsP/++gQAAAAgBn/l0Q3/EgAAAAAgBn/tqQ3/EgQAAAA5Bm+BJqEFsmUwIIf/+4QAAAApBnh5FFSw//76AAAAACAGePXRDf8SAAAAACAGeP2pDf8SBAAAADkGaJEmoQWyZTAgh//7gAAAACkGeQkUVLD//voEAAAAIAZ5hdEN/xIAAAAAIAZ5jakN/xIEAAAAOQZpoSahBbJlMCCH//uEAAAAKQZ6GRRUsP/++gQAAAAgBnqV0Q3/EgQAAAAgBnqdqQ3/EgAAAAA5BmqxJqEFsmUwIIf/+4AAAAApBnspFFSw//76BAAAACAGe6XRDf8SAAAAACAGe62pDf8SAAAAADkGa8EmoQWyZTAgh//7hAAAACkGfDkUVLD//voEAAAAIAZ8tdEN/xIEAAAAIAZ8vakN/xIAAAAAOQZs0SahBbJlMCCH//uAAAAAKQZ9SRRUsP/++gQAAAAgBn3F0Q3/EgAAAAAgBn3NqQ3/EgAAAAA5Bm3hJqEFsmUwIIf/+4QAAAApBn5ZFFSw//76AAAAACAGftXRDf8SBAAAACAGft2pDf8SBAAAADkGbvEmoQWyZTAgh//7gAAAACkGf2kUVLD//voEAAAAIAZ/5dEN/xIAAAAAIAZ/7akN/xIEAAAAOQZvgSahBbJlMCCH//uEAAAAKQZ4eRRUsP/++gAAAAAgBnj10Q3/EgAAAAAgBnj9qQ3/EgQAAAA5BmiRJqEFsmUwIIf/+4AAAAApBnkJFFSw//76BAAAACAGeYXRDf8SAAAAACAGeY2pDf8SBAAAADkGaaEmoQWyZTAgh//7hAAAACkGehkUVLD//voEAAAAIAZ6ldEN/xIEAAAAIAZ6nakN/xIAAAAAOQZqsSahBbJlMCCH//uAAAAAKQZ7KRRUsP/++gQAAAAgBnul0Q3/EgAAAAAgBnutqQ3/EgAAAAA5BmvBJqEFsmUwIIf/+4QAAAApBnw5FFSw//76BAAAACAGfLXRDf8SBAAAACAGfL2pDf8SAAAAADkGbNEmoQWyZTAgh//7gAAAACkGfUkUVLD//voEAAAAIAZ9xdEN/xIAAAAAIAZ9zakN/xIAAAAAOQZt4SahBbJlMCCH//uEAAAAKQZ+WRRUsP/++gAAAAAgBn7V0Q3/EgQAAAAgBn7dqQ3/EgQAAAA5Bm7xJqEFsmUwIIf/+4AAAAApBn9pFFSw//76BAAAACAGf+XRDf8SAAAAACAGf+2pDf8SBAAAADkGb4EmoQWyZTAgh//7hAAAACkGeHkUVLD//voAAAAAIAZ49dEN/xIAAAAAIAZ4/akN/xIEAAAAOQZokSahBbJlMCCH//uAAAAAKQZ5CRRUsP/++gQAAAAgBnmF0Q3/EgAAAAAgBnmNqQ3/EgQAAAA5BmmhJqEFsmUwIIf/+4QAAAApBnoZFFSw//76BAAAACAGepXRDf8SBAAAACAGep2pDf8SAAAAADkGarEmoQWyZTAgh//7gAAAACkGeykUVLD//voEAAAAIAZ7pdEN/xIAAAAAIAZ7rakN/xIAAAAAPQZruSahBbJlMFEw3//7B'); + video.play(); + } + }; + + this.release = function() { + video.pause(); + video.src = ''; + }; +} + +function iOSWakeLock() { + var timer = null; + + this.request = function() { + if (!timer) { + timer = setInterval(function() { + window.location = window.location; + setTimeout(window.stop, 0); + }, 30000); + } + } + + this.release = function() { + if (timer) { + clearInterval(timer); + timer = null; + } + } +} + + +function getWakeLock() { + var userAgent = navigator.userAgent || navigator.vendor || window.opera; + if (userAgent.match(/iPhone/i) || userAgent.match(/iPod/i)) { + return iOSWakeLock; + } else { + return AndroidWakeLock; + } +} + +module.exports = getWakeLock(); + +},{"./util.js":13}],16:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var ButtonManager = _dereq_('./button-manager.js'); +var CardboardDistorter = _dereq_('./cardboard-distorter.js'); +var DeviceInfo = _dereq_('./device-info.js'); +var Dpdb = _dereq_('./dpdb.js'); +var Emitter = _dereq_('./emitter.js'); +var Modes = _dereq_('./modes.js'); +var RotateInstructions = _dereq_('./rotate-instructions.js'); +var Util = _dereq_('./util.js'); +var ViewerSelector = _dereq_('./viewer-selector.js'); +var Wakelock = _dereq_('./wakelock.js'); + +/** + * Helper for getting in and out of VR mode. + * Here we assume VR mode == full screen mode. + * + * 1. Detects whether or not VR mode is possible by feature detecting for + * WebVR (or polyfill). + * + * 2. If WebVR is available, shows a button that lets you enter VR mode. + * + * 3. Provides Cardboard-style distortion if the webvr-polyfill is being used. + * + * 4. Provides best practices while in VR mode. + * - Full screen + * - Wake lock + * - Orientation lock (mobile only) + */ +function WebVRManager(renderer, effect, params) { + this.params = params || {}; + + this.mode = Modes.UNKNOWN; + + // Set option to hide the button. + this.hideButton = this.params.hideButton || false; + // Whether or not the FOV should be distorted or un-distorted. By default, it + // should be distorted, but in the case of vertex shader based distortion, + // ensure that we use undistorted parameters. + this.isUndistorted = !!this.params.isUndistorted; + + // Save the THREE.js renderer and effect for later. + this.renderer = renderer; + this.effect = effect; + this.button = new ButtonManager(); + this.rotateInstructions = new RotateInstructions(); + this.viewerSelector = new ViewerSelector(DeviceInfo.Viewers); + + // Load the DPDB. + var shouldFetch = !WebVRConfig.NO_DPDB_FETCH; + this.dpdb = new Dpdb(shouldFetch, this.onDeviceParamsUpdated_.bind(this)); + + // Create device info and set the correct default viewer. + this.deviceInfo = new DeviceInfo(this.dpdb.getDeviceParams()); + this.deviceInfo.viewer = DeviceInfo.Viewers[this.viewerSelector.selectedKey]; + console.log('Using the %s viewer.', this.getViewer().label); + + this.distorter = new CardboardDistorter(renderer); + this.distorter.updateDeviceInfo(this.deviceInfo); + + this.isVRCompatible = false; + this.isFullscreenDisabled = !!Util.getQueryParameter('no_fullscreen'); + this.startMode = Modes.NORMAL; + var startModeParam = parseInt(Util.getQueryParameter('start_mode')); + if (!isNaN(startModeParam)) { + this.startMode = startModeParam; + } + + // Set the correct viewer profile, but only if this is Cardboard. + if (Util.isMobile()) { + this.onViewerChanged_(this.getViewer()); + } + // Listen for changes to the viewer. + this.viewerSelector.on('change', this.onViewerChanged_.bind(this)); + + if (this.hideButton) { + this.button.setVisibility(false); + } + + // Check if the browser is compatible with WebVR. + this.getDeviceByType_(HMDVRDevice).then(function(hmd) { + // Activate either VR or Immersive mode. + if (WebVRConfig.FORCE_DISTORTION) { + this.distorter.setActive(true); + this.isVRCompatible = true; + } else if (hmd) { + this.isVRCompatible = true; + // Only enable distortion if we are dealing using the polyfill, we have a + // perfect device match, and it's not prevented via configuration. + if (hmd.deviceName.indexOf('webvr-polyfill') == 0 && this.deviceInfo.getDevice() && + !WebVRConfig.PREVENT_DISTORTION) { + this.distorter.setActive(true); + } + this.hmd = hmd; + } + // Set the right mode. + switch (this.startMode) { + case Modes.MAGIC_WINDOW: + this.normalToMagicWindow_(); + this.setMode_(Modes.MAGIC_WINDOW); + break; + case Modes.VR: + this.anyModeToVR_(); + this.setMode_(Modes.VR); + break; + default: + this.setMode_(Modes.NORMAL); + } + this.button.on('fs', this.onFSClick_.bind(this)); + this.button.on('vr', this.onVRClick_.bind(this)); + this.button.on('back', this.onBackClick_.bind(this)); + this.button.on('settings', this.onSettingsClick_.bind(this)); + this.emit('initialized'); + }.bind(this)); + + // Save the input device for later sending timing data. + this.getDeviceByType_(PositionSensorVRDevice).then(function(input) { + this.input = input; + }.bind(this)); + + // Whenever we enter fullscreen, we are entering VR or immersive mode. + document.addEventListener('webkitfullscreenchange', + this.onFullscreenChange_.bind(this)); + document.addEventListener('mozfullscreenchange', + this.onFullscreenChange_.bind(this)); + document.addEventListener('MSFullscreenChange', + this.onFullscreenChange_.bind(this)); + window.addEventListener('orientationchange', + this.onOrientationChange_.bind(this)); + + // Create the necessary elements for wake lock to work. + this.wakelock = new Wakelock(); + + // Save whether or not we want the touch panner to be enabled or disabled by + // default. + this.isTouchPannerEnabled = !WebVRConfig.TOUCH_PANNER_DISABLED; + +} + +WebVRManager.prototype = new Emitter(); + +// Expose these values externally. +WebVRManager.Modes = Modes; + +/** + * Promise returns true if there is at least one HMD device available. + */ +WebVRManager.prototype.getDeviceByType_ = function(type) { + return new Promise(function(resolve, reject) { + navigator.getVRDevices().then(function(devices) { + // Promise succeeds, but check if there are any devices actually. + for (var i = 0; i < devices.length; i++) { + if (devices[i] instanceof type) { + resolve(devices[i]); + break; + } + } + resolve(null); + }, function() { + // No devices are found. + resolve(null); + }); + }); +}; + +WebVRManager.prototype.isVRMode = function() { + return this.mode == Modes.VR; +}; + +WebVRManager.prototype.getViewer = function() { + return this.deviceInfo.viewer; +}; + +WebVRManager.prototype.getDevice = function() { + return this.deviceInfo.device; +}; + +WebVRManager.prototype.getDeviceInfo = function() { + return this.deviceInfo; +}; + +WebVRManager.prototype.render = function(scene, camera, timestamp) { + this.camera = camera; + + this.resizeIfNeeded_(camera); + + if (this.isVRMode()) { + this.distorter.preRender(); + this.effect.render(scene, camera); + this.distorter.postRender(); + } else { + // Scene may be an array of two scenes, one for each eye. + if (scene instanceof Array) { + this.renderer.render(scene[0], camera); + } else { + this.renderer.render(scene, camera); + } + } +}; + + +WebVRManager.prototype.setMode_ = function(mode) { + var oldMode = this.mode; + if (mode == this.mode) { + console.error('Not changing modes, already in %s', mode); + return; + } + console.log('Mode change: %s => %s', this.mode, mode); + this.mode = mode; + this.button.setMode(mode, this.isVRCompatible); + + if (this.mode == Modes.VR && Util.isLandscapeMode() && Util.isMobile()) { + // In landscape mode, temporarily show the "put into Cardboard" + // interstitial. Otherwise, do the default thing. + this.rotateInstructions.showTemporarily(3000); + } else { + this.updateRotateInstructions_(); + } + + // Also hide the viewer selector. + this.viewerSelector.hide(); + + // Emit an event indicating the mode changed. + this.emit('modechange', mode, oldMode); + + // Note: This is a nasty hack since we need to communicate to the polyfill + // that touch panning is disabled, and the only way to do this currently is + // via WebVRConfig. + // TODO: Maybe move touch panning to the boilerplate to eliminate the hack. + // + // If we are in VR mode, always disable touch panning. + if (this.isTouchPannerEnabled) { + if (this.mode == Modes.VR) { + WebVRConfig.TOUCH_PANNER_DISABLED = true; + } else { + WebVRConfig.TOUCH_PANNER_DISABLED = false; + } + } + + if (this.mode == Modes.VR) { + // In VR mode, set the HMDVRDevice parameters. + this.setHMDVRDeviceParams_(this.getViewer()); + } +}; + +/** + * Main button was clicked. + */ +WebVRManager.prototype.onFSClick_ = function() { + switch (this.mode) { + case Modes.NORMAL: + // TODO: Remove this hack when iOS has fullscreen mode. + // If this is an iframe on iOS, break out and open in no_fullscreen mode. + if (Util.isIOS() && Util.isIFrame()) { + var url = window.location.href; + url = Util.appendQueryParameter(url, 'no_fullscreen', 'true'); + url = Util.appendQueryParameter(url, 'start_mode', Modes.MAGIC_WINDOW); + top.location.href = url; + return; + } + this.normalToMagicWindow_(); + this.setMode_(Modes.MAGIC_WINDOW); + break; + case Modes.MAGIC_WINDOW: + if (this.isFullscreenDisabled) { + window.history.back(); + } else { + this.anyModeToNormal_(); + this.setMode_(Modes.NORMAL); + } + break; + } +}; + +/** + * The VR button was clicked. + */ +WebVRManager.prototype.onVRClick_ = function() { + // TODO: Remove this hack when iOS has fullscreen mode. + // If this is an iframe on iOS, break out and open in no_fullscreen mode. + if (this.mode == Modes.NORMAL && Util.isIOS() && Util.isIFrame()) { + var url = window.location.href; + url = Util.appendQueryParameter(url, 'no_fullscreen', 'true'); + url = Util.appendQueryParameter(url, 'start_mode', Modes.VR); + top.location.href = url; + return; + } + this.anyModeToVR_(); + this.setMode_(Modes.VR); +}; + +/** + * Back button was clicked. + */ +WebVRManager.prototype.onBackClick_ = function() { + if (this.isFullscreenDisabled) { + window.history.back(); + } else { + this.anyModeToNormal_(); + this.setMode_(Modes.NORMAL); + } +}; + +WebVRManager.prototype.onSettingsClick_ = function() { + // Show the viewer selection dialog. + this.viewerSelector.show(); +}; + +/** + * + * Methods to go between modes. + * + */ +WebVRManager.prototype.normalToMagicWindow_ = function() { + // TODO: Re-enable pointer lock after debugging. + //this.requestPointerLock_(); + this.requestFullscreen_(); + this.wakelock.request(); +}; + +WebVRManager.prototype.anyModeToVR_ = function() { + // Don't do orientation locking for consistency. + //this.requestOrientationLock_(); + this.requestFullscreen_(); + //this.effect.setFullScreen(true); + this.wakelock.request(); + this.distorter.patch(); +}; + +WebVRManager.prototype.vrToMagicWindow_ = function() { + //this.releaseOrientationLock_(); + this.distorter.unpatch(); + + // Android bug: when returning from VR, resize the effect. + this.resize_(); +} + +WebVRManager.prototype.anyModeToNormal_ = function() { + //this.effect.setFullScreen(false); + this.exitFullscreen_(); + //this.releaseOrientationLock_(); + this.releasePointerLock_(); + this.wakelock.release(); + this.distorter.unpatch(); + + // Android bug: when returning from VR, resize the effect. + this.resize_(); +}; + +WebVRManager.prototype.resizeIfNeeded_ = function(camera) { + // Only resize the canvas if it needs to be resized. + var size = this.renderer.getSize(); + if (size.width != window.innerWidth || size.height != window.innerHeight) { + this.resize_(); + } +}; + +WebVRManager.prototype.resize_ = function() { + this.effect.setSize(window.innerWidth, window.innerHeight); + if (this.camera) { + this.camera.aspect = window.innerWidth / window.innerHeight; + this.camera.updateProjectionMatrix(); + } +}; + +WebVRManager.prototype.onOrientationChange_ = function(e) { + this.updateRotateInstructions_(); + // Also hide the viewer selector. + this.viewerSelector.hide(); +}; + +WebVRManager.prototype.updateRotateInstructions_ = function() { + this.rotateInstructions.disableShowTemporarily(); + // In portrait VR mode, tell the user to rotate to landscape. + if (this.mode == Modes.VR && !Util.isLandscapeMode() && Util.isMobile()) { + this.rotateInstructions.show(); + } else { + this.rotateInstructions.hide(); + } +}; + +WebVRManager.prototype.onFullscreenChange_ = function(e) { + // If we leave full-screen, go back to normal mode. + if (document.webkitFullscreenElement === null || + document.mozFullScreenElement === null) { + this.anyModeToNormal_(); + this.setMode_(Modes.NORMAL); + } +}; + +WebVRManager.prototype.requestPointerLock_ = function() { + var canvas = this.renderer.domElement; + canvas.requestPointerLock = canvas.requestPointerLock || + canvas.mozRequestPointerLock || + canvas.webkitRequestPointerLock; + + if (canvas.requestPointerLock) { + canvas.requestPointerLock(); + } +}; + +WebVRManager.prototype.releasePointerLock_ = function() { + document.exitPointerLock = document.exitPointerLock || + document.mozExitPointerLock || + document.webkitExitPointerLock; + + if (document.exitPointerLock) { + document.exitPointerLock(); + } +}; + +WebVRManager.prototype.requestOrientationLock_ = function() { + if (screen.orientation && Util.isMobile()) { + screen.orientation.lock('landscape'); + } +}; + +WebVRManager.prototype.releaseOrientationLock_ = function() { + if (screen.orientation) { + screen.orientation.unlock(); + } +}; + +WebVRManager.prototype.requestFullscreen_ = function() { + var canvas = document.body; + //var canvas = this.renderer.domElement; + if (canvas.requestFullscreen) { + canvas.requestFullscreen(); + } else if (canvas.mozRequestFullScreen) { + canvas.mozRequestFullScreen({vrDisplay: this.hmd}); + } else if (canvas.webkitRequestFullscreen) { + canvas.webkitRequestFullscreen({vrDisplay: this.hmd}); + } else if (canvas.msRequestFullscreen) { + canvas.msRequestFullscreen({vrDisplay: this.hmd}); + } +}; + +WebVRManager.prototype.exitFullscreen_ = function() { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } +}; + +WebVRManager.prototype.onViewerChanged_ = function(viewer) { + this.deviceInfo.setViewer(viewer); + + // Update the distortion appropriately. + this.distorter.updateDeviceInfo(this.deviceInfo); + + // And update the HMDVRDevice parameters. + this.setHMDVRDeviceParams_(viewer); + + // Notify anyone interested in this event. + this.emit('viewerchange', viewer); +}; + +/** + * Sets parameters on CardboardHMDVRDevice. These changes are ultimately handled + * by VREffect. + */ +WebVRManager.prototype.setHMDVRDeviceParams_ = function(viewer) { + this.getDeviceByType_(HMDVRDevice).then(function(hmd) { + if (!hmd) { + return; + } + + // If we can set fields of view, do that now. + if (hmd.setFieldOfView) { + // Calculate the optimal field of view for each eye. + hmd.setFieldOfView(this.deviceInfo.getFieldOfViewLeftEye(this.isUndistorted), + this.deviceInfo.getFieldOfViewRightEye(this.isUndistorted)); + } + + // Note: setInterpupillaryDistance is not part of the WebVR standard. + if (hmd.setInterpupillaryDistance) { + hmd.setInterpupillaryDistance(viewer.interLensDistance); + } + }.bind(this)); +}; + +WebVRManager.prototype.onDeviceParamsUpdated_ = function(newParams) { + console.log('DPDB reported that device params were updated.'); + this.deviceInfo.updateDeviceParams(newParams); + this.distorter.updateDeviceInfo(this.deviceInfo); +}; + +module.exports = WebVRManager; + +},{"./button-manager.js":2,"./cardboard-distorter.js":3,"./device-info.js":4,"./dpdb.js":8,"./emitter.js":9,"./modes.js":11,"./rotate-instructions.js":12,"./util.js":13,"./viewer-selector.js":14,"./wakelock.js":15}]},{},[10]); + +},{}],7:[function(_dereq_,module,exports){ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o Util.MAX_TIMESTEP) { + console.warn('Invalid timestamps detected. Time step between successive ' + + 'gyroscope sensor samples is very small or not monotonic'); + this.previousTimestampS = timestampS; + return; + } + this.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z); + this.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma); + + // With iOS and Firefox Android, rotationRate is reported in degrees, + // so we first convert to radians. + if (this.isIOS || this.isFirefoxAndroid) { + this.gyroscope.multiplyScalar(Math.PI / 180); + } + + this.filter.addAccelMeasurement(this.accelerometer, timestampS); + this.filter.addGyroMeasurement(this.gyroscope, timestampS); + + this.previousTimestampS = timestampS; +}; + +FusionPositionSensorVRDevice.prototype.onScreenOrientationChange_ = + function(screenOrientation) { + this.setScreenTransform_(); +}; + +FusionPositionSensorVRDevice.prototype.setScreenTransform_ = function() { + this.worldToScreenQ.set(0, 0, 0, 1); + switch (window.orientation) { + case 0: + break; + case 90: + this.worldToScreenQ.setFromAxisAngle(new THREE.Vector3(0, 0, 1), -Math.PI/2); + break; + case -90: + this.worldToScreenQ.setFromAxisAngle(new THREE.Vector3(0, 0, 1), Math.PI/2); + break; + case 180: + // TODO. + break; + } +}; + + +module.exports = FusionPositionSensorVRDevice; + +},{"./base.js":1,"./complementary-filter.js":3,"./pose-predictor.js":7,"./three-math.js":9,"./touch-panner.js":10,"./util.js":11}],5:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var WebVRPolyfill = _dereq_('./webvr-polyfill.js'); + +// Initialize a WebVRConfig just in case. +window.WebVRConfig = window.WebVRConfig || {}; +new WebVRPolyfill(); + +},{"./webvr-polyfill.js":12}],6:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var PositionSensorVRDevice = _dereq_('./base.js').PositionSensorVRDevice; +var THREE = _dereq_('./three-math.js'); +var Util = _dereq_('./util.js'); + +// How much to rotate per key stroke. +var KEY_SPEED = 0.15; +var KEY_ANIMATION_DURATION = 80; + +// How much to rotate for mouse events. +var MOUSE_SPEED_X = 0.5; +var MOUSE_SPEED_Y = 0.3; + +/** + * A virtual position sensor, implemented using keyboard and + * mouse APIs. This is designed as for desktops/laptops where no Device* + * events work. + */ +function MouseKeyboardPositionSensorVRDevice() { + this.deviceId = 'webvr-polyfill:mouse-keyboard'; + this.deviceName = 'VR Position Device (webvr-polyfill:mouse-keyboard)'; + + // Attach to mouse and keyboard events. + window.addEventListener('keydown', this.onKeyDown_.bind(this)); + window.addEventListener('mousemove', this.onMouseMove_.bind(this)); + window.addEventListener('mousedown', this.onMouseDown_.bind(this)); + window.addEventListener('mouseup', this.onMouseUp_.bind(this)); + + this.phi = 0; + this.theta = 0; + + // Variables for keyboard-based rotation animation. + this.targetAngle = null; + + // State variables for calculations. + this.euler = new THREE.Euler(); + this.orientation = new THREE.Quaternion(); + + // Variables for mouse-based rotation. + this.rotateStart = new THREE.Vector2(); + this.rotateEnd = new THREE.Vector2(); + this.rotateDelta = new THREE.Vector2(); +} +MouseKeyboardPositionSensorVRDevice.prototype = new PositionSensorVRDevice(); + +/** + * Returns {orientation: {x,y,z,w}, position: null}. + * Position is not supported for parity with other PositionSensors. + */ +MouseKeyboardPositionSensorVRDevice.prototype.getState = function() { + this.euler.set(this.phi, this.theta, 0, 'YXZ'); + this.orientation.setFromEuler(this.euler); + + return { + hasOrientation: true, + orientation: this.orientation, + hasPosition: false, + position: null + } +}; + +MouseKeyboardPositionSensorVRDevice.prototype.onKeyDown_ = function(e) { + // Track WASD and arrow keys. + if (e.keyCode == 38) { // Up key. + this.animatePhi_(this.phi + KEY_SPEED); + } else if (e.keyCode == 39) { // Right key. + this.animateTheta_(this.theta - KEY_SPEED); + } else if (e.keyCode == 40) { // Down key. + this.animatePhi_(this.phi - KEY_SPEED); + } else if (e.keyCode == 37) { // Left key. + this.animateTheta_(this.theta + KEY_SPEED); + } +}; + +MouseKeyboardPositionSensorVRDevice.prototype.animateTheta_ = function(targetAngle) { + this.animateKeyTransitions_('theta', targetAngle); +}; + +MouseKeyboardPositionSensorVRDevice.prototype.animatePhi_ = function(targetAngle) { + // Prevent looking too far up or down. + targetAngle = Util.clamp(targetAngle, -Math.PI/2, Math.PI/2); + this.animateKeyTransitions_('phi', targetAngle); +}; + +/** + * Start an animation to transition an angle from one value to another. + */ +MouseKeyboardPositionSensorVRDevice.prototype.animateKeyTransitions_ = function(angleName, targetAngle) { + // If an animation is currently running, cancel it. + if (this.angleAnimation) { + clearInterval(this.angleAnimation); + } + var startAngle = this[angleName]; + var startTime = new Date(); + // Set up an interval timer to perform the animation. + this.angleAnimation = setInterval(function() { + // Once we're finished the animation, we're done. + var elapsed = new Date() - startTime; + if (elapsed >= KEY_ANIMATION_DURATION) { + this[angleName] = targetAngle; + clearInterval(this.angleAnimation); + return; + } + // Linearly interpolate the angle some amount. + var percent = elapsed / KEY_ANIMATION_DURATION; + this[angleName] = startAngle + (targetAngle - startAngle) * percent; + }.bind(this), 1000/60); +}; + +MouseKeyboardPositionSensorVRDevice.prototype.onMouseDown_ = function(e) { + this.rotateStart.set(e.clientX, e.clientY); + this.isDragging = true; +}; + +// Very similar to https://gist.github.com/mrflix/8351020 +MouseKeyboardPositionSensorVRDevice.prototype.onMouseMove_ = function(e) { + if (!this.isDragging && !this.isPointerLocked_()) { + return; + } + // Support pointer lock API. + if (this.isPointerLocked_()) { + var movementX = e.movementX || e.mozMovementX || 0; + var movementY = e.movementY || e.mozMovementY || 0; + this.rotateEnd.set(this.rotateStart.x - movementX, this.rotateStart.y - movementY); + } else { + this.rotateEnd.set(e.clientX, e.clientY); + } + // Calculate how much we moved in mouse space. + this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart); + this.rotateStart.copy(this.rotateEnd); + + // Keep track of the cumulative euler angles. + var element = document.body; + this.phi += 2 * Math.PI * this.rotateDelta.y / element.clientHeight * MOUSE_SPEED_Y; + this.theta += 2 * Math.PI * this.rotateDelta.x / element.clientWidth * MOUSE_SPEED_X; + + // Prevent looking too far up or down. + this.phi = Util.clamp(this.phi, -Math.PI/2, Math.PI/2); +}; + +MouseKeyboardPositionSensorVRDevice.prototype.onMouseUp_ = function(e) { + this.isDragging = false; +}; + +MouseKeyboardPositionSensorVRDevice.prototype.isPointerLocked_ = function() { + var el = document.pointerLockElement || document.mozPointerLockElement || + document.webkitPointerLockElement; + return el !== undefined; +}; + +MouseKeyboardPositionSensorVRDevice.prototype.resetSensor = function() { + console.error('Not implemented yet.'); +}; + +module.exports = MouseKeyboardPositionSensorVRDevice; + +},{"./base.js":1,"./three-math.js":9,"./util.js":11}],7:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var THREE = _dereq_('./three-math.js'); + +var DEBUG = false; + +/** + * Given an orientation and the gyroscope data, predicts the future orientation + * of the head. This makes rendering appear faster. + * + * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf + * + * @param {Number} predictionTimeS time from head movement to the appearance of + * the corresponding image. + */ +function PosePredictor(predictionTimeS) { + this.predictionTimeS = predictionTimeS; + + // The quaternion corresponding to the previous state. + this.previousQ = new THREE.Quaternion(); + // Previous time a prediction occurred. + this.previousTimestampS = null; + + // The delta quaternion that adjusts the current pose. + this.deltaQ = new THREE.Quaternion(); + // The output quaternion. + this.outQ = new THREE.Quaternion(); +} + +PosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) { + if (!this.previousTimestampS) { + this.previousQ.copy(currentQ); + this.previousTimestampS = timestampS; + return currentQ; + } + + // Calculate axis and angle based on gyroscope rotation rate data. + var axis = new THREE.Vector3(); + axis.copy(gyro); + axis.normalize(); + + var angularSpeed = gyro.length(); + + // If we're rotating slowly, don't do prediction. + if (angularSpeed < THREE.Math.degToRad(20)) { + if (DEBUG) { + console.log('Moving slowly, at %s deg/s: no prediction', + THREE.Math.radToDeg(angularSpeed).toFixed(1)); + } + this.outQ.copy(currentQ); + this.previousQ.copy(currentQ); + return this.outQ; + } + + // Get the predicted angle based on the time delta and latency. + var deltaT = timestampS - this.previousTimestampS; + var predictAngle = angularSpeed * this.predictionTimeS; + + this.deltaQ.setFromAxisAngle(axis, predictAngle); + this.outQ.copy(this.previousQ); + this.outQ.multiply(this.deltaQ); + + this.previousQ.copy(currentQ); + + return this.outQ; +}; + + +module.exports = PosePredictor; + +},{"./three-math.js":9}],8:[function(_dereq_,module,exports){ +function SensorSample(sample, timestampS) { + this.set(sample, timestampS); +}; + +SensorSample.prototype.set = function(sample, timestampS) { + this.sample = sample; + this.timestampS = timestampS; +}; + +SensorSample.prototype.copy = function(sensorSample) { + this.set(sensorSample.sample, sensorSample.timestampS); +}; + +module.exports = SensorSample; + +},{}],9:[function(_dereq_,module,exports){ +/* + * A subset of THREE.js, providing mostly quaternion and euler-related + * operations, manually lifted from + * https://github.com/mrdoob/three.js/tree/master/src/math, as of 9c30286b38df039fca389989ff06ea1c15d6bad1 + */ + +// Only use if the real THREE is not provided. +var THREE = window.THREE || {}; + +// If some piece of THREE is missing, fill it in here. +if (!THREE.Quaternion || !THREE.Vector3 || !THREE.Vector2 || !THREE.Euler || !THREE.Math) { +console.log('No THREE.js found.'); + + +/*** START Quaternion ***/ + +/** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://exocortex.com + */ + +THREE.Quaternion = function ( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + +}; + +THREE.Quaternion.prototype = { + + constructor: THREE.Quaternion, + + _x: 0,_y: 0, _z: 0, _w: 0, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get w () { + + return this._w; + + }, + + set w ( value ) { + + this._w = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( euler instanceof THREE.Euler === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + } + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var c1 = Math.cos( euler._x / 2 ); + var c2 = Math.cos( euler._y / 2 ); + var c3 = Math.cos( euler._z / 2 ); + var s1 = Math.sin( euler._x / 2 ); + var s2 = Math.sin( euler._y / 2 ); + var s3 = Math.sin( euler._z / 2 ); + + if ( euler.order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( euler.order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( euler.order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( euler.order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( euler.order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( euler.order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final + + // assumes direction vectors vFrom and vTo are normalized + + var v1, r; + + var EPS = 0.000001; + + return function ( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + this.normalize(); + + return this; + + } + + }(), + + inverse: function () { + + this.conjugate().normalize(); + + return this; + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + multiplyVector3: function ( vector ) { + + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var halfTheta = Math.acos( cosHalfTheta ); + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {}, + + clone: function () { + + return new THREE.Quaternion( this._x, this._y, this._z, this._w ); + + } + +}; + +THREE.Quaternion.slerp = function ( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + +} + +/*** END Quaternion ***/ +/*** START Vector2 ***/ +/** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + +THREE.Vector2 = function ( x, y ) { + + this.x = x || 0; + this.y = y || 0; + +}; + +THREE.Vector2.prototype = { + + constructor: THREE.Vector2, + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.x *= s; + this.y *= s; + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + if ( scalar !== 0 ) { + + var invScalar = 1 / scalar; + + this.x *= invScalar; + this.y *= invScalar; + + } else { + + this.x = 0; + this.y = 0; + + } + + return this; + + }, + + min: function ( v ) { + + if ( this.x > v.x ) { + + this.x = v.x; + + } + + if ( this.y > v.y ) { + + this.y = v.y; + + } + + return this; + + }, + + max: function ( v ) { + + if ( this.x < v.x ) { + + this.x = v.x; + + } + + if ( this.y < v.y ) { + + this.y = v.y; + + } + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + if ( this.x < min.x ) { + + this.x = min.x; + + } else if ( this.x > max.x ) { + + this.x = max.x; + + } + + if ( this.y < min.y ) { + + this.y = min.y; + + } else if ( this.y > max.y ) { + + this.y = max.y; + + } + + return this; + }, + + clampScalar: ( function () { + + var min, max; + + return function ( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector2(); + max = new THREE.Vector2(); + + } + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + } )(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + setLength: function ( l ) { + + var oldLength = this.length(); + + if ( oldLength !== 0 && l !== oldLength ) { + + this.multiplyScalar( l / oldLength ); + } + + return this; + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + + return this; + + }, + + clone: function () { + + return new THREE.Vector2( this.x, this.y ); + + } + +}; +/*** END Vector2 ***/ +/*** START Vector3 ***/ + +/** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + +THREE.Vector3 = function ( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + +}; + +THREE.Vector3.prototype = { + + constructor: THREE.Vector3, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion; + + return function ( euler ) { + + if ( euler instanceof THREE.Euler === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); + + this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + return this; + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion; + + return function ( axis, angle ) { + + if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); + + this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + return this; + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x; + var y = this.y; + var z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + // input: THREE.Matrix4 affine matrix + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + + return this; + + }, + + applyProjection: function ( m ) { + + // input: THREE.Matrix4 projection matrix + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + var d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x; + var y = this.y; + var z = this.z; + + var qx = q.x; + var qy = q.y; + var qz = q.z; + var qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix; + + return function ( camera ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix; + + return function ( camera ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + this.normalize(); + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + if ( scalar !== 0 ) { + + var invScalar = 1 / scalar; + + this.x *= invScalar; + this.y *= invScalar; + this.z *= invScalar; + + } else { + + this.x = 0; + this.y = 0; + this.z = 0; + + } + + return this; + + }, + + min: function ( v ) { + + if ( this.x > v.x ) { + + this.x = v.x; + + } + + if ( this.y > v.y ) { + + this.y = v.y; + + } + + if ( this.z > v.z ) { + + this.z = v.z; + + } + + return this; + + }, + + max: function ( v ) { + + if ( this.x < v.x ) { + + this.x = v.x; + + } + + if ( this.y < v.y ) { + + this.y = v.y; + + } + + if ( this.z < v.z ) { + + this.z = v.z; + + } + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + if ( this.x < min.x ) { + + this.x = min.x; + + } else if ( this.x > max.x ) { + + this.x = max.x; + + } + + if ( this.y < min.y ) { + + this.y = min.y; + + } else if ( this.y > max.y ) { + + this.y = max.y; + + } + + if ( this.z < min.z ) { + + this.z = min.z; + + } else if ( this.z > max.z ) { + + this.z = max.z; + + } + + return this; + + }, + + clampScalar: ( function () { + + var min, max; + + return function ( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new THREE.Vector3(); + max = new THREE.Vector3(); + + } + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + } )(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( l ) { + + var oldLength = this.length(); + + if ( oldLength !== 0 && l !== oldLength ) { + + this.multiplyScalar( l / oldLength ); + } + + return this; + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function () { + + var v1, dot; + + return function ( vector ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + v1.copy( vector ).normalize(); + + dot = this.dot( v1 ); + + return this.copy( v1 ).multiplyScalar( dot ); + + }; + + }(), + + projectOnPlane: function () { + + var v1; + + return function ( planeNormal ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + } + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1; + + return function ( normal ) { + + if ( v1 === undefined ) v1 = new THREE.Vector3(); + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + } + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( this.length() * v.length() ); + + // clamp, to handle numerical problems + + return Math.acos( THREE.Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x; + var dy = this.y - v.y; + var dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + setEulerFromRotationMatrix: function ( m, order ) { + + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + + }, + + setEulerFromQuaternion: function ( q, order ) { + + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + + }, + + getPositionFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + + return this.setFromMatrixPosition( m ); + + }, + + getScaleFromMatrix: function ( m ) { + + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + + return this.setFromMatrixScale( m ); + }, + + getColumnFromMatrix: function ( index, matrix ) { + + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + + return this.setFromMatrixColumn( index, matrix ); + + }, + + setFromMatrixPosition: function ( m ) { + + this.x = m.elements[ 12 ]; + this.y = m.elements[ 13 ]; + this.z = m.elements[ 14 ]; + + return this; + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.set( m.elements[ 0 ], m.elements[ 1 ], m.elements[ 2 ] ).length(); + var sy = this.set( m.elements[ 4 ], m.elements[ 5 ], m.elements[ 6 ] ).length(); + var sz = this.set( m.elements[ 8 ], m.elements[ 9 ], m.elements[ 10 ] ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + }, + + setFromMatrixColumn: function ( index, matrix ) { + + var offset = index * 4; + + var me = matrix.elements; + + this.x = me[ offset ]; + this.y = me[ offset + 1 ]; + this.z = me[ offset + 2 ]; + + return this; + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + + return this; + + }, + + clone: function () { + + return new THREE.Vector3( this.x, this.y, this.z ); + + } + +}; +/*** END Vector3 ***/ +/*** START Euler ***/ +/** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://exocortex.com + */ + +THREE.Euler = function ( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || THREE.Euler.DefaultOrder; + +}; + +THREE.Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + +THREE.Euler.DefaultOrder = 'XYZ'; + +THREE.Euler.prototype = { + + constructor: THREE.Euler, + + _x: 0, _y: 0, _z: 0, _order: THREE.Euler.DefaultOrder, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get order () { + + return this._order; + + }, + + set order ( value ) { + + this._order = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = THREE.Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ) + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix; + + return function ( q, order, update ) { + + if ( matrix === undefined ) matrix = new THREE.Matrix4(); + matrix.makeRotationFromQuaternion( q ); + this.setFromRotationMatrix( matrix, order, update ); + + return this; + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new THREE.Quaternion(); + + return function ( newOrder ) { + + q.setFromEuler( this ); + this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function () { + + return [ this._x, this._y, this._z, this._order ]; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new THREE.Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {}, + + clone: function () { + + return new THREE.Euler( this._x, this._y, this._z, this._order ); + + } + +}; +/*** END Euler ***/ +/*** START Math ***/ +/** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.Math = { + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function () { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i == 8 || i == 13 || i == 18 || i == 23 ) { + + uuid[ i ] = '-'; + + } else if ( i == 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i == 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + } + + return uuid.join( '' ); + + }; + + }(), + + // Clamp value to range + + clamp: function ( x, a, b ) { + + return ( x < a ) ? a : ( ( x > b ) ? b : x ); + + }, + + // Clamp value to range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + // Random float from <0, 1> with 16 bits of randomness + // (standard Math.random() creates repetitive patterns when applied over larger space) + + random16: function () { + + return ( 65280 * Math.random() + 255 * Math.random() ) / 65535; + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return Math.floor( this.randFloat( low, high ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function () { + + var degreeToRadiansFactor = Math.PI / 180; + + return function ( degrees ) { + + return degrees * degreeToRadiansFactor; + + }; + + }(), + + radToDeg: function () { + + var radianToDegreesFactor = 180 / Math.PI; + + return function ( radians ) { + + return radians * radianToDegreesFactor; + + }; + + }(), + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + } + +}; + +/*** END Math ***/ + +} + +module.exports = THREE; + +},{}],10:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var THREE = _dereq_('./three-math.js'); +var Util = _dereq_('./util.js'); + +var ROTATE_SPEED = 0.5; +/** + * Provides a quaternion responsible for pre-panning the scene before further + * transformations due to device sensors. + */ +function TouchPanner() { + window.addEventListener('touchstart', this.onTouchStart_.bind(this)); + window.addEventListener('touchmove', this.onTouchMove_.bind(this)); + window.addEventListener('touchend', this.onTouchEnd_.bind(this)); + + this.isTouching = false; + this.rotateStart = new THREE.Vector2(); + this.rotateEnd = new THREE.Vector2(); + this.rotateDelta = new THREE.Vector2(); + + this.theta = 0; + this.orientation = new THREE.Quaternion(); +} + +TouchPanner.prototype.getOrientation = function() { + this.orientation.setFromEuler(new THREE.Euler(0, 0, this.theta)); + return this.orientation; +}; + +TouchPanner.prototype.resetSensor = function() { + this.theta = 0; +}; + +TouchPanner.prototype.onTouchStart_ = function(e) { + // Only respond if there is exactly one touch. + if (e.touches.length != 1) { + return; + } + this.rotateStart.set(e.touches[0].pageX, e.touches[0].pageY); + this.isTouching = true; +}; + +TouchPanner.prototype.onTouchMove_ = function(e) { + if (!this.isTouching) { + return; + } + this.rotateEnd.set(e.touches[0].pageX, e.touches[0].pageY); + this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart); + this.rotateStart.copy(this.rotateEnd); + + // On iOS, direction is inverted. + if (Util.isIOS()) { + this.rotateDelta.x *= -1; + } + + var element = document.body; + this.theta += 2 * Math.PI * this.rotateDelta.x / element.clientWidth * ROTATE_SPEED; +}; + +TouchPanner.prototype.onTouchEnd_ = function(e) { + this.isTouching = false; +}; + +module.exports = TouchPanner; + +},{"./three-math.js":9,"./util.js":11}],11:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var Util = window.Util || {}; + +Util.MIN_TIMESTEP = 0.001; +Util.MAX_TIMESTEP = 1; + +Util.clamp = function(value, min, max) { + return Math.min(Math.max(min, value), max); +}; + +Util.isIOS = function() { + return /iPad|iPhone|iPod/.test(navigator.platform); +}; + +Util.isFirefoxAndroid = function() { + return navigator.userAgent.indexOf('Firefox') !== -1 && navigator.userAgent.indexOf('Android') !== -1; +} + +// Helper method to validate the time steps of sensor timestamps. +Util.isTimestampDeltaValid = function(timestampDeltaS) { + if (isNaN(timestampDeltaS)) { + return false; + } + if (timestampDeltaS <= Util.MIN_TIMESTEP) { + return false; + } + if (timestampDeltaS > Util.MAX_TIMESTEP) { + return false; + } + return true; +} + +module.exports = Util; + +},{}],12:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var CardboardHMDVRDevice = _dereq_('./cardboard-hmd-vr-device.js'); +//var OrientationPositionSensorVRDevice = require('./orientation-position-sensor-vr-device.js'); +var FusionPositionSensorVRDevice = _dereq_('./fusion-position-sensor-vr-device.js'); +var MouseKeyboardPositionSensorVRDevice = _dereq_('./mouse-keyboard-position-sensor-vr-device.js'); +// Uncomment to add positional tracking via webcam. +//var WebcamPositionSensorVRDevice = require('./webcam-position-sensor-vr-device.js'); +var HMDVRDevice = _dereq_('./base.js').HMDVRDevice; +var PositionSensorVRDevice = _dereq_('./base.js').PositionSensorVRDevice; + +function WebVRPolyfill() { + this.devices = []; + + if (!this.isWebVRAvailable()) { + this.enablePolyfill(); + } +} + +WebVRPolyfill.prototype.isWebVRAvailable = function() { + return ('getVRDevices' in navigator) || ('mozGetVRDevices' in navigator); +}; + + +WebVRPolyfill.prototype.enablePolyfill = function() { + // Initialize our virtual VR devices. + if (this.isCardboardCompatible()) { + this.devices.push(new CardboardHMDVRDevice()); + } + + // Polyfill using the right position sensor. + if (this.isMobile()) { + //this.devices.push(new OrientationPositionSensorVRDevice()); + this.devices.push(new FusionPositionSensorVRDevice()); + } else { + if (!WebVRConfig.MOUSE_KEYBOARD_CONTROLS_DISABLED) { + this.devices.push(new MouseKeyboardPositionSensorVRDevice()); + } + // Uncomment to add positional tracking via webcam. + //this.devices.push(new WebcamPositionSensorVRDevice()); + } + + // Provide navigator.getVRDevices. + navigator.getVRDevices = this.getVRDevices.bind(this); + + // Provide the CardboardHMDVRDevice and PositionSensorVRDevice objects. + window.HMDVRDevice = HMDVRDevice; + window.PositionSensorVRDevice = PositionSensorVRDevice; +}; + +WebVRPolyfill.prototype.getVRDevices = function() { + var devices = this.devices; + return new Promise(function(resolve, reject) { + try { + resolve(devices); + } catch (e) { + reject(e); + } + }); +}; + +/** + * Determine if a device is mobile. + */ +WebVRPolyfill.prototype.isMobile = function() { + return /Android/i.test(navigator.userAgent) || + /iPhone|iPad|iPod/i.test(navigator.userAgent); +}; + +WebVRPolyfill.prototype.isCardboardCompatible = function() { + // For now, support all iOS and Android devices. + // Also enable the WebVRConfig.FORCE_VR flag for debugging. + return this.isMobile() || WebVRConfig.FORCE_ENABLE_VR; +}; + +module.exports = WebVRPolyfill; + +},{"./base.js":1,"./cardboard-hmd-vr-device.js":2,"./fusion-position-sensor-vr-device.js":4,"./mouse-keyboard-position-sensor-vr-device.js":6}]},{},[5]); + +},{}],8:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/** + * Sits in an embedded iframe, receiving DeviceMotion messages from a containing + * iFrame. These messages are converted into synthetic DeviceMotion events. + * + * This is a workaround for https://bugs.webkit.org/show_bug.cgi?id=150072. + */ +function DeviceMotionReceiver() { + window.addEventListener('message', this.onMessage_.bind(this), false); +} + +DeviceMotionReceiver.prototype.onMessage_ = function(event) { + var message = event.data; + if (message.type !== 'DeviceMotion') { + console.warn('Got unknown message of type %s from %s', message.type, message.origin); + return; + } + + console.log('onMessage_', event); + + // Synthesize a DeviceMotion event. + this.synthesizeDeviceMotionEvent_(message.deviceMotionEvent); +}; + +DeviceMotionReceiver.prototype.synthesizeDeviceMotionEvent_ = function(eventData) { + var type = 'devicemotion-iframe'; + var canBubble = false; + var cancelable = false; + + var dme = document.createEvent('DeviceMotionEvent'); + dme.initDeviceMotionEvent(type, canBubble, cancelable, + eventData.acceleration, + eventData.accelerationIncludingGravity, + eventData.rotationRate, + eventData.interval); + + window.dispatchEvent(dme); +}; + +module.exports = DeviceMotionReceiver; + +},{}],9:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +function Emitter() { + this.initEmitter(); +} + +Emitter.prototype.initEmitter = function() { + this.callbacks = {}; +}; + +Emitter.prototype.emit = function(eventName) { + var callbacks = this.callbacks[eventName]; + if (!callbacks) { + console.log('No valid callback specified.'); + return; + } + var args = [].slice.call(arguments) + // Eliminate the first param (the callback). + args.shift(); + for (var i = 0; i < callbacks.length; i++) { + callbacks[i].apply(this, args); + } +}; + +Emitter.prototype.on = function(eventName, callback) { + if (eventName in this.callbacks) { + var cbs = this.callbacks[eventName] + if (cbs.indexOf(callback) == -1) { + cbs.push(callback); + } + } else { + this.callbacks[eventName] = [callback]; + } +}; + +Emitter.prototype.removeListener = function(eventName, callback) { + if (!(eventName in this.callbacks)) { + return; + } + var cbs = this.callbacks[eventName]; + var ind = cbs.indexOf(callback); + if (ind == -1) { + console.warn('No matching callback found'); + return; + } + cbs.splice(ind, 1); +}; + +module.exports = Emitter; + +},{}],10:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var Eyes = { + LEFT: 0, + RIGHT: 1 +}; + +module.exports = Eyes; + +},{}],11:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Shows a 2D loading indicator while various pieces of EmbedVR load. + */ +function LoadingIndicator() { + this.el = this.build_(); + document.body.appendChild(this.el); + this.show(); +} + +LoadingIndicator.prototype.build_ = function() { + var overlay = document.createElement('div'); + var s = overlay.style; + s.position = 'fixed'; + s.top = 0; + s.left = 0; + s.width = '100%'; + s.height = '100%'; + s.background = '#eee'; + var img = document.createElement('img'); + img.src = 'images/loading.gif'; + var s = img.style; + s.position = 'absolute'; + s.top = '50%'; + s.left = '50%'; + s.transform = 'translate(-50%, -50%)'; + + overlay.appendChild(img); + return overlay; +}; + +LoadingIndicator.prototype.hide = function() { + this.el.style.display = 'none'; +}; + +LoadingIndicator.prototype.show = function() { + this.el.style.display = 'block'; +}; + +module.exports = LoadingIndicator; + +},{}],12:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Disable distortion provided by the boilerplate because we are doing +// vertex-based distortion. +WebVRConfig = window.WebVRConfig || {} +WebVRConfig.PREVENT_DISTORTION = true; + +// Initialize the loading indicator as quickly as possible to give the user +// immediate feedback. +var LoadingIndicator = _dereq_('./loading-indicator'); +var loadIndicator = new LoadingIndicator(); + +// Include relevant polyfills. +_dereq_('../node_modules/webvr-polyfill/build/webvr-polyfill'); +var ES6Promise = _dereq_('../node_modules/es6-promise/dist/es6-promise.min'); +// Polyfill ES6 promises for IE. +ES6Promise.polyfill(); + +var PhotosphereRenderer = _dereq_('./photosphere-renderer'); +var SceneLoader = _dereq_('./scene-loader'); +var Stats = _dereq_('../node_modules/stats-js/build/stats.min'); +var Util = _dereq_('./util'); + +// Include the DeviceMotionReceiver for the iOS cross domain iframe workaround. +// This is a workaround for https://bugs.webkit.org/show_bug.cgi?id=150072. +var DeviceMotionReceiver = _dereq_('./device-motion-receiver'); +var dmr = new DeviceMotionReceiver(); + + +window.addEventListener('load', init); + +var stats = new Stats(); + +var loader = new SceneLoader(); +loader.on('error', onSceneError); +loader.on('load', onSceneLoad); + +var renderer = new PhotosphereRenderer(); +renderer.on('error', onRenderError); + +var videoElement = null; +// TODO: Make this not global. +// Currently global in order to allow callbacks. +var loadedScene = null; + +function init() { + if (!Util.isWebGLEnabled()) { + showError('WebGL not supported.'); + return; + } + // Load the scene. + loader.loadScene(); + + if (Util.getQueryParameter('debug')) { + showStats(); + } +} + +function loadImage(src, params) { + renderer.on('load', onRenderLoad); + renderer.setPhotosphere(src, params); +} + +function onSceneLoad(scene) { + if (!scene || !scene.isComplete()) { + showError('Scene failed to load'); + return; + } + + loadedScene = scene; + + var params = { + isStereo: scene.isStereo, + } + renderer.setDefaultLookDirection(scene.yaw || 0); + + if (scene.preview) { + var onPreviewLoad = function() { + loadIndicator.hide(); + renderer.removeListener('load', onPreviewLoad); + renderer.setPhotosphere(scene.image, params); + } + renderer.removeListener('load', onRenderLoad); + renderer.on('load', onPreviewLoad); + renderer.setPhotosphere(scene.preview, params); + } else if (scene.video) { + if (Util.isIOS() || Util.isIE11()) { + // On iOS and IE 11, if an 'image' param is provided, load it instead of + // showing an error. + // + // TODO(smus): Once video textures are supported, remove this fallback. + if (scene.image) { + loadImage(scene.image, params); + } else { + showError('Video is not supported on this platform (iOS or IE11).'); + } + } else { + // Load the video element. + videoElement = document.createElement('video'); + videoElement.src = scene.video; + videoElement.loop = true; + videoElement.setAttribute('crossorigin', 'anonymous'); + videoElement.addEventListener('canplaythrough', onVideoLoad); + videoElement.addEventListener('error', onVideoError); + } + } else if (scene.image) { + // Otherwise, just render the photosphere. + loadImage(scene.image, params); + } + + console.log('Loaded scene', scene); +} + +function onVideoLoad() { + // Render the stereo video. + var params = { + isStereo: loadedScene.isStereo, + } + renderer.set360Video(videoElement, params); + + // On mobile, tell the user they need to tap to start. Otherwise, autoplay. + if (!Util.isMobile()) { + // Hide loading indicator. + loadIndicator.hide(); + // Autoplay the video on desktop. + videoElement.play(); + } else { + // Tell user to tap to start. + showError('Tap to start video', 'Play'); + document.body.addEventListener('touchend', onVideoTap); + } + + // Prevent onVideoLoad from firing multiple times. + videoElement.removeEventListener('canplaythrough', onVideoLoad); +} + +function onVideoTap() { + hideError(); + videoElement.play(); + + // Prevent multiple play() calls on the video element. + document.body.removeEventListener('touchend', onVideoTap); +} + +function onRenderLoad() { + // Hide loading indicator. + loadIndicator.hide(); +} + +function onSceneError(message) { + showError('Loader: ' + message); +} + +function onRenderError(message) { + showError('Render: ' + message); +} + +function onVideoError(e) { + showError('Video load error'); + console.log(e); +} + +function showError(message, opt_title) { + // Hide loading indicator. + loadIndicator.hide(); + + var error = document.querySelector('#error'); + error.classList.add('visible'); + error.querySelector('.message').innerHTML = message; + + var title = (opt_title !== undefined ? opt_title : 'Error'); + error.querySelector('.title').innerHTML = title; +} + +function hideError() { + var error = document.querySelector('#error'); + error.classList.remove('visible'); +} + +function showStats() { + stats.setMode(0); // 0: fps, 1: ms + + // Align bottom-left. + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.bottom = '0px'; + document.body.appendChild(stats.domElement); +} + +function loop(time) { + stats.begin(); + renderer.render(time); + stats.end(); + requestAnimationFrame(loop); +} +requestAnimationFrame(loop); + +},{"../node_modules/es6-promise/dist/es6-promise.min":1,"../node_modules/stats-js/build/stats.min":2,"../node_modules/webvr-polyfill/build/webvr-polyfill":7,"./device-motion-receiver":8,"./loading-indicator":11,"./photosphere-renderer":13,"./scene-loader":15,"./util":16}],13:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Emitter = _dereq_('./emitter'); +var Eyes = _dereq_('./eyes'); +var THREE = _dereq_('../node_modules/three/three'); +THREE.VRControls = _dereq_('../node_modules/three/examples/js/controls/VRControls'); +THREE.VREffect = _dereq_('../node_modules/three/examples/js/effects/VREffect'); +var Util = _dereq_('./util'); +var VertexDistorter = _dereq_('./vertex-distorter'); +_dereq_('../node_modules/webvr-boilerplate/build/webvr-manager'); + +function PhotosphereRenderer() { + this.init(); +} +PhotosphereRenderer.prototype = new Emitter(); + +PhotosphereRenderer.prototype.init = function() { + var container = document.querySelector('body'); + var camera = new THREE.PerspectiveCamera(80, window.innerWidth / window.innerHeight, 0.1, 100); + var cameraDummy = new THREE.Object3D(); + cameraDummy.add(camera); + + // Antialiasing temporarily disabled to improve performance. + var renderer = new THREE.WebGLRenderer({antialias: false}); + renderer.setClearColor(0x000000, 0); + renderer.setSize(window.innerWidth, window.innerHeight); + + // Round down fractional DPR values for better performance. + renderer.setPixelRatio(Math.floor(window.devicePixelRatio)); + container.appendChild(renderer.domElement); + + var controls = new THREE.VRControls(camera); + var effect = new THREE.VREffect(renderer); + effect.setSize(window.innerWidth, window.innerHeight); + + this.camera = camera; + this.renderer = renderer; + this.effect = effect; + this.controls = controls; + this.manager = new WebVRManager(renderer, effect, {isUndistorted: true}); + + this.initScenes_(); + + // The vertex distorter. + this.distorter = new VertexDistorter(this.manager.getDeviceInfo()); + + this.manager.on('modechange', this.onModeChange_.bind(this)); + this.manager.on('viewerchange', this.onViewerChange_.bind(this)); + + // Watch the resize event. + window.addEventListener('resize', this.onResize_.bind(this)); + + var that = this; + navigator.getVRDevices().then(function(devices) { + devices.forEach(function(device) { + if (device instanceof HMDVRDevice) { + that.hmd = device; + } + }); + }); +}; + +PhotosphereRenderer.prototype.render = function(timestamp) { + this.controls.update(); + this.manager.render(this.scenes, this.camera, timestamp); +}; + +PhotosphereRenderer.prototype.setDefaultLookDirection = function(phi) { + // Rotate the camera parent to take into account the scene's rotation. + this.camera.parent.rotation.y = phi; +}; + +/** + * Sets the photosphere based on the image in the source. Supports stereo and + * mono photospheres. + * + * Emits 'load' and 'error' events. + */ +PhotosphereRenderer.prototype.setPhotosphere = function(src, opt_params) { + var params = opt_params || {}; + + this.isStereo = !!params.isStereo; + this.src = src; + + // Load texture. + var loader = new THREE.TextureLoader(); + loader.crossOrigin = 'anonymous'; + loader.load(src, this.onTextureLoaded_.bind(this), null, + this.onTextureError_.bind(this)); +}; + +PhotosphereRenderer.prototype.set360Video = function(videoElement, opt_params) { + var params = opt_params || {}; + + this.isStereo = !!params.isStereo; + + // Load the video texture. + var videoTexture = new THREE.VideoTexture(videoElement); + videoTexture.minFilter = THREE.LinearFilter; + videoTexture.magFilter = THREE.LinearFilter; + videoTexture.format = THREE.RGBFormat; + videoTexture.generateMipmaps = false; + videoTexture.needsUpdate = true; + + this.onTextureLoaded_(videoTexture); +}; + +PhotosphereRenderer.prototype.initScenes_ = function() { + this.sceneLeft = this.createScene_(); + this.sceneRight = this.createScene_(); + this.sceneLeft.add(this.camera.parent); + + this.scenes = [this.sceneLeft, this.sceneRight]; + this.eyes = [Eyes.LEFT, Eyes.RIGHT]; +}; + +PhotosphereRenderer.prototype.onTextureLoaded_ = function(texture) { + var sphereLeft; + var sphereRight; + if (this.isStereo) { + sphereLeft = this.createPhotosphere_(texture, {offsetY: 0.5, scaleY: 0.5}); + sphereRight = this.createPhotosphere_(texture, {offsetY: 0, scaleY: 0.5}); + } else { + sphereLeft = this.createPhotosphere_(texture); + sphereRight = this.createPhotosphere_(texture); + } + + this.sceneLeft.getObjectByName('photo').children = [sphereLeft]; + this.sceneRight.getObjectByName('photo').children = [sphereRight]; + + this.emit('load'); +}; + +PhotosphereRenderer.prototype.onTextureError_ = function(error) { + this.emit('error', 'Unable to load texture from ' + this.src); +}; + + +PhotosphereRenderer.prototype.createPhotosphere_ = function(texture, opt_params) { + var p = opt_params || {}; + p.scaleX = p.scaleX || 1; + p.scaleY = p.scaleY || 1; + p.offsetX = p.offsetX || 0; + p.offsetY = p.offsetY || 0; + p.phiStart = p.phiStart || 0; + p.phiLength = p.phiLength || Math.PI * 2; + p.thetaStart = p.thetaStart || 0; + p.thetaLength = p.thetaLength || Math.PI; + + var geometry = new THREE.SphereGeometry(1, 48, 48, + p.phiStart, p.phiLength, p.thetaStart, p.thetaLength); + geometry.applyMatrix(new THREE.Matrix4().makeScale(-1, 1, 1)); + var uvs = geometry.faceVertexUvs[0]; + for (var i = 0; i < uvs.length; i ++) { + for (var j = 0; j < 3; j ++) { + uvs[i][j].x *= p.scaleX; + uvs[i][j].x += p.offsetX; + uvs[i][j].y *= p.scaleY; + uvs[i][j].y += p.offsetY; + } + } + + var material = new THREE.MeshBasicMaterial({ map: texture }); + this.distorter.setMap(texture); + var out = new THREE.Mesh(geometry, material); + out.renderOrder = -1; + return out; +}; + +PhotosphereRenderer.prototype.createScene_ = function(opt_params) { + var scene = new THREE.Scene(); + // Add a light. + scene.add(new THREE.PointLight(0xFFFFFF)); + + // Add a group for the photosphere. + var photoGroup = new THREE.Object3D(); + photoGroup.name = 'photo'; + scene.add(photoGroup); + + return scene; +}; + +PhotosphereRenderer.prototype.updateMaterial_ = function(material_FOO) { + for (var i = 0; i < this.scenes.length; i++) { + var eye = this.eyes[i]; + var material = this.distorter.getShaderMaterial(eye); + var scene = this.scenes[i]; + var children = scene.getObjectByName('photo').children; + for (var j = 0; j < children.length; j++) { + var child = children[j]; + child.material = material; + child.material.needsUpdate = true; + } + } +}; + +PhotosphereRenderer.prototype.updateRenderRect_ = function() { + if (this.hmd && this.hmd.setRenderRect) { + var deviceInfo = this.manager.getDeviceInfo(); + var leftRect = deviceInfo.getUndistortedViewportLeftEye(); + var dpr = window.devicePixelRatio; + leftRect.x /= dpr; + leftRect.y /= dpr; + leftRect.width /= dpr; + leftRect.height /= dpr; + + var rightRect = Util.clone(leftRect); + rightRect.x = (window.innerWidth - leftRect.x) - leftRect.width; + + this.hmd.setRenderRect(leftRect, rightRect); + } +}; + +PhotosphereRenderer.prototype.onModeChange_ = function(newMode, oldMode) { + console.log('onModeChange_', newMode); + + var coefficients; + if (newMode == WebVRManager.Modes.VR) { + // Entering VR mode. + this.distorter.setEnabled(true); + this.updateMaterial_(); + } else if (oldMode == WebVRManager.Modes.VR) { + // Leaving VR mode. + this.distorter.setEnabled(false); + this.updateMaterial_(); + } + + if (window.analytics) { + analytics.logModeChanged(newMode); + } +}; + +PhotosphereRenderer.prototype.onViewerChange_ = function(newViewer) { + console.log('onViewerChange_', newViewer); + + // Reset the photosphere with new coefficients. + this.updateMaterial_(); + this.updateRenderRect_(); +}; + +PhotosphereRenderer.prototype.onResize_ = function() { + this.updateRenderRect_(); +}; + +module.exports = PhotosphereRenderer; + +},{"../node_modules/three/examples/js/controls/VRControls":3,"../node_modules/three/examples/js/effects/VREffect":4,"../node_modules/three/three":5,"../node_modules/webvr-boilerplate/build/webvr-manager":6,"./emitter":9,"./eyes":10,"./util":16,"./vertex-distorter":17}],14:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Contains all information about a given scene, including the photosphere asset, + * background music. + */ +function SceneInfo(opt_params) { + var params = opt_params || {}; + this.id = params.id; + this.title = params.title; + this.image = params.image; + this.preview = params.preview; + this.isStereo = !!params.isStereo; + this.audio = params.audio; + this.video = params.video; + this.yaw = params.yaw || 0; + this.isYawOnly = params.isYawOnly; +} + +SceneInfo.prototype.isComplete = function() { + return !!this.image || !!this.video; +}; + +SceneInfo.prototype.toObject = function() { + return { + id: this.id || null, + title: this.title || null, + image: this.image, + preview: this.preview, + isStereo: this.isStereo, + audio: this.audio, + yaw: this.yaw || null, + video: this.video || null, + }; +}; + +SceneInfo.prototype.isImageDataURI = function() { + return this.image.indexOf('data:') == 0; +}; + + +module.exports = SceneInfo; + +},{}],15:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var Emitter = _dereq_('./emitter'); +var SceneInfo = _dereq_('./scene-info'); + +var Query = { + JSON_URL: 'url', + VIDEO_URL: 'video', + OBJECT_URL: 'object', + IMAGE_URL: 'image', + PREVIEW_URL: 'preview', + IS_STEREO: 'is_stereo', + AUDIO_URL: 'audio', + START_YAW: 'start_yaw', + IS_YAW_ONLY: 'is_yaw_only', +}; + +function SceneLoader() { +} +SceneLoader.prototype = new Emitter(); + +/** + * Loads a scene from a JSON file. + */ +SceneLoader.prototype.loadFromJson_ = function(url, callback) { + // XHR to fetch the JSON. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url); + var that = this; + xhr.onload = function(e) { + try { + var jsonObj = JSON.parse(this.response); + } catch (e) { + that.emit('error', 'Invalid JSON at ' + url + '.'); + return; + } + var labelObjects = {}; + var labels = jsonObj.labels || []; + // Go through the labels in the data and objectify them. + for (var i = 0; i < labels.length; i++) { + var label = new Label(labels[i]); + labelObjects[label.id] = label; + } + jsonObj.labels = labelObjects; + var scene = new SceneInfo(jsonObj); + that.emit('load', scene); + }; + xhr.send(); +}; + +/** + * Parse out GET parameters from the URL string and load the scene. + */ +SceneLoader.prototype.loadFromGetParams_ = function() { + var params = { + image: Util.getQueryParameter(Query.IMAGE_URL), + video: Util.getQueryParameter(Query.VIDEO_URL), + object: Util.getQueryParameter(Query.OBJECT_URL), + preview: Util.getQueryParameter(Query.PREVIEW_URL), + isStereo: this.parseBoolean_(Util.getQueryParameter(Query.IS_STEREO)), + audio: Util.getQueryParameter(Query.AUDIO_URL), + isYawOnly: this.parseBoolean_(Util.getQueryParameter(Query.IS_YAW_ONLY)), + yaw: THREE.Math.degToRad(Util.getQueryParameter(Query.START_YAW)), + }; + + var count = 0; + count += (params[Query.IMAGE_URL] ? 1 : 0); + count += (params[Query.VIDEO_URL] ? 1 : 0); + count += (params[Query.OBJECT_URL] ? 1 : 0); + // Validate this. + if (count == 0) { + this.emit('error', 'Either "image", "video", or "object" GET parameter is required.'); + return; + } + + var scene = new SceneInfo(params); + this.emit('load', scene); +}; + +SceneLoader.prototype.parseBoolean_ = function(value) { + if (value == 'false') { + return false; + } + return !!value; +}; + +SceneLoader.prototype.loadScene = function(callback) { + // If there's a url param specified, try loading from JSON. + var url = Util.getQueryParameter('url'); + var image = Util.getQueryParameter('image'); + var video = Util.getQueryParameter('video'); + var object = Util.getQueryParameter('object'); + if (url) { + this.loadFromJson_(url); + } else if (image || video || object) { + // Otherwise, try loading from URL parameters. + this.loadFromGetParams_(); + } else { + // If it fails, throw an exception. + this.emit('error', 'Unable to load scene. Required parameter missing.'); + } +}; + +module.exports = SceneLoader; + +},{"./emitter":9,"./scene-info":14}],16:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Util = window.Util || {}; + +Util.isDataURI = function(src) { + return src && src.indexOf('data:') == 0; +}; + +Util.generateUUID = function() { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000) + .toString(16) + .substring(1); + } + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + + s4() + '-' + s4() + s4() + s4(); +}; + +Util.isMobile = function() { + var check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); + return check; +}; + +Util.isIOS = function() { + return /(iPad|iPhone|iPod)/g.test(navigator.userAgent); +}; + +Util.cloneObject = function(obj) { + var out = {}; + for (key in obj) { + out[key] = obj[key]; + } + return out; +}; + +Util.hashCode = function(s) { + return s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0); +}; + +Util.loadTrackSrc = function(context, src, callback, opt_progressCallback) { + var request = new XMLHttpRequest(); + request.open('GET', src, true); + request.responseType = 'arraybuffer'; + + // Decode asynchronously. + request.onload = function() { + context.decodeAudioData(request.response, function(buffer) { + callback(buffer); + }, function(e) { + console.error(e); + }); + }; + if (opt_progressCallback) { + request.onprogress = function(e) { + var percent = e.loaded / e.total; + opt_progressCallback(percent); + }; + } + request.send(); +}; + +Util.isPow2 = function(n) { + return (n & (n - 1)) == 0; +}; + +Util.capitalize = function(s) { + return s.charAt(0).toUpperCase() + s.slice(1); +}; + +Util.isIFrame = function() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } +}; + +// From http://goo.gl/4WX3tg +Util.getQueryParameter = function(name) { + name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), + results = regex.exec(location.search); + return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); +}; + + +// From http://stackoverflow.com/questions/11871077/proper-way-to-detect-webgl-support. +Util.isWebGLEnabled = function() { + var canvas = document.createElement('canvas'); + try { gl = canvas.getContext("webgl"); } + catch (x) { gl = null; } + + if (gl == null) { + try { gl = canvas.getContext("experimental-webgl"); experimental = true; } + catch (x) { gl = null; } + } + return !!gl; +}; + +Util.clone = function(obj) { + return JSON.parse(JSON.stringify(obj)); +}; + +// From http://stackoverflow.com/questions/10140604/fastest-hypotenuse-in-javascript +Util.hypot = Math.hypot || function(x, y) { + return Math.sqrt(x*x + y*y); +}; + +// From http://stackoverflow.com/a/17447718/693934 +Util.isIE11 = function() { + return navigator.userAgent.match(/Trident/); +}; + +module.exports = Util; + +},{}],17:[function(_dereq_,module,exports){ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +THREE = _dereq_('../node_modules/three/three'); +var Eyes = _dereq_('./eyes'); +var Util = _dereq_('./util'); + +var DEFAULT_FOV = 40; +var NO_DISTORTION = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +/** + * Responsible for distortion correction by pre-distorting the vertex geometry + * so that a second shader pass is not needed. This is intended to greatly + * optimize the rendering process. + */ +function VertexDistorter(deviceInfo) { + this.texture = null; + this.isEnabled = false; + + this.deviceInfo = deviceInfo; +} + +VertexDistorter.prototype.setEnabled = function(isEnabled) { + this.isEnabled = isEnabled; +} + +/** + * Sets the texture that is used to render this photosphere. + */ +VertexDistorter.prototype.setMap = function(texture) { + this.texture = texture; +}; + +VertexDistorter.prototype.getVertexShader_ = function() { + return [ + '#ifdef GL_ES', + 'precision highp float;', + '#endif', + + 'varying vec2 vUV;', + + this.getDistortionInclude_(), + + 'void main() {', + // Pass through texture coordinates to the fragment shader. + 'vUV = uv;', + + // Here, we want to ensure that we are using an undistorted projection + // matrix. By setting isUndistorted: true in the WebVRManager, we + // guarantee this. + 'vec4 pos = projectionMatrix * modelViewMatrix * vec4(position, 1.0);', + + 'gl_Position = Distort(pos);', + '}' + ].join('\n'); +}; + +VertexDistorter.prototype.getNoopVertexShader_ = function() { + return [ + '#ifdef GL_ES', + 'precision highp float;', + '#endif', + + 'varying vec2 vUV;', + + 'void main() {', + 'gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);', + 'vUV = uv;', + '}' + ].join('\n'); +}; + +VertexDistorter.prototype.getFragmentShader_ = function() { + return [ + '#ifdef GL_ES', + 'precision highp float;', + '#endif', + + 'varying vec2 vUV;', + 'uniform sampler2D texture;', + + 'void main() {', + 'gl_FragColor = texture2D(texture, vUV);', + '}' + ].join('\n'); +}; + +VertexDistorter.prototype.getNoopDistortionInclude_ = function() { + return [ + 'vec4 Distort(vec4 point) {', + 'return point;', + '}' + ].join('\n'); +}; + +VertexDistorter.prototype.getDistortionInclude_ = function() { + return [ + 'uniform float uDistortionCoefficients[12];', + 'uniform float uDistortionMaxFovSquared;', + 'uniform vec2 uDistortionFovOffset;', + 'uniform vec2 uDistortionFovScale;', + + // Returns a scalar to distort a point; computed in reverse via the polynomial approximation: + // r' = 1 + Σ_i (uDistortionCoefficients[i] rSquared^(i+1)) i=[0..11] + // where rSquared is the squared radius of an undistorted point in tan-angle space. + // See {@link Distortion} for more information. + 'float DistortionFactor(float rSquared) {', + 'float ret = 0.0;', + 'rSquared = min(uDistortionMaxFovSquared, rSquared);', + 'ret = rSquared * (ret + uDistortionCoefficients[11]);', + 'ret = rSquared * (ret + uDistortionCoefficients[10]);', + 'ret = rSquared * (ret + uDistortionCoefficients[9]);', + 'ret = rSquared * (ret + uDistortionCoefficients[8]);', + 'ret = rSquared * (ret + uDistortionCoefficients[7]);', + 'ret = rSquared * (ret + uDistortionCoefficients[6]);', + 'ret = rSquared * (ret + uDistortionCoefficients[5]);', + 'ret = rSquared * (ret + uDistortionCoefficients[4]);', + 'ret = rSquared * (ret + uDistortionCoefficients[3]);', + 'ret = rSquared * (ret + uDistortionCoefficients[2]);', + 'ret = rSquared * (ret + uDistortionCoefficients[1]);', + 'ret = rSquared * (ret + uDistortionCoefficients[0]);', + 'return ret + 1.0;', + '}', + + // Given a point in clip space, distort the point according to the coefficients stored in + // uDistortionCoefficients and the field of view (FOV) specified in uDistortionFovOffset and + // uDistortionFovScale. + // Returns the distorted point in clip space, with its Z untouched. + 'vec4 Distort(vec4 point) {', + // Put point into normalized device coordinates (NDC), [(-1, -1, -1) to (1, 1, 1)]. + 'vec3 pointNdc = point.xyz / point.w;', + // Throw away the Z coordinate and map the point to the unit square, [(0, 0) to (1, 1)]. + 'vec2 pointUnitSquare = (pointNdc.xy + vec2(1.0)) / 2.0;', + // Map the point into FOV tan-angle space. + 'vec2 pointTanAngle = pointUnitSquare * uDistortionFovScale - uDistortionFovOffset;', + 'float radiusSquared = dot(pointTanAngle, pointTanAngle);', + 'float distortionFactor = DistortionFactor(radiusSquared);', + //'float distortionFactor = 2.0;', + 'vec2 distortedPointTanAngle = pointTanAngle * distortionFactor;', + // Reverse the mappings above to bring the distorted point back into NDC space. + 'vec2 distortedPointUnitSquare = (distortedPointTanAngle + uDistortionFovOffset)', + '/ uDistortionFovScale;', + 'vec3 distortedPointNdc = vec3(distortedPointUnitSquare * 2.0 - vec2(1.0), pointNdc.z);', + // Convert the point into clip space before returning in case any operations are done after. + 'return vec4(distortedPointNdc, 1.0) * point.w;', + '}', + ].join('\n'); +}; + +VertexDistorter.prototype.getDistortionMaxFovSquared_ = function() { + var fov = this.getFov_(); + var maxFov = Util.hypot( + Math.tan(THREE.Math.degToRad(Math.max(fov.leftDegrees, fov.rightDegrees))), + Math.tan(THREE.Math.degToRad(Math.max(fov.downDegrees, fov.upDegrees)))); + return maxFov * maxFov; +}; + +VertexDistorter.prototype.getDistortionCoefficients_ = function() { + var viewer = this.deviceInfo.viewer; + return this.isEnabled ? viewer.inverseCoefficients : NO_DISTORTION; +}; + +VertexDistorter.prototype.getDistortionFovOffset_ = function(eye) { + var fov = this.getFov_(eye); + /* + var sideDegrees = Math.min(fov.leftDegrees, fov.rightDegrees); + var left = Math.tan(THREE.Math.degToRad(sideDegrees)); + */ + var left = Math.tan(THREE.Math.degToRad(fov.leftDegrees)); + var down = Math.tan(THREE.Math.degToRad(fov.downDegrees)); + return new THREE.Vector2(left, down); +}; + +VertexDistorter.prototype.getDistortionFovScale_ = function() { + var fov = this.getFov_(); + var left = Math.tan(THREE.Math.degToRad(fov.leftDegrees)); + var right = Math.tan(THREE.Math.degToRad(fov.rightDegrees)); + var up = Math.tan(THREE.Math.degToRad(fov.upDegrees)); + var down = Math.tan(THREE.Math.degToRad(fov.downDegrees)); + return new THREE.Vector2(left + right, up + down); +}; + + +VertexDistorter.prototype.getUniforms_ = function(eye) { + return { + texture: { + type: 't', + value: this.texture + }, + uDistortionCoefficients: { + type: 'fv1', + value: this.getDistortionCoefficients_() + }, + uDistortionMaxFovSquared: { + type: 'f', + value: this.getDistortionMaxFovSquared_() + }, + uDistortionFovOffset: { + type: 'v2', + value: this.getDistortionFovOffset_(eye) + }, + uDistortionFovScale: { + type: 'v2', + value: this.getDistortionFovScale_() + } + }; +}; + +VertexDistorter.prototype.getShaderMaterial = function(eye) { + var uniforms = this.getUniforms_(eye); + return new THREE.ShaderMaterial({ + uniforms: uniforms, + vertexShader: this.getVertexShader_(), + fragmentShader: this.getFragmentShader_() + }); +}; + +VertexDistorter.prototype.getFov_ = function(opt_eye) { + var eye = opt_eye || Eyes.LEFT; + + if (eye == Eyes.LEFT) { + return this.deviceInfo.getFieldOfViewLeftEye(true); + } + if (eye == Eyes.RIGHT) { + return this.deviceInfo.getFieldOfViewRightEye(true); + } + return null; +}; + +module.exports = VertexDistorter; + +},{"../node_modules/three/three":5,"./eyes":10,"./util":16}],18:[function(_dereq_,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}]},{},[12]); diff --git a/build/vrview.min.js b/build/vrview.min.js new file mode 100644 index 00000000..efea002d --- /dev/null +++ b/build/vrview.min.js @@ -0,0 +1,22 @@ +!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;ot;t+=2){var e=X[t],n=X[t+1];e(n),X[t]=void 0,X[t+1]=void 0}G=0}function f(){try{var t=_dereq_,e=t("vertx");return U=e.runOnLoop||e.runOnContext,i()}catch(n){return c()}}function l(t,e){var n=this,r=n._state;if(r===et&&!t||r===nt&&!e)return this;var o=new this.constructor(p),i=n._result;if(r){var s=arguments[r-1];H(function(){C(r,o,s,i)})}else j(n,o,t,e);return o}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(p);return g(n,t),n}function p(){}function _(){return new TypeError("You cannot resolve a promise with itself")}function v(){return new TypeError("A promises callback cannot return that same promise.")}function d(t){try{return t.then}catch(e){return rt.error=e,rt}}function y(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function m(t,e,n){H(function(t){var r=!1,o=y(n,e,function(n){r||(r=!0,e!==n?g(t,n):E(t,n))},function(e){r||(r=!0,S(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,S(t,o))},t)}function w(t,e){e._state===et?E(t,e._result):e._state===nt?S(t,e._result):j(e,void 0,function(e){g(t,e)},function(e){S(t,e)})}function b(t,n,r){n.constructor===t.constructor&&r===Z&&constructor.resolve===$?w(t,n):r===rt?S(t,rt.error):void 0===r?E(t,n):e(r)?m(t,n,r):E(t,n)}function g(e,n){e===n?S(e,_()):t(n)?b(e,n,d(n)):E(e,n)}function A(t){t._onerror&&t._onerror(t._result),T(t)}function E(t,e){t._state===tt&&(t._result=e,t._state=et,0!==t._subscribers.length&&H(T,t))}function S(t,e){t._state===tt&&(t._state=nt,t._result=e,H(A,t))}function j(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+et]=n,o[i+nt]=r,0===i&&t._state&&H(T,t)}function T(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r,o,i=t._result,s=0;ss;s++)j(r.resolve(t[s]),void 0,e,n);return o}function Y(t){var e=this,n=new e(p);return S(n,t),n}function q(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function F(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function D(t){this._id=ct++,this._state=void 0,this._result=void 0,this._subscribers=[],p!==t&&("function"!=typeof t&&q(),this instanceof D?M(this,t):F())}function K(t,e){this._instanceConstructor=t,this.promise=new t(p),Array.isArray(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?E(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&E(this.promise,this._result))):S(this.promise,this._validationError())}function L(){var t;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;(!n||"[object Promise]"!==Object.prototype.toString.call(n.resolve())||n.cast)&&(t.Promise=at)}var N;N=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var U,W,z,B=N,G=0,H=function(t,e){X[G]=t,X[G+1]=e,G+=2,2===G&&(W?W(a):z())},I="undefined"!=typeof window?window:void 0,J=I||{},Q=J.MutationObserver||J.WebKitMutationObserver,R="undefined"!=typeof process&&"[object process]"==={}.toString.call(process),V="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,X=new Array(1e3);z=R?o():Q?s():V?u():void 0===I&&"function"==typeof _dereq_?f():c();var Z=l,$=h,tt=void 0,et=1,nt=2,rt=new P,ot=new P,it=O,st=k,ut=Y,ct=0,at=D;D.all=it,D.race=st,D.resolve=$,D.reject=ut,D._setScheduler=n,D._setAsap=r,D._asap=H,D.prototype={constructor:D,then:Z,"catch":function(t){return this.then(null,t)}};var ft=K;K.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},K.prototype._enumerate=function(){for(var t=this.length,e=this._input,n=0;this._state===tt&&t>n;n++)this._eachEntry(e[n],n)},K.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===$){var o=d(t);if(o===Z&&t._state!==tt)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===at){var i=new n(p);b(i,t,o),this._willSettleAt(i,e)}else this._willSettleAt(new n(function(e){e(t)}),e)}else this._willSettleAt(r(t),e)},K.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===tt&&(this._remaining--,t===nt?S(r,n):this._result[e]=n),0===this._remaining&&E(r,this._result)},K.prototype._willSettleAt=function(t,e){var n=this;j(t,void 0,function(t){n._settledAt(et,e,t)},function(t){n._settledAt(nt,e,t)})};var lt=L,ht={Promise:at,polyfill:lt};"function"==typeof define&&define.amd?define(function(){return ht}):"undefined"!=typeof module&&module.exports?module.exports=ht:"undefined"!=typeof this&&(this.ES6Promise=ht),lt()}).call(this)}).call(this,_dereq_("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:18}],2:[function(_dereq_,module,exports){var Stats=function(){var l=Date.now(),m=l,g=0,n=1/0,o=0,h=0,p=1/0,q=0,r=0,s=0,f=document.createElement("div");f.id="stats",f.addEventListener("mousedown",function(b){b.preventDefault(),t(++s%2)},!1),f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps",a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002",f.appendChild(a);var i=document.createElement("div");i.id="fpsText",i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px",i.innerHTML="FPS",a.appendChild(i);var c=document.createElement("div");for(c.id="fpsGraph",c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff",a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113",c.appendChild(j)}var d=document.createElement("div");d.id="ms",d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none",f.appendChild(d);var k=document.createElement("div");k.id="msText",k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px",k.innerHTML="MS",d.appendChild(k);var e=document.createElement("div");for(e.id="msGraph",e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0",d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){switch(s=b){case 0:a.style.display="block",d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l,n=Math.min(n,g),o=Math.max(o,g),k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));return e.appendChild(e.firstChild).style.height=a+"px",r++,b>m+1e3&&(h=Math.round(1e3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=a+"px",m=b,r=0),b},update:function(){l=this.end()}}};"object"==typeof module&&(module.exports=Stats)},{}],3:[function(_dereq_,module,exports){var VRControls=function(object,onError){function filterInvalidDevices(devices){var oculusDevices=devices.filter(function(device){return-1!==device.deviceName.toLowerCase().indexOf("oculus")});return oculusDevices.length>=1?devices.filter(function(device){return-1===device.deviceName.toLowerCase().indexOf("cardboard")}):devices}function gotVRDevices(devices){devices=filterInvalidDevices(devices);for(var i=0;ix?-1:x>0?1:+x}),void 0===Function.prototype.name&&void 0!==Object.defineProperty&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1]}}),THREE.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2},THREE.CullFaceNone=0,THREE.CullFaceBack=1,THREE.CullFaceFront=2,THREE.CullFaceFrontBack=3,THREE.FrontFaceDirectionCW=0,THREE.FrontFaceDirectionCCW=1,THREE.BasicShadowMap=0,THREE.PCFShadowMap=1,THREE.PCFSoftShadowMap=2,THREE.FrontSide=0,THREE.BackSide=1,THREE.DoubleSide=2,THREE.FlatShading=1,THREE.SmoothShading=2,THREE.NoColors=0,THREE.FaceColors=1,THREE.VertexColors=2,THREE.NoBlending=0,THREE.NormalBlending=1,THREE.AdditiveBlending=2,THREE.SubtractiveBlending=3,THREE.MultiplyBlending=4,THREE.CustomBlending=5,THREE.AddEquation=100,THREE.SubtractEquation=101,THREE.ReverseSubtractEquation=102,THREE.MinEquation=103,THREE.MaxEquation=104,THREE.ZeroFactor=200,THREE.OneFactor=201,THREE.SrcColorFactor=202,THREE.OneMinusSrcColorFactor=203,THREE.SrcAlphaFactor=204,THREE.OneMinusSrcAlphaFactor=205,THREE.DstAlphaFactor=206,THREE.OneMinusDstAlphaFactor=207,THREE.DstColorFactor=208,THREE.OneMinusDstColorFactor=209,THREE.SrcAlphaSaturateFactor=210,THREE.NeverDepth=0,THREE.AlwaysDepth=1,THREE.LessDepth=2,THREE.LessEqualDepth=3,THREE.EqualDepth=4,THREE.GreaterEqualDepth=5,THREE.GreaterDepth=6,THREE.NotEqualDepth=7,THREE.MultiplyOperation=0,THREE.MixOperation=1,THREE.AddOperation=2,THREE.UVMapping=300,THREE.CubeReflectionMapping=301,THREE.CubeRefractionMapping=302,THREE.EquirectangularReflectionMapping=303,THREE.EquirectangularRefractionMapping=304,THREE.SphericalReflectionMapping=305,THREE.RepeatWrapping=1e3,THREE.ClampToEdgeWrapping=1001,THREE.MirroredRepeatWrapping=1002,THREE.NearestFilter=1003,THREE.NearestMipMapNearestFilter=1004,THREE.NearestMipMapLinearFilter=1005,THREE.LinearFilter=1006,THREE.LinearMipMapNearestFilter=1007,THREE.LinearMipMapLinearFilter=1008,THREE.UnsignedByteType=1009,THREE.ByteType=1010,THREE.ShortType=1011,THREE.UnsignedShortType=1012,THREE.IntType=1013,THREE.UnsignedIntType=1014,THREE.FloatType=1015,THREE.HalfFloatType=1025,THREE.UnsignedShort4444Type=1016,THREE.UnsignedShort5551Type=1017,THREE.UnsignedShort565Type=1018,THREE.AlphaFormat=1019,THREE.RGBFormat=1020,THREE.RGBAFormat=1021,THREE.LuminanceFormat=1022,THREE.LuminanceAlphaFormat=1023,THREE.RGBEFormat=THREE.RGBAFormat,THREE.RGB_S3TC_DXT1_Format=2001,THREE.RGBA_S3TC_DXT1_Format=2002,THREE.RGBA_S3TC_DXT3_Format=2003,THREE.RGBA_S3TC_DXT5_Format=2004,THREE.RGB_PVRTC_4BPPV1_Format=2100,THREE.RGB_PVRTC_2BPPV1_Format=2101,THREE.RGBA_PVRTC_4BPPV1_Format=2102,THREE.RGBA_PVRTC_2BPPV1_Format=2103,THREE.LoopOnce=2200,THREE.LoopRepeat=2201,THREE.LoopPingPong=2202,THREE.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js."),this.projectVector=function(vector,camera){console.warn("THREE.Projector: .projectVector() is now vector.project()."),vector.project(camera)},this.unprojectVector=function(vector,camera){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."),vector.unproject(camera)},this.pickingRay=function(vector,camera){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}},THREE.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"),this.domElement=document.createElement("canvas"),this.clear=function(){},this.render=function(){},this.setClearColor=function(){},this.setSize=function(){}},THREE.Color=function(color){return 3===arguments.length?this.fromArray(arguments):this.set(color)},THREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,set:function(value){return value instanceof THREE.Color?this.copy(value):"number"==typeof value?this.setHex(value):"string"==typeof value&&this.setStyle(value),this},setHex:function(hex){return hex=Math.floor(hex),this.r=(hex>>16&255)/255,this.g=(hex>>8&255)/255,this.b=(255&hex)/255,this},setRGB:function(r,g,b){return this.r=r,this.g=g,this.b=b,this},setHSL:function(){function hue2rgb(p,q,t){return 0>t&&(t+=1),t>1&&(t-=1),1/6>t?p+6*(q-p)*t:.5>t?q:2/3>t?p+6*(q-p)*(2/3-t):p}return function(h,s,l){if(h=THREE.Math.euclideanModulo(h,1),s=THREE.Math.clamp(s,0,1),l=THREE.Math.clamp(l,0,1),0===s)this.r=this.g=this.b=l;else{var p=.5>=l?l*(1+s):l+s-l*s,q=2*l-p;this.r=hue2rgb(q,p,h+1/3),this.g=hue2rgb(q,p,h),this.b=hue2rgb(q,p,h-1/3)}return this}}(),setStyle:function(style){function handleAlpha(string){void 0!==string&&parseFloat(string)<1&&console.warn("THREE.Color: Alpha component of "+style+" will be ignored.")}var m;if(m=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style)){var color,name=m[1],components=m[2];switch(name){case"rgb":case"rgba":if(color=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components))return this.r=Math.min(255,parseInt(color[1],10))/255,this.g=Math.min(255,parseInt(color[2],10))/255,this.b=Math.min(255,parseInt(color[3],10))/255,handleAlpha(color[5]),this;if(color=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components))return this.r=Math.min(100,parseInt(color[1],10))/100,this.g=Math.min(100,parseInt(color[2],10))/100,this.b=Math.min(100,parseInt(color[3],10))/100,handleAlpha(color[5]),this;break;case"hsl":case"hsla":if(color=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){var h=parseFloat(color[1])/360,s=parseInt(color[2],10)/100,l=parseInt(color[3],10)/100;return handleAlpha(color[5]),this.setHSL(h,s,l)}}}else if(m=/^\#([A-Fa-f0-9]+)$/.exec(style)){var hex=m[1],size=hex.length;if(3===size)return this.r=parseInt(hex.charAt(0)+hex.charAt(0),16)/255,this.g=parseInt(hex.charAt(1)+hex.charAt(1),16)/255,this.b=parseInt(hex.charAt(2)+hex.charAt(2),16)/255,this;if(6===size)return this.r=parseInt(hex.charAt(0)+hex.charAt(1),16)/255,this.g=parseInt(hex.charAt(2)+hex.charAt(3),16)/255,this.b=parseInt(hex.charAt(4)+hex.charAt(5),16)/255,this}if(style&&style.length>0){var hex=THREE.ColorKeywords[style];void 0!==hex?this.setHex(hex):console.warn("THREE.Color: Unknown color "+style)}return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(color){return this.r=color.r,this.g=color.g,this.b=color.b,this},copyGammaToLinear:function(color,gammaFactor){return void 0===gammaFactor&&(gammaFactor=2),this.r=Math.pow(color.r,gammaFactor),this.g=Math.pow(color.g,gammaFactor),this.b=Math.pow(color.b,gammaFactor),this},copyLinearToGamma:function(color,gammaFactor){void 0===gammaFactor&&(gammaFactor=2);var safeInverse=gammaFactor>0?1/gammaFactor:1;return this.r=Math.pow(color.r,safeInverse),this.g=Math.pow(color.g,safeInverse),this.b=Math.pow(color.b,safeInverse),this},convertGammaToLinear:function(){var r=this.r,g=this.g,b=this.b;return this.r=r*r,this.g=g*g,this.b=b*b,this},convertLinearToGamma:function(){return this.r=Math.sqrt(this.r),this.g=Math.sqrt(this.g),this.b=Math.sqrt(this.b),this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(optionalTarget){var hue,saturation,hsl=optionalTarget||{h:0,s:0,l:0},r=this.r,g=this.g,b=this.b,max=Math.max(r,g,b),min=Math.min(r,g,b),lightness=(min+max)/2;if(min===max)hue=0,saturation=0;else{var delta=max-min;switch(saturation=.5>=lightness?delta/(max+min):delta/(2-max-min),max){case r:hue=(g-b)/delta+(b>g?6:0);break;case g:hue=(b-r)/delta+2;break;case b:hue=(r-g)/delta+4}hue/=6}return hsl.h=hue,hsl.s=saturation,hsl.l=lightness,hsl},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(h,s,l){var hsl=this.getHSL();return hsl.h+=h,hsl.s+=s,hsl.l+=l,this.setHSL(hsl.h,hsl.s,hsl.l),this},add:function(color){return this.r+=color.r,this.g+=color.g,this.b+=color.b,this},addColors:function(color1,color2){return this.r=color1.r+color2.r,this.g=color1.g+color2.g,this.b=color1.b+color2.b,this},addScalar:function(s){return this.r+=s,this.g+=s,this.b+=s,this},multiply:function(color){return this.r*=color.r,this.g*=color.g,this.b*=color.b,this},multiplyScalar:function(s){return this.r*=s,this.g*=s,this.b*=s,this},lerp:function(color,alpha){return this.r+=(color.r-this.r)*alpha,this.g+=(color.g-this.g)*alpha,this.b+=(color.b-this.b)*alpha,this},equals:function(c){return c.r===this.r&&c.g===this.g&&c.b===this.b},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.r=array[offset],this.g=array[offset+1],this.b=array[offset+2],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.r,array[offset+1]=this.g,array[offset+2]=this.b,array}},THREE.ColorKeywords={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},THREE.Quaternion=function(x,y,z,w){this._x=x||0,this._y=y||0,this._z=z||0,this._w=void 0!==w?w:1},THREE.Quaternion.prototype={constructor:THREE.Quaternion,get x(){return this._x},set x(value){this._x=value,this.onChangeCallback()},get y(){return this._y},set y(value){this._y=value,this.onChangeCallback()},get z(){return this._z},set z(value){this._z=value,this.onChangeCallback()},get w(){return this._w},set w(value){this._w=value,this.onChangeCallback()},set:function(x,y,z,w){return this._x=x,this._y=y,this._z=z,this._w=w,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(quaternion){return this._x=quaternion.x,this._y=quaternion.y,this._z=quaternion.z,this._w=quaternion.w,this.onChangeCallback(),this},setFromEuler:function(euler,update){if(euler instanceof THREE.Euler==!1)throw new Error("THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var c1=Math.cos(euler._x/2),c2=Math.cos(euler._y/2),c3=Math.cos(euler._z/2),s1=Math.sin(euler._x/2),s2=Math.sin(euler._y/2),s3=Math.sin(euler._z/2),order=euler.order;return"XYZ"===order?(this._x=s1*c2*c3+c1*s2*s3,this._y=c1*s2*c3-s1*c2*s3,this._z=c1*c2*s3+s1*s2*c3,this._w=c1*c2*c3-s1*s2*s3):"YXZ"===order?(this._x=s1*c2*c3+c1*s2*s3,this._y=c1*s2*c3-s1*c2*s3,this._z=c1*c2*s3-s1*s2*c3,this._w=c1*c2*c3+s1*s2*s3):"ZXY"===order?(this._x=s1*c2*c3-c1*s2*s3,this._y=c1*s2*c3+s1*c2*s3,this._z=c1*c2*s3+s1*s2*c3,this._w=c1*c2*c3-s1*s2*s3):"ZYX"===order?(this._x=s1*c2*c3-c1*s2*s3,this._y=c1*s2*c3+s1*c2*s3,this._z=c1*c2*s3-s1*s2*c3,this._w=c1*c2*c3+s1*s2*s3):"YZX"===order?(this._x=s1*c2*c3+c1*s2*s3,this._y=c1*s2*c3+s1*c2*s3,this._z=c1*c2*s3-s1*s2*c3,this._w=c1*c2*c3-s1*s2*s3):"XZY"===order&&(this._x=s1*c2*c3-c1*s2*s3,this._y=c1*s2*c3-s1*c2*s3,this._z=c1*c2*s3+s1*s2*c3,this._w=c1*c2*c3+s1*s2*s3),update!==!1&&this.onChangeCallback(),this},setFromAxisAngle:function(axis,angle){var halfAngle=angle/2,s=Math.sin(halfAngle);return this._x=axis.x*s,this._y=axis.y*s,this._z=axis.z*s,this._w=Math.cos(halfAngle),this.onChangeCallback(),this},setFromRotationMatrix:function(m){var s,te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10],trace=m11+m22+m33;return trace>0?(s=.5/Math.sqrt(trace+1),this._w=.25/s,this._x=(m32-m23)*s,this._y=(m13-m31)*s,this._z=(m21-m12)*s):m11>m22&&m11>m33?(s=2*Math.sqrt(1+m11-m22-m33),this._w=(m32-m23)/s,this._x=.25*s,this._y=(m12+m21)/s,this._z=(m13+m31)/s):m22>m33?(s=2*Math.sqrt(1+m22-m11-m33),this._w=(m13-m31)/s,this._x=(m12+m21)/s,this._y=.25*s,this._z=(m23+m32)/s):(s=2*Math.sqrt(1+m33-m11-m22),this._w=(m21-m12)/s,this._x=(m13+m31)/s,this._y=(m23+m32)/s,this._z=.25*s),this.onChangeCallback(),this},setFromUnitVectors:function(){var v1,r,EPS=1e-6;return function(vFrom,vTo){return void 0===v1&&(v1=new THREE.Vector3),r=vFrom.dot(vTo)+1,EPS>r?(r=0,Math.abs(vFrom.x)>Math.abs(vFrom.z)?v1.set(-vFrom.y,vFrom.x,0):v1.set(0,-vFrom.z,vFrom.y)):v1.crossVectors(vFrom,vTo),this._x=v1.x,this._y=v1.y,this._z=v1.z,this._w=r,this.normalize(),this}}(),inverse:function(){return this.conjugate().normalize(),this},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this.onChangeCallback(),this},dot:function(v){return this._x*v._x+this._y*v._y+this._z*v._z+this._w*v._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var l=this.length();return 0===l?(this._x=0,this._y=0,this._z=0,this._w=1):(l=1/l,this._x=this._x*l,this._y=this._y*l,this._z=this._z*l,this._w=this._w*l),this.onChangeCallback(),this},multiply:function(q,p){return void 0!==p?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(q,p)):this.multiplyQuaternions(this,q)},multiplyQuaternions:function(a,b){var qax=a._x,qay=a._y,qaz=a._z,qaw=a._w,qbx=b._x,qby=b._y,qbz=b._z,qbw=b._w;return this._x=qax*qbw+qaw*qbx+qay*qbz-qaz*qby,this._y=qay*qbw+qaw*qby+qaz*qbx-qax*qbz,this._z=qaz*qbw+qaw*qbz+qax*qby-qay*qbx,this._w=qaw*qbw-qax*qbx-qay*qby-qaz*qbz,this.onChangeCallback(),this},multiplyVector3:function(vector){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),vector.applyQuaternion(this)},slerp:function(qb,t){if(0===t)return this;if(1===t)return this.copy(qb);var x=this._x,y=this._y,z=this._z,w=this._w,cosHalfTheta=w*qb._w+x*qb._x+y*qb._y+z*qb._z;if(0>cosHalfTheta?(this._w=-qb._w,this._x=-qb._x,this._y=-qb._y,this._z=-qb._z,cosHalfTheta=-cosHalfTheta):this.copy(qb),cosHalfTheta>=1)return this._w=w,this._x=x,this._y=y,this._z=z,this;var halfTheta=Math.acos(cosHalfTheta),sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta); +if(Math.abs(sinHalfTheta)<.001)return this._w=.5*(w+this._w),this._x=.5*(x+this._x),this._y=.5*(y+this._y),this._z=.5*(z+this._z),this;var ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta,ratioB=Math.sin(t*halfTheta)/sinHalfTheta;return this._w=w*ratioA+this._w*ratioB,this._x=x*ratioA+this._x*ratioB,this._y=y*ratioA+this._y*ratioB,this._z=z*ratioA+this._z*ratioB,this.onChangeCallback(),this},equals:function(quaternion){return quaternion._x===this._x&&quaternion._y===this._y&&quaternion._z===this._z&&quaternion._w===this._w},fromArray:function(array,offset){return void 0===offset&&(offset=0),this._x=array[offset],this._y=array[offset+1],this._z=array[offset+2],this._w=array[offset+3],this.onChangeCallback(),this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this._x,array[offset+1]=this._y,array[offset+2]=this._z,array[offset+3]=this._w,array},onChange:function(callback){return this.onChangeCallback=callback,this},onChangeCallback:function(){}},THREE.Quaternion.slerp=function(qa,qb,qm,t){return qm.copy(qa).slerp(qb,t)},THREE.Vector2=function(x,y){this.x=x||0,this.y=y||0},THREE.Vector2.prototype={constructor:THREE.Vector2,get width(){return this.x},set width(value){this.x=value},get height(){return this.y},set height(value){this.y=value},set:function(x,y){return this.x=x,this.y=y,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+index)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(v){return this.x=v.x,this.y=v.y,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this)},addScalar:function(s){return this.x+=s,this.y+=s,this},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this},addScaledVector:function(v,s){return this.x+=v.x*s,this.y+=v.y*s,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this)},subScalar:function(s){return this.x-=s,this.y-=s,this},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this},multiply:function(v){return this.x*=v.x,this.y*=v.y,this},multiplyScalar:function(scalar){return isFinite(scalar)?(this.x*=scalar,this.y*=scalar):(this.x=0,this.y=0),this},divide:function(v){return this.x/=v.x,this.y/=v.y,this},divideScalar:function(scalar){return this.multiplyScalar(1/scalar)},min:function(v){return this.x=Math.min(this.x,v.x),this.y=Math.min(this.y,v.y),this},max:function(v){return this.x=Math.max(this.x,v.x),this.y=Math.max(this.y,v.y),this},clamp:function(min,max){return this.x=Math.max(min.x,Math.min(max.x,this.x)),this.y=Math.max(min.y,Math.min(max.y,this.y)),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector2,max=new THREE.Vector2),min.set(minVal,minVal),max.set(maxVal,maxVal),this.clamp(min,max)}}(),clampLength:function(min,max){var length=this.length();return this.multiplyScalar(Math.max(min,Math.min(max,length))/length),this},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(v){return this.x*v.x+this.y*v.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy},setLength:function(length){return this.multiplyScalar(length/this.length())},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1),this},equals:function(v){return v.x===this.x&&v.y===this.y},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this},rotateAround:function(center,angle){var c=Math.cos(angle),s=Math.sin(angle),x=this.x-center.x,y=this.y-center.y;return this.x=x*c-y*s+center.x,this.y=x*s+y*c+center.y,this}},THREE.Vector3=function(x,y,z){this.x=x||0,this.y=y||0,this.z=z||0},THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(x,y,z){return this.x=x,this.y=y,this.z=z,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setZ:function(z){return this.z=z,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+index)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(v){return this.x=v.x,this.y=v.y,this.z=v.z,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this.z+=v.z,this)},addScalar:function(s){return this.x+=s,this.y+=s,this.z+=s,this},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this.z=a.z+b.z,this},addScaledVector:function(v,s){return this.x+=v.x*s,this.y+=v.y*s,this.z+=v.z*s,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this.z-=v.z,this)},subScalar:function(s){return this.x-=s,this.y-=s,this.z-=s,this},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this.z=a.z-b.z,this},multiply:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(v,w)):(this.x*=v.x,this.y*=v.y,this.z*=v.z,this)},multiplyScalar:function(scalar){return isFinite(scalar)?(this.x*=scalar,this.y*=scalar,this.z*=scalar):(this.x=0,this.y=0,this.z=0),this},multiplyVectors:function(a,b){return this.x=a.x*b.x,this.y=a.y*b.y,this.z=a.z*b.z,this},applyEuler:function(){var quaternion;return function(euler){return euler instanceof THREE.Euler==!1&&console.error("THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order."),void 0===quaternion&&(quaternion=new THREE.Quaternion),this.applyQuaternion(quaternion.setFromEuler(euler)),this}}(),applyAxisAngle:function(){var quaternion;return function(axis,angle){return void 0===quaternion&&(quaternion=new THREE.Quaternion),this.applyQuaternion(quaternion.setFromAxisAngle(axis,angle)),this}}(),applyMatrix3:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[3]*y+e[6]*z,this.y=e[1]*x+e[4]*y+e[7]*z,this.z=e[2]*x+e[5]*y+e[8]*z,this},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z+e[12],this.y=e[1]*x+e[5]*y+e[9]*z+e[13],this.z=e[2]*x+e[6]*y+e[10]*z+e[14],this},applyProjection:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements,d=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);return this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*d,this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*d,this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*d,this},applyQuaternion:function(q){var x=this.x,y=this.y,z=this.z,qx=q.x,qy=q.y,qz=q.z,qw=q.w,ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;return this.x=ix*qw+iw*-qx+iy*-qz-iz*-qy,this.y=iy*qw+iw*-qy+iz*-qx-ix*-qz,this.z=iz*qw+iw*-qz+ix*-qy-iy*-qx,this},project:function(){var matrix;return function(camera){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.multiplyMatrices(camera.projectionMatrix,matrix.getInverse(camera.matrixWorld)),this.applyProjection(matrix)}}(),unproject:function(){var matrix;return function(camera){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.multiplyMatrices(camera.matrixWorld,matrix.getInverse(camera.projectionMatrix)),this.applyProjection(matrix)}}(),transformDirection:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z,this.y=e[1]*x+e[5]*y+e[9]*z,this.z=e[2]*x+e[6]*y+e[10]*z,this.normalize(),this},divide:function(v){return this.x/=v.x,this.y/=v.y,this.z/=v.z,this},divideScalar:function(scalar){return this.multiplyScalar(1/scalar)},min:function(v){return this.x=Math.min(this.x,v.x),this.y=Math.min(this.y,v.y),this.z=Math.min(this.z,v.z),this},max:function(v){return this.x=Math.max(this.x,v.x),this.y=Math.max(this.y,v.y),this.z=Math.max(this.z,v.z),this},clamp:function(min,max){return this.x=Math.max(min.x,Math.min(max.x,this.x)),this.y=Math.max(min.y,Math.min(max.y,this.y)),this.z=Math.max(min.z,Math.min(max.z,this.z)),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector3,max=new THREE.Vector3),min.set(minVal,minVal,minVal),max.set(maxVal,maxVal,maxVal),this.clamp(min,max)}}(),clampLength:function(min,max){var length=this.length();return this.multiplyScalar(Math.max(min,Math.min(max,length))/length),this},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(length){return this.multiplyScalar(length/this.length())},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this.z+=(v.z-this.z)*alpha,this},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1),this},cross:function(v,w){if(void 0!==w)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(v,w);var x=this.x,y=this.y,z=this.z;return this.x=y*v.z-z*v.y,this.y=z*v.x-x*v.z,this.z=x*v.y-y*v.x,this},crossVectors:function(a,b){var ax=a.x,ay=a.y,az=a.z,bx=b.x,by=b.y,bz=b.z;return this.x=ay*bz-az*by,this.y=az*bx-ax*bz,this.z=ax*by-ay*bx,this},projectOnVector:function(){var v1,dot;return function(vector){return void 0===v1&&(v1=new THREE.Vector3),v1.copy(vector).normalize(),dot=this.dot(v1),this.copy(v1).multiplyScalar(dot)}}(),projectOnPlane:function(){var v1;return function(planeNormal){return void 0===v1&&(v1=new THREE.Vector3),v1.copy(this).projectOnVector(planeNormal),this.sub(v1)}}(),reflect:function(){var v1;return function(normal){return void 0===v1&&(v1=new THREE.Vector3),this.sub(v1.copy(normal).multiplyScalar(2*this.dot(normal)))}}(),angleTo:function(v){var theta=this.dot(v)/(this.length()*v.length());return Math.acos(THREE.Math.clamp(theta,-1,1))},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz},setEulerFromRotationMatrix:function(m,order){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(q,order){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(m){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(m)},getScaleFromMatrix:function(m){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(m)},getColumnFromMatrix:function(index,matrix){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(index,matrix)},setFromMatrixPosition:function(m){return this.x=m.elements[12],this.y=m.elements[13],this.z=m.elements[14],this},setFromMatrixScale:function(m){var sx=this.set(m.elements[0],m.elements[1],m.elements[2]).length(),sy=this.set(m.elements[4],m.elements[5],m.elements[6]).length(),sz=this.set(m.elements[8],m.elements[9],m.elements[10]).length();return this.x=sx,this.y=sy,this.z=sz,this},setFromMatrixColumn:function(index,matrix){var offset=4*index,me=matrix.elements;return this.x=me[offset],this.y=me[offset+1],this.z=me[offset+2],this},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this.z=array[offset+2],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array[offset+2]=this.z,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this.z=attribute.array[index+2],this}},THREE.Vector4=function(x,y,z,w){this.x=x||0,this.y=y||0,this.z=z||0,this.w=void 0!==w?w:1},THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(x,y,z,w){return this.x=x,this.y=y,this.z=z,this.w=w,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setZ:function(z){return this.z=z,this},setW:function(w){return this.w=w,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;case 3:this.w=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+index)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(v){return this.x=v.x,this.y=v.y,this.z=v.z,this.w=void 0!==v.w?v.w:1,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this.z+=v.z,this.w+=v.w,this)},addScalar:function(s){return this.x+=s,this.y+=s,this.z+=s,this.w+=s,this},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this.z=a.z+b.z,this.w=a.w+b.w,this},addScaledVector:function(v,s){return this.x+=v.x*s,this.y+=v.y*s,this.z+=v.z*s,this.w+=v.w*s,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this.z-=v.z,this.w-=v.w,this)},subScalar:function(s){return this.x-=s,this.y-=s,this.z-=s,this.w-=s,this},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this.z=a.z-b.z,this.w=a.w-b.w,this},multiplyScalar:function(scalar){return isFinite(scalar)?(this.x*=scalar,this.y*=scalar,this.z*=scalar,this.w*=scalar):(this.x=0,this.y=0,this.z=0,this.w=0),this},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z,w=this.w,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z+e[12]*w,this.y=e[1]*x+e[5]*y+e[9]*z+e[13]*w,this.z=e[2]*x+e[6]*y+e[10]*z+e[14]*w,this.w=e[3]*x+e[7]*y+e[11]*z+e[15]*w,this},divideScalar:function(scalar){return this.multiplyScalar(1/scalar)},setAxisAngleFromQuaternion:function(q){this.w=2*Math.acos(q.w);var s=Math.sqrt(1-q.w*q.w);return 1e-4>s?(this.x=1,this.y=0,this.z=0):(this.x=q.x/s,this.y=q.y/s,this.z=q.z/s),this},setAxisAngleFromRotationMatrix:function(m){var angle,x,y,z,epsilon=.01,epsilon2=.1,te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10];if(Math.abs(m12-m21)yy&&xx>zz?epsilon>xx?(x=0,y=.707106781,z=.707106781):(x=Math.sqrt(xx),y=xy/x,z=xz/x):yy>zz?epsilon>yy?(x=.707106781,y=0,z=.707106781):(y=Math.sqrt(yy),x=xy/y,z=yz/y):epsilon>zz?(x=.707106781,y=.707106781,z=0):(z=Math.sqrt(zz),x=xz/z,y=yz/z),this.set(x,y,z,angle),this}var s=Math.sqrt((m32-m23)*(m32-m23)+(m13-m31)*(m13-m31)+(m21-m12)*(m21-m12));return Math.abs(s)<.001&&(s=1),this.x=(m32-m23)/s,this.y=(m13-m31)/s,this.z=(m21-m12)/s,this.w=Math.acos((m11+m22+m33-1)/2),this},min:function(v){return this.x=Math.min(this.x,v.x),this.y=Math.min(this.y,v.y),this.z=Math.min(this.z,v.z),this.w=Math.min(this.w,v.w),this},max:function(v){return this.x=Math.max(this.x,v.x),this.y=Math.max(this.y,v.y),this.z=Math.max(this.z,v.z),this.w=Math.max(this.w,v.w),this},clamp:function(min,max){return this.x=Math.max(min.x,Math.min(max.x,this.x)),this.y=Math.max(min.y,Math.min(max.y,this.y)),this.z=Math.max(min.z,Math.min(max.z,this.z)),this.w=Math.max(min.w,Math.min(max.w,this.w)),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector4,max=new THREE.Vector4),min.set(minVal,minVal,minVal,minVal),max.set(maxVal,maxVal,maxVal,maxVal),this.clamp(min,max)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z+this.w*v.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},setLength:function(length){return this.multiplyScalar(length/this.length())},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this.z+=(v.z-this.z)*alpha,this.w+=(v.w-this.w)*alpha,this},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1),this},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z&&v.w===this.w},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this.z=array[offset+2],this.w=array[offset+3],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array[offset+2]=this.z,array[offset+3]=this.w,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this.z=attribute.array[index+2],this.w=attribute.array[index+3],this}},THREE.Euler=function(x,y,z,order){this._x=x||0,this._y=y||0,this._z=z||0,this._order=order||THREE.Euler.DefaultOrder},THREE.Euler.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],THREE.Euler.DefaultOrder="XYZ",THREE.Euler.prototype={constructor:THREE.Euler,get x(){return this._x},set x(value){this._x=value,this.onChangeCallback()},get y(){return this._y},set y(value){this._y=value,this.onChangeCallback()},get z(){return this._z},set z(value){this._z=value,this.onChangeCallback()},get order(){return this._order},set order(value){this._order=value,this.onChangeCallback()},set:function(x,y,z,order){return this._x=x,this._y=y,this._z=z,this._order=order||this._order,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(euler){return this._x=euler._x,this._y=euler._y,this._z=euler._z,this._order=euler._order,this.onChangeCallback(),this},setFromRotationMatrix:function(m,order,update){var clamp=THREE.Math.clamp,te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10];return order=order||this._order,"XYZ"===order?(this._y=Math.asin(clamp(m13,-1,1)),Math.abs(m13)<.99999?(this._x=Math.atan2(-m23,m33),this._z=Math.atan2(-m12,m11)):(this._x=Math.atan2(m32,m22),this._z=0)):"YXZ"===order?(this._x=Math.asin(-clamp(m23,-1,1)),Math.abs(m23)<.99999?(this._y=Math.atan2(m13,m33),this._z=Math.atan2(m21,m22)):(this._y=Math.atan2(-m31,m11),this._z=0)):"ZXY"===order?(this._x=Math.asin(clamp(m32,-1,1)),Math.abs(m32)<.99999?(this._y=Math.atan2(-m31,m33),this._z=Math.atan2(-m12,m22)):(this._y=0,this._z=Math.atan2(m21,m11))):"ZYX"===order?(this._y=Math.asin(-clamp(m31,-1,1)),Math.abs(m31)<.99999?(this._x=Math.atan2(m32,m33),this._z=Math.atan2(m21,m11)):(this._x=0,this._z=Math.atan2(-m12,m22))):"YZX"===order?(this._z=Math.asin(clamp(m21,-1,1)),Math.abs(m21)<.99999?(this._x=Math.atan2(-m23,m22),this._y=Math.atan2(-m31,m11)):(this._x=0,this._y=Math.atan2(m13,m33))):"XZY"===order?(this._z=Math.asin(-clamp(m12,-1,1)),Math.abs(m12)<.99999?(this._x=Math.atan2(m32,m22),this._y=Math.atan2(m13,m11)):(this._x=Math.atan2(-m23,m33),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+order),this._order=order,update!==!1&&this.onChangeCallback(),this},setFromQuaternion:function(){var matrix;return function(q,order,update){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.makeRotationFromQuaternion(q),this.setFromRotationMatrix(matrix,order,update),this}}(),setFromVector3:function(v,order){return this.set(v.x,v.y,v.z,order||this._order)},reorder:function(){var q=new THREE.Quaternion;return function(newOrder){q.setFromEuler(this),this.setFromQuaternion(q,newOrder)}}(),equals:function(euler){return euler._x===this._x&&euler._y===this._y&&euler._z===this._z&&euler._order===this._order},fromArray:function(array){return this._x=array[0],this._y=array[1],this._z=array[2],void 0!==array[3]&&(this._order=array[3]),this.onChangeCallback(),this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this._x,array[offset+1]=this._y,array[offset+2]=this._z,array[offset+3]=this._order,array},toVector3:function(optionalResult){return optionalResult?optionalResult.set(this._x,this._y,this._z):new THREE.Vector3(this._x,this._y,this._z)},onChange:function(callback){return this.onChangeCallback=callback,this},onChangeCallback:function(){}},THREE.Line3=function(start,end){this.start=void 0!==start?start:new THREE.Vector3,this.end=void 0!==end?end:new THREE.Vector3},THREE.Line3.prototype={constructor:THREE.Line3,set:function(start,end){return this.start.copy(start),this.end.copy(end),this},clone:function(){return(new this.constructor).copy(this)},copy:function(line){return this.start.copy(line.start),this.end.copy(line.end),this},center:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(t,optionalTarget){var result=optionalTarget||new THREE.Vector3;return this.delta(result).multiplyScalar(t).add(this.start)},closestPointToPointParameter:function(){var startP=new THREE.Vector3,startEnd=new THREE.Vector3;return function(point,clampToLine){startP.subVectors(point,this.start),startEnd.subVectors(this.end,this.start);var startEnd2=startEnd.dot(startEnd),startEnd_startP=startEnd.dot(startP),t=startEnd_startP/startEnd2;return clampToLine&&(t=THREE.Math.clamp(t,0,1)),t}}(),closestPointToPoint:function(point,clampToLine,optionalTarget){var t=this.closestPointToPointParameter(point,clampToLine),result=optionalTarget||new THREE.Vector3;return this.delta(result).multiplyScalar(t).add(this.start)},applyMatrix4:function(matrix){return this.start.applyMatrix4(matrix),this.end.applyMatrix4(matrix),this},equals:function(line){return line.start.equals(this.start)&&line.end.equals(this.end)}},THREE.Box2=function(min,max){this.min=void 0!==min?min:new THREE.Vector2(1/0,1/0),this.max=void 0!==max?max:new THREE.Vector2(-(1/0),-(1/0))},THREE.Box2.prototype={constructor:THREE.Box2,set:function(min,max){return this.min.copy(min),this.max.copy(max),this},setFromPoints:function(points){this.makeEmpty();for(var i=0,il=points.length;il>i;i++)this.expandByPoint(points[i]);return this},setFromCenterAndSize:function(){var v1=new THREE.Vector2;return function(center,size){var halfSize=v1.copy(size).multiplyScalar(.5);return this.min.copy(center).sub(halfSize),this.max.copy(center).add(halfSize),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(box){return this.min.copy(box.min),this.max.copy(box.max),this},makeEmpty:function(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-(1/0),this},empty:function(){return this.max.xthis.max.x||point.ythis.max.y)},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y},getParameter:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector2;return result.set((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(box){return!(box.max.xthis.max.x||box.max.ythis.max.y)},clampPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector2;return result.copy(point).clamp(this.min,this.max)},distanceToPoint:function(){var v1=new THREE.Vector2;return function(point){var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length()}}(),intersect:function(box){return this.min.max(box.min),this.max.min(box.max),this},union:function(box){return this.min.min(box.min),this.max.max(box.max),this},translate:function(offset){return this.min.add(offset),this.max.add(offset),this},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max)}},THREE.Box3=function(min,max){this.min=void 0!==min?min:new THREE.Vector3(1/0,1/0,1/0),this.max=void 0!==max?max:new THREE.Vector3(-(1/0),-(1/0),-(1/0))},THREE.Box3.prototype={constructor:THREE.Box3,set:function(min,max){return this.min.copy(min),this.max.copy(max),this},setFromPoints:function(points){this.makeEmpty();for(var i=0,il=points.length;il>i;i++)this.expandByPoint(points[i]);return this},setFromCenterAndSize:function(){var v1=new THREE.Vector3;return function(center,size){var halfSize=v1.copy(size).multiplyScalar(.5);return this.min.copy(center).sub(halfSize),this.max.copy(center).add(halfSize),this}}(),setFromObject:function(){var v1=new THREE.Vector3;return function(object){var scope=this;return object.updateMatrixWorld(!0),this.makeEmpty(),object.traverse(function(node){var geometry=node.geometry;if(void 0!==geometry)if(geometry instanceof THREE.Geometry)for(var vertices=geometry.vertices,i=0,il=vertices.length;il>i;i++)v1.copy(vertices[i]),v1.applyMatrix4(node.matrixWorld),scope.expandByPoint(v1);else if(geometry instanceof THREE.BufferGeometry&&void 0!==geometry.attributes.position)for(var positions=geometry.attributes.position.array,i=0,il=positions.length;il>i;i+=3)v1.set(positions[i],positions[i+1],positions[i+2]),v1.applyMatrix4(node.matrixWorld),scope.expandByPoint(v1)}),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(box){return this.min.copy(box.min),this.max.copy(box.max),this},makeEmpty:function(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-(1/0),this},empty:function(){return this.max.xthis.max.x||point.ythis.max.y||point.zthis.max.z)},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y&&this.min.z<=box.min.z&&box.max.z<=this.max.z},getParameter:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.set((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y),(point.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(box){return!(box.max.xthis.max.x||box.max.ythis.max.y||box.max.zthis.max.z)},clampPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(point).clamp(this.min,this.max)},distanceToPoint:function(){var v1=new THREE.Vector3;return function(point){ +var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length()}}(),getBoundingSphere:function(){var v1=new THREE.Vector3;return function(optionalTarget){var result=optionalTarget||new THREE.Sphere;return result.center=this.center(),result.radius=.5*this.size(v1).length(),result}}(),intersect:function(box){return this.min.max(box.min),this.max.min(box.max),this},union:function(box){return this.min.min(box.min),this.max.max(box.max),this},applyMatrix4:function(){var points=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(matrix){return points[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(matrix),points[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(matrix),points[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(matrix),points[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(matrix),points[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(matrix),points[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(matrix),points[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(matrix),points[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(matrix),this.makeEmpty(),this.setFromPoints(points),this}}(),translate:function(offset){return this.min.add(offset),this.max.add(offset),this},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max)}},THREE.Matrix3=function(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1]),arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")},THREE.Matrix3.prototype={constructor:THREE.Matrix3,set:function(n11,n12,n13,n21,n22,n23,n31,n32,n33){var te=this.elements;return te[0]=n11,te[3]=n12,te[6]=n13,te[1]=n21,te[4]=n22,te[7]=n23,te[2]=n31,te[5]=n32,te[8]=n33,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(m){var me=m.elements;return this.set(me[0],me[3],me[6],me[1],me[4],me[7],me[2],me[5],me[8]),this},multiplyVector3:function(vector){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),vector.applyMatrix3(this)},multiplyVector3Array:function(a){return console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."),this.applyToVector3Array(a)},applyToVector3Array:function(){var v1;return function(array,offset,length){void 0===v1&&(v1=new THREE.Vector3),void 0===offset&&(offset=0),void 0===length&&(length=array.length);for(var i=0,j=offset;length>i;i+=3,j+=3)v1.fromArray(array,j),v1.applyMatrix3(this),v1.toArray(array,j);return array}}(),applyToBuffer:function(){var v1;return function(buffer,offset,length){void 0===v1&&(v1=new THREE.Vector3),void 0===offset&&(offset=0),void 0===length&&(length=buffer.length/buffer.itemSize);for(var i=0,j=offset;length>i;i++,j++)v1.x=buffer.getX(j),v1.y=buffer.getY(j),v1.z=buffer.getZ(j),v1.applyMatrix3(this),buffer.setXYZ(v1.x,v1.y,v1.z);return buffer}}(),multiplyScalar:function(s){var te=this.elements;return te[0]*=s,te[3]*=s,te[6]*=s,te[1]*=s,te[4]*=s,te[7]*=s,te[2]*=s,te[5]*=s,te[8]*=s,this},determinant:function(){var te=this.elements,a=te[0],b=te[1],c=te[2],d=te[3],e=te[4],f=te[5],g=te[6],h=te[7],i=te[8];return a*e*i-a*f*h-b*d*i+b*f*g+c*d*h-c*e*g},getInverse:function(matrix,throwOnInvertible){var me=matrix.elements,te=this.elements;te[0]=me[10]*me[5]-me[6]*me[9],te[1]=-me[10]*me[1]+me[2]*me[9],te[2]=me[6]*me[1]-me[2]*me[5],te[3]=-me[10]*me[4]+me[6]*me[8],te[4]=me[10]*me[0]-me[2]*me[8],te[5]=-me[6]*me[0]+me[2]*me[4],te[6]=me[9]*me[4]-me[5]*me[8],te[7]=-me[9]*me[0]+me[1]*me[8],te[8]=me[5]*me[0]-me[1]*me[4];var det=me[0]*te[0]+me[1]*te[3]+me[2]*te[6];if(0===det){var msg="Matrix3.getInverse(): can't invert matrix, determinant is 0";if(throwOnInvertible)throw new Error(msg);return console.warn(msg),this.identity(),this}return this.multiplyScalar(1/det),this},transpose:function(){var tmp,m=this.elements;return tmp=m[1],m[1]=m[3],m[3]=tmp,tmp=m[2],m[2]=m[6],m[6]=tmp,tmp=m[5],m[5]=m[7],m[7]=tmp,this},flattenToArrayOffset:function(array,offset){var te=this.elements;return array[offset]=te[0],array[offset+1]=te[1],array[offset+2]=te[2],array[offset+3]=te[3],array[offset+4]=te[4],array[offset+5]=te[5],array[offset+6]=te[6],array[offset+7]=te[7],array[offset+8]=te[8],array},getNormalMatrix:function(m){return this.getInverse(m).transpose(),this},transposeIntoArray:function(r){var m=this.elements;return r[0]=m[0],r[1]=m[3],r[2]=m[6],r[3]=m[1],r[4]=m[4],r[5]=m[7],r[6]=m[2],r[7]=m[5],r[8]=m[8],this},fromArray:function(array){return this.elements.set(array),this},toArray:function(){var te=this.elements;return[te[0],te[1],te[2],te[3],te[4],te[5],te[6],te[7],te[8]]}},THREE.Matrix4=function(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")},THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){var te=this.elements;return te[0]=n11,te[4]=n12,te[8]=n13,te[12]=n14,te[1]=n21,te[5]=n22,te[9]=n23,te[13]=n24,te[2]=n31,te[6]=n32,te[10]=n33,te[14]=n34,te[3]=n41,te[7]=n42,te[11]=n43,te[15]=n44,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new THREE.Matrix4).fromArray(this.elements)},copy:function(m){return this.elements.set(m.elements),this},extractPosition:function(m){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(m)},copyPosition:function(m){var te=this.elements,me=m.elements;return te[12]=me[12],te[13]=me[13],te[14]=me[14],this},extractBasis:function(xAxis,yAxis,zAxis){var te=this.elements;return xAxis.set(te[0],te[1],te[2]),yAxis.set(te[4],te[5],te[6]),zAxis.set(te[8],te[9],te[10]),this},makeBasis:function(xAxis,yAxis,zAxis){return this.set(xAxis.x,yAxis.x,zAxis.x,0,xAxis.y,yAxis.y,zAxis.y,0,xAxis.z,yAxis.z,zAxis.z,0,0,0,0,1),this},extractRotation:function(){var v1;return function(m){void 0===v1&&(v1=new THREE.Vector3);var te=this.elements,me=m.elements,scaleX=1/v1.set(me[0],me[1],me[2]).length(),scaleY=1/v1.set(me[4],me[5],me[6]).length(),scaleZ=1/v1.set(me[8],me[9],me[10]).length();return te[0]=me[0]*scaleX,te[1]=me[1]*scaleX,te[2]=me[2]*scaleX,te[4]=me[4]*scaleY,te[5]=me[5]*scaleY,te[6]=me[6]*scaleY,te[8]=me[8]*scaleZ,te[9]=me[9]*scaleZ,te[10]=me[10]*scaleZ,this}}(),makeRotationFromEuler:function(euler){euler instanceof THREE.Euler==!1&&console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var te=this.elements,x=euler.x,y=euler.y,z=euler.z,a=Math.cos(x),b=Math.sin(x),c=Math.cos(y),d=Math.sin(y),e=Math.cos(z),f=Math.sin(z);if("XYZ"===euler.order){var ae=a*e,af=a*f,be=b*e,bf=b*f;te[0]=c*e,te[4]=-c*f,te[8]=d,te[1]=af+be*d,te[5]=ae-bf*d,te[9]=-b*c,te[2]=bf-ae*d,te[6]=be+af*d,te[10]=a*c}else if("YXZ"===euler.order){var ce=c*e,cf=c*f,de=d*e,df=d*f;te[0]=ce+df*b,te[4]=de*b-cf,te[8]=a*d,te[1]=a*f,te[5]=a*e,te[9]=-b,te[2]=cf*b-de,te[6]=df+ce*b,te[10]=a*c}else if("ZXY"===euler.order){var ce=c*e,cf=c*f,de=d*e,df=d*f;te[0]=ce-df*b,te[4]=-a*f,te[8]=de+cf*b,te[1]=cf+de*b,te[5]=a*e,te[9]=df-ce*b,te[2]=-a*d,te[6]=b,te[10]=a*c}else if("ZYX"===euler.order){var ae=a*e,af=a*f,be=b*e,bf=b*f;te[0]=c*e,te[4]=be*d-af,te[8]=ae*d+bf,te[1]=c*f,te[5]=bf*d+ae,te[9]=af*d-be,te[2]=-d,te[6]=b*c,te[10]=a*c}else if("YZX"===euler.order){var ac=a*c,ad=a*d,bc=b*c,bd=b*d;te[0]=c*e,te[4]=bd-ac*f,te[8]=bc*f+ad,te[1]=f,te[5]=a*e,te[9]=-b*e,te[2]=-d*e,te[6]=ad*f+bc,te[10]=ac-bd*f}else if("XZY"===euler.order){var ac=a*c,ad=a*d,bc=b*c,bd=b*d;te[0]=c*e,te[4]=-f,te[8]=d*e,te[1]=ac*f+bd,te[5]=a*e,te[9]=ad*f-bc,te[2]=bc*f-ad,te[6]=b*e,te[10]=bd*f+ac}return te[3]=0,te[7]=0,te[11]=0,te[12]=0,te[13]=0,te[14]=0,te[15]=1,this},setRotationFromQuaternion:function(q){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(q)},makeRotationFromQuaternion:function(q){var te=this.elements,x=q.x,y=q.y,z=q.z,w=q.w,x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;return te[0]=1-(yy+zz),te[4]=xy-wz,te[8]=xz+wy,te[1]=xy+wz,te[5]=1-(xx+zz),te[9]=yz-wx,te[2]=xz-wy,te[6]=yz+wx,te[10]=1-(xx+yy),te[3]=0,te[7]=0,te[11]=0,te[12]=0,te[13]=0,te[14]=0,te[15]=1,this},lookAt:function(){var x,y,z;return function(eye,target,up){void 0===x&&(x=new THREE.Vector3),void 0===y&&(y=new THREE.Vector3),void 0===z&&(z=new THREE.Vector3);var te=this.elements;return z.subVectors(eye,target).normalize(),0===z.lengthSq()&&(z.z=1),x.crossVectors(up,z).normalize(),0===x.lengthSq()&&(z.x+=1e-4,x.crossVectors(up,z).normalize()),y.crossVectors(z,x),te[0]=x.x,te[4]=y.x,te[8]=z.x,te[1]=x.y,te[5]=y.y,te[9]=z.y,te[2]=x.z,te[6]=y.z,te[10]=z.z,this}}(),multiply:function(m,n){return void 0!==n?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(m,n)):this.multiplyMatrices(this,m)},multiplyMatrices:function(a,b){var ae=a.elements,be=b.elements,te=this.elements,a11=ae[0],a12=ae[4],a13=ae[8],a14=ae[12],a21=ae[1],a22=ae[5],a23=ae[9],a24=ae[13],a31=ae[2],a32=ae[6],a33=ae[10],a34=ae[14],a41=ae[3],a42=ae[7],a43=ae[11],a44=ae[15],b11=be[0],b12=be[4],b13=be[8],b14=be[12],b21=be[1],b22=be[5],b23=be[9],b24=be[13],b31=be[2],b32=be[6],b33=be[10],b34=be[14],b41=be[3],b42=be[7],b43=be[11],b44=be[15];return te[0]=a11*b11+a12*b21+a13*b31+a14*b41,te[4]=a11*b12+a12*b22+a13*b32+a14*b42,te[8]=a11*b13+a12*b23+a13*b33+a14*b43,te[12]=a11*b14+a12*b24+a13*b34+a14*b44,te[1]=a21*b11+a22*b21+a23*b31+a24*b41,te[5]=a21*b12+a22*b22+a23*b32+a24*b42,te[9]=a21*b13+a22*b23+a23*b33+a24*b43,te[13]=a21*b14+a22*b24+a23*b34+a24*b44,te[2]=a31*b11+a32*b21+a33*b31+a34*b41,te[6]=a31*b12+a32*b22+a33*b32+a34*b42,te[10]=a31*b13+a32*b23+a33*b33+a34*b43,te[14]=a31*b14+a32*b24+a33*b34+a34*b44,te[3]=a41*b11+a42*b21+a43*b31+a44*b41,te[7]=a41*b12+a42*b22+a43*b32+a44*b42,te[11]=a41*b13+a42*b23+a43*b33+a44*b43,te[15]=a41*b14+a42*b24+a43*b34+a44*b44,this},multiplyToArray:function(a,b,r){var te=this.elements;return this.multiplyMatrices(a,b),r[0]=te[0],r[1]=te[1],r[2]=te[2],r[3]=te[3],r[4]=te[4],r[5]=te[5],r[6]=te[6],r[7]=te[7],r[8]=te[8],r[9]=te[9],r[10]=te[10],r[11]=te[11],r[12]=te[12],r[13]=te[13],r[14]=te[14],r[15]=te[15],this},multiplyScalar:function(s){var te=this.elements;return te[0]*=s,te[4]*=s,te[8]*=s,te[12]*=s,te[1]*=s,te[5]*=s,te[9]*=s,te[13]*=s,te[2]*=s,te[6]*=s,te[10]*=s,te[14]*=s,te[3]*=s,te[7]*=s,te[11]*=s,te[15]*=s,this},multiplyVector3:function(vector){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead."),vector.applyProjection(this)},multiplyVector4:function(vector){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),vector.applyMatrix4(this)},multiplyVector3Array:function(a){return console.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."),this.applyToVector3Array(a)},applyToVector3Array:function(){var v1;return function(array,offset,length){void 0===v1&&(v1=new THREE.Vector3),void 0===offset&&(offset=0),void 0===length&&(length=array.length);for(var i=0,j=offset;length>i;i+=3,j+=3)v1.fromArray(array,j),v1.applyMatrix4(this),v1.toArray(array,j);return array}}(),applyToBuffer:function(){var v1;return function(buffer,offset,length){void 0===v1&&(v1=new THREE.Vector3),void 0===offset&&(offset=0),void 0===length&&(length=buffer.length/buffer.itemSize);for(var i=0,j=offset;length>i;i++,j++)v1.x=buffer.getX(j),v1.y=buffer.getY(j),v1.z=buffer.getZ(j),v1.applyMatrix4(this),buffer.setXYZ(v1.x,v1.y,v1.z);return buffer}}(),rotateAxis:function(v){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),v.transformDirection(this)},crossVector:function(vector){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),vector.applyMatrix4(this)},determinant:function(){var te=this.elements,n11=te[0],n12=te[4],n13=te[8],n14=te[12],n21=te[1],n22=te[5],n23=te[9],n24=te[13],n31=te[2],n32=te[6],n33=te[10],n34=te[14],n41=te[3],n42=te[7],n43=te[11],n44=te[15];return n41*(+n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34)+n42*(+n11*n23*n34-n11*n24*n33+n14*n21*n33-n13*n21*n34+n13*n24*n31-n14*n23*n31)+n43*(+n11*n24*n32-n11*n22*n34-n14*n21*n32+n12*n21*n34+n14*n22*n31-n12*n24*n31)+n44*(-n13*n22*n31-n11*n23*n32+n11*n22*n33+n13*n21*n32-n12*n21*n33+n12*n23*n31)},transpose:function(){var tmp,te=this.elements;return tmp=te[1],te[1]=te[4],te[4]=tmp,tmp=te[2],te[2]=te[8],te[8]=tmp,tmp=te[6],te[6]=te[9],te[9]=tmp,tmp=te[3],te[3]=te[12],te[12]=tmp,tmp=te[7],te[7]=te[13],te[13]=tmp,tmp=te[11],te[11]=te[14],te[14]=tmp,this},flattenToArrayOffset:function(array,offset){var te=this.elements;return array[offset]=te[0],array[offset+1]=te[1],array[offset+2]=te[2],array[offset+3]=te[3],array[offset+4]=te[4],array[offset+5]=te[5],array[offset+6]=te[6],array[offset+7]=te[7],array[offset+8]=te[8],array[offset+9]=te[9],array[offset+10]=te[10],array[offset+11]=te[11],array[offset+12]=te[12],array[offset+13]=te[13],array[offset+14]=te[14],array[offset+15]=te[15],array},getPosition:function(){var v1;return function(){void 0===v1&&(v1=new THREE.Vector3),console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");var te=this.elements;return v1.set(te[12],te[13],te[14])}}(),setPosition:function(v){var te=this.elements;return te[12]=v.x,te[13]=v.y,te[14]=v.z,this},getInverse:function(m,throwOnInvertible){var te=this.elements,me=m.elements,n11=me[0],n12=me[4],n13=me[8],n14=me[12],n21=me[1],n22=me[5],n23=me[9],n24=me[13],n31=me[2],n32=me[6],n33=me[10],n34=me[14],n41=me[3],n42=me[7],n43=me[11],n44=me[15];te[0]=n23*n34*n42-n24*n33*n42+n24*n32*n43-n22*n34*n43-n23*n32*n44+n22*n33*n44,te[4]=n14*n33*n42-n13*n34*n42-n14*n32*n43+n12*n34*n43+n13*n32*n44-n12*n33*n44,te[8]=n13*n24*n42-n14*n23*n42+n14*n22*n43-n12*n24*n43-n13*n22*n44+n12*n23*n44,te[12]=n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34,te[1]=n24*n33*n41-n23*n34*n41-n24*n31*n43+n21*n34*n43+n23*n31*n44-n21*n33*n44,te[5]=n13*n34*n41-n14*n33*n41+n14*n31*n43-n11*n34*n43-n13*n31*n44+n11*n33*n44,te[9]=n14*n23*n41-n13*n24*n41-n14*n21*n43+n11*n24*n43+n13*n21*n44-n11*n23*n44,te[13]=n13*n24*n31-n14*n23*n31+n14*n21*n33-n11*n24*n33-n13*n21*n34+n11*n23*n34,te[2]=n22*n34*n41-n24*n32*n41+n24*n31*n42-n21*n34*n42-n22*n31*n44+n21*n32*n44,te[6]=n14*n32*n41-n12*n34*n41-n14*n31*n42+n11*n34*n42+n12*n31*n44-n11*n32*n44,te[10]=n12*n24*n41-n14*n22*n41+n14*n21*n42-n11*n24*n42-n12*n21*n44+n11*n22*n44,te[14]=n14*n22*n31-n12*n24*n31-n14*n21*n32+n11*n24*n32+n12*n21*n34-n11*n22*n34,te[3]=n23*n32*n41-n22*n33*n41-n23*n31*n42+n21*n33*n42+n22*n31*n43-n21*n32*n43,te[7]=n12*n33*n41-n13*n32*n41+n13*n31*n42-n11*n33*n42-n12*n31*n43+n11*n32*n43,te[11]=n13*n22*n41-n12*n23*n41-n13*n21*n42+n11*n23*n42+n12*n21*n43-n11*n22*n43,te[15]=n12*n23*n31-n13*n22*n31+n13*n21*n32-n11*n23*n32-n12*n21*n33+n11*n22*n33;var det=n11*te[0]+n21*te[4]+n31*te[8]+n41*te[12];if(0===det){var msg="THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0";if(throwOnInvertible)throw new Error(msg);return console.warn(msg),this.identity(),this}return this.multiplyScalar(1/det),this},translate:function(v){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(angle){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(angle){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(angle){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(axis,angle){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},scale:function(v){var te=this.elements,x=v.x,y=v.y,z=v.z;return te[0]*=x,te[4]*=y,te[8]*=z,te[1]*=x,te[5]*=y,te[9]*=z,te[2]*=x,te[6]*=y,te[10]*=z,te[3]*=x,te[7]*=y,te[11]*=z,this},getMaxScaleOnAxis:function(){var te=this.elements,scaleXSq=te[0]*te[0]+te[1]*te[1]+te[2]*te[2],scaleYSq=te[4]*te[4]+te[5]*te[5]+te[6]*te[6],scaleZSq=te[8]*te[8]+te[9]*te[9]+te[10]*te[10];return Math.sqrt(Math.max(scaleXSq,scaleYSq,scaleZSq))},makeTranslation:function(x,y,z){return this.set(1,0,0,x,0,1,0,y,0,0,1,z,0,0,0,1),this},makeRotationX:function(theta){var c=Math.cos(theta),s=Math.sin(theta);return this.set(1,0,0,0,0,c,-s,0,0,s,c,0,0,0,0,1),this},makeRotationY:function(theta){var c=Math.cos(theta),s=Math.sin(theta);return this.set(c,0,s,0,0,1,0,0,-s,0,c,0,0,0,0,1),this},makeRotationZ:function(theta){var c=Math.cos(theta),s=Math.sin(theta);return this.set(c,-s,0,0,s,c,0,0,0,0,1,0,0,0,0,1),this},makeRotationAxis:function(axis,angle){var c=Math.cos(angle),s=Math.sin(angle),t=1-c,x=axis.x,y=axis.y,z=axis.z,tx=t*x,ty=t*y;return this.set(tx*x+c,tx*y-s*z,tx*z+s*y,0,tx*y+s*z,ty*y+c,ty*z-s*x,0,tx*z-s*y,ty*z+s*x,t*z*z+c,0,0,0,0,1),this},makeScale:function(x,y,z){return this.set(x,0,0,0,0,y,0,0,0,0,z,0,0,0,0,1),this},compose:function(position,quaternion,scale){return this.makeRotationFromQuaternion(quaternion),this.scale(scale),this.setPosition(position),this},decompose:function(){var vector,matrix;return function(position,quaternion,scale){void 0===vector&&(vector=new THREE.Vector3),void 0===matrix&&(matrix=new THREE.Matrix4);var te=this.elements,sx=vector.set(te[0],te[1],te[2]).length(),sy=vector.set(te[4],te[5],te[6]).length(),sz=vector.set(te[8],te[9],te[10]).length(),det=this.determinant();0>det&&(sx=-sx),position.x=te[12],position.y=te[13],position.z=te[14],matrix.elements.set(this.elements);var invSX=1/sx,invSY=1/sy,invSZ=1/sz;return matrix.elements[0]*=invSX,matrix.elements[1]*=invSX,matrix.elements[2]*=invSX,matrix.elements[4]*=invSY,matrix.elements[5]*=invSY,matrix.elements[6]*=invSY,matrix.elements[8]*=invSZ,matrix.elements[9]*=invSZ,matrix.elements[10]*=invSZ,quaternion.setFromRotationMatrix(matrix),scale.x=sx,scale.y=sy,scale.z=sz,this}}(),makeFrustum:function(left,right,bottom,top,near,far){var te=this.elements,x=2*near/(right-left),y=2*near/(top-bottom),a=(right+left)/(right-left),b=(top+bottom)/(top-bottom),c=-(far+near)/(far-near),d=-2*far*near/(far-near);return te[0]=x,te[4]=0,te[8]=a,te[12]=0,te[1]=0,te[5]=y,te[9]=b,te[13]=0,te[2]=0,te[6]=0,te[10]=c,te[14]=d,te[3]=0,te[7]=0,te[11]=-1,te[15]=0,this},makePerspective:function(fov,aspect,near,far){var ymax=near*Math.tan(THREE.Math.degToRad(.5*fov)),ymin=-ymax,xmin=ymin*aspect,xmax=ymax*aspect;return this.makeFrustum(xmin,xmax,ymin,ymax,near,far)},makeOrthographic:function(left,right,top,bottom,near,far){var te=this.elements,w=right-left,h=top-bottom,p=far-near,x=(right+left)/w,y=(top+bottom)/h,z=(far+near)/p;return te[0]=2/w,te[4]=0,te[8]=0,te[12]=-x,te[1]=0,te[5]=2/h,te[9]=0,te[13]=-y,te[2]=0,te[6]=0,te[10]=-2/p,te[14]=-z,te[3]=0,te[7]=0,te[11]=0,te[15]=1,this},equals:function(matrix){for(var te=this.elements,me=matrix.elements,i=0;16>i;i++)if(te[i]!==me[i])return!1;return!0},fromArray:function(array){return this.elements.set(array),this},toArray:function(){var te=this.elements;return[te[0],te[1],te[2],te[3],te[4],te[5],te[6],te[7],te[8],te[9],te[10],te[11],te[12],te[13],te[14],te[15]]}},THREE.Ray=function(origin,direction){this.origin=void 0!==origin?origin:new THREE.Vector3,this.direction=void 0!==direction?direction:new THREE.Vector3},THREE.Ray.prototype={constructor:THREE.Ray,set:function(origin,direction){return this.origin.copy(origin),this.direction.copy(direction),this},clone:function(){return(new this.constructor).copy(this)},copy:function(ray){return this.origin.copy(ray.origin),this.direction.copy(ray.direction),this},at:function(t,optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(this.direction).multiplyScalar(t).add(this.origin)},recast:function(){var v1=new THREE.Vector3;return function(t){return this.origin.copy(this.at(t,v1)),this}}(),closestPointToPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector3;result.subVectors(point,this.origin);var directionDistance=result.dot(this.direction);return 0>directionDistance?result.copy(this.origin):result.copy(this.direction).multiplyScalar(directionDistance).add(this.origin)},distanceToPoint:function(point){return Math.sqrt(this.distanceSqToPoint(point))},distanceSqToPoint:function(){var v1=new THREE.Vector3;return function(point){var directionDistance=v1.subVectors(point,this.origin).dot(this.direction);return 0>directionDistance?this.origin.distanceToSquared(point):(v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin),v1.distanceToSquared(point))}}(),distanceSqToSegment:function(){var segCenter=new THREE.Vector3,segDir=new THREE.Vector3,diff=new THREE.Vector3;return function(v0,v1,optionalPointOnRay,optionalPointOnSegment){segCenter.copy(v0).add(v1).multiplyScalar(.5),segDir.copy(v1).sub(v0).normalize(),diff.copy(this.origin).sub(segCenter);var s0,s1,sqrDist,extDet,segExtent=.5*v0.distanceTo(v1),a01=-this.direction.dot(segDir),b0=diff.dot(this.direction),b1=-diff.dot(segDir),c=diff.lengthSq(),det=Math.abs(1-a01*a01);if(det>0)if(s0=a01*b1-b0,s1=a01*b0-b1,extDet=segExtent*det,s0>=0)if(s1>=-extDet)if(extDet>=s1){var invDet=1/det;s0*=invDet,s1*=invDet,sqrDist=s0*(s0+a01*s1+2*b0)+s1*(a01*s0+s1+2*b1)+c}else s1=segExtent,s0=Math.max(0,-(a01*s1+b0)),sqrDist=-s0*s0+s1*(s1+2*b1)+c;else s1=-segExtent,s0=Math.max(0,-(a01*s1+b0)),sqrDist=-s0*s0+s1*(s1+2*b1)+c;else-extDet>=s1?(s0=Math.max(0,-(-a01*segExtent+b0)),s1=s0>0?-segExtent:Math.min(Math.max(-segExtent,-b1),segExtent),sqrDist=-s0*s0+s1*(s1+2*b1)+c):extDet>=s1?(s0=0,s1=Math.min(Math.max(-segExtent,-b1),segExtent),sqrDist=s1*(s1+2*b1)+c):(s0=Math.max(0,-(a01*segExtent+b0)),s1=s0>0?segExtent:Math.min(Math.max(-segExtent,-b1),segExtent),sqrDist=-s0*s0+s1*(s1+2*b1)+c);else s1=a01>0?-segExtent:segExtent,s0=Math.max(0,-(a01*s1+b0)),sqrDist=-s0*s0+s1*(s1+2*b1)+c;return optionalPointOnRay&&optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin),optionalPointOnSegment&&optionalPointOnSegment.copy(segDir).multiplyScalar(s1).add(segCenter),sqrDist}}(),isIntersectionSphere:function(sphere){return this.distanceToPoint(sphere.center)<=sphere.radius},intersectSphere:function(){var v1=new THREE.Vector3;return function(sphere,optionalTarget){v1.subVectors(sphere.center,this.origin);var tca=v1.dot(this.direction),d2=v1.dot(v1)-tca*tca,radius2=sphere.radius*sphere.radius;if(d2>radius2)return null;var thc=Math.sqrt(radius2-d2),t0=tca-thc,t1=tca+thc;return 0>t0&&0>t1?null:0>t0?this.at(t1,optionalTarget):this.at(t0,optionalTarget)}}(),isIntersectionPlane:function(plane){var distToPoint=plane.distanceToPoint(this.origin);if(0===distToPoint)return!0;var denominator=plane.normal.dot(this.direction);return 0>denominator*distToPoint},distanceToPlane:function(plane){var denominator=plane.normal.dot(this.direction);if(0===denominator)return 0===plane.distanceToPoint(this.origin)?0:null;var t=-(this.origin.dot(plane.normal)+plane.constant)/denominator;return t>=0?t:null},intersectPlane:function(plane,optionalTarget){var t=this.distanceToPlane(plane);return null===t?null:this.at(t,optionalTarget)},isIntersectionBox:function(){var v=new THREE.Vector3;return function(box){return null!==this.intersectBox(box,v)}}(),intersectBox:function(box,optionalTarget){var tmin,tmax,tymin,tymax,tzmin,tzmax,invdirx=1/this.direction.x,invdiry=1/this.direction.y,invdirz=1/this.direction.z,origin=this.origin;return invdirx>=0?(tmin=(box.min.x-origin.x)*invdirx,tmax=(box.max.x-origin.x)*invdirx):(tmin=(box.max.x-origin.x)*invdirx,tmax=(box.min.x-origin.x)*invdirx),invdiry>=0?(tymin=(box.min.y-origin.y)*invdiry,tymax=(box.max.y-origin.y)*invdiry):(tymin=(box.max.y-origin.y)*invdiry,tymax=(box.min.y-origin.y)*invdiry),tmin>tymax||tymin>tmax?null:((tymin>tmin||tmin!==tmin)&&(tmin=tymin),(tmax>tymax||tmax!==tmax)&&(tmax=tymax),invdirz>=0?(tzmin=(box.min.z-origin.z)*invdirz,tzmax=(box.max.z-origin.z)*invdirz):(tzmin=(box.max.z-origin.z)*invdirz,tzmax=(box.min.z-origin.z)*invdirz),tmin>tzmax||tzmin>tmax?null:((tzmin>tmin||tmin!==tmin)&&(tmin=tzmin),(tmax>tzmax||tmax!==tmax)&&(tmax=tzmax),0>tmax?null:this.at(tmin>=0?tmin:tmax,optionalTarget)))},intersectTriangle:function(){var diff=new THREE.Vector3,edge1=new THREE.Vector3,edge2=new THREE.Vector3,normal=new THREE.Vector3;return function(a,b,c,backfaceCulling,optionalTarget){edge1.subVectors(b,a),edge2.subVectors(c,a),normal.crossVectors(edge1,edge2);var sign,DdN=this.direction.dot(normal);if(DdN>0){if(backfaceCulling)return null;sign=1}else{if(!(0>DdN))return null;sign=-1,DdN=-DdN}diff.subVectors(this.origin,a);var DdQxE2=sign*this.direction.dot(edge2.crossVectors(diff,edge2));if(0>DdQxE2)return null;var DdE1xQ=sign*this.direction.dot(edge1.cross(diff));if(0>DdE1xQ)return null;if(DdQxE2+DdE1xQ>DdN)return null;var QdN=-sign*diff.dot(normal);return 0>QdN?null:this.at(QdN/DdN,optionalTarget)}}(),applyMatrix4:function(matrix4){return this.direction.add(this.origin).applyMatrix4(matrix4),this.origin.applyMatrix4(matrix4),this.direction.sub(this.origin),this.direction.normalize(),this},equals:function(ray){return ray.origin.equals(this.origin)&&ray.direction.equals(this.direction)}},THREE.Sphere=function(center,radius){this.center=void 0!==center?center:new THREE.Vector3,this.radius=void 0!==radius?radius:0},THREE.Sphere.prototype={constructor:THREE.Sphere,set:function(center,radius){return this.center.copy(center),this.radius=radius,this},setFromPoints:function(){var box=new THREE.Box3;return function(points,optionalCenter){var center=this.center;void 0!==optionalCenter?center.copy(optionalCenter):box.setFromPoints(points).center(center);for(var maxRadiusSq=0,i=0,il=points.length;il>i;i++)maxRadiusSq=Math.max(maxRadiusSq,center.distanceToSquared(points[i]));return this.radius=Math.sqrt(maxRadiusSq),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(sphere){return this.center.copy(sphere.center),this.radius=sphere.radius,this},empty:function(){return this.radius<=0},containsPoint:function(point){return point.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(point){return point.distanceTo(this.center)-this.radius},intersectsSphere:function(sphere){var radiusSum=this.radius+sphere.radius;return sphere.center.distanceToSquared(this.center)<=radiusSum*radiusSum},clampPoint:function(point,optionalTarget){var deltaLengthSq=this.center.distanceToSquared(point),result=optionalTarget||new THREE.Vector3;return result.copy(point),deltaLengthSq>this.radius*this.radius&&(result.sub(this.center).normalize(),result.multiplyScalar(this.radius).add(this.center)),result},getBoundingBox:function(optionalTarget){var box=optionalTarget||new THREE.Box3;return box.set(this.center,this.center),box.expandByScalar(this.radius),box},applyMatrix4:function(matrix){return this.center.applyMatrix4(matrix),this.radius=this.radius*matrix.getMaxScaleOnAxis(),this},translate:function(offset){return this.center.add(offset),this},equals:function(sphere){return sphere.center.equals(this.center)&&sphere.radius===this.radius}},THREE.Frustum=function(p0,p1,p2,p3,p4,p5){this.planes=[void 0!==p0?p0:new THREE.Plane,void 0!==p1?p1:new THREE.Plane,void 0!==p2?p2:new THREE.Plane,void 0!==p3?p3:new THREE.Plane,void 0!==p4?p4:new THREE.Plane,void 0!==p5?p5:new THREE.Plane]},THREE.Frustum.prototype={constructor:THREE.Frustum,set:function(p0,p1,p2,p3,p4,p5){var planes=this.planes;return planes[0].copy(p0),planes[1].copy(p1),planes[2].copy(p2),planes[3].copy(p3),planes[4].copy(p4),planes[5].copy(p5),this},clone:function(){return(new this.constructor).copy(this)},copy:function(frustum){for(var planes=this.planes,i=0;6>i;i++)planes[i].copy(frustum.planes[i]);return this},setFromMatrix:function(m){var planes=this.planes,me=m.elements,me0=me[0],me1=me[1],me2=me[2],me3=me[3],me4=me[4],me5=me[5],me6=me[6],me7=me[7],me8=me[8],me9=me[9],me10=me[10],me11=me[11],me12=me[12],me13=me[13],me14=me[14],me15=me[15];return planes[0].setComponents(me3-me0,me7-me4,me11-me8,me15-me12).normalize(),planes[1].setComponents(me3+me0,me7+me4,me11+me8,me15+me12).normalize(),planes[2].setComponents(me3+me1,me7+me5,me11+me9,me15+me13).normalize(),planes[3].setComponents(me3-me1,me7-me5,me11-me9,me15-me13).normalize(),planes[4].setComponents(me3-me2,me7-me6,me11-me10,me15-me14).normalize(),planes[5].setComponents(me3+me2,me7+me6,me11+me10,me15+me14).normalize(),this},intersectsObject:function(){var sphere=new THREE.Sphere;return function(object){var geometry=object.geometry;return null===geometry.boundingSphere&&geometry.computeBoundingSphere(),sphere.copy(geometry.boundingSphere),sphere.applyMatrix4(object.matrixWorld),this.intersectsSphere(sphere)}}(),intersectsSphere:function(sphere){for(var planes=this.planes,center=sphere.center,negRadius=-sphere.radius,i=0;6>i;i++){var distance=planes[i].distanceToPoint(center);if(negRadius>distance)return!1}return!0},intersectsBox:function(){var p1=new THREE.Vector3,p2=new THREE.Vector3;return function(box){for(var planes=this.planes,i=0;6>i;i++){var plane=planes[i];p1.x=plane.normal.x>0?box.min.x:box.max.x,p2.x=plane.normal.x>0?box.max.x:box.min.x,p1.y=plane.normal.y>0?box.min.y:box.max.y,p2.y=plane.normal.y>0?box.max.y:box.min.y,p1.z=plane.normal.z>0?box.min.z:box.max.z,p2.z=plane.normal.z>0?box.max.z:box.min.z;var d1=plane.distanceToPoint(p1),d2=plane.distanceToPoint(p2);if(0>d1&&0>d2)return!1}return!0}}(),containsPoint:function(point){for(var planes=this.planes,i=0;6>i;i++)if(planes[i].distanceToPoint(point)<0)return!1;return!0}},THREE.Plane=function(normal,constant){this.normal=void 0!==normal?normal:new THREE.Vector3(1,0,0),this.constant=void 0!==constant?constant:0},THREE.Plane.prototype={constructor:THREE.Plane,set:function(normal,constant){return this.normal.copy(normal),this.constant=constant,this},setComponents:function(x,y,z,w){return this.normal.set(x,y,z),this.constant=w,this},setFromNormalAndCoplanarPoint:function(normal,point){return this.normal.copy(normal),this.constant=-point.dot(this.normal),this},setFromCoplanarPoints:function(){var v1=new THREE.Vector3,v2=new THREE.Vector3;return function(a,b,c){var normal=v1.subVectors(c,b).cross(v2.subVectors(a,b)).normalize();return this.setFromNormalAndCoplanarPoint(normal,a),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(plane){return this.normal.copy(plane.normal),this.constant=plane.constant,this},normalize:function(){var inverseNormalLength=1/this.normal.length();return this.normal.multiplyScalar(inverseNormalLength),this.constant*=inverseNormalLength,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(point){return this.normal.dot(point)+this.constant},distanceToSphere:function(sphere){return this.distanceToPoint(sphere.center)-sphere.radius},projectPoint:function(point,optionalTarget){return this.orthoPoint(point,optionalTarget).sub(point).negate()},orthoPoint:function(point,optionalTarget){var perpendicularMagnitude=this.distanceToPoint(point),result=optionalTarget||new THREE.Vector3;return result.copy(this.normal).multiplyScalar(perpendicularMagnitude)},isIntersectionLine:function(line){var startSign=this.distanceToPoint(line.start),endSign=this.distanceToPoint(line.end);return 0>startSign&&endSign>0||0>endSign&&startSign>0},intersectLine:function(){var v1=new THREE.Vector3;return function(line,optionalTarget){var result=optionalTarget||new THREE.Vector3,direction=line.delta(v1),denominator=this.normal.dot(direction);if(0!==denominator){var t=-(line.start.dot(this.normal)+this.constant)/denominator;if(!(0>t||t>1))return result.copy(direction).multiplyScalar(t).add(line.start); +}else if(0===this.distanceToPoint(line.start))return result.copy(line.start)}}(),coplanarPoint:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var v1=new THREE.Vector3,v2=new THREE.Vector3,m1=new THREE.Matrix3;return function(matrix,optionalNormalMatrix){var normalMatrix=optionalNormalMatrix||m1.getNormalMatrix(matrix),newNormal=v1.copy(this.normal).applyMatrix3(normalMatrix),newCoplanarPoint=this.coplanarPoint(v2);return newCoplanarPoint.applyMatrix4(matrix),this.setFromNormalAndCoplanarPoint(newNormal,newCoplanarPoint),this}}(),translate:function(offset){return this.constant=this.constant-offset.dot(this.normal),this},equals:function(plane){return plane.normal.equals(this.normal)&&plane.constant===this.constant}},THREE.Math={generateUUID:function(){var r,chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),uuid=new Array(36),rnd=0;return function(){for(var i=0;36>i;i++)8===i||13===i||18===i||23===i?uuid[i]="-":14===i?uuid[i]="4":(2>=rnd&&(rnd=33554432+16777216*Math.random()|0),r=15&rnd,rnd>>=4,uuid[i]=chars[19===i?3&r|8:r]);return uuid.join("")}}(),clamp:function(value,min,max){return Math.max(min,Math.min(max,value))},euclideanModulo:function(n,m){return(n%m+m)%m},mapLinear:function(x,a1,a2,b1,b2){return b1+(x-a1)*(b2-b1)/(a2-a1)},smoothstep:function(x,min,max){return min>=x?0:x>=max?1:(x=(x-min)/(max-min),x*x*(3-2*x))},smootherstep:function(x,min,max){return min>=x?0:x>=max?1:(x=(x-min)/(max-min),x*x*x*(x*(6*x-15)+10))},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(low,high){return low+Math.floor(Math.random()*(high-low+1))},randFloat:function(low,high){return low+Math.random()*(high-low)},randFloatSpread:function(range){return range*(.5-Math.random())},degToRad:function(){var degreeToRadiansFactor=Math.PI/180;return function(degrees){return degrees*degreeToRadiansFactor}}(),radToDeg:function(){var radianToDegreesFactor=180/Math.PI;return function(radians){return radians*radianToDegreesFactor}}(),isPowerOfTwo:function(value){return 0===(value&value-1)&&0!==value},nearestPowerOfTwo:function(value){return Math.pow(2,Math.round(Math.log(value)/Math.LN2))},nextPowerOfTwo:function(value){return value--,value|=value>>1,value|=value>>2,value|=value>>4,value|=value>>8,value|=value>>16,value++,value}},THREE.Spline=function(points){function interpolate(p0,p1,p2,p3,t,t2,t3){var v0=.5*(p2-p0),v1=.5*(p3-p1);return(2*(p1-p2)+v0+v1)*t3+(-3*(p1-p2)-2*v0-v1)*t2+v0*t+p1}this.points=points;var point,intPoint,weight,w2,w3,pa,pb,pc,pd,c=[],v3={x:0,y:0,z:0};this.initFromArray=function(a){this.points=[];for(var i=0;ithis.points.length-2?this.points.length-1:intPoint+1,c[3]=intPoint>this.points.length-3?this.points.length-1:intPoint+2,pa=this.points[c[0]],pb=this.points[c[1]],pc=this.points[c[2]],pd=this.points[c[3]],w2=weight*weight,w3=weight*w2,v3.x=interpolate(pa.x,pb.x,pc.x,pd.x,weight,w2,w3),v3.y=interpolate(pa.y,pb.y,pc.y,pd.y,weight,w2,w3),v3.z=interpolate(pa.z,pb.z,pc.z,pd.z,weight,w2,w3),v3},this.getControlPointsArray=function(){var i,p,l=this.points.length,coords=[];for(i=0;l>i;i++)p=this.points[i],coords[i]=[p.x,p.y,p.z];return coords},this.getLength=function(nSubDivisions){var i,index,nSamples,position,point=0,intPoint=0,oldIntPoint=0,oldPosition=new THREE.Vector3,tmpVec=new THREE.Vector3,chunkLengths=[],totalLength=0;for(chunkLengths[0]=0,nSubDivisions||(nSubDivisions=100),nSamples=this.points.length*nSubDivisions,oldPosition.copy(this.points[0]),i=1;nSamples>i;i++)index=i/nSamples,position=this.getPoint(index),tmpVec.copy(position),totalLength+=tmpVec.distanceTo(oldPosition),oldPosition.copy(position),point=(this.points.length-1)*index,intPoint=Math.floor(point),intPoint!==oldIntPoint&&(chunkLengths[intPoint]=totalLength,oldIntPoint=intPoint);return chunkLengths[chunkLengths.length]=totalLength,{chunks:chunkLengths,total:totalLength}},this.reparametrizeByArcLength=function(samplingCoef){var i,j,index,indexCurrent,indexNext,realDistance,sampling,position,newpoints=[],tmpVec=new THREE.Vector3,sl=this.getLength();for(newpoints.push(tmpVec.copy(this.points[0]).clone()),i=1;ij;j++)index=indexCurrent+j*(1/sampling)*(indexNext-indexCurrent),position=this.getPoint(index),newpoints.push(tmpVec.copy(position).clone());newpoints.push(tmpVec.copy(this.points[i]).clone())}this.points=newpoints}},THREE.Triangle=function(a,b,c){this.a=void 0!==a?a:new THREE.Vector3,this.b=void 0!==b?b:new THREE.Vector3,this.c=void 0!==c?c:new THREE.Vector3},THREE.Triangle.normal=function(){var v0=new THREE.Vector3;return function(a,b,c,optionalTarget){var result=optionalTarget||new THREE.Vector3;result.subVectors(c,b),v0.subVectors(a,b),result.cross(v0);var resultLengthSq=result.lengthSq();return resultLengthSq>0?result.multiplyScalar(1/Math.sqrt(resultLengthSq)):result.set(0,0,0)}}(),THREE.Triangle.barycoordFromPoint=function(){var v0=new THREE.Vector3,v1=new THREE.Vector3,v2=new THREE.Vector3;return function(point,a,b,c,optionalTarget){v0.subVectors(c,a),v1.subVectors(b,a),v2.subVectors(point,a);var dot00=v0.dot(v0),dot01=v0.dot(v1),dot02=v0.dot(v2),dot11=v1.dot(v1),dot12=v1.dot(v2),denom=dot00*dot11-dot01*dot01,result=optionalTarget||new THREE.Vector3;if(0===denom)return result.set(-2,-1,-1);var invDenom=1/denom,u=(dot11*dot02-dot01*dot12)*invDenom,v=(dot00*dot12-dot01*dot02)*invDenom;return result.set(1-u-v,v,u)}}(),THREE.Triangle.containsPoint=function(){var v1=new THREE.Vector3;return function(point,a,b,c){var result=THREE.Triangle.barycoordFromPoint(point,a,b,c,v1);return result.x>=0&&result.y>=0&&result.x+result.y<=1}}(),THREE.Triangle.prototype={constructor:THREE.Triangle,set:function(a,b,c){return this.a.copy(a),this.b.copy(b),this.c.copy(c),this},setFromPointsAndIndices:function(points,i0,i1,i2){return this.a.copy(points[i0]),this.b.copy(points[i1]),this.c.copy(points[i2]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(triangle){return this.a.copy(triangle.a),this.b.copy(triangle.b),this.c.copy(triangle.c),this},area:function(){var v0=new THREE.Vector3,v1=new THREE.Vector3;return function(){return v0.subVectors(this.c,this.b),v1.subVectors(this.a,this.b),.5*v0.cross(v1).length()}}(),midpoint:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(optionalTarget){return THREE.Triangle.normal(this.a,this.b,this.c,optionalTarget)},plane:function(optionalTarget){var result=optionalTarget||new THREE.Plane;return result.setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(point,optionalTarget){return THREE.Triangle.barycoordFromPoint(point,this.a,this.b,this.c,optionalTarget)},containsPoint:function(point){return THREE.Triangle.containsPoint(point,this.a,this.b,this.c)},equals:function(triangle){return triangle.a.equals(this.a)&&triangle.b.equals(this.b)&&triangle.c.equals(this.c)}},THREE.Channels=function(){this.mask=1},THREE.Channels.prototype={constructor:THREE.Channels,set:function(channel){this.mask=1<i;i++)array[i]=listenerArray[i];for(var i=0;length>i;i++)array[i].call(this,event)}}}},function(THREE){function descSort(a,b){return a.distance-b.distance}function intersectObject(object,raycaster,intersects,recursive){if(object.visible!==!1&&(object.raycast(raycaster,intersects),recursive===!0))for(var children=object.children,i=0,l=children.length;l>i;i++)intersectObject(children[i],raycaster,intersects,!0)}THREE.Raycaster=function(origin,direction,near,far){this.ray=new THREE.Ray(origin,direction),this.near=near||0,this.far=far||1/0,this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})},THREE.Raycaster.prototype={constructor:THREE.Raycaster,linePrecision:1,set:function(origin,direction){this.ray.set(origin,direction)},setFromCamera:function(coords,camera){camera instanceof THREE.PerspectiveCamera?(this.ray.origin.setFromMatrixPosition(camera.matrixWorld),this.ray.direction.set(coords.x,coords.y,.5).unproject(camera).sub(this.ray.origin).normalize()):camera instanceof THREE.OrthographicCamera?(this.ray.origin.set(coords.x,coords.y,-1).unproject(camera),this.ray.direction.set(0,0,-1).transformDirection(camera.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(object,recursive){var intersects=[];return intersectObject(object,this,intersects,recursive),intersects.sort(descSort),intersects},intersectObjects:function(objects,recursive){var intersects=[];if(Array.isArray(objects)===!1)return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),intersects;for(var i=0,l=objects.length;l>i;i++)intersectObject(objects[i],this,intersects,recursive);return intersects.sort(descSort),intersects}}}(THREE),THREE.Object3D=function(){function onRotationChange(){quaternion.setFromEuler(rotation,!1)}function onQuaternionChange(){rotation.setFromQuaternion(quaternion,void 0,!1)}Object.defineProperty(this,"id",{value:THREE.Object3DIdCount++}),this.uuid=THREE.Math.generateUUID(),this.name="",this.type="Object3D",this.parent=null,this.channels=new THREE.Channels,this.children=[],this.up=THREE.Object3D.DefaultUp.clone();var position=new THREE.Vector3,rotation=new THREE.Euler,quaternion=new THREE.Quaternion,scale=new THREE.Vector3(1,1,1);rotation.onChange(onRotationChange),quaternion.onChange(onQuaternionChange),Object.defineProperties(this,{position:{enumerable:!0,value:position},rotation:{enumerable:!0,value:rotation},quaternion:{enumerable:!0,value:quaternion},scale:{enumerable:!0,value:scale},modelViewMatrix:{value:new THREE.Matrix4},normalMatrix:{value:new THREE.Matrix3}}),this.rotationAutoUpdate=!0,this.matrix=new THREE.Matrix4,this.matrixWorld=new THREE.Matrix4,this.matrixAutoUpdate=THREE.Object3D.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.userData={}},THREE.Object3D.DefaultUp=new THREE.Vector3(0,1,0),THREE.Object3D.DefaultMatrixAutoUpdate=!0,THREE.Object3D.prototype={constructor:THREE.Object3D,get eulerOrder(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set eulerOrder(value){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=value},get useQuaternion(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set useQuaternion(value){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set renderDepth(value){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},applyMatrix:function(matrix){this.matrix.multiplyMatrices(matrix,this.matrix),this.matrix.decompose(this.position,this.quaternion,this.scale)},setRotationFromAxisAngle:function(axis,angle){this.quaternion.setFromAxisAngle(axis,angle)},setRotationFromEuler:function(euler){this.quaternion.setFromEuler(euler,!0)},setRotationFromMatrix:function(m){this.quaternion.setFromRotationMatrix(m)},setRotationFromQuaternion:function(q){this.quaternion.copy(q)},rotateOnAxis:function(){var q1=new THREE.Quaternion;return function(axis,angle){return q1.setFromAxisAngle(axis,angle),this.quaternion.multiply(q1),this}}(),rotateX:function(){var v1=new THREE.Vector3(1,0,0);return function(angle){return this.rotateOnAxis(v1,angle)}}(),rotateY:function(){var v1=new THREE.Vector3(0,1,0);return function(angle){return this.rotateOnAxis(v1,angle)}}(),rotateZ:function(){var v1=new THREE.Vector3(0,0,1);return function(angle){return this.rotateOnAxis(v1,angle)}}(),translateOnAxis:function(){var v1=new THREE.Vector3;return function(axis,distance){return v1.copy(axis).applyQuaternion(this.quaternion),this.position.add(v1.multiplyScalar(distance)),this}}(),translate:function(distance,axis){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(axis,distance)},translateX:function(){var v1=new THREE.Vector3(1,0,0);return function(distance){return this.translateOnAxis(v1,distance)}}(),translateY:function(){var v1=new THREE.Vector3(0,1,0);return function(distance){return this.translateOnAxis(v1,distance)}}(),translateZ:function(){var v1=new THREE.Vector3(0,0,1);return function(distance){return this.translateOnAxis(v1,distance)}}(),localToWorld:function(vector){return vector.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var m1=new THREE.Matrix4;return function(vector){return vector.applyMatrix4(m1.getInverse(this.matrixWorld))}}(),lookAt:function(){var m1=new THREE.Matrix4;return function(vector){m1.lookAt(vector,this.position,this.up),this.quaternion.setFromRotationMatrix(m1)}}(),add:function(object){if(arguments.length>1){for(var i=0;i1)for(var i=0;ii;i++){var child=this.children[i],object=child.getObjectByProperty(name,value);if(void 0!==object)return object}},getWorldPosition:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return this.updateMatrixWorld(!0),result.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var position=new THREE.Vector3,scale=new THREE.Vector3;return function(optionalTarget){var result=optionalTarget||new THREE.Quaternion;return this.updateMatrixWorld(!0),this.matrixWorld.decompose(position,result,scale),result}}(),getWorldRotation:function(){var quaternion=new THREE.Quaternion;return function(optionalTarget){var result=optionalTarget||new THREE.Euler;return this.getWorldQuaternion(quaternion),result.setFromQuaternion(quaternion,this.rotation.order,!1)}}(),getWorldScale:function(){var position=new THREE.Vector3,quaternion=new THREE.Quaternion;return function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return this.updateMatrixWorld(!0),this.matrixWorld.decompose(position,quaternion,result),result}}(),getWorldDirection:function(){var quaternion=new THREE.Quaternion;return function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return this.getWorldQuaternion(quaternion),result.set(0,0,1).applyQuaternion(quaternion)}}(),raycast:function(){},traverse:function(callback){callback(this);for(var children=this.children,i=0,l=children.length;l>i;i++)children[i].traverse(callback)},traverseVisible:function(callback){if(this.visible!==!1){callback(this);for(var children=this.children,i=0,l=children.length;l>i;i++)children[i].traverseVisible(callback)}},traverseAncestors:function(callback){var parent=this.parent;null!==parent&&(callback(parent),parent.traverseAncestors(callback))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(force){this.matrixAutoUpdate===!0&&this.updateMatrix(),this.matrixWorldNeedsUpdate!==!0&&force!==!0||(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,force=!0);for(var i=0,l=this.children.length;l>i;i++)this.children[i].updateMatrixWorld(force)},toJSON:function(meta){function extractFromCache(cache){var values=[];for(var key in cache){var data=cache[key];delete data.metadata,values.push(data)}return values}var isRootObject=void 0===meta,output={};isRootObject&&(meta={geometries:{},materials:{},textures:{},images:{}},output.metadata={version:4.4,type:"Object",generator:"Object3D.toJSON"});var object={};if(object.uuid=this.uuid,object.type=this.type,""!==this.name&&(object.name=this.name),"{}"!==JSON.stringify(this.userData)&&(object.userData=this.userData),this.castShadow===!0&&(object.castShadow=!0),this.receiveShadow===!0&&(object.receiveShadow=!0),this.visible===!1&&(object.visible=!1),object.matrix=this.matrix.toArray(),void 0!==this.geometry&&(void 0===meta.geometries[this.geometry.uuid]&&(meta.geometries[this.geometry.uuid]=this.geometry.toJSON(meta)),object.geometry=this.geometry.uuid),void 0!==this.material&&(void 0===meta.materials[this.material.uuid]&&(meta.materials[this.material.uuid]=this.material.toJSON(meta)),object.material=this.material.uuid),this.children.length>0){object.children=[];for(var i=0;i0&&(output.geometries=geometries),materials.length>0&&(output.materials=materials),textures.length>0&&(output.textures=textures),images.length>0&&(output.images=images)}return output.object=object,output},clone:function(recursive){return(new this.constructor).copy(this,recursive)},copy:function(source,recursive){if(void 0===recursive&&(recursive=!0),this.name=source.name,this.up.copy(source.up),this.position.copy(source.position),this.quaternion.copy(source.quaternion),this.scale.copy(source.scale),this.rotationAutoUpdate=source.rotationAutoUpdate,this.matrix.copy(source.matrix),this.matrixWorld.copy(source.matrixWorld),this.matrixAutoUpdate=source.matrixAutoUpdate,this.matrixWorldNeedsUpdate=source.matrixWorldNeedsUpdate,this.visible=source.visible,this.castShadow=source.castShadow,this.receiveShadow=source.receiveShadow,this.frustumCulled=source.frustumCulled,this.renderOrder=source.renderOrder,this.userData=JSON.parse(JSON.stringify(source.userData)),recursive===!0)for(var i=0;ii;i++)this.vertexNormals[i]=source.vertexNormals[i].clone();for(var i=0,il=source.vertexColors.length;il>i;i++)this.vertexColors[i]=source.vertexColors[i].clone();return this}},THREE.Face4=function(a,b,c,d,normal,color,materialIndex){return console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead."),new THREE.Face3(a,b,c,normal,color,materialIndex)},THREE.BufferAttribute=function(array,itemSize){this.uuid=THREE.Math.generateUUID(),this.array=array,this.itemSize=itemSize,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.version=0},THREE.BufferAttribute.prototype={constructor:THREE.BufferAttribute,get length(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count."),this.array.length},get count(){return this.array.length/this.itemSize},set needsUpdate(value){value===!0&&this.version++},setDynamic:function(value){return this.dynamic=value,this},copy:function(source){return this.array=new source.array.constructor(source.array),this.itemSize=source.itemSize,this.dynamic=source.dynamic,this},copyAt:function(index1,attribute,index2){index1*=this.itemSize,index2*=attribute.itemSize;for(var i=0,l=this.itemSize;l>i;i++)this.array[index1+i]=attribute.array[index2+i];return this},copyArray:function(array){return this.array.set(array),this},copyColorsArray:function(colors){for(var array=this.array,offset=0,i=0,l=colors.length;l>i;i++){var color=colors[i];void 0===color&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",i),color=new THREE.Color),array[offset++]=color.r,array[offset++]=color.g,array[offset++]=color.b}return this},copyIndicesArray:function(indices){for(var array=this.array,offset=0,i=0,l=indices.length;l>i;i++){var index=indices[i];array[offset++]=index.a,array[offset++]=index.b,array[offset++]=index.c}return this},copyVector2sArray:function(vectors){for(var array=this.array,offset=0,i=0,l=vectors.length;l>i;i++){var vector=vectors[i];void 0===vector&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",i),vector=new THREE.Vector2),array[offset++]=vector.x,array[offset++]=vector.y}return this},copyVector3sArray:function(vectors){for(var array=this.array,offset=0,i=0,l=vectors.length;l>i;i++){var vector=vectors[i];void 0===vector&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",i),vector=new THREE.Vector3),array[offset++]=vector.x,array[offset++]=vector.y,array[offset++]=vector.z}return this},copyVector4sArray:function(vectors){for(var array=this.array,offset=0,i=0,l=vectors.length;l>i;i++){var vector=vectors[i];void 0===vector&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",i),vector=new THREE.Vector4),array[offset++]=vector.x,array[offset++]=vector.y,array[offset++]=vector.z,array[offset++]=vector.w}return this},set:function(value,offset){return void 0===offset&&(offset=0),this.array.set(value,offset),this},getX:function(index){return this.array[index*this.itemSize]},setX:function(index,x){return this.array[index*this.itemSize]=x,this},getY:function(index){return this.array[index*this.itemSize+1]},setY:function(index,y){return this.array[index*this.itemSize+1]=y,this},getZ:function(index){return this.array[index*this.itemSize+2]},setZ:function(index,z){return this.array[index*this.itemSize+2]=z,this},getW:function(index){return this.array[index*this.itemSize+3]},setW:function(index,w){return this.array[index*this.itemSize+3]=w,this},setXY:function(index,x,y){return index*=this.itemSize,this.array[index+0]=x,this.array[index+1]=y,this},setXYZ:function(index,x,y,z){return index*=this.itemSize,this.array[index+0]=x,this.array[index+1]=y,this.array[index+2]=z,this},setXYZW:function(index,x,y,z,w){return index*=this.itemSize,this.array[index+0]=x,this.array[index+1]=y,this.array[index+2]=z,this.array[index+3]=w,this},clone:function(){return(new this.constructor).copy(this)}},THREE.Int8Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Int8Array(array),itemSize)},THREE.Uint8Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Uint8Array(array),itemSize)},THREE.Uint8ClampedAttribute=function(array,itemSize){return new THREE.BufferAttribute(new Uint8ClampedArray(array),itemSize)},THREE.Int16Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Int16Array(array),itemSize)},THREE.Uint16Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Uint16Array(array),itemSize)},THREE.Int32Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Int32Array(array),itemSize)},THREE.Uint32Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Uint32Array(array),itemSize)},THREE.Float32Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Float32Array(array),itemSize)},THREE.Float64Attribute=function(array,itemSize){return new THREE.BufferAttribute(new Float64Array(array),itemSize)},THREE.DynamicBufferAttribute=function(array,itemSize){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead."),new THREE.BufferAttribute(array,itemSize).setDynamic(!0)},THREE.InstancedBufferAttribute=function(array,itemSize,meshPerAttribute){THREE.BufferAttribute.call(this,array,itemSize),this.meshPerAttribute=meshPerAttribute||1},THREE.InstancedBufferAttribute.prototype=Object.create(THREE.BufferAttribute.prototype),THREE.InstancedBufferAttribute.prototype.constructor=THREE.InstancedBufferAttribute,THREE.InstancedBufferAttribute.prototype.copy=function(source){return THREE.BufferAttribute.prototype.copy.call(this,source),this.meshPerAttribute=source.meshPerAttribute,this},THREE.InterleavedBuffer=function(array,stride){this.uuid=THREE.Math.generateUUID(),this.array=array,this.stride=stride,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.version=0},THREE.InterleavedBuffer.prototype={constructor:THREE.InterleavedBuffer,get length(){return this.array.length},get count(){return this.array.length/this.stride},set needsUpdate(value){value===!0&&this.version++},setDynamic:function(value){return this.dynamic=value,this},copy:function(source){this.array=new source.array.constructor(source.array),this.stride=source.stride,this.dynamic=source.dynamic},copyAt:function(index1,attribute,index2){index1*=this.stride,index2*=attribute.stride;for(var i=0,l=this.stride;l>i;i++)this.array[index1+i]=attribute.array[index2+i];return this},set:function(value,offset){return void 0===offset&&(offset=0),this.array.set(value,offset),this},clone:function(){return(new this.constructor).copy(this)}},THREE.InstancedInterleavedBuffer=function(array,stride,meshPerAttribute){THREE.InterleavedBuffer.call(this,array,stride),this.meshPerAttribute=meshPerAttribute||1},THREE.InstancedInterleavedBuffer.prototype=Object.create(THREE.InterleavedBuffer.prototype),THREE.InstancedInterleavedBuffer.prototype.constructor=THREE.InstancedInterleavedBuffer,THREE.InstancedInterleavedBuffer.prototype.copy=function(source){return THREE.InterleavedBuffer.prototype.copy.call(this,source),this.meshPerAttribute=source.meshPerAttribute,this},THREE.InterleavedBufferAttribute=function(interleavedBuffer,itemSize,offset){this.uuid=THREE.Math.generateUUID(),this.data=interleavedBuffer,this.itemSize=itemSize,this.offset=offset},THREE.InterleavedBufferAttribute.prototype={constructor:THREE.InterleavedBufferAttribute,get length(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count."),this.array.length},get count(){return this.data.array.length/this.data.stride},setX:function(index,x){return this.data.array[index*this.data.stride+this.offset]=x,this},setY:function(index,y){return this.data.array[index*this.data.stride+this.offset+1]=y,this},setZ:function(index,z){return this.data.array[index*this.data.stride+this.offset+2]=z,this},setW:function(index,w){return this.data.array[index*this.data.stride+this.offset+3]=w,this},getX:function(index){return this.data.array[index*this.data.stride+this.offset]},getY:function(index){return this.data.array[index*this.data.stride+this.offset+1]},getZ:function(index){return this.data.array[index*this.data.stride+this.offset+2]},getW:function(index){return this.data.array[index*this.data.stride+this.offset+3]},setXY:function(index,x,y){return index=index*this.data.stride+this.offset,this.data.array[index+0]=x,this.data.array[index+1]=y,this},setXYZ:function(index,x,y,z){return index=index*this.data.stride+this.offset,this.data.array[index+0]=x,this.data.array[index+1]=y,this.data.array[index+2]=z,this},setXYZW:function(index,x,y,z,w){return index=index*this.data.stride+this.offset,this.data.array[index+0]=x,this.data.array[index+1]=y,this.data.array[index+2]=z,this.data.array[index+3]=w,this}},THREE.Geometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++}),this.uuid=THREE.Math.generateUUID(),this.name="",this.type="Geometry",this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.verticesNeedUpdate=!1,this.elementsNeedUpdate=!1,this.uvsNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.lineDistancesNeedUpdate=!1,this.groupsNeedUpdate=!1},THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(matrix){for(var normalMatrix=(new THREE.Matrix3).getNormalMatrix(matrix),i=0,il=this.vertices.length;il>i;i++){var vertex=this.vertices[i];vertex.applyMatrix4(matrix)}for(var i=0,il=this.faces.length;il>i;i++){var face=this.faces[i];face.normal.applyMatrix3(normalMatrix).normalize();for(var j=0,jl=face.vertexNormals.length;jl>j;j++)face.vertexNormals[j].applyMatrix3(normalMatrix).normalize(); +}null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this.verticesNeedUpdate=!0,this.normalsNeedUpdate=!0},rotateX:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationX(angle),this.applyMatrix(m1),this}}(),rotateY:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationY(angle),this.applyMatrix(m1),this}}(),rotateZ:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationZ(angle),this.applyMatrix(m1),this}}(),translate:function(){var m1;return function(x,y,z){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeTranslation(x,y,z),this.applyMatrix(m1),this}}(),scale:function(){var m1;return function(x,y,z){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeScale(x,y,z),this.applyMatrix(m1),this}}(),lookAt:function(){var obj;return function(vector){void 0===obj&&(obj=new THREE.Object3D),obj.lookAt(vector),obj.updateMatrix(),this.applyMatrix(obj.matrix)}}(),fromBufferGeometry:function(geometry){function addFace(a,b,c){var vertexNormals=void 0!==normals?[tempNormals[a].clone(),tempNormals[b].clone(),tempNormals[c].clone()]:[],vertexColors=void 0!==colors?[scope.colors[a].clone(),scope.colors[b].clone(),scope.colors[c].clone()]:[],face=new THREE.Face3(a,b,c,vertexNormals,vertexColors);scope.faces.push(face),void 0!==uvs&&scope.faceVertexUvs[0].push([tempUVs[a].clone(),tempUVs[b].clone(),tempUVs[c].clone()]),void 0!==uvs2&&scope.faceVertexUvs[1].push([tempUVs2[a].clone(),tempUVs2[b].clone(),tempUVs2[c].clone()])}var scope=this,indices=null!==geometry.index?geometry.index.array:void 0,attributes=geometry.attributes,vertices=attributes.position.array,normals=void 0!==attributes.normal?attributes.normal.array:void 0,colors=void 0!==attributes.color?attributes.color.array:void 0,uvs=void 0!==attributes.uv?attributes.uv.array:void 0,uvs2=void 0!==attributes.uv2?attributes.uv2.array:void 0;void 0!==uvs2&&(this.faceVertexUvs[1]=[]);for(var tempNormals=[],tempUVs=[],tempUVs2=[],i=0,j=0,k=0;i0)for(var i=0;ij;j+=3)addFace(indices[j],indices[j+1],indices[j+2]);else for(var i=0;if;f++){var face=this.faces[f],vA=this.vertices[face.a],vB=this.vertices[face.b],vC=this.vertices[face.c];cb.subVectors(vC,vB),ab.subVectors(vA,vB),cb.cross(ab),cb.normalize(),face.normal.copy(cb)}},computeVertexNormals:function(areaWeighted){var v,vl,f,fl,face,vertices;for(vertices=new Array(this.vertices.length),v=0,vl=this.vertices.length;vl>v;v++)vertices[v]=new THREE.Vector3;if(areaWeighted){var vA,vB,vC,cb=new THREE.Vector3,ab=new THREE.Vector3;for(f=0,fl=this.faces.length;fl>f;f++)face=this.faces[f],vA=this.vertices[face.a],vB=this.vertices[face.b],vC=this.vertices[face.c],cb.subVectors(vC,vB),ab.subVectors(vA,vB),cb.cross(ab),vertices[face.a].add(cb),vertices[face.b].add(cb),vertices[face.c].add(cb)}else for(f=0,fl=this.faces.length;fl>f;f++)face=this.faces[f],vertices[face.a].add(face.normal),vertices[face.b].add(face.normal),vertices[face.c].add(face.normal);for(v=0,vl=this.vertices.length;vl>v;v++)vertices[v].normalize();for(f=0,fl=this.faces.length;fl>f;f++){face=this.faces[f];var vertexNormals=face.vertexNormals;3===vertexNormals.length?(vertexNormals[0].copy(vertices[face.a]),vertexNormals[1].copy(vertices[face.b]),vertexNormals[2].copy(vertices[face.c])):(vertexNormals[0]=vertices[face.a].clone(),vertexNormals[1]=vertices[face.b].clone(),vertexNormals[2]=vertices[face.c].clone())}},computeMorphNormals:function(){var i,il,f,fl,face;for(f=0,fl=this.faces.length;fl>f;f++)for(face=this.faces[f],face.__originalFaceNormal?face.__originalFaceNormal.copy(face.normal):face.__originalFaceNormal=face.normal.clone(),face.__originalVertexNormals||(face.__originalVertexNormals=[]),i=0,il=face.vertexNormals.length;il>i;i++)face.__originalVertexNormals[i]?face.__originalVertexNormals[i].copy(face.vertexNormals[i]):face.__originalVertexNormals[i]=face.vertexNormals[i].clone();var tmpGeo=new THREE.Geometry;for(tmpGeo.faces=this.faces,i=0,il=this.morphTargets.length;il>i;i++){if(!this.morphNormals[i]){this.morphNormals[i]={},this.morphNormals[i].faceNormals=[],this.morphNormals[i].vertexNormals=[];var faceNormal,vertexNormals,dstNormalsFace=this.morphNormals[i].faceNormals,dstNormalsVertex=this.morphNormals[i].vertexNormals;for(f=0,fl=this.faces.length;fl>f;f++)faceNormal=new THREE.Vector3,vertexNormals={a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3},dstNormalsFace.push(faceNormal),dstNormalsVertex.push(vertexNormals)}var morphNormals=this.morphNormals[i];tmpGeo.vertices=this.morphTargets[i].vertices,tmpGeo.computeFaceNormals(),tmpGeo.computeVertexNormals();var faceNormal,vertexNormals;for(f=0,fl=this.faces.length;fl>f;f++)face=this.faces[f],faceNormal=morphNormals.faceNormals[f],vertexNormals=morphNormals.vertexNormals[f],faceNormal.copy(face.normal),vertexNormals.a.copy(face.vertexNormals[0]),vertexNormals.b.copy(face.vertexNormals[1]),vertexNormals.c.copy(face.vertexNormals[2])}for(f=0,fl=this.faces.length;fl>f;f++)face=this.faces[f],face.normal=face.__originalFaceNormal,face.vertexNormals=face.__originalVertexNormals},computeTangents:function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){for(var d=0,vertices=this.vertices,i=0,il=vertices.length;il>i;i++)i>0&&(d+=vertices[i].distanceTo(vertices[i-1])),this.lineDistances[i]=d},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3),this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere),this.boundingSphere.setFromPoints(this.vertices)},merge:function(geometry,matrix,materialIndexOffset){if(geometry instanceof THREE.Geometry==!1)return void console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",geometry);var normalMatrix,vertexOffset=this.vertices.length,vertices1=this.vertices,vertices2=geometry.vertices,faces1=this.faces,faces2=geometry.faces,uvs1=this.faceVertexUvs[0],uvs2=geometry.faceVertexUvs[0];void 0===materialIndexOffset&&(materialIndexOffset=0),void 0!==matrix&&(normalMatrix=(new THREE.Matrix3).getNormalMatrix(matrix));for(var i=0,il=vertices2.length;il>i;i++){var vertex=vertices2[i],vertexCopy=vertex.clone();void 0!==matrix&&vertexCopy.applyMatrix4(matrix),vertices1.push(vertexCopy)}for(i=0,il=faces2.length;il>i;i++){var faceCopy,normal,color,face=faces2[i],faceVertexNormals=face.vertexNormals,faceVertexColors=face.vertexColors;faceCopy=new THREE.Face3(face.a+vertexOffset,face.b+vertexOffset,face.c+vertexOffset),faceCopy.normal.copy(face.normal),void 0!==normalMatrix&&faceCopy.normal.applyMatrix3(normalMatrix).normalize();for(var j=0,jl=faceVertexNormals.length;jl>j;j++)normal=faceVertexNormals[j].clone(),void 0!==normalMatrix&&normal.applyMatrix3(normalMatrix).normalize(),faceCopy.vertexNormals.push(normal);faceCopy.color.copy(face.color);for(var j=0,jl=faceVertexColors.length;jl>j;j++)color=faceVertexColors[j],faceCopy.vertexColors.push(color.clone());faceCopy.materialIndex=face.materialIndex+materialIndexOffset,faces1.push(faceCopy)}for(i=0,il=uvs2.length;il>i;i++){var uv=uvs2[i],uvCopy=[];if(void 0!==uv){for(var j=0,jl=uv.length;jl>j;j++)uvCopy.push(uv[j].clone());uvs1.push(uvCopy)}}},mergeMesh:function(mesh){return mesh instanceof THREE.Mesh==!1?void console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",mesh):(mesh.matrixAutoUpdate&&mesh.updateMatrix(),void this.merge(mesh.geometry,mesh.matrix))},mergeVertices:function(){var v,key,i,il,face,indices,j,jl,verticesMap={},unique=[],changes=[],precisionPoints=4,precision=Math.pow(10,precisionPoints);for(i=0,il=this.vertices.length;il>i;i++)v=this.vertices[i],key=Math.round(v.x*precision)+"_"+Math.round(v.y*precision)+"_"+Math.round(v.z*precision),void 0===verticesMap[key]?(verticesMap[key]=i,unique.push(this.vertices[i]),changes[i]=unique.length-1):changes[i]=changes[verticesMap[key]];var faceIndicesToRemove=[];for(i=0,il=this.faces.length;il>i;i++){face=this.faces[i],face.a=changes[face.a],face.b=changes[face.b],face.c=changes[face.c],indices=[face.a,face.b,face.c];for(var dupIndex=-1,n=0;3>n;n++)if(indices[n]===indices[(n+1)%3]){dupIndex=n,faceIndicesToRemove.push(i);break}}for(i=faceIndicesToRemove.length-1;i>=0;i--){var idx=faceIndicesToRemove[i];for(this.faces.splice(idx,1),j=0,jl=this.faceVertexUvs.length;jl>j;j++)this.faceVertexUvs[j].splice(idx,1)}var diff=this.vertices.length-unique.length;return this.vertices=unique,diff},sortFacesByMaterialIndex:function(){function materialIndexSort(a,b){return a.materialIndex-b.materialIndex}for(var faces=this.faces,length=faces.length,i=0;length>i;i++)faces[i]._id=i;faces.sort(materialIndexSort);var newUvs1,newUvs2,uvs1=this.faceVertexUvs[0],uvs2=this.faceVertexUvs[1];uvs1&&uvs1.length===length&&(newUvs1=[]),uvs2&&uvs2.length===length&&(newUvs2=[]);for(var i=0;length>i;i++){var id=faces[i]._id;newUvs1&&newUvs1.push(uvs1[id]),newUvs2&&newUvs2.push(uvs2[id])}newUvs1&&(this.faceVertexUvs[0]=newUvs1),newUvs2&&(this.faceVertexUvs[1]=newUvs2)},toJSON:function(){function setBit(value,position,enabled){return enabled?value|1<0,hasFaceVertexNormal=face.vertexNormals.length>0,hasFaceColor=1!==face.color.r||1!==face.color.g||1!==face.color.b,hasFaceVertexColor=face.vertexColors.length>0,faceType=0;if(faceType=setBit(faceType,0,0),faceType=setBit(faceType,1,hasMaterial),faceType=setBit(faceType,2,hasFaceUv),faceType=setBit(faceType,3,hasFaceVertexUv),faceType=setBit(faceType,4,hasFaceNormal),faceType=setBit(faceType,5,hasFaceVertexNormal),faceType=setBit(faceType,6,hasFaceColor),faceType=setBit(faceType,7,hasFaceVertexColor),faces.push(faceType),faces.push(face.a,face.b,face.c),hasFaceVertexUv){var faceVertexUvs=this.faceVertexUvs[0][i];faces.push(getUvIndex(faceVertexUvs[0]),getUvIndex(faceVertexUvs[1]),getUvIndex(faceVertexUvs[2]))}if(hasFaceNormal&&faces.push(getNormalIndex(face.normal)),hasFaceVertexNormal){var vertexNormals=face.vertexNormals;faces.push(getNormalIndex(vertexNormals[0]),getNormalIndex(vertexNormals[1]),getNormalIndex(vertexNormals[2]))}if(hasFaceColor&&faces.push(getColorIndex(face.color)),hasFaceVertexColor){var vertexColors=face.vertexColors;faces.push(getColorIndex(vertexColors[0]),getColorIndex(vertexColors[1]),getColorIndex(vertexColors[2]))}}return data.data={},data.data.vertices=vertices,data.data.normals=normals,colors.length>0&&(data.data.colors=colors),uvs.length>0&&(data.data.uvs=[uvs]),data.data.faces=faces,data},clone:function(){return(new this.constructor).copy(this)},copy:function(source){this.vertices=[],this.faces=[],this.faceVertexUvs=[[]];for(var vertices=source.vertices,i=0,il=vertices.length;il>i;i++)this.vertices.push(vertices[i].clone());for(var faces=source.faces,i=0,il=faces.length;il>i;i++)this.faces.push(faces[i].clone());for(var i=0,il=source.faceVertexUvs.length;il>i;i++){var faceVertexUvs=source.faceVertexUvs[i];void 0===this.faceVertexUvs[i]&&(this.faceVertexUvs[i]=[]);for(var j=0,jl=faceVertexUvs.length;jl>j;j++){for(var uvs=faceVertexUvs[j],uvsCopy=[],k=0,kl=uvs.length;kl>k;k++){var uv=uvs[k];uvsCopy.push(uv.clone())}this.faceVertexUvs[i].push(uvsCopy)}}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}},THREE.EventDispatcher.prototype.apply(THREE.Geometry.prototype),THREE.GeometryIdCount=0,THREE.DirectGeometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++}),this.uuid=THREE.Math.generateUUID(),this.name="",this.type="DirectGeometry",this.indices=[],this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.uvs2=[],this.groups=[],this.morphTargets={},this.skinWeights=[],this.skinIndices=[],this.boundingBox=null,this.boundingSphere=null,this.verticesNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.uvsNeedUpdate=!1,this.groupsNeedUpdate=!1},THREE.DirectGeometry.prototype={constructor:THREE.DirectGeometry,computeBoundingBox:THREE.Geometry.prototype.computeBoundingBox,computeBoundingSphere:THREE.Geometry.prototype.computeBoundingSphere,computeFaceNormals:function(){console.warn("THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.")},computeVertexNormals:function(){console.warn("THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.")},computeGroups:function(geometry){for(var group,materialIndex,groups=[],faces=geometry.faces,i=0;i0,hasFaceVertexUv2=faceVertexUvs[1]&&faceVertexUvs[1].length>0,morphTargets=geometry.morphTargets,morphTargetsLength=morphTargets.length;if(morphTargetsLength>0){for(var morphTargetsPosition=[],i=0;morphTargetsLength>i;i++)morphTargetsPosition[i]=[];this.morphTargets.position=morphTargetsPosition}var morphNormals=geometry.morphNormals,morphNormalsLength=morphNormals.length;if(morphNormalsLength>0){for(var morphTargetsNormal=[],i=0;morphNormalsLength>i;i++)morphTargetsNormal[i]=[];this.morphTargets.normal=morphTargetsNormal}for(var skinIndices=geometry.skinIndices,skinWeights=geometry.skinWeights,hasSkinIndices=skinIndices.length===vertices.length,hasSkinWeights=skinWeights.length===vertices.length,i=0;ij;j++){var morphTarget=morphTargets[j].vertices;morphTargetsPosition[j].push(morphTarget[face.a],morphTarget[face.b],morphTarget[face.c])}for(var j=0;morphNormalsLength>j;j++){var morphNormal=morphNormals[j].vertexNormals[i];morphTargetsNormal[j].push(morphNormal.a,morphNormal.b,morphNormal.c)}hasSkinIndices&&this.skinIndices.push(skinIndices[face.a],skinIndices[face.b],skinIndices[face.c]),hasSkinWeights&&this.skinWeights.push(skinWeights[face.a],skinWeights[face.b],skinWeights[face.c])}return this.computeGroups(geometry),this.verticesNeedUpdate=geometry.verticesNeedUpdate,this.normalsNeedUpdate=geometry.normalsNeedUpdate,this.colorsNeedUpdate=geometry.colorsNeedUpdate,this.uvsNeedUpdate=geometry.uvsNeedUpdate,this.groupsNeedUpdate=geometry.groupsNeedUpdate,this},dispose:function(){this.dispatchEvent({type:"dispose"})}},THREE.EventDispatcher.prototype.apply(THREE.DirectGeometry.prototype),THREE.BufferGeometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++}),this.uuid=THREE.Math.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0}},THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,addIndex:function(index){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(index)},getIndex:function(){return this.index},setIndex:function(index){this.index=index},addAttribute:function(name,attribute){return attribute instanceof THREE.BufferAttribute==!1&&attribute instanceof THREE.InterleavedBufferAttribute==!1?(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),void this.addAttribute(name,new THREE.BufferAttribute(arguments[1],arguments[2]))):"index"===name?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),void this.setIndex(attribute)):void(this.attributes[name]=attribute)},getAttribute:function(name){return this.attributes[name]},removeAttribute:function(name){delete this.attributes[name]},get drawcalls(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups},get offsets(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups},addDrawCall:function(start,count,indexOffset){void 0!==indexOffset&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(start,count)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},addGroup:function(start,count,materialIndex){this.groups.push({start:start,count:count,materialIndex:void 0!==materialIndex?materialIndex:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(start,count){this.drawRange.start=start,this.drawRange.count=count},applyMatrix:function(matrix){var position=this.attributes.position;void 0!==position&&(matrix.applyToVector3Array(position.array),position.needsUpdate=!0);var normal=this.attributes.normal;if(void 0!==normal){var normalMatrix=(new THREE.Matrix3).getNormalMatrix(matrix);normalMatrix.applyToVector3Array(normal.array),normal.needsUpdate=!0}null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere()},rotateX:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationX(angle),this.applyMatrix(m1),this}}(),rotateY:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationY(angle),this.applyMatrix(m1),this}}(),rotateZ:function(){var m1;return function(angle){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeRotationZ(angle),this.applyMatrix(m1),this}}(),translate:function(){var m1;return function(x,y,z){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeTranslation(x,y,z),this.applyMatrix(m1),this}}(),scale:function(){var m1;return function(x,y,z){return void 0===m1&&(m1=new THREE.Matrix4),m1.makeScale(x,y,z),this.applyMatrix(m1),this}}(),lookAt:function(){var obj;return function(vector){void 0===obj&&(obj=new THREE.Object3D),obj.lookAt(vector),obj.updateMatrix(),this.applyMatrix(obj.matrix)}}(),center:function(){this.computeBoundingBox();var offset=this.boundingBox.center().negate();return this.translate(offset.x,offset.y,offset.z),offset},setFromObject:function(object){var geometry=object.geometry;if(object instanceof THREE.Points||object instanceof THREE.Line){var positions=new THREE.Float32Attribute(3*geometry.vertices.length,3),colors=new THREE.Float32Attribute(3*geometry.colors.length,3);if(this.addAttribute("position",positions.copyVector3sArray(geometry.vertices)),this.addAttribute("color",colors.copyColorsArray(geometry.colors)),geometry.lineDistances&&geometry.lineDistances.length===geometry.vertices.length){var lineDistances=new THREE.Float32Attribute(geometry.lineDistances.length,1);this.addAttribute("lineDistance",lineDistances.copyArray(geometry.lineDistances))}null!==geometry.boundingSphere&&(this.boundingSphere=geometry.boundingSphere.clone()),null!==geometry.boundingBox&&(this.boundingBox=geometry.boundingBox.clone())}else object instanceof THREE.Mesh&&geometry instanceof THREE.Geometry&&this.fromGeometry(geometry);return this},updateFromObject:function(object){var geometry=object.geometry;if(object instanceof THREE.Mesh){var direct=geometry.__directGeometry;if(void 0===direct)return this.fromGeometry(geometry);direct.verticesNeedUpdate=geometry.verticesNeedUpdate,direct.normalsNeedUpdate=geometry.normalsNeedUpdate,direct.colorsNeedUpdate=geometry.colorsNeedUpdate,direct.uvsNeedUpdate=geometry.uvsNeedUpdate,direct.groupsNeedUpdate=geometry.groupsNeedUpdate,geometry.verticesNeedUpdate=!1,geometry.normalsNeedUpdate=!1,geometry.colorsNeedUpdate=!1,geometry.uvsNeedUpdate=!1,geometry.groupsNeedUpdate=!1,geometry=direct}if(geometry.verticesNeedUpdate===!0){var attribute=this.attributes.position;void 0!==attribute&&(attribute.copyVector3sArray(geometry.vertices),attribute.needsUpdate=!0),geometry.verticesNeedUpdate=!1}if(geometry.normalsNeedUpdate===!0){var attribute=this.attributes.normal;void 0!==attribute&&(attribute.copyVector3sArray(geometry.normals),attribute.needsUpdate=!0),geometry.normalsNeedUpdate=!1}if(geometry.colorsNeedUpdate===!0){var attribute=this.attributes.color;void 0!==attribute&&(attribute.copyColorsArray(geometry.colors),attribute.needsUpdate=!0),geometry.colorsNeedUpdate=!1}if(geometry.uvsNeedUpdate){var attribute=this.attributes.uv;void 0!==attribute&&(attribute.copyVector2sArray(geometry.uvs),attribute.needsUpdate=!0),geometry.uvsNeedUpdate=!1}if(geometry.lineDistancesNeedUpdate){var attribute=this.attributes.lineDistance;void 0!==attribute&&(attribute.copyArray(geometry.lineDistances),attribute.needsUpdate=!0),geometry.lineDistancesNeedUpdate=!1}return geometry.groupsNeedUpdate&&(geometry.computeGroups(object.geometry),this.groups=geometry.groups,geometry.groupsNeedUpdate=!1),this},fromGeometry:function(geometry){return geometry.__directGeometry=(new THREE.DirectGeometry).fromGeometry(geometry),this.fromDirectGeometry(geometry.__directGeometry)},fromDirectGeometry:function(geometry){var positions=new Float32Array(3*geometry.vertices.length);if(this.addAttribute("position",new THREE.BufferAttribute(positions,3).copyVector3sArray(geometry.vertices)),geometry.normals.length>0){var normals=new Float32Array(3*geometry.normals.length);this.addAttribute("normal",new THREE.BufferAttribute(normals,3).copyVector3sArray(geometry.normals))}if(geometry.colors.length>0){var colors=new Float32Array(3*geometry.colors.length);this.addAttribute("color",new THREE.BufferAttribute(colors,3).copyColorsArray(geometry.colors))}if(geometry.uvs.length>0){var uvs=new Float32Array(2*geometry.uvs.length);this.addAttribute("uv",new THREE.BufferAttribute(uvs,2).copyVector2sArray(geometry.uvs))}if(geometry.uvs2.length>0){var uvs2=new Float32Array(2*geometry.uvs2.length);this.addAttribute("uv2",new THREE.BufferAttribute(uvs2,2).copyVector2sArray(geometry.uvs2))}if(geometry.indices.length>0){var TypeArray=geometry.vertices.length>65535?Uint32Array:Uint16Array,indices=new TypeArray(3*geometry.indices.length);this.setIndex(new THREE.BufferAttribute(indices,1).copyIndicesArray(geometry.indices))}this.groups=geometry.groups;for(var name in geometry.morphTargets){for(var array=[],morphTargets=geometry.morphTargets[name],i=0,l=morphTargets.length;l>i;i++){var morphTarget=morphTargets[i],attribute=new THREE.Float32Attribute(3*morphTarget.length,3);array.push(attribute.copyVector3sArray(morphTarget))}this.morphAttributes[name]=array}if(geometry.skinIndices.length>0){var skinIndices=new THREE.Float32Attribute(4*geometry.skinIndices.length,4);this.addAttribute("skinIndex",skinIndices.copyVector4sArray(geometry.skinIndices))}if(geometry.skinWeights.length>0){var skinWeights=new THREE.Float32Attribute(4*geometry.skinWeights.length,4);this.addAttribute("skinWeight",skinWeights.copyVector4sArray(geometry.skinWeights))}return null!==geometry.boundingSphere&&(this.boundingSphere=geometry.boundingSphere.clone()),null!==geometry.boundingBox&&(this.boundingBox=geometry.boundingBox.clone()),this},computeBoundingBox:function(){var vector=new THREE.Vector3;return function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);var positions=this.attributes.position.array;if(positions){var bb=this.boundingBox;bb.makeEmpty();for(var i=0,il=positions.length;il>i;i+=3)vector.fromArray(positions,i),bb.expandByPoint(vector)}void 0!==positions&&0!==positions.length||(this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)),(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)}}(),computeBoundingSphere:function(){var box=new THREE.Box3,vector=new THREE.Vector3;return function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var positions=this.attributes.position.array;if(positions){box.makeEmpty();for(var center=this.boundingSphere.center,i=0,il=positions.length;il>i;i+=3)vector.fromArray(positions,i),box.expandByPoint(vector);box.center(center);for(var maxRadiusSq=0,i=0,il=positions.length;il>i;i+=3)vector.fromArray(positions,i),maxRadiusSq=Math.max(maxRadiusSq,center.distanceToSquared(vector));this.boundingSphere.radius=Math.sqrt(maxRadiusSq),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var index=this.index,attributes=this.attributes,groups=this.groups;if(attributes.position){var positions=attributes.position.array;if(void 0===attributes.normal)this.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(positions.length),3));else for(var normals=attributes.normal.array,i=0,il=normals.length;il>i;i++)normals[i]=0;var vA,vB,vC,normals=attributes.normal.array,pA=new THREE.Vector3,pB=new THREE.Vector3,pC=new THREE.Vector3,cb=new THREE.Vector3,ab=new THREE.Vector3;if(index){var indices=index.array;0===groups.length&&this.addGroup(0,indices.length);for(var j=0,jl=groups.length;jl>j;++j)for(var group=groups[j],start=group.start,count=group.count,i=start,il=start+count;il>i;i+=3)vA=3*indices[i+0],vB=3*indices[i+1],vC=3*indices[i+2],pA.fromArray(positions,vA),pB.fromArray(positions,vB),pC.fromArray(positions,vC),cb.subVectors(pC,pB),ab.subVectors(pA,pB),cb.cross(ab),normals[vA]+=cb.x,normals[vA+1]+=cb.y,normals[vA+2]+=cb.z,normals[vB]+=cb.x,normals[vB+1]+=cb.y,normals[vB+2]+=cb.z,normals[vC]+=cb.x,normals[vC+1]+=cb.y,normals[vC+2]+=cb.z}else for(var i=0,il=positions.length;il>i;i+=9)pA.fromArray(positions,i),pB.fromArray(positions,i+3),pC.fromArray(positions,i+6),cb.subVectors(pC,pB),ab.subVectors(pA,pB),cb.cross(ab),normals[i]=cb.x,normals[i+1]=cb.y,normals[i+2]=cb.z,normals[i+3]=cb.x,normals[i+4]=cb.y,normals[i+5]=cb.z,normals[i+6]=cb.x,normals[i+7]=cb.y,normals[i+8]=cb.z;this.normalizeNormals(),attributes.normal.needsUpdate=!0}},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(size){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},merge:function(geometry,offset){if(geometry instanceof THREE.BufferGeometry==!1)return void console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",geometry);void 0===offset&&(offset=0);var attributes=this.attributes;for(var key in attributes)if(void 0!==geometry.attributes[key])for(var attribute1=attributes[key],attributeArray1=attribute1.array,attribute2=geometry.attributes[key],attributeArray2=attribute2.array,attributeSize=attribute2.itemSize,i=0,j=attributeSize*offset;ii;i+=3)x=normals[i],y=normals[i+1],z=normals[i+2],n=1/Math.sqrt(x*x+y*y+z*z),normals[i]*=n,normals[i+1]*=n,normals[i+2]*=n},toJSON:function(){var data={metadata:{version:4.4,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(data.uuid=this.uuid,data.type=this.type,""!==this.name&&(data.name=this.name),void 0!==this.parameters){var parameters=this.parameters;for(var key in parameters)void 0!==parameters[key]&&(data[key]=parameters[key]);return data}data.data={attributes:{}};var index=this.index;if(null!==index){var array=Array.prototype.slice.call(index.array);data.data.index={type:index.array.constructor.name,array:array}}var attributes=this.attributes;for(var key in attributes){var attribute=attributes[key],array=Array.prototype.slice.call(attribute.array);data.data.attributes[key]={itemSize:attribute.itemSize,type:attribute.array.constructor.name,array:array}}var groups=this.groups;groups.length>0&&(data.data.groups=JSON.parse(JSON.stringify(groups)));var boundingSphere=this.boundingSphere;return null!==boundingSphere&&(data.data.boundingSphere={center:boundingSphere.center.toArray(),radius:boundingSphere.radius}),data},clone:function(){return(new this.constructor).copy(this); +},copy:function(source){var index=source.index;null!==index&&this.setIndex(index.clone());var attributes=source.attributes;for(var name in attributes){var attribute=attributes[name];this.addAttribute(name,attribute.clone())}for(var groups=source.groups,i=0,l=groups.length;l>i;i++){var group=groups[i];this.addGroup(group.start,group.count)}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}},THREE.EventDispatcher.prototype.apply(THREE.BufferGeometry.prototype),THREE.BufferGeometry.MaxIndex=65535,THREE.InstancedBufferGeometry=function(){THREE.BufferGeometry.call(this),this.type="InstancedBufferGeometry",this.maxInstancedCount=void 0},THREE.InstancedBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.InstancedBufferGeometry.prototype.constructor=THREE.InstancedBufferGeometry,THREE.InstancedBufferGeometry.prototype.addGroup=function(start,count,instances){this.groups.push({start:start,count:count,instances:instances})},THREE.InstancedBufferGeometry.prototype.copy=function(source){var index=source.index;null!==index&&this.setIndex(index.clone());var attributes=source.attributes;for(var name in attributes){var attribute=attributes[name];this.addAttribute(name,attribute.clone())}for(var groups=source.groups,i=0,l=groups.length;l>i;i++){var group=groups[i];this.addGroup(group.start,group.count,group.instances)}return this},THREE.EventDispatcher.prototype.apply(THREE.InstancedBufferGeometry.prototype),THREE.AnimationAction=function(clip,startTime,timeScale,weight,loop){if(void 0===clip)throw new Error("clip is null");this.clip=clip,this.localRoot=null,this.startTime=startTime||0,this.timeScale=timeScale||1,this.weight=weight||1,this.loop=loop||THREE.LoopRepeat,this.loopCount=0,this.enabled=!0,this.actionTime=-this.startTime,this.clipTime=0,this.propertyBindings=[]},THREE.AnimationAction.prototype={constructor:THREE.AnimationAction,setLocalRoot:function(localRoot){return this.localRoot=localRoot,this},updateTime:function(clipDeltaTime){var previousClipTime=this.clipTime,previousLoopCount=this.loopCount,duration=(this.actionTime,this.clip.duration);if(this.actionTime=this.actionTime+clipDeltaTime,this.loop===THREE.LoopOnce)return this.loopCount=0,this.clipTime=Math.min(Math.max(this.actionTime,0),duration),this.clipTime!==previousClipTime&&(this.clipTime===duration?this.mixer.dispatchEvent({type:"finished",action:this,direction:1}):0===this.clipTime&&this.mixer.dispatchEvent({type:"finished",action:this,direction:-1})),this.clipTime;this.loopCount=Math.floor(this.actionTime/duration);var newClipTime=this.actionTime-this.loopCount*duration;return newClipTime%=duration,this.loop==THREE.LoopPingPong&&1===Math.abs(this.loopCount%2)&&(newClipTime=duration-newClipTime),this.clipTime=newClipTime,this.loopCount!==previousLoopCount&&this.mixer.dispatchEvent({type:"loop",action:this,loopDelta:this.loopCount-this.loopCount}),this.clipTime},syncWith:function(action){return this.actionTime=action.actionTime,this.timeScale=action.timeScale,this},warpToDuration:function(duration){return this.timeScale=this.clip.duration/duration,this},init:function(time){return this.clipTime=time-this.startTime,this},update:function(clipDeltaTime){this.updateTime(clipDeltaTime);var clipResults=this.clip.getAt(this.clipTime);return clipResults},getTimeScaleAt:function(time){return this.timeScale.getAt?this.timeScale.getAt(time):this.timeScale},getWeightAt:function(time){return this.weight.getAt?this.weight.getAt(time):this.weight}},THREE.AnimationClip=function(name,duration,tracks){if(this.name=name,this.tracks=tracks,this.duration=void 0!==duration?duration:-1,this.duration<0)for(var i=0;ii;i++){var keys=[];keys.push({time:(i+numMorphTargets-1)%numMorphTargets,value:0}),keys.push({time:i,value:1}),keys.push({time:(i+1)%numMorphTargets,value:0}),keys.sort(THREE.KeyframeTrack.keyComparer),0===keys[0].time&&keys.push({time:numMorphTargets,value:keys[0].value}),tracks.push(new THREE.NumberKeyframeTrack(".morphTargetInfluences["+morphTargetSequence[i].name+"]",keys).scale(1/fps))}return new THREE.AnimationClip(name,-1,tracks)},THREE.AnimationClip.findByName=function(clipArray,name){for(var i=0;ii;i++){var morphTarget=morphTargets[i],parts=morphTarget.name.match(pattern);if(parts&&parts.length>1){var name=parts[1],animationMorphTargets=animationToMorphTargets[name];animationMorphTargets||(animationToMorphTargets[name]=animationMorphTargets=[]),animationMorphTargets.push(morphTarget)}}var clips=[];for(var name in animationToMorphTargets)clips.push(THREE.AnimationClip.CreateFromMorphTargetSequence(name,animationToMorphTargets[name],fps));return clips},THREE.AnimationClip.parse=function(json){for(var tracks=[],i=0;i0?new trackType(trackName,keys):null},tracks=[],clipName=animation.name||"default",duration=animation.length||-1,fps=animation.fps||30,hierarchyTracks=animation.hierarchy||[],h=0;halpha?a:b},lerp_boolean_immediate:function(a,b,alpha){return a},lerp_string:function(a,b,alpha){return.5>alpha?a:b},lerp_string_immediate:function(a,b,alpha){return a},getLerpFunc:function(exemplarValue,interTrack){if(void 0===exemplarValue||null===exemplarValue)throw new Error("examplarValue is null");var typeName=typeof exemplarValue;switch(typeName){case"object":if(exemplarValue.lerp)return THREE.AnimationUtils.lerp_object;if(exemplarValue.slerp)return THREE.AnimationUtils.slerp_object;break;case"number":return THREE.AnimationUtils.lerp_number;case"boolean":return interTrack?THREE.AnimationUtils.lerp_boolean:THREE.AnimationUtils.lerp_boolean_immediate;case"string":return interTrack?THREE.AnimationUtils.lerp_string:THREE.AnimationUtils.lerp_string_immediate}}},THREE.KeyframeTrack=function(name,keys){if(void 0===name)throw new Error("track name is undefined");if(void 0===keys||0===keys.length)throw new Error("no keys in track named "+name);this.name=name,this.keys=keys,this.lastIndex=0,this.validate(),this.optimize()},THREE.KeyframeTrack.prototype={constructor:THREE.KeyframeTrack,getAt:function(time){for(;this.lastIndex=this.keys[this.lastIndex].time;)this.lastIndex++;for(;this.lastIndex>0&&time=this.keys.length)return this.setResult(this.keys[this.keys.length-1].value),this.result;if(0===this.lastIndex)return this.setResult(this.keys[0].value),this.result;var prevKey=this.keys[this.lastIndex-1];if(this.setResult(prevKey.value),prevKey.constantToNext)return this.result;var currentKey=this.keys[this.lastIndex],alpha=(time-prevKey.time)/(currentKey.time-prevKey.time);return this.result=this.lerpValues(this.result,currentKey.value,alpha),this.result},shift:function(timeOffset){if(0!==timeOffset)for(var i=0;i0&&this.keys[i]>=endTime;i++)lastKeysToRemove++;return firstKeysToRemove+lastKeysToRemove>0&&(this.keys=this.keys.splice(firstKeysToRemove,this.keys.length-lastKeysToRemove-firstKeysToRemove)),this},validate:function(){var prevKey=null;if(0===this.keys.length)return void console.error(" track is empty, no keys",this);for(var i=0;icurrKey.time)return void console.error(" key.time is less than previous key time, out of order keys",this,i,currKey,prevKey);prevKey=currKey}return this},optimize:function(){var newKeys=[],prevKey=this.keys[0];newKeys.push(prevKey);for(var i=(THREE.AnimationUtils.getEqualsFunc(prevKey.value),1);i0&&(null===this.cumulativeValue&&(this.cumulativeValue=THREE.AnimationUtils.clone(value)),this.cumulativeWeight=weight);else{var lerpAlpha=weight/(this.cumulativeWeight+weight);this.cumulativeValue=this.lerpValue(this.cumulativeValue,value,lerpAlpha),this.cumulativeWeight+=weight}},unbind:function(){this.isBound&&(this.setValue(this.originalValue),this.setValue=null,this.getValue=null,this.lerpValue=null,this.equalsValue=null,this.triggerDirty=null,this.isBound=!1)},bind:function(){if(!this.isBound){var targetObject=this.node;if(!targetObject)return void console.error(" trying to update node for track: "+this.trackName+" but it wasn't found.");if(this.objectName){if("materials"===this.objectName){if(!targetObject.material)return void console.error(" can not bind to material as node does not have a material",this);if(!targetObject.material.materials)return void console.error(" can not bind to material.materials as node.material does not have a materials array",this);targetObject=targetObject.material.materials}else if("bones"===this.objectName){if(!targetObject.skeleton)return void console.error(" can not bind to bones as node does not have a skeleton",this);targetObject=targetObject.skeleton.bones;for(var i=0;i0){if(this.cumulativeWeight<1){var remainingWeight=1-this.cumulativeWeight,lerpAlpha=remainingWeight/(this.cumulativeWeight+remainingWeight);this.cumulativeValue=this.lerpValue(this.cumulativeValue,this.originalValue,lerpAlpha)}var valueChanged=this.setValue(this.cumulativeValue);valueChanged&&this.triggerDirty&&this.triggerDirty(),this.cumulativeValue=null,this.cumulativeWeight=0}}},THREE.PropertyBinding.parseTrackName=function(trackName){var re=/^(([\w]+\/)*)([\w-\d]+)?(\.([\w]+)(\[([\w\d\[\]\_. ]+)\])?)?(\.([\w.]+)(\[([\w\d\[\]\_. ]+)\])?)$/,matches=re.exec(trackName);if(!matches)throw new Error("cannot parse trackName at all: "+trackName);matches.index===re.lastIndex&&re.lastIndex++;var results={directoryName:matches[1],nodeName:matches[3],objectName:matches[5],objectIndex:matches[7],propertyName:matches[9],propertyIndex:matches[11]};if(null===results.propertyName||0===results.propertyName.length)throw new Error("can not parse propertyName from trackName: "+trackName);return results},THREE.PropertyBinding.findNode=function(root,nodeName){function searchSkeleton(skeleton){for(var i=0;ialpha?value0:value1},THREE.StringKeyframeTrack.prototype.compareValues=function(value0,value1){return value0===value1},THREE.StringKeyframeTrack.prototype.clone=function(){for(var clonedKeys=[],i=0;ialpha?value0:value1},THREE.BooleanKeyframeTrack.prototype.compareValues=function(value0,value1){return value0===value1},THREE.BooleanKeyframeTrack.prototype.clone=function(){for(var clonedKeys=[],i=0;ii;i+=2){var regex=handlers[i],loader=handlers[i+1];if(regex.test(file))return loader}return null}},THREE.XHRLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager},THREE.XHRLoader.prototype={constructor:THREE.XHRLoader,load:function(url,onLoad,onProgress,onError){var scope=this,cached=THREE.Cache.get(url);if(void 0!==cached)return onLoad&&setTimeout(function(){onLoad(cached)},0),cached;var request=new XMLHttpRequest;return request.open("GET",url,!0),request.addEventListener("load",function(event){var response=event.target.response;THREE.Cache.add(url,response),onLoad&&onLoad(response),scope.manager.itemEnd(url)},!1),void 0!==onProgress&&request.addEventListener("progress",function(event){onProgress(event)},!1),request.addEventListener("error",function(event){onError&&onError(event),scope.manager.itemError(url)},!1),void 0!==this.crossOrigin&&(request.crossOrigin=this.crossOrigin),void 0!==this.responseType&&(request.responseType=this.responseType),void 0!==this.withCredentials&&(request.withCredentials=this.withCredentials),request.send(null),scope.manager.itemStart(url),request},setResponseType:function(value){this.responseType=value},setCrossOrigin:function(value){this.crossOrigin=value},setWithCredentials:function(value){this.withCredentials=value}},THREE.ImageLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager},THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(url,onLoad,onProgress,onError){var scope=this,cached=THREE.Cache.get(url);if(void 0!==cached)return scope.manager.itemStart(url),onLoad?setTimeout(function(){onLoad(cached),scope.manager.itemEnd(url)},0):scope.manager.itemEnd(url),cached;var image=document.createElement("img");return image.addEventListener("load",function(event){THREE.Cache.add(url,this),onLoad&&onLoad(this),scope.manager.itemEnd(url)},!1),void 0!==onProgress&&image.addEventListener("progress",function(event){onProgress(event)},!1),image.addEventListener("error",function(event){onError&&onError(event),scope.manager.itemError(url)},!1),void 0!==this.crossOrigin&&(image.crossOrigin=this.crossOrigin),scope.manager.itemStart(url),image.src=url,image},setCrossOrigin:function(value){this.crossOrigin=value}},THREE.JSONLoader=function(manager){"boolean"==typeof manager&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),manager=void 0),this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager,this.withCredentials=!1},THREE.JSONLoader.prototype={constructor:THREE.JSONLoader,get statusDomElement(){return void 0===this._statusDomElement&&(this._statusDomElement=document.createElement("div")),console.warn("THREE.JSONLoader: .statusDomElement has been removed."),this._statusDomElement},load:function(url,onLoad,onProgress,onError){var scope=this,texturePath=this.texturePath&&"string"==typeof this.texturePath?this.texturePath:THREE.Loader.prototype.extractUrlBase(url),loader=new THREE.XHRLoader(this.manager);loader.setCrossOrigin(this.crossOrigin),loader.setWithCredentials(this.withCredentials),loader.load(url,function(text){var json=JSON.parse(text),metadata=json.metadata;if(void 0!==metadata){if("object"===metadata.type)return void console.error("THREE.JSONLoader: "+url+" should be loaded with THREE.ObjectLoader instead.");if("scene"===metadata.type)return void console.error("THREE.JSONLoader: "+url+" should be loaded with THREE.SceneLoader instead.")}var object=scope.parse(json,texturePath);onLoad(object.geometry,object.materials)})},setCrossOrigin:function(value){this.crossOrigin=value},setTexturePath:function(value){this.texturePath=value},parse:function(json,texturePath){function parseModel(scale){function isBitSet(value,position){return value&1<i;i++)geometry.faceVertexUvs[i]=[]}for(offset=0,zLength=vertices.length;zLength>offset;)vertex=new THREE.Vector3,vertex.x=vertices[offset++]*scale,vertex.y=vertices[offset++]*scale,vertex.z=vertices[offset++]*scale,geometry.vertices.push(vertex);for(offset=0,zLength=faces.length;zLength>offset;)if(type=faces[offset++],isQuad=isBitSet(type,0),hasMaterial=isBitSet(type,1),hasFaceVertexUv=isBitSet(type,3),hasFaceNormal=isBitSet(type,4),hasFaceVertexNormal=isBitSet(type,5),hasFaceColor=isBitSet(type,6),hasFaceVertexColor=isBitSet(type,7),isQuad){if(faceA=new THREE.Face3,faceA.a=faces[offset],faceA.b=faces[offset+1],faceA.c=faces[offset+3],faceB=new THREE.Face3,faceB.a=faces[offset+1],faceB.b=faces[offset+2],faceB.c=faces[offset+3],offset+=4,hasMaterial&&(materialIndex=faces[offset++],faceA.materialIndex=materialIndex,faceB.materialIndex=materialIndex),fi=geometry.faces.length,hasFaceVertexUv)for(i=0;nUvLayers>i;i++)for(uvLayer=json.uvs[i],geometry.faceVertexUvs[i][fi]=[],geometry.faceVertexUvs[i][fi+1]=[],j=0;4>j;j++)uvIndex=faces[offset++],u=uvLayer[2*uvIndex],v=uvLayer[2*uvIndex+1],uv=new THREE.Vector2(u,v),2!==j&&geometry.faceVertexUvs[i][fi].push(uv),0!==j&&geometry.faceVertexUvs[i][fi+1].push(uv);if(hasFaceNormal&&(normalIndex=3*faces[offset++],faceA.normal.set(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]),faceB.normal.copy(faceA.normal)),hasFaceVertexNormal)for(i=0;4>i;i++)normalIndex=3*faces[offset++],normal=new THREE.Vector3(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]),2!==i&&faceA.vertexNormals.push(normal),0!==i&&faceB.vertexNormals.push(normal);if(hasFaceColor&&(colorIndex=faces[offset++],hex=colors[colorIndex],faceA.color.setHex(hex),faceB.color.setHex(hex)),hasFaceVertexColor)for(i=0;4>i;i++)colorIndex=faces[offset++],hex=colors[colorIndex],2!==i&&faceA.vertexColors.push(new THREE.Color(hex)),0!==i&&faceB.vertexColors.push(new THREE.Color(hex));geometry.faces.push(faceA),geometry.faces.push(faceB)}else{if(face=new THREE.Face3,face.a=faces[offset++],face.b=faces[offset++],face.c=faces[offset++],hasMaterial&&(materialIndex=faces[offset++],face.materialIndex=materialIndex),fi=geometry.faces.length,hasFaceVertexUv)for(i=0;nUvLayers>i;i++)for(uvLayer=json.uvs[i],geometry.faceVertexUvs[i][fi]=[],j=0;3>j;j++)uvIndex=faces[offset++],u=uvLayer[2*uvIndex],v=uvLayer[2*uvIndex+1],uv=new THREE.Vector2(u,v),geometry.faceVertexUvs[i][fi].push(uv);if(hasFaceNormal&&(normalIndex=3*faces[offset++],face.normal.set(normals[normalIndex++],normals[normalIndex++],normals[normalIndex])),hasFaceVertexNormal)for(i=0;3>i;i++)normalIndex=3*faces[offset++],normal=new THREE.Vector3(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]),face.vertexNormals.push(normal);if(hasFaceColor&&(colorIndex=faces[offset++],face.color.setHex(colors[colorIndex])),hasFaceVertexColor)for(i=0;3>i;i++)colorIndex=faces[offset++],face.vertexColors.push(new THREE.Color(colors[colorIndex]));geometry.faces.push(face)}}function parseSkin(){var influencesPerVertex=void 0!==json.influencesPerVertex?json.influencesPerVertex:2;if(json.skinWeights)for(var i=0,l=json.skinWeights.length;l>i;i+=influencesPerVertex){var x=json.skinWeights[i],y=influencesPerVertex>1?json.skinWeights[i+1]:0,z=influencesPerVertex>2?json.skinWeights[i+2]:0,w=influencesPerVertex>3?json.skinWeights[i+3]:0;geometry.skinWeights.push(new THREE.Vector4(x,y,z,w))}if(json.skinIndices)for(var i=0,l=json.skinIndices.length;l>i;i+=influencesPerVertex){var a=json.skinIndices[i],b=influencesPerVertex>1?json.skinIndices[i+1]:0,c=influencesPerVertex>2?json.skinIndices[i+2]:0,d=influencesPerVertex>3?json.skinIndices[i+3]:0;geometry.skinIndices.push(new THREE.Vector4(a,b,c,d))}geometry.bones=json.bones,geometry.bones&&geometry.bones.length>0&&(geometry.skinWeights.length!==geometry.skinIndices.length||geometry.skinIndices.length!==geometry.vertices.length)&&console.warn("When skinning, number of vertices ("+geometry.vertices.length+"), skinIndices ("+geometry.skinIndices.length+"), and skinWeights ("+geometry.skinWeights.length+") should match.")}function parseMorphing(scale){if(void 0!==json.morphTargets)for(var i=0,l=json.morphTargets.length;l>i;i++){geometry.morphTargets[i]={},geometry.morphTargets[i].name=json.morphTargets[i].name,geometry.morphTargets[i].vertices=[];for(var dstVertices=geometry.morphTargets[i].vertices,srcVertices=json.morphTargets[i].vertices,v=0,vl=srcVertices.length;vl>v;v+=3){var vertex=new THREE.Vector3;vertex.x=srcVertices[v]*scale,vertex.y=srcVertices[v+1]*scale,vertex.z=srcVertices[v+2]*scale,dstVertices.push(vertex)}}if(void 0!==json.morphColors&&json.morphColors.length>0){console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.');for(var faces=geometry.faces,morphColors=json.morphColors[0].colors,i=0,l=faces.length;l>i;i++)faces[i].color.fromArray(morphColors,3*i)}}function parseAnimations(){var outputAnimations=[],animations=[];void 0!==json.animation&&animations.push(json.animation),void 0!==json.animations&&(json.animations.length?animations=animations.concat(json.animations):animations.push(json.animations));for(var i=0;i0&&(geometry.animations=outputAnimations)}var geometry=new THREE.Geometry,scale=void 0!==json.scale?1/json.scale:1;if(parseModel(scale),parseSkin(),parseMorphing(scale),parseAnimations(),geometry.computeFaceNormals(),geometry.computeBoundingSphere(),void 0===json.materials||0===json.materials.length)return{geometry:geometry};var materials=THREE.Loader.prototype.initMaterials(json.materials,texturePath,this.crossOrigin);return{geometry:geometry,materials:materials}}},THREE.LoadingManager=function(onLoad,onProgress,onError){var scope=this,isLoading=!1,itemsLoaded=0,itemsTotal=0;this.onStart=void 0,this.onLoad=onLoad,this.onProgress=onProgress,this.onError=onError,this.itemStart=function(url){itemsTotal++,isLoading===!1&&void 0!==scope.onStart&&scope.onStart(url,itemsLoaded,itemsTotal),isLoading=!0},this.itemEnd=function(url){itemsLoaded++,void 0!==scope.onProgress&&scope.onProgress(url,itemsLoaded,itemsTotal),itemsLoaded===itemsTotal&&(isLoading=!1,void 0!==scope.onLoad&&scope.onLoad())},this.itemError=function(url){void 0!==scope.onError&&scope.onError(url)}},THREE.DefaultLoadingManager=new THREE.LoadingManager,THREE.BufferGeometryLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager},THREE.BufferGeometryLoader.prototype={constructor:THREE.BufferGeometryLoader,load:function(url,onLoad,onProgress,onError){var scope=this,loader=new THREE.XHRLoader(scope.manager);loader.setCrossOrigin(this.crossOrigin),loader.load(url,function(text){onLoad(scope.parse(JSON.parse(text)))},onProgress,onError)},setCrossOrigin:function(value){this.crossOrigin=value},parse:function(json){var geometry=new THREE.BufferGeometry,index=json.data.index;if(void 0!==index){var typedArray=new self[index.type](index.array);geometry.setIndex(new THREE.BufferAttribute(typedArray,1))}var attributes=json.data.attributes;for(var key in attributes){var attribute=attributes[key],typedArray=new self[attribute.type](attribute.array);geometry.addAttribute(key,new THREE.BufferAttribute(typedArray,attribute.itemSize))}var groups=json.data.groups||json.data.drawcalls||json.data.offsets;if(void 0!==groups)for(var i=0,n=groups.length;i!==n;++i){var group=groups[i];geometry.addGroup(group.start,group.count)}var boundingSphere=json.data.boundingSphere;if(void 0!==boundingSphere){var center=new THREE.Vector3;void 0!==boundingSphere.center&¢er.fromArray(boundingSphere.center),geometry.boundingSphere=new THREE.Sphere(center,boundingSphere.radius)}return geometry}},THREE.MaterialLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager,this.textures={}},THREE.MaterialLoader.prototype={constructor:THREE.MaterialLoader,load:function(url,onLoad,onProgress,onError){var scope=this,loader=new THREE.XHRLoader(scope.manager);loader.setCrossOrigin(this.crossOrigin),loader.load(url,function(text){onLoad(scope.parse(JSON.parse(text)))},onProgress,onError)},setCrossOrigin:function(value){this.crossOrigin=value},setTextures:function(value){this.textures=value},getTexture:function(name){var textures=this.textures;return void 0===textures[name]&&console.warn("THREE.MaterialLoader: Undefined texture",name),textures[name]},parse:function(json){var material=new THREE[json.type];if(material.uuid=json.uuid,void 0!==json.name&&(material.name=json.name),void 0!==json.color&&material.color.setHex(json.color),void 0!==json.emissive&&material.emissive.setHex(json.emissive),void 0!==json.specular&&material.specular.setHex(json.specular),void 0!==json.shininess&&(material.shininess=json.shininess),void 0!==json.uniforms&&(material.uniforms=json.uniforms),void 0!==json.vertexShader&&(material.vertexShader=json.vertexShader),void 0!==json.fragmentShader&&(material.fragmentShader=json.fragmentShader),void 0!==json.vertexColors&&(material.vertexColors=json.vertexColors),void 0!==json.shading&&(material.shading=json.shading),void 0!==json.blending&&(material.blending=json.blending),void 0!==json.side&&(material.side=json.side),void 0!==json.opacity&&(material.opacity=json.opacity),void 0!==json.transparent&&(material.transparent=json.transparent),void 0!==json.alphaTest&&(material.alphaTest=json.alphaTest),void 0!==json.depthTest&&(material.depthTest=json.depthTest),void 0!==json.depthWrite&&(material.depthWrite=json.depthWrite),void 0!==json.wireframe&&(material.wireframe=json.wireframe),void 0!==json.wireframeLinewidth&&(material.wireframeLinewidth=json.wireframeLinewidth),void 0!==json.size&&(material.size=json.size),void 0!==json.sizeAttenuation&&(material.sizeAttenuation=json.sizeAttenuation),void 0!==json.map&&(material.map=this.getTexture(json.map)),void 0!==json.alphaMap&&(material.alphaMap=this.getTexture(json.alphaMap),material.transparent=!0),void 0!==json.bumpMap&&(material.bumpMap=this.getTexture(json.bumpMap)),void 0!==json.bumpScale&&(material.bumpScale=json.bumpScale),void 0!==json.normalMap&&(material.normalMap=this.getTexture(json.normalMap)),json.normalScale&&(material.normalScale=new THREE.Vector2(json.normalScale,json.normalScale)),void 0!==json.displacementMap&&(material.displacementMap=this.getTexture(json.displacementMap)),void 0!==json.displacementScale&&(material.displacementScale=json.displacementScale),void 0!==json.displacementBias&&(material.displacementBias=json.displacementBias),void 0!==json.specularMap&&(material.specularMap=this.getTexture(json.specularMap)),void 0!==json.envMap&&(material.envMap=this.getTexture(json.envMap),material.combine=THREE.MultiplyOperation),json.reflectivity&&(material.reflectivity=json.reflectivity),void 0!==json.lightMap&&(material.lightMap=this.getTexture(json.lightMap)),void 0!==json.lightMapIntensity&&(material.lightMapIntensity=json.lightMapIntensity),void 0!==json.aoMap&&(material.aoMap=this.getTexture(json.aoMap)),void 0!==json.aoMapIntensity&&(material.aoMapIntensity=json.aoMapIntensity),void 0!==json.materials)for(var i=0,l=json.materials.length;l>i;i++)material.materials.push(this.parse(json.materials[i]));return material}},THREE.ObjectLoader=function(manager){this.manager=void 0!==manager?manager:THREE.DefaultLoadingManager,this.texturePath=""},THREE.ObjectLoader.prototype={constructor:THREE.ObjectLoader,load:function(url,onLoad,onProgress,onError){""===this.texturePath&&(this.texturePath=url.substring(0,url.lastIndexOf("/")+1));var scope=this,loader=new THREE.XHRLoader(scope.manager);loader.setCrossOrigin(this.crossOrigin),loader.load(url,function(text){scope.parse(JSON.parse(text),onLoad)},onProgress,onError)},setTexturePath:function(value){this.texturePath=value},setCrossOrigin:function(value){this.crossOrigin=value},parse:function(json,onLoad){var geometries=this.parseGeometries(json.geometries),images=this.parseImages(json.images,function(){void 0!==onLoad&&onLoad(object)}),textures=this.parseTextures(json.textures,images),materials=this.parseMaterials(json.materials,textures),object=this.parseObject(json.object,geometries,materials);return json.animations&&(object.animations=this.parseAnimations(json.animations)),void 0!==json.images&&0!==json.images.length||void 0!==onLoad&&onLoad(object),object},parseGeometries:function(json){var geometries={};if(void 0!==json)for(var geometryLoader=new THREE.JSONLoader,bufferGeometryLoader=new THREE.BufferGeometryLoader,i=0,l=json.length;l>i;i++){var geometry,data=json[i];switch(data.type){case"PlaneGeometry":case"PlaneBufferGeometry":geometry=new THREE[data.type](data.width,data.height,data.widthSegments,data.heightSegments);break;case"BoxGeometry":case"CubeGeometry":geometry=new THREE.BoxGeometry(data.width,data.height,data.depth,data.widthSegments,data.heightSegments,data.depthSegments);break;case"CircleBufferGeometry":geometry=new THREE.CircleBufferGeometry(data.radius,data.segments,data.thetaStart,data.thetaLength);break;case"CircleGeometry":geometry=new THREE.CircleGeometry(data.radius,data.segments,data.thetaStart,data.thetaLength);break;case"CylinderGeometry":geometry=new THREE.CylinderGeometry(data.radiusTop,data.radiusBottom,data.height,data.radialSegments,data.heightSegments,data.openEnded,data.thetaStart,data.thetaLength);break;case"SphereGeometry":geometry=new THREE.SphereGeometry(data.radius,data.widthSegments,data.heightSegments,data.phiStart,data.phiLength,data.thetaStart,data.thetaLength);break;case"SphereBufferGeometry":geometry=new THREE.SphereBufferGeometry(data.radius,data.widthSegments,data.heightSegments,data.phiStart,data.phiLength,data.thetaStart,data.thetaLength);break;case"DodecahedronGeometry":geometry=new THREE.DodecahedronGeometry(data.radius,data.detail);break;case"IcosahedronGeometry":geometry=new THREE.IcosahedronGeometry(data.radius,data.detail);break;case"OctahedronGeometry":geometry=new THREE.OctahedronGeometry(data.radius,data.detail);break;case"TetrahedronGeometry":geometry=new THREE.TetrahedronGeometry(data.radius,data.detail);break;case"RingGeometry":geometry=new THREE.RingGeometry(data.innerRadius,data.outerRadius,data.thetaSegments,data.phiSegments,data.thetaStart,data.thetaLength);break;case"TorusGeometry":geometry=new THREE.TorusGeometry(data.radius,data.tube,data.radialSegments,data.tubularSegments,data.arc);break;case"TorusKnotGeometry":geometry=new THREE.TorusKnotGeometry(data.radius,data.tube,data.radialSegments,data.tubularSegments,data.p,data.q,data.heightScale);break;case"BufferGeometry":geometry=bufferGeometryLoader.parse(data);break;case"Geometry": +geometry=geometryLoader.parse(data.data,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+data.type+'"');continue}geometry.uuid=data.uuid,void 0!==data.name&&(geometry.name=data.name),geometries[data.uuid]=geometry}return geometries},parseMaterials:function(json,textures){var materials={};if(void 0!==json){var loader=new THREE.MaterialLoader;loader.setTextures(textures);for(var i=0,l=json.length;l>i;i++){var material=loader.parse(json[i]);materials[material.uuid]=material}}return materials},parseAnimations:function(json){for(var animations=[],i=0;i0){var manager=new THREE.LoadingManager(onLoad),loader=new THREE.ImageLoader(manager);loader.setCrossOrigin(this.crossOrigin);for(var i=0,l=json.length;l>i;i++){var image=json[i],path=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url)?image.url:scope.texturePath+image.url;images[image.uuid]=loadImage(path)}}return images},parseTextures:function(json,images){function parseConstant(value){return"number"==typeof value?value:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",value),THREE[value])}var textures={};if(void 0!==json)for(var i=0,l=json.length;l>i;i++){var data=json[i];void 0===data.image&&console.warn('THREE.ObjectLoader: No "image" specified for',data.uuid),void 0===images[data.image]&&console.warn("THREE.ObjectLoader: Undefined image",data.image);var texture=new THREE.Texture(images[data.image]);texture.needsUpdate=!0,texture.uuid=data.uuid,void 0!==data.name&&(texture.name=data.name),void 0!==data.mapping&&(texture.mapping=parseConstant(data.mapping)),void 0!==data.offset&&(texture.offset=new THREE.Vector2(data.offset[0],data.offset[1])),void 0!==data.repeat&&(texture.repeat=new THREE.Vector2(data.repeat[0],data.repeat[1])),void 0!==data.minFilter&&(texture.minFilter=parseConstant(data.minFilter)),void 0!==data.magFilter&&(texture.magFilter=parseConstant(data.magFilter)),void 0!==data.anisotropy&&(texture.anisotropy=data.anisotropy),Array.isArray(data.wrap)&&(texture.wrapS=parseConstant(data.wrap[0]),texture.wrapT=parseConstant(data.wrap[1])),textures[data.uuid]=texture}return textures},parseObject:function(){var matrix=new THREE.Matrix4;return function(data,geometries,materials){function getGeometry(name){return void 0===geometries[name]&&console.warn("THREE.ObjectLoader: Undefined geometry",name),geometries[name]}function getMaterial(name){return void 0!==name?(void 0===materials[name]&&console.warn("THREE.ObjectLoader: Undefined material",name),materials[name]):void 0}var object;switch(data.type){case"Scene":object=new THREE.Scene;break;case"PerspectiveCamera":object=new THREE.PerspectiveCamera(data.fov,data.aspect,data.near,data.far);break;case"OrthographicCamera":object=new THREE.OrthographicCamera(data.left,data.right,data.top,data.bottom,data.near,data.far);break;case"AmbientLight":object=new THREE.AmbientLight(data.color);break;case"DirectionalLight":object=new THREE.DirectionalLight(data.color,data.intensity);break;case"PointLight":object=new THREE.PointLight(data.color,data.intensity,data.distance,data.decay);break;case"SpotLight":object=new THREE.SpotLight(data.color,data.intensity,data.distance,data.angle,data.exponent,data.decay);break;case"HemisphereLight":object=new THREE.HemisphereLight(data.color,data.groundColor,data.intensity);break;case"Mesh":object=new THREE.Mesh(getGeometry(data.geometry),getMaterial(data.material));break;case"LOD":object=new THREE.LOD;break;case"Line":object=new THREE.Line(getGeometry(data.geometry),getMaterial(data.material),data.mode);break;case"PointCloud":case"Points":object=new THREE.Points(getGeometry(data.geometry),getMaterial(data.material));break;case"Sprite":object=new THREE.Sprite(getMaterial(data.material));break;case"Group":object=new THREE.Group;break;default:object=new THREE.Object3D}if(object.uuid=data.uuid,void 0!==data.name&&(object.name=data.name),void 0!==data.matrix?(matrix.fromArray(data.matrix),matrix.decompose(object.position,object.quaternion,object.scale)):(void 0!==data.position&&object.position.fromArray(data.position),void 0!==data.rotation&&object.rotation.fromArray(data.rotation),void 0!==data.scale&&object.scale.fromArray(data.scale)),void 0!==data.castShadow&&(object.castShadow=data.castShadow),void 0!==data.receiveShadow&&(object.receiveShadow=data.receiveShadow),void 0!==data.visible&&(object.visible=data.visible),void 0!==data.userData&&(object.userData=data.userData),void 0!==data.children)for(var child in data.children)object.add(this.parseObject(data.children[child],geometries,materials));if("LOD"===data.type)for(var levels=data.levels,l=0;li;++i)loadTexture(i);else loader.load(url,function(buffer){var texDatas=scope._parser(buffer,!0);if(texDatas.isCubemap)for(var faces=texDatas.mipmaps.length/texDatas.mipmapCount,f=0;faces>f;f++){images[f]={mipmaps:[]};for(var i=0;i0&&(data.alphaTest=this.alphaTest),this.wireframe===!0&&(data.wireframe=this.wireframe),this.wireframeLinewidth>1&&(data.wireframeLinewidth=this.wireframeLinewidth),data},clone:function(){return(new this.constructor).copy(this)},copy:function(source){return this.name=source.name,this.side=source.side,this.opacity=source.opacity,this.transparent=source.transparent,this.blending=source.blending,this.blendSrc=source.blendSrc,this.blendDst=source.blendDst,this.blendEquation=source.blendEquation,this.blendSrcAlpha=source.blendSrcAlpha,this.blendDstAlpha=source.blendDstAlpha,this.blendEquationAlpha=source.blendEquationAlpha,this.depthFunc=source.depthFunc,this.depthTest=source.depthTest,this.depthWrite=source.depthWrite,this.precision=source.precision,this.polygonOffset=source.polygonOffset,this.polygonOffsetFactor=source.polygonOffsetFactor,this.polygonOffsetUnits=source.polygonOffsetUnits,this.alphaTest=source.alphaTest,this.overdraw=source.overdraw,this.visible=source.visible,this},update:function(){this.dispatchEvent({type:"update"})},dispose:function(){this.dispatchEvent({type:"dispose"})},get wrapAround(){console.warn("THREE."+this.type+": .wrapAround has been removed.")},set wrapAround(boolean){console.warn("THREE."+this.type+": .wrapAround has been removed.")},get wrapRGB(){return console.warn("THREE."+this.type+": .wrapRGB has been removed."),new THREE.Color}},THREE.EventDispatcher.prototype.apply(THREE.Material.prototype),THREE.MaterialIdCount=0,THREE.LineBasicMaterial=function(parameters){THREE.Material.call(this),this.type="LineBasicMaterial",this.color=new THREE.Color(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.vertexColors=THREE.NoColors,this.fog=!0,this.setValues(parameters)},THREE.LineBasicMaterial.prototype=Object.create(THREE.Material.prototype),THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial,THREE.LineBasicMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.linewidth=source.linewidth,this.linecap=source.linecap,this.linejoin=source.linejoin,this.vertexColors=source.vertexColors,this.fog=source.fog,this},THREE.LineDashedMaterial=function(parameters){THREE.Material.call(this),this.type="LineDashedMaterial",this.color=new THREE.Color(16777215),this.linewidth=1,this.scale=1,this.dashSize=3,this.gapSize=1,this.vertexColors=!1,this.fog=!0,this.setValues(parameters)},THREE.LineDashedMaterial.prototype=Object.create(THREE.Material.prototype),THREE.LineDashedMaterial.prototype.constructor=THREE.LineDashedMaterial,THREE.LineDashedMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.linewidth=source.linewidth,this.scale=source.scale,this.dashSize=source.dashSize,this.gapSize=source.gapSize,this.vertexColors=source.vertexColors,this.fog=source.fog,this},THREE.MeshBasicMaterial=function(parameters){THREE.Material.call(this),this.type="MeshBasicMaterial",this.color=new THREE.Color(16777215),this.map=null,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=THREE.MultiplyOperation,this.reflectivity=1,this.refractionRatio=.98,this.fog=!0,this.shading=THREE.SmoothShading,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.vertexColors=THREE.NoColors,this.skinning=!1,this.morphTargets=!1,this.setValues(parameters)},THREE.MeshBasicMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial,THREE.MeshBasicMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.map=source.map,this.aoMap=source.aoMap,this.aoMapIntensity=source.aoMapIntensity,this.specularMap=source.specularMap,this.alphaMap=source.alphaMap,this.envMap=source.envMap,this.combine=source.combine,this.reflectivity=source.reflectivity,this.refractionRatio=source.refractionRatio,this.fog=source.fog,this.shading=source.shading,this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this.wireframeLinecap=source.wireframeLinecap,this.wireframeLinejoin=source.wireframeLinejoin,this.vertexColors=source.vertexColors,this.skinning=source.skinning,this.morphTargets=source.morphTargets,this},THREE.MeshLambertMaterial=function(parameters){THREE.Material.call(this),this.type="MeshLambertMaterial",this.color=new THREE.Color(16777215),this.emissive=new THREE.Color(0),this.map=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=THREE.MultiplyOperation,this.reflectivity=1,this.refractionRatio=.98,this.fog=!0,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.vertexColors=THREE.NoColors,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(parameters)},THREE.MeshLambertMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial,THREE.MeshLambertMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.emissive.copy(source.emissive),this.map=source.map,this.specularMap=source.specularMap,this.alphaMap=source.alphaMap,this.envMap=source.envMap,this.combine=source.combine,this.reflectivity=source.reflectivity,this.refractionRatio=source.refractionRatio,this.fog=source.fog,this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this.wireframeLinecap=source.wireframeLinecap,this.wireframeLinejoin=source.wireframeLinejoin,this.vertexColors=source.vertexColors,this.skinning=source.skinning,this.morphTargets=source.morphTargets,this.morphNormals=source.morphNormals,this},THREE.MeshPhongMaterial=function(parameters){THREE.Material.call(this),this.type="MeshPhongMaterial",this.color=new THREE.Color(16777215),this.emissive=new THREE.Color(0),this.specular=new THREE.Color(1118481),this.shininess=30,this.metal=!1,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalScale=new THREE.Vector2(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=THREE.MultiplyOperation,this.reflectivity=1,this.refractionRatio=.98,this.fog=!0,this.shading=THREE.SmoothShading,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.vertexColors=THREE.NoColors,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(parameters)},THREE.MeshPhongMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial,THREE.MeshPhongMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.color.copy(source.color),this.emissive.copy(source.emissive),this.specular.copy(source.specular),this.shininess=source.shininess,this.metal=source.metal,this.map=source.map,this.lightMap=source.lightMap,this.lightMapIntensity=source.lightMapIntensity,this.aoMap=source.aoMap,this.aoMapIntensity=source.aoMapIntensity,this.emissiveMap=source.emissiveMap,this.bumpMap=source.bumpMap,this.bumpScale=source.bumpScale,this.normalMap=source.normalMap,this.normalScale.copy(source.normalScale),this.displacementMap=source.displacementMap,this.displacementScale=source.displacementScale,this.displacementBias=source.displacementBias,this.specularMap=source.specularMap,this.alphaMap=source.alphaMap,this.envMap=source.envMap,this.combine=source.combine,this.reflectivity=source.reflectivity,this.refractionRatio=source.refractionRatio,this.fog=source.fog,this.shading=source.shading,this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this.wireframeLinecap=source.wireframeLinecap,this.wireframeLinejoin=source.wireframeLinejoin,this.vertexColors=source.vertexColors,this.skinning=source.skinning,this.morphTargets=source.morphTargets,this.morphNormals=source.morphNormals,this},THREE.MeshDepthMaterial=function(parameters){THREE.Material.call(this),this.type="MeshDepthMaterial",this.morphTargets=!1,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(parameters)},THREE.MeshDepthMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial,THREE.MeshDepthMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this},THREE.MeshNormalMaterial=function(parameters){THREE.Material.call(this,parameters),this.type="MeshNormalMaterial",this.wireframe=!1,this.wireframeLinewidth=1,this.morphTargets=!1,this.setValues(parameters)},THREE.MeshNormalMaterial.prototype=Object.create(THREE.Material.prototype),THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial,THREE.MeshNormalMaterial.prototype.copy=function(source){return THREE.Material.prototype.copy.call(this,source),this.wireframe=source.wireframe,this.wireframeLinewidth=source.wireframeLinewidth,this},THREE.MultiMaterial=function(materials){this.uuid=THREE.Math.generateUUID(),this.type="MultiMaterial",this.materials=materials instanceof Array?materials:[],this.visible=!0},THREE.MultiMaterial.prototype={constructor:THREE.MultiMaterial,toJSON:function(){for(var output={metadata:{version:4.2,type:"material",generator:"MaterialExporter"},uuid:this.uuid,type:this.type,materials:[]},i=0,l=this.materials.length;l>i;i++)output.materials.push(this.materials[i].toJSON());return output.visible=this.visible,output},clone:function(){for(var material=new this.constructor,i=0;i2048||canvas.height>2048?canvas.toDataURL("image/jpeg",.6):canvas.toDataURL("image/png")}if(void 0!==meta.textures[this.uuid])return meta.textures[this.uuid];var output={metadata:{version:4.4,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy};if(void 0!==this.image){var image=this.image;void 0===image.uuid&&(image.uuid=THREE.Math.generateUUID()),void 0===meta.images[image.uuid]&&(meta.images[image.uuid]={uuid:image.uuid,url:getDataURL(image)}),output.image=image.uuid}return meta.textures[this.uuid]=output,output},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(uv){if(this.mapping===THREE.UVMapping){if(uv.multiply(this.repeat),uv.add(this.offset),uv.x<0||uv.x>1)switch(this.wrapS){case THREE.RepeatWrapping:uv.x=uv.x-Math.floor(uv.x);break;case THREE.ClampToEdgeWrapping:uv.x=uv.x<0?0:1;break;case THREE.MirroredRepeatWrapping:1===Math.abs(Math.floor(uv.x)%2)?uv.x=Math.ceil(uv.x)-uv.x:uv.x=uv.x-Math.floor(uv.x)}if(uv.y<0||uv.y>1)switch(this.wrapT){case THREE.RepeatWrapping:uv.y=uv.y-Math.floor(uv.y);break;case THREE.ClampToEdgeWrapping:uv.y=uv.y<0?0:1;break;case THREE.MirroredRepeatWrapping:1===Math.abs(Math.floor(uv.y)%2)?uv.y=Math.ceil(uv.y)-uv.y:uv.y=uv.y-Math.floor(uv.y)}this.flipY&&(uv.y=1-uv.y)}}},THREE.EventDispatcher.prototype.apply(THREE.Texture.prototype),THREE.TextureIdCount=0,THREE.CanvasTexture=function(canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){THREE.Texture.call(this,canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.needsUpdate=!0},THREE.CanvasTexture.prototype=Object.create(THREE.Texture.prototype),THREE.CanvasTexture.prototype.constructor=THREE.CanvasTexture,THREE.CubeTexture=function(images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){mapping=void 0!==mapping?mapping:THREE.CubeReflectionMapping,THREE.Texture.call(this,images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.images=images,this.flipY=!1},THREE.CubeTexture.prototype=Object.create(THREE.Texture.prototype),THREE.CubeTexture.prototype.constructor=THREE.CubeTexture,THREE.CubeTexture.prototype.copy=function(source){return THREE.Texture.prototype.copy.call(this,source),this.images=source.images,this},THREE.CompressedTexture=function(mipmaps,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy){THREE.Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.image={width:width,height:height},this.mipmaps=mipmaps,this.flipY=!1,this.generateMipmaps=!1},THREE.CompressedTexture.prototype=Object.create(THREE.Texture.prototype),THREE.CompressedTexture.prototype.constructor=THREE.CompressedTexture,THREE.DataTexture=function(data,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy){THREE.Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.image={data:data,width:width,height:height +},this.magFilter=void 0!==magFilter?magFilter:THREE.NearestFilter,this.minFilter=void 0!==minFilter?minFilter:THREE.NearestFilter,this.flipY=!1,this.generateMipmaps=!1},THREE.DataTexture.prototype=Object.create(THREE.Texture.prototype),THREE.DataTexture.prototype.constructor=THREE.DataTexture,THREE.VideoTexture=function(video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){function update(){requestAnimationFrame(update),video.readyState===video.HAVE_ENOUGH_DATA&&(scope.needsUpdate=!0)}THREE.Texture.call(this,video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy),this.generateMipmaps=!1;var scope=this;update()},THREE.VideoTexture.prototype=Object.create(THREE.Texture.prototype),THREE.VideoTexture.prototype.constructor=THREE.VideoTexture,THREE.Group=function(){THREE.Object3D.call(this),this.type="Group"},THREE.Group.prototype=Object.create(THREE.Object3D.prototype),THREE.Group.prototype.constructor=THREE.Group,THREE.Points=function(geometry,material){THREE.Object3D.call(this),this.type="Points",this.geometry=void 0!==geometry?geometry:new THREE.Geometry,this.material=void 0!==material?material:new THREE.PointsMaterial({color:16777215*Math.random()})},THREE.Points.prototype=Object.create(THREE.Object3D.prototype),THREE.Points.prototype.constructor=THREE.Points,THREE.Points.prototype.raycast=function(){var inverseMatrix=new THREE.Matrix4,ray=new THREE.Ray;return function(raycaster,intersects){function testPoint(point,index){var rayPointDistanceSq=ray.distanceSqToPoint(point);if(localThresholdSq>rayPointDistanceSq){var intersectPoint=ray.closestPointToPoint(point);intersectPoint.applyMatrix4(object.matrixWorld);var distance=raycaster.ray.origin.distanceTo(intersectPoint);if(distanceraycaster.far)return;intersects.push({distance:distance,distanceToRay:Math.sqrt(rayPointDistanceSq),point:intersectPoint.clone(),index:index,face:null,object:object})}}var object=this,geometry=object.geometry,threshold=raycaster.params.Points.threshold;if(inverseMatrix.getInverse(this.matrixWorld),ray.copy(raycaster.ray).applyMatrix4(inverseMatrix),null===geometry.boundingBox||ray.isIntersectionBox(geometry.boundingBox)!==!1){var localThreshold=threshold/((this.scale.x+this.scale.y+this.scale.z)/3),localThresholdSq=localThreshold*localThreshold,position=new THREE.Vector3;if(geometry instanceof THREE.BufferGeometry){var index=geometry.index,attributes=geometry.attributes,positions=attributes.position.array;if(null!==index)for(var indices=index.array,i=0,il=indices.length;il>i;i++){var a=indices[i];position.fromArray(positions,3*a),testPoint(position,a)}else for(var i=0,l=positions.length/3;l>i;i++)position.fromArray(positions,3*i),testPoint(position,i)}else for(var vertices=geometry.vertices,i=0,l=vertices.length;l>i;i++)testPoint(vertices[i],i)}}}(),THREE.Points.prototype.clone=function(){return new this.constructor(this.geometry,this.material).copy(this)},THREE.PointCloud=function(geometry,material){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new THREE.Points(geometry,material)},THREE.ParticleSystem=function(geometry,material){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new THREE.Points(geometry,material)},THREE.Line=function(geometry,material,mode){return 1===mode?(console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new THREE.LineSegments(geometry,material)):(THREE.Object3D.call(this),this.type="Line",this.geometry=void 0!==geometry?geometry:new THREE.Geometry,void(this.material=void 0!==material?material:new THREE.LineBasicMaterial({color:16777215*Math.random()})))},THREE.Line.prototype=Object.create(THREE.Object3D.prototype),THREE.Line.prototype.constructor=THREE.Line,THREE.Line.prototype.raycast=function(){var inverseMatrix=new THREE.Matrix4,ray=new THREE.Ray,sphere=new THREE.Sphere;return function(raycaster,intersects){var precision=raycaster.linePrecision,precisionSq=precision*precision,geometry=this.geometry;if(null===geometry.boundingSphere&&geometry.computeBoundingSphere(),sphere.copy(geometry.boundingSphere),sphere.applyMatrix4(this.matrixWorld),raycaster.ray.isIntersectionSphere(sphere)!==!1){inverseMatrix.getInverse(this.matrixWorld),ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);var vStart=new THREE.Vector3,vEnd=new THREE.Vector3,interSegment=new THREE.Vector3,interRay=new THREE.Vector3,step=this instanceof THREE.LineSegments?2:1;if(geometry instanceof THREE.BufferGeometry){var index=geometry.index,attributes=geometry.attributes;if(null!==index)for(var indices=index.array,positions=attributes.position.array,i=0,l=indices.length-1;l>i;i+=step){var a=indices[i],b=indices[i+1];vStart.fromArray(positions,3*a),vEnd.fromArray(positions,3*b);var distSq=ray.distanceSqToSegment(vStart,vEnd,interRay,interSegment);if(!(distSq>precisionSq)){interRay.applyMatrix4(this.matrixWorld);var distance=raycaster.ray.origin.distanceTo(interRay);distanceraycaster.far||intersects.push({distance:distance,point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else for(var positions=attributes.position.array,i=0,l=positions.length/3-1;l>i;i+=step){vStart.fromArray(positions,3*i),vEnd.fromArray(positions,3*i+3);var distSq=ray.distanceSqToSegment(vStart,vEnd,interRay,interSegment);if(!(distSq>precisionSq)){interRay.applyMatrix4(this.matrixWorld);var distance=raycaster.ray.origin.distanceTo(interRay);distanceraycaster.far||intersects.push({distance:distance,point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}else if(geometry instanceof THREE.Geometry)for(var vertices=geometry.vertices,nbVertices=vertices.length,i=0;nbVertices-1>i;i+=step){var distSq=ray.distanceSqToSegment(vertices[i],vertices[i+1],interRay,interSegment);if(!(distSq>precisionSq)){interRay.applyMatrix4(this.matrixWorld);var distance=raycaster.ray.origin.distanceTo(interRay);distanceraycaster.far||intersects.push({distance:distance,point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}}}(),THREE.Line.prototype.clone=function(){return new this.constructor(this.geometry,this.material).copy(this)},THREE.LineStrip=0,THREE.LinePieces=1,THREE.LineSegments=function(geometry,material){THREE.Line.call(this,geometry,material),this.type="LineSegments"},THREE.LineSegments.prototype=Object.create(THREE.Line.prototype),THREE.LineSegments.prototype.constructor=THREE.LineSegments,THREE.Mesh=function(geometry,material){THREE.Object3D.call(this),this.type="Mesh",this.geometry=void 0!==geometry?geometry:new THREE.Geometry,this.material=void 0!==material?material:new THREE.MeshBasicMaterial({color:16777215*Math.random()}),this.updateMorphTargets()},THREE.Mesh.prototype=Object.create(THREE.Object3D.prototype),THREE.Mesh.prototype.constructor=THREE.Mesh,THREE.Mesh.prototype.updateMorphTargets=function(){if(void 0!==this.geometry.morphTargets&&this.geometry.morphTargets.length>0){this.morphTargetBase=-1,this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var m=0,ml=this.geometry.morphTargets.length;ml>m;m++)this.morphTargetInfluences.push(0),this.morphTargetDictionary[this.geometry.morphTargets[m].name]=m}},THREE.Mesh.prototype.getMorphTargetIndexByName=function(name){return void 0!==this.morphTargetDictionary[name]?this.morphTargetDictionary[name]:(console.warn("THREE.Mesh.getMorphTargetIndexByName: morph target "+name+" does not exist. Returning 0."),0)},THREE.Mesh.prototype.raycast=function(){function uvIntersection(point,p1,p2,p3,uv1,uv2,uv3){return THREE.Triangle.barycoordFromPoint(point,p1,p2,p3,barycoord),uv1.multiplyScalar(barycoord.x),uv2.multiplyScalar(barycoord.y),uv3.multiplyScalar(barycoord.z),uv1.add(uv2).add(uv3),uv1.clone()}function checkIntersection(object,raycaster,ray,pA,pB,pC,point){var intersect,material=object.material;if(intersect=material.side===THREE.BackSide?ray.intersectTriangle(pC,pB,pA,!0,point):ray.intersectTriangle(pA,pB,pC,material.side!==THREE.DoubleSide,point),null===intersect)return null;intersectionPointWorld.copy(point),intersectionPointWorld.applyMatrix4(object.matrixWorld);var distance=raycaster.ray.origin.distanceTo(intersectionPointWorld);return distanceraycaster.far?null:{distance:distance,point:intersectionPointWorld.clone(),object:object}}function checkBufferGeometryIntersection(object,raycaster,ray,positions,uvs,a,b,c){vA.fromArray(positions,3*a),vB.fromArray(positions,3*b),vC.fromArray(positions,3*c);var intersection=checkIntersection(object,raycaster,ray,vA,vB,vC,intersectionPoint);return intersection&&(uvs&&(uvA.fromArray(uvs,2*a),uvB.fromArray(uvs,2*b),uvC.fromArray(uvs,2*c),intersection.uv=uvIntersection(intersectionPoint,vA,vB,vC,uvA,uvB,uvC)),intersection.face=new THREE.Face3(a,b,c,THREE.Triangle.normal(vA,vB,vC)),intersection.faceIndex=a),intersection}var inverseMatrix=new THREE.Matrix4,ray=new THREE.Ray,sphere=new THREE.Sphere,vA=new THREE.Vector3,vB=new THREE.Vector3,vC=new THREE.Vector3,tempA=new THREE.Vector3,tempB=new THREE.Vector3,tempC=new THREE.Vector3,uvA=new THREE.Vector2,uvB=new THREE.Vector2,uvC=new THREE.Vector2,barycoord=new THREE.Vector3,intersectionPoint=new THREE.Vector3,intersectionPointWorld=new THREE.Vector3;return function(raycaster,intersects){var geometry=this.geometry,material=this.material;if(void 0!==material){null===geometry.boundingSphere&&geometry.computeBoundingSphere();var matrixWorld=this.matrixWorld;if(sphere.copy(geometry.boundingSphere),sphere.applyMatrix4(matrixWorld),raycaster.ray.isIntersectionSphere(sphere)!==!1&&(inverseMatrix.getInverse(matrixWorld),ray.copy(raycaster.ray).applyMatrix4(inverseMatrix),null===geometry.boundingBox||ray.isIntersectionBox(geometry.boundingBox)!==!1)){var uvs,intersection;if(geometry instanceof THREE.BufferGeometry){var a,b,c,index=geometry.index,attributes=geometry.attributes,positions=attributes.position.array;if(void 0!==attributes.uv&&(uvs=attributes.uv.array),null!==index)for(var indices=index.array,i=0,l=indices.length;l>i;i+=3)a=indices[i],b=indices[i+1],c=indices[i+2],intersection=checkBufferGeometryIntersection(this,raycaster,ray,positions,uvs,a,b,c),intersection&&(intersection.faceIndex=Math.floor(i/3),intersects.push(intersection));else for(var i=0,l=positions.length;l>i;i+=9)a=i/3,b=a+1,c=a+2,intersection=checkBufferGeometryIntersection(this,raycaster,ray,positions,uvs,a,b,c),intersection&&(intersection.index=a,intersects.push(intersection))}else if(geometry instanceof THREE.Geometry){var fvA,fvB,fvC,isFaceMaterial=material instanceof THREE.MeshFaceMaterial,materials=isFaceMaterial===!0?material.materials:null,vertices=geometry.vertices,faces=geometry.faces,faceVertexUvs=geometry.faceVertexUvs[0];faceVertexUvs.length>0&&(uvs=faceVertexUvs);for(var f=0,fl=faces.length;fl>f;f++){var face=faces[f],faceMaterial=isFaceMaterial===!0?materials[face.materialIndex]:material;if(void 0!==faceMaterial){if(fvA=vertices[face.a],fvB=vertices[face.b],fvC=vertices[face.c],faceMaterial.morphTargets===!0){var morphTargets=geometry.morphTargets,morphInfluences=this.morphTargetInfluences;vA.set(0,0,0),vB.set(0,0,0),vC.set(0,0,0);for(var t=0,tl=morphTargets.length;tl>t;t++){var influence=morphInfluences[t];if(0!==influence){var targets=morphTargets[t].vertices;vA.addScaledVector(tempA.subVectors(targets[face.a],fvA),influence),vB.addScaledVector(tempB.subVectors(targets[face.b],fvB),influence),vC.addScaledVector(tempC.subVectors(targets[face.c],fvC),influence)}}vA.add(fvA),vB.add(fvB),vC.add(fvC),fvA=vA,fvB=vB,fvC=vC}if(intersection=checkIntersection(this,raycaster,ray,fvA,fvB,fvC,intersectionPoint)){if(uvs){var uvs_f=uvs[f];uvA.copy(uvs_f[0]),uvB.copy(uvs_f[1]),uvC.copy(uvs_f[2]),intersection.uv=uvIntersection(intersectionPoint,fvA,fvB,fvC,uvA,uvB,uvC)}intersection.face=face,intersection.faceIndex=f,intersects.push(intersection)}}}}}}}}(),THREE.Mesh.prototype.clone=function(){return new this.constructor(this.geometry,this.material).copy(this)},THREE.Bone=function(skin){THREE.Object3D.call(this),this.type="Bone",this.skin=skin},THREE.Bone.prototype=Object.create(THREE.Object3D.prototype),THREE.Bone.prototype.constructor=THREE.Bone,THREE.Bone.prototype.copy=function(source){return THREE.Object3D.prototype.copy.call(this,source),this.skin=source.skin,this},THREE.Skeleton=function(bones,boneInverses,useVertexTexture){if(this.useVertexTexture=void 0!==useVertexTexture?useVertexTexture:!0,this.identityMatrix=new THREE.Matrix4,bones=bones||[],this.bones=bones.slice(0),this.useVertexTexture){var size=Math.sqrt(4*this.bones.length);size=THREE.Math.nextPowerOfTwo(Math.ceil(size)),size=Math.max(size,4),this.boneTextureWidth=size,this.boneTextureHeight=size,this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4),this.boneTexture=new THREE.DataTexture(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,THREE.RGBAFormat,THREE.FloatType)}else this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===boneInverses)this.calculateInverses();else if(this.bones.length===boneInverses.length)this.boneInverses=boneInverses.slice(0);else{console.warn("THREE.Skeleton bonInverses is the wrong length."),this.boneInverses=[];for(var b=0,bl=this.bones.length;bl>b;b++)this.boneInverses.push(new THREE.Matrix4)}},THREE.Skeleton.prototype.calculateInverses=function(){this.boneInverses=[];for(var b=0,bl=this.bones.length;bl>b;b++){var inverse=new THREE.Matrix4;this.bones[b]&&inverse.getInverse(this.bones[b].matrixWorld),this.boneInverses.push(inverse)}},THREE.Skeleton.prototype.pose=function(){for(var bone,b=0,bl=this.bones.length;bl>b;b++)bone=this.bones[b],bone&&bone.matrixWorld.getInverse(this.boneInverses[b]);for(var b=0,bl=this.bones.length;bl>b;b++)bone=this.bones[b],bone&&(bone.parent?(bone.matrix.getInverse(bone.parent.matrixWorld),bone.matrix.multiply(bone.matrixWorld)):bone.matrix.copy(bone.matrixWorld),bone.matrix.decompose(bone.position,bone.quaternion,bone.scale))},THREE.Skeleton.prototype.update=function(){var offsetMatrix=new THREE.Matrix4;return function(){for(var b=0,bl=this.bones.length;bl>b;b++){var matrix=this.bones[b]?this.bones[b].matrixWorld:this.identityMatrix;offsetMatrix.multiplyMatrices(matrix,this.boneInverses[b]),offsetMatrix.flattenToArrayOffset(this.boneMatrices,16*b)}this.useVertexTexture&&(this.boneTexture.needsUpdate=!0)}}(),THREE.Skeleton.prototype.clone=function(){return new THREE.Skeleton(this.bones,this.boneInverses,this.useVertexTexture)},THREE.SkinnedMesh=function(geometry,material,useVertexTexture){THREE.Mesh.call(this,geometry,material),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new THREE.Matrix4,this.bindMatrixInverse=new THREE.Matrix4;var bones=[];if(this.geometry&&void 0!==this.geometry.bones){for(var bone,gbone,b=0,bl=this.geometry.bones.length;bl>b;++b)gbone=this.geometry.bones[b],bone=new THREE.Bone(this),bones.push(bone),bone.name=gbone.name,bone.position.fromArray(gbone.pos),bone.quaternion.fromArray(gbone.rotq),void 0!==gbone.scl&&bone.scale.fromArray(gbone.scl);for(var b=0,bl=this.geometry.bones.length;bl>b;++b)gbone=this.geometry.bones[b],-1!==gbone.parent&&null!==gbone.parent?bones[gbone.parent].add(bones[b]):this.add(bones[b])}this.normalizeSkinWeights(),this.updateMatrixWorld(!0),this.bind(new THREE.Skeleton(bones,void 0,useVertexTexture),this.matrixWorld)},THREE.SkinnedMesh.prototype=Object.create(THREE.Mesh.prototype),THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh,THREE.SkinnedMesh.prototype.bind=function(skeleton,bindMatrix){this.skeleton=skeleton,void 0===bindMatrix&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),bindMatrix=this.matrixWorld),this.bindMatrix.copy(bindMatrix),this.bindMatrixInverse.getInverse(bindMatrix)},THREE.SkinnedMesh.prototype.pose=function(){this.skeleton.pose()},THREE.SkinnedMesh.prototype.normalizeSkinWeights=function(){if(this.geometry instanceof THREE.Geometry)for(var i=0;ii&&!(distance1){v1.setFromMatrixPosition(camera.matrixWorld),v2.setFromMatrixPosition(this.matrixWorld);var distance=v1.distanceTo(v2);levels[0].object.visible=!0;for(var i=1,l=levels.length;l>i&&distance>=levels[i].distance;i++)levels[i-1].object.visible=!1,levels[i].object.visible=!0;for(;l>i;i++)levels[i].object.visible=!1}}}(),THREE.LOD.prototype.copy=function(source){THREE.Object3D.prototype.copy.call(this,source,!1);for(var levels=source.levels,i=0,l=levels.length;l>i;i++){var level=levels[i];this.addLevel(level.object.clone(),level.distance)}return this},THREE.LOD.prototype.toJSON=function(meta){var data=THREE.Object3D.prototype.toJSON.call(this,meta);data.object.levels=[];for(var levels=this.levels,i=0,l=levels.length;l>i;i++){var level=levels[i];data.object.levels.push({object:level.object.uuid,distance:level.distance})}return data},THREE.Sprite=function(){var indices=new Uint16Array([0,1,2,0,2,3]),vertices=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),uvs=new Float32Array([0,0,1,0,1,1,0,1]),geometry=new THREE.BufferGeometry;return geometry.setIndex(new THREE.BufferAttribute(indices,1)),geometry.addAttribute("position",new THREE.BufferAttribute(vertices,3)),geometry.addAttribute("uv",new THREE.BufferAttribute(uvs,2)),function(material){THREE.Object3D.call(this),this.type="Sprite",this.geometry=geometry,this.material=void 0!==material?material:new THREE.SpriteMaterial}}(),THREE.Sprite.prototype=Object.create(THREE.Object3D.prototype),THREE.Sprite.prototype.constructor=THREE.Sprite,THREE.Sprite.prototype.raycast=function(){var matrixPosition=new THREE.Vector3;return function(raycaster,intersects){matrixPosition.setFromMatrixPosition(this.matrixWorld);var distanceSq=raycaster.ray.distanceSqToPoint(matrixPosition),guessSizeSq=this.scale.x*this.scale.y;distanceSq>guessSizeSq||intersects.push({distance:Math.sqrt(distanceSq),point:this.position,face:null,object:this})}}(),THREE.Sprite.prototype.clone=function(){return new this.constructor(this.material).copy(this)},THREE.Particle=THREE.Sprite,THREE.LensFlare=function(texture,size,distance,blending,color){THREE.Object3D.call(this),this.lensFlares=[],this.positionScreen=new THREE.Vector3,this.customUpdateCallback=void 0,void 0!==texture&&this.add(texture,size,distance,blending,color)},THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype),THREE.LensFlare.prototype.constructor=THREE.LensFlare,THREE.LensFlare.prototype.add=function(texture,size,distance,blending,color,opacity){void 0===size&&(size=-1),void 0===distance&&(distance=0),void 0===opacity&&(opacity=1),void 0===color&&(color=new THREE.Color(16777215)),void 0===blending&&(blending=THREE.NormalBlending),distance=Math.min(distance,Math.max(0,distance)),this.lensFlares.push({texture:texture,size:size,distance:distance,x:0,y:0,z:0,scale:1,rotation:0,opacity:opacity,color:color,blending:blending})},THREE.LensFlare.prototype.updateLensFlares=function(){var f,flare,fl=this.lensFlares.length,vecX=2*-this.positionScreen.x,vecY=2*-this.positionScreen.y;for(f=0;fl>f;f++)flare=this.lensFlares[f],flare.x=this.positionScreen.x+vecX*flare.distance,flare.y=this.positionScreen.y+vecY*flare.distance,flare.wantedRotation=flare.x*Math.PI*.25,flare.rotation+=.25*(flare.wantedRotation-flare.rotation)},THREE.LensFlare.prototype.copy=function(source){THREE.Object3D.prototype.copy.call(this,source),this.positionScreen.copy(source.positionScreen),this.customUpdateCallback=source.customUpdateCallback;for(var i=0,l=source.lensFlares.length;l>i;i++)this.lensFlares.push(source.lensFlares[i]);return this},THREE.Scene=function(){THREE.Object3D.call(this),this.type="Scene",this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0},THREE.Scene.prototype=Object.create(THREE.Object3D.prototype),THREE.Scene.prototype.constructor=THREE.Scene,THREE.Scene.prototype.copy=function(source){return THREE.Object3D.prototype.copy.call(this,source),null!==source.fog&&(this.fog=source.fog.clone()),null!==source.overrideMaterial&&(this.overrideMaterial=source.overrideMaterial.clone()),this.autoUpdate=source.autoUpdate,this.matrixAutoUpdate=source.matrixAutoUpdate,this},THREE.Fog=function(color,near,far){this.name="",this.color=new THREE.Color(color),this.near=void 0!==near?near:1,this.far=void 0!==far?far:1e3},THREE.Fog.prototype.clone=function(){return new THREE.Fog(this.color.getHex(),this.near,this.far)},THREE.FogExp2=function(color,density){this.name="",this.color=new THREE.Color(color),this.density=void 0!==density?density:25e-5},THREE.FogExp2.prototype.clone=function(){return new THREE.FogExp2(this.color.getHex(),this.density)},THREE.ShaderChunk={},THREE.ShaderChunk.alphamap_fragment="#ifdef USE_ALPHAMAP\n\n diffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n",THREE.ShaderChunk.alphamap_pars_fragment="#ifdef USE_ALPHAMAP\n\n uniform sampler2D alphaMap;\n\n#endif\n",THREE.ShaderChunk.alphatest_fragment="#ifdef ALPHATEST\n\n if ( diffuseColor.a < ALPHATEST ) discard;\n\n#endif\n",THREE.ShaderChunk.aomap_fragment="#ifdef USE_AOMAP\n\n totalAmbientLight *= ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n#endif\n",THREE.ShaderChunk.aomap_pars_fragment="#ifdef USE_AOMAP\n\n uniform sampler2D aoMap;\n uniform float aoMapIntensity;\n\n#endif",THREE.ShaderChunk.begin_vertex="\nvec3 transformed = vec3( position );\n",THREE.ShaderChunk.beginnormal_vertex="\nvec3 objectNormal = vec3( normal );\n",THREE.ShaderChunk.bumpmap_pars_fragment="#ifdef USE_BUMPMAP\n\n uniform sampler2D bumpMap;\n uniform float bumpScale;\n\n\n\n vec2 dHdxy_fwd() {\n\n vec2 dSTdx = dFdx( vUv );\n vec2 dSTdy = dFdy( vUv );\n\n float Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n return vec2( dBx, dBy );\n\n }\n\n vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\n vec3 vSigmaX = dFdx( surf_pos );\n vec3 vSigmaY = dFdy( surf_pos );\n vec3 vN = surf_norm;\n vec3 R1 = cross( vSigmaY, vN );\n vec3 R2 = cross( vN, vSigmaX );\n\n float fDet = dot( vSigmaX, R1 );\n\n vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n return normalize( abs( fDet ) * surf_norm - vGrad );\n\n }\n\n#endif\n",THREE.ShaderChunk.color_fragment="#ifdef USE_COLOR\n\n diffuseColor.rgb *= vColor;\n\n#endif",THREE.ShaderChunk.color_pars_fragment="#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif\n",THREE.ShaderChunk.color_pars_vertex="#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif",THREE.ShaderChunk.color_vertex="#ifdef USE_COLOR\n\n vColor.xyz = color.xyz;\n\n#endif",THREE.ShaderChunk.common="#define PI 3.14159\n#define PI2 6.28318\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\n\nvec3 transformDirection( in vec3 normal, in mat4 matrix ) {\n\n return normalize( ( matrix * vec4( normal, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {\n\n return normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );\n\n}\n\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n float distance = dot( planeNormal, point - pointOnPlane );\n\n return - distance * planeNormal + point;\n\n}\n\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n return sign( dot( point - pointOnPlane, planeNormal ) );\n\n}\n\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n return lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n\n}\n\nfloat calcLightAttenuation( float lightDistance, float cutoffDistance, float decayExponent ) {\n\n if ( decayExponent > 0.0 ) {\n\n return pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n }\n\n return 1.0;\n\n}\n\nvec3 F_Schlick( in vec3 specularColor, in float dotLH ) {\n\n\n float fresnel = exp2( ( -5.55437 * dotLH - 6.98316 ) * dotLH );\n\n return ( 1.0 - specularColor ) * fresnel + specularColor;\n\n}\n\nfloat G_BlinnPhong_Implicit( /* in float dotNL, in float dotNV */ ) {\n\n\n return 0.25;\n\n}\n\nfloat D_BlinnPhong( in float shininess, in float dotNH ) {\n\n\n return ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( in vec3 specularColor, in float shininess, in vec3 normal, in vec3 lightDir, in vec3 viewDir ) {\n\n vec3 halfDir = normalize( lightDir + viewDir );\n\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotLH = saturate( dot( lightDir, halfDir ) );\n\n vec3 F = F_Schlick( specularColor, dotLH );\n\n float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n float D = D_BlinnPhong( shininess, dotNH );\n\n return F * G * D;\n\n}\n\nvec3 inputToLinear( in vec3 a ) {\n\n #ifdef GAMMA_INPUT\n\n return pow( a, vec3( float( GAMMA_FACTOR ) ) );\n\n #else\n\n return a;\n\n #endif\n\n}\n\nvec3 linearToOutput( in vec3 a ) {\n\n #ifdef GAMMA_OUTPUT\n\n return pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );\n\n #else\n\n return a;\n\n #endif\n\n}\n",THREE.ShaderChunk.defaultnormal_vertex="#ifdef FLIP_SIDED\n\n objectNormal = -objectNormal;\n\n#endif\n\nvec3 transformedNormal = normalMatrix * objectNormal;\n",THREE.ShaderChunk.displacementmap_vertex="#ifdef USE_DISPLACEMENTMAP\n\n transformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n\n#endif\n",THREE.ShaderChunk.displacementmap_pars_vertex="#ifdef USE_DISPLACEMENTMAP\n\n uniform sampler2D displacementMap;\n uniform float displacementScale;\n uniform float displacementBias;\n\n#endif\n",THREE.ShaderChunk.emissivemap_fragment="#ifdef USE_EMISSIVEMAP\n\n vec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n emissiveColor.rgb = inputToLinear( emissiveColor.rgb );\n\n totalEmissiveLight *= emissiveColor.rgb;\n\n#endif\n",THREE.ShaderChunk.emissivemap_pars_fragment="#ifdef USE_EMISSIVEMAP\n\n uniform sampler2D emissiveMap;\n\n#endif\n",THREE.ShaderChunk.envmap_fragment="#ifdef USE_ENVMAP\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n #else\n\n vec3 reflectVec = vReflect;\n\n #endif\n\n #ifdef DOUBLE_SIDED\n float flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n #else\n float flipNormal = 1.0;\n #endif\n\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n #elif defined( ENVMAP_TYPE_EQUIREC )\n vec2 sampleUV;\n sampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n sampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n vec4 envColor = texture2D( envMap, sampleUV );\n\n #elif defined( ENVMAP_TYPE_SPHERE )\n vec3 reflectView = flipNormal * normalize((viewMatrix * vec4( reflectVec, 0.0 )).xyz + vec3(0.0,0.0,1.0));\n vec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n #endif\n\n envColor.xyz = inputToLinear( envColor.xyz );\n\n #ifdef ENVMAP_BLENDING_MULTIPLY\n\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_MIX )\n\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_ADD )\n\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n #endif\n\n#endif\n",THREE.ShaderChunk.envmap_pars_fragment="#ifdef USE_ENVMAP\n\n uniform float reflectivity;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n uniform float flipEnvMap;\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n uniform float refractionRatio;\n\n #else\n\n varying vec3 vReflect;\n\n #endif\n\n#endif\n",THREE.ShaderChunk.envmap_pars_vertex="#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n varying vec3 vReflect;\n\n uniform float refractionRatio;\n\n#endif\n",THREE.ShaderChunk.envmap_vertex="#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vReflect = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n#endif\n",THREE.ShaderChunk.fog_fragment="#ifdef USE_FOG\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n float depth = gl_FragDepthEXT / gl_FragCoord.w;\n\n #else\n\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n\n #endif\n\n #ifdef FOG_EXP2\n\n float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\n #else\n\n float fogFactor = smoothstep( fogNear, fogFar, depth );\n\n #endif\n \n outgoingLight = mix( outgoingLight, fogColor, fogFactor );\n\n#endif",THREE.ShaderChunk.fog_pars_fragment="#ifdef USE_FOG\n\n uniform vec3 fogColor;\n\n #ifdef FOG_EXP2\n\n uniform float fogDensity;\n\n #else\n\n uniform float fogNear;\n uniform float fogFar;\n #endif\n\n#endif",THREE.ShaderChunk.hemilight_fragment="#if MAX_HEMI_LIGHTS > 0\n\n for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lightDir = hemisphereLightDirection[ i ];\n\n float dotProduct = dot( normal, lightDir );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vec3 lightColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n totalAmbientLight += lightColor;\n\n }\n\n#endif\n\n", +THREE.ShaderChunk.lightmap_fragment="#ifdef USE_LIGHTMAP\n\n totalAmbientLight += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\n#endif\n",THREE.ShaderChunk.lightmap_pars_fragment="#ifdef USE_LIGHTMAP\n\n uniform sampler2D lightMap;\n uniform float lightMapIntensity;\n\n#endif",THREE.ShaderChunk.lights_lambert_pars_vertex="#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n",THREE.ShaderChunk.lights_lambert_vertex="vLightFront = vec3( 0.0 );\n\n#ifdef DOUBLE_SIDED\n\n vLightBack = vec3( 0.0 );\n\n#endif\n\nvec3 normal = normalize( transformedNormal );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec3 lightColor = pointLightColor[ i ];\n\n vec3 lVector = pointLightPosition[ i ] - mvPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * attenuation * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n #endif\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec3 lightColor = spotLightColor[ i ];\n\n vec3 lightPosition = spotLightPosition[ i ];\n vec3 lVector = lightPosition - mvPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n attenuation *= spotEffect;\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * attenuation * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n #endif\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 lightColor = directionalLightColor[ i ];\n\n vec3 lightDir = directionalLightDirection[ i ];\n\n\n float dotProduct = dot( normal, lightDir );\n\n vLightFront += lightColor * saturate( dotProduct );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += lightColor * saturate( - dotProduct );\n\n #endif\n\n }\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lightDir = hemisphereLightDirection[ i ];\n\n\n float dotProduct = dot( normal, lightDir );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n #ifdef DOUBLE_SIDED\n\n float hemiDiffuseWeightBack = - 0.5 * dotProduct + 0.5;\n\n vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n\n #endif\n\n }\n\n#endif\n",THREE.ShaderChunk.lights_phong_fragment="vec3 viewDir = normalize( vViewPosition );\n\nvec3 totalDiffuseLight = vec3( 0.0 );\nvec3 totalSpecularLight = vec3( 0.0 );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec3 lightColor = pointLightColor[ i ];\n\n vec3 lightPosition = pointLightPosition[ i ];\n vec3 lVector = lightPosition + vViewPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec3 lightColor = spotLightColor[ i ];\n\n vec3 lightPosition = spotLightPosition[ i ];\n vec3 lVector = lightPosition + vViewPosition.xyz;\n vec3 lightDir = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n attenuation *= spotEffect;\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 lightColor = directionalLightColor[ i ];\n\n vec3 lightDir = directionalLightDirection[ i ];\n\n\n float cosineTerm = saturate( dot( normal, lightDir ) );\n\n totalDiffuseLight += lightColor * cosineTerm;\n\n\n vec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n totalSpecularLight += brdf * specularStrength * lightColor * cosineTerm;\n\n }\n\n#endif\n",THREE.ShaderChunk.lights_phong_pars_fragment="uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\nvarying vec3 vViewPosition;\n\n#ifndef FLAT_SHADED\n\n varying vec3 vNormal;\n\n#endif\n",THREE.ShaderChunk.lights_phong_pars_vertex="#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\n#endif\n",THREE.ShaderChunk.lights_phong_vertex="#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n vWorldPosition = worldPosition.xyz;\n\n#endif\n",THREE.ShaderChunk.linear_to_gamma_fragment="\n outgoingLight = linearToOutput( outgoingLight );\n",THREE.ShaderChunk.logdepthbuf_fragment="#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\n gl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n\n#endif",THREE.ShaderChunk.logdepthbuf_pars_fragment="#ifdef USE_LOGDEPTHBUF\n\n uniform float logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n#endif\n",THREE.ShaderChunk.logdepthbuf_pars_vertex="#ifdef USE_LOGDEPTHBUF\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n uniform float logDepthBufFC;\n\n#endif",THREE.ShaderChunk.logdepthbuf_vertex="#ifdef USE_LOGDEPTHBUF\n\n gl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n vFragDepth = 1.0 + gl_Position.w;\n\n#else\n\n gl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\n #endif\n\n#endif",THREE.ShaderChunk.map_fragment="#ifdef USE_MAP\n\n vec4 texelColor = texture2D( map, vUv );\n\n texelColor.xyz = inputToLinear( texelColor.xyz );\n\n diffuseColor *= texelColor;\n\n#endif\n",THREE.ShaderChunk.map_pars_fragment="#ifdef USE_MAP\n\n uniform sampler2D map;\n\n#endif",THREE.ShaderChunk.map_particle_fragment="#ifdef USE_MAP\n\n diffuseColor *= texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\n#endif\n",THREE.ShaderChunk.map_particle_pars_fragment="#ifdef USE_MAP\n\n uniform vec4 offsetRepeat;\n uniform sampler2D map;\n\n#endif\n",THREE.ShaderChunk.morphnormal_vertex="#ifdef USE_MORPHNORMALS\n\n objectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n objectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n objectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n objectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n\n#endif\n",THREE.ShaderChunk.morphtarget_pars_vertex="#ifdef USE_MORPHTARGETS\n\n #ifndef USE_MORPHNORMALS\n\n uniform float morphTargetInfluences[ 8 ];\n\n #else\n\n uniform float morphTargetInfluences[ 4 ];\n\n #endif\n\n#endif",THREE.ShaderChunk.morphtarget_vertex="#ifdef USE_MORPHTARGETS\n\n transformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n transformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n transformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n transformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\n #ifndef USE_MORPHNORMALS\n\n transformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n transformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n transformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n transformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\n #endif\n\n#endif\n",THREE.ShaderChunk.normal_phong_fragment="#ifndef FLAT_SHADED\n\n vec3 normal = normalize( vNormal );\n\n #ifdef DOUBLE_SIDED\n\n normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n\n #endif\n\n#else\n\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n\n#endif\n\n#ifdef USE_NORMALMAP\n\n normal = perturbNormal2Arb( -vViewPosition, normal );\n\n#elif defined( USE_BUMPMAP )\n\n normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n\n#endif\n\n",THREE.ShaderChunk.normalmap_pars_fragment="#ifdef USE_NORMALMAP\n\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n\n\n vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\n vec3 q0 = dFdx( eye_pos.xyz );\n vec3 q1 = dFdy( eye_pos.xyz );\n vec2 st0 = dFdx( vUv.st );\n vec2 st1 = dFdy( vUv.st );\n\n vec3 S = normalize( q0 * st1.t - q1 * st0.t );\n vec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n vec3 N = normalize( surf_norm );\n\n vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n mapN.xy = normalScale * mapN.xy;\n mat3 tsn = mat3( S, T, N );\n return normalize( tsn * mapN );\n\n }\n\n#endif\n",THREE.ShaderChunk.project_vertex="#ifdef USE_SKINNING\n\n vec4 mvPosition = modelViewMatrix * skinned;\n\n#else\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\n#endif\n\ngl_Position = projectionMatrix * mvPosition;\n",THREE.ShaderChunk.shadowmap_fragment="#ifdef USE_SHADOWMAP\n\n for ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n float texelSizeY = 1.0 / shadowMapSize[ i ].y;\n\n float shadow = 0.0;\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n bool isPointLight = shadowDarkness[ i ] < 0.0;\n\n if ( isPointLight ) {\n\n float realShadowDarkness = abs( shadowDarkness[ i ] );\n\n vec3 lightToPosition = vShadowCoord[ i ].xyz;\n\n #if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n vec3 bd3D = normalize( lightToPosition );\n float dp = length( lightToPosition );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n\n #if defined( SHADOWMAP_TYPE_PCF )\n const float Dr = 1.25;\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n const float Dr = 2.25;\n #endif\n\n float os = Dr * 2.0 * texelSizeY;\n\n const vec3 Gsd = vec3( - 1, 0, 1 );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n shadow *= realShadowDarkness * ( 1.0 / 21.0 );\n\n #else \n vec3 bd3D = normalize( lightToPosition );\n float dp = length( lightToPosition );\n\n adjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n shadow *= realShadowDarkness;\n\n #endif\n\n } else {\n\n#endif \n float texelSizeX = 1.0 / shadowMapSize[ i ].x;\n\n vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\n\n\n bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n bool inFrustum = all( inFrustumVec );\n\n bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n bool frustumTest = all( frustumTestVec );\n\n if ( frustumTest ) {\n\n #if defined( SHADOWMAP_TYPE_PCF )\n\n\n /*\n for ( float y = -1.25; y <= 1.25; y += 1.25 )\n for ( float x = -1.25; x <= 1.25; x += 1.25 ) {\n vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n if ( fDepth < shadowCoord.z )\n shadow += 1.0;\n }\n shadow /= 9.0;\n */\n\n shadowCoord.z += shadowBias[ i ];\n\n const float ShadowDelta = 1.0 / 9.0;\n\n float xPixelOffset = texelSizeX;\n float yPixelOffset = texelSizeY;\n\n float dx0 = - 1.25 * xPixelOffset;\n float dy0 = - 1.25 * yPixelOffset;\n float dx1 = 1.25 * xPixelOffset;\n float dy1 = 1.25 * yPixelOffset;\n\n float fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n shadow *= shadowDarkness[ i ];\n\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\n shadowCoord.z += shadowBias[ i ];\n\n float xPixelOffset = texelSizeX;\n float yPixelOffset = texelSizeY;\n\n float dx0 = - 1.0 * xPixelOffset;\n float dy0 = - 1.0 * yPixelOffset;\n float dx1 = 1.0 * xPixelOffset;\n float dy1 = 1.0 * yPixelOffset;\n\n mat3 shadowKernel;\n mat3 depthKernel;\n\n depthKernel[ 0 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n depthKernel[ 0 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n depthKernel[ 0 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n depthKernel[ 1 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n depthKernel[ 1 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n depthKernel[ 1 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n depthKernel[ 2 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n depthKernel[ 2 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n depthKernel[ 2 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\n vec3 shadowZ = vec3( shadowCoord.z );\n shadowKernel[ 0 ] = vec3( lessThan( depthKernel[ 0 ], shadowZ ) );\n shadowKernel[ 0 ] *= vec3( 0.25 );\n\n shadowKernel[ 1 ] = vec3( lessThan( depthKernel[ 1 ], shadowZ ) );\n shadowKernel[ 1 ] *= vec3( 0.25 );\n\n shadowKernel[ 2 ] = vec3( lessThan( depthKernel[ 2 ], shadowZ ) );\n shadowKernel[ 2 ] *= vec3( 0.25 );\n\n vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[ i ].xy );\n\n shadowKernel[ 0 ] = mix( shadowKernel[ 1 ], shadowKernel[ 0 ], fractionalCoord.x );\n shadowKernel[ 1 ] = mix( shadowKernel[ 2 ], shadowKernel[ 1 ], fractionalCoord.x );\n\n vec4 shadowValues;\n shadowValues.x = mix( shadowKernel[ 0 ][ 1 ], shadowKernel[ 0 ][ 0 ], fractionalCoord.y );\n shadowValues.y = mix( shadowKernel[ 0 ][ 2 ], shadowKernel[ 0 ][ 1 ], fractionalCoord.y );\n shadowValues.z = mix( shadowKernel[ 1 ][ 1 ], shadowKernel[ 1 ][ 0 ], fractionalCoord.y );\n shadowValues.w = mix( shadowKernel[ 1 ][ 2 ], shadowKernel[ 1 ][ 1 ], fractionalCoord.y );\n\n shadow = dot( shadowValues, vec4( 1.0 ) ) * shadowDarkness[ i ];\n\n #else \n shadowCoord.z += shadowBias[ i ];\n\n vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n\n if ( fDepth < shadowCoord.z )\n shadow = shadowDarkness[ i ];\n\n #endif\n\n }\n\n#ifdef SHADOWMAP_DEBUG\n\n if ( inFrustum ) {\n\n if ( i == 0 ) {\n\n outgoingLight *= vec3( 1.0, 0.5, 0.0 );\n\n } else if ( i == 1 ) {\n\n outgoingLight *= vec3( 0.0, 1.0, 0.8 );\n\n } else {\n\n outgoingLight *= vec3( 0.0, 0.5, 1.0 );\n\n }\n\n }\n\n#endif\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n }\n\n#endif\n\n shadowMask = shadowMask * vec3( 1.0 - shadow );\n\n }\n\n#endif\n",THREE.ShaderChunk.shadowmap_pars_fragment="#ifdef USE_SHADOWMAP\n\n uniform sampler2D shadowMap[ MAX_SHADOWS ];\n uniform vec2 shadowMapSize[ MAX_SHADOWS ];\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform float shadowBias[ MAX_SHADOWS ];\n\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n float unpackDepth( const in vec4 rgba_depth ) {\n\n const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n float depth = dot( rgba_depth, bit_shift );\n return depth;\n\n }\n\n #if defined(POINT_LIGHT_SHADOWS)\n\n\n void adjustShadowValue1K( const float testDepth, const vec4 textureData, const float bias, inout float shadowValue ) {\n\n const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n if ( testDepth >= dot( textureData, bitSh ) * 1000.0 + bias )\n shadowValue += 1.0;\n\n }\n\n\n vec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\n vec3 absV = abs( v );\n\n\n float scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n absV *= scaleToCube;\n\n\n v *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\n\n vec2 planar = v.xy;\n\n float almostATexel = 1.5 * texelSizeY;\n float almostOne = 1.0 - almostATexel;\n\n if ( absV.z >= almostOne ) {\n\n if ( v.z > 0.0 )\n planar.x = 4.0 - v.x;\n\n } else if ( absV.x >= almostOne ) {\n\n float signX = sign( v.x );\n planar.x = v.z * signX + 2.0 * signX;\n\n } else if ( absV.y >= almostOne ) {\n\n float signY = sign( v.y );\n planar.x = v.x + 2.0 * signY + 2.0;\n planar.y = v.z * signY - 2.0;\n\n }\n\n\n return vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n }\n\n #endif\n\n#endif\n",THREE.ShaderChunk.shadowmap_pars_vertex="#ifdef USE_SHADOWMAP\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform mat4 shadowMatrix[ MAX_SHADOWS ];\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n#endif",THREE.ShaderChunk.shadowmap_vertex="#ifdef USE_SHADOWMAP\n\n for ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n\n }\n\n#endif",THREE.ShaderChunk.skinbase_vertex="#ifdef USE_SKINNING\n\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif",THREE.ShaderChunk.skinning_pars_vertex="#ifdef USE_SKINNING\n\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n\n #ifdef BONE_TEXTURE\n\n uniform sampler2D boneTexture;\n uniform int boneTextureWidth;\n uniform int boneTextureHeight;\n\n mat4 getBoneMatrix( const in float i ) {\n\n float j = i * 4.0;\n float x = mod( j, float( boneTextureWidth ) );\n float y = floor( j / float( boneTextureWidth ) );\n\n float dx = 1.0 / float( boneTextureWidth );\n float dy = 1.0 / float( boneTextureHeight );\n\n y = dy * ( y + 0.5 );\n\n vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n mat4 bone = mat4( v1, v2, v3, v4 );\n\n return bone;\n\n }\n\n #else\n\n uniform mat4 boneGlobalMatrices[ MAX_BONES ];\n\n mat4 getBoneMatrix( const in float i ) {\n\n mat4 bone = boneGlobalMatrices[ int(i) ];\n return bone;\n\n }\n\n #endif\n\n#endif\n",THREE.ShaderChunk.skinning_vertex="#ifdef USE_SKINNING\n\n vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\n vec4 skinned = vec4( 0.0 );\n skinned += boneMatX * skinVertex * skinWeight.x;\n skinned += boneMatY * skinVertex * skinWeight.y;\n skinned += boneMatZ * skinVertex * skinWeight.z;\n skinned += boneMatW * skinVertex * skinWeight.w;\n skinned = bindMatrixInverse * skinned;\n\n#endif\n",THREE.ShaderChunk.skinnormal_vertex="#ifdef USE_SKINNING\n\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n#endif\n",THREE.ShaderChunk.specularmap_fragment="float specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n vec4 texelSpecular = texture2D( specularMap, vUv );\n specularStrength = texelSpecular.r;\n\n#else\n\n specularStrength = 1.0;\n\n#endif",THREE.ShaderChunk.specularmap_pars_fragment="#ifdef USE_SPECULARMAP\n\n uniform sampler2D specularMap;\n\n#endif",THREE.ShaderChunk.uv2_pars_fragment="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n varying vec2 vUv2;\n\n#endif",THREE.ShaderChunk.uv2_pars_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n attribute vec2 uv2;\n varying vec2 vUv2;\n\n#endif",THREE.ShaderChunk.uv2_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n vUv2 = uv2;\n\n#endif",THREE.ShaderChunk.uv_pars_fragment="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n varying vec2 vUv;\n\n#endif",THREE.ShaderChunk.uv_pars_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n varying vec2 vUv;\n uniform vec4 offsetRepeat;\n\n#endif\n",THREE.ShaderChunk.uv_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n vUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n\n#endif",THREE.ShaderChunk.worldpos_vertex="#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\n #ifdef USE_SKINNING\n\n vec4 worldPosition = modelMatrix * skinned;\n\n #else\n\n vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\n #endif\n\n#endif\n",THREE.UniformsUtils={merge:function(uniforms){for(var merged={},u=0;u dashSize ) {"," discard;"," }"," vec3 outgoingLight = vec3( 0.0 );"," vec4 diffuseColor = vec4( diffuse, opacity );",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.color_fragment," outgoingLight = diffuseColor.rgb;",THREE.ShaderChunk.fog_fragment," gl_FragColor = vec4( outgoingLight, diffuseColor.a );","}"].join("\n")},depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2e3},opacity:{type:"f",value:1}},vertexShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform float mNear;","uniform float mFar;","uniform float opacity;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {",THREE.ShaderChunk.logdepthbuf_fragment," #ifdef USE_LOGDEPTHBUF_EXT"," float depth = gl_FragDepthEXT / gl_FragCoord.w;"," #else"," float depth = gl_FragCoord.z / gl_FragCoord.w;"," #endif"," float color = 1.0 - smoothstep( mNear, mFar, depth );"," gl_FragColor = vec4( vec3( color ), opacity );","}"].join("\n")},normal:{uniforms:{opacity:{type:"f",value:1}},vertexShader:["varying vec3 vNormal;",THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {"," vNormal = normalize( normalMatrix * normal );",THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform float opacity;","varying vec3 vNormal;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {"," gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},cube:{uniforms:{tCube:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {"," vWorldPosition = transformDirection( position, modelMatrix );"," gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform samplerCube tCube;","uniform float tFlip;","varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {"," gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},equirect:{uniforms:{tEquirect:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {"," vWorldPosition = transformDirection( position, modelMatrix );"," gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform sampler2D tEquirect;","uniform float tFlip;","varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {","vec3 direction = normalize( vWorldPosition );","vec2 sampleUV;","sampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );","sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;","gl_FragColor = texture2D( tEquirect, sampleUV );",THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"vec4 pack_depth( const in float depth ) {"," const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );"," const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );"," vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );"," res -= res.xxyz * bit_mask;"," return res;","}","void main() {",THREE.ShaderChunk.logdepthbuf_fragment," #ifdef USE_LOGDEPTHBUF_EXT"," gl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );"," #else"," gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );"," #endif","}"].join("\n")},distanceRGBA:{uniforms:{lightPos:{type:"v3",value:new THREE.Vector3(0,0,0)}},vertexShader:["varying vec4 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.worldpos_vertex,"vWorldPosition = worldPosition;","}"].join("\n"),fragmentShader:["uniform vec3 lightPos;","varying vec4 vWorldPosition;",THREE.ShaderChunk.common,"vec4 pack1K ( float depth ) {"," depth /= 1000.0;"," const vec4 bitSh = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );"," const vec4 bitMsk = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );"," vec4 res = fract( depth * bitSh );"," res -= res.xxyz * bitMsk;"," return res; ","}","float unpack1K ( vec4 color ) {"," const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );"," return dot( color, bitSh ) * 1000.0;","}","void main () {"," gl_FragColor = pack1K( length( vWorldPosition.xyz - lightPos.xyz ) );","}"].join("\n")}},THREE.WebGLRenderer=function(parameters){function glClearColor(r,g,b,a){_premultipliedAlpha===!0&&(r*=a,g*=a,b*=a),_gl.clearColor(r,g,b,a)}function setDefaultGLState(){state.init(),_gl.viewport(_viewportX,_viewportY,_viewportWidth,_viewportHeight),glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)}function resetGLState(){_currentProgram=null,_currentCamera=null,_currentGeometryProgram="",_currentMaterialId=-1,_lightsNeedUpdate=!0,state.reset()}function onContextLost(event){event.preventDefault(),resetGLState(),setDefaultGLState(),properties.clear()}function onTextureDispose(event){var texture=event.target;texture.removeEventListener("dispose",onTextureDispose),deallocateTexture(texture),_infoMemory.textures--}function onRenderTargetDispose(event){var renderTarget=event.target;renderTarget.removeEventListener("dispose",onRenderTargetDispose),deallocateRenderTarget(renderTarget),_infoMemory.textures--}function onMaterialDispose(event){var material=event.target;material.removeEventListener("dispose",onMaterialDispose),deallocateMaterial(material)}function deallocateTexture(texture){var textureProperties=properties.get(texture);if(texture.image&&textureProperties.__image__webglTextureCube)_gl.deleteTexture(textureProperties.__image__webglTextureCube);else{if(void 0===textureProperties.__webglInit)return;_gl.deleteTexture(textureProperties.__webglTexture)}properties["delete"](texture)}function deallocateRenderTarget(renderTarget){var renderTargetProperties=properties.get(renderTarget),textureProperties=properties.get(renderTarget.texture);if(renderTarget&&void 0!==textureProperties.__webglTexture){if(_gl.deleteTexture(textureProperties.__webglTexture),renderTarget instanceof THREE.WebGLRenderTargetCube)for(var i=0;6>i;i++)_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]),_gl.deleteRenderbuffer(renderTargetProperties.__webglRenderbuffer[i]);else _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer),_gl.deleteRenderbuffer(renderTargetProperties.__webglRenderbuffer);properties["delete"](renderTarget.texture),properties["delete"](renderTarget)}}function deallocateMaterial(material){releaseMaterialProgramReference(material),properties["delete"](material)}function releaseMaterialProgramReference(material){var programInfo=properties.get(material).program;material.program=void 0,void 0!==programInfo&&programCache.releaseProgram(programInfo)}function setupVertexAttributes(material,program,geometry,startIndex){var extension;if(geometry instanceof THREE.InstancedBufferGeometry&&(extension=extensions.get("ANGLE_instanced_arrays"),null===extension))return void console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");void 0===startIndex&&(startIndex=0),state.initAttributes();var geometryAttributes=geometry.attributes,programAttributes=program.getAttributes(),materialDefaultAttributeValues=material.defaultAttributeValues;for(var name in programAttributes){var programAttribute=programAttributes[name];if(programAttribute>=0){var geometryAttribute=geometryAttributes[name];if(void 0!==geometryAttribute){var size=geometryAttribute.itemSize,buffer=objects.getAttributeBuffer(geometryAttribute);if(geometryAttribute instanceof THREE.InterleavedBufferAttribute){var data=geometryAttribute.data,stride=data.stride,offset=geometryAttribute.offset;data instanceof THREE.InstancedInterleavedBuffer?(state.enableAttributeAndDivisor(programAttribute,data.meshPerAttribute,extension),void 0===geometry.maxInstancedCount&&(geometry.maxInstancedCount=data.meshPerAttribute*data.count)):state.enableAttribute(programAttribute),_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer),_gl.vertexAttribPointer(programAttribute,size,_gl.FLOAT,!1,stride*data.array.BYTES_PER_ELEMENT,(startIndex*stride+offset)*data.array.BYTES_PER_ELEMENT)}else geometryAttribute instanceof THREE.InstancedBufferAttribute?(state.enableAttributeAndDivisor(programAttribute,geometryAttribute.meshPerAttribute,extension),void 0===geometry.maxInstancedCount&&(geometry.maxInstancedCount=geometryAttribute.meshPerAttribute*geometryAttribute.count)):state.enableAttribute(programAttribute),_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer),_gl.vertexAttribPointer(programAttribute,size,_gl.FLOAT,!1,0,startIndex*size*4)}else if(void 0!==materialDefaultAttributeValues){var value=materialDefaultAttributeValues[name];if(void 0!==value)switch(value.length){case 2:_gl.vertexAttrib2fv(programAttribute,value);break;case 3:_gl.vertexAttrib3fv(programAttribute,value);break;case 4:_gl.vertexAttrib4fv(programAttribute,value);break;default:_gl.vertexAttrib1fv(programAttribute,value)}}}}state.disableUnusedAttributes()}function numericalSort(a,b){return b[0]-a[0]}function painterSortStable(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function reversePainterSortStable(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function pushRenderItem(object,geometry,material,z,group){var array,index;material.transparent?(array=transparentObjects,index=++transparentObjectsLastIndex):(array=opaqueObjects,index=++opaqueObjectsLastIndex);var renderItem=array[index];void 0!==renderItem?(renderItem.id=object.id,renderItem.object=object,renderItem.geometry=geometry,renderItem.material=material,renderItem.z=_vector3.z,renderItem.group=group):(renderItem={id:object.id,object:object,geometry:geometry,material:material,z:_vector3.z,group:group},array.push(renderItem))}function projectObject(object,camera){if(object.visible!==!1){if(0!==(object.channels.mask&camera.channels.mask))if(object instanceof THREE.Light)lights.push(object);else if(object instanceof THREE.Sprite)sprites.push(object);else if(object instanceof THREE.LensFlare)lensFlares.push(object);else if(object instanceof THREE.ImmediateRenderObject)_this.sortObjects===!0&&(_vector3.setFromMatrixPosition(object.matrixWorld),_vector3.applyProjection(_projScreenMatrix)),pushRenderItem(object,null,object.material,_vector3.z,null);else if((object instanceof THREE.Mesh||object instanceof THREE.Line||object instanceof THREE.Points)&&(object instanceof THREE.SkinnedMesh&&object.skeleton.update(),object.frustumCulled===!1||_frustum.intersectsObject(object)===!0)){var material=object.material;if(material.visible===!0){_this.sortObjects===!0&&(_vector3.setFromMatrixPosition(object.matrixWorld),_vector3.applyProjection(_projScreenMatrix));var geometry=objects.update(object);if(material instanceof THREE.MeshFaceMaterial)for(var groups=geometry.groups,materials=material.materials,i=0,l=groups.length;l>i;i++){var group=groups[i],groupMaterial=materials[group.materialIndex];groupMaterial.visible===!0&&pushRenderItem(object,geometry,groupMaterial,_vector3.z,group)}else pushRenderItem(object,geometry,material,_vector3.z,null)}}for(var children=object.children,i=0,l=children.length;l>i;i++)projectObject(children[i],camera)}}function renderObjects(renderList,camera,lights,fog,overrideMaterial){for(var i=0,l=renderList.length;l>i;i++){var renderItem=renderList[i],object=renderItem.object,geometry=renderItem.geometry,material=void 0===overrideMaterial?renderItem.material:overrideMaterial,group=renderItem.group;if(object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld),object.normalMatrix.getNormalMatrix(object.modelViewMatrix),object instanceof THREE.ImmediateRenderObject){setMaterial(material);var program=setProgram(camera,lights,fog,material,object);_currentGeometryProgram="",object.render(function(object){_this.renderBufferImmediate(object,program,material)})}else _this.renderBufferDirect(camera,lights,fog,geometry,material,object,group)}}function initMaterial(material,lights,fog,object){var materialProperties=properties.get(material),parameters=programCache.getParameters(material,lights,fog,object),code=programCache.getProgramCode(material,parameters),program=materialProperties.program,programChange=!0;if(void 0===program)material.addEventListener("dispose",onMaterialDispose);else if(program.code!==code)releaseMaterialProgramReference(material);else{if(void 0!==parameters.shaderID)return;programChange=!1}if(programChange){if(parameters.shaderID){var shader=THREE.ShaderLib[parameters.shaderID];materialProperties.__webglShader={name:material.type,uniforms:THREE.UniformsUtils.clone(shader.uniforms),vertexShader:shader.vertexShader,fragmentShader:shader.fragmentShader}}else materialProperties.__webglShader={name:material.type,uniforms:material.uniforms,vertexShader:material.vertexShader,fragmentShader:material.fragmentShader};material.__webglShader=materialProperties.__webglShader,program=programCache.acquireProgram(material,parameters,code),materialProperties.program=program,material.program=program}var attributes=program.getAttributes();if(material.morphTargets){material.numSupportedMorphTargets=0;for(var i=0;i<_this.maxMorphTargets;i++)attributes["morphTarget"+i]>=0&&material.numSupportedMorphTargets++}if(material.morphNormals)for(material.numSupportedMorphNormals=0,i=0;i<_this.maxMorphNormals;i++)attributes["morphNormal"+i]>=0&&material.numSupportedMorphNormals++;materialProperties.uniformsList=[];var uniformLocations=materialProperties.program.getUniforms();for(var u in materialProperties.__webglShader.uniforms){var location=uniformLocations[u];location&&materialProperties.uniformsList.push([materialProperties.__webglShader.uniforms[u],location])}}function setMaterial(material){setMaterialFaces(material),material.transparent===!0?state.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst,material.blendEquationAlpha,material.blendSrcAlpha,material.blendDstAlpha):state.setBlending(THREE.NoBlending),state.setDepthFunc(material.depthFunc),state.setDepthTest(material.depthTest),state.setDepthWrite(material.depthWrite),state.setColorWrite(material.colorWrite),state.setPolygonOffset(material.polygonOffset,material.polygonOffsetFactor,material.polygonOffsetUnits)}function setMaterialFaces(material){material.side!==THREE.DoubleSide?state.enable(_gl.CULL_FACE):state.disable(_gl.CULL_FACE),state.setFlipSided(material.side===THREE.BackSide)}function setProgram(camera,lights,fog,material,object){_usedTextureUnits=0;var materialProperties=properties.get(material);!material.needsUpdate&&materialProperties.program||(initMaterial(material,lights,fog,object),material.needsUpdate=!1);var refreshProgram=!1,refreshMaterial=!1,refreshLights=!1,program=materialProperties.program,p_uniforms=program.getUniforms(),m_uniforms=materialProperties.__webglShader.uniforms;if(program.id!==_currentProgram&&(_gl.useProgram(program.program),_currentProgram=program.id,refreshProgram=!0,refreshMaterial=!0,refreshLights=!0),material.id!==_currentMaterialId&&(-1===_currentMaterialId&&(refreshLights=!0),_currentMaterialId=material.id,refreshMaterial=!0),(refreshProgram||camera!==_currentCamera)&&(_gl.uniformMatrix4fv(p_uniforms.projectionMatrix,!1,camera.projectionMatrix.elements),capabilities.logarithmicDepthBuffer&&_gl.uniform1f(p_uniforms.logDepthBufFC,2/(Math.log(camera.far+1)/Math.LN2)),camera!==_currentCamera&&(_currentCamera=camera),(material instanceof THREE.ShaderMaterial||material instanceof THREE.MeshPhongMaterial||material.envMap)&&void 0!==p_uniforms.cameraPosition&&(_vector3.setFromMatrixPosition(camera.matrixWorld),_gl.uniform3f(p_uniforms.cameraPosition,_vector3.x,_vector3.y,_vector3.z)),(material instanceof THREE.MeshPhongMaterial||material instanceof THREE.MeshLambertMaterial||material instanceof THREE.MeshBasicMaterial||material instanceof THREE.ShaderMaterial||material.skinning)&&void 0!==p_uniforms.viewMatrix&&_gl.uniformMatrix4fv(p_uniforms.viewMatrix,!1,camera.matrixWorldInverse.elements)),material.skinning)if(object.bindMatrix&&void 0!==p_uniforms.bindMatrix&&_gl.uniformMatrix4fv(p_uniforms.bindMatrix,!1,object.bindMatrix.elements),object.bindMatrixInverse&&void 0!==p_uniforms.bindMatrixInverse&&_gl.uniformMatrix4fv(p_uniforms.bindMatrixInverse,!1,object.bindMatrixInverse.elements),capabilities.floatVertexTextures&&object.skeleton&&object.skeleton.useVertexTexture){if(void 0!==p_uniforms.boneTexture){var textureUnit=getTextureUnit();_gl.uniform1i(p_uniforms.boneTexture,textureUnit),_this.setTexture(object.skeleton.boneTexture,textureUnit)}void 0!==p_uniforms.boneTextureWidth&&_gl.uniform1i(p_uniforms.boneTextureWidth,object.skeleton.boneTextureWidth),void 0!==p_uniforms.boneTextureHeight&&_gl.uniform1i(p_uniforms.boneTextureHeight,object.skeleton.boneTextureHeight)}else object.skeleton&&object.skeleton.boneMatrices&&void 0!==p_uniforms.boneGlobalMatrices&&_gl.uniformMatrix4fv(p_uniforms.boneGlobalMatrices,!1,object.skeleton.boneMatrices);return refreshMaterial&&(fog&&material.fog&&refreshUniformsFog(m_uniforms,fog),(material instanceof THREE.MeshPhongMaterial||material instanceof THREE.MeshLambertMaterial||material.lights)&&(_lightsNeedUpdate&&(refreshLights=!0,setupLights(lights,camera),_lightsNeedUpdate=!1),refreshLights?(refreshUniformsLights(m_uniforms,_lights),markUniformsLightsNeedsUpdate(m_uniforms,!0)):markUniformsLightsNeedsUpdate(m_uniforms,!1)),(material instanceof THREE.MeshBasicMaterial||material instanceof THREE.MeshLambertMaterial||material instanceof THREE.MeshPhongMaterial)&&refreshUniformsCommon(m_uniforms,material),material instanceof THREE.LineBasicMaterial?refreshUniformsLine(m_uniforms,material):material instanceof THREE.LineDashedMaterial?(refreshUniformsLine(m_uniforms,material),refreshUniformsDash(m_uniforms,material)):material instanceof THREE.PointsMaterial?refreshUniformsParticle(m_uniforms,material):material instanceof THREE.MeshPhongMaterial?refreshUniformsPhong(m_uniforms,material):material instanceof THREE.MeshDepthMaterial?(m_uniforms.mNear.value=camera.near,m_uniforms.mFar.value=camera.far,m_uniforms.opacity.value=material.opacity):material instanceof THREE.MeshNormalMaterial&&(m_uniforms.opacity.value=material.opacity),object.receiveShadow&&!material._shadowPass&&refreshUniformsShadow(m_uniforms,lights,camera),loadUniformsGeneric(materialProperties.uniformsList)),loadUniformsMatrices(p_uniforms,object),void 0!==p_uniforms.modelMatrix&&_gl.uniformMatrix4fv(p_uniforms.modelMatrix,!1,object.matrixWorld.elements),program}function refreshUniformsCommon(uniforms,material){uniforms.opacity.value=material.opacity,uniforms.diffuse.value=material.color,material.emissive&&(uniforms.emissive.value=material.emissive),uniforms.map.value=material.map,uniforms.specularMap.value=material.specularMap,uniforms.alphaMap.value=material.alphaMap,material.aoMap&&(uniforms.aoMap.value=material.aoMap,uniforms.aoMapIntensity.value=material.aoMapIntensity);var uvScaleMap;if(material.map?uvScaleMap=material.map:material.specularMap?uvScaleMap=material.specularMap:material.displacementMap?uvScaleMap=material.displacementMap:material.normalMap?uvScaleMap=material.normalMap:material.bumpMap?uvScaleMap=material.bumpMap:material.alphaMap?uvScaleMap=material.alphaMap:material.emissiveMap&&(uvScaleMap=material.emissiveMap),void 0!==uvScaleMap){uvScaleMap instanceof THREE.WebGLRenderTarget&&(uvScaleMap=uvScaleMap.texture);var offset=uvScaleMap.offset,repeat=uvScaleMap.repeat;uniforms.offsetRepeat.value.set(offset.x,offset.y,repeat.x,repeat.y)}uniforms.envMap.value=material.envMap,uniforms.flipEnvMap.value=material.envMap instanceof THREE.WebGLRenderTargetCube?1:-1,uniforms.reflectivity.value=material.reflectivity,uniforms.refractionRatio.value=material.refractionRatio}function refreshUniformsLine(uniforms,material){uniforms.diffuse.value=material.color,uniforms.opacity.value=material.opacity; +}function refreshUniformsDash(uniforms,material){uniforms.dashSize.value=material.dashSize,uniforms.totalSize.value=material.dashSize+material.gapSize,uniforms.scale.value=material.scale}function refreshUniformsParticle(uniforms,material){if(uniforms.psColor.value=material.color,uniforms.opacity.value=material.opacity,uniforms.size.value=material.size,uniforms.scale.value=_canvas.height/2,uniforms.map.value=material.map,null!==material.map){var offset=material.map.offset,repeat=material.map.repeat;uniforms.offsetRepeat.value.set(offset.x,offset.y,repeat.x,repeat.y)}}function refreshUniformsFog(uniforms,fog){uniforms.fogColor.value=fog.color,fog instanceof THREE.Fog?(uniforms.fogNear.value=fog.near,uniforms.fogFar.value=fog.far):fog instanceof THREE.FogExp2&&(uniforms.fogDensity.value=fog.density)}function refreshUniformsPhong(uniforms,material){uniforms.specular.value=material.specular,uniforms.shininess.value=Math.max(material.shininess,1e-4),material.lightMap&&(uniforms.lightMap.value=material.lightMap,uniforms.lightMapIntensity.value=material.lightMapIntensity),material.emissiveMap&&(uniforms.emissiveMap.value=material.emissiveMap),material.bumpMap&&(uniforms.bumpMap.value=material.bumpMap,uniforms.bumpScale.value=material.bumpScale),material.normalMap&&(uniforms.normalMap.value=material.normalMap,uniforms.normalScale.value.copy(material.normalScale)),material.displacementMap&&(uniforms.displacementMap.value=material.displacementMap,uniforms.displacementScale.value=material.displacementScale,uniforms.displacementBias.value=material.displacementBias)}function refreshUniformsLights(uniforms,lights){uniforms.ambientLightColor.value=lights.ambient,uniforms.directionalLightColor.value=lights.directional.colors,uniforms.directionalLightDirection.value=lights.directional.positions,uniforms.pointLightColor.value=lights.point.colors,uniforms.pointLightPosition.value=lights.point.positions,uniforms.pointLightDistance.value=lights.point.distances,uniforms.pointLightDecay.value=lights.point.decays,uniforms.spotLightColor.value=lights.spot.colors,uniforms.spotLightPosition.value=lights.spot.positions,uniforms.spotLightDistance.value=lights.spot.distances,uniforms.spotLightDirection.value=lights.spot.directions,uniforms.spotLightAngleCos.value=lights.spot.anglesCos,uniforms.spotLightExponent.value=lights.spot.exponents,uniforms.spotLightDecay.value=lights.spot.decays,uniforms.hemisphereLightSkyColor.value=lights.hemi.skyColors,uniforms.hemisphereLightGroundColor.value=lights.hemi.groundColors,uniforms.hemisphereLightDirection.value=lights.hemi.positions}function markUniformsLightsNeedsUpdate(uniforms,value){uniforms.ambientLightColor.needsUpdate=value,uniforms.directionalLightColor.needsUpdate=value,uniforms.directionalLightDirection.needsUpdate=value,uniforms.pointLightColor.needsUpdate=value,uniforms.pointLightPosition.needsUpdate=value,uniforms.pointLightDistance.needsUpdate=value,uniforms.pointLightDecay.needsUpdate=value,uniforms.spotLightColor.needsUpdate=value,uniforms.spotLightPosition.needsUpdate=value,uniforms.spotLightDistance.needsUpdate=value,uniforms.spotLightDirection.needsUpdate=value,uniforms.spotLightAngleCos.needsUpdate=value,uniforms.spotLightExponent.needsUpdate=value,uniforms.spotLightDecay.needsUpdate=value,uniforms.hemisphereLightSkyColor.needsUpdate=value,uniforms.hemisphereLightGroundColor.needsUpdate=value,uniforms.hemisphereLightDirection.needsUpdate=value}function refreshUniformsShadow(uniforms,lights,camera){if(uniforms.shadowMatrix)for(var j=0,i=0,il=lights.length;il>i;i++){var light=lights[i];if(light.castShadow===!0&&(light instanceof THREE.PointLight||light instanceof THREE.SpotLight||light instanceof THREE.DirectionalLight)){var shadow=light.shadow;light instanceof THREE.PointLight?(_vector3.setFromMatrixPosition(light.matrixWorld).negate(),shadow.matrix.identity().setPosition(_vector3),uniforms.shadowDarkness.value[j]=-shadow.darkness):uniforms.shadowDarkness.value[j]=shadow.darkness,uniforms.shadowMatrix.value[j]=shadow.matrix,uniforms.shadowMap.value[j]=shadow.map,uniforms.shadowMapSize.value[j]=shadow.mapSize,uniforms.shadowBias.value[j]=shadow.bias,j++}}}function loadUniformsMatrices(uniforms,object){_gl.uniformMatrix4fv(uniforms.modelViewMatrix,!1,object.modelViewMatrix.elements),uniforms.normalMatrix&&_gl.uniformMatrix3fv(uniforms.normalMatrix,!1,object.normalMatrix.elements)}function getTextureUnit(){var textureUnit=_usedTextureUnits;return textureUnit>=capabilities.maxTextures&&console.warn("WebGLRenderer: trying to use "+textureUnit+" texture units while this GPU supports only "+capabilities.maxTextures),_usedTextureUnits+=1,textureUnit}function loadUniformsGeneric(uniforms){for(var texture,textureUnit,j=0,jl=uniforms.length;jl>j;j++){var uniform=uniforms[j][0];if(uniform.needsUpdate!==!1){var type=uniform.type,value=uniform.value,location=uniforms[j][1];switch(type){case"1i":_gl.uniform1i(location,value);break;case"1f":_gl.uniform1f(location,value);break;case"2f":_gl.uniform2f(location,value[0],value[1]);break;case"3f":_gl.uniform3f(location,value[0],value[1],value[2]);break;case"4f":_gl.uniform4f(location,value[0],value[1],value[2],value[3]);break;case"1iv":_gl.uniform1iv(location,value);break;case"3iv":_gl.uniform3iv(location,value);break;case"1fv":_gl.uniform1fv(location,value);break;case"2fv":_gl.uniform2fv(location,value);break;case"3fv":_gl.uniform3fv(location,value);break;case"4fv":_gl.uniform4fv(location,value);break;case"Matrix3fv":_gl.uniformMatrix3fv(location,!1,value);break;case"Matrix4fv":_gl.uniformMatrix4fv(location,!1,value);break;case"i":_gl.uniform1i(location,value);break;case"f":_gl.uniform1f(location,value);break;case"v2":_gl.uniform2f(location,value.x,value.y);break;case"v3":_gl.uniform3f(location,value.x,value.y,value.z);break;case"v4":_gl.uniform4f(location,value.x,value.y,value.z,value.w);break;case"c":_gl.uniform3f(location,value.r,value.g,value.b);break;case"iv1":_gl.uniform1iv(location,value);break;case"iv":_gl.uniform3iv(location,value);break;case"fv1":_gl.uniform1fv(location,value);break;case"fv":_gl.uniform3fv(location,value);break;case"v2v":void 0===uniform._array&&(uniform._array=new Float32Array(2*value.length));for(var i=0,i2=0,il=value.length;il>i;i++,i2+=2)uniform._array[i2+0]=value[i].x,uniform._array[i2+1]=value[i].y;_gl.uniform2fv(location,uniform._array);break;case"v3v":void 0===uniform._array&&(uniform._array=new Float32Array(3*value.length));for(var i=0,i3=0,il=value.length;il>i;i++,i3+=3)uniform._array[i3+0]=value[i].x,uniform._array[i3+1]=value[i].y,uniform._array[i3+2]=value[i].z;_gl.uniform3fv(location,uniform._array);break;case"v4v":void 0===uniform._array&&(uniform._array=new Float32Array(4*value.length));for(var i=0,i4=0,il=value.length;il>i;i++,i4+=4)uniform._array[i4+0]=value[i].x,uniform._array[i4+1]=value[i].y,uniform._array[i4+2]=value[i].z,uniform._array[i4+3]=value[i].w;_gl.uniform4fv(location,uniform._array);break;case"m3":_gl.uniformMatrix3fv(location,!1,value.elements);break;case"m3v":void 0===uniform._array&&(uniform._array=new Float32Array(9*value.length));for(var i=0,il=value.length;il>i;i++)value[i].flattenToArrayOffset(uniform._array,9*i);_gl.uniformMatrix3fv(location,!1,uniform._array);break;case"m4":_gl.uniformMatrix4fv(location,!1,value.elements);break;case"m4v":void 0===uniform._array&&(uniform._array=new Float32Array(16*value.length));for(var i=0,il=value.length;il>i;i++)value[i].flattenToArrayOffset(uniform._array,16*i);_gl.uniformMatrix4fv(location,!1,uniform._array);break;case"t":if(texture=value,textureUnit=getTextureUnit(),_gl.uniform1i(location,textureUnit),!texture)continue;texture instanceof THREE.CubeTexture||Array.isArray(texture.image)&&6===texture.image.length?setCubeTexture(texture,textureUnit):texture instanceof THREE.WebGLRenderTargetCube?setCubeTextureDynamic(texture.texture,textureUnit):texture instanceof THREE.WebGLRenderTarget?_this.setTexture(texture.texture,textureUnit):_this.setTexture(texture,textureUnit);break;case"tv":void 0===uniform._array&&(uniform._array=[]);for(var i=0,il=uniform.value.length;il>i;i++)uniform._array[i]=getTextureUnit();_gl.uniform1iv(location,uniform._array);for(var i=0,il=uniform.value.length;il>i;i++)texture=uniform.value[i],textureUnit=uniform._array[i],texture&&(texture instanceof THREE.CubeTexture||texture.image instanceof Array&&6===texture.image.length?setCubeTexture(texture,textureUnit):texture instanceof THREE.WebGLRenderTarget?_this.setTexture(texture.texture,textureUnit):texture instanceof THREE.WebGLRenderTargetCube?setCubeTextureDynamic(texture.texture,textureUnit):_this.setTexture(texture,textureUnit));break;default:console.warn("THREE.WebGLRenderer: Unknown uniform type: "+type)}}}}function setColorLinear(array,offset,color,intensity){array[offset+0]=color.r*intensity,array[offset+1]=color.g*intensity,array[offset+2]=color.b*intensity}function setupLights(lights,camera){var l,ll,light,color,skyColor,groundColor,intensity,distance,r=0,g=0,b=0,zlights=_lights,viewMatrix=camera.matrixWorldInverse,dirColors=zlights.directional.colors,dirPositions=zlights.directional.positions,pointColors=zlights.point.colors,pointPositions=zlights.point.positions,pointDistances=zlights.point.distances,pointDecays=zlights.point.decays,spotColors=zlights.spot.colors,spotPositions=zlights.spot.positions,spotDistances=zlights.spot.distances,spotDirections=zlights.spot.directions,spotAnglesCos=zlights.spot.anglesCos,spotExponents=zlights.spot.exponents,spotDecays=zlights.spot.decays,hemiSkyColors=zlights.hemi.skyColors,hemiGroundColors=zlights.hemi.groundColors,hemiPositions=zlights.hemi.positions,dirLength=0,pointLength=0,spotLength=0,hemiLength=0,dirCount=0,pointCount=0,spotCount=0,hemiCount=0,dirOffset=0,pointOffset=0,spotOffset=0,hemiOffset=0;for(l=0,ll=lights.length;ll>l;l++)if(light=lights[l],color=light.color,intensity=light.intensity,distance=light.distance,light instanceof THREE.AmbientLight){if(!light.visible)continue;r+=color.r,g+=color.g,b+=color.b}else if(light instanceof THREE.DirectionalLight){if(dirCount+=1,!light.visible)continue;_direction.setFromMatrixPosition(light.matrixWorld),_vector3.setFromMatrixPosition(light.target.matrixWorld),_direction.sub(_vector3),_direction.transformDirection(viewMatrix),dirOffset=3*dirLength,dirPositions[dirOffset+0]=_direction.x,dirPositions[dirOffset+1]=_direction.y,dirPositions[dirOffset+2]=_direction.z,setColorLinear(dirColors,dirOffset,color,intensity),dirLength+=1}else if(light instanceof THREE.PointLight){if(pointCount+=1,!light.visible)continue;pointOffset=3*pointLength,setColorLinear(pointColors,pointOffset,color,intensity),_vector3.setFromMatrixPosition(light.matrixWorld),_vector3.applyMatrix4(viewMatrix),pointPositions[pointOffset+0]=_vector3.x,pointPositions[pointOffset+1]=_vector3.y,pointPositions[pointOffset+2]=_vector3.z,pointDistances[pointLength]=distance,pointDecays[pointLength]=0===light.distance?0:light.decay,pointLength+=1}else if(light instanceof THREE.SpotLight){if(spotCount+=1,!light.visible)continue;spotOffset=3*spotLength,setColorLinear(spotColors,spotOffset,color,intensity),_direction.setFromMatrixPosition(light.matrixWorld),_vector3.copy(_direction).applyMatrix4(viewMatrix),spotPositions[spotOffset+0]=_vector3.x,spotPositions[spotOffset+1]=_vector3.y,spotPositions[spotOffset+2]=_vector3.z,spotDistances[spotLength]=distance,_vector3.setFromMatrixPosition(light.target.matrixWorld),_direction.sub(_vector3),_direction.transformDirection(viewMatrix),spotDirections[spotOffset+0]=_direction.x,spotDirections[spotOffset+1]=_direction.y,spotDirections[spotOffset+2]=_direction.z,spotAnglesCos[spotLength]=Math.cos(light.angle),spotExponents[spotLength]=light.exponent,spotDecays[spotLength]=0===light.distance?0:light.decay,spotLength+=1}else if(light instanceof THREE.HemisphereLight){if(hemiCount+=1,!light.visible)continue;_direction.setFromMatrixPosition(light.matrixWorld),_direction.transformDirection(viewMatrix),hemiOffset=3*hemiLength,hemiPositions[hemiOffset+0]=_direction.x,hemiPositions[hemiOffset+1]=_direction.y,hemiPositions[hemiOffset+2]=_direction.z,skyColor=light.color,groundColor=light.groundColor,setColorLinear(hemiSkyColors,hemiOffset,skyColor,intensity),setColorLinear(hemiGroundColors,hemiOffset,groundColor,intensity),hemiLength+=1}for(l=3*dirLength,ll=Math.max(dirColors.length,3*dirCount);ll>l;l++)dirColors[l]=0;for(l=3*pointLength,ll=Math.max(pointColors.length,3*pointCount);ll>l;l++)pointColors[l]=0;for(l=3*spotLength,ll=Math.max(spotColors.length,3*spotCount);ll>l;l++)spotColors[l]=0;for(l=3*hemiLength,ll=Math.max(hemiSkyColors.length,3*hemiCount);ll>l;l++)hemiSkyColors[l]=0;for(l=3*hemiLength,ll=Math.max(hemiGroundColors.length,3*hemiCount);ll>l;l++)hemiGroundColors[l]=0;zlights.directional.length=dirLength,zlights.point.length=pointLength,zlights.spot.length=spotLength,zlights.hemi.length=hemiLength,zlights.ambient[0]=r,zlights.ambient[1]=g,zlights.ambient[2]=b}function setTextureParameters(textureType,texture,isImagePowerOfTwo){var extension;if(isImagePowerOfTwo?(_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,paramThreeToGL(texture.wrapS)),_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,paramThreeToGL(texture.wrapT)),_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,paramThreeToGL(texture.magFilter)),_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,paramThreeToGL(texture.minFilter))):(_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,_gl.CLAMP_TO_EDGE),_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,_gl.CLAMP_TO_EDGE),texture.wrapS===THREE.ClampToEdgeWrapping&&texture.wrapT===THREE.ClampToEdgeWrapping||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",texture),_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,filterFallback(texture.magFilter)),_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,filterFallback(texture.minFilter)),texture.minFilter!==THREE.NearestFilter&&texture.minFilter!==THREE.LinearFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",texture)),extension=extensions.get("EXT_texture_filter_anisotropic")){if(texture.type===THREE.FloatType&&null===extensions.get("OES_texture_float_linear"))return;if(texture.type===THREE.HalfFloatType&&null===extensions.get("OES_texture_half_float_linear"))return;(texture.anisotropy>1||properties.get(texture).__currentAnisotropy)&&(_gl.texParameterf(textureType,extension.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(texture.anisotropy,_this.getMaxAnisotropy())),properties.get(texture).__currentAnisotropy=texture.anisotropy)}}function uploadTexture(textureProperties,texture,slot){void 0===textureProperties.__webglInit&&(textureProperties.__webglInit=!0,texture.addEventListener("dispose",onTextureDispose),textureProperties.__webglTexture=_gl.createTexture(),_infoMemory.textures++),state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture),_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY),_gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL,texture.premultiplyAlpha),_gl.pixelStorei(_gl.UNPACK_ALIGNMENT,texture.unpackAlignment),texture.image=clampToMaxSize(texture.image,capabilities.maxTextureSize),textureNeedsPowerOfTwo(texture)&&isPowerOfTwo(texture.image)===!1&&(texture.image=makePowerOfTwo(texture.image));var image=texture.image,isImagePowerOfTwo=isPowerOfTwo(image),glFormat=paramThreeToGL(texture.format),glType=paramThreeToGL(texture.type);setTextureParameters(_gl.TEXTURE_2D,texture,isImagePowerOfTwo);var mipmap,mipmaps=texture.mipmaps;if(texture instanceof THREE.DataTexture)if(mipmaps.length>0&&isImagePowerOfTwo){for(var i=0,il=mipmaps.length;il>i;i++)mipmap=mipmaps[i],state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);texture.generateMipmaps=!1}else state.texImage2D(_gl.TEXTURE_2D,0,glFormat,image.width,image.height,0,glFormat,glType,image.data);else if(texture instanceof THREE.CompressedTexture)for(var i=0,il=mipmaps.length;il>i;i++)mipmap=mipmaps[i],texture.format!==THREE.RGBAFormat&&texture.format!==THREE.RGBFormat?state.getCompressedTextureFormats().indexOf(glFormat)>-1?state.compressedTexImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,mipmap.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);else if(mipmaps.length>0&&isImagePowerOfTwo){for(var i=0,il=mipmaps.length;il>i;i++)mipmap=mipmaps[i],state.texImage2D(_gl.TEXTURE_2D,i,glFormat,glFormat,glType,mipmap);texture.generateMipmaps=!1}else state.texImage2D(_gl.TEXTURE_2D,0,glFormat,glFormat,glType,texture.image);texture.generateMipmaps&&isImagePowerOfTwo&&_gl.generateMipmap(_gl.TEXTURE_2D),textureProperties.__version=texture.version,texture.onUpdate&&texture.onUpdate(texture)}function clampToMaxSize(image,maxSize){if(image.width>maxSize||image.height>maxSize){var scale=maxSize/Math.max(image.width,image.height),canvas=document.createElement("canvas");canvas.width=Math.floor(image.width*scale),canvas.height=Math.floor(image.height*scale);var context=canvas.getContext("2d");return context.drawImage(image,0,0,image.width,image.height,0,0,canvas.width,canvas.height),console.warn("THREE.WebGLRenderer: image is too big ("+image.width+"x"+image.height+"). Resized to "+canvas.width+"x"+canvas.height,image),canvas}return image}function isPowerOfTwo(image){return THREE.Math.isPowerOfTwo(image.width)&&THREE.Math.isPowerOfTwo(image.height)}function textureNeedsPowerOfTwo(texture){return texture.wrapS!==THREE.ClampToEdgeWrapping||texture.wrapT!==THREE.ClampToEdgeWrapping?!0:texture.minFilter!==THREE.NearestFilter&&texture.minFilter!==THREE.LinearFilter}function makePowerOfTwo(image){if(image instanceof HTMLImageElement||image instanceof HTMLCanvasElement){var canvas=document.createElement("canvas");canvas.width=THREE.Math.nearestPowerOfTwo(image.width),canvas.height=THREE.Math.nearestPowerOfTwo(image.height);var context=canvas.getContext("2d");return context.drawImage(image,0,0,canvas.width,canvas.height),console.warn("THREE.WebGLRenderer: image is not power of two ("+image.width+"x"+image.height+"). Resized to "+canvas.width+"x"+canvas.height,image),canvas}return image}function setCubeTexture(texture,slot){var textureProperties=properties.get(texture);if(6===texture.image.length)if(texture.version>0&&textureProperties.__version!==texture.version){textureProperties.__image__webglTextureCube||(texture.addEventListener("dispose",onTextureDispose),textureProperties.__image__webglTextureCube=_gl.createTexture(),_infoMemory.textures++),state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube),_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);for(var isCompressed=texture instanceof THREE.CompressedTexture,isDataTexture=texture.image[0]instanceof THREE.DataTexture,cubeImage=[],i=0;6>i;i++)!_this.autoScaleCubemaps||isCompressed||isDataTexture?cubeImage[i]=isDataTexture?texture.image[i].image:texture.image[i]:cubeImage[i]=clampToMaxSize(texture.image[i],capabilities.maxCubemapSize);var image=cubeImage[0],isImagePowerOfTwo=isPowerOfTwo(image),glFormat=paramThreeToGL(texture.format),glType=paramThreeToGL(texture.type);setTextureParameters(_gl.TEXTURE_CUBE_MAP,texture,isImagePowerOfTwo);for(var i=0;6>i;i++)if(isCompressed)for(var mipmap,mipmaps=cubeImage[i].mipmaps,j=0,jl=mipmaps.length;jl>j;j++)mipmap=mipmaps[j],texture.format!==THREE.RGBAFormat&&texture.format!==THREE.RGBFormat?state.getCompressedTextureFormats().indexOf(glFormat)>-1?state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,mipmap.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()"):state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);else isDataTexture?state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,cubeImage[i].width,cubeImage[i].height,0,glFormat,glType,cubeImage[i].data):state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,glFormat,glType,cubeImage[i]);texture.generateMipmaps&&isImagePowerOfTwo&&_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP),textureProperties.__version=texture.version,texture.onUpdate&&texture.onUpdate(texture)}else state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube)}function setCubeTextureDynamic(texture,slot){state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_CUBE_MAP,properties.get(texture).__webglTexture)}function setupFrameBuffer(framebuffer,renderTarget,textureTarget){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer),_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.COLOR_ATTACHMENT0,textureTarget,properties.get(renderTarget.texture).__webglTexture,0)}function setupRenderBuffer(renderbuffer,renderTarget){_gl.bindRenderbuffer(_gl.RENDERBUFFER,renderbuffer),renderTarget.depthBuffer&&!renderTarget.stencilBuffer?(_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.DEPTH_COMPONENT16,renderTarget.width,renderTarget.height),_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.RENDERBUFFER,renderbuffer)):renderTarget.depthBuffer&&renderTarget.stencilBuffer?(_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.DEPTH_STENCIL,renderTarget.width,renderTarget.height),_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.RENDERBUFFER,renderbuffer)):_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.RGBA4,renderTarget.width,renderTarget.height)}function updateRenderTargetMipmap(renderTarget){var target=renderTarget instanceof THREE.WebGLRenderTargetCube?_gl.TEXTURE_CUBE_MAP:_gl.TEXTURE_2D,texture=properties.get(renderTarget.texture).__webglTexture;state.bindTexture(target,texture),_gl.generateMipmap(target),state.bindTexture(target,null)}function filterFallback(f){return f===THREE.NearestFilter||f===THREE.NearestMipMapNearestFilter||f===THREE.NearestMipMapLinearFilter?_gl.NEAREST:_gl.LINEAR}function paramThreeToGL(p){var extension;if(p===THREE.RepeatWrapping)return _gl.REPEAT;if(p===THREE.ClampToEdgeWrapping)return _gl.CLAMP_TO_EDGE;if(p===THREE.MirroredRepeatWrapping)return _gl.MIRRORED_REPEAT;if(p===THREE.NearestFilter)return _gl.NEAREST;if(p===THREE.NearestMipMapNearestFilter)return _gl.NEAREST_MIPMAP_NEAREST;if(p===THREE.NearestMipMapLinearFilter)return _gl.NEAREST_MIPMAP_LINEAR;if(p===THREE.LinearFilter)return _gl.LINEAR;if(p===THREE.LinearMipMapNearestFilter)return _gl.LINEAR_MIPMAP_NEAREST;if(p===THREE.LinearMipMapLinearFilter)return _gl.LINEAR_MIPMAP_LINEAR;if(p===THREE.UnsignedByteType)return _gl.UNSIGNED_BYTE;if(p===THREE.UnsignedShort4444Type)return _gl.UNSIGNED_SHORT_4_4_4_4;if(p===THREE.UnsignedShort5551Type)return _gl.UNSIGNED_SHORT_5_5_5_1;if(p===THREE.UnsignedShort565Type)return _gl.UNSIGNED_SHORT_5_6_5;if(p===THREE.ByteType)return _gl.BYTE;if(p===THREE.ShortType)return _gl.SHORT;if(p===THREE.UnsignedShortType)return _gl.UNSIGNED_SHORT;if(p===THREE.IntType)return _gl.INT;if(p===THREE.UnsignedIntType)return _gl.UNSIGNED_INT;if(p===THREE.FloatType)return _gl.FLOAT;if(extension=extensions.get("OES_texture_half_float"),null!==extension&&p===THREE.HalfFloatType)return extension.HALF_FLOAT_OES;if(p===THREE.AlphaFormat)return _gl.ALPHA;if(p===THREE.RGBFormat)return _gl.RGB;if(p===THREE.RGBAFormat)return _gl.RGBA;if(p===THREE.LuminanceFormat)return _gl.LUMINANCE;if(p===THREE.LuminanceAlphaFormat)return _gl.LUMINANCE_ALPHA;if(p===THREE.AddEquation)return _gl.FUNC_ADD;if(p===THREE.SubtractEquation)return _gl.FUNC_SUBTRACT;if(p===THREE.ReverseSubtractEquation)return _gl.FUNC_REVERSE_SUBTRACT;if(p===THREE.ZeroFactor)return _gl.ZERO;if(p===THREE.OneFactor)return _gl.ONE;if(p===THREE.SrcColorFactor)return _gl.SRC_COLOR;if(p===THREE.OneMinusSrcColorFactor)return _gl.ONE_MINUS_SRC_COLOR;if(p===THREE.SrcAlphaFactor)return _gl.SRC_ALPHA;if(p===THREE.OneMinusSrcAlphaFactor)return _gl.ONE_MINUS_SRC_ALPHA;if(p===THREE.DstAlphaFactor)return _gl.DST_ALPHA;if(p===THREE.OneMinusDstAlphaFactor)return _gl.ONE_MINUS_DST_ALPHA;if(p===THREE.DstColorFactor)return _gl.DST_COLOR;if(p===THREE.OneMinusDstColorFactor)return _gl.ONE_MINUS_DST_COLOR;if(p===THREE.SrcAlphaSaturateFactor)return _gl.SRC_ALPHA_SATURATE;if(extension=extensions.get("WEBGL_compressed_texture_s3tc"),null!==extension){if(p===THREE.RGB_S3TC_DXT1_Format)return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;if(p===THREE.RGBA_S3TC_DXT1_Format)return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(p===THREE.RGBA_S3TC_DXT3_Format)return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(p===THREE.RGBA_S3TC_DXT5_Format)return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(extension=extensions.get("WEBGL_compressed_texture_pvrtc"),null!==extension){if(p===THREE.RGB_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(p===THREE.RGB_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(p===THREE.RGBA_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(p===THREE.RGBA_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(extension=extensions.get("EXT_blend_minmax"),null!==extension){if(p===THREE.MinEquation)return extension.MIN_EXT;if(p===THREE.MaxEquation)return extension.MAX_EXT}return 0}console.log("THREE.WebGLRenderer",THREE.REVISION),parameters=parameters||{};var _canvas=void 0!==parameters.canvas?parameters.canvas:document.createElement("canvas"),_context=void 0!==parameters.context?parameters.context:null,_width=_canvas.width,_height=_canvas.height,pixelRatio=1,_alpha=void 0!==parameters.alpha?parameters.alpha:!1,_depth=void 0!==parameters.depth?parameters.depth:!0,_stencil=void 0!==parameters.stencil?parameters.stencil:!0,_antialias=void 0!==parameters.antialias?parameters.antialias:!1,_premultipliedAlpha=void 0!==parameters.premultipliedAlpha?parameters.premultipliedAlpha:!0,_preserveDrawingBuffer=void 0!==parameters.preserveDrawingBuffer?parameters.preserveDrawingBuffer:!1,_clearColor=new THREE.Color(0),_clearAlpha=0,lights=[],opaqueObjects=[],opaqueObjectsLastIndex=-1,transparentObjects=[],transparentObjectsLastIndex=-1,morphInfluences=new Float32Array(8),sprites=[],lensFlares=[];this.domElement=_canvas,this.context=null,this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.gammaFactor=2,this.gammaInput=!1,this.gammaOutput=!1,this.maxMorphTargets=8,this.maxMorphNormals=4,this.autoScaleCubemaps=!0;var _this=this,_currentProgram=null,_currentFramebuffer=null,_currentMaterialId=-1,_currentGeometryProgram="",_currentCamera=null,_usedTextureUnits=0,_viewportX=0,_viewportY=0,_viewportWidth=_canvas.width,_viewportHeight=_canvas.height,_currentWidth=0,_currentHeight=0,_frustum=new THREE.Frustum,_projScreenMatrix=new THREE.Matrix4,_vector3=new THREE.Vector3,_direction=new THREE.Vector3,_lightsNeedUpdate=!0,_lights={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[],decays:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],anglesCos:[],exponents:[],decays:[]},hemi:{length:0,skyColors:[],groundColors:[],positions:[]}},_infoMemory={geometries:0,textures:0},_infoRender={calls:0,vertices:0,faces:0,points:0};this.info={render:_infoRender,memory:_infoMemory,programs:null};var _gl;try{var attributes={alpha:_alpha,depth:_depth,stencil:_stencil,antialias:_antialias,premultipliedAlpha:_premultipliedAlpha,preserveDrawingBuffer:_preserveDrawingBuffer};if(_gl=_context||_canvas.getContext("webgl",attributes)||_canvas.getContext("experimental-webgl",attributes),null===_gl)throw null!==_canvas.getContext("webgl")?"Error creating WebGL context with your selected attributes.":"Error creating WebGL context.";_canvas.addEventListener("webglcontextlost",onContextLost,!1)}catch(error){console.error("THREE.WebGLRenderer: "+error)}var extensions=new THREE.WebGLExtensions(_gl);extensions.get("OES_texture_float"),extensions.get("OES_texture_float_linear"),extensions.get("OES_texture_half_float"),extensions.get("OES_texture_half_float_linear"),extensions.get("OES_standard_derivatives"),extensions.get("ANGLE_instanced_arrays"),extensions.get("OES_element_index_uint")&&(THREE.BufferGeometry.MaxIndex=4294967296);var capabilities=new THREE.WebGLCapabilities(_gl,extensions,parameters),state=new THREE.WebGLState(_gl,extensions,paramThreeToGL),properties=new THREE.WebGLProperties,objects=new THREE.WebGLObjects(_gl,properties,this.info),programCache=new THREE.WebGLPrograms(this,capabilities);this.info.programs=programCache.programs;var bufferRenderer=new THREE.WebGLBufferRenderer(_gl,extensions,_infoRender),indexedBufferRenderer=new THREE.WebGLIndexedBufferRenderer(_gl,extensions,_infoRender);setDefaultGLState(),this.context=_gl,this.capabilities=capabilities,this.extensions=extensions,this.state=state;var shadowMap=new THREE.WebGLShadowMap(this,lights,objects);this.shadowMap=shadowMap;var spritePlugin=new THREE.SpritePlugin(this,sprites),lensFlarePlugin=new THREE.LensFlarePlugin(this,lensFlares);this.getContext=function(){return _gl},this.getContextAttributes=function(){return _gl.getContextAttributes()},this.forceContextLoss=function(){extensions.get("WEBGL_lose_context").loseContext()},this.getMaxAnisotropy=function(){var value;return function(){if(void 0!==value)return value;var extension=extensions.get("EXT_texture_filter_anisotropic");return value=null!==extension?_gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0}}(),this.getPrecision=function(){return capabilities.precision},this.getPixelRatio=function(){return pixelRatio},this.setPixelRatio=function(value){void 0!==value&&(pixelRatio=value)},this.getSize=function(){return{width:_width,height:_height}},this.setSize=function(width,height,updateStyle){_width=width,_height=height,_canvas.width=width*pixelRatio,_canvas.height=height*pixelRatio,updateStyle!==!1&&(_canvas.style.width=width+"px",_canvas.style.height=height+"px"),this.setViewport(0,0,width,height)},this.setViewport=function(x,y,width,height){_viewportX=x*pixelRatio,_viewportY=y*pixelRatio,_viewportWidth=width*pixelRatio,_viewportHeight=height*pixelRatio,_gl.viewport(_viewportX,_viewportY,_viewportWidth,_viewportHeight)},this.getViewport=function(dimensions){dimensions.x=_viewportX/pixelRatio,dimensions.y=_viewportY/pixelRatio,dimensions.z=_viewportWidth/pixelRatio,dimensions.w=_viewportHeight/pixelRatio},this.setScissor=function(x,y,width,height){_gl.scissor(x*pixelRatio,y*pixelRatio,width*pixelRatio,height*pixelRatio)},this.enableScissorTest=function(boolean){state.setScissorTest(boolean)},this.getClearColor=function(){return _clearColor},this.setClearColor=function(color,alpha){_clearColor.set(color),_clearAlpha=void 0!==alpha?alpha:1,glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)},this.getClearAlpha=function(){return _clearAlpha},this.setClearAlpha=function(alpha){_clearAlpha=alpha,glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)},this.clear=function(color,depth,stencil){var bits=0;(void 0===color||color)&&(bits|=_gl.COLOR_BUFFER_BIT),(void 0===depth||depth)&&(bits|=_gl.DEPTH_BUFFER_BIT),(void 0===stencil||stencil)&&(bits|=_gl.STENCIL_BUFFER_BIT),_gl.clear(bits)},this.clearColor=function(){_gl.clear(_gl.COLOR_BUFFER_BIT)},this.clearDepth=function(){_gl.clear(_gl.DEPTH_BUFFER_BIT)},this.clearStencil=function(){_gl.clear(_gl.STENCIL_BUFFER_BIT)},this.clearTarget=function(renderTarget,color,depth,stencil){this.setRenderTarget(renderTarget),this.clear(color,depth,stencil)},this.resetGLState=resetGLState,this.dispose=function(){_canvas.removeEventListener("webglcontextlost",onContextLost,!1)},this.renderBufferImmediate=function(object,program,material){state.initAttributes();var buffers=properties.get(object);object.hasPositions&&!buffers.position&&(buffers.position=_gl.createBuffer()), +object.hasNormals&&!buffers.normal&&(buffers.normal=_gl.createBuffer()),object.hasUvs&&!buffers.uv&&(buffers.uv=_gl.createBuffer()),object.hasColors&&!buffers.color&&(buffers.color=_gl.createBuffer());var attributes=program.getAttributes();if(object.hasPositions&&(_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.position),_gl.bufferData(_gl.ARRAY_BUFFER,object.positionArray,_gl.DYNAMIC_DRAW),state.enableAttribute(attributes.position),_gl.vertexAttribPointer(attributes.position,3,_gl.FLOAT,!1,0,0)),object.hasNormals){if(_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.normal),"MeshPhongMaterial"!==material.type&&material.shading===THREE.FlatShading)for(var i=0,l=3*object.count;l>i;i+=9){var array=object.normalArray,nx=(array[i+0]+array[i+3]+array[i+6])/3,ny=(array[i+1]+array[i+4]+array[i+7])/3,nz=(array[i+2]+array[i+5]+array[i+8])/3;array[i+0]=nx,array[i+1]=ny,array[i+2]=nz,array[i+3]=nx,array[i+4]=ny,array[i+5]=nz,array[i+6]=nx,array[i+7]=ny,array[i+8]=nz}_gl.bufferData(_gl.ARRAY_BUFFER,object.normalArray,_gl.DYNAMIC_DRAW),state.enableAttribute(attributes.normal),_gl.vertexAttribPointer(attributes.normal,3,_gl.FLOAT,!1,0,0)}object.hasUvs&&material.map&&(_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.uv),_gl.bufferData(_gl.ARRAY_BUFFER,object.uvArray,_gl.DYNAMIC_DRAW),state.enableAttribute(attributes.uv),_gl.vertexAttribPointer(attributes.uv,2,_gl.FLOAT,!1,0,0)),object.hasColors&&material.vertexColors!==THREE.NoColors&&(_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.color),_gl.bufferData(_gl.ARRAY_BUFFER,object.colorArray,_gl.DYNAMIC_DRAW),state.enableAttribute(attributes.color),_gl.vertexAttribPointer(attributes.color,3,_gl.FLOAT,!1,0,0)),state.disableUnusedAttributes(),_gl.drawArrays(_gl.TRIANGLES,0,object.count),object.count=0},this.renderBufferDirect=function(camera,lights,fog,geometry,material,object,group){setMaterial(material);var program=setProgram(camera,lights,fog,material,object),updateBuffers=!1,geometryProgram=geometry.id+"_"+program.id+"_"+material.wireframe;geometryProgram!==_currentGeometryProgram&&(_currentGeometryProgram=geometryProgram,updateBuffers=!0);var morphTargetInfluences=object.morphTargetInfluences;if(void 0!==morphTargetInfluences){for(var activeInfluences=[],i=0,l=morphTargetInfluences.length;l>i;i++){var influence=morphTargetInfluences[i];activeInfluences.push([influence,i])}activeInfluences.sort(numericalSort),activeInfluences.length>8&&(activeInfluences.length=8);for(var morphAttributes=geometry.morphAttributes,i=0,l=activeInfluences.length;l>i;i++){var influence=activeInfluences[i];if(morphInfluences[i]=influence[0],0!==influence[0]){var index=influence[1];material.morphTargets===!0&&morphAttributes.position&&geometry.addAttribute("morphTarget"+i,morphAttributes.position[index]),material.morphNormals===!0&&morphAttributes.normal&&geometry.addAttribute("morphNormal"+i,morphAttributes.normal[index])}else material.morphTargets===!0&&geometry.removeAttribute("morphTarget"+i),material.morphNormals===!0&&geometry.removeAttribute("morphNormal"+i)}var uniforms=program.getUniforms();null!==uniforms.morphTargetInfluences&&_gl.uniform1fv(uniforms.morphTargetInfluences,morphInfluences),updateBuffers=!0}var index=geometry.index,position=geometry.attributes.position;material.wireframe===!0&&(index=objects.getWireframeAttribute(geometry));var renderer;null!==index?(renderer=indexedBufferRenderer,renderer.setIndex(index)):renderer=bufferRenderer,updateBuffers&&(setupVertexAttributes(material,program,geometry),null!==index&&_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,objects.getAttributeBuffer(index)));var dataStart=0,dataCount=1/0;null!==index?dataCount=index.count:void 0!==position&&(dataCount=position.count);var rangeStart=geometry.drawRange.start,rangeCount=geometry.drawRange.count,groupStart=null!==group?group.start:0,groupCount=null!==group?group.count:1/0,drawStart=Math.max(dataStart,rangeStart,groupStart),drawEnd=Math.min(dataStart+dataCount,rangeStart+rangeCount,groupStart+groupCount)-1,drawCount=Math.max(0,drawEnd-drawStart+1);if(object instanceof THREE.Mesh)material.wireframe===!0?(state.setLineWidth(material.wireframeLinewidth*pixelRatio),renderer.setMode(_gl.LINES)):renderer.setMode(_gl.TRIANGLES),geometry instanceof THREE.InstancedBufferGeometry&&geometry.maxInstancedCount>0?renderer.renderInstances(geometry):renderer.render(drawStart,drawCount);else if(object instanceof THREE.Line){var lineWidth=material.linewidth;void 0===lineWidth&&(lineWidth=1),state.setLineWidth(lineWidth*pixelRatio),object instanceof THREE.LineSegments?renderer.setMode(_gl.LINES):renderer.setMode(_gl.LINE_STRIP),renderer.render(drawStart,drawCount)}else object instanceof THREE.Points&&(renderer.setMode(_gl.POINTS),renderer.render(drawStart,drawCount))},this.render=function(scene,camera,renderTarget,forceClear){if(camera instanceof THREE.Camera==!1)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");var fog=scene.fog;if(_currentGeometryProgram="",_currentMaterialId=-1,_currentCamera=null,_lightsNeedUpdate=!0,scene.autoUpdate===!0&&scene.updateMatrixWorld(),null===camera.parent&&camera.updateMatrixWorld(),camera.matrixWorldInverse.getInverse(camera.matrixWorld),_projScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse),_frustum.setFromMatrix(_projScreenMatrix),lights.length=0,opaqueObjectsLastIndex=-1,transparentObjectsLastIndex=-1,sprites.length=0,lensFlares.length=0,projectObject(scene,camera),opaqueObjects.length=opaqueObjectsLastIndex+1,transparentObjects.length=transparentObjectsLastIndex+1,_this.sortObjects===!0&&(opaqueObjects.sort(painterSortStable),transparentObjects.sort(reversePainterSortStable)),shadowMap.render(scene),_infoRender.calls=0,_infoRender.vertices=0,_infoRender.faces=0,_infoRender.points=0,this.setRenderTarget(renderTarget),(this.autoClear||forceClear)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil),scene.overrideMaterial){var overrideMaterial=scene.overrideMaterial;renderObjects(opaqueObjects,camera,lights,fog,overrideMaterial),renderObjects(transparentObjects,camera,lights,fog,overrideMaterial)}else state.setBlending(THREE.NoBlending),renderObjects(opaqueObjects,camera,lights,fog),renderObjects(transparentObjects,camera,lights,fog);if(spritePlugin.render(scene,camera),lensFlarePlugin.render(scene,camera,_currentWidth,_currentHeight),renderTarget){var texture=renderTarget.texture,isTargetPowerOfTwo=isPowerOfTwo(renderTarget);texture.generateMipmaps&&isTargetPowerOfTwo&&texture.minFilter!==THREE.NearestFilter&&texture.minFilter!==THREE.LinearFilter&&updateRenderTargetMipmap(renderTarget)}state.setDepthTest(!0),state.setDepthWrite(!0),state.setColorWrite(!0)},this.setFaceCulling=function(cullFace,frontFaceDirection){cullFace===THREE.CullFaceNone?state.disable(_gl.CULL_FACE):(frontFaceDirection===THREE.FrontFaceDirectionCW?_gl.frontFace(_gl.CW):_gl.frontFace(_gl.CCW),cullFace===THREE.CullFaceBack?_gl.cullFace(_gl.BACK):cullFace===THREE.CullFaceFront?_gl.cullFace(_gl.FRONT):_gl.cullFace(_gl.FRONT_AND_BACK),state.enable(_gl.CULL_FACE))},this.setTexture=function(texture,slot){var textureProperties=properties.get(texture);if(texture.version>0&&textureProperties.__version!==texture.version){var image=texture.image;return void 0===image?void console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",texture):image.complete===!1?void console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",texture):void uploadTexture(textureProperties,texture,slot)}state.activeTexture(_gl.TEXTURE0+slot),state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture)},this.setRenderTarget=function(renderTarget){var isCube=renderTarget instanceof THREE.WebGLRenderTargetCube;if(renderTarget&&void 0===properties.get(renderTarget).__webglFramebuffer){var renderTargetProperties=properties.get(renderTarget),textureProperties=properties.get(renderTarget.texture);void 0===renderTarget.depthBuffer&&(renderTarget.depthBuffer=!0),void 0===renderTarget.stencilBuffer&&(renderTarget.stencilBuffer=!0),renderTarget.addEventListener("dispose",onRenderTargetDispose),textureProperties.__webglTexture=_gl.createTexture(),_infoMemory.textures++;var isTargetPowerOfTwo=isPowerOfTwo(renderTarget),glFormat=paramThreeToGL(renderTarget.texture.format),glType=paramThreeToGL(renderTarget.texture.type);if(isCube){renderTargetProperties.__webglFramebuffer=[],renderTargetProperties.__webglRenderbuffer=[],state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__webglTexture),setTextureParameters(_gl.TEXTURE_CUBE_MAP,renderTarget.texture,isTargetPowerOfTwo);for(var i=0;6>i;i++)renderTargetProperties.__webglFramebuffer[i]=_gl.createFramebuffer(),renderTargetProperties.__webglRenderbuffer[i]=_gl.createRenderbuffer(),state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,renderTarget.width,renderTarget.height,0,glFormat,glType,null),setupFrameBuffer(renderTargetProperties.__webglFramebuffer[i],renderTarget,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i),setupRenderBuffer(renderTargetProperties.__webglRenderbuffer[i],renderTarget);renderTarget.texture.generateMipmaps&&isTargetPowerOfTwo&&_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP)}else renderTargetProperties.__webglFramebuffer=_gl.createFramebuffer(),renderTarget.shareDepthFrom?renderTargetProperties.__webglRenderbuffer=renderTarget.shareDepthFrom.__webglRenderbuffer:renderTargetProperties.__webglRenderbuffer=_gl.createRenderbuffer(),state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture),setTextureParameters(_gl.TEXTURE_2D,renderTarget.texture,isTargetPowerOfTwo),state.texImage2D(_gl.TEXTURE_2D,0,glFormat,renderTarget.width,renderTarget.height,0,glFormat,glType,null),setupFrameBuffer(renderTargetProperties.__webglFramebuffer,renderTarget,_gl.TEXTURE_2D),renderTarget.shareDepthFrom?renderTarget.depthBuffer&&!renderTarget.stencilBuffer?_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.RENDERBUFFER,renderTargetProperties.__webglRenderbuffer):renderTarget.depthBuffer&&renderTarget.stencilBuffer&&_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.RENDERBUFFER,renderTargetProperties.__webglRenderbuffer):setupRenderBuffer(renderTargetProperties.__webglRenderbuffer,renderTarget),renderTarget.texture.generateMipmaps&&isTargetPowerOfTwo&&_gl.generateMipmap(_gl.TEXTURE_2D);isCube?state.bindTexture(_gl.TEXTURE_CUBE_MAP,null):state.bindTexture(_gl.TEXTURE_2D,null),_gl.bindRenderbuffer(_gl.RENDERBUFFER,null),_gl.bindFramebuffer(_gl.FRAMEBUFFER,null)}var framebuffer,width,height,vx,vy;if(renderTarget){var renderTargetProperties=properties.get(renderTarget);framebuffer=isCube?renderTargetProperties.__webglFramebuffer[renderTarget.activeCubeFace]:renderTargetProperties.__webglFramebuffer,width=renderTarget.width,height=renderTarget.height,vx=0,vy=0}else framebuffer=null,width=_viewportWidth,height=_viewportHeight,vx=_viewportX,vy=_viewportY;if(framebuffer!==_currentFramebuffer&&(_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer),_gl.viewport(vx,vy,width,height),_currentFramebuffer=framebuffer),isCube){var textureProperties=properties.get(renderTarget.texture);_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+renderTarget.activeCubeFace,textureProperties.__webglTexture,0)}_currentWidth=width,_currentHeight=height},this.readRenderTargetPixels=function(renderTarget,x,y,width,height,buffer){if(renderTarget instanceof THREE.WebGLRenderTarget==!1)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");var framebuffer=properties.get(renderTarget).__webglFramebuffer;if(framebuffer){var restore=!1;framebuffer!==_currentFramebuffer&&(_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer),restore=!0);try{var texture=renderTarget.texture;if(texture.format!==THREE.RGBAFormat&¶mThreeToGL(texture.format)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_FORMAT))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!(texture.type===THREE.UnsignedByteType||paramThreeToGL(texture.type)===_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_TYPE)||texture.type===THREE.FloatType&&extensions.get("WEBGL_color_buffer_float")||texture.type===THREE.HalfFloatType&&extensions.get("EXT_color_buffer_half_float")))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");_gl.checkFramebufferStatus(_gl.FRAMEBUFFER)===_gl.FRAMEBUFFER_COMPLETE?_gl.readPixels(x,y,width,height,paramThreeToGL(texture.format),paramThreeToGL(texture.type),buffer):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{restore&&_gl.bindFramebuffer(_gl.FRAMEBUFFER,_currentFramebuffer)}}},this.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),extensions.get("OES_texture_float")},this.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),extensions.get("OES_texture_half_float")},this.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),extensions.get("OES_standard_derivatives")},this.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),extensions.get("WEBGL_compressed_texture_s3tc")},this.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),extensions.get("WEBGL_compressed_texture_pvrtc")},this.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),extensions.get("EXT_blend_minmax")},this.supportsVertexTextures=function(){return capabilities.vertexTextures},this.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),extensions.get("ANGLE_instanced_arrays")},this.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},this.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},this.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},this.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},Object.defineProperties(this,{shadowMapEnabled:{get:function(){return shadowMap.enabled},set:function(value){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),shadowMap.enabled=value}},shadowMapType:{get:function(){return shadowMap.type},set:function(value){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),shadowMap.type=value}},shadowMapCullFace:{get:function(){return shadowMap.cullFace},set:function(value){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace."),shadowMap.cullFace=value}},shadowMapDebug:{get:function(){return shadowMap.debug},set:function(value){console.warn("THREE.WebGLRenderer: .shadowMapDebug is now .shadowMap.debug."),shadowMap.debug=value}}})},THREE.WebGLRenderTarget=function(width,height,options){this.uuid=THREE.Math.generateUUID(),this.width=width,this.height=height,options=options||{},void 0===options.minFilter&&(options.minFilter=THREE.LinearFilter),this.texture=new THREE.Texture(void 0,void 0,options.wrapS,options.wrapT,options.magFilter,options.minFilter,options.format,options.type,options.anisotropy),this.depthBuffer=void 0!==options.depthBuffer?options.depthBuffer:!0,this.stencilBuffer=void 0!==options.stencilBuffer?options.stencilBuffer:!0,this.shareDepthFrom=void 0!==options.shareDepthFrom?options.shareDepthFrom:null},THREE.WebGLRenderTarget.prototype={constructor:THREE.WebGLRenderTarget,get wrapS(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set wrapS(value){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=value},get wrapT(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set wrapT(value){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=value},get magFilter(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set magFilter(value){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=value},get minFilter(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set minFilter(value){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=value},get anisotropy(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set anisotropy(value){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=value},get offset(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set offset(value){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=value},get repeat(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set repeat(value){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=value},get format(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set format(value){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=value},get type(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set type(value){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=value},get generateMipmaps(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set generateMipmaps(value){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=value},setSize:function(width,height){this.width===width&&this.height===height||(this.width=width,this.height=height,this.dispose())},clone:function(){return(new this.constructor).copy(this)},copy:function(source){return this.width=source.width,this.height=source.height,this.texture=source.texture.clone(),this.depthBuffer=source.depthBuffer,this.stencilBuffer=source.stencilBuffer,this.shareDepthFrom=source.shareDepthFrom,this},dispose:function(){this.dispatchEvent({type:"dispose"})}},THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype),THREE.WebGLRenderTargetCube=function(width,height,options){THREE.WebGLRenderTarget.call(this,width,height,options),this.activeCubeFace=0},THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype),THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube,THREE.WebGLBufferRenderer=function(_gl,extensions,_infoRender){function setMode(value){mode=value}function render(start,count){_gl.drawArrays(mode,start,count),_infoRender.calls++,_infoRender.vertices+=count,mode===_gl.TRIANGLES&&(_infoRender.faces+=count/3)}function renderInstances(geometry){var extension=extensions.get("ANGLE_instanced_arrays");if(null===extension)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");var position=geometry.attributes.position;position instanceof THREE.InterleavedBufferAttribute?extension.drawArraysInstancedANGLE(mode,0,position.data.count,geometry.maxInstancedCount):extension.drawArraysInstancedANGLE(mode,0,position.count,geometry.maxInstancedCount)}var mode;this.setMode=setMode,this.render=render,this.renderInstances=renderInstances},THREE.WebGLIndexedBufferRenderer=function(_gl,extensions,_infoRender){function setMode(value){mode=value}function setIndex(index){index.array instanceof Uint32Array&&extensions.get("OES_element_index_uint")?(type=_gl.UNSIGNED_INT,size=4):(type=_gl.UNSIGNED_SHORT,size=2)}function render(start,count){_gl.drawElements(mode,count,type,start*size),_infoRender.calls++,_infoRender.vertices+=count,mode===_gl.TRIANGLES&&(_infoRender.faces+=count/3)}function renderInstances(geometry){var extension=extensions.get("ANGLE_instanced_arrays");if(null===extension)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");var index=geometry.index;extension.drawElementsInstancedANGLE(mode,index.array.length,type,0,geometry.maxInstancedCount)}var mode,type,size;this.setMode=setMode,this.setIndex=setIndex,this.render=render,this.renderInstances=renderInstances},THREE.WebGLExtensions=function(gl){var extensions={};this.get=function(name){if(void 0!==extensions[name])return extensions[name];var extension;switch(name){case"EXT_texture_filter_anisotropic":extension=gl.getExtension("EXT_texture_filter_anisotropic")||gl.getExtension("MOZ_EXT_texture_filter_anisotropic")||gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":extension=gl.getExtension("WEBGL_compressed_texture_s3tc")||gl.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":extension=gl.getExtension("WEBGL_compressed_texture_pvrtc")||gl.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:extension=gl.getExtension(name)}return null===extension&&console.warn("THREE.WebGLRenderer: "+name+" extension not supported."),extensions[name]=extension,extension}},THREE.WebGLCapabilities=function(gl,extensions,parameters){function getMaxPrecision(precision){if("highp"===precision){if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.HIGH_FLOAT).precision>0&&gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.HIGH_FLOAT).precision>0)return"highp";precision="mediump"}return"mediump"===precision&&gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.MEDIUM_FLOAT).precision>0&&gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}this.getMaxPrecision=getMaxPrecision,this.precision=void 0!==parameters.precision?parameters.precision:"highp",this.logarithmicDepthBuffer=void 0!==parameters.logarithmicDepthBuffer?parameters.logarithmicDepthBuffer:!1,this.maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS),this.maxVertexTextures=gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),this.maxTextureSize=gl.getParameter(gl.MAX_TEXTURE_SIZE),this.maxCubemapSize=gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE),this.maxAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS),this.maxVertexUniforms=gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS),this.maxVaryings=gl.getParameter(gl.MAX_VARYING_VECTORS),this.maxFragmentUniforms=gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS),this.vertexTextures=this.maxVertexTextures>0,this.floatFragmentTextures=!!extensions.get("OES_texture_float"),this.floatVertexTextures=this.vertexTextures&&this.floatFragmentTextures;var _maxPrecision=getMaxPrecision(this.precision);_maxPrecision!==this.precision&&(console.warn("THREE.WebGLRenderer:",this.precision,"not supported, using",_maxPrecision,"instead."),this.precision=_maxPrecision),this.logarithmicDepthBuffer&&(this.logarithmicDepthBuffer=!!extensions.get("EXT_frag_depth"))},THREE.WebGLGeometries=function(gl,properties,info){function get(object){var geometry=object.geometry;if(void 0!==geometries[geometry.id])return geometries[geometry.id];geometry.addEventListener("dispose",onGeometryDispose);var buffergeometry;return geometry instanceof THREE.BufferGeometry?buffergeometry=geometry:geometry instanceof THREE.Geometry&&(void 0===geometry._bufferGeometry&&(geometry._bufferGeometry=(new THREE.BufferGeometry).setFromObject(object)),buffergeometry=geometry._bufferGeometry),geometries[geometry.id]=buffergeometry,info.memory.geometries++,buffergeometry}function onGeometryDispose(event){var geometry=event.target,buffergeometry=geometries[geometry.id];deleteAttributes(buffergeometry.attributes),geometry.removeEventListener("dispose",onGeometryDispose),delete geometries[geometry.id];var property=properties.get(geometry);property.wireframe&&deleteAttribute(property.wireframe),info.memory.geometries--}function getAttributeBuffer(attribute){return attribute instanceof THREE.InterleavedBufferAttribute?properties.get(attribute.data).__webglBuffer:properties.get(attribute).__webglBuffer}function deleteAttribute(attribute){var buffer=getAttributeBuffer(attribute);void 0!==buffer&&(gl.deleteBuffer(buffer),removeAttributeBuffer(attribute))}function deleteAttributes(attributes){for(var name in attributes)deleteAttribute(attributes[name])}function removeAttributeBuffer(attribute){attribute instanceof THREE.InterleavedBufferAttribute?properties["delete"](attribute.data):properties["delete"](attribute)}var geometries={};this.get=get},THREE.WebGLObjects=function(gl,properties,info){function update(object){var geometry=geometries.get(object);object.geometry instanceof THREE.Geometry&&geometry.updateFromObject(object);var index=geometry.index,attributes=geometry.attributes;null!==index&&updateAttribute(index,gl.ELEMENT_ARRAY_BUFFER);for(var name in attributes)updateAttribute(attributes[name],gl.ARRAY_BUFFER);var morphAttributes=geometry.morphAttributes;for(var name in morphAttributes)for(var array=morphAttributes[name],i=0,l=array.length;l>i;i++)updateAttribute(array[i],gl.ARRAY_BUFFER);return geometry}function updateAttribute(attribute,bufferType){var data=attribute instanceof THREE.InterleavedBufferAttribute?attribute.data:attribute,attributeProperties=properties.get(data);void 0===attributeProperties.__webglBuffer?createBuffer(attributeProperties,data,bufferType):attributeProperties.version!==data.version&&updateBuffer(attributeProperties,data,bufferType)}function createBuffer(attributeProperties,data,bufferType){attributeProperties.__webglBuffer=gl.createBuffer(),gl.bindBuffer(bufferType,attributeProperties.__webglBuffer);var usage=data.dynamic?gl.DYNAMIC_DRAW:gl.STATIC_DRAW;gl.bufferData(bufferType,data.array,usage),attributeProperties.version=data.version}function updateBuffer(attributeProperties,data,bufferType){gl.bindBuffer(bufferType,attributeProperties.__webglBuffer),data.dynamic===!1||-1===data.updateRange.count?gl.bufferSubData(bufferType,0,data.array):0===data.updateRange.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(gl.bufferSubData(bufferType,data.updateRange.offset*data.array.BYTES_PER_ELEMENT,data.array.subarray(data.updateRange.offset,data.updateRange.offset+data.updateRange.count)),data.updateRange.count=0),attributeProperties.version=data.version}function getAttributeBuffer(attribute){return attribute instanceof THREE.InterleavedBufferAttribute?properties.get(attribute.data).__webglBuffer:properties.get(attribute).__webglBuffer}function getWireframeAttribute(geometry){var property=properties.get(geometry);if(void 0!==property.wireframe)return property.wireframe;var indices=[],index=geometry.index,attributes=geometry.attributes,position=attributes.position;if(null!==index)for(var edges={},array=index.array,i=0,l=array.length;l>i;i+=3){var a=array[i+0],b=array[i+1],c=array[i+2];checkEdge(edges,a,b)&&indices.push(a,b),checkEdge(edges,b,c)&&indices.push(b,c),checkEdge(edges,c,a)&&indices.push(c,a)}else for(var array=attributes.position.array,i=0,l=array.length/3-1;l>i;i+=3){var a=i+0,b=i+1,c=i+2;indices.push(a,b,b,c,c,a)}var TypeArray=position.count>65535?Uint32Array:Uint16Array,attribute=new THREE.BufferAttribute(new TypeArray(indices),1);return updateAttribute(attribute,gl.ELEMENT_ARRAY_BUFFER),property.wireframe=attribute,attribute}function checkEdge(edges,a,b){if(a>b){var tmp=a;a=b,b=tmp}var list=edges[a];return void 0===list?(edges[a]=[b],!0):-1===list.indexOf(b)?(list.push(b),!0):!1}var geometries=new THREE.WebGLGeometries(gl,properties,info);this.getAttributeBuffer=getAttributeBuffer,this.getWireframeAttribute=getWireframeAttribute,this.update=update},THREE.WebGLProgram=function(){function generateDefines(defines){var chunks=[];for(var name in defines){var value=defines[name];value!==!1&&chunks.push("#define "+name+" "+value)}return chunks.join("\n")}function fetchUniformLocations(gl,program,identifiers){for(var uniforms={},n=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS),i=0;n>i;i++){var info=gl.getActiveUniform(program,i),name=info.name,location=gl.getUniformLocation(program,name),suffixPos=name.lastIndexOf("[0]");-1!==suffixPos&&suffixPos===name.length-3&&(uniforms[name.substr(0,suffixPos)]=location),uniforms[name]=location}return uniforms}function fetchAttributeLocations(gl,program,identifiers){for(var attributes={},n=gl.getProgramParameter(program,gl.ACTIVE_ATTRIBUTES),i=0;n>i;i++){var info=gl.getActiveAttrib(program,i),name=info.name;attributes[name]=gl.getAttribLocation(program,name)}return attributes}function filterEmptyLine(string){return""!==string}var programIdCount=0;return function(renderer,code,material,parameters){var gl=renderer.context,defines=material.defines,vertexShader=material.__webglShader.vertexShader,fragmentShader=material.__webglShader.fragmentShader,shadowMapTypeDefine="SHADOWMAP_TYPE_BASIC";parameters.shadowMapType===THREE.PCFShadowMap?shadowMapTypeDefine="SHADOWMAP_TYPE_PCF":parameters.shadowMapType===THREE.PCFSoftShadowMap&&(shadowMapTypeDefine="SHADOWMAP_TYPE_PCF_SOFT");var envMapTypeDefine="ENVMAP_TYPE_CUBE",envMapModeDefine="ENVMAP_MODE_REFLECTION",envMapBlendingDefine="ENVMAP_BLENDING_MULTIPLY";if(parameters.envMap){switch(material.envMap.mapping){case THREE.CubeReflectionMapping:case THREE.CubeRefractionMapping:envMapTypeDefine="ENVMAP_TYPE_CUBE";break;case THREE.EquirectangularReflectionMapping:case THREE.EquirectangularRefractionMapping:envMapTypeDefine="ENVMAP_TYPE_EQUIREC";break;case THREE.SphericalReflectionMapping:envMapTypeDefine="ENVMAP_TYPE_SPHERE"}switch(material.envMap.mapping){case THREE.CubeRefractionMapping:case THREE.EquirectangularRefractionMapping:envMapModeDefine="ENVMAP_MODE_REFRACTION"}switch(material.combine){case THREE.MultiplyOperation:envMapBlendingDefine="ENVMAP_BLENDING_MULTIPLY";break;case THREE.MixOperation:envMapBlendingDefine="ENVMAP_BLENDING_MIX";break;case THREE.AddOperation:envMapBlendingDefine="ENVMAP_BLENDING_ADD"}}var prefixVertex,prefixFragment,gammaFactorDefine=renderer.gammaFactor>0?renderer.gammaFactor:1,customDefines=generateDefines(defines),program=gl.createProgram();material instanceof THREE.RawShaderMaterial?(prefixVertex="",prefixFragment=""):(prefixVertex=["precision "+parameters.precision+" float;","precision "+parameters.precision+" int;","#define SHADER_NAME "+material.__webglShader.name,customDefines,parameters.supportsVertexTextures?"#define VERTEX_TEXTURES":"",renderer.gammaInput?"#define GAMMA_INPUT":"",renderer.gammaOutput?"#define GAMMA_OUTPUT":"","#define GAMMA_FACTOR "+gammaFactorDefine,"#define MAX_DIR_LIGHTS "+parameters.maxDirLights,"#define MAX_POINT_LIGHTS "+parameters.maxPointLights,"#define MAX_SPOT_LIGHTS "+parameters.maxSpotLights,"#define MAX_HEMI_LIGHTS "+parameters.maxHemiLights,"#define MAX_SHADOWS "+parameters.maxShadows,"#define MAX_BONES "+parameters.maxBones,parameters.map?"#define USE_MAP":"",parameters.envMap?"#define USE_ENVMAP":"",parameters.envMap?"#define "+envMapModeDefine:"",parameters.lightMap?"#define USE_LIGHTMAP":"",parameters.aoMap?"#define USE_AOMAP":"",parameters.emissiveMap?"#define USE_EMISSIVEMAP":"",parameters.bumpMap?"#define USE_BUMPMAP":"",parameters.normalMap?"#define USE_NORMALMAP":"",parameters.displacementMap&¶meters.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",parameters.specularMap?"#define USE_SPECULARMAP":"",parameters.alphaMap?"#define USE_ALPHAMAP":"",parameters.vertexColors?"#define USE_COLOR":"",parameters.flatShading?"#define FLAT_SHADED":"",parameters.skinning?"#define USE_SKINNING":"",parameters.useVertexTexture?"#define BONE_TEXTURE":"",parameters.morphTargets?"#define USE_MORPHTARGETS":"",parameters.morphNormals&¶meters.flatShading===!1?"#define USE_MORPHNORMALS":"",parameters.doubleSided?"#define DOUBLE_SIDED":"",parameters.flipSided?"#define FLIP_SIDED":"",parameters.shadowMapEnabled?"#define USE_SHADOWMAP":"",parameters.shadowMapEnabled?"#define "+shadowMapTypeDefine:"",parameters.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",parameters.pointLightShadows>0?"#define POINT_LIGHT_SHADOWS":"",parameters.sizeAttenuation?"#define USE_SIZEATTENUATION":"",parameters.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",parameters.logarithmicDepthBuffer&&renderer.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR"," attribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS"," attribute vec3 morphTarget0;"," attribute vec3 morphTarget1;"," attribute vec3 morphTarget2;"," attribute vec3 morphTarget3;"," #ifdef USE_MORPHNORMALS"," attribute vec3 morphNormal0;"," attribute vec3 morphNormal1;"," attribute vec3 morphNormal2;"," attribute vec3 morphNormal3;"," #else"," attribute vec3 morphTarget4;"," attribute vec3 morphTarget5;"," attribute vec3 morphTarget6;"," attribute vec3 morphTarget7;"," #endif","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif","\n"].filter(filterEmptyLine).join("\n"), +prefixFragment=[parameters.bumpMap||parameters.normalMap||parameters.flatShading||material.derivatives?"#extension GL_OES_standard_derivatives : enable":"",parameters.logarithmicDepthBuffer&&renderer.extensions.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"","precision "+parameters.precision+" float;","precision "+parameters.precision+" int;","#define SHADER_NAME "+material.__webglShader.name,customDefines,"#define MAX_DIR_LIGHTS "+parameters.maxDirLights,"#define MAX_POINT_LIGHTS "+parameters.maxPointLights,"#define MAX_SPOT_LIGHTS "+parameters.maxSpotLights,"#define MAX_HEMI_LIGHTS "+parameters.maxHemiLights,"#define MAX_SHADOWS "+parameters.maxShadows,parameters.alphaTest?"#define ALPHATEST "+parameters.alphaTest:"",renderer.gammaInput?"#define GAMMA_INPUT":"",renderer.gammaOutput?"#define GAMMA_OUTPUT":"","#define GAMMA_FACTOR "+gammaFactorDefine,parameters.useFog&¶meters.fog?"#define USE_FOG":"",parameters.useFog&¶meters.fogExp?"#define FOG_EXP2":"",parameters.map?"#define USE_MAP":"",parameters.envMap?"#define USE_ENVMAP":"",parameters.envMap?"#define "+envMapTypeDefine:"",parameters.envMap?"#define "+envMapModeDefine:"",parameters.envMap?"#define "+envMapBlendingDefine:"",parameters.lightMap?"#define USE_LIGHTMAP":"",parameters.aoMap?"#define USE_AOMAP":"",parameters.emissiveMap?"#define USE_EMISSIVEMAP":"",parameters.bumpMap?"#define USE_BUMPMAP":"",parameters.normalMap?"#define USE_NORMALMAP":"",parameters.specularMap?"#define USE_SPECULARMAP":"",parameters.alphaMap?"#define USE_ALPHAMAP":"",parameters.vertexColors?"#define USE_COLOR":"",parameters.flatShading?"#define FLAT_SHADED":"",parameters.metal?"#define METAL":"",parameters.doubleSided?"#define DOUBLE_SIDED":"",parameters.flipSided?"#define FLIP_SIDED":"",parameters.shadowMapEnabled?"#define USE_SHADOWMAP":"",parameters.shadowMapEnabled?"#define "+shadowMapTypeDefine:"",parameters.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",parameters.pointLightShadows>0?"#define POINT_LIGHT_SHADOWS":"",parameters.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",parameters.logarithmicDepthBuffer&&renderer.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","\n"].filter(filterEmptyLine).join("\n"));var vertexGlsl=prefixVertex+vertexShader,fragmentGlsl=prefixFragment+fragmentShader,glVertexShader=THREE.WebGLShader(gl,gl.VERTEX_SHADER,vertexGlsl),glFragmentShader=THREE.WebGLShader(gl,gl.FRAGMENT_SHADER,fragmentGlsl);gl.attachShader(program,glVertexShader),gl.attachShader(program,glFragmentShader),void 0!==material.index0AttributeName?gl.bindAttribLocation(program,0,material.index0AttributeName):parameters.morphTargets===!0&&gl.bindAttribLocation(program,0,"position"),gl.linkProgram(program);var programLog=gl.getProgramInfoLog(program),vertexLog=gl.getShaderInfoLog(glVertexShader),fragmentLog=gl.getShaderInfoLog(glFragmentShader),runnable=!0,haveDiagnostics=!0;gl.getProgramParameter(program,gl.LINK_STATUS)===!1?(runnable=!1,console.error("THREE.WebGLProgram: shader error: ",gl.getError(),"gl.VALIDATE_STATUS",gl.getProgramParameter(program,gl.VALIDATE_STATUS),"gl.getProgramInfoLog",programLog,vertexLog,fragmentLog)):""!==programLog?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",programLog):""!==vertexLog&&""!==fragmentLog||(haveDiagnostics=!1),haveDiagnostics&&(this.diagnostics={runnable:runnable,material:material,programLog:programLog,vertexShader:{log:vertexLog,prefix:prefixVertex},fragmentShader:{log:fragmentLog,prefix:prefixFragment}}),gl.deleteShader(glVertexShader),gl.deleteShader(glFragmentShader);var cachedUniforms;this.getUniforms=function(){return void 0===cachedUniforms&&(cachedUniforms=fetchUniformLocations(gl,program)),cachedUniforms};var cachedAttributes;return this.getAttributes=function(){return void 0===cachedAttributes&&(cachedAttributes=fetchAttributeLocations(gl,program)),cachedAttributes},this.destroy=function(){gl.deleteProgram(program),this.program=void 0},Object.defineProperties(this,{uniforms:{get:function(){return console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms()."),this.getUniforms()}},attributes:{get:function(){return console.warn("THREE.WebGLProgram: .attributes is now .getAttributes()."),this.getAttributes()}}}),this.id=programIdCount++,this.code=code,this.usedTimes=1,this.program=program,this.vertexShader=glVertexShader,this.fragmentShader=glFragmentShader,this}}(),THREE.WebGLPrograms=function(renderer,capabilities){function allocateBones(object){if(capabilities.floatVertexTextures&&object&&object.skeleton&&object.skeleton.useVertexTexture)return 1024;var nVertexUniforms=capabilities.maxVertexUniforms,nVertexMatrices=Math.floor((nVertexUniforms-20)/4),maxBones=nVertexMatrices;return void 0!==object&&object instanceof THREE.SkinnedMesh&&(maxBones=Math.min(object.skeleton.bones.length,maxBones),maxBonesl;l++){var light=lights[l];light.visible!==!1&&(light instanceof THREE.DirectionalLight&&dirLights++,light instanceof THREE.PointLight&&pointLights++,light instanceof THREE.SpotLight&&spotLights++,light instanceof THREE.HemisphereLight&&hemiLights++)}return{directional:dirLights,point:pointLights,spot:spotLights,hemi:hemiLights}}function allocateShadows(lights){for(var maxShadows=0,pointLightShadows=0,l=0,ll=lights.length;ll>l;l++){var light=lights[l];light.castShadow&&((light instanceof THREE.SpotLight||light instanceof THREE.DirectionalLight)&&maxShadows++,light instanceof THREE.PointLight&&(maxShadows++,pointLightShadows++))}return{maxShadows:maxShadows,pointLightShadows:pointLightShadows}}var programs=[],shaderIDs={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},parameterNames=["precision","supportsVertexTextures","map","envMap","envMapMode","lightMap","aoMap","emissiveMap","bumpMap","normalMap","displacementMap","specularMap","alphaMap","combine","vertexColors","fog","useFog","fogExp","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","maxMorphTargets","maxMorphNormals","maxDirLights","maxPointLights","maxSpotLights","maxHemiLights","maxShadows","shadowMapEnabled","pointLightShadows","shadowMapType","shadowMapDebug","alphaTest","metal","doubleSided","flipSided"];this.getParameters=function(material,lights,fog,object){var shaderID=shaderIDs[material.type],maxLightCount=allocateLights(lights),allocatedShadows=allocateShadows(lights),maxBones=allocateBones(object),precision=renderer.getPrecision();null!==material.precision&&(precision=capabilities.getMaxPrecision(material.precision),precision!==material.precision&&console.warn("THREE.WebGLRenderer.initMaterial:",material.precision,"not supported, using",precision,"instead."));var parameters={shaderID:shaderID,precision:precision,supportsVertexTextures:capabilities.vertexTextures,map:!!material.map,envMap:!!material.envMap,envMapMode:material.envMap&&material.envMap.mapping,lightMap:!!material.lightMap,aoMap:!!material.aoMap,emissiveMap:!!material.emissiveMap,bumpMap:!!material.bumpMap,normalMap:!!material.normalMap,displacementMap:!!material.displacementMap,specularMap:!!material.specularMap,alphaMap:!!material.alphaMap,combine:material.combine,vertexColors:material.vertexColors,fog:fog,useFog:material.fog,fogExp:fog instanceof THREE.FogExp2,flatShading:material.shading===THREE.FlatShading,sizeAttenuation:material.sizeAttenuation,logarithmicDepthBuffer:capabilities.logarithmicDepthBuffer,skinning:material.skinning,maxBones:maxBones,useVertexTexture:capabilities.floatVertexTextures&&object&&object.skeleton&&object.skeleton.useVertexTexture,morphTargets:material.morphTargets,morphNormals:material.morphNormals,maxMorphTargets:renderer.maxMorphTargets,maxMorphNormals:renderer.maxMorphNormals,maxDirLights:maxLightCount.directional,maxPointLights:maxLightCount.point,maxSpotLights:maxLightCount.spot,maxHemiLights:maxLightCount.hemi,maxShadows:allocatedShadows.maxShadows,pointLightShadows:allocatedShadows.pointLightShadows,shadowMapEnabled:renderer.shadowMap.enabled&&object.receiveShadow&&allocatedShadows.maxShadows>0,shadowMapType:renderer.shadowMap.type,shadowMapDebug:renderer.shadowMap.debug,alphaTest:material.alphaTest,metal:material.metal,doubleSided:material.side===THREE.DoubleSide,flipSided:material.side===THREE.BackSide};return parameters},this.getProgramCode=function(material,parameters){var chunks=[];if(parameters.shaderID?chunks.push(parameters.shaderID):(chunks.push(material.fragmentShader),chunks.push(material.vertexShader)),void 0!==material.defines)for(var name in material.defines)chunks.push(name),chunks.push(material.defines[name]);for(var i=0;ip;p++){var programInfo=programs[p];if(programInfo.code===code){program=programInfo,++program.usedTimes;break}}return void 0===program&&(program=new THREE.WebGLProgram(renderer,code,material,parameters),programs.push(program)),program},this.releaseProgram=function(program){if(0===--program.usedTimes){var i=programs.indexOf(program);programs[i]=programs[programs.length-1],programs.pop(),program.destroy()}},this.programs=programs},THREE.WebGLProperties=function(){var properties={};this.get=function(object){var uuid=object.uuid,map=properties[uuid];return void 0===map&&(map={},properties[uuid]=map),map},this["delete"]=function(object){delete properties[object.uuid]},this.clear=function(){properties={}}},THREE.WebGLShader=function(){function addLineNumbers(string){for(var lines=string.split("\n"),i=0;i0&&material.morphTargets,useSkinning=object instanceof THREE.SkinnedMesh&&material.skinning,variantIndex=0;useMorphing&&(variantIndex|=_MorphingFlag),useSkinning&&(variantIndex|=_SkinningFlag),newMaterial=materialVariants[variantIndex]}return newMaterial.visible=material.visible,newMaterial.wireframe=material.wireframe,newMaterial.wireframeLinewidth=material.wireframeLinewidth,isPointLight&&void 0!==newMaterial.uniforms.lightPos&&newMaterial.uniforms.lightPos.value.copy(lightPositionWorld),newMaterial}function projectObject(object,camera){if(object.visible!==!1){if((object instanceof THREE.Mesh||object instanceof THREE.Line||object instanceof THREE.Points)&&object.castShadow&&(object.frustumCulled===!1||_frustum.intersectsObject(object)===!0)){var material=object.material;material.visible===!0&&(object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld),_renderList.push(object))}for(var children=object.children,i=0,l=children.length;l>i;i++)projectObject(children[i],camera)}}for(var _gl=_renderer.context,_state=_renderer.state,_frustum=new THREE.Frustum,_projScreenMatrix=new THREE.Matrix4,_lookTarget=(new THREE.Vector3,new THREE.Vector3,new THREE.Vector3),_lightPositionWorld=new THREE.Vector3,_renderList=[],_MorphingFlag=1,_SkinningFlag=2,_NumberOfMaterialVariants=(_MorphingFlag|_SkinningFlag)+1,_depthMaterials=new Array(_NumberOfMaterialVariants),_distanceMaterials=new Array(_NumberOfMaterialVariants),cubeDirections=[new THREE.Vector3(1,0,0),new THREE.Vector3(-1,0,0),new THREE.Vector3(0,0,1),new THREE.Vector3(0,0,-1),new THREE.Vector3(0,1,0),new THREE.Vector3(0,-1,0)],cubeUps=[new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,0,1),new THREE.Vector3(0,0,-1)],cube2DViewPorts=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],_vector4=new THREE.Vector4,depthShader=THREE.ShaderLib.depthRGBA,depthUniforms=THREE.UniformsUtils.clone(depthShader.uniforms),distanceShader=THREE.ShaderLib.distanceRGBA,distanceUniforms=THREE.UniformsUtils.clone(distanceShader.uniforms),i=0;i!==_NumberOfMaterialVariants;++i){var useMorphing=0!==(i&_MorphingFlag),useSkinning=0!==(i&_SkinningFlag),depthMaterial=new THREE.ShaderMaterial({uniforms:depthUniforms,vertexShader:depthShader.vertexShader,fragmentShader:depthShader.fragmentShader,morphTargets:useMorphing,skinning:useSkinning});depthMaterial._shadowPass=!0,_depthMaterials[i]=depthMaterial;var distanceMaterial=new THREE.ShaderMaterial({uniforms:distanceUniforms,vertexShader:distanceShader.vertexShader,fragmentShader:distanceShader.fragmentShader,morphTargets:useMorphing,skinning:useSkinning});distanceMaterial._shadowPass=!0,_distanceMaterials[i]=distanceMaterial}var scope=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=THREE.PCFShadowMap,this.cullFace=THREE.CullFaceFront,this.render=function(scene){var faceCount,isPointLight;if(scope.enabled!==!1&&(scope.autoUpdate!==!1||scope.needsUpdate!==!1)){_gl.clearColor(1,1,1,1),_state.disable(_gl.BLEND),_state.enable(_gl.CULL_FACE),_gl.frontFace(_gl.CCW),_gl.cullFace(scope.cullFace===THREE.CullFaceFront?_gl.FRONT:_gl.BACK),_state.setDepthTest(!0),_renderer.getViewport(_vector4);for(var i=0,il=_lights.length;il>i;i++){var light=_lights[i];if(light.castShadow===!0){var shadow=light.shadow,shadowCamera=shadow.camera,shadowMapSize=shadow.mapSize;if(light instanceof THREE.PointLight){faceCount=6,isPointLight=!0;var vpWidth=shadowMapSize.x/4,vpHeight=shadowMapSize.y/2;cube2DViewPorts[0].set(2*vpWidth,vpHeight,vpWidth,vpHeight),cube2DViewPorts[1].set(0,vpHeight,vpWidth,vpHeight),cube2DViewPorts[2].set(3*vpWidth,vpHeight,vpWidth,vpHeight),cube2DViewPorts[3].set(vpWidth,vpHeight,vpWidth,vpHeight),cube2DViewPorts[4].set(3*vpWidth,0,vpWidth,vpHeight),cube2DViewPorts[5].set(vpWidth,0,vpWidth,vpHeight)}else faceCount=1,isPointLight=!1;if(null===shadow.map){var shadowFilter=THREE.LinearFilter;scope.type===THREE.PCFSoftShadowMap&&(shadowFilter=THREE.NearestFilter);var pars={minFilter:shadowFilter,magFilter:shadowFilter,format:THREE.RGBAFormat};shadow.map=new THREE.WebGLRenderTarget(shadowMapSize.x,shadowMapSize.y,pars),shadow.matrix=new THREE.Matrix4,light instanceof THREE.SpotLight&&(shadowCamera.aspect=shadowMapSize.x/shadowMapSize.y),shadowCamera.updateProjectionMatrix()}var shadowMap=shadow.map,shadowMatrix=shadow.matrix;_lightPositionWorld.setFromMatrixPosition(light.matrixWorld),shadowCamera.position.copy(_lightPositionWorld),_renderer.setRenderTarget(shadowMap),_renderer.clear();for(var face=0;faceCount>face;face++){if(isPointLight){_lookTarget.copy(shadowCamera.position),_lookTarget.add(cubeDirections[face]),shadowCamera.up.copy(cubeUps[face]),shadowCamera.lookAt(_lookTarget);var vpDimensions=cube2DViewPorts[face];_renderer.setViewport(vpDimensions.x,vpDimensions.y,vpDimensions.z,vpDimensions.w)}else _lookTarget.setFromMatrixPosition(light.target.matrixWorld),shadowCamera.lookAt(_lookTarget);shadowCamera.updateMatrixWorld(),shadowCamera.matrixWorldInverse.getInverse(shadowCamera.matrixWorld),shadowMatrix.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),shadowMatrix.multiply(shadowCamera.projectionMatrix),shadowMatrix.multiply(shadowCamera.matrixWorldInverse),_projScreenMatrix.multiplyMatrices(shadowCamera.projectionMatrix,shadowCamera.matrixWorldInverse),_frustum.setFromMatrix(_projScreenMatrix),_renderList.length=0,projectObject(scene,shadowCamera);for(var j=0,jl=_renderList.length;jl>j;j++){var object=_renderList[j],geometry=_objects.update(object),material=object.material;if(material instanceof THREE.MeshFaceMaterial)for(var groups=geometry.groups,materials=material.materials,k=0,kl=groups.length;kl>k;k++){var group=groups[k],groupMaterial=materials[group.materialIndex];if(groupMaterial.visible===!0){var depthMaterial=getDepthMaterial(object,groupMaterial,isPointLight,_lightPositionWorld);_renderer.renderBufferDirect(shadowCamera,_lights,null,geometry,depthMaterial,object,group)}}else{var depthMaterial=getDepthMaterial(object,material,isPointLight,_lightPositionWorld);_renderer.renderBufferDirect(shadowCamera,_lights,null,geometry,depthMaterial,object,null)}}}_renderer.resetGLState()}}_renderer.setViewport(_vector4.x,_vector4.y,_vector4.z,_vector4.w);var clearColor=_renderer.getClearColor(),clearAlpha=_renderer.getClearAlpha();_renderer.setClearColor(clearColor,clearAlpha),_state.enable(_gl.BLEND),scope.cullFace===THREE.CullFaceFront&&_gl.cullFace(_gl.BACK),_renderer.resetGLState(),scope.needsUpdate=!1}}},THREE.WebGLState=function(gl,extensions,paramThreeToGL){var _this=this,newAttributes=new Uint8Array(16),enabledAttributes=new Uint8Array(16),attributeDivisors=new Uint8Array(16),capabilities={},compressedTextureFormats=null,currentBlending=null,currentBlendEquation=null,currentBlendSrc=null,currentBlendDst=null,currentBlendEquationAlpha=null,currentBlendSrcAlpha=null,currentBlendDstAlpha=null,currentDepthFunc=null,currentDepthWrite=null,currentColorWrite=null,currentFlipSided=null,currentLineWidth=null,currentPolygonOffsetFactor=null,currentPolygonOffsetUnits=null,maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS),currentTextureSlot=void 0,currentBoundTextures={};this.init=function(){gl.clearColor(0,0,0,1),gl.clearDepth(1),gl.clearStencil(0),this.enable(gl.DEPTH_TEST),gl.depthFunc(gl.LEQUAL),gl.frontFace(gl.CCW),gl.cullFace(gl.BACK),this.enable(gl.CULL_FACE),this.enable(gl.BLEND),gl.blendEquation(gl.FUNC_ADD),gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA)},this.initAttributes=function(){for(var i=0,l=newAttributes.length;l>i;i++)newAttributes[i]=0},this.enableAttribute=function(attribute){if(newAttributes[attribute]=1,0===enabledAttributes[attribute]&&(gl.enableVertexAttribArray(attribute),enabledAttributes[attribute]=1),0!==attributeDivisors[attribute]){var extension=extensions.get("ANGLE_instanced_arrays");extension.vertexAttribDivisorANGLE(attribute,0),attributeDivisors[attribute]=0}},this.enableAttributeAndDivisor=function(attribute,meshPerAttribute,extension){newAttributes[attribute]=1,0===enabledAttributes[attribute]&&(gl.enableVertexAttribArray(attribute),enabledAttributes[attribute]=1),attributeDivisors[attribute]!==meshPerAttribute&&(extension.vertexAttribDivisorANGLE(attribute,meshPerAttribute),attributeDivisors[attribute]=meshPerAttribute)},this.disableUnusedAttributes=function(){for(var i=0,l=enabledAttributes.length;l>i;i++)enabledAttributes[i]!==newAttributes[i]&&(gl.disableVertexAttribArray(i),enabledAttributes[i]=0)},this.enable=function(id){capabilities[id]!==!0&&(gl.enable(id),capabilities[id]=!0)},this.disable=function(id){capabilities[id]!==!1&&(gl.disable(id),capabilities[id]=!1)},this.getCompressedTextureFormats=function(){if(null===compressedTextureFormats&&(compressedTextureFormats=[],extensions.get("WEBGL_compressed_texture_pvrtc")||extensions.get("WEBGL_compressed_texture_s3tc")))for(var formats=gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS),i=0;i0;var shader;shader=hasVertexTexture?{vertexShader:["uniform lowp int renderType;","uniform vec3 screenPosition;","uniform vec2 scale;","uniform float rotation;","uniform sampler2D occlusionMap;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","varying float vVisibility;","void main() {","vUV = uv;","vec2 pos = position;","if ( renderType == 2 ) {","vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );","visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );","visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );","visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );","vVisibility = visibility.r / 9.0;","vVisibility *= 1.0 - visibility.g / 9.0;","vVisibility *= visibility.b / 9.0;","vVisibility *= 1.0 - visibility.a / 9.0;","pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;","pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;","}","gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );","}"].join("\n"),fragmentShader:["uniform lowp int renderType;","uniform sampler2D map;","uniform float opacity;","uniform vec3 color;","varying vec2 vUV;","varying float vVisibility;","void main() {","if ( renderType == 0 ) {","gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );","} else if ( renderType == 1 ) {","gl_FragColor = texture2D( map, vUV );","} else {","vec4 texture = texture2D( map, vUV );","texture.a *= opacity * vVisibility;","gl_FragColor = texture;","gl_FragColor.rgb *= color;","}","}"].join("\n")}:{vertexShader:["uniform lowp int renderType;","uniform vec3 screenPosition;","uniform vec2 scale;","uniform float rotation;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","void main() {","vUV = uv;","vec2 pos = position;","if ( renderType == 2 ) {","pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;","pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;","}","gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );","}"].join("\n"),fragmentShader:["precision mediump float;","uniform lowp int renderType;","uniform sampler2D map;","uniform sampler2D occlusionMap;","uniform float opacity;","uniform vec3 color;","varying vec2 vUV;","void main() {","if ( renderType == 0 ) {","gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );","} else if ( renderType == 1 ) {","gl_FragColor = texture2D( map, vUV );","} else {","float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;","visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;","visibility = ( 1.0 - visibility / 4.0 );","vec4 texture = texture2D( map, vUV );","texture.a *= opacity * visibility;","gl_FragColor = texture;","gl_FragColor.rgb *= color;","}","}"].join("\n")},program=createProgram(shader),attributes={vertex:gl.getAttribLocation(program,"position"),uv:gl.getAttribLocation(program,"uv")},uniforms={renderType:gl.getUniformLocation(program,"renderType"),map:gl.getUniformLocation(program,"map"),occlusionMap:gl.getUniformLocation(program,"occlusionMap"),opacity:gl.getUniformLocation(program,"opacity"),color:gl.getUniformLocation(program,"color"),scale:gl.getUniformLocation(program,"scale"),rotation:gl.getUniformLocation(program,"rotation"),screenPosition:gl.getUniformLocation(program,"screenPosition")}}function createProgram(shader){var program=gl.createProgram(),fragmentShader=gl.createShader(gl.FRAGMENT_SHADER),vertexShader=gl.createShader(gl.VERTEX_SHADER),prefix="precision "+renderer.getPrecision()+" float;\n";return gl.shaderSource(fragmentShader,prefix+shader.fragmentShader),gl.shaderSource(vertexShader,prefix+shader.vertexShader),gl.compileShader(fragmentShader),gl.compileShader(vertexShader),gl.attachShader(program,fragmentShader),gl.attachShader(program,vertexShader),gl.linkProgram(program),program}var vertexBuffer,elementBuffer,program,attributes,uniforms,hasVertexTexture,tempTexture,occlusionTexture,gl=renderer.context,state=renderer.state;this.render=function(scene,camera,viewportWidth,viewportHeight){if(0!==flares.length){var tempPosition=new THREE.Vector3,invAspect=viewportHeight/viewportWidth,halfViewportWidth=.5*viewportWidth,halfViewportHeight=.5*viewportHeight,size=16/viewportHeight,scale=new THREE.Vector2(size*invAspect,size),screenPosition=new THREE.Vector3(1,1,0),screenPositionPixels=new THREE.Vector2(1,1);void 0===program&&init(),gl.useProgram(program),state.initAttributes(),state.enableAttribute(attributes.vertex),state.enableAttribute(attributes.uv),state.disableUnusedAttributes(),gl.uniform1i(uniforms.occlusionMap,0),gl.uniform1i(uniforms.map,1),gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer),gl.vertexAttribPointer(attributes.vertex,2,gl.FLOAT,!1,16,0),gl.vertexAttribPointer(attributes.uv,2,gl.FLOAT,!1,16,8),gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer),state.disable(gl.CULL_FACE),gl.depthMask(!1);for(var i=0,l=flares.length;l>i;i++){size=16/viewportHeight,scale.set(size*invAspect,size);var flare=flares[i];if(tempPosition.set(flare.matrixWorld.elements[12],flare.matrixWorld.elements[13],flare.matrixWorld.elements[14]),tempPosition.applyMatrix4(camera.matrixWorldInverse),tempPosition.applyProjection(camera.projectionMatrix),screenPosition.copy(tempPosition),screenPositionPixels.x=screenPosition.x*halfViewportWidth+halfViewportWidth,screenPositionPixels.y=screenPosition.y*halfViewportHeight+halfViewportHeight, +hasVertexTexture||screenPositionPixels.x>0&&screenPositionPixels.x0&&screenPositionPixels.yj;j++){var sprite=flare.lensFlares[j];sprite.opacity>.001&&sprite.scale>.001&&(screenPosition.x=sprite.x,screenPosition.y=sprite.y,screenPosition.z=sprite.z,size=sprite.size*sprite.scale/viewportHeight,scale.x=size*invAspect,scale.y=size,gl.uniform3f(uniforms.screenPosition,screenPosition.x,screenPosition.y,screenPosition.z),gl.uniform2f(uniforms.scale,scale.x,scale.y),gl.uniform1f(uniforms.rotation,sprite.rotation),gl.uniform1f(uniforms.opacity,sprite.opacity),gl.uniform3f(uniforms.color,sprite.color.r,sprite.color.g,sprite.color.b),state.setBlending(sprite.blending,sprite.blendEquation,sprite.blendSrc,sprite.blendDst),renderer.setTexture(sprite.texture,1),gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0))}}}state.enable(gl.CULL_FACE),state.enable(gl.DEPTH_TEST),gl.depthMask(!0),renderer.resetGLState()}}},THREE.SpritePlugin=function(renderer,sprites){function init(){var vertices=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),faces=new Uint16Array([0,1,2,0,2,3]);vertexBuffer=gl.createBuffer(),elementBuffer=gl.createBuffer(),gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer),gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW),gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer),gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,faces,gl.STATIC_DRAW),program=createProgram(),attributes={position:gl.getAttribLocation(program,"position"),uv:gl.getAttribLocation(program,"uv")},uniforms={uvOffset:gl.getUniformLocation(program,"uvOffset"),uvScale:gl.getUniformLocation(program,"uvScale"),rotation:gl.getUniformLocation(program,"rotation"),scale:gl.getUniformLocation(program,"scale"),color:gl.getUniformLocation(program,"color"),map:gl.getUniformLocation(program,"map"),opacity:gl.getUniformLocation(program,"opacity"),modelViewMatrix:gl.getUniformLocation(program,"modelViewMatrix"),projectionMatrix:gl.getUniformLocation(program,"projectionMatrix"),fogType:gl.getUniformLocation(program,"fogType"),fogDensity:gl.getUniformLocation(program,"fogDensity"),fogNear:gl.getUniformLocation(program,"fogNear"),fogFar:gl.getUniformLocation(program,"fogFar"),fogColor:gl.getUniformLocation(program,"fogColor"),alphaTest:gl.getUniformLocation(program,"alphaTest")};var canvas=document.createElement("canvas");canvas.width=8,canvas.height=8;var context=canvas.getContext("2d");context.fillStyle="white",context.fillRect(0,0,8,8),texture=new THREE.Texture(canvas),texture.needsUpdate=!0}function createProgram(){var program=gl.createProgram(),vertexShader=gl.createShader(gl.VERTEX_SHADER),fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);return gl.shaderSource(vertexShader,["precision "+renderer.getPrecision()+" float;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform float rotation;","uniform vec2 scale;","uniform vec2 uvOffset;","uniform vec2 uvScale;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","void main() {","vUV = uvOffset + uv * uvScale;","vec2 alignedPosition = position * scale;","vec2 rotatedPosition;","rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;","rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;","vec4 finalPosition;","finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );","finalPosition.xy += rotatedPosition;","finalPosition = projectionMatrix * finalPosition;","gl_Position = finalPosition;","}"].join("\n")),gl.shaderSource(fragmentShader,["precision "+renderer.getPrecision()+" float;","uniform vec3 color;","uniform sampler2D map;","uniform float opacity;","uniform int fogType;","uniform vec3 fogColor;","uniform float fogDensity;","uniform float fogNear;","uniform float fogFar;","uniform float alphaTest;","varying vec2 vUV;","void main() {","vec4 texture = texture2D( map, vUV );","if ( texture.a < alphaTest ) discard;","gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );","if ( fogType > 0 ) {","float depth = gl_FragCoord.z / gl_FragCoord.w;","float fogFactor = 0.0;","if ( fogType == 1 ) {","fogFactor = smoothstep( fogNear, fogFar, depth );","} else {","const float LOG2 = 1.442695;","fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );","fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );","}","gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );","}","}"].join("\n")),gl.compileShader(vertexShader),gl.compileShader(fragmentShader),gl.attachShader(program,vertexShader),gl.attachShader(program,fragmentShader),gl.linkProgram(program),program}function painterSortStable(a,b){return a.z!==b.z?b.z-a.z:b.id-a.id}var vertexBuffer,elementBuffer,program,attributes,uniforms,texture,gl=renderer.context,state=renderer.state,spritePosition=new THREE.Vector3,spriteRotation=new THREE.Quaternion,spriteScale=new THREE.Vector3;this.render=function(scene,camera){if(0!==sprites.length){void 0===program&&init(),gl.useProgram(program),state.initAttributes(),state.enableAttribute(attributes.position),state.enableAttribute(attributes.uv),state.disableUnusedAttributes(),state.disable(gl.CULL_FACE),state.enable(gl.BLEND),gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer),gl.vertexAttribPointer(attributes.position,2,gl.FLOAT,!1,16,0),gl.vertexAttribPointer(attributes.uv,2,gl.FLOAT,!1,16,8),gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer),gl.uniformMatrix4fv(uniforms.projectionMatrix,!1,camera.projectionMatrix.elements),state.activeTexture(gl.TEXTURE0),gl.uniform1i(uniforms.map,0);var oldFogType=0,sceneFogType=0,fog=scene.fog;fog?(gl.uniform3f(uniforms.fogColor,fog.color.r,fog.color.g,fog.color.b),fog instanceof THREE.Fog?(gl.uniform1f(uniforms.fogNear,fog.near),gl.uniform1f(uniforms.fogFar,fog.far),gl.uniform1i(uniforms.fogType,1),oldFogType=1,sceneFogType=1):fog instanceof THREE.FogExp2&&(gl.uniform1f(uniforms.fogDensity,fog.density),gl.uniform1i(uniforms.fogType,2),oldFogType=2,sceneFogType=2)):(gl.uniform1i(uniforms.fogType,0),oldFogType=0,sceneFogType=0);for(var i=0,l=sprites.length;l>i;i++){var sprite=sprites[i];sprite.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,sprite.matrixWorld),sprite.z=-sprite.modelViewMatrix.elements[14]}sprites.sort(painterSortStable);for(var scale=[],i=0,l=sprites.length;l>i;i++){var sprite=sprites[i],material=sprite.material;gl.uniform1f(uniforms.alphaTest,material.alphaTest),gl.uniformMatrix4fv(uniforms.modelViewMatrix,!1,sprite.modelViewMatrix.elements),sprite.matrixWorld.decompose(spritePosition,spriteRotation,spriteScale),scale[0]=spriteScale.x,scale[1]=spriteScale.y;var fogType=0;scene.fog&&material.fog&&(fogType=sceneFogType),oldFogType!==fogType&&(gl.uniform1i(uniforms.fogType,fogType),oldFogType=fogType),null!==material.map?(gl.uniform2f(uniforms.uvOffset,material.map.offset.x,material.map.offset.y),gl.uniform2f(uniforms.uvScale,material.map.repeat.x,material.map.repeat.y)):(gl.uniform2f(uniforms.uvOffset,0,0),gl.uniform2f(uniforms.uvScale,1,1)),gl.uniform1f(uniforms.opacity,material.opacity),gl.uniform3f(uniforms.color,material.color.r,material.color.g,material.color.b),gl.uniform1f(uniforms.rotation,material.rotation),gl.uniform2fv(uniforms.scale,scale),state.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst),state.setDepthTest(material.depthTest),state.setDepthWrite(material.depthWrite),material.map&&material.map.image&&material.map.image.width?renderer.setTexture(material.map,0):renderer.setTexture(texture,0),gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0)}state.enable(gl.CULL_FACE),renderer.resetGLState()}}},THREE.CurveUtils={tangentQuadraticBezier:function(t,p0,p1,p2){return 2*(1-t)*(p1-p0)+2*t*(p2-p1)},tangentCubicBezier:function(t,p0,p1,p2,p3){return-3*p0*(1-t)*(1-t)+3*p1*(1-t)*(1-t)-6*t*p1*(1-t)+6*t*p2*(1-t)-3*t*t*p2+3*t*t*p3},tangentSpline:function(t,p0,p1,p2,p3){var h00=6*t*t-6*t,h10=3*t*t-4*t+1,h01=-6*t*t+6*t,h11=3*t*t-2*t;return h00+h10+h01+h11},interpolate:function(p0,p1,p2,p3,t){var v0=.5*(p2-p0),v1=.5*(p3-p1),t2=t*t,t3=t*t2;return(2*p1-2*p2+v0+v1)*t3+(-3*p1+3*p2-2*v0-v1)*t2+v0*t+p1}},THREE.GeometryUtils={merge:function(geometry1,geometry2,materialIndexOffset){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");var matrix;geometry2 instanceof THREE.Mesh&&(geometry2.matrixAutoUpdate&&geometry2.updateMatrix(),matrix=geometry2.matrix,geometry2=geometry2.geometry),geometry1.merge(geometry2,matrix,materialIndexOffset)},center:function(geometry){return console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead."),geometry.center()}},THREE.ImageUtils={crossOrigin:void 0,loadTexture:function(url,mapping,onLoad,onError){console.warn("THREE.ImageUtils.loadTexture is being deprecated. Use THREE.TextureLoader() instead.");var loader=new THREE.TextureLoader;loader.setCrossOrigin(this.crossOrigin);var texture=loader.load(url,onLoad,void 0,onError);return mapping&&(texture.mapping=mapping),texture},loadTextureCube:function(urls,mapping,onLoad,onError){console.warn("THREE.ImageUtils.loadTextureCube is being deprecated. Use THREE.CubeTextureLoader() instead.");var loader=new THREE.CubeTextureLoader;loader.setCrossOrigin(this.crossOrigin);var texture=loader.load(urls,onLoad,void 0,onError);return mapping&&(texture.mapping=mapping),texture},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}},THREE.SceneUtils={createMultiMaterialObject:function(geometry,materials){for(var group=new THREE.Group,i=0,l=materials.length;l>i;i++)group.add(new THREE.Mesh(geometry,materials[i]));return group},detach:function(child,parent,scene){child.applyMatrix(parent.matrixWorld),parent.remove(child),scene.add(child)},attach:function(child,scene,parent){var matrixWorldInverse=new THREE.Matrix4;matrixWorldInverse.getInverse(parent.matrixWorld),child.applyMatrix(matrixWorldInverse),scene.remove(child),parent.add(child)}},THREE.ShapeUtils={area:function(contour){for(var n=contour.length,a=0,p=n-1,q=0;n>q;p=q++)a+=contour[p].x*contour[q].y-contour[q].x*contour[p].y;return.5*a},triangulate:function(){function snip(contour,u,v,w,n,verts){var p,ax,ay,bx,by,cx,cy,px,py;if(ax=contour[verts[u]].x,ay=contour[verts[u]].y,bx=contour[verts[v]].x,by=contour[verts[v]].y,cx=contour[verts[w]].x,cy=contour[verts[w]].y,Number.EPSILON>(bx-ax)*(cy-ay)-(by-ay)*(cx-ax))return!1;var aX,aY,bX,bY,cX,cY,apx,apy,bpx,bpy,cpx,cpy,cCROSSap,bCROSScp,aCROSSbp;for(aX=cx-bx,aY=cy-by,bX=ax-cx,bY=ay-cy,cX=bx-ax,cY=by-ay,p=0;n>p;p++)if(px=contour[verts[p]].x,py=contour[verts[p]].y,!(px===ax&&py===ay||px===bx&&py===by||px===cx&&py===cy)&&(apx=px-ax,apy=py-ay,bpx=px-bx,bpy=py-by,cpx=px-cx,cpy=py-cy,aCROSSbp=aX*bpy-aY*bpx,cCROSSap=cX*apy-cY*apx,bCROSScp=bX*cpy-bY*cpx,aCROSSbp>=-Number.EPSILON&&bCROSScp>=-Number.EPSILON&&cCROSSap>=-Number.EPSILON))return!1;return!0}return function(contour,indices){var n=contour.length;if(3>n)return null;var u,v,w,result=[],verts=[],vertIndices=[];if(THREE.ShapeUtils.area(contour)>0)for(v=0;n>v;v++)verts[v]=v;else for(v=0;n>v;v++)verts[v]=n-1-v;var nv=n,count=2*nv;for(v=nv-1;nv>2;){if(count--<=0)return console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()"),indices?vertIndices:result;if(u=v,u>=nv&&(u=0),v=u+1,v>=nv&&(v=0),w=v+1,w>=nv&&(w=0),snip(contour,u,v,w,nv,verts)){var a,b,c,s,t;for(a=verts[u],b=verts[v],c=verts[w],result.push([contour[a],contour[b],contour[c]]),vertIndices.push([verts[u],verts[v],verts[w]]),s=v,t=v+1;nv>t;s++,t++)verts[s]=verts[t];nv--,count=2*nv}}return indices?vertIndices:result}}(),triangulateShape:function(contour,holes){function point_in_segment_2D_colin(inSegPt1,inSegPt2,inOtherPt){return inSegPt1.x!==inSegPt2.x?inSegPt1.xNumber.EPSILON){var perpSeg2;if(limit>0){if(0>perpSeg1||perpSeg1>limit)return[];if(perpSeg2=seg2dy*seg1seg2dx-seg2dx*seg1seg2dy,0>perpSeg2||perpSeg2>limit)return[]}else{if(perpSeg1>0||limit>perpSeg1)return[];if(perpSeg2=seg2dy*seg1seg2dx-seg2dx*seg1seg2dy,perpSeg2>0||limit>perpSeg2)return[]}if(0===perpSeg2)return!inExcludeAdjacentSegs||0!==perpSeg1&&perpSeg1!==limit?[inSeg1Pt1]:[];if(perpSeg2===limit)return!inExcludeAdjacentSegs||0!==perpSeg1&&perpSeg1!==limit?[inSeg1Pt2]:[];if(0===perpSeg1)return[inSeg2Pt1];if(perpSeg1===limit)return[inSeg2Pt2];var factorSeg1=perpSeg2/limit;return[{x:inSeg1Pt1.x+factorSeg1*seg1dx,y:inSeg1Pt1.y+factorSeg1*seg1dy}]}if(0!==perpSeg1||seg2dy*seg1seg2dx!==seg2dx*seg1seg2dy)return[];var seg1Pt=0===seg1dx&&0===seg1dy,seg2Pt=0===seg2dx&&0===seg2dy;if(seg1Pt&&seg2Pt)return inSeg1Pt1.x!==inSeg2Pt1.x||inSeg1Pt1.y!==inSeg2Pt1.y?[]:[inSeg1Pt1];if(seg1Pt)return point_in_segment_2D_colin(inSeg2Pt1,inSeg2Pt2,inSeg1Pt1)?[inSeg1Pt1]:[];if(seg2Pt)return point_in_segment_2D_colin(inSeg1Pt1,inSeg1Pt2,inSeg2Pt1)?[inSeg2Pt1]:[];var seg1min,seg1max,seg1minVal,seg1maxVal,seg2min,seg2max,seg2minVal,seg2maxVal;return 0!==seg1dx?(inSeg1Pt1.x=seg1minVal?seg2minVal>seg1maxVal?[]:seg1maxVal===seg2minVal?inExcludeAdjacentSegs?[]:[seg2min]:seg2maxVal>=seg1maxVal?[seg2min,seg1max]:[seg2min,seg2max]:seg1minVal>seg2maxVal?[]:seg1minVal===seg2maxVal?inExcludeAdjacentSegs?[]:[seg1min]:seg2maxVal>=seg1maxVal?[seg1min,seg1max]:[seg1min,seg2max]}function isPointInsideAngle(inVertex,inLegFromPt,inLegToPt,inOtherPt){var legFromPtX=inLegFromPt.x-inVertex.x,legFromPtY=inLegFromPt.y-inVertex.y,legToPtX=inLegToPt.x-inVertex.x,legToPtY=inLegToPt.y-inVertex.y,otherPtX=inOtherPt.x-inVertex.x,otherPtY=inOtherPt.y-inVertex.y,from2toAngle=legFromPtX*legToPtY-legFromPtY*legToPtX,from2otherAngle=legFromPtX*otherPtY-legFromPtY*otherPtX;if(Math.abs(from2toAngle)>Number.EPSILON){var other2toAngle=otherPtX*legToPtY-otherPtY*legToPtX;return from2toAngle>0?from2otherAngle>=0&&other2toAngle>=0:from2otherAngle>=0||other2toAngle>=0}return from2otherAngle>0}function removeHoles(contour,holes){function isCutLineInsideAngles(inShapeIdx,inHoleIdx){var lastShapeIdx=shape.length-1,prevShapeIdx=inShapeIdx-1;0>prevShapeIdx&&(prevShapeIdx=lastShapeIdx);var nextShapeIdx=inShapeIdx+1;nextShapeIdx>lastShapeIdx&&(nextShapeIdx=0);var insideAngle=isPointInsideAngle(shape[inShapeIdx],shape[prevShapeIdx],shape[nextShapeIdx],hole[inHoleIdx]);if(!insideAngle)return!1;var lastHoleIdx=hole.length-1,prevHoleIdx=inHoleIdx-1;0>prevHoleIdx&&(prevHoleIdx=lastHoleIdx);var nextHoleIdx=inHoleIdx+1;return nextHoleIdx>lastHoleIdx&&(nextHoleIdx=0),insideAngle=isPointInsideAngle(hole[inHoleIdx],hole[prevHoleIdx],hole[nextHoleIdx],shape[inShapeIdx]),!!insideAngle}function intersectsShapeEdge(inShapePt,inHolePt){var sIdx,nextIdx,intersection;for(sIdx=0;sIdx0)return!0;return!1}function intersectsHoleEdge(inShapePt,inHolePt){var ihIdx,chkHole,hIdx,nextIdx,intersection;for(ihIdx=0;ihIdx0)return!0;return!1}for(var hole,holeIndex,shapeIndex,shapePt,holePt,holeIdx,cutKey,tmpShape1,tmpShape2,tmpHole1,tmpHole2,shape=contour.concat(),indepHoles=[],failedCuts=[],h=0,hl=holes.length;hl>h;h++)indepHoles.push(h);for(var minShapeIndex=0,counter=2*indepHoles.length;indepHoles.length>0;){if(counter--,0>counter){console.log("Infinite Loop! Holes left:"+indepHoles.length+", Probably Hole outside Shape!");break}for(shapeIndex=minShapeIndex;shapeIndex=0)break;failedCuts[cutKey]=!0}if(holeIndex>=0)break}}return shape}for(var i,il,f,face,key,index,allPointsMap={},allpoints=contour.concat(),h=0,hl=holes.length;hl>h;h++)Array.prototype.push.apply(allpoints,holes[h]);for(i=0,il=allpoints.length;il>i;i++)key=allpoints[i].x+":"+allpoints[i].y,void 0!==allPointsMap[key]&&console.warn("THREE.Shape: Duplicate point",key),allPointsMap[key]=i;var shapeWithoutHoles=removeHoles(contour,holes),triangles=THREE.ShapeUtils.triangulate(shapeWithoutHoles,!1);for(i=0,il=triangles.length;il>i;i++)for(face=triangles[i],f=0;3>f;f++)key=face[f].x+":"+face[f].y,index=allPointsMap[key],void 0!==index&&(face[f]=index);return triangles.concat()},isClockWise:function(pts){return THREE.ShapeUtils.area(pts)<0},b2:function(){function b2p0(t,p){var k=1-t;return k*k*p}function b2p1(t,p){return 2*(1-t)*t*p}function b2p2(t,p){return t*t*p}return function(t,p0,p1,p2){return b2p0(t,p0)+b2p1(t,p1)+b2p2(t,p2)}}(),b3:function(){function b3p0(t,p){var k=1-t;return k*k*k*p}function b3p1(t,p){var k=1-t;return 3*k*k*t*p}function b3p2(t,p){var k=1-t;return 3*k*t*t*p}function b3p3(t,p){return t*t*t*p}return function(t,p0,p1,p2,p3){return b3p0(t,p0)+b3p1(t,p1)+b3p2(t,p2)+b3p3(t,p3)}}()},THREE.Audio=function(listener){THREE.Object3D.call(this),this.type="Audio",this.context=listener.context,this.source=this.context.createBufferSource(),this.source.onended=this.onEnded.bind(this),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.panner=this.context.createPanner(),this.panner.connect(this.gain),this.autoplay=!1,this.startTime=0,this.playbackRate=1,this.isPlaying=!1},THREE.Audio.prototype=Object.create(THREE.Object3D.prototype),THREE.Audio.prototype.constructor=THREE.Audio,THREE.Audio.prototype.load=function(file){var scope=this,request=new XMLHttpRequest;return request.open("GET",file,!0),request.responseType="arraybuffer",request.onload=function(e){scope.context.decodeAudioData(this.response,function(buffer){scope.source.buffer=buffer,scope.autoplay&&scope.play()})},request.send(),this},THREE.Audio.prototype.play=function(){if(this.isPlaying===!0)return void console.warn("THREE.Audio: Audio is already playing.");var source=this.context.createBufferSource();source.buffer=this.source.buffer,source.loop=this.source.loop,source.onended=this.source.onended,source.start(0,this.startTime),source.playbackRate.value=this.playbackRate,this.isPlaying=!0,this.source=source,this.connect()},THREE.Audio.prototype.pause=function(){this.source.stop(),this.startTime=this.context.currentTime},THREE.Audio.prototype.stop=function(){this.source.stop(),this.startTime=0},THREE.Audio.prototype.connect=function(){void 0!==this.filter?(this.source.connect(this.filter),this.filter.connect(this.panner)):this.source.connect(this.panner)},THREE.Audio.prototype.disconnect=function(){void 0!==this.filter?(this.source.disconnect(this.filter),this.filter.disconnect(this.panner)):this.source.disconnect(this.panner)},THREE.Audio.prototype.setFilter=function(value){this.isPlaying===!0?(this.disconnect(),this.filter=value,this.connect()):this.filter=value},THREE.Audio.prototype.getFilter=function(){return this.filter},THREE.Audio.prototype.setPlaybackRate=function(value){this.playbackRate=value,this.isPlaying===!0&&(this.source.playbackRate.value=this.playbackRate)},THREE.Audio.prototype.getPlaybackRate=function(){return this.playbackRate},THREE.Audio.prototype.onEnded=function(){this.isPlaying=!1},THREE.Audio.prototype.setLoop=function(value){this.source.loop=value},THREE.Audio.prototype.getLoop=function(){return this.source.loop},THREE.Audio.prototype.setRefDistance=function(value){this.panner.refDistance=value},THREE.Audio.prototype.getRefDistance=function(){return this.panner.refDistance},THREE.Audio.prototype.setRolloffFactor=function(value){this.panner.rolloffFactor=value},THREE.Audio.prototype.getRolloffFactor=function(){return this.panner.rolloffFactor},THREE.Audio.prototype.setVolume=function(value){this.gain.gain.value=value},THREE.Audio.prototype.getVolume=function(){return this.gain.gain.value},THREE.Audio.prototype.updateMatrixWorld=function(){var position=new THREE.Vector3;return function(force){THREE.Object3D.prototype.updateMatrixWorld.call(this,force),position.setFromMatrixPosition(this.matrixWorld),this.panner.setPosition(position.x,position.y,position.z)}}(),THREE.AudioListener=function(){THREE.Object3D.call(this),this.type="AudioListener",this.context=new(window.AudioContext||window.webkitAudioContext)},THREE.AudioListener.prototype=Object.create(THREE.Object3D.prototype),THREE.AudioListener.prototype.constructor=THREE.AudioListener,THREE.AudioListener.prototype.updateMatrixWorld=function(){var position=new THREE.Vector3,quaternion=new THREE.Quaternion,scale=new THREE.Vector3,orientation=new THREE.Vector3;return function(force){THREE.Object3D.prototype.updateMatrixWorld.call(this,force);var listener=this.context.listener,up=this.up;this.matrixWorld.decompose(position,quaternion,scale),orientation.set(0,0,-1).applyQuaternion(quaternion),listener.setPosition(position.x,position.y,position.z),listener.setOrientation(orientation.x,orientation.y,orientation.z,up.x,up.y,up.z)}}(),THREE.Curve=function(){},THREE.Curve.prototype={constructor:THREE.Curve,getPoint:function(t){return console.warn("THREE.Curve: Warning, getPoint() not implemented!"),null},getPointAt:function(u){var t=this.getUtoTmapping(u);return this.getPoint(t)},getPoints:function(divisions){divisions||(divisions=5);var d,pts=[];for(d=0;divisions>=d;d++)pts.push(this.getPoint(d/divisions));return pts},getSpacedPoints:function(divisions){divisions||(divisions=5);var d,pts=[];for(d=0;divisions>=d;d++)pts.push(this.getPointAt(d/divisions));return pts},getLength:function(){var lengths=this.getLengths();return lengths[lengths.length-1]},getLengths:function(divisions){if(divisions||(divisions=this.__arcLengthDivisions?this.__arcLengthDivisions:200),this.cacheArcLengths&&this.cacheArcLengths.length===divisions+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var current,p,cache=[],last=this.getPoint(0),sum=0;for(cache.push(0),p=1;divisions>=p;p++)current=this.getPoint(p/divisions),sum+=current.distanceTo(last),cache.push(sum),last=current;return this.cacheArcLengths=cache,cache},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(u,distance){var targetArcLength,arcLengths=this.getLengths(),i=0,il=arcLengths.length;targetArcLength=distance?distance:u*arcLengths[il-1];for(var comparison,low=0,high=il-1;high>=low;)if(i=Math.floor(low+(high-low)/2),comparison=arcLengths[i]-targetArcLength,0>comparison)low=i+1;else{if(!(comparison>0)){high=i;break}high=i-1}if(i=high,arcLengths[i]===targetArcLength){var t=i/(il-1);return t}var lengthBefore=arcLengths[i],lengthAfter=arcLengths[i+1],segmentLength=lengthAfter-lengthBefore,segmentFraction=(targetArcLength-lengthBefore)/segmentLength,t=(i+segmentFraction)/(il-1);return t},getTangent:function(t){var delta=1e-4,t1=t-delta,t2=t+delta;0>t1&&(t1=0),t2>1&&(t2=1);var pt1=this.getPoint(t1),pt2=this.getPoint(t2),vec=pt2.clone().sub(pt1);return vec.normalize()},getTangentAt:function(u){var t=this.getUtoTmapping(u);return this.getTangent(t)}},THREE.Curve.Utils=THREE.CurveUtils,THREE.Curve.create=function(constructor,getPointFunc){return constructor.prototype=Object.create(THREE.Curve.prototype),constructor.prototype.constructor=constructor,constructor.prototype.getPoint=getPointFunc,constructor},THREE.CurvePath=function(){this.curves=[],this.autoClose=!1},THREE.CurvePath.prototype=Object.create(THREE.Curve.prototype),THREE.CurvePath.prototype.constructor=THREE.CurvePath,THREE.CurvePath.prototype.add=function(curve){this.curves.push(curve)},THREE.CurvePath.prototype.closePath=function(){var startPoint=this.curves[0].getPoint(0),endPoint=this.curves[this.curves.length-1].getPoint(1);startPoint.equals(endPoint)||this.curves.push(new THREE.LineCurve(endPoint,startPoint))},THREE.CurvePath.prototype.getPoint=function(t){for(var d=t*this.getLength(),curveLengths=this.getCurveLengths(),i=0;i=d){var diff=curveLengths[i]-d,curve=this.curves[i],u=1-diff/curve.getLength();return curve.getPointAt(u)}i++}return null},THREE.CurvePath.prototype.getLength=function(){var lens=this.getCurveLengths();return lens[lens.length-1]},THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var lengths=[],sums=0,i=0,l=this.curves.length;l>i;i++)sums+=this.curves[i].getLength(),lengths.push(sums);return this.cacheLengths=lengths,lengths},THREE.CurvePath.prototype.createPointsGeometry=function(divisions){var pts=this.getPoints(divisions,!0);return this.createGeometry(pts)},THREE.CurvePath.prototype.createSpacedPointsGeometry=function(divisions){var pts=this.getSpacedPoints(divisions,!0);return this.createGeometry(pts)},THREE.CurvePath.prototype.createGeometry=function(points){for(var geometry=new THREE.Geometry,i=0,l=points.length;l>i;i++){var point=points[i];geometry.vertices.push(new THREE.Vector3(point.x,point.y,point.z||0))}return geometry},THREE.Path=function(points){THREE.CurvePath.call(this),this.actions=[],points&&this.fromPoints(points)},THREE.Path.prototype=Object.create(THREE.CurvePath.prototype),THREE.Path.prototype.constructor=THREE.Path,THREE.Path.prototype.fromPoints=function(vectors){this.moveTo(vectors[0].x,vectors[0].y);for(var i=1,l=vectors.length;l>i;i++)this.lineTo(vectors[i].x,vectors[i].y)},THREE.Path.prototype.moveTo=function(x,y){this.actions.push({action:"moveTo",args:[x,y]})},THREE.Path.prototype.lineTo=function(x,y){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1],curve=new THREE.LineCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(x,y));this.curves.push(curve),this.actions.push({action:"lineTo",args:[x,y]})},THREE.Path.prototype.quadraticCurveTo=function(aCPx,aCPy,aX,aY){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1],curve=new THREE.QuadraticBezierCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(aCPx,aCPy),new THREE.Vector2(aX,aY));this.curves.push(curve),this.actions.push({action:"quadraticCurveTo",args:[aCPx,aCPy,aX,aY]})},THREE.Path.prototype.bezierCurveTo=function(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1],curve=new THREE.CubicBezierCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(aCP1x,aCP1y),new THREE.Vector2(aCP2x,aCP2y),new THREE.Vector2(aX,aY));this.curves.push(curve),this.actions.push({action:"bezierCurveTo",args:[aCP1x,aCP1y,aCP2x,aCP2y,aX,aY]})},THREE.Path.prototype.splineThru=function(pts){var args=Array.prototype.slice.call(arguments),lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1],npts=[new THREE.Vector2(x0,y0)];Array.prototype.push.apply(npts,pts);var curve=new THREE.SplineCurve(npts);this.curves.push(curve),this.actions.push({action:"splineThru",args:args})},THREE.Path.prototype.arc=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1];this.absarc(aX+x0,aY+y0,aRadius,aStartAngle,aEndAngle,aClockwise)},THREE.Path.prototype.absarc=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){this.absellipse(aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise)},THREE.Path.prototype.ellipse=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){var lastargs=this.actions[this.actions.length-1].args,x0=lastargs[lastargs.length-2],y0=lastargs[lastargs.length-1];this.absellipse(aX+x0,aY+y0,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation)},THREE.Path.prototype.absellipse=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){var args=[aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation||0],curve=new THREE.EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation);this.curves.push(curve);var lastPoint=curve.getPoint(1);args.push(lastPoint.x),args.push(lastPoint.y),this.actions.push({action:"ellipse",args:args})},THREE.Path.prototype.getSpacedPoints=function(divisions,closedPath){divisions||(divisions=40);for(var points=[],i=0;divisions>i;i++)points.push(this.getPoint(i/divisions));return points},THREE.Path.prototype.getPoints=function(divisions,closedPath){divisions=divisions||12;for(var cpx,cpy,cpx2,cpy2,cpx1,cpy1,cpx0,cpy0,laste,tx,ty,b2=THREE.ShapeUtils.b2,b3=THREE.ShapeUtils.b3,points=[],i=0,l=this.actions.length;l>i;i++){var item=this.actions[i],action=item.action,args=item.args;switch(action){case"moveTo":points.push(new THREE.Vector2(args[0],args[1]));break;case"lineTo":points.push(new THREE.Vector2(args[0],args[1])); +break;case"quadraticCurveTo":cpx=args[2],cpy=args[3],cpx1=args[0],cpy1=args[1],points.length>0?(laste=points[points.length-1],cpx0=laste.x,cpy0=laste.y):(laste=this.actions[i-1].args,cpx0=laste[laste.length-2],cpy0=laste[laste.length-1]);for(var j=1;divisions>=j;j++){var t=j/divisions;tx=b2(t,cpx0,cpx1,cpx),ty=b2(t,cpy0,cpy1,cpy),points.push(new THREE.Vector2(tx,ty))}break;case"bezierCurveTo":cpx=args[4],cpy=args[5],cpx1=args[0],cpy1=args[1],cpx2=args[2],cpy2=args[3],points.length>0?(laste=points[points.length-1],cpx0=laste.x,cpy0=laste.y):(laste=this.actions[i-1].args,cpx0=laste[laste.length-2],cpy0=laste[laste.length-1]);for(var j=1;divisions>=j;j++){var t=j/divisions;tx=b3(t,cpx0,cpx1,cpx2,cpx),ty=b3(t,cpy0,cpy1,cpy2,cpy),points.push(new THREE.Vector2(tx,ty))}break;case"splineThru":laste=this.actions[i-1].args;var last=new THREE.Vector2(laste[laste.length-2],laste[laste.length-1]),spts=[last],n=divisions*args[0].length;spts=spts.concat(args[0]);for(var spline=new THREE.SplineCurve(spts),j=1;n>=j;j++)points.push(spline.getPointAt(j/n));break;case"arc":for(var angle,aX=args[0],aY=args[1],aRadius=args[2],aStartAngle=args[3],aEndAngle=args[4],aClockwise=!!args[5],deltaAngle=aEndAngle-aStartAngle,tdivisions=2*divisions,j=1;tdivisions>=j;j++){var t=j/tdivisions;aClockwise||(t=1-t),angle=aStartAngle+t*deltaAngle,tx=aX+aRadius*Math.cos(angle),ty=aY+aRadius*Math.sin(angle),points.push(new THREE.Vector2(tx,ty))}break;case"ellipse":var angle,cos,sin,aX=args[0],aY=args[1],xRadius=args[2],yRadius=args[3],aStartAngle=args[4],aEndAngle=args[5],aClockwise=!!args[6],aRotation=args[7],deltaAngle=aEndAngle-aStartAngle,tdivisions=2*divisions;0!==aRotation&&(cos=Math.cos(aRotation),sin=Math.sin(aRotation));for(var j=1;tdivisions>=j;j++){var t=j/tdivisions;if(aClockwise||(t=1-t),angle=aStartAngle+t*deltaAngle,tx=aX+xRadius*Math.cos(angle),ty=aY+yRadius*Math.sin(angle),0!==aRotation){var x=tx,y=ty;tx=(x-aX)*cos-(y-aY)*sin+aX,ty=(x-aX)*sin+(y-aY)*cos+aY}points.push(new THREE.Vector2(tx,ty))}}}var lastPoint=points[points.length-1];return Math.abs(lastPoint.x-points[0].x)i;i++){var item=inActions[i],args=item.args,action=item.action;"moveTo"===action&&0!==lastPath.actions.length&&(subPaths.push(lastPath),lastPath=new THREE.Path),lastPath[action].apply(lastPath,args)}return 0!==lastPath.actions.length&&subPaths.push(lastPath),subPaths}function toShapesNoHoles(inSubpaths){for(var shapes=[],i=0,l=inSubpaths.length;l>i;i++){var tmpPath=inSubpaths[i],tmpShape=new THREE.Shape;tmpShape.actions=tmpPath.actions,tmpShape.curves=tmpPath.curves,shapes.push(tmpShape)}return shapes}function isPointInsidePolygon(inPt,inPolygon){for(var polyLen=inPolygon.length,inside=!1,p=polyLen-1,q=0;polyLen>q;p=q++){var edgeLowPt=inPolygon[p],edgeHighPt=inPolygon[q],edgeDx=edgeHighPt.x-edgeLowPt.x,edgeDy=edgeHighPt.y-edgeLowPt.y;if(Math.abs(edgeDy)>Number.EPSILON){if(0>edgeDy&&(edgeLowPt=inPolygon[q],edgeDx=-edgeDx,edgeHighPt=inPolygon[p],edgeDy=-edgeDy),inPt.yedgeHighPt.y)continue;if(inPt.y===edgeLowPt.y){if(inPt.x===edgeLowPt.x)return!0}else{var perpEdge=edgeDy*(inPt.x-edgeLowPt.x)-edgeDx*(inPt.y-edgeLowPt.y);if(0===perpEdge)return!0;if(0>perpEdge)continue;inside=!inside}}else{if(inPt.y!==edgeLowPt.y)continue;if(edgeHighPt.x<=inPt.x&&inPt.x<=edgeLowPt.x||edgeLowPt.x<=inPt.x&&inPt.x<=edgeHighPt.x)return!0}}return inside}var isClockWise=THREE.ShapeUtils.isClockWise,subPaths=extractSubpaths(this.actions);if(0===subPaths.length)return[];if(noHoles===!0)return toShapesNoHoles(subPaths);var solid,tmpPath,tmpShape,shapes=[];if(1===subPaths.length)return tmpPath=subPaths[0],tmpShape=new THREE.Shape,tmpShape.actions=tmpPath.actions,tmpShape.curves=tmpPath.curves,shapes.push(tmpShape),shapes;var holesFirst=!isClockWise(subPaths[0].getPoints());holesFirst=isCCW?!holesFirst:holesFirst;var tmpPoints,betterShapeHoles=[],newShapes=[],newShapeHoles=[],mainIdx=0;newShapes[mainIdx]=void 0,newShapeHoles[mainIdx]=[];for(var i=0,l=subPaths.length;l>i;i++)tmpPath=subPaths[i],tmpPoints=tmpPath.getPoints(),solid=isClockWise(tmpPoints),solid=isCCW?!solid:solid,solid?(!holesFirst&&newShapes[mainIdx]&&mainIdx++,newShapes[mainIdx]={s:new THREE.Shape,p:tmpPoints},newShapes[mainIdx].s.actions=tmpPath.actions,newShapes[mainIdx].s.curves=tmpPath.curves,holesFirst&&mainIdx++,newShapeHoles[mainIdx]=[]):newShapeHoles[mainIdx].push({h:tmpPath,p:tmpPoints[0]});if(!newShapes[0])return toShapesNoHoles(subPaths);if(newShapes.length>1){for(var ambiguous=!1,toChange=[],sIdx=0,sLen=newShapes.length;sLen>sIdx;sIdx++)betterShapeHoles[sIdx]=[];for(var sIdx=0,sLen=newShapes.length;sLen>sIdx;sIdx++)for(var sho=newShapeHoles[sIdx],hIdx=0;hIdx0&&(ambiguous||(newShapeHoles=betterShapeHoles))}for(var tmpHoles,i=0,il=newShapes.length;il>i;i++){tmpShape=newShapes[i].s,shapes.push(tmpShape),tmpHoles=newShapeHoles[i];for(var j=0,jl=tmpHoles.length;jl>j;j++)tmpShape.holes.push(tmpHoles[j].h)}return shapes},THREE.Shape=function(){THREE.Path.apply(this,arguments),this.holes=[]},THREE.Shape.prototype=Object.create(THREE.Path.prototype),THREE.Shape.prototype.constructor=THREE.Shape,THREE.Shape.prototype.extrude=function(options){return new THREE.ExtrudeGeometry(this,options)},THREE.Shape.prototype.makeGeometry=function(options){return new THREE.ShapeGeometry(this,options)},THREE.Shape.prototype.getPointsHoles=function(divisions){for(var holesPts=[],i=0,l=this.holes.length;l>i;i++)holesPts[i]=this.holes[i].getPoints(divisions);return holesPts},THREE.Shape.prototype.extractAllPoints=function(divisions){return{shape:this.getPoints(divisions),holes:this.getPointsHoles(divisions)}},THREE.Shape.prototype.extractPoints=function(divisions){return this.extractAllPoints(divisions)},THREE.Shape.Utils=THREE.ShapeUtils,THREE.LineCurve=function(v1,v2){this.v1=v1,this.v2=v2},THREE.LineCurve.prototype=Object.create(THREE.Curve.prototype),THREE.LineCurve.prototype.constructor=THREE.LineCurve,THREE.LineCurve.prototype.getPoint=function(t){var point=this.v2.clone().sub(this.v1);return point.multiplyScalar(t).add(this.v1),point},THREE.LineCurve.prototype.getPointAt=function(u){return this.getPoint(u)},THREE.LineCurve.prototype.getTangent=function(t){var tangent=this.v2.clone().sub(this.v1);return tangent.normalize()},THREE.QuadraticBezierCurve=function(v0,v1,v2){this.v0=v0,this.v1=v1,this.v2=v2},THREE.QuadraticBezierCurve.prototype=Object.create(THREE.Curve.prototype),THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve,THREE.QuadraticBezierCurve.prototype.getPoint=function(t){var b2=THREE.ShapeUtils.b2;return new THREE.Vector2(b2(t,this.v0.x,this.v1.x,this.v2.x),b2(t,this.v0.y,this.v1.y,this.v2.y))},THREE.QuadraticBezierCurve.prototype.getTangent=function(t){var tangentQuadraticBezier=THREE.CurveUtils.tangentQuadraticBezier;return new THREE.Vector2(tangentQuadraticBezier(t,this.v0.x,this.v1.x,this.v2.x),tangentQuadraticBezier(t,this.v0.y,this.v1.y,this.v2.y)).normalize()},THREE.CubicBezierCurve=function(v0,v1,v2,v3){this.v0=v0,this.v1=v1,this.v2=v2,this.v3=v3},THREE.CubicBezierCurve.prototype=Object.create(THREE.Curve.prototype),THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve,THREE.CubicBezierCurve.prototype.getPoint=function(t){var b3=THREE.ShapeUtils.b3;return new THREE.Vector2(b3(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b3(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y))},THREE.CubicBezierCurve.prototype.getTangent=function(t){var tangentCubicBezier=THREE.CurveUtils.tangentCubicBezier;return new THREE.Vector2(tangentCubicBezier(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),tangentCubicBezier(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y)).normalize()},THREE.SplineCurve=function(points){this.points=void 0==points?[]:points},THREE.SplineCurve.prototype=Object.create(THREE.Curve.prototype),THREE.SplineCurve.prototype.constructor=THREE.SplineCurve,THREE.SplineCurve.prototype.getPoint=function(t){var points=this.points,point=(points.length-1)*t,intPoint=Math.floor(point),weight=point-intPoint,point0=points[0===intPoint?intPoint:intPoint-1],point1=points[intPoint],point2=points[intPoint>points.length-2?points.length-1:intPoint+1],point3=points[intPoint>points.length-3?points.length-1:intPoint+2],interpolate=THREE.CurveUtils.interpolate;return new THREE.Vector2(interpolate(point0.x,point1.x,point2.x,point3.x,weight),interpolate(point0.y,point1.y,point2.y,point3.y,weight))},THREE.EllipseCurve=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){this.aX=aX,this.aY=aY,this.xRadius=xRadius,this.yRadius=yRadius,this.aStartAngle=aStartAngle,this.aEndAngle=aEndAngle,this.aClockwise=aClockwise,this.aRotation=aRotation||0},THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype),THREE.EllipseCurve.prototype.constructor=THREE.EllipseCurve,THREE.EllipseCurve.prototype.getPoint=function(t){var deltaAngle=this.aEndAngle-this.aStartAngle;0>deltaAngle&&(deltaAngle+=2*Math.PI),deltaAngle>2*Math.PI&&(deltaAngle-=2*Math.PI);var angle;angle=this.aClockwise===!0?this.aEndAngle+(1-t)*(2*Math.PI-deltaAngle):this.aStartAngle+t*deltaAngle;var x=this.aX+this.xRadius*Math.cos(angle),y=this.aY+this.yRadius*Math.sin(angle);if(0!==this.aRotation){var cos=Math.cos(this.aRotation),sin=Math.sin(this.aRotation),tx=x,ty=y;x=(tx-this.aX)*cos-(ty-this.aY)*sin+this.aX,y=(tx-this.aX)*sin+(ty-this.aY)*cos+this.aY}return new THREE.Vector2(x,y)},THREE.ArcCurve=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){THREE.EllipseCurve.call(this,aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise)},THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype),THREE.ArcCurve.prototype.constructor=THREE.ArcCurve,THREE.LineCurve3=THREE.Curve.create(function(v1,v2){this.v1=v1,this.v2=v2},function(t){var vector=new THREE.Vector3;return vector.subVectors(this.v2,this.v1),vector.multiplyScalar(t),vector.add(this.v1),vector}),THREE.QuadraticBezierCurve3=THREE.Curve.create(function(v0,v1,v2){this.v0=v0,this.v1=v1,this.v2=v2},function(t){var b2=THREE.ShapeUtils.b2;return new THREE.Vector3(b2(t,this.v0.x,this.v1.x,this.v2.x),b2(t,this.v0.y,this.v1.y,this.v2.y),b2(t,this.v0.z,this.v1.z,this.v2.z))}),THREE.CubicBezierCurve3=THREE.Curve.create(function(v0,v1,v2,v3){this.v0=v0,this.v1=v1,this.v2=v2,this.v3=v3},function(t){var b3=THREE.ShapeUtils.b3;return new THREE.Vector3(b3(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b3(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y),b3(t,this.v0.z,this.v1.z,this.v2.z,this.v3.z))}),THREE.SplineCurve3=THREE.Curve.create(function(points){console.warn("THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3"),this.points=void 0==points?[]:points},function(t){var points=this.points,point=(points.length-1)*t,intPoint=Math.floor(point),weight=point-intPoint,point0=points[0==intPoint?intPoint:intPoint-1],point1=points[intPoint],point2=points[intPoint>points.length-2?points.length-1:intPoint+1],point3=points[intPoint>points.length-3?points.length-1:intPoint+2],interpolate=THREE.CurveUtils.interpolate;return new THREE.Vector3(interpolate(point0.x,point1.x,point2.x,point3.x,weight),interpolate(point0.y,point1.y,point2.y,point3.y,weight),interpolate(point0.z,point1.z,point2.z,point3.z,weight))}),THREE.CatmullRomCurve3=function(){function CubicPoly(){}var tmp=new THREE.Vector3,px=new CubicPoly,py=new CubicPoly,pz=new CubicPoly;return CubicPoly.prototype.init=function(x0,x1,t0,t1){this.c0=x0,this.c1=t0,this.c2=-3*x0+3*x1-2*t0-t1,this.c3=2*x0-2*x1+t0+t1},CubicPoly.prototype.initNonuniformCatmullRom=function(x0,x1,x2,x3,dt0,dt1,dt2){var t1=(x1-x0)/dt0-(x2-x0)/(dt0+dt1)+(x2-x1)/dt1,t2=(x2-x1)/dt1-(x3-x1)/(dt1+dt2)+(x3-x2)/dt2;t1*=dt1,t2*=dt1,this.init(x1,x2,t1,t2)},CubicPoly.prototype.initCatmullRom=function(x0,x1,x2,x3,tension){this.init(x1,x2,tension*(x2-x0),tension*(x3-x1))},CubicPoly.prototype.calc=function(t){var t2=t*t,t3=t2*t;return this.c0+this.c1*t+this.c2*t2+this.c3*t3},THREE.Curve.create(function(p){this.points=p||[]},function(t){var point,intPoint,weight,l,points=this.points;l=points.length,2>l&&console.log("duh, you need at least 2 points"),point=(l-1)*t,intPoint=Math.floor(point),weight=point-intPoint,0===weight&&intPoint===l-1&&(intPoint=l-2,weight=1);var p0,p1,p2,p3;if(0===intPoint?(tmp.subVectors(points[0],points[1]).add(points[0]),p0=tmp):p0=points[intPoint-1],p1=points[intPoint],p2=points[intPoint+1],l>intPoint+2?p3=points[intPoint+2]:(tmp.subVectors(points[l-1],points[l-2]).add(points[l-2]),p3=tmp),void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var pow="chordal"===this.type?.5:.25,dt0=Math.pow(p0.distanceToSquared(p1),pow),dt1=Math.pow(p1.distanceToSquared(p2),pow),dt2=Math.pow(p2.distanceToSquared(p3),pow);1e-4>dt1&&(dt1=1),1e-4>dt0&&(dt0=dt1),1e-4>dt2&&(dt2=dt1),px.initNonuniformCatmullRom(p0.x,p1.x,p2.x,p3.x,dt0,dt1,dt2),py.initNonuniformCatmullRom(p0.y,p1.y,p2.y,p3.y,dt0,dt1,dt2),pz.initNonuniformCatmullRom(p0.z,p1.z,p2.z,p3.z,dt0,dt1,dt2)}else if("catmullrom"===this.type){var tension=void 0!==this.tension?this.tension:.5;px.initCatmullRom(p0.x,p1.x,p2.x,p3.x,tension),py.initCatmullRom(p0.y,p1.y,p2.y,p3.y,tension),pz.initCatmullRom(p0.z,p1.z,p2.z,p3.z,tension)}var v=new THREE.Vector3(px.calc(weight),py.calc(weight),pz.calc(weight));return v})}(),THREE.ClosedSplineCurve3=THREE.Curve.create(function(points){this.points=void 0==points?[]:points},function(t){var points=this.points,point=(points.length-0)*t,intPoint=Math.floor(point),weight=point-intPoint;intPoint+=intPoint>0?0:(Math.floor(Math.abs(intPoint)/points.length)+1)*points.length;var point0=points[(intPoint-1)%points.length],point1=points[intPoint%points.length],point2=points[(intPoint+1)%points.length],point3=points[(intPoint+2)%points.length],interpolate=THREE.CurveUtils.interpolate;return new THREE.Vector3(interpolate(point0.x,point1.x,point2.x,point3.x,weight),interpolate(point0.y,point1.y,point2.y,point3.y,weight),interpolate(point0.z,point1.z,point2.z,point3.z,weight))}),THREE.BoxGeometry=function(width,height,depth,widthSegments,heightSegments,depthSegments){function buildPlane(u,v,udir,vdir,width,height,depth,materialIndex){var w,ix,iy,gridX=scope.widthSegments,gridY=scope.heightSegments,width_half=width/2,height_half=height/2,offset=scope.vertices.length;"x"===u&&"y"===v||"y"===u&&"x"===v?w="z":"x"===u&&"z"===v||"z"===u&&"x"===v?(w="y",gridY=scope.depthSegments):("z"===u&&"y"===v||"y"===u&&"z"===v)&&(w="x",gridX=scope.depthSegments);var gridX1=gridX+1,gridY1=gridY+1,segment_width=width/gridX,segment_height=height/gridY,normal=new THREE.Vector3;for(normal[w]=depth>0?1:-1,iy=0;gridY1>iy;iy++)for(ix=0;gridX1>ix;ix++){var vector=new THREE.Vector3;vector[u]=(ix*segment_width-width_half)*udir,vector[v]=(iy*segment_height-height_half)*vdir,vector[w]=depth,scope.vertices.push(vector)}for(iy=0;gridY>iy;iy++)for(ix=0;gridX>ix;ix++){var a=ix+gridX1*iy,b=ix+gridX1*(iy+1),c=ix+1+gridX1*(iy+1),d=ix+1+gridX1*iy,uva=new THREE.Vector2(ix/gridX,1-iy/gridY),uvb=new THREE.Vector2(ix/gridX,1-(iy+1)/gridY),uvc=new THREE.Vector2((ix+1)/gridX,1-(iy+1)/gridY),uvd=new THREE.Vector2((ix+1)/gridX,1-iy/gridY),face=new THREE.Face3(a+offset,b+offset,d+offset);face.normal.copy(normal),face.vertexNormals.push(normal.clone(),normal.clone(),normal.clone()),face.materialIndex=materialIndex,scope.faces.push(face),scope.faceVertexUvs[0].push([uva,uvb,uvd]),face=new THREE.Face3(b+offset,c+offset,d+offset),face.normal.copy(normal),face.vertexNormals.push(normal.clone(),normal.clone(),normal.clone()),face.materialIndex=materialIndex,scope.faces.push(face),scope.faceVertexUvs[0].push([uvb.clone(),uvc,uvd.clone()])}}THREE.Geometry.call(this),this.type="BoxGeometry",this.parameters={width:width,height:height,depth:depth,widthSegments:widthSegments,heightSegments:heightSegments,depthSegments:depthSegments},this.widthSegments=widthSegments||1,this.heightSegments=heightSegments||1,this.depthSegments=depthSegments||1;var scope=this,width_half=width/2,height_half=height/2,depth_half=depth/2;buildPlane("z","y",-1,-1,depth,height,width_half,0),buildPlane("z","y",1,-1,depth,height,-width_half,1),buildPlane("x","z",1,1,width,depth,height_half,2),buildPlane("x","z",1,-1,width,depth,-height_half,3),buildPlane("x","y",1,-1,width,height,depth_half,4),buildPlane("x","y",-1,-1,width,height,-depth_half,5),this.mergeVertices()},THREE.BoxGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.BoxGeometry.prototype.constructor=THREE.BoxGeometry,THREE.BoxGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.BoxGeometry(parameters.width,parameters.height,parameters.depth,parameters.widthSegments,parameters.heightSegments,parameters.depthSegments)},THREE.CubeGeometry=THREE.BoxGeometry,THREE.CircleGeometry=function(radius,segments,thetaStart,thetaLength){THREE.Geometry.call(this),this.type="CircleGeometry",this.parameters={radius:radius,segments:segments,thetaStart:thetaStart,thetaLength:thetaLength},this.fromBufferGeometry(new THREE.CircleBufferGeometry(radius,segments,thetaStart,thetaLength))},THREE.CircleGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.CircleGeometry.prototype.constructor=THREE.CircleGeometry,THREE.CircleGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.CircleGeometry(parameters.radius,parameters.segments,parameters.thetaStart,parameters.thetaLength)},THREE.CircleBufferGeometry=function(radius,segments,thetaStart,thetaLength){THREE.BufferGeometry.call(this),this.type="CircleBufferGeometry",this.parameters={radius:radius,segments:segments,thetaStart:thetaStart,thetaLength:thetaLength},radius=radius||50,segments=void 0!==segments?Math.max(3,segments):8,thetaStart=void 0!==thetaStart?thetaStart:0,thetaLength=void 0!==thetaLength?thetaLength:2*Math.PI;var vertices=segments+2,positions=new Float32Array(3*vertices),normals=new Float32Array(3*vertices),uvs=new Float32Array(2*vertices);normals[2]=1,uvs[0]=.5,uvs[1]=.5;for(var s=0,i=3,ii=2;segments>=s;s++,i+=3,ii+=2){var segment=thetaStart+s/segments*thetaLength;positions[i]=radius*Math.cos(segment),positions[i+1]=radius*Math.sin(segment),normals[i+2]=1,uvs[ii]=(positions[i]/radius+1)/2,uvs[ii+1]=(positions[i+1]/radius+1)/2}for(var indices=[],i=1;segments>=i;i++)indices.push(i,i+1,0);this.setIndex(new THREE.BufferAttribute(new Uint16Array(indices),1)),this.addAttribute("position",new THREE.BufferAttribute(positions,3)),this.addAttribute("normal",new THREE.BufferAttribute(normals,3)),this.addAttribute("uv",new THREE.BufferAttribute(uvs,2)),this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)},THREE.CircleBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.CircleBufferGeometry.prototype.constructor=THREE.CircleBufferGeometry,THREE.CircleBufferGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.CircleBufferGeometry(parameters.radius,parameters.segments,parameters.thetaStart,parameters.thetaLength)},THREE.CylinderGeometry=function(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){THREE.Geometry.call(this),this.type="CylinderGeometry",this.parameters={radiusTop:radiusTop,radiusBottom:radiusBottom,height:height,radialSegments:radialSegments,heightSegments:heightSegments,openEnded:openEnded,thetaStart:thetaStart,thetaLength:thetaLength},radiusTop=void 0!==radiusTop?radiusTop:20,radiusBottom=void 0!==radiusBottom?radiusBottom:20,height=void 0!==height?height:100,radialSegments=radialSegments||8,heightSegments=heightSegments||1,openEnded=void 0!==openEnded?openEnded:!1,thetaStart=void 0!==thetaStart?thetaStart:0,thetaLength=void 0!==thetaLength?thetaLength:2*Math.PI;var x,y,heightHalf=height/2,vertices=[],uvs=[];for(y=0;heightSegments>=y;y++){var verticesRow=[],uvsRow=[],v=y/heightSegments,radius=v*(radiusBottom-radiusTop)+radiusTop;for(x=0;radialSegments>=x;x++){var u=x/radialSegments,vertex=new THREE.Vector3;vertex.x=radius*Math.sin(u*thetaLength+thetaStart),vertex.y=-v*height+heightHalf,vertex.z=radius*Math.cos(u*thetaLength+thetaStart),this.vertices.push(vertex),verticesRow.push(this.vertices.length-1),uvsRow.push(new THREE.Vector2(u,1-v))}vertices.push(verticesRow),uvs.push(uvsRow)}var na,nb,tanTheta=(radiusBottom-radiusTop)/height;for(x=0;radialSegments>x;x++)for(0!==radiusTop?(na=this.vertices[vertices[0][x]].clone(),nb=this.vertices[vertices[0][x+1]].clone()):(na=this.vertices[vertices[1][x]].clone(),nb=this.vertices[vertices[1][x+1]].clone()),na.setY(Math.sqrt(na.x*na.x+na.z*na.z)*tanTheta).normalize(),nb.setY(Math.sqrt(nb.x*nb.x+nb.z*nb.z)*tanTheta).normalize(),y=0;heightSegments>y;y++){var v1=vertices[y][x],v2=vertices[y+1][x],v3=vertices[y+1][x+1],v4=vertices[y][x+1],n1=na.clone(),n2=na.clone(),n3=nb.clone(),n4=nb.clone(),uv1=uvs[y][x].clone(),uv2=uvs[y+1][x].clone(),uv3=uvs[y+1][x+1].clone(),uv4=uvs[y][x+1].clone();this.faces.push(new THREE.Face3(v1,v2,v4,[n1,n2,n4])),this.faceVertexUvs[0].push([uv1,uv2,uv4]),this.faces.push(new THREE.Face3(v2,v3,v4,[n2.clone(),n3,n4.clone()])),this.faceVertexUvs[0].push([uv2.clone(),uv3,uv4.clone()])}if(openEnded===!1&&radiusTop>0)for(this.vertices.push(new THREE.Vector3(0,heightHalf,0)),x=0;radialSegments>x;x++){var v1=vertices[0][x],v2=vertices[0][x+1],v3=this.vertices.length-1,n1=new THREE.Vector3(0,1,0),n2=new THREE.Vector3(0,1,0),n3=new THREE.Vector3(0,1,0),uv1=uvs[0][x].clone(),uv2=uvs[0][x+1].clone(),uv3=new THREE.Vector2(uv2.x,0);this.faces.push(new THREE.Face3(v1,v2,v3,[n1,n2,n3],void 0,1)),this.faceVertexUvs[0].push([uv1,uv2,uv3])}if(openEnded===!1&&radiusBottom>0)for(this.vertices.push(new THREE.Vector3(0,-heightHalf,0)),x=0;radialSegments>x;x++){var v1=vertices[heightSegments][x+1],v2=vertices[heightSegments][x],v3=this.vertices.length-1,n1=new THREE.Vector3(0,-1,0),n2=new THREE.Vector3(0,-1,0),n3=new THREE.Vector3(0,-1,0),uv1=uvs[heightSegments][x+1].clone(),uv2=uvs[heightSegments][x].clone(),uv3=new THREE.Vector2(uv2.x,1);this.faces.push(new THREE.Face3(v1,v2,v3,[n1,n2,n3],void 0,2)),this.faceVertexUvs[0].push([uv1,uv2,uv3])}this.computeFaceNormals()},THREE.CylinderGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry,THREE.CylinderGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.CylinderGeometry(parameters.radiusTop,parameters.radiusBottom,parameters.height,parameters.radialSegments,parameters.heightSegments,parameters.openEnded,parameters.thetaStart,parameters.thetaLength)},THREE.EdgesGeometry=function(geometry,thresholdAngle){function sortFunction(a,b){return a-b}THREE.BufferGeometry.call(this),thresholdAngle=void 0!==thresholdAngle?thresholdAngle:1;var geometry2,thresholdDot=Math.cos(THREE.Math.degToRad(thresholdAngle)),edge=[0,0],hash={},keys=["a","b","c"];geometry instanceof THREE.BufferGeometry?(geometry2=new THREE.Geometry,geometry2.fromBufferGeometry(geometry)):geometry2=geometry.clone(),geometry2.mergeVertices(),geometry2.computeFaceNormals();for(var vertices=geometry2.vertices,faces=geometry2.faces,i=0,l=faces.length;l>i;i++)for(var face=faces[i],j=0;3>j;j++){edge[0]=face[keys[j]],edge[1]=face[keys[(j+1)%3]],edge.sort(sortFunction);var key=edge.toString();void 0===hash[key]?hash[key]={vert1:edge[0],vert2:edge[1],face1:i,face2:void 0}:hash[key].face2=i}var coords=[];for(var key in hash){var h=hash[key];if(void 0===h.face2||faces[h.face1].normal.dot(faces[h.face2].normal)<=thresholdDot){var vertex=vertices[h.vert1];coords.push(vertex.x),coords.push(vertex.y),coords.push(vertex.z),vertex=vertices[h.vert2],coords.push(vertex.x),coords.push(vertex.y),coords.push(vertex.z)}}this.addAttribute("position",new THREE.BufferAttribute(new Float32Array(coords),3))},THREE.EdgesGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.EdgesGeometry.prototype.constructor=THREE.EdgesGeometry,THREE.ExtrudeGeometry=function(shapes,options){return"undefined"==typeof shapes?void(shapes=[]):(THREE.Geometry.call(this),this.type="ExtrudeGeometry",shapes=Array.isArray(shapes)?shapes:[shapes],this.addShapeList(shapes,options),void this.computeFaceNormals())},THREE.ExtrudeGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry,THREE.ExtrudeGeometry.prototype.addShapeList=function(shapes,options){for(var sl=shapes.length,s=0;sl>s;s++){var shape=shapes[s];this.addShape(shape,options)}},THREE.ExtrudeGeometry.prototype.addShape=function(shape,options){function scalePt2(pt,vec,size){return vec||console.error("THREE.ExtrudeGeometry: vec does not exist"),vec.clone().multiplyScalar(size).add(pt)}function getBevelVec(inPt,inPrev,inNext){var v_trans_x,v_trans_y,shrink_by=1,v_prev_x=inPt.x-inPrev.x,v_prev_y=inPt.y-inPrev.y,v_next_x=inNext.x-inPt.x,v_next_y=inNext.y-inPt.y,v_prev_lensq=v_prev_x*v_prev_x+v_prev_y*v_prev_y,collinear0=v_prev_x*v_next_y-v_prev_y*v_next_x;if(Math.abs(collinear0)>Number.EPSILON){var v_prev_len=Math.sqrt(v_prev_lensq),v_next_len=Math.sqrt(v_next_x*v_next_x+v_next_y*v_next_y),ptPrevShift_x=inPrev.x-v_prev_y/v_prev_len,ptPrevShift_y=inPrev.y+v_prev_x/v_prev_len,ptNextShift_x=inNext.x-v_next_y/v_next_len,ptNextShift_y=inNext.y+v_next_x/v_next_len,sf=((ptNextShift_x-ptPrevShift_x)*v_next_y-(ptNextShift_y-ptPrevShift_y)*v_next_x)/(v_prev_x*v_next_y-v_prev_y*v_next_x);v_trans_x=ptPrevShift_x+v_prev_x*sf-inPt.x,v_trans_y=ptPrevShift_y+v_prev_y*sf-inPt.y;var v_trans_lensq=v_trans_x*v_trans_x+v_trans_y*v_trans_y;if(2>=v_trans_lensq)return new THREE.Vector2(v_trans_x,v_trans_y);shrink_by=Math.sqrt(v_trans_lensq/2)}else{var direction_eq=!1;v_prev_x>Number.EPSILON?v_next_x>Number.EPSILON&&(direction_eq=!0):v_prev_x<-Number.EPSILON?v_next_x<-Number.EPSILON&&(direction_eq=!0):Math.sign(v_prev_y)===Math.sign(v_next_y)&&(direction_eq=!0),direction_eq?(v_trans_x=-v_prev_y,v_trans_y=v_prev_x,shrink_by=Math.sqrt(v_prev_lensq)):(v_trans_x=v_prev_x,v_trans_y=v_prev_y,shrink_by=Math.sqrt(v_prev_lensq/2))}return new THREE.Vector2(v_trans_x/shrink_by,v_trans_y/shrink_by)}function buildLidFaces(){if(bevelEnabled){var layer=0,offset=vlen*layer;for(i=0;flen>i;i++)face=faces[i],f3(face[2]+offset,face[1]+offset,face[0]+offset);for(layer=steps+2*bevelSegments,offset=vlen*layer,i=0;flen>i;i++)face=faces[i],f3(face[0]+offset,face[1]+offset,face[2]+offset)}else{for(i=0;flen>i;i++)face=faces[i],f3(face[2],face[1],face[0]);for(i=0;flen>i;i++)face=faces[i],f3(face[0]+vlen*steps,face[1]+vlen*steps,face[2]+vlen*steps)}}function buildSideFaces(){var layeroffset=0;for(sidewalls(contour,layeroffset),layeroffset+=contour.length,h=0,hl=holes.length;hl>h;h++)ahole=holes[h],sidewalls(ahole,layeroffset),layeroffset+=ahole.length}function sidewalls(contour,layeroffset){var j,k;for(i=contour.length;--i>=0;){j=i,k=i-1,0>k&&(k=contour.length-1);var s=0,sl=steps+2*bevelSegments;for(s=0;sl>s;s++){var slen1=vlen*s,slen2=vlen*(s+1),a=layeroffset+j+slen1,b=layeroffset+k+slen1,c=layeroffset+k+slen2,d=layeroffset+j+slen2;f4(a,b,c,d,contour,s,sl,j,k)}}}function v(x,y,z){scope.vertices.push(new THREE.Vector3(x,y,z))}function f3(a,b,c){a+=shapesOffset,b+=shapesOffset,c+=shapesOffset,scope.faces.push(new THREE.Face3(a,b,c,null,null,0));var uvs=uvgen.generateTopUV(scope,a,b,c);scope.faceVertexUvs[0].push(uvs)}function f4(a,b,c,d,wallContour,stepIndex,stepsLength,contourIndex1,contourIndex2){a+=shapesOffset,b+=shapesOffset,c+=shapesOffset,d+=shapesOffset,scope.faces.push(new THREE.Face3(a,b,d,null,null,1)),scope.faces.push(new THREE.Face3(b,c,d,null,null,1));var uvs=uvgen.generateSideWallUV(scope,a,b,c,d);scope.faceVertexUvs[0].push([uvs[0],uvs[1],uvs[3]]),scope.faceVertexUvs[0].push([uvs[1],uvs[2],uvs[3]])}var extrudePts,splineTube,binormal,normal,position2,amount=void 0!==options.amount?options.amount:100,bevelThickness=void 0!==options.bevelThickness?options.bevelThickness:6,bevelSize=void 0!==options.bevelSize?options.bevelSize:bevelThickness-2,bevelSegments=void 0!==options.bevelSegments?options.bevelSegments:3,bevelEnabled=void 0!==options.bevelEnabled?options.bevelEnabled:!0,curveSegments=void 0!==options.curveSegments?options.curveSegments:12,steps=void 0!==options.steps?options.steps:1,extrudePath=options.extrudePath,extrudeByPath=!1,uvgen=void 0!==options.UVGenerator?options.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator;extrudePath&&(extrudePts=extrudePath.getSpacedPoints(steps),extrudeByPath=!0,bevelEnabled=!1,splineTube=void 0!==options.frames?options.frames:new THREE.TubeGeometry.FrenetFrames(extrudePath,steps,!1),binormal=new THREE.Vector3,normal=new THREE.Vector3,position2=new THREE.Vector3),bevelEnabled||(bevelSegments=0,bevelThickness=0,bevelSize=0);var ahole,h,hl,scope=this,shapesOffset=this.vertices.length,shapePoints=shape.extractPoints(curveSegments),vertices=shapePoints.shape,holes=shapePoints.holes,reverse=!THREE.ShapeUtils.isClockWise(vertices);if(reverse){for(vertices=vertices.reverse(),h=0,hl=holes.length;hl>h;h++)ahole=holes[h],THREE.ShapeUtils.isClockWise(ahole)&&(holes[h]=ahole.reverse());reverse=!1}var faces=THREE.ShapeUtils.triangulateShape(vertices,holes),contour=vertices;for(h=0,hl=holes.length;hl>h;h++)ahole=holes[h],vertices=vertices.concat(ahole);for(var b,bs,t,z,vert,face,vlen=vertices.length,flen=faces.length,contourMovements=[],i=0,il=contour.length,j=il-1,k=i+1;il>i;i++,j++,k++)j===il&&(j=0),k===il&&(k=0),contourMovements[i]=getBevelVec(contour[i],contour[j],contour[k]);var oneHoleMovements,holesMovements=[],verticesMovements=contourMovements.concat();for(h=0,hl=holes.length;hl>h;h++){for(ahole=holes[h],oneHoleMovements=[],i=0,il=ahole.length,j=il-1,k=i+1;il>i;i++,j++,k++)j===il&&(j=0),k===il&&(k=0),oneHoleMovements[i]=getBevelVec(ahole[i],ahole[j],ahole[k]);holesMovements.push(oneHoleMovements),verticesMovements=verticesMovements.concat(oneHoleMovements)}for(b=0;bevelSegments>b;b++){for(t=b/bevelSegments,z=bevelThickness*(1-t),bs=bevelSize*Math.sin(t*Math.PI/2),i=0,il=contour.length;il>i;i++)vert=scalePt2(contour[i],contourMovements[i],bs),v(vert.x,vert.y,-z);for(h=0,hl=holes.length;hl>h;h++)for(ahole=holes[h],oneHoleMovements=holesMovements[h],i=0,il=ahole.length;il>i;i++)vert=scalePt2(ahole[i],oneHoleMovements[i],bs),v(vert.x,vert.y,-z)}for(bs=bevelSize,i=0;vlen>i;i++)vert=bevelEnabled?scalePt2(vertices[i],verticesMovements[i],bs):vertices[i],extrudeByPath?(normal.copy(splineTube.normals[0]).multiplyScalar(vert.x),binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y),position2.copy(extrudePts[0]).add(normal).add(binormal),v(position2.x,position2.y,position2.z)):v(vert.x,vert.y,0);var s;for(s=1;steps>=s;s++)for(i=0;vlen>i;i++)vert=bevelEnabled?scalePt2(vertices[i],verticesMovements[i],bs):vertices[i],extrudeByPath?(normal.copy(splineTube.normals[s]).multiplyScalar(vert.x),binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y),position2.copy(extrudePts[s]).add(normal).add(binormal),v(position2.x,position2.y,position2.z)):v(vert.x,vert.y,amount/steps*s);for(b=bevelSegments-1;b>=0;b--){for(t=b/bevelSegments,z=bevelThickness*(1-t),bs=bevelSize*Math.sin(t*Math.PI/2),i=0,il=contour.length;il>i;i++)vert=scalePt2(contour[i],contourMovements[i],bs),v(vert.x,vert.y,amount+z);for(h=0,hl=holes.length;hl>h;h++)for(ahole=holes[h],oneHoleMovements=holesMovements[h],i=0,il=ahole.length;il>i;i++)vert=scalePt2(ahole[i],oneHoleMovements[i],bs),extrudeByPath?v(vert.x,vert.y+extrudePts[steps-1].y,extrudePts[steps-1].x+z):v(vert.x,vert.y,amount+z)}buildLidFaces(),buildSideFaces()}, +THREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(geometry,indexA,indexB,indexC){var vertices=geometry.vertices,a=vertices[indexA],b=vertices[indexB],c=vertices[indexC];return[new THREE.Vector2(a.x,a.y),new THREE.Vector2(b.x,b.y),new THREE.Vector2(c.x,c.y)]},generateSideWallUV:function(geometry,indexA,indexB,indexC,indexD){var vertices=geometry.vertices,a=vertices[indexA],b=vertices[indexB],c=vertices[indexC],d=vertices[indexD];return Math.abs(a.y-b.y)<.01?[new THREE.Vector2(a.x,1-a.z),new THREE.Vector2(b.x,1-b.z),new THREE.Vector2(c.x,1-c.z),new THREE.Vector2(d.x,1-d.z)]:[new THREE.Vector2(a.y,1-a.z),new THREE.Vector2(b.y,1-b.z),new THREE.Vector2(c.y,1-c.z),new THREE.Vector2(d.y,1-d.z)]}},THREE.ShapeGeometry=function(shapes,options){THREE.Geometry.call(this),this.type="ShapeGeometry",Array.isArray(shapes)===!1&&(shapes=[shapes]),this.addShapeList(shapes,options),this.computeFaceNormals()},THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.ShapeGeometry.prototype.constructor=THREE.ShapeGeometry,THREE.ShapeGeometry.prototype.addShapeList=function(shapes,options){for(var i=0,l=shapes.length;l>i;i++)this.addShape(shapes[i],options);return this},THREE.ShapeGeometry.prototype.addShape=function(shape,options){void 0===options&&(options={});var i,l,hole,curveSegments=void 0!==options.curveSegments?options.curveSegments:12,material=options.material,uvgen=void 0===options.UVGenerator?THREE.ExtrudeGeometry.WorldUVGenerator:options.UVGenerator,shapesOffset=this.vertices.length,shapePoints=shape.extractPoints(curveSegments),vertices=shapePoints.shape,holes=shapePoints.holes,reverse=!THREE.ShapeUtils.isClockWise(vertices);if(reverse){for(vertices=vertices.reverse(),i=0,l=holes.length;l>i;i++)hole=holes[i],THREE.ShapeUtils.isClockWise(hole)&&(holes[i]=hole.reverse());reverse=!1}var faces=THREE.ShapeUtils.triangulateShape(vertices,holes);for(i=0,l=holes.length;l>i;i++)hole=holes[i],vertices=vertices.concat(hole);var vert,face,vlen=vertices.length,flen=faces.length;for(i=0;vlen>i;i++)vert=vertices[i],this.vertices.push(new THREE.Vector3(vert.x,vert.y,0));for(i=0;flen>i;i++){face=faces[i];var a=face[0]+shapesOffset,b=face[1]+shapesOffset,c=face[2]+shapesOffset;this.faces.push(new THREE.Face3(a,b,c,null,null,material)),this.faceVertexUvs[0].push(uvgen.generateTopUV(this,a,b,c))}},THREE.LatheGeometry=function(points,segments,phiStart,phiLength){THREE.Geometry.call(this),this.type="LatheGeometry",this.parameters={points:points,segments:segments,phiStart:phiStart,phiLength:phiLength},segments=segments||12,phiStart=phiStart||0,phiLength=phiLength||2*Math.PI;for(var inversePointLength=1/(points.length-1),inverseSegments=1/segments,i=0,il=segments;il>=i;i++)for(var phi=phiStart+i*inverseSegments*phiLength,c=Math.cos(phi),s=Math.sin(phi),j=0,jl=points.length;jl>j;j++){var pt=points[j],vertex=new THREE.Vector3;vertex.x=c*pt.x-s*pt.y,vertex.y=s*pt.x+c*pt.y,vertex.z=pt.z,this.vertices.push(vertex)}for(var np=points.length,i=0,il=segments;il>i;i++)for(var j=0,jl=points.length-1;jl>j;j++){var base=j+np*i,a=base,b=base+np,c=base+1+np,d=base+1,u0=i*inverseSegments,v0=j*inversePointLength,u1=u0+inverseSegments,v1=v0+inversePointLength;this.faces.push(new THREE.Face3(a,b,d)),this.faceVertexUvs[0].push([new THREE.Vector2(u0,v0),new THREE.Vector2(u1,v0),new THREE.Vector2(u0,v1)]),this.faces.push(new THREE.Face3(b,c,d)),this.faceVertexUvs[0].push([new THREE.Vector2(u1,v0),new THREE.Vector2(u1,v1),new THREE.Vector2(u0,v1)])}this.mergeVertices(),this.computeFaceNormals(),this.computeVertexNormals()},THREE.LatheGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry,THREE.PlaneGeometry=function(width,height,widthSegments,heightSegments){THREE.Geometry.call(this),this.type="PlaneGeometry",this.parameters={width:width,height:height,widthSegments:widthSegments,heightSegments:heightSegments},this.fromBufferGeometry(new THREE.PlaneBufferGeometry(width,height,widthSegments,heightSegments))},THREE.PlaneGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry,THREE.PlaneGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.PlaneGeometry(parameters.width,parameters.height,parameters.widthSegments,parameters.heightSegments)},THREE.PlaneBufferGeometry=function(width,height,widthSegments,heightSegments){THREE.BufferGeometry.call(this),this.type="PlaneBufferGeometry",this.parameters={width:width,height:height,widthSegments:widthSegments,heightSegments:heightSegments};for(var width_half=width/2,height_half=height/2,gridX=Math.floor(widthSegments)||1,gridY=Math.floor(heightSegments)||1,gridX1=gridX+1,gridY1=gridY+1,segment_width=width/gridX,segment_height=height/gridY,vertices=new Float32Array(gridX1*gridY1*3),normals=new Float32Array(gridX1*gridY1*3),uvs=new Float32Array(gridX1*gridY1*2),offset=0,offset2=0,iy=0;gridY1>iy;iy++)for(var y=iy*segment_height-height_half,ix=0;gridX1>ix;ix++){var x=ix*segment_width-width_half;vertices[offset]=x,vertices[offset+1]=-y,normals[offset+2]=1,uvs[offset2]=ix/gridX,uvs[offset2+1]=1-iy/gridY,offset+=3,offset2+=2}offset=0;for(var indices=new(vertices.length/3>65535?Uint32Array:Uint16Array)(gridX*gridY*6),iy=0;gridY>iy;iy++)for(var ix=0;gridX>ix;ix++){var a=ix+gridX1*iy,b=ix+gridX1*(iy+1),c=ix+1+gridX1*(iy+1),d=ix+1+gridX1*iy;indices[offset]=a,indices[offset+1]=b,indices[offset+2]=d,indices[offset+3]=b,indices[offset+4]=c,indices[offset+5]=d,offset+=6}this.setIndex(new THREE.BufferAttribute(indices,1)),this.addAttribute("position",new THREE.BufferAttribute(vertices,3)),this.addAttribute("normal",new THREE.BufferAttribute(normals,3)),this.addAttribute("uv",new THREE.BufferAttribute(uvs,2))},THREE.PlaneBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.PlaneBufferGeometry.prototype.constructor=THREE.PlaneBufferGeometry,THREE.PlaneBufferGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.PlaneBufferGeometry(parameters.width,parameters.height,parameters.widthSegments,parameters.heightSegments)},THREE.RingGeometry=function(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength){THREE.Geometry.call(this),this.type="RingGeometry",this.parameters={innerRadius:innerRadius,outerRadius:outerRadius,thetaSegments:thetaSegments,phiSegments:phiSegments,thetaStart:thetaStart,thetaLength:thetaLength},innerRadius=innerRadius||0,outerRadius=outerRadius||50,thetaStart=void 0!==thetaStart?thetaStart:0,thetaLength=void 0!==thetaLength?thetaLength:2*Math.PI,thetaSegments=void 0!==thetaSegments?Math.max(3,thetaSegments):8,phiSegments=void 0!==phiSegments?Math.max(1,phiSegments):8;var i,o,uvs=[],radius=innerRadius,radiusStep=(outerRadius-innerRadius)/phiSegments;for(i=0;phiSegments+1>i;i++){for(o=0;thetaSegments+1>o;o++){var vertex=new THREE.Vector3,segment=thetaStart+o/thetaSegments*thetaLength;vertex.x=radius*Math.cos(segment),vertex.y=radius*Math.sin(segment),this.vertices.push(vertex),uvs.push(new THREE.Vector2((vertex.x/outerRadius+1)/2,(vertex.y/outerRadius+1)/2))}radius+=radiusStep}var n=new THREE.Vector3(0,0,1);for(i=0;phiSegments>i;i++){var thetaSegment=i*(thetaSegments+1);for(o=0;thetaSegments>o;o++){var segment=o+thetaSegment,v1=segment,v2=segment+thetaSegments+1,v3=segment+thetaSegments+2;this.faces.push(new THREE.Face3(v1,v2,v3,[n.clone(),n.clone(),n.clone()])),this.faceVertexUvs[0].push([uvs[v1].clone(),uvs[v2].clone(),uvs[v3].clone()]),v1=segment,v2=segment+thetaSegments+2,v3=segment+1,this.faces.push(new THREE.Face3(v1,v2,v3,[n.clone(),n.clone(),n.clone()])),this.faceVertexUvs[0].push([uvs[v1].clone(),uvs[v2].clone(),uvs[v3].clone()])}}this.computeFaceNormals(),this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)},THREE.RingGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.RingGeometry.prototype.constructor=THREE.RingGeometry,THREE.RingGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.RingGeometry(parameters.innerRadius,parameters.outerRadius,parameters.thetaSegments,parameters.phiSegments,parameters.thetaStart,parameters.thetaLength)},THREE.SphereGeometry=function(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){THREE.Geometry.call(this),this.type="SphereGeometry",this.parameters={radius:radius,widthSegments:widthSegments,heightSegments:heightSegments,phiStart:phiStart,phiLength:phiLength,thetaStart:thetaStart,thetaLength:thetaLength},this.fromBufferGeometry(new THREE.SphereBufferGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength))},THREE.SphereGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry,THREE.SphereGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.SphereGeometry(parameters.radius,parameters.widthSegments,parameters.heightSegments,parameters.phiStart,parameters.phiLength,parameters.thetaStart,parameters.thetaLength)},THREE.SphereBufferGeometry=function(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){THREE.BufferGeometry.call(this),this.type="SphereBufferGeometry",this.parameters={radius:radius,widthSegments:widthSegments,heightSegments:heightSegments,phiStart:phiStart,phiLength:phiLength,thetaStart:thetaStart,thetaLength:thetaLength},radius=radius||50,widthSegments=Math.max(3,Math.floor(widthSegments)||8),heightSegments=Math.max(2,Math.floor(heightSegments)||6),phiStart=void 0!==phiStart?phiStart:0,phiLength=void 0!==phiLength?phiLength:2*Math.PI,thetaStart=void 0!==thetaStart?thetaStart:0,thetaLength=void 0!==thetaLength?thetaLength:Math.PI;for(var thetaEnd=thetaStart+thetaLength,vertexCount=(widthSegments+1)*(heightSegments+1),positions=new THREE.BufferAttribute(new Float32Array(3*vertexCount),3),normals=new THREE.BufferAttribute(new Float32Array(3*vertexCount),3),uvs=new THREE.BufferAttribute(new Float32Array(2*vertexCount),2),index=0,vertices=[],normal=new THREE.Vector3,y=0;heightSegments>=y;y++){for(var verticesRow=[],v=y/heightSegments,x=0;widthSegments>=x;x++){var u=x/widthSegments,px=-radius*Math.cos(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength),py=radius*Math.cos(thetaStart+v*thetaLength),pz=radius*Math.sin(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);normal.set(px,py,pz).normalize(),positions.setXYZ(index,px,py,pz),normals.setXYZ(index,normal.x,normal.y,normal.z),uvs.setXY(index,u,1-v),verticesRow.push(index),index++}vertices.push(verticesRow)}for(var indices=[],y=0;heightSegments>y;y++)for(var x=0;widthSegments>x;x++){var v1=vertices[y][x+1],v2=vertices[y][x],v3=vertices[y+1][x],v4=vertices[y+1][x+1];(0!==y||thetaStart>0)&&indices.push(v1,v2,v4),(y!==heightSegments-1||thetaEnd65535?THREE.Uint32Attribute:THREE.Uint16Attribute)(indices,1)),this.addAttribute("position",positions),this.addAttribute("normal",normals),this.addAttribute("uv",uvs),this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)},THREE.SphereBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.SphereBufferGeometry.prototype.constructor=THREE.SphereBufferGeometry,THREE.SphereBufferGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.SphereBufferGeometry(parameters.radius,parameters.widthSegments,parameters.heightSegments,parameters.phiStart,parameters.phiLength,parameters.thetaStart,parameters.thetaLength)},THREE.TorusGeometry=function(radius,tube,radialSegments,tubularSegments,arc){THREE.Geometry.call(this),this.type="TorusGeometry",this.parameters={radius:radius,tube:tube,radialSegments:radialSegments,tubularSegments:tubularSegments,arc:arc},radius=radius||100,tube=tube||40,radialSegments=radialSegments||8,tubularSegments=tubularSegments||6,arc=arc||2*Math.PI;for(var center=new THREE.Vector3,uvs=[],normals=[],j=0;radialSegments>=j;j++)for(var i=0;tubularSegments>=i;i++){var u=i/tubularSegments*arc,v=j/radialSegments*Math.PI*2;center.x=radius*Math.cos(u),center.y=radius*Math.sin(u);var vertex=new THREE.Vector3;vertex.x=(radius+tube*Math.cos(v))*Math.cos(u),vertex.y=(radius+tube*Math.cos(v))*Math.sin(u),vertex.z=tube*Math.sin(v),this.vertices.push(vertex),uvs.push(new THREE.Vector2(i/tubularSegments,j/radialSegments)),normals.push(vertex.clone().sub(center).normalize())}for(var j=1;radialSegments>=j;j++)for(var i=1;tubularSegments>=i;i++){var a=(tubularSegments+1)*j+i-1,b=(tubularSegments+1)*(j-1)+i-1,c=(tubularSegments+1)*(j-1)+i,d=(tubularSegments+1)*j+i,face=new THREE.Face3(a,b,d,[normals[a].clone(),normals[b].clone(),normals[d].clone()]);this.faces.push(face),this.faceVertexUvs[0].push([uvs[a].clone(),uvs[b].clone(),uvs[d].clone()]),face=new THREE.Face3(b,c,d,[normals[b].clone(),normals[c].clone(),normals[d].clone()]),this.faces.push(face),this.faceVertexUvs[0].push([uvs[b].clone(),uvs[c].clone(),uvs[d].clone()])}this.computeFaceNormals()},THREE.TorusGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry,THREE.TorusGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.TorusGeometry(parameters.radius,parameters.tube,parameters.radialSegments,parameters.tubularSegments,parameters.arc)},THREE.TorusKnotGeometry=function(radius,tube,radialSegments,tubularSegments,p,q,heightScale){function getPos(u,in_q,in_p,radius,heightScale){var cu=Math.cos(u),su=Math.sin(u),quOverP=in_q/in_p*u,cs=Math.cos(quOverP),tx=radius*(2+cs)*.5*cu,ty=radius*(2+cs)*su*.5,tz=heightScale*radius*Math.sin(quOverP)*.5;return new THREE.Vector3(tx,ty,tz)}THREE.Geometry.call(this),this.type="TorusKnotGeometry",this.parameters={radius:radius,tube:tube,radialSegments:radialSegments,tubularSegments:tubularSegments,p:p,q:q,heightScale:heightScale},radius=radius||100,tube=tube||40,radialSegments=radialSegments||64,tubularSegments=tubularSegments||8,p=p||2,q=q||3,heightScale=heightScale||1;for(var grid=new Array(radialSegments),tang=new THREE.Vector3,n=new THREE.Vector3,bitan=new THREE.Vector3,i=0;radialSegments>i;++i){grid[i]=new Array(tubularSegments);var u=i/radialSegments*2*p*Math.PI,p1=getPos(u,q,p,radius,heightScale),p2=getPos(u+.01,q,p,radius,heightScale);tang.subVectors(p2,p1),n.addVectors(p2,p1),bitan.crossVectors(tang,n),n.crossVectors(bitan,tang),bitan.normalize(),n.normalize();for(var j=0;tubularSegments>j;++j){var v=j/tubularSegments*2*Math.PI,cx=-tube*Math.cos(v),cy=tube*Math.sin(v),pos=new THREE.Vector3;pos.x=p1.x+cx*n.x+cy*bitan.x,pos.y=p1.y+cx*n.y+cy*bitan.y,pos.z=p1.z+cx*n.z+cy*bitan.z,grid[i][j]=this.vertices.push(pos)-1}}for(var i=0;radialSegments>i;++i)for(var j=0;tubularSegments>j;++j){var ip=(i+1)%radialSegments,jp=(j+1)%tubularSegments,a=grid[i][j],b=grid[ip][j],c=grid[ip][jp],d=grid[i][jp],uva=new THREE.Vector2(i/radialSegments,j/tubularSegments),uvb=new THREE.Vector2((i+1)/radialSegments,j/tubularSegments),uvc=new THREE.Vector2((i+1)/radialSegments,(j+1)/tubularSegments),uvd=new THREE.Vector2(i/radialSegments,(j+1)/tubularSegments);this.faces.push(new THREE.Face3(a,b,d)),this.faceVertexUvs[0].push([uva,uvb,uvd]),this.faces.push(new THREE.Face3(b,c,d)),this.faceVertexUvs[0].push([uvb.clone(),uvc,uvd.clone()])}this.computeFaceNormals(),this.computeVertexNormals()},THREE.TorusKnotGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry,THREE.TorusKnotGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.TorusKnotGeometry(parameters.radius,parameters.tube,parameters.radialSegments,parameters.tubularSegments,parameters.p,parameters.q,parameters.heightScale)},THREE.TubeGeometry=function(path,segments,radius,radialSegments,closed,taper){function vert(x,y,z){return scope.vertices.push(new THREE.Vector3(x,y,z))-1}THREE.Geometry.call(this),this.type="TubeGeometry",this.parameters={path:path,segments:segments,radius:radius,radialSegments:radialSegments,closed:closed,taper:taper},segments=segments||64,radius=radius||1,radialSegments=radialSegments||8,closed=closed||!1,taper=taper||THREE.TubeGeometry.NoTaper;var tangent,normal,binormal,u,v,r,cx,cy,pos,i,j,ip,jp,a,b,c,d,uva,uvb,uvc,uvd,grid=[],scope=this,numpoints=segments+1,pos2=new THREE.Vector3,frames=new THREE.TubeGeometry.FrenetFrames(path,segments,closed),tangents=frames.tangents,normals=frames.normals,binormals=frames.binormals;for(this.tangents=tangents,this.normals=normals,this.binormals=binormals,i=0;numpoints>i;i++)for(grid[i]=[],u=i/(numpoints-1),pos=path.getPointAt(u),tangent=tangents[i],normal=normals[i],binormal=binormals[i],r=radius*taper(u),j=0;radialSegments>j;j++)v=j/radialSegments*2*Math.PI,cx=-r*Math.cos(v),cy=r*Math.sin(v),pos2.copy(pos),pos2.x+=cx*normal.x+cy*binormal.x,pos2.y+=cx*normal.y+cy*binormal.y,pos2.z+=cx*normal.z+cy*binormal.z,grid[i][j]=vert(pos2.x,pos2.y,pos2.z);for(i=0;segments>i;i++)for(j=0;radialSegments>j;j++)ip=closed?(i+1)%segments:i+1,jp=(j+1)%radialSegments,a=grid[i][j],b=grid[ip][j],c=grid[ip][jp],d=grid[i][jp],uva=new THREE.Vector2(i/segments,j/radialSegments),uvb=new THREE.Vector2((i+1)/segments,j/radialSegments),uvc=new THREE.Vector2((i+1)/segments,(j+1)/radialSegments),uvd=new THREE.Vector2(i/segments,(j+1)/radialSegments),this.faces.push(new THREE.Face3(a,b,d)),this.faceVertexUvs[0].push([uva,uvb,uvd]),this.faces.push(new THREE.Face3(b,c,d)),this.faceVertexUvs[0].push([uvb.clone(),uvc,uvd.clone()]);this.computeFaceNormals(),this.computeVertexNormals()},THREE.TubeGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry,THREE.TubeGeometry.prototype.clone=function(){return new this.constructor(this.parameters.path,this.parameters.segments,this.parameters.radius,this.parameters.radialSegments,this.parameters.closed,this.parameters.taper)},THREE.TubeGeometry.NoTaper=function(u){return 1},THREE.TubeGeometry.SinusoidalTaper=function(u){return Math.sin(Math.PI*u)},THREE.TubeGeometry.FrenetFrames=function(path,segments,closed){function initialNormal3(){normals[0]=new THREE.Vector3,binormals[0]=new THREE.Vector3,smallest=Number.MAX_VALUE,tx=Math.abs(tangents[0].x),ty=Math.abs(tangents[0].y),tz=Math.abs(tangents[0].z),smallest>=tx&&(smallest=tx,normal.set(1,0,0)),smallest>=ty&&(smallest=ty,normal.set(0,1,0)),smallest>=tz&&normal.set(0,0,1),vec.crossVectors(tangents[0],normal).normalize(),normals[0].crossVectors(tangents[0],vec),binormals[0].crossVectors(tangents[0],normals[0])}var theta,smallest,tx,ty,tz,i,u,normal=new THREE.Vector3,tangents=[],normals=[],binormals=[],vec=new THREE.Vector3,mat=new THREE.Matrix4,numpoints=segments+1;for(this.tangents=tangents,this.normals=normals,this.binormals=binormals,i=0;numpoints>i;i++)u=i/(numpoints-1),tangents[i]=path.getTangentAt(u),tangents[i].normalize();for(initialNormal3(),i=1;numpoints>i;i++)normals[i]=normals[i-1].clone(),binormals[i]=binormals[i-1].clone(),vec.crossVectors(tangents[i-1],tangents[i]),vec.length()>Number.EPSILON&&(vec.normalize(),theta=Math.acos(THREE.Math.clamp(tangents[i-1].dot(tangents[i]),-1,1)),normals[i].applyMatrix4(mat.makeRotationAxis(vec,theta))),binormals[i].crossVectors(tangents[i],normals[i]);if(closed)for(theta=Math.acos(THREE.Math.clamp(normals[0].dot(normals[numpoints-1]),-1,1)),theta/=numpoints-1,tangents[0].dot(vec.crossVectors(normals[0],normals[numpoints-1]))>0&&(theta=-theta),i=1;numpoints>i;i++)normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i],theta*i)),binormals[i].crossVectors(tangents[i],normals[i])},THREE.PolyhedronGeometry=function(vertices,indices,radius,detail){function prepare(vector){var vertex=vector.normalize().clone();vertex.index=that.vertices.push(vertex)-1;var u=azimuth(vector)/2/Math.PI+.5,v=inclination(vector)/Math.PI+.5;return vertex.uv=new THREE.Vector2(u,1-v),vertex}function make(v1,v2,v3,materialIndex){var face=new THREE.Face3(v1.index,v2.index,v3.index,[v1.clone(),v2.clone(),v3.clone()],void 0,materialIndex);that.faces.push(face),centroid.copy(v1).add(v2).add(v3).divideScalar(3);var azi=azimuth(centroid);that.faceVertexUvs[0].push([correctUV(v1.uv,v1,azi),correctUV(v2.uv,v2,azi),correctUV(v3.uv,v3,azi)])}function subdivide(face,detail){for(var cols=Math.pow(2,detail),a=prepare(that.vertices[face.a]),b=prepare(that.vertices[face.b]),c=prepare(that.vertices[face.c]),v=[],materialIndex=face.materialIndex,i=0;cols>=i;i++){v[i]=[];for(var aj=prepare(a.clone().lerp(c,i/cols)),bj=prepare(b.clone().lerp(c,i/cols)),rows=cols-i,j=0;rows>=j;j++)0===j&&i===cols?v[i][j]=aj:v[i][j]=prepare(aj.clone().lerp(bj,j/rows))}for(var i=0;cols>i;i++)for(var j=0;2*(cols-i)-1>j;j++){var k=Math.floor(j/2);j%2===0?make(v[i][k+1],v[i+1][k],v[i][k],materialIndex):make(v[i][k+1],v[i+1][k+1],v[i+1][k],materialIndex)}}function azimuth(vector){return Math.atan2(vector.z,-vector.x)}function inclination(vector){return Math.atan2(-vector.y,Math.sqrt(vector.x*vector.x+vector.z*vector.z))}function correctUV(uv,vector,azimuth){return 0>azimuth&&1===uv.x&&(uv=new THREE.Vector2(uv.x-1,uv.y)),0===vector.x&&0===vector.z&&(uv=new THREE.Vector2(azimuth/2/Math.PI+.5,uv.y)),uv.clone()}THREE.Geometry.call(this),this.type="PolyhedronGeometry",this.parameters={vertices:vertices,indices:indices,radius:radius,detail:detail},radius=radius||1,detail=detail||0;for(var that=this,i=0,l=vertices.length;l>i;i+=3)prepare(new THREE.Vector3(vertices[i],vertices[i+1],vertices[i+2]));for(var p=this.vertices,faces=[],i=0,j=0,l=indices.length;l>i;i+=3,j++){var v1=p[indices[i]],v2=p[indices[i+1]],v3=p[indices[i+2]];faces[j]=new THREE.Face3(v1.index,v2.index,v3.index,[v1.clone(),v2.clone(),v3.clone()],void 0,j)}for(var centroid=new THREE.Vector3,i=0,l=faces.length;l>i;i++)subdivide(faces[i],detail);for(var i=0,l=this.faceVertexUvs[0].length;l>i;i++){var uvs=this.faceVertexUvs[0][i],x0=uvs[0].x,x1=uvs[1].x,x2=uvs[2].x,max=Math.max(x0,x1,x2),min=Math.min(x0,x1,x2);max>.9&&.1>min&&(.2>x0&&(uvs[0].x+=1),.2>x1&&(uvs[1].x+=1),.2>x2&&(uvs[2].x+=1))}for(var i=0,l=this.vertices.length;l>i;i++)this.vertices[i].multiplyScalar(radius);this.mergeVertices(),this.computeFaceNormals(),this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)},THREE.PolyhedronGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry,THREE.PolyhedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.PolyhedronGeometry(parameters.vertices,parameters.indices,parameters.radius,parameters.detail)},THREE.DodecahedronGeometry=function(radius,detail){var t=(1+Math.sqrt(5))/2,r=1/t,vertices=[-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,-r,-t,0,-r,t,0,r,-t,0,r,t,-r,-t,0,-r,t,0,r,-t,0,r,t,0,-t,0,-r,t,0,-r,-t,0,r,t,0,r],indices=[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9];THREE.PolyhedronGeometry.call(this,vertices,indices,radius,detail),this.type="DodecahedronGeometry",this.parameters={radius:radius,detail:detail}},THREE.DodecahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype),THREE.DodecahedronGeometry.prototype.constructor=THREE.DodecahedronGeometry,THREE.DodecahedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.DodecahedronGeometry(parameters.radius,parameters.detail)},THREE.IcosahedronGeometry=function(radius,detail){var t=(1+Math.sqrt(5))/2,vertices=[-1,t,0,1,t,0,-1,-t,0,1,-t,0,0,-1,t,0,1,t,0,-1,-t,0,1,-t,t,0,-1,t,0,1,-t,0,-1,-t,0,1],indices=[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1];THREE.PolyhedronGeometry.call(this,vertices,indices,radius,detail),this.type="IcosahedronGeometry",this.parameters={radius:radius,detail:detail}},THREE.IcosahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype),THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry,THREE.IcosahedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.IcosahedronGeometry(parameters.radius,parameters.detail)},THREE.OctahedronGeometry=function(radius,detail){var vertices=[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],indices=[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2];THREE.PolyhedronGeometry.call(this,vertices,indices,radius,detail),this.type="OctahedronGeometry",this.parameters={radius:radius,detail:detail}},THREE.OctahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype),THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry,THREE.OctahedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.OctahedronGeometry(parameters.radius,parameters.detail)},THREE.TetrahedronGeometry=function(radius,detail){var vertices=[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],indices=[2,1,0,0,3,2,1,3,0,2,3,1];THREE.PolyhedronGeometry.call(this,vertices,indices,radius,detail),this.type="TetrahedronGeometry",this.parameters={radius:radius,detail:detail}},THREE.TetrahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype),THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry,THREE.TetrahedronGeometry.prototype.clone=function(){var parameters=this.parameters;return new THREE.TetrahedronGeometry(parameters.radius,parameters.detail)},THREE.ParametricGeometry=function(func,slices,stacks){THREE.Geometry.call(this),this.type="ParametricGeometry",this.parameters={func:func,slices:slices,stacks:stacks};var i,j,p,u,v,verts=this.vertices,faces=this.faces,uvs=this.faceVertexUvs[0],sliceCount=slices+1;for(i=0;stacks>=i;i++)for(v=i/stacks,j=0;slices>=j;j++)u=j/slices,p=func(u,v),verts.push(p);var a,b,c,d,uva,uvb,uvc,uvd;for(i=0;stacks>i;i++)for(j=0;slices>j;j++)a=i*sliceCount+j,b=i*sliceCount+j+1,c=(i+1)*sliceCount+j+1,d=(i+1)*sliceCount+j,uva=new THREE.Vector2(j/slices,i/stacks),uvb=new THREE.Vector2((j+1)/slices,i/stacks),uvc=new THREE.Vector2((j+1)/slices,(i+1)/stacks),uvd=new THREE.Vector2(j/slices,(i+1)/stacks),faces.push(new THREE.Face3(a,b,d)),uvs.push([uva,uvb,uvd]),faces.push(new THREE.Face3(b,c,d)),uvs.push([uvb.clone(),uvc,uvd.clone()]);this.computeFaceNormals(),this.computeVertexNormals()},THREE.ParametricGeometry.prototype=Object.create(THREE.Geometry.prototype),THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry,THREE.WireframeGeometry=function(geometry){function sortFunction(a,b){return a-b}THREE.BufferGeometry.call(this);var edge=[0,0],hash={},keys=["a","b","c"];if(geometry instanceof THREE.Geometry){for(var vertices=geometry.vertices,faces=geometry.faces,numEdges=0,edges=new Uint32Array(6*faces.length),i=0,l=faces.length;l>i;i++)for(var face=faces[i],j=0;3>j;j++){edge[0]=face[keys[j]],edge[1]=face[keys[(j+1)%3]],edge.sort(sortFunction);var key=edge.toString();void 0===hash[key]&&(edges[2*numEdges]=edge[0],edges[2*numEdges+1]=edge[1],hash[key]=!0,numEdges++)}for(var coords=new Float32Array(2*numEdges*3),i=0,l=numEdges;l>i;i++)for(var j=0;2>j;j++){var vertex=vertices[edges[2*i+j]],index=6*i+3*j;coords[index+0]=vertex.x,coords[index+1]=vertex.y,coords[index+2]=vertex.z}this.addAttribute("position",new THREE.BufferAttribute(coords,3))}else if(geometry instanceof THREE.BufferGeometry)if(null!==geometry.index){var indices=geometry.index.array,vertices=geometry.attributes.position,drawcalls=geometry.drawcalls,numEdges=0;0===drawcalls.length&&geometry.addGroup(0,indices.length);for(var edges=new Uint32Array(2*indices.length),o=0,ol=drawcalls.length;ol>o;++o)for(var drawcall=drawcalls[o],start=drawcall.start,count=drawcall.count,i=start,il=start+count;il>i;i+=3)for(var j=0;3>j;j++){edge[0]=indices[i+j],edge[1]=indices[i+(j+1)%3],edge.sort(sortFunction);var key=edge.toString();void 0===hash[key]&&(edges[2*numEdges]=edge[0],edges[2*numEdges+1]=edge[1],hash[key]=!0,numEdges++)}for(var coords=new Float32Array(2*numEdges*3),i=0,l=numEdges;l>i;i++)for(var j=0;2>j;j++){var index=6*i+3*j,index2=edges[2*i+j];coords[index+0]=vertices.getX(index2),coords[index+1]=vertices.getY(index2),coords[index+2]=vertices.getZ(index2)}this.addAttribute("position",new THREE.BufferAttribute(coords,3))}else{for(var vertices=geometry.attributes.position.array,numEdges=vertices.length/3,numTris=numEdges/3,coords=new Float32Array(2*numEdges*3),i=0,l=numTris;l>i;i++)for(var j=0;3>j;j++){var index=18*i+6*j,index1=9*i+3*j;coords[index+0]=vertices[index1],coords[index+1]=vertices[index1+1],coords[index+2]=vertices[index1+2];var index2=9*i+3*((j+1)%3);coords[index+3]=vertices[index2],coords[index+4]=vertices[index2+1],coords[index+5]=vertices[index2+2]}this.addAttribute("position",new THREE.BufferAttribute(coords,3))}},THREE.WireframeGeometry.prototype=Object.create(THREE.BufferGeometry.prototype),THREE.WireframeGeometry.prototype.constructor=THREE.WireframeGeometry,THREE.AxisHelper=function(size){size=size||1;var vertices=new Float32Array([0,0,0,size,0,0,0,0,0,0,size,0,0,0,0,0,0,size]),colors=new Float32Array([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1]),geometry=new THREE.BufferGeometry;geometry.addAttribute("position",new THREE.BufferAttribute(vertices,3)),geometry.addAttribute("color",new THREE.BufferAttribute(colors,3));var material=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});THREE.LineSegments.call(this,geometry,material)},THREE.AxisHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.AxisHelper.prototype.constructor=THREE.AxisHelper,THREE.ArrowHelper=function(){var lineGeometry=new THREE.Geometry;lineGeometry.vertices.push(new THREE.Vector3(0,0,0),new THREE.Vector3(0,1,0));var coneGeometry=new THREE.CylinderGeometry(0,.5,1,5,1);return coneGeometry.translate(0,-.5,0),function(dir,origin,length,color,headLength,headWidth){THREE.Object3D.call(this),void 0===color&&(color=16776960),void 0===length&&(length=1),void 0===headLength&&(headLength=.2*length),void 0===headWidth&&(headWidth=.2*headLength),this.position.copy(origin),length>headLength&&(this.line=new THREE.Line(lineGeometry,new THREE.LineBasicMaterial({color:color})),this.line.matrixAutoUpdate=!1,this.add(this.line)),this.cone=new THREE.Mesh(coneGeometry,new THREE.MeshBasicMaterial({color:color})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(dir),this.setLength(length,headLength,headWidth)}}(),THREE.ArrowHelper.prototype=Object.create(THREE.Object3D.prototype),THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper,THREE.ArrowHelper.prototype.setDirection=function(){var radians,axis=new THREE.Vector3;return function(dir){dir.y>.99999?this.quaternion.set(0,0,0,1):dir.y<-.99999?this.quaternion.set(1,0,0,0):(axis.set(dir.z,0,-dir.x).normalize(),radians=Math.acos(dir.y),this.quaternion.setFromAxisAngle(axis,radians))}}(),THREE.ArrowHelper.prototype.setLength=function(length,headLength,headWidth){void 0===headLength&&(headLength=.2*length),void 0===headWidth&&(headWidth=.2*headLength),length>headLength&&(this.line.scale.set(1,length-headLength,1),this.line.updateMatrix()),this.cone.scale.set(headWidth,headLength,headWidth),this.cone.position.y=length,this.cone.updateMatrix()},THREE.ArrowHelper.prototype.setColor=function(color){void 0!==this.line&&this.line.material.color.set(color),this.cone.material.color.set(color)},THREE.BoxHelper=function(object){var indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),positions=new Float32Array(24),geometry=new THREE.BufferGeometry;geometry.setIndex(new THREE.BufferAttribute(indices,1)),geometry.addAttribute("position",new THREE.BufferAttribute(positions,3)),THREE.LineSegments.call(this,geometry,new THREE.LineBasicMaterial({color:16776960})),void 0!==object&&this.update(object)},THREE.BoxHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.BoxHelper.prototype.constructor=THREE.BoxHelper, +THREE.BoxHelper.prototype.update=function(){var box=new THREE.Box3;return function(object){if(box.setFromObject(object),!box.empty()){var min=box.min,max=box.max,position=this.geometry.attributes.position,array=position.array;array[0]=max.x,array[1]=max.y,array[2]=max.z,array[3]=min.x,array[4]=max.y,array[5]=max.z,array[6]=min.x,array[7]=min.y,array[8]=max.z,array[9]=max.x,array[10]=min.y,array[11]=max.z,array[12]=max.x,array[13]=max.y,array[14]=min.z,array[15]=min.x,array[16]=max.y,array[17]=min.z,array[18]=min.x,array[19]=min.y,array[20]=min.z,array[21]=max.x,array[22]=min.y,array[23]=min.z,position.needsUpdate=!0,this.geometry.computeBoundingSphere()}}}(),THREE.BoundingBoxHelper=function(object,hex){var color=void 0!==hex?hex:8947848;this.object=object,this.box=new THREE.Box3,THREE.Mesh.call(this,new THREE.BoxGeometry(1,1,1),new THREE.MeshBasicMaterial({color:color,wireframe:!0}))},THREE.BoundingBoxHelper.prototype=Object.create(THREE.Mesh.prototype),THREE.BoundingBoxHelper.prototype.constructor=THREE.BoundingBoxHelper,THREE.BoundingBoxHelper.prototype.update=function(){this.box.setFromObject(this.object),this.box.size(this.scale),this.box.center(this.position)},THREE.CameraHelper=function(camera){function addLine(a,b,hex){addPoint(a,hex),addPoint(b,hex)}function addPoint(id,hex){geometry.vertices.push(new THREE.Vector3),geometry.colors.push(new THREE.Color(hex)),void 0===pointMap[id]&&(pointMap[id]=[]),pointMap[id].push(geometry.vertices.length-1)}var geometry=new THREE.Geometry,material=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors}),pointMap={},hexFrustum=16755200,hexCone=16711680,hexUp=43775,hexTarget=16777215,hexCross=3355443;addLine("n1","n2",hexFrustum),addLine("n2","n4",hexFrustum),addLine("n4","n3",hexFrustum),addLine("n3","n1",hexFrustum),addLine("f1","f2",hexFrustum),addLine("f2","f4",hexFrustum),addLine("f4","f3",hexFrustum),addLine("f3","f1",hexFrustum),addLine("n1","f1",hexFrustum),addLine("n2","f2",hexFrustum),addLine("n3","f3",hexFrustum),addLine("n4","f4",hexFrustum),addLine("p","n1",hexCone),addLine("p","n2",hexCone),addLine("p","n3",hexCone),addLine("p","n4",hexCone),addLine("u1","u2",hexUp),addLine("u2","u3",hexUp),addLine("u3","u1",hexUp),addLine("c","t",hexTarget),addLine("p","c",hexCross),addLine("cn1","cn2",hexCross),addLine("cn3","cn4",hexCross),addLine("cf1","cf2",hexCross),addLine("cf3","cf4",hexCross),THREE.LineSegments.call(this,geometry,material),this.camera=camera,this.camera.updateProjectionMatrix(),this.matrix=camera.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=pointMap,this.update()},THREE.CameraHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.CameraHelper.prototype.constructor=THREE.CameraHelper,THREE.CameraHelper.prototype.update=function(){function setPoint(point,x,y,z){vector.set(x,y,z).unproject(camera);var points=pointMap[point];if(void 0!==points)for(var i=0,il=points.length;il>i;i++)geometry.vertices[points[i]].copy(vector)}var geometry,pointMap,vector=new THREE.Vector3,camera=new THREE.Camera;return function(){geometry=this.geometry,pointMap=this.pointMap;var w=1,h=1;camera.projectionMatrix.copy(this.camera.projectionMatrix),setPoint("c",0,0,-1),setPoint("t",0,0,1),setPoint("n1",-w,-h,-1),setPoint("n2",w,-h,-1),setPoint("n3",-w,h,-1),setPoint("n4",w,h,-1),setPoint("f1",-w,-h,1),setPoint("f2",w,-h,1),setPoint("f3",-w,h,1),setPoint("f4",w,h,1),setPoint("u1",.7*w,1.1*h,-1),setPoint("u2",.7*-w,1.1*h,-1),setPoint("u3",0,2*h,-1),setPoint("cf1",-w,0,1),setPoint("cf2",w,0,1),setPoint("cf3",0,-h,1),setPoint("cf4",0,h,1),setPoint("cn1",-w,0,-1),setPoint("cn2",w,0,-1),setPoint("cn3",0,-h,-1),setPoint("cn4",0,h,-1),geometry.verticesNeedUpdate=!0}}(),THREE.DirectionalLightHelper=function(light,size){THREE.Object3D.call(this),this.light=light,this.light.updateMatrixWorld(),this.matrix=light.matrixWorld,this.matrixAutoUpdate=!1,size=size||1;var geometry=new THREE.Geometry;geometry.vertices.push(new THREE.Vector3(-size,size,0),new THREE.Vector3(size,size,0),new THREE.Vector3(size,-size,0),new THREE.Vector3(-size,-size,0),new THREE.Vector3(-size,size,0));var material=new THREE.LineBasicMaterial({fog:!1});material.color.copy(this.light.color).multiplyScalar(this.light.intensity),this.lightPlane=new THREE.Line(geometry,material),this.add(this.lightPlane),geometry=new THREE.Geometry,geometry.vertices.push(new THREE.Vector3,new THREE.Vector3),material=new THREE.LineBasicMaterial({fog:!1}),material.color.copy(this.light.color).multiplyScalar(this.light.intensity),this.targetLine=new THREE.Line(geometry,material),this.add(this.targetLine),this.update()},THREE.DirectionalLightHelper.prototype=Object.create(THREE.Object3D.prototype),THREE.DirectionalLightHelper.prototype.constructor=THREE.DirectionalLightHelper,THREE.DirectionalLightHelper.prototype.dispose=function(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()},THREE.DirectionalLightHelper.prototype.update=function(){var v1=new THREE.Vector3,v2=new THREE.Vector3,v3=new THREE.Vector3;return function(){v1.setFromMatrixPosition(this.light.matrixWorld),v2.setFromMatrixPosition(this.light.target.matrixWorld),v3.subVectors(v2,v1),this.lightPlane.lookAt(v3),this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity),this.targetLine.geometry.vertices[1].copy(v3),this.targetLine.geometry.verticesNeedUpdate=!0,this.targetLine.material.color.copy(this.lightPlane.material.color)}}(),THREE.EdgesHelper=function(object,hex,thresholdAngle){var color=void 0!==hex?hex:16777215;THREE.LineSegments.call(this,new THREE.EdgesGeometry(object.geometry,thresholdAngle),new THREE.LineBasicMaterial({color:color})),this.matrix=object.matrixWorld,this.matrixAutoUpdate=!1},THREE.EdgesHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.EdgesHelper.prototype.constructor=THREE.EdgesHelper,THREE.FaceNormalsHelper=function(object,size,hex,linewidth){this.object=object,this.size=void 0!==size?size:1;var color=void 0!==hex?hex:16776960,width=void 0!==linewidth?linewidth:1,nNormals=0,objGeometry=this.object.geometry;objGeometry instanceof THREE.Geometry?nNormals=objGeometry.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");var geometry=new THREE.BufferGeometry,positions=new THREE.Float32Attribute(2*nNormals*3,3);geometry.addAttribute("position",positions),THREE.LineSegments.call(this,geometry,new THREE.LineBasicMaterial({color:color,linewidth:width})),this.matrixAutoUpdate=!1,this.update()},THREE.FaceNormalsHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.FaceNormalsHelper.prototype.constructor=THREE.FaceNormalsHelper,THREE.FaceNormalsHelper.prototype.update=function(){var v1=new THREE.Vector3,v2=new THREE.Vector3,normalMatrix=new THREE.Matrix3;return function(){this.object.updateMatrixWorld(!0),normalMatrix.getNormalMatrix(this.object.matrixWorld);for(var matrixWorld=this.object.matrixWorld,position=this.geometry.attributes.position,objGeometry=this.object.geometry,vertices=objGeometry.vertices,faces=objGeometry.faces,idx=0,i=0,l=faces.length;l>i;i++){var face=faces[i],normal=face.normal;v1.copy(vertices[face.a]).add(vertices[face.b]).add(vertices[face.c]).divideScalar(3).applyMatrix4(matrixWorld),v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1),position.setXYZ(idx,v1.x,v1.y,v1.z),idx+=1,position.setXYZ(idx,v2.x,v2.y,v2.z),idx+=1}return position.needsUpdate=!0,this}}(),THREE.GridHelper=function(size,step){var geometry=new THREE.Geometry,material=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});this.color1=new THREE.Color(4473924),this.color2=new THREE.Color(8947848);for(var i=-size;size>=i;i+=step){geometry.vertices.push(new THREE.Vector3(-size,0,i),new THREE.Vector3(size,0,i),new THREE.Vector3(i,0,-size),new THREE.Vector3(i,0,size));var color=0===i?this.color1:this.color2;geometry.colors.push(color,color,color,color)}THREE.LineSegments.call(this,geometry,material)},THREE.GridHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.GridHelper.prototype.constructor=THREE.GridHelper,THREE.GridHelper.prototype.setColors=function(colorCenterLine,colorGrid){this.color1.set(colorCenterLine),this.color2.set(colorGrid),this.geometry.colorsNeedUpdate=!0},THREE.HemisphereLightHelper=function(light,sphereSize){THREE.Object3D.call(this),this.light=light,this.light.updateMatrixWorld(),this.matrix=light.matrixWorld,this.matrixAutoUpdate=!1,this.colors=[new THREE.Color,new THREE.Color];var geometry=new THREE.SphereGeometry(sphereSize,4,2);geometry.rotateX(-Math.PI/2);for(var i=0,il=8;il>i;i++)geometry.faces[i].color=this.colors[4>i?0:1];var material=new THREE.MeshBasicMaterial({vertexColors:THREE.FaceColors,wireframe:!0});this.lightSphere=new THREE.Mesh(geometry,material),this.add(this.lightSphere),this.update()},THREE.HemisphereLightHelper.prototype=Object.create(THREE.Object3D.prototype),THREE.HemisphereLightHelper.prototype.constructor=THREE.HemisphereLightHelper,THREE.HemisphereLightHelper.prototype.dispose=function(){this.lightSphere.geometry.dispose(),this.lightSphere.material.dispose()},THREE.HemisphereLightHelper.prototype.update=function(){var vector=new THREE.Vector3;return function(){this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity),this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity),this.lightSphere.lookAt(vector.setFromMatrixPosition(this.light.matrixWorld).negate()),this.lightSphere.geometry.colorsNeedUpdate=!0}}(),THREE.PointLightHelper=function(light,sphereSize){this.light=light,this.light.updateMatrixWorld();var geometry=new THREE.SphereGeometry(sphereSize,4,2),material=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});material.color.copy(this.light.color).multiplyScalar(this.light.intensity),THREE.Mesh.call(this,geometry,material),this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1},THREE.PointLightHelper.prototype=Object.create(THREE.Mesh.prototype),THREE.PointLightHelper.prototype.constructor=THREE.PointLightHelper,THREE.PointLightHelper.prototype.dispose=function(){this.geometry.dispose(),this.material.dispose()},THREE.PointLightHelper.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)},THREE.SkeletonHelper=function(object){this.bones=this.getBoneList(object);for(var geometry=new THREE.Geometry,i=0;ii;i++)for(var face=faces[i],j=0,jl=face.vertexNormals.length;jl>j;j++){var vertex=vertices[face[keys[j]]],normal=face.vertexNormals[j];v1.copy(vertex).applyMatrix4(matrixWorld),v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1),position.setXYZ(idx,v1.x,v1.y,v1.z),idx+=1,position.setXYZ(idx,v2.x,v2.y,v2.z),idx+=1}else if(objGeometry instanceof THREE.BufferGeometry)for(var objPos=objGeometry.attributes.position,objNorm=objGeometry.attributes.normal,idx=0,j=0,jl=objPos.count;jl>j;j++)v1.set(objPos.getX(j),objPos.getY(j),objPos.getZ(j)).applyMatrix4(matrixWorld),v2.set(objNorm.getX(j),objNorm.getY(j),objNorm.getZ(j)),v2.applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1),position.setXYZ(idx,v1.x,v1.y,v1.z),idx+=1,position.setXYZ(idx,v2.x,v2.y,v2.z),idx+=1;return position.needsUpdate=!0,this}}(),THREE.WireframeHelper=function(object,hex){var color=void 0!==hex?hex:16777215;THREE.LineSegments.call(this,new THREE.WireframeGeometry(object.geometry),new THREE.LineBasicMaterial({color:color})),this.matrix=object.matrixWorld,this.matrixAutoUpdate=!1},THREE.WireframeHelper.prototype=Object.create(THREE.LineSegments.prototype),THREE.WireframeHelper.prototype.constructor=THREE.WireframeHelper,THREE.ImmediateRenderObject=function(material){THREE.Object3D.call(this),this.material=material,this.render=function(renderCallback){}},THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype),THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject,THREE.MorphBlendMesh=function(geometry,material){THREE.Mesh.call(this,geometry,material),this.animationsMap={},this.animationsList=[];var numFrames=this.geometry.morphTargets.length,name="__default",startFrame=0,endFrame=numFrames-1,fps=numFrames/1;this.createAnimation(name,startFrame,endFrame,fps),this.setAnimationWeight(name,1)},THREE.MorphBlendMesh.prototype=Object.create(THREE.Mesh.prototype),THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh,THREE.MorphBlendMesh.prototype.createAnimation=function(name,start,end,fps){var animation={start:start,end:end,length:end-start+1,fps:fps,duration:(end-start)/fps,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[name]=animation,this.animationsList.push(animation)},THREE.MorphBlendMesh.prototype.autoCreateAnimations=function(fps){for(var firstAnimation,pattern=/([a-z]+)_?(\d+)/,frameRanges={},geometry=this.geometry,i=0,il=geometry.morphTargets.length;il>i;i++){var morph=geometry.morphTargets[i],chunks=morph.name.match(pattern);if(chunks&&chunks.length>1){var name=chunks[1];frameRanges[name]||(frameRanges[name]={start:1/0,end:-(1/0)});var range=frameRanges[name];irange.end&&(range.end=i),firstAnimation||(firstAnimation=name)}}for(var name in frameRanges){var range=frameRanges[name];this.createAnimation(name,range.start,range.end,fps)}this.firstAnimation=firstAnimation},THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(name){var animation=this.animationsMap[name];animation&&(animation.direction=1,animation.directionBackwards=!1)},THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(name){var animation=this.animationsMap[name];animation&&(animation.direction=-1,animation.directionBackwards=!0)},THREE.MorphBlendMesh.prototype.setAnimationFPS=function(name,fps){var animation=this.animationsMap[name];animation&&(animation.fps=fps,animation.duration=(animation.end-animation.start)/animation.fps)},THREE.MorphBlendMesh.prototype.setAnimationDuration=function(name,duration){var animation=this.animationsMap[name];animation&&(animation.duration=duration,animation.fps=(animation.end-animation.start)/animation.duration)},THREE.MorphBlendMesh.prototype.setAnimationWeight=function(name,weight){var animation=this.animationsMap[name];animation&&(animation.weight=weight)},THREE.MorphBlendMesh.prototype.setAnimationTime=function(name,time){var animation=this.animationsMap[name];animation&&(animation.time=time)},THREE.MorphBlendMesh.prototype.getAnimationTime=function(name){var time=0,animation=this.animationsMap[name];return animation&&(time=animation.time),time},THREE.MorphBlendMesh.prototype.getAnimationDuration=function(name){var duration=-1,animation=this.animationsMap[name];return animation&&(duration=animation.duration),duration},THREE.MorphBlendMesh.prototype.playAnimation=function(name){var animation=this.animationsMap[name];animation?(animation.time=0,animation.active=!0):console.warn("THREE.MorphBlendMesh: animation["+name+"] undefined in .playAnimation()")},THREE.MorphBlendMesh.prototype.stopAnimation=function(name){var animation=this.animationsMap[name];animation&&(animation.active=!1)},THREE.MorphBlendMesh.prototype.update=function(delta){for(var i=0,il=this.animationsList.length;il>i;i++){var animation=this.animationsList[i];if(animation.active){var frameTime=animation.duration/animation.length;animation.time+=animation.direction*delta,animation.mirroredLoop?(animation.time>animation.duration||animation.time<0)&&(animation.direction*=-1,animation.time>animation.duration&&(animation.time=animation.duration,animation.directionBackwards=!0),animation.time<0&&(animation.time=0,animation.directionBackwards=!1)):(animation.time=animation.time%animation.duration,animation.time<0&&(animation.time+=animation.duration));var keyframe=animation.start+THREE.Math.clamp(Math.floor(animation.time/frameTime),0,animation.length-1),weight=animation.weight;keyframe!==animation.currentFrame&&(this.morphTargetInfluences[animation.lastFrame]=0,this.morphTargetInfluences[animation.currentFrame]=1*weight,this.morphTargetInfluences[keyframe]=0,animation.lastFrame=animation.currentFrame,animation.currentFrame=keyframe);var mix=animation.time%frameTime/frameTime;animation.directionBackwards&&(mix=1-mix),animation.currentFrame!==animation.lastFrame?(this.morphTargetInfluences[animation.currentFrame]=mix*weight,this.morphTargetInfluences[animation.lastFrame]=(1-mix)*weight):this.morphTargetInfluences[animation.currentFrame]=weight}}},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=THREE),exports.THREE=THREE):this.THREE=THREE},{}],6:[function(_dereq_,module,exports){!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof _dereq_&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof _dereq_&&_dereq_,o=0;o 0.0 && abs(vUV.x - 0.5) < .001) {","} else if (a.x < 0.0 || a.x > 1.0 || a.y < 0.0 || a.y > 1.0) {","gl_FragColor = backgroundColor;","} else {","gl_FragColor = texture2D(texture, vec2(a.x * 0.5 + (vUV.x < 0.5 ? 0.0 : 0.5), a.y));","}","}"].join("\n")};module.exports=BarrelDistortionFragment},{}],6:[function(_dereq_,module,exports){function Distortion(coefficients){this.coefficients=coefficients}Distortion.prototype.distortInverse=function(radius){for(var r0=radius/.9,r1=.9*radius,dr0=radius-this.distort(r0);Math.abs(r1-r0)>1e-4;){var dr1=radius-this.distort(r1),r2=r1-dr1*((r1-r0)/(dr1-dr0));r0=r1,r1=r2,dr0=dr1}return r1},Distortion.prototype.distort=function(radius){return radius*this.distortionFactor_(radius)},Distortion.prototype.distortionFactor_=function(radius){for(var result=1,rFactor=1,rSquared=radius*radius,i=0;i=200&&xhr.status<=299?(console.log("Successfully loaded online DPDB."),obj.dpdb=JSON.parse(xhr.response),obj.recalculateDeviceParams_()):console.error("Error loading online DPDB!")}),xhr.send()}}function DeviceParams(params){this.xdpi=params.xdpi,this.ydpi=params.ydpi,this.bevelMm=params.bevelMm}var DPDB_CACHE=_dereq_("./dpdb-cache.js"),Util=_dereq_("./util.js"),ONLINE_DPDB_URL="https://storage.googleapis.com/cardboard-dpdb/dpdb.json";Dpdb.prototype.getDeviceParams=function(){return this.deviceParams},Dpdb.prototype.recalculateDeviceParams_=function(){console.log("Recalculating device params.");var newDeviceParams=this.calcDeviceParams_();console.log("New device parameters:"),console.log(newDeviceParams),newDeviceParams?(this.deviceParams=newDeviceParams,this.onDeviceParamsUpdated&&this.onDeviceParamsUpdated(this.deviceParams)):console.warn("Failed to recalculate device parameters.")},Dpdb.prototype.calcDeviceParams_=function(){var db=this.dpdb;if(!db)return console.error("DPDB not available."),null;if(1!=db.format)return console.error("DPDB has unexpected format version."),null;if(!db.devices||!db.devices.length)return console.error("DPDB does not have a devices section."),null;var userAgent=navigator.userAgent||navigator.vendor||window.opera,width=Util.getScreenWidth(),height=Util.getScreenHeight();if(console.log("User agent: "+userAgent),console.log("Pixel width: "+width),console.log("Pixel height: "+height),!db.devices)return console.error("DPDB has no devices section."),null;for(var i=0;i %s",this.mode,mode),this.mode=mode,this.button.setMode(mode,this.isVRCompatible),this.mode==Modes.VR&&Util.isLandscapeMode()&&Util.isMobile()?this.rotateInstructions.showTemporarily(3e3):this.updateRotateInstructions_(),this.viewerSelector.hide(),this.emit("modechange",mode,oldMode),this.isTouchPannerEnabled&&(this.mode==Modes.VR?WebVRConfig.TOUCH_PANNER_DISABLED=!0:WebVRConfig.TOUCH_PANNER_DISABLED=!1),void(this.mode==Modes.VR&&this.setHMDVRDeviceParams_(this.getViewer())))},WebVRManager.prototype.onFSClick_=function(){switch(this.mode){case Modes.NORMAL:if(Util.isIOS()&&Util.isIFrame()){var url=window.location.href;return url=Util.appendQueryParameter(url,"no_fullscreen","true"),url=Util.appendQueryParameter(url,"start_mode",Modes.MAGIC_WINDOW),void(top.location.href=url)}this.normalToMagicWindow_(),this.setMode_(Modes.MAGIC_WINDOW);break;case Modes.MAGIC_WINDOW:this.isFullscreenDisabled?window.history.back():(this.anyModeToNormal_(),this.setMode_(Modes.NORMAL))}},WebVRManager.prototype.onVRClick_=function(){if(this.mode==Modes.NORMAL&&Util.isIOS()&&Util.isIFrame()){var url=window.location.href;return url=Util.appendQueryParameter(url,"no_fullscreen","true"),url=Util.appendQueryParameter(url,"start_mode",Modes.VR),void(top.location.href=url)}this.anyModeToVR_(),this.setMode_(Modes.VR)},WebVRManager.prototype.onBackClick_=function(){this.isFullscreenDisabled?window.history.back():(this.anyModeToNormal_(),this.setMode_(Modes.NORMAL))},WebVRManager.prototype.onSettingsClick_=function(){this.viewerSelector.show()},WebVRManager.prototype.normalToMagicWindow_=function(){this.requestFullscreen_(),this.wakelock.request()},WebVRManager.prototype.anyModeToVR_=function(){this.requestFullscreen_(),this.wakelock.request(),this.distorter.patch()},WebVRManager.prototype.vrToMagicWindow_=function(){this.distorter.unpatch(),this.resize_()},WebVRManager.prototype.anyModeToNormal_=function(){this.exitFullscreen_(),this.releasePointerLock_(),this.wakelock.release(),this.distorter.unpatch(),this.resize_()},WebVRManager.prototype.resizeIfNeeded_=function(camera){var size=this.renderer.getSize();size.width==window.innerWidth&&size.height==window.innerHeight||this.resize_()},WebVRManager.prototype.resize_=function(){this.effect.setSize(window.innerWidth,window.innerHeight),this.camera&&(this.camera.aspect=window.innerWidth/window.innerHeight,this.camera.updateProjectionMatrix())},WebVRManager.prototype.onOrientationChange_=function(e){this.updateRotateInstructions_(),this.viewerSelector.hide()},WebVRManager.prototype.updateRotateInstructions_=function(){this.rotateInstructions.disableShowTemporarily(),this.mode==Modes.VR&&!Util.isLandscapeMode()&&Util.isMobile()?this.rotateInstructions.show():this.rotateInstructions.hide()},WebVRManager.prototype.onFullscreenChange_=function(e){null!==document.webkitFullscreenElement&&null!==document.mozFullScreenElement||(this.anyModeToNormal_(),this.setMode_(Modes.NORMAL))},WebVRManager.prototype.requestPointerLock_=function(){var canvas=this.renderer.domElement;canvas.requestPointerLock=canvas.requestPointerLock||canvas.mozRequestPointerLock||canvas.webkitRequestPointerLock,canvas.requestPointerLock&&canvas.requestPointerLock()},WebVRManager.prototype.releasePointerLock_=function(){document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock,document.exitPointerLock&&document.exitPointerLock()},WebVRManager.prototype.requestOrientationLock_=function(){screen.orientation&&Util.isMobile()&&screen.orientation.lock("landscape")},WebVRManager.prototype.releaseOrientationLock_=function(){screen.orientation&&screen.orientation.unlock()},WebVRManager.prototype.requestFullscreen_=function(){var canvas=document.body;canvas.requestFullscreen?canvas.requestFullscreen():canvas.mozRequestFullScreen?canvas.mozRequestFullScreen({vrDisplay:this.hmd}):canvas.webkitRequestFullscreen?canvas.webkitRequestFullscreen({vrDisplay:this.hmd}):canvas.msRequestFullscreen&&canvas.msRequestFullscreen({vrDisplay:this.hmd})},WebVRManager.prototype.exitFullscreen_=function(){document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.msExitFullscreen&&document.msExitFullscreen()},WebVRManager.prototype.onViewerChanged_=function(viewer){this.deviceInfo.setViewer(viewer),this.distorter.updateDeviceInfo(this.deviceInfo),this.setHMDVRDeviceParams_(viewer),this.emit("viewerchange",viewer)},WebVRManager.prototype.setHMDVRDeviceParams_=function(viewer){this.getDeviceByType_(HMDVRDevice).then(function(hmd){hmd&&(hmd.setFieldOfView&&hmd.setFieldOfView(this.deviceInfo.getFieldOfViewLeftEye(this.isUndistorted),this.deviceInfo.getFieldOfViewRightEye(this.isUndistorted)),hmd.setInterpupillaryDistance&&hmd.setInterpupillaryDistance(viewer.interLensDistance))}.bind(this))},WebVRManager.prototype.onDeviceParamsUpdated_=function(newParams){console.log("DPDB reported that device params were updated."),this.deviceInfo.updateDeviceParams(newParams),this.distorter.updateDeviceInfo(this.deviceInfo)},module.exports=WebVRManager},{"./button-manager.js":2,"./cardboard-distorter.js":3,"./device-info.js":4,"./dpdb.js":8,"./emitter.js":9,"./modes.js":11,"./rotate-instructions.js":12,"./util.js":13,"./viewer-selector.js":14,"./wakelock.js":15}]},{},[10])},{}],7:[function(_dereq_,module,exports){!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof _dereq_&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof _dereq_&&_dereq_,o=0;oUtil.MAX_TIMESTEP?(console.warn("Invalid timestamps detected. Time step between successive gyroscope sensor samples is very small or not monotonic"),void(this.previousTimestampS=timestampS)):(this.accelerometer.set(-accGravity.x,-accGravity.y,-accGravity.z), +this.gyroscope.set(rotRate.alpha,rotRate.beta,rotRate.gamma),(this.isIOS||this.isFirefoxAndroid)&&this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addAccelMeasurement(this.accelerometer,timestampS),this.filter.addGyroMeasurement(this.gyroscope,timestampS),void(this.previousTimestampS=timestampS))},FusionPositionSensorVRDevice.prototype.onScreenOrientationChange_=function(screenOrientation){this.setScreenTransform_()},FusionPositionSensorVRDevice.prototype.setScreenTransform_=function(){switch(this.worldToScreenQ.set(0,0,0,1),window.orientation){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new THREE.Vector3(0,0,1),-Math.PI/2);break;case-90:this.worldToScreenQ.setFromAxisAngle(new THREE.Vector3(0,0,1),Math.PI/2);break;case 180:}},module.exports=FusionPositionSensorVRDevice},{"./base.js":1,"./complementary-filter.js":3,"./pose-predictor.js":7,"./three-math.js":9,"./touch-panner.js":10,"./util.js":11}],5:[function(_dereq_,module,exports){var WebVRPolyfill=_dereq_("./webvr-polyfill.js");window.WebVRConfig=window.WebVRConfig||{},new WebVRPolyfill},{"./webvr-polyfill.js":12}],6:[function(_dereq_,module,exports){function MouseKeyboardPositionSensorVRDevice(){this.deviceId="webvr-polyfill:mouse-keyboard",this.deviceName="VR Position Device (webvr-polyfill:mouse-keyboard)",window.addEventListener("keydown",this.onKeyDown_.bind(this)),window.addEventListener("mousemove",this.onMouseMove_.bind(this)),window.addEventListener("mousedown",this.onMouseDown_.bind(this)),window.addEventListener("mouseup",this.onMouseUp_.bind(this)),this.phi=0,this.theta=0,this.targetAngle=null,this.euler=new THREE.Euler,this.orientation=new THREE.Quaternion,this.rotateStart=new THREE.Vector2,this.rotateEnd=new THREE.Vector2,this.rotateDelta=new THREE.Vector2}var PositionSensorVRDevice=_dereq_("./base.js").PositionSensorVRDevice,THREE=_dereq_("./three-math.js"),Util=_dereq_("./util.js"),KEY_SPEED=.15,KEY_ANIMATION_DURATION=80,MOUSE_SPEED_X=.5,MOUSE_SPEED_Y=.3;MouseKeyboardPositionSensorVRDevice.prototype=new PositionSensorVRDevice,MouseKeyboardPositionSensorVRDevice.prototype.getState=function(){return this.euler.set(this.phi,this.theta,0,"YXZ"),this.orientation.setFromEuler(this.euler),{hasOrientation:!0,orientation:this.orientation,hasPosition:!1,position:null}},MouseKeyboardPositionSensorVRDevice.prototype.onKeyDown_=function(e){38==e.keyCode?this.animatePhi_(this.phi+KEY_SPEED):39==e.keyCode?this.animateTheta_(this.theta-KEY_SPEED):40==e.keyCode?this.animatePhi_(this.phi-KEY_SPEED):37==e.keyCode&&this.animateTheta_(this.theta+KEY_SPEED)},MouseKeyboardPositionSensorVRDevice.prototype.animateTheta_=function(targetAngle){this.animateKeyTransitions_("theta",targetAngle)},MouseKeyboardPositionSensorVRDevice.prototype.animatePhi_=function(targetAngle){targetAngle=Util.clamp(targetAngle,-Math.PI/2,Math.PI/2),this.animateKeyTransitions_("phi",targetAngle)},MouseKeyboardPositionSensorVRDevice.prototype.animateKeyTransitions_=function(angleName,targetAngle){this.angleAnimation&&clearInterval(this.angleAnimation);var startAngle=this[angleName],startTime=new Date;this.angleAnimation=setInterval(function(){var elapsed=new Date-startTime;if(elapsed>=KEY_ANIMATION_DURATION)return this[angleName]=targetAngle,void clearInterval(this.angleAnimation);var percent=elapsed/KEY_ANIMATION_DURATION;this[angleName]=startAngle+(targetAngle-startAngle)*percent}.bind(this),1e3/60)},MouseKeyboardPositionSensorVRDevice.prototype.onMouseDown_=function(e){this.rotateStart.set(e.clientX,e.clientY),this.isDragging=!0},MouseKeyboardPositionSensorVRDevice.prototype.onMouseMove_=function(e){if(this.isDragging||this.isPointerLocked_()){if(this.isPointerLocked_()){var movementX=e.movementX||e.mozMovementX||0,movementY=e.movementY||e.mozMovementY||0;this.rotateEnd.set(this.rotateStart.x-movementX,this.rotateStart.y-movementY)}else this.rotateEnd.set(e.clientX,e.clientY);this.rotateDelta.subVectors(this.rotateEnd,this.rotateStart),this.rotateStart.copy(this.rotateEnd);var element=document.body;this.phi+=2*Math.PI*this.rotateDelta.y/element.clientHeight*MOUSE_SPEED_Y,this.theta+=2*Math.PI*this.rotateDelta.x/element.clientWidth*MOUSE_SPEED_X,this.phi=Util.clamp(this.phi,-Math.PI/2,Math.PI/2)}},MouseKeyboardPositionSensorVRDevice.prototype.onMouseUp_=function(e){this.isDragging=!1},MouseKeyboardPositionSensorVRDevice.prototype.isPointerLocked_=function(){var el=document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement;return void 0!==el},MouseKeyboardPositionSensorVRDevice.prototype.resetSensor=function(){console.error("Not implemented yet.")},module.exports=MouseKeyboardPositionSensorVRDevice},{"./base.js":1,"./three-math.js":9,"./util.js":11}],7:[function(_dereq_,module,exports){function PosePredictor(predictionTimeS){this.predictionTimeS=predictionTimeS,this.previousQ=new THREE.Quaternion,this.previousTimestampS=null,this.deltaQ=new THREE.Quaternion,this.outQ=new THREE.Quaternion}var THREE=_dereq_("./three-math.js"),DEBUG=!1;PosePredictor.prototype.getPrediction=function(currentQ,gyro,timestampS){if(!this.previousTimestampS)return this.previousQ.copy(currentQ),this.previousTimestampS=timestampS,currentQ;var axis=new THREE.Vector3;axis.copy(gyro),axis.normalize();var angularSpeed=gyro.length();if(angularSpeed0?(s=.5/Math.sqrt(trace+1),this._w=.25/s,this._x=(m32-m23)*s,this._y=(m13-m31)*s,this._z=(m21-m12)*s):m11>m22&&m11>m33?(s=2*Math.sqrt(1+m11-m22-m33),this._w=(m32-m23)/s,this._x=.25*s,this._y=(m12+m21)/s,this._z=(m13+m31)/s):m22>m33?(s=2*Math.sqrt(1+m22-m11-m33),this._w=(m13-m31)/s,this._x=(m12+m21)/s,this._y=.25*s,this._z=(m23+m32)/s):(s=2*Math.sqrt(1+m33-m11-m22),this._w=(m21-m12)/s,this._x=(m13+m31)/s,this._y=(m23+m32)/s,this._z=.25*s),this.onChangeCallback(),this},setFromUnitVectors:function(){var v1,r,EPS=1e-6;return function(vFrom,vTo){return void 0===v1&&(v1=new THREE.Vector3),r=vFrom.dot(vTo)+1,EPS>r?(r=0,Math.abs(vFrom.x)>Math.abs(vFrom.z)?v1.set(-vFrom.y,vFrom.x,0):v1.set(0,-vFrom.z,vFrom.y)):v1.crossVectors(vFrom,vTo),this._x=v1.x,this._y=v1.y,this._z=v1.z,this._w=r,this.normalize(),this}}(),inverse:function(){return this.conjugate().normalize(),this},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this.onChangeCallback(),this},dot:function(v){return this._x*v._x+this._y*v._y+this._z*v._z+this._w*v._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var l=this.length();return 0===l?(this._x=0,this._y=0,this._z=0,this._w=1):(l=1/l,this._x=this._x*l,this._y=this._y*l,this._z=this._z*l,this._w=this._w*l),this.onChangeCallback(),this},multiply:function(q,p){return void 0!==p?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(q,p)):this.multiplyQuaternions(this,q)},multiplyQuaternions:function(a,b){var qax=a._x,qay=a._y,qaz=a._z,qaw=a._w,qbx=b._x,qby=b._y,qbz=b._z,qbw=b._w;return this._x=qax*qbw+qaw*qbx+qay*qbz-qaz*qby,this._y=qay*qbw+qaw*qby+qaz*qbx-qax*qbz,this._z=qaz*qbw+qaw*qbz+qax*qby-qay*qbx,this._w=qaw*qbw-qax*qbx-qay*qby-qaz*qbz,this.onChangeCallback(),this},multiplyVector3:function(vector){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),vector.applyQuaternion(this)},slerp:function(qb,t){if(0===t)return this;if(1===t)return this.copy(qb);var x=this._x,y=this._y,z=this._z,w=this._w,cosHalfTheta=w*qb._w+x*qb._x+y*qb._y+z*qb._z;if(0>cosHalfTheta?(this._w=-qb._w,this._x=-qb._x,this._y=-qb._y,this._z=-qb._z,cosHalfTheta=-cosHalfTheta):this.copy(qb),cosHalfTheta>=1)return this._w=w,this._x=x,this._y=y,this._z=z,this;var halfTheta=Math.acos(cosHalfTheta),sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001)return this._w=.5*(w+this._w),this._x=.5*(x+this._x),this._y=.5*(y+this._y),this._z=.5*(z+this._z),this;var ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta,ratioB=Math.sin(t*halfTheta)/sinHalfTheta;return this._w=w*ratioA+this._w*ratioB,this._x=x*ratioA+this._x*ratioB,this._y=y*ratioA+this._y*ratioB,this._z=z*ratioA+this._z*ratioB,this.onChangeCallback(),this},equals:function(quaternion){return quaternion._x===this._x&&quaternion._y===this._y&&quaternion._z===this._z&&quaternion._w===this._w},fromArray:function(array,offset){return void 0===offset&&(offset=0),this._x=array[offset],this._y=array[offset+1],this._z=array[offset+2],this._w=array[offset+3],this.onChangeCallback(),this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this._x,array[offset+1]=this._y,array[offset+2]=this._z,array[offset+3]=this._w,array},onChange:function(callback){return this.onChangeCallback=callback,this},onChangeCallback:function(){},clone:function(){return new THREE.Quaternion(this._x,this._y,this._z,this._w)}},THREE.Quaternion.slerp=function(qa,qb,qm,t){return qm.copy(qa).slerp(qb,t)},THREE.Vector2=function(x,y){this.x=x||0,this.y=y||0},THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(x,y){return this.x=x,this.y=y,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+index)}},copy:function(v){return this.x=v.x,this.y=v.y,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this)},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this},addScalar:function(s){return this.x+=s,this.y+=s,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this)},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this},multiply:function(v){return this.x*=v.x,this.y*=v.y,this},multiplyScalar:function(s){return this.x*=s,this.y*=s,this},divide:function(v){return this.x/=v.x,this.y/=v.y,this},divideScalar:function(scalar){if(0!==scalar){var invScalar=1/scalar;this.x*=invScalar,this.y*=invScalar}else this.x=0,this.y=0;return this},min:function(v){return this.x>v.x&&(this.x=v.x),this.y>v.y&&(this.y=v.y),this},max:function(v){return this.xmax.x&&(this.x=max.x),this.ymax.y&&(this.y=max.y),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector2,max=new THREE.Vector2),min.set(minVal,minVal),max.set(maxVal,maxVal),this.clamp(min,max)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(v){return this.x*v.x+this.y*v.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy},setLength:function(l){var oldLength=this.length();return 0!==oldLength&&l!==oldLength&&this.multiplyScalar(l/oldLength),this},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this},equals:function(v){return v.x===this.x&&v.y===this.y},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this},clone:function(){return new THREE.Vector2(this.x,this.y)}},THREE.Vector3=function(x,y,z){this.x=x||0,this.y=y||0,this.z=z||0},THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(x,y,z){return this.x=x,this.y=y,this.z=z,this},setX:function(x){return this.x=x,this},setY:function(y){return this.y=y,this},setZ:function(z){return this.z=z,this},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;default:throw new Error("index is out of range: "+index)}},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+index)}},copy:function(v){return this.x=v.x,this.y=v.y,this.z=v.z,this},add:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(v,w)):(this.x+=v.x,this.y+=v.y,this.z+=v.z,this)},addScalar:function(s){return this.x+=s,this.y+=s,this.z+=s,this},addVectors:function(a,b){return this.x=a.x+b.x,this.y=a.y+b.y,this.z=a.z+b.z,this},sub:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(v,w)):(this.x-=v.x,this.y-=v.y,this.z-=v.z,this)},subVectors:function(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this.z=a.z-b.z,this},multiply:function(v,w){return void 0!==w?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(v,w)):(this.x*=v.x,this.y*=v.y,this.z*=v.z,this)},multiplyScalar:function(scalar){return this.x*=scalar,this.y*=scalar,this.z*=scalar,this},multiplyVectors:function(a,b){return this.x=a.x*b.x,this.y=a.y*b.y,this.z=a.z*b.z,this},applyEuler:function(){var quaternion;return function(euler){return euler instanceof THREE.Euler==!1&&console.error("THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order."),void 0===quaternion&&(quaternion=new THREE.Quaternion),this.applyQuaternion(quaternion.setFromEuler(euler)),this}}(),applyAxisAngle:function(){var quaternion;return function(axis,angle){return void 0===quaternion&&(quaternion=new THREE.Quaternion),this.applyQuaternion(quaternion.setFromAxisAngle(axis,angle)),this}}(),applyMatrix3:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[3]*y+e[6]*z,this.y=e[1]*x+e[4]*y+e[7]*z,this.z=e[2]*x+e[5]*y+e[8]*z,this},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z+e[12],this.y=e[1]*x+e[5]*y+e[9]*z+e[13],this.z=e[2]*x+e[6]*y+e[10]*z+e[14],this},applyProjection:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements,d=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);return this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*d,this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*d,this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*d,this},applyQuaternion:function(q){var x=this.x,y=this.y,z=this.z,qx=q.x,qy=q.y,qz=q.z,qw=q.w,ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;return this.x=ix*qw+iw*-qx+iy*-qz-iz*-qy,this.y=iy*qw+iw*-qy+iz*-qx-ix*-qz,this.z=iz*qw+iw*-qz+ix*-qy-iy*-qx,this},project:function(){var matrix;return function(camera){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.multiplyMatrices(camera.projectionMatrix,matrix.getInverse(camera.matrixWorld)),this.applyProjection(matrix)}}(),unproject:function(){var matrix;return function(camera){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.multiplyMatrices(camera.matrixWorld,matrix.getInverse(camera.projectionMatrix)),this.applyProjection(matrix)}}(),transformDirection:function(m){var x=this.x,y=this.y,z=this.z,e=m.elements;return this.x=e[0]*x+e[4]*y+e[8]*z,this.y=e[1]*x+e[5]*y+e[9]*z,this.z=e[2]*x+e[6]*y+e[10]*z,this.normalize(),this},divide:function(v){return this.x/=v.x,this.y/=v.y,this.z/=v.z,this},divideScalar:function(scalar){if(0!==scalar){var invScalar=1/scalar;this.x*=invScalar,this.y*=invScalar,this.z*=invScalar}else this.x=0,this.y=0,this.z=0;return this},min:function(v){return this.x>v.x&&(this.x=v.x),this.y>v.y&&(this.y=v.y),this.z>v.z&&(this.z=v.z),this},max:function(v){return this.xmax.x&&(this.x=max.x),this.ymax.y&&(this.y=max.y),this.zmax.z&&(this.z=max.z),this},clampScalar:function(){var min,max;return function(minVal,maxVal){return void 0===min&&(min=new THREE.Vector3,max=new THREE.Vector3),min.set(minVal,minVal,minVal),max.set(maxVal,maxVal,maxVal),this.clamp(min,max)}}(),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(l){var oldLength=this.length();return 0!==oldLength&&l!==oldLength&&this.multiplyScalar(l/oldLength),this},lerp:function(v,alpha){return this.x+=(v.x-this.x)*alpha,this.y+=(v.y-this.y)*alpha,this.z+=(v.z-this.z)*alpha,this},cross:function(v,w){if(void 0!==w)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(v,w);var x=this.x,y=this.y,z=this.z;return this.x=y*v.z-z*v.y,this.y=z*v.x-x*v.z,this.z=x*v.y-y*v.x,this},crossVectors:function(a,b){var ax=a.x,ay=a.y,az=a.z,bx=b.x,by=b.y,bz=b.z;return this.x=ay*bz-az*by,this.y=az*bx-ax*bz,this.z=ax*by-ay*bx,this},projectOnVector:function(){var v1,dot;return function(vector){return void 0===v1&&(v1=new THREE.Vector3),v1.copy(vector).normalize(),dot=this.dot(v1),this.copy(v1).multiplyScalar(dot)}}(),projectOnPlane:function(){var v1;return function(planeNormal){return void 0===v1&&(v1=new THREE.Vector3),v1.copy(this).projectOnVector(planeNormal),this.sub(v1)}}(),reflect:function(){var v1;return function(normal){return void 0===v1&&(v1=new THREE.Vector3),this.sub(v1.copy(normal).multiplyScalar(2*this.dot(normal)))}}(),angleTo:function(v){var theta=this.dot(v)/(this.length()*v.length());return Math.acos(THREE.Math.clamp(theta,-1,1))},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz},setEulerFromRotationMatrix:function(m,order){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(q,order){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(m){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(m)},getScaleFromMatrix:function(m){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(m)},getColumnFromMatrix:function(index,matrix){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(index,matrix)},setFromMatrixPosition:function(m){return this.x=m.elements[12],this.y=m.elements[13],this.z=m.elements[14],this},setFromMatrixScale:function(m){var sx=this.set(m.elements[0],m.elements[1],m.elements[2]).length(),sy=this.set(m.elements[4],m.elements[5],m.elements[6]).length(),sz=this.set(m.elements[8],m.elements[9],m.elements[10]).length();return this.x=sx,this.y=sy,this.z=sz,this},setFromMatrixColumn:function(index,matrix){var offset=4*index,me=matrix.elements;return this.x=me[offset],this.y=me[offset+1],this.z=me[offset+2],this},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z},fromArray:function(array,offset){return void 0===offset&&(offset=0),this.x=array[offset],this.y=array[offset+1],this.z=array[offset+2],this},toArray:function(array,offset){return void 0===array&&(array=[]),void 0===offset&&(offset=0),array[offset]=this.x,array[offset+1]=this.y,array[offset+2]=this.z,array},fromAttribute:function(attribute,index,offset){return void 0===offset&&(offset=0),index=index*attribute.itemSize+offset,this.x=attribute.array[index],this.y=attribute.array[index+1],this.z=attribute.array[index+2],this},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}},THREE.Euler=function(x,y,z,order){this._x=x||0,this._y=y||0,this._z=z||0,this._order=order||THREE.Euler.DefaultOrder},THREE.Euler.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],THREE.Euler.DefaultOrder="XYZ",THREE.Euler.prototype={constructor:THREE.Euler,_x:0,_y:0,_z:0,_order:THREE.Euler.DefaultOrder,get x(){return this._x},set x(value){this._x=value,this.onChangeCallback()},get y(){return this._y},set y(value){this._y=value,this.onChangeCallback()},get z(){return this._z},set z(value){this._z=value,this.onChangeCallback()},get order(){return this._order},set order(value){this._order=value,this.onChangeCallback()},set:function(x,y,z,order){return this._x=x,this._y=y,this._z=z,this._order=order||this._order,this.onChangeCallback(),this},copy:function(euler){return this._x=euler._x,this._y=euler._y,this._z=euler._z,this._order=euler._order,this.onChangeCallback(),this},setFromRotationMatrix:function(m,order,update){var clamp=THREE.Math.clamp,te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10];return order=order||this._order,"XYZ"===order?(this._y=Math.asin(clamp(m13,-1,1)),Math.abs(m13)<.99999?(this._x=Math.atan2(-m23,m33),this._z=Math.atan2(-m12,m11)):(this._x=Math.atan2(m32,m22),this._z=0)):"YXZ"===order?(this._x=Math.asin(-clamp(m23,-1,1)),Math.abs(m23)<.99999?(this._y=Math.atan2(m13,m33),this._z=Math.atan2(m21,m22)):(this._y=Math.atan2(-m31,m11),this._z=0)):"ZXY"===order?(this._x=Math.asin(clamp(m32,-1,1)),Math.abs(m32)<.99999?(this._y=Math.atan2(-m31,m33),this._z=Math.atan2(-m12,m22)):(this._y=0,this._z=Math.atan2(m21,m11))):"ZYX"===order?(this._y=Math.asin(-clamp(m31,-1,1)),Math.abs(m31)<.99999?(this._x=Math.atan2(m32,m33),this._z=Math.atan2(m21,m11)):(this._x=0,this._z=Math.atan2(-m12,m22))):"YZX"===order?(this._z=Math.asin(clamp(m21,-1,1)),Math.abs(m21)<.99999?(this._x=Math.atan2(-m23,m22),this._y=Math.atan2(-m31,m11)):(this._x=0,this._y=Math.atan2(m13,m33))):"XZY"===order?(this._z=Math.asin(-clamp(m12,-1,1)),Math.abs(m12)<.99999?(this._x=Math.atan2(m32,m22),this._y=Math.atan2(m13,m11)):(this._x=Math.atan2(-m23,m33),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+order),this._order=order,update!==!1&&this.onChangeCallback(),this},setFromQuaternion:function(){var matrix;return function(q,order,update){return void 0===matrix&&(matrix=new THREE.Matrix4),matrix.makeRotationFromQuaternion(q),this.setFromRotationMatrix(matrix,order,update),this}}(),setFromVector3:function(v,order){return this.set(v.x,v.y,v.z,order||this._order)},reorder:function(){var q=new THREE.Quaternion;return function(newOrder){q.setFromEuler(this),this.setFromQuaternion(q,newOrder)}}(),equals:function(euler){return euler._x===this._x&&euler._y===this._y&&euler._z===this._z&&euler._order===this._order},fromArray:function(array){return this._x=array[0],this._y=array[1],this._z=array[2],void 0!==array[3]&&(this._order=array[3]),this.onChangeCallback(),this},toArray:function(){return[this._x,this._y,this._z,this._order]},toVector3:function(optionalResult){return optionalResult?optionalResult.set(this._x,this._y,this._z):new THREE.Vector3(this._x,this._y,this._z)},onChange:function(callback){return this.onChangeCallback=callback,this},onChangeCallback:function(){},clone:function(){return new THREE.Euler(this._x,this._y,this._z,this._order)}},THREE.Math={generateUUID:function(){var r,chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),uuid=new Array(36),rnd=0;return function(){for(var i=0;36>i;i++)8==i||13==i||18==i||23==i?uuid[i]="-":14==i?uuid[i]="4":(2>=rnd&&(rnd=33554432+16777216*Math.random()|0),r=15&rnd,rnd>>=4,uuid[i]=chars[19==i?3&r|8:r]);return uuid.join("")}}(),clamp:function(x,a,b){return a>x?a:x>b?b:x},clampBottom:function(x,a){return a>x?a:x},mapLinear:function(x,a1,a2,b1,b2){return b1+(x-a1)*(b2-b1)/(a2-a1)},smoothstep:function(x,min,max){return min>=x?0:x>=max?1:(x=(x-min)/(max-min),x*x*(3-2*x))},smootherstep:function(x,min,max){return min>=x?0:x>=max?1:(x=(x-min)/(max-min),x*x*x*(x*(6*x-15)+10))},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(low,high){return Math.floor(this.randFloat(low,high))},randFloat:function(low,high){return low+Math.random()*(high-low)},randFloatSpread:function(range){return range*(.5-Math.random())},degToRad:function(){var degreeToRadiansFactor=Math.PI/180;return function(degrees){return degrees*degreeToRadiansFactor}}(),radToDeg:function(){var radianToDegreesFactor=180/Math.PI;return function(radians){return radians*radianToDegreesFactor}}(),isPowerOfTwo:function(value){return 0===(value&value-1)&&0!==value},nextPowerOfTwo:function(value){return value--,value|=value>>1,value|=value>>2,value|=value>>4,value|=value>>8,value|=value>>16,value++,value}}),module.exports=THREE},{}],10:[function(_dereq_,module,exports){function TouchPanner(){window.addEventListener("touchstart",this.onTouchStart_.bind(this)),window.addEventListener("touchmove",this.onTouchMove_.bind(this)),window.addEventListener("touchend",this.onTouchEnd_.bind(this)),this.isTouching=!1,this.rotateStart=new THREE.Vector2,this.rotateEnd=new THREE.Vector2,this.rotateDelta=new THREE.Vector2,this.theta=0,this.orientation=new THREE.Quaternion}var THREE=_dereq_("./three-math.js"),Util=_dereq_("./util.js"),ROTATE_SPEED=.5;TouchPanner.prototype.getOrientation=function(){return this.orientation.setFromEuler(new THREE.Euler(0,0,this.theta)),this.orientation},TouchPanner.prototype.resetSensor=function(){this.theta=0},TouchPanner.prototype.onTouchStart_=function(e){1==e.touches.length&&(this.rotateStart.set(e.touches[0].pageX,e.touches[0].pageY),this.isTouching=!0)},TouchPanner.prototype.onTouchMove_=function(e){if(this.isTouching){this.rotateEnd.set(e.touches[0].pageX,e.touches[0].pageY),this.rotateDelta.subVectors(this.rotateEnd,this.rotateStart),this.rotateStart.copy(this.rotateEnd),Util.isIOS()&&(this.rotateDelta.x*=-1);var element=document.body;this.theta+=2*Math.PI*this.rotateDelta.x/element.clientWidth*ROTATE_SPEED}},TouchPanner.prototype.onTouchEnd_=function(e){this.isTouching=!1},module.exports=TouchPanner},{"./three-math.js":9,"./util.js":11}],11:[function(_dereq_,module,exports){var Util=window.Util||{};Util.MIN_TIMESTEP=.001,Util.MAX_TIMESTEP=1,Util.clamp=function(value,min,max){return Math.min(Math.max(min,value),max)},Util.isIOS=function(){return/iPad|iPhone|iPod/.test(navigator.platform)},Util.isFirefoxAndroid=function(){return-1!==navigator.userAgent.indexOf("Firefox")&&-1!==navigator.userAgent.indexOf("Android")},Util.isTimestampDeltaValid=function(timestampDeltaS){return isNaN(timestampDeltaS)?!1:timestampDeltaS<=Util.MIN_TIMESTEP?!1:!(timestampDeltaS>Util.MAX_TIMESTEP)},module.exports=Util},{}],12:[function(_dereq_,module,exports){function WebVRPolyfill(){this.devices=[],this.isWebVRAvailable()||this.enablePolyfill()}var CardboardHMDVRDevice=_dereq_("./cardboard-hmd-vr-device.js"),FusionPositionSensorVRDevice=_dereq_("./fusion-position-sensor-vr-device.js"),MouseKeyboardPositionSensorVRDevice=_dereq_("./mouse-keyboard-position-sensor-vr-device.js"),HMDVRDevice=_dereq_("./base.js").HMDVRDevice,PositionSensorVRDevice=_dereq_("./base.js").PositionSensorVRDevice; +WebVRPolyfill.prototype.isWebVRAvailable=function(){return"getVRDevices"in navigator||"mozGetVRDevices"in navigator},WebVRPolyfill.prototype.enablePolyfill=function(){this.isCardboardCompatible()&&this.devices.push(new CardboardHMDVRDevice),this.isMobile()?this.devices.push(new FusionPositionSensorVRDevice):WebVRConfig.MOUSE_KEYBOARD_CONTROLS_DISABLED||this.devices.push(new MouseKeyboardPositionSensorVRDevice),navigator.getVRDevices=this.getVRDevices.bind(this),window.HMDVRDevice=HMDVRDevice,window.PositionSensorVRDevice=PositionSensorVRDevice},WebVRPolyfill.prototype.getVRDevices=function(){var devices=this.devices;return new Promise(function(resolve,reject){try{resolve(devices)}catch(e){reject(e)}})},WebVRPolyfill.prototype.isMobile=function(){return/Android/i.test(navigator.userAgent)||/iPhone|iPad|iPod/i.test(navigator.userAgent)},WebVRPolyfill.prototype.isCardboardCompatible=function(){return this.isMobile()||WebVRConfig.FORCE_ENABLE_VR},module.exports=WebVRPolyfill},{"./base.js":1,"./cardboard-hmd-vr-device.js":2,"./fusion-position-sensor-vr-device.js":4,"./mouse-keyboard-position-sensor-vr-device.js":6}]},{},[5])},{}],8:[function(_dereq_,module,exports){function DeviceMotionReceiver(){window.addEventListener("message",this.onMessage_.bind(this),!1)}DeviceMotionReceiver.prototype.onMessage_=function(event){var message=event.data;return"DeviceMotion"!==message.type?void console.warn("Got unknown message of type %s from %s",message.type,message.origin):(console.log("onMessage_",event),void this.synthesizeDeviceMotionEvent_(message.deviceMotionEvent))},DeviceMotionReceiver.prototype.synthesizeDeviceMotionEvent_=function(eventData){var type="devicemotion-iframe",canBubble=!1,cancelable=!1,dme=document.createEvent("DeviceMotionEvent");dme.initDeviceMotionEvent(type,canBubble,cancelable,eventData.acceleration,eventData.accelerationIncludingGravity,eventData.rotationRate,eventData.interval),window.dispatchEvent(dme)},module.exports=DeviceMotionReceiver},{}],9:[function(_dereq_,module,exports){function Emitter(){this.initEmitter()}Emitter.prototype.initEmitter=function(){this.callbacks={}},Emitter.prototype.emit=function(eventName){var callbacks=this.callbacks[eventName];if(!callbacks)return void console.log("No valid callback specified.");var args=[].slice.call(arguments);args.shift();for(var i=0;ij;j++)uvs[i][j].x*=p.scaleX,uvs[i][j].x+=p.offsetX,uvs[i][j].y*=p.scaleY,uvs[i][j].y+=p.offsetY;var material=new THREE.MeshBasicMaterial({map:texture});this.distorter.setMap(texture);var out=new THREE.Mesh(geometry,material);return out.renderOrder=-1,out},PhotosphereRenderer.prototype.createScene_=function(opt_params){var scene=new THREE.Scene;scene.add(new THREE.PointLight(16777215));var photoGroup=new THREE.Object3D;return photoGroup.name="photo",scene.add(photoGroup),scene},PhotosphereRenderer.prototype.updateMaterial_=function(material_FOO){for(var i=0;i1)for(var i=1;i7z_c`x5_kEvppV$4mZztm?bD%T&+Ird`Iyw+Y z7x)34`~g{My+JsFKt@I&aS#Z^1Uf}`7DNy9=zt$k7y`ubUmpaz3j76u=rid4&(n-k z|L;>KPzL?~>HiyevI$bU_uSRX)$_Tl+eO)%QXnNwJtKyHZv)zY{VV@<&x{C0OrSwu z8CCr>O6ch>gHCbM(R0$Bw1J?&iWuqsYyV9HKIl%-GccY8GcmKU z0t2ef086K*KgB@L$oTJT=mLP}AO=pxvzMfApFU^u1bo?@OC~5LlSx>!{0Fz`;9n8h zrylQ^SRrH#exSYI#qLQ-8ox57vI=XuLX66=__pKgS+dDjSbb5|(_Vjw~ z?eoUhFZg{(XxN93;jwY?35iLclT)&?b8_>r`M83w6_r)hHMMp1Ev;?s9i3g>JwwAI zqhr6uCno>Q6BZVimRDBSc6RsniKK%=^3gxJ0Db;1v4GG2CE5Q+E>1wMQw$9B4B&rq z(Vg=7Cpaeq<0a|SXK$N;pSYj9EEB}Ur5Tf1{)1Uq*7Ps;Q;$KG^CEJ8uI&61?LW!> z?*x1I|4Xv}5$ylS^&4~tbn3rGe+sY?Jw0G42B0y58UHmf6ZpTz^uHU+e~tBDWB;Fa z0=$F{cn2`~H1NyL3}*hHXaCoolWAaE2A)iU*y!ni%|y=$f`JZw9Mrv$dC^6%X)65i zmoPOyEYqHbjBlDmOx3L0))#4Rp(FwSnSRMYt~<=8DWLcy~9Cb4As~P zzV!P9wN2Lp>j$n7tdIb@XYf)n~s+O{r!(9vj6u`W5RVMj6!uuyrA!&!rp~vo6VIhDm#i(iScnAb{=jVb)DAouyyI& zQ6%X61_Sf$-<*Hlgs6cvU)!5g=emE@l~MG!1|~tWs0)){QMC7DAG*Agv-ji#qy)Tu zfi~5e2bmMon3|c5#uBUVkBGbuwSv1Jp&~`UK%TK?k9`qeRVNO7ggaT@EJ!fCs(Id41iiZ7Lu}03Z z;Dxl8G!)g#ckBeTz_+Y1j#&tYSL;ki0-Czcy5W`XC714noGm^4r6PImxQzy*`XRo- zNlhvm6*sew;{FXl&Zdc`K{F`p$%-G>MrNymr)XY{RhJvH`m^!yEm~#cThuhwCF#PQ zI#`mHDN1+T{c{f)*jmF2rRubpj`qTUZ5jeL9~oVAxkNih-srBTu3 zNj?D`t(l0y+F;fw>j36AcOwTcs_hxisKXb5y;THNt)}q771aeS0-i%xd?_ucPii z>T^~0b3i^#>a(>Sv9yGarP2=)KeCSN)Zvyyaa6IlBkOU1xgA4jB*d(!y-rQEKTp!z z_SHVoWSXaih0eo~0&EQ|(zYf>sQ+40FKl6m8BUfPJ|~nz^TIf(d!Y1@lTUu0g)35) zqWd;bD!1uTzF~h(Kx0^HDu$p;fwiC!QkANad&s6V(Gg2zK=H9UU= zPcy>O`DCN^P}&1GFcH59upF zWwc(}(y98GZd)#w1@GJ`zJ#S4fwpm)<;L4bKzo5>XPHwUqpd+9!4eS@+j~fh3eszn zo|qHRDL{imAF|bVh%l-%cQ>gp^MlPWEaBqy0GCXI=f5M)ZP%i9mFUzxUN)Nhcudcd=2JpC_Q=M|=;Or{*wusFqZ(MVMQF-wEj6H4ewI4@>G>^Y$RmrCgBUP;+s$79gc;Z z7N-tOj!bzC-m ztuF{^X^tNm9@ecwZ9$sDE4JbqRtJZI>UD6w7rrB~=&hdGr4rq7HhzKNDT6W93}CGHkHc87dFkDpx) zlPKlBfhxW&Ulk4^svVy}70WL;U7atPq&4cKe>jcY<3mMfHy~e6ep0esV!Cy3DsDr8 z%4_rY9;^c+_Nk~}qzx7(mu}!a-{79t*6NY@WFNnaJDnPqa~IXjE|B#)$1U9ey;!4F!oL41`-MgOBupF1_Bruwi0euG%p6nE$OQHc(jl!tN<=D0^s%uZY|;FPadf>mI% zktnJ&T$s9z|F>0tk;In+b%swsrSO-67Jjvq{Dre^Kg*lH_^LWlXj}p5DEPn$D8xH5 z*E4ebC>5ojEXT_qeIMND{QdLTRk(v&lT$5ih0=61vRyId2iZHkkE~~j64L!~0(vu~ z80G+5>rp%|rOA2RMNVROQ^9dcH0V&;LYGPjjAfHwGmV4Cp2ldTA|>DoZ;PR0yVH98bdnHqm4dS|W*tD<{}XlsJT}o4 zkb1PEN3vf(`epfILP+e2^+wRe}$3d2fw`8Gg5F*asDFq zwEyjcCbF~bSLp8Ox9f4r%R7B~B;DpU7~kW*;C652?eZhcSkQCTl-Xl7-}$&MbRBkM zys@%Z^6NFIKY1u1!Jm^nHW3QjMw(|$!wrW>Pl$OD=MWfpf6_+Sfcv)13CQtwx7;w7 zIX+(K zs>|yqVf8h;SXLL$iB3S0@*?y43i^$v4aiv1M)PYeN}nq=@!WwA@(u;TH;8)wpF#{K z%8o`FK0}=Z2T?HEcgg6cY1^^t#;(>w%hc+b^6ato%aa*3VPMeFgcz(c4YCDJb_2qg!c%Xm_ z3Q^pUk<8P;P(S1h`Xu-Jf{!tWn?kqtp$C0l>n`h;CFjBWg@{+5h8!pYs1OOOb6@;Z zQPJPuoPZipMq;wmZCi8=^||Ob=B}4^Dslv^ zu&d66Id=NzT|Yg5=zcx{{g$P1uf-g;wn-CuzDERH{6rDAC)i%#?8vwU*h;B$*SfE# zMz{3)2`C0zo=d@R*)I9&j614dL>-e5$aY14pA%4%<98X`^M@sO_MGD&b_KB5F^Bru z55PJeG(V8h_1}=*P zFigg_EHo`wKFbvs_s&Ma^Vx-3Kn?u%`_KeeL25+s8spvGR-9{_*`=Hs$D6_=3NHBr zhdbG_f^!Npg3|x^E%P80rEzbOpm@z1BQD|QExp6utzvl7K$p~r_7!M9-gF>~*I;?SZ~wsjRP0lF7E?1+o&}T{##rgBZxYHUU0{b=S zaA+Cr(TFpvkW=g3?_6M)>(aqecO|aJs?5iEP*IXQ*^@f80j7Cljxniz09-fqU8gQm zLY^hU$xAR#wbAqsFrX2fMeL7zhb5s8X;yi@<^D7b;lTu~ zHR#av)y3U$N>fKtO_;~bBO9dUbKkP4CA5sBsdHeg^iL_u38*C=?mFy8bHo5cgih7$ zeqBwJQc+wt+MC~Z9VbKj`mqUpmzYbJap8?@*u!<@!1dcMqday<+Gl%KWxcG zy5ur+n$meV!tT$r0$yN;*L)Z|UFvkepSf`y2ArI7)6?a!8KASCOdEVJa27^q%ok6e z;H+QipG4IE^o9n8f9>6eoPYwt*(^^$)2_#Bb(w{X%3NU&Jfx$pkqYZz_q|7v;JcQb z>xX3kx_NHC4?6&El=;F$m6QgD^3&+eYn`U>5et9agDV3`_PDFkzuYLYR7CQpihp3L z^x>B^=b3kzv>{ds>W~D>6`B<6D2rQ(!b_v)MgMZ8zYu;0Uyz7Wso|ME0in&omh?FL z!y(e&Emp8u`BXsG&1Psm^pEkeDGDzS3vm}K6e`5D4ga=QS_a-VCfG^TpXQvT7HH&& zP;j%(Vc!ts`=?&J`F6pg#C{eA4`BMyFX8@)WmUi6&0DlV*HoTgf7`Fc4n(!?mTQrF|-?dn79tzH^dk)Y7PeA%i5xasYPW0--%WFSSi#4mJk&kT9 z3Yh9J%_|{=0c!!$okPkMbUlt!FjR-2v!NibR~^D!LJc zIUM>l7{!BWLA!7nmhJgV2)dW}pK(m^42_t}k zZ;$e-qKDA0K3e&v!Q$vvYiY`~_$H^vU9-3n#OrscPtZv4eOK}d;=1ORX)C;ZDB#PW z&8}RNBW%hQpbj|ADP+ryGe%#O{yV5e>MXaZ9e2CQR%6`sj#wj9ZKj+wF{ag6YshN?D6!k)AS!ASqJrLg{ z=eSfqjxu@{7u*jY3KWP^G1>G3kIo~g)wh3KwVYx7`;Ar@Qi^5^Fcg4!l`73mt?549u5^y;xf8W>C-6*s*!k0430cBjXuzwG?` zOY>!heM`*#s(!TzK+XV{;0j5yHsBR&Ccdafqp4V*ZA+=o>*|nz104pwE7s(Adjuu< zHxDNZEB>)Br8!04k2-^(Jgf0%UFfOo-jrQ(RM@}r`6JK}Ta zj{Vdf`??H+kv>0Bk_P3C@ZpzJ~Ob>3-cfR_{d;Ft~fH+H< zgTz5RO8k8#J$gBq#?ABQK^b_zK-0ZR^8}R4&k=$Mil(-v6xXY{xgQQE-uljdU-6EH zaeH%X)72!uxDG8-1pJn}5y$jx5t=zU>9)T*JNr-c=X3hJx905s7CiRhePKd+zm4v| z$cRqJnq1*oC!2ri#8C>xZn{ZHr?}O=-LvSAn7-hjf)n>P4Okn}{jPA1DF6N@5Ofqd z+g2*b7|Tu;8}ar8t6W=(*eL_T{ahKWheYbJ0bQ&8D%>U(EW$TvB(U2mo2_RL^NIny zWr&*o?Ria@O0z+(x*yfK#SnX=;cubQ!|s9D@v#{Lhq|k|pmf9cNbban{KxG26$%=b zln~SMFYgeub=cebco4b=F)R(Z+uG7YpOrDdf@29;_o zK$cVbj}4=w9+j{5T}+TM1`{wlS=|Yn4%Ko(KHy6=5Mw2pIe!^}hb5pBfL1uUPtg`Z zM^Op97%*7iV3UHY%`6xmuOBv4o~b=T5pjhQ=Wiqc;WW2luX$9M;I6Y}<5VUKWRZdc z%OxYM^^Aqr0>Ipka-ICzTV&Xr*0bX7hXi^-)q$I=af!<-;vu{~3M7LHI&U-yZrh*q zGeL*mwdn*@P#%kDCO>H6fZ?$GpAu-7VRH|1;v|z_^#u$wG>pV*l_S(2$7d`?N`jA7<40!Qeh-*Bg8vWbF6j(G92ydekQW>o5j<#_}%99g}2j+ zEY6SGRhUb?e)_+GU)-XvWk3=0Kh8z^Jk?YQSb`1JBpJOA%)M8(S|dPnl2;rb3~f;$ z04ztbWnPq1NUV=xcj&d8MZff3J^AN|%%h+~=uR>BS2gjQNGvqh=3U3_w81%4h2GEd zqUYap>~phPnqjcNz)HjuHnLus`DhRab8~7ter(1Wskm%+i$lt}FDRPJeO1P9ESc3- z(7*t2HFkM+obwm;&FYtN^-~#USc$U<2x)T+-W@xmReU;QN~K=ozLqib5Rg=M5wDx-H6 zbDil0K{T0*Sosv?cT1?1f)JCtUmnuWS@Zzk%LBw?ji>}=uiUl3nC(D-{sWbpVi{hq zyusNITT$oSe=`KZlgBkm&u{sztuh%a>}_eOt$ZUmqUN-}OB}1x$26>Yn&w8+3olZ{ zeUn|-1(TOh;|yq`3;JG@SNLB0eYH~m&p#zIf4T_W7Y*KI`VoL#N3WXW-@hCnLWlrX6DL*= zIS5~sHaP)3oAU@J50hdim*8|^-^q}xC~!90CdmJ+c=nAdc$ttEu7{v?UWo zcTeGqkgp+?C$$zw)g-y%K_h;bWFa1>!!H2g^R%u3#_*^lO zms7L)r7tfF*=X&nC4Z9&bf{T?9FCy=qVJ~0k>ei6A9+UK=IP96w{SU2*8=HCs(yxY zG~Mte4{$aTf&e0$OOW+Bc?y~d{qv~7Mqg=MBP;(Wn{O*4`(`+D@-Dzz3~so)=H|IY z!JxZht2u2*G87FU>-xk<>CjeGJ$R4%!MFEH<0yLgWQF9$k=RTJ^N{_9nb0h)9`@BF z^upe>4aNn%m30o#Y@S^6zNSVRO8@bY<{K5kh&x$PyO0b!=QsPRu7v32zW{=&`2L`r zuR7oWy5QV};CcBBmQRaUZk!K2kKRq*&Th*-Fa;uQ=&D82R}s-L@P2WQOow-o>UT2s ztFf|GS->Y#QsnC!f5hbf(i}CP=XeZXBVhqEbmW}=0)T82YgYcc-mcl8LLoyd-VZU` z0C~feX1u5aW<@}Iv+4~+9D3b}r_<%ex&DZF9tF49Mua~bmR%BKi%PjTL$excB)2cNuo@Q{puq9VGvc^6G87`2gM&* z?2G$0A1!0X!lp-gmS=%{Rd`KgRCRQ^ZrpRxs|ehvBn7u~)!z?k0NIjWyl?X@nq0oPv|M zbEoV=o!Z6DI_MwxM5V{aLny7vMbmk~ABB?_gx1x3o-Sk~ug(!fbbn zFGqK_q*6VcFYNwGh~%MZrlo`_?7m1d$IDEIGDES4_eHOk!9i!$JDe+= zeR+8(Vxx?~pyNlO=Mub))#JmBCXe;#$NnfB#^NCZh*jkh^@% zq-RZiI%=n?RtFrj!KnHA*n}diL7+(BzbzuoIf+-%ims(|E-6-9UHg|3<*J-eCm`k< zUw5itY$Gq{{p~xvF?*X2RpO%^BB;&{zW(KlgektT$fP^j$0`aVTPL8JKc2KQ8jMzO zXP(Kd%(eGEM z&~0)Yc`$(<{VS!90QIz*vws;yIDW;b%#eC)p51osv~19R325r&+-az>m|FjFltxzW zeC|~393kMc&yD#@sS*F>yNpjj@86@&o`5htwU^1u7op9=ckAYA7GP8hN$#6VpP1@} z8);K_4$P5W!B$UoS;N?;^(5iKEhWXA_TJCk%%>D41^Rs7}ymHm8-`P*lo zI1lfik^KC&Xb#Df0QdLo3j@|Lo&=Rqx-)1%UbONQV7R z8@#U4ZNR|Xi?s;0a~hyY(u7?gBWE?L@Z`>hv#9Al(a$z@ls7pA-9%``y9vQFqYmzv zv8!U-{Gm*wAJ{D=vNyWtOR0!tVT(=H35b;TgLWN)Wd^0xx!7dAE@{euou`8=iwCI9jQ zPD!i>=e$*yGWYr^(K=-!DC??^{-4c%;)-v+U~R?HgC9IxeJ{;(WE??VP>PXxK7)rd!()F;`}%N;aK5U%1Zp zbIo#O(&k;0f*$OlX+SA^EDsu2l(i9jQwD;S`!bF0af5t^y=q+}`K2t8Z*S?mLbU9` zyg1Q*J&f+Du>mV;M<&FN=ZMcq@{xNn9b01adr;qx6c^}q>_Riw-ja}({NuZ7YV4RA zwzoOUvvN(7lIvtk-YW?BXWb>V>t!U4BkzFpL6}YVXh={m+D=G)olVT1MlZMY5E>sx z``a!w5 zil0Lr5#!2;0<_8o_lP-YuF#C;8>^e4+0Gt{OnStBH6e<}h6K?F|D~@x=msD~axZ6R zWQa5jDI9*pE?uCsXpEY>I25V>VoMp8`z-$1LU8y!$V2ySo$AkNEZ*ZIwBdx%3zyNG zVqG2ZKkd&pE;@)k+*i*1S^CsSXe_`=h3iPz;MmxKc2)TVq*3_?hmUyYB3b$vG8V_- zKSZj46q;=y(u_UVb>(@P7e7$eVLUwUN5e{ZP>kMalAD!Z04J72ru*}eVkF@#D-_X6 zV;H?%17ZTF*zqnlVGhkmv0GO(`NzMx=HO+dDMm`R22{e~&VxTz)EUejDuU_B@V=bC z9@k2%3m?=q+C9#IG{ID~3xX!n~t z%ER3)(_D`B*-hTtTZq}0pCbZCb-D4P`#43dh%+dbx4YHzUYV4f)_bWwO1UcUHwV$n z7ESI^#h8{9{dDsbeUB|geZfzdR~VpxLveEm$V@_h9a*RsuieUg{ZZdJ8{V+s|BO|xQ{^3ze4=o z@7|55`R9PFqcc`(!u??a%K2aQXa|3c#|HGiT5v{5$r3X;xC~z9PbZh zH9keb&%TB#Cm@xWi?;I@oo2p#<1j|4Xg@=0qtec6ehd2s@+g8-Ygx9QCcmLLTQCG% zlR2f-g>%255V|4q_5?JPyvP<=hg0_8_QfW$D8%54RWB|*kI=r5NZ8FNi0ME{)3|Rg z3NKMseNGE-9;TWu3MUgKxbY8%HtkeLniL7EV{x8BIT0pL_BidN7ijT$H?rLp%#ugg zPU+z|3G~ZsTFmTqm&D()IG??*-X~!t88E=ib+8n;;O7|G%%KE0 z-bhut&W9%Xl>#C!>;WF%z$p`P=S)|DnXDJa^PU5B3Z04L3W{~P^6HU$ z%|-J(Z&U+iE#dAnaT)o99|F*!Jj;Xmujd_&Ibg;5HR5j`t9x1&@bm<)yu>{jAWWJ6 zlnDMMA54n<7MD^kNCJb4UHI~s)A=4nwhBX&Wih$ed?9A&Wvg}Xx#eQrn!q{1vt5aH(N;pJH*0eZJF#FKQ~3@7UUdY41~nmrFfEA zN>JX5g;Q1b(aREj^6|tDowwnM4_^j^FU>8_psNUrgv&Wheg&nACOkd@o9nB3Q==Z< z{L85k>4>HE^w0TxQwo~so^0{f2=`%i=bM9A5ndI1@NUHNOs-3Kj{P(G*_mv&H6%&( zcz6j~@#z`C4Z=XLf78vqnIax#8&R_)uHo4!=Ls(Vn7iD#rA!gCUajY(N~nK!YTC~e z>~;TfG~{8I--*kw5f+s3-_uFAI-p-q$w=<#IE4jAon|zRPP>+MSl2>GNpOfyrz5S1 z2gV&5JDbNt{;Y0W<~$J(h{@wEkBd0Ac%R&P=fO^|)$7hxOOx&m#+SUQaoB0TQ>Mth zb7oZRb0Bp}-()Oq@zj@IXudj9+fzSQPHQSS-T8@^bpN*BPc|*XSOpdPRqGB%nVbf` zkHS(sc!C)rq6R!=H|FIT)1hb)?BU)Lv>q!yJg^)Oz5CFL+{pknu2KqlxA&mw`78bm zjfCs3HV@GATGr3|%@RW?2cAC(EKrq>wUF+I4u_$M6-Pa0V0)IZaco#c3iUxAhZ49u5sIcb}5?x0^B zE>>^Py8xu5*Uc6O_+32JT2r6Y`w?m8nSx2+Qz`I$uo&}_G=GSZ^#mtZA z(~A^J<{$+4%NtyOFs1q{wBGRBKI`N5RS)4JUXRn9eIrNtQ+xex5~5lCfW0tQD6C_l zEDmE?*@J=vJk2`GwPlpH4bmc?{P8@ke&bgE6!KI_UOIvPxyE6Ki^U_z&M9%Yl>PAV zSX@jNmcjArXQi27AgCu=c2UKnRcRSm@7snG=wA7(<-t(q#<`Xr!|*)9l+_ z|9fMDrMFHaJVi4$deK+Vtd%TI6U?f?`SP{Z4MF6VWj&9{jdHuY%jA^CI%~`b@r_BbAAVvR)V4{Bnv5+L=;HO$%hbiAocdVE@y9 z<~P~ijTZ)leMDTSJWPsyx81t}vDN9kEEMQz?lAPpPOy!Hhm9pEMkflUe%Nj0EQ9?q z=@vhK{3+-+cDJPF_)?ii@L%h^Nm+pq(|{cv75}huj3?+}iH12eP3m!dIq&L#Q+N|B ztaLy+P$0c&VGQwirld`l{!rR>C$H$)6_XdABz&)bKUEE@H&U9}?5VFtVkyo^B!z-x zkgWYItUp7ABlptvhs*Ul`h#06#TKMTKR4gxIQgS6Eg8oSPM2osM`B?uI0f{Z!oao@ z&{uc#;)7wt{gAF7&6|B3(?3QEDR~vszv)BbV>UcZ_{Xj0RD!l2Zq&bA69e#Yl!W^J zafW;4GBu^eQZeK~@%-zht!ZP!WJ*D=Ur0VL1H{86_5rjx74Vz)&+h7ctH`O z`lZ)e+CMty*$t@0XO`|Xtj5B`chNO7A}9r2jk^3_W@%R9%NSdL7=k(eus=?3uCLUU zk;d%p=i598sc29>a{TsrO;PK^6#P$0&H3zWaE#Bu>wNd}Z|-j=uN(?R9btJyf@oXL zocXuj_*xyGfwk1i;uuWTn$>-Xz}>;Jb`5*=-UJagX>p4T80`0AzA+!^>W00Q_v z{Nz>AqTml5Yh5>8o+-(k3W!u&H@R%zOPF#ZoAma43Z51$O%HUt1pozoc;#fs&yqc$ zy1nq7#>E=2bH#iNMKfdWY(Rl;^4k$g)I#4&QFC#1x*RiyZ=1{2zObHJlXJ%e`LYfb;J6-JR^|;n)Z!qi!NR4=!96>Udx6 z5(|XLE~k&CpNe|KsvGOkEL3J3E`UYH<18HCV3wVf)o)`r?^``Wg0f)zx=z!ar?%$(E4PH&&XLWu-J{!eYJU_b%N17g zD#1)FfQn4fgZF6nRLdJ0SaZkZ#NGNR5lS;H{)ZUUx0WJdb}VBDR}HJy()3!rbJiXP zROLMW8dK?TBomfAEdYc#dosj!+t}`w1!4D1fJ!U?s9lD@?!#qn_LMx*ORnA`%in;3%zZ9YM|zd z@BXs<#fppePjZ&}?1e}&)^Cnub;^F^kw0i#grnVU!1`adv)s4D?+)LGHkx5bw>p=c zeS7ZhOZjBN+Tf)ZO`iod(+f4xDs0eLze@lc<--#t(>Z0j{7l?ulC^{^pf1cNWVlU!ckqddEQ_m2v%iE%$@8jYa3_#EG;s0~J&=*yA7i_o#CXH)Ju zGsQfOHco8W8Y8Qm?(ag-WC}1$&*y5n{FoqUz0?JjIsBkkM#4kxYCRR(G9}(+j$7Hl$3R@!IqAVaY)oT~7>kLHjd3*@`-E|~@lD+?)L0L64z*&|KoO*6uM@rJi z!9+S=c}*Px1coVt+EXQ-E8^sE%g0QeHDvBbgh?rLXs&64Y=Vu;)8yTe&5P%bh970A zDa`5o%NGr-Uwrl6-}FV?D=UFxw$XfniVmB*n!5e-9;)8|u20PK$k4t{jajO@;ch}G zO?EX3!3G~;JGR5D-tUTNtUU^U7}tT)*A%QTGuaGx-DYmS2V+B4`Wo`P3mmbfn{%u#xD#U)bT8SS0x7~VAI{pUE zT=?3f<~b6#w3aK;4vmC$q^})^{s;sLl2d$5FNpG23@aCNos)`l@w(Mr6A1YQ)FE|z zS!gor2oP_{H;e1i76#;$Pkf0nWBxl(f}|n>rGFDO&1vn{oR~DNmJG!y7`c)4fU$hW_M! zs+@TFZI`Lpa9S&wQ%6E{QW$2(+Ppk&`mC8mF|u(h@+g0gx6^}`I7`tfJ(b>Um*@1% zl4_&0D(89l&lgh)yrZh**9`+TU$KHe8ZoI)A@kLfk`t9nZ62#yt_er@=& zUTtu}k4 zvOowX-?O3{AGTHXj0=y{`@P3D{=ZjO7QHE-8S=xKRc2d zFC4VzZ>Ft^8OxSPjo3+Xk&57WzQh-H_W@Z)wOs$okA59_n?4p9Dv+Xd{T!AyYc0^e z;aZ1!W2b~K^>cUVkouRT9et3Fvh$1>eoGl9WfHw#_~vk^dSi1o%u@+X^3gZlJKT-- zcHMv_ka7adr=tQo-Cq#?;@EQQtJNbtX}%`EF#Tzy4)aN4#PQQB!9Mkhjf0i;F)N;? zMVo;gz*Kwz=}=eRC7T0mZ-g;ap4KUa$!@=GA4oEiA+;=r zCXz=iicTKdg(;PFA{e2_X-vnObhWP*Lh_3hPCe59N|Cy;x4KQ&kvILU5W(3^gi zUpR~J-L>Oy80U~uI<@dNa!_~PmaDtbnE$C3?E{_Lq>+bDJaouF9r%j<@NSWvP1f*( z@3;FADw)LRQ@{LkmH2Pb@8w7AEN=y;WbTzMxEoK-(h8ij#Z1E`S<(5Ox5UsF*C4i! zi4UH1;*Lh)L4$E|9l{7~)+On)(msarU1D8Lh+ zk0&X~Hg3&p{$BYYO_g_y)>_7`@&(FHPYzMm2?hj)p^JF_+CqNie$VuTB9ouWK0Gr1 z<{1PEVwK0fUq?N}XrXf;R?4@lm>`sQ(;&ZHSPl7F&Gq*y&yo2Y-Ap1Z6tZf0xrV)& z;edDBCfDJKSZ3z^Lu2VfvmZ|)9F}MDI5EaX528c_%GW0=O_Ueq!n>EGn-~1O3-v>E z!Sa3*cD`nvydB`ZLYU(Uw{K_uDy5((BE`d6SXmfjma)=~O-$tP zZ2`;h-=NP-8fGg>#pmB2tFGC1a?d{G#+SnXVyWq#t&uG?m#e@c4up{ily&kAM@Jq3 zp`3mEE2_)gn44*1dCWo4p{x5mOQ{VtXO%m7U3Xmy45XtUeWahI*BDi?x+ClcGFeeX zDi#Y8tKe%c#m+@G+!9cIBNmuCIT;b6&6(`b&P|y1Sv&;I+<7?k6|wpI4W4xf*)s zlM=@|%38EmCfaUfmx*)5LX;Lp-&ct2<`7c7I@ce0O#Z&q#lpd%O5=X2%CjJTONf@> zTp&ZkHw@`qPK;>R*29;&I*%Bs=B@mcTG)#SdZamCvXLOs$w1c+V;PF-jpt8NR`WDn z&(7ktU-O7T1R*`bQtf#<7p*@zd`K2yd)+|?i}Yf(+pGy)*awG~$-R%?7DfnRk1Ssm zA1GSMHFA0G{I=V^&XPX0JieT3V`G;cBDx0rSKudYWuE0d+9UC8l2reE*zZ$u`B5oW zPA*nIqNG}%^MbtSQ&Lo|I+!1BEi*XQU)wLg;2C!~pF`_6*-a2ZkL4Y$cpYCD4Bir0FBJIbNBJhybykL;G}ELWceO5*4QsF$R;X z3VTFete5TA>Rf20q#%l~f)v>dQZfH?S(xXbL;N<^MTftTD$%Fer;nnwt%yA8Ydu~I z_A6qRY6L-b=U(@icTD*RKJ70O)GZEolS+pjd==uu?!?1@+l4N#n%+b^zj~fuk@}n` z!fq+!SS`>)Ccqsa&`N6WhNZGZ&KtK1jl^%5wJNxO)w;Cd`JhxFq!n7})UiL|YJ#CbMn ztVSt0%_8VYZGej9+qhG0JcsKktFN*xcqGD?^EjBzd0_pOQF+Ej+`TJIU32?N^9A1q zPpjQTX2sri^Q?97v%K4VbBoh`D?q&Hreh?hoK9TCsGh?;-=+NRc>3tmFnsYnm+_Gp zRUxql%p(es{ewXvITz-jU!G_X!dqM#d_CytqLSr}4L->3Da~i*nC2e|!bpL5RrgIp z#d2lQ=altNn0vZp?P;`r-s@7y?3m4W&dL`wryXn5nH@j;HHSXdlBf!mt-vBBdPR1) z`}JQxUe0~iH_w{Kc;-)lCxAn9{w#@x8+eX5#u+heGkUINjIr-qn?)4bkru-Dl3y3r z2z0@b{|`s!;?Ly!|M6)uNu(%h4mD>g=QhkCIp=K72~%=Nwjn0xQ)%XWZ03BJGdYG( zF=yqN^D^gS&N<}s+xPb$?6JpvU-xyr-mmBLf|ZJuy?FGidzm!Ikysv=C&|8;3umBi zgoZySw^|LxTRYlBTJ1U4zFnZb1EU6;{O;vw|Mi=4o+Py#xX|WRw#>xfZNuXqJh{8= z6^c()LfZuk&xgELXr)@jEumzopSca_vadLR6tvVYh;jP6S1Icz*CCoJROga-lDLuT zw7McC`qa`>Y;C_j{^8TR?y8(8^CcX?(h>A;+Ls!~8sggcB6xyEUdseW+@{BeaT6g|P|b5;R=c%2pV+{qbZldbYv za42-W0U@=?8cpOG59ouqrHy1F6(xC^gU{J_q=JABDPvD&FL3MRz(98}#4sk;@8skG z&5C0VR6)#ZzBnQ|-|V4L1k~;N52UQJgS(#7qc^&m|%*Zcu ziqSj<>tl?f^4BH~XaK+-n-7RM`tkdx0ZZY%phu#F!t4$ zvx?_i_CJvv&&|K{5e-k?mf>hM&XZ#QrWMzJ8G7zPQ;&m!E-70X-TDu}d4@_bsvV*R zDb)P}WCGo(1a)VP=EnwkcHMv1%ZT^Ano>V6X3*tGJH754j=VB(rsRH+ND}^9swmhM^0;9|dnXa}7v* zRN0OyT#ST)17r>;>?XmQ%4xRWx)Qs5dT`#b?xOy7E`;Ig;GR>SnR_X>>{L`b;oH^LmldSl&z_zVU?*3!!46eQU=c?@9jtz|M|9WKsnTpO_c z!n@WLF!~dR>LAQ6;i{h`b-({frr=d6+HW8sa$hkqK+W70Xb5Qfu#_VuoNHVE zx|`dg2b>hu)$!`$bpZq0zeOxz9bf*C3;EJl!-A`)Motq9tiwAQL4OJ|A~$jdv{u|$ zM*2QP2_Ka(G4T!caorMuK zO?MTu_U*Qc$9+iX)44uVKMI-i9u3v#_Y$#NJ&0NI9aXTf?`^PKpJ{vhl=m$)6b zO8faHBEE<2YtiAV!Mc`m^{I5!WaJVsuAO`=lh4V$PA-^^cP;f-n%?1CpBgJs`pEcf z<}6gviMBr# zi=M+JppiY7-!2_4IAS4xte+hvpjIgP?2vc!7GX-!R~)rINq}gyb8GKYm8~{IpX`dN zcl>&Hp_pBGoq)#}(^HqaN+iGkjtf361&owgEp)3*s<2+hQ%ocLy zqgGP)OFA?pG?faY!V@ac3I~PV_M+hu4X@geaQ}-6FSb7>WMUg2Jqwh$<8#x0?G|pU zbBp;s=CH?inIiz1&vahm5{CJ_%LLiLR03v@;|BX#mfZ=l^|$&5lSZwtA0uFcNW92n z$-SnSAAzEkPpj%d_`g}tefcqy_@`=_BrfAnfCtu(#&Cjl6IucFDk}MaElP-T%5L7I zrdrHcfad|k2GX12qOR_f`4o|W2~V-4W3(#l zus}xGzxAq~^)%S-KIggYC1cjhI6u3eT|5(Pj61y-{FS>3-QKzzqyAEN2ShcP6%r2E z!+JoyxHt3p!?(WQi|Tv`5~9b_XanV!K(TP-8jV0u>(Y<_4Sj4l>U`rY050JNmVbZV3~?9u8T zufd)e*)E`WbeAjh4_CEbLeD)D26sM!g50Fl;HhN>XzZE#(V$b}{@7R1@2Q<%; zqyAbX_;#!OGqE?&u9D!}A+30I-57)KV^IwEOQgR$ddN}NjW3f_ z2}0OgU}VdLZDBF^kVG%VF@p!0M73~#`Mt-SUUeAIhMY^U)#{!%e(~~M_~~2{pV^>t zR+&AJqkAdO`jOVO=%}FMjxH&lPY4&6o@gC>q~~_oU~!1xHfXlGYFfnE?35P9XNQ*l zJ3`dLBs{(K3sQmLJj!-6^Z*Hs3|pXiV9(StEL4wG*7dEu4G|uJRx9B-o?=4@8#-jZ z;gd#IF#h#M#-A$^6NG)>L3zc7Xlh%QMLDKkX~f?qa8gL*&HC{)?-@r+aoU@0_n1{%Zn~p{Q zU^cyHmxsf<*m6Z9ho_fqIa9XW&wbBCud~7BPscUJINg<#9@EAHWLcI_nFuL(AKT?R z2C0{>mTJwL|LB)T14;=cH>OM=ePZ2y=8;io6_>eng39fvnjo@L$ z2*6Ia;)uLP$<_4fUWv@#P?@$cVur$4MZ8Yj@KEkcP8R5isl2*q*MOuPbaU{x5e&** z_4mBC=x3~ihH4Rx2})kH?1`&!ecTl<2f0(tD$DkW0TfVMB2c+T$A6AsjaxrQS;{|I z!QZjy7v9La;IrB<(TQcwEKtsHu7Pf5V&8QdSYxqfd1dBzt+_(t4t-fBuO* zvFyfc?vs++yT~>>Lzz_xcW7ws3m1r!P_2c9_Q7FUSmo3%CB5<<1Nxg_orO1g@HS5b zwC>(mX<2rsCRbUodoOuGRK5OQw;^L$ZlorE)eEahy9){!GxgZR?)AxvvL=y!tKF%X zKkHVajEh8(Bgyl=85QcPNq*(?)e~A9z04{q@9OQ{4rPak0oJ_|Q=<w3slEe_?-aV5p3WGwNHqIZ z5u#MLS$IXdX-mtnDt$uRQo5s2`)Sqz2Upq~?iP`!S5y-sA=&?&8-#>pZ>H)?IRD;@ zak&pJyH09rKNI1kMTZ{(-RAQUaLico3Dej#`zIb2b=dp1yF?>NvXzHXJ6t5kT9wNV zd!EW+ccs;bx>Jx7I_*XBD9k>u)#@}h7tc!r65+)QuQTUYEv?nqLQSHJ;jR{aON5&m zE|EuVg<|&s_m0P2?5ozsJkt*>(-Oe(D46{uAv1<#ja9jr8HL8m?v2g0ScnNDgM<8r z&xh7`mw{iz)NMPBv;A3uUqfg;(9t*)&&Hhr|EBQ=hd~NBI(_Q|9I3-2j3 z@uO;y0Y6@=wAY_-alr#(aoQitl>3lf19W8^K54pF^6|fAISjRYY-JxVU>py8PitPcjzKCTV?Yvo;eZe;Ebme+>&Dr!iyTe zeajg0`Ecp8vVMg4u-vLyvXA8eX9FChJbosoA@&`3lto%S_cLd^GN5m`ErgUuBkorHE}2Ro1Huj%_kJ8a+eO01zZ z)%VXxopPcGn;H$=lV9QsB@f+@Cs9r8X@-|Qpn%ZsGighYiAte2J*qSx&U)FqQo_F> z?KOGUWz)@(0g220VWLgVVuxViwKg$7I{#nl@3@6}KKtw<~8DkcGH_tyUUQBJaUQRPW1J(DH__g{1Zy~lvDy5B| z5`efXg}Wb+MtV6sRj?7wCMa)rI@}g}V5?v%sc00FiW|e3bl|Rc=!)nm<)i3Z{J$iL zwwbyk&uRLCpnr2Z=t}!=4nki4-4t|%*e}XXdXmlElT2(}rNX%^=PzH%dE&E%)B@8L zb-pAJ&9e{{mm5A{!Av|um<2QFd%%UYFHVBer4*3sQDMEiJ7lV5%GJ&^#nUmjiu$d3 zhFU`nRFao&2vXCZJ@S|gl~zGwmj|Y>E?Dipj|h?`=z|~no~IJtq?sm-Zz=wWHZHn zm3w~95PSN48b!7lzIakdAAD@iE0{IIs2pyZOminqGv(_xvR=beT$+^jP``}1og)Lp z2J=Qtot9*^)*Syd3RQxK4}}f5pEs^uD$Cqv$~;B+o1eM%Bp*JKl0R|CIP6C4Iz{Qf zM|IYfV~f|X9=w(1|J?rt#g} zvk%D3sq~>4(E^_~o}@^Oe5^hIL`*^~W4cziTyiB869_x%(Ma1xktHxCG~u9BEH?kW zTL7X8ZRF>)Tk7;~MtAX%IchnDiPoTBeB_mayz5I1XN4*!2kNwEB2>J~vD89rRgt== zG=##dqUN+a-Mug+vXl1}Bz!pDw?lO~8FFQ)`PdZxx3d>n@?mM&TcwP#xfIn+wxT*T zA_uktnnyc6qXw0ZDW-lV>H%@`1-lH|e8^U-51t@=<3YKvJ00}CIZyKv@lypqn0j_P zB3}@-jnP|(zP&)*Dc;(ed3RP^k&f5EvgCP@6uS(782`YoqC?!I%+#7<8t2)Z@WFgy zE^8)?T5-%CVxbDi<_oB$FXvSbMwN{6<(d8;F{2FG?JYu|$7))-r>d zFH{Tdjie6_C&mrp0ncnjS!<*(T!NjEa;_;kw4JcjUMKTM(l5h<|qq9T3kGjKt z-NDomxGdk#^&_kuG&ntB3m6k|>q~89#q=J;kb<+_gPg}@;IaWUNb#N^n3(5K`rh|5o`?dejNJOHg7=r@=y+|Dlx8)0 zFR6>cHMkg|lezn{Txgc1h2>ommll065qmP~tvNtZYTzuwye8#@nf(;F&$&?Uugrw# zoYy)Ny@CrcB4XzYb)D=Z>`*_zv~GuJih|cYjnl_!_jh%Q2K6(k+KqV5Sk_vrs~4oE zy}L*kn;*Y28GO5Ayq0V6BhB=|`u12XVNqw{B>0>o&=CkkbRXd)B&dycSd69y14ock?ErOjEg76&>=;?pwGoa=cgN_fSgw5AeX5voj#A7m-6d~aX5XGBBESKSHT*)TUHt+FSt1%?IH z$mJrBn3)r-^ow%iS+?qnWQ zSlYGj%tRjL4A^tTZz;w#0}c@!-~uzNmEx!I-)>MjOb??!PA>8G{UqtuEA!9^JrlRo|zcwf(s^dJD=X1PO*v~ zBP$V`yH?pZf%|~N!kkwxP$HSsILfP`Rwq7l@Gq}yk4)K48L75 zSHz7W^~0_LsC&grK7UlW4*MO~GmP4fsw&;%0(O*U)*xOX76gA+_UY?MUuiXeE+PBa zhLgj87)zbz=-*)>a?unJOwn&XUQY!lvAk+?oQw>D@n)DwH41@vt-42EW1j0Uu1=YX zrrH*s9To@{uOBfAwV;b(ybz z3Ud1K?Dvy}29%iyhY~Cid+;z4UGVanuxcM@RqnIwD=g2k@gDFt}UTX8^HEaIA;J z_f#(i(YiM}I7vlnOc_)!G<;3iSk;+j(tJ@!W)avb%VnQIPB)~1KR4jf#an9;I7c~oHr24}1g2P}?L?g4VWA^ZC~n=v(HbrGPV>o&REPHY!nrd( zs`7HJM1;6T;QfPpcZX7pdBsDUxC*3VCpwfdA&>BItO?6#Cu-2v@0{Zv~)V^!^7f_GBbAt zA0Cx1(%W4?`Q=*IpW|IK$ zlzgiw2`_=^@K>g|sJK^&82o|Pqqr&PiceNKtl01=^NjN=bX?>;0-gR<1{(rXop+EV z;fFr zb7m&bZFZIOHE9+Noz_FNbyTeN!x>;bHpXdsc#8kIFI*LrZuI&`5p}lCY&2?9(QkO{ z*M28vQ?u%kPcB_HT&pOW1c`eJtpVX9%VZ|Kgal(s3NGJ@>#fa%@eN;zRV)Y9dSyBw z$Nv=kdlwo+oal5`lyv1?LM^o=j928Vj6J}yxYnLBfcP+a@;+x`F#9XWG+$z%KrTRy zCFyAv9}QEcwQ*PO71B*99b6jzbOxENOlDq-cp0PoGL-<(SJnxeBE+gL?^QhVm(`^6 zDPDf^#PPl|Q>TTTrTKHKg;3fcNLquY2QTC5 ziG~emgH5RhPrgDYdH0)WahH5Ai+b0H_6Lk#1Y4o zXvGJ_2N29YFyjQ$bQ^ohiBLZGGZ)9cxVSkE`s6C4he-?yae$OfeWrohyzCS=Mu0dd*(MEX zyI?oZTpEKOAc{P#6Q?gBZml7G0SSXV2bbG}4#M%nD<{Tye0Vu?cvB@mq>?lNfTxgKjaz}UZCOZX?I z{GvZ8Ai^LC&nlSUgt2-d%e8;D#!V!QprzFfOKO5HMETec_>dQktNr#2t7E-`brat# zai}PJwKCD5b!5~B1;63TtS#}vzhLebtfBZMq13s2(^(KKOX+sSh4k1AsiiHAD+&Y8 zd1_7i_=gi;gZ)Kj;(t%4+DLNJT$re2HC$%CYE9^V{xrzwksHkXvEG+Q^82JPJZuK> zxMc1if3~owL#8`X-lAE+{#@oaY7j1_&C8 zcgHg5J8$Tt3+msKh08vK=+Ro6E@`x(8cq^AP#!u9crou; z6W;#Ngr_4j15EKKr)N%bK9{;ziKD~TH80t(6ZUKaFAiTH1g_40R&Xti4Z1Reov%ss zV~G&5mTs+mNw`4f?HgOTc@-du_c@wx@bimqyXl|+_Ab+PElXp3a~0LyK{F}9i@k;v zQuEXz+&sIs%@jv@f5$w-E^KahiB@0z?nQpxS)bEn283{YDEK+W{MfcLqz@aUbvE$w^17VH4WmHx$jmIJEOnEhf~JGI@I9g^8|K4zrSuN-sf!w=bk;)S6x`ND~N zP5dVauSCAihivOnPMLSFd50Q`D5RwI+GUdi2*ckCLkyNpA0I=hvU~}P)88QQVmD}c zXCj(qf%hB7gGsyw$Uvvt()8_j>R95FrfPZPDpbPD3Eg;W!txaDsB3PvQq%_JE=gxz zphB0kN_a3A=(uFkWx^(YzUM4|10KolZbxR8A<06$(ZXq7C-#zt&i zuC=fZq6WuUrQ99CviH>3lo=%z2*n1}77ry;$~9YzGyX}5VAzCx(>82aTBDIO`lcD= z{r;CW$$$;n1i>XvRC?Zkukq{08s&~$#()D^(Q7SQLT4w&{5qhX%y%S@EDAGbU9UPj zGX81;K@77ZBF!fYRkzcEr2FiSf6*6v$X_SVaqYdY!hQjvPUmpVWjcnD3(Eb;(qy_b z_hl#irE$Zt_!0MA$`*BcL_Mw=WMgLYIYJ2`tGl`91)!TsFTBTy()%^%4HnrD39r16 zJm1)OplPVD$wBa%$-U2lWpPz{p<1+Am5{MZ>mW^u|C!_H|<0G&8bI=9nGQ>oNb4L>y{50W-x6OZ&>MZ zt%zydlKXnUgN+MIAnrkhETQ1!lh07Znqc_1oP`M93GLD4ne_I?&q;XQ>j-+>%yETixj>y?jfA1r zWb*UPsIujP0C$z6QYwUp6JP5%Dp z`@btzlE)UpWLch{iGRj_4M*86cmYlk`zn9i`H`!ZmmmO6Nhs|&DOj*KfX)1xQv2e= z#fxRpi$0Ls-WfA{`VVg(Gf7&Mpl}HZF(i`GaMu7-kxp++CW7b0VpOW4e{h@w*xRtV zzrBvQwUN+8oeY+6+X?Yo${*W!4VHS;^^kc>Xk3|!;1_M+r?A@koQzaI(dxvkTr^u# zJ~;r-SWN0_{H3ml4!X;7YE3d?^pPsZYM+Gps96L)=mx9GA)R>yyH>v zpieARZXWiqD*XZ#FeN*WIV^k`&{L_WBfi2E8-0|9)*`aTXB79_hr5G1|KG zCG>1Q^p2aoE)zUN?DWy8=2znd=a!KH9C-aQ7#6KCGw@HfXlq5>; z%Pc;UD3v@J%??rFJKZlDP*r~L%ob(5Z+}t5UG}Qr5`=3tfi^uYj4*8jDLSQJ{w;^& zfewOC5jKrN9__r#wVKiz&2d<%xhpFMMn>|YnMrhm%ZRsq7c_h~4gPJNHwTI)Pd%8i zvM|#}{WwS5&ek`N71@&e4{(#J5-pt!J9~La?_L}uvxe!7Gf_uPGKBuH1f|LAAh~T; zC*;6_>bLsvLcdt&NSJXBL{hd@W~$<-`<>if5_Q*z1{e)mwOk72l?1^R%yz=@mZo|$ zNs!v95Y@7! zbNA^x`U?tP90Rh$o9&7`Dh#;~-4uwKI^83hk3}*dcX7Yp^Nc>7SH*!}RDGF7Na+7O z7;t9E3irdk`JdOnRKRevP;Xy`3)c0|z4FPj_!n zK<%wtPh+oM`i2Kkmf721Lp(|nh~&eb*tfLN8F;?@orZVZ;Ojr6UeOFn zhyi_qo^vFpt$(!O%bf3~laDxPaJn}R8039AYL$b!~zqZFk>aUP7qoZQd7?W31-cIzMo?$uX-Dku;f7;Sa!E0yzh_nQ29P2aI&31<3wKUQX4H+!$Pa%8Ua-7Nt+&1~B0 z_7dH!h8}%NC2uyo#0b_d6o7jJ9_gp#1{n zQ`}s_>VQtS{o>YVV?(*7vod==LuAnMW_NcZ-tc~-)%Em{_-3Y*WvAoFA3UsohtJ}_ zKLqfwz=~TUit6j~Z6cubz;$9xgej2T^N4h7&Ry*lb*{{uZLtx&E2$^x2Y2fp`>lB; zR`UtwoRf66B+QR$s(Xk$X3Du*O+Z5GG3T-l;Lvc;kLC0 zA4HW9KyZMpG=s3IC%mQjY6%w*KzRd_70u48d@rerpz)Lunq!62Vd(z=vFm?#41FDG zVMxVHKU1N%h7WW%TybF5ye*?nvTK3f2tsi#s(b}EUP8F&IQwEK8!|$lB z!9o|8{Ju3qT?d3hTN@v~L2;N1?V+W#OfwkZoVb*2@Xj2mz+kd|&6dMFEuAzlP&GQv zsH0?BId`9)?TyRG`5bcp6JFv71Kvx}bE6{?P6DkS_4(5C+Uw+H&IGaeF-16Y2H$Q3 zFV{f}&`LJQaSr)P)d&hPgC>RCFW$xQfq-*`2ifeoKmHp%tG*g(6Y}N)w0$Y@dok^X zwM?5o&TH{bO!BPH7W<(Z8-+YAVh2sqJBid+h8^K(2@FvSF6#IWZCdgguH03Wb_-JX z#Hk!JViFei#gwahvOuBHcUd3-3{aX^*g zQ~=^Aed2;{aeGp&Q_Kod#w#<$xpOP2{iU9{+z>BJKBftJTYL*{JfUtKbb^+xG+u#g zUv_xPIy4%VWPY4eM0Az!5q1X4?C5rJNKm1yXz~CZg+lY^2=JRY9ROmuE84Dex{gUDr*W3HKnY!fSL4QZORtaq6aujXr z!Ud%d@bVT(^juwWec82;bR+sX`KZ#sCH57V#|7u6ecBpV^0Kjgfbp#Y%MHY z?MgvSG(AR_bHLMzf|e$jgr}|J#om4|3b2#ZOw6P5Mw?eX{`cw=QSNQLCZt|R?ezdi zXHITocE8neSzN*Nvy$4$I0m@!@pDDXoocuruggk!g9(n}H!@Fe-+A#tNr4dV<$}`J zOZ$*Ajj_jv+fP$J;o{+^!(YB&izisgLZ7t9OdQ`r=p%$G>(<^5> z0M15P8Kcb{#!Z6d?z8qupE#8CIvk(2rs(WncWeOAWUyxOUBGqA<~udgLYT1A%ZKzQ zQO_zLf*6_})&bsT(MEHxvNhylFh&Qa(aH9LHLy6>Pki{AFJ|A`WPeBrFCbtLgJ*wA z^EEoi?6XVmeR#q@ky4fo{A{g9_8|DgM9UonoUBI4AY>bDfSdgqbN2yU9172Uz%OWY zPM14*C@Gq+eCu&HFO2p;m3vNqH)FkTXyNbaSn9H=s#D$_xLe=a3jTE_-Fi6NTnW0A5WF0AOe z`0zK99Z%v4)d>DB?_=Y-4|zsKd*s3yNILutJ)Na5!?6GZtXtM*8(>r>#rgPCR0BW# z1&mqRpm5EWaq>;&Z^H$wR>fmwBZacnT4YeVTGxDjyA;(*tMl}-mxrVgJh)SZ+tsi4 z#d4j?vro$j{Q?@|6=mAsv`QMBS)A?1M@MG(yyJ#V7|L~Zi`7~+{`0dc4>j1>0Vh!| zE+DjD4WfpcB0q5oy{5JE6_-88U&OfV^?Q7SJ8D4Ow5^v_%*JxX@>ACdG#Xlz-o>Ls zF=J&OD5C!Cy^RKePmNQryoSg0S)lME?Jg<{nB%d4@1sZ#oU(8z{-Qp_23a^%b0rrW z82$K9k_{$dGNoEpxatS7zX9uNFIT*tm4doAuJYE#%d5Z!tL87Y3wyJ( znga07C<5)h_iMl7>C@-IgB&Bp>JL1rrjB#Xp1h4QOJqolPQ1w12Bi$K^aP7*=o$a2 zC%1y!7tUo_s)m{6zr5QQe()pcvgZk%Ri$mYk2?rb>lmYi_dBckixOEbzF5os zk^!^Yua(DD*wsNFPBTq$e{3Q;vCoZ*kijCGyFt4qjaazPsA0wpRLoD$r z;@POAN#M(hnR^N6*rD1Fhs{0YCn+d9Nq#xeA^neUSVCJ+{Y4st0tsxaa%c9f9(UnO zgGQMy0t^R_$!wg;KAS}JoW!c(@zftRyU_HdvCRco*V$UnQwn9_JSjy?Q?tgvB+K%H z7iBcOL0H*V&ru!KuyCL5%!Oija8oYo$B&y@-xr+VEo(1-J?w+F&sXJRXlFK zpl5QOE@;MJ(ah`#p7Go>sY9kBS0*P$h$u>_Glm(WOv{{%f@Vq#Hc=sP7XiN{MzXi5 zAEb%TF(8SpMnxVxmOGOZqf>lTRna1Vo(z$i?S=5g1~Lu$IkR7NwX$yLri`M$s&uf& z!n)|^D{QlxahegTKV1mXchMT4BH8k-?*zwFgjr;t$Gg%#pEhuM-i9ntpn?;8Q~;l+ z(wl3eD4Ex3H#9zcr=KZNsjXO$N{xg^Ex!rWX>0mJet(Z*-MHV>^&4GWE!!MyQ9nah zM!Gd6yUcB2j15z4oc^LfGHWuDDDVPmL-CxGMx?5aP z^0t{3qwV@muqPqAK*TVfFX=$SYMhpR@WYBykZqUr8k^RN)UYi_XM%%2V7^QmkxfR-<%PcFbe?pJ}X*XSnPe zsD)OLs9ZnTy|;aZp&c$GPgCNS?n0{-Wle+CsPP)pX};gG=46U(nb${59<#;gT#EU7q)4S0Lnj zz0=J=wSLJ~dNin3Ys%ESi#pWui1mU`^w#oF?$7ect?3sp&1TNJ+O~RQ68+NK#@|B9 zR@wt=#ofijawXH|Uw&gnOao*xe6%MdOSvt`>2twL<2QwGJGYaqIvSel6pOej)T;lm zzI&_7_d%@=zvK+oh`apG*c|gi+03bZNvz9j|eE?qS4TFn=FIB~Q500h8OhZ;+wpO3_r zkXvPSsGH0kshRnXTKq!j&_Sy`*O9bsdk(StrA;W(pb%Q@u5O3{e`cBFtSTYY^gX8E zclVf8ZhZwCUcS{XqCxfzR6X%m%2|vV3O6(yYA}`_z znt?XBHP*{WEY^^(>J6fuzhkhmfbHE3GH;UZLN=MUE)Yi_Bm&xiQyjRQBPT~miAiBn zQ!fm%TTnX^^jqKmGjg9asU)GzxysMLs{Ks&ZVSui ziU+awXtsifo3p-M{^500tb~jQC}K^TCp5Vu1@pUHF0uNw9cw7Fr5DOT9RicC>(6-t ziH)m9+Yd&lvR7=1x`iB?M8n%VwNH3NKRH2dfZOIwyv-h}+eXzQ^ptbiYwvaRtrIx| zukS>8n{v0&0{M~%fhn95jSWkLcFK>qcxrTWJPI9Der97zxe4u*P)Lszf&YtSzgtN{ zy}2*_?m(aREh*#z*g3}NSWvGV#pqO4@ko*t?GPFt*YtF{?=glFo_}d51U`7KcqE$@ zCt|1qrX|WIw`hUKQ?}^1cH_J>Te_;GG~g@PH&3N$MBS8FvMD30x(y{jNa&zQ`+3*d zDxwmNHS1b%zAns93C16ao9Qn|@?DcBHsi>KEmJ{UIht z%IH_H6bp-QCyPj@lot1wB&Qy;Zthd36O+nF_dxmn8XC!-r^%@fwbSNa{Ttnc(of1U zIjsuD`z_BFr`R&CXXfku97(XUseDyNSfI&-GVL{lUc#NbykeD0Zx!b)k*@M%E;C@x0DM@GalE6wW6*lbz+^0Bvbz9~AJ>-A1y+ZY;aP?l&lroBrZYc=u=td*g+}B3-JKNaA~xf+ zhV(TKm4nJEKGD;&b;H#eX0IPb0=#%?-@LHxB?Zy+U>yy93A2e$v=%6MI@v0LX3$8? z;E5^f7v!vsmE3YqZDQT=MVge-GXvXNx_|&A{#ThvVaTZ_;E%p^RK@*_rmZ>;RM)y? zoin2}REgToc`!)Zgr*Lh($3=4G7C9l$09hixXkr#NE^$Q=Yrnt0*#k^<<7`un$gRk zV48jL0$b)FPtAkgfgf;xSh@4`W}!o)31=46|lF8YQ$Man+B6(!0m>CsCF@C+9WxMX+H z>Pnj}dAv-Muj{x`h=|?MCFEboh3R96zY2Wu8mgD~*ZcKX=mg%;pCVq^*f}K(Pk!>c z0(tVjw_<=Z({^qkwR}0b6U5oC*G>rzK9H5qx||FNo~!?DDc{mRdN$s-vzd+HNrc}EG{4ZJ4CwaI(@{agGD~m0N*>Q0DDlw_B2G$b# ze6!`!`f$1O;Igr(<28w2v}i6@3y)?;#bbs~hU2|$?(Ps92Clf?>gMuCv|Os&M0?N; zTq1pxA|1b{hUn9}lF@BubjP+646y?M#fv;MlGbGQdQE{RO`11qZWa9g^5Pq5OKZNo zlQZeGShe3|?=T4jK0GW@5ftFrUvxQmU|FtQZt_-H^I_-cUd8(t8AaW-D8`RN9Akz3$@s!ns%CFJ zme_*E{FBy?(|RO5f;~Bxy%kgnXrorRh)3S4ZkYY$fJH*G4~rHN{P7Y7ps7{!$4CN) zxUxJFB8QsxqDDnFwtQ4qo(VG2`2UM2^c=Y^(sAVNoHYX2@Y9YXQ2(eV3-AFjW>IJU zP=3wSNB61$-w}A&>S5<}U}jHE62DhZJQH3az>7|sx58+c_Gwstu+|dgAVfja$$VsC zP7|k%N)Fa2xP%(V1hTAHTYI7~jI5x3-!$+&<)$*#47dN3^}n&Rnl4N@u$+ZT>tnrLk#6gz77doWuq{SR7RF8So)>>= zV6i4~qt4X>@^)@0i$++@uGpI_Zkut!8!0A84f~8=C#ZJPql#;~S9Chri%Lx5mE=5gW;EYW<(cb=|87&5jNYidW4>Oi zLMzMI8nR#sXpl>#VQ`QJ=I>}Ae@uqI@0M!;$5`K<>*DA`75;Ymqe5Te-=qBknd=m& z4YNP(5&J%JC0vR6`CY4e1Saz1zS> zi@nKu+<@f|SI=jb%Ard8*gB^6G|CXMt^)3 zPNUFU+#nrqj*W-ztU#H6S%f{kW$3E*fb`gh>kT~8#1SAd^S5q@`h8fZtc9`r z@PT|wf$YatXRVU|L~qtZLeJJsK-^H7Z7~m}O#KnU+t4Z564=rEYHX%en21o^)2pFH z;D7%|(OHHy{kCBkq>&I2rBOjrk#?g|8Qq;C&B!qtQIK@P=pLhMFr-63n$aUiBQio- zTFU>s_xry6c09-P-1m81Cs@EOa13}}?(;ocg^43G8ome}l_g0u;i-jOxKxmwq)Mc| zg1&QoSe41z!b5DrxCy{AQ8sydKO!<5;83Lr0U{rxv*W%$Uh!OhbC6=~Z>*f<`MIxu8!NM`6*$-cFaWk=CcGSm0S z_6PC#)wJ@1aAO)xV81eGyk)C_@1ZM;aBSs7*fb3R6OZBgHTq6eitd-D=ttk|FKu9p z@+{nrb`W(WI$Ftmk&Td7pNs@imO((MI#KgQ7Cus& z(JLR@>*^u3k6*}hHPVC4i`cdBePd#Y=WciWU0TydxXpFDLf|=I#(N|sLXb7mRZcMZ z*J}){+ps~JJ7&Bq>EYdhPEi9U* zcs|b)s)E_abQ|cWWrcINP z4ffW5=(#)0`|dFTxFv;o^w~Ux;Pj92HB9P7iTCrh_B=2Fs_bjUk2H{4HuV=`s`d$j z$v6D@kN%L{K~`a^)X=FeZcvT8jCmG_+lA)jYCNioyF^6BK&|(N{QP7+5CW*ja zJ3c@@FDzBH4)s+Z*nc1s9c4-+-cDaA<7ok$Gc! z_0jbRA?LLDjg4JC}zgB@vq`4?Z~UiUs& zwMks4#5{m$A1EDa6}#V|b6>8rl_?J!1d@~%TgB^HuZF|=7!u=(t_*+Yn~Ilti6%h9 z_q!;L%O^4RCXQ}wGeS9-Bh*VDXn5D5_0%smY=o|h=NkRP?OjiQ;$xedhAfTL%ot2I z&;3S4gE84vwrVEqoNF$QwYnj;`^TA#zJBlemU=I2jwb$PDO=j2Q zSRGM+e7(Q@9}!IumwsHqhOzYJ?QDBi$Ble6eaX(0i+=*xxRw;Tpqxr?DTaW{%y#T_ zF#Cr1>owtS*b1#e&`;kr-0|>u%t$<_n&ip%UM@@4Px2U7xxg+E_w@XD$MTrBUX^=s zhuKn22YV}%y!gax|PN{Tga$(7IIRx%y0le=hpojS}9jBlpDYLb= zI^Wc{RNdwLEuatGu(+5BtXP~r&7oiOJ&dYq;6JmXqdI7KM0a3&{bKqB_Nw;5KE-vb zYK7fed`#7iR>@E21&|~q0b10$qef^i5gBC{sSB3!rU!oG(Sh+|jHepnxV50dNa{N9 zquEE^+8xW@tj~-%J`0|0Nq$@7g0DQDt>^lyvN2WZzWPYW|3O*pZ2^^u!p@TF0}`Z? zLDp6pRm;!$7yhl6?!Wz}M%MC&_mNo@FRl)Eg57_hk68ci%G2u5E4#kf)AEOShCIV& z+_}@2$B2y$n{t+&Wn2^Z;If8(^=9Vq7t9$=Sz8xS_}r|}_VoarQH-qJWZUKzKK*O1 zS?v+%1*1`Iob4kQM$gO#HdKZ!an%a*w4?!SAIW z3lCi@Nh7Z}Pk$cdfBGqJce6Q=j{@ksztig5jxC}?AHm0eO3&R5ygyUW2AA=%sJMfC(~8b+ck8>t)|=jwm&koblZ?wxh6af_D|%r-No0US_AFB zw>|vo`wbW+a8SATZ$=pK95W;yN^xW-e^yg8cr>g_fe+zXa?q*F>{24&~hQl3w! z@m;{AYY#5^T?KyaSfr=Pr%heeOsO~UT(*?%hPeMnL|=}>^7Xqb^rl}lnSV$EXGM_j z{A#NwSJm|%m|*HAYTI*zSgL$=mw)!RL1Hn-=}o3xuIOBb+lLMrlH3g8OFDAzzBu#n zzJEduxTmxGz9bwsf<`=su|%b)y+uNCxzt*N$=au0%J=PG8op5P(3t!A#vy8~iVB%V z0xIgOUeTm?6=?`LHKkY&G zSBb3=DWCK9P2RMt4Qz!kw8{x}cQDq|b1LD5+BtYoy;wF?pR`k z3G??h){q6Ord09%>+_MXPer*_Oi1sA>^6DAgCeA+7D}>92Omt-I|7qjekp>)64b;M zBmBB;{Fthq=BUYZ3oM)c{Kvl8qaJI7(yEZD@V{=S^7zQV@HVR|wJLyH%a!em6~30C z{?5u4#2w3vOVg+SQ%4LZmw}ukrT3%*@fRmZgfW-N#&^SxV^4+cj_H{-JKpSy|A>+<6=szeL+CWt zjM1yP_qP2WT62v*scCPZ*f)=X3AqT@%`GmXx(TzI>sf5mxhr#bg3#}M@wLMq{I9@D zS=V3R_N}aiCVV}iZnpJijLf3i17SC9ClUQ2@sbwmNB*5wI;zNvK68<1>nupjhv5u~ z0W?PGUc(8m80WwD>nFJyS3Sj#m?#`hZvC#|YO5}`yruixey!#|qy8fbJdRtgf6Fnq zg@ziacyb1iEc_Un`oQ$ZqTfXRDbA_+6S*^kDYuJ>$wFu<>z)XGjHWyEDPlucz*C=s zn-J7tS6&@>slV9uN;>jJFOSjs9gi1PZVQZQX#kmxNM52#O@Y7)!DIg-jfa^4<&9bY zzI#BD12whDKc;3sR|>-n$E)Xj71pLTcH&v9LoB{3RA(?}N$!?55~mKE$}M&kODl`e zRED;4)O;0_&ELM7uIYt=3F-44K_!Y0dP6X75Hmij`rDXPJX-dx5)mxt37}~2Yn?q? zE7P_rO6{47q~`#%lY;<6d+jSIaH$U&OS|;wCw0?lz~X*sf3^5wsRWsoG~4GMQ>!xL zs42P-n_-mE;oQv6dMIN=*@fjULxVm`b^ zn;-GO;bbbF^nikhUgspM_Q{7F6l5XGCc$@9UlaSb(#YuX9c`5jeP%2vL4@#zu}ntg zUC)DcF_Hmn10Pc}{?(t6j1NQ_VQUP_a)X^sR9xni(D4irqHG*`POcBuaQU=-k{EX zUIaN9(-vJa`m7|&Fe*_&@^f2@+4%oiD${6_>LX^LrZsFJv|fnBuid(;5T$v(|YmspY{Z=N;%Yx|5SK_jBk~%nD^4z=sOT~GofLkz}v8F zrBs9bo7hbe1m2K;TXHNsx(va9*Av6}p9kEarfE>#YCNY{@b*`L!z*a9Sj}Sr{13s& zN6_{M2^4ZimRDAS1dHJn92{_HuNR3`h;(`AfL&U6K7xVpgeNW(K>4wX6qh&PdVfty z8iE$2&-x@BuJU2^3@sczGDI^)g7_0etjCtl?ty6v`f>bPTdmJ&q^8l-i?Uz&ZS+Ho ziXV~fh>n}zC}S6}!6F zjoCbaKM8fAZgph3ub^W>IWsc(Z(2~3%HiSRmk_hV=Sp7=gaoQMzHqcUHHdhyEdK1M z5~9-FjpR9(=tZf#7&Qs>q678^QpC4 zwXI*=nfmcVm>DVAWleJkp~+~r%%5YvpFXe5SDN)&+-phXQvCP|mg)KGPN)-sg05r~ z8?&HK9L7}Y!EP6UmOIj2cVYJDO4U60 z)!s6ywiU_zocQegMu^vCnddRlx{+toJ)mY%@QK-AHi&oleV2{4G_nJi)ukaoo7_+N z&q#~Mgs2762+`9J;=fD|`w6TvQ_EpcP0aiS9iV7*8T28t#dGIlf`(tQknz|`pKbl- zH{%NE4q*R3L6i$|$Sb>NZ+JQ`@$%-O<#EV#N^yB6gF_if2N(Psu zfx(m>VOeToE9NzSQ-0UMdya^63IC^zDaL{0ik*HEDepJzBuBxFE+1sjld6BF7Uf@i z9Zz`3&Q@snAWdzGPG%Rk4L_6vsnyu+!o$?dqu4T#BEdAXmONE~GmrNj;c2+HJ^%w` z2^w>f6wtM5gCk4Mh#5{|tAgC@I`C*K$_3L&hY0;h)zXnhKe8P+8pG|Lu2rZ5Y#uo7Neb+{1mICsj1p~ zlspx?mJD@*mMBrf!QbbcWW(p!ba5eeW{(j`?aSB_xbm=ZU|bnNu^M8OAq zu8b{9MX1EEolkkFHN{m57P&738hYkZUo7FT`y3bCB?DU~S2t=1E)aZQa{BzSJz2bB z$Tp&;JNBgktZGO7)V4jyAQe_JPBBFB*zX3_{vD*C=f3ypzuB7_ryWJYq(xo+U=0Ef z{UaozsfP6egK`79_UB;Nsa9MHXTfe(;#-M7o6ZVH+~*(LaYX7G2n;?ZUK(e8GyYjl zbT&(__EEKCDC9Gm(0qsG8Y(%_ty%+Y5#dZvr2der?F2jKww(eL)F;J(JNnK)o`r#Q zwEqw`0)Jd==(zguTyla6VdUbYid4&NHre?2M{XO|HwJAj z0j?F8+S?7SpRRI#qQOO&TW(PRNa8yFecvrX{9qib%%^qSGvL3Sl~GYznu#gMeVi(v ztN#0igs)YJ($otHT`gU!@g=`ndAvu{h zLP5A8F~!BdLAYKiRg{Q`T*Xq)#=cP9IwZ3;hzI(5^b5=XDL=#_8OdEtN6-#!EglSe zS1UvZ+SxOG8!xc=2x!zm97e*~jQ*;t*iT7bABj*5S<%v1r?H7OuK#mW^}D}HRLhh} zL=;!5+O>Y{Y((U)|FNK|kAY-&+e$BNOWQ6#f-?}UYO70TWJuBoUbFW_;~AqWzfIRB zV34$G)lN*NqK~Iht05sflR)zj4L0K6GL!opQ3PQP zeM}))f&pLOD&8j|)xTLv9)0qDnmV+_avkpC##5yUMXc-n#S=P3SEt>9n0MX9b;??M z@5X?9XL%h=*<0rvS`tf6Fr`zQMkU#a z&FWR^yyWV2)=!zu>nHnKYGNU&$l}J-cv4u^NMO-&?w{iKVdlbX5k!>Or)jng0z$5yL{}nS-mHVv*MlPu&hsMrLp!?F~Grf z>i5ZuoM$<()?kv?olfwT88+qJQOzo~%P6JN1MT(@LF@d{r{QliJGsom_V3cpalf@u6C#R@77A?_Yy z4v!z77&8%}ooWQN$-%7)L()E#?KzE-SKaCQiNB?$m9a2d(clvFqj z(xLx5m6*x>S!`S(g=CC9Fi%~n>t@GrLD2N0og3vzD1E#76Mf*eY4>UsaMz@ub(LX| zV^?+5S0sm}_xpRLDLzT!FT`V_r=^#BAhkoa&2`3=`td%2r= zz_uoSe666rCRy+S5Ci^F;AR}Q4fBu_3}gToia+2{jxFExAbkl~2ni_5godqrtBu9y zm$6VE(>n0y=%MDd3N24&i;aW**5PL#8YwZ7Y~G?%+q!F>EQ2gB83_A`KrKY5t6nw0 zbHiwio?jFet;IoISfknfvk#Z@1|Dpbr`WZdcs1osVKCdkr~M3COG14{a#XfJHh}d6 zw~mRp7{Br$;F{^A=k(4K8Ms|sMMJGWQ|*Kgfo1X6nIbTb?klFhoOIcQIBT{V;AO<)3_mE$|+%Xi_lFT(uIwWG^x%6#N^~0;u&4FWXG#If4i2 zQ#}6jN!-9|t9n!)_MUZe=XFGKtnZ;g#rHpogrfiXFiQx${y(BRAPWn2vH&8(KjRkW zVaZP2+$1J;v-D4rr5d}UZ#-1En8#wrx zk}XjU?6_Jr#6R;Yc}S*q1r zF#dqKU!gx^FzmBfh>%egy69I;pUCBlD1zujr@;{w`QxFTDm~<^a@)>2@J1-#ro$Hw zoh-vLlcx3apT~?DT5luPYhJ#essexQB=nP_=kGX$Aq+@WFCW8Ybk`XQ{k+94ClC<> zoM%)mbY8>Zr`uLvszI`ZrAy^^V|*kL5&wC*#8q3`$Xbb`Tg0GbhE}iL!4?Gz)3SW> z(=BRRBX_aikh+u2aw8!4z2oxOYZhTdPGl%P*0uqCSoNN(Z7J{+-8=Qi8=tEv*lWxd zF8~i5)kN`)`}`h~5ldkmfr%n@hzzlnI)cAMr;sxRSu{>t)MRF?Vj?|HC|a13H-7td z88u`BzUHWJXFD4pJ|U*K+gdOq>aiv+QgN)bLsXK{5LjBD4&TV?C1r32lr@VM%4FPHAze-qxX9Eb{N z7+lz+=MYH#TObm#3SC;CI!_b-?l9_jY+2{|JOt#5J(N_Ni7|P6WwiM1feJU%g7~3j z-^PtW&UNa?RIG8qfs1+yviu==or2641@k6a0>{pb@Po&|1;UpqVvjP65n@LG>-s0L=Ov2Z0gLkKGM|te|*4K3Qt35V5E+T`5A$tij$$Lwd1fL2? zv06jBc8H)AYCC;*4{S;MUT;s2KTrlG#vE68QgMBc)7zOr;A|8Wm6#5d8C(v%70^_T z-oTC<9rA?8m4B#}hNasn^PY;g6$Ey1rm_hU0q`sJ#WX4;ET~8eg;#{Vop`ods%7H1 zA${0|4qp@6`ZxozRw&i$tt#sUw#Gy2)rX2=-LIy<5bI&T;XWeQssmUnR{T1+ zwQC@~C~}SA{sB%W0Z5{X9QG?Q8R@_QVA;GPfQVJ`wtVGGI04k*Wkej!ZdCm{{8qh2 zZd8fTBnTyNHNuGny~WjES(8tQPm37%2X5;0YXF_7TJh7<(mk_x=4xP5$~@l%L8&-k z*8s|GPdZ5s^-}Vh)#D47x%WI{8$Z?i_MIGll7!Vdv09$mujrFy<9%~y%-#I;tpV~B@@`+Hsn#Jp#)Gg1{uB-kcG}>Rd6Rj zXC)(w$9H2jo;8MFG3c@!g<&Pl)&czxWb+~HD{vjzULkDv`ahxtRW@ykcK(DKESGsf z5#6d2E|&bUQf1BChMYiFzJbES5$sonUs;Ik3A(*6s)MVzBf#bX zf6Tc@N3p5ucgUH1a~UPEmo{OmXzxawhu=2Nj7xm~dW(-et2Tq>Oiu9gK@cD3Fb!YnkTvfP^8w@~EFt<%O@%S$<0Gn(0~Ieb z?HO+5k254Yohjq4R-m~iGP8uDlj!Eh?QWETCv+}OlF8o8Hc41FmAeXz_=<>M;{Y!% zf$R*GiNXf$2=CCfa@oov&PTFW#@e8AF(%49hoJLA9V0y~V2{?sYm&W=Q-;%H<4E4;~yN8>3mCzo9Ry$6rrFjLJtng5Rdr=Vit=0NV z=X(_U*#^8H*c0S6n1RL*XCV-rg)ZA#^SSBC@#=$h1p@b~jV@ybcmGb?lat(?I_d{+ z_Tjl9vbO?E1(xf+XJy_mQz~l?*8k|dGjAZP9gL*^9HLre!@dC^`Swwuf|VSruMjiY zx+C#5zL6`H%8{KNt{`1Wt}@`IV`(_j<4m-E(PupNC^=`jnoSl7L){#>~@x?vXDP&8fQ&VuJ^pGL#luiBup>l0=n*0C%=jas+G`8 z7)HQbwsjU@R9jxM*VFDI?4hCwVqldtxefu~;m@q>G>wSPk5mUbmz#;}LdR8r?LK4r zHXFJ&4?JOz!uzWpf|aFPCVRx&hdxdao1=(7=`(rK!jrfQ7dK$K@809Y5mwB9<3UiK zouahYoGTNe0o;$_+B-;qD&hLPC`Ts#9yGufa|2#_elQe6uEX;Df!z{Pa3WjPnM;Hw zKjv`MN;IdC!uhv+MSxBL(eNY%9T8?I%;;Gk`)g4WP_CHpq_V}A=?bAL zi&;Rq#9ud)(dL=E&3X}0_Zc!f7I@hCZ(XIOM7@cDvYgP%nWGF zf;jUakJBaYbjJdkg%);KH3ke00sv#mat~C+is&#|5d#^^KRZ4cDB~t3yn;8s%hfh+ z-lcb{u~n^}+X0DQhByo65!w%D9)7pHSA=IjA1GtpgDc@D>jJ)Vh<2aVcvU={Bc}NF zU=)>eb%x?{J$dB$cr)ul!PcDJy0JJ& zyCYEf##z6+kM#$bX~2CRcv}35c{Mi3E^APhHawQ|l;zp-0LjmGNh|co3X`~vdTu~$ z;u2kR>6cnHBCc_gOPtui;6?Og(S640B+7rng1Bd2R@3dQ5C}x*C#<$hfwJ-t!mhmX z2(UPaZ7M5^4Go2!VRXjOwwfzctR)2TNK!EWX=z1a5T|@brPX>86jyq}agSq;qKtw! z`in4t@xSq#RG5o+XbScB#G?PAKEI~>N1?Q@P2n#{N4e@Fxqs_W6Jqs3 zPdGAQ+hVd}X{h+w#Jvd27(Hi-VALK+ z+9_10!OFee0O5C_KphZ42rQpg)hpSmmWqw7Di6KCl+^CV)t zT}Bf$9#}&bOHU-1sY<+z3UCA4^%Vi$9LWmBKEwATnVB(D>?VwMWt1#NQ(p1}WeD}o zi*Kt5B+d6}L&zx}fdqIzc(|w9f}8jsiukivU)kkOqAj}l5?&Jdo|dTiGF&QMF9Vny zm{k%(EoAShuhhA@mt1r(|X-W z0f*M3f`5X=H$<7G2d@WyD{6-P`X|ZAi2XEKcmGO00-tL>ZlZ!Yt;!e_k1{NNRJLxA zXb?jMw99%b2yH@J#zXETQ1cI#@64(ia6p{GY)Tba;c9 zaj&E|4;twFuw1@0q_=0m@L}mcqDWP4maSx?$R4|m-!5yb?2c7pAZ;hP)+^r!x6$o@Cmbr1#kB`X)uUVa zW6n#M(hZ#*qJH3^wviG%oWt4nJE`BHezaQw0-(>mS|A-p; zv?h!bN&0@4HW>PL0xQshh^WIAl#BqzT7fkR4)d^56@jFV$`BYjysCBp#c@$5=0g^? zyvD(lA5U~qA;=JKovKF3($()w)46(L7+ZWd{V(U~ia0zIMX=t7l<#0zuuNJEdkfQz zup)x`i*lNOK(0azcn`8YK{ZzUTLo-p17}^*Vd`JN+pT8w$X$ zpa;3^wv9eiA{)lmg6@@N)x8vAU!UGR@s+gZA7Cno5w%bfhZkzR&kqWojtrh&4Hbw+ z1{)7avtPJHCTxuxKBKxa+*-Uev{S(AuNhiAUFf+vM@`ysy+m7a$EQ`a*_`Z}jqz5e zeNUm>O~$_0s}>p)#J{~2#pOF^^Bq^3JMYC#AdcBr;W^^E;z!%&FDNcLSj%~20?ea* zYo@5)79B%XfR~?cjh=+XjM2)z?FmO18@um#`lN-EFm~<;-aH=>T|uFq9#e61X|lEx z$!O63>f}LY?#F)u*TbynfHO(ZeJcL=ys#@U|Q?Eq?(w zLx-*k^cg16ge>e8HyIBT3bsgK!%1ZNs&@)};>v9gTSg?T3m}=&TjLzSg* z%+5Gs+QIo_D%L@``vra& zcH~|$bR$)!|7U;odd$I+XxL=s(wK(5e_86qI_Hmuhk8%-bF{upnyC_TlFL;nJxeL; zfg)_nDrqnqZpIA=+0gx|tmYY*v7>i4&aKAtMK=c)ar>#*he~Ypp0IcCC&95}_c1nL zpDAqFG!B8sp(LN4Q-F$$zh^)6&iG+O3Z3(<+U)*S-E!S?QUw~DZ=%ECzFQdbdwVSH>pN8>pII$+jI;S$gxg^^WdC7|Ge&ELnEC5U?s5q)L_B9nGsLP=UC4c>I}I z?h2QiK-Dk0OYl!%bQJ_4jj~Jw<%!cdv3MsI&RZ}e_$wlnbLM;F{OZ{iw3wCJU&01Li1NsB=p9QHPIF^T;LnQBYNKyU7#uDOJj|-Ut+e3UGExl6Mtew zfKWZ{W=p7C^)Ul!J9W&9GP6swfzFF6>9a?9%$u!ouf4lcs!489C(CcBS}%~RxN7%8 zB)Z@n7-Bvq7QNZEi)*W}tc$$(_y;oZ?e%nzbWSbwz;)2l7 zwy*046hI-)W<|tyRGb)tOY--%+q_SYtJ!Kv)E4ck0?y$2kGid#>-k&!lYJZ%&x%qs z6A%2BLWtM0F7#9o7rUnZS*1LW0hJDhlW7loHnKNm;G#wg${)qCU`+7mEhs1Wi6{jc zs_idFZFuSTs)tD?HvT^Z<|aWb&2Ho!E8e=R*14>;XE*FxZ-X#;^+i#k@6h}tKAVL7U#h{- z$57wOp)EC*R#QSbn_%^q3|#B$A+h0jO+#DxAls~C@#G&H42(23gg0U(DskBNtb&|7 zmb!^Hv)}aWtU}K%YFeG4bVMC4CxE@@cID5M_x>$mlk&8z6J1CS9fF9BRv%6lI6smM zTz`DDc!a`0gN%osZ$V*#%w7Sq2Ho-Ixy~G5Zd^qQHb=xX?79G5^ub$@d5{UvOtq+B z9?bzNiH@+&*^z4CS*H{D3C4mmETxuS@a{<-vUr56^6Boxv1L?Hy$}B>G4-(LLOaCu(@?yO+5$ar*X%@v zTa@HUurXt{biNk1u=9ouptB5?9C;(8Rp@mmSv65XyJ2j;#$sTJvJU=|kWi^BF@ot8n=VPAd{gYU* z)8;kwIvO}M!7Wphd!|1v5(TVpCF+x13nSlX*GbBPR`Rg@)&j8XRS7(09s zrlWY@XZ=+tVZSF<;T;%9uKz_VRo&kAl*zP1CWtfqhmftiz$A!4mB(^bY~5)p+-NLE zghD}>UJ~UbTfXBcV$ZQSyO6yJunYZ|nuj|mRS162yAb_ykgtT_m&%YD`JrR^G6bw3 z=4jARW8%;pi+u2seFo&AlGYWr6%QUWk{Dl*m=w$oG^-6%NHuAWOUYS!W!+LbEF1n9 z*`P_V!pTAZ1>wY6WdyJ_%re>&*dS zxcB%2v6DG$G6VNiTK#7U=?dpb@emf;rT)MyMfrJ`Vai3p=h%I$hM1ZKllcO0tY zkxI+K;6P`%dMsd(oVLpOw<3=9sfRxE78yiO#EBNbtjOkAes3K~U_LnFm|j2Ootf*rqE0w?<^`fCWnu*Fd8;w+>nPjK zbHh*hU-a(!+^Y~~ekI?ZQWZ%0IS{bp(&;fK^4b}M>HA-dZM^}_*f`+4n+aZx9{#%~SA%Sr9xZH2PoEZ+Ug{vzxd zSD_zMRAkS0wn^$8x?@DBj`;O^wz4(jOaA z**)jd zLcbWZ%6%fUnql$W%r94KHQ~LZk@#&RlVL*&N1c3G!%*SwA~LM5G|sD@DetS#H9ULW zSOCF!iwfuX8L+=N1*f`o^*5OQw-oc!Q8m*}b@0obD9Srg3(agXT%reoRUaLnd6R1c z71n27*JsTtN!x+Mzlem_$bM4S8bU{YIKwy6It?8JZk3P8fgcyjQ34Kcb{mmT2R16A zTcrv!kD=qfyeXRVLP-#;BsMdLBUP<)+n8*XWK$MdbdI(bwHyLyJX+9$H*@@-iYf`r zAEP?m*2TyMY>{s9Oh+c<3?sHm1fRt=_D^&(9K;URuV00H5)3X&CP|>MZcEhX|MJC5 z!S~-!gHs~bvD9-ol`XxV!E^0M6lJyI&o=L1n(+-Wd0n=fGt`<%Ka&nO;-c(gQDzekV#b*Mw3aw@%^8~%*S7Qi9l!* z4-;qoxKXu=CZUiB#HSXfcU-=uFj=G#*sFXjMSe>tW1cW>EDDy13#9n9$R{Dh)Wr?B zp^$)$wBj9TlOWq!-}n%Cpion+AIdj-=b6@1r}R=H28`wOFdsWzyBbRQZA2hSMGv!0 zKzxnoxJ0i0KQJ|Ns<9pw`@@$eM^EyAg{VuY?={Pvt-tX)V5=U)YDmCf{u*bGq0xcD zXo}Q~!2lm~-`gpGOf}>;2w2J=LZ~f?P2Sf0IVP2Mm8P2N~elEmqxyNazhE`1|f+)El2Iwa`X!{;kv_ z92x(w>uF5pXZC>X;~L_Ozj#SKO%DzB=PW5P^IIkS`@fzyEF*#I^hf)~+%2|{Chi*Y zhN#EU8Z|X3+&m%_Q^o4dvg8;!Avq_I<$X|y&TqlaOjF_|x*P@8-6)Z+Uy1I1K0I6} zyC%jyad+?veQ+Uh8A9Kho$52)_D`&P#j!x}FVFnyCIeE^Rj0f|9oC3SRX;)TsRlbL zJ=2_@!8PS=gri{a8z@ceT6`28YNeOYTlfTE%spB5b+{%WNeY_v!RyYi4DXQmPeH#c zPyc>CfXpHTzqyiGSC$k${O|)3+5<{1*Oy_cbU;-5^R^1f^mHdL)b=63O2Z;iNT53ABWL$xXY?Q>AT<2PtcTKByfSb+KKli1q zcPVf!euwR!xCp7iS9aU#mWlm>cXsH_bwtS?@uk#sG(PxZRWdJ)Rd)Eg7dwdKKM$SZIT>Z?11Z&($=#o$D|1YhJGWu z7=4L{1_)%zSweiVePw(6u72eu3q`R?{fh}noKkpfkUmQkCHHaVPl;8339Lj|uK72x z(_Yo6)oLus->I4ATV;nnJ}+7elPyU|PM@@&aQ_WHx4()f+q)F$DoJqM&gx%AT7)B5 z>qnm5&9Zjsr>Fuei4cX)HaH2@Y~gZS`HHPZ7vY@$7`8hA?LOI0&rVP{LUxr150)?-t6PBff9+lBxro` zYkP{HlFy6D)tCDP3kgIyuxNR<%4GlqEDOpi9)cN|6R^ngb>Dx!)qZ%A8!&e$a5KNp z!_rk9C&;4+-8O#BPCRWeO|jpn`KS?Cp{k!r9J`Kh;56$8uM$D^7)*v@rxyj8Itjsb zrolc<{I1^VW`XKFv2F|UisN zu}E@Sxgc#P;4A26|2umSa0Ax*XVBsd`jybt#lwJUQg67+yqs<0HOK4`3cn4S{9 zeOW3JdCD<*Hf^D<4ckQ8ArzgOQ0&PrJfqUD&HIy2FB7xDHUWJy(&`_ao1&iP8(AxA z!xqVN|266UE`=LE#3?(F*$x1#5(bcjtqupB73Z{=^IJeKmOwqfY>h6(I{x4o#EPO*VJHjH2-y zSVHA~QAYKXpo`5G)J)5SdSuhHv^}CA>eBPPc^1jLQQS$=)9>XybJcmw8 z9p(P~#Y~b+Mk!zWI}6MLAx7HOQ?Br)&)TA&AS9W6D@t>`Yr}CSV|tkWc(eZLcM}$- z-Y!uhFV~<2n;xVPD#tI-G?ra&vM8)s?mMJUMIy4LUvv>R>eB0SK!G-N?Nq{eoEen$ zy-qS0o9^|;w;P@iZD$qCI>0IZBeG5&f8QzIvV) znN5$V!w~XQu~{gHUFLnZtUWH#YM|_}=BJtJJ2uKbA6ywn;OcoF#N2l&U=g!r6;}@% zq6C~*&d;bn|8e(r$+sxLo0H*g$#21 zcAGq+Ah>=DDE~L~J1;R@cimGv2j=QVNU|H-HPU#gZ0xJ|MRV4V)Sli7^32aLv00^S zrPzEZVJXz1)6 zb2+pj^mHrBJHl4IS8FeXtRkTCsW#nDZ`Y{rM^6Wvsi?5+0dM~a`2z{URrYDUzj10T z3Bl9Xs`=N)elf5;pH9Da@v&^yDGv5P9xMPwyv% zHH?IN3HH9TK8XJ;{ggtaU%EI)1Vf^wbzT^JReTqQ?={=;jBa};fK`)8QbN_<@4=x5 z>8K>l{xVnbj@_P%7xOrxJlxJI4D7SQ-5uv4G2=QxHSBOYa`3&#pVwfJ3rLWo z2pWTJd&!>%BaTdruS7!21}{o-p+Mf5#InYFkLi?v?9`BkCdh??G#0*TcGLow6YoSb zFLy*&A6mR7G>~DQ@Cn^49RN8_$!H1axVnFKq?ks#)FT+|}Gw<4oX;eTs+R*lz zRKy~G7%tynzQf=7Ohlzv+B8(ZxceWlvQ#UY?IOrnSmiCZyP3KrW7oD3lGihZGxft; zF)zZa7RP>G2nCIBgL~3gE=pq9PuH48K6M)>50k{zxA@-8sBi<66*X>2PEvY{!f8S7 zwUit>>di%;i&~7v+};|{UeYx@fllXcTg2I_4gye&W?|FD6JL6y`(=-}!VCjFT+Q~O z10^rep3I24vUvn|@f^{Z(A&kZ&a#mJb|c?sGMRnE`+6DC#TND->)n9sljMeiirc#1 zxzwkQF+uOm-+Xm6rVFgl{j5!EX-Wcx3*OuVbp+q3Et`RV*RvP3;Km2^i3JA~jtxx) zCcHO<>>BYb^pvfe&@5lbv6{g9xiMoV3E&!IF1)!rn}7@m{Dt(-%vUG%)S*4dAh76X zl3-_(!Jw>R1uMyMEG)`u!pK&|#(uzZqh^+gYyRTCA;J$$`#%6MLC?N{xfNv~QZh{( zpqZQ?360&y8T6-wiB}y@rD}^+BNV2<5HL^SR+WV*Xl40ocUv%kV<3yUTMBlmf!_kX0@8xQ-%A+nDMzaN;fCkw8}nO#xtBBYE_Xl z(9`6CR>^J$wN`lKUPpROSlTr&xg?i9UI6GjRe5ijju>G#^|F zlSIb7!I0sk01iD5T5{X&Q0I^eBSmfh1EI(=(<$OD}5=}2vX z912{FnN1wDsUqhhtL$Ucb*`psGu<=qP#YjPz~lMR$Y&b5oa;tN0C0Pnca-DlTQ6p+ zIR_?~ZSkA|!0VdMP&;YWDI&7-joBFd=~Yy>&ysyQRign^%XjV#MwtzgHxbzM{A(^# zt};x3+aVcIgX#YO*Qf=Yq?~XMUTaB)e((cu?Mo9F#~I_LCXHib9Kq$2&d@)VLh&aB zi6H(}y7utOcVi9j%|!OG#-M;$W1mmLp{8o2WeAY{(bM1gP~@WE0fUYz@>sNyysLmz zo&n?!%Br2i<&bBd-D@_Dqdvt$y-z(2L=*<+oOG>BMn?epoc{pzsTE_8?8XONk&1&w zc0q4pH2IlEW9~&h>cJrY09H#9Gl9~#Y{j$yJ4!|~z!?<{_3JB-EMZ8_ag2|lqT$Qj z=RVChO{YCTKjBb(z!2c)J%wpYJI{^Gc3 zBvVe8b9PxG8`)I8G8Eu->yOg1m943=(9DiU8QMcg@IZ{}iqmfQjgUX+;QC#?%E>zrN z?EdoU&EHYenP<3p=3??Q9mM|tc+y5mQJfS0)i}mT-MErZKIW{%HVitc{4-d+5z!q* zwbU-GUH;7Y5~)cO8Ak`ycf~?lS7KspWaNxvA4=TP=F+Y19rbHQxQN2x5e~!VpSZ`^ z9-^@rVn$^I0)A2Hn#wX<&)u<3DJzf(XNz{mV#kKTJw5rWHc{C$Hw}5`q@V);ja8AG zJntoeQSJe#*cjJ^4c3*N*zgo!b|2^SqH=Fdg<%39Qm)-kPQS?3oO&>QCQV#kz>Jc4 zV%)5rYk#ybn?U~nfqoT=9JdU1DA|xSD+)PqNK%8G=Ve8-#85hEE_7*BxsLMrU%& zLy}1(_03wTQ<tC^K; zNLnv1Ip-%Np5IDx+`1A*7=1cZZVT-l2d_ElP_u%dV;y?`0Fg&CE0)9F;5%i90E6lL zsig44a(!|@6Af7vajZL=)0Ouo~d(-D)B}Og^ki(5_|~Y0tLlsw z01$g-nChc|K5lbT*`kg0DP1fvgjjcU!6bq+?Z#@k9K+=!4x=0LdhwpPrg@`q0CUpUMEV?1Z4YGA_*5CIv%C#U)LrQ3tJ=Zs@N=QX=M1b~7Dz;mB*NZ-6T z+*cl>(uPyFJqB_!QSNMHu0icnap*?aJO=~=)Bgb1PmXpNL5>g98if4A<>#>N{{Ysc zP~-(XbCP@WPnm}*G}7t2_RmVzhEhPrLt~$%bIR_gTa=OK^x7FekXrHQDJ`I8Cp?75YC9LKeLDKO5tWMQtHY>OD@n-r68XrEJ8gKH%fh zx#YMU1v$^HSX<*C8Lzj5;*ZE`(y1e&45~P%qbTD(^@24dE6V_CGpMN;Cl$A~iOcm# zzJ~de4aXxi83E5~=U)E+jD!9aRO-s7mLB}nOA!=Ya5H-&s@$WT;M4rlr|)OIaPO_> zl{o!sXti*_ZaEmN)-DgJv&*U_c8qys(jHiQ~cQhpFkSe1S+Md%c zJ?goaJmRKoAr>*@0N{R=T*^Vu^`b}4anw{z&T>b+b4|U@*hL~wHHRSe>q;H7oby$( ztIl~834r4wvr{y1>|GA#t)#qQ{&kon#tA+6snzk`w2aJZQ@N%k?52-2^aiK{!6P*( zf77jL%#MF%i-u;#Gm1|)CmiCavyM8NXPlt(#Y?D$sTaw?#&b}!fsEC0F!iH)_vGfW zlRv^Qq*FGUlk@XCpjUJg#+9Ns^Z6M^EQW3{>!Q^rS0{0nfEK z0uB!Y(x+2okl`W5N#j10zII6+jYW=5Y08;6>yPC{#Nw@T%x%VfYV>SQ4N{B%039mQ zXBo~%wQEhBwN|CT*yA6CO0B!69@R)N&S}O_gM-a=DIDClFYf~&nqx{p$m#X0@3i~= zRS(*8#b+w3pw$M=b+|as>)w;kz&zF?PDf6Z!#n<6>OH$HVOutu=L3#&>rsoG_r+uh zN&5bEDz!_l*?(6{b5GAcwDp#=)q&~OrW}kO{{V$GQJGGfEtzx8NRwl?6-Y4759d=a zBdt=NrgDXg>f65W=}%Liz3WvK*+zQP)<(@}pK})y;XpBgijhF7;!J=uQjNU_Q}0?P zV$<1=FV`93hTEP`=Rp9DwFy!?@l|k*t}WhCPu;~mf8TE1LS#zbqlk_ls- z!vN$C*g5Bdc&ZXc-|IGmq5 zX`g760)eotfLGTCBCYw(%DdH0I0qQ%&0u#%Dk!ZSvJOsh-@jV0#SCoZw&T+r0DbAi zZCs2T^;I1^b538et*LohLos#2fC2>Pc20A*#j2L|3zLgVZl%cJY6U%oF;X?#m zk)8nQ>+ep1e8~KnPX&fDcBuOBbNSN*O&j@dwfF}r*&Kjzk>A(et(eh@j2|s};~D;y z&ui**w`~lIrC6PjPT)Eaau3k)S%uE;mpLDeZ(PJuFbqNb&J-Mm9-IO*SS=eV^2p>K zN7A`!?siaW*AsBY0M9iWwg;iB1320S0PBi~?O|N)n?WI&+Sv zy<*Hd^H@}EYI>M?C!t;CJt_ui6oJztH59V_Pc(?xJaw)~PgB%Tvb#p5xg=$)X5K(C zkXZvQKiUqiFyy#tR>68Bc)-$G1rRG3{YeqD%FOjZNodJ4u2}w zx77-DJu8Vf%!dGs3VL3d9AFdlt4#!xdmgE2uOwh@HPhO7h9@990giL;UMU>=M)%{| zrd>pi0mv1+CUI4TwP(@RULmr^3k;t1xSFI7{;Y$?74t>5p)(K#dKQU!JMCPNj8{x& z6OGlMHJZ@(9XjiF8BPs$ws*{ceA%xbvYu$&NjT3Z(!0wELk-MEX-da^89kBcklzvk ztvg%!5Ch4sKGNrAGC{!OHPJ;PN`U7Eq1fn)ZJmv-rIB3(S8&`$1K?MkLo-Hp=OVUk z?}A_+b6CwThg2li=SwZRF~}yGw!q_`$2Cqnu;bg>tf?)^9km*ptyY8NRE2VKewBrB zJVl9(2qw3SGYzlvR%F&qo!yV63f)MOZ)124P-Fs_EAemMlr{?_X`}z7Yl{by1r6O>f=(;XoLboKgyYb+ zX{tEJ;&3Z+9ZckN!LBHwL&p^LoyQrhd73&CZ0_aM!!7}?dg}g6oK{lYGj%l~1=l9C zoZB^pHM=8wxnGaYqXnO>G>jYyw1jjDGg!GDDK3Rpgw$dan$aPM=}$=6x(b%Zv6>+y zjw<9(VCNNiZT+g+TZI6c&PLSk*&Iq#U<~H2EN!2d6HkFgKv7$9L(sC3#|E%&$6}{_ z43xJ$Mt-$o-6G$$^26Gal}=U}^3q#sSHwcFVXN{{TwS zR_tW(y~vu}Db6{m69{vWN?@6fB-CcYL+e^9=2F63xVM5X;-I+I6}V6{O{3oJS2fVVqNpEtn$cY?Q-UiwRBX{xOG_NbojWaF+8Fpb=eJ0cKQ)+ z$>dN-116gI6?kO+=$6NO~KON^ELtChZ|Oj77jGLlN*{XOc5joTpl*1)&Rn9T>v)7vzjQRuk*D`eY-QONpJ4X_)DAYgHv^XxdJ(0fT4ikKsU z2c<5>^vzrdpkxi$^{VX3%y%v-c|lE#3Xb?y=kv*-p+azbde+sgyeOh)a52*zYP8!t z(($f9=nr4Umno{1jA?CUE9SCcPu;*hJ?eu;v=NTvV!B~^r3_5C1oZD&7bpuE2601* zv2m-djE^TDOwxHud0g|?6>XK6XVRIpfzRhy$|;@H>NJRq7V8NrS)~W=l>u?}&U01V zg1bTmBe)sGUI27s_@31Z$CWtgS-3N0T%a86!vI?#=b_`b(x5Kx#5djRp2Ds&Fk#34 z09v7N6cD&MtlUjwQ8J@DC}1N#1Z(<@16p#r9QbKml(HHbj0 zsChNAtd0Q1}Jt4OEz2I)X{cTlH9Cfh;qQI6Y`$Kdi`oCK3o;#4l79wppYAc zXH)&&2>x`TExM=8&jTP-a$LV^k&FA?-#-Dnjwl9I&eC}uJ#$@L7uM@zKAU@L9VN@d zB9JADOki`}PjUHTx$EsSQn4X!;F1u^9e1fv%H0U{1b68|j<%ApI=X06#DHf2kMr&g zUy}OTZ5}N-tfTuxGc%>qlCH@3%x*aZ1InHV$?L{5)2~9<{{TI!P-)j@+)AjWTYz__ zN3R*r<|`WX;Oynl+LW8v%2knaqye~&y=vIDyLAkZ9Aksu`PFkQiIi6PhI5>Mg;x{E z2?|KhzCV>^?3uSYzSgrC5(Kp^KT{@o$Dkk1vK~2;{bGzOV}b*5P%N?n3zL)et$iCs z);vY1EryS4CCuen%BN&OmSgCuIVAB}I!-#Wy{VW^K_p~xj&N!j9zlSr-7rQDIP|X3 z{4a4~kL^o{ER=vk%K4Rn>9#O85BLxR-l^TUgWnGzf)l-}#kN8_5pdzwaZ zdmO6`$T86NI2ffdkh#y@^rtM=)6M1Dv3#%!t&QCF?OhGUzKxV9XRNmg@kUAkM4+MgL zK0mD&Lq!>ow(LFzdG$41AUF(gPoUaos7U$paM@+uhJ#z;5>5A%v>h>&}F_sv@X zCg6Jyr!^#CAllg(qkot*3_@%kaqxf=Yq9PSjxG{0QAV@W9ll$nDCvBNI4vT^|+)mp+HpR zo}=7UHDZ&wO_fN&>UpLZP;ds(*OT6-oEZ4VGv7QP#;Cbt(BxyB(kRZEcDV=U=A#iP z{pK(U$4u4W6p|0;jJsCU+}} zcc5&5xjp{?N{0nN$QeCH{{UL44amD2F$Zbs)4vsd)VpoT$o2mK_10WW0)=8g_4?M0 zyvT>9;Ck|S`qiT&ZDd3^BR<_fI=ya zp0Q_#jml|a7cE%a?;80KVkrk6wMuPW`5<5eT(aB=4hKyAd8q`glNfG)kguS_@f7W5 z?tE@Dfw1lKQ&u{N^;Lct7Q!Vg6PMB$3DMP{uPGOax>GO2U@oixe7DKr(f$?$1rPSrQ{K}ypEx7muOr9anv3v zGpH~J9-QNjE1qkD6o3yO(yKJm46(^1jCx|aspb=E$DLmwq_#&$+M?qs#F5sW9;%!I za(Z>HU5jJp1b=&;{{UWU7j{f28?t)$$gMxLTHTzV*c{qL9bEd5bqa$A*E!8)O>*o> z8PBz4dFOA=GAJ^c7w(bUKT7AGX1bl!cxs|oM$NVU*8rTF>us)>fY}DT)S)g8Kpx$z zdK;EV*BK=7p4HWc%wXQg}CnWXc zSED?7=y)*7C3`e)L` z9Uu0N4hhMrS5OVfAbwTJnL^-_GyLi4a-?K7ds0}J&`&RqW3fw|oaZ^K0_fwo_ch1E zbVGrh3f4)31GMz5V_xXvtApj--xr&4gHnB@w^Lm3n~Z;vPxH9Wed_(G%r83Ktz!vE=uZ_Od~!`ETH*C%jS+Cf@y$;h{=H8%lo)jer4BKH)|!zLq>Z@d4f6WZ zvMA~~_4TaST* z+LUCUmx@+UO)mU#+|nxgXgqP(KGg9k&&oaOzDUT&>r81%oM*4;O)+v@x)|}3NL*Df zH`Ml|^Kv-mhc+I>u<})MLFDo&hCn{Q)|QUar#=AbSJ#~G&} z29@q>%1$sdj%rkFouKjsR{??a0;B~&rVgVZ5fXZF>(Zw-u@E-4 z200{jZ)|qYdTT;!AMSW21bQ>@p*%z*_)|imP7|E+Nj*IVIOn}&>75F@-Ln{$7%IeZ+pShR+dO?e@#$MP5U2&? zMpVf8hDwdxfynm#Dzs@3aMNyJIxqR@j=k$PtZz=DW@K=wIWMrE?+pI{AZl+dhsl&> z2RRG0ocrJ!y()#}06gQb{{UMR9t&ig3=V^*6%ANwt9q23RaJ`}$FkN`yD$JGo58c&a~Rs_ME*!^rNAXY^v|tw)v0s7g&tL5OwK{Uz@#qcl7A|!pE1X8TDu%MT-GbO z(s1ND z5C&?gC%r`KNO7SD(9t*NqaMDLCFf0~)@PLLGIQ3fMGItL)@r1Rl`3gyZNYR;QhL_p z6K(+KHOh!&9qVe&Vxy7BuF5qeo~M_IqXw>yqA57%k9tXNanm(g8-*YTOdnBFn0N9s zUCLS>Y-w58gfqx~wRSX>6c8{!DwfXHUo&&`^sV_LkIMl-9CM!aq+@+TZ6slDJYeVdTLm*&JRRIhXuI6#(LI`o~~4{ITgq))VC3Voy^AoV>KnWn2nYlIQmyw zO2%@jIL`4sV$)Se#&gfDb~=6hdvIGI*N<9UjEvV!Z+a91zx;TvX`|G`*Vj|j(%~7t zM*Qny+jAe7=hGGCcDkr86h2LN+GXKl25T949-TIuJIgdv!L77`Kp5t^+be|_3~Ql| zL@AJYteZP&tqF{3IW;tXUOC4#7|er%QF(5iIjMFvQMRR*NSNRbD<0|~au%&TuAg|~ zs(Int8O~_~UCu{Vw{Iztg?#JdEjmZ@0w#0qUsGQE=s;YME6e;tr97dCKswfnMlLSr z#Tu52CiX12{KIWc@*{~bCFo{#1pl5 z*Y;;=BDj0Z#z-Q#Dytri6Fd;D&0i7?m=%ui$i+EiY-YJ-BdKe#r?eB1Q$#VEtrUQa z6U|yeSk_lHO8OcRDx7gwqlY~ORe?Yp*2D}4Zhb0T%{`kDEn2M`B2a%SwFonvsDyjg z!obNItElAl2PgjktyxZOqpFQNYGT1-w*>w*t+xuR)Oyy8cCC%Y4n1kY47LEScXrOz z%M?*a$sH=?y0!=d8Lex3D2nCSXZxb98)&0I6nxbAdy?hY%NESs5mPOpQ?v@)wSWaB z_{j9FB)1Fz3zO^VNkx+?isw3(8-`CO>r+Rj?)%GKG*$tQ0_M64YZQV!6;>`gjN+Fg zDOFa~;^Wfu#@e|ajLrNt-r8vEBMhFstGKf87Qc6Hv)E}@moYW~c&+4hB%A;Wsm@Oo zHfvB??0B4dJ`M=xu0y5cfWMu3j9wemC%`5QdV!r9Ns>wq)U+J`v7U9w{d&*6(a3;RE3JAWE!fC0#^x@&NR#={H= z3<$vlcE&0rrp+RGi3>9S0C*|K=Sft)#6~RRWrdGH#YVQ@-WAhJX3N7V81|~d*Pc$% zT60{<=*)$-Ty5j>r<(eYVg@or z3SMK3WhZE>o>X+QPC2KpmcRp#YWop?We3EAQPe z_BZiu<%pYA)oe8Df({|W&5um7@z1tvmhm_2ljBbgczaXv73QU-y}p|R+&V`jrQS3I zw%ySv2OWv$*0cKU8`()0EUyt5-NBy}2oxMtb6X=R?^~D9BrZbpk4ngC9Xc*^U9hN+ zDp2M*%Zn7r%GMp#qM#&KS#V2p(y^}MEVu;MOlq9-r(=kpDo-^+M?9QX{l$~HI0mz1 zuyI>^LmM3Yu6-)DSeob>$J83G)`fF{SI&gfDaG$hnX=n(Px7k<7yPPt?Op!x#yiwX zp}jh7k=mg=nzrX>Bbr##ZyDm1(>+ac&Ua^_O(d)_CExO%1w0bnIvR3E8WEMwYGWT9 zenPQtQ+B%*$jQJT)}#@+Tqvsv7qwoB*_)^7PS-Q$v6_)FJdTxmD`sQUn$U{R9lF+( zHiUMiWG7LSV6bLB-qo!gfJHoije7q8f<6xT@5XlUUTGFvEN6B>cRL8;1~JZhwmHBc z9G{`DNN?F|;zmEw<&r`05$bLfd2qwtshO8UikA+T~HYCEbT+Z7<1gqknN8^ ztNuSz=(wpC>21e0%#qc;>@X)u8a*g!32E3k#J85IeY12Mx<7Ly^HGX0TQ2U0s?^ zNk!;ZQh+@c&QHEqz}Hh1mo7c>shj%%HRl_dbV+a z$N=M-)lAA%-OQVV7D}GJwa;AaUznaM{nS?xk22sDMn0LWiDi$FL1CUKaxO5jMnJ51 z!OcJ+^v~nouCu~N-N&XW14W*njVqdw2y%bMl1Q*P=RG|t;<9zmx4k5!F!vRDSeDFr zA^_*#n$)wiu$Dd2z8knC3eT4~+zxS7jD&#IETsCD?yaGQMo6SA59L)E$Ze4lMlwra z8Vf4*IpfzoYBuDIaZ1HpWQfc$)cVv-2*wHEcB^7GkmP5R)6%14C`lL~QDMeN&uD_L z6%m9Uy-jK|2LzK? z0NIzHX8S@$&mQf&)DkyiJA3nhc&4;0=kE;Eu-VTm7-L{_la1IJ1K$HRGL4FJxkgB3 zgn=qFWR1Z{BO|f*%~d3mo(HxuThm`^QrX3&-$-PJ2Q3!=0GXrpRXNC0)Q*{|9#XSp zam^@R-tjz*>Y1YYL<^zY>k(ZmO7{;8mj3|79?%(E+%PBTMPtu*bu3?Id0tdNLMt4q zXRbXz3{}Z3hW>?sNW1zX{)d<+)(|O2Y*P%UYM@-SL zb!)iv{XR1+(i4Huamgg`00WXw09RAt=yWK2Lunt11AT{hGOGN!9PI>*VRvJ8ImLFm z_lrE8CiX1?C~Pe*o#0ahVIAO7FqsFxQhV2(h{eh;lALb)^gAiji&v98PFeJONlbSW zNh6^-@?y&I=vkEhIIm3b4zqa+-D1J9Cmr#M^NlaVw-?uo zCE)TcLEj{^e5<$Wah%rWuAN}|jM|Iane>Pm&}VYNxDS^nBRKx;Wm>N?u;WU`F0&=A z{;?#_cO;7=a>}O!=eAEz#=D5LjU!35U2j$p$ZjEDA_h`cB^?VX1QsKoYR9?pjkIuo zW@ssb%vEEC1sj<51cKcDbw^OYz0+W6JWnG%)TkCaIZ1O0uHzz;ja%*Y4)vOQAlN!Wi8-SEV%d1)dTUa7JIjO34nwL zka60fSBi7{>D&@A$K4tHXp-z*k5RGlKZpE11U7nHS5l?1Er|*sW<7XZ@O{o}j`0tO zzqaQxO$x=6zzk0xTB8MxwfvFW$08u;WX25|zJqIStsb9nW-2;922Xraj8bKIl?< z`__&5j^0DG`0nlt0NZwRl6HaZ?rW)w#X7~7oHVp>*4vBVDCC~MHZ%BUxoEC$?bFMK zMF`mFe)pwy{v6YvRDVA9WQqhMd2`ebxFp~Ti8Z?>+SqhoX_f(fCBERi;a7fszMq{^ zyw>bK$Zc0mjUV`2e2fpTPJV>fW8x1IXqJ|rVADyNK-w65qdu89uPM2`c~}$zHDS)? z-;>{*Q-g0-Qqa2}ohd08$vof!PwD*YUL7k@kQP`ZAY(r%@9D*5>9>)_*lI8w_lcXWzg0){boyV@cudTauQOob>(Me=JoSy)RL-8M(EdAbYY9 zKT%!uH?wJ*ZYP}z6S-N?hsgB=b@#4sR`I3X)ylbLk~q(B0B^^P(p4LK5q6GPMCiF~ z!`F}gwN9_Mo`<2uYfs`!`}7g4aYCE|7X+OCAN_jERXE5P$INlkwu5bINaT4>@oncG z--TR>qzqYGa6P%jQ$;(zU>h9Z^~tLWhkg|73;I_~Q9Q+?jrcr_1Hk_PJ!*0p;=$pE z@aM3qt0OF`PB|PJwH%=i;sGat=~ZGz6XXy=D-r$So(^ga%aWZAatZXOvnvv$WcKv> z(?X#cZ_a@c&AV!d$OnRP?NeKpL*_3H{odTtt^#c>hRDaa{{XI^9sw#C40_T)LwK!q zGCN^#p>hXYekY#QPsvqnsxS%dT5V{PrioZ&C^+gt8R`7G)@_zhD7g8!$2^YJS(BN!Oz_|+K^!39ac?TSiP1OL?gjC`RZZttZYUK1yPe>$@w6T2KAO05z* z9fNQ=&!FSlv^^ArjUyxgMo&03tSlBUmT)&59!Daxlq!bGjl-OG`u%D+u8}@X z**(ekpc!K3(lR$kkO9f&sYt8|1oAp|s}tTZQlWwLI5_<4CRPV=Jf6Iq&(>ztwXxL%%&r?kcL5m>T7q5Jpu!{K$wC!$s<0JE@Mk8QQ zLFNo_!#NcBnh4NG7&!x}?Vi;6g~(Y?EjJ8&*vT2BQycPgk6-iJs4S0wbCNoLDwH!G zJCaABt5R!XTn!XswBY;Tbv0%@DEafabOdo(ODGMD=L7O0rdbYhTO&MRCb%#MC@RVG1f~(URWMc zOfmNAVLT#z4QFN~uO6eZKhC1xAvoK{d-kaAwLLP<0AP2xoxK+dKMu8$x`JGE+z2@U zt}=S{u9c5Zsmm-1>}@liG6DDcP$V00kHPLMBg-KgZQfbqD$Rm3>C&Q(8P3#%F)VYz z_2^HvYYcKZ=YUNcrPp_FOyZZ!bI#G8Fh(+KHaS`ou)}qhLyphxL`t_*1+z`Nq&vVk8@!n-o%Oe+} zC*6Wh?wxVglg*7#?ra?N?^Pw0NGEqZo}QHt+aVE{SyX~S-Hvly&ls87uwF&uc7O*N z^y0KF<=g`~7#_Uw_*Xi&5e03bM^3cAY5o;B_8jJ}o-fSCt_?jJI@h}lfN*d)6${D; z1fRR#t#d7NA`V!L`gi(@V_!cp;QHj(O3YeYo_on@$=xG=%_?!Yb5OL-PU3rX9ltu~ z{@Eu?bv@`85;s%dwP_5=_c<$M6#E*2>*o1}27g0Wl4ZyX&rX7{gEQf{>(ezjm`A(Y zA4>0|j$5SjwML>jBWx^ z(W9o_la9TqOJ@W5Rx(@@&!t{TLn#N3O6*fdjXDk`(AWfensSrW9zE*6nu7!$1vzBF z&reFLm^eEZP~d=1H2ur;s@`JbJf3M;xX9+MNXfvsCj%YLS&BeN>sa1k>MD4qAk$TK z)QQm3L#2*DN2wJrnURXbTY>=`RKICBCqJ!k&W;B`+|({J?}|;tA9~93`twL82ftr> zIna9sYBYlxZoJhp*(8tfs2V^>&orK5^argzWHm{l%=kQasQmWMJ9MTq`XB36%bc8w z!gJ`3h|}(g%&bqL0+36PN&aXzc`c#Hh13Ad70d@e# zQ$f4Op{n-LNXzQZ=HHwT10PRXaF}PVb6oe@i8$%&R}xI~+KARogs}EDMZ`f*3|}CE z8;p139R77OPS1>v4P+yzIsHDhWnVZWirGl#l_YOQ{NuOstq92@2C!jra8K)6u-qyP zS4BCVZE8(yX~w{CN8)PqY}|f^vLm<|;6&v($I77b)~URljGR?AN`R7{ z52aEo+~d-nB!`v!xvHLS3F}!lj;KMFb}oLkR%imNjzbNnX&jvNpvv2QJ&#(2-bc$R z0gnLp827B(M)cy>Q#Hs^0O038;Ys$GRb}3;(hvk?SSVJ=$zVY&F`fY&;OC4PE*G4! z1h56Rf&DwyM6A1)U?6lkIV^H{1GgCC*T1JNM$m4T}CnOLL9@R0qhhmg=CkJ>S01k1+3CPEOKAp}EqUvtwG+Xk> zKQJWc6&nqWgMdgsc;le={{SYU7plz27=g~l0G-FMJn^4urEz$%W-F+OV2l7@N6dHy zhp_!?8C8lkrH7l`g5<^%E>8Wq01OQ0klFV1tf{34*^%3DBWVYPQOQ2Jrd-VtAlrrm zXbcDb)0+jq?r^)O%|iyd##! zM%QYCuS(0F{{T7fS%y}8lT9n0wGyn}#+2}phO8!;r0Q!q)rsb`#6uj4kzz{4#kO_E zs*c7uh3Zie9Fbc7O8Qg9zG}UY-X$3xN!w5u{%%EdiEKI%)~h|ICv6g=)QIBM>}3=L z0gAhC3LNp!b))R>+*PPz+N7zbscI^fuN}v%NI3PYsRF4D>*-LabHEj+X$zbVKN{Yg z70))UMwaD^c%mbb*S%=R8UhwRzok7=5HYw9!-_}p!Qk|+ix|dFb6yK!w{sqyvrm-7 zi@Y44Ls);>K1zM+fv?2lEP8v@^AS5+V@g}0&&7!`_U&jPH%T#!aF^%Y93 znZ-Iyt&W!3M|@X914)1fO2M#A$^q+|>fw!&F~%!+)j6I8ysypZ@t^Q!O+FXQ{U>%BUr}*FSx86zFoa3z+w@OpKB_?OtCk(jCg+15;7zXB6J&J#nKe zKv?o?&h>pAGFWk5uw-1El6wzB_*X5d*_m=wd;3>4O;(3ZIi$}Oy0sBDI@Lu0A8PFN zZ8gfA3=z$7k_JZF;|9FxM_V3@WSY7y$FQCSY1_o5g=E0X-nQ*XW*Fk4Q8uSLJx#cx zP^0Cmkz10%lyOe93hRdLTW~_Bfq_^wb@L~xBesE%?m73ZxMYqndK~(Ss$uenzj~NO zk-McsHHTwJYB-O}3)Em#N;h@mJ;g_F4jdN)9)`6Z(HCon&$UXqq@^8)TEgVvM;`T} z$RoicarUa}z^I9MKBBKjgk7~qKRZl%<+uQf+_Xcq6VU#3lMD^GclWM}%H8vm&{8QT z_cbk&GmwLxwXJ6ZTuQO16EIYcB`n0BVPA0kKK+k% zh;HmPuNrERTC7g9J(a4Ll;e=CCPJytTn75qRdE#P>rvS6!)5g5(-qSQk1Sum5yN6s8kF9=)X?C_6O{7|Gn*?_D&?s2ri9(`*=m+af zid7hfJ^%m!eYmSH@~B$Jb#nbm%KV6ywo!D}6>yVhuXhJNbqrx=2t= zzl?+K5Wd8uNpbyfeiJAWK;+b%vS0MDN zok`2$Y?wj|WN}_2_V>O|;WuY;IdvQXtslouFs&sYIu@ zN<8!HQ#!R~ttmFWNrf6z-Qg6zMz5L)z-paH9M&J&m~sV69PY>FHH(3*&3AG~9E#z- zChIo3FT<}9>KC@c?g+HojnFZ|$+-&cCm`dVan38VSNS%9n#1u9kEHmMNV?E9$QJ6x z@jSVrVpKAodZ`2)@(4Kws+?^k-o(u}7MADX1?=Wo3n|4=Ri0MbgFl6SzG+{w{{X?Q zJ+6P^O!t3iQordl$o^12^UnlrKKz>H?Ee5`uZOn!;J!Ea@26y+u(K#R>^#r|ZT7}} z>*;A`G&XnpkB+I4;x4Uky!^6lGGe)W167TH#?}@45qgoDb<=KO-HZsXW6czq z`Gav_qoC_q5^3E1-j(jZ6TTelKMuS}KZf;phH2tNkV$UEqjZpD5s;*M5I{enK2JPO zGq$}bw9=GzXN@XuEvYLsa`IWK^1~cfY_`J(Z+}YYZgY$<#yi$gM<2;b628L++!Y;AOqz!dJqRnpJZ3oqhYZ?4m0^y&9$HdC#7{>2=EVy{CTN=W_V)4 zOUaZ2BQFuer}&-D6-U(9+#d@60A?ic-Rzpb#1UtxvMT+S(l&V`SL#|!g;vKvzcQZm zrOO?~1u5$GK706Q@CU?xK7;#8Xa3033Wkp6c-f5Ll0S608-T|okSprH3jWVO4?HMR z;`%4oF4G5n<~)$Yy2QMG3|hVIz>P$4C`3RNRYm{%km-yHrQ_RE`mSP;t#Z_61Z zIm~?b91?Mk_4Jf%$G2K9E#SPep33!iTiiy_$O*<$L9~y^(2zHDeqg2Yp*v1Ns3z5L z-dWDxrn)a2_!C+17l|KA)D!n|H=AoJlF`W-Cmi5>!=VIq_Q9?zQx?UVML1L2(D(c+ zNUnxp(KAf+;T|IU(TVpCF5P47y8x()yqT+zd&(Xiq|xC z8Lghwhuj#h0nSHXrEw3m{Jkk}FP>sMD)0xlTF-lfk9rDGB_s#HJv-DgoE+yBTu4uP zVUTn@)$;|3#I4snRE;moka?;D1Z43_6pk~-X`(qvS=+WMB0HLYIqE5dk;XZolrwPc zfK5AUlb+q_p_gzByn#}Ufb|L~*axV<$mDe5qbr~z*Qg?6xtNac?I214pFb5;O z78{vWAp?_+KQrxCHX?zZ{Wuw<@`iVH{*@*eu+LmoBqZ)umL%J-j2^khYaUBgEsfYc zO>}Z5<>d2Jn$$>lZpZ7IgLvPegx2ax?dUtwEI2(6U&^<|uGS@3)oGJIF6Ir>I2|e^ zlR9AJjCRQYG06vxO*?#GkmDeF4!@09k^#xc`p&E+=ei z$98ZkWJe8+%0GpV70_u-f2dBDT78k8XCYNnEKYdsUf|vhf-ehe??(l&f!!dIkD8M+B zggv<+kUt~0<3AtU>$-eeKC3P1xrIQ7Wy&~`Qp{Q83mDH}tBir(yy;Y=pEKO)_H`Rc zY;#A${tvN`iyMo(i-+yGS~WhW<-z<7b)FybCYj+&cU5?9rcmF!YjpDwoMQ^-apRHF zyox<~_R=P{wUMJhPwxusZ1g!|KTfrV_xD$ltVZCx^0pg1XFW1&nO14t9bU>UT1R`V zURwB)^(MZaTV<8-!QXgrIRFEUAJVy>60Ei`n|m`MvnME}u(^gA9xRA*y5;O-`(BF@?19eVopy|Pg7pA;vFl)x9}@?eiLsgOr52q z4142tFe}Z5kt)K*L%LnqDYWnh@d}p|oy{Wdj0d|$#t>itq=0ZSkEx>Gc*!{co_)Xi z^`Rb*8_ERE%g%QJo^#w)o9!;v(k;=X8YtDL;7 zx%m;#1!@DQ!Z0`2cc%`rftABc{_DFete=BPTy!rCy6tbc@MEQlo+L5iYBYMqRlyU?JKILQl) z`gJv+h#D|T4c&g2q(s^nFzbV#aZ(^7zCAh~m8@lQT1acEGZ4$qP<`qb$oI(rdsE!8 z#z%9E8j)fx&jfe&t(J(%yRsdOA1L1b!|zYD{6m2K3Twv6jcMYru9RT8! zR}0u^i_LO4&mW~X%8c$;Vw+U$z|TFn$Q+t^S5iX#?hPr4*bp)p^Ur!LQCV2TIp?S6 zQ8CCRcsc9uij+o5mSJSOTtWqenVSZh_kIJb{8FRRB2PcZxY=s~nlyE+ss|hBEiq*nVe)ghf)68%aqrJHn82J9!ycZdue&zin#LRmg;aoBe!}*d=mW>XCROB%~WPBCRAha?megmSXKlRpG*vLD!h1alpp|+Z=nEPzWr_I`PRpXe^2{ z#Qi#xOcE@4?d6r-gvZ?nlm7tLs`wZxbCbvvtm;TD!Q^8D^~Y+J(IQ}Dk!Df>+?%?d zamb)#2nYm%I6P<56)G`ou1)~Xao(8%MRHa-+0rmhN`PDWitF?*4~xkVnFMf*vlrum z&$dsuHCqXp+HRV+Y#vtHt-!_<6Wf!4Ma`6UvNT1$Wn!gqk?YpG8TDNsOp-Abw0A~6 z^7bRp4^PUu*1yy4FN>coBgk!}5;N3-1~~j^<{`kA*5*Wke3x()uWpr_{hy{so11(80JmI7rQ?L{ z+^SC-_jNezDyHE5z55m@yAbLT;z%oi5bA) z=cnONM<`sbaB;>BK5*qnPjRbCWGqe{cPYhI9GX5|^{bgXS3k z=npvUQyZ^7P31zL?x+BB^sOU^lGuq+M@K%PG+hFPCxiYq3{3BlB!`|tj2gvRQNsoV zbin$4bz(Lw`A#Ay|O3=m=dFt8x$MUR`b08&4VD>CM zJ?X1+Hqco22>CERxs&`}%*4PYSLNZ1m}#d)KW(Z1Hh)&@6)_Fe5*w=UUd|19t3V zk6tQ)8%N07vEKr$Tjv9RPW`)AvxcbCK2I{Bo|ZNeTrWNQ)s&k&cO4IE%61?F8R$9W z8bqD4aqV8rD_r>+*gH0KDK<#vtgP7|CVlGyDZ%4CD(bKt=c%r!)w(?S(6cqfxjnPm zo@69ooK|YTJZ7F5zY5Vz=9MEsTPOL{+nP2g;{*~gdW=?Jkb3h`JcW))_eq< zW6dPwP-P_X)9YBCdk+5qjWEu|hEE+msy(vU78SF9?F2S5Y3o1bT>k)^+rFE8?OB1JcRsafepP(!m`ajGg_ME7BAy?d8m-)O$)>a55l1mR zm)Nk<0oy0?s>W>Rtwhg`2U@7o;j!MLQZ|JfmsU{O$of;W!K|-5gYW7(P%d%zjbiF_ zH+W~z))M>w0QISS;5%{Nv6|rKgK^iKcE|ZN)lmAS&1bmJBlD;P+qfsaXFR7EQ&IV( zcckhTu%3hkqF$;7za)`{3)W9!Xb z^LJz~8T@LbNybm(Run{Yme@e!zH6}ZXJ+&!6Dp3QH3YW-$2^hVsLeVlaZh-(SM9+W!E|QoeS< z_kxz-lYnvCKU&L{{bPsE9XIUz;PclzahzklV=O{PO*{nIzjG=iDA1NN9EJrzP&;7c z=ieY>-?uq)bu4ZHVZq?9^ff|VVj`tRbNW_PnyV_d4+q!zR~>9rdNbC;Wz$bsny+?n zg#4+Ut@8qN>$f?^4_eP_-azT}J*yf`L(Il|4xoQJi6@Nk*&Ov1=g$(~Q`o0~wyhh+ zW@rS0aI9FVO{XAW5KChiCyupFD}-h-$m$Dmy^9c@_#gdxhTSi&9woDlnWg>02=kU^ z;~aG-G}esUyDj8$B#qBJ5y=GL@_7cb=WN+fis)zy#b1^p8037!a1KY^>DSy*eQ|RN zD`D1CBD1`#JoJ@EP{R*{)B-W?Pc@FvORx}d2;&52p7g;6PU22SeDj)_P3&nJP`%Iz zVui_aCJv`?=s`Z@bqAh0)h{(*XNerk3l4vToc{pz>co+S=hCy>Y}`S{?zsHxo=u&U z;}$|Ek~Je8dQ^A%r`mj#hSn=@Dm{$RmnK7!cQ*EJdB@ANV05VEB-Iz>S3KnQJql2Z zcW6T^oNlQXnu%lYnzE?FrDnUcX*8CFh}2Zzdr<)0+OK(J4wbB9eUCb=OERM_dsCuZ zoK>ZXnBWSuEtzojQG;&hJgcRk$n9A3S7Naz1-ezJ0%I%{b& z_xa6l+esPY0=X+`ha4K|EaVJ8#dTA6Ji65Rbg|i3NEMX&cCOyqV=9F>^v!WveZQPV zc9xb>1>ligkx1irv$4>_r5Pf~Ac89cQPBLOyl1XObe0crpdoB0xb&`tVq2x!aBHDm z9MZ%4PKSz5=UN73LOO$34Kgv@%tm^5=DnX)@b}8kkjJjyTJtOYAIfh!FhJdm9+iae zeFo@GD#h&{?()xMvGSz)0oJ@i&-W^$+qHBtGl08#@NzrWNlGm3 zgrmy4pGHTnB#`jqa2e~?n-_>DasVWE^{+F~gGh?fpO@=hy|>w+JC(9e;wxCaHZ+Wz z>U2-4TsRr;RUZ0d!yW}FaUuN~El5y!<_Ax8qwm~$UY&vstdL71}cv}wq53Oii-g&9Dd+}V1j%`!rZoc)LH7O%} zhR?TJj#kb2t)nE?ZI*bRDLab!{{URmZy>pCm?#flO8O#4TewS;h6AN}H;N)>R@j(v z+*Hd|VkK?P3eM7dhrm0rT{`JwX4w;xI+0nLDV8bry5xHM*Q7?`Xo3|4jx$`f6GoVO zJmr)U5+^!?O#=D7L2GyeqVa>UlG_Ofal(@lx~kgEv*sYv7;%$ z?OV2^7$&E>vJuKgDp(=uo+}PhMJ-KxSHKvp$Yda69cva85srG+tR(dub68Z1-0P)N zOB$iwxye4&Wh4kU9(|2L7W`liYf9R|-1)9Tj=b|&^7J}fiEX^ezj-I&S9jwGocqub zRddOF@#rdRdu5PvPJf*oq{^aYyFs|2QTJ<65Xj`WT7A8zmcK3s^R0V(LQYRg6l@F3 zEp34~diT$R-v_ndiu&L7PL9h25CHc#FUrK7GDlKRU^>@3@cZFUjJ_gYC8vgTx$aYT z*)BHifwEDcFs+Hr+gCl3#0rX65q#rHTI`<7>a3I_i-xlN~~a!*SRG6V!1Jx zxY3K(-sq2CEz9LvYExe6*L*biN8w+EdQ4WjUA$9j1vcDY`FmxU=RMiBk6>}ddNlH@ z9+h`#Er4>k{b`0YJmS7mtfx{=RUO&(P*H+WiqOq~kuZLG*4ZKXsw)bslDrDCpyLX8 zsZj>|k;@cvE&=AKd0|Ngw2H9LJpTYHqbyI?tu+8rDVa8$3TwVsu4rp%NzN&ORSq1} zP(jR4br~d82_re@ir8|1@G@$ok+JGA_|tokVC(c;MDk&9LJ%lU!#!^sL;MVrce3?NQ(!H2s`BE#tov z-*}r?)o?LhmOM(!eW{iIJ$|%Br-m=Jns$!bJv84|tL}8$3sOZet$*06c8}0Qv=Bt5SP2 zd0^_T-E*gc6Y;<(;woDgib0?ceNa;&qlS zn*N+&Bzde-P|7>)ToB&bE1zomi{Y=spACE@(OSnyCgS?wFWWDq7?NT-05WzU&k7H@ zB=b&FjlJDM6k3sQ&3Fd%d9P+z-A63C$K2L#jhVeOsuG2eso z{#6;1Jx5L{9I-h+g;&cFj&N#ynW~k`20#x6rAv*!F;M(t2RQu*szEvA8kJCeXyjq- z5dQ!@vB0JYU5_N>^O~_8zEqRap0>`}^1;aGj(T%X*|K@l*oAUVNhY3m6VK&VQWhL% z9;Tn=9CCOZ(BL&9qN@*ZYDI*Tll-dMN7stG6iP?kqm&c5MIt2h;-(gWocA@W9iV@@ z39SUN$5E5@rOHyMmgWSOs*klBdgrb&pTo5y+UJlt^sb=U{J2yZ^)&-RS0RTzI#no- zo-F4~Cjk!}(9j6U1%W($-bd$K4QS-=UNQL8YilRmZlk%Y$uWr5DoliR<)U&5;pGI*nq(iN;y3667|_NtP^jtS}Bw4`0UgNmx^as4VKNa}_p z%UA7vX>&6-0qXZ>R%zU4hI00SPi@T7x`0gk{|Aomw{ zaTW9AmP~x1pRoM0YsSQ4F7!RRG^~xk_(yK+;QrN)?O}miYA}&i^VEO?WS?9N3bkh1 zE|F&juqS(sLS>VBItEzVC0CX>`G+~iYk-mq){rX(P&oAlx+T83hQ#Uc!?HGDUPn$_ z9{s;M;FUgmCiFK?mt=Gnw({$GRKgGdjBjt0mL%r@W53~Bei!gGx4MK8UPQ>GmS>1= zb;6P|F_Z6(mD>C!)AW1YHtq|;Jlld&J&H*L43p5{0o?v|-D&mF3m0t!E@Bsv@~af}Vp7mT%9B z zVoYQ!#4s|WAFsV&eWP@)B+hf6o031rHEYh=0sE`Z80*bSiO{w)q*&yfx0K2p@IU=s zYMtypOMr63j-#GFwa~Ot?GExH4x^Fyah%p=*tad`7sw|7o}7ME36$;cVU9=2{H=@t zPamBtT$yENha-=<*FTL{aE?m30gv#n1KSj-5#CA?4tVFLdeBLuYk~th?&?l6^{r$H z9u9V#9CtO&3u$6-Np6|LWF9(xm8Tw|c&HOQzyJ>T{C#N+BE-rc=tfD;CqDI^Ac00W z-ROBWJlFG27=;m6J-|8qc*p5f7Tf0Y3EannoRiXv_a&~zouqx` z0Att=gY>LeZRFfGwnFwFophEKf_am6a!)*T1M#MlZpa%G>^t$-+k?mB{{Yvk(P?~d zDtSHYqmJGvhsoOm{GWQ2TMS3t-_36tGAEwKA-3{ZVM6DCN3~1`KkW}%(~>n{Sw{mo zCj*MkkqH}BzESPenjJPA#c3C709!fWe_v{vH80Da6yOi@nq#&$vCpOt6vc2k>BnDs zxW>#)laxG#z$E6Ug9Qk4k3x9OSAM2+^QNYFHu`Dl>ue zAHWKTl_LkQr}e9AwUoxg81(h3!Zj>%qmz|CO3c*|upp02^{AVJ{z3ez_sSIUxF6|R z?zwF7gP+!*sQDlN*8H5CA9!Srxc97?FiF55f&nMg`})^Jklcq^ZH66B2d*j!wCjln zm$L_)viB#N(Dd$%6ST3x;2!-C=}7S?=Yo3i+OElEGGsau2R|r0epMQ-(au#z-p@U0 z*j&h}!vGmFcH;xr^`xFqb_5<7TtFm3GkakG>Go53*|^EK;&Zw@~r*vkV|mH z5Dqys%elf$yb{I9%M+ZFRME!ayA7Yy`PB0Y#qwj05MphvdB>+T?LS$%v$#n?49eU$ zf0w7NR5Dr!w#G}oPXq3c)~ZOVT$CSx><6tT!K0+rHCDd5Yvv0Z%0OjP+;u-vd9Hb` zRFXbm*}yH(delq-lLsdp6Pk&aCk!#)Jq9TUDI*gg+8a0-C#U)PRYq0^9sBW8Zf`U9 zV}p)Q{{UWt$M+dogv zfmm{o4nW%3|+ zhsb*ZIsU%&j!NTb7{Tq-Q#ZCwM^1kXel*h)b~;s(2Ti&8liLIN)n>`koe~VKZYvRyiLDkGA>gjKMS8s z^sZs#Wo)KYbosgG>BcKo-r%Hb^AM+~>}um9Ca!jI1HwwX-=M~DKPrw$q-9?@__voY!SKh{AAenWJes@D%htb4i~ogOU1i_|l}JWjl@- z553f%!lVqFzHO{A#^cR;bgQG!uZC=JMsQgd1b6=c>r%$9SOD1D*LV0-f=G*F)6@D? zlC&zjhXnJ;siad${w8Kr9W}VIpeU!dQhl*{aRNvM87w2 z>sON(+@bY_^^KqH*hxXHoY`BqX(^JCVo z3xrecTScY0#a0s7){Z7Tj1Q@$-?0Axjb$~_#?|OO=oeTYG4`!Jq;@&JuQ$1?=Bsnk zu31B6d2oR zPO1fmcP^QTKQANop=VHXGoP(x8A_7<`-4m}XOY0|kLy{w#>))4of6)bAPna{>vqcR ze~YJD;8t?152b2bUF;x=(w-*IQ;!pYymUPx8P&NJwQD|pT-Tn#e7i;oTGNYBE1Vo) z*QZAmmZ#0)FcR4wjUCR@fOA%o_h&rUo-VFO1-jLPs_#s0#dpUW6|v<{DwBGnzy8$N zFk2X?n^j)Myy{IyC|JpYI#xUC_Zh%*%|%Shl-8C*%zAv#kApsC!T;aK(0Us|xH zNjX2C(xXKre-2N4^H&uB#sKEJ61l}Xi85PjYm14J3wWfKNeEO#Qq0VH00v1k;;ac6 zAg@qH4rEVBeTq#O z>s8tkYW@K{)ZqtiYaUCTUfsmV`#S?yVz(sZ)}q^R4^vlQv>iHTh|p&}Tyn8a-q>~Y ztpv7WM`2nq+5vzMf6}iln|}u*rbTvBp!Pg!*xS9#V*!kCDFTj$w_44y$jGXu)b79; ztCa>}98!C-2rbJE*sE&;9ssS2J2X`WOyv4kK@Oi2sAUEIoMO7EVRY2st&R7rjx5_a zP;gCVUSuvh8uY2OcZxDW?OZ0Q77H(>O2PBzt%CnNz#(L9*NPc6}^m7b_#r%9@6DVE#H^u>A3pszfnD8TEC zS6LiMa;1sm-hpC67DUL$-s?h&F{?R96ab#p(K_0a0 zT{YValE71vCYotj==4bCc(w-Z(z?rgITVH&8TG0fMTm$78REKSog+A7NkJWPh0B)F z$$$X>udO!g3Zz zau@QeYakpdiX^%b8Cl$hV$u~^a&mEzQ>~0+1x9o4R--ZG2?(iH*`$~(Oi5#a2YmLd zAbU zoK{lQ(g{am-lK83Nj2u0%K4j!9c!?;x|_=^S0cFU*`<&js6QIb#T)xh=bc_!<@$3_ zM{SDh-%n@Dz6a8wT|AuNS2W|Pv?p^CI56DSoH2Tuwk%sX#wzr16~ck_HO(lUFq1@Z zLfOgUx+q^{BN$?MIqWMrA_%!WwN8X5B=b|qQuYvq1Dp!_N8pFS-B03Xw;D$ZzL{w(ZG7(`Oh#Lk zTmpA62NmFYbQ3&_6lz`MJ5>}CNj(P@`w#m#cqx1n@b1i9SS7Bnsb+hk$jdN7PnNH^ zWDq-h*B&~zv83d;=zDo)8CI!zY>#K~r-FPZ;9WoL9uw2!)2+@6s%|Xo1~SaVl5y&5 zdDs$PaU4|1F#G58 ztjS-vB|+(mwF?$P0nf4KpRyOVG=|bDb=!;qRM3#1o~N}<=L~a4vKpv|I|b?b)n=7I zEyi-({V4Wg=4UGESD>dt zA3ZTzml3Bp7^<8o=OUjX7cnEq*a`==5vj&V=ARK$&-1AnjV?fPD>Aa4JJo4ij)tU_ z*mdHlNd2=^pbmE2jpRAaBFll1QSPRaeQ{cl0|FO4_JLgGr@_C5mO8ZB z%vuGhnr!7HUor*HU9h%eU%`0oiuN`Nd1|LJrZOwKomuU3%BhE@-R!>Nlwv!0k{A(V zjxZGw0992S007_tN+md^w@RfW?K#b8p>r9{M6)EsR&3YGhXmrGp7j(EPHU9DyCjkg zbW@^n)vbMt`nINuxmV}XxY@NL`R5f|P@UaL2Dyiwl$@IEg(Q*Z)vKwab9i!aYKgfm z&TA@Z*qqdH`K)-)HL8t{X-%4KJNneoOCci_Rv4f7tE8~frnn@;qWyjsJca%eW-XRo@>$c z`#WgV604EzSTZ z)KWM-4S9~AbJkN0-K&WBf#6RM{6+BH$A|nw81l$6Lpb~P@_;~*PaQMJ=tl;-4Z}Q| zr>H>{=ACtCF~oDhByY(dE2#&kJ?mNt#%fW}%DarIxXE1~hFZ;(Hadj%ut+9_WOYX! z9YG*BQ`A?V>d3Ikg+BQD*Kw|?g635uGREZrUi(f7A6nqGSp!N~aHo-9e;D0d{IA+_ zyBJL?E9E#owG-S*V-SP#_Y~P%lb$M@vGl6sA=L*Y4n}?IA%mQsrARQm?#Js<0m&5o zn7y+mRAMk2KGi6U1Q8Rp_xvdnoexJ&=?ez5^5HLk_ zHX0ShUalvOy-mZX!O zqi#+)teS=F+PTpmY}NT)y$_j_P2?PAt)`q*gN_Y)zlMGpc;m$S+&TuAqTRLJ%Fd}Q zMimIXS(-qqtJ@@joDQ|E<4=U%Hu!xcE8=}BYf*9jszJ6`oRf{A<1D+qvzpFIJlwa` z(lqKg^YXiQJf_o1c@6;UU5tJR)7fpNP zZw_8AouUPlGjO}{w0=+u>y^$EZm2e7#YrXf_n}+*U1`?oS6T+bKT*ym{TIwB{k zpaY=koDA17cA7kEw$UFlfxmIjjit{9_cP3ebQJNRp_$~%B zz!>_I#X)tc+)ooi(jA27<;Ug4R=I=$@~Y(Xwg zV@$WWv6-ZfInk6fY*eZBI2{f-^{u@>#4y>WCeD1tkTR}M%gDy=gr4>0u!QAU50spf z?ewcJGfVeL+Prh=TgJ4O%+1q_-5pnnyhQrV z#EhsC6xyXz8=KtL5o9gX89aSz4P&7z5T#CcWO8x(RIeu9a9E7tf6p~qMn)w`2M4*U z5J4kt0Y{kMb0@ATngb~+SwnQ=emSaA!zctd)MmDR$vb3D1Ytg7xQt?`T--qz3ZFX< zym`T?xU5kz;aHaCPY2f(6n92GTcPWW_0Qu@^4fOE$mgjzphX_wt@4jt=BQR=vC9MD zlRJq$h{yQWu4KmZ(~*wY`eL)=*$a)sDU9%cm1vep0P^yxM?!Of>7Fx5l^BFbt;oWV za9cRXFAn1mpSCUR%bj3oiuVf1YWfBz6z9^vAU%h;la}7V-e_k?M29 zXVVqa=}j8H&Ou^7$*wxy6jB|CI0HO#57+5khLr#$bDRv0JAHGS+KTtll-`F&g-~S9 zMn_Mlb3+u)O5>&pG;P?R@<(O${5#VJ&yX??QaW+;uTnJhIh?wP#G@U&=hL6%)~hjM zymjxIop)#DKXe`sT%USL5VtNs{A(G)#;M(CP{Ah>oGDaEB|;~2&&6cX?_86KfW z9r0EcSr}umTntvU+vrTK)Rac7a;wvv`i|7{6B|JJ&)y@}odYugk%5j4I#$6Bs&U`f z6}57G$yO8_(1H2edDjE>#Eohv7rFuV-(_oXO_YEzpe?clC4@Aaxq zr*H$dPpxVQRzy2^V0q66imJimSWk zI63W)@%mORnnywAK&n)qm+6YFxk2^7{3-0)-#z*td{iM&eD{;a3)G18hWu zteq6&f_*s86+FzOQ2;i{+On$Qj!KosLy&pyose`R$+ka zjDyG^dsGFE2bM4xWaMLtb8l87u;iZK=M@72c~&^j1E>@XQdf6ieY#`%R3*r5gyfzx zpHuawn98slaqaZ&Q=~EOD%b=LJt!F#aq|(A-;SL0t4vVia2V`*{{V$EZyDqf!NJZ) zehnOL0Q|!T9kHMOwF4N@kfWdnxIVPhP)P$L9G|bgMLZmgHz%;qN^h0d9bd0*os9rQ zS7{vZIVV5J_oE6<^t zWl@qy_3ipps~JBt4Cm8|YmmxV@SyRIb3r3PE6DkY@7j~oo_#3`5rDr^anhN+RFFBx z6bX_m9Dt*o^#}g|tx`A`FQ3k;iAipH=O-0mr5qsYGuPgLMA6A0J#p?$BQRCR%z5WM zdHgAe?gdhN;&O4qlR`mI88g@-b&W%*=aZlEDzeNzZKJQPLh=&0J$vWYkwEgn>yG~b(yA5g zbJoFgY>Qrg5Mbx|)4tHe5)aUQYKJS1{C3az=}g=~>Bqfnu}7aQzH6bfw_IRjo+;v7 zj^B-BtFZu<3NzH?^!j?#@k%p-*~ec>zpW!5?And&PbADi=N|Q%^5ks?o^onwB|=-D zTo5>_XAZ}10Kw0Gm4#eV*zcj0PTLXhImUgd1FDiUp7m-dpdp?~e7r9J4aDcSr9pI- z@l00ER+2I}XHADE+b564xqh&BEWXQ83-OHL(?f;oNi@TfdH(?QQ!-R^{{TH{s>sS% zH`u(aSu(jG`g_!EyFJA+Hvr?QJ-TA2J$JI4XYird2<81qcQ$f*8f&zjKtF|8QnCUL z1v|@Ppzr|W@v2pBOz>_cEzP%+&ur9-&|v1DB67ro$27$U1d7o;4oSk=4&;3*%D4(L zdh>zJLPpX7?lVz`=ZbeSak-|K4l#qAb~U26yOa!Lv95V#+rT+BVP*hlt!oO69JO%D zOJig0804CeT(RzJ1j3!Zg%rllaZ5IBYD8Gm%ur7E$qo*RO991wW}8Lqr89#yBw6U)cqmL49`X`T-QM)vP$Zs$dr z!w451Q_O*cY~h(yV|xw9B|$jrNj;6llgO7U72ztZpoZnwaQT#xkU7SEyBhoBP52++ ztNkzj5sT)$H7u519E4woHnhz(8bj4PA42PPCk{kL^IpBh7`I(xELN_9*uuy(( z^?0ZQjp$Iq?rEe0GxSlJ%oi68#Ub@{9K@Qcy>T6aQmm6v{gdA<=v?76rIO4l$!pDnV zqk9u2qB?D1&rwt-vDn9qf$iG64KfiY?#lefq54-!nh)9t+`o{nk7l}ny# zwRdvZnV72mX{n}c#~H2}VD8Uqo@dJwk4-(e#c9W4s<|tiS6LpK$L{s?130Y?%dCtVLG z8f?yf>BU`(M4vg@abC*@ha(u=zom3G`VF{HyBC_3K^>~C&l0!L<|mMAe&0a;_&nFR zTli+xlorR(3b@`JwuErGHF2bkEiQ+Kw}*lZnOigHJ}asm7X1$p?KZ8};rw*!>b#5?pqH#C0= zYPV!a(a00fDK+aFPr~05YF5Ft?K0|hJzY_leqdt1MJ@a#;awfKS?REbAH?I#Ao~~2 zKMK+}MOVv-cBtq8z!k#tNk4)=dGAulVIPi1=9Txu&0|WN?D~e4bdvTGMCU(FD;`ZT z?Hd9RnCdp*{HMWa;GWnMF^16ZnWkxtBr%vX*N)Lj*IGWjR7fg8rppXwS17W$w z(!l51zT}BvjBQBO2cQ@gqZ5R|4bP==)Xl0tg;?mNk<;FCx%q{EreA4Sk70WQ+D#K} zk~t8ggY+~dvXQuw*!Qo|zZ3XF!@e!Fnk`bs2`(NcjV@X+WsIJMTdxO^&3IOs`!}L$ z4lZ?;lF7OV;@d8N5>~n)nZd^M(U?`qXBk==qr|)g;9I{Q>&c?q&mF3&8D3cdAR^;9 z1F7eLNcz{>J`4Ck;eQ1dxs_8@y2vRt#A-x%59NANb7biE~A!#R>k zW!hwNeM+dv9jmM^hpHO!vAD{Wq|{xadpI1r6l2XL?-;%y(=?9~+8YlLS;c#8oP?D@ z+I>Olr`&U1Ep_`p{5hHCmfbHP^E0(le5_~voyt$#p3xdm!?r?=%5m2t9)_^&ehvIVzn&|2 zv&FuKvuL1Ue0T<)FLloj*&A(Q-U7)K3KlznoRu+*4dieLBi}XonW}haThrcU zztirmL_`S$(7J3VpgVxZduF{V7?{;px#nW9lcMa_hX~qw<9Ax4Bug3KbT!k-Y^XV` zmb7Oi;DBp(j#OpiBRKqOqelK`9E$1RNuDT{SB=8B%CQ6n9>k7oKkSST0MToW+=k93 zEHl$J>b?o^4~l$osEZE^Y18T#IL^pN3O!kl6-T)sR~MyP2`;0F$WY`iTY=4f(R>r| z4Tr-&1;b&bKicNh6)vZ`z#*B?aD)%IKZmVyV=Ma_eBEBhrCH!|t{S=UY z{YHyOu0)05C4oG#IsGcsvU7=Jz&@NFD+Nr|%&BkYapv+zt!>)Kna2RuI;fTMym}1O z%M6kH%aVSTe1cOp?qwcX#y>jA^T-EhA4*B(eX5-^)~l1S1C0GBj4Vs2T#n$lDE&{Z zMJx_D&ILp!iI)Xw#^3>tpw;p+eW3pUE<9kIpIVV{R~4S~Y&@P%YC}AO7(7$t7ql-n z(M)DsdQ?!CVoUU?8)@Zf@(Y}Z?gu-l4EXt}j1-@}id8*{rN|uR8Jvh;?@dRCpxPE?$9tZ6NzeDG_k5l5dnN$6uwGqKKV zCV5B)n%cRtl>xxbU|dGP;<{sFo=Np87|h=&toihLUyw0caqd&{is-EErMdx1k`Ekl zS1DUk6*VKx8%DbifSh{vtM=M#is5Bn%Dt8y8a)8yKpVfAb;7`4^=Brlj$oyRRuceOJK8VN~g6_ zY=fHHl;)LA!V#al(xyn5_3!CWsmZI+9(ktXgrwUv>};Aw1J~BRhVUQ2UmW=7MU!6e z#5T83MInjM-9(bBfDQ^V1Y{hH<2B(H4YwYZ`gQvu{fGV#ElzuPV|6a1R&_220V7R> zDCKe(@_9c&T-dq$DqPW8op>5*wPj9Q9H+yd*&6I!rQgI`sJ_grk!52eG>pW59J@eJ zy?$NU^{=RW74ReBpMtez*EDT4-tIs3Qe8^Zh)=33a2wo$M`A0|Z8FXRwms{pw}}E^ zjO6p0`5b;{Rp{lXWAC!uo`OnTw`-{j$L0=zuVN}oTPVRU<0rO96{iinQLYDbnw&)) zcvHklt0sLMaL`RQh~op>@~dXr!s!t&AdYp7)>IOxaIS|cz%U>(ow1ox@S)WrU5aCJd>tCWqnz8v)sN2-(w}n|5 zVH?fZ>%)6V%a#i4KF&u~$KhIbi({u*-D?`W4?H&LLZYKO2XI2Xg$Q7P`;4{$<2A!- zKM`~YEu(uSm55x*CCAJQ5H^KBFUyXk^HXX+8W8A>r)YXry{MWeNhOq-Bz@Tc@^u=j-v0o;CmjIKOn*wVA_%}Z>CO%fGjb|{CoSK12akG@-h1hDAr4hQ7#QGw zRm&r(SkIR5NE$VaayfnpA3@X)#;Y{Shha=FzXv_)TdQ}4w9E#R%;8V zwM+YiZzbHQZU7{E3dr9yK$s&I%6E1 zeJVyQU4y>-j9M%k;%a$oNmbn%l65h60nHANw+9p zytw&+`qxsLAb}9cyhSu?B2Jk&1bTPpgWOklu6SC?e+IePVe*cCcUHj1UO^pxhPAHrRKA?FFNM#3{{XM)S4xcJ{nSLNB(*qr<0Z;3 zIqE)@+h~zEcMOaM-ZRivt(J#x4j7E%xa9hGt?#lb#uWe@5)WQ0)xzcSPo8HLY+O?1 ziHOj*QOE00w%~TDX3lyJ!mr#bH_E3z{{UZVsr&QCATI~}^{++HNgUCv+bRhZDN>;4 zCqAE@D#r2+&A}Y?$*F`$WC8Z`oStg73Nr|txE*pa`qw1m(CmbTZz)D`$mnnn<=&xp z!>MjJ4lzu2cHy$8r$7CAMFXiBEBr+9_*XZvX3BjBv4~*C-TV4`bNwo0fRM*N`R(n^ zMy4<@!zAM*d?k9bqN<~FwK;YtYiAz4s+^moT#=KUeKA-wOAw^N-)YF>IjfN&V})JAsc%nO zsSG5NU**rC&MQ(C4U~(3dhYf74QUA6ha>;c{KIhpi*pf=VV;$i$!{EmqQpRjD{s1TLd(%})x5<#*&!sen zVl05zaC7a*9`vKk00a!g^y&J2DsP>K18^K1f1YX;P^Sm5`GFeuKQCrLE6>y~PByfGrS&2YG*w_?vxQyV_ zcLZ*P=hyjEtrJXzmyC>iW9n(3BMTg(c1n@J9e)~05m+cEByqpDMBzjdNGi(Y#1NGyB>q7y-SYfe{I4m*!DFlNfJm7GD`opCS_YagwZ2tfba79-! zkgQHKo=0!ike$hX(#*LX4st*p$6AOI2xHC%Q|V3HyX9;FjQqX5szd`}+(F$&U6?U#{#B?MSPQzMt?uj zssackjQUiO?MDloj9~j@^zA?-jdYuE+NuM6eJavjeB=N!MmhJajmx_^01?ylsXXoh z9R@M&R+u=OCSkaeNZ@cN^U8n&9y@gXYdAX*hHQ=x9ced$#~fgBo-k^Yv5QvR)bk6T zP64Kw_pSlJ&pw&;tngfPwntHK6F&{AgRZ*968dfxn=OaBk_B5hg5*x2${!M1? zVVq;@>rWzFsbJqQ%9F-NsP(PmQq0O!%~gG^hCB{xa{LEZO3F+z1=}Cj>sA8b zZO;S0@~=XLYi@DYrFEg99E^K%20x`*j^GX(gIVf~fMn;sNa;?LwnJkco}5>wO1eCH z_*pXalMIoJ5l|P9pSUo3RB=xkIAN8?IXJ1!)CvGqZ2RD1w|JCtECYLro1MKg?N$Q% z0)4twBXn>IfH|qzn{S*5>DR7nIbu$@V628qAs8LMI;vl3JC0ANrIne0Ku8$;>aYP$ zN$b~|$>O}tmI*$EoyCqx+B<{6g0m$loxTqU%MsA>vl^ULKr;Jhcm)w_vOQCP& zlL|QJ^rrAeLld{QF;S>(-!aES?^9%C@z=kmDqUjZg-L8RO77dwLykX6dFlrM;-9m7 zZs)IRc|vld0FHU4suL_en-HvONkVz;ijGBO1ZO6mR4aAB_NvXa6SuFoTBTK)JTGy; z9ChS!NUH(MMdfY;XLd8jf0a=TF^rsNKBx1kgJ5F=2ik{K^&D`>wh8PiQ6>-u>JMtq zGGq+!1v}2#1`iccuF0Me7fZzXBvM8Y{oXjwKDAmoK{?MuQpYF_$QktQTdYGkCxfQm zs7XKBIOp)H>R9y~xIHS4FI!tK2hUkmkpYsazpi$!_Z zTwT~)&24WJ6yqfoK8F-(;I^Tw8 zTl-?ZCNf7P7Z%a{rAAgopLCoS>M%2ryNr=u5_vrJ74!ArqbC@HE`8BEb zQmw^wQca$AAw^4F$$=h^ zMZs+5ks(*h6VIhviOb7vTO&Y88;5?iq=#r5xS=gKoB{<~`wN5f4tmwbl)4yItp}ya zVv$J2Xu^jaa1Ce2XEAO#70_DRHUigWB`2ZfVroJwMo(|l6J14}i%v#4sPx?+NEM&g zrFt%#V66Z|K&Pil?TWVNlPXfFsv^T?Ol=Me6WfGI~0zo~ise?un z48XsEtM*z#2Fjs6-j(S3Mux>#?x;O|Xq9NBRvQH;BhKwSKX8(Q%69h{t>|$H8TM*W*;f&fBjYOpA38{;eQb8!%n`^t*#(=B=bfJvf+3kl!LoCt}I45 zQ;VNt-@#;_(n>Avd@ClIKYWRS(w{`Vp^w&0ZIh;pWq??rjl{L~nBexKo}mOhDYRTbrC9o82|ym0|L0KW;G`pC1cQ|lv0Gbo4Pq|Gr@il(Jn>K znWrRjDJ&S4Y!m1hkUhOCt81di1o2H`K+RTi#MceEwP&Rip`=L})wm+6$`iL9w42D{ zs>>l6rlZ(SLnJBs zS_yCz;2PzrOR=h{+`Q0^)gRdR9I>fmls6--UV%K*T+UL7)lLd*rQ}2g-JtzyBV`ku z1+C+28jSU!AO)}oCb9OfqdL|dY|)o%q@jjo)LZA4xLLu(0$j1EtF-i}mU z1NhfG>P}BqbwZ3Fv?Va@Tw}FUyV30R8+k1?C?dIrQHP3T4vak+SP(^6dzgc6%|>rg zn~rKDPD@l=szvC}Gr9N&@NZC&rMvK^ow}>REC}#~UVtGO0AsaqGW-bmLvouY@P?EIe}dg(Kbm0vwd}U?8523FS{6Kx zl`(T$GN!4^;)-XDzrYWJw-Q4!@TQ#`+pu){YGkVfQ&aHk02*0oO)5ph0M%}ZOXr#qk-6U2Cl<1GGVG> zPw<29Ol3GA52ad&uVSO^E=cC9NE{bzf~OlsF^^xZTXC^+KN`)Ir6&pb)hLqWWVX+YSLMxfEh+jS{Cu5;Xofse5CW37hYpa!jqA~tM<0C92X}Zm7(OPM(HYb(4<`jhN&O1`Btj~j2WaQOmO6ZC?q{>n;sMU8KD#Vd@sFij#YOP}? z#Mh_+*(g6Me0H$Mjj9LXR*L|*TJoz^ z=6W999*-(XmSa^ND*PT;;EuJK8OY9hRH8zsj%$gdvL?xvBuoKWvdUY9sKmX^NxU%6 z8K$BQlqP9UMXZ_K!TFC$-*(-{N~a`90o*fM!D?qYXkdMy6X{juxGE~e)w-@(YYJH$ zIZO}$2X|wi*1KuJOH^@GsL?c+B=@Rw-8w|?8kreXl|XPjyWu3?asRQ#MSL^=(!taLuANXmb z8x0yZ6WuH=do#N+nrPPrfF}wvP5{8>zcqhn?*nQcGx7DDR#!&E>3el2ol|)N2@?td z<19!3oQ}L6mHO2XD}m|WyqwamikfG;lT-J-rH+qJbuw~sis%IFIvV2OVy%%|i!s_O z^jgzB~ArTJXoiJxf&Z^~kl<14SHCmkGCffaj)87bgRg+P@^V4PRLC9o_Bz zvvD=lqDeB-O}XR=(6M8HNavHlucXQFJo5JPc2Pb{h%+uo{aPySNaUf3xHY2+Tp0n3 z4WJz4^PbhCJ)nwLjy#oK^%cYE+FhFJdd<_?Tfgq3*%^`Co~#sOfsACIrG0~`7{=`Q zN>nE~S}50r@#V(s8y&&O#~z?_obg*bH^t?=TcaG3K^XjN%=JHrJ`uEyR?-{IP08Mh zpv20G~4E}v$SYgCLl>6N&Lw3fsM))ayib{_VqXZGidfwJ)XUMHqU!& zYC~HzVK$hM{Lv4YNCyFl1

zaNJyC?qf88V|Iyf+gZNvvh&9SfnHRxH7dDtv*_vIsZmk(O5M*V)f-8+PcAqbW#r;U z%X<@!Jd5wUsrVB}(zfZEZ`y9$G;%G-C6#g4a6L|V z+l+fxm|b1kOK|c*7un+=e(ecvanCGC{c9f5=tmp*rHdQ|7|N1!lbrVY9Qyi!Wikeg z6+Ox5E1tbqRqB%TRy3hSQrWla?p(i;7um8PyMW~L%|~xEaYj*jY~!yLop@wv0Ag6< zIOsX|sM0_P2P2-9#VDlpI+TmjFlc1+gJ<}CkN*IwvY_T*WL&7^=hC#dKa;u0U_EqK&x3L7W*_A4bg~0%xxjpNeyb9`gEsTN1Z7Swnr#y_4fzqPpJ&Hn(_sp6CdDhT;TK=-QGk|^k)o*>Wt$O@C56#hS@TtwNC^JETx`t+_2Mi&8k4&Ue6xGGe; zx!np@Mq?~YpfZuk?be!5mE%2qJ5{z|PRRk?p2Gr=fP@f87#Ihxf2C5D$doOq3Pz`b zyNeIJdsdo*8f@velY#3{LVLMmk&%uDY0NMVMoUz-uX9A3MZ0i}PVy8ScRs!AMBpf7 zIZyVzf5Ng9`Ejo0z+8Wydew?(?jTiURb?1n->-B2MQa8`leql(ird&OKqDXl{RLxP ztecl=6d1^2e*O<`-qo;7B0xDI#py&X8mK z!(*S>zZjoakyigXRj5Z9l4dVFjYs)#A2Bz0B#`ic*k6R zzl}R;1T2aW?Hqyi>DU^BVxZ1(oN#*8hLJEy$lN>h=kcZnMZg?-oOSf3SsbSgg*XSU z(~5`8NXU_+5)srlPCAqAQ^@h69i*1eBzjhBx)Hb@MmnAaCdMmD1F-cxb{zXr=LJr= zBOK%W;-X-`^3Zdh5Ay5&G>FQmQH~h?7^neLc1HZ3&2tbo1iS<2c z1cP?bxqzmCk>;48jpSma^0_$3^&Rn01_*b__fC3u_w}K-D;?O&bmKj0w=sdZWpTjI zNS&!_Vg7D9lt0D2W6v+R0f^%V}#S8}!qJSpw|ew2h1Ok|QzPP}p6fCTw~ z*js_mwIq^ZFu=1Ohp$in097bf-PwJ8DmEclDCfRUZ_0ug^6xj^c3_Kz1e1U}4?&*P z- zRC`%Y?x(-DYi`EtN3v7>p=@rlxWFVF=hr+|E}?M^)yuuKW*AuIW86*`-1VSs3~2`g z0AqvS0+`LUxEbAy6HzL#!Ou=P>HMkWau}Wo>;5zoa&6~u$p;{G#YhVW1Y}?gcKoWR z7{&?rr?1Sx*!~@;C9_635cDT;^&P*hJI!2xI(pW4-Wv)580bf(ObU`oAZMRkRVHT3 zs^@k9z&vLheR@>E0b_%Q;A5ex2`L%d@{Ci~az=B{etkHna=Ck#_6?zc!ThM&st+e4 zpv6Py1Cma2j{I@;q!S-7^PFR)Qg$W8v{>&L$Oi{Cr5vHqV1RmhX0g27Hr_GoQY4;G zImq<-8o1PGhZ~#AAPK`}qGue2KEs;HH#<&LpU=HCT$E+cKBU&m5hFK6J?j@0PZCvTm$9(m`bX7Lj4TBf@b83|HY=N&&9uFT^kaqXJDBszM;S#BBS#{dEW z{VN~L!xSKM$25C+2eL)9kOPK1p4DMpJ9R#Wvdgz49s2j?rH%3iPa?F9W@jpB)JKdA zx82X1+1f1eGHO4c>el&Ket)pDZbO6iq zWrpMW)X2cGZk*=>rB!0d^L{5d?M@DQ^~X5PU$wr*YMqO$tM>uVx20ELK5Qu4sp-Yp;jv2FvtfS zny#2u>Hzllq{-@Ap~ZBm9(0~#9P>|(OpHPHF2q98k9PkGB|e6Jmh|L7WP#uw;Ya7 zUVmIv3UIu)J&&QOVRFc0XC+kRah_|gony(bgiYKS?!W}_NzZDMIdOy?&I$FPh0YHH zAB`+&86bi`m2|>RPRE~GnuJ>=1cTJ`O2eK%`t-TygOV$@@NS6>_5635gvoDj6K@6E zX>FtdvQ+gHB7bdt&` zT+ISpGRW?X#IXuK@cZ11{M(9=oO;KG^!RRcsBWzO&Q7ZfG_b_sCV1HF3R+f7zU9u$ zpOgmTz3eUtDJdp=b~iMf;V3n~UdMHRdtu_O9rXPc^4THQAchO;qSG=!WP7F0rug* z-k^b&`B;JuK(4H0eVloojNr?wePW`DSN%V)%N@7HdlcIK(S00C3jrD<>`dd# z+5s|pmK%t{B<8u;;gQ%zs!JZgWY?p3b57EHMI+yMrsnb~CE5kV0VN0kAeN3sUHAZC z2@v{by;Dp0TDldEqvB0U;wQJZWQxv7V3lLIGZ@(!L0qmQVqBfuN3KSEXklkkS9>$) zs^jU?k0f_p4p-rS!t2i#-M!AKYd7|Ft3)L#Q44N4VU}ga6;HRR73%u$f-HPJrd;VB zDSHcB3FMaE0=9_vVdFo$c*$mxJZ@HS94jw&uWi#UwS6PNkEF$?M%R~7Z-s0gHIcSw zGN@-(*jYFPXCojClUTkP_=z5|sn}U~<3qXEH0x!a-reAiDGR^K733_$KGp+hBLi~< zW7fTh(1al3mCv4*CZ$TMQ+E68zf{b?s-mX(b~`zz?AJ576~t|~80XreiCh2}0074VuNMkH>yGqp zSw=_8+ltD{_Y`W&mc=EAvGlDAczNsp0P3Ycih1U*LY>ERT0%Ew6{|ZJVhI=lbDGhK z3kS7_*R9T)N0uW zh3QG2g*hnMGtlj&NZ1xVYkDb?P(^wCGl>`g--UG+t(4uG#%sCg)2ptA>f4|@#yu$- z-Db)#;-gsuFU$DV`!cLZJ!=Np=~9eNH&xKj-a(Lgu0m}ZP2&-s4SQq8A1ZoP2{hz< zl@xP6rArK(x;*O7Mj!+Cd*ZrF3r2=zB%Qr6n%a*~WjM!rN40p{a|4e|RLPwbsU@pN zYvBzdUl8iiSXzKyLL-b83cH)!;B>FM{1fo&M(~=)aSlz}AoExejl^;X8O3?8?D_Ej z08c&_{{V!qQ-V3?zLmbruDSA37Av@aw9G#M2dS^4THWJ02Nm)eo;A*+r3a!u>nXt~ zQ&ncQV`Q*_&hyC6LroTT!=mHqR$`H{wTCq>)7K)rq}lAGjOi?`ToqxQ)-A?`V(Lgz zKN{+`p60W!8H$ny0R3xNPFK;2aYvf!I(@yX9fOZkT(r{#Yzpo5sQk!_CsAH|aT}@2 z0xQ&`s=GYu+H6=$qq~z@5nP<|)y#RD8m>h?20^WPOkpPXI)u6B+Nbkcm2Rve0oMvxAbDk5&h_+**e0=KQ< z+`Eb9xr;|~z*j|VSvxs!j-pYW)@(!#J*8`SJ|(mEu#0CPxgSszsDATC*`I&Hk9g(ozWP;)byd2`d6d>f>225WF=(T|w1 ztB~2OBjf-P`PEriYD|*aF$i75j{g8!x@W*4dK#}A`K`7}mR~K13&tu`N^=?+axqpu z(ui=zskb4G73q3>3b^NzHf2ki~L#~2ix`qo4l!ni0W zk}2882ByGOswONB;?c%rlSWGG>T1<%QG+{t2a(*#gtV!?i37DO8N>)Xm2(E2&t26V`_GLmMsv+ z^DzADX)Z#pI#vr_k4kb~d6msLIc|1BaatyCEWn<;)WCzqWWY&&YhEtzQfH(7XvjLF7Bqe?sTP~rd;$i!z+WwK}^`aslb6(5*Vg_GHM5uwQ0;3F%G|f-_iB$JC`RXq#8dDB>f_GxBFq z{g8epTI;r2WuMt^ZLbS%y^Yyow+qzD8AA+?fkR~1qo3GsUGfmc;#*TGVZBYWg#*~{ zB%i1i`aVJ+CZKutugh9XJH*RK*?f*@aMlht=ezlzKl~H;4X1o2(q}if5#MVUg#DuG zHNX)A^2V9xZvdS2KZSccTEeI06#4EYEJkUF(m!9uxu;UCNqb6+?xlyr(u$`_Hb`p5 zpx{-sjJL3<62;gC&%IeOZ2$v|S0!4jq1{G{NPtJPoRVs`p{v;F)>3L3oa=7{K(k2a z00I2!)0|W?Lloc%5nKWY+%w4U&11gi`)o<0YcOkiZN8~$BoN%7l0P*XC)#=vtOE@7 zTV5z}hHjWz%MPuNkt4t_A=( zz`z+K^sk2J*1Q#_!!5n#+f1%pI@-bJMNCcUP5_CA?vN+q0-fo-_hxQJxE& zk(~34X9G2d6UQ7sH0} z%N|_w-_#z)v5qP$M0PwQwx?Bn;%0+Tnrj<_J-Y^t5adQsj=OR(&m+D?apB$x#nKS` zmLa*$Y8QYO0OQo-f-1a$f?yJQjFZp`=Bqwuc6CBLs>s;1me%SkiDyOxlE@PP1Cz%C zfmH2YUz#$qGh=jpa(|`;QHocDke|-Atu=WgeeyQ!3}BuZ`=3hYZ6ju%K_;}7qw`9# zxdU>s$ow!X3Dv}ye!~EI4yL^aR@Ll|nzs-+S)5~FUzI&hd;4HloSV2MZK0SFe)V!r zO|tOmweJ?ph2vx+IsTPKGFDQfr=>`f+io}{BKqJT(=@_Wr~Sw{Jag$#^+xM*Pb`vL zeeCi&nyU8CbvoO_k1|8GcMzjLQ^i{{8*q1#mg7E^jdadO10?fMY_&TJe*;{l`iu99 zTVSfh#!t+8?ZE+t4`0yNZy$#|ITRoZ1y)12G;F|@Ki~s@!u7u>K0FvjMaBL2GBA|^!<8QeBhpp#+$OaLttgbbKlpW=~Y@4I1ET5 z^fh=!avScjH4M=)$si2$&JSAUoiljoXG)IEw;cyw*sA<557+sD>7QD<%G-j0f_U}f zs<6))=b=1Se!)G*?HbsR48v-iZTx?oKW_Y%9eB+g?ZR=MPyYa3t4k||&UyFgT(xM~ zT^%r~ea6ldF$0o6AO8SVFb&KDgMc~?gwq-K9R1vL#UhCb&f)9N^6y-7g^jtp4jC*; z{GgsG%H^cvfu6YSPuN;L!yI4Th9?YJ~;SvrB`q1=1%&~>f&5+~|< zdy!n65=gQPV*qskWY(-#MM>MqsD(=^E0^z=Epcc%9(KaC%;aAol$lj zcXc_zJRhghxuqp7&WPwtTp=oPk~$8x80Q2iKH2B+r#h~{%6@}9u7Q!1~hPVXYRW)D0qFj=07KaroAZ zYckze=dvmzK^CU_EL~7CC0l z3BboaYIV1f*C7c9__^vmYGnkFw`PCY!|!GViR2TSh{(zNwgVt_BOH5s*3_^YX!go> z5;KF}J?o#H6(laiF+QjKYo12RC;!s?ohVNQc<6m|QArm8cJt3)(ykT4sRIKCJ*u%C z)v!lSI%2dvd!mql43-$k&NIy^jXqKiUyL52r)=XG3_4_kk~>sETwut%xWfAn(t>v= zyD&Jw$QUGyQmIUk=L~txPb4MDz&Kuc^!#cQ0b_+Y^~lWt(A?#AC_LvUq59Qgl4SF{ z&>w2Lz>Fp{#~gR4wl>nvGCfCc{=FtO61L~LtVxLhZ_l?{u{#2|2R!l3 zR$|+6$OLk6Q*o7~48(;T0!Lhr{=G!1#Yo$c>^s$=3oi$t9=??b$T?xVuMW z1~5i3?d?vECXg26Am=?nqiF{xfG} zfrFo}h!DN{nYcN#m!Xr*Kr@WDFBP?nUydkloMaQ5D8m z4mr*{RfFY)IRt_-2*+Pv!k9xb9Z2IGboZc7?4XUe>cYWYLnW-=lin#@ojt)m29=LhBV%|gI&kH_$!b}Vlh%X(vE|CX-@2rc^vc9P-NZ9bAwg#&GaA0Q&$a^>IYCMrYjmEet@5q zPI3V52UFD2D<8ZMu=>?#+^--JlbrhcRG7#+kFGJ$Q|1$iD&)79&TvgXc;h+U?rN6y z!)E}2_?&-}PFGUd_0QpoIf-b#vH}myoO4!D{Koh8{{RZh5@&S-S? zyGR-J?@)QIw`k`lKD_?`N{wF)gWIVTt|3&iuqXJ3AansDS>Fr8HoBX)~tD;e7pgQ$P7nP20dx&M(@4J=hmr6mW#qqn}T^6`qRTOEAw~7 zP~Y2VAI_}@!Q4e@%*bfI9ODO)eFZd@0P;`2Jq=S?9Irv^*V3M@NM-HoM>7i|&hF&r zKK`{NepYfueq0`KDxTwwy>siwH9UT2QZhUHR`lvMxt!yD3BQZx>DHr0P)eTk;h7kf zQg8`AfC`Hw=a2richjnl3bdJJ6o7fiKc+dV<$>co=Z{Kq%z4|MoimDJo#Bmc>LZ>M z*er?zsa%o(1d<9I{<-PRN?s!x1Wl{~4%t6BCnMNkam6$s-G=IT=B8M7;0zP(SW2=- zTqv=HfK946>-kesPDTbjKN_~M@Ol%}VxTdy^S7rUiYe7kLTb{oBv&M4jQa6U5)}Xi z#~H;&pa4#DPb+}9>*@71=u?+-#>7GNEC(G=CmjVjcHs8l@l!$Uh=KsJU77Pla@d^=K__CHpL{j|rAZWWumg&$_0!d+{%v|hcd?; zpJxs*O5m0!184_1#z^hFI{yG>+o#^KF^J+aPT6SS$YZ`d0v&LxyFKy-PbcfJcI8d= zKQPRB)Y^{8w0oC@Z9lMd$!%wmu6{xyj${&|NTD{7!DSd>wU@6yhnRTh!rFEAhk2k{ zL@lqTl-!AB--E|s?97?vW8VJ_n5E>0mr6X9}>r+E}?Mt*V5_`t4Azq$T6@D z?lF~cQ+7_#!nQC*c`p~sE|1}>EoKB4*II)tx_#Z1*xMUK#b#ClUobZ204tIggN!#F zGf;7EdfdVisTUPW>fL)M{(5;IHRzIPnoY9UM{Z}BOc=bWG*UkxJW3R@g$FD141zPe zoDXi+yjN*$rNg7D-HkUX>A4F z&`}F7l<=<5_>JY>q$mM*IRNv)!6L_rv>j_o@e{Y&_iC=N-bpJ+V`(5L9#17+Hpv4y zVC8ZM8B#@gk(VOnJ&s;^bN(l{gt=b~>3W}pF4H%*^8*#c*qS8@`IbbGe9`O;oxJ?Y z2_WG3mHz;U?(Dq#OWQbNj(AYVa&scAiJ1dH1corO230s50oa3{J6O2Yv?(Uj^$G4) z=FaTJI;`l6G%|9B%MN!EobFIl3<1tYa%J(wt3TNvPl|gRd&%xCl2Nu)6BYSfjH>_; ze54fwp1I9b@k+@P^&82_BYNvk)I3*jrwa>B)2+0-(lk|BJfg>NCBAGZB!SQZKMf6(uTFPt z>Jn6S4Ce&!K<$t5t$RtfovH}WLF-(%n2F46PJ4ek)UurK+`0DeirRBY4+{k4c6LcQ z5$q~GJq=Uyu`dX7(;)FtdAs7|^!`BxHg?iUqe+{(g?jsojMu9*Ie70hFKV0+aiuAc%&u#@*)9n*Yw70Oe zID+04iBygN1VQ`0en0>}k9yS+Bd$++_-f5cqm{R3=yYMpPB83MNZHgjF;a-1xfDq% z!^fpmI*fe_3XVxVi@$Q`mQ)sF#bN3!-dV>vtEW(n{$16Za(88SWD(M|rxu>1$*UYa z&Dlaxxvp~Uqm=qq&Z?^$whnnU$;~G{Yt^R{&Z_mZDN73Ha*rf(%Lu50+#cNyGlEAU6k;JQ32OTR3RBYN5mh8~C zNTE;{tyuHG>S~e`jMNiId-bkvTeGoLve3UGB!h9P4G1QnGqpW#S2)FJpwSYVWUB}# zj%%&bpmbgJ&p|w7j9?n+V7o+%0-|Z`%cj=nLaOXOW~bmU*07gQK7!&MP>9ON3EB|Si=VF*|wWVjz%jNIq$9Q`Sc1IWe5%`?e82TCjh9^l~atjQ%I z^0jVDS`P6Td<=W^~JSrWsua%~z$iCNr>dD>0y-I4WvDl`c;1D?%wa z+)qB0jw56_H87ZC6finS$&`GjrCE+L4jQs7W_;~lhPDB~$*F9#iO5wMH45z=dekyp zs2zG$e>*(prsFPx6y(yDQCX5s*v&dQM%S7zaZ1*C8Is65_?qA z92$X{PfDb5RM3wmrbB~KaaUlrl2Mf(ojEj?q`^5o5aHO>rN%l`8yQX-rcqfpbFvEB zFlF?nF6CiXm2t_XDl?j!qi#lQSrAk+bBfsWlne^xV18RDf`&#hXdX6jtL$Gul$lbS&E z+>Vu^Rx@m4RXIBIR}V_3HE9zzXU|#Wb6OHNYNXw3rD$_cRz@pM2^fF?;vkqy*;}z%4YI-!}68+wptX)FsZ0)7Gmx$p~?0ttdp?Q06 zXKwcwa;z~%rJhL$R8<_3SnvR^9Qd`MKgB`O&)IIz;LfFS;(be2ZC6>kw`*VBN99{X6SBK)3`?^TgXTL%ILCVW zxW+mP>8&bCR;KQb3?jrhb5~ZEk#5#kE0S_O>UNxN+MJ($f|{14kw$j<;;f~#Xb*hX zl~z!>?o)*9P%*TP!Ocy#X~(5nJ5U@|IUhMDvr}@>Y+H(oAH6~5urzIIZC*R(yt0>1 zHdk`nfi?hZKUcNc(}P}vF6Js zn!!}CJAwebfsFUauR{%mbtPnZxU5>G2HDMgeDVJPhcq7(>J8x7Ew3%El2~V%NoZxd zoBenJHipJVS&NO`2N|z~FVXK&q(u>B*|0w7&-hYYY8MW~O`HNsu6P9Z6^}gfzssHp z_3vLr7%0U>Y<$|O&nGKxU5%y|i(m%i$!2mg6cdlbn&xD3(h_mCSb%t~aVkX^MP_37 z$^(FZ4EC&RsHTQpt$@dz4?~P}tZHa_SV-NXmCV34Teo3VT6Fr`=Lg9 z_5!L4s2E{WX~qT*KhBtvpEs#eKJGXme~ocfyJvI~Lbbe18M(+Guf0a>k;jm7!`qD4 zNf+7thIR^Z*C(kywTRJ2G|db+Bm#4sXC9fTj8%(oQoX**tdo_;JOR`3siTq@{KRlM z<0h$zQaH?PGD**0!l#!_yFum^!W>{{C5vyK%rApQ)-5z-MNC%AQ!PUH4apnN%t6OMezl?D4Q}c6SNmLy@lEqeMp?2ufu2d}j`^=WxNt!ZRFT{YzoP3> z=(i6v8%xNHnH^L&r(6^2IjW~pROF=%%XC!LrLpai>sFJ>QHiyDk>t!kVd;~=$?J^P zyQHZS%+Z~!N`eM=U}T;%)7HFJ_VUI^1MLE7kT(o)ok3oCC)YKvb>q!{Q(H&Axt3#T z62TFCeZ=SwA2vPnUW9Xc=~*QF&KY1M%&oENDHP0&APNGU09bTAF`jC)iUxNalhYOF z+I8-?uIo*xNb*bp-*X{sDBYgDbCcWhuJrt%GK13x)AFxl1zqAP^EG3Nv=u3G+^HgG zf;OCS$4aW{gO5)C0OyLnS%3X?T;QB%zvg}GX+}wCO0#7LiIq!^2Y$HbsYtSSB>Ero z#cMo_6J~G-!wi2ar{$L*70Enx>s+#ndz)!vH3RM=f!p!_0PEF-$mQ?>>M>WA7_f3V z2dAY)Bw#5lI3AUSNTysHLLp-!!ZWmY$I_oO zA0jSB5p$N$u00R*sn5JtYhhdagVMK)`#2|Vg6oD>;a6Q zOjU8m?#n69CnFUuaxe!YwrFG-+Ck4=gS{!XhZw8egh#Q+9PT{i(~0Cq^J5wI_o)J@ zJs6I`y7%u=sU5i>^N;ITx`v#+ifwNz?kc3H!OG_YKDAyn+Ccs+bpw-HG6s!-Q-FT( z9r^D~of!%eLXr*#eEyXxLug_k<8K)U^{Yq|Xl>sxWwD&un00`BN9mBW`);>-bgn{o4NV13L6L{(Wk^j9Eb-5_9-ghp}Ti zMPLe$NypZeLy?lX0B0TZR$et=3O617bB=!svjVI+^9bX)&N}xVv$VWPIv>oM02o!a69Ar)uKVl zMZ)@?`01Le@n97vXu-#)*Yu<^vq$oR*z2A-&VR<00pt!y2Lt~AtyT#ibaE8nU~&4> zFsiM|Q;)8B?LdlUaHW9x$?4jo!h!d3#(MFe%B{F>l}RM>NN(ryrmP_qS@qtZj{nUO`}S+c@dPS8}2E@TZURD=}Py3OFY?ZolWYDBYeEaDR&&{{Z^wSmf=_ z0qhSr{HaMUa6V!0?b3iv5Ur*xXC=}#yG0@d<$>*s&cN}|v_37+DCp_d1aC1X_0Gd0wA`Y>n zU`T}tC>Y@S791aO%~fWN-{P0xFx$|7$YEmDvhID^#htjwhPYy@>lnbaEVljAv=j2kAjc+<=G94gfxa zq`>Fp=NK8GmjiN)lb*eZrj-MRCy}4TP%9ISfrfHH_UTK|fTKCbQ^?1)N4uZafKMcx zdW`aD9mz8JB)7i?oTrXG4?U_Zkk}laf}|%PFHCgfpTdGfV&nsi_VxZ$A`p2PCy!t8 zq;124!CrmoMpX4V>PK(Nf>`$DcaA&Lgsp%AQ@X(J$geJR|QTv=2A zSYw=1gsZeM9R77nh2(YYKf;(FM1Tl-+18v06L=5WbaXf zfI9n7t|TP5Kb|PKi@#}wPfV|;^y^jRxtL$SS5r z*^;>+WOke>Ods)^c74J7Y&d9097ip2Im~naT+DFmIvxbLsKlH zry{e&yHBP^^QnZy^*>6hg^R<1l6XBwd{cKYBX8aH6;sa18;DpZ1Se=d~_ilk&5WaA#y z3b70haB5a@vkQ=W=i0V}tVH0N5d4@=e)T8ozjW1M8;^r-*}2^;q(AXPR@kD!Cg@NhD{# zuWl+L!MGgL{J9%ype)Cr12yblO%IAn(zK7Kd?9;fbD_tj-fHq$B&?=pFU-lrdx`)E zRa_7WEzpj{Po(L3zMVMJw8pr&w?bvHxmb%d`=4Rhi;;d>><}{jOVa zERe|syrtrfG?OFlZ6M%oB$0!XI}F#*I(DgdZ#aV2MV31)IJ>p&!pJV9U8+x-BsuGx zeca?6U~R9X!PRq7J|`cCROK|aN2=);TPt6W8LtpS2qgOtIPj4LYu zH>gpZ1;#7PbUkMLYb*Z%2^-5K%nT9ONxS4p$Co1@F}fx>mM^9rmQU_NMdSIh2VR1*>I4zHyvz9;y z&49d;50c(HBFs2Lx^D&u&0Gbgvqexv08?j&Eg6DvFt?O+^VF&qpSDmbkACtkYSfoBs z%X8b@R-ahX%qieCyiV5VUz#K_$HI};urKwKAjob={c9Fmrfg@Tj8;6X>_}c}V_B_@ zs^KFhmt$S-7T|Jut&Jw-;Be8lIj%x9k@10n>t2VT>ENbr6QY7W&!DBwQyw;jAd}zoG?#jedl*3H>71X^tJ)oL zq~ec7i(d0SQgi+l)aiGs(SQy!&MUy6y<*^&EA+2H(yydc5(8HmTxxdFp5LWNlE^o9 zuW9&eqDij!y2j4kwisLO1;-dzuygs>%lcljs>3aYHT56t{{XAA`0h1E&zWg5wmmQ# z`GH*ctEzHqvFhNZ2~>*nKKBl>ruhgY05j7jqJ2eTP)Qq2Vcy)C5maQ5bB|iexOsfD z#y_Qev}j*eeXq6bY+PQMn;~)EBrRPo`^}Tdjcakds)qH%;bkQ@cFmoYwK7 z(HXj@d-k0)9ETix)KlKsvC7H^<6d_2HZ#0~OcF|Y3{6_YuH-uYMuw>@ZzF7M`})^1 z(7UlCn$|m*A21d@y{cPi)thT{tyj8?B>9<&E#IyxWR7CPR)khCV{Rv0>Jt6OeIT2B!=u^2OWI zxk-Ty#aee)2AVdl?ttW0)Hh1_&syT+l#VM(35dbXLy1w5*6vr}RAS5-41~8Mrg;3S zt(%u3x=8JtU?+lWDLWdiN>M;MR+Mlmt})FE2pvsMa0UfoDRwC$A1N1*Ij0T{Jo8b~ zTB72KDeIinBduDDb5hZwEks37yU1+ztJxhYIbidbBdsXt%93`_#Ayf>U(RgvR;GoJ zkVR)mj5^lQvCP|Bm!r95ZhBUVYA&MztC%d{^r@BKy*^Y5vqw^zlMZS@s5_ijI~SQD z!UAhSB9IY~f5M@~BWTUDr?s4%R`s-?fE)0xLOYa=aCtSU1?ug{IQ(lFMVrEX8P&aHDdhAvg9uxN~9r;56p8(_JX79R3y2}am`A*DYSGj&lF<_F;9~4 z5r9QuL|vD6N~tx=A;)?-UF;2{u57%`$*KQ(jDAOkGGXV#hKGK}V{*`p_lmgi3QV2_rw2ZPI^)7>?ev( zb5#^E=BE~$hC#(;K{w5c+lEdBV^ZkrqbSW03lrU{>PO|S+|qfJ*(6{qo>Omgq7h4C zmBeE?6<#y7s?3D2s*I!_D@e~v4aZxSor^9jK10n*yr|}>%OO2!#n>jU1^d)R^H8%I zU~1Ilmf}pTaz#=3^U}8CDE|N}5Gwq3u(0Y6(wDYT(V4sxo4RH#lpb@1HPO6&L|aGF zog5KDcSg7;si#ZxMnSG>mARyL(8GHu`Iydfb4r-a4lrspZfkqp9M`kdxH;)aX^S8| zY1@TEY~4yW5rzd$P%z~O^$4XL#_XS&&+gq@`d8WPMk;P!N;92AW{iUtPa#}gafy409U)mAv~JB9Km|@sZyOZ)EGZwU8hxSY(x|edeq91 zXD78{8?JaX;dDEk8sL=~9;9(lHlB1&hO3+2-76{XH&q9@A-d9z5k19MF;w-r(V4@F z@edGw(Ek7i{5P++hINk<+QWW?tg4~qNSJU{K;NHC<1{TF%IxSzh8_B?1F1%v|k7zyPs5 zI2GT8%M_E8k3Scjy%jA_-iZ89;i+ux^(577zRPr~@XBY5B#OWgRF)aeYvGUD=f|H9 zyhotf=~^Ylo~5fdFC(!fl#otvILP*^GsSArsTqtm2Gf#r zOJUkn<%2GtJozaem@}=`0G+>)c z4!e&$)RywWFx!q(<~bbZq9zxbPctepl>xJZk=Kl#GhS?}Gtp2&38ioZjgy{mc<1~o zR75#Din#UQR(9krJiM+3PI%`(%C!}dV08o%26^?Uja@7^0)d4$ZU=EW!S%%~w^OiG zk(hGDX!9$UJW9P{3) zOe5q*2_3S1`|(K|MG)NQ80lGD)kPHKyOzpQLCL^8^U12he=wP32PY>T0L@#J26HQn z^V`y@OrT-m1OwH1=A{z@-bO2)REGJT8RzI?%jc(r)sU_$>o>E268=W(-K$? zzvE3Sy)eh8U-RCo#=6*Kb8JjWgUBOwU3*o6IK**Vy8@%ddz!l$ML7S}ZoO88X2mP4auYur7X^wvND8OKT^c z1ahMS3g?b_$F^(VrHrRpxWMy0g-UwNVO0POWS(=5{{T<^y((cF4flJF{{2D4SlhU7 zY;o;Q8%m6f5u8$~PUzkfv01ke2nPfcpK5Yiyr?j825>6mZr)oWvnoGPo)4v3jzb<1 za1Is!UptxX;m@8cXO9+jaLpmi+Vk=l{04-8uXuk^q|lK=Z0O8b zyN)m^raiolFnW7cSx`qV#XJMoJ!wm^Bf0eLL!cZSFu{K+tzfyhbxj5$l3}d}++(Lygcg#aek4V^<5gxB~}0xz8A`wXuUTz{v@< zSDXwJnwsVh?E7|kT$3g?pg8O6T1g~v!ew8UPS_ni$7;a2ktUG4=Wn6OB>M7eDvv^- zjGKez9nv=~_q}oHS+_BuTt?k_CxUua$(aBv_YbBsRL%!Hupkdg<80}QDk^or`E#BQ zKdnaSKrYHL>UkfAd)0{@(2al&KhHc=cz1Rzco_MAI)-SG|J3}Yk(+)=>)xW=6l4Nw zM@{)$6VF`pkHhq#umR&8ah&JVn$;uNB;ON80r?I)cl;^|O0fnvJu~Y`ShkEF$DH6}`P36OK1`kt2Or9(lW7~2j(8o%zkE{;;t}@qgV&5_>Fq`P z6%OD`dr8JN`Sj|-4bI^3b z{(Mt}Ad;#%_35Ag09{}5h!{_l5t2?S7ubqU8`+8KXtFbUl?+>O8w8X2@$FEu#6Dxk zU^&JIwOkCX!ty}r>-beU_A3U?a7I8pay!zH(OjwAPTYb&NJKasW{p@ao>Z__*1dBuXBTr!kHmO$x+AWoK&<;h*U5gah!3S98xyqZ14|m zPw7jyI0vC0ohT!#93J0=QYma!-Gi0M;EZ?tX;(NK#|Iqar$6CV76RiWekb|T$q9^r zaBwq@y=Z7IKH@0i2ogn~c*!Go$bAk}56d-Mfzb8G9nB(zBo_?a^ame@N^k=sjAy5Q zN79l+wpJ?J%K?GS$;VJz|ucDxa8Vr%d|RmA;nu z5f);Ks&Uu8I&`bDM<7D#Fi$um^Waqo5-r2b+(PvOkFU~>QHu?naX$GRv0u8Qjz_h0 z`h0~~%y@$j;oa}_tXQI0l?ovMvB}PV{Z)U=`2%h$qd%QH64zqppzzMwU998)PfmJ% zRf8^%6z*B(Nd2~-!<<#9+(;fyat<&~GyXLW2|MK>aM=UWgsx!OnEETEWXCEOCm7@t z?OCT!xrs9@P0w6*uC%qjRh73D$R{6{wLv}9YNP{#MtS1~rN>gD>~ZXj4hheorfme| z4Cfi=it6`T$?}N9H-D{FxU|3p;Q@N*80$*KIT#9r9 zBi5igeEUJ@3C3~ydr`{CawvevatZawG~(F#&l&4dJ(I*n;CS__&FDRSXtNGsLlMY4 zw{D-#q%FAQfTSNvU_eyhlYyR1G<>7i-_nscCEjtr86Elm01CGefnz>kefYwFKwJ-8 zsj30gH*b7X!-g5a7#w{?158$8UxU-GI#et%k~qh)sdK>t@b5|GvtxjH{OAi2XB>1V zk%8D!nF3(AB=sJ~o#pa340`j&=}1CkfJZ;214v^t6PC}=4yJ|NTRA-S6h8xwGm1g- zx6FSG`p_r1_uP0KcFF6Htsui>Zvb#lLCqrrjPxRy$fusesLy|D1YPo<%P!klRY5;6 z@8~nmJL9E9rHf-2V_d>~o%K zPcYLwLCKej-39LU|tMJ$r#5>^rLoq z@$KAHB1KVxbK07%xMZB zNfR~-j5gp~IN%)gBL=>miXRMV{vEZlur~2(19SYu24jPo`e#qQ(mZV?j9XvK zO*w3uCU~~ZBqf<95p4$m1pwfcP*`(ZWzyLAXI+*yxgtB5q>Q6UD0vLZ(Ks?E%^K~? z^z-@~@zN zBWO)(^Ih2@N2Xmkl_MkOSHZvx#h8p^p&9N2WozfFrr6F1!St`4#MAb2KEnl3RfW2W zj>y5f{VPTZ_W_^FKDC6Bsa?$AV1c)s^PYV$D$-m8`<&N2W^Y!5YSua=a#%Vu4ZX!o zuKTvDWVzsHyhZ=C7Hzs`HFjJru*Am=*P_X)@;_xb&^# zCD7ohN!-#1vI6^nAo4v&wQEf+zGH{wQj3k><6O|VQ2zii+n-+5VtJuuIedY_H*P8O zCQ4IUBJ#x3?h%}k%7NbdAa6?~1oFahm#D;O4m>g*;WH-`+{KA3ah={_08!F+V`rH5iCD z29e#CPxrBM=+DxHX8!KD6^|1=u8ITy!AjqLS7q(`?MV@s_Wg zeMi)(HrAz6piS45gpgbW`b_Nx)- z@B$h!gIZ|=C<;z~waGf2j+jK|FDy(0a&irGHsS6iB~k1J<2Z=v2!yW?ErnsBh5 zCfdM^SFGCGMQ01(}g%TDN07EB0!vEnzIlY z#ZWFsdUDT>^)_XxBx$v}Ki&Y;Cr!3vl7gZadFp8UcpPIi0bsE|&k?08gYA@`& zINKx=Jt}6u%J491gqLLVnzhVhFK5`l7`BJ*C|aj;G8~1f4|DHTUR~VPsCOaNT?f3U zIR=4nKW9xKCN>%DdW`)lRWZCyr%Gj#Lx6t@k}y?)$LCm(--y%(VYm)R<0t7?R`?Og z&*ND*G;bR5>duxI1$pUNcW}w(WqAg(zqA!k4UcToUssF_ZxsrZu3WJ++OuTs0aJ%O z)DML`Wc>wDms+!rEi9-p{?$=^ZrzbsHZvZ!t$M-iB5yYLrv4&gSi* z3SEo%RF*0;%XS~|E}w;TF`!tLdf*D-qk?-Xi>DD<6#9_ zwNdafS-Al5Ouf}CG|NW5)UG47w~VNHWnhS<*eJ^$21x^&%`x+ zFUF4@Sj!%c*1i^m2=15 zCq1j@eRuZF*9yoqPYYVwf6qBDZW`qO0KlV(Vgu+THSopuzAfWBTX9fvyT8-6D~7)D zEzF8k%3pV2aI5|_y`#C4oTb$I>rwr!{xaN3WVgMsv;&_m3nTEbV+ znN75Q)BG^~wmbvk*`m_?R}7vUypV-iCUGsJG5-Ljzyg{70Bt}Y-mkH(wM%>Zbh@*e zIpLW@q>(UmWjzQZf)A*#=4R7WEWoRQ&r14R;J@t+<6nhZj8Rx!zM-L+GjXO)$I2>x z^F(7T{5SC@!?yk+@ZG?g-fxyfI1<4q zA2f0=W*?CpjEe1&rGTnN=l6y%4?uH{IqmhRo^m_YDs7c4Oi_Hes2$d_CA!)&DvIiC z#IDj0ZuPWivk$Gso2>Y#jG$FTm&_Te7jLKu?S-NvL|lo>HVURXfsRgn>8K)Ie#Xd` z-k!4608VjF-HJ{qYO^#1pwMNk?=aH&rk5dqSSOL&*EL+u-RXvZQ&cCpRN|^Ixy@G* zZBsNp(Vi)dHyvx9p8P9_)Eu0WM?v*8pKT#Ao@+&iZ&Qk*0CgGk%>wx{2H~Hr zaJM&m4);9OOHEOh*BtlhASI7IhoxGB zQHglmMPV!qt+8>hquaWi_<()<1e}5 zuL;d$bN;(eyN3D$`Ix02_w3ha1@um(gJ&G^*1Yb2jz10b&lIPE^}SUz-C5Ikj_Fz` zz+!fTD*%dE4ax}|5!~XrULH#AEsn*FQ%N>?2ki;*uf;zO?rro9CqgY}tXWE4POjCAMoei`(ueKzvO{25m1figyMwU;|v+yZls_4TLikK-n2D4`&)pC zqbArDP?iR zf3uk!g^6QnJjTw}=b#{Rb67VYWJHabPWC*IP5?fm+l*qlT#r%|Z=soSD!xkn)g3{2&`(cK#Pe2SMvv!|76-B5tS&GyOJf#G4iBu zl|cY~DwWImpS;Kb_x1YK`6GoRM+Al=EIyT$Ie#+_zF!#%eGen^uNJ)S&wh+-v>R<8 zKtr!y^=f;P@uCP(S}}}{r|VhcdbxK}GCF#X%BxFoJj{m3BPYH;3gVoN(k~=zK5eCe z$SOMX>FbJ{Y@xill!k6dZZrAT0?Q(>V9Z&010(v>sXXbq(EaYLduFn^O&T)B(M~+T zMtT1L3VTig!l*gp2enneW%DGHalp^5GHC%Gj5>2nX%BWCxFA(xzG=&hBJrH@ny))E z^*rO8aZqJ~`!7nC%?o!Eg;5e5^yk{3NxY-;bLpR2bUs{)?B^^8Z}6ZgJl=T3`vLiiYKPkRyDnocHgFM$3Gwo_%T9+k&|r&w6V)1CN&` ztlq?lzBV9|4}QRB`P7JKxZJ8Z9jSl-M3NDndVW7z(n*~o-JQFRRH*CQ2im2PQCni> zog8qt+9Xxjj1J!X9QEtXUDfrATbTpF3{eI-`|Qj;j!#<55WI@27&Efv%7TB-6`edm zt{D#t{opx1l+)~Cayyw)QOL$~^A0~6^j`+*YS1>HBVm)~L(q_V*Egm3S5ee3!91wJ z$az5k{vA)@UV)-$3!}!(a$|W|pP73vpv`-EW(N@JMyD;JdAQtFB?lYbn*{IV@INXy zgeN&YxfmZ$tv@+Cx|ZlW*1S?iEs7O8&rytHHT9oY(C|II-P1GS$WTbmc^Kqore$Kg zj~k9nO&mzLBPW_!2*yov)S$LH>DDq?T#yGo{+XvNe2}M+`D5OtDUw2+xjvcxRH(a7 z7p{5yKPvMpVIA~63Rr~qEyVyF_9K(-D3&*2!OywrihOc26&z$AyNPv=_uvfsP}f(Z7fi9k?*e98}hTG7#F3TVcS z84vFlfx#el?OHa3xx(afIUe;{!I1Rp`c}@Ch{tKi9=v`Y^`vO&sSc`7Lu<=LhzI${ zsIGGJYDvdAJ!`9*2$($Q@~&>}2Ikw1%g^ChSHoFoZ%Yw&bL_HYoZthy8RPt#uQA$H z+XYXjZ1y6xS|oKLzVIFS2D3J{;Jl3Y?fBQ1DthX7srD)CQW&|~J9+_4fmDW70Qz^% zJ*wKmlKhR88?s3C6;65HDOxouRa=Y>4}AOA4P~j*2c^pv%u&wO>)#co42`xj0*wAY zO2>%1oVt?7kO%8lVsp1D#~`0^&!{v}T9r4YjmTZRvb%^Od-0#GSwKRA&phWjs&Ra( zGJ21x{dlS4i6>8xc}fTjeZMnZS5`1r+?F_|n6q?HP6^-~cK57_<}t8G+6U%%uCbI^s{RKtQPbVsSb^6nog^LVHIT@;N zAzW++2h;p&4HG~A)%>cJ3B#er2p*K#6|g!Tz0cCE6$;$-&u{W-J)u~$9-y2N$2~vJ zD^%=y_aNNC_qu`Gj{g9qSKiK{SE2k5zr9+)#xvCCr>EdJrVM`ygS6zH^focO20>hq zF`oS@IFR{evJQQFRE!2mQb!r%o@tS@ggk^}*CU>2)GkG_P;6|5&o~{aq5g6)>VGO3 z*|CBc4l+$k^B~5J!-je-=O4Y-mJJ8Jpls?&swO_xn1lJI3pCDt|mt1N%=+* zkK;~eiytTelg51peJRfn;kiI0G_-DOI_Hq}2k=)T>xtde2L&@XNimXGC&#wchtu{s&+P=Mb{{SMZq%tx2 zK62Uly5s3flueWw3Y?BTNB;m`kOm-d2t4EuO4Umlw~sJ>C#N~CYRj#7Dw z3fvNM6!gy(8x6s^!5PP`X*QQ~tHIr#K_XJG5S%;9P6ozwLrp;o3B0U zO`Qlh9q@VfuCcr&d*yGOq(lI4Pj7RMD?PN>U?8?wlY*(-3OPikjLU0DE?g=dfSLF+lm;K z&T;o_XOIt>vHUJ#%&TyM;5c*r$+AFsIw8t>bGPuJ<_^6=ILdjj@dUzQ5yDKYT{X6qN_*&rH{2 zs6nPApotjyfPgWKeSN)_ltX@WgzX&KHb!2lT0y(POtPin&9BkL%KgtTL_5kdb`oB50L)^aOV8 zRQ}bp7(*7`Kq%bv`qEz9&WO=0zq<#p`c_;Mw&H<-e%{oFW2A~8a~0HpN7N#Wp1cg_ zr_!q3_k6&NsntB;92qSUtjxqi@t4b%HJ&j+JgL{W z1RV4DRbvx4$;cgf=DT_H@p=ny<8CrXarDpftX0zPn<6#b2Lz6ktQI-{040N9=f6sk zU~)Hnp+NwAz!Ufro}SpPw$i6u7mbj)EAw$t&0w~`7r|gMJBphK##JLFfydIUD9Y^| zcN|a=(>dyY6HW|pLi7he(veAtv*qWm0sjCdo8_vm{z*MQ!xb^e<*)){aD!iv@!wwJTK9rhZQ0I2iN&P89GU0j9FACunNQ3)PoG@Nb3&{sRF$9cqJC38+j>pH zmRaMG8_N+A7;SGkHuB^g1JAJ_*6dy-)P?KmaY)Y^O&QxPMj{nB1nd6T)!&deea+qbd8$$r^_K+MEL-&9nmTa61^zEL%OVu>JM)CYZbd4iV9Bq3f z?(9zX!73DjGEneNG3j4dg{ub$#w`5fFvHZ1Nlt3l>+?M?P@c)0W!pVzMm4b`jo~N-fA@?iNJ^N0KngHilgMrvslN)Fl(@R+_e- zZ5pim7E2i}1D2Goccf9_(iX@dXXQB?x>S0fi{sO@wXxH0LqjsF>JZG2iDiw6K*+_B z(me2_V3Ei?6OBw-QPCPuz)8>EcTAr1#FwiKntK5A2_#9agzqFWK_U%{o%mpzL0_9K zxL}i$UpMNv5>0t4HbzbceFb(pSBQL@=wVlABWc&?4y1f`mDst$sA*C^Eg95dh#YWm4sp+ZYv*y5l}(Sk%P^9q@gtd0f-}d~tt`7p2D6!% z93E;&=UxHp^{yz+$Ezw%TAJwjUs|xQ#yzVtDT165Ggl**{{YuoscE6ZT8l-n%(y3| zILKK1rvjr7gy7^3-&&7;0R2D$zwV!f7dd$z=8Q~)9zpuntP(<&&M}sJVEO@EiI}4j z4{Epv^b)Fp59vh{)vtbO5jDB(oyLVh;ziySbr!s_7R_nRH1;p06e74s`A2|_{ zFjSH|`eQs*ds!~7B$CSLZQPiJn>y{~)reEHo<1xsm3@|yz ze_S8NsX=)qo}HOd7|5G2!yvH!FQ~4HalWIgd-C)-$Zn+>MkgTPf$LiKFTK<;>)+C_ zr3|ue{`FY5nd4)@hHyG(AdWM!FiT8%wbKboc!uBXe_vpNV+Pr5=no#S|5{=RNm+(`@vUrogmX8}WmpXYilQWP>*~%Wd!9oUoL9bJu zIWOBc4dsA6vG`Z!@9fp$TeR`IXu4i(MKWa<`7OlI?2D%;vr^~s=IZ`AZPHZ^Z1Evj_Y*+ zbI2|ChtrzNlf*XHOv!Z^Rc@sRHJoYGTAdTA4ViLjY%NpCbVq;hbsw0l!+B_<_lh>L z{sZ$aKDEqvtHhoY@aCFzJL|b2gfK=dg@Tsg6SQzEo6+_CC&U(}{{Th2j`9t~OT^g$ zhhyk|wb2R}S2<;fv*pnA;dNlcFgKRK<0PD)e@efmUA3js$s>$st#H=%mlH;0i=1xiV}l}9;|HOx zoBLAY>JZX=tEFe(qX!bvOmPR*}P_Ibs>< z4XlRXFsl)2DA;Cv3i1!_ITgP3TZd7)ll@pGt>N@C`pN6VP`CBXNM(lMa91PTSDx5T zKoVU2@9yTe2Cj|!q+EOS6_lu1=wG%pFCl>=I}l`du5MW_7bQW!tw~P*0NzO`2tT`6 z^XgGA?xP3l)ulK+jO9@wA-bKLZ#8av*&tAJ$9l_I`Q3y0Qe6{q843?d*V*b%w$QQt zw}Z*eYgy_t+(gnxoF`H%&Af}bW-%fY&tBEq>GH{>+u)7l_4KDYD%u&U&9hN&XO*!Y zO-*%keQO@_*&fF@`qvqKtWL${i0sc801D=3*Y!08e$-JqZQu&1;hQp+EiDg7O@s&ySdM>{V_x{TSDr?N?w&Ze5w|=j`U>fW6QV~f@yge1^$UG|TUfX17MByB zx&)b29-j5PXW~2gW6UwdY6sj^7(a<8C-JW*vbUR1h_rgZCmCeNw^2j~qhVYnjM)P`HB)_8#QKILN0A}MH}V%A=cPfVc#}n9 zqUI=zuR_3Q@y`{|>YhBYwMB*mSyyNbxyCbC`xc#)4ZXZt=5x@KNwk+vf$xmQSx;S~ zvG;6N-~1#C905xS3F=Q`f5N=V`^MMK{z^iKjmT0utx=0qY4aq2E_02%56Y|Rj#|kO z@vx4OXR9sDGq=s<#@Ncbuo?P_&7S8~iGlN1XgLx_-imxA;{@2>0krvGCaX0>fDQY*Dkg-Y~2OazDnl?)3W&Z%w$;^+*=t(()&U zcwA*&9ASa_it$ee>Y=qUZs+}AC4Qrt_N#l0C^g~Zu&$i!k531Ua$Lv4-w!@CPw+?L zhNbXN$G5LPhT*#~==zP*W=kmKA)$^(Jz*-q1N;a5o}Zye$mk?O8CU|W4nYT@9jo$R z_SUerZ;AGk6PwMHtr_)C#_x(r@V~-Os6eXs_gkX24BWDn-BNE9_>i;3BbJ62B>9X^cd$R7L7t|*p8cu3LuKM`h(}5d=G$o~khlb4okrrk zaz^Gk=Nw|baJ;#l#uE|t^Z*0b!Ju z4013t*N?3~O|^Yu>OD5VmdRF;%9G@i$s~Y33Ub3FuF9v1_m^YAVeq}&swST-tj-Zb z1>98iC(vNmEqmen@3c4oD*fyR&e88*On8&SYhiyJ;!`$PPT$!0XyH zo=DWy3Wtb!tM1&7&=1bJd1V)==yOu2v^+>##}N_k$?kJoFix?Mfboy>-kYflSR&Xl z9E9T-%NoSm$ag;FBd$jy>N{6mDuz>|b)og=?BDU0^WkrdVV34seG^bC2B8je0%zrv z5AQ}!N2ti}U$(XvcK7ztU0cYq#VRa`A{?uu09AqXAn{+#hMjnKDlc69EA{^X_C5Ht zo+R*~@II?P?L$UW_F~7GZ8P^rsfe6^x<{d|i7sVydHBjsoK(6WZv_O>;LxOF>rN+% zlyF^cS7susvznRew1XoZYiPvAbA1R|*tT=Wr9{V$MNhYml*SdcjMdpfRT#Doy%ZgR!ZPD8@+1PYoRX)HbDzc0{?wlg%!Lp3fZ=lAXHqhH^nCoi`1)qQ zHty6J8doK^AH>xV(jnf5f!7^tx)g1>B#5CyWT88{5PijT5rK0IcQ*NWrB!rs$Yo)WN3j)L zjILx)6qjoR$!RExXGU1$W!w?S;fkKPJ-gTDXUD&X-a7F9ygWQmj{$c?l}@)FL71_Lv0$OL2#E6%T04o(Rk&JztN#x*4^`W&tm2@DE%Lwa(jW-b{>&%^LMp7$=_DBd6t6b!*t2 zQdp;BHVU+7oxOAX>zXcsA~J7x$L;HWqqX$gv`yGFdQk zSP}p~uNcQqt#WtQut_t0nLl#BDzoHd4(Hs}2fDbDGLVuEa!BU{e!s0pD7t*hDP|xX zt7MP|wR!W=9{mkuu0qTk1n|W6{{Z#Y&Ac|(HpHaI&5ROI{{Rr`G19QakjIlRFZ=_s z`qN>#U`r_4+0R~vyy>&of@QgF<(Wi+K&tJ4N#pbFS^iv(&RDaNfw-LVJ^d?ME1i}S z#Lb?0QaCx!L)Rv;jo4J!G5|RDuP(FH^r>tmrByO8e6J|j&)43z3xk$qR@?~rfNnF? z16i=nVR;o%U1VLSdWI{Wagq*hSeWOc>|@}ZQ9z>&x`3mm^% zn}LGF9mBOkSO9TSSm74paySF6PXQ?rL-LMs=}d*Z#oN#hwJ)BDfq-+=Q2cOXk1_g%QR~ifdRK3ycrh(!7dLWw?6@kSa5LLECpfN~ z!&)plPMn->o?sqEJaycM9=*SB`gM(7}MDjQzziPA&3FGPOQejJQPBC0F!L!hYWeZ;Ab&qRjc0ly0 z91c0_`BbWaf>w|!{l@(N0Q&Tn0rfGSaTM)xfP*B1$sJ8EledK#&0Gl{I6U+Qr4Ya8 z*j5!VjdVAmkBpX#&GNB~a!*n}!nG{oDJJ8PPqkOWDc{hJm3G}8Spf#IbWX2p*_!jq zx-3W(j@8Y`t0v?*AC5m->1AIoJ+1-BJhxxcu&0aU>R9>?m4!%I9TcSQW=x?58XBc&(<1S$^>#XOB z?`|Fav00J`)$qRg&P8-45z8)6j&Y7S=~%K`vdmsgdyM0sW6gP071`enh?z`fNNkP( zBh&EjS0ce*F!9)t{Ea{Yg*f2#QT=`D)DIMK?Q##XBm?h({xzIsVwyCghtF`T!7@kE zw3!4gurJM$G3lDjwjl{I5Zj0VDf_>jTW$WQjOU#6{Atd2*tn#Elxs8@^8O#jyWus&u8`?%;kb)lPg%1=GLyHvvwMt^y87@XgU$5gzkpeNCXQoI009u)wBY8qQWNu<`SGFpkh1@v+;~o7y zk80V2N%JIDZb#nEKgq55bogTd92Pmw6b=O(r1P9ab`#t=2pNdz6dJo0k##Grw3vyT zjJt3>dK&ad{>cPHZd|A!?HK$x=~&XVGD*FUt`w8g>&+_^na)Y0HMR_{00$(m%nmBR z)9q12`DWuB@mH?qiNIH3<;VK}0ABS{Yt)@^tUv$&J8(NtJuFt1*he`Iia_jnI6tT1 zNfK^;5K6h^VBll77^-raC1CEv_6I%v&1_jsX$?4;v7fPF!Oc&q;a+L7E_`Aoz!FU(H>W9#2NsyHs= zgDC`n1|4(x(RHvS*{^S++1r(tc^TVq1w!QhCxKR!T3fsM1hF9PP^0R3&1N&nI2m;r z{E4W|>ME6FSU?QBnB?+0^~GFe6dbIc`t9`@)+kqQeo&{JpIWCSwWF%e z^rFt;5>3e}%btzU^!2TXqDzMJr&41>f^&ci6M{(h_o2x$d2D4|!nXcUl&FqUG8FD* z9gkj_u5MHjTos3uCx>pi{426LeY9R=&f-^Wf$9nG{&QTL+P$>FC13y~sOx}EYa>-H z2wGl4pu?PJxiwlrd37l>Gq+%WgmKcY&m7YqDm4+P96wBs`9IR5w4QiiYjXZ$Zvr&O z%ahcT{HZh?#U{33p~~d<7{+ThdobBJBe$`6Ym^R_SzyNjcR8~Y;4oGrGD~#k*k)Q#IQaH!v zedt;e)yq;}8Mi4#Ben-`)Yg2Cteuqh?nnOsT7%^&0aBzP-R@3TtGs4iq%8|@LWa*y<%Tj2bHM43%B?NW+(?N$ zgY8K$g6L0mzA4%{lw&vpjzOhEX%t>*MKT|kZ%lqQ9%Ob7`El6)06uCL1A-4d{Y3+M z6aA%}6Mz&PfKTC84f7&}Cum@E?hRu;^dPCnTpqYS;-Q}9<-*8vQvheB4VfE|Y7#yK zLJjLCEkb4dXtxX*F5%R7<v0Ish?pqrSB+|3@-o&n2a>Fr#y_>)yAsWX-YZ6Swa^{bW=$Rd+cV9bi! zcLUJ>0EKN$Mebu!%b}O6Y4O_J`7pLn0ne$dqPYZd!St=`i_h&3-cF&h@`6V=>N-_c zw~kM^aDC4oueC&@u7$ zD_%z7OF!JmJahhf`qU8=&eaF6Us~6>5Uidq zMCEw?RRBlB3}+u-@u{IpCW)GPW?8u^ix6c$RxSwqjYLts^W4*RI5`<7sP8}voSZPo z`c=rp3~(3+bH4IT$wA-fNx2V`UA5KWB%eQeE&!P3rNHP@hfDf%ukuF)TmPt!IF_D09tXDk? z0pHh}r67|fk6-8bRnY99XCxm=hCst>oZ-12N_HLl4VL!uSe6->>`sb6;QeZ;EXSUn zwSA-W2h)%`=Ad|ae03yXdr}Jup@`3H)8j6!^*@ygarcK#^*n39$2sHw0IyV}9Hfi8 zX$L3VQ`>MmnDxa-p;>S^7|%aSlq%pW4}W^;qf?cbRi>I58V)dgNL zj=AQo!rv$(j90NnvE*WKsiuqI<*M{k$!>Q?wCA$`RF80S58^95Unc|7twSrq!bNN_ zc&*Lvelrvy-RrC4Q~5^Z2NK)7b8&02y zd{BH@c@_Tvm3L$EL^Qa;QEuQlM@Gk%M&eKJ26pY*Mh;iebz<(B;L*a$HkwH3^e+u* zkimHI&jU#g<&sk77|J+cQJj`X+F3qT1dwx;+AHSme^h(zN?Vv=j?qWS<-pEUA$G9^ z*_iJ+C+5dE7#IW5ek5JnSVd*wy)rW$qCB(61fFO&FSI__P!npZr_1+&Jn%(%OPOK) z@IP^Z7{da?zi?~I#^Ph}u7|&r<s8^Mrn(Ls zvq(@N-qc=QJ%>?UU4&8J%p!;giwpwijo+1HMfP`z6B}F}JzF($37QSbAAj@3 zcT!Cw%&jQ7U7~B4+6$J64&a9bj)xVm4diSiSk%TrIKj^q2%0BIgo>by2VglP{A#2; zT@r`n4Z-MfT@hNG6Ouhg!#*b#4JEzP=H79%h8fyP1Tyo~VxYOYlKo`647*`qp;TaP zZ1(!s3f9ddZ(bL>Jbx@!t)tB( zqBzvaCVD6=PvKK(J{i364zF*c=yuZ0adhA$W0G^+`T^@-sUHr05cpHTnkBuwRx!(d z$gOd6Dyzt3AZ`J%!h_HX?TtlECe8?D^TgC?J6oyw-35-M5qI0ln}-3EjGv}6UeV!i zfZj9l4W+iDcB^M=INYXY3i}U3vjmLx$QAd6wvVJ~?$py0KShugKTK=^+e-C9Is)Lk}9b0NzRPa#J@K9%V=H(^F|kH()Q zfQ}7No)YW0*E5eZypLKbQ;#e*DYe_40nTZ@Zh8zdx+M14}VDVaeHM%i%p3Kbg z2ZyY@Q>0wzx}0W9d!#DB91wdDM{s!+!h9n5RjGVAhgG(o`|Z(Q%Ns%h71*)v8EljD z9o*xNE7^4UV}@jv*UV6PQ^sqxI;Yzs32SMzjxvK4jY&!?l`RJfFqG9tx;cm;y|#$X zg8_Qyr!|u+mdPv0IVQWKZ{((Cjo6-Xf<4)DOOO?o-zkRQ94QL%_CLEW_322ycYieENt6z(Dtq9 z^|<6t#<&ZiWo-#)os5UBdK$}$?bS=iCkxe2rDE{PTBB8nY3h1K#;OS0n#ya^Pg>>W znn@#BqF_Pv>}n;F@Nzj79>BkEbE`|!yOUR=zh38><6~>qKX;E)S6_Tl?k+caRJtpv zqN?n54|=RR)I#A8*0}HO6P#7cd!I1ydUd1NG()V8nXUlj8W!vW$*eb@(B_(E1Y`^! zQ%l(r>Z7C=>O0eAzCfjm55l=wE|Ge+D-!PVLVt6UR;XN;iRg9GYDhuDj(tUQ*Eglz zf=CbJSyEnJi2SmugV6P=@U(IgFGkVogPPhjEvba--$F_595yq%=}v}KIWnAj3eKJ{ zE>hNvSat@i!DFe+49-3I<3ELK?A4BcYTM9~ONLX0JX8&K!ryL+q1iAdP{=bF>mbw+;K?9AlC zlF#~z(YCx)W%Dvre+c5No$hkztbItR8r7VZD~$SaN3#;B_eWE0tk{Jaj~MhBHKsLt zCPRq9`ivUj7T!f}KPu2wltw^2nukIx(PCLsS=OCo+iUU;oobb(>daNHE)_6&2PB`; zv#+f08HoevO=TsVyT5o&eT8(!jBIdJ#mPwY^LuOLk1ADSJLa?6`b_Zo`d1?w$qJ5J z9`$5hU~`h)1_esPl<}9`>aFijB)&0MKebEo)DFj|>s*`;rt3xIS6dz(d`nM5 zZqrdn5Hl|9_0LbjvNa2ol0zzygU=NWz4`LlE&-8nKpE(J5mfFj(oy@scLCIQu9)Gh z_BiU}ecN1gchbh&qGkkl6{`lbGlC{!{)C>D&7_L$fWZ&@RXGlWISez5gIc^g>|+dj z-7~U}QM8b*{O7(ZQ@3ZG6u^>rT%6Yt_LKk*yY6b-SA}_2Q}pXuydzs3G0YRuoz<7x zu4P4B?j#OK8PC?bgKv4eX&6=Dab8((sYtFQ3_(-JwRQGhEV_*XFjotX7=My$3Yckh zM)dJem&DB*$Zr{ToR#g)YP=SgFk$3DhUxPRkHU+sZp!5Zv7wG{;u-l*(xSK2AeS4? z*7eV7k7X-tU$%mKoo2}h27a}NQ1&-hd0Y*v5>0Vwh0V>a$Jr7d}m`0A0*5}EewuIpPQPI(NvweyP%H!ob zq<)9-uLJuHm5uSe2qC*C3gF?G`#1jpUaa_+#ro&OUx@FjYnN?uAZL*>en^pWRTLh8 zA5X1AsZ9man4Ls`@Izp!`il67Q~JcEQlEW3N8Q$}@Uf>xruNt7%eL}nee*LM9-Y3v z^)=hcJiC#1D)Mr1$LU^sErz26g|r<(?a4ptX8rU(KndKS`y6{!<=1>qrYJhjkLSjt z{yr=p%^Y_zHrM0ZG~q_1AMaq-p6mMcKAY=|Y4%}BU7mYLvxEd=9~yGL(&uM*)n0ke{I%bL2{{|O6OVtTeAnU;a=J`S%OE4wWmutjpCEWR%Bs5OIY2 zoDj%K$Eo8#kos4I__|BSy_KdrEu=e0R_WW1P5>W;dga!pEGM`UyUHz8HdnOLlG}d{ z{(#rdek|6fzM6NDHxf&5Nf{)O?OZsDO=`~U9ZhsRhs3tBe`zy8D*19{Rh;z4OrC>2 zwLDkw!K5vmt-e)>qjw}9`DwjEk(`A9bM8k<=(H^@^(kbyxg00m9_G2<5!puur!+CB z3ZQi9oMhB0a#YnB_-7T0PPh&U#pX%zG|nJv&z zNjSw*`$=F4%9Ggks#J?k#rc?Xn$3N=rnI}e)J{e^)`}qA%ShyOHEZn$7&VZt2YN{- z_ovBm8d6+j)hRBAtz}Jk068_z-fD=s8@krep>sLZNgX7&sg4b0U0w0RVAm0Mu86o+ zA4;Vbx+mkD*JV62II7~3(CeP}pP1Lif3&Z}9c?e;@MLz)7M9T@&m@tIPbfJCH|OO+ z!Nv}Ao-tolt-+I;{Ob7Guj+c|jPQO?9hkxSjO6y&}Rr^icj?eQmh1_x#LlQ!$;YVRq z?`tBc(@ov8+x|4K!`~R{u=-q8;fwiBeMBqyC^)aPXO`Pp0w);tsuC~+8wN?YV_n+JfwScsjVW+ zSS_S$sKdrqBlGexxGCoczok!gc8XWCBhJqwP`~lRNF*=s+W! z_B7jBq_mt$s*-KU!>-}T#~|=(y!RU>k>dO809z$X zs0bS;0YTrKbSJ0v=CX!DleBL2{{TMqaw%oG8|EZ9$Oms9OjSo1b{X7MbII{j)ZpsK{FEsiRxIEnWTrzeVE(>-ad-1FOt zQv26t&^=FjU^kw122OowLr7Sa-O9z++rQGGx{hc_ z60Xw2f&O|_iMS2eBbM_;;}uz) zGjBo|WAGTNv8pElf*r%5$nVEt{!KAepC@kI{{Sk9%V*_12pwFpH6yyl}w;xk~5RYHNPdR zJ01lzSmg36vX%j@Y+*e4pimFaB)d{p1$Q?UXO9g(1 zBFt^7W;A=p-pS9W2a1<2dt=l80M}Y#(YoXGrwc;E@veDgv3(8Wp4E!7kxC%h$zTuD zijG*O=e~J0ul76-yHXe%Z$fJ+WyGxW`L1)ytcP(QjaW&D0FDpoT87cEc8mkot4V4B z<#GJ$8o6p{=)!RYN^K=A1}O)I891rX0rM!wrYW$)oB%QF>S}g{k$D_vrFdAJ3yVJc zF3!EI6EC*e;vnFk&{lI>h?MisW7@36l*V(8!>=_IijLl5@NwympU%9DRRp4aMh6)w zO2%BuS38)To=>mm(z9k+2?w4JKT6!VU8%j-0QT$0^Q?DZt&Y5BiuoK|b!XaP<)SJ| z*j_z4=Q#S-8@!%xlp7#&20D*Q)wpKewQ>mTMsrzg1C}bGh~S@3;OGaC;a|2{{S(|aKnN+S0jDR?2QX_1BlpdC!yn~ zetD@@Vi>kIpYHzvoKfW%-FDo#zqq*p1G@z2sn&$)aMw-y;dg&8$ixR zPfdv}2LSmAK%Y-nhkCTWy$B>))`*?Og|` zW6f@YO|cEbAA6>M&%I3y1RM@I>+M?QEzv?19%gyxkN&kPA;wp4;psq;o~VErzz3eB zXZ5CioeLe>A3NK(F1u`t%gpW9-(W8;~(mz#Mb<)Unu!o8$p<4+o&d zR)YAxVG2iln%9g;PO|p zNSD%is~+}bU!Mbxed;Yn`g`cabM5mZISim~Dbxdw)Z4a%kp*$)vg2^%o})gMm343v zJ&f81mft+Wr`OQKSG;kCaC!F-8ySDOS zIc6@$IX!B!JMHvj{J85u7SypkR`IJ!20=I=XY<8l`C zXBCL-{G#CdbjB#TrIBFVOA`z+<2VXEKb0YxOP(aoM_>N{T~zZX54A9PBxGy{z z1~S9z+wiTQ7hhXyZ4}l|`?$eXjX?k?z!(R=u4%!X^;5ouOS$B?+N_{NVpaio#&C1( zSpX%;^9LN{1~|oZU-2%x(~RieOtFMTiH7a@>(8|;8hxBX9D#E-?7E!bE_!FDN_?Wd zw>h?w;ubdXsP=MB2Oj+WDX=OehE2FV^Ni&6{{ZV(U#jUTxX)^zAOW%%5IObsu0CW7 zE?!XFUmxm#iowKEFF ztMeHcfS~{+=C$wc;#*5=7@;OequTCxAm^O^Kb0~kBaf3$Nac(qp`(=pgVc=nKJ?eN zhB3i7?V7!JD~Af81P31Gp!+M}hWVaDv<|;s-RY>ZFJe4IEztbLHhc7`V~X8VDc2vF ztJc;xO1lOoe>U8k>3YO1#R3@&oxlkJLpqvk2Kx17at2?HY?O;I+n76HLt{-6D7 z-g`B5!;Cjl-qoEl4cm6@3J5v&sc1%AFgr7C;1lVNp0vpof!af4aqGoeStm1yAX4S< zFa}9I1_yeYMQE}e8=ky>lS$|Xf0z|E1B2HGwP?er8+%8A7;TVz**yI#CS-6#fNoRI z^rn{FxL)6f2Bz%^ogS9)N~IVA*dPEoVtQ4XL_yZsLY#Hu7-D(t&IMxGZH7R~#0Kl@ z_^zP~7^+v3x=v?+20#k(dY@7&8Ce=c$yM@mwT?#w_Nd+G zm-k@&ql$4ycFXX3o@pE9B~U{l>lW52lLCY{*Ggu5682cKW% zPA!sI4t=^*Oi|Ya74$xoA)Y3YIJr#DDB+) z_n-?30XbCtYEbzlSYzIjHvnzz#(&Q=$w^1x?iEpbiI!29JBBfzdYUv*y9XKR^{PoB z>z-=Qn~as~{{Ysm%5|)BRDxxd-5YIEanqW+_rAES*rWjRf2~^*s5}lU*ur9UJS@io zrnWlmGggAi-W4mhSY&y3uij!*1R3-P`PWgP>$;jn3B1%LwXlNg?J@1#!_OEhS78hs z5s-HZ^5v5Uq2|3G!L!9P3t43`IhHq$Q-c~6+)FnEf(Zl>=zXi&!{a^VqR*JcWn9pc zsI^HC@jcbe{-m%Zkh`o&#kp)Vx6Z)lKRUVOfww-`HQo4UNqr+qlTmw1`=7L1nc%iN zhSfpy%ZUE+#=wwH-T)^fgUagq2DtWbuD$$E9J5Fa8_aGSe$vsV(9E%nZvYYoI`+GD zZ*6mIwt7{$TfIUEt>PBBCT3hmHr5Z49f576VCNVa73)T;_|KNDgI~g19Dj-RE6F07 zTY(XcWsMPz$fY>lhE)5^FfdsE0JEOe#QnNSQ)&CD&QBGu;#+-2!hf)8UUJC`U?kDB zL<8Szase3a&2o-#4`I{_`HXfg%Ckr4IX+z)cv!ZzF3UPxs2Bqa*SW`XeQKuI;|1Jh zPp7RyqydrGQZ$4{W9(~^HLlM2;T4S$05Aztu5pf(`2#skpbq33r*ABX6+;rBX)*!EYGMN)lP4Uv9S5yhj@emG z2>ZGB&2+|kYI*X(JHApyn0bC*zv)TlD;y3!l~Lm=IOu63ia9Z9Ey^A!64re%CN{Ixa(Q1aNoo#6lEuN zeI!*nP~?IqE=uFIRFRu2wYGqH1ZN}qQ^cs=*{I}}$rOp1nY(QuRVZptwCakI&J_Ap zd2YtS#Eg1ppUSFT$!#G0$df&1D^#;Y33n_u1Y)lF_`(%j!D*iSv{b{l|HD~x;BAeyzY1W7ci-8%70_PcdMCA{oUQnjq`@_VBw;v*iXStZ(l zQAqx^NU)nBn2)7$4XZ0Qe83Gq`%QX+GxeqQMz$$p;`*H;*bltZ52a~Z+prr^w*&25 zbQ;V-zG}SQC0K{<+NI%U-H@Ip3sbFY8-RG)dG-F44AI`gr;&_$U{@Xg0115R*qNYTh06GI+Z^PK!3g z<}gJ~_Lo2cF$3#ZVsHjj^{Ucc%bZmGU7CGv$mq@Fi_dyk@5m&(x8Yozm*oZ=)I(Bi zWDYZ0EGaU^d7X5cxRolib>$Jb6PAn zTO88H>ua5Dz0}h_N}PIjuCChIva?sO0|u3a?7(EpF zjwN+w(bCj&QT>`2vKWI?iP_Wetc$s1Q@aJds~FR7b9$AcmC>m9BA18y4(#GHP})Cf~Cu2d`@9uBNcxx;1#mrv|G# z35mmGW{G^Qn2-{Es^dW;8R8oud+Ts82_xKAHP!9BpoCTjw>2b|tt(k* z+PYyzDB+cP-$M>(EW|T1kItz{aFD6pnLP;NwC)yI<@uN8$4pgCu`^;^0qb3{rmS#I ztGUbEUEezui5Zl0g&vaal+_cu5;8#K*SBA3z6_EF zx%0QV{w?30!2M&JlaFo)6?HQm&_>ixo^0r>l}VxYZ;ZW#csww`k5|B#&Cv zg4)HT+jV#lb}EIx!n(UF9|p%5Y4u4Q=a3^K`c~4Kk4N_z)1c?oedy!uIXhV5wjqL9 zSS%p9^aGl?sxOD)=SwonkK%p-{uzp&I9KZ`6{Pmp!)ni29S+ zvF~2>N#Xqlc8XAw-2%Lyn5gTH{cGUz3>Uh|$dJ>dn(VVY|q0==W!tyvI2nZP; zHb*%JsP@HqjoyQM6vj;&>S)?Oog?1($SSCwKr(=1 zJ1ER3SlAUPNc7~AMOEpI{h<;({Sakhsvm1bgN{K^j80FZB)298V z_x}KfIx9UU-%b%}@eIG-mAy$H(!77fk%zvxW%-Yo+=})aOV8d-EUY(`J4x+cb$?=; zo_S9)X;mv4r#t??c?#i(jsW(;X&nUV>69)^H&qG%%=h-5&F&u+icb2hENsNLQ zCq9)|LDA#XwJ7Y~b%9y3UAk8V2())%?SFLrD*cJRCWV&!;nt-m%Wyu~Vp#AUKoTJT z0C{jg_BHw|f;v~=w}ZSxb@1oLcABP_aI(#&+$4(2(eQaw?86|}?v8`4+H3kPhP7mK z4fVWN5&rHuU!jr+eMx~-@;yq&Z@2_WbHN>uR zq1zuS4$1()72OD2^6J&IJwDX|PzN>n?eTL&)GR!6t^WXNKc4Mz=A(cYa!Lb7oB%Qq zfPKY&hT4<~y^hd6Vov}H_$L6+Krg??TE(`r;yr&;yqwP)PDP_A7-;fU2+sg)9C4b< z5$>eXz7`6jXz*EKZLC;e_NY=dAU7m&ka*_0Ylv(L2Pe$k*-i*P{0?fe!))M{Q|t-p zT+U})Ft^alKvdvlS5Kr$@Wx-|a84Ns!TN((^4gRjbv}Z%^!r)9`T@5c*bmT=&1j{d z{en_D%R7jcWtHPQM`Cvm>0M)LIy9Rb%aFFv2*}x==Uf%El1DO_n=Gd|Bht6wg=UsC zLax#g@~%T?JupXKrBahfYK7Scjx?Q5P+M6hxr!TWO|YbsY=$!L^N5ETk(W4p0s!RK zjd;slv$;gHw|2W*ebBAjjjb+Nu{%K^WSoK6a7i`Od`q~$zwraiK_{G#61!kXs**Ru({e_9XxC>5sy7@KCjbWNRlJZ(Djo+TcWhRiaILBq1S?^V4<{q1 z6`ye|ms_Wknc0CPZB*Ji{Hg%_vGlG=l`eZYTsJDaAdcaZMM)O`kWbL!uTO5119NCF z(Vj|@a6g|F40f+GtZlU9fCsUsT-{G?Z}tt?gtmU@RzFkM0=a5h*E{JaaSN$bSl=zl zDliWndYaC$4ejFM}CO}GtJ$hrB&YtIY?t$QT_pDj06Dr(HHx)sV?dwo9nFAbD4%uw;Ov!xb z+Z6`M6J(Yoo+-*#c5~0ABtR70(- zbf?JfeSoOUSs{u14|=Pb#zUo@i3EVBjz{=bj8V6iUnJ*|o(6lKl|Um#Lof^vBRD_) zs@l_1DQ;s+r!hghk~zTj#Wb&>RUMVivq13tx01(mc%~~=!EEqYb>pGtzd`;3ctgNm zIr~a$Q!~A)M#*Oz`ERuF%*Pqp4hJ5hzDO~m+s4t#uNy8S3)7C+tvv(88mEQt;MDYa zp5E#Q%DiXu1avBUgTWkE>D)bDIdwM}KZ@6Ven;bcWt2}klxHm*FJ;qS=hU7(_)v7u z7!MA3VPwAhOf7S79zS>x24cB53_xDpdUdZf)VvGgEh*JC4L0i7$(@2&T{ms(jE-@h zaaz}(w0DXw=d-_GCeHHGJ)UGyBbUy1AKoi6h8rjuc9cXG#L zTgMEJ)3Y8nsBOW!a7aFt_weFeJ8_NrF8iO9RNySiDb$L!+tTYr^K0`wetiP+)q>o> z@Ua_!kqVLzd=M(thlh17Mpn1et!BEAE=t22NZ9qlf^lBks{YdVyB@~>0K>3DcMBAF z?@5#^1IQ>*3X#y{)t?Xk(l#wLXH?LwpaFLI);JD}*aToW{{VrHrFFdX5AfMv=l(|$ z;XKYU_OZRa75@M;!Kd)u{k*Le&9t#fq~%^VRs?m(BRo*P8@^zrEu~<`3PfyoA3?_^ zzTMKkE%+-~w@a_>SRvka`F9K>kxqMtImf?Gdh1V!v>70lf9)G%90PQWB~qw8Sb}gp z&lTTK9-6v}`_B@lTUsrrC-X<=UDk_rXu)owc$tRf4y8#4xX2Y9ri*cVIJdVkt8He? zvMg(aQpe_U25>kXN#IxAx}DX9`4fn3?xK-4q@!%g=uc+k5t`?37ei}x)9x(b@(CD^ z${PV4It&WxQ*u|a=1#MO?BslLrTA}9)$W$s&JxVcjo-pO&3go20ri)JI^SFGARVMI z{cG7Qu5^f-%doeGEu0Y?VF>*JuAbXb1O**ymb|Jhk-Zwwsn+Mt-|(TlLOThjVPvL6wo8Q{^Top-$l%x3ZKwf)nr#9?VwR$HF7TbW|0O7Yb# z&opT8xE$x-n#-83Hsp?Y?}~lHPXQ_pKPfP*n?_UXxpt>KaV5_+$az@8H z&JU;m0A91?R0QXMdJ)gyYI56)Fvlkx^vCB>lOU6DAO-K9mGd}=G|!-;Bv*LA8-rk+ zbkF|)T9F%TVTmC0J@~12nMni=di&H38jqj*y$7e~TrxWOyAm{kPs@YX<<2ROAmOq= z{Awj*A;+NlWBh4_c_5rA>U$IENQ<)Sk;dK#=}d43&ZKU~B9b!Yh*5#tjxuV???JKn z1og=LX{g;5e&jpXg2yZe;geCcp_pywu<4J>wK-u9KwkYlz3IROT%WqXhH?DrM;2Dt zV?Q=Vco`q$Re1vv7_mH@dwx}JMGP5tWl!_#)}u)MK~M?n&-CJgkN?p8*z-KXHej54 z43Ao9`B_&yf^)|i{AuyRkcY?m%=5VC>FZF+8-Q0CD`kPSQLc>=3(k)L2_csy0P zAv=CixB@=+d{G1|zs&?^1fG9ELWo_Fy||2EAOqW<)~_#>v6aX`2OW<;&WK}{Pn)6V zlhFSFpUR_>)x6U)$h)vlsOQjjrzK)m2r^xyM7#Kcy&T8wne^;2yXg>66VAdCBkj{#AC?Shlsn$CyUg^VoXg zf>|8fu1}o#*rNdL>VHbexsEgCq%q*0SdT&NTAyePh9ciCe(pMv`P69x$ot4_^c>@_ zZ_0tKjK)c&fLo(%EPL=Vij8!#=LaL@;N&hC}JBFnXd5x8$6fa5smGwEE8p{B`iDKM~>CBO`vXOHRm zRsBG&nLX8_IB*G6ldpc>oK^%*4Cx-?N#OH=ipJLjX+fyR1*==h41~sa2jghYe==(> zd)BxBD8R_at_5{z15Xm$*xR(l->5>sdgZ^VsV_8JKd{K~vKinj=B`HI!>IiIxu}&l zYn9K?;njAW6eo<2uh7&|i3_sE+%6kD0sjE&tHhn*R2P5lf$7INqQ=Hsxtq;CUd8#i z=rPS?(OQ`<`<0`NpO>oxkUtu9Q-rrMkX*6JV0w?_F;^4>rP?%hg(&nxd*cP2)AiCADvSfS~jbAwcL_#${sz*6KK z;Nuj_xFtZcMJZ6jmCi9ZA`>yz{V*2JSvzO3A;ox3gh15rz^j zH_L`)862)U9^XvXW!0s{#%6Lu6NSn4&1bSr6Nn{n?92k4*Z}+1l0=%4$rNyzGSW8Q z0T>ERV9PwWLjgu}kQbo*D^kV;x@i%Zoq(?1xiu_SCIb6Z`N4+X*vGdSKj#!imCWZ- z#5Q(vtY%ANwqzp>=ucX$acO;VA!*;1;fNjnm2L~oLIUw@jEBiPfyk|Oz6FFbL-VX> z=3~PUI5_Q&ezk<)(+E_%IYXt0@*UXZbUw9JtnlN@86N#BpuB5&ARMH$(??(09OKf4&kQiX~;}y{V0HEHZEYP%I^SM4_ z^yjs6)7Uh34YwvfcCqV$+~C(dp!YOVMOJ7_1yv(C;F^YL{FUDO&$CGq z`HhzOdw-2qV<}vhBp#}HteP|{7GErofSw5TAFWS?WkQM6VUN?+mvSPNQ-;qqUPZ{@ zk`F`FPy-yebPU@MFdm%I$~%;yl{sQ?PCENjnX*Y{ z?MxQzjr;M27$STqj`$)w3| zaBeRox4yHHZg$(oijM5~QW2zK#&O4E&0|^Vh;)lPjZaZ%_Q;`aV)D#nL}dUo3~X|6 zGT9_CY>;Z^p{eScW|lE3BwBOH4079)GP+2ChpdOm5}5TH=G*Ny}gd(RBN`kiU^nhu*5c?3ZX{? zvB~OkNhc)pP_T)kB;bKx1zx4x~VX5-bjBU`(&p6|rfBMualhdzSnWIyO!3Dc| zR85ov9gpi(7k!D6v1uHu0s^QQ91l#Sj((NfO`J93 zbWj8UTcJH_%w+AzA2H&P?F6oPKGf*IQVMm?(zlHIGmF^UR88bEj+w_ll}MujanSRF z)}>iVP#6QxdPx*#KDE3bQwp$6S)vC5HvxY4Q|VGP##X@??Mb(}$J#(9xe;y=tGFARpa;3&oC?%&se!T+grHDBDW$&mf7BH z{Df?F$=&L?>7Jj3dNdjH_`9d68n)%y0PE?^NP{N=n;PI?j+JOA9H{MG=^kX+p>1s5 zQp>mR9u0Q7Kbc{9Z!lk)A{!kmlhbFK+EFreLJkijpK9#vX0&v;miKVsHem1^j=A@* zLW5CPJj&2@C1mzLM*aYJ<6QBUn|}tgAe3q16orTZu)y^ruK;zgdAP#o9c%KFK=J0k z;TLqa;NpLbJD+R{Zq(--&WFLxRrLSvqvF9!?_89GwqyK(ZkAa z@jZ2!(WeDYtJk^qbdJEDaaps-_$Qj99L{;XmM4p z?rMFcoD#&-gy%U2n#)-L`qaWuds1|T8n0`csi;Z-QpW?OOZLenJDG|4n!plntMHh% zhG)U_tR+S(q0>(hC)C*&(nh!kilp~$NhH+YX+a*qp@+Dv$z@Sksw=U)>bq`Tg6c0Y zdBZE3=&g0wH0eCcPM(ciCz`!aO06}{4p)j&!bVy%N_fW=bb7r0Je89H27POn)O=fW za-|L!dJ&r8qidPlY${m$R1(Q7c@m)*I5bBtrx&6d%qmNETe-dr=1c*fN}>IrM??5j zZEz)DEn`xBdK%1@JA%Y4Y=7P6yCa8PPdct8-uE>mzlU$}2KwYxQLH?C1Nhby-eMd$ zDt+pqVtVK6T1N>Mb4wdFqB^wIXJSli_~M&3rF2KnkUguLS=cTM8Xn?8IAVQ?qw1>q zB9<~ud(7R7Qg7p80jmwFV*ogD*z_W}=Dc-0^ZL@I>g4V~az2%#!TB6=%vJ4k(=Bym zc*f!}`qk9bV_uDl^J{CzW!bZjTE3Ti56+<1H1G&NwE7)A?xf6qLs45@vCiXIhHp0* z6*@BozyM&>{Z%DltXq@4&Z--{u;#QSxl{n0WcRK@Ib=W^8TwH^rx}lHADC884R@j4 zPY{$fW~|psETTMdp0#YMEP2k+jPqP0IdHcP=x{A4BwnQvSdb1l=y#iwz zHsCwl=Deu?^WV}#=(i{U9q5)PcFVC^JscDiWoRxay!?f>CAUz*OchG zipE53-+^9_V{(N<1I>B(nk??ZVo})(f>#S!GtDUt%`A5wwOZf%vnUI6HHhk0is^(?M+It*`jUyR9d;=#?N#L$ zU}UMsN=!;P98*}xMhPagjWmgM9HYA!tJoK&#Ifxx=LfTRrIpVRN8Z7Unj%}m0OUE1| z5%e_`#l+ViE4D>uTSziD4n3<;9S9j5=CSr^Yh$b1IjdZy9lAn+BT%Zn6+i%e1$lSG zABQ&{F_t@vEk&&*RR~f=FBZ|<06_<(iPzXG0r}U~H#&^X2}K)nJ6AJsX7c1~aHd_SV0`T@jx&yNp17X`6vi-8ykt&?zdRMmE{0{ho zaTdn0wupnldzH`RyM<+He+j-KX`zyR7J1Zkdt$SL{{Vave=%H=%du`8(x)ZzXSq)~ zz&Ucpv|IH@6Q4rT>9)`M2F2+QOgpMN$M(pqprDBf+c)}}?$)jo! zNIQL&QJjCkYf9=57{G!pM@zhf4j8?>fFG_`HKhp6e-bY1$g1_|=_pBS=4)#=Hn1{T z#J*gG3pCAu3XaG#$@oBIbAUnOdfJd zgOjx3ussPC`*H9(Rfpk6hEg|`)9ff!rTh3Kk@$KKO86V#r|jF~8~*?j*m#e{RzpkD zZ01>-8`KRg&fa!;Cpc5wxEyo_zfLVwS^miI?}wS9cpC_O<_F_2VeNp@c#hAy6nCk)-{-{FRk{O zBb^;a*ImGe+qaN?Yr4|BL#FF?F=~2E%y)LPjnT~u2Sy&mSH$16C%|2M#=ax}0EEZE z?-Z9aM3LQFO(&LJqZ?JxkIVN!1QI%Dxvr1)efV|bF92!NzlwDk;qxUXJvJ#;NEBn2 zV}tV(o)v)g$>`KO8GCv2*{u(-rMND*R>!?&PdKb*)JLsnQ}=Bte+Db_~BmmD0| zJ9{|KTFswTe>3G_vlu?P`qo9w_Hs$Cs&rY!R}ihCJ>A0XEW`jilZv1xOkiaptxG)~-au4TGiMjz@^r$n;t%!;?Jj}P&vAj#-%^$)VYUTCI%-)Jf z&Ic!&;XWsLpH%S2g{0Lql}|s-NO#CiBUv&F;2ucr?_Vlv8uyI+SS@s|cH!<;+jGKX zRaYWF3CX}?z~eMmuBiLHNyE@}-TEH+ul~@Bdv9^2X*LKgZeo%Knpqf0wnZzI+5l6} ze2V$v@5#7^OPi~K5)3SHATD;O;C1Wuto4e`BV~>@o^k+H<+sGGxD{D)Iwzs-jqy%ShWKamtagM!f9(dX|b$nzVs&Wt0+LhFbwCSx!tga8rNy+J2 zkxm%`FgtsZPka2Vt1UAKnx%UxG`Lj}d<)MPu`#)Jb7KqX`Z?ISE^}@eHRrL=Q!{OaN0cl}0lU~dg z11lG|QIM{&Mm}>V%rN=F=b>y7pW_c6#i9!j4tN3>l&mcGZ#pf}8@8Mll}Zw)JgSTi z2YT~w40!OvBo_WEwOgBeYnUa2Mzy~gSgWDD3;&Hc&j8CV)VC_;aNXPhv zscJfph%T1kiXZJ8)=O{@$jg9F8;&x5nXTW564+d8 zj{0ORZ)pDjy@ecYV6yzc9#2f*9Gv4d&1m;f+D;x~0bGS*GlT73OlPU?*2C(1SA=gg zD@z#eH6WjAw>;Z~@`T8MsKklL*xxe_;8&7rG5xCUdzmF?xMwV@jDj;nc~4%45dV>*^?op@|AMhy2Z9ILJg=N)_J zIjXLt;4oDicMyHg1N@rNzPq@ZPclL`E>*Aq#yfB^S+~=z!=lCvXsQ_M=f2=5Q^hGa*n{J(%*t)BtKFwFd;QMhAYpb>^7x z;esgV*ZlUbYPI?uG^lHGF$&-^1{fUo>DHSeU7xyO!yO3r=9J2c337AO8SV9|vP}?X zk~In&qJxkIIp^zMZAzCrp&o>mDJ;|CE&`BG=f?-FQ@ayyeX^{i@%&AFU0<2~q|OR#THDsE_zn&9o{ zj%mR#D#IZpAUPDmg?K$_6g49x01sLWO^!`31+WLpOTew8ybk%BM};%Xe>eSzkX5s(f}4>X}w5HQFj{*)8ODUNy-JdP=s$~}T@1miy4 zc&M;5pURjrTAlzPXCD3O389im*xj7tjCG|96yu=)3Id?dJ@bldHhy3-dSni9R5Vy? zpuh!0Pyh!VPCJ~F$*GI^rwz}(dG@T)7-q_hxeo2OJqCF-=2~8@Gy}@WWZj%M9s7E5>s`5ZnL-Q_dK23{g?qVv zDf03jE;fR1n#I9#Nd-P}*0k;KnkGrD$w>z!=LBP>4Rfn*QdNimxafLk>z*r8+S+S? ze9)@7#&e4Gezei&{arL{Hl~*&_l{0ROF79ujY0O<)c)#1IN()TESlajN}LP>>4RBu z1u}2@xX)VZr;Be>ns_+vW2U#&t`w5Rh7Vs~O4l0Xl14)@85quS*0{F0k+SC*;15r& zRBPkrl^`i!O7(EK`9TS3-`#{*~dG58Ji9`>8Vdz%rri5QBy!_aI}^vOGEQ`sUus;x7?E zZZ1`GZ6rz*7CodH91m3=<6ki|32?!RpF>hd5ynn^zxvhM^Qx63nrDSB5}}8s%H!vL zzwpPac%R~LiTqhPNhfG+_ijjIJ5&+SgV*yWzRvhlZ>w5(M$#`3+?$)09%8ezGb%qJ zNp49UE8!mqX%cGs#jS{p${s~51_lruvB~rqufBBomfG4oboo{^3Zth3rF&Uj8kO9u zPtf?@A;r?e)P@$4ORN099e(4vxVQ+UrxlGRsLPxlm6tA{b`{U-T^T> z3(qQH>c+J`x@9N ztIr==%bVpS1787;q^|6b+47u3`ByV2Z;YL!VX@QeOxu>*w;bg2kVoTDOk14rGuoPE z4f3HRWM|(M@;Ist`#Kd?#fRC{E(rD&P1%`#M&)|s;85%bD!dN4;-M^onDOWc>~Z>6 zk6IRIqX}ILxr=~FZU%AEkjpAzmz5&}G~YD>Zaaw`_$2=TT4K7h81sca{VST*X59;s zWb(>M9P#PvkMOGq14g`(LF8wQe=${?d~cF{xc-={aW3(@rt^%i@~xnih;4>fVa85) z$5Y3?X?84ev3{&@xE-p&3;;wQcc?rAOC$V*7Qq821HZK?MObla<#{4NJCUE6PXro3 z8-ch59OwDsi*%XJU+(7vo^oo#M8ye+05Q?J`c_<~*H^Ls(fr{smqQ~q&o7SLlU3s_ zw8X3!;E$~VFE4%g%D!jtLm&>6%y)bsO=(%V#v5x(+Sg?B12_ZR0zSn9}$ZcY5%#u(y5_r@|tJ^NN=iUqRh`9_) zqkZgFCGRp8QMFG!Ip(#UAASxw0meEE^%$(_Tg}2T<#|21{&fW@+@K;1%e?c(bI{eu ze6*CmPKfKO($!@qFxT+|Y%!+Np z7wB2I1K18guDU%Y+WLIl97h<~sy~ST0Q&1j4Kl@@l&DsV95KQTz0au`t5DMH#&a;O z^xz`~M8kdZannBao2o{s%xu6Z0S8Rylg(;s`kUL^6@aXP*;Ho(zo)fw!e^Pb$l$Oz zVC2Jrc&o z3ul^n)=74gxbUjS)6~@S7S2}o-WcZC(hP;4yd z9kfdVwqqoa*cm?f9Ms9Gv=RcXw+C<}XZ1C4o~Co|X-%fyIy|ua@xne}rvwjBYnfY_ zeDMXWl0>RW>OjEjpIWll*An@WMr0;KoF_xynuTpxxBIW1*ey5j?rj^yLp6_=#nU+ETdT1O!(J`1qmu01^~D)F|(oBfp403y(KN`-p(jr)eQv@qjBP z{^Li4c{b&poE}^FPx#jMsi(Brk`w|s97fI?joCd1dgUBNb8yKFd&ppl>~N#kt#ehS zXQ8xbbXA8?NZ}C}OGw!RZ!F%NQq87b#3PpB05Xx4=tl0HeZ4DNN6{{R*(Kw*Hi}sQ zIp?6k9=)o??e*og!i(s>a)7SmyN<&>znx^Dk3afC}sEIqA?*!$&KiT%_QrXKr>dN;lWZBLMJqMZ#U5lI#Ua|EPZ>Ybw%}&Jd7^bswI|F8JRe?q^NNy7rJ7e& z03-aNk4?P)04kzvCI0|kprSDuE7a$ptkl$WL{6KLnDI;`C8J<1RjK*MC;~|t5`}jRDItu6Qby>9QpY%de zcLq2)+yUwM(ot8`*|%*De(O$syN4Z!`c+&iFU+NTdW!U)6n&IU4b8Yv(?l9oQa)B- z4BUlyA;3)Y*T3?lRr`~qTgKuxusj3$b@i=CMq}PvB}oJhI#zI+b@>?N9E^4C z(xgUm*l-h!;~&eVH0()kDQCBzC|Bp;7UPaM&$VhpDPZzH&UTy-G0(ZEKFp#8l3--p zkEr}A^{hqhna~7WWq>`0OjkrCX4gY!PMn02;2@E9{K%vXH}t6>vzJh|d826Hx$^>~ zEIBKVNj*N82D7x?qbxX3KX~Bn<39a=0a|if+ufLUUdIIB?k^!Ki;kIME7QX@Ezdg_ zc*f|2|uDcK3uhQg=yc`O1TVoRQbJaZz6h7Vi_AFU;LW>B(x20`9^~cMl*VoP&aR zr28`%i^d!QfJWSod)K5!bn$R)!SiAZx+xfv-TqUMITeQMrCi&}vZs|Rj4oL1C-5A9 zD&na_l=bP=<~bBaQmk^MpH2b#`qUE$)b1pM-n5yc@|r)Cd2P6YNIP-|6-xFw5f$5O zD|9Q=`ev|KxwF`6K2(%qc<^S^A>pnwAGZJKSOLXb^RS>vu$C~Nfc@af;W6W&r7|8x1jE~l+ z-`gtu=vR3p;CdQTq}HR2MD#MVj4(K>(i;Z1w-(7V+yMUoXfiUiY;*FI0YP3kIVP#? zINHOXO0g7Yb_RLoqp3|NxfbGtV~^=tdSvfqc?H_;1~(0r;P7*heQK*B?*#GdnxEvx z#rz1aib<&^Wm3&FdnenVTu*g0?3a%#dCHqS#RqaJjaVqjAh#?B827KJ>P-~OXKwPr z=0g#YW<*@0#s)!9PScZt$I3_2xJFqK5-sNGB#lVg8z>3J!_x#2kL6Z%Hr374nr!f5 zXd{k4BVa~Nh!k)zbB<4Z=RD@VrdX!wA0tlz1zzVZa20OZPaK{<`uz9rns@M?nH`NX zc*a3x+rR(}^&B3($;m$SfQ*I5&Bx_mHG9dneNt9Q5$!-ge@`eLTr zh_@~euYPKit15h?jP|L+l#M|nlhV8CLGFC+HxmoEbu2+ELKv?FhCO($=fn0;Yc`iQ zhCu|j@U-FB{EQ;xf&eGJeXGyV?>?N@Z{g`R4I=S13orwPAq%3qki%&NFd)~hK>1u! zi+YvkwUP+c+;HTDU~;Ev=bC{ez}x;sS-iMA1Py`^k}xsJ>sfpG$mw2!mqW|sO&YMv zkCwWf7I@lKN!WRD;oVP13UYmU#c?r6cQ0&K{eo_oGWEgl)YnxhTXT-37Ug7hdbPww zjFDiC?d8aas`?Syup+}bV!&XI^*zjqJZQ0@Qly5!>yLVZ-r7l7V~7@aAwq%4J%Ala zuUihA(BQ7`CfhBWnSX`3U*%swdsl<>7^)JI)zMB2>8VjTYE>CDptfmxbDUCO9;cC7N}4iNI}?W^ zkZM$z?&RXB=Ztz&8L`r{bW2sbofKCJzk88YE+UX=AI*!=*tpZ`Hh*F zxjl1L+DKI8N9RxyOJ;)};gP|s_7Or=WhHXcTv@t|Ayd%c=BP=vxlSqKEMuoND7GbX zNT(Vxj>dDTIcZ}p*FEz@YIkxtts!gAsi~s18;0TlrtFSa313q~PqtS~o-_Kq~bdeQQU|Qokv|uRfxZmCofDxTFzUK??FReREakD!DO=bIRw1sP>jQYKXz^ z%Ti0-MMHBkZ~^ABB=ZZFAoE=-MhfE`)h2*$&20p`8C8?nGa@svlH&ulK=VlLjo2QQ zvi9C!=BPEQ@9EOEj3c?jIZtHDTY{W1pq!8vt;uKs80R$KvbJ(~tL0mq&Qt1Mupcs$ z_!{(mIiy4dhvQypV>z~$INi-}KDj8sW5D#TTJ$9?5<2kMl^t2=zicbXHII9KTpSv} zw%4uj7DdmkYkjK9U>QIkTIN`12X>B{n9g-%%;PCMl4?kco@vr7EZI|2!mFMuR~2iR zK{wR37VWq+l8=`etC0o94K;wl$gCRF>38L|%o$)Dw|ZtkUzpXqvBm{q&nZqbTSgqm z8>z_28s!&*S(h@ipO=cKEajWi6%d($`Rip#?u=zoHD*X1)Sfd=W{@W491hhdn-(|& zHAdp`2r0m(qTATUZucm%H86)d_Af$u(6JD9nYI@TW-D?3rAX?r}n_># z0sgfJU{B#)Dw0cM!?OSk4joeoZv#0>%as29gYvv7{;<@LCZ&Y{38lci=paHw5BCkamz~kPz%S+(E zb6p+1(qlQVI<+?zdiZ&%>Rb`Y)bzz=O`zy^Q+c+y4Y|{ zaMh%(q3U7lH1$0eE3O4-CCJ7rhK~FI4tmwp)RP>V^6F7NnpN$pI}>s{8jRj!jMp#y zpogPWa$a%Pxn)4^jv(Kf;Yc~G3(L*9+f<~zW1MvLtc!`uWRp%5MLPOuI(_UyD~O z7lYaoist6#DA#!TL0rC1{qtWJ-g)v~G>a=YJ5JMr0`NQf_OGG-I_mPv1)h@(g#=Nx z%%eYexd?;mFxB&_Lebl!uXEJ*I0n9ZGfUe)BkJ;d&WiKY>hz1tts_s7+{TSN5w-E= zGGL4Xc>}K?emShSit7D_!85bui67;S6d!)w`%*Rbn``7<-NPlt!B9^2`7#OZj(DtX zLtDPPEi{e(u#l=aR0pz;LE5}V-!b&|v~0}_Jwz)kGDaNo44DUv z6_uz~Cwguy?7`9Gtr?=WindANMw?QULec=qBMr<{A>0Dw zWmS(~UMtSLU9ZQgYKqV^$!`p5kp>$=qJf0~bjN>F%~XM|HCdpr(jb;phBh)}@IfVs zJ(Wg#pL*W$7lt8^O44-(zJ^)v<6|&JP$MYpfloYbRRoicpbuL4cWBR6eYM-C%(@(8 z+KIcETwE|Ey*lyJ(yEA<{_`q!up}OGKMvKNB6B0gq#Oh9oOQ?e)txR~m+-5`BvQZ> zCjk3qw01``tmas`HtQmV1TeG)#kkPXi1%U+ydNB1B zD_vMMx)FSDl zP3wg%o}F>+`P3%tOzr0uX9Ea&VD&lUC+ph0`q~||-hTrul|=~u4q-s@pul7o}}HJqm` zNcQ4^lEhj`0Rtp;rIaJT-P%XxPDskeWCt1SdeZ}vOCGu7y#PAi-KUvhjC{^U+|=;c zPd=(N_;yP!;-d%U<2fXpU=Fp=Xg^}Kwz}1?aPmL`!3f~Ajr>IR1NE$NuU<<#+(>qk zNmYymjY;yDMqNuK%k6=~SW<(QJkl25Hc zDFlF8fJI_?Eu3PEkVqsDd;0!$8v&dX(x1Sfv^;XBoF3HD8GdZ=dyiT(>M#hUQb@oY zbf8w$h%%uWUEGciaB0tslB1mC8K!_qDljqqYCx>VIO=JnQXLr)g1loR>;C}Or^KNf z&WwP2sXc$CM985q4jXX%O<0UC-atSAj+xKDTBIvI#aTai!GYxRLGAuE>i!n7d#y32 zc3Faw{#hVCz(B~!8Oi#Z@^XQBB>hcx-Wu^R(WBWVvRxo`X!1%N1JfY#JNq9|#dP6n zMinn3j}uB#jiP!<)2F*cHr6sDwg6D2v!2{!{VCJhT0TySES_Vdd0`b&J-Z!;_nWys_@wd9lJ_w!*3e9CsX7rrm#GMKAVs^!D>Ce zR_{U4v{7MTXP*8R207Uk;$&l%KsOwN+<{ybpNm}F-?WMqu1jqx^6l%u#y(z109UI` z!YL-tDr%(Lb}+RVtTgs`m&+wssbmD_9+|?`vyuZ*L+- z&zqT+5ZLIdT#S-`$E9s)Iu@k&X$`%*Na8@BcXH%rWLV2KpQh*dx#1{5Cn z>BUTL%N@ArEA{Ly0aBqFeUIh5c5hP=jH!yY{V#i1*`D!1K3+v~pCsT;J9ftsN##~d8gmNH?^c{sqSe(7|mUEW7E<6Rcs`%jYb z6q|@fK^?|<1XqC0tTH=}#=fS!y0)~1=ecYm47uzDeD&kKV@8%ln@E5xgq`H&cYPQ2 z>}%zCnw>gu_R*40w|_JB4g`3dL;Af)N>Gp5=#{iu{ucX=J*P3aUQSPXf=o!k!)MS{ z+nZU^6lu`LT~P(~9R5{HVFM}& zJ%2x~Ni>82g9K;qb*8MqHgYr5jz9YK@tCJ$^h`QWQobBFJ$nQH0M@2CJy-7@xas)S ziL&QB5uT&^`qf8~G8YG)SBz)tUNvo5>Qh!lh=@SQ{CnfAB1AU_BaHKoaZ$#Ha}&Wm zd*J(3%W)?TpfZl6;Eq1E#VyW)P1#bT;h`JXo=4^H0R^oBs$9Fy5#eJcr&tMHsT<$`ymbD2S2$%y1(Xq! zmj3ZS;aR$!3*|(}8ZyyxA0IIthkCVZBSaYiRws~KI3v=iuJXaa#~X9&f%K^(Sq3G3 zQ#=e~B=d~-s8VbiA9WnJalhH)+>6O$>sTR5@>c+ydSG_0p>A#j>S5Zc-`hM@3%JqQ zniHRxgPb1qrpT06w)rFTWl*4kM^RbQgxWYOmiwoV##uKJ9)c$oKz))N6kKsH6kH(~jPiMn}z#Y3)l!d1&YYq#HsppN=CEuZ! zEBxD%LC*jK&lS>X)7Zyvx>d}lle^II!Q=VWdyNTfqCtZ4%s%#b_X4B)JQnvQBYn#f zVUBPEbmpm8&9kYoni%h6no(-lj3kZD4hRwew=FT^F!RM_GZRjNxxl(Iukj->iU!BKk&fiV}sO|R4F7@a@ zBh;20^{cvkFiCNVBncKblbi$F1Ky#yhR(+47L$3W@BE`1a(Yz0#rc{N!jY&F{pBG@ z&rJJ@)=e$$v}rE%#N2HT=L~;@cjt~P3EA%ud0>t~0l7W<*0rRUHny_Z8H%mkWmsUG z?&M<`^!iji5VtU`neV0w(z5wvor*J)>V2vJq}vxT%_K6 z%jHIgk&l_N`C~O-QHB|%`B<|9!hygZp7lOOC!v=$^wK`mAwlfDdQ-k-Q;=AmIpp*0 zR|TjGz9&U?>z=@O=BKfaL^De%Spto~@IdtZX|2LWhMOa4fv;{;fTdS=_n2d+(z=@q zn|W-0&=q5ccGVBY=H&1>$gen-cb$ZnEw}wyj7lVEq8m|;Nf1WrsGJf= zKgd?-)fdZC8Z?gYwRz;#O-d;)V6g@m(lr~JR3AG64l|Cmucm35X4vC5EiK~(5hegd zW+OX~9RWP^$i;NwYOZ4%&}lYbRfUw=c_AdhY=TK4N6d0K09FH?JtU4YxnOwblm0c@ z+^lh2n{hNvJA$QRU=BK-Nx&Re1${N;zM@tOCk?oM@>R}x?0RCoD)YQ_IA||>Q&a8s z_E$3{(h!QIrZPi69CZ9Bf(Y4z%AonAGM&3XT=wigrDN(gT7;8Fa#4-G0+z-Xb8$bzlabPkTlg56qAatvK`aK*o;Vq;S+A`pvbT=nNYs=oB89^{XO7tB zx%ss;wuWue!8^I~%v-kcyC4h>GvC&!!>7$5-2qS(gY)oDHGT_tVYi-XimuWErhA-n zGg?-&+gr;W+otH3f;we~x&C!_7ef~MIi^N|nM*L;xtUk_^c7wmCe|w?xwyMn}gFB zqn{>3AY@^A1N!2t%M@5FYjlJ9u zOeBp#+DY2o&m+0!q;?XrvB+}SIpmT46wAv<;gB+L81y{UsJk075qxRJbdaUH zY4S=y!g9-u5%k4Yibxsx{ox35yq*B{`Wl-=y)nUYr;r)v2saRNHZVMUo|R_mJ9xx1 z`JP0sxN*DhsrKx6uDVmPl|^$x$ji)@u3=Td9$71lj)w=ebFFO@w-4mW<&-%rdNw-` ze@fQ-L|@tNmeXz{EZ6`O+v`hXt=LCrEHlE6;2@2O`ILjnKU(O7r6;M*;|S|vB1VB3 zZ_2c7k(4-*y*7i4kyj(|@?XHxK>l< zq9JQ>Znr0X=D~5EKMJOG0<-;^Bs*I$8SMleA< zR{Gy0sSp;=Z!3ZTQbLm52XoKTsHUX~G?qa^%DgsmcDFgkdi&K?gkp)p%5r?nj@CJv zD4~+zlL9bQ$G%7-J*yV#NNtIel0yt9zcsxLQ2+)sA#MxlJCkg--7UCqJc=~rY_d49%KbB-H19r{#K z{{Ux41S_XJvPuxVz^THX_~h_CdR3cnCfPjg8Yl;IV208=NbM^eHt)`0vmh0v*S7sU7M*xpb{Bv3T zMpwGnzpuj9XFV=S6i5dd0rS}xd)t9RjR_0p}9jO zV35hXW_UQ~whdzF%}UZXjc7_Yj;DFy?N3d#jqU_V=ETtXNb#3xK5)*Z_Y_b9^(oJ% z6`if$SlwLR%@wG#wVLG56}mR|NZ6bz$lQ>lfuG8&S=!BSrAc`tj$xAsb^=rroCZAx zKtG0Sox8nxn`^sBRYE4>NI~c;)T>vLm6_(yq^DW5MI^Ib$j>9Qx$0Qt{%5^LcWvqI zoYNy>jkx2m$7-}eD#YLpx#?a+Q*P(1+DgSa0=NeU+=>@&-MGh3YMqpXSpwiTPC=-^ z%Z}caykyavie;6HZ_T?SwFjXj44$7#jyX0BtT^lMR^nA<+Q+X->8C5R8LKNHtr(2$ z$s~2@*V`2`CmnwZhytof^~Ng7s0WweUgo+XE4!Sv zDE{unMTE$_ow(>vd{j*n1<4s1+7G#_Ost3%f1i4ZO9GfA5!$^f5_UdYGocP^t;@ES zOl62*N%IV->(6TT4-e`ZT(Fxf#9ToWG@x?D&Tv#<9F901mF3Xfn_?zHcaHv^^;$co z7hYnq1hz|pbIp1bWp`u7#L-Zv&bKwZLkd7r=F#1wxOo&S3>eDek9>pZD=rm~sNAPG z2@uKtgBy$j%ho~9?>Wy=(4b zK5n(7Rr(oJlZw%jG=`bKCp5x1>roPYaaG8L89tJ}+zu;v(>N+tv#}w@DiYrGt?k;NcB9z`w(2@eIN)Nlqz7;W z{c3k&e+p*MS3b3Ir^;noqN(tWiZJH`n!WZ}0LcdxQrbfkU>=pV_Q2{hT=;#d;XB-}aqxpgMtmQ|TAwOpHHGbB)$9lIN%APaYx&HusQ`dAy zIH+_H4!o{(hD8aLs>V^f`c`M#FgEj=j9h}-v+q;vU5HqiUdwZBU*-9@s^#Millj#j zw(iKz1y^aq9t~2Zp`5B+=xlC{fX61Il~fJg>V$J(RP7?{IW%%ul~KFgu1XGbjMF7$ z{u7*g)j3#aDsTlwyCCDIdf8LzdH&wlMYAXX73)?Y)FoUi9tS{c95z&%toKN)2SZx> z8><{I7_WPthi`wp4c%*68-ZSTZF;IkGI*`X^%d%P6~|Kz*z{>*-&4Jg>jQ&IZUO6D ze0q>!^0iEFh#hN{;hEa8ch=_3#K6`q%Pmos{f~Oin)7hv*0960bJoR2aw(VwC*G*Z zIbKF8Ipz(V_pED+g1N!#U2&s*4=$!H#az7Ffn0!l)mFL^oRf;>ZZ92A2BU`fvBMha zSY0l8pW4xK)x~Ean$s#%5bsaRi8ApS`o1Vjr>#%CQmfYzZ=N4?diVk7R50 ztIEvURNg}VwRYasi3c@{ZE`{DTXy$*SY(RMagx~9jOk8Sk+lH(J~^%Hd!;xv%FT9| z6p&wYfNPSa4rO!Mql=9>sND1@Zbz+N`&y0(t_?3)Msri8_C`xrl~)bbA4!MBt0SRO>=*5$P5n@jdh;2!#W46O1<_vgQ<`(NTpp=EiNRBo*Db zU>*)|I*w~1JFNAoyx@9NEIy^n7ohz{YlXCxtrN_fY1p~jll46-AvG8xNGRm@u@9FFomZ{+BIntAzXpELv_LT zq`ta_+S*H*i3os`fJyuS42f2c5u=rD`LiaByqXrG@Nx zIE-?>tf%GY_kduL--A{}v%?vZ2pZwC2E-r|J#xefOO>C=cD7Y{0QnV;6rXd?6`^WY z2+K}YcCK8Lg&5?Xdsn2Xd$v4PSKm@NABuV(g>_8{FSTis$5oCOHeyK?8d8ICh=Y*b zc=tVd=jClXWz6YkwTMnm(UFel+P%NxZo8s*viD80({5vy8#5`EXJ6f`Hr@dvEIwYt z70X-cYc-=!9Ko562=VFcE587_9Sn>b@>rBob}LT8XUAaosZ zU91|j?w7~>SkZk~v ztkRH5vFdOEY-cs|lbn{P*i)eiJ9RuQZSAe42(D#6#CDYc{yhGIw35O}9ahdokiKxB z{NIQ*=^iq%eLmpnOQhOQBtI#-R(5uLe8YHrISrhX&!`M&j zQO+9-4nfDLsrJ`bG+1jp8Ox^Mf>cMiuO&t|40?{WYf-V)HE#~xX(dnZW`;^}PzqS5sp&0$4%+07$&cM$3#I8;*S|y|M9khc%RAtPMRZ?3rbI zrm~HExj-gAD_||XnRw3_2Q|rvuK8_a(8J-Q&CPS-_-;H!py?Whj{{3<9I}CXY(Y{? zB&ZG!56Vg4^fexaE~2-&ns-57UDr!oYxgiE+RG1{I1-lNpd{y~ z%uYDA4<;7E$mIusfH4crDJxfPLnX+68<^dQ$Fsbyo=r$HuRNQ`ra!!J0+ zXj(nHTfBEAn{VAjT!K%()|)&}9}WpEj=xHMtm$g%Sx6x9$N9}?D#;yciAcjYEwdQo z81$;}$1IF+qyfnp?OInd%FgCt)b7X_Jp0uk{#z2@gVcR1j#ch-MxBtV_Tz>P@|+&o z$UO~YPZ0A;gPe5yc^{=+cVWvM=hxHPsQt#zLP;LggJ(n$EK!mR?g6SdxFOP0?jZB77Lvxg4H9okUdIl`V{n{y&vj znn_)-?YV#ho;V)W5k`}h=N{M;xqxFibH_YqpITjjusP^^Qh))-?d|PQ2Fv?(J?Zlf z$5A$?q+4n0YYnHFApo;V{aYO49leRJW=4g+c-PD8kPjICbzWIatwsr*PWvW16obw)$Q%#E@lIHqoZ}#R;+n2e0Vg;)8SG6AM$D2}YtL#yCAO$6B(vs-T-^m!laXMvvnl}k|b67oe!gv!hgM|}N#DmV|A9Grt6I0L_G=#C}bGF=sGBV$sMUBEN$ zIKTj4kMXKjs_fyq1I8*Ak(=)~KDBPqM&L_elfWJS02=J0Rmw&cDX62e(snN`+RlNC|7?;l$CkA^c(@;!(@9Pv>zW2ah0Y>p|c2{`LtxyfjMBE~jk zPUjreM`MmE%!o%?szwcSxSeo~icSuB?^0X0mPqN5lSw-)Xwp7*sL8<3@~n7u?G{br z?Qx?oRd(8V^v*N*R}FbVO4E`@wS>b~oH^;iwYH0?%=qV3mL!VDckasXlLr~k-3Rg} zydwVYVp%{8naCeX>3mnMi@Vum4Y$l8 zzZ%aml`+`Y?6p_2KdE?k0f))*m{P3LcIKP&>wiRavTG9S7O>59!KIBnwm(JMOnk+>*+PZ38Zha0x zJRTyCHVvmv`de=Leg6O>oSzSXnHcMzTCT{&vUonf{d&15OrD_j$)TGuk$^brF<&Ez zp1PlNho@y^RxDLWZU`S*sg+jCgP&Z}Y0FSL{WeD5|$o9eK-m~F{fsB$lt7*K$Q>cKNY^#zkmA z@&W@8VC=k21B1$(jC3QWY8$byDl9qyw5b6=$p<~Z#+t|`LQVnd zaCkqZOxs%|3<1}U54I`0K>qem0I1{ft(4kEGK6l%BKq_moRLjdEDM~1cQ5%y6yF(tZ7^wD)n^ zAdYDA%s5}D>T05tkS~)NQcl)p>Q7u(W0O0aY-mYvaj-Ud#yzUAPcgx7mpu(@Er!Iz z%hLsj9=`qSCjC_$ZDIy+p!#~|vv0X^CTVsREKUal6*-i?7Bj&-3eJKrH1U^HxB-LY{ z+BRp)MgScYgY11PAkJll;(`D?)3vfQfI1xaCaX@C(Wm-O6-oQv)qS-R@+sM{C>sG@ zc8&o#{VSU0>OIV~vbjf9g$nXG#aPyEoy=A;Czs`n>>lHs{c8NT@>%9d7!x9H1oaF@ z9M&eIB+{6txg*SxI1ByXQ|s26cic^MMH0$(U~Jo*fODKxb_Q2aGC|-0!N{Q_mB}M5 zj-+xbNYT~tkU796nQA52E~U3%s&W+P2ivz=>omLTd2iD8;w|ltgy10q0|UKrjS&eW z@c83Cy!QUJcHZOckr`z9m~sH*;-*$)OHB=55MHy+!r4kIWSsk+y=#O|_s?GcYBG2Y`6@%}r>r*oXTsof=U2~bfi0{pApRT-NN+Iwt&yB()3z$gUuq8!`yG^zEX1EM43IehWbsrc({)CXp8WY_ouIcn zeMul5E2gve8P7>xMIB1n5SO?CZcF ze_Fh5ZDN5XjsUkL<8d3C2d*o@p04Mw69NrN?ikt^b|D7FRwVYo1L;)l@7@M^noY+X zcEw(v;?`TYRK|KRI0`uDKJ}Atrb^QXnL$Dc80dXEQ;W94k~=*DOI?rD)0xba28R2Wf(7*tSYB>Q@TPr1q0u`YTN7g zQQbA|*kxu6L0+VR{9O0XHQh@R)NIa4(M{-F@rI~nnPawNBoGaOj{_sqj+KI3U1<~D z$i6|10;-Js$FTM%3N3JpO6#PFn1l2_xoX{5^$DZex_XC?-I^BJx2ex3I3aUA2zhRA}v< zJ9bqEe^wxT$G!*jsH~SyhTZOme#=Q33^*R$c>qumeQ(ed+WWfvRj=X(3 zR>kZR+)hLdYkfgHj4^oKmo9#Qaz$s_ zTgeUDOi;!Vw~faHli$|54Qo-fj7M}_PF;44{oufK^}wl7R~^nyT~aBP?XmYq-eJi; zm8~Y5t6x~8ixZ@330^?SKVD5%xw<-tjxQ`nkQa6U7+%A@N{3WJup=0ePIi~Vl1D9! zk;ttR=tQq=3aHVt$+d8j zM(Tfut8>%RxBRO_(=E;C1v803!vWJBI||iP_il5_e(|4aelB2^E2%OaGN9xg-GyYE zTWDk^=}zXs80nsUdeww`Mlvn93@`*`xj4>A;SAII^l&32Qw?k)yVK3oDYeKE)N zsxe7xeLmR;S=^E45=J=Zr>!*vE^P_L#EmBDA==p6{vEr}VvaXkgkVWgxk>L$Qr6Ki zG4EtX1Ub)K^T6xro@+AF=gGrLfx+y=<#_8vpsY%fW9+GR( z1I(YmKN{V)0`MRU!BV94JRIZn;;mXOydSzr$$38zIKdU6;wV1Xa|WSh z9>)jgL4_IW4m~qb-P&BmZx*1-9Euoc9Fv2ded@jS^Ij1p(Rf)#S7%bAp!CPJM06^8 ziJ1_c$^(LT;fW(X&1qUeXQ{#k%v)pxjl&}&J@9`D=9co{TRD&&@(@FDmK`f<#54d) z9E-6AKRrdnTz#mLkQ>ffU zs>1`#pS5htf%5{SayafQ0`A0V}tcj2`OZNu_L|jkfI| zZ6sh2KVB-pk|nZ|31x}IR}UEkVB-S^o-@I$OA9&RgkHwMKsj6-5&-8Q_5Es(+7>|e z+a1Pt^~cUnJBB&@F;z$1MOD?ECg`BFns|cA637&>7{=kp85K%Lx4gJlc(z3^%1Gk} z`@~ihK1|a20htxBM(%+0{&fzb_b@uZpzZz>{o(8R*Fvt&X;Docr)j0%MW&?oW-?_> z(Y(%p#>>b!C$2!oGhS(Pb#&J<%XECnor^m+-YwjcDJ2iSAa|^46cx!iJX-u2dK|n_pazu<=o=mHSWCQNixP2z z&umh(+C98}XOi2WJKH;kbH+K(J?iB(+{GudMY!JObl~g^8-c@e8)^K0>FLt8qwv<3 zuj!G?1Dk7=&Oro;G5kQNJmBPv3}EwI?D~T0UR|}WV?~Xb{Kp8V%gYQlM_$9JJPvEO zu+uLTTH6xR3yD6{Gd6c9&h8XslY^hfn%fSQRMXWQn7Xs0X(wiR{q}{bMW)Fg*~l>- zB~~h|h*%t{;FFPqk-+GB*A%f#gL8s;^zUBds9x&DFD<5ZoI%VgKmp>xIopm~2R(Sk zIpVktG(Frfx zpcKc;o)6F;UrLiz@V)Mw!s<`nT9sB=2Vi;vE0#1GXR7g0Yjd1{Hs!%UL@gt`Ib6654+Jl-=~rU2x703Ug`x8mx@|u;)9yVf%96c|)*+>HksEXM zt1$x1PuCf(nfyNm!N!#%88>b6WI1Ae0Ryk66_FH7GLO_8VDNqGNYb(h;$uCF1(!J> zXP`9X+&*u@p=gSz#(LH5Ibf3IA-Qs@#~JC#{{ZXO(2dS&^;Apt(3eSO1Bk~ts5g@1 zk80n&wOc!97Q{1<3lH{q#bCt~vVzXM_CD3q$zz5!`L#55go_<{2A&mmf^(d6@0y~; zRH~`N59?aiDrP7+&*Up;LfVl!$@`=-!tuxRsTmnkdKzRAVZiD*=C-v9iD!ZRe| zIOR`fQ-UdN*&X0rs>O!aKD(+hJds@(7nF_IsP!j<&*5IR4PK|q<0*2*xY?e!Z8Unm zhXYSKTU^_@jU{}kU;)4^2t0Al4k{V6-A46dy1Ozp!m}i;Aj*-RK4Zc5J;h|rrrp1W z*Ibd}QX~qBj-`%zf(PNj?OiR7wWQr>3mZ!+UZdtjEK08KuAueKd0)o8S}iFn9vxaO z!Md6|AEdq(vRx~~8fA)&q6&cVWxL=2!JJP&s;mBvxnEAGdkX$1URn>9y zAmbvtCg&%meJv=E-@ERdzm7aXbK$=U>bm8ki6*kOl4MpH1(b1|cB&o?@l0MY@Xd#a zAzh;GAkMuu$T)C4g9BYX?X|V-yq0%ytgy_5Bu5!mRu~|T;EKf3v~4fL)@!C{*3sHq zAthprVL?53_chf{n@>%SIn=yu=4nXP33?cloYj5fqjj#x$Fa#dH10UCVns1Z_oOY? z6N$d%g^9)mIDFKO00yljLzb5y+f8^;_k;dKOS*W~cJO8LDux&rJH&@P1NyQkt=y1qA^$0%B-HzWX+AZ9cq)|2M6m?Y-|QR)j4H-+;kO6CpAQ)?^sgnkh$bk5?pLQ zF~wJD0`>eVq|&Q{inUDSb7^0xbNfW8#&epOUb8L<#%r7mrHTIlIjb!o020{ts&r$0 z4kd}HH2IB>wB(T3r>yEL0j2<9PET5l-EA3T*00##W0m49bt6{uP!WQ_kD#mv)Wb=* zbB>it=HXvCJQG;$F4OXw>V*Yk!L5v+H@MEVH8*Y$5$T${7OKc_y&2I?K!D2uM7Sdgo-+4hZX6lioa?PZdF? zBxKb>f=bNhuZ*i!caDg)Eake@UpEz1pFGri`&OK$F{j+V*AD$jH5rtSb5xdOaCR_k z92^|r`Wiyy^rWJm#*U7H_5TrsNu7Bc)VgT8di;O*VpPt7z3BX(>R@G~hjG zX&+(Yx+D!;bsfxM4Y;^jARbrk4oS?JK*mW zORif&w)Yke95lWHUZF*Ol_2-nibI=CbFggK&k$?v^+c6!h z^ejBxT2ZLuYpdDrkH~SjSmEo=lA4z*wbswm$g#aqM;SS$?+kJW;Z@6%-=!w(9M-Ct z&+UEfHY9WNWN}Cd%|u(A(2T@o#?w{GjHIu2iz^`&YAb@LIq6h#DSP8IoGxah(X4Mv z40A+RC0iiYUTHkQ7%w?sPfj?j+!n@;rAa%TGDGwZ~Tt zbbB~F#!<3oR4z9Tyj1BvMRU>3{zXnMFf*Q&O6yqxc z*16p_`YG)N(un|UoXERefKMcK>C@V^yx__R=OZ=4>~E?)m0sF1v+6HzZ#=TBvY43d z0YGQZASfSPbN>L>tLZTy6Tv*dh*IJB|Q3`Fm%lG@$nFRhs71UPoZ^pt+d~#}Pj>D)2}h z@N2S`6-C}hmx#vBX{e!hu{o)2MCrYzmvXaYX8PaM%-lvaP zxk!vqNa}}zp|Gd$=xf5Q#1-6S9#v=ReTEZ-FsgBsWZkXU?IX6e(k)SpDR}KC`uE%+ z1Y~VYkgR)>K^?1l5V={R=`CiR{ZG zdZwj4@7ZIC1W`g+V?{gxoagJ!aMh)Kj{G(+mEE0konukd?*7Q%W-TLcUob8SJ;@+v z*A-3t9j!Eyyl|PZmL@-)PJ8ZLjAy=j)cP)hx~`J)L3oyvt-=7;5_wT!@;>$tB=jD} zx*H|a{2%`S6E6~8{iH789i^=afM<=K+jB91Fv{O zOHFdiMY#~iY-D?Aytx`ULKh`jW)@d;S%hdoA=^ZKr23o|}IPu>`U;(R-I>$tNWG_pW-9cDb}s zcH{|ADj`e^4c+lr?1VDL-E)A)pwC}w+LmRORfRW6Aj0#5_m2a&Q(5y{&lnFnyh2`3 zx{w$Hjy-u8u4u^Eq+mO@HV8cqdeXj=bu31B(b-h;6-yDvTmkveK#Vg!9|U8b_0?PJ z4-K%tRz#HUlL7a1adb%|iJ(B<}jqDzTd4mi9afym>Kq_%@9D1jzIwT&*@RH zEAx;>FntK1FQIA+>xg99j8x!lVZih~`_>vUkX&yJbKDK<+{2q*)lZs5m=& z*2$B~jd)M+l1h$FeJb<^FS$Brsr0HV%B!~+^y`p+t!mp_mfGqt2d_N)*P()`@2i{` zsC$hYc5*yzhCG~O(!2iv4EU1sNxzB+IZ2&TR2=RHjP&iEE6;%ea&yKC`&RagaItE3 z^2iSosmF88efCw3bZbIzc6UeS{7aTBMh>kyk-Tj5eoFrU(>{}3R^}$$Nynh?TNb*d zq`Nhiv%Lg_x}pC7WPdEzCOU>Tblo>N zxV_s}X?`p6J(u$*U9;3Q`NHZj$!^Y})nBOxp|5%P zU!-a9=_`HZ6}@bU7@nc9Mg}Ds-+#(IkX0B5DD{pUN0`d5nGN>9v2(tT^?`08-_^K|3{RN%FI|k*v8?|EAT?!!&>#k<<_HrF%UJNW39q8jNQH z8OLvWbTLS(WNZbDj{N>yQz2JYRzg7j?s3!k)Wwjtaqco`O+Ci$k)teulW^xFspI@= zgBcYAFHHXcF8=^Zjoc!D**p=~u4=KlQIeqJ*!8VFsz}Yjwpa|35(zmS{eP_ifPdZ{ zymEQws7Z8<^Ct{@RZlu%%~^m^(!k|!*e0rQ~0x!f;tY>%3bO%^Gg|%X_3n>eW3K~-`=~N zqLznUq~4{?V^ozDAhu<3BlSFx2XX-ZoK_4{nV4>Tk-<2@z^YPPy{eh_tcXd=DbId- zbNJNOQF)F;W2+FV4{Z0W8tQ2jYR4l1wJ@ag&+|3Y*+8Prouv%jGn@{6Gt}2BB1AA8 zk_aG>a7Hs%^&4A@O9(YPWiM>mR$_7$y7D;fLX$|AwI(-c@A8EKc;~ql3p^!`T|qoQ z9R4+tY|~u7m?S`eaDZcz>ru|pTQ~0rayeqBIrjR~Rizz;?9<%p%+~utBjo_?+>Z4S z*NTA@UmzV$c{u)6!<|M#OmV11^*@yIJ@H%2?1#m1$JXx>-KJMyEK zBiqussGLD_=Q1+_NmV^@?^o<#fvuV5;FE>zk5g8~fSdP-3CJA#8mUFea|$w1b~)Sm z{?##Lk7*|=y_9wWmOFc>(8()tv>n9mB#&CLJaMhjNY3U{w;OYV=|#=7%MU}A#(j<} zovjVru0|!i*QbU6s-ZEGcn2Q+DlZT!TTWq6$*^N%5J>a}tioim+R2T|Gsh!8%Bbr4 zt=_Edade=u7$sL3;}sFT%_D0WkWNt_gS7F0eQIMLn#la%oDRRvp|n?zK4IE$03Cfg z){Gl5g2jTI^H*}7g{Y#5RT6SUD01BLeR1`x8oc@>p;JjolaHLfG5BMeV?!mxYU$4- zKT}f2WfJ+!#aIleE8Ke3!Y!Qhky}l^mfd`$0IB=LjBZiap0z@2s9t$cA#hGdsOPb( zw@~>=fir{GJY-cVZR3J8E%IcO$1Pd7S%Q_su)b>vzSyHIr-dhv>sqkt=TUpBpCNL7 zY;ty!)c!SvBqYb?AZ>@Pf6uL7(RAyGvXU{0Zb!@d^N;bax)EnJc7(;X&CFh6?FG5o zF~A0K1F=#1ExwX$HdO9iTo_L=<^ja$Is* zi+T#~Q&BiQlV#mH^xNIRbtH-wHc(JtWOTsesphV0lHBSc-WEvJosJxg1vuIW9^LRO z97Q>qL_S}Z8zcE=@U0t-EJqN!Ymhg#aGsy7U0E(dsVhpyoHeA-UC33#I9xDJpl3g= zUJTBm%P3$tQaK-;Y)f+u+}=;_%kZF#DL=??D@xwmcg-{@uyBMnSoY69oq2JGGd&jU zk2o3~-ORppKQp#T7{@&S07}@g({H0-)6R&fN61EVkIKDYNKttsSlY!Jg&U-i_O1Zy z$>yr+`bDI3EC7px&gY4MP{X!I73sq*N}sfB^JkCu{hCLbUtC3S=>Sk!9C@2FfU13S zfm%9^-kRZKwuy!?00V;GPELLM)RQfoQZiY$@nM+v$Km?cJnaMKXJ##&jE;8>ohy>O z6i%8GZ0!PRwmN6o?$z5+o<(O4qY+2jC#WMGs)eL*q|EOC!zlszVicY*Gk`muDKsdW zdlr}vGFKs7xfvUJE(y*L(z=wlx-j`oOwl|dvo1Y@^74N#9$RZYMu zjCMIbzl~b^6!Ba(il` z0M%L9m2_8@>PcgcDJA{HC*)j!N8&ovmc}WsptE;j1dIa^d!K*jPqpyIv3iYkkTb-j zhGB!Z9nbjEy|da~v^Q4m3qmp#(U)-RkPZ$Ts3NITmh6{OJ6zsq4V0#6ZV<;2F%Z2@ z;f#K#nzyN6E}N)FYUt)POsrrAMhv`=dy&(c=QR1Op}dCf04#?YIUEs=J!_e@zqz%Mj6Zp>q@Pb=UHmd>+N^P_ z$W~a8yT>QWxg3N{{{Sj+eMqRRV=CHSm3x4JBL^jvjtS}V{{Z^xX>{vfw~1hmPqR%H za8Jq)90Sc*jpBG5#8eVNIZS}rM>TFt#ms_V-PHlY30W49EclnR@=A{{uNtHp6g+;iea*1a*lW> z{{XL7`5XuQ8<%a|SIpB=-{5YtR z&PZ-dG6JEY+&3v7D`yzU=Z=S^dM1&e$EjTWn=PVOSb-VCWBb|eLF-H7c&uW*X|0x4 zyGR6btgX0`M;P?LJu$_1PJ@Z$M;{qfR#Uul;??g~F^{j?BZ$2Jf z9BooFfJZ%Z)}L#s-Yc{XwOja6_y<0OdS|_8PZQX^yPuupkISAuLn|@gyQVokE1soR zv^uHDT*Zb-AeAk5F=7b^sLOTysI*oW*pq^-&O6oJV!+zp?3K2$ja_g@0l6PCk_~1+ z^0bb2mM8{K8NsTA`Id%;to9IGU3qrrYYsr&p1z;t*GDFeeSK>ln8^WkV$sYX373((<~_kZ2d#B_zuTf+Ijm+Tev^*_krWMHRxI|jddLpT1`VrmOES7BWpW(~2 zsm*dvsZUaC&1yfiY78zeF7kZr{H*K80dSyW9R@3&)O<6lTSW|)62M_ZE;k(QR_AH# zamlYi(=Fm>OISjzELfm8;GC8Oo;v)a9@UGf+-jPYwDu^fke3_aka8qYMgapMNGIC6 zTvfF>EaJ2{4K~8fFXl6}a)T4HC?f|0k}<}3I2F^&29)}Io>HiE0D=DZ9CXcOTX=CS zqqvkV8bE+xoFUzxl#ZP-&1g+&B1VaH+qU;pkQjhL8RU#`duF-cF3h;irE<1|YMx!h zdr->~0NX$$zqE)LjznWDxIFaf?_I}-HC-=O)a`>T_i{1fB_niB0Z>ti17YJJ@sGm1 z@g?x}twCAU{t$O75nx*cqcP_w-8aCa`1Tr?&;15+C4CP!4TW23gd7paQCJSMMP^=Ys#)?B9#uzBJvvu2G==Vrp*G}$$6#xd+VbprwCK6V z-a2hS$$1)x_X|j+e<9dmfM7T{J+W17Z*Fw3@6d(7ZsWHUmpAWYX9C1?=A-S$ASq%$ zI?ek}+7oN!*XIM&kOx|Z-+c0)l$UM>K5Ua% z^VrG?{uVYIk z^6uj*yYd0}THJm`OW&z5V#?hXqq0e4@ zD$HX*z0vRVT|~ZOXj;mBqjXX)5-Sox+EnAA81Lbbns_;PGX*S@pp*&-p3Z7f}1Pu&iDo93D4!Avk{Z%E#@t2Xe zcWt^D+Xxj#1b|?inPd&a6Wh}rJNo66;Myd6Gi-p7TC(mbi|eMRtNL0t>L zc4Nx&q`NJ0+560{eof!-99O72aZteoR(A2)z@Z|E1Zbn63NQ!dNW}N+Ur|byi1VFh zmnsMJ@~IqO$u&JR3SnQOlhJSCyreVX?9eBSFAFOSN);F5Zo)lSz(Z6vwks}~~K5QUa@U?d#2o5SX>)hnGlGkAHw~Q=USmj`q8&Pg$^rY zI$ZmnbKosg#Z0#vH;b*$%1!x z=}%{pMeC96R7At34O~aU3=CG2gGVMBq-WG-SYT94a5GMkolbMbS1rlOq@iurMt+`QnJc_R*jhy6GYMteC&~^QtK2li;-Hvlgm}7!6I%c5U zj0%&3ntEI$d=5{gDM8y~Dk=_q(s~of>Z^c0m5Xx39=ukBue_2@KAkHj@;-$KBquZ@v%_Aup{x8zIV?{{$Ohz%mmL6@5k>90NlIBSB zy|bRxRLTK4JF!%m%N$nlq_3&w*2Fg*H#CjoV*`)=y;gbL=bETrzG@REy>0B3^gPDr zE!jIr$C7Hfe|m_uN18b`E;Ou9zMQTz=~a64r43EQrvzTzPZANwUTT~ZAy$&c4O&(hbPk{4r#)d993D1 zo1q%8+8A^`yi?N;jlc%$j<}AkiglSgAKDD3sC`4#B%}K9wj>YS38nKol5;c&y^ixzTRSs;R-^ zqX#1+*B+In94f1hPgBiQTXs@anV19jjx*2G6x8nZCaw{vs})B705OZG3J1#Dxj%*} zSkswEI5k-?qfC|b}_)dBssH?MEYI4~(?`dL2-HfIQ?VgnX0LGYbK@HH*4mhi~ zaWtAF`Lmq%=}OWpYF*oEj->XcWc3si#tluo6U(lo+lNuj8-e1hWbW!V^U72+*005I#qPPXX?T&e@a~hDNX!&^_#8l{6PDclf z``0Z>7dz=hPc-GXU?>^QWkWKNw>NxI&|w&=q0JVac*kYETSCe6-QUs^t}QRE~PM!a3v6O z&R3{W`1j(Y*0pG~YYAs8o_4}vM(1-6Vc2){72w*xiDuUd$*Kb+asKRiaSZJTB(E!j zk^v+hE9W!J{+zvTyP1%&pqqnC!Ey8RQ9!Ar|AoasbQ$9IC$y! zzf$jrd}pX@cTIJ8;z?ft=GYP6XagjVVf`zMGnQ^Waa%f%hc#Pye#;xfaz1BK1gQA~ zf_OO}k2R5dqH10$A?l!_gQiX_Z%8a7a1;O%qrljrlBb9dcCJ^W0^FlyB3 z{Mqm1`A;)-tF1aN?B}d}2;L&nri(|ixrWOA{veVW1KLMxmr)~2BBML)Vn@mV9P}d{ z?Zuvz;*EO8z+M#a@@iUcgBzc>UI&r_=(yYn$Rb8n8DL9i1F)}{d{N^0@3c!j9y@_5 zERQpY+4cgekt(k5-~v3Tz{XB1>Hh$L{{T0`Tgf#yCJTK^N5fo;bY=TEId&nksQ4fN z%vkU_IpV7+O>;BUg$Tjhq274oTCtbI4{zbybnzaib!zatP6R?2ytBXT>6I}yKvg&Z zDBuicz75ti`-w%yoqMU67SUCN6Utb~;0%l|?s85CrF~uFKN3pX2BqQ~CbEfjIAgW7 zyoHG#QArX-jU!#dW;(iq$tMKY#L>d{*ISlBEP(JvPUGvA0P*y$IxzNX$n2{%Rrfvn z!%}#5@4=GzRq<#*H#1zy$@9L(*|z|nm!RZzKD>B;_6?N!g|(Ai2vT(2EX;AWShHk; z2GF<}1apjzqO~lfjzVBWF1}e3pW^-AT$Kdl01gdtTAlv@pK@LjN`(=rbs2EE0FlVa ztYMJc=eJs+rRtadABtU9PIifP6l-Q~ zyQ9e8gW0k^xcb&~sU^0T36bR8DP{*?*rXCLt=9+G;P7iUb&B5DEN=Tw3l5`kAC_y) zt5W(iwiKerPkHvMvgKHLtVZB+aoaiKs%mr16r$UBVlWBYjEq+NT1s2}l*-vNg3O9? z$=~qEs?*v@ExX;@BS^#dXV;O>>BVx&X}u1Ju3ZjZ(%J4VJheF_mOOt5JoUv{hSo`S z5o;jw!9Ov_Bk&oj(%j9a-9*ycG)Pw~zxeP@PI%z-;;ju(N2vY3Y1<&(w2*LHu06iI z)-@$#Xe;Vfx+23+%mHOZIp-uC{=9loaj5;F%gKc&ks9Z2dyo$UKGknok*=;j)at9| z08lF63<211DuislbaTNFh^mD-`N3h_2G1w-tW)aEwnP&_bRb)|hCu;+zHZVGxdh;x zV>rphReACEGlDtKLF@%|lfBNTbt%f2m4OTQQFm}~I(>1?X5Yq<$g8nbDJtGr@7jkU zuID=Ae2wPgj&q(ql~@?qs%|~-D^B4G22vMjAH~52v$lv-5;<(2e!td|X3AItL1KW;Ay(pY6Hyr2E zgHBZS5y|I_5#RiZdPWi>F*``c1~Zf1p7JM`k&sFJaqUpZ`9MJ&V}t$_8A>(~ggk?T zj^6besL3Os=zG*r$x>yK&HC>r8lp zmEiotIG}EuNO#S*&2=lD6zw?UuQgxFVEG4^BPToo)N$`q&iN>$;3&f5oYh7wBq|6h zMtwWe<};Bx$F*34k&dKyt1%L-v6SZ+^#1?@Rd=eY^T8vG^Z1&$gesN;CA*(b{{U5J zq(XKqMqNuRndjv=>x!O5RfOQ3!;o0x+Z4t7goE>SH4~lLXpcQg^&hQhnOwo0)EssEYRA5$`(u#dmpp4*b6;cNyoOIxST4m(U>Z;jfY~$2*^!iiiNmw~$2*ZvragT1)?c9*< zpYf{Y6+mXm!2p4d4{Dv2R330~oSgOl06&EYMTD0fiO1`Tw{HAyUIFLxti;1N$UAe~ z6I&K543Y?DaS$g3m~o6&ktL&EBO!?7^V>b^rL$sV9D|X_&TEc={&fq020+I-u7(MH zMh_oK>!B-3=OtCp-bYrzU&J5N6?;mUL#W%f+>bRl#!1V1Ru=LPu6y>$t=|n?Tqd&y z6ft5$0yD?-?ah5YS6A9%DZ{&8nex0tA7_`>owkg;x*tM51~!q%2lEvPc?aIX6_(N{ zUJib>AKP690mgksYxj3MXwTz#;ak|&^Hwp8b5bqbZgv&gN2OuSck+VZXVg_;bb79T ztw*-A(9vM-u6iB4^f1S<*#0B6V%}IwaV(QVAa$FA>Z@5Pd?f&G1cCU~nD5%v_eMZI zhX%U7y!ljRsyS)lCrWNm(X(9I+S(|QB2daUh69?TCCZ{SuD}7wHA?GQGlS*~G42ir zH1;|aFz?SCU5Th%_>aCZIG7);j>s25@x z8z-R^r!<2(lQ<`g_pB?)i6>w<>BW9Go#N$Qtg26Q`k#hyFv8(sLY~QJP!R7dz~F<( z$g1weer%F`JB)hN&$UM9Vh_{5=ZdCSu_WZCbN+a*jKno&&$pv?>=I1eD*^gr>r+Q@ zAO=%4{%#y+Py(;0mtJ^zl-e5pJ*Oiz8f2P!TNgEosEUyxDv(`g!!*9Q4><>t00WANiCX6?rD^x}(L9qC zjwT!~eq-sJWC2-sR>iJ)kUmc;yo}a{si@25I;Y%L#y_S#YaTh-VqnTwAoc5?rAofz z-PoJ#l3VhT2RO+&>7Jb`-KdTz1>MAC$fp5)&*9dwzSkf?ftVcRl7BC1-9Sx>rNQ+m zMnFBzdS2K;YnW`X6faBK^aHZ{8rYv(s$Q+}%izH>T5! zTA{-fact4Fha&)E-0@PORUTH>$-(Q^yJpkuEu-HoCKN1HnT}hI$E{?~Z((&mmu@z~ zxFh+Rm4T^#pQGC5l zej7N&oKeddAaDx~GwgBOtya`6Q3}SnW{m#t90TuNVpvKg26hsxK>2%djQjooRcotR zKF(!D4RFVH;0{Ri=ciihbYlf%V;n@L&IUzcmvON72Y^ZEf$vPUw7+QxvsUuv7-FQZ zM_hd?LQ4%vixz~IEwl`BGI>70de=_`_coAyjyYmQKo=n4+jl1!>-kriDspqs^wmV7 zVp!NcwxH46sffWIRRd=wyO4dWD(>-PXIa&wFO%~OaC&|<(>0t|8j9U4?uTL)Ao9cx znH+s9GgQ*9^(%qp#6u9eGI6p-H0#Am?VNS4;UirrDir*^$rZ4gvTpN$ zWh=rd=abZ)l-t7EY(7oW<12v521nuVOwly^&0giw$_Fr~JJ?_W?0fzdjXF|^)as_U zDrz_8;kG8_8Os82572a|ZMAJu#U#X=p>*XB0Z+H#QfoFBHkz7S2-vUzkC}o8<;T5P zx*DOmg38dW%8}(b1wiWEeaY)uQgf5Jm1hXYP=af#t3XmLtgXCl;0?$B0IgYigt(hx zf(rbhPe4b#bhhy7aZUD1rZ!3tWQfT-Pfmb}=WZ?5T|!i5BqL!?K+o2UMLAg!hN~B` zTH5CC%-s~YRbadMz|J|YvdhF5H?G=nb&()A^FN8Pz{mMD9C{dBDUI4J1`eRMLHbi5 z{>`wJrHGQpDnK~x#(svmS3C~O#z@k))HUE`ww6=n&VFK7J3{k?13gb%el;xGoUl60 zB#2`KAOLf;F97g5))lp-<>Iu7J|fOIY;t>h)N<50Y~1p@-aAb*r|&>Zy5TGTD=B@GO=!ZweFQNRo{l1RpXJXWroZbU-T;xa^l zF~Gs;^7GoPYVcd!7PVG*RS{R^JGZ#&&!Ii5cTOq>KGC@zbOcU(+g4yvh{5TOl=*jB zvdJR`ETLWhju?PEIB0gt#%f( zZjWq^GYSX%o;RumeDC283cOOni zu>2~GtdU1>(B17Q;9#8Kdi3N}sxO$YXslf}^So?T!vdu4JqNj~{v5Kl7ZWAp0whnE z=ZxfSAE~OAdabpU_$;4jfSzOJ2GDsOI6sAS+FkyY8(uGyCDn%Q=_4jxMtI1{0Fl8N z>?^*F9_KYmt7I1%9j&uE!8%J1-s*63&vC&ON*y0ams49($f{#k8T-4j$OMiv+OYL0 zo-3Imws{O?0aazj2T_1}aanO{v!trmGGlK?#{-Ohl}0F&5s=~;rt%1C_6`QB)XZdQ!smipHEAd z!YDrDe9OF?75ewZYOJjz&77w18=j@7UunL7pLEX@U~&fy#z0}z6U}2!GTpSn=JUy7 z%Ou3~{{UzX=Cb0HOz&=F3P{V?9I6NMN^yZtN zI~6P~pEpy4*X*P$lOndr{`m)=sHtIw;@<2=j{Zc9F)f|Bp5(6!FoXpR6;y2`5yx|qPHWGFX9*m91+mq)1y|oz5dUQ*T|XT=0Fb~hx{wu!=%yXO0@Z(GSJD=^`@4^?P1>~ z!#Kgl7XW1L>z;V462*A1q-?%RvK_eKm*kG))Cy(PacMVBEYotS0EIj;1mudlXX2rD zvVUkqUC{7A0fOXUqtjZ;Cj%P33ffS>`WfK zpO}(*k&4cnT+}Y4Tc)^xNPcBSk8#E@IVQZO=U#|h$nnSLNEnRCkfZ3lezigMolZv+ zi3(?c5Cj37ml6d~<$y1+vR(_$WUh4PJ z=%QzaB?>1jc9D{?e` zlZ@lFRch5NuNJS|=AllEr6n1rU%@Xn;`gXr!ZckVye=G1;ASQmK4|?b= z{u2C2@R*ClgG-WIC>3WHP?fm1*g46PGU>qg;;Q&}NAP{#EVV64{{T(Y0}m~vPc|6= z_SzXwr)t;Jekb^c;dRZ$wv~3eu8F9l+uT7QXqIGfRGpxZ7CzwH8V zEp+)T_NYEs+Cht`Y>Z@%a&hTiZ0WZ7k?&E&MOqB=8=C}(`ATvz!RwDi|_7Wzaw%rZwkyrq@Av$>*WIK+UDmpzYq;uM#0f=8(O)TWxbvzIQ%LS;9T zM}I!oWJL#XA2vD`9r&)BO4oE-d6MH)v00=ckyo9O1IUpuMm&<6(0o@(ch1!@6k~5vT868D*;p!;*oH)2S==L`+q>Jq{ z>LLL=Ge!^=>QH|WJ^8@;iscsWNC9u)Cbj|`SNuAW-n z&9=zue&BFO`UV_~fm?qMH2(mHz9qf0(DfN-)2^nL<~EznLm4QW;`v)|Ql(GKGsXz7 zMmV^&c6{wzx~D(8vN`=1P_)#Ht1YpX?U9vL8_Uac&mBPg>jPQv-l3<)mvY9*8#czz zK={ZR_X54A#s2^XC(^He*`w-FeUTWcxVZ+@M<6E(#F7-SWysjmpn%V&#TG=Z=*M z$suu(kPk}SlSfz(uK3txv-3Z9&eQHRq?(F zO2@?>Ez-O_GVM#rm(3xt-dgg&eL(ux>F$-`y(hz3Tv|Sf0^3@^K2%>*)RWYc+}GzV zlrQ1ke&1K{)!HTPoX(k-1Im>?R~R`MHX*BRiS883|Vn6DlmvfeNzTSjosfE;eX z=V|O~uUC;-kSQ3)Bye--Ut>YV!AdUapED%f+LnzGNxyqWQ0)p1?l4KnBE0ur_*vlp z01(F`U09@3zHu}kBZ7PJ!Td#R_}2GcheIR7v6sG{XyHZ!I|H6rk3cJS#vMu@u|sm= zRZDgk5*`aoHsIsm=B||jT}f>wd5ZiU@ZE~p{{Ut~vErFtW@b5&06A0aPipiLWi$XP zs0zFR+ofpgmqSm9E(~uXd5W*FWS~F9N1*RkLxx@5Lv*dADC8= zM3C+WIqnY>jT(+K(zNCX!<$xSgd-$$H50B+rCXF>Fj1Tg)l9RXVhWNowD#hzF>RUG ztr)IUMb7M2Rn@)8xQ^l*hD1-l76Dfu%o^4Mc1S$XR{;0VO1@N?%^A5y=45vv$xeh* z_j8Jwl?l$!81*1kDVt$9s^m@RXYE{L?~lmA8R=Eodgr}M7$ju%rxEjX;;&&f&mBz0 z05(9UiAWnk{xO2C+@}%9}%TV@lNo+;s<0VhI6)bI&>+Mo1 zBXfh3nhZE#dSe|aJ8Z{IHSa)&8OdIAP_T7Rb6Ns58P63Ik>nB%aZ%LhmF<3|6(e>C z`LWm9nJVD@?WgspvSIUs=yOuKD-1B^w6ZwUa!w>5k1TOnvoU7d_d)0DioYZ$U?(7h zS@#OV7~pk2^(rW-&RnYK%DY|NPu98Hh783)&f3jYTMNFRC_VrVa6&w)Xe1IQ%NJO7ey*=#FW!aRye11 zqed3)6jD=`j#0e@8K(nDPrw{eWJ6;Qy&m+WVw3_678f>vX@}mQgW8j6q~Z!gF-y~m zcHC2f)VSEYkznVW?Kt4|{VH9&P=y^sAq+baNyT2pb7^ulRs)l} zp1mpieJWopk%7fHA;9nNPSzq)zNa7J?PmAG`d9XaoC`4$D!%ODRQKcG0<%0V5UjcKq*8Vv z2RI;%obW$f*MpDx^*mH+PG>LN3}4xhvo>)QKcs|i&4bD42nP$mqGWJ?{U*LZpF>T zxSz{-`uwiDTk@jXWx6f|QYO>Mb=#k(t#P`l`ZMUGhFrRpkYgkH)p;^o1md*gwM1e| zZg$DZ>ws>B~k-g|Gr)fb3{+EjorbJ*7Ktd@tD zUk5GB-r!Rh?dPRvJXt+DR7Tiu^FN4;9(xaJr&%1n#iyx8U|B&K;Dd!3CY@81!OvQ5 z+@3S_rxveqN=?Nl(2QfX9A=*5V(!{bJvz`9tDQDPu9n1SC5qz%9cn8}M6-y)5n>A# z`Pi|^KBlg16rlmiu*fu=Q+Mi5wrO%Fpn*xL6dI9KRLGb$MmO#xYy7I+z9bvL1y4+K zL@JKOK?JD);PfZ4t(3Egl*YpV@y8#iu6mP8W4{kgwldx^_l6JBu)JTcwt=OYA>!hE zq(}RwA9(#cd(^tae_-3Jx;=_bJgihIgOWh%agGOb>0UqLh%e)YYwL+65>1f6PNZ*a zmmmN(s2l;w$6EaNig>b?4){7x_pk6>{ZH38GlJ@4t&Oa|a~_ZFHPg_?{{V@GwdLMw zx2_{s+(|jdpgx^{&ot}XJFQ+1wj@byV{Y6`#Esydz-5?|#z!5h--X^uZPsl z(myGYB_+-_;4+?>7vx1t2_J8Lz&ZB?i+==v{7y(R#I?tj9~CFo}FuLXST7@ zrk*W8OLX#;@>pT9)RKAi#y*%mYo*aVFRbd5H<@7!63&Jg#oMwxNJdMT)k)e0PB1V| zYtVc<;1Twsva-s`36IHz6&#R$W%C%GF^uCQ(z$A83JJM%J1Jm!novAW-@-cIh}|SG zEOvvFA^Cn#Ic|9%ckM~4cvC^LKrZEyEx7=yZY)ngG3)iOq%>~}YL`-~-a_^q)Cvs|K zaCg&F<`novdTry?ZzMW?nnLclxJG6JjF5;4E0chD1n>zp=xO5lei~>xR+Zt4RJxYt zRZ}UCYhM zt7~)IYST@jX!@v%Z4b;Oh#|`~nIUtNgVzT&#%TU5w9rI$w(Dzm1_{_c|ijwaVN~k=jKS#^WcIv;ybKQj44} z@96BOG>eb;m4W@+*^3$ zvtuNlNj+;L#PDkN*YN$N+)Z}_7m3JeRyn@+m^y;l;~-}_t$n?kzT`%nTv_BdI^L-? zFz-I^@vN@Gd#;h5D zB)&=IkGDbet}3TZDQu1HXIgvvIP|u4irUoxiB)hL7#SpSlYmJz%3LgppDza)8+oW> zxtSDgljP1qpO|OdS3zy3YF7bnAY3lon3}klTXFLVL zsH0S#$-lHDk)(hs$Ge6qJ-dO&&)UHxVetf7z>^DRFMWq+3z6PpO>CCo;!Ng1oN9}L(bO7AZG{Kv@b7SSfjJJe9BvUk~v~H zAC)KMXw}P2s94+iFh?7VWt_JFwm2a5#w$AdE=Mh;!(m8|8%H`1XECQaMnLX=dZv}F>Vx0Xc7imnf#^c(U=XP><0;Aozw)S7Z)|WbY zhPx7eU%Tz^{uFs*A-arb9@O#>bj}ZKe}y|GSR5V)&C{W#E>UJp%CaEo%MA9Wi8921 zIS1)ZLLD1F!aLLhIl;+4l?BQqxH4dXF`v?+a!~D7>G)NKb_;|&f$3FBoaZ}RC;9V0 zlI#&>OB#gI-m6cF^?@oLF z06NrtHbxj+fExgxVd;!iaXPGqNmmWm9kLF4R*X`~I~d~zNeRk~^z}H;Kb2HWTy3e4 z$Y603XDz|bDsL>qIkxI^fxEXEQMzsuFXI5O}C3aWuw4au@@gfu1W=N<`4g z(oE5*EQ628dse8K7BzASTyPFZByfJ7_0J#(j=_j_#xciAvX>Gj<#r_cu{;x2nDs@O zMDhDCUV7< zesD3koDw}b>MBGhC0vu9(2soP^2tD{&*U3MVLA4>FZ4A@0wvgTvDNf#^+ zVUvOFUR`Rzq*y`AF~B+g_e%BKA2JAm7$l9Po}5?S@J1dp#JcnQJ9?j%c$b$%qF8zkp!6oQq?D_2IQ~_PF6D%jVn;da!Kv2mCta-ABc~Y^`n>C=e?7+q zDCxQ`dEv4FI5ha!6*)LQzO`Q766`@E-2VWdO0yyyXBgYYPjOtc#Kk>M*kyGm8^lA$ zLrLZkeqw&LQb*XpDJ_nqQ~d8R<7r{gan#fH@oM)lmIAD0%GJlT!#H9{9edV2_1d(9 zA1J`U&JWj$y)N)@tFy7JtxC^qMr@tsc+X&K#LaP#_I#?7XST{06;XvFMgOSB&+|B0_palT?SLc|=%S3>E5q{{Z^cc_Rdj9D~Ol>aDygRhNGw zj1TdvkUPgHP}l(T-}0d+Eri-znb(lKEbV|4bnDadtf-UClMXUE^T+93>@(?2{=X-j zVE6UuQC?`NcH(_DG8mqBHZVJIfBN-bR+m#RZjM?=B8D$AJZ?OU9zpb}^y^DqMqn-* z8GP*M8$EvkTCr#nq;k!ALacmk1Qu_nTE@8Y?HW04qaXq}Jm>MOB_3B}bvvT{-JQHw zOeFwA2OucMeE{{Wb0l`qJ)1dtg%}x4*jm z({QLa1UcaMJv!33SpU}i!j|^oCtW@l+WYt{IuClnyecJ^=g-V?-`+Xqx*aP{p6PCN zIlz`cq`GsJQT$wbVz}#v{qX=3oSt)!%C(ETvFP&kWv?PtP0f`U@82GkENa^rWmf|v zcQlCSYN1{+!3T;Wwf*ZB&jb<=9OA64hrDeOjZ}QcBy(F9+MG5eQea3kSl_(S;(_9OPGeP4 z?87|cpQx+N2AdtHnR-hWVnOr)yUBmJ-?CGq;+URs%R9i5dyuh2#&pfNT@O zpKr#yaP-sE;lxyEY+9rdTzPE-aH07!Mp=pN=szmxuC)h;~UUY|%Ib5C~I{58>Lg;nd-@&=q{)CBc=QL0lcD)c*iLD*AX| zS;I*1tcW5%F=2qK^zZFSVc?sKkh_z1bKj;tyC3t4>x~I)a7Qqt^>Q*l;U%-VUnWaP z_8*#3<%wg*Jf1%ap>)x+nXD2tQPTv4$sIZ7uj?KU7H){mwn+&iao{fibo%D0MWM|N zpfcPfVVtSm%8#dW^c54KE1eL=Qfld#ZK_@=YiD)=_>olb!>Ap&t5ILHZeYM3XjNig zZU%GIa0jhy&)_Xp*UoE{WpEfS3Z8lA+x4z-G@F=i-aDwt*!wpDf%s>)y>iusNISKm z(?Y!}s?lelXr4N^w2C`v>|%0+1(O7k>5@)OZR*q5+`~4fF*3RT08?%o`1^Mp4)x{> zZh%V58|){5I^=z8cE`hdzOKS+6jdm|DPxYl{VTeKX>#(Tj=c&>UeUW1<<_;BmO&iR z`ALvMfIETTl1EC`({-DvqcQC)%(z?*r26;g6}4;d=He%s?_R!wCEyiC^IeYvqTmia z^IBF`nogA@3lg((O0<9mC$S6L7_N$RD$7=mY33Mc=?8y9l91}i=Hh5%3;aiE3N!wA zr;iU_&P~*S$j!*d8&~oEmDx`Yt9z*!?)F+(C+`Gv0_IF|3ERdGTvlD?uN}tpjk5%2 zA&~7t2TTsV>#8_KyFBXI%UVRIXK7-#;yc+I1{{O1ls|~{;CF z{3&f?swK?w<{9JP6bcv;NZL8iA29k?A1;vk#q81Dmx9&+LFa4c5b>kWuYP^2 znwAYEZl>7W+ESj6-6~joKsr6N_E%QI=1GUh83-xZZfxZJJ*xu$0K@tgr99WM86%QV zWijsu_lK6o0Kg|W72a!p61UOaq`r@Q5tE5jhC7e&p8Qu8Zi#eE!sZ)j%WcDO=OYIl zzY==aTf?Umrg={@beokOFS&;dx~86mE)-hAz=cxVj?u>_@v7&-(du?BtHXA!5=hH5 zYNvE#18M8d;&F;iUiVnGh4lLw{@WbGYe^B@LZ9Hq2Lrk3?^t%1J}0!dn%2-tmhv*R zsnaET6Q57gyqV$GwdHYbA6G{(=fitNB^Tz-;COv3n=0vk97r$OskS62Hk z9_2#0lPtrQ0QBUXOxqT?eRKB+2n%EF~M;y)#sf(sKgh~5a=`xpF1V?ogOheh?8N3Yp$>M>IJLRH zS*DsLX$fPv<0=-qdt+;Va>)bAsFA6_JzSo1pFxV&mqlxvsi2&11?11;I&)8ZN}+TuV=7hX&eVpbuuj-%_vOMj)` zURsN&r%1~&%D)cY;A5p-HgkrNuH+lS@K9wkr$10mI@N0nE34(3Y_Z20sRYPRIP5+0 zD=(_1tz*=VVbO!VtrC9Fwj8tQUevqLZi897h~T;rkS zaBH7!HvRm=9D->i3deBC$4)&)YogH?QPNDZ-&_c7{DzI;4U@Tn!x5e^K%$lzqbycs z7^|i>>sYat(8X^66V80J0DSo*;{()_T;v*5kffK_ax`wcnk|EK2aJP;Uf<_6a{kB7 zxbp2BPk8~{S~USjOmaB+dIQ|lT5Q*Mcac6&3t}9w8(VgH9;EvE(JD`z)}Aslr_7nv zX?mWKeP{ips-#|YP99lT0ogJ#2*=(&q++Vr>T$t;KBcDH#v&)>i>z&&;2t@^u4d;; zwY${rqqi>eO8#kVg+)>_K^Qsb=}V|zTt#lsz=cF?10rJsXUmdDQCsqKIO<{=PFFgC z9mcP6^6CXuj71^N6bys8PvgiYxtpCb2zJMDwc14kAalzQk*Cdjb?474a77Xm zxtU5aAmjnT&(kKm3vUc*cbb2lc^qjxX_%%21(P4cwBrXI`bHE|LhzjW$bUSE8ypzr^8|M-!02C(x5tE*Wn&Pdenmh7Ev#dY@fP=y}>x}fR z%gOY|YiF7!^P?wouJ4$31$%8if})bts=8lBFkBS_ zIX<|}a91{$UKo_8$nc+=csV1lT!I0{1~O};@Z(1~GDjrVSJDSXmM@p(VYI2ww;cM` zF0bUwXSca;EL#ndZacxpd?-CnJ!`7G6rhqgWm5GMmdBo6Y8KPoGO67f$RrFw;0}6q z=BU1>Yc=1PkL4<40(l&EVTHS(ZQbK#V8@(MZ7jsnBZ;aj1p3pAYhfD;{v8)l^p<4du+IY)~|eI_(9q>A)4} zeh~0*5+*5Qnf9+VvCWn!yq))z9ht<0?u zSqO^ZBWxTTe9MAHdizw{Y%MR)M|BH4_-Ty+P%5buN@|l<@re8S+Xw{67kBRJ-=;n5OQ7Zx)K!Cl)=%J|1T9=PZ7uNxJMl>ODQ?cuPB9{b#_ zVP_51%yMc>Q40YfOcvYU8RI{tc2}C!riwQBTTP1F10QRj7Z)E;NZOz96|OM;>kP_! zGY+B##Nx7va)ZjmHtns$XLv_hAL5Y?$YUZ%KcW)=W>narKw-s zB=?tcTu4|PN=eT>E7rU{dE!kD7uGB^sBUfC7|Srp$T|KJ4+Q&~bERPIoF5;0p4c&!GUZ0z1g^GSA$pOQEJ79RPns8oK@&ZM<4#o=K(9>Sa# zF4pO9m58F$HBCn1{{UCina$ukm5AGh7{CLtUrP1uL&6F1TT5MA!1{EtOQ*uO8mmgF z1+-0ryArdioScvbSb@{f_;up#RW5CG0L(x$zq_mZcY<4mEf%1wBnk#H>R0AgUJlSk zdUVZtcg8P{uxnaOehl!uc6Qb&I(?++_WuB9j#ofQ84SU`Y!iSoaqnKu6(3^c<)c1J zFjZbYj44yJqq9#%7o)ne`D?j>;J*cHHnuN4~YU(^aj=ZK5ge+ zT||r^GBSW1Jc(%NV<`~zNIc4Fv^&EDtpTvI=yg6%YaUGS-;AcI1)!k3P*UjJyEn~#C&@^&L*DzjMNTtqrRXagmc^D+~ z@4@24VyWFI?#_%B7PMXJU7kp~V#}k$tY}fJ@JBE=R?PdZBV`1PCUR5I=Q;XTgccf~ z_6(YxyvwK>q-QnS*KVCy^4{TtrjJk@hYNxCfW_ z$KhSHTK@orZZx}i^r@ylXPm9n7YB%~m<*s8$>Srh6^%NJn^U&DCCj1Y{xb1ly1QF# zJ5#*7jcuV;nrR8%$h-^=stF-;$QT`~ijK!nmeDmBQRBm|*C423N$AIpqt?BXMo$LZ z>X%k9+a&feE0iG~F*;zM)btv_67V77LiKeT{Ta-F!`21i~G zZ%UZXRVLz&k7){Vy}eCe4{E+X)@=0qiyeO6-L0A%X)LZB29glOd5XM;MLZni8T9Ga zc#BZG(zUHu!T{y z#6Dv^+dnA>(2V-l)~E3!?bnvp`qT+|9BQ!4a3gaZZSoal$2jYplib$OZV%pOHDm2k zbkX!jh5rEI0@Bv=N%8Qpit0$7NMwx;WAjEMJHmn#^#`|ZYo*q{2~DW!iQ?T7MVCqd zd9Y64JZ#wV({OB^;Fd<{z-K&)^8Wx3cqhUBEzm!;^!xK~aA8%`u6)LLU4~h0W!%_| zjGP`YeREmf57hj3;eQHT>Dr~kHk%duMRjE`a#mOhHZiyXf-y+SLZsXGWO)aeo1X&WRY;o=52nMAxZ2;MsZzHuK91XIGkH{sI)ysZwpxX zgTwdwZKcAz2?&}Js0^$T!Rww`bJL82S>6=*H!OEBz2yFVjorMyQI8{hg$~o|4tXC+ z?LHev1>b|M^}P;QrMS}|Eq`R}7DgUm7#Yt5V?FEapAPto;ikRt${!J2>2}&R!nCO| zQI--0U8@;hbBus6ImK&JF!pO->6{KJ-!z2aB1GgO4yWM&H8BA10@kRwUXGtpR{qac0)y>n0af;A5e3#~n@nk$R6`*ozyk2w{b z6Nl>R2O#wWHRXE$0Ex7J3HYw(!;@&SNpo#GL~dhpRgs9n3&>%&ka*5(*rSPYOnBp#|NnG`B$A-_@l)Z7Yh~U zmh##(k{3pV?JnRA%1GlIM;XUj^{^a4TMoIf^0Mlm`5!Zi;hK1h`&F-Xr{aB;{mV=0{c;#K^j}muNXxG=5`~lIsgw-T~ETli%_M^Eq923 zMJJMeR=^nG_2hAy`kXHoRds!(MWwc1nc-siR-9?5(w436{{Sm1BlY3TcMy=oIymRh zgHd5Z>`}svxby4p+xwW5F(uzkK#*z{uSn{Rf1RR6hSJe71jyy5qKP@!9 zLK!ELHGi|S1(kOU;Hl>$y?wr0nqjeU=7ZO_Q{po$zZHa=g-GbS^fv9{lGb*HAggGR zsEtQZ**m`sWA(2#itEL;{{Rr$-sKsznURccyvBIo9 C(-rD%gVViHnin@7aALn9 zUAXQ~TJ`;kXO$d7TcTM=9FIz>dE{rMOy4X(6OsokdYTVFc);shD61UxCftfh8!fnw zPs@%t_xGyu+(wfvv32uU773n8j;9`iuSf!n=O0SVk`VH&#X)5R2gXPTsL#DP#WH18 z#aRl(?a2J=Iza4Bde)P4AP#X=*;{Is7$>Nvw<=NQh{&)9IHFfPm82{P_okeb&#g<2 zw`Wvm?s6g`;Ko>W;-Z*&iU_01B>Q)#mkOi-k?B=yJq#bbnwG{~is}ec$mCUsf!Gc2jXqAWCUfSGA4i`GrMF{JuI{9ZixXmY)sTl(VW}`&hMl-(`0Zqc4o=4L&qsn09NwOC}{dSlzIFO!3X8LgeIsliQ4n?j6;%!d`6 z@y)mHaK{In5G$rw$rvLZwFI`{3=Ri+j(cczJS%pU&oZx#$sf+j zJ9AO(HL!aRcIj$XP){_n0;Ch1RLKkN-f}TY?VJ@{VyU*?gNzhoX=qa()a;s-Rf#-u zY5rLpo-1RC+o2CTbBcQB8OAD5oPnNeGg8&`y(4G#jO!7T?y2RE;5n?S;;7P(Jz1o@ z+Bc(t#MhdqMx30VM4kTtBSa}Q>=0>|_jY$dOfwhLWA_pOK_3e+pW#Sh>7;9RD(lZ&Mwr3(F8C7M^A5-gHPs6ViYZni3Z#0JF#-PU= zw7!#0M<;BB2;9T& zlaflQ`ef0V@y=6)i&39D{_eky#+g5cdG&l=`mydq!tCyyYLK)VYp-8K z){pwR>5=K})wvZ@P!^hHv)tUW!xC~>@IMcFW~Jhz5F<*C31!*}Mf8>UEYxgckZ`_shugMf@BDi4}VZ5m(j!H4j(FmjA* zr5L^SyI=55v%@|w(DnQCrrY_6G0xE<<2dx^+PySc9h-4qHrweMZkemacrPy2RFE5K zEuxQ=2bO%Z5su>(>$kCLOJ(QTc&#S6b@`QUN`wURst83K9(m&x^Ypw%<%j!3Ii=lb zkFA%5l-#d{pDb;&*I!bPi2OkMHT&2{Y$Rns<>YXRGws!}#{-)2(c(LcZF#i_nqkXt zmDd4xa0pTe!un+9uU~k68KyH`-_0%R2^f&ZV(x<~s(SO&KaFzm!E1XUx4V0TKI|Cf zLQ0ZwKZs{N&OZZRH=1!iCmUCvov5dDyM5L^wT&F8=_1^zuDJO7Whh z9h@=~`g8vmb|C%6!YS z*Zv4&xHl`szFE`dedDM61KnoTv~RV+65J@6{^IfjWOOGO<1fDdv@}r;aa5PLYil0N$V%4UaKMlSv?UFYbF)W1-3=|W*oOQ#K&Ts{AFA&q6 z;ZNN2-0z2l5LBC;Uw_GI{%4{aR6GC;LTs|cu6f4?rDEFLYj#oXx&!R+$-YaHuW;zN z`;11_C%Gf1*RAjPN$q93SZt#=AS*Eu0?y@ez#MJQJe>47$6EEN@%~?QrOcnEpLyU_ z@V_y?yUN$E`JvOm&>Wrztz^Zo=udDhTKXR_oNe9*KAGuRx`wrV;wwv?I6^e&r<2M{ zm2WV_82o}jy$kR&z`^4+PwYjQkQ$X z3j^UbNx91zCmU>%x%5)%IzmSBHOxh0``W$-AipgI^4;Z71Z|vpoS(v_@LrW;V`=-FbvlLWi2U4s?kO1k#5?jF4tD@C&rYVr--0Zl zc_q4YZ)nWU_fmj~<}co5c?`lv>&62f#B*OWjN{zKs+BHf6}8f{`~LvQ`n(5*89p7x zw=0w0&E0+7erFwZtVgI^qzQELv}^m@lx0HM`CBSTAdKfZ=iiLbxYKm|EfrzES7@4c znI&0#&GC=`Pb`J`$>=v@ADvg#d>a>;CH9pdn%(D9m6$Up1hH_Sg$se#{{YtS9j(WN zZf#(+nP14ZRxH7oG_B@k!Q+ryf(K>vuZ{NWnOUE896M3k$sPXyh9H>R!Kqo=CYPsM zM0YgN6lM}O44Xz(a5{2H?V97~@y)f3>uia3%El#RQ5i9g00nU_-QP9~Z9Ty~IiC&c zy1$ELwb7)ro_OMN^3QC{j`5rlvNy~yNacvB>@7^1i|Tr85t-(@+XN#fe`W(X9WV(T z=iFBu>Nw5Hqx3uJ!Y(O686GRt^-I(JqxQ+83|WL~TN{8JlgByk3F*yoT0FC^rxn9U z(p)PCRs`=-I(}939G?bti|bdoxqF*g5GyoOD3q&9i~?1%Tb?k#TJHQA@K)=MooiY-of$=_yR#bDIrHAuMQ;swt4fN;P@BY8n9^1y zffDXEl1G)#U^ASKTXsf0G6i1nF0ZKgs{ZoB!glcuGR??I8eM^#2L@1i+E3jGfaj^= zy@k9J{k5n60A*__6}F9Ttn;+eo*j4tlMy)?JP-CgIm$2;Fb64ZKI9;V=70E+!ccSV)YrT=?1zC0$CAnMy{_^MWHQ(vFwu3d5&ZFWJG>|gK z6mdx2Yi*QeglG!wWyjvlX;xEV9%|BDibj!!GzDua$Sz0ozsNj^`4n{^t z71fgj=5I=GcyjL;1kdP0I!yHmo?eHvE_w|T28-br^~wE%4kq6 zwZyL;?aJI1!S9Ya9VHKRsf{305) z`nI8J!C_YZGlTMuG0E-Hx9@FqD_thzPrYL#sKv%cB$iwdr#+XGkTG73sz#m^@JZA! zJhOjuI5y}o%h5>$4uy8}>C?S=81WoZ>Cl^qR_f(iSDDDi4B1|TpwB;mu3DIgy;0b( z(rH-p`QON7x0WW4aSRSQDt$e;ub{pfXqFe&vPRR1rjYI{kYr^8ovLtf2kTx9dvY%B zb0QXHTp|AIjzFnx;L6I3U1d;XmywKa9OL|J&%{1>*&EiwI+Xb@W7Irx;%^JZ zaTcGV?Nx?GGMIp1^|bT7$7nJMy8g<(h%|6lyn()W!yOK z4OYF1;2^uXMJht!*Y1&yI#xWXE>v%Yps7JZ_pv>sGR)Ev+fpUnxMw_IcBWg(w^2`S zi^gguPNhOhlw!{v^o<FtWgw3qamLe(^YyIh<8+!y$1-w0UrY{uwLt~M@)cmtdH}?e z^7D#T>S$`a+bxV!Jei%JV2EI-j{^<)@sDcCxR9BhV#X9;6UKeTUbNDtoJ(@@Bw_%i zywAEfXB{~i#ZbCP&B04~R#X9gUPLE?VcqMIkyaPVXn%LP zrrbwuyMLa4O0wJRS9RQ{3z67VMKgxaL-nml>~6f0`&h4DKf|qNx`5p=%{0cQ?lLkE zHtuu!RZ`nnDja0yq--%INm2>##wqBdA%`Fuvv%~*U{)?-@7E%O5y#D*4hSb6zth&N zJ-bAr;zeXxGEs=e>~X>Nr=l4XcGJhNYKxf0rHX|BWAc%lo(E5AvkWDz+i4(%@9oVv ztC6?2vBqi;&$|o=BxjDe{3_EngzhpKQZfT6Cye`lI_WId+GzIgDJ-9H^YW4DT;-sJ zuK>B+$Xgt9k@#Y|dl(jYr+fkBFfguh@|=wRf|EJq^%&O18(*}@{{X~Pt8vG*5P5P= zo7-X*3R!cIJ#stawP#+uv*UB+Q|XR9s^y%2XaOS*I0TIK0ClU2v6Pw9>(FSC>Az~z zBHlLu?BwL0{pX*kOvS89qi{>HR zTY;Xxg*YZH{MP%&x9E7JU|4T0v@SpT^*XT1_1Tg^>AM4^QrOB!t1YyqCT=sFg(Ilz z#b`u@qfnu@cH^fNG-c+Dpl_6Y-N%gjepMZ`S8I^ye)d!ZniIy~P(KQK4017$dyh()O9ljT2PdB2)|N>kG3Ar5e&E;LQp{%e zKQ6~`xn=1R*rg#G#Yrw|T za?tynvJr$0P3x)!~w`&2f3`73C;jJM?Sgy>*aA3 zd3Qd?4^NpUK%}nFyb+Q~G~`pXhruLddY`5ZIobFC0szP!p8aXyAd@FNj-c`X0M@S# ztw}x4a+Nf;9*YwISYWTIHDI$N4Z|n4f1#*eGmumU?SgnT;fBWT!yQF(&#}`GTrtXZ z>xS)C;}T2?MB7kcvtuOx0EJOA81fVhb{(-qchaKl;3@U%N)@?T6)E#89Sxi|$tdz; z!=A66PJKPSYpGpFPl**9=4^m=@saiJYs_c9kf;$h0RHL6T4lDOwpCdJ5uS0^-nw2b zHDj4!`CZQc09f%Aj1kEiTdIcnLvG3G-?eegaJSZbR1i_V_A!7u=BQjrHNcWGzFaQB z@r<|URT6u+;AoMyql_~8f$Qnba#d}eG_0M87f>m2h!k%F0!BMkefjJ3t5&l~JFIzQ z<{nRTj;9rbur504!FPJrqZ7fd^eg`CXI0K63^&bFS+exz2mUz&!0yr2M z>`i-L*)@6`kXIQcLIGV{>_|KC9BRZ2fs(&b+lsnbeC4Hyt(nrMuG!{yI(wEdzD7?0d*`h@ zXvIlh7q}JgKk$RgxV$I`iG0SKf}pN@lYyLet|wX0bsIfJ5m)W9O@@sWe+lFH=DH)4 zUEQ8_P9mor5$5vg1;AD~Zr@7iwEZq?(G8kLB!9S}2RwTZ>t2F%+dEqy?D;K$zA_e) zXMBt=@PIRpeK|P%?u{1DPlDe1+F2o;Riu=_aj=hadU4Hm!vPo`eN5tYwmj*a6XmSU2B?s_MSe^8nn>J8+(AqX#jNF!OuL_ zMc$T-W7i~SnN#LyaBv@{S(~S*0Z8{1(D1NvI2K`A6;gW{-W#^_uP$zySt5;zQ-O`3 z`U=&&wTz_AXFJSa?-EXN*nf>xw7i~Zo@PM%81}B=;QVmrcLK*CKW)ZUDhi zlOR1n7~>+cjTKE8V=->DxskhQnz!~VOLMw1#Ds-T2vNu+6`!KvHE5**sW;U>Uq+Bhc>kU+hm0h|wcZ8sW}dIM2*-dkpcK z=L?p4FGG_<-opSVgBpZ48lq@r2QdUHQOMxD$c~Ytc2I0&7xuU|ihY zrOotHtZ_6dWk{d{3xyaf?s1;^uNCnpgEg^vE%n{Rlez$``&dS#3@8jo*F0ASF|{9b z_p-$WHSHaaz6;L}U&%C@v=)yntL8tIv>3}{0Zu^Ad{S#xT0NvOohn%$RM=qORK#xqKj`WaD}##yt1+E zF@f%DxYS{>@kQZFiIpU^+*TGsh!>CJ!RL2HP-{a$x3!NQAURE#?^TTsn`RI~6NX3z5kIPky9WYB0NcH_I9xnu2TuS~VpZyz7 zgqDslb`zck;tl}M;%g%A(^R&4t;FfHTKIk8@em&*BG$<4@G(dE!!8 zRwYolTw|sI>x!%Uw>ulW>|XQj8gjQY3x$Ccj23Yi0CdhU3FMx}voCyerRuUuziF1< zed>UOB|<3cw;*%K6^-Ou+@KbbZDtK4^#q0Fl3Ux;ic8H4ONT{GLJ{U&msgHF2UlG3 zJx2n(>XjtlyU_RWF{N*O)U(uKzA?u=((H$HhEhU;fDQ*=n>+zjb6 z$EfXG&X3}Y%@PemPqu+zRekd|NNKje$^q)Ub=q^@yT23oqeQT{dr>gCmJnk@<$m`I z*N%&p_dd1cmzveR_)FP|0iBWKTy7D8*BvrR;<{_sP?x&T3j>6yRvgn>9aZ;>?sb^0 zZEd6w2&E=TE&x=MJvt4+N8(Luw}U61Cc2*H)>30F8rob5OSf(cjyNQb&zkbfmA&yU zsG`Qx%M#&jt<-$PFHfl;WS?5ww9&Pl9_o3n(b@lO1!4s z%`tg=Ar;E({{Ry0zuRr*mOK#}{EpsPLxOuApU%5oFZ()GSfsU7npaegNf?O8=tCUv zJxTBBTAmSk^@g`PT0+vZtZ{G4Wxyauv}3OvlUH@!7slUe`#jb=WiyvB!4MekP67U4 z*U(_pR8NP@=Q&jNYoSJW(~`~XB!^_K?G_>-qfxkUg?M5*XP&=7TaalNdUd_DdTifj zM}Q9>I&RWsNE2++jc(#pS1evq>UZt!kTOp=$LUlREmmw= z$nQI;DEryt;BX%pT;sQ1YpU^OrknO_8=E%r<8R(H1~40@@4JxP;{?)phsDXNX#Pc{ zLd?d>yHXsq%t6Uqa!0Xlr_8RS@!EFt$nIx@}@;{dn#@Nc9<+_|_rYk?eI%G23zP&t#bcz>LiU!2rIl`$d zP!Ch-Ti!5uuFO-%qj_RDmM9Aa0ho|^IRN9FR&?N!Z601av#U`lbUc?=@Z?sS<7rY{ z!!?m(At@^0k~)fhNpj~#=3kmK_kNnFg^o3XQu>=sUY@0TH>bT z%+ILB)vNV*MfMj|@TJv+>n5YJ!s>sVLR<`jcPh5yj-LMjUTYRxEkLAp@WPgoo#<|3 zJt91i#2!dIfAy&a*hl3Y)1 zBQo0BKmsx-;O&fZpq%4@&owS;QsqeJrAl#J^Jy;cWK{6qfUPDUXVo<*(HNoF6y%p& z<8$LD*V3eiO7Mk*x}KXnF|%!G?VOTAkPB}h51Wpsnx9f@`84^jb%-9`?cdB_GjMeP z5CB33(ZChwCg$4u;0;!J*~!3`CJTYLp~%ij1L@6lazQIt+YMT@swdBNsQ9}SD4yc%OQ-&RT)dKIN)IM`Bt8j zr)z7X$j__5mVS0p24?daka2;xIKk`Ek+lTT?XEQ2JGNNoXq2R?Bo8KX2te5*sK^)t z8R{~<4Nr!^#=2=LC2EVq$f z+_JNn3PTa{gy0et%K||5u3irlYI;VZL@NZdB#Nlz3Qh9!yry{R$TjO<@RF{-el9Mg z7Vk2w?`yRZH=ZDHcM*WcBm?C5xkGXD*k{yxHJUQC9 z0dR6TY;sSz9QCSRAG5QSX1=+2&8U>{7k=P7`f;4sWvl6Oc$Zcemj*j%qg=8n%dt_( zBc^l4Ys=%9KBACCVIl~!vu@rLblNVj zu4qx*L3a>|E+LD^+y>t)F4Y)p@qzX4Ty5r+W#XtF{{YRF8|7&bppi!e07ecl3D4nO zbsL2{qvvwkag}zZv$=a&w_QQa){zTK8zgHgg;3FeIT%nobSF9WteCttr7U+Cjp92L z!~yw>b?DjTFdaXYTGFjz(qT^_4b0_6_Y75)mjHv;fJS=zR<)+Ot0;Qnw)dh2v1ds?E4!j!SFXFz@XN+I6 zv6XVCIl}vnahmt7R{hb^YiM1d4zc1)VIXIY3!wNDPt$xeePLy53=GC5 zhUGysM$v}LWbjr(a>_;s036rAUJ2G0!~QadUvuZdXLXfX2j4|Mdk3)<`YnC&1H#K_ znx&oe4QX>4uvp{^oMS7FNI3Nw2ECpiQJf{Gy??;?ZaP&JYJAQ6JA9jWzs|?NKN~z9 zXQR(&t?BT`Xu6l571g{vMHSt#Q7J*j)RkRaFF;Ah99Pb9+~3))%vQ28M|7S{_#+OP z-Hx81SJEFHymO&zm&vARPTyvN=H}$@Ah7e6G*C$6A!EtMOya!f;pd99uL?}smHw3u zsV?#XlzFa+wByP{^6xE!y99tZ#!Y;_ZAO>&l%WZ7uKl#vWArW;tBC%>r94Djrk2l3 zr1aeL?+ecQezk8ae6cjDvU?*D+x4%yJP+{Z*Tz?}cyjLkdrNCA(*33dR}S+rWE&1X zTn>SOub6b-4(eVZ)-L>Gb*FuX$ImmY3O4Q}?%JwyKpy;8*S`lfYdtqW)MYOeT8y_Z zx;UFVN`(YxJ#o%Hwep-%m}7FRmZeNAtvN|3zn-q%i2Vn{{vOMCkBcZ_vC-zI2ue~{ z(dndayElD17d&b3k5uq(n-$g3({FU9nPC^@nI1P``?D-9lAy4`+RfXV`A^51@Ae*q z@R1B!o&Hm7EsrWbg|>|CECB;2xv#LkBzUIhRrqs%q{Vx0CZQw4BvD*)Hbo+{F&I1r z2a{iyx~2U3jqHzf-fWKNb7wi{9D90G;eIH_3I@_T5=TntJch;973FBIqCyg28wxlKcq8#6HD=pNoLl+syHS`aEx_lo$2}{i z@GZug*H?>weFcw~X8!Db$Ji(=rs(#1Y*zO1M)+rUc_SHV0g>2(>`p-A z7!}!x!A^wVw`ogFH-Crx1CI-ir-`PX88;Vo&9~-qPXyKz{^jIo)RP>}g$r@P#!e18 zjGCVNQohwSDK9T0jwfLoZHX2%J5V4YQ~{C(N$PvouXsf!R}cl@}=Ae{4FJ-4;6*KT#_F0A!SEkb5^=ddiX$A;l{N%N-|z;4|M zuDaMMLkh7FnrXdK>Fd{1l7>1n#(i3)Hkw*V_3vwG>-}2}9UA)THWJ7pkhai`#upv_ zwbsBj+f5}brA^Td%QUdeyI*l6WpWPyf%sP|as97-BwCaLe=77k#V3|Xa<~nKZVoat zQQeJZ#zwKfxPmrV{O{f=CO~oWDI90hj=8T9)Rbpyp06sBxbN)ULqe17_PU&~#_H%+ zCc!Hp!!AMSLBSa2y*oqj-k+}N*2yfcjps+W?Eo^MEbEidvVs9U&2pNzgf%TMK+$|p zsz5EF*1X@b`BH}3ZJTR{Kyn*Cxb^3~%_GOtY3An2<`I7ck%KTRyS58uTo7@QQCbya zB;Nb{jN>R&i{*D(uej~JGpXn{dXA}Msp(et&|H#{M!08ygOx0x6)Z8=uNBWrr}&@4 zdgQkD)A<^I+ElDg=L)l^kx!O;Z8^>=g|~>UQ%|{n4MwW6p_j;3i{*H^4Y;=a_r+~D zjdV>@!HjR-`1q|aA}c9`HM`ja!y{#PE30%NvA2%GwyRoo6_u=vsnLx$%&yxo{7It@cwLB#6WcM|#NpH~Z{vF>~+e;|CQ7X#bTz5Zp7~>vU&Nk$9&qGx_E3HT2 z9~tUD*)bhL3ww!@G;j}_2JetIM>ru#?~(Y@=o(Vn!6F%!MV%U1ZHd8)%E!#aeb!v_ zp4q58HT|98{{R?CF10a=3xq8k=t%&#D!}06dhuR{9dgvabI!!mT$0e|ekAyWYn~x{ z%R3gZ1wxqIlHEDy&>o)E!ay2cB_uauKb3li#2sf!)-O`aMz>dr*kI57_9rB-1CL7L zAh4P%fY)fqF}n=7$i_zoo+?kBn_%L-lCjrlo+Y``JSTmkLvq->y0>OSmQbomE(c~( zpc9@!!R?P%@mGu9+rw5Gy_NG{!GCY$OJ?MRhG^MU#Gnw{h(JNlM#wzz*z> z8GO6NULtM-C0xxuD$UH>OMNs^}iUgouh^lB|p3*<7*ck z_h9kZ9{v1gPY&wpf@=}>i+IR=%hgxZj-wsxQuJw;kgbKpQ7!BTahOPB6KD8N;j|OR zGme$pQoh$bnPJntk5|?7uLpP<;dSjlQn2_Kb=CNv;KAmqXtjNtf9mIxCM+9`h&V4GDvGDYGUf0O+60ERI7)YeF0$=sG`LlpB z06lxxk?3AF@qdGLiIzKyk2lMB<7fGZI3Q#;K|`KLrFvGi;yq)+TJmbzrV=eu%m;@X z;88g92mt38-If07HLVI$j9r;{l%&*}Fz$ROHj$%Eujo3QcMwI8Ae9*;JcQ&7sW@zo zdml>5(zSRe)wF$U`z|$_)z%w@ky+AW4=v7l0P+XrUh(ki`o{Z78g89y4xx2$-ee`^ zSmS9Ci4n-M5C_T*PfQW(T>k)w{5`MezAUxVbp1VMEYaL*HqN_awYZRy%7std+D9WG zgT-`HuhLtEI!VKoEe$&vp^#tN>7omZYp0gp)!^XLv`q<(uv8Td_etF2 z{6%y=4b`tS>$kM=6sGpV=P|`G`J5R!i{{4M5&r;>ewM7F=9SFVD?UkVU-5m%hrS|s zd3;CV#Y;=eJ4n%^3>D;FH>S{XNNn+dF`D^m)(e8|q-u7P+gsf;JXr)b^$oE|Kf}24 zde^4-i^JX(w((`%xVvZ~kU6$721ycD`%zC%UDSRg)MHCkz9nNwzTjxo0zSDM{c~8q z@RVvN!|$hE+QV@6lc|d12Y6N|_`8p-d)P|NS;d|PHiDCPU+_=7yaVz2&funvD$hFA8POHemML*)GjWq*H9?7#qldI?&R{vB?!)ayPEvpw$$}6 z5$frAsl0JTaU>SgO5Db-$YWU_{nhVXwEqAH{6}G+wz;C})|!-28H>ejE?FZ`etd9q zft**`P~zN8C`J`5-=62fRp8t`SxRtjK1*ZtXGhm`PaSxCY8pMmPiJwI-x(<2j;eYU zHPD1HpjGGq9G^=3?)Ww1Zx;A|2_><)iR_~-zTR~KC6M7pNcn?$931!d@1y;qykM7* z>KAr)XG(e6-Q!c`%BPXlixG~w!5nj6O@!jCEUCrTc9&g0tq+vO@SZLeWT>uat+iMG z0Ea%!cLZac)k!|qE+R;k3njAm zBxX!w13B~qt!3M4R+^Q++HE9Rqsd*%(;(p1ySQb=XL(4Vs8FLlhAVh3<~3(+B0%4J z)B4ov>$e1B6ppHTb*fhv32z?fV4#qopHtGD?Q5}8l%qRGQb`!M-S7OWxL4|X9^RDu zG`NlxTbB|_2h6}=9G^;`aKY?H6en#9lpK}YC_Y~Wx&y}*Wiq{KWkNyPdeSPs+&4J% z?^-mP(BzLaX6`Tg&R4g3w-RA6dedUtjkv}tZlq(J^fip%L(;>;PItKpR>@p-9ciK= zlb$NymcyqWzVz3O^4$$ekg8H^TMa}JjOMsw<6jTHzdwf-?G5ZCd9mbWNf{X(d)INu zTps4W9sQs@C#ra7#Zi1k@bk1{=%UTA{K8N%)4H$&KK0FvuR0X{tYdVy^gRp)4xTn^ z4Jq=rz1!^HXX<^m5JylKwc6IMSxB-j?$h#G3Yxp+eK@bHx(jiisIP zAa%xZUpIKi#yXAelG?|I&8!wO$t)=&l4kwi1-9c0l73#fK9%zS0Eql?;vW`WOL44T zO*~oLsLk?%Gq-_&F`mMz*y}pg+!5)GaUX=ZlEry;fspM0B4?cAp*7;O$8&b^$tvw_a6$zSlZ!PvTAFw~ceBMk8;y zuO?l>`(%(Sl)l&RH5k9s5-DWKZ#bY50)55@=~)umNVjI)K_DJ5IXUTG@!=1GQ|eko zx~GU_n$vJTMY^aCMlu<wo{Nt8ts$iNmV1_KDDG{M2@cP=CgIm4fpzbg^*F5Kl6Bnnm7z^9a~%89lc2uPYH+ttygHTBFjz z;pt*1Ms8P(l7HlEcw$XgN56pF&e98q*cDine_Q|#eegK1OVwr8<(NkjC6Y1i zYXSUVy9@*E)84#}{{Z3(UEJBo_SW%76Ys^cl_3vQC$>)~99J2yc=ubn)Y@$_?rUVi zE+S%u_Kpb(asL3;uId@iYwSL+N~?@tpX<5h<~bfpu@S{$D5*_(etjRz^u1$6lG5%g zy?aypJY;;LS#njqRh3+4&>np%ta`T9$S$a!Za*J&65*+B=X$sBa92UGZw zt?N2j()CE-xCKIQG2zbBki>(_4w=SrTq{j;bAcnX0l);4$E9#Wi?{D(c6Lu3n@bNJ zKI6WZ#c@o+*J{HAl4ePq874#=BC8TYst$ob_swYOo+Z+B*YdnSY|&2gZkBe&>D4oY z$0~u3EsFEif+%5WBn0FP1KiXWtp0xkY2+SpMEP&1qU9Z9x$3sQHiCUz{{U=h@Ofi# zXSQYx#B+`E7vP@w`cthuX`;id`MOr0vFDJp8;RMG7q&u$1dmb;d2Cj97juZ?Iox?8 zkUplgHC40I+9>SQGb&0DEVC89^Ghpk>oIdndlw$<*^-Mm94uPKX@6c&+r zVWb%Oe8(GhD9&)bdJeeT*1SclT1J`E9_kyI#>v7(aR?nr+m$4ahj$*vzCvr;wn!jZ z%OdAu7ad;Ij__y1U0%}gr-;1WQ%hm{%Xu8&ae=p|e&+gwnm$3XRs@Hxb+`#t_q|GFMXh)6F4%l|MAmlFx z`BpcDJXkH1-CM>Ero^Y36lAF&sU+lNH@6>!DAk`YGeWCI4e}>rD$@Pr)Gh4nWid?H z637V(F+RDpnVo4rDw5yH4Kf5emA-drW%1h!7m*8@29u0F`!M{v;*^E+Uxf-uLw*18paH86CWmC>^#($2qQz>Xk3;*vlo z198bdm7!wOX-Mvnhx3#tn=FA@GCpFQ@%b8?Otgir8cWoRd_@)K-l-4;faGH&`s14F zyg{oCGD!xWkR&7n6{^Pz4=uX3^)Ai09&*_k>rn9xXoJ~Z-IzLk__Ul0i+L_l8C{4? ztm~ZMGYo)7Q_g)m)yaHQr|UQHL3JFq@X0qj8_ZD=AY;oo`=h5k_o})~Q{0&~3kYIG z5wwA3Xz*7UV5=rUwFNX;2j^e(MCs@pkKs{xtiIZY%p?WpJ^Xuu5EEe8RuN3CIJl zZbfVlhuXAurSX1 zEr3Wk&N4c62DUHlFMio`s>yQp)|N1ow2aKokt>a$Wx|za{vZh>Ja!e&4AoUmFi%eD zp*%k$yt-R;HxbgLMqLmP*=onTjXRa_7VC3cO+1A;w!4ld8ddJNjsU@?l`)mzEi zZ5&|A*vUIaUk9c~rFrhL;yqJFo=aPYYw2V|6!~({e8(ecTyAfE)y>PPY4^AG$!7%7 zD@dy9#5t2O4-m)|Hky<0I);vjZd2w;6Eu@VEvNI&?rCWv}dJKHMG3)tN z?+MR;cORV;2JqX7WS8v>3dV(S9PoN|=O2Z2dVtV=+Y-H{-Plly(Om{X<)I{DkPPG; zoyCatJlCV&-064PR94y#hV1VI&|~bj(@W<#WBa#t<0=Rzwnto0u`Mlz>FacS)jo@) zYSuH~-rX4|R{sE4id3*Y+dOc4V*gLS-~5XxWT{#clGa7 zJVgl6*={vhgi{$A4YWTgjhF+pgU~K9-}=>SYgU~&tA2KS;h(TJM3PRbbA<(2QA)0PA+d}QF`om{JU^o8_g1%l zEY+I9!fX~6(dT&2%2=~w%VXON7!35UNYeas;f-U&_fXqt^6G|ZP}&*Y*qSB`aF2C?K(ApB!sXHF>@>$v1-A$+7Uh6MwZr5syzG)f31PI

9#E5v>}(4d!IywlrChIyG|X=RUbM-1-Rc>Lpl21pEB@(0EKFwf%S zuEk|&(!GShm~E}w8=R0OW{nR8oOL__fx!e0x58Qmr#6Lk1hL-RCCpMmb$fAiC0li6 z+~~LfbA``2^*A-#Mm(`od%wVUP1$rh4+U$so+$B}J(Ln$*hU`XQI+!c;w%L#vw5Y0SayZccK7=f}`fnY!< z<=e-&tAoSV$*4`?s9qaowU5obxrGdpGJpvga-$%e1sLSk{)+b37e~h0)}eE4X?9-a zR$t%9$IO!gC1=AN##9$Rr>GRVF2DVzy6wG$q6jqx^KK<@Ao)f{UnWLuXFnDdAK|wC2c9r4VO>HfvhTtWon0VCOGAy$*7huH(bCP!FKAx53`q(x)gWE?a zo-Z_oU<&Yhb@Z=Qxc5$XH|y@zCR%@=HtWs7Y8!$sqlG>vG$~7cpH&9ofuN6-hwI z44uKjVBc4IcV)(no5Nf)# zH#XXQvAmZY^cp{y^MR z<8T}tR$0}qppjZq4#Ex?WbyA;O!p=u_HyxpK`PkK^!2R&04VT;Tp z#%Bis8|B9!ak{_J&)9k)te#Fi4Pe$UJmBk9xax5k*Q5+JsU z-uufjq^eGMX2(OvIL19bmA56+O?54q3vF15Kn;*c!0IapxuhFl>>xPKM;uiZa%a1q(ol~W!91U1T+QCWD-qC>z^yxnxs_SfNDJx@AbZvoz;=DW zV~(fRk{TjIzy|}5uleg%4q2F$U`unsWTQ=O#tBi5kBvxd305U~unEBfQNde1I^?PUaX{{ZWDuBTbGx|PC17dROU zpRP#!Y8zh+-$;DNizlmRpwD`Du}W4mE%d1+k~ww|xeOQ%J$|*?Eribmp`JARN`PBv z-?$OT9lgz4({%5#!7JT7cvS>?0yDrE=hL-a8r6WeCfKF`KYVo^{l_$3;%w$8(4w`B zT-;~N2L+d-eqds!xPlU*TL7pw=L&QB^{p=}N7ZBBd37X6yekv90th(UjNtm$Jvv7P z!wX{18XVx{XFc*N(+-R3(30gy)C zfMTASb;aIfjPSkvkFUL3x3ika<&>~EUPeX_emyGD4*QQunOLC#kny(}CmeMY>6yf; zBnCA+`s3(MYG<`@{$xx*=Q-z}UMl<+%=Ygbu_=+TRlNs%9uG9gmzg@p8^Qnuiw;ji zo}Z0n8!2F7vy-(>4m$gB^{$3UuHG2Q3G-n?BVm^wo~ETPmfXsUQbD!DazQ=te@{_?dr-<)Or8*Vh^&XYbSWNLsV^*DMjyW}S&kGThYDqQ92*8N;?@_{yGJz`w z+uQ5YnuE(>8ipAp^{X($I^=+Gdmbt(Vy=myf^cf+X-2jX#t5oz;vv)%Vg*CuR5)E(d^N~LgpRej45(P zOYQ5P#P$`j0gYnIj@>Kf@e@^M;JP14hJ&RQBQ>Fn41u3q_xjXZRAE;&t|X2?SSY~! zDwK}Bh#3A=&pbMcxz`HrTN$!4uiWRJo|PY)#!GT~^UX;rtZq-QBW*_L#fJ6Uk;XgM z4PPU!7q+0}9tTWu?rOUvr0oM3tMFSHV#D_6d()OSMRAZo}SQz#n+v00&Bn^=;sY z?Zk}002leyC}d}4ETn>Y0Aq^Zi%Ej+%I5cTy~VgM=(ym68B(q(v#71J0ZFedMIc31kc<+yT^Oo@vX_h`k(g`hMl}e~U(#-trRA9Tg z>(?FYwzKgUhwp5nzP*NJ>XR%bNKo0wTz+S*evj>=WAaJTY1uQ18Y~xjgWg$P#TZ5# zB4)toKJg%K`sdoX`(Ft7!&uht?rtLu0!j1C2vlG=!j6mp9S0b%Qn|6xf?3=nym0wt zB4>=dI0roAJmmcaSiHBgj6ou57tp~V+cPm$icoXQE;t>A4{mCvqS9tms!p3~=Mi(@ zo0(yj-Y9<0Bb*S;l6`TJ(DuenWaxez((UG&(rA2(l`I{O{E|CzM;vFRdQ{Qh!>DQc zq;gz54bODjWg@-H%#DhBSD&Pg5W9}-$< zX{3w29@9}b0sPo}=l~#`XBcC<)E+w5J!j+XM^cU%ZNY@VS{2&3d8AIbQNZjzwTr|p zkqaE^A`tzGD-gc zbYqj!z4u1a?zOu)bi3)&+__h~ww=}@&y#@Xsr3Mn&tp^EcyCbCHK_FK3wvoSk|?2_ zo?I+zAw75-jtCe4k6M(R+qv6Q60q@BM}S((uQ3{>)wyeIsVu~Z+zx(Y)b{CEI_9&j z>a)WWNh~NI9#O8|X1oi=7m?X& zrY$a1nkVwfcEM#J@&WCPepQ`#PMW_%d>%5MB28Oc9mW2cdp?nDV3129gi{^E9jK|x za66M+mE*~6bZ*RnmADZ`epPH>V>zYOd}pp}xEgdJgb=TpB#5EaRA8~j2Pe7Yj8;aG zsa)a4pxIgEQ|3DS*vaU;aC+3@tHxSHjJpF;Df>$sR~jgfZO*585DI~r6RPK^9r6e3 zU4m*p9@TVs))`vX7&dNIkN2#qG1onRKDET^HdC`C*U^au(FQ*)mA0VcECJx-v8$R@ zm7~KnOCl_105K#00Vf=B)}oC>v}Uz1$-A>*d@ZH;k!`f^4_KwW)K>(_c79UO;|FmZ zcjmn-!QLNTA616xSr$m`i>XtL9m55>Wc0wttyS=u&@Jsg$z`a;Xe9ptUnJOLk;%g3 z0qir|y?Qm5_B3(cMWf#()zaW3vkjwp=-FaUN&X&sS5&5yTR3Fem66Zu^WRuW6}Fip zO4lv(DmEl$8NdNg0Cdk<ugIulVp{!Y7PYhRU zV{;^hjq6GSCJEdyr*Kw1{kmefOUwJayZHpSt#L47Bl7u+AIBl~$2}{`#bY6|J)90* zT5p}`j=StjVJ*bkjCOXnD$*o!qX)@hjNu9Y0DzCKdRIx|Pls~r7o&c$1krt+S(uSH=7%k>>MFj8x1FvfA zwS6Ap-seuRVHgqyL)A-T<{daEr@edFe}7hdgD@$WsGGkG+XRm6>zO&c#IZz}5XyA`=Rbbd4 z^U3)^2NllGta!6mnHE$t&aSKtt|S2f=*N`=V~~6Hu8BjHSqs`G?)N$!Pr(+?X?3V+ z^NU4`1~+zpF;YmB;1>D%;C076O>q+G8fLMm$!Vr)tmzSbf=I~1E^>Jzsp-c#u60c* z8&SndFx8iCyj2f}^f`sCv6AKZ0lDKC1mK+GJ^R<5_;bP9zl?RUeW`DzeT> ztTkH=NfrxKi6aE2>=4Cu!mx%vELiQJ)zDH~=1Ucqg7cO<{<`K~LQt12x4eZB?^>apoG;hNG+a zg3jjZOFcf|TOug7wkpJdg(VbVvGw57wJ(R7!)b;{FD`E(owqY>Vje^Hh~VUd*PN5y zy$b0(9{P)TiV0=9n(9X19FsasjgnjL5JG{#HEYAZC~YrLwYOWZ^esPd+E}OuVFY72 z+($fpYie{L*2kBM%_~8zbY4dh;QJ2|ct|swNq1@PBrgOkvnw|#xtVf0f;~9xUV--C z7wQ(vcPy~OGdX0P*@q9$JPv=na!IQGDfokXC7H8^;qI<=0MdZ2*^38_*uf;=ahmd2 zejw|*aJ9CA;M~t4$&O?v=G}k+JmVakS9EHsQAwU8s81D9)PvtsxVZ358zGSAfEn<1=cY4VG=2)yb*(zy=xT83)+p?;WUfqrXB=Sk>U&q1c#~1qb%<8* zO>;fuKe}%!KitH6kaAd_Ffp3Ku3(_G zJMdXeO0_wj+a8DF3k#1692w%imQ?Z?gE0|_IW3WZzb<;@aBGvd*PxQ-Ni=;u_S=w= zN@qD8Lg5B74o?Fo-mtB%udZRZ{?YSg%DcAg##{k|oS*CTuH!_}^hWS{T&1hSad9D3 zoUvs>4&9*jzz00!R|p!}iTu8#$g5h2&Wl zR!~Xnv6R2i^uXe|KM{ChPY!9XZ{e%h^~*sfQsGtN%QoG`mB3&Z103M>sh(k0F;~*& zRB#ws)owbpaGof&zST90d$+dxJn}~vk~cy&xXuC2TO<%q*1H`)!|2a8pEcFAzh{)B z*G$Y1GXe6J#`aXf2MSjs-zPso(R@jDJXYi9mDn~TCw9_yz6crPu6l7@WEw@@lJ^%v z-rjpT7}@T3JA|a2%rVaZ9QN(jx@pwYnBKM?@ky2JyeX$y>zNY8HL@U)rjbJ-L6WMf z-AO;8>t90rDvNEL+JLr==azA65g`}%Xce)A>C5`|9+lt_*e15p!!+JVv_Py08DKdI zzf-`kp}qvQkNhJySCdC7v{!Di?jUS!iVku+9H0LHRegsCN;1c;WqT)YQ}eG9=zA=o zsLIW_r+(MJ=z5L(R#%d>mEE_VsxVboo!z=}YX*OYeizo3S!Ru`VgxBdJi;^AhYUZ@ zTI#gz4ry%d?h@@HHxd?SAhARM=YTVj^{uTc-&3@Em|~Sy6Xf~QOfi5|u?jlZ>Nt!( z8mhG7oAXEE8Esr`38_L-j9+Kvb+bo^-+U3aut^_6XfGFN!pw#?9gYax2e8^J#r4mJ z9wE^+6RD&|CPB4BrsM;uB1GIX+by*HEAO2;JGF#77iqFmSLRYr9scn3t;MrxnFZI8 zA}BfBJNo3D3i-Te4&bULqPbs}`80lmmvL@yO44mfc9LJ3cl+*sLf`mW^lEQ;aT~lW z4jntUC#WPJ#MfPUXLWI;Swo>S8Qs)Kkczec{Q`tjuG|Q9bJZy*#Z~?<~A50AU*TQ15S>fj= z30)tjW&B|bWMNLNCZ%qhemb8zX?CO~;$@E?AOs!3`Nr|U1oMi&tJqoE$8Qd> ziv-fBbd`u0!*E!Elh6zi&2*m;bng^=Ht_2$w2n%Ta$>tBS9S&$b_RMJ<08DAP9`{c@>X_d-DQ-gkD%&dtm3r!p0|CfS!$u-xw?ck zuIAd?fo*_|s&S5S?OcEMwwLyZZ!O2!fKwc@#!EA+b=Ej> z$I3b62HXd~6=zjn3al%0XMY{MjHp-%0a8fIVF1qr;tJ5sW1UBYG?zj&A+k;lu)A4=w{A2B6B2nVbq)yc-Y}U;P7iOSZWgA z$0UQ`%4WT;Y}iIwg&^tncKx5C6#U4aVio(UZD$m7cbeEF(mTA68BU0rXDt5O6gN`xORXs||809MO8mwDe zeieB^fs=vT^R9TQ$@8aVWA#*>p2s(*>ADS_+%u)Ey}~4)y;oAq;1ixtBD(tW+u*l~|qv3>DAJxfE4b-xS* z)hr+eJ!eXjV0fXz546PVmQ0b=!Oz_w*UeX6F}rzYcw*bRi!SCQDfS-K&E0DnrQ{|# z=Vp(oT;Lx3*N>gj!e$YIs+(|kTD9xze#g-8t}imlE7Yllno4TV-A`@1+TGFVJ|vgL zm#8oGEp{&=TR|*pl0FJa9`7uLUS#KED;(#X?fI+7gKdyG>U}G$)2F;P_fsT|ai^$Q z=eKtuSQC&j*D84gbgn*BDJw2}@J0_6%?fnk9!hG+?XQT$VkYZiWaTH-yT8QgA~5-7 z_XTF{^!~Z5nWU2Ld=s@7IL~i-%@2YD9COWU=z?iAYZZnRx|G}^#|+pp%EXK-WPyTC z4oIycuF^SbO3`xcdMAY~`~hon^6L7HGZm7_5=oGAhPsHj?S>d2^slJAJ@E&_ z8dt-Oc{FW7E_GOTxM#KUibZl>DdlLeQT)BotV(5J9)4T^GvrfhekRf^q&L0|iq#=e zo0|hP8%P{{$s@;~s@IKA;tgL|p6BgS$neR*M!>Ev4R$WHl&5e2@_2Rr5)qSMg z?Q8Zv!wp4Ir5aam-CpM*3`|%Mha7W?*tNBvC180McmbEHpJVvf(7qJZ^leF(O&$?@ z)pRHK0KB0TWVSYT9`*Kj!r$3b;m)Cd{jKA-p4&*B5XTL?=&~zFNISS<3Jhd-^{+;j zRZ^rB=}P|qea{OQ#B{LLy^U&ZdFcNDT@Q=A1ueITJUcIhE&kJQt=TD?PqY#|kY3y~ z5X!L?Y)a@=S7`w4_v4q;^c`CM`Z)Bfgr8KpFv0dIc6qy#B!8?JTyk<4dK&t(_NMq1 zp?nnaRgB&Tx|&-pzJ0C3xbv47+`E?<10j^)aDA)enYI4_5^KIMw!T~0{@WJCTaP(| z;2bH=P7kg=zO=I(Dy34NwN{mu-BEc~DdH*Ao*mvTz4uLik8G z(&3)>NzkE&Ek{tD^XAVp>=OLg<(-DqUP26>^$&ymNq4E}I=_Uj0^GBq*&NvNq$NmG z$rxol4RB*BH9l!OqrVFk?9^bAw@$~I>biBSL;bg=6BW^&nc-C)UenLZoRTs8>sLte zCY5(+_F9B*40{Tf$;r=Ak<&kxYF!`uQ^NMQ5bCf;D+G}+Sy-Se!31O;4;9h)9lR~B z>67WY*oGUqgoR|-71B<2GPld$M zu9K;yovd)9@}nmQzk2jry)Q{?o0%Z8xAP+`vkk~B{@t^Uo zufRSPve&*MSm;qk{{Uv5@gfT&eAr|6OM3R{UX*2iRTrx`YtPw2rAn*aioeM(%-QhA zg|#cCmhvqg;`YYi5XB*43i_)Kay_ea!~PNe+wmruqC%-B+9&%khUJI~2+r0y1#ki6 zo(+DwcwWcDo)prw%{I?Z#1j;QDxuj)!sX5ZBRzkWd|&%dcs9qwUO2VZbU!anos=}M z22>pKAK8@Uc>Wv?)$UZw=NNN7nx7qm&u56K%HwP8SzG)lX+upu^8G=%u zv{$+GxJ*oyKV>~mm%$o#z2eK8+4Q3chSuBf`9>sdq%jNtBd$g}^{QSw@PcZVsjcbJ zte2N5Bi%s<&E&EWGmK;@1a{-rx+p#+U3f#nH+l}2qzg;cekWd0;soa-9Y{PJ*Dp+g zZ&Vr1eqMkP?ZB^cv+>V~*TdF-EG-$igY7QBH^`B?faC8ea6#aJNX>ZF{QhZEjt50H zeJ8Bx+CPdle-6ieZ#R>7YO2>ryF^aJtb2+69D|;Jk*)*d4X&@JeS=Qalg+n5h;CPu zkpkdfwK6WZKO72T>d>#*(NahxBe zdN+W)Lv!NqJlg9wmfGE#36Ugi>vD<1;kt$hNx|a_RyO!HJtytDbg&~|qxqJSjh7G- z%%BF{f}~)AK8BA3XgW@To5^iFi}+W~ifzonx8*n>fC}UvL*B5dh)FhYOAgykC$ijL zUO}K~b}1T9f2j!Nyqur}qRdz^z{?fRPg?L_5`0GS9*yEl%sEt5FbiU#QWspVLhZ)k z$sU>OUAM$9h+527+H4mxu)Jd&*0+}E5KC<#Bj(01Mhc$w%=qoJ&k$HkeW?i69-y*Nv`~fCO%|rL&oGO3`6?z2;#WyS5193>PvAXav0cv@tw%SIP2?Mx+jVn35})k zEpIFh23M*Q2n2hI>`#^Zr=1A3?#TLTajE=3@QsF@uR`}1B?PeCJY@t*(FF4ME)PQWOa7J_Of;x)l2Za1j;fs5{W5hNS`BO**v%PAOE(aS_BQrFeD!0Dxy4whER0 z(lzysU&5Xg{>s+0DIymrWl62rw1Ibg>$q|W8OJ_=ie{bS9RtU@#f8264kwmv#v5U@ zNYfzfK^R#_Aoe|RoP7TPuGq(>Y7c1yt#NGMJTjHrydL=H2a2Vq>UY{*+&A_!NpC&7 z298L{R#WN-0`~8DeJ{21t~;7|&dc zkIKH2_;c}NNY*?yka&*dTk3X*QtYw>S1ZAF+sD_ZHSn&F;_Z4{xplohX4GAib>d3P z=bldUjxs)-tF6-YDSShz-QVda>>p}E$+ZASk%$hU4i&IT^dlStUcOVrIE)oW*he>0hg5ImHZpK6+X; zx_uAGvy7t=m)2CP+RtXTWmb*B9+erkif|077^4PU^MX6pgpn~h?dw%#bb<$wx*#Ou zlf`<|mDP_njV@WaF^&ky^s0>8U+QY(fLA&9s?4Z(6hW6?TXKp)BR;;A-Q72EPw7qo zbRD`5)HFc+$CFl?TbQ^?TM|a3u+Ji`50|DfS*s?~jE*Ybm>6<8)XEI%r#L9vsdOYcp9&E;_O|k1L<+Sl8Nho%)Ecp^o7dg9VjCjQZe; z+uXfIewAI1pv`Ru(VP{nq?0LV`c;mSj}?Rq406iSvY^^GwlZ<=is)CLn4Wzqj4nyR z7{?W%$pdK5uhO!pwY84yHAl&N++?rvX9m2_;%A1Z@o$2)O$yM3ns~P+Msm@xaKDZ* z_}8a0yNqK3qFB1)nwJ>L4ieeuOlnkBqgF3xb@D$MuWT+f`>8DMV`$w^%&Z7Mh_0_o zdrdVW@*)#l$c5R9e6gtqu;V!O>0b5wMR+4tZy8*8hC5jWi^Tx*!hD9?W#eqCAO=+ne>YhP2e@b0ZXnI+2F+6QsiuFA*GoCPdSA?vRG+t4|4B&fJh(7)^f!uv7 z;Qsyh`>(#rMfw;{pXO7+3i2SQ#PS)(>)nM`+;gCNBD(x6O zNnks7CcM5j5RWtyl{^ovS`W4lHePo(Ur}5$o3Y#M+Ik+(scN1dmiZ#oG}uf`L(b6M zvy+pPh79T${W$clw0u01P|+gRbf^+LX~}DEE@hH%0XbI$2hQuy}gfBmJLl0VXEHZpSAXC!bsbYsbYp-s+*#v8UuUnhM-e5h?t!f= zvNxZ#feqIreSItKT`$HuW~bp_wn?d3+uxW8WR^vYEPxzv#BfhN>*n;-^nVpc_FZ=M zETpzjV`Yf5k~rilo!@{QQ!M-`;roqEthGI3$c;fOGQ#Z?haZ6-h_9*0c&@%(PEc{Z z_x}Ji&y(U#62s=HMa{;bGV z6KFU78r3AzH3J!uFhfG(NZn6HRvZv((REJ>S!uH*dUUd1L{3bxA1y~X##I+sj`+wn=2u@8-LV9jfl4CoXv)C}%8v^PlBjW+xpkbsB9Rt`{qeX}3`s z`d@?fZCWfJr-15WXe zjpNg#&;{+(wlYelOF4ge8%PfXqXWo24_e-VWzwR!p6_k8pz=rLMRKf9mU%3{F4SK` zo_hg`=dX&Yp6KYqVCc81Z0qFE^nC$i)9D=+-TzB-GETfB#I1;&hkTd^yyq;%Bq(Wc?)i;2|&cM z?(`Y!?OgOG-@PNQtQ397qa4F&Z4vX`q>yw~JOFy9slj}%sxvk1h25EheXLd@A>N$0LJT`r?r7^-)7 zXH1_FFYP>w4K~)=#@5Aob@ygM@6$ZvG0WFAR4EV4Q0dj$+W zP;jhpI^wyX_(U#6zD3kA90q;mfF$P%rx-msKH{TGa>?onQok}<54iB(h_wAX&$DRc zw-Kz8wYzzxRosB=S35FBIl&^jjV{*1S8=CZTHjB8$Qd5hLdw8nnM(%7SEu2hd=Clh zcD@(6xsy{vcLbL035jJOZftNZCvX*HSqz1aa6>$j zfZUv801tjfbz?W~r}H`?2=305d^^*$2&UEb%eke};~+^3Izv28;E))6<&HofDxZ8; zpQY8Oh;`W0L${LJ;xz*o42=@U9tKa#z#wu@0WYGvD09V&fZhBlnP~a-MB1`+vorllzp^rr!HsrA$uq}T`MEH)I2qOKFw{b zDl|8&$qnV6WsErcr#VFm3C1>#{p#0+d`&-sZ*NYSa&PV<(q-^6*wFc+Y!x>t(4JE!PR4vA|9mo@2V zS*B#3X)rp-&ZLAn{uNP?`ST|^#m0KC!0U8kq?$5(MezbnLdW}VdpV?@<#3{MKFI8( zZf&Tsv0;;*cIO>&RX!Vdir-1Jn&KE>f_WwV^o-f_qENVp%WSDa$1RhC+%^SsT8vsg zu3J;oW}4pKID};&K*UMN`9Uj{=t(%_nx&y=6Y7>N29I{Kv1bn+?S(#^!DZD}3W{{XYYX=;lSl14#0 zFmZ$ThHy=GHoBjK?XRq?b$<)}rfayParPE)OiodP+UsTXFi%oMu z@XEx=iPBqnrIbJumq%F%8}diZjkxFsG`*+0dswAL@08&6p9gs2!YMBx7Z#COD~Yo{ z;*gV^5?ecRIOCq)l|GT;GvY|v&MSDYb#ze_8`(sf&}1pZu+E)va8ELe^I05KiN3;^H~YlGAD zeKLEyeLqXoB-C|FsTl>l5SZX#ysqgaD0ZH$^6&@aUtVhVI^E1_zAe9p#THkQ6tRld zB@vlFh27Ot8R(&Y@#uYgR`cO!ifp2tbRP^{slAKLHx9d*5cx3$w~jdQK-h$YQL`U~WnR24l55N@BG1 z_7+#S(XW>GFv7CRS#y}j13xxEQG&EzdmWyS*dg_Lp_3 z#}2C^{{U#*+O(Gw!4HriG7aTYMsoY3A9$03MgYe(%j{c%lGPotO8lp!Yu*;{wwHM& z#)+jHo2#&X*C+eD? zh@$Y>ig-7)*AF|Dw%Zh2q>trQ`?wi9&q0z_7SO>RpZ;YbGT4?0nK?SyYcPKg6Vel)^gZt!g(ZRM|pgh*fEs6 zpElJ{2qW^%eMNoo1}#R`O%3m~#fO+J5n>Y=kd-n@?m{S5JSz0ZUw(qhGj|%<_;tW` zh&-r~iBVOhY^oIz#t-p-d4d1|7_OXFG8kxkN{jv3ST#Gx2YUZS1VK?TR~SjPki`-~bAMc=}_# zVN(}NRek>etq$r~DQRSQSBN}Id#GI8NYaqAwo3HMkGe6?05||}2NlQ(a^Qbj=q{|Z zw!56#JIxxYWNAjv%zD-sNP!s{806`s_m?j2az-)8^);NTU5*jl^p5~( z+8kF?+-fq1oh{tK5jj*OW6W<-3E+0FFT{`=T|#LKd9gDvM^FY;fBMylZFfDr&z%H} zfP#&K_m#1gBe*!OpI?K{(<8r(Z-jiZIa8lA1mvEbIQ%L(tnS|Ce$Lamo#E+Ym1mOe zS722Du;6pa`t<2bewLP(F35gU_cNRNfh|zScDBt1x!M4(a!(`L++d z8@XDqt)rbu(&;v^i7=cg+y^_bFiAN%sHm=M9Ug`{Y63S&9X!Arh5lUs0QIVSnGT}r z(BcS@MsxFYKmB}G8J0wqqR+}W1b>rT8g;ARe4uSbCnq>8Kf~U++Ujq67H+NXZSGE; z68VV{ELffgKyi^>4d#@$))7jskt}BtJ0HD{fB-SL;NW+~M+S%XXkO}jsGe5x%ETn| zKK^r(I2%CZ6Wmujspb|~_wN7(Du-we**x*d9^aj72wiA%x|b_Kr~Rh+p|ou7Z1cj7 z=RL4FuG2sgQy)7qJ5)r%GZpuWk*&GBT!Ak}?K5 zR!n-#*MrKNmIDBR(>zntuRisgPpQ)cmgNbyvwWba#_yZHPZbNah0g>6 zF^^xRX-{a=9nXadxzG28c*Qyxmf@p}DQqxM2s?>AKMJ($YbJ|YWsjLA{ia6eh3qlc zKhC4nJijeKZ{I*BpBHt|m?1YoQ|<$FTnZIIgnRb!%mU92Mg@$vd;o zJ?SqrojAs`FPMxnSa-&I{c2OOI__~u7!m+GPaIa2tFUngAh$m;>F>pFTImr?tgy&_ zP)>Vw{IgpYx+dNx5T(_k(aG=YjODgy~Ve z;z=VgM)l+|t19{}ypf`;izo-q0zgtRz{%Xc{f{+`f2&MgQU=N?W!esT&H)GBg9D_p zw}IYEsR&hEjCDURY#&-ds79YMBS*M>?lxmMt|&>YLpRz0ARf6RpYf|QSl>VTMZ~QT zV}KO)BRJ{>OY<(rL3I_B+x8b?Tjo%>8%H@_qOf%vTS$ao*^I(Tw|R&D(V;;-A@ zK?SH*^BD3AcNp{?`1Pz^U;QS^Ino&;JBbAGlsz$19m$F)rR}s+8%10~r;ffis3_KbCJ&=ewCt;mBw7^nUEOQ%Etr`QBp;!2}Z(* zxgCiIKEAbdY0})M*rK&Ym0Np0C%!2V|d4#oy+KR$o~L8S}reQ62$0Sh{qw1 zT=nuWIYkHCuRyuDd9BDT zuJssIkU5hiGTOSezZMXXqBkzvGwnceev&yUrDO2bV%g19|GfQzU)|&y8f-*Ca zis_+`t4*YyhBdH|n$>E1outspBXv(YHyu>ueQQD4V+V2Sco^yV*NEw!C%n>&NB5%S zsu9yZhp_zXy0q70zlmju(6g>~vE(0W_UUGjn$hZcQ_I@j8+QTZV(WmvTEo3EC~cq~ zI*KH{cpq!zcg}H5mr#mW&$vD5RK~+=lN=jIo5;>*k>n&6WBlu43ERv0x)H`IhQTDI z$RJjNY)zo?p5nYZ6&z|ip4CVxQ%Mgq0UrYd@M|GANX>(gJq1{~$-*hldy0HUIDSUX zPILIzby?jUw4-7nxEm!O ziMO7)&lTEO+{30e%q+|f7=w|vu)I-jK}}8@a~u*JZX+wZ@aTV~anz`7C^(HIO40LLAD{j13!yz`+@ND8buU*gBL zZ$~_q^0mQfT~!Xq&;YDJQ@?IOo&jUqpU%2)ZC=dd$HLLj>3lDFVKwTmrW)eGBvCUcSP456<0V7+=GLf-0K&@u}6axs=q4| zc@3SVvCtFvQ?)M*Y3Uv9?xCo?yD>#X3>l(~4mezZ2poab)NpJ5718whgqL#O%OD35 zC{-sNKiT6QE9(_?_L=$W!cI>`bG}_7%ILO_Z>TSpiWOwad1yQ3iODCS=K`sChgx$~@%NW1dKE0HN}HQU(zgCF@h+Ki zCeR>T$dR@STbroNj6po8`Eh~UlU6))2Z?-d4XD)NPYzm1Zr26w=R|?BMnaLxF+WpY zOR89ZW7y6#OZcuXrBfTqp`D{rzc$cuh9~6*AB|$%c*|IW!&7L;ziG4kGFr;huz8_z z!{dNPF@+rf>q@R6N$7d>@b8f~+~4svzP&x|tg-4bUTN_|wID~5NXo_lXWNV_o;uaP z2>3_A*S2@M&b6ytLnJ~^v+4F>V-Y!E0+xT6j;u&LV!00vY91eWuIGyKEwU_e+zCr7 z1ws$Xs6P(8n(OWSLE&YQ^vxkA5#ByG;FW|i8Dh=%nB%dmRYiSS=qNa+7^13;1H;!b z!+oXB$vwev$vI&nuNW>Af^u?y3;|xS^LT4hyNFm#DqXNwc#Nwi{Bk(P;f#8ky`=ay z*HYUOyk%Y>mhUz`bDhj&Iobz3IIeU45KA8lYLH%8PG_AbcwT6TTUAg#YycZM8RQ&* zIIm`u;-ltxIH=B}x>_2(DYCf=nr-Ovnrv)4w#uQm9OVi28*9mJyfxvQ4Ojg#LN23k z-iaG<^7!C;{cG9vc)US>B$}`cB9-<)Cc+n9+c#x`p5Df}3H%ogysdkG2$+y0AzfR1 zpb}GqkTb?jQfb+-->k3DwqGI8IIYp`7g&snk%`H5!9H`(EXV@6rGZQMZss0WM@o;j?W z&xkjQv1zx^Jkv1!#n=H!i=o^BJm9J-~mM+3V7Cf}PrxIdpt z;mj8z zC^#hJkhuKoq474qdgds!`DBLHIS-c;5ITPw9G*|%#WMZ=*P>?oY>jkL5OC9R!RM|q z_*aDKv+p5^Nm(5yU7)d<59x#hh%6<0xdwJd*Qg|)DQbZZ+n z>85Z7<~@Kt20bed8|yf&lf&W}erWz;5AM|zWMl!H`sDPinC5*3=F0Y2OWTaPs*GWI z`MJkZYo>*xE4_{!P3H!>pGNAw7q*AO+I97-O$_k9Zk-5@NfYMz6`PKld37nu=<;1U*Tveuh%U@}e2EfDeC0(V zBC2IL}Pip~x>SmN+dnn4^Mxtmu&Z znQZ;n&R2|N_o!~~bvSif8|f~c;%Os|++pI4bAr*}9G$f2RbSn)@&kSURrioN3IL^`-2n{jd46A(pu)RP03=a@Hi3-i70zlppNOn9ZA(nB zx5cHTX&uezC3h*t6cfP7;~h<7TKMx?)#Hen9w)bEf-txbGo~_54l$AjM_TN(G}Eu) zI(ECMLvHX8(?=wpbY5d;87NBb$A6n1)rYj^R!6f#4;U-S9wjNCSCU z0J19cBJwkwa0frvwD7;f9cx;(i^Ml~5ww>L<-u;bGLnFBsGlg~xg)v7dY$Hm)_x<2 zwEaTf3rHh@CIT(Y=*)OP#N>^`l1H$u-BZLm=8=1Eb7f;JpJWCbS?+weK|suTDpg52 zI47XRc2T0-lRkGb#4cGYXmoJ=FVbStZ7+OTqDgCcdZOK>wv`6?rDiHw0o*_X=FSuk zQftmUTkx{OL$}~0NiDaAZca1F?rGjS_?Le!nl(uT@ZS=t6}UT+ zBeQXk5;@7iIBq!l)()Aj>V7xUjlQ6Ev{Ej}-AC^tU<){DFiS5iaC#3)a*N%bbqIUj z?`=QeoQ}QVj}S%SxGy|6=3GZ}B#a`7T1G3zK;!s3p1tdoT{8awPrlQvE_BAX)FN2r zoyZK1Gmyt<9E<=)bCHbZzL4;X_@2)CO+!ME{gN4829Zyi!Xhxl6*wi2Tzb}biQsRw zgLd%Cad4@!1TE(RS-0*7puh*db6m5-#!|CA+%0+1r_B_2mam{`kfQ1usk>Dn(s)=9 zo^Io{V;~+#87H9i72No9Rq)QA;VC4z&?M9)v__H`yuj>BaI&}rU@kx;4D;{De>Rz- zy`(8E@v~y3z_~`1mPhEjLBZ$;O#0U$7n0W!>GEMrX!kF1w0y}J03h5jIUEndp<$tG zBzHoz=PS>-!rA;{zA@fgUg^RcnWfzeMvP2q*~kdzso(?Co|VOFo;SU*y^_*xG6~ta z1&akjdLA37^x%$!SE%c{UYS0b75C4mIF(GHlWRt&I3Ft<iY$ONBmzGH86k7;dsZYA?&7@Q1@sOY?N&3W>u;Vx6x!PAXO3TYm(X)M?A+S@~? zLpAo+^V^WbvB3Mk!_QojO??ya(@c`f!&5e51W?Itip~G<|;Fw*!WO2o2T=@6Fx-`aHdx)A>8w&xPlg>H%SL_ur zR4KOVG`(6sny|TEI$&KRa>~NtgPA@CxvH(k@DVw`G4D5RJvaOeIhc5F$NH_9R%M!1@>c}@ z>}09Q>%p&P@SlrxUkqxaTG#G`Fhv^>uON>tf(8M`P6@|)@Xb$JxR^_Ss7-fsGfH8M zE)h2n3C2EV>&9BR>FqTC01-zivYun*fip)k7MN||fT$a4mg-64*QI`Sj^YX}$YUEY=!y(je;i0YN;0xZq^^XEpWapQz7s6}FpwV6oW89Dz%pm9QK4o11_Gb?J)S zUlCYujcx7XvyaPPDkS-lh$Tyn*$udZ&Uog&OBq60ja6E-(n(s$Sp7dMs|=S6@Yp&{ zw(i?^)c8|V(6#+3yxmU5;uLa9$jC%z=-m(JSt980N%a-=-^AY%-D!5V`gM~TKGpI( z4w(oE;1GD{K9%8@J{Pgn?Ard_4YNiEn$fOf1p2S=^XbR6eD*H|3UhF!E76U?+{$hZ$f+a5%~?`yRY2(yG12nmwv7jCb=#6ncfMZ1J!yBx7N7{?O=uO0lW@ zT(;F-UD{+}q={k4Bn1k3uc0;J`#2!*J?R4s2V9YyR+7b3mXdcejs}Ef%%fw!pT=6G z(U|RzlCA*xdhzeq^{!fb%e$9pE+l6sgOkNk6Mz5*{3*U_kPdo&rm}Nyc6G)OS|m){ zc_4Cm=Ahs&VV_>2gmrQUY*bGE-&&JPq==+EpMKR$joBWf=~fQldEgP6g8_0u!Qg%r z3A?c)ySuWASR$E{DTX9Kcx-gf^sU`9O|-hOYu1qYpt9{fGCFmxZd1RY&whBV3k#Vo z!zlZQsQoHspD?aKV5F$(I+2Qgj~%0Ga6_oOMQmkNl12N- zq~M;1r(TsE&cSpgh~sx8X0#=-zgc9G2wl-pWM+*?3Z!HbMsZf9YiM)M4XJz9y0@p9 z?fS=n{4J+ho0+^xZ8fu?WN5C#$a9`NzbKQ84^F)+$h4^KhP4%~q^4LJ;X*qMGXb0u zE0vyUx02lR-nVTxX*YIvCgK^)ijyBGl4B(DtOy@4_WbLk6J9lSgl+S=$AG|8!{6G~ za=(?1k?d~e(k?Z1Wih?t#>4o_ZD!BVXZ5Wc>q}iC$4rsoc9!xFJURQM9P}Q2sqyGTH3*y#oKKn|U+fCFI zZV8j~!zk;tk&)@`j(TB+i-x*gX!>8N&tDlhNm*Sds_K=rcJ(^1gr6B_@P)c*?F>>Y z&dk!3-6AUuyd3`kE^E@SzA#Uz>pol;yKUhmkS0JR5y|zhm2UKp?5AlHP_&r;0D9fS z76;gLsr)ym-|Ckw_Gt`oKsU`haHyH;f0x$1thb4=I253wox7vwGj0gWb16FV=1xxT z&Fkl8eLMR>d{nscb;pLZ$yh(wG=&lnbGfEgAfKXb9@wvvyfBvc+Wwyu{&5mWszf;R z7^x&GXN}Fk8SZOa#+sCOI=$WPq^&F>C~e_lFiBXI4;ei%#Z&NZm461WX4f&g1|<#y_47WvoQ6qHuzH-MHQGs4e`kMG&{wchMWw>J`v68GpgT@bBU>t*8 z{{V}$3+*=g*TVV`Nm^m%x7jxscLU0q9G02451HEoA9Mj+t^SiV`n(ptAuDP2hKesR zt`;!osUCwTHHIlFyKJ;81rKElTG!O(FLeu#6kbX+xWcrpl!62~YyrSgo=!VfOWFON z2^rRFd#%7O@NtghgI=j&p=zE3)gbY8y{WpeNxtUdi@9>C^Dj_wp4sW%t1L<4i;GCE z+B-X@h@y;;yGvx2>yACma=JXRciiZ6Zdz<|ei^iq_6hdN42j0xM(q9H)K#rRL)NY* zT{+@ZU|T1k=dtuWcdgha(yYW5er!TpP0-IK!mT0}&ry)fx%p2A*R@BiT=<(sai|+2 z_Lr)S70CsVvJOt~Q`{PuU$FGK=spb4?IVUgH^jC+bZ|4s2~0AO26^D{diqu06Y2Ud zfP6(^;teuegt@s3eF+#T9HGGgoNnpObUHVT{5>v-VXf-XM({*J-XJ7mNxydNR1AW6 zZQg@5ucBXgKjH?76fv|i%V>koGNvXBpny2*yNnQiwdrB$CpD?(R;ec!87=f{q4f`e ze`$XR+-Y{#8tHp^8Me7aEUzgCmFx*_-My>lPm7-s?tUQnz+Ky0x7k7n;EbMHA_ygk z1Z3l%r@eURj+erI9q}~Y9@7?Qh8fp%QUSCQ0W77n!5-D_eh={X!*3H?$D?Q(o5Oq~ zSf^`=Hjyl$SqwuUjjfdTpaNu;~J=g&N*juooWyZo0zywF=+cof(LdwFJ- zH}eJqN9DLICWVG-)^z~ z@f`>ta1U+|LtcGqi$sq?5WmRz*I73n7rc*NyoxPDOTCTYmOF^lZR757&JR#{Bk-;o z_u;OisTRBN^p3VSk-OUke~~ltyQ?1-SV!Rte+}F+rlX~mf=hUTS7@`m5Jv=nN$JlS=9Fa=>_te_YfaCX zrnc7n7kM4Fu@gGTfT>UkDV`lk$UQpOSFA3He>R<}Sjlg9btF?wBbdZ)%aY(S4l;ld zk=Kgqt+jnC#JU~cnXJjS>eF*+R}zpAtG-?)VloK;vi9p<1E{Q;HoVapGv(mM>USYi z$OEwzo8O)C|UGN`AAUYnM7aI;G@G8^FN{-I77zejTeW zYs$#l@k-3U<1HG`P>S1F)1WY$v|L6B!mvDr&(^!^dAv)ld_S`Au82gJW?>wrMnsT? z1g6qRBw%gzuOPPZ2COeE^zBwm+r-KSMmCNB=jqbDllvIj>XT@CgwfbtnBjPx+i{cU z-mJSx8QMrBcFi2ul8l8YxWe%~=ffJR*!YSKE5>MUts|7%NgTwVC4t+OImp`8>HanF zUYP{2-RYNJW{;>#0^Iqpv7wlj0f}LPG5kZfUt04202S!ErIqc))!n$deM;tUE>eC> z_1q46^P2UMqH6bE6t^0L$d(t=+S%L6%o-6qW91G*7EFwsk<%xjt;62|n^hsh6cI*Tf>$BIsAo$k*0L0dM z{ls?gU!*M)NbsmzlAx(~;{}SIy-joa&%#Yl!}qF_&HJ@&uPUhut~tg@=Z{MEzYA&l z2aWt29*^QZHdys7GA39ij!_|)jIqd3^5H=s8rl`%)tM|jptVL9hWul$c+KzpDXw0_ zvk}}yZz0#=a(}uhT;}*^DE)L`tZOu-Z}yZ=QYFl;yqJ9xQ|G)NVZtaWR^J0 zh6xy8s^N(nfhQfg$7?BrHB?ls5o^GmKX`ItIy% z@srZM>s9egy8XZQ)~BMv*RV(g*DyDh@}>X+L>XKGz+eaCT%hom_Vmjog}U2KcE<`F zEJ3*{s!0H34*2J#bp3TL8IB(TDK#U^?JlH(Kt0m2lf&Tz_@u@Ev z9rm0MYpNC0mW<}aU|N?k?ogPa)2F)Eg3ATNEQ-@BeWD|sg`@ufcc#<9!S=7K{uFr5 z`(zp}tikQt6_N?dXO4@L&;mOidUdaj^ zX88py#)q<>PrV;&VDu-qT7||)1Xm_}T?#`LBU#`-m{;knaH ziO8yJv2q%@7V)NoaeWnpm+NZtqcm+eWI{*q?#2N=_0QaR<_II2SRj(-7`bU;b!7bw zb=2aFo{GIpOnzGaS3Jn%In7!A>kBWMx94Njg2YGw;QCYDFoz9-Yr*9BziArCE#O}? zFYfoh9P}(WAbR4od@1otJ#a}5uNvFTl7&W$lB|cL9=k?(IVbh6J{)h6)vl;R5U=K% zUwcU&vf*6jmL1orhIaC^e{y&H4^ncfN$w9?!ME{ViF2wxi4EEt*z=f4!*S{BUSZ=u zjD8*P{P05@i*U}wOY<1~wH#-W$t3VSjdS+D6uutGt=sBXHlM!9M7sbxrhe%vIl<|X zoOiEIuNCD`lBTPx{M!4~*W!6JxLY`@2T@_=%V%wq`KHsc^tw(73P;R4;-&fA@JGFQ zq<<0oCv@T{^#qDm8tBnq{7-*RmxA1yofDj%p0)GFq4CSZnp|)8 zm@a(93ecomWb?On1xW)3j%%>+SH)c)#qgmJ+*nG(?7>>cd=|0_SDp~$rUP=^e zCfV0hAk6Tvl}t_^QH*zXy8JqM?0V2$&4uT_dsX<44dYFUnHg~B+)5m6@g{{VyA=4+GX_?&W` zTqQRp9qsyeen|R_SB&G1hNp=Wo;z2CYM&dtC1;~r>z3~=%r{RWDxd+>!~t#KoQ|U& zw3go;{1r5I^22cd0KZ(w8E|6bp$Dn@X1HE`mg>E{e)G^-He{XF9#-^yKd+xd)b+g@ z%fuFP>H3@tJ+z~1qi38Pjz$O|j@9}90P)-5=9l3uZrtgPN?%6O2wSXRHUQ63Jv-Of zw;vij6AiGME0(&(3oIx}PG@JSL^FC>o&&r6mMh6)0%`(ad zo@I(KShr7l>h)a?=GqAU(g&F!=nqUD^p>!HX2UhVl10SP0FHW~VV*t6ugNEfPgC}q zcs9M!?W4r8HMG(coTr$WAci1kZ6%k79_dV17ctv1uJPv*tMtz}KVB%%qqBzfB-eb^ zf=Q7bz{`XkO6QFBu8YQZ{u|VVwXcVT$VegyJl7amCTx?qBIGK7Km#VZXIZyoIaB3# zd!C2k{R`n#m)1HZ?d`%!@uNv}jD-x0KIzH8QhH+~XPUR;Ujt8|6E24*+U;IF?C_H1 z1_pN!2g}b=2lcO;Vj*P)09*#ZC)&L;!hdYCch>bAsqEC@5J*{LpO3qo9FI}bysGM? zCC;bvXRArVNhcqfLP>QkKKdE#ZDqZj0NY?wA;IAE{cGKP8)tV5ol94W3yaCEgw3a2 z9jK6#jqX(a^=x54C%>`a?X^!6c!ycFzSINgT0OEL^DUwa8-+Ox*&}fTRXm8UoA~2QG}(<)9y8Ie|0AN zX@12aCPgrxDl$7LCmF^*r_#AMx$#!A^Ld_eCq8R4;K&X?6Vu+k9`|3+;1 zb2XRmXT6MkrG_&i4nl&xy-j9mplZ5h#J(LtzF@&xS5q>gk&;(GDCZo06jR4LU870i zV%@HJRGNmhrYpn-#3Nw-A&;pX8r0Jyw|m&<%Yh3rG$)EG?DH%I_-v+a~+iI zAcja+%$9po4A&dF0ksP<VTKeNU6Dou9Do!aFgn+gYPXlSVFk>)l{i?(L>|MX zH6cT&l(!BcXZ_j}xTw!UamoBEqH7IKV$i_?q(pNhssJB}t>U9h%|=yO#B8;;} zxcl6newC*&vu6V0HrR`ev9=FR4t=Xu<3X0*J@5sW3R#&5#ZZGto_Jf%3lV-qj>K&P zujf{(C$Und(z7{@;uV!b2i?Nws`J*PRFtrgsUtj!*SUru;wxY!D1Kt2IUUVFts4n) zN}~LsRQ$x%rgP4n&20|LR=&8B>qkZg&J;e$YBjydk86&lP;o<#a=fUq4=AUzkrx=>pcnn zdlg+T;ksc-{HB9hIV@Bq){gS9+QHj-MIx;%>a(C~{53T4ya)-?cRw+tJ|3d+P2 zjPBdCj(trgk)<^H)7^Q{TgT@yK`9G@=Zu5Ez~pBjSJD>#D)1(!W;DGT>dwgmznLY{ zVjzFKfNfJ+YQ3+ike9Br^s-d4o44fX);EK9y6%-V)Mu+cmw6$8{?Zk*JUqTz|D2 zGMoXDIr`V1c#p;!&)aTnFE+o*sAGvdxZ`C5AysfbTy5?vFH_fUZgk6gH?V>zS70w} zp=Dw-w7(?huQ=zuMJzo^}$i+rC_8jniJNj1LB)L96Mu*Ad%IXkI0VD+QM;CeS(PI*jCJ)A8~+boNq1j4#7N8d#^P50%{9+cG0YHt-Ye#a$DwQbzo1+)Ro6- z`F_G55NY9jNoel~%dB!n*f=192d^2=wRe6U@dmY^M+UfV78|hJ;z4lHyy!^`uds&$ zAQA%(p7|L#M$EV-ozcuY5sut6E!X)@Ki9 zhD1n-3`dq2kcU4p7-N&qT=Tk5f>!QEywT?umSIe&T$q|!BhEoa+E4?Wo!H~8azhh# z;Vy??u(Ia9=T+hlh}xfr^pv{r?}ek&t=PKTT()N4wEqATC+_zsz`y{5>Byw;H^%Ao zy&mgT@m{erJnbM`1&B$RB*)C(clUV63SY6~rf3fic)CcfZLc)3cN5357}s-Jf`=q3 zN5B{(({p5!O>jOT@VZTDd2-ff+^p)YX<xTMqcAHsn78v z>x-X`o(_*qv$c-?-%EMbT~;e*Q?-xIR4S67ocoj9bt$6w@4|XezPRwyUF+AAlO_Gb zG=eBoB%-2hkopayCjk3b$i52j)|aemG3j~^mo~Ae+a2vE+FCY<4oN7g%2ivhPI%;+ z`fo$f^sfi_eYGzZ>M5sR%bXkqRwbF6e;#L1gYz!{fO$2QYE+@_^<-0<>ttbE>so({ zZfx}_ZDKOYvfO>9VFNdqrHJy9L%m~<1y~iqVVvih@NXID8ja_QW!FB<9m+mR4?D|w zvbii(c*z+g41EVm?d8?{9pYVfGvQ15rq$)yZXZ$q07kTMSnrg`t~|Ka0K{V$?oC?p zhLz$!4JyOo>#GaXyCYZxGz?)-@aJOD4aLNJWjjK@4z7_nQbl zQgMU0)+G{1B-?<@pfsBR;4#KUaoS`t+G!I*;pk_+X{ODwX(JQiasL1; zlyBMJ10z4h*1GTbSAo1WX{y}c3~G_@0UHG&1gPD(WEmgjQaH#p=h}vgsQ4dAGsyBm zbtT5d1MjSRatS@N&l%6_SyY5=XoV>?E3+3=@i&c@{jFvDNR*$r+p@l+7~_*yyhp8k zLGcES1)j46hSN?>#fJz70Zf1$p@wh<0mX7q_|opfP+Q&2aU#C(Wf>%&tyR>#VXW%$ zJ%h@^8D(i&G5k%}b6@~S=rhu?od)g7k>3ioz1hu)T2mrtu;Zs%s_NtAT$AW3V+5HZ zL5CdjI||pc`#D(Gcu5M3=Z~AeHL87sUCaQJ!gn3Ok8B#!lkG0bRAjL3Ii$M3^XA;k zwL*Xt1B36+tyfFdi10}RJ4I(U`Wi#CC6G-4XwJgS0~{Rn>C^m*sA8Dq@t(c&Ru#;H z3~*m3CaXy<)8(UX$51+dkzDQE*&@}ws!E050hNJWzpZ)%S_S<6ABO7lbb4-PnK7J9 z@%+4joMildolT28s>K);&T)Z| zdB=LvomS)TAaK^`=5|125$!D_usf8VJw`ej?)3dOHMLPHl4VvHEJofkJu8Hc+Ge_p zTS%pe7$D#S>GiJfQM}YAv22+9{^th+j)uG62I#Cb z?MGHtM7g{hzyF{{p@l-9^Z{|y1a1$ zN+#J4Vx(Y>y?txgC0pB_Mq6@x!WoiPQ`t}6Bx5-B2enex^=%%?#q2F%Lv&S3%6@Q0 z2H*kXlive@R;A4D%1YZFQ(zTU$nCUNfG#@A=j3E+}p; z9y_8?9PDgyp1nOQv=$crWJ1u#9I`0Ns_?`frL)r+;+?Kjm4@m1MxL@j_j!2>$Au>g zv|~BX91f!uV_5R^omNT3tPz~@6NATJU}^VuI>n9C={F@p0?q&dmpmVoj(HgTD>ub( z+}+KxJbC3rvXwasoP)<;2>cHfl$D){jGJXS^@dvlZe?cMbj3Afbw@&sCN=rx zQMhA_XODWnBXD= z{Mk6~f&P0_=DDY}(#3mQJDG}zT_aQVA6}WwX-%U(=;MiMHm#yj9}pWr;OnBt@|nCwuvH=R{KIR+|rOEUOHnrsco6LE{1iroR&!On9IAa z(4h{(Ye_GhS)noGQhQfk0`Hn$WKDgk4iprB%6UOe+C}0T2+;u&$JLa;L?rx=7 zVoa(KK*mSVgWEMpcPP0voEN2z{&Bk}p~Z5yHZKIk#Q6l|VB_B%YpoVitT!?25flxT zCxQ9<_O5c+k%lC`)5y;s=M_nc$mq2B8b?8Jau@<~c*yITexo|8ZHd|T9DoN-KU(H~ z(o!(xfnYGBI5lXgoJ3i~b8ZmM4gu@=Q&ua7kz_IuQ1vIZF(XoFRE@>5$B~i1KU!6iTWopllGz+~AB8+!2WZ~m zax=+ZhZR>)xr$kF9ylLCO?DZh4xZY8Qd}yo82CD?3PA z%dEYkmDoOGjNp5ZO1|>kM~|J05OB-TdiLp7w+FGar@ovaNak5^H+;}wN<(@R$5B|; z5yWR}xmrT7&4dyYlDrTYkXP%?T(j1rg8JG>;*Eq%rJ0690mz zq=tglL%Cx)EDv$d7|-cf8Cd5iU0OFc)@)#ver>4PZhB+<^s3f&_m{_S%+ADlj0R83 z-~4N#wK1d!_YeX##Vc_^Mb=P+0Q}GLB{O!TDEuazVj<>a(NtrNbgw= zw$Mxj_yZiAWFLHgp0$l6@EO^nICSXXk{g~g-|?%tn~A@BZ8J))Ha#aXnwy9|>mZVA+<&5ZhvwRUL*&LuEz&ql}?Iqot2Y8w(o zJFPnIEwaP0_qO7Nd-e9M>vVS^MNiev-kT#@rGI6Z5h znIwZT$q@^?sKa8CB_gbT>PVuYJ{+t+U*k`mZ_4TN3+hGX29@+G&@kslEqjfy-nuj}@#dKxaE+s-#ARJ?wWzGJtd0`%uU7FlB z;J8tS1J;u2-ZO5+8N9$j9WY0JI_9luE#;JHNhrqz9!IA&g!x{glzO8#OtgQr?U!l< z86~mUpXFWNm##g8Gr=S=+`|0qQS!3_F}&kEV}a{XTFb@TLDsXT&~Nho#K1V7sKFMC89%nB#w+#gpD$SNRW-iLF6dmbKbbQ zd_$<*X|cTW0du&FJC&W4(m-Z79ut*rlbBSDk zcaxRRr&{RzIph6)>q(o*Rq|tY2@5#=*nSIOj#;{U3X#4HMQrHW#oUs~H_x2l?rw)5 zpI)6!X?Rz{T1K6z-s!gu=EWEif}rHO<0?t*oD*GCsn>6ry$*bRTq>mDO=^0Ui?7^x zli~4`RF+6@E$$X8a6sBN5uB0KZ9O}Bp4j*COKYXce`_o^A~pg-!*a!p9?=p8_4XgwP_Ycbskwx1ZRx=p!LrOC#7+h`c9dteY)z}d4h=i zyE{l!sxyOv?sK(9IXy|~ir_SxEm-Pz8f~mMH`gLk(ufhKF++iYxkk~(Njz7ncw*yM z)8%+=^cI%hB9X-v+=5v*%Z!#I8%f4+IRmd0LZ>>h=)#hvsm9p&G8I@Xb;*o#-9*fV zolwVzAO$Qjf=*8y^MhW8;O~YSCYz^Q4NfR;bqo1f5@eLJM5%z~(J;Y*U~t?XnXaS6 zT0pqEgHXTFS87D756DU^>Ukuu-sF+<9@QqhrC#c0OQa2w0Jm7)ozO}=Srv{sEQ>!NSv6^%(PqwDUEJv9s%BXIIiseBbg1riF7wge# zbIAg>Dm2KpvR%&l&funf1+97g2W{SB?o7laL#OlgRmp*1mpfPG0Hv)G8?5y^eh} z3vENqwtY<@oJK+CUI;t6ysnJx6YJ9}rkM2+s51e|RdW zhIa9eoagCV;OfpP#zzig4r@v!trJAn?xmMSh^#Vg^LEPE47}~xo>YV1CnCG{&@a}~ z4H{o1rj2()l39x|<%R|T30EwbLxFRTIKvp<0~CD z-EOpd+qrIcx1S`k54t-j9IrSZO7yAXlovB+ny?a{i5{`yD-RC%ehYmX`%v?)-WZJV z?(+;AhFFe313ZA)KAyFe4~zAUAgbt=QtFm=_yQTDiX5NeD4?-CbvYIDfbmo}HA zo+AS3O)DO|<2gJ<@dCoqHn4vWTHK_POD*H1R>72f*?jWE-~rd$7397o)3uw4tOc&E z1?8=*eoDg=yr|w%{LU1Bp>Qxs;<7CKZQ=_Z0O_YXmfLxfadyF)BPk>_VEn;wcMNrI z^^M_;PeLyv$8{Q9Ew_~_&aL+{2>>8DBOIFNb#*kQhqGsS;LQiXcV_Vn%>0ZgosQ1hJ|T z+0NiTZbvvBYm(G_8R7d`WV_HEH5p;LNZ$9Kl)iEiM$w%9gRN}e==b+_l6a13&9$_p z7BWdJ%aFNXgKFfDUNc^zs|O{@&jzL*a8I3TZGURVV|3P{&dPX_J<bHw*ZS@U9PO+A6F=mb!;w6DRVVE{P=;@qv6{&rt$qke@dMQm`XA-DW8CETZ zC!SPikIJvZsK_pD(&7b)rO0jZk{dh^V5!ePN=+p0Y_H0ZnW$Xqwh^?JaLH+Pev!@c zv3qzFV=J>5KPX-}$2^+iuH?78)gxa$%Pa}z++Y?3*cLb(fIDsE4lAzluBWfvzm=xh z!7iU?7WTQ64Dt7{N#Goe3}^at5Z!4yL#^%6wesSJEp05jSgGfx2@CYBT~!yU>CnS_ zN>)neL#lsd+UQW}_fiRd)=$`+I1)$|fF~ppK2yMME6}I|&>m^-^!+jq^hYE-lA^^aZi=2@46FEaSTp$k?r3!tzqPlwmgSV8 zTThbRHx*~eBRhb`06f+Z#zNLk=F2Rsq}x_KOT^wIg38u5@a>h9w*oKU7?8AU65woC zD}YHkIrqkE#C2^`ReulM>i3XGY_PMvyirEs2ygX{8O8}CBLk*5#c=xey><3UV$t<^ zE}^uMW}YMawJZV0AOd!uag5gq;=dB>z9sPFQM+U#ZNo^#nOKYf8MK=-9ia8?Ly5L&x~%lnE8@l>*3Sb03p& zB7!ghD}r*%$mjek%TjWc$joLU#a)67S=W0d&OQgip3rad0-_iRx`5MRe1w; zPu?ROoMx~ut~INhmJ)Js71}aX6#naA4n1qOnzy|T4qjV(m0ixK#P`r6fWs*#c?a$Qb{A(`L!rH{f8MP4~lu=Ac%VsiI0zVK( zK9!$+;fZZxF~PPu|SoLgxrs6fD`pIG zxg@a!fzXVCYt#HGq+eNU7b|4bK_$b+AZCwq$Uqok2Vu$LwV?^~-bWrjRN+CmmG1R@ zZ$q`Sz1Quhw1RNP2xkN~@=nsAlfr^IIL>k^{2n1ud1)VquU%#NU5rQrIBWu?M_hk& z;QH60c-K=)y&wAvQZU}lWooEcgOy-FE)QIu2X9LGtHYXg>iCuAg6VYmky=D)SPXom z@th2i_jBHsDy*R{RB&Y}SEA=pS)<>dSMZ*rHO#uA*}KIQkc62$jF2%n3N zJOQ3a=ZfK=@YjrO687S4K2o-dWR=b~><1Yf@-yk0&bA_OjnX@?csf-cv-uv~tLk1E z)??LmXx>ZfsmGZVEZa&*PS9Ag<+$v<`Oj+Q^d!`7{5hz{rdfIMTcMKT7U0JiBQ1l1 zcJYupb+0kfb%`X^A(24++a1A|j(dJ}={Ne!w>P&p))ybyw>OcMk~p%F%8h`_jPxVa zoY$Eu?rBOoGkkpqMe?ViqoGG{cL+K{!5zeKzV&SGU{5$Fjlcl8Kt{iDj+G_<0E6tc z8)IaWCg$AgWQ{>rUUwqLE{f4gN`@q0<#1Gwan_;J zwJk|yd99>*R&ZpI2?c=v0B4WsT{Pz=mCqUC9A1O2{u4%IL<%84FwAmfu~1J4-J91n z1pfdE^mru}&3kd@6a^H7+FXEfyP*7Qyt9s7N(gStnVDDj7%jLqd*E^DR6IxF=`^8h zeQqY2;bz+)QTwg90C3r3@185Fwi23;HzGT*nEKOvuB%5Aqx>n+wF{|j?k}#QF-By< z#v7+C(>wvrYV-UX(+0+Z_IU&6oG9ZX2OgaDuBS+vYb&|Ul1s4Y?Rs0SbP@H?)5v3J+)#! z&l1apD$MHKe7FQ~cq5v?pWyr!lH4`j&CA-x4kfoiD(Co15*LqL4lAU*@w4c0N&TB6 zDV`G(xXPARIVw5(zSYdwd`Q);gxMBco z9Aq4GjDyK!fHy7%dG)OcJi&$BN`dl&&{b2p@<7P<7&Qi)wpzEA7??8SEI|2yJ4bRe z!LMxaXN_$1d2a0Wc)?F8t)!L}2=iLp0}QdS963a5S0=6v62aN^!j~jlv?+!WnK}f2Tn}ryi;fJ!q(GohUe6EYxx%k&WSDIMkAB8 zOpJNxHxGWC`PG((eQ>4thyniqEe<~}^{G5l=<6J?%eF@wxIE`Q4O6+hyP9t}u>|vx zkO@A5vrgI-Mh={LZr`cXSlmr*1aMrlA%mFaQ_2(D=xLWK_b=v745acTLy~j;d(<{M zjj*1w?es9?zc0($OGp^L4(@(nuN{tGco2D?>1p9hd4*)l0h$naY9)HihZ;c01((Uba zdBS;f1}N-HG<$GP?l2AwQg`SkmdvrG>Bjoy<(e?^K@&?AvW&9-0JPXVFzfB#rF|5d zPMrQ4wz{6pr_Nm6;eJUr1_Rw2k*0kHELn@Hvayenh&%ZgYhr#;v zvfsxA_1uxhLaDdj+aI2Li~@UAMbp1D)}}R7+V>gnHaf1Ye=eV^#id(XTG{OKnn|}s zypmd0VULxL0SD<@ULd;D?mS0e_qLFEZ8T2F56q=NA1+%boafgSb4c+9f#LlYl_aQtDDy{MtsKH0AK?E25>TS_;cc(E%9xZw|({%ycaIP&zlQuUy)A5$@_(RU;)y- z8dIk@-UkZii?oj4#rGF?)>obvH%9XM?tT9NXR$z51&E9ds#`e6IOnZ#9u@GKw!aPZ z`jCb-PcC1y#=%MXakZBqWO8$i53OrbYzz5KM^I%X)A5ANXqX>B;4LxIAM$^9OJWbRy-!U zZ->Ftb&HR+!Fg@D7%$4)9ft%DP(kO8wajbUKC?CL)LI3@4>3H6!`lvLL%Ch;b(;Vpm6vePY+!{=3)+c=I1Rx!pEvNw_e*_t9jkz5S!Ur~dD&*5F3woi-oT{;~) z)5>cL813hU2GUs+g6E*;f@7P1jGvqDf!8a}amY34#tK@;bBEf!VIt?l-xbF- z#-Xg;T?np+lIj&gz1+K$5_{)vTiL7VpA-CM@XXha*0%9oUD!qTRlaS(Bq2Pu-Ny`2 zjNss!`K!V&plCYPwwb6Ed`M=2=ZvU^RbVjA23j`&1L@YiYRkh1#F~xfo25l!A4*d9 zR_u1gJZ``vCh?4qxZAysd90QeE~h+#Rej!6e8s5vXn2Rj(;XeWndAa;r|$WV+yUHY z`PMe7o+;4$M=jLtEH{u8ec&CA5CP9(IPYIoT=*kG-Fa_wq)njf2^($MnGxi{E41$9 zZeB1r?Vf9pit9(zmF%^+<~K_bNh6Rs1=weEWPG3x%b#j>-L;AxC9bE>*LsD{$rcq2 z8n|^}KJE!4KTvDvPY--P@W+k32Oo^QOB~u(>jdS>0<^lWJBr zn@aH_$J21YBnsjnwY-^uDB;n7-HwEDO0#QJbV3QMHg>w5&xo}6W7G8+8aA`IZRzM- z;GBLRm3ro-Wd@t2>Dr7JYpQ7yk#_LHO0M-)RoxpA^F~>LJmWRu6WQub8$=o9cVK09 zC5gvR(!Gl7|+X`8o^bPT9rC!*z6m`S1yt3dSKCc2>Hh#^I>uHhZHCXYMl=s^Qvh(qnh#lfv?zJMRgU)yVJF?Gh4=)l*24a0Sus$q4Egi;OE}B z2s|_5D-R0|Qr_xFKHW2B6B{EY#b8J$q30dC*R|YyJMmwHb)~Z!hnWQ1ytBip5vV=! zw>z<)=URGo)%~O=!g`IqrE_x>jWj7T2@&CC&+eqjQaJBj6q8WC49z@IAA_pV*~&?*Grp9=3dSXtDh=s&_0(eb`s9g$Wv?W1$*QlaBH!POT4(! zV~Pv3g8J2l`&k@DWDmE?b=`p2-Gh#t8k5GJ4ZD|75?NfuGr?~gNL5-j4&3ei;8T&G zPPNe7-CCV5LbLH*yW8AD6tFzzKbgisL%e5rA+gx5I@EhjF3!quRMq+TSxz6~)X6x^i5c zIAk)1MjJ}xanN!p+LnQ%XmCN|9|`!FPiJt*jSTD~3zWzoKL;5qPB=XGsyF&3m#TP( z-Nk!(dk&PTboSQm9F2xQIZ_T}OpNXv;-d{-G~0d5u~2mp*eAk`KgD_^z98_G#5zUe zk0G?{fuAyVUFeAI%5DJQA8%ef!$SCqx?Eq_9wW4o;*EaHO6^&qJc1CikURDVxFWS6 zzt^s{8;JA^$fB0zzS9E3{U7mm9n=Lm=y0+A1&=oFZMR3nP$YesKo)7`op~?3Z!Cm}E zk59aNJw7;=M3HkC0!WJEJP-kHz440r+g$Lrk>d!2nk~aabg>AdhD7qwSd3u<40GEY zW8S`J@yEh#SHlzA-0NC1LT((Wo)*K%{;RWc9y@ie2O4+0<8#oZPnlUW#^r*~#CpW% zQq~}a+=qz_ZX+yD-6ZE2?bf|xNbnxCK;Ng%w-7VOz6dwLDl(0QT}~97o=+V;>y>YY zup5QcFU8%8pe=`w=G-|M;A1|uYrtMI)ik@?+a|wp1IdP2lgvjOun9d>f%qEP=8DhR zyW63s_I{fe<+;(UWL-Y?_B6WtLdPRq^Ady`SOyB%VUTlypVqww9|ibJQ<>WT09CeB ziV-m;UHd^Fbo|2`y@}?z-ABWgmpZI>i>6xN-MT!=*3h)b=%ep!Rx6MPdhTtlye;F) zSz>E+)8w|dRGN2Xf?3L7>=8QQn3Iv8OmxLmGoEOvxU{>RQo*>&$($a);qMD+5nNpO zM_76O%tq*zAbDIm5RaYdLiq=WMufN|;uYs{s^I7+ph z7`=Zpy=C&`yq(P}oi^6m^44ue88sV8;(Y9wJRy!i4WF495ziG)O)JB2yf$&iXJEHH z$j>WFl^h%}-L!Y@Ye4!zUd*abACSpkDZPDK$v-Si?p^ zWs)-^vOfVBZEgrY)z^g0YGPcRoxby)SQt`CBzH-s_-{&OvC(Dwd~yxqHkDd3=g_kB zHOJ~74)yD;UN_N^qGxpyLihn)xxzMZ>*ZY~SRWNnYM`G*T4A{;Fd95u+$9gu6aN19X^pulu+GQC7ao~_nNgm|YiLPUYOQ|ocA$B&~ z?VYw9@tw}Z9Al>guX^VEL*qLOoeJLJ6%Mg)C{&GL#6|#yLA!=vYXn z&2x7{@V&;Vb}qH~qPW@1!{&deLN_VkZ7fGYo;%Y;)#jmZb!p*02_Z1!9jgqp@ zC`>Q}1BTpvbI;>kIE+l`E^3QUU(p?rqZ#QF$F%PPc(+#7t>RWgEzVqS1c=8ZoB%)o z4o)#l@sGma6X^PjMCfIehz%O>!vj2lP*`~DQqeWpFNAjtuI32iCu?~JUvN1V2TkY&)iKLOK~pXM&=uj z-N;;gzL~5)wBcSii@&3>y23hc%;KZglUG|^KTNUy&eIZ66qhg(ts^cn#GWuZk&ni< z55xP-Pg1y_!|N`r!=0`2FhyP)c*5ikyw_~n3q#16=P9}kQVEE=ufmMOPIUt_I@G2c^Nh(guUcZ<|ov!Dp z;XV`bexs&bT-l@rV0Vt*QzYUj)mgdTNI4v5j(}IAOX6RKYVxj%w>FB+7&9!fA_)&% zBaFy{sOer+;)@%95$OK_+M-y_u(CvrZwLWo5@d7(heOvrbH!s#Wv1z|c^Zqyd#E-O zYDu{vTz|9om}l1lx@uvm)wH!w%lg#9HL6BUA4B+;#orHgG_lci-9|f$q5{u#JZ>VB zx6G^ePo^qsM$k1~T|5tGp<3#sL>4=Qh{PZOjq(;BG>4x2X1;2=)AW5ePm58txbv>( zX3TpCSe1Glo(Vbnj8?V1?ycebYkRv5QKXXbNh@tDBSZefk%N=h(xRSI2-?za-=E0S z>$2IS=zkV?L&J8y47i354_~FlmD7Eq{4*?3s-3tA)2SUvJuAd-{4wO45REjjPB(;6 zwT^mcuWHG$_=Vyt3Cmq-7grYVAbX2>C1**%AnkBT$T-2TR*&PZm#y5#F0G|oTS>f! zNL7+HM{d|ZDNs%@F@ObhMir>W%U_@QnaWh=_0Xkx2AAc*Wi_mE2$T)E+W6y=PjgsW zufxmzQf%nPB!Sz9k?;T@6VsD}Ry<@pAs(|M#d!BN$Cz3(&^QbMC$8Ry9+kq&@efgo zebovBpkF3+tNoF9zwy zS`8h<7Us}M1Iido!_$nME;-K`;8)KY=BcdelC0N~ox~P6<35=kD`UaB&ZnYYe`wjW zkKrhO;~wCH#c5hR(en%=anqso9>1da7f-j2)+^y2s(;amyG^jWo<}k86+!1CBRy-& zuY4n|v{Nd5k)LUa{DJ0-XE|5pc^$$0YaaUV?bpyxugf8@%S>&fj5GV4*%&N)@mW?H z*|;}RS=}~|YDU0hV$p;>OJPqq;9yoX<0zw|QjDIbFRAE_q*}Ow>fPm)LX}5WU=LN} zkJQ%$EhUCfW;p{K5OMg|s!QOeyuDkE9_|bKc0asm%Pz(B+Q1Q-)o%v9gb#D6*~@uq zcOn=FS3;LSn?dxdDx2`nL%u{PiLJu4nP2J(3p7DtJ2S((Pw3;jpZlw}mO8oTIR zVX13Zaoj!1$nq+wEBqjEG5{6d_)}Sj!dj7!#9DQ>qh~B;Cd!S&(Ss@62=vcA^Ily& zl(4kYY3|a+5aIUV9D8$$wPd$b!!^Xi%!(xi#&LuFXp&M*Fi(}AR`@T(_L}t952fiB zUuO{r?m}L)Z}VY8`K-#QyG95+0n?>%Ullc>91r2G15a%?O0i{845=BMJ_#(-p<^M)#E1phx#d?!`O11F@hID(|SZ*egJ*-+G z5sf4Jo?8Mz89#L5xm_+vCbc%_=T>Kj=;W>3erX{I0mregq-?$-*yvhp5bFsvm-gc} z>LZEZb&u`_b|ip!$qWAg*7@G<+I=2Go=8~7C)_SLFn;kmsZr&@8BHA1eHPrOl zc{@NOJl6csg_APmoTH;W^4Czjfh3ON7$sscmI0fe_PM8N7O$yF&?+P-%yT@uiYI<{ z0)I;M-5|2z)p03&8ndSlLRLW_%J*DO?uE zzi>L5bvT1T9><_=f}f-B4>#$qG+Ly8>C>$i`P5Y1COB3 zJXfY$cwbS_8Vz$%)6K+}U`GSGfdm7BWGMM(;N)dMuW%L`o{1zf-`z4<+lFBTdri&E z&cG6;LaI_V!Olr7z~`n3yYThI%{=nz15mnYBx_rz3%ylIRw&{?-8cb9Jm=L;yOxpI z&W#RVd7d|^>iXE#<-d~7dF`SC-ftpj7V{irZY#!1WR)2DcdtqCmZvV0G`E_*zYdio zl8BFX4t{L6IOKDh;XG5~?-N=0p3d&-IHS|zWcxL|kd=-|*Me7i ztC5Z}RegXQRn0?7(Y5>Ad-yHlwpJnDJ9#|D;F9~%asfCz4&7>ND??OOC(SL-Lh+A{ zd~2%e7n*;EFYH)cI)^qlLFC-|ASrFTjt4|uI#-WbcoEuU)OF7gTiUUd$gxPwtjwq8 z1hBwzJ9Eu*8jZfDd`l(%g#ogHC*G0}%N%Q*2jmhxdRIe#eIME3mixta65XV7D!77q z9e0tCTgu4kj+nsr=4mwxa{fisgKJYh&&7J)kk^`jf^KeY?e1pzBewqlTBwbX&f}fU z$v8iybGoJ1iZw^M`+V0^N@d@1CBqU}4gevJI@fLBeREIJk)_m%Niw4)oKPm++z=he z10y}Ll06SKp`_^Ap0PihduVP9*+nuqguLH)VSeFUb=+&IOIz5&RO4fowD3=eZz9v< zOLmQKhUnN1Up;p1&Q3Yvu6UPD*7QAl&eHWs)*D#%BV4zTV^%wHjl`01leAZ`-uRZ_ zTtTAvddl8Q^}@Z~!>5yL8mMB*#N;ZB=O-S$g?!cH>-W?=PjI#}uAoR*(pW~+J2*Q> zI2>p7spf6!Wld|L?NIppQ1GM{mO4G1j=8Aa1}$|Xt;77^F$ozTE_;>)8vUazmlo5Vs{r9id&|NV~xKkM}`10OKc|de;Sdii}*=?DXkURV0%(ejUfB>9Tl+*&SoC zYi3#QW{pX=ToLyRa#_Ar9GvrmisC#!;D7C#`1Olh%RM(swz*`I=Hbbib>PDIf*j*dLZT&yLSA@g1AQbuTfJMhP6Cypmv$gmwoVd9N+I)Mk?G zPb{q@uEm{?B(d*aqu^}--`@F4D_h;6Qvo2Z%;zP60API=EgI#%|93?gf5IHEpm(QlR5axi}A?Z$cUTK+B6wXYE0 zPpVm;GwgwF<#^QXD!5Q_la1b)>UgEHv%I#@kM@Ik{DA366emrg^4H(#a`@ zCB|`(&ROMf5{IoRrc?g%*d z%||G=lI2+xk&F_@u0}Iiy^Ug#o=Uu=lZ7Lo<0OCe>eiiY4b{Q(U&>IY1-*Yd%)9;5 zl!)$5=ifB|^Voo=X+MChP4qUIyryvza}#jG*V?)S)IQlOLZ@}a@s)XUa(|1S-FpFC zv^I|-?ccNpIRxXHu^pVYt>!B+1Cl}Y{{R|Ku_-3Yy0y32+CMT)?I+39mK$&gHBqc( zYj$ASRV{&@c&?5;JMFq*zqyrCOyLGbTL&DR_Q$4b1kR5ueOY<$Ekx=p+l1E~7fL;a_7=B?G-1?}xv1&zj0_6(?Od-bfF4Q|pn zAN6|{YGo6)n4oD8fA@yyQ6~LOOe46$&KHRdG*C-E8kJ*^*D=dMo6wD zlH*{Nn7RTuQhCQdo|WmE9D0VeXASn6WXWQ;Y+K8P0v+TYdSGOB$*($!ASU}g%lXnx zC`Sr+vmV$r=tEA_Y_uz#A^dtms}(zul&9Swj-2z;^{c*w+UKI^#U#|Bmhxzl-|W*$uOQA?AO7 z;1jeA9=!WkQE#BLL2n|oYdyiq-f}aZ21Y`W)Q*(fH%#Usnp66*qD##bgVpn-18E*LNjGEbzVS6{zg|Kr97fDo-fRoDtJ5g~s zrfljrS_O`SXqNLUTtCk$lbFL1fJYezwkypw8H+f$5(nok+d1#}*42%bz0r`}Osygk zpJyPGf)6sa7I0L6@rFipyWgzoQ2-twR z`@}x~9wkGoJ z{?tlE3hrX0XO3&Ei&}!l^~Rqn!X<5v%A|Yu`qRC%Ms2mJ=hE2Ryo)T+nAOkAo`(d2 zN8{;QZUUilr*RzPr`DgT%FTAfNbiC`$pjEjVcRuDBxhZvwtNEIN-5GL~btZWqa+9>@IOq<4opc9WEoB9y5vVbs zR(1z0PJ7k^s-h`jv}Bx<$E`+u-9qJ31DMc^ohw1U7kDJA9{{Ri;aOYcyLq!^Y|iz~g$j>^UbM_!Wre&MBGD za&UJJzftS?(55D=7UFm=_S#6%Hg|4Qx195kdi^n0B!*chmP?rcZlTq2xciPOym0yQ zA1rf@PC)DY>H3tWI7&&l7sd{MPW4>+m2#A_iIB%CZ!3VT3W5jF@_!1%FbJmwbC7X^ z!+s*QY`i_M-$O0!jib*L8+^imk^vkX4o^;?R(zsJh-clrvHQU1k5N||v3e#B4|A^5 zn&Q=bs8ef5ys^#-pMHd6y=km2hsz~^$s3pM=iGn#s|v>Adtgh+w!OO9*2Wif_Ws1 zazD&l9Zw%${{U55ig(;$yiL*M5&_0=eQIPlz}bTS1y@FV$fq0tG7qTs_NZ=kH@Ah} z6Tw{I{{TZ+SIZCDUG0;~LyfDuk)GK#2;ah7v0r*zehV8DenWqF|AYTpg?hDip zQ`;2{B9b)YfmnZ~T?itO5gTVCBdVWHYG}0Omf|z!0#pN(Jx8(4Qq&=i=(LiLE9TD3 z@;|p?NeBR;$Ru|Z<0RwmvYc9Fhh>--k-#U@oFC^@)HHv0?`{AS z)0&@AoJ!_Widma4v;my`F-*4o=n?0GfHT1cg?^%L#_jc+TBu33J8cb^*f>-E_pL)| zJE`)VNhdB-_8t?PX|?LfVza*7)b-xW9L%;i_Hp9Hf-A&x0q zYm5~H?K$-w>uSzxyIB?u9u%5W^O-S#p1#BR3e37&dkCYtW?3YWnM#3-H&0%IrPFWa zx3iYrj0p}|+i}CbKRldt9X+#M6l$ou+~=sdv`1IsO?u|?!G*?}M7yI#n|9`WaK(tu zKpc*gv7ZZgGQvyySmyrGypL>C88RXxt02ZX>D<>Ns9#5~ED7eytpjE_z{F#_6OKtd zbH)W_UfR9=(yiRhwlENaaxg!-IK^~N8_^uG!9{M5|I_@wi%`6Vbzz4p*&DKXu7_6f zuD7U191QOqC;$OlgO1gUWotI0G?7`y=1P0;0Q!<}D(;)4CFSSX%#AFljKvjjpr|B` z!#Vt`(4#m;JgDTv({i6P=ulZ@mHhc7ZSF#W$2t0nzvU>ujy7+!2-QaS8CGv$?bGnB ztuI1L)s3xKsfd9gb;8DT$;mwNT_=k43oSA@mevVofdZeju|K_RWbGY=IZ{tpoYg1x zWQ<#+(yZ-%*Kc*?+(^D#Td4V%oME{=3FByaccURxU_~?W4C3NQ!4q39BO*I5C>kISEw(FG)*!IVU47i%-hI*1NF}X z923qv)YGSDc{3`!&OEV=&Q{07+SKA^b2HB}m6B&HWOi@8l6%*wd^W%E=ZA|gifqK< zNm5k#0}@l8ob|vU5G&43sd06fw8#|%ibwPZsAY8%cF5_hv_9aQ_(eK*D0X|tEkU$em< znC&rdEz};$PI<=z*Vevd(XX|MLQimRCym?6ATYpV&>sCgabB0Mc&f_oG}B%foP>)D zZy9%13$!bYuq1Pn$2HLmTwG5p7lm+|iRn>m8U_B8HI-+$mMd8$`!1y`1a)2kP@^sF z^8u6VUVgXs-XxRv+GJMk6fHNK7yvUI1&w#~!94P7p0V(*v*Jjmw6wCinA`s57f9Wj zCCPBEst#6Ub`Fd+JlM^2Qbh`TvyQjOiWJ#WGK zhl;#8V}E4{`x=8?(UAwky@O z%iR_?wzRiqg_1bro2YycAK<>aCWR>W83c1<47fG~~k;~tBGXB=a37Ohc zFxztFGJa#zjNwN?o_*_#8Y;^@y`*qqR63AHRvGF#{x$1*_lNHMQXcg#E-kIB;dT%p zBOx+RCj)nUpTfMV_s2RXhd$1?t#bEqL<-9g1S|B%Ba_EomFHBI8cy?RA3=kSTJUj( ztn63GhS}}(%{o(h?qO?Sn^rVrE5CE+sqI*r--op*A(F`~Uw6wR1DMLF10*V)q!Zls zt~X5hqpROs-CbVXNVbW!)-sXHGfGbdnTr1a-#q^SjVqm3T$fS0m2R5;>gFe2WOkM` za5&nm6EGrdg)UD;}WCAxwJo*1mH$CosdI;lh%CjelQPZ{f) zr>uNP)a_$BUYKHv2*HIBPU6Zq1fJ*9J*$e;wJWHsr_<9-V*U1rQtyqlV$yf@9hS7kCF9Pki;No#PvvUf!FZD)TtM z59vSJmlrWc@;rfBWR)_Ywnp!ljz7Y?X=Bx9zq7HJ%Vnl0WczX_n)`WXZriW{`U>E! zZnX@Z4#nbka zx%8KYejoUKXVf+O>zmC-!}jW_1?9HUb8{&9ND&B6=p)IY-T(bp7A7_oD z%V6{h*gHpajAt0FJuAhYBk;UGWJ%fx?l!dIPnK3v2i_x`9OJHWT`!6JEd`D1>C@c@ znj#Z6=eRtQFvv+lT66r09f?`$4P%+6EBjzKauX6Afsi;4Nd_!-qMd!pK-3*(E5vz~CgZr{apbkM*EuJ~YUtaanc$Z4?4c)8QUE8gtq8Q1*%MoZzD zgr_4Lcn2Vyd-ctEpNc*yPowJ4=-P56-0?+3XK)(BF z)5^q=$O9k@`6qxt$;NZfpcSR6_5-4GsMQ9!}cQ7r}9ga_a!n~hJ()3S=l25AYI;46$ z77)hQ8}T8Li(?2`m!78|g?Riro{GO~x0g)wB9)6qqGu9D*ucwRycT< z6M3<-!esMy@Vp+F1Ez7!NZu^7@XgbmRyWm}XLS-rC4C<6#5b1q`fSBw zx3#jCW-{E#@)=)yH^_1GV1O}RrWL5il=5-TrCBM*V>zsK$R5_}OVMta4$%S%=g^EF zlrOe3T{fkoTWXp_GU>4-cT+a>lVYn%0+uHkB!D_q%fqAU_I8$K_{JIyq&AP*+l zPzH-2;Hm+U#~kCSuBT43@V<{>Z+B^SCb&y*8z*>8pD)YD8;a!SyIf+`gAW>%{o~JC z%1ec_midZ0f*a*511RBf*ql=Mqg>WBIBazb7}^*Ly}VBzLoAFiSd)>QkJpOzJB??; zHi!E{Tc%`_Xqqrbn3y9t2X1rE;at~>tt|DqQpVc;NpzP+y|PDO6&yC+KqY=q4o)k0 zQd`)=7m0IRjPh>`MdA+=>a*##H!+PuSPGaf5AK*oe9pY*Bn|*R{AQivPY7$4vD@nQ z_GM)eMI%EW%p5QT9E_isbno;v&MQx%YVvA&9nab%gq9(GU{*u0^~X%&y=TJ@c^lg6 zdfuYZ!Y>Gx)xK1k;l>p^{IRJR^yiA^sfUc`c@ajdr%m#^BQE;aSC)BhF6<_2kg-WT z$agBFia>1Of=~`lF_G7;QB6)ucDg<$aV@3bQ*Ls?NcLo&I0rokQC)9{^)DEBi(0&r z*5NG?CrF+fc3_@TU?%bgc93(^l4^y;o{3{<+NQTN-rq7b0@gGvP@k80Bw!7^jE?oo ziKS&?usExG&7L5>3cZ^3Wzphk5>2w4Fd*(Z1Nv6xyDp2aUTHdXG02m`j*^Hls(~Bk z=cYJf4tTDX*Gc}$wSwlyP-xdsDYwmHqCKo~zbN>ABEaRGn{1Cf8eXdu+&=fR=E*9p+9Gkjqwnxw`k6Kj+}jHZ8GCk zm8DB2^6pq=)o_>uo(6aT0u|$grkt;f-(sN z9zR;=XYtOdeWyhY^s-#IoV2nr-yjWz10>`O@_!2LwNDShbzx~0?BX$M9b*cGq$8*V zf^*l5;0$)JG1W8+;E=%#V9M^#!T@$5%9x7A{nNoJb}8BX>> zpoScG=OUq*H8x2S-C5w>hAi0%4@`E&bXrKavV`X2oIS3PNIaeJvL zU9pxWRAZ>^pRId!zJYUfry1q_(OiwLK_m{D^!)3d@WzIkzld$Dqk=#slVEd|-Heh{ zA8%UnF_h%wne-T3ML%ZJdlYpTwaq`mH}PFuVi=)lWQ#am%vC_^^AZ3x;c!HxoR9z& z^q0pSJ4^8Gy_S_}bSAr%74C#&G6oqVk;o^|^Itl`5S)zX(zt8cyLLM8FPfh^>O09y zU;|2RLoifQS%?GF^zB**v8WEi_>bKo}FtnuI!Gf$woZP z)Plm>Ow%n%Q@?98qo^g1`RP_aw1uCR(n{=(rJ6MuQm5Ou73$Gwx< zgpxqU3iFZv$*nDK!MZx>*0=Fq!jZZaPIjHhGmZ(*UMr&T--oX+bosQcHDdE%iz;OV z??OvC+&BlfKT7BPnKb=!-pcO5%A}ztj45dF!&+chp*oVAyQW7L%_ zZL#MTJ6Puo4tfL6YUb{IFRDbCMP`T=0FRkT7|uU2UgN08X%wc$X+N{4y_+_&%BD2K z5zhALG1s}`yVtSsZjp5y_V#OYdlI~BAR(>(VU6BVAPzYnH+ttuUsiQGvP(pKgQx1# zX%opD@cCzLs%OD($yO@r9X1MPS*lCuFaiuoNL$EC)5)r`rrwlmY);`%q=xOms zQc1OoU0!)km2Ce2WSzGyu;-AyaG(Hs^y8Y~tTda`tu>b4EU6`BEwxu1GY z0y%|*hRX6Yg;=;&L&E?;@9kVJn`I-U*Y}=t#N`x8$WTu_`sbx7%KDcTq4b4~j-%oq z4jAIKOY6H#NYW!@uavEZ0FT}b6Orv$9yRcFjji3im4S|SwbGJdb!{HicVXr>Mmqe& z;GF*eD)oPbdPbq9=(m^COXUSH1qz`4?1?uMo(_IeIq6T=uRK8=?AA8+vE9XZkk93% zxl-W?QWG4I03TkJrWH;PO^$l0N%@`vmbx?OmLJ*Hg*7`#C5dho3Y&y=2luPUf14q3 zf(I41;MLS0OqcsADXv`^zSC|tn6?QMYmmeR=L0qEI%kKp9ZN;Ixq?V+uSqv6XDlV8 z^AL=rYQum@Ip(}O#Cl|!ZmX>S0AbxCvjj3)CIbB1U6cZN!Ou+Bby@OmVF>eVcNX`u zc#}<%Ibnd_S;jnw9YQyky}m^NfN*|Xa%-_&dr7yw)1|nzg4+2Y++$Ohk=KAuNdSxi zjySFtz*n$pw{U59c8g)D+gh~oyD=u{Me_sz@DAML)Z)Aw#Sh|LJ6{^kqO(Brxp)Ms zS9C=1R3G6r#a2%DfzeJEe6l`?(Da!+d*Ykaj^=$9Td9)^0`NKc@;!$wA*C2l1S3+qVkQxNb8n;tM?U# z7w+xnt$efNJJ@wQ&+TnC5gN-Ob^|{n925DP!;{7O!O^7AOX3-261!yNg&!*8I0Gb; z>P=tPd1N@@IhEPF3Uhk zBD{D7>=wq_XfGrAZec(^Pcd@BOl}`A=OFXaz6#U4QQ|wu?X>%QheK<%Qbl428@DK9 z{>jcgE781dsz_YkO?ws1^T;Q;!C~h!0n{9fjCTBMsu;C2b5922D>K==TjGsLwJ9{K zxmxl&rOual9Z?gNB^=;_W86VseAlOVM&`yCqS7^sTZ_9*RV0MoTVNPkESDv+L0mR6 zdSgC@ycM)d74X%Eh~i83B_q+dTp~i!rF&|ET(-L_7+V_(pgJwJ62q%^1=JVuT!*sHH~zZ9v<l3f;Io9@+M+ZFj+%m;5FTs9IUxT-sg62{551Afp+`2Y?4Y)z?_~ z6HnDNTTukD>ORUh+y$L90SdqCIBT*4JBWlVFp@YZ|nr zTgwt`AQ0UN$2|ph`aZRLCY3Iyrxczj-R<7SR1LLfT%nD*Y=hGtp7q6Q{tWR2#1OKX zp^_^(o#S9wuxVQu3!j^j!Rv~}@b~ESGZ`0 z%#tocKN%x9$34Y*t*3}JI~_qhN#PrqMwO}<{OeNqXysyj-`(`ucKh@ARb5k2@Y?Dv zWhLMCHO8(swZTHsugnhR&-ahY06b*osm)VXk)54KpuP;$;rNZC4-H)jE+?{$mfHA{ z8>RtMyq~-Pg(r>0xL~Is5^zOtcrCsbYtq}>X&QyI+-rEWxJlz7V7!AH zNOAJz@wHfFF~=P7FBu4R)6tp72`2o`TjF++pm>T+GW)`}x`}&BCB82y43WbbVJ95z zWMyN|P=79?!x|2et#}7YeMa_sIj(OKK|E81EtV*)BJL%AW(4#nIj#>~u)fl?jYmk; zBm&CD=-OM{1@g=>p3U9XMJ>D><2-f6Po#J+!*~7_TZ=to$+(t6B!kXV3WQzpkTPWI z4l+6d25Y8Ro>-x7udjJgM3&V5sBN;~B{MbHQ2b zQ_JAEa9hE5%I(>s-cXN!m@ai3t0- z02W+h+M92SunzUE%U0tP`D=A~jH-I>^^G>v}?N2F?2 zmpTuKrZZv*XBJ=>TwQVlLU2ZN_lFq+0Lwr$zrA%Mz?yxHrIx*PH`nCR|x?Rfz zwM$f#`L4>Uz{pujy0AG`2OgDN-BTi@E^%Hg@WsS(>6+b*;f*DQE*?gVq?^V-VjCIU zbI2#2wRcbPABcXzBp0CBL#wk#JI63E%LAh*X(Jyl<$vPp21xg}CFGtYjSaS|45k}% zr^O4bd!>#y%5KP0mE1=Dqzscrn2)GwDd7EP%%rxLMK0!-iDS1siDP^X$}#sccLIHD z8M!B}#!-#*dxYyfmdlp1I@}s$L1%P~xQ<05=3=}q0-n9HMS8b`JZoX%IJE1XM@zGw zEh*L;t4Z6;Zzz85H@B3Wx&V1zss~!|pAcx?Ch%p<8rO$4h_yX2aS~5v`z4wde6&+U zNH`quc^uXarLME#{{TAcOSy#UmltwNEtzkcB=ayB07<|H?+jq(x+0XJqZ^L8qwOoN z5qKiYSeHs9Y>G&PPR;j8O=ON+E*oHHP46;u$T zaKXlMYvV0*O7Ui`b$6k`Ey7#6?p^Zv$-OxSH(r5<1ox=?4K4SF>{<^RYSP=oeJs&h z$P?`*(&iimc@@8b{$;>E=cWpcHG8RF$mE=7+va`I72cPmX%@|Fk{P86-gK_AASZ>{ z<>#IcUZd$--)*?@9+l>6lUUqJk}OeKvMi_>GJM4j0SBi+n)#M*6P*f4?GnbsT-w>} z)B%69$$F|lB_j+&Zd27;KHQ4Z@Kwdl=Y;3id>yKW3h|#U?__-u9)k{t zqTe46Tcw4anI;>FqccX570)bA3iH_XuZ8aZ5PU`PUyU^#MtxEgidnqmnmHK8>fHh; z>4C-#bW;A(UM#<}eIvxS(v244Wb-4om?Vy9}Dhj!&xoSwqIPb#O0g=u2z!8`eV{z;ytNTn4RonD_XPY$+^@h<6YZ=1`G zJHZ<52ftIjv(z1+eJh36{tAt2SGb!=@lB$$DHGev8-|c5#_hPl81MMk)X%8dUul-m z-%I9$#IKSjF1R`14HoK!X0p#{U3Oj%!=kedW4Z-JLl=Mp8tut};$hfxsPsp_@ z55*oQyN|+JE~R3RC)rKRG0KT7YtRzIYKA1S$?sTyY)25?I#rTueT|hT9eGXPh<_41 zA)t$24u5A_T$y7@FU_2U^dxy^Rvus{?-9?ZdhmPS9O>F7p#=UP(yixNVHo>#erQvY z2~{TqoM$IB>>6*w4-MVu(ph-k@ms{_3m8IFC>h9=@KukvIpe)?Qg}N1PrjQ|)F4~i zZ9R+@@j)7lrZ9&fG1@!kwV{i{C2nUY_&-CXVC&m!CUhPa(6oI***sgRX>ldVlnu6$ zD1l6XfMi17F5X*?K9$#6of_iK+eX*5TS?%)XWmwEh}|DCk1aAk;6&pUrK5a2@eG9J97@hX`I!V@@OdMz6_=)X z4^Qz0-PW6=>+5Lf?(J!Cj<2*R8nBbZkZQ?g8$~S1yUK$g zpWW^xlIxy;S8d`y6Zkt%*DO3irs>b7T;E3=cg9;^wK0cq#`kG3H|HUON(ojB8#OTW1A4;gst#+Ldfli{6HTsP~Zyoqe6xMYcNv6hekTw#7t zNx-gh%i`yYt?jODuWnl7?O`({rM%D({JR_wK;szciuPX?dbrxBOeqN&ie*6P-? z-To&l@^a8d6yCuRg-WYcGeqJjsZJHezkW_@vn{iBdAHE>K;r# zCd2la)yzvKK3Lg-*tj{s$Gv$DiK@w^d2w;KfvqIk9yVAH74;5`M=iXWod{n zAs7TG1As6ykIdJhQj8nrvT^-Lh3$6rJrhgUuRK$&+-dsmuWh5n8j~D}Y=Io9&RoWw z{ZAF>>+t8o_M$tBHeE$-ZQ9{3qjf2?92V<^8T^Q^6Y&24i##vko5}7UOE>VfyW0q) zlVdjSk_N+I_r@!VyVUm0w@j8*iIj1Yqz2`agU}rPde>|zNu;5n$ty+QbK1Od;eQ9| z+EPj3opE(Jp>P@piK17GH9=WRbl0_@Lf<;(djGs*L(zXVl;ZvshmU_!Wa4^10 zBYBczl5n|DGt({CwIumWr5noShnGc))!y~I%f$InA99TQg+0Et>)s00JSCynrmZ%p z)=uS6+Id3cJ1X+Pec`-m#~nEUlh(T*2>dee+*(pkG;?aYw&k494a(cvB7idzGXNdB z?tI~Ucdk2I(Y3Dv>TRm|4?TgEU7&2uZq1TZGb?2CoE|Hl6Nfh*o7 zYCjVAlHXj@U~5Yoi#3-oaJEWWdSHcP(?0dU8Fc&QT{A;=v5|JC+1&l-8OuoL7;K%O zV*@>F3{0gfH>JO=P4MX?*7rTZJO}X7`%sndwU4svSZO0qF+xco=K&W7wg}Hp&b;$m z@E?dHZ#o$8^Q&jbaLN>%e5CTBhdlJ@n&mD0Lv`VM=;D`6wimFFQc;OWZ1Qutmn3(t z<{uR5dbX|oqK=nW^Z6j6oT@5q2P?=p9CpdBNL7;SbD`5)9(N~%ue>B7xz!{plQA1M z7mq!|ecb2JR&!~(LW_wnWP4a-JCR^fhGU+@@I5-$(%vSE!(KemCxcMDlGjp>Lc-YK zq)fdTSYRFJsBV4h;?EGYk=-z9Unmoji=wJ{eLQaa@%RfOKW?;s|XCrIo~G(0D+D==i0f5H9MnhAc%;fRly1|l6sPP zB%l8PRx3N_%LBso&2*=BPa}@!cdR|l&BM$lOXMIk$iKu}o`mEP)2C{{{@rL5EaJC_ zAYxgzlIPSDnoTbKtxzK6vT{%;#yfSc!VM!s)ozyV8I7WV%G zlsTWeXlSqDVWqX^v1ccp8yqUg6&##ka0`0prxm$j@hHj5OOmr@Isn=)I(jmrf%`Hwq6>(e}Tu4>-y-&WQf=@x=5#PB6M zB2mi_So4AFQk-Pn^+9Pxc4ggH#roHY^|!j!h*27ZG3SKB>T2C=1R{{Y#x&{?t)S-i_=9Uk{NuIbDfcZpntR9<;dyZy>t48zo=^=Mf}oA7w$)& zl}E4~3f>CFQe6pOR=v5EZYP94<&0 z&ls&LO*Ly7Q>Nm}T8G5X5o(%*-`W>4y_}>267oO`i~}a(KDn+|=F&MI&9lM@6uuh{ z*gxLSe}1&f%`QlxYn4|>By7j#U@=qEJwHm*w6uuEBKtR;GldbbVxdXyeQ{Z4AWM6v{8phuQtfD{r7G4vTGs%mz38bd{= zUcw`orhKLtk#`;od!K&QGK5m)j^^~;-Oo_I_=|UA;ko=fr(SK2ITXfGHu=fG0ftEZ z+Kvw=lU_%8d3C5rfMA`tRlwT5!!(d-7x&XOy_i`Y6U=qoGtXcKdE>QocD^6ARd(|p zNmL9(2O#xh?TX~3hJ_o+9TTeLtZ+#bklw1hY-MlAkN&-SUV*CKT!pP1rO`fOW zDJAgUiK*V|GTXhpvK^MPC}TXxFr@k-GluKQ1Jj6~#yYo%d^K~YYLh~md~)Oji55nc zvz8By*ugm&$2}{RvTHq0Pzfk$E!~(hA;1jTE017tpJ7=#-kBbX*A`}6vXJ|E11-+b z4?GU0w1aLsnK&!za}RMMO%!oC@{x}n@J&e4EVnPP;aK2+-8l8=Dr*Zhxl=OWu;*?$ z81Geovz9lJZWyU!!9kD@(zQ)DW(qDl8d|-UpJDbzOTV=>%qB;}Z)o3p4UdpHzyxDF z5m?jPn{d8lfD$qkbBy$>)^^%931D0%6*L?ex_^f zEOLHsFnaS>^tcjxksR(KTobv69^BMx97yMA#S_o2buahZ>46~uGHZ3Ual2qSY7oGHfad-_$4X;RAU+iCksoT(t^BpiR7)|R0! zlMHKS<~6}MARPWbTITHG)Gj27(s-3ZZ*MfN7?;3Yw^9b&4@{a~%_Va;E3%HFEvyBr z#|UZm?s-pEZgPKGic9G3><+3lxk?f3ajurz0l$2?=bVRd6NoTnuhLfKyT?N1nqRxABF!%aj~;Yy(!U ztgaqriX}0amvC1fF$bq^_1{HhWe%wJ^13W%9OLgX?0%KsT6k{K5=$>T&W|ceuVYw*0YvfO4jO2IiO`?co;poJo;k2 zZ^n?`X&O{FFdraXuE0@?D>7pw5<0NS{Cig`r(4T5iw}s_<{5-eW11IiI+AcOI=3HAXD*jFvG11dA38X>$?7tC{VIe$Bh?|_9lWlwvD&~7l&@SLQC`2NcyMb; z_KS(uCUn~jF=3K+$l#JjKLe6`S3N$TZni67b!ru$clnfT9QuyuuDkb=-5upszx+*6r=IyNCiN^-!R6$RlYv z9S9ur*17m@jl+2wdOIr@EILUI2hy~Zl=3kXf?i<DM8K% zKjTd>=I&%!E?MlMRY>Pt5u9<@lj*R9u#M8;r)H-rZSS3Whk{$sTter%|2@|x;RN;SrNMucn7EzP~1&uys1269S(g6uCD7! zDI{#t6?PmC?_;%A)GeSe?O>&cQZvc+HCGu{X@1dT5r_k{WZ?SJ+Sp#t3rbT6xWP4N zPY_w#d9q~W;Rk$o^r`Lj2%19_z=dVuPH~g;;+4R!bppWZkiPZwT@yA0;2}5pANA&iqOhplJNA9vhvBB;!pZ>LMTJL07 z?M??HAa?$Bh~#e!2g+Nwt!!Aju31#%<37Tan60U&V+F3_ECR z{?`S<+ylZoeh20RWPUiT8>^L$P)K8RBa@14ro`lhdwbpZMlPY9;T^DDhE)b?u;GT{VRH1EkPw1s0ZazdsbedYb0O0a1?=_ zd(fFm%+3%b@&;|fCB{bY;y#tAvdM)IlK@kI>5kt{^_6NuvlhxIZaL0QE31lFCbnqV zm0mDdk}=PxH4=7ZBv`l6r_>j8atC0!ZO%70e1V+ztUK5rPncSv49Z6CFh|##Xt+re zP_`QU3ter^IAwkjE)m6krg=O84WTsV33yD-O=!#$60Q}u9^h9)VWZs5j%&wzc&<)Vuo+>;rEkx5Eu+a5m}m0~pK8%XRyLv;)cn8GwR@c+@Q8CC1T$?6PVY?QXPWEuy<_`4G;rFMj#%4t zs&K;tk&rszb5Yu9uwEIX)mAu+5R5ut5tG0qbvX6U6`81N_DQBg4w)XtM`d>%(~*)r z#dFfH%Is}8a~q3qHob1Q=0~v7<7^1iCP`%PfJiI=Jx>FrL*k3Oi)(nTr`08p+`9R3 z5EzK#JY)bcJ9Qc70=Sqi;D0joox{i=JtI^y|eW@p{yf;?cOUhjzbDVA32x5JGYoqY)t~9R{N2vHQB}=Z;s|j*R874en zsr2pFJXfE2cJi{@TE-nGRb~r_m5zImG5{mev^4u!G})wC8Lh^`(E-zG^&pdiD;QL1 zSkAs5owMny{{S0leiqPH*2YOK^=(C-U0tlM0eOf7kne^nr2ha4;CA+}opt?E<6A_M z!a=7+adHopBbg+Su1Cl~0YLO7r_vKl)OB{3Te)jn7_iekc=K8;fW=ol`&X*zx4#c9 zH4B@&YXftqEKl|?wPVa)01dY%l0|jVZl&4993*h=(bbU#wPJfEd|F1?`t0ApUoqg&dlOQ~1De;7PPtXo`ZciJ)}PZ4WYIsMv_G6_Do&u;bR zJ~Ht(yEd>RfXQiLX`e1g%VtS%a!KpdU=DzGuGYpYojN&g>}~;hQ_En(b}~sNK*kPF z)_DmSYPrb!CD_UBi1GIRgNJ&0~#>`5vdOmd28(r5G!A{{V+Li(ibI+PT)~eC&zN?3diQJRfhyujyJ2p{SOHZC+ypMce^|U88r*-$C`ShI5mt?P@!} zJx{iV8kAt^!C5}q9hQNqct-yK#1oBAO)^@`<~l%=IxIY#V5#T<00Mdnez||CcxmLl z@a4F&x0+^PW9JBd?p?azcRbZA4MN`5(I9IWp)*Xw&t>BS_(>e#AIFN@&~$nHM3dNF z&gB`<2^BJ|tVt@1l^t<`-|(+mg=XpU$8(yk7^!nhW1iJKPjRnU!yVC%84xS9gYU{$ zfVG?buC@j^?V~%G;n{}clfc6Ie>(Kf9{ehs!4GS4OAC9|Mv6z|t6=X^I)m-swQ_oG zq`GF?>1}-2e8py+K`pQm_d^^Ht~%4FN>ZKW(9Pm0#+~7_KAExjq2ccd{2msO#x5@B zz%fXsJdoK^K;vmVk=%AQ@d2?xZeX=Wv?4`FGvhTDo7|N+)2JGaV_4TTY;j1fA zzWRA>+S(tG+^!0c4hL)#p55!6v(wvK6GFEw6gH|Dd4#cM_8er^6G<%&x^dOq-O|@o z)OG7&quYJ5cVp!S`B9W-frEfg*R5+$;=dN!Y9=2NCE35WAsAf--3pJmfm@&%;8nj0 zS!)S)rrudCKF)$Ys+&&VO`vBz@_W|LiS&CZwJ9UFCOPfVP0O=}Lg%I%B$n=ZuADEr zu1#ebO)F|o;5~NRPS@L2)njXwxJMF2)z~+`QO{cUt$W29XNtV3bjw)np@b}6SPQ;L z(;Q=vpkuM=UlzlCZ#K96lXUW1z#OAUz^_xm=lF5@S5>9KZJ^xU!1vE_5MZ&rypDy- zV1P0d;GVzdJ1_n|`M~J!_Hi z4dfR(oYx4f${nJP+_6~DK3je|u_rjm>&>daH={7~|YIB({F> z1n>a#_U-4^7e}?ZwYd;nJo2KCG%+%4$O9d*p1ByWR}Ee@BhM4S#$crioRT0ATZp7c zFJhfqK#~OIQJ80MY@BuUuCmL*@avjQ#*coGG>p6Lu3~b#NaQPj4n1lJV(|Txc9)Ec zYGDs6i)Y$Fa6rRz^9x3Q%xPzu&$g` zkDcT25z)LseQB@R-%o0r%l(c&yiXB;U{{TX4EZwDXPvJO+vH8OkQ&=j}%M_ zjIw~a`U?8C8;wK6mREikI)&>`aUf`#H^$`|;NWK&BLle|tHC^B;At#1<q9+PC6e^fy7RuypKAU{Wi|sbjaa>;w?0n499T}cB+xj zra)1g9&2~Pz96}&o!e*cS&r2hkaL1EK<&vDS_oscAKEioZqww-MG`p; z9IU_(xBxxIGhH>Uw}bVV?KInCCX*{ozflry+QCQ4${gUaImQ6%TzE>8Qqb+h#wl5z z#qnFljpHpJM2-itH@5JQ%K<9T1i;6A!SnZf9+k#u-WbsQMW#U|?ZwfJjB-p@r=N@w zhXj(VyEwu9E1B?zhtp5h?f+c_j)mj)cIU(sjf&p2rupLJTWb%xYqXxqQNw2 zBoav;+2JIxDp!z3M(pxEc;niq)M4>%jd7`#do3Q{%V87&H%eTQ2#sGNMYjjmVEUZRy zz_%^bdvvdUjHIBGN6RXzPo1O9{v>!`!f?Qo=-+CF^u=)QE9QzRoEwN)V2(s) zJcaVXAmbw~OK+^$B+0L6HuGur)7&gmL>xcbir|zW09WNdd!D%Vt*O=I)<DQA}_|Lj$ObO!Brbq0|0du7lbUeT?0?L@Vw4oytr{I zl_B=8K!o&OyyKdxSi8>Yp8ZN|*x946Z974d+BX+dU0q6r+c1<=a6ut*N#g{Q(zW#H z{2Om+9h}yrMKS&L?B{Ig&RAgrVM6!76{F!#317#o$7`zzBf8YAWJsfoEQOhusKLM( z?cTLy@QUgvmO9PE3w3F9h3%sZvPh|zytxiI-pz&_&vO!!6z1&if&i(73=k zcUBCcPTofEr8!D>DlR_FCUbgUg>K=B=To|h8RU3Nsf~IpUQ}X(Wg?kf->D`~pEg zEqTw4G&uB>wvxgtTWJylG=e!kX%jdYApF@J=Q$wO>O9f+k--{~jPyLFTfGlQ(k*lg zvmM3u_DL7X1)^?FGsyb$-n+YB0cuI7ECN_>YzPv>h;|pTx->r5&Eb;D>bsdJ4VIi3zk8;Zz6>l~AsT>dh#yfPZ z=+bi7*At3y>Us9NZ8wMEYiq4KC?d;B01G6WnBxpb<%){$##&{9MP>G9T|Vpxo#Nve z05As_EzhyRuA{}a*3-l_X(WwqytPI#$F*26BrpZJ2yvW_{?+8VMup-=)b1g)V-NyYnCH%w*oJ z`>?JK1rC=7*%#)#|J0AJ!{JRTjQ-K$%0)fN$xce z-@KATgaiZVefo5+Tt!IR-aRZ8Db0I}bCURneSLMU+$H?0J;F-uG>gKtjCl$@1#of8 zAOX4&Qq6TG+>JcMySd8}bInFcBRI+RHR86fq4hA2EL2S^W}5C)f)(EGKp6M0pf5Z> z;hh`9dUe`fBytd1S0S0DW5Zw$S8qX|O2PPDpu=b%SiX%s$q|tu15C%K^EW-#9Cdg9O)W;ST_%{qyQtlwt|C zJPwGfwQa^qWT;%YQOU^!Vx6Vg>ULu8+eK+yLm?5!M-K=kS0#8j9FMOx)$X+7&pLRn zS*DL2hf>#c>FyfGO}T|4l!cNgoW{|hY_}t$4*vj$wO$&Qr>wBOvAb9$mvbeG*>uJ&4OXdY)3EDB}LCE|wUSshp=HElOlG@I~NTj%o$|P4f zk9fkjp(mc5N9R~cB$_*@K6xoK&vg}(#Fz4E&#svS8EBSwCN(4}!ts%lo&x$-?w&Qv zT|dgg&nm(bbIF{P;W5DDZva=0!*p%6IId)kqdV1^uzqh+Gwoi-b$=bTtTQa}n4blk zJg?E0eH1`k~A3WB7jNB2cB_`_0(#1x~8Y3TVBm?6ju{` z!MHN90|j@f3R7?()9g=dQ2Fo}P59!=_@cN`3p-=`gGmb1Oqp*I?I z?fc7hca)VSP^#k~=bWAatYELJ-3nTJrv9~hH7zwSYub)6I`=T|i-y7ua?j`ctj+OQ^I-yjx;YLkHQ-&7mjEUHl1Gh6e=Xj@6^# zyIk;miEzlf}CylHEBW?d(;o;!#w(K%~*9a3e;C07RwGx-Y7(mZkDjXz72 zc&64n<+7P>#E1&d3o48v@;>+jk;gputc^!f(Y#6~)ilv9lIuGSz1v6T+y)JU8|~UY z`maIL->;!V6;5=MPg90anyAxXGtxX?qG|fw{H0#8!0{NRAhVEAck5W2glU*2}ehEiW&|I=S zOIfLXgh6rR=Ei26?N`jaRxA}Chll(sg#Cpd0qq$WOl0_9Pus0 z`jf|~1(F$&i)VnR9nE5Rqr=x$y0p$$DF-r^nIo`yB)o__BIOZ=Rzs1& z?~eZfg=q=tbSF;Bm7Twf*4Ita?cUZzeePM&PD=V`+Pu~7V7iR#A2vtS*6qZWw-!=N z+&lf`94en`;w|Bsu1dnEgI48zM;Nq^Sn#&_WQM~{w-Ve*l1~8bJPeb-__TSL8DQ*jx{ z!WI%K!zmw5)T!3wmAV+$!~0nIqv{_P{A|_r8#_yX5NWrF3MAo>9kMBJFglZf6_n$@ zPPDqFt9rK@2aEKG@883+M#knbF>@T>Fw1NUhDFW}1_wU1=6X+ybt~NkbUT~Dabh<8 znmGU=KwL8V?I85eTG_Sn9iD}A6_$^Eai-g57M{`ZGBm6RZLC-B5!s zFVMk$seKH?_m=FOhK>07Te0pd%?a@~l?J1C;aRQL+Scwl<+l={cJj!M@%1Nj@rg`^P$M_lLC|HEyE05J$VqXM1em93I=cjyrpric?!$y0qk0TJuZ)KlIytA0xSv*$&1~C_8 z1mrTXDhJBg!31W$T-LlH@dLwJY;Zb_TEb`&f3q{?)lOUi(X)<7AC_xJ;YPD*rr(bd z+3D9J^4j2=n`bUyL4mY|1T#4+jipHU^v2S=v7KsAwb7~LTkiUSW4{1dJn; ze(LKDxl|3T3a~u$z#LVpDQ25Vu)e*48tLXlTWf-zMZhElA-6Mp-5B5%Y@bTxJ}Y># z*I(2xbu_b^N!9G`Wk*QY5lb3iDGV@oDP#0p3f|G~^<~j)JYl2B9o5y8ITmxqKX|M| z$fZsP1RRhKM?ETPQkPe$R4Q3$P2wFR!@e}oZ|Bi$W=%^@TzO9`Jh4j;`t)QVHr#y5 z**p%F;2s(KEv?i~4b|19z>|EjqL7Pm2|ID_M`| zUeF06igp`W*C6FFjIJ9Tj9~GR;)AF7msFN*OG|qlX4d{tF7)JID)meGOZ&bQNJ&t* z!6UD?C$&?(9>;GZNlx3BHO*sH*0c+M?YSP|?&Wor_IYCAqxrY=3%P&;Ba_#jYtOtt zs98rP#k6+sXL$KgzkR=U&Y@Ti=NJe2S9N#eT~-FDgG0XLk@?#w!x6ZG zJr5k$Vd5+Q02gQ)hnuI#ePwYCxQ^xE-iko|*vZHa7%Aj+IrpzSzPa%W*eosta>~1z zBv2ibabUwEAU6l!iqdjz-E3(_S4U@M;@NaZ@}Rl%t)p)|EzEo43^*VIp542SD($Dl zw$$yl4GU1yZ8ZqB31gDTf)H9rgrAfVmQo1;Nf`I9Jn+t=tm~Scwvl(`q*6v~gUcEH z+U_zI`FUr~K+bqL^u{KyZ>IQn#FE)tnXfICKw~O-50_PAh53MGVn=Xsk-@BEQmXe^ zys5%kqui`~Po|mtty4yh3vdu_iF~(K`>lcq7|1<&>t5gDcF;A!bE$Z8Ti0=I50?~Q zCzkLoK4xH841v2HzJot8rLTqVVi#IIsL=y;6iaV#q_RN6my-i)ZEiR``U>>V4EX0( z@OH6heW&WS)~zhhZzzsGG8QUucOwD{xC1!r+Nzy--tS`>(ob#9pG4Q1@=K4jX^1Va z4(Y8e&i0BzPGkk~ki;<~rcVd8YpHiL?zj!X6Yi+JA}K`_GMS{>3aMqlay(4o?g^ zXBn-NYgF!I87XMbDe<3$E_7M`*9#L2Ngh1uR%t@W3o4e6E5(;;dMb?VM*d)!X&@+ZzN{np558u8yJEajtFCp zLHsMr{9tt}xRTmCbyDG3qgG~UfG39CpI=@pPi@SsHA2qkp!na#J}~%=GHWuMcuerC zss>Q*>RWVx3^6CUIr{XkDbxHfZLHZzaGHcx*AND07iVHhMtF~CW+x*VAPn~vLI^xT za~GK%t;Dw0fFny7av{$Hk;3O6jc6x;JYbVt-bn*0#DZB-okX5nVX?D0+y^+uMk_iO zTe}-nOP0p9zkvKxaRIiqgY6TjNj!+1UO=z+NK$i#_6EJW!r#Sy6Y#*+Z?%D>TSp(2 zC4)xOI~F8hC=LU0{8$`&Q+zAp9}oD3_UBOh1b6z4t*mOTB)eWnph9F)jzYF@Nga3| zwM)W(5G?MlwQsh4lkGoelF}Hi6zm1Cp!s};!h)0VzG5n)h3tU`H_diLhYl> z?$^W`u7Rkwlc;^8OcM!aw3)oHS@;f!-zGtBcAWcSxEl`+_=`$$bbQNAm}Qf8(~>d3 z9G(v+(!QdDSk*jBYjNP)zYai((xWBCi2Jbxz!3%~e(j{=c5pbZYs5YYyzmCLw%W{# zCXscCZ6uM4D!5{Y4uyvp<7r;&?q>z|&xjgymXT<> zq_?)qwG>A&c(?uH8a6*JIvjz;d)=fu=DDe9l4}>%R&ZS>matfAI}Ec+(TbKo-sh)E z^N$bsGScTvy0y~vSR}lbodiAknrTz`VOyrH3?w|XOhq5 zVe=Bu5#=gmZZO%6oe}f@+@Rw z$>S_Q1oK^1xvyDxOT)2hIz5DXi|;8cOJ^>@v|vf*^BXWNhU8%JUoiM~Sv7mhtBn*& zmp)!_vlKvxt)G!tZpw@vqqZwEL6^t6jBj-VU0hpC(lZBgVK@Xc0De$LFg}94N>n}T zUr6*el$wq2x%Cc=7Y8F?3O3;M0~Pf>j9vq{vWLbxw~WQj z?ZgnwY?=paq?R-RNRl=vhbjj+IO7%F?IM+@vCArQQqcCj7S2sm!#Y*Zh&6TarlBv* z6{YGt_HP4_0YisX2M6zT?_76?^_x8wTg?Mn(X{C;nWVQGg~hfKSeGGQCQ#WUKXd_- zIK^q-e$+Y_{2_XGg)FQtTU9U{TdVvo*yG$vvZEIB8RXXfZSeQN^4Mwd{%jbe^l$j(bLM8^yC9X}eIRkvFSQr_M)gsV44 z%()-l^sFml6}eN?)|MXopK^Gk;QSEyY8ZYTNVkq}+V9LlfJDD`DI z!Ren$?sbof9y*K-J)TPyxN^=De&>vlz-J}4oM2$$y!tS$A9hnu^EH(;md4f3io9ug zJ@vM|sM=ZS_OS@w*-FS=2R=+&cM#rykO4K(_-n_yHm7<0obyj>YM(TbI|NrGk+3T4 zP!t>%Jvlzr#Y^M6EjG!Wr88<$Hzi??B~Vvs+`w;g7lp|HWbs^-{wsnjhVd4kF^5o> ziF?TY>e%3(=L4m5#?JRdN)JSjrS<;+6nJ05(??<9Sz^16IEni@mXT0Pjjim_IMz)n|P2(6nr;3?#8%oCvpwt<254s85sp?rAa22ic?Y2*wQx(UT?F%4_R6DZA9;_zwPR1I zT>QmYqc4>QAj&)uEhfa;R2?H*Qov zHpM+T?lHz{<3p9&<8>3%ry-8c>AuY3Se5=mjBZ@;NbU5mRMC7lZK>$5sOpyyT1Mm~ zJID;qNXZ+BTnziyHasMCeI(y$w|4&kXpLE#7HzC?*-t{>m2&r2y2Q}IZ+RivYP%70 z!l?8eKOXg?cUFtDIB^l2tfR5pYno-Im}HG)0NOw$znVzmCo@Imv{~)6spNb9m5ZW* zc{3ZSj5bmJ@yfA{KFlDBCXfk#lpExs?evb3rs5vJ0iwv6C|$R5KyR}U7U zr2V>Q)T5H|!ylQjqdfC~PEL9bp0()~mxn>o?;-IyxPofP%_WpKjk+cSkAI<`hzp*aUURXcrJ_R=vJD#^|f*FAj? zTDeIv!ZKPJzh!&^ql4U@{(`k2fvu!b`?*Ul;gCoihlP$axCG(A&oFu5Cv7wupadg)u*?I%!SB_v#>q`0qy=Zw$?hA z+kVJqwA3{C)FE{!vB%Rm2L~W@7~BGK@o;hlE0ZkbS7dh?Ez4y~+eQd&h~P^jzE?+qXZR?oNxyqjCH6*ytEpJ7*_bu3+ZbM;vE<})lbT!X zRqS+nNA|{>r@PtP#A1nomhwQn6Z`?r3CQCDvl~-rb-6BKDABZ_oB%Q~G62s`E7oqc z>(k)n(0og!t==69Nx7rzmEDy;Gk#+{k;P!^-VgBYvMsf>w6@c%YD0Oui?QvnmM7P> zamx_3jM1+n-5zPGH2S`${h@RL6TbW)9nU}q0=1^ot}M0|vI_;wWx~oxAxB0yKhLkF zZdmwxQPXWfGR7`L2_cNiyO)fRNbl%78t1i}i>>M~Ln#PJV8erszgpyO?#pAMD%HK}BSnaW&NRV8kBRkyZF6_?7=NTXo&||l~X6hP! zysR#6na7zM7Ab;5fxrOsf_nayPRGN#t<8f?9EzyGs)uk1KTfsN3fA1hr5m**$#hc{ zjjh$p;|^6-TY{UjoB`K84Ra57b0q8{JMzTs$0VBFgTmU|f#xel3lt^z2OV%vTvpwe zfga{bSl>ZyPLf2C?j`cuJY@CA=aK1C+v)bvFWMzw z@TLbR0gqe`{{W>_xk(C?5(gl%k`Ed6A5l(7T6-Xbf#rY*$6nd3FLWijW+t|l>@;XR zw)?6%IXraiGh3Qwk39Nc;^G}P$I($F4j@YM_5k-9EljS2k z^v-(q9jdA*r)I(}+iRT-wvBIhsrQ-YMYqi;e=;A5U@g~y3B3rUf@*|QMG&B4h7AYkP4j!&g?*0RN~Pb`mwP3BO}b|_*< zB;&U{`qnk$7Oa@y+jnF#>AIGsCitaM1ZT=-E*C9;P6wtjSdV^fbrwrak(n7+IU6tr zGn0

fW~PWi`g1_hb%yvWIr~+mJd8cKX*TeG`XuD16AUhl~t?oblB9*PCwVc8zFh z>J1<=OXm5&XXaDEC%@-h)rd>0No8C|g~%_S2P9+C zvFGr=h+(^tZD5d?23|$zy~)p}C{13#Y|V3IG`7+$*#oILVccgUpI(BgX;RvG4IHc$ z#z8&DQAs6$)8VlDbg1HVGJfxtT$97`*Z%;m&0|Qh{izxxAax`T4?dMjJq=>hS2u&D zppNFy?>=ErGn{qCJL4a%Z(9Af)>w5`;Zd^jgM%4!-fJX;|MeJuI&@@dSLcd8h`{Z@|lD_=ZCgCo$)_~iY3~n&l!xZY>J+p!7#c(?R z0ND~TaT3fdjI6A851sMCjBq#|aB-gXqMgx~CbuB*pNJP$yz-%${>(;WP<~Zn25_gR zJX3T#nA1s@PiIzC83R0$N$5KI*B9q31sX)&qdgB8_w@Yg&4jHK(%#9CpfMXdgN{4W zlXBeFF+EkhN#IW9@ZM$O_i-y1Pb0!7%Vx?dvn*;x~~IhTK2PbCb_6;jRn1!NAlkVW!?NEJRE|3 z@tjrbVtL2A@J*2KvS;{kbuLyI?$%{JZ`& z+|8{?Y$Adp(yW`qF(9ti9DsiCBi_8HbSCj-g%>PBlwwZP(;)uDP>mw5soW>9_2nqSQ z>6+{`>F3h4tBCcRzy#`im`LO|Bop~@>0Auc+e<1kD-w8Z$JUzi9BWH}!}NvUb` zuA6f#PLf-Yq;=e@>4JZy9NLYug0>eV7JP`#etdpnrw}saqXNB4XQpec&~0G7h*`*h zM!***Ab>N-Bbwem6Vu_fnrJQv3Y*s$ZNof*I3x9^&0-Tg!8VCRYzH3Qed%WxF=PTj z&Ts{E?_uW4n|Q-U6M1gq8Q>1Jk#dqT%7N>V*biEK#TDa#+<_y4G2hqPwe4eqIM^zJ z$@3C=Rz!wXM2!vs$YbA{k|^$?ZQHmw8%gGn5Zp5~tt7vDpvO#At5=P3?xddCJZI@j z@I0WMgyY+-MH&MkmQB&Bjt5--0EI9t-NzKN#?h!&04oK~GJE6Jx_v50?eddn7#nl_ zGt#*aJV@X#QJewRv?9ANAD1a1vye|;z|fg8M@y(^+H7HOuBIy22O>Of9Q5b5JJX=i zukB2C@x)dZ`9rTc2d5dV8%MjpZ?R70qFj(9C5O$^9SHm?LiQWhnWP&W<&Ye&J@MMCTx&Xn z=p>yC=^tG2*S>$HSkx^fy3ymgxdPo!2w8A>85#A>M=QO7$t}xEFp)uslFz^-^c9z> z!*cP7SQbp+zqtODx!{Xsp888!({zClMyxUk$Oq}cuUzp>rj27@EubSK{4!jS3 zD|pdrpE;7mrBm6TJX=9$AeEfufZ;H6yFF@qnb+*1IO5o+hRMmzTA3Gfc~OG9ixZ4} zYK%bj1opW zel@<*eR%K;A zWQ<2DFntDb#!YCUeT*FJZTSrMOB|&{BL&K182l>T>=E3=V786h%O~YioCBUn{{RZb zm9OH1%LMNyYbHH-{Oh^UBAN?1q;*aB`HKJ>J;3jrcJ-~PQf3t@T*}dW8FJ7IqD*P` zuZ!w|_b}>f8`_0nb8t2C=URZWLO*nL_ew+c;ysxLFc;OS3a@TXF6^t0(PN_emSP zrb*lq;~y%XzYH$@zysK9Y%JtvB-?bZvFmCxDbe7TKRJAfF@4n{G}Ya9$a zlT$I2R;cl-?K<=Aav9VjCV2;rxW}*7vHr;~oZepM+uuA_sp-;K>(^j#--f`(4appMywx})j~$xY z_IL9n-6jSyazOlQ^|igy1OhLRu-${n0=h-it(D%G8;0dL zD~`k;ZnWK0+)Hk@R??D+OR&JsdS^X)R;7#>(yeUnqcOnjLQ1$+k%8wVjzILUGNL+a zB%PV3;g1h^PgP6kH6OLyT*@}vc_c>a!0^GJE42Rr5F>%oxo6YvwELMLndVkfRh7En zbQ}TOy?Rxyv!eKBFDS;>6Cv83SOHwH$YTEhcwnA@b5z>PQ`ZD`%LI~7cpcjDhT$GT zJu)}|S8W?4akS?*b)iE-@y*|bJjwLwW{BVx5GcvVP1(pGeF(2i(!6&Eh@*x<_JMaU zQ6yz%XJ*McZg4;SRp5Re{?zc~_s3SXTbMx+NV2OkyFc73u#A)2oL20bh0chhPKo1* z$qdn>5ZjvtSMbgb)A-i^09tg{GT3v$LZq#2PoeBJc=UNBiXBMKLl+`+*&-ftm>!4M zn#h*ZQ@FNU_~L1y^P~=u9jz`1A(?T`LBKiUyx+n)R6=Ifb!|os(W{2D+`W4fgU){( zR)xoiqZgLe7IJQiH{ZS~8$9ua83XHHy&P0!O-<;0{cOGae`g(0)y5;8p-JqQPuw0t zlSzdU30DThVv@1z)4(cf%X0<%3onC>=ZLiH z{Uhvd&lD{&6TT$mutr^_)C_eUYsd9HOHtExDUOkJ^2c%uNF!BE@;Ui}q6J)I&{x0d zTAj9|XFY}FaSH(Dx3U655%+QQAB}kDi!W?Ww=~TnBv#3?+$?w{vDeV@dRNTjqXex3 z+rg@ry+fY)^;=jiH3?=&pbW_fZKKR{^AViw-~pUunwL#`+h`{ZBdXfGYi^t|EKkf% zaBvrdbO8=^y{AuwwD|# z_Yp#NBOLGD)OvyG$6BZ18%T5+A+^2J%y$WLP)9HWayxvxSmTgM&umtQj(#KfZ^F~d zrf8YEy?9TU;|t`K?96)e>Ds->IKg|*bK)_zu@&(Oo*6qY>gUNmAkr_qJK{2LBKtg~ z{HjPH5TBHH;C^(vZk2m`sHLu*Fpy=Pi%En)fRaXd;BtPI&+2-;-mj}%>UxRX*9^t7 zay`GusqL?%uuzE;q>SJ$&_?LrgU_KKrEw`cx4+@t!?9R(74BSw(Mqe=D?VsheO%Ga=`nU^CLX?H)_%MXF5<%@w?g@`pdVmJq*l zBfc}Ar8C9XdKI^apG`4K9sHA%6Dt-$0}c>ia(bNl3hbQ(sky#~1myYD7gL^!_WDgS z)LKvF%G;BCXK5R_A)nLvRQh(GWU$F=tVps(7%`Mcz;rz15ud~wlfw2FclOt|x?~S> zO}og^s*vcaGVDeUFgxb6wJ!y0*ZO;E8g;;C!2QuVJ8{N6#t6km7L?^4YiM0ckc_v~ z^a=bK;lB~QTJ^2fy}auTq{Sob3XzSma?A6%#_s)vbG{|;E~BJqVk>Kqvs(`^B$#)( zNeKPmVZ$7p1K3m^9kSFT)BNkDEcWcBmPW#=42IzHPH}(*d;XQ;oifKsipotYNsiVq z&oDCiC9%S81S*#2j+Cm!`!+XG#%ZljnEWHD_?8ng=}NY%8i6TwUP$9Dk<^}@>tkH7 z@l0?*sb9+*w7kO^U=HJ)j2w0cn(zEqqj+mYxJmV0c1T+4NbaUkp<ZpbE5!^Fe4&nZV$oMZ7l zc&-Zf$6C}cZ)t0Byjn#Vg@S_6D9V-2KKBRLis<}B<0*B^3oR@MYl}$px>fz_mm}nT zqn19t_^)0wl%=W9R+>ue=;QIY(DdC>??JU&>86!cB*)1S1n$RkkbS+Xe;9aYRoDDD zd`hrJm(j+Fcq1~v-dIt;db#8QzzffOR?miXh_8OlpiV`jyDiZ%k&iXhkr-0PkO9di zuK0p~55*zy?zeq#CzZ@=983(X(Gp6KdB+$vmL`gw(=??~#V$?H6wde*~bh7K?7t3 zb^|J>YTy!jnv6acoGjMiiK{ttU!m&$AJ_apZ#Biesf1eU07o*We4&-b(5_G7Pjg-W z0EV^sV$@M|YowCa7Q~Q+SnbO$epSHaV*|cVHOD7|Z7%g0ki#4ToZc4O$A}(>lp5PDVUZQm4WR|DT)Q>#*nd_b>@$9;mq|iOB zu9p5|8NB4%9>w5n$m+)!_OD9t68L)ePM#}!X%gz*AXRPMqG_3r$_@wxPaFZr>s}k< zzYX4BX%cHbBf66R08-ek0<#euVLISr1Y?2E*wj^jHUr?v26s5xAyg$WS z*MqH^4F|$;w6JdmZA6w5G-T&uf&lz>=b)^=i~cdxd`;sRv=eh2_O|=vTY%fQra(>S z)GGAoD<1M~KT5eaPYhQi$K~Jwv>6u#vPa$-;Py4ejHvI*mZx4>fr3h`nV~hLno~t} zr%dxjBAw<{45&ysU=K_K$DynpC&bWMYXeZcjLhZ2nMeh(-0}zq9V#Ift8E<7T-whN zjY^amE3^@ej=fJ>ihU(zh`ct>9@xZ=YsdTv zdEuY-0O8; z7uerRZ*e8OFvk#SKGi&EQMV17Huf0xA9GL+a&M-R~PYC=<)BGbO(s|P@ zpAWH+5xo>B;~y#RPc-F5lp$u)I9#hrcZ6HpV?tkn8V859zqVW5-KCg@Ia)C?$2@pE zEQ^kq$Qd1Z&lQWO_)|{P?^g0>HxM~sJiNP-c{tn#8*kk`GhLpY;;6hyG`IRu2IA?9jnhR{v!p{uMX>+xUC^#7ywD<447?yh5!+TY|Uy(4)+5u63* zpSzR#8sx-PgmrB8GRz#MHrdA6Ur8ECVRdF%Q3#RalP*qq$Zz2p=m$|)mh#!jEz-$j zBfN<5+dON+b{X%1T}8E)sRZ}Qs)!QS(Td$&MBFhQ21g`x=cYNY8SyW~T?)o~i+wA7 z?;ykjEYBo{j0&9O?};ur=@|4Nz_+s?k?&&=A)@h(p}uiGq>JnY?{l#W1OAc{V0kF zrF=&jXC8x~uKU7X0>AMs^cJ&RLtzBZwWgHkVD;KQZ_s9xVL81O&8k(WOpK6wOggQAB*dUiWcO6piXRn0bet20$)%S~zBoz{uq zcp;5IVQ{G$sfoz}5dQ!l2e9-N=KdnkrqJ%hV^eu7t(^I8plnj-B~ShGGh6o_Jk}RX zeHoq;e;km7Ft^CuVDrZZJdD&HD7)6vOHEGePe|aoU$ZCxlv{-P9e~OCj!#}Q$nB20 zm1E1NL(YW>`%Y=~dJCiYx=#`rG(AsHHbnDg@yW6`Y!QcH?a*|sZC6S01-6=+mXoMU zEY_;S%O`YF$fKtVjm!>l`5f07rTjnCCbPG=n$*W-E0lRd0Lo9XIr&?TM-=^P=Klb~ z9v-;x*p;MLy<3>4Pjo|TiG;dF0Ja#U2T zcr~txapGMPTd5(5zQBKbCgohalefNlae?S-&VI-@T*oX&d~$-ZuTL!Gbv}m`+Z(IJ zw<&3E@gqj;zz#~_lbm~37ZibSWs+U*xPKAk1MBNvWUqU(*QaFlJ!?eLtn@{+z0&VO zgk~U43#lkKg(Dc{xa16VsvarSHLI(ruS7^PShGYiwNC*!Jqf|DWz;m^1#3SFw9Q5d zzQ?P{42>*lwSjoc0K{Z4ByelNd@X#sO~?|)WR;}c(g!J+4^ zw$bdq60z0v+k0v4j1MHKxJIreTsr*m$_e|e!w`7{ab8<)R`22^wx6sh)52Y&Pa)w^ zQM0^#KU(^)TJY_!jeHqmo)|A|(L2o7$eVT;z$+Om%Mwo{@CGaA9}xIgQq$#s?dij6 z5IHX?D!_zY+1xnKvGu23q#RYA<~Vz~w9bphnt-{qyNP9)rV{NJFt7n*i-aA+4TGm0 zxvxF&_ltZ%quihl*C-_pW07*Q20Y+&1oX(PZAV+wt}R$+?NJEz^}Y4J}r1d#2Wq9n{fn^ znSvHs6;e2upjkHbBo^EdFOnKZkOLz&ZY%Yt8&c7MCWTe!@^oZpS!3 zGcHKYdNS!&)WvYH#6gY6$}jD(g3`=5$}xJuy&=i;3eNNY2yuj~K^n*8cz!x;6G~d#sM&P8~$t-kTN=YQ%|8THYnU{cM}!>1!(|R z$3h2B5NitD9Uq03U0-!eVh!8-G53ukLSn{3zO zFDhvncD$<0FarWWW>8dPh!o~ zkbZRIhB-OT2Rzf9l3F1vz0Kc?7n;_G1)PxT2T+o0*=7?(fo(KWg(?)DjDQeTc~jJL zTt~xAMs0UlyVB*IG+j+^VQAwe{JElN++@ffaLFK^Naygb*&^_r&xWo%IA=&jAZ#$-oW~??-**Hl#zuMr zQ-`XgoKm%nYeTKh7vl$xyj^tx@HVijhR%6+OOKt1%D2teI0JAz=brWC`c9{=TYxl+ z*R!}-9wOdm0grD__!lGb=B#+vQ}J{O>;{{UybGNvPCX3TP&Wk|sJhoRv5n(X9FYGnlDvFZN+47^#cORkL_@4%94r82F+ z05ZARAsvrXkULk^x^>5gH9r+crFd#+ZFO5$Rk?!pRyNlRp<8-`jgF))2szJg1$<-S z-4{yGwHP&D5v;cmp-1w@QL`ZaGmPyZgU4**zQWM79RlL%J|*ck@@%*gLF8@@u}V}X z_HVs_Mh7TJ2$b^{B+RtD;*vD(!3~w|i-)l2IkRGTa6kR6jQ$bmt$fUVUwR8{zxS zGsLk;sYJ@tNpGqq=;TQN%fTR5 z;p50ZDC*y5X)(cPg~8HA`ax@j2iV1D5$K?uu%jAS15gW_9MuolzXWO=#VjgZR2u?CqH z&dc9ANCK59F92kP#&Uwh`UAMvS5oo_})GYi;pyE}f?Mn?u#2X{{uZ&B9Oe$11jdQOC*7c>rLZ zI5g`kc85s3u!8a{8%tRV%M->}q-Q&}HXAHQ;g3q`{2}2V1?pM_?Z&rt3^HG=BGJ-9 zGa(0dAqftR-~k^&VN|(UyA-9Tw31ULN?gOuszX^KP))lHZ!ru zTo6B6tzjE@cf}D{>9-N;65VbyGblFX<1PEXRf7E9wd+>?8PRXFm^8@sh#-oFRVa`-q#ADSaL(CQd^C=#&Oiv@Wpf9F)&zk znr!+T!`F7xT-oW`mYqJC7OwzHdF^dPaTy~AYfecR&Nw`PezoC#B=Gi?;XO#{a?gKo zlgB&HJk~`U&r(7N^4vz)8Ep3_9jndsuNzOPX`k5ojMGN(IE$v^AN=ycOpLTDGhDS|ym zLC`NHv5rDsCO|n)x^kcskC!S^wiQJUjWh30f6n|TfZAb@f}CytmI z=Zfp0_@8^>4Qk%jPY$qjxkMKT;b-z!cKEUtRl(o8Ezn>dnXCriPI7j89&zEztwt{wp`1mhwaA(#xqJj* z=*ru-GNH)o4l`QUdIJ9dZ`^o-DWbKvc>dcL*_f%2ZwkUO&r_Z=>*-u(rs;1y5neh? zZZ^gYGOID<;hzPRkTNq~&+z-kUKsG*zN)&tiPfxSiDP(BC!HP~ZI(80%B35U0`rm1 zGoLk5_?4|`n%KCpxRoXOBMm6p!FVHpNCX~p*19-+ed1knZ1;By zbe1vwodH06kt_2ef&tg;iam=1;TPaH25f#N?K z>Ruw&l4u@VXkdrQ@}e6Dk_q`6W;bwlliYQ#isN6l@eQfJxwc@BSvW9NboZ9 z5?kgSfIN5YR-Y_=;(2c^4>|h=ucm7P2_q?WWjB{9x#&>fs}7_dhuW?9sXS36ji_pH z%>}*dw2}OzM0@;$rUrQSt2&OUYi|wIOkVp_a^LA@Q{{o5ycYq9BcUz$S23sSdX##7 z#+mk+8r9C`i#bBwbAy~8rCeKT_6D^*2jM26qFMNp?7k$Cptiradu6y@3{4>zVn-lk zb6r37j-}nWI6q{$b+_ttTE)hzb$2GIYi!o`<7(W?2w;d9{{SCjp17;#-p5nYVY1N%Be#^a z^2k?o#lMefAdGa!Ja?};wz^q06LqLe3gaB-1a=r5g>=3j(ylcvPkxa%PFR)*6npL? z{4v(MIOT3 zUCJ+%=jYYkp3mW19V^CZ7OQJ4ab8$Co>bkpD*)U;7|F=#>(aVU8)^DYoWI*w64+nb zY9SpUk3M=MugK&m`@=st&m?=-%@?-!+H9$FrTRS%RJAhyio-u4PVAe3#ITgp;Y-}=RzaY;Rhj_DtZm5J zK|hXpuBS!uYF*0KmeMq6K=~wZl&^K?r?q?6iTp9)T}Q%t-Hq(Fk9Vh|y`+fE3)`5o zKviTOVoCrU@(vAr8kgn^l5$g;?NCvUyPRsQYRTC2?N33PZC-gS*ZmqY9Pc10&rk{A zk?CCax2H#?e&%Hj9KXCmKJpSj`t%)kGZnN(MwKLNGUpieG|h4_mkyA*c+&s|JBZ*P z%B4v&do+w&5WA0@tsq`N&N&s;UB{!nlvC-~QY@?oogC^EtgY8;DLa>*rv|XnBz=>q z^2t9i&VM0H)Nie1SmS~+t^xBKvmV$KOHE0J_C@P`Ij!!Sb;NsD8`)0f!w=T9Vz9G> ziESnqF_|!`-y;!`$wE#Aa}eA#L=}IQKm?1~hI51Xfm?cxwP`xWEG@(mAPT{L>H2ya z!=2pLP(GN^JZq%*avNJHW4Bcis_qMvVtbN3JMms^du`!ecgA25q~tOVv-g827{E=;$Ai#!#YP0OWz=VG zJ7=2KjVP&eJ;f&4w?f~V@)G1{)11_naxa>_a7f+2&%QHJtWvN6%Od*!05MkVtY*~i zKF+L=uV*J181$~2t=W~y7S`JG<fTnu#UjU*c1M+ovrQV7+Td>8+pj=7_pYB#w_h4vv@%>qZ7h)d)3}WYW1It!%yX06)-$WsY)2wI z(ihTg@~IohLE*AMKD<_Jut|S=vdSe>DHu`yde^nt_zu@lG8>Dy?c=vh#Hg8Bfg}Ku zX9SWv^G^Q&ggZ$@Fx)ihaAPGB*egiBh1e3KJmG&oO3&+2S|(D5Q_ghX3qrQnH<$NG zZV+un2Xo0FIlutprBuAP)^z)|)S-@8VlTEg4g1Z&4302zKMLz5(XMo_B3pI2f3gDU zB+;aBs~&z(S%VfMl1Tbjmg<)}lU>Q@0yh&b6y$#M4g4n`hiY(}Ztds|9p#_IEq_6} zH>9lh1}BawE>KGG7XCFSKQ=M}?V7`b#FAa=qWe>wW^zlDFGAgU`qvuCdw2518xjV2 z>H5;z>9fl>m2n=@Fg}^Ch*O8ew<1!K(DYq%TGKCW(q;(v3=hj60RiZ9-1}D^(9J4& zk&WDQxb&?XZx6okyM`N}&-voEZagijTj{TI@gFFHK|&aiG6@O}agpgnl3EHASJd;? z3Au7X+s+L{(ifN>6lbqIab2`}b@saw0US_U!-eyo5r9uYoMn%t#tR$Tf-2sI~GJ{EDTeDdqC4(>rsvbLp-w*p%n57;B@KzD@si( z>O`K}9Tc8yn>5?m43~EjsC6GQD1LxooVRRaith9e4_G|JT@bQD6;;CGD4n_anDxNq zsijXy=a0>tCW0G;_GDAU}cD3+1juQ9}ugAQlNzSxadLSK9sQ8XkI9} zw0LD(IsA>+C5tP9fS1PyJPzG!%o9-1XL;|h6z?UOOj#=J%K`Ir!NB@f$%>7foBjV7-S|Vz!DWaa^FsBtQRoK zIksk57?9oZ+N$eO>XXhVyL4is%a3M0P!CQ!`d3MyB+^EkqGpXw#bsU0NEyJb)hMWm z)OQ^O7WccZV|Ee4v@-HQX5e#3+KtVK7V!YNImjIU0EfLEAfDq!mRm2geU?dCWZL{O z9FdX81JmnRbIGn=-kX{7StCQ1848R(O!gdCGNZ4NzqZiSzt?YWc0Jt0gvbP+!=+$J ze?7r0&76Wi3aLJme1=PlsX*J#4?DAfFg@!=O(#&XfJ=D^T$~{UVDX-P>qSXNVtubM zl(6B35i)R2GHU*jbv1>+nZI`&gs%1(Ra21I z`UCZ*mv#;5b6Zn}4L8e#eDY&^HgW;U$Q2c)p(V}CK}iM{+&IV>K8K77*3{$DC0n+K z%(;j^?k*4zg;%Kn@-jMSk?CBmw9(qbA&Exz$P9DH&1F(eOG9W`#Wr>tB(uHTp}eP5 zLg&r|jDk2HpMEPVT7uGeURz0#W`qz_3~m|8^v_dSwpz8#ovg4mr<)w5er#dYk6a!) z)?BSM%&(Z80^kr&wP7aP)Y&9wBoA|Q5+fHR;NPN z&QBQh#c(#PE#~v2UJ#sPuj5^WP#tzBg%@nF;lmDvTO4B@u}_-B$zO9HN#A{_&v|<9 z8mRl(%Vc!x-1^j)(OTPDLn})sohvg)hZ$Av&p9XXt@ERzO(&ZKme!ybSAUqh3~`Zx ziqp0h42J&Yl5}+-DkcMCj9`=8{c8!!siX`K_(&4Y`Zbm@<-)t;!hx3l5^?F+bf&k7 z^=pfpiBYy06U$r-VSmP}YCu7$nQpBNDV%vsHjpvsdR2=!8&Y9y0_{_gyZ~EwQT)5o zvfjkI-p4X*x2q)AJEk8pVCNa?E35F3u(nCxRzWLdGB2(H&-1C_@cxOX$1$2`5&~4P z0f_uEJJwE}fBu~156T&qGWY-kjAx2%-Dp&F+~2;{uCJn+$3?Oht2+|T-4qODvHr!3PMnna8ND*}3!00Mh^SEO0!_tyGLU+Ndu(ZXEDtb{Y*{KOCrap-Z)ajUAl zwpY4clu99x{_<8Bc2S&X2cJ=%l~H#`eMx=&4Jq&5OP|G9a6$2-)q54-%f8hO6+TJ}% z>?)+Kxg2sN9S<4E#ZqBQ>_w`Po-+VmZmiIXKRLO768CJzCdKveECF z=0c6t560nKeBQ#tVpHdA9E|xIn~l z?m7YfHKizXI~moLwK?Ar_!3KL9$ivGvp4R*Y&J2@Ot}fnfEmm85iDriK-VLTH z#?%hE3PWdh03*{F}zWg#dURQ1Z<8r$fO;|CnwUZ+sbcac9uZLt8V9t)9`19f8ip%ir-#i zZy9h90ug@_PHWUWEv0C7zBGfwdW0)&r`=5@xs;GgBP(oR&5?rG`MoQT6^?}nN=-M) zum1oHZwOv4Z1M!XMRl`X$g100Z$pEgxIOV(8s(^pENSdoAe-IT5Wt_IAf9o?K9$gT z$4An99ph)Q(`NJHAjqO!t+AZ&3E@aRc^DPR&wkc|dpRXp*N~(T(Sq0~Z_>5GVxfqo z8ub1dE323%b#zkFt!0{CJfa~_GcSzs&JK9ynWy>MhOEq6WK7>O^MFS~j355Bb5h>i z!y|2z?;fD%9-Q^7_DwaqNqCM+w>yUiC$HmOHf1JU)TX{SW(`BkQl-4LeB_}#5uOPC zRij|58T&=U#^Jczk(ke8&r$TOdx`IFp-Zh!ZRR|P&PMDGpyI7t?X`?uOB-T9Hj&fY zk9s;-OLL)-P|PEe=No`I0F?u;Y*npd@9jbeV4bc&%CjlSA$t+jaqCqrCW7stm2;Hg z!ty%xewf8{w;GE{G!jK7A^?qm46b_;F`V|!Yl(NhP|G zTT|-VevM{rbi`R6a74~Q2Lq_*xX%^L#Pi(D2L0P`eK@AOgjI>`VV@>eLds4@85OfF zx=O-%mwKo>cJKx&IBrFTknjs5%7x2VhrEpA#rGz_V4 zkY|kg)r*r6hG^tPSy3^ZbtaI_GsE)%5R7Cf1QI~VqU;WT zPSeDY7dR3hxP9}}+O2(p=H1IoJ7bJv2BgzuiYuWAe1*<4-1=3!>#LtHaxo;HLF52` zT6fgWPQ^Q0Tdk5w0BwOwG@XE7e_Yk@&EzG+xgZP!^B#H}*H7WtR!RNm<3l|_9{Z^K#yTH%}bkq31u5!^0) za6N&@`c<7n!zphPY4Y3)xb0O8^O3zHXUJ6?`e0;q#Y3d{Zhc2nxBkkKH1gI-WRrHl zi5caXo-li0*Jq*lqg1uhB)GCLh~DU0%*G^jk&#%bJAoMF{c7kFLGI5T$&2h5n;t#olk<<=)SEuV2?`s_DpYiQ&AYM<*r2hbPb;r`O zC$Q7wG0A$)f^ei0j2+#*xUMR=2Oos@aM_BQS3J%L3mF-RP!4?$Kj+r1G?TnQW!XkS z9{#@d-s`>zpG#P^D8oIRxi}qo=Dilr;l_m8bh@+ZurxOINp-r}S=Y^wU`MoocPZfZ z70mFJ4eDd*#a*-KTTM3hP3z^e`FT5r3kCJ-)7P5xpAGmSb?ZqcW(wpoh9fut??4d0 zE9>}uYZ0uq2*A9ucD9Y%%ihdUu-!%nIOm$uv4ZDA)U9na`L1M=@mU$7BnD!7V?6g1 zrc|9R1RI{c1ga#`e`31yaa9cI>3%`PR*ru?pJD zYPQhFaU6`eY^(1aayUF5)xzpF`rXC%l{Dvgh!P7G86@KXp0qfqt0L7#_bqsRn^4uQ ztR@?x2XiPKd*_Pu`BP8Q@Q@gnA%q^jqf=at*XFkB!DRn)@w{#sy9%nmHU=PBgrXj`qrtqhA z?;9Goi*7GpWI#r|3@P-j+YMdx>lKkC8(1lF*f|Z()84qt9}iqyUmGicA$`gLnnZ+i z?;|MvYVM<;-&(wut^|t{Z48VZay<%?tUU-MS2LXC?p>g?Iv)<&CZl^H+#^Yge)WfA z=sMNeG=H-grnZJjmLN=rKI9AzJ686Yq_pta2$5n)Q)=J^W+#)l_vmp`t<=JKHz;`g zzq*8EGV#dt_pX>>;ML^Gl}Rm+|JMAc)1cIEZyH;8ns!wq34_~~{5zVC@;m)9`9nfX zs!`Vic**Ce;=YQ}G%ZiU@Lt%9xFTEI32o%^kz_8%qVL8)^&-6U!}hlNt;Ow|O0mzU z!Q zT^EL=e-%k_qfG4`^pS!?1Hwd30uV4g0Iy03MQC_9o6A&hcxuMgv}^5t=HoJ2+(jkK zFpY(gn;DFr#h7Gu$7;V1g|GECxx2lYENm_|`E77MavYt_86*R@zJ9gVY5FIIf3UQj zA5XdlVK|cgU5b)eXAPaZw&NJ89}=x?_bS^&*Ir$U$8Yv^VGu43*6)%JUY`9cww(E? z^2G4w`D$4Cf@^D=4-s5g3Dx2fl=GDC1bX^b^k!vdjLEqN87H}`8ojQTs+Kk~{hnp{ zo+k%#xdU)LPIJXWrFeG#08z4An|AXXc}7l+k?r)Z7;@dkA5jUuRU>yxu(z5vVKWtt z!nzVT+&gz8)~tA*d)pi9T_#wz{fiEY*dPuF>FZN!heolqjWlOy=YSZdNmmYBbw2#( z9@WpoVSB62bqjl`E5oaj+?Pu?z*QIp60NlcXWLT7mKv5WHbtgTyMH??Cnr4)7+lj?F|?(lbdsxns#20O_8bn#sMnv$?ux zY=n`Bo01Phk?Y#MCfileyj^Ew8e#(}WtJfs4+$7KS2zbbJZ7}5ygA{!OINhDi7xLQ zf=I`9@OtMt!6&_S!!Mlu$P#k)0}GklrBVnIB6{InQ!>Ry>J3SFtvz zk}M8J8cg8(jP|KKL8;u`Mg6M68mP$6pOJI8Q&uYSSlX{&ntv`0l*U0s=;cpJo;<;@#HOu9Y+gooXNIxma$RLsUXNp*wkC}35W1kI%Qibbl zbI|-v<9%CK)M3}JE=-aVQ^{Ny(lVqH7oqF*&3PuL;u+2Aq(R=^CEAA{GjKURyw&J5 zOZgSAA&{cuY7@>FWBJ!n94UL`Tia>-=Rj1Qppw`vfsQ>$?rYDK+m|%8J&JT=P8_jT zM=>0ZYk(ICL0HkeuljhLDuHJy0)^`*Uq(#(Gp2Ae4ubS;GLjXo$3?2$i80U zTyhD(`FaY`vecbRB+dKB0Fn>gBd^!ex*d7O(nd~{Wq7mSHSZK&Xucw{(DWOaudMBu zLmI+Cgon=THU{n9r;*dzv~IMEtwF{8tbb^ZCI|svl}P2k5ne5#Nj289YWi&DXO2+o zyl(lIk%5Drdw0!yMdylNPKsGBr*E_j1w>p%(l!=FJ%Pp#;a^FEts0TE*5`*_gN2fN z9euu>R>IUnbM{NNk-X_6B?y6|VCqO9k;Zo8=Fj0&G(8F{O;PO=@8OC`=6R8w{Wu-T z;-D*-aWeT<&EB- z1X0TJp@tE25Hj2DVa#OY5(vP^{A-Kw@5DWJ{ck)^sm&$bta2EVK?ur8wC&3$$~TX_ z^r_*4!?zkdx~0~=1lKoGDFrwF;GD4p1>+vs=Dd2fV>mXCW>B;Cbyri9@n*g?&2oK8 z{?TXiWM=XoI6yc9vB31L{V&CuMvSjBJpdJ!g2MAuTe#&` zRgj}7Ahr`3Vh>#P{0&&uG<$n1m^D|~Ja=~tg-V4gg#4rdfHU;&E6l+`ru&`M`BG48 zPQ&~ms#)rdErzcXJ*4smo^+1{peOi%`E#6g73{jMouO(2ZLP|EndcW$1_C^)<7{IC zJ9_^Bjd}Ns;?uMZFlg6P`Ep1Vq=paOvWDeYxEOWdVR^?rD~8e*JvYR57n+Q(d2KqX z?I+7sMgs=}w?4Tdy;w>yb~xt=R`;W^>|Qp~?k6#8`ZI`Ld6A=zCL~~v8~*?u9+RpCO#xd5pF&KqzQ@Vu?R+=_#ul^{DdGB_gB)E=P=K(`J zibw`C$ru^VFfm@q@Z&~0MT6f;Y~WA?x0gWzqDC^z6)<-(Jd@Z8p=0q1+g$MU`hKx( zi;3g%VVDi5p}5>g=Wyp0Q^TW5(S#ODcK3HCQY4Im>d1PAT>Zc^pXXCfO*`MARkee< zu{VqS8s0F~Z9GNcy-Y(Citr<`W%B^Z$_B!yRnAEu4A+rfYBP9#)MKi$B1Jq7={tD6f!Yym2M?Zb|F^0M@QU zP|~jS@hydlw0DIZ&n%2l<5#7_PVmtK<3?6)@KXqecx~QWO7vjzyN#Kp=zERNPIjmE+laCN{Yn^42n76`|H}EPZ()`Eh~-eI*vkTW3_h5sr^?;gRi!kNTNbqKM(WqYvP-4O3VBk+8$}@| zTb;y~a!zs+9Fx$IileG(@L%c5uAWmf<8roDxEmK32lcNw7m(S=whmrZjy;*l1fE!* z%$j|?qgI8jWBuI4{{VCcA22u_Ye!ZwW*=9S(Z4Kqx<;QQH(%?BV(I}c>Ba|6e;S6u z;U|hAw`7>wzQd>{sN9We%Jm@CTs(>bGj%v4jQ;>i>~!5G%3H1XKf6X4AdW+?-6Rf1 zM_TKliFdS7#ak(gSCg_m1w2M^Mu4 zx9_)-813OC;L1T}z|It7KU(vT5cn%nyVR5Z5!plip;rv7LhwFfN$KhMR$QJ3)^sy$ z+PJMnBqVJCj?~V6Y>s}FwQTCNV=77{(BaH1r3%hlbUN>a3F7IzH+*$y0a<5h zR#_V|2RL7u2;cxo89#+Cqd$Y8(=~ewo7J9MCTN5(f@G1%0KV>ol6K?qtFrjS=(=oa zY$SA8*&fQ88Wr0_;^IVQY!kCflDj;!>m zW$G82vP3=~(Ikd@Hy0A=u}+?3mc*QtIlu(+21h^6uXw*pvW=|c(IF~hkg0S~UQpOA zmLE3*93J(xr&@TIQ`XY=FDQ(8Vl-bdkah|af!CeHSFF$B?-1#>)=f5+G|N{qDY%|} z(mTud+hFc^#!0}ha}AVZ>%*Ef+K+a8);EgsY`&*0O3GC`Eq^1Q@Rx|KZTvATH`c&Q zJf=9Md;+|D%mC-*1E=`aA09=2qj+L#uM9{43c!3m%2x zTd?=Gu-(IM+tbcK${3unAPk)2xi#GUPS&(>;e_#>g}9E+?3;P5bDU%x9Cqo9`rwXh z)sGK0?OuQ6eC)XQnmpJlTHj}@YWC4DKQ?|p>OLaYCAnyIJIUQSJ03|Eg<_rWyTDBFvpX*j(zi8CY5ik__xFnS*3(JZK_#`9#|L2 zX_XV@CvhlQmy@+}dy`tml_<+qbaPk4;v8>#9(8G>+E{6k$8V%ZG;&NKQiEcWM*-WZ zCkMT9y61(wQK9OvvRf^!jDr(AL~b1Y#XR8SoxYH*x-@41@MGScxnMidY zDFhskn;e?%?7Ts!U29U^-}q)(EWEH|Sdd1T+qiw>o!k?h#Qy*)>Wm>b%Jexo=Lqv2 zW#TFP5v3$h_Nh$>%!r+1fq2S)^eiaI67# zK-+RylE_XDGBZ|uf24S|B}<5Of}iUlX`%tm!wCt?Y+?=&uRuDUJJ(y_{{RKau35g3 z;(xT++gri*uv7$=C)nW*8w9H#PJj|?i`dTY3!&RebmJ9Kz08YG3fTB_L$>iBh$WVL zh;JiVVvSXz5Wmih*>z$hKz5bmj-sXUXNzO_o8p^)4tQ|MCY5I3+aQn2kmO~V#&UM_ z2hdbEI<3Bwqa8a-c=dSWl^!WBkO^7{*qm#2{spnpwT~1-scMlM3z=tV ze5eV42VwFSep)!k$`5=JbJn=3sYl&sL@g)nTGd|P@W-^X+xTY7Q-fWeT~7Au-YAaL z3gO*Ajj~Fgl|kG`IrXm`@m`guTiZvq?q=L~+^)^V0+q);hu92PvufH!obl;*UMbY2 zvA$c85sM2c5k>)GPW}QOfR1yT?xpc}fh^^g{{X`VV|cPE+&l4WG$;y=ALd12$-<0e z;}z;Qxp{4K$DL_HT*&yx#5x7vhNaVW?J_Xdmv867p^SrI{uTrb73e_~*IjCG_>Rj> zmsy6{%4JMy-@Q$Zjie4oJdEbON8%%CULx?thPUBDk>A63$#-jQk}^s8ijkASP!D?X z!>zZ6b-fo|n$>P^m6YGv%Ls`YWRaBNeFy*&0OvjHhNO92?V;*nC+%RS*Sv#Jy88v) zjj#4v+QRO9sSIQ^s88N)*(W&Z(!ATnJ{q61J&5lTKr^f69f60<%aw1Zr-idAv4DEAIe3VYyGx(&SREyA)1@oMv^ zJpAZ45s-L0bI0Lcsp8)aN#tBEiy@oJa9AflE_;l6_w=tH)fW2Ie{w+I&J!aX@(-8H3cIuM)~dEXC}Sy--dB5t zBsnUb4?LU>Ym0`)!(Y>4)~{WnDFBX0;9e1W0?p*J ze|UlhRE}^*PSwXwD$VsqlWSWZtz^0%gM3GE;r)6PztYw)WERX=Hu1hUbPS;F;FWKB zlU$2S)3giycShCJTY1q5Ema8fnm|l!6|ht%DtJ9O;<(Gd4PNM%@#>nYJhr!HMV0N& z^=SGmx$A;?=LhLn8uMCCvd094t>Q@i2O~Hn53M+1)M|T8ZqYR=xxp^RG!v)UW`*0C zh-Jd^OJjrhX1;j4R@WbR--|bx@7&Rjmw9eu<)Pb?ojt^ctVD!({xU*?a5L~GAa1&R%Jmbdy0Nb7)*R6G1 z=ypW6Qrj>``IVCyL)QZXAaXe1*R*Iq5+LwqulekWRnJpg-_T@lk&I1V) z@Ns&KB>iW>rb^Sex>9+-DLfc|?Z;>B8fjB1}M{(A;`|k?eT51;_6xFVN$*VvQ z*kpDga{mB2glzu+t8#i|;PnQUUye~~@7_!L{=CS{DEn2*(E3;6Cy6w%;q=#Uku}c_ z>WLMTAyU#?GL|j78NmsLM#%ZPbgw$M@HK?m1KoIb^lJ7N@q-bU{bDEHVYFoKQO*bi z^cko89`OtwC$!XjDS3PLd#jaIcaSfV-!M|>hXA-a8RH5`9dbRh!#W>`bj@p9vePBg z=YbB(sH9P5@wt(d6;KZRDBaX64u>b7rsPc0rs{IPC@KOD+^H5G}{%59W;p{n=&cRTaL%QeY5cg;OB<5eO}J$7}`Bb z^^77oKI_PzH_W6CaB-ZB;=XC|r^3$=cw+A6cwjdch%+RR0^Um>;dT4V>zrb_-Uf8q zP*&Fe5PPG5!(dz^sZM< z)fU>_tncJzfRMpQIU}WN_(BM-b#pt!Wq~(lEb>9m6iTC7zJ^i5^Ge9}&j@@-zSg`Y zsQ6!2jw$D}j^g^(ciNH%oGelSjA!Lya0losZ^3tZrj_BTf3VgIg^EuyX@dhQu>^o) zCwBv;2P9;3ULE3r;mcWMx6?>S>=_!ZH`bj*qa|JXK4WQ_*V(x z=%LYW($?xYr;0_B{UJ#$`^Czh4-Bo2X`U_d9Qv-QG=evR&gs#&4x3q3Sd0uFm^IUQ zTSNZN)RqB1;Je+?Dx=#|IyccE1VyXRGMnY15*=iaSZR3Dgb(l1_FWLEN}(3}dZvo+t23 zcCgv%ns%!duBdI{xP;q{vF%_(CQ+E~80Uf0r!=u@x}D~gB$rS@Z>i}I=FM`W{yrjX zuuzx*w=i$Op4G)#ikvh$;Wrk2nd2XZX|DKk&sx@Dd9>@%5^3^VxA3ADnlShZ7-hD` z>IOP-&3=5|_@l)B4r#PY3zGygqNB*FW0Xd&9aJ|^2~|1t<2`HZPY`&bPXcL{@`E&T zSlo-&ww+5_B$sX#ouW8++0kR*<#yyQ4ngy;7r%ylO{QwH+1W>FcRj7V@wUKWnr3(0 zZT|BjY}x=UL1EBzuMV<>Hj|Ch`CpO7h$NPTJ)Hs5{6RZrSc@s|eFhFz71wlezRSfi!Df8^hCh zk4(CFDDo|1au#tUJ{fd-Q7WSBDmP>Qdjc!vYp7vPY0$5Jo8?O;lGGpHno-w zKH@mEb(GUCAS;$OPo(rQ#Eo`xERWuIzms@ruXb>*-NTZ5E|xs7Y%ysc;uC zi6U))Pa5Tr<$=yH!@hG~72)em2SV`0zO`wq*=kyWyp3eDhBs$e_MUeTIb*;W#&C1m zy6+w8-XPaJ72*iBO$jve*G(X~h^u*OhvkQ$ATC?KL(p|UKln4^6uuI$xzlEZO>J`E z%dp|H2q1!Z;~lY8Tj2Lq$d0d9W4pca&Ax{zM9^WFMR4XAS(zq|CMAeqH>Vte2*^Iw z%J_rC`Yp^;+(&0@66*p>Q!^RkbjLp_3xn5?dGzM3%i|3sLpA&|?|IyZM?`m$H|nLa zxNv&sHRYP6j*SJ;xv-yfPlrg~mrnaz*V8qf6&CK(Luu@F+P0Bnu1Ec?;JJi$<^@@- z?j+3dNC(UTzzn(jt?9w(T!oG1vtt;!h32T?FqTW3IeyN_q>O(X z9s-5;{HsRN3(ZR2Xd)mPTF+EVRy_s0XW~syN&f(k=A0yBc2##M zQcnjQVD-md_2`_J+8392#KTKw_o{H?&&AkrK zRg%K$XfMv1+IvVBEfM)2CzFCt70<7SQpXpo1IZekkC2?6!!>HlTh+8}LOW9e$^$Zp zFBvdlo7Jlq`$2I6tsToG`FqB$) zlfu(mNHTd|K{N^FX2Cm@wodMHYR&JKrC4Jxl2B&@@v3u`!mwSZ+KE_Y3bqtx|8xR+CmHpbqp6p?^>isfB|3JVjw5d>Of>~Ku&Sfiu6wi`Q8-qeVx7BS14{{ z3uwf$%B9ZIQ)vTtY!i%E&sJK5_E%6{S~*D}Wo09=2ZQ)muK1(kj;Z3gbj!U?MUvx7 z0V0`{E4qQv$m@g1J$dG?mLf4vnHXX)(wvtr-A`Ni&tZ9@&7|r&bIu^t*saaX#_r}6Juz-LY9kzgenLN~eX-TMsJTJ4=9L=ujxOdy+q1aEZb5FLOL=F5z{{W3= ztc4J&3##PFLf!jRQLm?w^>xzcz@$YUt=No=i zP&)9V6&f(dB8fIsB9Ubaj!Dic$Ru(4RZ+Bq+|;4YK3@D9!cuQy)KQ@r^5g-?IT^-t z)~y!Z&unz8n59%~9;ZL8U5;qa-s(H{sF2Ykg&Zl!>r&>-A{a?Ba99z=LS#YTBBL&` z{oj<1Ydf*@E*rSwV9Orn>B!?b>s`*2bjjqmyq!^J0d|aq1fEYpl0fyZH*YfJ9l79h ziqW^4&dM}Mi!`N!DZnLtdew5dD;de#Q|TMo{vTVz6zO#%+)o)EO5vU}gM+ztsLARw z#=Ik6RC(1?=TOJy;EtKBCUDQZwlZ_ZNg4F3FzU{Mt>=VI6CCr&81y}BIyh%d=eXQ^E7%7mG&s_E%ovV@*9_^3XruHP(E|%j_Gh0gS8<2NQaC6@{CyJwa zZL3(r8$t`iChe@G-~rbaje9JS&fy7Dz`?=BM>y+Uc7du#8pUru*ZEm_9Se+CqUXyL z(a&qj#lH{yK-ctW)+l7%6fPV`Al#*wp+7<^c=)eh@rCEu?4g1QSQe3i^3;GiEJ@lc ziqtf_jW+aJxK~$D;gjYCNcQ}yt<9uxz(P3;*~teO9fuXmE=haKbD>4-&0S5kJttLL zE31UPD07Hg%|oBz7~>+g?m}qr=UUUk%QQ;R2@VO#^&E_21a<9PHlKZYr`#pgsRhx# zPSqr8ZU}N9ExAdzPA7!}I4aMs0X3jR?E>E!Hv^6Mn#IyT8oA!xs3w-aKD;)Ie zU2&+ANavJZ$3gZ4(jrYkr8f$|2+j|dTyn*WK$b}pY=anF^OJ&l)-Io>Uuw3p7n^OoOkZx()cSE% zZl|&G~9 z0Q{s7aCrQ&UAKk2HuK3WMVrl(ZCKOqoyYM5rD;dv2yQOtwziAyjWZ^8;v$H>M(^-7 z+W!E;U!mxh-gT{vmM<~mYsj0 zdDBLY^GNZSfpa8#NFj+Q1mN+Ee}*=jE`@fgFJY0KMm)t1K4%?V6M&-}V+N{RG!a-I zu*OuQo%`4j-kV2Uf!79zLEg+#YoWF+G&}3PJ4LmUOIrx=*E7hid6!ybJ-`d3c|i*aeCEYc^K&4&rQ zEU|;h#}wq{3u;^xWS)iFOFc8}(nTDPb8#Z>0#aka?nh8hTJ1Eoy|lJ5+myFZp`1K{ z$X&o?R02yLc<<7@#vc*gY3XtHO^}%v%iXgrv5s+*)1b~O71Z^sVApWnNt?1Hkb=s0 z41u1Wr}LrIt9=<>&K9wE#oDc&p!XLHjAde~fxh-j5>KLlJ9e&?%Hrw#IU|-?_M||g z0m}i~*8{n(Yr~L%t;KbCL&!tPA(cZa1N=l1Gso*)4~zA?8*8y)U{#E&Kh^WOpC<(N z#&KKoHj=T+D5X0b#*uMrcXYP*V-JI{l6LhaM;?dyR<@{Q^4i(M?v7tEra;>O0E`^) z4;||o(#q!9BfPmH-dPD%FW6_P@A_8E^0(V!ng?5pcw-{rh88&i+&67u!6T;`s^(*9 zT;iigxws1mE#JdrHW?~TE-SJ@`dUD0N1NFR)yk`?#9l`oM7Nk9S2-Ze|~|d^HmCfpl}cQ zH1xQaPqY@`i4{)n8_kS~>Czd|>>)NmAi>L{jTQ`w*uKX6~80tYF`*Bt^O)gt^ zic5ql?7N&2PFNH9X0AzZadW3EmbU8*k%NX_I2`1+Px0+4~Fi=t3!7>pp*ShA1jldx#`$eb;Oo>cAxfJcRqWr*^b;` zarKv`5XVL|K2+BR%bWiE4yuPSc>0V;@T{?oDdu=d29tZ1fHLbbo#%DU&L2~PL5x)+1ROy+Azht z=cjVr&j6b9`yC2@D(lE+k}GYj%%d1n)br5duXul1i%!(1wX(KHmDg&^a7kn;bCHZF z&rU(7%hcPN=VPJ&0A|6b-09c%(%UWEsvQvIy8=NV4{it4=DBMaw4r%(6prEmT#qq` z+)qWo9Fz6MWlev5r`#LZQ4F#(Fy6a|Cy|4J`qXyX1}2wj!|?Ow(?pv`=lHm z_^&j*x{@ox8PrP?4YDcD0PG0QZ~nbgm9DR5NkeYOet=`WX$iRMig1jyXHjF~{cB9i zTU;|G!j)vn!mDTQ_fz!iRc&=)1;xe8P`$<7%DOJ@e6ZhnyJX`&wT%^=_e{YQ;ymTE z!6)0$*2bG)V3s?DQqnIuZaT(UI0M>-iKwli=z0#TZ>j1bZs&NC zC>#xmyUcYTDv_V!^{!%FPUb7-xPnO$Q0@SB^}zglS5z%D-6u`^d@NexNWdGHfuDT! z9<|2YUO{;wSQGA$0UUjMRve3&x3EIDDzh4wFR9BUlD=O%i@Riz^)(2#mPTe~8BzCv z(r|}g58iI86*|}?Qc$NbgZm|-NxP9$rLFhsv{wLkX62z z=~4M@G&_ttlykX13=CC>w9B_s6S*qGAx2JmarLdMUpCSR?ZWL{+fM!%k?T#cIolW= z=U~K;*~Wc;`rYeM?aXCXQaBg^Paj{-x*bPLn#v1(X5KjEx4Fq-8-`$d9FO5OlMSSL zmD-7A7UEa=5cA3H{(0h^@2MzQ{@VyvwjmLCU84k!`Sq@YPIeJA_c>;6cwP_J)A6k9 zNi_JbG@PzwS*Q{lHFVFWN64(@$+ywX3soz;)zB}QhCwimT_s;vN^hEA~fiS zjo6~<@6yAn%tfH>YUg8PkDu-f!c|gxUjZnC_l2-Di zA%YRg40PkBahmlFS4Gh6%Pe;UG7t)}2e%lkYlMtu>?!A%(tWlW_!sbH^tlu;vZ?9V|N9dO2jcyjih?#u=TC!SBtfo<6^SRLbkUwyicXge&*?I?O`%Q zu&g8uzc?fuWrsuG*0KCk;rs1gEh<~c;z?0Zgp3tdDyjxYxF4NKedD79A*Q#E<|b^G zLPIQ@2v$E#=DBNs8d@%ucy)Wg_fHz6EZD?ZIL-%CgU6;S>f&J)?;SWiHYHm^?yura zb5qo#@VvI`ZEmN_xF~?P2RZA(QNY0*3fk~&+FO5UCZDLfK_34A+|Gqrw&!aONF0ow zYtLrX^mwc@4cD7IjJ|Aug2SmKdvwow)iatO%uuG~Eem15+UhdcIkT7!D_JnrV- zT)fpJ)vnj~l1cW4br=u0uk0FEys^?X8+){~#Cw(gX%ux~ z*w>Kwr%JoiCWgY@Tp18egOCVfdS|vpanxqC;T2|%!%VQ#Zy~&~xr>%n5IO$sJ0n!350z0K1QmGiPE&eC6W5hxYc` zmCUxXY=SW5fc_UB!^f?3)S{HRqG1{6l#RK3X9lOHvstlcE--*{X5J}!M2j$DJ1iZ@GC1)(JgGGI_{5mATt8Yfd1}J zlxz+G^(1Dm>RLvps9Q;4Zxm)rY|g6VErZzob6jou3&?Ih&uMdIe*|k34Gw&nO1I6B zqpk_T^&g+mIOvZmb(NY&Mey~lbvwJcHR#IQnLMS*D#+i(x3?S)ezn%$+-V*IyqfVf z1eiMl=%X?rTsG228O3J!f8q7S`c!l3S7@P?uB6>CPrRTUj-#N-uR7O!H>_EktDA_U zzk(zvw=uT$D!^d%>6AZ$!1!;kJ%zOT|`Vr)w)5<8K5JUMTk71JZPzF49?IhgO)X%NsK?rwRcl z?&a8$Ij>*wmG+e04!6@{TYHmjvIInv%y`QuB#e@|s92w62NYrTbyBPvS69^VtzJz& z;`-ObI(oEsmlAoh#9MHPqhkbPki(wU*uf0f^2>3jvc)C9-s*tiN~tGk#q7KNi- zB+SLq?hwxi8`WHY4p?NIjF31UwcA*w<$!DGnIeisc8HYG>s4o3j_+7`HOTXvF}~gu8nV|Tgj@l%?P#g@)L52HvpNz91=$& zuj$w8duc6RD! zC5e^n&zu=G3%lvH8R9deJ1m5Z;Qs*is;!hw2BAIlFas200tY0%TpYUN847x5)OD|H zxYEAQX3*F{9lw_5Sz>>^AeXChN#h?(8t5$i32SYqE~`91m{K_|C66p4N!TDQ$pB>Z zMmrI z?mI~Vh{iY_tKDyWBk=ZXAt#6A53AY8uRL=N$o^m?3=fwdE=N5pTS{#T^5W9hQj9E< z+xbk8Mij=xpOt#?(39G-qlAY#zQ!*&bEM}8yY^=T;%|n!r-Pu5;>dZHn~wI4w;0P{ zZf@fv6=%bicTwEKE!>YJF5h^4?2*?#)#`T>+vwL4X!@#UzA$mtz3xR7ba|9<6)HjVedhlFies0-mUdTcpFW~V z5)M>>$zy|@l0|tBiZsU5Zs*kW#7mLo#Pc1ch;6uhgTVtMr{`YpsOivOMWc)7j`k_x zWs=etCP-RL9j}pqSdIwJF8LQT#FR`nt&`L8K#~By^=Y}MK?_4ShQssIcwLDLQLWB;z;VPQZ{gJbJqN2rTib% zber8@M!(eTZX3&cYgu7g0Fm%nJkCB<1mvE6xvvwsTQd?RiZ`FP1)Z~#-1Op&Qr}jJ z*LxWr)#eBfI9V}}54jyHuJCjd%W?K~iZn)^6%$N_h$QvE>OE_wG@VE9ZgbL#r3RC~ zsex-Gn}b-}vNR|QuyV|$a0xsN4A;AL3&jTZl;=Yc&@tmF%Ay#oJ%7KJjxNv=aJ*&q2SK^IdR<(O6r7&sjDRqE- z)eqc`0XXkmd8>nxY3g+4p3{}9XxT$Z@m#uCy3_PqlMSAsAD43!i@gwV3*f04J&5^+ zI@VRo+T1f**v})#r*75ztU6Svu-K`~8yI}rgAZ6EK$3Db-!}0X19v{)0 zQ;Om{H(_%cmt2)t$^c6O#Ec#?J%xE(&fKS?%LLqj-d?5oihE^@tVS1(5@N~00gopQ zo=z|irFzGLbyb^Eu!m4Vs9V5{8_Z*v+zfzAaCzhdUVo!#6YAD;>Tq1ZS{=qgG`m|U z2^(@o?byJ<&T;B1Le?aPOk9y=aU2XpiVC!VV;wr0(uGF}Xk&sZla9F<_pZt>6lj`9hbMr9}-L{hK))Pjhp&WwfIC2Q; zGuFAQrrpujw$St~OT)Kb7O}C^eoKgMet*-R%vTD1x!s{Zw;tG@}1P+F`HLFcl`%yP~OyJ9^lyoe?cX^o% zNa!+iTE?e3(BM&&ZmPcLd2QpXhto_~2#FM+ByJZiyBHzC&wAoD6)J#BOx(` z`Eo$u^%(Z9A6(IVap4mk_3F(B+5ndX28@IB$Q%)xtE1~0-l40&k;924KPEGRM_x^C zqD+A9mVVTS5Rm0#ol$Pj#_oM()8uWqxC!Ft7{cN(Ui*G+PU zW{JiGVMokH(g*}}^y0ld6rAICx;%VFE7;GLQPc509`W|C;cM>@wAL1F3{i$j9w`A1 z;BmAOfCod@HIX-r?(S@?G;1qZEv;Y*9EAo+V->H7mPkGBU{6F3r0b zogWtV+ew}@$__tj#Yg63Y zwSWq?uM;rBf=PD=YMl1Ze_HS_3fXD$>-tTM%Ppja;W0FA^KJ)`kVepdF<+t9dS;hn z6sc~4OOOPT$l$xN^l?JcS!Sx{P$sQb&HimDNE!x|ZjDQ6fnR3+0qk^I)EynD6@T$E{oW5Q}}PSxWh7+^#tT z+~+-oQM}irw1ljZgr9w(s};C&{`$i>?t9 zO4Z|Jy$|Hbq+pg_G6!CI;=4q+)U{VlJtL4=+mE(wWIHA?ocx=x8C3E}?l|Z(CyUoj z@dt@4?eyDt68`Ljl5@izMnEH{923}mYiGnMpm<_fr_}FezPh%OD`;VZb0ka&C085( z#PTuJ8vKunvo(jQEEO4Dt=jy*%>C!X?2p>ghG&X{jrELQ=jqjd!yMkVtlMc(TE(hL zmNQ>Qh8>HPA*9-}XQAtZj@dn{fbj>3{9Suv9BBo;)w;O=%s?~0UnwG2BO_^kc?1E; z9OK)kW2#$tZ^p=)mZq#s-=dg|-$#yLRtx2JH050A{+~Vk_-CT7$!OmX<(>whOz! zS~N|}I3zCO7_lsR=Z=*;7CIazO;1_4wzsyKghELHDAKRYNzVgtCusVL*(A-UR_jxb z_;sdhmjQKXgF`Zn_WuC9%PD0Jj!sVGAdF|82sp1*@ZW*;Ii|PN^=(opjpUaXM%jlp z%yJ_@7-#3)NC5U9N=5MXqIkECd_k`Gcf>lDl_sBW9Q$Iq zSxld~-}6LTE(l}DC$|UIyInH(!dG4((hrSpZX?uQI2E2IR)ynW&E>Lf1$O6d0ps(> zt9(W9o{Ot^QrBMB=UC^qEgBe5ZIx##LEJ|;3O%{6m%btReRM19Zyf!;JJpKWkrCJ{ zJh7-dwhll5<2dR)>p0ChT@dRh1r&O(k904F9y5{+FF=y(Nxrg~;IM>PE5~svxbp~- zGD*nC89W^KuOhh6wXcR=D3bdB0PGhtp?huZiB+Ru6e~i-c9W5YBN)d@>Fs_YcsA2X zv)2;YwHxdB8tNywP^ksm{rrGJf^mXJTw@$_pW%nOzH46*YsSV4YuBAx+3kmwH`#-; z4cIwyysL6aIL}Pv(r?~6aPyrwS!%q`ZtxC~@R!FrTzaOx1k>K$#!>LX6@itC9DsN` zfx%*U7z4e0-{Wr%c%R`XiLUHTyztmxx7h7!^A{uYo zAh(ZG5+qiS<`3Tja>~C(A%Nq7UcqOlHM_$9028i_5_3HE<)9e{d%Q?Ou>S7R zfsUkc-;YnzJVWA*TSGdQvSG1{>~k`oH_T>FEAIJV?G2Nk$E{^5(dD(S&d5}f)jKA9 zt*cnX*G3&Sd2E|cyV)`q3>GkQ3vFC6+q*2SgIYc;m+jiEn9#K=nPIv}t?b0uFf+!# zGdA39U=-j0PJJu2u(`F=G%L5VjvKjbVk1#qioYh+Ran3wvYeOX{Ji!x;5zq>Z#+L^ zZ>CwgOJ@^HJScGLlDoN91h2}$8yQk_^{z_w7b}V1hURlk9{b_155}ymt=R}+whJxP zmhY0McHDwVe2TSv3D{0sjUej;jS-eT$8{-z~u5Bb3xg?Tdj0TZO{v`xw z2Rzr4%H=B_qkO3H{YO;r{{V^aH5*R?>FZ=QTW!r241P<**;i0ml$T$;2Tn+?H%-uW zEfdC;a%-`hSgs6BKiT%ri+KPWmn5%lnHzdnu=rWLBjGzW*Dnlds-%V+RgN;uT}LuV zH-!o}44=qTb^ibrrmJl=%>GkNJ-3q_=O!;L4hUyvXASaz0XQ7-%~X_JNP}^emd1~c zHO26>OD@Q4}U)~`BlYbZ_9=(YKjtzXxadMXya|>wH8;J;LNW*UF#{+}f zy%SNq@d#@fZ!PDDNdS~@RxsQxzTvrZ!zmmS&ozgojS+Q()a_gB(@#2xQdKe}JG+7P z?s^K&RU224v{G6l1`QSs7}#G)X_cBY9I?0F^G-(L`0^^=uj3tiN_!0@^9{9x%_J+a zLxU+&a=-$9=-{5!-F!gT;eQZm@mWNRrzi$ZhyVbU)S#7Tp-%;|$50`-^-cS?Moa374 zwGC`|k428>T=ExFu#q8#;6Km3K;v=bj(8rU^W&`bXm!60+ulb6Fa3nlERd1=!vTD! z&y1alPhK!Rv00Y7J?D$>uJnBhDZa-mn~P%mL0NDzqaSD_Za zqTOE4b9WSaba7Z+UcZ)?Q0|N|1cv*ZW%qpDa4YI>hWej~CDA8MdfUo)EacPPQsm1# z*7AJ0XFPdo%E|!%jOUgW^0m)~yhY&+BH9lTTFVR)-XF7&*pXca&f7D%3^%rTuA9SJ zmx>RIE}(#!?)Bk_fUmQ{{UrzLes=!I1(zbJFywu%1Jv$M*_GDZ;KZ?ABnZdyjy7H+GuQ+Blow1 zhhv^fqH^e$7qv5SmT_013!*LT8Wo|LFs-hO%x3AK@t5EQ4k=vxw+r7Fl-2P(WlLQV&eCM`n zk<~msE}jWVV}0C!G8>;!k4kc;;;uS%<0ql#t{65L5C=+(r~?`6(z-aTzSu}ORs`@* zH9~7a1MFebtz~m-nJ5@!mN-9+ZfQEhX_p><&5{WDYc#@nWdw?@R4@2-q~m=VP?JvR z=O~JW?aZ4*U|Kj~E{P^IRNk=yzvop7pV(-r6L< z+{fk^$>csy5 zVn_D1SzcvD+m%)T6IS$36fqv&z%SF~II0J6Hv1nf?rHa5e-bKRdnj}+(;X?GLFX)F_b=&gWCvlL>loD2qD4l{ylsF%fF z4mKxJzJOoBbwBUnM{Urrln78j&kfVCJw3c)Np9{fwA;&h(R`^|8KIXLlrwH8rW=w- zJw|IMR=m^h^$UTg+qJ8i3~d?{gN_M3JBr^6bqgHWmHWoep>@4;z&h83byd+dE4$l? zt?bq)ZvYP@k+@?Vl5z?l&Ik%m9dXZrH;ryAl{A~jR~maTx7c{(hQ@!o2;#U+TH{gE zZlkrgMu_2L#yaO1`qsvnwz{Mfi>T2i00QndpHqT(9MsDSru7o3%CtB;xi4;=&n$)6 z$X=U|B;(ephCrC)Fg4oGWoKa^^6mj?cOxp`?Ih#*bgGxyO|Eyg;20mBMnPfxs@hP{ zah1+dUB_~2+&6N-!O)O?wR+P=xw~@}s`;IIbpzMwPM<)#fH67a@asv+FGF2-v0^Pi zNOzxbV`gD~)R#n4u5ysDjF;^#? zZO(DUV;X5a%-s399JG>dmnfxT>Q6y*d~CCfN}^UIS11f*%_v1$}>i|kL^+U-|B-6#PR^oTzglpY91HSqSG5v zveqCnNg@bfD0vUZ@Rnhm=bw7ibV=CNEI1Wa&SgL`W~XG zO3y+nLAz>oTDFUMW_+unq2q;u7^DuYz+___jE`JbCW7YH)uFgW9(l^SJgBjkECzOi+dXko z5)t!~RX_vUxxM@Pel(%7xyEr##_GnKA5UqLd^f(kv62l^{{Tw8w^S)1hB@Khp15qB z`-8_?wQ6PXwe{||;hW)jUTj-$=$N1A^3{)$Ab(1Shjvbe7>=pN|dpTA{RgmyV$n~O5!-~5tTqH5tMJ2oC zixp)&k;hzmR;83u+(rA99W(FwRz#MdT`^O(GTa{6t@z~fVs*0_eYo7cz3V%dDA>V} zJ4#RYPc%Cw-I)2S(JtQ6z8fpsK!)x+^@{3Ezc^j4(Vm&X$r<+NwRx?yo59>ZVa98A zm9#mj&iA?|jtN~$EA89*)QbUjCESGs0#AC-iW532$B(DKxvP`gC7pxGI8w|;)Xq+7 zE^78OKEZPX@3&$*gWi+Lc_s5cW(S-TlgD0bqSBeK#!EvGPysR?N6>XO(AoG(_Gf$T zK4>o@jGggD;bc+Q8(Rea6-mWCOdalV+EtXg)$-Ux$s2_`GBLP}oO_e%YLu`#Goc$@ z307Z14Ru|tzVpx(7etxyQT5Cd8@3{|`z$|Eqq#!Be zb*X%bWp6Ed4svR9Y$0A`1oy=fnl*~BAyJXs_NSKEJwc~Q7njK(kUMcz{LK8OuxO<8 zAG~1Wzgk~0fyg<{GlszFnsenpcfrBxI#OaE<`K_&esX#5imtgJ^HP9Is(@Irz{gzn z;+H8`(6)~%93z$72sq;--k%XUJBQ;$akB0b4W&-f4_x=8cM5PiVwLR0WXp=d&c!~w z{VAkm0od_X%R~`cEbk`-8kJcS=5FJPu6J@=G|=cQyg_%T+sSKexK;#j1CyWY?^zP- zcQ-`&`-meM&r#HM_ccJbnUmOY$86LlH#~wdk5B7EY3j)2Xwnw}l}f0}j=t3*OSp+& zj(stXD>60_239z4Zm063X=WevU*sQwYk&2x=VSH7Tn)~ww-Aji+#JXxDZL&Pe4iFpP;N+FC|5F zjDREnH*i2XAFX4AmUQzsXR#kjL@dkY?Ip9$M*s?rQte{*oz+<(19f!KBq+|v4}OB8b%C?Hf(Aj(F;*hBxse0pDwWPj>IFsml#v$ZW4Cvx9NfIpgc? zTf7ukEK6Q)n&MnIIehDhQ-=B7~`DvHLj_q=;|KL zgI!_1ZQGNn106ect~%o6NqioEnS%oRMgjc2y(*(5-lRVx)4U57k$ZObw^uDU++6;dnR$NFn_;jjlJXTSsy_fvLE5vfVY`jm2)WvF z&N5UJ)3EDZ#Fo(6=w&SBV68t>!6+9YzZ06|W7LWVjK07eJ~7n#{uPfqyJqoCrE^}x z!pFwy2>Yw%t``BmKnfeeYvdMZto{^TRUh<(#It6OLqWhl!hssZuZFSOL250 zW@5~USd>iVQFFlj2NgxGa}uNAupIMLGOj*j#(inqQ%I{LOkK41h2(GsHsB6UI&`k0 z-tnyNQtH5=mCp6vfr!T=liVNHxE;N5ljv&5X;D-rau2UHvPr8lB${_d#pUesUj4T0 z2^cm=Vq25XIrpvjwJkE|MwSbUW9Kx1{L}$(fZ&W{9Xfwn<{^zj38qGI+#hN#B%1LS zD^)PzzEO+}eif`~ryCsdpDVemtHW(;Wejl0&eE2Ve}z>6+BnBj25S=16q%Wc+Kb62 z*0wKVl1nJ=F4+X*5tT*$M$KE}*oxF~*UmB-)q&C|rdc4oN)M7ing9`I2ClCpqUB?rUg|F%~SL5hu-# z)iS58%Tq0AT8*~bxLO!prI&K~su-&6BahOsZ=}lH+d7Ot+}qFqPajH>TWpmHm3B}D z1~c{POF)~+;|ZM5jEY{%J^0dTw9sXK}9*QZLa zYp3dVT4v^0ofr3t8;JsA8R^rWndkDZa#JO(>dSh~DLX(=Gsbx1ujyFwU6!gn(O1M5 zx{c(5YpaOv26MF+?&q8zZ)&%tY9P%Vg%rgUie-&}!Hl1qk3cKYE&LIutgRf=%R5XL ze#FiMhdBUeoO+R2arj5WI)0KR_)!m%C1ejNfMvc_)O7d`j zN`7WjrklCfUbd&F>AIGJ^QEXVGVUM)D=Eec5t1-CuP%@6)|X~SA*3U4Y-EtbAIiI& z!>Y|0x_O#VTbX!0LGz))4!5A@Aa=&(Vs}uqLK-2V@qlG z2;l^I%FzJcVQv=$j+rOE5P@szlMD&UoXlX_{r&7V_GHL2Mj)oYO8^Y;;;i zm8!hR=m-d>vCao>0q4^-TU*xkQ*g?GW0P(U)dMO9Ip7SD?V9wt@9ga~6)zw9Ox;S3 zND4vkj!)xWBX<@50Q`MSn23fd3BksHJPMery+Si~A-0TN$s$}gmc(Q^&e4JFD$F*} z+t0FD0Z?)=&synhbhce0T~0(kP5=zU89D4vwPIUC1lJy8oCL|q>w(2k?)sNCo5=2T z_-(8sbur{QX3qTd^aJp$tsd0Irr@Y0fgb#N*G_GRmI5d$_$uA-Kf=1LE5iDPylr%) z5w{18j@*%sah~|+9@H(YXMIj8^G=#bpuI&V-bO0ULHS4=^Nx6?UPGv@yisgEMaT;g zJqR9{<088s5ZT>nHUh>%3YRh?smd@o91)Ozn66Pi)8w_Bj>?W#D0^qP_xGlmT*MZ( zTAhP2F54BhxC3z<emf z;=3IqOR~EOZ9Io`#06q96^QAKcd2Z&$z-$BG`P*Y+rVhbjl&1cBN^m-_8lvNo5D$W z(g)4H8|GK)J$8(8e;Vq%M{{Q#{iU_gm8P~nS}_{~m2bU+o|qY`w|7!r+_k;TjckR$ zk(hj;usWO`zO+Y8Oyz!uK%Wi#3!zyFv#7N#aR#?>fLRk|~sko>9mc<13DT#8n$jW9=6<(G7+Uk}3=``jscAuX@SN zy$z)sE2CQT!}01<`8qwKFhE_tZc6q59{&KAYmvFKxzJ^~7Z%(qlxXBq4r_xc)d#2DYk7eiG^k~D(VQKD4}?}B+_-vs(}tRpXa z&to2WCuVq#n>PDl%aTY*x*RMX+lVry7?OiN79-DoqyIRW{N)&>K0-im05`WKH=`J;> zb&FW+u5JirU}6P!0gj*pfO__>6Lp}}FgHZYpFFuBW7m#wKN{px|CuPkVPjEWl``KKA9`e=T@$5ZJ~@#vWAL$v}GI+dt?AR zcNJbm)1i(QmHg;-Gs}~-Db5BCa85bL6x9{F8?5$h)mxu8Pe^2lEXczwzc4rh{O7H4 zUMjdMB6#;Kv9234L?ZNZi5xFX-<+T!NBTxCmed>y#D~IHFnQISBv;gBTlwq zDrvVONOga-#T;8e@|rdWEx4Y(ovW~q!5Y_yC7MsQ$(tr<&hf78$0>aZww}Jee!!m}vhHPNSnc+w~f|3q>v0fkJ6tfrX+IongW&}j6 zSTC+K+n=p>n%doI_XazMj%epOTckUYfE_YB^V6+xmX^`#+KSrT$f&O;4&N$+&~kbX zmFG@Roav;!+oDej!>miLDpt7}58kCUf<4wL1+bXjSS3W8?rtEz#0`cXI?v4{nkXzjwl$jR=kf%bx zp5EiFS=V)cI`#>jMDoC;P{>IbJ+YpHwPSsVeWQ5EIXyaK)}^}8Zf`*a#9mW?vjRvA z58XB7!Yw-cjFIofdf$R!xzhEyEw5E{`1K_w zDH!E9L;+!wj(O?tT<^o}e#^spEyc#D`B|h4kt1SEuK?qr9QyXILi@#++J}iC@*YW` zThTJ7RZ%AdeMmgfMp3=Vl&0OSq5shMO2fo+_-f|!P}Gs8if9Re9OpcY1CH3PdrZ|Y z^^Im3?Cqqs2n3Qy7!?Y6Jap)44L4KM^>sE9xSB)6*OpjXgseF5Q_D0S*<@;7n_ax&P z{3h-6VF_gUN`De4(2;#&gv4t6mP)pwo3m)^8F(0>)R|#&`|t z2;#Az)!$LsEQ+e?yK_O;wrACcJ?!v68^4qbqujtk~MxASQbn`)Z zIY}W1{{S$Iec;MR0~p10dY6lBJY%7)j;A{5cQ)Q#wV*)E^CGFhG6lfsI-aJpFC?_p zuN{0vcunD8S>#>J>HuA!3@-q2)84dGPE9_-U+nu~a@vFJjae0>jbkTkFFz?^!6UH6 zdXSBhzUR;4o!*CEqg&oxX^=LcE+&=>XJIoCujLE`S7Z0N10L0heXCxki>VD6=JIY* zNbYTrGi{GKCnOQHH+=W6P@hQFo*fIrci^P3$M%V3CvGB>7>MJOw{ILCYKMt+Z9~K9 zb)xuw#?)G@rqVZ_nqHN8gWH?q+pl1cXf z>l&8ax!@ce=RK>_blpqHlJ@(=7IXcQCGs~f$mww1I_HteBDvTi)czjdo9hH&Jn@yB zDk)qs`GDm6b`^2_cRkLPbK#rYHMfR#X;x7d*(GKpX??`wo~@pOylDH6UD5Q_IjSV7 z#Wei&^F0dtUbNNW)3qit8?v5N)3V@Vbt`ELf6Z_m2}6rhFrpUMrGQ~ zpIm1LJuAaB4JPjBHR-yF+8c7^Vrh1{AP!DJ&m;4%v0%{R)qWJdvkYPz%NGeWPu19Z zXM@K-*1dWaRY+b(or;3PHBD-so`zS66T{j@nRO1G7VC?*j$27&n*t^W=E?v|?(NSN z$k} z*(JKb*D_d$)$RaT#E#3c$=VKZz#N`>*N4S6r(&rkppp_nbY%H(r>O)H+*h!8Z$~=U zhVJxb)8~r*Rr6MPc@hj0fs9~+20cx3_WlOd7C%1VD?u5+Rmml=PTyl*Jm}V(lw!9& zhKi$34R$z*C42Zh+1;g`3l=O1CphG{Jd$doX&SxsK`fzZi>M(~63fMX0pWj!cN&p- z?gLwCia=@HZcxV`Ap_7EFO780<#4;fh%_JRjY#z%bPuS)B}D&2U6?sVB!!rJYe0y4a3 zA#gE~#dV%B)GTkUVYarhQF|5^dz5w93jkCV1Evl$p0(U)8fS*@ybS~zv;s|4Bg)Go zj6@xRg;H1TJLBnb|WV|p&jA(>-{XXWp=)rc9# zdg^s;Z70%nYb#Qyicx2hQb!DMLBYXMoYzOA=^hiBX<%ttXS0-*oMZ=V41jWQzW(&o zZmf1G*SXT86Se2V64Zj2&;B?}=992Jk-JSGt)YMc`)cMjW=2c6nlsaxZP?8ScOpFjKLr%2R zbr~g(NQOw2$zv2uSOof>Yqq)3Y?jJ7AxVDKAXoCdzumMAoJg&V5y8(+ab4Gh^fRWd zz2dxoEW^!;Hw!Z(@IvQ<$0Icn!?fMUJZv0XmgkpR=y%qt8rom8PR-?rr2v7RNy*@J z>x%559xb-9XPm(%=%uv|#asoHHts+?o`8;&y8i&%AH}lRJ2QhUONmI#gyWNrE4S4w zTSwGn(IA=zh3*W2Lk1DHb~IT$@Obn!tT5`MQMQIZShbto>UizN{m0qut?v*cSu<=Z zyte+i_4ci8FH_R5Q6o9R~8(mNxpk~)R~ zxZ1!!8-eTWYmxE4!fz3HOItRcG`AUelJ3@9QmRaD#1M9jDbE<~T~#n{4(OO;smby; zsaH>m%H~TgKUFOhDAC5lBg<&d-Z|(A$gf$q@V=X>XxDoFnQDTr^8u~w5&|Ac|F==EpD0q8T$dbO8{ygy*tmWQgv zi>)+2l-rDAcvN&#>JB(PLF--(X)cdzWNv(1_qIBX=o4FAC(N>yh5LVVJsal^&H$p;vBF*!LYz$Nmx1?X2Xv)K#L9 zTu*HQW|J&QQX~Tff#CF9ckNzZsr*sXuC5R*w8*hKtO7?SMMXa#`9K`!kSoQtjbaOn z*sY>fw}v&?p}&X{N6b%tYNhbqa}B%5vPZRcl|4J)AJVmsI;^DH(CDL;QG`;Kr?{_; z^r`O_>ru){ANuI#2OF5<9;1RkD&4fTu$NxaAkm9S9Kl7&h-4IVo&02Q4Se+(CU*i^ z37veoJj1w^9DqsBa5=A5@E?fZM%87OdEUtkYa7KN$j(9BH(+49AQ`k>Im*gsXSK% zSNAKcUp=G6eEZ^(2L

FxVIe9=!;yUk~Y8CXEv6CJ9)4$gSI+RkMMf|x(O!l-2{NcZzeB-S z$;L6$jtzYu3-K(nyiY8b?&qYuyw{=d{vmKhJpTX$rBC?OwU3^f#rpmS=_ZT)on)J? zWM8&gOTHrDV+3{X4;_y~QEGazni-taau26!# zbrL8CByK$p4^M8i?<&pFrM;D-WyTN;DbKH`(!Zf;`#IXGce(smR<z;O5H}wG0L${N-xX`I zSXljwNpyv91hcrrQI_eR zY^<`Y5=7*#+?L1~K7{>i(hh^5-QU3sS1htM!b=OuFm3XZPE%_F21_XylnGDZ|8}T?yTiv6mD>MW&q=mdUyKQ z;+1M%JKpE@6mWd?IiaFULx18vjpK_S6Rqxrq_y>&1{mX8M0SKUDYc0`$>b7wKU~+K zcq&^p3*tR$J1CX*HO!M-vZl#!1Zu4LY%uw-I`tUq%Uf%{GM`S=C-F3L>9z{+D>aS5 zC`^NBnlds=0DfiNhV~#4z2Up~Y&=6?d#FD{+ivtP1kJDi0Bh>kGugE3ENlo_Er*&5Mx>3bs5t?##{lzQA+30FVQ1n! zBwfVuU&9&Gp)O)t4_w3AWQEiPo!q+t({DzP$r!y8)) zTa%tU6I#*ugTdOCn7V$a4E`Rr^HXXuWy8nMnF-ntEOI~xq3OsMhr}ty_a?0;P4_sT z4{KN2w8`O{eKKTmWevQLz@BLm#qzwxN6ZQ8K+X@KJbDybHmP&r_lLr_rpngZ$%Dn_ zb2M`U<})Gc>c?*#Iv#5E%$^XuyVK>07^1q=H%S%eA#Nm92<6EDp)J(&k~yT4!@eNW zw5!YbW|GEOXEtn%W0`h712ARI&`81KfI&6W&!w(sDc#*8&pbQv7f}BIgn0O4#4=pU zs_Kxi%d+J0BBL-BV|)h3;++p4vl1Zk`zC4@?HdJ}OK7cRC>c>(EwxAoc)`dV z=a6gIJVEf=N7KADqdf9nTU!{**u?TXnA&Uxc`c4IV^;g%=O0SxUf!F)jlBjqTJqU@!DJ2EN(9T&|xAI^06BOZQAeC zra(CW);Nl;D(hnCE_-XS=Uy7U)Gx1&i)zj_8#v~)SnVAC{DR0CLu3)00=-y!*Qvqc zO%qAe8%@^aH&+GGZY+Gj(yD|GcEWH$IQ&il^{)ukydHE<5kaY1Uftd;wad;ft%-{< zd52@<;fVxg$R8;kdyXeu@ioLgF4jCmn3mYb05FMKLzGduJi>Q%UU|sqYlgNmNnIn{ zSXk6nXVn+CUJSg`~A6l(oa4z@&!M`C$Ah=hUi}sbe|jecH6@j-bJ)f!5nRtBH5-u-k8Fq$eq6dSY=e`@=j&fR8x42Ic9*s` zwp%09;TQ18$RRTzDu)UNK5Ulj>ri+?D-RrNA8ql3%Qv<9f(SUSpTXWIPYYaXx?T3F@LS6fD5w%hnpRVT z_k-<}g;EAbIW@oV@4y*BS>8r#OM+lEl(MtgL=%#z)%V=31Js3eS@gFQQS zt_aF|Nc2_~EnTzJJU?;a4J$*`=GJXwz0_@N*>w0WHk)R4-s}{D$NgAPpn;Yro|WMK z99=h4zim=0VQylSG*O(iVE+JguS{pREI#qcCb#sU@_LN*GFk%I^dW zuIvz0fJO)76^^sucJVLvds)e9XA7Cp$bg*g04Cg=dgt)xigjD2<0NNG3YAAS*Yr89 zL&CbRiFFITX;ver+Q`3a7Se((!T$7RnZU*F?USRlB`=T|p7b>5+MgVUdm+OuFE32S%<#OzX)HW#4YjS?&lQYhymLg+vLPV$>Pa}wZ7+y*D=X=A?+se8)JhrR z4H`XdIaU)Kj9}d3=I998a-)jjeh%x} zmVv3>-1wJ7Tig4#7ZKb~6C}nqJKdozwS5T3I3AVujp*?I0E;y1BV#$c(rvfAu@i=l zRl(ehc^KLhr~qvz>0co)jx_xb#Mk~5zMg3`%SL8`FtG#1>v9Ry*oB~DYd0qNelZx?E}(rKCiT}ACLG}}8zyqsn~Jtd79*LfMs9FdXLPEB+D zZXEgpr7nkW;|~Pg>UwqNlVY|P5Jd}GJd%KA7h@h-Uq?%N%dW3 z?AmWPPa~CvHp?q_Dyn(w&lR()cz)K>##Fe9NbVVnsobaK03E%?M@$@69p{F8MW$F-&} zuXAMto{aG8i(MSfRhD;&)BR#_Re%`d9FEn2sc4&XCA7Y5ONIoIoF2q_itX-n8-|PR zF_|qDU03&tLXyKFK{y=xRz2pIs=%nt8nYeQP(rs(q!ZK9p>nmMuQN>I4U;MtR@yko zBc^K}c+76fMh<_^HQi4vg;L((7AGSh9A%XB&N-$u8eFy#qrevHos#DRr*X|<;?uJ> zQ_$emGDh5S*w&?{p0dXwnGWm?nCY6Y5&-*;RXE$~YoODic`ohN;9-8z7aph%Xo}`` zDsI}3PYmj&F)g*b%%tNn{O2Ro4n;Q4K)%$q1hyoJbF*}r02Sa2`*g0$M}|TpCD}{r zw|4Sio}O0ZADGT7ywUWiwX1k_TcyH58c5-O`xji5+6H>_ob|5x;62qSo_F?xjGSa} z7dl#5=yqbx=5^FX(QAlhgsMbG+{5Pwc5}sV*-v+mRMo`0JgGfTNk9pHZKsQ?l) zka)&>*Q0AXw~Bl%VwRScGPHK28ItA?F?PEHhRX4r4o+)h!MeVmVd2!&d_|46jJE*#_c*Rci*t*VUa07f582P()ez~v z4e>^mdUV;X#FAV^Bcj`~w5rjJjz>K8Bd#hbqFDrA+t!zP-}XseO0z4%c9D)YvW_;l zrFOnA@sEqFyf>%b#I|>K&fq=4NN07LBeXVSC4OKqGBO9$8qxS!;!g@TuVpT+_G=?_ z%(pSIXwrFAgps*mNQ~zJvw%k!tR;x5;_B|azZ0jDnv$lU-gzzWfbUv+htgykmAU}I zpdY*e^Nq-UU`7Z%MtjouZ%Nglxbo(b3p;5OBwjd0lmoZq4UC-eoR6)28LVmgK94rB zb0xI4cbBm4)9x+iVUBk)HXLtkp1H=}ab6dtYCbi&hHH4?Ynxx6a)-y;FT0y0STuRa<@ zh4i|Z()4-S&KW$*d1jC%$cN0s?&N?ECp>q}b3PC8zlyB2bEm;_%`NOpr>adV#UGYP z3XIZxihzJla6L_X7Q3ojXj(Y%pNcKxO=cp}G}>DNN7_DOvND#5qX2=00FPSArBzC@ zqkGA#+Wi+>c|AU7O)grI=2rWTA5ZYEyR3_=j}B>*uz;_e*6AeiL;%k&frlg4`Bv?& zqoHZC&!%|N&5W0ezBPQXwZH^t_?WlX12yVD4*n!**7_OnPlt7jtukpPk*8~GeUn}g z801P^{lKFNLgxdmS@C|c;LjP@*j{*w;^$YoxFXfHyR;C=3}wgx)*fBs2O~M$2pJ-( zHKyj_IO)^B_47F@LHtPN7gG3V9nPO;70e56V$Rirc@9V2Vik`*qdjTfDDeLP!yREG zy71lHdRCz)@660tTkTL)k;4+oax?cwrBkx-M~7^sbnzrtGTOm%@LFBi5t(I>2T0x~ z8<9xiNgt(jUl5tBbcVIi{68hlwa(K#ilw0vI0e&sf_Ezn5*wdt?2Qza<0f*-v%Q); z>hs~QrK;!;t3>v?nSg^NR?>%Xjlgh5Ml;lP72@{Z6TP2Ndq^Q>VVo&E;D0*xFAjLq zSn!;)z3gjiX>m5jw1o;u5;octETA|VQtBr#%3l= z5Jo!Xj|cG26xB(?Mr-cM);>MeJU^&u%-&>7s;#u-bUyW(_Mu@{R}9DRC?9lo=DwD@ zx3uwglReRzK_ruwcVz^mhXAVuBn3T=K+SPFmw>Kx$lNPKAZ6om18_W&Iqh8#uXSg+ zl#d)XbNs(9GtioRXz`{b73!86R1iTVI*C;>E)e582pI=(_pU?i(Zt3nC0qs|KVDBv zn%|ht`kdlIvJ;lu>)2+keVGEB@OxKZ4~DfPF#^PjT&CLmeon*(Mo>PfE*`23jyPwMjYj9Me-9Ort%e z*tT2NR%jWDD`Sj~qMaO=2zUf{pid{2_H||vWVYVf`c>#4f@Vn1%E$WDwh`RF0rMae zl02~>M#}=(U{4F2C?$Ah*?7}3dpL!u6-DD`By)540w%jp)v^^WYtKf zbjxI(FbVBbYolAANq7rX(fmzsci~?Y?Xt1F0p4q5KSy;u-NdUVJ&=HF$K z1{ompoL6n5YF9SP9i*3DRh-TH%&2Sw)Z>icd)I4M*mAv&stsygRICxkk%ZiQ!JXJ6 zk=GdK(y_nc7qq>0gHI~6DBN=0Nvv&IBhs}6g39DvT9pN6QM4W1e;Vj~DX8gI_ir`K ztsLrw70)Vh(>}+gYfcSF!gI84j%MdV)@)_kVP_tz$Ul`x`WC5n>#`DqZaqIr^-H~5 zm!3PILoPxu3Nyw*tmCLeh{id@lJW`8LHZi(bk^+Wjv`M(%BItG8#xMGDNwlwJmViv zTB(QRfPH-{(B%IBPLacxX+g*Vcq7uexj%Zci6QdcPamH(%T=W8j_OxyQ=VBL?w-}5 z=EhVG_~h1mk1r}f>za%?Ezsh!HAVD2O6H!+zC4`q-|1B%B(NFdy=+2ScMvGu+aJ!V z8|p;%Aw@rZ`QxcQed&c{&i-&d@${_=g8|v)q3O;~aD6H55;_=p*w`lr9Vn?Q6AelR zJU7a7o|QOo0MFx}YIED|AGi!cE_!CGplJ{`Hj;94StE7iOZJ4u)fn}t%+7vP$I_}Y zfKEGAi&ZSeI(>V7GzqJXW*fm6&N0uWKzE$uj(DkEkUyy%>80_8AH&aDq-N0=EI|bG z>S!sDz-NqZ&-9}|Fm=Jf$aZzB&9oDuhPNqrA*r`z!Y~pLg@FRC#3Ng&gGj0ZQ+o zDHZhFbhx`jpCwrI7#vpRtw{SlL~}nk@#_nwKe12LQrD^ zoO+SktXlYj_R`Jbu#PyIKvmg5-GVTAJvj8mC3_gStC{gNv0`tV$}#TT7oVHZ4wYKj zEv}|3Au3$uPCEL2CZn~py1bCfDC2Qs{OeL%vY)$&RZ01H9-Z@Aa%rI{^d{R4nr=o8 zOMTKZf61)rATG+Tq!~$J?4a?Qo(L|bZ$4FKMZr=B867{#sUCZmje@D(Gs#|q+tRaX zt&2$-dTs1BZTr9+#e$&pIQ6Ug&xoYDfd$Je`Hi`7F|-5eToOfdB-?P`F~As#_e8D@6;UxwRqrw{8SbW0M?UgIaM}Gu+2*BxOtU&mAkWw(#2A?T+0%$4*Gj z2GBYB(Hd>LA-TpX?DK?;%LK_h;2P+(-6r7NFWQI!!7HApAIiJEJ4&&Vbx{jpTho@n z>BmlLZDY#Qp^^)0bvGN7U>(wBx({x()UfR>PFILeL~!?3@_EM96tTe0-oCt7OJ%3S zE5r^kfmM9AQ=Z81#arzD$?}k zo9q^18>tmku^gxa2WTF?^~C5`m)CdGdCo#KZrQ;6G5DJ2-$SOFwyf;5-w#_{>32(v z@L5|OSaX1VDc%t9y^QyU8|3pQ1hLwFMhBtE>9-t@r9VxY-g^ne_Y9WMDUT{Xea8nm z?azAF&~y(z+0xo;i6sLF%BKNH$tAr%rF2FbS&>oQXj#^@ofArqCAGXsrk8YbBV&w@ zm9yKw0G^fSvuGOC=aKd)2bRYx$OSufT)8@=^7)<21sXTNP;?sPlKFU_+Y~d{YEvs9-)z#)Bi8n_(7a1pxok2Bf z)>~UEq>eEpmhmR&*~eDMCnJtJj+Nc`k5*f|6tIqFmL`bF@`4E@mBGjygYAr0nQ27N zE7{0OZbl{C;0`g9>DIBV+D(^9Ce3|M#CFp(kjz>{_v%L-F05Bo4FmOT0?TWc|bbi)jv9?HKQa(}hV30bK?_4+N zj=ofN!^WD6MI*;}V0Vm0SbVHNIl(>o?_AC9w`#UiNxVsN@?}UEAQ7H1+lrU_HceW2 zXK;}b^Lc7I=Zus1dQw^VVk_Atc9UvbDQOD~an1nxnm1aBS}#M8(l3>DHF@A!cW32( znLYmi3hC|qId`w>0qvP$XCXvr4oN)*I#wO#mu&=sNF@c8z}esGJ*%+NbsLCcEobHn zh=-U))3<2vk<%TGOrK*^X6jxPyRg(Du*A>0V5~OoW$aD>?V9Oz9WwV(7TRW!VRbKOUE2bCm%1P#!J8Sm~ZH&pRvtEgVxY7yHDAfZo_ z7|-2Mq>PeDz~}R!>_;@Nd1kSz>K1PBpSGt%z6}l9=T*|fL+m4o!Q)& z9r7y&Uc6mK3wWSXRs;yjI}kC=cRD}BD;+;aeJvp%`DIjKV|H`b-!;s5Qu@?tmwtRI z#(s!?=FyYW+Nx^KywI?kfo{ZVBC5wo46+pry~m&C6YCbbH{;|mBLTW}jI z)Bga}D-_+$FLFpC)1D~j)mfueMRW_C6O52^+#2%DerB5R#|IIpJRd{)b5*SMJLr*j zNbaXUeDQFPBr*5qxF|>2 zrSih>48xJn9eaIiR@%-tWLGC~X2++{^shG15pLb4opPaZ&j%!MPyYa3y>wXV$)-S& z%lqd>c+6jU7#tkqs68>(w2T|n#!V)0*GqMCrwuytVI)w==0TCqJg^z(6_=`9TTS99 zUd;M;D7ywam&@ubN z+pnb&i+T;qxhAuu+*~?d+_8BS?qwrrQPZhC`_|RPj*MZulTVen#EPz0Bn)TQC#OMH zZ>?jV86ZiSnSnyj>F->og{a0*!)IzYc@AtszY}xy?H1Bc;;yJzvCH ztT4b57~);NX3VcWcs{ikjG&G*lF4M6N!fO9EAsC->5kvZnForr^8??(FpVS0jbx0L zC;Pl(9l6P_ZfnhN#Iwn(S$Qy9t9%+Ro8cPqCi zoB{@LezjKD$5$42Znp`&2qDIH_v}u8T3uG{Y%ZlsmyTE7tj!n+<{|4Gil72<)Qlf< z!LA__&GW87%t{Mw>(e}Atu9WCx60Mg+}`T3-pcdoz(leQ%%zBIj>iY3G}?>%E$bq~ zBK*ZzkQnFNjQw$%B?jm!kGMBlrRAMYb%1Kb~4*}WEev@t;%829e^ zRFXTMMotLn-nrdgOWjWBpc_U;S-$YcrFsv6Z*M#|eI}s<33ADAvvh!bp}t(;@tm6P zrzXy7khaGIABE;iP{VhWj9U!9HywRAuERlxPnO6!xC8;h;EsD5?WY^+d6nI?ksg_F z)>b#x?#EM#;TS~_&fw%^k;XE$$M|njzxx#0eUwa=>A9wEJl=$4oacZ}FJLzuPiQLe3mQRjAI!3*PDooPRR8rDDvFDs%jQ7Ut8K) z`PdN#xROJ;ut4A_=ttJLU2tAcd$DC{pxDx*ND7UK-=4r%U8-rOOO`gXvPmWuOblcm z4iD0+>V6i}^=(;F%Klgv<&D17djW!Qxx%p(=BhPh?2gAMq*L(E!~JK*@xnA)l)X}2 z-BG`H8C4|Z4hT3H=~S+~1um6wZn~7PuiBZ_5R>xl%9daOU;*~cby{wLt$aVex01^L z0LpnK7%+wa2O}6`jE};-qVnUxH!NSo`c$`Cu)1`b@B%kDCplbz4o@}Kuuf65v}Y9Y zQ>QDfSK@d^pJRRDjVDaFx_HcboP{E{Bs=+Sfx8Egr2haa?X_PLc*g5g7E#PDCbynd zDq}*$MhGB<$QV5GM@pZ@S|*FA>sI=$t@FoV27HLqEdf)Vk%NJZp697GvEeNxZm%S5 zC(jp9TFWXe%P0X1$@Wz>OsQ8-aO}tFq$v)Wk0t*63 zEuNX__4KaK#Bjr>*@+@PYsCs6bzQq~-_V-S_(^Lgh^D*oCZJ-G(b&YEba+6F264DP z?B{|pit4pQxwF(Z>E2XUk8b{B%%V~px7`@%r__vBt4*b$^R?@zSKT}+DK0PdN3pn5 zar>V*$hpP<2L$!*1zFK;G(CR$<3$jxb4H*sCp$60AolBBR-L0?*=r~*u2LeA$rPt= z%43ig!3;fxb8TsJ;j4{HS<)^eNsAUaDm>4dBWOK&ImHu+?BT1Xtrk|%v@H|Ez9y4R z@jSA{X7S6iSXEis@I0{F_}EWUIj*n9o*dE_PSUJ=HDuGw@fmL?+yVw{{nZ@tj!!xE zuPuuHMbqZgJVP5_T}vv*3Ym74LUKq15=J;2j8}Q7UFkO(Esd_9HN;Yq*-02~3|H=F zkCYyj$2r9-BcioBl4?zy1R5rtYpKf}@iVj`SZ)Cn7RCt#d(=79tu*Va$e9uJ>xC|n zk{m%JU@*wR8;BmYgJPPO_J!rW)3mZidbd!jc+EE9CDbHqDdrG6HUpFL@G=8dc5+vV zwJKKljV(&-c!JtpLFaZ`P*jI(WVg3YO>x$GW}iGNJo#ghaM=--P;G5e2E~5zy(Y^wX z7!36o^r}(o$qoC1DxWkk-rSN8LfQ7Kr%^%N!loWmT&?JT|Iz%=)2wurvQ0+Kk{Les z0}#U9lgZHl zz*ZRm9+}O17lX8&GWO9m-Bng+ggk#{#?>VO9Y;Cu^{ihBcpAe|(IM5utP2?$V6o%{ zT#z>m5Kp9@B!9*{)v>K28z$PVacjlN)~Jn#k&*0ZAo-PomBKXo&()WTlr zca~Om%?wg9%BZW-RU9zKq3QY8p6FV%)|w>xCZvTg7E?c;A^=%O3aa_%gPdcoYf9?- zRnqkfU$R}J$2mt-k&oZ*q>eb|sra{6^J8m$QqpT^i!4hreDOH|FerHBXFow*u02dD zHOgO$NB;nXx);{$?U|M|D>EZ*a@>}DbsU`iE4A<#Yke~6(*9!7NL$DfE(``Sl{v;v zNaxoT#&|be)I2q%+r6EflP8wbToZ*1GIw+7j1kXXE1U5*jdlHMSuX5nj@!#B$YR2? zeB2BH!2_;MMBhlBWA>A}=#Qba-yQ3xT8VXizih#cWR*6QMr@7(u!46JTjtSr#<2+`)OXDVo z4xwphe-Dt7Dk@9!{LI)dIB)ce&wG>K-9q5w@A)TgJ81uNmMo ze5?RGtDdI^u76te-wXI6FNiibZ>`+@r~4R5YX!x=LrSW0tmg%Gs*&m6J?qW}fj+l$ z6dLObcCmKN^o)@e6okPQLK3hhFA5FTy11&fz3s%esXFhQ=5g z^I=*rmE^8__>4U2!A69+Wv0Emnd3ycwAD?8uApSKXJBLi>~N&6g9m= z!SZ}G(DchVU11Takx8AmA>Qc67%aK@y$&nmZ8OFb!~LBezS4xTK2&g|1NSMBm*)YS z83Q@5Sl4x5_)EM~V|n4hb#JFb10lP<3lh3UGmy)T$2kf*^sbx?mHp!!)|{rJ3vJZa z()G_3Xf~IYPC{F}ds;CgB(5BgV+3b{N6b1J&e64-O&(b_SfKM{iO~5Ie)2e<2X++o z2j7bH-AW5>N5N6c3>#lhA?3JITg_~o$&-`F>N;1AY7%RAR#L&DY0}-u@ITro*aD(& z&Txt%D%XITAG+-);w-!>0gXI}G!0FbT z;eA_J@g}_ogmjB`GfgOVGd4GzZY;$2z$ZSH=9*Txw({HCBx>T>%Ix6bh{4D`^IpSs z;Vn(BZG1y(s6%ZX!uh^RWJ&}~yU^|mM&ZzP!1U|OO+smt1dDic! z*_DDpEXF5Lieku8ha+>2a50*)G^;NiYL?b!?hA=-ac|~doS`q!F9azK!2K)CbRi7(nCNmI+{3o!(9&&oju=~g@&u6Tax*7jT5i6b_JWb$MC%;1cSpS$V}dYsAX zcq)XVn=t%g;3x1NyQx}TvdgGi7<`)>cubMV8|EdPovO=^eD%d~Grqa6Ycgt3!n$di zWR^=)!sK(g0*$MJIUIGbV!ZK=ljCh-8@Z?QkmaRk<+8tc`;%I)q3HT9tlE{u%gGhZ znzSn50~sWovghvOl4}Vxl9SxEQK!o^c$|=G>h}(_OAsNYFCK8D{{WoVl6a=>_SI1| zbe85%F(hdnbCZLSfz%rM^8WxqeSY5KNzzIAh-Jargu0C6@HrUk*i;(7fUdkRr`y~c zR+8aZ#)up!aI1w-z>qS)ocHyt>P1M_Rg@vjeB0oQh;Oduhgcq5@~Xy)`P&d6Z~@?E zy>~&1G%QrGC9{s-oqA~Tw!NrmKiSaQ zSijpPaMyB2x=^g!ih+y)oyQ#Y#b?Ljy*VxJw>n91mg~ORkj79%2xS93PX~-1l@i0L zE6HkAOkDZ>!-*PY&Hn(0bnOoM0TlXt1{kK4s^&7}oG?Gb&Q$T&jMp-^AMlT8dZo0t z*3Wz9Te?LVSq{`iI{^OX5)a`yVAhl`&@(r=UO z_wd~^o8Imj@47b54@?|(=h!vx0@`avOS?$n-5i9q#6-rdV+691k~1bZ40Sy# zjreom^QLOAd#R$xEy5MS4HHKqdC^#EvIS0#!eTqq>;80lKy6ucw-r>sk7r)coO2*X>5Gv%)A5KwIgJbc}` zKU$~ZuZHsJl3Z&~610%Vw<{ps8>kuiI)?T=_^6f+bF0ptjO4G3hq1q3#K-ZTk)x-H z-b&Xo$$j%w$UTiba*C~>uSuG2tgz|jqx3m)U{m>NaH0|5vR?m=}D$X;oTjk)s4F_k8^s^ zSju$`6Tpg>mzso|-G|-s*QyreHag@Ur;6kJdGQZM@iCW8z87hE0$?q>f{QaK-WZdf z2s{D!*4BwPgKe~}DEMwk{{Z14LFK$LNCHXb05K$;103gQ$sG=Q*MW)0x|JP|cLkPv zI%=gv?*8TKTk&6wtaLvJT6liuDXjG;0j@3NC6Y*83aM9Ij4LlI$EA1%tNoh=MS!InjF8mb7;BtAcI`Wl9l0B>iI#giV?n6EO{{W8l?H@}^zb+`jx3>F1 z07fywkT_KL{Oeyp_%Oe;Q6Fo*jFFk0Q+Ymw_AL=ebPvRf88jGZR2W&I2i|%$?fT0kKo^hc77}IG-A_z zn4TAuzX-Av`}=ZmNjv~6qtw0+-s#$P-luheZ)YHlwhS|Ufr$d8lbxZKi{L7+ArQ=rHGhn}7-DuoxeWdW(O;NY)x&f>tP?EYk_3 za6fYgxX;aliuFkR3#mSj4~)Dw zCB(`0e=Eq8hIoSWh|b(H5zw3;Z%ygoo$h&+v#L?jp68agg!Bu$Jx&cqrne{&s>&dCu=*wXCNwsI%sAt$Q zxtjsmw()_UMR9t@t*lz=T5Q%4BV3`1QmWfd^&RD|;@~dPKo{gN={{V=*Ulq(USa?($+qN5-)aDdZfG|PB zNzQhP^LgQt#^^_X=E|Cyc~aYK5;B<>5UK&?)v$A%SJECB@UMn0{4_16wqb8+wr1NP zN8TG5BL@Qj_vfvBeh-YZEIwcL7+Xygx~1FvpF{J!Z-#j$CprGtuAZ*$A7#tC>*~6{ zo&3jC@TZ6`z8&3PU)d3N6w=KbGcutlHoSXC`GLUX5_6jJ&kgHZ%-ST@(OXX#h0-Zr zJiLQ%%%(EMRAX-;y7sSm_`TuXb6wN4eH+48%RP;`nUO8$W%-?p?ApW@JPzdXz^@zl zMdAyK9cxh1C$X1WxxHU5Jv@a0rH>(*q{zTdq>TKzC#OFbTBNVe^={|s*f>Sgl3guj z*n`B{Z;gh(4Yl>Q(JToqtU7}EaFH1VwqrX6LgN|eewEeT_^-s8XB0A-ae&mjw>qAe6OTEFaysXV`gqWsBWWCPlTPQ5 zcwbBL95=Qq_$Cbt!ncCj+r<&x#d&hED_cq@1>|%4mrw%k!tLG; z2*-0?ycfgT-kquGnysWaR_|{tPjj^zNhCl@I&caR9st45%k`~iMpA|0xZQa3T5Chj z4}-iZ<6T0+$HlgjtSqt%eMH1VKR=n!6yAkigc&XPh-a{JT>D#?Kt#% z>qj!)@MewFZG`-!#KhwSj(;w^iS>_wmcrj%)Vx1#FD+C?A-7q9m0iA9+!*9BAd!=U zoQm~77I@y-#ihQMTGrD`xcfX8*vzbtyKo>d4;hdVyXEL{o@;8;$2v~0aV@5Rk=l!s z3;ns`NJ#QyI9Y--bB0_t0PCC(Ym@5fN671~kF34rq4}YqzN_JVPV+&&iss%KB@tZ4 z*-wzR2ybw}9-XVK@pQJDEwoo&3c0!1z(X_1F6=alGx88N6NC6y(H|AOA>$oiT(r5h z(ropAw7siEdub}hgFKTaSPiT&GI--Pi9$b5R zqBd7J#~fEG!ziZF(z8WcQ0LI|Z4=^6?}v07tr|NB^LL2mxH#YC^&oI@lY^St(lpo9 zG}qU(>5Z`51H|LZQrIO41YwjM_3vIU1=RP~?PRFY>*GRokxkU%^P=N)UB)AemXP5XY5 zWlcuh$V>?nHjJvOTsKN>!BQzV6+l7&$ov^rrDNYe$-!zP8g{Z)djFd-m#1 z9-N^o%=Mob_zr7WEc`*E+$4)@u-w~9*;R?#0rGG*5_#v2O-6M6Cga2aUMaPTONffC zuG^CmF*||){{TJ|j19n^=e>0v0=m<6Jp%Vh@ih3jxt1G9AOLxuONT6Xju--}dC18f zE1B_DsjmDe@fgrF>sg_+Zz;oGKoz8sNY2L~w%!Lq4haUarztn=&sMBbk230eWDs3I zbXz|S%$lB`smfl)=6MVg#uf3lXc^gK!x7N1AY^x|x|QCqVXIh0t4|uG+oOG%moBoS z{PC+N%Z5FV8Lc0OBKO8V6@7BUPKIL~-dotls($LTGp6H`$0q}?1Jb!~6Ki^J_KmHC z(I{&|?$-CEt>r`^HX^Xc&7YhMo}GcMy^@W&R_BiDIkyRPG(1D0cwRW*z5daCM_#qK zJ1wJMEzP$wpf9|D*lc~w5!<=9;7^BIcB!c9z9fqGO}LKQH!Wu)$2f>ig_Y!#05?Y8 zDHzUsab1^(eiTD(tyy@cTcJJm^g`!Pl5_iql^AV?KmY~80td{X?dP1D<~0urc(=ov zq~130&6(3}by+;C{XR&Cl+OdM@#QmcBp{GM^&s=luSSHU1v-bDQc1R=cODAyr-N+u zC$eR^({&gldrND1W?3xA!Zv)=&VFF@^At z!SCZA6ismwq-yt`U94hZ0t|dwQI10Wuwk4pEALt7eWi3f+G)L6BxtSfOMwkF=d zZ;X{-9}F_SfRWO?%i=GIFZ8b#S!%XWExnxa!81i}Jh;WepjRb&0=Xa`PW;tUSCu`$Tf1i4pB&<$|_O^<0p{ zjiatBsqnt5<4*xgq)6nC^VjG)s-1)o1I;V%9 zIuD8?hVB@r5kTT1=_IX{0#w_Q4)2?%Di71L*EG)z>34S)x<-Kt{hMU+aH@w2tfm(% zS+WjFxyDCE$geE;nef)?&&0QS-hq2{adG4&(OXm=L-}rqK_CpfATOSwy?gcA2a2@c z7+qpvCYdF)TTD8JP)g(lz;m|%0m1K#<287hMMmaIQf*k}?tUBU9w^Z@HqcfGE<`3% zYp6*bx;n_R#+Bc-7&Po$lmqVi)BYIV5$fo)htwjpDxzYC3O^Vm7iu6n(Zk za_?@;NLMHUD5vhf@SdDxSD5imEhMx$S338PjP*YW+ZSuuLwTtfb#M+;E=Nw7$Ul{F zaOu|aKoBD~bBD)Lyl3b;*S_jj_g0$X*++8}>vwXt@XUZJNgEsnC4c~9ufGDiZxH+p zy0Ni)tsZN6p=mPFq1aUNrIa=R-NyjeY-zf&=82-LqSBXB;;mM~;v8Q=30PYIu;=FY z^sa+PzO}fDG`n4sD=AqALyno_itP2>7f|rD^6BTy^CUYSCsDz1kC!>>Q2_6@yCVyMWy&09_+o`I#iA2O3n=M#@(Ozif$tW z@z_^~R8)0rx*j z;Kos!n&(<~J23dGYo3WhS3Ts-4(3W^Ru$SdeZE5rO> z;HHlLWw4QCmK59>2xueQbt};4K9LJica7|JxvIp!f3FDcW<#0Q1+^HO&XZ7WelaGw@xwn)=#6^XbM?5hN}ADAAETLm;>Zq3e!o zcTw=hx8kiD_s!6xy4G%0CBJ!9;(K`=N0w85(CSLyDJ`^g9+s=FZhKijm-XslDtdBW z?DD8Dei(mY%WtY(YQO11IiW6AM@ERUoHC8L0BtHqq2zEq5(^ZwhTm4v-Uwz}CN{UX zQmaEMNx_YN?j*w`cj#;KS&A9uo zoJ zNfe$K5x_pg`-=2$h<^h$TMZJ&#uoauoyfk1Hv1|{8s#@H@x|01e4N(Y*L;oI#PcNi zyPgkYWpUyiY*}gQUVDbjN;8&`k3bX>PdFH_Yq{{hh&(-}3yCd6ky$iJEHC%tkc?z2 zfXC(sa*zl$^YyLO<*n*{h_rJ=dW?g+rUpH0(%|u5iRRZO*QeC3Z1q_Rnf_K$Dxgp| zjsXNOJF}WqV_VuQTbAED{{WT0uG>>|+ShZ`N5qJA3mdU-VGfTi^_r#1$fefqa00BT ztT6~xUD@5iCvTwU{9PZ2CeifWGHpT$Z6&yChh&%(^BDjk_GN*>fD3+jtp5NK>w2D{ z2Ag|%9JgA0MUpcl8`3c;`OIYeq=CT6ARJeu_=3+&(Nf#Pvgpy-Sl!yjW0jqm=Zu9s zN;4iyfu5u@b;WB6(xq!J)aI*&RW8#pbiW8kWptC*T--H+W1jDyX37<8wi+~cbGU75|; z-&$MfUS^&4hGdu~!ll*A9Bt1)26|T)tUaVQ?ym`n-{%Sj0>5$iSFl`Z@oD}UlF{L5 z@1kWA2!W5wC<}=SagY>Xl0EaDxi;PsJ|odu-d9U;5*Y$azrJSU=Fj&DBm4VA(4k0c_5Ct6;JIGK`tbV_&@~br}8!ET3&~!+s8JP@TZ!^wnkVT z#C08VD=teLDXtdM;0Wam5XKv$9{&JASaaCkCQ91ReQox_5n&2XA9&)a{gUn-(gY#Z zNdiE60n}Gt4X^fG@!7aZmSilUbAna7*FUQ27SDMpk082`>yi{V`y=T>mG&ym=4FFN zdJI=Bv?`nv$0Dw_m3iemMTsMimD+lbTEMcpSP6Fl^VfH5*IGQ7?c;SkO4%Due)m9s z!kcXxD_Z3n6M1Vh+(O1F5@YW6X6=v31+>)kHxq_oVc zLn|YK$_KcuopZ$xt6E10Pc0$@s3(w5QR|HMB-AaU-QOk7tEI>cD&IOTK^gX_UqRIb zO!pA^OsX6tnNq->-RZ_8J8pB<(9L&ncVwR3>#MbENN(e{)KENmP#Av>aa{GBrWQZL zDIjAWhrM*9Tx$0oWRb3RedJA`ka5^xn%P11GnCguytcN{ZuINhdw9f`Z~|erf4IyK zVh<;{6+V#%g_;|4tivQ%ZrL%$n@7rVjz?X&#c{D|H(Fivce70Y0B4jsml+I>I~v}O zeO6m2;hrx#By7bq0IV_S8gpsd zf(B=cYCB*Z+~DMN!8xreRcbbhxz7~2&OS|dNro>y?fi)d$zi|*`gbO{Z?(g9IgZqw zrz{BvEKelYd8fsq{hk|rQr+(!U>-9W;Hm6=53OIh@a?QE9p;m53`(t+5+AytaycD; z3dfTBopF_qFPln~$L1*mcjs7>#U-iQ%a3~WjY2!IaFhL<2=R<4$RC#->z37_n&&b3 zW-%Egao0G{KZQPCsHHQWjns}mO1Bj10a7*&IS05EOu+G~<#r$ETH?(b(WJ*9WRuhI zsgg*$+^-$bl1->`2OxbbPB~lxM^Vlznn&{FQ^o^bN0^rg~eotjAEQ6!RZ0rad^m1L9vaCdX`t!0En zrdVXb1Ln!b2lLGq2{KEybd*Fk`HPalPCzHO;Z-6)@3iARah|54j9uK_tTx-7lGNqS?Cy*rfZX-tfpb|0B!F{NxDbISDa*X z!6VYOloBviZm!NLblb#{V&2OfgK%)C7(GWn(zynr)_h7_RYqF2-uNeo|rFVnDuwU$+!gjM}h!==_s-e4Zda>#&Xhn56 z>sD$uOsZt?j+Lbpg%6#A85u__&~kanHO6W)XzdHg46x2Y#AZLeo}A~7D_33c{{V@a z5ArbF79?JuE!}9>~MK10nbeH{OQYWHS4^w;4j|Galo%_wD6yW z7f3fD9j7tw+aqEAxELJzRtv*vEMhB5eSo@+!v}L`82o>oIN|)m>k3O_hqR3%ol*9< z10=A{eXFg7VY$(jZng5ntW zf>`p+v~kdIFsgMv;Jm=pP?7kbf)xu0+DS|gj^KDSUdVopkk_Wl1Xr!4n z+vGLvw99QS!Ik9uM3E`Z(}HCDa6r%HSkc}KsGCue&O1LP{&vYZ-bqq&a!+jf3gdiT zu3QV}g4D7~q-4fUF^^H}T&<()nvryOmT*`W1&JJ1^=c%nanYkK+344I7Regr5MNTd{qlEEBgFJUjG>^TeU=(!1@qm3eHP-1G zFu1mySlSg4uGw4+>?0ew=NKLO3NE!ImF=d~CRro1lg@P`=3|kC01nvi#dX&HIhRql zxwgEXDD3YJ7A8QhRZcSa0AOeFs)SYSOzO`@aWPq0J*;qB6(#0i&79&qk=Lhu*Q)q( zCz42PwD*b-=w?=t$lI_4!OnLRxaS=+UM;J5x?6jRrJtQIYFd5omX|w=TF@r9crB4Z(MkGq)H&(z|Upz*nm( zUtQai6euK+%$2OSEZgl`b_H^;*!o1>X=Dbg`yAu#>fZm{EKb2`s^$A4Hv23!V zKt{4-n|S{rfZN~Kh;?2H`xR=%GVz48d*$&ijf zI5`zhQCRKt8TFsAwa%$^Vk|Nc=r3Vo?*UmwIe~!zNsSagIIt$ft26*~~{9*~Vu{ zGFSjdaKo{!4I@j`wP_={ju!IEfsLerxb>(_j28qXWr&dc&CsbG`*B@&g08P@Za&8} zpSsMl98QPD8;mE#bf=R$sOpBzIj z!(@>z**CWU7U*+d8+};M6wvBcQl!8Z4(o*g_8{@^&2DQxCbAZ>$dSba_bjbEs-?llU;)o3uUf{} z=A1!oX&j4nHP8UL`9hL#4&Znk_xx)K(bDMJH6K&Q_1IGOSw*A@B$4t8a85tE0O#pe zw8pu%)7m>*hEF_x@mTC7m$pdlU4M-%Z+sv2Q#%21YGZVm5Pp6R0a5BZaZ94#E$nix zt8X2+)P8g`AQ7-2{K~`~r#;mBS0R=N(l4X77rKqymhsMZfW(mA`8flnM{Q+b zZ{$aDa1RB+$Ry zVqL6b3bDwe8TIZ*9ctrwBbKZa)bVXoOfkkj%CWREuki3!*!0KeTt=gAG>tCeNiO7B ze8gxXQJBbXNhERTE9g6q3)<>4&ueLO4ZY^ftRY;++2KZigrCa1hgR^Xio82>b9;Sf z6wybu8XSklhjYE3h>`^LYDJUeABr7YfTZxJWVk}yh%53d~lRmNCdX?6{B zq+V(2{$^QQe#thTFujjFkMOO33u`voSK6c2nEje&+UfV$5<2sf&rj=4o5R{hxn+HS zqQuE}Za3lBmSjA1B;eMveA=TloPF6G)A)Nx^HSo(zRn+MJdWq5q2jx#qVTo7t-Yl4 zshGkhIUNb;KEGP?eHvXwAePle^tY7!$Cp$jb@Uw5wJG%ZVxR1BG;;3_#zWKrf)ssg zn^U1jTORqNXvXhNM~T$iKbZdjDFlHK8O}KX=9w+JPjCH`r@VIa{J@e%PI&+yrE#AO zwU~vx_7dLgl!J(g`^r}Y4E5(6b*^{C+LhLq;w!7Pa)B7EDgjb(psQf|;)i>W*;(?) z=IIL9S=34ljvnqDCjJ;T`=nMe{Uls0hQdM ze8M%sC+c!BUG9@FhWtaSPiv+~@S}#7C!gg3RB)b|V_s3E_%`@yvNip}TU<#F_+WBN zI)J%*kDx(Rx!Sim`E$2k}Wpsv~yl9kR%kxduw0>L1H!FNe4s*8@e z(7SL!o}~U$(m+mjma4G zz#MRCxG6h{R^*SodFG{d(pt?b6&px$gM*CY3VPLRT{Wk(n)>02N&qW{%MtJNt(d$$ zeXO%v+r-8~PW}Ky$0sN7=~OkSbw4)SLu6RYQh_6&`Ja9;Ki#fb;q2~?x>&U}py;nN z1+}fjjX6oxxg4rvk`J|d9D3%5EVnm1qlY6PDd0Fz3FMwzsrRloPk?C}R+h}@rx;dewB2i# zA}O9Z#4$P*4S-6v2hEe;Jq3A2v*J-Xk~Z^R<#xokR_tSTjZPTu2a>~&O5i5Hz0@W9 z9-d^K7>37SPxw~q_rI*zsArrJqwbqN>bIERFokW(d)h$_%Y%i7e{q_ zp}{m)ajLSJT(6ke&N0uS&uV|fABNs3@VpQ~d!ovwRNm7n??u2FJC`7H>t9BATgOuP zGfaloJ7Fcna3rEopq#(=&-XwhJ?giOJ}m0G-iU6st7xOOWj|-x^9|$xLGSc6^zim^ zr^y)Vd~CBEY^%1SoKKjv`}?~XVz8Ktl86>Eag|bc5uUsgROGqQblrCD{{U3BlHp^v zWQHi1VP!lAJBLA>{cB4~(+%6T?8M5`xDo9ee6!ASbI7iD#};yF8nw=ua;Wbbc-X9~EACEt&TuQubu9t^0Jkrt{{USb ztc-G>b>r#?$j>95m9wVmRT{B6GNzz|pB7q@{9J$60?%$Pd_yfV3#w z01ja#%w|aP1`nwNw|eZuMe}NK*RN#MbZ2L$X&N_(^zA}O)qm0C+>HMKDP5yIdgi#h zJr>q`xV%4mb#diOD$0u3ky>7Z9A$Vo>(ZyxZ0~1^YaJMyYkQ`RWn#sNApP@?uWr;> z=y2#-jF%TTTjh0OZ7MlsEElouUZk2)xxw$sO)jUeUdnXqCWlYbt>4TDo@|JAjCJ9# z8?fV#t#JC6fNbyWzR?Am!FMc+I1%m$+>%!W;1A_pmW|^Z8}APJT9IUH4bd^%yt#46 zRpgfFN2jf8#o~)-JR*^$tf>kqjU{zCVo4yJ^y||#5K(;&N{V#!M}c^+#2zTo_1g%Z z{wIdW1Y1K8+Oh5@XdrTZPIJw6dQP`}@jCtVJwwX2g3?gyED98;l}_IV!0Ys_*3m4yIj5wSlg%B?!fgyV+@sg2&T(FTBMnmbdmg?W zQBhpK7vysuKaW;h*vPqO0wDn^M*=P}^6&;n<67EGa_ZVum)n4Awv>c+7z1xSoOA76 zu9a<|>qAS@))@`*<1osbRm$fN=X62%<-g zLvC>Cz>T`L@D6$WO?j5NscXI{)qmj@(4TECFN400YKxn)YPdT)hrD zEjjZZS>bok?V`EVE~8O-aN(rha=-(hm+R|Y7mIv#Y5kIeOpz1IC7L&KU5OwJ41Pa_ zQnc_+wW@2&1R~}M?H%E|Lmm`h-~fGnb6%fe@Inx`r&_h#WQ%lC*OVZyu-_oset_atL9L2*wU;$uIRI;Qs)Km-;+SAc9sA zDzOec%#4QiKHV$6*7T9!tIKHB-YaPVDn?gprU@C&IqECUJWX|>-Q0~rEWOfv!!7dX z)SOloajG##qlTgFz4fu%eW9;zt*^9Jj@@F7mgQJrZ!B;|JL8J=O=IF_jp5rUEiRQc z3zoJK$tfz+f=&;Al;iX@^1auJ9W>vtSqTx`t9ga_Q^{d~IRx@E(v!p99y+AUaeH;- ztCO_gyR&o1&ISj$u6bjnKXwN7GTLpaROo%L;f;Sq*CT@J*(JB!6l2RgB5{zwU>{Ff z+wnxUnpNuvW}fce2Vgw%#42ayZG-?aN$M-cJ{S1kPVmg}>3XBZBSR(xgk?Tf=OdvR z74$v-0E+ZIO7B!Qw}|(e+$(BA{{X3)BZ5(at8K;s-H>?e$*)1;J=H7!0K=a%jiESA z#VtQW!hCV!IkkN{IIhs$8(_$vXHgThXYQE_43IK<*A?)>*)`2_9XDCFnkYeWxd+}w zLc|i>1DpVTO?!@qq*>^q;WfDJ;lDr@GbD*5PE#dujE>_Yk9yPbXN)X7H=tTy>Jiwa zv%FG0v@xInkU}_k`k!D=P-~J2IrB4~@{hS4&SP8fq*G}=XM$xS_7!QOhHsZU9~(Kx zEDk{DBv(7C_zrv93ojOUn^O=(VvVJ>fp@wS_p+US_ZZ@`{Bh&UyU4A)M-A7PA(*S$ zs;YU6dSni87dbt50qScu$Ku<^V=j-W+j(aDYn507J8fW80yzU9A4=_o868tN#&Fw;*Kj@+ zYQ7~&^~=bvw2dm-(PXxfmuCIBIOJpwaz3?J;ps@UyV$jKS**0?nZJ5Bd4Yin2~rPJ zp1nY>S<9AAGH0n8w9<2iwzbXe4#!;Z*M;=27D0PuEceAy8%vnJ&|`pa++807<`^n@ z73|tJtEAhXIyobWbr{m|5q9j0B!c*ELY5p3fE-uLQ22`XN7gOuF7H%Xv|^o@m;Qwt!tX4j3(nR9lR}Y0z|Q&z5B7yWN-Onaq;PZi7o)htYo8d?sPS+&+TOx;7naNl4>`|sF#DctlNa#ofh6g=s$;V=xecK-9Q#1XzXpQ=Xn@nNg`r4tf-?T zy1yV1pUS-NOYz@{=eA8X^%F17p<;I;WZHVCLO!+F-|CR)Z>0E#RGLeMl4gmdhj*Be zo@7@!JGPb#19O9pmFFrP)}4=brCO0rl-}nztZO%y*IKkXwbarqkwq*Uuo6&M5s-2+ z0nZpcMr+x;IiTC$cv`|OK1(F!1CXpIWssIua-ig=jg-Zhq)170jylF+hw zZqXLtu>bwYEpqhWn{9I{!w=owjVp2k$ zVwP;kq9#Ly3%3~OIL2$e;o~S?#|{%Qnx87PS7Migd_}DIZ$gqAXycyd*LvHTz?9oa z*kOfWTV$Nz;~DSPy@N#X#g~q3t|Rd-uc>Hyj-M#SvMO6{M~z5rj2q=7oR0kV#yq>i znl7p0oeN32@jc$DYb}FDg~BRYM+AH+bHg5(&PmRCSJoaN@t%pM+pXl9a$b`PmAdlQ zP2hC-yNn!^*T$nq)3qtCv@%METqe@FI~#xq40F4- zamPyfOT+&F7$uKGE2tP@ffce! z0iAGm;5IUMpI;hER}UpoG>IY z&po&H+_AB}Of-6(Ri)mouUsVip|FO=>&?2FCGykBVhTwaQMrPs2L$tq)$rxDqg~0b zXcrM#I2Tr=t0FVR?AE{8g0MPj+b~NYuQE8ouD*ZX|+s>^RBf5$j$v;@e*eYIg~#XhPyWI@>7Q2bjbk zn4-uq7=zEC&tCP(>;C`{^$#2Ps?=){HPxEQy{wd-qa^&e&&{+JAdF|zn)h)xf%I<& zU)ky}X=N6vA|w#ZUP8n}iC8nLG)ObIfO)|OIM0sjJG9SPb5lvZO)H-n_&31tXjk?y zYC4sSQF(0z@DRyviMB)pkPcfPFV4yUJ9^-F&Y|L6568Ofw_2{NacQMomzLN7rb~Bl zNRMe?8|D}UoPbAuE1tX1E!V(z*LHf`SH5eDYhv8yD z9^+1HTXj&e$s|}*D%sr|oM4g;c{%5TYl2m(NhLkcdjprynv;Wmr>~-BH z?WBY^mXXO5tXB=ca`}X1L+vLZwnu8~eivP7mfF9GtuA1eE4iaD2(^!Lt4Md2+)mU1 z`;rBC<)4amIAXT2mdow1%Oq(dedPIYOAK?2eJkr91X*}*PqnbtAc`xCtJ4TrSnU9* z-1#hdRvdH3ewDrfI+c@p9NFFuG$~oT+`r+CA3@aNhTl~$BU((;P6M*A{o9DQ?FzDh zGrO-N(-`^M-^M;D)I3XdcMOulX>T)#ERYzZ@=kEgf*S`JJdSJX>#rHv4}No9 zKZN1%%(igK-)w>HEsC_45wcr-qF}}*S#k3QQ_+uH_UZE$nG5(A#NHuk(JWySu!h>z zo;Zx)hCWu{TmrZ%tTE0oJADBbzpYQE*{cIm8KbpBdN=}upzJpCpJv%I53Co*B`+52hsAgmW9YVwNbFyG`=Q zL*&T772EyM#{`p5Y5p74uDnI5YuY8%zlZ!wWo?;k=O1PJV@Vkdw(3Dcy+#VK`Hvg} zS=Ei?MvOPe-#e27absrmiJkuex*R*7JmT6>-C$|Ldk8vkx z&M>(-81I5bV)(4+-Zb&S*SrmHZxoFeoibsO<(MYI(c~9WPu&>6J!^)RB}z`4O&j8H z&1$UE>c6c9X}%xv9B8_(y6p^FYs= zmVvCY**=+WZ(0_4Zr(!XX%vt`i~xa;Zb&@m6}NY&c!y1}HuBpvFj|!)NOFj-K*2rN zrFm_vF=+Qt&v7(z3z&EBj1n@$VC}|Hxf%Lbx%k3MO-sQx`fifawd`(WyDy1KK^O&a z6fWPGu{*aM0nk^-Vm;~m-A~f6)MFY+K;!&Mn%=XmY1bOho#$!rpo!K(V~{r1hhaN_ zP&vrwA4>JzSHw1&*Tb7}Jf_AS7G(1wiU86ijCV81mfmxMaxglI=d?{sU3gZ`>s-_B zuKdRq)>D>PluDcdz0`sLBjp{q9^Pl-*)_c{TD-T_t=iA+LNYfD28@opc0AVDc9P|2 z^KostX!bfJ@w4hWTo7EzB-YTp{zsPEQ4FJFF@%CLaguS#?_DO3dEiLzG`(j`mPsUr z@-wN!auqz`AsdP=03mzuGha8x_R-umxnSr6;o=|ypn^K|C-e5NO7OJWG}^7crF&)e zeJa^;JML*!xa!4$=Q!iv=}r`5MYl>RU-j4Txs>JYQc`;zkB&622Kax+@Xg`Xyo*n` zb&<>AV~DuUK?8t2G5!@F#))TmVUI%8&a0#EhT_`qX^fcyo_4p)yGbj@7{znxWo_e~ zV)s$g?-Dz4D@d_Q+ZE0URV+vYcR|}Gy#rP7PL1N0T>>3)9V+V1*~?hUOkyLu`*MRPN|eD_%WWgZ zw|M!Ok&to;$EV?34Y$QV9_i3QZx*w6`UIJhk#mJWL9{^X9oKjLX$YDo;aP*M@vsec-(}O3|!L zWpzp9w$*NC9(2tdfGoR}iP^L$2*JVVd*ZxW%i`9#r)pnrbhmh#-Jy7+w~i%~c)V4~ zm2;_R`qq%DNKUZQw5j?QM=_}FbTl~;PH&l z82EbneP~|k(>t{6Bw1p7q-d(!H{_6vK?8pagPOvYCY&!yPp+TvJqf$0?vA?4!4mjt z`}-e9mgX%Y{_0ec?L)tofRK#7TF3wgC5g`rI0Ovn_@*BXSZUgKgY`S>TifWBZ6av$ z?<%tX@AtX+TX^#cJf4{5yw^+B{9o|)!dq>5ZlGzdhR?J-P7*dy`OCN7IKjp;bI^=b z{v+`(hA)2Csp6%8XqG|V0TWS%aM6%pRxua$~S%)}aoj@4+^IZkkgRQmuSoEI}&u;pyfd*|^V_;@^ za)EYy$QKMa$o0>s%iaRInirApBblU*RSw5E!=cK)dUWnHkSpvaxQ|YT%JWWzH7g6k zmoqB`XH&NrWA~IVr>GU=W;v!JHRB3&-MXrFIMPVSmxAKn6e#ZS`My~o zgTc!AgOV5TU;;gBi0~JUJU44$t!cg}vYJ2a?6itke3R@T1UOaWzShcsbDH{dT8hBV z+KrTpYDOiS$s@~I7>o%>`9V_eBg*r|(`I@;4HoCNuL7@Xbr%tDSC0 zQ$n@48il>Jw9=yG9(l-MHYnb?+s{m#a(%m>2*DC-_ajHOg*2T&8w>PpzC<$KBP4PH z<& zX0=tl)-Pj{?pyYe+C*_M-b16a5{v^9I9%Xl_O0<4i9uZ=snb)@pIUfR!nzHngKeZ* z1h~~Fw{%ZE3(jT1ETE1QFvnhUc+Gsf<8KN0qe5FJx`b(-LuIWcX0@6%#_~o++%Opj zspHrmY4GQcbSqs|Adgg>%tO;Yg%)+SXM_$BZ&ptHk8rH9?-T0Kt zCc9#n2{S`*sU&hhssU|_w4p=tkOnh@$vLkJ+qXAHIo!h};DSzZUR~lxlFwdkU&A)K)HOX)JvH>mn$9_yeErQDCob>+qs`salh0l&^V>}Lh2oD6 z>MeA)%`}rA-}!-Nj!sDcs{**m?Scufr?qd55%{;^)}N(nchduLc^r2(=L}>$@F6?)4-(o{i#UM=DFp5P1UbWg$pL zBn*s#zMLB1{8Qk0Wz(#6j|8mxP2@6pa>6H;N$`wU5=g6n#fJd5r%HB%sq6Y5iEK4b z2l%D@NoO6vjkK4zXSk5CA&SB-EIQ|&qrH6xVXJs<=UIJT@^7%Bg@iG?+$FXvwORKzFcc0{f;h@n3?xQ*S1TEH@f#5zMg!NF$om zzsw2qN#DsoAq8+fd*@a2S~5*rey2?&sp^^SQRy$Q9Zu?7OF3;W9b$%ic%qsXjQ}ks zR~(*&uy8=nN_MpkmaA{3>DStjwbZO_rGhUa*(X_TBTxV%06cqm+w*+H`q!W79}#>z z;0tx|;8vC^i7=91zskOE4kIcC6CM3?pL$+4@$QMIURy=s=-nfM1A<@y+zy|=AHq}- zxG^L1HRn#9NZxer`yFt^N8yq@!^L)2QC+T^VXf(!Y#N=hNo}QwKt|TUDy2%q(hv?5 z{JGBqrah$6co#q-_9U9(dud{Uh9R zIp1e2a!GC&j4Y7|)bZCOwnsIg{{RTyhpT9l>KaPMZf&g=;?hXQWJupAOwq8~ts>#F zxX0!zvk!=r>BduwU)OVKQBAuu*5EGwd3Y$7q>9&m`a!@U}ZdPVsbEg0Bg3bDvoziT)po903(8)Ath^`==x3l zuZQjJHMBEF4U_EBW0*kcb#h3FqsPopzI6C1b$!yQT3y zp{MwBUX~yXGRF>~Aa-^MxzTeoDI}AOWDJ~|#?1yyxB&N9I_?`9ytt2xxoN!?hm#rwMjmoBZj7~=6}K`)h_i!n^d*G)c(v2 zi*Dy0WD2BiRly&-J4wj{9D9!E$6EfEXW}b+ooahM4&wBQW<`!%ka*n6kzg^$&9$@j zt3Dj~zwrM6NAV}v?C|i5LmC-ULnI6}yfJg+}-`k!uy<2<3 zBY^^3{`AF-yHv(s%x*_u4}L4b&p5Rj9|UC8)Zm?5rrQkZpS?11mmd{^TwNNtoVK_tBa`T zBt_)Ox-J!1T7qQTimQGZ4Kl|NrpYCB#JYY z#{+pEHY>=i^?R$!HMgBqh@{*|7(EZ(_4liOMzrnJxvT1Jsc5j=Swa+xlN6kfli~)uqXCRY|jFFCOX7)PPS4NioTOGDb0sbmZjMb*Xq_=TOjM)I@D9 z@M9c-Fh|O{JvyGBT5kPBns3Ou$vtW`%AaULDkn@E~_Na9k*C7w`owQuRaazI{n)|4&PGo><08InySS2Txh`W@UUu?H#s^H+)N##a171oGo{ly$ zHVXnXoMZK@uGEd)ILRi@qx5|X!`hst=UIj%wrNCaZP5h1ak%utk6QFCH{qXvrVk?C zwbh|wj8_r7G9ExVW7Kpf74p`Ft=&kau4R!Cn=Q1JAy43Xb?IKIqw6sL0Aa~z1=Jz# z)5|i%th-)6;*-oAmg|*oz*kC6NaK}0S9ElqGhHK0g|ur6nFNUc0J>8UF`b-lW(0$~ zIN+YOd+BPi*mB zJl_y($Av^XMy&)l4;d{K5f+zf^%64xFi&isUusdNpjSMaGpzg-4zX;u+RT?)ZMEXR zl)~J}2rGS9dw8bFrFJZ0&SSKSI-4?6lJamr=T^ zMR&tzj11$yu?DgHOR8K&sYcrL31e;o{IQ_~{Gg03c^>Djau4EP2L@%=ZEpsp6uX#( zRr|bwxVG%){hIV02gSY&)-R)NN>*!7xNCdZR%~&>SIZtT(2u2II;m@7V2!wd`;rd4^GP$hb^S? zAOy2W1ZsAU6$aygG2im84^;6J>VhS(xL9NX_n`SpXB-eXJt;z?mqJxZHhIqV{4+aK(!g^w6HJbi1>f8h^0ydzRJs`9WKl;eRvAay)(R?|z|fPers zZS`AwXo^RZ&qIU7S+%;i)L?kQ+CrA;j(b+{Gm~aC`g$Z_qZTHef1=H&G%?*6%S{Y( zfgFn_5>dHB6ekUW2~&bP5DjW2quan_k+-lJ2)W}u>L{#lZVHu%o&A@S`gE->k}|ux zW-Hre3l4&*7@k3u8OIs)uD172ySFjGse>TP1J2Mred>(*T=2uW8G70vcz`QB zhkwjZY!B&Am#ZPl`x?Flgz5Ukcb5wv+$u6UHah)%>$KOkZ6agkN~KXgW6p5L(-gmn%_^i z9$m7ujezXqc|OC?S7)VZmo~7A?MqOO(m96c?bWw40(cAo7zgpC8kcqzN=nC7;tv=+ zaz`D&l6Hudi0#`M3G(sIPr2@DrG}}k-dsk~&e5O&imLP1BO}^jy~2TigzAV!(+HW8*UHF(4KS6VcU38>T7d(atTeu5snyh^JI3d*t|30_$-4K zl6$%GVn~y4U8I72&U)7T*WBlLdTD4|du<|1Xznz-HfxE>rd@K8COYH*GwaV4t>LQ+ zT`Jl~wbM?cc&yCw95iS@1IOb=i#6VxYXlmmOCpl6q0Yd1XQ&4?MkTw3c335f+BXc& zvJy*VWC9l*O-tCGO|Ddz#4z5>_DcYQNgL;U>_rMW89ZYnrDAHgP}*5VaTMytBE~h0 z61_Mr@6HBsOw_EcZLH@v)4Z1sS%8RupplWErxoY-R~I7G!IIu%DF+<-57wpBw&zqS z-$ZTdv&nis+jlId%LC*+5FWy?Ce~~b_gTV16aj;r<;O#wxb>?L>N=#B@25yGF|pS< z83O>5oOGz{v{+Wp5ugPs7cn(xH= zlA!x!%>lvfwBYuwZ4<)Qa|YBV4HPhyDJw46!}^|?#yfYeW5m(PeRhy}ibPUy`3%j| zu+J5vmnkXpI}om-jXPX%COVey>HMok&sUbjOM3$tRzOu1d*`lC;aWGI9JhF2vbUL5 zLN`dtoDN6KNa}H(IOef@L88o->uIJ~+-*X;^uPdTiszi$dX}Jy2VA+8cDO8e zeeK6S)zGH5d3R(YiPP~s}6~J5TuWu|;j9YnF0b^a5 zAn||)uQl66@kVO`bj$dj<*w!3B$B%s3}j;pq?7}`ahh?g-i+p{PNJ8&vCQ5ynj=eN z6n<&GLaQ2l*dwD4Z+gnnf8iybQjg}VT8!-^E(>rw?A%kz~0 zxEWwK0NKDK`U6vVo5b3=@cCUxM{6@W?vME0R{(D7k&p=Hx$A!y>Gv8O8a}5C*ArXJ z_ZyVu8JScsxY|eJJu8awb?&in=6l3gpq-W^kM4o97#m3^10$NK%a`6q3a2T~)980P zcAh2CA5_*9rMk+kyC>!cJYaLwjAMaZRoKu=PbQqQNOzK%>^Mo1#G_-HExpoE9&Z!jsd0 zdgG`yMi}mGbXV3|G=fKU7V1b27db7Dr%v=KscsWop7qY={{T&~(RXQ=cZwQ71IUMZ zKYU{yh^sn3pB=MVTg~O8m3Y<>w1;7g`{Z^t#oR8UO}+ips`JUhAO)Kzso-NC=C}Mj zo*=rtS@ftxg3vUQ2N)YygOT41c=xUv(6+q}+7sqWxxXwoahK3_){Y5orH^gQ_+uJ3 zJB9{N2c~L8()=gk{{RphJL|K5WMV8CN0+&WO!9vrUTv?~>)MU~0QRP?CJ825GE}Pd z=)S_VZFK!Y;gaIZYcw%{!H)!YCp9sSmNb_4TODqzd1tBLtU57{I2IRa2GF}zyJNoG zab8mmrj{<+9n9@N$_UTMt(>qO$oH<*JU^`3#AiwNq|1gY@0^X*$lO?5Y2GKcxY#DQ zStEDH39vB8CZDr$Dm4^~mzpJponrFAaQB85UKv8EP(a#OCnwgc=~`8U=x%M~mfH2$ zGzX6K@<~1J{8>=d)9P#w1?Cj5;j5i-MgS(7_?^c$EO?5q|QeO_mW*%Fp z+GJhZ6l9-HoL8SNtrV8?+sF!+IY!2FkVikIT+#IF2=09Ai9i70Avw-4KsoJRr>1yQ zMU|IR)a_r&Wz2>&Av@!*Vt6>G$<47asmZ>lj^4`!wX{zaxQ0m(Dde7Uf`1cTZ-Vtr zGS=T0un8P1D;FiQ#N;stpdAfs+-MfY_E9yIl3Kd&hs!4lLFh+bm5T?%?-E^H%WXc$s)%pFfEeDpc%*FE3m(xO}EtT{?)f`Kr)g-MvB1a7$p7!HMOMp z15cPe{#M_~Agpo|zo8(EeLD6v$=q02Szoj|&)Ok?kX54!WFY6DCj=9Y{8M!$3&ul_ zEk$%#@wEC@w1VMo66V$wD;de!yyv)5e=740KUcQ3nHmchyS9K72w0Fa+zxU0Rc%)8 z;`(T8EZS@{m61stf^onDBj2riCX4XWNo-=g(^v-JymGcT4vmAyPW)B-E@-JDXIVko zO!M#Uce#ezSXyfl9!z9s?;qg@Cj&meg>(fj6(Q6w@8dDdj0*Bt73_Pd?mcT`P_&B2 zN&?^C%X7IkNaIsq4%Fv7nQbfd?dSovgR*|Qr#n10p^NVi>U0+<=MQl~2oP>)JdX9*X8YI_Ld5RV1kX?*y;rGhL5}ZgjiLyGwgmlHNNM3OuoZrF)aymKm%` zrP1wVxV*U%-Ayu(T=XAKILGUnsnYCRXMN8Qmr}OU@dPqvYmge~qVNMT+=D%EFmqU% z!+G+?sW9@yY{(en-ye;3F=!v!TGk-9l6fyD0vOZ*l1?$rX?VB7SDItXrrubkm)ND) z?IQr_%5ZbfHOS*_PTEtA?Q_g@*&fD!I3$8(R&*-ZD*cu7w&1cH0l@4rT;-MB%3aH9JMdk8^L89Z*w+0vcgsgwlLhba&wNuCbfJ&;fD`x zeSdOoqLlftI|9w}9ysVnPioTf4wX z({3`{&Nh9*32<>Rk-mMu2&O$k!oODBnMS&)6;NEjy|l6XGGxQ%JNL8*B+)?wD=WI1eY z&mj9`X1c9*=Si{9?&pGGHQoCpfX3tZj99i=bAgN;{Y7Ip#4AZODJ`e8W2rG!h2kG6 z-O%84AocpxdsN-7Ds<%-^C*^XbqkFa+wGTgGG4508H^Cw$<9IQF^n4UU$E-lD!sgx z)kJ{~NXQI9;C)XO>his+NfT?|fenZMV4=3hR_);BFj% z{{U0LtZLKd*zco0RpuH$gl>Ej z;ecU~Ks|HZdRJxRi1kPC)|(~mgqJc|y0rI$E0Wp5Fe8zVPSqWp_j-gDnufa*n>J#x z7#IzqRQ1O|2dJ!STAX$@r#VY=pwjO(X)L0i!7abyUKSU5nGlpvb_HC5+~nt);C1a@ z(^)cF-s(mhoR(Q6QbXslBRIxuEM7yXwaZ5wu*D;?TP#4aR_&5{?jDA`^5Hy(l3hmR z!x*2*cLRKw`UBh6xqi6q$Xu||Z=0!4S$n8_>r1beXw?FQ84QFBHhl=@uJ|G?4C+fR zw{iAXA1b@4Zb&LRdT@S~>iSo~`E|V#?_JYxW1iXtLxelzDS}yP}gu2$kimLyq1Zbl`r-1Q2e=O7xv)0BPWi-kx@INwva{{VzC!s6w0-wmtXT;4R2 z%_^=F3YjW{9A}g5nxp>!2=1+5@?1%4C4yNE@8_HlI5-*m-1Mm;DWz-oo*lK+3qu8~ z12H8R&sE0NK81!o>Cou<=DQvI>vJiIVGANi?S*}uVNy@xCN3?fEe-V7 zQ&LocT1(md)hOr+f?S1Q*&P7%A-G=9DXRh9yS100GE-$Y?v~DAi$K|YS&JW&D2M4EW z>#WmLv(heg2Rn>2lnSIXV*ref{8rC_uVL{mjoWK+szVz;3{^?Ol3NF`{&kILDXTNx zp;bY19zmyQ@?QS(7|TRBIN{IGRg2#a$7Kw1YBtX9*^yRIaGrxc{{W?WMv1Q4_*(w} zP_?px4Np(IREefBiA*3dY{bNTgye?DTIxK1sOjDyzqZ!3E59nyZIx}U(mX~|JOU2f z9=XnIo9fCc;fTe~_FEtS)BMyrPKTw>tXNrUa!(bz6K+H-JkD`~P73<;{Azy>tkFj- z7n*#s+Q_VbdabpI=v9c|*QVI%z96>o7K5w7r$>D>umrlo2ey(#B>|Iwpt6o~Yv~UV zo2?VV$5Fe}Et_@+*|sUcKQ>jp7Z~HUdXZ6=#C)vrwQ1Q!T=_0fhVp5eFx0P_Ic@LI zk0~271y;xQ^A1fhHV={~fjGhM^erC0uI5lXU5XMxT9BOV> zOC2+Q+Yc&2FC=(;k^{#YFu*6KFfuxxX_|C4{wDD>wicHbvRTC^+N8K;Dv8EfBy3;> zIRUzJoYezr+C{2aOBe1PhU>Irz-;g_(BiImdh1E>%=6gW#VSR8m6+sVqyFv~9tfpP za=phIGHJEB?j8cryfD`{Fk4G+admZTEUOZ}af7t5BOqX70=%bC@RhZ`qHd6x9yy6v zSp18F&Uy?VO6zpZHs8a-?&HIAeU?un&WC$$W(NcY+s`8v%g3%vr%1F?Q;zl;7zAAivC2|4uuap4?upkv@~nUAZxF; zuawhyLzYeD#~pBS*pL4JT@>%2@esP@k?B_29*3yBCfYwPILv}<3@ha1V2Y!}MwxpyACVDViihiy)mG;keAMmKH*Wl)yK8R$CqH72Da&3$w( zZ-U1={gqmFAtMXUOJw|nk?b&Qrb_C}^VFpV+Gi7RbsakL*818I@^1S$kN^nzxX1$; z{&nd7A^4Mft@vW!!n&HteQ~8@W!$Vh$g|7Ev;bLfI0vRHChA+$q)Dd0(7oic?O8Sw zB-y|y{{ScljDzi7YPV3m>~rd20_&+uY;O8~W=*7Ffhh!f;u5Ign zBeu4)w7rsTvPzN0Hl4;-L-)_r9z|HtbrEx~2h?0y*~#E5(u*KMcK?li41t-NgRB!*NAAZ|GXk*Bj(O`e5^po`D?nc8b-cjut<*30CkUsSyW?l5Wg_TT#9Xui)W0FHzQpw=ljh&Ec#4HtS3B0g^1KcU_@fIuZEskzW#D9X8D* z)9w&FZ1J=g0mv~c6Sy}YFeBHceaG=j$9@3U^c$(Pn?Z9ds>wCTjk2;FZNWXW+*iyE z;9UyyPThNZHMRT5!Jt@+E;GUce^P72s+~#beNIU~V?&mrY22}E@cY2`9v*#C%Ub(o z?WkEKgKw6E0g|AeTPJ~zwbo5%Yhu>Ow#fuDM5KnnSod_sIxknAe&wTBUZ6 zcKB=INW3-S+r3v()EZc=&z!T&5`L26c3HvTP768({H zt&9PMw9$bR5P~%Q+U+Pf05R$Jutj@x>n>D}nX5rFxiXQ*!2doOs%`Y2ob+8`DG1z9W1Hu&^K7ejl<=HXODB4a9dD z#(5p<=PwIrejV5RPdwK);s%KQrs-}zX!8KsfQkY6_ynFS_AJ}zHx~X;o+ps-*(0yg zzB2f``#yMO^({liejU}{L%g|(h04ahWG<{eZb?V8`yd=;wdc5z>-+p9-xw-RKVc?v6+M_l80kPI*fu&cT^igisF zM@V$b9X{IH`Uj5Q;z(4_xiP&SGR(4W0D#3e4hhXyZC>YHz0-uk-p=tODP&}KIr545 zFn9`bc;na#=!Deeq7{0TAs5jfM0j$~!P-WZ_WfCgvSe80o(2sTZemeCl#C?W$2d}~ zFyo3WrPX|U1-_-BX)s&qH;fEWLx{zrDI?B6atnn76(ob4;;}v*+3EKY%5QZGn`p{` zdu~96-bF$|U|XIu*RM?1qs8Ib^tOU)4MN(|#w(I6L|dLHp>zS&*Kr$x8-ZL57B$n>mg)x30PT?PBt^Dd{(UKQ8%eM)KH zPMF$Fr-?63!?5!t7QpThzi+46 z>BCXj?+aV3tR3W*EULR;94=RI>C|v@Up-OOch=1NPhmlO$$6gV;=h6V=7r&J?Jo^o z#c`uQ?=APXL#Z3pG05a}Bd&Va$Xff(b&s@J?lZ)ktdXBAZNnTKV2p8)ax3fIN8(MT zuY>fz2 z+*}0MrHEb~*c={JNgYA2N|!G!*Ua)MPIT(GQE9LB=6U}Bf<7SVF<`#1QIAoKj^2mev@agsYVpafX>zMYDDrNgWLJ{rMjvt5sba+E7|&dE>*c=` z{59Z@4|tZ$cv>Kn1(WS-3vG-@INA_{v~@jC9qW;84^;4Aw)0LcbwalYqD|W~$8PvO zm6k58q0Elhx^-i8t?GS`@ta4{^$!FcM?<^0OR4RkceO}%h~!>XO#c8XGAgkjcdtWV z3tV`ESGu_JQRKN6s*tz?V!1dhgpZq?a^3x_=&gQVh&NvkZPNDe$87Ve+j-KmO(nj@ z45}1^w30Byj)$n?ygtXko+s5EZ1nIgTTB8^^@|jNm*y?W496UtWY#YcDMchK4H(8U z=W5q1Ug{PTYkFnonFKmj#l%r9;Ei`I0wM-uBQ4V0u+KDI!9kNK^WX5WgIAVGIZlO^rooY-0H*P=SC^5%x?hrF)nnYEuN^G?Buo* zNMmGX^BcyT zZQ>xJVj4Lkh@?ssI;H{I2pQyqUZxuj8cn{Z20IyF7jAuxo$umzlfhcHr5uU&m~Jde zg;qs%41qQ_Ljp*1^JEdh09SqCOJU*dD(g=0=A0d9k)s60`mpUE2>^IZes6|op+RG3Cv1LCtG4kUbkF|Pl!@Y7}4o_)6imb0SC71`g zc0PN=Ll)jtjH2xTk;^Fu@br~lWy^abhw5rB=^lsTdmFD6_=sv##|Erou=4Kg&=}bs z0^jK}5%S8xS8DAfXXQMDm!`Q7jCB1bYlgekA+U~l657_*DA`^xyP|X|14S53qnr?T zaBHdfkMU38--NDht~7flwA7=HNT1Byi-y5;$R9CsIs=}+j=h}z82F9h<9DQ+-vz;W zZqfas-a{9j{{SkiVRk+~So6CmNGImOp-b64H92KYPS;j2^~-%%S=DqGi6ZdT{gtNW zx42m6jQNBI0b+gX7?Q(rImSnGUV@$)(PV>4@lS}ZFEs65_Rd|__QcMK412f98xeuE zj_$eJ#tE;K_4~U&3jL$Qx6P>{#_23~0%+ReTb6CI85s#AIOJ#M>6-cjz!yFyxz?@r z1-a5}onc?MN&DZh+(rwX(vqwZuy6<@4uhp!u`-g=anB7Tu6iGU{2uy_gwDE~>QYT^ zX0*4wRz-?`HRD$%K&4rb;~%Fy{9*AE!J5aye;UE5viU1_IV#!8g)NWk5}8{VSr$$e0RS-=C5Iyz z&q?5o3g1$*lf&1Vl$ZLA&4W!0u|!FiAv(y~dTWbUO6I!)5(ptf7 z5t1!E-XrEo6~Se4>$Bx4Hzf$iBN@T2l~y%9)2@Eyn&^B-uXu80n^Dv5t)Yfz-*6f^ zcll8}k~Z)*?Z{qfhvDand?h@RY4atk;DE!W{&Bh#-n z?LNshi%m{Rt?sU4cw(B`eT5+iv$`M!d1%23W8-c{;mzp26V*IzsNVQXTr%681S{Ie z@p&n6Zmdj1lC1lR@)?LKf=EeuE-V|t-ZFfyJ(l~$>tLhfHsFGb~_Ao_sOrJekpi9EgwL% zUlP8Nr%3mSI?EtmwN9z`k)uGMq@8fifq*#4!LOR^?R+(7;}~pZ&Aoy7r$M8&nT?wZ=)fVAB@?qOt7*UEsGg5<1uF1g&KvWY!%2TXUbF^9rh zj)|{nvd+`BrPKLP1&sXgtCC8&`>ldXh8+m!2E9YWo-6os;+;TvU&Tu1BZ6U^-`rMQh_Mz<#`g;oWzyd0B;z|AB+5xUeh zD~sP0=~qvwX-T>(qOM|<(b7LA;I39S1QCJRz9Y;cI8LeTKM@Se#B!H^`rAq=BONsqY>?hhj)f*uaG(@r3q1PE1I2jok=Z^LCH-^3qUd^B+ z{vXtrQ@hk8lHFjpZ`{gPZ_18vvM}c)a5{TbemnSCtm+;ny0P${m#N&@>G4PA#$jFX zG>+2DjQAM~BR1B4cHkZ{T#k$2zZ+@+Y`i}#@?F?@*9&VS7-WIag7&BEVwKOPTY@pzO&Ob zUkcf#uWJR`-ewr?<>Mxihj*J zg{Co)jl*f%_p#3;bv#$nTCT5ap~51&uyQO+UuT5L<}vw3UGfxdW(;%J@yM^4#p7*@ z`n4Te-=&VaKJvr>N%~dJJ{1t-LX$HRN+%+S^$ewP_@}^WS8~&Eq*!vOvI+ zTN_y9u1V}`<=tn*_8LXa{kE5BHLj^W$M0n@s4t0#VnSjt5TIa~3IRNyynUJ&HC7zc zTAXz;KF(aJotN3XL-7rC>zzvGH;!4vs;zJ%xDbXa@^5lgSYry@j1HXho2+~`@xFz7 zb*<@_@n6So%`~=;ZjUr)1SZ_3)+A>b106+8@Z{+JG`fmiX7V_eNc^;p0p&8hVVHxr za;R*4z=BRr4>jLw8g`MdJ?@F8++N*j+B9BOz0*h|xQ&5e`&~eHR3xYkl2;kdD}y(w zQwdHpa4mT<`IboI)^6z_q&s}fJhyOe-A#2>d~Y@nw?c8*tj8R`#Tr<+c!sYSwW==LdL<0h@6 zW$RxaUg}`a0u4V-M-4nS0hPid9gis7RFD)A(>#OMHHZ5`Y1)y}?6tdDzR{%W0L>Ql z2{TGmbud2A|mo`T1>Qf&+fK@NXnJkaBAIsgUiQXLfJ~I*x1Gm%=}2vx{C=lI|NDSp@13q`MSyQwQ&;CpaYI z*i{b|d#l++z9J~itDKvEg76_^+%m}23NhBTipi!3AGDm!bNilStO6= z8^pjBLIVz2m##U+E9}pNnpK&0^xd3uh;{Bv^JI~VK zyp9G}U7{9D{LaN)Kwp^v+%gYdE5vo5hC0@_;Y)ky^l>1aB#CE<3no*bP!81_w|w2t z(!TFEz8CSahs^SBpGs7eL*$o6NifWcnchajfyOh(HRclDO>?Tr;k_a$2(h>xdf5r| z`vnt0h`iVzI1wMew5e9X`MMt1s7a|?RC#|`sSkGgGvK{*;E##CJK^bW^=&R_o+L6C zRr3>I^(&R&d+}L*67bH8bEDqaU$l{31&V8T5=O`xLB{CZgM+{&bA#5uN}$!WONeZA z+g)PT#_7lUWO|IQ$sFz=KKKvpFay;0r4eZ! z2-ZH+ed0TRJ{{9If+&2+Ati*P$}f_{u>^8<;Ny%B9`Sw7jjn5#SNdOyE#7IQXNp-N zXwDq-m&n{lrZ7jPWTObv<>+fqo>eZ7Xwd!^{5po#+fcQ!Z9S!#qq~OcPck_0*ajv6 zqy+TXa(L_By$13x1b<;RnQe7zWfXtt_gh8@w;->aTnrL$0m1oL;9|JH4fun=x^A6g zplbJ@Xw(8lBf5=wPbwvlsaYEe`&n`bSH>6<(!Wh^rYUk_ zzJeBp*h{zN-6|s!gbV_b0ON7a;m=WCORacAPS;mbyRca!ir!efsi99eqbLQ=5C*_( zf`FWlo7T9efk|7T*&N1QPl9E=@ioLVB-Zi662~KmOkzE|`2h=af=NC2X6SiwQ=Wp4IFE-2S0R_EDWTbrwTF$KyXcZM~*%p>oIt1PSrHsYFq1DX>KE$ z^`p$8WRvAUH$F%_a7pYd$XCOce-FG*Yp-4GN#pWoiYufsO)dy7u`y7E_T(~_8OX;y zIq@)XgY0dGsH#nOI$sN4{8H1j#<7=KZ9Bv5F>&O=t}a}+-T6YXMm)DWv0i2If5S&m z)MW84ffSx%T#HNlD8opw%My^qSb)VzLU2a_jMvmDt7=ksCT7qsw@(DCJc(-nym%vK z207T?if8ixK9$2Cds}jvoc6zId%GB3RhD!ac-WyT7=TI1BrmQjl7&Yp zDJ5gjoFfF%XMt#%#--w+7KNy_rMxf*%q3uo5S~^}41zNzTMi_(zmF!4pMp{iMyCPZ@tAGt{mRY6d{D)HP7 zyqaVDAD>Y1MdNC+TxrrzaLEHmrGYscUw9;yIRNqZxUSE@ekbtHhjc$G=6EH%xf>PO zgDtYFhEpEk%%q;UI3v=#JD-a8)@gAriL6`AA<8sYOu|)&DPYl(HUq{sXLfOnR&=Xc zUkK_!y&}&S@fU?|ye$NNAJ+9L(oZbTj=aK*#{=Bt4r)&bc-Hn+ZwhL5*0(m(Zu9y? zW*9hpag&Zg0D9N2+IWY;e-^Zd(Dl9c`i-njBVJDHhf;7uvFABqwE6>II{4#8e+u0L zz6owEw#6Lw@@`pC0NTW3(}K)qLK zAH~s(tGkD{~Fk1_FuN!Fq5D8UmV1tirRK^^vxisREN2q8mWv1TU=@%C00WX5zduR7Z zBe1RqRns&LJ6%aq;u&nqmTxJ3bQ$PZrbli?bNY4Mv&(U-Y7@(ukIej>_au|_tH#?) zD$fh~j>J0#KPXT$_>)^Xwyb8OXLG&LuDl@v&2c0~RAy(5q+PC$jAd|p{{Two^-miV z-ZaRTH|QOK+=JUE8T>1mvv_YM5W@L{6Tk!zGEP4eR5dF&p`J+@vkQ<=k3;QJmb#iK zr>S{-Nq=!>)-uj~mtx*m@D}yQuf2ELHo0YQqli+>$*2*PnVSfzy;lJ9p82m9n8sx$ z0CtXq^)=t%JHpH76<^sN?h;$Wn#dPbA*i&ybZpZ%|*?2J3A z`BO}QxMBB~oE~_`Ui~U7YYj8QI;Zw$i6A$AQb?sXovK%oNd%HX+&CD=HJ{+`72Rpl z&1Y!FCNf|}<+P+CpOsaBz&xB0U0;T;ZxZhBLf4fej&ZSPWmc9l;E?C#GCGWplzY~a zuNb#;o)qdgX7n|5m+&^TX)TSc5!*cKe4yS?p*jef_TFS+~&o`Ftu!StDagOLQMM@+n*%(c2RzbfkyWN>!!gNz)0H7+eX+>U)M7qMf* zJ__)bgKWcCRhse>^GzE|BRFC}3K4=7AH;Ey$2HPx8rOz2bd5AwJpruUSK%Grk!=>MW2imN zw5^3u3djfhhnll#HmBi@H81Tg?OI1eF?)pb9Akrk-*?kKz3XpA@lT1QL#Q%GW! z*^#!Sqyf1>>yFjc`0K?p_`R*~^~qI@uxOA%08M}Z000bsI`UVsl5gK&tYnfu{X(1^ zt?zDa8c|ywg=6stR_`zu44aXfo z#&CHxs@es_Qv@NDpO_qspHF_3Qg__a5J;Nt?PicmHWBgH7$e%UqLv{xWOAUKmK>8z zyx9pb&aJo}hc%zQV|?x7r!-qbX7oJ@$5qpgx5NJ;wt)1gyJ@KALY-XdH`q;MHNcMdNWXo`5 zZNQVCT2x|j*yE?YS`*mnbXe@}WMO_(jB&W*AN_ji1;&dTM-8}+H9_;R$!7dI*PTRu zVhHFssnrw9W|4}wOo|C*? z(z0WctbP4z?W_@8qT3<{4fAf!a-*(2>&aJ4*T8w zCng-_l=lap&b5t}<}zK5k6Q4}su*sBF44KhIRGDg)f>M8O*(myFhX!Z&M}_V(pdPm z>MJT9{W)uCG}m|4ZDsxdba zvX)+)1J|0Zrg*mE(glJRxDiblStM_hdLH=%5141K6r5G99mMKQ>Uji~OtHw4#PP`v z7jD1{dSe}Gz3!K*+Q7F=rBVA}_4gjN?zfs&vbvR?uccV5mZRn&q9m0A9Y%e4uKpb< zZZt?Pt}NAW8S-t>12NA`j@hf^gG4&=TBGBIg7!cNLIC!s{{UrPNh%`)&p>PK-wu2# zJ|K6w*L3f&+bWh0&IWygsr2OM6{TnJr$$K{OIT7!ImC=MoDA@w`uf&h$_eVsYG!eY zvR7xsE2CXT41+sC$JZW}dJ84H*cM!|JO=jnudyQdWfjesgvAZL&UYA`=PA!z9y9q@ z34QQAW}aq-@5xX@7}N|Ra1VY+$*1h0(S&n2OGzsqKgXutOpcL7<_OR4JAqvWmunuK zZ!OKtWeyL>ybNPFCccHzyc3}KX5!CHo;!=HMwGqKJ96h3K&5bc^&XYz@q9e+j-hpL zB$|AS5-=?bNxaCabGgCl$I}@4*Hj}Ej!Lan~($`tJ4Qm9AvNSAJ-GA8~ zz#UCTrb^OA&?U11PRQJ4PD$hw)a2LPFYs%^`t9%bp0Vf0YPb==@&H>MKJQHW3}Y2r zT<}JV9lTn1g`xh;7TJF;SlFbyjxt-Ek&gAZEMHU3{@1rnPmo{3+P%Aoq#JzBNZpfw zIOeJy8umwPncYUvc7|b+N7FU*E~%m3*-L9>s>=*bZ+?@Jz*B?rWB(@za!gJA|JWJtw{{Rr`a!D+53uu3K;x|xaao6Tz z6c5id>+gp)(_5RFFXFdLVu^%roHKKP4=s-5bKbo>Rn#p7#6BO>7zW%_2-GU7oc!dG zfO-?&v9G)dHn^=0n{oDkBX64XWv4jo0)RQJ zMsOZb#~ZMHNUo2<{u|Wwb8&jf_B$zpN9J503d%Epx#Zvu!@*;XvDoBLT}FyWYCpOT&H}j_StJSY^AOVC+emf+~(#$|(S2pcRZG7)ZL=hc%%S z$o0)4-pfLhPqva-nZOCWgjRo0I^c4CmGhhF_x2a@UEN#E(QXA40uj1nC$AOuW&Z$# zEvM8iXScfo%$1HH(YEb*x~G6~ z&1op6g+~~mwbc1jN=xleQZT};7}#5I&H|1}KEvO=B)aRzB#-8q<_K04-SU>t-eJ@8 z^{)HHo*uLC>kqJ6JaA0!3$p@#ZaOLTJw0(;UX|dvS5%FzAm0f?E*$x4fO0Z9$z$5H zKd}6-_IsjJcSH;4E~*~U&Okj-(Kmq(3qAuU9Lo=D@f6j z8w8G=5yu#+ny!zcE~_=g+B}oTBSx_*GeYE!4tgkG{=HYX(*FRpbz`MycEzQUQUIto z<^KSW1a=jjW|FY!zGrk>@pp@(yqJwPSqV|F1yS=quo>+~gf%a)$|TiTq(H21mE6jt z{p@#P&N-}jJO!<_rlGFes8`eHHpOJZ11K3Nt0WOI?aj>DwI!k6 zKrPeeIO$nN2|W#AX0<&Y>sq+F(qgpxFt?NbTFLiV?dT4FUs|JSc>@JW8+O$=Ki)N4 zQqiQkWVMFm`G^%vKxNps9Rbf;$kQ|{_;q#DBr5ksu^dMu9sXnVt5Lepu2{WpZmzg& zr55WMcF6gO01$gstMhrO$}ZP!8kkw}XNl)Drz zRBm49-`=_F-B(c;#sdcAW-Sz*0&V95`Bghh%iTs-S)u`k;H@is!yU$W{Af{OZl};1 z5?X3jGT!RfLOWY!Wnj5;BQX1;9rNC~O=c@O?I43mS)7I-tfZ7qc*g@79M%qq^V?`r z$dZ+fa9m^Wa(bNCX*<~JR#ujJP3#v9I)|LZ8+>B`Vfer!>rG0`%2e)~krsvGbEn)b z-lbxrS9z}9#bv3_Ea{VsHZ~E@KrxKh&>DY-?X0wmtwU9a>8k>>F=BVV7j%CkF#E@@ z2SZ%ff&4e&&jHIc`n)N3ss>j?EEom*+3G<21x@4c5dQ#acw6m)CAgbWe=#mjRgyG2 zLPoq0qa2S~Y7&j56`(q*a^*1-#C9GcSF|!Ux0c7MvqsC=Q~*dMIbc1X*ZMG##1B~;EdxRg+ZnK z+ma)i5iEsK3YQ=z)fvF+lhoBx!^%%WrCXIBHC`{-qhGWx95z8c#dbPgtq!lHn+T&t zxkm&uaga_p$ET%V@mGX*Uw>#o7s{GU2(z8J>?*+UTIip@p77XSN{mt_T#^Xv0pmXO zr%A0C{j6F!Te~f1O}h^$#v9~yJApiOub^)=Ul_&UOAS^Wr<95#0Fx6~+2r~!*P7|y#JZH)ciXQeSrP%|#<|*duS|3JXRTfx-ME=oPe!^P zli+=N%fy#3S?cfhdxhF=0w7=k;GRgX_r&+QHjN>VO1U?Y72Sm+dC%~S^!;&PH+XBs z(dkpmt6JGSw-Sbp@Ome51`i{jY*m-lB)p#8tem-;Wp>7Jih8d-`R2M*ovm$7X+e8S z-$S{yzp#qNeR|?syJY!@hCr&)U}J_J{==nkehKlV#6B>%j?oOTTr2H``3GvA32#x6 z>zdZ_4~DMqtuI~~@#V&335?|RJ^1NfDdF2qU8XvRDI5|3y-v<~KBMxYt?A0_(h-GN zG<`RJKZ-Gh)h$@*3e&xR}wyuaI8=bL{H9702!gPp-xj2wDb zEe^kQ_(u&mVsJ!N8wRY5k+AKp=<^ut2oHFBmS5eQ9Okz-N({Y|yMu7_)JWr;MET6~YY~c&*a* zJA`Q%ZbS!#JxBS?ZtBNSmrb<2l~CPW5fE~iWWmnh!=Kib6*%1?SEUKHC%MfwsUL~q zlTW&ZtmTi)l-xOX0FVHTp&?LYb;fhnuv=g8W{+-?$9F3v1Il8}y?$@u&V2{}0A9K~ znDs3(*HCv6O!tbbxz1!eIVT>Z*OcE`YSLlu0|jxAIuG(Il5vz~?sZd2Ng4NcCTUIV z0I+AlB!3fff30@*8YHu6izJ0n6>+*>l(fyrRp*{CYNfuLscCu?mzz+>H!+tuB1Jt= z9=Hdd+}9BW^R3BQ*^2OUp8daCZAjTgHKFPn4u`Mm$tIa4vPT*nyO?7+_wH-hG@pi= zRi(;He|E9T(Vz(iP6!0H;(w)bdRD8fTxhmUrb9Hd2)wf3XXOWsk=KDQ%{R*hg=tVM_YGlK%i}j5gR=R7X4U&UyL2 zoo7*5=xYabdAEtQOWC}e3s;WR>CqtH5FyyO+zU2&CpqobvfIPjmEMsgH+Lx{X9c{* z`P*+i5^_sppL*@>b!{rb87`HD%p!0}1aq|GJoO z1HRIJyaQb4h;Q{Kw28F)HI6ulSOT2w0RI3GJd#JHaCf@ayXQ#KqLVRI!e<>vk)Yk(@5_#Mp=2rMpp;iWK;YR;vFt)6R2KBZDh4@qC?VO zOdiIn{8PSIji!_>;@KiabRwg3b=&cyqw1Kt(xP>Dj`1<0! z`jE3bA!$W6bh_t_G^>Q3^GIe}mY-|Jz>pD_8@CQQJ-XE11kmjvzy8zJ!Fioo;c#%V zvho|>fz5cHoisKKA-J}b%#8kFXWEX3pewYThwooN&8R_d4u_*&+#!O|eBxpumC{z; zRBX!uoP)cidYCqwyt*D(nJlkL|ZTJt{VBVQ!fcCj2`x?&k;BBd1|pFsk-Dr3Ja>vIM=ff9(*Ek~YC2uGCPt1o7MoX|`PXtBnpr7Rux}H!sL6Pg;s_A|ay3wp1 zZth}|@EL84Z?X^Bl0= znZma0k5C1B?|?i{;g1yPa^858O_tj3)?m;{usm)@Rc>-ebHy?r0o&`A>15KxAx19j z`Pd|0MmWJgg+pOwef^NOuul?242&IBLb9_Q9-WU`^eC&lbTO!`uhi=NQQ}Q!#hQaf zs3S{Y&^pH)DTEo1VjOk(20g$P7LDP(15fbf%%fj1c=xWsC`K8D(0Qxy%zINLpf+J5&2{zV=43`9`%MB4HvA@t$NLT zEav<>qh9!T#3xL*x}Rd(%J?i4IE^!dgMu3v!Ryk!S$tWi%Pel*9fBk_!+h`}rEM~wM{!*i9FkDYi8XnsvSh2w%x-ABN+ZwB)6U$w$cJHA8KX}kpYHf1n@xU zI6u<6RXTCe9$jg3%I#`+%>EwIEp;jG^y?XJ*5QYeCvvG4PEO)EY0OSRQ+uOW_ioi3(CNMmw|7C;!-bC7TjbH}B4 z?uDRupIEUoPxgH}(6KQgm&;~S*vQEw1@%3vxQjwfBEsI)brsY#8=I6!p@wqOD`W3v zPT~h|dft@Nc285n#Np*mS5nk`+E$IC`H8Ekj^^kFju~VK%%gzWILJP=!}z;Jw9)L> zOPSi=QMy!?7~?DRLUM9I&m?s9uS3-BWz%Ggc(&X7LhU2OEi!|#GnG;pXN>w+p3AIV z>fSH4*5lEUn%R7!?~tsqk`Fi;032X+6};N9*@K;1^IquU?4|Jqjjf)Yr90a~Zo^A7 zfO$lLkC>63gz=j9Jz{MeR&6&*@g(ruBSvC*<3$P;fFYC*TywzYqVW~Wc!y0f=0K;3?OptoJNrv3O>zmRiIm6XvlellFr)ZL zey^_XfKE01;1fYvHExO~X1%c_}DS*UMaifwUZg zaguZ2rFO!sWc5CNr72U>l=Gb``%uvQQ4W-1TU2tvyv7AUVU4HTn)NHF?xBP1TAjI( z^4?BQ4+$I)dym4r$oTugk?R8Y#PLIJ#@;C6iKAx^&n`}LmL0`=FsfQy zTB)^U4KtxRP^b$Mpy%cEtz$IZqGc$`>hZD2Yd;S(ttu!UIV99~Leox>1aw zj)a=#bk7b=;%k|7;OT0JM%JCk3wuLs=G{m*kb*(Pe%lmH4-YbO?K_d^ogm8F2PW9RNb4c*czi!vspp)%3tG#kY zVmy5L>27 zb#f)L@kFvhQ!j5ZP0gNw9Fd+q{*~vRG}m4zr~b~nJACknLE5DTNn$$ZCZbhzyE>_< zH_Ce6jhid)w=C@tnFAomR0NKji5*QxZL43$Z+3M=+bc=FD7Ji|2is=@<>YnNzM*?4@_dQo+id} z!b_Uxwp}#3)V7R>lPLlRZZHvnKQZgU>DQX_EkP!+@f4bN0K`B$zqfcK(k-qCWq_Au z$m_=^f;!eMp15b35mjg!yJsjBN@|I-YaZvV1w>U0F4WzqEnV;+a-9nk6k0g&4t6kPjY}(`w!_ zznPNq^5%QH8(IGVcO+^Fg?es}ap*7!0Q2cxvQ6|nr#V7e9yAW9nq=Q?m9)8I{oGMH zusK}y2b^@lt)C2PR~8f5&p1nnqi%__0G0EU5cAP(Wd~ceuzSHN@O`6D6GbgwfA?BdpQxRx<*lm0-Uv2V=#3 zA@D|hEmf#{w#Ef!O z5!F2~E34Y3&j;GRepji@cyq;5X_r&$nrt!~w3MaNd11F9BsNAyPI*I-P1Fq9^}P3* ztcKBU<^#*P8|FnB%!(79pLld9r7|5eTzFquvw}G1!d*02A~Oifvnd2}1~Z)F6}x2G ze~M#<*6!}!(@~sUBoZ>Sd1VuHTi7XGtl3kyC%!7Vl6PhMHzS^JhqqoO(XUg(x9}Kk zLgHypl_$x9z$1LzD9H9Tz-s>h3(k+A*y{SU21dC7nWJ**pd4=?5>z&G$ge_ptvora zn@hRGt#xJO%pz%H^5rrGsO+^%sqMe9P2A}cKh8l^W4k3CgDJ=v!vTzg z>0EVGX8E3{tA(p7P_$l$&OR--wbHHOy0o`>H0gIkEU4SI$OtNZ^XXm3#6O0*e}%ji zqUvkL>RtnjOz`_3Hq%sS)5%hdhAWRdUQQF^q9sbHc{W$8*qzV=idxqTkHJqpOvP{J!V?TH{a7Vu#dRNjm-w*U} z4Z{@CX{&hvQj+XZBSz$L@)9yKI5`Hid^_Qvw%w)Aj4aNbridh4Gi?B0G4KXlD=Pz> z9I^J~R8fVWy!1M;7}`xNFh(!!!78{7ORJgLy?AXO;A)91Ud3igVIRJd51L=y6 z62l+wEuKdle2fDS_#A*Uisr8--I40yF&A4OKiT-J#y%mr`(CA|c~U~@Exy>yd5~Ze zlh<}IYw9nC2G_)*;!S7lHm_nDX&|_^P0*y@|hcZhUHwA1c%g@F~n zdmBVlFp-3W62ygW30$uOrxnLu#jI<(-lwWq!13ENO(ooqA_6%Dj^I^U2t9^-Q66RR zmxz+92BfTdt>%;A`R$~%@T=AL9yX$Q;+N zXcksp46us(UAi{OHpU|E;yG;?lE9e0Rdj3-*Vn16>s4^vu;!C+nFP^ zmide*Icr;Wpcaz%E2C-Co!{6V8f;%l3mTgaI0SfgcDj!fi79BKf^ajkwTTw)it zP^C`8!EZ2(5t2p*dm8I_X;fOAs-kZ9)Zen!ZhU^4W{KiG){u)cX>T!xMls0{RZbLu zLma5<%AZkOM~WB3egd_)lU;u+a)^;*0p^p;UItWxBRvTx^RIQ$r|{*jk>M!p@7m)? zx4mz*C7~wnTfjb0WK)ngV3k~h_02=CLuv5~QSnvZh-{>`FhLB71F*Lbxs*p61C7Vb zVcl_#NEybl!YM5b7C+fZY3{wxgKo7;eL&b>D#-GztR#)gG(kxK6;sm((~9@aHrHC! z0)J;+U4O*272$S>&Lct4Dv-fc{{VFH>)O2Y#6J)3?R-$$Mw1HM2>@uLuyZ;hu+Gx$ z(1y<74;=nJgQ4C0QSj}R)2qu0+7S)R0FBI<7#}J5xFG!vdA0CWRJ4uHp{0zaIB3?U z^p_TvD;A|Kg~U3nS1Q*!rgo_gz!sJkzyk*bRYpg(dgq1Y(6oCS&1rQ2)@lW)wY#(o zL}fq|BPq_tAmb~QQ;cT@xBeXH8pp+k(_q#f7t_Q2rs7Tu#~fhD5UxQ7<=PbUlkZ)B z#fuLNXuck>@aNgxKFOur=H(y+&cgwB7|Mmlc>r(@PH|p^8V=f?ZCq>>MNJ+@sZTGB zRy$2GqDgO8$d1svMvPE??nU3-mDu3p7zfg*%rs;(+36OGc-9k0FRc}ntZ_y`R^N@v zIpYN5n&G|?*}lKx_;rm#PzumUsuo}gbdPLt=OBTPlnjCgQ^js;9um6nZ;Wp4?V5X$ zcI4bFss_m=3|NOyH!gZ`I*vQneLO6s8?#ANjAdiI)I2@m>sgPBbSooaeW=FEXKQIA z%kOn)~b>bWE6ZnT-@-#g#!E0)(J@m;jn(f(< zjBIh241rjc+t6}(&2v@5*_*Yqhqd;fXW1m#ED|tA!1)?Iz=B64 zt`2ZU1$0qTa!T46S5cH(I-Ltz@N#(O_R~_cadGB3iQE##b_9PBAP{koFi7B6&=PB& z8q*-Tfz@p8ZY`J0wYbYFVl>^faQVsL1D&TmjdMQ=Z*(j6pINrGj^kU>Z{9U|V_%+Z z4a@+};z7V8sQjy*@o&WM?T;1xuIAp_=JjJ}MTt9JDBtD%<1SQm1Dr4e)2F5Ec@^2_ zPNzHNiYjSSX*QlK((kmZw$fG?5MRB-dp=;LM9|z2pE;#;zdJ^ z+YaDRkbY(N>TAY)RTqT3T-RygFCtb;m~Uaf0k-+kotp#U2<{gd1aPK`J|bhR^5 zlhQ{u;hTT>O0>z~lS{pePmId(DA@M9i{uiUgMjMT0nZsAXPUtHlj6NQ;cl$Dyi&+y zztfV#>`_Z3t!)c{=%HRx03(bM^5pIBSAVu{?zFe?gWAbqa%UcGx;m_%yL_yG08Zvo zFhd1A8uO2d8aIT^z1^3HF2&o$7=|h5F9VUZ0!|p@L;z(uKG_DYwcKAWkD=E_oK%-K zrwf0m$?=lv^6v5*J6WwQn%dS`H#i8+Elu(?h2h5V6fjvAk%5j$JettaG#edG@pK&8Ce~y3R0m!% zLFc!6>^>uSYhKcPL!;ez&PcUe%Q+)Al4)0wTMK0fuNyICc2yCDA;J_2Fb+ls%tsMf z&z4U5o~=q02<38s^()l+}kS3 z&Y+~546cuWV~{S!QgU(t8NMvjwCmk!&qVMyCbDj(&+jZ;m3;EzNoB^-gI>L< zY91TcH5^*`-* zAUi@sL?ezs8Z!G^a-0xZaxi=G&!YHy#Fm;0+3UAflg|wIens`%W#@`gauy(R74n(t zOL5TFII7iXtI}64jVM-J_dDdh*Y35ueG|djHNK6kHL&xN@d`RK$Up(4R8$0Do=6_P zp2gvawHP$pw$usIq`i-I%*yH!Q55fIP+ncbYPS*Lslgh-Fe3fJYqyd z-e}n+3hs8`vNI{c<%Ti9uJ6U(DDgh2;U+qclMa!6G4f@W23AQ}6^T|ooBryO8A->> zgMvkUHd?4gH@@cvCX}zDIj;iSd^FZHJy%q-xNBR8#4xMhB$AjKR3Tm_SH~qw6)Jha z=rdhUgf!h>z}_^}HQRu7`%AlM*4ZFp(fyqc!sn?4GD9PD$r&cFdknULEi>7hVI7^G?)6vs*(uCETb~+?OmQGJL8@ z0|a{Ee+@BIVHeLG%;-(*dAEsgH2V#D-$k*7qn`FgiZ!*6Br(S-hal|3v#Sm{$vk7F zX832pI##o)zN>6S*PUrBa?E8Bw6nn9^3FMdV%ttsdt~6&$Hb2nXgY3Ti` zCg~DwvH^HNDn4zEupY=b2N>&L5nO)II=-GI4`E?*eI48RgJi33D=QL{C=RZzA0TA% z8=Th-KWQ1?qc0IkH6dv3dPV2My?08yvGG@fBZeDsB(cp3NYUJHjIlmwQtBjQl=*&K zsNfQ6=fWLpUVF__PZ2f_p)8Rb7m57VE|?oxKr6@u?#MaMTJXOcd~fkzjBOIu(c4ec z<5t^Y312QJV7_A`1zB+HGxM_%(>2QYC*s$Ld@p<@)F%6E7ZS9WLRDELZQHkD$=n%< z`Lk1*(v@m15J|u5)WU@dk@uv1Q{kV5`cH(sYjdc0uKVpNe`>}lt|R{dm*|KjLojfK zWBE{q47fPJI3wG9SK$jiCrhrz6wT!oC{u9*Yvqr^lz>+M~^DCAuoN z?tsF&bjJsPGI3s+@T0;yBsxn=<0oxSIqoBkg2b?-dyg^l%`5H=&pZ|MCb&%&<~?>R zdF{{vc2N0|F!|9HT~AI4Jhl%Y@+w_-z&<{UK%2x~7u1&D&n<0glF8+y(iJ3cQpG{z z9P!8}92)%lF2~lRU)W+Ei}|{G`5uL6b3*aZ^gCY#_)_yxmeary+F9J)OR_tdqd?IC z&ew|{I4Zz~40E5YY6bAGfnMU%#~Whv+`%xK+GuU3M?wzi0UbfY^XuOYcq_!#mr3Et zzq0gwJ?;GaNM-U;ZKO(BcOF7F%FT>&4r>>|UL){Y&es~YuN}S26BuH+ATvV1oMDvp zIl@An4vK zztMDK_RBYyY;q&*5`qKr4gg>eKA(kl;_6mWPJ&O=?7&mQO}}p@myzunmw`3k6!^PY z)eX&-rDv{|Wtou240~G$>y%%dkVY3d#!2<^4~$<7biE2Y7<@KNmp0(F-K;k992WV5 zsa?RUbH;K#F<$4UcoX9P0NJfH?N;s!OCfZk-6P!WHe}_@WB9;eFi%|9q&2bdp1hLT zU)tU!-L#TQZgC`gHi7aubu1N-g2b-efO_J%@Ys5s*PLx~t79Uxgszd{Uk|UfZ6G7w zAX}Itfl%H+(9C0H1=MXgBpfK+&V7j$LreIHt?Qb#_JA%9p{ZM6hqr6FR?rw9+L{I2&UUTuSiZAV(*hVY%D42N>h6e7~)Dmj3%x z9w5?QbWmRfa?xC%qmO@ZP(ieWORa`(=&MSGr}r3SpRh%OZrq1b|8a2RR%L zEAyAdbLt)`vC{3Mn&VKoLeiucG0XO;Rrz47cLoc|8*!YTGhXH39~@qMHn4|Ri%4xg z&f;YgtjoG5;He5&7T^LvJPe<$6rz+G+=qwO>qcx`e$F#^qe9fYO{dEnF}RR#Ga00a zd6;Y}=aG^~J$-#Xcd_^v;@M}vI&}8e4W>xOTSjt|v}^a6BMqk=#_alLzRl1)cO)Jo z)!^__t&jGFx?HuSt>s9Jn;BLes#N)^`A#_if^mabw=(#L#`4@+Xx39(c&gPU`&)@! z66Vio2Owi;P=4|Pdt)bwe6lr+rvJRI=pO;Rdrom~9_pT<53)^$5ny12Z8{s`QejwAi#h!hzeKyA?l8w+$?gPyhM zcAA~!ml4|8UnSeS=1d?h?>;yV!Wv+P-7OsfnGsf@8F1&2YjpGxI)KZ-sA)pYG< z-aBc`FC)!(5m`_M6s*asa?0FmZi4*28Yj~D64(#VoMglysoAw`ZXe7j7H z(*FMdQ@NGqh9_S>JAR9`Sy3CQQ-TQfHH5J-a(2_y zaKlM2eH_1vHR(J>Y*R-L8 z#M&jEi>Y4P-w3XoWcK{7{BBhTb29F4mxk^*^!nSyR=yk7H2AJODf`<7Za&#Sso@KSx6)qa0W>XJN4=3 zRILY6{f_9aNZA~>!reQ^T5bNLG%9TEinO;@r5$4-0OuqUNjMnB4tkE=WZpB-bg%8p zTU|HoH}=jhqw?fwV-vX%JEABmFb+m`D{Uj3pueE7o1ra1|f6L?+jMh-UxJ;*$h zylc~wQMjYb?(9@w6x!OPacb9hZFzSiWo3*8Qp>awr=UC@c+WVmIq^QN<0$5NzSS+n zFaRKO;zo!8fzyw>k<+Fro;ugx#$GB-Sd_PcEn^3e9#@S3GBS)1T=dA`el^a+;th7f z-So?5frH7!j)Wc#2yFbjPI)~@9V@yvNIg$B)a|uxN>JW=&&k{}PD$kZo_pe-ZRChP z&3d94VGP4?`@^XO=O>ZZ*1DNA-CM|yQ2Qe^aLv9(fx+I)P7Ve(sXTQf9RTlDt}XSO zVFanRct*uSHUvF6W631)bKbC*D>aK|ZIz@FK-ZDoEK!gMd^2r4WpF^r&m3fX({Jv+ zz_zmqRiqOc0emoYUL3P>RynY1a@JZP{Q?%eT|lIs7S?Hg*dVvpH5_k~Z}A;MZT`c)S-o zt;U|$AQE!q?gg+o8<*SGq5lAcWo{ZZ)2CaKV=~Gy@}e&XcXh|)MOtdZ=C_!9SJmVGKX?jkY`lt47#ll*%kTuRl^r_(R*16{DSJIn1luW!)jm~ONQO^9FhSTH1toAlpIVDdfu@~B?4&}Y zf=>hBpY9XKUfrul2_q<1gq71ghftDvNc&>H znu8hJ+dcc$6Xh@sxPp3uKU(y=j|OVmP3+KIM?J)0a*r4+Gn{8Nj5Gs;(w9o(*EvzcXWyO|_Xthna~I2orH+|E@jbN3=AxF*&% zj2=KV_-^gcY`cql4xPU`-_q`5y`ET}*-XbFq$edv>&0hk_V#v>Ebi*;&CyR`?b?T? zj1;b3()Ig0Y)ZDo%%5}vfr0H;X4USsIgI*rV$s+T&c|?UkUNe)0bE23*OM%Ep_G<8 zam#bswr5>ePj`lN+R%Z@o|)%7ezj4XLX=Zx@Q+i`VUlSi5*HZQy?O32(-oDc>yl}A zk1&o&mOwWn9N_(Z{*_Wqen?|qF!|DBtB=yFXu80CLDuvtMfAf94{Z`TXwiAxNgGBw z5Ati=_4|K^TJC}UuM5XEt8J5OG`(VSddZKM2o6ZW#cLTm@|=}sli1eLd}x|xoVr!y z9%#cNu>b|#(Ch=Jwnb^!X%qhdXxbez{Mtl8Geid0ke-LoFZd2?kg+(@zjj{g>f>%F zg-mv%{iVtSCj+K?oK=lS!tvWm*Rtz333C#HA_z~I$Djld03YO5kcwS(I584^4{wuM z@W+Q)tTns&V);RdBi$)?C;0F<&o$@1Bk@+Nr0WPY`8?e!Wz2IDt<;f?gXYJsMR+fW ze0!+a%JvpN>mXs9iAu8)cmU_WIj#Qy3izr`CO^09wzgLdEU02XdRO`Z&$-1{vTNRF z6lq=PeJkPpx}K3Hv8$`Vssco&BAeI(K^%}*Ir>&+rQ&NF>(sJ>IniTP5|W!yfa8Pj zRW1BgFNkfJ+gzkT1w|5%+$x?(UO~vuHOgw*mEM;azhs6;Bi*uG5fCenn4U*HhbFn5 z+cfq`Bc^nk;^Iv<(#m8Kk(r6*Q`BVf?oD^z8Sr1*H1nuw^G!9}6NWD?aVy3;4WtZq z9eM9xBk5lge1GF(HkqMWwD&i17`(WVkvz5Fw2pE5U<&p7L#=4AX_mKFZx7kw*zx(w zz)6#kp;)dl-xb)e1*ySak2Bo+JN^;-dzcd1;^xj7*8mN`eCLvSj&oebqi3RcV^i~d zL#s)4*KA|AvxshuNXB^sAo0^R^2huny0Dh={#Ej=Y<6MMjO`??_f>ZAG1QWJ{+y1P zAy5)Gzf7L`b&tTp^H2F5(r$Y<4d==YfIVnv>Y&csW~``^Q=Ee}?rt2(IpJ zN;UyS1Lo(qe_nB4Klq>F&4!yZTj)AporNy)d5j`e(|1N^Hp{{X`}oujqPX(*pja=@OyH#`qR*XdmU z0EfOQ_|E%n?x|yU9kib?X%EWaag-Pvmm?YJUX>5Vy(3F|NUrS`ZzpRIF`c=_)5jPc zDqlM2X?G`M=Z_Ox-*|Q8)IQc4>njv-NaUT_!C(N-1174!jsF0%t;V2y$Y+g)>0ysP zU^wayaHrp`eIEWN_g zz+Jh{eQGNYh*xIM?K-Zn3}KWa#|rPbIO7aS0Atp&t5P?!JL7OFrN%8%k|UHEut`iyee#_oRCEN=c>ks_##O6QWS z3wxT@@NLGG;{N~j`oQp3$$?ZGXdqZb>vnrif;TddEogxJE2K7p!!rka^21dWhKT`0s+Hk zfnJ;9`)`K&?VDR^aa>+%F_8hD!MxbxWX6AXM(wT7LH_{O<221K&%-)EZ4O1%wVx2( zgB`M<4`pir`_hLP-oRvM(^s%zHmrz?-G>M>Cgm#l+Q#tC+%oSIj z4;8cF{{V>kzNO)a@7f9Eio)T1v{|;sB*t(M@s9jeLQ#slL0T0glBUmmvCzCZ@cJz_ zeM3dgsi-S8&Ci$_VpczQE>7ME91N3K`oD{O5#fIjE}?Cs+Rvv!8F!J6CVAxGjuY=l4{ZdJJ!E!MKC0pAcM{yCyWZN zM=fr1Mz15~nd6rhuXW%v9*b^~nTUIo$=@2TNC2Loj1yi%r^~46a1k;6A5r>7>qUez_L{{RtQuaL}+4#66XgdH=SR-777i0-0_D_f&?aRRUk z819H?B%fZrO+=vCb4jFoKZv!3*1T*XkU?c{7ni-bFXfO60!DI2r#P-|_+9E(@1*Hy zW?0#ZBK8OJ0;BL3fpuB+883Bc-PR?}_Rhk`r{&47bkqDl;r{>*_=Sbr$0Iy@nN_(v ze}o^Y`M#CvVX1qHGCW*XB~q*Io?oMUKGv^pqOwSt+DB9&PIB%1IqmPB)v4ou2I@Wx zhjqoGOK}lrMGUNpSFT2Lj%(Q=_?4vCT?<=Aj?No*4!M&id%m0>P2fTjXu{LFnw zA5&Ym9v{CN)~9c$N>efzVU@r}ZQm;r4?Q>)-ZN+#ZmafyS}SN{SmKTb`TXpB#2kA5 zRXw(mKZtLo)pYfdY;2?5Bd9F?XvxW9dY<*YEIQeo^|9?fc=bGM#J&^N)Intg%Ol4S zeZ-Yf&N6$BhaR=Jq5LwteKubdUSC>Xi(<&)Y48^W4a`nJ88`r*YtrTLgZBya^c{t>?o>D~%!3+prqeJfl|DzEPtx%mQ-&d@Q(OwlYnZ*vdr zIop=!gzK6U>l&)t+G%YZfEA77aAF{T7t8YC{cGARyboZWAGM2AjtJ)Ri!y_`w}3z# zU<~!a{%!M$vSGaXh%pggQi{B^!Xb$6mEk$HYD#meSJO!@6jD zmtv%0N!y$fNa@zIHAmJpjXL7a{@LM@XqX7N3a^od&$qQF!ygUXX?K5U)-EL6;G`)U z?o%N=0)2?7jR`uJGI)r_51s0C9xu{w?MugR5rR3Fmd_nI0Oz^lxFMkH7m&*fS;ZB) zpDYY*`G+|l;%nV*to6N8Z?Ow<@GA|EjO4lCamP5Uj}R^Y0EXh0+T!NgNuE5k2u@W` zCwISW*G?k|8S2WyV_NqkxyyJH;k1zg_Yx~fD-DG4&N&0uircyHmY;L1jTc$CPq9MV z*rb~{*|-cIIjxNg#5!ttYS&zvSGH*-k>ZbGcOU{jUU&fWn)$a^@dl-;YTkHfm1kqg z<7m$Seig-5lwgvIJMi^tRFt`y@7Eevgs<&ZD|>fUwIK^fApolMImyXA>p2@jYl&?p zvy@KEBS+tm4l}^0d_R2yL*_@LUdXOKZHjguY>{0mt%jGKK`mSDJMtrtZt~cU27S0a zD_B7hTCKE9=i~6Mfpc(e=aNQ{_XmP;*n3jlcr#70kVImdW+g&rpeM1YCf6plwtYrh zIaWaI!N}^^$>-bBo$%wuYvS9P7f_U~#gw^plOQx_raw@7*1pc0dZReiscWW3t@t`A zEaQcdo;gv72P7jNxUOLQDA5I>l0hkT!ycHy`q#H=zAV#Wo;0&~UNp&N1x`QNu14?1 z7F)#k(0LIv0hJk0r><%$MxE~@5U*LQL6PWMb9iRbJ4gW_02KB4Pa>08@uS0SBi>KE zugm2y`9NPo>T3sB_?MRM`Q zUm{z>lq8>&W7pQbuRyiat~5wB34$%kKbM8$dI7=dT=7n4Y^0*D&nCCGyqeVM^F^`9 zE^*a{NEN@N_yF+R5mhs>}yKu()9ScIAUUuOgF1118xWCJuA^{ zzu_YBSB972{+nSap621M14(7-Ni@;HaCHr(`Qa5a;M}I`4??b%^cbx{Wqk zwquZwn5zyHpFv$dhw%$jw9>A0xo$$+N)cH}&k3GFlZ@A8@k8O)hx|Wo6T#YxYR?Wu z+(kB+2*6yBaB_3$ULB^u^A958+&&wU-!2ILb`1j;+Ypm0buWhM~Qto1x5;k%G8$){l27d~xsM={7)zm*^L1MAQk+UM4 zGXu*IPhVVOy$epZ@V1v=E%h76p7~&$?v)Eh4&U8{Am=$G=bGMx*^PcydOn}y6x2K@ zo*B~?5k0)dLfde~fWgV{_*Wa^#_+@Ve%d>T1;(v&%!VfU<0y9WI|GdJGhSbzc&1%1 zQB?Ajz$7eotn|;=Vn1Y_`xTirFwk4@Vhuvc_pF8 z_dB8g-YEKE6(y#@gz>sV97PMfrir%6jxeKiHHj|)S6DlN^Jg-!Uf`B?yF9S>8C zXR)t4zSiv`*00mU65OP6%CXuF?NjGizGC?iZ zk^GHN@gIp`@Z{FoMw_-&wvqR_!+foQh9j0ygNpI}Z^t_#g5vS^$r))NepP|ngN$_s zr0}BXx}*tvEQ;xI@-mWh8R?eBNF3C|7MifCVcJ(`(I>_;*!XGmMsQ-(U1oeJ9#{ly zDETCgxvmX-MSC5k-Mo>d*@{!;wtsk0bKC=!KHT8eXNCUVG&0-V&F0#`+dQ=)v5(>z zIG0yi7mEG?SKFn;1ingPZM~ST`KP9?6G~Gb1{uT7)c;y z;m@x;j@Jsd%+x)V0ksK(*A?eKzUV+-ye{>z?WD|}sNFzO~YB-rKPJBiRKMl^;U9hpaf=}&948BtzE`Koj ziVhABVh2uZmeS_aG)uE3t?Hk&5`ay#rq;&dGJaF*OwewjhT>~UVl&3F0#TR|f=5lq zkxjeswY0j4)S*O@$rX}iO{L_ibf{k+*k^SD_2#$o4wcjZ5L;EWzIT>HUovPOb9{HJoI)pA#y zWaHbK*^u5(r(3~ge8DVGuu{HakC@?dpyMOAt#bWh&r_zZ4l-IF|JC@%$1wPAVCUC`!=WY8_9j?BuB61=}OZa8p2ETj|A@J4Ib zyi4F6ZdqnXbvspxdlNJ=I{d~d2u-V%!E#4#+}F!qD)6?Y;XOt>83CR-BS}*OJA-q< z9^i_q^yL+@1IUIlwp*8m}!h4Mm#QH*9$}S_C z!p>WFkLD1piV50t!j&AU$E|!DaWul|t}dc5%kr4i=PC#QVD-xJiuwyc@s@*e;S23M zN)l<>%UijehGvf7pg79$)v=OujGokCs{1?YMstUh;}sb7-E{RmSH<5Ntt~`0)^Q`7 zb}I3e1~v_qY>aY9=RZT#RF|I+^=(T;w79aeXl>F@GS1%Jw;kIsSn-xs8Tn2yJuBs% z6T==P*5a1+_M^hU;f~@#_8ArE@@Trgj%|M3au#T2=YCIj4ez z6{ESMsrakKzB$l!TMNyR+S$V_k(+3Uc^x^}=W!mq57Y|K_)FqjskA*}U+p^!M~W6{ zW4b~mnM6eZU5Z-@KqnuKQPuSr{3GFwQ$=~a+nbqH?c;(*k`i2e=W?NpykmogzhNc@d+R-11_zYj(-rq;)~cq>xT?e9|Rdl_z( znpqtjGDB}GjASr&c2L_$$Qkcmxip%-t!Xd(BzlY9L9@$+WZYwKkQG?+NGuny>FHlH z#o_IHPhqX;hVt4MU){wh-10P^yPa2!t<>P-xb8DmEj0~7EmAv8SYFR*Z6k)YSv-l< zo&XJo!vl`Tr7AULPgb-vo*7T!XV^CWCe^%0;hj6fc5+2y9+2YPD&b~A+-_%Ko_gar zuGdoVwxcepx?0b&;&n&H>?vgmj51i@Hzyg#rF;#kSYBzj^Urg3_R-3Q=G;u|^5Jq3 z908rjZZbd_$3b4HpnPDthFeH3Y}^!7i+kKY!Mme=^Kn)AvT^CfdbD#mrD-c3Mk^_v zlBDjBrR7Z~!%%|nQh1&?;BP7vP>RwLR02sk!RM3BN3Qs%!t15lM`lK20LU@58*#|t zbMs)}kIueP@h6LJ^^{nw6&nUbBkdrBVVB4tC>)%Q$FVfO3-p_x7#R@FBtv*`~KYd#(EMWX4}Q4xP6TVZ(NMQo-DgUaL{ z>^ZNR{AFsEL(Vp)Y>-_x;KoQGBcKsyv_3%VQHxCvGbmRd1(dolH5ZiQ8wZc zi6Ki4NgkhC+;_ItE(BUs1?Aygku$;W0qgHwMw8*&X>}>yX^FM~q+ygJ5_$Q7&T*bS zt5(+1+TT!)D>$Ajh?uD``i@6IpMGo2o+2sO^;JG?PE*7l2JyYIwY#^|F2<0+F_5B` z<2hzU`GES0^OFQRo}kuEy3wOhPV#bh<0S#beJiLzty>s%U1A%t0o&xrU6jZq!3?Ax zz;Wwb=C9zj)XGYbZ!AkgD*Vl~XCsW9j^OiM)TwFA&po)O?-A+EX>T9)O}hq)2*YJu z5`P{!uV?UQgzWrQkEbd7JgXm=jOSq|A9NP^TRnI^tLEzu3hQ%ABw9_tmT1l%Cr8{c zGxFqo!``oWi^f{015CKIYe^Cz5=m@cCq@GVkWV|mi`O->ot}cLDLAzjdiJqm-WO)H z)Cxq5$8P*(f%$R=a0th>H^YsgUEAE--(3xi$|KxRTdELud5l}J^z3WTt)sftf3w?M zl}(fijk;ICLHt-5&pm6~G&>K68upzgmfl^Yn;D{zpDBU<6VFvW=&gxSTAp;RYcnTL z&^$gZTT#+@IJGu!Fwck4x$KVSCl%CL1V#T^d}YMHy$h(m(eZ7(Q?ebf0r4KML8M4 z`=o)$#dcmI)btqzj+dp}%G2Aim2QB``9mjeQ9&$QJ-Dr7KA}?t;H-UU1*W5?W5tsj zD@d((#J~?Ju^ImWR?CCS43+0TxUZb_?IT+8X0L3TO~f`P+Tl%@k~NGtUX3Ft8B>nr z=D9`j2a4NHwzW&E%X@I-!nZ-A9eNGm9(sZKS5@GRbH^~>-Re@>!!FlYhS?MbLD^6c z0LM7%o@!+#lUE{*Ck1qL`e%l`LjM42yw$GX?Nga#VDN(scy0s)uyw{VyL$Q_wJ(TT zSPz-1N@didVDLWzS)+WA8AqY%$4{kjdXBU48^#*#!q`l0{{XY%W+==cz{XC}I0X8S zp{+fCOVO^Z>~8gox6`#E(TkLlUoqKAkC;da0PY6>E_vp-s#kV)J859O^yc*JdP?|% zSGVx6mU}l4+YYq4YdcLYc#%nvG_noZ zZP^Y30#7{W*0~7nF0|+`?mSPaUdN+p?u{NHbw`=W0!84Eia7(1Ue%!_{weWYyf;1} z^X)8_X8RwJu&SH93uK=?^Ouv|mf*Ch$lsJ?VrAKXPaXU(Epv+O3_U_y^ zoN`z0gT++5`(~}7Ut8XnhUapak%&9rc+VT7l%%!`yPpF<8K>y z7*BS(J+ZKoA#f5WK1m>dtx)9r&7YZb+ogFHqwy85wdnQl4o5TUla?-I*r<%e767i` zP=VhVtv?OLs?Vj3E5&zOh2F0zlpy;=OJc|Y0nd~b(_q2C4W4~#KKH{1O7PYGiwsg+ z+($NKyRvmwNTpxl&K=co2^~*0Jjt!kLKNx3R+7|f_`2i9HV%Ass7G)1Yl$u4f)dya z-AMy+IAC`Q*s<00zYIrW+B!q3T?TpXS`fij-4ue&CmRSPe5a@xHOXkd3-s+G!Y>hc zhs74I^}?LZ=0OpU+Jv8bX`nBD}sHLrfZIU?v3WZ)m%tmpz41#)A{;%PG z26zKdJ{#8KiS*ec#Bf4VBC?)Gn81c&SDyF>>0h6*_|_c@SDNMnERSb$#V~-BbvWys z0th(z3g|Vzi5K1_mfq^(!aI9qkIIRz8b&NzKRLnNSe)~p$N^bU#Pwv?%PL8vwmzuw zAH=@~_)|rbNAQ-rditfuD3Z!ewV-eaRr43;CkFwTj=t6N#m|N{pBQQL>s~3mo?TXU z15brrL6I1c86##z<%R(MEb&}!k)!Iu&P{dnS*6mhwx!n6;wdDDqocC2heF37k_b59 z;E$pF1K~T38ufMUDBAx3WM9aNi+0Zx5y*o$j#$Gya&SOy6d$|~6{IKar0%pj77`d* zcZ2u4{)dEkO2@>$8u2Zi{nQc#vy~xOWruJZ$lQl%Amn@Zuc>@V4}-il;v4I&OG?)5 zh3fwR$F3SXaq{CR% zB9rDecOQIXl<`-Oyj^$V$@I?>T{f>3n!8M3M2gwTO}N@HcBW2x<%g)vDwH8lMDA%$ zy-Kwdt!+D!_$Ns48oREiVRv#1nYJyth0LbfKH~6dKXNxQ$gGjTLEiK+fnJ%oFOJ`uij1xiXm@yueII=OlBt3&13hE0Uc{Nv4jhP7|IfwrqH( z<4^W|%#i6NZZ2+u!6Zdf$we!-DnbMDv%Scf_TKAa3YM zBOG9JT&|hm&k}1AzOkm-NqDyM2rglbH%^D1iH*mM^ck;Z_&uvnF1vT&E6qJ+wz!@* zmK)S`kx^BPDy}dK3>=(t1zjZPP$h?@Mvu9x>U{~|Z-&;kzYcWGdqAGveMN1Y+~jVL zbdnq+kb2}4$Ul1(=H4{$ZSDLQYo;mMk)z$kG?Kc=s~`YIuf|62m*wr$*U<569t4KL zG+k92MbOLG z<7q9oYbfo{2O!tbQ&y+%A2At8)qJaSkFxMqjVoQ*#d&?E+1V|<&8e^<8RaC6*dY0v zSR9Tx71DT$FBR(grk|)-LnK=G;!$e>3?MQ5 z!x<#^^i=zu6N7p(KZW;N#Q=Ekz!1{{fd^X-9(HhZQ;Fw z%r=o7mAsNhq9&BczF=qNfK?}GJ5G26*N*5u9@DREwA15~A4;{cn*A;>V#s@qrBW#F z$lW56SC5zu_|F};g|#mZU1`l8p??{Q?j^FbgUp3~#S)+1va+t@huEsFxj7u3%Fs&e zDN}Nl`yVf8CQChH(CC)Mq`%5sE9H4C-!hYu2LOYPJNx}j2Z!|?N5hu_;_^u~h?OH- zhy*2BND>8o=XUdgbC&zq9ff%gm!aA}j|KcQESF|rBaV2a5Ue3G82MqC5;lQ>#(IkM z?+)m2Y0x&IrmI=4tTDCP6*E}NJID&irN=5c#_qiU?^;lmqidbGi?*z0-25=m^oyH4 zZub4tTS#46B#g^*JYn1;MwtPMq2%t*%05$ro?FFG>Dmphv8s4VNUo*SrL~DIxfd%M zd6BxA0_X3HWF6fB?_R@w;TQ2N8h)>&>ymw|W2~?c`E}^=$XQhtcJL138$CGTZ+t5! zg?tk&^IORF?4M+}A_bLUE(>8Z8QKWlmKfXXoKYyJc85vHYT5J8gETAG*R<_-#1^=* zxiQBKfxmcw50PJz*g4MNbIpA#b8&NhtK3}pa?Lkc*eYG5@vOmOl$FeKDay*p&mS-Z zXRjYI$KsnS$@EP*Z*Fu(jV>NpkINLrimL2!yL5jc0|}5%;ai?6*R>nXOHa@|9^lB< zRwnLiQUIDogvTV!4g`h65>$bZ0X$W)WOVG+{249Y_IU$YT%#mg+Otn#0w875qWb^hfb_ zm4Bv51Q(_|ce;>9^BBf(f8~1mK zsXUR}$|O|;$0Ho!9ap0Phvz+Ot4{}Mwpyo$+fuO>I&P|_;?>08XaXh}a3zhrzzI1c zAdW#DYsmaM-w=Ky%XOhmb!npA=*qE9%MwD3!SYem5bx#SAUGrpWSnu+cq>QviQvo0 zVDW~XH=A%(E$*Gw?Nz+MG9-*R)bs%bwEj;p0# z=$dm}MW|cNxosqb%P-l=kVlz@emLNg3h~zj>1aoDIVC9QeOKcP4Ib_(wM{Y!7wj-w z#}HEx%We z&k^|c(^E^8)b8ig^!H1dVTDMIPC}I0Rd=f7DLBVo$2EcD9ZSPLG4Vf|C!0yUE{d>u zIgWO5oUz^Vk<++2;NunYnZ9Q=Q`o3A9_OiopyM89?s$!kyW$vi`&-E*5ZuBR6>|vN z<)_Q@1PhWqPbUMK_PtxgIzPp&VKh$@%?P=-f-xNS`=ezr58ekDWKeQc5;N1ad3TBY zFX9glYS#MY(_GpOSV?e-6-W`r#W$Ww!Pwg%HMPzByQf0Hh~!j)WpNyQ zmOfl*yKdDuAXd0+#+_+8Ra)j+*>>;u+{UFEuzu>$$M{j;+l_xnlTg(}4*51(e0La) z+CWz&6n)}8U`ZGlNYk1fDDEKM?q{ z!#e%8gMH!6TSvFNiFV0#W#-zKAUc&>azAufHc4!6KQ|f0d~@Q+Z|pVe%`aA*O@HQ{ z%%^sF$RwXp+P0NQ$v#wRhf{OB{^PvVd?45N7WUH1aeFHkx|aEZ`2rW)(UTyO#Dm*7 z`VQY(@b$Kvr^~5NaxJXh|AiwAD;=49?Jk=)2vsx$!7&Ks!{| zimFa^rAA#9*PnB~wV`IZnLZJ|eJfM4yVrG=TT7HTFBC;qHdi}v;Ed#fj0VWyjMvi| zpMri5_)1pBp(&GGvrD^cmWggu1Q}Lg^C?FoZX1pX&U$>QdEg%%YI05D%bQcD*vwToPMx z8%9+|G3%O&*THM2Trd13P>9UZui8A;5ya55^E710fbapx2RR&OxqASzc&bReC1jT| z*|}SFz708%17N0egk;9<2T_dHrlavn^7F^=>HZ^z$*q>%qPJ_ScDT29BZX*}_kjZs zn1XSP;EL&^O}BJuQljOt>5t)`4C#?--aGJLi0<`GQfQ@-q7#Ws(!+*CARf{wBRvTi zJc{eQ7vmosXx=H(wEqAX_k_&elc*VI`f_Z1= zBo}PwmHVf#JXfcQpDZsU&!bLLm7sV302#a);d?(H+3Pn~m$ujQqJ4#&1=HAb3KZR?Sqm6j5`WUVd7iBqPJlVkXC@QcItIwV?dw?3<>YjXXCBC~NI zWs#JFC?R$vhmfuTBOGIOc>byIruH~B&lX3bxYKm$B9H9lj8F6YqE%k3jKe3k8;&dN z8?OTRBjNSVo8w&`87!vzXWACZNK*BlS=)D&F7m=ZEl$*Be2;wB()y=?yfNbs0_t}5 z(U@*8ZPl(7Sjr=CRFESNxRHUmbASh}ck;oj9zWM-PFH%P^P}N+#9b%C@!J?|puV>| z%i1avHcI@!oxgN|aC(A!fHCiPUMKizZMd(h`hmS*8zl)mJb_jb!9jwBWchmw9|?GNR^m87=qZ5&r&iyNVpej_C8Ey@#v_dx`VpGWv~Ei@k! zjb_hMj?~K+mL$H8SS?FNP&1=}kfFvo83DTHyeb?$f^~ho>FfP;JF8+ER!sBAwApn{ zL9TpdJ>8bGrO6Z6vNFt~LfG2HNo7(7Sy=8~fOF5$FY$*=&=Sf&5Nh#j7CNdT!9A2u zaAUfFs(j$IY?wj=3=@%(y(^$U4m>~Nxx7bdJ=ML}i2Opcq>?1dBwN`_MJR<-Y*xyW z;YnljWSrJVg#Q3%>;C`;ErzqFUD?}fRsfr;EdJtb50Q}ae83oGwu7Aa;QLhN3TxRd z66kTtq$aP__0NWWFN0dT@wS0^s9PB{`JUnlBUO#us31Bca@ZgP&mDSJo}J^JDhsGSP)OC)>&YJF= z()dC@vE8h3#d#r;!d_NfV=Wo`$B;IGzyr2x#jkuze^{ZEr00 zS0m=mdwL4`=TXx%e-uG3mwl(trqAZQkRVK`bBsoX!r=)g05Rl@XNvOePr%wHnq{9; z)F797lqjUEp)y7Zdt$Qmz-r||Zx_K>3L6>r_6fXKLRm^+k=dW=_~=sqFRZ@ffcv9X0_ z)FKcQEYZOdKJDIMX&DoYe4&_gj(Z%c!$Ol?QS`rtyi=k4TZ(Nr#U3Ac^&4oNlIjbH z{Mg_@^AaT=J0^0$agopp&QUFOSxZzz{dV|k6$E3j})K2{ky#anRXp0|!bl(%qEufNIK?13^Ss0VJMKeS? zla(Ogle8Ss;*WrSAiKCvwOiiYydcK2!y8`D$(9)ks{EXSvTgyJ9kzp>2JD*jcKG?N%WG$*X*1mDmo~8c#yNj_!ZLOcp|&#a z#^8A&e!0>TO7=m>kDYvF@ax513)WFBtZtyZf;O5|w?1HKMt*hR7GGWuf5L}@yhEeu z%G$=a5^8X?xSrc^^ANW`afmqWo}Z1vn+Tu;)Gb>0Z_0PmEFcuF*7`iKWx^fU0ewSVhIO z@-YfhLawZ(i6d~}@sKgk$lCUu2Zmuc_C8(Px$>UgCLo~O^DxIxV0!vjp!f$<@WsvD zh2+pi>bEe#EZCAafDDr5M$*N;P)10}9D&VYQwu^%n%bB(Ce6PZc(Yd1d`qYcJw8n? za0Fg$vfxKPbsKF=+TQ6?%u-1tg_?NbY?KZoWX=KkiW8H`=Zf!FTG8~c4XvG!pHPBn zp_10<28VsjKnT3B%_F*~ARYa4>x$)R=%S98B_D|S!d+e%yjduCVEbv1TFn*Af+b80 z7CklsNgI7Q#}y8}t9W`Rx|c+fIA2jFRf&)~rz3i zRn)EImQS}U+sYYIBtkX@$shs10Gy0)4>ikP>k$}?QfA#t7DfO$VtVhu$t3jbD?0Nj zD#p@=cNqW^f$7k7{}!)%OlPgG2Nb!atld;Z! zKc!lO!g{>(eVW!qGG}fXwr*en#!m#`j8{=}b0(jy*iEU}K7(~{Az7r7BGCFB=-+q_ zJJ(>krl)Z{mYTG2%MYCu#8-9+6p*|~FwR&Kc|n|KAn}2U%j;=PQkM3=_0gM7jFfrS z+Z^?;hqdclSJS1oGozxGR%QWRaq|K(xZn}bueEhHJ{Q!k?4E6HEv@WW7emCC2&6M8 z4V)jlgX!M}x~sn$_?7gfpTZYurb%SVe92=Qo<%#0D>CgpMpu)Hz?UX8D zuH?<#@>+z9yr<{R$kbr+Mi-Bv<8@WZY;rit<}Qigs~uwg`pOwlEKu)-y_8 z;NalnrFNPpfOW`WnAp5X<$SkDoCuj;fUI&p_BhX4_0JD@YvGrKd_F{a?ANpFk&X8d z+k+yv@dRcdou`bAm^H#`R$9M?-}^&K)^#mL*Do?fJ*pEfz;nHe_V&r=psbyJMawBG z9&h3ggI+gS<<=Sq%I{}X`$Sn)2cMUI-~slk);x5lUoa@()8@mZ_)3;?+8#5Z+ptBc59s zC541ca5gd$8L{&G$_U9F_@(uRv}o6oNosu2uG*bG^LC|gKBH%H6)g1&c@?96G0587 zp1_cC&o#B9_z38_Y~CR84~Fh<^u766pag)NA>WQ z=%-z5k;`A1D<3#X@OMh_4a<0n!YMRu8fetTYdnNp@r=IQINEt5El}yY7sD+RQ#Php zCb)sWc-pHoC?D*kX@Y%-Jk}S*jbF#QZm;%jW=n{zryuC*(VJppPH@qK!5PWq{cFah zzj@B-KvpM`ahCqH>L)GA!^V8NyPmzP_@$=Q#P$Vbwl2!CEGmdl9D%fOpbtY(>e}_n z=oh+e#H`TVpot(PvVx~013$ugR}-VhHSEh0TtO6h&SibSTK5eT!CnFJ6{w$3@hmW0 z$DOc)9BOueNdcLdlh0w&u~3S3Iww)3c6`n(j?$oW*PgW>*rZ>aX9K<~?0av59v8lM z{{V@-%x@lDu(r}Di2neqW+^^bc;pNd%}ssq4$e6Iy&qnTnPOKdbeK%A2L+V;xbKl$ zsr9*%#X|h2$5yaOadi{{g876lTR7*|yU2bU>-X0wZ>QWtb0enknJIyc@xjez>sn0O zHnnl3%d#umSpWrFC|F>IR_H+-k81UQhZg=O*R?fSE!E+(VE%sp04X!i%3C0F=qQu6 zrjwnO(Zn~wzZqbgh!QZrc$Om>`i$1@nedAH_g~sKF~JFcERY){<0Nu04mwx8_~Tmf zAA@wL?p6kwFQpMd4n*;lhY?2qa1NwKHeI**L8^XwX%|JHZme-P*yZ&KYfl% zAIiEZ)aG|)5^_s(ua`{lnpzdoZe~;}5fR+5@7tUK?n&mcqwppErD-jsS3u;IMs*lg z9)uJB0P3$*@aKheZ6Zf)X3j|w2QmiSiRi%cKpnwa>TYIObpbuCq}O&)#L~$;R{0@S zMVxvVc2 z=vp?nqcxLUz>yYIB2{^w61^5Oeqc!BjxkT`320|VbCmu4kCg7bbEo*G(d_Qk^!Zi% z#cN2_jIE!#PFHVUpdY1DxzO~jZPpOFg};>ThH5Z-wPLHP((4Ws)gKE4Yz@!H=l@E3u2h{vp4xf-kmDVv)tUQqV2IEZmHM%5llb z878JmEZx?cS6UoCv*85L^xJEzYs-JNB%WJA3goI_<(a#l26*pWfYa{e-0sTqN_Q3w zmTdihm3vg01=WU(_Z}NbFZD>6E!5Z0tZDOqb}0u6JDy3VTzKPL(9*`&#F|~5jB0_J z;6xkD35;wB$ldQ#$hs9z5hu2%me}|f#_$WxTUNKVwNiZE36*i%VC1*3718Lr2g3bA z(^Y~Q?&P|*RBIqmtInr8&IUjOuTfrysd%HqcbYWu=(;pFFki}9W80gR4suvXxb9OREH()>N)({*ibEN7g^ zPX*as@sdt3G6p#V(!EDUu%108Sv0$3wzlf1-CY=Dkf8M)amnr1iZqQ6#&?%0ma^F0 z+A%1wT#qYx=vFTH$mbl_(q0{HKGRPzYBouACY;L&YZ%^mLl9YlvaU!@gpT}mr#73i zIV)F`718lL{uI=$bvD#)T5C&bFd2%KEtAi%9fo~txnC6cdr7sE!`eojB;RUH>PRY6`bA^(qxNR zoHomcoD$(c0TBoQ0!YE`c&$Cvxt%;qsMj&(x+Ry1d@-WOt!g(CTw4ou@~x5*=G{2M zasU_|fHgI*#I(Ec{ln@6+kqPvGm{4Mk;hrfJOD*e&L~@Tyx|I^=B(?Xjfb`hI;xlX{v|w(aV3 znyOsGZ7t>Hgt3{Mcbd^>ll{@(0DiT}_;%I_TK4YNO`cR_nXZ>A2;&MmZX=QOuKP^4 z@de$?>*EWiiqB&bB0wBqAC(SB%X;?BVqJJFYKA+TL@>hAj4ClXQU1>$A9L2Vwe&KK zxpz2COUF8$g|cb-T$9Wd&H@4hdYz*f9jdjZ_mBKh^IzQETj}WHM+1x!c;FF}>FHjD zci@$Z;pA&~{n-i7I34=rel_aaCY@^>BGSszV`*%uA(apbWpZ(bBX$|Eb^+3#yB(3q zTBCZS9BQ69()=fDqxf4|X>HYAWQi1grQPz|a{mB%K;w>U!LP3TZ(<^AIBqS*a_>1~ z=D9h_uLl^w^fmP-#4ix|a>?wDt>O2zjztm~V!LrN6$$_&A2B}pu1`(Yd@166XsUl{ zPb^?Cf@q7m-<)!I3cY)0G~%?qj#$aXU8BLK@wblbAX^(diS2}kHwvzB?oTHj20gk| z*1r<`b>ZE&7Iy&`o+n-4?&J8g*!ow}m%a_MVzX+IKHGvsF+#bN9(IkY7;vNT@7lQw z{{Vy9hOH^Qw(#x9wSrvXok74EK4>fo_89!})~P`?p{y~~w2b0-7OC+w#gmhBaY9C_^P;zj zB6U*aWCF(lRDTvp?NWGa;DTSsA5gg)oZ|s-2j^4l+t}%zI|!-Xe{sn8qsB9Mo@IMo zO`}Fl%X&xwRvXRhK(ax z+ghk1MpBW=JLexUz~_K}J}Z&&M}Yi!;hi?l2ybmQJ9fgvw#?yjxjT1Y65m?6Q+)-8 ztwu?5J*k^U~|R*AO5=U zuC%`q>JUw9_9+rz+Z+H+&^q!ttV#S4t=Yi#_g1LBVuk^Z9S2O2=yTq(lw{SB=`KYj zvEuScb#4vBAZ1cgZ_F8P0HqUtsAQkFgqJ!Tx=(BhxX)V?@w3*%_3rM3Yf@<>k zPhZt6nmc<|veRLGl4lDfnCizpK>F4nSC><(>oo17Jf<%VYM12s5#%cc-Rqv>y$3_^ zMg5MUYKswhWgs?2a5|EGIInc@g_eP)=?gs8l0$Nb%Rw#}fN_TEerEUNR{h?!4wXDN zGRF#A=ME%bCChZc=kczHQH)l*o@IQ-PJFO9oqxlg5Rbz*Qb~0wzXg;)u;EDqp>TGN z-%9X1Z?b5YR~me>$g{izMlVr1D$q zi>5x*#LX|4x>p$3ISrAXqPiQnd`0l`Yun8#?@QJ4U0y*VOR+PzJmHA#kzO5bW2#*} z)x^>=+{^pM+s4*!Tw{}6CYPh%7K+PUy9U-&Q!>YfnIc|xspz}9U~^cyQfpLh?xoD- zr(>P*RmX|`B5D@4@yljqV9}o~)j(7mvP*4I$8y})AwItrkEg?+!RBwYk(uNeDC~OU z2M3W~O8B$kkApScKFTivCFEC!q(&B#&Bg!(0&(h2I(4rf_=E7X#y%alwOvZZLe31C ziAGqCg9C-frBtX$ni$G*d)V`P-xVJaO9VQrOETMi)m00X>5c~+abC-%d`Z)^%^X3Z zSxKf|D#)^xm6={F9jnF&z~GMc<$4!}HAvuV_#z%~ZK#T+-#&l=)}g$$*9u8xExyUi zhZ49d;B%GRjGWd|qq4S#d#MRoGwTllc)!CQEbzR#M!#uiZ>R<{MR_hcBjr^j@`^b= z_2V8o@ZP`Sxum($?;@5YV-rhc#Ku9v$vEhHdg8G3EjL*3<-|8}d2Hr9$T(sZhs-$# z860P*?OvT1i**aRZI@n#D~l^wo9vdc$NQqsv;yE`cu>9Sl_ryET;px3mrq7{&%@m- zQoQjcuCJ&Nky>0wEQVbE@Pm-NXCU{ly1aeyB_+}HO&3Xr7jt=1%WxE|QK8CkLn$me z;=Uj8pNut)AVvL}`U07~>f4tT4> ze-_qD3w1CXrZL$;BKdIwnET9rToKzK*T@mwc-zGGbJ=SbLR)JoNg${Q3CS41$s}jL z6|XL^+I{AYrf4a1rp6>in&rZklrbBhXdGbs)J0TF-rQ5AN!hK-zBi0~Jn=of_Q;wE zT4-J?d;^6$a!xUxax2yT4S1hGNiVgF$PybFTO`P;W!;PnxAz8eK!dTs}?r$&6< zqpe9va-Ui1-xPGadFPZyBZc>@YXJa-1b|LP21jmjUJI&g`nBB2b!aA0ahys?2WjVw zdj1v5=oVU@q!#}GQ@f2|lLPGN++cQNoc^`+4W++^V$f~vtu6lFs!O)sIFb2$W4Hva zYt^Mz`?JoeLKNN7xyxu?7oNuQYm4ccOJqo{TuM&oErK~Cq0i}GM8o18H%ieUxv;i| z=2;hU@{=TjGtN2BYVfT}Ulm)!_8m$XEuKkNF+qtM7{J&Bk|=B_9Tc4R#d@!YBpP3Y z>~3Mel0|tWP)K0SkiUTgHQhrK3%H|~6^ERnr6bBAx$$?3{Ac9pdUUbL9Giq{r4>{h zl5#8ST`Ne`B+_m4m?RMyRg20_6buq`j^y!^UmNQ`74ZuTVnxhISdtz{f!V%oVFyt1s|nvIe^nr{c{ zTB%(=Vhjm|XOQets5xQW@_N*_9vRei(E1EsPn?RPJ*N?(N8AjP(0+Bo-+WBI(%?Ex z_mIXQspm|je~K3RH1>M7ojiYPE3$aecB81|f#0X{u7!!a(C}r1sAFp%R&92VJ0f}WJb?+3$jYLga8CohP`c5eOKB&y^6jEh&^Z}6Rp5*saqo)Z zbpHSrN8+Y^PTDhd=ST!9pn@5B?~G!XRPm0r6itU>Vnc$!7TcbOInO+1x>IX%X~tcR z3H&#v>bhm?HM^MYc{9i9f^n0_rxoVbS{2TbeQ$krD*cWb{MitxAVyPYC3DFc$m~cJ z>H1!+;vuIlksXtWZrog5I0gP$MmI4B00EC-Tvv|tr#Alp*|KUbs^xs$pEI%?ah|{q zl{2c-xwo_CvS*`svt4~6=Eq9-Zpm{Tf+qWD`HCxoOJlY$dvRYbc(+-O!^L`o>arW@ z?%?vGU_aJjj^m!)1}oA&6lz)zhc!pH)x?(;(2VYol2v3F3fSraz~Z+)BYZN_yj`h9 ztZ8=;=}l^;L`GBPkbZ1r9R3*ZN!Ly`XKofTqf*k@^*K#LQ_yuCHr{jw(#qD#IAcc} zM#UdC-ZAqr`qwMr-ABP%T;lIn33kyTk|;M|ZvGJ4M@&>2&W9$ne!;2Tq!8%{jpV=t zYU_>&>AU{`uU$`rb&mvI=@MD#x*SU)TgYxEQRYk#?owBOa4>i|99JZ(S=pY4Dup*C za>cL5i_4qYG|vy{i84zdCK$j(_Syj83|D^sG`GI9m-|;k7FTW#GD8M#gy$Wr=B-0m zkHMZME#V20ck-LmASIaBqyB|^7 zvQzi93YciwN(#&II}Z_GX*XJJv@3}ifZKD%20CUcg^+lA>~ZmFZocrB7Z7Tpd=ZVui*D)l`(QJ%*`@@y_1X{M1z7-AJ{5HXIY z9V@OgZD?U%o-tg9j=#eH01{1cJ#=WoNSC21rJr>5#LoGGTY@6pPhu%-!U!nG{e@M5~HGOe!wUrUvYRX)aaK)K( zy8v|0KGl_2-D*_~MAE#rJax3`>~80h3n!6MJd{kGig?NNsv=4B*`=TC&S91^0=o6j zQS~+SfcR6aYOqXn>-R@lF>;{(`vl=fP;e_cyDr86^iV

8E*CUew(R$Iq}WDpKqpEq*odoPO(SkmS&Fwb2022Jb_$4iL~Dh>0TPtZ|(GJ zYkP~Sm{}d~B+7&h@*YRa$I1?Cx)O|4(dVqm)S9O_>Ul4PejE6!QrlPMxF0aXfN5 zr0vS?-JB}p-=1pLjpKbsN7k*!iL{yX=f?X;D&c_zcW&ndeqyrrsit=*SB#%En&?8B z^_9c6o#I&TW3gveR#x8UVdrQ)&q~p@*Ys<9+ly%JKFg;>OtBaH?%V*Z%g^P_dbfxl z!5%;H@>^UK(qX!dWfKj%1i0jN00G~kG+O7DETF88)lTbNKf||Lhlyl|QeP_G1NWr)SDuH8>W&p|b4wDFYq6UQ(#lM~EJq{d9ZH|@ zuXB)3;x7)^#cQ_N?A1^La%6n*fsXxZrN_eg<<_)qI?C=D&CrTgD!{^tBXA3Gf-%TE z*QPE8s_;&m_n$FWQ)QCd{PD;PqvyFPHy>~(lGSrTa8JA}(Zk`I^IkMOK7 z73wqLD-Su+%8fB?rJcnA`lgKBnaGw|7 zQSpV8aambGZ4H_Ox+KQ_Ir+Wo&z&V3x4GR)eA9~PeB0u!cTU#rEMc^UPd?ryLj4qg zFjpSOp$41M|jMVSpo?@q!2=pGwiV z@f6yucJ>;9NbR89%CSbOL$_174CTA_zLmEa)R^6r z1z<8W!31ZX*{^icEbes;RrQ@l-7jOb5vfTzA1ehsWDN0+c;dX@Pt$aX^w=fSP{kmW zB(jzV(*$(uT^-J=sp+~ziEPQ{DQLGcmSSA+z=AROiczVpk>=K>ucAEz#V_D1>EyhU zSGSTw8aNxkAo8GKX8`8BH^vfpcJo}8+d~sbueD<@%BWrl9r_NP1$Ukt@MYGm zrb~ZyA(G+M(_#C_~{+qs>oeFaG`<0W7EHW)!kpn_qsK2r^)G z?boTOuXVOIt~B6U3C3oLUABNm2s!ImI+|;`K7zW1&A*afZ!+3aS8<&zhk30FeJjb*bs62R_8G0%;7z+65uSFEK;pNrydh<->b9_H*78FgyuMx5 z-~!9! zbB_Hhn6J@IL7{JZFlrXQW?fzJ1P{c`IC6f6G|%K4rmd z6T<<|80}WHj}2?wD@da}XSZCNi81^U}U{)$~__JKaX!IW3m%;KvM2AT1OxmRyjykTByQ zjz_(HDR1#tQoiuW(Jm*9N_H%_4IpU(HU{9N;kf93I^yT>yjn0@O>H5U&BVeP* zv8mjIrdX?I(~Q?YvhK$mO`VQcOpnA~2(elI$M%gnScCncUv}-P7?dOqM&Xf;DyEm> zS@oOfwIv1z5)&L*%#E;TD%@bN2cA1uqgnXx!M+%=pG%ub{?%=YEtYSZ2%P}kBaOp( zBaSh^0=Niu&kySQj5@D}EG5#ln`@W6jY=OPR$fsfi5Cl&_rM>WIHk>G9MWmZNcQ`W z2I^YIpKYjX6H9kJ)K5R3D+U5g60yXYF_W~7$0ofW;cvrhokk0tS6$Pr0>y14k=)3U zF(ePTQ|2M^I5-vO-W>Ra;_ndXcVA|=#-f(S9n2TYCPs2xyEJw<=aXi&ccf?Dg z_<9{G=oocZK{Ty;#S{r&f(jByLGxe^nCo7HP*LXC^IY){_ek_RzZ5Q!eFRpvT78|p zk`V2B7~=yCx1GTD9CKXif5N=g@19rFRNdVp$1^0QUD>ny*!joE4svif99Nxb{w0sZ z{vWxq&85x!Vn%i4qmVWPZeKY^Sug^g8+S~M*UlF@uB~HslB2X27S7oO{K|O*VDpZ| z8sL?Gd8q1pI2?wqCjR#;N7Rt`U%*Txy|=rL=m^TBmyV?Qr2M&!a>VBVfuCCO?-F<$ zTa!{gAbZ;b_Qogd%P!Z7CBPX{2G9Tlt$E$Gj4|9tscP3K>mvtPmB5k9fGTFq{^rXv3UXScY)l~;aP#>@sAcRPU{2eoB4C+{Ya>PszHPkM85B1pUu zVI{fLo9#F8VP%HcGo--eKPSQSe*pBWLzs_c;SHrfOr7&(!GbqUlcr9BvAN%-r4M< zV83UPf|(>pm3~%5Vwu4nymSV(!q!x;eOo-tej0Te<$4~+p?pQrv^`Q=eM3f>!dh0fpv5nU{3)(Yd8F-@ z2Zjj$0DB1Uw8}D@$1Ssrlg~M?L)uGuJD)RClBMFbYrX8wQ{tzF?fg69kL>Gv1hOm?F>r~9yYtD+r_A}JfLh?OEzN>5tA6@Mn}^=oh#eEA76d1TNd^ZeYplw zPnZ>fU--86IP2?LF#H$rCaE2!y!UrDQ#>Ki#xdqd4jFml<-rHmy;?5<_#?wwQ%h}W zw@|o+B?dgo{#)b%?YM;mDfboYVY#5~IUZIvr5UH})sH-%RPaTnt2KnuK$j>T30&oH zdFXSHP6r%C@OnCmqZ+#$!0v-pMK$igWq#R^+=BZo%0A|}XdSu>Pw0ThE z6=x%+IP~q_z3arE543G3LoI64>em7YOL^AcrR~bol9Z-wp8ow$@i-MA^1b3-C14huW;5=Bev)zQ-vh_yo{fl=y|Re z{tz4O14ps(BsW{2xspqF*iY`HT;LwZaO7i=UUnumsJ7)D5$)lySbC{S68F5((&--u zyj7#>pW1qMp0~uvB#ESO*elb3c?9+%y`xX?2aL5jZSQWNg~TY&KFF|Qb>uI~Ta55V z2c>f#2tF`P;cZ4uH^j63s?@|<38vk>8yLWBj@>))*1L^&;_j8=9a?zw?Qm(fQz17@ zcB@M%E4OJGas~-u&Pk%4E}WpbUcP6Wi^Jn%UBaT#bzO|V6L=F})oj+&RMaDe(lfs@ z6=|Yx?g6+Tm$pb4$;*|!0)JRlXcz2&(G$E9Fznu)>1kE4mj_c==A>phJGcLu4U0C8gz4K%SaAUv(@pr zhCw(yWLI@8JmnjW47Py`jMz+LzobU@C%1Pvt$EA6-#)aUo z1Zz@Bb!PgWn&jzV;BSPaq^!|l`?!NItAQ~;@wi!QsNeknWggDE)LlPk`x`? zi2N&p*6eTX6H3(Vb?9|_=!t=1Z!#a;#q+NGfg9y=zbm-UPEAX~)2Z(B8e!_mK3ksq zqp!lx4QW?SA|wM!TEXOyvM{cMX1kg_YoEe7&idMq(>wD*wu;L%DqD#K;sqGcn3_6P4REp zbhNd*)o!fbQ6{04f?N@m+_)+fa4<6b}T-lMAcdQTN=aNKEJFOzJ5 zsged9N&G9cag)jRtg1>dJojO<)!?IuWGZ!k{%m)BoanSH8yU z*1S356RXQ}>SKoGhca8}aN0XbaV^c(lOCxoVnZZ1kw)rW2Lt3Al}Q~&<6E;&sNGL% zHk&=wvRy>&Gfc0T-2ksZP`_7<>X~v z0Ze{Y-K)CHJ;hEyR-E#ct8623VzWn3n{DhB@iMBc9p%Ge`JIcWZDw zH{+iQT1lhB1dleeYCNfSoG~gD#^R*(C^7~!TU5cyq%U%)GSIfKeerN*@Ic%YI~RL(MFp-OLTnTAvoR12d7H& zO>0_%TJb%%#0Bv*QfZ~$Ync_k&Q>6bn-LJ1Hw+D-haGz7J4TEt!A0(JeR`#O?Z@H$ zdmcUF9~^k=!cgg67Ph;aNt;cD-tx*J_Ga^?ZRALe^2_pVBX;FE;=4bG-xGCMA{JgN zzLIS|OKjNMLungE`^Z+{6mBxXg7O%9SDm+wH0$3PYQ861c=f1mCz2`R)WYua2?7ZO zjfPSJs3i5|9<`ru}k`u0sP!3q z*sKvG8@BnQpc}Bkx~X0|)vHe%YO`u$O?Ac8S1Ri&$`#JX>WWwrG26X+rLL8s>Uv$Z zzlCSimR(FFa}70QD-mK)CCCZ10!De`k;&%{npK}NWa3>)5#*B9_2_a5A^1HOo2qGg zlv;+b42~}%l^e?hq-Kd=({~@S9oJIaYnUxd7LU{8GKrwGR%(7ugX~)Uk%;A9QTNcBy0pWt0NB2MjQI z#t*FcgU7MzT346i9a7ps7>X$@-SHuIY%?Mu{or8VF&!{Fbe~nyJ{W3xEvBn3u^pbB zVGQxDtd4EA%_q$nCAeI%#!qjpYdYJbk`y^wlRiQ4hlXu+9VX9I*Cx0yEyD=x;Zh?F zA<0~w#3KQmejH}L==g1~X&QHhNVU_Q760wVDodqZt( zp>y|@fNz-KgI#!Jr4>0Xg^7nNW;LF_;JeL2OOFhAZb>A2sUW$$)EOCM-ZJb!z}Tdf z8QgXdF~F|B<4=NoH$A1EyW%ZAO*c-3E=;Yb#~MPjr_T{F+;{uPi5fmce-oe^gNE9{{Z5D2V84fPL*ll zT`tzZUdQME0Bp#H2W5aR9*KG!$VMZO-cNQSpa_JTqfy;p@9yLK}vf4UKA&T#er=ZB~eb zob@LJA6oQ(hj#juHg`5&EYl(qg^FP;v7~ZICS*>2xe$fo}xGNqq3`R2>9qj76cVmJxUQh7~*Tm29 z0`liXjpSK$*nZamebE(mBr$!Cs5s8jK>0{5SiU6i#ovdt4H%}QZ*4v0jq;@Svl)KR z8~`k8Q3hAe4}icvG0+2%x~s?DUHR-<)UCz$i$Uk8Fye32|QOV z@bW!s!aEH<=Ghk6XN_eyOd3mo%EDEUGT^RGIc@_1jtQ<*+}&s%D3eZtX<*Vt=_xb- zI|zc8;Q{i_-Ui@KI+`5PMs5yKvNYxJXN&$G>!VQc>e}m8@=mV`tm`ewR?4%+%&Q`) z83%Iu;~-Z4hw%?v)HPd=2x~el7I%7GdecQ9%c&Q^d`J_!@n0N z@W+bey}Q)!?-l~4%_De|cIM7y+>L+~1CF5a$3g3gW$_=2H6Isvcw1@{-^&%&mlf!e zJBw?Gqs)l1Kp8}A$B`fb&m@dyvsIPsIZ<}^)z1{M)USL!@e=0qRU7BjZUd2SjIkuF za#!b295zQAfzM&Zechw@hAlxXqPDS~K^%nN+sm{SS$AcNaHM2+BmjEX$V1{y-nn^c z;XOmciEpdS#tWF)O0q`#jEq%_N%D`G0~P>uAY#75_)(|m8rF&SiLSK!8?pYf-quz! zkjfA5Vws;g`MLlyIj*X1$*AmSQa48d@mBLd(QGcRbUzBc)tqogCG4_J(87|)Bg|kT z;K&IZmvHaexvvd;CDQy&<2ZHkac`iFXH1=z#SDzto;;#P;Z;Z896tjD4{ui2?R*{m zhpSs^l1*)<$g&HCn8uAf*7;SCrZ)l^17UH$r$f&Lqxhdr@vf((TIdtWXABU*X0S#) z(MkMRDAM&N23{1_DV61yWD_2PUn-j)*8frRLw{LZQX>M+pQ-{qW;Zef6 zq5xO~a>I5v5I#^xNo4U2rnReUmcA>sj^=#|GXtilWZreEPRyX4=0Ti5AH#bAW#QY!zMk_;PcA6s2+=}Em=ukkWI%`A<|*s!Yoc_cRy?xQ#lgYeIv!!; z-3P)x7t%Dp5w@~z^@O#1Xr5TwSneTh*da*_-E;RtEX<6UTRjh8ikr$tP$oHp5V@t%Zxm+NUM#9 z`=kOm^sX<$c8{e=_J0#S+ra{6*uyhN7E2SIic~XUkIdOP{4wHY7==Z+L1?^=yfqgn zr_6JgIzF*vVYSnBRQoi8Y_Z1795REuaUeF<>M_CTUCy2Gx5f898o7oAvSEJ|cNWlG zb0q3;cSLw>;P5|Al~Uiu`u_lfekVub&kkE#Y6xNqw#G2qqR-8ca=^IG;<)0zjrfB(%zJt>IQR97I#k1I4pSNg@p*5%3?CrNrJB zTVOt5a6vnc0`3_Yt~11bCDwi#S!w?O*v~D#p{ZJ!?_;@(&RJk(04!PDtG5_nzm<04 zY0{*wx}3OtU22oJU%>f#VW%`QFWb^RMm?q%1;}p2NeV#i&T;thUq)Kkc&o-96NgdI zZEm%jJvP^6@0QW|sUl#f-Ore#clS#HlZDNB4X=arj~8k0ac!GB^|&TU7>$v_pp)|8 z7S2X6Mlp_a#6A`AuZsQ@c#c~eOTHs!R#5NuX;Ht4M;y4pQdjFd+ zx%GwDfxK&{_&Y=K4y$ms*OMfoDDqeA*5Pv`H@Q1<$~Q;3K^@Phuy|2*B-EpmUbwXv zw{}p$rE1=AHtlB_AG=8i`DF}QO5-@kJ8@o9qT) z*x4vv04I~*pvMQIc%R1le0pz(<*@rqJ|4V#nQU4Wm&%ecyK<-?FaWb;Hb+i`iu1DE zRNg9X){^M^cl0>16fXnrSUf8vn*F`TnLE9rCzUEgZo3?r3mFn(pl=MA+#CU(Paq#1 z_@VFu`&scWpW^Ko#1@bCps>J`!tU;4B=v<(H)mnvBh=vI(;)cmrzBPyrl@dMF$KI9 zi!w(#d4YWICD<6Z4geVgr(Dx5zBFh$#pzo+wrEh95qyyoz_GW?m}O$ci*Cx`jCBUS z-j$xH@+Iw_=a_hN;pLFFwb8X57TZi%P_5Y1K~I|rutas&()4O&qkBGXixu^Y}?@c;|x?w=&y#6FS0VeBdVXK5*cSWbQcXdimbB@gK!Wtw(8Le1=I>gRxZ|i6xlH zz$B8#B=SeF74vVE?p+@FbZ=ECDpnS(G$4=w(<{17X{64&Gb*>upM|C83 zC(JUTk|G96HbZVw2tR?vd!B>i=kaB%mvQPPVsugVWyEC)fE1F-#AD{q9FFI$c2&+5 zCCgD+^nE^kk1|{-D!;zNNlHCeUzc<49}4Oc>)J)Vz3leax6oV0F8o~wd-WY>oHZV0sdsBN_^ zN=tj2t9b4#?xBU?-m;)A1n(Ooj@*sP58^AM@mIvl8;=iIsL?H2T^$5%c{J-hc5NwB zjL6%Ae+W#FHuURV(9Ew3O=^7nvU^nb9nk*(4(UD)@eTaiPs9xqQ?}RisTyf6BVz+b zk+DKvc;rpkCw>n_0~w}kHXi^-h#y+jH3!zUJCK&57((1z!qM$r#3)oCh8*DI2b|`r zc-O@`=Aolm-}tXYOZ_hD26(UZwtIOR6i+C{B(ab%6Z?QGgP)iZYf>G1;Xb|Ln{6t_ z#^F}N!DNjuPudwGeZ`NPA!iJQh&@-3I##fhXV$`WCmqbqFX9)4v`fh2wu;+H(&bU8 zBU@?^hmztF71BF(l1Eh`LbCQzoCDLZ)&44IcfKE4qLuH9LnOBsmhrs4N12iWyA{a< zfTXYo7|7zjGV!gv&1f|*3{5r7!m4=@O<`{;M;rtO{rF({V~0d!VgoP)gOPhr@t&jM z4-AWM5JN4U!>S#&NeryfMx%ik+Zb1DWUxIBRgYd;w}h6LM_e$mlzTJU_38D(Ev;ak z&YbAd+iU_gks^>c-40a=TodyG7y>=1c$eZ8{+$ihn;S)_CZF@ihfA|=h(oyF#?V0_ zvU8FEITi8Fq2qrOYx>*TtkXgn3PTf*EHVtTd5At;*vH))eFborTAsLWZX`!|86$o2 z<&|UFRAYck6NB=eIj)t6OWjC_;GXi4_DB3KOZ`Ij<)#-_kU;A4y7@?p69B$bZgvOp z8T=0x=J>YOIvJlsk}K&6%UXtbWv=HlKcr?-|RxLx3o`yB1UmGxc^2R&=X{{Xc#d#mfsHsVPV zIHh)lT%! z+6*?We+|TUD(wJ?P&_g-PBN_L7$rZ8`PZRJwWDTXC@YyF9V+}ucRDkq3A6VnYc>XV zIQ|s?@NwzuTt2C7ro=9;Ehl*80Ze0l)?&xoJGyhyx;yU*N22M1c=c$dGm@_YI~+V? zIFMteKIuFj#}&ZdNWqpjh#|lyAm{7PtrKaL0^Xk?f?;~nq>>zlLx$bQaDT$Bn`XL3 za=#>OT~$Ullhm&s!-|IDc&(5}<;L^6;hO{G?yS3beIsvlOT6LAeDq@Km(=; z86N(%i;=QMDoV|$G1?d_1qV3`fq*m5YTUZiH3KMAAmji{YwPNNrDvJ#nVw5?xh6Sc zI;qE{Xj;u}Ez}X)O04OTBxC|f?YFNv?b?f!UDD*&EM`+8(cBCkTa|ytOLC6k?}t@<36ZpL-*( zO7@*L%flDCDtKmFcZNg_B1*VtRzywZh&-to2chF2R#&^bWll;fM11RSeAc$*UIdWN zLLn@~hjvh3>yA0?R&DR^?8MqiP9X~^-kZKhBLI~-+s@IFIXD&TQ+ybGL0<1izJ_}g zlW=Xw)1lqBY?vf~c-xQ<2h*ET{3o;$Ji7eDM~37xMAGFU5%PC#exp4)X0w%KfkrJ{ z;57X?b-CqOC);^G0a94Uj_kyofChS3z4&8G(sXSbPt@U>-uC*&Ny3F+F$7Gbe9Wh* zRUak@Dpa217Q8dy9}emIgcmSt7BSe`TOc9CZh`O(@g>pB1dP6KWr6 z`AlTXIh-DHFhBr|WbuRVUI(lAOIJpZO^W6hmBgi zduhq4NvA)bcN;-8tOk6kV+H({i{|;pa(aw`j%z>Shr^pqcTTsw@SL7Q>AHSAiDM5W z%%>rGD*}3M@1A(Ay`&z7DsxX`;JYn1Q?%5J+*!*pE3y<@20PYwK!*6fL)zpxjsnNU z9vs)LtaR&ml`m#l*5)Vj;X>nUA$OB%5yK3Vo|U&Biaa5vMRN>xkXl{t?m#$!}fz-^~-9sRSKxd(&g5?bk(ml9i&LtB{O zSq2-f@=p)bj!&*Djm9nRdejYe_=y40j*)*1H*(D{5=^0p+g3X!W0g%<#pC$Q%=ldb$6@g1$pUFbTEt?+36c>Y+VRqliqZKQf} z#dCJi>G5kH=}@{|!#o1!Ddfv>fhRz@UrcldzgnJHeUoaFdrcjzcVF3Bs@!WgkXX$G zfue>bCMXtF11-4qAmseqdR6<0v~43^iswr42Ay|4Odsgb`H{_*JUcXdR~Z;7ll^&L ziB=ZcrmLuHJ`~gEw$THuD{>-nZe|J#Dm!tU@&8`1zbnQ{D8>L7ayjP}@P?VJUEHynDgOYnqzmMRP(lFXk&;f`z!Qvf zjw{uCGM25T+1y!M%9oMb+%%5zsxwNPOl}L0nOtWp&OHu!#Zq0wz>0TfZ-1vNp7?eDST190I(OI~|4*Ux5wC{mFKDO2;ywYy>OKLvQ zmp1$66FI?A8$uY8#P`NI&M<4*{73M2#(pR8#-FPA(^s`R)X_<9_77^pSb+PjEWoOg zJ8*jNPbR$=DsYXPvBwL!d#B4D5>E{3o+6GrPY=s`8%kg7;#p)=k3BG-Gi@Hdd)B{* zd=YW2-rj3I8;S_6;vgGKe58o0{6;napL`1X3&9$HjQ$BM_qq*~dcCdcppq0UC5lD< zJY(O24<41=X*$=2{7>RIJZIw_H6K-tgmERSEHRWBA?J-4G^8;jJv~RKC)O7`w#M>| zmbN}W)BYa(Nob+Iu(P>9en{QX<5%(K z;Mhp3Bu#SBI8Ymg3nI50vBw!c)lROK0Qdv#kzDwUUFq=P5A>PYQf6#@ z)(Qx~>z)r@DLY%q7 zSmZ`BWkv`DlhhAG4fn-;Ys6YY>0f30Me(;qNlboJQ-E=}ml!M0R>AhA4ZYn$5pmJ8 z#l9AJ+xrh*O-oj|X&_O93+0wfk(I#X@H|)9b8DUt@h^t%SHtEFBl|!dvC38zRs-*C z$Q=3(weZy6418l9wECiH7r`PW<#mO;wCZ~fpQUB#-YC>;;1+T-&k8tk6rVDy4&%5# zLs~dp-4#-lYHGJWkhk$ZzohE(Y4d3JDz_iHmipcz{%a`PxRaFFRF0m$_0{WMC5OVX z=~nj^b6vcfOQXzV3m5?K80|S60Bf4?2gQ4xMI_Q@)FZH-b`Fa1Z&@+P&7c5RmIt&WrmAryq+x9?D{9Kq$fjugla<~hLJdi&Rf z=jesNf@F@b#J~< zB>UvLh2Wg_JR0ePy1O`?B?okJ&*Gl~>biSF;_F$W)fgSJjDZ>fk+W$bOMi5X`ikA~ zO#T-Vi*qy2v?DZk83$|h0H|D*@6IdM{9~ecVs8seadBl3EeM3R-z}49zyx+-jAp(% zlU>q$DXORTa!$6v7tUvs%^|XPV5m|Qf(APK(4^jxIw?g|j;Gpfr}#qSNuE)Qxg=7m z0rJoh(E(A(9_R9}0`YIdpAGn?IIna&i^Fkdfuy&({q3?4azi!&>&6B~D(08*FX7|p z>tPw`?s{K^{57Na(%B+~Z}h!aN=YDFYb1@5;d7nH3V=fKlDXrPiso#5VXpXo z5uid6T~6Y2YE9cSM-)Xs-dHx#*XS`=S|^IU8>HPWmb-9XXeE_kzOq;OqmzQ99i@gz z!N52;$FHpX8}QeKF1%5!-}s6GmR8aTtqjMQ+0WiFFgf7oo}QkW%bD(Vxkd`?>ufZS z7+GCu>8|PeMXYwE9j2AV%#)zO%v(!fk&~X8KcA*}qvH31G&f|@6f!^$36K}VK- z#bZVvIUx=S1EB<9`%s@7uI{w^Dd(2T+Qw#*0wqvqYe+!bBB@uvk%6Ot^vUvc^#{%@TKMJM=qUpC+_Cj4*Z-hNh+PjM3*o#kY?_vv;yG;Zp^F|> z(U6uqf&JbPkjE#S^IECm2^#h-65iST{0{Tw7jQ zs1gq;_s7ptNyCk!JoV#@*Q)4W6fR=${l&C4k*u;#zHI6;9e^N($SgqhBZ|_D@2lM4 z#9Us+ymI{1tmFacEvBOB?AOK)k(E zE2_q&Lg7~*c$3aK_7&hzYfW>i#?Y8jWPHfb4agn2J+_nUitMD)UzOg_| z$iOxLETpJC$vDBUr!?Obcy>K1*}NO6TU}}vv5Bs2Uf=SPxm~k&DG%E7mm$v|A4X z%V}*B0$J?_9hhaMSunC*M!F; zQ}&VVV`yS!%WEGMY8rZ*h}%wvC_o2lkD4*gS0kzUeLK}#UkcyJs$1y#)G_L5bRJom z*<%**5^y#gv264wAEkW<;rl&3Z3d-tqs<)W&3IwFBoIRtjNp%u6&(#+hWAYSLpAN3 zF-bQqv?%$Lk4lNw=z=vG`JQ`o@R!07>K59(EMSZ#9?5frWf)cijOQGK^{xnbYvJY8 z^4nV6NH0=CjIsdgxMH~Avh@VxIr>+9;w^Vuw7L-KsSvXA2w7!Oyh>Q|a7O@EXNQwV zOL;C5(m5ud_qP|J1VN-q5;GE|;u6}8CX4K^5cu&MHg_CG9CG<8CTv^ZZNLCPK z1dbR0zy7Mv@TbBJVsvYp_&&>~{n*N)mMg|cQbz}|IQ6fjwR`I=Uc~8lGAwtOt%x31 zC(B+5Vmb_fa0hDYZuG02BSE!^uUX0KHWzd8jsOP$cEwM%cGT>6s;P3to+Tf`KL~$i zPj8_Kp6*aHad3n)uE5(sb<`a4-@z!#QJ`tj|yK$r$-l-H>{W?o3kn0NypFuTt|t19Qfl~luLiB zd8RbjRwrg>U_0(3B=pZgUqk7B1kx|=qn}vSp5hq}MY@wL^0E8BK2=w_CmlLsxStqH zr+8OhlT5UEY~JLgmp7L|6tMXA1M?N+*SUI`B`A?0iEtrLB$2 zTXZtWm_T#N3UAy5I&o26!FTO zDUT2A=m5sm>&V4@=WnOq{A{wGXzk>+(aNk4%CMDeAO(t@+-~WT2&+~f4}2fs%}(m> zH(f=IxV9F}8n@ZwMdTMGWg^=dSV*A&9Y!(6 zI(>6rFYBHe*7Zr$#3Q>{b0?D-3xGQ3XVScC*k>7Osy>qqi&bH+jQV@vHOInh_+ruL z)9)^Bk(Jr_5bkalabVlBc*i`}H^&=26GrhalYgdZ6H9FYaV${GlFKRFc_Bs-K^Wv` z>D$Bn2jY(scr#j_;=S!NmENhd?o>VcUPFr)(w`Ys90LaX4CB_X7k!*+bTzm#R&w1fG`F- z*Pr;dOC3;LiwksjgQVEl!4zRY898n<`PX0KEm^edyFseQWYENS?v6&1S61MMQb-Mt zPzbLp@kY6)-a|0cAX_M;mnf>nN87gyS@1fZKp4eN89fhPtpv-T4$|XMxHk7Hv)jZA z$s2G;90A4;>t99qTU7A9t-PmE!tN3rl+SaEX#+^Jt#l(9gV2ZBF2w=N_>5x6^rlOVZjtaEbQ`fINQnL7< zh@_57X8`PnCNP88_w>zs3_6@TzM1`-b7|$QkR)h}JL_(!dx*g-JMJK?ezsp9|*++b%Tt$DwQd@14EAS@!BM$33JE&3XWE=Oi(UmFW+6U=mtdqVJ@jF4%z;@mhg zHaX?TBzFR_t@W)dS3Y&iI>e_1hA_*Vfn9!~;Y|+e-IGsOF9d4~tDKZ&;DOW}ir%pJ zb7a;kvFwdsZ|>$G$fWUufsT5PmERiCc08*=Ui+Nozs2i&J4v*SD%`7pVlp>Y1G{3e zh1{C;(qAQ)UZtuxJ%#%ZqSPctS$0>{~Wum&^r&3HDM zt?T{;)dr^pxrQj&fQ*CXVD%X2Pu9I(#ojzN(3_;6%?`}xpg>Rpr`+*hJ6-tBZEs1v zj`HF*o_nqFrVp9&j#!*+3Uk`AsZ~j6&dfF*rz=ug9+7W(Z{mCNtxW+|ol55zUB@^e z4!HEKZAQma@imT{XQxjjnw_!>Hbh(}ke_o6xRZgL@G)K&qWF_lw2^G2m`4mJdXyhJ z=Lh9IYqgKZ(RhCJ9U>Qze8<-wXy3< z;GyC_i56BKA-OjCbmCcMxVI~{B#apeY~yI)pQlQPQt=0ZG@W;Dj+X`tbTGjre5A6u4IF&uc2_6m z#~!uleks%SzXQ!anH9kTb+^2hGaF%}Rlp#&11|iGb>g$vc3nwBohYTubl(nqIv}xo zyGxZz`=nL4l5!Q@iTR?5NARyXu3N@>jm#Gpntbv&OL<81%MuwEAOoI&j(sbQx%iLb zOI=zE+Z`?#T_7%5IjWs-la9xuPJ7V6nSDmSIm%r2;+bk@Tt|m zBRW`j?YZV)YL}2j5xbH>Bus)xo<64;$K(8~nUloVn!%DWA!(E@$s{=-kCz$t7{yhF z+AH>G?V4yT`YOzL0FPYoGgq`v3w@y`NR{NBbCDP)9rAs#-imb9?2l#1a^0Jj`kA-V z;jo?*68y_8$ppwwNf-w>^sXmf4Hcco+o5guJ4_^~Xthm z8yj^e%{Xo9IRn?B{42<{xDB<~gH)OP`H>m})iB?CInFDh6m>bLh)ZqHRQOW5eTJDL zYWBdT(z-)4sKUQvxb(po&uaAl00w+4vG|RBsU_{s$Sk8)3v7l)mz;d0oNn!pO3TrF z8-1^M0v#7k+cnA-07Q8S%jKJ=IsAULMhP{KhnBKgTiwm4T}EHd5fV!=1Sr}MJcEYE z8LjzTR>zk*@}D=dm85&Ur^43wX>$gvBnb_)>*Pfn$PC~x`G`FOeic(xgW;r?li!O8 z;hx$bl`cm3<&+K>ggpG;LF-;mqWHtdcM6s|o&DUYDhVeSDdqr}?Yt7B2ZBF3lg_>I z9<4r-uMMPe$RihwPnV3Hr!C#OW4%(Ax7gvULZz=acikOtgW|sNkJ_}&Eh4tC@~#d2 z<3``R87CQFLhTp|7av;pty4?zwSly>)pa|aQbTM`o{$EbNmwfFk;w-N!B5NIn&369 zRviz*@%Up_)SYLF(bhREN0S_c-iKGsjM*z30Kd@Q3_C@a&rZ0E^hiHiIP6J)}~T zxJ0{^h#(Lg4nLh+z4)08uZJdw!#1{-*06&lk*tbxtIilX&hDA+de@VJjw+llj%m*C zWujdVPy1d@9>)xyt3G1*iSTb&@a?tL#n$m~&zo4|Wq8|eH=V%x9tCl?-Waj)#5NDE z>G0c6DkRHrCKCw|QdV7qIdgeS6YXE1pfClpCciMl11CD-`Qj@)pUkuZQ+qvyi_>)7_ zW4L`!PgJ~rxg>lk_1wO-o2N;2sOgtlTu>~KW!*}VxPUr-L#1;5FS=bac`aT%%$Zi( z^Bv&h9C3=}tUOBA#9N{hCJQpAcXZ~tr3BI2&tsdLz+M)lPY*r)Lz_vzGGbQS*b)qk4ndvHH5c=S4iiq&&}+d^H`6sXeXT!@&C)(F<)x+6g0` zGwJJH7lh`rmgTH(?jP*(mBG$VN6ZIvTV6NtVlCv?x*fcar^v=cI}YUC)k(*0)ena3 zEZ47a2R9GpiY{bbB?%p9RjDWo6-uhiNY) zZsWgE?|yzyMy=7yA9^bhZcJ9lm#^5uIoE&4lZ+uXS^TYSk%V(%TsoBjt!aSGUtYXOypmI=xaBH#^ zl7{D5?`D zzRajqRnOA}=Z z!ig-KgUEn3PE|^71EH@kwAUt@^)BRq#Tq8SqCKE>!vJyCwxzSR)Hh#ibMLc|t4tzx z5&^IteUzLZr%IZ26ke#g(_4;f%k5?DHSuW#Gg_i5s-g0C$Bv*LN$xAsyg%a)5>KOQ zGuxy^*u3&#TL8!R*Mcxl7|-FF@@-#G(zH9drr$>TE3w(1VDHMu)W0uLM>K^U(p)3rSpQ?s&z^Yg3Q^$ zZa!m^lheLFknkslZY{h&dwZzs&kO3X82;0613;3Mz$H&rBjqQpa#yb76x@ueK~YNA zJVV1?7SQeG)E7}}o2gB_v)VvNjfvo*;fDo>Qh2OX@t(EeT~a%pR?a(XsP;X)Z2;!p zK*;zi%Bn*2`A&V0Uem>17S%P4GT+3SY=-7o%SCpuU^GPz0gMBZn9gu>S(<;ts}B)r zPpRuS%MIZ2))-Zck_6fg=2kfheMdqLdsN0(e8+VeL95l(9@pTX6=>SjKiaxZpC!{O ztPKm?Byme3uqP?y<+mZ)0mfUL*Uldlrqr&yb+2Au!#rMm?7myYxTHja6ld-g0|1Kp zBjH!V?ITY~8tuN-Gx@Q7ok%L*DcHaxXFIWupI=QmJ{!KI_E%ce)9Ck6Na7K2ir_+- z0mx$A9dJ~fbLeZPRk_hPd|n?7SiCz@zWmug1jTfUJcdk zH96q9(*zUP%43mW42dK_XK-f71bcCVSt?SuJ+$t9Hea1mt1e9wXFK88Z9m}})~;@B zqMkq@SY(n?j~3@4nl7IBUy&vJ<6!@n=II+CCiV1fOkxtQpCJ0v;{^{%MRP?=C z%S|#`UfUV%Cq`6RWGZ5I##l0ra7Rvty*|gmS`%7Df2QhjnXh4QDhVBA1Y~5lbOE@{ zPKx~79oV_kQEF=UHT*r`$u6UpUyk?vG24C2E=+lfY>6`RH_ej6oaEMoI(LR_JVR-y z+S|`8-~lHHdYoTg1;XfLtxS{zCx=lHVy+E4U7W z9csUgyho;JTE~;&xFwDiC|W7l?%}s%$b$D{a!PlBK$SC8dg^jn%~yCcQSD8)3VbBopVh&)f?m^BS*8%r2xZ!Xx*8AHd( zQdL{#W1It#&lU6pR@Z(X(H7p?8*?4FF+?K5k|sE8f%9jOGwF)+*Z%;7V_wwb)4Vk* z-`Uw)?}}+1PT5tm6xlxf(#xt>ZHUT6K{$>G~MEOZH8GF&l|O!1R~ivv%??6P4DC5|_NsebqiD_@rs?HPwt(_OYhS`Jqx_AI!N`CASWz8%M2pKBe)$ zRD`X%N#`k;PlNykah@_k&%Ydjf^l4~v*Ygp3$zu2dy7gqY@ z?;Bo4`?#Yqg!yuIf21u2B1qH>$s^}(Msd`W zn(<4WNiS}ro;X$sW7-6W3}M1?oCAa`I_=}XT-Uw$LgT?v>o(f$p0G4Ki%5L+ibQ!| z?F-R2x5~htyPFstImH$6ZgIU`j_6VLKf~Pge-?N{!2Siek4o{o$njrTkS31YG}iMK zAZ_yG3dLM^Jdet`dmn~ccDuFoJwR&Kq5(OHVm9+gsey>Zm@N3u%B1w*99DOTrO^CQ zGsWV66}A4Ub2jB=k8Du`-PyU|e+d06gdQc=JQ=H8XkHh&it-a8#T&#~nnmD-9E^S# zBazavrB;3$cU>rQM5Vf$8CyRiApsmicpoQ_61RU5w(`0+e76ndSljg8dE zO|;h=jFQEZxNVh;e=gnzI@V8wlUng~$qQ;R!K>)|%uo_I&$zE8(>yDG zbbqt-*hSE~apV&0BZ6ehF-$99?Ie&pb6&^sXW{+so1$B4E2&#uUQc%vdWFZIx@G;? z1WK++`I&Q(-1HUBcz)|l@S|Mmws$XkGP+2Q2;52P<|y3eLIU;RFTWMnN^LK6@|VM* z)LLp$&!$}2>#$s0O>Jy!vl}Ou6~Z5rX90^5oaB4wk}H7z!qD`2EdbR(D!*^qEoytD zkR*~#IW~y~ckLZX#(Usrr!|kN_=4Y4@fp7Ga?7&dgFLctOcn$d0Fn!2@qkTM@fU#p zB0h(wYf;N|@Li*9iQj871|#H%v17pbxZ@+SqP{DYT|on*ZyPkiMpS;dAeJL1CjfP*G;JQ;7i_BDbbtY$l=6G}*MrSEj_1)l z6&f*7Tch0kIjVdxgTg5fh`cclp>Xm%5Y6W_jHIZXW_KIm|jK;I7F)GWK z8CG0!I&?Mm$AIqq75@MTeWcoD^iybhUZwq?_RE(x*BeR5VCof1Z^j7Z%hm2C0r*1Y##Hu^Q& z*)Eo{O=U4gC9|0$Ah0BL2iW)PU!#60@R!2-jZ(wK)9YGhgQ!CglH^(67}j}kentfq z95KTdJmhyA*UdgC@jip%?-507;w90R8;5IHKe5y87mnkI+E<8Uud0xH6Wc2E?W9fc zSeGj~tu3kL9vJbCgAR!`o|~r4qg~zJ$8|mOP3K7)M8%O(J*on$9mD1aBd==uoxFQx z;m-&U5b8cOmsGTSMvP)J6svGpl1dY{MdbXg7;f1k74r^_@XuQDKB=wSU937Kr-zm9 zE~bT@=G=;Kc0L>C!~`pAvjWHoE$rno?ap>09j1(50{12m|JIQS+Q} z^LEBDUOTC#sC5bLZ|&09%%X7(t47M1Tnq(b21xs)?iKWp#Xo|YE}LZ9#+l+ctz!~9 z#iUBVJ+2Tl=V>aP0O`rc(!O4`GikR{*(`4NuJ{hwR|mEM@0#YXR!&Vb)5~bm#|?%2(3`9qLhpfB#)K!&Upt1(w(8feE_-C zb$KKZ!5hJaQ6sdaIE{fIs9~N@z5&K7&~1Dzq8|&}Yw}uO+S<(Fe#;y0j#=a^%ZD3y zDxmEONIgj7JacELs;C?$pW(*6VW!?iCA71sY%*Y!ZjLzV?ka%r#+jmPQCnGRk?I9e z+Ub>ctRyi|q>>4I43UfveUW(&P^W!pGPal}GN1wVfa0vAsaar0e%G_K@ z1=}k5o=}_wC8S=hAwSY`E6ulCjxd*+C>?dwfqADt55gb`#G$^ZDkz zTfw*1o*2+>BS_@bF0SHfB0)Q%73d>nQ?-hbk@tT}^1FBwejd&W4*Zb>t-xzjvXbb?#oI{9@u zLLD%ck*&t?Nkj#=e7Gk75&`tCj@!py6ucX+S?DWe_Do&H4%uT>X#|gzUoq5(!-gE3 zcF#^YYtivDLDo$EBaUlCRB2z!aVFHj2PIAi2iW4h*Wu@f^zRYqviQ2!#AtQMp^;YB z;pAk7)m4ML2Lu*51#sMbdV4Psv|xC?%HH&~My8tH0r9_zu9L<(1^$I~3q@~auu8L) z2Y&S=4Y_7uLE3tK?_OiadOwJCxmQD#R%*=sf^)(3IQN=ILGF{#}VTQ{6}$TtKHg(?bQ94jO>;T-AgmG z2{YLKT$=Q3;~QM^VTyI?^4iGid>?UP^OStH*ge(dM2PXKV; zGhS=)BJahzwzAr+_VVf)R))E|3P@PXKG7gORT;2DD8V(+d^s047Pf6`aUIN2S{sY# zoU@ZCk-!^3RU2504DRHRdBF958+eme@r8uCp03umwzn1s$beeLt2MMye(*e~!MxQ8 z@+n-mOy>rQjkJ1HY4YlI{{Rg9N3QCA68_rNzS^2?vMb))UCbZKvR32v zl|}|K3GO@Mp1huhRVZ^ydtBsoZCd(oiQ1LswyR?sT+QaCkyc+XcsMGBizjSgXM@(g zE5ed#-YD@srjexE2q0E@-djXA^M{2?BRcIa+~AxX9P`K+=EubS3tzj6(^}D*z?5rw z=7KdcZD6EG9D>2n4loxWk(?Y=*zY_^;0;^O@OhJ5(`|y>rR0!pE9ULWlZ+A$Gm+l} zSDzSb%$|p$z13!YbKqZvdVS}LZhS?kYVzIrfo)nHQccqNS=_9rVCOy` z@&5ou)4X5e`|E!Q3pg+BZT85P@jbHcA1W+Sr!wd|4nSomqJXprl^DZjSU z?_h}L#P1T4i@RW5yK?95vmLoTdeev9EdoA$c9m1NmH%+e!10B~5dGUaebQPU^i z)4noz6UH<6Sa`<5IVYDynh7qiZElnxigD$zSk7|C<;wtg#{^flc(38rzs0W(Tk6^e zlXESl<{nrTBAVV}e74^FlOM~I?n$pEli}9A;rG!q~OM`YfD$s87P^y9sK?kllt{(pY;M585?(*kV zxG-eiC5y=t&2+AgsDd?JjL6KS79?%S;k$ER0Xz|`e{5P@*r2A#zl8$>P4d@&5pVekDcW zeL`Jw_TJ;iD=B+@cFZlGm2C4P3uHv+%T9SCJdP{myN`!{GteN_bt7qX_j8$Hyw#+U zBeezB5)nH}gqI`^21sMaW5)=|M2U^t z-|smbj)ZrEL-D7EykFuo@XK4$4y@{i7rA241Z!dPGVUNM@q%{(PaO?DFA#V~!g5|* zY4O}PfqN>Lwk*(W!gI0#=bnIDe26-kcxr{*IlB%;R zu)r(kKTf%?Hyw^#zRjYj;N>Y@9?jtohkhE+bc+uZ>X%blUs#Kq3GY%xk`xmuMvHij zu$j-!N|Y>qYQ=qb!`=|^H2x8`)aBPTTZ@4^k%#zHlg=H%tQH-2!$?807 zP1LP4iyOFYXTGVonDnbA!cahOHSxSNaoE1vtyzFm>BaLr(Ek)MZ}W0bPx z#^9%EVnGM4Pt@0;cpp@>@oa11pA=dM?kpLuW4bMN|B%O&r$JNWNs ziT=tYJLTHV6X5)$9y|8VYtW+c=ZCGd8`$EI$$Knd+sLfxGPz-Za-~kg$>d~ot}J#I zRXz{+W4@D7TAsV&EnmRC9s5k54&`}gwrG}XySU?b6XDE>98M3&2?K$jl;*e_9~bx& z#n)EWo;K0EnUs+}p=BwF=FdlH+=a+)aHU2#z~GE83iwA}_=Tlvn#PdASJUDXT}N`v zNsO`i(qqQrLE(Ttg!btC5#V_>+p(ujrRpsSx0Xk`+Zc*HfM+ke2XCRlHL{@KTxvn5 zuBhhZkNyy?aW1?yst1s=v}i$i-ZpPm!60LyT-Ux>d|mNH)}tPur^5u6=He(NGHvtP zHozprr#@dkq!m2loNa0U00(?ArRfJ#gH$?xuMNtqP|U05+(c28oia>#EJo1GyMW`I zS0UohgdQQ5-S4#7mhSS|=UE_&_ic3yEPr?u5`?0#1S>JYCy|p{e`m&1jajW%P=+!R zPBA;rjgyOGXQ^6VB+X!~+bpBlws(^_X%a%jw&D>;;GkeYJ#+Hh-x76bZbbh8Xnnzs zRH(}q>OmFmo*P{~d@rKvT7`|>qnn1Xx)P__BD`){m@6N+xCb3~XR{Gm_df+Z52@ej z_m{eq8c@_*5Zl9YZds%mW4;icWFfJ_ka^>}=e4&DNQ;VAXS{qZ*ELOB!}^q3E~NIB zSB6xv`(rx!CBO=kNP&YZ0g_R70&*}3$9dwv2Wq+^=^Ey{s@Q55);erkbl9hDu}0vm zt>*b`CEp%CW7n1708bC#!SMsbntXl^yM?2Udy^ftt?iRrD=Z}8{{VWTO{E5MKxI+e z6`=*br6e98@VARKWQywR?NS1XDT>R;0oo)FxTtkfqXUm#K^|PO({gIs67ah_mvvu< zUkx>Fc1!;NDJ^a;A&%xNsTG!6X`S|AqL9J48*-H-k&beB70lS_@%Tqu)O8JONs@HD zF~@gv1Z|lRe2!EGF>PSGTVOor(>3MZBlx4NcuvmGMY5mlGucn(O?0Z)a(QGFSec!f zqEhImmK`zy!sAa${h=YcMAUC=<4syCJ*I;%atxroy-B_9E?}1_?O~^hl@NXpj}&7Zd(bqNoBp_5zZL> z$6R@4L7Wkc^yG0-={_COWoRz^xo!OC`%ltA7%sZ*c;9~~7*TuG1 zZLZy2M|&=vHjgB66xIUE7NYU90%DRijdySeM-PFVw;cT;Y=7Y$@RXh)(x~7BQ;f)Gwi(e@g5hx|Qe9jM0N$N4ic=n^Q?-DyLa`G_y#_PLrwcZ`Xobm&Z z3u7mt#&9_D%OWAXON*QJD;pNt=gcZwt~(NO&w5W0c&^q|5J7fi+CsCh%1RuP0^|DE zT9x!U`5D#R-!tkq);5hC0Mb6uC>t6{7`VX6C3_K%TFuQTVx<<7k>`4ch3x#FuxWSk-(I*61QDiKDFl|> zLBL*foPAG!D@|Kl(Jy|}8zS9BBzS28;dT(%BcWW3{+0FatMFsP!_L2l#VL1f7zmQu zYzrGn{;g+`bF{eQkO4mU72sbH^leK^mK_!k4q2oqK5wfQsAn9Km(TA26l{A$)ab?(D9{~D{V<7 z)hAo4Uo6IkP{uGvL4`Z8GyeeA#aHnUhczuG;cmBms@myRRFW~3#sR?e#eD(c+YboG zpveb_#*rbLYKcHEa4L)@dex0jPq)?d*kSm2Wj)odmm0-9^2VWyoRNk5 zuG}7g;CpjaxmcZ9DO$(M*9mVev{R&Rmkh+Y$k~p7j`=*3+tU?RJIETsm2KRu6xAZ1d<&-IobwGhAdgt zgDU}m2s^n`&Iscb4ohQIJLqu@40?>orRW5^g6e}f%IAQ&KQTQ(>T5lGGvWk^E+(*% zt=dh3K))$(OxK|JC*d}|u3W_;N-gCqOmG%>=WqshA=t~)o=D=o=I6s+F47)7Am8b_ zt-8Y#Tt<)k>rzyo-kg}h+J0;{NatvxGmY$-QmEF)%C?$?wx4R}gq%nLjeb%_PI7&} z8utws#c!hO-`O^Ls_J%<#}w@>gfcTQR`SN+8H)66ypKw&tb9JTyt=xE_UB51;@y)U z>1ht}CQ9vP+>MSi^C<_dRMkEc+{a-Y5bH5qT}0}MZEJF~tE`ck6ZloEFhq=TNGjJ@m6N5C%;-DnzVZmi*UdJ4%<5H&Hh5IQlc<#IrW3FoV5%_CS zi7g?ph0IAN7FJnE`Iib5=LF{`c6lcpV|-@TwCh{lC&F5txwl#F86Hso03t)c9e~L0 ze>(Incf)#(nEul6o||ZFrHUs*J;KF*Yav{fb$Jn-24k}dK=j?5{KMn@E5v>-*6l2= zZEl+4%GA7{yJlj{M)vi_a4WJkA!{aLpxmy{deZgV^@IB>OK7LjboiDKw}wS$zz2yo z?%e!iBLj-{9}PCA;)b5u(%){S2L)#><_Lsr-9NeqM#nr?hQaVx;>11+)4X?ety#^d z+6ZH{wrLnUtFQ`~00(Wy4U>_NYWlz7K(+8tJ|on1IIOivV`wLr4RVr4B7o7fWH<_a z0_6AU#tFr4$g5Q)?(Teb<2?_>8b6FC(RF=(8N}O66G+l|KuA2rjY}?2Wc2&Ij(Mtc z{7ms>r-ZINHWmVktrU|%Cg~a{VsJ-b$0HUNrIkoPu?HuDUO zig!mF5K1us0J(15fx!IzGU~c@`$GvV%IZq7B_t|x0reG9T>7H0v%GH3(kp#R>Lrcg zUpiR>jv1IEf^rx>-lLJQV?ArEifi3A%3Ire?8Mw6+(z#ta-dR6Y#UC{y+V_N&#h

GTzMe;WcE@=pGQ)G!+5^eb7LsYQNYKx49j;m7ei`I~LCT&1InFs1 z?f(E0ylwEa!JZ4e(q#VtOS-%vMD~z60Xu>ji*3Sy0m^SyJ%Jq7R-9#M>W+Bw?0#_S zvgvmkj_6^MB$3d`9?~|2JcR`Meul5=y3~3l(*FQw0X3=5mK!X)G7boA^x%FK^d_0{ zgHKCMK09j|?%=T^IW8muNiqKbT;=&xF&yGfeXAqInzzG$iZ>Hj==w}{T9k^!-hG}# zSlb|O{{TiZ0=Yd|I34SCQT?@{(4DkLnCTx7EbnikO?Gz{v4TP@2_am60P_ne2k1Gj zvggOM==Tz88cv60BvPi>TgXV~gvh)TuwXX?atJ?KOK;ilUbT_hS51(W-69_`et)~j zIXOKJD>moAzAMl)o1YQt4AN-A;q7hjU<)!Ei1z;Nz~u=IfLILnq5CHEH}=&M)bwwK z9wWQ)Pl#pHbh>2c~>#*~Kg?@*DY zab^dW;eaGYjUZL$JRY8%tL4uRcpFo^NcB5k5G|`+M6E0_Lemkuw+t6{N7Qw%O4f8= zi1F!CUTJJiN5dFQuX{{Uq<7z}Z>0mv)$ z;=O0VUj^dvewU}g@efwiqr16+SsLoeqcMe2%!ukrF=k$b@-u=ss%bs9!F!wC1HwAf z-dai(p4MxKq**d>cMJ`!ka7te4l~xBYV_oqOH&#!l6JY|{{RsFCH!L7t>Q=0ZZ!K# zsDm+tITG+ol^}FINc8;c#B_fjY8qUjH+c#-DwTHzGRHX_@sre7)G_$)Pa1?8#k{F& zac#b6?O~Clh)DaCu?Xq3^ZY-D73Wa+r^C}*-f23OoSKaC&RE4XF}1slf><}+QgVJ} z>5t2j6%tlaJqXd1k380O`=1k-9#l!@GB1@PL%Qk7KXerUzH`%)UZLT?kDu_0_-T9t zaiEKt>?V_Oy&FOXB(k~%4V66!ImZ?BC7ze8YF-Z0t?Ub1SWR;s-k8u?#99+?^74+# z%DkNIBrrS^lUx<}ODNRE8Dgnoo}Y9_#o20BY8yT@O``fA#uW>{oqly$f@VtfX*EkjFdN1t%0O9LSJh)7s| z$25C(I0yHvT~vk7DlyN~n${MIv<_*`b60}U)7EX^@aMy+JR_>Xb9xwkotb74lGiy1 z8KP2DbB)A|cQx|1z3`9W@>^ZsTu&C2cOJ}JL2}J(p#~fwkV!0zNY3rsN7Dkk3r~(W zdY#-lP3^o>UFx?6Mw@aK5we4cV_;Wdz&$-NTZ`~3LewoSFT78wU1^g~hL+skLcj() zi2ndp#&U6%;;BtXMqMg0hOM73LGa^QySloY!rFEIp{GE~A-qVuz(a61d0Vh^kSnje z@F&F|2Gg3h#y>@>E>30$<(BZ>N5LI&5G(7MsNvIPq7t` zJ>I8ZJ@iKvqv$u*T2_IkctX@$MRSIqQq&_87`HA{bZA2j+1<$JuS|;0)U3Qq;H_C> z)fUF$+U9-2TN{F0hWU505)aHrBY~ck#SajCS=6;3?M(|uN3*#^hU5D^S{R$j`ABA! zRzAGr1P%sk55^OCuGR@|bvrc{vncZ9h@>(j#K1Y-86@L4-HpD3t!E_DHHyCHwO{z2 z_IMJ+>qo=zTe%b7+6ZM6N`7FbAm~9Of=SLf_BcA1#ala<8hxa?j+D%AYcOLGvTdv+<0Xg6#PR;`r6^OoxiuQtg6`{6hf|8{OV^uFnNm-(O8EOkN>^wM z#{e?}fzNE$r}zs;_@kz3kUh?=HT|hE%W(#wa2N>w^KJQGu94Zw|+Gd#79h6n6IMc8v?Pm>_wN9GgcY__19+ z)1o;l)8rqq@jcWC+qA z0;xSo=N)}&`KmX{&1KE;bUEEG;NQcIX43OtywUY7DU5_$;XH`YU;!ZWLHSE|999Q_ zybI!pyl1IeX<}=ua1e=|cE<6x04(gKaxvE*O8OQr5_peQzh4pf-&nNLba-SB2Zvd0 zjG#u_l*{wV#DW3G-ad=cygTDB#SafpYcyUHl_X^*TdSLPcAcLbE?IUeuNWipt$mc1 z@Wsctg;{;+X*Kf4Scb8C)ODo?S>i3uO%?R>sT41Xd;y?|w zK6t^$%kC@HFSPFm>-rtGnXMqvpHH|OWYbJ$c_L6skDoF*Zb@UnIO$wc%p)0cCuVg^ zFO`&~v9Iv^!hZ~Wb2a7GvMjWFAGojP19c|S18(zyIVXZc9y5+P9QVX8f!-PL{i13f z7fAJ6X>L_lWT(uEGI70?3KuNnG5CIAS)l; z$QWagqoCs_t#dlogA!SdLLA8ei*oEaC9*-t9lxD@Y4H=_AAs!d%zAFF+9UykNb&(K zqVCQ%xg#e&(qQxV=fZ`_|vx0H>@Ox&tp8K0otr@R$;xyk7 zURm7<>}HW9LxHrMp4k5Y>sQhr3vIP;6l!Bcu$SzY_Y0W!NRh>r%M#mx8T1{^e9s1} zX&Ff*(;${qBQ8sT*!5Lq2R}}0)%-W(8@n5kdpDO9mn1uRN*7@5fSB9#tzztDh)u<) zpJwQP26f0aCXQ(ycf-7lfr_t|Gb0u_<2(-D{i^lNteQxDJp`9cG+?U6xjE0?$6yDq zUuxsDUma?i&Ac{?r~?d&i6c1N>@%IX#~gL(TYB~4?zNI8XxawD2#}EZIU$HAIPK3B zylP)_^G;PijhcIUHKl^?wj}Usaym%!3ieq12K=!Ri1Uap_*W@Wx1OG>B}j9#@=~ zY|hzcT=9T;01Q_#q(!aErNs9V0E`1|46di1fQ*7a8g8GdY5HN7?W6+g66M5emdNTc z)Skcr$)^ghsS-DSELkRl>NfLPU0Ici z(%mElS&MU#jxpEJ_piHbykDbgfwbH2l*ol2&Wx;QaOg?k=cYNYk^U@v2GeXVjpB&Z+e7v{mNk7ene<^!j7N-bL(7oy%wQo;`@Di z$j2-ei?Oug8)R~_fx94cj=g%^+T^|r?8d}dBN>v&-gSvr?FF<(5bH{32+`fgn zT*+L>@#did=@$}7EUhe2=P~DK-;ABuz~iSi!)U%C*6jQ@ZuXG8kzBwRm1zn9#9$If z;(OP3;m;K5e-SS4bgTU~TXSr{v_)7Ay)wtAq3vGPVc{(nDBx3X79)>na5B-M>>y|>8@9~^Ncz~`u?$Fcdo@ZlLNCxnPmWs5JG{HNdxk)Oz}sE?iNcpY;C6^ z1j2!Xw~nNo^cC#uWuj<_1)4KWB!nukOsQfE6W@=it{25xTHW8W>Io#v2-SHH2hx|p&$v?a^u zcHM<>$X{$zJVmKp!1ngG(TOEe!XGHJ$oqQ*QP^ajc&(2QY1)d(9;170vQ{T*OY<<# zOb&2!Lvp@`Y3ZqY*Td0h*GX@u0VBp0*pfcz1B1^8^5VJgh!(mx8in7QZrVRA#-&|Z z27XhKki6%L^?MyH;+^KZI~l+(WIageI^wz!;LR%X)hE`kkDHdlL{uwo?a=2GuhEkk zT30?3@DIV8PZVp*cc|FO4wDA?A&E2QPb*^uiO&EIojD(m&=y|+{vGId=`N#db9El! zD@M~WO~mxV<2bKm)Kg6Gt)G``F%Ke;yGRVb_sAV<%=K>>-`H8jET|`q@rHNC0qRLT zfc$HCNyTn!UmH?#(b)Pj!d(Ny+GvYMiYr(Zeps{e?#2MgBo5W*9xIaiPx%5xYA;>( znCB`{_XEG?K*R&?2Tp6n7 zc~eN)mQ~4iBxfX($3Nj+G}@QEaLG%l@}{-mD-Z0u$gfrlX>SxWi&Ss&SW zfZ!IGvWM*#0m&;KGMPMd=m4&W$s-w7uN@-YkAu8*;4LZ(hLL0YJVYvS^5nL2k<*&_ z{`&c2 z$!j8|$`mJptU1Pioqd_A_%dxK@*8PnSnkvu2OyEVraubu?-Tqp*0l?$L^#_lpfrv0 zsNLML=sB(xfvX+0KAC59XB3;U7I!NDRma-e!-b@e@K)BYd$J6+SRUsAIu5+LaKLR~#b1A$$ChddKL zmmE^fEDU7A12EBib^~%yHA#lZw5mcxOhjm8F8xJy%wmFD*>% zh~h;#Avwn8ZsZOtkiEUsJPms{hV;EIIPNXb7rvZ@n29pKERT2Az$B4KFznB3~j*As3+-L{cCjD#_+dX@YwSY9ccbAlHwhkEbT3%%gJrIggoav zSMMD1ai3cAZ7;^YI`MtYuZ7^cEjQW#jmtD_*yD3KI0GGP?CY&s3y%$@wASixA(~Mt zounXzO0y~DNpeA62*9s9(>yQmdq?p7?};yx_U?G^)u3@Vmm`2TFv4vBZXhuSfCoI+ zEn1O!zNd8w$wJL-vD9f6`qzVOXVP^67DPpD?&6!ziaCfp7a0YCVZ(na&+zWKtv%b= zO{zh?aN87yb0c7Rg}QAgqV_fOUa|2fLzySE(PkLTHL0=z9K`;Kzi=L2?gT#l3C zEn`O?+Zt`uhUJIwk&sSuanyTPJS(_68&3eLCoZh|OJDeluU=0!m3cg-;1Hu}z$YYd zI`dxr;6DLt_c|HW^@-*eHwvCWmD!Rdagsulj+Ob{>IIK~OiFFUyjGaT9w9?ZEq)(KvZCUZ#-j@ z&rWOX1o4-{ABk6X`fj5fnpD#b`*$kFB~lm#lNcm+=sD?{<@K)tcpp)_xYI0e7VBHn zk>_+F)66CEgs}m5Mgt)8jMfz?#(wmAnqaYVq?Ib^=zPCAUFsThN2t7xQ);9^K-`W9 zBpi19YR`l|7@b#r#o9>?wZ2*8VYhI>AwkF9#eMzYe}WzxYY27E6y6O&=VAr5h^R;- zT;Vs4SdUPDI_`XZq39M~9eq1VwTtXFz_5-Wk$o|o<+Im})zP4>c`;)%EESK@UBQc8(v?{;=2hhL<$&MB7*V`pnSuCd!I^P%|?Dk z@y2t}ymvZJ0Q^4DwA&bCx<$XcG33oK5&#Lv3a5n?J=M0k;a?Ql{{UvWj@j=M?TZ?! z$K*fDhZx2Va0#zx@bAU{0E1f8cNg~F2)c^;*>Lc~A^SQrbS?p1qd)B8xtX>900C~r|nL$=)y6;!I~K6G#c;g+g3Y5xG>6-ij%T%FMd z#wC@oHu1p8#(Gyh;u}q0!xpmX1@7)lQaPI4-0Vjf4CQ(go-!-yj}Lrd@ZW*-OU)O; zwj%KEW{T-!^CsHNe6VI>c~OkO+j5>~)KDlO>w?g#3 znjSWDv&y!g4xxz(3Cl71eQVCNTWK$?W0zFZ;W~MN);VKk+;#$0yuP5h;2t@z7x;^= zw}~{ZA4(9<7NMoZEu*}xlP$V2XjK0I*EA(^PDlgNl^tOl$)0$b27i(8SF95O=DtWgd@hr=0a5t zJD*PV(a)!NirU#^k_qF4lw%-FkkNtx9qkj~5SYCK4>e}+nZOacOq>(@_xD3QU4cu^RNL618+~dqCPnPRr zjq#Me1!!&{&{*F+(f#tKVTl=!ILO?@f$d*7d_c0%AAP(0+3)XO-J*DlOp8Qo zk2U1fZlpsDazB^@5HNGVQP;j}WmVeD^Xlc&r8hXUtk-qfBiAF)XLnfb;z0PuPtAg( zBz&Ps;Ab`DJ}lLI{X$(T8}0U>ZiSUhVaXlA{vpWcIPG5P;lBag9}%v-;+f*Of;({} zL3t84-oeg#=Ky!7cX_z8t^t#MXWmk+fO0HV_Dcxk&N= z<2m4-a5(3sb=s%HuM+4mO=W!X-Q3%)vpkWez{zux0UenK-s{IT@=uBWAhx@!t<)CK z+M$_b4{QkX%APj1at(cf;7xbL-Z+NZT}x4BNTWci%kt(m3%!_q<|+Un=A7#DEph0ws;I7&kfj zMshxtp?l&F>S zphdXt1O>wp#(L(s(mN>oN|DN+N&^knLr+1dJ@Bvj{ddIXj+7Jcjo4Km7YgnzzqC=;{bu_>CJ3tzYnE-RkZk{ zy1Y2~l}S;LTz56v{{UlnZ$PzVlH`k+-GPH{N;o+C$EQ8Gsf9+gk?K@wtHs>mHMID7 zVQ&=w0BHL?eyq{p~g8C2f@3P z)qFLr=y%)v>oYX)Hh$qe@;T$2dscR*bK@k8+d(^RBqV-Y-~zn;(~M`6~SqL+U;R+ePABuBm*V6X!hqg1m~eO z*1SSHVJ@d}I^2~}Czv|89S5~)!>8%XVy&lL$Zq97JUH5Q zVQ~y6&XI;fu=zN>M7I%<&&uZMSzkhrY+*f_#PX=9RQbf>P#plazCXrRQ zs)i@zC$kJ!As>fst^n0;EnhC5D}%!U)X=Cq=pNGNaV%Ch_USF1%Y=-4ku;>dYDYk< z2rJu+R~@6zZ4Rd-8qBhJa|Z@BL9{U7XWJbA07}l6Pu8J`+(U@M{GgUNKA0d7ed@W? z6(oBNW&pQJ05U|toHs+Bhw-VDB(-9U*2wPT@Rpr>G#esGpn$QL<`J_XIT$>3UfIoc z*0TQK{{R*+2t7Eh z9UsP5o*tgjFA*-SZQnQ}=KvnfjCbQSp(t%FifO%%|IqkGPllSMr|)7h>M_JXk}Qv# zz5yA}<%;BdOQ%O=cL|S4lS`jz*&CI0e%^`*{4-xe-|JQyNR~Tfis~YAvn-5;Ga{0xD0ePtDz2tUs#syXn2=~tf$rPq_NcOVt0rm zEz`Qe9k?x>(haS>PXibqt$KvFI)DSh9#A8{^IcYi$IUp|KjAE)7 zdT&`Abun?0yp@kR(R>-MY5GmVYj?-&(_E}+1N@oJcXYv47(8dSRJ_-8j|1xV{u|Zp zO#7LohV{sm5(!rXZUlm)kC+a78j-wHu6S==m&7`Ra^KqA#f#fr`JDY79U14Hdrr457#KsBg800oSro016(JuTyslcDv zPiGy=sGd;e*JgShya8WFY0nUX>I0)#h~4pREE7o6MgRoy%DLczOM7D@HO)&1>PqiJ zd`Bc!hE1P?wEqAE_=@TsS5>*yEBo7-bh{X0)J$QgTPc}faNSs>tW;+nyjPp* z*Zwbtd%Z)*wz;*0e*V=|Nj0=YmCG3MhF-ZR2EB=;2wKMt2>bU;`D<0Ow1`J(ENu|d4quyZ4GfJx)@uRZZD zlcmq79ZyKGxsOM?pKNnXtNzJmo zVF|xgkLBE4mR2KjqS2Z(hNnmqSh)o0iIOKYX+(JkJeZiYbv zxNCg!g_yS7?il3y*O4^3K8xaaO@B|7Yz(jdk7~i*Jm(uuNNuMaXYsFH@NS81sB4L4 z*S6^pZ&MMr2YC(Ng{cX&joT5!G8q0;2iP~KU%GK z;{9gw-)-;jOhvc4uPYEEs9vBG-2H3Dcxb{ryt?0WdB&vbDJgrshTdJ->DnpM7Iu5d zrI1|i9%O1GVdeQv{?-mi;~3|fcZa++Z?9cj>GlkQ{^o6~9Lys^q;_^YcW2b|Tut4} zYIl=e*te8Ws)=Sos#Nd@10ZwQ)x8Hx)vuaJF6SY)WJt(I(2fBreQUCmRV8^2P;yQ% z-0wVLqrQWG27#*B!((-5Hrz`T!ep0u%D5`TU=G9FR!o-m+J>hMhNphE_AzWmxV43L z`CxtgD=y~8P)vNl9Ivb9ywJ8_9pOuAWm1<_WyLrd9-C zva!enWcTOv?Qgtc;$3FqJxcv;?C#+aGF@9*#|*3GkClOlCtl~0e+uNF@YK#e(yPEB zw=?a}e1YD*pW)u0p=(;qF?hP}D|>ayy3WfO*au?RUVD4ie^_&pr%mtN>H54Py`@Ea z9&@V2s`!E?)pZ;BZ>8rCEQOfl=f4A*$al0a?0U_D3UOAkh*=F)o(t}>N4u4TFNr-SG5kBaq}ba^hK8;IuMg%Wja<%SD& z#(jl*$BI00beyjEbOgFfw>zDxSS3gSAb5Ni-W< zy*KP>PSRV{LCo)7MXqz|2zaE4wm$w~;PX zsbyrt6C8?HauLbF_0LDI!QyWRc%J9P7nY4Ro*m(sN0x)n1%f%oLnt^3#{`a~R@cLy z192++cdu*rW za>R zS%3>9WDp8~4oAz1&mCTk3^JUolJB8V=Jx3~zubIbq}VJmr<`6%?%t92BE%;Zjc<(~A@SK-_X3*ujnV3hPG`IZp4y2-z>+*>PHj)N%apu}w z7Pc2!fxWfVZU&xFtkpu8_czSZ$WgMPMgiN5F~I=W(taA({ucNq-oeGxv1)hLN+Y$k zc~wDTa$N@H1Ym%ETyxiqaN(=dlILw|R$)Za-;cK4~Y5I`X;+p2l zH8wVu6A0vqWB}wWXMX&0bB~nt>snKx2RF+1IUXvfv0Uljx$~#QNpuZYSJZWF5-C>T zTN{06Nxq5gE~k)T5t#g_y_;&WCmk`G*V8^4UFjN9c!R;$N`dX;A7|5=64Se;@0dG` zDhy;Cu^`|I`lH2qRk~Q*U2Eg}R@(P$GTO}qXk!={L4XG<`t>5dQ1O?7A4JvSm%_*F z7R=%0vyx^qf}vX?NJ-iVUoM1a8JT%7Mt^irDamgYeVGb`3NMI{2O#RjvH#e1YY_0N>`}qh?hZ`H_9k zanbmn!VvhL?%z`JuA^tCY4etbHcPjb<~2pe={(4jaNGvaFhIx|uL;zbPVk-c+h}^% z+j7kbniBS~n3xrC%_4$J4hT@oj{MhyjioA8uWb*c!PTc$kF$)LpO(c>irxXg@Sdp# zr8ca(oA`w?(nQNXOjzBAKmjUvJ;iPKSK_z)BAOk)ho_Iu7S0+Lh1nTN$!+SvmC5Wz zF^|T%N$j=#QdEmiid{;^%0qD9XHPOTXB?8i0hS*8*Et@8ac8T;HN-|wJ7vI&hGj_( zP%+Qi7kTu*k^EaBYO5-68(m}|^ zcH6PVwx)Li6dy%=F9~96~qY8c_Bzr12PPvfzC6Y z^^Hn0tL{nJeaBO&PLw&RtJwMb!ygE|XRO|ZZ9Z7-+_`C_S6g9#Px`_zNx{GwVt4@6 ze;DX`ygn|l@M2v-ZD{JE+WN-e+$fopahUcHOL2x7QR{+h?pWpVM~>G_TafpNZJli3 z(vH}j+Azx_N+fPjADA%4cp|<@_<^O}cnifgH@fDPJI4}`1d;$Gx!uWfyTEJ{#ya{} zwTH_i6s0ZC3a)E8w*_xQu3rV%>RKhYg0uWE7?`KJ=j;# z{tWnWrP-@QV@*ElYb1r>hTN=0Va8aw05KpOeT8jXzE|O%>Of88DS3M(dEs%ugd6a8IE3 zso<$-<+759`h0<&u47TWg6m5;YlL zPj4i%OsgbeVmJgRDp>dA=Dj}aUhsFsOKX1*!58*Ut2~H_ei>zwBO;JklB=HEu)vYf zoB(=NH4lXxH9e%g=^iPqcxT31y1{XvT}NecZ4}LMEK}yrZ!I?>va+kFVaFhxgVP`n z3Dx{DsQgFKVAh7E1+)-JEu4l$*s(~s07&dc6}w;%KRW#fwD4z!{5@*AHSPVpnyR2n zNQ1h;BO)sD!M2bauergmi+(X^9}pfp)YjomHr?lrIBnsL1*e@SFTIIkBq6dJ@y|6i zoM(F%fQpRn&PT)gw}X5s;Tw%M=TMs4RR%D^2)yATL-OYbVHxj`c{!~w3*FjyvPkVN zKGAipE~;i0wx&g~`wXm4kkG#9kfrm2de?}<2Ca4Gc#FigQAW)vk~?Xb$!#sS z%!<31ylAKIbn1B8E84s};yqej3;QQcmcvd)z_YT75fb@Hy^L)+Dp`syWmt}IOAN;$Y-BzZk%824_M4_YbW#c6cp@w!AjU8lN(w#GmoV%zwvt3(@neAG_6JpJxfWHFoyOIDjS6>oF-To zZ1J=om)uvxI`70yf5#p*d1tvRrcEh$tclpH&ZJ1#9Ahj;%NXP#@(v>z5Xg8XYW#^~HAKZhP8(`9`^=H$&g#~<3Iw_Y$TJB!pMXW z;aG4;=lh`7wRp$EmpVU%Zce+dY6j*If$dNgX*u%pgsw5Qh$=ENG0$%s6;`6Cj_6v= zT8Vsg(klS}o5Yjy8)Y3)J*n*I)3r#oF)13u!eQ zyF+trX#}jXo5z9Vbt<7uKP-Fv&`P%KjiWx_CipYq=fs~Ay!u7>g38SnTPs+vK!#Ud zgM6@q^W&!^{VUV_Ip7Z+_zfo0mj2_*bn{X>ZR}h^JjZix>~iWpec+t&f!96pt0zv( z;&j(Hx^Mo_e+)cR@dAA<{6BKKP0yb!bK5xr*zP2=PV4h4kGdCW=sFtm?*;f%$68N_ z?EENgZN{Yp(%MZkhFF?5kCxk%Cv05gV}dhY>#OV9g7`Y~TGA9wG}u8l6GX($p@BOC z9PSB{rFh6At}Ey7h5rB&q456z#GCniR|8sKPb9L!(}`R{2vVrHAg{`ycQ7LzO=mg9 zQ`p{wWc5ta@khbkS6U3#aalp9*_WPc*&JCUkcQyEvYpQ1K_l;OA1OJnE?){wrSW?mI_;wfPK9zCJGaS?vFaI zX;YtA*&mI!&8X^z6(sL22RJFYN2-qKZlFEv{vm z;YA~J%vn%}a#R4B9e)p5@XXI|pzpNP+ENMgCT+lw3aiGUNog5=^8md$2Q@#%doK;y zXxe^(VPR==;v1+0{&4|rB48Cp>0E;*NjMC6!5m_;#lkaJr>jAQlZ353j+f$wtZjT3 zV7K~xrJPEetmTNgQ7p;~s;p#Epb?NHQmu@2uLsk-MSW{)Z2G3Asij9R?xBFX$vY~P zX%Ou=7=5qF$&OAUdaqbtr5a+TJOolWDeP0w@;gALWWi1}PO#@>zl7AZMCg z7sA$FCGjwhd)+=ec%w-skqkq0K&}-QGlKl!=b)~H=Jzm?T@Sc?ZQ_3j>Qiab@T zS?bchgtrU`xV-@k zkVY0DN~mrL3O;P(7$bqc_;B7Cx|Zf7{?@S6U{NZFj7@6_V7mzeY>kdL6M>w18s+>` z@v_Rt!`FTuv$(!nh;}W$%Y~Kp@(2vdBpZeY2LKNE6{OS}yq2a)GFm60r}0a`wlA&T zTqM(&e5j|iw6y{|Hx1 z3eoq-EW~3N!KxbHiJ_lEic1J@h3(-DZg)KZs2Zk>H0J1FPn@GKmC!IvN0h1tn z&K9de^^A1b9_IGrPR5%B)K(CA2-i|FDwIOMIT$5D=V-uT)beXPSiZEp z(VFi`SU%F~5@Twr64g%xBuaij+zjx!�^?)NDLgZdTbBPl5n*w_@%Y&Ts%H)00|S zKZ1VDi>V~ZG!ih_tN>z8Fxzp0J9<)SA*5j0E7``k3uP?8fUeA;yAhlW{&kJ1_<}n{ z7Pn6^^GlZUmDOQK%9J?^xPhKC+;d+-T4+`Ys#`{@J%LOufGHEz%1~R6J%UWs*mA++Ed5g;0zzK^Pe8-ja7^H_Cie_P!msfXQbR+vbeK z%PCe}*avnO=0oks_pS;r2*hH_9y(gqCM@q^BA zHud7EO~hRNkAOTs;Qs&_X|t{U)`@)@O05)ZBPe{(Hz@&#&KPnB^RJ*jAK3V_SJ!90 zxODq(lFuSuLnMhKPB2~~i-7w&mT}27=(>i#bKxxwyd|z(8|#R!57{M+ZY;PnN$>%leJO?BbTQ%JGYZFIX~V3Ex+nZh)W7o59UNAD08Vnczr z;~C)Ah2M#ED_;j9=vstQ$u-2W8$0$F4zfE3ja=q73V@YR!+<~p@l8@!(8<-gZXbqo zzlW|HR$FPLj0ao0IHZGgURVxY6wIgPd^Site5aBt#4f%Ecwbbukp``Or_XRf^3}Yb zG$`82cScdL$ADiudiBM6b)Shf9}rnzUM8CcnR8}=VuE>yhDlilWliKbAa3DsxzAIB zTwI<#`+Hfx+Wysk(8!V@g@h_t9jKwONXgn?C+6U1t!%EgF?ya&W$>H8JEj+!uB$s* z94kc}Vh50C3+A>If<_B3%BQKtXpajwg?vS8E|2}CKAc&YtaC#-O{XM=h$;ie@eF~C zoL6@rhcw?9Y4*Mtmg{}x%yOc6q1GsF7-xGjZ9gjv?Er($O+UmM7lt&uNc=yly^L2= zv)kN#l1T$V%aWHd?qbQjV?DA?0b0sQElpzEc4h0WQ^Fn+x)Q}QLw$D&mX_&aYn`F| z&4g_#3C`b?ecsqL%4;4Z_;2wlC5u+Fhx|+_}SX%CxWu|zZ&%-_eXg{~N?Qg3=zGp4Eihn@LMkw+#wOK6u>pooC?J!?pWBw1ZNy5k_u&$XTU^TXaCq z%3V$ZG3T7|-!;Pj0ATnt#Bi;yo8kw|5sAIGQ(5sApdymiCi1Ld z;o9WnMx;0dfN)p=!k)PpB|c`aCRJ!dPD8%Xd_{ZV=yc013hbRg&hHeiHvN)9;R=V& zSsexlB;z?4CpGj=mu;%}lSqgD5=}jAwM#3)vI5Z}-bCl;fzU`<@-jnUfH>m5Fo#@g ztxDP*rq$f2Rkw{ogwApXdhwrMdh|_m#y%;B#SwUaQMGMK^4)@)qFlZ=!1G%%+a{{YLw>YE=1X}WHQe43|+BGpadlkC><+Qiojv=%v(Wr#%su;;fm z@>acX;%y%N^;v9NO|#Vqus2Ytzqh|DG*?OGnL$2VuF$Fn z&5+7@0FhWub8p@@r0K!7k>Pq5j(kz3eU>R+_Sa6iK#ew8nZgjIhDhG2({6aLXp6=k z6SzpE@g0q=&W|cA7Y>NgP6<4TRmexF*@Ut3=iE`sZ2cCpEGZv&T>(&XdKc@?q(IXjf@7%hX-HST&}h&(%eWi{%JmeQnU ze$uHMoPd61+;G^=Fmdl+J!@K)ui+mSTia>ct7|%a%73LmEG7~|5{<00su=d}89SRe z>(e;tH0!IqM^9}ZSr?Xu{!R8XT0Ay{AcA)fO4U$%Nad>-wRC*v@h{?a z<=2Ssd_8LorM{h~-2UYG0%={BAUG^`uLrOk9`)&;4QxCi2qX{+l0YNzt{YzQ?}=@1I+e!{%R&vawk}z14fyX@8h4|9{0A2AEk$8?6Bet_h zQa81*V!|-JH!2n@jErtP5m`n_%Tul?sM(LwJWZ~RM$=oI{hCtkvLukcW8jeM)r)ua z?a1TPJYC>Re;fY*WnJj=M{lX>&Ly~nZbXCzJDo!W0F^71$5MIjaXdDj0=lmDbFX5rUi6Q@Snsp__=lcTT@>Rcz)X5CywLo3-YY)RYL6DlOyB< zf<9bzrO$1JHEmf_QTRdQUkh7ZzJss9sF=WvTO_6_ioaE0cSoKx_pp6Md4GoVol91R z<}G_rir(4Wqgl$rN8E(tDl)+C7~m87SJxV^hwStnE-i0JzWZ#}tR71{=id&Xi^~MU zrq(OS$m_-ha#p%;ggz>1_PXbTJTGr)tVMRRT!^mxh~$rP4;Cb449ox_lx0clSw^(w z)8Ozs84r|W*9q@m`c9KH}h`dp#-djyJ*sY+CWnQ<~pJ-y5@%Ogmjk1-G-IAGYpVnO=Xo%}iQ`uIP?`ip&zJL{WZ9!CV) zUc}hj`>TXIfIGQH8(SYY8Lv$6_lk&&N&wmkz~r3w zz^66*sN&{LpCNox(ylyO@k#LG!*>a#Xs{Q&n%>#e?~sg{)nbiR*BD};uc5Cc9wyaQ zjJI~_YN_%nMu(@S=?f4&vtMm^H^qMzd@reL7E#zjG&^nil2`=kv}bCx@ovldvl0Q$ zYt%K*5PTlE@Z|c=r!9`BdLu~f?UK$1-zV`SZ3^2-$j$)+oRdyJ%F(njQ;v~Gz>$1S z@hO@RZss0TWI&B0DH-mq)P5MxuWHxS{xJBLUxM30ye)ARxFRUR`HhA>3$QJWo|(mZ z+I&RtmxncLYne1@byyJ$7U?u-(MJnpg*z85jt1kn?HqHHSyTK<&@`VM9e+d8EOd)E zMoA#INhA&d$ZQ;P+29TbbH*ws?re^z)N|b)6M68v#+L-^c3NldXJX|2360EqlpK)zNZe0CPER%OnkI?kzm7IG@vW=r+C%`oz3arSDF_Fe zs`*{WNI2ccZb+|M(f$*768`|gx0*cKMWy}X{{AgaE47He@0h7nB?iI4A1KEsn&osY zOXBB+w9Ab%!h~yDTsvcoY4-w2qD9U&#HY-_UI@V+hrMeG@t4AmN|0$^W4icf@UP)t zg*Bk}&v8DnZbIf+Jk9~!S%wi8K^sK;R7@XQqZoK$*;iglj_>(SkKURd?`C0PVT zN81b~HvIcR7~Bp4ZblCsE2Yu(4;Oq*)H0f_#l6M1TXNCF>PY2&LWFbKhxpbNK;@fa#lQ{2d5d&Ps%COPR>Z$Qb}ljb=qmZHop({4K{ZT)cI@y`r`v1rCHMS z%~M3zZ6C&VH%S{v3Z^y#)9w-q=ku?%yceVD-YR)KTd7TRd2xLqHulf^yEx)ug+5UP z77D%20qN^sN@-pL@WIfYKNm(;AiJd(hY&deUI>H3 zb7@bmTO&QRaQwD6ku;Mes745sZU8e3vD$DwIj&P}DUK6>0OuDlEa|wzZIv z2X@1vzVbLY3JzF_0Ql zmjgWjJa(=B03BIPrrh0XQTU=QTTGHK-dm!8ma#;o!yU}Q!6a}7;bq~x11?=|m+9ttzTb!Tek)*zAG z{e~!Hk(gzQO3U+xC+~C}Gm7MGyleje3H0&kKMyR$i%XL}qJ>?ehq+Z#%kkj z@o&TL4fw*wTa9*7*1;X6o+m>nDh3yl2x1Qlw~jhjGw|=hUk!W}u4)=yi*qEx9C@bW zhE`mH2~sjWv5$K6Xf(R&bIryo`?JOD{{Uyb9@6gr08-U&=GLW#VS}kl_8Vu*e9lkr z8L@-UOm?qb(f$^ADPg!v8(Vv6(l#p5;#86)#zVBEe4G$_9<|Wxoe@Yp^|X4G)tbd2xP~@lJ=+ozVIHUwo#s;dw0YEF`r$ZH3F2;)tYvLlq-0<(T&~C^;E^znxRpehTlomVPDfhx&xKkZh4Aw4Rq%d|YkjR>-CL{7A|}}) zmL?=Z^2}idFnBD0mOZhG^5cc4PW-)2+2XmOWveVJe5!%j#-Ip@z7$iJ|TQH(=^>8^4Gv}UFr70 zRw-3k?jiZ{mGc7iB=Qs2p4rkAoW1sCCr&fvj_2pzqoKWPQP0AdoKofn%>t?v%J!8?irm!`6yZg7ETE#3>coAWLE`! z;9n5w(KX$Q%Op%l!Bz!x+t8ZqieJ`&Y6ja~>ZtmSsbM#LzHJ#s#uoqmF7G3vTrji=Z~ ziz6cib&Z5*fmfd~vGX^wj1qk+Dn4Bg6EUKklZh->dUln3l3iX#sE!1YtUgg^VU3`+ z18qEDXY;P-N7SwLST402eKkid6mncBF^qhzgct;{C!T#Pg4Fy4W8#fU&F%z(SxdJ4 z-z*`<)@{e-8**{MA6}HU)>@B)%lLmzyq@XpTuTI!5#`Ce?FhsvEI)~e!NxhFEj>>u zq_jPUMtds_DKu>^00c3!#*PZ0#z_YNEyKBLvZMzWTVr<$=6Y~wn0|T!a z`ci2F#Tu@nuN}E~?an2aYod+IoCjd4aqM`{HBVjfW{niHTE%m34a_^*Q210K~q_lC6_cw|JghEVaOX%_D#> z_vW;8la1~k)vYXS-fI3C@PFDQx3hxW&$Qe$OY=>G^v`m6>6(hqT)6QZH{K$RTGqlf z0a@H`a-$ekQ~XEPyL~s|ouRfm#;+5N(U}Z|%!N?%wC)%kv+v%kFNORg1*FziFZr>a8t3nIi6WjwQtlsV7M&#g1Y zUlQ!J=~^pT)>*;w%0$7Kka5Y*K=;LZOy3Ty^xXpEO1IJN?*p)t%Xk&tjGVK%Bpv?Y zxZ@qG%3<)AgyFrtlTp(W7D63%NX3_LJ21tG&s^@}wNQ#z9F!aDV~Ozx#hq(Sn@pD1 zN4b(=F5@g9D2#*9fC)W5Vcx!<(0odDRD$nZ)6Im^#~Vl-1Os>n0Zv$xk<-0o{50@? zhJ0VBO>sVv62))A?q>r8oN!6bJJ+K4&K)zs*4b!9?a2h&u}_jQo(CPrY7|#uC-AE; znTxCV!@;@>{fk>xvob~I2f0ErjmAJdv&DIKnd2`7_>WSbOz{4*Z7te)hssGZ>Z{x* zTnd8r==ir>(Y3u=Kevr8Q#_GNwPM2k#UXh=J{z3$=8qCtd?L8w+Cs81zo~0|%vAgnnl&M%m%A>r!eqmwK(tuQb+|^4dU%P1g_ZpRaCr`a^Kt4h|pTjwE2`G^@H zu)+F_jMlnowssJU9VS06ISGMH@xJdMSn03=6 zH)Pw&g&kFPhhcyTKA=**n~BM%qn-yf-ROU_g_V*U>$~L_&N9*!^DzBS$O!&)N~@m6(XP~O zBgbR#FM_W$h%E2zA;r=>ktMiwXv+T33r6*H4Zj&j^g{ zDU6-KxA8Y172xq-WB89x_PGT36F!s)#a|8Cbu@BzxP*OToJ;(O9vk?3V0hveXEYG2Hu(}_=@k&@^0l@d9n;> z#Zw2=3i}uS8BfF)n#58Eg5JXA%R&RQ$r_$Cx*u*UOQWcPf`5iN-w% z=buXYTf<%e(d=|HKDS_&pEe_RPv1%-KQ=)JYMf)PeJjsywOwz+UL+bkl1HW3Lpa=5 zEde9u+R6zdJq|gqN!30xcxvxS)O4xjgL1}x$YWB-&d3MK*cihM@+(ReR8`v4&ll|{ zXv1$KLVpX`wu^mh;nM_{mql4^*J?(%>mKID@T%E6N6^Vo7V+^*rq4oCu`oaEkw zV)Dr)?HvB|*>t<_59wOAq5l904yPi=W<0e*UO8Bf1{7`J;}yqvyW%C5qiFUTahOFK z?1YzKLv#0u&T;8jCrW#t5J6^|jnvl{0fW8lAymoLK#^Ip3D2i$==@RPsVuxM*DY-& zytZjOq(jus>Lp!IFc zF}t4l8O?dmjJ_$}_@?SBHf4?k%NK}jcW_ADSmg4&WAUzEX!hLd_Ejf4^4T8YsOvfa zlgay4o}YO<5iR2sWix!BlEFp^&s^iBX5IWe@jkUWUTO2%&0{JrlvYIFwFcAjji;Ps zA4>U}>-$qymOE>C-dlGWX6q(;vgGr}t$hpN&0hCK(e<>_LPoZ&Zl+tebFeVlv8pI1 zEc}z`Ijtz&Y-fq0;~r>kCF<)x4K?jKWxIk1-4 z(pt?e#O307SwcFOZN<3$6;g4YmF01KBk`|~^^H}H%rafr2a;v;_c01Gc4XrNum-5; zI(6(f&!^n#b2K4-;yLo!`W^jxj=)yjt-fLxCA5-qTb;C8g4){+3JGQr*~1zOhruzs zrb3Va&jPGjX;W&@-CW#T&2rJ~F-}!g5HZ+EI47OmjdizHC^V89)+M=$DCfG7FhlLh zL}J-(!F}r+NAW9aHd9R%}6 zy*}1Nc}e9%NJw6L@%66j!ltrI@%;}btnnCV@+z9H>vO~YAz1i}!CI6)1o2OpB-&mx zBjzWJo*Qr{Ju!~huLF|JZ}q##Z(1v36s&+oKul-lBa@IteXILG{1*6|;~y1Wc%My( z>b4V{+dOgr@Ip_@jHH4Jcg9D0`Bz-{Y4Hof8lsIuOp-Y!Rb9J7;DOf*oM$!5Dpg}A z$h19t9x9beadML9d)VQ1EjRl*VGxyOjnP?H4yC!r)C%f+1>ipu_`2!8;T=$>HW)79 z5WiqIahlnSz?#OXcMMl+9lC&~NgcouhT!CS`q$VW4Q~87plR0r5wV^Ni|$r=E$2<% zSNv-K63<1d9iAZ=Ft-s!HkpE4`CF}8GL z)R%0j9rK#*vo3d4qByzqMW?Nd7P=In`~fWy_N&ve_~#?GgxdGkw| z2bQeT1;_C>amT%J_tD*I?-Wr=#$XGg60qM}6*1fw- z_kD&os6wQ5nou@zr^b_?-ck_D?9xw zQl5L8NB!a*f>`jp0(0tlAqNmAvd52rBfA;2-V=|pD?P!3Mk9QqpMTf*1A7S&SvSWK#%7}*#MIOCEy;<>9rtR33W z>A+LMwEc}s{Qm$$-24lBJ6VObjl|11!N}RQx{{~R^Yp7)w~6&ZsRz8ewVuk>M_A)r za>@o+uNeoXd*ZxG*Id-+^R4XVlHLW&%wa~9qVtcG5KcYo7-@6r+T<27YObBRm0>CzW)G~ce)0Rd#kMDO0jvSf<<|s9HR4) z+W`H0Q*^HeYj>B|8hxd*mkQF#WSTgTpyvULV7In&TV73SicS&HGkf7yt7WG6q7iv` z8tYXPLo{fm7B^w?gU%frze@T)#99LDGCcZqgGDR=B#>}XkE)#VGtiI?d~KxZ(5|fo z-P1LcetO}ymN0-v%)|~cUqb0W6*ZyfE|So^Xv2Jkf%9;9+qh*x^!KjZBT%QwH*-48 z^Iiq#_;sk;-XXp#Z5c(7BRO^%=NLWz02;TiY1(FoXfJFFGAbx`KYMZDo_$S0s{BT= z)k@8%+!dL|*Mdi7RwJj}9DR7MMf_cEQe77A)9m72W88O%7dZqIpVyk*Do$n~z{MAhK7g-xrZZmc&j zZ<$FRnEthc;*C<#E{6Dsk&l>UECFO4dBMeL?BTi3I_%*!O=rYt7jI z-D{TjFK4dAE}@$M%%^q^I49fbTl!azrqE=QN0C#i?J^EBy+@@?+e+xc(S)aXp4+2% z9@26B;kQPr0U${ zKRq%II{Nuf6zaCnRfLqeTh!v@)wRu9*7NMCYXrb68;>lPQ-VH0kht|2BigR`TK@o5 zwea=V_Sur+W^!P=u!xXI1Yn@x9ORr1wa55pTAnA>PNLBzh>zrr*db$#0m;Y**R^_= zfug&xj_%vTY|%j+YAw|eTsZSo7Q(aOsB%W`wcmlnN)y%SX5l6AGsE;>8teA+$*1_Z zTEz-T+is*?wq~sFZ z9+mY+{3_i;#=7I&_{Py~1KX@+t-|3-oCYe)3um5q9Ah=*el_?>@YV}-)8LxsJx(Tl z&d(p0DgZ`Rcb867@IwK}&lTBK%6cYuVKF#Z&eMu>dsxs;X0M;PI`3&O`qwoqTcQ2wjGx^+VQ6N1F!vBrDVJ$J=kHn#A?+5M_Xbnu}TSyM8WW55Ito1Q`B`qz}$ zY8v&1r~RF01I<35Jn7=N`4pmzm&xT$I+Kd+sZ~vLK^al0qdH$3=^8ckFi)o>v)Wp+ ztjBthyfDsG9lYlU;*SidUH4D@YHJ&46-$hk_SA!yeV<$u}-- zk4lAEt4c3pq5lAc8^t~rxJYLEF)oWDIAY+dfOGO^JbKrq_&Zebj6Xp!7$@y?oSd2Mv#b4@HH<&0TVfS4KG zCguRkKs3J{GtF~03*qJ0t@Z0@odcFLMKmGfw>$p;)gj0wLjC5)%bfJhdM2;qy(><+ zl-^A>-kWuFzh{9iBofIB0={1(zKpc0k5!Cd%%`)OhFP8-}4i8m+`Sc*y=)Bsehx|3+xiypF zoj%2G75wO0aI)ON0~J+`+bbiK!61*EXPno_e-pIhXX5xi>}?nW&Mg>8s0;Kgl}Ijl2o6)v5zHkM(iA9 zX0^4=M)bvNBo@&IiZzJK7FXm<1sP8XK<@Nhn8V^U~21d?U6&J4<_H zdR1xkYiaI-mueCt+Q?lyifFTY4XdwT&ZFxMp{W;0-47F&iQddF@>$nWk&n z_0-X5*0EhID9&H*s**BtNayQZQo+@W<%&BMcs*`!8~q2y`jxG|wX12~8nCp5mfaaj z!x&IF$KGacxh09`6%T~`J^i!dRkgH+-v0njN00}3HpM!odN3faK*-4l>0WyJS<|l` zZEH`8;#4Y4yrepVoU18OgI?pLcsE#Y2}k42B5PZDZX|IXoupC(D-jCDM2stJQ-j6LSHU6*gj=eEJ4OIf_Wc} zdj6}f=$AJdHl1;C9lSA+>m~`~VZc~|v`j*bXBp&m=N?nx{{S7YinX}(o2@_8dNdd|Na>b9R}`B8sM*?EMPmynl2=&fisE(JBvoW+nj@Y- zVn%WfIIp3?;o(a}j|UM}bzT1ByztL}yfb{7ey^eF#^TRYyICZa?fl5&mB!&9j18)| z9Flga)`=8S?Q!*mL87=i9N=~hpP(RfCC%WFL-%Xu}^Ng$5oOCURTkR7r_ zM|MEuf;sl=sOkJGQ^j$_Ik(Wg;NKIQy-QKlVb`Wx>$_6Ww5QKyWCMCMO_8_}l`23W z@sq*vUyC0V_3L+^!+M3?)#dcignf{zVo}Pm2u6Nf4bR9NV>qpU5Nd<%)|!?5y`7i# zg3Tj>_-TYdIgbmp6O3eT@9SJ1mEw;JU+uKI@+{`Nx_M_tia9)}+-(SjiD84#?#RdE zT)3QVJUULH+lIo`n!Hhy@aw`FrmOae{BD!Rk(Ot*V(I4zK3)L93`ZrhayyPQ>mDfZ zOg zCi`T3t_wQ5Mp&=E85zzvubaG8C7z|?8*MjB@f4cf#lZ6XjWaTcnHz&DsyJXb6T=Rf zJ*(#`R(Q&nllOk}*r5qQSkU-o{{RZ-MYPkORIs?ZNSVL1%4R1ik&rM+ z73wG9T3vXaeM?H6tgPNNYc{`4>S@ zQ~M{vzi(d@czLd@<+7GJF07joPi|0v41!(3l(sXBjCCDx?hT{(s@GCjuA17!GDhhm z-1$v2k_kkK%kOdADCa$E%6wg;!e-UHX>qDrIe^U@O>*(7q_D2ih8Nn*;1GJ`9B^|` zy{$QO$~p?2YE>5}Hn#q}k8AN2mDszq@m0mF`kF;%UhXSZSzh0ELP`N_L<;3bRe)6-WD*4*4{vpk9_a8#X?x^r z2$I~v2#!c$xVJ#6V|gMt2*>^AT=ZZuUa#T_yfLdmCFIxlR(jMa2>#Da{{Ur=(zj|lad9M9Rir0J5jg4mF;c|q=$PTQ5o7-FCPSOLCXLL`c}Pjh)9pW(-cJVWJugT@m{HHv?uX|q^K zb1MWH*s?~;Q35e1?0 zjl`LXX~eOliNv2W;5Ihn87IDL#yn-=?-G1K_=R=iZz9@VI^abTLveM!IAq2d%HS31 z3Bmkx(+lCV9~jx{@ar=eo;6vSCZ07!UK7iSH~EG=ryqA1;QRdzZ}6wX*0!yEYW6WL z<(oom!C@zyq+lFwUBIqJ>|`DfYWqwysY(%%@wG6jokrf~=Z3WQk4CW4b$w3U=r-c& z-Z>0x&bKZUc~G)A%C;~Sk2&Dxycb`*IvwTI5?ouyYbD{5CyL#!m6AW2&^}*LXQ?Gau!X0x$(e3S0dBwHGl)`v!8bYM`lEonM!kjL~jGQ+IlZx$r6L@o2 zxYH)_2C{7DyjK?xS>Ax=B`jNFE;-=xat|HrT9SP2^fREXc5|}9b+35JE9f9;wEG)T z9(=iAicc?S*%GrE5bXe~FyxX3abD%{j^Zs{A+U$T(P*+sEUu+zGG9u8k269M8a5zg z0!~Lb91|7aiQaqou11J-+nXaVk#B1eQ1t>Qgi`V0L$ z$)IaSVv$c5lJT-f^K%v(%#Fa>TXHzhLNY32StX&Q;;KiLp5?6GTHnPhYZuFKwlX`# z<;1c{0YvrrImkS96~cJ8!n%LNi&(U+dCsS41VMb+9IHp=w&Y#WVSzcu*5{6S z6~d>3{7vEMMz0R32B8$&=6yD4WP>Oevz^c|zyzLi$4cpJb?LlMr0VzDL{jLmTo4RX zG$`wpAqtiGcUs1`pE)yZ z0Ofe#^+S@4&~gYHcm5gh=9OWpO|CDQqh3oJ!KWp_MpkdVBx|^R&OmOQdK&NxON}p4 zklX53SLJPHm-|NX?j(X1jvMnWFJos z@s7CK^z&-7=*;?lmpm&y#B-zx@*gfli~tz!Y#e!nXK({{E603)@w3IN;frevJvJRS zTNZSJ=D|uBhQJt&q!L(yHy(?|I_H(qu6$AA-2lF)d3ka!u94@kv-3Q(68`bL(!?`1 zKwzUNGr<_ZJ+xkk$x(54HNGNvglhV9`fj1&>$`hcu71;QAadw!f^}xebY?#>`FehJ zo#1~D>E(3YdM3HPX%=C7z60gPK5v!SjxwW$>N?lhKMcGf@asdmv;Nec7_Ki-ByYB2 zNqpBB%cO@G-PEH4f!4TRh`tcetYy@EI||EntI2lr-|H5VM+{LG$l7)i0)}oo72~%Y z@@CO%o0RRWJ}qeeD@gn&eK^pqQ()6)v$trjH^=e?o=b+51l`HubAmDfu5ZO&Ch^~g zZ*_SubdZ+r$q$&W>ox39ZH!LEWIjur77UmK93Iv3--xvfuMgZcRI{6etS^(!qlODi4b86MQzxRO{NJP@qMl~>$4bCZxx2pz<}InXt2YU4)n zy~MVSYObNfrNz9+p+hROC~q(f0t&VdLTlxVYmX3kAHnCvmpXQls9f8P(@m1jK_OKO zA;@J1u^bL7h`jj4t9ZymX>|l>ZP~ntU@T73Fbc-!EPYvy2VbF9tf1|s5R)@s`V4)%6sFKA|{*=^>sb+^HNt zHsuVWL4*W0FbKvDI(&nzcwfZ&y~q3{YoNxuG>S87CGxK3aO=H^!3+y91n0RK$Te%i z{xr1kj=c6B9q{~<>NhOVN&#ujuugD+GbZlDoGAmitR;%5nY9cxDK@(O$Jn|@izLxB z2rM-{GWiTrO(o6J+xhnM!sWKCLNO$Y>W!5pTWJS#4l}`c`Fttj4PL|IPumwy)2}>` z*ONqxEs=nrDdmPoCw@zeWP^+nHr7^?@iGq>M`NUTg6I1#3vy9b-9@$YMj#EwWLR;J3c*jM)wOdDFac^${kXx7=IT5)(#Bz4-2M2;NUq5_D z(kAeo){(1ST-?cPe9n&Ywod$pQUK%BWM;nm*3(1O)?GhT(qgtTIv?!vq3vEWcX@3Y z&&n`1?FSy12D}Y?JK@`_W8k^$RrLE^O6KA?E>TDfzF+PwO1ntqm@zrda*CiX;Cvk4 zC5=h*Mpj){bLnz!AXFjCD04pjk1VzLv!VE6-EAbfyoKc{G(jDSo@}bKzQ#vI+A*EP zvgfXhm*O<1QK!xX6?WrU{{>mX{BYcy3xEO@HmP%rkXpMB@W{oi z`>8F#JMmj0H|?mi3n`^DPmO%ucS1uk^B3A{_}OKTd& zd0aL^mc|Cq8?Ym-Wq7|p({*ibZCk|5ZZDopk!KpbF~m+t8&u%0I1JoY6|SY@n;#a< zt*xN9Yhw1drYRSG=D}rbV6nmU`@C1H-CF7z_J?<@=~oRMrMejIR^xPb&g?P~nl@Gd zu~1v?u5xkKxiE5#8jg)SyWRJ<`5vBQgOy547d}+dOHD8SW+lbvS~OS?qs1CRg9;FI^2p9H!KARU)Y}?^W;Yv3?YIOv zBaya7C$O(#H93A0!1}vt?dp3Lx$w7B)-^l-0PTcWZ%}zxP{^^#dcJbxWx(L5!BTpT z)#SPh_=DloeY;0lm6g;_G%T$oP!aj)ejcyaqC)?!p`z-CRwG538J-7o=Ol)Bf|Tn36q1jA#>Ad zu9!ROw=jIk^0R+S)*DN=fob3MqY>rsWGZqRqh`223r+)zBY0n(jr`vcl zLh$GBEuAAtFl2R&7Dg;L?Kn^ZbJuC)VB?DOUlHnu;r{@FuYchkwv{EnxIqkZBx@2n z0OZH=j-VWl2V4sI+u_HKENw2eJ3G16CDqa4kIfEa!v@|I=L+93!6P2|0-|-CH%7E6 z%A>M9r{cGdEhF$rPYmjk+1p%POJOhWWo*VxP0^g9=z9%-F>=9 z9^UpA+{_p;Ty4g32OaAh^XkrzWRtPk$>QxeT9k@8*_8Z_WZQw=d-3$=-nqR?#u}ck z%J(xfd1DcRN!kawu4QK^aUVg!2cER}QC#D1QII*SP)k&5;%{kIcQ@syl3kz>Sh?p1 z)7HImUkF@_WlIHUoGPJ^nB63ij}5t*MjJf(W7mq4z)9i#0d4O5K>%rPg0wO`pg^GK z2ZVgMegiUwd5s*JAhnTZ1v!Nyy0WhW|B9+*6H=pPOrOS!tVztlY4D#qV-ecNJ6a)>$fl@J% zoDqz34~%?WVSBDz+-T_57WZ)&re{}@9r7#VDq&x|!_?y+DJP0^r4+7Z8nbTJIBjRd z(0E4b9by#I?*q%b?H^_;QPl1pTb5(TLxK)4aaFGVC|k#@Cy1u|J=t5Ah_rCYw1N&y zn}Yq~!Lgo5uQ>5N%+@wi>0jB9+9b-KzgY>1!5!6!A;WW>z<;w`zMH7p-f9y^b94~k zv)w}q#TjxG5Xd&K$`=5t4tn*?a!MykPpS5QhrCy(&m7v$g*!zp?WDr)DJ=g0b8q)t z6%p?;DFX$F$A5b2wfOXJ7Wi)3J3Fr`T|Nb75~*~IO51`75GG?|$=?|$daxWHmvm1X z={CL{T|U<3FC|^jffOu`03lXZk%o5_`EaK=#~=e=M0^{YOiOEoO>!u=oq-w$jnO0n zcp<~6AdVY>{Hvam{<&H-K74+7%;;-!e99a1` zmvO~Bf%QZYM*x>3BdnVlBW1=IVSyYTO?(xr-guY8Ulp13l}p=6H3XVC=2Q_*#~VmH zN`^V@oD+kdYAI2J_fsZrrTL_fL9+4n?u8t7x~;qEnuVpUy|hhiT6GjU z1|T6t$>$is^eb&w!`j{5^g6BXw;SqnvqWM`SzvaY2*j@w1`1h7

Lm4^iX3Czkqb zYKH#W);&VvPcuo0T3d%n80H~`EZ7(UnBzY6qov)=1(n{dI|yOC5$X05Tv>t)MYl=j z1dun#{40`3_8bkbXQ4`qlGRxBT}w$_8d)#2Jx*)ui7p_ug(tI5-%pfQRt>vh%i%^r zISg`2%YOM=~+! z%+7c`U;$H7uA7vwl224}o+$Wns$Uy@OTqTP+45Nv1<6-GYLW>_8=oFzUT9z9Ob-2P z$F&_NU(x(Sd2F{|ZH7}S#|`X_6!HKZg3p1M*najo`@J!bs(jxNURYkA3*C!??;IlL zXm)ud^yLKRCD-rKpjCzP5V4s;tT7#*J>vZxLv`$sBO99D}fD1Lip7 zSB+N@iHxZswT%vk)v(4h{we91X4)0|cLJ)_#+x>lQbw z4D*;Jf=%h>hKb!W0~OprYy;6rAah>z;*W>g2ZHpu?`~$e`!sH?0eQ)5d7J>jwlPwr zxl#!S*1Xo|;%qBnGnpp4iFh$8s{tSc2i{X~0AoB7M;Wc?*Qr%|is4p`DsSF)FuYCi z3t7`_n%`Hso_jmlBxJT18>0);ZyS_w26*R>Kx^mQtI2hpMPy>zS&2l>>|~RQ(eVbM zapHTKH5tk@nPQQ~PSqXom;@iF8LnavHa99kk9W!#@sE7=uX2SY2>G5SBBGSE*!E2m zT+*~Fk2d%ZwHDZAjeN&}dJut~S0o;}HT188^=}Hcp(d-XSjQsDyX|kUQC>7};BuQ# zmN~)OAS8}^SHewd_GSF}kVvO1wC*RqeJkAl7Wksx&eHLGME-q+%u+?DM{0VzBT8hSJjW#5eK%s0l67bw={R2jvA>RZbfiUETYx1x0BDG@beAcOqbDV?+Px>?gf^Zl@elSCPaH2KP34sVaUtMm zaT~Fmj@hr!{{R+z9MXJg;rVo%+sO27Mo5tTqTOOL#S;)6P8nBY?Kr_0?a+$xVf!m< z+6Jj%s`yt^I)wTqaCv*aS4n=8y}W7Bo$CGo>&8cpHp1*kHgE| zAH!E#*0Zcz>GJ8S7~3p@?q?3iV-G2S^8Qnn1mGOtj%&IzrDZs>Q*TClGJH?)bv%Y|XsqY9T1$1esXQp&sMEOQ1`{0hkooC}sR!s$B)nsVn z^8j0E*&??6(+2qqoMaxVMt$*KWTNkLt_n8P%JC<|pNi61e{J}C&(-XUNMw6uXK2K1 zRGq8~g%~()hpuXdli@##z7{ju=yp1drNoh=Prg_bF5|dzNdvLkaC@5d-3#M>m!$oo zEm}0bRY4`L$>Wftlk=`4QU{S&F$N=25>w z6eA~M=ZXAR;;#+qaa>wlNVi99>1>aqB%T(Y-Q zGBhbPajZ>(Mp*3Ix2NHX^N$+%V@l9`F{v5mx_Is*l2w60QRT)1D;6&*ms9t!#DUZd z*MWE^;ufi)!XdSFxPl@IW*v#S47pImWcggx4F^c)Ff{Y>C)ZY zF%gBfc;PJ$2+z+VqjGxT+t60EhmJfipo!naI%oVN^IIX@CY@wSlqqJyAYa~|xW^~G zd}rbBj5<`7&2M)<+1XK5CkedcjQ;U6yKis^J$rLe>0c7HdyRTqT{2m25=hUI@CF$G zWu#S;gX+Yw$74-9BZ1*tb}snO;#Q4)cRlCB&0+1J)TMYXqS%(w!6ckU3`R0YW7U&j z1B{$k1L5Bq&1vFT((6`hYp6@Kcd^8?7})MRV^&;{OW^JVpI-GJ#-U|oAr{XJmpA4s z_SFd?!^a;D173VV`y5j&b0|$YRpcA61d9W^jGh2h$!;-UH9y0z z9%y&A8lq}a%NLezBnH-7c_e^0mK-eJTykzb2Jpwyus$5<8eBdg{>vW_qp&j;RhIJJ zNYS4-3h(CObL!tMdk&f7ZEwQ*)%S${BS>yzfeaQ9PZ!!Dyh7OB83~t-$8br(XBD(5q*8^^_8k8J9AMTA+FEHEc7(^~f_tdc%!#-R zEA7D~af5@;;a+Lt`L(YL>ra2J$NjS%hy%rt;+$2MsFMWlwJ?q@2@ejaVO2*c~HO9F}&>2Gc_R`L$BWz+w z8_ZMe0rkaaS4nD%rxvzH%X*%J@Y`6uk|a8WR+1RX-6ZiLLc`|FET?jY^nCp|uRPR# z9cub!kot#*W}8v+q$Y1ABuQhB83d-?xa*P_{V`tu0Da>B0Ed=7EBhsvhGVhPZQ*8E zk)+gQnf5l;W_FJooPayP@m8;J`gGB%$!9Y8kuZ#oHnG@W)gyt^9~=BF@n6IHTe;uF))2@fe93TB$tKo4 zLY##I)mJt4pM>>afx4xq_GXc%!qyQtpETDJJ+U&n?JXMugoB^Eha)2x1BE(iPUk)% zPR{D+_axA6yndGYo%WpupL*d8^2rPru`tImhAgD0_1ZK1zFzqG@ZaHniK>5SE`=?r zF(c0vxt#JPU6*Zp{=n?9Z_)A;6)AUJXk7O3N8?bN=N(e1E7*s$J-Ivgvb0ZlV0vg&?@Oj31dClu^R+8PS{1xn&QzSnkPo+^o&hJY%(b&-^Z35A7rEo?YF;BH}rL7WnF=p=2s| z3}obF@-bF^A498nqf6ANGm(xD$^mCWsMrs*@eVGFcv!(j43;EMT^;=jUg6zLZK z0NWlIx0qXi%XJh(=Kvgsz-A$EaB;xkS2Cubk=mt6HyWFtOX@!tyca&E_Oc_uEmfK& zu!Q-H*kU}giby!%pSU}b#dBKxo-Fv0r^PqJ{{Rx-wUSDPNHsUbnIrEeUPbHfaL zyjQ{+WxtOsRjzH?dw68|7_*cBX9VLtYw3*_;~j^GblY7T_eP%H%@rg2Oj4JTiu1b! zp!ts{gIx-ePR!@28*2mHtbBQ@_!T94t6eY6j4V?{YjKC?hLR|rDA7qEmD~O%wJdy7 zrTDV;+fmVPwItI+%9C8oVzqcm29U$NhX>^yPbVF5)8-v-$2umbBSQy*jk!Dz!w&DrrkPbQw*UdLR5cn&o-?jXU zs6iY|yCt-_hC7Flu^9s!c;hTW;OFUHi{M==L-7WOscG@*aOjM;O81^viZ+!Qfn*y~ zfI^XlAxCg?#xIN)!*+JeG|eAO)iirKNSNBqacF)+@)=yPR$v<^Xc;Fs0|K*CZQYj| zN`Sb6XE5(Yuy7>)-_ETZP(4W)RH-0%=uWTln|wcKZhq78Sh@UZM-ie7t&wb zwW8iPmZC^eq|0??Ve@SSbU7lv3$*xyAByc$NVL^tissQ8OFcAOtnoWWyei6M3IGFh zWp^tAXby{+V`Y$TpGf++BDAyCAZ3J4fH5^``wdp@aktuh(! zg4$fOLa^Lj%CIDgrz}2FTrN1{>BoNfVjR||9c(|dm6?H{>NfW}*OPVNt7x?8e83K- z{z>v&^6ahi<&{aor%pMqP`B})!#2H53fB1q(h`XkgP9^sFWlS#ZRFr{k?mO~*3Vm? z&bYIVbtof}Z!xYEmdNOY=WaUscFjozpTpk_X>%PXOpe;-ER?&r8ChgumL7Dw%Jk<4 zAa(+Y^G{2erx?5SG&O(hjU-rUaNkXFa9N!pY1(8G5*u+PL!E=B20fO!&mDNNBx_si z4IRvoAcgf5h2(}Y&PL?M7@pjoYs?RbS6kIapqij~VUNsfL@hS}{{X8~0yK@g9HR5i zSoFsO@eAT+i=%js(%Vj+`rccDF>Va8!i@Y95%C%TdEjK8ywipn=E|*)WrFuyz3{!p zmdaO9nS}A(ly#44XXS1A&QJ^x2Trx}@5GCb9h>bMmDR+BqlHHWK@fu=RmTJdC)%Ty>rd8o33TWr zk6uf6+kGNil(vX2P9(wkn+FI4WRHB3E~Ww>8wh3+gS1a4@QtK8ZkK#KF>EyLRV{Pp z-A){~;7`jF34-&Ea1J};qh-=H%bhbwUlwW*c@g5`=0S5T&Q@k4b4PB$O9mrm?0foG zykFROnp>ipHjQHdk}(X>UCSVnXw-3wZP6-{yn`Z+wd5C?{-CM-g?T8nwPK*!eUuc9 z5bi*`0aNN*f&A!&Hx*)iqMPPt8{?0O)|zI6Ew6{JRpN{oApY5lGq7Sunx%L~Y;e6o zj(du4h9vQ2=YwX@q+3mT$0l|*zi1LHm<&Qb0u#HQ3V?g!sd%fw@cc*dg@Lga;?qp> zkVejqXCoX4;&vDv!7JAX+ppGs9Q;LS~LJaeyTz93aFo5{5p)uy+EFek~m1U~LC z6^I1&73%&e@wS`dtsH6EW$@EszmG3@B%mye4p0>gq{eZKD9P`UQ#w)RzeADI=6%l! z@Q3XKr)qar_6ZiGvfRzFVoPtdG-D^_EJ|+9GI+r2n)+4`9r##lHqhO~cT7Y}DP4*j z4a%hQGQ?xt;=W(ETW^K-x3X&2w)e7Iv(Fl=AuW*H0vC`AvCkxK!0BEk7mU0&b8K%P zUA?%vgtHjug-lB1}X)fW>EG4;}N0}sX#DVso;&47-4>&pIz6bEtr^e44Y9HDj z9=+3=%F;D?B)GVYAlx@$)bbd5V1HVNP58~?O%qwS(XU?1Qjkg^U9Paj7UP4og#Zs+ zgIXxfXpc5{UT0{ZRcadFk7U-@O7Q%4kU;UUi_0Q5;10hjJ3%?)+m36w@Qe84Mbx+W zgIl+qXDnm3C`^n1=NaGtdYa*4)ioI|U~7#w(Zl9Me>HNrFx7v2M zHLc6C+>30;CV`0|)M1k=k&JuuQyH_4RP;Nkd|9bWF6pF=m_7t*2PARO4E6QvTN($5 z^<75gq15#Bwzf>FyqFH`JB7*leKXd$EnipAG+j0PL3cEEXuzR)HpD>cNiK2M9Y38% z;9nPbKg97xK9j3McRFG>{pv|0i2AWmax=*p=C_2*9A>pgtj%?#PreqABvKO@IQdEH z-2VVN=f%f`TH&Fwy;l&Pc8$Yw@NhcP>hQ@k<~WMlM5WVea7zs2XV8 zXB5pG_VP&{ON{OzM@(a%(!M<4ahT_us-vw{lL{@-yzwTpd2w$e`8PIJ`?fclS;<)(fKCS7WZ-&mD|&U*k%OS) zd!Fy%+YLvtHjERqHe?X^H1cqC^v={EZAldQzi>hZ-T!k;WFkVxDzat}fL>xI-W zrPr*j+XAd$)AJ@MD2 zeQl-qUf#+nC)6E-Fxmrgf;yEQe;-P~lfxbby0|i4T*GrOm?dK*x!BzR!8jjEsJ}Bh zs_SFT#Ii+maG*&Is|6uD zWt8VVd)CeMj*DdklUYM&F+>L4e9<2FT%Vp!P8*JbzdLnL4SaRgym5JRV_`m%J;l?` z*HB$%A-s|Rm7DGX(0&-JhOb6Cbd>jYKT$@xp&N;$h9pQ~%C5`}#d`h%x_uj6(l0FI zo(Tefvczr&-}0}Xz7cpQ#J2idSa|1Ex78TLtOdFd(Yx}0d-r5LbAiFHO@qLemXb{N z7bQV(PV>0se-106n{GE}HB{p!mZ*NIbVc;H_ZN}O6gndA`>NiqVoK{ z**$aA^UiB$Jq{j8%32s!7TTTuoNg8TxSVAWgP+v@07~UNM+T_Uc@`M?&?))$Z1>I& zKDe(}@gBRTXx2|Mj7Mvo!E=lrybeu#`+wsfI%|vVD&4gRrj52`imL6$%!&qElkL*5 zl)4&8C84DZTJ5Y3bzNR4yr`G=a0hp1&m^%J8602?`_~Ps_=8T1QI68-+DXo2Sjiw9 zagsW4Pk!}(Rn~P2Ju%6%K6cOEN&zFxBO@SZpf$@{_+s|zOKn$El}79^QabcF=lm;< ztlvXuHr1kzOXEk!j}Z7f!|>VoNtaA#2Qq*fM_@6Goc(yOoBSE^`{Ev;(_iWu&C?q~ zCSV-=(XZahleZ_H)%6F&uLAgY#;qK(Ir~+v*H(n`j5=Xg*B<$=Ab*0Iq?&?Bw57ev zDU^f>=8^Y9XC!+1R6dsn}lS*OgXvJjcvK>Pt2>CP+Y zUk!L`!`c-v75;QeOKX)R|+?fz)ka0y|_BP04&)s?4$ zERr2IIK+oJ^A2PHo;&a}UJ2p-4(7{Bv$ejJjPb70%f?S~ed~9`9vaj~g>G#$DdtPJ z0(Fsy5 zVJ5AAdM^C5Qc;SDkn%#9@XV)!jCIEuuL04@+TS!f=!RSU(G*!?Z!kGi+~=M%fN}a& z9}@UZZ9-ei+XC@jJW;L5LQ(dPP$&RroP&y`S+}XQX+hfOcWvQs0(@82rT)p%?aa2x z^2jnI$4tK&KZvX?Z{UxD^xH|TZY-fUVOYG+8p0RRxZ?w_KaF%B4E`JV`{CY{HNOx~ zW+B!bkqDWM+%dA{Se3x^$jQcQ*ME7z8FEvT zvOg}oV{D!mzZxy8#_MVpXxbv9b7wn|*Kh~?E6%R&A=M&F%dI@gbs7L>Q-Xbp;|Ce) zEA-n>@GpX|?xr@{JPsqwPUwIlZtM;^o~EF>_yyq86Z!Bn#gO7Qa@&1|04feJKs<`( zmK`Z*&vK6tK|v`+-2B9kQPVWz_P4faq*4?^GO#P^c;Jfe^v{i&{8wTv0w{F7`(xar zkhvUV2afpfUshgx64b6|zSMOs2F^=ZW07s`G}j(=)L@XMgSHT3u=%s;ip|kJ0r)S( zn(Jy88g0&#YYIo?q;jv%w0z!Tuq=)nudlCq+8AAVlR77zQIh4W7jL}g^=}h+vAmr| z`&20#pqksuNYMmf6$i@;fyZOcE6jXv;*W^>t(&E-=$;v%TWQZeVTYmHlZ=tqABB2{ z#}5K(o&c88^j;gyCRh|&uI2lxFjVaWpd+ZyJ?rMHFCMIOn641T5|5NO%m^O+Yt(+q zNhxUApGI^*+%eOfg z1YD_d(5%X1~bR!_4=(jq{h zA0Det6R!Lhu0?0! z5&gLY(#p|EA=`Uz6Y{{e8!`HG*N>)>aorrhUau&sbl%^4JcHuL!p|05UN)Dc%Gc>{ zwT#awhEiQdBipzuZ6~ia<<|cI2YxDCX)!c99or?jA!LPsW4EB&yDSLy!LO|RN&80l z2S|NA;IS|Ehb$fqrg(#&zw>p-z&RtQ9+i{gpNhKN_h}b}WR@7DRd$#-R>9}yIl#t$ zI^n6x&tCT%#jf$Tp6-EX#q8KBBohdu>6k&8bqY zBMA2uzvTGA1w8k~z z9{|bz_tvpgwbNtPmOe0#zrT^@zA(@<-4nsW;u~pYzZR(Q%>e==O}N}g8NeC*YuJ7a zTzHn-;k3Rdw4N4eVrFXx{oE+XyLYcrH(=xgjP~Zd<5T!!;yp&#_wTQ zvexIaTl_=uosWjJi0(9)?IF3g6S-jJes*Grs&UYAcOK&v!$Yab;+<|ySH#N%%`w8H zxdCHd20&qs$C~JMzlokBlfrV@TEV8>%PNa$Jn35!BI66NUXM5 zQM~ZyinI^2>bAt}M7WdY!xCF|?nXERzXv|LI*KcqXnC}$Pgz@I)O=&%{{RgQHrDq? zmexCogMn{s6w5Pm#A6`v7p5!bjYq-yjn&LvCGh%59o!RajulJ-=t;{HzypDU$*-iZ zFSPw1Nik@eO^%x?2J-b7xVlj1k>)nzi~v2otCH~dh-~!OC4*26a}@G|<{}G&gSq!B z=XXvqgWL+k>k8e@>J?=jcR61Y-+yBGXiefPiQeEs0$UdZJC1Sk=Zy5vO7IIkZ~hWL z5Vh6X4LaITs1b6gRR%eHjJA9Fo-5jZB5Jxk?{^Khs(gryZ*G!>-6JXJasl~II6swm z2ASgPp>1_#XK>Qm$iT>@Lhe7^85unK9%?61P3f`gVIrXqb!um7T4B+3G@9;naSOA$ zZ4ECSgY7*)Ir@sTtZH{RT0+|*=1EaobH4GPZtI_V={2i~bqL{WeLb}HMalsY3y`=Z zWM`AfzC9E9q}AOJmk`_{0Fdz#8h+|1(Q*0nOwXm>Yq zG-4wgE<>V)Y=u+Fz&$>-`XTTiU!FY%D|?+!P1B$%5l5H^k^6@S1xN=xH(oo}$UYqS zE8`7!#L!#KWhINu#e=kex&cWYexn%cUel_0F3UlZ(?h(vx@m1UA^AjMord5x9F-Zy z3FM0CQua#i?syrrsaLfqy;iy(NX6oh5BNjGv)^3ZTz(o~FYu8euGPv`jH4%0?Rmj04E)(xRnDQF6)X zaA0uo!_?3Tipq4w_% z=y$MNylUhK%LZ+^ZKX;1eKK?FT$M2QUg`BXTz5ajdBx7PV+w!5KcdZPeQyf}^L9LM zG^6;HPC4ubIj)Dpo)*+E~-~&r0F$ycyyPZCCqt(?QhW zutpOd>QIs}PSQH{2aJ)L>n{AAA4`VeZ>~k|qOBvx5jj#0LQ1c+p1pl)Y2ob4uZZ`5 zcK-lV>OCvKo&rq>>akrupL7_-7?J$No=ji^$IQg%18s0^;Cb}xlF-0yuI;2VFr8jK z`8ULr4RC2lI5NIAI z)3sY$O-|kJR!yxO;1(NOxz9j5=cRpg-Usk*ucul?sl|02#uIe!<|IIo{qgds$3wvS z*KK*=9cJFtK{lBdsWG$jZG=1E^HB9WfNZe-?m)+WYmw5mKN@P$%i%i{HKo+C?6!t< z^I|MN<(}r+$_@`XAXfZ|E5P&d8Kp{&DLZ-|RpY;dy0)Cnf8fs$yVy&?w`-Oe2mo!T zb8tQX00UY68SqRtmREx6+T&TfhAgweFfqc;K2k>DSm&txabA~W;eQ8ddP~~g$#U9_ zka+H9w2-?QS3AQ6IR#seJ60FM4QeeuElLRG{{TWWt3PZuM7Bo z+e${a)6(MdRT-0WIOou3ACRx3{AKXBM%ID47U?oWZ}VHJc;{CwfY=efR1c@tye~x1 z8%nUavq_TLTYIS>W|CvENXY~z-shpgsGaSjE?CzjyPyBk{K@#Wqr+oyB(T3Nf=MGR z#g9Az)~ozD)O84KW@~GyqbdUd45bMnh~-CK+*UuteRk(s)m<(ljv|{+?v7OD0LaG} z&Pe*#H{o4U$4vV|UdbXk;xiw8z>m?eew2Gl$l`_-{ar>|p0ROi+NIQ%K4hyapD?;E z0v2uwz#Y$O%ee5yr#w;{=8AQQljih)l;a?dzm0J5Y8RI?J4bOS-o;b~A&Bi>wV`Pm zMA}G6?k{B2Sb`%ku|Ru+jOR7B=;f-tg_|=xC*yw-cqGpSoPTMzb_pa>=YiO%1QGaG zwCEohZtkFx-(P{Rtmfk3F5@%#TwzK#`o$yb&2TVjW*a$R)Ggo2B!d1~Q|-Hqf;~-N z(=?T}yAazXiygx9@jC)XPJr?&%fw~wO}J>z+IadBUi40`@-GkTVGo8Qy1bT9>d-B- z1sUajXCwgmKnA}M4<4i+QC@QuuBl!vlT}?IaNKuIXLz|h_h>UpnqoRDCs<2P`F54=8{6$19F@KK_lkL#~C%`5oix@ zZkm^fm|ER=@tE02+Cd}lhT6DZymQ+%%~EbI_B){)t6xK<@Xv^K&kgHVa^B0fI36`a zGGxT0_XU*sWM`-0Uh}GaLDGCnr)nsZz;BBH_LtkFgJ*edW{=A%fqr5g7>s8b!LOf} z#};=t(p;6Xy^W!c84(=`A_c%;tig%LBzspm;%oa0E5Gdx5@B_1Gc1cQmeIYek^`8E zZ~v zG9#AQD3=0F`$1MDal0Jg4C9fbquhKl@h-m|hLo0u&0_M^TN=C#Z-lI3epk$1fM=;a0QIg9#U2;B@V2!iclYtX zl!$;zj|&z6FbHr+ATZz@9&kvncJaT1H0zlf+eOm^-)3}CaE$F766BsAH~{Vg2cY0r z3#j-r#CMtn<<;el)x`RHG;&QB`c1ibfM7#pg&=dmKA085h@~Yf$76bR6WsCt01sYx zhW6@f8(S$_P52TsFj&JJWt%4>C;tG|UacRE64Gd=@ddkIItVS|x)$34#uw(@%Y4XA zIL2|FwaQw2L7vAz5lqWymd%A^hh&*=m6gE393Brmj+Me(`0`nqH0z60kjma{FDf!f z@v+LB0tc`lVAm^dI-{qRJ7=B%zWxbHV-6vcI@; zV$=i)JVHW2JGPR+NCf0$1KYiNe}QgvPZ0QK9}Rdf#Mbg^b4x6fLmB%sLl`7Cma~-e zgQ(n9RO3B+SLLUhwq21s0(*|b@U2TL`^!iBO{B8N7#qql6$5ynaRLt|z_kO$r8ikm{U@OOzIw6eI;?c%X8C!K$Eiod{c|uPMkldZFzb+dDzeC6wsP>Lh_s*qC3LMa9)6jf2_-AQhZZ$o6%E}ve zf8GhqfRm0HT1~F1P7lZc^fj+_@FDymt1pTCIpQrA!s6XG!jgXO3z-QyO@KZX(BR;( z&m(B*@#Vg?t=ns;&u2K+URR$pL~|sdmQt~m+Ce?B-=-_;j{*Et)9thX9?*+<=qNb~VN*?ZA<@;fgC{9ExYwS~>6iu@&e z6gK%&C4$7*QN!&rNO%LM1d&~hug4#Q*7`$hT0Pp@PZPJvcqKPm6CuBJqy{)YcQ`$( z&-LGrvES;?9YLu$%p=9I)rbcwxJBr}fNprtTKI*0RjpH2#_A)4+Rn-1PK6K=mJr{uA*YwWV9=dW_drspefnG%B)4 zjV=|}Yb!iB&Tzv7@CYPV7pZuM!bbN007HEt{6zw+*P`=LMnJa+NRl*-ih{~H=Q%m- zGhaLSHuu2V92XZhcDjRVMP4Vnv(( zOL(N3Nm&G}NhR2vKUUlmIsGD8yd$eR=;e)R6ng!)$KMY4R?|!W0E9Qg_E28kuK{x2 z{8!Bv{yx^OVtpJ%5Vvclxh(LbNDB?6L%1vy@JP=j16@bLb@76DnGABs`aBY}uMu7G z;!%eE*&MF}a2yaTS{TPWXm3*k7~SvceRJV);vWxbS3WJe(OA zk`(|_1Fjg=Y&k$c1d=y>DVjF4x^0EllJ`-_ zE$3^gQe|5^coINbHc6Cun|E&9o3`hVN~h!91}%2}eH+7H+4hp_X$*<1#*H{Bft)%v z6?brQIQ(nbRj(Tyal<6-V=F<`G#x_L*H+Z5qSqyBM}^)M^JIi?CN(jB@raF>gSoN* z$Q8G%Y5oMViESOe&!^lMYkBnhIb?xu93W+!e2QcRKZGG=$oY?2KMnjZ;{6LtPX*a( z*7g=xB~9#>F)#0!e5Z3i?=o-;0m1rWy98OQ)~ zYUZopPxwP_Z#3Tz-CW#U+DVCpuoA@_ED2*Jz}lM^01(}OD*BU2_{*jEAHh>Ys=;k{ zE}{|P`zjVyDlv%3F_Y$CWHOvFC)T`n-^6;S#2r;MeJ8@((n8OXrdcG32l$!u+D*Io{S$4`|ttB>tlMS^F=^j=%IIb;M$vuc$YIo-hIbgyst zeXZ%5M!#_#mDJa_nvQNE^QLu)cqbTlecO&s?fv>!f%vb$J}uY0J85TOWo#|9#4-Jz zby%d|Bd{cIELoL)@%eg#w;Y~I&%u|PU|lmw7xsFV^eQKTmeG@f!W)R6B=e3o`i?oJ zPP}0&#cV{W^G40?eTDl&-`{G!6tL2)W05Uw)K4t7u(XA)AzY#~sy8Ar>PP2+UpVNV zDAX==f9*+PxrPXp?NHkQuF{@Q%w)@Zjigt9;U5q9;#hTEM_Se|SI&!P*(56xJY?e- zF_6SAaC4tiT-+WC)^#iU{a?a5G`IH}L_%27CqN_tg0L3s2I8RP?OtkUj-0CVC7?qM z2*TY?Gg|nQuFa*xr%q#X+NZt3lN-^sPQgrnuFu zq>4E2C%E5hv0IrW3*{{RWq=BXBsZ44`OXf9C^B~VCY zR8>3Ouy!8(GhDNHBjOg3;n%Y9?}cT$)3o^f*zRo1WCbIWx6L7nfyc|9IIlACCxLX| z6zJBnX+9yD6=iX674!LUi5HU_yRlRwfJXz@nxmj%`1glOtM*+ zCXABNtXo-S7z8roZ+zz!jBzV#T-I24cRt$jPl&u1r1)~mT~hMO-EQTSua|V9?cOth z%@TsaBqR8UIOo$pDC*xFbe%iImwGkTiefp8alBjwibM>fE<+6N$$xzNR~cua_B2=MC-+P{4cjHe5Xjaf$SZmsy<@tvqSi{aFGGi#i zjD-Uu0f(o0@f(kbehB{ngq#z4mzGn;WszhB9x^#R<3BM!bOLdnIIpf#;g5xFVjA9u zX4-x1GrZ20Zyf36xd5_-ErmtNAf8t^Cl&Iy#SaH)(RiCyO%^q{nt9SEkxQybtOGN~ z4p5Bsesk1uS=FsBTe9hECXRc@y0?L@Y~Zo*_L3HB=%ZtKc_Yaj5y{R0403VE0CcRs z0cm=!r*=F)rE9jfaa_p|!Hv+nGXNAwh#glv9Fc+2y*EPeHK&CkYZ#}8QMP!;pKEvi zkqR?^8fBG9Qg~hg?hS0(cqha9&GfSUg(0_&Sz#}41aL#viG_ zD`wNRSgh?~xD4^7tc~Y0HV>H~a3pZsd2C>jQG7?#zu^;v6M224#RlfJjUA$o%~A;2 zv*mI*=YlcKeC?x0|m8w~Zp~^=$*<-gWoMa%{ryTt=Toj%#(fmhnE)DPcR5)GI5)RMqgN$|T4RFIB zT5I5E9ZXE6@YAutXc}LSbPFb$YrB~tE?jO`a(}!L8Mf!S$2}`f$HaF&7`wQ+7U;K{ zmgbbYJXaBAvSm3{%Wz7Cam`=x{{Z%{itl25KI+;_3kyY(^G@@8xn*#}GAc%Q$jqTt zo31_iu8&BuJ|Xb_muqopWotB7ETSblKvtx!!>!+*x^DrC5l=oHlqE=ri8D^T$61 zwar&mn(M>2i*p8>6ogx|uH-565D;hPKU|zvlxtR{7bu-|so?PwjAxd$zQo<@5KHt@kOPq(@74SX=tk$m2FgRNj_7& zqGM>?~~z;NJnI( zBCnF7Kv-ad*KT?I>(eFhPsDEx*y%<+Q7-h860`_B*NMq3@(~bV&N0<@0n;NGuEyk?zT`HavRn`=csnhwxN7zE?hv5{U$s9*R?Rj{>#SFoPTQnf}f>NDF* zWX#IIv~kHB$Xg6wX>?vYbA!@+GWdgI;JY|9?RsX^EuG#rhboBioZ*aYuekBlDz$nz zS56n6%=xTMO0!BbcT4UzH7^X<3pYBfki%$h1eYiTAw)_8I>Mn$V>;C|-SxOzq-S&;45HKg? z7~r>JS0HpApDxGa?-lA7=-w5v7WWZlm+Xloj<`IrEL+#m4ti8MMoXC>rls8aZr)8Z z!4SE!1?pR9^QN6zZ73hsjc>j4csORV{B)>yWc04 zzjae?2nY!SB=Bp@tZzJV;z^nAB)h%6lXxNeF46OQ3}>LK9wE{uZ64nKD|^9l8aSTg z&J)8cXDf)ARpa9z{LPctR4Fv{X37zIv!~TQC3uTc(^pN`H7V!Q;VGCE@;*U;K_Iu` zoMy1vXeNly1Wt7M*#vPB`}2{>1abF|100Wf^Q$|1ON(`$>Pe+%B}`G_4o^-$h>(;pY z`7SRKXZxtFgBfg*pQxzx2(ESMj8j|~BN+(Iyh<}3^2Z=K*~Y*Jeg##%TP<5a zv9Y+Yj@waylO&HLDU~unU)_+0lh+x~<6d>)9}{anF0w;>fX5G%t>ygEnAGjyGv%GL z$pfCG4o!Prv#45X8Xlhpoogks+ZgSdd&uJ?0>PZF)FkJgtU2R7O=TI&;b#=$qR$)g zAH(Rc?GsX-D8Y^`>}{?$%M+a7OB*O~+30@4R`Mu~)>pYHnKlI= z0lOVXILPT=W?tJvrfZg(UEJc{TUY_Ohi9J*@eo-F3P+dbWDKixQIp2 ze8-?;z!(|EdFx+C_!q?98;;)N#5Ol`MSTOL(*=~7ZdWB;L~O_koQ=Tb{*~mu9PmA* z?d#vee3Dw*nH}wX)V7?)gBer12a-5aNa{ufS6>i+!Y6xaa||*DgLn}P9acAvSncFw zX-ZKO(;7)rj@Fx>(s-s(KKlw9wmDdJ*wLxP9v4wSjm+VBdTI40U#XYWDk^rYk~29 zg*;8+J6pTGJ5;^3v?e*Chvo$Ni_3hZ1!2(S0&sZgpP~F4s`zKZaZ9CW7g4NY1`gYu zZ+x7RGE|jtK|7Iv2a$|%UUhroeLmMzx}IAV*B&9|#u8bhwK1NCMank(lY!9iF@aQ~ z@1R2wC8I~pz7p{Uy$$QxtTSK2z_YLK9ajT~V5c7|5OQ)W>7M}KuZzTbHmvd4EG*t! z@&5p$O(T52E9WRqa#WM|Mh*@QP2rysX_^h(k!e=;uo*2)%s|5)9G|}g#h2$?`Zjs$ zaaxypmYrubx|f8S+QwZ%*tF5C(py~EvtT;1N(6g>`=AmEw;iaf2uaL?j1$h>=NQK| z>e`pZ?IO=XXsvYX-7e(aIrHvrmUNIJpOq3g);yMd#kz1a&=Jn?ky;^rYIi)F;zz{` zUmJLZv@87_Lmi&@0EwD6mULpKSpuDxuZTqD8K5jFPypFv|uIhAD7r19C zj(W_3_e{9b(mUvGA(*(s02xR=od7?DVjs2YiUYyO3R5pvF2L{Bczw@eaFrc()8>iW$O&iZDtPJ#ZMFzUQr9*0n1Z zxGF7D(JOmfTb-7ERlZ0Zbf`&NGjJG`|;W(Rp@> za^Gf02gq@{EMpidc;srmcOU-s-xnUSEeAHA!Nhdq+DQk+o5S^#hT@)XBwY z%;g8v(9`}Z&*IHi*j?&TK+++64jp!r!6UD=_)Fq1i99Zm_)k;T zbm+d(EQuAxyhh)J{TXryIXq;1^{;$1)pYm}>AESf5h%SfK&E*bHcyvp zNac)VeAwzUoMhGygZxwBn=M}Me;7w`V`(}CjqK#whE6hM1&e_oTx143bTy3W!b!A< z<$E7+>DniYHM{%sX=Z#uX>)Y*PpCrCvs)O+DxWh($+a``;{^Q$cwViqY5xEWd|Z*o zs=;ZZYTM$yWsT;YrVEg%kkOUTMq)5Y9+jEkuN!~DC3Swj5Y^$54Ps!i#RAI6k-l&| z`57F^>+%efo;p{9d|uQ1PvP6yTUUl*e{rZud%e^$1(cTD4(C&x;dcSY7_N#lrlO*j zrWGj3w|AlUPMPBW01I8|I=mhV(7<$ua@|h|2=Yjn2yvDt8T+Frwm>GoJoVp)-w?bt ze)_fjmEg7#GaHzYnA<+*9gjoJd)L9sZw^I0uZ%UH5$ZZ!itLv5WxHdExjP2TGWK3U z&OVj)6h9dL4M85a;ja`)2B0QC+E%ja98Dae9gu_y(XzK0V5(WSat9T2nx5yM7c4bS zT4}WRJ}2--hc>^VB)WphX=A-$GC5fUjKq(aDcpf^mcpI5=K$utPV{X#O zG^x_zk|^1ANTG$*fn{&r6=Aq^>5=$X)Ow|-h;{vb^F^@m>^IXzdv_Q1=k9{Fr_JQ6 z#keqS*xDH5XdO>aoAqftL*Snun~4R@s8U0uXp_XJA1Qd5g6#hQfdQNz)k>RsC#j`8 zQ+gh6;?IV<=AxE*Hi6)DlJPSnw>n+xUis<=AY?M-c9w07a1S6?0Wy3?@F$n0+{byN zDPNT)5=4b0=c@2Q&3y%>{7jbX#rl_qB2~Qp(NbFVrIG{=KYGN7h0YX^0NI0*K_DJF zt4|l)>lc?gR=*rte}|_#uDsZ0mN67XcM$&oyk#Wg4gtYAAoHC$XR}7Ct(o&gx|XkZ z;r6uCEM(N~F4jSF90?@eS}#Yy83V6h#<*=GOVyg>TUzPU-70~(78iEO=r9IGPXfN^ z@m{mxJq|ldPYHN&?B%$h%D0~E+reB6kQe#NyXKLyH2sP zgt{`?tDLe#AYU}*PDh!RLyW6n6Isein!7DlZRmWpqI@R!iLcvv*J9g8v}Vf-m)k0Z zz$#GzEA(Q#*R*I>UKsHBwbLWIwwCJS_icTttPzOhMdbrLuF)p|1F$c@TJ)>ChPcw@ z(4~DM0Mi$FZmw1dZRU0xe|E{2Rmu6X;D9;|*P2Q2`p-veyUV{DSS+&dg6}YgQm#s_ z1Wlc-jvOukJc{P6R-CMpHKi%LsUGoR;hitXuNB+c*hP0>%WFJ#@xgM!D1qZF$W}bI zen7;L*SV8c(Y#;q(nGHJOIT~07ns^yDkZ44FiDS*goG8r7*KaNUz?tMpGffncpJqw zy6&H)-Re3-Xd{|yJ7u2HM2M<3O9Gq&(4+H`PYsZLcKcHBmyfPB9e=|Y5?fxIArom# zlE*5^9(meii5qtTk30@>Q>yoj8@uJX^X2~l!oLOhx5Rp^*1Cn(l{^u7@>;_N^o5Q~ z0L7bfkP8A1G1HD~-Mk5)>6-7u3%wqFZd<)iPbIXiLgq-Kdv-+I6llfU%iYknK_KAt z6`iME*#7{+BX1jN+HJk;YG9tydw5W6S0FFi6?ds%bCqml_3c>N)}f(zTS=b#K=8e? zPXuVQPY@2Vy8uLQD=y-5_fB@P{0&5{EgLS=lCnID^M&IsfK*R_1h;Qs&*c!yfmSm|0py^aswNN!|Hc)$c_FDXSC&HyJQo&|jd zJV9~scT=@nty2F0Pe|odjZ)biFuB>bOqWa(w5~RuzSXPZKZZK>mZJ8ylSpQqd4f2; zQ2Fjv6m|Mk%M}VgyS}G(9|1YW?787@1bj=>t*5!uG?*=|f)e)4si;@q+i6w@r$R>^ zFm&Wqg-qn-c*j%Uu6jQ9}?+Oy1_NV#w59pRy`LOD?EVX~U0>}|t-NauvU$VIAS$Zh zo}gidI#ZPAe{hF3_dXESd^M_QdW&dxwhwJ~hyGd?Rv`Kggdb7Y)~&aOykTy!wY{y( zA%NOrFM?0_*XS>bJ_l=lIn$!?4~=ZT!xo<(nq-FM9moxbjL3nOHYc1D!O5t!F9~bW zS*?%5Ipx2BO0kmYpkfyw#HLu6fPaXx@H*$Es*4xNIO|^~>Yohsvv6+SJF9DJi5X)WbBI<#ydROJ!hm{! zGCE*T=A!i`HGQgltojZg3iv}scvDJv@9x9yggYwAj<`G7fnEor5~DpmI&0q$=^A&3 znjabJ7IRtZ(SvZP%PEH>{JWGgv#(VnJdXAAOg{;dz5zLPX!M?$8~W-~d)M&>TNRlNWM9jo*XFN_`;*DT&x z^(d~w#;%eZ3wdRolxJea<|q!w)tRs<{w~)153T5y(d%}HO23gJxl5ayYi5^r7_Ga& zplu$fAdU`5tRag2Xqq^?*&mkURPjcYZt=$Vf(BySK|WUE06g-ifsVEJcfgxnBgdW; zz0xMWmrTqMZ@NHdkjzoCsuu((JdwvigInGt@aCW59VluZ7Pq;&Xl+r_$_ZJ)n}6?0 zM9qazt)5+g1F+(}tKr9sb*7V4hr^nDki6FlqhhMQ^&OZEfZ+4*)2((=j4HI|v?6sT zqSPLzzkEON{)Yt8_9b!o{=dFWGM?Y1rQZa%0YDY&lh}Bw9;)?Q_^F!0^y+hT&!G1@-PAtBQi`69dUu*j%#V)c~#O!Elfp8JEQ0$V#p)9>NZZ*=(M@}5MF7y_#jeAyw+_Up-CW9`D}zq59eeSURo4->gJ3&3+rX?c09NA`<* zMQqpNW5RIOX7Pg21uZh)TOYU$0W`2kcbDa4|@8MbUzPxqVhdE z!+M3iw8-*)_DN99nA?_$*^$*TkV~FVxUO?s@b#XSB)!wFt#wT>Ng%(5S)2VZ;BF_% zf;9|VBP!iGW1!v@V4afGnJG1mmAZIwv?lFqj@UMro?RNhFN1ICU zjoyoCeQ_E!wwZ1uR<=%Eo>}dJqOlx&%t++(&3!(;8TeD-t>)IrEZx>CgyS;hPndDb25bSr$6DC&2gDeBF=r4LG21%<7Bzpt6tYC z5R~@V?(C=0bnCe;th_6v1&LNkqWd_DYLM7>3V;UBOagd6QRn{v5xiyM&38yKcoxz| zu+yWKTay_m#ZKZ8VsHe#vIcnlGW>Jm?}+!(O{D1B42swjy{MR!wgpGeE67j;3OP8y z^%<@M#Gep6U8PvqSZWIaX0{QA`%H306lvehOb?qRjlI2isHqsOY-wgqE?a51*#wG; zyFfcn-5zhEu1NN-lS)z2CrIA<&`l#P=fk z^~;0+6}E{LVvigb2Q1PY{KY^WvDUMUUsKJm2|;SCb=Q6q@aC-ny75c`>I=0g6jQg$ zjAP^k@$1JwO7pv4f!_!8>$x>qVVh2zOa6@-O>r10kC^V=_j@0kC+S|(qHEe7vtah? zGzR|8JgUs==Bks=3!D$lYV^CXOxiyy;{#{lE5-u0EI=sqHYR+iRSZDzNKiA0fZ4B(Og zC7AAU*RUOhYNc&al&Lu_PY2OH6&+tlYn$u4t1C+x0f8^0-abM=*%QcRQIp&+(zuNa z;m3u1OX3vL?ye8oNOQJ$7B*2C>VuHSkU`{o*VQ_jMQ!%)vB8rBF7iajbgpros7b*- z!oDlvh9wOcAx;iR&rhv< z>Hh!=t4{Gpm!s+sCAITNySUoB_yCii%bN6kGRio1&3}508Xeo&@S`1b=~+&;wnmjB zQG9!y_lEQ>UPvwU%ju<_IHOp6*I;rZ81o8(al0H0=jmRdYo*%gz$^$PmC-{m1hFIY zJXa&7Us>8kZ*LOII^Pxu@FPhW+B5SyjjNv7BPXSGD)yG}OA>A}NTfFBVp}60c;t=` zYOZ#3J9R#7_^I(rOwx7fEt=+clF~0SD5I65hDKsn=PJOkPP=*<_)Eqg7<_B2_=ZTd zm~n3M>AkrYSs5gv4r}vh3571IjsxD_j(NS4P8WTk&}|;5K2cm zJnqL}I-2@N;EuJbc%w<5RMoX9BC&=;6}lc4XB?a#MHtRKN46-{a38*4o`Qv1C z7t3qDr{5kg*Cf;IZkt4rpuV?+%MHX*UYd&g;0420;TnV~V&b-hV>`5Ma0V- zSOc#lo`8B2n$mxZdR%ZjS+sX7pzc9}6yv$=U!0y3_^p5A7`)l7WtZ-PBoF?YG7cqmmm<^19P6+Fq({*bvb)IU=(v^?3^^b|yx4L69 zT0se$cbeyOfQPtF#}(uHH;*;z`6YwFmd$q^qm**c`Eetkn1D|mIU^#j_!Gx|9r0Sk zBfPZpHw2y*K@^490Cp=cAUC0|{X9Pgk$nxnmpevFJWG%vS0|mrfu4sL=xB{sZ+M!x zRGqAFHyZDbyp_DwwJ5FRxoweK!xFI0G6N1qdvHy8#;fszShk%s&2qv!n`oaVOJ^}k zR36;z$Rm-(eGTGo48eJ89nIA1X!fHp#}L|c&JOJL=hD7U@o$Ht(=Ig&?NZ}>%D_O$ zhC{mtZZnPn$@ete(>254lXj9mkMQ@z--TMd4s6_7YLX}cE{ByOallcXm>=wu?_ERu zLh#7Cv(sd_iRI&Tt``bN_l9#{ns=6__U2poRoM{yj6PqRJd%G7l~2R|H@VR~Qw9FA z-*2@^Ns<`|JIKxlAdkxM=OhqaepKAgIn<>y{40JVjgwCiAa$!ROg?R4!n9- zoOpM}mUlMyH`AjA4iZq{;dbYd*RLn*N#UOscuU24J*3u?5XD1dlxWGv%FB+QrYot7 zL(*;Gx_Fuh;kn!Pi4Fq49dddcnoi8|oM(F+)ISmYCUr?PnXl3-nA-+90Y(J!2Ot7S zHQNn(-(yQ0+v9|mFZ?79d)J#@d@0iPjZW73#`U8y+^x`PSzTp#@qodDD*y%n#d}5H zh9Wu*#l7MxAdHd_g&+@@aoeXf++(GIIb7u}wS5O$gY72TIV23Ol1PAO2dF2J&mOdC z+C|gJDb?>|l0Uqw99~Gvdi>7Bk6eo8>~7}0uxRZSZPGQ{8@?IclmG}B;1i#vc+Zb7 z^)m$j0NJAX^;t0-7Ru!ul{ns~BdP2=R9$S1pxbIE)sfriKW&61+?Nj$75(Iy3!bM0 z`*B+k+TLEv92U3mt-c9xsniafEP6zIR( zJ{gwg=G5<2m@2!WUP`t=JFs}-zcyjjuf8mJ-rG#k<9#OD-1(Ao`@*@#I{WjJ(!Sx) zJ}3BJ;Xj3A(Jgf}h2$>g-Z+n+G`%;G!yZTED`?GJ*AatpNj=SvA9zE<7qkBWX6mvv z)G-iMZw?t8gPu6gUX}A@ufpGlb9jNLy|YPdpp=0IL~O&dlgJq(lZ@k~cJla>Sn-y! z+Qz$UCB=-qTSybj=0nDMlbj6o6{@}ieKP4ad;6W1*KRgOh-54sMqipme*pPF_x3S!6_Xk?M@YIR@n;h~4KWd6ZxG5(>$k-$ta&QH3-Xrk0 zg%T(d-bo<)LI;BG4cWW)hyvBbal|B6)Wt_FBf0xx;~kwUD?ND zWoKnC?jg08%xPV+Pa$|v1_mvOnuF3E2j>Dijof}83&VGn_Sy?n47yxt7}J*nWkB#K697hj!4HJTEWz5o{P)j zRu-%GpJds5ThVS}Z?*`wk{Tk7kU{DBS1GN0OVA{d?hlfM2F7P`gS(Kc-H7(-Up3u$ z4&v&;f3q(K?!h8ekl~5s1_$)UFH zH1X$!wHtP_wX}+7nn5eb5CViA%m*2+-^3b}5%^X)JUJ9?11e#cEb6BllxLBi`K}Ye zo)7SzsA7AopDrxrgpY%szJ%acwd*>EhP*SSrPYPSyuLzhiXcOy0o?Z=@E|_4+fChs zr5bjnO*7U$A8SHu8*8`~q=E}y-neb@Z$%ghA6x(c>0Q(Kf-B8OO46=iySO)NG>}U0 zv@wmHRrg>HoE-CCA$Sww7OAY=z?y!SaQCy_7~=ae0x3+bh}43(827KNd{KAtE5n5> zyjP=(eM%?*v{k#0?CK@lGIoXl5)MaW&!uZ?E2GM+S9bT;P@%hjHKT-0a7UI2+{_5ceaBnaL z`B1B1tCYEA;XJk&EX9coTcWRA^cCkH z6g2Ha`*J;FOO9PW>e>`$k0cPvO5|jcasV~-l-h2UrO9i3V{2)rNK{B2Ho0jLfptAr$u#TQZqpMe{Io_gG-5`qm!K$o48qn%N^h^^BJg z{kVC4UUrtiJCAdb>0HI{ha_3z8VnNL$PW1#M&&L}KnkO<{cGz_5=-G-P7OW}5$N&S zc!!77e$(b8OU6Mfkf(XUz&~2zE8^)B<+)Ac6I$ zNkqbyCUaiwE%_d;@W$13-wLLks{NGgwU>3eNM^W-Ly$;A^CMt=-0@tlkE+3=cu!Wi zvC$;CeL7W+_DL<6NRAnoXqN;o;B$|qc>bF;)sCnC011Aq=T3?>cek3{YTpTuM;ujcPgn5{_4tsH0N`EtsGlf@ZMVfjy!_@HdHmhgiO);AO7M@Eh z%fGY56zh3u$|aH=Ca}(%fK@r#*P-fu5D}wy&t% zK(^?2PrOFh!TDH@naSYxCkNWT{r#LiBHLehMt=!iWp1rEN|A;L&bS{Uo~8QWbs%7L zr5dVFQ#?)@ttj)s-{f-_{{XY#i$#w1ZxmTwMi>`Mc@RmIIB&hwD`XHk^~HNVuZ%ny z;R`5iUs}1ow1;3{I?+@r3}!RsrU@f<7@TJn^Zx*dd__Km;*D!cwzoH`mj}yG#JE-@ zw^7UPI6q2~?X`bC-%FoDkSyRdjdb8e6itFy;N-CEpyc#8tG%^n6-qOmxs6{Ic)v)# z*0lxj^wK7gEXGS%Nomsk#h0fTC?rB1f(H@0kh>GoP&+O&c1-~j*+I={5X^T5`xEDzMWqyGYIV= z3-<_Po$OC5fwvrD`ePN)__s*$R97-3j4@u@PT|2>Ony>ua94I1W4Wx0 zUm9BJ*H#v`)-q|wP>o`Ft(`<=LC2g14o)+iW7zXo3AGwIW6Qp}gFBf~UrzwZ)B$mzxb2RJ-ei1_aFT-7wQWv4|wP|+)BGsZFQ1i0?18cDsUGz?pF`lNyyDbZ+?xC$XWWC$ZuC2Bgs>!!x#}H1XU^sRk0o5MBF|hGta(K*s|-n&5PG z)AY?g?^f{HkxkM_#jX(~5;SU0%1FlUFgW76-w4`&!bJtXw`+GbwA0$Ng@ne}EaieY zUoaTg8@c2j4-|4n{=uwS%wnN<&yZ{*DAdkamW>Jhc>r5A&836qtJB^h&uMUrrGNn zRP#k}#0e4-$taNZ18F%=YQ5n7D^~Gtt8x9Rv1!*)!t?#2;aOyt*CDf$-#Gj$&^{e_ z4$}6@?&yu0SIW>x+mcA0HXyQ|pfKtQ$UQ4ZUHFmVMYMeiJ9fX+EaP~fxMm9(+nv8L z$tV2vtmhR2C|358<%CcF)BM5snWBqrWsG4`FwTQ$Bx7+Sp12_KTqc2I8u*J(c?wE~ z;R7x+!9Ij~SLi2?JUyU%LWWn0&{#-`^6qwQfs>NQB%1JF3H%qH$6be4)@O`a+mg|U zoHM)f6yS0Pen6`BPoC)Uu(_=_hUKXJ;}clX^r^4(<7E&@+7ZGGHtg_t$2?ckz5$m? zZ6w3uD>QjvBs<7N6M%c6EH~p7&T4)g)3mKsCbUGFC{=ePqz3?xTxS?HdiwI$Lh>ZE z#E{9iFun;*#|#1M$JV=|&z#0qbt0qK?%Ty54fOZ8ZEMffEd+ZO7Kbw-_I#*6oqW^c zj}d4Q>mGKAV|At5nTL@)>`?&7>%kp8>(g~TZqrND;=A(Uc%0xFLkRFch>^!XTG!V+ zKR&k%w^o-nb6Z>?S4aq!2Uh@c2*%;-)|BCNXN0b)J2ZK%_lW#yqUu^z)YIDP7G_nJ zHC?S7qX%$f9y9Xi(D$!y@u!QtGvi$hX%^P;X>m-$V3aB;^6)dig4jQgu50DkJU4gY zEk!P6NB+-Sh4Uc|oGP6BnIwUZzomYJXrJ(`zA5;7blOe0J2;sDNfhIpGJtsZtYr%; zBhaaeh2tx2)co?)yfvk1+UjZEAycHx_*iZ&v-WwTP=9#OxUNaZ-NrkPYty_vq4=v$ zfZN&KJaO5G=ZgK6oFHNVEwvl57(J`fJa6!yPSS2Ij-bO-(cmq$@%!kNj!rh7arEZ0 z?)*XU>rL?FR+=s4&9h%fU?nD)x+om0M5RKGm?UG~x!#&H)Q&US#d2!QlW%zzx*Nq; zOZGWq`E>|YobJFom>q{XAKmHNx-B2ZmzHr&r$FOhvyF?!u?^d!0~jkO10L1EKC5{) zj(jb1V!D?3S*`Bvq-my4mmytTf~4ms2M3_9GLiJ1Hu5uRB=B4zA%QX}3=d7KfPR%! zsyMqXjXjf==f6XJZEJTHxQix`^LcxBk z1E;JOQAZV(*kqD0=W~_-jAcgy9Apui>x}L@^0IAK`&ZX&4EhE1T2XHA-W8vg(ZWyt58 z8j6l6>!nqK-)yb(C_PG^LjXJ1ru;|(0one4HHaww7IRC+TKOq#_{C@!`%S0UxZWr)CHLC#mN3@b$FxLs~n@0~@ihJKgfai-|8&n}}K_*4U>uAPeL3U~wdWFBS?Suem$z2Mp5afEGRNg6;06W(zw1STDu+Af#Q2P<&oAIZB@ikhXo!iXM)262l1{duu{?oWF5CM zyf1O$d9;h;YjG5DEAD6{MKR1+4rGjivTy+Tj~zkHZTM%!Q(D>GX`1p{#T*368et@G z$i(i-#ThA#an5=SRu#RA!vbq|zh|?yWP;eljrZg{2MEQBZ^l@F7jfWKFB916a!hQZ zvw$_QEiA1Mly>#V+{AX^kSi#;!&X{wdmdx)FT*yH>Jp?{dq;J7%tASX#!!rhSq|by za5{m-c~qVi)~vqEdE$GfZ?f!LcsCYrEH-woMigY8p60#dQ?Rj&!>sAkY7<<6*^gHE$2uh$g*BFD>P4Tw6}~nGdKVKY^|a_1bodE16h{Y~|I$ zJaI*B9Gw+QIbhg0CprCiu5aQuhwm)3cqX^C$Vc5Q!HGD*7$c`&YJQ30OMMSl`&E*y z&6AV1DO=`2o;u^Td-sO*Uj_J#HH57(6Oz)}%manoFhU-~>zd0B;-~xPWz+r%&04hJ z?`;o+t?nVVZ<;XV=kM0Mnz_D6wD_P^Q2Uui6d%Wdiu9j~KMXE>C#&3E>GtwZqR#v6 zNt;tCMVnk z*ZvN8x5R!L@r{MPhbdU^rC2UtBYbkg$L8Fpx~@oJ$gd`sN7Uk!MK!aegy1VF3{R#p z*0t<34-yGhYghbBiQ_G`kc77nVwPPaAvG9Nl1`qcM8N*=ke>(VUK+&~0t{~MsL3u6Z z-K(Urq>~m{_8frQgJ-5O(!KiI$KDsZl1m+Fue8W+BU~cE4aK1(0Klj~=XdvxKMLWU zHw)R^u2lXbrtmH2{3pIDw6@f4uOyD@8DL_qfbWb2*aIjzzy}!hJ?pa8e`ifDL#Jrg+Ekxt(6y;oOGYwDb!84(-cF%pQ6d!{q#Wa- zwR$Plu6$7xJ{^a|Hp1ctj_TdSmocE}&%E z2?7;iCnthPQTSxnyXYfYwA1c1{aLj8`%5GeUSCZtL+w6TEUdwQc0#D?#E?cS=ARb$ zQ$hHNu3q?;!`hv+jc&}6M;t+8jhF6{;j@4`uUu2)Z<-qTQwwx22`%z-5cNg){g*v0-8cJw541D| z71x``Gy^Av*W(Tmu$XN`qIlNnAhM?Ssl%TrXE z*IBgw$tOyh<`ijn1}LiFV|XgvKKJosJapsQVEAeAKVP>VENx!K`4xP$x%1)?#uEf* zP|TC$7{sS*Eydme)Bo+6>8oj(Y!}(eHOAWQtRe|NN#em`tT3*tX~tst9Xb; zPP1_>!l`)Kr*{f^^0~;b8}SC2t^WYRS9JF_n7cC=*1$2<(zk%(1XxzwNEq3BcOOJc^C7lfC2@;QY(b`FXKNA#b>L{uiA!f z>E&LsL>4z-+ao08sXXN88OIsLeQEHk;unOqi+Sucpe3FsVC!(3+AY9-@sSBuRXs|v z{5Y+t(~t3L$mhh?x^Rq6QuDz6GM`U>72E1piGP=A=Dl)<%Z+*53HiZLI4VcdvLexZ zQ?6LrUuv4YoJ}EDhBQG0K2j?-_wvvxvyr!OJH1C!Ud?Ud1hcYnth`#C&CSCrn<#>k zIaV0nxePjTrx@#Acj8+cT^CG~Q(ZvlS`=st>GDLgFP?L;VTl_m-1E7QJp0#Faa1I^ zV)Z#;%z2KnXOG%dY?=ksO+DGIp zMj`-b`BbwWc=bG!-`@TV-D$$w4O?E-rMcB-U9(0cQRE?FcPMS7$<9bp+2r-jd|Pj% zHMG(;oqrVXhANT+xqvt$C>Uoo*65x+i$a+#^~-4%9ALen672VE?ZEfz?O4>sV`#}N zJvAlP?#H7XuP($>wQ7zp$z1&t_@%4d_?J$!@QfPfsisJiFWBad9qpwUW(MSfiiDLI zcFxn0&U0TYcqjf62(_8CxIon1<=ZEfB$I9PlsR0#&%l29&H**c>faqSRnji3 z^xZ<@D~={jsKzOz7#Q@=Cnc10$9lK$_u~Dzuv?4!G-rx%^6;u;M?W|Sfp;nN7S z&_@{wK{@-U&Hn&oR)m_T7SDKx!dl+9Z*Q%?k!B`X%K77I5{6K%Zoz>Kk_cnL>5BDf zwZ9SgQ(v&tJWUnC>M}DK?vU+91xQBo9YU7D`G-7Yf(`+L!G97w7vg((Zu}Cq_UjWY zR~8Q{!o|i5rwL4CY9l@5NkR{k*Z$FsF7~-{ff<_n{MWX3?z06l{Zv~q{1-#J9 zDEl}9MlUAS8;;e^7XTF_2RN@6@dk~gc!ye!PYJZPnvJv%BHgUcrwaWMq{{U+(>yKVv#NHIsZgjhQ z&xltxw>NP!CZ7~6B#t!Ok{`<}Ai+FjU>**66q?i$OM4%wSUN}7~&cvq;8$AjX zWl~F(T=rq$jY7jfy4T>j)1in)S{qRyY2$Fkc%4ZKp^xaEM zxlN^RFQSfT^Ai}@z+^r$Hx2Z&l&=pQd$pCVB zG`h`)h$e+JtIbpULJK)J#`5H!ZsZL2{&nVmYADaytAo7!CAKA#3RFgRf zisT5?j#%-Y!=-r!fh3phcMBpWAR`hm3FhZ3#&L{+lg}So*tO6j(5JW6Zm-g7i?$oB zq;+A1Amw&3Dmm^kUD$kN>O09EZa)V~gXM!gX3p2fUL~4K-8WOzppVKHcZX;0C5Lbk zrdMd%3F>eZ_ZhDY_?O`e-wnw&oA$pop#}3B40Fy21oRz7cs1|i#u{=%1-f6(EZ5{{ zk|tojVOC*+R5FsIj)aQgd|~1r08Vd`b-lm8xI1mnmIPr50F9vhoM!+A`q!a45R`A! z^5Z6-k>VZ>_=T!lSWl$f$|sX)F?oiykGBZSk5LYY_ zLMRKhMm?*(@c#hB-7eBeZ~Ra8ds$|3vE125_Gx^y!3UU|B<{vC$BtJRuMIyIuXHQ9 z^{Dl!b+%9RcwYH-$2kK4Dk)ibKHzc4uOqzHJX^2bKDFXW1XhA&Z?eM?QdRlf6-GLG zo@)79S1?U%eNo~|PZfC3!++sR*|gmvb#12Z?lwakuu@IBDRd1dC5XW%ps$>~Vd1@N z!S|Ee>lZ#{!!st>lzDPzqahqHAm{ngU*6o#@TH8h{fx!A0Jve04lqDFly=+dGt#Q+ z_qP|e_6;YMaRsL3P@&^s&4wd>@1Gq3?di=Y1lFeXag}L1Md&|4@Qfo*lIvVLg`>ox zNaTnkq+_mJ9(ndT?N#r*f2nv%2w?E8w{vp_av^tFBMtrUEQSf5clO*6sz{@Pd z4jhh7cRv91Z08lm+f8R}BQvj<8AjO&z(d@SI@e{P_{Z#CWI_>h8Uo5PRX1_-FdK8z zzH3W%Gu57Xsa#7X)5KiP+w$(`c`Q8`@<$|*G zKb2ITh1po@H9cNW2*@ohrU`l#Gd7&c(A{B(-xT0)MkB9Ie!OwIexI)E8f4mJNi-`Z z!${36ayeXNla*7RGr0aW>)I-OHM&I;AF*CBkIRc-xGf_$%&HS$0CwP4s$AKP6IYHe z4<)78nZS6Xqn87+xo z2RxKut&dy-UVE!)9z(XtJjTx>7$UyEpHZ}zSlZUNS9h{V#%U~6c@gi)A!j9vudm+E zZ1p`)h`ti|5b02B7@aPzS^oghEbZ>6n`CNO%KM-|GuH~Oz|YfYb9E)vT~YCGhV=+6 z+9+?cD3YMgHFTxA(( zaazxo^0UX1ta!)({#DOO8CCNDC3B4S&!uhNY4^4+66!ZX${BOegWOhQMb87KYe=0@ zW|fmR#bMM}qUjMKWb!`F(nwSRAuMv;1~Fb`YaxY(c^UN0dN+myS29a2+_6Ur6&Yd! z<+1=p$YYFTk<;-N64aWK_gVEtSsabA^e^Sz9PzSC<}oTp7YM8zjxnA{;F|NRy7UrX6V}#wb(mJ_V33f}v>TX5`^+v1o?8L3F^+0g@2Hd-F%sr@bc#x0 z+L+LmDY(h5y{D?kn(15GGLXJlr zdYoe-^6x->PCIxby|sA4h!*gMTc0q1!Z#o>WX?g|lj&U=_+IN%(jiSs<<)JHLnB2f z2Fe2;$$T4 z1LbDrK)?ee@#%~YRJqq;v#@LJdh*uoV2fp;ypXcIZr^$@EGTIZ=PvDnJx^Z|@h^)a zkSuz95v#I=-t5iuo}_Nc{c&1El$$SE4PQ`&^aw4IG&cf4BTtYxAwfHYd0d>Gpy$3g zuTQ&VgGrA;)Zw&>duXG0#E~?p?!=P$4p_S{W!gCD&3Si&Ep;ytY9C^UPz!^DY&M{F zJOWto!`mXhleGAE<9$ADGfKC$7p-yru0qI&hiP_M3xKLn1Dy5koZ_j|l(k4XlF^x- z2-CDn4-nW78wg!|hFBVSQr%*9AG>0#%oq%ie84fmuEWK@2EH8Ykx!^x+*{h4v}F%! zV^Ykch8qb&agK4%Op{#S#SOk5lTNnrMXXwbSt6HoxSDf1$arQVOh!{~-K(&i=bEh- zjQksMqg~j?aBZ~Tv&$?JNo(gS&Il3m@`4BlzHy9zbCXwa_ZX6LT*)3yqkI_EKj9#s zMezOPdXvC6fWSh^GyFieBo9v2=r{iWvyY1>wORFBjWPt00blf_CmlMEmmv1fUOLy1 z_%p;7+6K6FNOkEYx!hHuwG2zC``Gn^D=kPbgZ5Y9#{j*QJwUt^y zJbq$jh6}d9%O>t}3gi)$9c!wWvy{1dlUkiQQ(OMz>I`B)6JCk0Xia;8>}fr|o`y3Uw05c_`Hwho9k*j362rG@y?60X!B_Cy+1qK?L9VVheTw11w`7|E z-DO!7(o%k)j-+C_Cb^ZEDL!l1-0<&>JbM|ko<9%WCB#i|v&!;_{MaV}TYf_?%6V2Q zLXvvszH|7U9;^MMb#H%Taba+dOpvmxZ6_R;1CR$Ccl7CBLwFnFpNIY(>vCwCrOonb z*9vnBIk-ZyWlG3$I9y;IjBsn4x$&RFD}NN+YWMdu-AwPk+VR@CgB~VNiuN6c&w_Z6{{I5qI5y>X$>a~8AVO;7Fe2bH9>cw7OKyErb` z&wN*~_+wbrwVwygb#;2SI;bfmD`Y&jD2H>rnP7nJ7*!p8Dy!G1wWp=cexXWg^M51g zn|~EqT;DF7JTn%EO|CxE;$gRB;t8?<8=`Eu^KP z?b>(7Z3o1ut9XOLHa5|{i*0$XktC6=0)6ZbLk1lSVMncB_*3IuZ&THdzk0E~s$0md zzD7iyF31A|bYYk&V4K?tGHdgG_d)STg0<`0J9W8*VwyxvvG3g)lecn#gM}GCopdnj z{{R*|OX2Ik4cgw^-08M|y_(u(MJi-D;E}wJGJ0e3t+{m2;;Dp=$o*TtgTek6v|UqK zZ8i&siQ=-C&ReU=41~03LLJBqs5BSeekHr2t`$e6zO$D^V*5tHp8*e10 zC1+icfWY-b?mLe?(q8w%Ho9b5=9_zq=+;={jLU>*{#BJ5bI2HyNl+0+bDvGS?MK8K zT+gjTWj&>p)P$RlDtV`nI}e$POBy~H5y;8ha>tA`jHzMOJzKjy!$Hx05?NhMs4eVz zR;zChk$EHm#8J6yqlpA79!bE;?cM2IpNTa+BVDn&xwD$rQ=d(ZQaiYQ(Q2-*pOMN# z9M2+=_qVe2B%W)-In*Z?Kz7Mi{vcLN%{2#rAg8 z;FT>B>jW4cSXJNd{J??EFnGm#evP0+x^IasEo}5iG@~fIW2f8$G~vROiU@>2?u@Ab z7hGqd9e!)F_@5(dIz_78TgI_v@iC6p z!P-JH0C6*1MH!4>kC|Am-PpzjM<0N^C*!MIZFgF-yVFwkCVAIPwURikBu5~m{$%nr zo3Io*s0TZ+2Q}l?9~>+#wCF7)(ZshtTZXx`neD^505dWStByYD>Ds*eQuyPpMgo?$ zvX%v8x0cZsIafVPl{j|6`^PPwb68QN)zyx^gL8Ao>sWB#YkIRP*-3LS1CW_uqpt@Qw4*M% z8qv#>ddlb7z9smbq}^!9H0ef@C~+c436eo1V1@HOU{NwhDj9eqZfnJEJ|ye9#IGK& zelCs}#6snFhT*`#JmcHxTy~S-%}d1B5k;n7o@w zftp~*$85#J*{IInfpwVh$De%EEG9X3+MBatIlWk&x1csVDxBNf=E#0jpX zj@MVvp5I25RiL<>tTwxfuU)GwkwFxT}tW*o*Y?ZAbU=M0PHMlw5K9(&gh zscIU$aof4n3%pKQWP~g(3XP$iRA9MML1Hp<$*)@RSB?A~E_9C$UQMh7WAj|X974VJ zd6ANH+XNBlE9IXUcz}OsT)|~)Br!?G_5}-()b!|om3o*;ZL2k7j=f5E(^J%R4-slM z8f13b4!Iq*#jLUwg$qY3?>z+Q%1eXL9v89Ac@DMW&3t%*=HmKEqmiUL)k^}+lb!pR zmO0K#5^D=WytuK{A-hu=ZD8AV&|Bv1g6%Xw=S@%`=6?Jhthp1-Yh9uDyp+Df@se@P zZB61GT1$mpR`dHJIH3y3=7`oukBq1vIv#`MIQ%dx;~hWZ7`l?i?^L?Fw!PD0h2xPz zoJy*ou~N9>Xylxe*1n9>yk{1x6uP#dGDsy|^D$L9kZ(dso;RhM}cu8ePS-dVIHQJWOMi?6xRo7*oBEmN0oa8O2u7 z{uXFD_JA}!Pr|UZ{{YDU0BW{!i8IH`6=WxA#|$>8Z(fzrfX%5&7p)se!x@&&oUKjW zA3It6Ue>Pl3#oL=Wig>?Z0wjxGacL7gjHxrZBHAh_dJ>h*DRy|Y|0sYxS1VXFd1RKL*w zS4V&F*Fy1)o#%-3p$kEh#^MPXqXcpC#UNG%c3oRo<*6Zhl6rcN@UOM>?}S&;~V5ekTq)hR+1p|-A=}ofuPw;x{R)*75y3{Oo$>v-`I*1!!IOUE?^XZzLE;fx+ z+#S(aoGn@wQ%A?f?(;>uisMhYktd0_AnCOB>(}dE!{I-P&>NWT{9$U%Y88V^6EeHG z=*&SU1JDd+y+6g4UJTLhr_(Gn_J+>c-6FeoI~{lmPnua+gPiQ^?NfM1!d?J-7x6UO zw6N-NIhrIyFvO!JM#Io?f=O<@1v=i&Yu}B?rsWl*JrW;^HdY=N{>bpgk3Ge#35joR zgp>WHWd)cz5wT+*cW&MQ&r@8Ffj&6cT6nCcp>1iW$0=Vd#x{iV`M})YDLCMqEqk|y z{9mK#^4V${hP5>4@@}0YmT9GRCj*4Q?^GCiu@n(c7nQ%w}(MuSwy!ss|nht zj54n9N$69Y`_*9Gwr4ITHh%Os>TuV87(7Ms2JL3>QblRxz9owC7$%ZHzjUmu9yLAw zWvtCd#=4vr6I*M7X=cE26||^@ByobpL@1}H@RECOua~|iX;)UO{kh@IQgG0(mp!EO zmh$n&)Gf&$?6D+!*PVE8;}40fP-&97+(uXxNdXG1x&9SpUjCKcDY-Iac*{xBe#mU^bz6IIe${ZO zZyR82G4n0Lq+Ei#az;l^)$><`eltaNJKJlv zEhXLR%F@8(@E;;fj=4S%7Nd~ zyguJT_B!W2|v-doN7z4KpkK(8`>wgC6dSrSYmExOyBIX2f zbuFX`nHM<<{{SZJkM>(6{WDv8D7AAq(@EOLQSn>$jq&Ziw`ry5m$RfYpjo541~44* zn=yvkRQ@$vPS!p=XxdG^#+$F&Sx0{%bhWvBNJElJtWVW`osVAQ=Z!o55O}qnJIdB2 z)~}|We$ghOY8K8V&N=y+n*#?UA6ojR*TugIJTQrMpx&kKryNR+8G*L5vCBAMjH{OD zK3op&t)ik*-NUa!+D}Lhy~iH?wBC- z>U?j--wixvtt{7Cj){3?qpXD<;%z`ijNK!7V`h{oEI}nV4D>bMX+IWpeNxm~>uAvh zo6R3)Xh=ygf4nfnA5_TvjdF+L?egDEryYIMPn5GtvYS>X*yJwI0Q6zkipFkheF>!I z-p97s_;XC~M~1Ct(x$qW=q5hPV=T8Dh5#zFMs1iOBRORxax22VBwk+L$!7Won{R6@ zMmwD+PP#83W@djfb0-WKvE_yaFg1vp!=fi>-F?-3{q1;w;>fh>rdj>~tMtLDX z^sg7!yjw1+!qzbDZ`@!F-1j&HpRH(U_gY=F1&lI0xI8vV{{VoD;=1EGMkv$SE{Cos z#f#lP!`g<4585Q3Qf$j~*A65c0lAJyILFEW72|XGvEr6UrJ3AF2w{?0v)3)0{u#w{ zo*>qy)UG_cIE)Y{7~6&?zI`j5jt0i&&V3JBC3)*3SW`&q>~hfKQEy#FJPofkqVc&UmK?r22h&QOJ$%Y_6h>hIsmMlkfP`9_*a+CwTcu z+72)~Qmb@Q-6`^-U5(|sI|xX;$Iq@XKPp2S+&1YjtTCMN%}};^K_Nf-^>G_?hB%dr zW0TsYq=+^wAZvH?7UW|b1U!@JiuAt;c;4^Bx{_Z-cX4jfhAh!GH~Jwr7gO>g7Pem@Y|%V~EEH!-fnf=iF}vN6UA4XQf-022m1d8$r-Rypk-QQ|A3u|?EZYH%;iD8mLtOgGoakm)9rxoPd--dKZwFSA-E-o}} zR^YKRT2HXL^(oj7UOBHVu<>t-?X5GbYLQ3h$^N=2L5?xkA2Je0xX;wq4!h#r25Tpi z#WLnwNes5vu-v#;Zb(w2rhUNl#Sy1A$W(bg7JWscd{NaReLFzBd!15NhisQo#|&we z%I=km1Hix-2Pc{}KZkz|^@(3w)e}&cQGO(UIpaoN$_^N81F!==mE+dFF4Bm$n!)0^ zNg|42B(nm|xpJ$ps~2S$<8Z+=nr+D$`za@Q zk?X&+FNS{!x?Ky(dWciw))A zi(G3v8+gcx<$`9NKpbx65P|KC(tN!~?Q12zhUbRj)by<@ON&ysYg?(&VKz{&+5|gC zC7Li(>Pf)$uR)JaXeBes86;TpByG3_xF9bl{{Yuqjqa)8K?^RE;+S{=iis6T&vF3W zkIOa9Uux03Z*`(-BW=5`=|B(WbIfOcj6-@#*JfWx7RE(us6y3ye{q( ze4us$zWnh$zLBi?aZPUVDgaB{%Ft)o{I*@+j(XMspFq=f9X8$w%Ejd}pkKbnj02OM zzb_)I+cXsF&YrPn=ByvHPPrA_*Zxem9zjsn(1nOM9O0e155m1}``|<#Ak!^vbs*Mq zfWAa-{(3~N2g*h|{RywLZ=izYM=h!oBQxYiLn#A;mE63Jo|&uKMb?Kb%?FhtPXGc% zxQxU@5y8RWgYBLw{k)#0j~QA|R(x0C&)L(*J{&OI=o*HdX%tRaPUzuINf~8xf^q0E zNoV^xc&_hPxWBpa5B7n&-S&xsHq;&VsrBeFUwYiwY0^q3xGKtroZ+yir(A)P-xbr^ z=+eUwzkzmvnG?$3wtu{ObgNdDtr-1kw=-#M!pwUE%tS2GZVzC9_^~cuo+|6a!!$SJri39ob2KlENFzS1%kAFDoMC@O_UR>x9*OPWse$ zcN6MySrn06z^cYq3INK5I8q0;NvVZ9yCb3yNv4kn@g1JAq1;VtBRUYx^PY{5OnUlP zkV|!Od3vb1+Z- zm5f#qk>*Jgnb}C>j4lRo+jUD;mZ!F=!kiP6I)8;eF1E3OZ0~ONOp3oL9^aSin)P~-Y{K&^aq@JRtA&t zAbdUXQ^Pbjw>B_0l@ct1HtyOYQJu_ zWVDR}$SvXdcQ6M8g~uN@c|CFMUa0m)eI{#0m@t(JhE&_fImp~|@6CLv;J=HSPlzRw z>r1@1c>e&3J>e(F9EOjm@9HbwY`!6B+C6~0)`ypDNQxE*d3St}pbAoLZg~==H7g`| zzlkjTOC8Yg;D$>JdxVr5|Dup=P-0qS=%IYocfyg zf7$Cz@x{%h){UoWv$d_!-@On57>s`xu<27+_%leCLS27KvqjkL`-#rozz)6gGx_wb zkAxmO)a*5DEe75fxVl@jIFd85{{S2S0s!i6t61-HYMYD}-Or^h{sDYQzEgB9 zuU2_TA!Q1SkT3@<6ku`mu4Cda?D^x39>Hb5lGA$IL$q{t5Vt!ZTd>qW0JA5={~EV~dbH&RIs{r*Q9{ zmFN~;9q{#~#2TlIJk-Bd#`E4c(e6RQR{nB%idsbF$-5W~3GrW$g z#G2oQw7n8od_Og=t8}*LkXuIfvaeCl6W`6_i@Mqk<8;dk+#lSfRPyvq}!T{Yc zMR%G%hHU&NHKf|Ep)K>HDM@9G_HR(dORpqt$@xzi#}w2x)Q31mI%>%LDd4L+jS?Hb z66-e?cIGs6fX5n1ZR!GSc zDniGJa=VBOIRN1Cit3DCE&3jNt1fG{co&K9bh!}6Z!%6ipt#tgW>PV+i;Qj^@%UGU zUHlxERn)|qSa6aJ;h-28Jf7IxIuVY%SGoLf{>89)pv|z=V^T-hn*qyrW$F$&?~20s zQ$DY)=~ogw?5%0Z2%(%~?=xhMynlsEp&i-l(8N`YZxh9JXtfUn+s4{$-`ae}b&yRM z-lYyY=O4c?4+8L}POtbz&59dXtL#3&y?%8jaNVk;@d8^APtD z#y|mA1f1jVVC2`&UOdxmB-ZS7KMUKc$#EtljzF$96NO^Or@cg>9nShSxwK|?g8Vb$ zx7Oj%k8jkI}9C7*A(aG?x*>#a^;t5+*v}IKy8NSY&jyY`dKs2`RaC&#&cbZX!@nv$)k9?RDr*Bk1)oz^5k+? zaL#d#{MQ9qucI@m@5O$UDPFD%?h9lb`b*=-$TE36rpA{vPRfzz6oG+CpB8nn?$ZF9tWkBEiq zv~0jCq-vX^W7p>rXFV&h(IxQ)ou%Hw*D(EtCRZ_BF%Kgi2#HTTcg8sAYk|@A?+RGz z3l6(`J)G982b`<89A|<8xAM(;KBKL8dsfpHZw_27{6YT!cqiQo zcCpQfr3+at4P8&bYpWy|%dW>|ZU9JjLdzK^C9qw(vFpb*PbD%Tnvo**Q7<_$UHj~Yp73YBvVRJtx=1IEI)@0i~)~ME0ED{Yr!BcxjQiu>y+g;I8PawA zA)?SV54J6)=9YP60bVsHICc3~A77~EzE;&VNVLej{Vw8dts#m?Bm^9e{jv{g-YKnleb5WW-OJYRQTg5g)#70?T1gINWpObe}#eDnYtJ|x;5n0+m zC52>WQ*4=5+nvf8RJKmsdh=gbcmm${;sKuOIAnrjB&{o^8W-Rc&R8#}eP zSC7v}20u9zjE|cbz|P*B*HN$7T6k;4R+{gF-ChI*<+i(-q6DEFERird9YH6pdIyUw zwVf974LeZMLrgb2O$@0jVTtG)YX%=dPoBrYH_H?^1ueYjLLas+)=5wB9(IO3h$gUg zHMvp5UvtU439nyxuf}mvbtM>*4t@Jp_lQ5?Xv7Qa>Eu}~gLcQp zKtC$)=KxofrG?*sd|a10CHOWMav0dce|Z}o0LDWQ4+M_Y_0NaAMey&!J{pGS#HI_) zXEK={<(}X^WF|5raz-}e91MMHrPfi`bDIlmC?m+-Sk(NjkhCEh%R36(qp-<(!&jJ#{(3q34Ps_M4TTQ*~c2&8DHY>mJwjl+!K zWRI0a3P2Dq&!#6J={O?uzkx_p<%PGxCs?PCeBVXLB9OA2e@;gsz29jDk#Yuu#LM zdevXJs?L?H(dAw%@eZYbI76ncj- zLh@VOFv0~SsQ_SP_VhLH>F~G1{vYs_$B%Br8qMH%9in8n3Y#N>5w$*Jo;?Edirb#rGm6lbw9(`idM>@E!FvvxuNA(S1d_%;^1fnn zS0J9f`ecrk)cAK)md47`<3)}wHcUubTe}yOLAYSJF{?6$CqLai>we4PRNfoZ?ku%U zEM8h(xo7f--5`^P-MLQe=eZTs-Fz{!xzeK4w25^zg8u;bmX>nuGAgmR0|J3+<#NQI{RyZ3j9Z!~MqK1R;b>U)3(0K7m$zap!{rfXU*j%C$R zBad*wc^AwKMn35~k3pOY=t&+D!clSeQSFoXjB3zJCG6_*DlTSIoT`okbRds@Yk$BO zHd@(vwJ8!*h=z!_O~CPw@voRQeM-^~58O!=*7@aNe6?-7FC&gJeQT@uVd4m5F{S*9 zAeRbala(O$>+4!Y*yP1!{{Xs_p}F?YigeR8jkvaw-aBwak^vG4c6B(A42<)U-|1dS zY2tkr+Ig*RBe^MWBA|ve+vb7JM$@rP1hb? zS;?ox+aZ9%4*9F+Ncs6fS~6`|-s+b!Tv_Q?V%+n#c+@T%_;(h` zIOF+O4W`TEuMS>4?}uk?Gftlvf$=I6-{m0j^lmHKw7ao!``b2W+}s0#7ufTTDqj>X zn|Ea&+P4M;RdCn}`TBqX=dEKZi)$NGlTTB}wJ#j_w&o&M`6O_}NP-ZF@A9)aDt`}Z z&(ZX&?-0o}o*te%El@7@w=cRWcJfFKz{g%k<5_+#wb1RZ6YF8pzBZ5VC5$AIwb-?eDSvcJG@bk2N#bTbNW$`max|;3=m=%*GTQ|t8 zdFZ6C;atG+E$yVF>$bC8eC9*vp#_=hbEe**2i!5ic8-}^L-=6IzNf+-X>46 zvp2~Sl2hdzU=qY1UTe1S_K|yHqh z4nu9H#3a8G0;HnRu5 z)F3w(5+TG$%Nmf_eC|{LmFbNB6^|CBq@v9Y)UO`p+BUam>R7SIPMG{_nbmZiEiMxC zMW4?J9>gN*ZmR;i?RI+|#GF=wRwDk&bHWuw7-kjMMU*&~iKE*J?J zq$=mGcJv3i73SKXf^-crTUxuiw~b?5D7SAVWMv_%C62 z;0hKHfnC$43jj+Df(T+i8shG!yzyc#k#f^m8%^x)7C+u#aH2iQ&UgfoRVgHM!fNi! z+VHH_x_+>N@!A;fqhBWWWqXL?AeLP02dNmwKRWF74;}rzu431``>QEYAd-81jFDsR z;aOCm&s<|UuN~C%{{R~3miGF*Hg^zd`$K)9lVoq@_jL<}EJstp>`ikrc&Eg-Hg^`1 zzuENZB}<7QBL&&c0|U1#2<&h@Ij$Y1$G;hC_A0b6po;~PnA zbpHSv=JkCyNx!+ZnrJtP4)YVlP$uR)b==8;_qulKIn0Mxzi8QQ%xef!^9(GC4^g|V zVrtsRyGSFqY2%hPD9z?GZpkMkJ2Lm|1#r0~v2L$(dOrtg`hKF5*hwUSA4 zEu4Yaj@8x2;=8X8OmDnH1X4#H5M12D8n_(??=g?2Ya_t3-Cx3NtYa&65ot2ADlD9I zV8j9X{VUM5Yn=mAv4+=Bw~_S=cUCr&fNkd|wgyh+JdQExT(U{Z&1g%PHisMH-xgW; zh{1WF%L}v-Zz(fy#YrS1sUzkGr_0mUx~(t9@XK!|r8b_5u8SI^EWf)6*|2~y^*G7z zURw5AC7z}InXTJA632AN@sPQj`G_5i8ts>4_yPJtzF)T0{ zO6&?$WR}StG5FVAHln#=Ys+F!7VS#9Y0gewXjORQG$U1hrs3e+{=j<_q#j*LBcJ^WN<2dQbJ*&U)IiF0v`$n-0 zGHI&IB%!1EhfIWE7=!2-g*Di!$CpE%tlTv?oBelCv%0-`w6wZOn1dl*s}m37Anil$ z4;iUEE2`*I!w!$H>Na!T-Fd8p6?BZQ<|ip?(7B=wOxW?n3mIf^2*(PtL803 z#Jc{Yq$CsSH}b};n76urFyViQIby(PqLIaBHml+r-C1?lxSng+o;gIa{Ny}X36R-R z6aWAt7#@|wJ$GlL2v2l!7tYsa-6J5$#+81-wNYB#);31uF1 z<~NbKC;eLNAmimgSI~i4n)ah-bEh3TJDBIx5^~RR7?qSE1Ay*BzSHu7w0~3Q#?yCC zPS!f&rnG3g@d8_04-sD2LSEQgO6e?SKPgd*9EFXY*+A|AKHOrnVY{`S-Appaa~^hl zoG>`|AlE~s_)ow(gqF*w&3mUwy z{Pwe0%FP7#7UBk+FeSE#{LBmwy2=R{=s2r*Wi3$UT}MW>IPdsX8jh}Rbvt{3V-^cr z$9DT#Y;_UIkcXc`pIWPF;Z04n)2Ls@8p_a!#FAoER`lG&sQL=uveo0&uO;yJiC~iA z>hkJ2R`N%DL|FXCkC3Zye&`_nRrMB$@Q1+Ke}-=5@htxUV}^TtS}gR|Y9CuN{rUR&C0m(2#XZ+6KWAaz!WR|=tBG8I&R4gdsT zf!4iN_u<#}e7=6072LXgqQ+%NN?f=MFhOV=KkR}OjCaL&cZ;lVydkB<;W)0o*#*H% zxG$iS%Z)&8e5jcf!jib>1B{BTY4JB!&}EwH2o2=-+g3}7l#StW!P~b#Fa#1w1aNRp zclMBqQ6e;_Q{RF;LtIHT`@yT|R*MP=H^A31NhGM>!Woo>=b<}AeDSR7o+;Dy=F}t9 z;IeyyO~PARjmk+m1I~}XKTOxBSa{pSn*55o_NnCAOCW2>CXpI)xfyf~vvC7}3D2jY z!SVi!;A^|tZagJ_sNY$9zI3w1y_Q3fmSzjVAZ@|oxp5JNSUAZi9?$%aic#gLp)~K^ zZTFOPUl1kTyq1vZQQuE^Kv{0)U9L&_yvV|Q!1^xSde+Qle+yrxqv4y!(e)^|23r7p zfs>M?NL-cej^nStg6VVF+3HHSau`S?1|*(y)a_G_E8d{-4TO3emRfj&d!5a2RLL`A zAgE$60r~@)=BrXsT&rWMcz7jy9`oSqzaIF;OK%Wrz9RG9NuJW)ITsAWsLV^kF$c3} z(!C$!4}|qSGf1(}p7-sLBE>YfcZ(!3EzE?0<)bPWJOwO3;PtPVJUioyT_;VA^y|58 zbqFT~Vhgz$NXs#7jjRY9at(GjK05LCxnXyxS@@Z5?$t`kXQ)K26T{B~A;DqT9DQp_ zILb8R$kmzUSHskd`IA;VD|<~E(%J|$TWh;pJ;@u~n}Kr+O6#0q0+rxr2CHkn5BPno z#Te4e2mW=~` z?bLq~4&6IfD{rssdd2aE(^E1euG`jTZK@7`h>pPZ71J7#-o-|hPOnnj9vju*)uhu! ztXA$HY@fUV0=FBPNiFrjtsPV0-M!RLG8wF<^Tn%O%ko;htJEZp7B^fBkXtx4t^WWB zrO~!6rrvpzWlNCC#N_qKC9pr;_Q!hDKMHkicHQRGFUU+5#vgl?9DoM{J&6ERLNaee zb*i@2v&Yxq#b6D}{cYX@ENUlJ-lc7kY5`*it zlXZJ-uYt604oJ}5Nca0dB(t}Yg#Q2uU`ILk$E|lh9`Lt^b-S?Q*41uhkdx(rZK8}1 z;ZSytop4D%rF#iY^0Ts@Y3#k}JD)gdR(j38pxT#)VZV`Y7&P$6xEq1ab;=O0#-+{a>t>4M1c&}BHNw>5i z?e+yS%IbOrECQ*|QV%1F$U!+2K6GG@YrLwjLL|u!74_hwRM-BU(kPinP>dNSs*YRG$ zP+RZ84rdY=^U*;lythRMuWH=!e~Prk@ay<*!;)L+cSTLR!kT-BXxl2u=DKWF?YLx~ zaBIr+j|$vqjTPpzs?X(I0Jk>w!K7kThVrBt05;x10DyXQ&05Q;E4DYE;-wvBYaY|# zpV`aB8s?Ecu>|RB3MZQwby*Cc0&|{KSB`fa`&XSmg#1pDq}CeFmTe|xkIW7e$tcBG z6*$^(GlA+W=`RQTNU^uDZ8~O}-%J4`+|lKo0_<(khHQod1OxRv*8$=!cT3Z?8~sN_ z(`~M_W>wp2%6?Yhw2{doD=E+Lf*M_ZpJ*eEsHAHKRs6d6TAc@l4V>`0StXTHizgp+- zylwECQt+MB`lHEjt8HTxF+50yMCLvFV-kW64mYyoa(h?K8lR0M)UC{x_J(4B29$p5 z?vA8`l6_8cYpb2vSWt7TbncF`$J(Zqb*^1$P+du^+4-TD$qgKV$iol^7%k4$J!w2M zscRzEUk*T$e`H|3_dt_?+&17hj1OFZ2iCbi0YN3swf(1eYL~Xq10~J3nk~tUj=S3g z{u!;^N5*n#ej;;Xk*$Lfn4of3%Rj@A--B{$Cp+kL#+{XnrP7avujTO+a$3$KM^g^r zzhMXF%D824K*1gA{2v$mX{$0>*hK9l(S4tEyQkQV^5^Ex55HQ#zw>0e`%5NlWs@<+ z09FBxNZ@mi*1F9fQt;GLXG~RtQ=I(IbLEKt0C%6`;fC|U3_g_?Xr~yx(VbzV-1vLM z7Sr92v|L0>F=hopm#Zo+LhT&joSO7)N5$S2TNw-yyxRws3pbYAdHcf{Cq1$F^sIjp zYtia$_N_gV8Op44GISe9KyU^-abGj*x}EvFm1a9wafCb*(*NF7WJj zvuRCiN=(3+ordKA&m`1JJr0#kSoB>L1cb?TaBZTAT1jOM zl0fLHqzsaM>z=)y_f>*STePr7#}hZo2+tW(dE?T#n~8OIw_7XOgmAC#0suOnKr!3a znQ^P%8#L2kyOk{zpWN;$r__)SHJYWZ$7ZxF$>HF3zR`yn^5Z$k9eMWls#=A$)x0|` z?HUmwz*GkqU#?F+=9?wymN-#mA*1;?$m8qlTRJQk7?S6V#Ej{@wpDQI%A zLvJiL(?6P zPoWjp!qG!wE*eG2FA^0_OS1B<_#APLC}XjA!xr;c>pyHr%SjSpS~3cTZkvt>103=H z0M@Tz@cpzhT}`U$ul}DSC)vJIS@J&a03#sd82F%6oekv+~;V4eulf2b4r( zEM(kC&Oqof^sOHfEvBbr%(hms%u2W1WG)b?2cO z>&`l1uxsawPYG$)hTBrp74C+e5Z)DwO2iE1m5`zh-9b4c@UEA_y2iV4t=af;T{0Pz ztjTQ!`JOvrDOMs^DI&MalE8EGV}|HXcNch>@?BZ#df$oljW5Rfg@&;ml6Y%Qjn*a9 zwD|nnQda~k5@&P(fCvg$3iT~V!Isv{p{}8d2_cSnbqHG)^7*58%*}>QTkmo7^!STg z)ik{>23vC0&u?}jxq&X&D9QPxNL@1d0~yIa*sr3z3-MpVwpYAM^1FSa3>w$;c-rzG<=eE#hriWuDS|CbmapM{9tMDPQg*?Q#!eiu-Tl6_ma@hR*xLhSt*Q zjE!)McF`r;IQdng85tPH?lataaZ-4{#2N;X4uda+Vv-Xdm|}wR8IYKcd1$t<=b#K6 z_1&7aIJcoubBeP*N7CfG@J^{Eymq#i6I)4#H&CpbSYv`55w{~fE4ptN_)l57OWzat ze!x256KNY;BV(>a1~PN?{A=mYhF&m_Sk=y_d!nVa!iF};(C?iYFj>Kvw3%G+RF=m> zp1wcvPvJ3^&sy>Cg)gnI^u@TA;(IYSnR#v7S~WkSqk_3m+x%DXLh;aqmwbkqDh@q8Ch$gxRz9xZuBd?KgN1cu-0$m2_B_r zBaPscpY`POALZe(g5C38e1G9C(6x)LTf}l|OQt}MzI~LU=gmd?r^{7cppXwCao)Vu zn&9J6Q2!9ik1=p{6&WPFk0sQ6FY&LzHpYENLzSS6hHJP}&xmKCX(BGFKimp0OAx1L0C+^ZP`qcO-7XXeXo`UBp+_wY~c8Q{U7y^~EWHv$nAo!rEURzr|H z#Uw5PIO+xlIqquS3XjGb0M%{uy)VQ%iXHMSqSDdk&s@mO6P)sLjNFV7&3E#)uNQO7 zZk{BY9KF_&#AHOuJM_gkd^%xviglnI( z@Y6N7gTtOEf_sTqFKIY*BRL8Ss=)|LG4=bZn*Nj$R zMo>uh4UGN(pGx}A!@9qSt{=;@)1)@jh~*L6M9hi1g!xfq9r?}($2qT?^<59fT4_tk ztjsb;vIi{y1(mp0+?$h=#~y%YzPR{TVXNtS6uPu?h*H)+I^s+3E#VEOj5v6Ia3h4E=t~_+@Y4Y5WNu znW^}Q>C-!<+^u8;S5H311toV@K3shi0fUlyo;a@={0X{L)GzFA*6s+9%WpD8<;N-h z6$M}A$i@j>yzofoy!XML9yhbc9mc5@l-9B!{p#-k=jJScXK3h6Wln_YPVF1k#r64!&3M^NZ0=Wv}L$v^9{m%o@}Eo6zs{AXRs=La4X=C9oT9b4~W~ta5dao zg38fsvJMheB!ns%%Rc29``81FXC}Vq@WrmPX>_*sck$mm7YNTarL=LWk6>-Pg0WWi zBxGQYYn%P0*F=}XQ0tm1%G!>dcL2G&D;{AJB&o2tCC>0U0Bz3)wQq^{;eM#(qj*Z) z56;OnpRimLtir>KP*-oYIh{zQWaZ}NrnPcMcZiyrg7?cHRS5` zJNbGYt|j zp2HhYUt06n=F~LXq_~PUP)WydewgCD@4%lBwe3E_c=a1eCbxVDr#V)PjyRBw+;#-w zhWS;>=BXVb&M~|{`XNd2PjJS0R`%01!drZ&Am7YpSr)H8`yg4>}i z%_~X0UxG26q~!kqcOdiIBS*w`elPfqt6Lj=HbWBPGjkkoBOzc)hEQ3sK;YmE_oVQT zfr@KKMARpm#`<9Ex_CqdT}JGD+qfgR9l`p`aBA$%Rj1s*(e(Xd?s(-}w-GU8Ft{qq zxmb{6DxrYD93J)Qx((mh^<%5qYL=_3*j+@Hip;`QJc8=3HXn1;es$_=p=n+gv4dN+ z(4o6~f81ZA%5EcFs7Wr7NRE#tGr55r=N&7G@n6I}D#;f2!9E{{OM>oIl11A*bHRhi zir_xLACN}g{SGr+wHx~g-i{&5N2&S+;=cptldB2#kx`Mm+=VQ^%;suod*Thki3?m+)C#c%SUL{ON-`UdIf8{McCIW-BlN zAG?(UxTo!&oXF(*yyzy^yqWX9i>cYTHk!5Gr6h4NYcC>3xQ-xk^7(R@`i?RP;B%Vw zp9x%iSMhy=Sa@pM8{IlATff^x2qTEO{x$*CMh3S8ttPXtU zdn-t8ce3RbNRK29r;z2V!9FPbPQQay(&f^$v2kH6EN>%$)r^kMl0SA>AOS(aT!Z*l zs;Ykp&(A44IF!6wb@1oJdh~t+)U=ee)NS?yaSV3y+sQKHY8hfk_eWjPI!Nh7}|x|=^2tWo0SCAdc8U|a|1 zt}~9+_pJW_27VH1KVySan%hRXHc`gOEOGgAOCJaKs?3GS`^21|(zyQs8~hZ|v_Sf| zgYIB!%TxtmRa=W`5tj#PWjy2DkxSb}yIAz8;u3Z~QhQx@Ux`=4+CxG)C7sX}Ey2Lu zkO=FVY6+ad#|jv=wD|6cQbbg8I-;|mB=0Id&K&tr3RoD=FzmPs=-Bmkt{{RB6+rd8(r_gT&l=Dp5bnJY^MUCaoFrf>Os2JlXoDW_rhl1x+lTNv| z7I02xU|Qlx_sp2*2*)8o?m)@)#bL!^cOr!s_I?Y$&SB?BpZn`zq zhvbi^yv!fcH(%* z`BfVX4`MKR_XfMnqDRp->v(Cjklc#HE28XCsQy)rZ52xn{D|zR#$nD*1^Y$$q_5u;dQMCp~dg zygO;|jtwR|{RhNa!d$eaHcthtOMr2?(9Xwc^xK;6p4-7%ME?M8@ZP1QE#{WVac!tc z9AwEL>XNG~7Rk>F69We|lZsDM%XK9udo$!O7<@QQH&BXQB01MgyO1nXKkqiP4Z#k> z*BuE9k)Oci*s!>9k&xU17%}D%1Nm>aKYx0#0~`V{K&)Ek-&49a z8=X@~-96Zlt!GX)PtR z>gm*N-6Ae{9+jeSm$@UVomr)G=r4!5)|}cL7BS5Puq%17M+Q>_9z?1NGqWF7ZY$8! z#bZc$K+xK9&Lk2mNwgIKa&~jH4!g5~-o68})^GeXa|P;RNWsarB#^o5kU+t&QPX}h zLPT>|NZM`eOjpdAR#o!l7?Dbxt0NAoRQ?ss^$4kRBvpK6XX}DF0FTUZp^ACm9Bt`ugb@ez51N`*RWi8^G4M)*lpuij#XmP$j!A` zhafMMv3>7#Bl*(X_|4#W#l5wNkFjUVayi^ox&Ht?tBw!Y$;t@yWe;lH*61?kK(2wWYO7d$@{2AQD1KvYn@luc#z-74-iAifuHni1wjv zV}xq3LPS>f2|Ui>M?W*EI0w*>GhQL7d@k|KT7TMR(KQQ+0;%&Ow{sed@(ITT0n)uZ zHFZ^Ltj;>ve`T%Atp~?C&XKeGK6V5$o!KCdQJjtsa7BA&oAH}fk*)3S^#s$^Nd|WP z`UL>v_hd5+p5v!sUpHImw|7@hVPg%;UB|?csvM!|^Jk|#b6u~7J{jL%>T#WSQn%Al zB>?XpY=M)Ud27afiK@g@r$#Pwb~B2VR+Cpf-o_ccPo`Z!Y;JWsdF2wvG*Hjvlh4dQ zhmd}~tLHBl_#%4?+kt9@Jf>~Il!8A@j91>e?x~}AbHPn{9<6hzY6}Xab52!ur~qMc z6Kxy}3~}pTJ)nF&@qD^!c$381b^_%}$9+(wd^AC+d^9G`e|$Q*v2CPkRyF_M&& zS1NW}-|fRWN3q@jA>`_A;k^)P8 z{{Y=0r~{Ho{448ygqpeIy8iZyL-VTd`&UeMM%<&jBb}snc_C&00BDns z&c5V-h29VG)KV^y1Xc|R2`7_yw?yNQxPg?PVYFACYu^Jr4W>^em;5DC3%Kwa+}fd) zAB=*6ZP*^bo;p(YZD`S?F%NMjpx*URdw}U&^{SzWB4@i#vO%EHvotk$!cY zxDiO-!l?tw*dw^dKbhBpYgqL8d{6N+PzDJcVmp75C{=+Q36>)x1Dp;)_w|ouXLMyM zvy;`4%kZn=mW83BU1~NLx3jW8*zNw#@}i&M--J7dxF1Tl{{RZ_z`iJnE%a+URWZT? z@#RXA0i3BqOOg03bDBSa{t$SBR%kpu;oH4p-PG;8n(A0E=dvVuQlr&~PBV5ONHxbAv*azwcDZ@|H zapk1w$WC(`f0JKVUVhKB#d-F7=eJf5x64-w?hZLpt@Cx`jQdtTweT)Y1$Rvu2`9}P z$8x)h`V?=NpPmNivx_ID67^&C}y6G!6x8KJeZ(ygb8+1JgU zDL&O6)7|4BuRf#^#cLWidYH<(mWbNYJ}KH*q}KY|y`(IoY*8nevL4D+oG4FX4Qa=$ zd?wW5h-q7_FT*b9xoIi>the@%u)b#t1jO&4{e`}XGWiOD?j_VE`%I;I`EV6V9FMxW z#cSKkr`cVu+2YmZf)NF*BLN~%Fqkfz5m%mrc1}qZGpQLX8Yt*RWAP)zK0efpR(f3b zcM>r%EOL1O0Dso)=%fxh@GI%<0udgQEV|XdmmUk4QBp~flykYf#Z?SPR%4&WzDv?> z{6lHto6F_!r}p48Y&XgFi4qvXjQL_WNX9eQBPXF9yI&W0f-Qf-^Vz1Ke`PbM5yLDb zTNO-#1c97_dhTt+^y0YcLC12c(NnZwtd65w_@$$2(B0ekcTHU>gkD-+T})*v>T+Al zQ7W8)_i}JKuOGJfmEtWjHnbO!O9^ekrnWl{IR^`a&!HVVdU)rPt?91fM3B5g4;rgB zHxHr5Uv9NS?M)JyB#Ky-hz}%zj=`R!Z9mSlvwGb1@c4W@Bg)o?+}c0w1K|xeI4$)( zHeqmCOq0WIiyN@)6^L!4Ip-(X*H3ftlKaID@OVR1kIF1$F*21l>%qwqC^_7FoP8_v z*3VkjwR_dJwG%cAZIUn}o%ap64Z~oLyw|??d&A3N1fCDqbrsR?UI2*!&e3`_$7u^1i&De+*mR>6iA?+{B8(?&SemOaqqKPJM7aD}mMY zJ#J_hRFd{N4Dq`Lj$hrK{EPy-fX`5SSDkpQ_*+ZRt+dp;H*wfoCC$sYj`mq2LGSW& z)PQ<^Rmop?$X)5H2f{xNO4@l5J>0@SDdv=+AYwFBP^YNRHKjPVv^;e~sqMDjE7rU> zc>+NlyV}H`G&ooqLyVPQmA*iE$8rUC{uuH0nW`-J64}Xba*VAcZ8A%^w+qUV$Uegr z@z}EX>*BSB`LtPJh6NzaIS801b}^BkPUG9xUfN$0crxqlTD;nRobrxkSl(wX*Oyfz zBiPkAOJheyJ2ri(;!hr0Xi!=xh331zeW@HEZ5Y}M$i)1pnfjh^E6z2~i~c*%ciT;R z@{+_vmOFfE0kDh2w{0amJ)>=1i8{csRy7 zaalHc2Z%gFt6yp}*~h9_M<836w7^ZoPrxDLXWRf#aezTR@+zTw*|QfKYh&L$9pe80 ziJI(pdb30E$K4d>bi~WQ`_6fWqcDEV9arh zWCA{bV!bE8zAf<9n|&^W6McbSY8bBf#=ww3z;C<2$>##QjZoHlg8<4SZ3VJRYrir02}J^0M)O4=Orv ze?Ln4@8QqHZvkm~RFJ^J2rh7Bj!0Q!NhLht=Hno827POurXQ17o~N}@ifFetg1j*u zp}*FALvQw*yiS^WPEXmx4CErHAO-B%AEByRL>~#fEgSftUc-4Df-^a`l&!JaK+6>^ zo_(@@mCbmk#J&uJUrX(F6x8k#86pj2%#7C3w(Ll#%Atac51XcXiurruhmX7z9(zv@ zXi@2lDwVcU%_^?kVZ-@=7ar1LK#6>~#x^KL}}d_x}KEZ!_%^ zZ^TYO3*~`;KwNd>>(;(B*EHB8Gix3o)u4*zaLpCEv3VPB8;D%(^c%2EcmDtmH2p)y z8}$uVDQ~SUa~ef#F((}X+BT@^&!v5YpA0?}c#hgAX7J6mz0A-QGhN=YOB0cTy-=~~`2-sP@XXwmt7rr#~Jf?p%da6#M&R>=1i?tU2Yd^14JtlUopv?{WsGhImI zDV*#~5D#EZE7^Qi`#ku6!#AI3(sfCg!6Gt=Vc!(3A;!-$87I&YUa6$~BG4`^p}ZPq zo2$G;dC?288!q4PD!-Gnb2PXDHfb79-X1bk z0m1s#{=H_O4eXZoEh|ovH;7CkoT!lj11bY3E$i~<-oAkGZMT6uG|6KomldVl+ekzT z>bz$Fs0x1`G4-#EzAtK8CabA^s@h3!E}#~=sJIk zym|3Zri-H5+UeG@pboHwQME@I=vxDz=quQ~CEz`C!qdrP;VZc#YqgAD-(FirO3Hrx zaXOa$+3%7$72$shCh%q2sg@;z^;dV8>_X%Zb6-{I9~0oy-c2&zIHv+Xv&NoaW%HB* zuIqv}o6fuuIyAygiX|93K*=3A z>t5-s_(M|rD#>xEG**@# zRd@=AYN#El_S&wdmT9MIm#rkS`N88x1(9O}Hvu{Vafa{3SGHW%JhxAqQT`gb(Y#*D zmP75cFp?dH2Z$1q5s5s^<-zO@aoZJ%t9TRQ1X{0=Z>%g$ZMCdcHQn}B54(g5wf2M2 z$v&Mci}CNo_5waRCbkDnrF$NaqPksc!Sz|CDb@EldI z6B~_HQ7&d`8drAZmhvoj4Jg}|Bn}1#OaOT`$y(}~G|($W4EJ#{5=n0} zH0=9(vBwN^!3Vu>PNI65%PyMMM^oYr3VRq*d#gBQ)2^+R-Qs*ZK$zUok_j>}bDZ!G zYUi}C4C#{FYDeMAO%9V4p`P~Y>QUyV7cxc*7}U2=F^r16rD~e~r!@W_(`;>0D1sFa zy{C>jNhL<&arFFfE7spn@SlbJHEH3!Zt^Hv>BfAh%gb?bF~$QCu&~I_-o^!N=B=oq z3Y6a}XU!fX_?*`s6mJ9QHn$g735B`6$DDWoL8)P-^P9h@F9~*(%wt0NgOazHsAyITqp=eM_dAZYvx(z z)qGLn2iEl~Rgwp6l_`i}BR~>#^=+AQv4{1-9QL;T#MDbsRE;U=NT-!>iG209l z^N37)jx+M8E%XB!uW!`n(JuTiYh~dZ22DctL+7>9`I3mEJdvD*1oz^;8rQs?H&a#c zw9>{w%z`E>?$XdjngNc-zG{5UdyR8DALQ+k>3?;PaZ~_D!1B!YNtB+Q&z#TWbFR z@R8kK_;OQeEOI39NV{WkBv{VIIOH%q3hcZ+tLkoK)OFN~_TqM6?QjCSNO;@|kCnZ~ zGhSzJZ{m$X742;25vy+V0V<#RBulh|jPBf|=O;X1 z@z%Cxp5Baul4LlY)JDHSPWs_@Cha z01D|+J*4u*aVw-}k-G#P*f=NjuciD`@TWr8=D3qlg4t9l7UO8$oPQQV_x|s0Yr|yy zn7lmJ39D+?4`D3QzRP&rHWT$(GLi*Gtv-%WZYw9vOJLlUtBFd9$h`!E_ z;kS}x&N2x&+_ICM*SYi_tK#H}O(Rh8?xj8L#G4>sk%zajnCCKNsBN7F z?2ro2?txA zm+dnws~nj5B2OipVY`wC)O4r8;d!sEB)Yk^g)Rsx6pLz{?JCUU)t- zT==KOQCj$`?IIgiM7FiHa?v0pF6JzEIUP<-DJ!PY*%+$L@~w}*e0AYF3z?eYsoFt{qBclqEe5+Eg zi^qd}JEYj@Eu}zbvyM0OV*}1&2k^ffG54>VJaey0tlhxKiv&AK3OOY7JBiOCy1x=@ z7Fys~^o5>t83AEbCD@Lvag)z%ReuZk6H@Ut(n+c!+uKFbIS$8iP7Xoo^{%>V%Iw;u zq3<%!!rLor$Zl*+sk^x^8xy;qB<|d*2Rxi)f)Ay2{wDZ%qffcJxQ6cDA^xV#WoJdn z`@~2|1Ew-h72V!^I8O~|Ls8N}f=6&%s|O-19Fj)>0na$EBiC&8JI8|SOV)4h5=Puo zc?%?LhmQCIjySG`KFso5r8)D#*z}(Ud@#|p{{Rn1cX6v;EUg)l?d^~ZF$1Y^ILD{; zskPsWJ{9nui$8;OC7Ky8_9Ne5?_f?Je(*4H#~gZ9&j5JY^%B~4uGaG3LIy`DlOY}O zdXD(VwR!KweLF_K-qFU1CJqAfRr_F`NHv4^r)eEDd8Ip5)U{`-czVho?1*MqAv@d> z>Ua6QK^Vc@I_EssaiV-gw7=0C!`g1CcDGi)yRu^;f+(Y44o@MD(oY!cUp8nf<5=|1 zCf7{2pUWFhoogJjus!g~TY=x8uCv3R47K~~#J;?^O$;j;31$G1oy06dmd`=A0-U10 z(>iKWr)$lfrRT(bP^6w4xYw?=36vec&m@Q#XCaCCdF_+=R|RXT>(Fak?_x-8<;o1H z2;c1o&kgOG?yhdMjWb%3+fj-OsY~v8ql?OCJ@Pjmz3Z#D@cyIYi&=E<57>R8B`nIJ z3vJv+2|3`5VNCoWjN|aFV(fWyr3p`&%I90-&x<#I5Hz_onXZkC zL_~p?<^_N_=K~|3TH$^i{6W=pZ9v;<_CMNIZIdG@D((|FKQ|vy(yd(B&86BTFzt9-o}5)Sp7(f)_^MzXte#$QJ$BP_xh{-t%C_{YOu6>TthZ&v$M1ns)AS)Oti96FL2cK-mtv-;PX zTw6nRr(CY6$vwJ9<^ae8DecZi3GH4}d8A)k-^Hpyb0XRwkR)MT=y(U$^7b18+e09xH7hiAaEBf>a40yparv#DZU)=-G%gV%XDLwc@!1i+;rpt z(;~XO&mxo}mo=WgXTE4Y3h-vDquW}^hMEMxngFWppI*8AYpl}#4EPkdH#(M~6EkqC zr~v-}fo(P6x4s{bMTA}Gck>A&0hwVe2Jdah2k@&_9}~Q3X(TpjbvfKHOtD1aez?iU z*P3^^=2XMtZ+KMD`wqjw9u|W}xzX&>d&r(P%T8WFkTMQ127SQKrFmtSfp1b1b)f6k z#?%(fH!^a+% zx+{W97BYdJ`B9J7m76%ep;_+FSQ?(U;bv=lne>a5EX)j3lG#153F5e45PVa*zPW2n zPs_9bZQBYK4#T-(Lv;TD^;aFHYm@4B#e6|4#UrQz!r@etjBt28J?SU6)U+60&M3v; zavV(XrvCt&`?9wuk9wY7=VdA!x=9^xg?t)3RQ`3|zigJ-%0!Ks2JWK=AI`mYUxL0I zv(vuOV{rF(3-cG8Z#;HY1Y@7Ad{}R8X1kDDO|s*D1VEHI^v_KGHPqO6tH)40mLJ-4 zFt@;HRzeDl1CT(;9lG_aQb}xSQwv$Yc6uLe_-j+T@WL>pt~LGX;omMJkL>1mtc8 zx*b=>y084Y=(i~XXJf+glEd5$+iT(>@c`67E5Ba$&IE^0xAXD$nWSy!>T0dVxv6-I zYiUgcD8rNzlKJ#G93Q1psB!-QX4HQhKGn1MhjD!C7_puQTq*My6(0WpU!_{rMvbgA zM^Z~xMmuFJqs+nMh8Q{bITi9QlWpSIBHKOV+x)*HmJB~0bDu(USL}5?Ts${kB-3s+ z7@=a3TmhHoCnKrPr>!R2FnA=L<0H8Eh4Ayju-Y}{j;J)k4o8_Hs6D+vKb3sxf8qzw zr8br~7L%wzh0@j#QDxGhL5}^!*FP_mi%hJc)V=lLgpfR|5oPiNWtv&ls)-JrR;ZVRnw^mRAe{K0W>Y z@m{y0X!^W%5ZzoyV=T`WWLa+B1`E@w5~m~3aaDGXxy}(qdv6l>v1EH^`)nrRP9uzO zXHLA2yhjw-S6I~H8j@Zi+_-J-h}}5_SgteN^{a=(6KTxQ={i=O9E+XOiDa3H=y2x* z@$75Q@2)&iHN)JP%cPCBF>*(+EWN&!R=E+AeUYta;y)R|d*s+^PKG?L&oP}y^y+td z43ouk`tOLmX=fw-ty$7S82q_HM+4&s9=XhjPoLf69E32Iz;%9)87!~tTu^TTwxFWfK5_pGS)C6x}^2T9p zz@&@`Bcabj&1|KU+StW3S3f!sV|A6d7zA!zy+H0d)F)86y-{s1?+~0jkDM>Rx9M5D zKT*P@BdHF9@dw2ANY)cLk!B~%SpY{2Mi_#4iO zx@^fO`ZdHd0h}miQ_rqOD>LoamU9?x#HtglXB>mwTev@sPqAjoq+Y1(G`(sBM;148 zD8Mff%IDJ~xfR++ti`KY%N4@jsfj?$GAM|igL>h6dz_l`8*8h(t>q(CP;s5(aUV*x zH1BE#-Rj`ycg^~3{{R}RG)szSV{*Esg{x}%ee7qb5KDtE9f(o1XWyE^kHtwks7poD zfXUM)3%wD3<{pYW(& zNzpK@c8-RnQAYgjA3%6>$5LBe!E~NnlECXEFi9D4D=7po0QL0gU6+hbxvk&b__E%@ z$4ioL-%kq6ij5&ZIgE5u&nm=wdJmH=^((tcl3RJCiO}RS9jplSBD8O{%gcyFO*Hco zGR57GC$AaDTFGIO_(D}1K8*1H0FRTyWiRzxI5jbxtY%=UMi0x8)1IVM)}I%qn^JVX zu&}X$=Hxj+2|ijjMiNHLZ2`I#=f8USX|JzkRgZCSy#ePHBVXz=DOZu49^XpRohG+t zH7Uk>pJjNeUxxN~66*dL)`!_6flAmT@49)IV;qJ;fSyMj4!N!lZx=lJMYIuKnWj+7 z0^7#sRNQm5!5=rV1meDIN509#Waqv*R>Ui;#t=rVp}7MfXC3)HDxEH-G_dM6P2BZJ zyl`~esRWy6Nnr;w+ruY0LGd~fr!NzxxsepaR&*W+? zSH=_HB#_N8K_VnhV^TLNbQtUhw-x6zi`b;vk`s?#N}Afo%mtm)k~4zX#U8~iO6N@J zG|g{I(r(y`1=N~F{n?S-c0Y2#e(?6Mj$^h9VHL9E`D3`GNGTYSBii!L3epJVSUj z29Hk-DHt5*B=_~Ne$b}AO)49StjN2aTL>I&Bzm65+PNJg!?1X2RJ^#eGVVa@ha3a_ z{ETPuuTRmW@ehn*C&QWqUTuVIS)pM9$eylt@_TWTe=0t!3G_VtOyb?Fa@uc%-rCsS z-CECkEX>Yh-ULd!j!wn-p9kCzT-T*&nmiY_qfbo{5@!cx#`zWTgYtw76!XZg9WI~y zPCXj`08hDw_GcM*?qZEl&Jj()Z1FX6b%Qs4N4 zP=YCF)d7}gj#x3yWQ}mlJr3S$>%AMq zZLI1R`V2R=TC7q)o?fFM@(kZ7+$2C)h7FO($pbjAQiV7rbIiozB(^-iS=038iU{o{ zk+mC@9z}-dk=PDQtdOf6xEUN*q1jnmSn1H6Qsp%HB!za#EN)rj?pR3}BPX{8y-jrA z5O{9NSnP$pt(2n@>JgI*1pW~a+2%M0x!azAV!m?tg=eX2*K*BeCarN291DxLF(QCD zJDg1L*%B!*d|4baK}!Ct&CZnf>YZ-Bftr&%qAnc?|#-AW`< z*DMT)AQ&6B%tixx5J(+IHQeZ$_JeV%L2aR2K8t-4h+{~{l4N-sI~p~W<9wc(k3F+p zT$b?4x3``xjK`*1HpiCx%iD7+AD9T>MUxAUyR)e4P0@r_i1X{_7@E>t(tp?Hc}3@f zHH5K(WA=NOord#n-@Q-)A&CkU0f0#zyVXcFUk~ZBU6r$2r?iVNDoGMTWngfq#H)FS zz5zJtSw9qfGpT4s-^Kp`3w66mA(}tj*jiq+lRRunm-6K$v7GU>Kpj16$#l;fM{|9p z=z7J3(|xJrH}Jqw%>Gzn6rl~iCF;a&WzKVfgOp_z?%3*v9;DYj?oz$9)AhUSj}U88 zCDPmnNVLs97Pz_ra(vSp>^mbPmt{SBn%JJlNxP2P(?pZ)@mvMLwO2BkxZEU7h{2E^ z#fMG>Npa#hEOd!{PM2dvd(>NZwzEYnmf`XONt{NDp6iDndp#?i@W+pI9|-D}`k#w# zTHZKhdx!Ngs$t!h*)ymC() z;T~QU04%BVHUM8*`H#igezl_99}d2~Ez`IXm^{6N0=dou9suiuUfbh8+5=bC^m~0m z()532$#E~6Wv4)1=^{dK^Am(ZMh_(O$gi1vU*dW7Yw5g4rpDZS_q(Ccd5raLYZ3-877H z8Dz#I0RI59liG_dku#G_$Gh;hpWCURP|DBaq+_0U6+m_1!PPi>XC-dE%=z(ywG!F^N`7dDt=g%2AP- zI(4rW)}HfEd#xts=`ZbIK3ci}aKn$O$Ei81ZCF&foVPsE=TLc}FbK>{JE_RP?f(Gl zu3GNiRNFn%h7zXb*y_irA23t$o;n;J{p+E;k|m9dPE-T;N2h)}S2uGm@qy5E&1Act ztRk#j(eFOa%&}wV=v%HuZVf_UtYiwgLgMayvq;%TC0A+w?lZ=7+*G!@dd#c)!{$CVjAx&JO3w~OAoFCsL;j8oKe>?r>e%WVo-ltJ@iV60>X*#Aea^+Z zeaMW!g2(Rw;Ew*a>oy(@@dPnLVXI6n<+X5N6Y^AyHW>-X89B*3j@3MkiL`XOzmGgn zz8m`{ny@9E#F(1e7>s9sMSZ(+y!62Y_Z_R!JRjrxNOb!>s(-Z=9d0C2R&|qUAG_n^ zang^=*4fjateSj{S;Amg-rq@kfZYsH442&A&pmT^3iL272$-GY@@WCQ({80}u`q+979 z6*MdP;?-iXx9c?5x_nCP-**wJF(e#}gO6SgYvTU^5Nle%gLRuVt=O0}rWkya<^n@A z1yHYp$OqSo^`C?K&V^-lB6zb`lH*mnl~xycnbstA8(79lWy1`0IP26_>kqBb6R4Wd z^~gLKWdcEK_Bg?}P?74Zu^3#$a$P*!e57L_7Vp!HaawkXVPSc5;lC1JJoa%j!xRw6 zyPi36Sj+Zu%oLyDEKja^74DidX>qe(UD|B0wha`wugrvya_PJb4aYd!k?L!i)4Th%`Ph*X93K27mg!ruo$b8}~DBzAY< ze9LhYO(ndFe(3qpTx54Dy!OX6;8WY{J`~jUfY8VeMjIS@@%|P11Fs?Q#gsR;lE>ny2MRIR^sk8gW8#VYL343%AxI)KF@*pOLJaN6$6?!wgrx5o z>Ux-IH2I>-ko-&5o67q{qF*fk01z4J>M(2GdHv}36pV2bgx9v;GCX}Gwg&!oWdCMyp#)UJ=K{ydKh zCx&9x72$_eSybAHK+M62-W^9!2RpihUQ6)H;uwnMq1KJn#ef9eMQXuh5rQ&zwn~B6 zk6xm<%|lhv?}Ck2e2*Xl2j^^hjFHox^=8J$!P;Gn*A|beM=PmV=NlCmka&2;NnY3u z-#*o@PnJ9$8|w0#mz(^N9!heW=4s`X^EVM0d>29TtFcVyq z9q_OpyIGbn(cqqqo_ml%uSs1$NYJfsd~CWjR~mJ?#+KIUaFSc7$lmWLX52i+C*}a; zjt^S=r?j5>SnZ;O?=j*7w2s!>#9D;9R+)AT%ARQnCc&ME z3n~{UjOPQ^vBcyGteoREuetKg+e7q1Uyc6&5A?hEbiHlUO`O1`qPT@hVYu3|smES^ zY#!%>SzacWz<=2jTlnKw(tKTQeJV5%+d?9_x3-bD2>^}Qg-rDUPuHb>TKJ;Lto28} z)8?N3$|+1fRHUqkSaFsGfd?INgI$k;^?e4%SB7m;ElbOZV-E@iU%%K7LcD@8ob(h? z$Q?UcZ~E=nYn81_zZJCoC&S(}xbV-0W|H$ueUe$YjfUl!Lu^n&v*S43ftuCu--LWW zr`YLUBk?___I;dFvb1X%S!YFdZ{9I%hd*_8fN|9EUsv91KM4LL_)V;Jog&uO^GmgV zu-`c_UPt7n|?c-QUYJiysz_r{s-BF}GpJIKk(d`Y&fF zq*OK0AE36k{{Rf8(W1GRRQ}D;<3?q&jX`PTA)BjY?mXjnC!jgSW$8o1`u(Y!QPpnj zEu}?*ICn&XSaL{+WH<)|fzaTb^NRQe>sax1>^?@NcP;2qlru4ALG?K`-uNrxMTdn5 zmsiohweMOp9%p7TZN?OkBwknDNUdF7W}8BE8d@{-uFpjyoo~ zQ6yyaX22$L%yK~|zd03R1@R82sT&(RI3|oC^W}zN5~H>W5=2-QQGv%8BELWEzB}mb zQqCPBOGy02X(L$yi07a{!zuO2$81-vcn8J0o$S|FnrLgrpDfRG_Y}eVIU}Z1Ye*$P`2U+_m>But|#JG zhQ$6Qw(%98ietUjWpxn4vApar0I5L87q15&N>wYxu0&E&TFC99(S8@{`g7{31=zZ_ zeeQ1M@}x-@2LTY^uh8UIl|iTK9yz@K07ZgUwOLuAmwF_u&i?>%J?O(>WuXAm=Qb`kR(58BB*w`o0e*=p9E5bhxJ|9}?c6!aVrM1n@R!G;o_}@mK#gBWtL7L^Z#vSf$ z7`#CUAX}KC{o6N2Y~+qJUK6f-CcKAN((Ry#SZT%wStYiPP0udOvaym^<&POV6lCx@ z1Cmme^)ZE5x6N})!cS}BC$`ZwN!lCZ``qbKO>Ae*LhUdj$K@aZmOb(Xdlk2V^$!X7 za#5%0e`}fM`%Gt3VRH}7jN^GGCuRO1K_qg+09TRtde2$#J&o1K%vU!`U{UsUW{Hmh zqbNWhFB#whee0_5pNl+cqH9qmqbh1Pw>w4Ho_LyMPzYBbN=lNr%CH;(*NUHLu3Lb@`dnc+_tUp1ic#l&(;JXT_OUIl3g zJ6C`*;fG9+eY;Vr{3`H`^rQPzN07-Ajq*&*6sW13hGl#{&_)RZ7#w3c>x30ggxNJ4 zHjjZd4-71G&t;_E+{vd~muVC%$l=dp69&fKnH|0BlGEpu~6oi|e&W})Fbdjy$I z%eb%a6>>)ms$JAz_9GRC2aPAu?qRXl=ecVcM)+IcDlH_>*5j_-poQ)u9nt-s*M6^*cJ$pwlElH2Ni+-^ zpT)X;(wzn1)25hjj&iY(K^O=e5CH7Jl5y16onIAB68B;drBZ+L^2dy6J{<5h-MX#y zotUtZm&%(=l&Mx6ADAc3FnQg$dsc^wJ_%Y{i#=n)QOn{xFhNTs!JS;3>|lOUt>115 z^siWx_J7uGtmL!NbqnOv?Gtoyi*qVujFnK}XX+dZcf%itb`xq*#i)3fQ;zmR=peO< zA1np`0G_!svipL9xF?BnmohqO({WbjZ29X<&@Sz-FAt3TEV?K5f!S|wb7Esu3;zH- z3y!$!{Oi2%-@;!4YDP_3>eJ0Zv?9E!gC_@s0042==N0as5&jbDzAlQ(!dh>LZQk0_ z?7U4hk#9#4k%JpZuB(%eldl9WE0XYU!!0+#H~#?GKN2;jw%4wS8fo%_RX3$-kVlRf?9Eiwt9WExCBn71Z09hJipOnN%CmqQjO5*jKSZ^(E zG>hRC-kQiukcs9Y#siopY~`{15EanEY|PeRrFcVno>uV{M2 zdYeYe`3a+T5G9$NrC(|FHd2s!n|d0wlcT6i*YQ^)f~r-@2OYy?+R z+r`)^npG+XasrC;3$KeBjf7T~cY1_(%O3UnVn`-@sXI%n{rUzUEGkWS;+R+X29{utA>1-Wm8;;!EYR@b!+nt;;b;-dBlGM0;;@A&o{oNUu}YJ_Ku;12wmR zTGvsRhIkuinwd~=WMWh|O0TWE^4NaX3tf-S9}PyWsYeFCeA-37-e+hxyK~4~;AHxq zKDG45n|<(d)*Q(l)}tbY5xwNZ#8?rX%O94QBaCB@dgwfV`#N~%P|~9DX1P6}iDpqP ztS;9QB7YMWjRK5w$3I%-ye;8x16t}4Exo&I5dZ^4BrUfmkCj$ME^>2@zLcjZyGkg0;F}}zO~zF{{R}bYi$Xkj#zHo zsA=vliSoeDZPD!+9r@#?D=)==0=y-8VISDEXm2Kx5YHx+A+we_PazCfO&077?#4(w zSB7gJv$nRHirOK+(;;ZXs_Gj~bHE5Ac2Ym!S@x=o*2&xCOkql+{o&4dgT+1%)qGth zyRVl;AhpQS<=OU!Ty4o1&%QS2*1Ye5z?j77mKRoz^2sMGNW!i< z920}@TPkpq=X#wmt4=WFg^_^wI>w@rLuW1fhQ|12o#x)(Oep#cAE~d<4}(4%ptnnjn%I#SC^E0RXdM9neQV^MHt2W?>U~<)dpYMZZ7__xAkQqU!-Mqe zUXP;uMACduWhI8X+H=V`#76GfSSucxmu^8m`2xCdys&y`aN@st=6y-6>v|@y;mPhk z8{JvznuhSVS8}|i+dskQNTi@#Df)@mt&JQ(9SDe604j5!}TjZNX9k zvf!TOOAgqtO7Jy_(Bm3Mg6*Tz?=B!$k?gHf>MMy`7!1uQSd`=E1pN1jHDcqz#hlb(Ymqa&TcN<4 zxBZjBtgkECqn1~1YZzW4gW-m;ryUo>8ayyTW{$>3xq(UA+?cS;7dY&rH7A6B;ax|i zpzvLiCA>&i?Mp0D`JGMyRQ=f)JD37--n`Sr7J3x3J@oo5rNmLek#e^U0v0D2XJ-B0 zG1MM;=Du^)HT#_!{OOv0o#GoCO@F z53YP+@gL!>yeSfSwvk=3dGn1;H49MO zeU>kulb3-HC)9(UbB^B$YCb0LUa4-H7Qd$4X;$gFP1jS&3x~!x1yxA$amWiz(IxOb z-=Cy-e|uj{Q7lR`O#-nvFDB^=a5=|w+n}ZF>UYrTjA0d__WuBieje%fwy&>6{fu@_ z6^!>!G(JHe>kCgJZefgL9Ot!gcU}we4y&kI*(zP8k10tKC6+HLNJk~$MM7d$#{=(G zjT1;d7$52O`cX0@O&ss`u^feZm9}{#8_%XdC$(=~d_c6+bttsmHtNK}e{}IQGe;iP z9X>)1)g4DG+nUlbms2W}X?v$Zb8T;`=$86thv982?2oc&VlkC0y&c%NlsgaaU~yM; ze+&3I^$U2$ho#9Q`C{t&=znQkZ@@ld`Gd;&i2H+pJMqsGeevGs!`fW-(dhBp+O}<@ zxwirpnngUapb>dvs2K-7qZQ;5e$e`nx@{gLDLjNUM7env%pDZK%%tPC3wq+U_Hwn3 z7fy23A4BV28*M9DH#hpc$4EI}Cf*xsSV?2ZRZXe}58V;DKBBx^#@;iq)nJcI(jblE z(=!m7a;iPLSC#mW#y=75?>^HaUHzd{M`V~qlm^MjRNBd$l3Sej zIj=p`F8(LTzh$`a{L?hcpWT++!1XNgvv7OYKeBf^DbsP*N7BC!d@w)ZBZo|fOtig^ zPzB_)N&eFDARE0yWpXzVNY5A*^lp*i4J*Tv-A1z9sun(4v1nk4PyDlu5HJoplI+>f zOxMDn4*ni~&^Pxft>}7!=+Tu}VsRqGfqDcd_`e*IYu@g>Gy6;FR;zD!sOeL?FbgEk ztAGdag37JOa1JT*TU(gcsGGE8u6x#_tN41yPMQx4Up?ji`0dgwnf&<#lBoq+Be1MM zE=kDAKY;nyU9!Hpzq|8w38lS=eVzdYqohM4Y>6JgSAIzVjQSJlE}P+x5Ne^XJXNo0 zFFXOu{{Uysr)XYV=5-?@9G-yIO{b0Y9Rkv0C4kg4xMgWR(AT0V12MrORg5U=KI?Po zQ5jlB^yyh&sqNZN!KgHy64O=x0EB$%TBW`vScLHj6prg7$(_f(7-Nx&@cTatc*9xo zMgF;U;Y(TU&D@ghzPXA^sEI#uU8LHmI{>Z6*EO}J{7%*^^!XYa!7Ls~iYA^?Rb!Oo zhE`C=kGy!`a(#MRFNjcSmN&N&YMM2spxAYft1{D3-*ZDt|y*5DC~7BV+o0fw`k->8RdMbfX;d6KTKDhXkIV7@l~y~S2}mv zr;28gqf@oc;ee%zu_L(8Pg-_wbZr|Yc6vM-1;>i4+gY}n1-A2Xa|OXz;4newQsY%uZHfnk%M&#Fx`%<#Xt>S5vb~~d47V% z`gVdT36JI@E1&N$EJv~9(!I07{{R_pd_4uenS8R{MFA&a*mJn&18{7E>&LZlNvO!( z(v`i_D$`BUt#8*&ju+K67Jn(M;^--#ockzABN zF#<%6LW4ZAxn96$n%wYT#pB``{{XXeJvP@vxw)0(nY^Wu-2&isRVACIbMlU)3dZrI z+OCnM&8OUIcAA9O3-a13Gdy`YEF3(Hi=L&49+h#Hw?c*=MWhVA?-rrkTjuPhMT zn}xPT{ug&eQq7Jrlh3bDhI}<9t#7VFCV?E&T*V-C5GiKBAoj1XExtH-m&39(&E30L z%O=HG<%FWU4yBI-{${gvsPl3*uiE;VSHo3pN($)nr1)XtXPQgVq8kP!rdV3wpjE+Q z5qA<44_VZvJ>206(JTR-N5^cjE$?F4afJo zA6R@Yv+#F~7#(L)j?UKCK4fsXj%$tFm2B~_5z$vZ_4HC}pR?rNXq!luce7HDBoWTV zQaoXuqre04`s1a1bKnozo5VWqv-S@V>h`)+@r7oDfh+vOA#s&LaCzk8y?qC3@QYLU zdR|)>p61hUR07Q)KZqL@-b9nC+lz-Y z6UeuX!BvPu`^789?5^BrK8$$cx%(+?{1LBOc$y1Gxp0MA#$W>ycq};>01$J>r@eH- z33SxLohMH1YIrYzw7(qMX!jSIvT8OrARi%Mg@T+M;1&p~ua3m};;MLe!had9HP-R1 zm8AM;c74)GAc&MKNhMr|VeVHRmG-;*X3Qod_*BDe6cagm;!4tj$^g6wA8_0Z@%4Ht!cdEw|H@vgsb9nGr-XOM`A za4wR(O|SP9Fv7;n7;Pu#z%8oUka6%E|jlhtiAXxp=kQ0_l@+_iv8l0vs+y4h5{9G zKhfg~p>R8Zzm0s=<4=a#Uyi5yb(W23ZFS}sVP`ar7S6l@xNQR`10P!ZqTcILF#iBy z$g}F{G)QEgMv4W_013kf$gGAMQstq9#8oeT z%+c^O{;D+?VnG8Z-n9Hz;HaMFbe--di~VxSS~-4J>B}(Z^cCbcUk}Au-Su$OG}~ip|qCna#u&Y`0vDW4Mi@s zA?LITO2pd|A=DADu1`Uew;ikIt!G}BQMr(miYUu`vBbE*{3`aObsOK_PR}_w`JIap zKNDDD)zQIt^S7Qs6{KN(&6T38hv>1oT_9lMHe=rz^{;*K_ls@xt7B-Ib+SYbOodsd zImUiq+#gEw&k6W``@~X+?QI>391XY&_>+uR)&2|pm^@ppTm84~cF+yPY&)NCd=^kf zdH1CzqW$AKwIOX;b`Kf&<5bYc_5@QRy19l_Nw;ic(|~e5hP*>l@mG)SuVmAqlH%6j z7%{4L{;0^eHrPfNSAxMsgxLfVBG~YZr&D#lEXCSte^)+DRMx#hir^s*IeS+?)#S zdaV(?H+5<1cpkf_c&Ajcp5kkHp>+M{`bxT;ymK0D>658uJQb@X#7J97A zp<$Zl7;_oqw31Hf10I1;5<8muV)Mb}G?~lla^K#V$obi%`N!}A_{jVPd87CzQn!&C zRnlJKWr*Aa6AkceUBsBdIRo*}rE=B7&grIhLUFaMc}A_^4;1J&v)EZ_)`lx!(>o-Q z+yX{9X*V3_pa9_4l4@G7i?q9hk)@8nkQ5M#pyQ4T@%dM`_=n@8+C9#lb)rQqBH!$( zB1UZL)1@c6Iyn4etlBUSa{mCl zVA9ENDaa$g1RvJAU0dS(*P0A^4XiIHj#D?8Av{XM8`rw>Gk|fL`Si;)66H=ZYT%p6 zD)Y9`!=A+F^r}g&rjx_Rc8-y?i;Ju0y}nPi-OSsaoaD26@m`hTj}G|1#dm*aOIdBK z+-`Fk5QhNm7~?tU4N~}co*#mE?yk=H9h9o6!QW3 z3ZQ?>On}GNkD#J9zNeXu#LklCryHIB0K@Nuo)^*lJLFzy+wP;=CzxUnJMJHIaU(lV zCkJmlRSiSI*P2eU%j5~5E50XNMPSIom0^sAO!hoiX{mfzlTER;z0_a}cQpvX1zXNWAc-w{WBW#OsrAiRP-@`Nt2 z6_1h*NXW-LE-qY_IK;FZbaI41;jBCwLzQ{7(5ukNZXPqF+F@ejhf)v1^y*OMtAB+kk+ z{oYrnrg-8(FsdHlN|!q`Ht5+6N&pdC55I$IG1h*XFl^pIDs|9W-IwW#!$p zAoV0?r{P|f{wMg0qOcZ|u!=0I%y=75LymGisV2`hzE=plLF#>D7l1WO1ijS!L3kuc zu_SgP+AlCFWz`IfHxdsWd9RH8ZKuDCJVSSCG=cWWWRgd=iZ3nVjX+VC1Ps0lU=I9d znP>5v#t2Jm5wz!VUpLG#4D=+X)1Si?=$;+%&cCU{cNL>s%N^blbY?~lt=RId-})Nr zjaf%msmAcNDLbBVYv7ptJ*WM)$5*|umF3$Vo5p8pK;elI9moOWEHhr8;QcGc5a~B} zYkJVbEKFpz1c=z@hHcEiu<6euy>+(#01Gwd(_)^;Y4OJ_im765BWDRAIeo6gD(5)? zvNO`Vtta8Nwwo=x-)gq!P}m+TJ0xk+Ebu(S8C6O28K|jMO&u_HS8Vz1FMMI8+T80g zOEN)k`_0mwvHRmV$?3;6rKWs-)fUbW3PW&mjTwZ<8UFyikOl{~57xcg#rhVNr0DV5 zYWj__l2_s@j1AA<<#B)qxvx62wrxF4waU+hT{(PF zJo8xbR-p#*D?sS<^agLMGsARnNt`vKu^4mY1}!r-CbEH`*bo760-4iBdv zjdvHiZRWkEN_5RKTSoH;S+}7pvAG>_pQ*1f)xI5Tx_#fmbvgU+jo<~#0!Kml3jF22*Suk%&erf;PY92qD;B`?$j?fl7sbyLrNHy< zAWWCtwAKj+{)!*n%!6cqEM~4eA&hV zj+~lhwuz-JjCzg5#oe9#+zT(+rneK?ylTXZykx%2GioB}h}z2bYlei&_Ud^s!J#csO+Bu$0ux8(%m*r*ib`ZJ!T3Xyk{686i) zH*#Cc1=Z6*aH$>DlSW~S$RiA}yS$me#|1$4u2aMoutOuoq`a2m#zPxNc*uVDBprbP z<0MyQ2D#!-7Fb+}t|Ee4fB5)}O&o5af4dPO!1`k~ctd0q9R^mR}A$6RT@6GovUd;qnf9 z1D*)w$V96hwv=)eu zl{1Z@}_kE!icuCxsgON!cm4m_>%g_JzI%W?O%js<4p zZJ9Hup3*97eh2XOofn&DsodOLO5jHvXs*o7+>w9)>PfD@!*ckC!uDp+(2jts}*fZj%21R=1u^VdS}jMRGmP{{Yt+u6F+b zQ`WpIa}!?8W#q65(t5w=s(3$5jLWL8_L72I&zf|OH9^w@a)txn zlj%>l@s5qE>vEkxOt+6nXr3qYY?4%!c60y`#1n&@^z3Q#D-f#9bUaI2*3uhWd9`R! zE$#t$Jf~n^KgGiGJvxfxH4hbdf+a{SZ55)8N~vtS6>Mib59L}nkin*2$!l?M_H_*J zZwL;sjFXj*en>&+dR47IQ`4c4U0*4PMtT$y#={)sU}S!^E!gyFM#}cN|JMAf9s$(+ zOzEr4mfAI>fCH8wG0$8c=g?PGp!jk<2IZ~YgwRIimO#V@ZomVad(~U*UiR?B*A5yO zNNC~>xG5f)6@O9jt;808W@NQUnMfo6SbjZo?_0SZV)m~?Pf=@edFRB8E&f)T8HV*; zy-JdCgHc@E=(cgmG-!zO@`|dcTOIi7IrpzMpT<`2HqfF{dEEP*SN)I)>H2%twbr>~ zHJaiD^YC`b(`h||p2Oa!nRhf)CD_uky4Cd)J6kY_vjt_79FExQ>*-sgN!F|^WNCFY zM40EvcN+tGDZs{ln64vAc;kiS^Q027`G{<1zd^_8TejMUq=U@+UdZu`;ZNdnDwNkk zDo|@;`&&KTxVE^uj75)|1U3omFfsbmuEo?V3=v5r>loX;R9MYuDt|@IG!$Slt!;;My-I3pLP=7k1dE%WW)kHJ3 zv~mzv%xD<8j=OiMP(K>MhfpZ{WnhF1mHscKW=l1#)Q=t1X`bIUay|GQ(y|ECZ*m=4 zT{lvXbPU_uqwNMievD0LY5IN~JTtNoK*&>r`1h?HDKyJ#h6dP0j;pwpKhm`>wW#4> zu{I8P*hW85icVJ8?xh>6GI{l{7HRQsu)LZ`&;X_4$-wQ-PCYrS%g-Em(LsjgBW?jB zVMFVZ2YOr0a!x1yn7zJLVfwJeeN#WIlj*q zkamPQ?g``TUUc3vyl9#T=A5GEjBOu=1y$2ETbU;&(kUIB^3pI-&$$M)_T~=?_iXoT zeLnKy%V(7u%d>@NLC^c$aa|^hXLD;}K$MBqa?zIa6L9|PV?V8VJXiX*p8&XNp~+k_ z?gTL7IVYdWw6xC|9owv*%9s!xUQd@D@Ce0dsx6LbVWqk|*`?Mm=Sxe>eVRkH**|k4 zsp=JnQSFMWKZ3LvFQgD^lG?W$w_I*fkqR3TN$iW}+V4smY;J5ACr6gs8@=}qe>~SGc^;{#T=~;95;))l zOojSzE1J~2Prm0SK+3~_2Txx8DuZ~IXgQ8f4;xgC*!1_ReZ=X{spyeh{{UiJ191dV znFiRy@=JHZu5piiRRK1usIQY}I8yl`Rf+(8#sIEX9bVs1Rfj;A!1K~qtKAe=bk za*t3(Mn4+T()IX|L13wHir_0s8JjG9zO{2#@ZFjQY2?eX?oLK|=bDLBirnj^Mr(70 zywtSoS)+S-q%26?83%#t81%(-V^v$IBMT$#89Vy1&#yJd-B{jQ%pTPi>L5tmMtXW@ z`Wn2b&SMD>w_}1qBym{OoKDD7b~WaBngKLqy070YlEd?=@#|4qeA1|NUu@^`&2{!N z+gl4&x<$ITRt+=-wxp}*%(!9r5nFc}e}rx(Np9oQt)g+gQYU#fU}OeD<+<;GYnoC` z>T4LDW_3#|8u!RF{{V-KE%j|a z+i8js6qepotPLkWy;7|tndhd^JLj>_J`lgwH3ZZ2jX%tJSSXZBBLZCUoF;$q+RaHD zCu6~^=Y{8Izm!C(a#XKe`eOpS-}puU0JZdys6?w2Qoh(Gk+zoG_r5@Kez?U+u6#Vd z@Ws(xX5AIT5My+dcgF{6{ur-C@Q1@~M()BrYH2Me(}o?=O+qN1Fh78ylsGIuhiGp~ zw6Cz|SE=VZcY?Iy!qWalX-`doa@=-u*ao%b@UMqjBwYf=_EQ=kwM}@TVT_P40aJs{ zd2D2KuX@tF8>HN7QwXfBWVV##tZi{LcItnOe9e*v_qTlwZd~|3S<>%rv@0u*?ClzF zE_h{Y1Z$a40mN@2A@bPwJRj1vlw$>HJx&?oUC)!#!=mA{VWch0C`!DE6SvHL#{=nJ zgKOY_01W~;wH3II`cQCHe8oZ=9H81q{qKE4l$8!a= zjOhcfLQVj~eNBDuH^Hm@J5z#FJ>B(+!XuK}C;&vjz;4M(tFK6Hwa5g?X2D~f#AQ%7B~xLOE5|%^>MPat-CN@~ z!;L2USN_t9-ocQhcJN)2)~*L3Y&+Bun{U$T#;d(Q9zE-}r7mW@j;Od*oW1$j^Q8DorrJQ)-Y&e4OnAc>g3SmlM_fm=mM6DP zYlqUl9olPGw=wDR`OO@KV>e_%jp@lMyN7Yp-oAj+ej4fW>NgMKeOphq)d@0-JL_jz zXDi7fMw)a4{{RRoGwog1i~JYic=TqQ!xt77xA6p<&Aqxr+@Hj#o?ry}ZcwB7RH#WS zqoNf$oF0e!Ja~d@V7AjW?a&Lm>?m;_c>^vKAHd_@xbGEsV^Yy?KeMicNY>|TK_#fQ zxJd^&kY$T~PBULZcrW5th2YQ=S+~6L4v#E-;H#sZ@eRUr0G{yvX8du z@=TIl%A^nqB#5eZ9x$)CAEjL!TxC<)M_U}Ty7!rd<4=Uzro64KUTTrsO=SwNo*6&O1in3Ecw;|xz~_S+jz9BEA2 zj;m=c^ft30lGfnDo?;GJq-akhx>d zNXl_q<0~p~@tL_ab%)Y@^3ee84JrDJ?F_=TpW+GIr(0Xa3apV_NhS*;U^YhJ0MDilf4nQe#AbMi zKXYSw;A1V&num#ebq1|(AC7g~T_)YOv_4D_ZGO$Ph2VR#06U!4zP<4KRq;NXD#_vt zrL~m-!IBBQ$j|pgaexC3bGts(i{q_EO)}?5w7E7q#M4|y2Knv$wuu~!sbM3K3GNtR z^UqrO_u|)$)5BWssixX#*W|=DquVszL$(jj%m@s*KYPD%Ti`P()O@pFGlsrO+UKO~ za2_J?CZ*xqxuMhqphqcc-O6VpuQQ zcTVGOc#Rc^IV0~8*QI*$tLAG<4&wx>YW)qb33&Ej1=>v7PQFV$$ecwn5)H%nzWKvG z22S2RYt*9srL_%42aX`-?pwmsDmgicmjsCq$ftiHLa_D7;Q8;v{{RDc6ISt8{3938 zK>lXbHz)4K8L^OEup8Ke-=%#8bMQ~$cZc5ZL(}z#8r%-MV446@GUQ`(MZH@dpy2fD zP1SwOYeJ7Vza391)klbRm~D}C>q%_xr)M{FZ;yLO+$)tTjkg^Y7bmxBt#R;=#aF%~ zcCo~tC?9DONempQ3Wr$c>nZw&0Qy`92Z+r|En9AzXWm5MMO z4hAUrc@DcLgwtQ~G;+PDx!agxNoI=PLIxBr1_0!OMM9pp8k^_Yw?25(yhWo}Xe*;E+JaoD2gr`$8X2AN zPV%YGP65s+pMh| zZo5Mk7*bCogUHQic$>n)*3tD{VtJLPh<%lEc7Qr$>;M3KN@OAolqf=cv;!|TJaWRGBMd4KElFYr&ILY>}qW< z-D#Sy*<-)BMv#2p+16<)`HV0LlVDPF)N!9&*Nj05c$UK7TU$77Qr(PdA`%HeC#gGp zvJZch4{=+k#`hW)nKp#CkwFY>ROSW~%KZK2Rwz^+gdci^*j1wCsyh#g-XPW_)Syjg zR=8V_Bg-Jb8PpD$^4MoSi~+AYyV7j@N2grdX}Y7e#kvU|Iigh#-l`KMXYoF@9-}>$ zxGiin*aSB>r!!v9yoLkN1J9;g^Qw^O_TCYi=Gr-gvQD01lglF*8NdLZ1~bX6W3dp6 zwws<^srYXC(0P)|y!F~K{PA36#4;mw&pwsw8pgc@kP|UkcYV@SVEsS+RpfVR8Gkkw zz|Khj01B3^vFTHjYu+@hEpmXU<+#bN>qziz?yTwMY?)Ak@reX%!@dq1w|?H0$Y}Rb zMBq-lWA4Of9{#_TboUzCx0eo-t+iB{2uwKuaz-$5k5R|1X792(6VT-~TUc%HZX$>j zjbvb|Tu4IafLsOLf!}D)rDu6+&C37}=~`0FH1ijQz*fm)+|?(CvNq-|j1EpsS_Wys zrN;|Ha%RJKUbx49#=2mSX>BByGDc0x?UR7bvyO+b{Hv1w(VgwZtFo0&-Ou%_5M55i zK4lS(3g`M%*_Cy%sRWkL!p$ZFEiOXoABGam5l! zN#)dSJIU>wk<&Hl);d;;<6A*4qomwxRzZ}=O`hmuW(1Vq8QOW|e=gPer{SLzxYa+j zF5h{zb!$s`S%Lx&%IzZL{JluyKDGC6!oS)lRk2x3&EB1NEc*yqp)DM4amk5VGR=X2 z%oqdKrmU}|Rfw~WyPrM$TJT)n9MlrxJt`e1NNJzTYbzfzLyx+$ZUIOjf92< zKM=kxHLRDOUCFQ~V@0?-?&_qC%e6-UWpFxV(FcV5b@1Zq!&UKY7}A81-4?fa?n-aY z0V%klJbmGc?{55cb**^L+e7f>=lmn~%`u5gaQ&Dv1H-bazTif7svZI7JlCOVzCO^c z>{mkZhJ_9LLo>s1bv4$Ng&ybfN(H*>BTO4XjQtKw;vO9KNNU&*566hZd&GP z9v>omQX`5r1132GCRmOEEA<>#xcCE3@IB3w%X_xo7FTxO!Bxh7@kRwyNBIU-hh3#{*P7N9-S!tEwXS=nsiJ5WnqA(EwsULRWy!#dY`TqbaxzF5 z;NzwTUwZuQ`0e123+PfTU;t1t6sU~n)Q#L`yz}C}fP6QrL!#RY&+KIedF6myDT+nT11hsI zQ_0CB=QR~8xjQs#O7QoSJ_a^z_n2@!@GE0Z)SA{}ivCI-tNbU_V0W*5m*K{NEu2zX zGd;UXQdXJO01MTT`5Up=ftu$2ApADbv>7drhcC{j736IsQ58O5+rb%70m1ealbUYK z>-x@@Jk`86t1L;Z*xS3p`I28LNqEstOLXWv;QedWyeD^|O>Z9QAk?30hJxlZZew0K zSMxB^XMh=5Ip(~Q#^&bPB(=DbXbeOTxK1>uOm;~}iAci0q5>>ukoloAt+wLoX@mGXoZAvXa!;#%W zmd;%nu2Sp=&)$imMA$gbR`tzfoo?FJ+)i#KwP@q!7L$j5#4g^4wiq9J)3ciB=(6jA z?$zRjP&J!H9IxfE`K18z8Baru{vB>QYH{1Ko2>X#U(s}FZgorK7gIT6vkmge!8?no zZ1lk0$Bqr}p|q-pj_nw*NPi}FU&GLS(ex`29eMLNe;xz@$TiE*y3pQkm+ zomj?Xkw6##;N$=^gY0BzDVJLwiXzx0Uhnk16lXZ|hQxn103FJ8TC zi1?|hc!y5$a%p}yx6?qGR#+|UE(wgImI0ZF5(daSvyRx}vV~fl&N5m8vS-Wsmy7&O zV0X!9X9+-4k{^+en;ZK5Mm?(*Idz?3{@HgMM)S5-R>U!%Lbw2aRqdWB_(h`43+fgZ zGsAX3mF*_UQm2wqQn(y++)YJq@ZL)c3ms>{`s{&7DX7IfW=JicviYD0qy%z70~~T_ zl~|;7#kRCZ6CZ;7SWLG@B)LL><~czb?B6NLBE28N_ue$J@blT}8Vp*bb4i&Aapndb zZ6kh1{qtSd!$|xQrAs9Dn$?}v@gNP>wr5Ji)V-|H@(I%Q%~w@>0Fj%wn?6*GOu^3taM-{n zjC8=`wS6m~Xfs{C$ARwEaCHv=OpJn>(k)z<*mnu=hH7dJ7Qtm=B$@WXJ*Gv5GpD602AK1 z>t-utj*sk`#`(uxeUXn{6D0P?%C^yy)?_YZxU%jCTEN zYe>?3C3$&1t^WWB>b0x33}NOG#k6OJGHxT(u>|z4Z?CrXW~7d34P+TG=e zF1(nnWGw}oO$2C?oDvJU3<&B010I#@9}KjOcTt5W@dlwBwk;zhR`$|GJcz($NobI# z*Kzuq=H-Ln#<`;xxi;Et_J~j=vnhNMPSsiX10?cKUi6*>k4Mt(q+bMT7kAl}cBE|_ zY+s;O4&pgS1C{5~*0!gJQtElQj5L&5ar_UZbbM{{tnM5-5(3;9!3X=eMGOJ$k;kQZ z_lf*TuIV?II&|YkSX7B4x0ufhNuHRLtg3KFY;)HYhpX#ag@x76_N9%?GfkXCWsMR> zBb8+G*+D0{8TTD)%luK|zYW9Tuk5tdWV4>=541slW{&tDctdpV#DymV3+Q;RsJF9c znNF47#cvY)LeM5=(fntnojIhECZ6Wce)%F??ojea5mG<{C;VoZIi%PY+OPQiwpJuvsD|Ed+{LBD3 z{@@>tcD@h0_<47AABXgta|PYvvP)rc8kjQU3>C>%Opc5RB;vVi&N1n8*P(>w(P(`I zaii&%@lO@RR~}x*Xhn)_jzA9&CSA*S&IYIq8n$7^x@GH7^Kjwl;Uyb6aRl2GvhGONlLtf&h#H*-~%-BxBo(;`N^p==M6L zzKx;BHO0h|i6>b?rb6chR7vulNh2Y@8s&JEeYHBFf|^%SI$!u@-7`VBI;X?y%lik3 zRppv{hDTlBdoadgRZuzPHhN;Zok!s}jqP;VZ144pd%GuNDZ071^4F2hvRw+hK| zr`%mKtWgFf3`yjm-g@!JY-YXpR9zza(QLI_Rk|~?3x#A^T1DW4uq1f|`*GOUOlvvD z>6}xoQk3m0GxICKz6S8e_LNHY*BXqV7hyZiFhHboSMIULI9whp>|Fy-({vkKONcEN zTPawND%VL8Ou@L$UEV+e#_VJY*wnrj+gxgLN#VpcjHCCBZ+ShOsS_NLm5>G*?X;S& zu6SDeNPBajYt3s7xMshK_lIO0xeOv^-N#Vl1M62BwHMlEbt|dtj;B=kLv5<-cDm-3 zKAWc5$qxDLmJ4XEUvlM`$nlol>~n)&RpXzs={k%WUZZbws@TBdR+8=DxkH?7E9J(I zkUAC^^fk-c{?d8}g|&-oZxOwwsis^^rY%IpCRE1553r{8+l+<^0X+?Re~B)<4e=e9 zUDEZ-87}3ukXzo$sc*4ckOXWJNfa>TZU?_L(5p_~@xrNg_@I zi0yA#g1VgJ9ibr*Nk|k^I5jOe+_xo5kVY8$rZK1Sz-W;Z;L8+9=QzNYs#%G z9tq~Lvb?svT{h4$cp7Ut=eZ0=m>yFzWN^m|u=L2zM`3@fN2TgoX1A!#r}&dewXibl z34RtUl@f!q?7nj*=2l$g7?a5MIaGwF?xu9os~Bq4$j`>Pz8u4Kr$v7js}0}Cv%$Su z+CVTuV;zqpo=4PHPlUXAVdI|>MxG(?+Ul_~Y-zmN;(d+$K%?hy&-mAtc$&|`ULp;^rPi#4CXZpmGf=Hk?o5;SYsZ-yUk@S?E? zqhNh%<3kY#sQs-d>nI-!$>RS223X6w$3nk(84eojRk#eT+#e*aN8%6CxgAr*Fl!eo zZ}dxdf;AyyYrDx9U~#pjo=jl&#t*f9m*NkE{sh$8X|ApAY*~RVCAGz+)FMtZnPPHA zayVg;@89L$h+ht5@T1FjVJlr*Lcw>U?qD0H;4%7Fd?BUUG+4S)_hNYzdX&~Ay|uNp zeD!D%zX82i*Jq_`noat$_^~b{&cJ20+Z-{b@0)VQn~qneKD^fpBpQT@8EtOe6z;;p za1X9}RmnBD&8pg8>CRjYp__8IuQ9I0k!uGOU9o~W1 z#m7##tlNJGXnK{L*Eaqz;6d>F<38$>_yyQAiL7-!Si_g z?$a-x8`-yW+}5t0@c#heycR2L+HIboApZcDrGht*p4rOzXY#BKU&DU`r@2cD%RlUE zlwwS=BysfTEQ!z4E6q%ybz=!iGT&pf@i)XBFXAtS?xpZ1lXZD(3}9Zx_5?VIzE*RE z4%>Q?ppa|I^eYdBcHSNlKZ9h{H8Ya0BzI;nnEwD9oa_L0U=N_LqL7WOw{Z;_)U`O3uijavzh{{TB`K!!8faAdEwaYMd)jcW#x|rzEc`biGhwX6DJ)_dv1sEMtj}%8cv#l zRe{NN5bkaODnjym?FR$!uQ&0x!~XycYWMTrc$($BGax`M?iIJBjp*g#3`z9dcG7s`5s2*Evq7*;v=bem3yu#4itAPTC#J8z!I6n@_YXq)0k8*8u$4<70bZS1%vM z?-F0bJ%+un5419&sUBOH$WA9~-=el0-0O|OgmK=)R*(HLSD_O0h6Wc1$H z&(xOm6{CY%q+DQ^Q-{$0B79Hqj;|)I_8W-q8U}~=_P$~w^xPHH;EuT%=DIuo0NO)X z)eNtUx>d1;k2{9(Aw^OQZxI(btp~Q7|u>q4!%8e{D~O4`ArfFiKcKlGfLn#Jrr;& z=1nt6@YUq^vg!JzymKM{07kaRP1*h+vY`j)2qL;qhdQ2{t?JWRc*0AKQfo;zTOpCQ z05|}ULE!WqJ*#V9V;QK$*&d6opM{U5OBB%B{k~TH%xiBRPfV*wxDoa5lV3YL@xiVo zu8(T)-cKNg2;wMFi<|`w$Y4*kevDXr8}L=Ood&1keKyv?Zd9}}{hZuN>x}0LM&D3b z#(fQWFNq@fH{t7q)%0e#wz#vDG+%4e3?zZnp=QWA=)iGZ9I0+#n|mII;R_!Ld?oPy zoj;HCvpbSJnEppM|vmo+$9V(CXJM8b#y@BV)51 zD#+}cNk4lzC!E*jpO1bo-1zX?>3V#(FAci}KuV9F7~Q}wMmuB*uWPCJhr?bU8s3R& zmbX$&5YH>z2}@@nqLcv`fyq*GJu66JIbE6}SZK>seL3R)004N8UDs{=L#$fr7CMc) zp-W&^3v(KBJhoXKKs;ne9@ZUs$*UID_uel507uodn+-VI%+g15C8JAj@vCK`+$Bcc z#xs$Dn()mN_L=yT4b&go`fS?5!a@i!yyuRb2hXQ9>o#8-Ehf}uy`R8(ysL12{I;e^ z6duKt1Rx&7XC3?3Vyu}8mA5qfMdHmfPts-6UMo^Jh@g%OTZD`SJBAgcn6qc2Z64L# z_;W^mYr*k&gU0$z>=sPIPqeMimhZcuc$|kA$M;9M73Mw`_@(2N@omPX;SDcDv9{W& zaWp1rFk=k}G>@2q0*&X$(5!L?N;nEjd82cMZ(kDK_3#a$^?OZSq$ z$SOiD{_ZyU-}FADx$r)bY2oWwW`=v`wt&eniVLXXmPg~3AeIF54JXrRuQZ$C{-Cig zt*ZErJr=>CX<8UG*d5z599j_4E>k%TEqen>QSYmfYf`XCtr#`hshh@ZX7kGH7P^L-57AUk)C5)h0xYFG0HDV;p4spmKdheWRoJ zqeSuknz~>F&h8pSP!W3YSg6laUnlCChOwpF zTsEz!SvA$^bz6w<$xv>Emw9{&DgqiKF1)#aZ>xw_QS1}`PN(RsoE+2l41 zfM?Vi>iWKyIX#RcE1uP_{138%+D%cf;j(#ii0z!-%8!hfc%#f=e-JC@>;C|TI-Z&( zj_%7<*L0hL584TM!pNlk*wcR?_Xpawyhq_b5@}Ycd!%0LS2qEXt~~pQ-AiDN%HC%1 zqp)BPtr{h_kL+M+^{rP^f*XX`vDn;5tF(X5LmAnCI}uq!)4|;+}>ck?_w{ z)^t1hv}+w|7*=MDgQPMOjD{@oZEyw-F}nxfkh-73KMMGBMxRsFyhWSKN7qP z;%zHT)i0tNeeRbidzdc(xsv6wKIF)$Azm|v&fk8gCZ!!7j3doCb4A`Kg~_CAmsfD< z-XGC!QhkC&jZm57Q_$_ka@}~%bv_ch)a)&8V!pAwgDS+olM*nSb}-UD8~{E401Ep5 z080I$eiz=v+J)Q+4fG$nvym;)8U$cdnM?VsdFOyVtIm9D@e|=@wqIk~7LtRet%Jx|Aq-KfZkV`j~cmWrT`ix`p zttoZy0LQ1ckKzkS^z&}Jw_S|fDLr_Nh~(#jD;0coVl^mW&~9}ryC{KJE^n>G5k-J- za>22T{{RO=(z{|QxiAGJeQ;|hN;hoT%334C^$YvOc_xBuMPP6n&2xaf1NS)3)E{c+6XJJ>G&p3k zj_IY`89|N7z$ZO(ow?)#(z|aEcuz@~N2Imu*xX9W85%P(q5=WjR}2XCBOd+huYZPq z4AC^pbEEiG{7rW(EG3@u@t}nq@ErtFsbQXRjQiGBj?7Y;j;#5(UF-fcy-QOr#U$X9 zz|TL4KbbZ3hk?EWcy8}ceM7{0jm_M##T?P;)?r%Zw}ZpP8+3gz2|eqh@F#$D*lm|d zn@C8SSybKJO3MtAM!7p;mQcba&vhG)KJe}IKY(Cg3;3wX;oUw9T_WL++HWu87ji`H zjI3`I&Ni_bEZlVBw0w#-M+PGiQM944<=z_H@!^R(+UgXN8- zk(8mvNdOH0053rCAHnS##}is4Z)vAkvY9R-vzAGoSH@H-NbQZMsRVmfJ#$&Hz4(Im zT0BPX+|FdYi4)8cy8NO}a8qbF3OMJU_33MUpy}Gpp}5iFf=4AXGOi=WOEv)q>E5|2 zQ;U~BE~huPs~uFC;rhqyt79Fa$)nz8SLH?YQbwD59HThTw_jTByfZ(CJOidj;V%u^ z!d^B(eR}I8Z8YlHZxKIKy9Y-U-y=_iXPh+80sWtDjZd)tw7;1Lf0en3Iyva0PX}ghIX-Juz68Rkp zo;l7c4N_fFbklFNnG(**EJo2@-D2ICXK7GFGaU5|mE$$we-*q9X?tw~Xb@?uv6t-^ zHpN{G(&U8mlq&S>M;OT?71ElOu1cnxvo(B0@#n!8c5=<&>nq(qP`$?Z5;c=D9;6m0 z13Z8;inpZvYHd<$4L4D@m&*GvibYl}Eb=J%S>4>R7|+YN4EqdM&5?Lh#d>|^#fFVH zlPoC4R*AMdM}wWNK4Ppo;NXh0qUcu^GF$49YZg$mN1c;MT1aqu6~X85#b}$^9S(&w zw?3q?)lZG}sPsEnWV5(*l^R=;k)td?xB9|QDvQ*SlfcRAvEk+MGebODG|U#<$Phi* zCP;|;fCIg`>%a%5J64B)^q&Ok`czu2{q@kox7!2&h~!oEX%ic1hNky0e7CYR;ny`tZtV2W6f}17#SvRrqyh7TpOFHV zEzfeJk80^WOXA&kN75(K4aB-+cM*M};KeEl8~{oAHx>#x_*-l?zyF;@!lr;REd&FfW}Exj1$~sw;8T?Lh;4kh30A+ecaYo zK!x%PBkAuD=k5m54S?wpeDdxOsJ{e@t0;B%5cigjh9B z%_zS1x%4-NFD-88YZ2l@e38Pcmk<^a1#ke!&g^ISd)Ga$cvkmA)?72qdub`g=-9;@ zImUN3Fc^ObJx()L{u=x<)qD>q@jSYMMJtDk$}zEt7>|_Um-mhvk%7S(%|)u;YPYgI zuB|P__MH7vUBt8LI%1jZC;izM z3^N?KC0swt{9JS+*ERD^{H8r#Ye`{>CWb>EBT%?1aC!lrd)LukF~8ES;g0uB)8Mgz zHp3JW5j2xv<(#?YN$5HZ3h-@GZ97udrMZ^f(kB2a!L@lEbCJpS@7}JXTlG5d(UMl^ zc3K^Uyv8+_7I7d0_ilG&`<#mJuY4aO+e9qH&dvs7J6*DH00mXC&wA&4BV#FKmru63 znR)_UnmJuZ=sCY+nx!MD&X zbiWBtX92yk)zd91fXuE5qht-C|OJ{{Rq}xm;(Q9GqvZeDQr9--vZrhgFT5;sz2Y z*tZyv06G=MHlF$XYG*-IUh*@g750yywQq@f?z4Ax@oDoBJjUYTS|D)Ahb@rXm&?H5 zoO+6jQuv>v-&{A_t?!{$NSbddWb)@_P!1HSE0fd{`PUop($3pU@ezh=+q;RPjomF} zSDG{ga8cB=E1sAu&#iWvFT=e<#X9uY_c|`4X=v>1w-YLaCma@yaUsd|+AD|H)Qt4l z^dmY}vpU1#ORpDQ>Gs+OhNptTQYfyT(oa0H2Hg8ulm(M%=Lhnx{MhMmDO-IqOFMg3 zAh~Qazi}hC%-HS+8K^gSgW>+09NIRc9G5oeh%F_3!Wi4-X$)(-VlH}Tzg*Xlc$Zo6 zJgs+kF28LYR&cbEEJy*HrxB~63NpZCfz4>K>Xwt-YJ;2iG(DEVZ*I$MjRUDN0?1p1 z8Ne9|-8=TK3QL_@&i3P3eIbOqT^`}`Blg0sR2+MISI<5V_{(*t>rme6y4}M{3q>`o zv7fWNK>UG99B0?%1L`a3X#OkSdG>m(?xdF*doxPbN{9m&7*!3l9jW(*4oUBhD`lBc zT2%K)tB0>i?Q_UA_tEuvXw9eE-NzamJBem=pLYrq%M0bUIVYwCMSMjsiW0gvq3tcIvp!(dejnJelvv-D zc#kp4oPs)z+>V_q0^7ib^^kqJ0cI-O)cl|h=O^;TdOo5qt}Y%~u40yFW;?cmj7iC3 zkTOrbdMCr1Jr2pHO>#S1qb}A$Hn|5pjxbbXwPvfv*SV!vRx0+n=H4Ih7LRD~-L|~5 z0{cvG#8s5^IWBModY$b0KA9?6S?V)J3hmrx1h=W&gbaNJZ+M5oJ`}&yZg2ER?`&XQuUR;-%M)>6pR}s=SfaUCDI! zi1X?<1z=%>mUaP$W5#$RxvLglF^fqi()#gIS8~OJu{a%x2d|}hj<;)LtlyvbL+w^8 zWpJAX!3;dr(56g3I@v&S6x0z9-IOOeRETu=ODt)MxXxNv6zKrZO zFCOR@!9vL?niW+^6ya13xEaY}dYZf8KZ=?ajh)7nGA2pLL$0RE726}R9F?=N+iF5_s%!oenv?YTd)YSWRYbFmXgI2Nh z#;aAjIW^&b5nIAG<~5H}ywvZ);huhsdy(8P zTnguWGj7LUsTJt@M}oc@rIgp+BEMn^uE8;Q-Tii`9W(EbdVg9` z3VBx~xuWzqKLY$wwD8TP#+`X=rDq#=;E*xVvCqsi*1aYEB=}BCCydV_^AwWB(H(wV zZ5afSo_kj#spy^rw~zZv!`84%9lQB*CEUhDlXv?n%J{~41QA|8b)ksnkZw||&&qPX z*yQo}(~VUoT=Muy-p5a`_=3Yy*tWmx0m&feci~lhF=utCU&(TA9?II(ZephrNXMd} zJ;|xOFX7L%q_<=fTWP0QZ*L;FvPTpU$Ppuv3G0#xQP6|a z9ZqZKPY!rO-sbD=kj)%YL5F!-MPwxOAc30fzSpE^lY}>R(_@&{}bV>Axtv+astnn?xkJXr*9mkviJJ*=U;f+g0@jM&k z)FQJR4E{>7keqY1%PO4p;QM=4UYq0ldr8twI!NMRSS*%mU{&A4Z3T8@j{8k}q(2j8 zw6uWS!*ce9-GfDYJacZ1hXq`PW#n=(gXvbQq_j9^hOHerOgGi^8!Ohfi&KIdINjt~ zE?g|E?~+hPjlND#Jaw#jE-$Vx7~Q0YPH^tOXGgYNkZ?zsqXeG3b6hr~<1HrRRk!}n z&|6!I$svs>VR5nTAN$LB!OJ{o7ym^rrfgtJpk!hM-xrG84|$N zOIVM;@OG6PH&>90i)hvAKk+i|)^MdzH3dH2P8rlsOL zVDgJ?a^Zwqp^1>O+@D7r1NqmTUFr7vgs{go^lxq(esh^i5!{}Yx7Ohu*`*9ETkCrs zITPwSG>BObl3Q{<&=02#jMubyOU4?M5pJ;69@Us(&Opf?pyV3S@ehD?>%R{R+iM%B z^tjh}l1NBaBfjDR{*~cTEVh>$W5^)-9%?COIBZ4LIVWdlXL~-(?E0MLA9(sVMAWW4 zRpPsAd+SrGIxxk;F@i|*{7zJ=mG(HVs603D>KzX1O;bp>h+SL{o>!B6gdV`RLF_Oq z?;q;EA=YgMnW3z9oCdplhenWRoS;@Ck?X~H-TwfL zz8lyydIqtl$z?oX12aQ~Ez@vtNo@ByN*OmC^Ow%rb zE~t#7CvO=&yLG5z@uXLic~HaTksjkN@w4*kGg+YrZYK z*RF*6yLpnLgin+z0654{I-dPGuRqnbCKm{n##weaVvF|-owkV^FD@Wpxxcq3P^y=daSvVSc@i3-dVgWC@hoR0qhEm=Mvhfxa$oo?3{ zIT5Qd-TYm%f%NHIe%?LLL1AUs!j0^#;S8x8sT_i!(Q&Fj+-^>?U0Um!F60`zctrQ@W;jW+Gy8pAzAH)4*2Gc*bnzZWc~uP ztBj>drBZ2MMR&U*SV>yx6MeN186#s8{{VY-(0>3bMb>3cnQlQR(XsjT&2d*S>&%&( z&DuK^HJBNY{`H9`2MyOX*BY;*Ii-ct@<*Z#VjPxnmpxB&O`B4*l<+pTFni{_-L55B zH?BbM&T4aaaH*8Xuf0>LBPE89W4exI3$`|Fd*hGSH3MDlZKZd6@mzSnnHT3Ax}-jWn>|?mHAC__S&-TCvX6E=~q9r-bKV*^I5j~ zm+bo+2TZbTkqV)1Y|&&FZ#mE*a4GQM0YZ#&7_|D zh6()W<_10Dx@bJnDL^_ zr2ZA0+J2mpe(cL4ss8|$geGy*802Q6o-#6RS?T3tIa6ysG8{xy0Z3Eo<#+OIBP82hS{teHNTO#c8n&=Po#HVula}?fDVcQ_9V;y+M zy>mC-7x6x?clOOf;%VfZ>Z6D?)FC8vGXV-ZPBdZ7l7w6IW>57?6 zB-+%%c3PfR{tvy>=C_K%=E6(M(5v=YjMnBd-2{(1Lkf>@_Z*e3xv8=q|BV#A;1~~^A`t`4`G}~{2{sGlLwERNJq+M7jW2WjBlB>9Gj*!kn z$&6zGeeig%EBKf3%E!d1d2QjFNp5Yf@{HGL(I&yb`CE2#=l}w_m1?e9M?*hp7X8!9 zqJgaZHZQe^EqBh2Z6TUAn5hGU_Lz|}M`a9D_cg;u<8Kpbe{yN8q`6X(n^ENnBlN%| zoca(2bpHSh{1M^L6YFhz;w^5^NwBt&USQ$b@t#CVs>J>{1J=HV)V>t_2{%(;SorED zSzjD4BDBQKu?SPeKRb+P%}k-vQyXnlJ3n5|J8b z$$0ewfs1xk+NeoAer3&YVyYzWrqe2|DA_eFNp-)6o;dI)hi&gPO=X@ti5YRGK`JT+ zJQieDRqcXsJ?gK7yalRww5*>HJX<_gQRie)d9t&~ob7p9BtiHwHTCX|;il5`S-dT+ zc;GenmHvkZnqo-U^xohwEuT_95neswweWw2WRBCtJ|;_x>6H1<+t|f)p!5bujIk%v zkWFKS%(iTK_008BbTU@B;?miZHD_GNnarm4|9i)#E!7j+vLbvfMHt7lD<|8MH zvmcESM86~{73n2sUk_HIJHOT5Weigm5n@#ZK@k4Vn z0B*>dAsYVxc&TqONFA~GSC;t0z!&37gY7!jkE<#-nG_c6=4IXdMII#sKBcqmUbB}v zw26im&ds)cW$=&VH;J{Y-|d^vvdyF2%jBB|GNVAb0U0E8kPvh80h8@tNcg+qpM`IY zt=6SuJ~bA2)Z1KK+(Bq@(Y%=fh_`Gf2d*pfYr}fCh;(O?%F9p|P(!vxwzx8wt~Q+Q z2@_;&f?Q<8Wh%_$?%|F<12;b-hh<-ZSuz!_NSCEZKM- z`rlT#zHlz5U*AfIIyy{*q89XAU~$h{^4}OY#D5j)(&}2=cUpw^BudgtY+`ASF}n&j zkOu=CV!a#T2g8^k)Gn?*A?Xo+V$Bfp?xo!Xf<^;~11|X)dShuoc?P;4t^L*N#*p^x}YB-HKovoG%L*4pBJpLK+|37qv9$GNVs{5{k)4PNfoNWO5( zx*IgPPczQ9=LqSHfJapyiLGfoD{pHE@Q=fdPgAqB)a4RMb8{y0gmh6NxDoNtZRggz zwKu*7Qktf|bqkwiQ3UsKqquBgSym-3a(!H%diSYvC2EHZuXf^i6rTk=Pj9A6dp@u{ zI=1o^TRld}Y{t-X%(B9+s;$UUL-E%gDVoo~-F_Hkm&4ZjQ^BaJu$Ehsb`S%&vN4Vj z3moz|Beiu}SH&+J$*fGCEVnw`kxL|F%aNfA5$HrM8QX!?w>4~dqs0+@fIYkoEO91& z!zl?GJ9Seed=cN2HHBLES;eDRMyhJ&UxsvF8EElZX|r5dTge6!%!I6IjxeQMxL`Z& zHS70YJ-yJP5$OnTbvseIb8QKdB0B#7aX|WpIIoG|z1ASqS5%73+d|R@5XB^uc|AcO zu=2qpBz(O)SFZR7_=Cjy%=Q|6)#bv>j#gWnw}eD-lD{BDIP}2J>0Fd3;cs|HUgE78 zZ!M0O#a|pXJ!?U`OXzK&mPL^+k{h2s?NknTA&)8l00KC#6YzJ5yhG#5(WLl)O}e;} zE*tFU$$4U5ml8<1bAjqMiuyxW_`qoLeGHlAs9I^d zFM%&7lR}CME7etbBy0Zwv!ubsa~k}?@t&jb&3dYmo`~j+PR8z=@S1Du`+IF~?LXP@ zg?7`P?HV*~y~$t)Uc)~5uJ2gTyer|RgtnOaFP$(|yh)3~>Z%Dbq$xa{XZV!|^R5p= z_`;UDlIi-Ty!XNeL{^IOCx-{2#E`_qW0QtIop;*5inSDmNiOw+YhunBE#rzikmMYw z+RLBIKi0gj>^^yZ@v9mvMAFdYlSQ@Hb=B2$Tj#qLtRotcgn59I0NFq$zseQdaKG=M z&!DfK{A=O;5j9;-&%|+RGDxo5H59mK3IRVXkpBPz_5={4wS7bPEJ4!5xF3D80p@k@z=vWFHy6Fv^$%b zZx?f@l%FnALV`9EmEZxpcW+@|LR#tG3BGA{9TMUnwWJ8mZFEX3vwsj7=rPcOGwEJK zsd&D4^?7tz^f=-njAi7U!pw|1#`}=59=PVYaMaY_yCm(|+~~#1YRaTq^;Tz*+Ux!! z@Wz#GrfB{iw9{^FByY4|t1Pp&NI6xMZUu4tB;vh~PSi9D?Hf?l^}`&xt>P@E=4-ib z36e4Lt0^lae!w#U>5A%nK|h4G4+=%${{RVG+}TWy9Nk>qw2p@#G6>y>QJ>;d`PY;9 zdc)!!rTmts#?o2Ft%V0uU@_`ZSe~7*Yp$g}S8JYANvrI7#+C8Hcx`QMHEU}t_#hiv z1|$hjMd6vjApZce54~k;KNBqe!{#-k!5_?3E!h{6e(L~=rvr{h*06k6@hig7cuMO> z@l=Vc>#ANMa}h%cdw$keUN#TyHD`x+3j>>y)y11LP?V}swd zH$(8&pLca}qigfaExhtaBkB9Rz$3=xkU8GldHdVDS1zIX>0ADoLv( zaAGj?gV27X;BN`)dR^X^;adnanIMr;X1R$Zkbn+$i4NXD>yp*uQ~V*;w7Dg@(S^O# zcHl|o+?64RbRk^r$6uLO>x%7sRifW`S65Qk@k~C>E~7Sur$$LQ00-E?hI(VCBQ?U< zUHFeudB%e@s)jZO+DUxGJBA4{xg+#A?OLaOMMgEFw6yabaxP%g%G=8pojJe@GX{%y zQbt#3QH*spA9DC`v7?~wii#Q?t}$WPCt3Z-)<`h zC%QUgNj*$&5n5acS*4fE!(~SRen0_StWNQ-Ce z9`(pi8nY7$l4_H>I$;YVUL9SM77|)Q!TRk5K>7f9{3*|IYdKa}{G}aLa>Sph{{ZXO zJXb0(k_;Z0HGE95s9}tH3M_1qW?Nz-XM_+qKX;san#_s@l(}<&zk9#oRIXUfBr7Y8`#z^_PcdaJVghOm3AV?D)vukgas_fzns zz9^a)?xT_j_FLOrhn*CUlsS)uVg@+?lV6qEbKmI_nJnMT-T`$W0g!qC*~t2gdson2 z9QcppD|_g!{2`+jk?oq^_S$Hp7VMARNM*)4j0MMPnsZTlky?!2u{C}rO{MFa!^Lj* zk8foxhFD}1p|^AQn7_}?Mh_g|9Qt-&3cNevZBJE6EneSIol#i5%#sB~=yDy9;1kzr z&uZpxJ|KKYdnVIh)AZ{bMrB#!%d(zw0dbAJPH@7wjUT{%D)9!RbtRUiV2JKXg2>4t zMn^bS1%b!==M^)(?-A37^B;V8qs5*af*W~!NSbu1ro>rNE2Oudc;FbLiA0WZkG$AD z&rEInG4W4?JbSFRpQk0Jp(9!mCBCYw_Hv8H=UJSm8Rr=U_OFSqye(ni`!~Pw6WiZB zWeaK1I!ipNPf|Bz4B(!p9jlzt{9~_ajdOqD>k9~xU(86nr4EDmMim0*2dD$SE1R0P zKQnq4C_>hW_XmpY{59b%P{*d}>u)u~vAT-gp-Uxb#uv$o6^JhJ$MLB=;Bsrn{7>SW zYkfLfOHBYtr$H)9BxcA7!!hH^-ih*`?y1^OIL-}xxvWF4>RO`eJ}K6;^^KHD+omEY zk%{>gPQq9L(0(Si1(?_r)ifr65Ww3TBM3vNn-Sg zN64$YBY~f#eG{VT{x#PY(_Fp27Hy^6?%Arr<=d>0@~%-M5wovg+}FH#Qex-1E9Q4o|)Y z4QRuq>oPl9n+v(5i-u_7V~lpk2lB72z8mX4C)PDPNVH2d)U`HpAS~;c!QlL|D}@8O z8*Atf82l`~lxfTHCjQ#O_H4+CQLdqg4#nYU!V$p=NX2fVnlqju#o43s{^L#7nVI0W zxOR^UccUG+?a0XDyBj|Uc;`^FN4K=PbyOQ%hAOG)^Yk3>GxV>mJW24ULylWZjVj{9 zRJ)Q)+({k(0Fcs^S2ABXaW8DNt3N#0aZ&ch3` zrw0Qd=d~*(xO;sxJ|fb*593#y#4H-+fcc|nHp^2VZHyA|FrMT}cORImMhIctt7GX>TliPQS3>tz zj?B+x9^6~NjRf0C!NF-V=jfxJ)r97j#VW1tkIwx&!k-rOi|FLhG|R}$AL{>TtNOozelhCq4zi{zdyZz3(H2R0>KRjO6YIHvKBm6A()2%v^XhkS>Ke`dk!H?B z5yXPvTbvB6hC~gVp6n`3QGOoyJtVWX@g4T4ml2Z`su#{yJ$^vA9@~!|^$!sht&6qx zK0t@Tn&z8p{f?G8)&8Ecd9uYRf*4G|1>Ujw+lD{`mOs+Aqwv15u0)zu#2THHaqeY~ z=45El`le)HcQji%%F7Jv9EUt*gNIN(K_eCQWrv8gZ7S(M;bUnFb1V!@ z7dN(s-4th^lm`q4T(IXpm4~ZM;7^Epgx8Ym38t-~@}p}zSZ+UdF`O6z61}j*`+-=- zRNC89Nn#aD7OezfQRTN=dy^4wx)>|VvG~Ygw4ZA9Zw+`~Rf1sG zx+An3N+M4*Y|chLZ!d8_P=mj(HOqLGUk+)SvuK)fMRj)ZG%#G*=!6nJ3l%v2 z{=&mKH4T@;-xHX>;UUsB?O9UUPu{zUBefks`QiD8(1Y(&I#8Czk;cy2$k6fs0D|>x zLr+ag+6xJ@DSKO6W}4FGGZ_Jc0HjF#aK*4ad9OdR@b`}H4a7ED7N~;Z3(Gmai{~ma zyUH?Qi2O#JHs~YbyLSm*16>|{2lS`uM=t4X2!!U=S6vT-bBnv z`>BOu#N(ozXX{?wW$^z1$Da%#hT~6{OV=+F4>DAlrjq4UobbEA%JdjiIPc!L2&}c} z-T`&uNFml@RWV5*^F#z=YcCytJQ_Se{{Rs0-S2KS$#uK?2u!bWl~5vH(Yp=V=Ohdc z_1R8^x3T5o@wF;@x6t&v&yJURtm$K`>8zI){Dn5eZf*kn%+eGdrzaKA+vz%Q!~+GE zuchht(%nkQa1kx!yNVZ6lM9H|fgE6-bL(DJpxS-D)a%;)$-C8}Rf;P+Ra=~%?IB3V zIPH=%+*hOcde%)kM8DB(7HiU>{J8DsNg?$I%^?t+^-@n98queHk2%tcUh8R^8h7l= z;a?A4rn%sCmE?%a1=gRcIhFYs-5Vgr2Vg>+`c!&f!95RO)tkc$tm%t)4avF;f=e6Q zWBh9x9l+oYcAcQ}Ua6pXviatY=JqJ0p4Aze+j_OgRX=!uvF^Yb;hQzVc*n*NYuch} zdTbWUxD}3h&_MA>fbQDB$Vm11Guo7?#!l@O3iycVnGTomLtcLuO?%;&dwW{~@hrN< z&gPhbg6kv;CK1j^+!T*a_3U~Vz^luoKiayUg>e$X%F7ciN;`Sy_LL0@Ve6Y>biUcNWhnt23_(7#{x2} zpkwLz(Htck-ci@oC75FQc~rjybv`Bioct%J_&#{-QduS6xXUmmXo`+xO|0rO+zvSD z>+)^i!LJKVtnP;ERcmx*%&^$Av2(^U6__use@gqJFBe6q*})!(X>kBxH%D@&6${2m zTx6e23TKG?ORrdHk2Z?`0NQffF?YAJUDsiI;y2pIA5LpZxEgYIhJ;YfE7MLh_pW(| z!~Xz;npLih$6SqXrMG?1Lglw2FCnD!7!X+V!tvUV68LXIlTVuUEQPzi_C&OKJd#ix z0Lnlvag2`j%US->{uij$6yZfbr#q~>g z6~IvUwz6Ao{`MbxBXRxV_03wtsH;Tdt5$N8l+ooMWDR3&s7y69pUw{mmg3||8v~H8 zu{qwo@XB&4#JpMIj}!R2#`hY0o+;GsG$}2c?H19QzR=F!dMK9QZBj|Xfs>AlU!WSd zg>9v?H*jnAlRAL=Hd~VU>98q)_w3m<<=1`#)3mJKYO)L1bq3thzzUd;Kz?%Sflqzs znyy(y&YewkK3BT9-n=kor}%+uZ3MXl1!qjqVkc za;q}J{{V`X#e9L{?}1Zm`o*`1Bh?0^@+!JpJ;XK_jF#>RSJJT{_F;FJ^R+Tk?}J|g)Dqc_Qs0gl@FW}^2+H^hCyi3Ib(I|A8|j0Txq25dz9q*o)agH zwY>^>qwqelJhD8S{>XH+M2*7j20t;SZO12otJM7~KFIu8w6nV{bE;|fY}vRIv9z}! z@>H1&eSf;V*VLXfe+p<$(|8j5Qqr|jie4Gufi2~U_>io(1*PPD*5Gm5t#f`b@wbcY zJShGX(uwh9wCFa;c?GVSFBCopC9RVaBDs?u-0U?jv!0lZAl_tilIxhm0xhbKq}Y4#qj0U zyszU+3u`#;B=SDf9A!<6qwbbM=%^1&jFIVIXh*F0FX8TwajxE5Tx+pB#w&P)B6OBS z=vHZRg>X2-6X+^yR%!C2IXPa|JR`#1JNSJDm8R)4-Ro{ljPlv&>Mf2>QskpM5&$DZwr0EX>7EKkEh$80}sS<1ZV-;>6T; z+u7-`T&R_;ZS&Chr{)=@Eook^1YZQ|1l3ArT=3W)X7Bp7Rd^bG}e8UE% zsL65UYWHSaYiDLxf(RlkdEC-UBi|^`KQ>s`sB1qF?UzPvH^XyDp@(-DMp*1_=bSkC zw=iYLr%}gh`Rl~G)ux!~ai!|F7U?)5MtRtyON{5shjs_C&(^Tr+UC@0G@h0|&d@Z! z2l!R&C-EnWE&k5&dFIqyC6ddZx>aL%)zqAB4hcNhW#iw5-UacFg$IcAy*|#@BnN0- zF(kto`C?MY-G1@s>t8l_H{#x%ZKGORY8v;4bySQbQ#JmbBF-Z3mM+1Vbm2yN^{x57 zG5kJTwX(AD0_m{%iULA}qLaaB-MQP`ZX8!dI&tdGN|CG0x#r&!d;_KE`ivUihpe3* zIF%Sc1YmGgnUD{Z)o-++8e_Q$i+?ko&|6nKY&gska3gt7U5V`f>R;{-avz1_$?h`~L5YvjKd zcrU{KAcErO!1oJbbrKhn-*dwZ#C`0-`4O=H0B4VHP6pS-+K#O%KDXjKDPrDdRT9e? zLxMO6sx!}Vnr)xNm@KtdPqa-fw1BL#G=^-BnN?%Y9W&CQQ?{m&xvk(|+2wpt%XhA7 zA7F*pfgDIAk;v*n1dM$^ucSOR`#AU?MzE4=tvcILD<;*F@>W*c>fDj|06z-O&|PnA ztuA~#vBa|N`DcsDz&QE7L%gu>(!Co}@U`EFZQ}mX)ir6A2n`jLq>(I#xD3&`$Ds!v z^|V_F$@OJTW5M4FJU?!x<3sTCk1P}x<|cjE{v+mO;P*V&%ibXIHHG!%)}N(#b3=I3 zC?tl-?m}SWi2{%~_diV-iRr548LKR7(9t2isHg{@3B2x#K&jBCxX3boGgM zGb(u_@W^*3=rL9_j{@C%Jh@xlTJy0Gy)me64NR##-k5PEJ5zzo~H)VHun7?M@L5yHy($ym{4k&1!*L?_a{7SG_fh^?fLQPuT` z;kUOSsy)giA^i>(VgUA1ewC_^HpQ(qXFMC>RrZ-SsikUDTkG*Waf@5HBDRbv>cV~a zY<9v1C$Q^V^L$8sGTPGHPPWviakcIzv$zculCK-QvHY4$hc(Ky>_M_B9UHy^GM&9Tj2id-7Vg6T0K(z?Qw%z0r4+eD zw}?q2W1Y@b_JDhgeif`O7pX2RmixjM8qTomqFw9Ow$kUyn#XHFkUsGl4aY)2uQ2f+ z!w(8rU!{fTimxv<30w&yYhcW|{_%N%CqGZZy<1iBw}kI46H3)4xt`W7szfau4mjs) z6n0#mNCiRfTle;#2z9GXHf=nz&mWeM+ue|?NIx+mBrCOmKRZe}?OJepvGM-^#NATmK%VaY7|+~L%%dKIrxohQ z<36>f*_8W5(YaWHI%<3=;<#!(mJO^dsgw=i~rRCn8a;pqCGT+FvEQ)?mp#r4;$Ed3k?H!Z*S3R$voL-PJ$DR%vIzICt3dGPx#H_vIWD|RvB!K*lVfWXvRt|h<-D*51EDqZewY6M z3ljR|SlhH1!jCwAuI4NmgT3vi2%xQ{b7eFo89i{|Ot zq;btMwYb{Cc%zH~8#u`;AW*Hhrg{3-l(RWKBzW@6`Cl{LpP8DEgM4YI*<9(GzLu{v zDZQjHta1b#515rC`wZ8OTX-Vs%I#K2WZ}MRiE?3$dln$z0p7mU_<`cxI>%JFl1(Cg zM@X?OEhW0Qkvx{@+^*#you!M55nl`@v-^wNI|* z0M-?86ze^;VG3upbNJR0<$D^XQ`%e}02X)}@o%-A3fERdka@9vvNsHK z%AK+)1p8*aNqlR4sl;?23HUzmMT*Q1HHc~BjfYk98H$C+Ly=w*{yFg`xeLJe*Dx9K zU5wjuG5B*{`=(uJJ{$ObEIujL;-C9WM=W;wY=TLaNZ0R5O9+AI=EQ7s{8g1na;*gJ ztfjf*o-ov<&xLN3>Pn$2BV zp6z+@L&iu1f7mXiauj1YKEY2ltKn~p{x7lBmM<0C9X8703})rvDB%xMa5Crc&%dWP zWqxL}jM}4IUiB|4Hq`e}3grDwbaygX>zXr3tUJ0O1dbpAYn{Xt#ynhfung5&YYsl0`jFpCiUll78xE(zN_(@hIu{NiT@B31w{U ziZAVFyS8oF#@)rrw>auZ74apmk0MWTKZfq2b&djO6Q3<{kU&LKmifC8Q`l>^dRaDp zCDD@SaNH)gP?9O_{2e}(YL{a#V+)^6+V~&DJ~I+{gG8`~(%LswluLR;q=)`lk%HMA zWRksj%u8PA#Rk^=q} zq?DSoM?9>hWNG-z#y1`lfi#^i8*NTWrDy%kqxlf1;exqra>tQ@j{cS5ce=NUb?+E8 zt;U-jrTC4AiZH4f0`M1cBXJxK2iCDQPZ?@Dky|UPCcL|e^8jazTgC_R6Btt1>`BE% zqj(?29xB)4`+eoKZE+w4mgPqT@Vp#__7$ZxYb6w}&VjD{TDR{epJr0-XbQ>mEzQQ( z!flkO+N5pyKwZEdq#D=oufxv~>vL*T>pFFooU00~CgLTwz}x=-EYL<|XE@G6_2ioR z!$!AH0I%-vygz1=z>zdQTQ?{^@n1ceiN=2JIq6?L{7CqH21?HTm2UU$UxO z+r~4>gN7qL$RLUwoHb<9r0P8xli|%SPlwthi>j5ny<5R9)*@%dK2RCHU_aRlv>t1@ z*1j^%ma-_gCQ_-fUQhL4jsrFURUh3|2Q}b6G4WoLa_DUk#8ZigyO!bP!Re9?&^uR; zYP$86)yx7s$K|OERf#7&;P*dTmxxcH(y(avZGYm@HG$KuZW~cElJ{)v!DN%vo&15@ zIXV2R=PgF~>Nir|PT)xFeqK(|o`W5#JH1}oPnCB*(~p#GTz&$*FTg$xweee-AS~z# ztD-A225tZ#4`0LHvrbdc+maNO%U%odZ-%@%ZldDBu4h87q_G$(bC4L3*mf1a;vbCD zYw%n`+GGnPuH_{8gP?PhwL$XK`|T&bb6%a`uYz6|z3~mjmx`|MY+!;ScExI1LfwuC zbyfAX?rPiS(rJ}ljcXxz8ciN zAnOwwJsR$NIFkzN`|^&s;4wkRA4>E;2KWodcC9_*T9~fdZ!}MEz{etU_x}Ko9)oZd z_12l;3#}7Tw9w^`O}B|+FBhAL&;ozFSPkC5XVg{C8EVU%S4S5vfA6e`6)O#}v?q5H8Wl z0as|_gOOEyEg!_c3TW2)R*AW6>{+9?x0smR=PYu}2Hc)<*aNk5;vp+uGD)22>!Go8 z`!0Mou?=mi&8gpBZXrI=aETwwoN*Fv=dcF5zY6}&-V4$+V}GW2b4}Fd3`X0rBD1g@ zsA-D`rHVa57+HiDNf(qd2pe}EI^^X}I*w|NnW1=| zO(rc%Te&uOHxZXxD|^(qjW=)xQ4vcI;^5<^Pg=%r3TS_6G3&a)f^tJiFg|A3&l^tI z-v`(M>F-xd1Is5TGZk6cG4*P|88dXp~c&#yQ zqo0*K31cQ8`UIL2#NPS*5)1?ba0vTe0HNKvGBf?y;m$O{=^2oHgl z;E;Ia*U26{_@$}a-KK)^MWw~&ZAk2`{IMxs2ImT0`1LsUuQKr*aqAj;-rh*?Z6E7M z+N0A7JNs9Oh|TRTNXJ9hp_Ix{Q=F`K{vp*DU%J(ePhLmrfYh<-(WAg zM~piag-^_I6@r|1BNghtJMjMig;!U)@b~tdpJG{8$i29NYi-DJwU5eJ4}J%F@?~`I zBh-t9`4QwECD8P9tWAEl5!>mzf6?J-hnU5PCvyc|#AAXs_v>D-;9rN99w4%VR@0V9 zq%txKF>tWkGpHEEmk!&@XQJf$RN4oEv`bk2*R0-ndr`KB_jc<(r8I9l4tMMZOy{OB zqdt|T;@=*esu&@_ z+me6<&!$F6>zevo;Z3i_j~r>ss(6FMzu7V*(cHl1)fPtDcPhlKi2iN8{=C;i@e@{I zsp|KdZ-woh?`Gd~=Ek>i%|BBkM8K%Y8NdJ>R-aa)mo+xmcoZmjJz?M2sVws~Qd zWng$v`P(Du_ z$-yc{=*T_Pf_VHZmCoG{LYyJc^O$dB(II!uWm%O@#T1oDDZmoZ;!*vbaiq0&K5vRS6dWOd*a)upxVArJhJHj@; zIiA`zp4#SjTubJ*(687G9mm)ZKT7%5Ro1OD6G1dv{`$h~2mALF|~ka3!Xxc#<=})e0AWf^%wefqZPS3 z2y)^k7#Y~;b}%^XdR9gC)tYQE#a&sl2qdeaa5i^Ku*R{nc!Pk<&HX8Ad9} zn9FTWNw0Out$xc6uwqW0TR98tFh8wTx4PDBrfC}T+TvF2BX0Rm1OVe4kH)@$);uA9 z;frA=wk+=E;zcQI5lD}uiqV2cvEs0JwZfeU?vg=Op$XxcjQz!juq zrPD*1)k|}Yk@x7@e43TLu(iv@6qdHij9Yij=E@^N`C1ALQPbd?~+EIWR^vBk@ zt7$AA(m*AS5Sc2UHc!*7b5y}|$vIx@Yc`k7Ca?1}g=jQz5$K*SX#f%a>I3s80=HgA zO79!Rz7dMmV7t(6e%BfVWA>sIm~|w1ef=?7@#xyLQ2nP#)hwfDUQyf^Dt|C5BI8Ka znh^J2XP0+AVkYo;>~T)E4i&7X-kqCYlSfQz#cYg-{C}ofOcit(*uGTDEX+_Zux#`0 zF<3U*o{y(oNqgjPM-B2u<8Dtl`GLkdaaO!Z;o)my8f{$!jxx6E3le>@yaV;FJv2*0 zV6rZthT|l82#y)Pr14r&!cv9#Z?BtwnUz|KTb-?sh^((gE=Ywk(8(}HbJKFyw&NrkiRfI+9v5160%eLdd#o6K!?*QW986 zxw`?A$?5c}W5a(C^jM{_)bzDTO7AIgBr!-a&&$1o=bo77(z-?Xt2{T(JWA6^a0-0j z?`X(544L3{>N8%GqYG~p>2H0eYWMdI<~)-A;4?uPzzomx6O+dvel?e}aosC_UWY<- z?ag!MV{fh<-b^=95Bg_# zNi6pa5mw?bv3$qxZ$>1X_Ssc0ejj+7L)C27ZCPTuiNunrw)55|Q<0TY<+^gLquf_d zw&jcE-{xcNsnm9oO!=Bm7I@G~+wLx!O!6Cc{C_&dlTg?0X7hGV(&r@YVsrU*ue7y) z7Wl|W*3#)3Z;9Y>gDl#3f=2ZKD`b9E<~rB>B|5F?xE>l^D$y5Vj?_vp$B;;KkH`w) zz-D;)&yy2}QD4laq`xT3@HVT0p-o<#mHS%X@DCVWd&cW*Jkc}77a5u{$KpnRI?%H5 z7m1_8-85cbao?Y(73=y(hwX0e77cpVXswS9!YO2buGI%Wl{ZuHSA;FzSFpO&3~R_i zYUM~?{{S&kJ^d@yc*Ld3)4!p`Dl4)%%PoEG&_y&V0}f6nCbBqr_P6y$d^ay-QakK1mYQoGxACj?e4H~J*`Biefp1C>A zVR*m6{xQ;nT53=81XRK&9 zmYO0>tLm3gU)`5g8Hjn4Gl=#U&$5Sy^u);7DV#S30w?AE+>D~JW_>P849eT;5oE6-jK<&V$|Q8tyXYTLA{y-LUca17ScAAzcKOj%xQmMXctr^h?_tfVfz*iR5<|v`K zmQr#K?8nD#p)>ygk5;~&289=wZLJ%dDKoQjh1rqUBxfIpuC8AY_{Qf-wUbP`hT?a} z?ro!Z=3n>ADvXa~TxIlrF!RIesH-A#vf#+$*P$#cROKxs%YH_{@Xd|X?;V}|b4CtP zRb-M=^azJ1@~<@UO~u{J@@X@zp-VI6D+^%^tOxgrMQy{r?rXJ+S@?@*Wb^4Vi)cs6 ze#}}BN4ZsB$eQx|xA7#GjdOa2;hDEF-Mk$2&JRBI(?TsfxfoP#+Z_ApB?`Q6ll)45 zr&@|#Inpp)$0zP&?iugX`qyYR-7(`^T~|qrZDE;V1~~}sI3#{Mb6r-1G#x;BXIzs_ z+D65?hDlHlKv#D`?Ojf^mbN(MPAKvDbUVd|&oH-^Fn9BgeaNcO*>DB}ex|<0({z6d zJ=MONd{3ubB{joD)7+hfbF2VGXnmG>yPW#^d=8Ypb&GkBNMvEP8yZtDVJ$F^;(hkSo~R z;fI7`zO))ft$MP!-6R@~zu8l1?WrmAYb3(;C{HC8wwgzb^7=axx1^elG2 zKiwGjHMFWdkv`Hr4-N8+_bY1rN?b-c0e2oc^si2^_)p>qqFGu82_lzPi3_P!>UU!t zck5Sed=sYHq?(P~Pjg{7BHdb16wKMcA&hOi2daUS>s0l$@g&xdZ4kO$DFFSzWr{J5 zzux)bQ(iki*X5D<_&#=qFHj}|uCu9C1 zyDD)?y5iG9x3i5TyGz^HFD~U^GDLAfus(mdPt~b8S>1w+R)^2JCxZ3+ix0QJ zHAya1qo`PmLo7t{enen@78$Dv9puwJyvuNHvIFc^VuL+)=bvCrce>`i{iktrai;0= zwU{9uL1?!2!akXGjLU+5>!n@M{7t9$asL3b#e{l=q>QiU*~=^v5=Y$($;ys|6z8$; zN-=HfbV;bj@K-wD1pFWHH;wM??X3J+J&Q~LjOtcx0yLl945h*6rg8PJrnGN?-X-u3 z>lM-Lbp%2rTf3+rcFr&g9nv!?>$O-B=nY-?ec~8=Nuh1iJTp3?aT_R4cq>iuUbAfLr^hv>#Rb+ow=2222&9rfkwEGbkLOh?kc-mC&0;Y)i8h*cJiAr+ zQLXsnMgGgxh4zINx*67cBvKwiI6)7d#Yef>iuuAX+1JHB9o83D8hqX$voW(JoWMyW z%nk^ZEw0?F4y5^=J6GAC5Ii&SuFFX_{u;cqzPY&!Wr9rk-cq(mjz`{z<#IPV<2-?1 z8hHNzRPj!qq)DLomd^J{P9&M7xrrx`XK?-g%r-p~bM4ZPX$$UF71nD;tYi3t!hSWi zlwKc(uvyrj-R_p&c_V~%CQmJkfHT#PYVu3y^VO9tC}B(yh(ol0N8#E@dmPwag}(kFZ`r_!Bw~6v*-Y;9wG2winK`*#9G}+JEG4# z?G%zG=jy(3jX^%7{&iB1RC;ve^;5CdXg?M0R>Xg7_*?sXUHS2-UR+$y9E*}vnBSGa zKA;Y~cHnJc($m~a3Nv2G;fL`yt#;a9hHU&bBTCp| zb7eCa8y|N!D9`y4K9$bYo}CS^2)nJ!n+*p?)XJ*rZ)*y+0;Zieo0G{#^5JO69)UAn zv!EY_wpujuc%M`jlG(9~5_u-#UBiNkRar1QGUxHGdd;r92ddn~;(apL`&Ksx&ak$d zaTH-xjqYAS{HXBCv83t6HiIJJ2* z*1QYxtKoNtG_;RKfnLHweU~0-CYZKEmd=ptrS_2hfIRl zuIs|Bq-eU8!P9s6W-O_m%GNiI-s9d(tNuviHRjZfDo*P6G3HHP2a9W8vWJYVzR|0A zdtbAj&Npd*Wt7it8k~UmiCD6Zxs7Yhw7&%ShUxscFK#byZDb}%k|7#k9tkh=0Ds!Y z(!WXM@lKbgw0Y^JWC4)HQ)925%c%O)LoexLxv>qh6l67d*z08+T zFt<7A1cE?vGxCx8)Vj5**+uAdVR6cp`Ify81iHV|^qXsKH(ZuoOHgJXyRx<4ENA_@ zfwcYuBD%ds>qhf!E#AT#iC!N$?TqHpqLYoggWJd)j-)O}t#qsL2jSG()Rv}gBuQ{e znI@RT57piJ`vY0mFEz5<$7>(kZ0D2Aid#8WNj9D~i8o3@dIJ9dg>@;_ryf~ZlPdiF z^{jaYv2_Li0EzA0TU2R77}h&T(8meJF&@-N+ut#+ed{||@W+WQBqLi{O_P%#pUCDl z2ah&Oc$aG);|D&5x1`s66XBh9EdyKCrP3~LL6vR;LLM^R1cnfp1JX?XJ!{=GxU4U% z0squuiZmKlBGo*&nx&}XJx4B_VQ@@UDH{_ zc0J@G^u^|{c``zr`T!5Ldwl7rc%BwrOHR=(^!q6pAfD4m{kw+o!+fbDx`rsPz?RUqzK9^#)%_sJ)%C_c?ROJcp=czl#sKEMB zn527OAQ@Gz?y4$gGrla)1`?#xq-pltrG*0*SV^n5&jctdgq7k zrPZ(Q-giRnBFMxLpDVG=* zzZTv2e_PWM4PR1XjSk6^?JIM%b;p>Bc=gLEHRVyl)|Av*x0$=cmoS!oSdk-wLFon>nN5lFN@33z8*)oj!iyPQKDl5OhE<{qQ2GEG|W&xyVxUuf6%muaI+o>QVh zrCeLVG;P=xON3>|sYCRwzOz~@;a_=NpUik~jwQW|L$#joT(Y*fo>F19wL+Jh0md8& zScX5`9M;c*?yU`h)o zpLm*u#AI?yZCOX)O4rwa4>cPdFbyig#_Zd}k|OdJHwXTjFI7Ic6?H0WcFkdCkC{F$ z_{YRr#+#+-I&Frk^V)Z${H12Z&-$}QXt zgBkYCeuwMc2k|e&?Mfz|?d)tc=?ldIM50W$URpFq2N>j>9`(*x=~{<}ykRA!u8?l6 z(e@j?PTl~(g#-mf`#=Dmha>Q>CaYB{>aXT>(yrpUV;TRoMe343XQ&jYq0o%;Fx@Otg{~o+UQqe zW%IRLsU;D}qmR2BUQh?r9Q#+5Yu*vm{3obBi{Z^rN4@(@VEMM;oJPZ{{qMc_E`2La zDJ!I`JG!pT>T|w2(4w-AAqem4jdrdFCzUK)ImLO!j-7Af8*9sJyZJQzMkqsC z6<;-{e1YZcjZBTlIR}B*^sl7seh2(h@urS%d_?J`>F74aJa*&F5@R960nFu3s(>rv z?-EPn4+Qv*Z68=~G{WU$ceG{mSJW)XvMxtZaDKI%s<|?$(u?UOFzPg7#z(_ESfTKD}#SNpB8aTqF-;HPpvy$2^YCOM2`@ zUjFCtt9~f>Y2w{KN*cwEwPkx}Zp#*d1>w)HD3Hh`kt zK(1q+XIHq921wjOjxoZi1lNOI>OMM(f3;sV#iI@qS)dUp`Vy!=TKdbw-x0nTS>HX> z(L5exep-ob!z6y==4=|9SonkC#k08nz`im(gkkPt20R|&V{_Z4aa~d5Yjc50q#e0W zk1hOFAf89nRka=HRa<-fjni-qkba#jH(c=y6D%<4B3N)gda{LOE$Tau; zmF_%4arV2ZP9!GGEI=PjqcHl4;e1V_{5rO{TipmlcN!7C)nAHXw0H%^sX5M317p)1`teubTm4cvg@&IrgbXvFVx{|%aezIEuJ6Rw9vFCI)U1x(iJ$bqFK8)nP!gfXnImXRSrr zH;m6In%?JVjo)w`GTEr(#90ymNbklgwAQqZIso%qL;(Qp+E4Q7TpXLh_pKuCjZ}`) zPPVwXSlTGLZ@MEH$@&b}qIi45lgcG~m|1}%JClHZy>sn~@?Ae#xVBP};Krm8yO$XB zIQ~`J=)N+EB=U7DsiC(~oFR5O>(?aIPUT8cYRL5cW5HS!I%-QJOqXsL{^>yn9Tckt z{{X(SYtJqGEoC$^?z-77epu2bd06(qP*?LJx30W<;rTqX6FwC3S$1yxMons2`0GTG zUR}!w2*5)bV5IdKIRuh=lb@w$?<8f-G!{x#Yk3eN`m^nHQSL~md+veFHSZp~1)syYJTjMZHMOPvyiXWwCwZ;r zKlIivN{?^{J&3Lr$HgWK)r$2a7O)-Y(HDvk2O|MW;GBLwm3PA54D}nU+01HSJy-&|&fBfjW36Leup~U~_FN+?2PJuv}&ws)fPq6C=Mh=eoDU zts~*)i+Qa0s!c+|<}J!CZjjHovhlae*sQ*U@#|d?jM~)Zbtx%(uTz5XYIp)zUq($d zNjYN1?efpJKPrH%#Czj!(!FCv(R??cGA+e`zZ2!2;bTbE3v^ZzK2II}tKxWmB;M(g z$){HJdhWLTR$wM zr-C;!KRrmMp%u{A+DP>qLE+0(mL+H>e_^Jv z)4mtz$eNVGNanqjHmpbfn8eSujz5Wx2c>#-uZ;9Bi27aRKMx>}P}V;Dklo_Zl@}v< zB}4&7_iz;PTzn#I93Hv1l@;Ef|i z8thZ}@_4T8B=1U2E1Ft`l49m-$ae(3?oX!2+!99f%K~IYC_vpk>iyj^PNMow)7)EcpPVrxHKre zg!`YP{t%8mO4aolA-0n5P>aeF%B6%@=tNLJ7_kGU!Jg*3O?LkP#oiauVbVM`qFKQD zyO>SThD!zWa00jP(GK7aMnd!%&3u*ci^lq{nXSE>>M_f15D2atejN$qGODv5rbar~ z(fZekJQb`(3>vs}<9VF**mgquPxnsjde%;*v}os?q@9uGQ~W9M=9j8T zt=V1-nDaE#>Jh@vD}CUh8H)p+4?~_uTJ?K9S{SX6Np`maIAUq-?ha;(LNNH1BM5MN zX1rg6A4=Nm{sFPNi&K)?#{L+A6Ge4!kf1G}nU2tM z4}E4S`BK43Nn*S_Dvtf&Nca3Nz+obAUmbx1{;e>Iuu@9GLz7ggY8|ni9BPf zXw#+C*OS7xJ3h`Mm)+(g4 z9Bn1H8sI#6@NIl&s5Re)jZ)szQoHdq zcDE3)l)O<+*En8x7?_42_23%K;blD%D$$GPY^kYut5La<<4y71t(=x9S=LKPk#5#p zjI%;R3=lu%p3*v!MQrJx5$!ZfA%CS`E9sFHFv5%y;x=4-+g!#Z2a;4|k3(F4#eDevrU5DILDb|dWde_&lpHq z)Z^6PfnGJ@IeaPN1Lt@q#w24lR^k>m>fmxWGDx`Npf&Tiz}pQQQPm~4@dc{O1kgGn zC8XMf(Q*MT3~4si^ehzTp~Zd4q2Mfi?#F(F*Qnh56w&-(?=%->Eo5&pIOeyGB8+_y zN})djYmSTI-kagsZuC7-ZKbucl*t^jN+WH}!DWfQ?RHP)RHNF@Hx)D=Vkf-qyA-0uocOoB&x-Lmn|jIVU)?EGaJ4-0>!-Tk0k+b6!~ z+Q5Ilqw7&PRgKhkhp&-+wD-3*E~o#^#n1kw)k)H zGWOCa?d@#Q(}^Y|N4OKgC_xMV00E-=#M-5y^DX9wR<>br5r(Cs3)Vp*aCpG4 zv+eZFQKW|M<5`w?qydC+Na$Rs`GaE}`(bO!J|=i)Ox32fzSV5}=$#lc-NiQwI3GHr zvZ(5Jeg?Z0HM_Zw*5&ZCiPF9x{3g{jqo??y>iWtzhyf+-xQ+%X$O*A`G0#uuSekyT z;adil=fj$+$8RGD*ZmXc`FSWj*>)bI_({)d=3S!GH2(kwqUb-`Hg{8BGc=1WszDR6`LTkozmX^2wB?PijNT=t&zW`4 ziaOl#%MXQhTbH}F2YfdRko~cZk!{C6bk-J!@tX6)*U{^~A&U~Y+GB|wmGRY;o^YU^ z=aXM{CW+y@#gj+9veS|&qu5r~02xnW3Jwq9n(*CQ;OB#HE*npVE4GFPbq-b)A={oe zN4dU)lUcay%ydT?PTaDIqu?)$x_6J~nr%DCir|B~&hFW>E(ZtgJfP#CB-U4r{AaGi zs9QFJBJ5YtR_;9mDJ-3v90IU$d zxy51zxQKjJj0D>PBG;bKbhpWtj(FxmpviX+ffZ&My#AB1)hJLlw zd`eAf)<)6wm9UrWg;ZZfYS=;ChG4AUg8`m~yIl|B?}atHnDq@>4Q9&RFiB@?Ij$oz zcP2=QO@q0}KGl`+SK_=DdmF%-rh};2hE$Q3R*GZ0(OyR^7rs<;NzJmNWbrRM0P%!*=4+#SzY-^3JwR1E?I4ziX=# z+olhtbXOl1VYD;Z>5FG+dve>Fc5dwL^igpvMEP^h>1v=8{4uyB{X-rr>1)dmj6Nf_lJ@S(IBjM@Ft-hW z$FNhghR--SAIhoTYPxleoEEz0gKw|(#6uji%7LRX;~Ri?oDzS$0^=2=DoWM{qP9G1 zOVaP{9R&J$s1)=y+(g3zc#U}X~nH{k1pcf%H}I{b+(b0fta0% zCmqi<+$NXdo5x8lG)tWhVgdc!(&s(S03-0ldM=+Igyb>2@-(RwdnV(`VBm0CIRIDB zb_YJxb57+xTOJVpD3OFS%cI-c%Mz89l38u#-Rc!&1Y@^vQBmD${weV#+QX%rtDIo@ z85dFvah>}&0DA%X*SJRB2e!FQM*7!PgF@WG=38q)ENmBosfgDEo~L#Py=Ch^9{e4k z%-TP~of0@Sm5gn_mvncnDL+4(mctKDnD*&O#oFMi>u95e)Vw9}PgJlG#o_%)?uhxM zXjz|TI5)LwPu`_mK>@}vG6^IhWu5j z>JjPo@TyMk23sni`;)?t(yLuRiF7N8Y;{XSoneuc#E2wPM;tinIOCEl@2~A0Tf(T2 z+oqiQW0Ni1dTrm@8gq_FX$P4Q{{VG=8u2e5_{T@_CGvk|=vH=i@u*Yw%cCDYrNS>C z@GMr5n!c!*%1_YcJ``)3cDbzE=}-%cYl)aBx3=0hW4K_ej1GjH3j0py!QL5_5w#x> z>k+>Zz>(cs%Oc7T-Qqb12eBi+HSksLp4vf6^_I%R&gFi|BHX)u132LJJZ77@Iax?u#Gau>NcPQh{u20=@fzzROVc#jpUm3QOuJb~ z>@sja3hX>f@mJzbgA>?Y-QC#Buwzs}pO;X~{M8s`1#J2J(FC2!J-wTgWE0ld@?C*}3 z;f*F|iCkmK4=a~A$uIVq@&~cU(!V*pS@D}(@k-mrb7^G>wF)AVBxRH;^aYEtYed8}3iTsOC3q11L5?)smMI?$p zxbey#@G9R*^6QJgjh-U1{?)kf?xjADxDyq`Hy28!4<26h%K?rz6U}+8hwWAI%T9$M zZAJ@)k0DxXSfp-!TW;f@b64!YYQG&vKbxs(nl;Ym-2P^r5G|g$bsN7r-W0U=n7*f3 zZ58*E_=Dnqi!N-gH2qrg{{Tc1xRn|N^rpS`1Pb{felppS@fCY9w75MA$qeAe^ zz8h}=MHF+lnJl)qvPSZ_=vbUS2VuXb6ex5iR4XlcPVqbi@k;e=?QOMdTLTa$&x-K` zZn*A-P1qgwjQdxW-TV~sZmKRkL96(~MZdJSW)g@s7xQvB#u)<-!~ko5O#P!py`=Ut z+QarjcEN4r`HQe{1IY6k4;?{bJ*%YA{{U%wNu`F@U5a~6J{1cczMR51ln#I)Cj-cs%Zln~ zrHmmb0DkfnaNW9Ba6Sh7Sh%w0X$lOV|Syckw^tWtIE*Ztm82AX&E?Xf)wI=5OQ6#?mmyeC?-I zVd?L8=sIe(M`dN|d{?Sic!BQakNy$s#JNI4;s+!!?}4`m@Wp89J}mJzhnqcC$?eoH z$t3oh=VCE{cNAP>xycpx_lZ1x@d7Ot8)?UvX7S;tjwQ8_0zbMKfrHwAGUU8{dleZ|`PX3|hal9hKFfWl>mqgx76{TOg%q9?JdrbC zj)$#wmLCj!C2?#0ov+zRYdo1TLXQ>00KfCl#Un@?)po5O$=^~PM7BK6$HMwvB#!S{ zhUFX)9wm}Fzwd-e5lHvnpGxAdJQJpWZ$YMA!KmAPt8bSir3T=~0fB!k5PK3HC&KnKU0V2)O%JrNw$vgnq@F^T z3>QC%6<^_wtKl)HU!NLXXjW1}ikA9%BnX!e*L;%7!Bs%)0b~5|yfNatgwgIJ()7#A zh~+y)?yG#yH_gUY3uvR={{RBqD<}RD4QIp}qTJbOv)ri1$YX{zc@IWDb}~JPH8N6b zmM+7(-bYV$@!s#jz9Rq z^TV*do;2HNq%2~V{3FS43FvVmkfpt{JjMdK& z{0UzUcujRV{7I%wX%YKJku9uoxINFDJm8t^N#?lAeKKzm>FKHH*LE?(Y<3B*ZYMFy zK*3X+Q5WQECqf*zPRJuyncsFrXLX@?io;K2(RFLx`&v&r=VUD05*85|-Uq7#p7re3 zekIU!+i5hNI#06gx7hJr+o##!UZg5QiZj<7U>?=-UyN zI6T%O@u9-_W}jXp5M(#L4J+6%bKF}IdQhG^TW??x!Ria z@r~FR?f%ad!g%^Ue^GR|ipxuaA2_sANjoL<@qx;i=6puE^c{QFlBW&auFPSGnwKPF zq4{5Prs`I6pY1r>CtiWa2kF|c!K%DZ=4?Z^pk4}l54mnn)gsoE-3dZL_j3^zdr^XIJ~^Vd z$ns=&3%CxX2Ia@D0TqL#{2K9b^6no|vshngE#|tf(Xxa2SF*$4ZynppqTgE6B%2sd z-x(W$(+3>>6;NGHT9b-ai$`_g&xKwIxLF5{%jz17<&04{GHyS@5%!QPo7FUZ8^U)p z+xTKAG?MJCy7}WIE^(2_!NqY`-URrgHTv5ovgs|u?3IRMfiuvt3^*O|Dm$;)r{Yb_ z=I$L**H5o0JFX$cx}#wZ)*e-Mz~_~ z#xOm>Vb9cNpWzRJ9xCznwTsC>d7PG#B@!nca>`1Ic5zx4&qX`Qs~#C~;x7)*b%(F1vmM!9l{3+w@ zJj*q%5XRQ#1w8zqhB-Xdb7V`;Q`t{`XuVnaN;O%3@niQH%=Z9~f?SpdM-jvIR z<>iouRygAdna6Wpvt{tM4LT?=C!sdX(E<oK)9jR6+ecvN zAc7&&ie`${<1vBQU<@bMn(;e5BjQ%AZ6>Lv>$-lU7?r7m1aM_Q zSm5Av6^^e_LTx*;_Kl%iXtsJ@zpUu`cB!pck2*V@D^Zd=lOQJ_BE=$-qX3=5Ju9fw zJ|g(j#51hP;oVjzW)aLT?nE}yoSewR%JVbZ<>TpG4~F$G82BD+c#`@%WV)EVGH+E> zRUD$mOQNsh1$%_w5Pl)sSz2m#Ru+>+fy&&x21nT6+!4r&lk4f)q0^o8W}ebLQR+gLehs)9vMyZ9%&TJAf28^ln_ zdW3(Y^B`jX0C)*wR2+Y_a4Snx%LCW$vj}vRNv`ebo>M@IxA!~GwSB_ZKv-4q* zx()`?3HPr#(L7}!lIKi)LRo&$$~?7Y-!i62`}{5jPD^9!UR~l(9O$-MiLjWN1T15D zV+5w*!NU+TJ;q19T=48Oc#r1r?UFv@_s-NO+vg*%w_erf&kWMMu6wlQ6{1M`0yE%? zWx2ocMT*>M?+S}shMRoxF&}UQTss5m+i}Hs*N=yW^$U}%_&)aSt)q;OBJCknjhCO5 z5CMXD;Z%=a^=JMOjd|=1gX;F$eY?y=*3(Q>AqSRmw{A1&PtvOEe*`aWV1nX3dfQN0 z97 zuC)IE583&a!)bZLZrXdZ9issAjMq!x&xUq(8g!QsYRjr#E3RxTnL*m!NqHndK<~#D zja)2bwA|UsoOL_>Gr*A;X4iwqJOK-Qi1tDU!rL5qF!4ymFAZ-02Vuobx34hpDc*Yxccrq*G;PYDDZBp8#0;J?pO*=zFchq z^%-c%QPYq?9Pck9OCc`E0O`i=2n5&D z{vh#=r#_iyqG?u_y4;Q`=Kv{{S<6K|fCQSK;@Gv>gJ<*?cpj-&vJ}CCrz%*3A>Y_ro(WKsh)8ex2xex-{g} z+C@$-ym{%w^=}9KE4|jVtCqgIO+Qq;a4rm3xK%~xV?3qvgXnQm+k6!8hL!fKi>uea zzS``em^540y8(p=JDz}7EpOxh00PHzfBn6y{hy;J*uu>dH#x&bah}JJ4RC%Y_`|Z& z??~_#yJFUNaI_PhSM3&)807oPvPmPtNBg+0_~NLj-7B7aaMkB4IawK+_4TH)sy~MA z?=;9PB8;ThHcRKSL(t@c%A>c+Mr-CBQ%JYd^*fQ_y;0|DM`VfZU6?*ja;ww>>49CI zm89ujJ8`Ak+}aIa=TwEKOiI9i%P9`f+q(dBUT>@TU&THgySQdJTt-eh_#k zSUSvlP2|zeyH*9B-eud@l`L`x91uCLlP66+04-yMXMw(L=*uAk*rr8ncwhbzI2z>Y z_M+l3_he~Gx@S1T;OFohcg1=C0NI??d7VdY-|*k$b^fa&m!J zrqRjz)})$u!l+gqXHypzFF7Cx&=-x*Mrh75x%T|)!+b&E4R+9f#N$bof&f-n*L!ES zN`d_+_*bV&h9)pjo!edi0HkrwrX9X$Jr3tpk4;O7 z?>sSM71r^w=ZZj&AmcfW3Lbqn258(`O%0d3?VEfi1 zXr3jq*4Fa!;7W@w=86DZ70)AR>-qjQ?_L}5=YjlNsmBfV-}W3cD;cM`jhAC8*h!sUr4 z1J;?NYtp^smoIW)mBCh(GL6r=k;Qu5uY-IWFh{zQSR~KfnmnU_z?ZkKK&`uvhnjul zAn8$BD}nq9TOfBBB>r_0jBIp9e7YjPgMJmKjWo&iwYz((zbQ?=Mihr>BSR|!d%NX_;au*8-i-9A zN@^)hYJJCX@q@$h&1W{4kx4tTTbRU1=08%b5a2gB>P2$8qUtkUKB;Z1!d1YLhud~t zwt51r0XY8d2*rHQY4J|^G}Y3s;*L9EkDAp|85pnKE#)eP$J5@u3&Yf9L za&W12beq~OybKpsCyqOc9VsM4^>;}2oh}cJT2-g~B^qs-wW6a&F0ZVib=v;`#0-() zjyg9d(z-}>--hvcD(d6J+T>cczcM=gn%+DzO^o0jm{iHZ&*5Ax_r-gU6ltA+Fy*f_UJM9a^+9sxwXH=I^*9j#P=&Eu@QkKTWS9fXn{?>aU8zUR+NMdW)NALuF->GRlrRACzSCUh&}n0EnI< znp;>rLVneu*%2GV46dN4=<0=s%nmu}M4<$(MOandn>zg(+r%Cl)mu`E%Ff0}12wu_ zTmdto$OR+HGxPo4_2^eR6^5)6Pt^2_Tb)|`ERnUFdBJ;~@uN)P&rD!@fz)%F@5YS= zIUdWxeioL(LIR7%5Zrm6_0l;BTzV78uRXfG@qVkJ$Es_3{qB>Yi^Yrg7ApzM{Kb`G zNW`0V{nFifdec*+md7$!hVLh1zVTPVUk&LiVXS!DS9@4>ILU=9AfD#rGGpW@LMr2- z1%Vxfd8V=9?S9qv_!c>S%^5yj-Rc#(l@2kK-5@{?ae@y#)VCfY@m=1d27}?h5P!l= zYXpI8 zz{oY5n&^(0)To!eEq>$w(fs+>ydSRX(?{psEwm`as)ba?Kiyvc09Imqn#-TUR#vtX zS~E2FC9=0!AgYhy2oBTFbCX|CYX1NP_1hgK^>x%Bo@LwRT499KXB;j!4xYHKO!ymB z)9fVF^}ROs&MR;WIU!W%zsv@I3i#@a7abb>4{nAl4JGbLA2wQeI!BZ&OFJ)jSPlXD zsr_r!{59~?P1U1OV9ho8`_SRX>5QM}UY%><9}_d%&!pSm-CEqIn;iDgo0zeT;Q44+ z9@xkD(nF|f{u|aj&1*!K>J6VfaNb%SUFxfQ3(Th-F&pj&>IG+N z$@|)rt6tjM$n)KE;a7+>2;*&P&eqW#Lq^j)cq)1voQm@~ygh0!UVEsbk@3jjsUExz zezoXVJ~g(uR*wGwSd<)X+QG0#rZdfH=sqj>cXfSlq&Ixc-(*4Vu4TKYtlR~@c#fo(`+KW@gm&Y zh9RSSO)4ixUd*$Z6a(y5y<1!GzMFS_2ZwGnD735S+XBvaktR7A1IxG|4E4YRHQRW8 z*T**3mijfU0yMK#D`|MJtU&?q9H*iF@EP30sN#Sm-<|xX3IT$0M?aO$x!8ZODvQ0|nd#l}FB^DSVUoadJOEf?Xd*QR| zUw>Tb_xeTLTC|=GvWi)NlHzD2X%Vs9Dr66)4RkvGqhaDVw1OQL-)_*d+shW$aKnPK zAuYGt0Mo-`F%xoCX}HCu+{vGg^p!!wa!eMm1b~f{4QJu>i%8woa>Ng*)V|+sR8NX5f z-_b0!yEPIOodH{wjYs_PVB%6S&>Z?#m+Af)eIg6H-7521k*!39<-3UlCb;#7cQ3oADsmSKx1odak`Ycza&7wlU=SGumnCa@k(H(EQ*5&rFX> z_F{YzQhR+vQI<%V2@rKL5JWEPR3 z^2&qL1%j_moby>{!|In}-tI|S-gEo6j4C!g2*%w10Klv6EjPj%KBF>fcABNj=<+im zH#6>El>Y$F8RXxOeWQxzym|1Lt+xFOP_@MpPSpCpkwg;uwYdBDfHAJ-MRbNfB`lGY}>zp{=Sc(U8& zLaadQ6+?W@?0-6k%+;8CNOw978{&_Jts!j=4KGc5D5S@i8Y0OrJd-TVDyj4%@WpxO zh^-p*PX>o^s9T$hhMFXwQnyQC7oicbEW^|gJ*%a*_&uRLxYY);Yveh}vXX)|xYk=pxLo;ho033fJc6@Aau4@|H`24@yWGuA5Y;Al71SE( zF9x}Hs9f2h5&6k<*Dx{u=x>-GpeCnCH;4Q$q@8z4GnO*X7-*hJ0OciwTb;gvmlc(*crW6|#VhOfztHV0^u6Lp(&pu2 ziXx+i5Xmvy^%?c8U9Gs*B3HGv^&{{{#198SsQ&=MDPwD?>iRpzWET34s{}2*dCTrA z42#FzdcWe|j2eEE0hi&O>v&Rl)TFSbj5liR4>*?JaEy8t>(;zSNJsE*h?>^l%Cx$* zc8W!}o(rgDJm=**RoB}jde?B?FY&&CrQE);aLs3U8BuH^hBk|F>K4`3MaTQQeT{L? z4^6#G)$7poZ9n#h___UtH7Pt%rfT|fe&*t9i+j6dwUx&UEQ+fsVb=?gYsY*=;!R`5 z={}%tm&6y=#P6A84`&=eXOB6&+=JU0$2H}8rlF#0zrS1AgL%WOW?P1nuI5K6pK?Wd zB)Su?s6k_icDubi~wt(@fXJ{4PwjA*Dimvb%$Xa&280mtyLu1mz4*N?3)UTsdn8J$KV zirQ;780+!?K>7>{)l}%2l&B{zX0$hY5Iwp+>oMWw2C7t=b;lcp)>7~ z?Ov^*{9^G%oRVr+)^WTy`-QVx!)I@I8>!`_Sdo~ILxl&ZuN&~^g*D$CT1k7QLlBY@ zM1karH$piesdFYh$i-NT!=5~~x1K92%L_83M)8G7ZVr7Eu1NRX1!%D`PQ*_K2DUz- zzwvd4kNi3bP2xw~)R zAA8Fn_a-yPYVl78-h5y1#gkfS_P08U$lICXf+D2!=osMCes{(X6y9DJx70k_CJM_O z!3s0>@}UeE`(q=$H8(bMeOXghi?QnI;7<@qbz|a>6!?Zq53|a$+(G56a!D8*D#sja zh6AV|{VUQn{{V=-8?u$Id_5iY*_qfkNW3g_6@$+q4H_@8|>!)r5m ziq=SgCEYxj)C0%wBvHqwHR#cJAIEQHZ4QNCZk{j=#m&{+tu{|2gCR)NdjP_@Re z?rElkI*zgL3Zc8;kUi_pTH5z-G}hnt)S*%j`?VIG;O~f+x{_X5 zYI+c{2tRdXmoFa9&GSvXu=)Y*S;`UnW-9$OJ^DQ=JvA=n@OG*-cUX*p^mh9~1jpQB z2E}98d6n|u_<`cx6U6sczY!pk!%Vs*Ry)!pMLn6w4&08Tps%NHyg%_a>c%zG^^Gbm zIY5ozZ9Y|zl#iGPX(Y~n-8JSn9}E5+-dxESj5VLK7zuL{<~Y@ld@KRSmluSork_G?|_CWWnPZanIT=<-0wbr$}`=x_#l@qVC_t4}wPWS7@Uh@eE*o8xEh!**j;&%IRf55xZe z75IiY-(S-%^!ph1Gfi$?B-v7a~XJ(J&{Rq z`kK+yd~@KtWEx(Ir^``-(c3WtvD%S^Vfc#a_B51z>FQs#n|eg~Z^K^>HGM+(O{^xD zr9lzefgVJ1i@-ivVe=8m$OqI{L*qXH_$CEslTa4S!GC<7d&qIuD-3}^KI&`Ld_m$! zbPGhg(^N@?# zuWhL5ny7_Llf+ZWNcVMNw{re#Sz4{Ux@MfWaCnXb=R0h(w77R=$5QB201xL`ei89z zoi)swX0D5Adc~wm>)V+v?e>Aw2Xe7JhQps)+Bk{D=&lNsUhMSEXGQR5h2gtHcP58_ zGw)mLH)cYs_oG9)F@xXfMCBpArb6L`eMUI~Q2$LyaJO2|ggi5EFN!W~ z^%$=%UkxRd+q5z{?ndR$;)GY9+dsrD9z!L@gFJS*-@g9`#u&3?WFrM6VZ5&3-lyb62;Vi8XLjEJszH?M+d~Ma_;UawCkJavv~s> zH{B{Q9sYSE2kV1g%sfiBscCcJxM8-`T;hMU-2o9NyC_}D_&GJ=ehkz6NvqgRCxrBt z`#5m3g0elafA&W~p8K1M_Du`GdhL@R_((1^`(`WVn2;oaGuVVz{asCGPPI$kF?Knz z9?l*^yj$YWh?iD>*&5A`m@Q>csJ2;jAvwtm&Q5#o>*-!;;hk$&*N7#+l^l4>6bu-mdy@Q z-OBG!JygC|bKL6=JhprLo7bHYjx!n}#I(V^6JTU*AnnM0#TB+i6-Gb`X=`r^52;knh5`;O{z zS{`@e?PEZjRFR{!8lu|?7=CI_n+ zOrM9DTlT33hHsYt0K>el&`FR+2>sz~f;~lY+L_faCwT?M#EQozJ*cUVL$`t} zNYPp;Esp5ft=t=BwzQH(gqPsuS&v@ztEA}~WKjvOSW6)sp!t-3 zHF{kqQIQ1eqT0<610e?2KKwW7QdwO_E+b7w&gS0Oa6+ldk7mKh6}yd>x>RP9)af*< zJ8RkDv9p>hVx*rkR@ewVuuk8lY23wiYjXDTDwc@gvqlh~eYro%t7!wlqVbvaxuC(y zu&^$}+a_iI0MKioz41qcthEy;j$K`X@ZlN-X2vpd&7Y0DpyGwv}LISp3-`b5tAWMU5J-I-7Oz+)esQ@hr@Ne%>eP{SLYq(y*# z;9tZ?zcpI_0L2FOUG}#B0Ao?Wjxxj_a?Dud`(Rd6-^()qUPMrHg=2yF^Hh@|#F*OZ zx0{fNX2AXu%s~AKABHP2>>XtC%c=za9zYrXRl3@gk|Ly`T*dcaU{}Yv9e*0^wAgL+ zdp3KB&`BOJ%s^)RGtE|{wvoc=sixUYyHK|>ulIxQ$KlY5=rvpWYsjOD2YA9S%7Q(C zm)AUx%C=V1LyLSD7glP@z_QCa@%2y}`PPQB;u|=kjWk_WJGqnvSnZIFymZ`6QjN%U zEc86dG?LLg_g7Iz3uh#`$MXJF%FkuBh>PYzcy7n(n)FF6Z?#5itGHykl@1$nw1rR9 z9R8IT_7~c)fh2{!aCrLes!6748mp=1Mka`5h#tIT)8hz8IU$ECz~dkNdbzCG>iSj7 zLvo~rJTib(io{#8>;vN`=s%TFvYId3xHn*3Zgeg4Zs$LrTKXHo9}aCiYp2}a=+Vb? zwt$)K{Me(H3NlDWZR8J7F<(6ec0Dtm-7!XS8eD4}^S$ zhQiHlrcgr=%uYwKVk^!TE4?D*6p_R^3`XLh;;|(02B9Dyyei(@{-&1NO;1>p$;6i> ze(*q9vG@Z@F=&I=bl-^jLI~|!Pl11U8c8D(`K`CGe6Shs@|x1N@t4^zn^m>b8sx_Q zV3tH|Aa2C~?LZR0lp*~;3e5O@;0|O`#$daO5EE_Hy38^^h&(eqXFu&02hy%E*JGA-BAvRNWuK0GeR&!PVspsd7JST;-IoOStiKfapW?rYuVJ+DmZHOAMNXcT?NW;6-m>_eHHn?ir>F5^iIj7&7fXy=upZ^vyTK(Z>W*!KNT- z)FRZR@k`syi4`F8l0c>N!m|l7zwcz%fqYZ=b*gwfRX=BywH2TDo8{!3{o)*9I`-h# z*HFjdqda!L7@opd@T`*F$gq}w?u8{(kJh$yUkz#crmMfj*49@O#3YU-iQZq3^Ta6s z0K6W=!H z8_`Gb7C^cD0I#we_I~h>i?uC7>|P_Z(QYG`F~{}`rER0L2a(xF`=y0(-Xr)er}zb; zn%hx_Rg}oAlEUZY?U#v=NC)Tjtlc-eG*jq#_lA5=;fsAWp3_6R`*2oRW`Wu;7ad7$ z%1^FA71De^)4V<6yW6QeN#Ygo^s#M_1!aUeQ_t@tMnL%KfPR(q9*^QOd@pg~mb|mm zW1TS9R=#Y}DLgjxE=+8Fjd6M(!oP=BlTUl%Um01?VIu|+SwEK{Y>%1I!2l2Q=}(nk zLT>t;JiZIjuRK+8XAg_-HH``q8r4^A#M_4_%n7zU1Jf8Je-CQywEqBu8h4Bxi|Y}s zqyUN4n#wDfRe$B7Rk#u=`!W;iE7-K(8vHKNh_})_L1M5XnD$&+Wt$$47=#m#?*`6$ z*NFIr&%y7kxBMVpGHnCx!J6VA(_2A1o3lEph9G5}5)jA*0rZ^pcrTKIbN>ThGE-bWAE+snCzH=2DCLAak%Yv;d+-w2}cX>CtR@dD})%_08)MUWA5 z8h_JFe5W3u^I7tl!uuR}fsu zqUh~$aUzuy0?MB^a+{tqGtM~r)TM5t*I_KL^^G$1>@|H#El$d2`7UmQd8&IT+aTld zAXnIb4mIfX%?s?>CBzZxQ4uUxG2Z49f6Ep_N)ia;@yyZa@~cJU#1 zwsEof(6T`zb?P_u^shIz@ZFx7J0G%5abzUglimjrnOBeX%(4&r<+1Ht$BI_t%JMXS z59qN-B*R?Ae=M>#?^KDSQ}~W6q25Z;A-gl}A*Fm0@OFm+>3%1-(rywYNu;v1OPS_u z%GHm8>P9xFd6D)b8J#{luz6JG>tS}%H%gP`i?7DZ_1-% z3YN9oKK0i8No%9oUD<0F5^4q4_ZJCkDo8l{s@`tGN$fxs^8Wycu0AJf_pq;k^>)3p zmPTuv8LcgCq=g4NR#NjbFRnJ4zv6!%UU-vIJ|FP>7q58=lQzK)#bf@|s>)RU1XoSr zPYZa$Yx_%$S3tA0WX2^)yu#k>fmc4fRmz$irOKV%H97%G4CA$RY?yQi_IA3K| zKJ~#~tm5q$wsqmKv7WP%ia5=8Kn=9P#Wqbx7Y_5Sdl0zO7N_MUw+Uu$b0wI{-T zGeq+2;?^~5rHrY=I_}TBlQ9JQbgzSad8_E2B-W+ZEUo^{1@;(P$8uV9W7o`YEkR@L z`PNRXob4B&vdR<0LBkt{Q1sLO37Y;b)ve}|Uk_>;g@Na6X5sDz3CIDRfKUgbn)DA1 z{8sVyj*!U?x2I1(1xBW(S5uyFRdByjI(M%W)h5!d!mKZIY(fFH<&pA#-c(XY*ENlA z9GaBLXJIjUq&P*1U7eWrRaGSZRjg$_(>*G=P7YDDpuZ2y{TR~qkBZ(SxwF)~Jr;>` zs!t!75;>b>gb(>Hh!}EUa_~xk4d(nG8lr2ThD6!N=k&rf z;7*P4u4tswt}Um!w{qK?%(ZEDf!NEq700eBoxhKMIcSR&mWwR9ZK@rDHrq5RG26^6 z*!0G0)O;K9W8zGHUAK#&y_}N8rxuaSuAbpS6bH6*PufGN=gSFJn!4p@k!jLux>HYW z{{RT(&GWd!$*N3Kk;m@Bk0g&l$Tf?r>UvG9MIVcF2EB>$B97`Z#wYbdYVi<0px4qK zD){>kg`)Cc(N^$FmX(a+FCY*00!VUwI0C8YKOepwYw;{vwx0#8=NNmNRlAQT{kY1N z{7}|!69v>GMzfDIj-IE^-W2h^vt@jmE}Lho3ubZ!jB@Rbqd)9P<=|tveAljP8fU@; zwT5pR>FJ_isb+izR&JY$NaOJp>Ux%;;n8Am{5yXQ#oHaxTH9&P%dqtTh(G{(maJs( zzks}7rg?rd)jUBLm`OIqJlk*o0APq@IjJ;rRc$?0j(*F;U$ggxRtvoWthGDn zxQ0v8?-o4<)ZLGMN7k2H_^&Rgu}R^bHrG#dJ8_~Lgfa&H_n8{Te-T_u_uY@2cFN8??VjpF?uQPY%Z7VW3W1b$Mb$TE40-z?%lIQo4n zwwxQ;8KoDixr=otiM1Gf*|d#D-6YTNZXHpJe|d1YIrcU4*N(g|;>q;ei7##>dw_q@ z{?`%RjPzFEK-5Pz2@k^-E(yxm|8*n zNF7NZQ=0T$2jicJbXi*8Thh(kGqz`j@r03*dj9|b{{ZV(C$?{6dC{G{)Ozdd7Z+1n z*x&eTTeP-F_Tx-g?iNq@2az}PtO>jm@JGa>nKK9xKyz0iQ9Xw6?eB*W^V9{sg(K zbMdEKxRER@^o6vtR?I15ZGs8t46nS8!2VU!>$=y9G(8S2b5PRbX1s6Rmvbs*y6z$K zyYQ^1h>})Yn8yiGd3?_>);&6JUJ^&1!1D6Lmm> zTWt;~Wt%%@d)EU|-J+4*3KL6H3qS}l6A+0L)d>x&4kFgSu;n! zg{R-oE%%5oZsxdPcI|=($@;cHKKn_oe){&uS29fn)Wyy~TbV#7)1oNH(yLXZiiRDw zdUmGY2WBfRmZg7W8<)3|29&AxbY;zXuC06F8+n>NG*5XE>h6X%`f^Vd#9t<(1C?mk z9WsX_{A(BO4BUap_pMvL~lmiiq_-f8PDQp}>ap;E*7W|<|`vwV=l_>kQGwa%r) z!~wMAcd7o_AUHW+um1pAuEx=EMTr8jB$FO{1*ilzYs*b8d+imWYpOy(isKme9R79b zIzNUyDXUo|lHIIxNO?lxHvLN`KP=L6N&Jmy+qK=?>jakt z6r2Z;9B1e=*1acE(7YF+Sw82I>hEv>qX&go@EIrat{P2GMTT{j7$n^r23AwI802=O zr+twhTxQewPgW&CytYjA5-h4u{zD?OHC+>0(UZ)%NS-dzM(CzeM$a+3Ue}aXt5i{7GwS?gk_!k;znr)MtN7HEz$hXsF_udnSiq-3_$;L}|JTn0L{Q8ONaytI_g2e#2r zc%Q=FG`jmW{pPKEZ)h?jjh;U5m`5!toQy?Zv9Wf~Uq%+Y-0dv0J@k9^mc_=`^P zF0rajs!giiBOj5O>=n!7jP6$mPr2rfwy`RrXMjQDOYso3R=E+LHpcFt{X*k4+Ub5d z)|n$VNpt&_2O%B7Bh+;LD&4j9irtMGJCC&5$0zRm`Q(9sC$RHGOP^dIEq(B!L1J#Kv+;$Mv4 z4!m6P-9vgHzYFsrw`N`5{76m@VliGb;yp(~dsn}`@rA;+Fy;ttqCgw{ljS%4^UY!2 zX`UkR+MP4Q`X-xi88}HTZN{N9=ec+Ja(yxQ3gp}2uZb>oAMK4}MY)mB%_NtGJ4lE7 zv7$Np0b0f`+88Pkk5k!x6^{sb###J0{xTYEowPxc>h9hJ4#4nK+&)MA1PZUM`~=dx zLE=g5q4A7*&5f`U%O#;QNhf?F{E+ZE;mGvny+h&Vo#77wX`+7^X%XDqTm*Z2Wwj&A z_wyM%&VS%F!hBir#;lj)Q1I5957-p>ag!{LVkfwcIG+c%&e-;=P}IWm=6t71qxp$0o#mbc$JV3U{<{!Qn%Cvz_am;{xQ^V91;ef zrO6x;N8HHJpDjNX1J<;KqGu|O{`0xPTKr7-l#>4dXZ$-`t#TJllH5p;9nBJ55#Ty*f$=v}@hkrTW%zdG zM$j%lwC)#AjzW9+CP1tK>5^;RG`)9N@Vd=m;<9{&3+6#B=h|(QkGip}b4b6Cs61VF z;LCfMHJu@vYX&7`4{If}73svXux@=q0DiGT%z@vpU78#$$|w$V|xcAN%D=^sX9`>lbsT9KBVF-XYdB1cK(^=@)j_ zMZsHxb0n7v0sFr>Dt@F_o!oe@!qzbXa4&U9i*8siRxpeYAAUAjG7tM$_Nle2?-L8D z7f-gnkmo9qq?-``0JQ8|KY$hM{ss77;%kPp*Zg5~X=elBzF8qz$Dj=(2How&aZb8Q z@;ZH*dM0Q5Io^T9--H*5%YXeBRXrWt; zM@g}0RyJcBwVYGPNXQEvvU#PCp6W72);E)CeU@cL zW$e4aQh4eGeDmT^;J#q3Rq=GwTy{oa*rwH>@c1Ikl za&$fc)yBQ0-yiLWOH9Kg$@2rBfBwBg2Z%K&2z7H3#0mKh&c5sOSJXZ-_)R-%GRLOe zTUJA3Gh3t0 z?5^d!x?=_0wlWe=nIx307$oQGUK_6Xr(f{?qT^CF^7*cRdLv(ykM`pn z{W%`h<63u*yiKHA&0%4GF-d?9&m%TK>;n=2`d2@zYue7O0gm$Rq)>QL1_7#5T@H9* ztlu&AM0(GLZFIYBOHrN;QcI}Aw9)EPh|sqiN<|ulJ&K%~p<(e$OVY03w}v}2VG^)d zP|DyIJnj;CV4rY*8u;%`2*g|co@w2&#BYqBpi^C{_*+=Gi*z0x)cu`RkLqKm?d8!C zEDa~|v){Z|@pHl#wh{|}4_e1|`Bh;*%6%D^YmtvY_2NDd_=Bx@UsRIwPq~s4E0XII zkO)4N%|C>-)3!M+Zeq#lAOok@73jVZ_(S3?Mpe3KBUA)@?{KjX{g~11XVj0X;b}$o z^*x75_}OV`b8oI**^Nr_CIuSp=bLK|>Z2;B(2-w5>3_7Iji_5isNDUj?=T11pqPR? z0rLdUPK%s(uP^ZL!nhjMm&H)WZyZ@Dnsdn{(h<{;$DgO;Q0iZ4)7D#G2z)=*uBDj- zGhW{<)6B>Z@Ve!b@ax{UyjkK@p+-*8N7#B7#Veh1&`YdnYZZjcw0YwWM_-sau_M%h ziq6#M_;syn5!$AarrTZ40-&{xF4{*tfL`3GN5JUIn)tfYOYxH!A@OC7rwzHBGQiNZ zPzBC^c_gYG{(}|uCZD3-YZ_&onjEm{?_qF~LlvyELh>A7jHF^b5$~GHQnIznh81)= z-v)drD}75-)I5vxw5c}cd&z=v^R$bW&!Fv& zYWVR6qcx+xt!ZjB`!TX-xGw~x^$gL#CqxH4l0o(r*+Znfnu2(fQBx$c#tzWMm3MMf zD8K}JRI_PsHlj6adq#_T2&7Hrt;%PT(UuBN;7w+$ru7a+wmvQRldfOrH`D41C5!2< zz(8&8=9NHy;pG*J4*3`r;ufD5FJ#tY)26+e&dr+*BFliF_h5eViv1JuZ-o36uT24a zc=Z&4U05Uql)rG_e`Y#yULCIdCHQ*`66!jwf@x4N3X?_>M&8}Fb^P)4u7w(M_mes( z)q-5JN6*@C#3T00tu8%c3$vf5#h^7?yc`GB)bY4IgEC4ZfuOA#?gk{et?d~y@$io_%_lJ zVP~ppw)XcJb<^%F#F^YV0l;&E*Bz=_js3=JR#9tXmel+qt66G#b>D~N)25b3#j(__ ze%-j0!m)`ZL>L_yrw5+3M0k7SCZi^xo;{C4gHIrYiBVQJQgN0il>~Id92)NYT)zt} z^tCs##3pQiuGB6flb`QKlEM@Y<8R?!D!PZlCyMIh#M+YHPGoTmHn(%l1WAl8#F1BN z9-D~uCb{e4y`G%P{-UK7CFEIuf}gYgl%r7b(%M)6#mJ8Im0{Fy?iU__isquV{hy$^ zzP<2fg?F#WL!yPA#_3`$%8>|^gi($T(s5i4t!LpqS*4#yj_T^k2v%`!jQ+utIRo?j zDzZW04F^kmZ3|Gi(q_8HpB=`X6|g7%yR()f+lun4XO)|J9r3_I+BR_hBho$_>)NET z$qn|JLoVp{A{Fe|lXlWG(R0A2+jtwm)~b_fTK)C8Lad4|QC>$K0oY_D=cW@qs_Z&V zfYbz+y0hw$KS-_0Mn0v&zXRA;VH|!2v#`Ihn#~N?wrw0&TAWH_fx!$~J*O(?7!C8E zVb-#aYf^1RyB#iyiqSKj*1RvO*y;ZO@SW-&6fv_m>Uk35E)pRLZihdu0GM zkGsZJ^V{ok_-5kMPSl+JmL;+m5Igld4$aTsjo7DY{xG@HbeU}IwOM0`jJ3ITDJD7s znIQf(i>mx^@x1nt>C@cA_V59+E30*x6K_qU8D2dNcSqVwc3dGRqKY)N3;C@qf4E_~k#2!1n z)r$r#26N+2k5)b8CEuv^zv@u&~l3D5*PCN^_|I-CKY%Dg@w4D0?S zoVSGZdz*+M`N_dM0Pf5NG4-u$-vr+2*Cu<*GbC|yuu4N5c2eDbmFoT-`0sJyZ8AGe zCO9HWMZBqGM^ZP%A zvuabt_OU8%Y@MGoA6^`){Z4qU>HHAB8om;Eb^)kQ5(3HR@HY>-LMP09s;vGXx7L(f zYd4eWk+Nnf%WjQ^G6M8r^Z?hKYThY_L6SIawLy6te<)IzV5IUCx{@>PgHvvZ>Wrl= z&ra1mL8FSOyHTvs?h zHOty z!iu(o?NMKtKk1ouZWo`r6>)*ZcwR8HBC(EWnmiW_H*C*M$Dq&aPtv{*>PsR^ z4~R6~II-Fm?(Hpy{0No+53dwS_GXGOPU)U`tawVtO}Ke9tKH~2HVSi&c+Pt9&3W{< z7xt4$iO3+};D=NBiu$`&_!;8+=rg2S!L2%z7W)|m+-}3EN4I9r)Ee+jU*S)UbgR>8 ztLf8PI3R4FbZi53;l}KK6{IAsd9!b62c%h>;a?Q$z8|@J%Qzlr)NmHKmDE2UX#{u;9u7w`+4V&#@Llt!D_Vs1_Qv-n+(JYHQx5Ywp}vi|^xek%CF z=1}amlE%2fP0^fwC#_@u0K($b+T2**>2X{{TZUYNk3vR9ezocvuZJ}2xns9WYj9+Y zKGX9DK8RPZrxhoMJTc%~*Pl)CO{8`a#6CxiHs^lBaoVf+n&`vhWm8zxIVXj~!CTp! z<)6gOCTn|F(|j{Lt+#E|Zz@cZ5#1CJ059WSforB%L1?mTjWm}R2a-wN4{g~b z773}S&s${gHbIBb5=c%r@Smaav8Z(>4LcH+nVw1a_-s# zw!-e}bB;utaryCFl@*SIhsC3#{xF|2*|IP=G5+_O|2x*oZz3~HM^zg&8dSdi*YagaYHBmIykHy($wpP z3+~UTHE$9nu9zdzuP!d-^2vB0Pc%o=VVXo4{{VoJE9UKI#X6_Xl4*)dG0V$t=zlQy z{VUMCKch=z-djh1XqfpygJ5r7NpL?EuDesZvy$B*dwGx|;mbQQbLud=N8~Hd_S2^A zx!Vd<-pKjGL(wmMS$!&5h%HJD>}H)HPI%*cWb@c$*GQiawVO6^CZlQ{K`MdTLip^Z zS0A1Qcegr5l-d6PLyk=Ii+~XR4l&c-sM!tzoKK$#rER z2WvYIExWRw4o~A=-Twdy*Ms~`Z!W3f$DYdO05@4)!5r|*kM5jq8T@PIohrx0w)X2h zmeLr1x+BQP(-_5ihlBiotm)IV7WzNie6`%^_Hv{F-+)KySyr>VkLFA%$vcGD-N>x@4Pv2`Xa1S+2h%vKKM(v7@ecm(>r(KyhaUd`$Ob)^k@;*h>l(HX)RHUK z{{Z1H_=P@^=fU8nxU*rsk}?!@;jj>#kEM8xzQ5wlLsw(uzMUjsowLjW9DfNXZhxP> zaZ{aHUiM4Wx{#H$JwnP)8TfBj7oIHAG>cZUBh0s!DB;SI56$G`pG=(Bxm^5K_(x|1 zR(>JT)qKoK*3sQbEO>E{%7btpk0QP~@h-8e-rB#~w4E;szdw^Sf<`Oo3qL2?yw*SM zYeV+mDoEgNf*FyD=cf*Y{{Wt~r?GR6kNW&hd11Mlb4T4bz9{{iE*{@gv(UAvoV)M0 zh&v-G7#k$>6fZc)Dfrb%ek^H^V%i6Wd=_l1m=LmR7gOB0C(v#NSI1ru@eZ{% zu(sE;PAxJOg z47YwGmA`v(Os{n?cIXE0C}4KNeiixcrTF8+aA`5=*Vh(zki@%EJDUjZ8FSD2&C1`C z3doi32NlYd_h&q?kozjf*?tH3iQ$igTCMkotnIJ# zyW5MOoiE`6HgI;2nn;NN4uZ7)A$(iaudd`|j%_L_;VCAe7L66uR|UAi^Nb*jcL0&t z8u>a)?+N&iOiMo#U+OD#0NXT8=7s~NRhe;JuY)wt19*E!x{lLPxWAI%@NTTOI;iZE z$16H}l>}mW<@OQ&HLw%UbYzqNAcCH$Co2QrrMVK-59con=y(EWI6IK$u zZqJWATXU>h>2|snzK?T0@+Gyq(jiukEO26)M3P~SKJffSPo!(U5cp-L$)oCC2RHY3 z1I?Oy)saiaMpU7UIw)Sb7|(jv@nkovtVyYOPSeDf)|ZUiWz@8YCoE4pW0L3hkI!+_ zu&kS}4}4I+g-?ofFA+zgYznc#5}BJH#L8n&#Cze9`xn_lTOyNZAM&6u@k@4}Y>rsCC6S_&a}0DG zkMwF*5jr+|g32q>ZZr=B=}{;4EseIM+zCF*3}7=a8`z<4d*A`hV>!kzS7VRa#qIhU zUL5g9f^`I2Bd9gi%q_8+I3LY@+y!ERR1@w-Yin8fKk)CwF~;#c`hCQsVA|;$oyYF5 za;=Q>)Yp)~@Y}=srnb8Ev`0$S0|sfn*zuDep;lrC9sdAY`UTCUhLHr9I<}o~mg)xi zZ&pX+p(^d=ufB6qu~7bCl^$C-Gv}>e;Pdz@^67Nn7Fc;#3kQVgg z9@X<-h_&ri-d_s;0H;Vi_As^N2pe}@(axxol22|y>4RT(-Rpu4I_7;Y^TTkYhiIBb zj^pM(-WJ7={ySb1sC+T-kBjwBJ6rL#ho?^{{p1!lrUiD+P60#=PpKLD(d};ZJxmLy z8@m4hsq*#5i*@}1-bm%spjjedqHC!BaNg>|Hz55h)4m=2Q1L@6-d*UCYCd`LhxT;# zqiXa!tz=o`KTx3hSJK)S!0(58Wtp*$S-ZYRIe3;v@*JLotWqkU#eWL(FN)s}WblL# zY90=-(j}EL(uj`BfP?s&AXPEzh0O}QlT977uY;<+lwq%Zzf*U?zZLvX;eB4{>6Ul) z%FJ0Hwy?W!+4b{eiXs01d}G*F_lkZac!$K+<@`nA*?)RS`%TPk0`%aOgp=-3aINo zEAhUmtJq#^H<4O+dK2eFhRS#&aohKsTXuax#b@}Z_G^;H;UaGr>DMaQ1MKk^Jo_Ys zS2K0+6UVw8qTN9bnW|chl`_F9KHqX;QU3suDe}qcCG~dw*&=@!c;Z{DK@8q0u#Vq( zDQ_GJaOk<{4l+37B-bYokGu(F8tPQl^&6eLUNwr?T1oG*n=AhS0jVxDUlUp>jXV{j zT}Kz*aSW1V{tSPeYv`Izxh|y+rzeN>O%@~|ItehX^@N?+{4qj`wxvnND*phf=eoa- zG@U{N294qKYnI+HqA`)`(MqTCu3t*jwe-GAjR`KSwFh84+bgSqD-w7cGTXE1kzaV* z=)Mc_6cDxbj*w%CaLa29kTj>$1B0JT^IV3t@T0+Z5=3;b4{D7h?0`Z`%KTrjEM~OZL z={CYki)qWq6L#y1h}l)YxtQ|*0GOdhmFzq=pE>nwHcOX1bwgGP_Sm$H=d{?93z zIoO`Va8@Thh$GUhuZz4v;`fsCUb3;%8Zs4a>|u^qd~kBoWs~s+ye87iLb11f8(8q( zy>)iS2`-r|QzMbk<&~K~0Zsn^g?r*lEBLidFGAO>EmVeQyS8hLdyFEf{6%FfJvXan zoZ9WF^tG-30EfI4W_8~OLk_Ea*h`H*>S-0(o30~O5k3#6*-p4U&A*yt!}t^ZzqNn$o?gXl!YIibJo8Tyg@w8CXr*M z+bo3dhtGJ)&rjY#A{_k%R4GGusVzW zijqwUu$9<$+Y8F%1OC#f_O8!V@OQ(VYwYpf_$74}P%$$(iO~BxE0d3?t|P`j4E#H& zUP64fw1U|{xBCUu=;{YSD#>o)vFt#uso`ozStf9-MF~3{Tl{3uH7m&NwQVBrOM+Z( z66vTs&#I(t5eL-QL9F~j&{1Lk0EAsYk8e9{Bb1>Z?0_&o;6lD<@lB7!ZKf?#U5Z-- z0c``^$8NzFpeRv8AH$lL!b##OVj}uWqi&;XGFn3{PCeW@sr<8C(xZJYYN1c!Ncty7 z@fVA(=XSo-^x zHyt9&ii_2w*IP;OrLEFi_(9V~Z~1Jn#P=J4?DFn*$G%Gc<0-TBu0K8;`Q-HsL+c&S{+1?Fs1-5q8{@bc=8AP`KYu%32XYA zErsuj?rliRc}pu?6+XUR^Z8b>sJ;|v;-a~mJ*ds%{YEjSc$-tRn#+Q&jRUX){iT30 zBig%-FTq|Fno&NjtK3a(v%Sk(t`AVf7#w|ZTwjOmPlvSMvFcYZCBQjL>0_ECkv)~m zocn?WNvimlNYYSA#-|hV(IYrweYeDa^ek6p6&v1K`k2bHwU&n7y`lUI&m0 z56vX^{%apyjDL{^ymwQ*{hO}t-aQrE#R8Ts1>MADJ=DhNt^WXy;=NZ+)U^Kq6IwN_ zo*Xu|4mnBOToyj1at14w*S;TkakR#@g*4$3v3Tu}rL4jK0N(Q3BiOjEziUQ1S$)J^ zy_vxHRelib*XGkj(Ek9nwztfey1W~tT>k)ac^Lly-#q)*dE(yztjP>M5%ArQhG3C) zvn9=;xO4u?KJ0z~*EIeK@YEJjHnVA`Ng{HK5=Shf@hH)g^{ps;8FzgjlO67`EF=Mv z)LTUwasAUAV~?Q~y*CN1t?~yZwA`P<{{RdmTZFXKzR4sIuzi;|?KGvmNZ!AYasBO#g^2fNuaEpG@lxwWOxyT&AnB4DFvzR_ z00W9VkHFS%i#|F0S=5+G;Syrn-!x6V&;kA2FF&PV>r$L~X3VNnse8enOzK|`bk7A_ zO&^AJIOR@~sI`LAXn;v{73Mk#SzV`>6Z7&uguwYg4l~vd!4GGfu&VbjX!X~ zLUNbBb(T}!YWl_8_k_tEz&Qfr%eO7+5V6P53eUZoZx8A=-)6i^J9o&E?G{<~dV{nK z{sy>x2K!vm^cR;$(qx#j<=ooe&dxo6O^f+ar+iM*rMFuxM$}0*{58Bb+a?~om0}OE z73Nf-N>7?=Q>GM}*`5XQpZ*ftopx)R9Zu`SIyhk|o;zs~BO~}u;=~Vq)#8y|_`_V? zrNOCP#|-WBTEAH2)!_%07{Y8Cs;7{5^;lGBVOAGIZpV;pa084EtcXB(QI|n|+ zjdY$d__zBs_~@JcUr4;u?}}}C#k`2;(Ej9z*pF7tX|GcyiJWxg(D;=tHJIetCX`uz z=|{Q%=i8kB06Mh}k8V%;Rk@3}K_j~7-|qf`z1PF`-wU<9L9P5h@dRly0(QQmY+(5h z@b4~)e=4o1d@}H^pLHyWI=JNm*i@N&f(J)OxRmd?@jilf{lI}SF0My>W5QHT{0&vUu<*z=JFy7-z8~BOd<%rFAdxvroE!OK%OUNWfti zP=_s_L=3I?5no9k*x%w*o1~Uxw~YM2$#s*Da3ErT3bSYXF!=jRzKJZZMbnP2r}>W} zd!OBI82TFRr_I$IHE~o{(mqDK_-h7*GCzpyuA;Vc@~m63{{Z&ThFpCsGf?ohkAB5$ zeA{@3+=50E5%plP*U;WJ_;0G|dZSuvI_><@sm5;X=GYIXn9d2u`+~0NejZCm;TKcb zBE`vcwmxf*atSB&t<#FsN?hvco&%%ko*mNc-VIkwb(|lS?Mj{Md!57*ezlPjITln)l1CO=Y?JEr*1j{C&|ZF&78ihE*Vbb>zPkpTkh-u8>(; z*Y@q=lkT!Q}q+ASL~%P2+z2mS(oTF#qG)1kNvVjlNA@7}6(~HG|f6|bjK>ia7VJKAR6GCM-s{!+T6D8i1C0y_9CHkVHnwR z(_1!r$0Hnm8LKwPvfe7`TAXt5Fm5FBx%c0+57w78(bWoknkHmwT2ooMlHwWS<2VX& z`qo4j_R=3NRV|JNdXMK`oppb#!TyPJ6cZwk^|28u{{Y`;f30&Dmx(jxcSxJ2@VGeq zF;R16bDVoCSy;Oh8k5r*C-CcC4vVPV=#%-nBpi{qd+<(uvMVY^v~pc%c^G#%8Tw_7 zK+_ChvX5-@`3f4oIyB{r#B&&s1=@WXUx0eHnr>K2k)-$*iKwvl07$Jnq2zD{YTY<$e##FI_) z_BJF%KZ*XQ6|8E_ZfEQx(EAU<@><4z#ckrqts{hGZLh+(Vdxlqng0NRS6ild%fuQr z+h6Dt>F_F?Okul%&85ezWyo)?1$-Qh4*lC0=l!lfoo+#O8mJ@>m$Dom>s2bxu|C7h z{Qw^sycMoGTKLODTc-{)b7i>AyVNp;jFJBJbS-`0Ulg>dp-p&~R>({TQM3}cAKfGu z0Dr)-UkGU)DvrW626u`jIpQ^UACCsRYfp&YADTpiRu@+mj7I!Cfxe&#Rewr_RkjY5 zwmoxQ@E!f+2KhC6TWJen;Btz;lDQ-Dt$zx5NNG>z&#GIjfMs6ZUohv?4cHj>0;%{z z#2>T#(=XaCAVPcI!7z0{QnD%hYu2r7{sdgdGU@v5%*!Y~U`>#~ne^I(kNkGFP;XnK z7g8zNr}rHH0Q@I2=ohVWo*>kl%7M2`Kk!izDZ^o?|5bWYj0(E#XNNN%r!DnEu0f zlNBDjnh@jgH2EJ^S2mjyTKJpb#FAUzYu*%VOYnCXuH@SRe{md3oS*h7nz_+@Si<8( z@aCBvoQwetBy&W*=aJLswHc33@kN7bmyfGYEN3m|HL@}vK;-Wu>IE#H5Bz5&5lg38 zGebDaJhDe82m9L@D>nq)*-E93BgcBbhCUxl4X%=WJ*mw%7Z%Xk$bvEHzX1>Y1)CMf z>e{#bB)Vg*#pbc3=*3i}u9}{FWS+S5JduI#oL1($r+A-7-)G`&8%Vge`hqkmcKWILPuw6Wwzd48-zC!Ll|*_sO9ZX*7 zy0)`m;D(Cis>dmA`;i&A{{Vq==~TR5;tftIjCxMBY2pa37`uy`NRg1AUolVVUrBg} z;y;GkX!GIg7m`8$03T@tLM_LxRh345qP*i$xzjZVl6c!oh(8-vI72pnx-g0{^%T96 zz1VwRhs}3VY4?ZA*7T^7QZ}rXGAtaE)szN9`3m%Z2Y7unu=B$%xnX4_e4AIdxkqln zqhf%suX^gA!q({odW*@R+}gfKQ-2Mt{B`@}D}5B2>9qZ0`&&hqPqU6AZ)?j3yjM;; z1a&#~D@sb;1DwFqd?Vmktu8fPf5h?W_iPD`X0-FAC;qv`a~NNt&3Q%jzl8q)wH6DH z6JK50Gk);HXd-em(R|roADP8d@m;Q>m%{4G1-FEr6x_!+W9kr+!|96Xd>!FEYgdu3 z?sU7INyy<~jgxP`$&cw#&&#;=XVG2=@lS+&Eft=f;oVR+mEL{ z^}q2;$36+wyghLGg`$0(6!~H2Y^;a)ql!5r%X)4&^%e7euWfyyhO@cUWYVN##8(y& z%){HvE9Q^P*9WNS9wOA-Bg;Oe9zI4`+i3bG20sB;995NxbnfnY^|!{a3{9n4cxS`@ z7L4sd6uO?JG+UUS?y867AMX=edQGRqdG9mfi>nVHrrnx+#UUX2vnT`cuK=>qbe%TY z{{XhE=Zfu5%O*-7A53I^IjD}aQWpxJo; z083c)Epj+=suEcsNN03W-w%k~`|izpwX~Y5XmV?QA6;hh=}z*#NVR~0++={iP)M)M z{WIdZoW?3VeZgOK^X((7Bh7m}x%t2UXo7xV}) zAMqg9fa^XT_|>PzT3dU|^?nZ9b(7^Dg_VkrUm$RS5&YD%K)0N?& z@*bKr&+Q`@iy_slADzwRtFUinb&mt_HRu+)XN2#g`#yg5p&burUe{Wi)sK)hMWs7nD0Bm^;yXnaG zu4!Rty^-lhHpV6KvzrlVnkAf*UTE6ukZ{Q(r`f>&0BPbozf4taKjMn`a`SG5r`)B! zcS#(VG2BMO{nm$%&btj?!xviRy6Urdn$4}RfWVC!2+(~J6jAsnt2Q10@O*kq))H%8 z9>1J|M6Y(%)33H#Hc#bPyc{1wrJLd!w4`C5ik=MBF8<%E>9AZD1TqV6GalK0m4DzW zE2Z$K#SaN-7jfQrZ%>}mKCY2TeINUY8xtVSnAV0dKrz5w`UR$JV zmRdXw7l*Zr`wMnEjC+7g`jt`F-mTy3GF(OWxO`iCH0SR`B$NU4EXWVw4Q2I7CPT(O zn?9J+elYk)!#2r#;W@A7)LnM{vs1IVjuGxmQcPHSD2$I&T;8$qU8+T5Gl|PErs~;ZgP?2w^$eM7N;qF^)+{!(ZAP>sDbHF|av)5i*>%Ay=q1^6! z!E)A8#h&E=Vt+d4cvik6U#!6^6m_2j_~!1@PttUKPH8UnGA2H4$&S?(Ms~N7y$`9y zbT;;%v}b~?ApXhl^_(zUlI=CE+sy^WJCi)bf8Qimq}*IByH;vqXcgm4=W9S8KN}ZBN6-vI*>1!Ao{{Za) z@xo0mO+!`ioFdW&D)*7;(lVi6N!8g8*Ep{#)BY~_+r-x`BqG`k=Q;8i^Xr8jY4<-F z<-gLW@a@zxeV#`q8+EjZ#^=?UWQ~_U?26`W{715zBIx(hz{5TX@b+GwJxSuIlIDcZL?tH5W7@RW%kHiS|_lSJKlDfm(wqrQV-%9OaCb0?o(Jte@dc)^v}AT2`AJ`cg5G&Q+t1 zIS_l~v2pp-zC`vmja@ZI%({of3yabwg5F^`0ZEkZ7#*-zpRRIiLqqtJe`zZHvrmFd zbPPXS9n1NO_MIDC(Dgk{Z6Cw&UwLGIrcXJBMM2+dJ4Swny(h)L6Ffbm*u`g|>AF{dgffg}BZ)FS2uRUS;wy~Q z>^xg-3*Xx5_p;l$EXtoUFVF$NuVT`^C3r^LQS&@yra=^LcvZF`dGsG;=kQ@(i8saH zf$&BjPa2e4f90L9Xwd#j*dKtUdweL<+Rv%+osGTjvaK6SBrTJ!k$H4VCkNMZV>t7ds7E5=!4FpXTpX*v*F=qOf$Ibdx%b$op0uxOC06+;O z?la^~6~tv5(|F&S(Mnwvgy%MV{+odIwu&I}kN6QOS{jFr{0%&kBj~Z?oJf~*Y(Dr5KT%n>e->}_cv{~=QELG|aU>uS z^vV52SHAT|eAB+C8GGSfPr_I7#TD)4o8kA6)P)riW_{;%N7hB&Q0uIag!;=v8mhxC_ZVHn6-i>9fN)KQ71U!{V7%BWSieQ!xGjyJIPu^q6C-bX}A66%+W(^xozcRhLPN^E? zksHcK*Kbe6ilc1zHdhDi&gB&U01(elV_I=)miFo8#2rUn>PTblka|!xi#+X$+F2je z%1QkNR-(0t?|eabc*>Fm+MEC*MgBsn$8-dnj8V8Fo!|Xx>MT4tuXu)378*Q(PCs~2 zj~=AryM*{%J(a>fv#47Var>xWbc5J{3kp|?(TTpNlq9l9rYl<{k=eM$N&E$RZ-+cL z;=5q8+-g>uJWK}UmUHHieG)QH;a=0EOQ>k^#b=;s7W3^G`CXNy_iSN_KU~$D-CN>a z!=JNg8g-FQiq_9Ghv;0np|#M>xpq2F2k27aB-Ab;zg7e1xwK|ncKN1dTvw^-l6X$# z=Cu0-ly?^VEURe?zSJ7ley_r>-PFxwAS_?@QtLez?@md45!#ji3jKnc(;f? zBwj+2S!$N4dgwpaeXn}`M#Uk299Ax~r+BrrnIhNpDDDVcwc;|mocAtShJA)B%i_?r zNR*H4d&v-vu#5&ChYUgds_k(nsfnxW8h)jC9&(YRobB^WnEX@%2jN(kSC>%AVYa*} zZ`;UnIQGd?T|Lc>v>~nT{4;uzF!@Z8JVbkgpXpdOz8qOg3E`R)C*@tci2nc|%BIh$ zv}B837Q686hN`#MQb#1f6aJSQ$bpY?729{vgY>NpL&Xgw^7&CK#t9M09_W`Is-px} zwv*rox|v0+6G-Eg`D0!^!xc5^`fq@4Vny@Cj6`;lNca9Bcd;}oO}p4`aYvGA8kdPK zF?nfxB0qN~=$Ucpg4>7XUd5x|-X@W8CDI$kjWaZ_djmXU)D6NwGxhpbnfON*tuFS6 z%OK}%ow?+Dw%$ItuR`#@!OtX{SJS1E-rxZ&KWdgRCgXR~XEUK9!ToCD|{GD-Xed+Z(z{{Vz0Lb?}* zU{;gsxI+MJR*!;z1g-*j=32ltTIPp0cvm%5eqnX2nLU7YCoidZ6o${B&< zXmPzz4!J4~c~*lpz4h5T>AAQo{{So^DI8ym0PIK553O`p-XXKJkz&(qEi}t*!{oyd z#CK+Kxc>m(C)%ybTO%h;J&$sNNv)!Z{6XTqI>OEowPCcpg5pUBUzwgvbL}20*DU;D z;Y-~yG`$Z{lHLdAMz`{1M$fODts3O|0bdJi{{Ry-_~Y{KH9bA<212Q~K#TtXZ6pdu z{qtS{FN-zL66^l}*?t|lV($1eMJbNhd*zUE_*N5j6Iz%&EM=^j`bTr%9|m1&uW{mw zDK%S0JG{%eqm|pfJfwKn9{J1W}6cS6v_n%9fsw!9HDZnArMhSEOie=QkLY=$Pje18yXX{i|Ru0-s_?0bk_aLb-B z8;x9Z>ygUU+Feb+`#1w_VCMl$mz9S!Iei`_Auj{cP z@YjLvZS;{Q43kB4$m`IV9##P7zSSQ}lV4k}4ePL4=(>DfAC?c@u(ys&Xf7MMD>D@! z`=|!Jf5vh6vt5EO4)`kP$kU?=tkT}9Oyy7f^<`&2RZ(71seB%6&fYG%cmfQwNqu!D z;r`3{3a38woe4b*+K%Mfwg3L zH?Zp1B%B{in(=KL;YW#lA2;@vixe{XZVO8?7fFCW!@3o3#8uA|YM&51Nvf(_Xu!!R z^4P5H6k{Llx~S&7?B6ZMSBix=-5fP#N$k%a@kfhw>q+H`(%RKxQhr#&Z~RGPit#J| z0Ek-E-Pe~SG4ALOAP@Kx6JFusF9rCr-c7UVv05&AlJhgM>xlv?k^XaB4!Q8(#7Q68 zF7#DMSY>V^%d>yqra1gXRud_eB)RFGG$lqlCa!t4{{V?~S>tc9W5`kO=yJg?cfEE{Pp7 zo%K1G{3!?7(rI-V0hb$5Ps{=K?fBNEpM)#{3dQHa{tOZP>2EG(wPG4Im(h_hPvK0p z*7YUg%SyPIGwe`E^gxz z5wWAV^A&;U0StNetlbylKaF(8^1rfT5tGl_aJc^fzQ4k~6}}-yt6QV$xB6X+Me}S~ zesPaNvGw{^(PZD#y1cpTfOUMEFtT&k|kz zuSwTn($eKpNhV8~5lZ*rV+8(UzHhp_(Jb`_)UQ?V!kxfN6GGv;VPkSXTvynC54>Ax ztN49y6kEwOXgtK0Nepq0+1QeEk6*^Kl~&cDg)Ag(bbB9%z7lELRB_D_{?NIP9%K26 z=2jg^GchNhr_#M^Oz{4-sxcPU@xo(5jpaFiEisJk18SUqckngj-Wl=ck9TP_dP@DS zcu$usP&*jLcsRgTAEB>T@Pv9zjh)rzmonK&F~spg#J1-3Ss94@fi=k*RUq|D5=KJXpEC-{{Ur2JG{8!*@4?2 z59wHXW!|}Ua#A;2i+GPY5h)&+3^IQ@*toQw>gqWqnd7*AH+f)?JO8f;{HxBj*(|iZSlxeSrN5YkCS;A?cW$7989@A0n!1=MsPjdR zoZEJ1c)HhyY&63(5Jx-=_zJe~C(e44y;t!hW8S%aXIk)dwxZWnxVMHGf%79s9z&1r z?1-w9^kG;UZIRR^j^5Vt?jlH$T5bDAPu<Zfi$+b9740KUHp@VivhX0eY>)AUR0&5T)|H+z+7Gs(skaDCXZI* zvHQ68!TMK_Y90gdYu!(OuUbQ*-bBHofgPPCZn5p+=H*235ekr!8_Iqmxu4GTT_evv)eaMWVU_A-098NNwIdasG&c@WK zNvpx1MtFb1zBaOizL#rfZxp0l+f8F@5lMFP9l}HbZaVd^68MGS{{S5LlTvonAd^sg z$qAZR<1A5+@kqNvDEG!IviN&(<9%OFywtTH6kc3v6MXY&_DYtzd@2VB7hzI;`qs^- zj&2pEwA8LpO&e`>^V@(sakmZbD;kr-O({y|(4A=fHatf{_(9|U01xU=Ug!eHQk8T2 zji&Ap4_(8{U2pSqW5?WrxsI)U%P5dqlDqcc5 z?PFA-hmzXt&RC2?mbx#O`JO@X6W|M3==U>eclQ%VY)d*75x=JeJ-c8U`Bi=sYj3DR z`gr?B8}8g?Rgb6dHs>|=7mBq{9oX1Mp!l=JkvtJ6mfL0!+%oh#dOaNgYF&(T~GIO8&KR#7*eYx3at4o-5*8UkP8|yXpE^hSxds zQ6|s0+w&X_+-9fI{7vB>2j0Om_-twxrGEVBENobR5|xn~9>u>Z_Ad_Vo*WU&Y}y;# zOLT=C-d&iZRy`R6YLAiV%ty6%R=yhWRCW(8q_D*xI0aNRKpw^AD0r>Cw6gR|Na{tc*T{Ru-?}`4V(G)q$}xfY9#c zS$bty=Of%2rHZ!bKBoq(rDFAm#myH54MF|(2=B9;4Y26iNR@N3VY(R67w5e}#pYi3*-QdWjUCxCbda2>%1>t3s- z{20>pF&gN1`ZljJ{{YX$+gh<5Kp?zhIQJE|)?C(vJT*Fh70)5@W}~27-8`2Tw)QO` z8)3G$^H~Az963^P{p=5F%DUIId%ZS2KJ!Pl)fU}C#XON1ZVC>H-b*e>^{-m-2f=?7 z+B{d9Rf5`GE`Q^}r>yzy?o?h{{R9XN^Z5KuCCD7X}%V-)5Piu$vwoM zA@toLL634V?_Cw0^e<<&>I+sU3+4x$kWX?Df&O||O%I2!tnAYBW|1|kbRb+Lxc4#~ zf8(^=+9lG0XO>(1FpZ~%ElW>dA}In~$!U25e7(x~goXBO;<>*O_%FhCI+=q)wAa=l zkgFW_(~`sctr-eO&{uu0TUy^*e6J0hs^ugR$deMI(N81mPt9RXDIuJ6O^XRJnS{7!D+i*Wtj zjj(Hv=g0gASJN6EiJ|yX(m8x7qOLLg??|A93Q|jAbxe6s76axDA1ngrRsWiiKy7z zPoi8!aJH_iB223Redig7I|qCozbFINypsFj?AqPJeU{CYbB2~Jt+ze!7;#!pq-vTq znPL{Axho2~(m9{G`w0rdPU(An-;K$Mqb(Sw*$LKrB3pFYYF}r`1?o1w|Zut$W9AJ0=OgB8OP&U^J%^) ziN45SwrKJ9W+^JD@7z}LsU-c^r>MTKMed81{{RrYb*?JH`fZ)nqo0+pZGc1SL*;OP z3hFfPhj-p4Tb)}`(NVPfNX(ZnV(y6;_1)z#{5h+h6}<7!gS2TcG#z5VC^_;Y&h%sb z&`3~zgw}Nb02Al6cDdH{3r$M!N#=d3w_b*N&I2(w@|VF07CO&yFv0v49_HQ{`_Y>f8NKnb2Do`AM=8?oj%6^hg4Mu z+zs3xddiwz6EsWA@eBC1m@WhsZ>V`Ax||Md-OR=ujWj3gyp*HAR@EtOSwwlsPBpLH@O^JUuk@W-@Jd zJqk#*j}OY19w*i$jV3${G=;r`07uuF>7duNd+5|#-Jr(>t`YKnoFC<0d!l$g{#{1b zPSouUw3lucE#xYadUAN@wrl8{e-GbyAtKYE@b%#>pE^sWjwL75H_o{CIITHh+~uoU zOG6_;pH9+9zB-+Z#GIIfZe$+AC@a|QJ|=0pawesvLFU}B5&0fTm8QYY(n6A?b|aec zEl0)>Y4;vo?Txf?6Us&)a(=9VO=If*EcktY0YuZSt=#n3gLrRU<+l&airO*k&pxa< z{xpC8)BMRud_s|`$)?$z+%#zl2Eg?lE2h)*8-%m|(7My1iU7bLDivumdB(;0ze?{k z4~mgQfj{9C)5|yU%IyCDo>)@dd`R)DT(fDCS=rk5v|D&*haT%HKl86GW8j^de~0;< z4+~lBzZ0KLSHm_iZPcNiFfg0pD5_7i=U?F_7c5yez-w_fRAQ@VG2-4PGr$;z7y=jg+5Ho!9iPS?0Ws(z||1 zjo>+!saW(aL-yVA-nk#ybjy1?Y;}>qc}N`ygJB18EatNp#;>sL?sL^PM(7|e}xD$H^I z_G2IT=&fOoa#u;1tOYo|k(c7X8+fl+g&$hFTfLlynrS4H{{S9#AC+c!b5xZz2ye8_ zR(pBD&cg(b7wNNgQPn(a;metu?RrpYGIt1>lxOMYGX7YsS-ex>^k~kNrCiySIc<`b zE`9fI$KhK>q@P1aM#{+hU&H?Z6ntTz+d?h%+Y4D&G70W&?iyeH6}R(Y^{tCPix*xu zylahK6R1fUDsL=2%YDRlAxzzU#y*wujjzR9o2@x?+s!?%ZKD8fx-pUf{{U;t5Bk?@ z;NObY9vO1_RiarLI)MIcWc!8;zoDmPEhLUlT(CcCVyqvAdk8wz+~c&vV!H2CZePdf3A9T~DHIJOg1M zeIHPnEK8lp(a9udkM6GX59TYpv-mlo-)XVMb>d4#F%z_0TG>jT_eJf!)<>ZzOoR2iEk8A#C;jSz!>@hDr*lL{5vh>__M)pdo+ASJ-yxDz=VC@ zEK0x+W#YWgN%4n037599!sG{XewaOURNKSSkEgAP?tS zEWR=LNOYH0dTF@*o_s}aNBk>oI$2kY$|j0T{{Xc6)sNz9$9!4v$G~%}w>}rqWz(Zz zU+fWTraOH1*d-TX7JUgjC8cU1Y%S7tGXeK<5eZ^|_m!?@=TgGK6e0`7Wg= z@mS>B`cXU@x4mnZ8A>}h_n$S#;*W)19o1Ie{?AdOUE46pr+@y+qSDXg= zSItAa#+M`;r*sM*suB$dqRv?Im#3sqE!xK{Qp=x}Lc%gWy;rSZ+=H zj--hN%=ZOb*f!-qsH|OA;n%}!^%Lm#H(DLY!(}CFggEs{A9v){>GoRZi7qsYZ7W%{ zg>F;?mRqZs(7(7}C=B~?^{!`M_+R5Kaz>v@k*uKuAc>>HeKxe8(woF!(zN4YE@k$P z{{X`mE<8Q`l-?<`xG|@f99o5}kw)NfH@@i`{{S2{<=!Ol@5Eb~%4xTHH`ya?+iZ16 zL|=lqhDG{qHI=3O4)I~T`(5UvaWjL$t;M#(j?5WDewErk!mkrTe$#EGS=`8jz1(rJ z{F#51a#xlXOWj|IwKvM{?0KcuhvVz3l-aK7cF{yR`(4T=!avz*BoFnh{b6;8p!1)_ zdJeH5J59B<$!RwZfJB`C03lo2$Adm9NEufRi& zn&9vyYh{K{$L8Jois5vry&{g-Rcp84dDXP{ZK=s7vw3Nu$ee*T6rXjn@R_lL#6bBIr3daUL90270V!C_(0NP*2J|_msKMq56Zr>>oOC)52*zIh72E4CK z@Nb1fV*bxjxAM+eon>cl_e60rkHlA`X}=JB72xTTFAr&2+_H=Y^DW>A*#7{wF+by) zuiqu16{VNz;SOi!&vW=gacgy^&vmQlmtG#bY?V7_^4WcNo$LIo!G1A#s^R3G-@=!^ zBDyh1R(A8*ZBrlJQUiXq-`)IQ@g}rlHX2*$_QYY{;as1@50w6OR_5w*I{9(9BQ$*2pIpb{Mg_MmxKCsnF`D(B~IkgF&v4Zq*}e@tSQ1H`8OK}res~;p{~LUPl^|Ei%%4IX_IFKt*kBlw)fnu38*IU2amqc z*V;Cb5+(^7Y-TeLzu>DO636zlsLuDKWEm%nLc`t|ZIgH6YgR9Y z_ImAuwB8}Tw45FxunB61>e479^RE-S@h^(>>))_yT1jbRY!fU|!a*LP!!>kgUhz!O z23xxuAj^%SW7E*AXloZjNryVNjGJ5V?~8mha<=*%>d32&##zn8uk1`~AUXPq>omU_ z_~XO2!VOZ|TPWopaLUlEp6llAJo{G(YvJz}>lwJywQVjr(B)gtlHIfT$CFyG@T1~y zh}j!i)oiZV3@MuB+XMZVc#c0hxWm4LNv3)ld_cdrwOc2*7EwEA?Gm(;I+NW>wm(Xe z)5IP*lTeRNu<>M;Hgb?W$m6#%^XRu~#lH&Xt$qV|_eZmKU36N+!}?9{{VrfmygGa^se5;x_9{*rG2zT%{#=`w$i~h z+y>ENIg#D%=iUDR10m!efv&4j@&5pVFJK~H?8SV1?)MiSV}IW)oc$}w^xud6ID=F3 zZtSg|B7SJ&(Py?Kf7=$@`2$|X2ZprRAm6B3#vMochBq)D{CvlX<(+D<(&fcpL~(<~ zeiYSI={AdKA$|(&o!S13^BjIvk$vH>2YI-*hsg4V?7iq4f87sWi+3%8*_4MyvjRU^ zt}Z3x(0Rpc%XKdmcyiRSyV36huLS}X4ft+jUVU2liRiRO(T&cd!pjx>>usmqTj~oL zz>4xx=%0jm{Z1>>$Awx5q`SD(H0yo8Fogy|{{VMu7O$Kl_=}`0Wa&~ahW`Nc)>ec6 z07GDZDx3Rm%T=~A>N>OYC1@ zd!$IeB3XlK-2VW0x!a1#@b8WMH*Iw)+v{4bjLuF|_c4BRWy^j-uW9Sz9U08m`WN=S zoPTyWuH*`%{hg?X^{X-bTkvvSe`n3$x$R%0G?%jwKLHz`(yDiovX;Jg4OiK}+;sO+ zL#SFwst*-Tiy9JB?J+rTzy;^?uP@Uiw7kFjb)K!O%F#C~=EW2z@BtY9M!ibw;~#*$ zHK(fC9Xi@+56qIrw*`L(ju}5%$-elN;hz}kqQQJg9-15PNo!=zewYa{6_UbAI=Ngu zyS2GY-x_>A);=KU&`Tbc>jIye`b0->z>UAkygO6|O|HwkH>UR`Q4lm7r864);1`VFYxrEhr8#y=IjL8mUC;lB<^8?ff`Sp}Is`&5_y zRNXqa_f08OX=r?TbNf1cN6~SsXvH;~WzOY+z;XHTe+u%wb{`YymkyV@Z1zVuVKRRr zq$`O5XN?X zMVKGTyPad;mZ>wy{uq)uBW^+;lOEXxvtAA2F9>*x!?#Uqu3E_hXNM|EAERRinypQ{ zCazMADfHC(!%6+CZ*=Pgh-l+>+!F+XCH#sJ`3mnepW4gALe@9D8k95t031xJWBea@ z{zAVyH(J}j&z51`Fh8bhXl|`;<_OXQj)9yY{P9~Pa8$~0?cUaYr|6!k`&{X{{TItgI^Dw2hLwV?bgw!_ZDT4 z{z^%x;j&%k5i2*lDaYtdO7dp0%kc3@a-U#$oA$fcyg_F!nI)Z?MKHt2Aa5||{jy0X z-n@p>;$z6|443y2A>;^?f8mzeE6?=1Juco|nxJJ~#c)5FuVc}^Ab76A&}g0&x(RL3 zV~WxNG5-L8q-D?j^-kB&=!%Umf+*)aN8`;_4KZFTo5*8+1ky~U2tVv1rauyE$aN19 zYPS{=#R|zWlpNh-rhN_o{cGrXG+z>GH|eT)uF~bDZ@DGdZ!`V^4XE<`o5;Z z?KH-^L(%7w>UAGP+Nvu^(0vT0iicYtCCjMY+uI1dl*sDlG&{bdk@{5xzqpx!%t}XZ zEm!mcz1Lp&Vwy}}XuU*$x84RRph5Vt$K_sof2Ha6QF*8ks&!={$MiJZTz5v1sTpj{ zi(jzb3|w1@AJuaj{x}2q)w|yhX%48-Ndh}{ju|(R_4(Tso;6r=wPc6^(1C;h0FKq` zT~AI|4Rq@%&wK;cdB#65CvJuWc~mxPc(*kG~No;r`yMBwE=RkokJMBXz-nf@|{4%1F-t$$qa;pqesOTq8Fn>W_g%6Ch zhPZ2s?IJ1E^oitUPs3@Y)x1mK`}o)UKEZUkKa2ACTPt{& z{{R$G?f(GKYXzs4-MWM9LB)4Ema}2yG**uc%z8P6#y|2VKT74IvpSrgzP_}B9RdB{ z@?Yy)Mfm}q*ACw|$?O2)m@aO1;6^(21Nv6GXe+z-7i(}=t0Qsxfls!ASSJ1GEC)bY zKd7h8*l5dJwu=%J?Mt*u>>ea=D0$jkit zRI#n0IaHfxpk>V~6=T`_HSt2{K#;?y-HDL@00ra-@wxP5c6G&i^@qmoBG?)HLEz0k z@HWq{$SRE+*-=T!rwUqsFhAX@xxT7DEuV4 z5SHiLdS~rJ;e9I5$1jB#+yj)6rYsP81;GdNsb>AE^i4wHBx@h+@-w;r0D9kt-#mQ) zuY|7kEU8!)=@@^{M@Ao{WBJx}cdU813xVxh{br<VX`wf2yT zz1&V4KR`ej`jJ&)J{r?!klg8dq9gQcBLD;IyE*!1ygJ*&TC8ZGkZ^c71NFsew~6JM z0^BUkBJ^)FBk}|K)>5e<{aK#3ajIyRn=ka#)Y53r$g+7cx8lLrkIJ{K{xEowG%&7; zw}FPjX1aIX{{Be^@~;rL@nq`Cj-y~dFk;#LYtg(vFxJl4t}QI0Uzoka1pPpE{{Y8p z8BR-d4uai?`cIAgL#nm%MQ?7ieam)$EC@X}0s7}PBinpN(yk4tf;S_lmh92v+j|jR zq;|S}y!*9HV^6w>bZc3}#ed)uMu+kuwdRY$caRB_Sd!SMAGr#k`;cB=DRhxD>_cbsTAys~qAQiN zleh3rz2R*?>{`EuY%av7i=lNSthworvd#`Zpx0%me$U?$^{8T>OZz2+6OG8S-nyfM z=%h1#WY;-ot6dxC!-+!ZzH9uxQj;$0&X+25?{-1$vo zD?(4axln&0T#eSTsq0PW*m#2VkynS2BZbegJKTP?cfc3X-|8<0v*K+=-Jos|P7oh( z(l?j+QdOJib4r#WYUaMv!RQg16C@8l}b5ME&NrxtYh)$N_)x z+Qe^%-WwAt_;TOGx3yf|9o*{^ zG4>n7AIiPU!5#?F&6l67>6XiK!{rG&mm}#Uxcw{Yy*uHz!Yww*@4QtswihePr`qi2 znEMn~nSTJ))!FzH;UA6Tf-Mr^Y~CUU^JN0fC;SiPKcx<#&sP}QwVCkVx2fnlM31Fg zXmd*{Hbiq=K(G_rn4fp+Tu+I7Rjl6HtW#+kRjhH3lgsj%fc%Re#MkP({?5J?lHE`C zO3Fau=6gtGbML!je=6m*&xHO9@TH8GI*sL=pbYsE*;=??`{iM8){cJYh-0F8 z-YxNNmv<$`n=GF;K|rh{1KAXT`d43}{7&&5kdidiFQU1ZIZ!;b$@ek={{W8Wzd-cO zFX5K1vpJH_%8NPsKiO2SJ!6&0AFXCsPw=>3J(ii9ji(G?vRB8|;D`_Wc+|?Yf0WB2CuK!NCtlRZz6JjjvGHr zSKdu`Z>PE@kqw>Ahy1iYWCB$Bt1)5tim*N>{64dn$d)ILMHqHPGa>cJTXP@lSh|b( zN&5SGa-W~m_}j)e*M*|f=A9h=?97gs{{Vrn%lP0{{*xEP&lgYqnxANfE}Jdl^KqY9 zTLDMoUv}x=58wCxeg9QIK@IPm`fz%5$SSb}d5x)@6aX>s<6K>q-8Df9W)*!q8iz8J2QZS@-~ zYse!^Jd;H=vv51_XFvDItox6N{tDKX3rD=LZA_2=hT2kG{U7A6#`DAW`j(uNU+Ff{ zD*%4b9w-SOq&Dn+RgC2(Wh_Lcq^^9^;$H~-ADU^;g74DKq-MjiSCZ__yG=^toDl z-ww8aKyPwvcnuXHBW?2T#pD|Pa z0FIu2O6g(K^sCu?yKOPaCmH#V>5^;EbZ>{+E2w=(M!u9E`Q~S{+B(%{k1Esr zMRjaTZy=G4$WU?mntjH%J;RA2l17xA?lJ-T;=Y1Uho28&WtMF&?Ns$y7=iiZ*FzVE z{u@SuD118xKj)*XGyY|mew8;}5PMm7JQfcbd0Ke3)%2T7h64#do&=-Z{H~|+u6FNJ znnd4ka|$aT^>LNlqwrPDePd_f?*PjxN&S@3Mmn{$F_$0r+*q!P>%jgBzlUv$Lp*rq z8Em5S$JLe;ACp#G$}eE&miIm^veV_%*L0VT7r0df{{TAeBKTruvHsMOYk_LNebgx+ zeK2d)bx#9$TT8e<#8rFG zNR#b5mn8UkC7YioM!mV&$=!7uo>RA`wi#ZCw`*meF^OJ=DUHSw7R*C zPanFpSB(Dvz_2PiKZPr--u<3UQQ(;J5?fY}chH5~`Qp7_NBE1Vcv2%3tLgJd2H!UQ zQsIFA0A!1n$KVB2z4)oCYOTF)BDZjUZzee!GxSiT5BuoUbIojmGG__@017p%u2t^! z2qsO~+T~U@_Q;SL>zl%t9v(n+={z-P!~hY(%Of9NceZ~TuYKc#b+T*SW>#pv>PH^k zr`yasN99!{@kfMpNZL(m;_yzR1hyY2TwT61D9PIBx+ zk6Rs8-^Fi>I*OYuLsDnABM%z+A#wOJ=kYb4XQ+AQn&#r*N&f&`QbGR!e5{RJ+4rH&efIv7~>^WULKSUeouL(Wa6#Jq8pv;zFnLs#0Y8Hu@h&cz?(GR+nnpZmASE zQ4#+DFBbAfe=YbQfUPYy^Wo;Hd?l9ZJ47v#gDuz4yI_8G@w;m`?)eVH_G2L!sqOAH z2X8WKxVGoH$*mORw-dv@hv?>#JQ|LFux3U8V|I5)e+4oDRrL>tGHW}vI}Kv@O&wZN zTtGgo%Bnv~_@_qkMvJDjb3F6KDt+Sv;5XL2f?tgO7SuHO>~G?Z{2;&=I0b(Z{uR)w z!rK@;HCyO)J|_5ic5NCluIT!U_K@F4=l)ESFl2@Y>qQTOS5#Hxdq)4BMYS_rMjo;optAK9O{{I&X(G$Z^WDEIa=IGNQEhwBJ%4 zI;m`GSV8fNNQIwO3$=Lt#>Nai!jb%|Lr3vnh}!f=sx8g36OS|dK1q}R03BkZ@dmW6 ze`uKRAJ1($yur|UcHUV30KRZ)v;2MWMCxL(-0G<=<0DG9uDY?VB3Nz~y+ce2< zBZXwPx_gm;c1av7{{W6Hv0?PBdp&l=wF0qkis=Se#c0mM=<-{}nf41`Iz{5WU&Q23 zX>V@?$a!g{6UtArxkLQvn&sDs{>VnTt7^$^%a0=7{tHyc`>QBFr4CSCM4>mi?@;*i z4L?!4xpS#X6kK_^q^y{{W9wT{ZkYVK?r+9$d&*{(i4zZ~S#*N|#a{0n(RN zeF?7khvAjnGQ)MRTfX7MNoe2$>6QRjjX`tayPZH;+1%T;xIJMeJdb=JADwg>Ua4!U zF@=5_X~Hgqhn6`%@89u2?v zH)$$cYxjCd5nzDvy1qyErP#Ur4SRC@N%$#bR_JP4TZ9-@WoZKArUZ}ttH39l_Hjn? z-@;81UKq8+)3$!CI-kEA~-i;q7{6WA|*L*q=2B$minM@$ zv~;%uqhU%7q&r5AZbpu=?fstb&wlLJ;ym|#&ULO3-2uv^1f~6#XC!;6t|$5P-~g;cV}vzm7bQ)31^{B4s;z+K*ZZdo{@y0B^9PXy46!F#_}na|xWy(LErngR7RvX5^b$br zidtmD(d#cQtNG}D)*=D%(1L8)KRn$IAY7t39n<*EFj04+x^A)l#&rd) zqFkH1KlI0fHT%#ojA6X+9e8%-HD}75@U-Ce`z_M5{5P_%yA@0(A{TkHrObF~i8YD_!l&dU zHUhDA)#mQL>+5vw(--F28?{Nk>sBR$>lG53pH0s84Vb|T1_UWLv8NRw+UuWce97qT zCYox>4L8|t&gOv`MW=G!@sVj+ltZ}gblvyMxFfRYPzkXBY`intaxE(664A(H83iT! z@_M-WU87E7kx1-L1?SABpYp&N^O5?PLG}pr``({~M~KMR7rcg-_sa!i%FRUO5=zJt z}Ro>^>wk{aF`)nsIYs?y-oRJc9+a&dm}w9GmoiRI@>rHN zAVG%TEpKo>3-|HV@Gl?~Og1xHa5@lZ_n*>riS)SsnFdbdtCC1#`WVkoPqTmttmLo` zomD2syzkIzQW4iw%4;xf{@4-D#k+#JXeiEUp4--b3H?_IFBbSkgxBgH3uDaoVEHDY|5@Q1M0 z0&AAGdoEq&*!>B4iV)S$vrZ=;6eKP9hiv@l+XpTHi#9Q-Cus4>9} z)uaB_+Y6hfFV$E)v?elz5#NGhFUW(t@$8efq3Wxezp|Dowi4*$->Tfo0HSJx5GkQV z@d}f(9fj$mkGnU+^!2I~GVzrKD&tutGA^|GYJ>1)hq_%5gh`^F zouBIgI(q}iR?;z={alKfEg}@pQXj-Q|G33Dz}T!wCul z^D0>-AYQ0}HD{I$;VYoYLQ@T9M8W1pHX_g}g|Nj?SNJ5>gZiXW_9{=855$75(wK-W zaS@Ns^#*&AnO=dA%Pn3Raz^ z^AaNqr&h$L7B)7AogX(}$A!00=F{!8T_#(+x^8fu(>3#+%y`9{ccQxQb+g^ns2yt| z+tI~jeEI`r{DCNIz1Q33cEz+O4;$1LoJWM_?q#6#uRXXnvC1ULB4OlEfY)wPH341` z>e<1fM%M3H7k{6P>_k_)a-{ipwa<`&WE8mBjNqC-Uct}B6;;tm8xX3a+(9vN`bX;U zs~fv4>!O0Qek^2F{DN-vug4dINk)))XIJ8hTcA~}=+PG-*nuyt?KJ)HviN=)9(g>* z$|f`L3XHxeyQpTB{%tsQB0UqN=cfis8bF{ojDB?pub|6R7_7Yeh`NvAr$jDR-!LC5 ze6?eF+K%o(rNHG(!x>H>CSs-zUUQCy zrSZ{^^Ht5&`k4qSt6H|yc8rCCu&D5B8AQ-Vpb>HLaE70l7&c&~Un76h0 z3Y%$hO*~#QO9N|C#jg8$FqAbR%z4p);^cYZkoB>8wB+Hhr7n#egHawyhv{C)l!UFs z4GX&U6WS2j`PmcsimRS$`I!v2xux1|9PON>k3ZK{y;61ZU|M&5tv=k9`c9v2b`YoO zkTuj{q3a&{cgf=JgHmu5Cv3W-vwqCY(QQpI_$J$wP=02kiyyVxOD->y?V?S-pQh8^ zATZ2uBCId>iQ@w((j{(6P}aD3nKo2;Lt8h$RzDG>RXkU;S0a8Jm}1(Mb*4uX`1b0o zoAAzxPI%&n$c}$gaNde;D$h$Nyk*6NHsNdK<7+HfbUQAOAz19~?velb4N;VQ_1tX&eoJxwW%UcP2J{FWr8HaG=u(k9EllQS zm#p#-+*VyliFC2=zwTSa7hKiI)6TgKE-<+WE4RS&jp?FxEPlSvt&i`rQ%9lseK2{4 z8z|9tY#*3@>;Y=>d4#G?=X8Y~$N0C{{g0FpAR0W#$b6+HzOwsKV0^V{CJo`w!Xd`L z*YFK<^UW}!gq6p>U`oeva)iEH9fvWPJ5cy2m#=gDVkne;8LIWhSb5avidB8s`9X6l zn~9rct;%G(mAbBhltZ-Fs^!7-jj07Xsq(<|qnn92NJ}ZSM!ckc@wdg#M$a!{rMW9a zr=u0NVI#GJzA}O*&*uAHSY3*6IGom%Vqg28RvFvKIMOF4F^GBfZidZI{)(JeT&}`C-fnzF`X+Q?_KhytEox8+dPc zq^18mBV%VEkyh~ibnq9k94@G00cq8bS8O~&BRPM$Yv)%MqAZVFYn6E2mS$_zD;yJ_ zWGkQ;!e@>f#~u~i%{$ym9E|PZ*6D*nc_X^YkT8bPr_)#!H-1N8r%)=Jh6acOB!9tr z<}1xeDX8N=CmogI#h+o@PJKh6lC+75XmWS7Lw{VMNe5GEQ;JBJ7w_YIpF`!I_VdcO z7@o(?GUjmIm{a2DMjRKE8Aw_7e?h?P8dR;i!!{`bn(QbvH|!5eolbHJ64`%CqLo(L zOgQy~k1F=EjtOh=Yg(+ROsQybsfC$%q44$ZQ2%P1^ST$Of`zs-8hyf(_r693DvFeC zoNXM$@~2_4^m5*sHo6*zh@zWouqgEVH~RkI;ol;4Fuj`z|5I3>A5}QSh0I;VL;~>x z(@c0)S1Gni=7h;Yh@cC}jaij<^-Qyt&w{X(EjX9@S$XO)*6(?*PhY~m*NF<|PXP?I zfa9kyHm7stS+%6gK^|i$E-3G=;yO-wVX&zw^7MBP`+Wh--O~0U$_PBy^pQ=6C55HJ zgF9>lbeUtFgih!+3Zp_y8AAn-h(tnc$J8 zdcoe|^7&%lw2>~79Btx(>1{#xOHMtI_IX8dIeI$T+70%4TT3gly6#6m6x%PVUCf!0 zVR3iT-=cna+=HC`tl+i;>7!$K$dd(fHVMJv>`0Of4#P5y}duw51}wK@#5VG!;1XDU(lzzkckinq&C@&HR3N5 z``>AS>Oraxa<7Rm>1N*M(BqCM!894OvCzksGxIm2J%4ha&+uDofGGGi8fmyjDwPC7 z|NUN)&j&frP2ovG)C4DAyE(We4O#tI`;VX{uO!r%;fSZ&ag(uwWaBseoTubgPHK?H zVwr9ZWL%apY|1ZoZSfFmrU7_NSr>c;N~A7nU0ZC_!;Yjb^*;i=9a6}`PM>$>2=_v+ z!G5LPE6B@%K`h^A6ud{9F+gHrJEc4Q_hOgiXua43i~lpRd%?CSO9v+yR6pV%G{y9^ z&FF0z1vQe<6LOa?46>-$qelNkm99;CM9lf_ZOA4KI##b|ZS~I~t&iCx<@K*^i@eP+ z18EnpM0vQD#J=i))w5Z6ofLbs7NGa%Xi9uHbHU7)BTxTu9MPa6EQj~^2v(qji#4N$Ul>JVbgu#ARKG-q?Ild?(VET!d=u_;5QQnl1hu58aYv z0<3=n!8TbuB>lJ1s)&>LPm}L$QxAPrs2;e12d=ZV7}k|?%1^IjgpQIKmN%E-L_=1I znk|NMp;gh-U339{NHz9JU-WTJ>xa{uvCjY+hW&nn5%4w%wj}v!Hs&Vt3x`nQ{PhES z&jB1=U8AChim&-iGax^_<9Ket|1-$5p6arM_N1W5>jce$FDRaO^4E4Nb8-J`RF?6( z?F_u|p%zR>$C{H+e0U4ZEQkmi+!~N{*cH8*Q(3=-J(QM0iEpM6g7^?d9UK0)D#M9{ zOAdP`3=$RufoX1%y%IhY6brN43teBuL@4J_HK7Nt*8AO8ux+#PqY$}*3;_09s3rY1 zmXu7(c1U7Kj9Z#ht3f9!wOBTopuc#L>}}r+7gPL{^ysdbM<=gvu&6oVYV*9b8UkZm zu02yHo!bmQ3tpUuR%d5(^R%fNtPt^CAbg^*_gykueazu!VmqbjeQ43)oup@pAweUJ z-@mOVv;F~T=K7$gLil_)qpgfXmOz+$}w_i)6`ZYRmyS z_S^jVKP4ZVpi)KL_`t{`@X3eZIiAAOMAnlWyQ-4TLW#!%NJeH>zY1>($O>IUXU!0r z>gWRo?@(!sPTa8nj(Bz|*I)RE3VQT4PqIRfKH!3bZX45_7{>0{th=98n)O{t;&mhY z1TEWoA>aXY@8NEUK*c`WGn80U5MBHT?g!&PMD;Uka7WmWV*?=RcHZ9Eob^)nWsw$L)AH!cnv3-jOUrW4;$Q^Xe}0;T zi_yPHoGmvA2=AMf7<00bTSzeTFy!NX1a42|3?&M^tP7Dm{kr%gu{6MaL%WHPH(A|% z5MCU^M!Cs1D(=Rt)TEWh#JOSrCiXCiTBU%P14WlT;sjsbgnTZ3u`>03EP107CGh9W zwmwVe=i#HfkniH1r3iG%^yk8)=JK?03b|{_*-rBgtEvFrtSq@=`%Oa8|K>tl+SG7NdJx^m4seH06!+e$VM3$5|ob&-t;i*&VX4p2MPfecr@K zzWI@{XjV}#PH&oVfu(%Pk!*ljGRO8@K{zPs4&n&SasIbJ;@QNuZio=c7t`;+C^^fGvXuZE(Qp-o5J;A3PLVhlPR?on53^#0`!mN9CT~>68(-&Vz`)VDa6yJCt+DZ(uymqM_=`;7 zi{RKbOu7ha$$i@SUXLx$`|hRi!bYO!V;~6(Woj9Z=SyPv7t8wRROipwv^*p=h$0grS}LU3JivB3_Im3ac5D^0oI;3W~VLjERI*ovV;h9^`fZURFN&2(12qiR9^}9H ztM+j<<=iC|ub(%w7Z^96d+ve~U7w4xUMw9oQ)q8C`?Ndu3cTOf^f#|+ z$>E|-v>7$lGZ%+{hH)>f7qV>F*HJCTu@UOi^n)LYlZMk~v8RIi%GCh+!nlo|_WlL^ zgyNp`7sC zd-8N40V1>0LfG>LRaNX}Dv|WmRmDuT{X+TP2b(U0A2@jwe8CGJbr+Y;f{TlgF3EEZSvLMtB z{ysJ?baBseNPlo_r5wo{am+8>04Gk+(3|9KNtc|5GCx0xE*EFRPI@1Lg)L0vdC?D@ z%$BvpKe;C)sRR61VTaZA$)5kS%<&61KcdR_TbdYyFmMIp?^b zU`g$xKbqK?yO>CU6NT=?zbB^O_31|3=6 zNX%#F!nx$ftvAPTHcFhspVjcNsLx)%gW+YQ^w6;|$vzx43J=}zAj$(NfX#O0 zuXelscvr%5o4O%vIIkMoF8>2qN2wLhe`d`sa(HTyYyNYN5-pbY2@h21W9BBH+$Mdaac{#xA_zFuGG@FxwdM~7YQ)9?4Zjr4!5Widt2EKC?laq zZ!M)suqqB5KK0D{pLnjAqpKK9hEo0!X%GqdXfT5lhMtk4$pQC7D+szMC?$~(O8Twkn(&bt-;lQg)2h(ZL zJa>E%fUV)v%b~q|G;mshB{U@M<38;@)N?YrHSAf0^)xl8hG?zt<$ic!s*|?8;XlKj z?r>mXxp6|#Q?16CM-lRTzlC$q3c^)c*BU`Lby=6agW|dzvfnn1VF7lnW}=|!tO&r5 zjSfM!mp(@ojvF)rP0_xsE*Y;B{sxkO1-9OgL&D^a#H-{Cj+JDU)BgdJ--Nif?|P@@ z(1Oi+nXxvuv15jD0K@(`YR}BaIZUX{hO2L@M;On+L36VsPLk65YUhZ?VR}I2oE;zy zr<-3$x&i6L?*c>S1(oV)z8B=$fr|2G+v8qhA^C_v224!OtF1RawGe$!N#GI_?Aswp zu(`?EDnN(an!90Y@Y(>gEC~*EhF$qyr1?Q`Bw0|2rl)gVI}Lz2{$xPE9$PCHE&_(q zBJb&5{S;Dxb*Tye`wRURl^ErV&=~T$j;vzHe2x)gg{a@y+y-07s)asfyVbrZtA&Nd zh4VJo9T#$6D(W-U1vC0IS6q#z5`Qwg!9SV4*xg}CWg=skXvPz%Ynf#mpx@e^3H(RU zU>>EyWGfwn^ZV0l*h`Pu!Zhu6bO6xcQ5gF>@u$nKxa&2`vC{^qRPnvEy7NfZIYM#KLpHF8=;`JZyIg52r194^ zqw{u+tZC6u0GBq^vc?lIud(qPYs`nS$M9*xJWHqRc!p$5`Hzb`h18$XZNIAT0EZm4 zGHFkZ7!_N)fDIw&%jY*Q8Ye1~4@0>m6FM9?t(looWCS5~-1BZ`i6Oti=u02}bIbh< zk4O7{{=Xf#K!(ueo4^+0)4Fu=BZ@H7+n~UbliSWB;P$t|R*l(D30bFvE^lA3hFLQM zLi7_f7QuZ6!OH2SPEDI1pU*LZ%vyjt#^&BX#ge8@XBo4jBf)y`wV(DduL3WcKj z5q`z~=a|(wq}&rN zki7ohVVtJ0XWLhsEFgLDDSh#Xt7%ShHwpyz1dVo1Qqmu! zJuwq(rQh0dP4_3##u8=znAAW88w$nLxkXAh21lLUE%>KdyxB#Ym_ZqNV(}{f#Qr6- zG9*M|;GA*`epyc3_oL0@Vkg$1 zUv&Fl*_mss)T)i?^kK+<1jTT!k#5A2#gH@cogc}>`$WO|b=?}B-hCc59i~>oI;oM! z1J~9o-DQ{DIYBY)N23l-h0&MDw}3@GJ5T9g+mzlz1{~C5N71G96RymstqrY&lzEwT ze06r8q|zf`x(=g}g3^`yM!C7#EHNrSRsIp)gGp5umT zHgBV=Ae1EGTBG?#or+t+YWU+J%F(pW&pbaH4d&=6>c|@k#s+`VS{=v#wC|+RoDhPR ze=#>kd-r(WUVHxVK^Hck)8$aYAeSXFIR5JH=8CE#0 zCf{d#DHM>tKGRu9KF9Q7dFC+9SY>-4KkVLIf^!#R$L}9;y3NmJ$`>IVBf$clC%xHd zys7C2xo1S5F!%Yv>U&}k%Kda6&fF)y=Z`-qx>D0(jg_??`kDML9!s4CGK@XlzOudc zq<~0IsZ9GFG4K)>xUJ51Wu>o|MQ|n#xBhrG7$9=$)44FeC5sYR)iI; zIjz_`pwTMCo8krJVko}GjUdjhcwyHz`ZxZAKC9+F1KdT?z6_uFT=74G0vbyN;{ccL ztdC!7Msxdu1YdzN$()adR~XX2!Wx@>LB583HyN-RZTYsR6(C;72WKPD3y!H_OO*K2 z)0LVhH#SRh%RbnHJ#c-1`&NTQo$cnS&mA+$>yDzVB46N)qG;N%sd#0Nr;D+bNnC$W zc~w{8)R%h)6n>f3Q`0VdaSx(s5cO5|jl2%w=jr&K#Mw?>bD?+5OIcrqsQ}Bna<2e34QsO)5HO;n% zoSP;=FSyh9>HKE<(ps8E>lG#oSVL{(zYbDRy)lLQ>l ze7alaF}@r#Y?)3Q!E}s2G%aU-+JLp7Re`974-WgPGRBHr?QoR@^2N$2qTtCDTYh z184O*ta*t2>2Z-q#_`A9j^Ak#%tKy>Js2jeqo|9jb_(mXZcw!=SZBo1NuCGg z7w&TvXP}ZYyG@jRk!n(w`qTT*suQS)jR#k7qFJUrDXvi!tbb!%Xa_)7AwyJ(7(;GQ z3}9#Q)T}w~HRW~6JI4Z++loJR2~co!nB?pl)xMqy$$tcGY2SMxVy_@30~$C5$8M!7 z$MczvQAi%GlKh`vO$M#k;Q>LTj;|&zwRnTOxEpDI%;MGn0p;j1`WuJg#@(-%@+W1S3UhD2I^)R(A;go-kT*~Q8yxe znSAy4gf{GDa!271a#P~9KxrCtobP`GX`+k8MQqun)S%f;7X|dp8lx4J8QO2wSU7&d z)RZ24Lq)l#yCc{yL@o$q@`^xF0g6?j!tt^cW9V2|@f<6cd9ht=41yE87)~;6>cCNkgGisef8|2GLJwW2 z0+~juN_s$8)MrvcbRT=(XqT>=%DQ_FICFi(-|Q33F()ER`wO8 zmT4yBq7c%wq&ahJ%6aFqRt8Tk=ecIGu*|Mvx79v>s zC^kt)iQWd&VbdVRLH^4&5uLgeifK!U&{DCS&Pb@Vq5^*G&%f@s)IAE($vUDZ6>!n5NA#ni zPH!P=Qg)zEl_qo1UivaXx@7-``T&4oLx~aJ+8D} zaV(qYXcj^xnKpBt|7+&R;rvKw@mrADBeSE&qX$fnwLMApX};mmD`UjlSJq zEt*6TfgJ^H9(`SLzYz5Iy=MPT6Z`S4~&@-YD&A|hbFf5pcD0W za0=8rc~vX$*~Fu7dF$Mdu_!Ht9fe|82FAZ92>wOTHt|+ZKW()P)A=nQ$JF^LAiF!w zUeqB};DYBHKm7}UkMQya>$1k-7D|0${V7;A6Wh#GE6!N>^8B&QI3c!zH)xrBLi-3* zqKo}-iYv)mIQl5XI?#XfAwYYMUEFfC4A7?ZvJwH`$V?!G=6i(*Bk_0{2dZuaI%~_3 zy=McrY5$L4#$c*9nKJ2k)59BB?yCL0U@Bs(2V}K%-@4cwwHo%>Og?|+zuq!EGc^Y1 z1mu>W2sJvBU*o#YdKdoKI&okh0uKk@X3J%?y=?C_@r)j5z);ZzDd0`gkxgpar?>c$ zFsxLf{NsXps(ig%+njC|SR@prm#VnKD=^>RvpZicz0?+g{K)=rrB!E(Lq3)(2l6&2!Lxc{EcpxZ)WnbzT`p~>k{ zQ(4d)Q)vCdo3|lQS^W{2o-V3JZFD(j7Wk@AfO}Wi{2x|qHX~$lJBFd$v>8A+HhxoK zW<%lKo$dzR&h!n5CrZg+-O?KE68PcXPt?JybusIJvVcIg4Ch zpHYHc$M>oVUpT2@`>YZpOybK|y~$?K&a%E^*r$Y7)CJFk z$ZbeXFD;`DZrU?98bd;TzVLm{4X$#M%`W#P`2-fBvr7DvRbsJmrFwpKdV#w1!? zc!-XuIOppxEaI8c`dGBruHT;?`HY17A|_5;;K;ee3tH~pc$s%yf#P}|jlkqy2rvM~ zmAvOnAd$;>7t##eW<)k9D%H4|2^7JtspikxdO@GU7v`K%!Z_u=mpMerF%DbjJ#F}B z;idrQZq$KOr(C*9;dorJI_td|oi*{xlMXLqEz>VQ&BZJSSZeD+8jd-C26NQmzZO>Y ztlxgM!pF!^Y|<0{NAOzw?Z??#%b4u$kqi0S33(yMETum$(4oavSdr06$c0JPvEfE( zGEgfmr}ZiG;n*TADS;*l}-^BM-3DyZizaJ*b2 zJ~g{W-Sh>1EPFT9V3pZ7RH-*eKBZummoIuI3x$GUEk!MT|}h4(_+xL@4ZLOmF_QJ zR*wp+K|aP0)uL@)z30djvhQHLzA>^cY?^WVXc(;ICfL7_pl;;s|C)H6C*`a!#0i2t zQrO{C-@|VvQ%=iS!gEOv)Y#2Ic=o53M&)Htb*fH@L5N0d6qz z3kkG1wKB7Slr`T*(?&PGUUv6V9f>u_2~r^B4nus1z8moQ=aS1W?EqC<0Z)|xim+c- z5TtXXVqFPNo*jCG$&_uUf6L_y97mFxN!3fSSmOAOO>-b;2pxEd^wowR)^BH?LKK)1LdLzp>-*Y(5da zsMlsi&na7RjV0=?fR6Vi_J@h{9rd+5G1t8?vVF24B$&$dAQ~z#8U!4jje7Ukx9!ZEt9O zlGJ$;90iIqont`8twt@{^?IY-_b1nEsaK!LXZzVw{xQtj&3hp0TNRPa{OUIdnH9he z1lukFAiee6Rp3lWL{fevW`iIjVv=qQ*Whtr%&({!74c7Eb5}xrw2x41OMP+m4n?Dr6CeJvCR>P{L?5Nd1}_LgAci zoGV1M(A#<=Kk__2eOG%VuYztD&lvtb0mK_BX&yeq-l0Z=$B2Fl)7O49S^q{NxkFq0 zG%}`cujZ#kFPe zH_|I*RZe5ewwUg6%m(y9;hF^QaGwAKBcaofbe72bvOaD|3 z%r2&!4E_1!(xQ-viuapR34yP{$C=Uab+t-#bFZHt-n=WO%6Ov`C-oYuVFs*lL+0cR zc|J;8sq4vw9UztPDV|Br@K@2Xw4!xx^|l(>L)4iFt*voOKI3wp|I(ma343` z2#meN*p4Ona)<(|Y&gkjVvy&yM&yZSSgzI1X?6Bk41~oh3g=^r`21Ih_7$ZK6q2I? zb1|CufV`GJjy#?!ZP)&|&Pw4zE?J(xw6nC(v^yet1uKGwb$Vsrp{f!0pPa z&U9l1d4Ibz|BSNskUMbjt*SWTTq5VXUYIPHQ`QHbbq6>|CY^xZ7@IZkS+Y0BbVyk8 zt;47^d#Y-RoqKU+ziI;TPnF1C0fzdMFX69%EC*1eC}z@P>etrS61TCUO>|L_cKu<= z(eU26;GQ6d5@sX(W=MN#BzaE%e| zB)lvF=_XEgT7U@AF1<;iFx8o~$%TGhnYaUUAo9h@|KX@nrlK0V0d>yh%WTRxdFtsM zqs#KrsiJ6yYp^48VvA7|9=fz^**NyO(aBVE>RDV{ikIggyzQvgMh7iSH+iU~ytwi6 z+?ORT(KF@YIl0Zc-_JS70^XIg4Aj!7CK8(QufM4zKHSgV=TA?Oe3o{6E=#BJ{iIq& z_px)eRNhZ{%2p{B4oGu1-*wLK0SW#~;7DCs96`TJHxv>si3xgeRK4_h)b`8Edhl9s zRf0UroYfB{w$!UnFXsgfmcpLN!A9H6rZ=p4*57jtCo~vM9b5a0IA0S5K8sP>wq(4H|rzr~iU-J3?k z=YQ95fsN(c^^^Sf9*WpzZ8HEGc!uwio6si>D6J(I^3I58qsaRQ0bcM54p5EbAga07 zfRx3s$&aQobiTmA6TYOxln1W~vW$`k?>EOkGz;Jnr1FYbLJIXcAe)RHXUKN9Sw3`# zR01+%CH9rl5K2GQNvNRZnSU;|es@t$#U^ZMP5+~7RcWRiA~jXkm5)f44SQTy=@ItA zY(aHAE;VhHu?9QH-s-94Y^T4$X<5RDsjPlP5A}#>-Enlni@3eK zoW%942~=5vrTPT+R-@(t6VyX&H$SORwEIu{ zyfT5+kM}XAVTSEj7c&}0F#y#jdq4%=iSLktm#!^To34^#HB4g!`7fku+%_M3i79Ij z03Oh__dVj=KHdd?D~pd}B-7(S>AK{0q2oiJ8GzW9c&|o!5^=-Rw89yBjzY$vF>+D3092YqMiYI>G5_tz|!1*DcqG!Y&{2iozQxA?a zr2qb-1+{dRG;dOT2wC$;!OU^ggxF-M^wmPIpzvodsvE9&#;SNJfk&M`%dWJGYUR0K z+t)crM*3=Sxj*=rpa5LB-@{Tz$56yQgH#DUifINZk)qWfzJ%V4geC=nof5RwX5ZMg?MW zGX7kPPwh43K8QTBLfOuli13h&xNDx<+!nsLTOnV9uFC~_%mjJC-|ZR)wo`?UXi~Oa zIMRl9wZ>vPOfn$RFsY=yVImH;BCnbJ8yMVGkMsuF%B7rZ|04)ITmgswk!-g65pDwL&`l#{WYCa&@asIr3t$p9NURKHx5yxFOoP?SmC5t6>ds= z%+|x+_P92LB&p)ozBYbY_vHrmjtGr$8`Z93<$DuR=oAbJctE^4xATDya2y<2q=fpKZ$c{@elprdLRbF$u6NxMDf zk>MFb(&9^_*VC;usN|ze-A>EQjk}e+?8$ygOe-?VUqZ{V@1 z^4w#`STq0zXPPF&^P0wSAAaw1!ic_b{+oM%6#p^AgMv9qho7tg*IYc(A|9)8mc&aBN9VhedS1#nwqSjJ6yim zFYDqf9tC#j$o2ikKc9VY2gBe{b0hdBDX?uP`to@R_`s&4*DD48uZIvKogSfZb#z=C zFxCtH#wI-DQ?@U8;;x5tNPU^-b=1EFKd^l1Y;fvK!+Zk-WTn>{OWNM1D1O>_)=#<^5ZhOnNRJeNdw4<2*x0}DB7)0BOkt#6dQ?{DeY z%9QvGc^j=m%$=-|nF6mTKQ1fSzr-OG{PL#gX7||G&@jKs2}eB=_%n^@VV6Yj4#S0b zq)D zw-WQ-cmjLDM3&X^6g_%BuO^Wp|JF#zy!oitAzyJD5Te6MA?#o19AsbIYugK0edpxmc`k61{qvPZ zLBZ_u?WWZ_XYoU3``QhaaYk{zkFx@cifKNy&E$Ev*Uuo**@u2?ps)WCbb}$)YRyDC7teq_6Px2}P^v<~ zJgoZPVo|?dKb!Pa^&+{bT8H%#L)sl_s-w0S8~fyeTL&RJ?VSu0PS;JrqyB}BymB|z zF1t5a8x-%EZVW}y$D}j8L*3pNa_?Wge>jLz>4h==b)Yqw=}7a7`K0*w$}_CmDiNFm zw*TH)6iT&Og`{LaEXcuPu{PvibtyB%i?3-uPchF@0aMMat8`*S4Z~PCe6c~jqio@5 z;l2v)V-5+Hue>cOM2S&@JMp>*Z_=(=CjaRv-uLTjLsTrZ96#eCUTihCGE|QJvYqT@ zy35kMl&6ZWL6WwP=J{`&JTm$drj(RsNFoMh8&{+PE1ohvu z8V}!}Q!P6i3H*i2mQ^a#l*O6M1?;%q`;Akfn>WVFyAj#A92xA{T0{~PMS=++Cf*gS zDNH4-{}H^g@3B5tzs4kdF1H+#8fp|)x=VA&p{#TBKD@_!e{9PHZLOiL=<8VnFmPyY z=FDN1@dnJ6^!vXQ^D-U$;|)=|H`uD_5CO09jId!mZ+)lhhtTrIYA}67yn}B`@Q{6g zTwYHVPwic2NdrGU2$`E3KP=NI6C!Hd2J0qD-f~@|H?;Q|>aG_QJ;=aY{xNJl=pve1 z8VYu(T_Epmn(*DKTVr`n*T08nMb8fR^oZ8{BfQQ}dvJaeS;pw{k^9*PBm7uaTd_fv zZwZ2=>to^=ZXJW1^9g+*z8A)Zeo!0uncx>pZwM~e=mY1gas9+3%^H zF=mp_bJ(^=fjK=tA5`P6f%ITP^xiM4MmPeo%2s#p3hz>jfKlsO|Au3DR0mL$e@`AP za+X5w{W*8rI;!PrYF=GRT#?*-!Pn2+EghD^5gj5_Iym=0M$MCW{3ah|aqCgNZ?ZH* zjOCZwvETT&IJJqPT&dgTjqE%{!2S2(ifvsjnXUI#H>2f4KU-mD-|Bk!n7DCO%7WD= z-MD_%T!nkk2KFP2RG$Rf>lwO-h^{aF0yHpy_b_AObIP`)79deI2Y52H<7dx^vo$;T zr6_5Cg5X=?ITDGeG6jO=lB3GpM1d)w(ME#RqaLj66$OkE%Rx@}gIl!cUHMo2l~(Z9 zxL5ZcZkM9^iqB3q zBxxC<^Q2DjJ^M%+d(D-~4|L^*YVMBR0fJudi%ps>fJ1G(#uyTcpdWW33VW8h?SXe* zR~~oFWRIrzrY*?cxUs|mM*+KmST3P^p8GEVXbsE(UPQGf)tr1BkzCVfP0gpT zLlCRWpTJ)Sc>tK{DO0Lg4HN1M!sTJ>kti4xrwm=ySd)pk2d{V)h0k2##t-w+Z~SHY z3vQo9TH5D=ccBltZr|9*C*pEN-KtgcjBJ5>b)#d}XUWt=?JB1B=w!*K9{Io?$0Pxi zG^D!|buWs;w4NJR^&K{?w}JLWa#^+OPXVMlXB+_*JMN@TmF%pFQHfIfrH;O@M@;?x3-OYpkO#;&mg(lFm#3gVzRDiB$I)Pu^QZr#={v)kdY-oNXF)+kMT)3IK|#8pDAHmB zM8t?RsZmiW5fJGuM@2!TL_k1kQF`yaMXAzz?*Zv0AwWXP;aUIJ`+f@-;jm|ScIKX$ zduGC>ERi;X_vUZ6Nhq|;x*v9Xc;3$;?@vSr&5H@h%{FehrP@8+=j)sDUa!KszxmNmzm|l_ zQV$_|e&~p%Yrd9cd;XLpT}Q`n{U56*prLlLk)#sH`^eC%!D*!)Bd+JeNs1 zlDhRqvJ2%4Bbq7K0*fv|Lm?yti|3J;AAIJ9#`=ldV!6Xp5rFz=y?nPnD^&WS&wWYm zpb=syZ_4-AtE_?8Jv*ldHPpmu8|qv_!5p%T7pUdGAiF(K(yhiFZ|_p+=U`B302;Gr zVP5VfEk8hzrN~DTRNt2%rH3+HFf|_(yB9i+%n+?UCn0NkvLmVu??dtl1#2oEUe~T| z=ck`(0QjZl-g>dBUfrOr9z%0g1de}I?@#H#bSRwJTRRwH*2;l+yz(6J;|oWRe0E<{ zb61Xvo&c`Zy_W z8R&>~;buL#9-kUv*5;{q6~v^|e@+17t&2_5%)%~;*nHU#1G zy|UafXW~AHjpoAF1u~lIztj(_e^zlbFa$UDm%>1u!*pPkeV23+aw6a_nsvb2ut?|( zX*sxSk(0-DVoeiPu}Ieso4C0?)SBh^x_rRQt#^%k!X)%O zxV@Q%*xYHabW7o1Hm-H2`HaSQK4rGJAh_H+I&O8@=1oC|@6(t;&vHjgivnghR9&iG zkD!}VjZNC1#c>xgbaO37M-&nLX}B~c@ISn~kNnfzvpSYcUZr|b( zVqj9g2Dhn)>#3SM!(adC>ZV7j*0Mz(0LH|j975IOQe1!|Ri%RXC@&0J(WSo~h4f|4KDwDYp~RvM^+@=9xb zaNoh*0Fni*#(HUbS|mTe8%5oJ<0_lC=T9>E(KLP*(l}eHAym(3nf! zuZ1o)M`R+mt~hB-9+IzZ$TXu@^y-tk9-7|GI}FXwX(c1Go_$ZFVe9JU@cF~mufw|n zT><3wQQPkw8-+Y3hLqG1>vv-Q&b~N9i@q^>`j_Vp2eciUh%bToorw!}VZ#9kxnv^jZm~2^92F z#4UgszRPAo-en^TM-@k*|3Jee<s;|?bgTcBh1K6J#a=BLY5mZ5z6F2fFVUqsY`C06}@$rjS1AGut^*7#G5t~Rpv?URyC>ONEb3~u)>7) zz|C=v_G|%%nM1TUcwWU#5ja-abxB(*R;=%Q4)d=s(!+1%lNn3iPZD8Z^G!1Bdu~%5 zX;84wFqo;rPyk*IX|wm(h}Yx%o$u$fcG)C;n^Lhy^O5WIzCZ`QOQXlWC#wm|;wyC2 zE+#wu>a6x@%gQK2?HfU|96#{TM?e33Js^MDoW`y%LKyBpffX=FTngjA;)ytYA$y%! zco^%C=*b-&vOrXG&i9od<0Y5(^)lt>C8vVz<)NDIh|IL?echXjQLik7;)f7B%MPzl zu<9Ew*^HX0l#0Ze7>1q6K54GZ7O(vylMDrq)vd{p(B_i-vH;CnPq>(MMhnj&?klZx zZCzD2K&h#u0c+p75j3qwGk-lfa{R{R>d5F_(=)x5)$VAJQTb#yr_4gBH(Slu_MmpJW*3 zbml{k-;XhKy|PU#E|h<@V)W}w$+i_ns%_DUguPb=aIk1}N0^W1kfH3n!W%mN7usLd zUO`7p?Kk`4yn*^vglP))@s2pZa6D>qPYvSn ze^!06Pxiu|kB=hdM2s%T*5Um4dIWmSUaGwxe+N5f51+`mvm-BwJ9_VGQj`F4{AFg> z!h~3*a@eWwsw5pBOYT|%yLr&?5dDrA{DELOSyY$eiwDG8*w@%D4tgT_`SoHZ0nh!WVRG(6JH%DBIHxza#ugUeb*aD1FP#_s&vuH`zM?g+o@`NHlQ3}~oB5e; zUS!8}>SblG(=u=UB=cVX(`nqn$VoS^Cv`bo_2oc6Hwb8q zlhK}_?J#K;A(Eu!AdFxvV>qY`^bv2_P>y!!#Ua&(v1R%p4EsZpX5H79VUzWkqsXzi zA!ugJ*5uWR&^aEAiFEPzAa!?2XdUMONY3rA0Ayo>#<&L_$s2v`&C|wX*razBWiUI< z?J}O0aZVcUy+%2a@2y0NedCeup3~>ae&;Lpft-34fBCzgChpbuv@y>Mn)(j$T}SFw zRG(k27`y5>Lan_T75k=@!=Bl57}rrSOZrIoVp&8kE|5`toDF)2elwY|_vUmto!r~7 zvZMNFk$oZA_Oy)QC(r=8-cz+`t$=3FY5d@(X~3B%wYpZ5w$hTQhg^{#)_n% z^3Odus3on96?keM|CO%uA@C|bIl}U-#kIG*)SXib&7ITDE>OJAy}8-=m0Pg4V37Bf z{%EP;W^uKICyqP3sTlwC# z((hv?V=nZh45Xadi_TxCDn}zRx{zY{7m_wTusWT*zUT7lES#;` zmNdS*Cu%_X^K$uyi1Fmjjn;&3on?|>x^(~b7h#i8JzxKWK9#}mYZ(611rtA>W(?uP z^TtdQ*>{mIMtPU*x+E&=_X@w7n`xXz-&g+q2bcD;L2&^1n^P59FRgLzWl4_Yz^9lB zCAXfDKhDlVovP>jAigpaijQSog?Ux7b7gB_S`!%sx+nb6zF=mn{+ZSGG#7od)+|p5 z&+_KTiu9Y{H!{9 zm+eFR##qM-?^W`fzOWo;N?ckml5vVDM7G1vYsA=rz#6es}A+Q!dx;uvq)tk!6 z`>G9z!cavAp;O_siP5KAME0;)jT9-myDHy_@$2LNZMi!2bZOp<|yyqdJCc< z93+Vy;XZ)@=anyMRoHqCk=cJelV@eT0}Ov%$od)CeKaKH`bp%bI5OD`yo%TDy=|Z2 zwSJaLkLIG;D*_kuo+kc6i~QDjT+>c;vDH-T$}6ASHk&Q76yZXb#IbJO@T)Jim0!*n zRYaYkTJ3yJS6KU^0dnzeICap#_I}?RcK{QMVQeMf>vl&NFxk_E?&LSq(%=WS=8vi3 z53SRkW&(N`)}RsG!rf^F6QzkZRu(ryDP0~_!u zf6S#Ij%@Cj@|A`!aj}NZhSRfUZP>P5HKT45HNtcyO@#3e--52AnA}40=f*vhHun`_ zU1qQ=nJL_tgnMJ{nWMCJwdWXJ`lXq-cy&OHm+3-v^l%f!L^aDR@Js#+GT+2;?h$(f zfA=xj&35Z?=DqTG1S=b7@tZqZcu_rWr z9g`$xa_m0f6SYja$e5|exYqKX{=z0fXK{K!;T@ZwPK9$G78|nPS6>*YwyYt3TnQav z70#JDTpq>XSYM3@+C;)IMbD>ut-x|Abua0-g2H;uk%YD4{;cPl#!tQ?+MNtm1|M$w ze+U#1MiRRB;n%;PfEEl=9iC#&jl~P*1J6|F0vx2{`G<_I^Rg^D#jZQ9vOcS>v&(h} z`aNvKl6VRN@+pq@p>PgtGxx~lRtxI=UK(`R=2ytlO<3DV%KP!*1W6r^E}^%FIIvYl zdLBgN`_I}9j*jAIYT6!SA8d)nkxi!~gMJN-sC;l^aOELm)?xkX&nu@_madG;HhLD9 z##v3bY8?%tr2XQarKG24SDnfjGutuA`4o9R-c08-NXC6hv3!UhdGK3gV{@77#-835 z#tA54#A++c25Fsc91uCF*OYigb4R0CBI=9NF_DJ4xrrzwl zkl!EoU(ej_D=_GhIjm~v5=Yn&6m00fg0VjFUB!|2*O`QZc=YV?+#zglv`>!8BxjS1 z^2!b9R&lA=Dk|A5HBv=sU}x=%By>HaUm)k*s;Ik0qPt!4=!>jVZ9+KA6_Kqk`r8)5 z)gPcF(@flB3ch)4FuSy=U2t~I%lzi$;aAg5OLJ*sOdHb5FW;9LKK5Dq07OajjbD6q zEd4SNx#`P&(xX1X{r!PQ7P*nps#@UaYRa+Rm2nmu%PP+v|8?BqF)^Avwi#IU&8qk5 zHs2$0)>(yjvcbt_F_>kM&C+msy|~h`g-03f3@@)mqfYH_GnO6LCJNTRHf>xz;|l%? z>~TgO^i`QD5c~z5vXzg^O*6f?#Yfv^8@{Z$U1=UvQz|&0r-_~|#^+o2>nq2J=#l+m zmj>KyY<xyHzEN{|Fcp{A;s@>Hl~zMKPU2Ww^P0@erd%e*l5-U^n##7z#+8Oc z?f|5kkq*XM9{&Cc+|9vS94k6mi7R23tuu962?6@_7k(Dk$5>{Pni|X>wA`q;bNqp- zjKleNsA)dbviZbMGDKAAS}pX~>g`YifxnzNhzW^o=AJYc97IZO|M7`KZ74V}_-MKG z3w^JAPKd+Kafw!GO|I(nAsX^c+x+~wfz#yGRI4Ikcs;5M4yYI@YZ6_F(0|&0B45w+vi)RZ6y}|K1M8j| z_fnGKcXA27kaOSKL_y03>@6v{xbwW=fj0vb?nLgTe(Xi&rRpbT?4zy7j=ad@ffEVADY7bTx0Hno+@p} zvv(q|hy}Hry}8p`QjO3d@ey9X%TX{tE`{5%kva@*2-vD1f4XnqN*Ju;bX@3ZTm=aO z#a#0|l3V>wqM0>cWMaSbF54Ace}-7ZqsW5y3}1#x!3a9w_ia*q%hF9&HZfafT$zOj zH49xga#BX8tbRAMDftI`H?7G7;c9X;KaA(DIa>xsj%WssNON&7zkBS4K3rv1AAVt2 zEjZ}|BE>fGqkexRUgWxEhR*n((Nfwu(%IJ)tg7~9ac^w+ULz5j7^(Kq-VyVKD7lax z%{RMj4E;e);I9rge8xI|!!g*wqDNdLyp{Xe=?vp!u8t~@rgd9CwlF^RoS z`*E#w>c>{kW=j!l&fL#365{P}>7MB%G~Mmfoyo{8*kwKve`G!7oY8~go69OZ+^qc{ zoyAFSTVirv_MF{*?C=e~M@yewYh(Q+2!&3m%J~gH@gdZ4f?88~!7+eMO6v@d?znpD zznP(>$X;T;+q;=_QjKTvC_bJk2T0}^(*~A>ZMW~Vk1u|F%=W(OhfJ{1cWs89k2uq# zWWAv`Gj_qjS+^PabBMp3kWw95cJ{s)H7L|xP)W-p_H?*gZLnxELPJJ#KLDfkDt94fL;#~kE z-1H(@X1(*zO;m9rG55(42~a(uiLX?`%VdP#k``+qg23@!YbG8dDMgliWQSFpEdE5P zamk1j^vKFBbM*m@()IDx?deH>CBO6iV2+gKf(7w5fa7hFCeG#bfMyy0HY1aeT$f8l z)dM*)c*R49B}_p@^DAt`k{S=qX+~PtaOQ!3{ShVHxm6MN{0v9JIqPD0BD-&yHS>$_w(+ z0r_^)%zgdSYf2gO6c>?AFnNNA!##J9ecYAMD>t|@Qgu9(=3($AQAc`MZf+?wQtjAS zbqe71_+bmc{gXGL&9u6n?EkYnkZX|S>dJS1;% zdp}cCqqruGNIDoSQTqUj^HTPitGn9sOeJYtdWnqO#b`&QkQ0t98E2zpF|4}?-BPohvB!aT# zx(4J?Z=IaR?TQfp6tjA!cVw0sw`DZNZl9_3HEgSz3z1l9XMt3fSj7Cd@ znjb#nWklAJx=Cmtb3c+u`n63A^E-+7IZH)sN(jSin9w1(K0pGhs$!ytCVL5 zN6{+**wK*hcF2~!6osYN=q2n!ugZi2m;H;K0MPy;dH3m)ilG2~ho9ugP?Dj5U40Kt z4{f-2?c0gdEK|3Qtiarlh~vel3LU0%IZ-xjiU-^dPwM?ae90|A*N1A1o_7}M8*L+W zm<;8SLqe_HbfoMyA92H~atd_N$*S8c-fq)`cZj2#JNIGHF0l$6Bd?APU0;5n z5=_3Hij(>}aD`J@i$A?ms{py)&AG!tmoy?ry~~-Ac9H(0ID5_j@lD}xg@0g;fJwf? zH@vaEBQqcaZcnM{lG2(Tq(kp=F1+ZCdLY8cAGtpne)k8qh;ar{o45Bu(+4S8fZ!tw z#`Xc~HTUP`HS7hZS~I77+L`|fK}^(G0VHw-yhT#~W*hc+J5yFn99T!B3{i&!7Uqmf zG_Se7dUR{#CC=uFFHPj`5Z1ljQ7Jy3NUFDS4HRbVeMdV8+RWtY(-=ub{_utFyQof|7;Llmi&vGoE{xGTYngV};E(fUlZ?j? zijgPoWa=;A_LQ<>nRkvRkKvr<-p34FU=G}TfEtz`)YlL)Z}^ZzIj^^~q}sB9nn&L@ zcgNic5fLI>O~fkyk+q{iu3A;f!G+ zO-IHt^Zk>S#8WYmBImgj@{q^3S}m}RChax%E5;ndhgZi@vzIO6(rCrrqN7y;UvBL% zh&J~BG+bz*p_JNH+V-Mj#!^oNOdM`eq=y^E^ZMl0m(9pYzI6XeC=g8-#M8ciKe(1x ziu5~_q0JCpc0>Jb@)1U?s}`jtlAU$wgZ339 zl^RcX;%(#Zi@8vvS#G?A;c9YG+sb4qGtr;>68kMKLBdl53Y{zIL@%e()l>diPX*u{ z$u$qPOV%yPvJJC0wuFa34x`?Xt0}}=*;U9?vc7p$S@TsBd0AKDoB2*-zI*(9?cgLE zQ$0CMkof9I;}rzs;oup!sn%@Kr)Sz*?WsW!xrJfB%hqVPfht{jXz|u-OzH+pb(E^c!4NU2*+&H!qVOObW>_72jdF=0IeAy} zMkFHu01Jznky0|`mv!nzimy#9tNDk+oL>b7I%azS>TY7qsX^w`xpO^L*KM5HB|eHg z-MRE%wF<40m~qE@^3Y=B4;7RN7&d4oCD+*d9y#I%hl{EV zdizDF03cd)8>PDkPEQ6DH(DMk+pvc@17-j+3aOE7&;8dKmbW#occ>k&opzHMTpK;0 z5GpjqnEa$BS@t33W4Bp+@M%kE?x&M6yE!ew#i5`>_k`V_VWCN;mnVLpe0d$r%F~Su zyOdfZ9M8i{RcLD_%{NwXVktTS0HK~9%<eCg!b+4zi{m4~@n7QmnwF?*t>~Pvq z|BPlO0Lq$D9R8XrAwMuJpCoilnid4%rjCnWr)wUAUFKZFmLvJo=p&ud1^9SQuZe@3 z`=f8~43?NMb!f77&+;tX*&ju_2*}4hxVn$N%a*~um3*=%B(!wQ^h0v4k%*?Ck0POj$j=I#v!4F&3Jtq&*{oY~rqRCP3w{)8BbUPHi_1xD- zwIoU7ddfsxGTUgqIcu|svA7>!v9GdC7@l6roWrO>)l1Arb{a42v^7dT?8S#E{scz$ z)*xgWxqKompTm}Xn@YxMVwwG6U)ZdA!?p=1g!ZnvO`_VkKQJ|;_NxKfCFac_R;J^tkU z>~9)Xv(GbXRg5e#!XxchnK~A!Qd<%hz(0CelajlioElK&K(^md+%j!VfBfb6iGZ-9 zC`LQ3ZIH)d8h51Smjx~JAvZj9ok`NMQ=jH$SEsZRPc_SR+!lrO+m95h#$4zPU+_^N zVWy25Q5<4%sf%=j_N2rM3RdrCkZ-M?qHo9XH;}kS8b40enq~}5n3*av6GwN9Y6aEj zKU{gs11h3@9=iIb&SkSCy)l#A>q&=@!7Azp7XzM!l4;-BvOL1wDiG%fnud%7_lK>; zZ5sGlB(D^oOqnMSo2{69j6K{vZa%p2q2;nb|H1Ds|sky=tBL6j2!0B6xczQnZ5e3{P#RfFA;ZQraAn zUK4<3vP+_*C2fy5t@xZ`U#ZTa;kC^lz~t=u#Mgf7x+mvZe_G(;x+S2x#%ctw%V}Mm z*d9EfyYuNc3nQXI!hU;QVUeHN(cZsGEDr=GrUsH&8vNBeg1=s+L;Q4i-ln+k0=oIh zLk!;{Rb-_7^!<2&nxa4uAeZt@Xq5uZe_V1j^}1d3EoIW5p7v+-_@vy@oWajqq(icw zvL2?y5l`)qM`r4%H$YL09j72Mwa;7ca`^d7w~Gs+`4!9XLTS21`vE-C7SS8gQ^}*IixjslK&d4++}&wTs=TC=bjpDXcPR zBJ%7QUA|5$%x;g)4J|C3G)$oXXT(y)ZNdO(V$>K@+BEbys$QXoY#Q zdFoaM7}_8!n;d>K_5xJw^5zEf{8s}ltk7bG z8x!m9)C^*5s?TpBH_q4X^i+#d5h}R2q<*`)lQNr`Rq^hwdnuw75Vw2bblbk1(jUtY zplX}fne?NW!I|zN<<}5V^A#N9AQA+Jmu@5l7pbbDFVS4to2>dmn`R$~7xU-!Yq?%O zLH2+D@{8$$phf|wGyidsYYY541Npt{xwBfJH$h=&%U7Hm{JydJNE7izN(lQ<)%B-) z&eTU{11@Sa3zJnqi_2OTdBsO}Myx-u1g`nLgs}H3N2(uu+8x+AR)w0XF7vI!BJ`F; z%T}46`}MLH-As2yY5_OSq8FXcp^l!$wrOrDiL>keIO`J{DU(_YpU9U$f7y|eu)o-;2}{h61Ks&Z8{LJ`fmfk$GTl}y_~ z)dHzki6Fi5Z+J`BNbwa0I?y#q zU?nToQ_Fz|H>g1VY`T>8`u(Eg;v7fi$w8yFR&RplSI9*5D*-%fHkG-&t~MGk`#CD0 zVCHtud3HE9p>rXn41^mG(&lbi*d3@Bg3W&*T6oZxvL^$=*T!u{7O&LNdrkGo)>9Ts z5S8vgPPlS`nU(qg(TS*{e&3WmI`X{p=k2ECQqZ;{%gev&18>xwAZWA<7(0a-u5?-{ z3@M0!v=o4ag4TWB#uLl`>M;tTVA&VQztHQi;$Utcqw`*QmG612Bw_p$y&Vn7OJk#Q zJIb-5`|v z7yR2ARSv|FTd88Nkb(GFF8dK1UG*T_uG=eQU_BZ42LZd$z2DvZwgF;$#DSd1aBDgZ z)z^W@B%v1yHoAcN3pvJCM>8<%s^lxdS1n`|RuS;XV|(QH_upV1Qhm8B@r(dsTgr8p zZS|amKr}UYmu;T$i1{2W(WKkI-r_2H$A`c)-et>vl&rb}&%_%n<`&gZ`jbdT9}Am4 zW#Jf+U{i}6DYifn$sEt^RRiIKlGI>;)*Br&>S1L1QOx^X$ZbKnvbJrLiK zTmm@?O+-;-s}=`;dm53J$b_l7UAC8*Hq)FZ7Tr$ZN!Quoc73TTZKCl(%FFXm@o|W( zFlJLxyjezRgMxH%tjLsprBo{WfDI(i=&-B08UW|$qa9W7MB74ZYBzp-Nfg9O%wxez zY_sGsT5|J&P{Tt|o+$N%wE5Pf)rPi`+$z@1`n?s6ZmXfp&ZO9$-iarKZGO zLMpI|@J3%C6NVv|>~DMam^1Ix=8$B-Qc?L&~YyYDP_p(#LwRu4sX(sMJ7)JX>!=}*+c&cZs6IJpmK!a1gZisL$i zXkLB*{z{Uk;Sv0TidQvRmb=SVR=juc1-%shBWWN;YI}R?n>}*sav}t#B>zhF)B8{v zyNOB!Bw_lG9|hFiVoUCcv!T=T!>cnF%&_+%_jf%mWS2WwDx>N2_aHg$gs zEW*SP;(Keue0H8d)Ew}ShnMBe5x-?yHLWL&fjeBN_b8fycw3XN!z!l6GSwtVpA@xY zl7KaXwhg+B0n*OKNzh+0$`Q>OG1eCQm$$tTj1`Ei-?@U@pE~B(j1583GIAY|vlsf4 zf$%Cz`nZbiU5N^r_#TN`jP5cws+Vr4l=7W0)`b6He6`Vso2Y7S1TA1>hBHQ56T}Xw zNP=q#GNZgYM(NBCNzgHcj#-a(%)dxJQdr^iCD}=J#aY9KA zrQ80(2dJrtY9tizlk^5!y=?5qF#a?*QhOb_#xDfj#dJ;*Mf0j;GVsv`mSlcYOWf+6 zCRQPc9mIR$TUuC?6xnK_RQ`Y}Cw@LU&{S_1+mK(M<)j8+FEmrH6<@t?ZyUh7_lcu-N~m!tBd7deZ%yZBtYYFT$#Z4?RL?KWzCMcf4swqLqN9egWUO+VsHIpIFTl>= z0}*DeWf_krRr_oO^M5a?HHjlKi@l?q$lMJll@&y2`@jpdIv{BIol4>GDX2C)wqzD^ zG)jSc7@g@3-U?G*vBeFmmHBIQi*?o^E~oWrBxn6_@0P$b)vC&UfmdfMLc}w}<>n!}Y zvKVz81ZAo32pVBE_CBtgAucBg>kKH^(hTFaqwI1LWUoeSp#i){x;pXbOjnJnqOZ&=eOim1R$wpBhZAH4|^gk3)S4?_Q zZ{<9A9%P>`t`cZ}?L?z^GvJMxhv0!2?#-|oRoqNzeK8wkH@|#XY$q8QYtBic?&)Qq z3bAKF<3q{odKvH^R+iBy+GESS#r^p#x+!bS^BqSC6ld9rA!R&}sS?kc5c->Kif8=A z%uSOCL=k+9iSDK!h;$d|C(a;3Cf6}mq+__*;+UU$JCIyP7trkS%Z^h(2hk&Mdn*sb zsLm9XcP~FO*+?5GYSr4j-2n~rhGBl>yhFrAX+mhaU1iSZKq zEtmUS|IO?L;kkB?h`|u%o8hKU3b+6NGup>#O^rRVYQ^bvEu5;ibC1r1zWdBq ztCQv)6xw!$!~ONpK#?%bLkMekuiKwtq{Z6rovl_*H1-JFCIi--6U`&kIqDoXb#Rycf@L(ug>o*n#Fh99>Vfl7r6ADMXa^TZr+>TY=kuH>_@h&CM7;bVnFP)<6)e>rcEaQm?=<;gvDHuwUx z#a%CNGM>e8%);(SY8rC#yMHeyGvDOcc*mrt2XYkG-sSh@k*`8tfW*b%f{bi)dt{ z1Ki^8hun3={{ao zL`qJezedoF`mTA#<()sDhuy>VTw(V3>C3gyz7swssT+iP%w<6L{hJAjnBQ=RC#bW5 zfZ9V%mXq1vCjS~4v#UBEd%(R`?1#SaZht@yXJK7Gz>=ny)DsbeZKyt5K_h{Id>e12 zUBT#l*Xdg$A=f%;%i%Nbzm(_C#Le{-7o*u?naex(h;&koR)DPmu*tTLGTX`XcN?55|D5 z1E7YF^&AaLRG6B}{;G1op_tD>y>dhbB+2k+C8EGun$ffyRan%q3H*~V#Ns1ve;A37 zEAGQ4h(kYehb}tf{GW4mFA}I5NOC5-Chd*KXbL##KA?=!-}HggxOF zP_P=X<^FbM|1bDfiW0ivioi9`0Wd@PFH}n~p6$U3;VLTJgu;Mm@aj+ACm|g2U>;e( zhS6J@XX4fn+YxHZ>qv3_2ed%^#Mn~m*q9llrw1A!yU*S9uOuMWb;RM9gh$D}%p>ev zFV&(DtT@Xt6PmjGBaGu_Ig)8E)PZh+f#h2EE)7m#pVz!2_QC~AQ!H)4B>41Tb8A%& z7KcuxX8&m94tG3AN8v%I?Nc#~J7TSXZ#H-X%GS5;^Gt*HY|+gJC%nal0&+B)hLghK z|A1qr$HJL?cq(-sK?2T|AVYO4xLW2REMbdSeS^Au2l{6(b2If}^zX?0qRQNAgh0`R zD2`~VoE$tzL zmH+M5Q@ZK8n)ds;d#D<_uTUXS^LtG=lWB&iElNFdH6I)`X6fA1=~4#S1o2x!H<5Oq zwIGF?J|pIrL6?twaobLf^7rR7!GGg)rxVEMlytI=7u#)e`#FZla6;u*2+X^=3A0^H zAx);&FjjZqKKT#YGGIw10&>;nCM5#Y>-wd@x&}tUcH&jgs&|FGk73b;A z7oe@D$xov~=3S4Jlgso(N?%h}Dm~vytfm{^_pp$b!xQs5G;~5Z6Z8~YcLGATrxEGm z@SL#L44eZaWv3LHh02cBE7eOgOdEzEzLj?9r8^erKsBYndi?QcXlVs)T2!~#S!@`G zMxTngtCLTfxlVk|s~~9G5)C4dL4>7&NeVl?Uv-<~b*2L@AsS~1?DKzwqSxa<$9uPx z&||hLhkUf0fFT$BV&l1jU)s8>hT|kq{A%KZi-@ngP4LvP%PdKYgU+Ij3=D!n6@VjT z;taN-y?19w>$yZ+_yJ#HSG|l=A#Khx9 zRN5qq%V%@Yb#HPHG}#R+@R$t=m0pBa(|`zKYY7|hVgGN_mGDIxJA8EV_+CJ5koz;) z)weh`dF&cj>MdwB$QRu9+^Xmq)ZV~v0Hgy@BG?&CA6ENY4^exfb1l)OQ*{i@!+_4z z`H3)Xj_GBME9^mzhd6>w>B+4{@wUPl^^}DRh<411hf4~o+>w9QpKf44R-nC-ZhHb% z;HPyS)^DPHdD>pLf);IYh~MawT0uk2xM!d_p#+h6i0lisslCA_0V`6x)t?*SV4OE- z%g)?qgic+K`9sO+#T)6eY|RfFp_{)H-j@gCe$@mKdsJReE^StZZyF*Q(sz+o>z`0m zXDo7py~WkrKg|Gv%!TyXpO` z)>GiriR`ikW=)o^z*BJd&%acB)FH-YcXAWc6GX}0@)MXZBM2`*LeAyV1LSHgh2DTp zzUGSE8>n`F`}X2%pp;+cyj(&b)(qusz_XaQSvF7+;5og9th+ZDot@WM(JD{*>3`-C zrjkFIGijYGRH8sxXcEHI^c}EB%j;SWS5&60ijgD*aA+AXx`4WNz}eh@bx={q=Ba#z z971Rhl9%_sK7V>^9KqBE_^Y4aGC7@h*-X=4(M{T6UTRqhsS59DjU=4~rM6j3i8Pr9 z&m(yN+IofDPQGwj6F+9O{gGR?ipd1jBBT{Nz1?PT5hDiTC_lodBSZNo2Jz(LaB%5z zyT37INozM5jiuMOsvO|!hV1XvfNYc~YtSb^2O3ZPHX1WWApQXvAHiwb0OK^a2v5%-Ksz`-;^(R`r!}UIRDrN2*}`XB;!$( zj9BLy`?rVx_J~%)7Z~JW(q2ygr*v!Z`-)F`;0#NUBpz5{n+qHQmbX@`BtK7JF#z1+ z!a-Tb>B$48Jll`$!V%+O-36(wU|IfKOJ{)jX~P~^#&m9f6?V5m;baHGQ4|B#c9N0O^k61N0I$S$#fX%t<&AJ9cR?0 z){bZ8NKl#b-0v+BWJ)EAh=KOW{XOk7UBz7QWXDehH z0@<+|vRn}JX#btq|KJwviPG!uF}m=EJu=<4uY?u1$&j(zI`uf8^=BGEKP_#pOuIJi zfV=?iY-uBa1I2OIe6a#T0hs^yNO9=p3>3#|gV1%mY{)4>TfPG+!SpBxrU9rXm5B}{ ztC;sk#RWK0&HUMtnWybhG1ymd5P|fq5e!;2bzpJ;DYnWoW?mp|`t$+p_v<~h?TOZH zlm(xUu`mZ=aoIX%rz-O!_ZS1Q89`?~lTXNqMnmkInPWG$z7a7J5iO=JD?v z1Ct=s3*Po+md7TJ6PPh}785a}^E5wmRhuks^b2i@Ma+4fqt*S8W%?}gJHT7aCctF= zs)uSM?9o7aO%DT~tk@AaN(_rCVN+=??0iI1B95F@9#*TeWAD4L%f|8)Iwe5;O5k~c zmNEZd@Tn`9JUP7~q#}6=stO0B1@UxY){m+)Cs|E?cHzA&1k%c+#G9k8yg`|lMeu29yUjHiTesXg`!~ia~hPx2fQ`TK2&?xwc zyx|T!_bxKuj~Vzs!nDalrZ%~3YRLgd)dS6Ll1T3Hfgrv0_E!BAl;Q(OkSF7@Ms)+L zc)A^YL?R2%D?7W(W-vVpPQ?zi6b%{dAbYEmofD}Q0Z7sb0OCq&t_)rPI>{%NAxqP5 z(5^WT$H(vh3Zt)n__Km{0k~ z`y&xlZT#{*1;R=7X0lY~N(PD|S~Z~cdzURL>YpRVw2f&)&R0UfJp*&E0w|1NY~e>A zOKRd^c%zV{e{O(G49tei=<_GaeohonVy&r$A(x7YxPJkddLW5~4`afRLD(n#8SW8d z7QLJ@`AqH?$fL!E-s8(kvG|+(z~wX-!jqjJzg6o^(+XJ^ytcth@fvR-xHQd5WG=a7 zsA=7$8>Bxo(xin=`+7C|EYKIRS3us+uGYny^6iKecc-(xlVq|%C+aN`HP^lW%$mp*DX82{s|Q`Kf^SDcu>BLoV*^krnglF z!4g^0HSv?4u1MoiU~@9)6SDT`-(P0l!43^Vernfgj_%sl33~@#A{ghA9B@K{Hz_wk z9I5g(&=59Y2qr%9SY*_BdIw0bTv_zw@gb%z%Yh}OZPQANpaU=ez6Z}a^8qhZC4^eP zQtC}NyUzMA`-Qo;9ZA2cDcKB|gC_vYb;TO;Z;Sbju1jgcBY0RMRz-DMZ$J_H=fM-x zGrpDflAhmtEIY^4brto{(e(5;u0l2;%TIrWjjOvC(?Q=MH2q&B-9Y`PQoU!Ngg5n{M z{f!WLwO^pWNcnb+EU$IbnIL(H{9pBhrs>?;fE(BN4EOpOHHf z0iPW#8ly>0tERP=;FJGDjvB(RFwvEHB)gx;=S98zXD)?aqqHL}KdsW_d@R|Slb_XG z`@LVdr1Sj6yncXk>+M0#rIfp`GSxj~mc3fVIvKBjL0@tcb6m8QvC@fo50&gn!3|$2 z?i>T80i5t5yFTuIGo?66F>g2Bx5e|0C(D+6qFKaX+{X6M}vTLcT317A|V1J zMRFkBAt@={qg&~2Mr~~S{I1{MKfLy0clSQ`-sjZ&yw5qQ`_8K;eCqKiD%RfY$(ey|u(>p;wxVJVVhWFb?m?e8bHT+{IY*zqDYEi}$b|_ElsQ{L2qb z_?e#gTDwtZv7ppc+SZjt!$ZpPJI4(l0#|Jqcgas~!M~TB;N(x_&L#ncNQ}U7JvO~u zha)gl2NvT_M-aIGF}F^mn*eFt7sBC>kFd(fENL>o0cM_qP0<}d>~A3m}0sD)@o;Q7O*HPX;Y~3k>3btF-aP6x{B~Bf?n~Vhb+cn$ClVLCq%%ZJ(DOt>3gt zv0@G#g>Q3lvl6Hay6o7RFZP3!q7ekiuoji;RkGa1({rUZ63~?aKe$WX+m0d1ZkH82 zjwtEpc}7^)n?Xa4BzG^D!7)f4;rW8=YDHvLOqIESsep}UGFr8rdimCKdfq9> z#RY{{S@%)bm_fdpPy?xQyAec`Ew}(|C&ldTKg1c*WV~>tvJoD)N@w^VQ56#!zRmrP zl$mkDrc<_}@N78g8t5P}{6P=?VP9jG2Xb9kiC9k>QTFnQ*X9Tx2SWL))V$!5F>qt} zbP-$}M>+b|C8r9pH65=hCG^%BZyoIvIV~J5y7By1yw1eNcy*}O1i#s)C zt_nEMp&R~Tb`gBCsCCZur;W_0OXpu=XWKY*^vKw04*DvvthNwbHa|sv{5r1i{;0#R zU{tPtA6Rw5RMqzADYHFZsr*Q_7N};-EV=3f^rkIM`f+VC^mj6&8ZEBb%%5kgqp?!G zF3vk>KG2%rRqI&~zJJ~TJ*+VfIZFkUe8Nmgcb=ci#AO;ezF8C??k0UL+A)0+tsI&N za!R2jpx$!%)NSDC%}m09Tm;$>N4aXh#M=2@Cy>s{1FKQ%)67)P*F~UifL^*N6AV6; zIC9@(!>9U_=g+18!x;xq@FED3YjZj1IsBw-n)#;@2jALIbQr^TWp;aP0P46XXP9eBE2 zR2)^XEFAT3UHf*&lKjkWwGZGs`RTM6r70wD*jlh>vdE){d$xnPXpiWktB-b%7J+Wn zwXk6r0y+U9syZ(14bHy3pgKk1H5GxAn|<0Ih@wW1-({27=hTf zES?d+h|t9__~s)BGv7MTWKE#+%`&}6FaeJ|F1zbHO^54QJGD?>wrxdif{Y3PznJ## zSC>`Q*)*Tps4XVRAu>-B zm5%1dtY&a0m>{JoT()!I4hMV{2I(B$bsT9GH9P}Gp4DfxCoouw`3x99!{>@%EM4i2 z>v}Etmv1ttn|TE{YVc^FhIRe#?RiuE3RdmW>xFkfYUZDh}d5L+U?$Ux;@X^I(CbRD*(4X#m0MDR2ZgR#W&oT2J zF!)q;{1twr@hAAB3Wn-h04@1H%1!;1rchJs1sc9|pFmS;uZl5SwBZ3I10_fk7FZSSv zfce^>D5BdP)_R>Eo_{ogD9yrVKt}iOeZyS0jl}j75g69tHM-}hRY%#vE^_cld{;JJ zC3_;p{477kLMj{>Uy(u>LsS+-%TFMBQoF(@H)9YZ;S+!-vp2RSyN89J@1=={Uz^3{ z!|k(o)p>#QCyu16y2Z3z0lVE4@p=hRi2wW8h^SYX@Oj#-X3dwgClyxdi55q^2Fx2R zK>`T5bJ6AmK!Y!_$f1&X$c9ygE60T#X{ptXvXNJC- zXq|GykC`Md@Gp+ze**lSy_Zm;k)H>AaBpq;EU8e>uw&-W+CddNkZHppMabLD&TTOC zBp021fd}_Ag6sLtaG~rAh(cVbNTf}W9B{zzUEqMMLGnUC7Nb3pu5{P!1nM8x%wY-L z0;Xhk(9LdjwB^~bmn9|$Y!qwC>kcP@?x{)V0sxXY7gU^Ar9-4L2896t?IP(vv~6p^ zilhs#naI-~+oQ8k&l)G-^tspGc6lHpi*xqbZQQlT9#-4`0tiNvyxLr#D$>))b;NNI zb~5yTU+=+B!Pv7*Z>F|5;4y6yW;w>Xeuvs8X?ULyw}!}lxuwn&_LQnRc0cgrgK+4 zLpGBcIgJp1HH#beT-}lqgg#1GI;U=}XTgSun~6z5HXS4<4-g}bE4(?{m|K8 zVY-Cser!d`sGHdl42chLh=a)g+pFZm?B(D)zWZ2YPcra^^`5-YBLJ~2IGR1PH3v6&h<$?#&cZ!q%geu@4p|8Dz;=oo0=#Avs?y!d@%PDqjkW(s2>bU541y5XF3Hi z)YL`&1-|5+i#X6Pcu{MOmMLY6y%56nPo!4!*hukXCO?gZ{{JCuEj$s*K>&t+W~dz|;43puKm zPyu5+mXe-Y?83R`PGgzZ2se>C&cv&9D z*=FIL=tvF`Bpg&mhQ%!?s4?Z5Lg?3M|BPkFEWz9vMRi5di`b zXlT?pUv(%Q`Y~^0aNT#?zaSY%zu^i`UExi*l5vf%^gUWu*i`6##Ewd_AAv)Hkd1(2Uw-#Eai@!-FvkmQK`qf{-bOVpNWHglZ$ zVi9T+o>dg~#cs)N`8IguYj)vqd3X}W6WC4Z&%721NxNlv4#i?-UFG01AqOK{!9lmH@Lk?rP^XVN6xO_jHB zo+UOuA;EE;rT`VVtH8WuhkLKUUuhQazZO~>U?<#gl+Dlg+KAiN1Qa!6sp-5y)o*`M z0`EYg{GoclqaCiL({|V`ATn3RM|6Ft3_jNe7v))EHb&7EtbiQ}WtL^MKwz*2epty} z{|MqUx`OLFl{S6?4InetE~3`B5pbSxjXg@CcOvyevLJTo zSI*~Ca`UC{01V+ahZiKk?;PnUFu5<~v8AfS5W7uawf1|@i{>vxd4CS#SaAg1piKB7 z0f~1!NQS)fvq9yX_O9LrNU4R-=0D3(^={p2-|>42?g0TFzLdP9WA%)??4_w zke3mK3!Mq)nv`SVS7UvV7w6!_<dc@CS6$DnoKa{xMI)PcJx9^rLM~-3RZ)m16I$k@XM!z zP(#Ohc+*?e<>4L(P);*>uiY~tgb>xZET463`cWM1wb0QskY3qQWw{>-NQP4}Gdz>B zj>Ch}@ox`#-0kg~>~qQ0k=t!Q6RP3J>)jN5ddju|V43z(UxFQ8Z4%Wp#V7Cg68w<^ zzl0~qZ9x&hSDM}!;$_4j=$hw+k=Npu^a#8Wadn?PZl4@S4k+Ds0`qadZOqEa&q{7P zhakkjM_J%J?i*fq&oA5q)(C*hv8U6VbOBgu?)oS?!a9J@v|16G6&V ziz`ieL>iw5b0AC?`Rf8#Vv$zG{!apQc{a{1u&L(phc@5B=R?>`Lr!Tvq``Kp6zl2l?(R5q@`{MX6Vh=C{ofCF@KaXImIHSg+VC|mDe0B8po5qo3ak%qp5 zX&(txfHzYlQlSR>RJbp73}<*(McJG~01BG+v^V7q9WHE^UO)YhXqS3P9DI6Hhnu_r zd<6WUi5fo&7B}gG>nEoKjv#QskojjILbmQ3=}vT3amWZ9wW69S)q4*79#x|V#>)kB zF|VDPofKOQUV?R$+Am1Z1t{hXyncbL*%Dx{TNR$hA^^>)Z?Px^7Pnm?!13OVYm0E* zqPbL4cM^bJx%4anWu^xl3Axg@um=A|_9S?EFCcmlPLEpibcUv>IRBjna;4MU-Qx*< zN}x%I!?B`s|FB=`5}xHveVo2g|7JLPr{^skdYt18|4V*a8ryZQhugv25xWa$W2sVE zbH@wYxOiT(4K=joC7xSC?79JW^TnoV8Db#0KDgi_$OWTL`5L4HNuixV7c*NDqxrzm zycurzbKEf4jbc4Wu7&W}RG@oSWKSKv%9Mr{)86df~fMU63Y zA^8M#t4+}vD9OE3Uw&F1lNz;K2p#0lS&+|p)G>W<#k6TIMY#>`_*66lChLuSP9Qtbe*8{N1Di8?L5&-6JE<=>x|7 zQ|}#^q?%dzkbFbq*`n8GA+7|dv*>*!hF$$GOhn0x=z>S{+BYTb7vKu4dlv6~F#v!* zVOpds<*R?&us`jp|GEoCpL38?#eSS$+!Y>{b}D}Il01iU0>`Nq=gWOQ(gc(mEw#%(BNHJ%A^CSt}_5cUD zn)t8|?tKV+n33TA3nA2vEA;v*(kRq26)?a37o_l(vS6b|x)!-kzVE!*^}|nj{5b#a zO|l25h1_ckCMDcW_6T`w0>t4WqE`UMs|?{R}yn=E(L5GS?_}M1OhBE(6hCO zwMyi1XK}@j>ed2i1@yffd~kQh1C$|h@CCn#E4C2KzOf5! z|JkK7FZcolcq1FPv-Xw;2SJ0^pnEs4rPoZfb0^aRaE9m{t!cn|wT4KHjfdc??qt$<-xQgo!8CL~CwRpHn|6hof#>@2& zKiUj@*kDi2{Zir1R=77X>aq7M;156p)*%CD++<$**a4lSUk*hfeJow#i0l*sXt|DH`E(mcAA&bkyW*gnirjrlu1%USm z!jaDt&kJZRCK+mV&GZ$kGBt+as5Qv^EM-awhdKhCs>7P;fuSVS@;ZX_->JLRKH{T* zqsEgD=;(i!!Ug1KM6na9qB{vt;HuTT&OrcHf+&+X2)Ula>c2V-*g7dV!~rp{K6^OA z%J?8EFz#Ha%@HFVaFXNMxE4zy@~sqWi^^5m4BTv~co{lys_>BmkTsEKV> z7yh+xy&2YIvprXuFA8+U%_T<2!NS6IohX@x&Fb3V8#2vO3umS6f-?ykw*r4PG86TXFPq+a_<;~p_U!~ z#O`#}Zc$AV)txh}pmp zb(8+nvM~Qri3AOF3tZD-#cK(ip%iC*3@v4eeiWS|g_GTd@Hquj+Nr$;7^{=P;#cN$EgMs+k zsP^%+^tsJTODPJ+DNgBp?XHP;_bh~>#I!J)M$khd)L`(kEa*DrM=2uJ)Kb7z=1DE&h4?cQ#qnC1YGSgJ_CUhEEjRr>Tu-+!c>>zr| zxCU}w&X$op+S=@0QDKduOe59N9ojI(-wE;Z-b|0o!jGz}(GV|l6w%9Ew^L^4|By$% z;eXo}3fa*4lH})u8ZSxy>=BbWN2q0J=1ISkdoY=Nw`BGgidI`Gi%*J@Mz!G6Wrva^OJ|8-s57p(?xhDe5HyNeo1Qf(?3uHQY|c*iq8nQS+g zj-3*76JSYJsDWiBq+9`3-!5}F%$Mi%q7}o3N7LV5^tV6tAOva+gq5go8#&}&mo6hM0D6N1(JKS?2F9s3 zzxeq@$3Qb|QUiLG+IMYybN&|nMK1dL zN4*$GJ+K3VyVGF0d8fJwSB%;SVdLkK2pIrC>!VtH7(Kk#-+P{Wt=6@w=p0}tv_G(= zKRd+(Xy`UzHWZLNF%#H*{b!R1{)Zf#XPq*U)pt>3wBvU_1fhl8ljTyI7IdT#Gw8ki z6r5W5)3m2aX(@A&a>uY^Pg3Y>{b*s)-17~q` zs~XUCZSMsFv4St-8u231&A?WxZiuB6B&F;GB|#-@2R^@kV>Z{mJR}z~n@PET(^y@a zAIHCjCe$qUG(4h;Sq#vN-{!O8TE-KDlDMm<=uE=*$9gX_S=!{l+MKQG6%vN9Hz62e zgCUsxt=n4-o4LlfE_oN(d@W{9yM=j#U-$*?TYb;|QvKfgKO*nye@!e2Hcb!dAK5J; z3AHZy$VW(iYLLl8?XPUMOQTchoD7TH8nxk=IW`ar9X2)HA>Gv!yle=}v%AagoFoG) z5YDDaYzDmy!=C7P*^jqw3i*yEajc0RJ`oCsQYfi+o&Zm8M*V^_#hnIHuFfyCNl#CQ zvgG7^5_tE}tHjc3I9G;=}&3FC7=rZ!csr2z0BAx#dxWsCKu`hRv`>g|la)IZX+^y9S1TiLF zGGQNFCc3l9|G6EsH31rF;wL?t^U^N+zP&}hgXi?(yWndLzll#Th5J2`Y9NKPY6I;^ zDMFQTGUd40!=5239fkZV$wTs)7vWD!g6ZWa}RmOG`Vm!IV z2Cqn&z47qMRjRo_dNt{TAce*`!Lr5bT5N{&DOi(JBYj9fhj}Z~WPi@wL27K{%gPiZ zaquC4>PN5aSxhos!_S8U{3bdXEq)%1r_UQb3}=MF2a*MOcZDt_OZ{vgZ)n!9bH@7_ z%_ZLi>co({+>>DmH;xO{`Dr?F?ox~LhZW3)4b#E;;0X^=MwO<D(@+iE)W z9^zPdk3{v0R}Zv}hIpdVo%Nn$kl|8g%2feYcWh2}wQ~ zBIewH5Nt>D}X=edfQW5ihaZp6Oy!QQf{xx01r(Qn&P$?N1fasrxTRdJCHM)Ed7<3xd&^rlY95f z;U!k*MHd-!n!h`9;eygqT(qD)1pbT*x?t{)OTf^f(f57 zaqK?y`pu;E8^v2X2u;VN2!|Bs86H9@KTg5GCz)VWg2<-Hewjx6uuD1%NWqmnd&_3q zPks#G-SH5~qn}o$98fd9AP)k~<W6^;eXcJ#v6dc; z)uR`t0zFAP7Asv`trxda@f>5#>7a!Mk;bxxDkrE};b zf7`ffR=`NP-&`7i%=h#ZV}_x$bkg71fq|JX3TZ!qxpJ|o%%LT>EgjCpca}@eAgsKRT0_aO8{gG?JBMF=BFW7OBNS>hZ z3Gj*uLm%TxFwP-9Vg~UN)Kl%(&%{3%w+MRBfoJ;%Fk}Rf?uFsGL&+YF@b4=X(NBdB zK9F7>$L{|MzpxHq%06La!?%N%Avj0D3c1cFu`qf=O>A_*zh-{KFBg0Q-JR*;|^Mgaa>^0dWr9_X9?Y^jUK-{E;b})PVQ`dQvUb; za=PTR&CnPFGBZg#w9pdY84n^4GM%?LvHQhaVy(RA4>imixxkiw6ZhTVh7EVWBup2; zKBz9OSr>@L{R$QfSIS0@z_n~x7|Wzvv9uTu7H+iCI)8GELKd%KwA11{eOF;2fKm@1MqkNChwK`^I6ZXOx2T$cyYesl zVAn7@8nuFqR;Oa+4%TAJ>p*lkPp>%I1@h#29)a{Sw8(a<@g^~J_rFhoQz>Dad`J;x zUIY)+&^n&XL9(Nlob@bczCUR{s}Az!S4{MIpv;imG;vOp}%!P`d7ipFQJv-Q5}t}zCdmhm$V*Ow5I>Mv=ZwqP=%oS=#nq< zox0C!g;||m=s+H=BlK$e+rk+WT;AxVs+e7};)U8Dr&uT*$=@GN z_3UnLj$P=mQ6jPPBh}5V&m)0b!O*>Xh$3Sv2Up*i+^xUC?`v?sD}(mfnpg&-wi?#8 z-8}t7sqsy;Q`f0Wu0(4ISCgME!F;4a-0a*@>j_5?=H4CX-lOL$Kb)RyIa{&*&AT=? zYgPv97-s!KCN2l)AiirTa$JlH`q`(!-Fmr}GC=b@nYnoGdp~)Zpe?*38eZo)3&US` zV@29(>bwN$K0{TNJrif3%a|r-> z3FGM$w@Xp5#P42z5l+%8=K(>{yay7WJWyLQlh*9tSka|8Uk?m}9ntaaocX~L%94rg zXxTy~N^Llm>?FGsQ~2tXY&8)JqmD;r4xmNvNaZ$t(G0tIm9|6vmTn^SthEhElS!Qb z#0{*ds8D_ z61~2GwvLN=5@hZkrJ9@`8dQZ_o=oO3*R;8><>aKKc{%UR{0sO^WA44>q(Uf)l?x zQiXg{=e_vc3pCd(2_f1wgz0ux;upual0B|D;GFLdF6q_@HK@8l{4$WDE?T|-kEDH~ zqf!L?@k$8kCIz5?;9T|+^!m{I~go2>wZWd zX%OcuO2wBfqyH1}u5^Cv51>?|cRaN#w8!Hr)!u9O_NCAnO#DSuVPG!z z+Y`u6Tq^7Y=_U`om$jn){E=ARWVtS-4n~t0^qzH3hjB}c?tH{S0H|OqdkhkM%6i=u z>HhWoQ1jY0=Ry+fL@4gpAuxeNWw7w@Ap5b{Zze7U&t`7Ds0ESZO5wZC2eF*7wDsgC2#CWmPfG0%ub?L5 z8UDVMU%!+Sn~A`2i=$c1Pu>qxToD7h)=niMOQ2A-vLo!YfXZG}tf2PSq@6xt$D*i0 z>9G07j3rh(I$z#FO{O0-u;%mYK!T#sMqGs*e*V&7m*1h>{aEcUY=<6Lh92X(k!3IK zyR}xp#H;DZVzG_zWGidhkz1%1Nm}_yxOo4yCTlB~{bBHRCn-!%#eP87#!9JQJY#?i ztfD29dq#g&yyOr)LrQ2{Q>iZ37$d_$-Wlb2Bat(M%>)^zq?rply0P?-HJaSa$7*sS?JCv3N+>61`ylkkQEwz*45P=+?Ag6P6Q5-o^ z4TVw9V|=%El$Wx9tnUkH$oB7HCQ|pr=(^ubFK1+VZF9X)G)s&^jO6c6#8Ybfq*n~& zfTNXW*jse?t3N`}g@4}p|M_U&q`>9jy0PZbutt=s)@GkObqHo7>OG|v> z<42y9fE-vs9L$ZvKkOunS|b{&zO8|h3{Pi?B&OdsT7--;e=o9nFG{+$M5CNCkXAeQ z!FU~a5H->9EZyf{4#eR8M0}8ge7qm29-XqlvfliSLL88m#O2@8%wdWkG!|!tTz(NN zQl#@h4wNK@dy97YEz*)_(t+0P{YH;-=+25BaT;7{OpJKV=RK^Gv8cy!&brhLp&x1+ zGG2QTsPjeK(w^01&K7A$Hy~9qxivc}Rx~{NSXL7dTKNlAsg+gG)|>^NX9u*6DN;+XZ4KlPQnK%71zr0DeU1;|?9Iv1mj8>p619)iQtnoDW?wQv7(X zr#E5+)&ngwUFKkW)*=8vR$ehjf9+lON`aL8Njm8z3nPKXAv)KNl#Fi8$+dT#n|;6| zA%t*Dey zKKJIGC>pnmR<|9UzGxbM)rPv!Ln5NP6kVZfr)5v=4L|1WdJVH_kzr6wm40Q0mL%k! zlp5!WF}o_eLy_G2hl?@kC;G#gN?gQjK4-X{6Rx6_#C5Dy>I9^2;hQTw!Zy3WtDHZ& z*4A2IAOW3`vrx|EVL>bQGDxgU^I@M4z3HE5`%YISQV*34xzugT7pZLRPr@Wp-(MKr zpn5MwNE-X<4Hd1Y@9@$o`~ZXIP`j z_nd?}eM$QpGua)7G>_nrGvH<$etr1PYDq9G(;Qq3V=9IUW{Hxwa*Fv1X-3Wty%T~z z`Ut_Cl{gd>*xgluYtYDsT))Be$;W@rR)Fw`=a-}TkV^sm4rJiiOV(N zn=_?jobKax_T$`jBZKKKRi|5P_Sn_TsyAXL*X9hB5yLn`AosR6(dyIR*M6itsH2c= zynd7_7w5eWBqReW>H0jPXU~e-U0)aCc3x`-MGZmdG1ZPHU628B>~ukV+2x2-VW54i zHSzE(>)HJwBxeN1HxjY`IXzs{$%W^=JKdc~)feoDROIX2h9>&^t`I=e;vK)N_%Jd% znamE6dBjR_hE2<~30Q+vUj2%lY@&-dYBbp*#d~Q!d3$mhzW0u$Mhi{N&Ro-rXdTky z{5n_PIM8q9?dg8&V)bWUbvoyBILW&b#Vm_n_66a02QwhvP38PtUJI(vNp`ZAirnJ* z$ydoc@Al?|QY0-42hH`|3u`dRnirni{^uP-x+lm2;rQvxml6cwZ7+xQkYD@=)1(ZZ zNEVEu;1N{D+xk*e-i6z`5>-K?V*Gkv6t~ypBBkLjxRjt9mT4GofIuIperF;HeVwMv z<^^O__H+YD&P^fL;OVB6m$%FkT~M`JK|B!>^+0-H-0Qh!5QW$jP4!^HPSgZj9MK(C zt%E271AP2kyJpbIu9IYq-2ZOrgOAn z{w@)Ioe~%Q5qLyFbh(9{NY-rZV?}--*51LSK^RlVn2UW3X9;_($Hf&z+#!MHD0B(?uO zYd*LRoOlh#7B`;ip6O!?2}zysjyGH6o*^1;4@F78PgR}ejr0zy?WgTWc~w#!Oki|* zT^xZqPjwSJCf`pUe3RDY#9Co=;R~}S_dq7*<2vR^uU-GV?dp{H3C!Txum1cIdWyfP zo2;Wu^qW;W7qQXJe^{M%n}vBT6*e<8qD%dYp7u5a|GhhS;_`r#H4|XRw0gXI^Yt!M z_Gu7Wk9m42hlXvM#<3tf@7~MRqwEeY#BTDf8Gv`V|vM&JUe@B|iGY@c6K%rU*>P_-7d{SiKj!K6z z`Wc2QTVufrX}j(F27=PCE1W1HsnmOp@@eClSiW=yAIJ-wVaJ`O_%0>YMyCgz>XwS{ z1LxV}LuW#s+$o(d&kfVLIw1%r*bb&*XLBbWOELz5@!mY06e1$b4bRGhl2q{HxA!R= zkk;;PTr|vClVS`C#>PJyQ=qSUk4bQj&)U-uiGsvRN?cJN`#g5%iu4B=_m=}~6VilK zu4`=lckufFT~1waBR^Sjf(CMo$?1vdt}T-Vw~g|VRu7`0m+8>%?6KrJUJDpwN*RH$el9L8}a7TOSN-?+iQ6q2FE?w};w!$A0mlWPl2V zIWI^PBkDwq$H4h6REq(kQ?>a9Fe5g(Q=oqes*i)r1Q~BefdqOnYNE1Ap->$sFWd-d?Ri9 zZ}so&b1P63ygZ2(c)=O&*^Yiz zlyp7MY#wGg0i*q4-`$YoqFd+-`4ei;CA>fP^m}?G{TaEi3h_(rU6rVa*O<>CGiBh1 zr*fPm4TbkSA5M_eipud(9D}I{WJuOSm9Ac=N7h?hKmhl_y=ysu;bYi+zz7CwSEOwm zKRK1uLLh(`YA>EE_0d#@&Utrdo11hG%gJZ98_XO1cJ|opPp9pvt85I$^crn)qmr-T!ByS?T9kYL>G*QUhq~q z_#OivedT>v(V*9f9ygWSzPmap3#JMM&`yv}Xim=3uHPJ=#>5T7Q#@df!Ztn_CL}@#t==!l<2GZufIm`k7JYsF4g^xVx z0Uo$22={Gu>gHxm?x`s7_b)f&AXF{(;_^E|vgEma}?pZ&m++OSXFpa#D z0Cba6S;B9GOOu3AY;Dv-n~`%~jH$R38^0OZ^xmU^z^MIzHdv<)%8MG$VTqAhCU_e< z8r)xwAwo4|9in8x%?}tjXA96|lNAw<126ku{TTKkt2zQsd&n=xZ z=KO}fcTM9t-s3>EpFDl^##%nKg=jXdwJn+`ct(1*z}#wKR!0^DEqh9#Ru7y4yd}>m zc~rgUCGO5AU${_xCMplQB8aeA(%K<5@O|p3kc)T#_?iBQ@7iCT~%cAv{EMqzX2r z;~h*KpMTW7Cn6n|P*Hg<3>s>u+Ee6Hwf%}nsN%a5IG%D#^iR5;1?Pz1m1W{kXjOU; z$JUb{gFj?snV`-(Ns0H&5#vAA2GS3=##8NnZ?!Owni<#@45<=$?Rx;dVV z>(-IAZ@)LQy%r~iMJg{e9T)yR69F8P5Hxx^_9t^@VxaBa+e~Av^;N-rBLL$KI~fhn zoW{c|9fjSYr*Dr&bhYhscw*?OLN&`pHSh%6g9DybYn-)3`%SLvP4MLTWWHIf-1K6&Pqsx7;+)Z0K1THjHAoNSLpIyxdnKIYH~Tx2a7~n;(z^@T$HX zNxyTjv4XD{`_r$P9eLyvAS2ImzjYXmRbLcEL6#URP4ly%=WL2)A>A6)596Y?in_%` zv)3})CiaF6mGolBl%!BJzh*nMWp0GTdSG>an~V0NT2$AQ`Yb+i`K_9kdK`4y$BS(U zMQHYEh~p*nvZ5MB6pSN@dVzL+jtx9vWMd=lV*i$+mz|)YvO_-*QqOi)qSedyB*_!Z z)pq|EuY|J2Z@OiIUJ+B_9T{2tG9S3i=uv^M6@+F}oQCv0P@!KWjq<=*xzqImDV@3> zbvK(buS9`D9|DRSl;|FSwW?EhdSdcLZcpcKzqiCMyNT)a#zE$m>ZwVdls+`wGIPL3 za7XD~I%}8WY?-|n|MOwJwMk@2|A&|B4AOoe)Q#l9Mfg{ekPw3Ke3~IEDc3SWV{38p z)2)>Ebn=WI2?PbbHJ5vNa_Wa3U+neX!$j#EtDWg9`x_EwvU=CmeYvSUV=T20a^h2Y zbumgE4T}Ytd|dBTy@g{Q@hXlmOBlGyC4>N-R}57ZH|pXcAJ#x&UhmxN>JT27_Ycp9 z-^L7xxDOCxkGWc^1qi67vGhdW&~zf@wW2biiC&^EWs>wvvVTOdvUhTG9REkrdB(H( zzHOXRt5%IRsTeIaLe*}9h*7h|-n1nYF)CJ#pWUJwiPlK{l& z#;YHwJykj^1EbpKqt9=p4OV4GpXz|WY)IT6v1Wvg9#;Oe_^V{|upvf9xM_}^l;IQQ zCUg-};pxK@-H>ur^)J95&zkZtccSR=tp_TJpfirk4r68IGN+u%l&A!dfczGt#t!OR z(DyQ$QrHRqaKQBq&D$7!E|K@au^-vPJmut8_Ag|?tXk<8tjJ?i+9Ns~#VV!+!gA#Z zxY9J<6YQO-_EnH%g{-H~O+#;tW1Y(RSu^`+XsTL5-Lk&F&WYFL=;STn$Gjiu#;MCE z)=Gh@m9D2P)@LMbjHTM8^S;^V3D`lKftw;MAH&!^HDPKxz;048c=n?=$#*H#%I%^1 zU>WvRypMUt?ZcA1 z$?o4>HoeNp!y0WB^Q~(MIfF5OX+pK*>=tg%HZs4EET~h(ex7oL5!VnlEu?6Q6*A#s zNeAVa#H*yW#Y|i?{d7zgI4W3k*~5gR#^=j`BDdm(EpPa*-}pm7(RmAb5p++Es~aAc zB!9@<6LU&5&T7(v z<-N9aPesvx94BkPl(6Joz`xYrZN`bAT&TCbsbf!bL@2rS-EBGUdG<(d$;)uYG?3Fo z<4JF8+pF7&dA%Wwz$)(6^qfSUfNMFKzzvgrRS1x7uSev=YN{-;$YnuS+Ltpd&Dsg7 z;NbB=3IZrC&X6V2jn~s=3RuuuxO`%o%}j=sd&SP#%y5^pbp`%0I`d%%#K5{LwZgne zK1+RAFOSL^(da#1u0ZFCoiQG7Y=kp|0PL8r_HP6|M2;HC9FZI}3?sX~aX6npn zVO`UL&YRbp)J(#o%U;Y~KkMoL6C?ZB?S6ur@lm9V+HB>W#Din#GrMiDA1I5zX{QMDr;CqK(N?bus)UkzDzr{1ILO`Ir)|CkugSkq1n z0DIk68Sm-1@DW!Ovh}GA^v+pQ+Q?dL-T!1-+PL*QaNP4@sA2Ps%~{r$lh0Klm)ws% zFY@Ad>Q0{(8a>=^ft-$8GMog}{bsPyQ?bs?EBE(%4**ge(33@HrT^5{Un@#RA4taN z+C@yoe4Pkw@EWL-B$jh>vYaYabi8e1Kgi zQN&t6;h9$7%h)KDv`gO6R{9;*kP9%|PGJ&}u?Zz05ujijFq1zP^3_8GN6bPk_G1_v z*zpH8-nGkv-fF}w!xDrZ|E7S*95Bp2JE_zGe1JK_Q+G;l&UBsu!}Ctr8*%G<38QN1 z6Dr<(z5uH76I{|d0b(qxyU3RWaW@MP&pr6e2=Ys@p@&i}k`I8_&g$Yd#r%ws*fmMfmN&8Q;Bo zy&*oIGp+$`q7dN}m`H@i^In`{ecuQi+%pqC(&E|?LUl!otdjN=m~cPuQ4zre14e0@ zGPSYTRJ8f_k57a79Z|MIYqQNWiN<#=mKg<3dKlK|+=Orj2|uetmLdYxrnRNm?lnk# zQ0Ewe(}2f3oqD^}cRV2u#1_G6yiYUNm9+U}3FV}$N`4WK@Zz7k*XjQGN@(}ARU2>= z%i0n==m3oT(7ZllVK_qe(VXms9o5Lxr66F_cUO2Gd&KoA1uq?DsnzVmagUNk@1%$P zXHqQC9iW}_CoLIpfsz+DO(WL+@6_Sr(>fCBcAjW~)mclt&{gn%!Ki%*`1tne5FPs$ z!gd?Y-r@iDtXU?3Kieo8mc69hHC-8S&`-8hHw4WbEOg?0tA;N3xRv_4JNNn%;SPId znPZU&MFEP&W=hV!_CYX4;ANn=t2#>_c_z(}r80Pw$J-BHStCdBkr4C5Mh_6H?bH5b|*YUicl9MzsLEQl+=~cwG zZ;krvN~nFm=iO9dY$yO3z8ZZ~$% zh67&Qwb4$42Rc=)7FR;|uL?{I-4K8ed?vlT1uEDPmH!!s65R6O{k$R8i8?g;9==AN zU7BEyg+8U-Qa0Vr`ti0lIqcg(@%UO&SFi56?tUque~^?3s>I58Lnngvc7Q1k@idZjGDTy$Fy#SRM?aT$`S0< z;uV-Rb%1aDUa-SQNk%DvsBd60fGk+#lLPBNaR3F7&ruRmcf0N?zu@;Q=FK}L1bW?d z-@*7SrRqQcaFW@U|3p+|JF2@egWX~2LiSQ2T3856+Pid=Y~nIT5-XUsw{#dL=VQJ`>IZ9pd^3zQE3jXKTfTk#M5EHgEo~|kZ*3Da~ zq3^ogYm7+$(n`Vv5s{j&5-eHn%A8yqMc~ay=n;SHj|vZ<51&BS9^%AQMz&2YCRgI| zSmAY^wJx=&ah`sbR_YA*XdTnGw=n;%(mr)xhRAoz20dlzb|R`vwBS1>j1fhXGD&#v!Q3M-uZCP@Zo)0R7jo1C~Hj6QAN-BKxgkp5RH&`$pK2Yqw+tLls z(WOH0356@Ma~RfT=9Mhj1=3MT=19nf=~g7#;H&xO?Im*BsR;t1eqQ!PzL{;NQM)#a zV3ywhev09G#B+1g_wz01vIcj=Dguf#oF-G%GE|Ge1(+mUwos_~jpx}cdenx4fs~6#DqT1_>>lfWINbE0 z#;raBs;*a=$psg>(t9r)9rNtbLV$M~-%h3-SgcIIpBNNrbPN??99hxNn|IO-ZEO*` z6#GsjbTEMWc)J~gg(4Iqt-XdxsSE4pQAC9goH{gAW&L|qB0J6bFvLz&X0Y$KM>)fD zkpG9D>AVh+%DAo1T{HT}oJ66l^dI2etMH09l;cgmxZ(OSj_I_ms@R1y_KfLky!~Ax z64a1}lMv9Exs4Mw9Ut#DYjflf?qL+mDaXP4LSv~X^+LPqn%1|%&M+11 zN+fnQRi>ITYayuT4SNipR!km z4q@-FT?-mjJ5mkGOZ#JgeU8SrAS<`el|)-N-Gt>2gpe^?E=486s;8Fe^`ir!FRFN( zU~%#rR(D>flcpP!=>0}{PUWTSGJtfk6ITdLYsSKdRgn_)U5uTGj632&ab)2Q>n+pR z9{KxQUqucDzT_T@blt9aYdB_fcab}EWZ_P-#UE%NB1VQiaWXsa+yB1 zuuuD^yWmH4^md_JrqVI5SaJzoaHR6T_%uAbzp1R?mx#Eu*Z*y&gqR*s;Vtn5-jcWG z|I-M{t`RYAfWoo)FjgjY66LT&o}EDs<`JX4ig8=abTxdz%4S4#3rpQ0YMqXA*&LX> zt{*j~7<}Xm+0Y(40V?kr`zkM)w>Zu7GNpmYd&fn92&$J;@s9TtRtzLTJUK^cQ9gegWGP3VZT-3xyH9<<&?qTlSZ2=r%F5RytouM)j~8SnakA1&X+w9+h0H z1feZK2Dg{Ze+SkrR=SDo>nH~bRv9!eAcZ(I91=(VC(0{Q_b7@VzC9dXuF9X&E-mG= z2kL{TSs=MH($K2xP5n5PfT@RQuCgHm`Va2 zZe^Q-vs?O*1^?qRjqyWfKp2{m9+Rau8tZ=DJvK;Q#geE$LsS*uxopg)ItUy2r3K=X zKttDc;b|xNwrjta)U_H=Wo{;KdG}`79P>)5e6RH+>HIQ%CP&kW6Wt9DgO9Y9u6yl7 zD5ED7gB}E_nTS273|lyxS1u;Zu!l$mrH0TTPpA48GECckGbz4%j`DrLU+5c5Ij209 z6a)0?KQUy7=a|>wk+AQ6_rATd6gfKT4L9a3V;bZqm#9tgSCt8&*U0=Qmw_GZS@ZAM z8KA1G({hbRFe%mNeEGX}x*{P@HFhFLJgrpj@)^jbVbAx>wM)cJZ1AKK#Ui$k#eBe1 ze;WbJZP#bkiIW0R+*JSKbVa`hr^={LyJcbU3=1bK0p&&WfcD=}-jueiaH5Q|%kgp9 z0C`OVXKuKt-seQL^F+|n2mSrfyV+NJyN?l4!X!)*xs~AHE2DnI3rraaicxDHW2+kM zf6nwg``(s{WeN)pp65KsWj@bE|B`X` z`ez`|Kn_!$LFPcppG$vZiEE%*`mD<1jo4UXesLJez;yS+k?}L}+>zFHkNfuYi=qz2_^ zrGr;KIh$R{w5gt{kBY7PMmrpFCSo+JxX=-k`mresWB($y7S>2r^YbAjq^puPT+l}? zgEcEo?T^Trg&=z4+H# zF9hepIPRqot}0NpLj~X&A!nN`kcCK=!a(`&az=2MS5hzDZwyxD{;`a%zM@{6N3(25zOh4( zz)bmlfpAIXa1S&lHW$%I_FI(gUI_kMzU_Zo^#QDWipN#zk(;Yp6*C0tbzJ$wC)Lbm zSH&74hWtDGl$xS9UfE{(Db(`EJxoVyt&hchdMoYWFP%d)#PQO8l^|8R5mZ_qp9q1F zuIN|rc=Z8y^|}z16SA?^wmF|w4Ylg%?EzA3(xN4qCVY(P*6EHQMFY{(j;0xsJvY`x zIL0EuU9D55a%T|3>5u8-iK%ky#1AxT|OE0W`2R>f8TgK&wY(9|7ZjPpRPz1duPs<@HsAP@wRzu z0zHzKdttteHZu(?KSni-4&2d%f+BMb3dEDcCR>QDzBLIHZnLm9lh9nUt>0sN3>La! zEC1ZtKl-q81IWq$gBnLTwf4xrjbpp$Zhk&mPDw*(`e7j#8e_?qUCEJF)8X1NDDVh5 z-aePXd#IL*xn-B#ALR#fuKvbA8$^PWJNzV7=vp2eR-hd|2Ya2dd*1h454gXZlLe@o zxRTXNqf8Q`oX*HJBWNhNfx<^oU8!V2s>_Pn!g=&2%&zwg006C&0WG+=;fB+`Ehep$ zG~)xLwCzX6Qi{oDz2!~sYj+oNxB93p1NDKiK393m+I> zDuUj@PX7MyD4zdTi=c6SYI)QD?MTGS@j#o;rKfk?+Rz!6T@*q?Z)ZmI0&#-SXzo>l zNy|l~f4I}BWN|?BH$&rIt=D#hyR069G(Uzm)H|;yg7#6rGoV&a;kSBLZfe!J_E+>(H1_w4 zn5BDNky~v4pML+s_ogu8$)u4i7}}#dEvRJ~UEF+ILUeaXep@4@zKbQiMPYZXA4rEa zHb_d3l3|=qFYn)RFP(V8!q@3Uk6DjeI%pQn7eDC(y&&>@wwIk_XKY5ri%q>v-QaS0 zT5eBIqAJ-hllo{zOL_0i*PXnkuQ8~-H@UyywqJIfFs)E{tgY_9;6GQ`%Yh&iS1~!0 zJkB~_={M2%F^kp*8j&=0(6p!09M!VaBA)L=qsBpJ@6za>gG6Q%LKe_Ltwi9N4Tv*Pml0GemnCve$mtLRAWImLqvLEU;K!ALF)uTsGvgTgW47_uw`Hzij*=p zbh->-x_7aFwtMYDJJ2c>UhXmhz_ZgTqP^amy|gN}+Tf*k*Tf!{`Q+=1U7Qofe-HpXEV~>kxv2Dy?W)Fmc>Vf{qx_rbtXFE% z>*r5;QkRn3RMdg>Ro5Gcuqk=tnET%ic#)4{o8&fe5ZlrVR?<4BxjwdMWEwuSDEba5 zqk%!^+9mh4>D;7jTd5W==rEv9ESx10Zl~k^Gu^71Y+M5tA>X93utV+g+g1lZq^f5*7+3ThG}vaGANQIy?YH?7`riDp%+yBz)CLb^%Se> zuZQ|)MZnQ@Igg^{$B*3h)=O0f)Sj*8mRzamSEg$r)c`789r;bWpM>2S_ItmCe^F|; zVZS55SX%j_g=U8Z&TXnn6pqitUy*XOD)hw$W#vRiT*t}CEa zz?$Yp-``4CGh_ci9j1+&X7dLRma{OZq?XhLGH%~9OHQ9)lN`K~FZXf3eVan9ALaSY zW8Zbew{%KGq8Oh-muSt1FH&{3a8xX^3jJFCh1k5eW1_7wEF8znk?HxaZt6`kLWw*N z;Q1k)u}iaYVnx#;DFS0gfpbz3_TBjxg{f=%ybv&7^yT#)n9{ET#4Ya-glp` z!n{Pr7Yq$?(hU(ekkm{FO{2GSsN&;&*cF3_g@QUur;7v;kv>!lQOpg7^X>pqpohO-Vm0)B-QS0VsWh4`efx{<+stHVI!^MkH8;{#VYwa?*hO4W(?hhb8a4la~aH(2N>~ z8sDe7AHpm$#Z<|2AEdTgdKo*6lFVFOIAydoXM1H&reZ8yo(7O|cS~FNLodL$6kc;W z9E{;`zTn+qsa(?73mdS2aeD>fhjM#lwZ6i*Bg*^8#C0m)=XN1MnHeq&cz^mcFeIP zZK4S^Ufzk|_-ExeKnrexl#Tny=~d-@Ct9TsL$fCv|!35vy5DYad|rgrulEz@f_iqiQ9EC>>yU8*mbt0nw&r zOc{KP(OAXV<=8w3{h8kiXmUu&noAi({3drme9pnH(ADWgrZ1Kv4}}a}sMvGp zT#OvpiSV_^&ZIDsUHx}(`Klu($5y)NZnNopw4O6Pna1)WU$?VSY=CjFpL+52ab>yC zRX<<(N5}qn_J|CZKMmHH2ASfbjX( zD;ahU^HbA-yQc3K4PuPcRG3wxO ztic_2)gkN%dzc43>$m6>+ZOrY$wy^cgJzK55~|5MOy`m&_RuAELZf)oUG(_7x|T)J zUYTa$tD#|&-prf2@Qi>vvsk8cG(ssDAZThl`yrw!Wr)u(I>pdah(l<`^jIzg__xSY zE{t1$ImMG7nX06|-y-m9byD=J$m&X)U~Q_Oj_kIf5^&pgkkte9)p6v`BPB~R-ttDX z*rwzdpD};vp3c2_Game4&xd)pXmzKZp6<058_YYfz%j(1L!x2ZA zTFeI4gF9BK5c72Dl*MoEftF*zMxu_4{voe}M>d15pn2BlW=-9vp_S=)DTQ6#!Gl{j z5nfc{g2FXew}X1VbwnKCI4Z3DraD|*BCfEagPtiXi>%Mi2MJ_M-K!p>I(X$Z{f5=KUUUSasXK^8-506wceJ;|29=R<2IbzL)`E{q zGZ;KUjzhQknq={zCK?XxjrFT^U4UVgt@qnm25-W6k1{6v)NLlda2i98t7M&0`p(Pc zz3L7D-G8!tvhCl@Yj5eZ1{nk7f%N#@Jmh@KA4}EJ-sKp^vWmy1^Id=Qq;<6teWXU` zfTLVX*n%To#vjCLz2mB$H}K`ev@QH|VZnGswSl!tqXuYvyaz*`Ea=qw(Y;#e?NCc$ zFZlyje?r)_dExg7W1g(ZZr3@r&LWv!ec`O>;P=J|36{{K^NO2BIpB|StPhdE(}^Ht zBkBZ9&EDYdl^tcspKvYj4b2;Y+XaibVUPzE_G}L=a^IF@ycj z_NWGi2IL{gJA_7B2dp@4)CLu}btuK_3z5|(*WCJn<=vA=Y=%%edz5(#{=YZQIw0<> zccV|iQGt)GJ7|fhYG+th__cKs400!0mO^Eb?7Jwx8l{(hva6-bIo|bVQ^<(^Nfaoq zy4$Na%A5Gn>C@CJCtT*9HNz+e;Rin2eKz7yldy=?+w8lI8>68*TKsJAqsiOK~_4>7o)o)m4(R zTb{*oZaHSDt>gATWgq}DMsT-k9(oY-4SzgpM8kpV76p!{kSE&%VGIM_ z|3@S40NVdX;+;_6E2T;Gh2J`8d-QfGfM`hlXznM2kPz_6e^&e0cf72|x~;$F6&^lE z#$r~Qg<7ImS^bB7cNZ9F>Qh<*L5Ed(((}*m2sI-Rk_3yLFa=8C3)#McbuXVoN{W^0 z+G98?lDB{UNphDgYbcs>RQ20ulBDYVF<@?CEAF;peqNdY6C>kiluJhD(!mzE((D^C zx`D7>^_qt@@B(a$PR})yps&J%I7Z637S`%1Db^zMm`OO8Ow|t0r*yRY1Cbd~#NpUq zyv}fBTTP?s!IdT&fedgT;3|lF8@FcgFid-_YwON z&>kJ2!rf|9BKkky*^c;?L~jqP8u-bD{4KxoU)p#PS5E$?Q|ChTP7+}4=&RsB$(b!1 zal?iJj?xzsD9(81xbR}-%`MUG{6_u}1P965Y9p#wo&R&jFk=ve5p-N3;4eWNuU1ec zn&hMu;H)FrhAz{>#~>malR&Kw$;L&76~Y277huGjW5t&#q&S*MGkqXH1b-SjWh{iG zD&NYU_T-&Zc-0M!q3PdoA;R?M^Ph7h!DfXir&E8MgrV?P)=Fem3^_F%Jeh)7U3?1$ z)c@l7Jx1ocDBqu_9nt73lntfLb<*#b*E0t*&F30kpiF)E0E~BvliCYL4=yv5M?k)i zvey5KG^;qNMIyb}N;MYyei+qIM0NVAz9{$a^wE|~0Y7iWzo150h;BMF|C*myEbz18 zpr+%#LJrvMo=*uAEaty+Ru&s>3sZ^R%TFnQ8Z+iXy>}qd@J+`&bPW6!9~cmFuSW{~ z)i2EKnR-Nqa;aCcHcV5RR&^3;kIXl7y%8dtYhe7ozPWT0MN$xQA<=a_8%Ez^m00?l zZ?L@e3;nTJ4H<*F^8I4*NYhcn!il+Zz4INE4p(KKa!+(5I`b-v?wCbbQ}qL1BmV=G znK&6_h4ggwdy=Qt2pZl}F~^c0+Y{JzJ9I#xG<*baUvYaB2?;tqFb;Q?kE5Y3qPp_; zAOXrrb#OW?^sxMalG26$=&}RJ6QasMM6{F-SI9cZ^Af9=Ke~!{+)`Mp!&F0{JKC;; zPPBJz_7*JsC_o6 z&|iP4@zGZIM)I~ehG@k$dfX(Myl(|;?`GX(yJ-no-OK7BxOYLlf`-kq4mn@w1^=z~ z+5ac4nYCVK`*5=;KK*A^ehuu4gb>Wh(NQPw{G{?)_69rRvN0Yu^m6~la7ZIs>S*^L zKseO?C9;2|Oka-N=)!DlI-T67x8CAvOQ=$nx)GP$f`j^K8@w~co)aKT(?Xim0IjUr zw?w!s9QS;rF2f2{JD6YY)9>BBWSLOBsH0DVGZ+*{u7M6HR^!%!GR|RvMcX#Z(Z>Ex zoU-&TSXlYyAbl`xh~Q!+t*-{f{BAE4N{#)QdR#f>WELvyxvhfL!~_+}-&ehS+?aMu z(0~9|IjUegqd-uoSztdLRQHF8SGVu ziWW$ITb@_ejH+P=#OVqyVoG9KsW8vKq3CK%=ufO0u$$BZQQ#KO+o(&}fWX z^p&tixlyU-hhZARQ5<$b)E39EIL>!Otzk_no{hL{JbPt`EA+Mgpk-SK3?sV4p4Ph4h4nx}cw}8X^F=@zjpC;99 z>~jusP8%E@kTdSE+rYx5JxKJJ*zt^1jZx77YT9H8vd3ZS)yNgA?e`CX3LXO1rAxNEl zO5=R(J zPefXz$p^AHf%Y~|Ej}ngdVRzG@`kxQjZVRyPg2&T8Fa#7k~ZpJitIB!G%N*->Bv6+4tUr7FkKK>xHoBlI&!3?(|U+XXOgk@1XT!c~&1y zc9qb?&6j3l%N5q_ZJ_jQl|FVCmyY8~>%-db$$nNQtH zNHzocKM?OrL_A02LdvV-L7eQtyIo zbN|ry@*)2~>y?s+Rz?eZ^Sm5*=v9PTBliHi40<$TO8LfzK^>Z}clWiGRYh5vbV98{ zo@d5r5F_4K$PROw;z6M~zb;TY*G$8ccvIvXmM%*+%o)1QTIdgnygH8#ml7tQB5(Uf zDks%gLpB*vh@Qv2g&0TUXZ%FQ!}6ZdtB7E7VxG@z%;3MY%ixOZKPx1l{PlCG4-JY4 zg|l2wxto9Smkpy{-jG6s(hWZtcAQ5r@~bsee#fuH3zSfy3;S^@_=(!&6)u;|oRhX7 z3FNJR06!DjS@S0%8eImU{R^i6PD>T!7LWGbiYyzX@X_NuaynghDGf|fC^WdM^ zo#p*+XMf@2l??#8Yb{~dPY(+vIW0jqeDWeW$d1=b-*-!?U|-%fNlk$aZ9&aEt>S>@!gTAWlNA9pcbPeIzaA*sB1eMBV__!3QV&?&V9K|=GXNnsvz%M{ z7W7Drr%2vw5c(TC@myqHH9|7=h3*6BZ@IA z9c@bPV@RP%sUBDvnLjLqNgKO9v-5qM*~Z1jId@UyG(a$yXXwVs;L`vo#k710?-q+Q z&|N?*c#n$ZZRlILw#zm4wtiV+JwN~=GhKs;j9D-HzVY^Nq{>^4$aeLgu3DDlk8I3q z_B*8Exi>>CZnyMrZyU1zlG#2gt`qy?Kk7gw1*CPw*VAaOw5a_nrXBIHNx>?IP5?6x zlKnUIW2|SH>F9UmCqQPrV$mZZML@XFD!cDhy-KC+%lo7I>xEOgW&byIUZH2>w?!)q z;YSfufg1EX^yt`8lEHU3`h!`d5S1yc5cMs9fDWkoPR;bzU-(U{xv#7SRhhfYWc;P$ z#^9AyCMdses71^J*S@0-L-2Qyn*0oOQ+zFaz%TLp9gCNs4Di_r@r0+6C$&^QI(kM? zVBh9rY|1SDutahdE5}%~Uv7Q7v?3jfu%5#0m1!s90s z0)R=nTZSXR>CVT>Ow}J@@LQjn!8EXnOwDh*!Td%xw)OykAeoZ5@hZsIqPr(Y*&zni zM^&qzwQ5MRud<}LdBvvLmy}2~Y;dXQKt^H=P*!6PNu)1cP!_+JO2p?lq9v0wa zVL1srG3NbF?}t#55~o{?bBHD`tN;A6UTBH>q5jod5A&2n$0H>M;^?g|bZayeCJ7%_ zSWK@Y8XL5EV%hpAR#szmy>qRghXmB=H(!;|>AFHJD)X&N4jjCH zoP%I21IXno0-3i)=84ht!@M?@4JoX+?j zd-l!$DpHtD``ZGnT)cius=FXoNe)@^c(IZ7t+e&d-u7@PovlzmU_@mqM9MNWuryf9 zeH}s0eIv$S8)o)~K{#KaaXwp{KhC&@YF{bOY?2+I?p$|Ef7`w!5T&FBoDw!D2pJ?k zLg$lQqHbrAWvb%pCCI|yRiaHRZ0MEYZsaIgOZq1NCEjud!ybR9;46(Tf2-oVyUhxg z${)((gjHS4J}&u?6y>GWe8BbfZa#iYhoyCujz74|)6$6i%9hsG%eo+9`$g|V=9tw8 z88*F^Es9*q`GRs!krpF5#vA(U_e-82z@>9?fXm!zYUUck_%k>p33@HgAto=E+#~bS zX+Qc%(SGQ1M+Yn`d^n0g8|MVxDw%Dnlk^R~kVV*J7=tbqZS;sWg3~#mmi|#Yo)4nb zpuE?@jK#W-!z01?;>FCP%EshXnGx`o`4y(s(5YfPg@{c;=_5Ne5=7?MZWZ2tVY-h6U+V$zw0&iBcjJWd@ge zeRkGevsHy96(kvc*;fg?kQfBg)8UG|!_%WN{uEO_ox{;0F}=n_;~=*!{t$twYv&!x zS!2PzH2wWY+oqWu&kf!gy}MO9LdWl+4jC=7=d9yXKZnVho){{}MlY5mPvo$5`xpxs zdss-LCr?Aa$Fa!feo6DEB~Hi1`Z*>tAhd0mxuR2Yi!8Z82j&IR&`neZW;N%vrtZcc z1B*yD7Hy~nmtH@wj_Owuq@r|a>A%h-Egt(8B4dY#F5tJPjp&HMgciw=s^U_tQkCxY z5f6*0V?lC5-}^pUKYtbUMG10ObePFhb2ZfRUmAM!x1^$|={`Gn>jk)lI-X!oX)|OB zDIHfRBiR&k>fG$T{fLIgH=L3aZ(;$Qw=>yXwq|L84F_qO=uywBr9UP_OuJg1cTfl! z3i4b3ouVCn9rw@I)%u%8dgQ~5$y$}(h*woEp`e?;)u{_dtX=KnYCn7UK>HWTg<2u} z*)-+di4svw*xmJ$*6tRerCE1zlI1eA;$XXceesV5UC{C~;A=o6qTM zNdqil&kwYWUoL)S>{J{OEfrDyFSCrwEt~T_a`}76)8wk$KB!e}Um9;Elsix*^_#|N zq7hwHs+0Qy0P8A!XX`jms}lWZJUwsm3-*poP@0Mx9^bNR@i@p=3q(yo87d;Rj% zXCuVvE2(Dh{(PHT`D!MCIvuY0uC5Qv2&si8yot8H5>Gif?$PorYqyF^_@pzUgL2P_ z*d;Yni^j(xaJj7wD4?8e(Rz7%m}YNXwFJ%$IYx4NTqd^P&2Y^X~OI%~xG z2Y>o9AL_{utWNN@HBzgWWHJ3zhQr*-$|TfGe@o(SIIxH(1R{2&=H91f72RcvdnJ~T z=WBK`JF2)RsMn9z%rP%qJ)~Oi>gX<;WNXu``r9Q1M_Iacy!KyAZS~dw;#^ZQ`rxlj z!aR8O)EX=9F1Q>~EEe6d8gMP^8q<3XvWqwQZ|;>>kBjO91oEcaQ@Mi4u=4B=b-f(_ zrf!!4?*$ExLW>($mUejWP2mgv2;ZMXD!xJUmG;w3EWY_r#Py>6)$3k)OM<&S#eCyb zx}!kAchAI4c*3PVridmfgX z8)pof>hQW$7XXFqJ(AuDiR1QJUKQNJxZu#H+hvO*S^=JRoABs9*fHmlfXcKzJ2>E9X3Qa+*)6^0^3G_ z&)cz=@yQpvN_bq+qo|vBmoV!pyL0(Hx4HXLy>I+dZP0=151l#P00+R`3Ou%?!*!ED zyLUG|Sz9_+<^kS5{fVqAd`r&9>YR;(8-WI|s#%OK z$a7M$CT>x-t}ffWWn5ajl3r?pYJV60z2;A~VRR&}tp4*Loec)>Z2t!@8+}zmF^!@ebsB5o57bMm(TTT;CD# z{&gD`nW6Bf4!^qm`FFGGxK!9NXZu>M9&fBtUh5nad2HgjtMfH^kid^>#LiNgiu}K< z*9HUYhpX#ncP`fRx|)J_pw*8l)&USYLW!87!CtkCpT5uw-q#N@zmcH4Wa|pG_|}&e z+to!UjUjmS{+X3(vmg9!lGg2XPL`~y+iB3Aka7Gc!Z)7KJ38-5Rj1sN+0(za)fi3~ zr1gU)mAtB(IQ7%4uD|XQvV8iodAeGc4*!%BRsj|DHmZ1=EE@Xs_|$xcg*rkM7wY`= z_EI!%(sJ~!0hU2hbqr6BByQ#e}m4(|@i6 zeCJ)&!Tv_P#;9-={xF?Rx_z?5ISV=_`9X+VW+*5ckBPrzn^$^c$TOr{A~9yggmihSM%hoj(-D6`8xT@cDuQ_`#-< z*AE1#lDA^PGqD2X?n?dIJ&TWH#Uy^^v&pOaXR}=t>qLnykBVC)`al?)VVeCdt)W5| zJSV%Zro@#vk%Oa(XE1z}1TVUq#9wE!@}oZ8RPf$Q;);=BS#<2^bQ+SHtbJG^9*t#Q zDam+Su1(ViINV6gaKtShZJ0?ps&7!Nh2IE!tl_G>Z-tMb8t1?BX!ZY%Ni%=Q2jY@-LQ`y8g+DMi3Ds%ps~f9Y+<#``s>6Y{lSQHLv#U7=AC@#uav_1L2Pw7> z{ELa8)i~54 zv_2c|ZbZa$Oc&U{@B0$P(Xwsd`%73AG^sgzXIsb*-A!dhSvm||uVq&LrDHV~t6j;L z?jomP-$Sck&VSMWIp0z~KCiB?nrn=bp6z&_dUsTWgiqO&a6CvYP@5_fAYfVn8%L#a zgloKvbk*prx4mWcBA;;WA(YF|$*_H9)d=_nYU~|C%I~G%S6-7Jeg4C)!qxb&4A&6# zrKMA3$HSo?wAdvu()$iJmY~+~v+#-xhbiu$$4O~qAV{*@2Ph_XYNoWhOf|=hsW3`L z|C!5|OFAJUs127H8$If|<~8Ggp{EmctzL9}{6;9ogk9^j@k~=@swLP~A)xy`V*G|m zocy02%|)N@F|Z1B)e4Qg?^TVpG7xKAsr!_?Ao-~c9nn0IHc0rys^-W3>|@$`|N||kzZmy!i zb4*6?)w6Z8=xg%$E3*P$^4wD8F{|u3od)=t;Zdhy1vVm#nJTIp3{NUqB=~*%Z?^xp z2g@!ke7Yu`zpoz_Iu00!Z9z^_-O#y>I)uJ*k*At&8)n;(fu@M~nxjHzEk8L}s96QJ zv_-InY*o$;)=Gq&wVbAK z@u$ZZVD&a*5cjBqrFgZl`2pRQafhCZ&YFd<${{bh98(nM+VvhtBk+S_ggJ2&UKLol z6)g?$*6w?v9$Yru#r9f9V{SrK)OaLCf?oD1a-)rO3?-W(H7EL7sXCtc4HC~ z;2!V1{{sSpY#>G~lH1y7|CrSZ`#xLURbMaQNM@iVI`v9g-kcmL(pwzVU`>>fX+Owm zSq&&*R%di4e}_~6C=b95g5Y`yOrw@Rr} zirUmHshsO-_b;5+InQ(M z>%Ok{HFp?$!cJ^B-gd9mrRf=YfA3C`+2<(AFZT}Nzg{YTl!i0JfOqsoo_KlcGGiGPG zum&VxO?Foff=x*~D^d3L*N%gfQBOW*JA&2iZSbK88m_i)TxqmcymMuo_?9_^z&)a6 zFd7b=g6K9TkTEGW-vav85ouXObbqI?BK{K0!Tpb4l8>tg;N$-ZuiFHPA-*VB^3iLP zYvPw^rYMOXr$h<8DkM%RqHbXJ z{ad){Q3ya#mz(Cr60Ou`Dy+TOJ8ztzf>tq+E46b@HyOD|fYeI(^361yefnQ0(RMrc zeUM@MGFe$yHzE=nAHQT4#hSGO&qzkNZCk}Hf@xNe#q4ss8taC28-DUsO&z@B;m|Wj zvXuN9!^U3mfoRsO2d8*lYl0S<^$F=#5};?g zpeBT$8w?_#l?60N83v0{FU%MobU7w1h|BHjVbaLur*aIJCe26%%Qe48)Da<`+8u)Y z#l**+0FBnIu-3=nN2lfN5#t&~@L|0lL=OKKSjvGGC|L_<2Yzl-yeM~IRU1$~G>WE*0@7&sTDlp| z!tokp_TPomrC2q2<)qEi)!B;AYi!hi_nhvVEIC3{{sE!VpKYl8iD*{DglkIL$Pp?k zVmsqBXL@G6y|qq3y~+u)suC|)_K2!!;=iw)BbdCur)U@b%xDj)6{v&Ez3rDF3nrYc zahHIh8t)IxC`)%RCf0f)cD$T0{Z;jFWr??4Ab9CB`qlqnz=5>|GQO<8#mmW_X$US} znHaO!L+9MIc<~dt*prz?kUYl1d=xT=5rkI=S-9rwYEP~71;${?3hlQ@y=9Ngt$(E zP5Mm*+png}{DDzUzn_dnOe3j6efw(4o`r2onzm-`ikJ(4fawPUBY$Wu-wzOP)v~9d zJlu)DPR}LqG%k)Cvk>trZotLqmETUYB%_I_uYmK=fj1r2D3~VmX(gvvgvoay6i)XT z1z@C+&r>h|n#sy&r%t$55SgH<>zRrHic4c1-GZMkrCDskGrNw+`l1_;heTtPJ66sC z3pwNT^1yap=TF-sGDu@XWUCpQr~SHv_&AVL)o==S1C)1LkS+}1KxEQTNZ+%f4#ZpC z=VD4d|Ll)(uo~s$|XUa#Vqd4x{ zAbIH5!~(_ev_ayp!K3c4t4fZ4#>vBwKf-=YflbbI25N&f&qJR%8Xq?huuS++8X^GTte&TBDj3Gcdo^nT zU#=~p-pEQWwLm(y{KNRSbGDyWT-HByf)+Di>n10UYhK**XI>+4Z<9r!tGf46SHj3Vtj#C}cjl%0MS5&3`Y8DMDV)QLx@#wzq+VZP{nh1N>NUcxzKQTZrV8zq zc91K3%a*3r_Tt58x9+EdEebvySC-9ZL%sJ8JQ*~=-j4YW6_mTg7v+vfkv(s=apObQ ziVF=nMbp+NDx^Ww7s-pC91r;IG=K%=kZYxZj^5t>UsA9hX*M4kC*;nY8=< z!T&)nE_-!&3Dl+NMTD}=H7BSdp~JrM<8x}op)yC_2YdNw>9hTsWmGVhbd&FQa_=L! z7}4^mze)X&G>z%uwD)av?6yG}TzASydzr2I(pLZHNp!2~55kxl{^f^lQt%30is1zE zp8Mfb=_f}`6mDA(&;nu%4NmFZy z>)yY!&OV;!Z5`+S{40JiT|xE3?*Z}bI8ArX4av41rCQv$yLYhz%2 z$7}Isd;PQs{IFrrTzps49xbi@JjoJ$uKVpXb()5!Yw&Z?Y^k9ShLetsE~rL< z=1}?MV z(GgbsWhED5526Hr&0PxX8m6#JdEDFQ`zuk zhWxqfK=Rt!F*%1Kc6jZ2hP(=MKf+`ZA=Qa5RVs+F_hq3{Z1_8Nmna|8f#CgExhpgU zj<)$;pZ2id2v{I*^kwJ!=|6pw);!cVg+Kq6=tJXmtu%rxo???(chGzcNz8niv_T6Z zDe>$75rI!>=`76MsC=Z^T12V(eTCCY>#$#wlqufDiF{}|s_Q6Q(6V>+f8F(7^5t$* zpVbtK+Zp}sN#Vxx&(8!}+aoP^Wg9o9UfmkKq%~x%m^O%5qn@r+GHpv4=6GG1)vJSAxB`y!lidDDLfObp~QiYJC?IBOE zt&On(QbmxacOB~!JsPu-71eW!KlP8l46N`?rHY>2q&vTV4;Fbu0pM5V!*$ffD)WTS ze^xmkUAg2vwz)wUln%%=M{bDEK?lskTic#K-wx_SvaLc1`7XL~_pj0Y=Lt@ehKHgz zuk_CPyZc)ZoRV9-A0QH4u71|0&fOn>Mp(HVb;mZfMe^)f{1o*Tg}5k0nP}RJYYma+ z=g&xgNmSH@yU()f6;xXj@peiChIEd3GrG+0D-flPSL@Hv+X zI}U>M$viksS)ROQ)8G9WFga-v`7e6??6xjs;iqkjGQ8N<4VsXj>>3`owY&7ft+|O> z2E!Wrgc--o9$Xi#H?1ro+FI!BT>7tCVUSgX;rc-Vr}TR3j}x^tm{tm*+`+Q&XUfB+ z(u&fm%aNT%Z0Lr2E(pw`9rh7IsE}1Vvi%7SPW+GP?p9%yE)9$;I*ZvbK6N#M?ID=D%v;d+LCF5|3A=@_B|AJhK-%c*bbNS%bHim7iw|VDW-1ch z6+D1sEx14YyV?&UkN&X2JYoMurzxxcpgcjxpJR>|lDWd$ z9Z~FaH(3V7N&?CjPAY0dJyq8aur^IRdVAP+8yL)Vo}Nqd4rK-jbOP zF;3Pp*3$|QefM20?qM<2sJia!8YMy>spJ&mtez>9wnwP!ZK$p8lo#gvBN=({wXZ{K z2L~|h*`G$av01bde*w+eWUAN7J?mgsrs4J9<7Tpy~nf4 z?`eds3Kt~JzS#Ue`-R}u%sSOrWzDgH5^9Tdx6(DBI&=fJq!W#2`YFL7mM$Hh-bJsz zyyYoy>h4Zo`z4#n7SK=UcEs$snofc6yOteA3x{8-sO(%7q!-9?xl$oSktxnQ$EVky z>2LJ@YJN>d?)(YVf?M_QX1uz-10GV06|+E68rFT#7xakV_QbBzDSrv8eQUcjBLuh9 zm+X?M+~?^7hpLYF`zb&#qFLYh=tf&l;wHP4D%>qOVWJpTODn6AMeyc$B8QUOoG}=b)SVN`j5LH$~CAc5PF4H4Tr8 zi0-}af14%$yBYfX9QjY-x#**`6P+CbZZ>Hov;@HOt>frEYHzm6YGr4I>d)rr==8{2 z)2!Cp1Ci-GQrZBV;5-PXUB%nL({w{vJgnKqw?uLo7XF;|_sH1!bn%rb|LE;9|B;bq z`Wi7A9gaQfSf3y+9#ysETlx+zWLpg9fivDT|3@U1lED`%9^3DNCc$wQ4kKODWwN?b zf3XPK`QN*#7qItaq zexDQbq|_X}xTkrkD^(R|=Hev$Ri0&H*ln}`rMvn12qvGlk?9{i&ufJH< zs98s${M34Y%8bU6gki{|qR7=3CYlbR9Dsf+X5$13<-g@_bNQ73m0@UyMBKM>R|EXK zei7Hd@D%$cRh0y5G0iXlDFd1xE!YV6rVQSG`5De1>(%9!$5cgx(xm#P5>^nc3yxk&wHxqnYcpWy#&KFL>F$H~V+?vqG6 zC>Y=Ep=igHD=Po!pb$tXrU@Aj$(9e~JuVZgP!b~Oim@%6E7P($RL9@uIXn)uLw26QhH%yEZlK+w?=-A-;5419#^b%;V;p z1hWOThp8Y78UzJN|I~eAH(_i2 zXe}+9_A(m}xg$61PXbe_$&H=10`Xl@efuKZK3rIdm;_kQk5`4!oErHNtl2`rd!1-n@AVvj^GqEYB09@*;3jfWK!-jJ~OF};LwK1&P z>Dy=v>|FT_$kPz=wDkKg3-$=9mFA~jl#SYWa*0)<1IEI+Wa<+MED2BL6cyw+f4|Ch0IY^(W6 z{Je|q0O%+WtiK46`P!8$*Kk9A?(e%LliW+eGH+;>T&luSnAF$qYw*>U;`9JGK(zpd z*XeyqeYEzL_kl;P2V&yALNAK2`?t(oR{!BiFQJUgY#M5J3{fNz9*)zyi{dJH^SVN1 zYrs!0ywLEp$^c8FeTHM74*mTrqZ2O2&e}@8Mk#kST}8j~(q9h0k{?qApnw)+HgNl} zMVwce68&oDRKQLPzxPjlz(*#3wAd|%eURIu=v_k{{4SnZ>1fm}>@k;!AU8Ih!h_-L zVd8V>t{j^gGn_YL_I}}T_2)FfWrJ@?@(y1J9yXe&uBa>z%ebe$Pru8M(>hN6DHb5Z z)~W9NjQ~0w_~vlRgWhbmM!nQj>QKC%wdR9Zj%S2FGTNtNx~qlWw44dh;K8uB8P9Zl z7tLT>Ont!}Zi07l%Wn^ug})W4%fI3bvNX$@|2+^Q6H3a_9W9?>N8uTA%BahqqRlTNqEZS1Bw(VtlH0piZY+Y>I5)T=V6|I)LY-DI zV=1_9(6n*Wqz9lxM`=O|i|@du%oGX81d;wf_Qt+U|2z7dFt|>CnDV?o5cMDoDS`K~ zeV&mqMlMfy89)0D2Jf>dp5F#BynP>VI8k=*xb+|xBY<%5GX9m>#_mW#)_5a{+U%z* zG76DVQN*m2dw&ogqY0<=sGBn#@;X?H?Ww*Rhgop;4OfO4ucm>cEJjUTdWU0rT+8*E zxQ#ls#_pb0H$4(O0O9j7JHST1sbS;!yV}hOyv%3#tEpcdG~{wDgN(MI<(?k=&g5~K zoki>tjUFhDVE9cmYu|A`kT-ATbK>y(7(WnJq#4ja&)^DYXSECBC2n|urIFO@&z`cSYzXm+qw<@}eDp7f71D44$)DA6x<`Q4SF{ zUTJDP&L1h-q-|O7sERO^4?^ieyks057#@VF#?yxM@aF$!Z(7Vuhpy-GhRtW(G@(Oy zpiW&3$))ie*JQVpcK8M3h4RuRA>;i7sv6TF2v-fQ2%F#37epFM9ujeik2^ps-dePC zXq7HLmgo4qz6cs*hx{PP)NB`C)&SrLQCf?&K@Bpxog}}NN8o^^^NMPLSCz=|$&*rH zEsh9QeHlg+=qmoN2@&qGzKZ@y67x}v3~sXAmxVn`=uA{@ltIEowe%kPuA8Qh3;zM!Bn0kw#P|W=qD2F= zn{UB>iJVWH+48Ge?~je&t;rtRY*?V>8f&}lXVTl;(YJDb8=ur}Uwh!H=#lBAL63D+ zNw5G?K>E^nf&URH31bZ#0eBlwEDo63_)5~!;3oyagjAw=#foGGjHytqh-=)jux?Eg z(9kaYMPy=!g5!-u!f#E=Au_pk+=?3o4K#Nvr-$SQtJEGQ)jT+OHu=}!#m+)Or_vo3 zz*)aCP_=&;OK?v|^EWSi5rGs4%Qz@|fsNWdP%_~(LNt*elZCf8Q3SWUUs%7I^R>+H zXr+_Ml~l2Q*Ra2M9a(1l3_K^Q9~$xJyMABB{*yb-Qf07>43J{dM~Uv_3z>K0D6>Y$^4r8*KnouX&*eBGSd%0 z((EireKd)1<#+UOe^cc+LaJ09S^@Ug(+?khMrgDKPlhyLLn@6LYl;JXvXj3#$X^-H zNc*UwW*V6sr&y7UTR9F_v5Eh(*(<(cc0z-uvC}OWBspvsweqve_B+zij<0{bWYVcTS zPEbXPDBUz>Wkd{-@1@*+Xf_9my=62nQY4PI7^ct>VQ6*TJT&Z5y=HCgsa%_~7{a7k zNcplfOYbj5T${Lj%1EW{_7o!!CM=7*;|~M=0_Av17%lR7qUN{aDbb_7HShe*V%33x zI3DKl#+Xr=4tvU zMHsRuU4#yjHOa#HZewFqFceFyIv~tVbxiKT;1fpR4;azV!lOc~HPH*h7%e5$wcsjX zBMTAfj^4e_w8a%Ton(p*EC2obJEq=gQiO&&V~wE4gw*P)b6O+#3mmmb<7mGJe7o`%Ikwm_s}klV)e5*j`g|cj(5EoVIJAr_qWH9W zkIw*vnyCW1^8Gp53uL;=FD->Bd3H=l$E-OYK?b@K`4uivmfN-E8GdeaXIHZ?VP9OI zI$%UNah}!LD1f3Jbfs-7wuj7-@Kcg$Ve^PemgL2Or!x{nwXPoaPiP=y4xee6(uKBd z?a(4DQ=~h6Sv6^+J&r_ZAE1W}d(P@`db4GIvLH(Z7Gv*j(~l);uI*Sy<(TR3d&d;q zE{!e!90UgRXlIkQOQ(vJ%n5Ob8Hqfd(<)>5lPuOHIFaK@jxi~j(@c%c;`bF4*I16u z{SRbRg&uB|i|a10Vjv~Wo3F9BKZx^t7v@+KK&fH+90??FWb^ew?${evSUiD~6#GZ> z6fs2N%I(U?oM@Y>N?47@N%V6!W;kY|YxSctHu z(gQGtv^F@BeYj_5w6oP^aX0;?pO!LqCjD>10MWMmM#p8*gAPH0%?O(G58i#Uu1N3^afbR#e+;OW{)$!B@2E7L3#b>d z;p~v9ZN{df1S=Vn1EPTR5UqM4TPFDiQ;>c}Kiyg*(bZOAOJl)-kLROwMh7R+q?3q! zbtm7h9!QqQNx!D85AiK>^zClrl2dwILybwuvn*M`K#@#wSwr&UM;fFCV zE~<>&hH!+5FDhth8;FbG5X@<&#y}JH+K$DCDvO}(G#bZtc+2+})uA)RXyrxx>&bZIA>)qOex5i{RvMyLB1 zf4!&+^9V7%2$4ug$I_w7XlbDEM-ZxEOdD+2O^z>Z`G1nK%799{ZjRwy6iHs-JZ%x#3 zYukvVPShhg0HUaJt?PP?oaul<{wP$@f6 zKCqZKQ0mc7Quc5Rq;otsef&vJ=v`45OQn>NWPexa&~C)!yRJV){~~K%z0}Zi_tPK> zIxlYwAN(br)-$RxI0k}t^9-ejJDpd`(97fp?CYR%1siqp|Abb4c*C_p+HEVd8N(rt zUrBQiK@n~&BjIxOG_xUB<{p-+(YzYBAx@|8IPq-{4xUnrhXVaXITu_}nc@~~%9cf^4AX*&?7$x?7~{Rq z<|PlQNPFO)rZ~lC>&wM|QB{tdc_bS3m)W?D!`K9>hseA_H)_IaX)Tk>-(g#yoSRAn zb$ot9^@u2yV#hSO%k##9v_j;;lGqyS3;%zzK)Ea?PdOWS$JOsF-uN*Q4!9C=zucH6 zy3J$Qk^?yXi@t<$_$VH&eb;mAP?VL(9$ei&_YOt$&l6@O@6gF)`OdX|UGtgt z=^-9SN*}6{OzLYrb;4kK^2T2bq_;%MiK}OP@rjg$B1k)i2v}Gypzv@IEyxSF%`(LF z-chHm+<@Z%#`sI)ESoXaHRDfO_$sQ3wMY44!-uBW$>S;N#hWo5|7-Ok|eZ+1P2qxn;0g6Nx|2X zHzN-y$AmK)nVuIBolGvy6bLN6>xqTv69^O4BH#lGNXh5KtS@z;2X44$V*XD4+yU>` z!%xiH0BSMeXBSoF-*yR!GZ7xG`NhJq_TA}kpUxZFO&Ei@?U=J!IF5{%w9K%>X|vMi z;-p*57q>_|YjvJE1}5~1;FXzV+ESVkP*6DP!nUub(u5sSwgnGkrUui5L$XXRw8H}M zsPNIj-+~=thWRn7r_v7__&;c3h+GM0m;Q%)A9{6{0#1PGg&hjY@bv zT}0eZ*z#+a`D)DyvtY4y!my}se&HXAwrrsG%!hnyk>UG~$P~bptRZe)$=#;qSE9oe zV4BZIR-HaV4%oSz7N;jCyIJ`-fnZ`IT0Y^@X8-79cKrh@$9G=&=@(O4q9FW?;Fjsn zBdwsl9HlvyGfXAIz@-i-dGcc=FFJN6!N3SDB|n10D8m>){At(U-yQtIHwOo~|0-AO z{%U7R7sY0hLH^qF_1K%;!7R34$!0~n3WdhnkC(KtbZ8DdrIaUg6W`1H=bI^;`XmMD2SYK06Nkm@OT6Hv;ax@b2520-ln#C+3blIHUAE$sqPhU&u3r<48 z+VYMeQBwjk7Vac5k9=s6>U^11IJgQfsm|6hZ3#jeWlygW{d_c zo>l&|f`B>;ty$X|`_>-D8cJD{&MFgF5Y;Usb9YG^_DYLt?wHf&lXHMZweuWFM^J0w zQP#lW-wpgP{N>mE0fvB{XF0%sM zCy_Gt#O}~1izBLV-zn=T8 z(YpqY9lP@+m*ow?ol0OooZRK_V87s~Qa(_nfJQCn{xe}+b-xD@Q&GWd3%o6JO3@xX z;b&&%9LQ8C#)1~A99UG0QyiUiGg65$f8foy{FrF89x|0*kcBTLJX25RI5Ospbfv{S z{q22LPKT0BJ+ZJGH}@V=LB5k1x!UYh&VWMez%m-GGl3es%wxN>|Hf}1lJe>5df_0j zOYLi^+;uIbf4XM0i#~qgQ|o_1@`JC;n%Uo|Ws&`A988(AgO$SZNf}PscL75;(dCB5 zompeF+%)&~lCMWc^RK7-I-S01(eIg9$AxZ-k3M-xzUEI$s63O;5@txJ36ncKtr}a} z1l$%9vR>5y!B=I~Y;!cZ%mnh0a3z`>GzpjXdU+Qxpxkv0j0n!($8@M*XT9aC@=g5y zB`e7=W9@800$^DSKNz$Nc`%z-r*%{->xev%o)QJ)wB@eBP)w9HB*zo; zUM{gRpGCdM8ph`sMI1N^87}fZ&7YS1YpE1kCXkc2? zIc#LluH8ikZ6c`}PRbM(LzDfEk-MnTMoAW+sDqiSUgFq1=s#9U73Xu#ox=kJ+4iiC zhe)L#C#y>m@^==)DPJn9?)0KYO`+nMPUdqI-%sJOXzfp$v^uvz+yRhKMl&1g1*e?e zt+=pCa6CKE=uIrj*a-WTM%+7H>OH%tak`Hm?OBDEkk=YDw5)%K-K8?$ky}2yK zEYjGTG-E(+ROz$On7>dNc=KN8qd!G{?(e}k=ITBjzt!S$3xbOlXXfO(w;)OcXNPvs zlMVt<0T$c%v`&1#ZJhZLnx&X!O7{_F5uA-vOd9{-E80LQr|6o`KI1>qnEzyuq(WAW zEryh{K;+F*zl}nvlU8>d;}{`>)LB1e>b>O1cWl;r&?1U|Ap4*vc2+T3I65aCD|>G# za8#@2-SB`z409Y&g}e}dJ2OT)*!++3i~JeuTRU7`oP2&?5M3s$e`i21{H z=#2`0UqQ=`>Gl|+QJALWCA&70{H#P36qZ;Tj8fb{h`3bsb1LE0<#yL{(I)-k!^Bl_ z1j(@8NI0QNiwtB#mpHsxWnLG#D?vLB+@F-DTw4n{FPl|;CCbL>4!+B*RE;*=UnvO^ zglm6%s5!KR&PY2xm8Oxyo|r+Oo=OuZ9+HRst~K%>%BQNH;Ka4o^Rg#Q)VKE40;#PB2ejW-)aRe(G<|h#`e_ z;QyLP1$d3Lfia}Tw}HQ1MkM4-!Bku^3Ktu7DE8NJop-R*sd|#9gyjxEEBi6rDPRkI zFP(5A(GnZ>-1G-k$bDd@#>DCC4_E&30n3ra@AuQB7Jm+D2AG)++#NM@%Y=ohXm6Lj zr;d?70`k8=bEwE~W$}J3h#Ii`3H+nQ=*<8rsKP{nAon#9ZI!5*;@7-dQ(oy}KdN}8 zqX1M#GfmWcdTbf`R<%R{@ut;$_QFQ#GBaL&(Uwi=xNn|$vSCUdz)m|2go+Q?IWA*6 zXl9~v{ewogXKD3X#xab*9N|$?<&<|o+IJhYJEDpZ7}KY{zw@OVXG)8?ctMA^jGT`5 zCs}s>nzF8Nt*fk?mUa_2^*jVqPr6I2CuY8_CFm9zsH7ZP;j#@(AD?b*PZd*0RO-0FmqDDfxy^4-SEhFg+Iv=1 zQI<21c`Y`Tw^<%#Z+~91ra`_!XPTJ50V(Qz0&L0?eyj&ve8gEJ$~%3S*UqIU7S#v+ zqYJ|)hB_gIQYLAO7BcHG`ieLX5r2RynA+}EaaIyO_=3X|(dxE(Ct1za`eAsSzW)!w zlnF$CfZv$#hE+{LkLya^3%BAXVyQe+X|Tq@Hi8fF@@`yv+l3Y*tiOm z%^eljsD`f!jOI2tSAql^&MNq86nvHfF3lXgOHToC4G#%b9c;J(_DQex)_PkeT}EN} z%mWB9^Zpq^zbR;tC{k!(v0`bfyg+MFO=S<1b*kjS>sGTwwP@w_XP#i(|Io)oCJv}w zJn&`=Djti3@z8+INMaq>vK(IfAT#M8w47&BAVEi%8&1f$b857$>C<|^M61z+qN9(8 zFaHZhkW4iuC4AUe-ccK+66x6BGjIoV(O5)A9FMn|-up??(eodXN7uE{LV04;eb0Ny zDzwq>2=KAej{r<)BFs{@Zvp(5}w868H`b|axu}0PkbQKBP~~dSl1c-ZbC+% zecD)D2@ef=7V;bZt6G*qv4(o;SKzj|Ii>%LUTKgkb+^B#Aa6N;L|)_aO^2dG!TE+B zsYAyJZzZp^x!m#zJ;BZ-pUgo8b}gQ4*@u}=ae49{bUTSW-X5s8dI%97y);ZM)@Wn&sCJ<*TJNx4W=cG5jNG+9F402KB~UzUiimFugx31u)l&fMVN&7`=v`NzSyW`{;~I+%E$G`H1of zONY9N?^UC39)zff^^mIDjfETr(fT`jVugKe^!+_#G)lYnUKC`GP`$f&@S+R7B^_F-V!X|E7`ehD zLFx+2A{9c7&XgFmR#b^= znSD4kY8nroEaa$q1lTAPDpVR`dP->N{be}%vhGoaQDiNROwvdCjtPbzgtX^oi&sFu z-WPz6(8Tbbu$5b7owts=Xbg6mrBta#Pqn{uO8Jc@r4P}0t+Qlx0WU}9cq4sejh&T7 z+Sl5<4`?Xx7TU$rR04Euw>*?*6`AiIe4cDXs)va0?*J96WSIyFQZGE%Na9?c zGh(Xoby~V4I=tO52YXwBP@}`Pb6K03O6gjot)%_66e0nYWi5|eQ*y$S=AB*Mex5z4 zxb%*PW%6A}b?KNRXa(Kns$9AhXVkg8fPWsq*0hf!G+JYBW&#F#%HpK&%2*4X!i3?ZHy%z6PyIf+{LX)vKb<|X zyl$b`PtU|_zqaN`p(IlBT#ZtFOQC>}`*4vwiO)Yrs8x*7fKZMG-Fa}bQykJ({9{w6 zq#}xWEgt56`>yn$UikweXSiYYI94xg<6g{nHDlof^`u<`32iGk4CzF5m!xKtBO$1O zL)wHfU~8WE>YeFX@TmfLSDNw{W#bG(c(N&|WWhA?JOxqt+*nB+#(i}K8g=ILDHEUc!=xE7!zrFf zZU^8^EhSmgiItI*UKl^Q)5_Nsx*Yv|cZkW&zJ>qu5Lx`vE=Hw&%U{^~`Oz&KQfpRJecSU1IGLFYJsxT=_C={V)~If)Xe$Es=PV zpD!a;3cfPz0KO~3e7mFPKd0J-L#qFl`{g~L5Oh<`uABApk=b%aez0Jj5NXS+4-_1c z9vaWqoKD$Yk?PwxQaOrl{l{;oY51DnmC@o}s3k8p5Fp;BFByV3Mzw#CJ(E8&8BRPe z1*N5jo&6KK+q0{s_`t&eESWJ`NtnzRv`=8P`X0KESe9yo-}Bmw&Ue!OU^K68rL{E> z-iyJA$51H3+Cn)dX)4}1f9HBOvYA)ru=~i z+#Ek*h{wVMEN4}mGR$60?x&NAM5D?sg~0*G2gB(KkN|UCA4dlPUS+U^JF^ybZjkdq z+0kS%d@!#gbK@}JZ6K145P?kc>klU9C*}ypViu*7MIgCk{}DB{H0zwa8wsHg6C|ix zh6E5-;7w0J4=$H zJY3x|e#NRPn;*OD-XT~jlGZ(zjk0NPZBFl-Qjc3>gzCnY1u3<$?{n#x@ILie)O1nq zz*`isxe=>!Xc(Jfgv;1TP*pn`N=Qgd72jI{$>AzgRT))hNZlR|98}Zj;r7+vy>Erb z(H}3fq^ag8JfciUAYmZ`&E@US0vaL%j0i0bX3fId{Wjg5oJf-o%Iizv81|%`Z_K!= zT@WF6TWzeow7*7ctBoY|APo)aIJKK{bfAyRPPFTQI1c5k?CZ}rix7Q%4>v9$US1-M zQh-hB&w2KMzA78GsDP{?IVC@#WFcY7L$u1exqARNN|E!v{yEb3i(*toJ>IS%`}Is7 zSw8lnayi4tKbl79-CQ1b$axW6{P7o3*pJI8#kZ|e<|dwv4~q3O3H8hwGo?<%nu1ej zs1vvjk4C6WMG_mNryiUl?E34sl9yyvXRhZ~P{kA(_eHuS{aMj^{QyAuPm z*J_u;Phcu2s79Wm9SMyFfPKm+td`aG#`g4VWK<7SA!=>3wAh~u&aRY^ z9qaQJ^&9XG%W;Wez|#doEnFK)Lf64au11}lp|))6B;Py%O)3!h^cFb!L$IwP(*2R2 zXnuHl1h7lZSy=PG-#2k5>Uv8VS0MdIMCxW_1aK;0zm>qH?~&&fzbVN6NB%bMt548e z3uKKN3rfqFK%gF5zgrGJnrI$ZUi+A_tuXmz^t$x4+PEQKxA>W=aF5sqg0IUd5T$Qy zJ|t0j*|E59bg!I3Fwd?4_l6hnNEmmN&_r^F|SNo?(rL_4!$?3e;DcX1GKHEW}25B}4p-qH1> z)DFeculd~7#G2i;0UwVyk24{y$LQ0SWSkr?r^wa6%vKpW@z~t8Dz#hvHqHpqw>A7H z4F1w~=hxHZZK7M`gUm*%BJnHJZ-wyEsH6S}W*x%weIki#R;;I~YBOZqcm0|{Jmh6& z>m0aEuCE9(&~W9l6Q8Ji;l!T&xks+Pz0bHh-McW^CCKkM4=khc+SlLQ@3p7u&-lWz zW^Zp94A^u+4XMg_Frh1|pYl`tQHvHv8R^X|Yj0wfvI9+(+ZGA<;DNoNp^zG*r9i%N z;>IaOvsz=ZMoo`I$gO3FdrGMpsE_o?=+F!#)sX?JXPj_SUTE-bU&+&sU5akm@QVr! z(O+!cx>B$XM(dFdlx2X<-P7`jkG%YjX!a<^htI1>(#+*kL;Ka|DL6bVMW4lSb~$n) zIn9kN)g~)EI<=#@!uxdQUu55mmcmwASct0yj3Mn;Ko`r8JXsH4$?+0M4N>9?&14_{ zhEH6=<&<{AhR^wrdv5v)@@bH;X2)*5rVr-=pW_og4`b?eSerN{dj~ufcq^rahc%ed zCl$HiDkz1I+*Va5ksjcp=uOABlG3LNhCKH7l+>amVM2;1u8`u&`OFgo7BM*t^uwO_ zu-*tLd!t6GbPD>x!W#VW5V(9YHA7$NtC!|GD!8+6M5zGrP69E{*GA%jL}CR)gi;Lv?8MX*g;`V*=|2npsH&CJH3p)EwsDTdLo z%CA7C<$28mk0l=<_E_n@OAP^jOI`S6tHnqx^O@Tv43<;HWX+YAc4$!}sy8nqU0F0GWKS+a@+ar@?*zciz+Qv+0YY3v@x10$x>qq z5x@Pg>?lQuuw)y+Uf2Bv5!L%ains38N~r zDy;|Vk3}fXZs`?L!t+>9>dI*q1x_|ehq%P};{Vba^Y;oR|8#9oQZAZqaB4U9Ww*m^ z4fgm@)Wea0l{cBMggYIr?^oCKob|9Mo&luD;A|f6mAyP$y|@+Qe>kPQlsvsUtGNn0 zsZ-6oqZ2b)`1VY-!o?=F#FgVOhW+N}*`dk7v-fK5Y@qpwLSr>aL*47jD~$G^kA2sp zEUX*Hyusx2Dq$Z8sq{b$<64yL@0J2KW3e5x&ru^WAU^C#8r($hX(*|88ORdpIaP)fPuQrnj-aNNh# zh+E{_ZP)=~byNB^oR4@Ma#}rYMfZjVC3Q`S!a%D;*OYbvHhHj>rLAg}5kGy)jV!G| zCDuU4sYcuvc6K1GBx$;Pxi*AWyJUX|#|YjU8wO^~HMuIc{5{YB_V=6t3h`c^7m~k@fg90@{Sk}-7r1N z50Z|e{KP>cLJ*e1O#G-83cAefQH)`H)SydHzyEpj2lgXN<*1(*C`6F(Xz5s}GYhM6 zM-*ss$0C4$e--ZNVj(n_zCQTur}DOI=V7lhFoe=>qXviw9+M41DbHhURM7nVFr)~_ zNWD{*TYc~Ou);)(kz?>`U#U7Zd#Y+r~`&DF}-^MjC3moSU@dljnt7lf-GFM_WL7@2 zz$6n>3-y^Uwn0n%HX-t?W1|PM{{tvN*S;vNQC8$cnLLbo)-&GuM2)!}h^rS+++%TU zf@_$)xDf&z^sN+bL#@==lUqoJ1A$r6_^#e8sbEjkSC(sf+&0CwzvW&}ta!pO#0JOI z^Hkv&?n=Z>?0p5Rc)lVII6kEDTn*=n5=K9~C$D<&JFgc!gzl3g>r|J-yN@yf&1R}a z58rQN*zUDvaLlCO^!Bb=>rp)Co}#$Z;stJ!arLNV)C{K~$LCP%Bc>R6TVU0sX+dDT zde;wqE2!FQu99=G@sa%Nl+*&aBz5+#YW9-3r5nN6=e}z0_W*DRHM}NsPMat_x~D2JOdN13#G*sNTAtjA>e1PY4Jc>BV-dv7d^8qsQC(?(yBwRx)2WM=}pY1SaMk1ED`3T=W{ zGtxGc^IKNBa>g*_9ow_lHJ>rj2=eYx zWy#1jUEz5?>HO;La#W20fWKjJz>rAhwP8r( z9OH`Ts?pg>C3UlesVq6gXU`HY06lAAYfM>&K9u2Ow30L1=~`Q{5|xS& zs-te&8$Oj_l*##O`dT`iDD6`l9y2CA#wpm%)MhaovJx?o-ky*g0_L>*qQ7&IRoW>E zoM4~Muar@%Bvve-<0St8g*(j(yO)njYumUy_o|XCgM-Nb01AeUqdSuu=2akaI`isk zqur7T?fPb%(4kQ3a>s%_D!W_sq|H+iTyS~c=K`erI3u13=~;5J zxtCKJ;Lb`65$jZ%DS+f=x?drBa7{6-GBO9}LW47vM72jELzc!U34l&3qx%;mmBII@ zO_Gy>I0Kp;G1IK?a|vO8Q&OaEe-7O%OYFd8|2019W%{iD4q1`UvilRj^Z|h z+Z5vjOn4ag^{E|7w|pMeD9KPZ02iNg^{C}KBJO8BtC#sd4rz^O$Z~p~a%)IoTY8hv zTAj8`3d#$1sA$$UFdiUs3uhG7iXqT{LVmThETTC+*%<0-tH7+`HtosziT9{+W|5Ih zAwlwik&bG)-q~S_(w^E|Rtv!#bJQAzOn<}=;nRwT6JdEnATBFEHj81&62 zv7{cQa*MDtjxc(6s*E});ZFl2lUilBwlrH8S%ATCyj2fbIjyQX-Ez+U#@A1` zd$^~!n$|m*o&)laFmk6q#HS$p*D7-V04Z~x-v0o~obo#=L>+>zaIMjE*Bxk8-Y~}? z5nPa@;H=G*@3_z!EEUM_yPSjSD(v@j&nKTL4I#!`xxmIxx$jXdcyZ3`diqx0sXmu9 zcH>O5Xf{NGb|-%MK>5heKu;i6GLuqD#_B59FucO!EbI^R$Ky&@&5<7Mos)8hW%-+L zd;&nuJ7iOgWt5fUw@e?>kyMei=O>bCo9G~#8(8OWvIjA4I}CwUiuNP|z#pMCb5GNf z{^@Pxxr)tLGkKD4Wy*};`D)G2(yEqZV8Img)byq^$N^>fasAM9^{m{Tt#R1{TTJrF z9AM3`6Z^Gqy1h;@kTKUds0$Q3bNO_s?QX6t=NDG9$pp#LL}IQp$6tQ^sgoJ5Bx##t zIXsY{b?yMbrx`ozun4Wl13Vs2wOJB>bPs>x$GvB=%NBPj>w*;0#XmnV!*=?9eQQL? zX41Mi1f1i8&Ob`k({Hrf5jXahmky+kxKSjM#OU3MnB7O9L6R?n#l9=li+FYOKMzL6iK2UJTCTEXNt-sQnRuUb+;EW$iv*m6F3;`a!4K-A!O{X7*DtXw{NJ;X~7++6% zb6vK~5HLNe7GkpUGw28Z0IH#r=HL$Wb26=BZOU>79P$A)-!X&Z2b^>{z^IjS7@wE% z?^2DygJV9t)8=9&WpBO*9E^6yy+)xzmIsbF2fb)3p&n4j2e%{t0IgJ+WLZn7`A=@x z^{a@Oh1@9*^A_XZKU#_4K>2LsjtD%C{O8`Rv_a5q+^k7so=30)ujfi2kS^xNMsw@* ztx=mR9j6iGj`;_Ied+2s2*c&iUbP`Yaku5;kg%vUK$@5jC}FG@Sz>)xOsp7XgtcRf_6$Aoto;mt@ z(|I2tIX(FlV+V219CPVSDt3d@uUc0xK>q+*-+OL7s=ITHI3RZa0QJFZ4}!MR4MZHJ#*LctO)LAMZ%2n&#g}!?ig+y4)uJ*$|%%gK-&G!ZnXl+-ex@x zIjDTV#B~|;?^2{}=cY$d{&QWFX5NQANUL1hu#_x-IPd=e*RJBx{PDIN06W(eWov_$ zJ4p34)oF71Pql{!ziRyphbX~6eEh49F?E$YQootn+ge5d&T@Il^{v>Wi7~Vc{{TAY zptw*n802wRR_v!zEA(1&idr9rSEo{MbE93VInI44;g_y)SShI~`{a9OgQ+h}{x!d~ ziO2Ox-(!8>vYwvQo^Kd9`r^6ow+wJ|*QHf`Pif_c=Th+zMMncS(CRlPGEYihGYg#8 z8z#27!jZ@0Op93Dd2I8~`ORnbxL+d=!r zuiLJMYXdH)NNyLg&(fIEh8XGIu@dQehWse|V&I+C4ze1EA<5 zWdo3Tr+K7z=Ci{NO-dgC3eiaBbc>>90P{)a5ynr}sTTl$N@0;l{{UW;s#t1~d7Iy@ zF`EFIr{{umoYI#ZgU)(-)-s=9_H7FzDeuy$w2Svat0V^;4l0YN4T{1|oivizk&g!* zx|)QXbmQ8B1~ZZg?Ms8f=qe48NN|z8>E3qUo|vXEIi`il$E_FCIZ-+|Cp__2qjE+K zQa}ge)~%*b0M?LaHCq=~rcZj6Up#chQy!j`Ch)n>9C2MrXETX(9CA$tOy_U&tkZIR zY9_hl^HVCe5}?~O*5d~h{{TOnllj&wPI<*dZXElLwI1D?EHiqWX6GD(lTm%IC(^O} z;!i(?Ib5ERswrz*hmNfjTLkVmg3rd^HV z%4Jymz3MUu>skU9Bjp(MrDz;=8LasWRTb=K5zq3c1wNH^A?J~demqpOtV*FGKt^-C z=XXw>agO~n?^DXh&wUKWLd&@0t}&i?sM6V`bx6itjsWRWO01h*f%&>*aB8Ev<0O&? zP!2y@%2qd~n`31A#x-5cnI~_|FuhM5ze=XgSTx8~7{Kp?*Rbw+sAUeQ9P^y_^!BLZ zxR|cZ*j$2C^vKQ$_3CQ|?s^b{O5+-N56nTq=~JZ42RQ?$sHxgUayO!a039%TP}oiZ z+zPG3$E8fAp)jRqqbrp!D#sFn$AOPi_|#KHBr+IW4dCIk z&eQlDRC^<4K4%X+sYE`+nzYi7>@ks^sE`iQLAa-*eZ$teKlwOr#cu8RT3r=+$xpN%@Uss|@?roB)*^;-WIty2{AefxxYpWCU&iKG7peoo`4$TKG%cRrfoq+06f;w#8}{#1-E-0 z6WkR0*s5P?MLmBy!E5zmGW7(LF@4I}r7G9e8&ko_ZgpbxFB}n5t?)l~xoD)^pdZe( zpzF^{YF9PZIy0e)>P+MwmAP%IG+4>5QCO(?NaCVv#*FYqT4T~k^&4Gz6l9)1I_a%E zMH7&$K*u2a*M%+lVmp!PTCmddEZdU{uPp=vV909GIjS4<}sa7v{`D>b3-b{B#|7;tN~v%V?(Sry~9b54a=oM)3= z?w>C33m$&7O2>T}UqpILH{_@}tvhS!7ad5hHqPKi2RX%bmh(p{bHS)~H(bq~g|4JZ z=cnOa9kujRCfC5n73Wb(VmuHmAiX;>f?wI20t7b}aT?S@m zC)d`#-_`sivc}F7eqAfUyi=e_Y|KjM9)hN?yslhe;kL)ix6#cIIL=3{b5dR0A;xiD zv8-CA<^_5BSD)Tl0>t9H`NgBM6GmmWt0-@nn&@rya&gaE=H#^t+nR(HPMlU+oho-n zpp8vga7|;~-#&g?=Mv@mW~TGEj!i_S-i5*myReq>Q<|seyPO)dVpCDND%K6Np(w6| zW9IEcKuFC^5gvewuyVuY7zU@9(#Xp&wrSo;^sNya4x=?`V93rYSkp3NgVa`(G2<0F zTk<)4XZh9+M^dMA7s)C?o3Dh9U5&uSP;o;r7?s?Ep;ty-?MUu za}FsTyBgAo?gvcbx;V6D7{cPNrk1I}6`QGZNYhK9%n4^a08LLHnt5vI&623;(xEn> za0O=OXp%BrUAfvnDrku9=bys1{>pK{rwe7rH40ZMMi`Bkv8RM9jw@ZQk3ecCw~&vN zepP(tE@>j5NZ52a??8<^3URl&R`eeAYABul@ZyefYRDB8h7WG^Dh0{Ftwpv0I{pHw z+#?|1RkhrVdKDMsV>lisF{cN|rCkhdbV z;)6WaQmJFEogSmYq5wLYca#`z!4+~SW5*;9tr7$ZKqHFfsZ!^4I%}z%@c=s2Hhr7{ zn!3(%c8&!^V;nut+6AoHK>+DjC*w$tFc&|53M+&WqVx7hRsRC5;*PNuPv4_f%(?VR%pBm(u&C& zk9yk3!OllEwvFHPt0`!50nK)B=;~J^KZQO`Ibs+pX{3m5XFCn7f5tn0G|BCwCn^ce zY_+LICZjgl>zrb(Scg(b=N{fM^8wGLLSj+Mk9z1{&vyeNqW;Wsa-f20xk>iD&V0k3 ztJbPX0+E6<_*X?OyGAg1&1X#xzzXtcaViyVbI)o4Cz^mjdyWNcvjN9{T4+%I#2U)T z==PE^OaLC8I~q|N4oJ_T6|UBxu{~-hfl*g10X&d1k@fo0XkO8o;YKie`qRI56y<+f zwBRD+W^>-7ff7dx!jtPul%+Bu7--88f%)@Mn_|Pufk9_D=R6PPT?~l?FqroTW5@%h zeQPvJARURz2Ok=q3T`kqZT&XzukEeRYWb)2B9<)jb z(w$40{#yS47kYZz#z-w;*(mDI3aN(dXr6 z7;JlhNX=7|JF=r{pW(%6uu?P7`g;BqUP#VIOrLs(167DAOEYA&Y8NLsAIMc^$y}ZZ z>}u}Jf~~;*bqQVU2N(md(xJrC6HKQhjK_?TjB<0$KoQ(za&uZ{CM&@J4!f!)SXU|z zeMlTuGK)JYO?6{DwR{3WBc(O18+KHU$F6v!KPcND){qCsmLPwYgQSEXrI2EiyniDcU(@QOFqNjzIcxS@LUg{jypdurAAjcpWj# zO=UQ=yoTmTBe_VNGea=SNCD+r1RNh@nu=)M8w`vOy)Z{4vIGZ~H~^dv*MU_kNv4=8 zx~mIy<;ig*utVe{F=dRM+d(`G`*f<}H{L?7N$HL&NZH95DB}mFayj}`Oc?xtfI#cl z^{ibrYa^mBs~u>+yaD6$0_5!+XZ$JC!!QO%gJQAybJD6b(gfPA(}SMBfvpW2N7lSU zc)DhdZzas^ttQ3(6+xC_dIeF*HP0$`)tai7C=mO0#sOo{cA?f(D)K179hhhF71YV$ zd#fIGYp5*407A;-$l3nvcrEyyqu!`Hcv98_=F53C$R{{dSh4xD8pcj2xXrzcBgo4D ze;?^lNbjGz#e3v?b5qAOH|5!lZx5C8ZLzZYrB}QZp!D$f&9dYhi75K zf51r|_02l5PRP|Go+@0Z9r|ase;Spot`$R+eg_;H^gjdL>%Jqhyn@2YG$encPNiUv zcbgzyL8wVDoQDVJJQ4If{|Po*)paHnuy=M=v%2RKvpAE@H0$m}-sIPMPWl92?+NY3sv&{Sa*@J}O?!N=oL z<0pEYcRBSxokpw`i~am$aC(#Upmwm4?p%;?N&1iLPd_;)I6bq-{&fC{o|)hb1NnU^ z5e#g>&N}hbQ%KQ84BAH{AOnzkR0c9eU%29}?UA_y1GY~U695$DFi*c6^`sL;P_hy1 z4mm&4g#?l?a4-&W+N?Uc0|W!W`ihle+Qqhko(HdfpGu^zW=5bipDE68a0N`r-!o+N z?Z#@&v;%+ckl=b`9DY@GfK-1U zUr%nd;|YzvU$KJJ9Zu24gr}3#6D;y5Psp<5l zD_o-j7f@K`@yH$hDsveGl?8z7x2|f+Z9K>K{c+S)Gb2Jy;y`YB`u-H8t~BkT1o4pj zn2%%EudX^&ETaS-rmnQ;$WDH2;DemidB(xhuYSk;DlA$nm{4$|0Q1T3Sn{Y>ApG3c zixwar-Rc|yNIgb7b^ic9w3$c$)BKHi%#O-Pj1XAoI3#ih89em#{&h^V0-*NK1oZy^ z_0`EzP1}Jdupj4|ssl4_#uyJw;Bi}~cJ{PMi*0q*ZUOM}KjblMFE_lcz)QnIi#$5?HI3l`e z&dkbc=*-pbZb^Y+*kjkOE9fwplc#Gl z!p7y4>!zn0qq|$U5l59EIUHxDR+m+9Ht=}rE09~2#xw1nwLhD)1Rf9F>MQ8*+(k64 zbK>#54~CoOg0nhEwT;-^aBAqiLO5a%YUGsTl5%sAo_`9uk{!5S3F}^^JoP=#ov*=F zBK^i`PpHVJ1B0HGnJw&+9PTv)fs}52r=0V}LPF(M;XKBQ6MdXe1K7yflabCb^`PIf zAD4sMwR6U1OsE|DbmptH?tWvO1>kngbkoddV}iaxNo!-I{?l9#SneIYJ!z?{E;YgwIPbNlic*ETIxdGYtxoJTSMm~luMbW zj;c*Vl5@>gZ9$85;Qs)hYUY}9#~k$Lo9B$=ocAB+isqIw{Z6Ho+jMk4+BiI(r;3qv z4Dd*T^G5JAmZTfQrdOOgn|z^!Pf4U9Ey3hkVA zaD1mix0o3RoYdcHEzWD565}HuT9IYfrH+fmC2PPY)3fH>DH%Ur{-=&V@BtUbOx`- zI-iw+HL90$mUQgyiztBd1vsJTIH3w>2x)med80!syXr#N02AB2G+^|pT|xJzf)|RC z@1XIOJmiXyKVUtLL6e;0^QJVLdCn=PVtH;`-p4uOoL}5=R0PMVJ^Rvmx!`k0IC~P) zNIDL+U5G7=(+q$NvHfZ?;NiMwikBlu!o-`#Fb@>aMtb(?QM7}3IO9F(;DA13nrKZHlpOL!Pq=_VKb2Dr+;pk;9{&KXRoR4*IB?v5 zlTxdIF;oPZBifWmM{X&pGdWVZs2r2j;-*H&QJT+<+<;FW)jG@039Ta|nsoab3xm*N zrA@^8^HmYSt7_hr(HR`lRwPcKH%hV8R0`uDjw+&dQ|H5OvY<6PDRziQ)EEO$D5 z=B%@*PCBsltQ(n|b^+#)$u#7o5j&Jp$8JdgcdAk`bu2P{Ybv#FbkM`{?ncu%&Q3?E zsJz#1IpV9nS+>;iMovKMT$;1cIByXEF%~GFZx`lUrPJK=edQ{6f2N|YZs2l@X=0Z5GXDc4G zBBZWriNNPHpKZYFSw+~4W}Lq+IHk_Y_A%;QI)i%DM)}7i)hRQ$;BirHX6ew@E~Ktp zXjANHi@;ksIjd1#F(V}NSg8RAt!PIRl^oSVaw4rdb~;O2fJQT#+qakTt~%JfPln_g z=SQqrB;>@TeWQ%m{ygRjHMCD!0+i^li_G~;7Qjxt{T?WOrZ1t z*L9^$)4|aI?ir)2)T;1fxtlfuN(Y4ifZQ61(T#Og8O%Bp>TYx^bEJ9R} z79V%7Y^>DTe&1mt~jUO{JZf&s3c*6b(;e*=tn zu6eG9r-!e1sp`vh6CaVQTHKS>fgQ14RR*X71rN`?cG_j}ZJ?jVu#xH0X|vGm)Di)$ z=;2MH70cLM00#b*(?cv}cr}!c+Huge<*4NGQ%A5=Xm<=`Qw&ZCBc5tqjZ|#QPO&%2 zqO)#dUU5=0$egzoRL&W(oYd?)9R2hT6_vUkb6z9j`y$HWQzZLW(04DD+qWm_Tn4+R zyz0attrU@yj;F-B=8-c@#Hk$D2YIFJ$SP~fEW z)7xtv4r>`?VfCwV%YrjmIU1t+F515qI0SX7B0yIwR$>K@H4U1jb4^i5;8mo7o1my6 z`Ej0WS}7C`nW*P2Qtn3`sbURGYzcgxb6OVhJosc%KDDjno#9zP!0pfLSx#qV7+A`; zwDO2K`c?8W-9D9~wydj`Mg!iQkZwH%VXJ3d(nS?RjFG^r@S`#X0M@itF>D!N%zF;i zGh3oyB~pnFdYOx8T;PuNI$F2g^sU$+Q63y~pGwe6V8f@>(orSU)aMq%BRxs0FzKL> zO4m&dfMbBYYkn&ok?DK5+xgX`(OHIZj8}bUqpYM3=e2hB zegW|f+zU01lY4U$kgD-p$m+zL01BxDlS<8M33F_CqG=f882l>iI%YWAUYi$(FYYhf zO0}_>?-k5#ZX;tTbvP!Rm!g2*9E}- zA%LI*=x}|i8NXuh9G93yt7$J9sVK$f1@X`kdvs&p~2%{!iGMq^uz zr<2Yq2eV<&RVku*UCL|7=Bv5O;AXD*E<04oYVu%_iiu3x5N|{>)iOEnR^047b4wh1 zPSAhIr!oR7l5@K~DrqeSEW5@D!2bXWcqNCeIy8-XjPp|zs`?e6ur1f8 zwP~e_qHv?Fdk2C(4tVdzmhj!_R$?m&%c#4!V37kD=RI4gz`~rLp|3)h_Fnjp8kT}x zI&vEuR(1rBUzq@{8cT5~%16x*S!KFc(ccC>25R3CZz9y^ghim++^Sv9Tq8JKGo)jZ zTWK8Q13hco{vLkHwiZ`0-+1c!8~DtBHH;!e+UEoxHCcKbj9`ObW@#F3kKxTdG~E`? z3maJe>`)*@*cJ;~(PJzDB2(cJ2#MQasM}@RbqU+u-HYz7F!louF;nI_HY}ntQd7 z-~bP=wR|D*m&Z0fDe+g8rB5@#r>V9f&+d$f&AHG9AcNC51cB*T#=T43vZ}bK*!fQC z(NK`;N8woy0-ux$_4|t}O+kFSrd$ER91-+2moA5=Sxp-wGi~RP2s!o5c1Ef=9W%<_ z0H+w{f}9-wM!g3A07A8whX(Q%r&n(+WeIjH=R+n-v}XoCRXrB*RA9Dshk zMt+qxM#^lVNtF6ASRa4A^_GcsjZ*bEGxK~*J; zoB#m*b6U+4A?cIp?M?eBeD*o!rc~24r(cxCY>~8_4Ej^tKx4vWxa+{dspPg{!QfSW zjHd*3;;?j@JK=~-fj~IpsKGvz(-QK-IIDs%#Nhk&>qgz*E-N`jopkE1=4p?N4%C|+ zPTYS=)_6*QT}FL{Rgp{OcK-m4Wyp0#wwjABn{|ks#VUEjDqRYz4^=(Ky;GVAAY&Yg zLxakYbNJ__T39ZC6T-(RM%Gh?QaWS5(x=p~wLMB-wB8W&5Cgt2&PN-Y9b44*s8N?T z+6~P$xs-uRDzVz7fF~KiJx(~yY-(C`nns}USls!@j0#*rc7`28FG4aqbrqN8GN0Z9 z%}KX$z$5`prEx|rk+RDp6EVr;l6wCD_3DMxYbn};?)N6O-r36MA(V6n)~;IUnvSIz zHnz{PIeBq}QSQWGekQY=qLt0z2|W%>ZU^Pd5!W@LWvAV0cTm_^#M0bO!4X%vJqP%n zm9t@KrdsNjtF3QaGb$POee)hh>>fK;sOw%Tv#__+SHf_?V`*m(eXPkd-Mpek<&{ne&upGY z<6XMxT1Jm(HH}z9E8Rk-7+FbJkPb4W6)b;F)sJ)I8(5(J%+OE*%tE9PDBQ=eINi_Z zRCO!+%{twi#L_gEb0AplB_+%XdCLQxtc*{o7B8uNjg5pHBjK>(6l|j#P7bD-UYk<}@b=B_t+2av29zZ1Ee_BgT zHq%qMSj4LeW0wP*3aPB zxn*II$T;-QD;CDi=JIg_eSeiDP zF*X3&tJfVeNancs{9$(-&nw20G>0R20|W8R3T=~iw7G7 zfN_EW>UwibC{sItJmQ3xa0K!I{XaT%vWFm$0O|CmNejvugR+61Frx|&`Rh@>e6zHT z-njLt08+(3!j9hGr!=S)Ny+(0z@*TVB7iYq&5+|AJDQsG$#k)!05%izW1exxT2#Pr z3l2vnq+kwIkWM-QMeVTCMp=av;CJIAy)1~QAIV!NsNgC0lW#aDQM+abX04}4TIkU=K|_2lH$eeN7G@-yqe z%`qZ&RRfmJJL8|$o+KMWo^jmzntB+dU9X-;C)THoBdJd#cZxRk+z3zdbUiPb7sss@=5yVC3K)dH(?GRuazuZUE=GrTb9mq%M6Zr;F^! ztAkHQj=0?@LW3K5;8X@c>w}KD>(aTOv`C{nh~u{h>56H-bpb~^yVqLGT2{H{&nBlQ zdmHU32XJxE^r%{AVla5g;CIK?x&HvRNzf1exEaki?M_E09ldJfnK#tttB}*|Yc(YKuX4r>d|+&cSp;MKH~1RRW!*w=L|!F4=LPDLf~qo7$cg1^qRZEgbP zPg7j9cNrNN6{8HJXd#1fp0(=G#VKrjzBezFE}A-@Gba@N!)`i#D-9<-IpVLyHh%X) zE4fVY=Rw50rx`ThNjMz+YO=ZjFnQ`}!a>w@{VKVP91E&Q!OzmB+&?O)vMvsJ_NQ*# zxm^7XT9K29XiOKW`c&yCW8e8!SDDw;cBiDcBN_TrRdps*5z<27@N!72LQHh#u%n!e z8l7%<>x>HBO&)xxJDP>Z8Kft_5(u`5& zuVY6#8l_>(#0>ZP)Mj=EkEy1!jN}@w(lI<%GM{63Q@-TpQ;Jeg3r=xhbA#Ra)E~3+!)+0bZEJH+avrW2MgF&T3z@ z9OwGhs=6|GchuWSK<7TyIFMr?{uO|iK}9LM9@Spi8N4&Ox96sP0i(_x&)_Qr-SdG{ zB-^?i`p~PVusl0UQ*|eZH}69cgTQPaoOV6w>2O=_jw>l#cQrVa5yfhxVJb?-+){5K zHD8S9@T@3F{h!I#tUG3|M#OaEtz@mjk_fBOPOa9u;VYhXNHbP4 zgm4I8cpb6+HK`s04ZNIs;<4g<G4vpzvzfKM2z4};IAN_4Vqs!b`*c^IslIw{kA3o3(fW0f0#4b%#TNMjqa zIsyUpsC?7+Kpk>(&T&XyR#F{+3O6orPo@TW$4)9+Iw1yU$^tU^oS-~`!N;XS)1t`o z+Xsn5W<0)KMt)zI1<4+u4td2}aD@v#OP{-gfIZLnRz=4I0qNJbwQ|&bk3x!1LRPq! zZaqG|Da{s8GB7H`BmxNpb;t)GdSq5ln7DBxFpv-wV<3))CpiRh#y=j#>ojUu$mLiJ zV;y~uJXbrZ(CYRLEep>c2J9X^X*{J4#$$yAe(yO4sRyU$RSntl#DPgh;G7Y(=bRq= ze>#TaP_y~UAxGXyfy(T_z{WcIoZ_;TSfpGiO|jFI+w-yVfjJ65Vn%VntU2TXRE8vh z_kFtz=9_VLA19oX#yG6`?j$%MU@mr#uT%Kf6-u`~S{P=x9WBzyhES*wVV9>Q{=d*x zd(PPG%5&U~eT^`)-1*Xw^0wUkgBx%_%VBZ1oOb8+Y>f;IRx-`T*7Fnw2fhb5=ifN| ztBz8+>c)y)2dcbivn+|11P~5bXR#bqax$R7H58X65J7}xQd}~DyCifijN{nV2_$FE zIL%`zq;%4t-mH0-EOFANib4rFBC^YbNe z;?w}n&Bse*HNdm1*Hgs_nr9@!nMud=+1Cz!_^bUfD~gF}h;h#>G zE_U4L_I%nS*Q~W|@(h8V_2{}zq)s;uI&oeP;k`x~r@mHcNgi;6~ZQz`IEeDVp7rk@Di;7dh033L@rmxn_7W%r`qHS(qMJF?(ltPeOKzy^&uZ6#6+Cb~tDU2zwDm!08ISL06|Wr08sGqV z&oxlR<#GAczE|;dsb;b4XuhIkkIO5J(-C)Yc<)TMhiiP`aw|>kBSNpgc73W+WyzvT zSfp+SFgu#OR7S&%-t_=wDkEM!#a%!ZLJ!WU!=0i;%l0+BXs2i=r|Vd-z}ts^dgyH7 zeZxHkB9d=&TG?YDgdFv)J4j6O2-IMb2jf%d`c?j|bsdhGZu8G81w@TYGco7@9Gd%M z;r{^acj7z4WvqC=QjblKa!S^ap_1cgU98+HH~saB&ZT;EwW#cl{61e&tM^ea!mrs! zUDOVf;;$24+d-#HQsL~tcA4QgV5E#F-a7M;53d#aCt+`8quIq{r^6k+v!dC`rIZC6eDONt-g)n__ZlD zm^ABH@8%eLrGXY^{{VVGHy^~-qs#bJcOgzl=~ZN(0E1j|yWH)HT@O4@gFg)5@omqJ z7e$5jYo;skg#cvIHOmo! zQ%9Hk#;w$;B$I5FPBD5Uavmi3ec;a){gil%OSZfgbN!+vboqSDV=M*(f;xuCK9%JD zBmJ7b59`{m_PqKywSA#l3nwWD0mdBqJUE zzMh;{nUgCv)#p8{_7740ntl)JI{SEn<4J!uNm^+jS>zV-I}%ALp5*id4{GK-P5UDJ zIo9um{)sKlgjj>xZzn&(g(OX`qxBrJU#8H&r>19sNObzGxCb#PE`b`tZ8)IpS$m0T6|pi1L9wW z`hBjcsNLFL+FeRvSGFy=91XxSx~ahc@-x$%ai5zmE!}%y_pe5r<2B6(bH=GcROQK0 zS)7yDg&AR4(_1M7t}CUuR|-Q8z3Uc4V%&7C($MCf<|(orcGY=pT?Yg5u89$smo*zk z&7LwnDkTQ=HHAo|a>6zZ_i4p&G1H#)y7sTsEmk&!o<&cwX7Q^OW~y)J(yqk0AP$51 z(}MYbD+;#|8OW*jMSW@^90T}|df2tK9eY-XhkQG$c$-s$NYL#iy}Yj0IIuzyJ;a9)hBdSCUUHPa~gtlz_*RPTUZDpZ$7{Mh<4ByrvcBlT)?l9c!4L z?T9EF1o~A7<&rrvWF&r-KFA$ZbrMRl21ogo!B!ri^{Ub+?EySt;cNc@4$FYokrjlo+62q;~ z`^m^|N#`HRv=y#d*528`2nb+FAe`4M`%X_xQzyETNm@th$0zZsa@=I&wKP{DI-KXV zS9aQXH4$5qC)i=Mnt9ZMgSXT3-^`t9@->;tid$Q&Apn=OVPl{`*Y zBa9A)qiIZymcXa54~-SNocnjF*-@KrKRT?ff(q1vP(G%UHBFGZDdIH%=dD#}nMvF@ z2d}MYV0BPP6oduavCmw)v`PDXs#|$y`&1WRGI$+u;K0w19;PK4`&>T1z$6;3Fw+9C~&tGb!@pIFq zLyEPH<58z}MJ!Rsa*79{=ReMt2w@A7rz5!SPgsCCUP<+>D}5gN=HfdzB9d9=$Cngp zS)X@Jp>j@rtDbQ?=~U`v%kzEJ&N#_6Rc)l2M2;mgOznWGGs*2=Kxn=V(tIJT0pk0c zON+5?#8}3H^T?IJ*wgYOU8M2}Y#!B*;?Eg)N@R}LOS6TpRQ~>9A&pQV{{UD#vN>XM z05||+isY#^9S=sAy=xg-Ux$Z-ETQoqiY$_MSqn#}%==_y0Z*Cb;F7;LToK1SaD69O zi2OqEjg8C}a_G85F;8_Ot1j6Twlb_ZW@gVURP(^~`S(ciRfVRqZ#5QuUwRmkT1g*n z^N?`l2Eob05;OVNW8x2pFr5qj5zS^x!4TX~!*LptKv5cPQ~@JFoR6Fn(!9CVrOnMZ zsoU)8Xrghi;m-zGNxnO)%Zrv6*sP>+-HzOT1m?PL4(obng;}L%g62?sz$CX;XpS&8 zxy~`c;8&E#tlZccAhc%zzVo`_!T$hwjynGU^{Wc!RlB*AnQlwW?SN1BPrq8_b+zV4 zU$RYFN1*Haoxh3hgx6EcY>weeJMLCq!)X8y!;0oSM;q8%m^AYtvt#m&*asbW1b}}E z-qCy^dn4PORzYVR?gVnpkcU3_>5p7jSK_@h;ntp(*5dv#M0AONR3qi93%|o~FHLU(&oc zs9Pg=ejl^UQzWTr10VPoL0)bBkt)L8Va%nlQ)%FTdZEQ8X%?i62` z82VLdwMCJGXOMWsWwcQ@2yj5_*OAjcl=il_OH$Ia3BwFvfVlidb47-YOKnx4`CXN= zKJWw;{-&8d<6SWFi#cA+&=0Q_Le|6W10WALg>hG<#c zNRumM0uMRpJ^uh2^b3CztS|(#whQR_JAKXv^{+mNTb9J5j=c2G)PId=vc#$gV~_5G znwccaS}jSn8|S*1$vd+#Ic)p%^{Rtwk^#m?UJY6wX2DmFkT@j&06vvnJjdn{v}X&) zK9xxn_B8C`CJ?N0bDVaqK$ro5#?W$4Ps+2cAQ3slzGiymagU{Kuu&6k=RGsVD@7(` z*18$-B4mTcPI>2=cam^0xhMPHovPGH)8+*6{JT{0L_YEobJ+FBqB9pQ$e>fd4l*&G zbK9`ytQ82S3&wMbLccd06W5-U<}JqFLHr2fw~M(h$cdCGCOiS0G0BJu}*%@|YG6!wM_}OyP-c zhrVjALa;dbfb0Ega=3lHeze`6F*&GuZdJ%nC6u>6tygHm9k}FG^oBBXaq}wl$5TT7j6%34a*zWE06i(7f~N;0oD6jy*s7$KazOR%>DPf)3i65jNCV^S~p32W)ZfYQeZ~ETM0g&>nwEueleJ zNyacbno`P0FMv|$EIjdKqrm~>r=>y3*jVLlLHQ$x#KwG15LGo zFIi)k%nAnq04z^o)Kf!x0utbWP8X*gbK1HXv|;u~x|M)s#^nTjp!DOePtv!v%?8U% zfi(?IP(k4$2Pcl_)AFWWYx-;2%V?Hx#Bx|jIbuNLC)4Rp=59AR*aSBB0hclbJaL2V zS9KX~<$y*a-a{4*(YgFNs}?h9k|LUPkp|%n)yx-QP}n7nvnT!b*rmC%_l5CAoGlSny((P@yHCsHhcCJ z%{1R2D8zdA9MBFc&NqHL9;RhBa99Y zFbKf>>oRNk zrygwRn4U=M&RYxaohRSh`BhBjot8b z*0Q2`5q!ntIU^mYYpEClhn|FE1X1nSy_v5hF-Cl_e~X^~0F^glugVkGss8}$R$E=X zV6%MK#xvXWrCZrogO*d+9_Fj-4GGdlnt9UvrE!j`dz!DT%c(xa7YSuQI3WE$`qgMh6M?x-K+Z|xr?r``qge>tIunnV z`Va7_o)#=}hXbxXD`;1fWJ;WDX0qq6Zk_5a?ya|}$9m9_F(1pw>BnlK(G2e36URTHW+`wEPI1LqS^FMGYRo(V)yJdR_C2kg|{{Yry)tHeBRwYm6Wat<36=0c0Z4;YNT??k}ikm z-`Co#Wsr=F0x~n-HJTiLU8#*JCuwZ@Q0Hw(bgpZ8#N-YLrSn+uI``(W4DaijjjkBu zo;%b!z_6|CZ<~TKgHBtFo->N){N~1cW~@geG5g<26jVQh`xJRYYMo^CP$tdh^y zlb-cydJjszcFZM3BFf2vNT&%hezjlfeW^=r{HfiM%9%SpI@Ap}IOpD=XWP`(X(hp_ zl(aR48}3^3!E7FalpOKvS&umfJ^Nyhw2*Sfv2#a9)!#!y~*p2 zJ5n2y$8IQ95Pem>O?I3gl}FO6naOTWN3Ca>zF(BoMp6kmq0}lEV`@1$&VRzLq@WOe zf2DHb;|w!aOtNb1V6g3*)4<;fWyqacsMh}A^T2HvMr=a%4}DrB1-3CZHQSgxcv zJ?m25PUX6q=!I+SaaF?d?sTzCNCPK|x#tz*I2D49R~S7i^kBKkKc#j;rOz^@6l=!p zPaj;?m9&mK{xzF!nE(&UwV_r3an`#i-uFDbLypG0Oxt%8pJAHNS#ykxfAy<2*$5fu z2DDXF43qV)C3Pf^rXPYt9>hGJ9gGO!1=Rx8dk(I$PvSwljf&oLBXUq^Tj45%nSfI=ytdS9y<}wy>m+u z6VQeRrM5SVxC*7i4Y>=uA#=~+?^Vo@nG{UK00_z`W1Jjul^uGT#y4ut%FG`M#E{^9 z-$HZOuSS^klT8JoR-_b>@s=! z56ZJ&R{-Tn2h%l|KC!s5&T3$vMqd`$Sywa4^IkIsJIAI;JJF+NXiCyGFsfDi%j@!*LsV91LToI6u;%H;9BC z;n|LMfJg(-^goy9R6^ZIGKyXx!HGik^%3>Y}P)}_d1pyD|B=g z^UTo+NGum{i#YN|a#?WPZovc)bL>w{$?jRvS>?$<6&14B8O|3u7zedxGO^&3gV1&q z6)k{CAbQlgg~o(axjgei>?et~IpC%^7#%_P{VI&|7Jce5k@IBdC%LNvG8@cNK^*bz zP_$egYZ+ag5K)OhUKmnX%qbz2cB?k*p#&VR2pQuXZ2ncJ8z$aC&*@5CN{~l2+Zs`^<-Ao%GY#znWmKGfDnGHZ@CHR` zNtMYpS?>{X!Oy=+QjAg6PIV=*K-jZ?4Fwej4^dOee#e1xFS-i(mS zqw7{8xO7aD$87Yhb|#n1kfy?TtohBA6Ix4Q5D)B&??Z)hQ(`d90;a z?4yK8&=*9WwV`h-7RF91oKwzgX3jte1R9u4+}6Dmk>2U@DBIf@;=L13xg|p2SDWd3 zW+8E2lcrdgP)0?1RP1m%-wh#d6in)dxq!`s!LAo0Tb*OuyfC_>W4 zq-{7OwreVnT?X*;im?`zHQWJbi;+FAbTG3R)UFPB z$m{g1Z6wahbBl`ZeHm%5M>IfrgE-*&)04y#7TTnaf0cPYh2~3*n_-bq7|R)Dz8Ad-;w*JX2CpB4IJl^Q_CkC9~jFfqFa zy%B1zjkk71aSJr6+d)4{+Ok0*%kXJ9poH9=j^@Joq;1W>t(kAPN3~D2al`!`H>+du ztmo8ZjqRTM-Sorb7W7Vy`SJ zy=yxbq+Pd=jAFMUnYQEBu%g0q*0msFc@>1>b<(JffbPe3N%pG=AYYvI9`#-_*ch!V zdl!|rwiJ8TJf}mEHL-dB0C^`K{VM5vZH+ngG%RSKmdPW9#{#5++&)1hQOZoJBHgYS zs8P`KTB@c;%L*-R3MNzm$9mPbwk~~W;xCA8yfvVz`O_S; zvBIJcyzT4-bKVs2Ux<8NewtT@H0zB*<%k<#Li<5D%MrqlazGXOYw#!bXNTe4-KUFu zLv=IjXoZEUFj#Hbfdmqae8Z1$J&kkXu`r_+<-bGH%kVOrL9txVOwR#e9`oldC>@nzQZU z2vdrLRgs-EfwFPQrLj9CC$4JYhB7*FOpYL#&1Rut^A{K^b?H?nfgEHSv4$)1nvIcy zkPlj}Qg77F*aDHq6%U(+z~Ze-6X%X|4ik`r zCYq)WW;4cfgTbooj1S(eSz{;f3|4FIU!_;GWOJ>^Hj;TX;G?%S1d_Nuw23enC#^qZ zFKCSzVY37HEY|8IP4^m$JxSV{J;SO zusG>oCwyG}m-KH3_&)E&UK!Lb?%Kes&jr_&k0kKS8A5Wraf6=K_p*({BD}BTPl7e? zh&~0m@ZN!_Erjw&k~okbF5x4|@|}k&3t;4T9PwTFO7$Tq!;B|d?f)VCe>j%nAwv2K*s$}Id(D%=6dmd#9TeS*pe{LOQ^ z^tQRz^*Y^ResY#=**P_G);Vq*M;aDpAS!{9N$5Vc_ME@5kBXWX#=EA80}zY0ZLGbC zZMg^A2kTy^@N@QTw)l0bj}rK<=HF4&pg-u5!MMQz{{WtuaHXFeG5}w5f-BlW+A%CV zuCApXRcr6W;~?yHO02BRFk@!{ki-k*0ICb%2n0% zI<}i&MZnxu_uVl>qvSz~tZgWjo&T0q=dgv^y%%pMksFZniW{~%` zBDJ+=#szg2RwWoSRhu0>O9YH^d)H}gqnMOCDP!+mRx1}6XnR;3x^;c-hs}Q+z7_uf z!fBu%5NTk4YiThv0CS10loojK0n2w^emmFZR;g_@n}(N_a!Q=@{&}z6Re?E4BL!Gs zf;b@c1XtvD?G>gjnejJRw~o!MAoD{(Zcz~gWkwkmKa?w+mG6$A9M+kBC)&3HGh7d_ zimIOH&lfjjou`j#=5K#|*(Bs~^{$rY7{J`e8TGDa=1BSDHR}65=ZPAZS2ErfFSoBa z7^*WyiGXvHTG7gpzTgfs$E{{x?^%i3Mn*+9OF=5mvFB3yT=zR|S^+NV7U&PUUlq^Zv%6(~SJ{{R|Z&4Z|ieWALq9)_B-Ilu&h zD#F`>n~y%!@oOOj#t#E09)h1CDr=z%XE_|xh-`|skhe^M+cdsWBc6hvAohhq ze1nZ^YG;Hw>x>-KQlhs6bB?v3${Ufv6;+jvMtR3IE|Jw7O^kPhDF6|S;+*z8ZeP33 z3Ft_xhCRoT^&+gHz}Uke5W_dP60}QA zQ^eZNQKYh-8wV`Wn1@Lx4p5>m@CMzGOL4|Wh-f+#I^F9F+sHKAC^ID27X$?gIx4Pr zJF($aK|T5cM^`6^wOu1qlfq_6q44v_u`rTG2$6=#AeTkkxR=3Tq@1;Rc*^{~>OHI$ z8<}%Gj%UWYZjYs{<u8C&KbgZ)pe%8Z4m3SbU|^%fkG`XE@Kjc<8;lok~e_ zBaU#a=kIcHgo1Ddm^ri~O$ zt!fuiTwX(QwIgK?85CqWEOGa^!3MZ%h;M^!VB8+Pe>&T-yScEmk_cfXrc6AHnZP}9 z>GiKVaOcspse8L4r?6=}K$meu5n4_1IV+wAJ-GUDS3Eu7n~U4qcy3`}vdDn449KAL zIR2e$r}#w%l|B8>_K8#GD2+m?W4-bK0}Ovk^(eeur}$@3x6)x)&Ac+SQ!)UPxpR#9 zfaCx;INOo$&3c$@962uDho4^)H76908}SB~*Sd@8HWv~&w{4?oU{?e9w}1va^H`o8 zg3i+V@wKH%rE~%r2w4<5oRUEYCj%AeUL`h`I<3rFjg*i;`;o%@-I@5se) zr(V%g53$-?2qg?zrA6G?9fJ}`_^QJ#fN*7<-i>E z+M^f%anlvMVW{Zl!7cv)vSYctk%Io{!q`WVA2E^>0X zJY&}-NysoqAHBQG0SHqM*}pm#K(nV3FCv>f(>hBUASf4kU1IPo;l=J zm?(hY;PJrVxL_tjolC&1V?p4qJgiI|m{_igM)6}qIv=4B*NJMD~fjF6(Nn|T;)18>*Tw3alB zgc;A_-}+R6gC@dG7mQ$Xe;R(yOipWK6(eOV8$T}u4E}WHLRaNGeJb?Ph53&e$sV|> zWmqxXa!z^-V>G!nA2AGM@wD|g^{XCQs2vVFob~-GuHpB3k(_;L{{TC%D1KEO@tW2M zhD{#jloQkWRl*Rfg&^m@am_*VXN;fl%{=9@a5*`^?TX)!fvCU&r<|YV?NX?GDr9sx z{{R|Ac%uNHyh-D~)~8@I^726bbevdRs8x`hcE|Y@9_8vl8ShrI-5)z~+n!Hqt11J^ z{nNqEVk%k-mECeqaqak2Z?tkoTem!Zbu@!x3}EMj?MS2@(Xi{>d(=p{?o`T=wDlba ztwuo@^r^hHEZG?xVE4$U{HhOs{b&6uf1kG zE~jjYKpcVrQYqLRkzM0e5IDU*@aPg;6M2{`1D_lG0= ziYym1zzx(4lgD~Rh%e2IA5Z05N|@6+^OOIUx4x59?FOIhGbjcEKR*2Mhe`8Kp0TUzY^`0G_m*ftNtHc12zQ z?mKf)TwJ^j`-k~Db?cwXphveMOvhl)QP+`9nc$GOl%%gfTd&rWV9tk6@f`8l&tk}} z9K&m8qMpn>$JZ5wadov>Llz1^1atoY>a6uppq_UB06uA|SbK7#E9smZW9d&)4+?gVPo*?6$M+YU@=ssWiagTX zJ`dx~09XJ3zu{7$*(Q3H1a zADT0g!#wxJbI~x*&&Ec0{{TLt=bv|yjE3-q+$6Vx9*qsdj(XB>T;Pg=QdfpKZvOyY zwGW!W<$Hfhg(S+J7E#ffORr&@o!Rz`~QM(x0oeec^vCA6Q+AWS(hnv*a^MfBsw{;byR+iHxFWct;uMIH`4#G^d1bp|0~H^_=PSiwD#+}P6x#EEI49bkWLD!f ziYG0|6!9}-BRy#NTl^gq)DnF@0!TF)XTQ)mH=P^cmvzoyydld#zQeZ>L%6Mh8*M8 zxawwiN2Nz1aCbWy^#Fcgp+F~}^VYLu)tyNM0J!Kntm=*mDd>$hyJN^W{Awq-Zq3JWR6f<_GWnPapaQA_ z@ISA=T33}!jIo2WJOXpaxxoHHq1Cyvprg>4r^1b-XQ?^Pb5X3vlHBBdaB3HRe&_?H z2mb(GlX`*&=~2whR1#YkeA#400flxKILMpeyFnK-Q(2U2=fLx*nlgwfkhcGS-?6V5%U zg4u!1Y%E}$0sjEjt6yd5ftt_Q+|lDXOt@{c$*pKDa5GnJ?9}|HiqwkG5;?&2t?AHb zmx#wLu4YGSTZ2*SKt-sKmoq9P}8cHMD>Of@`*mO^w&&QpAh{*iu|+4GI(O-n!+7 zcyse_*thLqPR?RQ8w;?Ribg$ zpfV0X6@-!8uE_kh!8qwqIRdTjX8A{YZ`qm80+%VGl3SSb{Ktx|uxp zoK~pT6MlCQ{VQAa2+2oNwAA$&!9H0S#t5%B)mg42A~Ar~&_yhFnLD^XwBck6hD6=& zIiVzHQlzAD)|Q?_d8cp(xA4}<4wwso4?I@H)`mseK^>23ir-Fhb^=JxPW0riXH7J$ zZRjf_0HLv(?Vz%dVYwBLqv_!So_OnBg37UxxbP}e7UyJPa@DMIU?3nKwLQRXq|8C8 zpKDR~NalvT=L`V`mnphwD>h@?G<(LuliL-eW@W$(yJ}d(EdKy^--^4rQ-x7O>_U~D z(<7PWDTm7sYLP5sDjaf8sjE?x{xUK2sicW=85<+ovw9mQ<*5T(DnQTBiu0{*ca_8e zK~vP8qP-d8X3igu;~A(MNseq}p)J!ZoYXd4la`h|f*VwdP5u3Ae%X~uwmNij9XiX+#;NT`BqNSS4GAglCxGPxwy)cjw_7R z+(-!(*h^_Lp)9-~!nw<a=G#kc#~lS{ zDsAjvv`cf1OH3MjTj1AXG?K%2YNsZg`;G?{%_?mh#-e*1^23JfT5v{c*syirjum!@h)Z>H+f`k* zr~{Ho>;UA~o?0UZ-Z%rNdi@6djl3P5OHuKrsi%gD2!wVs%#1&J$L2ATHk>FRo})E} zB1)AxP4xWFQv*R(s-w{R7vWFB4+(rb(QN+!v-Ieo);`Xud3G73X(S*Q+RgkWhX4Uy zwJ`&hKGjwWhbni0lg?deML?iEz$ zu4xI!Q&y=XH(2C+SKyxsc*H_{OQl-sEo^fWPZ%to!MHd*$3y8{Cx|`}d^^{z;IzKb ztr0EA^3AFXW(q%tbX!SZV_v^01n1JLkfdd+wv^`uWY0elN}WdBk~s|z!=4}T%m&*) z)2+1hDyrT@YK6j#4a^2u`;tv;w5F$=CsnFX(>1cZwP!Sa= zCm)SqPk3^9toOKO$RyTm)3G(uqHxNiHBHHG{c0mS16jx>Z(eIg2w0FCtveZ~a?CQw z$GvY`#_UEY)AV_#BWe>~i>CNsBB_~&;mu=Gq+_|)Lk~H<5sjx?xgZdGb6%IESu2%N zK)}z|p|#SXgn)zduBy)6AY6a}HREG3DaO%0i!Z=6E6nIDEp4M!ZKHK<$s%mvS2C9y zcpa+h-0mFL&QycF+4Yc`O3@uN^T@B2KWaaR-Wk`t5p&}!vbMUWlCi8)j4ug&w7e`iDo%tkUCQtsB?$H!!P;MJwE2OMI($3yrj@gH5)rqOKtJ$f!}#_5)L z{>+h&_MTFUo_HC_?On{jvmeDPZ7zLG>1s?3BAanCH0-hUWl(-#e}@Mr)24E23E8#x zoiO&&S5bd)^5SXT2puZY>C7J>Zf^)+IU$c5vnWt#FWwwu`+oipoq-zu~p!rc0U;&(;&y(J~ zymn;_D@xaF_43@E;^O4rDo5cinczKdSJdtFoj%4}i@UZd3`htrKqmvHcm}#Tz7*-aA&F>2(=d*iJWkwa9cs7PM{$AcT{Xf= zq)LYYhIstBssWj}Dmkp>1E!p=j8?N?0a3y4MV)}YYloI)wzsu`=bAz@@}UE01Cqsv z1Nb9D2UzXxzLI)XAMt*{?wwa{qR(h=3^pH%m&*jBq2l|**8#$4IV&ryA zpH?98To|g#9_rloa2Q!seBBQ^@Xn%|ta8ptv$nBsIi3D(!AR#HFQz);xZfT4&fizn zjQIOfu0odM@xVM|-lp*;p`l({%l1*Q@7o$6+O7t2?0WkEb6$SQq{RrC)tcpd=PS>) zF<&o>cXxZAZH1@Gt!)f@%|=V+RgFRu=y8sC#xN>}kt}k2&6eZep7nm?Pg$ThHswGB zWmxm|AK_3zoR-Gs1CnwwE5?#%qZU|-_FH18_#hmw{{UW{bE{mibn^fXFm~X9`DgR0 z)5flbO{%4aF_Jj#R1yoR93npeMW13 z%U^;MF_f1{v4`8Z;2h`X?tN>{l{U!nNW6oClhg96O)+uh#z+c3pJ7_Yw34!9I7RM` z$Hg8eeP(|pQBOmvH!97T-^8CXJbAiAT=Zt<|omRMZJ7bDMQyIr$-mhvJjm_Lpz`-^^yF&!QB>I!-SWL^i zo;d^Ys5OhRD-}jx;>hIUq=x004NUF36s{DpgQga zlOsJh0seDT6#Wo}}RBv^__TWdv~#Ph)z{3}l{k1>Y_ zjCRM<6`vVMTy6!EuN-siYe#ZQ0gROdbSF5+ZrPxug^3lp7*23oKj0~XO_HCJdXBqK zCmsFjFD;`|3oi$O)BgakO$j5A;d8+H8c7o;V|Eb>;o&2UbNpHNuB%9R(2(SABe?x* zi?@jsha@%!JaP}#yA38FU2uM!f0J8Kc9Jrg(m4w#1Rj43({h008&5-$GHGOPd%iuh z)}!0Ja83ci=f7(8IWBWH)3G25n^g0-XO5qRH{>}01UT+TKjTAuqmWx5d*FXcjDS~p zCj;^4y&lg&bLugjh68d3psKR@r2M$gZ>3%v$m$4UNj))D+9d#z-!bStf6vyr0(yX}36$75U_WuATtLJ}TsRxhNua)ja(87$z9fttaQsn?e!2t3x#aik% zuLm6aijT=sS|ijB{qtGPcPc98Oo_nT&Pb#}r2hc4KMrc+#z)JMka3!$CIL7-4@$yJ zxS|qBb_1MqN#<<@N#OfpkiHz1Jv)7B7dxA;AYl7}SzhL-|JVGxu(o*_OlqgEC$ROc zS#u1YT-YRm$E{Gdo=Y+rBiw=3y>y$~gq*r)u!vbw^ak%!WU~^(70Wk(n}jJ?*uuBtaVQB=gq;wPM}4w{i)|$0roA!!!41!*bDw&eDdY1%pP;}YPI7<3 zp~!Ybv&>u=!Ol96YM&V({J`)z>DsK^Ph=+l07g5Mj9`KY_4KMzGUEk)Z*$X{mcfq% zFLF0@!Sw!=)Sg7cXE;4NkIJhohj!9CkPmTAX!-raGblW7A2IdF98emTi+PI9$7^=u z(yEt@m;!-LGr-9I063))$Plq0=b!WV)NDx@V}~P;$NA7Zh|X9Y_{U+uI293Lw2(+0 zPtuXmn4b7ON#~ksCgmiK2l)Lc3j((MbA`?`=~Bc-cH;*F0~n{QNEKN*2d^}M6ksxV z3xG^~O_j)A(Ltpg)u%7c;)GlPu& z6wj0lIl(;#`86qto0TAOv~K4VNg67WL1CW#N8>;h_MM}Q5I1D;O!=7M2X0Sa)}$$s zwla1$Mh`uGDfkFF4D{LpcPrA!r@094{X!okaEX>FmO6zf>I^O<2m&8rjS_%!ai;e zI^cRx0Khou(BgwRA@Mulf(}XJn$fn9t6=1jk8IUA_+`My9FJjIu{>@Rl?uvw{=C+) zW^EVK5*+aTPq-CrS8QZ~xEzz%RRje?5OOorcgO2mP|68S$ACE);~w1P*3g}aaVL)5 zRd+baVbE2NBt#URS-X4sRDWrX6S(d?^uX!skLgj|YCF>a55#|;(z~fwvB^@6z?OzW zpaKR7Jw-5FF7SF|)1I{eluMNxQ$D@AhIBf7~hDJFJ&*N3?L)h6^vv9+bI^&*49-S(fokQhEUteC8 z8^}mGyTiMi*`FPhfIymwe0p^W4c%^+nB$6WdIB@}XEefFjCQF>FUeDYGfEvxU}GOzpKfXO3nB(A-*kUUjaj+RAB9~JoUl+a zoYP%7P!7M%cO} zaA}geFg*3Fh~4w+R!g2bRVlWJbQD;U7GIk+U1cQmQocy-RL{%LTEb6Lrkr%tx*sQu zcB>Xwt!;6>JBh8EYoV4BLxqt_u*#8;%1V*k5;_{~z7}|T-^89NirW6#ON%5&Y5cGV zP*jCxCx8JXlloWKz8LsH;Ja2Yt!dE3ZG44fo;e*%D8Wa{c|o3XG0#FyYrhMZ)U6L_ zoss2ZGfGq{`xcva`@K(wn@O0W+}mZW=8{CWnf7mC5{D(DMq;EX1-gOiYO_FOZ|((#aNI>2k@-w zQ1*H@idEe8QESPRngWb6G3%c6+yx{K{r&3saNm2HfUa2MrDEf4jTJ`sDYiEdJM=Vw z?dzU<)X%~CRc^muT88Xz7j#V%HtN-gkUfoKBNRN=ymAFVLCtAR_c`%5=xN5|6>Vh$ zfO2Z2SdlVt4_Z~m?DLUbX`W1yZ&KsVO7Lo_JGnelInFxLka0tiDk*GNm6Vdcm0V+> z?Nh89+tl}|B7~R06_&44qna^7z%k2Kv`AQtQo(J<%s&d$jv#<~S6w=1nTW2Q!bJf% z$9mX?5CC5F6}(CSB-WI0{{VNTcS4d!iHNOsO%zH-+Q0TF<3!+BihEIj5M)S{zA=UKB3_pv5!nHxh6Z^InW}2?GGDyFII^(fl|u=1PM- zfud9nx)tv1j~;_TxMPr{S3_r@$&t7k_j_Lq+d7Td9>7+p@Xe${AwfN=hd{Ls6i%`?9 z;bV=Zp>Pk- z%;ol?RPt#3i65L|AVyap`c;VHorXv!@UOg6;m3jn+?Q>nz*<5HQa(UO_g6R{g>|s# z8X5&y^y^)#j1MI^$EOui%@W!sYbBJol0Q5x^y}&J_OM9XM&{auusu!(73unS!cQ9N zwh-UjY0S~io6|0c*!NaoMtfJ>P{#~N7ATcHf`M1!X)+3~E0%e!NASkSMI4Hne*CU} zYik-Fui@L))3uvfZDd}lGL<;&LFh-g$f}7JN65r}HTqYp=$bCQ5Qkl`x4u>TzI0*A z=g^Un_*c&tKeL<%R2McHxl2hTC8213bV7P71|X5!BDJTPLQD6WGHYbggS|ab^WTMh zJ9pxJe$PU+l_HYu_6a1;)#Euh1lQXB4)`bGp9oHGbtg??eV{MeA|704xl|;AbKLV= zUIX}Vp?Cn#ErZK*J-|@%&#Y8a{W7zBG zqWU_Wxj*jbHRN!7E%C*{kS2kt6BBK4ZQKxl5zkuvK0`0v2Oq6zLX(C2!yRj}<`at6 z$D2H=l;wD~kApln`z`p(Q~|ZI4w(ZC<=jaB08NO0nHB0W{>xq!v9oAEdz+Swk2TjZ zi81$rt{WNbTE4M~o-u;i6>cVCa-%iDJjW2_zMe;+PbtGFS*x@12gd&Z4{kgqs@!Q; zFse-n`PE2Z0pt;acwx>DBD~6NH5JGsABBF>c*Ehhg*<;~ZMCaUE^MkzbjA5`GhS!@+(cxzlbm+o@m@?YFy*2Qf~EJ4%s}k~?Q2y$n7rRMK0Xb}IoY zE1D}q!6egFvyPQYTVWp<~GT=wu&2@Thg!j_LYXURK z>=Y^tu_v$ty=B90%0@x2yZ-=WFNfMrv8_$xOR2<@=&qhkqU}4G!+h=tCj+)S)>UMw z!OiqKaFm^Dikj+i-VObizAbB)R+8Q6KiQTNg>!LxDkj*;{{Wt0jG4z`qQ6%34GT~3 z--k5s4(Y)b8wgS*!0J?T+;?Ni_okVrng0NMOlW!m{uN-bwHSbIX6i`(mGc;!O-jir zXpgnRVJYF0;`U=jvxp{<9&k0rsEoED9$C12dD#zfgW#IO!RLJ&* z?X0LqG65Zh7m|&*7{Tk!WUNxeM%sL0M z=9?lGPAKIUG0n=mc{K*^c&pbaMP`=8Z3yUNDGg?B^%;LkdotpyNa_LOHL{75ox$Hd zYNWG)#SHoB#Z#Lkb6UoqbDpI~(1J;i;440Bpo5yQ>c+C}VSIG1m_=Oks?J7b)#J8t z(y*nK+a#P;%$BbGh|Of&+De0=#dX0YvB@O*nA6FgwLzgX{GzPRj14j(>cekZ*&`Oa znDgk;x6GjPS)bU~VenIm^!qzGZomae865Pko;?;YgL3mw>!|KjaJ<^1#_crc5(JTJ zz0-U-WiSmOAlF!$BrL-zpTfFZEdkX=6KM3VYS_4?xz&fjNxcz?1%7>eKZM=TnfDgk0rS|8P9&T<GGpFVsE8PtB&J;|<%QISlp7bSD}*Eu?k+zu=5BOMRSN&3juzjU#^yBtEZ8>}qt6W>i=I%@I zmk82=fmH#GmN0%?R-IyCF}YQ^-P{wB4@_5~ zw55n6iqNzy&J-~MzHb+ctt9U&BkZ#L6$NWT@4Ghxq|2OeJDP9V6!J!W2;pXjsQ@XKNLutVs+Iph)A5LZT{+0IE0u4gdn3 zb1Opxvc#&+s##Tz)g%n^aBw~FYc@H#z^-@3dd{Pxcwbf2^vDI(&8?)e#|t*lHVhq}!IZ({%Y6A&4*_$N*P;+f11&2rp4vNVm4Ryj3QF64Fqn*B2mg^egE#b}SnaX8AA>N&~k z&h;+iVYoI2L+e?$4+HJoa5I|DwYX3=vFnO_)5Wx^4cYwv02=6pEleEWLoZP= z9FxGU-87Zn#l}ueMQX_aws`!92RY%Fx8dHIWu`UN+;9!sS->PN=D|IObLcCWi^rZ6 zjwxMQ;z>4qjj$qzEC4*6%rTw@J5uQX02nmwEL=2tTz7YCksPwI^3j19Apy@!^(1>9 zmF41b^dOz2eFg(3#LeDO8{!`v$E0h!ygwhjCs_a zEnAf~LMD#Xp;AL+vu8OuKZZY@VtA{?SKcMoCe&^cGCcw^JA zt$byCT}e%}^gjOp4}^qZm9-$cCQFAQh(dGMxA@cilvv3@^7iNa^r&KNDQR+hfJQ}3 z*Aht*S}6uC+1u!TwZiWAJELW>QSUsm5Jnk+z~}%TyyqsVG^-fwMh{xbaq3XAy31-zO}0ej1J3Vk;*jf0ZjrIIQ6wvXN`ko~ z8RwBuM(hDlpmpn5w@o13<}o0V#xuaIB@Tt%1Kv+GhICa)H*PF>$>O}E z4_ejxC57Ievsy7(!h<3no4eq0PAa&vyS=uO@S$iT+8Ou&1CGP%StQE~F}9VX#{>=u z9mZ(0VR6&I@u@G6PpHRw%pdJ2AaRU!#YrPOKhEX1@z1|*dVW;jF~${epm+8Dm0YFh zM8VrERD|dW?f(GRsgr+}Hpq8$<2(R(??t(hBu116ML8(s;fJBY99N@Q{{Uv)K$q6m zvD?T&4i|A52dLaz`PI{==Pp!4r(|&wX&Tgt<~6*|rFU-HdUg6%WOkECOkoO;e~9Cs z#=TvoDA`7AliH_S=?s2Uf;m%@wnPlMJ^2;UJR|7LqhGn^(0FS4^4jL{RHDOxa5AKx z-|`M=gZFIV5%!>d;SfYayQ1ge?C6d&|HCdJqOHS4`EPPri!r;EHaf z?pz!ZgMtSK(BrSIX7H5~xu>^G@W!@lW@sl38B#-`A21;L*GmSBsRTC|c7owIEUBEP z2?rqXNc68qy71kOx1ee|y1agEw1~wpM3|E}Ba@NGK8C#F&i7E#q*Q`uFmEhSV1w#; z&uZqBWwA=4E5)aIlCnc0%2560$m#9JG>;U}%tVMY)29GeL2q|!s9a^O_Q=hh%GltZ zcMK4IqPF!NI@;<$ut-MG265N?Dyh?)v`CjUw>XI7`Sz&?b}}oh($Z973NQtD&rY>s zEk54Wf`tXfIX#ckwyofK2hMP#o;lCGcTmE+-I+?NL~9dd9FRXcu#uA%dY<{>w369Q zH)P|usV0E0&BEiZIj>?g6}3F+;x#agOuXc%=ilj2K5%jg0|UM~Rq0kj`-VPW>E5f6 zEQ(8<2KDL3rYXvbNFi44#b$lj2)HMV`i}Jf04OKS-48+6>qA8mjhME=8~8>|K+P~* zjFIX+J;iX;f@f?c+;L?YNPxyOjAQv!O3^Zn%tsu49<>PvB=hOC5zqesTBT5{)j(0n zTEp3DXs2;eJkI&S=sEg+6>>BYONRM}S}k^##C&Ir`yZuC_giT1>(aNU*^yCoEHq_K zdXB#MHBiQS=jc6iTQR98aZSzF=I@bB5%9pK?4Oq$V?MReqoImg+^3k#c-zl!psI34 z0o<#Mj0(NA5snDJI2`lu=~2xx?b*jn1O63-NE<>%G=wu1#xOJKkF8Lg`DZ;&aD6KC zs8)Fg0QL5)+lFa4RtJpWj+MnN&V-7xk^v*{dUhhJ$2R8LayaTLciieh8OIo?V}zC^ zhR{!L)hQJ8(Erf<$Y7=Rz5zUp`c`$sRivG^y`LMW8B9i`eas6Y^FnFzg+uQ zQ=75YqjFc6#8=9Zco;byefg}*-D2ROw2jNaz%v3dwXx1Q=}nSX+;XEQfOGyptl1ZE z8wMDTLG<<=YbNe*7}*)}ZRI3c>8D?!w8<@~GLC$AL9!-^1LlGLkg;1k?`4l1)pw2=Js$sNr!hh|1M72bLteF*;m8cs}m&#(FGK`djt9i*;0k5B&qT}E&|Z1R17{dDyuxdT4F z-%5?f>>QGPC=i{w>NC$lk4|a3v4AQ4k5Y@qqnc8 zdVEWPxSlY0?mx+>lsb`*ynoN7N_k)24tjyp^`H>D$C!4J#(k+;<;lbU054y{q1}eS z7|%+65wZL|^FUiuLN`?bhdK51IIHPCPT(-O#~ajAJLi{{UOovQksK0N|cUsrL--Zg}lfnUt4PN9_kV1h#+APpuwq z2KGHW6WX%F=h*Z0K9v3PD9%2F{{TZ&q-SGC&LxzF$EJUlDnT(MgU1|JdYp8?&tI(@ zoB(mRC-6NwR*F_LaJi(iWbMx+<3Hro=`KF;10SVi;$(8J3cB!f*FKo52o;ITV7F@P zrBuRn(W+$HKn=S+GC#tlNsmw~Fez*d@H!uQwyMZLJp1&oT9zRmRwE02jUTitF4NTG z>s92C_Si=IATT#mJ0XhV{Eb>^ikpav(8e|nFs`IYq; z_9j!*1I9t?NJ_9OILYFwi~JJ|D=|EhlJv)y|gvv4r$NvDTrg=l{91XsM1pRAotVtYlz|wsR1h(Qj{xvoZ z;6iurQv9I&*c?=+%iG86Ru{6 zpGv5R(#Wx|-eLzQ11H|B$s#ZtcsQtkh&k(?o|H|aI&hLl*FOk!8#^eiEa!+>>Jqfi z=d|o0y@_^^p;TqIkWW7&0rH&YzOlTMP8wqA7aEnepFXD@)}Q5$WQAm4M2#AjWFR;v zb`S998OP^$f_!y-Z>woqb5?K$PA+-ouk)i1da|z74#R3d^zG+e0P6i zrCaJ_RMh~x(yuI~4%0@6#gL*D3K$SdefYM4^K)NGg~h?qQG(d`tX>MVD^686k&~LA>jwNup4OHxeonw`ueQXOV$f<6x^UX**b1Wk*7%v!xsJ zKRv%gYhvAbJ!C$?X>#^Tm=}#Z_JXhl`I^+r!&Qz#oobM0MG)5Eb0GtZ@LSZNAA>XXk(zID{#`lQ^ha`0&qllKmN zg=?mUWZ@GBuQlr$PJ_Kv5`Z7hyQq9MrN;<)Ns-S$yjE`$6{0;XK2s+7ne)Ut1TBHK(lqsu0SU)^n(Xv@9UIJzKEZDzh6PoVcJE`}u&ImX*z~aZ zJ>R^~nB>w#1La)z&0n;MzUYjfY**;sulqUpLteLsP_grLiRO)7SYkeGD(nF}L;S-B z{j66h7wp@jTM-q;r#WrhvO=l|{7YchpB(0dmG7zSf2-JtJrcL6@myJp1gRd`tvIe0 zPn4!>>zm)%mrj*IvDT%G=bttJ- z)jh*Bj``;`0bnWG+7y~C22s+D;I}nUwrW&3_orYkp&90{#8$F*RhXnArco*~v8=8X z{G*D!4Ef;JQn<%jnH%QzsN}h)IyOTBdU0AXEL}hu9qSG`2Taz2&Z-6tbJV8op`xi{ zMWP+5AF>zZnvyAlb5~;d*biFeZc#dE#xg1`yl5~+eRE7}NL!!)n%x$Ow2<$64N>8b(rv&sw*0w-6`D<24ayISjO^#U9j()kOo2ZqE%}*~W6tf7yGmetgQn@Q$}IP5@uzomO= zyo|9RW}-K$IL&Vv)sE64NQcPzwu z4C1miKZHLG^=rv*^*;*fR~Hi;$t&7MU5}|dc|P^si_%;HgIiFyn3>4tj%t_YZ&I44 z%gM^Dc*H*ez7I#{0pSfW`M-NG=O6BZPT#{7*?2eM*MocqZ*d2Nbhvcnxqb5adx>M) zC5s#m!#Ez5+cYc&?$snfboHuon^tc_H416oF-zoSJb8WHaZ^VJnA@Abt!sHmc*it` zH%y<)iiHK#)18$5&Bqw}P=(;>z!h*{jz$ej<*68MMOP_2%&uj5RDytyTyt5?3qbyA zoPv18Y|imUSP$Q5ycD~xyjDx{e~k~*IBc5xbHaX+^w*bZe^{Ddi6QypX*jXvz3$I^sPjU z9;Tc~kEyKPN6@ch8)|biSTY0h*FSS?%ugB5YVRhNJ)|5O!_#(JVz*fi2(6wWqn%+>XESMT*8cz~7_PHT!2mGN)K;~=nHgNV zhOH#FiaZrjkz5t=3Fvw_Y$J=k#J7PnxS$_}X~v**#a1i;0C7`Bayr+UJ z>Z)f4zcsxqap3MBopbj#;d01prkYzbnxvmXytfRs<=++m0O26N@E*0M_+rrB>NnP} zYYaisJbB||He@QeRV4M#rFXK(<%$qM9r)&{FwJ*Uf{Ri(E6L6-J_&t!#ovIly#fBoi4NwhmMb;Nu7KhUVX?U!{5!D=LxZ>UfyE zH?fx~%qkvu>F-uxJmmDLngO1bGs zv!^&Op8czwk2&JD?9?aDde_ZjSGv*md3${5>4fY%)#&Fq4P5d_Sk|O2HvGg2@as~s z^%QEk8);hHWRcj_&60++9z1B$qF}w@&4XulG@Ng;CH7%lMb# z9WO)hcCB@PGDo`3WsMks(lJ5+QPiB8q45L8PvFf7btSj+{M(3aw;2{Fq4St8nIpDv ztDZO{oB%nm%D)u&uf{$y@hsN*#-Tm(hm^$9N;WD6Bjr(m00SiOE9f$;x!0dOosvFd zJIz)a3Y=BjJla9#OcjpRX5{(`gsid1e3esxxEaqq`M}TRMem7x6{cOyX>ol#v)hxr zMQ{7E%6cn1E_3UQaryES{7*%g&*A+vD2tyy^}P8>{t~J-pvR#Np8QwW&lL#0Ha;ST z0;^VP&&>3Hv1(>m^KR%L7$jpL`U71o8e}OO7mOJr%P<77#(2+cp0)8-tKuDJ#2TaO znvK+^MQ<=Nu^SIus2ndomC)V%M)9rvkb>g=X(3=^?HQ4HIAWnoA5wY89V-=?B<;$2 zRPuZMqv$^w>h?Yqw6wdtf$t}|-qIkDCz7DyGPop$+$8La;R59$Nr2Y~g+u97x_ z(s&$&5nD_5WZG4TK7?({vz&4TeAzCgs!L+gT{FBzw_vvKm;=`&o`$u&GvX`#F4he_ ziCbZMx2dy&vH%d0KZpQ0$jIj%O?maP)2mZohq3Qrvbt1g`>OKpQMiLgwG&AnoXo7@ zM1%kUI8lW?PkQ6zySGb?*0CkH1Ogc6ci?kgzv7Pv-yKb0g60c}u0qTfCf}bkk&*@% zuTD;D%{5zJ?Ab0Ybp#7EOi;$SBX~H-BaYSOVji+~?ud6# z>zJK~MO9n@pZ10;p79Q`r|LINEv<}pPG6RcwfFw57`$r49v2nIQoEEDJ0zEp(N2Pd-AlILnWH4u=GDJb5P>5ea4<4@{{Wt~o~%%Oz=MvxYmQK|yE@}5nk#-c`%Y#LiI0;*u-7SFd~-mtF%IUr?+(zR~fNjaHD zHy#I3S^9$QP!N)F^Jk1!4kpPQ-`Oy&IogW7iRx+5zQ$By7k65H(um--y@}am`th_X)2O?o@OT(IL*Q+@vH9+-rGvi zPNQ^rR#Tn|@KoeyAl7V}dm>~g-`}2lji}?((p#QOiB*a)%MNmRt<5e;#K0*kq>aH& zLHrJXO6~7FKVtWCn+b$g`1uUTNjM!axyL@|>rum|+uBB(fHDEg4_{&FSVI9;`mGHm ziG$Fshvm0pKE1^VfmDVhp4?W4lEH!edG3D>)SGsF?hml;YpzhS3H2xz1$vS@3XGg` zp@}D&zVL(dZ9M)WqI3?wG3orOTtNgE62rY0m31o0$AUdQjZ=os*;u$7`kWjeZ%VPS z2gn?T<2;;F?+idu(>?twDN|2d7MofPK#Fn{0!BUR(v}2qj(gM~;PLZy`h6+GbC6F@ z^Xpd>OqpRKl1T|9=RIpm+TG&{#POazDUqQugpZJU`c|ZHxKbM&cE{melp}3=9JO7^ z;yX?sBPXsu{Z#oF1z?~P)97jG699d?V~o_RYWX3C-NUATt#;j5<56wdn6n4Tz}kBH z5m{}JNhc#Yz(1dA-kLq6kOSu@*ATqe?OYP6t?S2X2q8xg8w5k6e!jPc*Ey*V6`7dQa&as7JLODl-go+gYHVS-O5u5dH_ z`qh>Z1vxwel?#vOTg90)QM^JGwl3kgWyeL&(>-e-tEcZDki2B`n(5lyT&av5iHz*s zwK4}Cc_y(Zf9g8aMy4>$+uR;*x5i5za@py`@P6tDmR(2R}GuTc{(YI(Y)8$a%;I9Y0FWGc`LI(wS8RX-?;qQZWylq@D{{RYk3UW>W_C3CWo5s%I z5_#|Xbf5=<+qpb-`r?@38FP$qdUd9&0Hpv1o)8c)MkpPIC{yzx0~}(Wz~Cs(2PB{6 z_}4`R)`qqpXPU^hz)}p`iOJ6#XB>2{ZcC4th=wnh0!x(-;7E z{{ZV%Z<(03dCwnDO2T33&5K|4k|j&oV4xXB!x^*u#B8L)GWrz3VbA4+ME z*?nd8{0B_bu`?f(jBVr$b^38s6oI#);}{%%qNVfMR2<`<>E5d1NW2gMlsQq1<3G}* zXvTdr)OD(9KGHBoI(6w%iGNd^p5NA;$IIB9VQ|2bNdSs+xmU>~0DGPdR*qsx$^5_l zRH9ACVHhBE1DdrXHxqD58Al;~aaIh2ZwGdN&s^3L%oTQ$LC-(rQndKUMm+T9wT)(o zbna_2f<9x;c=}Wal7AtNywwD`#DHTU`uC~Uc?cy22|ZV*>%pxSCP>ZDiEnUHp}FhL zFw5nWfN&35t_ri^vBytr)V@~Bg%gs1<0soaaZ>RzeMYFqu_9gW2d)9&AIh9$B?%`u zJY(LWbwpwi?ioDhqHF`kN3J7!9y4_>`JDp2Y&dw2B}l8i#(k4)mNsW{0v&tcAMWn9hDGJ4Back=#Z0mmC^3zr^%R`$D_DCd$O@#AI|^G_k~#3|t_UM*eb7$;oDtKl zEAm4l@_6}rfz$fcVt^h9Jc0iJ>#m44b5^rO$)ac_^1%!`@Nx|`c^lJ^lpjaIis|*gGRfA7}izuOvD74SsG2J%0futzFqtb?%)CHV5mB>ytY1f zImUfj7Kg;oCAskZlzOw;>2k|(kq~nx*vn&vPEX(8!i;mrbBg<`;ctty+dTr)Nt8`# ztY}QPB3Zn`PneAw#z+hnJTc1{^R=5D%Xv?N^vesBy4bd{T-eHpOwt!GaW+oy&O!y+ zzccROkU_yvJBxS|PuA{le!)DKWs+pX$_vPLHs;63%d~u_aRd05HT0M~7b14*d>&() zN^(uBSmJzNVW{{vZCAyqJXddW@x~t91u(VLaxsf(*vpJD5(Pe=#a=t(Um5tb##U`} zs<4wye<6}*jTwZ{LJ)+Jg0^wXsBV7o2EA{_z9>ynTU`(P67ug*zj)v5ak2>9DLbPI zrOr+=2mq3LSI;+k{r8A(-p^4~wX!mn`#riWF{TOVsue>3Pdj-%tB)G&{hDW^m9A*} zc}Gt7>Ev=T&4589=dNpeLh#11;*Cz%Ptz@=b9XXEgaMD3_n4q6dirz4m(o1nQ z^l30MD;5ia<}y662|~F%@Nz023;ZwmbK>1YR@T<)8RfT#+>0M2tnBA_f{CMwSlw0~ z#f*va?E?VpUz)ueQSs-9v<-hyw3AP|lE+jHG`4JFl0j_XW=L@4D-urD1eIaHW17$S zq2u2O+37dBXNPPxeHPaGz?8IDp%F_VeV%O0G6)QyGkxY@q;0^jQl%<(wX{czg{?Iw zK4*8jeSfd&=g0mp(6s$4#21$OS~}R7q&BN8vCSgIxaMFDzTfmt42pFr%sS+;keMqNc zY7perGpN#uQ@1(#*I#QoM!;t^=eBofyq4tg_*V6_``@ldTA3!#LXBAR=y#~`%(Wuh zs`5M5J-d*K+0AMP1Om0qJspwg(R|yEdsLlDu<2Z$siCr;lw@_T?#zZ#JBpe}go6w? zsOD#DqZuQ`Uq+M6AGVlgfwK~dSj(gYi5b}Fee?cO1BO;T#Cwi?0OWGW1~9VHZv$9e^GPRAphYhf+pHPoS?i_!Hn5yj`lcp{Pw0+3CezYgY_jZNTm6fwU3NJ+X`$ z`(-p+O9&R;!Zm^=&eV);QJ#1MrF_n3k7{1Z4_>F$Wmq0$s?BN8jV+)^RwXA2pbwy` za$7_RZGhvs=C34A6o4_vH67a=5Q84|<3jr*-;v5{7qZ$Z@>Ox`ir}yHTbWpgko^Y& zyDd=!(KsDIuQs}lKuKYaYt*3yV}iWoD7yK%JXQGai9dVru57;6=B&j(aa~-eEF|01 z>K5evYRH(8T>Mh*tr+)_S-6_1GTTTAs#1L24OkK5siqY@g$W4Hbv0auJXVViaz#av zo|M5Af{w6_F7eW=M{@1nxLhAo(^Fl^8sA{aI2BvW3UCcccE(7-2bHWd zGXg=)R4H7UR7-PZWf{#_6NMdlu6SIL)~rW#rGl}=YwSCjdv(y)`$IY8ns{J)(py3H zf&%xg)Y6d#Sp8~TQC!UD*~;~*?I}Ggqir(YP)ZX`8Z>KyPJ801MFrW9YOgGS08Mp} z0S^v1#~joV+W8}Ncm!3LS!6#yYL^{Gr_hzA%I)n;R#15DM1dK;UNKO}=z}7ffVs=7 zbc%Md=A`>VxyE>|d`KOMEzKT(mPbA5av)U>j1|WerH(5VZw@)BlI%If9HaJzrzCZz zkW^%!!m6aeo=q#tSYXk~sJZkdX%5_RlU3aV5sc6dY2c9Cg*6gft|*OH1-go3w{h3f zmE;8T)|gm!;+>c>JhHLM|h zOeZ^NUEfi=E-O6T8c#i&t!v6;=WAh<; zrKr5q=}kb&ScYC{nY+>gPkyyo8$BvyI5ZA3xoIPjx&!%Ey`q@FEGn!wn^y*&*Q$BP zHH6%rhg>;Uw>QPg?c36nNE)z`=sBy_=X2oKEa}+ng-h&f51XNzjU=C)+4*}>+z;MvJiE1{CYp^ha`2V7?a@_DOnywMo> zxvjb!oTRZ@36Yji3NnyE83Z20dK&nz;{O2bmHnx9n#aRv;NVlZGxBFy{gD18>DsN8otU-1w!D-^ z*HF6zw+Hy9R#3rl&Qvh%>7Pjd0EQjb&9EurTTeeDDs9{#9q`+UC-4>eLJ$#}2t)*m zbu+5^DBAvpRQPKMo94UupECRn{hh5o6~}j|YIjj;I>pg3t;A?mVt{`N?&mIfZrlJm zWc>=-U8)SWOT>sK`0LM=wd z4MG7T#c>+Sf>bfMRv8Q7amz~=cvRiI?^Ur$Wg|w4u4R3DB z9Osk3>CQdqzIC@nvrq!Zkl)^B_dM6RN}8m(A)-EhtM;$jPgxLNYx2FP*yOc^_m;zL z%jAv@?!0@{=fej>({%l3T$3N#F`1!(TkgboQp9pI)Bq2@E0ZlC`B3gX0I9W2XHwNd ze`ro+Fe1W${{RZ8zyhvSB8Ni_QhxIv{{RU@P)oMf#@xrWsYzFIvCrNhp1z%{Gf~wp zwTsWR-AR+45pb%jpSr4`DuL()WwoOb*94qW`94W12`mV}2fwXxPO?3EIB9H+i(-@B zI$NP&GD@(>$JBFOPM2=~0BVJnD7FF=Jh%#{KdpJ!pK%Ed8*P5M2M3y-JwoV$9m(2H zQ=ScSEK*GLqlJ?_SH?afv6cSMr(O{(L`NpTRFp*kbH@ju9)i5zRn%tIWfwBH?-4@v z>w))=Jx^0qW-U1LB|C^1$?Np0zFyAfmC0P-5-Tdz9NxPd(Wl6?FU5GX+*`psV-bQF zpa8Hq>VK6-a#9Q8EySKiKsoFW)1j=e&X2#obM(bti&32zD>(xo`hoAwayE{OGeFx* zFm34~1wSDqboUsnE10E>?QRA^#yvWF*Pz(z78BXa_LlP6F_2VmXB{~_VCU<_dEMrv z9Mj0sl31R@r=}~Gq?^*kP`%y9$0<*j9gau6P?ISjBZ6uEbODqGC7YHf7{}K?oh;Hq z`+TgDJNE0^vfSy|k(10lhZz~Fmn-t+f!&Pst4qE=-nkg+0jd{LnKv*w&rDRB#Mh6( zx|PHbT%?c@Gjf5xWJCO2Hl8#0Nj2y;UKH^4yk1V(4`%Xt*l}jRPy6dgSju;0-*VaW16hPX~XfJhORm? zfyX)R@9j`HA&L`|{Hrfwp5=Q-9f-P(s&@DF;*=?FSQExGkwC~&s1AAz)DlR*5uQQo z*!~sGQjL|-yei*uv#NqeTz({qjB>y@Ja+7VtudtE+XK{hq)_Fu7<%*kvs_YzjqW{i zShDaBN>r0FW1!C`8RDI=vJx@Jw_dcNN&sZZ&rBSel)}fnkJVF-@C%#9=vDiS*9?n*s}v|088cgerd*7iV;QOqg(Z}7Pd>G6WR(wWk;ffHS9A}!FlEPH{{a1Zor-oM z1xn?Y9-Z;;Q$*yIRRbOS%45~`4YA5eaoG&HE~wlTQ($NB45&Cp5+m_|!y94Nu*{uPaMs?I`y zaC(E#4}bBk*uQrh6Z3T*x#N*pS7;V6I0ue{`JR+G+;>RFnUtsl^-RRkuHw9& zc^v&}#HlLeu=~S+593urw1*3q$>3IA bkvze(<~Soh{{W>nSpLpSBK)Uo)a6?p@%4$pfJ^jJ%B_6aUiupLF?&MF&5r?@Te{EJsj(GgGKj zkT6P&W}|$6c!PoO_*RFnb3NcBgR}rJbDUC$lO#F7$0IrR`qh)Tah=%XZa4$C>s82* zldxlqHV0qMf?SI7DMjFAPH-?f`_+8^027Wf2?MvSUu6uSg)7i;o}RsNRgJ#il>O|` z4GktRLoXw@d>`e`Y6((80Sr|7dJ3>3WDLiX^yy40?0!LkjQVG>$Gs*y6~delbF^Un zdvj12*fC()$Ry*`d)3D(j6nHGJc^=n8HgNqskrPy?Ywcvb3sQvkdS91)Ltk~x~(W(uhlE9B% zd*Y<)%JL6mQnE%*JSgOk{=FkAf<$28^aq*(%xUEefbAoLfsT}b_9T8CfBkgdnCIrl zzA1VPpMQR68qi4&LW9OVMMV1>JaRBUE}xxPU<+Y~UV3tBGRvQnD%kn6+~$EY0l7&7 zImb_LN*PYj2Oikso!0M`kyfr2hqzcde-GNU~8_x@BbmfW0-4D{PJk6esWwm{2pKE3D*T(TqqgA>Ugk*U1>!0tVQjsP5eKd&{Mpaln#4;cf1YRWMS zfHv{otC$*HOBM=>bfHR&wf2CGeU~$xu&wpxA z#d*$tzLeu84Ib%P zg}}0`nZ{}AGQrgFJ9>(U&UPYcJTMi&?dBOL{AN~O`uUYjRY z#!lXXq**c!><^_z0+LDo5!cqGfFAt;uPkOgphGJ+02 zFb#Xh!|QRa+xbpnluIhGjb<>OK}J?_nMN`Q!76`?jN`!^Cd?2A9c$RW8hx)%j(huQ zgdS`%MZR=kqs&%EDt_Ty91=)wcpMt~461jiqI?$<(dDJ>9_ac8($dF38f;H_5Mr>* z;TO%f0J51E?=!5dSML%|4h9A>>i!h6n$u8|SiZYEE?;v;4kUs^46%)<`?nvvxpR;X zIIkd%SnM@PX0va!+kWCTjduhrU|jFxa*fIgk;7*LAmsahhV8X!^wqkwy0^R2tfYH* zquN$@+CZ!$B#)UlWEKE`$FIz__E6v5IgoRH~=}&RCA0A76M+P0}@)W7h62E+knz#+1V%tkJui%Fa&aQp0Xl zK_usrIr~$?);C@y)OAU|#x*yyM4Ejv&Qh0B+bZEy2l-Uv7&~_-1GrlGw_8Kv8J5}N z01!d%zM8`4PL|=Id5n_-ZV6LUB17gWmN+*?6)pr#8Fe7-;B6a@F@Q&$+-u3HOM3u@ zBwNd7Wk})~wvayZ7cKWxcR9z@X1R#`T{ewz703L2YF3(un3G&G&lHiyFj2^2ToM7s z;)GIJc%MKBBfQfVBa%$9o#!N}KP!C4mFc_y2^hg3>1@?lt2aSg(SV)DHOpJeu#BE7YB@+;;Nra+H5HGY#llVK zbawMHV*p@wtyE~T3CYhm$5ZKC-K^?ZBb*NBy=W||j4;KN^{&{@L(Nfq+_F0BNtl3u z9yu%4wi@8HdrFM^S0`gJ0~t9zewDK;my2;YILD_ogsSR$G-)nd*qS?yu2>-+y#964 z>6bCe0|vnd1XrCk`GOLT_+k$~O65P{CAze@AURM^G)}FR!wrXrHjMg)3!oFP9V+Bk z!5DMFuPE^U0ErU**%g}%M*}t2MRdUMGg$K`dU1ueJto5K8NCBnO_)Ssk2U7{eBef` z=Nau<(`rr=0P*Qr%U5I2qMBD{OmAWbVHD-RwhOcn8}zPX-g7t%PAXp~%#e>-98u93 zK8Hc}sN4|16WG-$5I+mWIz2W_XPyOGj?zffwsGs4$=ji%V&3P|U$Z3l@aot71+=kk zeZ!KbDH}ed7PC9yMa8Om>BEtUNP`jM$$B|3_)`fkG0%_WL^e2;~Zxvt$K_r ze1>(BaUz*FLQ3+gdaHW#oF2HZjK?)nyrhx$nRFdIJXOmIWRg#vc7dPBAL~@FUA(p{ z&O26=ueLJy>DTF4*AJdUWFFOwBdyMvGl;yoXqlAr&2x8h#~}3jS3#^Iqp=5?;-`EQ zUactUbI+>v)TKNsPs(YLCf>C2N$cLGiXwXPTi>C}eyF=@6daLT2*?K&oSP71IjcfI zMk-{DqRR}x^rak*DVv7cV!kRGE2xZw@m2h$tLn^1+B1{QX*H_8F~uvCqGKdRr&K5_ zK-rPrppiE5NxPNGM5~%`h*RT3*j4zT-PBSGGJuMosYA!{i`9TA<2o^bAJ8DmBngP+QLh+zs*0;j5a?M=)SE!MURLg(J8LTXH^Js1mqo?ChGl5x$P+pWR z&|*j;sYDwuxnt3)zVR6(xE{upWH{+nTHTzNVb+y|O4k_&Va{r#mlzz>q9(x#K9y2i zSS=VvvQpIG%<;6)gvl#OqQAwdI^(mQIIBHn#4&k<;Fiv za%j*EsHDK$TC|fgjH#|I~zOY8h@+0fSK4X%nbW zIqOIWUcG9Nob}FqDj6njqK57?jY7kqbD^d+7(40CRV}QOC+IIvtHnC z-I}dE&Ieimw=97BRT*Cc8O>6Af=^nCSwW#|hfRcP#MolI)^)_2dLAj_LhU82|#wmt;RvO)cc{J~} z4D~g_=pKY|2-h->y=p%c^~ zW0TE7)h0(yw8K_r-O5sR=CkLm3B7AQ&rw}4F`1mh27%V3ZnS}GOY}MHXh7_6y{lF* z0*&2kGT)BXeM>OOt~$u?r0lLvThpaQFWu>y3GY~%uZZ*=9ISf2qibZ(_eI3X5kF1D zXRUH_w)8sr;+5p=d8fp$jXw{570qjH<2_7S&wCrm3`rD|J0fwCBUUO2;1hsIK8CeC z7vpU&$KD^d@ivDX%Vl`G;%U$$GUplKu>Ep693Cs@FN{C3{{Z|he~K{p(*FR&A7{~$ z&I@+7iZaumDVUIqPQ_Qa9{GIsc@q1MGm8n}< zYFcfbpwhE%7unT|qJ}>qk&aw(*8pcY0=W;0e-wOQ@ejmPYQ7?zy~VpcF~pcyV2NZU z0tGn8?%a}l*N{zlBLYr$9$1r-O?^fa1gI;&i1|!bV=B*;Xo6dLp}kw3*uw@K^O~iq zO)P+1x`b&D%D4mNsQ3Aj?v=0yzdTfTJMNH}^1?CmI~@F=d!E9#n$T1hwlZ1DBXkG8 zdm7FYp>nK9>zs8pVYi;3I2?d;$sdhp$eT`B0h8OOHRjfC=h5Nfxok}w>c?XY3}BEu z)uO7Bt2qHk&PeBVdLTjV8` zh{pte0;_pY#OyZ^y@BhR(y(aT0sdk9AoLlf)QzgQ0dl-xb^4mZDA|~zWioj~rh5)? z^s8=>!6Fm$bIy3j;-COK?+3d6XKknSn7&||H3w)ahFvOJtiBxFR(kC&Vg&ph*7oy$C` zUD$AP7tmKMrKxa6XvYDM88|hg6#i5uEvf^55g9*)XS8n4A(X0;agad+@#rdfV-~1Z zM^aU`5MI6SvZ(xd_URxXwBXfmA9IdYYRQjV%{g z)buN+ztdR~X%}dDBS*(M<9Hw+dUJT2TDsL^yt}z;iPiE;AG}-dcgHo)O5_5rK?EM7 zp{j6Bw(}&zY4X?*5Ak5`=LJtfNXO@zO~mkV_5T1ptI6fp zwY_C6wD{gvWhG&aP7dZdJv-;WTJ)PprAv6y=;A=2J`PUcIp?K%I4pGQ{87~$*o-`B zy&i_lHg{J{L?{_mOEC;F$8(Y@l!KheLBYoyikEpr+N0(C>Zedj=L9InP?Kpp0(d9Ou7Eys$(G47e-WqLML#k@AkX z9RC11=cyFRh0xS2Sz}O0C+aYND%{pI`%OM!9hB>GjG?kJImbUtRtk`WWAAn+lU7nl zN&gJDq@{{{VNOp<8e` z86KU;u6EhFj7<=jf8Ct*!Oy2oYCu@=oDA|0_|-(2LE3Sg+O1bfE7UCU;=);R)?=*gsL;R z9I3~CKm9_WUE!Nz;ODshp0#)?K1bbb{G+xpgH4JO7%^@SZ_A;eEL45ycPij7|qhQLzJRg5v^<|7|cP2}p z$W?cYlfOOsfymGQ0Iq?eyDK!g&T+}lQJR1#Q}UiVXBBJ!rz*gfBe5s^DTfCQ&rU!3 z^azGU%YefR+Z|8iRmzY~MsQBk(~7vq4#gRW0|55V>rku>AR0Mp9_2Lyb-fFGqbP7wUZEs8?96P6@7 z$RnTw->24w>x^Kj#t7o1BO`0!cXRmr(~2Fyo=L|f_WIQ%G7`IRM}Bkv0PEtUjld>Q z0V+qoKaUk0pzxUoJaB(1MaIS>q3!thrrm^xTrrv1!tE`SfHw2g;0lj$Tp{VxkMXCF z92{hEjE`J<(@F#Kwz#Y2MvVxHR7zxotv$ZVv1Wvyyr5z!gN3w*-P%bzao&BJ7ta!{lA0 zagXt+!v+P(?fgeISwUvW<3FbrC?pN7{VCiFQ97v};CrIpd05!|wt|(x{egryy~PvNtFM9A>Ybi<7xIAf9qf zC{+XoB}w5dBMh0t0RcMJ*MdS#FoYTv3j0NRLrIgc3u zf#Wzb~k z1AcQ(M_#N+>4QiZ;ekDSdmfe3N~1;9R8GO!1) zL-<#tPOZ;6tp(V%8BvnJFvl4u^X*=<@Z(g5$!0fGIf^~SM&PR(Fx#E1t-P>eFuZ}2 zUPlWqYpv0&uZzT^d|zsj1Y1-WVq5?~>wwGDcNnjr%4*6px;_(%u&|XLSsv|ur!BSY z8n%mhHmGh9AiW!SfIAc$k2&5lI|1s%=Dn}NI+mm1-8WQeu`3~pSk$Ae^Te&RI;jVA zV1-ca&KNcu1Xq%1mQCUGFj#3*>Q{GCJTE-4vPO}qNff}!S|Y`RjC|PZz~a3=S@nx8 zVhh&Op5sr31eQr6-H$bac)@0EvFBku$#3r*SK82)jkEH6Oj>J~qTJQ-6|!nNj)$UY z(xsfz!3EXikrs+cAe|A|F?QL;(I72Lu_Dnlx%W7RW+?f?W;NHQ;VN9y4%yC zg$#6wQht|psOTbTT*L6SRZt#HJ$i9p;{xLj;* zNWnZ06CNZMmZry7w70ysF4&j@9Kv!7K_yN@aeVgtxRotIR3|P zJV_i*>RsU8WRWmJo595Usc{r^@k$4<=ZUA1i|E zoDu*84(BBEFClj4t$8&nYjk_`sA=ya-`X7UPl9431d@KHs}a8&dJ2sEt-z?}dz9f8 ztaMh_F)XCaGPvYbri~Xf~1wh5(P#XcI1u-txgF^y$P1+4z;gsfBU>wA1Nx? zUX^;za4;LK5vtQBwhl6l>~;d=@=3v~Hu{guGJnXfe7SYX^s0>VA@7>$RoXoDf=u*y zH9;Q))1}wvKfBHqYlMznjySdc;BRW)+Q82qWqyLuSY!NxkHxX~`;wvh}^j(S(P=-T9OZc<3eWgL)e<{NK6 zaC9VNrFzeYZ|=k*JCF+FaBhd`p82O4yBk6lm76_zb(}}Lpd5gGDoC~8G;JgwTJx*R z+%6EX_C0ExH;g3=%tmp*rlxf?;(PX;c&`$LJu9@*UO8WLSBGhL?-~g+#dkVRvZzKM z2j8VzxwRURzNfHO(U5>7Bf` zGCF(LH1tiLg*O)@kI^p%Xrn>!<(`;aKb08C9eQ^?>!6Z&Rl5UOHu8ug8Inm9kNIeN zeuA^^Cl4`UpUb6ur?PUBlRnZlIbxDGrMZRUc-su6NML(|SPdj(H}IhnPD^1knSo}GL<;4qWabdVG6h>9M>Omhj$f8rVUupg5)XAYiDscBv9i>u6}qng zR+KQP86&MIfP>9W6sW9aE0m%$$Wn8Pe!wZ&ZuIQ&&1UXV7T-!~7&S5WrW$F0(ZQ$G zbgR~ejS15~TD=(rb5)`qwLV2dMWZ_8m2wHH4}CPGFlNZFXpG|J*; z2CPGL%6a0m9F2NigDO%}v@lmNpfpk&Fdavh&ZfcRb8T6`>&Np*F8-{c% z+Owxco9_Dds$Ox&T3@u46)xqg3b90u^BmTcR}scAoC@b8xyy0QS&X?|#+y&5D|9yH zy9_W5P?Bcrn#P*op}?pf_X34YlID@Rw?qz265g&cT)SOJ*#fG(?oJC;`yw4=b%ya* zzw1?`)D-iY<_xdhsfO!fmCstGNX}T4ZoZ;B8mjt^d-SXWKI4HRh`?-$w9>U!kdspxS=`aYuNm6a zVn!rls<0sBQ%tz(Ye`D(;G>}&hX$Z8Ni4ZMnyAlOCSg%noW5$L>c=EggLBreM50bO zs^{g@!`XXH5rv1(BD8Fv6F5>UX>8CAYRquQ3CwGPd)9NsD`-_bxv3`Dl1Jplf%;Zc zoSfFozdU4CJB$-q(w)wXL~USBwPUYJrW&j(gIYGssm(1JA?BlDfll4tn#3BLvgIYv zfUyMPlgu9%Up9|si&%qMrwvtKny2Pwm&~J=usV&3)ackL=cPtkqc2A( zJoYriz;d-J-G%GTVtIg6O)(uR9V?WvT&DBhAsknVd`9>m@blu0-}aY??PXm+Mj~6g zX__eluS||ni1jK?IO$%K=Q*jPko7ex4x8qNjG5P`S#nfYN1psD_)`bM+Z)X@Pu6es zJ6o9*NN#_+YnHl|NnS^88g!{aLOUBu zk!N#t>sh+bh%~Pc*w3nJ_fc8d+bMacox(>Nj^&O3s0G%0*TX-ykB)q4qIiDO!@6aS zyqX5KjUDCGiX@ZHjf1RU9ut5VHZpK=6M4R6Q34A3oSyw)|V8+fgTWeqYjFF3}@@HW@`Eskk2z^LBNbTr<3eY;V(w{kGK2{3tA9w%(InGGQJx+67{{Yz# zQqi7dbGofsNglEB&s^}9v+)~U)bt1zEjH>w_HVKvi5-T}Wo2M7<`B)m2PV8u{{Tmx z*&vzZjIGpOd}|wt8CN7>!k?A6=z091K?HXEYLuf3Dx#1w9~j_c)}yz*wi0=ard@}2 z$uooP!OuPLYMs^G$sx%ZV5ee#06hogS<7R-g1m~iGCl&J$UoAVZ{-h6klQI47 z0-lGbKGde>G?2WUf^t1SDwgMB!-W76a#$Q=+Z>AWYE^BXykM+GXSfm(l?taAQ=g_N z0T_cRZKU-bY8!^OQ~SNdZOG3jJaA7R%A~a_q!|xPU{)%&rMPGp5h1`YoOBr{0;5@` zw?dG!DzNNG&*e?MbM}TK0Y{}fczE|H&UhWVR&$%^Qi%bb_KX~7)7qxrlq41eaxv1W zjhk{wX9SM55(VGS0H4ybY}rK(yLnW3#mT_{XZckbFQmI+zoPNL#zt!V?30B=`H^$^ z)i+p~aGB2z%ue zamc6)&JSL-d6A}%0OTmi^{jbDI9{XHq@;wnZ~zN~{cANMc^~Cma(eXrYTJ{v{#d4r z^ydels@&aZit#hV=RF4)tI2qN&SG7tq~mw$MrsrYq^Bq7GoNad#km5a9tKBh84^}6 zSY6yfcND>n0r_1ILOX&zE88^N+i9(%5lkm-xhhu)_u78HG92I2bx(!%*~QWT;TV>=zjrU zMN2TFJrU&8!qrW-bPgB-2^p%-zwY<`RcT>nAePM!7SFnJPg7m3rnE4OTGf=cZ5eP& z6NCQ%>+eXaRe>A>*Nk=P$2D(hk+9g~o}DRIX&Xr6BN^kT>s-|--0XzxK-q3$2X1&L zo<9I6j@jj24;kot=B>jaUEW)=h8tTPWPgQPiOgU|m>I!6{{Z^+#X3!DZl;-uEFM!8 z#!ngMsyZ%kK{@HiJXc3@Vs$J){{R}wD0dR4h6CmLS0t6ql1pPS1|;NX0~p40p4Bva zM-PmB(d}9hT5nR#$sGXe^`v_OFwEEoB<6cz zsJbOyNP4NjEw z5?kj3%a5b_1cNxp1P~5?#C5E-xq2H= zGW@`?2j8gY`PKO38$mf-^N(Km=fC4wL4zC|07(14=e=mA4l|68Q=DSAre`9{&Q9RD z#sJ)EymoJRS&;48a!BYg-|JSO!mig`0>c1yA3;pNxe7dp$tW?m0|V>Z^{wTxoL0AH zE%d?Vcu|<5@Wh=!>&W)1tn#wpkU0Z2libxK|J3}eo!G8Af!Ow{ zx$m9CdUdIZ-GacK+2Eho>r7P$GFP6bImh9}Yh&0Q6sUJ@TmU#d$Kq)m#8vReBi^Db zxsPQ$8XhdZ58Ym!sn`e%WVTt0cBVhbGu-DOesy9%GF8q90K8w&%WJA=X&=7uX1 zqao&bHVv>gV*UpCsK=m!x4@LU&^B^wK4$>l0KrPTr!R_RPqmV%|?Fq zT(Kl~{+`&VD38kw4nP>|nubOrjE%VHdF$S+JZ~unoB_rMtwd2+3=j(PeMkQQu9c9A zjSwIN<2?G(F9d=PRCg6+)0H5MW0Q;?4Ms|p<$huQf2|D?)rceqaKRjPJ*gZv3H@{a z6d#zLJ7?OHr%wG(y$Ga2&A?s&8ONvp0I!N}=VCbH9s7#0v^UD1Fg>%4DSorEsH%T%2%oNEMqKxa>P(mntUXWCfQ4 z<~iyrB?MqG$Mvfq3}+e7=}+>R+iYVkkJl7fS15pkg*hJmY3iRgJNEVVtyr|F@do{X&i<oaqC687&d1%go?*(=*x`csy%7U2Bc`sahqbs~Fq$Z#B!fO^wpwh~5K zI0oE$bj?kT9L`%|P(}}?Pc;3fZsCuYuQjZ&MS`Jldx6wcU)l1zA1GvX1Dw<4Bbdwp zwnwk&PX&}?pHHn?dl|Nde36`;wNS<*Cpr1OxfHoWm{($)dh{P&^wnlk6m#uNZd(~R zALsR_7{Oi%I5^2PgxejQ9m50Hjp7} zQ&D}_!yNkaO6&Q9{HP?JNF6xbt~&+zl=EP!Os;5QP-bC&U5ss3mk6a1GNA= z7S0uM(C0m=<(z!DKD8Rjv4il~>_%yiBN9m%?TP@izjw+HJuoU%yyP%B&j$cj0_sEq=gJ~jN{urnW_SC+r0q& z4Jt4ojsf+m$ZkONn!LJ@JZ>WEcwFG1jxy*mdjPt$~yhupvkxPpMPSe{ou-OC}7VzEkz7Qa~~= z0UUmHQ0zG8-yQg;?%LcgbJvR2GFut6Sy#a$u6xwUl73(@+a{n;r9M%BYQ#ZT?{aVj zchESip0T27Hkvnw-T5{9+(E1ld*St-2c^hcL+eeCR%D-eWo3gTul13K;2a<}T zJ$iBJy8XtftytMlXLk*VvWQE3Lo(bvg}{x%x63PlLm`gts8#D6i^;D$!S|Rw6bE8f0-$|a)E&kVV4a~Q4Hp{7+1li?H8VnVa zEw!_j3O5xwQ^a^9!#*d~n%Q*!0F_=Ay^2+3lgq!4b3?hCEs{>$V*_v`p0$gpUuwFN zTv<;nay^>E5tD{+h=ds9b@^~H&OY(!>0d=@UMhp=F|7$5RC7fG(oe&0&>7)0@%QA_#n609x>4Ly&~q`{bn|h zOO4xslVnfx0+A=kN|oS(0o*W0Cb(Z7T0!C~c=cTt1%~=OZg!FGASkFumY!)ISdK8N z6~hh=A1ZT}Du*-^Ixtv=3auX$yd@l~o}I^fm1ADSR+g=5(cLx&PNZ@(-=`gGC=d@? z`T0kc*!voC=Z(u709-3}$rV|f2LrFIN*pTWw;ee(nXf)2&XI1Pm@QRTY$lhF}|yW15i~LzDzI&`I_c zi51(TvXhYGk%~O#106Ck_*TlIvBNAYzNV%_bUCX~5Uev;NbI=BQCE`ZAynaZ^**_$ z8mjt{QiDrFr%8&&%g0>POo7Nb0~L`J;IGU^J$uxPC8nb7F=@}j)! zux@WG@9GKkuKxf`vy#r$7nfqpaylyde}!{4l3Gr{UP{14D`rA68@TyKKT7m1Lsqhh z;z(mwDv|OsH>e!k*A{x3oYADv^1MvhDltNkmXmRm0+ zE^Qo`-9aJokln^=mCeimiR0sOBOP!@tyEgMRbbN8yJv7jKR!WP*|WVF0Q|Z2u3js_ zDGERs?mO1Cq-I$ZFRxnYN!aI8N=ZcaO$4*s=0I3>HS6CFufMYVRi<7-O0wJ_>70h( zjC+Dbc@Bv=u(lD%+1-wn)@i!La9+W3S&+jb$QgKVl!L+TT-9LOX!h{UCYkzUaQBf9 zF-G<70OV9@bqvFJ1QEdm57wj7bvqq@O10GOLp{CJODY%Pu){o$TAocJ4DX1Q&r#G@ z&m^{cpI)C>>?o08`S%Tn*A<;}BsV;$A6mS&D;`07sOO&5N^4tF^P`|0*f#>HMPB5& zI~gp6K|WURQ|(kpg??mQWc2O&*0-AyW*Kf(kn{jxW9wBFERmaS!kl&_Rghh>WRnrQ z0D4zhZ>1rOIC|lhI~*AV$~}Rttt-S)L5OB7(F2X$NcZElVN#p7x@ifnruEL8V~fm> zk~)g!uHuFX|?0=ZQu;*uj^xc+w$TW1c93hcnONtuIooX>>g3`v&%Ib}F6Q0#$fO$e4L-s{=> zE;~>PLZ0+ny>@P0lD98Ww_?r3RnH1uGEweAAXOnv;rf zp|eDURUp*iJCjj{1Bz*r9qKO46G+gA1I0@A(Yg858qHbu{c3-;XT26>DaWZH(=C|f zr9yODK5z*9X@9f;?VM6Q{zn{D`^Iu`eF(p^EaPmDNc1&gKeNO409wtG?4C)gk8|%- zlY5!-!E9Z*nNQuUx0!*+H5hHT8)~b_cUfrIP4x=KBZp~X7o1A922sJWBTcurHMlyQhvvhomjw{UV#qc0!uhyG2 z*dygN%tv^Q{6eH_wCTFD_C~*0(AZno&NIbM(n%rUVIXV1j8iJ|&{{XFHDs7!n#K9UDP`{XV@(ojH zcAPoptIMoL2QC2jIIOqv1&-pPRc6L`Ijtj3cG$*vig(=AYzDvwnyD*AZZ}H6A6}-Y z{j+!yw8VqZa4Vj=)zC=GZ{^P>PXjHF#|5qtU~Atou!70DIRZ;y;NV2JnlByic#`+GMOUu-sgtOyBOtPWJo(ugNbR zd|&vz<9Wr`i2Ox$rCV@UOwnX}IDo(yXN|na&OeEcImRo=<hVn~VYBxeqX*n#a`ZavL^J-!O@_ldk2tJ~|o7S!gjzl)

OmFy`|uC;hSGj6X~Rp^Ji8AP+eex0l;JKFddUuX_hiW{?m4TJWR=#% z)2SBiBz-N4o+m1Ks(xVgGW_^d&xyD?3;J&jvgw~u<)*)_S7#HX=v$On2sH@#xszM!&OizHV= zC=-@!Vmx&N9Gv@#ya}huh3%PqOlnUw8qdxs^ABo{Le+b2Uoz*Kt0c@l>IRz?R%?(K zJ!zQsU;f_fbKR4aH(WS$LbuLs2Ir4 z*15?qSPUtwdyCD#JD!!SFiuG4mOe{VcVhiA0b!r5Rn)IFMX{N*XyBgoE@6)5Mv5jr zjOvcSdxbT@+Ujrir5MWRIj!4`MPo*|ZO`S5?Tl`3!yW$sDphj#7EE(l^&;@!iM(fZ zaxA=8;h*fn+1qnzc^&1kBeCKsS3R>HJxzXj{?K0;yiw!1uY3iqXrn;4(sdIq$;meo zDuS_Y2aMpB%4J9+o-%&o@R!E_0EQkad$@G35L)?`F6$~>x7phXoU(~_ZeBB$&%P`2 zv*Qnlhm3w8YhEXWDn)g9Acd3_4;+6YHVHhG3Qs*xYFKPPESqTU`sAk_PFr1*N7OCt zVhZtGTErs^4pu}Q0gl8RpL*h_xqERXsy0!;;BlOPInMo@_B7{=|)RO2U%bBtoQYg1Y;nOx?QYlM{?DP5=KIPQB@TeNg#NdWU0=hv-t zbA6`%>u%8=<^^I^!hF33JDSeBvoJhgYQQq?VuX;&0sbzS&*xl{mZ!B!jgg3CNTSS` z+`|KD=~=~&{08KJNgVxotCuobCiRIA-oVas2l6$U8p|`1q>P*&rE^!Rta>Z8@6jL!?IuujAf6dHd%s4w44w!Gv6Nd=T1jr zxj79hjxYe@zhCK6gp@ArjuA1F$s3RO)+CcN07DfR`L>*TesqFaSSo^Wy*=|-wq1>x z;&zA41LYXxcc|7ySitX9Qb}jenAgGrW=qq;kFB~D4|J?lTseEEc)Pd=D5(7?D!2n(K+ zw|f!FN1S85LoURo=^3(6I;xS$J;pP^?0KxmbP7*%(xO)jf=eE`82qv8ObjF{iVx*L z(y=j-ka3)J{HiC=4Bt?$qb^(KW0CAtCbI9gx%+I(e z0YiQ5+3UqacMHc5EH^VTCnL9PXX#A9WVdS~;{f0u7q{b9{5yWScA%1uV{@^A=K$4f zJtpe*P?o6j6Zeid8S9hKS8JyDMr&)Rp5>yFHRX|VPven}wcmrnVk*f>oK8$eCY3bQ z+1;eTjmX=SjE;E0sTtqP`38MWJ`AY?VA{NJItre44t`Jq@toJ#)4@tRpFJ#JGSJUv zE_gfv*WQ{A%p9IM8618!A;x$k3&;8Otve|aHDe->PeF>`>g>nc-$INekXVjAxvMN0 zmvQ4feib6boVn^xtw`Z^;P3@<)Sz`!t#cvK^MGjT%E`VdI6g3uELSBxp~(Ia*huN80}oRoIRD%)k3xOGBCsMFeUr9JkhANXb7i>)Nr? z3d_|&$0A63JB|gRdrcWenr~Dx$IBS(N>^BJz364EOHN@8NuLjiqB}{1SuSx{*`t# zGD?12kZWNvm8SPI45{4{5BxmbY zBxTV%wk0EK31kN?&Dtuc+e6y){pDm7Q~@J>nN2b#0Al@dsQ#~jpbyMQ?$0guP@ zt#&a@k%mpz=R6=~iF;VPrfn91gs9z^DidfWR?44nNO1p|O#w z<#NRCCpgcwG$v&OrUppHGuEbc7{U2iamQc76$#w3b>I)YM?**ibOFo0Hu5qDdWDEl zkP9A9JQ|)!A0%!Bw{DdjVen2f+XAU*OJp-M9s$4rV*;R)u1C$&{PnA@43C|=M*w7> z%irrzvk1OdAI185Vwl#YGK#Cax#atH%|PdA#xec}>sFkGQVNCac|TgJ=*-woKpnj) zdWo_&DtH(yIup~1Y8dhJj!7i{0FzEwfmU1`c0JGGP4d?V3`smwu#pQCB;%h>*yf{E z{^;qSPwQ6vwgB}|eSHN#?8Gkc4m~KaT+S=It`w8O>6(qyf;NH%a(d_Stp`qXj!&q? zRx!yb8#x?|1CV~EmndAK$Vlh#YL5?{xd$2QI^+KU)mqJEIb{TG2e&{urF$7hHjujq zUtg^pq;naH2;c*_^T6zB&e=V4>(4`4FQ;7KI62QDM|xOvi`fY(g!9PnM<_X%dZ{{RS``HOV>BH-=G=lL9Fv)@aK+ycx?DaXm*AI^?eB{XBhZ!F9f zKVGNU_53TVveTB>uF_whnoJM8duE$$3&x?93~}{d`Kq^)mO~0L+nnHZ28$PSUSG3C z8#;jQ$L^>n8R~PIsAL&f%7D$rdjbA^>9(=7al;IxfKMl(!TR*Ai1gSV7P%6#Mxf>7 zkKC8P6T_Qfd=r_eNNNPvTE=Sn_8-K2CX6 z?NY{Qk1+i9=j8(@ALoja-M6|4T=H_*;`k~)1K8pnZ$=^EUl58b~W4F!=^Qw zO7b$5#^45WeT`s*vs;N6<)Sz_&IlBwQJHTV`HIY^9P#LC&z~nDWGkLF1~?->m2A9L zmne&Bn>K^hzVjaaKTOkYbnvaVL;;RY58mU_lSpF{-YbZ9M+=z`SqD6xl|UA9b^n_)MF*zg-dG0u?FQi3! zc3XyaIr*`ITC=U0*-rC?^aGK_Uybe5%w22~@_g^`2&<;WLpe%D{5>5|ae|n5U*dT&& z+PXjNi?VR>91+PKu~Dv;e4`^^AmohX)YuFirza!)2jNdt+M{qMoPITOR8jk=`3JW` zF;M`@K4YKr^`&8^DH#|C1!!adbJsbg48=y?gQw%tpUCQS?m70M1CbY&5kp{-*rDwU zeB^PH!5~$*$#+$5#18!aRLPqFuW~=Hr5vn9H-;o{mzrmkHyn<+_NS{V^v-`ARKs8e zPk#NsDs2d$V*{PJ9W&qBpg9k;+G`bIm;e37+a|KB<9ARw85pWV zEwd6c&fNb1o|KEm+!OTZY9$g9198t!TG4{eS-x1<6Zf`*&OPY3(8Djv17KjEtuRT> zagj(sKP&va^W0Vc0I;C97an>H54qg&(>}FJaXpH%T(d6&1EvK?lCZ!y#yj<_?fEBg z#(Rz`(zhVCGJnFXg7Pq9lg2sY)~u-~89ZY>IjT|1mO1D;aaK{;yWmyDvSn_i(pZm} zb>oVjCjpl{aoAM=_~R$n)}={tf(JS6UalX^^RX=(F!E0wces{$&bHg}8bKW&=UiZTKg4o(`h9X)vjzm)t zXqiuz%^Hy>E5QMFlh+x~L#OJJTxph2Uc1|unGClq1jwN6RxcYP5=w?S$qZO@#@g~L zJ#NEa5$RViCFj`gGiK$QI7pe7b8X?U_ymA6^u=}eTCKdXpt3Qf%8YT&H!v$IFmS+< zNx^Oa&!_|Kp;9u{ACT6kI)3X`eZGI!V_xS@@Rf{~+Qb*X+aF`L5?otd&ag$6S8$OS zot;is?&TYCP%C3d)ogC<^%S^iwEJt1-%A6`vZQwKnEbZ|6$bPGrtS&jjDw#vw6nC( z)<(aXe$bP%O}qX*9w?eNjxU!Dyvd!w=L2sQm9F@v%f<1|*5cmNP=(~U^A*+zrHJI1 z{Iv&kp^wTz=bkgyA88tTvfdt5z1W`ft@wjPR0iJBuHgGAWtt>n)@p^x3g}lLZX3&G zPVPYBygKv5HxPZIJ;K#)V3loN2^n!9Z<&fK5T%0b+kwLafypu3c$!TP%-vhu{{Uv| zB~@co6Dma%k?nIEZYO)G87HSW#{l^Dqv8-X32tIgp_6Iye|L;7GB7cm4oL*JB=SkF zOinFy*z|Jjx>DbD_ZGZsu3Tz5w3A%L<;yM}Trq9T!|xU>+sXd+dFxy;Y@CYiyiap) zccoa~NpjNNP8E?nr}kEYR2iesQQ}I^C1?3Fg|i}Tl!ZZE(#xP^r_ABza-YMs*#;c9GSXg zOk+IMOwEi2`A6wlkxRcV)OV@GqiF!~`qNUrre4F9m)1s9-MAil8ntfkB+|5(Qw&a7GPu#_YnRW7PFArl1V)O3bLL({5mKCmV)1I0vVEb*W-!yOtd} zS>tB;QcUh0$R}@ZduF)pFISezInhW0U;}sLbNbg!;r&3Z>^FAIE#*1+n2no;a500_ zaa-zgs&Q83>U8!~Txro3%|i=jF}Kl+Ij;f_jVf&+2W2D-cJ z3yo_^OD@U+B2;w<(KR~}{ zFB8Kh_4bi7%OlMayb-g381nPG0H3@;2adqk*CP7iR~rak-9N{Q{BZDxjIXqvcF5b1 z!RL)ius9)zA5qt}e!1z_c0$r9uH=)29D|ek*N2Y7xX+mSoU0V7Q|0Vvv{T5g?;u|@ zwsZWd7_DvXj^Gw|Kf*!l{Hmqav!}$~L?g{UxY&Q5Kb25zaa6Hb!jb;~O+M-Mu2oKF zqU988U0F5aJ6tLt9H?FZtT7#(nwOVki|L&Hhmlp~@mf9w(x%1x?~I%dro6t};%|X` zNvO4+g{Z9ao!_}5Yy77N-^gSa*zH2L>WPD`x^{-sFx{i2< z&Kr-deAZ=}$oW%)xE$mh@m-~tiP%FLT7B_=LGN5Rj4OJhwuN=GJ!0w`c-PDXDLuN1 z%==tp2b1z2PnuRMy2T;w76!R;Bfybko=JPwAk-t|EAteJ0>2`k2VKUzwQWqW%aJ6tI5RbKH2QY(*_RNIle z^Q>w0tQ=;vjv12iEc7P6Pw!NJ+GsoewdSp?H(b<9t4PPM6{^Eqb0=N*Jv{0W<96Xy zWYwciyw{(;q`+hzYNXfiB5n=%W~pI_b=lp?tw-A*om4u=ZUX^cZ7tN`Zs!$4`%Xn} zxviER7)ua)1X_YN3qKWW`$pS1&TGhF)NZ67y9C!mr_ZzrZh3F+=B8MC1aTKV0i=fE zd0d0)D=P9RQa|0G&#h;TU0jIKaqf5ml3YLUC6sL)ma|lv+-|C7T(aCQc7uUY!*x40 zIih_^FZFSQ$8*-JEciLW{HvuwnR`=8d+8wn?)ueF?YtgaCaYbOaTyDofyHvG1>CcF zNQ`;LdsRk~Xo=R>L(;7^8E1v1OyPRcCFJuqBRS1xSWPCCZH61k>*-jR+QjF4u^pM? z1Eor#ccLa$`BmB3UESW=F7|AXW1LoV>h}U8E*Xb&>0W7b;yq3V7cPmBe;ZJ+xau3a!^1S5z=|(Ib*r>#bSb+G`iF z64y{&yhG*)0p}j1*43AZ<(0^^w2Ia<)sM{InLo%^lIfQd>SS)!yqO#LPVD6VLbN2c zxv_BHY!l$+xFLTW^{SQ?H)pt`jCQ)%^=sXKSP=rxxpTn`Fl#95{vy3kv)P#r)5%at zA6!;0nc^)rJV$vPZab1cm3J-UJu1e)eU(!uqAmbGmlcDc;_Rbyb%;_|=CMOb)9)^> ze%F0-zD48?Smb)-V!9c13wyg;iycWs(A-AQ$poMkXxL$a9)uiM33=nm+CMhZ-D6fH z79%-h?^vT;n(|D{in!~yjMI2oOIad5y9ntPcz453ii_~~;wGW+U&WJ|balIE^efAj z!`q~Xbaw9Nsuf@mo`;TvW9$o=Z{sKIvZRsr!+^u}ugkyMQV6boA|ofuB$kk!%fkj- z?dQ~EgI@daFXLPI>%$+}8tXWuV}zLdkO*(~hI`kWg_?DxhnDK+t&D`0 z9yp}5X?`bT`$7C-)Vx38ulPc=;wHPl07~J3aEyLfurhfgCph_VJJ-c}R+5@DO{ib6 zn^K$>cR6DiZg#0THQ9K_SGU)EVSlfx?=2%OxZ~wa^4I_jk-+bc^~brE=5UY7^$0qg z*M(kQ)~jn{)}i~lN-uLR;^Irop1TwezE4wCXVQLIWkA!ip)3(e+7GYPn(1Ij$vY(4 zF@@Zt0~qgBbtss+Pxg>RPXC?S+O$fbciVL<1T>0ZSqsRXmhm*x$r8{pNzHPInBM3=RkbANIb)8&2w%pqfijDpKkC?S@4qQb7n{~jzJDKudKEr{U<|NZz z$%wf*d=Hm3^bFc5zOj2St(ejy8*{^B7#a2l^~HH!sRR(sD_t(qG7C3MipCOY*zA;H zFL@mOvn&W091?53@OO&!Zwl+yejw298s758RhlPLj53~{;Eo795nf(Ff1OJeC*?T6 zZgItESlw*z&3Y8-7*7p(AJCt|?}&PT#P0=Ic&|^|k1~08P=k{V$^pGTndEwcE6|HK zt$t1Z$NvBo*TNnve+z2UY|}N(hzlQT4TN|4pUBG zVk)$fh3iqtKHTH2W!zkRxvPybB~g|qy5j@$tPNLMw9>36)O8t_3tMQ~S!8pCR8f*m zEY}AZ&3uRZRCu3NvCwQhJ83j4XR4QLrT+ky=g4Ga1DpuSJn@{bTJ5EWxyM?ymCMln z*8T~(z7S2O-$iY?fuAw402~I`4sb?0{&l%)`%ru^xPRWseQrK)noDesI(^1-^LFFw ziu}%&HAWzwPfT{Gl1WpHkgd}d=t6>89z9G{*5~YRhkSYAuNhjKzYS^--YS67BAiPe z?wiozmp|M2|REC$pnFpwY+I0N7gx&p66X`yx}x7F4$4Q>tCDxBlx+j_=CinkBl_=?)12%JBmki>`)Q4BVJTvfKC7(Ow?j3 z#+ua~SWGjl-JPs*9yjo&r{HaN??csRj^^?iHp?};7LG?C6Sas|IL|o%=DF=BPM1{F zB3r`#K#*_S$sl|B{uJ$7U58ea?QW90?E`Z@5nBgw3xat(le?~J3tea!)6J2<&&~z_ zP&?!d=DgiGuC_hsL*25~k@&v-{{XZW&d~W#Z3++!ZBfu1ckfscNfomp+)tPDbk2Qh zzO8V9-65FE7;W3nb6Iw>qs*%z0ZGnD$6kQ@Ry8cyz8yHb9)T98Wjxl`6CsU~QqQ~Y zvYZaw@<%m?e|>K(*IKQ^?v_>w93UJh=riq)ezk#jaV`YJj1GMVOd6)s-$^4f zGpew`$8MN8A4>D*x%70KvJzR#a8*IiInM9anQG9i;L62NFwQ*(T831TJO=d0KBA$L zct8mV%8sX@&;J0fyy~x0+@iEMF6~52k-;yRCK*;8@OpLYSeGzO5Nyev$7xX5JbI5x zo;!vO8)T}ZX9Jvl1umy_4cC}{Vg@&K}NDdRBeX$t}Q=Tx}d5rFqia>qDc7jDBh04hgF4;DRGRGM)x8(zMZ) zlgm-^^T$q~U!_yLU|2X+Q-SwDP;tP{I+~M2goZ~dSPz&UN$c;$NjW}CH{RdJyRNk+6(su4yJyk5V{+Cuk@9Da`vm_fgiIuM!WG{N4Vv zzG`h{Ipfl!k(iFAoHE6iIL9Y6)+vyC_o*}^3zZyZrbIE!2n1krj>4l^ zF(*#7YkJ4?H(tMuFe9C^!zUxHQ^xL{D%7_szyP3o;;I?22?GS2RE{d-674@KjB(U( zb5U*iNgRrph9@V}f%T_t$P7+By=z0DiBrr>1qVFgtE5P7n5@_CW!oCYtmLuUqY6HP zxzicqMqR_8^vUM0#XRafqVB7V9P|U)gF24rwG0SvLpl&QWOgUh1G%ok9|zuDA3E~j zA$Htj3z7$?TmmVc5Yk}OZrb(RbWmexAdSp=dvRX96|6vH^Iunyw*eK^Tr0sHbgmiT+33SD zhjO~dwSmtb)gys{gN)RwfaHz{qXX_Y*EK5u?WvUWc;4422tHyDBz598_>tbOGalbSRqto_amIv=AH~qk-_W8to$@>xNv)a`s+r@ zDI}9BPEYyoSh^=tso1lBAau(CyB)Z!CXHmnf9!=5z^7?Y0Y z(z&Zb%Tuck-OQP`0z>dyj-4@Cvw3m;>6L&u9CMo7xQTEXj_kK2^s17;yN}99C$C(8 zD*5W~sqa%pEzDppWx?z?BmV%cRAWuxvbGK}fO*DyR=wN|(QQ+ZdgrL@D>)-rz#MKE z`GL>)SC=%~x!Q$`=J^je>~q_mE2Xuy#Aaea3y-L*C{;Y-Hz*jwl6`&abqtIGjDQY0 z^)%e9tcr?PyDW$KN`tg^^*wr4Wa!d9K*&FL)~qmN^0s-&;B)?c>5jfyG2BK6>sd*% z*^xA_5ZE#t{p@tbQF3;P8!mCs4l73I%WvLb@9J}oPi~c*>T$U~_fz=xs02`Oq5f_# z2fyo86%-tv-GyItEZD~#dz|{!X+Q)O91;oVoO=3Hv}lk2*8H<=!uOzoWA{%_K~e24q=C)|&oxLc zP>^|mmE?MiiU3%SKJZ>K?~l%>TXqf3M;-c;>qsJ2au<$q$31F^mg7r&qjv*$1a+t+ z4KV~ETyRgQ9nZaPTj^~qo1A-qI%L-5RxmCQjFsS=3=gk7(PBCJ97J{(H!OUlVh<-7 zJ-V0Smw+A5qe=Si)Spwoh~nHx z;@pEff$O)N=eVn%+4iUv#^=uqp2VKLD$UgKI|(HtY)MD{d;b8d^HVPrg|LIXOHIarxHejmMK3l6SJV8Rs1K z`qLq@;nMA31MM+KkTbL|PB`YVr28aqgi(d+6nCz}ShYi$p5r^>-|~;p;KDy==>#fNkCO+IPBB#Fw6#P5 z+!kKA2YbbP;We1_g4t}+<8ZFCtvngofC7T3y<0OI5Qk0V?md0(wK12&M z6bT{0P;%JrMRRwN#TCcyK6NMWIR1jWQ>WW3&vNn!G51%lJwGbsZY>_(W4NeCZNtA> z$kr~%f#ew6N6xt!Jx|iB&exN;4$e_=fI1K9S0-6p2;xjB$@4m8kGak&3rS_NX`^{d zAsGq=L$K%%wIFgU8%Z(B{K{|+I}ggU=e1Y)iftI}&mT(Z-q!KpGZ@0RR_BeU&{lie zZTXlI!{49F&{VWimCj@An_G@C{yv$h?P6G@4#%PNtrzm6F8gtwndgyFO>EFk(8xg` z0>B)Odr~OrH2qE(6|LmUGaRYT0QU5(+xzsCY%B-NNj-3DCPIrK`GCRTb*HPsW!zAX zLH76K-hvvrWM6GniB)!hbCK4nG^$yPC|&1J}~wDZUvKfPNG-PnoZl@GB`M6(0U40B<^Ae%~`mF!?dOdZb8pKjw-VB00V+f5BS!6tkUSX zssL8NB>Id2iluiOpv;FWyCc6^yAnHrj^_Y%&S}>|NWry~jE=*o%>y!{WH?n*)caMx zF-X_|Imu0B*0|9Hc2JBXV7M2-yMhNNo)M6)M z7X`9MzgpC_(w^j9|M)#tT=?57JfEHI&vFd6hb5mf%h z)}X7gT%Jkqnqp&-&U$+BTBb`ZLk)qKGkJwaAg^EMDEZ#$WSFzV860q|S2-ZC9sPNz z!65<0Fi%5LZz=|IM|^r3NewcTyU8qn{eJkVUiR^z7Vukhe~I`yTHFvB)*+>fC( zBPW-2lSw9EEO=M58pBsj}#OdJD(LBPQ6>&1K6D*pAmpD~+YRH?ZovE68sMPT--k0kNA z2g@VMWtm4KJGv<+ob!%@JbE6mmNB#3>5xfgBPAh;+`PoI9HWe6u;?6M6~V_)Iqwf> z@#^n8-N?3(TR@UYFo}o+V{B~Wi1+Zjn|3kK)}`vtuFG+Gp~ogIBWAaNC~q*C}N~nd3IujF<5RNp%9fgVjGDyxoZb1A-S#)8b zC5*S4eZ8tfJEH`Ve8bGUwj4MI02V47pS%tZHR}HWX81n->cF+d&D#q|CXz%+9>Bis z%?Ng7U}IbW%oTEbhO3=e+Ur(KFthkJS2*8^mxwi|(rx0m0v9qHh$U%SQ6K~>oP_xf ze(J7CImp|OHkx@Hmwd=ujm?rpSe_|jxo9K}6NAyR4j6EG0N{hyy-6jcv$pn`cnY8b zy%b<^k=nc}^<1RneQpN`p-n;bC_TxLA(Y7b2G!k@v}BwN^cgv-a$F`s#~H0>v6|VG zF$Z@{jDK3rxrlw;r@#LIUby95qt~T@Qhdg1-A36N$2qGuhs=%DzH}W1JJwyyNC+x3 z>)Ny|m|KJ(t_c|r(}Ui#jZ&*&T2@HUn|hLrrAX=sG=YviYpc5QZ>&7T+OuyZlxG`# zKMLoX9i$DpVN}_KWSX^!Vq>%x@6xU;m;*JK%_4o_jy)=Mom{VMepReyVN#v-M&{RO zxarrWXGrBv4@#Y;kyJ0J;;FIRaz`SqyPQf!=O&mekNL=HNzSGq3RJMYQpI*RJ-V~+M= z6ktSHZ4Bp({c%|F{hi`P18a_-?Puv$pq;JDDh|KriteVGN0(Yra=S%~xLV%np+XyB z!6T+erD?@^5sgt0q21W$oM4)d&qs zJXY435x0|cELfEwobiSnj8|M@)~0a8DWw))Gh_@Nhoxy--Aax;wji8iY2?&PU@qi} zJ2+%%ry*5G&AE>l01sOI9QYydH$?ERgKw<(mrhx=yQSXia0G(fXXOeAz&OTx*JLK4 z9%ga&Z!li$%2a-$y(_{0017-|<5=am)2;lwSlelqQX^7N zI0W*?9)ODd6dE3f_JMHLFf^<8S&%l|dIP}xD`RrwXi(Z|qWqgn-gpgp6D%4^rRFHYa!N}zIuLh6coHlPIHs3Vnrbx~a_H__NaSI(4CmUd z+u2<-pSx3^%DPJpVhHVpvRVghV<2SJgo0^_nrNL=bOSlADK@WkdJs!TbCA21XOj~s zETe5!g5{xZE2_F!`Pl)-y4D<|2G5oU&{9#l*w*g*n$T+yG6<(;Bk5Z9dc-h%i0o7z z^~s}IvJ{mHwsIJDsU%xy?98#TFP?MURuiC&Re2tWy3}%@JXI@=R1vp0`d6JrcOoa4 zl6;`@r>$C+SsfNw+bZ6Ny=3sVHI60N>J9Nd=@RsV*10hy;2Fkhc+Kmdxq<38e*F+t}*nzCeYG);zk35rE^L zTI6o;B`5beYOgKj_m{AROm;P_aOj7KHEu5py9IH_y<<&q;jm8cr8X9dOpDRC-3K*J zXv}i%v|_`yYh_7na>}*!G@+G9%)EM3GF&p8FG^%K8l0fch1Nb9iuVh=sB)c ztyzg;G3+>|t-OfbepEUrajxQb!&kCoIE)eW!LAQj)}&cB+T{natE#ejWDd2lmc*K?}=)i1~1 z9*3vvS$Eqc1-6CV?Tl0+Z7CG*n+F_V;joFy}MR~Qr5XfVZLi5S$Yt+M1(_POC6^XO=OLmu` z7_kK7pzZk5YFE+SE>Hy{u<9!w8_6J;pgW__E6@={_pv_Z3AHno9ZLTIjdm{i%_@LU`^gMh#}^NJ$-;f4WJm6Eu7FgS2O<98}?38CF;0I0yV|XNO%;%^Y+4 zEbAlHAY{ax9@TU;y}>OU!Z4$w6U}gr=&dkGkqlrfMaF>~zC1=+4#&E*$Ix zk=vd>!n(+9uTm5M51ejp{{T)!d17h~NK(fY(%N{g;=(3oVX+jJEsOUs*ot{tUw zqLwZ)c4x{z9CyFPi(6LSUA6 zUVhJe^1eL;stNjJR)YA(3pQJS6WPzBu{_Bl37{vj^H(Yd*KHK3xI0ygkFMW-#Y##` znv9gaH~Y6e3+?6`SB-aFL~shaZNLDNj{Q$=J!_1+mJ8iS?6z+_VloEP$RwN|neJ+q zqvCr>V{4mxuP{13Tc-fAiR@MnVwq}h9!gVZJKbzxn6+h^d9ED4_vUg(-2#+6K4&FJDB0g3Rsia z{}P(&4j)+(v^eTc=&4 z*0>=**<>L7-u1JCr#?v?A6SiAYHMTBG)+odONit~D(FE5zia;hXK#o)pTsYRP+x0D zef5N<&RKDfI3lYfpZ1Ed4eCaF*Wo^&b{LEjcXMB?pRpH+lTh$>wWAmP?WNRHg*|pi zn{qvYO7tm5nl9(g=5FatZhg*J3W=O|HIH|C(D9yYAl}YSNj29`2PrF`F<%(s>~={e z4Qaz6$0oQaZ>0y5#ctbQs}Q;7s#rNAI(Vrzb`i zx}G7OCgD*td)G9Yi)RdRQ~k4ddZ&k!cRCeD&2q{ICZRJR6_nRCMBQ&E9S1|$(^N_} zWRzmFWtB}-Y4S0egtu~QNYk-g#D@gb$i#Q7^1vRn<2VC~u2OH@*854u4M8Q>eAYCV zVR_AB-Ri3tCpB@PLz-Ki9QUX@)+NR0!ROYv%gu365*rkPc33^DpBE#2shF-YUC~RJUtr^!a7CwSri}NfcqaJ_#j{Q^^@TabJ3PgI$+Q z@b;yvLNg_ur1PL7c3Lznxg2MaUza+~?dGYeTxuGF@3^>;rIoS4b~!%4XQg&Ridvpt zBD|YcW*n{qZf<=kVZ#xght{E!C9*!1Bqf3A`qf!n=9_PGw($3cb**~sEVO$IoB7ye zMQszx8l! zD)6_*Emy;y0RI4md8b*!6};^2J?8lZ!+DIQfMCH@NKm9>k)Gt5=bu`VaH^qD1L>am z>UpZ`V`@~=ysxR%_@6=Ey3dDx9pAgz>Q03k^>!JeQXGS^epU_v2Wa46fsf8!gJ9h{w{Fi>;f99g1_V5&E+$ElP?PNSt2?w=ptB)Wae z+fO3Ov3#S-V93WEaxxALX2kMz$p%B$j1YR()$P1O`de$!C6QAo+GF0z$O%=(SB78) z?C=h7af+ZsD{is0f4^qjPbUgT7_TRq==wZ8B@|Yz;F^D0S;&jXB zYJ?p|~j355Jc~$Dz_b~LdD~TnIzjgo}v&cF1s?G~--N7CG zew~F#3Mo+_+%duaMx<#VSXi@s{Ok%k&xGwCB@x~1{Mp;JkMo+&= zmN{5TNL_)(I5{6qYP&@n%jByn7Rft~03)AH{Rh1xRj|#`wl}uZ*s=Ag-D5DFrvvmp z^_=7qH)DhJsiM080K*^-Kc!}9kpmWB$_4=SrYq$@$4>OJIXPj`swI#oU}zYbB=h*u z$m80azcD?x8gbjS1{+B4+|WA_5;pb8t1oYI@s|sg10}m~27jGGz;4>3KD4Z4^7aNH zGm;78KDei0q)`Q!;~9eCKA| zfzC(xRAG+N4gmykI6k!{xOXHI$El_^SV*MFE9yA^01VcwR=#2#pqvbx_r+9*D8M+# zJw`|2UW4Hq7&Qr5CLUrSEW@`a1Mse_4ib2p@u5$7J050bkEepe&lOwYin&X|f7=mV zD%i$a-bMmI%az(a`y3kf0k|A&KU%R3xK2O84!P53ppEv2~ zehHlMyfKwMq#?`t`juIL1pfe$P=mS7eJa~oJ900A8z$5>G*0G;kL8tZ-wqu5WQY3_%IT20*1TFzMg5bWz!=@<&e8(`XMk z!L6l(zLq@YnA=p$G!g)~qD0fsPGoHLGCl7|&mN ztoFD(ujAgatCpsX@SH(XoR=)L7_1N886Z`tPnN)egPLS8WMM`)>D<)K30!XJ+aKdz z1}6i`_CG<(v#)Ce%XcxQ#9)Fm>)Z6K`639r0}y%1{{TGI)oqGPbN&@okSRL=IXya8 zjg6p^KCdmtN^-H0C}402Bo3a{Lkz5UXOqTw?cTMnlquN51djc^dRAMoE08^ZPAlW_ zG1kY~QI>{fx5|KqnbFALRc4jcTzgAI*c4_lHrBpscuz;?7$eXD zS6vqeIXs?EN~+Nq&OaK4J8}p+d-NRE(1}oPlm-NGpHoVaf-<2# zgZyZ)B8Wwel()>s*P3g<8=sdQc7a+>nOw5~YcAqUagxS>xhS@P9F-Y8c&XD)MnYm$ zMP7OLKhCS#&$yLUAY^m?6{_Y);tt;+#|QratyZFCDO|FUN@EEcw=15QCmlWO9VECy z_UJZ^*lhPc=B&f0&*n4kVq+U){^-f?RIlzNznLVIsz|>qg>V5qGI8G&Hnt|ia8?3W z0ds;#&U4q+vaT+GY&qPy$t%Ga=~^0{^_hf00c^%FPB=dOd)G9Q#$@@B@tvo!KDC;6 zHjc!mSDA{02R%0q)a8Yw1za!7-@mRY$t)=Cys6qa_B5tOcP1bdXOV%)rZTvMa?CS= zd-~@Xt8mV~Ueo|>>_#aOB?E9A5=&>C;-BTRq7eHx4@{Q-0163cje|QCE=f_-H4sEb z00P9El6zBcEsQbk+{R4g=c&zCSsxq0A(#4fpp_j-=Z@YrX+}sVkTdz?6_Kz%%A+H8 zN$Jz;^sS&-?d0B02*!PD37PptAos!J7@?Y37EQ#Fu)`iW!jJQcLo}BhOPr2R{{XJ4 zd6Ng)m^_?hWDfo6Fl9+Z+qows^cbKHhTh8v2nBP=9r>?7yh|Hj2V1m|m6~@X9&&I` zE$znxn&K>Vdq{4e`*3E3oNwELO8t9RN8;T=%T$UZr?w)8J0^^PkeERjOgp4aD z+OeHH@Y^;3XFQ=zDqm-MNEYsUCjx-IwA2#E(AMpBANTA9c*XJCuILGwjyM0qh zid9){BI9W#Re{Dk52bN;QJv>}!{~r+IQRZ^G$hM2UzLc&K?>a9jGo!Xcoku6lIjs4WsW@KC$4zy-l^Vc;3#yE0Dp+`20P=eXD-Hy`x#)Ew`$k7x`xwBkscP3ONkYbIKc`tjDEjbqGcnA77O-K zaF2&q*ywuu5$)?zn>Y||-bwCzR+Y@s2+qX{TRXGZb{#5!jpQD4x5%KJXOr90)|!c( z#z2t|Gw&UvkPb7=Iw-4YTYrk@y;`kTBSXpjFn(<*w)~-Qa)wexZrvp{q(&)(%UM!EIB>%jP&=X$qS$a?jZHWNjo$=r%-eBKU$ncaM7&N#=tP#4%}o8;PgEz zbUUArqp>o|SOL>Kaa7%b zAEAUZ8jZv=nGRTt`x=7Gr$&sJ z+!9xT)3>cctq6AA$;UzKU0<8H2_%X?-tmVVZuZAdZ)f^eZ$G8^xMn-70z~vj} zk&+em7^{f^Ra3K`{=L0xuD8>)hKON{P1r6*bN+f_g|=wlA7?Ru*xE)|de+dQ-lkHi zW^;dLBzF8pI?|?@BfmmW9Fhfg*LIfH*6%Fa3ji^LlahGju4O#a zkxKUyD;GHcbgGENH_#3(DjtD&}akX-}Jd9)f z`%_c~0LFTC1E{5uU(NwR$-(+!fEw$_OtA~l9@Gg$WNioW zA8LAmDQ(2E9-XP*c;JlwH4JgE8P4P!if}*O;~$M6xn%+Xa;GDuP6F=8L&aA|ZiAc* z=B-BCc*xE<_n-#{#uSWkjBrK&3_c~oNu!GqhmA-$wYlk< zZndaQaM9_Pa@)c7VGQn!*z)+@y+YOs2O~Jo9E{_d^>6q?@AWzEC(|`cdnludGV@I3 zV%s9HAWl|Ss=K0P~PMu3ZXlHmgMr*6-FRl{weVvj)BoDSP zEtrC>l`WQX03$s~)BSnv!v{JxO@k;#6>>m1$n96Urpy-KIc^tDd6D~g&TnRus8(g zfIC$)dQ_YfSx#i=2=~P`Pa|;a*w@ZWFuKtDYFP!Rc{54%XhA%!8Dl5 z9N_Q|)K+1}aG?6sPC+0OpXpqGSia}B@Nr8-T9hQ;Hvkeq0APC5U?So+2YKjwVxc5p zcjxk^yoN?VPb0lJRype6(^?v)A0|~QGB7jv{VF$SM|nUP8~}Z3E#{TmYcVH)NgQBw zs?*7tNMd>GU5c|jncyRHpVlkbWz;4`j&003=<&p>_ z9-h_GsvdvToxRdVom?;bG|w?xII2$@3<34UNU_Tp+yUmdjZ5fo%Lw9&WaM#AR3v&+ zB2vSSNULh69CqO5v`)tqlaQWs$F3quH&&*q~$E9)6$LK#Q==7$B-cr{H#da`U9AU`g^6OrfAAL_77?&$? zHm}0lkdGLSRU2FmMn@k{%Bov5X_NQ2WDa=;*XdJg7oz@eFep%Q)7Sx36;XMwLfYtg zKWESawC5bqByMr(RQ&#aVVw7;`Km{yKW52QJjm2cgA%xMbCZmI znKcyB1sqkK&M}CzTqx;6qQ?RsXRCzc`d*!Kpw$Zw%l zUo}G!>w!+Z)hzZ8Dlo0>#d16EF5Gw=ds0Alf$+LB1s5d`*B=d zhNCp@s3#!jfKT$SjkNt)lzDQ72iJJ zAiuI;(jnMSHL-thtJE*5g4t+k|92airy5ZCB4jNQYrR32&Yn^Tw{(6 zGE2Y#MI#>7$^EX~5Xo;lA5rP}R(aKsxBAQ)m4s{_GApUq7Fodz#Cj1>Er1_0Og@#( z{{U&A|zH=T$bE$fntAcO_RP~|IVGLR~KGNy{R>$K_H15s>b42r9DsEmBX3ejP8*ypK@vc1lo zwdRqsv7kQHHMQK*zbf5&S0iVwTgJO#MJKyAHPYJaPB2nba({(KN~vM(vLYC(>g0Bo z)~_HNml+-E;nLJ|SeBZk(y-l%-dWm2_r-F~oRd4_S`As1{?8OZh9aVLvMYyRDy`hI z1Goa%?OcYVs?3bbjkv3)LCa&Ft}R1zr)hN9+Y!UR9nB<~os>zl?8-svI#(TKst4i! z09vw7n#AtNt)3dsQ=98|SBWju_5w_xXvd+!tjYBobsJ7t8e6@SaDeC5vSrh*56%Wh zw>7jV$En3v5i977+v}kt0pG1S%+?|Ul$F zX1P$L^RyFz`d39^r}$L-*IJ{GVHqFeT@sa*&UjIBe79eEIU90A4g3nTtAe^c^F(sO z+F~*|;SF{-(D+3m&5YB}COt3*<|~+&R{J%TIYOm-Og9k@qj%#A__oBRNGyRLd6@q4MfL;b2fk0GcApkJ zSvHpizLjqx;JA`x&nF|l2Lm3p`PNlJ7(Ah3tF2_!m#_Kn_aCTdb?1%F{-cF@L0(OF z?ef_1jRH|6#?!~w-mUAmacyK_9txEp_uZbgh?mi6n&Jb6j^t$s>CZ~T@g3tlg%$o& z&jP)O(u~#53RPtZCDh?{eGg8R(#8Q(|fPP z%e=XJ-9krZB#iJ5N8$9XO)E%-%Gl~N58qr8v5!Ud{A-=CB1`s&{{R{4Jq>n^c8zx$ zpY;(C0PTgWu=#v_qp2>N9oU>~l`dF(&LhUqs@z8(aS%B7HRP9Y{H#dn(>3irA-DT= z^plwv9CA-UE6?w3;FB>%!I+$JUM4D>y|ka1?BMD`R3e{ak++$+E%N&c`uFx+_?G?! z_O80dz$nqbm+V_b!=d}Nz1Cf zW9p~sE4vK&UEar+jit{Q8`%Bbc^X#S$2sPZ3i6MFo;Lpgg!AF%nXJyh-NuI6=cY`s z{JX#4Lk;-Xsk{L7KnlNr4h?-2VbLE8uTpTpbgesJnFhJ0p9eK++Vckl*0P407YQWn z&ebPX7zZ?`=J}SfA-O_xn$(VDBZFLWr)`f)lO$x{$rz%wuCwy^(qlhsuPi#=PxfDk_jg?mn5$>ob#*j-D|QGk-=84c4gd`kdoahOK74$ zTIW1rs%ko3m7NmX?U(lwEHFk+6f^$-6CduV-Y2bng!wx?h{Mghi-W{VG zn2eHm$EVW2M7(>fe`NR{Q@D;%4aBgRAoX{Xf*0RzPtaz*7u8Ol{{Uu-%>C=e46NKH zVnJIPZ#6YK{J^ zV`$`)>sUGJb;ApFa)deDqd4cU{{ULMt80Q3MJjJAz;tY6epSaqZ0#Ubl9@OouUFyWGYKS))vsPSq}dX%T(d6KB%S~S*UtLMyw+}~ z)U_*@Yk=EddEEa1AjS?)Zi2i#)@{{{UdbOtlhEa%DR*XXi8WNzbqOa(#706~?I#~T zeRKV4#))lhcY6)A?c_Y5D3G@0_v7i>u%)(Nl2n;xGUPA=1##0kt47CAlw0F0cC#Rl zB&Y>oW0Z1r55F3x9Rpdo*ZrkzEZ;ku6Q*`?e|7yVYNZ|dCPpmuhWXXHI%dN znrAW;Dvh29&V79`OrCiyWAb2hA@?J2t@8U4JN6@*B*9peiLlF@TC4s%(X#S=3Uy?gpm$8*-BRmwB$Zj{fv$>~YGNh79uP*P-y{N$gl zB#sU-*RQQt$;ULMfFOR9?hj(ZZX@68RVHQMxyJ*J=AbQC;gw`c|T|AG9;%X}!Md2zZ$oICFH!L+hD(X)vPu#a+ zc~kiIuWj%@!&~nYYPNB_QYN1>29ob#F^Is)+SuAj#s|5tn3oaB<^hp|w!PQFAG8OF zye*)vfL1Grq8n}HloKQil6H>FIr%{xbm_%@mxSUuHOW<^`=5$t`~dmYOdZ~mGu}Ok6!`Qz8d(iPq+JR&XabQ{#wiD z2$`Y?;1ElwDh3Ge#a*-gqWncHH*ji#+f!N9e5kIVUoJOOkik$WZ=+|NeGjH5?I+^B z8qV4e6Zm+=EbuI`%-ikKXxMP#Hba#@s@OfN*TU!2T{RwSy>D~C$8c6U6QPEgS|1F5!asc1&!F?Ai11_z&VC$+@)r z+y4NGtX)Ik&x`ETyii4O7ql`0eXnd1%f*I_I9rxytijp=`F-YGav1h`^}~I}w9iMx*e@!FSeX*)5*dQpLr@ zZcKpse8hr1v0JIHw2T~PpSsV7jkCp)ywqiU!}FXUO8Sdj_#pmey7+qWWJkiw_NEF! zCzcym7z4Lj@t+@fCT|F8^68Iomuk4%EMS1y0Q5aN*ES~!PO8&$*vj)fP99ga;% zW7?!1KpCu=SZ>KDL=}AI<64cZQ5) z&Kza>_u~e#rza#J`D#mv*M2_n9FhM3)~u5t1$xS&K6O@H zXD#o=XRyaBkVk5`ask_cfyR3NrmMOZ0Jl-bb6+)xi%(PDr6p|yS3;vaWBOB8T<}M3 z2s|G33lRz0pm)z6wANC|kOogU9nEr@Hp$V~IBuZ#sTcydV}~I3520$C`zvh79$#=7CmF%$X%v6|(EQg|R9`LF z5_*q8>`fsI0B7TajCC~Tw*BB~#|m-so(~*%rI$G+R1iNbcl>Lv$E7I|x6c}&BTlMI-Uv7Ur%nl)8h>x%Q4%7$m&m}4lcxV5J@B~HpmX{)Yxs7Oz>Oi zc&iddz=B5@Jf7M9wJdRYQL{#Rk%83xXi?M~dyuRFBvmVb4?$O4MDcv*oc-16aqUlz zDN65LE_*QV`G585gtq1wrG4PB?bW|Ja#qn2tW|j};#Md=Z$sSHB-cC^QZjoEgFXG~ zS5^v1Jai`7(qd(8sIb)Is`SzwUr5gk>0B4=2B!E5X!NR&T43p12N4-NN@Wwzrjc7q6YZJ@Iogl_~ z;eEX*C6Ld$;I+)T3yd$z)c%!|a~c+nAx*d$Vm~gOxvf962SFJ>CuPU~0Ir)H4)Skc za>oNFAAz7~%XFT27Tp_RB;+0jDmBuJ5(p|b_T#5t*18t6NWOVKW^^;o`Y~-Z2D0$pS=tX4QDz4Dk>(1={6~5~(*4$Tc>7Lb*JZT`wCw6$wNY8qf zz*|2n0c7MJ2ONxcuCf+ZjbKH}dsif__Er;p;yBxmKgTuQ>8i5Avodf-Jqh|%ElHCq zn5~j6s9j{w0P+u|IE&kK21R62z!QvQ`X6fPlE%{tkd+2Zb;lU@>;5%x=BfC)mlBQW3lhZs1Rk}E)DtwU?^4z|E#!(u5A$y5 ztBi6_e@dY~pl4PQjjP)u*V?*RqaH&?YXeUs;9*e7gO2C_0M%DpLbYpYVUVKUDsGVp z8<)Qv`eLS3-sAR%02c%jtV14sX|jnK#Atb8&~zVO)pf~M3CV7N0m<$vIIX9$<& zXC$cq0QGTLG+p#Fx0LnD&52m@%fQCgn|YE>^_xTqHg6$6nVeACtx|q_BGe0m#4{T9oLww2G%S=I33p> z{{WqFpfgraHRG=l}hf$(rB9HN1W){ zAd%&o#&nYQF|#WQ0!LhNS&eT!u3g*|e){Sm;wS+3!1Tpq++MMj zqeTk5{{X$uVrlUJ(nlLM-!KLTIl#%S33SNgxmg`ajGw0Ld*Y@ryCPFa$+EOENWN(6 zz#Z}HS8lEKHjF^enA81O^d6s;I!Q0>Bvy@A5sWV3kU^~k)MgRMCB#94bl7&PkT^g6 zYR;uQGGkKg=U+;Zzj)F%aykwwyw)*{luz)xizyyCf!%wpyki;Cb zH^>O!0n?o4KZRuMZlq#K8^965fPIHK`qj%x%%fpDK;-8cr(KD}d34&NILBgZEfJIz zZV#?H)Rb$z$N)#*pgprp{?cKM>^fr|dR8-|FvvXTr+!65oR9!M`RV>e7aU%t>8}_! z%A+Q$$8g)pW+R^7l_RcH6$6pYR&``MTk)sNTSr0mvd}C}`~#I4&tKNBSz5<^^O1<* zToaz;al!3evmBzYd}AGjZ)o?D+p?I#?nVa<%A9k9>rFBxsc}R3s3O31VYHlf{#Dh> za~;4{AjdcdYmxG|S7 zJfC{hipn_@2ii|iPfmSBI(3MU;I8BMho>~%jLWrn2i~+I=6%dACV1J0U*YM~>rC>Q za;KbnepRF`VrBi_H{;j*X^8?EHZcn73lc~f$6@PGkXX<8#s)iM9V*OnrsBll;EYxO z03rz@J7oEQ&jXy*A0e27jE~BnC|r9!_5_dzZ_1d+NXoY-7{>;s5VDY67>wWwNk7#b z4Y>nv{{UL384zYtKT%To$_C$RrJNm^@68zG73rE>&iW6O?L0V<3B}ybq{Q2n61$6) z1dcI`cJ0=^v%;Frwq2vL)EXbRMAOLx59P$bVMB%8v80cZBP+_2j;6kJvAUAlMB2p; z;8nBJ-o3}dnoe!5E=}>XSdnCkSb{XhKqM)(a9vk=fW=70a@-MLTas2ya-S8%^krov zdNr1tYoTA?_=@(>q z7_Ltux?{P^Eeo+T50Kzwa0eAst1A{GAo}`K;w78{dsVko1D{US*#>Y|r_55wOl|zT zRmEMvBIgIKKz5OaJa*!zhb#AeIj!R}m)P53#vF1~@z>ZNN}plQ-U#iU)hLrB0tZTk z)B}&lk5OF^XEkbSOH@W1%9r5Z;%N|chj zA7ySXE><1lC3gU`Z~#5Y>w#L1Jd$7>fO_^L*0P3XD(8mdk;QJptu4E}*~(*UwodGI zT=dU5`d6bt_C9|XboC-u%Iz5I*BsP{ITS{K4wYwUA2N>JGhOjVojDh6ZP}wTmE$-E z-ny#@UK10MgOJ!fezncm$t+R{BRJWH!RT@7JJ)Te+}m8-ytnxgc}185!8tfS+}C~` zsH>h`csh@jGwxs6=i&yxt?Hw~*Nz&--qqxdNEuS3U<1L&CyM&sV5&Xq@;OopI7zdF54QVb>YPLF{X* zwebdzt1HQ*-othf;fyi|3VrZvrWkj#DPpO~UM}Xu*K(7|wu;q;Xyg08H`cl5MRZ4PI?{Ww z^Itoh=b);l?=6<(d(uxToUl;7)tb_RdSazfO>8Gwr>WK3>K0Kd$bhV?>&P|Hr;cTg zJ)2bGysk;q3;=Uf8s=7P3eDy5pTu-5eB!MW((gQJa^UU2&unpAHTJ4*n7f4s*kZFK zTez|2#@{z1-l>bVQdeLk`ik0?3K7;Q%BD7QUh^bt@}~gQQs2Y3KQM2uMN+s)Tjp5$ z_7$5nbEh&!%k>zpm4=Hv>EdLbhN#vZepNr6K0R7;e|DoMxE0GYbB?sBE2jXQb*&x} zHoc4%K6kawnq5ZizV?3sP(`UQ&h{fcb6B5fd>yQL^)*sUsT7>i94|`+TxTk~XI|Q; zI1C(m^dh${b!2G9;xYQynI-7x=o=&HS{B!i%d{ZJttsGcj%As3x#=mW#=pgi&Arr1 z93ierb5^60M8jh> zGsB~LHQn`RVI|6-1d)?ivt6vRh{)qTYc6e4KQC(@MP@~IrcJ@Sj~oIhyjs+CJ?a>ZEIQ&@TXqSqTJ$UDcP6?EnUPfUjMp!5a~|W*UiGCKPogly*IPDG zhTV%{eQQ!Eo<0xb%}|b24f39~W6b39T~dQMRYlM)W{nOI5PO=>H*;jDaw)egGm?0! zL4nH(sL@s>*Vl4ct~|hZ)ykT+y!`qt2=W^&>y-Du8A{n(F6 z=iB#$gU7vf_g2X$Jo8y8X2&CLJxzAOD;`Bkj`n9WATbk;wMIviIn8u;c3n?u=Vgy+ zKU(U7Ph*O`N7O{Qm3~!Y&%H5))AAIWh=$HoP(0N*+(l}su7**n+P0)e&f|C@rV~Jc zcJ3|TcTduwkTVW)YPpLC1(%VYO=-%WhBB()^fx2D0RVnL>^P}o)x3tyxY|g;&&`qa zBDr5VhIX9e(vjwDQu?y$YO@#1b-CI_s=g6ZY6SsQB831BfB}F2^sgN8Z^Fs^SFX0F z9o)k+Cgx`t!hU(3^}hiFv#$@xGH#v-6wUr{Eu%b;(S&P zZmt@3lU8~s`KEZDv->_@U4@fR@feat#>Ba|+6Fxt7@yGBA>to{eml~v&D3HIQ)gAQ zW@$0&v6V^x0D$ECSJw9T0Fhkhjo-&lX&?L`{{UtL0%a1ACO&}+f|xz?&3TpbY&8l_ zP>a)|yMKx9P|xvrnz4;Z$9>vKeA+$zMKSI~w?^pIfUw zT6Aa2=N6B@!qmZG>HA99ihSNvO!FJ?H3$Hc9CiMcQ$xLy-eYBU<$s1Y^#t+>{#EOD zp9Z{tV;`E9F-{LvhIL{;2HH>In&K~f4dTd{q}ny|kaLl4=O028iYnl7RHe+|*U6of zb8H1wXjO~(qUD8z%X#v*5BFQs>s=Mhww4-ck<-t2V5-@|DJQEO^!io|I!}%?+kY+e zoAVYvS8HiF{MQvx?X?TYKFKAW!%SN~SC-u8+W_bDuDVI3vCUq*71C+?85)MCV->?i zbni29g-$my?4f%8B-TaD_tLKTbio21jM&~s>T7jvj+JtJ+Yc(?P7j){9Z#kkr_!uR zdpzWBjIKK1WAruVRl}y+k<&vHXr%+szG~Y|Yyk(jzpD z&?@BT@D<(oSKz;mJWqWem18EKXh<(}bfzQ={>qWL&!z@FO-&3PNz0a+xbb<78gRW? zBzM0ZlE+d8ObV0zZfHx4me?Yrb=wPSJ8yxOrnygZHAu5xjjx#x^# zup@8|b5gvg*0^UKPfioi;e1K)o4_6!)}-+6wX4Nps6-LkInqG89ApsSZRC6PuFFXA z9+|ILMXKocQC?b1GaS&cbYbj9dRN9jv`4^gf5$!`PZ#(>;*#m%Sgx(5lglh);awQ~ zy*MC|(>1aCKYTawkHhUcd3;f*PYX*fW78s)WVca|zT^Y*li64d0i5;}7eha9K6^Ex z_Bp!9>sixJg~2<$>kR4ubu~_1Nl5EdsW6>nYe{j=dsZdwz`?<+o2^xV#7r}gPDXg| zSvMMiaguAMod$8##3IGS`2M{wdvf(%vgUZ4Ij1Nbe5W7?Hhp<+H&cbR!tauOie|%Gy<5Ij&y=J4OIM zQ<||InYxxJbn9ky#vW2nT=VlCqrXa?e+@u}c`mP2e4KEK%nnZ&E1q#&60gkfBiW^c z$)JcxjEs!j4c|5gd~k78uyRW0gY~LO zH*rdGisfd7wC;=`pXL9SSYxdH~q$8A; zMRO9XF4OZq*6I)4A2If>U&S6f)Eehgi^4Y6)|yOmtWo)P=p>LP+Rv42ZO6p)7c(}bK>XIZ!dIB7Q$OuVzic9nP*_v0&)WH47(OI!xE@QdE}FT zK5v@lMZS_-$rfgoHd#OzB;$jTjGyOT$)NblMb+)@t+o3GeNOVo!{^4ik*-9hUF-(j zi~u4 zIQyrLE7iP1eWJtRsVy{j-7U$8mjJ}jh`|pLLGqH#^KR-v`qz*{sU#X)u);#h{{VXf zlD}Tq?OD*=&Ni|(-KUJ6)se8Y+3nM&lu=1g zu?>(3$@zN@dWySgEvrE^a@-i(mP~ct0on&_9`%%ww9*pIxZvlnTy-^ITPPVT`1Jow=iwQr~oE9C44OM=X#KW81jn3e0hioZxq_ zHmzpa=t34CxpoJV52gVb{#9mJW=k++m17KZ$V`^SUmat=LeqM*hL2Jgpead&0dM>Mg5QIMa!I#gWMM9*;BuzMb!)e@mC z&#hhAjIlVV#7su>_|hncX)RKDOmIQtGH z6UDXtF;nkj_eXr^wMNA51-hC*MsbW&0tRp}aZfFRbJSCJa!Eea%2BwZX>GaVJZGgw zLi4tw`GCf9KczWF2+k=DrYJjjQ;hXF#Y7nMxaR{IJZ7J@aguOzk@TY~ybgDI_x&lR z2zpMD-Z zwHnKZ&&;K0%|-8!MmDwY5c2|ulQ9jx+N${sSxRDuW|o|WHex6gVAa*E)Lp2zUy z=DTpUoODd!uLUj9)kAn%Be?BV1CoEwHB;?j#$!9l;}rusu2Ai4@$JP|cnT0O0e*LK z2q)9EeFZE_vOH>(73^+7bT;xnaBwrzHK+Zq(kMyfXDjlJ&6Q9GLC+YhD|l`l_7z>L zj&uGMakTb@S=15$-N!;YR`l_1`ZEdPV%Eizc?!47Asq5YdURTy!nQXy2O#@bJW*a= zm;m*wCgIOq6+m&1YVM_rlIn5Q!bPjIvV&chZVO`qyWfWXHiyCX%FYXVHEh_}_Gw(!YwMH!xwEGXjN? zTyzJJ3ZCbv_pW=zUl%+@;!W0;@AgYa8%%NWxOx%K1;v}F^u_2M> zaEhL!@H*D8%&XO0soe9bE+C6Ip3aO@-pAwc z&njYZlc@e1yDu(>qj|BfE8EhjOLw&79{8?%?d5tO)~Q|UErWy4_|{)k)b(oSNykUA zw|A&YpK-qm^4}d=F1c!w?cX#ZfIaco70^$7=dLIkk{Sq?CH$9n2KLlRr+Q^y-;=VAw@O>*r1X(-?W*Ep|( z%qe@F(ff{7iju_J;eEOp^L*crU!`ZhQ=X%_t(j3m?HpD#lx4~c{Z1-3AuxIlr;nvW<^^J8IOFg&6px+Tun8F%uaCykaXz;TRZBo)A`(gC z8OC|0sc;4}xaSAdQw)e0D9$<%Ff;WO$t6$W&R3D2>5B4NJJTgeWRQU4h2Z+)uBHR1 zIbI3tjDygF(yJmDMs+yOGBe1jVI}Z~4bK4QsPxTiO)H7$iNICko=;QgeMWIk*}d{R zV<)%0PKv4f!)28!U zKp{CNu6Pw?BETGc-o3d002;@X=()n31#Q7GM~jgRXx+>r<-*KyU_efKNWgu3MX9 zY}2XCq#SM>55lrnadsIXx7{a!k=Hc&5V?jIc_a{~L!L=JIs6T3*xCrl4IoxIB%XkO z`s+GGJ2HnXNEz+YtS{Oi8`($%fsFR=Nwv_Zx75HH9{O01Mcz0 zfBjX?%osig%g-OJY&ysTk<~J}>-{Q(n4Qalc;S0v@~q2JD#scLGTn#qdsVm$ac(&z zH$M5~XYi;owHG{*p5C=AasKcRQIba|k4g((WQ(;BG7{Y7jyjr*yU#iEbIv)&a5{1I zsl-tanB*SI-<(y;IE?e690gn!{AjS-u-U(};I;B)Uzvvk8OwT_s*%FmO{ii|R&M9e z4uDr(29IrhE8N`jdPalWrC)}^z@yv@DU6ebI7Q>I?s%)@(&iJNV-g)UG(aUxY~_d^ zy?O6h8lnVXRhxr_2aJL5T3XJhEHR`I?SD1+JaLTkftu!)Q#*X_3FuBRa6KzGxo~$Z z#WZS|Z`^`1MsiQ<-`bHb&CX#_gr!h8j?B{`t<(*Ij*Bevaq(Zl1V06CMth; z+yKY2j`cjlcDcyjTf&o+X$C@!g!c8We&nWiV;pqHVO?Fr=1C)rWmJ$z9dq>S_|_%e zqy>VzHvED|Vm`ErxlRa$zzV8c>(G1GZ>K^dh1N~JVHo*`Ku2NyYdRINj@l)+R?2d7 zjFazy$f=W5Xj~OLdEJsT{OaR9Oyp_FrQS-6*8c!9#Jh@v(0bP{XOK)S?OsT}Y~-;Y zT%7Y)8vf!|ks~r@T<2%;Wag_aw9)`VmSTH!9QyP%x^k9?!c8s9QO1`}-fV5q^ z>o(%nG`m=F!q(#21Kel5XI?gT6&YSPDM@cWpFfpz zk1;Ybr#SW}0rAH`6bDU@Ktsm`+ zc~C^*A`$V97bNxL9V?+=y0bZARqTuyt!;#2Nu(C>aCZ(Hw*X?QUCW`{N9HTEj7a%d z@O}8}T@IySZc(7Ojah>EuFBsiTxXp7eznEjc|t|DC}m_^wm1O${VSfWD{N~TmnkLm zcJC`RVV5AO^!61bmRGlMz44647(XC!fTHRk_7CFubU8lA`3d7m8sa)49>9$~4g7JdWWGE*Do}}SVo^=I}t0lLtFG;Qe^%^{&{Y;B(ID zoIDmcFiNC@D-(>4nLPkMt#s{qbY+G;StG;og=~c#G3YAw1 zw{PY|133AzI}_KBYRySQLMIm@uA^x@Q*311xE!gyKR4n})Qu zS$UIjAcNQP{{RZ74DBlzieRzE3EPaC#-y$k;bBCFYYC8Hi8wv6@7IbgBaTzPA&sr_ zmg!d}vttjKQBK}7oQ#josajtPTtwklusv`G=UmcS8#|QsYa65iqyU#Yjyra&xYk^% z75SL$3*Xwi_VE>-7B`2@kyNQ>7+iH9UVW>c)NgHCVR>kvHU{9l1!d`qj#Fs2ZA|Ok z66)3btB8zD!z+>04A(vOV+)Yroc@*Swl~SD=vPUouxTy-0M$DX4(1063HoBVro^PK z(U3nHB$C)Ew)ZgAq9lx;rYgj7+g!{Qw;>(dfsXX45Y74ymjr*T9IXy`P-ZfZpTc0 zC?wF9HrufeBl06PHNDjD62{D`qvZg5dsG%k(m2ClW1J2Sc<)zM7^1il`B-9kW9jNE zXvmkLemM{_Mn=%fhGydplgRY#TX!?cu)}O%496RtxljoloDPH9u`VOoBz|@d?%hT^ zewDdwV?~WFAIe>$BRhaj+yU3>e+uuz%I?Q4SlJJ{(C(SptY(U67Y(}@Iqp9?=I*rH z#E^#@bCbEa71UT+D7ekN{kV$aRZ|R&`@_!%ZaRC{q3eDewij) z!Lt|5`>)Jo;P%M;YFXy9dj*@x8`*-o4lr(y>ydAt8W3Q!j8l-w*hB<7<%^%)ICnG&NaBC(*9Ip<|qjD8o9&*05%Hv~n(=wby zkC4ne8kDmbn4!)`B-1ZaNaYCOOCFm)tzC*HOFip}7@jfP+u!x8NwQfbxsXH^0c_w8 zd{p=DHx03XNWtUN{{XL4VU}2@Lg|GEzo+3^s7|4Av>c-4h*8r$O=}7=ld+uY#wbe& zlH%3gTq7s0G1C+VI(w3Ro|J*A$fILZSObDq6@Y4}m!B-Y*ax=6lgDy-Nb4}a3Ju*z`! zdRBav(9ur&49l75&x@TrtPXf!8(Pme-X!x@^xsG{Zu*3rnHuzi+aGN;h`$-ALfZUQZzv z5>jLU9n9sk@@+g|ZsU%44-m;M+sAis{$uU=oPV?OfI#VvF~%{9lg_@h)86qSF~L0Q zts^Ew$q-|-7UzK6fyYdam5X;B#&)z@e89U;s9b}z^dO$T;=PQ1A<1$cHdlmH-#SKQ zfUw@Us-tL-ZYLP+?OFoL;jlcj`SDR3VjpYu=ii#~s#z@$b{B6^BEenVSRQ@9l}RgX z<#2ua8i*=~J92$$MJhvJagIK<6xuYB>_nx2z;3;bM=o*!6=5V&;TU|plY`QvkVm^} zlES-TV~STrVmMrIcr|J^X%}eayL~Do8;Ik9`qazvFe)~R+CD~7S6YvFzG_sAgTU!l zGOR-mz5f6ja_vwE)xjjFpRfR-nt>F%P>e) zhE4}vqx@=U+$r+G#yfVPs8t+ey*ZUj0uFL(qMJEu(@Ap{N=6RkVo3v@l`}3Q+_)pZ zdZi+;04Y57srQsc1n1hj=|S#%?lTh&W7M+*jS9Bj3k-UUS99U(D}8F#=FOz?C4vW- zIs2?4$sm9U=t=haSDz=(j&aX_dhNVFCZVKWCZlEmkyL~(it5=LNGiaBFnfyiXn7wk ziBW8Zdr2UOJMyebt0~Hzr<@wBlHlWxohses!)-9Q1O_d@$0x01@8=_m^b_cLe3wR~ zQsa+W=ybV^l8bX7P3HujhuHg9BO8)H?ORrAB$XH(9FA+Il&!hPR*l_}-D;OMvY{{q zFo2tO9#OH#$8lV~<0Pb(>(3^w%__Vt4#Ff2)C}kGsxigSp%v=k({@PX#6NlS7sbPY zv0FZdy6*$(elWGypgt36jogwbDIQ8V&-}CMo~~K>2fnS-M54th6R0ioFcL4CghBP6xdSAsiEm%5-jxAzj6r)7(Vr0`Pm* zOp|bMYMhe#HB@O%IHDL*=Ze1Mt#gLKtFhf#gxcWb^*!sKl1;}H(s9zdUJ*2MtaDF8 zR^ssRk&-~@O=L{cl1?Zjx8YE`Fc{BTBS9??rHJO-m2d7MLWtNOO06yQ(hN%@FzgRX zsLn^rP&*bCs>4Tn9G_czCQkA|M&J%;ON(v0B#)o(1N|zt(88JJ9(fdd2%0&`YZ6Ib z7e6Q>sW{2OHFY2^dVxb)`kJ)_k;x}HbTea9yQdY@Y1ZoLmg6;_6{cI}APU=tNFo78 zQQokvwUFo}o#Z*R^>*a(n$U*U7*`}@(s_u<@|+ruNo4*LTy06{&ZQWq&0({$jFc5i z?Gq;hI5lf&bMsV<8nX1}sYc4hIrTZIH?x)_y%8ORw1Wb*+5w!@Pi!1lLP?xcl&^Hm zXO-EuhQiZJY&@E~C8F=+wK7{!FhI#QqJ&O4%BA!w5>EoPY(`iU+Nu4OvyynL7E>E( zcYW*{P6@3DjY&n`N2O`aBA_fd>}zlBg+_B;bo%6~04I-XxoxjN2H6)m>TA!Q5>Hzm zq%q1W*E&1v^5B4L2+B_+){wihop&e$>s6#!Sp2v(P^OZ#j4D-><$hsp%N!ceAmf^? zZL}PAts)ojsHq)Ip>($~C5L&*?N!ls@J(slfE1BfGr2%{tBh`}j%mx0+;o$oHBh;q zdi<3}=HQcxq$Xf`@$FlxCNiyk$%%DuT6k$2Bn%H~baKUvu;!tf?IYl0nq02-v5c&> zxtV0+Jc%P`H5_*OQBwCV!1Kpy?1E88n_0@H%;uj8xyK@^N>q@< z;0Zh*Ea)i104F-T^d}+lZ(g3mWkZF?iGS(HC|QEBPOwAx{;1a z>FHZmTAivU*(1sR@#plehe5?%BbJ_F8nWe+vNM`RT>iCQNwdg2V->wU-j5*M%0cx} zjMf#zwj_S#U+75x01Bu^{S4~Yl2%ey7CV4AVoA>xdMk|m-bn4u$S1hO|&vuq! zH59CN2KXL_gH@hj+2*po$#7%ev5Df5SIS_M?oxTERF>%JmLhLSB6+6UpGwSmm$hG! zt@iaK`jQ1<$sjF->7T7_PMSQdWoH*_mIc!*Zc@V@hZUm*^u&D9F&|S{Wq<_Ku}l{@ z{c7b&HL;Zn@{E<)y(Cr_xLfOZt^of4o~W{8{`v;A?R4!8apl-rE0GUq{%{Gdp4#P3 zGHZ&h9$gXW;p=-%TQrs_2h^*yQx@8#cyMZcoIf!i#qIfMK}$&IRUzi;Nz&P7cv8o zd8~ODgT-}1jm}DywA9p=`*%}RO~63r9m8;3^~X>TtwfW~$V}0Q z*fGEjyNvL94x+m$P`k1`>e#CzMoDsd(j<&newB|k{1C|+O(LU6cA#T|$IyD!sIEaH z9<}Mw!*)D8Ml~bDzBS(ys#?Jw)N5-^#zXgqn#TYfjD69QUpw1dUCAJZCT7b3Fn&>< z_!ZiGNYtd)JX>>c(vt~xNR%9ako1qE9Nncdr3>o z`%JP8(~NwMhf>uhoJV0Bg0WyP*?=Sh22^e9^(36vH7T0JrOc7Cq@eAI*l!?pC#T_0 zZEhQQ4W5w^gK-<>W4cBIws^oNt#Y?_GhDGOdT=?x0R~J>k;ZDFc>0e8p0@^!Z8WHOD}X7j}5>is>vGOGy@FAzX8o0f*BDub7zA zb6)XF#JYv_Qt4VuGP2ppvChNtw42UJ?T|6SuEO^BOVMG|?x&PPcLYEf)pwCGM#DBw z3<(Uw9dTUWi(OMmit|*Bv3)<89I=H_#!H1!j{buK0=W$~9Ya{YZ9y08wvt=~TZxAr1Gqa$_QsC zw@iPZYUsRU;oE%|SiiHjxk+QRl%f#Icdl?TgM-I78NlycKv(jFoM0YtSSFfMM)RuT z+!?V9N{_l+GBV`t8OAE3OA41{>D!!vS~^01&(rhRb^&I?eAJQ4`%Z@ zhj!eYZsMRe&haaz(hhO!#bn*h;)=+U9nvT*v}EI;s9m}1gVc)Dj`8gf#f}Idk6-@1 zWJ*pjMmKYxts;QR+jfvK?Nj~Oe|VV(^X8&dG7z0T4?sT}l0wQ%eR_1D2nq~*y!Web zXCSaQyOmI|PzmImXO1bbsg^{EZ~-7>^cnT~S5L2Mkmrk{_~!h_5l8WsOKi($XxJF4_du4T2+=f*b!^~FY@b3tg8PVeiAb16S@hqh`l&UTENUBf*& z=|C}$&jj?P46LMW0PgFPlb+piiX_ehU}RB-&fX4Br2|Qbqn+6Mr;ci82_f3p9G-d) z%8*7lFPu<;cQ8LTNyoRnQn>8f(3RQJAdEu=JP_ThZ$)XPy@@Sz=Cco!^dNqfj8h?0 z?&I69>sG98Udrw}m- zTljlc)U>H}cua7|7T`C6rS^=HoO6!&>E68(bD=>e_HFIOyvZNPZY|exI|b>#aRZ+C z!RwlSt9790nkm!t{{TLF_*^nf$gdGbIb;KI$UVpv-G@u5%ZZ$=Xf018(EK?*uc@Vr zP3Ai*ISZZu1oCs?Z<6(4o#V@nL=-#XB{-NYY!g$IfU|!%>zd zS|qMkjxFCHIr>+&{43I6miFTQc#Ac<4=9!S12%Kps2wZKV9+%fZr;%$X{C*}A1rx; zIqX*>9{I1TG-zeB((P^MjU$yJP~tJQcLC2~_}A+EIhAu%QhP-Haq$B?lqfnYdFj5X zdVU=@HH!dx;ODum+bM?JF~Aki?p)-I;-pKgji6v=zV59ns~?QvsycG!M*P=tlZD{= zipiT$1mF^JR3@JT0lx~&l5@$fZ>yuV*QoAjT;H(;L9FPQ%EzxAYd&d-=xTc@e*XZe z98@*RT{=!$$nx(W=+N6pnuV&cG7==mBR#&Awnx zpRM)K$rl+cjldY>)j1TZvk#k|YVG7E7CvCw%aB*zv1E57 z5?cj;Bd;eP)~!jlQUK?*Qv^EYLBTmEr!{32w<@kObHEtM730lYL(oNt{{VCV!3Vj< zFhBbBZUUlB&A{kAy5pLUYZTbP1{vv$;-KfT!h0Q#wu zCzr%|0C(-hNAsMr;~&I7`t+{yGHwHMj1V!5e@bdL6KMa^{NIyq@W(rV>&F0kRbT{z z_^?}&DI_GF@&Zs`W2aB0Y*|eb3@RYU0Z$+wUcA?)^g5QK?jnxb+CALl7RU1ZMPjl` zD`XHrQgShXG0*a?9ZKnk?&c)z8*o0gm%IiAc>|ys#w#gIwI0N|GDa0xs)P6w`c?F} z9!TG`D*Ub2IrSBo5=2rmMo&z1&p)kOh&&DZ;k=RQj04{vl_e(k0)_k+4vTVP!ge_4 z9k}$Y&VJDqNKj6+fq?X1qVV1rHr_)br`bTBo8C?lJKc46-lG z*cchjWlOOLK7*$`R;|ErJl=z#_0N3PJm0;11D<>I&0<_^L?3eFh3l2>f5xWBA2Xhv z0l>z6DrD2yL6En;dJaF8SW7q5iH-~fz~r8b#Uh-HhIZeTlQ}zxQ|rZb){|Jr3I$El z6N9_g0P;W$zo;F*!l+N7#cwdPT!Ic=&s=)_DzX@0GtQ6lDFIlV4nLWyO(QF_w9)6a zwZ0Qf`$Fe|_Y^Snu2TC`b1bn3P$ZFzdFPK)SrE%C@-jf#C;1AF_Ar5ElnD2qmv(sz z_#P;A8_*Pbl_j>gwg%Kv(FBqboev5D=bRq(e@?fxc9Cu+2@;Oy z?{4%Sf~dM$*j$vhl+CjQvhny-m*#2B6lt_e$K z`4o5Q%|7eMfPLWSId7Mt?Stu3Y5Fz9avPVI%8X~^9a|atV>M4uh8d>ZtX+ZV2LO6h z-=SACWxkq8HmL}t=L^@RJLXm779@A%^X*p!unWE?MRw%pupe5U!YL7^mQu0>8-c*% z)A6cXgtRYdZ2E3*t`meGF7NLV>0L&jb#FD3Tm@L+4Y%juGah&y>(3>f=V13uxB@VP zr~d$6x7Il&)Bev1^2Y3!V}Jo2Kgh3F2GVvs%v^4cwbosR@D5j$EO0pLK>q+DxczHY zXp_u*F77ZnIqpfOMKp;TNp@syh!iI7PJO*9rmu4?-H+MWBC9X}5y;!=^{-N;M5Cd> zN*dXbm$$pHTZC5o_}s@meY04TPbTJA+&ER|u)yt8kMv6pr<%Kn zIXw6GuMV|V<*DjIo|Z#Da)E!L54 zsRTqkn~b1-^KNU)2MVT!Dux{_SOG!hU1@ z?wrcQ4v!jwr&HB}%got_}rtlik=|#9gg-DJ%CN&CGpHCt-#m|{Zmx@a5%P9|+>B=@ zj>G&b5_pOXFe(W=A5mDhZ4DN|k--OdPnV`YDpY?VyvWJU?5++CR#=}KVPBpF^Gv1Li4R8)#SpOSe$jIQ=?QqU~jgAPa<3l2^Wcd8waIjiB6DVJ9O8I0M_> zv!RIXV7Q$si0RF3-v}-4LXrVw$zhNRk&5Po5?f4Nq};f{uJGKZ zrtwWAW6NmO8AezATHu`eoM-W_igL3eYeOQ~+w4*iNg=k#;PJ@LKDDE$2m269sT{|U z!ZJx2>5xA<&xx%ekVe-#<3{-b`LGW-J*r##-zMoNXEG)-Gs2AUGDUSNjqGx`LicE; zYh^As+f2VO&z5<>9YOlmv5wm3ZM4!Du6R{3{L$wlaY^v!X~ zo#mm^8QC18+g?4w$1Fvqa506?ABA;Rz8|``w;~t$k5Qj)Y70GDa^7fELm41>oDs)= zY*#^TtzSHi6tTitmv->D&PQDF)B0DXhr>eGXO)V?)KA^mqo+e0I*d@?#GyzyCqH;| z--?dP7%XPJeT=Io%DG> zpI$vb3V-&bH&*09v;-#wha_{4rfOLA2yMWgD1*D90a>!YFJ8UPa8*gY4`P#PYIAoN z5Wyzp%Q0+)#{(VucFj$1=H5&aZH6U_3LlUMUN|@=iQY600vvdmK; zu?R$%LeeqVzd6AG^McsyDdF&wr!Hw3;&F863npyqTHUSr)1JT;p>NgpA`n zpIl_s2J)Eq=f7X+T~)pJa~cbgBuMv?kaq$z(+5A&v&)^?B!lZuk&#=RkiMK6N#+wi z_|PB#as6w`uC=l1Q}}KhTLMl_d(yGm*dqW@6A+sL1mJyYR~)D~JNU+FLM&~fiv`|J z(mkqVQ6mhTWOb)HvawR6bNs1_I5_0yw^C@y!7|#RPn6)Fr7EWOSjQd7>C>$+OT2Av zxxmF*Dy*3emRjki*Ha3L%EWtDKQ2h^pGvS0?cnF>QK;otu6e6bC?w;#9eP(vXB?oO z;}o)ifuF5hV(A!OMtb^E`Cu?8+qma7D~;GvGAnpg)a9u`S=p1@z_Z3el6Hz|jkAX1 zZC|xzjeMB+$?w-Rj-lL+p7qgATAbBsdzLGR8bOlVNI4$jqG(?Oa^x|dk2U04Kiqc#dM3d2$`h=mMnA1 zj02I!1Jb;<8>4K(R42?G{S8%1qL)5mu>`hvf^*Gx(UskgBNatcr_Q%Fd_@dU;_}hm z~VboXlBU|9E68P9ajgg1`d4-r%xj)?<{cG+kYbzZ#1hlY*J9toGV~s+n{01xNs8dl$;ZT)F&h{T1 zQCmciLV+WVLZX3y0N?@isAK`MO-#%xl#&77yCEC0=WA+LbO(y4!);iSYNTb&b;1tX zoKlinA~_osShjhr&1U0RjKrE$5zD=?BfDc_`hnckw*LTWSVG*ecNxnl#(xUh3hv1n zRBcC^<=x;?84W|vV@EYyh{iLM6u)Xh;0&6G@yMobDtI}eK^iIBab#e4s-)!Nr|VF^ z9S2I%Fz8K2?agu)0ZkyrKN@51?be!ek3(AfJq{ILP-BdN!KM}jV;QC~BCE5UVvl2T z)pZxC9H5Mx)GDCyoYbQYob{$0B!G_fqK1|^Wc}qev35IGEAotrib%?Fx0=znydgFb z^rtk)$L0dKoz%5Q(L$VMO*pd|P?B35(}v;JtVlsQ^{6)hGg|I>?mVvDNZWSof@$hs zsWjt`-RZnz7{v}ZIi(2mYRw4l4$h*N?P?AyEbap$lb*P&y@K4SSA4cQ2=0-%-OX6u zyK=mm=0@nw>a+ID4ZPI*1<=Y^gq7xLw4fT1B;%UH7a^FoYEgZhjPXaZX^Y#%tr>i} zZpo$J6AX35WIXD}gHlH}2Q=M2<_@fu#)PV&cN(FT1hzn_%!*Xx)=bO^J9w+70}M?@ zk}gQgkCfCtU-V6rOzg&Z51w7b^>J`TOW;Ax&7jj4m~Rj z-6&1@$-%`mYFS;UkABoD4|GjTd@so%w*zSX;mIDAi*n(Q6=LS&aXjQ!RFBuSba+TURH|Gg^nqzv!W)jXPb ze#Wbiw5)2!aQt#jXQ^#?E$>Ot}JEM9vTxF{|k*G*`+;R1&-tpT3 zs|-(-GLNel!WY0rc%_nitcA;bpa7HS9k+iW+_GZfb%g=hV9kC~^V#Pkz03HXeY{Pes zL9FEoC81HNPIA1BxFPa>YTdTF1OU~~{jm&LCpBF!m0tk$u36D?TAsx`Oer;Iq3AH& zjN}^9Tcr!ht_CZ{036koza*Tsd3CVo(c!UoNbO$b7#gC}g*|JV`*39iTd2>aG~R9< zYtNkn)}@HK)D25$z%(YQgZHbI7Xi4Yd4wE;T(h8eM!P!^s}OlPtBI>+de;Z$pIUNV zmE$~DEU?!*VT-p@y*h?_)_ZCb$vei;?TtVwAZ+d@s3RO>^{g1K^MUUbxR(W~?-zsn2S|TlpUDOL;BijaTl-a8bv$4oBhzUXE4Z z8ue)5bkQCTCm*e@Qb}RHL30jDWQ8oGX9pP>0OQd29Mti==`2YcO(1p(%m@Jo_l|L& z!lk+M%A(n#u`B`Ha20dO!0LSkRMd6d8^ef`>lXqL=jBnBcgJ0-IX_;Wwcetk2IlQ< zr;p7lwUVZ;-$UnridtWWbp2g*4F={pWtLe5?Yc-C%9%*d9anZvdVoR2a+*zy_vswa z0<9|yyqHx8M_x}njsWJjVz!F=QJ-75jV@%kx{_D5RNU+tiTSWTPz z*$ili;watKh+K%5W;w|O^S6Lc*Yj-06B?DI;H-YtlHg}Y4IgOk&NkP=VRZ+yy17V> z9i+H9@|1!1SEDlmM*x1D*E_0sbNd!uw~ruKUoryFx(SfJ563@mJcu&!lKJ zqSY<88SWKJ6Xp~@C?|)?fsul9j%%dW^zBN|M;f-LV-@$EnBaouUohU+?_!b?NJqPLD%_eUU&!27Imk?q>F7fsXC3WDoFql?UPc4)5X@^ zQCm;RR#6K1i-LLKn-=QPcB8; zySZ}1o;xqUt$4Mi%_iDCx=WHO36}4~(P&Xx-N>mVYS!yos0!6{oq zsyKHic61sHx^uxi7m<=@!vmZRigS;|kF8-FrcF+EP^_q~iZ+53TO+11-mbN~>COklRu&zns6VV+IrDQW_ zl#3+b;PNq1-3Xc^vmuit+y4VvC{`Q}nGGN6OV_4-v)422nN@_8ikcpPNX<^m;`3A3>7J!wGQ$-wSE8eb@<-tSD6 zu%Hjmr5wYvHMDoIwwTR)k0?=;RUi%Bv!0{cqtrDEE9-`6?NTKqkX4TF*N@V&+G8AG zcVXYI4OJY9FR4l-{{SfCuN_aNMsWU$MOV+XMJ|Bk@l=^x9$3p~ zp(nLi#?~0g^`%5&0Rtlhf1kpvq&;`983l(^oaUIa0L)bL`HY&2V@mm^Jr#_!1_}Kj4cy!O_T>L;sy+$`LPx5NqY{xF3 zf;tm|IO|O|wM0r6Rz15!ztgTP%+oL09h(lDotOeJeq3XBzU=eBtqo~BJ@#jnBDfQ_ z)L|Tr8lV`*%KVd#!;11968`qq^;shfs=>-E71vJ@C-EE;!=QYO)4*R&k0APy8fxN|bAcG$`9gnR{(lh<$=hwAw3`1(f zIx6=hwhUZ1>Fr&fk`yo}(*n60RU7v+Z6xuJdh2XSMbA6CeiiLy?aD`&k8z9{?%xZp zT08r=OpF#tl&W$;AoV?l2TJxCE)Tx1*sf=V+4IOmVicAh_co?W<>Bmv)RWI)C>?8B8TWWgXpXFFOhlq5@bh)Rr zxsFL0N~)_3;I|no)MKwo^6_=)Q&Mx1R##`zWtna(5jaAXHu>5~+fD3w=Zv+9ZtrDD z8!Hx4EFLhY1dpi|=22@mx_$Ilv0zCHe6NA{{*^APsHC#G@7Rh69nT#FN#UOi>Rv7L z{>vbaI1?nl0J-R(`~H>qwkEbG8;o@+Cgk3o^w|EVjXb+6%cF*_(x(+>-rDH>ZrOVJ zb-R`4``&3S$G3a4^rR>=gU&wp9Gq6PS0WK?Vg?RR zu6om$oQS|UBc9kN`P1-+mdPE1Q{F%!ZMewfp63+#u1%5u)BMqv;Q&;S62$s(inQ+v z#0(?@)Q@_~n*Q2Z0vO8#`^9_ynaAZ*+S|!I#T5do@>d-P)4g@`Hg`0T=_WD~2hIf~ zNwn_-?i}OmT5W3_V7n;}S1JdsbMjzLQ*mLQdvn+HsJUs`8Yw!fm2Bkmj@j)}mU%aS z5CC)}e=q*EL2YiWg8AF%Jq>F8ol!zWK2iorI5pEwD#kLAl_q?}0AL=u&rj!8VIdpl z7*m6sW33k|ZKPL>27hyq2lAyeiL*4sC|<497W^ueJLrgY5;Xq+vzqAwrdR=;$FDzH z%)HPpH1H-Yt_Lhh_343Dplj)vO%v>hfy*9x^aJ1Cy88=I@RxSp2Pe$u@${{}tdhCU z^@iP#JBVD}v9^dErzDQJ9dpu|vE|t5rz@bo)Z&}>x!%kOJnbY7$GGN$vIZtQ$7v?oqb2x)Y#|GE^Mx z#xg1`V(G4~{I^^fK~SB52c>DxsLf^OLI^Ts1U)nBSX!5v_Lnk{C149-17%u+97?u8c0UQo^sg;?Vx-RRtj`J|L zQj6Ce$2H9-+M{nWRoV|cj!rA5hD&W!$vGto{{RAvf&9DHUGl|{@<dpYh?Dgc2@U5LaOi?t>NXRE+bZ>AgY6~kn`w?$u0hqQ~mxI9Rk4l!%Lu9Vg zrsEov`P)4^0nKen4ot?aOC0L?&v3I_M9!l-a5IzB+O}-%F61uv=)pt%#Osnc&%hB z%cmC;JLH)ZU~ONodb{?ENbQzU0*S!^8HVHdd)I?gS98~jIs0q-+duSj?7m)dj7eRm zoB(=vs*zr@&Sq&c25>rJv@b4g% zr_ygN?{4Bu6D*83u;*wek~8VryYTncj4Z8ES7(q!qF$>RIV6roNau?4>q{TAL@tiV z5H~UsK)@i702w5T-TvOXp7n0-1BihETln_&>T%P7&3Dqow5-lq(M{bQ7mKe2rLfX% z9i$L*FHiyW`qv+%%l71G~P|WaRmgbp79To_#d;xh0E93g^pKISMn+T8`dWT0}{5 zp^wds_V(}1cUrEVw)PP5~F zCf-CU&mj45-3UIotjX-;c}NIweqHQxFg?w6l3iQ>0A&T5P|a`2jk;|e$GPc8E~CDO zDK4W0l%HpenN{0@RHy^!YR;Pl_3}*~pBpl^L3J1$pMEJDS6QHVqkt4Gkap(>803-L zj8t$(eQO?VSg3G8ksBNytJk6WRi=~FOpENY*fXTNjG4+VbAU$#_U5+qy=P0)gik9< zXIz%rpr-5*&wllja@T07ER3%p+6cz%DE0g+Z%ej~8s(*lOm7e+F@?zk=EglMSi<_8 z)g^5VsP%ShwrICU8GYMdJmQp9yuc; ziqM--wh84%%L&@6wL$rS$?7}$@+ytZ)L@7%Tg{8_E`2EFK-nYALSi`g$0s|7Z*2S1 zh>qn7N&B!AVEg_x5Vws2O9>_^6M!3q=NQ4s&(f&g&h2&-Adh0G;GL%)ymd7Fnz20P zsj;>air##hpG`UXKw#%0}DmiXy{jJ(dh{Rz@QoD1(KD^d}w161qxs{+BOKwrz zaI5(7pRFiSyBnR6nQ5clq=GruWRH>*gSca<$3ghi(%8M6vNWKRld&HeVfb_&m924q z6|6$z%`Guqi-VoWy?y?k)q{0BmtsArz_A={AfNI4E2eZ*R)#RD+ti8fBuL+4gC26^ z4&-zvuW!<}bSv0ovzp3v^CD~oBxI&}>)N7Q3!!)RHW8~bt6`4~k;Za;&lOG^i@h>y zi$Mr1Pt3!Qkaf>P`BpZzrp>0TiWc^lHf=m?p`qWnv2HP*4ngM?ZD(kmH%1&5`=^jW zHJNcUD}}XpaVIQ<4Y(ZOWOk{9ziYe0HpNv04%@veqMWrkYDDO#@cpgyFZL8=k%mCs zfB?xobDyBDLEr4r`6M06+d&*;j=$kuuAP5ApCZOtPnsKc4i3;e{{Sk^n@zXWCv$0! zEs1ZR0}MGMJDzX3TH5a8s284E|X?IIQWdPN}^#HnkZoWSp5KjlMw0 zz;nnP5P9aKxVc+5iaDZI4;JLdJA)|$JoNRhURl!Q3yGqA$0}QPan~619@Oht*5OQw z>&1Ij1Q%C8r80^rP#=A+Bo(Cj_T;r zNgHrL9d__I#d(A>&n56#kd;D9C?s_1Jw<8QM6%z7y)4SznTP|pT=7~gLQ2Lf3-2e` z&HGEB+prvPa52U|ooQJQI^J$DE!#1Z-#)#$rIzO0B=HCUZQElx&rf>R(KOY)w8l1& zcDUVwOK<@m{i~fFGHS&ruF~NBndLrLAe9*^N3r$APj75)5u&tgVBlb5C3*RX@91l) z(>xJ*e;1jgTYQnp;|Zb|;Rawr=CGys?EYQ}@ML;~iB%=PKFBJa9d0 zoAV{pSlZl4yCJ`L5MlGzJpNtlNiVe7U@-uNK23o9uaG`tk7|95$w1*NX zCoDp+BmtA3twT1W7NK^4Bl#m{)MK=n2--Sz!NKX$rBqk4GjWrR+R*AB!df=DV{d(9 zIkdQuK4_g-WyW$r#t#E_c;JD_2E6)z4(k@MwZq0lYBI;6$4)(K)~vM4t9fm7_Be{o zeCcK6y0<^TI}V+3#bw{$>atkgMSNCSAUi@3IE-O;1;-~Gp7qg)!$(Kd;Gvn+gXO)^ z;;jU`@&O?FidM+T+H11YRqvp9zEUFu=O7GvVyi&0&os7@<7Pfy$M8PBmE}%_-iOiB z#j9#_fx<))2Gi8B>r9S0CYWv*UZnKmy4_d8_qu2k<9(|tu$R$TagqIMq!w}giEg=5 zziAD@+s{9xC{b(TMO4Hl{nlkl3IbUCpmDhJYN|Hn=e>1_Z3Xnv#pQX5#BImk!R?XF zL3N;6%IvlhnB_*>P6PfjVS7ue0>`81KusRNPJbgPi$4aXb|oYY@pk_ny( zfk_aRbt90&sOGHsB!R~jqJ@k0szZrhiU202j1?d-$USPSM#|%_L0h^dy|v_qDPL@W z0-*2>bV3cBSc=LCu~HJ2g5ZuFw*LTHhAh0BI}^dJEmA)sC5qUC9&k^g_No!W-C30T zXP#?+XJd{voV6~v3aGtt>FZK?YDNZm;17DBTn54%U|@>evX9PS%Z>+9c&>;-+L_L> zlCef;SrjX&Qhj|7dRusieZ4@(HLa;#OLyhGjHKJfu&4kI7pFnaJxygtD1?#R_x}Lv zS7kS3c=(v!cSx|yoURXX>MF530xndJ|e*O0c!8im=NdISNU_xU9QvGVc4sw;H>=NVen^0ml6L5IO17HM!yKYfOC> zYirphj`eU=0}zk5fWtWfmmLRD#d?(AE70)eNx1&^O%K0*4e86J{5sO3zy?%ln;i*u zCqI>X1kxPjSBd-+@$QkXcy132!0d0dsJ1v|z<9yo$LE4QYuMcGIj^Oq8>^VpvVur# zvu#q|fSU3zhF=jM$C`cow=oE=tS=?EkyIVK0VNMT_V9hhdaRho^R8b{@ZN=?Pjz#o zSwm?h>-m=kCE8?claud~YpxWvOy->QX`50v6#YiyP69F(x7%VrzOms?Ws8`M+fOmECoZ5d(dBuQOGZBnj|N+HMWsa=O?ZyPBG12 zD3se6NME~9mN}>J!xaf`-Rk*Ko!pXR#y4iC5!*<^%;1jT<3C!Y(rxWbCpbCxrm4Nm zJ)+vgmr+6vV(gj=c>=$}#F{_6rUG#YK#qvh?jq zqSdcw)U25tw-oh$aoVLOJpJAULPCnk!sm54*=Y0zU`{ES3JElhKwa79qX&Q9;8IY~ zQ>l6BxX(1n&{T*^93IsX!i;cfs?EO`tBiCw>o%mWUqtn!VYFaWk(}cr7^cX>y=84| zYs+Y+$Rw2Q=}g=Tb>z}H9-V)kR|s1mRj8{Ra!yaU**-y)CpBEU=Wb6GB+SaV10Cx< z+ipo6IjT`PD(LxACX#)J<~XYV0NMpxtyP*;V0zYRDqo(URjNy=#a|IPX%nJb;zkL@ zH|^)q%N>lmwKNHh*)^3eq)F>sI_fWs6Q0zM zdcIWZXem2JtTi`N$= z*!$Lbmj{k&2a`SO4gB@3IW4iyskv&+541MWxi}RUm`8f0=O+D|hWux4er$T;g8WkD zOwrPJ)Uwka#;dcEYCYbjlQl{us3Z(|rgK5-#U)*=Xpp(|qw7HCln+`tLqG$)RlU8o z)2$`FyKs=gh24)}D&{z>y9expHjI(mBd_6E)>BmF?Dw;`uR~lirs~C3 ze(lxmy}JGfj!*Hn-ESEo)0ypo#`7i|k6dE|>6-7n72`GWWxd3{L4l!sb;{whj(tGu zUp4B!0P#+jcO|f~mf;kVvcjd+m)DM;L(O$Q6Y#%`;INkJ#!2i}S>c9AiWGN^o91vx z$lIRXv(K;Q*?x7KEN3PnE=gYM$$wTqXw7(Ehvk>^;U^f$^4d;K_3d}L^*n9s(yRs* zN+c+&9!bC)pK7=W+l*J~mUh(qN>NF@ODnVjPdOCNHAu!Wj`a@nj`Y&pb3&#kQ)Loo zZ1dij81$%%=8;{pK^zYG>ra$Z)wWp-M>Sz5Va95nX>vViaJh?Y*B7J>q~@3|4s)8# z&+?#13+(4O&rT~h1dSb8%TC8f75T;qt7&MCh(5(r*bVigpzBa#609nE=Fu=YNu35-&)(kqDp0kMP5)6cKr zQnZJuu71MdUfMYTW!|BPafj#o!`IfdlHnaPr#zAQSDxtgJ-A{D@@i5<49t?Sc@`v# zXa}wfeLLj#6@SgmXXayYSe5d&jiU#4?&O^G_QgG!l}jMpK;U%Asg4=-E?BKBZ9zAw ztD@jwb6oT?zQx`Gu>&A;gGmk1xq0B)$|E5O!Cd46!Qx{6>J? zT8*0wM11B(3b-fS^W1t?>Vzq-X}ehBsfw#vs&tjxb~TztV}VttzK2aoZ*QmB3Md;6 zI{SAd`hWWC!#ru@;iy>I*;=W$S%baU$Y6G#l~jNU9s6_b&3QWNz@)-RRpg%^ymHLQ z7yF|HqhJdGT~D!g-YcP?2=Do>M%S)9YDfEMoPbC zUJXkoxv6=+a$Go(hSqK57E{3l=Oh~NvDwXRML%aGzDL<*965)=)%MVD=6Y72uG`oP zmPoCv<8?8w$>%XJ>Se~1kkQ4wg03+KK z;}gu;b}Y@ikTcNw{{Z!?HQNlVh35-HZ;L3=EU>?OtlSlS8D*XJ&y+h&;(h z-fn*Hupj5GZTL?|O;M(6xrMsL7QrNv2$Ot=2&J2WlloT$SS0zG>EZDXOOY*Edhf#e z?ex*hA^S{@G4eQ(y@$$49@Qq9p<3HXD)^4zY4AkIt{9OqGG}R2+Q*D!=e2CCnJDx{8X1wb7wI6je)x+UA+m(+e@x{H8Po~LbGGAL-vp|-TO6GP#>_ZjX zu>%$?0+Mh>?oKPt^*b-JMkInrfRrVaPlv&MS@aGD#d(DJ*_eA|ml12V%z|Cn1SDi8;yOWE$eBQtIgIrApJg zIlBl=#EEaTvvS;E@CJRcj8*HY?akPEGWPbwbURC9(BR|p=~+v0CZ9RDfruelGCdd& ze?wA1_E3iAb$M77Du;w%LCI`$j@_%zt0s?Ll3NnZE#|+fTwh!|i6>@}*zh^)$7-0{ z2;fDrA>DFhkw!C<(3*xlBT*J>skO9_+DNVCOSj~92L~PfeYmMDV`vqnP)t&SLl05y zo|Wg+sJb)Iq?bbq;%V+(-sPF4&I>U)EIm(C^{bGp21|I(3t;)3N7M7CYcMd{Nmbw+ z1D+2;PdxipV^1&zAdrAnLj^d_-kzN+o>RHe6p}C6poOH7)unRfM$yOl%~ZIJi+QWl zCyp~$Eaym}F7C=#B;fTQj};%4HRA2GiR9eC0E$a>T8!t6@Q2Z^&DcQ zPUexj9d@EL5nvJt1dcP>vy{6N#sysShSI%3=zg4IpITOU)iJY^-@Yl`m2FBAG2TOV z$9ji&XC8x^Nr^e<0P}%R@Hg(@@kcW>u_<89%LD9tQl2`l2em=S<%TLyK|3;WkFOP1 zC}?bQImb`NgObFb%+nuwf`9tl3XNC<-9^PB!j5x~(w+u+B=JmE&pmTe=Z-lhnvfzF z80dc*XUUz+J#mVW$YseMwF@xVI%gTlIO40A8Xgk_VBmE;bo^?>XaLAO3V~d3GlF|` zsevqkdLM6Il+z^%BA#0S=kTY*o0D-+xZ~?gG0nFa%I6!go=;47t3f1IWef7J9eKrQ zjS{&;!pPg7fKCU$ew66oW>V-0PeEB1naP zV}<|~>+V0#r8#yYmINH+eSgNLFfRb|Hh^=1&#o$(p#hW+y4;dDph=S%CW|hoC(v`! zu0^QMm@&v#JhJB;dUfWr)G;Lna=(r#@a@6%UtZ_&rxF})%{Z@Q5;1X|*&yfittqY} zXGD!~c7c)W-nryl5Wr!Nr+@yvTHhj;cLi{E;~e6(OotO*bw!ss1mh$gGyeeBr@+VV z5HcCV<*D?8ZU15fLfrtGGd%H>nTVJO+olb`*)Z|me^L*wrb+<|X-BU(A(qn!vJiRt;* zoOrJO-(A$#PVoJz&fpbO0)St+Vn=UJ{=Iu1vElt2#1L%MEz(Sm9DK4b(YpTtO2N}@ zJT>7zGTO~{N=6ymEbZtwe@fxZa9FHFJ&k$C+4YiEewy7MLy+d!92G~3z|xzov|`=j zo9ofPnezCynoUV;rB)IdHoB3>$6Wm@>VF5>X;EqGKA#Ih%mO-=-OBo44!wPO>T813 z?P1ilC%Un>Q*hwrxCH0?YqId=z227rOPLgh!3Z;zHS=6Mm&S%BQ@1o#(r4Lm=4m?k z7|?R%o3n9G?@!D8jwi=jb6e|jT>&LB5Ae1=3!8jc8P{$d- zz$(Oj;nVtYS2v$5E9IDTl5>&kMbma;vs)KnA~a}Qs-Ah{^Uf*;Eb<+Lo_+dy)H{NV zuLBt1_o~lv7|8>Z-!-C|MskZ}=0aF3ok{76X>?42cwRq2_TKtY=51ix$$0y#ntEo<=0{OrIM-73v{ylSDvzq92B;MrL+NH$TG9AjX#=${R zo!^iD0A8Yt1QyPD;11{BvSkem7#sq_mFJA-u5*s{v1<+&ar=wGY~*r%D+Y~YwTsZR z$s(YUQGbY^GRx!NO@T+tT_*(YevT;Px?AbW2$cgUd!DhE&HSy00?knWabJB~@{ z0QCA+eAh6+kP|1c2Owj=Ui9NyOJH=9-0UQ~iXdetJ5K<5dQyLHNh#V6#pnP%KE11j z7xKz*Ku`|@8TO|}%3LTph`GF&X1x0Q)M#0-@ZlH9s4}z%UZ>5-g2`z0bv>WMmm=MfL3IudS`wzdkzQXTSnEc8ZxA9V}e_t_0O=U zM`;kYVL=d0k&41h3YzUgjrxBMG|=kb95DuieAt zlwL}n2J!p_zfZ`GmxrT#sOv@QQo#RkFZ@Nj{)*pAfw6K zlH-!hThLc>nu)}zw#!<5<3V!`%gUfc%kqE*N2hMJrLJ60sBe36k)t^vI}Q_~f&dxg zz6NUy#W|T)4=>9Nk^Vo0XxwRGA^THYfxWYY^c8g`xkpV}N1aV)G&jwM4IopIA5ahY z)x>6XQtYZnAy{$<`uDAwuAsP^$o<{n;ZE$c9+l;&b2HI$ zvbpDyX!lpM`O)ONvC8e|uN9+brD_qKvrMq6;~LREvm7^)Mi)HeAoZ_Ko?GsFM$bB?KGXJT9%HE7BcoY`R-2{}9-L(G za5$^i7kXM*#}sj}Wk4H_r{5%#Q{Ba7ZzIQS-@N;*#OL+zSr-NgS&YobA1UMfFL9-tHavt50(H%T4>#GD_LamRDow4rIM7gtSAUiuW48DoM#%_tH1 zTS@>%a((gMxSJ_phE_>k)81fObkT#Fd)^+f&bQG&}IeUp6E>&)ok(ox#{BTDH>GZ6Tej}0BYUNmh zat?7;?lk>GPLgU4ql&{orgIj=&zh>bp)NgftF!94Y5G9qN014^-79*=Z9?fEypgM|^tKi=8U( zOjzT(wsjIQ2118uVbybtWOc@As&e0;oZ_^(vbuC_Z4cP)6g|XZLLVEm-~RyBSMDy% zdO6esHf3`YO&=!;0330JJu8!QZq2q##*vM?qX#9s9(z{(?7D`brp0fhK&xpSK_nz7 z-M7D~>DIfcE?DYt*Y~8XV`>{Uo4ngbQR09X002s_anC$;?^J9cVLL}G?xj?f+s_#1 zuK-k}U2G8;L6S7wN(_v8l07}@IVXu=$tNIfU_M;uw|`pWn^$b>j9r4(&d2R(=94n3 zas!@EJZBiqbQ-3P*LF#8nNlOkRp=2|@$Y~E{A+<`cw}Ao zReE^sEiM)aonPe)uD>?sZ=wAwLrQyCujQ6$_F-5ess-G{E<=_8%%+oU~br;aGz4F93Ao+Ns@%;kk-KJDtBW64?NMO5c{s z*xmw#f)Dv;o}|_-<&-}=F<`Oh<^CWE^!n0nPjT8k4QpF#t!8*$Nn_t8Rb*z{hF;8j zezjWR?qPNNvOUvY=7e!~`NjnsB zNCWdft#uw%jl`1A93k!`B0M-CC~gJ-{43COtqRjl)30uI2X}>{G0Ks)(xax*bJHYa zziRJ}9jJ32Mk6qcC1iMal`)FWSiWah;c>~y=zl6(wYasP&187tcFO=VPdLy20A8+Y zl1XIC9f}r6l#u=U_s)5#tY?=}XvC#j2>y9oXCniE!>|Mlky*-4DAiPp)fu;T4y_%; zQkI5A4y;ejfzTec2cI?7tFoMhIbcUqo<(lhTTOH4*e@p89IT*#85EYz8wC9aIId@J zl!c;ha&kK#u4_0|yRo~mtENQ@!628AdB$;r>J3=a^tmRR&az-}lk+!zI-mZvW2#9c z2%$=c0OWMXUe&RoM{=695W5J_uwqY5zQ2uc1$IQ;mWJi#i+g({nwq3Av}v*S<1!wZ z2w+7(Wkgk2bn7% za@ZsoS827B*M@y4Ym2K4km=H@A<(0Y4NyS`~NfBxi%Pe-yX)0j(ER16f$YGD- z9{m1w(Ax(V(@Y~0HMC%e*Q+Qv!sKTvIqA~92tg%gdAyP4bAsISEl)tdv$%OR8SU}J zd(TEAjEwLzjlsdiAodu6&D@;Mzd+s}LfsovOXad{gQOT7xZZVY(jk5%D;n&2sX{TI9>KXe1nt!1G(TI)m6*z#?q;b zIqO+YtCF$kQKX|Qu`KScG{!RbLBkWs_Z4dEQa4eGiRx9FIKv5;h{pRjW6P#PBnft_h~FS?;{<;?%~_0ctjobqPBUK3q&9T*f+_ahh9;`Q$`}TMDGGP&#Md zsil6Q7bwci+q}0va>&SuoB$MHFi;0STylHYSZ#C}v?(X^O}?Uz6YTp=){h^3TR7{% z1XlwU)Uqmx9iPklqdf@bojc1R^PfJr=~~lz*^3hob;>51=(?1#G?9TUU~VHg!P@s&Gi%z&IJjbaRKbv}A>mqx+d0jGjo& zYtf}0ndAFp;^8Di735G|E*mI^r#LwEu9DMIj$$Qybdk#wzi;sKo(D`0c&-*WjE|36 z`UBxt!_7m-l6{uc3u|jKT6?T_el`zMMtHAh3l3?m4-XaY#>wt|CHp&QFxdEd^IKR- ze`rhuPTzRP7{SN3?AOq&a6X;uBSX<_yg8)XXxe)0x3r8RgVf`xKIHRSEJiu6sHICp zk2~7(A~)xO)Kw{SS99LD9};{(@V|#&$<(hAWaMmIy8=BxuB5qlBjSzDnV65gRTzxq z^%cfw-w=E~;#-+5bjyv;8t*&)OpjoBHP%HWcL*ej!>P^+oQ^B92`x@8cQ;}Chkn%= zZn&v-f!3JB0f0HJ66{Q)Wvd|0Iq6J%vXumaMl;5jv9057Wu=8_v61-IQ7L1bahhv^ z$j@4b%m{YlHPH%dq2^*SGH%j(7lf{URO8yB`Nnh2HW@b(aZZrA8B>pHmkn%h2`3I@ zMstsw(x5H?Jkqp;;O45x<9;*Jny1{(c$AT00bn}d(`5`AOwS+oYNyahpk9~S0weUWgBR8()XHcV&>qhp0!cmE9`wLCzOyt zBk`z&qm9P^_oS}61vs^QU zINiNUw=7ET9X;z3Sq^yT-nAwK^f}F8%7nt~pd{y-OyZh~HdO3f4N?ZG zX!R!Hnunp3pj-1er1NUGnSo3$bDvs!f~9>+4JAO%MMhkjjFL@HDWZjk7SCEu)g34~ z{Ao3FURwqfF<`$j>T%6FnM;ByRC^8Gj?E@O$^{}d8TBpp4 zC|}HC>J)TR8#(+j#XOppMA&_*pOV7h&LnN6c9i}c=dD`5LzYqZtt~7`lR_5T^W#3$ zgaQhlMIb!;RdSQ1tV%<6H1K=WIVb!nK{Qy05>$BPQ0PGikVP*40M@IG!*@(}#Q~3M z6m-;bg1&_Nhfeg&fOFVWLCqrtZWw1ZEp!xBnQdnyuN7h`!#PvX4x+Oi71W~*%6fy+ zoS=;D;QH4*=v?fjig4<5vC0VIrSpoB({Hc8YRH0MdC#?5-}2WC@W;1DAMWbQ?pe^H zIa0ul!>IS?(x*~D13AF!S*pjN$*l#zLheGUf=d&C0P1TwP*K&LP{qoA>`Q6^UFU!~ zIqU^-cmDtq{4u7pA~d&dxW|yA3{PyaACDEzc$3E05#39s>CQgR=wmFYxri(CH$A%! zM-}JM&uu3E04m)Kk_O-BF4PP<6d5=J)SheMb8akDs(UONy|;hlewC2$Gp$eC`QK2#MxCV|i)>V<@>FGZT)v;{)H?vF?07c$TYuX>o4o`+>q>YPJMv?01BoiV8Ha^tlj7uy_9iF zG&u9OZ3;sXw3R!6>7Lo@Ip}LOt)_(HWo16&7^f^kwudxubsVoHV?id)KUzG%d*Ie! zmuckwK9s(87XgMpTIHQfo~0P28yf90Dgq8$y+JhoYZ(`UaaC;XueB*Wizp^{)I{9?sg>36oDF7k9y2F2zHJNcs7sBN)hBo}86&FoJGu?xlvQ zS*TM+Pk=lfqU#!T+TV(=Ww*49ID!}k)|y2*0i|VSjeBG(w|oJ~@9aDVJVT|tT2+`L$SZLWU*vuEh4taE+ZMqJ5=xpz&zmcdYbUN7y{Gr28Y;_ETs=J=hJK&nojX;I?pg1Jpozb67Yt@* zBza>!`g7A9({)`s*3Ct{Oj(uI4=qjD(HL=wiYA-{MxSC6y`8;QiI`dW|w3qBpat7rm0|0ax&m`yct!+b3x`I&@ zcCt(tB~?F&w?3Iag<;uhpXk!q$e3pbBpszn`*i2Odd^bQLv^by!)B6cvRzEuUq2#q zf(O1apK7CNsY`DI+nCe_KYx(x++dEF_N{F@Q)aQ3O-RtYsT-IAc_X3hb68``Nmx8y zXk}&Yq&N45I{r1yd$)6SrlYqt(+J^HGcnE-ZY+PtHC90-w6Z~Rl0`IZRndW0R#Sqc z9-Q^9duzF@>|}-_5suxg2hOAu(T6#y4XY$ZYm|+P5uf5eFwf_c-{UE*l-4E;fGB9J?TS*CusE;^r>1P**$>HdeB$0 zXkwO;wj!3#U@~~7OoCM^8ww6^eq2_H~IU_mg zQQ}b`2kH(w{c%>*0CtG;mCFvi0Y)Lzbdik)~C#AM=zBw{=nzg^zUCo z+FT=B#&NeQI6wZn`O{0DbktyF0h`PK0yhjEzomP;cONLqsP^K&Rp5Cy3bhmLkLSM^ z;dV7XAGrf&n z+jEgi_T>X>F9W!&k$WLKc);TXRY@*aaTp`%S-Q5>Gi8Hs;zxaHsX}1^$@p^#g%i-Q?LhIRm%8 zYw=9xyQwKoT~F%_gAS=tg(z&2OVFZSkd0{Sl2sv z;4#m&d_7w>&$Xv?i?PaPaO^RUyN^-%^{XYr5s~*?ReE&JPtwQzrQ^ybvuss z;PdlypT@C_ZjDr|OdoK;1+Y4fDgOXyDt5OZ_Ulnd1Xxuhao)48*$N{oFgH>Tyc za@4m+Zq)18WBOGeGv;iOz!=X@daDsKkOp@j#*$f55D~#uJ(i?;C34>MU^W0dl6w9h zTGp|I6nBxfyuT>VU`{KavXLUV5;A0CB^#*%y5pz`qjqoI$Hz`H=sI?*id(WAkN?&D zzlzp*m*pG7E=V{fK;)C?D;GRp2Ia(*5yL^DjSjr{^-xQy=F5Io?4!9lbVte zZNQOtbMtfGAJVGhYpJho6~uG->OzEK;N!1h{!L5bBYUmhM|HeSA&nyd9sxm)bJO}} zq_@;O_zk4LC?qjq)qw4u)zRKu*g>U4w$YS$)SMnjC$3I0Sx<0QIi|I`x3Li2NSm;E z1mRcm>s;blG_1>=eqYC>W8GOg zUU_Qyh!M2$o<~Z5+UAEbMf9XT7qK_m3((61d|d1D`{aSdXI?nl`vi+re#+=O7N5Jq0=8TG+T^ zms5)c9G(ayoMY70q-DrOR{2hFO?FRZrduq3Xp7261%MyN`EywBXK8se6+01f7X$Dg zi!D)2UTbR-?p!66dx6+#tk>o2W*rB*yxcbzS+FjeA2<*s%Xy@e_;15o5 zOKD>?trL`DU9enWrg56x$-XZD(tkkwY*b06;hy z?V9ut_(!j=T^&_^Q-jzO*FUXouZGM@tvkmb%v2ZSEIQ*oe+u4~2~Sg+d5VkW>R}5w zOc2K^05P>0hfi>Eo+^d?x~rlpvpi?y9f(z=}(!C4tbyr%BX4n$x#xF~o89*4gJuQXa&>J1@VHE%9qhAK*e zI^*eAn@`lFJjIgi6mj=KJd@}>>!^m};@aHWM=VjQ0GS64+qpQ;TJv2gIcR!{q*M$$ z9X;*!21}JO7!&0{*~xC?eJd{N@nUxqt43cZ<{04gIP7sX;)g6!kFP9h&zBgusu)XMOrg)vM{GwDpzddZNnK_;XzQX^5>k^x@xhO^Ki?v z8&|0$^*G~-F1Klr`8O$#lz_ku!`zC8MzOoq?#xy&JH!Teu)rUW_*N9@N-tf`sZ@(Z zdXA#glB!u);J09Xhia#1sp@tu=0hj$iV#y69XLJe&cCNz*r&kR z0BNbUva~5Gx6G;l+8p)k+m8HkTGMlKGOfuNjI_JCySI{P;@qs1Z*%^J8B1>w=jA$9+1!a#o$-)1^f>N1S0aqycV03^lzN7{YjoaBghs%|p}-(33}oZD>~WfwYs-jX zAH7|%E^JDoy#8rp4%%Qwx9qw7fak=n`SJcKii(iQ~pe!XkDpERSX z$5F*f$Yi&2>KevS6A4gyamIbRR+ZhfFsIorErPij+@Hj!rWkhoXwlM0kz{n-vg8a7 zHs=SRt?S5bVuBk*-41t_lRJ*a#s)hP&2+|^QPk&^M&5^-OAV)(_RwxdOnu&i)ODqF zltuQL2z68Q42+JwDYv8ScQQoC%!|x!%gbjKLelST+c~#(je#3Cahzj5fN@@2(o#F3 z-HxM3y1s%b@9l3zzXCI~;GRJP1F-A(RjW-$P}Js_+#=k>q_AgVBMs`g<0sfxC36(8 zy3Z^=RlUJDDhNZ4pnBsq)7xD`D7TB0RLO0JlBzl5p&)b>r5WkU%<9LlQa00~`$@bq z24cr5r!nM=f%G+#B-a{BxU`cN(#w(jOP}tKYSz7vO1j!%V+xf3t_}_dB=UJRm3OB{ zDG*!5<;Apo!;(lD$cq9OXdh zD_>>3ut;XzoOI(S+;+_;*g86+2+Lr3oE|ZrmF3C|^pi~)uv?eBRolOC`?=)jjz2oy zHg|Sb>jaosT)Qsj1e4q8)AXn!jM`p{sK(NOvW#Tp41xIctve4lRdM!=vjP{GsY@AizjJ;n1G-Ix1rD0 zrJm-^ViQ2Y9Q@1>9FRL_r{F7SYStGJ+RGeo9rR8zqm-36!+M6#7~~O;dh4Y{nAEC` z>2!TM>IJ!qbxGq@J90xdK+in%Kc!^dX_iYA?>j3=8tzi3l5_O$_;#uML33j)FC~;x z+D{n$>WKE>wlFi#1D|^0roX+7%Z58#4Zwl(Vz;XprE3{NerKZT+AfRsIOHg^3Gi5{ z!B1R{I#nq&`)g?)Nn}Ya)r!XM;5b$LpnCFi#dF$Jr%+Q0-0d-s^?lBJ`_naxJ6OUU zKg?I_(08sM}+Ttmn^bos2q#s@o;8Op&+}pdJeSn56T#q{C%@r1R8Xr;^N*>D!VCV+J06UA9#1KNLw4*LM>*2 zT3G~}M$>$YQxeMJ z@+iyABP^SiBeakjA~3;-=nDM3DK(2pp3yEXz-4zUDgpO5^c?bdtoxYtBb#^-$bf)w zFhh>nJo8;AhCExY=uzFRxL3E7ZMuq81)W(+?G9D8wh1HY>x%K^DO1)e?Cz$yqjXo6 z&rq?`(m7;}tzGxS8xlw^03dYhfuEqMY;@Vg^GMrmzRre47%jLc&lxqTGG5JXYpP6% zGhg|J1UW1OCt(8vsp!7G)vGqI7N!DRz}EA|hs$By0sKVcr)<}$g`8)p=U1sxF3B7R z_N4ag>lBCVq4$h|xSVyybAm^&71uTV`kKJDQL~~d?=lR6+!9n{fyb>_wzN%B)=BjP z6D7QHs9XR~ZaM3m=CRXOxzW&@WhIqx4s(xUJuA~*;e|-Li%rRIZLhA0g5A~^--Zm^ zRa37&Po`_7wv$ZKEFrdAzwHabzb=3xAjcSx_3xb4WV+?0_MbNRipwk#kn4o`!uR<} zKQ=q!xNS?sdS#x=SRr|*iIvfq?Mf7SE7m=3Z3AYQ8@{E-{epTf6z9ZE&CN6fwpyaG-6aant{@AT1(B?>~*gZUqcy!G38v{ z5}|?I0(4@mIKe!6in(RreGdB28@+nk*6gl!&RYeKt17lX8uR=3wPwEiHRCL|2o^LD zm1P^b;HS&=$9nJlIi`4eBOG2TxYR8cRl?5*%A@wmGV(oeb3|%NrADTBa_gf~Sm=(!9?@ zvo~@5krWuNO9S?T@#F?L!*F-L zig zV0d(6$~Qg170q5P=qwDCJIMK38)UePU|eLMu5(VguvouxryvdwTvw#(x|E&JIjxafyc;WCVPt)7H5f<#v(m#-f^1 zM-UNV%C>RSrEj#R`JuX-=JI0-cVp%Y(>}Nr&#vhl07xgO`qyb|XLWtB!)!yM#;R3v z52(gDEIF!8DG@oh7GBe}y&~RN?loHo?gUIiL(h~$547WR!Ii6IE53d#0`FA*oF%%gw~dQ_GxY2n-3O(VtD z^P~?s6Qa7Ks5k_vAc2lL{{Z#t)1!#x(C{&MS5sK-b1!qT%fR0uZ@G=dRFj^4J7CvE zqiXh7w=u)1z$Gh%0e(%x(?0%$SGMUN349;oZwFgzejC)S>djcue#YSG~mInhUH#t3w z*6{A4-goXLhS}S5#-uP*Cxgy873bGBGh1EBZzB!Su~YaO_FXdRri)R~^`jgbhz2-X z?6hbX=FaYTWhegtt;KnL{{V-zeL0MmQHMgu6GFmB*#7{$r2e!dteQI`QA%zt6yl3% znk=m+ypdvsa_4{!2kX+dqtfr~!zIiQ9AoAz!vJSL&a?NMx;mSJ zjiihjV>bETy*c))x=p;Ap>}}zzECVtd0-c*$6Qnw7W3XLw(Ih_Df0Cxw9?4@2RE=_EBn4CPE)i(F;c_pQ~$Un+t$WG|aGNHX2xC9QPy?sIB--o()hjlq`;&p8+?D1SlG)M`Fx8MPi2{|K-<2B;` zDY6A4lG|+S0|g#ZfW>-(xa@Q3`B!!m5el~CXPu49=SDJ=k&)r;0^e5E>@;wyk9}~E z?$6x?uyObr{Yvo9g7hB+=_#aWHsT0}%;&2}_`zl;sp7vZ{5swvw$&|l2rXn1Tg;CH zjJPQvIa7nz80lX_UHpCckD*E-zc#md3xX72`tmvFzoD^ZBJFl#p26|6TB3H1OX^W5+bSb3d27dWn!1ko;XR#In~kAmJAv(v;n zdJ%LTKYr|Y?FYUF$nGJ8}^gK+1cdVGq#M}JRRdZ=TE2RNjcP?NjmWFVDo zr`DeMW*vy;r7&f31vz5CUZ^l&1xY-5QzIY}GrQ8KKsJ2cDkBdk0OK8dQ?l8a^EV|pltXsJnG{HRMlT{dNWMf{UigKy3jdWH#u6b(3n~o~=%jD&c zTFjb4!=J*tVH+dm>&g>u-y#-lahin5-j&EBjOL&x6-vf@jiK!M_NLPgdY+WP$2g+s ze$Aogib`IzSbk#iY2cblaNy>IkqwA>=9BR0-kfPM+KyBTK}|I#I|@yvhOQ*YvFS^U zQ}*Cymj%>^saNk{s6h~?d~f)6nepu*NV)dXYysBCU&Jxf$tDO(3^l zGs|fQUyx+}RqQ#WwLWg08S^BTrKqA}wJL!lKHhd5A3$o=m}`iZZLJt#_gG z03B&|0!Bu8$okUdSLW(3Z25UQ2o&O;6!aA+6(~$q9O_z$8uM0S!;^*t1A=qY6h*Pr zI-IHQD(%gzLdHoYK;aReY3Rfb`0JYG#8!?qO>ft-%q+9E%p%#xs;T zC7T!=fC2TdKhR%LxzsKeE4_)6B&#C{Fo}VJ3bt}M_xcL_TZs6O&Gj^G?B;k*k)=j2BxOEy%s>gdpvmBUI{H@`s4c~wA%WIa zi2Uxk*wPYk0U&3A$8SpYo2)$cYhiHuWxJ@12-ZKC$`44RO!%N+U)R)30oCXvf! zq(LlV0Dsaae73^jLXyj#Pb3aN^~HQu3|-}^`ZY{HyJflJ_ZL_4OvTaGGQ*9(CRAX1 zR;98}AX#FBE5^X@VT`v2jDIhB?KL#;Z-*m>Jw6xKuA+=?X{2!)9mH-CjhqsA2X=m) zb##p%Sk^D2x@{>UQo*5$<(du5_yDRZl0f4)87ex~v&FQov_#UvrtK}vXeNWryVNgr zATA?8vNlumG0zK};CKH3JkWze*ZfYa_G@s_Ir*eKdz=&0f$3h)p?p0levsYC6xbkU z-WBrMhXiIr^JA~w8T2*O>3$W|=esam!uEFSGa!;#qIV-0%7t7ZKkZj9_M}wQ7Uy5~ zcQh{cK6StFc8jM%BfXW7AseJc-I6^q*EM1}qiz`lDuyS4(x_Ybw@}fwJN+|5mO-fNw~H<8Hn4!viDV4Ww4}Ba z6Z380dX8$(i+n?&Sl*fR7_DKniJICAi;0PHu*Oh%4T&TSr02~bVEn3h$@9G*#nzf2 zj>6tMdx+!>`{I1LgD_MFbCLqK!JK*mM`Pu4u6H!GeS4nLrlAEJ=#Hyhn&Vp+I!2GG z`A;3Z=J}_UMU-HT@1b@rK&AdDDGI>4#{a>rt!Vll}Brrt9}@hrY2y3}7p zvyR$Z`4mY7q+VMfW49oT9u>~ zeKeuxmpg$4cJh6HrDI-R%{{}sn2bD(%BnVn&td2VO>ZsC(ufNOcEIFr$K&ZGIen*~Z>Z~BGqXBW)7ZIt;tSiDr4Gs_EE6aKfEGQR z00s{OoR6h&aofooG{sIqBYrqJ$?IJ%s~x0UO}Qk>s#~0Z-A``DrTa`D**{|uY;h*< zF!U+_;Edxr2lK93O4=JiSmtdah3AjWQ`hFlT#rhy-gC^!3>i>)Aau#@ed;TR{pbYY zlNjR!{*`LRdzcxflOhs#NQ7|M>7T}veNF6Jic1(}-E#|m=zPkYocrgGpFHPDtPp^~P#@$!@MTdB_kh7v&fnbR?2_{VE1ngk?!0P6z-34n0nCD&lPt zrt>2)9R()s?hx=Z{uLv-gJmghUe7;6Wz!j`csOX6#Dl$;ylhg740PEFoyMYXF zMM?smqX�qL+`D;E{}aeLB?zuc-J@Fk^AooR0Mf-54n2zH{Fc{pEJ6bsQQc7=8{t zMkp_rK}?yz+B#HaN-pEax3x(bz{%sV%||JAKQPGc$F&5dsS7h6GDyu?3nIc@2sj*^ z_WuCu)JwS#w@?V_*j2a)Rw<4foF7lZg3^6R<8iQI@E8)_+4rdASVrQllg>Hk1HUv# z6>Nn-G?n8f3rnEwDKnyO@k-Dd$? zZ%#id(z)}3D{a_~l7R9LuQi?L1-CE`03o*j0H1o<5-hTq<4F|Y$Z!DadGA^_%zBX9 znQ{ov7_2gi+d({aC#m570QIVGHbi!4-HK#jWb;&pu8mn{jgWyKPL0!_rDjbdc|}}> zW&5CdAAY&33oFWgTpV$NX)hxHZFS$A9Q45Us};%;%7tn z{RaTh%N8)Fc1}lZ5$m7Qq*8aB=$8`$)SnBaXhc1+%#%KOM4o0F(OG zniW=4oCO?@deSx`Muo9e!t(g)NXK96T1hVD+6GCih}jgD;BOuI#yx7xQX;n2IV9v9 z{{Wm;^xM6TT8pXZo*b}_4=(=Yj`B_c>^S{RdNSYGJ_fX`7gIG{-=vE_RN%&#!8zvz5+sQ5-~A z>t&Ux?ygvQfIl%L4&Jqkdv>OBae?X6AJViXEO;oHDJiT-so5$=(I2WT9QKTOnJSOR^x9jeqNqh?hBl%D+8%v7>= zKB5}xi-A>Cwv$Pd0#IF#@b%>M>F-o-{68#=(%2>tjGVtD zk7{oXBQ;$d)af0rJiHP{2_A%2ww~lO}2t$s8kyuGt*xQ=naSTfvWlPU+Z~*=h@A%er?D4Dpl02470s@dS zIQrH2?r&}tr+|L!F#)lF9D4mKytWr^M6P!N0u9sppE` zF6W}4kzmB?KsY|R;~!eKu{4DS;Bqnm?e+GkT}ZhstjzMZ@E6;&~u?{x#^(q^x=M z>sgnyolf3q#4i+auqDDL1bdUz)#>#aT1Je>5->BBAB|_}mP=x*bXevyp69ZQo_wQ2Q>vr~5)+-B%UMRxLfLA@bj!FEgS-dT)t+a;X1p%bx z^Oniyf$8s7ZTt&7(X+A>fH?=(p!{pDG$iyn7GXu}%we5>Prbx*S;CN~2pF?q`sX?R zm6LL0P10GaC}MVkc)&mB6=PHIui5TRyiC4iYx8fu;U#^Jnl-6aUgNpx zx-XBd)I)DAj9z9!i9qA^BGqt6MFGEdFZ9@Xa%+k}iAjzM5o z9-01C(O7s(Uey^cY?Tp-AQmA`J@f5d^lHt=l^ivwQjEQ%ospj|xvZ>gO!1gO1LOc_ zC$FhIR^5iNcQh=Dh2I}0219q}y=&WiJQmT*b*|sUh1`&lA2rGK`EWfu*0qJcm!{7Q zP{zfAlBKb~B=rNJIIfC#da`$s%{<2q6x1EgHNUlDb2QON6t>dENKjAz0IsAS9le(~ zG6N$w&Bp;pfdSvAtoemmubSe&J+R0 zcIAF2O#hkKTi2)8&WAOC?lK%iq z*KC$3ZsQ8m$GKvZfa)9W=XXr@{QWCO!`gI9EY>=tGsh%|s}NE9u+7OXeZ^X%6zp>S zYIQX+F6?YCZim{TLVyRsZKSB<<{df5PPF|-(ArwO@F;;|h{|w4U&tSz1HEo)eigN{ z)lzGTa~#p{js*-D?p!Z9&ziTsN7NIhqGUDZi{f+g=^&S5J3g)GQjjhz^ z#^&;K_g}hG()@eRa6uvsD z;~{!?HQj5T5ra!&_oyD-NMj%&h$r}cYlnbGb0bX^#5S?30H#mB*SD{^Cl%K4>y;^< zL(JVa=SN1&C*fb^{*zbANPrJ zwvVgA<_@MC+H)wsHg=Yt8;0K2AsK8;g|bwuH>L(pTBUtzOtH$}JD>@-mTWKgy}!t< z{{RkZGc+hKqH!3)xoo!}azO(lx6-xe(<8gMk#y^6re`{c}+2n%olG{^jBm?FlN5frnm|*If91^T|6T zSk#763HgWz9fw2u)f=AIHID!A{P{u}3$g(z`sY&3SO*Fzq6) zc7xCkrvtTGGD9OO7{W8I)*}iy>s`gagmoP=O?&&tjEQ4DRBFQu&`nzi3-Z zxJR5IXGusx{-J)JwdVf-XH=f4YIRoPEFA~?+1YJ#fYiL}tvHC$+S=M(it50Ox2L}q zQ%sOI?ygxxEOrvyuqUD8twnR9>Zv2zTgoN3jkhpIJ5(RyBaS`msIlzZ5z6KG zm^R!I+n(9)(zB(6pEZ&@>Sh#`K5lIePWoAYv{5a0I->lFqrbgtMRb#-P+S*|>E#O{ zT#P1qitBY8F>s=lB}B=LHsP(W0o9M<+Z%jBl7o%3dguR@S{HcGHD~Q)ZnGtq(cs_AcWE$`WFq+F@{&Tyau*PfM+)t1d3oO2Z=%$bAseM-ttv&|rJ zFHOAi4?$g2Ht^~We#vT}S_Em9ECxGzkT@qjPBU5edR@}pZTmvWvO*LtN)p379=SA@ zT2{FnyOLG4W?)2{wj6)5Gm?0zh7!+2I{B1TZ+%XIHH|qKM?JRREOWecDnZ75`Woe~ z?Pu05jl>|N54pyERb@}TwBwu}KDE+o^4e+>Jkm}j7X+flsu}mF!EEOvo`ShRbqhEC z%^`O-0wWCJTi>>Nn!2=|>_!(G8N-;~(=ROS@4vBU#l?Xo!rUlaGp{>OuN`~iiodJe z=*{Knwh^OTMIp;6XN}9H#WO6HnOQ>xU85Op*yQ!jJ?nPj*HqIkt*-TS zF*LFKppG%>dEon3Y2sfE*w|ocBoLA#$0E2NC;+nHcLdiBshf>+Qb;Z&pUgiYX^(u9 zk<)?cTvf3Am+pNA2N>>{SLiSJv~~TSpu_ZQ&kcH}ObZ0D0`HN9JnvtQK<0Wx1IB znjyHN43UxdC z2dBMp#e2tncgn7guS<(Z)HN0R4D+meNmO^hT!EjP+XRowo#O2-z{HpP{J1UALP;QH zS%UCF^#`2t0p__|2{ijv$wDo|=5pYZw;+M+4^Dqd?IrNunc~eB;_}DDc6QdfG!jb{ zmF33PVnKEYxITy1k_US2leH$&)Z(d9GJLXjS3IU)7D07xZ6^5&;}6kG069JT8qHb9 zo^B$12kFNIeGm9lUMrnG&10n5yf0~JWtBuqrG%4h4Y|UGY=jsGAajgl=beV~cKIWP zoT&a0oD6$c&DE3U)cPDfC`K9`jh?S0I)W^72&7UDQZe%Ll5nH?R=vN8w74}ZrN1pC zQj))DL|}3T0o(ZdS39EU<59bk>0+6iXaq!d$(F!4$m}c8G~WtnSJFLoobQhr(?m*@t7(SelR zfR#O^-_M_c_2~3 z#=j(LJp!%(sKvyY+Kf=12eou|mY1z*HRIb`-9rb;<;p8J86iO-n1SdsU9-nmsSjqI zquDDjowxOOJlc6y7L@(7T+{C-%>Gx|c`FzEB)aY)ztXH@yOPmXMi0oq$OouA{c)ed zwDmo6Tk#&b2-ToA(88og0x1#4>Ulhq>VFE((Y#e-VvcMKurWazz^5V9{pD^ta&cXU zg#2HuX_s#_7wv5vidSOp;|CZyUe8^6+sov4HWv3< z)|&P$5g1$xy=jspz_+T%G!st0YYzl|EgYaq_Z~GFY7U z2Ohl9PZbqqbH5XYsMD2?RJ_%EFC~T4ck!&ur2-=j%Og43+lT;-zb-L@RwRQ*J{esC zQydnP5p@`eOpa$Dpv#5@xZ~zHP50E zO%~iPr)crq+H)Pv%9jB*DFtK%?IWNB41C_kxGxzW4rw}V>>3TbN-tQm*;@v9yt2W@ z?cG&&jzR6xrPDqmX}ubEbPZp{Hz|Xh>FuTrrbQt5D)>zDSE>@7Rm@3@&mCq6I=9#2wm!iy~THZ zbWgL$>pkG|rIiDS+8_&ga(tvWI63DXMQM0b#QqHv#M*>+8f@}LVkH~oxFLQ_k{Az| z0#8cd_P+AD?9LCBxR_dos~3f|-B(AORJ=D4l!`lO2Nc$VVp~`|(btX6MR+g`))IwK$Ii-}r|?)b2FvJKwQIavlem zk+w0$S%yKv^*#RpD)$7p@w{FS)^4?ZW*hTqAxN%l%@#w8;m*ZapkRQvnZc7@|@L&JJAS{V_oWk-#ZYB@2m$mD`> z7z|?s41v_u@=7f>IaGyM`-iQ^dmo6eX7Lo0M)5=BO{gvEZ+MER4JPb2m?Yq_I63Q@ z_KPh8;g^o&gHQ0R(b?WfY@%}rD3HG5+npO|*ujE^=LBP+74yf#eOJStE&FALp$b8$ z+%DFQWq8u+78_bM0frck+2`}B`lo?!JTc<;wJDRq-p~j=k{tiOz4U9lNLF-&!io7%8T|ZN|*Jr&=S5BTWb!T*|=9wV641Q^L?mHw>rC$UdM-|mh zt4*qhn^8{oOG14&M!2_$CD!3vTcGIH$12da@sSz9=OaDyijTzK41eJx)bz`{Yn2mS z+YDhgqqKR-@tiRC>^-ZC@b0MT;$0pe63LA?%5db8Bgh~r=dnMAYwV8+YI=8qyiKF& z{wCAywaqJ4XqpL?!4bzJG5LSmEs)tgtD$2h2=hx*lC&cUsX*~x4}3G$^lM8kM@x~; zvtxNFVlq{bD&ZJ(+HiaHCcQQ<0$N_{5%}9qwQF~hFEUtS`4&l0w=<_W9Q>@m<6lmA zv&G&9@IQ#7pG1bpO53BB&Cr;9i5Y?O6dZ2Y0bhFZ-FxTF?Q@{KU!-N#zs!leG@6hphweJ^PThFEVhR%N}AbD0| zM+bu%usBomFDE(Xyzk;~i!_`4D%mvME=y_DMK9X}mE6NB`Al<`&pE9SWU{t|NPEhhLf)jv2EbA+S$Q;<}#`Yf|g$e{VYJ_m;LAV7|3zVi9jhn=XJ3hihkN zrFyh+Ej1>s^DW_{Qj>-5k3P^mbEsVSe=;h^IC53U8Bv4tpvO=^$n?!#(5^L&R9#!% z+oqzp-zitaU}xs!e6NA>k&N{AtPccu^TV2!tZZY^lFAtaAtk)dWcfZ)!-4~3b>_M~ zdqC9uIc;%wrr9;fl~O-H?{7`yfU2j^j(YK3)Uys*w6u})_>7&-%37n^JP+d^3TQXB zcACMv2p{c=j1_@kg#dNqa)3j0;DN<&d`$hQEj&A@TWOvRw}(?EF!RYa^ax4e0`bl{ zC#N;@CXeDD5b83vk*iqA6HBonxM)atkyI!gfu4iklU%2W880-O%}LB@dkpcyFu4Rq zN{~t96Tu#}^q5{J#72*?(@wpA$nfiMoeyg2w*5MPnfim_FB@onDADxoQEniD;`#{W z`zy+#RCXM$(sRM-#dhww8B<@A{u%zovs*c}Yp?j2u@l=U3=kAKWi5;i-0i_QJ*(>#JU=8FSBfoeZfve5VfN-??QRUsGAu<1 zdr14y@>>4@!TkJ>t%DJe-KwIbQEphk8`!b;C#_}aUMBGVz8$n{_%6(646!&Yxb+=H zYO%o0eO*3TE2HKsIYUHec``?+yvVAtNgvMLS)3dXzzXwiM(4%$-w-WT5!*+Y09^)9 zWFM8e;DgR_(!EfTlbWY-6H2NPifv_LKAB}75u5&CyPhv?3E7O{!PUG*Iok39L zj_jO__8yeMlDuNKj8ZVGRmrOr7&n>^0dRB2IjE<&iWf+o)n06bQgB-woP7mebp&R! zZX#J(UtnfVRFTNfTzXTCE@tYur(h(UArNO1uUKJ!%XyN4dt+$;Vt%y_tNj zQ7b^WKQ=qm?%3f)GaztyrVewC)iRCU&FIUPJh2+C8NPni4(;ehdCd(OW5*e%E)#*) zsiQl$qch$%Q`VaTyA!*y;;hXw#}tz|z)_lXSa^eD1dQXqHLpF@nZfl`swt|AQ!SuFvP759%yqc#}v+|=$%jCyqMQTaIo*0hXmxyf3j zsy;|93gjqlgMv8C5(ekLrYgXNv-f#DD$2xrj?_t{T`Dt{jONiMbG}3hKD^d0qYRj4 z;|Dm+cQU}E=EpV5YVQnDv2rj6u%`*$S4TcG45LY@Gl88L3_otBvsmYh_53Q;&C)w< z1Y)W=R&Gvl?OhI`^Uh`4q>1PillKvFZ2shNRVv3$msk6bR}GP7Scyh7s7qeFuHLt{#)(x^ieD^tuaosp6zj9y`LoY5OouyI zk+Ay?)$bkx)~_`UI@Ryr%~viYn1;-F#xvN1pTfRx562i8)a0(Y7e@a8UdPwf@Z&P} zT=-Y*Cbx=K`>(&?cB0-*%Eie8IT#$&ixAH>9;vHo))I(gk!K}O5#`*l>=X~wkz78d zF1LG`bUi@BbsI02XjEayR&FK*c+ae>%ZJ9V#k=R(u` zom)nc?lye0{{R6erb6U?wbb}e#c6YHBGoO~CRNM3{DXEn0CGsrdg7NIWb>38oR^-q z^mccDk?F_79Qq2PQG?lZyIs}Qm*CE&ELff^7sNWwli{mzCHs8sjj^E1k)F8p`qe#S z#~1o~3#$tlFJMN*n_Pxbo(=}=gX_oAxNE0_#jSOz+zXp4mSqveEMTKxecYB@V07c$ zn&iy9LBlF7;N9isw(~o(&kJ!XvRLG~H+FmZf5AOF!#ahRi0zH$pSh7v7%;&H+*e{P zL=ilUFsP-D2Vu#t81OZnouuzlihL>%n zq;p%`+_W>hdCeSo5h|Q=asv`M#z)qY4HHbgv!4EGHpLQU-b|wxU`mA~uq2VwiumkL z5Mt}p_Vp?|^tP7!tbT!l;j9K0kJaf?R(s!DzdPLa3m+NZi^yQOiaD*^5Yr$dYYuQm zd#*^X_AOgSmIb<7lw@#u88|D{a6110I{8mcy!$2WREBgY{i1Y|ttxIB!0HRJj|l;cmD z2woWkQM1Sz=gXWG&O$CoVaGx z4-azn9!_aD-ur$B)eiy>yfIWKx7;xq1DtLR_Q9KJfkwXUseS5=hKnzSr`5&wbdhvAMImpaOlbi^PWIU(gn(4WyqsW; z#GcjbQsd0FUumyY&jPQ8S)%(fevCCeLrl_2rS;TMyK)tq2M5}c-%``&*iz;u5)7#h zFh|zBo5cPalIHko^J=Rs7o*K*^4oMkv0a6GZ6gDk^W8yK&Qtamc_D{|clmNhQU||k zPsIAJE8REj^4>JcAc3~Lt;BiuZin!!Ch@)tPhgpGLi^A8zTgPo;z2k_)AXH z<-ToSRkV$aObl?u7h<65@3oaesm4YLJm=8)_|FirYB#48t?KT37%vI3$1Ym3l#|<3 zwEMR^9Y@8wc9SDotWwPMPE5-v-!RNb=~{DSFUE z$l^JWvmT>j#-nf~;2aK>@tLm^;`1oRIH~BmEf>$f%=?U=g0k$P%2+CX^V08E@^5cD zSXk^}SnstN+2@Ml6^-1_wW5)T$t$&iKmi;#U@|LL!d5?Rh((}j{!%2n=DVH}zF$>yFqs46{%U((u zWVYYuMb9A!C*=cxI|}*wm1QbV*}F68;Yu-@=SQOWgT|J+cB>@O`F8>r1WJgjx!-AW ztVaCcmE46$J@LhHUMSYD^=p5$$8$BjOSM9&V~{h9ljuEIo@&MJn+NvI)4>F2Y<#

HtxaXwlSZ^yOZ#nUDqO#{{T??Rg|u#<&sqr4x}kNTZJd0g(vG=iyKOX zoaJM(R3$jOBj)%dxVpVZyO7NzFxnZ8;m&*e*VbMO@lCC&NpY>-w0dQ|t9_(hBQbfH z00IHYB<>5IFggyVZwLGjxw5!h$9Tp5(ze2KjUzmqZb*RnHm-hVBEo~;=QEwaOg5EK=bE-2K!P?jgPUDYy;ZgRr9FnwGmZxnvw3J)BJI@&S z{_{lBEo0Pl$j$BL&WT+bE0bg9}wB! z+bk&@2^jL-B}QOLavfRomL&Dy99I*hU(cpqi`!_#l0plP8;O`Smfjbj8s#e zmXWPkCub9)y1Udh%@*rY)pcmh)7*&~*M8Y0V7L;L04U>(@r-n;-WtA}N^9x<*zg;R zN4G5(@p+89l$`Y14sZ`R$Ee0jU$joLgp74WUETB0XRjUWQ^IgQt>Rl9EJm^?nAul9 zD`81F_T%)dYR)PxErN{~d%ex)A)tot{^}SZwGq5V4_ctdhAhrk>>&FyF@BQb>}#j>>_z0Iq&j2d+m- zme0X@jfCQTMod6s-Gt?s3=pJqjQaa})~1c8HU7AkHV=dI#Qt{G3P)CA00ZmS@vfiZ zUauB~e{Z4bj1`h7h2szyh6Eje;~e8B>xxw|5!&XMdJaoN&%9Y4k#qKT(^t*9DyYhX z0Z~*181CMtxXn4Dy}$CyHMrGsPIXJ&>#Fm{hl0MD&(X~^>+ zRzvJFpTf9jRWr7g8Adi|)xTr##+BjJ)%8Y-Yei8SFlA&CV>@%4mgAu2zIoStM{lTH zUCF0z8|B`B54xRk?T<`ivjW`Sk1|M!w`noKfDi~oSd#zH!pD-5%-iIq0fI$aCi=b`VC z2UF`^3M^CT(+DL~AprW4Gw405D)J;GnEv9ps#Fe}{q2Xk)pDGD$8J5rKj7^yk{E&ZaoVd11lz{c7iw$A)eR z)xys;NXrq`u;UELM4#|`4O=j zw%`&w<2+V|&FDc73KWlB#0wp^^`F&15N=v(WB5ksv2jBWp za8qc_D#`#2>q|SU5WsCBhrqym_2&kn3I+je`g;n{=u*&VE>OvlfNEbU$PROdIr?U% zj@n7blNvL!g2X7#3NlaONSNQ{rcZCBM=_5(OoPf8AdTBjbJsZS>rag{GJWBaJ8{ig z^2!smW7Haf!>`SZgUQJs{<@^@X&RRcgz}{&&PO=M)~?x21gxs+c8|QE;FTEmtlNgl zf;SwVp2D?le4i@c$OK4O`Hpz`LHhgCBCFKc`x;L)eoUmrCP+BRP&wxnP?cABvaD3? z&tLPJvwVih+6Wjb9D#x|diU+putWvPADIILzcEi5Ov%!T$gXfn|NgRAX;kp5ISOv}>U7U5?Gz zC$0toq9ZNDz)AN2;E!&+(yOx#x%TxVr9MBAu#M(0IU}zfYS9ioh{R?`DxCr4howH& zCXPlA(DRiXAO8SdS+|jtD2a%CXF2K*Jm#M)7an@FBXVas2cSN^ITXwoHMFf6ARV~w zI({{tQb>=>&fi}7t>}{BfP?OdIOOCKdi3p3O=@heysMl_(UPREKmNRW)vE%NdzsP8 z^5Me|ew>b+Rj95BY@UaolyZGdB^ya!N8!290w&QRePaor3(TtpzDbH1<7jx8M z^3pT_C>R|NTD-DC6O{u4p4rdVun}ERR33m1YQ!bM``H=kiv1G}Rj#_93yPx&`>kkd zGOK}uouC0!yt1+r`FGB0)_zb>V4iyQsn$gwE2eh!&-v!Psu=mDYo8yPWHcu(bgal@ zB^wKm#8!=+z~8ak?(#Fh{{TEzM%bl0)Z-_C=~fUdSs5Vuj%&Z`msV%Xtg2M!&mE0f zrB(&@g~`e1*0cW71K_vHy~xH7N|_USY+t+Re=4r_ep(QEp4p{5M0s>7mJYP1?`&OC zCr$lFT>Dm5pyi`rRPZ>Zhs_PPHpuQfaZp?k@wjqVJq9sfGmo2<&(N}{MiEJ)iPWVI z03A;U=qoEMK~%ut1NHps?bBv%mi%iqr(|3J52!TpeJ0;7O`rqDYGGfOp*3l_9ZsB+M1bYF z>V5wJrF3hm>8ME&@7ko}J4Sz?uPC1WQu*9=_XDL(74ds{6eByZ!u9|Trn)7HQ%5{# za_)2*$B1pFk~kxXMq?v|$r-FG`BFJr??|;+tll((P}&S9yEXK zZ)tfMC3)tf4|#e%#2APbs~5REdR03uCP5))Tn!(G(;#1^6=T{MtfHas`zVA)0q-hD69ce7jY!?1oj6VdRMdkl~rtV z$3DY7E^$d>Lom-?r?oy?Hrh}Fz{PeS@Q>;+p_1WJKQpH01dpg33YzZ3TEh~`$nrP` zdHkv}aAkQS=*KIAVDLA$>MjO?S0G`>d zvrX`ncUHe?Nkq&!XhIxd4{mwwTT{!WC8{v5n^LCjbHrCmYnEv_a-+XMPo+#Wmrx3j zagNpPcm4~$wX~Kv*=^XTo3Qf12PY#uS1F_Dv&!act7G;!-FH5AdAaNlUvfY-(N8C~ zt)6{eB!b=#?9UT0K70d3WWtt9C(`2t2_5KwKctlI1=MGTSn(ncBf48pcBXH zD<4JGC0#*-+)iynqXh~KV*?li01OV}nz5sJydOAfh_{om;1RJ@kO0OoPfnSxxayh= zRzmy4n_ydg?H#;oSC+>GxW``SHN80LbAwfMnND2>!&$z))jrv0Z!DlPTQ~@qM8E)a zCjfFt=D6J>!ZvcvE!MMo8AGSp(%dnUW(Nf$U;yCv&MB4`vG}g&HKo)VOeM-83%_!l zVR4bq`8DYFUJ<#tyjSr4qKk2FhEX$NBkBPlZULC&fKEW?2AhiNZ$?wOlc@M=T?+9n zu3!on?sz4XeV}d`URQ?5>PJrXlc;#ITW=5~8gy17C0`)M@gr{I?=um>$>8R@pBMNi zSF_b&mrS`T!qiDL@} z?w?1L!W`cF*Rkr>OW`Z%wp~LDvrD(lgKquZPXzL#r%Iu%TUlFN7__-w;X&H0rwfmu zKdpG>hNE#K#@6v|2>8gz>%bZJ`d8836xS@G)6Ab@DRQa|j_L_)43X`R@U8OON-eX_ z;!4#iNpig%&pq)y;%S3Vwp$mFG(n{KiDzT?wt>j!rh5MXJ>3^l(XA|6eMe7dBXfmm zVl6P|?v8}Bdt-rHclvZ1taA8*3xuBQ3IfR+CLKp0F49{)HxLGErn!SpheO+_LFC=d zlWT#7kdQLX(BV&R_3FxT*&jQFt1Ba%dAvL1C^5-2hdyYL0`SL$Rm*4Ue>%cG2a8UL zyg{i*up_H2v_ZD0EIv}$?gwH20M@K1ZFT8{^1#uCfPh+33+J2=7;Z0>+;T}Yy4HoJ*b6gd5xKY| ztno1847?D-rzF>#IOLs3 z@eZ>NlWiQwECbKG1dmlykeqsPTwnYn+Qe(+y`1fCK@8{%f4UKl56VwC;1?~fpOPL{-M|N`fI98x`BzusFB$03yuL%N#Hug~ z$CnB^0!RP?I*xH(YjdpHO)NLJVWmk1>7tLQ!+fjL0GxAMR>Vd!_gUj$@Kq{P=BS^{ z>u-Erb*)EfYilaota6himpD~?^gIH=N8*09ttW#nWsR<9xwetKvSUj-g_yf_9Bm&j z89(D*TDCg3iZxgJHLzJ6?^q)k^3Wc5_6NOdSZVs6jAgsORyO%){K*MY%%=o{o+Ua9XkO<|qRGLRrhDTx(-zPl} zeEt}&kHRqD>oQxujSMo*`Dj&vZTnZ03Neg#&Pk}XT_47hT&xddclpmFMFdz0o^ypg zGo10od-z179Z!eMs?KxdT?+C^rrX-fX7GfW-Qofg8YRvL%2$UY)b~Gu*S66o(`{fH zWP;z$ZPNLVk`EXx*#jVxjxZ~NzqDxNxk)dJY7w_Fd0cH?K`cnY&p-jLn$GntG^<$k zXPV)T=)_U6#y1kfBd=QNaZPAO8xZNcHdRqC_Jr-MT*|2Bl+0vS%8qfKybN@#?V5PG zPa;WVXa4|H%Ofyer9180MRG6>H?O&a%%6Hw89 z&1Dd?C{Z?~S!sw~N|DL?y-#2(lBX?>@2*r+aYve7$$u@wLo!8jAp!ih4i|7aASmiE zdChudj-{vS(MYga+Ue7}k1kE#RB@5PEJ#0lu=>__g7lcKZik32Bs0Zsj8Z5V39|eE zOBBZ^B=)Y4#nQ!h4Y^$$qQwwMOW<#jvDA_ScOdhc&YTkWk2fD#){=yeD)BdmKeKgI zwSw;6c&>tZrWrs79k%`Ar?4Gstni+JVI&3r0Cg>tCP?D}l^NU|j!79H1L&!&}*#%UE1*|CusIKsanSJ!V`S3#uSUFj(vmmHS!s;fyBKys2`m2OAN&M||U z;)J8^8$O!7TCu{y4fHSTo*20je`xA4CYF=2`!estZ6g5p7-Q>-=cKc}f;NpUV|U(- z4C;3>GK^<(o|rqa(z?-Os`!C4?MqeDroN5>!bxITT_p!4RJ>?F+0n7|t%ua5n@U|e z{@ys2)&Q3!XU0n0D|l5jFk7~_+gD!19$`5bsv&n{TaHo9GCV|a7HZ956IEm0TF zjI*&;V&6BZzyyQ92b$=l@c#gV^bZjwwbCWsxKPe_V93qD8DD{}z$Yi4LD*v_8LeWeSnZG2RP86H zk=9sfR#R&RYekOcBXCwY&@!w|jmx+&0O0Z5de#o5qUt*4t0|jwcGj3LAP7Q7jAY<& zProLwXnJO>BGe_a)#A0VZ{0FZ#K`LW;9-7ZamgL(Nbl1?neO7fc;=E8^PJ$LZ{rHN z%YaUCf_<nPE5)!<-iUL3cU+VbAsSt7S2NDke>h{o?k_%&wu4ocss?B zXr3a{^?U1h*z1m66FMml(%t_(S7Qge-JR%PnV2g)HFJN{>DpcVQLs`&T9*0GDY@1c^)Hg_G>w>B?X8ieWjCXk}@(9Fk2nYJ6EN|G^zbUQj)f+$Hed~tE}b`rrTD0-z}T@ z_da`u=Kjdsi#ZxKxQ(EjX#;$0a#!)iRMY&+TcIM3Gs>Utp0(;f4}4Ljcv|7LEk{d( zRFFsjGmkW+cscT;KQ8h}A&4Yn0~w_{9X#Emp@H}2H2$m zuYisf)TbUvUEglrXYG}7N|jlu#?iL-TE5oY?mic2kZT?y)AZ=1Wt!qp((M>%<4{Rq zk&J)`T=Hw`{d4wp)wJR@?+t2k>akjXq{#%JTHO&CB!xM2e*M(?4r|7~2}JrYi|%Lf zJh8=aE%Ov)jHqT%PA~=wV>R^+zmERMw{582ZG=YPMtLm7P8CNalh{}1{7c0-zFVEF zK3vx%Qcf*hNx#PW+eVMrxDUeogNS%md4_Kv-bzwxN!h|N)6&{Es(YUdYd#{d(CxJy zQgwE@lrXeeTW~DH9RM6J2k2|&6D*f^O>sGAcVf)PoR;tT*0+eSE+y3Gg5{D%joLqv ziBYuU<Jg6fsPO3U!dk#*NCaLl0Oy6GRWYmd|b|5e7Y7UlNB5V4e;z2gone5c-;}94hp%kcQQ#}BH8q0zh1I>Ra9c|>Uuw2D zP)TsAe6)DM!3D5>V8f18hst>AL!N3q&r-EsNIBZ}IeQ&0=4jgBA;Kvnp2D@YT}n$G zHVrZu<4K-B_3^M_gDshJn%8cUcPy+JnPtO=Z{n>cO;f^NMe)$lGt=d*qrr6 z0FO>D&Cz0fH-tSzS==4U_MVyw_`WX#{B<&4b)a45&AWqS#|686PV! zU{6Dl^ai^?*KNfsFTl*`W zMlZ0-W~sQ3^oVX`RxDablb$+L!r^Joud()tUfRB&@WRGoYSX3d{hXbz z?yGCs{{Yvi=NG!RqjP6%VWM*D8@So2bp!#`5k1<02q72@@)D&MSqq`(^E%cY0FG z6|zc^%OasDvOg*dbjim9+Kk5!QjJ$eQoXwL`5EQdnsxB%ykpCD^n2gW&&acJp=$8z zGh1EUBf^QkCqmm>cTKy1#yi&LiD$0qDLJ+aIgkSzMKYtH8Qs?$oR0irxeZ4D09v#2 z4AU7~a6#urLk|3NitO+FDXZCdUrF(Hrw`ffwP|IB*UFR<9utQ1BhKJR>_GOfKANcR z;j%jCI&rjS_uI_D)U->x>7>-7yK8ArE;nvD9P`iRU1x<6b*q`5R=J+;M&4dm`Q3uA zIVY2hWPVl6OQTNK5!}Zdq8UDKJ~mb*x)FlIZ%*}pN%38`hU1MbrJj43ORO<4L!HAo zAQQnoYZ|=rS`?B;V=aw`g)j7&LPK}uVp*C}16&p=<7V8j z)B7Gdo=6!G`AfN!$&8ExkPp}ET;_}8F9}JYYPUMa+FG79keo;V{kVzYdJl92RMAQ^jwK=Kbcbsb3E5Bb~`CMK-{DjJYbXQT#liAqU(A*0x+6pp%OYdZf)2UAdsXs z#v?m%j4>TLjSmlamj3`&jndLcBWPs6Mo<`IuqO&t#z62 zgDKCUC-Vassl!T3bg2_H0yxa2o}{B;%I{6(Kep4&y$ z?3|ec$pgonk10ZtxOEH|ur!tihcg(kjr zS*{(1{{Xww@D=oir{d2E!Qp8B$(y^GATTYvf6FFi0m=D(?@~R@cr#gDP9&KjWsi1S zYMrA#{i~}LEv#Xe!CC2Na&0C4$EaIgtgfC+i6&H)Wx>w`bR)HW3E@8%zPaMh zFJp6QF}hMC4D9k@2n3!%I6q%n%hWaR4d`Y3E^cn*n%Z_$yCfHiL^v46GJxl{d8{7` z&7kQ%AWd=X{?lLyZ!IRzl_MYBhF%VL}e~k-lv_3!z8vk4;Q_*w|ir(J=fb(K^jRUB(_S#ypp_dbDWCj z$HTpU#ok_`kfaR|Z!AtoS6KPNk`Cj8oL7kJz8mqEg^`*|iQ^~~goZ-PwTIsMNf^gk z?febnFBbTpPHzjNv4Y;(S=hP3iQ^#ejEoRSA2OVS=~YV&C{IR)?J7Kp66)R+(ImN# zPP~>|EBFsG2)9DbBOVTLNDI)6)(*1i_3b*pJ%x3gJPT-wiYhcL{Caw#XAX9Kqt z=$fXVs%u&-b{cXUdz&BL<_2y)K=I(`EgJ%Mk~>#BquFXVI##~^C%1wNGipQ^a>UMM za97J1T;Y!ccW(6kLsQgexPwc#c`WXKv*I>0NAe`mL2 zqUsF}s|1Y8wV1-t;DSD71z0u*Q`fa!D%`E4t#7!(wi*(%ITlB`v5_?xrH1QG+vTVy z8yKC$`Y7IwJdi*f>zUCNG{{Tva$Qfi~G7eSK z95Ct_s3a4?72;a|0EX{;A*;!!O(&IlR7g80+zI0yx?uD*>frGl+PxX%V=&4QK9u57V{4cB7JU%D6k59X|jI&BXSSAQa zB{Rq*kGg*f{P?)>zN%!>HAw9tg8JW&J~6eKqQ@t;d;b9Ss?LpNKZ!1-wA3yj)8o_< zcY;~Ci5UoTtIq|P0mrRtO8rL$j+UtGK(W@_x-wv;I>GdbR zYjn38ib#ih43U)sInF=Ey)RAH^xacTgIBS*S#0i5NgRrJWk1%xFnmq$zr_9&(Gy#T zQMc4AOeoUJZ6@&%Byoldf3n`gD4hn=a_4 zUzGP#=tropslaBqd|lNUYPvlc@%e^TiNaapBWv|r8ce`&+#02HZiEchYK<;N1Dq~1 z&PdN{@C(0-ULf#Kh+jqV#++xfEPS0p&}6a`!DPuC4xnK1Uj1QxZ+~SC^_z(yxJ8mS z9SX3>KasBbb)!3|?v80-s#E2h_Io}50Ix!FzbPy_4r?aQQnb`zX)PsLQCXuUf4sd# zY2d-5Z2ROAf(DTXY!Ja^))1tf8to`=$cgn^zhQk{#dMZIi9 zkpSC)t~*%quZQ%_b}a_#?H2Y_5(u(41w9Tw3hbA1lb&njAKFvFm%eqU#0?pYbJ;4z zIa7wfY@-jMI5p3VtvXcQSVx-OJi48kej1)8qQg|5CpOQ|rTm*duz{jsmFIUtI&)W+ zJRJW3O7X9PJ}Q3}ct!`lU~erzj&Kh>NL>0725a0SP66#&s;Z*i0|3*vU6;CnkwD@H91<@&q%>PArz z;{XtOB=xRp_=r%YD)n|pqe~4^wMgNpE6JXL;}3{h2Zhzv=II)7z=c>D3u7Q-IT^)# z%kc}welCksjt024wpL_)uoEj4ARH3FZ~?)<7&Y?^_P?v@HzQHhE@htW$;6J^jtS3y zQfs8L)pZ-`{@ttIIcNYxl2Bx4epys@>+8jQHZO{C6{X8h-H(?405*MX4i2G3drH=v zy!A`bKh*laOTJx3-6n<6j?h>J-L(7TrEf>SZVw~dit*nI&8TVif7%j7B$Hhd%p(8^ z0+Yx%+kkxrE2*&YF28i7Noc7YV7Zbp(MMg|iN-6YmmXmu6tNMPH(OfYnmn5R7vrTj zEF9y?``tguqq4rgwbQM`T`>WU6aZM0^cm?~My>H1P1AD~q8X&eA&vn2v(0(0io8*A z;tfGw(rGQNQazY_u1M;BT=GqFx^23gJYT9Nb+ffV&Z~aHnp08%H=jvrg1)tX?;|u~`#tGO}aSlgGbm z`8-ZU{+yIwy)zK%PlqS2z*ONMq@MMrtAAZ757U>o+l5fJg7x zO)PahPJZv(oJ?%qzpsx@O!CcW*yFeY1mJ3&qxp_ZH{UeL|G& z?HZ5O!IrCyGjALtY)6%^< zxvp!7ps@0+`4>z6eg0?9Jf|eW;~pwB7qol3ek-%{Tb_p#PTH26`{_#{TXzv42M0JInCGWj*zm85t(-|^ zrleYYC--s9Gd$As*J|_m06O)rDAIJeosHh4e{h*Q4ncf&A6m{!t(Q9@#35U9V}ibz zt{Rl-wBV0t4_da9k@gOksNd=LvFRrIYx}9u-O<892xa9FQL@Fz>PZ7Wy=$M=d`GC< z?y$PkE^QnW3b?n5N!i%(h6IDo0SW*ksWtOmwy&vM-JA5eZ!j_4CzyAW*Qw^N$>XmQ z$uM{?UN!*jDTQzkUztE-p82jtLC0gU&Mn>OduF4ecz;fc-We}u(X~n9Ww(m zrEj+ks^nvKPeb3KKU~(Qi2O=CJtgLwcNB3nkG&ZPb|Zz{xjcQ|O7KX{bJVRhqI#VW zp$Ds49&Icd?}s95EoR>3>>zMn>NP6J2gna2D}%uY9PwPL-p*!{`%qUl&z-(uW9D&? z19v}-Ue&yNd#T-8+TTd?*;|sECMC&6IUwh^pcSFwU1IlE&|}iH+(Tgr%16S73OGKe z0Cy)9qN^ol*5@s1DoLoli+&!z*2RRHjh^eM!)@|i%HeU-9E@k6tS=GX>s}*owKagW zT;YKELoq#Yantpy{{Ri=Ei>q{&lSA0I*7dJ+C_HhwL7^JIOqeE2x0Ct(>)|Q%tFpoM5f1eRX?YUTy>9mafNX=Mz z?k#09It}T7tjvB=IV27V$@R@(>JjSeAUCE)3Rh#1^6)sp=~}kwH1Mm;k-ScPwn4+O z^<0C`(z;z_)sAIJtH^YAlHEU^-ebvu#^4Df9Fk9`HMcIIEUc0M%Rn^0n1Uo2j9bH* z6KFgWjlgHQJ!`14TOB`0ouF7ExQ1LANs8g%j4m;?n;Bz|m;-=1_O4pvQEg)Jt=R{h4n3;DT8Ks^H~Sa&mVb-j&x{_&3AR>NfWJmaHOs ziNp&NqNzr4kYDC)p!OsR?bG3(f}_5-(UV`d7xKQ;*vq)eA7;>{&RcO9!2U#!I<{v@ zl&`PJH=(MbDXUoFJPD=U-duT!X4iA80-**ZNXOn{ODF@70Xfe+SGH?cvFN^BQK#Fb zkpPIKNb9?41(+@gbti+240q@%-FRZ-PO^)`I%Ka9GcsPvlAY5PI0{i$VNuB>kVZf~ zF-iNPNG zooeFCRA}JxQ)sq`6XZApfJV{D>Q4am99Ok?cK5^ZXhJPFL$X`ckyQDUO1BRn1({HP zc&>Ql4ms^!FXJsfTUlH}|5iW7|F&ELygY_UW0d@AD$sUr8KExH0)wB`WLA zNZiAwNbYOb(Ah?lOBSJbtI8pJxguTj?qpC%h_rrI;zra^&NI#jHS_hCjeIAlc#r!! z-%6WShslE05i7E+lA?g1r^<-ATx4UW02$+i_{n$T*47}iu`+#%;YnL-Q@4D%#HFJ{ zkTbyS7aj9nZW>i9O~P<-Ph08tcl?c>6*0Jawd*yiIqezLyNMfg4XOd&;_! z#EB#GP6CXT4d@4Bjo{6C+r?fqN$p{h=Efk`8kEnut^BaNNb;pD134#q5PbU}c;;d#z|@N3nyt4Vw-WIQ|JUnc$)xcepD z)Wt+mZ9}~IU=7&8R&GyRl1Q&Ytz@HQgsG<0%r6<=>blp5JVU4WcG5S~Vulk8ZVRIF z#gzm6pan(FFnRaD`AfrI81Y5bjn z8bCPQK4v+=$n_f1t0+=->SZ+tRbQdb$D!Fh&E|_7k=k2nsARjiw?ibZK~aFtN6nVN z0{~#0b*)V|!yQXR%YQrU!9wt1`YxGn$OoJ()>H1-Dy#*vEST0Ya-wg<)Y;Ba6u&V$G5FYtt;8R zPL5dgS{_q+&2M}5MsX@`U>}wIaBAhPl+sFMi6Z^jED~S3*&O;4_*Xk5rb&Fp>C_J5 zw&d1ixk%#?g^D}_fr8&tRXLp$;h}8W#Nf!2Buf-w*b{~=(`t@-=Zdl6JB>$6)GjV; zfd*T7ZPm8&M5AdS_8=akn&z+X5_c^E`Cy!#y(qKPZ(;c$;|DlB1#`CKbTwsT(x-*A z{{XUE_=J?xr?~y&LPHh^#ao>6LCME+iknWGM(~EF*F|pOYkah5LP;E|a!{)_GB^i3 z*B@o7E%=*H)f*@yX(IWs7C?Jvfu8(wDrj}bxt7&67J0PmSpvLx1;l)i0U(?Lcpa%- z>~czl-lizm<%aru*xziIOk_Cdxop;L=BzKA%`9Wh&ro=8e0tSun4p&N%nA}RNcnv^ z$LUY8v{jS~gy)hKjxxP@IqQK~SA9Gx*lAmDv)FmCeS}tt{8=cWBJfg3-3^!ay_EwQ|>20^;B8meTotSqKoE zI|9cXdk*!zd8xq+wt94mS{S1n!xQs@ckOO+IXLT@=k+U9hf;NnD!@WFTztd=eY*Cg zEq616Xw$ILUh2_gwtqS#=1CL~aC!ri*N!n(ZS2gKOK!I8=_->GaG{EI$vEfMq|(Hi zcAq?-XEH=WyZqrtC$T&pKN`I>hI0gqGPE^s7m)U679iko_(uRQvLPo#Fft=?gaao`TV2hl0&!tpW zr$R*jQxLAdc%0)n7!{p#0s#{83lr;C$Z}dB>>rs!GKtVzhS7 z;I;_>^NO<_pktXbamTH1rKq<3*7Rp2XJHJ#nBtG>))i=D z`BVaV=CUvDe%EfEVuWNYKLhotn(^jPVn!vnBdDy4p)lN%0#8woPAQDebB486P^!B>Gb_B*4@-y zg)B!Qj{~^pii+CML{}_$!60|~S6ZV?)F7A4jbPjNa@?Ht8TF|#Z09wdHr62&_J1^U zN4pu^0q@*#T(p~G$N(Sf>?^o_n}jKr7$go!{d-qarD=1l9zubg+wlAi!>2vH>dl{r?ya2zg^Q7q{70TUa5%1= zuXNiBuOdbpk34b!=s`Wt;Y*vK+^@NVK8pAE4Ka0c`1w$60|WR*I#qjHJw7Fx*Z^ij z_n6?0y#;N}saoC6U}-j&U8Bl7au2UjSsI0ok!pfnKH=qdIUtYqWP!(Q{Y6@A%`T-0 z7V;SkXc?3Oc<2EADhH7s10<3t2toyO*!>9gs+TucFsh_wfggBe{Mq)-Gg0106wyU1 zugt?~Ty#Fa{DMNwwSrZU8B|LWkPmb8!4$}2^x%yVEO!xujB%6vy3$?P%F>CW$VT~jJ;%S}?OOKM z^Prg`NcLpD-1h5%{{ZW!#T1DjnBeXWxj}9)djrtbEj1#?FDx;l`NJfy-X4dZ^`jd@ za=&;9cnE!o#cMS7QxeP&88Pw>Fni!0zdO@-`D4v{nAqbeNp zlZ^3`>)y8Q{L5!dfSKnbzv1Y8Yb34YY+5IdR5{^JPCk@(5H< z!&Pv6$mOcJ)tT9}&nF4`cc_=`2_OXUdt$lu)I6{xwo;`!#>@!k(DC}#gc|BdNR}YH zXFI$74Sf|H)||dA4;HRpHGW-As@h|?EA%J5T?4Mp{QiEKu6IqoTlHX|2UE~eMbs?0}T22Fh2scFuAL@ND*CP^?x z)4Tdpe85P{aC*{}2_aP(B=+f1G;B+7RD;sEYWW?I*jLMv6my*8+M-ybcImo}B=#26|MkiayZw&S1}Y;*ia^rv`l#M(BYZzY@C$clm8hp9|HX<92Ko+>o9mitYaEN<>^n`*qpa%2)OPcvva1PowQ&I;zSuQ|m*rK;*P+qKk;AWxPF$a;-C{8>pS_*rDtRDv9{WJ_sM5tPY-7LIZEaHh(o1!YGV(kn zP6KXU0aAYMNI#7cq~^CSredhel`RheeP377AuxGGE(!VN&SXW#06l`!d<2@E?x}Hi zcXKx4Hmrq+Ah!daze?|XT?UO~q|DaSGTd;%UjWEU4xn}&Mm;OeG!GhH=}>A45lh|x zp;Z*d0^^gOgpL6m=CZq|RVnO_iNCDjWhzTnbozyj)E5^)-V{lO*k#;I*j_Su$IV#w zFkN16vq_aafK0PV(2_XEsXq0AeX010dzDMn5RycO6kVfdV#l0hamnVon405OhE=oj z!yK80RYIb6QchUXhqzBw^m`F%DN3v zd^!tdAoV{=;1Ybb(1vYFby0;8 zqPIf0#^QQ@ADwSTs`v*IYA<*;eKW#9=OlpT%M_}>c>xW7N;G&4}i7_Chd$eH?BB2>z=ta z$Vnx{kQTO@SwxMs3y+#tB!+JM1Miygu{g*{w2z{|<+W1hlRL4dTU;_}c2`zfbh1b! zlc`O>U<{1y9dX?C?_G_zgGYzFI6O~#a5XGW$RdVMEdb}0IRx~t8Sv$vqo~}chIhwg zZlzW8W#N^N1K;mrx;<6AU*U_Zj}I;4Tv=Pp(Ma&H0fO+y7|u`Do)Zx7p@wgQl;XYZ zx*o56cN{hr+OCmrZ3NpCu({976lHJ*G08dg_pKPU_~F#7^(}rm42y1}NaMjrW;t#M z;1P^>sdRJwz2SA#ub|s7jNo7e!togHNh6-vtb4r+Rn#sP@fa}js%_Nn+Ke_ouGFo82Z--7M&Z-Hjk>? z#tZ{4U+%fbPF)w8bSw zRW7?@E;-08&wku}Ye~k-lpRF%Tbg>$fuXh*p|5+K$1(1Cb)2PBpR@CR}4U5)YcydM?!iYEIThCgR8y2<9U{Gb&dFx&6Nd4=wT zX49Wmw7&aMX#{FEkj}*5w zy`p)%cY8gio2u&4CZB%8eABrb+l~SfbB+dh2aeTuPrTE7EZ4R-a5;+VHildHP=`(i zO0xhLCypzYrXC#kj>gz*(-5dQ)w7Z0(&*Q^w~4hI-?v+7^UC>QX$e)2rtP@Gr@7D4 zjcehyydZ+g2`;Wd~w~hRH zs9i+*Zl62IESLtlM`EP50RRjGj+w!(PRHUFzI73&SWYKc*XEK$0g*ril27q<12x?m z%9>GUitx27&Q)XTbf>|xY0*Wi>i26r(@C@<#$zmV)r(=c9kJ57`Md|J>K3+_Q);kS z!{xJEMU~vZaC&1I_3vIU;;X%4@>8l=OLr?yyV_@u%ZnU*tGJR+AB|Lh7hg|f9lo3< zY1IPFGjp-Oh(@Y%*!ttzxvOR>nms%YPdc;bmd9?Hqy-<*qKCAOc{toLzf`% zGDZeImCsn~hT?xaNYh+0xQYiemN_G6U7TcNJ--^~9(iWc4dCPt)vRme%U&K@$^~b#OX%C!id3_ch|x%_iFSUcZ6ve`Hdo_bc1@>r=SD zp4#%>(g)LF3%WHZyOe>J?nrv$W#_7~of< zH^OZa<`X6My=|v{?lzsmOXdYoK5eElTm7x4lhD_n_>)4^bURoy{T4*jZ9^4?=w%eH zSow^tf~1`AdVW+(A66+RrOaqxFteMSHE86#No9Mh>+ntF2xgTcS4UC;NHf7FCnG%e z{Hv_8(1S-cui7BE`#h~1+=gHo%8!&W0oV*Y*#Uvusr#-TEW!?E=yb zD^FcA($yli)8bh8!6RtLt`9>|O{Qqts50Kzw4~%26LR2jgOGT~(zIr`wR;;~KGQJC zaPj$!|vw|e;;4d22401N7nAiKDDjElKO!5|*lVY~7*!`}Q7eJU4+OtiMWhE2ee zlzb3J0m~16ytVXAr}mHbUAVfMIG_=aC4c3kZX}H3{hI2n;=V;#KGhje0}qt+ZhG$b z=Zf)hc`gR7vx50)`6KNz&LGVxMMjlLTFLv~_uqGay2rtnz8GH*+B8k1q%+2cX`NeU z?D6vw$}hE2*45*>?$BDggfY_Bi?y#E}!nD z4gP5B-%_!7*FgJZ3kXn%@3^iB1RR0K9@WKN>N-=Yju_O*Z8k*8$9io)!U6e|F_e&NohBm^G4A~yN4JV8OY}qp4XlczqW|OcDDDWK5`psZzrY*=L7RK&5Fl4 z#lkIp=J+hSH0mi%GJh=&lf#4l5)E$o;*=k=s=7RpI7j=blATN?e4mensd^&3a7 z6yuy!UK_EwTWOcW>bEn=8$HBKHi5^0;N97h$ zCi2w$?Xw^*6}Jokau>+%yg{tqtE{&VwZ|YFaq0A{x*Yec?zV2y!jKblZ0tfjV2#Rs zK_C&1bI8E}*UNurVIzs2CNb7d`n&7jviVs1m~jqk{htiE)%PN;qP5p%)~$Nn<=u#o zI~~W@{F>gjFtT}!!C3GC?^qWq5_So~lk(v1z&*3=Rreh2W8c4e>%OOzv((nQmRp%b zEApcC?VNr!-*{frz);+l*EJi-8_Ikv7K-SSGLWtFT*O;x!Q=o)!30;HX~o-6wp5L0 zBH}QS$%7k`cvb{~wYnZh74)Cmd{d;_y50CD2oeE~1DclT8y$n%D zA#oR*uoNd5CcahiRJvZPEvtBbORI@wiJI}QRaAM!+a+*F3AY#rq0MF9c%N6*uWk&| z&GvUv861NlL&nnKM(%y8NkFuKY4MZhZCNfK9XE7epsvhzb2{`^9i?P*<$OI1C3lHa zmET6!A ze+rx7Ir8IF$(8fi0EZ{qyxct%R(!44_Hme(LZ7rz=J}=ho(pYnD1Fepk+BCLbiuE1 z_+NLTv6sP~Ae!S$O-?|@?kSyNkf7Zf%Mc6*4!Hyjje zX`?dDYOAd`IIwGg%s(I&<5#rmWw% zdwZO2XL75wd7J}~Hn$k{6y0A=@yCnrA+hpSIo0sX9>`#hPy#arK&Y*S8;Xu`p0&;R zm&E=d*6uX>OPk5&dsf5}JgiD%91eekjt^dI*K~<|OX6L3Ow+V)wQ8ERm8{pgr0phu zbch_OErkLk7|A@b$EJK~P4Z1pZvDHTLCMJ|PY{-u*SFu?^DRqG@ppk_%RIJ$cQHl55-0b&8KXxfK^ zlR=W#?NNtiiW`8YR0NXDNCQ1dQ`)>o;g5+mUkP}k6j@%_%eft($*(igHSHer#aA+GR`4ae@QU$< zL7%)12TH-sS+%MvH`$(Nq2HyIsE>cn#Is}9{{YopJ*K5Lt9H;^MR9QOLeD3Zo@bX5 zjI)q4@~?7m0OvK>c(=lS7h8!ebackXQ1LQa)FbD3RPg?We4`1qj3)JU{ zzMzp(lz+(3DkQ@R*1B&!8wWBnYv_^HKJ2wS(Z77O8LOaRjSf^PA_1q2u5D&;Y zbm&3IuI|FaTk#gFcdcmHVPLn5!7T-mVWV4l&sJL+L zhUiHE4o5vJ_E+JLhCDs+{{X?(;@eN(EGWKqFz#7^ZV3Ye2RN@=0fm)z(t0E3bL`z< zlp`4X(pT4_KOl820)0M6#odgS?*oA-WFUfiWk}C8)IOhSc8hTW3t4822}o_JC_N6` z;CuQS{TThGJS(6LD#yfeTE!dPC^9fotmy3;>|i+0&%35_qu)OeYTpMnD+uwfi53R5app?M zK-kE{jEs}O83VsHou_#FOT96r&8USUwM#^WB2^w#M=A-=EHn3yHDgB5^$ltt_(d_`xIAvHU_j>w9~vtu-uu!!fs)V92;Je5}QK3=l!}uP+&c zRbsEu^e|Yd(wpXYxu2-(+I7TM)_M{ocTy|GEHYc}b|iopNDop8#s&u7`L9%)!S|_c zZ=(32ppM^Awn>&|C0-|qK2SPYZu8CqB~q**E?s5Yg!hwpx+m^ zjz|_|0ZAAVDegNmp4HL#JI0#d+sq5GTQ3~N&eg#f&QC@Sf)7mf;L)h~lJ?T^CA+hh zeLCtkmfF@vXAs9BBqE-m2IONE=h~A<%GXgs_KH|AP)=~%kWUrr(qGJu3Y3#))w(x| zwJl%7clMqkiB!nfO&n_&-XqvZQ@4yT}`Qp99W~fnZQ^ z)p7Xu>0IZ*{{SEOV?(vnHNO_y%X_G4s6N0)@rgcMG0t0O2kD=sdXAan-?vU~G~Gfu zEcF4_Jj`$Msq=f@*Br=?OitXZ0hq{H>7b4_7qj4dVQIU7U8m}PZA-#71 zG6hiA^o=81xwWveOKa4#Vq5Ibwl+^-2{}0JMC&eXM;biJ(a`lD2qoR)X!qJavo+?A zsm&Lk4ZImFrodTOf7AbjQ-YJH@NT9v8BlC22j+Tkw{(<9#mcOuM(1c+7XB3`uncTqtda zgSVc(wd7y&YZH#dg z)V<#28_x%5&}dR?`kWXb6wW8E%u@Cw0H%~7akze{Gn*jDe~sFCvgt{0CbfY$E|n`)|G$YjXK`j z#Ts41&PM4Wk+Bq((%`26Zc=b?+}BNP!nd-#7ODRLOyY)B2+iMPskzcM4~N>T_-9)W zf2L~D!bFiuRstOG!;{-Snc&n~zl%IQ;B9Fyd@&>!DLt%UqlS?LiSo7q&t7nNBavB} z%$h%mH0WDY657Y*V$NI#mf9V}M-!e4r~__#_w9=CE7+vAxt7vgmVlKR7~mZKy=$un zj;T_Tbrq%8v4v~|RJnR|KA-T}@bAPQ5JPCN&Tc%ZB3R%6DzIW!Og0w<4ml%{&us4M zH-0nlHmT-#M^JUMka$37wY;`ORQQEsOiPg?l%=_RB&@5eMdZEyVg3THl{tA9?s!;x~f)PohD6s5CL$Y($+WjATfDQ;rD1Zk*SvL@nWoVTD#W!r@g$ z03O4&er;%PcdE7Qx-^YsE()|!s{FD>#O~SH5rLKIo<({GfPOW2vJVw0MShtA}+kIy4tpU|x;vjRs? z%B!`!bFzt)FhUq-k&)2WlSWxM=AsF-^VXL=<7RJ8kG`Zp$VX0Uq=%gPaaJRBnHi9r z0?W@FgNliQ1CGA5p`pENHK2+~UDVRVXCr~ylmG|U73&<=jA_jt^>~e_?5R16$t0lf>A{NCPfMBOr`cfpsL~^Qc|3&-1H|@2SaBO4=BD zZjYyFa?K{4ZymY0VA6=xC?!S*1KWz};w(oz0m!N--!?YlwBzJt44%~LrLsj~B;DoB zapkb5^skIRYL5%wU#6MjNC9|YSGIKkWMq5hxvx4; zF$%Zb`9^ub&TH{}Oq_k!qd#waasSnZoynn~ccK@?W;uv}xK5(iA0 zT~EbYj=z60!+$NcjIr!kT3qe`V+U@~bM7m~n3pC-7%l1TT5vAlxnfRvKU(l>TK7JK z4;e{WEe}M1*=aV|m680+;iF?AnpB+3zvL&sSnSXC_X&@~ua7eN?^&@F*q>w!; zgul>yK4N>#Ggb4^*cl@cIAG7tRFJB`cjmesE5iQ(4dC(yt*Z;4w4h>M8H2{dssOCH zX6epFeT(A?t1tSGE}mQ4c8`m#!FYPvoHGt1F9{{ZaGD+}VDaG%Cv^s}yQW zF#rM1bLn4OAA?>MmgP~6>PGOaf>nXq1$HM2&(1JAn&Esw@V7|NZ3g4|0l6PT(Am zO7f;GKI!Od({3~h{sT>B! z<6N!YrQ#hQRP*%vtB9H=P$h~(faCq4#zlDl09~A_w3@fi^F7y>Q>RHeCv%~nz#6r( zd3PH;=?EnjK+-59BPcS&^UoL+)#;u9hsay&iDPqWesy7$J5L}gWt-C@>6+zkH9r;j zwrRB;ZKu4DI(heuF#ARqFCbFH0l_CfO4of_I2z{4!6Lr5AS??Ic)?{KeTM|#^e3%y z*2Pu+Z@B8iV5r*szj=F9J{wyrlK0|CiEV*lU>7+%Kqq-4pcnvGja*tJmkjGM3O;O+ zf(L5pb!*tB!~;kWT*h|D{$z$mVc%&a0qu(CHJK!DF4__Xi``FG72TbwpPS!k4s%uQrU$|_AP^zk+EPN;dK;R0|)O&OkV{dxr ztmuCg{6`G8QxCE`T`+kT;sk$?^#kSIx6lK?=qmn|;tMYv>Nh%7?w4&P<=gJHkvB$y zKzR(sw<;0P1J|{D{I_0Yi{>4nMhPC3(D-M>cN#7FUPq2TQV7T(of0c<*0+gOE!xE4-MRK#8|-`*`0I2V5LC7 z;NyQHy;nrnq`T6sZ#111Z>{cviQ^bMyud*K@<=DtA57PeYPUL#$B7Vla^L$SQCBGy zp-qv#c-^u<%EXhv85PFrPFI6_7WrfECAq^#sa$w&^{i~K?`_B>3dDS%yzoFIo=31E zv^5UgZ6PzWf=E0JedE)6cO(u# z832=#cmRDXpS#iSG^>DQyNXh9cgE)c=chf!Dz|B;sH1;{tqsdK^&K+i?jI3HBM8_m zkung9c9Nto%Z541@%8Usfp75MEqq0FrM>=`BxUkG+z>2^_~3obtUdBE+*Wj+Gw_b5 zb8gew2=5?R;}cHOOO{0dxgtdjOALU>KnK16u15Cz#5!%=#-nLGQOA7?#TSqU(*qI+ zRXmPC=dOF^xvECAwWlsu_#G+~?e8n2W5pMK6wzaS3MejK;DEPtEa>59jIxynU|e&~ z2_EOAX=(l)@dx%{xrr^NjwqU6vxEMSv3=lK08)Bj0^M=PO5sMNwpOuPX_hG^%wU;j zok85>?%axScMjRe0CcXm!rmj+rxLx*`L;92yY7{pW<>;+Bg+S9AobhZ0F2aBok+sV zr*Y7s9&56<*zB}hi!E9^woyJOiq1&OuykOqq;6m`bF`oC`&XiBe-pJ0Xiuf;FkX3f z3Lp17RpV6zws$LST<}3YfC|gg_1_0t_=587pp#IZ67sI4sXDguq9yw^Iv8@ddV_ z;^fpWwEJzb2J%sz(L;blZtUCg%EU3qAd$$%YtVHc6ZoF%UR_U0&C)Hffy@u(%`>@X z54nDSGdzYQu>-FlSCm+3T4lzsEIJkRo0$NKCs7oyAs}H$+@lBF9DbYc;Jb?kTg^)T z2n2~Ft%hkO+AtB7KvT&)5Dr~$&Fk4QRnzWr1EPGy z0_TFIc?>x1o|WkLKN1$|30q5o&dTN@kpBQ?-NC)*d~G;vGW?^Tm@a*LS0Uiv9E~GO zO#(p++uarosjNU=qRKhgST+bG^Ut;_{Cb~<^!pXN)^xw^c+Jbf9o(Ce?b&gF!DJn} z931pK(sO*;uj~5xiZrgbIqhQVUlmBUS9bb!tPr0!%(jLoo^A(dE+93Fb(^2c4`KL}guT3i~xhP)!mk`N<_rMiNI& z#R`Vc$~ozhM+1ZLcf>CdMJ1)3=`dYdAxKqJ2ZA;L6+B>;3OFMHc&VJ-(ut%fuZfg& zFB5E#cz0Ye-pdQIjNN1-TyERtnHL9~~`JBp9QdM>SC7h2S``C9heszGNgi*pt- z!CZ!Ca*BDw3=@t(II3DlitM#Zt7|_L+Sti&Zy%PkEx22d_`6N73#;vZ4ST~|ys>X-1bd_mKI<@05kdRMB#vp$rzW-Q1`IpwY4LjjSjosbXLZ4B6;a((Q z=$Yx3R_cDdR-agd-Rb9JhuF#v*8I-D;r5lKj}BdU>sV;#o=G0s32(y~)zMU_R7Ls0 zJYW-mF^c+wMV~;_G^n*3dp$n;P>LYtSmIY`42m0S0;{x;Q~*FEp4H$!EbwQ=O)}QQ zO18C<=EC0AJ+_vyk17J|mqHY_c9tQS_2l=c_0Ji2x8c+gU0+$Gm$ybIw}R&n90Vrz za*F$zn6?J4xs=s#}o#b#b#Eb#6dGP`*R@eIyOWia@lMS>h5R}OZxGgKY1wbDk zD*e#CL9V(HvToa)uA7V0`EcF%?&8ICk#A_)Zlsdj+(?nT%8*3r##VVgeXD>*J^0Of zyxOOQVem}WM)vmRdEomzwl=3_>nNfg5=;e>fSl}JF0=`V~#+~9jQ$CNPXm?s?_D#IM>CELLFpT+x$j35o z3~}sE1{aKJ@ZV*y5gI`R4LOGrsPXNuC$Z=O4WZ#;}G*^BJzGC&86 z{{RpG8p`e4P_0e0jEmDHq^2iaxO{th{cEhXj@Df+C7w9UrXt6FRGe~8u5r?^d{1jF zo$*q;U9iy{5DFew>M(1ti%-96NHxiqK5Q~a<$w%BYW&TEz!?KR_@v)5x+>Ne%cxydKE^c;1nQBLduVYrTq z>-81QD6Ng+^trohVJyO1myiaIKQJiHcsT3$)%_SxE#KNM;|j7KGDppmj!Eg#n`xrY zc%b>I0h2jrlp?B*dY-*MI?}k);o*pRN*pV7J#sU}YR4>>ggk5!uyLM%);zX4Aryz| z1~nt(Jc9gIDc-2TMoApwwP~Q5MRj~TjP4jCj(k;3>f;J?WOy-AHyW z;zt7ls@+ktrrNpM+TB`1EUJp(-ytGH$JeJAu4`9GQS$sTVh%fF(-;+M%297~nRt`~ zv>#k^#cX|++V^u_D`4&*uL=(*j`___#2gfX$qYFs)3-G&Wz_knBX3_$E1()(oO0}0 z9f}_O5)Y+o#i0=?A2h(ON-y5pdY*@;(yN@cD=Qf`QTfq{i(v7E2a{a|orISbQY@-f zi*5mUMdegXjYeKf@ra~8UGGGz(KGnj!`laN5xeRvWC$>Q3 z)s&A_zl~vYw_(E^gT_5+GSblMq`0-ZKrR`S2FD4OQI7b*tch&2)>&HQI>?I7hk=vZ zvE$mQScSEl_tMEJDoE$J_c`LNJ=9lkA|w*Jge8tRT>a6XOp1kc$x&&Xyt6H$t<2v% zq>&i}09XCcGg>z7YjmpM;kSJ1Gt;j@T=X$0xMi5|zQ5BotsGhX>?AQDgZw%4;!kX#n>##e%*o`7+Td!B1DNoATs$~J=Jf%y9Ot2eRad5(o&9ed-YR5l07}~inLkTX;u$+X89-N1^NP`J$>qmSR_)J9YZ3q8DWf%YHQ6PgUW@BKn#4O z{RlN8-om!84Z``kA0rch3I0{2SuzhM)*1Y(c2yF5*yHgT^%ZIftURJ+a$BB*w>5;C zZN>7LT2zZ?%7NPj&uoA7>Px*I?!rY|tfGy(ut{Eh2^i+JQZnWw)GwoeeVr5%0+p3} z{{Z@{J}q5`1yG#*=FWNTT2R}l`M%DQiGwODF#{(Y<c!10ds_SCfh z04_*o3{FbzCye@nGn%<)rle7McXJmEGk^{|I zBT)?K%M0vwIOODFu`Xqv7ue%01~@#C?OO1}5@F_oHk=kb6ONh9Y3e#{rPNC`gqx-DWj#(3^0k+E^MYer^e*R%19kYBNg9i8vT{}2^(rYPFFn$`q#fhHK#O`otfm;z*LL6*y^KU_peI1y;hDu{1Of^UVgEMlW`axxbI#LV_Vt)+CU}0G}GAi zFf@Ig(WMma<@4XAM{^)3HjSsPNShRFJY;nhN@9G#0nR&v)~c0N?DZ;i+Ma}eHo^hr zy63ezE#UzzxPmyTfRaWfkPP~N`l+ge7;NMoIj=sXuJk*prk17AD@waS!5)Ne{1QD95%(JiAl=!!2WgTc2{OOSpZy~qoE(2aJi{nbsSaqJrBcI(?hDf z5=1Ao;Ie^-V!c2h5(Q7<4My4ZwuxhFT`X;BAl}E$0Ot%w4hik(E0BZCdw<-@>cxO& zkC!>@2Yj09^!q2)Z0=bjDv$vfnq7pMVA3bnJW{LHuW8euL7~qd}XU%+i5VV z^2-R6Gi=-6=FShjd#;q1eiDicS!TDAYk1l@SZ$glT$U`^1ZTe$^tdYVZs}}%UOx>a zn{5Bl`CiLTvA)+LQ+v7_ul21EB*r^oh!`D+2kL9k;n8&6Af=6^{{Wn4CwNeskD+Xm z6nEp3jMo9A>RuJmV=`Q7Q{5FtMFjv{XSnw{=aXEnzvC-gy)s47bmWQBP46^7nHU`4 z7VGnI>AxXv3KWPk^H`QF#Xvz~KG--vuI zEEDKv!Go=_ypCwZO0r{@eBoEQImLMXtD@@~K8bmy==%MnuJ;COiEU?cAAT3h`2pNd zU=JNDnbAC5;tc>?7+>v|O+1%3FmErvg%T$6Zp&@vum1MYQ1NVN4fD_#HJ?mUONV!_&VkIa=J7{NU z8mEIN&=M(9dpy6&TH$hK>AZ$sbH{JSy9KhI$4WPm0`|LzX=Vd!ZuyTLNgy6^fmj|T z_+6%3NiF5f%QS)kD2B+WWdns0FwQ+s1CI5)6I{R2?X0Z}7;O-|?s$uMJS!H$mkY-O z1M6O^sT~wq^Yf=QCn>K($93-x==VlD?P5t53y-=4gn-_h^MHLTwea$MG1GL&;qgHa zZn6@|8s~eIDgkhJU=G6>^`*P;rQWKEd8jJLP~kw4Kh@)w#zD#K0L^oEns%FSES8rs zC9Rdd#)?ddB)D(lV-U#$91X+_{VM75sW$Z|5gE>sgd1Oh&HO^}{{X{jXGweyadHgk zeAp#FGB*W6oRf~cWc_QFJ_(yh&|}v16>$`dV}cx(mDmjOpkNN?I5p@#9n!RA)U_Bi zi%~jEs?kqzxVSw*!N3DPn8qtFQ}Hd=gKn;@gzKzWM!_x?5rhoG7)D}FbJUO4xTi`y z_p#{H#Ns1GK|7`QnEo2m(0K`QZT4wy@&xk4`9uI^w=m}$xC(RY#cADqHT!+E+KrX; z9$01(nH`a&btD`T2ms)oPip3`d|W58^XCexS$4+f42t;sqjpaKboA!B{SRE!?lgcj z`wNShEmhs4QhdVhr0yyQ01in2R`H_-v^=`mop@AS+cPdrB0VGh4oj%RDsRf6!H^Ek zj(G3xE0?)lYhAIALb9020SEdv5Z{g73IxRX`p4@%5)B zyK8BtM<$KtLv&D=lK=>a#&(bIA6|H`2OB9l@}F&zD8`qxX9Z>9T}7?sk=a0uvbvM< zfT!;gZ~)@Bd@ZAWru87TzeT-`)<|OKYV z#EyDPAznuu<2C613eaS})a{12=ISL5&*cx1nSuFoJ0A7p7wGz&&8fh~-ct#c_hhoE z;1X~LH0?LyB-#$1mKI!Gl0!RkM&fgi&zkMRI7dkyMmjT^P8*)s%O{4l>&PQAOeUFv zDP{6wgrB+c*3eQQIfK-JdMYnUQTd5Yt8&Ms()!{tNpx( z%ea}E<)g$>ouF+{}^frH0Ej(scXD9#E9 z`5Z+lskL$s7U>dP+Y5OugmS8?q%1)M7T}ZH9lMiWd*WF9Nu_voqkB(1q;Q^b2QjZ0 zRUCj$F`Q=|E7dhy3vE(Jt|ru?x^#+2+93F4b>UB-1Nqi&onTclHT-d~8P0s!H-K@q zNy78iwYro}CmAVSo?WK+f5dWWA+>uM)6Ci<^9Vw@2WdG4LZ12NwkFUn^ea@lyNPaL zB||E?+aGd4QI7cjRp`)NYZAvPmsa~k&aV&dP(>=B$?S}37IIkzp0st3eqeuRf|;FC$aY8ufeVA z7lcoBb-KzaL)=KxtZJvG5EGU;J%RPbdR>l}qFzHTs&yD{ZzF@vA=RE$A#kAOxg7u* z!1V1=&CJp2x^SgUwvU?!g|(e5+Qp}$?Y?prZ-D@FMo%@5rCUio{oLAqpCz;l9Ef6J^Dj7Hr;bKF{+TuPMvwmh32mmCCY7j3<=M{h z%Da^8ZNP?iAe?Rg02=e_OG`_=O(B(p$~c~TMkN+j&Tvmq1~PCnT(ZMPPVD*`HRnnx zBzUf`qG)<`+s84xxp`bQy36uOx29Vo0dt%WPtLtRT=8Csp!j;){{Tzy>A2Lfeik8m59e6})dBLMFt?K}?u07~YS?Jn$+=(({+ zklP}nD=^qTc`$HDCmA^(l}FX0qwbwlD!DZ(x}%DN;mux1pI&3ABk>@cvTpmJ=*gWyvSEzW4NzvfczH3IjhDcXz!zsUU z!#5cj2OM)*`bUQJJvUTKOUo8nMaPuV1LiqdIU6&T1Q13-=dU$}BM&KA_6yRbcL>=& zhXt+prfa)lwXTy@~m(p0s0wgfqLk1fgj#w`oXQ?$0 zkMDGE?U}B$Yc{c&WJP8#=Ch+V0m&zj0Nu2e&q{+tzp~PNMQL!?5;e3lM>7Hr3j!Fi z1CA@74N-k!F`Lrr{{VUEVyQQPoasjL<#zS4_vOq{tZ_(X+!<2@4syI6{i(^T-ayK~ zX~qE{vg0`z>}vuILK*C0x`Ifhk6@6#7aLo+C)YJM{3QAl#j{bC7~_X3Bq4VdA4>j} zbs-q8cCGS1hUj5&H7YeiGEd1r(6EdusxokjodD+;B-ed!s>sp#%{(EG z4W2Rp!0LS~#O}T*_&-RD*xOt}fyrPn2|42nUK@x{moY4{gd+s>;Gbd%$?IPcopCl_Hlv1ZwdG`fqr?0GobtKm9I;N@JGE=t z`djfm`@+6C(EJu}b!}?oZx-$3MAC&VAsN72YtK%~~)^({$5VTaZ+U)&1A>q0hO7!YhPHqnCTPx|)uB)p)UDJFo z;=7?Vwt95W8uDLm7wMCLe*>Dy)O2lgN^dh#vYrKgR!2e*=h3l>`)b2jyLd&V{i530 z!EKaAeT$wpHdv3nk_S1h8=YrM)LreQvxX>~AWK5NVg+U60rQ-L!S}D3rIOQ}FYPSP z&?@mQYE#yg*QxLby5}r$?erA(on(v_KT<2%J}3A`!ht1haxUxG92sP*ye;9Q!Ja;$nq_Rc=hE!3XLO}!^SB$(8!ohAMkyvr_ z0x88fAn+J>silaiN&Ak*wXpPSYdEHR-S5Vec>uQ-L(Kju$=c3Gu0DgNE0)#1B28x)fwLUgY3>6A)@s6gA#r@^em$;Fb zjymyFn5pEBymL``s(PGbB3yIRyijb{*-Rbf)wz9NEl%s7tl|4t&gTW^}%b+yv#F!ovKgX$G2QkSj{E8nTw2!9@(oG%^ce%Tr2b= z*EK(CX>lkcrT>EkXuX?}m7lo~Ch4=g$ z^LgVQUzSPr>_??|V6(iPZRE9$rfCBJBOBP2>(eKtW?a3%eX;@=ec;`5U3h#t31g zuj0kWf@Pc}5l`mJ8xJveG6c`v=L4-)iL|XY&rtYlC+jZ)aCXj>j*Z<~ z_GtA8D>rRKn85#3850#GW_aivzT;`;WqbSuprt@Lh8ir+H`Q?r< zNI1p_s*>rxBY3RuqDOmai$sK+w&UB>dsgnPq-z!yR?%ya6ow#rt`0H5C%M{s*O`Ez z{hPV#<0lm37?^seizC*}ycW@=vm|>Nw*2LeGrJveipLsE_O}6bh%O_*EEuU==b;{; zj((NjOYr{aM4Hcs+wF1M!jnkIFd1Dpxb?~dgV&+04O_%(;&Uj}ZPLcwq_-9Y!Q;s$%3d)}kqm+V^90tpin_;@eu8{H_~~z>X$xoL z7^POTNaAa?LdhZ^0e1in7%%5v8GJYKRC<+_-jk_DiF1On0!p`)CeZ7g5_lOSzZKnR z-aPO=tEtVS#v@rSpn*~ukoiqIp+~_z2|VEO-#pi|mtti?SB}qg&kr=gLl^GWTE}LO zTKLEDqQl}gscoTnW<>igo~C@tcD#(F9-S~SFgoY8d9RE-eW!S@Ok3?eURG!}O_8*u z#em!}a6usFgV(Kd-aF7d8R0D+-&IDDF6OwF6?hc+Y^tD;LBQuH@~S@$AK|^-u{!+n z+1}khk!+!rV%$R&c{*fd07iJtcj7Tptyw8qX>AT#SQ>bG9MDbbb-xd!-KeGBr2)>( z<=Ys2n862v3BVZis<-|Ohs0Xc(Tn2)>KD?iaLvZnW!yI&01k2n1~Y-)o$+76`j>{S zthL_{>dE#EK$8%SgY39Wf}_3IBo^ zhATaDO^<8K1{K{SCnTurvmHS1&3h+}J|OA-2)+Acmhr@z%yZmB0%W2yGV-Off^(c6 zFR4Qj{3-X^>8P0W$DnW>pA+T&;?OsY-*9E>;e6@rv*nWW=8G`>fgYab4LTc#k? z({sZd0i6qOWK{!m5&S&$7~-e!rn9DMNiLhNIzoan&lJ%qj&O*}_xhuAkaNyGtJHi? z<1uC87;h{Y=0}ok>IpH=ZvOxw3L88!<#2f7ysP3)m!qMdQSijdY;cT`ZUSXj1A4lQ za;?GbkxHsl_#URXXvs#^dYH`mc8_4PO%lDol_tX&$YRG}B=_Y`D~PhcxwUzXy1vFo zS6IeCR_)V)#c1e~9Z@0h{x_}6ilcW04sZZHG0kh(_4VoL_Q;Z0WL+BcT*77e$NwZEn-vha7?JVU2ySH4)DTNN|hrb3eu z`ANn@9244+!k#SC z?sUHpf1_$6gLHtGk~ZnQ4DJd?JZBiHm%1$4$A_dEHSAM;sV$+F1SdI+sU(wtSa1z- z{uZ&+zu_o0_Ll2uHMo}8Gq6T!8w>LiK;u169<{1^Ssd2pyL+9!mGIKfUhzA4d&GC} z+RqY1mhv^gQ8a7`Kr#u*z#QWoX0ZH0@Y+PTzq8Yjy~dF<`O!E6XrabN;=DM|Mjzo_ zwzc8?Kx;P=UKMRmNs8VHt>ieH%whYon8Lj;S5{t4SrS z(Laz_L}iaVk1h93Jw^Jd%3P4`$Pb~_y}CHoybAqRPuQQ*6O@> zh^G#ZMtIhtZK+yYPvQMlCAzt{TcRS0BnbZiDUvx6fXfWz@zB?YTpOvR7dMA+bir(7 z0n-Q2*STtbC-DZ2;sn*S^;cVD5nH68oJYXi$R9r|6Oub_tesa@ww>YB7eTjxUq`jl zDG9e}a6V!Vc9MB258+)9#HcM1!0@uGJ02Y>e-a$`7^{{Sl3U0Oau}GBGB^Yt$JqK; zpg(}GFXNQxusM=Ayx|#Py~ajD4E)4rpywT{ggOSU)3ixxF_tb|ENn{S)MC0R;^QZ| zrCh!8CDirJ8(B8CcG`4FB$K){>R~&^8ysxyf)7sh)kbZswD|u3w+w7#nPiILgBzH< zzzA=3W7HmlkcQNFW>#z-N<=mFZIaMLs3gp2Nja z+P%HpsTsVtUo3owYO&)h!RyDk^yyV(wTa|U3X|lK_Rqr)7it$OG;M4E=^SP`3kJz< zHso+~+noDXxvAVSjAp(+(7Z}~0jS$(mwIFuaIA5)tm`l+!PsqLp@AiP_0Bl=`chvL z!waF3Xg6HpA&fERL5;_8e8*w|@-Z$6_1Z}vjX?hZ5PUY5Fk9T+{g_xi<(ukGXa{+pi{{e_ywN*=;pwrzd;9ebi}2B;9I{PWFmT9=OP7I|Q> zjNS;dzDOiSQMWnopZ@?|aIf)ePf2jlFwS^q0kS&r)Ag=OoM)0!zqG`yJe&NH(=Hd! zDoH9>SwB4&=Ff2+NgSMJrwE{DILAu)^F{cxCDyLiclOb(vnw)58x~;8{5yFpNbWJu z71#Km;-7~+Ii^WXuCcVW^GV*`XSt-|R}M3tm1lD{G5A-Mc!%PrgtQGjUOm{l^9~|d zK5fi;bI@nhn&hm$H))ev$*4b}O@i4_@*vt!$*67L! z?Ardd^4#f&UfiCQY7kQj$CF+ktm*_Pngs9o*sYr3uRx6{{RjAHR2s3RMzKD zvfkUhg&$lL+jE z6@vWSbv%#S@kw^^nC-%rP23VQ*ne95+l+GzB}_zK8K<*`Qf_Ihv{e+NEsv~+!`}#MJ{lUog!KlNK!QUR!>DlF z<#wnefI8=sjw{9WOD#sw+(mwll0}TiClAk0l=EDki)*QB6GLkVnIYUA-XKUoKZ&u& z0=-W2#C{+)Poa2bKkYY?G)KSKWu73do)~~e3g_CqzG}4P%gxQ}rM+3{wN0zI+wm%R zQFX0O2Da28n@ZDcz-caLj~PxI5(Z<=l+zbuNm0-m2mic)&&3ZMziZsnEr;4St zmsPc%K@=9Tl77u9sK_i%Sr4Z?*9}~4M?0mazt*QkEIc`U&KCawQr9iSc2+aZcW&o? z-!pJl=rS@u#dG?EJ|MP`TwDivnLsSgSnccwUX|!FUU+)%TYF1e32bI!(>=Yz2;x-( zBdG+RV^y`?55{xqGTd4pCM5y3t~g%GILG0d>7|a@Jv8cNQwW;6)bo+5Txvp8)ZKO} zs^jjSIPJ!L>(%@*acO6yU0$5stRQWHZM@hQCxYz2h{-+c%`R|h! z?meq#!`k(dUBfJ~w3g8p*=dor-yb75!C#lJBAcx0rlYa9u#F|=cN&hN;r{>;TE%a5 zcNw|_e)=^i7jGL>6<#yIz{OS2w1_l_qQ3Elv1xB@bvS4hM03o+ayRE|ZNTr(JwUHE z@jk6@s7N-XpJ`_O>*RCj0)c=BrEt1VS;eJmFI#$j`F)VnV*z{!OvXxHPTqyTpK?&-X@jHe7`P7 z9<^<>E31NLz4DR3$cSJ!rESfnUnJ`Xmw*OH&lsrhEG_KGo@R`1`>_I8sQ0ZoyAwD*r!yspnJ~=52OOWJOjpXyule_FzAcsJ_zUdPb6?F<M3Jul0J^MzAC-Mhao-*5&&0*l*4mx);G?n7c(22L zH_|MpH*>(w2{B5FvEazr+U>MDvCcNPeg*}6#i(go<+SmONUdQPxUqQ&yM~j zCa-A_x&F>gUg#uucQHyXP%91_3JKnEhUD$eI`dk-3-Pv@sRr=Isb_1bT|*I#8dLzz z*gHc=Bv}5K!yf$CEh@EX)8>>;ij-kFB$@G)yUP;mwTA}-2O_#}4{3Uaxg?7mn-(Mi zospbibYGQQ8TH0J>*+hM1nHV=f&4=Dk$t4@i%*WxWV?5A2#s8}275OnkEp41&lLPQ z(jH4IYdCc4(U`<*`^8V2Y4aI@&PQdy9dldzerVnZ&y$tfN6r_zVovt9R*JUf5b?^= zpS*Wqkb9gA;PO3d)^vMzZ56bbzRhzHhyiv=cJ4$6+8A3j2bQf(ZZ|@sVChsmlhO z&-Q3Ub03!q>~^5(*Qq|gr9Rihx2a)s$o0uT$W*ZErgD~-Qa;o2 zDcr;&I)$5%)phw;zUUtC<|GExivA1?9o>rOv=r zW%BTfPhG9g)ygk{h~=jLn}(3F;6Y|CybWe*RM+29v$&-*`b1M zG*4>pBxw{RwYKIZvP65bNaVJ1cp1l7ok&YrekPobIz*emKN~e0R=wA}S*y!zib4An zF^4jh8&_!HswpFP&biJx8OOKB@#De~=oZ+#x6`J(0o1LjQtWZLfC|JMaLtp?0Qawz zyg}i0cyHyJ#97G+jU~0y=Saa}k+sCF^EvC~uRgVx;O`9SI=-NqE|sOvt!hz_wBHEm zlIs32)Dup=m89C(3J&HZ?j(7G8$cu!I0OU9uO^pQ@PCRm=#Paj<(pQMYytHz^jkMl z&Aw9V<78-^BN+81jblnMa&9Z;TbfGEoJWncJx2S*GHah^ise`xfJ^1Pxn5YR{GgGO zfq{<0rDf@IYd#CmZW{Z;zH;4M+iyvZRQY9{a-6Wp<0lygy+g(NUx|D)%W2`un;k;t z^D)6NgUq>?%ELH_$fctR+mK41Q(h_Jb@AS-5!ChjriwXKJH(`_<$hj3z~clAoc{ni z)}wMt8d&J1WvOe#9whMu;!R6Z)GcjaQibC-R?&p=pkuo@L4_o!2Rx8@=C1r7Y3?pB zXBwTYg{88q>Jr{A@b=*6W-v+IdoMY`9R+!1{j@e3O}Ho;Yl6 !h$V>6+Q_bd%e7 zf5b7z0!p`*sEo{cQjQpG>T|*TDbj_g@+`YiqUByai;o*7gv*-)wJ| zYln;;FisT)a;kYDdF0oZd_wWezAn@zhVpZ1qj}qI9vGBKG>7Kgzy-dO1N_Wm5Up6YdxrH)0F9$_f6V#Zc)Uue>SLQuWAF1h3Ih8?-ZTU&)e>!NrkSRh*BxCUPr6e-#+!t>={{WL* zvTtT|MRqIsQYgtEQfpGm$UDQZW@kG#uQ|yWA5v=}rYv^u%7gh=qIe4C+S6WxQM^=T zvqNy9hCyY=$5+E=E9COoy#y#sYdxzBR zWlM&d*)5LvE#n2STw#FvkTPr5bzdG@>Xy>jT4>NjrZ$}~ELy?i~ zRc&lnHI>ZW7Qycj$#SMNBa%2IagaWh+Kn$x{==W_utg$?v%X9g;0$2(8NtBLDhqut zQu_;PT6>3EcSE=U91<~*Gt(m#BrQMoZOr#2N;<5s$U~I}k3;HlQBhcrXxq@ki&l_H z9lT1BEJ2xyk;3-C_O44^)FZri5jl|jy*~Cj{{TP2nSTZ4qqLG|GM|-C_Z#m1WAm(- zZQ@(jiuOYsOv+in$qG*-W0Q|cl#ZHcr4|XnQL~)pwk>A2Nm3>SW8d>I13uqcves5n zNR1W1xQBafZKZezjt@-MmZ57F=xy!d4=H9jUKz8Bu48D_v4DvrvcA9r=jCiV~?SP&LG z4adGoJYuD@IZEYtw3(9^P4__DMn>!oIv>NOboQ5m%v|n-jpzhq5H|k+waDq)6-s?u z%h?B-n@VSZ7>{N>j~=y)b$Ihg(8Gs34Z!sSfCg!#-s45tCx-0=Y{%u`j)$Ik>+9OE zH9aL`<|pJG*d1_xALm-|S=?dXh{v+MPz=<1B_KGjFL5L;zBSRxaaBpD^|-zWM_+b*r0O9zg!NS))t%RO)$5CGUV}( z>CYy*IgQjr`RrJ(0|n|2QJ;FSELg3qFCxmBECQXwJ5K~--;C53(OX?=hA0~7Kw}Pk z^SQSSblM2O?T{)T?I9FiQ=pbz*~{cG^ck*;T$0CFw6UJi1UFE|66Js@j#r}rjAtEq z>&;YMw=iaO*05hjix3eqC{%sJ=Gr+tcdV$6p*-GPjPkm19`0KNWBFF~iipwLdG;)4 z3eE4_!Xr za_bGyQ_u!chHPik`q!e|Til|>bm+3ijk$!UB#q+G$T>Ll;cO3``n&*J*xGs@|kwrx!jA5%m^eO>r^fxiU|jt zLFexQ*0HYUvwMxP^S70C&rEc|_v`hmPR4F0N2x>hpWoX|QNatfxzDE~{3?<|a|;(6Fdylp+nD7|}dE^2PJB()^jYDEe#To3b zXM|oR-O>S+E7X3U*0tu&<MIW9 zOB>1NL$zdWz#srC9>4G!>7$)q&|%quCy;p=^;*p^ymAv7`HSC-AJdBGy`|06yCWJ4 z+skPQNeXkoA9Pl+)^0PFaO_4%JqP3e0N19@vPp+T0I2)8;;2aw-m<)IRD+VEfq}rS zqlu`rOiqj$E9z-G<%wP~wA3Uh`PATNy=Od9#6*$?!xOZy;P?JjGh7CUuFh2QLC>{0 zR&R1+Ng{Tb0s!T@VARN}$&I1-s%{IP zuWHQ_5ONp}xUD3LIglCL zjl8@9RY7s9IBgpIhPM-v_Y4$&2m=ZZYth3e%c0|D7T!cR7Z+C~>IpQ~ zu|2~TS8Nt7)PbB14mjv5x$wMcs_KH)*4d+i2$)RgK2dJC1pV)Sds(x<)`>!$uv7jFRtXbjtf&FhuR(Gd}Xktk+-H#J$-A_!Sg}8 zpE;PrnkvWt()dRI07Fj>EtI#LWd{z*$9egO%aPcUYZq68#TsU%B#_xp3;-RDv4$ZT zMoxXZXQg`|jXWNoV7E6Kz?#pQkvzZjhRGRX!;PR|4glkd@h=crTiM=yp3>$?AS$>L zKH>pfkQcW#>C}9yL&1e^c`XWF8_?jritx;V7BG?{$k>rX9!WjP9dXvW!Do3Ut!ZVf z%_WYEs&>7pMxHpCxn)wti6y)8dshQ$w_1FXzV(r$QRS)q+GEv=9svH8qom%+HU9wG zHDxy~2QRRc0P&14;~zoO^Q`ICcCpWjr0PoN(q10$2ZpVd>%_W&y}QtutXg})BAeOV zahC*bj2?5i|h8%$!)zy98)zP6zh82 zka&Aeix8`3D_d1y-eV34JxVV!=b&AsBGAF$IP6^teFj0_5BigzlK6jz# zQo>4;=Bo95JdZI?5?(#6%1%`wj!eNDBM0P+>?0s&xzA5iTfQ0b?}+>gasV>Q zFv>dQD|Gtfnv+`a@(aHw?P(N>;X#iMm>o|{^XzN1Z-dRYJN(iDk&OAjce&|uP>e5KU3M#Yf8rjud8yxvQHaRQi6nzFkaP1A56V3UTJ~>;9xT7r zO9Z`&9n zVHqQ-_U&Bf*>A?Y&{-t+vrdTCw(%*rZLRm5gj{DG1~{&&n2&o?mW~B26S_T4_fPQM z{l&eOn{y?toJ2hG!y6f7Tz$Y4<-Za?rEzQFSBiP{EB*0UwZv%@a=Mjp#j(8bGPud) z_w8LCikiNee9IP(I{>C@k#^vhWh4wokCk$8Gm=kEYt=P-3yo7rwS7~=%Nz>j?xTrG z9FLT48DKDTjDcH2-ghe(QB$SLk2CP^!tD?HO7B|KoiDW5BS($_I+@9QD)68dQ0>m% zarCc!@b`iIHR0=K@g>dkY2s*1NpA{<3SW|^%qMe^(K4ar@+FIO8XedZDFwcgE3MO1g5(a<93P3ztH^Xk2eytVVKjIL{xSXS0H)+IBu# ztm;&&6ytO!i1hK|v4@?0)EV;l3d;yTC}N|QKTMw373AZ=w}Sbw02>`VaXUmn8 zt4Wi)k)GAyV<81A#QQ9l+A3VN4o_b2mxyiPf#i+gPxyvdp7EWz4GJQBw|4hAutam91q7tyZoA#GCL)n~g|g|(rS z?&Ci*d48aKb;rGTzu6ujy47TDTgVEsDKb2}R0R232rvOSGQ^qYjfgBF0Y<=Y@*C8V-}2a=7{~@suN5=IrxT7iR;MM{?hc8p*-vq+Nvzu2 z>RP3_RD|4rq+5nNfsc$FLyc{ml?{{U@xW)ObX1>MYR5sB?%kojpC7(X`L zlgB*=TIO{-v$lmN7^ZaEzlMAdYj0_3;d@rOnkbQ{mi}gQBb*lU#saDBpQ#kj4fw}M zv6AF!+C{ahJ7jMS`@%TdxNblgBOQA4SG+TQr+AuonUvXFmGW)lmO-#77|R3qn+LZ5 z*Q4q_4Dh|pt)zFiBu?y!6^=H^F(3wValkmp!5wSS!c~VY_eYsPFfrKeAE1?HQwBtLtWGN>6O^YV^=O5L{BZY{KlZ!DvZd)=&% z#uH}tJY}+e=qHXrIPFtq6zp`X$?9>pdd1mq^qFS2)8mNjhC{kXc)`goN8M)XqqiBX zuMAj2cPu4lF-%!n7!DO=EJX`TtY(qPo@Cb?@nn8OW{O%p;;fI;%mmdCLERgJEA zyndVv$qbTqYsG}t1x3nZ>U%a99w z=IFWisQTo2S{)p+t=BhGxAA9+H5PMWqiHs;XDi~}8Yfm_4l+W3tg?BGq@wVvh1wJV zJq|0&d`oYwYu+KaxM>$~U{IqLA2H4cBr#ZE>ClFzMfIdRYtGEd#0)4j|zB` zKtVJySX@E56hZ-JC5cbI3k+u`=H&D3SsognLA1DAd-ZFpa=QnYxHjX)SE+1$KMM0* zKTnD)h^)2L%iMg)BuC~2n*(q?jtIfWt$PKow|C(kD)aj)-p!ub3PmiAvXI1pN^L)Q z^{+k-?(#heVf~yvoinM5*F)3dGa|`z1SKRznZJ6cppAgrk?N#z)K<5N{76SK@FBpC9imM~983cinc+V!h7fZO;<GNlxA0v;zFC1$cDU*n(;YHJ zcKSDqlHX33RF$BHKsF9YlRV=X9XPHyOmw~etNDa$cs$j9eY{6FGf z6KYpW1-_qidA((ZG>sXK^1~7mI-L3vduFb9f5R%aS7P>7lKmfQLjsmNLY$6z1K*t2 zvHU!-)b#sXSGKq|$z!%#l_+*7QX6LBlafYHt#sk3&i9e!X7!^=m$V!;BGh#&87<&>8ZGhw4)qx$9eDayc$`$=w29k*z*4G}=kh(1Ubyh} z&X0F}X}?puo^rzsK#zaS{{Sga%yHA89`%(1Y7OAoF0Jgv#+?k2q~xFVMVljz4haXI z)x~%>S)SWf8k)wEgxUf~xeP({1ZKJ%-QTUvj*Y0Lq!-(a&`BYVBJ1-gJ+MzsI@g~% z(v_tVW1#6vlKLA~+D@CS*fUz&+PWlYl80Qs%uZQLe-}NvV~WST_)ntVqyGSANXsJf zzcw?Tz;m4R81Gra?^MwAli}@F)db>qDRmp1gmnr)!79M|)xA4Y)NSHeo>yyhkSfYK zD1X|(Kb>^KDs3qw&o(&vl&+%eX0O5pdHj~RbWl*76mkP+CAeL<^f{_?{4CN!$hP;l z4>V+!MpR#y)E@Qf@aZ#NOS^VwnC3|a@}U<50#~jG>DsxCM@D@sSrFQ+%?$R?SdAHTDn>U;a8cx2c>LAU0{2{_{? zj@5O34e4KKNR8y-4mUa40M2ut?(h#>*InV?Hh2?GvcG*kJCsDbnWP{V1Cnu`Gt>2~ z?NUgz+r)$IMre{pLd>V;QIN78aC40QHP25A9<8CAhq13z)qHt#r(4aY>CWpM z?4`PcAwhsxcg0xn-m|Ru%EIeOmgXyTwnvM6>PRbajD!+1(BO=MGhEeaQs(w)YI?M5 zVk1pelhd<4Uyo`{8%i>{8OL#5ZM52Fmm=QTM>JBQMU_h{#OFI*NH{p|tOz6Dn&#dT zvod4uF&@1RKc!0H&}~*B3FUf>`q!Adp38pijKh`PfyZxfJBqaf!k|giu6R6xf6r=b zZf3&s^%(tW_V$w8$|FVOo`QsfZBI||e~HeEs9E{jHaHSPaEcOJS^A`k%Y%h*H!nt9 zjAsONo+g{&Caw0b5lwNa9ZL2`xH^0>M-)-KhjBqG7c8NUGq4HaC?uNmIAu;1YI|7Cr?!me7fHLhnpy4b%n`G0 zL^D=@_O*`Y`IVW{T{M?(=3EnTlaU}fWBoz;)>B$8;6q7~{3kVH$?PSLU$jcm z%7J{g<#!zO>)V>Qbg|k6GF}%~P{6KoGuxW3cJ*Yat&YpVo-y$!grm7j32mXbx?e6| zJ|%Z3LEsWMbLm-MXO~iyB=X}iJfW5cJ6>+5BxgG~{{T6xYgpr*k)kGIIr)euKT7FF zm91M_MXwE_IUS<}u`(eXf_UIyQj>CvP~0OJ-tsTm!*73lE#PS&kTWE9=;fFc9e}_& zBZ~JQ4r!K`z85zawo+cZ1zCyPx&RoB%6jfnqj$0N8LyddbgP3BYql39W=7o3nHV`d zgVa@z4{P_Udkj}svfKUO#aQ9V;F3FJ92!(9(}GG$u?T+~d)L$*42M zzC^c-<}v^nX6kc{@&+nThbH1H?K~`ZFuP8TBvF#aL>tQi#v2L%e#Xagsu=4>`wT zMongF9s{sC-kGiGT9Ds!IddTZDwW9Op2dL~J?qk@l+x~TI*t->TO2-@t1YGOpQ0O+ zEvn5N@jb$i^mdS8m}ejYI{Fb`Ug>`oJUO6va_dLEZ|!KVuN@$Xw+DFQS0u*xw;KjNm(9!@rT43PmE!U%7r11PmLh9@{b^71r3}G zs)rPZ>M-`P?pssxRXk|RA^rep(J2I9Ap#npUhU(lw+h!;diO?mA<8_rJQz` zGPI9u#6{*0m?Mzb=abL#uIu5Asqt5gZTug9X7bzW_b8JxF+&170p>B<-y*REf&Tys z>-Db+*=jcl;w=KvuD-&E^Tgn&bpYYramUS%W74*M75J-B(643Jjigf(Z9SS?G(h<+ z9vcUh&g_szK|Q)xENV(C+9Y;PF`OJxm*U@q-W<`z#rKCNmPsug;JCJwg_a3p<@@~0 z#|Hy7=l&n@zM-J_r7muwTl;w<^4cdGwy;tahoJ!eHPCp&S-#agXFcbL;D+CMSxk_Y zSneUgWs@1?uMi08WYiZh7zFeL6!fk&lm-T1R#(Ngl?OT1liHKbW& zSz;>I&(Hd>*%=&yKpD?Ym21Kt7th@b05Gi>#AJaVD8{1Txwd zRx1>eI2e!|j53^L^NjSb8}TlO;%~N3p=u@WZmjOboU_J_A~4`Aio^I%_4luB(f$(a zz9P|QzKc}05?efm5ewkS{?X4MoDQS6Ca7C@XT|o`b6OjliKelbs;#ybebC_LSf8Ig zG0t&Y$5(XDcUzTM@!uABXT)|hL!tiwXfq^2D8bsvxPV9uJK(Vuw)b8nxbWT1gK2$j zdF9(Y(8!3<&uaKP0&|*cHb>2BS;9##G ziKUJasH;igJu1oW;=V=@P64>K^K#?O5^ecP4%x$G99L>>X=4P`mE?SdVd3u(YVozi z^W*G~wd5yvAOJDWPC)BePO@CFlpOH+YjzAPOyviyOftU>8!XK^&Ze(2o2ZeLvw#D_vttgHiF`uO^dwc#}r) zTgB&04ZabiAqVkp+}%zNR=iKo@P@DBQl26$qpa-G>_Snb_WW@ymvMgV!p(WjVqsoj!t4m}NZo+0=}6ZmFt6?iiC6j|bXkLIs1Dw}ws7t2kx*R?f(Og?gYjPE4^BJX{GTXMYhGH?( zp~gl@9T(S@%YMdB3C^}Oq0}2uylqNI=F{i4WZooSmO@U}3OXOJ8LmIXej2@bZnWi= zX_D!M%o7&!)65w8er{Cr{Hv)N^mclt9@(UXN4B?~IaVw) zW=WqPFx(rJ80U`lU&R(0d^UDB`i6u)(CCsyFq_Mb&PH+&0!BUZJJ)k}Yv2pn68e2E z1az4hX0uEp0&o?uIv#qQ*P!b@7}5M)1b^6*v^NpPBZ>(V%Z*e$aiIJ7>GKmJuzr<&-{h^58c7VXy!^ zU~`Jo)Smek~qGC2T~#(DaRdGHOUn;eHq zvU%dT;qGK)WnvpDP=Km2>IP49S>p5hSa>;Cy7JRg8aO%1R*O7oH4ReBRuEX+GYA>N z%_=B#2ccydBp#h>v(xQvwLLcCW|92ZRI!C72_yE(WZ|)%ndw%wuL0_ti|J!>N|=-6 zB2J?lWKsb9O*=&J_OGSe`PVvYLPL^ENM&LN@g53~!nmQt)ap_8_v#{3ta6Hu~Cq?1yzX$ zlU}6^RO&%V%X1H_Ml!XI%UAIK0QUZ${)=wWjy$`R+aYNiv#NkX+Y)EF0$PPiNwf4gUaVNw4ZQi*s}45pIVi zvN=C5-Bt9>RNbq1*5qACQ%!|e23sHwj(>yksz3axmD>F$F$m4}n9dVJ#IVQM$Ys0=V)GlU{>eV#wDT4i&FO;jE zF|>5)(DkoN_-Esv7kH}fTOD0(1*ieq>P2BPc|ZjU!M9{~!5oV7Ul;2WX*%26Sj}~D zZEq}+ywVONV185UwQw*`Q(Q|IKWXfj#J*=ls6|Ja>}+d)2)tKs;rneu?4kw*)B&&# z0o%|Vjl({fuQ`jt+SDLg&u`?(CS1GcC3^Fog1(sWhmGd({)~J#6aAA?WfHsG;!Vg{ z4bg&E4cv?#E3qFAyhh$47Q<1t)a|tbZLYknj?FAXD5bF52*}(wE<4u?&L>MuMU%dt z@C_CM6Zff~BIvW)>9>(CppwZFwkC!KD)QuG0Q4EI-pg3h^p~37!}?IVySraG9%5PT zmjiI^oE-DV<6fJ2;T>zjzAB1qZ7SSI%FX5_)HfbR&RfgDAhzF8xMzyD;jIc?S697z z+hM1x#WP2Ba6var4&+sAV5t7+&)3kFDxF5#+t>6hQIb|)k>`K#jm55MmWS=Lo4H)P zkjOm18w9BNM(&x0KU| zn8R3YpGEeQKwcQk$}qOUeEVu@J>gM(rcqt+js* zX*yeL;ViW$ym1+cU@|$39F;y{!ZFSZ55qO+`d5SeIJefCzNO(Al{FaTk}W>ToE6$W zP|k8rMhV6bCcZ<`(rKc(zk>BGMTp8<FPAUeNylW=5jpdE+p*792JJ2c|o7UlCcGwz^bTa^bfI8PBbIOZb;v)byo{ z&R{mFv(G9Rl*c0+633=_HP2p?a!oVPp;ML`oo=b2+v;!Ucyj8-=EUXz%+2TTUs%u0 zgV=$Odh?BY!dGJHr_`pmgK7<`*oZQ(Wn6ChoOSO}Pk*Lq%V}+<$3NSjn~R)zTS+`@ zL7syh{{RY;SJKnOVcqq(E-yv`Li^T51MaD9p)=|-ezj4$enNJZt8>dWYiqggq>#w0 ztMaK%m>n^Sy`<}qX!fma*0EePkGz=%Mg~R*$3C^_R$c+s{J6tJ453R)5IM+Pa1W`h zjaR}SZkNo`;C($J%E|V}0XOlG9|Jza6rD)7%Gmi@SFysI_@}sbhS^{Zl2$x{_zawX zD%Aec)bFhuPHV5-qbme*Hy=O=8T>O*TxfUjGa-$ffClKsRFl)5l#}R&)62JxLia86 zIw(Icr#;WprC&M@R{9+Uji#lfh;Z~hG`ZdF4YnMfaLDMv3^;Bv;_Y7%SzYmU9G)*9Qlo^skSZ z=aT8AVnY*=&3nIx{wi5%(8;DHv`=h>R@x~bU9vD6H%Q8JxPne_de@lvhRmD0jat^& zt-qO)tI99Xj-x$IMF_aJ7KL4=xsmFg5Aj{6hjhmN)iaw3Lb8|=Ia|&=9ILP&g>k+w z@oc*Ou^y=pX zo*VxF5=PecQZQG~T#_&|$QcK(Y#Pty3H5}JedF8uFeSYCBhFp!^b|!oLy{ov= z{111j%QRYctzreZ%+DvA3Zc#yl9?c$na8hAYt!yO;Zt}%_sxe;dE`~v(AfbZvBySo z#1-Atj2<`~*NXU~#7(Sfv%Z>E3n!CuBCgDi+khu0>zd zVQAVy7^spFy;%K6e{QvJ{t=%Lh+~4v2?uw5rFQh?k2^r`U2lQ4?LzBOx6(}O6cRWl zM;TRYee9FL^&-BH{>s(#*y6alyAj$en~BIE%W~mO< zxU>}kQrgxz%gjSziUv%G!vnR8Fe9ETrtz1KJYju(J&%U3wDvP3NZ(|-SCj@AKnrXI zxcjKNADwx&t!1S6s%URvwuaT^Y{-`KZjiTf$hiZKoe2WG_gc2Tlf&CC$o%vDm`{cu!pce{>5F&W_W_N(`|>TRHxQSn`bw`j8MVGQ!R888Se zA_Qb{(-_aMFYq?EW2GZYsIti_t0kOpCf($MH@UzhWb`8>XQ9Eas7~s}5~i=I#cG#+ zDAgX|>J!~fDVKf3mkd~t1^^+BI{Vi{XW(xT-km<*?ClcXsAOdsW>d*37dbn5n3CAPoEzPB5j%mg>x;%GZv)1%a5w*sft4xr>1W6^!c?LC+fdd&VPDWU$HQK+# z9ZSOSMWbjI7FxyZut;URW=ol{0b&+1FoT?&h9{mP=&4{ z7_=-ARFU^i6kwcZt}E6&8Z_HK3V4#%Nm4C2h#zW^5XrkgyNoF(4*Z;e+Xp08KAYja zN5WP&GwVMhv~nZ?TnCIX$PL_XB%EU;dsPd~dsMRUGik8fLk*?$%<}oM1$iV3fWtiJ zZZLb}J^AsmSgFnO!)veeJsMbeMmK$!?*)81I<}!_s?B|8rfHWut)cnL+|1_zz(5Wg zpW-Sp&q6D$@!yY<4MYAB+h_8uphAN2B`+yxRL9tm3j|Ty9Ax7Fc@6&nh;J=CHKpm% zU(Freqe^^|iirer9FHx5+{OB~eXGuv;pV+qRI{0WQZbTCS7sH~sZrFaFLzXxy!Y;L z%MVTv<%-nxNo+2BUY4nEdM<9IAr=A)NEoQeEsOwqah_|-^&J-XOw}i{nl~mFD0t)_ zL&p{DehAZE+SYAu+T+Q&uveBsz?3mZgR^f0lb(65GhBUlTD*N?+BbN0DTpCeh-W7| zK^)`{#}(NbH#U(LN;;YvC9Sp7+}PX3e5iojzS>Aoj2PC&Uv5vJ3YT2Y^rIBmNj?v+H z5bkW8xa-equc^ru(-RVH0Pq0jni6})D5GHy=dUGm_N%f`e!N)ZmZ~?&sT_X1S>#QFA0J-!w-V9CMs^tCn%yTgZ_{Nir~141QCS zj{H{EqoZ3vGAWyKxKl2}%H)jTWb~-jI}b#TZhbwz(2G2QLlc(jGhJq%8|hXfQn!ts zb|yIRc-VTJdgrBQUyB_!Pc}01L7$bKO6Syb>FZrifvHXx%Y8%XE1JKKot-p|X#?;^`2t`7B7`>Xo&t6Dy<5WBavW(gGT5<-LL-OytP zBa=~TV^O#=OLs2V-c8OoU>(OjJNo0&uV}UpdoyYluzAg4EPJFmR6(DYpHN0=CX&=w zT@II8vDGZ}@A#N8iZ@~-S)X)*IDi@3&IdRiwZ+|C4O!w#nVxltRz1Bq8~_0S06)sL zylG>p-QD@{%ja4;mRVW3ljb1v$Uk&rwlVng4FhR1BvT+(3!Gzc8-+N#mXV{W>F{Zg zMp3?LI<5#S=ng>1{VON!GVBq;!9eT>TAt?MT&l>-&m3SVB$JPBYKSZ61sF_>Za+-b z#pn`U4!X)&o*yb1QKS*G2+8Pu`gI*Uezl>jUFa6JdOR2ICEo~{j4SgY`Hmc9{KWOH zFkYQDLw1oYjU+x^{G6#L?*K86rDDTyruA-QATIy~8QP?C*XzwpqTZyaYG3g-wH^J+ z7!?Y~<)X5VSz}PE*Z8nGthuCSbe)u|GJpZ@zx{faNUbNoNibao1{Z+Mo;mHB-m%fX z({phg>Q!y`5UjwE;N!O}2lD2ND61oQwsY0`v#JwoX4fn&Qqc?H{tr;>rme z;2iwE#2#svT1;`wZk3TCD5}`XF(iH9q+{#PKaD*JQL`|u6VD1r{{U1D;-f4_ADuNW z_Bg^}bBqz`SG2o$2<0~R>`)&xo14r z29|gu%92RO4gNHcTS{F#gU))M)C|4DPFJQmJ9?4RAFXIfW|vWfhAoVzB#&{(ITc*n zyb-jlJK=~O^HW>j-P*UCZUf}xmH_@Vuh?x9M`E@RiFaZ~&c*0+>OaqFw-J$T-eV|v zQ0{eQIUt;U?nY|0=BE0Dv6lq^7z3*A^%xYEi1NvWe=KCFken#%)YWr7qBBxiB)!`z zkKafD^uaxGTC!ZnZdw)&uC8{lKPv!8JD2dR>xh~wpjfNnzEZelY#!BeYY8EhJiyt0 zcPj!{KH2{O>(!=Z%Esz5H0T;WdS@P<{?(zUYae9N#hM^#3zqX7XK3R99OAO%0Ec!N z+}yW7e+sQDz24hfL%#rL1E(V=igy<&+uPqf+G|^~2PEZ)>Z2r_ax<=)>OvHX7e$*i0j|*KBAmv7Gq>b zOV8XEN09yCc9D*p@G9)_+}vGnyqkB(KX@1B&N?2IOefkU8wTQXNzM;7HRG5q$b5{h z0nbc+botoyD9JD(pp`_b0V~R>9^*Z03VU@)GtN}!3^2z&-j%0epzE5cmQ6OMf7-6yy!CRZtK1IeudbsN#+Fh{s}{oX zj12W}OjiRrOLzfLe8c=%&OZw5G`m}vH2(m%N`gT7k7jVnNa{zWLq#M#ZB&mg;^h+I zSRX8(m6x#xI42z{{+p#Nl1TfB4W0)Bk6P!Zwzd!E1yxDZv48aEC z1_nVm<0q0m1w)cb@@2;D8EbsLd5rRDA><<)64})Wa;iJYTDXUr!Cx`Syy7A6|&eI za=pJEwa;6~Nyr!^!SQt1y*ImaX1vXa4{} zi7u{Y>M(Yx9mpP^O6v6w5b6U*YkfmbGfM;|eC^?gW5`wOh3tQwaXMA>@QKkH7}9f= zX&Y-1jN?3fdM_qaI(9&yh-y(z;G>di*vx)Fq2tbhO0{NC04 zYp!Z#BbHZ4lwc@499AkkvdAQoQ|3xSfyOcG$UQ3doutKj_Xw`@ybzaRw5S;C$j)(H z29uyge$dMVg(DkMS9QRQAH9s8O?r~$siEe^E}u;feIr)X6&Z}{7*!7AD&%(n`gHs& zq`XZk&K0<{yYlX49$QPyx?_QozJt=a ztp?IPOH()Yu}K6Lt|XP^UF#C|+{At3+ls-`dKq&ksz#QFZQ}SA`&Q5_tn99LiBFBR!Jo}n%LP^G=5M4nDg_9$>Z?f@Ru^Ihz|eZ0cv_`@x@ zE&`nH3z4t^&hmSHHJhVf>l19axHHcipD2Jv10I0>A4=(lA~BZ7C43#zt8?kiE5*8T zic=y8E!EmamD^!Kjy9IhIO)O7M`f&N8m^rlq9v9`iaBK#`h=xomN@f+@{EzkVg`7x zGuM1oWp^5B(nAxFk)4+DmvvyfRb6sHBa%-8HIHNAZC}J`HI1#6)Zb^sP_jns@hQvU z)kjR^jySG~;#Wh$l@z0S9U5wu-X)PO=hC3JK!$HJHThLgaT@Q>%y{QD*7zRd#NHab zxqC$xo?;2niUQy=5xhE_fCnqiGuy3sZIm7@(UMWA$8R;FmWCN8jAdRT0R>4648~06iLV_lTkwaWt^s zTsspk=G`EV=4L9{E!U{})OLEWi}bfmGS&lgZ)(9Moi{kyoDxp~aoW0H1bj^J_5Huw zH7QmJAp$gaJKALFu~VoArxm$-z?rnEo-`m9?5s-Yfjxm+ms#Fh`u1D82wlZnHBGJvIyep?X zD$O0lA-83K&U<8^%DQRPi;3o_wNlKXf27>s2E1V;_cOj#S&V3kdJUlWKE9QRd>5+0 zroHpCJ;ZOFyLX6?XYS)X@<}9Ox6&D*wT=jGh05;(=iE0H{v*?NIpa9ZXzF@3-;2DP z8#{^Y;DAPw7g4{X<;ELI*blKP)PEDk2DdE&IO=y%#Kst4NU z)7@vh5;CFr0W5L`^f_z}+*g?2N3BV2{vWa0vWE{Ob2_L8-H$!}Q!SG}#vBV$9P>$1H!nlicSx&lR345f=>& z@Hu>;G^Wn3e-umLi({i{GeIMd-b-?acKI8U7rKGd=~!0Rz9ZMg#;r54LN^_to|!#{ zG2a#D`eu!Bs$BV(a_x*b9G*zeIQ6fod_CcvLR}W(9}HTZR?q|H!jf#A9|vL(a4<8L z!96kWUQH^Kn|FF1)+Uu25WTfLPg0%@HqPGm-+Ys?!!tHYI2q1IABPppypijg#k`Dw zESq6yqRQp1mhz(qKkyTQ$*)52 z?|`B48|l#4YIACLre8NvwwXn`*+iKK1ePqvw$N}oit$_Bb5N057X@u4Voa=0?_?dv zwRgH-i(A85Yky-zBD*MKY35?gq57)ei~@afb5|Pcc6n9svzqk=%oy zO6_dCHR3H|H1Rvz%xvRf6m!jzo^t|01n@vV;aWQX0D-PNJ7ofESN8Kua=v?*P7lw{ z1_nFUu)B@Qp+!@*Htx?cwAD3hTf?l{Ga^9viR4fsE;4ckKJoMeir$mr2ED0WS-kgK zrFX=$AOav#W=XOS)+${VjcEGP@gl7n7 ze2b+@tzX_=$GUt#@z#&w`0jN}TgJJBFP4KXnI&$4K|68XiO&`1-Vyk|w;Gkbw}>rZ ziKJYlfRHdoKqEQ%y=rUwJr7w};kdPbvRkgi5(1fU7bh6%IK_Aej6bk+PZ39HV{FrX zm4RlOM)|S`DxhEtdh=dJX^O;Bhc!22>9UNs3srJejoIrSH~5QX;=d5xX=T>Q6mul<_ZxG;avrTiRIb(CRmP^K#LyBaa1ff~?ubPC>^{dh(fOvbn#K z?@hHfi?v8i<-l%o*&tvOlaAiCy{74UUCqFYSiF!UZ)Vwnk&Zb%b6+z`teme^w%=BL zV#7uejA>~V(DcnyPHhs}3D;b0MmwC(EOyZOS=ylC*!Ra}J*bTj09FhnNDq@r23ijDk)EYA5(#;w7+?#4*IN zS~TGs1QQy#EI#gb@H$tqD)ZBmRC)5l(@XcR&!sz`+x;=%ow;G$O$gb1J66efUV7!ci2x2qI-~-OS9uM&Tw{W(1m&ffZGr%PyA(b+B9_Kv;T^fz(V~L$O-d&Cy zYBKna_sE9CLu44D&y&4J1eQ2GhoS3F{{Vza3D1*hsJr=#E40QkP?ZGiKshC_05~0M z?0<%T39R(}J5jXP^($1hX)|uXk1>#;1nuYmC!yyexL*)>0>ewTX;)UcVPG4}(-viz zx)62&u|dlb*k-*5((2C}`%yVc3rlV0c-MsVy-x2(ht0KU9Z!{yx(i_a;@Rf_^seo+ zjab>~#wAFiWSeswD}%vqdh@^sr+VddKNf4=CVO2WG^IB3?1t9nNg6nz-6qzU{m}d? zaNdT!GRIT!^m@Bk-n=)OeV35%+(Oxk;Krc3G-Tug#DmTbE7+qb@}!R%y*je1CiFSK z58K=&%UJ6dAKE@^ZV;6Zot;AT0YDhwnzufWJ)XVx%K(XIBRnU|17b4pa957pR@RB4 z=+}CPzSVUUODSTwYek6cD5Z;?rzap_uRPalZ*}3A0n((n7Vs2ZtfK%E>&H1BxXG=# zBH7hSbtxv<=bAm5+h07$zI4wcs>aGj8;zu%Go0qQJ!{2YAhx=^(&Y0Z5L_89KqW!l z(BRx$@&G?nam_^STZq}g-B{v7cRucTOC+ca91p3=((9kDQQrdBxq z=m6*D1mmYnamk@ zWls?*ba_+I^M|+9Es+|=)>|1Th#Pm4BsTTu*MaP7A6{!6cS*O=Z-_dac#cL#J7g)A zEO#Cbc;J4u*+XUGS?)LL+Jk+G_C~B(ipLXWOCZKJj-=#PX1AqyYI$uuJEzSvOXqHD z^i6=f_5_UNV01svjx1F!Z5i8_;`thB>Ur0PG&{czT_&@r+mm4tRm+fe?rb4neDtNZ z()8aDYTBLVnzN8*bb}5fN0WDKeL1ed;CnsRGF+w1c557B2X-vZ3Bgg&k(~2U zc!n)P+R6oiV1j5vNTpOGmcT=jyp|oak%DWUo)INvdKjESsQI5$jMOK%xL7k2E#wT= zs~m@MWWd-+VS>Z2p{-p9LBIP_G{pUyL%oCH2?z)|1CF)a>9_Wlo*I(QDFl~yj~AP7 zB4x`b-C%n6_Grwm>I#ah#65`}MBMcxb`g@+a@T44rGmt*6LF zg!5WRk}%y7U4<|K!>QZ>^v8P5)I3jru3W`z8H2P4k;oT*=Uim5$RwWL)zSEu!_iz^ z++QTY?xi64am03V0VMOcr@vbB%iR{}YAoJY`aA$fA&g_^I6M{Wiq8=AJuC$j)}!Ns z{vd+tOa}}$k+87`(3}h&m0D|UV(K{I+I+U*9ox7)GhLm#*h3H5bsJ~6JAgum4yaB^ z=cgoArn%(LZ5rwDkqR=1P$>_PGs({f*17q;-43Y3mVWW%6WYsf9FoiqV=SX`@_m8l zk9z5R2NlZb-XWSfmKlw+H2OYuBL0(27IMnApf|W>4k0O1K4T>`IWtalTB$4Y^1SyUI zB>w!P_}X?-XsI~KqWyS z6Z3E@%_i`?){gOBNAoheVc%}tV+0=kLHDg{%5rK_*v6kKk18q8ra`D@REi%q+9f|R z0~le{j@Un~Y3sfW(bB@!_B+^8Cqk+GCnz(F0&~F_u9HCU_4c8q&8O+92$I$?2bc-n zA1uT$;2iPKTIS=4>~+{IuIwD5OXbX)OGX0#0S)YW`%tMxt%z0K`EGL7J{FHrRI#_g znV;ojoG>}y16<|Lg>^WAR90w%Fv$6ok=GxGHSPL}T16?bnosQOi^;cI%PN@D3`QG! zbO3ekc&_=h{{RMQ7ck8on7X`!ax8#`x63X!7>~Cj=I>m}D*CgkRb-Zk`2$bYC(&WFn(6dE8fvy{aFK3nGU+79pyLCAGIN04>)3o-;LiWcQm=HA1v3INV}W192%w5zeMi*F>VO4%IXAaCy;+kNZOd`qTUXmQHc zkME_I9CO

&|rhTZ^ZcP`mTyh#=g3a;&48e`XNI1`T zIp+tD#*8#)7j?0PSf{5`=It`aK{_S%js2@je3M5!S8AIjjzGXND{=~L&Q$d$BN)wT z_(?Sf)$Zc86Aetd`Ef!3^KclllsE@~4ST1DG(8JhHw&uyS~c8?Ad)+nSPj4*m@5un z3Ozoeyr;!FD6-e>C$qXsEAeP|#)=axyQ9l4Kn0hrdNpUrxtWAx%-m7XX?mQuvbTqI zNFlY1w&aRHs=jcEj&~`><^Xr(fDLWiUfAi{3R&xRcGl8Ic2+5v^Ru)Ys6ZVJ|yubpJWzG7_HOGTZlm3$&Zxx2L`(9&kA@)LxFrf z;%^XMJ?V`vjM2rqXk5nLT4Nby$;mm+JuBzG0(jE-uHm-0^318X%Xx8(4tk!PfzrLx zSJiDUG~1hfYH04R5e(LnZY?h3{{Sq5b=otYcoorxsdZ@_xTE>=$4ysP_ zcn9XjO?W4Zd_imCO+7rTQ5Ds!US8ktC?gmi-^#rI07mgnvEk`_+d?-YGALqpg53@Q z8QatjnXP4ALRuNa4Cc9|x%LLQ+MkO2BXlkGOL*jgqLE>RwxsM140t3TFcHYW>7M4V zcxzdk!dCHHc#;;fTa`yGwPzk|WbK$KJu(1rr=addd|9RVuUN2Y;J1~SUNV=-JBx#m z!2bYyuQltMW~HbOye-I}b?kYj6{{X@tHlO1y zHW^{IS!J+mc-$qULBpx--xDL6MYHjbheiF3 zmZbvQYPOC@VH-B^0aMNtf-*D6Jm#qAe+;Z*@SqpXJ;sxI=1X~^mt#jFhsNb#Gmsem zHRe7Q_>ZjWTIBv6)OFRDPF7q=dluz*qW~f{6tb020PFz3;=ZxhbmzF!?6rL(Ry&hp&kt4>tnqZ7mIejfNOY#zhK+NI3!or$KI z7$Aw9l?Y_$HoE{vPW7GPMDTZp^=Wip6@99~wE326d8UnLi;#1i zAA;9e@JYUs3+s(q+T884NVZ$ZRBl!$Xv->t-y{KClx{U0G4#7gjF-2Oh%TXUWm_qg z3}~#(tadrW0;k(GgrNkiwl$|WCw9g7nRDQHHGLDsF7V&!@*;h!?Bj)Fg&!y?Rknb7 zjGlSsxt|i-Xj;#MP49)JWw@}C8>I|Gd7Q9x=m^?2k=KllwawjWa(J)6t#1aN_IH-& z$zu{WE*ja0&eBgj;Nulr!afyYccrI@P2QOpJEn$Q$M%4LVR~Rw4Ah0+ENys1lYT@s^C*vI<;JUKSz>eHV#ngog z$11#m^JlI-y=py*wwi*joVi|ysrZU*Yx_q{(dSraTWRGVYDmB`tgE^(*xr9(K@qv!|D^iNB3mFM2Hx@=7n};69jMGr|dXXvfXtz8| z0M0-$zfRPLgLS0V8sg?F^_fDjU)|3c9GnnA&PQKyUh#LP+iO~C`0~v^v!vM1Bz|a( zUSJgE0Xb9h@G?0(S1V^1h5S}xE3T!brGYR@Z7S{B26o8DsNBNZ_hAJse?b$j6p>v?ZHHzGumEM!Y6b&f{|sud>(jz@a(zZ1a){;y|muE@6c zFA_@1PQ{Vr0}`T+5=SJ7T8@P?nIMweb0 z*IGnWNF!+_R&x!&C6pB0xb)6A@6x=dUer7%d7|4*tJ^^LmP})l$&(&pD8iDUU@_-8 z2eu9=ELwJK+KwMh4o}3|#JcUaojg*) zE!?tS-r8J81-nE_O#~x5mDH)q0)A2n#d8zIXJ>m3sijV4veaTGRFC~+QY*K}z#M{h zgOR}oyB`nO3k`cs)FZKoOtN{i!yK&~rI`-Z!(i?i=O25p=CtQh*wR$&jfuP?W8uw2 z>Ka?>pJcuf86{92D9W*oyxp9)82}zL*NVdN9)YO%SH&}G7FPiUyJjfD?B4J9qhR78Fg(yh_3I+kl$0nwH&t`LS+d&}I_3OI`{4ad%rpI=sM?o->-|Y(F z;$%~mQp=o?)bMH7w@qg9Yf@>0RJ2{OM|8@<6=Dc&(kTH!EH`tJj@5QF)BI;+VQ;Gi z(yi@aG2CA|pE?Va$N|+rGN}Pi1LdweQPaFt;XP#`xV?)107%sT0MX_)Qig)+5`|Ue zOyDqFWYkb;yGuvdw+k%~r930!Ju}3Y7CQd1rP^J$!;quDxUJ8%>3TMuZnkM4mQWwgoz_L%cpD6V}<4krS5UcGJ2m+8`=Cvq?gwwvAB>(u|;IavY;pl^8j&>agLnS zH#!tvB7j=>mqm&zW|?9)u>%s2F^`dsSAoG874!FlWxTlXclP&$5^D+8@uOQqbSG&% zvAvo!Wex|-I+ANMP}clq;w#Hr>#+KCHuEz`Jo6K~6PL;}5WsVc06DHaOe24LWO_Jd zCmj!Oy7({f+fCJMV3OWPxV>ovOo6<$Ve=_6uiY5#anE}1tb8q}X%_mC@cn?bvy2H| zW=5VgnB?aqk+*@+*Uq;802X{d;agjsIvqkOuI;yZYVGE3k-0e~m?-Cr9=)s2r~RdT zX>((DrE1plCXacDrCWKtxnz$y`@jO-J-FhwqNga{nmH@BrD?N2#=i~zBz!>em6zEto?$rcA-i;@XE`g7L38%pr6i2NsM4ve=WP>E3eqB$3=$CAo-Z~)`qt}|Yb z;SU;F>Q8;GKZjlxs6t^nmE46FGarohh`RqHSgO}#)07b&k+5x4I5NlGg6K= z0t6E^vL&wnl%MV;{b+zhXC~eWd4=Pcu(Tz z!kcdu$9bgbdWNHYa>Yi#?y;8`+EtwOIlvqW`io5QC5`Tl9Z~puQK?Sv(@?6VDP27eoV-o&(?;=Ky{qVcDYv&X6E(BT8>*i$;HYI7 z&PD+KRpy$P!Q1U6uI^>kt?vApQahh5cKp&{?!z$0UP-{~UuH$5X^NM+Wcrc>xm#ms zkRZ6ZjhOBkh@2okrx>nRQt%+ruDpl)E$Ylo(Sl3|W*GpCHwS^vasaN%nan6bIY~x7 zb_Gq!`f7Z=;@^ULJ+;&k9Ymm)7z-FK$GE_6PHU*~2Z%f;@Vmo8%tLE^cw9qm^LdvD zg)(GxVX=0c4mr(3@rPaUcB804rg%?8zIkk-1uyMlnYO$9q=WNrz#Bm)xvoFM9}eM? zIaA{W+pO}TYe-m@xenb4a2N&2$y54P4;>k$Qms_u*>3*hcu<_5EMuwW8t08XHXuz~ zM$)q}olC`V%`8Q>^SJO^k(_bXx_=DAZSfhUzSne{NJJ45zuDn!<-!d8%;AOxIr*vj zpTm2bOV-n^jB{x=fL!f~Ro+IbV~P1@Z6T9*VFB2w9xz%*Ewn2FaB*3~ z2UD6gC{J7Jg;J|&#!=I`=8*VO#qTYwC)B0UH3_3AR_-@K&RAeC3x#3dC!Q;(xxev; z!p#p`@U5?i(oHu}j5LtOo43xy1F(=vHq`{MBO@L9dX?s};RWzUi*ov0@oKtTf1}*b z5xr(`4*3*sMcR$nf&szX(x~{S;hf(UAh+?3gQ&r2XACJF!(5=YfuzP+h8eb=K*3S! z4S3j`dyQDfGKVcYy=0SI$@{Hn_vx+CwjQ6j{f_?tr&H%mAL5UTv}=obBD!fU?OQRy zF)s*WIr($f80R_SyA3Dej;SrJ#CLg_B|CvFxWdQfEDHj95;;6(xStsKV_49w-bj%sQ8liT(!5eyJi;FYqBAMwlHuxAPzX=G`3gX9MSGAWf8T}ibR@5V}xR- zB>?Ax>q?a+&(A2XV5pZZlhF6Oe~11Tzq5Tz>alCmK`e1dA;J~&4ipqPVt)!|r{K>5 z!EJT+jc94wfk_luv_*jO$I0`IjJHywpXFW=;;$6xy56Nev7=i)m~JEl+N+jS+6EXf z+n#gAIQ6V6Te&U^3x#P}@K~4m_~$t_-x_njH!;O2B^y}Litb%5__M~2BiyA=D%tN) z-RhQ?t|jtHJ}_|KE^D#y)`O+br%3v%A2L!*WHvTnbvf(w_OCg=g>CL082LqFp@)1P zwbgr^>&+Kov==djL%Gk*$4{kSv@_enVVGki{J86ixu9KXs*zeWWh8yuq&(z-k@#^* zsNO+*>TOD?P6*&1@T{HhV)V7jP}#$KbY$3NkYQFe#^Ooi1HEn9eU&hp%a~$3U@1Yz zxa9s-Lq@dlz0O-w)eW5IC(I!1Tyy}Y<}7;s(e-q}ztFMZh3>sW|Zix&!wZgtl z&D1_rU}KC&ovqJZ!yeW0EE-;~WiUY*19u1bNj!01L;N!E4wtHted5B?#}O!+eUtfe zvBm>P`2E~!dY%dBE1If;_ui=9F_W}S+bi379y{yBmP_lVIr}UKW7-crK-=ksKb3ih zh;(tRB>Lxv>}Rl_&yehLaUu`y@%OXbaoWAB#h(tZt)aJ{!_ZG`_GfAcu2$kh&OzFQ zZ0b1c#&KAhH;rPSMw?HcOAB{sjFHa*H=OKvCPgImJ;pL>AyIPk!%&=UE=e4>hxJ6e z((Sa}Ust)c*1W^^cv8?h#;wL(jvbwcOlKao=}qB32j1FSFOBs%BZy~Ytmzw!k)7Ge z$G30gqScAvmnU_%0ZNmMU;anG!e>h;of(KAWIO7%N z_g(FC5-$Ha1q*j}$Q4IWXJCJhI0a953WJKDFyQ zHnU-=X%XmNEs^y0Yj^VY09JD69$Vw)0Cn6tlhTxN5{lFvK5dVh9@fJ4;v1)LEfsdl zJV~-l0m&eo7Wd+^C$P|nl-gZSDz1NaR0bp0jQ;>iUmodEXcyCIRyQ&{5dQKO#sfy& z<0GyQ)2C|Ublpbc1ZeHbsdJW-8DgWhdk>|0Fq&%U<@PUUxz<5#7MfyLxfZuKAA5F5 zNR9~326-L3)yvDfi`zSYv)rY|11OB2nk7~z1avv;(zrREStc@a#j}>Hnsw2%k(pbQ zkN{9}ee+bip-C%Qms?kDHDrn_c)ZCtV(Ljz?avk0_-0)O^=6k`ws4_CZ;gWV&U28* z*kDy?tu(!KKpefT=ws$Hf#oz{WF9%s;aibtnjMU-s84pX+NcpPmU7P~-2AF~4ml)X zXT1(_wYr(cl&^k8DW zw3kl#)NdaWZBfZc$3Oucy7Z}%jk%iCsB?2!GnyJ*t@7MSBPfL+Dgp#lsCN(X%j-hZfk9zN}^-l}g#}1Ei40bwf^C#L6uKS={tMA5sQP==E=~3!h z&xF@YxU}%xvgv+K_JlDq-Q0jdWoZ`yRk4r)rkFO+Kh_6Tu?>{ZG^BdkO0U4Wct&nc z?~9tQhhsgxloqNcV#m&bCzxQI29i~0Dxly3Ndvucm;V3~HJR>OcwKG7;FN_z0C9pB zt^x1)bgdGV?Di8&bb3AY_lz{1D^I#Ht&N~Z7W2xerO^&Emid@x?&m-3^sgJZ)$i}6 z^R6d(iZLKD$mf%R&}O34JWHu+@v2`=?;8Ec^MoHj1_$NVw5_zDi3%5mcLkA|oqk1Q z-=4nJ(FrBF&r%Lf==Hw?c=tu{ z*Kr3+c^fhLm<&|(&;I~gvUYCvHG*kalIGGmWb>^4K_ZvK;zq&#_Ivx*u8F01mi6F^ zOVi%uTRJ?ms&7^)_mFDBc%|4ATg{kW1+}-nY za$_v13J;YcRRNjYlBAy9z|DD9tKywTR%=T+78qi3u`0%bLmvPF;BFv*G6^|3&svB% zN$QNMQIA8=Y;$#aH}1(F@rAS!!QKrX~Of#$2C5w@kdXxxtc2`ns$!T zQ53UArN!)@DP#?k60S+$oZt_qC8zk?USyD7O0oHN&XBZL=#ROvgx-M}RlkUX&qKkk zNB$At5$fo5ROot2s$DIgplrDvN6 zgdqd6$h`E(KjB(X#ibaQZO`U~0f9JO-nks}PFCnR-sUu@B6Ap%aR(f6)2}r^fLAC^ z@26V6V^?Fl1Cz&EbZHn|A;2BTu4zTzL#8cQwPOTNX*BO5qo>_N)rA(Q*HUayb}uZz zebL;~+Cv2SGC!A*_q*0MFjsSHvk8+gGa zbRho#g>_nN2Id==)NQ`bvEam5;IYmaXTP`OSFG%;?IA%sG`9h<{_Z<-^{#hQmikGD z+1t)lkUqk_KB*Ie=5(phX-pm*#YC)gpxIl_cb5{gpN(&0SDv* zzpZC#%BgfMY?+@73C~QPn5|tpafI^}^}*vS*R6E78hxt8Wqg5K&2~~T^KgCodsF7K zDfc)Pd*~(dotP^r1xWdER%Eg^<9uLMIA(z(YzxIV|} zTl!XsrQchm?&~T8h6IEKz4QM7*3DXEbJ+8XZ5sL0%4lSn4g$#-==jgIO{rLFS}{gg zq;yg@7hGYxspRlG8uv&vImM;IK!{#6^AN`5x`fa0fs7IEcopS3Q`~F%Zs$11wN|*+Zf!1AEs?F= zK2oYV+&lei(X1@z)ETt5Xkrk2l1h!alquzh9E!Vtp+lqU48lLP+gw1wCMpDu8~A}z zKs|`<&0%|VH|JNfI14NLy=gYw{`%;#+U@~=m~wwAhfsi|Yhxt2l_LOyoE~yBpH4bg zSEgK8=@;QbDkO{v&n%}H{H!FA_!HTj`B&*B!Bg)#h#IAsZFt`c$e<8mB<7R4+QnDs@KA@+raVLPGyBjR($RG zk9=o8PPJF;Lzah{S?T6dq3|1UP+0to*%kY6T;EF3`pJvc?9(p*N+Q`F69@S zqqmAM?;~exHzxz>PPK~e+9aOYn&KH7V}Jt~*Pg_Tl0B(86&GX81oG*Q_WZ8nhue@y zZ&B$>G-cUk*i~>j{#|Q&I3l{$=X;<^ZpPLef%x~uY99(}-fA_n?}lOuFHHIjA8*#G z=@oN{WLXYR9Cz+TP|UW!GUR|s^x%4W_pZZG(WQx7?K_}ka-<%rfBkhOoQCcany?@$XjrA2)>0@~dzyQw~ zQS0@pQW;^3E*VK2dUH(yBp68q#{lO%4l*j_w{y%gr{*0FJN}hTAu+%=0rLagZv01T zTVkGD?)hAF6={m)Gjix#<~cdZ>&gEB_12x9akA9l?#@8xKhClx#_WNG$lZ@>)w6Y0 z-V~O{N>Y$n8kUel=N7mCHgUL&f^+Hgty{e-Pmb8#L2|bWqk^45J()<)A4Woswmx}WtcVF5Gs?P$zw`;w2@(CS(A78C=(lpLlJj{|uPWU})ZAbfJ{SaNs@};`sJ?st? z`hx+S1IO5yG}}sanr4I zx($>w!X%OMs5xG9oYzy8gL9pL$r9pEx({+U16Spq0NISPG2oJOoN_*#o|V)!owFyF z(FPeT4lr;JZr_Dbn@Wv}w1_aH<@LvI^_!P*Ud9xPts2PqIP?`o8z~YJrbfm9+z2g!TDpYR>*dU>pv%q|fKhqQP8-uWszsd>Yc3VJ2fk@5^#+ynI%uvf zuCDFY{{SM-dilFBTWRZz`*g0p4-;EyDz>^FW3soEjAm8CvbS^Ccdt3MSGbKy04M`? z4?)<2`c!uWmSlNy8|CASk4nyTRNkPQOGBmcy|w9<4Qk_H7l7bL$K9?q?l;1U#FL!z zIRhMI{{V$*NvB_5B8GN!QIrLX0DT8se=5!UDT{jCINlg2QaK&^8q$n;VxsyH&v7Cb zQv#?!S0j$NBDGR$*lqlo4rAO0BLfw8K#DLOBuq$vk&-ck)9F@bN0GL!FwAm03ZiC} zjTvql!Iax&-)0WpfS>WKNiC(6xw&E*L!G^AYRNAR%rZx^J6MR{zn#E!2lJ~p(%Ro# z%RC!ZU_6#^4gmwFQ`A+$mCi{{%;)d4DeX{0hLS)7AI7KCtRc6!j!UFz6e0Olww>L- zFV?pjdz*`qEKszHcp&kS*Er|vPqw#=nXZ{j6+2I{>?!*w_cc{s$sEno7P)UH<{abG z{EDw{sa{)Ltb-0wvxe=8=;mu%du9`Smn`j(fsA&+^!2PeD=VEvWj0aoBPE=WpaIvC zaa-Y36t4Oh;wL8yBmdO=@v_$ij1$5w34xHiIuZ*2K`W3mj)2swXFjhSTBXd=S!w%+ zkpzG19fwvRo|*n5!R?-hoz=CQSuL#7Pl!ajcFm4dkELPT-X)?w(>uucDBJ#3An}#& z!Q-ANr;2M*-XEDWvhg+b%r9+eb*f1`vq-afL<59UK;4XO&!&2Ir}&r0Hz{czkEP3) z*?)Sg>Bbj4ZUff2>szUH7g#4nZNE7xoRT;PBc7hM5fQD|n7}(P-7naG^{AdMQXDX` zj)>pzo{6gJcP9SvH$fACz?>10l5yw&=N&7#@m!jIpLb<>rX0gB%ZQHoOhLJ992G6w z+PVJ#4)}%a@9oXJrB3m@uK=h#gUI0hE7iPf;;#rsBbw3+NN;3SFCxYZm(Nd34_>wC zVXW!g@-qiG)JbZ1UaJm-E@!&aZZCwTnS#iOrCpA3yFbWPzYOYHb-lgSuun2l=;55> z8$k?DnnqP_H)O;F}t=Ai8Rubgo65d`gSFazAc&}@_@vfWUeGAL8mP>taQg)M8 zlFHy2WdIz8d@)ofs;)89rF_Sy+P<4Ki6b?*3%Vc&8&5otbI%eUx2e z%m-)z_T=(SWcYW(nvaifu0OEiw}Z-XRuhxEap2>iQR-{8)6l9;FxFZmcyHNmX1P(K z+gw}-&K2EuG?)N%91me#Z-exmLS07k+IvGJmkL}*E=#e_IQk!6E9(yscz6C0`5@8K z+9kPB8irN_&Lm)v4hR6``c(}t!SY{gpW2e%C8U<_ZNxDkcR2@k3iUZWao4?c(ZMf` zvkYcsDN^K$(B=F&5cqeb>bKW-FB57}BuNx3BrhxFe7&K%pHqwvt}73~KN$Q+ad$42 zb)qWS$c`Z0oTIK(u_vZa>s#91m7-hT%WNgMxV{k?82MmGm|~}ZNM4-oB>wV7>F#sdyW6R5Y;?&lXN9MWX*=0> zF7f~!I%I>?^skwQt>Q@aYn!-k9cKsUecWvgz`^4K(!N(Ybt9sa*UbBjs*M@bw4k&* zUkiA@Mbxje3G^bnemZRdNllv^kr%d4moN_V@05Eb1 zBcUgrrntQ)N7S`jnC%wcONnJAim2r7JTW~5bozDFI$SpiE}VddNQ}F4<&nYXwtua8 zIBJTUQS&{Tv{aqfYk3_OzRRRE+P{PBMXV~Q5tOu#w0-QmWcBI^;}wMdGr!h!qh+Zy zeruLfa{mB%K{+_b9Q#(blLf}9eQ{{><{1%+G-`a58vDo6ZDs4u4y^kVYMmq~}Dj|7z$vrmrz{e)O zuJ|$W2SV_-g!OGtQYY<`V*;~A|eFJ%_(xxtuQ5S1J0eMb17#`?#KE-o6@ z+B;i$TjcWk1XF>MPDvmAdcd?7iD7$ja#9;>WeCnk%+C1O6ce6vlkHm`7|^b+CEX-N z_AXUH^&LvrP`Wr4%$pV0aQRO_yo&7nMW;t`XJ;0m z(o3jZ6XnQH@D96_@~Sbwz^@$FZojeaVze8d%5yRzBAM z0EG8I)pT#{eLlf0WGrWSX2#(C19#j=80VniRt2u5b7OI6Ev%f2cRqc@Xum5+I?2Xy z*8{bD%?_PqXMJa>TIwQL?h|~98H2`G2j)9*p18q2_0&t_TbpZm^!*iQmPX!GmT4xG z954;e-Z?$aJ+WO>@sNX2k;_vne6QJ_>Eg{+4N4dy4=QFe<~r_2m&-eqa&xykPeIbS zn3mpY(q*`c)@R&O*;um>21&{62Yl4pZlQl(oSyo`#1mKgmgYCt7{OKdZql9y*p=ZPPd#)DZM7O)PnBrL5D)~Le zImLO8#Gi&YdTz4~{+AS&7Lz-9OA48s5^@!>k~-t-Ua=kQ7utc-?G{-q;*C7XWPdSG zt^*?AbUl5Ct#pUPO{Z$mNpGmk)_Zp10kK9$%0iGi$r$$);t{Nd7)Lk- zMh-y6?_bKGzVMupHk&4keI3-dD9tou=ETTB!hjCrh8XoZuB|RP z>LPMv%!~4=>&lLx9@Wu?oZVFvv_3;IuGQW2(?h%XcjEaP!MrnXZm+IKa$=ftQT*b~ zwMws00Lkgky;AY7hWsHUnu2Rm-rmn@l9squ3S?oll~SXssmTYCit>E|_r&^UoBg?^ z#T?fv$!~Ku&?ZNWf&w8q;{X-|ryjNK(|kktgJGuIKBcDumn$ij+Rg=vQJg7xSfhZ< zdUwTp&Qfb*$c0{AR)@q|){%1tul<#!O*2_Ij|{3%vbPGnj=Y|O9M^wm@Vmv97D5Zv zgxjI$pctsVBdMnoDMhrEKj(2pB7Yoa3I{p7o|1 z7pCWKVNN!^hFj_W8C$rgxsGXI3+5zofQuubIoy8s4h$flg)D;*n=rzcHk4c0kAsvI7zg$Io}S;rRiH%^3*M~4R0K+ zDxZ;2iw;y|F)NM+Yqw<6d{Z>>cywFC1hPo-LZPHZ4fB2A4huGOoO%l0(0n`a=HmKG zOS!Hj&c=zAz=>PtExowGLOl;&Yqs#gu<-7nT00qJ(PoxgWu7HjS>*l_fGWPybHP$G zj-6>nQ@+PVcLyC=<(@3jF0{=m(!v;Hj!A8`OERj-l}@={PY0!II42vkj}KKTXb?xF_|si`EfwLnmI7Wmj9Wvp4azgY1oS7; zx-ECW`lDN!Z*3#KxHtrdRS|_b`MBpj&*4z`OJCD8E12IQ>_WNDS7EglKzqabcL;PFK&E=uT%__n2MoCKPkwYIFI zRkVc|2>}RzASep14ms#PwFU2qblr8O(Dg{>ww~85Y(OPUowp945zzF(%{RrmKEWlH zj{g8LQ#z;s5H^xj9nFG=Iqize(L6t`UFoKMcJeiz;t?gXnEwFM3ZJ-1>9v6G&0$mH z~MtQiE)FNXz>7Gy0rlb>& zr&SC~gRR2NfVUv=9_TO497hiJ#bI0atWr=@s*!*8XXPgQq^bbAX+F2Gqcv;uzc9G*W) z@+V#jT&djj?>3aAix$$$d8aYC`3g4DsJSemM<4;z9M_WkQ1Ku3fP%){NgmkLN{@^J zx!a5YdC53ED}Tg45cKU931HA9V=m*3hbzu{w_nSO@Qd9_=To_RyQVKBgqG*lyxeVg z$#SjFqss8IUi{UONhE)!IvTwl!^w!i+|9tptyIY)rhO~W{0XC78_0E~wihND0g5J4 zQQ1yTc<2Y~is7dYXJgf?Q<6N#s`v`iK=8(&9;L1<=6kT{!Z?Wvy$H!4!_?!iO1tBG zZw=Z{Z>U9fkfgB;Mgey!dK`{9#dVQu343cWp3Vyt&hr$XGWrrY>(3sQ&v>gslUdjF zr1BIxByJ%)V+|Ue<7Q4ia1UQf^tmmikDHA~>bc44&SyY6j;|HwtD;C{7X z!;zD>o`SmuvcJ_XC6ez>k!)?3%67){=A8W5AH$Au>0RH2J|ElMMRlrb$H|`R1NPGz zDx$JymB3!a6P)rYEgs)lO+DeTGJqdsjzjdhK*~eIe4{g@uCnpkaAlj9!DS!_^zVz+f~)HC@(HxiaF*hwayHsmm>kx)yGBIR_RDi@n+$3J!2T1{gNlOPudg7u(X8!+Gc-UnL=D(D z=np~#KEpz}y3y`DQDjl4w1zn+vtq&IOp)d<-WmQPDt#kbX|*#w=?3oSVg}k2fPPiu zpyL2l;-zTwBvu|Nwwpc8H9d2|z7x@{vpMD>8VCOt+fa)_A0}S?5tL#j}hI4Y>JCY;n}*u6VA@HY%K`r+rQ; zl;;|jYfk5>c*ZR=#ZMLA*yl}F@+D|qHzh(j=gd=u$P39G`RQLQc#Gk(YdVC#*>_S+ zs-@hqN#-&YUn~QXOJ|?MzomOthoyMKPQ9?d*QaT8lm3TqbWfEg?Yq=@e<|l_!9C78 zRwlFXi^RSZ*JQl#@q62QuxFh)V$l{LHq(-O;Erpqv*xCf6*bEbo>)lG;NTZa-cBXk^eL3r1GBpS#Vvac#(*3s1@^UsT2@u441~-A-vQH65quLFPgnnAEp@zvl+M zDpl0I*&MYgHL5aJ@*QO-yNyM?_cD;5Dv&tBkEM0q9Pvv(k!AMztZrjfR#Ph^GOR?h zjOT7a=o^kJ%!9q7xJCKnB>~0{rAj68ZX&s08G!_j#;MfgpEOLROWH$~pK7nhj}_@q zUL8v!`h=-rMVM6qDM1^hOJ|08qHe zDl%7}>0U?S-xq2+CbDicTgJD2s2(=?frN5XoPsN;{?gN-d3CuSTYK>&X43Wp_YQdy zCO%<<)L`cwYpKdIi)m_c!knqeMZFJK_)lS{UK(BO z8iZFD_V-01y0~Pw3$&L|Sl|FodY@|7(LN~rPw+$D=!_C)d%)&jzOrt?2zHVfFasQ% zgVga{^ykaD*H)X7yf-xb5qqnp--tXVadCAF&`B-KTVmaA3@0UBLHSli2PAg`-#+W% zuOE1K#&F_dr{en-#e+p=~J`uUnpw@JYg;z_cz**yM%s@uuwjb{U=y=Gk_78}6mtPJN!fhm6 zJ6uIA?wNTKd2>TKDq16qqi#?z2*3j)fn1WS?4+aI^r^+pE=!@}{s7hW4JK3lk9~13 zownZQ38OLzph7-E4_+|9j#PBP6|3W$gEpaYb$0}plG{p_{{S(;MP}rf-X|D|t z_crp4q>bt~GK_FWMm=fLpR$we#W-`M`y3=1wUX&ppV{!sBr59@K^m6Jv2COg*yE>O zE0OUohpE}$T{Z25ww8BOi+hq#gB-yFD=2QykbN=uSGeo`7D)U%qIi?Tt#2~OCz5C( zh^@j$At|?N<9HbC2?X{czHhzOd|?zrNw=2zOBp8fVzqtdHVMFBq?~-CJvgoYu^Ni> z%qdAHWJhOs)=MUfC}{2S&MrK>Nw{MJt};E3THb@=71o_>=`^uiA1vEO*HIR52i;|E zppL40bgwzqwJmlD*6uR0M`-686l6B+o!oQJUux*I3n{!`V}3RHg{)CZZXQTrGE7>0 z;|K@>H7ZHQ2nT?80~aa9^DU0(#xhoCXBUsgzo%*T`i6~dd3~f8GF|XmXdQ_Q<=_vH zp1C=$$H5*d@bc@{GVA(iwGmtb9tA4fS0ru#@<;nV_47xDZ!}o1O}4ch{{UqyTg`}p zA|0eIK^QB$1dM}<^&2~FHs0de>q^yNxXr8FI!>+StjbPf0DwU&&VM6K)v0?KI#99i zz9VZJQ74GB6}i+zcW*zI=gYQuq&f26g2WZh27Z-^2B!qx9=o&DEyCF+bqtkHSUx|KLlk+?FP1tWla@y9Bk5Tv=( zEYd_tBDvdY_ENYOZyz9+3>kqObU&?c8meh0xsS4OZ?WxqUAKZG(4uF&(o*Gu+kL1^ zBuQeBuMGqIOL2MmJ?oR^4dL{8s56Pz#|z-;r-gl{zN8l4Ot*^P1(q_a zAIpKbs<8;5`sCMIj+(QLRrjrDdTv7p}Ruc%tUWST&d`40m~NAD6w1qnD91asTe zay~Qg)!u`DEx=&u6NrI%1hO2B!z`IY!R%|-JVB&ccu&KNZDHbrt0trtGA&{ZTv-d7`Ya=65BvTUUW+2 zMo$5E4go%$>ng3bnl+^ak$X?@y{@xl^QNN}wD1OJ7l&d=*aX04IU^Y$4|>$L@F$8c zEzPa0K6Kj>Q3Ot}AXodW6rAAu16gVC{{Y4i%XfJ+1y%)FCqnDy1Z+M61Cl^FBN-L+ z4~2X|;r{>;U(J2?81MB9J6P5>l3kARTcK$bqmZwhWRARh*F&o~N8M&Kr5U|N(DeTR z7kFR8gIT-PMuiQkku98&w66JLm?#6`zFy!AeGPew&#&t?dc^t;q-3<13GVHt{mM)M z1dxXjmdMW-K9%S`6ZnH=Hm|6)=h;?RAfDRZ36zBe(UpEqLu}|*AROdYy|0KhZBh%* z2u`DW9? z{vorI?WG>wMkEq%+5rcRxa5)B72bWT$2JxazKg3*a;!{~Br}|=$=Ty1bMKC%*QEHP zz!&}l)F8OLZ!<%`L}l|yA!SXc1fe@v1IW%nBoJ{_bT0|%Hn3%E${lZUE)N> zTy17mP7Xe!rDtC;ah<9!!Ln8s9KP#2D;tj$>Uu_-HnVwSVH8e_bnst!Hxq2*YcA|= z$mfm^wRZZA?7t0365U)$9qh;iuX7xcppb4V94w45r#~>kuMhD{-gq*`Ehkyj;=H+- zGoL4!ZNUHy%s?zzPs@Y&)vXU%@MQP4_P2JI9!>42Un25C%%`c5Hiq>2kzQUe4@(fa zYewRY{hs?~ypBM|W)2mDq(^?i{2(5k@mxQNwcBLy?WU!r&nxNDTnO$XNgSBt zhdV-}ow*}Coa7vF+s!O*^#1@5c$M43@Xc@YI@(6E`2|&&Y~8hnNIik#xUiTAVd2df z^4qUpo7mo*r72sv^%BXW_-DhnH(F9fs!wPXBE@GkiE@XYWJ1ck0?He=dgnYh;*S;h zlS|ZKved0~c(obBeS%wswwx9!pu>TkxW-iEF!!&Utflew?yr0H2fC0&KiSv>^zs@q;`xaOKTj7=FOhy)@8+t(k&c|Nu2QK;o+(akz7Xphiu8f#t!(6wnSbaah$-9|=PnN~6K zI{;k?Rrw2W9Zw*8RbK}|b9>?2#qkZp_)Z9}T00AazT(z*h@6=fcYN5!Nf!IX3+bBQiacbt^IF@rvuXDh?K`rg90c--#y4UN{a8&=5&L z#Ug5E*c(F951eiToz}V0PlZfVKE*ZK_Fotar<1zh%WeZAkCpOOfdFxUMR|_B_Wc#!#mLJj z7+fB_{uT7J-L^O+(>ZCO{>_(W14z9$57+Xfuq$zJcO1AounsZ@TBmf+baOLpU^ynN zY5H%H{&L*LK$Lh zwwD>W(RP zV~1X&r(F6{ja1%-Qlji)TxnM}!_JZNi^f#*&$UCc5gf@GVoBgI=V1GU72f#ob@oaY$tpIX=3T+i58rKVci++N2G$=ee)Sgrxb z)aMoY6X5> zXdW_@SjM=Xd7I{u5jotuaodg?2RN(`65n{!!WYr_Ye9Q`Hp!*{O(dw#KGJbCic54H z^f>M5T&sKl&OkB0Me*j1r$Wci%rO-EOzkAjUC({YR2&R19066duN*wl{{U!svhqpX z`HlXnHG(l4IcTc@7-Nr;mA58Xv0xf`4| z1MN@%9P)Yk`sBLbf^_W@`&}=TYLa3%edNgdP85{|fFE8+=e>N_sQALm#AjxrLU|A7 z+p*;kk8f}}u76YU#M+!GWqumx%Wsw0h*G1V9WXwXqk?uNMctl>J}*~Osv-NjiV%dq?`gz1oO~#s<6R(tLetp&S+*R zcYT~ORs{O94Y}jiu|C^-Z6uagc!7P+Ilvu95&>~{La ztnFsv>Hx1Ql368T&g=|h@Z!BvZxr}@Se8k3D>T!M%7-#TBNuX`0ZN{$=sS1KeC2nl z+{*rAu?LW(3~|>LQr7lqE)q$dm%`T^P9JY|+I0o__ zHD<{RfOE8xdJ$X(v2CT<-kpsgVl70lTZmqcuMJ4s!6WRmgYwzPpWERJw6 z1^^s@Nj{`ijZZ*V?x% zE^c*j`W=*z?(#|VrP&Y|IV7?C2dScR*O=-_#x^5q?3t1s7TfId;|LC|!^O4`f z=dKQa+We~`{3VUToBM6<2H@z~>ySA){HsXKG&fF3+^ws`W-D_7O6@UbW7J^%2X6I> zEnjG5Q_cY-@t;c5x7BYg7vw6)No|fY4r(9m1NN`9$igxANCSWm9V%Rryi~Si&|8~! zLUu@5NdSUz+O(}Lj-fn|xl@6KMIk_DBLw!xHHmX|4qRKv=Xl_sQ`C<^S2PE<5=$lY zvLbCee6SgdkGq`X13hUcrNQ<$<DISC!>EhVYV%s(>9MMzbttjN z(>MnNkOv%dQmRJwmf}#G61ol2sI7`)3~YX46HuxR~kEY7oT$IcLilcsvk7^O4Bn zrc;i_isw4;-rvhD+!48iIR&wh3FfU_=pGmG3u1(MIAEl8$0Mk%BT+pOicM( zS3p9Mjz((^>i+)OY^9oc44X2b5JD>);XpiRp{=IZ>u4KVX*bBXAf*(h^4UK_K_&Yp<}l)b#5s zbM|PUvEE~8-BdK*zU&8IO6MTdwL9HH+w2a)a1to?@Bm(e>Fb*IU2{_&CAQKu9}wvw zt`*uZH5sESFbUeA;P&M9=xZ9a92(O?*SwD&(sily%g4BnVFP<8ARcmXNIZ9}xU5=z zOtr*jW@2!W@>rkq+Pw$FJ`>T*&jyQcBol@zBJ)FT!Rm5O(a%z9CDL#7s1PjC%PdG% zeUgBDuzL~Lp#3X~tys5sZq17+FBl+( z>$r}1?L|4bvg$*bXiMV#HDK`_$g++!x8H==OGZH85Kc+XGg3`7HaZk=FUc&Mivxm6 zo`ez55%|+CyfLi{NZA}aef_H8pJ^R{^z`dV2ZZ%W2wS7&r~$D29(r(lS4ygyS7s5U z(os36q`bL1Q0`O4M+HFlHE8LH<;2rW5Rf-6aC2QX*My%<(ax~9@MON*~VluK4ILf=CTf{$z?mU*{<#IUh_*Mj7E7Gpx26d7M;#ZRq0CzV46VEyK>DsXM4-@H) zYxWx!c^T#1j=l0dvz(qPB%#TBkKS^%iFI9CEBR)U$OuvvF{EAj@1El|&R*%4T6L_g zshH%E^B4k6#cKYGs?X4<9EBY6dvvN&{f+H#6tn!q zjAIA3Dy`JGJLqppwlmEbNj9@&aBv3)jAtC4wIzdH-!IvtU8;nIZi)#0b%mx$97+~Q z*^eL)xj8*6wT))5Xqw;^f!A|J-zfxo_vfJRM#7bi?Fu-xG>1aeLxx8S_JtWxSe$M? zmD%dII(~y4wu7U@xod*cpS)R9l_2#Sxj6RstPc*|MQ;o&v1H0$dK~m-I3$yjLgOEW zN2x;ulC)64B3;PtVN`4lxcN^fI3C>yts^}wV&kpLJ}2>gkM?x7`cXFXBNcHI6)dD2 z{Mk7e!0E-&H7YxoxMFDp8=N{FY zMe>}+v!dKjs7%QG!l@?URg`Zaaf8oZm1ZvpYm-A3ttF)KVYqF(R$Yg2+mn;WUNK$& z0EnWt@XnDNSh(|KlM6DiX8CzJbCFNFBL2C;3;J z+Wn$q{*M?)XB&et&qIzzcsb7%&|XH6L2QvC6Xmq8ARMvDQZs-!y|Nm^NXHx8Gq}#($IuX` z@HOAQv-WFup4pmAl?tN-E(jp9obX3+UR8TER}QjB2b!lXl1j*XpJVi`39c^fVTD4f z$8v$N4tVL)wg~#uXh|NOWue8cnJ=ZCRJ-qJTjwP8;d=G@eQS%>Yy@{R6(}vq-Scox zJqPs7Z1{EWEFHBQ>!ELAR0d3a@s2?LqrGxkrQM|SNYUlbm`a?TqSdIP zq9$rfvpneFpSnR9>CpZ))eS8mf-@|jZ~3Dt zdMfdPdm2tw*rSF^X!o>IhB7MSV&kt)eJGniK2uDtWRDy%Zl1(e;D**aXK8lJGruf{ zATRjUhtuSe+F7g}S`!KR7@f)LMo%a3rOXYUac(XPk}_i)7VC_Ain1XfmWhJ`GI`_y zT?T;!a*wk4V2N_ApYG&j{cEjH2x*{8Exo}}vDru?@>wKg^L9)dMclSmUPOYRkDsVT4h}KpvR&r*V`biLQ_t0R?)W>01_& zK@uk)tD}g=4QA>3jM4@;J!E=Cnk@c>>OOiO_ zFt|JO^5@^*>0DCW7j5bHm;1fGwSVnRBwzx3#TWzlx%VI8RdQsGg7-tyt!_kKae3wW zf)T(c-`=i6rD_^vt>;8zSyV6soc{nkRwbaj)MFPD;#Y?o1cdJSf7%%T01A#>Q&q8S zB+{sJ%w>yl)PMD<+1o=7YdabjSBBOXwzk1%2XT-LjP=0>gZNiFVShTYx44wDo>!dh z_6O3erlEaxdm2e@WR_#OTW)wAh{sP_tF75II)gZ2=Ag^QqXcAR91fjpJ3Ww`k+xae zh?s>O6P%JyTIO#dXs2OzrB6M#277hRc&z)T`$Wa00Z8N8 zu1;NCWkM2iFgVBZto!+AO@bgXo)7qrD-Ne?HEkh_%}~HFehEE4&T6)&nP$fCm3a&~ z1dgM(AIhcE?Jw_gEu$<^S;)u)0nZur_Ne8OA~rfOW<6V|CXlW-PgHrg$XKR6?r<|# zwG@Wq$`QsEM9xZs^8@SZMMGe)3%Hi@V+1Rb&WpV9(~kM8mpdhpEMGF`E7x{9igz8? zQ)f<*Y)M%c3d0%vd;b7By{Si~T0s@@i_DULy&|3lah#0yu6aDgwmxWLGm=L?O!dV> zX&VC4yKRUZe5avrUe!q)^R@IknDpyB$22$4$st~2Ewrd3jPCF4Rc3-yaIq4*4=%}$ zp7o1$6pRCx^BDI7=D_LotA(%at;*!AgMzs2(;r&VQf5w}yKxP?k-ep=F(U;+x6E^n zam{5|_*&xn=)7qpds{3pe>@+~x~~jd%@VwlDtUofzPdBUdwl;MHKQZkxL>H z#f}RSNy!JjX+qbwu?v|cAuZcj(G<)&T5lQd2ufGGmk59BjzDSIqSj4 zYV(?D*zJXyxSwdZxDm3-WSN&Q=ot1KcB@);uW_fzHJa{@DOAS$R1(3sJf56)6@h1G zcGuAxWGtlp+~8vw$^Lce38z_H+T2a5`Eb3y)yiNV25@oI$|TuV2G7nu1tMG%*&EWrj=!i}E}S^XXkH2})lJIirrMm%SSlwEK68=2$G4#?GQQ z$3h2V*CM&QojUBzBityBSGXe?Cm0p&YPvdjYA+SqK&d=}N0Qy!bc(qlSPuF0$Gvja z5!mZ?3wviAu35@lTgtyWZ#WFN`@_E#wLAnK#%ne1c~aWT=Cen*?L06%Q)acio&4E1 zNscql2jgDFWu|F1?6x|Ta$BpbF_#@fDci?vHU)9fYL@Ok&$WOVQgS&XxESD9r7Cfz zlutGosaBhDM?GzCa~{v#l7)d_4^S%X(p>$d-!xc_*-|Lcaj+=#J%{UC!Z@T*!Cd+t z1}igHHxt0NcJh{u31%4QCyeH}D?u$$=);-EQd^%D-QGhMj|6CtmH^J+hYCOpGN%P` z*n{oXx=#!Ed%}96-odFGyNiiHOJNBSy0&;=&z0JLh%n%E=CdrI{{V?)rJdYHC|@Eu z7Yfo4dXh&VdRJ>}tmwWOkIFH%%*aSjEC8-pWHEE|01sd*3Nf^`IqJ#s`@K&zlTNzR z?qs)-=2lWy4~*>{Gk`mH;=0`n#@AjIcevB!nkL!{c>oeZoQ&tUewC&6Jx^Qm?bZn; zp7c8#!UKr%4{VMU4)y2S0_vU{y}pxGwp*xE>+hP?MxW06I z)|K%B4-mx^vVEiNZrf5;48@(v&RAz^j`h`8>WQRWNQtQ#WMUoTxQ}F!FwW!yjzJyk z=b1GL^fmh&O&kp;?;bQ_7;eKV{u#mAc&?MeT2Pwv`(Iepp+gHk>rKm+=s`F<=kYbu zhQ~Kk*|Uoom&e(ANS>iRzNx4~E&aNgBl|%ww=6mT=zx`y$SgA!POtVA&>W1JQk zZN%}xZk{~TZFw7ck%sdlJ-YaIG%Zr^ z#ab=yl5FkH<@;Otgu9KnDpZ0;ECI(#(zVqNimL{o@!iihR{`;}jE{2#nW>9t>N9&Sv*1Swq>D2e7(Dta&oL#Bx&k5IcOY1F6YC2u-nJnWoJTasy zSO63%AOoL#pIW0F_gamivD77+-Y1aDEP2NF1LffNQ>8lr>ezwBcqI>KOlALdE>2j8Wx=vhc(QX+Hrt8B+v<0F_mC9E>A*7BlWLi4N3Cq z&z{UN(NT6<^fr7Y;O!d7s|x7ngbK2oX3 z;~66-JoV{{`rpQ0Iqy-zD3r-`Xi)vUeO+(T`1dpZj__s?)qb_XGTYypweIUh>y?==4a z5or*?ZF0s-c8z7+jwe)8k$|H+a7GC0UR!N<_BDHiiIrJNiPRC7Uqg>t^&Jj(i@`Wo?3S{XWLhitC(G?G_kwoIAbR~#=*x#^#Jvt@N8 zFkeFqfcbI&g+^Zh@ImePSD|Vbo*&cfujkaQUN1fXun3%$ONAqIw;9I=k5gV};TYOY zM%`@H<(g;OBP!dZW^a@ZxyunoB9|oN2&=P}ljc%#c1XKrZ*Xqf<5ZYj{iR8K$jnzG zxdae>vt4{%7VxKuw7=}A?jpBqH&Y8clfGFSFP9*IsG|p-Nv?M9!J5{gCDpn}Z6~&p zP+^etaCroF&#z7~S)Lcr^~-CCbp1p&@LvNvRhZ{*Jpj*NYU%beQHy0lq+R0{cQX7s zYgq3jwY`ZUx^o0qA;gfQMsTsI1C8BJ12yE@M7sW;t0kqpW9`0XR(+$9)8)wN$3Lxo zGvM8N%Sf}4uC(X94~3Q>OF&AV7@*;qdlOasS7W4VmgmJcI*giH;#+%Vffh3Yl>?Gj z2XH5jpc9Jo@spGqmt$HLHFVn1o@aY+;|*fc;^y+^Ap{^SyzK>ho;c#I_$ob4cx9VZ zgKd?&g)&1R4B^2&7daqfxBwpY!uYROv(#;EyeHv{m%NEeks=29%W<`V=OFd2iS=z) z!FqdWTZ%i$AD?R=+|JIN9CLs$bI7f5SgQ3S%~6*uJveCe3 zMv`~D#0ni(Y5;%bmIg-AjQZylrQrp5BYjHdH9lmIYaF1M%cJLXnPc|?jBqnu)Z1y? z!f;WQjuoTPX|S37oRNA z&3M+(gE3Yi1Y4KpViig0l1+O)tKr=e=GNZlPSZt=q!FyLAx*L>xC*JX^f~LEYr73X zoKH6uQdZ`DO+WZZtY@A*Lr=O(eM0anW*F6_XG{aU^$HXbjEtJ;JWJ!ty*Eg+wA3t8 zQAoGw#d1a(gYw^!~ z(#r+WEXx!}&L4%DOqfLm|P?%Lsxb#t*PBd3^rGsuR{<}poKg$W0qnG)sSL3zVkT7qhTL#K&U%y6HRh6Awak+X+i9Li)DyT6;N!XWsPwqTi{fh| zbc9C1%(1hye=gkTAch3zj+N7fPA=yzVO~6^uy{*TyRbKUW}|fPr;j>#;FSc?C?w?J zzUkYZdHn0uY;~Up>Y8MB@?S@6w^k4qxmVeUU;-r|0swp|9M_ZF>Yf18H9I?aVY#{{ z+F2!i<1sv{R3hXYh3Za8sy2QI@K=c5*HP1v;%NNUmKdD2^+E(uRuXs zMr}sS+^KT##Lk#46l_8}G0qr{zq8_&OisRL))cvo+0q`;sn-Yx`uF) zFi0VYi3aXQ=L4L2^TkE1X*!I4ACmeRAc#TpOqVBX6#!%mpP2i4SDlH(LKkPflwf5g z%=(;d?xeRmS(f6+#_C(j2;1TZKKVPj=O-DiLsr$iHK*xtE~f;x?dKPpU>l|Yec1bc zd=JvGHLr@ARh_e1MF_aMOsWWuAdkOa;^(j*jd(V-uitA|vR_|Iz1skGRbIhB=mmWC zGats^Jv zf%WwVa*aVMP+a<68n`}?j5M<+#^~GIk$*aW5h8|IxbLwhoJ|vsQ5J{%r z>TP3v4o$dO0!1PmXP%7QbTw~Zv+*94Xqx7ccP+t%Gxm4OM<7#)0^vY711A{u2NliO z{5sSgJ72a!ZS7}|_j9X^?i{JcbIA1-LtoZ44-V)yUK?j(Y_6o0W(wGN+#D(0k=G=9 z4|?Zwl7}>vjpag{npE{ByViB@7ql~K@I9Q{&PP+z4T|mLy1ZLvj@sSgkIQCdUI|=e=N-jy zaK78gWR$#{hgNQIPI>%m&6W2(dTA%A>l!YPW1~lFd8S`%0o(m>F1b;>E&}706~rz&#j|UdgCwz6sWT73rFUGkuR&mKSMbk81+)mH~*! zU`XKC&)yomT`J^>V`*i1GGq>R?F1dWNWtU-&w7c)!&j)O$yIHm*t{EKt7-Q3m$vN> zn;{aaBZ&xXZFP}JKO~Fyf%M}Byt`d#ZhUN-UaJDxv(BPMUzGx9JBMrlGxV>l?{q5< z8~7I9+rzuykj>^j>L%YKV(!{X^2c^@+iCh&&YmIghOK7uL*h$;CG2dVN=R|DZsC?4 z4;>9U)ga=m_b{P*z~i0ACj@isYsa*&5_p42 zoxGcel~{%zV&z|M0Lc5KjCHEl+TN!vr18T40Bb>jN`D9)@;U%3&^{R4X}W>Gw%61p zf}|j35dKM#!td%1G3ZBH;ltB$x@WUjmJsH8p3|rJ{{U9iVbX0E0@ULc@}}g5<0Ct^ z@)YOgBzMJo+#VzGyLeYqy1R}wI(5?9+WnO`Vmo$R<8Dd~$3HO{!*{Qa^)C^@rRuSG zi%Qf5*|UIKNfM2cG9cOu1GJKH)bn3Sd^_>}zv9gilStHTfu1LG1teG^WU8NSK8_Ehr_F?SZNxpPc710{hnyhFOt$DlCQY+J8{tC z80%br#_t5htk~FUUJ_q2NuoCk96&KaoG>I3cH|sqzZKUhQ>wpq?#_0qQft~q$@M%I z$HLZZ4*YgpGRj#a)5~m&KbI5rMU3_0FE?W z3JEp43&<@47qWJYlu1F{#ZO_5wMWLfy~l}Qv)1h+iQX9Fw7Xao;y33F?jMuvc=WG6 zP^k&pTN=jGS4{GE-2*mw2*pY3(ALhMZ=|HnaeL-D2zj?IZE8J7 zQ-|#_fZLNha##=!eUCMhE}0^hWd~?t03)tHuOf>{KE-hytf9h?+kT%~(l$=$%1NE} zudHdBfQjIUrNEE(jg7hbk6Pnmy)s>!dy}~j-ENp7q`$lSPNw$}3@oQ{9B@x0V0O(? zRRZsHgM-h|)0CSc5H>6yZQPRi+ay)_ayV~q%DqoS)E45#YiUZBTz>Ba?+w8qj^ezw zXb|m^Jm(p$dp$_SY9NsSVBaL8hf+PqUMqSvExR$ROPKCFAF15vm$%k>m9%%Za~9j? zjlpCmA6rOYy+R3~U)GD$c&J^S;D-OX=f zEp}(TXqu+8t?0t$Yt&TIraoj4N3v_YN3_crP^Hx*+8kpY&r11P`^9>s4G`2|H+E59 zs!4FfG?B%;0^3mRC#X3GpF^7VtsBI?6xL?ad{=98H1b#@T(zW;%F;s|ECaf-62!&` z`AEYk?^s?Y@b87S3;Tm`bwC8+zMrK@r$P0|FYvNr)Ucc4#`<-^_wwto~SjkYR z>~oLI*RuH9ArF%F^h+_;N%i7FG(>$E_&o%WQ zfc#6R-gsW~U-5*gf2TxLL?d#N=3Fjvyr~Ve;Pa4uE9CoqB5iNyf-!3xQG&%cG8Y77 zzDKD89V_TBhBm$np5AW*OKUS;YA%sA!#G?qVCoe}3xGlEo^$MLgC7V+Dt6U&Jq#y2 zn}zge*1rn0-7{5LNfu0Al|ObVNdT|`+yj7m9{haM;|K6>guG3Cr1*jt zx>vv=0wQ>tHsB)xjNoMC9M_^;_+sNl)2uWdBwt1}X`149w8x)0atgYxa95Fzqpo{a z4!h$I25WvI(=`785a^bgyKQMq<1o)8TT2lj+PP#Sj5i~S^6BC)K4~3N!^$Yh@#l*? zBd2^Qw6W5yrPB5LDOPxe(|MD~mn0J5lcNEK0OKEAXXkxS#I_oqou?gN4L!M4GFu-i zMvQi2gOiMbn)Yvwns%1@o`oD1kiiw*i%zmye9$aA_QDPn5aB-lbAm@T@@h1;`kmdX zpp+M;p! zioAje?hZiqtqpSC{{X}9a-M9_wZv%Ijj*yI`W}_(Mv|Y*QF4R5%N{TAe!CUhYZB@0 z3fz*+vBTw{Dxk60qY4jR20bg%ejGl7sOk4UADc*u7Mo2ABTP&TR-h()FN3)D!*%ep@BL1a-`*yWHvkfYtcR?*$ql5Q(UvRT}2{EW-5j@ zl0+CSlgqI69kK^%^8H1O+C7}tx{N<%eW4?0in((5PiYu7irVW%)$RUp0o;Ys&Q?E5I5%}+0I{oslpB3raw-ZF0 zK*!DUF*xI#ulQGKZ{SY^H-@b3t}kuvwPc;=A*J6BmF564Fi-+B-yXHn-e{U-~Ae{=_Ka^RT>8%&$Bcs`vy zD?Cj}+nE~Egi^8CYT7o9plT1HG?(%~&?|{&voT87E^x|n-z0r-dH3tW=oj8EZ8rBo z(Qjna&^dK6fLF^TV{(8<91cL|zG}>RSH%rd_SWZEl3hl^6+}g64*NHQ$5!VV-N?s& z)zVmeS-kN6vlWYYb)%8mXx@0_2{e$DXx29%Dlm-lSoOwut+3d*PCosal~_2xaO5MO zTkxlckC}3sgqK>1Jd#FBv5}GRIRNJeB#twI*0_%h-D(l|xjf+(oc97~+U4-5!O@kA z7G*=8ac4ZDL<)*!0Z3ef_dz2$=RJ58=>Gr@yk+5k4ch9ftXLgd#%R_j zi3EOhSbvsS*~2Q8ZlEtY9Qyh1#LKS*__thbOTl(?*p?fb8F98u9i_VPNap}?^sZ=A zjYWCAPLF8f`BujId_(a@x}e?MCG2`~%EBoZa)UE`(iP4bfoy_$SH0=i{vf&1X4iBW z?I*a?V}U>7Wp4nGNJlLKvXqg|+~?-N9AldJhr|9MpF_V%po%Gx8H2?z+>8jp4T2Br zUEhg(cdB@UP_v53q_B?8Ga5&3JhF;;Wy)Z;B=UK|rl`2fL1_0ne;4Ra;vW&EKhs)L+_nHu6JdBBUV3rC>fAmp0+buBiwzYIGu+7 z0NgqibP94Z3CK9eu6%7idNQQf#ip8C{Y|jxDW`ppTGig~z&;|>TSe948eQ{=V7VEU zWM&HGc8vVw5s=l!Yx<6}tj={iD^?RmhDqhO1xQoXn2rEHm2-N=gs&9(osGh+lum#w z@+!m8{X|{u~lOz%Fjd6EmFe!N}o^C zkDGMvvfNxrh2A@$Qb*nG$T>M?5{+%=Q*!x@TI1clSdWoMI(ued0~Lb2a%pY=ia=nvxe$_iA5ZwNPt%5WW zu(`Kb1WjnNb+-ml11AW(JvftY8hDqyvM-Ne9^1q5Ltl zJ~q=L@a6kO4a8R}VV*z+{{T6FCPSUf7oMFnUh)3`2%m(W9Yez!)Rr?v96KWl&jE$@ zf+vlcetoUDGMwaR6zNfI^U0Xj#loCi50^B*8C(6LIBfUY@9n$fR_uA>>T0)&w8?c_ zyLl|YGtNJH%0Wzysc*0z+C zU4;nW-b~cgGzGddA8Z?Vy`q;&*yn$B+98dFzVolvl| zmQOV=6{ZRds7AmT8~_e}W6<;!>)r>~G~W*CUuu#VMDj`VF#)7dy$R{T{AC9g_a2L`_CngIriY!RK60kj=}D(ZyrhdtZ|Q*A6{~5=TG5*{E~1#N%?+rjb6jg7W8ex+Z+fi4>|5zNZ|q=rLHO zG>bXiNNLCQB9N8b^fu*L;ut?FgN{!p^{#5?!*696jsbZp2~4G= zjZ!5b<1X8qa{=4ssrtf}k!5mdau@bGlmRbn_^=tXjR_3o>2e)C*>i~E zMklGwZ5uR{g>Ix)D-&rKHEN?DISmNLXJ<0a; zuQ7*Cxp{oMi1C4w+aLbA>8<=c`|-E{P5|rp{VQ%rrJ<9XZ&H_&EXp1*Tc{zAPfyOV zq}h-djH$^6y$(+cYLRL3T=_)8K_H)E^q(5u8i5k}F#7j2ff!KA&@f>&K@v0h)#gekgrMZei8a6@mf}nHP zr%u(J9kfQzxrGZ{zF~0Na&ex=wQT7+ZlkD9u?G1fV6J62QIBr?R&*BESF!;clY_ar zzy#N%>AD`FaM4X~8ZyEMnG-Q#D=!)20CnT9G)-Jh*v7w(-BB%u5#h@}8%E%G*@ODv zd)B?{>5}R3-bHkd?`{L6vAmLbiakKWjMq#500GdMK-tS7elSnr>N84wT-9eWzmv>epVvbmn z2N)mWUe)1S9}4MqlitRkXt@c9*~obJ^N5ETJp9eaObpjeTB<0@E#Aal7}7MGc?P3# zD2btReDfIc_C@!CspX02J0703ji~s^8(x;?;@9mV)z&s<3dy|n3G-m!9y9*{*SX_Q z8A)Mx{gZUYdwC+tt-uTRc{Y*qd1U;Y@t$+^uQHD3N&7zQNZ;-A6iiZW#==!7<&*fRM+v^t)yAC|^#1`PO1cQwA{3@h6HU9vdkjCpQ(uQrmfkz~h zj8Pg9-H+QnhfOrM3PCyNKSF=~breA(C5v&>@$Xi(3oDy2V3HdI*i^!M;U0NDtE~-Dlw73AY}8$81Gays4SJC^5K#w39-}pC{{UFIyNn5}%x@fOq{cR>$m@*oPhYKb&T@J)brsOh)$P{W<7_kTfz-0? zcKbm#>6moeMD z$DFG0#)NQs@-fZ_98~aHLklIV%Bellg6POe2M2}cjw&ZRiVE5s^_Bc~X6|?gn9+_m zfJWYV{$EudIEcA->q`i zw-6#EYY_7kl|2X~^v-=NG_J17o3@FDse6B^yi;7<1d0?27dQlW{{ZXOV%Z4qA}~q1 z0_xaqa5K((b6sEjBXHhD9p0fKjSFqsF}FSby(*@%H2po}hfk5oW(vwc!l)j+=QT=8 zWC?XT>#bKuvPhRsvGe2vIFMlBha(`0;k8ILi|e6(bpB77{;Cxx=rjE5sL^dT4Qgvx zY-YEMZ^*)D3y?-RCjfnOQR}x>`bG3d%vY;4<ql$25OuxVQ3h_&;>#X%=aX{rA0imYD=QPUiipNeDX_q z7e&t|iX2>HMPO1St_&KgeOtu<6uJKsB zs$^a4@tupcdD_HqN$bZo>pF(Ft7=xwY|zTDXn@HZg+)YcDcYos?s74Xy?&l+J+7Oh z+?!jsy@nZ`8Yx~NyPNof2H+8#0x~MAMMc>e({1iHZxh~HEcS7KsCH}#26D`#9F9pG z^v)~G^?a&eyKYm0gOI-X>JBTn)aKHywMM-!=PHn~#~b7n7#}b>BaHF+aanrdveqWJ zyU{Jy5T$oO%uen;Vx*Et$o1)1r)F-E%-PRyV|$pG0=sdO^5Au=&|gh;KFK8mKXhk| zpVOMDrP=Bim%n4Wi^#M;E3{(=1M9_o1L2jK@O_PE{nYWZs@i=CD^zPh@y`x=RvLJcoWmCu7L^j%$3|MEX>6+7l(jpCMNq z065@`a6#k|_|^Xai5ec6;hz(jY$ti4kb|-CN&rCw6~;jwFzDQs{ZOS zpao20a2*N9*0jQ6p^2j!^!Adzq+gjPx}4pl6HPk9lw&L7_nG|p=K`#12I5UpJ4mpm z93k1!l=09E9R9V5e|a#uGeqG*$qG5feY;U(=Fcd)c?&X+#9(p$dsknWqHpVseQN7! z+y2Nxd2DmBm<~Y5#(j@khQcsP%It*`{#h{@W%cyP^s29UsOk{BH**tf8)PdHxm(-v zqRkg*x@2P%c^Mr^9nDJG!DFYFV{B!g2>A*WXCG1YtGBmkG|24ju8i!s91;qHo&uhK zEY?M>)EBV?KtrqK1?oqqs5ELy>vBwIcTJ-hIP2Teki}bzdwAV8uxu3}yEZDtwcL|| zAdyu;%Egkb{B#FtAA##xqR!%GGF-O+Wp^GM*PmZ%u`Wfc`H`v+!vPKy0pIyku*$l2 zsV%mpx#JJJJOD5=-vb@KmDJp7PcVVulWHp*paVOP8P5cR=t-^}n&ReFkOpQa0!8Xa zzB<+Ws1iLzq2Avv+^g`z)MMECP|+$Us#@J?SDH++Tg4f;iAZC^Irqi@81>}WnBGYM zkeDK3&PmI6t$B4_KSZ=>bmdtlxCLcq1RQrCQJy{Pmq{)zWmMn0ZV%y2Y$&T1ETNpc zN>G$1BaDtKW@r*$-^{y$soS@K$E`9Ok!*!oi-XBt#V+$FgTYPR{%y6wDaf6$|wFL2HQKQsIf=6C}9@v960=i~BO{8#1POU1L(8Di9P5 zdSbl^;nhfH+kxI(R83q4ZSov1;t|nEc3DqlL~$?a24d zRQn~}#mMsGW)gh6TOW9I>t5gBzW{0eBeaameGC&l(YKN!PoEkE1jyWN*m@3fYn9iu zgpX3YheURo3q~Pkapi_o=s-N?v-+g>B3X?z>`?H(g-)+}Z6^gxcqLo!E>1doaZF7T zI}LL8OKq|kf_9-uT$zo>bb+M1GY4^5q7^70#hFJ7m4wN=e}D5 z9^~S=ULvKebgEEVv(PQIhSRJREQ4bJ7_bL+Mse%KMd7_VJKs57gi*S&GB+iLIL0}y zYWGCFifPJH1amX;X(g_rsdY z-8sh6TG~jiE#Q(wQ~}R$$0LjyNwkepYvt0TVp3)#37xt1WqM%Y4nLt*Q?fF9AoLkd3Gtgxpmq@K64ra)qPs1=x|u;8h!So6pD#x z>ZUn{WRR1B1_0I@SmS8|2~0nZ0GJRDc0M-HL6=VGh#yA(V% zZ{iy}o2Ig!8(E&!jFMd_bSR}sQMep43}YOc^=$^q!qdaU#4j^G%fPciAIQO^RxyB2 zRLB{|ahm7!2>$@#FR{C|5=ggD;^KVn-a@VbR_V}muVI5m@T9i-E}NxYquW{|wchq1 zG=W29fyVCQyXeg+>U`!ZGD}u)k@!OX?hBbUONi`krf=OD#wFTRw&Wy%jlc~1*UxtF z+}rC@*u2Z-tgfDDJA-XJAJV><_?v8!U)?MaJ=C6DFhXHg5ex-6TxU4|uWn6vcC~M% z78ZI`;y){K@|YdoeJS-}y|q-1EvmnulOlX4sr+b22v zD=9eI?HC+;F26Wrff>Q?$x(QP&uDu)Cp7{L5`(Q_rVL2ss2oKCDp;mlxqV;r8@ ztY|dr-CAR)+uc3DlsF~S3^UVQeo-ewjXN-DrTvER`Jhmt3rLi}bBw!`|sp=1CFWSW6>$YP�B#t`+ zUp<@MBUaQy#Tkp{I|&0kblr;ATlTh7JWkAGO_4NY{p|W4!rTma zaNcl@gP7QL+t}l^cJ`XqhvLf%IMfIpNeasj!@4YUm2<)RXX`~OPP2A;naR3ww6#Z^ z>Nhr1T)nN5$c8iX5PC55&uX4u5>I4)$pplKg=QoZjC%I3Qnc{rhOA+h+8EOE_0GmD z8-G0KAmE&Ku2S#ex@z~&E{Q56ksMD1xg3G~Bo6-o&b6(VR#EpI%<1FlZ6#!3=~i0S zt9U=Nrxy|w4i|yJ$;N$iQpKs>+a=|WqSCT1e1ZuQQJJ%nd?6g z7gO*&ei;YOy@F*3P<-EJMci^g;Df>ErA~DPwD5kB94uy@NW8BpUmIkOLm_Mqrwls! z)Y6KDZ{re7l%P7!sjBF&zh>Cb>@-d_dNG zNF&rPt~MJ-Q4PFJ@)8em-yQRwE6eo8*6%LA(XIT+0qDb$LE!yryjmuqJg+DwKO~iK ze}(xO$6^g|N~F?i=VdGk+$IPVo6c#Gr$zKH!{xzmlFp- z+@|E}I&q&$=%7WC);lSz{QIE8bcIF8l9GEK z{WZ1sh~QZ~zu$xs&jKz$b{u5-A4=WQ^wy6{x@(=b_ez9Y>;+mm6AYvrj2!WvqOen3 zy3^s0`)1^$#TX3GrVdembXW{`Gp#eouXg4(AFJfT-?mpa$LCIGR?d9ir+Tj$-w75&svkjc3Pg5bS{3*Zmn(x z(9r@KFn;eD=a1)JZLfH*NU>-w^!vTn63Hx$GO#DPA1g2m*mdp2The|c_>aYUw$!?~ zyt1-|qx^gk48cY4ODtH%<; zt`^C+3AUo(5&*_deQS@@2A4kDD{I7Jf0{|7+v4^nBCkW-7y;#QY?hvfr0ZA!Rw09 z)HFD6tUlcfsTNl1e702qqzrPW7|$NL>yFja>5$mzo)?eAGCEo<(y~Q`%RGucU>E{X zxZvb*kz3G(pqD{TqEfxJ*zIg>yfiepMw>p%fU<{KP!HcuL1rZP88{w*3LnGvH$EL* zD$YpvSozH)>g2P$qa+?N$OHLT&NnbE&6{7?-ArJLedZP*lH42@11GPwdM>qdU^I&@ zTGsWn*h;4K4$ryJVC6v@nBxPbb$eK--X?VL(sI1nov6SrGy`L;m$|!K7^7mKEIB+J zC@V}oBNoqG^=@SBN5(CJfk9}$>m+c0#n>z z40ge*RUBdJaO0A)x#U+`9nXU9ZLgko?8ORUcYz0J!6)8{b9Y`8vV z-VR%g41vH0HQ+xGG&3FKSFb0PG<$FpgS!I-y8i%?TGWptvC~SksTF<89v<-1-&}}p z7{?NvussgmiawxXrSQ~n>H6g8gqfwdWde34I7#Dp2Y>+Yjxkf{8vMpM?EnTrB8GF* z2LmRt{7%r@YL^ zZ=D*P1{qVqBOsn}TvWEvUf!GMY{L^DHIE=U=O00e<$tx|^Py!%0zsBz*N;zX(fbCk z4ZQk>ohbVRga-_GEPDPmO1x9ColFa;tjVUowrx{vBXaD+wlKR}xX7;O!rI$t;^yMr z{I!u5G;ZkX;nnlok&5E9sDHFA%y$dO#CgC0dyai;y^F(k7y3N##WJnS#htu@WF2vi zIP3MU`WUGtc%y>0RZjMsI|#4tb-hkKSM7nX=8>h6=2ii`!Nx~S4_~c$*TnsQ#=5_Y zG>;8w?AxYB_fdSBbLSj_6O3kZ2lYgvr&INt{&RVZz4cT6;&P6ApFE&d)C*5 zqmx6s^X{(ZxxQA~zG>VL0l)z9k3T*L~Z2FVSMa8CmScCAfw z#CO{CAK58kCEN-Cc9-Vwl0iHJ{Hu3G(XTG7Ru2!^J-yuDE6HrWbFzVeyN(bZPw^k6 zV})3pY^_2K{El416N1a5&5ElSCEc&c#qjo(WA+z)UhS{aCoK#l;X<$7TpkJQ*FCG2 zvq`k?5nM|QEMaMYSkVF~EZ;JL_f&h=wOV)=#5y3h)AiT|q%#pJJkp1e*+|A!a5|3l z>|O@F(7ZKt*P6AYSKeFh4LSz@0DGY7dlQ^jy$&A5y=!~6>D2j(oPCx-`#dV=zg?I4 z{s)NsPt~=T@Z2-#8cgw&RT9q_;N)e=0|el3G4<_V3u>Mt)~+thdadO0D)d)&Wyfv_ z#eTf}Q`PjlEe;PBS;9WUsskLh#OGrXk&)OQN3rBr=PVxyHE$N{_d3noX{KnNYsj+Q zFo~a#aFOSE&g_GLxae!l;tadkQ-q-_x4P@{%X#@3SA-=@2}Yx*83 zW#NAiYp>^Nwyx;yg=4@cuO7dJcRn5XH>~TIOC8PBHc<{{k=2|;GlEzs;|JHZeL_4f zsI9#EMVvy`CxKvxc`+h`)qz}}Vmj?L+t~PP!~O%(C zg$O^1M*{;D!sz-2qhaEo?C%xG+Fp#(R&o8FF)iNaXYw{B3xTMe$$!BqA8JX)R&8nOz};3o4^yX&7eZfF$xpYtwD~ z8>ecX8@koJS#@<|CY81r<%L%uZrsS}kaE3!3F%x4l-<{3z7nTRDPMBEhMVD^0AJ`D z$B3l3nPv_4%tow{$r%dj2Jqq0y5(?qAQ4$G>pG{!ZyZN?VJoa!e4A}vB-!MmHdV@x z;yB4T>rraHA)eaW#tUnEeNpYV2_8h>B<}0ABz4Z=#xcm`cNMkp$4JxXzLxgQWRFz1 zx0XmP<8u;uvHZndf%%!R+fd_>0qQG~acW8o+9_*Ut!<&{_w!h3dNuZgc=BIg-QI08 zMv9vzQ<)p6I}S!LG1rRmuM}yzO|`|iCgSGRSsrjuovzG&LV5Mzk6xAT(`nuwi^Q5f zsp2hR;JDgmyN%FDs;Ed(%pBymAb>J4(>2w}<39#iDZTK-QmC2aYuIkj?j4;*21zcU zV~z(vIj>SpINH}dc~+Dq%^s)5+U|*|_$yejyR?i=6wBwuw3$((Z@bif7&X~nUs`yO z>9<XTp(xK#4YI%5QO z_46wa5y9bK7-<^pHi>-Bu*-LAG(siw%7WxCATCZp#xu}Y4Moe-L)ODf+CfzNNUe8v z)>@5~q?%e;D-YeDEapVca@(>_Ph;A=%f!AJxLtDS=_wt|CC*wg@&k`K!EE(4ID7C9^O;2==la5Gk5_;+Pvqh8!xUqLL_Y;Xz)^4kj# zr#uo5<5w&ilzfe__@^yevpyfRhg`FUK>q+FQSKa`6rQ*hH;3(~7c!$Dn0=Y&P| zUD(Jx5&`19OT~U0m+bSdiy@dq;IK}9T=y9LYshs)zP3-?5I5xEGBM8}obz5qXxl`4 z7;87F)M@@9*7Th)L!@6#Z6e05m3DqF+p0#JE_@Tbj=L5cQNN^Dj z268fZ1N>`|w6d}B4x0wAdgc=pK3tK&z&ikO(Dcr0hSRm%{TotvY!*nOE(k0Ko#f}J zY+z(}#w(7T6HiS|Ceyu-TQ-_MfqYUlo9NR}(q@aznJwIhk{LGu9aWc=#!9j0=xY7^ z8V~kxwASqHQ&f%- z6}6eRaq|G{9HS`VLBQRSoPHv^&kp=TpTa4kc#&=5y|>iSt(6tCDoMYX^v>3XnrcwQ$oG5p5jYonO5Q@ zwppTNC7aGb**;*~z{n$}E9&DViiM_pi~j&+sM^!|*!d5}*Sda+>!jV-!!*8T`QsbX zOL-%5Hip0rxO0(^YlK@(2Kos#Yen+z<4nsNo(ThzKD}%2KZyST4fG!oXy4jCC5<7x zw<{r%*}h;O3RE@-bp(!mvN2yc_|M>$v!zSELW5MlhXOd8s(KD9GAx25h^sH?{DM#<(Br+1GKj*D)%YCb8Gs_fj zBn~jI8!22c^#-|%i|eVw`P{R<_F?L2a_J?tWTb1E<(0DTT|RiKfrzIlG>?Nnx5wzq)V5<-cWIQ%Q0ndN3ITbiEsc4jRG zQF?LSvV$`FniN>hio*6mACo%edpB`cS%UJXIXS_sNbmMU5FjLaiep|G8yo}NnhNDR ztv2EZxJY14Nj?`^F{V;#zrK_&A=?jKjTlC?95#ov(fww@lV8_4%RGhnp1NHkaSol z0hA$xD8;uKdlOKyv9A&$=3jTlHRluBcyixEhD}o1 zMV>Jl`HFGobM@yVKbKnb3yFc0%WTY}e&t=nmG>2NF%7>WE8+QFx}R8hgT;EB0$nRx zu=8430ERev26MEA#zUiHkPbl=;hN5oY&A5ywSp+#-Z_|iI5{~T1#?<|_J@M+ z*8)P1!;9!tQ<2A_nW}8}_O7T9__<5-KhvE~ijF(YdYW_!+Xt`9# zPzMJaSUhBc0{~lt&rc2b-QXKv3(x(hrAIZr<-N?&%e@Z7@?ucx(YMTmKT-E~o;n(r zz!6;7>l%d861MtVTWV2B26JdbKb8C93gulF<$QuqIl-%!UOdw-q}9A9tXjUKZxH)f zM_sy+c8fdw!b+2qm&&j`anRR^iKM9~En8i>`5lz%&QFy+8Q@+Q_>tmWLt3}9)b1oO zm_Eq1u@aE^c`eEV^8#3toaa8ASDI_Kw&-Vv?0;jvf?}c2oHBxP$0YUk#d?>-J4;(l zcTU!{ONeb%E#Q>AYvrG`BxqSesOnp%W67>3#`o6tT9vC^Ol7&awOQ{Y$Yxn&B#^{^ z5&Og*Mrv^Gnwn5nzvyj0gO&6#EiJSyPU6PKNm|*9fpaXUG5o|~h6drZXCs{UuW#`U zvGCuA;n8DFKUB9^-r^gjkIjvgav2l@-YjaESZndP3 zD&73piWCt{H=^$9Ks^n5(UhXJIK7%@U8c^mN#|)x9kh%j-4u=TfB_|galplU{{X@L zYsFp@v;NMPPyH1BvmaNVYafd;DR|I`eKx^I$8A(tGno~et~FS zC(|zl_LcD(3!8^|h0T#J?jMguNej|A5_+1N~Iz2+>JvvKxB$EN4R1Bg`#2l0@pP(L< z&U|pW)O8yT4(jtvT_NI##$r;XBq!!($O9y?W79nM>srEUNXkj4W2L!I5BPT0&c{l* zxA6_V-kQc^YZH9364@J@0IG0H92|BX`1A1^3mM{q<3fVun3gH!hE_tmeo#)}$_^K* zkO-_jE8?2Nq1*U-P>7^Zqeld>9i=y59D~j{=bU?0Z9~Kw6xKGg@nvtoh~^zAY@?s9`$m{Tf2KnX0)8f z8|3nOmr=_x9e@MVuS)EVma$~0_b0H`b*(HxeFW26l{-T#5y9kx>JO(%^o>)-9wgK> z#<=@)P7nfLYVHRdbAWN}(>3SmWp}Aqq!2P;m_FBVr21ng6|WYPC8nIv$#suA8)H_^ zTeu_G(JBy>l$uu;HI_g#PDAoHMI9|xiKG+^VH*>E0NJ)lT)3prE6GSgDMH!pcnuRp+Px5 z;}x%`Yr3wJe;uP+te|dD6v@3vZVudogWM7Iu3D1!v^9!pYE}OLgmEm?UWg=;H6-LA zIX!WnmFap%fo(O5yK9K2lFCb|QYA)=lG8{s2MxmDWSkHOTIc@&;Vbc0st%vwWM%R} zk>IvNCPIA0m^f^omn8ds6j}I-#GV^#%byg(A(K*!x~!??yXQYL-~a#w=Z<=P6O~u5 z>K2a3-}t5Q&R+?bzR!JYcW}s3OM7+?Bwg>qLtIp{$(8>yD*nfh)$xveXa8bGW_ z-NN8!Cyu@GUDC5Ljmm9vGrMj(gB-Sb&oyo_5nYmC0CUo)zS9sm#yj_>BFgLzNMGk! zU$I8rjr{s`(%f4+uG7xOC`jpoN3Ckbsoz@baOx|F-Zuw>p7}j~wa?o{y_go`8L3c0*M$6Fblan8bzqu}mE!==N=D^o z<8n7+lh3Vr)wZWB9$*CGUK>3>&MH`L8+cR1dS%tz z7YlDOEdY>^!c6r|q+ypoFKptyPvb3({+ps{{vp$(x$~~47S}g741CD20|Z=>2s>Du z5;OI$67e6!9aqIVZkJ`NN+)e7p@wHwSq?g@5!HP&$gKA9f_RP*rfQRwRDH;+k^yXF zkEsJSwM=AHxlzQhGJ4e9<-A8`7U*3601V1T?YITG&rUxI<}JT@BHKG{kA6w?Ju9>E zo}mmah!Ah6~Mz~Y=HL_i%&5$HOBRg0nd@$H&v znWP?AIVYtg!K19wWwO43qQ8w%5rzoBAOKHO$ox9jv+0lEfuecZwZMXFayG^Yb(8z5 z00FvVl0XO6zI3!(TSD^PZY|1`Jm=D{^IeXF$N{)u8Hi9+fI%Za$W)j5g4!zETT2l{05c%@+dtlJ z=bFO0bth=BQ{`Ht)-`L-3)zIyb%um5mUAAMk;oK|05TE*!N*R3*N%9i^4{X%O^mZL zrcjAnILAyJ^T)MkJ>KWb?O?nq&Tu;WRvxE3o^X_98HVoI&VR4HZHJ}FEm@rB%(Oxl5D^(cO~hRObMmK?9xzYf_@WERhh6^*Z_dd$0JW<~t~0fi9+PqD1}Pey1To z_chDw(Q6td+)!R!MQ~h)DFlK=Q~lG9DmJpuuJsk3{Q_kF000WTyACL$Cw)aY>7iQ2 z2=3ZMedsaUt#=8gN2c4ysI&)$ZpJE|_dDAk6nKVPrqvx|OK77gsemFy=PIfQ z&t7YW@gItH4PIBa8zO;Ua>WwtO!VLm{{ULb^7S)rZZrF(`AZ&|VVq!}N}z3=Ae@jp z=RBInonGbp6isCf&BKN`jTfsi>;5&=Tqjg@t7SncZFhJOn4?NgfR*&P>!wKsHVCV?+6ZY8#o(riZ1yZxPz z;0*k@+(tMjIj8uF{{T+Wd_5dSK+5H$x3-DEem+&-jzGX9o~>RZb*W!{rb95~eFQoZ$AWI!(Wa^*<3k&D_#iX_hIAWG;c&CIKHgAi2pn9qW$NWk{od z+D1erKq|}&`;m+g4Bn%mVYtZ~nbsE49-I+WMZ4uTP};X=kR-GDmcG z+!A-nqoRUN0Y6TaPAeM;B8EE^H!U0C*`H(d>9mYvJ?l46u#-uSGc0~-Kvmow;7QmX zdVaN@d`qZ{IQ08z1PLP+VH)6)!)YY)-9IXYR-<0)HTH17yn3T*7kYJ0omI_&%p9-nTPKWZ_oayefzKsPoQb^~=7$Kp+EPNbFjwK1y*rF22!dyA;F`$lcD zZcZc^+@PF++XtTA>V}fmx0aIJTVgqvA%l~Ut=AoTn$6X9X*HXtwbM|($Kh0AK+Xkd zY4E0>bL2~L9BQOAk+9w76OWK!5$nmtXq!sJY0746Qi&O^N=p!RMO0vUWxyw%qrVlO zrrUzE-P|b<`FUfI7;PYYx%WKP+w(EgWl6u~tinrj#4`k3BmyU7((A>UYcYZBf*XxcQI1Mk;@{4PN2zbrmR3 z?v5zV6K~>41moW|%_^XsR~t~V9C}vnQWN{O5Lpa2X>VbLm*`EzH*sBg?!i z;AC*zLF)?Hn8qxb>ucV$vzut*z13RYIx2A20D9=RN7yZD5PD z%42X;FG?0Dc0m( zJgkowAjomZ=qpYDmN#(RTm14bC2^75VZEx}yzi+&1YSUncgr&X0b-zY$E`c7lHR5@ z)~%_Srnk2Yi6+*SLuGS}gN~eb^sEK*Jl2g_$r$Kx2d_%(t@L~8?SYaaV+cbW73Eaz zB#yYO-6|6e*o?p?FT-x^4;*K>?MnR+?cCAEtM*9XmD!Z3a9M#Ik77qPQVR>q!@2gC z>$vnj)u&^p>H_lQAC}o5Gi=5I1B?;;Ij*23jlG*|dW(o-WFABa0cQ$!=K%4N54}>3 zmqgsc)AT#rg0kAS!x2@|ZM(*xy(KLBMfW$~L2t4t~&(g3PRKL|- zmfg%dnC(?KBRqeHdi7}hKfA-0(7JuDec=ee+|Jyw+9s)KjU-)z2uOUARlR z1b@9r+YW#ZK;pelU2@OEIt(^C8QF8HLyM_1v&&fsVvDr%?#Hj7#d)p&0EP{P^kxSk zN0*y}BIw{Vs+%F0?`%<3{!X9paP-34CpMc9K@DW=aR z*w}5CZo>YIN2$(gUk~XTW7`|6reM&xAwurYq3c+hhO2LJDT`=lVsnl#2T#JVaJ;Y3 zigh`3Whu28bqlpw-JQ?NxP$hS>oGej}4rt<~m2s~X5T$y0&{txXM`+^y%N zn-R$e8RMTy*Rq0LIynNN$sm&chps=JR>aunVu}9JiZ=xq1zY@@+j~}tKyo(cASuB) z^{$FtDtnzRwR=U4-rdzDP~(41!{zknuhy`n*?h`mKV^(zNn@UUXuZRz=#u6%&7lgQ z=XO4A-MOvpG3It@uGyO$aHl+a_xx&+7P?*ISxk}5wN#dJb`_C$^gaD+)ATP58%ww~ zTU&s1$X2JaQC~o;`8vO4ryNlHB4YoX!kTMas6~G6*BvuQhV=#%)5~LdWEY zlyN0d~w*H2H*QxU8rpw{20SX9ZEdT=Xm3IISD&c_3jiKz!H1 zIXguYG>wMk+LHc!o*=eIvf^e+kcQXND!&B;+39FzxX3fcAaHA*e}sEO85 zS7#$U6UNAgVtS|<=kcl&+`O&?r*K2n1~~e3uT9nTeGc1jisR-&K~^C026!X3JM&(7 zZ8fKta3qm=e~@5*I*CQ6%FCxxGgpa`=E*S;BXByF>`(Ys%tGO93{mZtCdea_Vmx}0u;AboHf;a?r$KhN)u`!xR z=7~a=IFKrUpnW=L+Pa%POGt!B?;;}z$4)+VP&4&4>e6tJ#Ce#AIV}plG0`-8?PA+f zwZAaw=$Tk!Ld^py&eUE9B|lgfJ(3I>iRHStH!LE&YeH3JgeVv(xCY#LG&;1S zE5)3Zu$8JqlIPN24D>1QbXojSsKGCpc#Hu+07&Fh+#EJk=bnbDYnFEx34f-gtQ#Yd zJc;J{W?-RybFD>+g9ieFK;w`ke+5u2Pmd1XS&_Ux%xZ{z_L3Jv# zHr>SaTo9+%1n1tnAz3|77On#k8kZdwk$onGt6F(*i)kCo4nFuLHjo&0IOE>Ai8Xy| z!FnVbHlJ*npDdGY$t#n%^Vd1YPSp53acw@XlHNbrwB;yGuN;+J9#2f1n#2Cw(Qf3r z)LQK(k&K1}=&CSqFn#L^*ve_x_Hejrw*BVEQQ^hY;PDJL@!!d7cw!Py=EsQHpDf5Q zPi~pVCb0Z@t!ma{NNuD^?HXAkz!}8A zh-~GulH*{N)zod=%*59$E4q@hS7%J{iu~-h_wox>j!n#xDzB&*?^wEo8s?{{HlsK! z%oUbEFd1V3M@}*T1J=DD_%~a%isIkIR?^0nij1-t$_7$0ImS4wEe7a7*D<_*Xw%sm zJii7uVUSez!LIt4IYnM-#L=w@d=BOovm4#ro6C&1mlS(fvnWt;^fbDTiFUS&EKwM@ z#0gM$U}te7pH4Wg%U`szxV4FF3aNP#0@4fsy~#eq8L6*y=JPJJts_#lycSWSZdb{Z zfw-y04mww#IH>53u2{*do?m-;6~tDJINl>tyZ-=*xxogy9V)|3x{mV3;xE4#SRDTV z%QpV->Pk{aB-g5t9oXWs$BVZX?eUvGEiq9LyF~-yVTkd zNm(AX;E#vVUR^!j)R|(q3mk2bPB3{n0~kElL-Auly^={}X(E;jc<~s73@B01V0P(V zdj3AX(c*_pu(aC3aU(i{>JzGy*NUg;bd`1 z)Qs--K6KK2O{d4CTV2nzy^|17zA^|Mv5;~)^sCpNEKO5Qi0See=XR4S56vD%G3n1= zrE`8J@FW&Dw|6i}w%#&!fzQpmmE+T`VCZ&>=eovAU~bPq2;=eV&2vr?O2+V%ZeNZ~ zLK$Rrm5%ix^4y;1KGiOnYpGr|)7!$*h8tOc7*UbQJpeVmr1);*q_=G+zno-W`taDAwU(nPZAIJLEz#Or3Bx`ry<<3n{zHVx@>nNT2`L z{P@)LW$^Ku?@69X5@jv+a&r^AG2{SvZJ<`)!<%~zTE*L1$ZMBjZy+UHWA5;NTod|? zcdj1(DK!X<&X)zL1{8t^UdFvH+u_T>rEa^via)c(fXzPD4 z$m_Qal1p*M!^puM@m_zd_;Xmc61DxROeU3J7bx46j^YCYlY(*AjEe7WAozc4d8TPr z6T=7W%i9{1W9jnVQ4j<4}G zqP3pu?K5evBlCAk>bd!F211TFIjkKo!`B+NqY=5ib-B1M4k2ZYRx-Ic=*0BnxUTBa zZ?veSxGx$j#!8$8Vx;uJ7{L{K%JARm(plRn`&GIZ3;bdlLyk)D70)%1)O+KrBr zb!DuoNh>OW8<6bn*Es8u>s*b_k}d4~iwI+ZVPa*4{_}}>-N`M-PfAn5s=797LmSAQ z_dHIfV+!!10)*uOJ4!n zT50R5Tt)t+Vrz+G%Pebf+d*zf9Q`=vuU~ja;q2BzUkf*bg?-aV}$R#R~!RFzPZfUGA4Ag>`XhYpF&R=77S<1Yt@RC*@whQhQeQ%<$-! z66rdX$(9#lfMh(I5P_K&jFJxr+Py3W8WE3~#f{8r%Bo3e+qvZaAG5nlh-bTz<%Qg2 zkG<2e^%dTDn%++c>6Y5DP0gq|Rg`k9IbzL&oa2h;rxHmc{{UgZB#_5);uLZ7Fge;d z?ngN5U9J6+UFq68-#m9IDz}|w6O$}V;}~#82JYA=71b@Qj(kN;Q<>r(C$Mc|;Obgx zt<>sdBZSzhT^R?yi9r;aZzrVF)QdKSm<;N$bJbnzSLUkbxn z$rP7Ot2AcNfUWjTpl|uNWq}WjanstkKM?BL?}s6uL%y`Pmertm#L`EZ0!jeMWx;MR zK=m1~B6iiIqYqkAR!7c}Xxhe$8fw~1X(X7D9#+F($fZhzJ@%9Q>!I+^hV_db5&Tba zX#W6Vj${br5DVv$ppTp1ur=x54758>8{f;}i+5zZpL0O+48&G7C9}`Uc;dQ`9&5fV z@cxl6g>{Qae#pB#gqf7d8n7FJ1wVASBo3p!V^u;l`TCxZ*Cy(!5Z>zko=1vW`0?#E zL#Z{Y&aEQh2*&NB<^(PevBo~Ng{o^>rlF}#ccFjrIzu=W7DH5;|NMA#uQ^Glb$~c@OfKyNcYu}xkEwm750^=#U;r5SouT5 z2^)}{mB3%OCgR(4*ya1WvUsvSbtSccl>MKUxIg%haG7bgIpZPnQb&Kf1T#a1z@)VZ2# zv+hG8X|dXf;qxV!6Nw$Z@XsGFYL?H;VHL7l7P`sYLlRDTQllJkS3ES6iJ2A!aA3NcgXVR_1;k{E)&}XtFnB{_4!jvS&RAGqQ zgTdrhbdW`%!E<@xT||>A1-LSNpuTcg0nnU&bwB(h^5~XuYU1=0H{L7G=I`>3-nH&S zmN56WJgU6Xm%4oFz7y82zSnTJ?;>gAeZUHGsyNS1hqYhQyh|Q|sN3p(9G+-zBEtOR zK4?5)hblnyJP}>LiF|vlYHM*NgME(P?myou40(k}&T-p3<2B}%x_+A_g!4^siE+I= zrEanZ2PJ!aq+s{tSIkwipSbouiWihGQ5v`Ug{{QxB$q|5Zhv~lCE9_c<$)LgZ9HHM zdU09O%cxpg!3#pE^BGcX5i6@O1gI)@34UFd2{bDMY8xrn6 znN^VED&U-{9E@hPbe|PpX#OC(wVv+cO)ahERsfxnI3FO-%0h-cLCytsQpCwY^*s9Y zBPpj7M^Etfr*#+DZLhqj9i6G6a-@O57;~6QpgPe}MXYsFY(tHzfbEeO#Sk8r@hjIiU79V(r z9;2G`9U#l6Ew-t@h7_MD>fyUD7C?teb3za9i z#%qfW2C1RKG}(xcO`buto)Ah&z&%eORvqVr{Cja?b?vekAyDF2NI!c$d-0BVuDCfi zr4xp{VJNuNX&u*zbpxwfHmwxVs`;cUmBXA4dUM~>w>&X5jfRT4iMN?At}}0J*55Ak zjF9X;ZvLE)rF`t(BG+0!BIOK?3HhG{FvqB`qx=Q0U+CI0+-i_V_IG5KIUPe3Abg}} zr(WFE`$;Esan-|nI2yBA_>kK9*A~$ykObaq{LBt;ao6TOaaq1C@gIh#@SJv+R(^f^ zmQ|2Q1BM*$V}p=0(~Q^AejC>`U3Le3Rz1lO6NZccuC6&o>DM2Ha^Dg>1>lWoB7Gjt zOAGa0P!c0$BXA^q*kTCjfnLOubbZa=bIZfysrz0^>elW0pCstsD}%$vd32jKn(9ba zIOMtuBEb3i-B%bV94>luT@IhD+R5QNx$msvxWBr)NRn31?%>8`JAUXnzz44<0*!0H zCri{2nB|f+UCtGG1J{l*_}621;lB@Q{us8^QWlYCj4aBzM#(&e0Q0mA{{UL$!_uo1 z+>chhd^?im-JU-!y|kBx)qsX3aPf1K<>v$sTp!B4a$P^eS_X{;)HbH@xj8Oaq=VN3 z1A|;=iLEUy>@DNcm?N3vc-fb87_dRudgL$wis|%-mf{4nOF8C-B`gfiLIQEPfIjX| zTvLxKZsyJNB>EiRh_!tp;>C3*gj+d~0~AfQPS7w|56ZG{e05@wr1lEJOc29%3IWb~ z9xHdoHl7>4vRLdxLn5IiNX}StIXy;dZ-agV(R@R$Nps=|jG_ouMUDRM+Q{dar6J2O&IccO# zO<7`>gR>+n0IGL4`y*%->3$#hTXA{?w9);UQT*91u2i(=J@#ZOk4p7~TOB^y7tu()`sVqdhEp2za`f8z#Yj;iTk z*RiMNtgY+*NRLVQb>RDUK`w4pc@o`ok~^yKgV=y8()9aFeSvh?RwP5jth^97SL_c0DsCV9x??vafCg0-dA5!|JwA1bV|sm|Q`pHEI}>gnNQPAU{* zW#zH)lg6sEb@5WWdfnZ&p4Pt0(DUz(J|EQe{T|9~7766L(~H~*(2c4FK2o{K$sIj2 z_;?KJG?maX)P^L@V? z`m*e?>i#Z<+fLH&lHM36^AQ%557YVm_QbK{W zHhAgn=`i?r!g_9_HoJeQ+%^5&Ch?4M`SMD#;}N=zsui=3<~mjF8%wj-e$%LEvH3cD zQ;UR#LR6Pn(Lq!Ji(>?wSDj9;GPI9s$`a;E=aA?&T276srJLBn_Oe@HMJU9^GOwIu zZt0QUo8lcuQ@MyqZzR%7dvhJX*^)sDd5Ms%f^yuP4nR00^sf5K=Ic|I>F2ewvbTy^ z714ngQ?obCgT~NYmg9gw3h6Y)@P~%wg}gy`YaFPeMu?A`!!X=DvU&Th*Zbd%YL`-~ z)JJ*tXkOLuTuLW|vE3ZPpe7 z<<$d1cHu~N8-T#)cdcW}o7C*1QgDU0kD2ZI4}m@sc+*6YAh(w5RMg>DhEphsJlPNw zPnQ53kQflelbnkABT}*PKf~>Ie+cSPTt#iD&w}rleX$$_I5^IF9&^{4_A7r1T(!=D zHkEUGX(hVJ9lJ!u;J0KTt2RFF)3+y#^{-pE)2$KSFCWZX#5XW2Lcv2Se8q{$A3kuW zjzLlY$gO8CjKWZKr_BB3*!jD_`ZdH_h5n(Z%l2JT3yBTAyt}a}4A}r+uH@hyz;*m9 z&~1Jb-(Ds5v8d@$A&`W;x5z`Wc9nRYvZ!)HZ~*>82G>s1w0(C`@qUE=0BDv-=9DS> z?8pFT&OrI_ay|X4*0l|1#CP5q)US1>hSPnF+figQw1JKhc7wDLz&$vu=UOf{wb|Pl z$~!wIe5rG54EJ{PSzSwLmUl)wrOs6q0|WAeQ1IQ|{giOtL2RWp5>;0$N~kClf)z3Y=Q!)g&3yf@ zc;`^itnBowX%=gHL@jO@2J+>0bGch++S^zIw2}JPCL*Hb;-z8gi&{c^!JcimqJ+WRP{{RVJgRO7cX*4UTW7A2JcO)+4ECPcQV=KF< z&Uxv;tQ!q`$DSzD#+GHDV@f>viyhw~Boax^)gP#@XotYFc$2^v%?{~qZDbg^B$CiZ z13HuZN*Qy5o@>Z)bCsFtHj>oy8~tCyo+i{Ut-KGXEsyrSuE&Q4KPjU*Srl$%EWrH0 zbipIvfKLzWIwy)OZgqIR&L&uy{Ef5z;gkYEB(6x$%1FnxdryUjgghx`y5^u!bvUFj z+N@EQb0YPT#_*w6aLM)PDqU~I$*RKlR~}Q#ExSP!_$DB~b=8@evYns+GlA%H%|2dT ziG-Y8md3Y?^^1QAE#`}(H{0ywSf!3ufkU)%s9=wPLE26U95Jt$?r+xRZ*C%uB9eD2 zBt>@QpYDJ-9P}05U)*?%+v%@y1o0%%vd1pgFkCIUEDGm_10h%%6R5`Z2<5;A&Fm3cGw97j!UTaQPR{KP5e)uPheh2fdJ#WPt-i@Y> z8r@75GfbCzN-pieN`f03fWbTij&q9d{v>P47frO&(l&%`Tc(aY0>A>tEtUb>amP-T z!fRJHdbRJ^ER_sW7~_5Xe8&yBTd~2ec|sLzn4B0^v zwwrQif++^}c*6Y18?VgcJaLonS!@3Q6$YrbdM&)GZ>U0%-76K@9HTfY-kBM}=DbPa zlBnXev%jJ1!b(X^>PxBWVkPrT5j?Pd>2DAn;h9t^W=v$J0Zg8~bJD%<;RW}K?5^R{ zb!1uMvbamJeJi_>Z+46}sBEs+U_%f$b;mW}a(ENPz7Ny&Tb)|cL8om<l$O z*U(>UmzuEA()!XUrjyFGw78oROB?;!Vnoh6cO+E|#dcsp}JeP3qW{qPYWgCVC7+{0fuNCxE?eR0`ojo~H z(_)W`JUQWSi@pz&#aeZ@k#lP3*K(l(SR!E9EQ9Z<`eYvU@?VVn4XOA%$2Hm(wwxA% zeWVFSNFVwM{Hy4FAI5(VVb>0;Yh!U?cXEuT8x~mY*_K1b^nf9AjE)<4gvDD#^g1yH=Jw;<_ z`fiLQI+g^p4D3D^EvDu7TcWXk&4Tb79_SY^{-{p z{5&;*D71n}A%q24m2((yGE;ZA13fvctDgxr*%-P-B!4p`od!lg$jHrGr6f#o5N^ko zvbv_=r$6IWwu8qby>$1M(m^kj`%065%6Q_SxYGQz69NeJ2C=!*%yVoG>?VN%JVc}DS=-$->Mn*C*`ci9AC)FF*+WX(yL2dJX=nh-jwk_?VNfzuj$y6%@d;x+o z4?G;#1mNTZ*lk9JF(ksO@F|p)F<^hwA zqju18y$Gf?LMB^uN@yT6S_j_*_{5g_q%Uwj> z=~vQ5@t-7_AiBf+sVbeh8-Iu&@U9QyHo0r0__|LLcwXnvh9tLDxRZ%wA|;K`CI%63 zK+iZm`qz=o1;xZ~acLBjvI0H2l_A z+T5HR=dLlHD;aHVA)TyYxbqM(Y=Mq;i(ax-E6jip=rHB~Y=0nCSQaiQV_lN-G zbKlytrO|F6#(5s+9VsNSx>*IeD6B%T`GFrW$mDUHepQ?0E)r{0de?;fb#(HLpdbNk?HMSFZN}$`jn{*%N$$SMC22=XN=>4#dHbbCcZ0aX(st(%SL6w zsZcpPvt1PAqO4-o^*rRrQ;g&uzO}ie-eTbkjmSRsMn(@DimWu5q(_l)@-_%O9w>sw z?h-;q!*{o>YT6ZE4(UJBeDvnMML-^9)>bk5FV(BDDId7a5&U%ra)ZIs86;0o9 zw*LTYvqzSA*KGd)DzglcSgkpNVpj}v-=U%J=Xm_R#IAA_^v|tSGH&C)b4e$=H%T2< zm33o0>lUB_h9!%ZD!3hnJD!5Q^Gtt+_xhE!)t0S)rCvg+$kIU^&=NQx;g4MNk&IW% zO2?7MwM`x5kg#ajp$Csj=dFhJn@OWc)a83z`hLl$@Rh~Zv*DZHwh3lsoh;0;fs7U0 z>H_sV0oy*c;T|aQ9=YNzPD`C~=1J#|F@Y&0qUSqCdI6r5l@`0G+Q8AL@VxpH*ZEdWnnpSr8fr;0ghd;@_&=3Xx>-Epjhvyu z{3~MBlHEbK8{`X|it5%|X?`7Ev~VL|#eEXbBQMUduyU>RELb1IJ*uhMz07M%mf9Y2 z&WgBUlkG_qGRStTY{zp|?c~c9agsV_wqT6S9>gFX{BurP6q!fKXJfg^z{?+MvNZXS ziEW(V@(+61j>&E9<(lj$P>1CwJH0VX(q?-m46;edB$5MU zn)PfP^2iyqya(^1e zPUfQL19*G69+d6C=Z~dkG2UU%9=YO_I}y(mnAp394)4#3jC1Wt zpezT-$>W?6R4uhska^7{Z3}MmG6)=cP^DowUsBU9GBcCbwDi4NZ6W;2a2cDaBP4#ED-tuf zZhoKAi6jo#U-OEkK8%@D>}lP2g8Je@B`ijFb^iDN09vXo$~xm{JmhAx*%`7>^O3E=D=$)BI?Rk|I#h(-O3V?&Dze#Y1vc(Ydk!QR5!>spPv5QN|#lz)${B>KhO!UmA38R_azbDFYjVp!yzQ0Ey64i$0! zdR9>oI38zlp18rQlUo@iKkZjd3PBq)plslt272I9?q)kndk$~~KHl2qRSbj#DH=Q z!zJALi{;$h6VMFzJ*o3O(3)Ev6YEzKY2Rdt6;Llb7v?xVwL;eR=0_Hmr)+LH7{|&! zW61ZeirY%Fon*C=# zRZhwc7iK_*FZq+>mXde=j(kFwcW#~YBT2`s!ngjB%)~xwsA5;c_}eQHlWIadK`7ZHQU?hc3KVF{i9M#i55Na{g{$V5z&hQj2^ze zwaWhhYJa1uv)}}1!sD^3&|X5!QOgyWO2y+xvn==cv|*D z31*KwL1U8G<2}07t0R7O54FR$Vd0g|Fb}4BVwrmkR@ZKbJkS8aQV125NLkprRXLFf zf+(%Tk{lC*j^KYv>ohG!-qz&2aYXNdwnqT6jlAQ7`TJKIcip#?qXUH`@IM;dvW0E2 zCRA+Qo!tn9axg*KtAWqC#cXSLv0d7%_He-&$=YL32^jrr z9pUpfvBPiOjB}j*YJ%BZOw28qovL!Ic8^{uauVm%&AyPm+;=di@PJg~9Cj78q+8uj zbt~H8rx6kXz*Y4*=~bG-0}!4@c*3w(1D(F6x8=8+M~ld_ncZf5j1Wt71Dtb0rzvbH zRg8Bv?d>fz>r}VCc-rpqnV)Lps<6&7JD<{ zqiK4L#-SW>xH3ecfju_$%89IY~9Nv(PT=B?u>- zvAh6FN5Nit;2hVR3znWQBtA;=KiRKi9u4r_wVk!?_N%#M444@CR1dw6W6*ln4Xjys zV@%vMX{5WA@t2SQqn>a8r3#7YYs=KYiq>dVFJvr=&4A-41J@tQy+cOV^$+Y}5Sji^ z-y#8=9sq7f1ZOqpX8Q5$8qwrtTwp66J+M8gnrGTl2bKl}laiq2wt>mUI#rQUoMpM{ zeqHUPw%YZiEW70@M8G&!3y|YHbSD`-L9aXUIKR5o=e%o$x<`;XJas&C*mUV#3hHuP zBEvkBJTjt{SpHxbrh0S)XY#9dx;os(mX@JeCrpCaToQYlBPJ-pBc9Op3$?t82aC-{ z3lIcg4%z&NCc8ab!OL}dz43U@A86 zLC-xZgjW9mVVBF0fg-rCXSzlary z3!ugbB?uio{{Z^+=l&sky-NCNZ4ii*DPq_het!6<>tKx8&QEi9b#xy0E=j>7j@TV4 zX>205lW>_`8z7O`el@k>y)tc1T~i~&v|D%+Qwa=8=ZRLNylE*3Ppc!X7gI9Xk$OT zIQc_2U+}L)z0-9KHqvX!*<=&Pz9P&K^ZMIb)0y*a7QWdRCij93p#*mQ_4#3%irZ&m$Gq z={B~n`^%QfG266o2Rt`Q8!a;4onxlhSX*7qzht01nHc#`KnVlBbMIWO{{V+0)UM@Z z1|cR{UHC^*PS(yl*H_|%veNA1(r%2hMv@0cRoD*U!VbQq)>YN~vV^u~cvH(j&y0Z| zAxXx6N|@+pCih0JoAA@Yx_*+Hrm=H#dnBL~w@@NfxB&6S zGuVA=4ZKA9Nqack%z|Xw6G}0(ZO1E)Mt_x1wAMWPn|OXkhd7l`V6UqwJw0m|HuPq) zjg`@_dExlADZGsu(HI~u-#^S(umJb#>0EWyrN)NWOL1&5w8qi8kVft^)DT8x)QnuKHt&g1Xj(E>{>{OuR zvB>Jrn{oCY7t`%z`+wRc6M>XT6f&H1)bY(aDP>JW&mI_LnGwERf;xo&E-kFhT0ARBRTZ-qu8XcVY5UC}3K zM(2%loPog3GAp;W(4^69&46@Uq*YP~>cpInUuxLXv@K6YlGgK7P{_nifPnEywZ7?7 z>5rl5TuTh2@g9e^PvJT14HHt-?JcdW?qy4TL8TDkbG0LEDPW|5oZ#oBZNcHGd^9J9 z<&2lM!6vtqh4R~Q`IW&vuz0Ugy47_}7S*m+(mNY_rCB1I05dCs>;kXd3_-_CSB-e4 zS*9mfw4N*Les?00ULr;}FgQFO{VQ6EoN0TzoV?W?OG{&n@ywcK#k_M_#Fq1bR#sLy zkb%h{oC0&(iu3I*Ek&-Z(!vsCXHu+2@XV(m6+O7;*0!}7ME61_U{TZpK*$@q*R*K9 z0g89-F@0G#x%PX|ZYO6Q50Vm+-F1=RZv`{LJw zA4{7=p2zK>lgeh;vPQ_+0I>tH;PKYJDDkpcKDzdP9JdJzGKqYxs-q{UUI$M>UC)QF zqL%!^(yPgJ4DpEw2^+G4qa87p9-P;i+gi_~>o;<0G0J04GtQ7(8~p2QQ#uToOx z-JUjEgpC>V(`H7uYHTbZidjpck;GFfosPq=Jr7J8;q>VQH>T-kMcT}zdKLtZpH97N zzwvIf9-*Sy*g_OV1;maNbsO=Mk4)yg!|XuZZv>N*jC8^8UM?;VockO+zjvv%uWH_P z)x3_Pd2Q8#83`i?908u6<5@9kGikT8MP^+VV60H&4gL5&{V8s=8=KI|U1Rc?ZI}~) z!?6|BTiL_*oex&m?yW9uBDmWms&O+YWy(l^tJ&o$=Jh`z$|>h9LpC=cHSdB^$9dKae+BJ@1$E;e|Wdq)meds+D$j-#oz zp{?C$_pcO|@yj9?j{$lA0G5HeVAma^=vtt-l6x^E_A7AF#&-OSLG>P@vvnl5joM3V zfpNSXOaMMDm4ExwzVUjP|c5(!52e>V7M+i*%O} zB$C9Vs0$`|2h%t|TJ)_~Mbz%2OQeP=7Quv4Asm#+Bopmkl^Zpo&nk{9-rWDt{Qm&( z)}whYuO_GDNpERxKYTX=91g?kYu9y6H%+~;x4rXBtnryPo&ed#(X@3V)~Uy*>7d+ zaot?)5j1M=0mgIn?O!l>%TTnFS4m;C!bZbp)En2oQCBa#d3ASakXlV3EB?E2IBa(G zHCc5-d>ZJWMq~tS9AFOF&2!=_MoPz43kB@kl#YwRy8WhyadWBP#_i^|;Jus_D#5;> z{&ktIPd1|@8iXt5Hryr$Vbk&zgl-#9Re~(0SS}lZ?rXca(DcneN7FB5zy8sG+jH}-Rul~^(<#{?ftb?;py$4u5Q80)ue z*M>sVGcM^R40*>z$j7j+OAiUFIUZgq$6ixcT=8A6jr5fojlk0{;%_P#q6}VSi87$b z1_z+Y$u-#N@LpVL@lU9%^3MgKV>1wp$-4-yPu@Hat#PsGuVrAi))s>1Z9+wUQCdj0 ze4r`M%e-Sa>t4}!qw4oJx;KXP6S3@I4|6u{yOK?$A=}B>&N%Cu^l;89UPsR29Fjbr zQq`|hK-7ke^BZfVbh&{8Hpuh15=h3--SghOQ%KgeE4Z4^LyAde+ysdlmfX4E92}FL z)%8z_HH}Y5f_)1>u(exLGg!ms{Kiu$Eu5SZ30(8goL7KbE~W79`L49&VI{y}$7VoaW9o@;5K;-EJGFT=F?M;=0T2 ze$!XB({%^)8uM?JbmeeV4go*j1YqX8^}Kg+bERB(UiQgtqM4dSlt;2jOA)lb;&JZT z=sQ(i14z5O4R~&&wuaw(2%cT8NCT6R$j={ISbF@Al^s*VN~P-5R<_-AJ-QfmJtpqe z?eC--Yt3&n7*7cJ!EE~DI5p_rAYTpX8fDmI9=!9A4=qWAEke4 zX!n{#x_s$-cNu8zCgmHb+wIMH72z&!SfkRyQG{2tpWJx-FQ{57%W97v;#mrD$l#Dh zKN^tSPpL%Bdn?Uw8+mCm%-nKI5^J@$@E)uIGldYuz%b`z4!9>c{HuRtJ|wg+yy9)#e7!NppzB`0;(rNfz6`K=?Pg!$zrnVJ5ooUH&78A1CpR*^U3tDW{y=FHlFPsRea6WPBB_DoAIujXMe5@ zLqOYOYFHp}NZO=hAdGIv>sPez0^UKTTwk@?&1rCUN+bhgc^M&t1|$_HBO?a8zX4cy ze&fP3TX>QWKI?SSTkmkI5K+T64&u2y56ZMO2(3gHo*d#!Q7{`hK=}cj0&|R>Gm7YV zXgzFs^zn0qxfaOrU1P)3X_`d3jPf+iXBe6`gaNoY3CQYH=ePB*K=9U&tLy$7Sm$^m zx0HFP(z){%Fh1@9$G@no9a~71wKJzds3o?W9C5nGB*2_VGGb;p;9~?6jl!JT%yzyE zHX3o=D$L)!bF_t1#xQyiI(pYKr^_oOdl0M4mENXrh_2B-)Cd30|2e zrzam;@&5o2*|w8uZ($slKWPN{;g<^u1cqF5+#YkyeH*1|o)o&9?052sB$_DaGew<< z$B-ACbNuUTTJZ0Hb!%&zDen!P%EEyzFw-Q`9mYjvQNKJ6M*||W#X-7m#?-5*O>-mU zKM%!x!RNYV7U+&cO4v~N8Nl}fu$p;po@r1jLZkq=z|X4wRrJq@{1xF#4-Z&9- znPs{U4ZNi?qC>RgWSkz&o-tbg01z%N(&JBLGNR83cJm6Iq~J1wykmaiJ*!w!<+b-Q zsfoP#AamMPuZtmt_dGMefoIwo2>CKV+k=m$Gg+6{`jCA_Ek$A@P;(=?FACd>e7!b; zdk)-Jr42pweImn9hDalO`!JHjkV#n>?2v=gJ4oZFUiH!1Xb@@|NRl`pxV_&Spge*J z84cL04m;OX3<{m))XC!`A49`*y>7-E%Xsww&1&k&D#*KIJGcWN=lNH2rwdzXXNDO5 z&uKiaRKj-!10WAlIR}$of#Y9w%{i{MlZ^Xz~Fjw^{4e_pDA$0Q3oa`A^$@wz%{rZ_HSc>1`&M%$Buqzqu^-o0Et4lax4TAn^( znK(%}-pu)LM$q)%3~CpPE5^3bgCL4u`EC^O6W~h`*lZ>+Y0^lqE0eY{ zxNxj9(>!9T_|r$#bdM8S_*U!-%XuaJ%&~$9MjZR(V;J=OYtXza;Qs)g?KI|*pqW-1 zi#AY)?E~(Nu>dd`IVQPj#xT(wnA}f1Is2SvjWizz!)*Gz_X{2K%^t{lRSYV$D_m$Y_0JQf~)!C$HD z_E-9Ugst?+^?P(SmxZ9XFcSFKa3wtZ@&`_UQ?;)a_*xx8_Az@EkCkpbxtc>h=WHFw zoE&=R>0ds0m&CS-Xxd(bbuIRrmX%szwUwBHK*!K$jFr>7P(M%qi_gqqqrFK?rYw44RTKv z=?SO7b!$A34>nY|Du)4fouFqYu5tN#bknSqT4z0KI;M^e*Hp6AH2b@&$4F%?6LH(P z@JS(0ZgIzY>3l8XJ6{iK+I+`wicj53wQwZujz3;&l+m;e8&J9fYdPG?!ZVPd`(v^F zE2Qxy#*~_TdVQ=?Lo7;EDID$`6Q11HZU-AYJ5}jfN-Z?b9M>zMkEbj)BJP}%O?0z9 zzp+^LPYoI2oj@`Mg#%>t0Wq=6z1a1v5}QV(L;!Tc-h3yW{FG8Ee@Hb5)Lc>CEVjZ?~vi z0zm8sVtCKLPg^j}FxUzXwP$Fr$H^WZN5lBs?-Zy|SCifJithZEZ;{V<=i*JinEwFT zmQIaxBL;OO{Hi+gInU!>V?T?f(sY|hWw-M$WOF*XOo?GFz%A|1ew6zUhSz%S+P%)9 z3BR-%5K4BL0VI|ulHBr1=DOtYW$o1R>5C#=%WVsJyBGH>xkChx3JyU$;CuD2=gj{A zJg=K#{;^(GirPIA{{TMc_Fo6^-UEm5D+hyDlh#t}C;e=W&q0>cP|}T#qXc%MV3(^E zx$>Q)a0ozLl{>bB$?5^=TDE!xi(6`1j*%oc6RaRKQ!#PoG;Wcds>}=FvD^$~bIo~f zy)<{aE9g-KO+qNVwGnhCE<&B^tOz54$R52w!tmCu;%grZ`JNrp;gaH6B>O}&N#z#8 ze*%nTfyn2tYVmOs(#ZM>7&&WF_SDbOZG3y9YZ7VN#+NKGT@-<@ElHi^7E@WRNqTb6Z|KwefYnfOXqF zLDJXlNh(`MA#((=lA#oRW{Kz7tBA;0lW{2S0BjDV z;EYrCO&3MlPj>Pb^|U0)_JiLD+HBjH&b$tfkGN9QxfY41Fi!1;>i# z(yZ^E<~>FnpEEm%01(l;J7p9Aaz{{ju9L_A01x56({2J=qo%14ns<&cWPzb8vPBK^ z>}-7BD96y|tifv9rK1$F7I*d%F3EQvC6gF9#{U4Bfd{VyW7fS&DNebh#}Zr1CBK%@ zB#0zuB+0nR=4HA9tFhDplh|N%#!*RG9CfK*-aHRV@Nn|1G|v)5`k=oN6C^CHJX?VZ zP%a+_BN*%mAn{%2#E$@4=`)cn%!5-~MMwm)wD2S`A&@Cf3?5@HF_JeQdhD;fNo(O4 zT#&7&#tu_p99$1Tll=msA<-ZH<2U9DJd&$Eh>G|GF0Ga86)dmKA)oa zZ&%QzYwJ6kVLz26xB5azJhmIjl@W#m4Y&a1LuWPP2gkZ!#Em^55!<6$;q2{YZ}exD zHR3eil~Q_)mCqw2aai6g@z0BIydiUSp&N@SY~d0JV=ugVvwr*ZFU{qkK!CaHn@;S$^HA%&8&sKyS5`x_wkAu8f zG=30m15mSv?ANHvJpTYGo*Cm|uz;j8mBvosLj(1$hrzxmPYcbfX*c?#!3>Cev_O(X z(y%8#csAKcRlo#f^Ia!^d>5!s;mNKVJ6laq-EETcV6vknxC~QiKYKe*JUGa&lss8* zEId~%*4K-0U89(lK@dp+&fS?fJ}I0$i$IQ*+F_r_XIkKwzN(~{CFhhmquyMuYsP4YEvBf(|`}W5Mxn z`&u|2>h#;Sq-$>)x!uYfsLy@5;G9+(_%`!hwVv|w^3zR5luI1fOO)BvfllAfC}=*>5l@^8%o!8 zNw3AAv`Nygk@433_a+iDYCcvniXxxbDlx701%+f4+amSB=#IOB3>l`23u z!S7Wg*8C2-{8p0K%L`ma0l10E!;JmVM%l& z_?Y94ohtQ@hpue=QKxD4*E5OapU-=1s7f$no!g4=Nc8Ppo9g!(PNf!|r`iUv)^;2-ktXr&IF!Hw)A$v8P8I^&kvF@UiKde3REG> zE57G}TNhHLS$n!O*gP-dogZ28h)r?{Y@xc2dwA`x6(xdjs2Ih930=83>B#DHitIiv zcuzp^#pi}KRk91DU06>rfX9aWfJG|?&jD1a`G(xD;qrx_#qAQ$Sh%#FN&f)RuMpT> zDvj)spieSw!;*e%^f^5%>e#hyC&ZTbx0(#%t<5KR_Nc)oeUX zrp_Qsn>DnW*>^_XSXU7bRb}muZ%WJYUyZ&STTbSyfLJ=X*IBm z?kqAE+Pia*RE!XLuX6C$jb6qrKkYswfo^P}ktH%Wn(oDbVURbj;8>{xBY}g+sC2DE z{uWnIMd*ltqU$3fdY4@1;sR}=k-sK(BTD$J-@GdCL;by9P|9-g(5ad&3gtq(t!OL%2? zoScq_sH#_X(nb#ByJ_dteihj5zO*IgfD~2vn3W@MtyGWfvPzQNAets4E7K#~gIP{C zX3&|!VRN6$+NF-xNq$uUz3Y2ig2^t!STC0Yjui4&>rmUH?o~iUVSr=pnwIskrS7g= zx6mHyK$a*;1NfK?&D8a$T#gmhDZxrI;S7}ymyx{YK4@&lJFF~6? z-FK(KG}2j((>!asFl5O@{hlo5^sp|0P7xqlC+)EUS#@`c&iQIO!InH|L zoC@>t5pJ4s9&YzA}doYXv!k<0Z9QM7FOIrY-E+==~{Ale@nJ2 zWd+#O2%9#LAII@-moU1)Vayd4XK* zW?sN#@m_V~X)Uy`59#)P8cVAyyJlp)fJ)4scON#=*c{}j3()d-r9&4vPm`~iHK|9J znSKT*fGy&(y0>o?#czLS8@w-I7(Lpf0^B1$u_CmUo=xqB?g^q zsZFC8cPk?_^Mu~tcpLz@ZM}~swDkV~3HYuXJ8fRaO1o`7Ktf2-%8|%lBjtQ;!u8H@ zaa&#~@n?lKo5Y=ClF!Nct`^l>?2gDV0;3Ya$N&->Z#}Er?0zsVqol!oqWGIp(d;yc z;)yM+EmAeL-;@F4XK>;1$;%(*Q7lDO6yqKDz5f867K2%7z1uQ@^f9ChOh9+^?Q+bJQKwU8&Pf8E5N+D1k)|32<;WkOvhHhCDIhdwc6i^{XqGwMpZSRY>GVvy$AY zjpi;fj9}$*Ij*{N;Zs+1aL%NltaE-Y@P~o!FHP5j^(ZVQw>uxZp3id z;AXKrQSk3nx6$qOSr#oy)&RdiK)+4PE8EB$$#ogQJvsFpS3&V6<57-i^!qOj$kuR% zHt#e|<*;4q9d@dcyGS@B;O4S?74ZxE1lnlcFIKwKr8$->U?Y92z>S%J2Owi7Bn(x` zGmpaV6z3MTM~PW@LjM3!ypb$mcT~y8bsyHUbw3Z^Sq6|se6V>UzOvUmL4RnU@RPw3 zSy*Z;Oc5`a=N*{@5x@iwr&{B6EehYnI(3uU+`24;?2(31!6cC694mwTJF||JtZ@$a zdjnQJYx^MbJk8^Ne&8LxwIA5#C>tLsIRw|QU-%;9OENBEW&;>|@&u+soCfWY+N`yu)V9xc8Ww^g6^I!MPfF01FkNC# zn{mqe9R8I-Cz3RHVrEp3{KKFmdsSZKvN)t7Fb^0x&2HPVni*tLF&@&zm<|a8fKE?d z-&&yra6Z*xg2$~-br+DnLSqVYSPXqDC#keujomWxTMNdx)Aq=5_gz(#j^ho%uVDCp zt?Am^-1uL_h?bTbk}NXK0w{D5{K|HLfWvcKBaXs(T|#7-V3 zP)in5oQ!nA8K|iZF1HlYmgT<@=um0e#r39^&n=ox!roWFX(JzXjyU93XW(y!ej)KK z#51~^Jv26FyK(ZWX9O>1W1Io&*18W1-N&S*=BKRLTVB56W0K)~^a^^7q~KtZc@^q9 zcf_0K(-zXfpm{PBa1IIp8TU-1W9xYO@6`-!26W=D+26|4D&apy8i zk+gzvN9A8Sy_>{$XM%VKt#(qAaQDBj$mFJ^w>$kmOS#ox^X%u_CA@ozup@!jk)D3F zxfh5oE=TrzM2{n2Gn|4Lagl;6i_!HP{WT1>lX*(m4miOBkLy}KAd1@5LwlxPt(p1MuB8(>mP>%rADKpTwhNFbg+DkF`EDhVJT zz*FLrV(rf@*0nar91J8wz0@+`;2i$|^{Yr)#xuHRbE^}!KcEAiX#{1LB>ceOioFKV z1d1@qX$`b$8IvX4^PWykWjShT5)>r|KT+w5cb?w+5UzPnk)TDwi zJNwjZ-e*ISIQn9#I}p$XImbJWdF@cR3OL|n(~Q*ZC@Q3Y3XE~z-2G~?Ah5~&2c-@} zQ5(Qafs%ifY-#Fa7-iwjVh170fyZ98y&SwLIT!#6hFT<&AlE6ApQqNkdzrkebd0f3 z*!LK&T*$^i$@jV)y#;8%ZJd_6a&S5}aB6NQX{fh`(a)YsH_S$Jl6^l4GgTF~H-YsI6m~I1Hf<;BrqxkEdFmW;GLL?8B#*iXZ~*`9L{8iL3;1 zy#ix$^MW(prnYEiXKRBl26#cZ=kYZH7~v*h2ry0on`qsCX4Vv#(4ohPM5`PcQpqA~E z_faaTKQ91w9dk^A8>w5*m0ZTSDsh34(uqZ(r*at}-y#-VGqH6Zi_@CwG|gcw8_iIr zWCQ|6K+k+}&0xtr!^Xi>@8_!Hj=XwSG;m!@Fi;q7I3CrLy4v@NW$c=Jo<1co=eC=vsb_E271031g$ODY=L}4N1a(e;oS@9~yq&HA;wAIN-cFcXpZU#+h7;9nkX>si{ z$VT?S9XY1$VccN*Rf}yt;zaX8GXcg2I5neXr~Rhr!0WSbB$ILf+D=O?xyf7w>DRd;x21=awK1uP zj7|?s(k5RtPFKuO4m!~kFE!GIjIty21oO{xU4`g37cgnsTncxV++#hI63oZ&th=kI zbc+VIw2YaZnKvGL@<-J4_O0Vhqn>qB+|sqv;Qj2N6aX;!&&$p@_ca%Xv|DL3{ZCN1 zjdx>gMD!fspF!7(?)0~`)ATqR;@xg{Wu!RC&wi)!t_xl9UAeUW&C#I{CVp%JS(`o2 zPAdsLbu^9M#4+f$VkujAC7f;;#xOe?+}8XwvT3%`!?h&F$KUe&y?ry1D+5cpl<7%x zdm#ZPCm82|4?et_>u({3^4iz!7f!b_A2~t{4ZU!Ck}+CShf`@uY;Jga!kQ(=AR!V(*?@p9&^D;R9WXyWX>}hHOMNs;eR^buGaeB9 z!Bu#`^c^$nT>ZS)b6d#+!yX*3EI#fIbJ(6LYmEgUMe`)ezdMwA`%>R=G?u3~uIh<% za_ellg&XC^1JjDsh0{^ep|pk=p<=sChlV5^=Z<-++OLJ}boir&;!q@I+}Qpd-2wb7 zJ4j^H=VfwQFyxm&Pvi8d^fXM~J_WwF(^pWEM`5^yWgjWWQOK))9I}&7(CG=XqhOME!xKSLEF_JaF$~Uhy&uKc$pK6h=yE^PatHpuh1Qwu9lbpjnOZ zoRhc?jrwP(Ijmfr%{jEt;CwwN+pJlx!$%(S7=U+diX0n9^zLZ#@0YN>; zt~xvGi0&l&ERG||8$tO+T)EVxzKB^B-t2NPYVFi%o8A}kESe>i<*vZ;+Foe6mU57oor%>&f(|`*p%Z7v%@v7#@bbr$w{Ug_Xq9 zvV|#bFvG&R=cwk=F;IxNThtcbl~xyO6IkOvWH5svsGuF zCV0xKfswe7+3I;c>(QXo*-g}u87|A_CW+LN6pkCdNXK5)D(PBJ_HDkMbEmbf*O+|9 zmp))(3EU4Of$TF=C8(1znmb)X!_O4wGulQRA|i~o;145{*FKcg)1lIA;J+7HXN$~W zry)rkF4O5;CH?pI2BmT2P3I(p#>5_~-N5J4x8T#H@hlelPLTfqX_@lD_XOCTO160V zbflxua+S9e|iarkiN18bO8g3UE6DM+4i^t$4x+?c!@Ul36DxS9agshi^=F?0qV%UMkZjNiS`s z5X6O<7D&q+kKq{l_04m)7y8$VCw)%K$$|uINbdU+aO;3cW;n(|f<+RIilsFznaQ=4 z^s*#6q*5y&z+w*4zMW1F(z*+n9@j`l*khf(?7t6}50EvIegT|*)% zOlA^TXN;Tb!J~%W&L;B!-poM<*N(j_MXx7{OK&sxk;+-OVD8E3pQmcp z4Wl;^bhdRSX<{Nhg^0#S9k})PuJc2?((i3vc!@@j{bG=F&+#Zdy{e{{p+PJ~?h7iR z<#!bXH(cYW2DI$FI@YjAUPasHkP4m(9-01q=yS5UHtuE5sKKV(ODRz?nieVdfnVvL z(zER1*0mQhs;su`oBXL%>?%5tbC5^1b-IS1XLU3-@w8=f9Ag}IJk&8x_A4;Aa%0@! zDvmI5&2>?mOLLyAQ+o-dYik&NHuBqgqpKr3?(*@}D{#S2jIEq-IqmhX?&jJgo(VMTk#69ugJApTI6XPwRM*nSst43H zIKo>3>Y+y8oB~Hq+n9b8t1KEq+S=Xda)~Y?jxfSOk1j*^y7d5&gI!K9kl<2Y)h2Qt zDAmgNmdjAJvnw!&ENtAzBZK$wd*`J|so%#1oz>o~vm3*)QZU$$a|46lr(P?Z)~EYz z=F5`A#`{ANfHsbC&|@bxx2fss)-Xdn<((CFzBAAG3h`^kO<5k*B@~g#>vuOYY0D+F z(r*|ON3etpNCTg6YcE9b?e@EKK9^x~pKFigHnFzZ8+Tmi0f(r~ba#3swa$|q7dLaI z_b;JvgVw;7i{RqWFT+{x>C8Y>|c}vXDt6;{+PQmL9CNWmKA4BA19h z7iyjwdxNaBQHxhdodLmSY>)u&!0I@u>@<774e9s3AW5NHM7j{hn~4)JJnU8*xERkJ z>)jyLG%ZI;iTrzKHnDN`NE!*b4IFQsql{z@aBG_Jwu|BYX5Pj0iJ3(q5=Pk-hs&+YkuWL^XO%2ej@QmOKmRFWg!yPpoGSU_iY~vzb@gAW9wY? zjiv4Pi{-S{BmV$MxMcFT0yjLHax=jBd9LrmdOe-?wP|gqHOo!8+8?wPQ20`JU=y?) zaZ`LdwYl*>iM2cZRK+2&nn+SHG+=Lt{KSI6`rwQV9(k_15ldEhn9A{7(Xk(hY~j-E zijUsCv~HXz8wh?!;7?lf=%%^8)fUR&eV{x(X_0b30A~dC^*zen%QXA_L|gRWw}V17DbVQ{JvbuP6%O+M@sMBIvjX9>#54< z_PQpysLi36RymOXVor8?kb7f1(rFqFiQ&H#HlN~YWs1epO|wE3oVGu94(ttt^*u#d zlFsA9x0;r@q};}n;^-ni)X34Xyoqv8}d*D}hf3Ym74Mmb^u1d)yh zBNfd)RQ==MjHM|1uS3*)XW`8uG|ev0!&Xf_#F4bubM65FY~yNWzFP85%lYY^Aa*ch-Eld83YlNj=2>L&DrrNp%NnIpz>MHUpFLoueQ%X;^rE>r9Yjwr*lS!@(Y-)K+t)HncnG z#wQ_frPxafw09E5@s3!=S$Z6dj+Fa94L-DHw|zQAk9+D+w#x3QE7rGbzF7jXN-gYC_CP{pO9IO||!jJM6p65jY|R;sTn6dG7sroqguCy@2Bvc*=T36 z*x_X3c$GtEKDho=&0|`M-%q+1HrvtQXjC7Rhd9K5`j6JVeoj?par?tHM^SP zKb8aXsy0U}j-(&M6=TE^z4nDIt&C3+#Uzs3fVe2kIc`0xpV0N|1%p!X)|B69wjNE) z60j>OsUI?o`Z1ti>iTxNmT+B1JSbyg!jG6_lk0}gJw-H?wLIKK zNhfF{ukcKgTj)~7aX$OK#%p$wKrpmKGOt2NIOJoR>U3`%>u;?p>VZZ3D2=3$g8>eIaDEhT;r^Dx+}ja93zjJv-*SiF8Y=T~F*bx`Rn-?!d?a*x^n(bUDXr zzpi+VygR2~cu&KRa}~Ar!8C5}70AJ6Tmi%51RA5I_{MmfPECEK31WPx;YbJWQy??* zfX#qMIj(6|jQLbn$9@`xYEr2=O7VLx$Jshh#T{zz!ZLg`(6q}qWDtnd%B0T4qaocG z<7s8d-RY5DNu=w3EAaF;cC18DG-NUf86{xn4H}W3yhkIrtbKb`{{V!$#Wpv799x@h zJ{TDd-SAkIk};fyTy8nYQP-t77apC zK6-TAWva4gmuXt1rkympnm}ZdB81z>OUE1Yk`(%nUMqg*$5z^jmtSRgC6-B2Mu|e8 zkc_EBP%+L29l5SL`dw<~(nxeYI$O!!8NBIs0I3;l?%WRM0D6uyfn4sHtqW#`&_=EH zc`{Rjha;SW)}pgYN2x}dlDX)*7QL)%THGEM(%_O?tNCLkrEX?s=OmxR&63UM0bOpOp$BjyW@ zz~FwF2DLSPR?kJUU{NI(akGVws=n+MIqp0CYpV>LRhvBgbbYH_hoa7wUM{+|ihJm; zWM&Z;zCXDhX9QyfR~#JIn0Wi)dGH^IE^T!=V@ZJ#y5tV0WVgk9&7mh(ayHorZ ztms$rUPGu{J-?L~nDL;=W*ETdpd-IdD`!>lzL(=G+gN<>E6QOLG^Z_yh5;wO0Ij8F z(pwz1oHp4WHK@(5c#8Yaiq&+f3{k?-9uiedE<&IKcSD{tiqw|dSo>Qzl0ak`W{*4+ z7~S~(we0g~8ZDNmW3HQ-WVDtEJh+O5Z08C<&PYFpN``$tEm0-1(wLvL#IgpA;aH5| zk~qgCbL&}NH?lN^RMN5XXNs0qvw#06sr!Mb4>7tqb0_t3v2P1kC*bs zK~xM$%WXKXs%Q9Xcj4^`Zf{{eWJWLjFAJz41#<*)AA>#$4 zLcz)+vB?ZMVf3y_u;urMEMFw~QPk+#HI9X=%c)B8+`~1ygo-rYq1%=83NktL>q)NZ zEo=5>y7Mhk?7WF01HB7i?Z>v^UB|kpe{L#mE5S0W*Ga5TN4j(xRMtJ0Mb6a*EDDcmTd?z-RmN71`70FLHE+kl$vZ~q6 zNB2*s6%Pv=`==dDRYx1{j}p^tm&1Cb&wqbw8ojjX3T{~+dm&sEAb>gQYnq3}R`>cH z?v1QKCu@%>ttLP>K`c$i2lp9C1P=H$>pGnNAF=TamUlK0YC4p*#x~xBEJcAiQWzF< z$J5`ppZH_Ilm7s0+sSe_+mj=xjDp+ZBZ=0I4G+3FohBR#+s&3JF&J;e7mg6aj#EM)SUPc4dMV}r{Np!KguyzrK< zuSBrf#pd}Nqw;0kkxHA7%eg?$^XXV&uu_6ObM{!+!{C+F`#`n)onf z+qpv~;2C5D9E?8$BcDq44-5EO?!pJTzVg;M-J?aD@3SEXabANRjc|HLhvE2ZraktT zVYcSmL8UlMpnPS;aXS4lMsedw^Gd4xL*E97TxGt(Vwl+d;NzYAFEy0?t2 zrL&UgNG~wyFOB2@JO}OEaIbzE$p57{CfR!0K4> z+PW=b*{`C5P}XdWvE0YAbn`ozVNyc6mEbVOG0k{O6y)!H51@DoaF4Q;^!~IwlUCHU z-F=@|y=GXNa+7&YiGwnh4hsT4@b6eH;)|Pq4&G=sQ%s*~8MyN>t0+=7^PG|~#a@$5 z@b&HCw$WO7kj<4wQVs`V+ynK%uKxf=(&DwYRQ}C|;#0T>xIr#E0fUZ}$?WG*wvTc% zg*d3MxbxfZ25Rdjf&xm|aZeTY5 z03=Wy`9ddkGT^ksd7-5-Iy{jk~P+fDi!jO6c^vJHvEf_1ymgk?2t5S6%Mm2e5zfD)n`Lj~d ztTbJIZ6w^sHM_7wbqH;XpW@nZa=GMF2B~8Ps}_~2+dMEbDyxIa$VN9F#YyYwT^reH zhSBVAV=6?xY;!WU3cKNlW*HoUH)9yadTb92SnC!)Ws(_XlH3il1tpR^;fXwCbipEp z8(zn!eG-!})*)v!u-ZA6Ez7zx{{S-~!3VB8QV+N3o+Y1Ouz^H&DIh3FVuYzc$8G^2 zoQ!wHeGxanYuFP_x3raR4df_yk{Cuv%KYPvy}qKkTQ30FuZS)@IdyQ*$`#d%4bizA zft>x<#|#cWwbrngj{BZPOw$j{_1Nb;AAPDV%j-IHLQ`!MwZb!P43Yv4N$<^XY1&oA z)ra<%h;AW)ZYB`PCgF&;o!>WLagR*brubXorG%4B;X7NKsID%c5-j^d2kv8;FxWuA zg>X+DxfzSaf7`wn((gPosA#|1Pja!x5Oi5qHBf$K1wbWO4!Gdf@xnOj&I*~ro8+W< zAC0^xq*!X(G!gcgyLt3f87>Foai$)n?Vr-U$kLxheW7}}H_<0ZPj`|h7qdTz1t z4&PSs1*eC!24M+oO>r(&NZXUQk@9=zpK5o8H18HZuN9u09`4R&jaFc+WZNO!6k{bx z#t6Z{=M{IrFll!=>6?HPYG;sRV1~ zgi(#(J8ujF1v^F$Z(8%u9cVr-(kGW#)+d$WzPWh3-!sldkPtvQB;y@;1P;~h5PVCw z(>xntug#%cTw5ZotLnQ`%$7wNC?egos2njp&u+Eg)RR|RpI1hm>B3Rf?0KhzC-D`N zOM5n#ZK@lnngZ^m-N!U!v6E}C+nvBM1EBTIb(Xr{itlv@yen@a#IGb%TSV%fZ>$+yKe6fsLbX0}S#aOk~f^gB+LQ%*dO7O zs08wJ&TGoX)Tq<5vSiT0E^W@|MANiwSH*K&_=@3fqDAwimLODz4TT(J;|uG@(z^Q{ z6GPU*#dk59;%0YfSBCQ0*vIpz002qb$;EP3n$j=B!F%?2bl{TVq=>9L*r*HUpxe0) zN6Z1`v0aX_soLvu_iuj-1zwYmceuy0Ow=)Ti+V zn-U1*w`kfcsAF=xupkqF{{SiHk;uh;GbM(BHkx#Kt*n)AA^Ulej7Tn=!{`QUsn? zVSr`aqhUOXW?1Kt$PB)AdHM+8CYbv&JW0{2+1JiV!e05zALvn zeeI8ljEQD#(`k=tECw*e;@k5OK`XS9dVmf{11j|8IO_B!k3AXlM^t#9hkPZi>euH% z@fDQu*~A2zg9iyAQS-7Ma#w3G7&+^XgjX-(-+xa_ z{t`M80ru%!zgOjpXzW>>YgCUmpEIAb_?>m7_-VX0ntXA^aO3R~f&;py3a)TS!5PTM zTH3MFr+p-Ax@_hYk-3G(m^{T(w2(#*%ESZM*NRz7Hm!Fxnk$&j8w7pB>&K_%UqtD; zZQhBd+jvXF5(b9iGc~2a-LXz{w2{-bc$mq!C2h~7!qQJ$9Wd4YAn4`|M^}Zdw7bi6 z`y6hcxsphNE>K*Tk5g^_7ib<7xU_9T{@&&$-7@)$x)~*dW62q1a9Kzp zPXj!G&2u__tzo5`{VUB)M%=qJF~ra0+sAO(C3oSsN4ps0aro8$03GQ%)!vJyYpZ88 zdUl|#_DK}(L>sdp1MAP-kr61>k^@t1&Qk59MPv|E*Cv;s-(q;12=X26ki#>1X-)2&vz zu+wMNgIvZfl17BAcC53A^22t_G2QZ>21ZX>>i!>JY4@5Yp{DqneX~x`+FM)Td5sjC zi=E@B00YiONcFCB##egR!d-PVeJ0v?Z6-*`lI{Qt$gjA0PE?REs(8WcSksiby_?+i zs>LYtE~l}12E$LV9vYwfTTH*XXrX(O*4Hqy95{P(BPy;`;DT~H16tlBn_kl7glhLO zTdeXuys)s|7FgIW$8lS^~QbsVJWzJ{lX zbPoz%+0QPesWWPVWS>v72t%q*w{jK^F|@DBcJ}YkRq$tktbAMI^wh=8nl-v5)VgHy zM{z5JAsru+`_&JY%U{v4;C_wsw5Q1d6+(j#2^2@8BLffJx&K zc(1{JFpFHe@#lwaf3fu&R(l)$v4w_m%1@dRnU&Rs20=XI(ATYpp(O=5o^4sHxWw7e zJWt@i59{%1TEfp@_Hu`gOG#2oJBeiujKr@ohF9Y}FDuk>YsLNx)Aj9Hyl-K3X>qKw zG}iG6yvSsd%~d0T;(gn)tA^aFzMXjSU1z{rkHia$-FnV@Z97u4Mr(_CA$w@jD3w^c zwq08#j_<_R2jN@4igrFB8YP5sJ@fz$bcJN!o3&^(YV}<4572ex$81*;>V)IryEdYOA8@I)qjuPr8grZ>UEUW*L6@+Oh%HJ3(%|;<2X@ zd`i)xx`>z6G^yib3`C2DwO~Y>P7dNeQ-BXl4=95kL@dUWJuVApfty+gt}mxn*$ zFN)#k)1}*P(%inrhDd-{V;=+tWnIchz{wu{IdX%I;`BN3n3*|VOH;+JZY?}7;&!r? zzSCzg+cZ-s5~6~^{IW6%75lg(=g{O=a{6z8Ke8mf-)aTx#*-1;3>Qy6avd@NeyA4psJXeuhrJUk)^KuSwLG9C; z-}@wj-u}~1jvKppOtQIG3R80yBp*65KkD&>dDc~jWur(9yY-YePDw2wNa z7`gKvZ}6+cz97-{`*gavbhPqpK)kDVQ1&Svi@;7i- zfO^+}YB#1y(vbxnBG^=t;mt)KI?-A%;54n9K zUa)q!k|;&gq^Fc%QI%4WGY8(o?*qsfBdD$q#JX>Ud`Q<$W(BinENhQw~?s{>>Is2_EA3W;14d#s` zS61$PnOuZoHn3$s#J!DsHj|@jH+lu=@nkS+cCuQv#8+|1vd;&W0rM4xTVM@_9XoZe zVqXh*L&Lf)?}q$I15c*iY`KF|Kz>-}0fC8BHuh71Kw>)mYn{@xi~j%)Ud!Q)4$re3lXrE%!#=w^<30FxuidI5*CppLp0N``hyrH})u4>w}dQ_IMz52}F zRn$z;nUx6zjsa7^$T$o;(|ol(?rSim8A0f-k5BO=R~k-;_Ev9cV{3JC#^%=P!MI5? zv^$P+2*DWac@^`#-X6NQy^>g(NY*e+l0*&)_UX_X?0iq6&7$2wEyKOc7ej1!3;WcN zsl%r4?+@^<{{X_i60q?fitThQ7gJ*u;zt;g<}WE>GGGwo;9+^m0E5<)8>byz@8oMa zDLt)Y%qRN>oun$I=$c!k#PIyZqa@^VcsX2jKGdEF@V=+wd&4b^4JulmEFNfDJ4 zu_)+KvIkC}vx=GgYhE;XM4>Q)-H{+%A98-P#{7|9;}jT?nK zl#{?9`-56jc(?mz!q-O98VxEGyJokxnZJ2y7TjRY!Aah7c8v4an)8ngc#l)km&mu& z?gf;j2exeOSq=zg+;A8$?avj|>FIH={6vD!#P%{?HlrfQJlMoCNYRXGcdxYZz0PT~C>#e*q;UesOD?F-@6dk%>FO4ITi& z?7)ia=F@Jj{4;6djVcfLnnylJHzrj-`lBpB9(l% zaKCwQM)fDRj<*0*5NZS?ID^2&Ic>hJD| z;|3-%$ivHhyl%ibIRthmrFw9n-mK(x5#+k8&??J4-MNZMv$zG@hUzo*>T8dWPJ63w zwnv6VBrqR%9^6;9=-wWG5ZFm)J1x3Tx!I>&yqE;$FJXb-f)A;#GRMQW+C}xopCTYv zVv(J|?mXj+^dhs88x+*?rL^O+* z4lP(o7#oH<`r@OrOUQ0gSjmc2R$<$P&*xWTcmoS8LcA+(3_-eMiR@*OQjDH>Z7P9y?R!S2ZrXItfe6Yk%m?N334(4ImpjS z^YJa#q#%Y!)r4bUbwCa~WP#7)SDQh-wlL}oBN(D(5-8!3PjT&v(~;W7T*p_XTWE_6 z!^D=x)w+YfMF6oQ2Z7CU z@C^+nxt>_f#e}muLWtQaGr&E_#br8^oSJIEM`MlDb!$t@wrf@_WFRvTc*g(=f%MrX z%()zA+PyC4!&+U{v6o4*SY`t%B|ZI3Vd}Q`Z4!v#L*)^;#q$Qo2cV>&j*n>VW6fu> zlG`rpyC<{kUh1(1SSK>%<)X(U+WGPHpZazQ-$fN2!Yq?yMer4mTUNCY-I^r(S%05Ln4 zC5b$9&;gInnzT%Sl6g4k(xC*7e+q8mqxYP*IQ6ECx66Z`YPoJfF>jZzN`*-Ii-JQA zpzRMR%pM8RkpF?u^{8}HJuP~8+ zuJkjLwxsc(k@mU6cju}7E1|OR^z#L{xp5q9eq0=9KK-iD@P?}u#lHAM8A5`36=T@v z9M->xEUr=*>@DPYXI-ea;BNB=OoQr3tzk>Kg-Yq#$2)aoux^UUUC)?M{{R+9>w-H~ zbq`jd#eymFF2Agn`<$ExbG8Im~*Vw<&_$ zHVkDpvnc-R@sNFbRl#&IsZ&!6L-3uw?5ics!-$mgwRe&~;5o;=dV5LX9WP5O3LiXz z85u_^I&+NVnzTF_1@TLbK6kTciA%yhRZ!iyC#f8Y<#pWy#P4z~bo)%ksu<0IxPizd z;N$f7u9(3jdG4c}^=4k9HjwZ;p_VIyk>%{`o}BjLvu`YBv5py`VdhLQ$_94*PpI!# zKPj{#5SE=@hu2B63FFbCv5@D%W#r*^Sh@@D4#7eS1_Ih5DNaY+##mCQB3dcQy$N_+q5+^i!60 zw{RpQ1oa?y`eajn^GtC~Te87N#zGk-FoAtb9+SHjol`Z>(@GU z@j-7T%tC1tvc(ea+D|#%=m)iVbb2gy+RMjqzI;(3c|ALG^ya-rZAM#L7$Ud01~!q# z@&}m^KmkLXstwX4M`? zn%?5>#v-tQfT~DXFUY5YSDt?w^UH4+Y7*Zqsf9psw8_Z+kI{Njkh&3G^T@>jp^pX=x?hHG^$oVLLeCOLSh6llyY$Nu!2Uv}6;$1uBCJ#+ zp`oP3XQ72T1`B#ur|@*S;1wL?f_#L&l%&Ml~Th008Z3Qlc?RXkZhH9qk=Ki zboIqt@rI$I_?{)V)8Sn@J4k_4k1Qm~^v(w)pTe+)qAPE3}0< z3~}6X$E_zzmjJRrO}}$aYmV_1#*eG&@agu+PoX?x9@WlxiqlQ-wxMF0 zWX&|-pS7vOY<3&v>HF7;j8=Q#|u-1Lo_T zdWz+1TN}q?b}dU&nWU0NxOSC!W%L~YKEj=^U1>2{TisjS-Oq5~8Dp7nvA6pz)Z?d0 z?>q~vNv0y(c&ko-Dp({)wGCG85i7@SljVmwU^BqS9M(&7 zZiP#45QhfZR1fAUO|HJZxcw`c)@>haOB`Ep$ACH&^{-Bg`x@I#{rqV?+zx^u33lAP z1A&fywdS{XSJszu1}_}U#h4yCj&u3dLEY#Qg^|d^EABEmI6QIN-n;!C&qZ|mPNyLT zA{8U+lk1PtxpQFbtt4s~3?2yJlj&31J)oJQk&Z?&)2(XV#FdWf%J*Ho)){PETiakE zDmozd=nvNwZ&|$2ULUgGTn8}{it3~}AMIm;Mmp96c9Oxm7m`S0alKDfKH2G-yIl_l>(6R;Vn;Rh86%yUq}uVec9DWW{Ca~?kc`PD+#)S0Oz zq1Rhz_cj*mHOg#KtMZY9wDtELE2Fd4t*yz^qOgu}Di9c^Tn@QXFjpLNoOR;80>;V> zdrF4O%}+mToF~sLm>pHSj1EU`E6RLHC8ve%;`=4Ut0-`jDuI#@1Pt@_?OvZGV6Kih zRCO;FXo);qrA-sttkD~UEQqHp@h?J11A;mZ^{s2IUd?b>$qD3r*J3`#Q@4ap>qJq3LWbK!ekN_p*Ut{{T+CRPBf zV{GuFKf+Jt&3N{$;eQl(a^m9h{>mxh3?gWQ2f=LP0Q>XLN_KJ4n9b zUj0Cp2~c@%i|NM%9&4J_W33jF zIg4yn`J6c94D}g5O3u~%HDPg~zO|wwAz2J_u1hfIAoKWEvUm595mxtEn+Jz<$ZwWN z8T_r-+)qH<0)GQt&Fc7BZhp-L!Zfzbv4f7S-yOQwp6OSYhQi)k#NPy9#_YV4fN%-* zIIO)wYh94Nf*92s4ZX7aw{FkV70s(>OksCp=_8>@_7!`AtsHToU91QuT$KcjjQbkq zyh^fNX*1nvlB{uBpe%|&bC491_|?w{YS7+zZDLE$K1kE%iy2_*r*2oN?axZ_Ikn5( zI!R$I=9!yxiPb`NAcN>f6l>5*ot>XS))L>n)K_0<;5G`AoMVoj=Di{vPFOVSh}CyU z{{S#uxdbTW=hHRC_bBO_2yj<(0N*5d zCnS-_YSt~i5tT^B=b-5t&xI39kY5>={$x=RM8e@t8IRQPFnO zp!edjH3(o;GQ%@SjCQCTBKGOWJZ7uh_@%8h$+VdxB2;u}q+VGV5J*4o3iV?(YaUGC z)VYxctE0g@f@`T(*+C3J8Qe$!W9xxWxVr?yZkSD|6c!oIdS^YWe?row@gx!ISKFF6 z(nc}laHx0$)<&VH%X56t#EjvG?t%bIXWu;st!FAKMvE4r?9Nk7w3AY}DRY&H3w*`D ziF<+XS0T7-JA0dEm84e%QYPmuxPG;JRnxU^4r%h~?HUO#fg$>|U>(hm_PYwL9+!1w zEUuhMD_hAF>lzHap;!_J*0|?M$Kg9xA~MwO^zBnTis|%=A*n2q zX=`(C*0zzn%H3qR4~E%}tNMy`=UU>ahoaS_j`#i&*&w}Q*Pw;op?05@c>CRtpsY_2 z_{&puOM9{*K_bYvG36Q5F3`Chx>cm`3DIMNTE1xGqTPf;%X_ zW#{*Yu2}Wlf0bnF`n|RKwd@hdAdD)eum$M|Umvc75ZD_fHLc z7V#I0V!G5cD|uqNh$&w=%K5F-j2~{jtH`_`VJ)t;Z9TjN;lmxTkjfh?&U=dcv%?-e zo56ZyR&d&fxrP|z672_>G561=2p`hDe72ldy-{58Gn{2waZ$tW&zt@s{5bJHh0+^q z-5ON$5W7qldM^W=>yi1^E}wmMr^N-0)2+fHkr8|no@NOd>(;)T@wdf|Pg>DU*0*gG za5^8eZRBoXHv`o5<2CbEk)(fUTpP=#^P`o3MNzcJBOVTO$Q}KwzOzzyim}a?V(QL6 z?Gdq!E$)q`$*fOxZ7law?26dNz$`rc*~rdF7#Q`bZFKz$R#@(>rFa8ILyLyo6~_mV zIj(=ji1s>_-HpO1mfBs6$Z`%3t!7y2meIt~+bbaFIXU^ek?GpJ8O`&w&!mhOFEZ+K zaOm$8vuZbSG>IFOb?7n*2>1!F0{E;H<5VQ$EoR%eGgjaEN*7J)g-kus!ZzJ zMC?^tcTdFs09xDdzk~I!5$aOt@k1)TqXm!!KPFG(*0iUGbDB_EnN`F>lw7Jbk^j>8 zkH-4c9zF5g{wKS*`wsXbMYmuJ6^(cq7zZStYlHD;ik3Kyl3T}gZOQ`dtg3Q3BaxhD zuyw6U-qPPrp2ReFvBdDt)W;&OJhvGq<~;5l1_!NDy4CIOJT)E6h(6Z$OB*+DmyyME zRH-MTIWV|rQi6n5i({C)xJ#*txE@g9iRqD%+wrc4RQQ2&EvjjHdE02JWAft%Yv2_TqQ@B!*Zcml6hH%X5r?K;&kS!pH3{8v%hs>k+Y5DKxVAS#eMXOoCS^R8 z7|A>l)1`dhdEkikTfup#T}r2DU}I9paUBmofvK-aweAlG%IEv-k4VxrEB^qBHxgLt zK2@@5@=CGG01CNf+@4@39G{mp<$gRmvua{ta_+K3gDa2uXTTU-066VkZO)Tv;oCJ! z8Rm}W<}g@}Hv!Y0PIH>;G>aVr#5Y=AnQa80YDG~x&ycQ0I%B8xuPS(XC(6%VRi{oo z@LDaA!)cL8s_D9Uya3)a9kMXM8+~}>`U<^ycdOazao$V>iz{uN@Eyp%VgntR!AahF&{o*1Z~c zicL<_U(|IqI($(h#;V(#I&dOxtQ-TLN7UE1g{J97=N=-gCoV|s`ksH|eJ8}e4~K54 zVYyJ%$d&4iHL@xC^*pyz}Hdr~yQM*4V`e0_gTV2&P&l76D z@QdhDrOfy8G?>b>It;J`od8r$xGs$!=-*qsKO1*r7DnNX%rrMwe^NOFr`h~BEW3`V~%K|c+PD5vd z$mAU3@~-1e_#q#gblTmikV^?M$Vg@n*Ek-+yw_gPm%&q8d2aDrN=oEqcDnrCLFju{ zv#ROJ@;vM&VMi3)C>$?}FF)Z2_>nD?4Jtt*gk>xoi5u4^?)ukFEy>g*wx3Ay?dP|7 ze$p6WN}Zuk7~~w+A>y082T^srZPHw?%(-lWM>!`I&dK7IgHDpt)nr*_9Jz2dK1Of= z3HqMzdW&$EaP1oE_|~Dr9`SMsmG=Q|(*67V$=h zuiC{utTJ1$1ymTx9DKy(K?5H3@s5R}$*f#0#r4;gjQA|Tv%7jP{{XKQ@4pXxQ)A%! z*3$JU7IYGjuZ}*asOi*J*j!YlK51x~=i>7CQ>FW@WPJ_dkFnSl`z-f2Q2>&da5bAaxspgO6WI_N%WQXcsz~>rr1K z-Mx{tw`c&^1gccV$g0GK1dR6f#d+qFpjqiUjN@O52$$wCKbo%*M>~{vAo1J-igl`8 zayO~-t`bsiNcq>oMen>p9+`D(G*cE$;rZmZ zx-vXyCg5*WBr!SL_l7gyJvpu2W5kwvFNJ5-bp_MoBr9(f7B-hwT1)w|O?Ty#P~}fdj129; zs+4UPD7}wPllF17ZH`LsK)kWd=Aa~5Qw)rmW^9b9$mDTdM}jm>PHzutUMi0M7$VbU zenfr8oT&j!9;e-LS- zTGDTzGv2MOgWNV$LX9ycfg_T{4hhZ<2fcb9fxKa7s!w@#5;%1kt%@Q>cG^oW3006V zVYm)QLc~_8yj!v3*1*j!WVAi)beJ_alG;huXSGBPIXe|X46#Ny;No* zJOgmH;UGyRVBfjiNWz{uVnIEIE6Tht;tBK%)2VotW}M$UnPHIORDZI(V08Db9~F3( z_s2;tnc%B9Xj$J+wB;#H6#z zt16A%w;{)_c{TIJ&wygod{qMYy6#9Jod`F!%3dXv%P<1~@DBuFcl54y^5@1@SNB>) z+!NZH$Bq*KBqmN50QM!noo4BtG4VEmbuEY6&8j9rf_5S{?T)Ro*Y)OhSN{MFHC+?LF~Y95iS~q8?n4ceBM=h+;jnri{3a0)3rWMGW?))Gy3sd#$o>sYyIBejG`VI`TtQc65$c2{d2++n%x zS4N|zc%H`2;@C|m+T)HJ$mLDNCR4(z<96&R=Zvjn@a{3PG?pWpN>w$nf8mawVRts9 zB9hQb?9s;eOSzDS+^rc=#^5k;JJ+sh-wL(eQ%Rdv)35B{kyGW4cPJT;R0XgBJ&rM- z&bhyb-WdM?gnwL$*6!V{XK*Ho5tXEo6^S5+1xPEw$2hN9@ejnkF2=~|R+g!E6|)ld zp%s2^c{{q04`Ym1b{a3)DA@Ax6O^$oP-o1Vy{@CDT|;Yk02-3aWr!3z{!%_r{lWAc zX1#C3-aGh)beOHKV7|1`^(fmf#pA0r z7*0@4qvLH~;nUvfacWzwgfg>ilXyt*yfYq*tgOIbj!78fnysMe8jpi~P2{b>x(=RM zFDPiH1aI<~h|+#6KQtK6MpQZ@g~;{cmq7}Kt7_bQ;cKEeDwL{S-33^CiqkFi&J=@o_8%a zHr+hnI~HKsQG>V=+eq~TrxnnAOZbzgYqvHQ7oJ%wAbX`yNr+&4rH61%NC&8|JWmAP z>-P7$?Ty4bO{JFD(M$m{oa8RhPao4Y##!5F7dLNhV>@5#Hu7#%X>cT!GD?Nn!uk@~ zC$)1_#>FcgbZ|0r=j=)1oqtW#Easa|R7Z&I1G6@IJ@y~|*KNZtUVW|b0Mu*J((TqiqORJ{`Ae?8~ytYeC zB_A_gyzslUOkz^SNCbu;9D%ruaf6e{=7`l&N41B;t6cg!P4Sdo9@F&6p^MJ8xDdEP ze6lf-k~{O%pW+L!#nGqDY77(7qug3a745SD8~Mo630Xl4<&2UCOaX)H0Ioa08gGU)uNa9n znRO@~7D=sI(j&G4Pa;qQ5TQ#9g<SV6ss7tG~e=6;AdoBW;4%OzGW|!fg5eTm} zO;%Rbo^WKhWDg62h79ez72`M<#%q)D)`NX%;>!z7Fw3jSYZ^xCip3V`zVVMdpW!1J z2Q|;mHEkzfj%lD4(yT169>ElnjN}r%+n%@?u1VIDcW2PxvdUAYxf@s4`tm&!R?rv2 z?W$E_}o5W8HvAdVA}^MY6s z;c$3Rde@M6Ls}jn@dS1n^@o)bvO*_d#h4IV18E(*SJnDFS_Y46Hj`s-Z*Z|i5*gk0 z4?ladkN`Zg@NhXJoB}J+$`|iFqv&{f?jAH+fy(%~v`rVm`j?Bem<`SJkz2!Jt-aF> z%mMO_HZTMN0O~sRuNm-0x2D~aB!|kbQklMvOw~ChOW{)A3A2%B# zkUs>B5=bGkK*npPp4-E>ItAsNFU0+Xz(txd7)|A zW{#~S*UdJ3lykU4!=New2P?;B-CpmmYBxHxw$^v{=j>8l#U*D#p<* zE)}g~CN+UdV4`I5Ir+Y9V3S;h$Afj_;9YL#;qCNnnxlv=^fn{ysw10lW`V&B7DZfb z<#FD*CmUWzO&RR3V;@n}r@!*_%kgZ}nH8m&Lb6N~$yD|EhzdbC&%ZU}dPcRX_^GXI zE~OXGXFEY_W{e_s@=)wAkanqJGt_GF z{Z1>+bjV@Rb&s)6BC(Lf14Win%zCLGcR1vB&3gyLS#7mF15Qm5-TUbWnfCi zGND3^r;tM($CJ=k$yQv`*QxqF3Mw?0A0E~xfj-Pq(d?iB#?d5tap5& zanr7UKVb1Ei0pN*0cp3A+#4Hh9%$n7VYdv?F~d2K7T=tc&Tv8Ev8?qIccE$bI=-8A zJ>}>FPq=ni)VhE(mITN@*%&=JuOaa?y1tvM-|70q2FL9Zg399n#zr&2=v4Fi*G3(# zURIAQ6x))q)h~@@)U>Nu?;Yia4?I94Y)2oR_m7f689Q=#=DJNH^T2UlX?o6;B$7Ng zv7JgAkg4YfAhAWj1TTJ>ubZHj-6m*dJC#+A=!gN8NZ=mCk59_IH^S3s(`vT*rTv%L zw5xU7Gv%d2#|4Q8CphEZ=|m{Th21Enf7RdfGn~Dxl%B_3 z3bT{tw*D|c!6&Jq!Afdj-nW0 z#E9u5FpYx@t0^c(PjSx%m*Mw}HBSflmMsTTc_q_OwX8`f2=V!u!R~NRQIacJUi{G< zYQjs;q3Rz3ek2Vp>R%3Cx$?w&V??+6L~4G-6A-zDxN64QSw5zWSPi1l8i#F19*9-;iv$S4( zvT{(2f_8;C#~hxV*OXa&O7Yf}Xu5s2vv{`gOXrA;g_WFRk{dgR9S;@R1e#ph_B^_f zl;zD0&!+wz_@?c(9cI%0NaLRCPB!z!Bqm7=uB?vXWqpLEaKIJLHw;&v_-kC&J{W0N zclu*TajnO79Da1bNKru{Rydn-v}IhA_j`)+l=!vcIJG-XRz`uI7ilGBwvAqG#O@L@ zfLkD*;~C<+og>HEpNUPRX=iB@=Ha56+ytH7|n8GDZhy$Xhr-o z*`C4TO)k$=pGu!VxHl5LyWHHHwh07pat8E;Pph%VBmvizW1Mh8st-vR8`e0`oGFBzG_{Q6MSE)e;PoE8}w=Qz(*@f%EC zY9-V($=dZ%S|nJT612NjU*sGV3@|_$=c(ek;aZgmI&J&CJ9-JqRT@cZUDW;@X`UCo zI`4pLw2UqHUQ*0p%1hgMa%MY=|kcxOZy zR*Z!zBgS#J1fRX@<2qHpjeH}0H;68N*(RJVpUaobMv7L9jBv~Xt~(G)o!v+vZru3S z!@Bi_o#w5n%D0+-+8RglUY?d$+KiVi;)$&_do5wi7Iva0MX>~7$tX!? z3xYV{^Yr-RO1hfs#9n8eE%mj)b8Rd|&QX*VWZi@EYwPa^%MI6upH8@!$`hkiG*wAAgq_-=}l=@P6lI8Z)R+lMMJ+kqd6=DxYO zlE+rlVDoJf#`+c!BE^ri7iP=405@(KJYeJ!2Rzr9>z7l-G%#CQ4P`A@2?Jq;ym{DI zo=H7;&j*8w>8DzCAsO2J{GXwu8`+#Dt8wu2#9H;t8g$0i=FItXJllb|N@@Q$Z*sd#Gesklj4+sYLaleD(n=jH0S>yGv4IZi84{ zz!*y9)mc_e#~_>$k}xsX9W}gp;A?*rS?T^eypkI!yp^`Qwuk`A*6OgH7w(Y2#v3FDE_YywFK%=rKVoG=~DRrrbE>-|OSwT}&0ul8@* zT@v~@U0{PJ8yT=!a!CO2O?f|tJW-=*8ePo#hNQ8;j^bM=TMr|G0cg~-AtSd;jE>dp zy622q{{X==Xg(a(FCesgl$PGt5yt*N#(r)?GLA~;YYgynf#BjXP0yL=jnx*NmdD9f zSGuoIN!xY7Jor`rpNRy zClbeITGsO3<&ndytZ2eA08xd`FbVJYeIemb7;1kKJU^*Hpy{`|jl^)X&38S<>7aJq zw`^>z8AE>-?1f{;8Lx!DwfseCWGqGWkyylVEkvXMMtKXIjOX&NZ1_#_+g;Lit6M!< z`Qn9`L~jxxZekeuM&-eE&H)D}73k2Esm9x*n-fc!-EMtBs(5q7dd-Y}7Sv@nvt8H; zts{=$ux5pU+^>QA+>EktPIwru9z7#X)f(DA6KPL1{kb+$T$g)sf(ve#lm+rZ;{@&_ zu4{ETM80cC!c-SB@yro@1QdN#hvhFzqayctfQ*YUC_XRqR33H>3vu$hPPl>K??oH04 z;l^@?(PL?1XwNuki+AUkc! zsKNt~Ip@D`KGuFC_=n-=i0?cd;$0TWY(gZBYZQ_?CPyu9#mP{|CvHd_E-T#@)5Fv0 z`c=)f-Rpv2w7i`q4kRBkMjs`}U@?)n9P`a-T4?urCGMN7MFck2ntCV<@kXyEMkL!N z4(7q>)DfIlfTQ?7U)En=S@i|Eff34xBe%H+p%tVjpndV`J$~FUyzk3-z+3CSri+>ID-0O}a+t{b#T_Z%k^Y1jf^tra4`IGGO z*sqfet@oWD??ba0Bx8_xubD5jePdplJ4p5GEB^rO%a%wXwIUmhrM~lS*u-w*u10f? zYuYrwAKBgO7naOcJ1Npe+{m`kL=dP9!H|Q6AQDvV#~!uFNe{yrJY@>$P)!Zh(#S`c z$u*S4jyD+*6o3Zi-~+(MGfxX%s+^%Xy*7W=r$UTp6w$JPSzihmZUn1;jdYJWF&i#1amAWMGUp zrFxvQl`q{Zzc*u&wACt>Z1nv)*T$YG@}4V5?yQ>hNg7E3SBa%0w$|FY+w0TQxUR>< zdQ7^Uf-AWjQ@x(-yjP1kA7-?K6)P-J=jPl%94S4`c-EKWpB^T!9=!~a8xRil zjGvn$jl(?i)YsXQHRr>73k_RG(;D>aaINgxrlV>nWiw%<+(QDaGm;AN-ms|&$D+Bd zJXCu1K4<=1}2Va$B%H!J|t7hYVkD)i*zvHp z`Yx+?4v{t8wY==UQbczd0K*KNC}0mNa5KTcud03z-0HAFCb4m*-Rf77jfd?Adcivp zv7K3QvQS9sNZL+0!OgbR{0SAdnXBt}x^A@F7CB|HSs}QyU=HK8Q5n<@Ljl3!yKe#f zXYeSR{=uFiuW*3eG)x)9c~oW}Ep@yrtR>c;u))g1WsA#F}8%^vjgLir@P=nWQd1cNTWW$a&}REzo&YCqlg|$iSQJS7#NsrYEoVl!lKOb=H(CiYuMQLk7|0-yGN-R>*B!5Dw-edVuQY*&o0USqum_Od z$2~@C+hx~$NZuD7F4Q)}Q)z-*c~A^ZpOnTpU8mH0R{`VAWBWtH5Z{=R2=3!4EU`tk zWsnd{00sjw7;INU=6j+Quc6@bTWXrb>fq&}Qtt8|eR#(__O0u!QSW>^H`$>AYiVGL zOppM`BXAvZaf9`&>kVG&=EJ#RhQa*yU_=RJ0VIG@* zV+&j=6t|I(5DCss4_<=+iqf#sw0%-(Ce&@=7O;W8%S0115DpY^oLA1)&`Pj1-N?yA zSBZlVPJ0hrV!CY)UB8vtTLE5?LiHgnHCa4}iFDzWh2hHWL&EG}nQV<=4w0dVHl%P7hkEs9wvY+S@J8wG+bZSVy?Z6}Sb0Zf&IfIjtp2 zo8o3MZY<{xpLKCDXSEV6h}kjkK*V%xD8a`ZS68F>W=qHwuafG{&7EM9NFg$=xMR=Eya1yf<2Av@p{8ga7x4Yrv{@BpDV1BU zRf+C6Vrd-dN{S0wiuQ%iE(IpK7mnulRBqrnK>8t?-*@5R)2)QJ$xB z0zVAaa;UatMM-LRUMs%UV77%WZ6LL^T>knMATokE4V<^&abA0MuZ6yZX;$Xy*{~K> zjE4+Ag#L$~)z;}AGVq=6+3Z$H;DRCnhUpe~ofo%IRFVG9GhH`{d{f}aU~M{t#w};wC+>(ad)Gs{Lm)d>xxgJz!(2^>pocFdD zBH>PAbHUCtitR4-`1Knfv&aes`My!l9l83}ZcgTwvC7&(eE$HuC|iTOjtAq?uE}Er zOS*Bl*PlwwH`jJ?`EWFx=Q$Y0dR8Oq6Bo?H$VlgRtu=NRI#}k4S9qWRDCwT39+g&0 zX(fJyXV7}rKW%diq@rbliowoO9X-3)^vnR*VH`cDt9LqW?WMZEmP5O33VQS3 z9+awCiV|yck7$b%7#YPmVk;ij#_#D{?WNoZ-cZ0kGC{6-_9wStE1tYHVI|n!5=41* z4Zt|s3GFb}0oZ5@M;-$+0_@!Gm=KFdb(NRr_;k6yT_ZpGZ-JmN{oK9#kk z*vE5pk<16p&Pm45J!^hlFG`7IxrOqe;CgfESXWXA*ZmhK0~tIMPgk&TPV2-Pwv#SlnQ#Ft*gS5}QPUYU$=i79 z8*N(JD_dx8OcD83;zTX9=Om7JW9!9!q^b0LyN#F~;X{ zypiqC8KKl@h|rCXaF4}W_P=!wnP`h?7;ipXfJngL5V*iSG2ig2J|Xdg!tuj!9&-sP z8QX}+PnWKF_c-fZo|C5B!w}SU8~E&Dm=hcda_lm27y>X3J?Yoi8b!l>xK93kx`7x) z{nkfJWO4cPS}ACqjQyJCX8xb5Ygd;sw6nBm0Bx$g^~eNO$^Iv`s>^F3EX20r2*D@V z56-yDM$~mhlk5_z%EY@ImEaEMsoVHc;qArk&^rqdMmRj5n?9A*8M_?Pp$7FfW$~)s zq?Y$g3^RPL%78Nk{vL<%tJgLwYMJoXhXsHZ=1YtD zSImuLO~{~RdiNum>9p&Miz`I7)UzbZ4#0?a1mgf_mFZO3pR=>HMbRL&(X^I*KTG>$ zsH|qVkOoEiVDuHvNv>OJVXZ`B-A3socRLh;&~h?yo-xf{iaY3pw(!jiG3-CPVo7Ju z91INg>s)TNXJ=<&<-GDsbf-I%fgW?uzpX=dG^Gxuy;}TOOK&t1`I40g7BTXGPB1$1 zK+inlxh+m;{O|1>`6Zkd!{>v?MbBEvy_)hwirPH1fr%ZyZoHqRSbN<=Rkiypye4uo zcvGHmdUdR)Ra(bfD7)OJHm_@$64oq6>5A9Ub=#Xju~|o%UnCr5j(XK? zH$}BT?Qq+qE@Q_HjC0f0y%SCF-L{`-HCHCuXAR{S0YfjMjxbND?MfOeq*Uc?4r24f zw@&6eyN5#9$__Gd=~<9p#T-PuYU?N9eK`DS!ojs|ekmn%MJu$Z!(;*9u*j~4Zw^}B zY6Qm2*6mMN-$a{XuR;&9#)U+s3(HH?GmfN$*&iR9E-+MQp=L!{xvn0D9-rvDcw#B#%MA zzQ5G~@?;@o0hu=tHx3E>YBKX$FO?qlj19=Z5k7y~uH=^Ckh(+en@$d_lD$Qgz)(>2%WUMIY>S(4g$Rh>y? zgq0lUpeArb5lM00HHRV$4UbIj^Fw#Jgv2Hb9}WaG-bnI#*++&Ej1JV}>Z9nhnhqm~i4P zhvp6g5;m3Y0rsyj(|lW~TT7=Kxi{O`>?Sn%ONhwhJ$c3rbUKfSS5=nwvjD!!p5_Mvz7ySHh{U~*d| z0o#&)D&1mqvl_xaWYf_d)`M}STk4_-9NJsUf#*5K+;V?D-K(J1U&Gc{Cgt_H8diV!*Mq)b5Pfq~THJ#+P_t);n*7Atk!zcNO4;4mF|ARe6L*EM)8 z(WV-&HjMPCqt%mcs}YiG7-e5IT#bXA;Abbd;Z$!lT^{R7o5bJR5l1^rcGUxH$;Yf6Y9*}`1n%rtsIM~dEuFZ!iS;R0%vj?x1oS;Q86W<--CquC zcMcKRQb+*6A2A>vqz*DiHG$%7CjLtYnpr&A)y79w$8W$@sxCT>R8K}a(?ioPf?k`6 zA~OE~%eY_e@G#``_2RLhu+uKD{?C4r2;gQ{cy@;?pS{jOBD;$#t0=q|0J(t@_TS7$ zY=Z2p+=d-`W9eLeo8raNA^qN+1;x-3C!IR)U5&sYPZ=KcmovGyy3xHYwai*;*?pmI zVaSp{ml71`X>9c1@+%uypGMOb+*-mVl%&NPh5I?*Qx1#8`Jf8*K7u8;VZSHT(cfY+(5zpbaLHjiBjd2 z+dSE1wP+`}csJrr$tFn1AYpJ1P(kOfHEY7Ug{o>zHSAtsW=B!DfwfO62SQDHHnpH> zi*pb5O{2YvRAnmVy+=FYd` zh-785)9x0^Jc6MH&^F}!*vHI!n({49{_|7SW4NA1lp}%*{-fMiRjK$#ShCe3({90< zOO*_cqvaVm>-bi@UICKA=-AIQnHZnlg!zXZewDOiQRs5Ybm6F$`n`haY>ANvO#-^yb;>*1wSJUH$+UYKBZP%dO z6fpp2=2bZM#d#Hur)y<$i)m)}R`5A39^OkiofTh>3T1ifyrab#h%)d4=(d2>h zfx*Tz$sKFeygl&JON~A|%{_w6fL$eTy^b3M~ALe4EeODi&tBq$Jo2N^sz zdE{0-?wP5Z7S(67FKKOuc8}&N52(-c6jG>`mK2kFvujJ#Y$A~B(0S3kG3`S#?ipTy z9Q5geMRWS6iARWaW3K8`$#4u|7%$6>qZlebJpMJ#j~&Ntd~Fm9yIE8K8-ap31Y)Lb zPfEAk5-7-%3KXv0qdcCR;85H~qpj?E9))?NOCv(pO#(JTnGegj_3NGpt`Ek39GVSU z3%F%T;+`?GSlBkwJ23b4t6FvMg{+`o?HT4PE6K!3yhfmWpHfd;bQRiYN5fj3z?M0h zdt@N_Za!_pkQ{MosSJcR0YQAz!gYa<&~CoC5mPDj-Y-V*QR(|!8ba!Ig`Wp%(`u)a*W@nn`sDGB3&wf4qwX*7WRQ1a6@lq zXCoY79M>bP>pFg$t6a>n7q^)@~3gj0@=^| zBCPncR?u}zmeX_#CbfweIx{dV{C(y;GWm9X(80KY&$zwD~6mhBoM zw#JL)Y^WLMJdFC*?xvcaWT{EY_PRLzQvU$NdhVY80BbER+6CI`02u_12*A!d`qir$ zH5&~&3%zb;ig-538OUwm3}BAO7(azUp!o93PP3ZNSG6*vXyO(?HwNq*9dZq1eXs2h z!KmwY@+?wF+%mT@W91|0den2NEzXps8FIMjdB(3Ur{djySgpT!+gZM10XXZ;cK#gj zUFV0bW4YCUfv$*j3>Z z4!oZA%}IM}eRX%_M=Vym%y4;mb`OjOEPuVvO6IAEHwqs+OY#t#qbx^qc&EwkzAWAi_raKoX%&)($mT|_$4YKABfz2yFK?2$oGe8Ywf zkPZOoI&oa$XxiqtZ>Zd@%!VNz86=UgvTYdKl6VK}T}OcIBbQ8?T|r2D1wvOm$V{BD zVbd9}W`+8nJB)T$y~*_lv)24H`eoFH3%hxwc;jJ&lw<%hdSk6{@LpYM7DCMoQj;N& zNQ%M0U_L{;f)x9HmDhNeOTQs63=%DbaDfuL`IT}v zV+4%)*F=_uVJa&e2Z(pvU(bJZjuzzZR&aCfeGNrrpv4#yX1Vd}}_Jb+2A)I{o(fZWuU)qr^&#K2!4Ga537v<~!S4 zoh7VhBwNZ{0-Pu#80ptF9IiVY61E~P6*Wx%)BNVsEa$${PL+FL>h8*x?<$paVt62t z_j#?IbHEAVnFz+UW)P=i<|yVh+fGZ}Jb%D`8qj2p z>r~a`h(sZjq(!y@_&Co_K|BiRY+cIL<5F{4L?{4nBjc*y*he)ae9n;ahVcf19r$oaAHD zyi>z>dM%}^cv5(!TN{Q3W!yeyJr5%wgVUPtEufde`eoqIt_8bB>W>+01gC8oBW0^^DeHHMZ3}+lPiW z92Oh`du=B;s+L-?yJHNlE-j)f=9J*BdV$kD39fXev@X>x?vi~qZVRUHeAtz;I6Vj% z$rX~`$nKnFYssFw;ewi$k98)qBHhPspm`D|79+nHP;uPkk(#?}py;}Rif9+hg<@rK zj0SK{9And`y?LO~FIpI6lKpm0?us`s4YY%t91;lWoL7J0s11b4YIPvH301)=t)8GB zo%&|F>0K>Zd+Ak~wM{=$wY#){8K(Wm zn4oo1e}@>z#dY@$CFJs@&HBb~W!R5$#Zo^k;0A7T3F(?O3GePSgs`*n{?_st3G&Eh z+H;uPmBVqKGf`5S>S<2AuV!latKwbXi99`Pp=v87TKqc@6dGXz#3dEP_$~xG*4Z1E~b{ zqRP_uQF!m~?0oBZWM&XV08z#cJLf&A(x#xT1a(4`EveIZcTq{T{{S;lk! z=&VgQP3(S-Cx+5%2&7OFMpno@8F7qP$=?>H@YT+pccU}_%Md8c%e7ULrai&#D({1S zC+b$^o5h-x_HtX}4EbmZ4uji1n9q8z@iXEF!~K6kySURWMcnTjCB?vrzD8m4?Id*F z&TGuYVmZ~3=iqR2qh2qS**=HDm*3gCa!+M6VrXRA@X8#62`&Q@#~^@452!h>N78;D zcpFpj{I{`do^|{YiJB0*6M$Ha?boI_sE2|yJMB5-zr32x_1ymDVlKN6A$jh5=C6Ok zCYHK;>2paUD?}PHsw5cfHudTGR~8R4q+!RwwY)aEjA)X36e@m0p6_ud_i;kQ=85;rgn z>ODQHPgn3K#Mq*3XIi_G#bujtj#k=OHhEb4@z4=pXn1>B@NdIE4lb9bT&2dLE(>mC zl2&YRfQ)cCub#Y9;@wNeejOdJCsrwi`7N>>x9IHbI{(RAsy-a#$9JVBuf2vFR7-Hts$AJV*w#@a@SsNB8oi>OH) zmd86*BE{H_o3n$+@7la<%L`JiIYykGr#@7vM-Zo3U)01%HFdUz>q@Xu~-}?KyAE8Q} zCuv7;w(-67>??0=YZsrG{E`!h!l^GPxKWSC05zYXrE8&y%O5fJt;1M(VHMoPa>}uFvhzMdB?zJUgq)KkxTSs~L@= zQI%9?&L40YOuLXB=tGz$J1lQIlRFxw(enxw{1rg;c(n! zj^KLNf2xZw2u3fwGaam};o}gxL6pcJfpIbRE!L8bB>s= zI}t)FRk77a7^@{4`^%?u$L~HbX)mdyq8&!s%uBc0G(Dl{ad7~RYQl5jM-0Q;W zEZHVV=19@6BiV_;$%;n<3%j4vz0bft6|mCfdwqKKR^v~dnk!%o=^_lxBQvY1DhJAT z_7&y&r;IfXN-aV?Ry%2J=8`$4nH0kjUBD;F7yy(UZo?Cd?ykGS7Q1yTSZ?(RVJIPc zJG&plPBoPbY4I(qf4n6%>MvFBqeRQP509>n~q zkufenkd`cma{-<}&!t0u;Y*DdM>@u!(COQP{i9E1^N}G_l#LiS&H>wiz>s+dwROMn zi`vgHxY4g6^ByT<)n(uQlPCy40I2|NVo6p9+XlGL6hP}0nbh?dZsPJ4HULr4lOa?B ze)DIO>z>_Ht>$^qQf|vb$|TjiH>F)_S0dI;O8VfTjwqxsL>dBiwj1OJwYJx9b-g;$<5#nlN|P955WaXNhp(p@uRj}7T)yi)yq*wsWf`N=EOqUF zMZZlaR@9#7Nw>F2C5j!7Y*OeKLJOF{3=brN*#u*n?tC%ut3>hj&Bm|bp>JWVMngTk zZ0o)`2343d5~YYeFs+U&=PP|TLB7(hwVP{6p_py6biA8zlHq|aV+x7_j(9t^@y>Bx z*YK;wr@}33uYY5;v@c;SMs=0Uw^GD~k#YAz7RKI$9P@*U@@ctqrzfKPPjeMY5v4C= zz2~9i{{RtuKdX3RYwa&xlXJ{Q*IA@%-z^Z9GJ}5RThZgUz;-2Z*Qv z!r*=GgoBR6SJJ*D@n)H?czX8g+6$Y_LiTHMb0^Ou#U<85M~$U9Eww_PIW=0t;fH{< zuL$Z##d3Y7`XHc(%yPqXL4@0OtdNo_ptt^zVjxpNy_`taxHc68nDH zKw=Qb{6<1}3+hi#t#M*&I89j_*QFW3^0JS`sjmDj;|u%STg!`~!%AJ91Bcwbc0cPVpV@if?rrms`_s zJj)4Jc_V~KepSP9mFb)en&UN30Qiqgv4-mUU}3s%w4^IC$QXbFGVLS`bRhFnTC|?W zRu+Uklw&umIxhuk7Lh=+UMful7ZHdol}J}WHkK?n&J+eGl5y9!rC)d>QhPPkyb!)SeR1@8z~wZI@EBp4Q;T@%e)d9FH3na90oN558-Hljd@{*NKdy zG@<_h0Ojtre;9bT#){S&pV@A&;we3pajm*S*67is1(XhUFCzn!&2l$h6uFnhV^-Ae zt}WsJ09KMr8s<3w>JiW$r=T4w_kvp1;A%JCGB-E5islbWknQMRhD>#J4eq&N4Va2Xmfl>Ys$(De&c_&!u>y zNVu3rr)|kV=_)7;esRel9mElg42tjORXx`1j#q@_O{H^>irn~Fq>nBucjzJj@WUYCde?hvaM%7PZxODSb>a)Tr?-P@#SpaewhWPb%{oVQ zrc6}I;Yz95JT0&`);J^{R|h*?j*O0un=$5i7#$$+n<-Sa1vw(0w-~o=c^oN5kwQH>= z{{T|)*@7)H?$#+TE;p5)JD3=O@|;Rp*8_5~#yH}fu`T<{pj5-kD(87W!+EuD3EpXu zUM{b4S)emdfazt2?@UzE_p-O{%qvnoAAWByNg3Fw9k~lp* zYwIrr_}g04_5FH32o}}sQsNlx?QRa)79fik?)W5*G1!62X1IThejCv)cj`0QUs!8# z-9Z}PI(e|gJ26*Anm3hRGMOPpSPWMrD)UR38PVsZQ<8f#$^2oWyt@6KvvX_xkrnje zCT4RaajdA0WNvpD<6qtmGq)p}*70A0?0lFs%Y9PYR=Lw7x1JcS8H6$@ZSE%DlB4E3 zRdO(M*CM?K!@d~Pd`YF;X-4*YyS+Ym4A+Sdnq-ZESzu_{cPht{LjuH);TXkfX_}z$ zMfJpfBAUw9X0$LBNW9bbYjqOB=P8EW4nPfpr#&(&sZKR-9nOhM*|gT@!uQ@4xVeqA zSz<)GhG=4vXr4r00up(=yskHXR04C51I;PmQzo#W%FY1UBbHj*Uv zx?oICzYLD7e(y|uG5%#XhqmO6GyNhk!7%n!hYv;cY!{Mu67k!rOy|s*LWs(_l zks_-Y*bIer92_y}#!r7I9Z5p+iqRcdJW`tEs8E-|qebxy(F)82AS6{=yw@ zPqtghB1z=iCRP}{v>4n-0SUnac2sebSpNVHya%Se^l-}z+J>Dly3{QKI;5fCBM6xD zF`d}tbDZM1mLi;E%~72drOPjL)z-WPrs_vV>oz&?j%1OSmd(q9s1(EQ^Q^?_;KR9*?mQd}`|!cw z+wEUck{=mqmy%uSvB=S01$GMY75&Y|!a@(9mpq0mo(VPRIxmgvwap(|8i3N$FA&AK zCAp26jH?*fTqy^8l?(EoI_D(k2T<`=x#8UtOp5zihg*+Mj9klTjVzu+GcXMxAjbG0 z4Xko|@zr2)F_*rUy@{Z*taN{i7g`R1s%S?~mI=43Ktx-hiP|ZZfn_HpP8cri zjN@s|ao#Wensr$&=C;#xX*9WFv}>DbeDNi{!sIAME%#*g=VE8}dW8yD{H};m-`jzIZr&~Ohw`U)0k9>=t zF$0C#q@t1u>UhT$(OVfCS~@q}=c(-@X(RGp=fihalH6NrFuZbGOXW&BDmOe5ILX1s zJlD5)6X8eN^r^MYKUa=DMGXUko*y{{Rw=C&LV6)3t9??^(nxLI{cXZIk*&$VE-|n$ zWjj=uOKYgD(G!?mp;TBv;I0YiE3+-cik<{m_h*YI$vbDCg;*S>TcUoJ_kXyn81}nE9`HozwC?o(FoUkAt z&zW^!gdQi78xy1Iaofr*l|{A2%aoCb{peX0a01}q62(Uyd9FLc+U$NJy-O`>>L^m( zmPvy}wr5sAdDwDxZrTa@kTYKUs%g3gnLW3I^h>Lo<OMS<>-#$X+$1)SC9(roKm+2Of~?Zv!Nx0exJ?l!bQs_uS69CAoG$38Eqe$f~D$#WybEO%}`XS9-f)6mbHHmY2ns+^&6OVcpf#p zvbkN(Wo7`nxg(Bqj&om5_$xv29QHqC(e()K4#kb&XjTbkwQ{WBo!>b_oN{;`_&vB> zO*Yh5UWS;gGpC{PeUI3pzP&f`MJkQnQqP{a<%R+Gz^>208ax`^mG!h&4GUa`K!G3E{8!ImlYkGf&bvuT# zaU5xJnEc2#lAC2k&JQ88x18sU*R}Y5&sUGgj{fGwH2X!}1ko7`A|f{DDDbZBtfa7w zf}Z&U@HO;L!~Xz{J{0jjf|pR=A2n1(HMGjcOH(lju?ZV!F=Q58vD!GRJ|?&D?}DtM z)U9pcFvl!xWsc5owM!iGCe()FA_6j<#EksPaycCJD8g~%n*NdHO07zAx;_om{sefl zQ`XJRu8Qjv3O>+*HXbvO6rIh}w`%f#5O^Mc4|s^%U)xJ>*3~0VR(e)P8XVSHR zW59|sTISiLjdwBJ%<82240ica`c9)9^-9>%n zP33&b+mc1x2yl2LV;x3E9_!;jhx6$^4n8^XjH1U*o#9buZrIvir2!8^QY?&T3W#;?=7c>Euv7rF;@iuZMh@m2ROm>;q{*r_+~!~N#VuuM1MQ2 z&AwnsVR*^OOvXtkaLXyc2Rt4tgAW)aS28cvn0e{N5$!*`_EG;&DeidI z=p>rjG89KWys?3T8vp|Cs!tnv$3iRSj}=>L`Vw3C6_l=TC8#at^K&n1C_;=!n%IR7)qglskau71a;Ku&|bhAhS z3^9|zIO$(&{5<$0;r{@J7Z<)F@Vt{rHN9Y(Ij*N!mrR>U zxH^;&#`1ZRCzXiPe<3pX##xBuFTY&ZHB1Z>_YRn55w5lAl>pXC6u=u^%cYGms-`uoHrVnk7GM8;$MfcptHG6 zO6Nj((%iJG3EL!sMIlKHi`T9}FTn$?cxR2i8hDKO!uw2`S$wO;lIj>Dk2#M#v+zg* zp1nE_wSvQPd?ue;_K)5(^-XufekAZrw%!MdRMc&*Ars9yDM|CR;a77Qve>|2Lv+a? z*7l#R`1HUB#BD|IptiJ-{{Uqe{IpAG)RvSyU}9Aqu2*Rp8Lkh(489YV>%-E?Y(Cmm zZaMO#w~`5WgK!)pF9hM2JP%$g+&opRYO8&uTpNU&M!bz-otoTzj%+wtF>uZZJ2DOx zgK#_7l;?RkTI;##!kl?jx}Oqwhd{sZZ;7MS^sL`$b$$~XezUGw>h@Y}+Iw6HE+d8*e3;SE_Z3mJ#yXr3F_FmT zy$CC%Cbc>0)V7JAIe3r3*Z%+y_4^3!bp^7PSe4{PlL(*;GB*v$IUOz>bIO&d< zuQa)}OI<{yw=mpB=zvOqs8GLjkC+_et$ius{{S0!Uq;fcwCFCP7fM9Z-b6!A&$DSl z*xXQY!8{Op*EL7WvO2A$)70`E2jH#E`^v9zHHN0)~ak=QnV4q(oV_}NeCracPA=$57xVB%}r~ehb-f|(DGjl zd`8qRL|z-av$SX>Unb%l`Ceeb&R0Ehaxu{KuHRnqAAl`mw$TDigkiqVE+mI$0pN`C zTpW51=Da(_nri6N%X;Y=U5QC%f?qNs%1FrI5u9fp^}^rlH=4c7cM=3iU_h)%!EL_Z zjSinS#*lGN?OgZUJsUy4vAKI2a}1KsUN;dEfd)QCayZXycly>2jx97zYJDdU-NCOfZyWf6*4M~_@q&@Gg~(P1wkm~%<<0fn+PwqaeM-;X?{aeP6#Ll{8E4gy0 z(gTn^c{u$ml8ePUlfyI;+_I&^WlPNebH_cSO?LTMA3IVr>Oee`)9GCfk?_w`@x8sqt)&EpMfsg& zl~rV7$8b}gHk@$XbH{q~9Re$Z6e8=*Se%w!j;o!$i*i?k-xb>UZ^W|b+NI6Cq5C#i zq9Y?ugy6Br7$u16JJ(8@<+0~fr!HpT^)^q3;_z;*4wvFsjmFsuyecv>!yhvS=ne?l zImxcOM85C^>&XmOk-#O&scri~9gicatj!}>)a`sjI%_bi+TUhO$QR8~D;`v^FNNfl zUiHLky48-4tzBuJXt*}g5VD9uE3c}k!OjnUX~Ph&WQXje*SyY}O$odcsQ&aE5U;1C;; z?l5cEygz%Qc)LN9MbvG4+e^a28NAeIiO^wLlRJ>-Irgqf-@u+JwvF_Qz_3^n)5bt% z6RKrHC=2ss@Ho#k(9?ROCn%?O^)B4}I`DUj?I6|sDXEBc37907GJqpy;AKkZ9lsw+ z)$s4be-HS6=6HNcW4X9SERsbekFYK>v53m${hPLUtnUVRKTexe@&($Pm>*-ro0P^w z5r9|aIr`TN;#=Fj6ULghp9z*UwYXrZD}3X*C;jfdGg!4{YmP0qW8d$u{3WGWDbl5i z&iI2M4;ReH4;W`7=Od5_K9%L(Eb#|~^|+G8`r1jSWexVW7-++DoTvlvu3~$J@kWle z7X?z{ClU!=zW8o7f!u+>?NjKMciK&t_JlUjJf)0d?Py#s(Z&(DC%@9T93y^yr(U+O z`Th_IG{dgwnyXwwfHv1wiJL#&4UGOGtGw;i$j3Fmqj$W#fzeE>mx7A!yj-7UQVxj+Mk*S__#S ztpj-=fC=l;p^m~vVlptjH*s4g`<*_`TGl-aQ1SKM)v1QzcS({~O#0V5HlZ!ex-H`5 z{{XbOKA_~)AM7dosOKudWCI5ykI$Np@)Kk{tANI664Ak0l zMLp7svJ7PM3Barcaz{LKjGl8=RGr{3>(;K~erKZ=(JfHJY$Nj-xqRmX+t=`^<<>Nt zXbQ!WPBO!<>t1&nsbbRQdyi_p6sdDz{hJ&>$YjWy1hWJFN99RemXY3gdsNcjSB>vC z3soRWA_I9G^v@YJrGKmG)5_8Bctewb$0r|OrFp~YI*po!=aY=DtyCIry7D#5F_~}( zB$1vyiOp=IrP+%}^*c0%Rr26fe>;V8aScEI)-u0{0MwOMU0qIl%C1ahM- z^!2Y=(mYvnVGMs{lI4Vvl{2@?y$R|WNbAzHbqyz1n(D_^(d?E>aLUcTJ=p`3$j=8q ziRnaD-QL9eNk?2&WnBd+}dy+59QdQdW}E6p{{qc)+Q^I3YpnpIWCE!zgZSyss)7 zdyJMbIoBE59Xo1~H%*jR^qvC=t(3b~AVZxnp(rP{})!7bIyWe8L9F9QH{Ca&BaZsSagSG?VC6~QWzmMbGCY!B{^ zIqrH_*mnN_4*Vs3dv9?rpCE|{c7dPF&fY^XBbGhE81}_&{{X_5@TRSJ+P=IeF!hSr z<@tyo?*9NFMRmnPx#m~Q;-z?_;w>=Abr0ELwkqyKaj?o{dLLiTwOc{et>iICHj$Sj zc1}nC0II&Z*ZdWy6^hrw(TzGQMcejiqhPJSqi*hhTJ!t;9&3F<8y#kN;Epuh&k$x2~!g8Rv$@j?Mel^R(;Tz3*>TO2mITqNH ze95-{?j+zBKN!*ZOQ9{#oMQ~W-gTAnNGYlVi=Iev5*X{6^EW55`%LD4)ZpgyA| z)Y_HT_Le+@62?58nB=)9uNcj9&XT>^+Or787Tob)3wS?JxwJ`jSNjw)%w|=VJWSr| zI^^dABCmM&PTi(OX=Egk;W-{-0z#9Ix;;rAweFW59`LXByzu!lkF!LrEz8dG2+76( z8OBJ-=~>oZ8MD*1*)+U^|A4`lLg+B zs5;(3FPQ2;-Uw9~>M_?f-D$sW`vuOX%+MqawTaHs&A|Nig1g(0J^BuvdscFXW4@LuH5Zx2>YAm+ z-Hf(2kLJxgA2r#s6;D9Egk!Z|(6x;ZP4e_h5TfPdCFJ>X(hOshz!j^d_)OW@Ur%)s z?~ih%vN6dR%WYoXfY%>wrg(17MwCM&nI3eeRV(GLGqqTcnAq8IPS?^O z66#v@>53RxS{;z6#^44{dK}j!s_VC!jraN^$mze#BOC$zJF)Fo6G6Y!v`d{r(%rtx zWH-#gI8QOKGwa1R^T8U|hfbXwu{_Y~K3t6)ZL)O|jG^0tMpW_bTwJP7=<80$tauMm z(HY{g*Dh8URT8FS4kT>nVL1SL3g`Sq5XE z*K4W)ZXV(H;xtr&Jrc*fzScguslAucXG=2 zOi@t_=m%U?FqqXdGk9i8fCXePTmT)?s zZ*D4kKM-Br$1T08G6zz;H#qb@-TKvU4rr})VAnD*`xq>*AU``W9EBa~T@%WKQ@4W7 zC%t)`qgyECj2s=q7^lk7jFQ-=_Id3Ic>Zm?@$()!@lie3+2ES!My_PalI!;icNjk@ z^r`$sE~}^cwx-b9+#~RWr%K6UP{I`#>YiBcK~WJH0(ibTbW-)EHx;tMP z--S8r+xpk0==$xhwWw+OEEZ7Nm_uxliNoM`1fF{Rb6hpuq$>oPj-hbq^Pk-!DZ_dL z-=%kc2R3@Hmp!fOCz{I8+seoUqi-m=#(wv|O46lYcT*@*N!=J8BJtk6ZK*Z9m+tDT zYgRiTN*}}YJ$qf7P@OtHmu=J6`bQ6K|gmnsEs#kz`57^ zClTTw5NTc>)*D5JN4UtuvPaZNS0!=@1y#G_Kc#c`Rsh?}d1*J=P6%fRKsoEf42*p% z&!)VZU2f*@XOyioGAf<`2cSOHtv0i940288oIH4V$2kCs+uF9dSk*gfj#l$ZyM{KJ zVEbPT8MB55(yIReVBTDeLlYt&yg|oa+|+hWsq5PCXK4!Ob`EeAIsiIj(!GaIvW3B2 zMm@WvRsbEHo%@?RbU0bDl`IJN=B}j|7iJ}1 zGFy~2Jug)e3#ipv7S2L9-2>LWi{Yi$iKg(@r46Uc3|KqejC`ob2tfP88Rop`+nZ^m zl55XCB0vwFic|rEk8Z-cjXPhwmKiLqW<|1(_q%hoOLXg>Pg+zZ?{c#`_i)hYyf5PG zyZQeBvwTEK&m)zI_6_U@sNNFi$zit*uwYvg;yy*n=g^$7zJ*6miv?pzG4QqbC(-xzAEO(pJ## zAicEIukLT=Yr7P;IA)Phs}ar>xIFb7cds_J@u^Q9+T3Y{#7^rOS39yv>T)sH71dqn z7kZ>hi$9j{21x6Y7Xy!{dhi`PPSvHQ#QLLA z)I3Y8MR1?l#t7Mml48c?amXVF)6=zclXzm@NTp8^Yk=LV`H{i%6(k-)wg}EXmB>M_ z-Hb-%rv&ZdLy&(0YeM>aiR?}8p#X;7EF?r7%t-1<&w9?Ks(Z+)aB%llhDMcTV-~iT zQmnFD7ug)DxDH1c=bjCEUyOWQnl;UppNCYz&%0q{cCqs{?V6Bv%8cby0{`B<#5S^oxz7A{{YuYikxnTh^GpTH@Z2u)T8k| zytX$mwVcs;lKJjkhT;HN%90fa9dVrXtO6iMeb-50;~h4tXZImA>&6@}n)HikCepN}U1l)^*70m} zAo-cO@T|p|vWb1O^h5<($^y};IiY_#d5bBz#v(*YZ z+xcvBxaCxqWPSm_QAd*R@#Gqx0b;qWAiq6zET`FBK7cvW0R*}AJsd1hL zJLk1wC1!6Iq2^k?nWjlLDC4F{!RgOhTmJwEUh1;h!*L`t$ltp_ zTq(6E480q({#&4x0W@OydfiOj1ET!xa*p?sJ@eJKih3!S*MYNk;bk2v~Dm@ ztscTJRtl_>vLezv2jPtuPQSL*=0QA2d4cl5 z#D*-KkUcAr)^$C43;CKT5jUX@&GRWF@K+r>U>{1c;9J}4-B#us*wL2W##Uc5I4(YH zemKQpS;4+oqUkB5ZjIluuTZ%0M~3v9AMDwgwoK?- zXyz_*a=lImrFiwEI**HdT+->5fKMdCLW|Kh;2xxq1x4d6H(Ap>K;vJvk=7Z0aD!)> zhmFCp+zR1J(pEa<6xEKN@#XPOq}EYC`X#iC2LwANat;q599O&ecHc`$H17}T(S%Ew z!4bdAx&ADZ{p@6C>0T}H_fcCVyw&2{5wo^v$dW}eIG7a&<^T|?z#L@v7_VCJUx_Sq zy%P32KrS!d24;{34~B7oxg7>OV!iw%l2__@7~W|uJ_P(vu@F9DsTZ=ZyMPo+0rCyJ*(YOAE!QLd|jK z79b*=U;&PLb*!xq#hN|z%r7SM9%T7ZKKSd-a6rN84_e~H)n3y>uMY_*B_pBIZCB5e zL%)?^wVpN;7Rf=hf-*V$K9%JFt4}?(#B25_oHaR$W{qv4Lmcp^alLuRWAkIDOjo0LgT-2=wJnaB8gJ4dK@!0NZ3Pez0UuMG zA6nyVbZf0HEBzwIcvWrYA-1Se%N|rR{Y7^AEv1}`9lgEFq?SP?xqReFk^DZG?_QNU zYD({OmT#6`Mn{IcGofkvJ>|<>-3Ri<__6z-LFAHo$OgRLEh|p`+=!%-&1DplJ6j`c zb^%T>PDdy573i{9-QD^2mUm_C=9WhrbDu+yKZNmBFTNe$+UfTCth0_=I7SBwf4oOS zUVThFx$M@5bSp*2MtQA=!|e}UzM3fS4W|66MoWSR+na8-;#d2-xfO`q!XZXzgRFSZk4|n{97u zb0n%933AvBIRs-JtGYO9QP~_dtIJf%BgL9@vZ;R#!3s674>Sn5D|8!!^WBvq2a~%QFN*eAuY5Ocq$FembVzlJ2PH;$U^)&BdC!b4ygjGr z#N6CSWt26=xQMejk~JrVT;WFp2iA&^rqRbuwCx=eIsJ1|(Jj0Qt50QrZ)1ONJZdb^ z{`OGEYY?nK<0l|zrfb!_4<>`Bcrw{zyNTqJ8_}U`%Ed!vw-eXDYWVWg#M-xrC%3-1 z(=F~}u%1xnaK)NQFh=dATXqM_^fl?)Cx-k_t7*$M<3Xp}5(G$Q^4nu%2IP_e_pH>? zR&3$MV4a=hdi&`1+O^Hqx?DZV-Q3|LNeU!c$IGzij`_*!(z(;1X?je?O=ESm*Rhm> zIan)5Ps+H?0m-P7L`^Q*%TKq|2BWCmPlS#Mi%A(#$t6f9+dh?{soGy@X5LR2MEZ=j z$i~z@KXu7v2X|WSi_-g^WhYWH<%>L%#=1qNq=Q0^M~?d3lXnbc6;MFHz|Z0;9R~Bn zX{>2BcJlp}#t6<9=@iE%SQCM_Eu43*o5PyT!+5^y#FA*y`By+0OoWZYAA6C`NX~K1 zZg`;FYLHp#T2x+TwWKC93%|_cCB9sPj1yQ+&7ShDQZP`G`Ih`k2Zj7odv{^t3$)YQ z?7TW4W9CQ3&=-!irO(mB|WVXD4 z)tP1);2e+%_Z;MME7p7=rfU{HHoT6{M~33w_BiAwMIJ&lfEH+&;06uT8LoL~&PP&o z?$Q6$`8Mf%ORZi#zO`#D+=ew|ZN#wJGm^yp+#KN1;JrstxYVxnFOm_kA}g@VI-HDq zf_Sd4#kX(Z`Sh^i<&sd6Iy;6*2XHq301u$%xo;2n^Wpp&ys4|l0Msrn$?^Ne&(sZ}DG-ygdrvAe%Y1$!n$kzKj#rLLslZ7fQ!K9;!)2V4jAxwJ3N(E}S?98o zRhrJ;)x?bxDcwKu4Wl7WbJyOs_nKBU!!*6-RMI>rFNz>*nWRWW49sGY%E=(>g&=hw zTI(%5AE#+nt#3J)-rVmg=1I8vf_@7pm+S%vTL)y&}gA!bIlsPKf4lqE*aDNVKN%F!MZ0)4yQd(?r zUL}GpCM)OC?qS5tS~NlP?2{Wv@0BM6bmNMk`kt|+GT3X@PaVgSO0fg@hE;|RDKwoH z&sMyS`g`x)c}(($Mku=!k_j0Hq1%e=^hkU=;w!5!w%kaTvql&NP1CXwl`4ll`)4)7 zPOFpL>#GPxF6#ClqG-Mr)NGEoaAixlFa((yhd;xRJM)h9a?eiHlJ?$9TWRHcmTAJ7 z08&B5a7K4$ocr{y+f})TO4OjT)TM?v8Ddn9TXeRQoxyhm3z-+xf_dvvSl@WN`$`*4 z8bJ)U=_Fom?j(#ha>bOlIO?sW!4kqU_P3GT+!m8%~lT%dYZ31!Tb7ocrMMTJq{Tm7b|3w4wnInLqYLW*O19+;(4A4qRT-p&Bd}v!N~;i@5iNJt2^7Fym^wj%jz0@ zkiE0YKYFf7a=#-CjBX=5oL70H{{Y0k_3qYoi_Tr>2@0blrb!)Z$9!Y2O&m}Copg4a zf~kXrF|Kgf>y!A^Z93}q>cMq8d6+f4h**XNLmrtOdV|`tb*-_q=t`t+&u6vOuj975 z{?$#hG`rFrhiG5nZP^S-Q;>0k{H|TJ+T6B|h?6PA4BTx9z@M1);=E4p#m!+PUR}hO zx2uMdNe=J{Ip;k`wkoBTxM!K=ySieNHs(kh%NxUP0OWDcO69AHx-yOyNgGrnw&!_?JVz z@XK20t_A3k9K}3JvW7$R4d9L3bmF;fE`J@}+Mlvty}SrO+=CeebmOioikxLXd7hOB zU0C%^KTEWR>vi!s4r6o;lerH}A4=&Whf33>xYTT8-FFf(8y9hiV1n!c1K4#Wn(@1B z8(z7&YwbqjOUa2FBxASc103{UY?|)09};UY>uhxdHVDzI4LmALY!@J_Ajr=?hP^sB zakYrWQgGEXe_imFv10|D=h-g4%c(}s8Msf~%m59v1t*M>4?dkM%3@7Y8*7;F*|e2| zba5lA4Dv|p)p1_OtoXkE;S0-gHTIopC@HZ=$QO;txZoTN;C08Xb6zp=7yKsiT3A|K znd~js_liMTB%9T+0*rN~B=k9{Vr3P|(ZzUsP`$A>*Rt)qCSA{ywaH#M$8YCfOJ4XX zBk)9CFw-u7e{pf;#L*(jjoELR0|UVuPDg)g^Q{xXKJHK zdzsiEjzm6ea-(vpshqFWel=rD*W`m%pHZ`ohNok$SDE7Wz(dKZd(BjHo8 zUQKr_ma<&jwbuCG83g14gdM!|k;$$G9Vb`S%$K@+2^`X+3uVD6C`Q|cAc9{CdgOQS zS}CTEC`+Ct?Mqa>@idpZo#<;+W%AZLpa+?f2q>ya1x|6vKDJPf+}Po#Ku{u!BI zZO?EF8y)fn1LJm2r*T^PZl$Mds}-+^CWhUb<|t!erbk7SB1Z%++#vw+bB|nBP41qa z5!CeijYjS(n}m5*VF#Ls>T(iAJ4XYl02Arfl;)Dq)xv zbofieqz{yx-7pSDYwRmq3%?cU1Hw}2(AsGB(gh|*7V!xbZ~@Nj=bR3;E}ihBO7Q)s zn-!EdlfuEJi5nr1bCt-;91+&JDq;Cu92|Gzy<yUk3A{>I{Fwk8H}=r~q6V}J=b z{7r3=0x#~HgMPjo^msv)1mMlo8iwDH2Su*k0zU@$n9$kNYTbpB6%?T(aU^*G@dB@vBXH zRPDCsn|wF%&x=!C6I@5A-@z5M(Y!J?@7^ffRAqn)F_E5gz~Z?N6XDSW;dyRjV=;{2VcW4d z{{Rk^^jC@7!X61R==wIZadB~Or1_SThG$>CRzg5Sjt<^y5>FZUlWoU{6HR7I#YKwg zpkVHn_+Z=>$;aL!w_YoYSxV=*3`L`URLnnz`i0%i^`3>RM+K}hhK4yVU|Eu6WAg4S z4%}xM7#s}Ow0M_A@I|htEu`{ZU)=qiTgj(s3X#MaMgtB2>DP>R=Db_QTE45|xirYF zY>MAS5!$LyL^sLvkQZq}#F7IX99B(~UNqDEO$CRB+1pXOlgPYW7Yac<8AeffJpC(Z zx!B^bN;M_S^k-qOUU|Ft79n`BorJDgdFwhnwmF;E(WD8v3YZKi&GGqXlIQANCEQ%(MX^) zdE56-PR6x0uN?Re(@i(aC8g!;ahrX%?i2uUdEk+^91aC?PQJXNqlde^RmAapo;06L zoLTBfmQT1&yd-EbmfE>fjt>L9eD8Cq*=TwV<*uC_yw_m7A>&5{mP}x<1g1gdd-blH zT-AI_t==V_)UnvuUghE@V4%C8bsm{v!S_C*xS3Cjd;zFS71e}y)>?}Ii7Y}`-X4IY z*v3bw$Q6w0`JTQL2;#2MCxiS_x^|soZLdca^6B%u+vAm0?ZH9^@0hn=3D4`e< zD$2}-T^M9zaL&>?*B#?e8EW1liVqKs5-k$V7c7yWDzXut3Jd_mV0WmBZZ1bu?d?)a z*HfYRb@2*&eLGU{_Kjk;wzmdnn)L#_ixxTExNiAJaQqXHGhBALpz0FMYph@28NamU zW|9#$6~g5~#(6D)w~}#P$AB&Mtuof@!=75lYp5t^XSP{?c!Mefk&q-GDf~N()<=tO zyf30lEu{9(dL%%w!EJEnIKSD(ILD_W(xVSH+ept4lqYnzI{hB=P}W>{N5Su>>2~qN ziSjBW^2$>sWt(r9+uJ;`*~lDL7K?S_e}_IJy|YM>pHPYIWR@Ju5XRl#GImk(HaX+o zsrXyqs%rLDJ}8#rdkFmIV{XbEsLJ%qqhY#Xjym!?^`8$R@TISh8g|uYEgL*`5nr4{ zwjKfQRdsN1@f5Xgm3CR2t7 zB%eX`uMY8NiwM==(Ql-ZQEE(5ydk1h?p7uQjkv+i1$}iVi5pJ%f2!%QLveq5dwnnV zozIj_y0Cl&iFsK5N5%oq%09K_-xa5~SrTAtWO%^%rwOP>)$(9C% zdYBoRlmB(`?swm<+LI`tLu zPsUAB$~oY=(R|xWi@7eKmM<&GMTS=>WBbHo0IBcCB<8(HVcJ$lmkeYoRB%T{aizfj z0BP|iqbzs2ZkWD9T$y&tt+`e+wT9(BQj?4xr`EKz$h0fXMB3fy5$alYr4!rOT|0=B z0!Pj^0k|mLfN|`2svZ^a4YsfF*HF`2P-zz7l6e{hLn=m_w(vnLH;#dq)b$3q8%VA+ zjV*M$*k+n5Inrd60Y+s2usFv6ZRhbHUhk?tTeDSJDOsM4ap5bSJjdbB1EtNwTFxi9 zXd#m32_%e;7z`;;8De&D@R%VsZv}=xdI28kOvHLZY#+t=hri8%-}&@SVksx~8#p6|`3uT*j{% z1o?v_3-b?7xHT@B;%^!Fo58ob_lzuA?OaV8v=FMSEQEuyRQZfew2xf%^{*fCYU}b3bh*7sO+I%I|{2P6U?X=dC^i3Mc5(Bu~s}OKWEs#EC zIl#s-&3bOLuXtSOYoZzt%+UhgiGfejpHpPxef#EwdE&#%v zryl0J-5y10YI)MA>PhnGbiNeSZFF5nSD!`HWwW%J(VEWOve;iV;Q4+?naV4vX2bF_ zMlq3tYs0=N)P5sd+gRxG&kRs2Pc^;H*+s!yfM{{JqVv)R|I!4UPFdVjU$L7vR z7zFmOK6GOjrorr7lat*0K5aI~;h%$U{7YkM_Zp&V2hWNK=G!U}x#ZjzXakTHazW2v zE9V_&#rl4!ub&f5X>X_{&`9QnJlsnO;4H4ecPfvSNZbg{F@b^hCbi>_49%-Nx{17l zOSJ|!y_FnW31mMp-i4D48yt?qJ@ernAk#FBdN?&N30lP8VwQg;lofm1dBI`>Fies< zhX7}w#tG7u8g$<@R;-07OGyi$X`k?r==S$IzLk0*wGfD5xG5#R)g&}v#=wJ>JfE8i z4mxMgz99Je&*687^-C!3B)ykfXx4Q}q?gKjd=D*|Ge4 znt0bn*1SjJ%Xy}r-}`#WA+eS-=32em+X8}A5&!`qMsc(g&N5AOo)+-o*L4W=UkvNk zkzJpf2nYqCX?W0t~&W>NenjP$OH#rh_tqx?nFH7^ykdX3x@ZN0s-)FQNk-sxl+ z^PHrPi@Ad{6acFdq<~2Iig=3Be6n}n`u@I0rB;nNd(l=ozY%yE=HJ6(R+?zAncI zjy*F)($Yt{v&@oQB7o9MA^Aa4`742d2=}g9lzpc(U9J6Z(1>5*k;z)FmviE~SUg1$ zg5S?EY7-=?!IZh(A{ABaeK-QT{{R`E2X}H!%^z9Ngwusy|ifTjKp~(&G|&?tfzBFoPovQ0V?p9rnl}}5f-@YCAr^EV9lGyl?+C56zDImK> zmC2dyVwdKIJ)45e>cw(M+ku14dsd~X_*2AMq`J?;i+>R5cdHKP(=|J2t|62V5yBOe zZcw28VMkIz&l&vq7lU+hK#-&a<&L8xgExM$@Cou#BgX( z+xU`8S?5uBBD=heo_MzI%0v!8ZOf5{Ipe=ImMXPMD)d#^bZNq>=eg(yQPta2)3lEb z=yv)>xinJG!!fbDH)a2EpPBPd0s74W6MiVhQGgL;#e|@^+t@ zbIx)7E1l7_{WIb{?bW7_s$SUK_;*5lq3ZPe+_!q|>A@H8H zapC^}7EdL_F~pu(jD}sZ5X?X$md9QR#(UQ;JyfrURVgo*=v@ja$--=-s%v*wz9xMm zM7$SrTwIGaxD3W88@8)(PXu(wL0@HBK9y=_UlwUPY*uF4((c0A)*N2IuwWr}48Jms z&6AQzAdWftyGFLY(k|@3;!XD33tN?&NV>Bst2P}8Nn2^b+Bhx7K^=2mqkrQM8C>{U z>HJ5dTiI$h=wf^5Sru7PONIG26qTIk7#Q800nL35Sg1uOebL2;r7P&RIX?+Y@SnvV zD%J0zGosu5qTv%z-z;T3{09YHcE~q@$Rh)xClz;2@Yb!Qc)vvPRgLJ^H0UC9h8tp3 z$#CnxYcDMxa0opxp|}{V-4{&Jw2uhGZF4fVr>I<+uHtJ(l3yvD9GH=ld}L*bEIM(T z`j6p9!|ghM4#{P0s64F&!m`{+6GtQu5~+?KnRlwMD}qi2M{}O6T?&61+{T33c4ryl z-G557(``IO_7=60^&y>Y?U@!uoUlRWk~aWR$l5mYGuJiGr-dvv&2rtPk!QTJy@$;* z%+W^-a-mg1^JF*g2s?*SfVs~d--xw84(Xl`D}1Yasawu%F5}9yf9ULf;>Z<8%(w$N z;B(TxAJ_gm>oyv`qaLNF*sRMOBHk$DaDotpO|+n}Cvq?>LHpc{XOB61Ra2d8ZC0FW zLzQlN$HZ@iR~OpGvp0qzirZ1sCyC@UuuF!GxE^1Y+Zrr#xm9nFfJn}GT^m&KtRE1g zI?TexJwDtZl4W_Kmu}OLKvrOS0=$gZ1*-nh9xT@MPwcHSIP`Xq0d%&U#c~ygm60fU zRK_^M$$|$?x$+G!;tz{7T}`zmylGtrl#$PgkS8Y_T;wP$NXHo_wZ=u%qTsE2bvY>E zX0?3}viy1Q;We)m+4%bEc1s1jhG(>vCZ5_WR={?U2S-CRm;;q;bU6aO`$o9%=AEWq zTKHbWP1YLPUoz4==$2Tcj3LAEmSzdGa5@fp8u*si#U14muOl9FCRZ&kc#C zMlC%O+fDsZyM$)#GthJ?G_MpJ%dZh=mdW<)yzC(nHs<+3PK4uV#(2Q*TmA?5e{W;s zKd=k8mrAq)%C+)iGD{dMozl7T*NlM5G70CUaoz~=CAP0(ObW9bNhFgehDRG%22u`G zbs&roYtmrw2EF1OTj+OhZ7sdOoh+>TSrq|0gNDh^a7P}s`K)o6ygnzEt^MbFJ%2l% zpDbKG)4TB(hJF-DcV%&HVQlxpFE&M;R7oo#Cn+fnhQjbL0m0jz&mIf8(H7HM@f3}5 zVIvtMcr4mSfdDugqakz04Ulkn=Zg4y#vUN}oACbt#P?dBzY6MFb=)foTn1;0$t=4Z zm2Z}1QLq`2_@3+?f(GKmUQzHm+*=<)ktk zroaa5w?p2zT|&ph{txj4S|+2Zm-}p!O?1;rlbI!EB=C73E;{ucPa?PVZvps9Ii{aS z(BvA8%gmAuKIFqMp2gZis2HhHk}}K2NZ?n`pA|j^>hepcc$2~xmsfH~=@VOC{I@WG zx$3+&(g-AD(!I)+`RQ}v^-sU`a`17a>Lpp(c^=>KCJR3scxuB#@IJQ$kXlaHZ)+S( z(n81x+J|cppz*Yo9QOnf$7){)^rNR<>;5Sgx_t9ORyMYb${?MPMt6kg48shePbZ4c z@NdJ9jXG(9?@RJ+-slFBY1lu>kKq6_Ww0^FHR_s2g7q7J4b6YzJz0G8klrj@=gQxP z4vtskLyX9$fJp0JTq)P7FKJR5o!E->X+LK|cSpxQ0nv5M4*K;P3y-sxg(Tl-&jYKl z-IBl`l@3M*aC>lT-MnY<6IAflpQU+M-)6KIUQ~kBBrwSf0K?2n#IUvx4UC`qn2i*+}ro8$y_E!Z*tnCo0$huz1HKHKdR) zl@{V;EUFFz1~|&+j11$gdKDoQtz&_H_47099Y0vsHCqRJjXu%z4Nmeon{4pic_e^K zs2liFrQJB-k_S+Bd@Xt4{d)dS4eDMbwz_>jPb%5snPMYg8(H15UnHD>c8ud6E^FZ* z2Y8oQvGXjhZtmia+9JX-vdL<|f*44sK@0PC&(eWe&rYiqbwfMFRV z;4lhCcx5B4Wkx>pcP3b6)cZ%`SHjq}{X)k~oxaa|s9pt_HReMy0yj2J(Cw3uGsjb3 zHGEn9oON#sT?c|#pola|gXb`f>PcfKBpidl2c~^1+9vp^W8yy#UU+-NkZirur3O32 zMcr%}_U3Pwa8k!>736goAPVdCkBGh_ywWT$wYyZ*^jnxA`&1UvIYmZIr4AG_I3q2B zdirM#xUDQ)BT^4XbbOC*@MFaqEEhIfgfZT&3PUc@ly@U@0tmsz?D~58Kg9n440z%n3tVg3THH2{@Jl9} zAi0;#TS*I+P!yGQ3J7AyEI)*GuaNvHugj%sR`+)b%&@S^lnfbvxDQN6H}mOpO?0u@Tu*Wpo}ivZd6$U(FnBi33*8%Auy`If zRg`QF5N-j!Y>)=!>D=|Nn{Z+sEzBW>o%Pu7{7vy6 z!Pk04rlB3K`|q>5=}UJjLk+~rr)n&KhRNi@IfU=>0B79@%UYi+BCU+ruZMq@l0b<()_ujNG1K# zDk|XYBw!UID#U}h;~BxOt$utpK-#NCrPCy%^$=Vcfp>fn? z6IZ-ZulSS1OKYTD_hasNMON4kXe69Bqd3L92rcOXm4tQdD$;Jg>OX7Q3_vzYA{lLDrNZBUJ zDcpdJ?;wD4*BrNhcVGNPi%zdncRyTLgYCMw zn)>=#(m5oQltja-gO(rwaez1iyJ+&YeuHWCMu&(sPZz4lFRmOLf)+``ZdX8hXV4tu z*1VqUPt`6aH!RO^xC}WwW7pEXKJ&yH_M>1l!Y!60h@)|h;PNnE__@Hq!0VdCy|dLc z$6Z2ODHbP)gjH?vfTZu-Km_9%#t#Rtda9C(+^FB7&9t^J2cJ0+NSjhb!3U@r1E@IX zp0%M3nn7-}3&oFd$`A?jIp7R{K*v1drPR&7t!pLxUo^pYF(4-j127BU9OAGoO`Xh6 z>vJ@2t+f@@jANdlk@#Y{nq3Zv`I?hz5b2tgw(^oH#ABHp2Mz;gJZA)f^{r?%Yd~Xb z3v!T`%)m$n?EYPPaa_&1`PX~x*nq50nI;DBuh;8Ydc^lFc^f37WNswHWMgpXeqJ~O zflHR=p3=(4bF0I99A0(T&uX}wL^48_qsl<@3CfeeI1IVK z_p4XFy9)hIHfvh}3dqb*wocGK@35-&klI#_f($DPZ&PcFNd^UCihc1beAb=<$&DE83^v6Hw=4KEl19hx#zN6ZfyBGRIUo1 zb5vw12ky|0_{Dt{sQ72$g{8z=ZRN(Gw^FbQVe~98xs^;jWc}oOOj^_$HoI{ynzCCpw5k!|l)hDf zI6IE)OLw?^3^-VVGTb<@jZs36_owuQ711EvTK;sqj<>!bMt_;v2^CUSeTO%i_ z#yZwx-dxA>u)%Imty8Hs?!(w4wU<=0vLZ_|88Oip?TJ-q*2My+*9<66|ry#eM zM?vgrqXzafsa7%E;h#;C_Q@_ub&wFda7u&q=sksGUbW)K_FL6*igKi{BlGQEn;(Y~ zdx#R|>+Ja$R>?6I103`Ls+O_fJyT26k<`n3Z6PGIS!|4F=qTl5Rb#c!CmvfT%u1E% zka?w#ZsJhq+PgV)IVW-<4klK^BcadZ#}#$_Eq5F$_XyB}!+~DHjPYB3AkegrDOu(# zc2p425Jv-{Jsa?-@?vvVxyDatq}d40(=l#UM+A?0$kYv_vWB*Zrhh8gO%mefRcm{I zW#xRS6tCl)0fR|tKm1HhjoqrtG=IC!at1NbcjB!>OPTvkY+%DYa33!1H;&b@r)xG4 zxhB-*4r2;%Gn#&{X=?;BTuAGX+f`Ka+p*@kWSK5pM{cZ{AObl#9+a=xz1F9BbFWRR z%CcHP_GyswDLEJeraFFinxHpf5*G{sz`!`*=j&Vdnxt(u%U)w*qD2ECfcE0Cl6Ne{wS!f3mgXrqBnML4 zSd-9!*18QVOxHELw9~|fD99z& zz8JRCG|f&M>+8jtoP}#h(aA*n#fiqzjDPj2lVnY#QPS+c;UCq}JXVY4c_-|1&L7EV z=%-*H;B(iGE9spF#&PKydg+&NdB}1Ug$k>{IQat#F6flyOYU%ql}E#hw45U zj@nkelUcZ1n3NTWA^qbXfDk}XKgh2z*Zh5{T1?g!JUkKwHxiX*B;*10?^>#Ec1ZJT zCnu@zo+9yHtEB5o9gLo4mpX$Kq^tenKwW_D$F6I;(E{J-udM3o@P7nI(G=WNXFW(O zl75x*e}w#2+A=NXyJ=-{EV8MO2Xw3td=79ro|W!V_?BM~S~QSdM;hcH^T+N&0g@90 z9E|ht-m|K$r{X0?t1Vynmd8@R7Ldg{M;_Ib6xytM4WxA^t!MdH7jsFbTUpHlmdj4W zWmIwx%y0)C`L0V`*DrJ^TUB(3q;a#uAp}R2Cm8Ar9CYWe<>vZFkG>)NL4ma08p)<> zwq~3nnBqv6f?e2*pTq&_PK;%`*ov^w`uoEk3TdpZwQVL@Ww=X%#jY|u(hkyiAOJFP z$3fP;wD@+`@neJSR*_DG1W?0*I^zewrF?B2)~%(>Z49@Ls}-`wu^E@|0rLTd+6H}v zXV2oDUK>08T7A~hMC}9(4rh0esocs(%ArS2c|WfF?&p~Bj!ww>xuDQ|J*$0>TGXZ0 zFE3cM7RbA!jX@&-f!{v0t>RAtcwTMQHLyWZcs2WbJ^foPqcbYrW8ZC3vDl^ELY` zs8RXbaDH!_kV=p+IuViYO4HuQWTPs6>mO@nHl8{OR`1>Ob&i*@#|ks+x&FUZEspTyET}I+9oT43CG^)`HIiB)jk|* z9(JWJmY1v-hjhZClYqQqzIhZzPX6*LE=$n)+HZ&v=;k+!OKc}nj~>m@lj_aSBiQj? zi{NNx@tjvN$#!08#B$IW)K8N&8JWn>Cr{71hu7qE2+qDF0GbRo)M`a!B z%Wgb#Z1$^dtzSo|Z($^swt%co0S64>fx~y(^sg7c@lD%99fg){;7J-%6!KV;jCTM7 zisF?-{u9223zGLfs@62QJWH=!jWbbLG}t~wNXvPWG zzMU4N_s}UupC#T%%O(*pGq3`GTKS*DUlKLQWVeb7ScSc?%c_I><{80u&Q3FsJ*(CA zPl);!t9xm6tUcYWy`YV4trkXOv;pP-PYNBfN$1kDuO`x63#CQIM%I_$j~#ehPJ39d ztk%-zA@=y^Wo_p<+EbP)GuzUzr?l{d8thkdYV8fCo>iT#mPL|FmFH*-G8ALzE4%Oz z(3?S*#v1MQtLg1Kq`qXBkz`SoNcyoSIXqwi*110x_+P==-TJ47#nzn+`(XQB!1HZO zN`Kaw5E2H=o_XT4N;b1*ilcIIXPf*%yn|8KtUO1d+Oo%T8On@h%x{h7jyG}F-m~<5 zHeVg;acSD5vdM6yDk$9Sfd)7OsK*>vw9WQJxtmAQbf?yIJsuRZTbPO>+}uW)X>wGz zmboM<{wBOm=ftDIUMGR{$&BUEHxRoX841Z%IL`!is*SI9Un}LbH$D5pe+$<4Qj1Ku zw@aHTC240nnmJb9BY+$3;FFL)I`l}d`~eM(=8ry%Ep4>+Z?oIT!xB35Cj^oh_hZd@ z6ZrR7u+?UYTN&q?qysu5vG<|!=*LOZ4X$%`=Cf)*L1fb6x zfB@`0s%lkF;V`3ysP8JTL*1kC_lC}r-W!v{wvy^izG4zUkc^X_oq*^ETI4iu7kE}( zerqi@!WbsEhFGDJLa7qDBlnyxOAKIUy#D~iehk0RlHbHS1(nci=tIT|vnnjPz|V8H zpK9VX4-QXrBHZgUn|PVRyJrkJ1e1<<^sKejwsyjt9B&qTCxQG0;%U5L9saz5t=XFT z>PBHFnH!!L_>S&Ct)9MG>V z4tZ2@mo%1#jOhAqg{Sz2+fQAyZBoYI?g2>QRD=EI!2D~B@y(8<{{RUM#qIXk8Q*+r zhk^&)+xS;3@H z^{sDJxw%WIW3oVZ++AT~Q`tiGC;C?zuIh)w5I2V)R*UZ=$lrJ{Cp-=gaa_iiYpgLd z{jsfMnOQz^R5pFF#(jFyoLQ~YkGg$7;@=fTZ{Z`QTiZtOZ6aH|vV{o6_k74QbJIB; zD}lMWO+QGqnmLk7xi_r4J8t1uIOmSF=P-Cj#dnfL1d+;OC49J-B<*g8p2oh7PXcMS znj+17$ct*o2y@F70F-n(#A+D_+{j;R`LG`%oU^y*8ua5IL})2CGls6{55TC*6A6Ul~hb{&AGbm^d6qo4y)qp zUlVEZXz^VZxWQ8>C*@*z81~J2H1Lpey^cqiR&l+wK3-d$T|7etq;U&NNMsRbX67hJ zJdvJu^~HOCj65?XyqZ~#Pc`Q(?gHUskFedISdO^qn%}>(wp(4-@+aHol}xkkSn~o7 zMigVW2Bnz6;z0(H;nbQ**^yJt%k7DN_R+u!ahl$q87E^p*!I$zJlj?9)~>pJ#pKr^ z+U?a*M`a^wf!m-xJu551zYH~R5nQ!}&HNz546AHqJp9053=&E80~PHTz81W7@?vR7 zu$f|Hb_??m0XXgyd(_$=hqP-;%}ZLA7;g%|EfR8}lw+A0Ph-#mIjX6KiOKz^Q7axD z;(a0^0%?)yvCaeI&9jwRcLRV4T$7IZuJ^$n1XwgVf3_lq9rEEzoz3O2=YiaGtPNwr zmU?}=>pl*?p4#P+<@-4W#D{hU0Ui14T>hD={7{9}=hKbZmjK4=weo|w2O$0xilG?P zy^ht0m0BL`mWQCv;e8)Yg7)xAu!z?&1yIZaoRWT{rE}VEh+&8*^^+!aT+YDy4=`u*G@2Iwr9?$!@lBEDE4G#y6Jl z*C(eYz2^SgSG#u8?cg$6ADezNjC{Sjlf`B0mimW=VrcGeEyU79#9IP)1tT9fzCHLg z)ri8zYVr&wF|T!QaQ+4OZ7R<97cwI>tO9lb`VUiGHSdIMX4V%&)vgd(D=WE4HehWh z9PyKi((vDibl>L*5M)uWVwzqJ$r)KEnAQc@Ba&k|81!pJr9Fxmv_L8l` zHpG4W0;4<%k3hYJ;PWHVuVh#I+f;--xFmM2h?^}PP3^t28>VIUr&3zYTm#ZQ@&B?R`Q(UeLN+M=t=8{RqWu>A}5G3av#Or=f%59|Xg4 zsc9m!p+zdh9H=~yKDB`_!i^CljE^&UZKoswxb&}N)O=xO70VlQ6~suG3zhkgVe7?m zmp(JoZKU%x6foo#9DJpL`A6qi%~HMOf)(pEXqpxh+-O$I1Op8U^&`6Xu5-jbGq-4j zH`1GtG5z3f7zR1OJ-`C8HNS~^a$Id#i^C*)JjCpClaXFU;v1`btC;mjSiAv%3fz3y zr7T2LEfaclrsd5fb~l>7lN8cEn=8D9h*V*P3!XalsC6s7Q(3k1qJ(XY)k2<0>67}^ zdu=WB`cC{dy|$WjzI^il~+$PC74K5niR>Z-hPwy70Nzyi2T|I#ZQzls4AwmFv$q!LL41ZQf4DT=7t& z1mv6a)bJZkdh1WrrqnIA!7S1J@v~y-qC{)1#kcyl6l}) zJ>pFw_ea*A28gtKh>gnUct3RD=NTBQ_TSmC*j>eUWWIIedt)agp~(4x7{M6t#dFD7 z*`4liX-OG+Yic+8Ty{`9t)x;jNX!(MbJLt;ae<8Dz31W2jH2+>+*4kd=9I$F!X;hX zMhGB&C%t*EhICCD!_B_cFQzuTTo_|sS^ofsaL-KRnv2BxwT*_jub_zKfn!8g3P8zG zyMxf@B-f#boRQ|%gk_=ZlTW22I*k4)NTpcOUfM0#FTX2+>yEe{mF0dH(^Yk|e_%zh z+RYlv$;Ul@xUSz!yVEuOCLLPt)Xr^JW5!sYm@glx$gd;uUEE^yT|^9FLhM1t0`fOw zf@`9^HSse#T6?JJXIp_i#q@<%O+)Sk90bS*0CXn36T_)HSxIj&M~XO(L-DzeZ~^rl zs$DYILe+E~GFY2zqA@Gre87*qznyn*O`yeLh?pxx1dbbp3!l7C*0qfo?qkm(o9DOBfWYJ_LHIb&+RvE@W%dE?wU7H zj8zF3ZiggS&Ym^!Cab4`eW!V|TaXq~IN09U>JBT*ojF2IP-lEOWgSnWbbH-5QI1`8 zJgNTD>kEW&xdulKpSzGNytlH`5iRbcRJcgh{??YK5~L`@l6n@$am9SE@b2sER@b)I zQ;TS%P+M~6abMxa3CXWjwDCM^1goPjl=4Pn`HAW|IBfUmN2PVq$A3146)?Qo8yd#9 zra`aXf5Isx)Nr_tJ2<8*yaSEpha7Is4`ES7uWNAL+W2EqMQHUlDv}eo<<1zlUPoHu zbzM#5^6oB?ZD))PvZ>4M9Dh3D^}iexf(h>*4;wU)KOuuE;Nu-Zs+KM{+|D>=m5*QX z7l|P7<;AX#rtOg}q*+ZoWbZIgPs(z$6Ts?z}E9t}UdB>R&R}Bd|ueZMe=DXPkaDv~dZ& zPD-?7k)XaLy^6->8KO(045wkw?+k06qzsil*f_5y@fU{f^++x}NuV#;j57SzqC(g^ zcMufww2#2_uUdQCjSo$h(h2RNxw;J>Aq4Lc%N&w2KQMb!n^^d3p;+lx6Pvj;Ym0Fm z)H_F(vM@N8dt;0cc8O06c@h z8TZc>?RvhOpxbL+cAs+TXwDO3oz1}8pT)*;@5OmHh&)Sir%NC5dDnVuA<_frdeo-n$(}%GT!I<}Fp0=^{I$oundE^vMSdKDFnXhLxnlb}v5O zmh;@pv|5%W#~B-l0|AGBdUl6&kz7e)L6HlP%FUh}5uQ&fI@h5LT-veY)WAmk$(Qu2 zy*o*YZ9W^w%FLyk&nv)CND9R852bM*+P7D_XoA&aDFmWj+rV~Q;HVu*7|0^JN&GWy zX!m-Yh_YEofuME9QMpz}^yd}MwY9rP9AyzAkmN|C0CxbM**sPiE4aN*$YJ2thgW-J z8(P`grJPY6LO`<15gu>^jIqZ!!N|@k{g+$Fd6x|95-y% zMZ~&=)zlh-UbK;?ml0M%+p>coFa#Z^j!4I9?>sy4CMcr*#*H@6O z*jfDNRm(64K_!Q{sIIKFT^CrA##kC@ZKZSrkUiz~xe+8Ls1ahE~$(XX2Y;Iwk zDxL>!aa>k~;NKG7MQy03mL!q(6=S=c@srSgb=y-E+gz;qyeKR=e4eb&_ z4-FV-)k?@ta1R7gTB32XJ22FgW|7wTbHtN3!remUbqzSD&XQQLWw?>u!)Gy!jl(K3 zK>Afr1Zp}}fMIWME6L>SwY|9>TH8olBLQ8qN6n4Z;2JE=3{z>*E!2&3aTZoK2(m(l zaRd->+54xrHQ7hu&k^XQjk8{eFEbQ&yK_6+HY8R9kTAdujAsWOYlq+F_fJMtAe+0~ z`bSe5mZxDf-X*-2{^5%lmTkqHqjF;0PCz|KIIiFR5G zY<4(iJYe(rSH=1+rFC_D6IuIh>}wf@CAOEzmNzG_-E4u*R1SSbQ<4owK)jku+s(H& z(j?Kxz1YZPDsXoF*284y9S?f%rH^oWql&g!&v@R?q4(A2hHox4dF-Q@DT$5C#^>c^ zIWD;;Bn_j2b5z{ux^|&0-lp-({*IyukyTWd87+cNN{ozmubni1j5En`s%nZszFWh|>EG71yFM9l%_Sk@yPd{8g&x9xI8hbhuCUiHtfJ;YBUwk--^W zG29HFO7Ne9{vUrAc!6itE}r_+h z@b%@TwbZg)!z581+f|7n3w6l<02=xiUeNW8G@Dz?aWrxx2_=Xb2|aR0QO6>@_eJpK zytkJRaWQBPQXo_*KAVB(Jl8FGs4sZ*sH>}WIbvYeZUlN%1*9Y^vPYf|bq2J2LEvv2 z+P$^ZT4mbl31e$R7kckb4fEqOzecYV;=&Pmv?$qXaspp!R2Vqeh^gFr1zE$xv(Cbkk>R zANEDN28tMiWIjp!eQIrA!E31%l_1>AOGPUD%v5J1E0dAj9&3-V@UFKk(nF-&iKdL< zqI7M*fuENn<{tIk%gdq93B@fL^ml^1D`(=J+F(Ctlgkn-IVefSc7lFZ&s+oAu(h2v z{3!2hs1=SjbF{f1H#00*b zd#gjIjbc$;7 zm`il;^sQ?j5BPk;b$_C2Fny8>h~v1MPmP(8SYfdlBXBK@o=1As@a?C=ZD!5%sRVY# zm5g!|<+rnB^%?8UdBOn5KsUemI`MV?0I=vch0Dw!5%e#f*-$|T*A>ewLX^2yhdf~k zUCG$>i$4>1TG~V5{XP*bsgKH*>hTKsuHlNmmW1G;ILYIoHO9?oG>C0r)2|fIaLgIf za=RF|RyI<0j05+9=DDvIX#OkkjimBfJaSsh<~dXnOnCdi9Q5R=KBBym`^C?2@y9*L zX+Tw#7BY?i7yvN&PXG~$wIrRBCYB9VT+w$&uur9Gay+Z8>hMpp;19B-%GU>Q%HZUE zHs-#F(Sly-_I7&whSy9Hj7mS%95K(#K4p9m4_~KR`8!?IygJ%tu9IVPEVmO#lErY~ zGsV%I7F7p40gMyZnuZS$c%5{%wYIvxg3aamO~`bNvF;0j!+$!{o82;=8&#>+YBm%2 zlT)8Z(QXpn$tT6E<|Rjz?jt+E&fK1I)z;hiU&SX{xtCqM4>Cw#RY-%_?TvQs8`xm6 z>dVf3dRGVGZDYqj+mhXwVx4Ux0yh#WZqGk-5y}1{ahkj0FA)4f@n?vl(De5E6GfQ< zHX}|m&f)3PJ!_t|TWWPijHmmxWp1Zwt3xa{DGs}H<|@RkWi#O&N&pHdI3<5RezmRP zy?a=LMY+3s8D+OXW0pf09#(KiB!&c&oPpB3=Klaqx4iJmN#eVfv(=&iEVE7LiBvfZ zLk7Z)q;&+6IIg4N#)vh`yN?cPI{Mn_7UbMn`M^kL+z!#^9AIaRb?2pWy3%vELrR!v z!jCg|f7ZuC;O%2a)GlspHT!dQCBpvXBK*;^5O*sTAZ11}b6$_GS?WF>(4o5U@VB>u zd8Bzw%bD2Zfq=lT%%JojdWz<(^ak+#t>bB$fNQ%_9_#GDOBTi_WNdlE@Gv^&p^seg zZ;NbZOSrBe(EyF7XhQkY6v0(0eqvRQdSD9LPUjm!##L8HGjkYI??qdlfwQT)NXEwUoixY5+Z}gluY|bKDapau9w4} zEx7OnmF2FzZ62*>D=S);f8RV{a~Q~7yIY=}G3j1!uj_N`dg<1q(jwDQ;sW5pHZ<_( zIC2<(z#qI$O%}4$^-`8$}#)U1k+!7#WS# zww^xrN7A_e01L;gX|vr!;ye98^rzaoa#&nI>I0q4y9z`G`EZ=lsvZJ?ipaguyRK=MlXn-E7oO~!~Q0_io(F!EV3{- zk(CZqG55h74!wKUtX>ygD^f_ZLQ6|yMG>pjfb6YIsh1#l0cw0_ekeBC$)U* zsGkh!IN`$!w`<_S3U4ZC!iI__@7;h%Tt5Rc^U3)R^X=G?pZlf zJL7|reXE+bCeFy{h6&9pbw2mK_<5lCM@F;pd^a)9x2laj%!wM$G(dB-lY{^caB=Tg zGkCY*CxseqZrf45)3+%R*xJs-Tu6Rlyy4Y;>B(FibDH?>UyE9fv7nt6*1?___N&V= zDyoV1QB)EF?64Q z4a?;uD6%ZkFFz|Iu^?lEiuCUZ_&v3$q11F6Q(>s-l1U}ax63Y704H`p20o(&bBvC> z*STu<8fBbTvg&%Bt)z_#7=N;*xMLR6w6JCh@T)2R08&pRd(}q|8nC?1=~Z+m$w_J0 zz|&&WwU38-Hnp#5x|owsnbog!=$Ltn7B;KxR|kQ~J9#{JHH~rq00>UA;s|vZEick2 zP(pWHv~vk?aU!aNv=P;Cb6tmx{wjF+{5xZP1<16q)H0T~5JHJCkD!^|i6vMNKs@C0 z$jx}qi2Qr4Xe@ON8rmN=7$b^hxK=kCjC(|)MIdhDCnS#jdh=FXso7nld>Wj!mWjUS zz254H;j2}(@Gh73Jv&g0!FhXsx?4dj0#_hL(kl^=4np#H72>-80FI*Y)wK4ytd@52 zG?B}lH)|`E1P&PqPzlKy!Te2m&xAZf@k_;8ef&CQ?6=TPJhrvDx_JPbKQ7SNJCvM( z$geuO(tJhYE6B9_%%$by?2O6xT4gvWSn;`E1P^$a81n>#f_uo^#vGL}=@e5gi zfbecR5p9MZMT}!44XctDfxs2r{0#7f9xw5w$?;r~+oD_CtWn6JUF81&RsaK%$XjtI zu&*70FA#h_ywf!;PffYCn%?R@WQmsEK&&vk$I3wfjtS#6_jiMC^eC)tyhEvJP(gpG zMKqT>gg@%7?HNLEkyxXZLKROOWPUvuC`r4R=6sat^1*4cF}z*i`;9#=G`&H0M{d4d zyFl_r>+j^IW2dUcJ>(FYGHoR?8TlC$vr*jgzDB}c(fC@MaSAu(dOJS^DYP!YC=(A58B+2`S zknP&6S<5PtK*20?&NE)!O(MIVCLfuvL)|p38cz;Ob*Jd_-fHpcvq0ByT_as0%0qJl zpj;D@y9vP{dU58G$>R+Y*3KBb>GZj$x`i6xZ)SLu`LMY;Y<$2K7y#C%fxJWGUx=O{ zywi01$V3v_ZB|DRD#;QbEtey3+&~8zCp|`L)Yd*X8fKAeWv5)-Lt!P%UQDb!#huqP z%0b$=8wgyIPfkgvO4l@$8`SUhm}j)`=8vl-p%zff6lQ575nIDMpi>!sii%D~anE09 zJY8da-W-PK!IIct-Mnx1ri$r}%q;`17$I<~c)-Bi-kj#A({=4CFAM7nuHx%ck7Sm% zx6#SO*5H6u7i)AFC6s`poQmc34-o1;E%=rFm!;dmr^ThgmABGj0VR{mX3yDCc1x3h zMlgB$)k(JO#Zflyk8AiX@tV_Iv6Dl)-+v@lcNS*Misid zw_gz37P-8U9$BG9+Ue!+S7T)S{I=i-!RSqP7WQ5o(Bso??WMM`@jkHkPjvAtP(7

0O4$qr%t_j_PjPv9b;b8fc&o20A{vn+jJ2#HX+QEnuIR#{k8;THkY<=O^2Z9K%Zq@t+E~Tkh$EM43 z9-J07n%+SP9J-fNv4Le|asW6TM_!&^;V%v8G3c?|%M5qgVqb4yM6upENQo^N1IuhN z`=yTpy?aNrI#2d~n|-KD1Xrqr%PeQ@3lp>KUBP#hRc>$qCjBkV_j%RuxGn^T*1P*e0-6`1cZDj~!!{G6><$xK_ah^o${x;Mk zxz#ioZmsOJHNkfBr*gyW@4}pIC!BFy29i6YoNWK#y=6PV3$?Aip>(=%(Y}2gF1r0yee{%oFA0&=rLT!i2M`rSK*b- zo&BVmT(eDTmmWYXB=G<|#F3#OFnGw$a6sf7id7`-dzr>DjISrD=r>*zT~hN&)pd;~ z%oqw<9hYfs_Soe4W08o+G6%-;2;-6f1lMojj|k~{M~*IZ-xFK?lJ8E57%41EykN9> zcpZ0O58`gQ=DaS`K=_UEE5mK#zYpHp+dSL8&!(@H3OPbVzF6J1KAVo@97qtqf85D85LFCn!Ev7~1PH zlasr6Bp-i=uDofhSjll|;*B=`^5t$Pwo9aqmN|oEqA|z{uH_5zl)?OKptJGq=ZZ92 z8FVX&B%a)qyF&&%sXWoKnbl5JLj&`7_9GOOBDE$_Qi|n1iSf)aT1R!_odVKdwY9{p zZET?s{DDv(-GRA5$QkROYW(E!Q){}$qBV<_m6~~8c#+#BB-~5xQaB{^9X}fP%`?UR zG}5)`bzN5a^Hb98>?-F>9YyB$fYg_H|71NAI zVKMW$Se~uvw>)#re12z|RCRrmgHc^iV+ldRH*V*ccyq+wBDC>3>d7j>cP0y$fNVG% z9jE}#M?7`TbIp48p{RI&<2Ju`y3Da9Wav&nv@Y?vY4-dmVsuu%q zrZvN6G^;mGqg=~dC*NoDv$2I*Rbc(qp;zH|g040F3AH^;Tgh=g>rFN}@f?g$jIt>E z-0lU4zyq#p$ox^Gc$>o>B8Jhm3wW*}VIo|`h~$W|!TFaNTe!`AP2tTX=+gLRT^8EkRMB+?M3^04 zyYLCZEj?T4aaO5$txkJV@e~Hi%T3bnp@U7C(%#nQ2+E>0wtU8CQ^JRHfD;(cCmAp| zgKzC5mixppd9q3iBfD*a<}wCO;^?G>CnWUeK9$d3$7bF#mrn4Fn4K-AkieJWr&8lP zp(~%1u|054PW7YWe~KEU9xKswe-J@zx_ksi#i269kM~M>Io#a*qz1_yE2fn;-O;S7 zE?XX{Y2cp#Uur|ddKZc=CBL(YY}O^X4iY7duap!P`AU@-IT#t^2AiSy+u~-DG@Vyi z&~F;b`cyOda>NU#I3<LZcaWZv84cELDol?NxUBLw=@XUhx7 z^Qpzkc7g4`v?qnUBdlBLJ|@+FwJj}PLo61S%2XuL?fK;-jjRVeoQ>T&*Uwk~00sw% z7Q`YzB*|aeiqa`J+0~2*H;&^ zh%RgfE>cAZ3mCT??u=pb4;bf@T3!*bg3iW&3B?*)O9uOhVYrVCbrrx_(jcZlfSv&Iqn&TlhUUi2O?hw}&*Te1)_(ZzSi+`$G9*K!wIs$+ULlmKpW0sQf|j$H1DM zzM?QF1*<|}fep1{O7O%;U-I`P}%Hek_5D5B`evbHWZ{gn==@xpO+zSo-kOEcfrQV*SKepmPd#9C*DE@x=1qPCtBwo7@`yo{L# z36OqoPI1pTz^|>~_^I&Y#I|=DRE1*8ECPCEIUfb6sF}2Wau-Tu<454)BgZv zp>M8Uc#BS)Z&^dyW>IYLT&ZBegY?4f$IN#gasj~S_3blK@Kv3?&x^EUcO!#r>l%rC z#0pqS06a1?D*~sYkVwUH;-Mu6WOY)+(W_Nza`v_ncyq-!6KT`i8%L326FVeRq_N-# zrj45%uifBfc*YG_)V?M7uFCLfz6j8+wL6=O_O(s!S_xy@$zQro;7$(!0pAtpzYu&G zV{@t7$6<9p_KP$coz>H>$XeRwFyTNFJ9)9O+Cbc-V+3QBZ4wXd2&B5cb37LjT?wFq zR)rybix`xiaL47~@H1aE{egwARaL7`RC?7bsH;L+8M=j+joNthpNLl17MgYBrDY1r zxkI~;C5boyedHVzBe}0!@JEUx@Gpkuw$Xe;9M*b6o471)gA2yBS7a~c{l>}{Tq|H; zXBFv}wmL71=FxQ@6zY~YcA9UTY!=e%%JSyirQ?vYhh{hj%iIT27dfte@AhW3zwt(| ztz29|r`YO7IrPhz#>t_TloA|#fmC3E7a_X!uWpQK;r{@4O z-fF%S)^t0l;?r++8;Bk&s62;<0Ti^)C4;NS3wO?R(9gFIJa+J(iAjE|;WS+46y%rX~|oj@BJLZcYK z#z%Y$T1~Ek+Kk%HsSE!3qPU7Oj`6Ce1xR41SLP>-jw-9pQitxeXmoiaE6Y^RaJJO# zwf#Rs@dlA~ZrAr$dv0Kwc;gnZF)y*iY|I8%cL1ISMoufmK0J7bT8{ejMzv^C1z#>r zO%$Rik#g}Qi~xRkBo9oQ!`5u?bWJMTRMVqL?T!ybS6lBG z>2O+VB6q)<*ge&>sv%gFocTqA4DH+wcsR$>v89fm!B#eBOtA2N{WqcW?wffwwXE3P zUAtMz5=h{?PFQ@UOFEp4XMh`~LHDl{@dfq&0Eez-8z8%s-TD6j+A*mh>^Q>_!B#`_ z0qfSjyS>w2!jEO9YPvLRu@)_LV=1^v1~#&}*hbupg&<)2X1u#x_;I7kuXSsBw)Rt@ zkc)-;+zslX3ldk52L~8DS6a07CNGrvs%>KW?Iv*jBdyq!NJZ3c@-Yc%-5MoXnQ`d<83nj z30W*8y4B!GC6e?YUobHl47`j2dBMTm(0A!R9DHrP@Qg;%>EU=TP{M?ehA}FWoRt`K zJOhz~--`Kq{!0s6c-uv~a{b?s-NxUW8R!oK9M?^236zMv(iZF;a*Hs>7=S*iL z0ze};Cmxuolovs#(E2vd9kz~Qy1PE*5>oJ z3z0mw+X}M*6A;5Epe1s{8RwMnkHo952VTK_6hGQFkOKm=PN?GptD$VK3USYV2^g)E zqMFd2Tk6W%$L#s9M-|P?8fD~yE%Ho~#L;1M))qU&m>ow4&=Jji*?DcPcz!WyclMYx zyQ!PWmQlJdkn$CWe2iD!-Uj`mwM$)S-0FAJ-spGnNeuRZ-b9Wy=qA^07}cHXE6;PUZw3UrKc+6uFvZK{okO;TAqD z@V=F3G~1g<-u^O@+v*94*MX2%X~8Gl5$q2myVL$O>-sJAw&b_Ivo1#9+gob#HzB|s zcp2$~!LJMO&6GOTl$JNP*0xJxNb_GJQ<2!VMi;5%ed=tQg{OygmD4WJO=kxp=jM_( zVg^-|1AsrgJvqp%B|?n!mZo#&KGwPM?Wc-7J#npRUT&{!w(R~TH3;29Ej-MQJ-j>S=o5EpScAY(Z^J*#+L{jIF^X)Wxo;3{mcEn$_~RX=$FSrBh^ z$Ra_{Q|VlirwBI~BB{ad&b!Bc6&@PWE&NAka+4DQmh#O`_gJ|RuzjB>QO-%=5J#ezngV-A4ZZ&O27@pqx_w8ZZdE1p^)C`l;-`Ld) zn;WGqB3vMkoC0}ckO4XBJLl8Vxrvmt&u<)?++=ki=h)-cw-iz@Y8tFFqQfJ35-18I zP&RGtf;td7=acJFMG`zBX>L_j0K&2AzlT#xqWEHKu`F|i^Or2nTo3>UjAN<#@k{m# z6^>XZozW8w33S?$HgIrp(;l@fv~-Z@l52W3#L(=;yncB-6~N%eHuJdTU>^0zKZUNv z)R9=qvLtL3*<0@J=bH2lKfoR}_HVgbP*9!>}~+e4x27S^WLOEWxCNRo2R83jfN>IXb>c^LZFNvG>Kh2gl??Oxt{ zCYUjbIQ*6_*;Q6tl1VMdBpeR8uCrG0_l<1c*I4krrxulHHz|doR**vLw1OQNI4TYZ zTpaP!jiFxcb~&dR9J%nF(bISMo$cT&_Z}4wDQtm;J;n}yk*azpfnnA(>)V)2D=obE zjyagLEH@Qxr?EK5=lm;r%f%KRGP$+z?e3!5Rg|r=YnHdztOxN7C*B8x!i;(v_iLXI zd^^!JLEya`TD?hQK5E?B+bEc^;BNW1at}hp5PAxk)v_YY@;x`e9wCmwmcXQmF~h^fJx-X2btZ&ia@Vu6`rs6p6X1aM*qI`ljw75VBIl&wXpKjKu zxYLr=o;7FSjdl>)uZk8eE+%x1uI?mNB2K|RY?H=tD-%+(mOWBUD_XI+H&;%6&2+A< z42XY=0eR!D8zZ={rF9<)#i`0J?&61Bwvu*+0%VQ40fM1eNgDuj^I(DL*0g>eXxeS+ z-07Ynxbv(aW-;7A$tBf^kLKSxFks1mLuUYU*EkmpLh6MzB%4Qo>D~yo@UEW){{W4A zEqifobtV>QK_hEp1Bn+5Nx-c+z6xpgcQ+d4!F?}GxGL~j`I)(e20bASd0d)LOEI`J2cqt|XMJViXdbZ@z% z8AZoHcJK$wT|UvtXmG+cB|E2M(R6J);eL&CA&N_Bbc(YV=PV_=CjW5nDS1w=>D9xB5IzM3D3w$&~!uXTL$~*0GgFosplkZP@VL zGvO8JF&#qcC?RJkNDY=CWc3&aABA-hd@AsFoLR4@@=yZ66*(uicITS*2G)G5QDLdu zTOT+BBZV<}Wbg=ZLHx(1SJx$u#@Q#fXs&F;U`aPpu0Yxe#(C$V#Z+s(jAZ3~&mh#i zA>h3}>e&|MlHbe$!6mY%sK#@j#=9e>_(mI2x<$munA(V3u*v@bXOaebe`%wSVow?W_`%W5>GfN;Q4^A z#RH+uTB??(4Dl6ZqS*PnRk+jqGjG3Eg5X~KlWthTG=awDY_K4vai0CX>x`G;HIIm) zxYMuVHbzyzxVMd7L$?@Q5~G}T&THzA7HHZ&uc9@Gxq%^KBP%Mr%@JOU9(e~IoMOE9 zLii>9o2o;pAV;%!x1{o^i~xF&2;lpgnN?ERozy27)8?Ag@ORR5yuM3PAzX?Z`baH#g)f>}`E~0}hc5o~wUt35kADYQfIp zNCbrH?VdB%ydzQYHl^e?yQ2$>>wVet9yUh_{oMYcY z_+P{~nshLWxvWu8$+pvN!xwHwKq_(SK_;HwAG)y7WV_H7T}M`hm2M}#g=36v&kGct zhjuw9wktkZ^ey5gdp3Bnvb~w!d0k!Kqi*K|py&Bkm7js()JNKH^*d`=Rlj;4{bCRI z2PFCd*1bl58*91*7FHf4(=6;zCSK%3q)4iB@+xvSao6ixT8E1KJ9nkrwu_@hbsnWD zZ!d0cL2j-A%Y5FToPL!uN<9tLNy%Sh&U6g};cfJ~jexqlnn-Q@%Qi8TY2_K*6-IDA zxZgZ?7i2=$5 zMI2<0sie|0FB)Fm0c9 zEt1*=&K3CHyoSKfUNQ$Kr+V|tp9$)4YG+fpX{{}vhH`~VWb^C?*1ps5*wd`E&nr=~ zOOs;4E!Hu-@NPdd1!Yo5UI8OHZZb`6YQ7b-@tkubH1OM@UC_a7(JNyIC8f#R>PQ(i zFtgR1Pa8EZTOTB+ihMn#T1nyUCr*-6bqhy4k$_7x40>dq`R!hlquTh7!g@4%&Zltq z7QzMcppFve-8jQ?0LUC*3iNLqd>+#@ogUbDS4fsUX`(ZE?>OD%FYu}zp+_6CagkmY zo*(h`@+@L^*B)@nAcEpKuzASa8?XUKB#;0VrQ^`vFPb}@oF5Wa_rtID;BI8Pm4&n$ z6{hQi+^8}-dsmxl3q8G~++Ntr3ryR*){7@6l2m&Pb6qF=BDbC#ipJwbvMsF2j?XO6 zs$0XxF&jwRUH!-5&ssWluCsJ5zu_{uVE|H9B2XQe4kHI7VD}@oYT}YtMlCDd91eqP z2iY(0?d1_Fs0Lf5-PeMsI&Q}`iK%$|ShS8CEiLXQ5fZ=!I3N+u-Y^OL>(FHIGinz$ z_Yk3uCvx6eF(9vQ4nqEQ6ZkF|?)=%IbWOdsC;$ej|^$PA&dJ@Lz=|Li6fTM z<(fk5P86m-VlnAL*F=v#a+IWe%XNL@n+f8M&Kd2a005Jc&gU2{wDifz!QzsC8~EPc zW792eXNJ&Yd`lr9xA7i$8TPNBJUw;cuM*x|Tw1ODD!3qV8fwHv$w8I)VO8Un;$t8pbF+VtnHV#V;M`3*8dsqq)Yb2F}?9C62R6iKxRE}-NL_3MMqb6-Kt@Ml-OnmtTtGQ}2IV`p{p zl#&20cV}=Uk~(qtR{`RWhgzI>7SPC$!ew(5WUg6=0s)jcYqiV)ZpYfg> zX)J8pOtSKzI15|2ooy_e6)y6TU}p{TZrC zmWx!`8IZgMl}v5?N;(j6ir_CiJK{ZdC>Gw%MpAbiDZyjQNT zXH7wL`-Y8Fow&~OzMVL(dC{A9J89LY6qV0ClSiE`QR0j$$_WJh<|Ft;OQ(1%R@5#L zgk>Xj+AMld;U)$dkop;=qSZ(##@k|2@t z2IHSo{n6++tEY$SBbyVLC`a7Yv%|a@;WKY7#CNDt(joK6R31;K;a5H-cxS^xTWEAE zwwb~+$kQ*`)pm@K3w`YN1Jb>EKNe}aRP)>F-)B%rWZ2t=-$n`v&2aw!6TTtn-XYWN z;f~S+cW=BTv3!}_a0c9SfsQ>*D)8)Qg|AYi(|aBvr=34pwYSsao@;cCq-l}cF)6^o zP&=Gpk~3dQXx|Q}m%yT1e-hhUAKl3IbKC$BwpB*akXVkH8NsidtZj80JvvJZGqGR$2ch7Xm6B|$&h+?1d8w}bbU!KAI18s#`bVs6;z4Pw2r5C6cf0QeYmfD z@Lqx8Jxb|c$1N?%RWVx&WyE70U5Cm^IXs%Fb?{G9)b*RYp9V)I)||!oxr<_;QgDjz z-vc~zk4hs&^5|yqaE$q6cr5-ux`O&`Le1ol%_QNJF#z=$IqOsSOT;=Ij;eKiO2SP; z&T!I_<}IqnErWx}916?Uydkbz>hjy)T9~A1N--m9DN~FOrEOj4n(mov#G5l2@+gfy9P`J|(&Ml{Ng@<=3l1Ko7gI<~AttUY7 zb)eTgD<+*{(uI~wTT$<^Y33KT4;K%uc%2r)PfaV;R9qT9Ai9kde^LY zZ^V8k@cq1S*e$r01aB$YHEpqHErE_nI3$uyDs(on&tFS8bUd$8gT)bEK9P3QI>NyM zH*Uj>bg#Dm0B4;_*T6bG=}qAX#9J*C zmf}zgaK|K#*Z^=V$CJhWFV(dMvWoIcLS|(jHrIBTXD2(g6>AzwojJiNGwk2^ zN|#@{yVUhHnkb~Yc7okMf<3{@zF6Sr91LR}GgaOKF>Z4f zeo^xC!jDS%#?$^2-vvn=c9)wT>S82S0ptyhqwkLSJ*%OzxBkMoy}#BirM|yt$w6!iXTAJX@LrvJqQ~M*DWLK%qLx^tn1+;jOS!T!l_Z`4 z!REXJ!oD!J)$VkyE=ylB^3p^BrP|Q9mD6(d?Z~c^!uqF(bqxmHj~4jr{t^k9bi|#+F%9TQ#(nYA zIOnOa1=95$f5ewRXG^q=R~x63JKPT4dBuD8fpqT5QSW_(8RUa_j(TiICYuMl&vJaMos><^`T zpTpfB#5zunTU3RkzA+;CWR1!XE1vxK72*Cl_>(S|b^V=b14(wCTO+?J5szV<@mn)zud1nQkS0i(9a8Is1DNh#|RBq-|%W71hlwy(f_0NVily|gA zMaxXZ*@41kumCK6yb5yoZs$x?&|~shB`0de+_a84+)rE{nC)JDVet!5(Db``B$hk4 zZz5S0*?>gC^SF#;j^oy{=J<_hY>uM0FhzR|zGMvw;0)kolboE^s}!Vo62a9@_R#j5 zFNQYy9-6aicQHNdvliUKIH8StV<(f;pTn&~{ef?76D6j=_JK*1oRZEmTm7Pax>udr zd_#}MlQi-ul))a!VgR3=xbAu8v~T=Tty!S7`J?iQ+O7i__KXlZ{h-nLz-MpF!ZX28I{}hu zPPMl-RNK*=&xv)|w0%EKgW{k}z#7?JQCxSKu6d@(wz?9=&+3 zXT!Rmf^><6=B%;a$qH|Z0>^IdFdJy;j@46J(N3)!TWXg{1-^=^Ob{rHI^%=eclg&` z;ayk37up22)*2*HD%;}fbRJ~NuecI74DsB9kZX=rwXx_lqfN;cbpHU3x{dYY>6!+F zml3?Xj7fw+>9+%bJuA7o@r|ASpC{Y2abtG;@J5u zk(Ue<@CVE~ys&)3qoW%yaB>7D_!)^v$rdyQ6E7FZAfRa66##Eg>MV;wPG zcWeEZcXaZ@AWti5sLoWJ`g?Y-SzSh0>@2kVTbWuSOUo>SqGT5_uTIt188);q#5uys zCxyxIzr>N-&2w=SiEvNI8HQWA;Yr2?au(J)hM{jD)L@oij$&Ql?N&|*&teUF{{W8u zBWqCjr%u!SHiyd~#9wF)Ai!2F*Mb`zs7q2adhXVOk09 zZ9@|{#`8QvD><#O_*c`b z@NZhb5L{a7QVSA=m&rT=KK|}{pL&zQW59kA*Q3<6nCHBf!cqmi@&H-To=X9cGtF?u zou%Y-{{U#k#qw(V9$#&x-D%fx{{X^G9HxCSe2F6?gpgnWM`On|t9^TYtlbSCK!?j| zSQojFou~lL1_$R~SnAdu2=N7#{{V=ztu-$fSabWem6Un=MlgGkj!ElYA@Ndu7eTqU zw$m*lvlg-D<*dUnl5XL0afJiWbDHkwjANn2Lml;rs9RDkC*hX6qgY!#)%slro6gO% z68Ss=S+S9x52bnLzpi+a9Zq$S{ClL zyG<_5td=#o^M+(_O6|vPYmZCudmu0(#U601$2|I)>U?+MjZaV1V$-eFo;jQn;BZ58 zoa3Pey9D@q0Pwt*_P23vSB?P;L>UXP&me$sF^r1oSZ0=+oUa!JX5NgOz}IbYqTXn@ z3ik&-do}`v9FOZ=Plvn}ZFLA;d825R(1#=fV#wt2-?evE-vc%6JK?+@C~09x79jFT z9D{fa+fGz{?t0gmrhyH$w3o47-TkGL%Xno5J{0GH&jT45tDGkkuc{RcT^h~%C$Zn^ z{uI-+M4Af=kr9vXtCG0xG40;DKNMcvU-(`0eIP{AO1orW+1-Q4=cl!CcN(6(eSU7P zpX~_yRhXVY186^hz^mZTrpN@UHaqT8FnMk{u6a~_G&^G*H8~w8!2bXdElly*!z^(` zcgUr{jO`f*Il&k|t$Npk#<{3zHxO$|vAhqmAWqc_p^{ ze8%nbBS=Tey+9oG&uaA#2Ivsznp{&!EN(6XOR0d?Z+QZ&n`Io4uv4WAuvmuvo z`Eoh!n#(j3##GlP{! zR(a=%UqRG0`K|PEGsf~R8UAHd91ss)KA5je@SlbB%`sB*Ou82jI~|e+zzRC<8RPM( zG!FuUqf4vVDkasB!bnbh(%ImnXF2J|O2*JEH5o2XmuS{eiB4rzAqxzG0-ipge@drD zaV}M3DDs|!d@XnVp!X6!`^Qk{l6Nb1UcCq8Dn{^5v!?1Vb9ofuV%wKboGETsdFhX> zboSbv#4Tg0-9se$eXA_{#CT67Gq8=Ee^xs_lrIr+}$c`5w4Zw!tMYC)^daHsqD@4uN;Oy3h7$*t9Pzj zH1@w~d4yrWm14LXz)nKs6W@yO;P8#MudAJA);6)TSWK#qjj>Gl4pf1Sx#SFY$7*RKD0Vb#_=Ua3Qw9(Q~%cZ6T>1MUtEgA zF-vhaC0&ZjS_+LFm7jid7;Wp`-+;2p>0 z8T;R*XDTvVk@c0lS@Rse8M%&aKS(l|+U>-WJ2^!SyJ$vTxl*Sfo_glJ23>2!UI?&z zJzGs=iEv^ezGJ^TNjUqb1cQp`<rQXFf1|?wm6Wv!2_W=0;R$$scx*M)s@l6_+wbq?ll}%LHzXD!GzT@|k-N2DNa?X6oC*8{(u0pI~xKO{Xc*c>h z+G%%V#Qp?=Yb%?3aRtS##_1V^pX(eQm_-}`l7FRp+jzIdo+t3${VLg`H#5d303c;V z`ACh+sdr#h?b*gUo@=)c7|J%1IWZL~LP}849+lxAhQiarT86u=X?6)Z2=p*d4SDp)?dQ6JB@T)XQdQ-QPoJE;V3MaLHk@NM zo+7Mcvlbr-TD!dZv(b&O!)xd-zRzN8{OG*dB!WZdTbTJW09zPhI0W;PT)6PpgDmal zztg6-xtQ!W&2ZvE?wpVnM(>-RNaDU#ZEI4toXc-M!z6x7^kP-INXR#=4O{{ z-|EYfM&Ls2_8-o!TPJ|6@1PP#CGFY7Q(N1sG;H_-cyh|Tp2I&%n@aG%jC?^jy_GJ4 zO9Ysm(7aPYZlIMU4XhM*9OQ%PSpFQ=7e(<5)-Xd2<($_j(T$5MrsI*ZpC2&$yz%LZ z#dBZYdl6C*ad3mxA6{u56w-VHYSKd;&YdOP0pwFF0U%{Av9lq;%Ps~u%|FBc01>oZ zCg%H0yU|}wN4Ehx^2S-S{@(HAUnt>scr!SrD2MalzCYgDsDBKi@H1; zP`$rdX4f>tmA=kIcMTgAk1vn`_aGYUEc|)>y=82=gEW(10SRU;62x$PuyU#h?Z+JA zwzOXa-d;7{p$4BiF6ETM6zz@?%dlMhz;`1!{A<~h;IDx1THjv#UCo@Y3ds;oJmP-v zejM16!_V?|Y(YLUJ?a_c^l2B7Rn>7idNePcKutx_4-*EsCr>8aZ zKZ$hP6!Dd&vTq`=NbVLnCkK-gFJvSVRPcKrYW9^&MI?OpvV}^IdlFvwQfrHswtFYl zEU#q^9Hn2(NSg;dfC1WiWFKnD)w~s@n7+YneJa5g9tW8~m*qUJ4hbE(uT}70hrC_m z88xT0)MblFwk)4$idA+ou2>a}ebUFFIXv)q#cX(o;r5HAXeI65eO}}2>oU&n!IhgC z`FK4^9QDDa%G$GfnPMf%?Q_8G#+zni(&jO{Au1e#rTsC-{{XJKT{Fb`CYNh9<+bEi znu05=1IuSSz~eiQ1Galq(0F~I)U??yG?`)-O(9t&oJg}6NLP(U7Ys589Y{IPTw?fx z;U1N!Ti0&T7VMbHIS+3Unj>^NpJ~!6B%O&Ns0hQR?Mv-l30KwyFIQQeFTG#v$;ypu7YYWTB zp|fwANaiXY91a35K>+mtv_MP0QP304D@(+G88nS|R`Rs1WNEO=6D91-RZFhWs;Jz# zIpwj*#bnw=rg(z>Ic?{YRk(?xdG0PgXx=sXN-8h`NKwZb?~`4So2x5RXNd?^ioI2D zk(~#JbUiP_v+3f+wGf*UO-9C6Hw`x6cLh>JWmkeT$**1>9q<@4aeqD&Iqh?@Rv~0H7Ip2 z73x;fM8vF%JC!W1erGHSg(E%drc@GFn<36g?m?{hL&4q;)uYrbVSPfw3;V04-)>lX z1sGs6$87OkriPyf?6ixI6uK0{wDG_t8(@sF!n|@2MToC@)85onDDl)u^jCW`&6 zZrUpdNpxV6lZ?uv%5ba!`}~8*;;C!5QtDcLqTfOVz$NZtL|G$_HRI)GIc@#dfDb;E zD+LDm)SjnWy;!8)$EkRa#y%0Y)t67cu#!11?lR`yMcFKAf+OdYot5_UlBqay$*40>k(ay!?WcwR&U7Y7!h z6U#NdZ$i@6&9qr=u0`59TrI+RWgPG}zdRn`^zUCi-`{wKJ#p?e4N6N5K2~K_w4GUw z(Ulm^4tfLXO?#%RqiP;C&?MBQwx3PYZDMA$o;4udGW83L44jjK$LerReA}n^eqB!b z8%vEvZLGrwwrS)ibcMcEB^8KfZ&9YIk~eulBuaJ1O-EZtX{x zB+y3_f`~`&70JsDpb}UPde=cG_ASSVCAaXe_Ku}v7%@jGMI=Td3Bu!&+ebpdPq!7= z_;~YO<5`15>)%5`l#+!R$%I;EY z3&(+k(hx+FBB2gOIuHjYysCA1;+#)&*tkinY-?RzYI0bXfwcjDZ77KSp;#7EgS#Lx zTzAMB81GqE-XQT8h5rDwF76_Z?mgRKyOjwprEpLzpl2NC1M;t1Ux_+CjpA|UTHM|1 z_m=kdvNinKNb;&0GX%XCBSeWE%%_il{R?$x2EP%)uNiH#tFfe-O zil>*qXr(8iy-enmX*frJFY80fv_FOS_Ih2#=Cz^N#o@c>Gg-+jl1G8Cm6k#aNad3o zQGQU_;8&YoYaS->4v(wc>9Ib9nyjmBrp~dnQb}(E<;qRY(mq|l5Ket7+P)z8rr+W% zq0{s&YSzwOAzA@r3jLiTk(og|-M1a3Mp*~9bDt3SkK)}oSk`oXBFj*1LVYF-sF(NF zk9of?in8^Lg;9^^Rf^PyfUb~^^-eUf2F!yMxuO5TkW*D`lF z>*60egVNuLnQ!9{7EW6wDi^j-e|#19kL+{+HHs{NGD5&?5?*ij+c$Co?SG6v1wnZK-x?C=zBXe$KWtuS(FkimKkMO?le=d*VJxfo~J|A7CsjEt*E`mxWRb*e@?u?EJ&&!+=Ng}3In`skD zii>E`_+zH{bHcjZA{b}7xJhJ)%^)IBQIusdjBG1`f_mpYtLWbyc&oumEj0fC66kk# zsAY^>TgLI?XMBQY`AIu+#PC=!1auYTUJ~%lhM(cc=Q`|TQNDOh>RvAAfR+y74+U~T zP*>CvYoYj+taxE=?DXqP*>zH(G3EIy3{sLt=~ydBSm%NqZ~-H=dT>#UdAhTba86vT z_AiGPwq7BI_fH-jwTcvBZyxBY|Dmn6yNgI#dNVy$x-?l2Xi+IjRS`Q1~UCy@`AG!@L=Zzw5?u+H^V!tWD z`t#PhpNBE{E5#bblG$60S5~@!i@QnTcM{9II=eH;wHqS?9Y%Wf9QCRs{n9DnWTfQw zJUhmk--Y!HzbgOG?Ye?aV?=liw;){*PoVFBXow?($HS3-a&@FCGk*Vn#ly;!B zFCJ9PuHxi|=01YnWR)bjo}@D{&(<5IY?iq^+bxp-sKZ6qkxin&vgK~PT9oPFc( zUW@&?55u1g>5FTpM|-4PTg#W4Hj-37C@jPQ&zGK<9S^bPQflsJtxd%x7>jwVd`8!` z*)+K=?e8r#*OA=XS*eZD$lbm`k+yir+HgYmHS}(h)~%;Ob2gc5mr`3Q+^Q zD(b|pNGwkSl6qH{=>9wK7Kv*dc0M4nhfltN#K_9gw8}nFxX9mo<|82q!0vErrj=o- zz%{fN(ds%~)u1pWPqo)-7I3q0cIPEmZg6q$RZkY0Rzsc{C84LPc)t6?uxb}@U)mWEaRh_7z`O z(XV0gB${o7+sg)>soo=6K_fa&Atk~sND9AJ)XUu&hA&r_7^V$$?I7sO#a zcW({l#IiKfT-rwzd;G@Sxha-?&I!XVF~$vgE$70&2y6Ns)}!HlPX7Qz8qB|Hmq@#q zMGTXa!n(Y1xk0$FReW;99y(-P!F#IsPga9kirN{Yir#BvU5;S5MP(|R!hQ3>0ZHUz zI0n3_yi2NE=$eY(UtH<;F^gok5&Xzq`C!sH47gnIM;WClq)e&Gc5ymQIvR>M6Et}eIt4s;JZ85f@y4^`uM27#gfayD$od*ZWH5F_NmXZ(zWNQZi06jMqilrsE%xok(6+K78@EtE6e#-koi4 z;Ndoxb*L@1oR@blqEgBfG9so7c_4x}`i`cubnk*mYod70T{BSMdLp;Fi%zv?Tb7X| zUHFiNjQpGV#_aaSLGqsWKL9$+ju%VC!sl0u(c^N*$L zGx)0i08!U8IqsNw6I{h-ZxNl<0;(Vj9_QRLNoF`W$m}b{rB1tT)RVdCN>rQ_X~y5z zndUmbi8X78?mizi&Yj`8ZXgMBHS)&B7*u?Y&ZyFf7z`lVnJ1tIx264>;kna);Wg6r zSnZQd5WUpv=M!@TiRLV)U}j9mjyXBb>~*ZWEn7$Nwvj%iszq%r_Mv#TA8xp{BIYUL zWx}(Rb}|A8T(`=kaseW{{bR*`EAZxrt#~g;x=Zx9WlOo17Dft=igQu19PEW%|2jyml4=_mrVP1ov7bQ=g*6HQW&BLv6%O(hAXv3*!C!1ah>&8 zOf@#trPoq1Sh>aW$4eeZpnMeZ4wt7xuFq>c8XS)hxVx1KNo<9HkeCVH9Wr`>k`6L3 zPZi_u2I*Rsxi$X)g=Uc3!1KG@+=po;Sd~b2`@uuya8DU*XNvkR)5QKZ@ehgoOKo}$ z?ul`uv{u&kHv65XjZk^G4Y?UxId(V$t#JM;@kX=o-YZK@5#@sKQ?zKc7_MUTM6obX zq9WUsR1B#L=rTAN>cmr}MQPOM!(!`Hscqlje8ni!UKtbZ=^mpV(+dLRH(aS9NFKS} zj=xI!GRninJ~8l=H`)!g*0E`(+Ol7HZx@=3pE6@^e8pUzHkJSrfKF@3Exa3~__s_q zHiX&VtmUPV&&eE04t_uZVo3yGgTWm3t>JGPc&p)0h~%=gy#D}H%!Nb0*`!7vc}EKeS=JvANgoEhK3yOd2MtCJk#8VTSmNk%;9Dk_Hb4Ab@Mlv>%E3f5n>y zvAvpGJzdfK!Jpqc?I^i?ZIM(S3FPE-yR_i2lw1;Dp zHry8kE(l?cq<}?vuf|V+_Z}&^vGGQg;wyNB61}2}m`tuDGGO3D8|Fp?at=x0^cC4! zd~~upZH}X=GQ^h4B3s95lSH>fkfF>Bz#&4#eo{tr-x!$uZ1DcIsI|SF!vvAZ7VQGY z@G{~@B)T|a_$$EUuf2W6D?3SUc=GnoMtMGi@aOwEf3fvl77I&}a_x6L(z?SeM95v^ zcfn}R6@Y)7A3=)M*8UlIGApZ#X)L3L_R`7awJ-rH%vlVI&?3LhouCXH_UDZHwyCX8 z<9`jMP-Lr4l;$l8x zqZlQIGH^lZoP&>_p@+m%t9ZM`^gf>zh{H~YyuIbu`rP!-gIdpvJV~hDH;gS3(&E@` zw^^|qlUk4%2_IuLtAI8(P6t8-dez>Ib_Ewy>4sosQAYOJotV8O3%`%-e;gzGs7p$$4t~pK*bA zV`*ovE`jkULA#er)l`3HyecJJPDoabl%qwrIbsi7WN}*_DDcm~$n322O@CCnwYSq; zT&9=yk3R2r3ei6-;|zGrn85i)I^t5rex219ov+LaM0m zu`1t0+4x8*1mD^-KU2nzrD56B)GGR-b9*fYil?z)tDen zs~m`V zL+gD<;|`~%Omx#@G-Ynw7^03eX5KzT`{M-x8Nkm>^fiA?_@@=E{ATA-D}TkawBB3H za!CVnhEuc-6z4qlz^{v~@3pz_CxYVa0)&)zl1B20z#}ICu&4Ne>BmaDqv`r3t=-HT z>@sR&%qVpQ-!?crV~@q%9Y8r9dBu5Jn}o?Ld};Ul3OzJ2mWD>!RfMvHN8 zZ*3jT{hX*IQ8NT(>yV)CQk%cMl0eTLE2q2DJTc;^=DD}K^5qJ$G&d2mM!sv{`8duB zmKg1f;F{>eROO9{sT6USGU(10D`rWB&=Ihc0YefAJHQ#`uruDU^}Rnuh94v>%HdVX zllZ+@4?=nz@;R%+z`AwbuRX23{5EmhPSAPNO4}rvdE5yDYM#XLo-$4=k=0>)Y2*e& zcmO-3JDGt88Ek-hgO1g-rlf@p>||cY8eYAW7hCN>L6&mEAPzytAJVi|cUU5~jH|RQ zl$BH#>zr;KeR|@vwC0XUC3}sl76Fq1cWw1t{{Tv{9-s`26;>FE2-#vEd;OuD;F`s| z8zd#|xv+vl0aG9VoZvQ3I2?8EF;=vznW2HqYLSvYVB>?{q`uTvr>6l@13zM*w#fp7Bj@aUIRg(3fk8 zF}$f$yF3$|9QtOHvjmQgJIzMY?Pr9&qvc7BW7?{~02p+^?s(?Cvrh4ClW5m>hQi8A zqXNa|0%EvA{B8wGv#xfMIUv`H+4%C$Q@m(z;YA?fWPZv37-NCo{{Yop?v-Pp$*iQ` zXWpzhKVJuj!RTJl#rLZw`n7mZfA1gUDyK1$EPQe z&rY>Qd#Ntbt;8rE)-yECyO}cEe~Z2dz#Y3+(Hi%Mye;Dh+WI*gPnC;8S$3>#GVl&q zh2#(z91L;~r!)Tm3RhOPn9jl*$GJd}$7}N;El9!?0eg7f@azTHBnvPmm0R{HVUC-1^sbru-}L<-GR) z0NXmXwVl7=Tp-W1-v$T=(OG z@g&lCvq`$sbn8qQ3^I~b#~r%I#$C7^f-*VD99O7#n_jWe9#06_S%kO0yoIe+97ZHj zmXaq7%rc>d&_d%J6Vki=7fH|(+8sXUPnIi7hqt?wg~ZJ=XJLOV6)L$nQV1aDy>@d( zD$L>Lovx41eOtpiyUjn@?h^VdAsAx|5{hL~KwRLHv~oblzH28(ves=)!bhjgb9mWs z3KGhQr<@Q!L(P4A@kim_pf$(wFNba8)opICaCH9wBp==F87#_Fc;ht{_k!+^ zh;+?cO_Tl+{{XYY_G_CKCRuIf%Y3Q}7347Bw;f3BQzsqERi$lF^4*Wb8^|Ou-05)r zn1Z6L?xjzMfd`^r*|Uk7pvRg-H3BaL1wR^8hO@T6;auOPWc0t3$K%p}e2U z&@}s3R|r94nAyNN;2)J&Jf1nIv>UxFytbN#y=!YV)wvSSa-cwboUm2g3G2Y&iS?|X zhm-h1!ungCVgYerboqwdvp1Yh7XffXdV8GLo@+iH*JHni+G`7oX=lWd+gwIsa~tvr z547zgka`*vF8NLxvP||JCseW0uQdp?y<1M68CB(xB)4M%1INhbKQx!m9R`11%i*`g z?OxwlNoTdSw@F+?E}>s6$Fu-LGU0L;pI&R_`=!*pJ9@utuveEI7-VDEsn6tcE1|Hw zl25b8CB(AZyzxynf@U_CccJ8wv~t}ls#5n^oK$x{*twU(z9fomLL2M5$r@KTEoi@K z+Xw+mM$Tg@KsnCSw4X|j+F0h$ZuAWTX)hx4B}nDgEtcXjA5z14S49Ayn5&b{1~6;E zr~5^fox}KjjjVG`G)88VUGAQ&r`gIM$s-;N3poIxPtcG7G$w43?fy)-i?+a$6dSv zGN+2Hz7o^C38m_KtHV6Hqc8-lh|x%nPt5_?RmmSQM&}%J&2)NKk07^>&O57{UE9N* zK*(A-Lm*ZyjF4RY=G;%Gzl;20@lS_uye$uh{4;SWxNCrCCE2{qj94&Z_wZXAxX9w2 zDM`sh%B?v?KE~AF6?{=>ljxoqf=h_)BNJXlc98jSvHAD!9f%$A&UnuQm+=hxSHw%0 zd`orV#WTxn1fteoF>*K(x0YP01Jp1F9SwQjlkm^PJ|RhAitp^w%Wh?Mo>HG_RDNc8Jn&w+jrd|dF&)uyT8nPj(;;z1mX<;qqlGlr5+l%WHkloH3V#d{Rv2S5+Hyo%ZaUcQKx=#&w%g4V8^mx1) zG{`P(BHSUq1AHYIoFgj%!Ok|G{p+5#A|GMho2bdF*!eS2_!6Wo3;(8RK>f5x9Zt){>iTyIb!HQkzzh_78-- zY4AeJPqNW0BxE^Qp?MY{cb}I(!bv{8Nj1s*WcXlwL2Q?v57gG;>fLuoXDbDefz+Yh z!+Q`uwdI}&_-*jcd&35(^TBy>%r=)7EgXtK;O-j%=aG^z?~1MBZ3|rRCbwy?==alH zTG_}p$#M%x4oKR$iy_104nY~leQP-K^Db5|WYcm?@y`+KUlMFIv1zTxELQM4Cz$c! z^PWL$eAwyVit2t3c<#@`x|7}bf=0W6z(Z`~%npaI9IxPOyYZinHSdTTUCy7T>8@vy zohOZ>3P2!atY@qD8wohC0M$Mp_@~2`39H@dx3>1V$DJ%ps7`VBhy$vz5#*E}@Vz8IF@PJ4nbB7xXPw5iU}nd(R!b~WQVSBf>kdv&ADqFq@n=Iz%J z!o*1J^0AP&7$k9nk4pLf07>z#rDXQ6DQlmxw&+?xxW;{tTvyb71^AgZv8FAU)M1KS zR^KhGkttSR_nk_WJ%J+!@TisH(8*zvO)~DU;_E*RYWjYeab+#$zzqB5DYZvnu5jG* zk4oCN@h6C{Wn-pUeWnSWple8!`HHN^?>+!Lb?gOmUMBdD;TT}Qv`YlkBDlrFqeTgO zSySebk-`}Oe%~+yk>3@cq}uELCW6xUN^}O+X1HXyk)uFLuECWcx~R?o@9R+Kb*MuP z6|IkBlT5UePd6I9#4_5fyju;{#atY1+^2CM9;dE7Yu2>8KMw19EEX|d$cRv3ZZ0~|0PJfYMAy7!tLl>8 zUfX}8$>pnDiz%dynBet8u}42PSbL1rsU);2tqx^l()>x`ABNg?uO69fsM?feWmmv; zV8nuU;HV_`;NrST=GL@LHhcGq*(~8kEhBD~ytU-8MC6}AOm7W%x5YN{Jke>B=#aY! zrLo$Q!dC#9x3Q53>+*s)uPM|u3q3aC^TJvY)$bd1M94uu?P*3-NG3ncQUrE;NOjh?g7N#vG1r}SIea;~~knW&o-y*vI0Eya1 zg`30jO*O1px&snN`?7X{_jvhEG1|6mCTC7bH5(p%;D_+Ib8cp9k1GMve5vGQV5nT} z`s14Q`>j91GU$^`pk7HT9k@PHoOD$x066z2@UM&D@jj2?tzKAd(rBz35$}=w*5m-d zvV|XeByrP&n)WyNmGJIO5v`(jn`CDU@3ZAm*M$Ic#tw5zN^e$lRKq6jnVaJuhh81= z5=X3P7Z*~SHAa#P@1EEnyi~CO$aVl=1y(%Pmxg>%;JF$t zFHmW}v`kNICbUPz!Z9U7C^;Np9y#ko=QON!Q-zkM-iP9^5W+3|C#8s`)i0!y+DE)| z<-(tJaOL&_-Lt?ruWr$7HT^eOv6scVewAfyr8r*f(&VTWcI``E>NrQ`h%S=B7AFRknvCbvN}vmLBL73j_t zah{-eub#!mu+WHHl9|9_xcx_Z>{gEG#yA>s)id$Xy2rYs(laIUzuO*fK4rrRF)U?fNOGmYh8b7i$ik@cPKn}Z!>JB(Pk2Ui} zh4k|1B3q~3_E22z%So0v-p9Vt!iGKiR|9jcUthY2!U*F$Z6Fix&r?m!Z4#CfOI-WE zO!%$f&k@-{q(ubw_ZE`4w~^#5(+9>2WZ?QLHHxWz5yl^tHc?w7(a4e@@c0{YE`MR`aC{Qwx~DI1F$VKnJc# zIPG4!;MI(HHc0$K6|KeE7g(KKmz@-l4$<;}037~5Uy|*-2c&6Dad)HZwl|VAJED$P zcxDWFz#nvaa&gUcnoo%QbK$#a6Id{tDO7C^eqy=%s8jEHoczA@Dy~f_7+1l?#rreq zyB&VxRk)Vi!xVPb>x2n_0|Cxh^**@oT`j(a;H^&8FEwpJ?I$nhNg@?_b^-h(gS2{_ z8u7hH;x)z2musfQYXzOWcK-l6&9zqqlEttH$@I=mWB7MadyAQ7fR?n$Ym? zh`cA@rCl1@&f`^?9R&CHk{M+uw$KLO@UJLO51X?Twv)Jconu)yG%Ur3QZPPI$;mwa zHLtH}7kYFs$M(m)x-MrCTYJN2ZtEW4}6~0@}7y}9S_8M{kMp2qmI%vltnf~o?L2v^MVNn1E3ivk9zcN zPfXRkR;i}zeqvh2Hq2HhT(e+c1IcV~4R0vQ#pSjc2z3Wa_!a6tRKd)B?@#2*{p!tmU9 zZueBv3}KzV$>pOGPskEN%*q$5W0G-?Pes-~A2x^K*&E@?!C`R;NmAZb1_?H>ED0c$ zEV&uy6hZM(;4$el=}&JvMy(2f)8;}s49K_&r>8kTh^-Ztwz-?-`#K&Irt97=@jNYY zH-hA{wtz5L+RzfJnb@Pu9Q>dUln-k1-xXYV;^sSawSs*w>eMnO3{v4v2i z4n}wt_NIZZNpn5r=A*0cFOAkuwLZ>Qf&%2Q&s-YmEUtVT;-54di(AjLDBtD;aG>X- z9y=PpX&%Ou@h&pDN5&R@8qna(P*|3NPNF?<&&nk_+#<8f|v5y~s zJRRZ~+8+-|=c6HQvd6f#GyUP8dhiWv;kK)9tIMH{EgJ48EpE`nFyMdyEr2%z*y95x zzQDJ*vaq#?Y1U%TE9D{v*h&xLYyq@!lkL;3GSb4&#NH)}>q@&=7R(r?R5_A&Jf2&S zy}O!)QKzZd3iGDD#&~v*@NUL9BTpK%@t&qTWZYbz;U!K;C$Jqm)V?+NIxnqZPY5rN zfC#XDK^Z)5V}rozdYbwNRu>l9zJAnEt=ux8z)Y`h2RZkyU&r1k@eZG4kE7c}CB1#5 zBOVh2d*kKKGwn(>9o32Y%~wB&^UW9F(|B{kjUK0Q1?~Dq&L#zfL}Mem^OIauJ{0(m z0l9&7luKfx{T<~j6u8DdKnH%AAXlVWcyep!cf9c})y%g|pDo#7w~9RED2xK+f!CkH zx>>vj;mcnRUEIrcbEr!o6cm@E?lxUj-~4BZ^A|Dyj2jUvc1NdY0#A(WI+(dEDyz~~7%r)%FD^c`CBPSPx{QBn)A_*MB%(}gVCdBEos zDc#wlY1hR#*)PEGy-VPCjK8;x7OdA1#!AO>_yb~$jlo6G{@mgcDe5hFw9vc2gu_5p%tM=RDvB0Or3yd}ndsy)MGvM3YMd z3sSMnk*N71V2is0jGFmZ#~vKHvAO>MiDb~mw^1acJ909;v&bYKovY5p;k9y)Q{2n5 z4{EI?Z`9(v3F2Q4-FT?$9}o=pvZR|7!V5bAz#tw!O8b|^IyZnWJOw?*hos7qO>HWjsZC7U!5}OI^Kd8HY3g6vn^UQ!t!>Av+|Q+4YF4vD zdlKatuVrYP1Y`GV3iE^8KJ~%f_>)97miFms5xRwsnQ^%62m$#*W0H9Jj%${c+r5u< z(2I?Z0sh%x;t>P^V%$d5Try!(E`HR2sRBe-867)kitn6dZ4MfglHB@R#l9$5 zH1D#)_OMB9F2Jxe8H7v11| ze$s9=t7)F+QII-F4iOofEa!kZ$>TqjdKZGcdExVQK7{5-t>c$+Ng&H8Im!8V4!Ha& zP?zr$k;_^u*h(=+d8>Ro()G<;>Z>rcmf#Zm!xUU&)1GtGbgw_u^luD!Mo4evBT<^x zNh6Q|%@+8{AwxG&({_H9^u4XNn`fmUgg&76>E=fvAc4p|FbD^xI5ov;-U-n3n?`Hd zL)=~NpK~G@qG#>_89TcIYuBrU=GG^dLmuPq&FFm3{{RUE#q3Y^T{2l?pA90CLWSq} zR02BoBC6VJdd8=z#T;;c;u1E*7XywkeTSue8{s7I&Wv?ySG11)=Jp&VPLL66B`VZn+$q#Z&ff%qwG~tK~eq!a9bH;k`Ar z6t!5dE;*UUIc3jm^{AV~ntr=;DV3Zi=3?u>8@O&d`&Vss;VlRuu!UqdaQTkP=Yzi` zTaG^udbOhbJ+d|?Kmo;#suBf1@~GvaK;ZT1I4`1n5 zyglKf_b$eDhfWchH=GTuKZl%TpK6&nyOB~+O<5int3hw1vT9dKLXF@AP@#RB+r4rc zXN<2k%~n;rmPufQ7L6QyzbN2izhDJ#{95tehh;6!masj?8<;>rQIbNE#N=nKdEbP5 zQK9{&E4vw0JhC#gE=XgJa1U%`d)E}}D9Xv6ttt)D=4kHxRiv%XndUW&(_PGhMl9z6 z2;p`BF`VbEcz%uIZF|61&3KTQ;bnNlY(ICj=b$_iE7N>qrvz8i~MEPb>gPJD8Qg7$+I@uMW^WO{hmA z+22lLf)Cy1A^XjQkU&2}U51(Q4fLDk)3j@SqEdf*F=LS4pd52oPOZgT4>j-~Q0N~7 z?{#G#WwU+e`35<_J=p%0>sqJ6-A}`|7CNq-s>4032_?SCK`uk7+)i>jW7DmC z$EEnk#;;>F--vbZvRc44M`;oO({2Rd0gMk)d9Ggj$G$pk65`qqwSQyDJ1~*Al|tWp z=jqs2R3$Bub^|8}RFq3ne*SDbm01o)S#ab4r zZeY53EGHq2yrh&nPFs&oIrpQ)P~Gca5MJ%#n!?XgNaUH55)Ur`ZbCo@CxB~j;m?G8 zMdKMSSIbE4t@ore08FwO6@Us99Ds06eQGP86zf_{(Z*D2FvD;5cw%HJg^1wb9F<_% z&lL|%MCBJZ?6>NBAkwAL{3uSDI!A414&=9u&zP*o7?7_!*m8ZV!2Cg}o7<&XB@oLv z+Z0kBq%ZXXuXuOjM~NYeQL&QRD_c2Yl1Uf_W_`neSey*!*qZU3Uhc|CRpv8KcPbfU zk}^S!iQ#a2DC&PIhs^Y4V5o9Q$?jX!JVpJEka~2ii=7nQM-!Az8`& zMO`{cqtvN1w<>DaQ|hYUW`rplgT)H`s;kL4$K#sgbm&u1@pMvJKv_|S5m;#uHoA2U9ApE1L z&jPwB($M0qicyPb^&L*vP4Nu+eV&u$TMNS!4uO7n-ykz=Q`bM8dg%R|VbZ+&%`h27 zx$`bAZV#6e1sPzA_ll2P*N)xzCt2{$wI_)$k>C@tdua>dk=aJv9Q>pck@-_C{vdem zuO8ytR==9s9g(5Kd2J>+1Rf9L*0$Spd6RW!qNvY9-L+HTol?dKHS0Tra_p)uA!TTz zL>R#6K+mpg&*ao?2Z|1l;M*wVm-lhnAdSw|-b+3XLqB3$I2D7dYr3gxJ9$xVu5QbD z$8N?)TwoMX6aqT^E7m+5B=BE{?k{x>PARQ*28@QZ3MGhwa;8Da#&QO0N_9DRXP1hM zsmAf^_Z{`GhID@q=o5d!L9Lgzd)GJ6!MVJ-9o3o`qXQWrZpZ@}JXf6jLD6)xqED(= z!*gbq*IrywN`YQfAZ^cl`s8z7MXC6s#5S7c-QR~U=e~x{>24O@W_J@IU`Sf&)U>&`gcBh@SlM%{6#O@G*mYbSpaS!k`@Fn*Qevt0=mx}d=%7d;FngokbRCw zGYeZX$d4gXW60{DkMyhwG9u${us8`KGu>$ag{LvxW*S8?Ofm=rFIt|3okrP zC-##v>O{3gF9;XzjW=VI#@Zndt3^V#yS2v0DZAE5nUcr9SR0!pd zb*~Gbz+M)=zPOt5SGFPfR0A13dvRSIhlyI$ z`3Qu_a?Gin+zx8}o~58_){;#FD^9@f2LO(F+%uet=baSIqllC>iSvJo{24!oZ{?2L z{Vv!NW1c=iQ`0!e2NhSt>0u?E)HgQ|6p_aAEM>N__!Q(ud1}oYfHBu*?PT{ zQrpZJ$2t#~`lAm1#=IZKUJUy^$cg_yd zKs&nTqy}r<`d?RJ1*w1eivCnG@mo3klLEW4l6yv3ETF$2>t@VYJ z5D9Dz%(6U@oI+*YkT>!O1oO>P_=?xs4fA<-QEE1qa!AYNw%|OxDL5a(K^Q&iq4<^I z>+K1&twucTjh#MH51289z|M1zrF7K9ChT+5h0>BY@2&h_cc;xRuJOla<9Ue=6p(&h zr}(<(9Yte!YgD!q{{UuBB#9FM5+z)hZ*M|L?V9rj@z;p&m|0w0N|qb9t*Js(D8bqW zGuT#@p0{%?`M-EfLtqNKHUweQ9X~N#t)%Xeykn=ldIyiMJnQuF9is$zWk*XZhY~9+ zXKN`qQhiF}HH4S?ji#pFEVQ?VIi&@{vL7rfXK+q?dewjI%^~Gk{6%&9mXVBdMCSrR z_}uvfV2(%EwNaN-u(Q|SO}CY=EZ;Dez*dYC@52F(2sOH?7Oaf<70+IS#(K4fg{`jc zU`h1*c@WO37&MVcdMjrc13%Z+ykErEo-5aNxx7cE`SIIEiVpTJB2mWU!Ql7f8LfN2 z4(hsLszQ3A(5a{+c5+=e{-Pl0w8ny{vG>032 z&Ie56lbZ5P80u}Ut(J?b%WVzRue}toSixg}7rz}itle2lTiD}{5;44zYvy{!v+&w0 zFABwbJN)-KWqWmQOs5K=F}Q6#dBGm_&1u>VhMnP=rPHF9Q`ar7B8@|oAOff6D8PcM z*udoeRqnTXBlvT`@mj91t39lXc97mEb39!(FG8%lix0}YJH_4()pWg5Jy%X=xUjqO zf!&K&WzJ@N1@e+Ry>M~mEFd|DUJQwI8!=}asF#DJg zPf!$B)SeUZ4WzcCRnWA#u9ok7(MI#5n3Tpsv~em7x;{xc7#w50eD^oPZ7%mux4s&L zZ>Zd5rbTV&t;yKT$139(!TR*Cb?~RdojXkMeah+a%c)-&5?JGp=aMNDoP^r=XiV_jDmV^sM0w}$4Wu?n z^yyrA@J^%R0VH}hnHC)U#lZ4pc*kM!0LnwT2sLybiN{iX(R|=~THgpE*!Q3V|O3X(asIby31>Fz3A;`K*`jFe{Eq^;cSG+RFlX}%(ZQ-V2z?Rc*e_F(B6HhGQX zQcDEmJ;=)ArDo|8_<#F$>ibZ4meNT8vbdPj4kv%e{P3v z&1(#*e2LhW%8YG%91sq1&wdSde+~7!D^DD)%$DQ(I^rg4h4RFzOp046y&GX%fDR4_ z$*t+scSn;}gXMC4kGOm{mJ-on~NGF?kEf~|l)byi#t zlyw;db53EQ>-v=c0Pv1F-rMQ0p|rS>*K;~{4x}QVMA7oN7$N=Q8IqD7v zrFI&8x~GP2R`*l87uUB@`JPyBG(;E-9ic}!89er{82GE9=`-GcYuIXwWotZT?^sUJ zvq(RO$otM)f(RJv&lFdpqaSN7fkmf3XTAF$Q)xp)*L*y$pwA@t2V_F$a6*e4W51(B1JjO62v-%9W;7vg2cgJJd^0#}FU z4qf*d1A%~4XFS#)h`dSSuM3 zT0Biq$BZ7BubwqI^c(AY zb7c&$%^p6}D@nZxJ;Ln;a(fbMF7HuG+2fWdRtaMYqErO~?9Lki;Yl5F$Lm#3Fst{T zq;l#}OO+ni9+BeD8EcQ=eFEW{IYQhex0r!8MgcNN`Pw%6=RK>}JVoHY2YfzlHrvOH z^V?q96qv^dX<(3zq@zaTc?XpwjE=pYsA;OH;JX4JXhkjztk?I1`!-vV~ufuU7IC92RH+t*12Vgrl-i&;z(tIm<4eU%7G?FsKoIcV>AHqQx z>_O;j)}!%9k5j`y>b7=PvRrQ#cNb;%vmO}=$lh5P%V3J^!s2P+>Afs+VrW&ZC1-Rk z*NAm(PsaLXo`*H{oyFiu+Ix?dNiI%Fb_z=EEI1s3J6C=2TSoC-lN1-4wEBBVcN@m? zMHk*+GDucpSB4yb06g(tIpL|bj}%JwT7~>6s7CRvyrw~Ikj;!nQv)E8@{XYK(!Gn~ zH^a?R%fWJLv+9su>hYzlcM{2PTIx9RK`bOcFe=J8=oE3()nV!>w^sML$&RF{$~4`P z;MN`-xsbBjL@yTa5j-Hbl(WcwN8k_}BaS(*ZSd{Pnp`pH9w&xtfu09&V>UMw;;8+XmL5ssKRJq3CSw34&ftU1=8$Fw*6Lms1YR{(cdGRV4h)jiVgb zm5#->`67>RF2P2x?<&2H+gI_Yh_vk%*TWXN)ur9F;z-R6nezOUJhn!~2w(ATKRthk zSN{MHbge4%c$-0sT7nT9E@ozDV%&v7sxmsZdX9wgUNxp@(ZM-;^kF9E0B|sS;f6sK z?7kWBrl$pg)NLiTj@IR#35>f$v6R~R8^Ol!;bGU2Tv3Fj)at7WQBEuH(C_>UW2S08 zF|@hx=ARvoi)o3bf`2jNb@K)gV{>DX*Nl#Mr+iBA7xrJo+hL%p+Y7R)LO62-i_hI( zm;w$|55u*6A@I7}z}jY$uIL^T)MM15(%_3wx{~~bRC2g=S&#)PtDXtKBaZdo__M;l z3%p~aTHRl2x^9^@ysB-rB)?&G_F$@2oFI#dFFTA&JGn=oF2HxJk>u0_`gBZZ!Ruwv;s8|XZAR! z7X?x^WHFgmJ&l*!>T&Jq^iRZ}8R#Zqq8p6{`$p5*0K6=>dX(sJ4$m)Z4E;_zoOQ1o zzVHS1z2i$y3ixKuIIT5kgx1%W4J31$R{68Bg5Zw1RXO9D^W0>ocplXnl%-15*Y*8$ zK7sge;#6M_i^JntOjZvOp2k?37mnQ&fQcY*L0)ij=torq41DeJJL1jezkJ$IVi z(%M%0O!C{Laz>?q*e3un1Y;x)PBZCUmXu4fb+2Hdcbl*Ne0I&yn;ePf2u1Lic4Sr^g1Wp;N8PdEyIWS>l8x=TwtXR=sCfJ&ndp>jDH034owD&i*8qLWjNqq~yg+)4x& z7fN1e#?$+;>Y$P7&32k{*~4`O)J%TRz`Uw*qj@BdJ-zEHvuUKwDNV^;ohO2=J5s$=Ty8i$a-1vvZI?R%3Qca{;+ph62nV4M=0U?;MCveYh zeJjQ;EH!Ii5Vhr;j|rqw(H>SVl&;ycX>sGv4cIq{w5=KAOR3#tm7`~f$&gisKn|{}#xgOGN3VNj@fTI` zAA{`T@!o+Zr4{AlK_&b%M;6Ovk$lK}rBz_VoMf&+9N}{&J8*&K^lfkbz(c-tY z)*!UjZWaZdWy`v>(VePx@SL2Hw9rTYA_mzYx0MyGT)_VTy)&K6tn2sDS8xQ95R=C_73IGSZ~Rx`PZWP(-&yJw zdX3U7w=Zich32-HWljMAt1FB)<>S43?}mIs;(rh6b7*SbyFp zeYzNa5Y{w{EetNR{*@>pVv6Pyac+x}G79j3amG(Pjx%3C_y<6jUhwVSul9{cOl$Xe zai_`xJaKJM0961DyMX|PJ#(Dr$t`YtH{)$SX{~N9G;L2$NhY?9ZPdqd6qZzE1D6Da z3`t@-lU|qbv*N#rJSVD+H^tg&+3ELc&SsJ_1WfJzu>7R)&VNzU9JFcLNy+GURetL} zpYZR2{4Mb3z&9_cTxr^rP+FLT(?#~5-OKY55ao*i04D?vZ~(7?@4N-#9Ya!wTJUY@ zwXz;`!^mk>nNWbS$^lfwnB!}FqpxcEx5b|pz8m;z)>u3*cLuS4sH?*yP%{*XIA#va zps;V@*m0caj011O+J(NGXv1H$8U#~K90uBAlI&U4O3BxdO9G_(cdppRE=^wNlSdCU z+@Djxeh)+9y>3lb;cj4#-rDL*dA!+}7u>tHg>#?O`{KCYiar+cKY;vY9sTu{+!|)T zY3Hm$Xs-OmL*+ zXMQAGacCvZ<#QY$vW>GJm*-sZ)N}^Ci{od)i%kji!Y)9)OTf30+r}`^kbu0hsoIhT z3^wgQ?{*%?@IS#9Hu@FJTK1`UG^?CP6p_j0?VdmZ0!PCtt}q)18R^_O;q}yqh>X)n zso~FuFd1alb=x@XE^eI0Z1nf?ZJtAs8=x5HXvhGQ&p5?;gt47BPSY$cUhrwL@`2uH!}5^iKOopMB#bCh9~C>an1dw3uE;%6UDo3E;#^ zq^6xExz&c0Wl!FJBZSp{EKL>iX}7)^)8e?)5&qA2Y7BELGlCt8wi{;L0mcVkO81Qq z$Ci^%C5m0YnAc&iQdycixg*ah=O zav$V85JK|YX1=h{=J2SV*ZvZXD&{+31g&`>VI#=%l8VKn0rzEx@n?*R#W_Mg@zB&| z@S2u)o(a}2FD~@So9%aZ7cTmPLh+WB6nSvrP70{x1A@mHC#6TE__M>m7t>kr%jlnI zzO=QP;@+aB zs3Ax%lgCcpJL64C(^&Bwm)Ck~#bDpO9%C*{kAOowNeqXaunb59^*q;?j>jgwn?=yU zN=>uq9Xr526Y&0nABc{nairYpT2#7pm*zzgxyQ;p!5$N11=#!4{GoX!ur)sr=o$}$ zEj$ONUQ4QK&|EN!QrjSgdjd?Ed4qxGs^D$;Hs?9xHR6X+j>E&(dPTj(`b94P0I*uP z`$P{jj5A2jBJ5y*ZQ2-;2NliFq}}*~OL3(~K9#9iSoFz7>Lzp*~G z=x^iA0@uTrR`!yYzkP<@XxY+Ga(Qg2A1*n;2LxljJp6VNRUf(k01SE*q@uMwYs5Ow zfxI{_rTA?ulC`vvquyRe9FiG=znH5Vsrfe%f(JWJYlN}!e}Md3b!}_oT^GoiNf#Q0 zjHV}>JO^mpg~)DjrA9cw;~0J#@NT{1%?nf4^nxTBdMuZ5Tr+23Erv-?1&Igm0DZ`= zkHJ0$eRk++^66TMhwSpm_ghdzn{kp`b`IY|f@^g_!_=r$rzHH2V&(<#X0(@{8r3(- zSUgFB@w{x^32YJuIx^S0+x%hiOWg}SHW(#|B#JobnA6} zZ7k|yj}g7(F%a8=jG<*#&I2*QIL-;Hd3-&Fvpue>f2cvDL49yxMTXZ#n%i#pRE{yo&m)7H?z@KMMa3&K*uDw)ru$Had#x(|drK)|iAbL%;kfdS=iV}f z9zt@vOKk%Hvh(VC*MPP7yfvWS>-y%MHN~S`T-sP$+(_bSQS%(aa~m-LZuwXZoD3YC zd9Q2Ww!S0baGvU3h8yG2%$IVP*ZSmX^i{FJX+SXaOZQgpkF( zRf~MZh#1dY4>s3)b${SZ5^W1joCz7ySTC^GazzY87Lg%#eWB6MKPuqkra@gB_JsRn zaNKLKrN*IZ<~T0|Y_iE17|S+x5EL%Z+~G*z^@w{)n(S*EQuk%4^emc3h5S*ZTk6_Y zkk%GyFO_$4_a@R={Ld{{aBObFWGEN}u+K{QelH3O9~f#&YZTYIZH44$>LgUTRF!vS zn+myX5C<9PIj>%Si?%*2_2tu&jM!;f1iU1pM7@y%IAcM_gX?k9r zuEqVT@Xw@6bR$MGP3J4g3aZ1qaNQ&%F6JePCphU_Rm0P6)6{ruWqK+5H)E&p{{VwE z`-Z-Uz*_q)joB9h&f+F78cG)mxM%(1lFFolFga}Et9(ZA#m=33ZQ&`kO-?BSJ;2s) zu_dfZ!M}GZ1zBTIM&15qHsFP?VDMIxWfi3Qjfjg!`!ACY>!tE7q?RINS%Vgpj`iHB z_d{@SIIkP=KgKJGZ;gSvvrEfKXBQGgi#l9eHw=udprXHQj)#$5juh2B4h2%As$G~K z8u2RW5X*0WGTlve7=jeFaTTliSY6m<2j)_8K_`!!lZx*@;UUl>HkN)Mv;NbzyPFFY zkt*vVV7rIH;B6l;j#!YpbB~t_c_4Jh zn8~c_y23R2sF@Z85l3wU9lH*2qdCCGUZnfi6eA@0k=-jvYI~oJyhq^A3~D#`ei(O_ z8~KLWBA3lTv7j4II45>@5Kqi;)2Ehc+ODO26Y3g`;$2!!&6JoQHU`|R3b$3qVmoAV z39mTRl4&jiG~Z%EfdmfN0YAD&>T|(0sXvJcE(y9-p<+` z4y!G$k7DB9(qhnQd;?D+tq4O|U*vH(!+6B|SG0IzLrKNO?c>F|MOcjUv2_IJ?kFp` z;C0*b{cAbRMV6rKT!+Ix9gZKiCaWE~s82u5O~jHgTWk$55DZ<{L0Mlr@{O0@CBeJ}G$g zTWfW@xd}4Dkf1ZHKkFpv*+P;y&nMT8${t^nze#=T;AHQiHH(=Yr`bo3M2#Vm2&C_-Xwqvn0N zVn73PFz7%6yZcKI09|WxTxj-5aj31l%N4en5H`Uv!$~8Ma=iS+fuF*uIJc>ks!B0V z$HyrQkX)^6?sytRxYGj!DLAywp4wVEz)j)%+#)mnjgGLo|EJ4B(C9Do+OkB-3$S z8K<|l==liTUO^_=)UsfL9Ag5M2@+2@jnEbal;k1rgY^~bakZ7z{e_;Yu_<*3vanPO zyM`xr0U&zfx_gfWXp`(sCDq)v+sHh?#4bP923Er-Oyi(F)iP-ts)v%Lw}q{3Ui}^8 zluCvqZ0TkZ(_lU(Z8{mASgqORkq*t-!@6g7(mJpmIW@>H!kb%(()t}sO14#) zqdYh2+=2Wm7b865jO2X@sW@)go1B`lv!-~yU3dS1}GRHJX9kA2H&+_8)|w z5d0705A44ZYPOfA`T=uuBy%=mMmQA66Cvg#x$KA+3Uy@*-#4xP7gqoZ)-dW15@lNcrxpT{8j5cw} z&V6h2X3J9Wwu9jn@Js3twVTW?7RAG#F5szB@y~+6h{!o(kbdbL56^FombMpqq}sNN zslhuJbh)xn$#WCKjF|yZkaK`|&NF~9O-V^v9Q3L=PRy_I2jUlsyki}ugt11E{LK_` zN&BMD_n5IHAG?eK0OuV|aQ61INpLP4v=FRnrf5*9-s*n%c9S3+?#EwB;I#XlZbdP{ z3*5$=S%wK{)i)kJ7m`hV3E{NUuk@)G#J4lgY!O}c58;yoAQC|f$4pMx#DJK!%G-syzgvpJI8HEYNf zt>d?lDih>@=W`Y-yPyY-YuEf?r)Zuf*EGw|4BuH;-0U&5nvzPEp#dXkkcMH`fB*xW zkVpf`uDmU!c*S9hP1l$EMmv44XK`@b8O)ribpfz)Tjm%YvJHEm!ruw&9v9OtH2(mK z8l9tQHm+XM-)EjAW&yu-ae#1kk%PuS^{J|xw4(JmY_IPhEBNx_^GnpO^o@4XIc-nR z1=XdyBob}_`H^tF0l`11uPf10OnL4aP3Y+m7R2Z82JS%zC3qR&3i}JojFTG^T=ZWU{4W)~{kMv=NK6+Gg^3`FY=g*P%wuzt z%Vj}5K^0J(?Pn9BHr*dF*?8jXOu2MVk&&1ryLY-0dV`REUbW~t7mRd!%Nd$vTg^^z z_(`o|Xk**X=4Rag05{bB9j{*eFVnnxD{KA?wu?@-5$}6aCXI+B{OjiBSRRLCoPM<1 zpMqW|(xQga!c<*G>S&;b2^c4s@{kpGG26~T`_-hSN%=EqRj8Jm6mC8w>$dO>BG*K< zw-J^yyb*vTFM=3>#z5#)j@@hOe}`TZxA>RfwoA=E&rP1<*T{14u$9s$&+b{6Y%WIk zAmxu-j91HR;cZquc3%kUv$mam0y^HU%w>F;P-g&)7s%yE>M@R@y@SI(3GptT1-*xi zr?i?_{Fr8n&6r@G6tR5d?ilVUUd}G&IGIjyvS(}KuZH^PhGVz1@XejeLlb#vF9l=I z-piQ@1pNa0(rX?d_?9#Yd^e?E!DnL_Qqo+N^E01j!P~+_^7DX>^q;C0Uj3Fds518_OIj>39J^=UyJUJhVF7>@m+VwXPYk52=8c7$V zgphNc$}qfjJ*%POX;~>AYNa&wXO-w*6}~X(y1aH%=^t!k3&fD36c-VWJj85emn)D) zM_gBp`0vL501`D@mY>Cz^TP~p<*ZVNSk^(w&rh4bt$izb@k-)rJ8c_OxQkP?g-}Ct za_Y|>-bWxSDfht7O5k*TO+zR05T-W72 z7(z`RJ)?X})Z#{jPSMKcw++R-!rj<5K|Z+$HBM{UWz=TZ#i=6HB=-i!-x0^Pv%X9X zigW9X^sk^iC#Yz?D)Bv_(5yFVEf|W<^5)e{!coE8W5~t^Ly&g#$mG|q_@~2uFxRei zNh~gWi;L@Jvbl;|C>jY&0hAre&Gcp<@${`DQvU#CRUqK(c-`OaGZ%j8GDyWsWQ8r%(`xJ8M>B$krOy%kWB6&}n{#b_8re0t+|x~F8gDTe6S0+s!bmyD zYNw`nPg3};=TB=J*!XHu8V8(|d!}v|1-Bd*qPdZ7GE1QWzDZDxzK4I|Tb~shN%1wFo#DIv zG~BF6w?%HQUK?hL45Kso0XGoez^#&T#dDt!KWR-l#9kioS&l_`kJ>I7RX1)KD7Rx9@g?@)X6t$DuFGKCtFYEwL$ z#D5CD9BFpYPX?(fOD6FoLR4oGa#vy%0au{IzE4`?bdQBzJiU$vve5MvYm!86kVxww zQ`K1m4x+xb(m!Y40=BvzP}Qz)9zWiFoZUv}c0tb(p}@~<`qzD+>DmHc>TO}HYSuSs z?+mdl!2k%v2S;%3ODF{3;GS?RIn}$+?2Nf|-1zF_!M-)pH7g$sc>2Qf8++!AB(|cc_RBeaTG(Y8x%KbZoRVsOBm91Q0@ z&o!;6c){j)Z?84EbZaOPT0J`1V4W`&aIMIZRReR_{W#5d9=&y{S?Up3c(MsCJhzxg z_L8Iorrd?VET2$$=ee$y-&Xj4rRg?zz8JQMYRxecML2hl%f<l^X z5qRo1WG*O_uJ6?2mKnKS=ya2O6YwU#Y}YVq5?k6#%JTe?jmMr*j^MfPjQwknv;CVq z4S%T^Z7;8k3n1KOP_U4CkGczEzAJ~H#$GeE(baD76;r@YZCY0V0)aI5P zq>DAZ)X^(v8BF|xe_}bNUVInuMTdt*sbOoVX?o-{&L!)XxZkVK^{wZVtC?u?5NC!M+k3a_%^LL59B8h#|L8*vYkIkx|;q|AoxLwH z=DF))l?TfsvN$=_PH6NW9QcdjRPaRFcZRKn%&uY++sNx_GoA{ZOXln(kG!Muu8z;( zr^3Gwcxn%|U)e#b$f2XQwvjxQa!)Km??0DJW3Eq?Yx*z4_;pLYav$v*spgO}+1g18 zS-?{{VF3+;d%Ix4#XwOLVZlu!BTv*d7roTr{_fGO0V=ckX5CI^gv0Q%^Lf z3EFRSo~{a9snfaSz9slGZ6>R!_;S%gwH#Np7~mVQEWXqejPh$NR(qUZkqgwbLCr)LJxrai-qs zGsxF46J=`*TV#uSNhG-=E4Xl=jAuWGUNtW)JU6M|x$y9K(8SwPVg_AubJUPOI{O~$ z;XlI<6!=y3wX$0qlPf8b#Wu~nfs^HAfV_^p4w=n-v*PcAv)jgh;SJW)TD$q0dpMLV z(S`o^%yNCdD#D{p-sZHcMZR9AhHGJTYtOSC;m8}w$ON9aE$3@pUesKezD<)8xkx>ZK^*(nQJ`y$x5>A(x3;%|#I43zo2M@2 znBaEKDZtXE$JzQ1!w(Sni^K40HaDueT#Be8X_e(CKPY8I+`l(m{w(C__Ev+!r#)@u}X0#?hX`4b*!MD{ou2)1bIp%cwlk z4#-sjz%PKrjs|@PYNtJHc}_i!zry$H;@cOw(&AzpbNS^;864-F5HZKLd8+H-%|_qE zR?^)xk@=D%w~)*ZHx0m^HsohDnef^TRjy@^OtpI}c;t0dmOvyvUj?=tHV@;?dcLL_ zCx~j&sYx4_U=JX00sjE?Qud898_@QP2D81>LdVK7k?ZZ&zCie|Hf`d6^dC>7;N+ zn#Y*I#~>5i@vf@-!}?XbJhvMC-Gpouy}i6Fe8*1wX9K4qyhd*UYaS5R!$W5;*u=#I ziZaDX;JyudW}gPBs9gQOQnY(@w^jm2Zksp+E^tS_4_cVYr`kHI)1sw%dZX5~Z;D65 z`g-ZNaZP(`0;)xIFlBj5V*~^99CO;aEpx~ECyA{tE#j8%PPDeh>!=7>cPY-*I3Q=g zwN>#%Xmn#73N2-x-Bv5d%QCx=R4D3m>x%RL00&>|I!=(@9BX*)CuU&x3=1^-iD$@R zj2;Ft&`{;o6Bss*=Fa}aw3FD*s{xENFPIFWar{6MK|RUmHRJvz)P&wJ)9oxw%_Fgw zoy&&7=WYQwzym*A;0o+DuN_%n%d<`T3jK+2HL?GVE%mn07|u|X%`Kri$#bmE1xjOz;^dM7UR8kmKrD98Yn)| z98svu*ux)SGoApc=6yun_C6%>--q9z1@hOC{gpu2etV3Q<;4|Blzf0c4N zmx-kNR?RL(*$ijp+;-q`^sOnjx|>fKH3byyV@u(ufIc4hSIm12Jf-j5{9S6YiKg8O5^yjuTje8~>5TdP*3K!p$@4ursYn3;5^%$D$G0B!`UwYyG<#C8 zMj21c0+3Y(I2ai?=bGm4d=sb5JWnxCkUAW4S%x-@kTQDo9qXzxN$QLpO0d=r$HqP& z@IIA&qKSNkGL%&f*+9l{eTPcB+XRcTM( zldPv(r;i)GwfhW_|wvXEF~nYM$x=!K;@Z z7n4!C#k8?Rw(+kn*xqy7)rs`2V}q5iBty)o&Dt_D?zKI4TQ;^*TE{KDzfIs0NbQ5$ z+r4k--UZdKbx58FqJn4n!Wi}`0FD4qIL&q*74R0La9Zl&qKu*8WMCP-ob<1J@YlnL zJV4EMw*hAn5fVox;h*6-$l%cMu#T+etC>PNCRWmQsC+eU&#&g<=(5C?=)C6}c7S>U zeNQ#p>OL8;F~z8OqS(CgvP%}7A^Cj6#9~4ZKn`~DE0os!JE{CRcrP^_Kl@hl{lrN3 zN6wBRgMbO#s@NQ4oL3@zK{lzWOE-$HrM2@Hb-O`2><)jufWYnaBv$_bS+~1$f#KCf z?I3fX5p-`BNd?8Wm1S>gvf-LI8=ZrpByo&%2iCj|{Bz?A31{$xSFdo5vJ`d>ueq`E zjo8{1xa3#c8fENORvM0#c=2CIVnb~*FnI0+#|lXw^UQ)+A4>E6Kf-?uH9bpQ*8EJj zQq2vacSMn65l*aCRy~11`9@bf@N=HE&sL;ftn9-{q~j>;U+`v=;x7i;+uUo*71Vc7 ziKlq3Jo6K<;K)YiUI#5=T(6Dq`UG9$N@WX&?2ZKBfk~lUL*LA;VXSc z=F3NYLr=EcQI!}==SPeH<=B$SPX{Nxd7hiE>Tu55-L1=;lwwqH4^g+}>-diK%NouP z$mo^{Rb2AYUWe44C-{Z0MSDJpeRCmn$|E7dkPZRIy?YJTAXO#vDU=H}sK*!--F~rGU=PoZVYMP7|y-zdvm*7te!>j#<*5FTfaNu2B zGi*VQyFoZPKVNG3=U+=74eD1qMXVBeWC0t4^LfJ=C!U8j_7eEp;itsQxHR2T8FZV8 z^2K*5#wAwV0FxNpJ9O*oT%NVyF9m8hR~mksc9(kAn5J1!?~lwZ`9fK+ydz^E^Njbb zD#1_QiKYh?Dk)R0wmx6Hisw_)yuC%FmDGe-f`$1RcwlktIK^uCN8xzBfwdh$9y@qA z`SOBR$ijo)sLg(Wcq8D4g=4dWTJc5L)b5-{3^A1v!xk{9xN_JX!NIM6idrs?ng`f4 z`*_8q3S)>u79fSP0a4WL&p4~2hgQ6qIL!55*-&1r{J`-pj=Dwkiw@Tr`AlQwU-o(H zj@8$Af5Nt!-kG*3rHbNt0vBZ%Ra{}SkEj4wt9YZpx>3`hv(smieL~~qSnx2!k%OLk z`sb~6p9_3XqI@*bt{266D{B&@-dkCP8+{3ous8$h)|6nQKO=c#9O&~ybExpofb?5! zKkT;l=`F}mtvt%IJGR_sas2=otSuVLRT`cD0EMran@7B`mMxebS)33~!HyULcpjDR zns>!dg!lSGYF-%dmCP463}aa)nZC;lDCcS2fPJ=#;;e7}8R{|0o+EpRuH!OIXXTxd zMLdMy$j1jH`f<-n-P>Nriy75?+{xVFY7WE(}ls)Enzb|t9-ru;0pTd#h)Fc{{Vz5{t@pB>3&RW8HMDxhsqBa;fZ6o zux`Hn>*j4H>AuZ8&2JHu-$vG`%nzO%5=JwQ`8_acr+rPRx$h)rv3Bx702oxJcQqE*d$@W6fzC?qHk{ z58nP_x?9_;uMJw-_=-y-4y|E-9H?!bTr^{rC5P~llp~SJ&3wJ%6^~i*CGMxCMDbWn zbnO%*?lB`B!2$LM6%)JI>B7>Fv~y;(n)SWrg$|1y)x-HDy~8gGP;w9+_#EcAixa8q z8tlQ*{G=r<)Gp8yIRSh0=DG_lKI-CMFG_*iU@Ic1$;*8`t47`r65Hyk7T$lg0tk&` z&)ra=h6kVk{V63Ru94`)Lz_pb?EVAze+A~DGV2boT8nm5yo}2yaHRFeUOU&(+UA|$ z9XCa?U1k2nWw(x4h+i^U8Ar;>7lqDnbB=#so_r;)YVEICjbg%Cf- z`aM2LBaSA)67FJ%4_sr6oR9@@e+Tv3FAI2@J#Na}MGVf-q;iePBa%K+#~VQFka-)z?Eq(sMV(t78U&%Jp4uBY~E)VP)A3X*R~&}9(!IL|etT#-)) z?I7aM)UO=H;fuRVC^cP8Ewu}Xwzz$=#kOJ?^i#78cyB>oDe(%%)8V`V$49%0?$+#E z80NQSc;9#5X6Oqk+%ddqdc`i;l3xK%XqU|TRlDrEpJ#$IN5RtK4OOG+rc9Y zy>LOVGSRQ^BJpLelx}5~%KAVIL5WgZfXclA&wN+e9wE>?2>MCUWzybhAPE{>Te60b z0ggc!VV}p+zHWbqQODv5&9(G)2Tm(AGEUn*LP;Eq^0@6sBa6E?qmQ9llZCD7eFO0C zR`4%}b+&DO-Pu}2kL^$Ms+YnI;NSoc@e0=X!{aXoORL%6Y49B~@*IygHGE9OfExsn zkOv2YUO@W3foAr{QIOup=KlCWgf6j=bGd;TbL??kkHl|^(fFR~U$SYIw#$}Xk&Vm& zJzJp29S8!pSdNJCt7WcIzjNt0ejfOq+fBFB?yl2NT~gkA+h zDt5DVRaO}s8)4Yz<;A71r^XMJs{$4+%=&)K)J z%;;V$wvGq4)o&)YF%ulIK2+gw02t2d@*fcDRyvo7b(^g+MR+vbGC>S-ut_9&Mi*k9 zP7f#Ay#n*Zp9>_jZEI7G_UC-(HtQ-NVV}ML!)GUvo-3!k@VCL+>qHjT*KyokFPPU> z%w9;Nk$6Ls%H!_?$j@FXV3%{&rzcKa^NUBvdN#Knm8jZY%;hAGQfJ4^&acCD$jBWt zT_xtHb$_Twcco7ER;c7NOrrun?vld<;QDpxU9P?GgG7?jS#&*0c9cAdt2MbmM;m@^ z-EdBLJuA-ie}}UF0BapOG`YNNe9DBV$9_BeRt-)sQ|V~pDOHW&%$*BRiqBDdndVk! zk(HDT{D6^wap~z=8q)kcu#O2u$B}t7o?-Hf0;%Xma0#yL=-wO9EmcX_o#O)ogaP!Mcxd z+&|U21A*(*C~p zZcohZ%PNtAFivrdX0dI&KNZ!=J)~c}k%mZbl~17^tJjxFvTJB)v39)yJ<{l%8K%qkOB8WM#$UrHN}6zHFAPW`K?|#Cjjoq#t%cB z@sm|wPuF2Zo&XV@wt&Rop4{UEd(rHqm4xQEH8dvE?jpI5i1O2^0@$m&re$OmDFu+OF?xJg61~cBSc0EFJEJt>tvr# zyVHETe2Lc#jKgaW{{UaLXMR_ySGn86u6V}6-seTOBI4)E`!*igTg!}b@;UjpFQ`2C z2B6Zk;VIPa{6S|VntipN*|YnxD@4JvBxPV3bDSv86+=Pzi26Yk7D4@XDd~W49xZalo#d!`89fSq*aL!Z;_lFPYv@KG1h43mid7 z4xAF(x@NtPNxksX>$B=w#x5kE2h2oLxC5b122MKjPrvZbgS<kbU30|}tZ>|uBik&C<;GbIdvZ?VMmC&- z$G=M3xA0z~_Bwu(uHX5WEekq^aT$!~3x>+B4^DGkj<4Yzf5BG9drRAS(mcQ-hlxD4 z;zd@FV;ghG730%*#^b`8KB=PXw$kdBcP!@8;Uz8d2G5r4cCcaG1B2;`-;$L$=#F?) z=KdJ@ymz2kwf>2zS$&@B#s!9Hr(BujiHHX|>w|?n40GPPtqaC>x~84y_+Brur=CHR z&TY}II$(X_(+4@P2~mCH61OpE3?Y$rXMf7!dVK78Bk5g#f~;Fg)<&6krTw1K1HY9d zjIl`|>6rlldiCvG6Q?P?k4iCzE!piBz7O#ak8hsd=UPZi5qady;X@+-0CeR*Y;-M} zrQy9M!@_3oPfNS4e*I=MLeeuu3i@MV%MA6w!L4Z9%+aEP<4U!*xKWm#&Pf|`s;8Y&VK6D`V6xd>?yeJjy4@POq)qbCWh_{h@pm9yv#bv zpnTi*;DtZJMXT1}IiNnS|Y-60Co1eRF&xv&n2GKQG3s~G+>DNxr1d}TxI*yq_zxFNfG?E zI4$Mw8@A`7f-p}VdinOb9+{xu+QVz8Nffcl03jP5Q=BtyARGb62lB3ILFgR*)7)F0 z=wj6Mm~D~`X5wu!85$vM(mYWRxWPnbCu;+YU=iu*+-ZLfJayq?Ew+&q{{Y$g#9%Lz z0P#Q$zvapVomF;|&h7_LLC4auG<|bH(0nUzt6WcEsePI$+YRNjEAR;su?KO+2L$9~ zRey({v=+N>b0zMnEHPNkaM2S25p{-M8ZZ>}zy}S_p|0po6z$yeDp9RCzhtyWzuxKo zCD63EWbwtDOt%rFE%t>L2GGQ(a}Ox09oe%f@nE^IS#IY;Z4TDdLPv<>IVIGQ*Kzr_=Yh^easCF- zE%i-b?85fkBIoSyBM-gE*hnMg$j0nZilgL=8qM&pG498Lo8k*vY+f_ zqzetH4)GJ6q#leE zx2Yw~^s&N_T7xpkgcitctrk>}M{wQxSBKm!=7XvE+CgIyzTlIfEIk4Gdmd}T#N~d* zYn@#lvaaeus7lQDuNnL=IvdHN+H2NV7g9pffbrZyhB4~$#He^9__1F-US8Q)XrI|B zJ2l+WKianq=%O|rUzFMYAUPm($29A|7wY$x>-OX3d07&=rb@&cjD^Po-2VVd;%=@V zQoEY&$^4S6swJ5UuF^0Fz#x4OK9!9+Db2L3y9GEnL3>AbcHSTG)wa8JZ((9kU);^L zW0{0#RF2HYZtV2Qtv?v((s+LE4-e{=5ZPVYf-WVBVKT}e?yxFI}e9D&aj)jUl&D@p1vt5tL6UkLf( zx4zUM)32|V8yNN>xV43LnEwF2Kr6X`>Ium`YL2BIi)nc>Y4?vh#@U8{FJnqZFiMsr zXXp2!#1ZCv{JzoOC8KMkw-F!v$es9Dc$PFCZp7jvEpc( zQPnj$uiZ0-nnom(*8uQ6>$doRW2EZZ)vdRRZsWJNMpR)t2-jkd?;I~dfu8uSZF@}c z6Kn6M=n`K?r$pOixRp`h5@!XY3cDYt-rn>8Jn7s6%tU7cj^On; zJZI9OMywK*^?eQuPAZLGcHcW}Ue!EXb)oo6Qt;lPp~{o#tpY=T00CIb@_{ZDw<$Rz zU?8qAK_?z_3DvChtJId+?rrr{Ng2x^m2M7RDPs+}$3hz*?p%(&J(pSdmYycGu<#Am zh??ES?wTQ%D_i(hIc1ADa2sn02vByo54*K--UIk~sPn8yOI$W4YYw3 zSP-Kqg~mqTmj@hl7ycb+@%W=t)O<^;M{jxd@18Yy!78zwGM%e{*&i@g-P7^(-w<2) z{ApJAVg}RalrqaCT%^#WoI0@?K=|o{&VIGzJ^&h}rS__p2rc2XlY9B|fIQ;d>_d&m zjBs<`)~byPbm|>$ZgBT>CHRTpT^3z3<5|$P+j-`4lTBn-$YHs85$_61D8@hoC%$;E z8_=wcpo0E$A)YC~iU}ho31R`aW%mP+a5jO?dW>Se-|+{4yi4%|!uI|l_;GXL{ao9; zcDlS%$23mI>1b6gs3mD{!g40owDDIh&n|L9CU9pnt zsFDzKl_wjB;=3P=-vczChx!GTte5(RsU&wwA-4+}Byh@0u#!|#Tc2 zhI$5-W#W$z%O;(BHO$BC&@`(n$VUN(&Af66By-(|evieTE7Rq*lf-uS_AmB$OtIQt z%O{xVbqiA$pK8FCNSQ%G1_<87 zcRj1TvedjM;y()LEvf5vaYG_Sa`ut3+sie=5L+w$vu;6E`9@DU?_Sw;Z8hGV7Pl?b z(?M?rR@&|*a_N8znHX+jFgapz=xb^iSjsz?;xUqp?`C{k;NOQ9+Ww#a00|z5&}i4| zJ;c(8WkeyJ`lED7Uob%S76b~8Py0#<2#VeT zHX3rLoc9;9w9-2j$CM<83)AMwIqrDpqP`dRZpc_%O7@C#XO;LSFN9kC+h`soTeE2$ z#J^;B+!VU}#=s?}OEcI?LdKJlEM0XGxOqG<1v6GqJO zN^MtTmM^IqZMZ9n@z!RN%YBn@Gvcti9k@w56l6}XOYMiLjvnm=5Joc zc)W6;nv74Ad}H9R5PUxHlikF&QeI88PXgT!v@A}!C(FPrImYB-2P3X=r||E?nl6>4 zHoM|oa_;4CEzFu-lx*NM>(vT2{uJi~;2sDEJbHJ=j{$4eI#tf7x=s9WyfC~1X+u0v z3>PXlZ##!LY?13;bKq+muN~?d99|mI-rn0!x>)XK089Ib&O;JaSYT&8v(0@D6E1{j zX!SmS6^^M|p69T5C*eUvywrS0rrTJqqdZs9%K{s@B2kPk>|t_wUu5JA$+o@c5n#lAL2baEiX}*LR-6o3Y&kPK*1TN zoms!&6bvx_bLgpwU5w)~-@C$gYW{pbkURWxw3t*0O$;ip`?+fYIQt5M| z-9f3f(@4_Dj?i5^#QyE~G6ZE|mLw2J&qLSR^e>726oFpbSh0JUotJTzP{<^cCAJJP zVbtz8&*NIU7l3pbnY?5*7~|4zzE!m&5?aR#mMETCU)`Jr$W_KLbICmrY7MT3omLWm z7gOY&Q%&)Xjj8G05!dxZmR)w(i&<%pEj$aS_&>x@UwE$i zDXqC#<6L>Lx{;8`tXK|m2q%jBcjA7FugRuGC&Ngs?<^l^O+kNqbh4b~SImEvnRx@g zKMMT$@g9m`@f6pZ?DDm@+RP?EtM-KoL16Ky`~2XZN#_;KQ7tBqQ!hy-k5$+Fb)n7T z2#%MjOE#9bkjs5D#PHk*LNc^*N}oQ-17XI`n~WOU)^raA%i#;%LsPW9mJ5wYe`MWG z43}aT1)dei+~@`fcjKoZlb&w##21&E6WVE#$0en#4-eWck<(FhBy3mSst;qvTN%Y_ zT5Fym*7Vz74(S?9utyq%yjHlE%!wCqkg73OPcV!+jITTZaZwFjHUcO#%@`#h2} zTgb11L}5xv61$zi07vIg_%4+-(Avft!|fbjw^>%{{Tm11si?2Vt8SlqaLH%rPHS4W{yb8tYvk%;a(KD zxwzHi@P?ad5s9!GS!FV;KQKlj9E^`ptO|~KBNg=<_%6g*B-;2!`vgTIYoQ}YCA)#W zOEC?dry!lco}RVxhM9Y>N8_oa@sN_r+gzB>HSM*(l+y9EpOu@-Tmt9Z4n}L}?GDq# zT4m;;r{1)_B=Bw2Gk*FjxZV_t1VkHQ0Zf?A{l%1wdeqTMF>z-2u4!6F&-#yneh%2` z*3E6=Sr+m+aXpJ$mt{t522#aW10x`x#=Rp~_eX(A8x=roQsBW$05t!~)IBg}mU$q#W^4KhaSygu*yv?5EboOlz;;x%u zbqJa}v`bVGqR$gcAc`OYkM5J`Mn*XASbHeNwp}UBtu;N1Nz}Y`r1)(uZLc>*k|N5| zq;kKOr{)_NjFLFd>t8N>aq)e|oAF-K$3wM=(pz<&Z{2y^$%R6&?HHACe(p~>?Z$`2 zPmNM|dr!I3bS*;O`p;Ll62}g}x0dq&3I<)+j0QY{GskgW2k?@^QuvkP6}9m#@7nGp zluGvu=X6Yf0vD#-1H%x*JmRKxBK5h9s8y4?J%>QQZFcKWRMTbFujID=&Yf-I23aE# zNg}$m#4EgRc__e;fM79w63RS=27$Mlz%(IMMvLHf2~1xcLFYGT;(3$6Dh)FnB}ZoTf?O)Thzq zf&l@z7SAcVhIQN-aHcY<#Eq`ux#0TDswA{7ohH5`x7M^jhW;;<==%NTzN2}lBTa82 z#;F$dP{73TkCmH-U=KOZbDtyBwZ9X5KlrPqldfFYcy8+1qJV(X#{`n0k0g=_Wyx=u zy}=w;n|vVf$B#To4DSxNIk(e-tPq&K>;bWu&fneV_=@9>GHZY0kB6?U(#8!ZQPj1K zM68lQYyciymfySrRFnXA?rf8e0Up)i)T>ceJ3Zb_S?T^K_>O!zr0BZ*GRbjwrUtZ{ z@;j*K7i$h2ktOhq(?H!^a9ZpNH&bVNC1P;d)<^KQx z{wiqt6`rGEsKyghRaKME54v!`g1fV^SDb|)b>gzEIH;`-iZPX&i!gjm@Mm4UAKMcp zrj==G1VN>lE$3;Re61V~RFo`LUmyX?0zu<}{{Vz)Y+cO>%w|hr^4bB5Jp3 z72Ihh=(1IclaH;y*vpe@HZ&P`zWDf{V>7B_hMV{jax>O%cb z9Y0R>%|_lB>jp zaUA#1-b{%)5)UymY*qk(c8u|y0(d^I7Xt}XzU>}lvpSyBRii%~?*;w*k8>+YaLI;e zY_>8$=g@Q?rFw^gb@|qPIvsyWj(sg})>N7s7|X1L6)1;cM%+K;nFJHgGtGTod?TyJ zr(C9m;W%Wu)?!-gcH2(l?jJ*D1+05Z! z5+NslmUgIM2M4cesYONEor-FzX&$fP--KQ>Rf}Bk_5IpxguB>Vqo_9DG|d#MpD{vN zl!C2{@-PVt=L;?mmYSE3MCP!RXuV_b@vy{{Um~Ws+a%)|QbX?z5I6TfP3MiKRs_F~t#elHuYQE`%w;ReU}ho<s8%+bo0Rf7-!U;(cl@gwTK8^4Mc zw6}t3B}oODQRKjvSpj32gGDCQI3?J3H3g4`ZM;e1C@o(1PL4R>SC&v>1IbbeP$DNX zdmhHRQ=3+1EhFyV68MwDTBnD!ZBxYh#iZ8SGEHkGvZ<9X35)~;IAE-(tJ~v6)_>s=iH687^x$1UZ0I%>c1H@pABgDz8kf;ypPL(i(R(~Gb?TfBXaHs z8Bh_i&sL95AXV523ZUWY^RU%~b|)$AIClgnvuduJq)!C)3BO~x73CT>eRvnWx< z;m2&(j>R8^w3V`d66wtyqccYFtSD3wY4Q7n(NgiZWS2`AGmC2N~=u z7`Tnok?g(!vej)auCF{3Y|~oy7}2-nffq4cVi5Lj&pmT*>#H zK2f!B2sy~^Io9!3n(R!|$*jR45=#}rv_TjV_Yawq$3j$e?MiUw+^F3nvi|^t{^C6- zczO$8w#N+qYk9H~NMHh$ZU@~Qo=#7tY+UP_cCy#EQrXzWcMkay%G03=GrC43yv&?s zj#z+m?ZhUrrudQ#<7=bj~*%W7nFsrFbEB9abxZnhxQxtmmFa1_&6> z`QT`zwYh-=S5gUYZXufLP389m80Ufj$vF0;)V1jB)=P;4LYsWEZxn7FnTOua+$bG7 z_pfb-LDS>8vJx4jxPO(Pk7|e9NI|hlBO|se(X?FyO}o`n)5(U);UqE19E_~;N%L%GVl~+t{)~r&>n}{xs6-HH=3rZ%cEIM zDV0O4P)5$%Px~MfU!w<4I_{YAz|iUUI&|jUr?)E{t>qn{fdJ@K@;43H{PnCfjW*{; z->d6#X$cpYTIns%n{$9;Sv=jrv7CT2kTcIbzHV1>bLf6=*?cz%d@teu02J%ji{Z!~T|V0lb#3OPm{w)l;ff>RxESm+jFF1=%iV5o z1!$Lk7S`_`{bZYco5JZNUR=r;Zw>(jH(aujjPX%uzZG=oHESy^dh$CPYkQZD^AY*6 z#-W4nR*3m#HgkcA9N-g-9MrmznB_UeUdJgni>C12v2eP)vD>|=iEQG6J&~WY4ZH#y z2Pf}z1a>v)H=11fu9Yq4g`~f>ZB`=pGs=Q%d18@+I)VV?V?Q%<>0M>b=Z7_o9t}dv zO}6_BHPykmaE00ykYUh%@dFlZr|+C&wP?@cPY>F7LBFuC;xBP?G)BhtgykAsG-!E^ zk~qP_s|)}@2c{aNuX7hwwW=TC?}e8z=rX~4w)e5e0==!xyf1GsTzRY?VU+^&QvQl z;-H=h>03te*uqzPo?3np_$_sNiw$R8)#ouW^QMIsZGa!T(qnE$e(1|%oK$+3fNiuy zw7u}D)FehRERd}5Pm*@S(2y9$r{xnH1re4}f(ql4xRa0uc&5Sed%}~$H;1)h44^VbmjYyi zaa>Su0uNkgm z#d>#zyfvrkw^}R-CbM-Uj}5-bWmsZd0L;XV?UR7LFh4vhIXfivJ223urFq8a^~?VN zh93@fYgq3m)9zdCO!14WONnRuIr&x-Nj2SYDW?hT_4@@twdk#O#~AqQ5C+ zZM#cj9jnLZx6wR#<5@MU$szFNrSVz9JG+q{&zZNl1Cpn4$>q2Pl|E;FXQz?1SktoP zIw)-Hd>5(TOBSMT_S=RL`DCrZmBKtyD--3iuH(iEkPbnwX7C?~{9&m!ogS%Xnx2Cy z$!!{zk1-+6A}=J1v5;V^9&yfdUoL7o=8JD7)wY8hjUg^%OL^Kg`%A_f1szu1+UmyYW=Sn2+_9N}3>bN2X8`A@&N&{sN-o-Na;U5O$JM%Lfg^kS zSA>zNuoh&pV|^!8+-{i zr^|q&Ol8z z7x>FVztE!-X%{xv7Pp^gx4M$xNfoq;q^TQ-kfzbb2UFW1oTn+AYV!CyvX-7P>X1!{4Hd z`-YUfk>}+>i1Ln9;0%$+T=W|^I+uZUXtf8klFn)2wQO3(5*g8CQ}U8gSphf$A+eq_ zUTfj4Cr7gI_Ll_KHuE-}Y$Un9g8V$n+0G1mV`Sh|lr%u9Y_Eyt)169yJvDu;W(e$BxAyBWm zWo6wTGB8t=;Bq+`HJ|Xy#QHoU<4nHNZtU*iMvg+tte#@z5ag9)UYP6899B<=Y&DGs z!wIa%tzBE|0#7=78|w#2rkRP{A}RqtG2MkDo}hNq(R@>_+)r<;UfRj!K>!+y{htly z0&>zpB#$&_006{ek4n}!c_nEW)#Q`8-h5Z_hLPc)22ZP7Lj}$4qDSRKZEl|Ers$%#SmP`(7jY$v;0$w``j1r5ue?LzceAq>S2}*9 zZT6WVyoxwtMJ&WF-?~NsA&JR6*Pdv9v-XRpYWI4Uuc}D}j5jQhBtd+@Nd;FpaKsai z1`nvKY7mRQ=2WR`b92XD3-Hzd0D}*W^vg?2DeZ#Ca|$BC9Pnf*+GAa-C?|uCM_$6RcLg#J8LuwZue84n$1jIGD`jNwsKGH8vrG%ytAL^(n2b6TmM1&AU<002 zEfU=Bgk+u17qRiritgu^O<3iBHc;Et4O^;_-E8=J1}cA#FbB zvl(A=v^zQ6jun7y*dTGAUQT?g!|>SI>eK1oGm`aPQ!%<11CFF;r~?~u!S~|5o%|@8 z=7)O^fMN5cg4@npr}Ck6KnZ6cw&DOJ=O-8yq~w#)4X<|W!qYwoY8u1pI_-wF2AgcM zfoUY9?34}(Z<~7Opuj%$$@u5Po;~p0&8C-idY2Z({J1Yg$L>+Fxq%OcU!ll7tKa?} z{4TZ7Y?ny!4~V6@)FK1zT79hf`xD4F43dm83Fiz)wLX1s!rC6Zo(1uimuKQzOSu|b zOZ>2zkwN|2VDReM1+qHiVzGFM^I0p{$w_xSL+s6@%$Zwee zBLjELdkg`Z=6pfnIlM~_o36dY>3gWSS<+-4OiTPsn@;6WPTi#kIUt_jWB4D!noonZ zE2~XQ!Oy5^+QrL%XGsO>%_X#5L}ivwyfSd?dEgRjf$=ZF3nlS%%@2xitq0l~SZ$ic zWtteD=3L3=ENlXvSOL#LTGQrk_px%s(@{vLVWGp}O$OE1QGzoZA}FRyhcl8mD#@Lp zNaSQLJ$*Ur&mG+9H<7)S%H3aHDtWEugA{2QU76e%?#l6lk%Q}BKzMWEPs3-jwVh{= zT{GP*Qq8Qi@hpUqfRUrZ26uHp{G1xx_?hsp;ZKM43k^on3o8ptqVV}r+GSQmBPV=7 zumw*UY>vG%OW7-3ksMm)<+1WVjxR5KLo<9ryPTQd32^N`_X0d9Zb2jgfrHw;r{VSX zji~6$cXxD>8>ot^$+#47a3x0)C|$is+s|&*=bHDx-FwD&7nfcQ5ZmZ-I<#hIm5U;0 zZc4^jfOCwD^d`LSXPuO>1d9hj?N{W+x-9h=nFtyoV*q4Y0{ zJV<;OXB^{Qw-;Vm7Ix^y>57)xWWYrVK3ovY3Fraj)nA9cGV!mD_4vYR5$cf#20Nc6 zAxPvH0oY0AE*H1}=eVyb@R!1UcSY8$?)+6Oa_o^rO3U_$T!V}-Vlq9u=Dw3YBh+*+ z5}&g8dRc9>$d8!~o!oB5^e{dnc+*F?*Y!y} zU*T&Tjc(i%2a#$FR}(nK(=2eaZ|KSQMsu3@e^JwXbKsp$VXbKMTU_2KkwxTEBL#9! z5-;oT|UQVX$+zh|0RqmvA|w^w{J^VEExk;Qr@hvTNz zg6RJM6z(i6FGMO8WVA(g409l4ok!hX>PF-01`3aw{6`wj9|}J@w4WSn8a(Xw5=#{5 zq!x&Idq-1%qd5BgYpl_JFnFgyX!Q#_re}s#WrTTAT-~gK zXn_s$f`c#Hsp@&a#W^J%Qaa&?l>R85Eq8a~KZ-_ZW3(4H7Y)13c=jqDGqY&)9lo{3 z>OKnbcZ89r)hwlgB{=h!l=RL=PsYBn@OQ@D8%FT#dS0e6JPM%&v|(gBbAYBpwBrMD z=m#0~%hY^co+>ivy5;mTY4_xLwx~SGkd_5@Op*|-$Du*o8pbv1CvII1g+WR;K5o;# zC3xdWh+1jdgozLL56q3v1(f`x{Y7>j4fvnqc=ZIcjjy#!tBj?czV?%B=kBtjWEJ%u zg1(Hj_&M;`N58ikMcux*w(|+5hI^$Cbh#LWt`VbU$>j;%^cADy&xhJ~hqcR368t`b z*Fn9N6vY!>kKO_RaD~29!RwK?wrf?0gLbilrq@H3{{V#{s%wS3XYmo*!W*OJOJ!^Y zx&~4MlE5+fvOeelp7r!!g)Dv-d^hlo#n*npod_LObbbAAp-@2DJXN?1K;pI8*k#HvBllop;(r9op(Uwob()n`HIy( zZ*{YqmR!8Y*xn@ZIKM8oQ&?G_vx!#VM$p}PuZ-_vKp-&4DhMEg21gzlG@p9Q;3IkFSeePB`P+hIlTH#T*|jF(V)D z*Q06P4)KSGH0d?Le{-locl*bVHUtBV+TV-(TjE)Mdq+iK^F<6;Mz% zzH@~?cpP!pisrRHihm2VLk^#1r&~1pOEfm|MFN>RpOru*zZ3l{=v_bi2VT=5{>r|! zyGzw(k)SGzGdDl*ER(>`J#mWhFBg0r_+4*!y4J6CJX(O3G!Z7ofXcu=&JSD>k-MS% zyC_>pNu2XhPu@7)XTd%o_@AQx0BP!1mpTTQEUIlZ+c><_ENn?E?YTyHJ+L}rwX|P? zUJB5qdt0kpYu_)+{q*;3Ez5#3=1A35Pz-U-IO$&Vs_UK&@YatFmd`j(9>W}S`7N}L zyR(m`G4-xfP4NeXJWqQ(Ne#ucv05;;SiW%T_~5eTUB|nC3C22_^-|F0Ra?_!d6&fh z00MYJPST*#qng$zF5_7tw`5Ur$}xn65x0;}Ab0F5;m;Q6I*y0?jWT=hvdB*bBuOK| z!B$h8kN6R0+&&_t9*;xfPYUbs=(iTvR~np= zEDFYT5PhQn2F6jrT=U1F!R?yHyYZikd|Rljkls9!+Bq;w8U>JUKX~8|o3(ur;vdl$lc@N6OVdV+brtLYELRr~_GHfS zBFQmuU9+6vag0|%;{N~wXi#{{FA#Xs#9CgLd8o>tZM4&-@^{SHCQL|VBQ5^QjC0pD zx8mQ4TJMB>LMTf?4aDte<1l zwRo2E?5jGN85cfiP^uI-1Cfph#&g!3sX=OTs&!`XdoLrc@vn+CFAjL7%SzMrO(Hu7 zFheZHV{$?8{g}hO!U(ewgp}oBc@Z##?VGP41ju^;<`T(d?oOQhV0}X4vy;6 zQieB@S>cr250{~Eqhc>mGD-BSgdJU8#xvxm)K=%fo;%QOE;ZZRoi5&cY1Pb)6~h-Y z1CQPYz{ouN`t#F+wo9PounDuS&^mupUi%k=yjg3m+|NCw_4^p)k}2(@X7dYYEg*0R zUU?kX2dj7sT8z!8Sivkn6TSvk1rKqad)H(Wu})nKZ6^7lxiQZXj{q_jI48bw(-rq8 z!fi{#dcTK$*L#`n9n4IFEE`}QG5tQZ@eY~cpA}!swrguFhF_E_MoVCSw0Iu%_Rqo} z2x>kKu(+9^@;5{nrwumj5rrp(C%Gpcp0rJDLyp*`h3|9-NBUg&r1= zvi|^hp1^0n6}hA9ntj-{(d}VO-(JzpzNs9F-d~hb zDGZFo!0s`V{&9-Vi@_2267JUe%I;tcd6}hDI8{^A?;d?l z2UA$S6!8|FsOx%#rlWjiwu@wO#F01OQI-r-Aajf^dHpNc6GXbc5zB7?5l54{Pyrx} za4=6!IjtabO>3e#X*5ecUgyqf4scJFrA`53hRDxh^s6i3dD`8c#t6zORR&}MKvo2t z<2-*l?5uP#3~bUOM5i0hF~aor!1SuIUEb#6#`PJkoS&IETzU+8j(Xyq+ck^sdBx_A z>vSi)w6-2}p%6Ufq?RGo@y^xs1A$jxLD1ryO9U3FBk+Z!&QGAh{P?ZibHkErwtr%^ zxDc-0k;tHlkz1|+1D?a672t{R?_ARSMHDk$PjP8z#z4sUkZuPguI9kV?bQAzw2d_= z?_v91R(BfKpW)kOS+!d$Tc07fN4R9G1D)7mjO1sIpN(KAjt7YDzpyl0cADx*LrW%B zG}@k|^N!qCU!{CMkHkdWG&fRNLc%p$nIFtzzrLv&wuy;>&FZT86^+Q;sOwK#~KJWh;{F8RTFN4Rkt>#0?7H zM_b6IhIp<4D0hM~yx;?lc@@}McmqvMNxVS?mzvWnqJ5?iWDAan4saj8L)yHbSMYX- zHFy_Q(Jk#kk)BA`Fz0viYz*o#*MKux#u43(xHV;Sl|L0O+S2aw9X46wMSm;>8>AzS zGthe1W$>5c9<{INa!09Xw-8yR*hZ8BRhuNBcG@=MoMXLc_;1607}d3?JU3ybtHK=a zk;|z#B=rXv^d7bJcBSDD4tPgPHwg$!Fr#&(N?UXP0C=9h#)TC1CEJy#ubIouu4o!& zoBgYO6SNVKl1QMKm6+fH!-7HMjw{RjP4PqFf7>98>lT);AS<=pMaVe8JbKg`_lWMi zNv7X;de|FldA>-kp$e)p!0si6eqX$Pl}p7o9|)%KHlLyR&rOcjEiyfk&2RHhoMG4! z8H+XvCzG1dQ;*s?>Nz!`$oS({nS4#Aczz4d++Es9aOGI#6#+Tple@75emSoomr>T* z=j?hYl`M*~s~na%&gWx}2OTqCLf?2pPP8lH+c@s0QETKx*Xg!F0~IauGNH)>xasw; zDAqOIV29JR%OtddUJUM}l|!8Tq#m8QsFJ&~A_*1`~D`#g;p zRh`B|9Ov$i0O_3ZU!Yn@5TCNFU?9h)bM^eOTH&J8ZG~o=NgT!1q-`y@yH`hM$}v_Y zc;`G|XWy-9N2F;{IMfDjE?~%nx%nbJG8d-reob1{>~7)IW0K+2Y0@Fy#Gf%_9SH5W zAC7B-)ulh$QtA3esPSCHyTlmWIp|xC{^q+ZbGazq=Ff;MmUzNy5`?#tnKE+N^c-rVxt&6@y&U@ui^6ycJb+V zgczh(-?ww9CkF?C$o#0kn58DY>l~kqd&Gr@bosUA)wW$+NrN0vB#t2< ze-kR%05K7&j1HOf=B&%`Y9`er*1Q$0Num-|`D%_>6#xLFvXV2% zKZSjLXW(xKcrQhkU2f@QNJ(PN`;=AeFi$ug$>zMLSi1Oqs@n^#Hufoo_EZInsA2up z9ZoatShm*ems(f%Pm%mj<8K;U>chheJia8dhGtu>w#BeyA2TUY_qSueY*&Np`iwe7 z{L;e4(d17qc#(g28NOm0dV#yY8ON=C=cN2a@GhE$%SMuGsoG-A{*LjIdSNg==*I`W zad-a!4}2Zse-g>#OUrwktDZm58YB_O{QxD%x%TD@t4Ce+D)Wi&2I61m=N%*GBm(2?g3JL{{T9w6%=)n)e(!8NhG1F zWySE`kTm^3=pISCxrY&3Ce;IPAxpLcGYpcWC-JUke}x)VmWgkBuj>%LrMg!zShy_^ zP(k^(DPQjWe=6YoGvg~r@4vIW_PT;cGs_s0YAnpS$tu4w#{mJ&Vfc&2dTq+hB(aNC zk%}z2+anZZ`>1|kNX|*?RaX-kbP701*X2^OJ=eqj5%38iGk~S3M8jAPUZ$Xl$Z&IIDK#z1oA6+saV3CX(^`lY~cPJuZnfOc-SN?B@sx_OED;jz;M}PfPFjHL;aiL z{R>{x?&r9UM4o-OBz*Z%gMtX_O~@cTt+ZKcAN^FtrBBa(WtIp(=}@1r_nLZs)+<79mSKBeKyySA~@FD&fi zHwI6#sYAG)r z=CgtKua+=fK;WMJtLPhjU&MDF1k?2G9!PD?(p?34Wq&$fAeNECUCVNdM&NB zF~w4pZOH9#(6#+n!@AC=;fssKl}M5VNHHX#69s_mF@w+eRNg4lY|f>m%&^O696n{? znmjIYnNUVC!tTf(wdN80A@MSJeLQ~maSJmyl+Lo{mDnB|ob!&g)%YID^5RH7(RlZA zESn14xiKt2V3p_YgyWtn`5Jd(ZWg>HevG>|v2m%x9mG;e1d=X9dv_TF4j6RCc{ruj zbh`~JOpjF5?Pj-x!mlZCq2zXNFCYLtKMLqI``axROFQ(n@?g5ft+Z$qG7@qM^y|-G z&awPes9av?aDA%iUrL$X1h~nK3u6Fqcs+f6YTZj5k*6mlmdx|*7g;_L@p|f-e1mIk zXN>*U$>bkSEA4#-&*49hd_LFOR;IcRu{Q8zx{w1C0t{ec?MNTf#U4P8`uFK$$ zh@`u?yV5*wq|I+G+)3w>%D@Z(!N54KGsXV^2)-rwO4jGbmlw&X!DSgTwWOi35CXOLkGbkYAKHMDs6^kx|5V1FQw<^qvq{onQNdt^}b+1p?KWE>HdSn-`bEHWc zL$tGQLKKcc9QXF?T#c89JWp|G>vd*h3N`@aW=?qnIIc*-vfUp;8nk4;cO>j^wpwk@ zsi;9?r>^N*~zf-#EkJ}>xFQ}LX7cC}$}@Dwo87*?jPq%}B2*?$hF_E|sc>``eYbaH3;ycz~MmC)@l+w>cOBz|S;lb~>PX}edUvmU z(EL^5`$?pV`u2O+FKxog@t}2f#^xn^ej^-pt^>dx5s$_`7HdX{{D||)KxJ~>cLF&a z7#PMq7w%@C2}W#5sVgTCUYIP|TjhpEeWo=mFXXI4?EE?Fo2YE#wq zPlq~;vRYcSq2*smVAz4wdNM1-zTfnP5pCWtACR5r)qUN}j&8MSm;|JeKnePa6ylK?fs_c;~%cx7T$kt|qtB+3k?!-gEOXU$Axs8$D zOMT0aEFY8s)V6v0SCqD$HnFW)*~P0m$$1=%P0}s0jewQf#jrzx$3vbv)mc0zs@qt! z$g$j8Zuz8)hCKD>t#eewJ&~m>4LIu0K=B8}KMviP?`!tGr`VDKK_-# z>Yg;ybre{yA!5u2%8CZj#~Ane@m9uxsOdfxv(zo%w|FmIrAb3aB)}#m=b%Z;xq6#LB?zag(`EVmenBrT9NtxEGMYY8h=KX|6ZT z9AT9?!ezc@_8F=k8nlAbTD8=!<~AxM-m;Y}v15_Bfcy<>Nk3?&ovd7?7Z#7L{6pcv ztji_tmtgD2jqQ#G4myGlMaW%A-2=>AhT)P zj53r(Z{o?p=RT&LZ{b$g?S9abILeZC9N-U8TxjuSz2c1??$_+{#UijrJBa}BLvjsz zmXWN(1W~Q5ih%A`Wj`@J#t%%>QKt3@Rg`pRn$O{VbXm+SE(FoQ;aOCNAe`eX)B}%t z#MgEI01!c>E}eI1@|e^j9lt8ZI_>1`=DObz>b5anICu&&0?tDK%p0dT&3RqljPD^| z^k@&1cPLr0C~&}x;ejLA_B}bNoFa4kMx1Auu4jMr1)lc#9&VU#F|8d>9& zOp&nv0CXuJ4}O)!Qi^9qI<`c*W`}#?#g+tDgUi@tnnAGuJwEaE;;#<^Uulwg)9K5t zTd+GqFh&PGc@96VdWVKCv|U2Yq`SDcw8E0USSqeFkO=4S7^YqLp5IS+;6Rq!8;gaJ zhT)#;${hVFRvrmzYxSAEB7gtU{O8cMo4Z{?JMB0n#Gr}1t-F+|$>en79E$qa;n&4K z0?Vap5$aGaw!Hfzg5Gr>XJyFF-P~s#E9K7-cmr1O!Aq|V+_Kv~LNkyzsqK-0_*N~Q z?ew;d7Nu?F+}nKVDC965arE>xuS3bM=~h=hq4(&b3WOvJ&sBoo0I z=tr@ys5DOl-fDVG+Mb(oE^eX=KiQ%u_pt%t02>$>YhgQ7t9p;Z6&YJdmcGqBJF&8g`$dhvsk3)>( zy>0l?*l8l-=~1SR@T{=8`C29e4GRosz?N$AYECu`j3b$v@%gTTuKX>$&+At7XfHfUV#&U497c3osd%C@Wiw3E{_Rzx=oqHm!IvKABZGrp-d?&&(NFxW*4EJ$cP>nm5DS zzXt1Vf`3q;jk`bmOIY zqh9!a`a^xAU0rFH=V_KT2WzlA?QzihXO7gKGx1lBE;P$)3;CSF?yCV<@ic)(GD3{> z^cCAr7a7Nwms5}0d&ZG2~NZKS$n^z`(s%?D7{A-#2Jd9_13@|60@%<{2ct^#a6TWLXzRa?~!{!9P9e;-){y&Xn_(Q~+-M+7GCU(>j zpZ!^r3<2x4h&c7OL;lEcKZ@M6&AE%L$35cOl?of->L}vmj%Gf;$Y<8a>X0mvG(P zptyKQK^t!bIl(eBt1IAh+<(3l%c6X^`tVuSdX?c3f6bW-8$viUrpgCX)t}sU=azV((JqG($&^#~U zv41~?bo(W|L~E-tGRHLPtRr79e&l=%7X$)ETRH2|Ue%**j#W8QlG5krHle26>C;JX zdYf4ZM;YoH>Dd0Y&}jPY+SrW|-5%Y^1~NCVm&qzy?-V5GX(Vp>h7UE{{6x~_u<^OK z@cc1dSj>x-w_!WR?7T%T+(uY&_jn_|b5?Xu0$JG@ZahsayB~L+wrYi;>wrNaSoGr} zyc*QycA|PQoIWOUn(m`~%WW(+@Q02yjLQ~Rl< z6=f?7dsif%;&*&?B%eyd()7)HUAvkc8qzDJg&E8ARU~d8k~#XG51h zm@RK14uIz>%2$KPsi%jP?>&c7aca=q@BBC6<<-1V9gduq`i7j6vI&|^u-pa7;EWXv z21amkU8jdW8((;X##6Pmw0d5NWDJuV>3p~eOzu$Sm~sY2NY6OwP0+j-tKIlZ{uA9M zOKVAFka1>N|Q`(L8=UL#;!h-|6m;Xy}bLp3fW?C2-qz$fS{+ z7A^F^@AMdazM4u_JWNJ5cjZr0)^%-fM3UP`(f-j4R{nfOIfg=o-G$nS8aLo%78wBb z>s=;=;ExOI7K^XwHV=Omp>+~mJ6rCLd2NXxiB|&zeEkCTAXg=Q;=7*@>Gqx&)U0hG zx3=9pjVr8DB+>>{mLO50WL)KjPI`_im(fiIwQ>}EQC&e#|I{tMi_T;i;}Jmg+luJByo?3mlOo zh>=C|k`_YeEIIqw=Dv{8wZ8yr*7|;tXENQ-rrR!NB1?REXB!!rmwJKM1cU3|ynJSH z2*uN;^*xGMO0j9pXmC^b1542~8;wK28rAoPXSk2|%@xMoF(1OQ^#Yr-^^GCX#25 z`#(%=^MNPLf)!;2K>%YQ{duoP@cx6YU3fBo3#N`+Tei54duzL!ak1c;m+zmwzzjCv z;EWt#*PlZNIj1Q6PssGuWesZVTGoCaXkIJUY&FjcB)WEwJZ&P2wahl;gbHI;Ir+#S zl5y$mo-6ostN#F^Sj(qHugK6D&)HGoD-1^@vD>taagD%(j=2@xX;vQ<^`EzBeju98 z7@3I^Ya|Gn)5k zY_Ggg;Jp^^+(~@Ux_MTL%4E2LG4le*LaPunhF_SBV>QC~v%`0lga>0kkmA4RSvYJV7st8s|WLL|denD`}_Q*+6#r`?xC6x69WAvtW*d zXD6pGuPSrooNUO)QiWCRrkhSop*v6nP}MEdT+`vRdDdSlNRm`mmpfEvX!)=SUoc>dbAy`Y zd;{Yz5BN{Qo*>h%R>JMID|WCeaNbqIqZ8%Iio1^BPDlr^$-u9#HS1j~$KD{g)civ# z>6R8TIhNs|V9tsFR&yhiS#Un`laJEAMDYj0**qWOId%U427Z;4!x zF<gfjI?Ksq4lo$His0ZcWT8=_MjZ*YNcDSZ zHGA9jcb$w#l1VGN7~OtGc)-|zZ7K&Nxy|JGp<$uv7Z$!P@Ud-P&5Vrq3PF%IHlrvQ zQ-TO_jo*!UlEFzyx^Dib)JHIkqsvk@eb@XOo~Ph_JHs9jzMsNgA<<8WrJXaUO&kW= zb=$ZXXrwAg<3GIP9>%&q4tSG8@J_1+z2QwNJFo3I=ZAFQ`F8T!;FeNZqhp5040iGc zb6y{P@drluou@^qSw{|)dvCVbS=+{<=3IaQ40f|GZKa7E?F1YO{t(yi@4Qu~X!?RR zq&xhQiek2kSCb1QlL-u9Nq`5dZ3C}foU*4aZd!`R9%+PAprsdk?tK~Y!^B=D__3$y z`d*V1cGE|2vq}Zt#g;9na^r5+1mp6h_-EmLcf)qKQRy;SS>In-$ggCB&WWw?75wE4 z4snz6;P&g9y`+38&@~utXZuBzS9X^IQFSX9X#zGIX;#T8w+C)`=LB$he-~)K*&6lQ zXu5T{l@Q(AYEpfoI1dcYkk1;G^GHLrWeT}CJe(h}r^v6%sq&Jg7(hHkS##)-ItgWs&@t=FV{C_bLJj z9RhB^$l|)YO?vZ9lGnoeww`Cdl4$ND)UD+6qjKa`2twTW2{72!95cqmK zJ3EVI20NQ?-N_k^$C>7m++%im7#P6h*PeLIJQJrjtEt#s>Xtg?q72??j+YVKk&L{g z%As<4xX-RLn#b@jhrSc)O}EEaciMKWzEsgc=gB*?Zsixv4y6EHxFd`V6TubId_nkm z_FK!XQ%Tg8$yr;;5*42UU{DqSC(IAb0AH7bp5~QTC3cOUE%|PI__x{yy%ojKdz~tK z8+l=p=W%<9cvn^M{kEh300{-P%pPH>!aolmI8|ZZY7t^k-uC)s#mTRe?m(S@Ry40bd6?f-D6w(CDqe;P(i5?X@{3-VCY*C0L*`Q7_I>Uh_52> zcZn9p0jTRRTu(Lpj;z6da}z1~M$xf}J^gv-rZT)m@ejp%PmBKm;VX#gy3|Vmv$ct> zys>V;^{%xY{PRU-ww95^P&UPn z%aK%a3!FyV&N^|L@Qq(my3u97l=yLut$A-9#ihBrU9pUO?#i1LPT*L4pb?JwuMY7~ z#eW)W-YvPZwqvB(T+1x)8yS36Wjl9e2Xwe-FWH z9@s7Cxm1qgHC>EQ07h~S2pl$qbH;t_>yhq{bn&ZS)maZqz;fY|d zx!buFRap6?GcuQPA;R_pk>A)r)k>$n*u{^9E%#X&XB;vfTi~^lrG$%ZNwHM z(!P4|=Z`Kt7q6wZn|!jzc?6NXrOGr*D&(%_8-DWj$>9E7_2eEY@d>om^o>a_Y@T5f z$#F3IIuJpTNGiWKBPB@ALB~0+SW0d3D_Fl{9nY=2A>*NaYpCk_UA>$-g^bcH^IOUx zf>c4cznGzkJ&D5ukU-#yhyE5vff!Y^ANN4Lk14oup%v!~A#46qo!(KL<R@k9F>(p@jZIt-@D*^*bg z5gUhhkbo78e=gm`1>AByx>hp9&M#fOwK`~FDb!r6M*F)X>_hQ0Owk_B?^x1xJ3A{l z;SUtnqFEYMKQxOZYRDsY&i&qAaHM1n$HujN3&L6#jHJKTFRbCW)pyGbmk6OXAGCse zsRVAUh(i#qx8y1_jty*R-XhX|DQY4ee&L>bxTAzv>C%0h%x{@NxOM&Og$N6gG~w2zq0ayZneGfe!==pkgUOSNHFC<(KI10#MqD$Kkfbmk34MNKhY-D zydP)wXps-vlX3}}qT8@B;3xy2Rl^qK_BTE)4*+XdaL1$gXlNSMpjDnLhiiX55GY@i z@x0)J^D7d1lgQ?+Y%ZbJR`0_e5qkxgk1c-FB*7U$+NH7qR%{YjHZU@A*6{Dx(NrSa zNm%5>)B4UO;<-6n*4+<9_(kyp#r`R>mR}BBqd})bAKJ#G1h4~)Y(m)}ll{V{9ZoBQ z*Ss~M-fI$So*;QHZ)A`eYXYwqriMP2i zI-Tr}cWzL5A&<;)$>zONR<+fx^a*@Vq)vXt5!kU^?@M{7jO7#*W#@3D{gSo~~(wl;W|I<%_afX@B!Gu60ih_(n|{_BMM<%Yq~ZNb>HeL5<^8KQgfE z^5dpXaw==h3su#;R`=Iht&XD=$ewf%l(oHzc-JN-iOhHagMpHHCj|Vp^LL81e-LV# z{noeQCb*ARoQByVJV8?fVg)$DZNO2}7{?WA%Ewew{h)IjgOvi{Fno-kmC0_^?5do* z9tYK%S8Vm&Z{cpEtZG`1_PQ)rshDozkrGSQX;(OB1LbAxPhU?@CD7Z%9}dsuRYeU$AG*SsLSEYX;Mq+qK*jUNY)jX3j3q^7X`MQ^cn5RubVy| z`2N>U*6*KCnNm$mJSpa@v_a+HxEvfQ%VkLfXBpz6bzC<_v|%ca$IxFAJbP(l;LG>$ zo~JF7MRO&qH&C$ zSaliB57MUbKCN!IT8tJ;B$9^PZo3O1JccgCzEB4%j%&nj4x&<6Z=hr54WlcK^JfF(Bm} zm8@Z&BNXy7ypWcVFa?ytx!y-YPBHS5YNtvmT*5V`-K=mr{{V<>yfGwt$|Z&PcOc5v z

0c4U!Umb?9-l;N%LgsQgogO;tQaIk&rLZUXL(DKK{cTX|qHoPpOrEqT9*uBNcE zmrFWiHj8kGKG3q09Gi!AVn}e@=Wzc3cDZdgQMA0jnJ%uvU~YT3VOWr{RU26b)%il; zFhEJ`*EPh^*A?9RL&Kgd)9#CF`W(#-&CRvK+`{&Mxq)$&brJ7r0Rxgo2V8fquUcIn z#eNpHx3s$QWU!0PZR%bqy!H)+kpg^SxM9e!NU{B5OL_;oBTE>iMQx)33R zqX4IB%F;N_;=d>h&N0XXpQAnv$)+Wxz)f~2yuxD$V0hj%a5n-RI)VtmY>fRltSYqQ z%Popjq@O$vX4Ar2m6n}zZ{jT^N-gGBXxXyL8Ac3#TZUy&LlV4uMJ32BR~yxE;NRPJVzY=Ef_M%N^e2PXspvTiRz zy@Qg~9)qdrG3gI3p`q$?-%lj)TELT8r|+f(6_BfL*mC$#a85%UVyk_97X4juSQ=Rc| z!>ip&1-$T8lG!V;xRFnx})f@xO^jrW_+71 z--+})hmu()w}si2A!1%UNZHtusN{UdgVWlv292!R-$@13o=2W{MAE5^3;p1WCVaf{ zkJ>++m-oAjZTP`QYaxxCepd@cc%$w}q|YxSHi6 zUoGK{Rzor=8$d3(2d_C`4^A;#QN&cLy~T0Wqe`E|>}TqJIPo8ctmV1;eDT^wk=vAt z;DGIbOERfA$>3ygKs~WvJot;mCtSE@w^xP|d0pGHo=H73l1cn)YsKCno5dH>M|c(p z;>O6bP~mzO1TN+o{{RZ$XSJH%O`!=~=Qubby}UIg6?eJg;-;ki-H!hNMUv9iD|z(= zMzoK1*xx_BY-a=m)3>F2&xU+Qq-%E2#C%)`#4l zIPs5$bgu`9JQRxs?9v#m#e>Ih6})N?vd&39X)Thw0(AE0=ZmXQf)p6;+_Rqni(T2fyhwc9yXFsLx$=NI_jjo=-H!|6Q>VyS4{lUwhblf z+dNKgcNN(&^8R7lEslG2uCu~A?v9%Ey^f-RQb_`ZMceb|faS1Cp7^iR`#*=;CZnf| zJw@&1vUX&%n`}zwc4ShVk{&h$mTc##ub*`v*#}Y<{%3^zK_;!JJ=dE#x$>4VkWN6` zGj7iu5syz!SmLRva#dDiZEq7VQTR`BYvJpCLgwYBj5(ED&*esuKlkv!5CGtY&j4eZ zk4@9{4L3{v)9{YGMb3oA>fA*rU$>F}04~@i!zsgXRgbPZ*003h4S1hU@J^rM;#e8Y|Dt(5|+S60}GM}z#UIo^4|vhGt_lAlH%_A-$=EY9^wX`;U#BSl)ECu8z0_a zV`(FjGmMJujOfZLa3=3&d!5I{ZwyCsV{zh5I@Tj0x$yP0>LqZl|R z0Ce-;iMEm6>8;{mqJ1M>)J!qS6U~_3HC#mam2gP}jFJuy9dqaF4fdlgnrKqmYDo;G zZa&=mVRcr-W!1iDI&w=Kp7rRyDDgJ8c9B@!uyIki4 zd-N2Yc+EDMQl|7wx2gDp`!-!4!+NBzZ3;ykuw6;}x0W%vf+Ugoj8Lx7J7)xe->cKE zd=;xVnWhF8Grsv2=?v|;RN=FR2Z6xizJKuyx}S)AI=7cT8PnpH%zW|1dlE|0BLxTS z%HmcWbAyt3JPO3{---2$E31Z=&(oF_Q|H^D;4v5uSm$O31y9zz%89*GI%&o!YInXS z(6z4^>hoFnV*UiU48TJgGzE&NeX;<|sz7XIvAZ044-}i>ufQh054U#ge+WERr&@eXIz7a<={38`^Lej}s6T!f1v~H=v5#YeUd5&SWbmJeC!0#M zuv4&xwuV`XETn;-nN(zf!00PKX*eq=+}$YcbHNiy_{pgmZ8bZ0n$O59_G_z%hIWO( z3m?u-7Z}GMg>*g-_W>J=UN^-@y-2=x0kk8 zdVRcY9FWCn^G9`WAjd3Akl4ZJ1xWO+PvKX@jcuYBpIH2z?Xgo}Va^PR=;0NQYKjB#F9ABwdv z7VE9yeR(3hWGs>;%n7a{vYYkfqYi)O+*cF;F%qQGUOD@nNhfM zOjrYwMSQd3eR(urh!=Bda?c!%wP$8-Nst0$7#RTdJd@X&s(QTwr38|(`iY~bfi1i_ zV`mMj1&tCZBT@GiF~}RTndk`Q`qxf1sO$t2>i!wJdlQI~>F%KhB;0V(kkXUKT*w;( zpKpOY8}WtVTx#hMeajSvA}3cx010*jxleP)Tz1Yoe-eCEiMCCm-ub^c-ijns3iFT{ z4S`#MkQCr>Pc-)2^W}zZ=zHhIzluK%Z-uXit@SjEQi3rptjL*(o1Kvxh8RaY6Ouq6 ze5Bx4$ePcN^}DdTuB)mw%yMQnhjO+VK35zfCcsy!fKGAJy>nmHUsmw6y6(I_)Y@~x z(b(N^BQq#i=UilCCp_ShjMvBdHi>KEjc(sXlU7@KZshW9?a^7-64+G8z}$1x_3J}i z%I8)N5QX`f`U&uBTk#IL<=ALGF8dvwy}G+aErd-R1DLOeJ3i2?$c(CYaq?wGFmYZxuly;u_-n7nqu+SCOIw&iO6b;- zY*ug&%6z~Z1Ng8r+qHXkqkH0S0Y{~4I#-F8UGUbV5ia#BK+O~zTLwAN{L>p?jAVjy ziqH3HgyZjXQr;nqVYA3yRJ*7623){wp%8YX9h{7xl+Y)INGcT_BHSR zI9rKi8mEUo9ZRT7CA7lsIj4lWNCpr|zIKiGXDsWzln%$I%RV;o2Y`G+>#9rkZ909Z z(B2zojju2>nKp&a(l83K1a%cQm+?Z!!FqhU?}q1b6GmgXx3av3H6=$4i3o6{WO1HO z1tm1LMl+*#c6B-)o2*(}-dyY2ZK#QyxRV0mA!QjRGP!JHfsabvu=vaH{{Ts}j!T<3 z?(Wz3b6g0Pc9mOzpD<^}4@`mltLLu~e0K3~i>)KK(JkcDEw&U$qCqKr>$j3rkC^9- zck5m)tN5qIT0FBr*8W_uI9!GV;V}(a09!!o|dD%HJ}_v?$%k9eOuV zc&`HR&&NGSN0K=2Z3Wa5;we@qeeJV_BOqggjvMQNUisl49eg0Tvbn$U9;(*5g~14I zXNo{01mR4Q#Sx8iIucln9GX>?mB$EK=#LTAwOV$+A=~dgZWvFN!(r7 zHqJ19RU;hn&2V?04ZJg{URzC|-`v}?GYRdk&z*-1KvkLqJwV9$In8_Dj`i<_S~i?6 zd_AO%XHb=qUsbrfmPL$bksK==OCsYNSnxBBYtDQ}@gB~~D_buL+a{iZ-9FWDAU5+! zHs7CV+~;UxfOF5F=|p+H#)m>}?s$Ax-ZJnOz4m*Hi`^LcwMipSvEX>#p z-mIr_$K~r^Wq2pWzXIM%TgTJYwRjjTFsvnFjj%@N0dQ20Mg(=-DyqRdH@OuhB(zsP zf%tpkuNi8ZM1BDI|0{&yNdDu031Q#sI;hGzy>WVRr8VOmeTLc*r1&34n)z=__~GK833#JWxz{!O+snrd5Q^!VOJLXlNwrU2Fb2>&^Uz9*z0t`_4C-EV z^zt8n;Xj12USDa~V)swFw_WgqE5htR5ZJe~R$lIPiVYcyEzP*neg++{bd;NMx0pY0pd&G6s4aSA*UBX3%x}Hd~!KP+0A` zw~_uu=oe@vLm=ajM?L8HcMX=e;$yF!Hb|neOhgi9Qf6bsgkc?a;1Pm(JanwF3NZJH zrw)B2eP!WYM?ljw=rtW?;^yM%B#u)L+Mt;sf$~gWXEEmt0OyiD>&<>4+k6`FCarMx z!sg{J*gR5x*r;MtiDiOnH2L~Vk4==QGS7x!Ip)WHp zz@H9&8%u93uY$FI5!vcKa1q2Lj(b+Y!>~ld06kl8AE(!GXxc5O*|huHR%V6#%ZsUE ziK2EY0d1KeoOCPFz5vm_BIue^O`usyd@CKvDLH_)q8djVSjm|cvFJHm^&KnF^skAr zXqr^s1=X&ixAJb@ZdF8%nJNp$hv#rGK;C|x4Rlkj%I?vPY#gTaXV#MGUKzZe?(a-d zEydD<3OpbbCN-@vxSri(mMB_A7y!#51a5AaA1LH!74P>K+N0T{-onw@Y-u8zR*pE5 zM_xH%OE&JO8RMa^MwTVX95t}M&7{shQrDroyN&e!01XXNBbcSWoA(y(cM?)FCe>w7 zIXP_S1CDFczu_$SYoG;7^{~=!X6AccHd7;sTLUf#1ORc8KLhKTWE)bkw6?v5EBP(g zFC-TYJYyKh7(0&a`yAGVu8HvDMSH8sw6tr-8{YCr%fgapFw$!@|; z(8lttBz@B+0ALrUPCN0|ysuO7FZ?8WjBwg&vD+jp`{0Gd$%HuErX+U^PXH>GAn*V+ zzPxEN!aXp)X+uYJGk{5s2NuBY33#yXqOoQ{G7G{C6^h=z^fNG_S(*)HHEzK>!ukB z-n=&DE#Xs!WpW54WA3O&ZQcDfo&qvl(iAcBguUHQ68L$iY4Eb$!)4^_9z$HM&CJ15 zBo0Ii<|A>)`7xfHj&8|g;@iClH;Hu%W?QR+b2I&=+xIBjHkj>ppD!E$!E(o_@9#Id ze~85Bx(1D7Yvn{>cy48pB$5>w$JxU~7v>GZ-+k{bg-6Q8M|F0PLfhFX6D@@Jq(SvBWN8+tAt|o zE>D#gya{P-rCi(DYkExDZm*~>nG#&wq>{bAqNr@BCnu60JY&6d{yXs{hlf$qT1`nv zi_W&Svw`s`^c_|iZpyS#}_>N*0^t-RoZ z`CzAMBmvGV(Y$NoD7<;T9w=bY)?$d!{bkk^$~C3o9#MV zTOb~3q`8mF3U~p5!Nv#oey7rs{9o}`hP82{-%Vku$}R$!;$@BzAvoL|DCa%NJXW!U z)6;X$o*SD;v+K_hYd#{=uI=o6C1qu446=p7><*_t!f~{mcg<>P5d257)L_&#t#aDh z5>-vR29UFpov3iTjt(=$b1>?T$}RmOT$p@n)oDmIsz3MBo4hTk0{Nucb?-_@i8& z{8~w;s#^j#+)IT8Pe6k?CmnbKxgAGT@cx;m{{X^4dm>v$2g)8@v9K7yC7glN*0cN% z;{N~$c&P!?b%-wRVv&0c%I`JftcUTR!0ca8gqF6#WB{(pp_@E$n&$4jbEfK^8}juV zn}}|$0}*!|fO(2eaKQY;@y0P+lf-i9(dp5{xkl*wGT!1l>yZ)i#2|1{@Otr)fsd!> zTxW>3#!kK^Rgv}J;M3Aof?GFyf$u8Kh_RA+HL zGI-*vSy|{hj=d*{JVkeLYZKZmkXshShHyp|oq%AZ0&$Qsc^z}LD*Ve-V=4|U-1kjC z!?&6yu`6wEQ!4CsE>CiE+PybU@g1eo9Y0$!$|6v}79T!11Oj;;^~X!8zO$v;sE&A* z!3xd^QlMaEjx)Q1k&#&*9nrNpZX}XOOp*Yo71eTi>ykJ?2M4Waq@K*@=Cjc0HLW{D zmRV%AL{)9WYG5dEamE1T9`)eGp1(Jk}u9QPl55LS1ESbLSif1HJ(n?rYW~@D`s1#M9~b1#|L} z=XXwPqML19ob{sPD@RjP#8+nK^f|plZ3$Lbw__~4{Mh&Pub+HoZZ$nsf8iIolFs(x zR2LIMGFeAaoZxZO^RH8r;mntJ&2_0?8Ev=uo>~&4uYYRm^j`+)Hdi9%FE3#`fhVti z{PEhh=Fs7kWhbG|_0&Ht!X!^~91i{{Sjvm1!~b z9-m6JsB3rjHVrJ+WX*ykkY{LP$XpEc{A-e54C*?Uk*I3Z1rPHD$J35_S0!1#hR|-- zNUh`VjJG}l@Qjjpei-d;uW9h-f&4$A zwXC+s&5k(6=X1CW@Oe1n2OQSFfqooYcyCRT*&tMMcd!eM+4t|BzLlloy*5~_e$A&q zq{|*M2I3g|cEv=hwJRft{ZQ-)Sb>JUi$Kgrhe+R?R0xLhFFjKLNrBi&Aa$rOJRmO*O%ShN2^4)ceV{J)Jy)j95L&`7{NT}Bdva$ z*?1$tclWYAu8(g1OBH5B0T8#oIb%>=d;;)e#UYvoXh{wuE?aL;yTB?A05~}!xu=I* z+B4gspTaOoad$s4BGh!vG>gZ!Gf0F1464Ada(Lj6@vl+vhsJ$YO>#R;G(n_AC}iEV z9FV7C5J4MDW3LtTrSHK#LV2(CElWVOmeLe;x3kk+dDk(6g=P-lC(GD;+4@y22ljvP zPl)xowM(lTohsTOpJ$FKl&dPICBah2;ktv@9cy}6YfGIodb!0KkZ`FMuDwnlRPj%X zZSKE&t1-I)lmZcxoD;Ap0CvG%-7Cp_apI4N`u)Ylj-fKOh3?mwp(MJ+$V{;$4nO+! z>AxGi8>)OT)r_qmzqYtUn$@?AgvKy1F~%@P0qMtj@rw@{+20~s-sNPJ?FvQ+C%2_~ zjufhUuSR)P-D*+xuw2OSsWh`CQP)sE+dXjDs_q3*x+m&Z6nj` zUt0KM!d?S9E%%1}Lb1bn^{f{rRk~e0^a<^BiS1HLTZNSxNp_G?b}lvo3D3-N_}5hx z2&*IIF}RBJpERA1l>9&7PZRjh#P8tm4qUuiR9AA#EyR(Zv#b#j<&qe60Q4rk#?#<; zhO|lUEp$zG<@G4wc_w%xQv_-OY(LC-b^rwjARd^mw)0lMn@qa2((k9!%c=6r2Wue& z5yu@d$sKDKK=|FG+O^h^;+qI$nPrU{?%eEx;!-e6C{gnqeBU-R#%amLY-KENBBhib zi}5~A@h`&PAKvSORkN})hL9AFDMW)GbRC7VyR)9dzpZ0qEYZHz2ma zW{hK@#AUYRSJ$>*v?qjheREOKtSz1y5ln(ecKH((1Cz)g^cVn-O5!d&Y2!Z?U5z>K zt}Lu&lqiWM3B4C2g;H`x1#whSXTOES;;fY7l1Iim#)GYCF{F1E*ATR8fbzuAC@a9qhe%j zykOvM8`y)>CmeHMELiv_#y%PGC6A6~mK%$3e$Nnc86*wHIAVGA7{RZhG>;Q&9v$%w z-POWCuc(kGwVF_?^5vCOsQGc9sRP!#<1KYOENnTgC_Cs<@i&jWPp;dYCiq1HTt54~ zsz4$?;Vj2J{f$|$(0nDR*%)rp!U>EH!bv)Ucn$M6P&w)ac=yDgiFb+OCDwdbqgmbQ z^2i{2n^~m!R15;@8|NSch9GAZ-sywD-zKf0czV|E8Dk}5zIL4oxC3?zU}KUykHV&< zRUIyK!knQL?Q5Pd;%^Jv>vR7AWJ1j8I+up+Qz4LZmBBdx1He6MZv|<-Akp-R?RBZ= zwXnANVQtE!#0hRkT;%axrRKRW{3MZHO)9K*t%z-ut1Y~J(ljM7G25T7dXL2(CD86P z*sg7^Wz+5?lM}}$D2fN)UHRY>*zr^Km3y>z)02`^+R*uz#l9_y{{6JQDh69-$6hO;o8cFYH63agF7%mfi%PKqs2Nb4ADDyJ2RZ5KT~McU z8kH%*d+i@a{?2;L`gN&*-&ojNDZ|X}Jj4Ca>OsI`-zq@owR`rduIRoW@jP0k#-lc| zaR4_yTw7Yx%99Gf5>L#kFu2Y$lbZRXQ228ngKQzuHJiJSG|H05V?i2o^56r@0yFb; z9lO-JTWUJLm!;`($uHStmfhu=a1bhIm09@J&%vXVQJT>>aCl(W8+`M ztxI0jA6xMClyK>=gn{kcDIpUDpDF+axd#I{_phAwJu_1A4b{f2;n*D6OC}yz6^v;6 zdTt;b9@zt}eG#g7J6DZo)HMw)TFP~6d9D2MA}|l8^Sw|l9HWsCq$ zFatIQ2;gG6%bjAz1RfvJCbYkT77ga?c;0z^RZpitG0l2UiFEB6{`EBv4`^4AM)4!K zR4fdH65$GxcKTp(J3Pq;={K86!2y@XftXd17GJ z_B+oFcvklQRyTK%>995>mIB*H&C_c2Ry{cwKK1miuYmjvx)NV$*9~QTa7+-}$ih)O zk{19G^Ev+jccHJAZ%kS?p9hnDaM!o%=R9!|Ky3ZVRq)vZq34>R;V8UiZ{oXog~awT zb0xaFfPzK)$LGq9KOSqYof|FB8y8ljrOc(F?y-0}eI`|&))Q|%nI>505+gS5zr(li zz^>Cw@JQCQ>FzZZvamN+VmK#}LrBk)y~+)$*%;e_#!YJ4{6W-`)%4#HSxGJN0ils_ z(3MkyPb_dpuN~`8S=E+n2=skQ-rhJ<4QNz^k~s+ZR1Uu}W9&yt$=_o&h^o(&J|g&2 z!(JYEd^4f6(rSkQU4|&6^ODFj(EIeRBSg@ALucY>H0@s1*_GG*BLMP14Zj&urw4XV zO!ViydL7NW%i}9ZTR-VHu*Qub%f&2&BWDMd&pm7DjeEfQ-G#N{%cG{DcWWGPm`nAgVFOdXPp(QbDg|S-frIZ6^1_HgioB;R$H2P%tp# z=ftF|0*Z1n4oJppoz*mN0owRhdy6S9mPEEHWwmyZ9DoMnwD&!8#Z}~`W_fh6(^|Pd z%;B`Z23uR`7bZI^okrzcL~jyJ(4*uM6$509cfqcubWaCq_Ii3taQBx3lAcp5M8M~y zfOqw+kA+(DTKH4!)7%Ix!^k0>Fd11-%vi81xQu=7wcYA5XgcMKY7%QAcr4MR*|7w~ zCoBO%pt%{q$2B`WS);|x$nc$C!Ln=D3nVjKKufI zcCon%rbz?v7e92L%D+W)T?n-LE6Khh{3g?8 zw!hUa;fi-=a}2Swfe=O9M2Y3_$Nk~-rKdwkV`Q|E=GGn+(4)78(@E2nPyDo)mUEHR zf=?f%cz=oY%bhXd`xGX0a^84xx#9{>IP}MA_UomWO7Prw);CdGw05FpS?2Q#9-BDi zay#a{2f*;!_@`O9eScMw-S@Yc6Ke(%2G1nptz&sD8P|fZEoUd9KmXGB0`mJ&@@27m z%b6o(D(do?V!-KuatAfZ{{UuO>aex$ojkC-0fy$`B*#!V9=!;zBUAAVR|{-3yNQlh zY@vzZuLS-lr8iG|%ehh?w9aGP8T_(a3VQs#>u9^^k1^p~S2H?2N5glpMlWVq#G@fv z5>%XX%GYn<&x<}R&~*58vW+BBjnK}e)^zpxm9lvC;}tx*9+x$&M?{wL;#5KAw6MMb z^%w+W)~-vX+szyhUqE7za-S~LJYe8}1`nlkVsM_Du0wx_^r8 z{Mdm107txd3tR)-d5MkOo{gV+z}7UYJw`d?@a?tL?W%=yE5OmJXCaR#ccBCv4C1r& zjUsoBOBiF3e3O(w>`;-=kPjLE04BbK@IH&;{{R!{l3!Wsv1#{qB*JaviahyaoQ>Qt zo6Hwm?$Y41LCN?OwGf%IwZp7}SqEbw|+J zt-pok)U5R=#5Szq5bu!wnuXe%F`9wI09H(8OU7ZDfO!Qcf;$kVQXuqU&ICd(N+Rg zkm%ir8$5C|UCxaf}Xsv z12y!fjjrma!g0j}1ZgQCvTr>}mN}#!DIBRhagq0NUJvmSPZ6!;)>?Lt94l~8#_>e? zaI1$b;OxNRkIV1xSk%3?HK3){o^J+&p?FRyZ8TLnwEBa6oLtLopCy!>JWi~@tFBM* zka#1x@4OA;4QIn%Be$PYnLb7-zU6odqdO%a?*oB?6p_~lzZDLV28H%bOIDd}FV&rx zl01?XN!-BgAod$S{d<<)H?X+9y1ToI&g$OkVKjmUNgh1l7F66Bhq33H=2(fRWOe&E zwXUbTYQ8wpyho(8kzGP&7b`#_6;Xf14+4CyLlxm1@faQA+W_tHr=H`!3S_8 z91<(vH2(mI+9jr!X{Y$62=Aftmff9JYgGF?9n1=WfW(aCZ7q!bc7)?Md2U6WHSVjU z5*<^)_nJP9q{Tc>d2JMt+aPCqgi!2Cxyg?tkCm_(r~|cOKZmr>6zfu2-Rf;`D?|(n zI1CJfvV)Dp_V?~PdKZRA!><+VZ*8ZooR-TRQNh0v%F;)lnoYbqoZ#`#Q|L3iW8lkc z+kmn2{}3Domxr9-DO6tot}q=_>050ei_#8A-=vzUNW($ zkzN@ZL;!6}u6QRKf1U+lcy9B=H}5T_t(2wFzt=Hfv8g<6IUwZlE7oE z@)ijUgXK=!n34~CfIIqEm`~%Wt{y!y>e4wRC(K8Y86;$LxlY`H_j+Jp*4~>HmHpf= zVRF!ylQPRNWQr{H{nF&{eTl5)R!c#+D_q*}?za}1aczB}YEtQ!Zslh424W=hhR@2Q zJv}{Z*$0ihFf{oz-w`I8X?<|)V$>E0=ZH#3Cw9_EQUN&tfNSOd02S*N8jYD7E^Th$ zU97XH@?{{OnF5T4BcVCZwRsntwqGtMAfDr}{3}{2Np58~%zmYK2J=DJd^nyO@NbE& zq}8rxm6{08*-R=43}X|N^F)d_6$(hn=e2n+#L0Ev4hKVAsT|Qt8HI1 zUBI1G@WEC)FmAP{<2OQGu4v)XFk5IiBN zY5Jtrv5A$Yw2<73h?ot6WJvLXK?Q)^xFl`ldzOdsJ}1*Gwf_JWYjEGqsw*Q!1)P3$ zxhw$#b`CdiMt#L`PBU_|c13$`v5ndCCY_-8p5|$^jdJ2hFa(l-_bA_qs0{W|jIFk^*=;y^9)4mi$1$nRdAY4FS8 zrL}{{cdc4l+N8o(kuFO*t~0cL@m07PE4RN>Uoh#uBGSAaEc%75<;=R2lSv!gxm$?c z-vz@fkC})$EuKAj#Z$i4wRhIO(W~3dCH>^e%W%k2Ia32;Myjf$a4~=~I%c$|7)x2k z#&lp5=Py?&q&X;LnO4Hqvz~ zy)RzyyIn&IH~LnV5u%m4hm6STHn2GvUNg{iuRi#F@iI7cjY8YvL@_kC^1!CndvpjE z3@+7$V>?M3Nh+tPIL&$|h`vAlrt;R)QGnY5s9?3zut#yj?}LO6v@ zb3^VtO7W`SB-Q-R-%R+=@P6Ve$zzsHJ5aS?3Tma}luyAR2+j^Mk%9rn4RiYU#;*o= zmd4Tz8&PYqs9Z#D5o7tHnjS_iK z>dTG$*CQF~SY=5(R`-Ks@D7)#HT}i4-OcPIJX6|VHH*NddDwO~_9Wo?4uJMw+RFB0 zj#UeD>fdAPy?4aE7>it6N$oCtM0IeHUPXS56c*nu_={j7uwtZecJvs@uQvYxg~#A; z23p?TY2FvMOS?wILhypa~X4t{`2TL zuBXA8PmLwMIm$uKQ zTcj3O&@>t@33RIovdm0+IFLI@y%!_jhgf9vlbyo z3>d!L9G<-^gzz_lyl3$DS-ZK@HH$aYFJEcYV2BySG6i9gHbUTz3i1f`#dh=a$q^bV zD?_)qgTX@4^_zPyvLvHz>=yQN{k{l9fzZ0Ds`-B>&a5BQV!nF#fuPN;iL}3m$$zRu zvaHgo>Eaa%RBZj{%+A;+a~H-(99P_5W4-W?hhmoNUHfsmj#ZIlh%AvALCk@{`S4pO zIPJ}N{{X}99Yf$LuC+a8do5PqPgl0x9BsN~Dgya~%ONwrBesC2r^Qmn3|V{K(F6j(F}zO6|N7bU3uzn0#-kT-ske z{#cLgamMjra?+~4^_Aeyebe(W+aGHr;NZQaMvFMpGJ-j-d6=1Df>D z3HWE?9mUR_XC|$8WoHz=ahBLHOtWx9xN@W}M&1{WmC;Wb?Bdrh<`po?rL{Tj8v9hR z)~`G-X&uDxD@iDpc!--}JKren7*28s7#^Pcw;vI8O)lc??QJfvY{WsN`%G$6s$s>ilKlnRPu}Y1a|Hp?!655#|!V^*hZ%+WA5} z5!{g^N~a;C!jQNJz5`>oO83tI>pGsF;rmTP!Upl(bse`kr7BI^W6-oO5L|fgTD#Ho=zh;6aICTzf;d9O^9hCF5P_}pDvYZpFA)b0a81gchK^G@am1cIhr%)cN5 zKDG1)m~}6RCQ%_lcQV5aUP_W=c^~B+J9E>H)%lC1=pH)~Tin_C_gZSr0h;c~ zadQ%V%p-LNoSYx8V_uo!4+BSX_PXN5e$(4xDAqqU*69Oa8;t(%%nO~)FdNf6nfle0 z)JpoaZ*F7Q{v!NQ@V1X*cdF=bZ+!7wMlO{kX`_u@ytY_KRZy**WR5aMYm4x|#Qy*Y zc(u*$qjx@!9+NMLUHp@=pmL zE+opZ2bMcZo}RVs`lo=t9cuI1#+n_BmPO;0ZsBMx=6LbDI1&Sna6v(X-xYq^qmMn; zp&YP-VCNWKyyREQ`e(y?J!@BNpnWW z1+7n{>l(C|+C{a#iv%Am5VEsQ+kS1$o#15po`)SP*>pW4#J8F&_?UQ$PGo>V7nLk> zfSdAAM-r-`kmIfoPAjIDO4EMABh{^}ZzWGECA&7BWz4AWv^j4vSvF*61E*Z|tMT|B zPSPwI{@%`HzDC-}sS`;79IGlLzU{#02WxULJ#maGsb2aWGvsl!RiEB>8f4!PHID~* zmk?N7Dz}m?oIG)tfDq2`tU-wfJQmxYdso7L5;c87>%@&U^TQ?7Mbb|p#IQEwk+W|D zuh%)xHKXINi9R9l<=nPD8`m`xe{@vL?(V%fKh|h0evrJjC z%7f)#xa5oq@G(=VNne%R=~$@2J4W~He5r2!Jl!a>xw*KWMcZ*HFEp;8V`x*HDC_{p z>MM3{0eI3oI9;V>b{{Ro2n#rFs_d<};Af}?zLN15#J>$`cOdCT3pShgvKw?rq;tnC z6a$mrjMqP+c!x*+&`nmx;yF?B@a(=D8aU@(PgM&egN`p7 zX?7z|)gI>LOAnIq`EM(*AcN)>W?%~Ybf?;Q*7w7jbebNKvfJ$Y&)O|_#>JRzF_mSE z?L6)$cS_0Btu@K@$MH4Hmb%@o#oV#jg}HDbOn|8>#KB@zObio^r@s~J_g)d3##hYN zc9!#9Tv|roXR@6O8-S=B4a(B|q#ky*Mthvsq~Q5^lho*=QZbU}S|2^z>iXu3EOOgh z!eH}E&aV)5F2oXdk+|-_&p%H2`gctD@p-4-nJ2sZIK5O~v7}3A(G&}iyLlkskid?= zg;DU|!wF%x)HMG9657iI(IA!?SxT~ih{tj<7+;w3M`7#7g!r4`KZzYW@G{>IMJ;Rct z6Fi?OL%E$8+DKdx`hToPtY7xB|HY3CfIQ=cQ1& zmsapzodS51Lz)K9&2sVlpE2Mu!2q7bkzCoM5aWG9`qn`%}tL$`3+A zF~At_kO1#quY2K7i9Q&fbBxiP9K`GD_@t=A^IVJqr+`1%Tz zZ5FIZm(~s+W!D&mYN2U+HbW@fXWpBJBMB{ee2hBd!HCucwRjw+8cY# z3Pm17<8z=%&hIW`Dv`ZOzzlKNlf`)6w|C&}X4)2-&V4Ubx3>!w^~JoFGhD7VjCpS| zu>k)77+k2vF~IG<8hlFA{2^g!rTB_Q)FC02p(RxSToi98tepJ4R|h>sdRS*l3CS%_ zoW)eBQqh~eiM3A*X=`E*uQX9vB<(EY5fUTX4%k#GvNEyzrzzKH_3{mO!(I@%jxA5^ ztu#}NBBTurl6>8x+83b6E0OP4{w(}o@Xg)kq4oPp56<(>yzEJX%fd?cJ5@ zF8FpdGPc}c%skDj(DC!yqi;o`$B^5C$+aW-hK7n_Yp33DglB5WaA{B zdU0M|V|(L|5!^Fe$#;2uD>7mFDFf!`?u>h4s_S|z^61drExqU3;qw-Im6%NvoaIN7 z%B>k42@c;%%}J-DHc*S)>2JOzc$)W0{>asJIi%C#2pR=^f)l4FEIM=t70;Widx#$L z!Z!N@st+zf``2Tg#aM7U3}kbh8uOb7t!`j9H?qv_yJ?9A(n0CY4}WTk8@M#7CXddV zB8*uOoU*X#f&k~-aA~!3YbdP_^L%#mTrGrGX^b-Oa~?|LJCtN`)9GBb{l(qdhh1WP4%Kd!}L3a%B4U%K!B#)G2{vc=bq+6s3f%m_s zrEO!T2^}4+-Nb=x41ik6D#^6*7=A|P920;~({@-xTP?+++U}Ms zws09E3Q5_!7~~u`4eCB@wVv^U#UCKBZJENc9=IU>M>W*gYIoW-#8SbCrGWXFiJvDY zAQDLc43WkUu1__LYg&Tw}(*G;Ew+Q&kGdRn|z0bd5k$@kR0s(5C?t- z6;l0d^=$)BvYNs>Z9)&4S7{kc%g77+vJj2j=NZWQ=YsI3h;@G!Sj9f1o1%-#Nd#Xs zr4>jVGwv+dC5RZ$TxTcQwcFcWUdKzf)9s$pC1~v0Yslj-v^HOE)aO4j8DY;E;MP%; zwr3pTqR$rbN5kl^Y}ZqoBn2W2TGoB?MmzX)45RNW514c(wyF%xRX%g@&be=6q+8p~X!09t zhMqYTqirV}j{rI33=EJu*V29k@gIim?Hj}zb)~j%{GwrPZu4IcrpzE$11^ry2QyImQVCxTx&>PcMb_Yh!AXEa5zXx)9z` zWAd`JXLI1-jPstAjappEofPp7F6jD?QuvE|;mrq7k5bYl)HF#@1AA*5n4woAXpj;- zvJP{&aM;1Gj_tfl;X7OFm~5@?E>e4iG0k+~nBvJK06`$+gOGh|+x!!)YQp1D(6uRk z+i7_b62)yUW0PUt-eR{W3JEGl%0^F0*Vld%{4Bq_xA6}5u(X=$adm5NF!N%8QA|#d zx`rzuVUh{hc*71xG}4E<%BxqM+{}x^nmR`=u{DFsZ+4MdpDI^;O(Nh)41qSOW0F*c z$pjEG2=d<>cyGlX47Is1YS(bvt-}c61(XGmK`aW8qjqpdr%(<>eK+B)cR|rKTfHAj zySIh`5=A@2WHN(|piHV=WkJC?=bYm;r4LDdDz1whG|8rCNLcovX*e8 zCvfY{IK`$oVq})rK7a6sh&A+*TS0F%9 zsU&t@L2oKpztN?XgZyCSH;nGr=In z=++wK{u;RZU6u8%#k82WoW(OKF5#6-kSXPX84Qt-2L$tq=~Xqk{6`(@e`ei9bqtbB z?;(&0_m)!8&#_U0@S#^Y;~6*~F?>AnW{|gUZ{kn^R~}#3=6ik8MtEi}-ccAQ2X1qW zU{|T?KNvKNJqOCR)30=^rnz?WuCA74lgkGRi5zPlOSVgN;CI2UcZ5;V3+q$ApL5Cn zFnnK65MTcQ!aH}QLkt!&l%3U@DQ;dSBQLOoD!l*-I%JI3mfq-kR=p9r(yb-5FNZ}} z-T5nwkU!q87sS78pHiOgQS-c|*~9NSCppN^txE@qH5+(Q1;mBdAxgOf5F4MpBd z*}T_f3RF4Z4m$e|K9!ZNXhJj>HerIO$On35n8`}|8eR|Z&x!Q_lW13IxXI-b z3x)&!nkt4HdlTD_QJ=7W5%`bd+$`Ev{o22kBJF7IB4WNv9j7XOU`}u(9QtCu9Mk+s zf2Om=rcU;&C~d+s!v^*ItLR^a+DD1}PpYn^q$!0UQzhln{IP6B=OAMw<2W3*r71}x zIYI8u^TZz;ZZ+Ln=E3zGLmkhT<~yoJLZ6+}_YPDyMF4U$z!_>SP?p>$^)M#qr2@g_2i_CUA_ZBQ6Y_;I46j*NWr(J>y*;!+s>V@lS!Zc!YNltWm;5v&o(VG}6dp z3dHgPf&k;5wdVf-8|}PV4BCdduSGnP>g#VMvo=~XimIWvZexH4Mg!*ct+4K#W6Nz! zYEhGw@1gbggnV(}ElU0u(X`n$JKKmFNwo=W(E@E_mu^CU#|MGH_u%|d@l(LR5p{1A zYCbIf&YkV9WioHHNAluMfN}v|oxlgJZTu$FwC!+PYr3Yjd#5$I#q`N>wIPWJ0}-au zy*CUD430Y2-kMj&FN2y!t^Jv=-!8MHYZ`QR;k8!CXkvZk^2RnS=Nny#ZaB?rDvDY& z%xU53UYc(Ep8|Y2veh-Kd!=ZuBS-;~;^gcuyb?f&usLjey-Rik@n22H;GYFc;oBVo z_E}lYythelXCIs8#VKI>%8kGbfKi6!&!t+u(j&9Dxbbd>e`GE7^^$!uEjSgL6;}-q zxHl?X5QTP;@{UM7E7<%Y>;rLa_KzSi-q#E?N%g@)!)g2je&)7HG% zQq|n_XN-2dPlCK-@Z;g9fRt*GqiUA70hTqNc%OG1sK5@t?F?XJin0Fy3P$T%xUox7_XMTDQJEn@ZX4SzS#xD9$NzIXMkC9a#aHn#(L*Ir#y;O+tEEs zrHgXh=5;@ZdWM;0b#0Axt>e`z!_khaMh+OnW2mMsj@ z67PY6%1P>TU526KjegetH`8qs&Yo|yyz!am+vnf}!z3VWCj~@cdS|U%VKl8{Uu~)L zCW+#0X7cRMt=yZLk~T4t?$5ag%8VEs9u*UZ?w7W?(SV!LnJaGV8em~ z4s+VR^`8F#;pK*rKEFPW+SZ`rN$+(FXpt?%rcjQeJB5x!Wh4S4^9ea47$8C6HIq3+`}9AM*k+}P>zgU{Bzlf#|^wD4D*KZ~!T)Gn2L^|g#6+b|j3yw4;`%%Bhy zjN_(Bub`pUXSUQD^=8uUq>)`l#@a&xtd15z$tn9ma1QK&x^=s2{wasbDZd&YmPlb+;t=g`IJbFFVp0KNN z6Cs86v^YLfLN>1CIQbcr1MP!dg~!4>i#;|r(RBv4)FF;mk{f6(;kaVC+W0I`^!awO zBMAZ6LNw z=pl*Tc#}CsFt?Tp9!5s)e=e)x2ZJe$hTG#q;bUVM$lbZzHO`2 zZNcL;v7k+FX!_(@rJb}Fkz9tin)2EkhM84J4j6 zNfoZ9k`MHSiAPCyGLVRI$WxUa`qGd5hbU zGw4rhJZ)>Pczx!y@s^3?iFbddTeNeZm~u>jeA&lvG1z+UczHf8_-aMdB}>ROi)jNh z$tjLC-}7V^!Q^!#H9w3#BuS;}0!Uzk#Fp^JBh(T=Cor^taHQjK^d~suoa9kY7Ue5P zQ(BlO4O_B4VDVpt^=l+q^sOUNFiM-&XN1Hs+=8R2UwjPJEf>PRKGQ8ExH?_vNx&xzXp zSo~KEI&>3HJVHx*i=lBS+M$_*ATj_t9Oo_63~|>>5ag`U%T_#_JD&u>q4>(uB(QBR z?Fj>HCNiLr({4b(`d3MF@ZZP2DYchVX|0PQ`Ew+apEf-782&DuM*!E^{wMMEwwl)0 zI{vGswVmU(w(lnUecXX2S{4K5&J<+hsLpWXQg+p93bNYg#5S||@55{_ zRqmlq%*C;f$EACxfczog-yK44d_izuP?40otCU`G{3KDV6C_cw!n9Qcz}(=Q|V zk@h<=0SyH6m>gVWb`daORPt zs!1xdPQZo2#!ElU20{Cyx21g3ru-?>r?;AB({-zhLPl?m%QM6=f&#?la^LNLiLQIa zKLxFBp<9m$-s&%bhKAx#Injo923#o$2008zJ?m)Hi`eI@NxrAnc3vs?N2vJb-^Dk# z?AqPA+F`a((Z1dT97N1t9Aq%`uTIsxZ=&j!S66x_k$HV|SLH~e>645d-^HJ7`&Z`v zlMR=EZHI_$d`Wb=^aE&Cwpf)1@gQPZw;q|nADwl&f9(}861JhKU9HTFn{M{TX5q3< zBPoD844=Ze=TXPujmwT1%`3gTotKL|RpUKlP#SIDgYM$Dx0Hr=gAx`W!;{C?Bk->W zy-NkTypHTPpKwneYcxemayG`JE`FyT)%OO8@#Dk(B)5pouE%=PWJ@*0gfV$U05W1S zGce;PE&(_=$*sTmOZ*>w;mMQ4HWDqY&o#U^Q`%bEgitp9rZ|T3!0!2ZAd%aO<&G)y zYa1H!TSM~KQ-2U!-;0ZJD!dqFmenv%TrnyKJoO_!_4H@#-Kj^eYwKsKNg%p;Cf_uT zzsZP4fW2nM$!f<#|1NL!U8WCjIs^ApFtc2iKRZe^h|oTC<#)c5-z3FzJ# z@zumL8_jac;ryvC?(Dp%EySSws_#0xU@*x@uyKHT*RIR(XTy58mo47Adv|D&2;j1} zNTG%`kDuN$0viel8^1i)$bKV-;|vc4lGc=671T~~9Hk45(8yFUc@o8qRK zr%C;%q%1Kl(x=*{V(SB+kZwR^n=g<~)X4PfTgw8Lu}38FH6Pm4^!<1CXz+>ACeoFL znDa{{(YvfA(oA4^lg0xC=cYe0Ir7VY*|SX6XO1TEU9J4~1zzA-1dzr4$!0OO2<`#; zSGq+OyJZE%)~s!&)Gt%diWwzlDI9DSih0gJB)1Lak`6GZlU*l=JS*YrE4$g{wbiXJ zZ&hb~Lg#JSjJoitBE#~k4E^!64&AFCW4R9*S}R6**Mt5U>)sO97SBq!(;Vs(A#1y+ zTJl(;MQ<=i#9J1tIcX*o*rW`Bk+yk(_HJQV5JgI#}yd>Hnc6Hjw{ zBkEJ5`8PLBCB?eA8=ZnDJhwoK02nM!WU%m1w$N_1pAsqiHMlA-lrpjEPE;zlarcV# zz!j`iQo9MuvGbRRzB6e}sJ4~icw*D#ZOb1x?I93wK5P?TP}_KWLGd{f=sKmng}t0&d1v$EmUK{C zEFpO0js-X)rb+4zab6+QEIdCG-uX7V-i10jeLbd=H!jR@*^U&!ZmqXImC;VD6S7*8 z)SlW2XXC$z8kE!9co81bOK45It(ugKD-7U1=ZT!-B!nzE$?sX3Pl$X}OX>aqyZ*?t zv2k&8CB%t2d7m4}+ByI-G0&(SyRQNGBTUu&OKlwf7rxT8#)0lG?CmX;ZIMXZ8a%Sw zBN8%6RL(KM>z{QRN5dToDJ`@sduXMUK=DO9X|xtCv4c8-fZ&WV!N<00U0AnbEYsBT z-78AgJZW=kzuFt(W-;8d!0`+b^O)I)JLD$=k~t^ZwKe|$26$IZwXt^4QWFHN|QSoXo4!O3DVrGqVED=E#9~m1|Dz_LI;ehY%JV(Pn75rV| zZBqXLRF6ZSRkOQh@}gp3OFgFm2UW{}0nQUS{w}%OuBF19mj9 ztVT1=Ydc!;SH#U~{?==KHyV5r?2hJpl!7MOcX@HNr!4v8fVu8Rdh_2Id{yxu+OFfd zc!R|=e)P$QmC59wURinIk&IR~6eF#U>U7=D9`TRGy;H;*o7nhn8(k+(l2IHi_VLFk zTm{U8Zc*x686Kk;sr5ex&!p(~dZq33_g4=46|Gxw1=l%^6o)C;wlI5Uy4?=n;e7gi z_1}mzhLcvfZSWZ8Dj1QLC2@cU-pL?hs(9AR!`2IHYvKKBC6?ABCB(7GxU)9UB1ViH zfzA)gG1|CiQta)76nY*_srVnoH%hnODAXM7Z!Rcjk)D5GRk=>R4lCF`A9&YD&@{;O zl+r8`;@B|zdqlot9FhyU+;g4=+WGSLRJ*&roBbi(a#TC9Ir?Xx&zfu(o>~QpUn!#? zWpl{yT0z-bL|3HhD<662o<7uL(WcUD=eM=FyJopat)Sq$b#}^*cIWuN5mR_S!d?Wo z)@`*r%|BDtH7m9fz1jgh5X+vegYpdH?`MuPUp)9z;|0c-Y;C8F91dD{!@6K#VGag* zb6rKh?FC|!#|6!rJaMoj;Z%{vbAm_d#Z~7$w#+5sB<8&EL0^=5j=uHuCx`q&q1yOb7l!6dVp*SLmp1W6kVf4AQIf;%U$vp!-r?p%L56=Nm}J%DLmNc;>v~)8KEx`y0cl$rQSM z-<_BuS*{}dML;^LgO+wY0fKSrc&~J_(5!E)-dkIN9n__s zMkJIn0gsb@NL>03m6f4r+Uh*N+E&)h4ZE@vZI#|J_rYc-p}}HuO>50IL#PdGxa1tXUIs$XS+wLol@Xy0f3;4fV`wZ6^og-&-o&}B5 zX~)XE;*v)Sn2--EvP1ojPGm@j!1MOcJ&+&FGZ^Rcm=Y}+E z)ol(%NiJGELR4fB`Q#43o@<&)?a8C2i>Yo%y-$17egXV6(|le1rF-JDscMWieS+@h zFscR!3Xzq6mlyyV?DhWu1NdQgww{oA(nisy_`%u7Ezd)q{cFJOektjn5H2Cppj5TF z49re8g?w^HJ$|{bN7AhAZQeOG8`%1QrQZR!bjD94_N?b#??Xz8Yf0{Q-Wu@!uQj#4 zoqa5_M+_?vk=P&gV*!`~KrPn**QLRy*yw7;Fs#7`nI|OSdXwxwAzb#Eb8i_MI>&Ll z$`ctDH(2n*jwHs?c<2s$*2T!NlTVhyFj;0@vIcTV4UCdbN$Jw7neKCFe3$V9;})M| ztLhR%J;c`*?qFDqj35h)ml1{nMkj%u1$_V{EP+ zV~l6-0nmR+xVL=|Zw#=?7H?PFsbS;kG<`1aIggWb_aZFiMh|eLWSss&zQp)xaeb(G zR?}GV4xr|1qz@Iezb@F10G##Qc^=jIZ>H%_Z+8Z%uFT{t!x4ZE?WdA*dHz}NUYq0Z z73x#Kwo&VoTc9Bo;XYU@IxB5#5V^q|(vq8Ky4ig>D?>x=--v!M)^u$>uY4se*4Hu0 zVt*y_Wkm#>C?sP%bBg9Z4*YNNkBRlEbWaw@G^>?_&l-|iIU>&)0G>y2pMERkpN11^ zce>rRo#%)e;UT&LNKu)Du#j`HP66N((>cZkZ1|(&1+RmAV>~_|)BLz4QG+MU+0XY| zr@wmAKGM!HTApoOwlRE(>VBPD_|oG@xHlSw(zTIL6_oC6E9?2!L!@cjW|lRES!YKI?R0Vu)5g)0z{hH8t7~1%s$o)b-n%kcAhlT<$~HKA3cG{R#VR8BpiC+^sh?s&xF8^ z@_QTbw^uQZ-_lC+Wb z-k;-7hFXP--sn@p^SA}3$=?|C*m1W5wg4IXp)bUjFmTTma%N_{5t?IV03m zUEJ+?QjIq_v-H!%-YA1l(r$c}GF+wdN^#F-&TBlw0o)w7{!*0wEZUJF}Uetl8W?Z41AUHoQ`qf!xd(9Fv}-1Xrc_zeTmP@ZpyD1rV|@^2p`E#xeYdtqw6; z1YEVTnGT_&YZmKpEu(4ot0T&Q9+^@zgOYz5W}BnV-eK0Sqm^^VmmiWj>PXA6BkNq` z_jj{thUz5p3Srh1!%9?VBR!5V2f44FJa?#gf^bv9{{U^4`Q$QBwo@P3Q@CPIanCv9 zH8)!w6z@07bL_Za&|39cJGm}An6`$NT!qh5f_=XV*@n*g?m-+^@hze*T~#nnI&+g> znm0cbwNC~-c6y$v7NvE7^27$lK7)f@Z?8FvC^LE;&o%aqb!|zmg$mvb+0wnZ*@EP<+8ZcE%aeJ zvMjU6sL_@f$j>}`S1ljL`|WQ{lU%p5Hj(CJwumDsl_NYkd}rs#BN*w>*MRH46lJx% zy}Z}0=D0$uGT9d1(XqmSBpYx`WtmQRJl92}-QL263T@dfPkFlW7M1YZOl?0@@fh(5 zyh!4j^3yw^40$1gIV>}d02S<>5Agl2x1dF>XpMC(h0JAz#9>{Ef-X8Eihi~Bz4(bTf+oGgawy_iC zyK+nIBa%-!J!@4pa`8A$Uw5eg03P@^!dji%*=r7OBeyKE{hQ$y*bUGggOlrBm4w>QiFFAl@ja{kvgDC(AsZARBe2Qp zbI)447lNO|w{otdB-ax%G{V->CYADgAyC<4gOQE^t!FgWk5XvHaE~p{58}VWKL+c% zL-?0To*go1O8)COf<_JUpyi6OA1OTNsQ~j{MWWehT8<~5N3^$=(Tqkb*%5c(e+zO> z4}L{@ggTwSi0$XnbxAGk?4Wmf714_W6JrjfounQ)@7uL-9y0Lei>JwQ+GLj&SGKF> zCoa*-r;rq%jOgx~5xBtbcjGbbXfJ6|^aBRptn@ z?ZaWPI46*QTJud~;y;EqI$Q`uGXmaOD$WD?ukhsZGtGSI;$H)6QN;R&n<-@gzm%>> zDh5eRoa5N@Tt|l>vbw!7YON}kKQYfk_|-aHQXlP zU`Db@(>(fPBiz+*77}a9#t|CfcOV2szygnIO2t7?o8@kx^P_&v2<-> z>ekxI2U%mel)Ht3Cb*4)k`xzEa8Gm3twE*gZ>w6{YnpATiW74x+{JjGyl@CmsyQH* z=yAVAOB?6Qa*8wwWK9a@P|iZwfeKq9$MoU;*e)@~Jh8&lzh2?AjBZ zBkZMJWNAdQwZpLV0}J0dJl3sS=6MpEQffzAeI1X9E+RLt%^DF<8lvHRwoUT2NmEpo+j~kgRfIfhWbT@ zCOaZ5b}-MkQSDz<_^VO3wD9BFMW`%r?sZrp3eh@9qdh>$7~!$U#;I{G5KN$)9FLf7IoX zNC0KirgUi8<|FQwKsw+bn0Dr|lr6hAtB8aZ;~V~eBj!u}8p`tAT-yhp>te+UMnT(x za!v+M90A39ufV9a8&;o6)e_#(WHF7GQW)B3i6ns$7;c|m^;@NU=h1}&fkZ=Ym##Y!> z6Ri$btdF4D-pfPr{;{T5=~7-^OAB0EtJ<`PBiolT;2oh@aBIhIyiH@`okritdz}jI z$+IM8X(LJ01DrBrX;b%dIW^AT{8jOEdXw3BPf)!A7?$2Eo$S&(4j3+S+gMU#B! z^_IC|uH9bT?Sy%EbDOkr8|1@@0U!qFgN|#_v@ZlXl{{-Ezo%K=>YL@d)9!8svrv7PG3{{he-H`KI8P zWB`z)xyBEtJ;22$R@;#rH?>zv$J7!09r5RhEv@w(8f5Y>7zQxidA4wnNF?Wi8wH0M z!5r6Lb^AR$dI`F?@lB1!)3#Wlkyb#+M&LJpb+8EQ0Odd$zgItI4~TZ-M7;2Q@9wTJ z(?q+15(1Xk3FmWjw09>1wPN_Y#4~7KG1hD?U~9!P2@y9E>%Zo4$mPNLewAsdEe;t| zuBPD6bFuMfg8Uh$L8rF0b9-q3MFMM8P>L~_&z6`u`LIdHPpR>*7I?o&zSgw?piLxt zOp}>yW0imkqpNHg+DIJZuX@Y6ZCuZ7rca^B65&Hg*G{4+qihn#2PJ{%pyc<(eB5Pr0u#@f@jgA!|6++9s6wuP+-^4@1b$73=yQk)>(>01e=SUMzLXtAjkU zdCX#gFgCyg9G1^4FgBcn?eph~G|v=TT)LQHys}qmo?ka$NQXOF8Md4b=kcr*xm~%A z>QL6q&(Snbh}y2c_g)l}Y%awjxRJnw?c}Z)kicU&=qsSQhsRos=@zSLHT|+k1k%Pl z#fn948DG;s!VWRgv-JM}7TUhC4~O8jmqlGpIQ++j$Cn;PHwD2sU_m^CUc+Z|KZX1? z{{RT()%>o-3nY=hm>E0#+ybQfjPa*o#8&uYk1nZxi^##E%4#I?A?!)zN&x z{5!Bo$6@-{(pnFXHJx+97uuD!p9C@~Ek|j!t;b z6>_z;N0p7GHq@_nZ)zStwbd;oSmU>nScV$%QS8&(#$9*54CzXOD5)OCm z0YT3=9V^CG*Tg;@y=_N8DL$O}n1K0mo%W3KMSHG=;Z)b+nmc>DgiS#qjp4Is%&iQn zSeI!58*-$6?32=}>Q>gei&;Zs0h>qDGiJ(nt;AbPD|xHVBo87%P1V-gZeBIjw&N#NI6t$4S@^IwUyNvMZ$im%||gB1H$2 z&*ffop=mxIx!3g-x{bcg33%2 zyT!vINIQ^t^gZZw6jj?Qwkipvk>Fa6gC+NYH4SR-$gy)TlJ=+yyAV2%az`f^;=W4o z?6)v$w>Eb70usUS!1O9d(>SlKJ~;eMveoTb^lKoAA&sPxMjM#6;7$PPyBPH2J*(na zWEPk3-AGAAalda}r>$|$rKMx&GR!-4WaO=L|I_^6_*-eF%VBqGdkk`)Ek1k>?!&45 zewC-8X)#-C7Z(~LF%Zhc`9PoDl5>zgoh#YA1MtU6&@{R1HA$LF>wpRJn{p~gk~zUr za!IRNMvtf2-8HqsMq!xcW{ibp+t83Z`qyPW6_1p~<5QfRHB9vlKJUUyrNeoB5VMr7 zMAobpP{WU&ESz-y>CIzn9xM1_nk2S*os{~e{Ds;n;fKpP?Yrh3I&{TzuN06l z1er=PSqK}84g&W3+3QsFU2@VLUQH@$@I-| zN#YS}q_b$(5(WyFk^mf@gAy(|{{Zz@f8fs?Yn~kO(;paHL8)3KTV+577jEMlCel|q z>JC91Vx;k(fo}CJI#{P@u42!f5{`DVj2|trxDQNmT*t#p$bKJqy3T(T#BQw>SVkO% z0LTda=U$xF4xdxmjxG|5PCp~lz9LJed_j@{rzNacHpom?lkA5i{M$CSx>!$%mHu^}Ve%v+3iAoUp)`Z29|AK~AR^mz3vJ2>>Kr%+Pn z+z80@%8V;<>MQ1-5O@^omebsnqb*E}V09lwXXIjGGOEFyHo^UD;DdT(vpQ{~R=0BerdbxC|nr$c9`X=KT#!aUo% zB4>_R@<}C$-Ntc(2^jqH=Ciuo?243?-iM^yc;ir;Nfx)(M_fqL$}WXjc|R*|a9Mcc zf&8krpMPzk-ZY7KErGd2k=E6G$do_uJIGLOT=D>Kt#}2M{g$1m7SZl5BXf)eGO_;v zzH$Y7Zjs|wgxklfS)*D^qBU}x3$_MwKrO-R)EexKM)xa|l$XQ)EZ1S0`_IyDZmgc< zmAVlqO|j<;4t`eakT(K9P5o+b5bC~7?t!U6Wp6Bob+=Hc%v)%6W;?f%S35|+{&4F$ z=(>^(FUmt|#U3klY_{bjWP$+6Cmey1j%%rw_RmYw2M!z+0&#seVFKD-a5PyYZ2>S>xv%`Tx9q9jEP=UVxX6RMGbK_KlX9OE@5 z_l~?j;*Cae1eR8dS|&D zQmgFl`AedvqLkjJm&FCHlYet0w#>IP{P4;b%T^`30CCeiWc@4Bv>E(R{u`O#o&f?# zf6=9lUMDA#%?TS==lF>PV}sVN+)1GLhew}OcT~8A3bZBEsYN4e0!QJ+RfA5R2Teu; zZD|IfBydM<86+&5MsX7sZKtkt&Ugc*aH?}pL#4_cO`i^Ut&>TYOxL5eh+4K3TzRUJ zGatOMsVD<(?~~UR^S8ub3c~t~_Llm4!+mf|Dv5)lj;hNc+*o=X=N)U*{7Gr3O>ohz zoH3=IeEB@DDeyY&-oyj>S39X#*;?I4tm%_#H#6l`A^-ynWDJ8R8OLk_J^R#Fs?>EY zTKXOmd^M}sPicSRd#09KZ!IB%d1msIes)qFQ+Bn^8T-rCKdHW^!N@wcu1dXwTp|ZJ9#J3rgHZ4E*+yo&dC7e73q>NeQVLB zDtxIzSMS{Cr(c=!&vVXY)(z}&Y4KaCuKmobg$?bV1}i@3+a!#;LY(pe$Of%Pqu)D( zvxZrBblQZI`3j0{A5(@=6xPoinZQ<38+WEL*1I90Z&TAg6Zo^l-WKt0pZ@>|+@&PD zm0^+`Z%L8QD$08C&U%j3`WqjHyd!F5)GW1GtnH?mUU7QMzD_ZU^=%VE)m}(%d`EdT)bJE|qj`%gdk#iR2FT;5N}BY! z)$e9ZVv+Zjr>R?5>C+tpUbFEHq%G!#^7jM_&n`Yf%aR+Cd-Sg?@UFJrGVxZK4xx8; zVrgCp8a67RbAh!33~e|E2RQ`sn!~gBgW=gF`!=#~w78~(0%3+5i$eIp+@S-oZkgkc zPPGM=iDPFoU3hC(k+kM>EzGts4>s34jK}6jfz$Yuft+WhaMrc?S-m*MI-b$4{?58x z;z>MKzDY^h9j-R-JYjiFxh!%zboHz)ci{;#r-$?}B756g0e3B&W=p1p5M;?AkQIpt zILmENe~O?Qg(kO zxxSWYhnWe%5fHo;Q=Er9dUmYTnqJLD_Z-x|E1n&%_;Zv8Yyh>CqK3|Uf9tQEf!RsuCwzV3Ryr>%SwpH;ioEVTas7iqFZBK?)4xQbtx06_B{%&4LH9Zo$B zRn%gaP}3o}weZvKzH(OPCdd*ebZ5!r0$F$&2S2uF;D}NLFa;b;12oX zriSOnx=P%*)?<=bT*oz<5h^GhMmDl@{pCHs8uRCfl$D-`Z7d(N+27RjOO0#A>8M%D zVKd40NeaUp<)%{E!TDH`k8agM@@quZuRKF@cN|w_JK}p~xJjgw8h$_P2b6UWxN zNp8H0v#Bng;(X`iVlu@2;lKi_d`{DblOCTxhix4H0BoYj(n}awV|5@DLayH{6V6XR z-3O_MOP@^{rAWS89?PKkn^TQ64PBvjHmKJYyDj6Lqk;kRNjw;mFbb*pTO_E-;|9HB zNBDu@4RcXQFFZkRT6tak!xO@hmnVRz0)U|Kr;7P&Rn*d3dq1*U$8&KVzn3+z4{Z)& zkIa*6F-3B`g-n(s``lLpb*@J=HhRsCv+4I!%-&PSyOmSP#t0+$cs-6qdz7oqC1cBJ zT=#E^+Fq&Q-xDUeq-sBC(yWLAT|9vBHsW(UL2!3;Y>!NO)=!P~U0z)-(_gXH*6z)A ztHBk)Mpih+RPAho*wp$rfj%UBK(mT_O=izgwX(#E3d-wFI_VRhphdyRI*?%*&;Wr^dBnk}k#$U)9P9IgN$QQOVQ?*R+xtXlCh~^K5eJ~;8(xccuU3pFt=f;YFd@V zmQk^{^O=$qaBxC1GVQ^}InSY{_#@(9fd`4?)9qY5vya>>ZSv$$asn9gInUiYPIK11 zitk$yYj-!7vsyKZTZV?sASobTIbkmHVD;dXk*3qhrDCw9g#P zCH9f3YWDt3fh#cp zeBM+m7@vEL6fGo}BeqUS^r$>_@y7gU@afkVN)b{vTRAPrxkW`Pk)seoj{H75^Ij$5 zSZ}WGmhF)&SZv$n=gllS9Hg>iVCDW-?6_6QbkiM`dOM(OGkz-&*yZALD0+ zG}~zI1KzoJ-s3z*7)K4MPqLBX$2(zLG;>X1XAeU2!U zTZtiia;(Ta%z-X8g&m3Ho;_>kn@^0%Ka8=w>Q({RMJ$no;risV?+e$DTxPzb@E^t> z06fD(*KMM=)uv{S((XnogaeSCcx+=Fu1FoYuXEc{sU;q3Hh2@jVkp7Sk+hE2!#*DI zM~1Y^>-6&O^lN#8UPGs=6kCBBkm(Tf2z{h)9CPW^b~-1CVAgymE#{$o+HkkEm*siY zWeiC_C(7R`ZWu5;=cvIwMV6&=saZz^LEC()zuFd#lN@K{BnA->4;=Iv`qWn%YH8zJ z)2?j9^N9S=%?xKNDOkyQBPzQ#!4(Q26a++=t!?Y z*L1H4=vFs&H>(`b%q3_o;FmjN*^SQo0eh^aGP_)Dj#%Sz3$9$0aKX44 zTyxUAqW8dl6`NRnGr^|WXOdSEUEIFFvSpide8nULi~xh2ck5W*DDeI5_Jx0_-fFs) zidsh?S7~95S%JvNMUjHDcHR$9pzziBu`Y$6HiNBc?W*dGzFbqgG6w_hNL`6=R~S+- zK;xx(b?3$BA26_I5ByuKXzOjL>bGLb)gI=`E8*pcV%~UC z%&XVUx#Kv&Q8dLy?(I zPSVZt6V$L$Nv{;~JA6IyGu!DpR8zu6e$jV#6Ea6G;5Yn*ivS7dkEL{0!@}2&=OsFg zKX~Ss$NGl3q{R$uJk!28U2WDmBU7^ty*OY<=tf7cHR}Eoo(*eDi%Zn5ZX=6Mje=f9 zZnB8g$iS4YUuH)EzEPZvS111f2tR@}%UGe&^;?ZwRF|9*Ez0NkcKpAQ&3V)om)3ff z)uyp`KA9XW1SMe~yvfHdTrNGqHRnp3hRZ|IRVdCjdNb$`6YcnQrdsMc7mF>mDN7J+ zb{y?xBV?())OEhA2b8`*ASyH`aFZP*O{>^hP#;GMvNH*h=G zhv-YH>e|GbRkh@8Y_qTL9IG#w+;3sX_B>ap+-SZl@ICFmvwNzIE)B=byt0X1kumr3 zk)bME6gGFmAcQq zAWJX$sMB+2t2SGwHS-14mF}4{+G_B;80AY_eVBp$;z1NJvhC;ufp?Lf!G&R8-3jgs=`zfavt{L*<&ZHPl5*G?@1B*(TF+-} z@)urm3d&Cdj+hmL4SG$sxpQ+YP-{>n#7IMVEww;jqbbL(dHPjJ>9KZJHLf-J zd^X=l24#be!Z7Fe%eAwp3;7a!${{T*U#>ZUMG~3Ak0DEl>)XhAS+$^uKC?<+uWO5x10^0SDfN4ytefrS7|<+V>qtVeXm8mp5I1?PbjG* zhT`J+ZGlD4I3^%cxE(pT+78=F_*<+mj492~N+1OuM9 z#c-OYl7lZC;zsT z5*gAtAXgM4?dYE9@SPag*ryFe{lzg{6v=mB`nEszC&jmFU^6L zJPhCthZV-_ehb%hCI0|RfwqP!tTwnOIN_0)9-WP8DBn`l;`cCh$zi!BXiG3WoxlV7 zS0rLPOQ0>ZWaF@{>%A{gw2nEhB6Ue}RQ5RQipY5L+mnyO@T!T^7HU}*3a&cwUYViV z8LlFN$!+DDcU4t6cP!l$41beeRcSAf${1v4t}|Y_;8_B%cIQO6wNz?L@1 zA;1ibp*rr|y!YVYOLA(<-DlIj61uw6YtZzsA8Adg z&1bqnd58~Y?NIFdJzxoHatLn$Q!spJ$O`qkFd zwY^=U@b-(Z8Faf_m~ZbcE#cbxCD@YVc1YQbuFk%k3Wa{8sI+skXFcOL+XL zQ8p(GcRTUBc1bz;h7TAOrD>&TZQ>|(Tj;KAG-$OQuFTA`S;ou^dzqA{8-e7WKRWO3 zz8Ls^>N6Z#gttLl2&cD|C3&Nl8&1{$mchXT2Rvib#cwuWb8wN6 zP$(ie&t0_0mfA^eR^H-yu6{`X zxLD-Rm6L{Jx1KAJ)U+G>nCx{OR%`1kXy40!G9R`1CLl2;&?~MROzk zi}T}QKX3-!$p@!niorqjI;9B3T-{kbJ8<(fngo$~Od4HA%*|+*0D-iuL?}({6 z9SJ#>M@!Xp-?8b-eQ$KmU>5U*`$>&KWtuVqvCc4h`_}fU;Td&Xc?n}yY08Exj0Yl$Rx^V@W! zvB_^RjtgYxIU~Mn)pg$zTUc4V`rOvD>X!}Wy3EWjkf7@lro>3!)05YyTJZk>5O}BU zSDr?l1aPY`0hpE{M<*HnrnQMS=x=G!Yg*N`IxKeaM3Bty<{6IGBmf8{_Ha1)R1@5q z^vy3Gc;Hs3z zU9`XOnfN|k67s}c{hLk}?LZ@Oc>=cge38 z@P@l>q3efMhhBMZm9Sy9RwaSzb1Z&P1Pl|&&q3+-Uxx2|3-K35n$JpG>nr8hdQ5unPQsle7mpSr;zzvsUw_Y zx|~;xgMV;DSCYKZp*RdnV?9V7_4+&UJK>}nU&D=B?@WyAo>6&j3Xde(g(K%wAUg-@ zeoz#4&3q@L{h8t4ZEfbtxckF)IqW&(>rS+J9*BxnIhLng;NJ~geW`UxH0dtw?LZ$0D^Z$%HJ^L5C^4s zZ^j#~a`RG}eN#=iv6|_8H3cJMkU9q8|HCv%dZ7 z!3?c%sCXqnERRUgKPF%i=~ppXK^4)vOT4VB~)N% zjANcIX-1`z(CvjaQ&xPR;hUXG+U4W6mDF&>Pe$5v{(YrVi{;2w4p_M?6ab?GIV^Z1y;W-U61+5K%K=Vm@@LXe zc%sDL+UZxG6N60*B!>3lYjX|65|e~zt`w)r*~vX|+Pu%l9~&*SN4@a(j=UcF^mlgg z+a=zmExuz2K=V5=~c z!bjpi?8q%l(p*6-_X$1183zig7FQs!AyHV5PDX3ue~Vi5ej)KJcD4{nJeqJ4PKF5t z#SR+)6=owA;Tb^pp_BWGg6)f@B1jWN_UAAP3Y}S*&Ur z?YoZ=TUgvjY{3`pb0x&r1w#2`2T2f+4hRpsl^l*i6nhy`!>VrW-1S`-!+#5|9@%_I zAhp#k_Flu~k1&XWlHO~>Zn5Bh5P!Nxb60iETf=&pyU=v~M&Dbsg=C&7Hp(TpXvR}? zrreT*a26*ABY+NT=UcBG-dbzoYtOezy&)nrx0^1T6d0ID;1iSg&hKN*S+wzR)0^zt zJP_Z{AayURh@_q!fbNYI+=M-Lx}U^GY4nNOXx`Mt zH1@X2X|21k-W zMt5Ma0B5ay$6@g?{@cr{AITZQXKkvw#>U0f8h1`sCDBUMSKu`+pEg z;t3=ZOS!G&iKBR$LU$+&u(1G)k|Z2(LCMZFWz6+9g%{BE*>r1ZJV9+dJ{G;av9d^a zTQ`{@y^!!!v?%^Y0S9YiCjovqzj9sMlE-1E83P|HtuC!8FAH59+l_%kH;-$HB=_n z(o22+0B4rj6=gK0zDlIpm*(x<|YkymQvT&Th}3aKN$c;mKfkGJYbXg``0Ar2>G+sqk@e!bC>XLnd4{G z$zAV_EGl&Yvo{SRG?mWCUX)aC4mW1#w-O z@%u?M);=WA+Qz{Zq_sCiVTw?g$Uqz!co`dVMQ|6N6h0p6P5qCnTAc_3xfUpi1~5qT zOXnv&Mh1F}abA5|60I(Fwl!7b4|Sd~;?ybOu*RcpBj2vT+ zl;qa~f2eBELu|j=1R# zc0v8s-5%lVxHnHumGcjZHRcz0FK%GHi4^=aQtPgC&z zy(O-k_8NA*1)S+{(_zt$&xRl4+1k;%<){{RqtW8&MJ%VDcsO*2NLZ0#(PxlEjF zc6P#g1;FiIUuz`mGRmPx&73j$diSqS)I39`%MG;m#@77Af;WYgljR*0F&(kj0M~aS zi`wTSnqi`RNz^RtA5RfQaxQ<@eYV~!g}?`CQy^`plgPp5w5_%GOQdrSodlvpmKkl7 z#6u7PQ0P<)clY{Nlgm6&OXtGy`7B9T80P?-fJpT9HPhOKY3Ev2w6LBN9p#Nr`<%a85eciI`)hg^x3fXI2v_Rpo1>X!zS( zHWpHNkNZ;Ecr6YhX>MhbMv)FjmZe+{y$a*fzBoS=HOrgJxpjN9cs#ib2`ozJBz_eC z00~gJBp!L~&mUurb4IvFk~i2e$4FVt8ZW&X20;_c~s;;fs5j z@5G`jxL79+cOo-JaE`e9!3YP8(U)e_`FlAa^B89-|#At()QZhdga(E~BFeZf)%0 zSj_QC;XsHFy%dU!T=h5ul1+M5arA9?=yKD*)qCuCpTs{Dcr#y$?IdXIu473|@FZqA zjOBpYlet^e6~+hUUn*VLvOIoY?$GiwcQD*|=s%@>uVe6wM6{B5A%^c+l2e9>V%&1a z8Bn9PbBxq$@TcK5#-f%wt;V6I%3L+Xb0CO_(171~oN{{dd)9bdbqbon-5O#rm8d1o zkB=@$$@XxcQnwQOJBBlw^*;^sV7v2mC(NEhg9X4N^#NVm@RM#~+mt z2*3glOrE5c1JG4flqRh>+{&Ah)gF=I--((&i=s~lgS4B=rknjF-pbO+zQJ~tP zR1Qlk7SEurPr`p1bm%-_si;}mSVbc34H|iB83`nXVgi=zepStTe}{Ziq}VN;?e4WS zpvb;r$28MQVq5?Kj{|}aTocodwchx~Uxa=z@cF)rKrZg=1;y2>#K)YH8AkBT+=7{G z`kt!?qxVcPNvH2aey0U@@qfgB5M)U_6p`Bq4%uV8iW#JpQ=wTHG-^*@nNJ*6HlgE< zNoKgV)_m#b`A?T?DkjNUa9NZ>icixx{`M>7ABmc7sisQW_lNaK=8Pyyi+ScQ@e#(= z-S^ab9!EpdHOqK!<0pvVw-ytXxk!%n-=CBY4i_PMbjq6aWj6JCkqSC!kF|8`--;e6 z$B3?y9Tw6g@}myoSC9uRLPH=68RsOD6SxFc^xqZySEK1r!*^wWeWypUE-u7va>O?v zt;8WCUDyX`$m7z!dGO!G{VP(_Zms-LE#0g#CeYTNUg5~&7#xw@o;zc=MQQPKL$kD9 zJHr~C#jT{NCB80YQso~3nS(~*c;#`uhA;^4aD2v9DB0?dTyKp23)7^P^wg8>_ezWX zqjV%P`Hj^Wu#j#Yk8e;ot<5*%5=(a18a2)Io=dDu*9v6~CmC4U5L0o_0iWnIUKjrW z2v5VG5`Cvvi(8r2-yU3-l8NAAxZE&eL5$?~Yy$NaQ z&qY0}ddB7HxfB>0WsUk=3f{s}Q&$2)J9Nh2`qQgMJ?2si+7xPzYE zYdKcGyA(}IT(4u$HD3VyN71d)^ITGI<$%W}u9o|ynNC}6#Emj5u_r81+<4yDoE-du~g&|oG z!L%Xj0ATw^JqA6+b9!IKF*IU-5qOc~TVUecL~P87wSRz+!H>Qa{c8!zYep2g+P#lv z)>lgKkdH~TOTA9YRakCS<(A&qag56}Z?TWCh;!T1<=+=yc%S=r{^w1*p61p$T6;Mm zx!I?}tOzKBk{ArH$=CS0*FUO!X3(SY99r7mYZv}r@&)Yh$crNaH!3V@r1a#B{y^83 zc#Go9+L>VYZzKv!Lu!e#7|G<2gDOcpl6lX1%G0^kPLES${A2NjzNorhvvD2L0wQIN z)sSRk8=?wNxDC&9QeJ#V@jSciF0Unm(lSAU)QHATav8%j_v8kz3>u-;uYT3330s~D z;1DyMa0WjL>92LoKTos&07kTDVxKExE4$r^uFq>ESF!AO-ZuEBb>a&vI|zifcA9iP zQmRhHAN~WL0PT`bCcK{G#c4c9vu>Ei#Hqo-BlasuSqXiui(cJ5>T*xHYRg__{$L1b~@T!ff;L59EjTb8wsdJc`@VH(@f$zOix|d=m%=?Rgkg3-OmSaQ(Zobq~7W`QQ2EZ zvHOPOIrYv5=TWW9s?(<^wLOo}uK;{@wbuL`+7^pxXQ%3s$Z<515h>nt#us^9p1ICA z_pfO1{-ddB&_Hzz-``BkzF@bl@z06m*Dq5?)Gd6;#@3Eoo&HKF2X;mj9RC1wKA6uHe#&iL=YdlRP0ROt zAE4TsTwP5(dbPB7P~5||H!>C~bJc?mIP@oSa+yj$TT;ypI%`dKV> zTb5gSF>=g~4siWS;GR10DaM?)5~a$lne~pD@e*$pHU61%71U71b~VP>ksJQGDzSDa zzCh-=>%WBG3ud_8Wd-b$-8Y#h+HPGHpE)eRf=NE5zJ|Q#O!1Yyt-+Ga#Sl`l{rUP=yTpA z{g!n3Ze-Q`J*Zsia!CGSqY*S4yIR#4>4e+(gV`wEJlxA?!nhlji!Id)KRI9xw3TuLGxu zbvQKH2;7Povas~tz;yM%rDWZQI<=H+-Oy3xCMS?5+ijWC^+Lh5rf>ov3U z+TKSs($M~6W0+#j8NXJ_A2_@1krfGi95tju(eXK$bnf9wqbTFKyvGc!){vG&I z!%MSWCr!7xxwnm?^RE&xb0h9{54Ss+n1B>x+P*OHPwe@r-|Gn4MXV`j3cs4`mQciS z0KnuE)Q~ImPJK7S_d2-LZef}?EtHGSa}ux|Vm-wd@*LG|F8=^ZxPs*&j24pQsTl$> z&jEkhBN^^ZQm*1@PZ3g|!q3j{3VzP|#)o}rb0wtrg5#Bx$dIHgbAm=o9AiEG#dg}? z?BNH9?#<=3#A|qV7h9!iL$N)XKx}d7EA07&m7MZkPZh&iAvrO}=M})`m107VVO^G* zG`X#J*@aTeyC;U)a7P`u?0QwI^1a6Km7C^oQ{m|T1AIl(G`p=Y`+mnswYpV8BUWih z900j2z#4-}{g?IGwEqCHUFv>t4Buzn8GkjgoS#4s13sNA?|nZ*v$(pF8)()^m~P~7 zRGj3J2{|Lyy6as!?##@Q5PQ>=czCC_VQaSI{5ukX$?2-cD8>Le@Q@EfM8i&G)mkAK@MHJ?q+hXW+d{ z#U2;GvS}rWZ%ZRH%+QsL9D|i1*zwRDdm8x%#Qy*ZzA9*%0n@xGcP!C55p^Vv!H8ak z9fG*Wp~$S|1>E!_RaVxcNu8V?G1I(BY+eg_=VFW*r3F09l0NAlAoMMPjGWiZ-Ye3z z9d|>QQ?rik4V2;wuRW9*W;tW!3<4ujgOk@j)#$pWyQ_Fp!xkDgtzy=CfrH7onrs6y zgMj3ogbs)6-n_e9ms{2Drnd0?(`wgk5Rixw(iqS$%vib06(3*eL}8`QygV&E51o8N zs9!+7T<&({ff?fkezle1cDgs|cvz@L$!^2Fdft!lQ^o!})R#|&=FTg(aup_@4t+>a z2|rv{w12}fPvGk&eOBsSLhA#}iq<&RG|A{%Rt1l+U#=@S>D2XVVkt#(v#jt3jCB71 z?ATRqyvO^cF@jH^-HvPMTPWk!;ffopRGJn{gqsh^ABeAr{8Ob^cskP3Z8qNNZkB8} znJRq6dh7}|f-&!2m+=1p<5!2H(^E&1;(Ke^*s&Uviowot#DstpdSF&^qSNMEA3I)x zYnllA8^V4QO)4WacR+ckYATJ<#-)o86ciaG;Ny@6Gm7baVW!;QXu=DB-pvzk5&h8Y zJ9EItYVxlQc*aR$hBYzF{4%Uk0=#y};=3Jl;;xIQ>GRqX{+((Sr(fZSu*e&-0b&mT zQj_j^s+8pY)O_jU%Wo8G`fi~Kyqm*sWaG(Y%yKk{q!8pW+=n^J@x^?-XMbji?f+SB(@CyV*cE_2#vv^s`zX-Wv-w8_gd->X94k#fHz!y|`i* zDjA1gQ(t?0C-8s7pAh&)!%v4zx`}PTSlTGiow&ekG0#qO*1SW;S`>Z_bW0?KBWabq zFR4&B-(9g zbXTiCW$q)bvHhGrBu^}HTE#qLAG~SZBM7IT;(Yb=uMYT)@F&I#ef^UZmX}X(<{2f5 ze>ONGhtX;a`CI@qxuVdlK z>@@RzeS0M0CkG*w0+F6Nf&mE{jjWNyOA%2!yB-bUZ-u(=fIKj|NVbq&UdS5a z;DtU|&N^@Y?*MnM=fj#O!@Vz5kX~G^yzO=7%-1X;f-s0(L-Z`f^Y^%|d3CuU)o0S} zt)hx4t=2fUw)k5$Uwua+ey^~wKQloQ5qB-Ft<+efy-O0x6pI$4?{BWKLwYZKgKGC$( z7R}Noe6)5_z%u8d?~D;zTDQb&8E=M{;E62t85%~Cd1Sa%bOijwDL4p&o?AHWRy7SS z?%vM(R@LOwUeTjQb2^kVsTpIt9Ak`i&r0j%veeYF5`Ykk@xwK&pp>n%#Z8sk|LdL}7EDusaCmky}LN~eW)5KMTZP57hUhxL6;i=}* zB9SgFq5*e^@L7HRYt2&2Qt>t1w>lgvzTay~1FE)LJp&L=Be1WhHD3p5+FX*&udmw7 zaFJ>A05A#O#Crg1$owney;H>+#on!?URddNkjv#mHR6EMGZTf30CzSy^uXq`oK#iO z=t8P#zr^o88h9&S@g|vbb3Dss9lDe)FW!<*?uF_;xW#(^0EPY=_%71QeOJX_yPm~2 zJ>>U5t{JeUQ>O%h{LOjhli=SR=yx);mbE01px-Q}+Bq%G?CnrPGUVg#=OA{d{6(Yb zcN%nh#-((VU4T)dwUuB2hdCgOFE!^?n{LWSKQA=zeGf;w@!qMY+T3YA6!8mAC&-Y+ zl#9wxRabBsVsp@NJ!_hi#a<Z;m0}alT6oE4JFr5xQs_>v?uNfB0x`5mT#N#P@s;)#DsZxFN=a=|MJZDq_(6eF{o2HflXBLnXqIj>P$3-1tJUg`IGg`(dC3+LM_ zOSxnpKE_g@5I8yYu0z8fD)@M?rJQ=S-h7N%VU{-e3F-+5b5^ZxWrI+XaMrfPWzU+@ zlQR-NQdi|5bH#Mft5rQw=i;fyu7@?^{{R7Kx=x+v>Rupgpe5QOg#chT9m5>pf(Qb- z-vz<&jzJtS+e>G283a!^bYMYk*~WcW0E~JX=6q4{14q5JhFGj3zq}?(f3(I~4=0C4 z`@x2I;2*7YsiEk4evxlssA{vzs84Q3+24=7f*h#=Mj7r#E7Odm-njV>VZ7Rq=d}G0qGC|9><{0aYA3$+Wk~g+T0wTxW^RjbHZLbxzR0OSh$Wmi&H9nh)d<+;yXu}y#q3T z7a1LE+tpSeYb6FpR4<8q;|H08iBKrH<+iJv_@* zwn&_r5DlA_HBdo4TLjlb;~PD9Lueq>w3T@$b1KOct0JnLaLVCW5$XmjIaN(r9d8j8 zZd1;DQKf0x9>1sSUJhUcB((OolC)}kvJTNCOc)=1+#1L5XNYgSTjMLc9WO~&x|lGL zB)TRr$C6QrAd~N2uGYQ`yoT8?O4_`U6qD_$0gh652c4fWJP=KMYnicr_ z1>B}K@=jhRB!DrU!~=|x+KMw;uA-Eb;?=c1Q^X(ev>_$6PNb)AY0XIFt1P|-sLyoD!Vxa1~rj(f1+SB+?1 zBKV|^dp{|2U@qULIM{}xN3xgznLzy=}mW7A}EQF3SP6l!9S(-11 z{9ob&HnZZ5Hd!s~yu`S@wu~f20Qtil;h1O8lbY##Ic4Cl6(b0)Qrl019!Z;QK4Efj zV^R+Om^eLg>s$NE_eWneR+Bcg-GBQxP+_BK-`dPT1|&xEe3Ur^ZVj}Z$B=SsneiWp zH4BT@cC?R6jv?llt|r`a2r8;T0f9Yx`&YJG{4~=vtA*P-`QjbfS>7{_Fol*ffw~+M z_}6RVkB1%~_;cW~;slD*UDPjuEN@$JjwuHYiMXp3I5`!hCDh@ZsJU4l9xa>3o*A80 z8aU%Sg|ou`M6TIpb#`7bdUQP33M}=zJsL~jE=SXCr28vC>JC8z9^gT{J*eJk4Z z&luh=nJUFL9$*kg4i!SKGsmbPeJck?_=9O2QusH-x-8cgR~w=t$gi2Tj!~6LD_>--qiXt&oMBx8du<(FDAUfmv2y51$cRW3sP^*+1DsZWi7a)gpJ>0b zn^K%KVA#ZBlH?vR$b_!p>)yNlZ{Zum6n1v<>KcTSF7F`-1g1H`*jWxTIT`+S(Rgn6 z!`}|AmI(A4%_md4i_1%!wOh$uy5lm1+A;mY22MT+*%-#qk1-`2V1@&c#&P=Bq-YmD z67hF~JdH;C?UF{#6wfR^M2V6}2Xk|?APgGFu+%K<)^81HS22s5BmyY64UZYl8zg71 zUbURtdz=ol=2J((o;T2~B=E?N(g_yjVr7)i6p^`efW3$wxjv1K-O0vIfWww)p_2#)x6l&1JsMy0} zIk-hoyMt$G;De6b*HZF42Y`g0hu(exw$kpRx4WOpd%3|@ErM~>XFW$9DLiLw_FJj7 z8`p+NB0=Rx1SuIV4t{08S2)inn({A&z96x41Xps$B=L}A-hN~!t`DttTIJ}}d`9|p z^n@k8)`=Y9T)5BU!L50b^SFvLgyjL+SBmtB<3KI1Zl{_i2$88COFv>V2N>upn$@hY zZf)dy%_`yGlYk~giGj`m7;KMYTdiqnr|U4^2Y8htk_HRNZR8YUPB}~*A47`tEiz_M zjtP<=0b+5^eGX4riBv`~=0}F;`rpK_3tP37#-ZifC}Ob8o^eF%2MR&Q`&Cy|@rQ`- zNL!19y|j>GM3Hu@XRr5}NbEuS=Dk`Sf zCqqLUJ?D`!vayV_sY8%J8NnTn4R?PJd~v4uZ&|&y)ML1nFD>2xA{((FjyM}#VPd5_4a6IH; zjlXv|Dt|Lxt81?5-Xqh}SQ(b#S9-&{b_*WIoNpj{_^06xx!`$IUhwk0)u&gDd1dw?c^_P2v`NKY#LFE@Z7dnF-bWl)s*tCsUn;@DvO#p~62}y*pcetiX$U-x>))ZTnQwHvD}6=o^m&BPO2A>GKf322 zs5z7t`hY4*s?0ui{@3+*qxJ^oA`u3xMlt!)pg&l26JD4o6%c z?)zL#V^L@vA&p^G#^lXm z8>T9qzk}?w-9cs3<(5EKD9|S;+3E9VAbNwyu6I|~Me9ZOR+=YB#BKAl2FG$8oMig} zUFU(Py1%pXH28|#TW)p&MO2fgP{a)5pys)%O6XqH(Tl~`9v+Ksf6oeO75XO>v z0p?=|+nTN7-xXSTf=F+48DWsy#2lo}_qLuwx{^5upuqfVv(@fAKdW0?+uU2pE};Xc zYfF#}5|{1(1nxuXG3j1Lwz?Izpt^3iZtzPL!z`~G4UDOt01NV9j=YbhO%)aITEl`* zTOO;X_}&R^Z=;Z+J1Ad*;~ z0Vh3psK<%CGp1>6r0Dii-dx;D;mIS1QZ@xDGD`!FMn4+OZ8u%i5=}~G`wU?5ZhmH5 zc3?u|IO)!NSA8m~_h@oX)<&;~G>Znlw6%^^ve-yxh!LFkY-crE{{URSvc0^LeJw8| zlTo|=?0gaSjXL}78njT!rh>9c9zU3L$Wj9pK7oi+T{pxp5a=Ex z(Jo=p^hho3=Tf5LCxPaNBO8iCy@1Cjj=uG?sIRHZ?d8qNk>uVJ)$~agEic4cjhxpv z(zuCKq>;pVC0W8@N#G1N-{v~)15ogmi>OUBx3PVWXo^WJlZNt`i~#S0Kr`%9S~}M8rL4;;_Dw}vzZVVIprDh z0=OQk0rjc1H@VR3a;U_oRRi3{Nu9EI(R@k9;lc;$2?J=?FSLM&AtsNTU z#5!AC_;t7Gzi(W|X1x~A6Lj41$j5fzKY*3N<2c29u^)!@TRYcndT;E7MJy!Syp}=2 zfQRoB)1I}papGNm^F?bH)b$62aH0#AG6@tPya{5_js_R{b6oYLuV}NjmorvApnX2( zF?Vl&BYnO&Rpgo&)H6nhsg(%aG5kRCI3QNdo|ECvADb(CC?tyR8$G3^NbKTAKn~LB z5E2ImA&VUM#%toMtNm|Ro;#bVt|pQQ15_i6scc02NslHAu)&gXQE`on57Cy;T#S7Ea=`E@K&K~WSZf;ur6^c@RAywvn$y@ul2_S;YW%2?$vsLV@k3HKPD^N{8XXT-U*d6)F!<7!otqyjx1~&Z*(iYkHzf`Rrl) zJWnA108|gS0FjK06SRYjR{TE_yk)J(+isHCSP0c8lq@mDoOyBYB z(tVsduy^@buV1*it~o+J*V0cxHGL;g@l35}VHesYGl3ftjnn1Hmx2pqdgpS{2TwsduPf zMs8ev6@7tGj^cp3FbZQ<1|<(_M;?1^X^V;7af8MZ4G zTztWXMk|BVeivU(V7ao@t==n#D3P&Qr9;pM2ulEa5&`XAqh;Vv5o%klUhJaoWAkJM z1F6d3WcmVXE02UWnjFn}d8kV%QokfcgG^69DzMH6zyAPUlxfb_Na=0t=@dMu2*_dKwSQZFJ$`(G1aG(tO57xRT?J3&QIkM=}#Y)aLN4@J`v>)5;?6kXG z9?@1K88Sl6=N3*+%%up)@0QJK*nZJoCf2o?HRw|6^5!&17~V8b0-_zoRDS3wVZr3_ z&AnQ;Hie=^4w2$XCcm7lw-NaXBoVVH z1wbs!LY{}5)-tbB-s?K?@xoHFiq)AuE%=|PYl(GZ;z&)3>QVsHiQ{yNBmsh~agGVc z&FU-5Ewp9vKDip%%q}Ci4z|}bs>d9{00{~*NFyL)uOrsG8}EkJGe>c(_}cPqVpx%q zJ9yhL?FTB+Y{86y{4E~dwWZ;>JQv~k{{Xd@9^s0^* zonB9K$^O@Lov9qb(sdhaIW3wfgn@|KvIrzVoNi&U_XEi4F;Y$7ElfiUyXFlRw1U_slgV_X%)P0g4@)un8dKaB%Z)xx4aWI zuY@nNs9j!aH`b_Ofqb&@pg9{um*q$yl=ker(fyrDF%?Yz02J3UmZx9hpMd@%@J^Fy zt6%E2cH;1)A*Vo*#P5s^*xkSz z`)Z;>d9jDKZ}1sEC0 zZz%5i4*l!YqO;O8UkA;n&#cF91*m_tPS){>r*ro}D~1XiAA8?CU=Ka`ljA>z7ExJW zcsk-)Z<+(`bjoh} z4hnUbGi@4|_m+Cy=bLgaZe@rlTdQHbVNM40Vyn*?AlGX5+V6@qBM!KW62LY>R{|nX z05@a+2_3f|Us})bByefEJ=OlJX9e6>7)xu3Cs>jhfc_}*3H*Mwk7eTuj_1l&eZ*x|mxtIn9Ax@bU7@(e>upSL3&C&U-CpDE$n6U!l{~wI zlBz~I#s=S+vBx_`d)Hm!4;J`hYbG(mTue^(SHRD*k;%u>x!)7&t#)U)(cMud-6IZx z*!9UEe=7OIQPl5VX#Y!8sMrUCn)R$Td5S%Wv|kC>g-*#s^w$?z5=h7^1nnk>H38k(WDD z9WbEcqBOO*`Fa-L!^;$#o*^(?F^zM#+ovQS!m@QZFJl4(w|K`aR1OAvRQDH+b0?UR zADKo#%JM&*Z9x^ywv#p6AZZ&2$iy?@vw}P0in~~(a|s2cz&zpB;0{*<867%f0=i2L zJ)Svbo^T|S0V5-a-TXy~;|D&!g=JZ$`M%Jq6C(^r&fj0C_QiFVQ$=ZRpE5JbvB|V4 z^4c&#$>%=w+j|wz-tcI;(t*17SMDF*EaU8H)f-;aQJ`1@6cH|>y z{vM?EjylB8+4Cz%_6uu!4;6Uw+flv)!i#=Ef+tPZcS|SB{m8WU!rIy`gl?yt9pD9Wm!MHy!$~$0Ji7&xV6t7(nZg&Z1A<$JaYaBex@p z&DXvqYj$bm-gsEbx_fzQVw_5;<`2BBY*C#1f>+f|H8{PQq-Qwj&y)Nyug~FW73}PE z`+%7N?yb^o{G8-CZ>MVX3ojIWJ-^js)I3??`$XRAWfsdNvJ^dVusnQ@)%90|bzK)z z@Q$jw#f)}e+7|Lbc{C`oG;z+KDl~u@R1<SIRsX=uI&9JHwsI}dpu;F%a7qBC)XTSb@3EnuT`j;(!gRW z%G4s|_?iA4_<5;#t)-IF#d=7ZDEG-5M=6M8Z3wJWV`rfCsRzN&i~do!(H_P~Oo0fF zWsJFBx)?B3IP6L9UrsKspliMheLF(1{>bqyyM3u8wK2e#01ukjsSH;w$ULa_@8nh< zBh>s6=3n^sU0&1AnHn^Oh0JW(`Ixu?7mrMzZYze4X@iwtVydZ2$)m2OOPE5Jx0NQN z=8q)R?LIJgDH1JTMViS@QD=CGg_w23s!U}48o8VA7x=RF)LY&gWJ_mBL~^Rh^S45( z#H%pRI2pm_zeM5q@8QoAczrZ&Cgp53Yp26IeCaFzg38M$8E^O&IrSBT;*W(ky6l#h zmR=syH7jeevgYC;Zyd1h>mY(DV46niHkJ1cU9K&wr*qBbQGW8V@Z|m~@q}7@R_}EY zSwD8R(p$!h&&|RB7=h{+1J=3yD&xe{rNSn!_889PMO7}6KR6uVDC^Hr*jL<q-98yXFqg-&!HSvwChG%4@2k49_231`r67b;w_-@xv8?f6y8>r0zCOI$|5PXM^!=DN=Y=(?7ttJ*e^6UlJJwg8CP zC^s-r#3;b-NUiQxhot;8dyfmu*YOyxV7o$(1cgaExWQcRAoSo@)ZQGu@ny>!2yA63 z=9P_-GSNpP5B3$%C>S~1J^gFt_R;)TXRJXSmcM38_dD0gC{dH|jGs*Qz!}Ybqv7eb zZv^-`{6!40h#*`=9;C?6JLB%}k7)-O+mX0~&356o_l`V7zm(wqEqG^HzVN=BnswHc zx}B`fZv4eQZOqcKba>w^6>)_b3NSYo8QMNK)U~e|czQ?E^^1F`Z6vv8du9&SlFX;) zAsM`;$irOgG?mRrY9lT==JFt}{ehb=6 z*kC3&{ol=j$KA5 zR?_VU%L3cDS(uXBg8)@JfER_p&$0VI;iad6W$-Z5H7^nW0B6fH$8$86Kt*>X!5b+f zy0P-(JSYPMl6fbOIPtH*%|^=8P}HHH?H)nh3y6$sImzL0l}o52sbve0x#K5}YZ`PXN_S}9zAxLumgm^IWB4ys@cqYx^p6o8Mr+S9 zIa=XGyy^x9-O3oq3G6W0^aqcI{wY}h0Ky}#UFfCdx4DWz_I9%lhDgssOS|!&HmT}4 zJ*({>4O(kf*8<+s`a9=>_7&5JYH-(~$4NNO%VvIcYC1jTz1h0gp}0HP4f3Df z0!DEr3vFy3hX%H6EMbij?@EO)CS1r7g3JIxxQ13F9s&LnnvVYfQ@A#>3wYXin1hKeR&#=H#^shZFdu4K$am2~< zcH|$+iuXSNc>e%i({1hr?W~j9I_*gq5MyulWFWBXkTZ;dLwu^`b51MVXDv5{uRJNJ zExxaB6pG}OnOK6#Km!D07|wcU@Z!3SKSJeO3)_Q&B8|Vv}K3Oxj|;Z3!LB#o}g4d5%4Q6xO7YD=d-<-I+Hv? z21ZrLA2#kk44i}Ymf+RdoU6~dgQRKNz2x!AF5E=g;Y}*nU57=A>PuYP-tL#}5Q7@A zK4L=gy2&R4CyXAQD~j=7#62>`NN4bmhvU<1E~N9NNc`w-V z@>Ff>6mLemm%8;oLp)R9zYBap@MLe|=Ud+pM`gAJxk0)~RW}7m?668mf7S0Gq3Wi; zG4+?W@V(u|gX#0!3%J!Tt*=YPCA^40z>#p|0o$ieII5Z##l3q))RtJM^2aG0mkMNP zQzU`742*k!^{eWy4*X;AwD(qbo+paiUMdsKn)WCrmE0#KTOvY>*fVYa0A{P(Jvoua z@bbgn-tuS5`X-@d@kwK;U21I{Ok}c4c^Y_Q&l^l~nEQ7Ga5)COhrz?*&x&-kgFv^p zxY5B7J6{`k(m0v7ADw`8Uvawx*V9*@5p68vx7D;=H$u15?o^1{D?3Oon3iQ`a3ewn z1_2B~$0ojT@u$Tb$h>nkt7y$}p@fMIf1|~7CCqWIa~QaiB+14| zRx%!(bgvoLyjkFnjQYKuo~=CB7qK8VjctoXns?>A+i62Yhd(LXGZWMv)VZDY*v^}j zXQs!)7WYCBmom!9Fy|vIe!Sg>E)sG=)~Cb{!4JfOT0*ElBt*WVI+7x+J`YRq1H zI}4WbrWSJ|MH{mLxJKwm+n$?G^~a0+Mfh)N;2EXVye%X*(MU{F+sKI_U8f_ssqHHC;J`FnQe74 zTU`}1LX1L4%6P~faazSp?s$k>MX69rqg(v(Ln;8L4=Gk+-LN3~`?;{+Oj(~6n zVb-!Ow7Z#(#sPoc?MkH>RE?&JjxJDlgE}YiEW+CI&e@&=b1wbJTj%Yy+i(SO)8*@4 zh2j4Iikgm(qQ0FXGF=;XNN(nKk#^$%ZSv&jf)@k;d#(+6vS<=6(bT|Ij@ZO=LMSG;qvf5tF5;xjCR#Ym?+-G**FBurDc@lb_ zZ#<={x$=*XJ|5ZGUqyT2>wAc_+u0RSocV$$akwT>f^r5%RB`Lpx3tdycp42BTa8L| zlKR*#V47hQPFtuzROTwD8cee=N+E;VKCG=7b%NyK@ok`~;Y{r5rs{i zlSX4Ce5F__j1NwJhOn1i@#K&Jd|KM})UaD2qxn-Rvld{|tV-EpbN9JDYgXt* z;dO0N&sBmL%I*ydtWsn9<<+s*18Eqnn!cShW&hWtjjw!76MzS8YlC2{_t)t4jv zr5HS){{U5G=$g*V?%)1BQqE7c zN?Z-Uy^jvTM?yhATJS%JJ{a+qlW`kd>DMoBCeyx4dC`;s_jgFEoDRHI$C6&;j;eKK z6q)aT4Rt*-JrnFOO$*!1-eRm7NjE2Xe(SL~18(9yfUi&g0ED45nPxxOZ9kc`??Wch z<@Ec9Ax7h!#DSB|dfz5iZnemDy5nO50e`elB%!WzP zWgb+c5-C%;SsQ>sQh4eso9Yo$=do4sjmOUe8j(kVN-w>qNXVdiy z+3araETd(K?IAE@BMMk6k-0JQkQWD@wXJjG8R65drf(KadS*U!)=3d40`%O|d5x7k z5^_BUtE+~Bjf^PbD&E^4QtMtXzSR6I*E)Wm_GqBVFD1wYM?wOCgq)xLwR{cYS-eB9 zYBSqhjb85J(cMDNGhHetd@<+`9nO7g*ROnYqw1D+@!O-s(E{=peY@lbqWNMWj{g8M z;-6{bNg$aLD_a2?gM#jPAMG-hIX_>eanpXrPEbdsDt^`~GCpOR?^@C&`z+EvVPZr~ zL&gd20m__?<21M0_O%=W&hjH1ZWc(lD=P$HkVmL)xfS%UjkJqTh?bJ-S|lqjsc#qt z3mE2?YVZMObuEvn$EGX9_1}h`GqAN=tGyRcd=)ZW2p`JY26#B<9XeO3hOO;Zt5b%x z4`bA+pm^h0(hOq4c3e80<%lEHXE??>j90elpBXhdo(L~>6w^W}{qv7K4;&4cW?cG= z{{UL~w@=V7wNlBVMR7AB!xdkU5y=IQ8OJs0z5w`W_Zq#e{<*B%*m+JSMU8yp-t4Au{7Z-(otyj>uVdo66n&~&8J=7M>O7YOt8=8at>Hz?fkP}F!-aw zR~8o&OK1u#Y(eS{bM&vjd~bc_>Gqljgl{gjFA(aD!CUQaKA1?qeB%hZ9JlB>d zgYG;hXszR)4(dAdHaESL$Wf1fm11___YeH*&B$?>oMatm6r+7N{ZcwHwCPZMlHB-~ z+8s`5g{{8#b~wjl`1@C9FNSrScos<&Rm$fDuusyzLwpON_%r?x_trcy;G1Zrc5uS% zMK!_Na7XVqxW*4)Jq2(YmY?BEtBEy#5NJ_DJd&8gnW3__UD?P?uys3ucvr< zHKF8vV_lDfp8HX@Zzb8#0hJrhKD}z2-%j}wzUDp1$^C2X-DBVng|8rOX6sRHCdXi5 zB4X+^&rQz7F_Zq&SCn7;9Pp{0IJAv^>rpbYpcb|wV$9#%D=rVdNHsi-ZjIrHruIAq zHLXZQAQu}~rUH-fsfMwB01Go5dXPUV`kvSJX|>W}x47|Us%_rk46xhD6Gq|?IA>59 zj!yt7>)yLx349CiRW>(X*5Tuj@a#6{>70I*_cw>U7vmofK{lIXV`bsZE_ZhqCe*Z- z8OO?6R^O7NbVgT`S^KOw(Cuc5y6ECzU7JVYP4uJiWzd4hx^XxNtfa&MS3C zO-x=V`BCQ|555BEHK!*7jD4h}?S%dv>q3;TRm0{IXpphY{n8XYZOf) zvoKXzZW!$Yws_Au2CtKuXk{wa_*wGr#1Dk}pNB1>S!}JzbGT1!ByE_F@oZDLXO5s( zlImUs)NCMm-DF6{3G*Xmz&$&6_piTxE$G^R!^!2F!`h6;U%9tulkMs+TV{6$M?m{X zAOJwxKU(>k)5iWh@y4VVQLp5f0RMH-AK9S+=f?OfA%Tg5&c)FZIJ@a)=z^GZz6eC8t-Fj`qt%i5si z?Z!PvsG}QdTyc`{Rrb-XLY=tgtqDFXwqC%sCL86V4R#lYmL99QWT_rtFR>UU5` z@GY?xMpv|w)5{Y`I*9IADyrjE(@4D~`z-~4#j4&M!|Bfa|@M|1%h+Z3q79?X7HJ@ZGfn7+49q2{`Ej+Ghx z^W{e)cg>u73=>_hk*!ImytfvXFg!p79&ATE{{V4`Qcti`k6P_*{0$D9r1{n`Tg@}c z`?A*wB#glQ(o;KqIKef?pAhSZ#A4R_NQ%nZC1jN+Q8*xXPc=v!`V7{Pqiyvtm0o=j z-CBH5@bvnB_HT+Fc>_Kg(IXOqnaOOsoH55xpn>?--G-s?_VWH4p9ftHHdRx^tGaFE z@IGZLg%|_zB-fZ~38cw>brhCp6h>nWWQ$~8Gu0f0JGt%$Ob&ZZ4aS>eYV+wDJ^Ljw+m2Lz+;ES4Xnz(Q5i%htl)=B`=!ful!66!ZhTbxLlVU zo;qjK(}BB|$&>8&+u)yip@kz3!Ew`RjS7>{{p0FtHSvyZBh$65EoQSt*uo_W`2!=& zlRJT9g5N(*E1}V}zXEI57WbO0#>U*BF~eff{{V$~1o~Vt+s&#=fi}@B z({JvdzDUe#_+)-n&e>?14X(R$tXSS!*+mQQvykRVm6x5{!km-XvW)fWInutmywmhY zk3+Nm(7U^sA(V4G%Krd(j479=C5Zzkfl*RQdLwwjJ0^C11=RKb02f}zef^gzTDfSZ zyPD(oTZ-_dNf`;)4CCuwz2hGm_;bPO1(oiZHlcrW2Gn3y+B9*&Y%GP&Pi?%{k9b$a zS2|UKS!!MoywM$y30!ZLZMnaIHNOpJ)3lltDKS3 zCbqmK@u6&|n(M_D@#+yBr^|xa`J25Nq$P33I63?)<*SMBnU>z}3E0Lqj3X!`^6U6j zS$suzWt6oH&dzth(e6|u0e5a(Wb>XXZ1+7$VerzY%Ork<+Wyf#61%by=@UMca?*zn zJUBhZ)hWF_0Nj5H@B9biKM?EM)7LR z)>dEay9Wm$s82So&Q813s{Pk1L!@ZO83>OLXA*9M^^;BAFvj6)H2J6Fq6 z&c~c(vB0Iu?Q`aFxJW`)f$w^h8rA->ai&;aSqpYiD|vGfa#>F!I4YnH$EmIjZ1p`F zcbTL~-rh1(b|u>(Cy~GkFn(j-^{*tf@h^h(okI4;Js|5oDUN8`*Zmea;|(Xwuevp9 z8CQdjIPKixF0b*sR-WTdu<-rUz0$XsM?%fPZ=3F}Iu0@V*6I>xByi`^+IPg;t7}+v z?Q+d-<9GR{wz!P|8R0@QsUUVxdFpH0Y`jUQBr{0Mw%!QK%+7ZlD9!)}k_Ta*O87cI z3w%k_?fl;nTG>WmA@2CPwmYC&Yxl#)z#Gv672HNpMm{-ipE{86+1Qa!kYsn(`ln-Zt>G653qqvCC_!+Ng=&$dTE% zeeKxFU=DM}1$yViFB$kl#2Q;maV@3Bn|P`o-7u4R%F08+(Sk|B^O44VE0NN1(H@Lz za?g~YJSXtN<5BW1bx0mtSB_|+jo93Q{3I4&`&&5&o_(ty$6pt|9Oyb^U)a{^eS2Xe zsDYi|e1{;JTW_X&@J}AKu00NYfa1Pt z(KS6&#hxUSNz#OIT3owIV2w@!?#K((&NIL*RSFv3PeZTS^DcIdpU0Zr=fq3T?Ttn3 z^c^+?2V$`bilp$MlJ3pBwydwTf7Kb*&jBK>n?P4qn zHRBM@;N`Md6#)A1E1I|Xxp$!I5^35tiKaB_3_@fHB7**e4X5+1uZo(_hA#9~(vnG5 zG7H6T78OyCM%t&G`moJ-{{X|eJS#2F*>&qc%#DS^5!0c;Jk(BKXzIg9o)?lnfwA~| z;%^s5+W!EKZY~r`f=f$#B#u^+T!4zeup0mzfH)ni+bp~%;@w8t)=gpHo*guaq0(Wt z!m2@xsYL_jCxf2#%;HBIPdLF6>k%R6VH8iIzNY&dj9~4bXdGeb8ilxaH#gN z0IZ5oH!87`yF#80JC5~NR%=fP>rm->&Y>*#dWPasTWMvCg+eeLK2qgR-5JLe$Onq_ zyZG*}Z={CKbuS!~Hqh#WoNo>Cj;9>d8m_aW$EI9sy38?MyFjKNIRm&PvnfU^y;O{3 z1J;}>Moi=OZ*y~0@P@H>qC=~AT2<5JM8aLjs%3D?w5S9h?{WwvAA0BXO*6$_6Sum& z)HP8prP@cf)xq+mn;3Z>N5c?CeqMvNE6#iw@x#Qr^m6F3#|m26%-&pzxz6HwRU`lv zc*ZfFb6sAqtN7OPMuJ$D*G+*HyyGAfNR5r#SA{%}?}6-kR@auya)XQIXS->urfJ$r z==OH@f9c3)MYs8(cX7KLzrF9CYY)TrR_k>>qvB?>wP^9>!6a&h0mxi46S%*8V;+_B zLwrWI(ctoQ?+}%>vkt{kJgEyYBW_0RaePd?#GBuT~^D!u=ZWv&3g#HtZ0C_d?roDE2cdhEM z>A@$K#UzEJkO$jbvFcHn%{>*CU+tuBc6JV=TUL-*O#KOz@TSl<`%x(Q64BNvB6^ zC;B|4w&5HF$#c&_26(HwzN2yQ=T)%Pd|J&Z`zo|rWxEIc+@$RX3`#ILEJz)_Ytwuu zp6jqSOVhh0vDQL+f3ROU6Vx;HWzA7IOUVJu|JFgVasF~umm&={wj0jo4 z+{g|LgMtP_RmxF%7fMr$N$QW3d{wGm{6g_0n&!E0HMX8HAcHJRLZ=%?-5if_In8zY zpT!S{7rGQW27{uw#@6NVU;eYjFrJlO{5Nt;0S$`wVxlI;F2<&!B}RIL1>}w?pY)0&3n0mU~Sy z`qJ{@6K|NwIcV9O@JfsX1K8%Nd{f4u2BkfntZ`|w5o@Oi;{zoQbDU(B!OlDJUn}UE z{{V}0Sq%2m&SGo=u2`!9i~Y8kJOKEN%0Oj5zvvJ2(8~}a$ z`qo#5G%Z3)=+3dIzLylz0U`+ZNIQQRARc=2UuXDV;pc#xPlUs%MRU3^nYn~KtaIFz z3!IMF&27k(lV>I)5~-~f+3e-~a~>oQ&4 z+)F2&wH$e2i!L$KZZb!Hwfb_JCxopnn$CC>g{xU4w3mJpDh>eoB_Z+_+#l^-S_O(p=$Sfh26uAKFZt$ zhFI7yoJr>(k_H9`9nE?6rSOvT;q38i-VVFBx&>Hy7ibyTM+fCN$UdU9_g<@Vy{;Ct zl$&Y!o=LBGmgmH`-(yJD%`Qj`r*J1dvfTP+zJ>T{;JEbHNg|dfxXO_c0rz)1a6#$m zn)$=TTEtfkEE?U3vbZWx9iT4k=OchR_3w(W;SU~ovqryz`!4C`k{1Rf3M4%-(1Y03 zIXi50R>L{d<)-Y9y>&}l#PR-}tuapy+Q(|}z04&MujK$?8AA|A{{U+T7279?weR>v zryef6kXTyCW`|6(MQ^mg6r4C^VY!bxLjZW`UITICKNa}W-%ioxj(e>_7fJlMt$tv! zjDScgMtKB`*I<|0<@TEbNuWNPb#7JS zo8vgFH0?iF@Wgg{rM=3cug>vY+Xd(5iBCAr2>D3Ga~=iphl^$LRN@=kNG&yMNmEc{ ziJED_A0%XwU0i<&Q-E`v*H>?#PpI6<_Q)Y<;`ySP4n&#g0vr+Qaw`!0G}TS}c(YFO zQcW=(HV_gdb_8x1#^wX2dJ|BTQnAratP-<5BjJ~dt@Ixi*?2)Txh-v{pUZ7R_CgNa z9C5Q5VlW9{E8jeO;d>oJ7ZZ@<1gqp=41Fu}uUq)Xs@-ZSe(pJ7cxYR9lpAPBQZ1xDt=SJ}>Fo*b*AHBGCZ4gUa%u2Owj5({X!Sfo20$tO7nr%LwCQ@{z~JsKZ^d#qG)u^o2K0U1MeK zf^qm_y}Q9aGKX8UmJ8u;CEOvBc=Ayg593@CanBy~Rh+p@BI>1N^f{jr{95p^)1vru zq(>!{w6l*sWZ+L0IowQ233g>vrv= zrmbaf-Q4JQy%~;B!OSfvr zf&J`&Jx?{Tbe(I#HrCcU?ds~UZy{+J2$RVtg@_g-b~^LNrfYbvrxq%3sUd%K+?-U`hzAGJTC>5;GNvy{KFoV%vD!y!KqfHC0Kq^$zoCxa#IYm!Rr6U` z=2W1p(X;UL;+*_CqJEfmxnxI;9nU|lWWr3*Q9 zTzBH8XJO+nh}vF};|r}a%TjGqPi0TD$c)Y9ze0@87m#~`Mh~rdUa8}Kb5Yk0 zm2B$KLh8?OW%(308NmPsAB}R+=(AYe&uy$;u(7%ugX1AzjtB%OBzMPZt*Lk#`YV{E z(45^y#AN5Ddy~+NQnz!~ql2Qfwa@?6{LS#R+CPZ(cwXo1*3nx?A7Eegoj4$#pM`x2 z-wk{ftp5O{KxVh|d0}i9Xg_lOSQ+jz_gzmTh0cmx%g3 z{o_PWRUnKHQ6a$mYpF}2^Z2?|XDiZ`kEC>8gZ==vWuN;`P39rn5oG4-y4 zQt^(rs@jBYI^tNL03o|yERoJa_xuG9vF1++iIkI^u6H;73Go$;gY4Hd`-qzx1>Cq~ z$G&m+*E-%f*0djTXP(Y7s2NkJdbXaoO_i|2`FnVOM0)5Tf}Bddz+NDncE7bHbodc4naBm zMRy(*_+4qQM3*|xh$EE9GmBCgf{vYW+uFQ;S-sS4tj)Z(s;Ls;r4Xb{KZ-{;Z z@a~x^+*s=|Ssdrdnoz3U@J8TA)DOa{Y5K(W(|xnVdOgv&nm_pYh!W*T8OogF*PbiS zbw3N~J}Q;2G%JHUZ*MUt`DEne0L)0p=~>D*I-i~(f#gbV|C7dk;kQdGp zW@EFsSpfv(^UYt?JWFqPXs1cHxVKWE%f5fK2?#xYRmu_QNi~tGX)@cg=}%-Vq=8Bq z2_;A#q;45MTxXiaw$d&kV)|n=cMF5DomF2x{SW7wNgqLYZhAJIuIeypNiDsl;gC2` z%IsqeAnBZB7REeqfHAVbOcWoS&+D4bB+pgWL=<+iVdi?$Q_Nq?jKeW5|5mNTwSe7%W zt=vqq{Kqn)6Wjyy0=~Rp=CL&I68PKBbhFf)f~6WKV&IQWy$`-~?^tt5;)a;JM$WT8 z4;NF9c2keay1(q*TJpo~cRDPRn21>}lI2oBF^n>l!QB!f@Fb{OhOt9JZE_&mGV2 zP>r%It&CuGOmK1Bb*!a_Avi6}9}#$i#8>SU`g_e0g@Y+aU~&%!JrCzvS{KAG652%C zZ0@p0Hg~LmBdKAAAf5mtt}##hea-TVX@7W`!?^jv`|+H9m4SJt%^bhz_b|vg!iHr( zQ;~{?hmz=T8nD>jyVfkWIF`yn8FRWVt@wfsH%!*;(OqnA=TU&o5z6P&Be||T-(K0u zVY?EjQIi?Q7#`}~^Z3-Z*H>31%yFu!o(XZdkEIHmTC&`e*!B3esI_ZJA-ETc(I6Ru zMe>R0H?9}Ae46K`k5sd^eOphyjBO+=6JX27vWyI#nXWQGX!-5EJoAlewQf)@& zNXkufB#ObfQ?!%s*EsYvn`u~>(^t^ni^WSafVN9vE_Te|myNUBM#O-Am0SK2S**{Q zYj8s;;04D%xF`PruUsv|O>ZL3%_A=Clpx{#a6serr(F1iG;42d1aHB}od)DS#c*5e zfmyY4vXo$sgIDog?xQ+f-_7PS;AG^Fsr9a-?V35z+fb7F2DuKY3@Npp_{$T9`9K}; za(J&Vj^-Uv1){W8g9m=|oSb&_&14&6Z6;#NVBoOiAEiU2nb#L@gzaF}CWhf>g|?L^ zAReRMyKN)Jd6j(ENWeK8(7Lk@-zX=arFeTuGKLCHI{H*G-&{c9l14^S4o3tZtxWLI zmgbSF(e@{cF7?kFOr9i7GRI21FfW|KMT#jrw8G^ue77n);2&ej<8(h4&!b89{Z=?` z=HhuDCCj@WdS|Wf66i(m zqduj*_|Y`_q}Ooi78-S|>Z*}!Gk~f`B1YUp9AvP^;l*}(%>MulwJR$PS5DUoXa4|5c;7D#ZQEuima(cTB$LmYkBYJe>6n7W;_|qnduc8lJnk}h!99PLDodL`Eu&;8$2=;M$LMMM6|qs8J&Q;2%&@-eeJaif*a43y z$m%-)T%Jd-70c_|{lpi+!Er2)ziTNN2d5eSRiS62+og;Q*G_I_1*Nx0T*(j|^Sf_u zc*qs6rT9+YP!Fla8_bZAzj+Af*+_?JbMEtOT{G0ugZSZ5hzbyLvb0)L%p94u4jN0m88nY4>K9-nP%I|=+g zvZw?!Zqg<=KQ{F{n2hH=KMLutd>gMV(p_mb{zOvkY#9KL9q?ph!1c(kLeEH(UDHzb z&ihi*mQBT08NB%zXO-CmYqvNfC#PI`*1gf}R5^j>(l2wB7f$@!!XV@jkBt$>gquXd_ST*;t6=E7hON``P~M6Is{VMvw6$Q-FLr@bl@? z%z#Vee341Ca>)TKK|M$equ5t9;7v^q2?rOBXF!lL>-{_RzFJn zJ5RUJd<|@tnzo+_iDBOqsc2D0mKIRHi>z8tJ*~A8d{`?vpI-F3r-r;Csgs~;ca|2uB$f=u z^G_r!j#qI*EJQ{`dHcKZ-#E<^rv$8#=Y4AtR;M)N-}Tt?d%YDjDK4({^o~1NiBLlT zl9d4d=rHA!5tH2U?Oe}|wcBs(J6$78vx>@l-W~3oF^_gIB#s^6IUMD&f!??sUgySs z4AvJ#)bAHu@ca_)ONb|1h}gbz5xcfHE4bpFrg+NJTC|es^us0P#-MCsx|E~GYi<{J zmjs(Z1$YdsODN1FPffoM{B`ipgEZ@_OKYJvyL~$Oi98Ipu!7xWk(dz9RcqlJ2)xz@Zr}&XaDMhW*SGlF<2C%6-RgLb?)y@W)TN}lTq_;3F<-hKT$WHy z303WpUplP1;%bm+@yheg;7lWMVENybEX{_(j^q#PQybgfHK9sL+<5R#yKcl=M7OOV z#^ApyA55PA0F7;FdVGExxwN0g7gn!tHsX;Z`LZrC_t8FOUUCjFabC&r^IMuEp2x&- zS~dDBJSuLMNu9@1BUF9>=Pvl;)Qa=(i@q1VyVb^}6~s3W8YFC?m3U%E+OftHYJ=U0 zsOHwp>5Qb^ncLmyQR)zVi^0~>Uff)&G*1l3mgq7G^Oc_{2Gp_)^19O*3B7 z&CTVX?}#HJEH^COMTBKN^iE1mGu=>8P&jieV>1{;@27H0}3m6lQtB0!|=#z#K2 zrgX)+HyX!=Y$U##?%W7sYZggUj5cH&yu!nv9XrsHB2sDS%t!EDmb*K6g8t!U)10Ic zwVlc`#scuIA60w|kT5gXn)1&SXs5%{N+Pw58!JMloLG-wv!FK$dH^ zk4V*W8IiomWr={uGNQObc>W-GuLssIZfCWU9Zp5MP{+!ZK*0mk1CPV4X(p^y6y+_> z3jY1>WBu4@nRz%Mf`7ufi`!;O9PB`J*eeIsc2WbYp1!}J95ETVB}%IBcVNwZE5;a%{*xvGq5>e z2T|;OYoC?d$^}kT9C6frYkN%9j1Yw~5OQ~8-=!zEgjrnbVbd&hy+~SJgq7sMQd@*R z_&CV=)!z_^^Ji;qgCvELQ4;M;3}JyEd+JSbaOyJM-VrSS03mI~KpErxtatpYOHjYR z)g7+})rCn;y*{U|YAo-lHPm^UT^jTEatTAJjFkbnJw^yPKJ{7%?ez`gT5s7Wk&FsUQUliYVB6|bY~Hm#@KS-cTN=Qo$RTg!cm|TfCp@5r`fhEqRzkL&lbz5Y1Xs4Nn>gi;V>cF6o1CQbaBbfau>CF zy~mC%=g}{%d^P4l=0uw$fc)%N<^odRcm^MJzav{wcn4J0h_Sn{ie)|nR67fafIl#0a=}y|mn-X)P~}n*RWaH2CF`@)EvbwumHtj<7O_#~kHT1M66`>V7%UpqEe9A+x--P&}4+2b`$j zkWrYc3=ABMjC4MqPU&7I_&ec&w%+hv+DRED;dx&9iRW^aVh|}OJDE=(pOO4P@xG(t zi;4A3BUYbQ(jY%)nk%?O(xh3!mn|7wA7;%DHF=}2SYnw4^ z5VyBj>;%4IGi@QAl~K<*`QIJ$kSo=-j|AzyB+)eQ5Vomp8b-ocY@X3p=2SzL4r61q zl{g1EBdvTrsA}FJmsD7EyZLM)XtwT1%ET~pfPesl)PY}Cd^y#;8#jki#>)0ftIK%e zmg^|R=WpXheoSf@a5i(sPo~Qb@1d0Di<-xRV7=4tQr^{cdxIMsqe7W-md9SWT|-b{BvpAOTSb*}yI1VU%3mD`7(d=olV0PgS?G5@ z9iK_ooM;p3yME6iADOp|m5}_*dU7%W$>=z&S^Nj5>Gn`J+vW=LCflKQ1h1W={YwI@ z6!hhNb4}suC7|ilh4nrm@gKvF4>hw~cveIB)IT>h2@mC_V+*!v)D?}!v(=S9I%LxR~aDl+azZd@xHyP zTwhQ2iFSu8gS7?+x4+hcYg>^TsT@Tv84vyS#eQ`)#LJ8v9QLn8(KQ`UPPRswT@kuCIN<#& z=QCax!(wCZE?IX+)McDih{H?Y_oLMwiSfqs!}>3Zpt$hVs<%%WH;~8oB4L1~NXF7f zP%E$aapThy^IbG(ZfcBrrS$*x$+s- zFY7p&)lpGWce3byo%k=to&(oB8D*hqm$2%VaxrU*Ek@yOu8gXAW^fWYerz0qGskW# zr?j5S;q(IVaHO+&JNyi6c4UAuP(O@sXM}>NuC>( zv}fpzm&LCGc+c$~9MSdrO(#^DnmA^>wNUXobz+Rc7`6xnPq^Z^KOX6y3Vc-%(RJ&) z8{J|%NhFJ0)8k^Tb@z-#V=@M8=jCES>6JD4ooyAypQ<&z@=tiO6`Wkd^ESe{3=xUR z$6uHc>t9EF9r3S)d^dF#p?Ph6cX1mFh`hnRHDQto+En9jLQfe#TI<7Pa-%fkH*f2x z+K+R<^FFIAeJ^ z`EdKnfHCtN5_(`)Yw@aY0-Z9?$6pSttn_~o-CT$zOE~~ZHz8uiKlN(r21y48{j7su zB2TDzwjEMS$nI{fwFf`EpL;8}{0UCdE8cN%mCKL3tdG#$ds6Tft(m;K)t=_{ys=@Y zLWl$)kON@gZCoCN0nqlR>H0T?_3tS)`}@20xs%P8N%NzN&tNf~*vhFRCk#Efug;r| zSH!n6$9Z=%$vQtX6Z0G%mFqeW#qSUJe@UNDJ{n8eB*RNR%Q;}fuEHc?$>$+K6@J$8 zyCzf}teN^gZ?8N*KlV0&mge5%M;a)Rc0(URt!|6+1zdvtc&1oI;vHUVfo)@M)=`g^ zaX4#s+H>>592Pkz2XNrm!1g~JbldW_@L0`l8bl+AOCr9;#y95*cs%Xzj!k=4fqX@) z{{Uo@Y=-I=VA9>+OSV}v*fSLv?xA{mR?53wOl3w$`hr1ut7zAdYPtlPa+TWm7OoMD zaes5lZORDgl1@AN_$QD41ZdtW(yjF$hPU?dYq287b!&SwEbfj;&RA|@dj0SQF@s(w z;$MpP`e*i*g!lTxNL@vwcK4Adlvg2^P0J?qJQ0j>URZuPc*@F8u-V+fdY{iI{DN;l-6)UztSPV8tQJ=3$ z&iM7H_!8dBP4H%du)eD`%wK8KZQ)rRZB{bO;FGYHJ4ienk8XU9+r^$D@m8s6d2xTI z>9az}^3MQaCeek;ExP7o~5N}@ZR3RwnZ@8`Hl!5E26S4%#PbO`Vx7sI!lpvW2=c!JYT^60PqKf zW3`jVx^>NrE{s`j!U>*excLekk?F`Mtz-C$#GVziH@1Hb^vLXBafx2-h0I4e3jRdH zYOniBau2QseOtx;7N5o~=Fg))mveKt-Q8O{&Y2rX5=R_rkn%}T%a%DOy?CYn0K)B0 z`)5?y2iYUHjuB~T1Vl$FlbpAkB!GZ9Ic8#eaa^*Luc?$OMeB2}@P(zfivZHDB$h2g z)k%H17@F!}-Q_iDH!o0oY|M6<2<9&rES$--5m*YaSSi`fn3J znw^EVXMv-dCz4qivQu!8)rRAcdVK{-nz?Q=Zs_rk2Ke{H-ZR#(pq4naT@K<+)7@P( zQaE&0TtIMamZp%YIO89RP$kxaz^;~Rz#Bv-b@ ztoVQ8KD#Pe_;T{aqK&VmHt!Y`IT&_S3xWyhlb=ys&x||);Y|}uyzwQMhNQpLAW&hp zgLdiIpO~15b=shfzys4foae3-)Yal_q@wjc7}T^W7Tj#Uxt7&N%Oe?(mnt$&)(2_N zY>(?%I$w%4jS-7#ESHPwS)T{^D?q$aK$oXBpMmYwr_#ETDuyh!TzF_sHEHhiRB<-YJEr*dn( zU@2YQYu@LbEK<@@e=en%JXUlo_+r)`V`)16>h2jg0y{6uf(|(PSEkA03r%NFO+Ulh zjs2|Tk2Xo+Pc1>uM)O&Z9-)87r|_Tb=d0W)vbDdmyReP-G?Tn}Lfqk2O{N~v_IhrSd1Sm|)yv@emkE-88v2LE{uB6V zcWVds1&!6+$z_h`N)d?=uW2Mk-N7IOkFRRrEq(+PZVlRU zO!(_W@coo_lj)u+(j&6IX++XRHK2~>5c~yQ+=R|O2=uQ`@aMs=0xW5Nd1kW9J7s+9 zg#lE15EB{i*WS9H9DED$?~V1FzZY5SHkT6H`A{;M;v_*551C|+Ly|ejaJluzHQ4w^ z;r5TKcwTt^9$#JS+WnwtuPx-ah-{sBE4%F|V*vClSRS-Wt7~&;uQQvIz#0~tYbK$j zY3XkQINx(3l0fKoZ94})?Q>pd<0}W&{6Bf6-Xcx4NV1wZ)XcLEREAaD%Z?ZlMh~rY zzBbUlI`|VqlT_BUkL>#>AN^^TZ{4$ex%o1jo(jNh{ z!B>r>KY>+0T2Y1F%@khgo;h*gFC5rdnc1d}+Co5WhA7#+2{>QO)LsQ>R0h8viy?OBW~B%=(m`Hi>?`jL$E#w$jhtjkh-)@wuC{0*TU zT`nv}k!&myJhUQcZLQ@Q%9h>x)#o2Fp*Zh~>@40STjaXdZG0Hk(5wPhkQk$!)J8p77NonbHtLS8*v8;;j_0Yq>o;B^XfuZu~J%@_TDMd{5voBDaOFJ?|7X%Pi5YjN|fUFN{^q++KgnIj2r-+{3^2b+MB!@<|R%No@Ny3>WK@kMx zji;#@=qtyd@m;rx^n0BDQh;r-9cwq4f;CE{Vj10(j;C-v@!F*;JxgnvHd-_2{cqt9!|3%{EH8Ij5~e^F z5SYGIk}bE2;EZtFl0`Y>9r^aJF~9M)i{jZO)b;N&;^4rMtI6k-Av$vMvB~ei zQQO~cM*0Of)LKqPzrM@VXDRZWi()Cur6+ zCAVbf3J1Mfx6u9#=>kKk_?un5m8IORZ*BXarzacUMGfvi1lF*rD61l;JyG&zqv5z9 zh|OnqKm?79Fn`9m=%UvUk!X{;;DS+3Na@!d>-1m2Ukbbf~6(s-+UbL=9tM3g(I@O(=sC$TcfuNyMRkDVn;nd>rd-V`?eda1*>*G z4)8=;Ot;waPN^oH3|Pz&!aV6S*fRnb>x1;Kq;$Pg;RU0@@YuEW$dfDmr!zcExadH_ za(T#4Y*tr~{sCY3Ps9*vK03dKOIwJ;nJtyvE0e+oDyqk+?Ok8PzXSL?QM~@m7Es*B zF*|Q>ZRL_URe2@S7dsS=0oq1-(wyOY^)*tIq0FA1rp2$sOU*Jlo5R=IM~1DZU=4+U zk!H9GcnkuB&!$ule)ZXF9~-qBeFQ*;*X+O?&3ME-jerSK@$uh*k9y^NS^GceclX|2 zh2i_6!b9cHq})VN)3X?6l_W;acq`JpWPZ<>QF z?Ki^{rL$OFAhbwR_m>kBw|A)9pTJh0&KKu;-04-Iqst8ut>7`^34B{+s%Xi7GTXSs zjLj*54-J=Xpm0ukT=cKeiM(g<=6A47d&Ft>xh>i7#aFIn(sJEvwu-XQ^07YrxtZMfqg42Tr)$z`J`B=q?riN8HLOpX!Bi8mmlcxU2SxP$a^8JN% zNw2bSO02eO=bmW#f5mSQJ;s^i4-VL+waiLofo4fTKzKe{hEN6%ImaDqxA1&E8SwR+ zUEb*yb1X7EDfT&`Lc2lbi!wU;A70t*>Kezy?I%XII>pWPtX7gRXv8u!YvuEu=yFRA zg9QBrc{hkP-wt@cPnS^AY^=37X8}ZLSsAi$TMF1DXE-2dxvbYS(W9EpyV!|z&w@$f zrMq1+3H5u3#DdxjsBm|2kT$UdcOaAQE4b7=N8qgv2ej4UV#Xzw+B;oEH0k0hNDPP+ ztFA!>j^aqKk34H}rfBTb==vqyw74)scce(SGOUV2GO*-BoB}}Fe>0yqyz%w5w7+iG zbj@a4sUi`z=B5R(UaN&LMvb!vseVsdheFQrdYuuc%)R65{U^m=2>e%nE~lu>t#fYW zp-Dti$!^5pF8=^55_tQ{22Wfby=v%sSBxQBaeHBP6!H{u*VD9+pdTpmzjmPK1cFHP zJ?rzb+UMa-wxtyI?Cd0vG{W9@nppBVR1D!y;t$ugeGA~P3p^HS;ug2Fmrs)D%Mwm* zZRWRtWFUDGO|k}2xQ&g2!9Ie8PORCet&Yxr2Wnb;7g6XjK$lQR7Hf?nXq3Q&kOcCU zm7K8t0ne|kb$$!cZTvI3Jz~yB*0l(pRlRnI$s3c9B1hR7$m@VlTBUX4%{xca#+_+C zoo#lcnrQT^OZgEN=H~7Nbuf@jrf)3?1d=V{W4+ssScL#^E1>ZQgW?)B zwEh~J+eTu(WYKB%7SS|&j$AaqB(4D9W!H>n(!O!l{{U%AsPzxFc|~KpE}>pf%a5W- z<}NZZyX8Kau201NJ@MwJZkMjNE2q!<)(olxl>4fpKqQb3!y}$?#%a{1?WxZi6K?0X z>z*&rygLKwwodoDh5fgaB$9|)PJ|NDx9-GXj=}lpO?aGIdDLW0WWi>y1f?Qoxj@$e zNZb3h0ZM_v$PC>w4+qQd_3w(eVQ=mZ9AFbvEVK`Zn#IFdc+*_a)sT$AZzwY<>H`cFA5Krb zDMrZVhwmk1^g6#8-D(=V(Ek8v-95FX-W`n}J=0Xu6Y3_+LWsjCR)gTy71u_0&&kB1&_(Mv{S%jDSc3Ju+)6P||!&qF&j>W#Qd2+8-xm zk;tB6WqO}75X0u_w3C8sxY9l#B-dZsn$Dx6+syGikTbfv%PaCkh^!c}9DLk+cCQck ziTg$CmeLDNE?qxUFi75Pe`VN&b|A$nw;bcA_-oBB#6jKJ9VVw|q1stPb9JLMW=PD> z4Xdm%Le5BS%n2p)+dVs1p8(!8zM98HZ?iqDVWV5jA2C~#f)qJn+>k~q$n>9xnwN@& z{k7$gFLc;QlrSi}v+|eTSJV88^bHR4SGVyct)7kHh*s^!SY5QHBBzWoR#fM(3Nzmn zG|lf6Z)zV8;Tjdbr+G5m&7I8^z0@q^DaKU_tb>t^VAgJ%CZ(o*mtT`kp32GD;)dqt zH(@IS^KEHP9FE{{Ju3Hz?sV;CE-o(Qi%XK;V3I)si)4%_!7=SD2qYedpVat&h;_*3 zxsu;TznH>%jNp;fjl<=~`#oz4nnvu>E1921LwRwpL;i&w*0JRs&u${!liVC`;~v%L zH@+N-%2w38MQZvKGr9fTu`wU;1mK^*4r`C_KZ~_L2Fd-PmlH@%@sol*YmrSRRZ3D?#b|TB67bAA(YI*y zE0~gY^5MI5Hu0Y4|TC=c?ZPfhHg-kKrQ)ck2xcPIlB>mHh`6tI7Ce~Y3x{fQGizshZ znZCk~1e4x2O$v(`}B&Re0ggn;<|k@*bcZ`sDSm z71TU+tN#FKPHpFT9#_Li<1AQr%V(daD#YF})~)0=X{Z=g)W+_Sh9OT}{{WoV6L}T8 zTq4*smk#G2cjqj90MGTT`IYX@nA7NetMKPq@i&J23Uxp1n@gmT{KdMt-!;Y2Zjq#6 zTLhEWIIbteUKjC?jP(Z8Z@eWQpC5 z9wPCqNgQYR{!O`M?YX|S<+{eJCyOslwwDXX6xae7l|91Nqqvd3gRVIDuMoEV zobJ30BHn42uX{WRpFL3)HrzSmaLMBtVnuo%g!NeF)J>~L6||PoY?Mt3Jd(2l4>9c- z9da8VTDZb3Z*#$^K}uIl@&5pb9x?cd;#>Bc!*=TN#ErS-MU5NfB!&5jDm^$k=GPE=d6g zQ!n+su<+@6J1=2)`}`hQI9G|#$F`wkHsGu z-b6OkM)FY z$n__R>92kwTk5)NPvKoXAyACQX`2kJy?9}?k5V(~Sb9f{@1oIX);0S(2%>pfAt2j= z{eEWoMse$&{W?_IHq^p!oYyUnP}IBu@b()9w(#D!rQTks{o2iQ5H7^`Ace0i@u$Hp zGsG5_@2Do5CHy1hkQA9Vfr2C|+%Gxc=Z-6uo5ayZtEhN;!{X{gyr_;c6sJ!xkTbXa zqt~``RJ5-d>9XmU8rG$8ai?4<4Q^t23~EPU6pWBZQZY*HJH?67l3N#k9QXrM(6y_( zoj*g-ba(__RmPz|opA3M&hI7%U`FB7Z~*()N#Z|&z8dicsG7~3qDd@m!>maXSVs9g z9TBD4JA12X+Fg~oYmG?V z!SgGK;ag;Ga7!}CM{eUihHE;LmG9Jr3B}!?C;UM0ev{*ep2+Ard>1hh3}(h>UBy0J zl}*YVk5Qg$%ah^c9t~@2t0hZo_+TK8aMG_-P;oT0-;v2OZ1@y6y zk1XOI99B9$5a=idX}X!PX{hDIMGBIHK?44~Ddf{@o4z%y;rPlwfP4aRH2A zkt~vAjP}6qTs`l@od$H89ESz5!%OYSic;7?^@T{>7l1GTb<8^^+{S{nHjI4{2lQE{jORq9@Ry`1*Aw)Q5laI94R>D{&mNAC*X&Pd{s0NS_HIL zAa0$qPDXGMa&!1s(>g!EUle>fwv)t1Q?rfHJiYDafJDEH>jFyjPRzH(wGwM2T{;O?47+8c59HN1|h(9@wwY zE6W{wR`A&W0EEv}gHE)aeorm}?JjUf1x^%a=I1q$sM+WjI&Hw$zX0NI+_m!-V&MS*Q8|WH~+?%N_Ww(oYmelMZHU`jgq@3_^n)gdj z5_r?aI%T1|wz`m{Xp%I0%7M{KF&`-IMsZ%>Vc|_9Shcv+d`Ab`p@mn;Yq?rE3!eJ` zVA<<|x6`dVL-1AN#{U4?8kNnQ48@_dGCJ-~#gGyZW3w?nwbLkbY;?h=td^+xnhyiq z>b@X*9d=mlt$tTBlHw@Q{{V;r7kgmj4hN~nU5UOBUg>Qnx1>Fms{%>>j9&KMM~Dx* zx)`Kkp7dTb$L8_Mf=M~_;<$Zp#tZPmJB>2iMG)Lv zN0}g=BPK&*b|(y_K?j@`=D6J%##ehCT-?juJZHojZ;bSbrHV@^qGv$lh~q9Z^Kt>> zk4`aMb*G8^L$htw{Bopc+;|oDH^J|NdTqNs{{V^X4gB{4MDwl_ zcwBNMUB{0>oHkB+S2y7w7h7pjSz2j!ODak7jo6Wyjyc_x*gc7_ebc@s&u`)8n^(2_ z6fj7_B#qR_{GQx{&(vbIq~f(_&1M*y)jh~7FT}+0SAiDM;JMN*8Y?$*8Heo1Wr=|s zTlj%j`qwM0>MP;vX>RT;f%`KozFS)uf!%;eDmnxD*Qvs8(4*E5^m0 zFbNFm6^I!eo|MlTc)n}+?(HP9fn!xvia7!{_s`67-zWp$t!nDQtDZ`YNJ`QvSYP-@ z;?|O@d!rkBb_Pe5+Eiy&iGS6FY!wF`K+XW>zAgBnrrvmV_Iu9_UCD1`FwuEz+ekf+ zJTT~Sn)FRmD;jBTpYP|T{<(5(>^YElHU3&ySW+O6)Bu^k8{_xeM#{D0OEIs z^_CFdJ;bvBq{dmoWb?RWG5X-2rF{4CE5TZKhqPOLPTDzbXSrjt83-q0j(E;+atI`5 zxW5HUsJp1KjL9<`E)LQMuY6V(J8NMu_=xkRWAy7p@kfX5cUz~2XETF{jDI+h$>4+c zagKT9dSM*pb@DO}3v@d&|uZcvVKio__gH@FZY~NX8Cv zf%LCP@YlqBe*X2YwCN%9jCdfru?Tvp-L<*LQOK_9&*8?oe_?T~S+1XJ=ASd{#^E>4 zzel6FX4T?f?K}1soPu3#F*@?fu2pue)EK7 zMHwA;9PwM;B+zVhZ5DUdwHOfGHaxk8#bQoEgas+@B;H?}<}delfDV24eidU@_=n;j62@Y@)GsXU=ORz^SoWrSbs&TIS8HWrH0LVX z2lkDWq)l$hOlu=L5{xi;=daYz(!J6z_gnIw zb!TPay(Uw4_J)$}zGwS-f*aRsft4rmHTD<5e~4cSC$*059S&O!THU;>L-gxx_&w2pMLgfmdQRXS&=C}<dfOx`dP6+iDj!={wq7 zTlvipo3SjD>#I;4oy`yf?C(uec(q zYF4_&p$l8G8E&CtDyn?aNT+~VcQGgM81<`qUB#%GG~Hgp_e_#pBy&Ot^CajLtgDh( zp4F;HTqdI%vPSUyHkS-F*qksRh7Jx!GmvxAw(T^J16~lzc`Qe{Sw~;iyIcPNhMqpT zw2pf{4*u<-kN1k?7taUyKmhwN~|sQtEkz=5ARgxBd6WyYm3!95u{j81+I~)Pc_7(pOpZPH62;l za0lvZUR@f)OVlmX!=gsFk#XhuhGq@h^Yj&SP~U7OY4vBfLBqhYm0^wwox_9mr5moM z5|jHfIvp=j@h*?2E{&!5?szSb5#*{S&|9uD+5CFdbke*}XK>dL_>Ihjf_&RR`@XxI zn((=QwPn@QPtssrOD*PvDy{-|+~33biu%7q*1Q?vJt$A9>31?Xh;Km6aEN;Fj^qq` z3fajcm8mCX`6Ge*FN@kzY<1LzRs;iYXXQ7(Jhl}==SA@=wq?|8o!z-IMI>y_dy*Tj zdslZ4#D9gpB)gMK(JiObFIji}rscK}!~26c)Az>+2H+%MNGb`=8$bPOX1S~-z3o_>J^)C01l%EIPNR6)jlft z4ET98J3S8OBN_!8!Bh-Ady$^JbBaqHXF{=wrPP^X^A`-W#pWWPV!V&Syo*`Ax7Bsj zwy^TzwUDt=yb>4cPY1Ot-$T%+O*g7~AOF_;@X@X9tnFGm=vke{*HnBuDCkG2{C^6k z580!4iv1RKb=wn37&0BX>KmN;)(*Afhn0fe7$Vt~9#_gpJ@ThNO6Dy*U2i?d5dgU( zb17#y@1Dfg+{qqvX-)2q-&WNu>|*kC)ekZP7)O8?+Z_d0wzJl?J9uG^by$jwWZ{&3 za87?3=5>8a(&_xWIKI!ggCSBGn0`Go>MKSIfd#y4Ycz|2z%P-{vCRr-xnbR|bvM>} zrJ#b|>r+dU7{(-E91h2)KhB_QGj(wt)YpMzjP8u5-pKdB#Zre-)T3Rp-vkZQDx_o6 zkZLKVZ!}E=f<{sIl>qDS&0Wq}QhiJA)4l2YP-lbqo!yS}+-)F=zxKOpc-zZ@1Wtv7 zVOS4*01xF{gp*#Q0wFA?l0Y0&lTrQCjml3zs&UV`!J*jC*}aWx{{R+fu3F!Hv`kK1 ztR^;)p5&4c{#C(hkyu_hk_Ke{BfWS%dJs)rlvv)v!dOw{&nvqipJT;a(cewBMhgf= z90125Pqt}jwmN9XmFQ8@Y~;6fmfq@EvGWb8axv2#D|X|=UNy00`#sE(hBzDH-JJUW z0Q%|)HNdl~MCUo=WlEpSRU5r-P{rdLOLYn|IQGqFDw0Q6)#=Y!E0N!L-^I=vE11*d zCzJ&W=gqZ(ImzqK*WRrru=7Y|xs6mGyiNxnjbv(*=|HiV#>h^7 zQDJiZrd!Pf0*NZjua1m zgx7vGEmKa1&S{}wz;8{!h96RL57MbsODKoantouEw5S0wzs>`90kO#X z)d&97)h?3DQXpEn+Rqs<$%ETG2d@A$<)Z)D9yh}70G0A{<+N5qj z<5r^9E%gLgrTHYzImYAoQjobMbz*%}QC}v`aIE>ls}vdc0AjH&^dAyO9G42w%{E8M zNIZAth7D$Gaoiho_FI8&sJpUB8^0sh@Tyv8h+={`EW%s>_!3GSwpjamRJkOJr$VFE z6ty`fvOqN$Gn0p2GNaTL$gC^vOHQ^aCA`vZI6hkfMh~N7jD9uW>fRi*2-93hOFj-5 zo!>Qiz3!cLYc}g87g3{QINgt7k&npMe$pKd_*0itt4&>Q?U7PPBRSl8Z>L{cuOr7S z8{=kjnJ>E~fc$F^26&K&MZ2DRs5tbl-oerfNR`}3H-?b`z;y&=SdW{ZY*#Ggx*ZA( z<>S@kw&j3i9Q4oi;Lvq@4M0geQAZm^z>oN!J@bNV(r#^hE2zfTA7j((Va^0AGx>w* z<~|tyRnXb#e-3YL(g;ywxU`VJn`;YsQ>H%Tf=9^5_mxQ=hOv~E_BM=94!V-+NYL6@ zG+=TY3P?TvYyy8;&xUa&$v5%{faQZPUfr-WUqEVFMYf|aoulcZZ#>}=IVB!g9Y)qg zZ_JwId`a-PTF|8z`n{q;vZ_d`>nR0TXYXuYeRIttSs{JdHc=}L$v(cGH z5mC0&J}8Ue&W5%cjpge}Z{n*TuJqB-$T`M1i;s zcp2SGa4~{FJ%;YRvtOusFT!68-dWt+>iQ*}z@2iE-pg?Wkrv1BfDS!Z1n0eY7P+PT zPw)-J#;c>>+u3P)X?620@2upw{oZzjiRXrLrvqxXTiBi}rwd;XU0<7C!S$;5<^0bg zo52478Z^xw-^16IDz?(_)<8tjg*=9kGj3l{c9GvT!OQS}SC()1o+LKb<#Q~CNaFIw zPDWip&*xq4o#Ic4{{R&xeO5hDq%les?kjF4$vixf1uWeBZ_ z)^j29pnXc-S6MJVP^D+Wjxo8S3?$7Y&y3`4+yVAt4ST$P0q`xpge}aL z0{Fu!qswrxTL}|5ZUki2b1zH&|mF-&TPmv~}X0o9Js-%U6)881)NARleP0{t&gJ07l z)NH50Wl_DBUtBWm+IbM&WGW6?cka=OIyijSp3(Fjl?7@SbazXw>8e6Rm&nvJ#m z4^_VSccR{DaNbE~k-~Poa4Co^dE^3P1M%xzY~CEywX183T{95dNt8sbKQ8h=D!FH%{8Ell9<3yj zO&T@{C)9(IliH5X&aE&dp5o*C9%v@L91n=D9eqqTOo zas~@b*-)T&VY{By=3YD1HGM;FiFs=q-g%>RF+ZC#G3Rt?kbzsE0Pghzt$iuujYfS} z!xnbG@Q5V$5UVWmsz-U};~cuQi?ojAbI)q|W5ZguzocvTdb;>}!s5{+Uoz1l5g6f5 zK_A`6_m4U1O>ttep8o*u`WjH7%^gj>KjGuarNyY-HlwE8w53k#Wgm2az^F1X+A?#% zHS{)z{{Ra^!k!mxGsF7Dh3=JZT1B~7BNL=FuOV(Ti({lh~79p0DD2*>6%+ZPLsBs7Lo% zc~Oy$0L5~#PvRdG>LX6K^4u8;i7qDcqd4bw`7wcx=O0S#^Us*zW_1MAEoPD@IAV;fhpQDX&5@ko zocfCBZayq(K0UpX($+IPD|6=B$1>q1jB==B!H^y>2zAeW#;$lH;LpP^6!=5_61({Z zkqwBArD&2jV2#e_ji1ckZ%>ywJ#$w4C-6JR z7vTlGcGl{yT~hXGa0w$MMj~>&@s`KdyI&IctHtx`c76xbc*>wARIqo#wWwk3CrMLS`QfZckP{D!T3kE{I=chcHBP(oaImt&uT_Q`d_(X={uaKwkH+@~ z?^?N3c#JG&S6uQ~xeN##V2akCVD{@~d0&YA?b~@Scai#4RPeG6&h4RDW#j)uzuA0%k%vSQctPdJ&Y;+~Q zbJXxKPCM2zr>)AT7Pn@{gNX4gS9+3Mi+iXfR+cwN#4o?I79`_nJZxdwzK-~Nsp__t zv)SpIh47Xo9zeFTRfG3uk-VoP2d@}Cy*v@LkF?Dmw$Vpz_UQM2qX|A;tI>qNDIg9o z%1><8mG8t!-pb!jp7t1_jD<)chDh6J;Ika?#C5?VwMP08S`J#HN5@*_&CiN17f{vb z^JI})QZ0iV^dRkjFY)8)T!yuv+xUk`d(9hBX@1KfQw;Hd!`JQ%0qu-?)R*>lJ|)x> zO449mIuRe4ER!p<%6&l2(Vo3Qs&PSW;cIKHG6`~FZRS>t^UqQ;K=kTsRj{EMXx8VI zYMvjwvM0=x9P@xMKU(AEg~Xd*Bp+(^J$qZWmKIrnk(eA32SeO-{#E5}6)rOwEQgT2 z>KZ*Nb8TvLHd=eW*yFw>V>#+X-ggR)ntDRcy1kfx*BgZ(5q=$tpr5hvto-^tz z4@tkVfdgKGyGX)?$v=(=AB{YfZZRm6<9FroeV4rVl zSS^I|1l`F#4Av8OiET<6PvrjMow@@)a$>9)hjMERzOV*gkpz$sfxVHhoIEHY1t@ zXyb${Naq9<1Sli19PoQqZN;FrxcfxkHXCpQfuE=NS4*ba*~t>br7hV`=6MRU7vwG* z0HDD+89D3px2szvt-1tMm7KQO6%Jb+aK|+l)Xk=fnlFjk(rxJSB*c-uPYl1^J^A(N zUit9W_WAXgZ%^58m@eP3x(Q5<{{VM_3YJrheQ|@FSI#BV$DCh#7QuIP6c_nsIxdV|7^Yd!UwMy;RX=zdZLdJcF5SHs^AJb!WF zhFhyExJAw4Y`MF+Qr|0QC?g@1;|DBr*R_4);optd{wC0EygnzjU;;F^5JY9VV1$(_ z-eFLH9BfrmD>{wI`>MoU$ISfs@n)N-_eK z)p#r7w~jnBV%OG9YilYWDj^Ie6+plS##msm9QzZDSJ`%U(p~FMW#S9_Jx}ctW+jm@ zRSC`u43%;?=NUDX++4hUPsmJ+V~lk;1o6P>TWf7d z+3tK{H-vs8{7LaV+MTp9eXmt-Fp(j*f-(p9q`)62^@p^?rH7+^TTtse|{w_en3FT6t9q?6d$+{PbHj#hve*qoFKqhg@I z!EMK`Yt(LhVesR{CP?+q3L?&=I<16)<=I$ei|!!#jWGUPmww0o4}lDQc6>0TqJ>N>}SZ?%|Wkn5=& z&jPi?HuFMvaKT2@=jOrANH`&@SXYv}u`UUvsqEhoJU!t501#P0W#Y{qX%^fFQ&E{h zl-zzoB}NQKAYdPI4Srtu{{TRTMDaGKrP?fs3>Pl3B+Z!wS;`aBIb0n3*XW*!rpJG$ zrkkp1$RIZhFObtnuC8)JVWz^IWT?gke8b{@hu#*S#Cn#kajVO8mluqX!RI5$hz{Hn z{9AF1@mR{Ulho*?H%qDVlH2(&z1MeKWal4+Z`oYSsM`%SoVk&LEN3Si_4XC?Ew93V z4PNTfSZcS1#x0v|=G;8fA;ts8hRF0F^Xe~`a) zn#bVJ6l%JK)y9iNiSrPLAb0#LMA|v+*ud5_ty@mkt?aF( zhfoNhOB``+0YC+T2aGOpkU%G;dar}L6XQ)n1L6%IPiu<;jcYnXBuRq#+PG(Jz!BJS z!Q-uSh6V97Q+R_|@jOx8Ll2m?t8U>OM7Y|eP6kE*&Ph4R9pkm})uqZVo|1WX=N?G} zZi#`&IT#^<{b{*M)(sSoh*S-_Lmtc+oN;%8vD)<5&T8*UxQNfMv}`?l`V5I)&jwXj1020 zV+?xWJ^?(F)K|&6a_Rm&mgd7%iKdx>d8fCSZ%{cqLXD>#_&qBsb*AI*p~czgcs=Kh zd`%pUWUyN!N?2kfSzPChpq63z4Ah!lnXKPjq)>rva7Q9}0x{1~gN`fFuYM9}7CP0r zZBAFxr*N-x#1g=G$tvngk=F`2$7<8R@GbX;B%aZ{MjJqzYg^BCX5vX=Zs{B3smFCV z@7z+IXry&TIW&?uZ}>#KQKnlh&DFN#51%kTcB#lC0{{=NYV`d_QSsOOBFU%2;rQOl zC=dE%E~Sx3=1;!gFv-VC_J0I_!UtodEv=TTr(87PN51jy5?r1(fa|f3OyiDgjn=#` zr+7P3U$8}Sa}&yB^WI&Sq>+#jBR@V5Jg^xO9$ zeB!Y5oqJ8Q)h3z^7AfxJY_k+ZbICjxLU7qTuzBMc#d8<1jHt3g z(lA_YKfH1Y&p7Lj*sf~1l5a$8@`~0r{3GzEK=9&UYCbHyYddKn7U>DOG0P_<)T@vT zV>viLa(i^7@Scm{jb2-Z)2!BCvm?ngrJ2t0z;=>E;Na(RIVXZ@+Wbb+d}m<#W~HRs zNCK!xAp1;W2@Xc(K`@A(dxQNerqFDB0pZ8D{@u|afr9`hxp_BW5JLsrMn|axWA(@D z?Y&uyvf08nl6Ues`<*uC8K9d_ze|hYzFcN&n^+bU7~6oww-2c1zM1gefp=x4dHyE9 zlJ4>&7+GyqJhfK?jm;QbgWP&{uMqK8h45}$m2E#%HuFvMD%%L=i+di21WMV@u;(@E zT1?vAo`Ebj5MEu_6jWw;B9awl0Dz23vX4O6BaCAe(N3zC%nnBk`{e)_i}irMS70-$>NVNtqVet`n?y`X!G=0wIW#j8!O{;kK!n1gr`(E=_it;Fz%ZKc+ zt)lr|a_I|aBi>5gGn$PXy-_{ajlLK7qV_NCy&B@;P$7y9E*VX{UST9VvjPj8k&W5u zow?3^*TK>0S2lA^q{A9pmMayU@otlHH#_hmknI`9K?l>leDE*)0@ud>0K^C{Em&{0 z)S&X(RVs26ge{D5_psbox7+w-b)OFp7I<8UWw*DHZ13WKvq)1pDJn+fFek4WBer?2 z8nu*VWRG5!3h}+{b{f}&zqKtynhf(=>MIG6B);M!gUE?ffydM7T!bG3bUz&FD{tdz zuO8;#e1Kbdae&0}x>BxG5(xx=c{QJTtN4D?!`9cHBe}Vf;w2_{qf@duzu0*h2{^{= z0&!RV9(adacRHe_<&CA$aXr<)n2{842n{0dK-_}6u*0~)tf}IcH!?<*FjXT5X?_LW zBldssc7*SzX!_jN*72%K4V2d}GQVP*<@1y;P=9uygV0x=_@nk|U29x`Y8Tdax3gg* zw2J)4BZcIj^+bB|1}k61zBbh~DQ@Ms@htjQ)uS8TeZ)Q>{geLyvu@Z} z-m_ae4aq(GMI=l()t!nejFgS)iujaQ&E9D>8&=oLu?50*szW`)PM-d!EE#< zt`({+IgDygpW#QYH-ImEAD}(O{;?(O(UT}mGFw}9k}yCUki^PQ`^0@~&HO9ktshR- zq}6o`8SU?yWis7I8S?~ve|Yez$QT_4J;il?5BTTs>*801uB_s`wbQ4UdA+jxIRZey zA!m|U_HqCR89wH`PvRDZrs#LkNu%nzbg0&g4V|9XnIMta0{(PTBqsyz?*MJ>n%~<= z=+0=SpS+Kud}|~!SV!XBI%^3c0m|LqOb*T6ywDh^&IcfY?O#4$Ygg=pSk-lSEG~>{ zBSnV@QJeIe2GW?;~>;eefkO*zvG8+eu zM^@GRA>u7I)4>|1i)#;wY~xt2FEqus`w_cfL~bV&h?8)}aydE94_;cdr#(|UsMmxv zk~Q_e+FMZ8k}D`}cbF5)mfZ}VRHva}0|S$upZ>b_UjS&{3Gq#ZhxX5dq)WSrJh0GB zaLVFNLoyixaD5nY`h2C~{{RPE+*{vknswHPsS6mwOJHVr?<9TOSfa{dTq*wPY>~!# z)<=eZD(YH(y=9@#q+G>m1jp?WPjmKvFy!R}gT`@yp|DTqTyw(Lzq+n^D!m5_M?>@< zUho%%Gz*CB?5Bb#7HzF>DzuH}1p~_{vAd8*ai6KLF0q0y2>6EMU+{j5eW9$cwr93k zjl6_{33y7L0XYXC=cukxemz}yBW3IOF7foq#|GwImr+RE{M)8=Vg1~w$mb@w>;C}S zYg)RR=1IH?>!RK<<|~QX;kO^X=CU%DQ^){-I#nzsX1SxGil~#e=g?Ze#vd1H7V`NQ zdUm%AsyAC*T3p3BByto<8pJXF{{S`dx5OWaJ|FQ8u9u!7@RiP#=^LtlX1Z7`yyUcj z6MLU>=N*8rcF})mzYgjejg_tEhxG$(<(TAq%M`f*$3j?s^}ro|ZaWI={C(li2l%wc z{{UyVytNUBx0g$~hmGGekFs1&(gHu(#yu-abnC_1dk@>tj`6cT4Syc!*4E*4O$Fm& zpPFq_`LN&K3mmZw{&nZto~3Jj7o8@PZkKN+=AB+?a=+axBRD5L$>-9(mhr#Ay$0GB zyYS7_%*D!>ZZ?O=9E>hNAn3>Ux5Qy|x*X%l=c)YHrHZO);myFvo|%+2Pv-jPIc?F)=yPCasK z$}Mg$bi1EAYa5o_es4B10s8gN<5lnVTWg60#kH^5*?1)U!}4r_Nyl9gZJwcZ;jaMM zz>lSP;^m~yHXAoUfx7Z!RwvgBPt^P&;jJ!s<-YN)rmbf;-mKG ze}{e&m&G!*?xfbB+#~H_%yLji; zzOvH4X&-^8(dpVYg(Zscp)KsvV z6rSPS0>6oV5za}S(-)nv=^e~5Ee3O$+7 z;|VLR&$oUc=pHcDbO|l4bxT{DIa3nBEOH3r$05TimiY+dBp>!`<1KbiiuxVPLlaG^ z+rq01Q(A*0Ya0FBZ2*Ceg_IHXtylQ3s|`lqT+{qUEo6;xwV`PO<#5>ncCk7BAbz#! zo*4L@@S^HSBk`7{e{fY>%og$a5oNj0T$~=gGwsryn&@4WR{sETImnhZR&Tv z36UYUzmDCmQZSbQTSXnbWOIbb!TPpI?_V`)F+Yc8uwM*o0n+W3BQ?B=%;CQO04S>1 z0Q746E5IKJyg97s&8=Tp0bo99@2?rfx1|d&P1LWQ9gMWOJ%h!fL9J=Ds$hTz*n1I{A{z+yfAzr;fba4nM^;q zM2QL!w5p>93!h*}?OP_J(2iEsnfGtQ%|qdzj=T_TG}HZ(5@`U_=eTL)%tY-Bj;Zpu zQWTZ{0BH8&JbmHs5O|ADZ4%>6y0Fp6TwU2LPO`|k;mS^+Mter&s2IQ}n)rXiX{kqV zb*nX)nrj%m$mP0emNg!QRZ2)Ya7e+fgGK$JzA9+&E}L+Y-C7~tGO{5=#N5T8a{+a!prw-YJ4l|1IiW;swJQ=9>u432u%>fGtR z1&OU?{?3rBMdy~*&Ul%~JBC03%_O4ko(ZijR5 z(k)xX&8XbRq)#r55s{3sNY;vl{&#r9qA=Oy90T~A)Y`SD!&vs(SX(xres4D0P@gcy zRA)I1K_|Fn6+e!@X+N-dWa*wGW?f*!!a1#>GFl{u`=t428RwN4_pg~PK051(Xv<@$ z*h_H;S;fcLh4+^K0L3YZzC$1x#^oVM;~i^-Myze@!-zVvB{2@c1AwGBA$IZ*GHmw6%$6fmsy zfCmq=fzHji?pnTKi}st>Eo|RO)24@1d&0(Ro5;nxw60EM$`gj?fq(^c?eSmZ?Z1a1 z)4V@pY;@@qxR6H`_#EV)HeJ{pbjAm2?2O-CPHEF`;XA9p0N?6N*S0!@ejTt`*)VkJ z-d`^pw@EgBamRPa&)pp>&8NKhZ4{cOhkxQ-PX6X$wl`%0(CzFu^asD5jT2f8D@yP+rQYGU?MA{kg|IMPneiKA z-@Qk-k`HE*)tz0xhJG9iT`R=bcX|@tz=0OoV)DF|LP#tvUO0j7UBk6U;>*7n`2N)< z(lmAc$ANZ3aSYEa8&u=W$qK_gfjhsIcX}6rEp%-%=U4d5Eo?H1ww9J_0Q*#clFKY{ zC|@iOa2K)7das8(OX1%c=_{f562bgE1UtN`5rwoj5-7n~AP&W`)X2;gezl}(+{w<{ zBjR5U>Yo+7E38Rp;cIo&Zk{5iYEGggJ$F3I9ANv6-hlI7$KZH>XbnSNO)0N1Ju{f z`j)4xXuqrQ0=V#XC#D7>V}^#o_Ru9|R+{u7p@RQ@CDi@y=x>2`3~ zYDsr1Fl3X;iWyi)7YnfvF@$vEdG{i|aPbGh%Y8&i;vGWjD@msLq(qd@bX~axp@S>N zer(r+Xu4mBwOgC5CgST;j^2Ip!!&+!!Mt(vV8}W32Q<$S_)o-IRjgNuTVVgq$ux#eF*JaIwil4^yK?Sv#V-$ z(aePrEUqL$xBa(_gvYn7LpHy!_)aUY68KldQrUfv0!v%F&C^|OJ6p@zs80tt&mN|^ z-8!4{*&QylW$wmTW^CUFd^4kIQfhu6@fNA2N{~E-8rdiFWCJ27%yNcY=Np)973H$& z8l}w8>E0jFu1&CaQ{dROfW@VfThZ?2(^3)omkWg@{E8+Bo{A2hj@jt?gQdscF8>cvG) zG1Xn49C$))TTPzi>b4h=96HMF3}MmNg;Mh2mz?JWSEN{IzB9Jc-(9(~yP6BfA7|Sj zl0c)6kvI*w^T6%FuG_|+5&jlyvOp*CS&<@cVYarCXHY-8m00uiEuT?b3|=?2{?U%x zMYz-_vV~9Ct~Ce+yiwygATVR!jhzoeLzbngcUNmuW-kzUBFe^1AH;UI7Hq5LO84B( zAG-k?9Ax%6HRIa%!}Ywp{?hPDE~{^NJkX2^x@V}wn?d^VUgc%2_*&}SH63!*S5otn zZN$<^G%Nw-ouqdSli5Hgrbk0Azwz4UFA&G!zY0U6Nb+G;UnKy+7|u>ra(gf&R&z>A zQ(9@qW9G{n9d^d=$b(PQET=<<7v5U{M^eh!lyKPPEW-OvY zWAhaw^xn83yL`hQ^@O1qm(1R*;_f_Otmt<_;w#9o0aF}K#A7+Z2OQ_8rD1A*Jn=t@ zu1rfS=1>%~u_qr=c=zVMgO4^B;aXfkad{W={~3(B!@zd=0SI=1IIyti8HF znV6&7=gMQp`l!h*BAor zTMed=%XNJqNbU?Nxn_rlF^JCyGBQ{l#}!j?zMCFnt5#3mW3_JrX?`}*pc+zG=?`-1 zuQYQ=We}5srY4b)voAq`j`hf1e#&|hS-jeH$TJ*(E|xX~;Y z$>-4{M-LyAU-xpBJRU$e1MxMlb>pouo=rbXxLbQhc1ci9w(O;HSfaPg=RTuo#d1QL zg7;%$sp4xVZf1D@0D`m+4}2nmTNrJv?|egW8|^n^d}#!1FsT!tn;qEo^&P8QSvMXt zm{=yNbmW3~cLjx`X22NPDIQ^7Gxt}XS-MsxyQP>epFBFd1TrSWZU@ z%7m3%_p09&JSl6b=`u@U4w)tVt>@ldTNRi_U4T$s6*jXsVhw!ao(}OonW?Rok1EA{ z6=V{|z%U#f#~|Tjyr!!UQ> z70jf_t`96!jFNhfUtH$C!T4{bcvoE0BE8hL8-aBZ*>NqRosSqFG2J3#pFk?4bPYSowU$ji@8KZaM(Z1x zm!Vk8ZXG!o`d68qUdjy)J!@F8OWQl4h_|{)JkQj)LBCO7Kk-V&dnU@1R;AD5K?GsYF)HLf`OWV|kPO@ULq*14w!4GG~@;$SUTE~^7 zRB5)Zb};zad^NvZu(+R3wROjk@NJRCauYfEx#`e)n#0z=X|Eb<0^wjW>7fFImLgi= zRY(fFHrx@{3D>=L+HJ3fH7fzAYSwbStUtSnZc}>}$ikv@&#xG-JlDP!{{X^Mt4#hD z)2Fp~$J|K1KnoqD^SN?6V}LV{T&E_^oFr&-{`xmKgz>+MJYA~+s(6iIh!tsP)Lga( zdj$o_`g31Fcz){IOO%Em5u5vH;|`NsZb+jCpy%cpJo=GeJU_wT5ksntA*QsJaT8oJ zEdKy?bF}0T2|42fHS{;buZOq31AuCx{anhWS!RulF-xD9Y;2@E4#absxLzpg$NgQ# z^kuJPjBgb9R{sD<);`f3^4{A^_nI=%qd6Q0Y<#^&GtW*dk<<>7E?-a66{WPDL^n~~ zusd1D-rP3hYkfe+IURcqV^P*`W}4Sip5pUPS1#zX3tY+x$sv`uW88!9UVY;m?IPOR zE4?>QhQ=7cia2FqJhudL&dhmVL5vFQjI{TUE|oc4`R~LRZ)K=Wrai5)7+j-~8t%yT zd}P*^gA8{|or>7(Ngtp!N5q#Ux%u;hSsgSGkF1fQ8_fQl$M4IIZsp_)^x_Rb5NOFkO9(8Ifj% zc@M@~hHw*O_Y{;CDoh>D?A&JA2vk=3ysaSfCTUqk6Q507;D#)3|d;HwwEg@ zRNArKlyQ-jLfFP|NydHaowD%Ub|M*t)}g0ExD3U($amm?B4%CNk73Cbg={i@^4#d6 zqr8#tG5krmv9r62T+{A6+nFM`Q3)3AtjC#teZYnTBz|0RTRtE0_M3BWsM+Z{9nQ6= zT_({ivwrm$k&TLoasbY9FbAhvF8n2Z;;U^VN3+uJB(#P!6WzxjmmEsNB<+wEEIWX# z2Tb>_>rU{j-w!nTu5^pVTd0+#TUKzgTzO|Jlm(jra!LI=@yDJEnnzvf&q$Z_{Wc}F zh+k;)uA?*o?&O|YDi19z=F~+(E+tflKF2|VS}94oOqYS-Z0lL zOxHU7jkJ!2;%7+qs8G2op^%m!4y0gu*Ut8z7O&vegI?>`R>sokHM)qwh0y1A^ATQ7 zdSmh8x?!2eWUf?jRc5``eO2N(by+Vy#V(fDky({!*%!)CRPtMCC5P8JuRZZLyf5E3 z$!8R!qB3rjMo9-~W#nKUmD-Ps8in?s1^uS1mey=z4+0{wbVJAmke$+U7?a=BX0m)? z@iW1`D2_{gOGKOZFiawmKK6LowC&uAyz!Hq`c}}#;i_n-XV~V9Yo})he9_{+19%$s zq`Qbt@(-6W6^rKeDmU;xpOtv_qwx1iicx4TrL>rh+a^%Q1Olgxyb;pAi|}WRv|DAp zvb&1LJ6|SmEw1KxWr{`40&G$ln}7p;c&``NE-$qUrkeKl8QUN$Aj*(4fN}xaJvvt- z#7CORo|I!ztq&+Z2xBC$eYHa;L9qPXkAK#>{U71ZoQ%zLuEiXX;hGrYW@Dd1a4XRK z38(4y`mnm!1+BzVD=9&>h&bcq0ATyqsd$^i9uC%~id`ZrjXvTi0!nQd1edAFRvmfu zrt8ORoYgB-Qsrs-oM?|j(RAx}w$vuxz!s6DP6-?U6oRMgSsIkrHwq$6Qs>EWy;#oM z8`OHA>0H*i;iz}b43Bqj3qKLd8p?JreZhgx(y(>AZ4&l4^#1?|+Nhe{6(^CWWO*F* z;f_AP;Zm!iye0Lq=umi}G+Ek9yQB*usziLok(75i9gjUlZQXo8&@OFO&Us#Pp_mkG zF7h$Ci8(t*L0m?G@ax34dTjGV=?sy^Pn9;w1LR`}$-h3}g#*^Pi{AhP2#)4Ct*&;0 z&RGOyk5G!F@I6ZdQ|;q@$o|h#)tX{2y)F$(?sXAcTwUeb70Jm8aycD6 zE3UoqwvDXmv*~Ir^x5SANpWo&rvnFXLVmwawes8eDRh}*lIG>YILLG?7$458%?z%F zTQ51_Q{}YsyA!+Lw@%dkx)kz=OI?oR$BW@RO)@mS)^9aC#U!roA^`LV4(D$q;J*UT7u&o|sF4_imNM^+OZQa3CBHw)scN1d z_;6vGe-1*f_PCI|({7Ey=r%C~^Ns}{T1{Bi7zG&eOH-(}_@UuhE%(VYmXHm~SrcbD zB?|+L^u{a5{6*qjGf+l~)r&cEwfAI|9WposTStmbLRsNhVTwXz5nGexpgiqe z?B@f}l4|FMyf}3WnGateZW!o&Ggs{*mBkFcF?U3I6`j_rs)R|+lrb-vEX3gLUT~wi zJ*%d;@o$JPHCX&K*SAThiQ|o-S0#$>0G7v6M?7)uQk^?a6S9k$t!5k%A{9)1Mn)@N zMDUCnmFRVvKQ%viW)dq$g*{2e;Ao9)Zpf{MT~DICIpQmOU1>jgB5BA4qFX@w7##eB zl5>zTxMYKpb6v-awT*9GShSxHO{63(DM==o;uABzNE?oLQN{-(;=X#8O*2D~%J-J@ zysWD_u-wEBm?s}EVmKJ~t!pnH+F4u)G}&NBM>{05jKHeIZO9vT6OT}9quW8drg<{K zO=}crTzF4b(e>Lr$$XJve$w!%W?~N|7?oaoVDVm)Hmjgn-!-%voKaer^IluY6($lD z!9c3sWR1WCde+XH@iyWM3ppf??n_dP8E)r}WtAK6m0}T-C!RR=uNu~TXQSL|R_$e= z#c6tEERweNfDFebG6zsVAoJ=vbj3kGi(=G4vevaGwu$5j;J)UGLFus&ldsOa)3WF`h}%G*FboHjBm+NIJ)vvY51w?g7F`@*JPc60fkzzVbDUj=H`8f0+Z z+fQL^6gn-!ZDu~a;fLc&S*{v0jXBLG_E**V9rUoZY_5vF67i0wZwWRUquQ1jent*G zLC7Y%F9}@9;?EYMUfKP&RRn#qH!!qd_mC+H*~c7azG;L@XLGhZf)A$#z0<({CcV=q zMvcNo*!e&JXVmdqx{#IZXNkg2F>;Ca7lu9`uZG00q1(iba6?M|X6aw*%yam3sydIu zoqJvJW}mETtqrE1rOLM=HgM)?6O;r2wO2h!KZSYDjji~~`uxwSYKALs`DX>RWmg38 znF;3|@m*HCsViwRta_ZcGL<`{S=mSDoYY;#-0&rSZ;MmuOYawJ(Ighp>9agX3i8`Y z6UXjY$WY_ylU_07>+N%1xsE$TiX9@^!MKf`TH;K7Tn~2oPg;f^^XgSVCI{hahT>$pc01+7Oi@Ny?E}-1 zTq9ghHmEfXQrU0r5w^tgWdfq~z!>S+lTOrpb*$N5i^%Mi0-;gmHvkcWM&Nm^9-j!| zfTZh3;k(i8%;dmF|fG|PG=BUn= zdNf5mh*!=VNC8_o=b!Pdqb`SRQ|0A7Lg&SLj*oWNS|$GYA}S&dH| z_22C)nJ({GndKzAzBBj$I2DKes_;URtTLoWJ8*|?eF4TlTB)V@lIH&K!R4w&7E3EI z3`e&InqdkmJ0gM9r+q^ZTfO?Q^2Bog0ITHm;~5>sD@s3w*GJ61)NZZqByZlOn!6TI zPCy+<^vSNFb*pP&1+AJ#F6{Y@AjtRNb^NLuU2g6@Nwo`tlg}u@X)sp{$j=%5Xt|~8 zeUty!{86!$Zsk*dhHin6x3zTt0B*IjDuO8A9SB?z_|~M}6ir21YdP(~Q_BF$7$>Gk z1Ok2QGVjA0y@WfiBJ(3T#EFN<_9L}%`)EF=q_C3eigy}}CQZih|l#->y6Tb6#|=SLH3Z zkItc6iIK?}0Q={f>h_X3-WE4K4r|*Uq&IdoOHD|(MS+EBMuz#&^t#@z$+6F%= zdtb_`RfY-UtuJXVqgZ&OvHMVwwz~1$@l(STQDnwXC*HWowIz&lf5Nq`^<@d2{^GHw19#*_TwMtr!}8_;g1z-cdI_9b3D^ZIBArC zRDX9oW9d+;Id0CiLI~fp@rIcywVtVFx{l%p+9Qy{+k1itVfkSD)G;oHEYd@!#pU^j zaA%kjnCMBs-T74u--KHAlBBc9p&SMdfInYgcX9Ns-6P?ETNKpZ^=?BFo=9bdl#lQE zjJrYXaB7^R+?m210^ai4)?sUUi+(@_7?R2kdIdN&(M#dWtzYcVZ9SA%bG8!BK|Bn( zI8w~<#{#Jw=gs=pv3woyUxGEsS_kmnp{q{|lr3&#o+T^&<$+7N&pa_0ucCCjuYkS- zy#CqL?jeTm&6)?&rnGmRBpl@1$otO+f>Z(AXPW1$UQyB!W*qTaJz<5B@nE@qc97w3!-=ud6ECg1E@Fx2&{duXk$Ll`XQLvpWy+GIc@ z$;LK0J&6_Qe-eH;pAyA)ZK2t*v%46P?*T>Gj9?+$NXO863gP}1d^+%cy>zNs5F*JX!ycd@2tXc%h$GUHl;t1ZXeCn0=bWdEd_km36wq$6ofwE@wO=f(et_<0 z{Rh<7uKYgnKZGpouRKrV%UQ3jl0`}0>0@h&yw(7Hm^{c!sX2Tr9lVx=)F(W}f53Hr7_o?2)9y$#=(O z60v@s#+6EuN!{3VoGL4~_#bLR;Sbs4$G#npQt*DMYi)6CnMf!7yS4_2%HAO#nb0}p|(;JRG_|0l~ANG8b-e}{~yhPD5 zWJVJB@Py>ImO>4^&eD19Ur^^G)}vB4YC|?Nq&3a*NZH3 zr7J>rPrvlec}CAibbN{7KLmJ##bX{i@r}i{oaKl_GfeV7Woa5Uj0_IUO?Qp(yTLk! zjL=#5pqprBby!@g5wzg%*v3hF<2{c8u50?A!`m%FZ8H1Bg8twE=4{hMmi}jd-bIp5 zda!H?;q^H5ZF-Cfv1+0>(XZKRS$JAo0f65&tE4mtI&O886hW5xRZvu&;13un^x8Gg_G zo?29N+}KGK-6Y&e$!ui(E8^c9_&WXxZI=K6ujy*b`Q~AL4%# z=t*sJr`<(!3=@L7Rma*KGcQIf5Ky3X2YBc5tE&h}d-}6zVI?K|v-NAm-wwPrs$JR* zPRd|)K_N!Bp5|*v9B@G}NCa-#;O*<4MSMH)XWR)#V$ z`^jc=ljGkLYOOA% zZ#?qPD{qoWA1foDn7XQ#$?t)a?^)4ujJ?K^E*J?z_>A@67kEqI-@|VV{hPrTFl#s3 zkM6FnNHaWX*`t+7jak3h!5;lT9gZ*&F0}# zIqi&lnyv7o;g5!Gv@4rGih5|ZyP3(hXk-a~iaV6S3Nz5jhQ|WEJ5TUVrK#h>o)Xq| z4I4(&+}s(aY|kM)jYe%^FATSs__Ne(R?rqFmlDJuYMHBSra*8;;>Tg`1FlkD?P3e6&w7&#E400(@Z&%X`fZ;AdX)c$`KSiY$&(d?Gx zZZR6SIRRQF3G1};ite5x4I4&m$tsUjavImb{{RtNIlR&Bw8@(K4W?P{P114!G7QBC z4oLY}cI{hU67a{1bQ@cJA?MTJbbcj(tXLa7lX9^Kf%5)U;ktG1r={v*=He%U1}x~%w2kEk9TB7symTZcIO4qO%L`I^tDD7C z<+1jB-ZZ(-ymY&{Ht1LVF6#B6I~lt!Q3&Iw0DIS6d*B;LHD$E4 z)jU6`M>78X66N47w4AUqug;l0c8q%0()xG8jZW@JEbpH3&fUOk+d+Ddypy@Nv0;*Z!8M1b z$D#N(S!D3iTi8rwXs0r21{n(ssc$4JkUhucU5A5yE=PTR6@~S!#P7Vsj@NNK0I0@F zv{6Zn{ZFQ9ad-(;OP1FhYP9q^y<5WG4DhA2Ncu6;w-k!r^=HgaftDadv&vWwq@s-a z*EOi<`ge+FNc5}OH9Jd50}Gdn{yn7!<=QtZkN24tx_wKiBc7XaO?@xIGR1MN_;N^Y zrci_ImkeWR8y`6Xk`8zP6Y585^D27>E?N~M@_L@+BZ{XF-qV-OJ03lK;Ee*?NBbs| zbA9GaxQ$Xqi*L5xjD1f7+r4-R(DiLIU$eV=Ker~ADxb36%BYe>8)U_k#tul}p1mvI zqVcEOwHMQF^kjl1XO4Dh%vUOa;Iv>mvvKSVb^a=o!&;Yyq0l@Jbv=-c%!_qB+e+_| z_k6h<5p&!ep7q@vH!OLsd2_7WwT~6>-;6v(;v1W-8&kJUKS{VdUd9Pcq(xNZZjvSW z{V>3(^siW(#+pZjb*nr701ADUCNPNZVRvUEW-vDgRBo9B1wP&D&wMYYc=8D)E#qdh z^7nkd+HH@Qu~cGn_+q->6Z}^2wbz8>)3vuczOt$1%{t0XN|FK2b`CL;2I6|u$~}%M zx=BSw=V;#*DDU64bi-nv9vNW zbJcLeI3uw9Yv#DTO{eKP#lEKTCBzU*=C!P@LP$Lc7zF+XnXUY0zP{8N>p`)O$-^Cj zJV+28%az~{rA!xdcS(JeeXsD}#6J*p-7)M2n(YLv%$o=-rMlw?KO@q!{7v9L5J2*H z&TC{7FV50mIhFC-3^TMZ(!2-5pBermMPM&sz11dA3i)Oj<3axG>}>mVt|wIShm1T| zd}P)xXPHt$=##$+N2_oF{3?}OGn!Z_H+!9Kt*6~zYsq0XyyoUaki#fGL~dAh45f0| z^*o;4tESMrFX2sRPKx8ii#EJ0VkHIuD07n@MlwfIr19@mbWey{7Kx(GHm2A1*MO-_ zu=(jK4yvCp`H!h#k9ytHyh-7&h;}ymMv3-~D)#1QlI3srMQ9{HDl)S9u3d*G3Yb2% z(HY6DQRh~nQZC7uekk~HqIjE6wUpoUC3|;qVf7ym4Cvv@dt+x zY71*?Es$?5#Dp0fe|=qD*Kr-Q_-3~?rMmFt&Y^8}J6vp-+sKgo>e~)-Bm^*1*|F`% zO6QDzE!DJ(gtWM6?Hqv7%;IqxuRx`;SMVQN)Y6P=MO&Leb(t^Wwnfu#ps|z!c3m)H ztBejx4o^@3uOpHTQd_bv?-kk3T2%r}lkbY{CDZhnbp5x2;OZ#n<%s4Tykmv{j`<@$ zO2E3y1(Bi=DCBkIdgiif+8(7F*z5ESfBq4;<+s%J7rudj5y!w}Z*$Kdjw?%0)()|3 zrT~$b=PDN=N3UGhold6e)j}*;&H^hbk+a_&YHJ(kw2#PAi_a|NkLpEYqWl0M-JrZSJIl0a7_PoNaUsjzP#hLCEY!71L{LZzSGoF_4}~&P8(W zp=93*6ON*(YL2Ka4bSappUX>&G{TH!O9FlPsMK4`#1O={K%?az)teo}auJMVb~R|- z1Ur8B`?OfuAunN)B?JsE0qL}HRhrx^Vn-m7GNAf>YUzghMDs*#_Q8GARHlqN;By<>I&!-iWVC~TL z-6Fz0A~AoWyxMw91#JbLB_?9z==eWcS8Y{#Da>bKzI^9&0h^uQ;Dj@}X^tBQC*Z z?|{3M)N~@yYiT}-Z9R>XJ6TP4wkZ`Hv1Wa4B+?MwTL91Np36bzl63LM}_prb-gm*Pe@sCWSQ07(D2{u9z_6Ssr&_e zmEyf~$6hgtOKo-Zt5+Kq86__qkpaLFuHn70!TA{Cv~*8}ekhXJFEtH9-e@**?#3v9 z9m##8k4#ola$3b2!V&vS`oi<#FM%{IPkrHmFK=1ontL0QbsOg(2?SdaAJbqy=dF7k zrjg+v6#PE6)vk2iGXDTieabGR7ROT&pOpDeD3V0le~18c&3B1vo%a#33jNf|jKY0s@sb>g2NUs(SDVA;#3>5w#jX}B4WDi<3=1l(ATIqg`} zomjicilidfx_wQkYnmhx&2BXLt|GN__I=CtnODoug54xX|=7a3jZiMd#iISG<^J?rM39vwGKEpx5-jvE`?Z-uSrZ?vm-++*L2 z`fbmtuA@xV{7+>w9}ZsX`i+Q1C8dcaP)X#0Bzu78hQO|c4t1+Ba%-Wx;|+6E@kDZ1 zG^=H^D;yERAi17EN!ZP?b}8-9^Itc3ufzU4d&jYhM7Y!7hy-g$ksJqk|Bmiwlrt;LP_S(axa32yc{8^;-Ud6 z^HXYn4Lmh{t6bh*>(+^QB=V<@<|!@Yl}1)Y5*G`D*zM=}>&UHhH;HN4qw}7_Oz{$4 zL-sp))H{Cd(Op|U#eHkEUjz8);&EjDL?rN9kWz=syhMvGFXYN7LZDwcq5% z_WG(QML)ztl#pkkI3pvidtZe95$O7K%DSGomrfW+fw`kG`9y)v z2yTA^lV5(dx5NENUM`(%t$#a=%s$gRC680(IgBd<=)(uOtUnrfXTsW5g6X$VOK*C{ zHir5+8DI?9Cu)NrEJsCZ=aodBg({8ikBYRd2jhUUI!(2aiq=*ve%3qx0JY{bpUhS) zpA39+d2;uDE?e+nKO{DAtbl{Y70bsO{XlQ&UvUo$d^5SymiTzbQG)IjF4ogS6kD8g zg8N4q>{p(~xl6rM!`jS?27`U5v5q~B`=onjX71&}x6^@8@iC7>MILRBnZL0-M$@I{ zr=@FGR}m^AT*)*>bcp~9jgt<5dUon7sMCHG-gwUWF7-`Ww7)YY=G0tBcCQ#DGmw6! zzKF56)9)mbJ!0ERv}<)C441Rp$2K}=EK4yyn@7EMdPVPv^sP45c`W2@E-dBgYW`0R3h&N#14gTq(SY4GXMS=iZLOsqxK z@_nWj+4DEe7Uk*Cka6u^Q)l68&l$)DiFc`KLE=<~J7M-lmMneJj*qt|KR!-s^|YT9 zJR5d2-3wE=z48HBVSAfdrnd|+g4v0JzkDt@=aE>>gkGrI>$0_+ju%w$pNQ?XE8%CN zTwg zG&8cE3G%*Ekbdy=tl@@j-p2FHWTUxv!#@CgRTP(=B)HZzsBORuEu)>yv%3$unEb4j zCpcE?*w>&z@mIzF01jhq7hKXU>2iy*2-BPx7M!ojW&1}?9st@6pIzg<7VSOKnOgkUcEEctm}WXw3=PLr-!r|ZfePYS)`>X+Din3R={7`&@YpvJ%!LSJ`wVS+kh zyxQ-?9|`q1?e3N(ow#%J4|>rS`xwuh zTdpGx6hF4y*Uypu(wbJEt^WXIYx+jAy3MI%DE0~^h&Khn4qUI%d8v*9Dc#FMS>|=B zQ{+qLdM*C|gZwdKvT5*XaYGfRT*(U`v<7Z|ZG?pfxhIBraX6Y} zhG0PDFzUdl>R0ft??>^a%-1qYZ+v2g=3-Q87Lx!KkIR|&?p%9}4?$k2{vC@{u=_;b zBeCn$U~ULn8JE*fx)1d`qmU}KWb z?hlx9da=MC#4Db?_!{?mMa9j{&bYTtBHX^CHwkp{uG8fNMo%qx##^87bpz{dPr&i1 z9wNM*FQbn!c@aiKDE=>(%$W}z%M1#^)a^xvn?1LMZa&dxEKMBo%JI&y`G=z7DLl3v zj~?`1OG9{6m8_4H{86RB@ViE~*B8VZcA_p|+HIsN%Wzx$Vl+jiQpx?`i-Uuj#qbw| zY`lA@TU<-4&t+|M2zX$WdFls0EG|?jUBK{qbNEl=uY*!}y3Ppgb-c#}?;KXTgs{Tq zVxa9w%xZZZGNgO=u0v1wX{p;tnof *Wkn6uLTwts75-;4QxBVj**q1VzU+x~CT% z9;V82*`CYsF89T{K7_skI45MN z(QjmbW&@s?uA^9o!8V!=jlxZRr1+Vw{MD8VWHxU)^MG!du%WTLVEKJ&=|x9P{{XL< zGLz8xcl%G{4!eD6swvdrcx}XR&24NgqgYUqIaQ7@pq{3%^=bT1a?7dS>M`ExR?F<<%n7 z^|aG&SV&=Fi)kt9T^N)N-)_`l+coHZ0`X6Ryf~MSsN7#z-Gnfr+eD`9?%{&U>m*~` zl?T$kqOpU(UJr)n#3E_+Jubx+5nzkYhHo?i6$>*&hd2Zl80lUw;_r%RPz4-uyjouPHWh_wXu2KvEA2f5uhWEaN|Ce z@b8B%bjbBpS+vKIW0QPy#=cuS1G{s=%<80cUoU6^zM7NbMw??{aJm}LrRt24sk^&2 zSF!-V!m4(VG5zcwnKgv{O;hd)J`&Kf^jz=8}9zKZqjJ?cfDBP33u!I<`M~HWh$l-EsA=pL|uXTPR&&b!&ro z(to5}i9{;f$^QVBP!?hDjE`#SJ{x>Wk4c79pT(M8*_Y<~E~#TQij2Ji$YfAK?n;y2 z6)}f4?B1j&7%p88xco1r{50`)lP`zi`yRgHKi=KXcC)I>jIk3mjU-@p3V8hM=N}dP zC-AMNm8#jBRFdJ?Y;^*X&ynUD-(O9mGKMzA&t-!04@$?_E^s#cOlVm$gp! zJ|@&;lS12JA-c2jKX(ugc;}Cog(u#$G`|&IX%=SjJVy`OafCvRB!?Y$^eS`TkzaRs zgTX%z{8I(6i$#($06WM~$U2YV+md?ajeME$7vP?&;jgsnz7u=ZvQk*HW-h%3K^X_I zABAak(B2i4v|?KPP56Uz;U~4V(yj~NNRf-UV}0@xc=Ex?AmIJL0Q%J(3g6-ujpA!9 zbHtX{aoeP!O5MgD7X^OrmfM#&Ipt0dIL&zU{{Rs@Z>3qCB6)8kiH6r7X_z~D{LIG! ztdA7qSw0}tWeXpOt)jJvFj%H$jkdpR zq5=j_L|{Fu8B)11jF#uqzY*Kv?}>E@lURus`O!jLg?Q%N20X!Xzv~aN+`g6b73aa- zXI1el=%V&Ht;fwB<1mnj&pBa`bB|2YUwFRTNru`RO+)Q+#sdYmxRA!IIOlQC<T#JYF(np;Y@Zoe#(TPO{IfDn>fZ@xJ+)GTbJCDg0okJ($o(a&cs)!XW2xtV4L z7;%okZDY?&*Ra}rCHQBfL2&Zuejh^+;9W|RIZ@Q%*?GsHKU%e?Xr3XPN|N60>h8!$ zNHN)1+&d;mIB69AdvWPp`}`nLI%-;unc^$^REec&H%6@Nzr+cOKmq>mmZ$4mYtYHc z?^b!Ik9B_n=p}8uFX6owS!Eb0<$2OG5AMev{IAps@%eOZPsSJPX{YEqCA-}4q}u(R zV!-6#@z2x~=qv5L2gIHV@D7&p>zY=hWfZx1-|Y6Haz`MCXiGu_Vvx@W|?Qwr(7fJCA#*mRHSt6SuW^g|CRmWb0?KrPrKN7T+(r&a3b*?QT45cDX zH_y28^Yfyse5;&tNyx7byZC8;;@jA-JQ;IwarUQ@Nua$*t&tR*s>Z7;vmAB(+JQxoPl2#F57w+ODr1ouoM57`Q}pY0tB(B+g!;{8#ZYFQ;GlNHmRVzdeY0$pwkNwOAQI3poFeqoSK z)7Jp>;;3l1mN)(uFXG7I)Acbn;IKp_kpBR*?60%~+*Q3t#{Lt!v`r&Zn&xXb%Bc`E zP{=svYZPKL+yc4pT@k4itc=`Q<{l~dYvG$K(QT>tvikE!|0QJrUtH=KUt2OM}g@?jTVl6TB;>K8lY`3~#t^)Gq z{IuEw4nrAoPw>|d;`?8Q^IXcBR-1QXW81R%@X;~uKw{wgZ9Mg*?Yki4Jv8_$;bxa2 zjR#77K};*?0+0gVIGAmtYNVHp)h_EbDS3*b2nI6%IBaRka zd)MZT=Zf|HKT<1asmXNFF39AO3+#{4LC8_`#cb)GJNTWb+%3%VUf)|G&jFYKJB`O} zYZ|NV5h^Y0&(hdDTd3O`SS|Hk9q$>-f2F~_%uVuy-@9yh9RcIouXv-w`u@1wDrcIph5cshHcFw$n3#~BP>bDAEkP(r|}=eI>b@kUF)}S+(e;6Nf(~Khx)vJ zMyf9FnVC+D`z-pBdu>-o)8^8DeLkIXq`aDzp!X_$wqhW9c6MLJzG&C{LcSB!o(S}- zLN3Wzr%jU>ar{FC$m7&~4SBAu;tz^?j9E9+-P#|!<+qls0qd~iKd7Y8Ej}jd?$K$m z$t00tZw{f3wfj2w>rK-RqBSX7PXu!#?LZjd60TJKmFeFGJZbC*}f1*nk7mB-gBH{{R&HQ>|*xZ622$&XTRRX4Efi-r_c4$%-VBR>1cB zs=u^n2Dwinz6w)sn`C@O-v_=TX~@?aZNlBdfWXk7HYaI>8oj| zuWZ|9m_)Hi3F*ly&F{tqewb^r=qsk(>KDy%_D>`-h@sgbEBpaSP;z@=ax3C55%~Vr z%Kre**R(ddxOehx?k*yh7ia1lWl)(;agbr^8Qg5!bq+ii1~cI!F<4fgeha~UKgr-7V(w7td}!s$4#@}m4&Vf zuw3zhCfpBVz*iH|dx-W^zOrZ4UIqAX;Ehw^^{0$R%Idj|#(P`p%`M z=~nBpQ8e3YXh;BYxg=(k5AOV+^{)Zce08cD7_T+^8=X-jO^Yj>MsRx~?IC>zYnk?z zQtGR4@EBM1z@fDal4~H(aEiM9MR+#_{gmm*JeWZ^};=C)x zTKxJQ%$9aBwAXSzU5c-g!yEj0y|3aPzu`?I!*+fgxYeHbQqxhDUc~fziN!};6cz4A=5aP4)tu$FLQCR-+ zJ+F-R`@Dqz0vQibU?^~bVF$lTt03e^l)hM$m!Yg!b=wBDSb*5_e)9Y3S&cvO*bg=AX2hs3L z06GJoYWLp{{7LwAVXZ@bqxo8%qCg?#M@Es`m&3}@tUiNjC-JWk^X;{b8RFL|Y8QH#N-&p0?vEUN zOnV}e>)I5;+%R~eO>+=Smu3PC+8*dY6@!hP0K5e?}kv$0cI(<1c?SBq@S>U}JQZnD)MfNEW z`F8hBI9R1P`I!qx8xhmy4m;wsQIhyfr%o}A`kvLMUg`Qg$)sx5Hn3`lBUWV0u(}KY z?D2*rxF-bX+nSHYUM!Qr*0Ne@vD)e~-AE6YZ)YKb9lv;nEr8tt7|1wjpzNm^xHL5o?ZFj`F{{V{Z>~8eftnR`C3ZPXD9ybgFk+|o9j;E-mz1NE&)FPJ3 z$j5rIGUb_WE>T8f*x^Rh9n@gAaBH8^d=cX>7HiS{y7JmHJb`kzDliX4;O-0bueh{J zNWLGc`FGwQv{$!CS}!e_l7sKC^Vyh_$@xI%rEKEtOq$srDfm~w9wpax8@aW;HqOE* zt<*%6)Wxu3VlL&lc`$Q~ zkapsu+uPk|OmK~>-1-Am_{%I-Z6BOV`Di1F&0<~a7P5S+x$trFjjNB! zqE(w->NbWFE8-{A^%m6bDW}?5Bvcii&R}(tdc~>X4ui4w}G4x2X4NV?A{CbAK|@IQ=Pm+soZI{wufx0EZSEm z>;A0=xhLsUC`#8Hs#EwIJmbVa8Yb7_xP`RH7D=6%BsmO$y6sSWuzmKE?_9@+_3s;M z7b#(;Y7*Efz}fru^H(4A%oBn5SJLV5Bf@iQthy}I-dN5=akRcf&Uf@IA>1M-AH)Fz zwR;bRJ|98htJyRNVbbju1P;byg5>l&nX>FXfgP%$MYLk-Q;PRd@?V3z6XUCCr@H$b zg6XCXE~mkT&}4l1#F+FM1Jqa39vRWRM3PxtUTDv%-lGunTHLg827H2W=wlpkaMjfK z&%{>RHG~mKJTDAVDqJN}XU*-|*|8ZjV=lzgLN zh1r(q1~O}5TIN_EF08@^BY;jyMr%|`dJp-MsHa!Ev zzq40T}Hmxq=(?llh(-x2$mV+m~oE-{yB+&0wDBmxIsab0|V9Pt!3 zNhYa$(Oyd!V{LDCv%wzxAC;9ORseN7N8?oRQj)Wo&g*My+`Z$SA4+=&wEYrT?Iw83 z&1%UUQ99=%oPr5Gat*5nik)2arFq$%Z8(AbhE`7U1OVB=@fNFA4Z^ zYriL1*4i2Om6lb^+q2O|$lT}DE;H>*AN(QqF{P`;`NI6PkloAXSF!t+m1)~R8>!bx@DJ$wexA>ZD!&vJxDUk z63HgTISK$&U=?6!>^2%AzdqfUC&;Q4j606%I9mL$)HbdZk{f=d&hA5;~S%l zY$Z@6qBU>3$Oj`QkZa4lTcc>Q>hF6Egm$`MT*VZV12eOKdA5z%?SL?SYtp<^qIhcm z08zQ{{Q9TaVus<88=I)5wk#L!vwWnkM>r<5^gjjY)^Nvjtxe(WN%6MY2h^q#IbJuI z!Ekr=##DbQ#+5|3J5-YQqGxy$;k}25>}~ZuJtVe}%41tpong0>padT>;mCF*<7#v5 zUV|^g-DYUiSm~%HCP=)vZV#A_poYsf(0hz870CFr;x~x23u`|PXc~5xZ6%D}WvN?5 zl%p`^;${SAJu%Poub{pdX+ISFL8n@4{wDD;u(-9kj_qI;@vQO)*<8k|*hNw}Cj^Z2 zHP)$N>Ltvb{Z1;?t4H6uvGPu@q4?)P*6sBebo(1?OJagmzqVf`N)ybAFd2#KyOurc z&ORn;(?cZJm)3CItjwXB*;WACK>Mf{2t5D>zV7kvy*JwROU*07*312&a?{8riEmi}gAQD8{090D+k6++++7qvsB%Os-izT>Kn zC35rBR(?mxR+oMc(AGU#%_N9lMhdOtmy$AifB;@S@%YzeYw;^i()7u!?yV(hXW=J; zVw;fiIKk*edw+{OGw|2LT7K(09XC+9-UKo{QmorCm3$sC>64S`UM1qaGX6W5Zg1@s zRgq*ZIofs;fDDsZWJ#5v^`c4y9G6uJ#>ab5G{{WpL?AkoXDpa1}^Sd6Ez*=8F zhb5Lx8&Tc9RAT{*zINvape@SBFh?W^;H$A21Pq+x*RiiZ@UO%By?;-ReLqpKn&skYW3)F)E*o!E zD%(P_>==yp&2!q7_l!ItshfRL!&0|_@~s^HVhnfM0Sd$E!LC;3W#s|RM9C~lDc>N|n4SbB#i z8TL4?nq0fd*u|!vx|tXDQ^z!M+e##2GQ=+f+N~w_wrzgPYpeMPc-UNp`Vc>@cHSNE zM~bD@7RoETSSBy!>-I6-X{{q1 zTEZY{OEKK9IE`O}z{wy1#w(?`@GiBlT>-5}6{M`AVhbXySJ5ywkEa5r)I2Ar_*UFo zUrjXegeEvHqL3n!lkyd9qn~VNwH0W&t1qAY2D+KY5gY1bU0LbAC%3pw7fQ3y4Xj(y z171xe<2>QXk#aNqTSuonSDstwekw95n7`5Be9D6e*awlEAI`h@TE*FJaP=dfYU97KZQ9xsX?iYh z9{}6Lju?~MEC|W=uKxf>@D8hU5Wj;-oT7zO6t@c*R$-m(oun_h8-44lr8p&foRhWg zPhf$Gwh%g8zC>!s%O+1ky)pHy{aZ-!CZ}>N?Vs%zEWs8LxXSD}0|PlV(L=3keixKQ zr)w7T>Pf)2wcB!ILyYEiI~N_mCZn_Xu&H>*U6SMNB0vo2cS#d32Wcba{3{7icjijv zQ&tEXt{^kbWYc8T+ZI{yH~O*$5VZ#4yhbG9(dGx!YRvA^Lh@uM?0+HRy{kjLgH z@vp4(T^Ge(4c4X>y38uC7+Z#tz+Hvg)fB0Ir>O;f>bAY&FB0ELBEN)my-sAvhV3n0 zCdc=-Ba@$@6~&0m@$~ER(!;64x}Bfg(qH*8aKK@u4rbDRpQ-Wx0NcDlaW|hFcMT?U zxGNKp+z=~q_5T1GtZ|!xBQFYuWKsIySE!9U#j=wor=`mZ%H*ktIbIJVX~`d%uA52l z#*3)$PZL2sv|)0EA(}=EJ$8eP^UZq?70VuJue)E%^f_fobg|>MULx@nOuubt*-sc8 zxA<3e2Cy$-D{~U413Umf$*m1b!af?XiKex=zHo;jWVT?7lg3!G;C*piMa{c{3Atzx z9t2|}@y9iA#Pe#uBN=+9{nq| z(R?4Oc#Z{a2T`)Vn~?U;B1bBb>ar*}Bb_} z8-M~q)DYZP0pXIGeacT94GhdS9sI5jUI?#KzR)!YbkFT}(I%S6fIRrn!vG}X@8v@t z$Ad$}#c0X;t9=hS(=IO>N4>RHxQ5yH$sCW%2H@}yAk@B0qf-|#+U>W0nTM8gqpujj z;;>|!T^EzCi8R)tUzEiV>^o(7AbQtP7KP)>XanEsv7&4eqDtmj8$AZV8MF1pIbsss zjbWwH9R9U^Zu6|xPNmhqc&uIf5^7xYSOU-TPuvcv3PmnSvva19jemSTvJX5d7YaQo?H7!Q!8<_Vi%YKC8Bz(}X zm{gDMlb>#t^E|SW_mT8)l)AE?#D4ESM4J*p0yAl{_}47rln^ zDU1NP^5T|lp>jcR5r*D5tSMi_k;>D~Ad+S{#KGiXf8b%UPSy3liFVdT$*x`-Y1jQ) zNYO???YHDp{Ho&zeI!Jr`yO|$U0rLEneL;sRwVHR3kEQI1yvl^IQmgX{nKw&7{`3# zw&IspwUo_wZRUaZyurMGJXX2Zv>WChYtz2RDuIW#+_+$V_A+~R1XrUOxT_dtN+O&wIe{qZ9f&Tz^rBt){ zbK!eio4c($Qf)%YFb9`=n;DLM6y`@d_bpt9c*_12GYu zpE*)Alv&+e8< zLZbQrgKj?s#cTLa$37#_rHO4dYoD_x%J5En*uwO}lenn*W9dV3YUzo#)`z7(!+!)p zsDEcRu?LwPhBnBR@56^E|;QL@*pS4Pxy*wOu)ox$xQ|#f>UtiUgvTP@ z$7BY20=FB$8O}n2Y0E`xmg2WQe!bH5Nv{l6a$YLC?TJ}IY?FX9fHUn~lztD^w5v;f zRfeV%g12jN3kbt>9T8Wa$8pEjy_#vX&k4aK(_UEW7gtM*dn*W2QH~`itdbcK5yxPv z-u zTxwR<^Z07w;#I_IwsOj11ax5lM^V8D)n znm{q%rF1?&_$#aU%SgApy1LZ#i-?br4VAx?(K0qcc6Yi+&}XO;laAf1>0kIm{Cy>? zO&#g7Tn2WMe5TI3cBn#Fc4lMrub4g{FUG42*1OkijsA&hq3!0=oJ56Go!@AU(WPzN zatJ|=o#}g6HLFLNPIad}9=>OXX`cjqUEry24gUazpT!L%jT)(09vF7?VDV44Cxe5y zW4&@Z*M~LxTdSKd6!=e0@Z?hhMaAX3;c?UmT{48@xd$E1V0h!k3#e<0cdK9OHn#{i zB5Bt#?M3U4EjE=o>y{?3$D{m2@m`49o~Nm5T9%7#5qM%ZZ+1(m`A|ZFL7a|3#yaM% z%2B#KXgQ{w+Bh36b6D_Zqja7XyK8itDnu>Y>yebr|EWE7Y|wh}s^rq|ISx z;M;pwzC#Vo?xS&WaVT~ivPfAD?DO}&ppGlfqVV^PE+&`knq}0E+$1R;$4vGp*lgp_ z5t_le(k?7+<4r=s@nj@3B(db@xY`&Tf53tIQoWI^p&3Z*JT<3i?k@cA5W{ZqD?+yL z>84qn9;F?*&trlGdfXasgmsMv`zqT|w-=JzqQUmNC}IHT<|1hKY?F+9;jlZ7wc%E< z>zc%?rRf@Zwr%9c9fT73^5?Ey+20uc9r&)(LW5G$V*4HB7KwP$Vk4=+a%C=u1%Gvz z`RI4&@T?`x(ASn0)sR|fnsuI`_FMbGB1DXX%4n~ng!CB*C0>1S57NB`-^2P;1N&0v zQ+6>j?uI)_En*(~=ZK=V2ls}13g~rB2ggH3wbymsGsCH+O5sd)wob0+`>gRIuq1!A zis|&5-A}|8M?>&rH(FF>f=J14mEm}1TkUmLfkCBZ11QnZ`tV{A8SbA)x08f(z2{D z%XqDEb8M;iaM2B;9Y6`TyzE6fOIh5*nh)XB=sZL42g4pT(j>gnH3@BXtM*wJQJ%^4 z`y;pp%Ep%Lj0oc%V*P99Ulx1{@wda7;*(U?pp7OVFWI4xyzyjY@&W<>00QQ|^U!ru zX`o!q9n^aCmPiSGM{(MUI2i#{4?qx{^)*Y!HT*lP?=Hw!h+48r{i6|g{t^_ zRMh6VSSDB@Mp>^Xvo_Yu0N{i`#I{EV8TGEx!Qd(KHgd9y>Cm~Q}^3CYhyjDw=Iu9 zyVf+=tzS@%$H;j@BHi219n-R$?b!p{0H+>~t?yhek)rDQ#+`XSfZCXy<;zKSh+vcs zK4B_IOJj@l92D;A&Y91fdt)tdF zHR9WO>=-DT#^!j#qn<|Cv$TftU$-W<@9{tX^$d->;BqO`q^>EYe?fn}F|)W=Z3XV$yT zD@E|^vbLi7?bZFmlOnUr3m8~;46F(c-!B#C`mc%YG@U|ebxme(E+-)}!t67444Gfg zkzSQ~<6%$WOXgt-s*g*Z4zr~Tsn+vaUk%yn7kEZna)C)Fk+jAD&!NxbUbCclde-ks zw}VffTT7*lBf6RyV=*{h$%w-z9r8Yv@s-!a?K*4b2Hwun+_`5mz-DOppV{{VDn+P;eih4wK{TAcN2&Avm8@przy|82@U9JcMKSnJ(S??Ox$Ua$X+Q zG`|vft+lzY^#1@8*sPBl+Fx0VSeW!A26rqEZNML4TbjMsiu4~6s(5R|o)Pfe6EJ9{ zEor*peYZLe4`M;DMOLd8?G^W#^2zHWhP!R4Slq>@7lE}2im|(v0Bs^9<7u2cON??z z&!;uwz9+wxyil=QYNu0JHpePx(La`7Jnjh2N7cIauVMJZbMX&Zw6(NbIGH4gVv!%>q!LdP_!=e>S_#jWaX0R2D$zoQ`1ZD)$|P&UszA=OFmv?PFm zUVWryfPAyd=ewE_hF45+< z)dY5CC<1_d!SX8+&p;T1`R2Qw2SE6luHM_)_*xq~l7q=u;)J*zx4Sc_QSL~ld}8=d z@ejhD8ycPc>Px6A5p!s^Z!AL{3S7V%A^5jGv^+|2CDP@RS3GLdOS0Ei^4n3=UrN1L zS?!%vNVgJ#2bbldhGuN=LC>+T6xTdEt?7ECwzEqCXvq1=W!_IGDKQc>hZ}Xyrb|^%l`n5)N@PJ>xLa} zb5`(a+0LN@NiOx^J`{j?`Ej0pyjQPS#il`QVX)Dg68`Z-4zA0OSK1s8QJhyBr(F0Z z_Uu}%z0^{=k__^rLFO*Qa60 z_pB>oAsZ>XdYYzAR*UCpLx=sH3U{QHgIezgAp4%}$gS1^}`=KkOUKG4oV zEXStRQcvRC*No5NeQmA{q%Uy(UPPF8enG*&TwqsUq-)wNS9aoLzPH++I0r8BdhKEc z-1g(^TXK@=>7n$k_kk{T=xp^3ei;q4ZN58juWpwd@tF}$%y!Qn^=kbaPSetHc@49p zl(!H{McWcU*v`PK^ZY~{it$*yeXZL<)~sL1$U8^MK?ftbKU^B>G~bBYee0_DqTWY> zA{ipKNcNq--Y07j`14&fr4+2sF1;r9DtO&|NhRd^rjoG3a3fPBP;HUi=N$s!-1TfI zuN;?A@vVzJ)#SGpOyur)qVjhE*c>7JvTN(_4SYrTU1R5oH$?Xwho0Ov&t*HC`c)l! z;s%DcPZo)J{<+Tgx`%!j)mAqvn(IytXwC@Eq#d~rk?nj_50@%xFg@Iouq!xrEQ$_F zg@0epv9-St3!AlFE6k1sP<*+zu?^n`u0FN&-ISjSuEWc#&-SaCl=+V(ph)xn&&W#s zax2a?{U_o5o#I~TsScq5Y(2Al+G5ObP;>$k^$K`5TN~{ol$Am13%H95AI*N|S%PpvzPia~* zI9X+3_4FpOlD5ZOW}3OlNv7&r!3=$i0$m`JHeJZrNJ>ZLbx0Vk;4nI*_lK7`k zwQ*?-X~EmGX>4cTHPj}P9Oxz1B1J3%06KK^%}+C0GkD8G$fvcLA9Jv8Q=F5Ew`Ren zSmQv&yESiXnr(%)>22Z)e}`!}8T~7fif6Zz%v^>aboS1B)kWPJ#$As>w9@ZqLL-g# z5(5yVfPFL5^{-sgJRxs%VTSS|iG>m|Ofg@k8wc~R4z=+;<+&0Qv4#j}$ph0kQZxA1 zqUnA+(PDvQzqy`!h68eKB}P7{AFXFTV4S4K_?N=EJQrJZ=b2+HK@xzPkvR(Kp!=St8rlZ<-3B z&UsVCcOMI;@STB4^)Ms}k81V+LaSi67pst^18xYreB$2QvNWqpc8L$UaoY%|07TY3$b@g7Z_plF}!JC@%0GEM#+#TYSqf9CX22`OjC?tnW0)p@ul4QGp_) zgh&{7DU2V(HND~8cK+5BywmTHPaBBL1a*sm81dWFni_W0O&_HiFNc!m8#{YFD$;mu zm7{xhw0ozK^Y`7FFDY2`7;O8FmBje24}Njkf=O}qjoF*0HFPAFKuSDIa`x^@ou9@ z$pkEjs`<$N<}+TB+Rumgn_YHWb1zhNZK)y0Tsm-lv0o=$d}@y7-Z`VtwA7EyAyhrU zxLD79>cK(w!(zQtQ23qT$ME%)&WUGrE~9C26piLaB!=M-e8y1CxT_zR1cQN`bCJ~= z&3s6iLH0g^@W+X~0AhUw6GXGr(HuuC*Q(P_`T26F$louZT;tZfo5uRStD>})GkA*K zu4LOSzt|D3EcdB7f<|Di8!+sA&b>u=Ca0`v9wODpiSMkfA#LGW%F^5WI05aoN}T@y zdnEf;u6QTJKMt=o%ZoRo-k9xsJ8HmapsblxH;A7IWl}Jh1Zd@q1`^@xx zJH!{VczRiE(mM%a+xDp}+XQ-q+&A;>R{Rm;tv_1SOgfgSa3YPo)Z3WQN~Z zmKm+v1)NB#z<+SuEi1M@aA6oIJ!#!5cZ4%;0w3Z>`TiYno648&CWjv`I zxBCm%o@>VSFA;cy!*N?Lhc4`OZ7qR#R2Qp5#O0g~nR0UO2p1b~0?OyHh!{bMT zwQ1i#)_h5Cq0bbg2Gt!B0EZ;vP32#vMjxEwzc?n-JX7K8i@k4NvD6yriSwFfklW0Q z!{$KTj)Mx_4R&7&?X7iR71~RGYM*0igFFcww=xm;fk+|}GpOSvpevRO%PATaD+7AuH= zWzS5VxUVbFz7PB?*N^sgv!&mg>)DxMoi1d{=lilDDC4OmzgqS`1N=+B@dfqOrlj$~ ze2b4I+DmgVUKpnGKr83~_BG3R*G~ACtLhgTpMtzab)%vM4`X_&ZCs8wB+#ERLmyC1 zeJgoUn_kkII8>VVCeGs1;Ae$AH{rz6^!+aq*hsAu@?B;^{X;nnxdZSO%6QY^wfBl6 zMiXCJO$w=RCSN)S$D)Z8kIamAsdUdB_}+abEIevXQG(oF{ip2~i`abfZDr4+kH)3G z@iwhu>ejMHs#_2O3oWn5eaCj+`{dUhdafIxs#P1jSp}!VZ;0=uEv2osq=hh2;qeQ3 zcmQP%LHeAU!Ph<(d_mIWj{IsD5y}wx(OAyu2JUgVMw`w@eWtb}lUp7jhHW+Obh92A zp^|gBBMwVKNo;e$C_%4Qi%ivo(cIkY6I@2fBoV_Sp>PK~v5fQB1*)YlXucL_I&pGxqJ<7vMU^dzuRDY&zq>82A)A^A&Z%8_I}3WB1&55u1lJ{QkwZ2U!as94*~ zBwsq}1xsQdIr)MYVn?=qmD_wx&~(jC>ek~}w-P{OC6@L%uz>W;fgGy$A&9P9PWXG_ zy-L>K{uREzWovr_6}pNxj_MQy@*_zXc5&AvS4?9Kx|z!q+PgV@8*78k5!n&GA z046kMwK)vj@#adXay>!o(>2cPe-rf?URw_hYS&+GwFS0FiV?Q)w_rq3&!bn;J|FOg zo#8nf!|>`Bcb6A?Hh!_Z-3%m zVzs%16cAn8v-!#g08R@eVE+KLYL27ud%@a^wX6|cn|MrtA8aAF9!>#|dk?8K2ZTN! z>N+*^$z`ZO`eb8dk;!f%bAkLIGNEsCiirEVBTBfMQ&+a8kB>ZStwANL_<3#Y!^&fo z${At|qmktzBQYnTC-WTFb>RO16r|C`W#WB0e;`B|t{{E3ppJfYV0PsH0JKQ2nSLT( zc;I-Bdk+lh(cD1`DQTpR9p*3x{PBm(Q=eHIK9!w)`$0+Jn-s8ZD$Xrl2%0}UODPxhp}zcJeCS`*wfATm!Ih{2PuT=m+% zWS|fD7vL-C?}}d+4VBzW;LSrqztdTYG_gv_F$0|JX&)=;ki6G`&GBM1^XxQ5wYI&P zi#)>3E@y0xLTAj!`86tCj+!a*>~r^?AHIXb1#LW29mks|%*MpR>&GW}R#TD2Fh2_B zZgqWj z79;qE=*e97%O9nA&a0(-V%6>ExWBYSfy&6XsQ4teLmAjQb-^O7PDLv{8S`bfnXX>l zUt2?>tSUw@$7H8>5N7P<=;E z)$I5B=8YT?Ti*CG`ukQ${F}LM5EUJ`S82c}uHm=Zv6o2j#nhr}JtpHrk#Ni+mR2Lz zAY>f<1#2nIjdJxkNp)RQOLvDvDKbc*8|;fBMK%sb^mZlr=jP|wRE^?^9vB|yMz(@z zN%LGhkV&4LDoCVbu^9KSeY8&pu=`cRnV}JF%KV4SQPH804CnjHyXjfhkKmYY7g5wK z^=N!N#lF!cy{M56J4RMD$31e~dK#a3?hbKX4-~rAd{g2nR@X^uxz$tyZ@68s1ECC4 zDi5GPjdT}Y7Wkv6X~_(F2BRg(;UsuilNcR=8;Ks6BE1`3{h&Mv;ns^s_(`CmX^9RV z_TV&Eo_={P^I^yP-=}VKO!&#JYFBZ~sty#FMKgV z7B@0QcWri#tV>5UO}S5@1aVnsMDaYA0@ba6k%&+N5sz{`y=(97GvWlA{kq%SYL;T@ z6ue|M#NUsUO8#ib^&1UVYt3)NAL%w<*=)BYJ@lG&*V-CzIU!b18ZUCHY4g6QpKB}H z$HF?bhl~6veI=FjDJIoj*aCR)Ks*uC(D$yZz`i5Xu60N(q=l?*UBa)~P#x^tU;w*@ ze!q=-SHvG3=-we{?ex70+S)k(0MwW?UgiVX0r+ytu;k$@Ibzlip&A>iAqJt{`g zq`%i7%9MjrFejHEsDIt$`vG5_8n26daSSO9jIDcWtH72hff)Y)WgU(`5No9HH;w)x z>eD!|({%fR0ox-@8D>zucBXL6icLrrIK9tP_=E7X#=j9S8FY;uEK=Q$>18V#2*!8~ zo^jmtuM5=v6Ikd0UsSzo=UfYcXjVAmK7vxR1}7ig8Lq3u-xqvhLunWHGuvCM5^XSG zOq2X*HslV#=M}@BiJIuPYZz_qE+F0JW?NO5uh6hKsFJAu6SE8Kqx?m4ywN-l@QP~& zlJ0G3E`NmsTQVLyx!6GZEp-+i4)`WKxbC#gY22^O!%>F?y+9CfJ+e=|e7maavfteO zrJO||;0V-4fMk<}7#&S6nc~ex!bINRXhd+>Vtadn2>k0AVe7S|?0OKXgTA!?02B11 z!oL9i62NS=8*42}E4luAaTC4Ek~$Hx7X2|^yL;e0AHxeWYStIBDvibDypdIj-c%{> zQS@F#Ql(k-INljbS5HIq(!<2M^p5SLX%nki~}1S=;Uw&MhQbgtL_ z8tdZ(k-S=jwo;^nYlC4H8|pES(zT~bclX#l6-)cE{7&y%)c!YE>CGpLbUj|;$<#DS zExfX^8Tov`@tE*Cf|xbJYJU|xOLJ}gly%uO#gYw^K>BPj1OudK(46i3x$Rqef9+qd z#}Ai#p=h&6Mm)u{jw}zLLNo7FZT>TOCt1{Cx$)nF?6sR{oXBGnG)~TXWq=r$z!!`pU;0P-2wg>VUi_p$BK== zX-6j9wUw>&Ta{?#xVKa&!=oyzu-rR0-uI#C^j9^ zpXNlfziDJ}dSTT_>05dS!S9Er$wfrc59<>Hj*fWk=F?c3KI2tJ~^ zAgR6Gj3(+Wk>PsZ!TlilR=yUo)T2R-QMy-zqpb^aR(D!|=o65!XMmY`lru zckP#l3R&+Rs=Q z2Hq|q14@kBr=sK{0h8+4^{Kuhd_nQm^{l#Hul|RSs~W)GNPk`1PH=sz7|M*Fx|y`0 zQXdmf(VrFR-Z$5@%V{k&D_^tA7y)-$gDdq1dow5>f|FPeq5B z0><#$+r%-zV4chPh8Y> zODMGF(oLK($NsK4=DwCfNAbB)3X$Jxinpf1PWv5hov(Nb!@<_KGiqKLyVltnLj~%? z4V|MA@~B+A(j4_6LjM3d^Xnhld&FKEg7V!?opX8$2xQaL$8N|vqZrSaMn32axbIQu zKMOo@e6IRdf-fhPf!%fXHH-t$eEW)zUY_;XzwFWDi#Cs2@ivE~S;Hd&scR^C9FvR$ zLA8#1ElgUveIvV7%U;!`|bGONDaNHguteBI-l zkBjqNN1{EG+pUrxE)70rl1UWv<`ijKRwQ@81JGAGQCmpYmCK>`Pl!BW;kook()#{1 zv5r$J{iRA>O6qa~xKOG+0KxaJ660O?d*gZ9%fuI#i4@paF*1{H9y!B0GXmbE^sj_2 zw6BXA)ua~sg6hp_ZMed>lFDO%n_Wg$I3qYMEP+&G+|%}w zzKo?pDP5mec%NAKS)ypSJ{z&twNo^C5FhOZk~5BgpjJRXD*0<(@lCWLw1^VpTeKxX zyD~gdXZxU@fM*;IYo64;9_qRz%l7SF)!R5^ig76i(`x+RlGjt=tq$i?VQpb zG;zFyk^atOC-S0IThLL0k5g+#)x0aeLjKrz;pvvxL3K-Jg+~=ZAc1 zuO-FhtC5qrmy%D@Is7Y=w=H8KW(d#DM1yt@<6od&DNERX*Q;vQnsK+1Mr9Uv3HEq@ z*;Bl+9)#}Ct#|>m@DGXaip^0O4Gs@)bIa;S~)8wVVE9CaSqt<8VoVYR&ppv~q+K`dpJSTE6)Mt>^6m*K~WB2P3+ z4#CuyJbs)}?B7D0gF0KiMmL4AEHOzY31-?Dk<(~jlzw@wjW$WHZKay`P(vJ1?o^8a zmi5T*UU_Zs)5N#83lvk^v$+5hDIjOL!jq4}yWK0`kBlR`RJhdaA_ETFrzp4wzEm82 zMGh@!V<%63V^2u%{{W74-9`y)BAOe13@;;qNF7KA=4C#>iuwz~zY4q&a~!|$ni(}M zMe@cdTo(=9LcY=f`d1APfj%I{B%ae&)8=UUx=PZK{Xa^;PlulrwS7bEmip;~&(EDS zt@d~m>xRkW(M@X{G)sOcox&FeoFbws&n^e`c1+^uk7 zMK7MGXbb`Tc=fM2o5UU<)FqI$)b7%K?oJMC=>Gr){>|Pr@r=@HI?n4zf!^~vVH-Y; z(Eb^(WYhluXPp~MxPr#YOdYz zBMf-*Vlqk3pi#Ki{nvtgP#x{!vcE7$N6j=Q68`{D*f{p-UvNYFGWgc+;pKw%%tlWE zWtDI}hn6w<()hpOeb-w4Shx6=h8IK2ix5IJ<_frk41nz%SexQ6^Sh& zWKu9#l6r&BO0`BSQ%~&|EfY8|3&-%&!-+PTZY`|Z0tb+nvcoGfb>7j+uBWa+&!H9S z5*-re858{-^xLws&Pa0qaTOPwX4ULNLoAr&KTqP zNBh8iYrPQbS64B~b$@Lt&VaU*jAo7vxj5Y!V5A&%2M4t(vWn0L0HuXe8Czi#qE%sOoT9G21HA&XuWAQ8%sl0{}_ z>cy}=wZE!p9xCv)*#7{8nr&e&ZX(+q(z+XH_KYg3#_zM!8vymqc6Zv`*HfvAYkfZT zR0a~5*q}V{Nnoent$25j?mT6t$rYTQBDqGrQr7ZJL&mC4J9aKyp2GkN=W^yU=WkYd zPm260@j~-bisfdqx3i9KCw%u?QOF>IRgyEe2L#{(LB@Oc7`5;v+W41C@Z?uI>@XOG z-iduIncM(oXiOwwk2v0O-ns2x!oL;Lz{I+Soqm@J0!+|D_M8quQ-oyzo}lD)uA{*| zFYzXr>7kq0TzBzFOM`mM(Ri&H!jVEQitaJx&HtP=dVU{mEOm(hK)ER()-VO z@Yjmt)UA_Eyu6xwaW?yiqLCMAf0bCf;~zn|jB$$T&CkP~BGtd)H?sc#O?k5w&ASO_ zk|0P2V<(mdIQjQv^Ik7);mv0EPd9e9DupHWe2zYF2;?ew=A&ZGUK zW|5fHyw5Lu!y{@h%yt3%NAbmZ#;4$0y>e?sxL9iU%0-P5(};bs5{rt*{(94`?ZWcpxZ-kjbBT>`}4TorS0`%s18A5cyR zs(u;xe`TXRl3Oj$i7i?sc9Pj+F^40dji%g4?lF!(3j1?O@W+SlbUiW!6US^68KJm@ zLo8X~je{$YIuXTltPJ&0dK}ep^y##b`C;PiV_2V9`#aA&yeDc&8#&kqOl1C5>wgUV zVdD0d-%8c>-9;>m;|$JmkTZjmjPcv>ue9|qg}mW zcACG5d`se;V&6#7bi13TfbMDT$bu*lMht>gDD2qB@f`XdmFzly!KJ|r%Uv)l~# zdsRwFD{;e1x$*}9{#C%~J~h*Hy(VibYj5nmIEFE%qjzl51w9Y|#pKUkSf8(2U-($x z3}Dh=`+mE39oEyiBZ1r_bAkJ}LO?yiCl$UQ7eZ?5Q-ZY$@qDRR=&ybkcr(I!9QuW| z%G_N-z_hpSzCx4F%vh?1J%>};zIxZLwC@+%YG2#BmY=6u#H_JNZj8}SEPSdNPER=K zI0v;=_=E9hTGuql^w-rio1G5caWcUi^1*b>eq5NY8Qi!Xdg8q2Q}8T)BG9JsKZYI~ z=pkUUm|c9>NgR2J_lI0(6_zU-6(qTB9_OKgz%;q1Jx@B4JN+SBR`BKI>{B0fw2_2f zF#UM;HOx1OAk^+x&(b4F*NGl7SseO>U`qaGx;q)XVc|>ZPM;+3!7A*Z4ispiwZ$#HebK6cSX!SHC@IJowuBUmq)JmFaW_C1`BQgA@`uWazm)7|N_T+MK8CYxZlxDL$l?a$rDepALq zGI7Bi=Wk5#)`O~~i9Gi+>heP->xKQ&NPUA9AY+VHii>{}(C3ylMcUe)N8zsw*m#x= zNi`6#-&vq|&h!wt?lqb29DMbCoN?}JfxL&ndgZ_Neyw>ujsF0fg70Z9#7u;GMuoGU&a;;v1E z=*cubR>8F$JLA-k>0DU68?SGDqq-E~YoqHw3;b00HQ@tw6nZ`N%H3xzA&yv=`=@B$ z+&&~82lHnFG2eWy;g*3v|78g^uOmMmu{E)Q|XUux;2lsBy@yZ-=P z&MNrIRCKDWXzN-%hKXx6{+;5x&1U64zpTHZYOEXB70=m4&R!+ti??lcIr?-AWe ztLjrbq|hy~F~t$a-LewQ&Uwy21B_Re+58>xj)eYgl)rDcIVd3@M&lptDL=}&4PQjO zv$+ypY4cg#5&(2U7oTx}e_HIqU~zbK)k(Q|+w@u-6)_k}y1}F9o7)eB`b@HeJeIez zL>?j$UM_m1fQH&}{>k?Oyt7h{8!;>CdUSU7bDh#n6oyp;`^=HHIR5~2A8O|>{4?UX zw9_&xp*|mh&l0MH@P)J;4~qzgq58CjK>J2U00s z4&*mpF}bkKyb3NMGB(+~mPZ-maOUNh7!Np)CVLI=BZ6Wk=_elf``RH;Jc9 zqj9I1AYPktO5@xTbNJW1>iQ>!Z$wfoZqCE^o>D4_uC(Vw|b6`9l@^fg9L9(eP^5=9&r<~4|qDP5U> z$3QnW?mo4Pwe&?)_R>q(we$Y~fPEF={{V-75wuSX$sMMK_LdgIeD@a-te#NEXt#pE zdjfr`jrGpBrVzU9R}-iYwhKn&bRX+OZTew;wdK(KR`|21Kw^QTy7M`7<(Y?E72nAG zE0?;v_?a#1YEfwO+q;jSYBI*d>Q7H@m4xX<{6C4dAL}u1+gr-t@K3BXPl-Afl^jo~ z>DHEa(IZ20>b_B)Jdc~p$whDnJ!@C~7EYb3-QMXM9LWqbDu^!C1SA}T%!?l2I)Z;1 z_+7kR;+VBGz13~)k)m?Z#pJ?NANGSIZXaCxS9G5jZ)UlI>S-Rz>fCLOtw~tbPhhA3 z8OiC^rBISrI%h6rvF^s##Ia1U=@-j&b#ULhO*-IQf=TCeU>vdc9M@Oo{88|W{{Uxr zzFSWZ>Dq&<++AGR!n1jPh|3=I&pj|RUTfihj@~-8P@WvsA<~jDi6lrPdE_3rbR!^i z=~|vA@qdTBRItr?sp^{EpjfP;{wUXKo=(#fV;SwV3Y45)sOII9m7d3?_|sANWqTcm zhrBg9>(?yVy18sa6Q9m2`zGv|lhwLVvN4N0)(0)`gyP}P~$jLeUabEA> zLEu(nXBCl#{y5o^9H}!NF@RY>K9~gkE6x06;}054C(~{o`qJ4MfJqtSUQ+JRS(@4SG+9FZ2yx?AF$L>)IyM z=G)yw?hA39o>(Vw&Uqh=cum*#no3qFCzz9yl3SmrdYeVmH7zSp8st+)9;IyR78#>p zWK-M`fG}#gAZt>TxpaD;UihowK~3s@L}BXp}<1uj4!eQRwPyH8c#BKj zr$q*sji@+=;upDD83N>yDu+)j402l>)jtOON{#_OqwyNXeP-aU`(#P?WH(e|&$K8# zzdEO_{8_r!5LozIM3X~_nLvZ=&|YEl!Hl}QjQ0Ryq8`mXQN-3K;cWCn;LS6{mkVd4 z>5*GrTR4v5@*?wFsgZ)@Nf4824&=9f{kTnk;SYj5Ev;SYn*OtT+QqpHkm**k&Wv1S zZ<0odMt!n7=DE#IZDQA2mAqr)i|sE{hSeswjci@w+~^oY(ZrxcaeqT>6EgbBp*Q1iD|3tnb!sGRY&c3=7+% zvOJ0hC8Rr;7VpUb^y0MFz&3i+t#34N+uYqSDHQj+m^=Rf4t%8@PkQX<_=Dq}E5m7{ zYyKOxw0XXBa!j`K%B||G7!i&J0Ix0{CcDx#du>@nZY`!+QU_;|0S7x+s&piMYZ*=S zTAj3NNv+TS(frreyftGyvHglUE#nFlqK2Du4z2TY2|b1fr9VjURAxl}(et2%+iMqz z(~nR_N9SKc!{GaaeQ~2%M|J(9Y@Tb|??#aNga8sq^x)O0v@aOx+F`h#Pt*}vN&f&z zwUHG_>|e_O{sjBi#5v;aqCSyUqTj@hUrqQqB=+BG(PB3ipl&lTk(6}L-5h-lbb3$2 z9b)82`cAK9Xk$Aa=R8*Ggt8AJ<^YwRlJfeM{qo%sy&WR zy>z-?hi$dxdx&F?O-KFptKgc z#E^~u0BE<9bZ(=oD>2Cf(-|Js!D}88pG|3ExJyKoWnB@F$On9mxUSPw)!V|CPh>S! zSlE)r+D|b#;PQm1HGZr~wYQtb=pukf`$u2hxL=qK#})MEizkJ(oecP& zNAR(2HW^G(Y7h35fg~Ud7fc0if4!0^nn#ANbomd9d_86qF??Oym60RK!3IJ}On|t9G^^9G+zL&t7U~*p%v$b;Wv*LHfR6(Y_b|0EBy5@Wgk%Ch*Ru z1hGEv?VU6QjyW-qSp)UYBVrOod*_S%5o6;`C7{01=ifArsduD5ktheIV{#*8J;y&< z`14WtRQ?^DSZY)2wvFc>CMcl_uD+$b&n&R+25Z!%QcY}QdUZE?o|EF+O>4zo9gKKq zQquLkE&=x>A7`2I_k$$DJh(k@di1ZKbo~~_e-U{)y{4la>4ZPo@sqzjj`cie*NWaYumJqcS!LToVwPfE9uhAs=_tXe3H%l zTP1}ba_6DQt)i+iCkSkO!Q=k`3u96-_*YHTF5y_gnXeURVBK3AB3uE}9OKr!u3rw_ zznv8EeTw7^q+tNhvnyeSeQ;~;{dZ6BX1Q@|W2NdBF=|sO+Z;2_jgi#6jAM;+?$s1O z4D{VYOE&Xsw(x3^XA5-kOCx{?!nyM^pMLexP8AZe)NZVIJ{i)yBc^Ln5vgCcoDl7M ziIv{oHva%`%8BG%$AR)=-kl$SH0?b90BF7KwZKQ(mix0KjQ!!bC;*S|SGnALBk?8X zt8pEju$9>3aNWIt>Ow+_q#tpL>#hF)XP*~bLXRGqC?tH#G!B4csmz2DJ;0*#2T~nb zh2dRq!rl?HvDNM^^vk>Zi3_As#U9&r8~|1c&p7PLJ#k&9iF{L{__EgC<{MdUr?;ET zntd{ROLHt?c=-+)NF%Ej{ObnW;GL)1q|$XAM%zlfhxdk7w`pN3=o@h--wJUQ;tSJ2imjbzKxO13*Byco}pvn*e)LK#{TkQa^xg1 z>RxTjN1x*nle+`H&_0!nZFK32TYc zQcG4Ztjp}LyzqYwYn}k`rGy%upEj^HxQHiZnu0&U0Z6>E08{8^EAYIBV*}bIC#t9)!%@%DAQlHv4Z03GAr5MLS81$PW1)( z&q7+d`!5jq+>2}dChkA7*+8M#!Dse~LiGjN_rJF}^a8nR(S)^;rS8*5Q{iuqKNcTX zpH0xbZ49rRS=rB}%M;ENXKF@?$>~sdm*Z!Pd|fJOI{vwA-e53IVWmwtxOZIV z%v*x6f=^JKV!UU?9x}4=E~6{zS9dYa+m74MIaV=_L}Ek1IOrUYN@s?&EB#Bu*H3E1 z=&+WOTZ^4K#x@73Sne(fm5A&WiS!jO4^1nzVJM|5#cE#CJX0@%{7{o?`cJdWgGA~P`*kyQ|*vF>&mph4tO%= z*3(e2wbgE}alS0v+Q;)RLIS|}Gbmi&Ygox3L;2x z{6#BB)Ja(~YSL4Zl-8yeq4D2S(5}S36x7=0BL4vDUdXFNGsYd{{pb7&G4!uUvH0cV z-xNh}d2{4mizV|VYrAUz8X$h`Y*aG8ZG(C5UQMCLt@zhclS+FvhVK~>O(LlvcMUtK zC(tV9x7)z}HPLk@v{`ifNzfNpxpiQ0IxbbgKHY0oh=g=xOA8jZKB4gM#z)pAlG{_! zQu4vqa@$=;z2gK7>?oUY-|qf2nh(Q^4SGAvsP%_}%si8BxwmPew{yrE;CID#S|@=#VHTY%R#Dt*7w*`I-`&f!AnXz{k&~X~&OIw%V|A-At0%S3 zr@RaCV%|o3T|>&Uww2D=Bn=JBYsM9Z9a&FfyyBqohl=fQHG6$WP1bF6SnZ`HuA1gz zBtym|R9tQPSCQztSBX47Xvf7mV3mkC^6rF&Bkrnj7wSo>!@~YG)|wXZ#s2_@?VvL5 z#kjb6n2xIR2s!55*4{{7vxpi6NeAd-ycFX$P5eakP1gIA9|swyrzlKEl1TM)2RnxU@C3(KUT4 z)>Kl{w6+sS81@S7F~&P_TxPBC^F-8dyq_Lx32QaL-Eh|F>c0!TTdlRt=7*q7r)XW``}-~%|_}Q-wxYbYSz}zneOgZdExngfPy0*UJY~pA^3l3 z1>c?EM@==P#za%Rc52Je#{iLl{1j8ChlE^Jnj`WWWTiSS+L5E&gVKLj? zUf8tqMuYyEv`&npw$=ySRK6DQ?xCr8QsVx@MzYiOcxGpc?MvGtMmmKvnGi6~Kt+2l zi>>@f(qL^XTGe$4;+N!G$mbzq9*T{XIsX7@bM&b-jUU9`D$~E=9G}EGiL#R+l^WVG z;kv0;iGk0qGw)jazYI%*mhwlzOK~UPNG-ym=h!NcpV4R%ad?#rYp;T;b?<@B#$D+au>=w^!tA;j(9GjHg!Kw%D5^ixmq*( zjh5GF^P4}1IyR+t!^0Y{+b`BaRtZJgARhbDU`K9ECC|cbOT-gfX*!OtrdeIZFO?m% zaOdVHrtgvP-hg7e4MHZ=Cc4%i#2R*=A|~e+^E@vmdn95t`Mt0OdAuGhO*2=I`*AKc zJ0f<8Jjo&fn}AwHW$E9V(lw_Sb*Otdz1i>jkHXyt!gkhhc%sVEMY0O=Eu@XVXdPH$ zGmiYqD}(;n_)~4J8N5TOPp`uhAF|lo30^1>y95g|9lbKn+4ZJhXucfre9fob-&xIX z96^z-?qr!zo`Ic0mSy+It~B@?{t^47`#qoblyRJgjyX2E`}vyz{{Vp0RK;Q+z>bP| zdJjo6=z;NP;pB$O#?4}aD3Gj8_Ed#!fa$fE0#CAmPVp|W;ZGLNZ)jwjTGL}d`{S9S zon;?;3&0?D%U6fVW#eR#Z!|3fQFv5>2-8{PT=v|7s`&9Ak0*=!BE_xrx#a~Vj@rgZ zu3UEvq992g!nxiuw$opMZv{XVnWV;1gw3u+^-ni%DgGTYIfRZi9R4{ z_Onmn=roz&`ISD?F_PjX{_p_CoQ~vY+PsIwo-XlZvq`K;p;~H}R~U_v?N)uDak*K> zRC^N3`Y9pxzgZqy6O!+;^;u%_0$dHKI^v?HaX*JU?fm&Zw}vnWl|{`I8KAsPVW` zJwdOMH2(mHcDk*{mHnKE>cv<0jI69b;BC+2Q94nZ_fDuyHO$VN!}eYkAm8|=JNrdb z`>TnJYZCfp#Bs67?0By!@piT0`SlrGT8&Cs9DwjZA9{|1_g5+hAMACnMDZWOxA6U{ zuD@$}Pf`+5-YY$ctlQnVK4~%D=Ok4n3Q%1Q^hF&f zNYkT?Pjw)94^$s8=ia*wKElHCRI#=&!16FYY^TcrW2SSAd-bdvOUT6WCH-4Dn7}swj>r+6WtpCV@*1g|ftv{>TIC zTm|=x8Q%s869+g|_3SvvAB_=B>T^`(dmER!J*yM;n8Qdr6Z3vUy=2?y))!Kg`&&eI zl1!z5$mjtlimIB-5XNpAP0c6#vc^dK@&!PATL_9+p|ts&ZB~(qD1BFM(Vwp2?N*eG zZ5BQsx7teIW|V;$AS}$rGoJmbtoqN0=6P)z?i5UNiG_`U_fgODtnclsr^s^5556#d zg9G!YL4R`$pJ@^?ImX!lbs+kKnzeEo8$O?^%NUmKINCBZ=3tQ6^*uQE=Canwoc{o< z4S~~kIQFi)OTA-uv7!L3z!d-l=hr=}snm4cDkt+LlHLV4$uc5>ex&~ZN)^d+NaHkD z(d}Dp)vFo*0D-^O1CRDk^r^Lrp{Yt*3BLEr6_m!RM;PQ2UA2VX8L+tfRGOuYv!Y=i zf1Kc+!)RW$gMF^*cN08T7ZSazHVlY7u*CWRdC%6ZLA^}cmGvhkvy>ZmLT=|@t!Q>jBTb}_EDVsUNya}jPtiP4 z7K(AI#J8Z4^32ZQW7$Zq80&hIovSkt#~XTQ>IHNGb*7g_ zLuqb$gq}OF)a@I|wAm|3yvGW^ltADpMpnoD^<7tn{C}=kve{_1HhOKvvELirlMAVQ z@~t5Vr01?jwRTz$!v6pnXr3Ij)?wLaJ@kMqP`pU(sM?u=beBdB53i*QDL^NOVzw`Q~pMQVd@F|`d*nXfozjT7js7X zqKrm|piuY@SH2pxQNDt?;=T~^R*iFa4w7TK(-l~L`L9|-5YNr!DUG%<^#=pc*U>lj zk$Al=?JTv&u(P*?>7+3h5Ne+q`Hu#NuHm)a2(^d<5r^klH_@>#7~7c7Ty!L zzqQup)FQD&Sko%#0qRJN74egRPI2D8Tes5n%a?TfEGQ82UBJ&hhI9H?=z!3k`r#f~yQ8@{vBG^^WLF05vak$-(0yBQ@Xx`j|wXVr~#{uI@G9|hq{og!PF7-<4Evro8LaWZ?2V6yCE$EoO(wp5ari>Ah=S8~=7uRU0QM31oa=Os)3vEM9@i&TXw7o`V&~)!HL~_pFWU!}BA7}x8 z-#mKPZQ_px=vKEHZI^_6dvSNTvR}s>(agIu^7$eZQqc0>+svcI*zwDh;{EA zSjlfD<8UEk71Nf^R0rG$`jcLpqU)ar{3?-H_v#im201 zMoX2CBhx+_d*oJ57J4zLwtVH{uZJ<(-8PA*Uir6x z2~4uiWeXAGJAq{&_QxaAt7yLsqc>35okr^Nc}^sX%p5Vt-Bs$x@vZ*=iT?ly>^vy) zYdQyr4b%?%W3itfJ2&T3(FTS1zSibuAiYyOa#kkbOT|M;TQhn6AaW)L8B#l&fd? z*3F-XZ1mZJ$!R2((jC_FYCGad8F<_!kzfA+9b&b-9F~OLTSM1ACFvI55w#}LG(Q;W zI&PA(B!f%Tp_(Zmnl%dU%&HJw*Drzu+(CYZ1+}H%XM(> z-+OPIjWCSkp~wTKE8|}gM|*WGy`GPtXts>u9J3c z^lvWaHH<8>X_pd6fS#%gfI%L{wNXjl*E4SVT>JCk_l&GHO@TIiOSmO91Enu{|2;$^j#ITwzI-fqHAxByqh{{RSd{{RtK2s}xu zS(28CmKPHwvLVL=6)lcBXQg*qmy9*f9^O1Y5VX9SI2a)^`7y-o56p~YM>zLRYjp4X@1@v zv$nj7)>38rbct+Z9hH2kWG+7g?~3(L1NcA0@@i{!f1_Dx*9xQtR%?U@9BxDk+5T12 z_`yCgTIjc$Zk6^yX>^`ZRJOW`LzB+Kf&up=3g@ftE2P;_q~_FJk0&<%I`HH(++S)M z29a@T8?D8Wg;wFh@>k77i~!i~`S!0T*M2+PTv)`qMYf#=p%WO|b0?lQ`k*^-eM=V= z*7&Ev9x$IvT?fT;9WoY-A2P}myOqOski`VDqbJKSla=btHoA2DcQ!Sz9QfN)uzPF0LgP?@PngPN z^A#BJlednYGg;mm@VCTI62VWd0IQJwJ+OW2j9(Xciq!7VwOvBhNdT)%^572sW3yxF zwy0jFnI@wzn37Exk)Jjb;X;#;7jky@ABA$)_j-4l%MHV*B>a-?EC>7nKqv5`GMnms zH}+;0?p&My09zkQ_)p@$#2q&B-Wx4vM!S@ zJ|U*1VFm0q_OBk;VwUpmJ88;}F&deX+>XEs>Z4Xyw2zq1a*RA*H4aqP>Hh%3qv@L+ zXU2N9&F+=sHq-QNVF+ZmmQxkSy8v8+pF*a&e-QXr;?XAN+GuBhp*<*0(CkFv8;1Rz1V3iIjjx`~+7a ztp3whRvLoocRCRJG)=W`KGLky0o(?NsQ&=IsvUSOnUpBjZ%r>^mdi;Q{ktJ z<5;4O&c@J)t{uCse%Z*?8Mi*-Hal;AA$+SoKMhrgEQIKgjV zDMGwtv=vCoIyjzlspI^Axn`DfRam}j_z~p<^o;B}* zv^li>LiWQ`zts}~n52**5!skW61n;?`d4i@r)z3*r+ppH!&LZ>tLnGv{vFdE+9{W7 z+i2cuM8JQuI)x811gc z=Za+j#{IBe7?M4k@vdi5@nxoupvR=!S!m6KP$Gv*5_QcoMP}yoe8P}|> z;)@$J*yFiZ$9=zNmmi&ZSBE}2>UME9jjU+Ne*}TC9qID`W87g^q3$qiqp|qA;+<;l z9Xbs!$l7*WC9DG8JaqY`V9tNOZw}9ErcI^7 z_t%3UN?Jt2e|3bN&s^fH=>Gr^d`Y8TNd}{9r$=!R3FIvA3o!Ht&MMjZR~>9kcl#t3fIcdoN4W6}SC=vnS-#CTl*c}~f?S`MV1%A;5 z%P~*;X8F#2jdB{8_)-k5X{=sKKY zUYqEdgt3JK(DC|J!C$Gm!?do>w)0TXShQC5l1iZA7?8R5InOnYFD$UiEsSTJ5OTkv z70msjPrQrV5-P%7OOkdRR{WMUgkv2pUyzATK-t?M6aN6$s=h_Gb0o3?4^ThGgujs( zF+KSQ{NlPDKIcxqaW)J{~Z^V4g)E-f>q2#pVQSE4uwS zuU`KEgdf6FC!H1Y6+j6lRT=sMp#FHSb6g${(`NEC$mVoZ8EHmYo4FVm$E8ZBo6#A4 zaKY2GyUkE}HrFwUK+8tx{15mFx9L`{ygRL0Ler~3aIyXK8x$%%#EPG#Uhub#Ec`92 zuBE3%Djtk72xaaF=xgdf4}47cW8;g+bpHSlSVx$CPbcy=n`$+g&-s0v+%#kFrD>o(rjGIfuN2Z*%@h*Is5>zdfJ_=&IS=lu%)<_vH= zsa-h#0DzkMLc_v7F4J{WY`51p*DERA6G#C}_sopAJoEy+1H`&!lc)H7Ej(AL+%?VC zLs_E3c4Ix6kdSlf+;*hf>_@dn#0kcf{oNW2{)1XRgDAt4*eST{3@c5 z3Aeo~AyfU-k=fhw#aA)TmRB(Z4mTu;47#IE-&p!XmGpjH0>5Bxds_1y6` zv86h~SP3P!m4h7h!DW#F`mJpWvU(U)q^)!8ABTUm4}iQe9nOzuX>X@#5{#cJJ^uhX z=y#(o{yLT!_o_O_jXWc)NhF#Mx-6oUmUlL)&9|SGOp&s$uLRef-~1r(*M%aE`@+^X z`m^9Z-A3v;M1GrMhA7J)W+&-fo~5IB^TjYpXxdc2WBaB(KTnF?IPK=PSP#y%N=@A3 zcz9mw<;`PS@TQxpBT3?`+le4PWN?_GZNT0?t0 z3e97--Z>bai<@&K+2@?++}Du&J@{QEz0f+2nH`)qgh_ELX7WW`^dLr&?jx}*Yw3Rw z_{+i&_$cOV{uy*fXKui;oH9v{=jr)DDpLoyL^0UtIVHOXG%7_Xo7Ux=PK zk5zQD)2_Vuiy~U-vD{55Vf6ShxYnI`zb%+Eks(K$T=jR_mnwm?C z6=s7|@sx;*j6p4@*^n{nHzNX1rqNd^zJraPwmfUa`rpQH6D7=^FYx8t%6?ddq$A5_ zJZ0wG0*`Pr?^~W1@c#hBy$?)>QP!+~v(ZAT&u^-vmv}uCpFLy%bil|SmFlf8!z;Z8 zTU{RVdGGeK$nsg;OuL5z=96OJ`j+CjEi1%c3x{i6*$MA0vZeh004_bfIgftT9^ey6 z)P=p~Zy3p|By@V$k2LGMQE5Cj*II@El38MF$rl43#Bj_#cUO~5uIVu9US_3ht7@hG z>~LCIS|)wfAa-Gn$MdN*PZX>=hI}!gXg9OEutSELW1howp}!n+>0W;N$n(7Ya9U}% zs^9VDXME60xSm!>?j=H>fNJEcH7%X~M??}!Rb#KzH5~~p%uk_eX%x~K9x3ixD6#3~ zMX^^s$>zMTRPhIgW7H*l>N;(#P7jf8$t*y31I^^)-!;(q&r;RQfZAK!M!*aRU9O99 z(ONR759e9F5AbiqPa3?;5iKksIAf@?hd!rln^)`BxMy2SyIAW`jkIPin>UAiT`Swc zX%)4+3=3Y%cDA!hN#plhm_Pgh02TEvi{g(2_+mIT+Z{IBPn^ZFTbRqdl5y40AV&w+ zjC=L1Z8N}{c8%fny0W^K?(W$eYNA@tX3hLqEdE%>eDmltUVEqA>KB(+6Mtt}5Lk`V zL#J9s4}5M#WA#&9zgcfcqP>FE+_~Z_ZxCrv!>@clwz7DxK6&MJSlqBD_;5}KsWsr< zE!X}q>+m#p*t&*B;5Eq9%*R1vyN|4q?<y>l3WN9K9%|(MFlz;v;UxKCG|Qt}Gu@-dbq#iV zg^Jec=YJ@1vQjahW5E0{E1=Nt?<^T_6H$s-$j8}kCz%@u+A;=z5-Qq!D)A-gn&uab zn1*&U5i5VXxXp4m`fjUi#@<<-%zPAl;YjR5a1C|Bv|IOCtm&q#eP`ew66!)7)M)&C{8Q>OtB`{Hv|gG`pQeL)vKf*LlY=vpD?|`qetEY=U?=H+eJa`wxuz zEH)liv8LMUZq9dya+n9MBrT9V2Gd?6@gK*!M!e!J2Tq2plzk!>#F- zap^ZVmo03+DukKPW9m5-?OqJ{`=;ccJUgGbk6_V$J=srukZ2Znx}?)!{L~ut;p3e*P__%=ts23kT;@Be zp^hvO$qgcv&teN_wR|6cAH)mkAdf@vRrZB#X|*C`x4LiL1D<0mv75f)dGB6<@b1n3 z0JSE()h(o&`P?9VPyp(4$yAOuC_RA9DKwtvG;p!#d!^5Zd>7)|JD=rpaFY?45ag<|mgu?Tt#Ec)4~jIa>)CBC zg!Vd&=<>hXWe`FRH)1&y90A)L*GF~n80l9lp?F5t-^9qo2_&_T%0LHGf}b%{=np;X zmZesmx*M!ITAA8Ufwf%|UW-Lpr;5ltjH@EZvARF}_1Xz^9-M-E*L5q}_-gme@a*e; zpr~l0w2nJe<8BOu##f$r+}_o*plTZTigfF(F6zo%J^{6c{Kq3_Acf;_$EOw3MWx$E zrT+k7!)9bsg*U4*$hrROXRp5%jIkHoe$A($@$hTcwNAmXB zm_TxRee7nwE%6`3YwZ?kt!FB3t_mPZnCyRh3brwvJrM zG>MM#Z!B@>b6z2<{4DT&{C-S&98*Z+b4w}SJx5<^?(|O>>Kf^_MAR;>Z)A^Rqg~3`3(nKz zugb@=6Zlu8+x$8BBWbHq$ua1{D{xvZ+z_G+MLZB^>dxM5Ud z)UBiVLe|>ht$Zzgd#nAd$897nbXMLoA;PSTxI`K0x>27>&XYpd^i6L60KnFM14h?N zZIW16&u}*U!(uDSg?sVTb*(QHYMvTj5L#+}9{V<#7_@~#S%V8JMgaZs1m;qCCvp5b zR#orD9~J1jfxOc-Ic_HM_8X=p-*08y`6O3tDpZ=fmgPb&`bX~~v%A((-Squ)OPvUm z!z7Yv>aFG><$S=Z5RTvsv`|xYZ-sJd({G@Tba=9$c68Vv!C%E~s`qiop%bHI^ zvJ|AFsz$by-w}0-k!z$(_R7bEww;Ls{s41|^!unjB6wcT7$Vm1f3#=M$~6UKP!A$V z%Vke-oafTHjSFAb{4X4vZf#^y8H6N(Bg&q~?w+4Y+tc+w4Qs`vy_(L_@)g*Sd5GxD zdFuJk=4(e6(_&{O_L1yg5ByQ_YgM$k8h)=9qj9H3M3G%fZxaPzL1bx4V;-QKSAgr2 zX;R-@K`xzm`mm9fNq*HG)N)ClO0-~x1o{*8HLs|67VhE}yt1^7R!{k93*lezUzZek zTUoXEd#Wt+>8>t1{h@Zsi;?^}2WkClo#E5g`kCn)xFa`4_;=&RyN>GTMYx96QXJJ`enFbe7I93dwB^&}EQa*m?f|cw-@&CMt2=aC2P#o$y!VzksB9 zG&n9(%|f!qwsS~~r?UoxsUKSUgT-Dp@fU&g`)yuNiI*C!wxpYuF?}zc3Xz<;e7HTU z#qa(-Y8M_=#+lGl`hJvNbIDRW<9aA4|>~^;$Eq%NhRFV z&wVa2EUNG4DxdEe0W2$)*0l{H0J^=Wh+obqNk&q35-?Ql%H)o?H9pNj+9zZxPFtN# zi|f7(O`3Lyw=gj+9FHS741TH<0oN6StZSEo<#iZsuPkrM;!ioEk^m1@PK0Oa_|_ML z{vzp1HO0QAs2gV3(Z?)uwYX$&ygzmn9QWLL_pX&SZv)(0ODezH62-&l!D`W1Iq3r z@&_Wml+r#7>yp|Cpw{%QSiWORdu#Y+xK_t_cb5YL(-r4FF!&|$6HHIGNuk_BZJY~% z9H|+}z{@wu`5Gz9U0JkhQ?-*kK;GW47SAI}J1GF4&l#_2@JGa}%@ty>)pTjK2qIi8 zYRnXXatQ+*XWqE2JHXx|)9z!`l>~A?+55qcRQDJo^UZhGRu}#$xl1@?hfSF765LC6 zp`<>o_i^~vpID7I%@?tid^{_|lA^jjV^H|ZslBqD3MRB-guT7&c|~G)^4Jn~H5L(rB+|)2;53Qa*JJx1PKWz~kDsr0Jc=G=o&MmrZXATsV=oTg^SN;$JEygt$1I=ck+mCr@W5Pe2p!%`@#1r9eVw1 zp;Objk2`Ghi~D^B`bZM@O+^k1p%+I$-YXnb-Jp!ThW``l;r;;ULU#-%ToW|lz57(aM^UF!#Rsn-e(pIT{F zei88f!i_soc%ooQnnx_ieE^Lan?Fo?*AL^L7wUuv?cuw-gEm7M}*`lJ4X(VMCuRA?$XA-TwfOR|Q&~_iL=}^!TF(fwdhQ@ypizufv^k>raaPF0CP1Kz+YzM{uk%GO4(ap~0_K zyn{}@cX?rvnNA5KdY}94LH>2l-01c}#MZX3M=EqNOcQsxPw7zclIW~%s6^v#JTa?j zF)WF9706-Fk{Ind`@E>h`T{-c8f|YnHRBbZJQCB}S zQDb-1^ZHk9WvpvD9LR5N8KeYYyc@E9y=zL2GSjJwr6;OA-^3crTcLwMjWw%jKy+zs z(katD7kc;lSD0${TCS+$%Fs1SYlm>F=0LJU#PQ3LxccDNvUp#|J~F)tZDHXtG|>fZ z#XPcmg1eWG&bhxH_|L~4a>1#1YJD{I|Vz{k?OLf=~PEtQCdXsj>el>;x@=VH+xOvd1k#2WJLT+;QeK!I>D%C~F?v7c|l%r`Q?^}Eu%>DcyGcw&Z%&-w2;d*tz>|I4(z;*yFQt(hUeC`+aD@BQ#5j>LkB2R>a2>V z^9So*`{5xbtzl{QyXoMVkR{4_r`u=+Mm@Pc^&ZBxKZ9GDOAAG7Htp(qCye}KtN7~P zC$!P6w1XRP7tFYBn8Qmuu+P#iyw`+3!_7d?Hle6$Uo(<$qj4wD z+iFV`K!9F!3IOYp194on=ffWo*=kbRTUtr0TSohS(`c{dw``5WBkDzS)L74o#+Z8e zIQx*2KmXF^2pgzFU7xOGxVFks4PZKw77E*!H~_U(q~e;`rajt*GlZ zW&;Z(7EtN(Tc|xG5c%e12RyIM{_Snud??d`UZ;Yk(eEr~+*TX0aV6TQ>O8l%iPVn7 z1D{&*d%qJ~>3X=IM}Riz6tur+o+VZ9wj&#;1G1}Nb`|zlgl@hWX_{0zj=OM^YT_?G zJF_yr)nUq}NMn(~1p%n`U(AcCUT{m2=ge9*nc@!y+dbXHHyTZnqoYWgQ%M}m2OHMt zEM$EbKaFx)O}3COhmJf^;kVSS?WHL!cJ`}lY|`~cb%7Cp>5;UK*{^T-m#S!fD~3H+ z!4Y_#=j{0n5V8A4p1kmX(s3Go0O#7g;w?Ah1>LjDqi9;hc8)_&GFn4q3J%f71a1o- zP;hH0&}sXI)Nx8ty-oh&o~7|)MAbEzW72#*28eNsi0$ELdxCfb2_kPSBgaE%fhsNnF1y{TSLkWKZB0hU9-{qeUh zzTJNc;uFLkHPH1)^xI|BbQrF8W+`GJ}pc^Q-N+I7NJ+pv zbv50`;hzC`y2}@l8c{>u^{-48vj_DTKW zw19p1uVC<3hoSK1jP?Usw2&$RwIXdb*wFpu=$!Svb^f0+EBCv_@3^ zXB~xodUcIHOOGq43Bl#pc&Vq}4U+Yk{k!kDnFed5WxsV9!&-DT#CFt%2AI zn?U%H;%lu~SlL)<&uzbRLa!C1+gJEfSzIoE4t*=@uMT_x_;;qxx9Q@kZ>AuWn#H`l zp5SbCka6yFR=jQSi^G;W70vdEZKmB^mE8~ai#l98{{XWl{p?SpI|`p|B#&F`STBJ_ z_v>TM=lF@OTqd7cpm|p-br&HGPLoK~bsIEH zF`mt#&IeG;^GpZUzAm=$o~dVZCx-kO7 zB8fpA$hd@t&!CWd8h)$e-x*(M_ZEH%SZs=dmrWL*B%WAq#Kc_}BfV7Dzh-G{^u@Ry zIMVJx2RJ}vKV7nJIrpv-KiSX4(8Bln1?`Td4$-(zZ7PC&1|yVyITUhBshW6qw7)Z; zpT<`@Zjl{~J|wWSXsyEBw28f?bDaE=uJ6DAE6c5XW8padU2jp;Z{=4qESg=s5CVGO zhhP{VLt0PaKNe|Ow|@!f_p|Z{^4*97*f;bQ9j=q&EB%m<2)F(LWB zooG==(ekZTt?Fdz9}_$=a$M=&8!!8EZ&=A7}8V|B%O#JZi;)yQFBV{{&6YSFB;%+O41@Km8vg*p9{^m!^H^vaft6Sy zi#VuzeBAT+;!|PGKoKKn`#-9@{w5T*qPg1$Cicz{N%}H(@%5@tZ#DI@N zs10}%M3W_&-%=M8K{%$%Z?#EB1;aHaq#Th&L!~E zULyx9s2P=+m!G~uE>B{gjdU}7NAY)yE)JcmX<9y&Y=FO?YZ$n9$m42Ca&y_gop=qN zlcV@<;%gmuLe+I7a?2FjOsO_=&}@(&&l#p({5sYyOj?eC;m;A;MV-a(B5BuWugMy8 z^fi>ILF(D3HQuXJ=^Z}X!nVr#;Fy1JS`RU8?qq9mCf-y70)_d#8y{M9zY)G9c&irC zcpl0tNWm&1hs>Ch{CkV0->I$(Lh)Ss9go>AbPL^1SU&sC@ma(`AM?nAl0E+b8p%Ht zwVTVsaii(FWrUltv8EX+I~gEo$ovH;(uZA1eC_Od6kiJbNvat&%V;%SKJGMYiR2fl z5=4M=<;fVDK*Q5+YX`#r02{mu@Xt|gPf&jl>e|$JMQumQoN#)_DM2Y8?}7BLJ5blW zYkw}( zZ*Ad7lV3=I^Da=@#$9``hG~4leVqr^y-N4Oz5vy9_$=>y6uOEK3oEwIExi@hSn=!@ zxepk8GVrb37W#F)pV&0`2I!K?>ftUUJ;RoQMPc+Jy5)tcz2=$1u@oESIxC-!T6OV@ z`$t5*(*)QLJL%D>IqQ!h85n=P#dKG`Kk%G-WFx~dk2L-8EFvsDTVPCbewFiQh_v4y z*;@@cb=3aDi8fkCEy`QS6m~zmUFY12tKkT|OitU0u9^t?%N4XUBM#um8A1F;YnoJ> z(&ma3{v?m1bl(*Cw)*iW8kLNCdyHajI!Ig}LREnJ^%VQty&@~8J|eSQscsI{mdjAN zvR7YVjE(i=iu1UxV1rJPGzo65FGhF3mXM93zY471&b;!;ueB|7+UxpeqiGVI!QV^9 z{{VH6K;VDCu~^OyIz^Wi8Ea$Lu5^C{+RlT*@urP@&AFtFWWA6B*D^D)!SBc6R;SUm z1twv81o6h3%<@D$wLXkyjXCzos4sjWXMLbed8Xf41V!8BYHw{2Rs+=)A3s{~SJ5>6 z0B@69GhE2!{JlR>O^Dv=uNwjW=xWQ@^^tIKdPMgQTGK_+8Dg?)$Yz_A5=n1q5C{F}h(A%9@sAfbiZv+Vipy7rQUndLNdRl8 zhy8YIbjbezf##@aJ{0j4`u&3Q#TPc4`7osIDIWe zVY<~U<_riBRiS1*(P=oO=>_=ii=Ar~TLzT7`~610G~u-_RUlM3vllYaBR zsf?>7qR{F!-wk{i(xN(z)7eOahnnkAGNJnJISutDymwpFe`b4`*3U|4rMQ#*XoBWd zQb$rA61e?y>t2PUYxbJtW*ct}y`8L!wpNy5DSZC`vA_WORz|7dKMadYq=G#*-Ybq| zw{>Crqm}VX!};Mv8G30E+$}phw`sm z)cg^l4GmwzUI^24%f1U<&v$Dm=ep&#llpsC4{zX44_oQ%nzgQ+&}Ze1iq9@Pe8E_M z-&LVy;UpJd}>L2qdS!o%3d7xd4)ZAws=OMHUuX>yj6@XJ_^^flzrv)umx ztZS`7Hf{7s;@KWPocq_dH-daG4u@}{>KeV4lWiIEJfR~6X6i|O&cs&}Wu)niFCbMAGXGP!~((;41MNvAz#6Ta93CQ)rISYy0$0@1kO~d z`tYMC>zeZ40sM0Kw`K_OLn_FJD(eK!Nc1DgVfxoy<6nwD4SauOKjAut?tMlCA{Vi> zDB-&Y-ik=0mXu)qn>pngu3rA7Ul8lMuB>hB)_5F4Cg9q08+?1QC3E=Gb-Mu-w3>tq z8JtE4h|1GDW4YK5KU(qM2&A!JO?#wi^WB7FI zM#*fXM`7D&nM3|KuQH`NbrtHPcu{L(p7^b*_@7bm#i#ruejuLm^)j;QkXlQ-Z>C8g zk?ghct-hzO=~K*?B5^Te=0_@(!*|Fh0R9#C<=2h0*)+zRMA7e)QE+iH+8c<5dKEyb zKQL?MZC(rgYgUM*aLq*g+r@+I@UZjaSCe^q>|1zh@+9_l}Dp4K2!Cst5Jf}!Z&eU>e>U`#I2UK zm1TrUj>VLz74+ADziGdPdR3$`{{X@Ybf<@?v5-!9>z()~@y%Rh<*4dPRNuI+d|?ig zu1MxP4KnIz*Cc{WLj%4tDnzu^n{+oCR`qU~y7`y#B$4=6*nT+pk^3_E#i!KX&htmU zoMoko+C^~x0NyCLg#C7tTrY<7KZl+qf^nhzNVd~~Qj*7g5w?;=^!eNZK7xxrf>^)j zRz81^N3~UEo*X)ll^NtIpMFR3tGX?hhHP#O`sSG)p%R_$id~L901mnSb?O&i4?HcU z@7v>DDo_anV=-gzpPTfqD_GDxFBum};&|thK16W`V#ogd=kql#`xgq(mY08tt8AVE z)NWf)veBlsvlt5l-55}NtaDpV!|)_hwXcL$=gx~nnkWI}$#ERy{RDqz%Kb)bo_p;p zRke%Fu$~L3PTw}(G>K$E-Pb=c{HxYHGvS{Qc=znS8nd@yWC+`LbEm~_(f&s!@&VO33q@?LWgYxt8Y2IG~?CQMPd_NB;C|(lGiK70g*^HX5Dqwh=&L z$qHlw-*ES1kPqo!W8D79UN(|1BEs@Jw{N&DXJm|jycrMZD=>b?e-L0RE%o)SzB@~B z&cBjd@%WnFlbyZfaa6?N?Rd=jy5r##cPAQUtXC2+$w)7wnbiLPyBmK>=GVb`7LRcy zuZS$}-r+&SNbPQ`p5>WXpTfStw*8-ceWBQ1T($M(jk*Jys~F{yHpgMH2LAy2>1)Q~ z@LbEP?`=`8rH#IIzqELX$Eukd`PXD^)aQ+O&)|{bk$5`Cd!0U6Q5z?2)sqA2LgtrB z@Yai_-7@O75nVtsOv(X}ehv3e(!Qm(x3baWlICcwFQj3GwYPzzQ}~5oKN_ZQZ7yMJ zja$NE#>Ia0_i!I6y@M#p{4rLhifQc60yq8!hjf;f^ZB2`lFtl4W8Z#%O6Vbi41Gd(R>JDx>gz zxHR3ZbY=BkZQDJ{H3>9vE?Uo7$1vpfA6a4&BnQ< z#IX@?c8)s4>ps!%w48o)o4MB%)`yrIm~AHVlgvK5_^WJ|*GM)lz&0~Ux{sJV zyMY=nQI+U_pX*psNogm_ZkkTx7z_HfEzJt{w)WQSB!)9_C~W-0YLC=ryNB_IiIr7l z%u$sIg$hup>C~UhVAl+03O0f<&}D{yLr@t@9jlfjvgW16<927U>7NvQRis3aTTdE5 zx&6zakvaBqf1YcshvO8QrGn_%wwq?qf>_S$BV>+1<8l3QUpTlAgEBUM+5~>NrDvw4W|}@m^!%F9u)gkYQ!CSSB&K&1D*f^h17tRz$T)k02NvpM^{83%?u5G0F@_+kdK(KUTJBTSV0SV*RP`pnUmZ_L(?54sd;MeLcC zsr*^9)FFq-@XOxZDcoLLP^^7{DIinoL9JLkQSfr~L384N3pJ(wL1^wI*$H4c&zBOh zA65Kn7Wj*O_HxW*y(r%+*xjVT7uR`&IQnoZd%Fuge$ow2SJiH&m4c&4*3qzY&}S@2 z`qa4JLb-``X3@M)zF z&uct45c)896uI`?8lgfx2kkCY*7Z@XX|gTd=Ch+{@3f_+nID}I1Z1Dy7(P+kAlCz- zSojx1)jrv$YZ|_vIAGCSvZ}~))Vd=!27lT)uXXT$ize`@MW@`_7~_drFFNE)EON$9 zc9oD|DedwPdR<@QABQgQrM8Peu(6j1Gsz4-TMtwWFaiGncAKR73)&=n<>IdqYfE_c z+HR|7;tP36a`zUnsRZ>Oyj=cO=kosmW$LmEeN#$Eu3Uu@Sjey``lbpJeMT$jZ9z2q z;8abe#3y0$g@tw!c-%=`1MCfCU1*k`9-q(D#)|+sLB_svP^m_;)M643Ou|2TpZEx= zB#X5o&YU?)%ozq%M8;O7DT~&3$*^j~jSv zL1^qO@9*#Q+i3i_&mCBPx%;ouqwh3i@qA zS2o&yyO|>x@`j%jPm%uIDl_#w)vQM=x)Y7`J;C{2{vg@e+uTd6Xjj(~Aqzd_#mepa9(NkTwf(7Jyt#tI z#E?y6Z4(DZNR~*O@CwcN*F&!SW%y^}M;E$vvuZO&zcq@apfMlB!IefT9wJ+#6-r%? zEU@t}#gB-7B#1Vt5RTY#+H`kXfmH9bO}Per_@wdog+3pNdkMek_BhlJ0lBxp!Qc4pKstTE`336^}iHpVWMmpuU<{E0oeS2u6?sy?*~onjsF0) zaaPuB&(c0NJ*BH@+KsDyna0?S(Mg#{pk$37KaE*Wh#wA~BulL#IV3V}^Ag%MWBACj zZvOy*RNgJ{7lY=yj&;1!Cv z759EXR&v0?+Zq1=YE^pN_q`Y5L^EkKczeS(cNXy7pOVlM409iNVnm3O>s+w#{{X}b zJF$Bog+H!V2G+)ZUVEpx={g6Cyd;|3_kJtX@1(wel3(ojKGyPW z>K)QlU_T1<8;{x*v>R5_ydcYKr=h`y?#g*5a(l8$UL;>-ke_P#HuqiBt)0@}#20eo z?nx_1@#FoknekP$pBLWQ8A@u<%`Auas3Kxt=-Wje8E zq&jWNCqwo%Bp>$}F~{j%b>eRt-D>wS-fGd?*t_N@sHDlbZPL~cCMN#?XU)mZeMmKf!%4fy(lzPFV^_he zt$5b%OM5%>Zw0)0XNpzG1G4#>i2Unj!@!>xHC;)(L!sJ3u3E<4R5n_L{OdpN{{V?m z8Zbfj$gf`0{0*o0cGzFp=+@pFzKJrX=KRitda4xwlUdrQjQ%G_Y^!0d+evTGqgqP> z;D6IaKymouof;}E!mcNo+6?4h;%Dt0;Ay_gapCx;`%~?T*_Z8Xxc(K5W%CFh?E_v_ z;_uoM;$q*)rE9tz8dc<&4GUPku_M&0mOqfG{6+DfRnoP1WSVn%b#DIvH0ca-`Cg$5 zg(vYf=lb`JuY5(QKZq>!h15)k=DMC2hE;E24CXQU8tn(h7@dp0i z&9s^?Fpgt}+?F}_akPGwxuNL#kBu**()>|*aceV-nI^eNc8_hukHA+MrFgpb;^r7H zA+)wUZ7m@KKIKUu*Q4qlF1YaY0zG=(OIW2{$ui2L5p>J0B zG2sm%^LOHTZREz}GR%y>gCiXN12y6vFww4bW@F*c5Zr1ie)x`Ah6mNv0j{!7jha2P z?YFwTcT<7O75@OfBrW<@mXYyyO*h8pRh@2PkYmfbjK~ywD@H<}p%f?G6A0B$d;b7l zhtJl&C)V`Rt1*=V6Z^rrq$Ks^w%^ECccy$_)vYc5#c!y~4Y>qJi8I3^ek`O9!oG-u z#=i(P=zOhLQG(o#kv5bkLG)&IAEg$WKfvu;;C$9HWc;SyAp?**?DKFx5NMYp-5bKI zPgH!opAe>tRBc0kqjFC|Z<rFLwRW9$N7CfBPO{tDrbo6GIa@#QA}RhD_@(fAI81&dvtP81rYH{ZeTae* zKQlw+-YB?Nt82+0H0yEruSHQ6?Um}l-*#C6WgnGRO%CT+whtxC2*~6R=nwun)%C8S z@sHr_DI_-WYIjjM{{UApaS-;}7oYp;xC|P zr7p!flRPzk7g~r?_G`H9;c|ACSr{?;gvCre8{yc%kIjZj4;YNf3H%-q5B>FC%i@oS z-w6U^K()8O+Av8o+p`Z~Kp*(^c~$p~{2?G&taOBm;Z8>DiDbvnJMF8y{LGxH5>N0- z`h76!-($VCi*Dt1fB;8q62SBHuRM!Ny3>TZRmP=tYi}zLHX@R2a5@rz?QC|hPq+Br z;wwgtBHYnNK1h~a0r`ggF;u)`@pA9Q*72;m7M~Qcj0wtSL632a{vgv_`!Ia{%>66C zJ{!~{U$ZW;dnSM7oufvF@z~%Gt5#;e;k!Q$-MzG$Jnj)gF_DR6Q|q%B{A zD{&(yIRZXEEMlW=O8#}*b#r+vV~wvPFvrlE(~?)!k*`x%P?y5DsQLr)EIK)O6m9C-W5)x~$i7Jd*%Ro_ zhMp$W;(M8)i%5?d-E)|fk8F%lb<`|*)K?4T?Pw!Dhrjq%)}5zoI?c+(rP#)SKrJC) zhzF@=APV+h3-~(6MVswLICW{G{st$?2h?%2{sww8f`cMxB3gV&Hu;tCRSe+wiZ8{C%tH3@)vswVNdQlWs_{ z>9NBp{{X&dTN%pdx=H^42;?wFcVPyV0JvYP;%kW1SK_73^GkZLYc^357TPvXkRL=r89$M)AlLMLO6ygURnX*$ zMB+$dRU{Ma2q4yxMtAONc)Q{RTDWAA%`Kda?>8qW>KO)q3i4xdXwbFIoY9Mn{{VTx zA3=08j zLl#Svy8(4;$(eJVyNjUz0D$iw%Dcnj9V<`J?X0wAwveuO1c}yTo~+V7@4y4crDxgr zHXD)}B%R6Njevedzs9{wMEG%g0uM46VN3!(*6^=iPniDzDqM~1i*t%RuGd@CZ*G3i zX2RQe0EW0Rp~uyLHR-+?y4TIbQC?n|)ks+4Tgc->?TJZKUE+Kn4xsvwo7XdgFHLPy8W>S)SBara_0Em7g zc%}`OlG-c~5M_q;Q*RWCJsu^Dlk0}fdY$ixHLDiVZS@PU55Z{oibS!sNem+x%grOS ztVdo+&3P0$mG%Ad$Ep^!jgR`P6^{gZ0!sitI_++?O&>{s4JS*A-c=tpIoI#eku5gcc|(q zWunfr&nFA^6R}r6-XQ}1M2g0%snM9cEM@T@rM@fBbng;L9qrA<&Z!Gz%9BlRZx=mI zAPbZA{IQ%qz*fRj+E$Ym&!4tuCc(B-^$dl@b!i?3XH%hS_5*POnKr|Xc#aj5DS8g7aX zZW7K5TPXlMpOQMjuE+0)Gm^SZ-a}*&KT5q0HKRFSQfNr)n25*xW8iS*2)G z=nl}Vew^mJO)tPUJ_V9H_tT-)r$8q{ZAHvsyAAt;AE6i?mC$H^v#-ZL6UDaw09z5p z!*EaSIU_-ic#Ywc@abIcyZbqKjwu~Ae-PY;i2Uzybn-^OLXqe5S}EaV*_~W;WUS_7#9EXqABA*{Cs$~^weyNbWN+^f;41w#lkZzTEwQn)(%^>iVQckV&nyzQ%%9*z z2W|&qpnWUm>u-X3-idQ2qoq7|vPJVP)PTtwk4#AlXq*c_U4lJ=DKHK6FN6IVRmZx?HkjQ;Ef849uk$G+a5 zO5^o=`7fs5J-dVbWLr8V>Z#2C8KQqyyCInPF?0DonvL-g&c$Edy4g8 zOP55B*E^gxnW2qdNjKdks87A;0*4;nwXF|??2B*vSd;^_1V7`=Y)uT-F_N++!0JZR zpVqS@)vgju#iz?N58+732lA~|%=x-p=q)@er9h%dV3C05Bxmv9*J~6yELv}wX45N1 zerV#jD!_V#EtB|H8K-!=#kypPEv}6s0CEJ%RexMptmz*WHHqRdYXeKuw~Q8&RmuDU zH|lFxoYhp`$2ny3>NfIC{h_GGZx8VRWKexGf&r>gT8SJ>{i!=b&$J1r@`E2jaDzVC zuKL&FO@@eMTOC@)X;=_cGrD};aK28%pRIEfc=y9HP9(gxm2MsKW>CILliWwQKhCwf zGmIs3t%t?>hlXsH(@TXcHi92fGD`BWJ(n^bzM~&X)bPw6BlwS}&jp>`y9lHJ63-ix zo(UxwAHdg~>w2}Gw{0Bq-AwD*9@Qd3Ki`eB`KUGO{{RL&O`^5jnnjceYZmX7H@JBu z9dI)3k9=aG*3;b+!o{n#sqa1w_!+H2eBT=D%c^;pFj_6dk}M+~!})4Y;6;1JiQy?U zL^^$ioOqYz^JI|`$m|rwmi!47=2{Pnv}D$Qvt|$rtP-)>JcdjU@9&Kd>0Ys-E|cOd zMmzmRG_}061>)ZBCINfloGJeRzDTYqQ>o3)(aTac_fey)d>PjKXf5>nolE;LL7_IB5?q{_S-WEkdHZH|syVPw`KOSpuXUw%ZoTOuGy6bp)6_(c4 z>RBXgGQ%5g&vIB}AFW!m@rI1a3g4`;+})4ew2ESl8{PQl^R2t`Af7w;ft!QZQX&x8Te!`ab6T2QHRNRaQVx=26 z_37_kOJe%eQ(U#qoj#$cN;XJrrgx20{{RZ21CRUYR{TC1@jd>LExFR3)Pf#3=1Aj{ zj{RkjekvjiFQo3 zP}v!`H~OzBVL|Lzjl=VXN>0c3K)4#GE+Gt^Bo;y(&l+5lqDmDdXBi|;x{{Z3sxA70fy2Nwq zn)B#yY^Utj8YEs@xj)4}`6zUtb7|eEe5^`;(ESFh7^vh{H`t+})J|289@qVqP{{Uln z%2m@LP>B__ghJj+oxL7X(PfXRfhnIExp8LCwcF77E&-y;-*Obwt#4aF!D)mO-xQFHz% zie``Q$bgOi0L9BJZ;!y&#C|CFOQ^@F-P%Vi?=()!hAvd#_0Bed_}A9cT6pi_&YyFn z+4znt4I+6SNNldI4aAn{$2%jIblrj2jC$A2zB0b><;Bw*%|>lb;%v06Co_;wsUw`4 z!lU+X)T3s4SS2}YDP0`2pAEHrFF}gmThgPR35gS>Z)%!Csg!zYy(&pWqcIrblodv1-aXls6#SGrZj%(1xG9%X_S1G5c` z-2VWw%15nwO@@WxJwkb}^&3bm;glH!P&?fDewk^GG5-Jpt(9pl8Z}hfR%eyyUlM!? zsp+QI`vJ6Z5J2);O(BuFr8GIJ-uBftj55t$&?HdP<=J|m}W7PR)VI+HxrD`X{NjyVv z^Z2L3k@*fmM6^ibl00-dY1e7TY*z(7k79-tPbz4O0?{)R!0(0}gYGNRbdQC87uKTl zG`&wxb8rJCmG#TU@V9j`{DHo;ym3vdM9twL4P|y=c(24>7re78XQi#3u7B6wk#};( zxZ50uYWib8g?Y}GuW1@wv&m_14eU2V%a+pS*;XtLg&30{BkB!%e!K8DTZYZzT`I|C zjIWm^jPqQxA5c`xhw}!!w)aT!*M{Xb_m>Qf5*1aMaLS&TlmYryb4{;!+MA{JY;i9B z7MkhhJ{^VzQ;>?+sFH)81H|vQpZaD+TX)kNPnugl1H}V|12W#+Oso%bU1P`7gIDz3 zMndwv>~{A(OKxdHV0Of03h8V#3#-^<)pX&dG+kLP1<`TzEWl^+B9412G0v1PbIViV z)#bx|s%02SuBt&YwXMygMz}b}#lxxp z0C+4`Wq>I@ zCE9tm+w8LdRhCIgN zgZ)^_=eYy(srMd?%3S{dWb%ItSboo%b^JFTIy&UnG9Bo*3b5M}I)3jVnSUOY>k`NN zI@{hPb`xo9Z8VBnIcMGi%qi} z{{W8tYv+sq0EOC4qax3xCHYxDhwS?>K7pA{L!}qgl|pjW>GM6yU9s>Cn&WA{9K3~A z;g8vZ!R5fJz>&S>F{-cPPCaYHwXX}lqSD((XB_fnlzB|78w8Awc?Y#pxbS$=p;+u- z)mBLOCBg;Iuu-4Zy?4St622k$Lq=F+)o&8tI}!zlbBM+;H!@^?4Opx^W2{-z$x_xl zn??9TcLNKl9pKzE;XbD>@88pyZMR#`me zD;#$-LgcaZKA){?Mw?nTXz8gheO$CYF6q~E7_6-3Nu97HNuD$VJY{o&K8Cw{Z-`g= zMUCCFG&d4oBB+`Ew)lJFD@m2^^w?oiG9Fh*#yjDO^shHanNOFgl+nVx)(E-mMDkRSJcU`OB&y>r)E--nbdMQJ_SZXiq$435C%vTL3Z zSJ5+76uO={sp(T`NLNQ~MVS8p3tJ|@J(%bDS1W&I;)|PA=@x$zJUa|BKB*K^UA#eEFRdNOIK~4I*vDhV zaJral$QazoZ@WKpJ3;>dzHyJhSD0${3mdeNs-t=4QDB)Tn*8BC@v~vN2HW{vz>>?V_|^JGj*$UQ}Dl9l>8>3mHE;@ZCQ| zvectQK{uFqEYXsg{{Vo3N91b?_re#^Toi%~KJJ^C9y{THHF3jJOv-YW?#FjFo#Kau z^)sr^9fC1-c?J&dq?AFx`ij=l{7Is;eoyv;+{j1YksL>#zzXwtJTa?VZMf8|o;Voo z5|h-Q&c2A!ya#pQ>nQb6qFvq3I-|uhq8nn3-CPr%I^<*Cx8;u4IcnCFQHx<7pLsBt z>Xs0MIt(^%XK}I0bLJ#xXB`<6ZcZ!CwT~1woI~8{*4F1AFect< z272S=1XeWOIPfjaw%g4%*UuvjB$0<^{0kKy@Elf=g6Pf~tuC#QO$C{TP(Ge( zr~W&d*(coNmKF~7RzLsK_#W2x!`gBm?HhU0F6;Jkfcx^fADF9lSId0td_Q$-3{UqK zT*gnJEtk*Y1#o^PvcB;J-1^=0!EYa&TEdp`ANT}e6n+A{*X(x^T?M$fFtQve!v{Y? zIIlK1>-;BE!O1O8qQA60B4}Z*E;RV=pgG!OXk}b`0O7~!SM-mL8oq@hY7<%Az}EOs zBf5`zYY%S<+V*C;bx0)*4OqDhw4@*Slb8CktRP1rTwqqTWyQsEh1K$Kbe~9 zb(;WsAKiiZel?^q?rWJQVf~*@FJwQ&9}&EHs%h^Aud18)+c`7bNWs0p-dFUl3r)XU z=ZVt#TUphI$gw-7NBf1d`Bkl3$65u{%rA7cX*w{7vSg28BPsggur54J;mxW2ouph^ z$PQW3QpNp_?Zfn~qf$?yr?E>!eR<(e9{8h0v{yRKrs)Ez$$JIQ$_Ju|n;(sKqvKY) z;@QTLu1gNOme@l*oN_?X+fCsNF9_)TK z*LX+bUX$VLzqaYt31cgqeL*n^ReY#M1PXwl6oEo^;L6~>Kz7wr}|-dtyNi*YNHruh8`EZVP6*)^v?A8bg)xE?`GK1^6Hn2c`i&`3AiabggKGA;+P)0b7ZOW7B^9RTuL0*L%stIaK za(z#$?>sl8cpFY=UgFnOw;y&pDB&#L#S{z=P;x3AKgOO1hZcS!@ORs62v&(LXP)0< zdYIynN1vjDUUQ;&!^3}LNpAjaL#FsqigW5EE&Qu~9RO;I+L8X!kV(qP1OzY8GR2S9 zwpn~*swLCE#LrQOS^b~2)RNlc;oY6X_xo6#r1t&euwnQb^G_9gIrv?vmb&o2hQHw- zn2n_@^*4qoeV@#kzmTjgN5i^|3R-L1+c?1ae$Y&0kN6hav!v;EmsX)$OwT(yNmxZ+_)4W4tscDyyz7^!WnXTpbSrSE7AMhhy z!Jv4z;r_R81+J58dv7#=FP{y~>LYQE9y!P#k@{DqYrYcx+tPotHGLPuvsk+ADK*8) zG5QSSK8C(sy#1fGT?bS*z74;U(Kqi)cqLgCeSs2&Bhzx4;HgvC%G`;gPGvn?J(7I` z!Pd<%)F#xLV%f~MS2D$q_n4{t>ni^Mz@H1Xi*iwJblajhxr*jT$@M8Kup`(JUG9ag zc&Z%+4I5dvjqaBS)7{+17V*>W`9Np+`qoE?J{tJLT_#N=n<#?kc$zS+^xDt-g+Hv} z613xD7d7;ex$xcyyg#Q&q($P?XcuhW8n+TF2mTi>JE#P41<0DOM{>Nwny{_7|5u1fR5$$P8uHm7*IyB=$Iq4@f76|{QJooccF0IXZ9q*YVu7|7y5 z_*G3xEp7`v)A+-~`h<~ut!Zy_^Zf*IjIsIwTYArfeknM0xA6K~AnWD-0Hgzs{D#lq zYnQdr{7-6H+gI@ImBir0&CAO6|mC->yd$i%J}zsBm6(-TE#y}t*XAe* z`Wo(Uz8dHjgu`r}CAyGwBEsLwKTq_aZp5zwnD8xV0LE-MzbJAWFj!_Iw8eOJa^(1`wg#$ zA-T6dE+Cdj*pE!3WALvg()=CaHRn*Y)NRCVmMpTojsED4CQK8W*WW2hVNZjw4 zEcGQOI(^wOyI~8>sf?y@yipkH(vbWKADK(I<_whK|ZZ zHa*&IpMkDlK=4n;`y02ox6^d!rCzZ}fR_3O$o*?*(5bo5>MqAFy8X6;D%{NK$bZ&A zlge11_lll=fDd}@w6BeKw?;cSb&JbLQ-ntHt~QTM$h(K+ewEnT+I&aUAIb4QhTbMY zgXHP(2-y1N4qB*B;6I3Vk1nC6=@Fzr7R)v?G@yHq7xFbhOFeH+GCzoKt*$fvrpL>)jQv_g1b%hl%i_Nh$9wi$ zy)8_L*xxEe77w^!%s)Emrq=vZEO`5MjjFii7FS{TtY}B;T<(KRIn}gc>lz1(ygPWd z+7;@^sz5$u?L4pSOlu%H_F-L)mE&(4cyb|asoTk7Bpk$LFo`|XOSJRtTs^OaylJT* zz0x&(E;-cYSuS1&ABUHk)jtS6CHRU(lUUU3uH+*drnz#!f3nXOe_GNs@1tgNY3_Og zd_cdN*jY(zEaQ>4dGj=qxF@=mZ|PE6_=Cp{s3nG*;-|8-l#kvdcIHu^MY~of@UCVr zfj&IY>|KAi{>vNZ<&OD+Y9wZ{nR95v1`Rui^nP8-TaAi-X(uOCRZ);~QAi;)*Ea@b<2*ar^71byNQU z0#Jkx#=Td>cYm}A0!xd{KJPsO*;+}Tqin8W^k0cu<-Yx6PQF=`e5Eb)yPH$>hsa3} z{q$>DQL?(%dzEQWbrSS~>xnUlK3r8sQ&;^ ze$xTZ{0zoLa?Z6_XqjnWL~;q^FA7Y}VW$f<^LS>(#G$k4zI+eLvhVyi;Mo`?cH$>* zor_+1X`fK8ct4GL4aAyyS~PHI)<7ps)7)H0ap(laYsK+_6WQsETqqKcctmzE_O%C zA8uH+eBTemO$k+wnioZsbZMk`3I71UgnpH3KM=vI!p*7ccK6TPIOg+M{WmZltzjNy z@6_EzqJ2XTJFBKcG5lXh%ql{?I03hdxmxXb>WbB zvMna)rj4UFo=z5N(;y#QW<@pX8cpYpb$c>(dp`1!8O*-URUicd38Tt~}(_nrZ zT;ubrlX6z(`|dqg+5C>a4MqE}5M3m2>k2m>NUsRHO&S0yxqKRMo3s~`AhUd_%EN(SGtAixvCJ~QQ-#>}33A+87 zwZ{!5mEyvA-mHOeexUyVO7#eJj}Lfq9~Z{U}b9d}E*Qh438?Ee71mm~GBv~+tf+5*VWeX2=kX=5f#i#^P96duOl@%U7B za+}4T8=nwby16^nJEwD=;3RV_WAO%*T}!@uSl`>pYJ3+asj0&+mho(i9Du+d*Y8)R zX@3$;wUSz0cwa`j0AtRQ-}i)joQ&76c$eWY*5os2(L!5q9<320+XX6b9 z6D7^J?nijbF#QETZ%IB@)%{9Sr#&QYcyHqC_+wW4Wu}d0k+J46A0L5j!rLAHquK?>}oR8|h89p{A|Xpy3P2A#8h%-^(@d zb(O3a>-(u;R&U~#bx+WdQ%j<)pv&H*&Hn&Qet*|Eq|$80o>@W*YoBv3?S(#(YHai^ zIw);{$c9-bnlt|Z0AdAs7mPn>ZCA#(DS3Rb+B9Ex?D4c*f4VXacnn&2by>M}9e5!A zwdlSd)b!m7ShWo$!e7UYrdXk!0sjDX!!PMWzSlaVhow(gMIA+#kM1u@v=^7R6JtJF zd2o-xm^u9`&HP2X6Ci zF#iC1=Qyf|!iyS{3%@_zY=0wHEVVr_NT%Sd&7V*Y=5t;Ax}B8PsTs2|uVze=N9Fx0 zT$&3WTs$2tu^AW5kmv6CiJ!=vnyWX0wP<4!gk?k8P7meQy>8RR9vQPDH?@vtUI>w# zpU7>d>b@`Vt})uSm4`lW!Hj*(1~KCyWjcmLrq#VafdImYy=u(o;60qs4X@@{&l( z0QTBNPdvL76V7e!wM$ppk;gKBc68o9psIS6)%DN%>l`_aX>ANS3AMzi7{30^pT zHU-mDA2Ji>jQeHtTsEn#TS*_4W?*BV^^FsQ`p8G=RTldU3YyG zaF}7yfyO@?*s_hHVrB*Va>>W$rlG%yuD(@mtLef1f{XM571d{$=2j=`{xvL`gYCpo z$H#o~e=%9>q=Jrj?AkMe$Um9Ms>}8y0VNVS^;Q69-!xft8b?W{Yu7P1m3MP25Dsw> zG7tOba*Fm33Vc}9bg0FplUrWLpZNFGAdXaF^pLR!=xe~xTLj5TeR2xbxGuEl&SN)0 z{{Y#QN9FS7jh)bPC!;>ThvT1zZ6Rd5@J+bCEDxV;Ac<6aMh1WJ>g;X*0BZjL3u*Ag zmcAA-OpAw+4;Ul4V1meq%L_b*RqI`@b+Jq@`H?ioeRX zh9;uZ{ETW~X-j|2pMP5Z)E*tWyLqMqPDUdtR%g%DhGY4f*Kdy=0lrI=yqePDE3h}m zi-iXqWc;juTKwu;xZ4VGy!F7vE8C+s^i!W+c%|(n)N2V9@Sl0b2Y(s1B?$fQ|6 zR>wbueD7_mYEVcD5HbG9KhW0ww~BA0KfMl6^%1yC{)hQia;YbIJ ztB6nOQSDmU8gjOIwWq>=5yx>Jvt_4PYBsTa&llR_LQkV0Xxs7?*6Du@{7vJDWqkue zw9_5~i41o)5o|uWnn?yf-59Df_^ZeEm#rs3jx1LzGkN6HxEf(*d8;eA=kyqK-IY00(#NC7IT21mv zo(wz652+y3dWXRUu)XrM*P1s2ELoWX`(=U*{x$kH4~G69MR5hrm9EP%z%4Q~d&kj| zO~#X7@kfAdr&|qM#rKyHuLc{PA?5s~kTCpkYhP)pn#9(*`I%+#_VNqXjm7nsIQv|& zl#HKe!5@xmS5WXqwF-v+0ECfc$KAxT%=q^5!&lx{T1UZcOtiMz&BVcmS~jmr$s0SadXI}gd@P>s8-P~N-*u;RJvzt3o4m%ZSmA~=oIp0)c9As9F zHhws2`tG#XpxP>1I=1XuAYOmoKn-kL{6_IY-9p-}-PArv0y7FWc=cwHTlKHesI0yk z-|DjI&^Dd&96H37_VOS21dz8v_HXd8^nMQ z?yBL2{KvWf6r_mBKe@JDN>SzWTn#E3zjGJT#kQU}*HEuOdW8tz25)2$7o zO@aHRY24@jnc(B`ufAaTnecY<>14XpBDJ_)Hx`c4PsO~XWB8ir2aY@oFln?;6KR&L zgMoE-428e%nNg4BOWJ>Qr;m2{PlsFJmyR`o9;d3v(ko!JcSbZLKlIIIRv$ns>Ys+6 z4SX5l{Wd#oKu33QMr4X>N#j-Z!)MW)JnVMF(A&+=rZMuL z#G31@H00GZpE^x0+UD8DQg>MG*biTrpXFK9n`TnQPFgd^{BPlZfRo&tZ`^5`pH+KV zq-it%09?#P8=k<|%YHuiWo@g*!rtvAg%8Op!#%r!{?fENe;n7^)9IcHv14z)PFtxC z2ih9mss((v@ngXeX_l>@4#_R5WUE`WuF5^~&05l_QM)@HjSOu$J8FD5HGA*4 z?A~AZGD80VJXC9cJIWDBQhF}#KQqO3R}tuMF^)YpLP5sUxDohfx3r%IS?VmZK9zCh z=aCp-PvUs4tE9F&Ra5_jF2^K^r+cEARnXjT^@V9^`Vj|GsjGloa&*hYF z=UrBv;NOSq2a_0k8$Y{%tX=9%I9D|rmsWySr2 z$NsJzM$ztJC$=~{fA6ZLQtLoCA~iUf2Df2h;6w zpf<>KyND%U`Dt+%lO}z>UOxj)GHqz}CDbQxg#y|YpX^uCql~UEtr#5pt`F%|SHsqt z9LfEyqTO4-{CVyT%CEV{AEjoGh#FnR-=BGAByxY&NTNbN6NatJy?4TzxJRDq4>)kU zVVz3*XU^OI0FKl5zR;Z8)ey;RrhTL>jmpazKPQ!LqCx)v0Na|mec@}3N+4vuyAgrU znPNU)z+~dOEdu5(0~fZpOCmAJMv*+T{_^?pu^(L5b9M2nR+$#b#+b2zg!>#OH(#kn zlRuS1ljwm-_dK!>fp2+cx0c$%NV0RxW;Xm5LWlX*zKigZ4LM|yrPA)?Q}^$jVF>>K zWJpKm4Q`K!I++f)8o!VqJghPX!R@<)Sy1@bOpLXy-SyP=?tgiPg*x@ZwpjiqlbuFg z?pv16#nG$7qTT3>VIT725DoOosINZMb)SflPGFs&4tV+3lm7sH*GGA;cn;cdZCd7Z zZb_M$06$29{&kUg;_F!D-KSb3E-)DyL~MV+lpofr4X%T}NE_x_cA{v+zz z!CQOl^J^N9l*ewWpntm#!Bx#J#5mn-boT!M7XB|AX#^ z>sKOw5#7%u?f0F0wuFmttUI+0E%4b_^DG%Ow!+=kz zQrI=|^!nB7zC6c}f3*95k*3FYsoXYN>NHW=-#Gm1ML8|O;oa_jf#}x%01lQIg_YcQ z7bm+is*j*YB>q*@>K+t_#Rwp@xx0aoe6MV>e7}G}$JCnm2T9g+t3@Agnf%o`5DS-_Je%v) zjmNgq!IcKtA) z*0eOQj2;=bx=Wom!rD|I9Iwj}EA-0dwDz?7lIc}jqf1B7J~U{d99?BxQ|;eJQBe^P z>5$#DlG2hBkrwGr>5yhLn~HQyKtMp4O6R1TDJdX~Mmk3K$gz$2od5H7FZS8aIoEZ5 z*EdbPh33@6SrkwbAk|*M*9wLh=Bf`tSnC@%ZlwsVeTFJoUiS#aoF{7kopc&Ef8lV= zA^C3~o=kVs7~c1f?7@@cQv&CD${36BZH^6zzD;8^%?77hgnejlq~cIdi?wouP$Gs; z;)cmGK#Oruq@73sKiShf=d-71rswnq;`negvjXh{QQCV3XNtL_C=&C-V#YQhXu64nm>X~;EfqArFpDrp=aQH@c z`?|w8<%3dSH(sx|jVE!SvJHJ%yN%MXV?dj{y)l(47J1aV; zskKl+Z-BSMOr{mXss9cUP%+a6>Ho+OhJ;|w zugRl$yx$W*?Xi8(25@JdbqP5^QA_gQZ^`_J|A?5F+DI#%a~EDK?$VJT*m?yZfP~97 znQfbx{B0ObsPZ?qkS9A!V}87cwpPLMg&Qoo%dcz_`ZXEllJaO@C@XEny`M zTQ-cun*_{)_qL%s4IJ###m?Zs0pU2r%eq8Zy8o-3oYoe$VrX&m4y-Pwv&5P4er5aK zGY7`0U(bjZdNj*|a5x6lrQt;^*QMFsXXBvB$XIh}brwe%W)A`}%fWIka00~&WRK8n zG9gO60XjpYffKi{KCW@Ot=x&{AK6ir=jps(m6Yr=TYuJ6u)c-L?TnTbS7EgGD3llX z_#10fn}ve-xB2SFbt#$i^68*L&-=jtOloUtskXRNaPDRxFrFj!BWAc9K0j|~fs_6V&V-jEOxy8PN=`F8&WmyChnw>(hH?7gAaK`WKl?|)(O`j)az zzK|#T46I@?K;z-+KbYSBO78GHk~BYQ`0VJb*^2XB(ZFGl(l7SLO`AvvQ{35&c!^SU zso=F1>D04Z5yUzNcyF!;)^z37J37lj?}EQix6Tvj($3h(q3@eLgU&x3wYS}qeCRwZ z9!ekA1^hKmG5pwuhie+|%)^&3O29KdZz|{1ZSm~mbv;{~Chv$ewLZkFyvf>#qXv0; zYnATM30;No%jZEr7Fcsh5?U$!WEhTpzu9fkpFFw`(G-`y`c@eIB*Jp=p6?mMc6Llc zn>xK^z3B7g zY~EHZq>NT{RUB5d8IX|jM6xj z_s}skXo-vzpo~cbJ%cm%EqmB@A;`ncD{Xi}U1A_N;+n-5I!Dzg2*c%8XFS;#$vuuC zkc-&5A+4K@jg5@=inF*rJoT;$Z>Vr6)D8XRd8Y9Y{%i;9aQgZ(n~iFubQ%L-XmpIp&zqAEHq;*SetA(q*#7_`hBiOc^03b}%RjCG-@*-= zwiBok4nbvF6blW)KEP}LEnWP!>2hXI+>eCixuL}^0*Vicih?!*;a;yYSG2S0DHWxh z-X?mF=jW}@U2O_2eXVM)IGww5Z{)A8tGddg+iQf1M7Gn?;G8$f?w@nO5KyA$k>%>- z_tnEL)AN<&Nj3&Q7)L!C#mj%j7@T~Os0&C6w zz6F=EEfAISsEDJJ3{$4z`gdbvTCQuI0_!=hXAX$a&9i+M{iEa`sSB=jZB3lK8hxKS z*0Vm*0p#Io>(V`2oXtVca(l-_r6W1@`^OB?;J;+m;Fpt?>V0`^qx(JSQTrpu)&Iyq zKeQ>aOCFCw$pRfUhozgX?KXwhOuZdE2|5vekA>_%y|s(_qdFgS87U6$iP9}5YGHd( z01fEeQ*8SOx5PUih)poN`mkvESn21aAR;c0tz$e9U1o0mIcCUPaje%2NN-s{U9*~i zD%56=^cQP*fu2fdYo>IDLDx=jiF!N!L44KECnc3&fWO#(#YITV^ZSPgJm!4=O|EwgU;IS_hf z62Q1KNF(&Yk$3C?bfF6O9-|$?M5p>@@Ifl9?Yne8$YQ`~?cDiecS&nqcyma_j78f3 z#Bva@651t02>AfANPBwgM;$6IPjITgakMhPQ(%m7j(zsaiF|{6>@S`xt?5x2)J@Wz zxdBJdQ2dz^)+FQhM?&~u8qU619(9L=W_`5{xpT1hlTelU5q_0zyKbhHYg~m0nJOR4 zsnH=O%PKfknOmzeR<0(|ipYJ7^WxSZ#e2qV+^G~qCdiCG6B;+k&?MQJ^bTe9Z!v3E zE47uIX5*3p)6ECdN{)9(P2o}u&Am)m)ujxJX@a3)Lz9zh#b8B;WvZ*_!UyOFt|4q@%l!)jCLBq?~bAM1b@5t<3t_awjWi`cASstIZPf$c&wUc$<+{g> zs{!Lb^|Tk;fr{Thmnb7_WA|fkR!<$NtUW6t)~ajst^7)kUH;3Xsd9`aPip7zMkkBX z+O&_#J^sHMCy)5AMtn_dyF<_6RXSwN>B1`ad#B7DeE@d!Zn_?f&N3qiDu%s@pLZKg z@*6+sW2~ije|l>C@d^F_sdd-eTy04_dmSfa?+&U(b?0pPlG_g5Qc{awSY-T1=KHbc z$;FMS;%Fs`aGfKgr1HXS@*7TB^=8a-A0r%6?xx}H3pO>wdq!q^JW7ItRNper#(9RY zc0d!4J87n2GtT}K)!OLCsFFXvD_A91JMKkRnBAI2WP7xh@mAtN~E;T}2*f{JIo z$P{^30<)W?nhPg{Nk&cQ`Rr2r;wBgu?;kBzyKMkq>`qf!6ny3jT*mF=1+5U@d%5 zH`5X&q~az1W`2Jowb0(5+m11dG}uQ0LHJw4CpzF){uy8x$(R5t=;{aM@T-SkEjUQZ(ng+i!)UKQa=Q-Mkzz zAD3a^Q2%qir1^2lLYunWX7dw@C?O&&G-fYJ@^^kvj$c_UMeA>4^$o$Xx&?}EIW(Sk zq9s&oUNR2K4NBf0g%frv7ACNMY?F}O73O;_D?Zg&*z$_$&#p1u1MpOo;>b#PMt4B#DIPczT1i3-Oyk?c|Oxu^7Q zl1Me|)1R#YGB9tyB49{d@wtZhJ7GS{xASLg%#mkEQ!K1kkS+JW?F_tPeLuM?K|w%T zv|{*2z?+BZvjkU!?jXGCvBlhuwd_RwT7`!hQ32PC#0(sLRO5!S zSG>w^R@5jxfHL5E2gGO7zvyYadZ`=D&A!$^*0*bGu${+PH<3C$h<(Xg(~>mOQ>pXj zQW0uw1+Aa)0NwF=T}`*uK_PPtF#Wby-^VlX4VYH!MlQyaj?;ms(0Tf72mLlC`f&Mk z|Gg*kzp2MrZ=sis?!#F3PnV(>d8Ry-Mi$vx&2WEG9vSG`H52;gSdf-jiVyYH;xjoW zIG7XNJ>oyI?ME1_rk-i+qVWTS1mrMUiCZs7ioa33HOYwrQX%2dN?co8V_S>j8u_m*XhXO+ci8X4Xw7Jl z>gTXi6oWzy?FE;c)54w~HH=Q*ttBG~!j|yO*H`wY;l9{QJ(rOxn$u$Rnn5C>8^GPY zfM+*kxN@~pO5~QFBV1yM*I^D`ZhEaE7-3uOIqH!iqoKLT+1UWpN|e*|O&=ql0cv`W z3M>9ue)voE<(GdHe(3tu++Ru$mnFvk zs4x|D_lDH>N;Rg-zn87gj=*vCRAStF$Xn_+`yqkV)b>cc;G7wT}_SXMXUmeAhv ze_r>LpDX1UW#bz}XLU_R2eR63VX7IY^<>s_)AMEa4NG6e>~Y*fxy5h^M%T~anm(mm zn!0~`S3lsTgA2sxc8tk3;`DuY>_X zFzvg&Odbm=oEhRY2G5I@3qrH;7ur{4d*1LF2=X3p;z~ouV64+GqL}3gbWDjQ9()RU z$HolFaGkh$&UOioEmTmtgM|DwsxwiflXrQf|B*f7|LS~WQaES@{6Tn9;gHF7kS784Mpw`=wDcH#!mtUI zIYPx(92BIUbjje2v;mZPZ!>sUk!^GL&_-XnR8su5>X*^}@o+3{UN34q8`9qL1UIsW z`tbBkrM|*Tm_9m#y#t)8tTqY3=jU?c16y;Opil)-v7F{-yhJ3zjk? z(b3BI?5X31Ug`?QOk(f0Twp@cK5F9Z(uX>Ff{(OjE%+aOqaB=FBKIc|uQxDYOJJLDqp|+>vCbUuUA{ZCN=~6p%(P!c zn$E2mN_li|7Em(S2?{;6fx0lkJz{l&? zQR%)M+}OkJ9LtkRcUG-!{ay_ZV@nNY+L^S$6Yvu%51h$AG6Sq`Y+mGKDZ>W73jWTLBb9 zyY(EGWOq^ROTD}llLFDtO9*AuYB;W={0bUT3zfOjb3N35m{fg}eT9qlcQf{Fsz@Re zZET@l0oI&C&L2I+D+e>2PDQFDPD|Esqg7TfVRe!v2ioBUb*U~O15K&9d$!^z(RGru zVV9;ncUm+JZ4Wd5t6Gy`>DziridgGgnO|+KdxZB|oZ2**|HKSD!;r|kKwVN>p%gvL z-}H(*v%_RbkF60WgLhLeR@D=2);bc-6~)Q>8{%&lCgRtfOn;Y|;rN{qXD3gBEznLl z#J>sRx2B_*SWfc6RFcYW-0i~ZBUn5VbOqWM&^!D1f#v+$%>$7w* z4Cru#k?%GlusRJazHiMSL^btIo1Z7U2j83mf_9s1G{}hkBuJL znUi6*tTIh@K{ik+<^7=xkMbyS;uiiInuG$gg55QX6QaO)=_qyfO5*x;5CVCTk>xl_bfId-D)pNc6A|4c65RP0u-osjr*-hpR2$HcK8pSX>M2(!J7GmDQ;) zs1VV#H42;C!53C`se~20N)#tor#HO|yZ#lkH5n1E62>Yhf(R&Ue;MdV(|sLQ8N83| zMKQOkdA?47*;VD}PAKi1CV^LVdloFDjwP9042k*$vfM|?uf)gAt=K_^(`}D2bj(bT z*-ggO{NwhcbyomEYkOE1f`0!{>V+lhepT-6RSj^>hN^c#yf)PM82X(gGWo_r(X@*- z{YwRSdS*x85{9Yzdv!BpdIoaEs4H!X<@o7mEK+$u4PF*!CmDTtEzFWugfKj9w7?>| zF4-Nr{dNCiG5bca{{}V`hY74yDR{3)3o{lv38myIbn$rgM6|8$39bQkUj|2uc`rii zr%+y9?=2>NFX49I;ip4Hdud{1M%bjM&x-DeHEg~z(t}n)t_1mG3O6{qFFd^C0NRBp z&y@8&qBVG}uj3lxX9+`hFycI=t>u$y{+0}u7ATCF3J1_pA@yxrnMK~@!f@xYgQ0Go zb@M~Ud8j~@*yU8W+|X1sgSY*UmWGEfSc~}jFsN)s*2vKALQP?~Qyp%%ys{PM-o+#K zWDQ;Xk~!k8oN)q8LI-mjOa!ghni>f9v3$dFdU7)VPkv;y}MJkC+j5H*7V^W?|udyaQTR(D%G!cI1I6xC>;oE8#xqlX0J%Sbe1?X z{(vAtYxYsDmchRo+eRu^ydnqdQsVG?x7uVop3qP>Cv*ntO95IYslniid9U^9pTWyDa9194;hb3X ziq!g;W(kf)e|(`OBYBGSBqFf&F)`}pk5id-HUD(8N|9g)yay4D4=h~Y$&~ph`*eY8 zK@K?8xxvySs8*1SM1HJl%iLdg#!UY_Q$ENikR1oNwFwGKvwZrwC3#+>z~wgwdz8lc z{AUtma~9FF6#eA+;Op;$Z-Cwm#_P2BTP5!LBzn&a=K9A6h}BT)LI-ve8{?!_Otp+Q z%j^B~^t|f-M%FS$HxOOb)=#(io6RXd zo^|wZA8Ku^_I!#!D;f8#J_O3V1l+TIm2`@7ip^Sm6h5?o3VN0C(*-z(u9lwTI95s) z2L%#|O&qvmB9mLzydkO&#;tYO7F@dYb=GFIA>j)Y#8<5M!H1SKu{)*H{0o)}%#lIqzyh zFv7;K z0?h6xvbq(u{v+$lrLynC3a)09^Ud9U^A-J)lbLu91SAd-ftR>Ot)Nd^0zubKo2nU7T0fxLQT2 z2Qdkdp3NBVqNsmlNddo|xfM^2Q*6{dkm0WuI;Okj!X1I^`qeRsORpg}5JUJY@<9~V zo(op9{Xeqs>$K!f$zBp8@9&Eo?>oWoul_V3j#4dJ{bN0+?xUWW#cQ{-t%{@;JzB*w zYA-A-#KYpH)C~Wk`TvnI zSf%^=Y8zUFk@)ROix1Z%BWY@9c_=?gZ+zNM+Sp{Uv-4?_B7|P1-YT6TG~|(2W(a-`|{p7xsWrHDHSoG7)^9{aoCJwgAw)PAttM6ly{E+cyIPN+#Ff#Y)V5DA?$OoVsFTJ5Vgy{ zX2n#oa_EFNUZIenv&^yk5rK$pU2B-0a&)?_qCfo$Qi+a{d+TEFtNbvK+qMr*WQDjy z=N=j$LET}K@bDPaxnl)QFZL}D=Z@E{?GETi>+F7?+x~eK9xZir%DRs891RIMbF~K( zgk2ls6<*xxZlZBi@d* zd9y?-?1g-I2w^6o&%G?b#NgGApl0oT$NjdTPaFkbSnFMue>-qEwO;C6ZR7#4@Q`}# zrpcS>?7rrC+=)8NiOsJ*;%RG>3>oxhbCsGdvumcQiW1l3$nH?5FJbD9;=Q_?R=kr@ zt1s*#EQ5QcKb^bjRtP52R$vSUr8jxXooOxXlbSEmh$oY1-}tQ!e!gfY(%6uB^A*J|n01lUWRyu=@zZ z6u_ryArC2+33Du`fDgh#U6$pzil^~Ekj}u`be{p0jFOof3jy(j7BB3z&1#a;q~o(K zN}v-;1Y>&*@l$2*EhW^YLpO@ca4MQA?5ydZ_T(+@IP+uY8ma;3UtEhnzR)6K28bMx&k{XiEsUSsmW)XVcjTyjDqr8S6DhsGt-yIL zZ_^S`pAYxMk^gD|5U9G**Qh5twskl{n5%y=E=;HKbn%21cY~{GCY)mB=eo)rG=jd~@cb2^`f;(XD4K`i5jbWLN7Zv3s~a_@k?F*WaX z<2r3Ly9YkfUC#QH71HHrGazf^LYleB5aV`)tz_1@d7cSr{9)FOxVIxKmqI=o(MV-X~e;2Rioyhc^ z&k#m^zNhdLEX4XdX7%i>!?^0(e`jO^h!QCUbafd-xJ)UyeXQP+qG!MEqc{xx;!)QL z*|haa1pBU`fM%sq-rh4RZU+4``>yyikEPg9XsP>%mi^5>A!i4`r%UGX$6NA>=eHMU z+lxTiOULWkpDZSVN-DTm;rkqx2 z`7g-#Y%w4FPAbY{RX*vySERwb`m;jVXW7atFs7)zuv(ctNGn*@PvVTi2b}(@qoB|L zUz@|KSdil6;3g7d_TnZPP;=mgIj(%jE4tErT(Ot>=4jMfU=XxB^ak0xi>SYGfV zQ+9#z_dl{z=4khx!`?~$dqIdIf)`IJ9c{_(DicTP^+Wfo<}zm98Mdl*L8DV_;`S#c=+j+$F7?K zZQ;({6x(hu2mSsGQ!<28f-3`%1VgPrMe8q>pC3pm0g&C;y=M}eV7g95OmN^hef6cXj@eBjH@4^vs!SaTuWxCwS0YzxbS zk{)31mb!7;DQZ(Aa`j=w&~mcUhe?{+_Y3N~ zChxZrt$r8BSzYO9Wv3HmkG*)z_gr7EuGD+gA6aV2dt9c z)%Y3!o3&=?t%2pxeGn#lSd8xCN5l>{?J4M8;UGr|(tX;{E;vEo8$&@NE5@_>OnX~v zLZaU8e#TH-lACo(_e#8t*si3tazS(^o1Ie_x6g#Tdp50#$6TeFo|XsBPNdKtpY8o* zCxuk>Xck<1{)I-_khc}o@gWS89r&U-2U%e`tmJCKC0};4Jfo%H5jp>7ML^?nhN|>W z@T6URj>-E8Sh&8{kH=AR|BfUqJR{z6f75zr$ZK>v!$z`RRX=F6^-*v5Pm1-17FsOh zqP%J2C5x5at!uGYg2R$aRNFz#X7w86=cXt02*NhKslNBol&oPuc4~>D(gFBXAXy_z z?xRxzh}q(fmQ^H=OPeh>4VwInA>SL5bgOeuhq)_qai@cB=S9Z&VSXCw zDX71k3l_s6)Oa)FDKF)M(=!;C>)H#O+=>W_LZazN)o+4D|I@yqrac%jfEI83ndrYV z-SJ@VCHGyw^8fyWmnwh=Yo>#g--9#woCrJxNb4BzApK;Ftx9xVE9NR@6=_@}p8iOw zcn1~<6~jdYG_6GVzZ4gd@D8$1<6m8U(shDV1FNA{B z>T(ZQUoR-mDvVGQyoo~gvkGT^|Hx!cR!jNt4}LV5ydnIOe5kZ>-?Kh~Z}qI%R^;-I z!>QinkTpMC;crTkV>_% zlm4@GH}h222nz!BLfB@oIQcaE$YsixABT>iL-1s&FiUs?4xrk2$iA!&i}KCWoLh>6 zCQS8%Fy6O=<8Q)sC&RVZ)$*JE9?pB zdwbAx9D13>o_0RiZ^~Tk;(L7q|7i-%w!x<8x>&GVpky5-m}*J-O50qND^JF)_7_*g z-A}*%S4BbD$8qauI0M@lUof#o8C8dJQ>fm%|y&r;U>A%J}SEY(frx*ia`vC zoX20?#3tpYRwQJ?a{$C zUi0avq5nX(S--9X8JAW~qw8-Eb>x?BOZ&9`J)*p5l7eQscyAf%SJ>k(q}wIm(-HP0Bs0)py@GxiE>i#buz9L&2_Iw8-3I7< zvIIvRa4{ud^vZ&vZ9L}%bb+DV4)&8LrElGap$f-usH1{z&hoSZwKd3y^<4f;1&y`n z&}bjEe~(kpUlpdYKeo?#IZ^nL;C=l1Kj8aH{U92JKwh21_#x?$`vxs_{^~9o~{D#k6xj@XStazK zMx``$wL+$VBHJIyz2PRkgsDyA3S2_3aO-|3de(P(|BV&NtG7uF%P^XGF-_a*lKa*3 zipp?8N|6hwa8VyW;D?glgfX2^!_xg^_C8SU|;8DLuXFoL;tcIjyH! z)RmVcKtqIdgc5fW%+lC&)&M2dlFFrV2~kxD%-NRGS2d!(^T;RSMoC`bGJ|6VVei>P+0T`l!1EFH~MxplbcH2c2Jt6|I{dm|~Trb=S0KgpoT-{5b!knUM%)T#`` z%!waty==6O&5Xx zYGOA1$cu1bAO#$n-WBrCBpJl``@yb<%QPBDmFK=%h|xdKalWFYGkbuuTrP{I-8KEz zDijMoyJnqC*|aNkAaU!Sm(XIX`~t6BIQ0(62-bp((hn z$Tw~?S$&ncGPwIOG$K<+^zx00Wg`bIw*JRG5(Adre3PV{_TQC};rWo4)ZGYlI#XxM zmoEjcmY!>pjQzm3JZfk%n25;$3h7%EY}V`WW~3Kn&bHk@KU>_LXpA(*QvOn z^RKBvOpIw<@E(WP_=zhQ%bTS^N?P7Gfokfk{4wb zoK|)DUj0Ujvjb0bJqc2&RE?$OA}A(*lOnn#6`EK9AG_=B>P$NluPTTR)bQvqWjDIgfsrpK>;Q8>yHbmSe6^ULtk- z+0#e*(cpXWzLmZNdLOEl-B^4rjq!p(mt)48hgIP<@{E1EHY@oy;i65A$7e~RRv8!& zl=mlke4{KAAN2m6s8f;0D@51EH!`R`Yn=Vp+=4xjso&r76$FRMw`Z)6Pe-|c1998& zOBfjk_>XZuR=mpy#VI%9dCNbtCsfjNT_^cTQ)%f3KoHFqUrz4Roi&#;^TBUt z&N0{^l`$^~ikMk7cFzn51^9!zM-zzsG%c=5K_~~V8upzI+c`ZDn8!LY3liV%dPeas>ev54xY~_r6c3?Z(v>ogMgyCsBr^Xe-lI8tlvt+9Rlwm;L71+)ec`@#e5l zrAa9=pS2(pBYY|SM>bMxF^&*P;WCF@C{;FMmA9b zXY$v&ySCSRFi0j#;*Z4^(H2gUhruA`kohTx*SFTcW&gblD_z zj27dZYe2SBUWkjvSDF~IYs6ByMKw{;)=5Mm9Lv_zBFHeI#A&I{g7Mt{;pTf5_l(%% z!@AV%P2uh}x{L3Y`;!QpQnQ&71L!m(J7|G($D@XkHuI8_JT}V9d=jqF50y7>l8*Y& zrtSYE>P_*XI*(_kUjBxp?{E$?lH<4C%)CvT2@sDC&J( zyBB!Rykfo4gvG^Cplj*2uhmA>kxC!aK~l&)z2^(-Ee$I03+>HQ~GDsM|0LfD^Cl>k8%$ zjO=PS8Nft;6j46gmf6)@@s7-6NpQ#I{FHn9De#?HuP@+zVP0)_Qh2!1F0eE(LgKK< zZ@fG0>*F5aiGi=# z-B{kt-iJPIPgL$D&Oe;{0lTg5F$t8Q5f$FU`1Pix|X2KF{ush+2 z+tM79$?iWgVPVgK0obxuip;Lnai!p5=lk?C^?0{D23+e(Yfr|(_)A9$A)Ce3{Rxn2 zx&|>RtT?J3#ir>ylsTK9=;A(G7>}^C_Ql7qVN(BE+=+CSidbiz3X#~+Y zbLu<4l>`wA{zqoM7Gj&v4#c&gwPA6n2T1xsj`ASiymI=*Ad=iy08e{??X3=a%)whX zRjfSuy3vLI$S(4%BD(=`P9yDQz^UCAxBvgFP()Q9P zA^II^{cDRUjBvqT<%^5Ilv2=NS@-2pV#0FT1&dj9#_SS0VYzP*vDlya&;*QYdf26O z1=%^d+m##AwS~OXuptpI?Hw0cw3B*xz9c7avt5Q4t?fHiFnSRoNn(ijh{up6?R?YJxIDY-& z`~hgxlm&TxN{N0)PBPkT54cxFar7>5=X8;W_H;5LGh(=$DyWb5B zlUnGs?|l<-43MiYILdUZ5BW*){yC`?m@|A#8~2d0XPFn-Y_^Y8=N1#yG-Ax=f)i(l>-v|3(c2)f4=@`%tZNAjO*Ry^bcGR zrlBx6Xd#$UK9%X6gdm?{MmX>c&)9L#cbZ2*&h<~CDwM=(GCV>m1Hw}HjTxZQV!X&f>gvhlNEy<^aQz<)cnIt52-t7k*BY-&B>g^{^tgx?SU{dx%i__^Sl#&x1V zyyLJ}!B}0w4a1MNM$!Gs=jIBik*R-V#?}YUwHD=jdAch!>f1d=K7(Z#Iql{29bc^3q7yucKk+%MDipE}Jc&$-jNRQ}sRHrSyiJ;9*?Lpz6a z0NjS9m>dGZDI{F6+^Xw-XN9|QU~<=x3%Gd2RtDV5_x@pR@a!r~uR#pR%-|zK3^yqn zVjdD})2NFYwGp4{Th#iF$l;w;_f!8We%d%3h!6w!2tLgZ6NFRmm^>!FPL+8INCNIE zSFizQ={o>L==I@%XXm8Cj<89#d4kLVOcg%v&sH$ehNKBc1gUXdlcooLpRyXl&S)=1 zsMfrIfsQIY1>Hr@ z5G?)|QK#{bY;W^!+?fzG{e%R^VtOrJ9QwY=4s>F6yrnVC@i{I{%2E&4Ugh3OBq(xU z~M-#XN2^L(OvLnK`G*jQfkLSwA+?`?knlfr1f|79nR-nN3++6I!{+J?VVx~Y5|O( zJCJP=g`AMRX{f{}6&8~5w{jv4F3XW|W9ZExH#f=5oP(lOpz)+)ZXu{IyO#sRu=sop zRvs_-qBo)|x`NregKy6I^Bbb?lO`VMLC7aDJdFZ;tbAv5&*d!cLQdYA&1|Ib#l&8I zd;mAM|BE|#=1cfE&4%YE{zTE)baJr0X#HT`=COV*A?LoNsPiC-KMqALNA~E zJTSt0ExNBS^nTP!GVPvD6@+ICj`jRfRQp@`6O^kvnW+Y@u!Z<{DTHC+JvRUOd%#Kt zuXA<@iCb3`EC^6!0y3qUWv_#D9+<|9_?34bmU8Se`{BImA4RGKnR#mVSsIw2( zq|U;SUxztvTO_2tw|XAfxcSaHFKq>paB(+zmRp4bdNo!j0OMfnXl=#DbhbXS89p=; zGk^DvyiWMto%3W2Sd$s590I)*mYJ6GY_=)65N1)?e*dlZOzIE%-c)A!)fb!Xcf$k+?&6UrYt!vC6yXvbxrf4* zX7%C^F`fm}RB1aeg^4?VrcIR|Ch0~W)Vs}sTQ^)^IFN4Hqqp@+7|yaF>dBfIFv#3I z$67|M?OKzAV$&DUg>FU_nA|4lDXvf$+or8O^t5^bwGn58$M{N}rs7bmRyD$F89^7m zrI?6lr*&tTM8xUlj7eQo#&OO>R&Wh6`}Hg zcF;R%rA|}nxG?cV2mYL7;6ftwI3<~Og$Af?boGUHXNo2Etv%P*+#ejS0N;FCl}C8q zhPAlL(RGDF-$xwhMV#O5X}ZcJ+6ECOT58{!dGRj%ykh)hWok(w5SGnK(|rXq`Z`Do=@8T)==Lz3OJ-9jl{;|nNu}l7Q}AzQ=FI-A&f-aAhNBXnG-Xvr}=GTs|2tH zCdYpn(0~e8Sz`Ix!Cgz&qzZ2IGv=0BB8RxFE&2o^$lEInM2R=Irv|Z0Iw?HU0p)7k z6`73sUgV@peG58VYqw963{)saT}{Gx9i3RuUxzwnhPs^GxZB?>(_AmBDkvGE2G4gpaUrNYPokq( zuZwZx=n`j5#dL9iJV%i+NN#5^Pnv=bhvHA`PNY@12yWUl(#Is58|WM`vP z&&H9ZgXmv^V*i-DEPyN<3U($I_c@0r8&76I^Av)fv*S)L)b1sGb)`JlH!`U(QpTj( zP;SrKJYQ&NcA|9_W+J+NwLS+w1YEmu7}c%n-T6^^)tqbV{2XDD->RyVd?FC1`b}`+ zZWals@8ZCACgHsb{8R?gSw(Oe2KAu3u{K*Z5}m@b@^ERq(R&}|8Z#{#%JFy8T<41@ zbfM+_dunYBD-??pE_PgQVgFByA`D4r-Zv>{bC9E2tnjwqd2x>a9d?vViJWe81mVColQ*WT_?( z?$X;FdC*7Kidx=oR03lu;CC)DnTC9s%yP#|nQz{-aS=a%ZXbNbyXIX$<>vAnnwhNq4<-PqU^FVY?!j2M!*C$uRFrE{t#$L+ z+0Ddw?pC(P2B+(3Oa{E#?T1&wcXH zWzt?Av^=l~eV*GZ9K)ZWq>st4Vi2nd|Cn+^ZvzLUwBk#sr-2!$w>rJx&9@1M-Abi# z!JmKmGM5NTzzUH^E(3wC20WiS&%Ao5BihRTlAI) zgB|k;lW&!=^RPe|h9tN45S@P8B(Gs)HpV`l<4s9t>K_6!SN36+*@x3Ftx-z=?JCaq zM;&{(#>*V2_T(90>vP1Nh27sZNwcFwVE51b97MeWkqtnZKOvMmkd5x1=Fql%+s%Vd`pzFP{;P0if*5A z%p1rgZDvGCwr~VatfO4I4D?R|pXzT)d`hp@C0dt8Vg`-MSNE)FDXejL_VQmM9UUj7 z)zXQuP)dczS?~A<^#aDge-39R^AhjTcT5&AA9ph^w>CZ>J1+%%ovl@;D_?qX0q+Je z%5oVtayeUyp)0$06kRUy3b#z2s#hnFwVW;>6T=6BC=nUs7-<^ED2MMOfeZhb+I2rM z*L$}39NckyKdSy1G}LwAvfBZNqM;xGc#}Q9{mbj9^}e^Q{$7-oD5cUMM#~`LP9`( zTfUrC)ys-~RqZcj7J1*0$sdNlI#y~*}<{9u((l#&{|-E@UBW@i0ibHr4Epz><;=T z$CV1RhXjFq1UKO z4-u#8r;gcqjq`S0n?ZZF9EW#ri@tHrva2f;Cbgv@PyxN12Cq4nCrX7QRSLsqrNeDr ztXVi>wzNGStNW2TX&t?pTA&5Cn9m zw4Zw)lC277e06w@pl)^oTKDKHG~>;12*=r3tR#LW$7>&ZezodtXJWT-gD8+xwSzMv zHF=wBetJ>WGhumbOL?~tA5FmY)?=UJDW6!QowvYgG)zq8s36K0kx!|PN=X?H#{r!^ zi*@W0LT2k!DxXU88|m0Hv6&wx7CAaW^j`4L9SepDZjqHjH-Cj;3kC9yq{jt!*9Fq1(FQqYN?);Su^6PLauU+zCUe<;X zuukFAq2_$@^3fwIY4<25q?^;j9QIxkn`PFV*>EAd1-i<`72-mKX^F2;MfdM?%B0nZ z>+DhrSQ{7j8%yXYtR#IYW0&zc@X{Uj8UF;Z(p1HbfW+dG$B+u$R&EKuL=sMQ90N{+#>)sOlb zS@()Uj-WXD$NkTN*9X?_n0S?{o=2ZB7u$# zy_;+Pa7chRBJ+>3U-q#>{Q>O^@5DCu4T)i}LEkpZnHf6@KrbfmhJ8OJYVWS#=+%HDFSHLmu zG`)jLimZS0e^O-knwE4z=O4k)y_}Fb@y|?#ROXq>8X@L4%9wvlM&(YsYrQfSuV^L6 z&Y{8AE2&7OU(<|dg8!JbGgL6NP3wZ-W<7oU<=&)WW8n35* z8&C_uiWq+&Oo<*2t!YpF#GjJ&?)QkeLIlT!%xOl|$@q6ur+My+^zYUm44?hSwBb;l z-Mpql>_lI?)%_qCHQu8kc%&P=#*hKZ%$sQCo!oK7;7YVAdhLyPQa@lrJYpE#S7B%`Qh(+=(m z8eXR>QryH}RSwKY?vEV9%-anPl?)hQuil*$j`^H4huw@Tn7dDYHP>n997=73DSdWW zmfe#mU#$^F)q{Ub1FMRdPY90L$$53p4fbsn``Y}fc-iPHn<%)sXj(fX^SjsiKp<7j?Z(c7Lq&)^ zXsjk{4ywg%uRXsv6Xx@HFzFU!;x~iYKiMhM7U}Re`#G#>se@QBK56g7v0*C2zT8m- zmlQ3u5@S8aDY5kPoF_(CC-rtuO?Be-isPDRob%kA_J1$*{bf-M7&z_>PD_m8HL1~y zZQba)v}zZstwbO-soVeR*?WCiAK%smAt|K1H~uW{el@_y*&uT<$pug3gtZ5K04TEi zHB%$_ME{X3DvMRWSH4!RtdVsD&efY5NJD|95=LjRJT_Vrm%hwxaBRXmk;g zq}0ay_wLp)%AY>8PbG$92SezxgG=s7%B^_6WUqVFTwJzLj~{Srbf{8nEi44CV3qzw z1l1o6XP%e{o2zQYp>)GW1X)-tA@R%|1cFvadC0kNt`PuxRh#OyY!DX zhSreco9Ytei*b&umg%P5gl(DG>JIz~I_gmlUHFR5zWqrgm0i}b;rC<0Nte9k%0jc1 zrJCJssnf?Hq^%ouNFmqp!|ZYxS8W9Ph?$`$%tlV+3(8&t)y7G(8S1_;(=QYpSyJ9N60|pN; zwLL8wbfvgL$A3)BHP0$jWrJNZUrr8#bNS+5V}9w|EsV8B9|giTt^`AOX0zJn{_;)= zkR^jt@H(WgdM?A8b}`W5+1z6NjVEi-m=gQACrrRX!gFkadTbhhid#;e*5%9eQy=JBfog~W@Byv!lGAIv%;i&ra z2Hny@b9Bli+@qrm(Jv=$L;Ey9eA%bOZZ+ZnP$j@jHCf>*WnPgAJ+vBT2Qd-TfwMZSmWqv?Ms_c)DRDy14{ZnjA zdu;@sOt}l!%W5dnb8B}EMw+F%*YMO(YDl9rrEO6Ox36Q#2usv}&%+2l)Dv)2|%RJi~g zp4DNzNg9tAs>Nan&qGxI<}^jDT3b*#br8`)lXnsMViC6{da)6vtPYggMsV?Jzmyt%@6^e9g?Y(A!tD z>P@ZgMr*$%C8tUqxF-?onxA0u%k<^;I6`VVj}GTu4bkTu{=2t>Rqmbzn)0Q-j{Kxk z;Y$;=Tl-f39sCJ0JaS~%iyI|sZ=F6pwN(e+7gq(iOf>79%7=~6TX|T3%FfkQ^r={0 zL+0CC7;&}?R67-=DSoeIkDAc3h3#`ja>=)+X~GAeMHG|7(nV=OcL9@r)*Q;0y`NoU zwv6;C;<-`{Pkjirkl@>{wj+?o8UJKKRP*5;&@Qy$)}qs11`%o|0-|{rCHRaO1p|9=9_9270tQUSUPxGy09}oR)p2v zi3eywMR8MBb#XYVh!Q`OtzZScIn|@h@?fmm%yd*8sJkIfwW%(^1fztJ4XG>tLHl0F zMTdp>4>;HIRYmoUuW-CE#Z=^Fn`O1!-z82NSq%t*pI@-JLtJ10f=_0K+b9xMJQBSZGa(#{y% zhv$g>%+t_^EPr6dLK`70M2h!ZA<3$RO=yavGhvrX{ZH-={Z@JPD?_wL9#YHK2gncA z%v4}`Oh_1|gdH?mj%M2SUj{mp)}54WBBvQ?@x!VG^axLtnKPM|6O54jTxiEw1M}BW z0Q}??*=RJme`9%Y9Z2fi|Kb1ecXnF@rp4Fp`m@y)URwK%8g%F8^C>^|hJ=7MooZBv zP%>V(uns&rGInX4I~;Skb_q|D@TjK;5B(GW0SA8=4fA2etUG$tf zE4TZ4|3HBQOLaWj4TuR^m`Z?W{j~kk6%#%NGE(FRZytuZ>U8I%zlShc{}E|k4$a%w zC7=2m^()9n9)UVwLHHgWz4$P}`1bK=nn43n?rS~VFL)I$4Bq>!TO`ltJc*W3zB9M_ zAb9sKvxUm6B#*?&q9Elc%pTWY1Mi`qCG7hX*W3N)U|4CJ5vSa06GpAfyBzF{vlV!E zTjcN9o`o5#3uw2kX<4dqkx2U7;s?oX>|;3^*;@l$v#!lSDG#vJbLkc4vr|9gFn_9h z`cf8~q; zovFN~7BCtX0e*+zjL_VEa#f0m;Y9!ET|gR_IHhj7B@c>vV<`&xsK6zhkx%@;5u^Ni zL$$i^T2e3c1)f=jb6+D4d%>aX3kHR|tk>Osa=c=A7f0{3z#e!G7D#ZDQg*6B(EV38 zlgVB)aFS);Kd@cxzC@7@m_}A=git}+5~PJ-vy1@Tt+3!5;yjwGcI7Z zBOLtWBi(NHCC^}@&L*+edEV-7wYRjO#DxBdYc}Y+_wmu^hMTA~4(a(8Y;Qe;9=-kc zp-V0zCzf$9mvcYluuLjZ`R8upW#G>pWi98%HGV{{xhzNQkAbd5glc8nS#Voe+j^FF_=K}lAjV(^`+Iz-xQdX%iP=XWHEonIMv8QiA- zU2P{}6fG#vM*>CyrXYJ6Y(2Rb+&pE_Ss(hFc*Zq*Nzzn-d->iR3PkpU1j$ZI% z%s7|A+>@o7BC9vljkn`|+D7=sh{1M^>v{AWm18;~AO7@P1nACU2_hV~q-fP&)VJb- znNQ5R6KE1aFu|bSTba*S#FyF)=+ulaQ{k~6BV0w!a~1a(V?*oE!|V0ZWI(^{g?pIgt$$28$s-mlq%fenPEu+@oWbm|nd}mU;rUGx_cA{0yn~`b7^1fmj zF1rc3X#b{iohQCJ6>3^;vrgJ4uTT9F?G-kkXM2u@=Tp_xF{?QT?sCPPKJUX=M3lh& zG=rJ0cA0+rn*s2*mZtp;)_K;7&X6ynI||Hg)Q$DGPyos{yZ%&LrBt0|RV3DMUJpL( zFS!Ew@WE25}rH5hFWdS$cZ??&uhT-QVHV1}GbWGKSc9M*~bYgee~U|6PTTCywiF5JV`Yy<~FX_27jt}zg7 zRR0;(S7dkN=_NW7LlG0r_Mm#n9y5g>ZRn&jIwq+Mr5j{SD5x^fgu3SE_inCS>u`@&+W>NNrR z`>XC4?5*V@k;-sUUF35pa9{i=7-S~Ja(Nt}joM5xVhhw~`ejw0wduqas~IDI{$u)Z zI-z{9(8{&1Tjm?QWjT}Z7I27M@$r4aGPn4ea09%=x5bHS%@}qZC*cPFpfR|gQ1F_L zY9MyKutJrNRU^~R9h$q{9(0+t#bJ*5-C|#_DkmkePZX*H$+ruaNWi;kmm6a$k3iyg zUB>AGdcoH+im9&$MrQ2MySE)&?EqzNFwl>`%tWqr^ILE)tMLI)_)ceAsxbJ;N)gNZ z-5QxtDa~E>-#iHVYuMFc^ga>4xO<-%lN1=X%y@*kLLV++h)0Iact#;R_$J1XR7~xuM=W5bka|yIZPhha= zE3T_7C^-{m)xvN(4~8n`PkB$c=8xY-en=~7cam!`@W~-iO&aXgMb0^U^fujTAF|PVc9p-q+{)8Sdv2R2;43 zp;r#EozTrvw9HzIOfGUVh>LN|reSnINz!+lPw=S$CaW_OoGTS8@}`TDGWcJm^7K24 zto^FK#4vg-o_!%8AUD;$7AbAeTtEq0SL54E1I2E2)nCilu@PvPYsQ`q5H!eq8}TU{ zFDQMjv?1mmCA;kJH-A^YmA`BiVj(CEEmTYPC|p zf6VU9EX-sXQw`;)o~}GUpSV7nV!QfTwz`*n>8gSgaWXe4LkVzJ8bNoP_pwl%4UP$&vnU$Xr=$~($zHk0rW50qt=zrySj;=Mdd7*-?An!8agtMqdzTeiq z{p`a?2}Wi@Af7HR)O#e=<@A{AZ^r16!;|kA;@8%6ddpYNi@Cd=e2leyAA$@Gf;=ij zG0s+k8yr*W8RfGg$V{$5J6P*rt}n*wHIuSuzAbbZ;h_B0Fz4ni4@%e!tI$y&xg%GR zFcN2hi+!&q%%QiE^E(QR?J`(ErooKv1?Eg_ zYf#93mrdT3%Hr)KySmoJ8Lf9>iDAN1#oo>*UM+dVW`skAUGC6nvM@2&(pdXi_x@k7 zRyG?pmPuJN?vlD%X)~#U7=qd5n2z8k)MYE>^Tvkl$Hs*7l;lXh#*JT5Mbkx|*U^)( zjoZvFSh=7}JAtQC;&v8k73;RwaK1=B zEm9y&zE3`YeJ~q~yw(|Z%65Dvd5??ui-ew&DsJ77JyG!v8*6;#E?tA+xH0UfZPS%# z9pSomE{wj&)%$CX$kuu?bcJ-|_h-bKpk9Gw_THkEzh(O&@*xE%SoXYEuRl{4^3DH{ z|0)*?gQPXsnPlExt&p?^{&h1)`A}kzY9WV zi*5@GGAzD58rf^UdBoTa9;?IS_qUt%t?Zjyz(MEzQXERrJKzr|Uq#l(z#*E1B9_9b zidZwOm(?GohwgWzb()&|b_gGof33pkSMRZe4vl79_CRFid{yc5i_2pdVIfTThomAby3@T@2$TT@XC8J*@^st0;XrA z^LKqkeki|{&ka-80wf%{kDISn$6rvdi0;kShAA&BYXt=9&?qkcgS`_0a4`L?7l*(e4NG~08 zgZG`tr5irZkL))sEGbMQIPa<-ly{e0`kiC=3@sAh!Aa!B+FKQTFMr(|P*MS3Gc8^& zGY)@i+hu8d%>aFPNJ-~&h#x+j!P~Mu_Wo!Tj`qySbHoTiN2~;Q^MIL%4G+np^JyNL z$A;USe^HrP>1$&Z2u|M|m(`+3176ZH6?2A`#~NfCf$SHOzjK!4ojJ0~-4z@EncBMv9oD3#76IXeIYh3waL z$0#rKLMZjsUHuBvV4txn3-$Sa!sE3q>9vIT`b4r4j7E?lGrWx>oCsa-cE+W_OYkeO zVnflvO`-^Qy8@DCB6>-Y0O5pGC44pb? z3N(D2&E@~2&`h+3G;#2&%SDT&yEdM6jc0B*a_G7eYQOVuMRRn+;AQlhuz#!LEKN1J zv%2R>t;yb>b{KGrYwoo0pM6t?4-$M&i{Xf6Tz8E2C}D``58hz&CHyMMQ1vW4F#mW9 zdJM+8%MXq=<)oZ)kP*!{nn$#>O?5X;|A3nbrLL5aCb57;?Wi6QJ+D{P_G7jcBOkyM zbX@trh*=X~XQm;gf@h|xtJ<5GkJf{tRlL^5A0}FI-$A#7<#H@>6R4J|zRRg*t^1sZ zJ}(<R1^{(81dg+FJqt`)^#V>jg^OL%IN?zW39+OgOCwwgd zdZ;;zYdr2friFU(KKoczYA8PGk@m~qY2M8m&o7jH==p-#x&AKGy}s6&u>c)i3rR6bf_KpG~cEz zT)}%bV3lpTOo?UAB{w@{f01v6YO-&}t|1@P?n-CdB z1#CVOro-;LCT6bRm04S+yQ!-U_2L(tq+|A*g;+}QPCEu`FH##H#SPP$!oh1}eJCCZ z*Jo(x2iX%?`B?c!ZRyz4jXW=I;m3r(p4f8m%X&X(%lKe1UV4RbcCliPkrQy)>`JI_ zgTfziq-j8)-p{w!a`J8>uu zETY@e(RUK~BF2k6=*`z-#J@N4RvXy^*^S%o$g)qe!y5kW6HRVd!0O^+v1b_j8xR_T)1rlM?KU_1K<3_(~RW* zrr#~R6JqlTy|k2<<||sl$c);V9xVTSiMLB+FDT%JkRXsKw_K|q260M$=Uhe!XuZ32 zWBdvRxS!p?wk~@s=GfhjbG572urx*RPK^c5F6rK(-wj*AGux)kVsL2F{Pb$;0Z)Mx zfzKLeKl)?r`*Kod{w=0hPr8p$Us5Ut+Y{lUpMD#Argd&Y)xyC~*#AXv z=FlChG=L*g9n>5qpNJ~<4v>%6kAJLV(Z_vt>fm?zvun}xN8}bM%aB*+-fq-@117Lj z$jDtY6C|J7XdKvZa$^h^!-jO+_ORF8^7R*iAO8jq**&B=RjYrHhCV8XD!svWPH^fh zVP~zU*zI|g1fi5Un5;KI*86$K85xqrCg4AE$)7KHuh{?0Uf_z`dO|rawC;dl508af zXj5C&_V5gzU3WdS)#?+z0GE&ABCDVdbJmAG-dN8?531%IbzosY&We`wX_O%)grv!_ zJ=~NFjCWg)(0V|L2w*i?=CM`o{mrr+KE&xYgFb)1HK(VDK&z~Vp6GXrnhy2*)n*+) z$Ke3IRflaB!4CF3qrp8QR{xl0bIVmp&sK@vNqssM?eQw%mc{U#+n^uL#ly#z>|hoA zm)wUB&EVeclZelXt6q2tyC@tJp?RQc^qtrx==g8=E1z}^u=I~C_nD2tq@u`|c`zP| zKfIc&LJ%GAgOgD2)zLe}7d^UMpbzlpxupN^=O?Q$hbJfhF-9tTRQ?@YBS5>GiWP8noam zc)n!mEhg#wwyW~J3;S`?OqOv?Fq&t1W4FV<&fK)*>55z#9{O|=cLbhFfNQ;MNqhN^ z>Hpt=OaJKJRlY?LZ#Mrm%jyPg z)F5Xbn=>y@a2iJh(>{VmvoGM?Tg~z;lHrM66c6ZYGrRm!Vaj$j3d@MYC5A3iy>FtQ z$M(OBS*r&{3LIy&bdW+n6snV+{$ncBp?Zb5EC_a2N0hBy0_oas`D6Xh(fkJAH|Anz zo^G5q*&AHbV+435-r*?vPS)Qk0Z$Z0 z$ExT@?4F06aYVwDARE&q>HMDrMm9(;cxrHm-}%)%wd)$pJ)vbwpY%2*bmfd8DNF@g z)5KHzeNKeGu10y1o1((Ql;S@=MeSo;$qZ>zFhOqE(DB*3^IGbzP+K};N0XZCt=60e z760aD^r~&k;z^hlxMW`tGPEKQ2>)jO;sZCV;=^3~XPDhwA>^iM2KdRu5FWZ@SB&49 zRe<_&UNNerZ8sDc|Cr+80a=A3yOOtmO>tHY8X}-B^yndrj8cdPaHP3c{QaIdyeD)& zlBGY)(J*hYFm1-#bhnYa2j1_7Rz=XxZOF-x2xGU?{I#z{S9$4n2AQ=d#rI?+{hrTw zUKU>XNv(qG9;T8xpWSl^BRK2*&IrbZK|>NINQYi)B}fA1G#mN;3IcVd5dn!X7R>sh zwH`gQ=<(Nq8hCnS+=bd9P2ovcHIouNcq$P%>Z1nr$^C%^29VV14~&!W2TCf*(i6wQ zpBTyj!%I7ST&b(sb?zi$OCkZ|7zdRM zwB-Q_ePfPUT1rvTM{v7O>k~RxkGRcMTB%of-6<1o*Mwl49{N_4$x^&U+rYQwoPYfV z28vsAV1)T#{pSV$?v-7C%{vRFFgH;hNhe|_R}VK`Ux#?`I-mmpjm`grEgB+4yKC}f_~)TG!kH; z=OV3!=76t_WfMm;X{kR``6v$cVQYKT3uvh08K3wJ-SXgVTP}9RFF#lr(-5o3^r02P=G5=*whbUk-m)>Xi|e@~+!D^vkVWqysG zm2?JbUQfXnekx5mTHusnuMFHd*=90cS58pd=-?g(Q8P|tUq zdSa^C>);q7_ZQ5M?sJ^QXU`aEkw)9rlEX|-JYSRSd<>Eg#TV8h(0acFw&xkbAi0n? z!r0in#@`ziqYf15+&H-_pkqBwW1>q{h9x_ivk`XV`oZHDwQa7ip_m)%H|dfT z>AY{4-~fSVzO7E~*xc}ednDEwMZO+yh1NI-vi<|!()JO;o>O|;j2u%?S)SLuh!XN9 zm!-Vf^%t>VINmg9%W)e`p2obBR9$w*a~scPOBMfPif*e&@t9UV`b)hO&3T1SX$9BL zxaioH33sQL!R7po2mVr4$iXrxC2(%ib(ZZpsrG-?I?H#{A>(_l1KF_Y!wwp*<;@nv*O7-Xx8X&H3Scnt z2KN8D>7SZMyZ9qq(4 znhhWZSIwboHFdailYtjL^}+xQNb*lnQ@ zov9hKpvPeOJ78T)dM|va`#crObgi96=I2oKI(Y_YmI_S%T=0WBFTQqq-xnKHYjWz5 zQA!{Ch!v71EBAZK+gP`%y-%bL)NX@wOXaO@uI46q<6!zF%)A5LO`VXK`Hu-70m&AI z>CRi4E~8Mt*;U@a+`r3E`j6!1sj~-ugI>swA!ZTBoB>%Jk>&)+;q9V06x0dOr~+l+ zYH=X7SuFy=Mw!45+Hd1&+lXZcchXj9WWa$sGW;8C-~Le5(4~C~ZTmz#4gDoQ}nlwQJ?;a^ml7NJh7%tsd2+n;?xs2&aq?W#m}Qp`5DE; zm*by+b=xpymg~TyAvUCKc@B6Y?!YIm8N)mM8Iz?rY;Iy~K;K25@I!C0EmPZ@VZ@P* zJx*6+aeL^6Js5{acMh${^7Hp3A0JaY#FC2&z%#H+Xr|g4mYlW0vR5%oZ$xoY5>QX~ z*WVtKyF$`$(O~J8#`LR$Spj9E-nPw>;ln=zGX62)OeL#6)?fSS+*gF5AJ?HhW!SdU z-)BP ziSSTl{6{*9<@`wsjK+CP$m>86iZI{1(g*}t)eXS7&tcJxKAPpk+qMq)`1?}2#KH9e zYBCTcYfXzw4)`($FHLd4mP%Xti}}aqwb?qhm)w>!S$`|qgNgRy?^kh)-9ocYd}+^8L@vIATh(<*!eW>RUMMkKcl5RKuZnnpB=w}5{Y5FV#ZIR z;of@x-+Zv?trz@%Z>~XpZBCf|e}8Ku#)_vxNC{3aNc(@UqH{lqD#*7 zR=r1COHgA}3c{chSHRs|%gI>db^FKkYKSgo+%(Cj>`nt|`}i5Hk;a8WEAA1LF8Z{e zqUVHMr`pQRe@qXGJ}UvF(JR{;;$V#gp01AjzCBq3G+hP$v95aOOsP*G3EKF-;k5}vxdz7ysN^&pUnToF?isIDhKqY z;f0>H^sN))TT^rA#NYnF?pIYoeX`^XN)RkvmR05}dwQyyhuSzfrX9nu&Pt;;VP}l> zsAi$B16myr`U%^uHd@m#>bu=x zAmaZK+cUH*hEX+ApHX@R%?2S;~2I?bnaX*m8UxOB>8j( zTXqY$5uR}<>^~*(3hyOSYFkqqrg-armXzMAzoqz{+NH3M4uM4w3@D+~^dtvNIt=rS zVo_%(ZO^w26lN9?ixqqHq`|z4P1VT#F0d&lu;os6fc;PSD{`T){f_Q-!C{$=zqcj8 zV{|*lD`7e-NanKhVGbBZhKGY3~vtDN13mjukjfv4P9I zB~`OvTiQTwm9@VEVjU8l-!(78wTP@`kBbiW&ch?D9QC9}aI?n~U@^?E;8?^A90AEu zI~)HaC5MOo_mAm>3v?}a9FDC2et7xg>8=D=WV1%B_IE&bP_S|4q)szsi>~r!Xj~ek zblnqOC(P+A%zi^qNp;BXI}Gs#5`;bDR|gY4gofl?El*wg?;QBk{#pfcl+Lo3i!TlE zMvio}p8fWF5mS@}SNBKVn@KE2=)D*jhSL&~_85Pcr*{O?#Q|rC!f1lpFZnvOb!-~Hzo7s(##}o_dUgRnxZ3Kv;v`Ku#W;gLz5E6{d4K9) z9|qlJdLL0Nq;mY4B>W&Nw_$MO-jIb}gs%m@eX+yZsZ-_cD5!c4ny`Ycd5&~*5f`wC z0(tFO_Hca_6vych@93WjgZ5~M_}JwmcxJ&Is}=#3YJ&T3A7_~_(vQ4+3H?5Fm_qD+ zqbKcx;Zi_i-VDXXMS)u6aBNQnlA{`Wk<4e(V59KjZa~o$_>dMv^`p+vm4i`w@0n0z zM5s$cH;+E`4*G#yK%EPl-heyNyNh0d)1q_-OVUjPLGiqw0iOrR=9)jl!pC*kZ}NUQUJ>^%Q?!h6r>LBBFhk=n?F)KCywl~ zz|ay`{>r`K{EOp}_x~|HVRP^CHgDQ~XVx@Qw)&wgR&zp_!a7FyL1x3R2jWc5T9di3 zC>TbL@GMK>Up8o(IFlv6Q_lif{$Kn!XU?x>8DVKQ*SJZd9})B>C;ahNTc~$Gk8*NW zaQHBYxPLk3c5=($(lQ*&4Hj1t_r-e!2%{dYF^nN3-NSJdKf^?Fy>&+ippc;QJ&MnC z_FA?YoDFLSVxBC&#L^p>&46CD1T`AJw;aosOCpg*fLSVi@ClCg<7Ph;`5ZOz3!pt2 z%EvXk9IK)?^^xMtA*mpW!AO3ZhtJ%CPEjzuOs5M;qq-X zNY-i03o+j&DcAGI)431h1xa#)-(-^3H@O~54?siLen=@Dn@QLyg@uDe;XP_b;J`1;@wg*f@Cb@%ng*GlN?eE@-82FF z)sgc98jaG1qTFwt))2J+U{K#J+KlLqi3lhIeM$`;?jzEJ3B)65jHypASo(i%z{_&Gh!q?aZ2pZYr38!u=<%zN zO{1DH*u!mv^aFGA;o-=)7xdic36w{@WC9r9mx`g0E0;|L(6O~ zJMh@j;1eK5|MycrO>+KgIZ-4DK25WZM#vDe8v)4YmT+hdqm7sx}Gc}jM0WZihl9axXxH010*ikVV5)t4dlS- zD|hrX^MhEA{>kg`yTsPwQBp&=6TFWS@2yvD;(tfHIdCbMhz=kKa8BT0DW#;OdDRTB zs~xajZXo+3dm9U=(VRws4=3J*3v^dV3T&#; z2xnwtAqb!hS_OfJYcTk)jDX~nV(|%+Qt|3=AiJLvp1v}BB8<^PIIK`_6ehbXRfQCz z{{nEby7wZul!-qW10!^8;<50X&&x{NHU8Dhq34t$_$m1?3>9P>p$dSyxz-fStURyn zP{j%4x`fLAP}4svUH zD}|o&{&sJM8&eLk?L3DXxZ)mqp<0iw!oc1`Kw?|EXSV2N{;ri4vsyl?4ILJ6F|o>A z$Yl+$DFN=Dsz-_W$y&Dz#oF6)pw5U%toh#9{jcMH0h_mO!@}5{#|8n| zo%qMpRw*zgI#pW@?8E<1^1;zt7y&cHncADZ*jY?d$8#tw!=&*Jw2t;#Q1 z-v1G-5{HkvNVRa;CqkDH0U86~w7DLq#t#s`h@?5dR8F0pYg^i|Wb zJ$QR^7~Ht2yFfXZF~e9cBKDn)sjA|UcleVgp2CqFNX`bEZf8_Y1_JsnSJ1V#tB_?u7%Z;4@;p2JI3 zADLSE4)?(x7qZE<(Crf+^uQnIn&ocoV6!Le+I6IO>Hdis{%C5Gn3ACSGv+JJLs!(? zm^B+YGJlE)V*YDd8eWg$_aMh5q=5ebb5Mp4>t4}ytZGna$%+W^{o7ba{>fbZ$BR5i z5&hKRKi!5g{E~~yYau#t=x14YN5#`Hb7^g#U-(E>fAkP*xUlf|j4d&VmI408v?l#L zqg))`Ht}C;`A5(w{z9uSjQmheTT+~Vz_C*4x4Qhp*@B=lgcrYxPiYw@{Y*8} z#c8chN1nP%{{YuWQ~v;r*UoTw-^DA8YEynKn%%eY--*UCsJZ%uKg?7-G&-R=Ep_GRVigSK)u073E3e-xUmE{Qm&o3I71Z z)%ZRj__LwZNFVMe{{Rz2aPVCL#$C>lz5@7;HZ5xm$LXlXf1Ff<;IEHkKf1S=f7|Rw z{{U&zth{;RN5=d7{{X;K{{V@u%EQK5%iy)zAF3z#Q*`0h;mbcGjc#0iI};_;M0ztR{R)x#RSTbi-w-8CHN+r)vE?W0Sz@6)*OJ$Ub{Z7e4lopZ$`J z_hU_+6c-vh5BQmQlTDcSEX+^-It^+>d>0|wz9F>9?Hb)5{Q+ytbqj?mN@?1E*X$PO z{{U&%o$7ZprGBI4eOdKwu8E;ezv$ZX^XYAiR zowWU3hyKl8ho@;eB*-@)KS`t?$?FNJN3Zqwnkh+jI4jSF8kBi4==TTH{U+G{o?)yB zJOSb~Y$k(rZ5eHe@*)f%W}W= z(f2lj=$u|;v`7V{mop)Fq8<`0AH5+SsqYiEx@*m+;sXn9Umvd>Q)Z#xiy~7V@ zDgOYW15&22VdCP-?Y)J}WBJBwlABo7ImGSx5AdwHHH}o0ncMOo;aYnO^dCF!dNX)~ zLfiYzFH;TbB#FoViWP}ApMhE|oBwPPBNPPYs+O(QDH!KWNX4kwPuu)bF5(3}PwD@%ak!W_kYr z=d7px2H)dVU8Ox_lm7ZY<5lcp_dwwKv)Cp0zwrlD&-RABt*LImy)qBW%@vJtt!f&f z{{TzZ?%O@CZQTB=BY!IM1~PxoNk8wl{{R}U!HDKbfA8aejW1yy!5E&2C=d<8@h(sM zDY=1#q3&wxFC;jx_<5dh}zVF1EYK(f6;QBMsCisD= zsKnQrqK`o-BlR^zc;iTR&E@u{r_{!he>MiVZz3W&2mbm$<4`@E2eW_QNBnDFV**_% z_xul5gU4PP#?{xg2*;z^F(3Hkm2oxy00-UkFNot@{{YWxDbMnAUMy^&&mq6>qy99* zWpCL}=4tyFlk8>R@IBk@J_{pq_>V}C`bld#AJiIEz3|~XW7V`LA6X;*YhD7@kdBIf zGfMF?fcG#TKfeG!H;R60-T&MP8ci8N!S4a7FGe4{m(E77z~n% z1$zEhUKs2kI~&IVR!$Ze7dO;?pC5JrTKWJRD?2MI2Rj>!0?Pqbwu1sNc0mp)p_58l z!j`U_A{PUmrb=t)i(1v5x^(Bkv$Rh~bgT=8esaku*L4h!tn1pi1xCfB7k2(VdfGku z<$Hvlfk$k{=U*!NL9&LIKh3z0a2Pf33Apm`6 zVLiYKNy+l>>%o8B1*F&nm4vhop0pIc=o*lkul=-kon1uQ>eJBAzn4T$S>JhSOs86*j_WE#e6k4oECmRSVjO1x3)80fh(izy(wdxSGyr zVXRIdKUASN9>l|mB%gJL@l&Jv=>0+jl4H)oG`#$V)P1}OR5)+{wd1m`} zq=I1jP9WW9$TOW0w>`2Co90BO{FAN-{8Rewpn9_;b3nF6Je;PCnFb-@$>yt+pI$Dj zN#?HHp${|}*)C?PREOei>(aHBBfs%&ZHzJ?7zj6aMdgvK_@?ThEuai}WX+d$`daQq z(Z(>3%JyM7VtJoOZ%tV#PNnU`9=U{fE7F3t*1eE_x>suSly!(o3{>P3m-q0pI#5WHquJ+)q z@!!vBJeVm}#_Ew>@3r=L;3Q>;=hjli_G#=&vf;B&rvWZ#i)rA}$ZQNB4O!Br)VV?U z*LcqmKQWV`$N4WJ}Oy2Rw^9 zHYK^st5t}q@p)iy{DFCpDvhBGemtCaKx;#+FGfQh@8?pdWbPB92Y$N>>eK-5&6yp_ zR6)#dq@TNB&J^FI_4s%xPW@yOr01!zLSH;hdHdjn?VDj5$A7or-R{&tLyx<*IWia* zW~WDHBtbIe`-Q!K@<5XsfPMHn%Fl+Q`>@k_S2~$PHBCCqAqI+9S|rpd&0zaBw0AzU z%gx{-le&5`p20VHE4~0Z&BU>%mjBnmc`t6QMt=-CLyyICO-(XCuejAlV73cn{Bl zJOVY9nMvpMU}iw)$E;0o54ZNLa5p%jcR(*LE%;Xdms^9>IA$gq zvSfxL^vi7-1vR&IkTg{<+}+&0f*pip@CvEM*9}37-%6?yMY2~0+$#iWOv|cg(^{(w z%%T7Kc!yL0bwfblt)$90(4UU#7iB~sj{_};#m2#XSQtpkWe<^G;j_hT+o~5L8(NP$ z0E+`F6&Eaq_!hwIuU3{}pP0%wMbB)3>QHpfs z(I7YL>Mf|j!w!rFNmM_reV8`j=h%@qqkco({bVEG{7n~QM7U>$O%iq=R?Wv~q53H@ z@6R?=#UxL!9912!&{<&*R<$grAV+Nqz2S8Be=oKVa|gEifDaWFcpt~d@Rd+Tv%RdE-W@d^z1P8+#}R0w-$+cy&{ zK<8s1RCH^wC-b`?2RX*EJ=W=+z7H#3fYy0v`xzh?AscGd&Nl(%dTG0c^W>JaGnW~% z`>>9E*vP-v-iPft(NSw^D(~Tcq{cAg^!F4V)eOO0Bau@osrxV@02zB7)ZYQUQt{50 z{(c{Z5Pg4Kr3QSaaBIAke@g-jUrq-oN=)1$$#fr9IXhx^ey$nL*O~aWl{h1!B9}j=8WZnB5@~I&PI?dUM5!tP^^fP32D>oFJ=?QJW z4y2cgw<}`(+q(bu2ypY6oIp+yCgBCS2IcO4F3bQXB6}qf=y$V|8_zld?bSYPGNeCf z``1h{bbjASQ>{ZsRX#j|Z%S_y=ifnRFI%k1z^nrOpa)zWiz^km{m6qEn<&br@~d38 zZVvSIc|iIKnmT%xW=MkpfZyYga0`yz*+pfoZ=8lQH%>n7E}$Tv1?*+lnRS$bf0?+a zNp)b^?F{A+}&h^YJ#ur zTBp%I%%G-C!kjM6K(&KkZt&UOeEcxj9@J%SUB=?<_F;Uo%p=q>Jf9R4$)KQWHdF!s zifO9_dq(+o>zP}j1X2np4z0cqD`{JYGcY6OE)yZC6fsI?!x@9}l9G9w)VBX?Z{6{P zbP8raRJ;2YI1@o{U+IlhD+lQxY>h7ce6tUeh2lOBnqHGrIL}mDS#Yv>p4zCtvlDT2>ai!HEk!LO{IGmO&V^Y?ZsHq_bye~ zn99_|YEWwadCo^Bv9r+mMX%Iou>9vLNO2Et?)X!KX`Mh}3H-wtm`EA&=Ky`l+gR^M zKk-9jvxmUsR}m|4s;A2#$e;>UTgw||)?$#;W3${)fH^XaS)`2Iv)s#WO=v70i1uHl z%t9ZKJt~DAK<~DOucMHEaN&rXx*yg(=b4DLPnT)tDZ6zEVT2t2Ybu?^O?+u_*#_tt#OX#}?jxJcBF;d^`2#ju>hhNXr6 zvtj16Y@ca`ze@`7(>*JIldyD#!j?;O$4o=m&WQQ#YSlXc!aH|J_^ny$DD@>JI-TZ> znHs|f8!@M^RTUyPfe|Ose!jgPCQjA3<)>8mh!l7e0#I?gh}#OO=Kp@j`NH;L{qRY< zVe9IO+Pe^{qpdpNn=51i8 z8F($0E2By-XCy!vBAmw44f@|8twbX?9lt%S_XK@WbmP{18y)}taA`1`!BAI%EDg+V z%0lJ;J7D7~X&A%UQX_LOo7wFUfPRSq+3<2V=nImXy9TY7_=#?wXu1Fc6_mozE(YGe z2kuj5m#1d_VkYhGEdSnz<%8M%zJ&k&ZA;4=hTO|k_b@ceP(ulF)6*_t`7?48IpR>= zm$(o6hMu$?u_kdB?8Dw8;8eeVy=0+Y+oP)=&M2<(`W}~nuU6L-32&#BnJ<6bhfzKM zL7XR${X@ZL-S=^X&Nk8QPP=;C3U-9Mwb%kafkOWic?gF>E`D!0_)r->?K0_*l*9sB zLLztM4cln|9{()?IVe@AZ*|OZQ4BH~_)ryf2ZAa8*GUamR1p4+0BeEytDm@+~IVeWM{2U#cL^1pGDyM``Z4Y|AYalXCr zvBJ_6_%3eL7nL_?rwn=gGx){iHt;K?;=$aYrll$P)Xi|{Fkb+MYF4nd<)J!R%78lx z_^*@AK5QsAsCntP^zM;uqHO6P-!2aMmM}i5{fMMhBH&4Knun67L#R8j=e!J z`}6Xd0Lqaa)Hd#)Sok_UweW#6w{n&?ETycmNc0RmuNEpZ^a0r|%kMT`()?MJdR+qmQRoBBFfb_hDN(cK->k z2H}D;(8jfay*9v5L(9?Se~lP>m0l=HprC1n?bM+zDD_{e48~bYNaw+WvL1R6D62f& z7YD{eE7f@0u#iR|302y_esib?34i=96p8dI&H7(}FRa~cleBE4CNBX)Dj&gb|2ojy z%)UcoK~npQSO7%;I+=d|OcMG20W^z78~FVj)M>V%=2E>kWOqObu3;z+jEo?)y|P<5 z2+1%pfnUtoCL$+x@r#q&qf-oHB%OufW9?_yz1I%S=IY{HZa*#q>DYhr)^TC{l>eli z5@`t9KJ=vHq>n7~C=++{LaB54{qbV>SHSNH?Ns5veK_c<1fn8Uztj*Kj%PG??~N0YkD9jPy|*ge z7%js@tqsCr1*Hfb>ADY7LHsOm-HS5w^JLu(##ZS9^8dB%!=n6GdBeQ7%cMRj z8uGA?j?eKe2vy_YXF@*(mhlZAmEdV0=`_Kd`KiiJf0i0jo!0hFXUA;<@C$F>%i1P% z8qQLI5qmKg=A-hZljN8qa6KmOXZyCxq|;0e{A+L(c5+OtI=k(yu^<0(^aMYRz4`cd&V2cJ&0{B?LPkYpnC&j_ZSRs@pU&$R zK$eYT$=3TXE-6ruPt?FP;KF2#Kx+o2)5v;5wSb`YNpspnW^(jz{_B*A&bE> z5kEgPev}7SpVe=;5hzaPvi*zKzD7AF=hUIU@Bph6p+|8u!VtY%3NOz36I|J&L{qK$ zu6vZwJ{ICe;Rd_ykK@jVYICd=Z;Uh+s?@q#AYa$3O}%il=9{5*4=XbRYm$h3tKH0? zrU+?DrO}(Pt(yiX1#lO`mrTMP*y}{7iNJs!J@>3=&U~fO%YE4SxH6k1w#mOX3r*RI zgGqOMB==!O=2PC+6*p9=${3ef+g2ANM3}oqKa@d0qyoW6zq8LzxoFR}HE=g)?dEI| z$nwJ``VETi=9BhfP;~NntKH_3MJ2jC?t$15!MY?#3X z--ivuDHVsUy{rbLR`y{|_M)s%0Jy1p?gu@cL0Pq828U+&aa*JUAA#@?_-|5zsP$rY zpAcHlPjlYM=IwGgAC>rpXSx~UF=AIyDccJSl=0MA;oH>!Vw6ty1_IY{mF&O60g@l_Wp(VO7Lm5BTA%tuoIltPAc4X9~cwM z;z$hDm-HuiMRJ$FjG4T6x!4K5ja(y+k}ftD-`|Jbr@(xKnv<1wH5wHBjOlGi(rBb` zL2Y=URa=Jf>~iko55{HtuMn;>(XB-5p)8zI``?oTH#vAdx4$r zz$me%)z5u9m}v*D7^89$*xvQMc|;s7e#KaP?~KL&@rVY!fMp^URenmmB%ZH;Y_VKS zlJK4Y1ipV<<_Jc%HGDLc>iZ6ux~E##-2F3KT{0@{FJSN znfLJSdoRfiSl5Gp@k4%Lrv~ovGI*6wO+MxWZJUtRRkfp}OYv3D8Dw&Xkde1k?mmp? zJYZ^=Jb6=!&8mkXe%ZS2N`H`&B%KmydrFqA0MxO(@#`h=n-kglH-tu}MI!fMuK}7_ z&cRRSMK2gWbIwX&7|JTsstk7nZSS&8)PCl%54$SFH)~>gKk<#a8RAEIeqbz?C!)|U zvV4%moO91Pwr&0Pwj0AcuA?MtolSMan6rH#8X11wQZfD){5#UR^8EoiggyXkvgC7) zpO(9ezFi`+5D6(3x$1OP7dXtpaNLw;%+Uz4nQ*!cvKn{HZr2sw7Hn8na9V4FV~cnV zN}+s%cm&HUnm{#D-Os_nyrDcH!QPv%C;&6&a5r#V6JLUpae!|oF?@Q?%p+s%m^d5T z9}0;$4$xnWXk`t>C7n?lU|0huhDE-rC6Lx^&&mJ&JhLSk;bv7Bw-1ZEGw5oGwg7C2 z?6|QJ_$t}&zMW>t<6rP^)?Ccs(^sS+F0BBL4?mi*g>72|x2Yu=Y-%G-$PF*$e{rko zpau9N%n+(){UFSHoMl&_oO!P<p0S43ZT4*ks)LH%x!7l*K(U z{!eVRLc4ROnSB}8+9M9{!<_eF-P$^-7V-(a&93MZ?&h=BcW@IHkuvD*LA2oEt1Ap~ z_r$oNzxy!k?vnoKkB27r2OT+nrXgv;N(uyybrC2?Ugx~c`pucLD{d59@Y;;G%Y4@M zp53DkcPGEA%f(Rc!^s&r)Ah{2!Qb*v({)V0&sg)I+)7|D^AgrwYD%pT|8N9t#IaVR zA@~}ZgRIWjBXEEMUGvwzRw!X5;zZS_jRHM=le;WX9mXpF0Z<4qu*W2%LIc zwF{+QB0gSLi@5eQi}`UeQpfmHlJB>j9r$SQN1eujGW3>f`Gk*a%CD<`;3Xwm*Kb-r zJ*e|$ANC|TNVsUndz(i434asiNXoefsa_XZ)M+&ASR+s)FRQ81BsN@YSoNHIhp9%c z7&4I!E}3i_kzJA_elltt04pJ0mUFAE5AzM@l#ru+;vrKI5}=f6dfV4#w$B(jHI$M4_F;&-f4`4c#Y=$vQkqJb zvi0NS*p9fgB&f(x-DF%V9W(&{yguls1>aSccHoi$Y!W@~KGG{niZRPW$X?8<4{HM# zs0IGXZt6knF^{{rGA|%!M%T_XL>E1*EM0&54`fZE2Ecfx@((MM(4^be@E56jxX|9J zd|4F&hAHkHUV1sK4n1a;D8xt;zir7^d@gQNOiDUKlr5QIY)-dfZsl)BW2i$Q9aztT zGD|@CogU7uXUH+#QxC+;ThhJE_v*edC_2k@3>^ww;SM}hpXndbJ`ULvYbQd^=i4|| z1imk479~;!mOUKSz9C%uoKWUAH+3@Cd|WzSC2Z!PT#`-rGVLE>nMfxY&^TcDu-B*717hqP!h#gr)wJ0(*X3DeoQB zyhI*+r7EeNZk^=gKEDJTIpAO~*4&x^l0J_TLLNZ0bx#cl6l456CEJ@+$a1bp0T8hW z4}i$6rP4lZ#^-hch9s)mZvk-_1N4{)3ronzuRbaiB>oTQL)GOq;nh+WWTvM4cN|ir zhDP+mEkM#teQGE#zwl7vBQSgNgd8#*SrUIi>Y|*yVctjmqVDTQzDAHTrFHfakf!&N zGNoh=~Ln>11*OA3$idZfMNV zsYZdsxA2nUFMhJS94q+>UUsctt*mS6;FC_nxd6n)hT>QJAmuPvuu7yNjn7`!@^39j z_L!7H32vW|p{TtmeXBwJi}a}meAV-y-LEn>!;M8}T(m$rMJ;2W|J zizI%2A<@G`h*s*ec;|Tjtgc8;cv$N4LRjQYLkm zZyaU*1q)iz#qXd9j|9k-<+#YVF01ItTYCroU6~A^S$7S`N`Ads?c5?X$~P%$91Peo zSVqu3mC}ybs}Cd1<%tItB*N`zqa(eoD^8%O(q1`&JYulPxY+6O%CC3K;HMw>P*3UPh76|;x6c}pH7k|II;(wjUIpAJx~MmJVFn^dU`q~nPKT>2 z40NmH?p_9}BN5ZgB4Wu$V_<<}tzs!7+~QTQ!D?{T9?PVvLuh?B7)YmFzv)iBhzjb> z>A0)Fzb&?YouiFCLkv2=)Xsm6MexnpG3%mI>tAo0M}T485V3SH-N+@ZX&;t5*7pQT z!lF@fHpKPV8N;UGq^l_@G_pTPz9woPX5j;GdkWr0 zn%)|{e3I{k=M=?S8*@|Brvh#uHavDR+=)*1vu!Hig&})^aIZ8;+q3H+qqTK6$xi9~PUh{t4MO+fdl^z=f{Q#HnEKSv$KC)lqj@L4O_6pTG$y z_fgV(neNi?0+r{X{@Z0$aixmy421b3NU`@`?0v%fh0|Vg5a5$m8T0o%%^^BJ3?75` z)g1IVyZtwS?sMLzQqAmeL1z6G^UQjqpAgE5EzWp~UjRyKz2x^{OToA0o1_MQh6m^G z!S4j={fHW0u$(#Nf?2C54#gh!FxzpfQapv+6GO;tfUWguNRyHg@9JoU1g1=a?*>kSk)^MEd*QqN90YR zG-T@c`a1LjgbJIsu6p_(En=yrI#nz6aQ#Oeg7}Ru;d(5EL|%UIuUPh942DX4&mN?% ztgUyj;Og@1h~orbsT8(~HH7z$_lHNUw9%lU=fWqCPvB^OIW|!`)<3pcw~6l$g+3g7 zmHPZfjiA`nIrU)+l4z3@$48B$U^vi#>A+p2r zxwf2}g_;zRBNjM}G(F-2&`(7;5{Qtg8!-_rnUd?V!qyu^nUly~W!=g6RgqYnx~LkB zNj;s;n(`<1(&7auCDOk8h>i*z3D~-Ws4PH-f!PPdUY*DnyB!W=;;NS7@^6|eQ3PSj zfedjLUiqAttk)&fktI0X8P9iw?K#S%y@x?VB(A(OA(D{y(+szFL_x3@Gw*jtb0Daj zQk;o68kjQT4_B&;ScRL<>N@M?b<-)|1?JkKYs)&P;*O(2pE4+){37Xd)(Hm!Chd=Q zMYvRFx}l_`UrK9<(czTJ2u@%a<)-b_bd~s?OJYv*4(I1$oe-_%cJj5Cp7Xi zjT58teFl-2k_{ZV^);TNmny$F`z-DdKVu(h7)QgkgKtNx+^98@qdrgm=v6FHD{ka) z+AX#W2IT}yo*n%yshns;UyPBei#nPN9ImtV*n-IRig#kN^BDZ5ej2Gf^ggn>I%7in z^Cw_!tgBF?P}h<4Z8m}8GHn&Y#=12s$7#Xyw9Tarm&e>d>J(JCLWJ`J-G?}t#&ARC zm3Op$VwYaP%(@)N+Z}RQ-nw;P2$@QVSIO`#;yX0B*`$gCYkMpB-~EgvZh`px`NZf z{N2a-!BRWk1gI+rgk-dB6h2Q1|Z#&*}od9)c= z%ZqUK6?5g#*3%h|l%39bGn+-di zrz=yr?7zxV_**{c&#-bG$I|5n8{d&$*X5l>XGtPX{(Y!??Ay8YR3?EHRJALc30^iH zo+vV}kP~Z|xWOVH@0WdKPx*XAi3LJICFx9!l&}$4UublwxiM7mPN}U+8S&yxS~QcS z6t!{F95H0$n1ebuq#5wDU32%uqMxY(|6V}NqB*mL&-8kek2_pQ_8{%kF);gr$~WDw zY!5Ce?Y{A9-@!&-3_+dP)xCiJq}Ra%FW>IoHPuabUp3#&irNY+ z;5}#}m1dxea*x`^kLBbSu)u%$NI$jgq_Tpc_`#toJI*uoK69K%Jj(d z@J}%VzYz2J!(#JM$Q@sx4Q_pEb`K zmK}lQ0Y@2#B`6)E6v8zV51!@@dkYx}_Pn zshV?8#4f+mWhfAvmI$k~UpcO4C?_qu$)SstTebwUuSkqv84Wnd^CFR`5|N-^s>7=- z&{d$%+>*pyX-;l1OaUSlD`k*%H$)MMV6ZWR?sWyEpZaR3Vz1uPR>HQek4a zeGs{803WgXmHBl#vk_U6b)zR7V(FK?Q#_{>nJr)aOb7Cec!n_5$d$p&Xss`ojxIji zG%|8|CC2)sDIrLM?I~2$a6@cJ=0$KvllLtA9GUIIL&nw5)!ocWRFrmRta*^P{Z8WB zy)5KkLf|!pou|z2$=$Wp=dNC{+&YJ7efTPB@3#kf(DR1ZS+=+J?~2;q;Jfw9&h;p< zo{EUGI$8JXZx>gPe)fwF@y{>vb=%@l9rsO9rGx1O${+5fAvd%5gNrTE_wLOuFIb%{ z!~&m$K$2i7XOT*dja#d;UyV#jL-)iPI92sI&Gzoa>opJwny@nXl|r_v>CrDsOS|+t zHD}XLE3Hig`4qqs=r0b2mG%h7(ZmKnSS@#J2y_$3R&B!WA5We*y<~kfANh{Z z)OWZ?ubVPyi)z=B_bNZa@eAqf^-SGHBg2S}9g;e+ktoVV_tCBQ0KVITBoWl*Zk4bt zL%_sGw1tiOgEV$6Xo;c$ObpUr-%b>oyRa82)?$ltZ!C7PwWNDGI&NKscX+^;#o5Zr z6fuXr`Tmf^FFIpR%D)0|6+BiW!dZQ3a6M^qspb4M!Xojjw97ZMEYmh9+na1B&Ghq8 zX^!kKKgx8mYsherTbfx`dt3|Jt9CPj!U^y`RbKIT%^kyEcC*A@izF+dMdb04fmkgw zfrB$=74L-s*4PWPiOd-D8Uh)C$WA9^UyN|mmp>Qq4rYZJoU`VxCN|~%*(xJ^T@=-t z2^T1N&l!i(qBoRq+Yde|Wa4g=Sm^l10|TCpc~i)YPf(?v$+e||J(~r``DRCH_~)WP zI%-9?22rQ;#;}k|koWz*52M!uS|!FWMho$AhpJ--Lh`@cxNZ9JgXm-`_ zJ&|2_USZ><>GB>Xur_i)@W7$-)0M|Mp{%%0<`=8hY4lnlLQr^M*OIx#Z2l1W%IkzI5!^?a?Xix0>!HA1ia{6aV&OJX!8-4U;z~*VsWcl* z(sl<(`c!@iy7H@kOb)m3ndQH{Hd7IfHh| za6z}94*Cp8$`PqU25~qQ<^wm9;^vc#6H;T>|FcNDl(OCzA{v z1JGUFRN}280^>sYQ;CSj?{o`?g0t9I8#pL6(YN!+!LOey?U=7YcvGY%yJizeZWVgE zNM9e3U;9j1i(v)b$p=KN27a}}U(hL?&gwaB@08Qv9Z;J6li_TC6`kyQYxLcXMjCFZ z8lam`s;*nfwy}TQF~m3V{Wgp3Xf3{b7R|g0-F&$XLCn>tFp>U1tb28ECOL46AY4{o zRTU)t2OtsOKXeJBa5OYFbJ!pEM$Rw~zu@+j@xAP!vAg%Z*5{S9B;TxK=8*hVPP0}O zhk&%E(FEIC@Wt#$2K_0WG7`x42svgSKFn7J#}ZHXN8zQw?Mhhr8#TpS`^^7j;jUVy2UTrlw)j^t(-R^O!*x)-Oaxwm< z$B*meJF*+9nH3L6jq-2it}qexH%ttEA=?Vezv4H2Tl!w+Vb(`CY95PcjyTQ{F0a+x zs6x~5;a-A9Z{X`=i9bS~A*Hdn8|y`_MqP!i*H7$f5m^To&DSa&<&VF+%iMA@ZlxSM z;|$2d(|wGpQcie^eZwwrjHog`g#oYN4V5g@nm=%mBN@WGRhsJLEt@X}Q&YZ%vK^wM z&JCKV+o?(pR(@2dvSF^T&?$Tgfn?INKaZI}Ey=IM__GT9t|B+1BMcn# zifZy@HwQ-?Ihs^Ik9iKF{5T(FC{?_919aZvem%JxSoX~09`n;4F1tzgL_8Cr5_4Jp z^b;6$EbkgrY)+|!xz6UbU1ZrQLXKE_*)_$~t6v8+kR&2O2;+dS&KLWIi57)!z-KPy z^&R+^$3D=yswd*nWdfC7e|Z!3JtliHZsT(#P*uqr{>l7Fq04~n2>0h0fwZzNBo{HZ zMPwUniAT-&Z{pmj#M0QytEeMegVc_;e5;~Xx$ky#iq0)J|M_l) zePl7XO|{&1%a&tfl>flH-$%dM<}Dj6)#z>^shFmrf%sAYs;DUsUXM+4`CPa)C>*ZK zL$HMiv|~GA6!UxFkMie+zEFvomZ?nCoonTMOBEKaa`juXL`lRi+;xc|^rYFHcD?{X z%A7mbWCGu;tt zD%HBLWS|NCug)gr-5iv}^m-SamXVoPI1xG4l~;&N^nN=rf#i{eYEgolp?8N$>IdV3 zWsKw(=;8*CWkA!C~-x^G|Z;VVj z9S$|9^7Dai>s*=$qilLIry#B~AC=;Q?jo2Q(ZJ*My@qJdtICyJhcasJHi{m{qAS_pIH1Yf9T|P?~!KPeCY0ohy|; z8XMS^nkK5>O%OK_l;b$x+7{;|-^gyhtH+HboB)y=ZEmiloj-U;I&7mwoV;xnf7iu1 zDSS?EZw^^qU~bFh8*_zlw@hb;Kgp~>iC;a{T3tmc7G6eV`#jx=nbo=Wa9h^l?0bf| zoh5(rOXAs;s`GC?P+Z~*d$owy&pA;2uH&4%eI8E|d>n4%~f+`3UU!$-Zn%^lj z4z$)uN$Xpgymioe7CEM;vC6Tl<|E}B2}-i3*;})A9Qi!gxI+;<8tPRu{c?hOh3FDE z(gYrb@bkfB{S*B9nOdvC=r8?kX~?xg%zd>GcGgWI?`_*XQ)ZBwbNtn^3zb>OL`*;B zb`$&$2XjS0)bM#ndS&wDK)}gI`!GXPLoGA8Z}hB{*r%uIr|Z=VpZ0u5s5F~?bK#!v3S3T1Q4h*dr?cdR ze_!b)piCZBtLKa@y)8J|Mjy}D+~nmC;Jogb?R~yhl~(o=o^p)vxg`?$U1)d7ifdFI zA!)}GlDg~tbe`q53FV=!1ir1|%agdl5`P&b!m-`>E{Cth>s!*?iQxfe*ItY`8yp4R5ugljdVz_<@TFWG9$SQbt%FDM|Y z>eRn(HmsVQ(r9SBu7c*{k&`CBrC6^WRok&X$yfcB=&vK@arTGX2CI&qv2Om-y~!d_ z=G4UpTPMuLeJbjD4EAIa-pYRcZU~lM?;~(0J3BTDN4U@^fvaU_>@GS#Fx(y;u4?R+ zJ}8r!qv&98A{uz|ejmoGS2m@>2sr(0!u;rNayOlqGw$~=b!>QT&}{Kv)8QOj(%c@3{W-g@#FUBOZ{%d7ulrUE}E_F4zW zl1YmQ*fZvdS~e>{c=Y;iyfxfhJscELJgP69aUw#;!nsfJ?nBFsLzB92oF$vo-Qzh? zKkF7YyWX1m&)D+ZICulDG;1QghiPdVAk67{RUg(wzp~u?9i(k;Yb5VQ8^9)t+~V6rQ(Ie3+{s2S4or7>#;o!TBG>@k`00$1=k;jna!LTd*H`)*qk zc#TgIs&mrwqE*JRl!=?;v!Fi(yZijT>6tnPlw~{X%hPUhVb%(|!Qs7de#8ub5nIlYk ztk$^X}SENL9+=qIyZj_c@SvjJ7lo^|$*zlnkf7YNK zz4m|&h^;g}I&%LhEv7eH#NS2aD11@bl>Vq;!30Mikla;HMt(-oGH#y{%uArzIg09M z>R>!r49M(3OZVz;O4&Z*`W*K9AKrUYGWoF2`J*Jth+`jis6h+N9<`FO?8GxfK*+5FVP$!2)=x^^U9U(q^1Bg-N2Zp|9d9C=2=jrG#E(u<^_$E1ydy!2$*Qa#v0d}B&PEWqd zZ2TO=B@U-FwHw>QoxMiS`Oe0>ZL#V!-=r(L;dD9v9>w%I{iwJ4`Z#)ROLgjD`_928<3X1bCOPop$zEMt0 z#c?4&<(ki9l^LqdABvd&3fW4Ejciyi$?yHerdkZkAFH@MdqXwBK?_-zVfe#rFYc?S zRl47+b}y_mX3QkTdR{ZR*nFYpR@zS}YbGg4zfG=kkU87uUxR*^Xs}D>q2m7Lx$qY* zmGpS6J^^K2x7NziHD9Dr=O;G^)~8POCM0~;Xzp&S?|xMM{GCn2laVLID9jlv@M*9_ z;l1V_m0ubkgKo#%ut*5+vE=VhEQ$!pkk~W)@Yn%K@fmW*#^(u_1LMTgv2E8dv565r z*qDnAcuQOTh~r0TM6&vt?XB?y!G!Ry1p7Oc96OndPR!J*VXIN&SH?%PnAYWQ%X`%i zc0I}3$uMrFQ+hl~L7!OjK~Licj;m75oD+a_jayMoA}!5j(yB_^&_qOFr0zHIYeW>Q z#SJn2drMG(IIgUG)bdeQdPMf$Rl&C#P#I^9mz`I(rDkY?4m}rD7BA~w+&!PfJWc>Yu2)=U_(BX zpB*_YCU`H%>fw_eP}fIyWJvB$Bb&?CyWnud0VK2jnbaRPkUpxi7kAXwf6~ZKtv}$I zbY*EEwS9Px_QPf8ea+IWzO?O!A^UXyEAFyy%m4+woPd#@9l77Wd*7AO;^1q$_rF2M z-Ns9DpS}1N3Ixu~WTO;$=6dwd{foX^BTAcEVqo;5&^_Z=b)o>BveuUE-_?ii(;KmE zH7>7|zOo*-lpicI%<~f}Yu#8k{quv14rgrT|BBW5tRGmxqw`^uH~Xi>VN3J1vIjG$ zxz+yhy)BJ`%ke*~mEd}+$8Y@YYR=4v`xB=t{UGP*DsCU5u&81GhF(@qz{D0ZpkUElE&D2TMOe(cOx^41fLrf05*8WxpwA0-iYa zq{O8!^W!?!ys{T5ovR?DD@&}!D_oD6b90asN$^CtsTu72*;`!Pw}>CV1@ z&x;~qkJKGV&CCcFlmv9Du=iflbpfpkv9vEfcUf*}?87o&`!V#BE%**zr7wopW0y^B zc@+{I>>miq?fxBNX>7A+$ysS+AGdDIbxO3o{UQBZwlA132Z3w9e>A&-8#(23p(vO44+i~q77NrxeBk!-|7%SqW|0qI9ekqys3 zxi&WzD>3ykKc06NoCh7Pjojcg)gC`#|Wpj;A6T7&(U*>-39&$+$vN_%vNk8 z_tB#deIs!GCbx^k{djKi5ZOkBsJg$)kV_1)DdK! zKSmRP>GdO|u%9R!blC`dagV1-X>qGMgRiu#ANt=kOnBV0iC!uYYF2!!CZ*pW-h<4mWkB`i za@~}|H`sx4ilnQ=Q}%chtA05_$D&)`K(VhRblt+nP4T(odCN-Fu{Pl+%X74$VD3Uz z;{ytHe1;!D$9@Yl{c8wj{iDuAo-BCV#}k((%-1ReMYLi3ue|O`l;Im1!VaZ_eujJX z)~v^V2QTWWcjn&Muvwx@0gt*d*REHJjhb}tO}T9jxe0rY;=^wf{zm0#Le!onUwcT! zSZAsWU-A(g7-}p(oxmOB-#Jc^5_+0^4lp&#-?F|fcPi(>^W+08Rf_d*T~m`Ta2wp) z>84b@Fpz}DlY?`~rG^qcM%yXYFXeZ|Z$In`6?U04du|dCySAHjhcK@e+f{1&)hxGI zW*>IfRzruGiwZqu86nN!z1mXoP!irxK1UE9n2H&C-fKDXw8JECf;;gkWZ9$u0?F-SG8o<8tK*|bVu&i=nrsmdd@Lkt+w)XPWa%AS<@ zdFkbq&wYpxARWZrxJr<3R%?-nN$qqN)byx_x5VXVzorPh^EMVa%ZzV7ZQHN6WG zF6$#~)Y{Vz%*o2CL3&qBB1n>y<+8ezC#TAtpYbgs4txI(0AWF%z8~fNG*Y3P87?#$ zt)nECm-aeyNFymO1aP2M)D#5r&-Bnqs`(N-{`w_SVr<}(`RG)}H7AH4rkDq!5K70! z<>}j7Vv!HHCs7OX>~s5T#VS1?8ZD(=`l3RqQ?Lu$TN1P% zSVnwyao7?1>k-S{hw5|%?wn7qMzy{6Mf?a)>#9&2Ony_?r+=Ql@RT1<>!pK!B<4uZ z=-TvdR8GPs{Xx{ENuwx({MkR7YfOb-(1rYtmrmp|_7LOq*0XncqBks4pYv`% zQZ*dYRi5TW{SJpE&Y_2O{+ZSiU4r%{f&7l8E6Sd2&nM!larvEM)~Cmoy+`Y)ao!Y< zUjG34pG|shfxi;3f6r2>6}fpWxrtD?pbH|D2V!!0}i0P5QhqYwKuI|9C; zQ;}j{Rgiy8O{b0)^m#|-H3kDs{M9c10Fl;DBFFw|Bw_S8)ocp-h|<%hJ5)A)y4sKx zIcZ2AKKfo-`FUUoKO*{<6@1Dvaz8Vj0bp0Wqp`ZL;gJvKx{(!IFJQ@~;d7DB7z}*% zy$sU#SIE_DRwO;s5?n&|Jb!&iO8A@A0niAdln(um)a!h0I5;F9*FacQ-U?tzp_Be- z4Q^0!&F#vA#mIf2N1j+a54V$TY^x9l`?$Zz+6Q z*B)j;`D?>$haP7d-%}k*F~C2zpi1?FIDy+t4kaX?K(;lykJONLgHckCNP*NTE2@(@ zfrsg@60W{((NnQMmWqj0xo(n{A^!j{qfwrfPvL}Ug+03SQQe>beNLpCbyRDEOw4|n z)uOZv&=&Mx>8uT}9myIeH6?iTr)3|mqDetq;N{BwIcR`FTmp<}U{QuEokXalrXK2b zokcBlSqM3Px*1THT#>{m`s((4Q1t@JT3S<|E_D&;sk8V-u`pIK!?$zt)T(=9H+Oeq z@*0~!SHAdBmfKF<_>bwY8sA7gS4SYX#DgypCtpnj3NhtR&p>G#TvF7ubVKF(>J+rJ zqxnJ6`iSTO^G>Q2QOaA~VIo4;nYHUh#)UXH7sM1$I zp^$#si1J8BbKhDRxb@j+qdngvQ(4(-`iT8zsp)&pL2~N&s!N9&FWl! z7SwqqkovhluDoW}1@qfTbC#xp77SUvaDP2(Xr#xW#-zp(ju|zOg>&WQ`e{xUv^3Hk zBC>nyNqiq&9T2*HC|QTqb-o%J89U2D2h_GSqTfQBzLMg+&OaY*WF6P>5&P+=Sg532 z)6>RJ(oE=WU4msNimYQoT2Y6zpsgdHm-N=ynxFo6mVTP{Y8fFuX%zlLQONIr4ua_z z0IBI)99~$XU({z=J;9_H2^jp84M0_p`W5|kni&_(tAHIgv zt5YDKzn(&)_tduVWgV(B`e;z%4gv4^>tYr6W2)R#+NQN45uW;v^xRKyKYe76f!U6> ziBG0S>!2$5Uei!PJB5;UjDM@0XEml6o5?yb`Q+=xU_8t-`DXaVU93xK4(-wRxGKpTHa>Q#Ap3d7g@<` z5q==J`IgRsO>^dd;5C$23a%U#3n}*0w)Rqroiq>}sF^Z7v!QdtSfrFy$Fa_Jgwj`& zn4<~@)4roiTT>T#WM9iV7daDI=&+ru5TC+MwF=6W9&$(JtR}e@C9tRT)G2PAyC51_ zK7}*`=!m7lLU1`9ZsxKsT*wZBEy=<38kDyVV;s1QY6k+Q(xuA`Ufi`AjA(Ea{-;_V zs-U0qr;fE5Bt6f3{d6RRL*k^fNB!T}>%i%r`P5EF*E;ku^)0HkYG`53Xy<{4UbBj&4}X{)eDBJ&7y^cWgvOVI~WF3BgqZEEa0`5-bKjy1D!*936$U=CrjEwU~nrDRL8g)+?9{>)<1Stl;`30`fFdp$_@%K z)dsmsQ{%e4U=l_?qg#Kp4g8=3^w95umAm*%2iLZ~G%|lG5_NP`#Ug9CYV(wGx{)5{ zuNVfQzfRf}4Z5mN!3KVPwIJCpJV9D!KbEg+kP zMSMq;l;i2&Mj7gWxE>03qrB6=pce%Gewrx-(I#B0V?XI?x;0Zue9(m>TNbjS6O57i z=;;kwu+2-z*kx8YF?~`%!#N>aZHJ9EEF&=QgPQydyD)zM-nks2uE6+Z| zCtF~kW9n3A<}sk~$^!srXei`+a+^F9f%4INZq=a-45T;cG_eNhRBSYNS7^cqcmqDdcga6jRwQ}r(BNfAhddt_=+RX}i4 zO!3?oIH*zw`Z^s^aJWH|YE?1wz|y5=_Po@8oT~tQhiqt6_ql3w&PS2IEf@t%Cb=%v zMah!vRDYw5dmiC1whhTo=5wSu5=w?FW|4F4oqCq)f9HPZ#v-xCA^T*lA;&^6_QQ%Q~92xxGV3NBZRIz@*slrUJwIlcO-~)rom5 zYx!qDUW%1n1)gl=At&Z^R+h&*V3_{^rmR@@>MG%o0rSST!)a*y#|a>PGzG|jNwl^j zfEqsk0G5qX?f8oKPWm+?cs-3NA6;vPx+Rkh3*$p)vXx63ZMLt0!~vo!wG{wh0Y6cq z*6Xz@Cz>W)4`tMcy?D*W8g?V*!&PXw2tsYzg&w#cPWs7q)nlB;8<80BYg#4jX`~;JIVmeA^HW=1ayYExKl^p{TTlMe4jc#aRWd0feKhYS} zwRJ@+(c4-tG_gcK)f(9|(Z;>t@lUWGnkh9nQdC6k`JF+TJ21t1S0I#WZuauJZO8LeTE;_~G*1*w#P+?;9Q;zQLN%rTc&j3@84cPvA z)N1N;&Un`!>tu~?OO+!647elYGouI9RjB10c1W@G_12e$y@?S+kIgVOEY-&3ajz;q zsf}-fu8|xG>g0dSWN5)uO`z*RR0(O>N6>fHxs60;ibtRJbEhR+Y^WL>NXOU>V>LX< z8DRpd0izDICkY;DE0Ia?h#ygn4W92=58_VWmYD99@kUrlC`@|x&XsE~HgL>loXhkJ zrU7VoEpuNPkmTh4c+jb@1m`Q?^CweE(A>r->G=Nuq%ooO)@6WZN|zsy(*O#rls2mJ zS3kl1d+2-K;|DBMAN92!<83U*!m46ESR?#&0uv@ z>j%EpKj4i{l4qG?K2sq-M$~T}>csp#G|iuubif*`Z>oNZw!UdGBmj@0(Yh$7nL>#~ zUrglcr6+QBRi%_?>U3JsZQk?0`5h%t`hsz*rqUNQjuo#RhP9Np#W@Gvjs~?&wyut+ z!LDF`(32WpwQcUARw|^GMif1WkYtbRr>j2Bsiia4(i+R7V!RENV0 ziGR4+AJB~Js7}hX(y{*lDMoM8T3=?`WI2_hf2fRV4O3yEIBH%>IJL8Xk>!e%O%=^7c(%G5#j?CO~{YIF{VtxW0 zuVSat=`bJ%MQ@XK)TO;wMcxq%hv;-_t_!R)ymD9)ah}SNl1J-~`UiG`z83MKu_PdR z@{E!{Z8N6Ar%~YYx6g%qKxDO8|7$^QTx>Ar`o+hzzvQ`>45Ks&Htf2MU>NcSt6 zd^D7_&GHNg{+bmg-MggaT8qQ^1zZg&+HiPH6B@}^wGUYKyo>_HTDkXiU_X3lyggvr z;ecSwzaahp0K;6{QA2Tn@R1y2*lSE?rZxqdRr(D9)3sQd_+58t>W0;sm;V41)v6y^ zJVpNivrY6H>uS#;{o8RRz1BrxkN6#NRW;_SoB~p$sP`ywrVA$RtE-e#(@?8q<0}`K z{<+efrwELsF4>Ey+is3LTx#GT4}V|jsMGbAVE|GJ>J)!(7I2^Au3$HNg}OD9?z+Wb zGsPK5Z`>V4t?D&f$ME97(Yf_vBjx=Dl63Zms!F{#A75VGD=oT9WbqGp>QtR5&GwbK zt1~^Bok#jA!}@BHt-jUN&K{u3gZsEl{{T%*xA^yW5H0k;zQRDqAJ-aVU;~w5>gTro zqoJ-mUXlo#;FG|=GsajO3Sfz-My&fK{-7p{_t{{Xzs2>r&B zHm<;VQ3YMXd1Loc+x{A{t@}G>P^z@_MrjBAA_70dNOM5p8(n;?(uRs8@gdwzP=~&G z=TPb^>0ks2*~s}XeNDNIxRDUF{sNC>>_1>Mmveg6U&F4o) zm3Nr{`J(7N-Al5zQD3DHr1Er5+=gB>JNF){|9nW5yy>euG(V1GsH75d)g^ zUsB-{{yK$8x#<4@`KfO-?eF9V`hs*odITh*kWW^Gc=MC=>~vNd`gcwuDGU6pX&&&A_>76Ok?wWZB1x9~87pJ_#CNKce zfKpr91NpWj=@-%FN=#95J=;>2mOthI{{T%wjhK;){`!{_F!duEmZcK5nncDx*Mgj|z+gXJ zY*{ntb?Kar<#jg|MXEE>`xPhh)}sune53c&(^vBV>s!c;{{X$!*->hUl|FDkL8)r0 zdjb71sJbcjZw2xlev1JXZ4<7-`hiz&z0qO|-bsg*dj(>ew0 zIs1xK2=lbZw63fqIRqimKC`{@!)zOdT;(sj% zYL-LT9cyZW$Jf_Q3`;Kfsj}Q7&zet7L#Vi~^5Fe-9)1K8Q$nh$RxyAv`5iDc1SUeK zO<1gO;0*nAHmX=yV0!*~A2m@R;Gfq}W~-1N`}Eec(Iw9%Z>bU-@jbLQdUDz4jd?9| zd%x|d?O7XkW;$?fB^M~O)0NH!bp_+%e98TFI%yR81O0UZp~g?}$|my%YND z&xViJQ6?jo;bHpgK@PrP3w}pBGzAbeX?^21*K| zdqV5_YCM+t(6cA?cuX{{R>m_()YxvCgQ{AY4$Ff)&p?mIvjib4eQZ zM`zUOVX1SD41Xb=Vri|uAm;5F{{Xd( z6)ArN5qvtIM*#eR)_(`v%P{>&)Vhl*Mo)rN{X_TE2e;fKY@@7zeRKp4>44u0c#5hq zG%?)5VIbWi&*0f5Hdxrf^g4(ZPD9m*-FL4Vle_d@CqX^>6 z{{WC06%5r8{{S%<`S;e(9;!~_H8}ceU!sMea*3txochM({dFZSQ8~)eG0>>oam=*f zAE4Itt*49esTlMlI=ewZFi=!2LvTuBr%V*qsT&Sw;q=lhTZK^KCpr20YESltVm!4V zH`MCv1SN$$OH5+`d`gq`8q!)w!90V0UG$SB^0W-IM&nq=xNG@hI7$4ojSniekekhY zKyM>s^VFDbl^Mgx2iH1K`{v>>&Z8feq(gUUNCqNX#>}bWCKh z{q&C32%F7?E{fd^H6#5|59~wd!2qrfdaP`h%qy zEjUUBRjVH1MnDT^UK_G8;+-ADPn1UJqj#{{Rh2j`LF?3a)=as9IaXm^`KyvsOQPC#CQG@J_XzoqDWq z;XoPX7QCARi&7TV+LRV}#@VttrwyoFZ&7zmS9{O^6)oCUf)yI^7n_ znj?y8XJPwk+J?ShK$bOssM8G{RBi@g1N71ztdK1%(nr}=3$<>E-KqGGmvgOC*{Y-U za=7|x=2WJbaLTTJeYFO+Zct8ykeNQ?Lfvz(Ase(`6-w37Rh24{_@9{2nQfDDCR!YQ zMy^@*wKQb#S0_TNHr;H45kuSR+SJW(Jgjffxm1$SKzm6G57$s?ZT6v%>n?viS+(0% zc+kAa7xL15z}sk~Xym4fX7oP#*2%;Btgh3Ra+O+!)V=&x1LS*ZElp(wB9Re~KV2WW zTcNIlHt?`W-k1RY0Ep5>>uPSC<~1{aq!0oB01awx)5%%f9Nq$pcHFlF$fuqVK7$%k zxNbX}k{WTJr+rPV+FOjvho|L}+~?C#WZ9RbZt#x(0O<`d26jm6>m%G(N;U*KS&zu-GgPoW^hQcIZpumd_Qs&pQKApxNyPk)vAyMP zjy9E`)sJ?@w7pXL2h?eNG(NxAT9xTo;zA_U(n}YJJBkP zO5e7kOEg2emi)(UD9BTr7*boe;vjyy*YOIy!OoyOx$m6*de$cjdyOc_oEVCI;Op5i zKS8XL=)u2=yob+2J|iQt>r1&lqd;USfq^&CT`a6T^T>_v8GC9>)wCQxhcrw*fhS01 z&U~zK`Riz%zzSIEx~ICnkW6w-+_Ypb)fj{RI{7Q-Ut0OWA6)5qW|VgX9Y}`0Vc3rU z07H#fa4PmvIG3uWZ#hZR2l{onK5L-iJV@6WFgI^BuHO zo}#UfnIa&2sUP<0G_=Y+XHoRlz7HA7o3gPu5WzCewYSh&&N^ zi|@l9*IK5x*VZDe%BbHiBRT`Pqi6u3GTmw&d#srG`sy6jaW{96{zZG})RZ+8tKkqb zKhegAR8pdja+BZKjRS+ZOayjAB&t#VZNbmeUdJl9^YPb{!4`WqH5aW3gGKlk-)$`wSb7@)N3{3r`J$rMUu|_ik8+wcRk6@u*_rEBUy!y)HwZhc`8s_ zJYwCkpRTgiJ53?@<+1nAYa*#UJjISdcJg2b{D_-+D}NrBkoQ0VN`^|JGntOM(yP}f``T*p-^kE0z)hVwZ*XOy?p zl627UPEc(s(A%{8e$fFha)M$;3ULJJt5(}9Vr8d-Agk(l`f9bccr`2~m7_pC&#BS> z0EiTL_yHMa^(FZK0LMjRvQE+w{{V%wD*pf)IBVDu$@VSj zsV&p{(#7J#Z&nBSgNZO=y#KSFiA4t8xB{lix>viftikdPCmP{uF*+&sbDVd#*t5M8dX^gkhlj$n5u< zPlJM4nD_FX3QOf8$b2+l2h3+tmu%Ea{%yTa7M<13-bbNf{*7V#q+V%?_5eMntM@`KCSLik&Js$5b?t@#aLw#a1jJWfZqrngeZ;}T(F$~~C((feZ2C{>v| z`;yu_1R=Uu+d6#}$^k1);RD|p)^$4)irEvitK(pLmN*)0qgpW#WvL-Ye=BMQ^KsEf zPHAa_$j7nr=Qaj9vG@*?@LbPdz|A%?k^OQGnfLg{{TZ8 z(G|ht#7PR{-?wcR)~1IV$`?{=V>ppYerH-Es&L+7dwq1nH7pfLoGvQeh{QT!HL6XH<l?#ASjb&+W<@^10HlC8>J{=H&^%|dVw$ZQw>M2ME)VR)#J<8o| zUkFt~#1G|cf%|G~2n+oZ?35Q;atyHcKd!dK(ndI#*nInAM5^}1&{!$2Vh>{Mr)GI93m;kxvxUc371CG)A6+rvbboKA>o&mMSSquRcFM+Ih8F?J@u) z1;0_HlS=tj^fWU{+)jUO7N)RO_9ad|ur+E@?TR;5YFcjp0FdvZEw(CFAO#|U^8>zw zyad@`h#& z^dq*JTC&^l-1){1Ju#$fM$yBonPkVWn@sI(rbvVjREh289rawOFfg>U!&bybLJa%o zQt9pVv4G84$e(UQQN9Y(Z&1%s@elG3#0_Bg4ZTc;dDYh*nD3}n@QRy#y_ER5IT{|; zx_D(WFCHG*InbFmjlQMI(t;H`d5$xvm3yinK;(+2wgJwiDoo2AJxTDAaz1z-nwJ%} zikvSN@mtrs;~%zzSugf>Kx-=?jC_LtPL8JW+0l;)r-%XWrzcRW6uglvaE^6;Ao&54 ztw#B7@XT~Dl>^-N&ZM=@$#Yy$$Ycl5V?!<$JSU48bqD343dhA^QGP}L0Gq)*v&%Wu z`$I!m{v|@jqtq70KgU5Mw8aqSc}es-z`;#0XycA#aoeys)%+EFm7Q;|+jO8URdNzN zv&Bd4qcpdzsMuKUDBtLg`lV^?!^Fj0vVr*#{yJ>i^!5r|3WF;!^aN)@TVWN@R!O|r z82E9p*P`KToD_~o$JaVs=V+2VM7$6BOa_G1JWT$FlpBCfvs~)pIHieG z<&&)qeZ9armKgQ<59_4*exOlSNF$E1SJ)0Y#)_@t#Vl;qR|S=^*b{-PEUr~rn_1LK z%4Bbfo;3sHd+BDYdDYjsl+&3|dOHr91dCXb zB=UbLY?J*pW7#*&%ASx%G;yk*!@wN>0EUI%1uX@ir#Bc7&2Xqg?m+L2D%_ykmg4cq z^2+Pj@k7|@({t{6+ocqg{e0J3@Q%|`fs&z+tfKG7lpWN!&FC|g6zN)5K zr7LKPUw(1e+X{o`N89rm5=yaNPMbe^C@P0^v{5dE5NzpaUJgeGJN54;5DU4R}Z1)Vf z{{RhcL&S%vpDKOw5BTV`+dfJr4>cDiAI!emgHuNg1oEfv^crX&@QaRCs*1{Jf%qj7 z5Tw#hSv7#Uha%|H1bl% z?d6CT{m9qUT}0mz7E@nVnfDN*AJCDga=jfqVOmws(;3zaQ$>zdA)ODV9E~tFwZd5^ z)iPVUk8`AOZZ~S#NjV~D)Q|eQbhY&|mbRb5rlgBF{{TE(0scC!DX!Z#IQZ03WP#r@ zwtvS_qL*t+Qq4}}M&5{IBN`JNXR;Dp1=_ZSe3jrU+~}cG+<{UF{{Rghw$j8SSswfc z9_ly5k2x)M}Ectk@D%28Qia$Ja8upZJliX599QNjOp8 zk#pr-yA>apI#JUHi%jddVO}+N3l+vQFe~B#>K}>H^wbvSW}XX_u{X8}{{S57va6Qo zS4rYWd!U*V+~Laq0FIST^19jTz7~m^U``+Sg@F9Mv|~$M)pf}#=$7MMZY83tX_SBK z!JpXb6unF~{{Ss@y=77T^vEVIkS+tqpT)Ow5Df)+m)ObV`WvW6q`?WPDD z!9eL>SWmYOv24nTMLm6)>9hX;H~|a$4*D53<>}SJP|aI}KiytA{m!bJ&0P)EQL5_V zNf7#@@;|W9=xJ$c*rg>$j6w7YRQ~{7H=@CSP?tE1S6Tl6lNR&ASdM*v5|jNklnb>h zhAC^x`vobTQr~t@3x5HWNPUU!KYbOpP+Y0Vnrf+J9?G(XApLQo5sy_?M=H>(+M9Br zIW0s?$JCL-L96zb;AzM@5BN0 z8lch#D(pE4dvw;OF+pjO*Zpk&08M)=mwIRmQ7EI&ukc6y_f|!=^S8uovQ14^%s&@q z{+ZIoDP)ty3Tr~-_AI^h z=Vgv+PBk;sGobET6;^D1SkNNQS4f3@P23e} z({A0T8>xD0tnR+PGNv>60i%i5Z@Q61whG8meH1KeKkd~~NnEI+Dw7<)t`F`tCR!T= zk+jp2jC}&j$dBovF>d8heJhTi?K5^*1apT9Ju<2o{<_;u*E-A5DN8hzlDA>W70!P{ zu6$dBmT61d=jI2Yc$JUtMu<`G$5IV_3QEJ>aKGR*9?s82d!5-?yNjy((%DhMuJK;V z{{V-GRa|~r!h@+(PNA+QqIPebfE^=^+hng{@svh2{^%tC0FH{qQ?gzaYCd9bQ^;Tq zScG;6cN5C8Xt#|dum+80L-H?>KW$2-yxb;}l_Rfzc_d~30EpFC`;94c;8X$!Vd!-# zi+5By9!<#pe04fE*;eZAu8J%D)-~f(Qy=>?0yQd2WELUZBg=G=c-Z~d1Cr2 zYABvGV$xPSf2|?a4KCzHP!+FsnhL28i+zEk{_8vc0K-6Q>S*ImDx;W^9`mqNk|OorlM4l@T=q}zC$V2=xI~=DkCH0$WA}5mXfNZ zkQ!GSDQ{yT?Nn92((E+hr=XT*w8KqK>PHz@Kj^MM$44lVpkO#`eLHD-iVoqJqyD;L zq8I>pXCFLv)%2PYT_Gs-0|9}PpRSo`C13_r{@PZijhh?~AIRvvER|4!i5TkoZ9%-I z>RAip+eKiIj9~uyQ=__0xaE=tj6r&fAH-kjrIu2g(|RN24c%C4OIjo&BU9pdS8EL8AaG+>qMYjZyLDO3@Q=v-IhW7rNi6b1~oc@|*n%2bjU)X9h*^j9~`i(iV zgrf~5^9PCQM}2F07>Lh{gY?n4EqpRtzM{P>UY+}Cf=l5j#zGMEVSnd|8i7+q8)TOs zqMaXTqWl1p3%71%CbRKIxNL%JW15OZFV501jssZySSXHeW3^i{oduJN2X=p?=rfTZ?82fWL{{UM$j}^k0kRq2lgH*$dR&?(JgppCUYMw$P zg^+%F)BTZl{8A8pME2E^f=RrM^%NBGf(&4Onl`)?Ce>{=)!^OAkFK;yU`U${gZgRWt~yo! z0Gsdh(795Wk`8}eFaS{X2ujl0AU*Kl{Ycgy1ksEvc^^z?Or8WeI5{6Mb@74~T&$p- z9>gW-b~tGX3o@|$&Zoy_veYhIl=|}Rq6#8h_=_74sML0z+zCYiPx?K^rqnx$;c5QO z*+BthEDxqwV^~#f8bYDqbU#gO9|a?MJk9kw$(`Uo!{k1I9ag}IIH8HRihuBOseODuooH0>Gv^*}4L+^x@QqL6aK1M}st7KSQZ zJaV}@(F7CKRQO?Cl>3I`{yH}mk_dn^asd1C2UJyzA)=@W2QUd9-iJitx%meuS#j^J zrrBVVJnC@ZeEaBp)b{vYf>li5eA^nXRo$)A-XmYbP(jwTy9R9hU+<`rJ+5)#m*jmt zbq1!=6ZnubmHzI1H9=ikBVThQU{nVB4G5OuSsQX0EA!5wJasXW%p?GQy81e*NiiJE z!29ItA^<7z-D?TRn~3=~rbm03KoU#K^3I_{MNK-N0$prd1f83iAp2uLekg;0M<}n8 z@f-*vW?5Z z05w>~Buo}>>#20|Pa*yjx9Oz2P8^N8g5JvPw_YuPFY!j3E!R3nQNYGQ`Rak9ismp< zW?cFc-%ZDyT4(f}^jxOJVWT*4|!v4Wrzd}#rPB}GEd`pkmDl($`*%7GReYM6_{6-wF{#%oN2g*$ zfA03uozDLN9lgn_r5GOUfA7=cggb?fS@z(fvfbmI38)xM>N zZ7u!ul}FCU9>XVDim07RsbQZ^`f!EqS1H@9nOGBQE7I-iZVWD zxAz zs;cVR%847|iv_^|mz%!+OjL{dIc^y}))snlRpruTngB zEu*PmhEx10iTYzx;n^1lJfem8{PC*TRNfN0rz6>pra?%`LppLFmYU((5+aWkqc8IG z)=y%%#&A3y1LiTNHGm*<{Se9*jxabxN9CPPGEzu9_y^=hwaZ0UPC&vCf4V`|*xE?2 z%}%-h07z-VyQDahv`W-qW5Yj~(D~gCLR7MkmNY`L>i8&PLHP{=sjCc0>@%uy3fjjW zR>n?1@v9{M+SB}a+xT@3bEq=a6+TwRwVIXylQI1?mu*jL9FNnE$M>Zr)mD@T=o=R3DH( zzNB4lwlIXG1jxSb-kM*Fd-#XKmLw|OvXJ-JvR>$9aUE5;q>e-ApcAMMWjbQe>aED) zW&uM1*kwWOq4L~js%&|HKEq74RJ%aJvWO&z`m&U6U#1Q<0DZw$-{e%&BQIcII$3MI zQMYekhNUGepc;uvlj-HwH5SS|a!QcjOk+f(qEb&4?W{iTZ1;~)j?}LE+6yfzAi{h6 zj=V_X1I-(g^wE~KgX!B^{tPE|T>g3usDZ*6;2{SJq+II#Eh(SMGap-}Sy{dCq>bhnbUC8bs` z^Q9Z=1~rT}_nrJ9IyOF?zkO~p3g``Nc`$ysKEaKMBwY%%d=L=!8oVWkEVpt%Bv)%O3S>pF$IFN z2i%i`s7psIpTwHFRzIF}y6Z6R@^{*deo9sU040P1N3U&sEtPUGO1fOB_w~+<5Qn*w3&a=`HsR(C5OIEDx7+uak4Swq8(MQ>Zva({LD1CfunQB60}#APowtf}fZ9 z^mot)-0v_7vnd}fX==IWJe7tI*BYZIV4z{{m=fO%Z zy-w<`kZ@KDpY%qBJ#|EqW=AYfuD)17z&-xD&1rH#$9($g`BMXhA{vG`R+ozEddCPr z$th+&*zKs$+n*rv2ldgbb*?w=?4Wz)yPZT1aJo^TLd$@^(?sbh-B=KyeKngc98v{N zUAt%7MCewW?z;X}GV~8nEpD1W zlbGQH(})L4vJqOZV}j#t99oU1Uv`XVTTR?FMSdK>%k1&@)BJZwq;53Q$07d!NDP05 zv|efC+!1&(cqqhrqT~ALgZ)sJD$OraB&>XOZ2Nq*5~k@S(jHt~eA}?m%ihB_xY}US zN>6_v(p1#7anJDVvPF~FHb$%+*$4=sNaQt?2_H9>C1L!gOagVXT3QQ=1s7N$X8unU z9WC4}O-&G$rSTcN@drT)Nlz$mhsPfM#*A>KCs*mgu2Uox=o|k4Vqj<^Y?|6hS~iiL z)cO!e(QUuFC{!v|BcVZ$;U8TalJ#k*i2M`EB=<5nC;DnCB&11fb#cgHdrYoR^MQah zl@8yQnnLw-tjV0=m}vcdMN`H^ejq2@H?D-!+pe>-aE$l#Ecwo?m477ZwC_|_?85fc z81!#J`;9&Q^<$cxc+VOSnhcNJ>Y9o>jl2_7M40Wx4zQ@ZTqb2$DB3v3sP1#2Ee9&M zQnVzjw#haiti)&JFg3heX=*^0I)~5t9{R3nD}*YtN{`RwogTMtNtuFtG-#vIiSPY& zL|VPcp{*PnmSieD+rG8WK@{;56FDpL8XH%5o5RLkmmZK$mYMD>PKu63f{{Y{kwL2s^@nWHHeQ-g>qQ2HJXEs=y>Q_tzDp2f# z&w7}}Ll+huiyqo!U859BhqyzQ9hA1AM`4h`!h+H8?ejy#ldP$%*Vr2~Jec(2S30AW zNOexyq-k0eA)FrNNBx=ydA40GaTsW;Wkis7QInlmB9^Wg`^4Ojzo66#h-#!IW{1o5 z8Pp1uKT!qCJPWpdi>cQ8HA6+>Nh<<=yd@DN*Yx=0JUk&b)e5jxyBt)@H|MBT{H3VG&70 z#Qh2FrMrwP&nUcOZz>vU<2-}h;QHzmn{vx@COc#iqUR-~9nQQ;i4np}9DGl?9sdBX zid?q!=FdkJ&f#Xc(o;`^6tYshamoIxFaZ9V90diOp>lNAmQ?|zrW}5s_v#f!#;2kr zB+;*Lq0X6-#l2*(Pr5C8YPP1=0mPMPnM6NR@1VB&ZQHn@6;yUA`lM#!uMHfM0)AOg zMz4RNSG4*dpV@jekd@1~)40&f#@bmTXv9({A?k~#N`1Y%>uR2wiosVjkPONeG8!@S zVT_O0MCf)d@48%Q?B;;eR9qj0JJs`!84t)lG5cz64L52AIot(F&}>wKca};gB%aS8 z$M|WMirCaKn3Z7)JLI4_{dD7Y**p5nCCi@Lt8r;(6^{||k|4Ru92|x1>Oj)%Wutm5 zcIvw8RZKLuasEXohvlEXJh}Dm4zGUXKo<5(cc`bBGUk>rJ<5*ytoId;dWi^vq7(Bf zKkn6`y&@Yr=`E9U&{b2{LUANgD&-H<4C6)zLi&Yx+H@PrFT1I2cNTSkFrG;piNPge ziShcKF|XM~l``@`3z=uIT;iRB)HI3mI*j(2T$SU%{RX-w_0Zkfw{JFGy>g+WsjS=z z(ouL)mn@(hlNetWe+l(LrFeE-+UH+!w_A42Y{_Yq!BPI`7@OPPJNCwp|b;< zKv?0(RIIycpUhpdK4V+y_Ph@mS!yKz0B5it(^h5Mr+d~bjCQ~5-PSqkS1?nx44x$G z{p0{1L+Ugt<Wrb(EZJV_WGDsqg>S!g28PB5fVT|d`eT)GkRbmbTqUPvYYVEJyV9(Dhs!L@OXT;VaVYx?}}x^$^v`j@~#R{@L%Nt+RI- zqd<1TzykTFhCXGF&l&BfD^}3y%q!!^RAXb@A;=^4)Yi5oJC&op*TV_?J{-gXK1Vvr zW^pzX16ny;;k|Yi@t_92p8PIetng=qu>tMG`ss4V1+oAsLDs(Jra5jN6<8oNbqkLF z0Fc*ET{eB5_Y+fBT&J5O)t{ODGpdIF0I_JcT~xOVZN3VEtXTM@gZmudYgA7UN^|f+ z12;_PuZdEUNeE${NrQv=0scA*Q?zayRLNIWZkkBq?q3B@_-bwAs~2d3LrH3aiPV9~ zJLmQ7pq0H*-8TT#brZ!Ta*iw-K3N~GjJwqn8uC5}bynfGRxw(rWL%$KMBsk<-AgoT z1a`Z$S##PpIsU%d4>ggl4rY$37~Rf%K0HAFx`xzsmgxysQhfK=_-S4T1dJbNL-r zb=#$@;7k=9eTeV-`|Aox{_&Am$w8IIa0<8YjYqe5q_At1dQU}Vtc{T)q?qHg4kt-B z{fxdhiv>jRDfUM4{+bzPYkdo5siQzY=;v<#0M}mbZP&IaqYXxt;!rXk8l_by>&P7F zTM1`%43=mG?Kes3tB}0cs&bc zE^vD?{{T%R-MY8D>lu<;tcbb%G2j8J^D`vj69b-bu&dg@;$*2OUf{+vs(^}r7f%vpyknJTFTa*6)KC@fAh;kf^eKZi%I2hN0 ze%Tn)0SF9sn3DZIe9y~7DfbyrJlu4iv-kDZYdIM6X`#U>+HiPJ^t+YShGu+v_Bv#@ z?&^cZBB}%*?;L8N6;J*1+w1AA$zM7URz@F@(c3$OgQs{Ha=l^RO#8g`O8PRn z6*>B6RCNyc^hsSv`Gcm5X5d=5{{V+Foc(^sT20%f$57=Z8ZRRRSn4fbcaUP@>3e;JF;R~Ctoyg%knzk70R|8<}CejokgLs z)_@6{IQr=QzR5g<2k)%q%?Zt8iqlJds8N#3kC7glBDdARC%?=AqZB(=!~irXLD6V- zR0juw1MvOh7YKuksz zhwY~S0POr+ap9BtYX;k#yCirT4zpA`cW{;CNxO1x-%UwKd4Dc+bnV#?;Xx$*HM$E8 zQ2Z;Y*J`1sasl^hKXZ|tWNguu&msB^GJVHT04*8Dvs*i3ynkN$f@Nn;Qe@T@lhaV@ zHq2^-h|3?#Pj70J5CkLh)=Oz-2blddLr_9d)7VvAM&Ewm##c}#+tZM6PBn53u^hed zGp}1{M5)V){+QE7vXC7aR9yBM;_v6r)M_hG&c3huYT~9nR^PG#T* zw8g3p5Y3C*&M3DOX`|DYXmRuPlBRXi830*L&#3AlSGaVW;@yOMuCYhHAzs?LZ#DKxQ{l@{6rVxJ5u~fd`iV*S8j$Dx5CGF7i>vPh z4w%R8l~vVrG8r<@y>3J4;3lI((da0jl5Z;KBiO>4b*a8p7v%C_e1XoR8?kafh=F_L zvis{pbW9nfhil$@{)i+yYI}ARUM7!DI^ zDq5D~8Abf{rIBqMEbp6sQOvnR&Okx-(2Dp=gT;vbHLe?sPyTMG5=~f_4Xx@WjLSLOVw5hq9?QctN$ue9{Db%?xOL_~%nC?F{e3 z#Z?FU*#koSCXP?zq>cLPae^06=_v>0s9or$+sRFI`+P`-L<=YSr0Xc`^!ej7at{80 zXG?UKTAOYRb31(r)cCh`Ljo00N%LkpuQ65t2-Mcf6-+}Es(!kF_WC(;CP@$1CsF3y z^^zduP-oXr=G+Y!=KgI>rC#u+3JVBg9j1-HynBskskYfUuI!NMJsh&a@iZM{Ke%2iTnJFNC6) zi5DP`eqFU)GEsE^TR!+C7kXjbdoG67RnX24I&LS}@gq~q1RNE>A0em}H2y1hQa?>i zg+UE*vqCtNCjBcCFHc)eU>9 z@+vd*8r+v-_;~@Pwz-B=hB*3aE7nLzB2L<_m%#^8xK4{+9Dke{A6;#wudGQyicyb{ z(nM9Wj{Ml;`f7AHdDqbTY8aFcysIwXcC3xV$XD|xPBy*GZHOtTs6}m35ngH-f1W>( zI+;&$W_4*LY<#tu`fc2&GJU5DqwTx;(E-BMh9l~9#ZA-?h+Y)R$3FV!8&=?^^$IE|1VH(Q668D$KZDZ`G~Fnlpo;a_wu4%?Y_q7njdNE!|3@ z7+k6SbX_;(bsktEL!X((lo>33=uC5=lioIy_fFij*&$&`3)D%D<&VG9zL37|mPriX z49HLNhb^mW;dg45B3e}-{QK$wY7Qri0Z+aF*2t$V_m(*{?Q!y|_L7=N+s_oAkQf>< zNk=rU0D?u&zKqsX)4~hARmN2}O;Ml9{5j!c=(f3HtZf z)6mkv84)B*-;mN7-4_pwNXAaFahib zeFwX3m}NqxQ9n(2F6u~pxX0_E72B}BN}TBjs1~+ucOg@Cw*{D%4oJ|7sagL32_stP zua6mGKS81L+%wrup6J0^Bfjg(l$_-FpP|r-o@<_KolKg(OdK5kV^AcLd2&k+*IC~f z?6k0+Q2AP*pCY!gNh*8z%h>$Jq_VK|J^qJUNR)c9&axPa($@f^R6Gg^Dp|iR4W2^8 z@r`k!az^Y(Bxf3jEimJgf^?Z8a(f;S#%CJ9Nhh)Xx|-C)`Yy2eR{rj@7~Hf6g0wA6 zso3F$rPEySz#3&E+=d|QLsKyC$6g3qR2blj!A%qt_R7yRa!nMTxiWj`{kG|OwmPYj zY2qD#@iW_1{X0nuWn6=zuswA^^3KE$?wviq5R%}ZZX1!M3c{4c=ljk701ZO>}(PT>K#s(C8@vTLrR_`kV@1YnGwFAnRF9eU)%^V%~aBezKB`MC*)(RX8I`vsmk3Y)eTf zC$RFK`h}?Xi^2iMML5>frj}mp#~!~;6Pn*q31yO*(1G708qS)Olf)sM7I zd9BgF_!7t1@rVO&Ei08OowlD9(n{G?3u<$LWm}q`S`phesrXqA5nyiF$IfDQQ(u z`%bZIOFK$`XakGRV zda3Jtzm?=A1P;fz)Jm(fR-9B)A%9G&;QspE6tuLmau5^woam)A^fj39>0?vsaqFTP z#i}&i(qC1O#h(s92hEP6`13<4@R>>c^xst!{2Dcw1wYE+Njh7(+m<2DK_7pYuBq%G zSVY%aCvDxe)JRd_fr9@4c;ig=o}gO9%Jme%8$NF_AZoA?hCX80{IjoPiXRh;$^!oY zT?moN7}{4r(eI73Rxu>;fCqmz4!4clw?gtt#a{iDoBqvn%(WEsvSOG>!#~a2IxlSA zDMVMsq*qn;;tBoEiLwp~0|$1ig6FwujAm4*MTi{oDtqWHCsC*;mFem2(@P?HxB~<0 z^VNBI-mQ34f+}MSYJUhmzn`|IZOiSl*xn^Va(4CPG6(IV4+P_cJrWz9Q}xFAb*`di zSR#o?&m-9Cxt5Z+&eF{RD$IMZ82*|ob?P-Nz`;*#j1Nv>jz4V){?o-#4}la7%f3RM z#OmDUoLaUu>=r`$qJA;_H^CwwcmDvh-$JJdoRm!by?X)%w^r3uAL0mFKHb6p0KY=! zsg?Y%-#S~SeD&+cQbU6xS1_$VMCK91bbHP4?zKx>0pm&*0dbg0_Vd0Vdr&*)1JX^k^ zqD?b#@Y|QSVl%0qb=;$m#d=vvXVeUh9&XZ&Ezu}%F~{er(5MH#G&VCNP3Be}#1V~7 zfywMU40~$9LPaU)R36wLuD3@!y7*{ex3DUQ3_g4qY42y z`e?Pj3Fq$`6Z>j36;zh_0PP?@=;KE1*V-8nK&|06dt?tTp$TK0BKBcVOcUdS7SCXN ze@!{k-YDWRMFNF)>^Tm@_tkkdO(RsJ&sg;#JvbZ{)85+OmOFGvDrmkWui)_`1drJ1 zE(GNxGaaDENx~_^@g9Y< zs>b2F_Y7$uD6t|80_V;9odmUS8@RcwvrkbngWoa+RUeSm?IjQ(E1sUyPRID~Kp1=DRdpv*W2(3C9HJCc zBULlTMOjB*kwK-qw%W2?^D5Hue*M(r{4`ansYv7`iP-nalR93x?lz?4kVPr)=@Rz+ z^*||(64lFV#RHY4r|!OtTT0g}O+@l|e0<)Wy)=H~yI`k&by2b=d*tMuOtWt7t6F?0 z>6v8tk*3)|KnX22opRxV0iRrY>owamQ-bd!E<5_;S2YEuir|sdM^h34J7Is}trzX1 zK=kE}Z$G4C2Uowct*Vu0tE7J<4;d7px;o^}=J&KJ@ zrQNp(o5Ey3Jd3b#Sc+&tkwYFUWf7w%=f{V4_;z2rp(QxyRE`oT~toBHdY4R)iWe68m_b zzqX}QTPmlUk%l6l-en_9GSSgdu!;zk$^23>3%b?tflu2HOk{=J@ z7I_8$P;dd%N}37kVDUw*5sAPA;QpPp?M#(123lHA5=>-Zk6lZ&S~o4qOw~Vxq=T04 z{WW}LRdxtE?CQ$7R!BFd2{S>8;h9 zHsrH_wF;5{0H=YCNVINy1uYnru5)uO6Z%QaQu8Z{X??7!ovV{};>LYC`Xl_dJOUdQS*vstw+S2{l)d7ipBn<~7@gZX^* zjj|i9!Ft-1<%J{3{BlgFPfS?`?oI!W3WJ^N17whJ>@ z#BtR8L^Ty2B`J;1a6D9HBz+qrNIQqD)SeiImfKMoPzhqdk@^q#=|(=GUT+m@iC0|& zMZogHFbCHMP(wq7I?g90be&UmzU98|mWd;zrny&9k#I9pp`n_cLH;8#46L~RVe-{m zQ*r98veq}I*N)Nfwri)sgKoE^ZYn!q_K0%_mte&HT5Y%WTXEVpaNAG19jGObi9%JR z3+sSRSPc7T8c&0)GQjl8url{A&JERsNC;*TQwHgVXGo^&j0f%igVp3~f>`)v=} zR-UHse5={jBC`8V(p+%#YVyM4%uG4TAwS=>E3>NO>i_OeyN z+h%DD($c)E;qyO9Y9X!Ad!s(+Wjl)15CF#qIQx;F0)D*6|?F}mF|CCG%>t~W8{^( z##^5GR(->v9Z%W2t8MNrg}SI?-M4#x#ZiBjKxYdgcTWnXyyuDbQ}oackx%x8xh3Cj ze03etjjIgz8Vbr9218Sm=L;|#PD%VaEx1>xG__X!&3xZCs#~3wAssaI^Mwe3c!X2L zvW#~1($?DDok1pBO$Pq}G20$as@=7=!$p6iwvjyuwo}7Ql#Seyv4Dhsq&xj}Salb8b+cqeZ@k@lUuWCafm$Vw zdO9|GO1gwO!^_RGK^fo}dU|%%(Cxc!TZ-X&Jz2dqMfQ+T-6WQRGc2^@Bg0a#fTOwY zJL+!o+51NOvu)d7c5X}MMTW^MR8rGBLmH%vFwVtc=ERThF~&}ZssR=U)x^sEC zT)rZP-vku-^3IcxbNO~7_SUvW$BU}_Ebp1Y)qmx5A5gbm%IcNaU-uOy6$DVzr9CAD zG>(ZBD7aN#!H=h}uXC!#@3guoBQrg0^f8co(@4y~{QSWF+DE_izU35)C9d%$b#PJ6 zoCDbWl>Y$lHI~+P+vC99mRo}cK7<#}Jw{Kb@1{o+8-P;Y_YrD*bQT+Hr2Bt%$8w2s zLex^2*bnQS5~u1Zx3_~eo=HciDB)lU{YH&hDK;%+XjG zYyIZbBaqR}07AYcB#4sZ=kz)kNYH4g&|S){V&0TD3FMMVYHguUesQtS?dhzm_tmc5 z3r6>;rEV9QDg(FSUA4T?IHjtQ z*^j0J1N-PiJ7;j*DrOQ>K@-GqV_pm2>5Xlozd=_}ttH~B6<=0kkUv4Ddwuda35wr% zhO{yC@Ob6$T>$%E`CH~S|He4i^o`Hpp-~Y_fKtF6!q2oT341w z0A#PYAC|tP-c=O8#FmCh25=oQ{{U{Rv<#sVyb4MX>=~%n#IL595HeX5{{X{Lf3w_Y z@!*NpJmfJ(ApZKa==WUJ;Z-Q=qB+idGm<|)O>L{(5-BuOQ%M59e8>tP-_t}1t`dnP z)vAuNd1;t0!tmqRvFr%f)R*c9m_aH>5I>27cKvautJNmg@ct(0RR}}d@nrs8wOZfK z+l0wIma)TU0wW)nA3W$w(Xue%MQ^)ZDQ06Gx|v;l*a9=C5M5@CxXEXVboT@v{{XI| z(p~VpU86YqchvOUijf#f4kTmC*q_%%AG#_V+39U!6+gu<7UW|Kt{PhK^AT8?gkU0-e(^;cM{oLpJYC3{PW9jwQlwzkE)B*PGjckv&B$J||mO{rE!5;qrEqX~@5$UYJ_w*zB>nt80 z=$&19C{3(Xmh*94WXMQ4BRcs8G7b-J+Rwip!vjA0A(cf&B$LNJp1Syt=3f2%HL-(z zJ$*IiGm=N9tX(U$tP&0z-&yC5JLfw4iSOUHwz0wdzdaZ#Qq5l;hqk>*SRYbGu3Z)GH2WpSUDnrSyB2PH5`#eu;Y#;Xv`>`u4EH-`D9oZF0>$-bnGvLI^&iOcu@6 z5Gxf#t^huxwv_!WQs(I-K4^X+b>+8qP$3zsM$d3_rW$R|01p9;zJ2koMuT_N(;yVY z$ey5s-$rb`RjQ|TNvb7KJ&R|z>#UM^UFE5**Ph{Zy$0><44hZzgQ9J|;fMgNz~i@l zbFG`GR96VpwMP~jKOW_#k(ZTNb@dq?^^N)h(~z_?T2BRB@$Y$LZb8|{(X@7hcT-52 zmP~xXI-{b$P>`W&uuptv8kR3Go+}MbALLH6zeQ>7))C6T>9=LQoAH7^r$!e0M)Be~ zRA=k1Z~N-822eA7LC&X8?uztq(zEf;rh928LTc?by5c)7f^EQ%90m`L_{OtM%93ET zWk!8r>i6P4eC8&~kZWA0Q5OraS6L*p3|hur!5Hxg(68 zETj*8WghmXfk5V@urm3fs^c`8V^uaLGda1ewv!~j!9-Jf5hw664$tic&>X9 z$PekQ0MN=qvXkx=@W9=n%Xh#X^eMLkr*lR-dV;#LlV(dP4->)|{w$8eSyXI@1U?;H zkvgAs>_(i~m=c{Ej#Yb2yc#k9rV)&HBTY6N^fxstB}{0m{qD?9%NmP!*fj7`HB|*e zI}hY_13#{lr&_yom}M!Ce?g}0WW&mpZ;a$CD&Vy7MrTQRoOS?YXbjag0GSLpU!cL# z6E*XMMBUIh@aJSc%G#876?{FZ zAH~Q07D*qTk}g}Y%_GSSc=rGR4uwg(tDx>72k6UzrVTxg5{&8kuY6w8Lj%mn%5&#j ze^a3sE}>qQCW<H|q>wU3vXlJGJvBa)aY0^xi#Rbqeh-WT^wlJ5xJo%QM$N$r+u*s$@jQac}9Xe8S@*E11MQ0t$=>+7W&E!lCR?zLr?`=`@JsXB`+TuFsn z=Go(^w2l?sLdOichDxo`gYH|H_3?r~ps(X~c_X-vrr8pnn8qq!C%&WxAIefIYS-U9Y zMgo;lPtQtsJIH=b6yPt*fI7D6!Bpv}T6V3z(DEQ4Bj=3_soWOm*SZ3JSkfG~S1Le} zi5~u%h-zh#JfWEX0EU<$Xh}16d8v~DB3%0V=p;>2#37g}{WUA# zv;K0Roc#3A%1d;I)n!pzPuvB;)F!Hof)z9M#<$Brg-#T(`W;d#-;x>tPrGfs?Fq2V$f3)$OG>9_zpxIXV6H zx1K-*5_PN+epvnW_CX`Iap-^T(9(h4t7caoWx?0nK^>2C?W_Sg!R`9%V2_dWXFpv{ zs>xof@a%uCy=g~(FwQ?Me9^LYC2^0QwKo+chR!|pbxK|2E&eDYS$M^MnL3JCmCu_# z$6pCBa>Sic7O&!_B;*`rzdcBb;f3SNu+YIE$!_Dnucp06f$TLNO~V8BXE=^VsWau5tiBJ!*K)dt~QGE?pM2Xl$QdU}Qgp z>th4`duv+~MtJ_8Jt@vj7+AM+fvs#*jGW`-b(lPW2h<&9;VYia-2BFrN?_$dVaL$x zOZ>?GnkOL@2q& zd+St+Nh+WNpG^+Hi+`dNZB3+xhj0KjZ2O=l{p3+iT-6Bv>OLx zMdSsAzNWg5D=R}W&ur>(u9mEZc%oiC@D%7=)inT?P6Hn$8i^&+ur>tjG4G8)cB!W%Cw5eaCU65ai~$sBJycuAK8m$p=R0`h$L?;*|ZsKArVGpI}|( z2x+adnArA}GT{EBwww0PM{jqjRw{ZajM2B8aT!td#)jP9>WN`n_HS9Y1TrKINhdE) zau4Z^S#b3hO7$Oj(tvU5sgwJSXr}u*Z+E3ciDn0};-iTp_3fwqq0oh*;J0degmO5r zlokN~dZQx%OD(fCEpn@D) zU>t{XOj5?6cm5IA=;689Z}fqtC?6iWNZtEB3aA~D zOvR4g8V}n-H3t01$Te+TJ2y@vq;-K(rI`N!FAM|wXpB2nmWnPgLm+TG!IbLdxot^p z7hv!jj7Zqee=q2JYsdWkUm; z;P%y@F3_u$nPyJ}`Ug(`0Jzql`8K#n@wt*YIkpMp4nI9xO{(2WuO{Rq;{$j6^jg(% zy;8^oibro#+g9BlLo2G(GRYg3?gAeF0G6?rp%;oOfjwP2JT3jwdksTDLg8E`7NcBr4JO&wmgCH6HQPDQc*-yJY2LBu2qm%_G3%%wNcR#~7|CO}NWd&@jQ8^EF=DEV3h+5UMaH@c`L(HS zk`$+;l!9^c)JhGEwfJ_KmQ49olRCR?+JWv=Qf=FetCgifDbi5qxjcNjuJ6X4H!B_;G3NQ`h!wdL99@I~?)44?Qq=Ot zZbWy~TDoZnGR06Bp8fT%ufya@5H%U3W*)i5lwD&f!L^XHj*j6jc)FGM@2Lw(90*=) zyo1}0pc$Qeayk6l1zrl zCpsZbN+*8`K%k#<@2EW7E3K+!rtcjzf!5VaDxXzxsh1mt4Z;QnhMtv&e=29c<_5Gb z-kBm2gvlNM01z4%P|}V`A%Dx$I%(X|MJxum;Y67!fh8QC{+R4F90gA zPo_Ru)g0&iK7wA+z(-`8I}9Ae1P^HwdxG_RpYJLkc{UYzIwc#RbX(n zxP-1eGKcA`ML&q+3RWNw!KSjL-ER}@9CX5H1tYW!=qs%FkUQsetMZ%XSLEUYpOWT_;pZl0R42{ zkW1>G=^yU-mAo(kZ1)3S8b?4mFa&*jjWSkTt+B*u;-z5!0Q896^bD#qjT7|5XcfZQ~Cqzpp=zqNjR9%#Qy*wSx}xIl?TaC0gux} z&<7|U3BU=;&ti;BjWm#%5c1{Xk59`wEp)rlQY%q>Z7gRPb}P^N0jkQLrbCnB9{#5~ zm&Oka7~Pru!Sww!d%Y4|!^u)BB}$5>DNtrWdofNK{D!wKSa$^D(@|hX&U;|@In=dM z7a;b?@1d^h%Jl*7*z06$5x=$BeHxq}F#YxNR3s0~tS1=kfZ<(+G|%~vC=vQij>4E_KHKAp9q7NuoHd7T^7pZ!kyzk-+?sc{KYdZ$7J7=xjuL{yktKV5 zeKV}~JJnWJB#_o1Z$>=$wmzNo8ueScZx-Kxdn46CzGa-DECKqRO4$2S{{R>@2@OPT z%N`tKxjGucg3c4=($x*JKOUN`C3ZP(`Tqb71EarIwZR~aVL|@)9W+6+_Z?VJmJ0SK z@p4Q7`s+pGrMJlHqLrx4J2@C+R$_lVXTE~R1g11N@Du*hp1!pr5Yt8?KCbLopPoB^ z$4oaH4NRm6(dIAe0s;OS(Xeba);buVxJfBQJ(d2xzPh?L+*Txj)EJ^>`LM~>XFn;; zWv+4DyFT$#Pr_LE0CKVM>_0!Am*}?r#sDK;5%Kpyme)z|D*8zQh6)rQ9Apmqu0^>h zrfFfPEhC)fM(n?qiLzfPOK7F5ZGCMQhN%S2j?7s0)AhRl02GlT)x!{Md-~`ZqotIz zm9l}yxd;HxrdpoMDDdEpY_FpM-%$Fgx4PMSdu(yNYEm;2J=eB%UEF8;#<(<;{sdVZ zbLp#wYkUDZWK}+-U?0%ye&w~zYnkb+(bTmvpT#Gq_-RgSl!=(6$l`yLj{0HG2{lDH zeeXaq8(REDABPyh)M}mC_j)mE7}yWP3E~Iz8c~mPNl3f}5hzb{%&Gk}#c8g!-{V

3F(~wRhQIV-O9qn!S;Vss)!a#iroS)lXUAC2qN|&CD zDo2jR&Mh8#gjVyGsO#a0eB>i%G>9Ft0 z8km8K*(7lV&n8T2hT5{z+3I05BTX$Wfej*Kk@cG|S*D1$zLfaDQD__K7U_L@H`Lt>_0~{{Uu+nmP(z zKgEzDxfMB~f*X-WZRC0D5HQv=XOzTq7?yC1PJdJ7@RMJ>g4T9%^Vq z^5c~x5AZs#>8`t>YKg43$to7Wb~#a|HK2^DC$h1ds5R9z^Q%(G;eh}g06x9+n3q<$ zPRVtzk|;}dR0>8vJ$-ZDMw*ntQ$o|Y_ECU8rmMQ0-4vCN6FG%lzs;)u0LM&YQje;% zZFKu_E4*4*o^@Ye6ps34iW(}nD+Qu9PWcaxBkQUh%TFSzMSNuBd!n~;e@!;qpxvuV zp9@h_@Zozhp z>UDH`h&i50$DASLQcmMackRzrHCH5{T5}&|10J~b&W(c5k~t~p?kegyqlS(dCzVtN z4wwu1X~$$&*=o)=F@>r~BqH*_`gheGZLhk-1$2zy6OzZiboI2ZuW@%uYIk;E31Z|C z{{Rg~3@QZDcIr;%wODNh>~v^5@Fo(fP=4R`>Yt>!+pqPY*Va`_$l#+pf5RBnvsttr z>qdM^xFT$2m7KS4rgW<}O{yf0NGPF`f$SPI$1kpPp=qH?A5eo`E}I(7PbI(Zs9ISu z9$5H8pa0p2HQXQS9;%MgSxnom1y?1uJ9?cbKd;v=$pp zBATkIW(0Q(Fwgya=!Hdnp1eFZ%S~7#@e+kmzao1bR(sN0mA!-6t>QO1z?H!R^T(!v z?Y;GSLyNk+5-H>SHp-8$bEFvTZ%=FX`9iQB(@9BQCOdUjLV1rA1E2PWm}$3z)50iz z=aM0V$(Tplj zdfzTrd!$rUdm^f-U73T+Foq=m0AB#N>4T+OeYvgX<{3Yr z(~kcD*|)9KS*h+%Zk{*fvhjZ~`4FW@{qd@%>C+AQYgMK2>h5&;VzNbC%Huuzla|Np zt+1AnS4$*~a6DRX+xy0rD*585-!=04EKNp$#7DO-82$2f4}agc6-5KfWVy>T_fs5r z3WZ7R9IS?dG>`vOzVbfcqXWn{J}hc{q+9;O<=j!K@-EZCXG81SfO$H zcm1^<;Ky!O8eM|9woSQSYm%n#xS9%iP76-#ITC(qPwX`HX{)g9HH`R>)p0omCMxu0LkE(&bTqw$@u7o=mdBY0CHi01u{` zHDX^Yuz~Px%TmPMTC1Jpj>SW1FX+D#bCdPrfAv0kCAW8lUFt+2|uR2+C4+LR6xsX+uj^#co`}ykywyEMw&7(_b*T{(zO@%UY+S9 z?qn4!lm4l}Khs)nGG6WU%xU&?(#wuqJ|vv4xedn|`eREB1f%ng$@bwzv2IkdQ%;oS zSx8b?D9`+VT~oWNs<&)AuGPB6A|$Crj1WIj+e2t*`j5Kmej0~u&lF*Z63qb^@BQI{ zsZY}ThX$7Yd91WDlg~ZVKk(ML+8f@|94p>c?ZWH5W$`AOTG7as^zpNf?@;t;3!g#AeaQ-9=aH8M3#UxYY}_^dsCoJrB_ z%3zhC3O_|u)Kk!_m7<w%pcBdqYMS%ZZPq}nUp%A!V6%*&q0!x+?>a$2J;N+cQc zW<~{nW2Xz3PO0qHm%P+n>ED_3iZ>-s(EEP6sqS~gqNsJIX`JUAi7G#BFp*YL7#$<2 zs>!C@V$i=41-4Hq}(T1idGTXUt3+|orD9xPNDVK_$9s>n*QNvRi{6YJEz-e({FD7NFUOznN zO)zx%^YTR?* z*F*qSYsHD1xI?Y+(#ZG%GJcxQDJ0JfD9>!2O{bPLpX@;FdT5=YsP zkI!Fs$G2?|HFU?z;4%Epv2YzZ2-JN>i)idn?kANNJdvK*J&v|<;s!|X>79Il0r+rF z*S50t#x-=IUhp7y@A_-dzE1tK+h2R*I5^kJNGCn>>UCn3EKhF7S#}2`p7__?PC1eK zYt;g*Q8*a_tCXXFO&i8 z?X0oi*ml+^Id;xFYaxt)d*erF9m>ca+==h3y&EKtma!+lr}frgoq3?+%>e4bB<=?+apl5j`$>W zp57NhQEp1wK!K{k1KT;ynP~S!vqq$;aD8#>u79K6RJAd1tC^v1&$f$FZkMAf)YZhM zJ)7G~ewB_;Oy(ML=m>A%d6qD~*J|0xf~=}N=90t8qA-p1eQB@VFyr_$uygV`)n;X<x^qO zo*A3*tAaC)7fQP!yr#-s$jki4x3M|V+ji}mH^RRj+3lSm#WazOghm+pYGpNlBi%T+ z)3%i8!R(AYj_TF7ZYHQ~%t-|I$@bA%R*rI78lFE#7#gdnZZ%`NEB^qFjndub^Ub?oqbIXr@s@;&q#-*~AJg3rb={odzWPUWL%xIAqpdt`tH zlv;bEG*HW>Y|(~ToGCf%6IH(GrL2*QnH814m(Y*tt2*ye+&NNG#(4wWu1M14)~Id~ znP-foj4(m;)~KEt=A@Y#UENiQZDmGwnF9~yBPaLNc|t=MCWk${6Yr<1hSG*4ca9+J zMpS{=e!iL!6`JAC!l)69_EC)Y*5N2QSlt`0f=HIBOqp!te23xIii*hJJ|nYZ)3%zo z2GFUdgW~E_ijYqw8bZ1%)5;bJ8Nu#*>qA~1EF?XI8d8<%XUfSF<2{O;Yi%`>3aJ4} zN&Y zDKH=plV>_|`|udq437{)j{cfny;p|*B2K@VeOPh6Rc!<%St-P9Wp+eC{o*ozO$?~7 zMw`gRNbCsgH6r&>B~CJ`*!5xSp-Dv$h{-KM41ESP;B6p{xKlpzsR{zNK-7rq>JA$j z1b6SCJk}{YF=L-?Oo~|;W6&RAsbN_rlPx{*;0zIfBztzwq|;tRta+$Y?oYm#U`eE4 zp~gO6Jr#o0ERB|Y_wC!hiwJU!J=In&CA$vU&b7Tn5-G!S`5k=?nrAm=&GrBdz6m0&>xeDqtu zLSsuN*jtM)AP##0t&3)vaCj02zBKtsV|*&SK;Zl8WcEdge9@dArmLz79*I@dbObOz z)ULM4Na`@?agRZPrxR$5$>oUl?cH_cwmhFKO1U3hSdauJ5)w#*839gD<=a|X+cP&X zzydzK^zHX5MVzL!OKgl1agA7b^+VD5C!xcP{dKycMbD6DzovaZeMWf!?d|#Z(cTmdSTF<4 z$Ykq79$Co;{59)113shI*IE`uIqiad4yEA`1TD(0JxBoS(7{i3!N+Y!W^4uINcG0C zyMVaDwg3O z!90IWe5~Kep8dP}YgaNyuW_uop30?iJ&vJPvkarm-SMAIcw`K?1P^~rVp{|j{Il(> z9mxY2$InA|!XUlzPp2GXS*1e{Uc*t#e<%dwSQh#6A1w(qoX`~Sj=;bjfY-w8>6|hD z0JB3#f8}q_SUEVxfA7+qp1=y1Q(Ds!Sn01rX%z6&}bIP)J(M%|$anc@9B{QUtJi_OG5TsbjlT{KLC!U74UT2x5|=!^4twWO+ol!lM~6oz zEaaX!(ntfkV`XZqejUllRzF;8;cuE!0z;nv04-cJeJZMua-N=0f7Lzz04*K2be-cs z$xV@-;r&O`N_O8=(I`AB0c~>Rf~5S$b&uWbpeSq~ks9d6=?x_AJVcY%xIM`Ib)20K zqLwmY@iX5Xhhh5ZZY=dg*$<-UFT3X}Q)%CY)q9-68hlQ+_+mX4wMaL6EcBx@5%An%?;e|xsNKG)K#38WL!ys|eQ z>i8Y>9{1Adoz~{L--S>Qs0Lt;tf1aG5 zXw$|#)hws#xYxA%Y8GI>7My>)NBlKd;V?hZB2-(zI5`K~wxT_%NArQ((^ixlMuw;S z?cOCLumpPRYwZhU9&e0E`G3)$Pv1gmP`5kr%P7cWsz2) zdkh|V?T?Td(7C`2q5~=fTQ=QNL7JP0KH57)uq>RBVW3>&)rL--?6#W{Dx=RUw_*wH zjXBupZLd&^9Izhv!C(pf^_|k!D3U#oWi1P+qmRNM=gNR_`uw!vZMNMgs+M@_LY((* z1I?>Kn!{yEWtLTo<>hRheN#haq={Mx=4N5#%I6x!>9-ss3?)dgZn^EWn5?4}4e~Gk z8P=PpP$w?3!DNl|>a0dU{Qm&%&?ZgQSo-PXy9z zpx=oo0rvF4i6KO8t)KAIBuNc)ekD!6k0s9+{{XW|_N~8gjHIrO;wZ@CJx-Zmg80~3 zgR0~Cjyq{)hX}bruG=!2w0)6jEbwgB^e!^D0tI3-^v-pq8KuiC z9=|;f@}|(L>8!Q(hAk7ZRsA(S+kPBPJzBZP&rcK3d`B-56~=vWp!K_Em?4*fu=OAe z9S}CEsVUu!9dxESBLorajN?Ni+deL0fGe(kM>=VHJPb=K%jG|W4Pirarnfm2G_nQd zfakaL(;7(OEzPu}SF)#G?@m|O2am3VPqYs%0-1>?`8yBSR?*xvQ!XF~(dX7ox9Ol4 zdf94GmMAIEeAMGQF#14a0WMnSsIU*H)bCQNc z1#^M`#+U88YPyZZL~+PidSOO1#YmTC>j^2~o)XL$=hL=?JcLDxsH6D%Jlt?2(}e|mw;FQ{ z?id_;=!JgUimxRhBepv)Z3=?JS8ikBE=+BM^VHm|Hp&Hm+38pbNu&k6ay8|HYD%cF zDaVFzPMCZd)U>Q6&V3wq(F=VJ?YIQa4nifWALWMoZKAJo?&7;BNB-|Sq0|0}l3GAlUmCc=0=@F?@J4oE{NL3!A z>w&I$zVx@ld8KKmg<=G$JD7>9sn^GfT;P;XVHVrn$#|-wkh!X(-!?$iw<+ z@f*XEjxyCiTT>{gmk3>43(8mvA_;k9_Jb-2G^~)*Z%e;+-o77U-$QM?s^LyN2bCp?Pbod)Ku>y74(g(X1`5Iy8xJpTZHO>dWL+$yMLhOVV$aoviiB7^FCV?;>c zr3V(}QHO0jiQ-dCj0fW6ef6N(CR4)f#%N)n}j(`0ph10o{Rxj5El{3P^GS0aQKq~O*me~hDgwg%DaW) zpv^NhgnBQ_SDkLcu~FM3uA`<|Wk~$|lpGv;YO4E+0AOKS=xGldA8DsGE z34#6Y+1IgrNy@7>53UK;q=@qwKA+P}R;X@`#+u)4cWDQ50rL-@h-Fib)Fo}xP74BZ zJ9(QL*Tl!Xd2t=abrn_Q z04kCP%Tl9IPi61*)I&fiB0-E6IM>v((7`B@sG-J5Qki4CnMMAt17PFSGtlmvD)K|&IlelaSTuTKK}rw zhuSQyw5e%sBBg6(Rm_mZ6LtsWHDK*6!?Z6q80D_B)-_UbD;mh;avuCfMt?14mEFQN zw$)u-_HnyY&b1R&))^#hyc9GC1N|RUtTy)2x^3IjQP%8=m3ZH?*2kXS&Bwk!QLgi| zZHsmCjwhO>>E1*P-S|ik$o2&DwP zw6VCPkLClY(8?=Vs8bC!9V;ln%n1rT`4fZhHm)w(aUj;(-1Nwgb!Z8=TPhKbTig?O$9+X?dS%q5>*fn zJfU=Us!H`g84?LTL+7E@n=(eMRQObu6Q4KJO^{jTkS$D7$rx_uxH9|1tmfk{B0CIrAGWI7_et+5R$iT?X$N#?e5w7rjX9Eo%Fg)6;Rk}M=T$JIju{F^ zh4C4{&*|@@@mT5Uikp?e-<~lNFQ@CF2WIb0y9eGTD5{Eg@bl^VoeiVhH!qD3c&3*m z{{Wi<3N+ik5EjyIzU(`F{@79}C5sD@$bb+0bx2)yHN$UKR7h!|l?UM^@;}2@QM?+I z@miybDDuRg_US%$wB4&ETb);wF$4!5T^wYD4i>1Z?HY3NOt^MAV56}5Ys($t<7LZJ zH=8&E*Zg&FzQo%8J4hn&m5xB=fOWC9Hrl0)@{G&pxa7*%;D1v$3eFsWE|`zG^#0W`31cSJ0T6;}QV9 z^XvL*ZWM=a!Ba9^R?rL3$|P)_^R|Dcq0(-u#g*i%<0eTUX8>rP>)91{$)#xHaw8;i zE&y-eN~Q|Zq^t*yJLPo2MGYt0F8;2HP>l4@zyS1KM1H46W#3a){{RM(X-uQKy0I!X zQq#jxBZ$@}Ao_&|O*X4#eG?^6rjRO};k`d?QEHSzvMn>+?xCi+T;Iq$a`YNIPvZy* zyph!)IZ)hx!&TE>Ygrga3n+iZ@;cv1QClJoGszhrBaICzOt;ABs$qApc&P`VR3H}B zX?n3*Y3lqzEUn8qP}n4W4y+1TZS5p=6}0l!%7hT3xX;fT#{U3rq_`=bs)j^o?GQd* zKcy-F+~cJqVVT<0yuo+nnO z@tmpcgPmDh5-~Iavf|RnjJ<;?8T~a*i~(vj_GwtL-`?{sehO{_uzp@vA3aS-sAi3# zmLR7%;^PGVS`TT4^>M3ME!1suC398E#+n+0i#>q@+d(ULH9dwei1@Yuk1{{}K3WFb^3Q&WrCDJ? z8OJjDIn``++BUdwr`%rMZSfM}PG>#&$bS|;Urj`_UN%IPF{9g`4e2K_#Qy+Z{{Xg! z%WiU$asJl{T6P_*0Dt}B5(?hnfQvtJKSc_R}t%%2B zkVf8^P&8)AW4o4CsgXn&&P0S9=`w?IZ0iJmc~Y)b^)VjA{#w*J%8}LhRFr-cEr1Ii z{{Z)BdQPkaVn*IdyD9ell4!wr1n{ZmPm7*Qcq`TLIl0KT+a`lCx2kyf+gRuUFND8L!|`{)EuISBfV;Y_?y)|raZ zS4V~ZOpoy+UeQ(FsN{}8J_n&z#y@a$0`a))Td~rrD({3u^)S9OtRa%pV;=)^sD2|E zcF4|*FxF6R3eusuOEx@2hFp&Pwe4-n(%7e~rGx^1F{;WP&rL#&1h+(hgV@M@bQbf~ zTP2b4TX&?DSaJus1NPO3Uhi}%)nMeSR^@HlRP>%Pw!tA`*l-8@Myajku4dU&GAiV8_c-()riIV;r?*qcDCjBa=RxXPCqJ_& zS{bLEhj0l`mKi*uWkF%wc045&1t5%PAHyth@*VZ%!r{D%m|li781lCcB%j;1gMaVK zT5is%Y_}JexhEg?=so`ctQT9_cywtDFM=>60RI5PTNwnTbr1N0M$jO8A@2u*r`>S(SNV3By50YegG0XJ_SPhg+rqd#FdXRMHs*fN|G`)XCVR942SDymveLkbBaS`wtm959M_%0w^; z$<*41F;gtm&*7IiUpi*Fx*LaGA8w*-5 zgc33DaPFj4Pkb;mz*GpoosMy#=I1M*SpZ@OxYnAhz0$OBs;!mR*NJ0+`43G-P<>Cf zsJxtnY=i;kQW~Y?99W(s+gRXdI>CKA_twQz_3xn>!5C!5#uda%Psw)lzWROVw z^_WjDsVDN+yl^=7C*L~A4}Sih-L+s+6@gyZ{{V))A-^&8I?RloBVS;Cc-4Ta*0P}b z{QF~A;GFqS>*=k&8utg^+g}yOVc);&s{u=;9Dv@3usZvQ$6?#&t+?Vb-?{INcmU2w z)TJ$86R-o{UWN45Ko0%2mjl@PXTRs84N}$$zJ&T?St!WL{(ATh{{T#DHB28|XG9fU zEJR=ffv*ApeKnpt9Bb@k_ZlD-FSsf6I`}C$?fdIIe_eV9fB20TWH(F90q8aAlkc5+ z0mpIgtiT?_Mjd!db{F4V=U)Tw{{W~p@EG+P$PWJiO%Nk8p`{y><+g@RPlL1Z(iEbfIT(tNzO)p zJy^mL)KZ%DQvu}-Loc?ETep46nZvDP9^>&glX-Xd{I!^olLd3@-$WhilIRB^TQ=UH z$1^NdDjADoBTbZdt3^aSnxrm%z4buBR?6UyDbMesu-&EN06p{T^U#*H-vyk;_MGG^ zz3wn50tupjuDyz}WFYd0H_U3Dq`S-8H4F}qTW;@_FIOfH*BH>4yIO_xFcqZ`q^tp2 zsCa|1$Nl=74U%qP#a6sW*GV*&C?rMYJdAPQwsdBawFyxK(hPjgHJQ}JO@rx;Ez@4=AYK4+_ai;@LX!RqahT^m-rCCMI2E8cIAu3d(}2B! z{K3@ZghwAHh`-Z8?Kc=EY%x9m0F)lbO_Vdy%%L6z7{Kg(HJSDk8%LBGsvaW65U+mu z*6MlQL&)+vVxGfCQi4PzXXbP|OIe{FRAZ0ZOAcv8MW}_frJO8lDyp8xEPumBp`eDA z5?m~dJLGpdO@(ir+^KgV$ zTxta=63-*XR~%o{NOuZRT_csJNb#S*fDKx!V_J-?)g=D_pa*S7uG-YG#C$j-&u-_} z_Zn*@YdA=fHxp`@sI-^?lf*r}^RFo+h!$6o)Z^#a>Hh7uFr}6?U_HP(Qme6ePG5mS zPCNVSV_qG?%tdmANU_T7l_6(v>2$JD)6m zori5srnFQHGe9)kOJk{0Faht}V@D|MZW(#g{e3g4-mh*lm96$45R6875vFT))~En7 z#UbzQ-%J#g5vzBLf%=baFi{YmSitN%5_>k?oonyukJlR5$&x%a9=g;?^gg;Tnq^*BtlWoh zZ(V(Wz;Y!1TJy>jdlB{5grM~p?0++>QFcbAa65MO@2mk$dS&h99sdA* zP_U=Ld*xHuj@|X+Fv%JE5}L@MECj(hh10KZ;`Iqbi-b)dYF~85tx|9Rg=Ifap0!CVILC#bsMb=!D*3~Ee!9@g z{*UT==Ss7}(7-uaa!e87p8frGrd}i#3PAQ5*1{BL*YebesbiRNa8#d8_|O#5gek*$ zxSdClB>uW(j==7D62KpFeRaJy>}mMrB!luEnqJa~NC8Q06oii}dixD(dRYi8RDr7! zlW)yxad+;rX>eh@(H6|i-k&9zO(DbX&KE#5nVCBYqLz8UFwcB(u>pIa+e=aT9}>n;nSkH5P64Mx(;3i~;mL zj;hHn_4CLVi6k6(TiahxD@cpu2OaQ9Crd0%Yl^d5aN6pS2%VQBAm>5rjVz2Er~E_v z$NK3?o+_B*Qv;BLxWM(-zY_i@g*1c#+~oV}sWcl-w)@33BKagxJqSIuzFXWfw=#H- zlD4aQ%dAiz!r2}C+Sf^bhEOvw<&NMTRd+_$5Ud)TisO>XJ#*he>!*^XIecG+5BGia zqhEez08=<-^a@UOq*hndFYyUdJK!A&=Fg&u zd|8hi$DgJKzB06O20Zu>Z~*P9O$$(|l37S6%oiR(t&ma6R9Pf;0Q(W^s1+9pmH48t z9-WS-QB2OFR}47%;OGfP0V_Z3?9Bd9Fnf0%x?r)>)l-iKqF2HW!IvZV))x5^QjiCG3ZEM`pV(xn#vre7`DwtQma8(%2V#7<4zlYVMx%cPgjp~ zj_3O79^b8|kfQ$p4aoKHjWfk0tmBW751>}oXOf%(*86Uj+=fpPW?}Bnk~9+Ic4$e6 zB4Zu2#VoQamGH+BJLgMxI=gb8;xd3eMmy*SsxoL&5ap_~!~)+V?W{#i^toA4dv?h0 zt+QY3)W7BzkjJ)!&$?+|Vx|L==rQS|+Gz!W%9l0aVjP)C`eQ@t_e}z+96ZD8je8|^ zJz|h!3z6%fH%oeXq(G#6iPeUxC@tT4trcgB4KZ&209=0h5mCC$&TPjMA@pw98rfeI zvcH0nftJT%sIgdOg+!y6%V#J4?K}VyNles0O-mRljE`aK{{Uu)(^)C1f{>00KDjv3 z>fsT01V~-0O6-yy;m7@hCHcKdl8)vD%+L5&#)+}CTV4q4{)ak8e;y%+TdLH z<(nD9Kdv>gS)}2~lRrQPx61OvjtBzr^*9=c@Hs$h+M3o1#|%Jx^ctqQs)-SzsrMlI z=)KmiieD?ZU+)}fddp#fd_f>24C7M0ReTWiN2h*LM8!|PsL>eBDNfkVKd!XPceTvq zB#H(-G3&32QcVF6lgJ$Q^wd@GQ=(`YGOnPEcF%1LyvZyNx>>6 zL?;J1!PI51o;JzD0CA9gMvMTfDb9VtG_es3Y#Y#>32OPIkO|rFbLptC+yvZKF^=8N zG(wa`B7}6y4&aSlfU1e*4y~eEg)FQ{KRqVi>_Vs*oC2rYRuyF_B%TBUJz-J)#CrO)^Yc;kn@|u(!n}!$@-1>S0jdWag*p!8q zJc2!rh1@oMn&KU5sJSzH;O9lVxlk@!i>Ft6fo8XHoCA^+k^Uo7D!NI#>8XUj12GMc zC>izFS#8aW6*Oy4YP7gUK5r<=Kc1)DI&pEQty%saxn+OuWz-LrHCuu`&s<|&)7`~n ziE1lp9u>eV%wU}Ab&~mXiGBg=WP<}8hkOlpRWC|y+lGOyyQbG9$lOY?hZrFCIrh?Z z-|X$NZId+cLosELGPfc)k?G&tL?i&=R!GXJ_HtLXEESb^L5hGxbn~~JhtCJNA74#H z-8+KyXQ(!-T^l)&WuKAZ-{f@Nf2aP;Jnc^mQdN`1C1PZ5KP;a5Mz1@9>dhq6LZJGL zXZHDMfdtt~tmO}++m%=743pKRJy^+eo>(5 z!f7f#`lyM3{3_%Ee@tjS_hnpdHF3Qy%BE09CMsC*@AK0)juam?BAcdFw+qZRx@weq zd0zrq1~`vX+yk9AC5UWz5|wPrQ%^LCC#Yl$RIkXX#y*Gs?F8F!SF?!Zt*R{%1S66O z$9~<%@2f(md{a$L_k8qGh!_QL40D84LhhAP<|zay(U-?!{h*o3sVc#BB6_+patAFD1uu7gtT z%RF^vqH5JVPvDEYAEq;^5A3ULpu50bZdSkiQyfszFw13dbNcF{sI=W8pTus<%ehZO z`)cUiHB`3()~IS8f<8l=NJlU6(&O3eHtLmHee|#JGesiDJA?<^f^qw6rDCA4->C?pr!ti|az}i8v!axpIJR79Wz--v`N7x&eHwWx249XxW~nJHZH0x$s}`vQG` zL#D0A(VD15O-oHGqkFV*B>iE6X+_y|iO=Pu8 z;lhBpnihn{52qqP&+c@se(7+nmO8OepAjOD5(;o%zB`iL^hL$VO!D%n{%p)wIPdc~ z)R@(QARnnCOgG)D6}qe7Xld$Zc+Y!9xhD?lKN zUs4&E`5TTg$bdhtjKNHllS5Nl8bC;sfJ_7O&V5F#I}b&aTNKydsp;#geImwDSL9pg ztul1#f`a5}rmv=CQ-dQ^j32H@15(fzf>8S%d|3njyZev&3z86M%WgQs4Z?Rx6yWVubadwXE+i{wSFn=*JOEIc~I^2FH(B$opN^BS)19X{RC z?|=MZLsbp7-BXE`5m?9H*CX^f?XJ70-CMpoCQ2$v+P%~N040-yb6`CI&m4YQS-IT0 zlTQO(cP8DZjikbe{sH>~=nD+v^Eetnn3Q3S8C7Rdx|eUEw5Ho?Nh;+zj{aegKR@x)b?)Cb=;}418;yX|tyGE{H$#{GNWhu$|Rjbcg_qj}~mBVS&^GQQv5&aKi$!RGF*tZ^WP8>YW% zt0hp9g5uWdMh*Noha?g0lah0*5+1zK-ccr`l$uc?ib()CRvx+J0UfdJssL7wFZse18BRMM`T6TP4Q3OY zxx&<&R^q0BwDy~dRYNyrEhl05Y6bhNFSg*GYpqN?V;qQQ;sE+-UeWer z#1|33;e5YdLmB+BrwhMH_eGXUipg#dRUJZz)fEV6zGpe_`)WAGaMfF1R^-V|x~-J7 z=}2nfd7~J|Jh$ue(*=WcK~~_uV81T;*FA1cfqaU#k?H9xl~qqUOiZZ5KJ0sE_0;QZ zxBF#GOATsL!oQ7HBIW-8T;OO-V2l((M|WKrbido_zgS)o-05S36{*Ekw2J%-zOr$nf(m%)sJ6`1*m(x?Q>B@l|^43y?+ zrixS}uq1cVW%|Kvta)k@Xes1AV8G-9`FrYh+R5-Fr7WeO#&Mhhq|4>Ea4=`2?*oiv zwn)~7G!7D6>%j`9-20;GOL45Wybm*++GVOG|8$ z2V4=z;2+aLZd6t71O?)ON3VQ#`JG`sQ(LE4t(VDaByQ}Edk@b#4|0~avSdgljpmH< zk~DI2`SGqD8c5r>ZKdzM!y_V*~f^rn7OlvLeTBk(7^6GyXb` z(nCv99$2JiBP^u`N9C%rh_D_K-Q#Q8BZat8INpcF?hEwo-A9QTUH{2e{K6 z`tK~PR7EUtsO%kh{<+d6RdqtNh$#7m^BDxB_W9_7S#4oDT3XF&NnhiUOLmP)cl|Un z@d3TcN8YJ{oO%BM59_5h+>~Y3o~lXW;C$RbIn?NH^mR?}w9={)apyn|k7?xz&J??T z$i2rf#Fa4Ta z-kX9-R%2B&_c+c5N&K`xS)>MlRsQJQw@u4&S#EL7Q{4HL2NCib(3ZuL0hN{s6lGM8 z{Y-0My2o8usT7hksmmY%K>alFM@ekC!hxbPmP|-M!msPC1nmh{6=N+G%3e1KzJQL}yqti6+d;`pn|q^hRmPKA>1hzSq zug9ymd?KFQUJ}ud@EO*awDMI2M6uaj2L#-j&X6($5=rJh*^!^!aN;G=OE? zr9JQL6~=DWcInKGPcMYP6XFhEu^qMa+wLkjB&wjb#Z@XPVzX2PKu5@DC-NGlsWTh!6+zr+${AAJl>MJGAHCddSKIzN?6_vcTN|syKai< zmMV&RRDnO{WAg$&Svqvs+rrPfEt9S0%No?N95E*hf260D2kJG?vTh4<)A5SZi!lEH zobfUU`i*F9*<4~Ur9C<)$S0HX%dxu+YwMiu#L*gOzV%R@lo{%?2>^E`(pXM1x$hGbZpOt;9D2jq2yv!s1Ozen*jTXL!>vytM)(ULx35t1~=)MA2= zwXQpgPnzvm$|CV_i~OK#0b40v0A%MN{Izn^{gir{Q)8*VRN5+I;Dw-46O5#PC?&&| zKG;G&XG(DNSE#g;q?b*zJ-#MCioX=i0V==*(xvTNw9%)9UktSo{{VF#jz6ZX&4ao+ ze5$eDVR7l!vk>aHCdjU6;7%P*W_Fre5(GP{t2_#1wYmdO%&#bva#N4QN6Ydj z^3sLJU|yDKDWRm6XyS6RG;y4gKAP=YrPh+)SYfQN5S{-3i5Lu^XZmS7bnL1v*94N- zZmUY_d6>gsf;;37Q~T+$>i6P6qoUYtrE*nn!L5#-N~n@WN_FKZk~UUR^Ts>=np|oJ z$u7-+a1J%l7mk+i8rs)1H){FSM;Qv759yJm%HE7_8Y*8I;F@B&B|ynPr>?XC8@MP0 zuV~7sMI?xxBXSF@0{R@CHeUAi@{$&cvW;nx8?w4_Z}85Q**xC5vliS0#!I|qd=*b% zHR`X^8udUJIPa{2fud@%SIU5EFrB*{c%UC$ZB-=YeYACG30|N8cJ|hN`}ZF$c#03H z@2#RdC{<_Hrn;zd?PIy91uaq9y0RFnzpoJL=@8~t^ zr+-2Eon`^_BiBbrEqtM~k^lqPYb*XKi651F`R48J@cO5Em+E{Sn&g15%kt&d*>O~yhpA^hy%i_ zT8ISWzP{m;oa<&g{{Y#qxZ}`%db(F@Ul4KS*WMV$bBudyV2|c?_Y;oaEm#V!@U`RE zdX0O7@2!C{F_VF>ih{WAbX2a^7|6gLn){D_-rCOt9-8|H(;6@>QE*=Y+blnQe4r0c zU3wEefYw29F^^3ZASGf{k=y65LjJnXiPyk)1GcOSLcAI54!s%qYtlY?`}Eb)rRD%W z`t?CM1M=6PdJ+d?uRtE-2SrM$Vm&jjN2WEO)3>I)0BEU2h{y-&^VitVuCii14hL;{ z$G2|!oGR?R7$+Y2*Uig4yX!AsUtM?s&(rCu$y8T>WcTggQz>I-U<;G|aj3nC{{XXF z7D-dzL_R5Q7BG%cwF-_>rd3TLy5#G~ zEY-3cgO6+tHNw!hV;CT4tu+KLqEs2}?T*@=LKG3Ch_ zJwOLKb!Y%kp%niBj3$lR6VI(|N5HXLukso3+jV@iN{9;vUR|NJxxYe62 zg*zrj^qFHD0)C=IJ45YC{t<&9*UVt8DHk4()hu;ZVhI@=9gV5#Og zYWl82(;d(VtknyU&|qWw>QyzSr5nnF>FjjN9bGel%MFg*kFKOeS4NU|RXx4Vgv{?m zVU6a{%1dOOxkv4tO^(=|-@(W9(P(CdMal#R9knVprfe}woX>wL}xU>8@&HdSo^QeUc(np~omB=**|SqbGQl#gu^nNS}p57R?y907s|IrY|t z=K&&5QnXdqtWlI+_#L#Vbgm`N7a)(qRIm<NGs5B(lcLJ-z$rU44;&4pw~0$j_&)usySu2R(+i2$_L( zR`mk|+w|AVZmyX5At&XX2{wpVb&AI$;Q;{tc+q=4-L0#UBv=WIXF2}>hNDti{5e!s z=eWvFIxE2#%Rk@@PgNVfzDtu+ak5xE|{{k5sB(z~8ewmmWz zPEpY)K@ps@1L{r&q^-V~58}U@*Rjd4!)G5nXuKeds9dlg-PVcj7MNSZS<5%R z8@6@yH%btMtM~T|d+R&R;W|93`;~liM7h-?+|#jvUd6U zYbV?`*p~>>4EF=&rJsUxL0YS7zB7v)j#`Z!x~ND51mUm&4T0ZAE&GShZRNecSl_6PLR+?ov`mVLW&re>JXB!jUmWe2{9tp$IK(lh}(fJi-n z(=D#LjaV3JA`pA71~H@m0Ku5@hA5;D>;O5^UTCH@yOmK_K~(jH%)T61?~~Z-T`eUl z%Fh(;FguL)&a73Agj9HP(5jMg_y#mLb6TiEgrtZmK4vI*=lb%q#u z5OMU@Qp93V^300EvnwA@+d?mNSGcEtho_lS9k2-mXhbv@IgqpR^~vONe{D-v8kw5& zK}?x08bO~$?WnC;9bn~5m~T_xK%U=H7m){$`F7UYcdMdqO&J3o=N+^qFbhQ^@c||2 z!zlFmYGoPA@s1uOj^o(sJrwI&yu_j)dl0~!pQebSB`S8SP;flB@1SuNltD;^Dwb1# zKp4Q!VX0x6$DUB9Ki<&azTzaTj8Kl*8p27;$1yNqerHQLOc+cw#oA6q&;Wfw)7I0j zNM{CBXH1Vz`*l(+$*9*E=ky))THCl~3<{P(^3QE8%>*krT_pwL++pIdqT}B`tjbdFy$9x z?sZ#0MY#7&!+P8SL5u+ohs1j!(9peX~>wwWkV)kh+ux39ja z{1j=ji^DsiEHFqJ8PTd5*%Ch!9nY!s&wNs?< z7Ume^9-3RMq(;lM1-^r}rX^$m9}g?r(488w%SP-TSdqaw^DcBH9V+gw*0qJAjx{Vh z@o;~~P$9CSxACLxoP`J9_0{z>TWYeHlScwfN0ows-$>W3sQxILos=m(@I8MlYOk`o zq>oRwrI7^m;1$Wv5BxOEXWM3Fj!7cI`VxC%Qf-zi%u=feM}ogUT`|WTi5kYSDgpSt zbwsJP0=?Ryp@{+oWnqFxx9g<()rtuTG9ezEM}0JI7OU|JLbx8Dy|JY#ihm6FjJ}5l z-&bmgwUsmrR;4411;#RcbD}i%JTg3Sb2#)Xs8mhh%(5%-8g;T&LP(L_c>DLyeNoDw zGK^R)z6>Hqr|{2XfON!?%N`6I7mxRjaj2B{yL@mrBAkH0AMwyS-O&Tom{pW=^wnRg zI>KtK-%wg1;c;kXi_nO{&-Bt3_`6c>J3O^i7Wv~qcm{mOlkJ1=sp+-q_Y|T=sCZ)? z!;$IzbplPjxFW5R*;QE$We6NWRl{fJp8Bh-g*M+RjjD5Ut4bMcQr26VD z#>H`k8j7CDCoVjjnD5`^+x#`q);^P5C@KxfZSOQw4o4lxKHz+{Wzg+wJ#DzlRYsmN zuN4JGQ2u&nRC0tyR}DwAFU17(){4a_*ae{=AAZMJRN8kel`8{G>;2f%upgM$W87^N zmYPY8#wlv}2ICAM@d@?EZBz1FZIySg5-NFU)?!R+gXy2$OLi0{WQ^K>D)9I6=@JpjB*@vldF1~*KeSOUacNN2W7zin%zx3uBByo?S>Ku zlq2Iu)g=jx1fy`+QO^gCAK{lBl)nW7Rd(Z#?n!1#I!99RWR_F>+PiMo80x7W8BoSR z$FF1i=^{;^9nzjo6fG*LlLSLd^C~M)5BTBOX15V6?=B=-@cSGz!78 zcCFI+_i>??DWf6h@sDhLfbE}8ZFFsiWbLXt1ZcMHuZzdP$t4mummg8w{d7-|Hwp%B zE1EC8Uz)L`q>hrJ3J}~`=JNQTUO@i0TQW+@fSHSj1s@` z)sNL{EHyTkp|(>j>l>?xY0*(sDbHocW2H#?nKd0G5!~Ttf)x=oG32x@>F5;p`RcbC zwyGclOK$6`o}Pvv^R;A-%8Ub*2Oh&e@zH&)wk`Xqmv5Qtt)3uK{{RH&Rh!r|jGXGV zzwVju_mM?!w?$ML4kh3t@ITeb&+2s1(+bVYwwUMTwr#$C^{2YQ4NAw@E0M`h zsUeQ7-Oe`#_l0AmGfXm$Ap` zp%UXLs?|4m-ZC{*7Wi&ds9CV=%YeU9#AEi<%a=^|7V&y{V&0ZH;|i*>Vrb*X0P;W$ zzrS%A2Ol$!rjG92i)ge&DQIqVwLc8a9Y9$5vcIp8laAjk{+c(@Ezu_3yS(*L(%i%d zJVdK(0GR+NQS$usPI0ShjTBXRN7DW6N65)Yw^}7;MV{YKvZ2S*)P6(*r#_rpD(WgZ zT5c88&kL0Bp>8G5y1#F4mu+=K+t+1DYc&@89l9u+%~cgMWtqtK10PRQod}9;pCr<~ zo}U%+6_do8em)+32spvO_Vv;X?k&ho3>S8(E$_QGw%moFwOk>ksfcoe;ybkDe<8~+ zuYcwmAGiL}-9@vQDEf&_w;>A<0xFQ`WluuNc{eY}cGG`adSO3PpiyRmDK6B>;Zw-f z7*%3>vB~1Um>JS#H`y|($4mEK=f6W$bEu33c;tCPzjJ^eBOjIr=cpXQJlvwEc2g=U z`d7T~O?aM`h6{~L1XyWn2n6Ht1a8PZI{-Cy?Td#|En8J7s;j8h&q)A5GA>HSK4&M; zd*?~^?v3=)j@3xFor6I4YE@M&ZimY=kLUCReEo1fXH5HIn|e&6Z|t#8Y2wWtO4Z2o z$|FC7$LA^E-;h71kmodnY-@%B16R~Op4sYYW3Ig0YT>VL04-)*Ke!_VpU=}kVWP9y zw|!3GrlS)j#TZ0Zb1V2qxdE55jas$;0AlU6y8a&fy7yh)zTp`S;d72SVm~ERK;FML zIw?QdzUj0c3)aoOcvDj^EL1?UMnLx9pnm?R=b>!Tw}OkJ_j|zu=_cR3P~S!BiV3N0 zGp~Ago0`6RhVy!Q`t~}%=i9fcsN<3eRi|aIl0@ z!|`?*!1wuT#M^t@YHo@I`?}^2G{}sRka660);S(tcP&w{HMF)`w$)`VIfvrnkhfx7 zchozNPOEC>6Pd;%&lDeo>wWHesIB6r-wR1J9oLD^EPlQ8wYGlHwu!1uqi{s_`ncP| z%!3iL_UsR+KSSR^k}M;(-cyBy)mj(f>uE{|y8^oNaqchSD#1rAjLZQjxd435jniJK zE_D7n2wV}8SLONWMe=$zwN%RsB1ypZ3*S}USssh)c&WNl_+er&1>=S7s#mIeF7j^A zblY$r4mJKPA+gAh<^$*bHEit$r=hSSrB)f2kPi9v&@0CBjVfB1gh73g{QDnGHKz5aq~ROPOS+sX9f#LCc#g|QUj%a8VTodw z&5#C%w?_8e!dYsPo8lm4JR}Fr8Tk*Uk9$ujLkQs~R_`B(3@Is<&@Ne}W9Iy^s^<07 zd&E^zQd8NAQw)c5ClUI8?{ww8Izx7{2dJ>iG>~JE48-H;bxiNbtEnis+^l{R=gTUo zQ}yqT`q3C^;b(bpLw6<0n&VXyU`Fyt3j+BdXSvfwvX0$y4?Q#u2vq};w{FANzN<@D z8Rqcj<0u2m&$&~lt4xaxu1jx~S(r#!Te1Cpzb!r3OYLc%dOKv4YXC^(nLu7ZVTt+; zF4xwLrX`K&CrKn7l}Ic>`supeZMV?dVz|}IBT9pk65NoV%TTH8^;@Fp@e-;yb{)b1 zarQz{RLUd!kK1dUm{TgA0fifAb5 zrJIjzj^JwxS*3{<7=O-;uVoxb)Ow0)(O21>CtyOd4#a+166-3%X*N^M4QuhNn*@v) z)5=Hdt&6pqu3SSvC{J{NAtL3&|qipytt{(uldymsjcB$_cdVd~jB&>uCC#?3uty|KSWtSh4}Xw2)xB4|Y3r#R!4%xM`AVD;-mzbrDBN;X zeKDq66$QS}!7WzmO2t8f$lPUC`htJpG#2S`+51{nskTx_OB!LCcw+o{{!mHp`)OL` z)TJTHCbQ! zwY#dPe+KaIM57B5Hb?KI8>Qambg7o6<#BmgyMh>yPv@OSrdn1)D(06t{!#6%Vjw#q zM`Yjok@6%f5GDwmwLM1rBwN9Fw&}oKh|db^xc7@DwuaVs|kKx^?vx_UMfto zgZ}_I=l%3Ly770pD@|I-Cnh8@1Csp#^~Rbmb^9WYa<*DJr%aHoQ51MVp4lDwe!2^E z+;de($r{plN^qE?MD6(jjOuNrp`?BmpvxmT0!Z19pdgd2^$-<+F`|(Ue;;r^ufC$0 zoMEFpNXZx&)TpkUV({mKpRaJoRt55n!PqTYj8fBJ_<+U%Ejbs$*do4cJ$sEZF#*r!o?oK=FbsQ2nX(NO4o0*#ae5-2AdCsVf$)BgbNerRcCE5W5$6C`{4X{OiK?dBdThuo<| ztNbZ2#g&xz?-zbwsK%-$J6t4&P> z8bmSQiHrgW_VxU<-L<-x5}86|_zsmZnHZ zIR#ja9jV>**GgZ8ybp_XJfogRVej^gNGG5WQ@}5VbnddV+PX)Q>wl(V>x@3 zGb|+k0Cig*_748K^KNhCYV@XxRk+p6yoE&>1xN?bkjJ;s>y#enQ#@%EM2#SflDRp? zep;19xvy5&@vYZ6sh`s*+)wT`eFk?+=|8buWhYRsl~vVNTDo5na0}uz$O=85>#FN| z?j(xeEmaN1dP<-RA|sT;0uOcd)n{Vrmf*F=EK*do!gmcLyAn^#YE9>L?Yq=sY3Y1A zuTF86Ve9S)9luki#}sYhAw7zUTzu3@|@%L(TLb^La#GQz29Q(P3^S?>bzRSb@5X293}j02bg4^ZvO!A8l)=v zb7!rjmf;R);SRxEx1q`GN5AQ-yJcCe;<}nj-Qx{BiGtLz6D(2>lPMu^eBQ< zskXPl)kY*`%47u!ewhCNjdzjO+#RCjuXMkSDme5k|Gis0w>8s_c&(M`j$?ov|ti(3-@7mWz*_3f<@ zOv#Ng4(Bj`QC9(b;~n*oRv7fw_oJ2x409<$y^cq|y}}WIhx5*~hUHOx@Ucbie!lwJ zi-K|i#=Zdd0D9^|u2;Co8anhq=Pw2uz6P^Y1-p+<$5|{u437HCfgXbc=c!hMbzyp- zW83xDsxo`8q1VVefvtf_BR#Z0ASGf3PCMZ1U|gR1$rBhJzoxe=L${Z=&sS7w33c$a z2=Ft5uXyJt(^5ogzFg-W{dJ4RKQpVWAvem7Pz;Y~-&a9AoSG zXxafoxUE2X_Rp}_jGfLq>thZ_Bh>5QJ7D|hw)apKhx2-RdTZqwI?IQ+KKl3qM`7ux zrLQsD9rLdMIqm-dyw=dAhq%wT%U=cd!1{L7r9jfd10MeX_G|7LI@^xlO?{63nb8YU z>1yNoYu-OEZQqo3Vi_8hMH3CU=Rc8 z>#tQn85q`lbDVtj_Yw|qq6&#v74P&uxc1k8cPAaSw~t|g@2`r0M}JKa;ZQ384hOK; zr3QNetgwACuW|DOR-(X+etP>JoxOFR6Y}k^ut&FjMJ;P19@_Y0I@!SE(0A4)NcYrL zYvMEOonenQvj|7xI62qc2tD;FRj&eM;GcinUvOUeI6CwKzpk=X1d>72R7%uQdwTZv z*SPJK_8QNJ%fHWFfu7omt$eaN5X1M>>RW_}z8m-L>+h&ReL(j5=UE|P`5$c)Z-l3` zJCt$?@sK&=wsW0LO7%mLE`FKqrL=4eE;YSoARLjR2Jo{!G~-Eig?pA5KE3o!Z!nU) zCdLncZ6GY{xg5T^*2wE59fKcTQEjEP5UqPQ;8l8n3xZx)6`kIF&7J@uAYHwy{T%0Z_tg@U4J5o3m4{+-TsE;_j)PI7wt z=So&h!3}&viylMOPKleua*qv@C_S~zd|s<-U%?56g7p-W@F+4qdTybsiJ}b2?d)|} zK~qR&41_0to-}%f_VHm<A*YU%KLl5bpwY5ztJV^aD zZEclKa70?JDHDhunuAh`e8Y(O4MdGf$o-`D;cYynvLk8$+Yi6d@9wm|x6!Q>>mJ4tsNV?+Uv_VnyKX@06Ths=`T zkL#;CT1e-JgBV=>G@*2|Q>!~kB764vYeaGbgo&9!Dsci+4N5>7@t>00A?iiLui z7dXaq+~{LnCa*jraI2o@IL@Gpc1peUpJ{gjNh!pc{Envm?C<7Ty-ty7z8WRNNJ|f8 z(KsqWU?FUJ9OxYjZwkb&9H$trZ0ZLt`R|=>T8|KR9sM)yrKqEofM$G*_d1%Dfd>-! z#+F%JCN@h%s^<{KdB1#me6*i+yGRKM_n{gRj5e?fc}~Z zRZ^_wMm;^oqSRI~B(rw>^Qdo7NhdkSpwokCWgAs zzrM8@$F@6b12E&958q6`MHGPfJec~9`qu6g_9T5Z9L<*XIsEnKi<8`ejR8`Y<0me_ z;~t+)ZGuTrhlMLC_QA%X^X^F=o|qaTZHk_%WJz0q$8t~jYAZY=)VF$tr&O!A(#%wL zl0{;~{{V)wd%LR&n|-z#X=5OVjyw=`syls7JoBm`KZ%%k8kb3AhH%wSaRCrykNdPG zELSRGZiFb5`IWK zC<7V)0JlQYzNR@j!dw7*kWc=g&>V1@Ji%D=Q0)saMXGtKs$6-z#|!#nP~K`cgw0Dp zxF^be$LXbtE37UvRQ%hQE=RHavz;2Exfp6ZN?01D518>81M}6MEmqPyFKFdL3pz&5 z-HSSo$6Dm8bmq$-UMIJPe-Y71=F?>P zB^VxyBx#&QQ#qA6oUR52k3msWJZ<2@g@S${*w5*ql2%-5RTSB!L5wK~IH3Ks66aZY zrpaK*8ur33`1a0+cd8)5Q5x#{)eRKN0Qqt6`{*>cDvm)Roq-q_CkIiMN}BW%3FcSF ze)!PJj}yfa2a(@B*q-^&INnp3(ZYA3yu4UhVqoLnmIwX%B5nyH7a7m`&A}vHNHT968k}1-l=emKR=XX@M3VNtsH4TD6 z?gq70h+%0sPR+|X1xO#hqDegzbp9LpgZChuk@3l|G-@AKg6(v+jKLDqPKF5!7`{=p2#OHyLf{$W@AD)!s-94jeTH&}raJ(|> z*!+&C!8BDQBSzw>Rgmop#Bu}oS)pcZ}8R;+bLYRp_ro%;TYs;WZKX^3KaDM zjfqY^Uf-Ug%XxH1D4NR-Dn`)C`1^LzLr}_z@J-BcAecrSpNX{**qxyJc?WO)2`UJY@5+5 z1ywX<4mr$t5>KG-+f>E6=^Rc0ryK)$m-YGS(#>$&RR%PwNg`r-aa@ex{SK7o;Web+ z3Cj1=h$cf(K@lKjPi(G!npUgn^vt{p4nxy34kP}?FLVdAQb+XGT) z>1~-VV~xw6;{bQi`%96Cek+G>8x7#DmME#`;-|$>lI z3vXUvCP;h<7bFzMa(_Kld()>j#iL^atkOrE9AJ^6W}rDO@s{Ottu>hr!PQUYD z51w^8OK}U$N4KZXTD~2@Do?5R(ou{B3SyBHz>R1%d`?-iG4HL_Ft`V}Uf$s(8pDNgt-PyMU!v7#@V`=|WKY!2bY= zbAj6*JqfIri9KK~u<%N8cJH zM|L#eaXwu9^tByaZ;*}daC@D4)u|ctp4si&+-OKVBD+rUU1E1!oE-X%7fXy&g$p1o zJpnqa9_1TN#bkBC`S#IjUBXbu5ln&VduVIbUnAF+ma0l(Rovly0Xi*NP}NLj3I`FK zXk5ZJJg^3Ray>O!8Bk$Lb9JsD(MnNs>`t02n|eZtQ&i=g<0sVVevYAHkCZEe+py6A zxo%Xi;D#r@aNgRhMM}V-@Q@gmM@2rTKDuGDHM%k~p_sSG5_MTo-)kjLtFFrUw9~b8YJ`+uKmgGyixeLW(F7TMfynXe5S5Pdm zmhg*qJ@MO1{{RgX68KF54nUtwXGGVkbZU^P+SRZiS)3F>+XFfgB}FVG!jddU(TgY= zxA#OPq4Gr%0CI43PwuNn#!O1Gmtam8+gcdw3p<5j1-a2$tE3dd;CW~HMgiBOZ~f0m zYGk;gEPi3lfCPS89=3|AA2)XItgCkM+;s0tQe+Xh^zkvBG$jzLz28DNw&j-VQF0X$ z03%o;l!Pk1fB<>{t+ri{O>7NQO>eD?C*u4-G5-J@Y1-G)x;sjb35-E76k{3x0Bc*3 zFXFOGToQ=kEEg{4zJ0Urrk7%ZT_o+lB8}DYmndl>f|)!Js)Wey-p99MJ#(FOZrYhH zmW1G`9A~y&y?(g$)k#OvzM@;M=Bm$6m}(AWc*tyf_8(n7?aLMB%}*(wny6G@<+wHv z=Zz`kdZqwYJC|zMZf_+&+$7G!2B!?M`}gJVs)m-AY*YQ^XN1F5B26G!A;WSYV;KWF zv~RnkddEm9tycME5D9lg4&HM4I!jk0P~k-0gERfng11^)oIOm2B7UFk^< z^=Wu-Fv&%3X{r(YtKuFY`gwy9ojzObcRPfXbyd*E1oUTrRnZc6XMAT z46`q`LW}}^$j5zWwPLhet&4Y|x&buG1wdGdDlyy^&-5c2q^a4|^1vDVLq586*>&}C zO*9tzDICl^s<~`@`(p=9AO&s}mC>6H4YM?{t@`&gKN#K}I?FCpAAc@9zeC(;uTt-I z7E6@``+nW=lG4Uv4MvPwbj~nvG3rOIea@)6CfB^(t`AjP4MMa9Wp!}gRQ7C)<5%v^ zo}PPbG|O8e!A?U+T?u|iw;n}se^1X@WNz15CY(||(>k5id9?^`&{JE)o@kaOZxIfE z4oac_01>B)eUkk_duz4yNmEXTj03X>)7`r$IsHxsg7LZA=pIWf6VFhC#E5uILHzq? z8a=o7<>uE!CcZ`D)ttG7Az(uLj^kLI>o{7P02x*dzi-gVOYxC3A}M_8+;g1&07ImT z`+dfza#YD^Lr3tTQDjJXtj;_4AZH(zls6CBlWc9tgf|!_re0u=8a@$_bJ!D)k@V2p z_u5-$R8tF$p5+Z9Bz)#&0kMJd&wU3@L)kbvy_Ms)Z})g0Fx+b(lDz?Di2(rzwm~QN z(;dI5RP?LiTs|FJ9&TQP_tyn(@3gcgQ*hfCx{0dU@bxgaD4Bn{LZ46HN!Jd)?t7{T zC8}v%qAJp2PY~qiIra3^ZjtWF(8rDn{Tsd9HvP^AyHZudPRssq1OXj=#y!v1NtM>? zGO4?4$>D~wL+XQ+Wxvu~_WGT1HK(r^LvUJ4)l)ww+W|04L`U9}o{- zUCDFxVt-9TqA&9SNq*C`QCICBSZ3PyR@>K$w7exHVU|c42d`%2J7D~@(zj~M^r=~H zs1;4yJbil}!(5eh-80{&T9>7c2NDSgSy_kWhB|w+^)j-Go+C|MRl;|Sr=cHQ>N`wY zFsZZOyt-9){nlD@^#8oeOH=jB&wef z)w1I;u6ZACT^s5D09EcW-pfh@tEL#104dL|KP@5JVg>?hC!@;h{{XzI{uqjr5ijbb zgP>P?1)F)&O=-PS!7Vt9sRVH#k=TMg#(+@oD^+VF{pHE{lK7+`bQeS2#*$Ae*L-qNaF&-Qt=?fXT-`At_pfk+*M#lau}k(I}%*HzZm z@g=EPr^t+uJL{(tcUh|`DyD=}j8$2j5wn0f8)a8YG2g$;-=koQ^#n*0B*2>jrJVO~P z!Jh#BnATF-+A5xHSjC5_Q;zzX0a%nr@fc_BfA_kuDOI4<)|!ecq%{v;0 z_!RsyRCpvie1{y5>)TW>RQjXS?ePgpXkluJ2L*Y1C_gf);ADMH57%7FxK8)DmTRD{ zXsMV)zB4l_Fzx^+BRC_|=b_Zrr>K-YbLL151_-y)_NpCa0=3 za;78`Dn270Q`j%-rW@74J|-)TWXn{wC_pgIAHxH&^5@D%b*M#*ti|D2b)9yp+*@QM zQWu>;jVY1=j1T8yj^O9hI_XY5<4zEdEnrWEDB%!9P6_wUJwWa0jT<8afT_mQTi1PbNL-dk~5ymquYF`8?$NwjGbao4#QHOHUqHMB|CZ@Ue%yIMr8VH z&ks^KW7KON1J~P7G!%Q5phz45$ksea7$X{S+8sFD8@_6GqN9`Gq?3e|5dkNM`KUPu z^TxWTVSSG&W2Y5yMGZu*zvpWc#2^vs7x4a={dJmcM0$UGqGspeg4YtXW88Xvn#b2Z zU370<}#-q{f0)V zv61+HeP#n>9a)SxQ42Y392MD??yXW(S>|g!d=#~DLK%#hArzbzC*Rkw`QueTP`5qm z@9@u8Qne7VZc-p2vFuo6yE$ia{DBM}MxQE@<3F8{4t}03AlD ztD3F6Nw8S=>@lqlqrwRH$AiMqia#xG3Ky{S&b$f;#yvH#C<7j!Ee%jcT)iE;4_#&l zY~#@P*NTJX+di7yh|I$n&*h>5kZ!Yu;zUje2T~(|h2(vG^|~r@zMb>mTb3b!pm#pH zn`;WdS_BJ#-TV6MXN8`_(^+r;j1J#VO=fTo8|B|uw!*Vjm7#%9Fa~|KgRt~r>!}Uq z!5`OHaSSrwEf@(T*9t2Pl0D9`?lYgu8rvd~?dk3E)}rhWbE4q@H^TEBi6i#bLm9xq z*NQm^t@v z%rD7LZDbcX0QU9KZKXx)9zP;G>+UB$g8*wKQR(V^HJBM4hKrsRTGz+7x96|8=Op@T zZxRn-uS9w6*lJg*9m`f5C$_%f`Tm;RV=dh0UT_L{vv$!^t6IXGWCNV*E(hORIAhaa zHV?O<(N!tBmXL$<)%zVAMx`lh zTSQpru-AnNC)XLr=dJu1iTMp+!zTp)09{H`a@E7n>y2a-_9ycg*3JNrQIGN0ycpp7 z4#QHFTGz+FvDd;Ze=qEHyhJ_0*1~{$<5x&alu(46YtIRR!+L601M7jWL|M4pb=~v>% z9IVAxv1J|cs}_rKEa6r;PjlT^9{QrJl21)4I%RR+Rwc6O<3}HgRag%}+enr+-wNW8 z)mpUaDkgp`VqPP;_tAKHGNX8fGwF|AR}>qLqL74P;wkO)#+mJx!&0F}7u$*NtTIBj zvO&UpwXA_M%yIHQ`Y`3f4krMQeJk1P&^TrR7Z}ej`O^bTr3+^#83gMK#TBKe3n=7~ zj}kbHj1lRnk=mu1!wiX!Q}Pk;0}Qm-6GbknAQj0%)(P=^~4= zD)C?Rwe+;DQ2rbTi23JRZdUoB^Pu6JWDRMi6UIX1jGvZuXk~nfM@(4Ad3}9!O*T-ISy1J6l0u<>QR$&qDhf%J zfj}64U1dFc_-0QN83gz3pfy*{FNq}?^&o3hY&?aP@($_+bplX%HbSiCoPlgbf<8+8D#VzX9Gp2l1USUnK?aP}_qy0{oZ*@)`p%XYI(Jb@}P7Xk>DJA(dC;27j)g*TqXlGYc%I z8T8IIp`y51-<+kUgOp{kPt0RFk0fU~0FT#2jYCZ2l;S>~+J{-d=YYukyJ?N|N)9Rm zsb2o0QRb5!{V}c5uu<5Ksc&vIUHwLlaAxt z*HX$L7Vb@e3CY$Rv)><1`oK1O5B=u64n0mkZ9;eoz{<#wdwTtK>i2&!>@}@jxpn|! zTcNl~4i|zS^@gg{Eh=0v(iZ;!D0cvN$Q`s&*eRuy!2*XTvSILkx)&wFf}kjtl~Mi5 z4j}$|*9}u!=MtmwHO3o#jbnf_bGR7JT66<@M2tw{@xUPAzdkf!WotbMrm*Re4Ys000SkJ3VDJ zYBj`&*O19$mHwJ_mOBzt0xlG8>b_{zOBeZL2SbUoUQmWv$;M2H87RL`U2B7AQY~b1 zn$?n;Ug$x=&&cOj#|rO%I9b$ISsE5&YXUssf*cY@%l`m-sC3ub3L3;pc$%65d!S;( z{@%JLeA{-YsgQ{cAmV$ZWwZJB^wMlgO%+IrYK4^);4&ZZ&^g2u$k-ee(M`80Z!kji zwF@A1=EIQWqw?*qX4<=Y%RF+Vtt|XY9%vW?`{PJd6Fnq#?U2_U94(6}AQ&muGV_R_WH3$1EAW?1mPfG7-gHK~%K zscE8lmQcLdfH-5=1|9SJ>vLP@l}gG8Om=hKhtsx%l^W!cC0%v7I7e{o==63?C57&K!Zu8OYFz8(lqBYYN#GCI0d4pg#h%HQ;8D8diFU z%{=9ppVISF?sAih=3+>LhM4Vy+tAu&y3rKF8!mRKYo%&O#!=v_s!+j1ol6oOP6klW>ko`5$eF>_tvVKMyFO|hQY|d&*`Qlv)?3> zGZ@w|PvK#&XR_5sKg~0#^(5&oG_>o-lpj#K zV5qazQvU!Bo;chQo=4YE5#@-8Dq&2oZ>c&GLSuQtf|0iY8%W_t%=&0;Zx%noa5#FB zxYI3MRAvtrA_JdgBS5E;opK)lXSr->Z8eUvgSlx2VwKqX9OF=4T968vkC(OvioCYJ z5SC6!>`}3ybuAM&@X6wRGIc~_DdPL6&pe30sbTWg6WnV^3*uwtj@r&)l)zGR@2FBn z%1A0l=cT&{+eK!#I@rSlJMnJh7WLLEaj8SfIUEt_LG;vl8y;TT(0oG21Mj=XwT=DFSz<^fPOB1txC_?8X`*!W4P;I*C6)8=-!IWc?n0w>))oZf%X5`y<1goW$ zQz=_nqW zBuS%WE9eU7)djkGn7mpwSlk@ph6(+(_T;9LwiTYmSV|{uMSS0}&?-gg?5r=Ffr zbKG&xez?_-wl)mZvZYPH6_d9F$EWG6uMGn!ppu*5t1d8wiDBOwoRd6AWR7Oft`3da zEHsqSt2>P21f3bDveEdg40$-tc=pyp;1jlzDJ7e=VNc>skI%M(-D)PN$SeTJ0NH4TYTSd*ONQU3t5s0LSn8Z^DyJL**-B?hR5RbE|>e{R}|A0p*IAcKM5 zMOuB$@SE=esv8dD1L=(oDz&|) zfM+aDJL(NYnI+JYG4Jx%lT|O_kLBOKbEq=ZoR-62eLZ_>QnAY1?haJvD~{(_WQ8F{ zdxL}W)I(TuPEH4}eMk7n$tqaqx4x>Cj3P}t#gL1~+#Ko^MMUL@G4?(G0AHT9NjYyc zXFN`Qb%Rt$$C32UzM(`4&MKKQc@J^wbViy<GRQQIdHh}32~m-(vAftg1m`M zL?@dm3G3g`YdUmT$MB=deDSQ~qmrsnVu8V9k_L@Ex=L$)W>FbEha;*8f)gx>!IQ&0 z$o0me(_1E}C0HM!(-pgJRNOy`xscH$fWISqn4a3u^f+1O4vGm zvR~$on-aGr0|XP_(^ZY4_>;ea6Y>3Yc6#cnT2={9p52enK=#_O>Q8aq%dQp9Gw7$= zQSMXHSEyLk!-0a{r&YpknwT9}sg2ZQiS*HktKPPk;v$r!gk%BkbQ=g))b&#;w!_t_ z3R*Dzi%XDk^V0pxr!dC;G!-$lz&*uVBRE zI%`_slHv-HCd`(8YSAE=dZ-#2yHY@1Uf%pc!9JMPgJ`S~z!pl6IT$jWX#E96syOB3 z@yg%c`<-Q!!$dEUnVdd1A_6!o#M^NmDkzifDm8 zil{Xz-)yQyU*QbrBn?f)P+}WEwNy6rj+%iEFf;G1wTM!X%Cy1T2P%EE%pQ&?Lr8^P zJ#*VSU%b^%RTeFXl9p^09l+3oXsVTAxSqD1WsuCU2JQwsYL(r0E1-t1h6=e2JgUmx zARJdd{q@oH`zCAL$n`8zII>+q{72=bP1Vt=JFIHLyi?43GKK+2{_Z{Xp^s?gDa}2X zCquQq;iRd!-YeRrfG-AE`uu{A@j6wHsx-TK=T(MRl1Bbj83Xe==$-!n)5<%1Fk50P z86H_#0M0(7>bJIZrpqm1b+fH%F(;gke5W`$`Tqb-Yh&6)l#(-*Ozv)@T{okZou`o_ zPBHkNW&`vCOVqZSi5){m;JFwKFb=u~`L`parF(okI!MwtE8+@pP@;^P7bB55$m~JT zD?Ze=RK~Jy4s5e5eh7_Ultq|%Nnd|&Tzz!jprkFq!cU~>cIRkCQ(EL$8@kK zT~BJOijFd|pr_)dA@U&pA>aPpC$27vXH1n?bn|9k_oXVtZj}j4@~my(vF9LT-A`;B zcJJ-0+KS7ycD2fm&-dEatvT>tgep~E)PlpYY~T_-G|e57nyQW$hNMLlQX|O}E8!R7 zbNE*alkRcfMPu3#UF#XCZEZzQDv;9Wvnl>S2_z2s$0Vi4Da?!jf?YRl>fcQ;uzV*N zkgBArS&96?9lbP_xU74|YiQiJex}K7dY9yBsc7S6jDK}q`3!dTAby&1zwGPfirwIC zxaOKjBn`=mmIEWcThtGI2)bBzUDBZ;n*D35rk%LX)iCk+bOXNx#yMvl`~F%`Ik1>Q zr?;Nh+?#@>E%kSH+;Ni|vrIfhb}p`0Yxp&&sA`q;WrRusl0;;ARMxEcn@SOrl30N6dz;zLP&>CH<~PEIPJib*DB_VV%o{-4)Xwd%)J zx9;_COKhv9k~ZKt!^em|nHcPUJ#_Z*+xE--)(dLxP0?K?3Sr7u1yD%I%W()jM`a6- z*GO`7-65@#-*4V`2#W`4VyUZh5Crz_xc-Abo|wryl)z|VQP5cyrhXMS2}G_>E`9j^ zeX=z+OLpI-;R3(Jz7H`Hzm)w+{{XX3_bUuLTF+AuxmpE8j_b-QnC4~}?%n*u^CPya zXlp6aBuEx1S@V~0Mm}T^d;Z$dd%`xFI9sYL7HX~((QYZc%ge!9c5W}9!<>QpXl=)6 z(^`+i&2exg^AHybeqM+CbkAYgd*_IYGOD}4x4<{w;RRM|EjRmmG=9~DzYWrYZ2%!*HE^u~`++2@ak38N}~7<*~# zY&k`yOO1VHH870uiWZ2Y%0a=#20yN)ZLNWOzDF!}nny99Eb`34DDnn)g4oGEfDHQg z!0)Dqio0CX3z|rzr%O#HLU^3;f0w?EQ7R(<>PD>>Ppty{V3=zJ0BV7+c&}(G0GTfuvA~kYRDc(jhp$EA4aLY7drA*`U z$JbT;6*cafac6YAUUscnw$D084NsK#L>!Ur z+tc;dHzblPNHOP{XT)WEk`9zc;+P*v^xSBokP})Vgnttl%P`TpI_qP_@ln-0k!Kx- z0sQqySgK{*H>m9}JI0Zq$YM!m1JwS#^C*IXE7e^dGK;%mAwr zT4lM=CF+%>u}cuB&QwTBd(J+882GysVtfQIDW$}`+!wzNYY>?KJ0$WZ!+_bna1d#%va&s9;}M9}zt zAJnqD4E(!lo48*(e9=cWMD;YXkXw@AxFgdUQ|tc#sf{>qy6xMz?6h>Wn@+yxTQxWn zIA?!W)gQAk}v|2kZz~Lb9OwWPjhSO&T=1bk0(D$C)x{IW%!B1%ag2<5f9iMC1-HjF8%~o)$(zi)k0JUI>GjUEG#1e0)6_^;`9V(lbm^x{ zcRy6_=GnFB4+wbtT~wW-gdg#2dM>H{P+a~IGz*}B?Y)V*_ia?PyLQ7>Uht@CJS6OZ z`VvoJ`}=CfvwfR7lUIbSwnuJ_$nhtrl^cM;{3s71ewyq~lypjmruL|4=pu@0j}1~< zl!t>%eajzn-%l0RM5RJyMD7VW8sooTw2;mgu8DB6zdi2%0B63STWchS2x;peRmiAT z;2Y`0r+Ngs2TOwLT%r%Z&vpeyxbb9!%B>tk~ylR=EoVq#AFZORqp-h zPg6Q{u+4t3mX4xt0UnLMBQK1ALX7v)TdUK#+e3w|f*Be(NYu6f{Xhc08?}EXp|@1e z#Y-O!BHmx0Z*Q)qST>F0aaRj<4Lcc6Bj-{8$F6=@*IE6VcBbgHS*l>%9X|+_k&ZGL zI81)6k?D_Y{+e@dvva-o@7pCseGN!r!vTO?_r?JO8qEIy5{5UHJL;I&C3{1fm;T6m zCZygcqPtrz)6h{%D@Q+c;&BdFKpvP_`clFnB&~55!I&mE(JWwf7kfT-iPH6W{ znvyCF!$%8*9jA?$1OCa?p-VAw#~AJEPP~_h>Q16k;JcbQn-c>{T)yn+yb<^797&3cP~S_ zbGRvGw_Pl78cBP+QO1fG{K*3({dHPje#adUt%;(hvrR~N@kgepWMw}y+=Kd!bS=?L zWw`PmO)gI?p@{>^4}EBlT{AdwS7aB7R|YCxwNv5H4;n&uyg+aL6LcWg?@eY`V=Kb{7HentDgGAoA^{?tD=t+2{k6m$Q@3=cdxgddNFt@4q03X%FjPq2*N#W1{Qm%bc61u| z>Ww+Hx%#%ZPr<*{bBBi6$ku9v5tFGE0YvU2J*fisT!*sIg{dML{Pnq4zH#lZLNM+Jq1MG*`i(%^vl4IJAPieFx0Z;h=?CSjO$=Qf-|hVGCOwk)^Wzi)Z<1P zl3!~N4ZD)wzWUmz$MpSmwP9w?H6baSHUP#kl6~}BQ0^sYjs{>d1_#Shqlbcn>Gjs- zfrd!IBikO@%ZX#$cF(4!)IjZ6p*(YepJT1c;e4%(AKzXqXSd7ct%4%MAba}i>(xOa z3tJL>7a8{Y>j4?|)X3>cBRR+AsS(kP3<7cU8k9!}T>Irf5aff5AD*%l>U)Jgp1%4q z9S1JTJNk`FipxB>DG@)WptQ2~+E%Edm4Rdglk1&9nv$X;=ZVLm{5pLWnILer5i(z|<`W;9LeSgGj?+o@M_SJ#eR^_BAz{uC4Go0t!Tl_K! zC*}KV(1X4dlkcJe)oxk}fsyO)uQ0&+YDWgi0d?_-zFvn?l?Mf*kAK6Bd%?MO^w#eT z{(8tD#zD~lru7?vBP8qI01=a|<#q5(`uF`cHqx8aaD(+a^hb;wYDW|O-_UE`AbhoX zP`yVH_Q)q1`-g1$gWpmDDHs~}hCRKzYUx(>qr=Cb&Ii7}@bWW{>8T+wF^zk}>-p+Z z10^WFA1{4l;SBZw>RTp9xbOSx&KS>>XZF;k1d1<*k_LNcwze#IIb*HCGDb$d@caDn z^wgyb?P1}6ch_EcKQc8SDeQf9lA!+YZ*B$kAm%TvnPrvW4ei_@$0nsFZSaAaf z(^6ug!*|HZ?Z;CH3(6B63l{t>>+7iy(v)m6fCp?M`+gHK!=q?ZGq|zs*26yax8pWjH&J0u>P9D9l03fXF~XsL((R}t zBZWodx)*!e^-#gZT$T0*-$?gOzgZhBipt0Ppn7V?xZG}4Ylle51K9g$L^M?uQ!FkS zLG{ORt&zC2Sy^7zlZ3D>^U|a&BPE=79>Z8Q9D<<8?}bt5bz;kHf;iGR(0A>Y8Xt7p z@&biGW?_)SQL_4=bR>kIO)WICcn;2`z5TRI+NYB%9NvQ?BRSNTu^7oNxMB0wW(v3? z=K=E%L7iD}?5VNP%7XM?4l?nE816vFeQS~ctC-^iH)3(vX}aG_CBlrP&~S1)`F-@e zxUID`<)VU53=ZDDx{ZCBRQ48&?0{EIOHGuO$8N*iXY|rd$^IgD2uL56n5ym702Y`Q zIrKgAtx{T%qgHe4^zW_AptBt0q?zdJ*8s_dCq0L4LUk}@p(UL`&O7H$6}IpRNRhuU znA8vK=N~jtg35A7%TEpqIp^S%jWug2k)vP_cI}-HY6_}}o;cCWWMDBKnz2%vC@JJs zE6u-@u77O+s-mirOh-)lC)dzvpxRULl6`~G?XUKEm5OkfP2M>=Z0 z+dMf4nnCkFAb&k8R!0PJ$bw%HkG`DTgo0_Eblok~qK-Pr79pHR>JELermdsBXud6Dt)z}A z4`5;^4f(0yL=yx@lyqSkm&q756J4Lnu4aXrdMMyk0reMB910jYMB-|ASC%Gm+Pz4*c+k;ZX`!FD@Z=E= zXXFXTe)?&Hn9t$u^3-{D?e?}5sPPso z_i)^?k@fb|#GBV>wZa%_A>>8^uWXP9u1W8#ZkM|~WQIt7DxIGmN8kYZe6%-sDyp)R zp@yz1WTTy?SY=>Qfg@{Bc_egSS43D@-WFCmUT9*tj0%*zJ@vD$C=f< z=ze-wua<(2t$qroX(J7u9J9yi{{X$!6X=KwQ|7&W*hL(O$fpOFxc#&~ILyxKap{d4quDg{P=OMr0r$>xtYxyn1fC}~!1WmZnp2 zw~WNJ=^TeWiuXEAx$XOuPbZH`Fs+R8{{R82=CagqBLZoi4`8199VAxhm5kIf@{6;H z7q+dk`m1Y;P8AF-s;XK@CdeL$I}guU$4O~rRdlEle90Kq#3r#+c#QGFfafZaj>B48 zZEc#=QX^>#WD?3UKP(*)c=SirRfJSlIi-RYi-JY|an$6o`kiHU*)HX)=;}wpHV7nl z0Q;R;uhY6%;%|Wns8=PAbD#KXJ+hA9XfnkmV#>|{@Z|XqTo2Fw8Uk!0-$x3ks_FIE z#p2Tin0kN)3H-C`p;Z$0&gv_S9`2MPs=b;4%|~8&*_t<>aDFoc!eUl+m%dX z3nV88^~SL}Y|+S15t5NCS7e5gITi(yK)g;*a5VQ~fi5bNn2|YsHM9F6w`eH*l+sA& z05NX=0G5MI9p;*~iXFKWs2RycL7ZdP>!{MrQ*K!z zegus003T18(%d_S{{Te`31tMR?!X>6`ghX4d$QEjmk3!6Fe=RIT;%KIs08E#N zJ~>R{tfN2TMLwUdmMYSokqMHiM}I29-lR87WMU6en%_s)P_>ZPt6(yCrr&vxym zwX~A*PE$0OYiKMUsd5f5G&T1;6zl<~5(D4O+enuiNUCsNre$E+%E(t(BsCO~gn8MN zd$G=#8V*v4CzWE;Z?VOcTdC1Tao;3<`tq-L*`C~HuT&FYl|*xl>acpEG8u{X(CYc* zagJW2-$Ww_OUfsF+|N}jaAin?91Q16-x||MSZ9gtlc;j?{(SmtSdb{m*-Z*&jV`j-l`{au0o194os_RI}jmCy4Aj_R)%J_~T%X z%H!&Et4mPMLgTl;Z4r$YMjYSNk3*p$QAb!))VU0tPJLI?P%AjZr4VNa_txrB!GSXN z9mcS%c>F?779T&Bg%CmIXh{+fv{PiG+*CcV*zMiMHeYF+jC}x#| zDaX&-TBZsBRsfuQwLO_Y^0Dvr)L;Pzk@BBRYAR4>k~owq@+?N6O<1Im%g48Grl-`y z3ydf_9@H_FB1e;VKu+f;I|y40wu-Oh4wMl~rTn1%3;2>1Ex zWN|BYTn_opG*W_-7;Zj?1Glz-qHb`rwRps;NyW(Y?b}CVN`xzb6_2lNc}Yl|mC_Oq z*VjZuXTt*wJ7D|iXDOrNiCLtH2#&Qe%h9u^ST^ieiba76zD7aDG4$1M9Z!KOL?dSy z^~a}uJ#9<-K{`6QP@r}_^+Zx2n5g!3eYOwsbZCn&95Bc@)|#6wWNYG0P|k2WDDE`< zY238+u=sUP=ErW>&Y<1amSt&S99#_G0qdX#)e@|(F;%5OSRs*eFb+HDX`;ACD{{(b z-{+(EI*H+^W>hRbx{hlqDsoIff!nvJ)$J<5LIIu(v$5ro+>GmGEo84D4l<^roFI+JYc=~tlbTYG?lLQfxSdolmja>q&(MtP_H+S*oo#j$9=02xHY_(OAO0fJY#sL9O z9OQjIM@!U^%C##5upIh~k8N7JVB0Aqf-1{-n>Z=NXTFG<2x%O)ZOJ7n{wH<-@j4|f zwpu0>@Ss&6F8%b`MMqCsilD7K;1IrtAMnu#HsvCTW|pw{kKfc|8bOf|jFgKAsSG?s z!Bc?QBTd#>YEgd)!Sy=Er*F=Mq=s}VdyZbZ@`P2=NQzgNCdPF|!NFK*Y0CPd*GqAE zCX`BK2eOtpKc=KxYyo>BBz|n*oM`U~a985yNYAbZsnkl_g{mC?0390#(4P6#3rsBo zB`xlmZWfv+Sm~hb#FG>9Bz<*9?nm7_uBJq`qr)5^mheGf0QJep@A~S?-TU?%GR-8_ z7Wkk*aMMUK57!yjD|JilM^RHO+h1-^GRB|6sHl#Y!HPgfehhra*Vp_tswmueS)Sk% zR_oj;MQ)msvPkMpG+f{CnHL_T0G~1T)kjIbtyGd#S0z1F5SaMEygv;}{GHsA#1EDR ztNN|)SxHv4#%8FPlfePx2hfj0`F%BEbhoCvpQzUfZd;Ayq_@PS%s9i8!1Dp@2e}&G z(+q8ul-V?#?R%>4x&p>-G_=$>1sxR3&b&Q4V~>1~e%i2hA51L>wHu1}@fDFsiilPv z6wrkpii6I?pMLo|0Uu24?`UgPp1Am zTe$C&k6ksvYOG0oSt*rO{{RGKzaRAPpt1D}rvCtT%XDj{sRI?0$4BtWxW)lmP<=<6@eF$FF}_NBS`(Suw3je{$>9nP7%nou zuh8g{+HY_|A*QQ|<16G~q+sLUzKhs4)isuhXkHbU`_ivv&*h`bYbvVL%2{)Qqqp?Z z3$ujww;4$EpW1Yjg~k}(FhTKEfEfI{=Thr7qST^R)58LBZcY?qkUqV}o5h|bQ}HOy z8@C=_pQg06q(x5a9#lW!81&F?D(ecLyKVbl!_*}N!aCM35oS_&{t7vwt) zYOA!-!v6pjEC?CBa(}L`tl`}j(dfAwbA6dQZ*{6_YHMB6q+poMJYEz^PoXZva>4l# zogwcZvaGZV5B4g9jH?@RdF7H+W5>TW0fG<9`s=gqRk9kv;l~+`dk$UBH8zTZinNJp z0t5bt(TzlnJgcE=iMnCZefdQSLAp0}&u-h`$BRu!5>d+;$>o({>E8#p?XHU0J0E6l znp06aQ(Y;fDveWD!KRT%rV4?;50J;MtlGVgXlN>-qwxGHyfm>W9&Y*Ub?wJyK`o7J z_WC)ILGdG!HsE7mI|0WXzMh%~%wNi71yOFlva}a!*yq{sQd>X?i1ic-tTG2G|3aDJm! z9j;otlxU01nDyW0JH3O zIYmNR<5?Kw%gc!e^zWl=;N`(3@cI=_SZ>`wtgKqsqPbGhta)(aKjJ<;m)Pg?8kv3H z^DQitbJ*OJLITSPEF04~#xwfrz`fgQEYu$pNn7F5z`2k*K%ral~l`F8?>#=2;YynU{+j0c*q!7uRnIAGekN?6%Q}YFc_ODU8n?=J0hr?&+TAgB zZDTWmz*gPX(^R|^LRxrSpDSm->U9>` zxumvLtx?45jwEs;x47-C7n|hQNxVipf@C1}P<_5FEID=+Gc%rD`}vMX>8iJ=8*s+UHI>at zKufsog#;XY@<+>54Z`y3?Z(m$vLF(_fX<`(zRmm+cE*Yp9?5D+*CN@lrVz@fAiff$gNN;nqsc;1#MV>1gU{Y`f4OmQs79{!_R<#{JLE`EbfYz%3zGOKYTD4oY}*UTO`u1;1%{6&axM*84rP-lMZ zNzbml;f}-GzPCh*4w*{t3)MmhImsVgZCH68N56jB&NS_k4`ZtmQEximLzdj$8+1zYMxrg?s3AVp31z6BDfyErn}4RBV&2CJO2O;rAnHqC2S{^ zPEH3e<~aWV9D8cDvi+B!yj?B!%6oG?C}#M{CFF|=B4e`e>N z0}8P45lB2cW9g66Tz?YPw6kj#%_A-OOfv2BPfh$dcno_C9V2cVOt~$C`Rk$UZ4`4* zH9{)q85r-|Ro3COAc^D=gY);-39@>wqvP~c1;*aw_e`HpO)Xuv#ZAI8hmxh#B$>ht_s%ZEga1B5Za)|(*|vsA-vqDm-cmDWDRq&Z{tKH8eM8e<~AgBg$>%tw6zq^P1EX``2! z_3ztKVv?FhCMf+6p*q59>@961rm9NF0*7ReKe7FFEq5LWSWpl<6Qv}Sj==Ul#Oh2X zxOql#^7htOGd5G&{>iB~JCYBFf%Vk*cM)Ue7#Q^$NK}}gE3y2vPJ$P4iCm7~zLMaY z3UrS4vY;sW&(~SYR*xCU86&=zX=x;dxku&)`fF^4KuW5dpRSj+FctN}R5{2eL5(^% za7I5(8F~rijJ9*zP-<<}3<$#leKDeIeNh9Pp-n^sat+w~YkVmu4hnD-{I#W_xYI~{ zV63^o?cZDAuZl8ORrEgEV_Qm`Z49|>YI~xUsa9aX`}%5*-k)a8jZuDE9dQ=vx*frMth_8M0#r)IID2L^&t=F1I3D`-ejO~+F!ciA&$2hu3IrGXy2(@@ zRmQjYKn~a$_0~cq1JgR`h|&wiEgW&_tb+Hz)P+In2E7UDa0Y&wzMUa2wX4D-zHzUF zT#h|6@2MdejQi{EC(!);oR!7Z4DVX<=&E(@Iw{GXso}H05aN^KlK} z`Wyhm+-a|G$4sDbj6^^LjORa>$ZEi~+ii8?H%@W9X9TZqU!Jf_sx48G89S=C`w>NO zr)nzNQm_21Q@(Vqap{%P-y!%ivZj6e5w5nk^!|?RP03lf`h$=7>K5YZZ1(C=E3ld) z-AKq_e?4Vxx{oVC(!4g>xaP9YSxGskuc0xYQ_Isr?lv9^;>5hsyMjN%T`jvhek94ST~2k?M7HgLzTJeX@1$0DFKteD%M=CnOB^*S;Hf!r*AOq2HAk!ycOV zfCEwtM+D>0>%$jdMtl1GHG64Jp{1jV^w-=y0Pl}|ZV1HoAC`6Si2LeoRn#j_hx_Zr zQQY>_gAw#z{{EWvW5~~KSZanv93UUdjQi`*pmzFdM}#rzJw3I7hqrF{`RZ*$)IHXs zJx8ymJ8Qv$P6vH%WXb$E?cZ4VEz8#*Jwn=3cg1V%gQ*cyNiG7oCA$CyurUGZxz_r5 z8WsR@10alOfI?iPRoP7!2<4t0P6KC_PjTsi-#Uvm1oWi@%frMRl~1k@p~tq1v{6ek z%alG~NHS#S>V3a`ZQL?PQ!>b&R&Y7StQkQA1Bo5aYu*@ zeD$$o001?$5a$Cvo|?KlQ)E=UI4Mha7&VRsyo_%NP+AvfvK?06ibKJ+KcJuQ*(KC#U_o4zaRl z>8T&Yb?&18;~EkWUv)C=TSrwkC|$y5`MZAFi3B9LX(wa{-1)WR#NC)D1sL=i*%U*u z10&ZN_0>|VL=j+lU}6<;-N;O5Omw~hd_?Nw9-3AFfIKi)iou zpx}Gwu=M%sZ9eUqBn2u+KP>9K9~U{~&FlSiQi6(70~GuxzievEW3mpRCzWhjw<^`H zDr6ZRhd!D;4gQjs9O}pVtE#%*XM_@rap*ugEdtF{d@um-kV(>vK@gaQXj1Of&nTwt zp55`S)tjZKKoUh}^z3`*RgAVvl{{Y)tlrrj^-|PsTJ@;mB}Osm zqf$S$6F(IrFP`8XGubHEOZKqr5Sy+x$OK)Gw!d`lI<&NhW$L*!~>Jp-?(o)9eR|gm#`n{_o zwp{439FeIiN4I~jgWGl%+LpQsn}u#nA5k!||=0r2+)l0)Avx>&n(UK1z*U}X#H zSe4F+o+}HEaY{eJW@xdM!dH5m#FecTW3eOKmtp;N5&j|wOH@L@H(*HYe=nZ8g6H;s zqLSk+Rl zrC_%O&rrMvCR2})^vh1P$8SwBML|}S?9-y>iO|GF7 z$rAEXeO1Bzz}1jx6C}+PE5hxS1Y_4;h@HV`!w@}jsnOeNXYUO>tVzKNGv8M4Og_&W zmvuo)e5$U3f{~9Rk^*EPA3{3;pU+5lc&`7T56#^4P{$DXx4bjV;=ti z``l<-GY&yi_DIv_3W%k)*4I=eJuD3@kJ(jJmSgl9V2`GI)J%$&O2l)9Qe!KF`JURc zVA&gz*;^&{o|-5Wd6ikg0DgGZHQU;Op^}WqF3ysdJGJc`R7M%*BQmdJ|s&! zRDeis!}A1x$5u@nZE9%g>gsG#Gcy4x@cDt?u?HQ$JuUCrG8Aq~Pchx9Z8TFyYLZD# z2}V47{(010!MCsQaJcw1OFJlT1e1*W5%bm3m0LQ#HK(CM?oVJxA8%~{y6n4^YfVvW zo-h}%R?i`%2~T_`?5}lIbhkvOSgjj|jRHt`iP6Vw{(s?(8My2#3Ac%;VXml=fnXCn zvHlvc`g7CzOZ|M-{ntxR1c{QWvS5-Au8!`#mvpvGEVhb@NU0OIhmJ=BPEThYh%NW*x@a&YLPX#L5sVe+%lO(Q(@D3v$ zr|GRXU8Px7Ql)7HJW?M&C2Zr|=*`n;+^rJ0qrPEN%z{h-kIy;LD?Z@+#wDkoUQ?p+ za-Lz^>#8nRFmBazcG;Eoh*qi!h}tr83|Z&v+uvHQH5JblHL`|Eii()gOtX6NKTTU# zs%i=C`IQi3)0eUK)pvDispK+KMid_@WnRNWX^eR&B3IN}Dp#D&**2iH@g@R1oa=Jmkuk*qFt94)N? zp>)#7P)1yWy|L+?XCVc=?!!KSF0zvq5)=_HAbVrBv>JqoS!7P&kUM9-m)$qDuRKa} zL@1tS^f>f7ja9adOeRT~a$<8tqBQ;Xz!k{irN04OWOO?0n#Y5sm^F~{d3k!}e z0QS+>q7vcV554UhB+*GtZ@NM&S0tb~U)#CWZC_V;+m|6jP-W*A84xRBSReRlrt502 zs&~4Yh^XDjc`$O#?Sbw!rmopTRq%E9Y2Ipd@=GbnZ>9+J8gQ>v9GeSew|U)fR@q}( z0<1e92ou}iQ6{o(o16G{qQV2`esK(w^e4WHrII^cxvTcY-cl8d9IgxmAXCAmVoK%j5^9H0N}?QCjk{*2m$F#6^s$ z{{W7wXSVJMWQ^3@QCIQuM;*R@o`LQfYFiw?_{O}ktII_!Z`hIZ@7Uu=+h-}E{eow^ z?~SuXS|qyG%46g_p<9q2KbAE6)4r+nBGTgNLrGaR(Ft!3QH3Ywr1sCRZF42gDoc$d z%ULx?2;3x6u*v+6j%_`^5P^*y*}1Zj{58uk{McY>q=+~tHd58sdvEOnvTLg$mIcX z?c5LeYwe|dx>ii|v;06wGm_^Dxb+&&bj;;Fvz`}8?hmyk?rOtDNo!eX)+J+YPnAmjeKX8GNFEbv8Jt$ZnSPIojovE z+G?V~ao;2lPtUfNVvVBd7<-&>Q>?vcti95UWaZU|aP0|S(>{k;Q(QL;kr#%lp%i(C z7d^irqi3aYmPU#e@fCp#JCXVwHPTp~kr5?;DyYZd)?(%k6T@72NK3jdRIs!Y)J(+s zdlUNUHuJV*zf>BTZW1Rh{2Tgr9=g4xw_55WaP;U19;~Cjm993LHp){|sln`hH9|_^ z5oHXd`%p?)7K(Y}ZU7GJk3p?>DB*b76edrhQ>nL0d4^mVutCRt4w{Cc6f}c^G3-vJ z>)}9sP)egy3I#~KP!D_`T}Oht2~QS28SUzSeG;A=5C#)P78!DgyT_ZpQ-=)a2{{(6kEa`SfV0PpLpf#KZu z&V^qnyi&rw$>aHITy+X0I3w$zOEv}rpHEG1N!^Y|`1)#*2HIlrR7K@2%RPpDMzBbp zPsQo^>I@Yu1{?J4sgNHOu2|FvNJvh^_dc54ExfS-RQDc-zBR3_lVCCJ{{XzzDQi<4WD}G0BRbO0 z3os0%oo3WBs5uAo`Hf*LGmk|BwlzxcvfhgW`uchdcGt>~ayVR^`yFTzR45r<*#lW9 zkq%NZ$R6h!ig1ZTPNxmw_C5V{YS{_`fq~=elco47XC0Y8Bb^(!&R+=fV+5Y(*FfaP zBT~ljfXG7Q)MGl(Dyrsx4M6&K_ScI!9NqvAznZ` zcfj}2C@O_G1`<1Z;d7y$V)*y{wVX0CFjrzep1Pul6yZaEWKhAIKVNMfg8L-Vu+Oi) zeRPLO$ygL}LH0UgrHlj&Fg|$n(2$D4A#sVPj4~V?`e)Z#X(0+oeBhq?lN>ofd`yx3 zHJnkfa_t!-+3dUHK>_0s+Unpv>vJnJcOye4XLt|P8_;$h; z^nt4UfU!1nI)V(rdKQC1k@6d+?JzwJwsh*;kbli7Nj9m6|;F z_5d9|Wc59QkJn#WsCMorW(ur!eR2-`e=O$gqVclqqoR;^3Ia?rFPhzpN#omF#Q1avXfJfv2$ago+ca$jtZ zo`eGI+P4rD!FlS9H0@hYLu-m=RO8FSA<&OT$o16ymAb3$xO%9PG&sjIp8o*w(iY0O zS}Q8yr+D4vax$vD*yGUsHDyz5YR9TG&_Y#Ds4f2h9YPx16#*xN%-0ap2)sWK5!n2` zddB0pZPqFiRWwq{$>s?fWSvW-*%u3ao}#k0e+eTT^8LvJ<){$W*l1xUrfBLjj3;LA z`DtTsWZZ$2CgpXgtF}vayGtFt0`gQYIVxkeNj;9a{{W~v(z9$-&2x&TdWjJ-Axy9! z`ez!m`nhkbx>%|$mJ4MlYT?2*c}#pk_b27^2VAGrdG~JCr&=rIu~b!ffnKc__)fpd zpnH7=wLr^R42w1mZSe!;--|ylFScsIOThOnEiFvWMDO7cQ%FXYsIRL^G>%2 zS)*n?Gntw*j2^(KBzM8|ImSC`+p~3*t_7?Xosq{{VE)6dQKl%_c$dA?4d1#kEfjuQDyS!o2!-)LCvq zn`_=HTBe3(B53(C85kUn?dzNpeLt>(^?u*D_g3Me+UBp|c7+^@lR<46W+Nn#oc1RR z>DXu2-GgIvjxE1#t){JpqMou~tZH3+K@m74sXf3WBR^eqHpS_5ro&5kxZ7$HW+mJi z0LU2$>Fih3duR9ONh2ET3tJ<13z>G$N2u=GhK4P}a*~pfCseo4V2D+S11u99y+>p7 z^u~4Ac3zfKSSb>k!A~fV#v>d`f`j|Oj@b3|(YsGfHvP7yONGvqLa)W+0m}@JL!1H# zKHuY}$uIPjPAH)eg2W_aiOFN=Ib$95j!BEpm1t~xdF4j5Tx;lU>ujZf%~4LF3rgcB z>c<_lLXJ)9SHwY1BKB;9gYwD2*0eHRVpyf+PV!}n@y0NJJrc86?Ua)lYTjuYM*J@; zaL3D!{4|4<)`UusGLIU*rDSrWAxCal_WEa9r*@IT2pL8_yNw=d3UL}VP{+i69wd5e z$AT!=l$cz5Xe}PpwqbbO@ryb6>U1Gj$>H%QumI{sMH0+Gid+xRSyNipKJ4U-eD!vy z0#Mq;t67vmlD?P&TJDrHR3fhy^vV46Z^LAN3N=;$XD8QM>e6z#VaFP!bdo3A(lIhh z2^yOfmY$lFWCaJg`slZXJkqz0oK$}?_Zr?Q7O-%SBoEtGN`vBntpf&DqIXsY*Vj5N zNkee*f0a4r-ePh4eKjg8Jdn6z!-ze`bv`T!d@+z0zNo7hLvG#;98Og5gbkvXA#Md zMm~q~I)PPvvQt9T^*0#Isra~hsQkWqsrNTgtyHZd(APzX4mtS1l27^*fNIKl4O)+!5Ujz>xdUM29{$Q)%4cbO~T5w#W+e7c&;QTE;6SdEc@&8N;c!)9s6kh)ZM$IZC#+N+EHh##ca3$%?^dQ;dR!zkcuKfe zNhNOav2%qCd*lK2?CXxek8`@4wEi6;p#m6}i9aGw)9J4%IFm^89E-USW}&;|3ZLn3 zSEb%`w@MAEbAsbnMJ#mH3p_FyB4d(3e2koDx8$ zk+#;~f|2KP^GXI;+vZ8{q7~AjHXj^)HI2?`b+Ks-A++RyaI{4kEMp+)a<+ypMR>5z ztZRieJgefQsp;vRDqQ1LEyS)4iKQvxlBAYIl}f0{`shV&-I`WD967=D#+sHuxj7ou zC3uXVO*yY2B!rVuXQ+!R@sJ0x8W&YV#J40GuxhH|tU@qyJ7++vt&uq9vSYqZj6DwD zM2j^i6NuyQpImm=&{4X`KZe5x<))UkClCP0&WT$#`J9j8_Vv{lA`K~Kj@V@!gk8%dnFNf>$8g{nrc^Q>OF;x7t%}uo6PA3WuGx_Nbb*Ht3A=|dtYY@Z#V)3WF5G_Xgfz_aV!aV^)R+v?o)oVN8$vC#r%Xq2#3{`N2q zKTRl^-Xw_>vKB+z%A9~86Z7;M=PmDbn*DvMtE{!r zP}KPHc(GGJk>T^^Rw@TF2tH%$uU)0oI(HW0y+ZTPsM-ou5gdAJU{9X6a09UiI?P5p zf;~03GO|((g=p}A2ex(hgm{j_QiN(V{{U{iF|Iu`{WL+SH`gj4Pm=l{U2Is%KAxK1 zWAq$-`|E5}?CbzvQ>YlIy=jg%&-zE)YcUxl06jEDDWBAC~>_SJ@?1X9ISLF0wV9kH(% zK5)LC`SsRn8#xQhKVJU;p0;r1_zPfTN4E(@>p(zzj^4-Vt;q&*J$*6XI^P^&PCF6w zI^P^wJ%IJps^Jd)>r8a*-#z>4TyT3T|R(yM+Uf%F;&AuqKO8a_l4 zbCdgNhR1G!Eve5TgWy{5s`(c_(OFeUgUaRb#a}eR5f%N@{89O5?;rO@Xxjof{0uJuKlMB7UC!A_1P@PNEG9PWfse1#UQN0pSPF3wlpe>_>XPa{ z<-1o`s>?KyqPHkoHtc?y$qa9m*)+9HDSe` zHM)6WkaLfhzo^g)g&>wwQ4m}=;yKlydbiSDK~w-r2bdpyB39dyKNH)-B~O1*uEb8< z0>V$CQLVSKWtDQc&V$JS@8$gT+|l@qMshKQ148R)Og+dxZE9)~Ql!+_Z0FO|>OY5o zMhVB$M=B}&#j*No43Kfo2Xm&55{rve5f*(^{dJg#@%%qsZ}7$o74P#p%qK6~*XN=@ zU)@IVNniUl_lJ^3az1CCt4}EyBp5u?Ehy(@YMeu${2Riq`7$AUuF{y$fgWDL_ z-WPoNyJ(V2?LzPg^izSXL^$o9`kmpo8~}c~_SOax1~Gtr^>nMKqj*H;x30192p?aT zrHI&{L9e_#_CBC$=#^bcQ9LCB%(*z%ffc)89O_s_KgxT0<6jume=aaSTD_{eg+nn8 z?dh*PFPX?Xm*E`t8T_^JiyexcUfRN)MHIxNBhy~2WD(2|0o0xaL2MkKr+s_ioPxmp zb$dda*0u1_!$!FuQK>Z#PdZ27({N?TX65Vh`fE`|1JSZ|u@K~U^gp(%Vu9AMjurRM z*E-qY0p%UQ`HX9F#<=zGt)Vh~G27o#sb2M<{!B_rmRt z{l}ru_fv2yNJQ*@W45yq1|$MN^&PdbVm_ZQO>T}NP7i+l^(zR0wWvltMtgeeHHi1X zI+Q7~l16@-*djc#59y#P!ir)z`fE7hKg=llvY&wyF z`|8xT^c^I@24frGsZ1OX&sFuJ^-1uJNK?TI0TO2iKlW<%=`T_#DnPb{S7@*>ACV*H zgRXY2NuyzOYkrm(Wp>#YwvV%goq-ao%3J2-Hg%(Q{h99Y(wg0}l4V9rPQ>T(*GTPa z?V_g)B8epJoa(@!Ykg7!#TXx82E4qUGpU94SEYx+w6ivs=Cy9w-u9Z0g1cHIg=0K% zQV3W4kH4?Br6$r-PvcZsY2BD-F|+plGuvOI7k!JjFR+;FEz!!P`;6%(?a&RUTMI&v zJOKJMY*mNrtx^8~5U`IsXr({+b?o;|g}^lqwyMq$LdZw*#o?T`!sCnB8@7bH7yt6l3z1^r$TQ%B-@s1Rz!E;qx{}*qyP~??!J7nt!?qR z9zX$Le}T^*na2x_>FMtoN&M<0_9NF!^odbV4~aB#lA{FUApY95Zua{{ER6&frSQ|~ z*nYUs8i}YNjiONqU_S$P*Fn0TsP|R}X?kSkAsxW6a#WiQ=vRsL(COQIyP} zVZW3Ctx??IhXQ69_aye#iktl}h)S~_{!zwMqR>ad ztL^S4AA}r$ez_W^B)-(EiI%jf`43Gq?VZgHREZVGgAYX{d+RjXQ1N6facW%CK&#T- z)r)N$QOxi@K<=ZyG}E_t-Gg|vlu$-#Cvo`9eTn_BbyK7k*{D?f0+Lr8(Bm4PwasM( zQt+*!6p@ZuWy3GfpMTF>X>@V9q=A*#hg~aN8b~2IZvCrUX{Va5Iu@ux3j&RS`Ra+g z-76uS%TsERV3o@9k#ac?Y@c0Sbv;O1txw$5iyRaYkK#yJlH=)|YAycx(?_(Wo>hiy zdC(X9E%VQ=i%R#y<$EvWrlpLY+{e)Ps>5vA>^EA;Y9@gLI(fVKf9}&I7Rl*t!Ja#< zwvJkq2L%QOGp)V_no55P-%(2n$T)|Mvw(lDlP)`6dksTX)YViyE^;P}7ykgNz4fm8 zr1^+hE2IUqI3{b}$LY(%;nLcXSB^6r&OJV0l0SVa&(mFjWsz&EZPbz>^Q;cM*qnP4 zrMs^4t*}+8rMN{^OCa+2-a*Ucdt>_O&fMJdU89CurN)#rum1p(amWAi|1jDAPh z>ScY(-*j4pq={*rTYxf;Ba!=PL;`}?O+|fCMJ?y>Q$7CxA)eZGZf}?*f>`e{MmXrcOQeCgZr0dq0Oy9V~K4xmM3$ez_VSQ*qkT#T{)t=`x}7Bx&3q zsP#IPRQrDQO1}y|8JGc(qaglTRkrMe-0j1ae4Dc89o=n}@hs4v!Xi<}A5-a#GFGLU zm|np$jG{{XzwzTmu9(NRd0CPk53j|M^pK8Mii+oIa_HkD!VDuuh?w;+Fg zVRqRN-ssG8h}b`wurd2+TQ~71^v8w|F4#l5PiB=HDrG;9cUZ}{q-+84_;x>**qrzObk zoPK&SQ@X1*^b%e+tWZ`^%D~h{j5(*x{e8Y#%QSn<0ZUX9blYbkPTw@t;43xP|8b!>2~hsqs-@>A)7^U`JdvK6NB5~#bc zqNu^npA$%GOs@sjqFrdMl(h>bRdkXOInL_dlTZ&@ICC zmmdyT)~S{fd3X2yb*9rb;&)ObksN*;|V1F$%S**0w@x;wg5S%dilkKHBz-2HC zNtFFQSd_wJkz^+z{PnsGqkX5Hp=4Ey`F%kex7TkhswIG6z6%U@CsNYL1e_-awg|}g z)?+;_Vh2*DCbRAeMkB*#jC{wog@bapREeVG&&wk#$dAic^tJ%2-2hDFkTIb3dv@F7 ztjkWJqduTy9WSiXi=g3Za}@>A=dT@{XwNtCyT-&&H&{x67G zm%e!X^^~|RO=(c+tC~rVj|)V7o9C(PRY5C=M-ch%liynE?RC5gMo90dcDrMV8cL-8 zDz|3k?e)+SDK(&`3fg)xZfw=G3L|W?{Jwgi?iNbg-P9V6=RA-($&`{wA1!nYbWqpP zy)!T&#}agjQL?T!o57ljh)qrgLB?_VYNC)b@0D+1a$TaaQbST6qb(|&MyDl8{IuB} zv!{+ z`;qhaI#}H{2<}lwu?~yh}^CS`ll+6+dVITz_ZS|$R4=%&uv&=@@Z;< z0Tr}EOa?$zP%?F7?wV_D6cScN1eFr{BvB6eKc1?>okpvxX`$Oc5UU|EMI}IsE05+N z_x!b&s%7(9(ije~@}-BFyA-H@DP>z{o`%T2q=Hn5Yz=l#c1c(qkE zHGG6dgpBeX@$LXRwtmX{o|*5mQdQHWvP@V+{rp7!=>tBQ&Q3qaT6%?M+cU->uB4xY zEy<=a<#C?<#;I%FmV0e{@3rdQqK}Ahp}gud^7Zx88(M~KI90U9?d$ZyDhrLaou;d# z?8Fo&2bb3)BU--lqp6%hQ$VQvae#5EZ=xN0s=jPGOAhDUF#YQf@XFjGkaLV5De(XR zoObp0)wyJV?g{CPjHpxAR9vfL-#(bv5>^%x9J*1E;0Q#Z+9`IA#VTM%!2!GEeKo88 zPiV0xB2_btf$yU`j-r;1IH_qWB@C;FaD2a}m2Nkij67wesyH58k=UQF*GUdEnpzYa zw!*YDj?z{sG56x#jy_{bH{H8LR|_Z+FJM&X_tcHif4jVm$%i02mG#Hzq}z@1zDU+4 zld_!QatZwPqA>1BN_BP!iQCk0qcfbx>~oDRT&Q8oECW1GZu-ii`X$&`emF0r?*K zV0EMrmnx~*SQ4OPzMwQ;kjM4YO+~x-Sw5d%T?DF%G|GYBL{tGl1Axz`=5??>exQwD zWZC_s9qLD2fJt2Ss1c82FMa)=^wk5Ump7M{|z;y7;6-V~EeD zwwg#)d*hROchzAD3&x%RzA{JV9;>J_U14T1l*T*ia?qX}P~(vG9rX^P&mR!}H=K7P z9nPq$0`RxSu~fyB11vF&`{zUIJ{|`1##=qLtst5=EzOsYbDw{vv7R|x7L`s1zI8cQ zwQN5QQ;;A5+b3EQNSVSab|Ql(DG)0KZvB@d(KxmLX5KrlFga z8k`_F&!cO79o{y|d55p5^8Q*4xU^uSbk|Z_{GbKM`D6O%gmrZ5{6(rlxXA^Ebh2tB zn;0RLep=LO&^B5;40k@CriQH;Df*V}Mp1Hd52qh(Fi}^)a21IpX8>xnqPaqNq$oLK z-$tqK71ZaL0oRXi*v5vvRob#(sfn;M%1#C`qm&{p$2`7=Row;dSs_^JVP%uskEidW zG&S{8fx7!+5;y97$JLttNRi3>(8JJ*q^~Mg7qN_Doz#w}Q z+eIi-!@*J)KO@}fWGlZ!$4x~AOn^jHRyHJd^%{wCqFQp3Bml8)&5Ywfr?0tK=lH5z zyal|-{lGdoQPj(9*0E1pKs-={FP$J19X%H0(A>qwe*J{ztGW7|591PmzJw29Q( z>YA|~HM&Ueg#>OUS8LkSNA;>D$v= zY}*p0ljG-vq5+=c1nAgyg+vnNqorGZoLpd%ZzPIA&M~g7w9wEs5-dovw``C{Z?33o z4Wb%(#~6%EJBA(gZ|v)YF@K%pNC0GwW|ZzLL^w=WYfUA}j#??A1xgghA`TDbs{THk zP+Q?y5(iMScfbU3)r~E|3l)w6RE&lm`r8vM$~;){-_VZQPG5We zOwo_RsyQ7{om=Q^U1Yt`R`0f++ibKWLq$(d-JOeuXJ%ZJ$wGiV22ZKRwP~ddcbkQp zc!?NanR})Z6XKu&0dk@|cLV43(Y?FTz4g0j=$^?)ZV}fGOB@i(JgPhA%81$YJ(QE% z+h3sff3ufJCfZU_PqFOPQAPxm?9~%2&Jj=Iss8{vfd2rZ0PWlzSe-Go+AI`w?MYPB zG~zK7Z7&HOqU1_M@_~j_EZ}5v@7(Ka{6qo$FqIyX{o=SoW&MhJpB3`WU3|009SuTD zSIWHb0x0o;BqZ}rK#t5*jD0bqlv{Il^)|<8ySC_Ul}RCSEiEmv+J;z_{4|**iF}S# zc;U%DnDrU$UbXdhx2BtBd&RSB9mpb$ylCmFhc)fxB~)??*yMrO4RIG%KGi)!p1y6f zd84F;f;5g9ZJ{`DJbb|MVvwUT%#ci(s zH4Q`{(V1yc1aBE|QxLb6G02j@vCdCy>$I)=^3QjrhLX{Dfo68fGXM*=JNoCpwzEwW z*~m@|0a@31X(oY8@v{(_QIM;oncU0|Zx z5Tub@8hY zzFg)-Ml#Mbj0QcFW4^7Py>&7jr(vkCw!=MLOw82CSG;N%9P;)*LF?b;t}VQ74aK;; zX=={|nDzwVC?139`D>%3)9>>Xi6o;z7Pwq3bdWV2G4X*N+C~{4wwIFQ6mqmpCnd?o z4{Znr8gDC4;*dCyJ+-{Gmj1;djdUjMzDRqLp5DJu7;|Ug+dPz-SEKY1fSPh8pgLN zCFF#kHDbvdd4U7ad+B!NSV3cq6Q_HI&yLYF!nUQG5;QR^Ymnr7oO%r}ZYyo7G!j8_ zrfiG^Op;H_)3&w530$p611VfAwKyj}zs!39uNUEBsS!&%Dv~?;YYE+A1S5?7bS~i| zzw-h|zMcZdR-EGacoUOWsZ4yq(x&6N(}@^S)DV5h_s~h^nUDtMjQsR2Q6VQMzwf3s zw4-AH*;79HxW>g+p_qTA-%;voXR05@V18H{)}x<%AKON@&eFVY+tmi%u~D^6!sk;R zB{U(GdCKe+Mp%F{NbXLoouHG#YemojF9ZYme_dpdw1n|o<6WD!Kk#Gqwyk2R-8UN* zw~cBfv@z7QlgUmPc#f_Y!v~Idf_tA_Yp-lS_&fg0mMR(OPRy#j$x@MKdxg@V$q`Z9 zp^1DyeHd|yo#0p0Rj_6I>Xhf2DiuogLYuED=q;F%H9da5T_h+qnj5CWlyKZKn8z}M}r z%h@|ypnFv8t)E0`EK$t$OHB20OksEK{9Zy>0!DC2?oKhCbBEhHO{3Kvfm0=`ggdUw zSb~l?&lIbra6CnrumQN>k%CAd4?=aHPvWndVA9_yOqWF1nRl9BmytsM0Nvx;(_1io zGwY)FiW-}BWR$hk#u-`bbt^pLhNuFS5`{hNLx%6`tnD(X0cBiw(K?|CMG92sN;b40ct8TlkbZiXPb63X5O6RtsI_GS9{Kre zMI$(GE(;%RS*2joC^-|JIPI;3oD!HP8o^{-aSS;Q+VC(|^%_~So*jkbMac4hU#7J* zAQs{K#%H9oEng1QLZ;Qp*%!@kUa*H zZ}pK}5vin(5~tV1!O>m8QAtBe?$t;zI}-TLsr#++12eMJMzVJ*S+Y;*^485XE_uSq zJnf0OM6S0Tr$tXQ+^&@B%8Z0L>_$GC;!WvKx5nqXRM=v1L}tt?#4tGnk;wl5OFFjq zL()xES1oPwIT%U+NYAcMe2)5AuGsebltQACaJldD*SGM!7}Emcd0s!nHO6B=PztK9 zc^^@ns6`;(YF)PVUvH0vJAkB|(wuHuMq+6etMY%MCS*&)(H=|&*iC*#><8o)gMJNrqbKx zZ~#>x`VutBVzPWiNpZTY zRb^eBIqA)kqR9O{{S5pyKW&*AePloNzZgWyZiUooSZ%GqPp<8u>eB2DJ$&uYI8)YxK8PxZCBkw z+yb#)nh3`kdu2bafblgr!>nIAo6WIG+W ztuC0owB8YYw_hEqo;Ni`)mI!xY#kY^-RoMck%r`pki_c0vRkVjS3uGQ{9bQw$Z4X8 zBoX{R6gVG*BjaTBTzyzMcMFnvpUQ z1nkGnkPmF~8iz$3ans9I=%WM5q;}4j){eS*Gh&pekny&?nqxvCGP4rt)~@Ksp#Fv87EyRF@?>Wxk@6h!o%}Ci6bLJ zZl(p1lNm$Z+t(*kXSP+S4HCbvZ0Z$FvUeDq6~HI;*7g7vGwPS7Xi`O3A>h94@2D3F zH+(YkZ2IV}bu&XJhR8z$liS--KTQ#6e7HZpwfG2&-3k1(#)O9z z6Tlcg`1j7T@VEkaoU#4&D8`34><_kkYZDV-`giOzqYcVKo>X59_v7ew>c&r$_rdRt zOYrfMtLyKtxRu8d@9Cy&w7u#fi@5Ec`ozM(;~!65N#aQu7zf{5W2SizkvoB+3_;YT z07IW|`}OC;pHRQoM1>Qc-k&{9p|m|zfl*FR$Y)kXa-e?f1Q95uBbQ#g?dOF=8s%_?(HNFB0qpx)la5#4zS3{f)VaX*$d@4-m< z02BIZ#{SMjRZ7)hqDYJ9A5WgN(b-kw9wgAY&R6@ue6gzPu}!X3^H9pC1Tg(I^HO62 z9*0&;yLKj*#iys{t)4&+Lyug0X?mj3iAeD9bNOo9BOk)5b9qYUn6T_I-{r58nYm{l zmX1BLWKsyg_ST<+BN-X@)sn5Glr?G3^9=q+ThbFarnW>8yn@3I`H#_0aAC5NSh&F$54jhPJ8&Zdmmi znqh1bS0mS7d_EV`C+ndn(KV||ulI*-ZB<-xBl6ba5euFqXXmWMOb5?ZeyD=f6aWbC z-@XR6B9J)x6Rg%e0to!IlA$DIcg{wrs8(^t3W7oP_xIL96d1#QO?U~)gO6Qg2NT%f zetN31sb(Qi0mglM>(Nd?BxAR>vO~mR9cCPk;2aV1)lsBBC8xL;1F+WmX(`a=NcoT3 z8pn?;f<3jQt`1f6^6#idXn)e!wgQRJY`vy&9y;C8l^08sQzvv8PlbbooV6&&;#4PbeC$af;hN%?I6x` z%Q|4Bxd6Oks9ybsPP}x@bBaadI11&3dz^rEu6wi|86msq1b-bl^d(QY)>6?; z8geMu8p;?ut=o-Z55Mjj*x+WRg~=Jm5Ks7Olid5Ocu!L_(^JO{6kzvqd7sI3YFuuU z$04VIkz2oieO3KIeaBHpI>ko>fT8f@D}oNX`UZx$0s`Y}$$M-PsV(EaD+@@m*6~Fo zc|io9$m*}WZ&Z00$|_mo?c#FOt>+f?qLxVN<)mgLl?u6UUrzqIQLd-nHBqm`QOHAj z{{ReY+(8pVMN;rOsa)rqwI;iHv0NmPkXO|9$k3y@Dr7kEa1Wpd0F6PZwpCs^$T9iqRCL3iip!7J8P=L+RIBxRRzg z+uHzS=_cu26;m1D=PRKeW0S6gaF0cXS;!U&-21C|NY77gsHlZx^*%?0!QcTq4VyGghBZ=P|TLk;&tC3AA#>E5%d+olO!8mJiCI95<~7TvygHOjBS zr;rlO*#;CJrju4e7(B7^QhQ`*&A#;&6v;I`Dx-jSk}?O^Q=}_}I*vS&o@%app4kzr zHYS>%9GXav`Ml^NZ`;gL3V(!}GJAkV9P8R1pk65BcZ##jz=8*%`Ve&*ZQ|7=O;bdM zWzG&g2h-)D5c-79q5LH^S-O>5N``vdLe|EF1L77|AE-U`VeLKNZQQh}Q%&MgKQH3M zUnOvTf%eraPrA`mqEZD1*C&>B7Lxl{O;~O*&d5~u1KfOw(x0Xe98zN^b5E+jx32b% z86u^%%pK7`irj*n{QK!%hpO?@&mA>QM9O&t^NbOymbY=wS1FcIc@d64_x*G(qPkg^ z%;dQAKKT0TnWboM)X!*h&h8ce0D9h$)To$G4p+A>UjG1=mu1{m>79&((9_6=F{n;E%Eh^wgoD~|=Z?3dYXp)k)*zip%m0Ey*2iNn`hT5>3h3W|> zov4+R8x@YU9p3^IjDT<7VgD^14VSsYWfL~%+}6YxQXKRgXcrj~%p-wf(X zdU^Zf^7ha;kWC|Kz81JTc99gSr*kVP0|Xp?ddA~rxl&XIYK4(T2~K^6j{g8?>ilG< ziX~)UCR4cmai}}CXs9C-y)>of^kBIFd+8o)qO>Qs}6*R1&kM|A-%RT#Q%oTNXcF5zYsOA*_W&_mgB+*lW3uF@8RJ*nQ zWRJt7hn`y)K7&g)8q1AC<~ZIpQ{TUBNK3O%FNYj?3VVHYQWS<#75K%UUSHv$_YwQ~ zN;O8JXk|nJ7=A8CIn)|@8R^J$JcAsZY2NEa5M@{u(^%Bg zPKbjYkH4m*EKAJ45J2_NsA>*!W*?CnDM=`P-23wRdh4Fzx(ygwB&T@~`Ld(upHAA0 z)`^RA2iLX_Z81R_9I;$?@7r6v6mx_g=LcEb;tFtT2Tg5g(~M+-J#chNlG!}#hRM!B z(V9C+Va-#vh()*Ww;E|y&*39PjO@;E2m?zm^-c^bz1&8NY0%ACSyN7^hnQ&})cmok z;tsdgR98n^@%H<5z9-=En2SitJ;4XK{X1#$>9(TWbG0_&x5&a4{0-en9{&KAq*HYF zX;4H8?V2a_VDC(Hh$zG|fl0t&Jy*4Gb}s_gKIu`e?bZq-&Hwzb@LdD{IOX20HD< zQ`CJfiRzjt;zfs-EMwIEy1cq~)60yod;|fYjzSBv`APcz+KER&6mRB>-`5(uI!St> zp)E~vNc=a)2_N}>o%NqnsCjD9rh&Vtq&w$FZr?bzo%w7t0|+x5!P`D79>^LFB==dN>gF8o1nFf@Cm zbM32ZZd>z54IRJ1XC0oSvJbCplly4x%c8wbp@|K>Etlk+Wtt!0_&-7z_a9O6^wq&; zTP?Msh8pP@j^<1bApZc_r^`jc2ZzbSx1nD{pnj>%I0)m@w2YO&yT7DedXiaaXu5jO z@dSZXB#**CKdH~uV_fySx>wYlm2~*q&fTr0S2^*-d59D1f-*m@zhbGb)KwF`Gfx9>&eR%*gpKR->ZMXfEaDna?E3`8~8+dG~jA!4_eDz1){?61?*P`=S zoQFA%MDmROowQjj+mB`5DXVSN?cf+v0>}=0pkt8yIrh)4hJKvR+{2Y3-x#L_a!<4p zzBZNW;Eo&y{69Sw3d!%MwUFm+~-kI3q+^N=(s2II?&MYXr&O^Mj)Z5NI;cP zGWzx!`KhUlI1HyhFKr+V`|(itQpQZa%&-1A)M&RgToQ*yKTMxZI;|#vI8HTm6zQI2 zMsymbDI;u4jC*J!?s;dCJVxc%gZb!n+U#b)FZA`%gK2MXqB~VfO*ACHftT0U*GiX4 zC_rXI-{tbw$gb@KMN!TOIT_H(iq@J!SJ007V8T@>azIdeDxx+25`hkJLez`4y&gMjJ=LKjZz>Gd8uMgJT9ld zVe-^^nB+mpPbcl$+w|1&M+&<%2|};cfi2ZCGh2thX7~O>#HYIwwOeMIF?|pRDMMNTX_{gRT4msnu=b)Q%2-ZO)M6+aPCswOdHEpsy z%8A>uk?WJmt>e7V8Ss-5u#EvK8)GdOdAq=A9-`RVrgwySDbiXzdT zUSS)5T`JGCZ#8udO)~%wb!PzT*^H_xu2DT~#K9tz$Oj|7uI`i3$t|X61Bn#~96`a( zgj#xQK^<&y-05mLPCpE4MFA<@%HMLZsCZ04hs`v2Q)M*awz3(*}hQ8B9 zdH7mo%t-9Kve*Ro_U)eEO=khmDZmDcR_z_S*%eoXPLKjukpSckGSX8T2g=iN06QN*fM>YJnED@0G~4>CwqP<+S);0`pCMP`hC}>{ z_w@ZVE@|wV2=1+F8AWU+Wq_#ULh|$=dyl53EL;aB#(qOdJ9=B)&ZTPQo5Dligk6_E zmYdLuXdR_;#X%&V=Sm`z+Ur}x0t#RcrghI9N&81#_D52vc1=dmr+YPQq8P6xV=9V( z3p9QT;g6JH5&YiAPdEOtY``Ae_h%DH*^wzsjmPvj1M~g0NN;`N(>A<8L}RYG+@%l7 z7l5?1(Gm!d2*L1%N@3R+_tWBz`3X;d#dLaB+jkz{`@)uxNNXY^l7YwqF^~xUhe?(V zuT2GPwAOoM3rR%33L}~2XKZAiK;b?8KyOpuT<^a=(0lu0+hC})Sn59N6!@A-rb(ns zW6@tc(;v(|{c)#1vzK2iy-VD6*7|83DmcMaFOSALc%1XhaW67o01n|o{=TMkvNeVE zg&N@VUDrtpG?K#f_e%{j4h|YHp~eU~J%_G7nb+rs+Pd@8TBoGi6wu#eyW1sU@f8un z;h08MSOirqoO}1kIoIeXQ8yhf-rChQ)h{yB#~ATiECNBmz+%b=uc;spnAb8_P<@=b zn?YSwF2}Xi)(DF=Op}=9k%=HGv@&w$Mh;nt?mcxht}S-@G@p(a=g8qtBDfsYSYsm@ z16Maoy1v_LdaAz_V5oX^rlkiiA{ogl8?xuNetHwueTTI6&i1IcZ5p^?p%6zXr1H|XPKAQ9ejG2K^!s*1`wOvP^J8jO|m2%fWX;Nup#&h}l zfsFRg_0`oy(QT2mEL68>FBQpE4L^kO#QZ|PB61X*5!`|LYlZf`(z4ZG6EGfn(CMn-r<_#kJuxgSkp)IjK(Hk>55f>r%s z-4wRnwMNlXBxa@sk|`JhCm0>u9l`n@`g_|8O;u&4xEe@d@kcN_60CiGUGtq%y+Y~^ z*V)@rMy|B1Uk>X$YLbyJJbooVJZG@=^!L(FMLyHt+ldCyx>cpNx>&-(@x)t`er=FR z`r}-)r;*GuG+{v_8sNfmS71R`{CML@6o(n@kKaTJw{Lw=y+}>Pwyf6u-Dkg4(Nx0& zM^oYPD=tU_%6y~0eEVekYSZb>;{9{ml+C(+9d1DfiXxOgPrsl8_SRA{YgSV?0K+*t z8(T*5lau8dEO17&RHTfYQyu$iinND&M^3;VBk85|sFcW7I3y=Ogb!UugQR4(2=hp*FDK8}h!{R+V zjZLNC=txj|;|Ei6t+tjcD&n-onuL~5a@Z&O4O2U(s2xU@<5eY!hL)P$4pk_okLY(^J-~2TS zvvxfgmIRerCSjP@$__nA14Ur5Z#~(4i*9V24Nc1BSIEN!G6Ka%s}?v4qui1J_d3zN zzRo>z*wm3-H*UnkRb zZ#G}h1CH8_L3w~NYUP=^3yNlCe?bRyG=5djtW*K#yv+I2JAbMMlq^lN{2_}?nC=~olZNJ=@NemvQdG@ zD#Uj88gm+d3e4eWDrIG=twf0&vCkw~G9n)1^7;On2JIorq5RG?$G0o@oKU^)&1tQw zrh&XSs7f}HBy;?w!jKQXGo5r7LO#g*%dc`nxv%!t+ZIXDf>eAkGF3V^94uVHPRiLV z0qhPAbE=b56aczM3JT+bSqKdlxl%-sjJMC*Q6-J?20M>Uew6Ni{2TjTj>S*7=hr;x(hsmNSUQ8$8jYL1WP@r^+o^scy5PJk zc)ye^D6zO4&mwZn1{H|qq{rgAS1`Ccg!gDQ0l~X@T)>aSf^q4b>#n}We`SuPZ>`s~ z`j>pL3O=9DG}D^NYJ4f@@Pl}55-SN582~FMVdXvjGkA~u8NC$Sb+-Ah8{2l?4J7F` zO*vY4;HpI+n2!|XfrucG#NhVt-(4Mi-*?JNc&+wZd^Y+zXx1p8g$EQt*a6$n06S}$ zt?`bldU|gBll~V&OX2+^x_(CiT5oW-(Z?JzRg$ovUQA09f$n`t{PZIK0Dnr0Q;T(a z#7;pYu{x)Q^1DV%)6C{f<&c~M`)C#a0D4VSfDp+b?gFvEKbE)+iq}QcVNTzhhOkjQ z2`6P3Abb6F&O6TGJgFo^vvSBM`=IL0y5DE0iH%f+`+DlTye%|^o=gS7&Us+IC}+k`9D59nCNMsPWPNqrG*=Ff?JJEv^QdspOGuJu z!jjmPa>{X%ils>ffFtYm)fZ#?K6NkcGr0F&`RHd#VzzBWxX9G-Nm&&wJvx(-3N)|g zV7_KlB~+3IJfmKc4-jZ=NH&4ou2h;wAO1X_MMScLkVkKAO|o7tyLRnIezMldM_+H9 zC#Ie!!$#_I2s*JkrS@v-=SJ+*n}>W@XyBo%m7(z|E)dmt4l#i*hEEW306v-Rkb7#a zV}t3A`1RL9IbxljQ(<$4wovuwQ(zQy->vbt8+d5W%)q*{Iqg@8=^1M8x6aJ6I}E5H;#p>J`nO50s-p7(o-i)vS` zUC!j+3Gj7(Nck%Q@?>X<_5l2e$Io4JYOIp3iYAgT0!{!jXCNGR!S@>DPZOcTmrfUn zR4VIaTnNYne_bhEU|>j5+uIs@s!`~1_0T%n0_5^h+-X6`+!6%z60s*bhV&9C?g1Kf zskRacP&<7zGI|zPCmp@?%SkOthT77%WhdvU31N0VRm*7Cf~a`~$9)yH{5(>5d$S)y z?fGh2fq^To-3&;YJQ3f&eH5a#B{~4HV@(fFPUo3X$m>L?ioQ{*w0l%YSBi)1IQr|y zl1T{jb{{Q!=O>Ey9=e-HMdC2XA3Z{Alv`;4xcNwYllf{qQ@fy&IS4DFn}VIt9}A8& zuPwo;At@LI{mz9_l~;M-33eclaCNGma|qphS#pE-&>D&6tL4c_&$cxcsU1mdVCpH9 z`%AncLPkzA+aE0ylKTZjK%){*u12dQ@s$Y4@2%0)+>rPPUnjWH02D7ECd-}HnMp>I zzB7TU>vZp1MYahfsJqj|d*L2H8$O-8=x*fPw|h*bE8++w?HhxTPPxCUn=a+J{x;!F zb5l^w&Lo{r6~M?`k9_;V7BfF0{CqyOk;>AIns?8bRepc@)^|S z4W2<+Sa<9-qhN5Qn7hqM!g`dfbXRFXZO4dso~lMc_QsbgD5QnF%6)!Xw~xcsQwAyzd@|$wG_!iM z)APy#19$Y)WV^6agGk{c#DFiD4CnL4rpHQ-2XUW3bt0yO!5}H=pKW~(Q_y?qq=Kwt zg`uNp{W1CLS$4+)0Uo-V!RikY*yFwiqb(fLR0!dXr6bfJ&%T6}Zg*u3l(*E8ofO;q za^blyG1{$>ps1BeQ7dr`kCD}}v$|zRdZ&e^vV|!aJ|JRpe!j<7PTJ|slG9Bay}mCW zk9Nj!`Fyp@)p(?E`C2ly>GTp!lft4cJps72B$8gM%{@;NV@R-6A8tgBCbyhaCzF|cn>f2O+HzimZVPSm18s>_V2!5^-cs`_>jS>>qa06aslEPZpVPGiVEpaNl4N5;vGgv{Iniz ziYsd5YN%G2`!Wy|pUYhaYT9{N%tRz8+4IPt^7i!q039~%>!PfR@h1k)t~&$i>!NdX z!nI;oq>w*hUn{5c)h_S0>u@q648tsN>m_-ZhxIUg-! znjmr$BapWRTf0W03Tm?d027Wx^N5~6>H3Q0M+ECjBxODz70A^;L9_Qn!k$`rkmtV~ z@gV#9>d2vvs@?FS=NMqB0}I*DC<7S?cqK;n2i5tE;mlkWSxOAzBD22gnpJ+q}YCp(14%EqRvrP|p} z1Eiu%FQFL5k?vd0Ul`KHs*w@gk(~Ur9&7Y<5wb|kGPolc8Ub;rVx~j@0oW6*v1x$i zV3$*TE%zPKQ!BRy9f<(r+gc*MNi`-3TpaQ~`Ufd#GU0$#@7QNi-eXS^#S;<<&ULww z4$BLlc~XR`YNRgQhhhdb0_j`g$`g)H%NpLYFM}&~@f#S>^H3GfhzE#AVsni=GP0IU z@S;{k(kT+C$Qb=Jxl>Lf_82~xI%8^u=3~bu`JZhGtYvm8zS$n0`g0K3K%Np#NYr^D z&u+)Iin82BG8N|39vw(B28iiNP zMn|p)(*vm?;V=9U_4URd|WoY@6g zS)Rjm5~Q^28SqpOsrJ?jMCE{BaL2Lv4Ox^OKU$xw%ah#k9sdBXwx-y) zS=cnxCPe=LSb?2itFy&a0a7UkZ1TY%f7zgwJ6gVvoh8J_A`#?M_=m{pBgBlDDUR^q z&H_!_wKmM9DDfedPzMPcDo@Kg$8+o_hV31FB88`!dw@R+dyMIgwneq^Qw+bxPd5?> z{YH==3sYJHJfC3xUwGBD+l^3@$ltQA55xCbb3Z7K>l9th54 z$6|Y6Y6QD7*HjovhzHLY$Lpq9gQYvGlI%_a{{YnX(3~OzJELoZ1`^w{vXRwTDwDj9YH4_mb_|Wax>}gjA)>vaq5Q|_tqwys6Jm! zR!X}=ejQh^8u&+!%sXmxMcV`%oon!Y{{UQQz)+J*M+76ypW9fndwO@yr3ga|fP3rJ zgFe{x>~(ana*Py(?587MmS8)2>OqWsM{iG_v1pi#WPaKz2M9MP`6sdO?W}n!cM0|G zb+klseYNAM$WQ_8f!{KboYPm9iKZjs<5OyvQUhGeq&sHcY?BZ z9-a#8XgqcBNCcS+^wQOMw^O1;QCAW>dMO|iq9)}Dmg>RYfjc_F&Q?B>gwU&GJ zOmY+7EDwK|w{2RMjrkS2i6r>?s;5vnv!3H0ENjcn{68dFysufO{vwWU1{X_Dx2?5o zB&20upA)5B@3Sve6hUn9iM@F!U@|{lA<*@7tqRmFR}7!RSb_)Fwxr9}>L^je*D|nN zkFV5gD?C3{8^LJ0THoS2Nf}PXs)Kp$S_=hKlHDxzUOE%WrjwL?{nxfXu9NNe3pd4@ zR;DfDpZWI+G5tTO)vLLB(`c)Sq6CbJlj=g4$ zlDWHOZdZ@i$qQe)Hws?Y+xC#CFI^*s^)V#M$=Lf8@BL1b_ocsNq%S>=HiBe6Wil27 zeKX%mw@T@$s!dfqp%|Q~&N1Kg&|15sl@H=Suk&Nv>$et|wvOfJ=GF%SHj7f_mN0oJ z$K-W_n0e%!Xlbk`D}&p%4!&94LF7o!&sz4<=k;$W+SWlB!k`5DoqZi|A58Zr9s6iR zOvfdku=LhTRFQ&t0>|f}+v==Jm>{jDTr{xc`;nhrPfNnYgTQYOKE1S~@lpVzDlziz zHLhEegy4OCYBW0mMkb=1{{XaxHOQP~XFdCBGVa1=2|E|hU;#KfNRqlk>JP|kQdUhF z1a|ky)pVMSPUOV^_dp20c#$h-GrlkfVUF4!@_aQmLb&DMDtlv5miscthKWfZ*HEhN zGSuZ1g;RroKlL%9st9bJR+;M=W-}HneGX1@tu=Q!>LN;W+BnWY9kq#!H)a~d!Uuf% zd+M@Luz||Tn&DAS-MD~0Y7VEhPu^1CLmo&200G}amN0t~F`ry(bTOe|Q1Bq*C-e2y zfk@m*7+b1s@=*CChYR?KCqBByI%-K`$B5C$Jv(_$rd2IUVP-xe4%rRJAJwfuYle=deq2}3dY`7H#8x#96`hB+dmVgals6DUuectX z9f-uLGC;^OzMvmZU;DL-Ld-kl4M}C>*lx$?oqQqzhy>)1-&PomN}`H$#FZpx>#tf8 z6}|FxBg0}&Z~*t$#vf6h%jv7xm0|Xw7<1c?x8fbOti)3!uBR33-d@D|V_q_Oc&C2- z`)Z3VA5xTFPCTh2V?VBl+3s@ERH&$wnsVNB3!X#r)JBYflkR)`^}3!}DV<$aSc9J9 zOLTpLz4o5zH{GI|IcVXdSY40sW-HwWKMp=w)Cf27PXobtq*kfmRcbh3;CgrYdW|Yg zM^?%4Z$ue#OF3*~KAG3mS665jm_ZAb9f@3l`FymOM@fx;U{=UCRMv-?%_))Q1PM9+ z04{YVhWkCvH-uHmOjvTyGuVE5S)JL`BX&Ngu*R^CNom-KB=s04=bLBoLHyEl}z$iU%2D#Fb?{bOr<7Xf*r)++jVzpnVr*9fL zomc<>C(!*gi6Jh6(rvcXxRU4^_{g);C5+ytTGK?{p&8f+BtsV0^o0IwsF7ju8-KA6+e^lA+)a zq3!$V^&G(vGs)-mBx^IQyB$C>I#?^cs;R zE)%0um}iMRef1zteO(EX|=HW3>*P=T3 zXVCXk=ydaLyW3%)@Z$v?{{R@zV1AmZ>7C+m(h}M$9mSF?hrq|N(w^H-Yl~Ao(i?22 z#fmgj>Ocd&f>ihpoKy^dhN1oE;wCwIeD$fNk#ckEt8NrhphZUtJ8D%$TSXC4KP+f6 z)=86=U#5O~l+}>Df5gf5IMw`A<$TvAg^T)qKDzpC*;^Vca8HE!4`ZQqERqw*41Erw zOW~H{qX!>R<(R$Cce&~Xckibw=ba#TbB)l+h>oGS?jVWro&2^gaQJ9qD+3}+xH9^-;l^ghsW$!lv} zZI(GpC;7!}5Z>Lfs{Z-9DejT9th`=Bl0KS2_=wk*4i0;F*3ntwU^5epd;4kzwY)2{ z-EO#Y4$lh`Pxo{Nrdg1X&ci1dZ8lr!Qh5PY@{Z>x=b<~Q2q~p09|B1Sx3|+)9H@@r zFUM8kDOMR7_CEUC71*j_&!^Wzo>mM`A9MR^Bgk`*ef!Ht9Nx^MqlYx&nwwN7j zIprCOWhzE9^4F^-4E9ciE8TZypI4gtP>k+``mNI@?8?-|U#H&4%Be$lcMLteB z`h9g7VGRCJfvGW51~^yt@2C`|G8x83N%ZV>K9*TP42_;ALF1;FdK2?HAx2&>2?z2c zRZ4!v#mSfk8_edRlZ| zZvJm^trhf%R0_rb3Ojc7(Hf{}WL{B*T>A}02)yv1S;dVA@1?`bj3fi6k;cGUu=E|N_}61yIFSMED|=ygRsMKKvCiTBfd_6byY zrGoM956?kv5iw36`N7fMJ_5l zQAJSS4+}bhl1V;a&p~F>02~x2Z`>`Gx{2Vgk(yjM3n9iCN8l&e>YAUZmooQ?cDKTQ zE~#Wy;v2!@P5=aUKV3I(`Kw^N%>>7qTuG5+&*2C056}JwQEeSF{{Y7{wbZwoLb9)l z#&;?Z{Z6zr2IQe8@Rlep)UR2ay}6zOL1kIEl{xkwEnB@m+ZNlSCB~Mqrcr_BZtLH$ z^dI4(H;#_&?ZS|~ifEy@l^!t<$}EB3x2{RXJN*50;nQB8*X?MYma24e4nl$3KTR$2 z0^BAtG75aOQ7t7HRK{>JMxs{K6EDM=N#t;FbZEmVrSO!6W9ojI0aa;%s>Ibrj};|K zG4mgmHJNIvrOUlq>EGNpR5u;hc4|6~Y-FI0B$7TywHM~rcRaBTEk{Vpragqpt&C z%}Z*vQO^}UG-$P$@o8!tw-$9gd^rJN-c@cugOS+dj;k+sTb;tD?(CG()=FlQDpwB`NAXs;n%n--Os0E>#0y$XwMM?N?Diq zis%$6`2&-Y_3f*U2I+xqEwR+O34W=n?zM)lwal|JA{HaQ6aYV92D3Ja(OH7war^1! z*R-o@r9`H-%QMM!LQW82oLp4(4pf;gTbNCi5&jy>eh zy5!`M?me|{-1cuvdKt1PtQ+R8%XYZHOq6vKTH~mn#UqD{@Z^?t8Sj?-&!(x}*SvaJ zaGH+&X}#9ks*o%UZ98g`nIx1Z8d*?DlDYm|fsEt6u|HAmO`yYFip?MZ^13#!qnj6g zTTLDAi7pbxsS8Qs5=Imb&Gi_`AD*Lh_w1X}{-5p|>+L-(wNg|PX=AG)(wPsckMDc; zZF6Yrw@~(#Fq3TcBHesRkA$?w-z0KE0nedT9rNtR1QGeG*7Xam7fXqr@xCi*lCD(* ztff3K-he9Lj^F#-=?&4&L2mj9JyrvIa=J6^LAvYf=_2X9f}#mtp#;ugsN+0FGoCDp zbHu2|djp(z(;wNtsFgKV7_D1|(=2sV@%U0!sZ$z(jscEy$mjFybE+=yymnU1+Eq4- zTs2#Va&9SNYKqFr_L^8Di02O?mEsx6JV&S}kvi#5v$dN0O|qi6-(oPuaQ^@)NV_{p z%fE=sS)0=XxzBHI*~L62DC)6)RjxTh#VdZAW|a#zIFG`>_9I()rhgZ~~iE*MICAO<l5CMy^ex)_2&p8cG_X^%V4o>ggb2_|KGb^d}y}uo_#mgdZWwTXi7i!k0xEssb}g zM`MK<_0ksiqqxl&kV_0rD;!BDq+a>;?loVh+OMaid`0r5sTvn5qCv^n5;1_e$A4d@ zrEY$_>l18T&u|kZSEW`M2*~EqiUKBcu}3TB(&M0#eG{r8q0( z3ydi_$;l%+={Ho^MY&@TnGLm6Ut}xh^t$i=0J!#*6G<&iGc`o(3%bV|kViKM5rTag zvI*^joqmTK^@`tbcsGS*xeW@dNM$I)kip~!&p%BIv)gu#$x8dy)v?;GR5gsUqT8WJ zmaaw_XMO_=*d4Qw06#r)r`j8PU9T6J;+~vSA_glW_A)6wf&Dd#SNmL>s+P6^196o7 z){d-f4Z&X&7OKgnR6J#FKtjokGVwmS`s;`O(ftgzShpP=_oQ`l*KM2BZBr#AQ8PWA zl&End4F3QNEs)34IQ9gSuDMN?CPF~>&ZDmExKltQilK-Husy&(k=Fe?j+lbNvP#al zJAyONU$PfYw}vnMRO0vZyE9zIX!|OZsWe6dY$$h=zraW^v9^z zH>z3IMoNc{rCOf{k|>Q;gZBgy5248Ks*n3oaGF+~-!CC7#d~Dvr5^LU#OU$V%MnZz zU~oYiC(k*4;PdiSA&sruwRT@Xx~tMone_VEu;?jZpn3%1Je2g}F+1ds6}W+xBLwH% zonEkRYZF;ta;5H>qp9w)NLDVxJXGho*XA5oy4fXZK>|l&%)ok`Iqlusd{#u7qDc`5 z;;cyn^4B_TJ6`L&m8p|Cf~kIsZTtNl&Il!vvJ&+rg5$~J5$nVp5(m#33u)O@yML&+ zUEyv@*<`y@EOjx520lyN6$Fm`zjATvaa;6?@3?n7w)rKdjz5Eh#$+f#WjM}TJ&$iu ztG=qT&0&SPRitf>L1dJ(XBh30ar$cunpk#@>vK-=xk{+EQP!ZAcnX#o!5zovq%GM= zW1@GAsd-54pKVLHZ@Sl}mEdUO!NT|U`Rcyh*HY36#X*~z<%w+I>M^7tdxvBS^doL- z08rh|aqFa7__)kNFeSdaX05LRBH8Xw{-Dy0!lhl$m)Gm9kpdPeGKSaFvnf>>KDqYN zUCxQBd{`tNR$LzXY^;{La$$*r40ajN<)WBnXOo}42+p*%)xt?=DFW%VEqAJOMRK(Y z$lvh^eNWRqy1Y7d)VK0Nl#xzV$H;^K0A{~8cP)x-v$*bC zdUxd|1yrzS1ak_+2Epz!26g(kY1ub@$PdCPl%G%mIQ;RXUbXZJeaW)!vF-_GN_q-^ zikhGzyTJqp#dKa@gb<`-BiHM$hKIx(q;|u>Sv6W?J9my(=Dn(}<8HZA)>|c#I+$b+ z8$^7;hoJ;}>!o@*VCtt-Wf$9B6w~|^Zxk&xISU&x$uWh;GTpMr{06K2i*nlApR6|X zYul8z+i(6$LW;N}zm{2Ye9eM=KhgEq>{i6tHeIi`sW$zVk|^P&g;SJh7oGqBoP9OB z#k@n=n%Ztk%i;Plsc}27Jr^1D2c&zOr#(TJa_@>MB&C(kOmz}44x>20KBEKQ z_19hO{rqZ=!PHT_GDbKO?hbH!VCdb~Z9_I?cq5RHLc=;%YczB)A z>OG~~o-(`fMbH~stcYhd05NQa@84SMnPUKU{{Xj2R9l7Q{v1;0k8a1)QYX5~{iJer zlWta!>qI1!F*q87GAy0F&aMasI$`l_Ln02h{h$F{f9Q^`=E6Owi1GI-0x$A%i0OpQ+6kcIcg zp(^QOmg!?TWg7TMAbb)4_twd74!y8=k8MMet~tLHVCX=#VF|syc`_-%_4U$CbSz&u zKED3?bF5c(3_LN|_Bw=>$pnhhpg2Fah1OoBm&#?xJ@fO_CaPx)&mh41 z>47QAe)HS3JBBFhf|(6IT@yZ1f9=&zx^|1);0mX~bSDEnkLRldUnHhhRs1K{zJgq8 zVW%6%|%>!kgi(OUh{zGtA^ zbal4ZkvvHJRq~OJ>&$jPzPhrkrBjX+?tl_9ep;Dor-mAYb&U%H>U~DLjq!Pz8DLyP z;ZeQ&j|zyt{f_Tukz=!0MM|^+8e)>=`!ABgfDiMYOJ+eFM(Cb$6q~2A=#j&X7rMAg2l1gC3%(4^M zk6)Lk<*LE9#p<0MWTKig#~?BsW9j;9*J&qvq6Sk$_Fhw03mGA7SpjQE;Fdgqu3x!i z9-73`PfEsBauE6*OQ08fbV6SNBtSf(NU{cvr`~mnleL(}q-UQDDbt+t3KlcCSlW!z zFNZkckUaSI`sjp~c6C4HB1I=4_SA|xPaXhgQ5!e&1;G7vB6oX0BwIiUwXkk&n0q?7>6EgEvhn|iPqlGuV4*_`A`_zCc08 zeNvVgtEHWuMr8zpgY)_6zDBDQzCAqPGA|-Coa>1FEjuN38LFnx3D!&8P@J5R^d6ek zQ@G$mheG^^Vm?}{jpuXCCk1RSa6*kpsII!l7by{gf%r(zZ_iC`kPhh%)sxvirDd|G zokX!9ap|93FW1~@>tuI|2vn!07XGxW}uM z$U4^)A+DgZ$tiY9ZAy<026#(37#L&e^%`HfTWc#7>IjX~B;(Nj`qf8vsH&0~WvEzP zjz|NsANFa2it9%#&rjk(f_s)YQTYu#TT0C57jl$sHdyDcRAHQVZXnpl!S z4Ekt=C6ePbW@Lo%4abokv+~n5uVZ|DIy7}?^#u2eI6v1wWot%M0G<+zRI(H1LVd=G z(b=jiU1LgTe4Gv=xz)+G`c*%J7_GLntZ>T8R2+P;!%eVs=Y+-?Ee`>c@W_B=27NF- zn!_f!tl+1!O80hDl_txslA<`i7r{TsU2~87^ygsc*5RqEX=IK`5wYh}>ObMGhuPgd zM{)6y_`)(3d5-w{{dHzgStu6KwaC=?+nH@*>S=rwOXhwTKUsP)NpOKF zeis5i^MM}({Z5M?v-(5ENNUJMZz6=jU(EaddcGkP5DyXxc*7sW>NT!PiEvh$84oVl zQLaP0Pf+86yG`)DJ6l95s*9u%%MK*)^B-Wx1dM)q6Li{CwpqRwXnAL_AY)fJwb!~g zFA;hAf;2jPrCU}gA4)KV=vq&Nq%vJdH|4O^Rvw6|!3j_ak) zcV19(h0vpqO#0_SejVpt`RsDt^?hFK`)2WjJtS))_g7LsOzC_3En-LFX;i6h?i&mH zYgBrnSqmJx7hQs?Mx|F?CFIHadJRBZM9D8WpCdm#TorpSZaj`sx}u$!9wk?jsrvmi z3ASu>#z^WekrwrcsuCOi%|1O?S!B_=(sVZ0bTP0TF@xK=(7NrN19y!Z3J!8Jr^d8T z5cqmvu0g@$>U2sQbu>_j>Z#8>dgs$k8j?6m8e8R4a_l%<8Ch7V?s74$3$tih&xHu= zFiRfVxa;=xRgvS;41>O@!=Ay4?}%+=p?w`oW!vu&$xqyc4(Ik({* z^(}1{dKi3qh$1-vD)ROG^j7HfbkdhpXK~xQ=v>tlPC=Fx3{HM})YrMeW^)?VgtSx@ zYl?bRkL$DmnRiQ`feN z)6&8u%da92Yz+|MO%j$1hdzVntE8g!7THN85%`SUd-{56dhY7GdKjUoWd}XEXia5v zsxf9cCm7HB?uR>J8o3!!wp%IL=5q317Uf^b*9D>B+4rHLudQIQcD*XD3CPwlEKvp_1|Km@r7 zxoyhJW2`kF$37S>m%vs&z>ie_-UEuxLs)^scMIH>}84N3K$QN z&wtz3KqZ1u%y>5tdz0S>R@M=N%1n}3!ic=1V}=;@@2r{0^>E$wo2D`jd+QM%eLD>4 zfvH>8FOmnC9bj3`IODgzb-YANa7D={1GlNyoEYP=?dhmvL?l@FXt9Ih@^k#7+gjra z&HPS7*YN63fg^eN`j2ysYcaA8>-5!h$0&rImWAURav8t}+gjut{KS+001Zs=(}>Pl zzF6(AWwulzc%~!3jDmY=7E&DwfDmp2y}6 zsJ4PI`{56tY*#@Tow$gJ$ZUd7?Wn&5)ZS@OfPD@I@PVnd7VgM9Kj_+@(>`sdSAYMZG?RT#iu zQQZA?=ubiIsS6nkhR1(RWU2FCPnT_8(yMo68^Z*W21loDWFlT&kIUCmd@+m+oc(p- zjY8xMoOU?&(9tUGMR>USp8msM7&Dd(ewfzvjDSz6#yjg`$H@wj?fYu!5Pfi=cpO;! zk8*uZyfo+342pOi$nDdt+GeD&3g&KRppC$m6gB(^^>v zqjx#RbwpT3B(rN&@_6v9Pb|H=;GC|0c+lsLFr-J@wnuGEk|)T6~g^HA5Ky1GzcW zRZc8WDaNN#Q=Vc&@9m_yi1#N=yo8lLrz21BI9L^X=eKjDeZIT^AOYLl=Q?Lvrzzz< z{YlmtTjpCJbqu0wCla~Gu75okp{HuB7W6+aeJ@(q<0r#50($37a7?IyBVm#2tPyTY*sMgYsPyyKBXIOv%P6&fccJnd!0f; zwE{(v*MoU+?Wi>oabGTdbWXCaB_){Wz7C+vJVc%y^P%19je^z`yj2Kw^!{(2wLIW4 zkxy)qjcb}l1c1N~kv_VEQ!`<>=LB~d&{|-^lO@_kVxjOoyJ`hZd0<(l^d0hb3QkSj z_x8r3O&pFpcg}|GMH1;($TBGe9V|}LM&&2)eBRaBCgM6n7ON~7=47@>R7|*6OuX1TB zn{;-03G!m+b8Gs z)*-Qj+~dBDrDuC-Pf1(>=IyCa%b%~$L*i~-iN>Zy9w|z>ERVsZm zp{XFr_4;Z|a%A8(Pr21vCY-71COhY`J+-+3#(VnfL_BZ`{Pi|4FhhF&TBQaTvA1xn zLCN&d8bu6LM}hMnT|o$>^9|g4Yjh4_lpZ8!>#I>7r=`zhj((Wd$wX24T{xf1Lzd$x zA^G8laobbku3Ct=%8Q(Oomz_qsDmB*{JVN;UAn$V=NKe{JAth&My$cOWD%Wgii%i| zG>i=P(0r5tCJK7BoAI6``yG8y-fTzTJ+wBNTmj-7A768gN>(5ePcA;d;~Eq}Z_n_< zFz@g4)&gc+02_xc-Mi}v9AFV9G3~4a=Ov}&3G~K*gi2S&DPUA&k8ET0){281&Lji4 zKg=~BpD96&v5$Rv-Xx#S2hX>rfQ;c1!mgefm5X6P7&#t?>7+Z|IgVEFBv!$|)2&jo zs;ZJp3={Lxefox`44BxA_iSp~YZj=rEKTAwsdew4m#&!Xd369peK1JSC1WA*NWt{Z zH0QM`V`hx2a$rX#M3;ZsIXi=8-G^H7Ab^zDod8nRQROgt10!?7p0(JTFgnwG8N zIJe7^5Cpb&}4ZkhQP?CY4e)__izG{QUFbF5U zMu^2t@Z-gH9FKfzm8ZSER>%<>zot%}VXul<7YK`wTvxQV5k3hqj4V?^jwk zF=XTVX?t>wt_i}T^k}HscBrR|ScUzyCQ7qg#we+xiZmUBQH9Uvk6kgbj_QkwHD7g-_be}8Cx3hlU~0?S z6YcMW0iuR@qEH8;Fu~9BcFukMbx_mN$s+&(BiBv4YRxRN28)k(c9V)D(kK!&lFvo1;O~|aQgdCIWj`~2@G}jt<{1;|1u*L}0hYH6D%}LUXhcQBaX8P&9S|f8 zDnK^Y^y%i={{Y}>)m>Ry%F??_QBr4-qf$6P#muuKo@b~woUjUyPLBI}8f&Fu?cHIzC&A1-z za<|D^@Rl)&Dx6_*c&PyU4&AY>kU`WtnBo*J>_U+i)%!42TWW1o6WHs+$0ah?M@Lyp zSgwPTNEua?i7W@;0k{xz>7uqCf^@#k4L0noo|eAeLZU>qGKpnw9#h4F2|0tvs8r%} z-vEtQ(OE7O_Yc16XuJbbOtjpPyk`gbOJp_=)Z;z%^-Z?pb*)+IswSzMBm(&-3`rm# zmUYqgM>x}7R1cwau6tGIr`uA#jv04V)|%dm#Y~aGRzri14vM}g0H`@tWo(Z(W2d{H z+GA`}M6p=ywY4Qsma3K!6l~bQJUMb8p7=a(=`PYkx}HfY_c)9sPNwcE?e%${>pdt`21J3I zyo(PuWd#02f8Xn*I(@XYl9*+yj*=nfW|3I@y#j(s)zNaT&sLhkVOfeXF1rju z-0GI@Bns;kF}xs^Ja{XPQscHrDo4xa&$2o>Ez)W0Z?=>06%Nz*lEEAj%Ez!#3q)A} z?~#?yVl(Tk?$^c+?m$=UANx~pdbKojA?qSr}J&8QMR7np;sgbo5LJ~5%{y; zzt^{6s>=7fH+y~OM_W#knrT`ES!6*hvjz%PAvux17IIe@9=@69ODNR7?+J`yjksHy zvX8D;k+th+8m=37j(96we~-X+k$Dcl5>%GR&N1(SFRDEtZL_xNO${tpilm0tW~VXB6H+gWH<^em{-YW6$FR`8uvYa3k7>_K zTTKmBDB}y&dxMdgIDj~g*w5EO*B#-FI8;S6mn!n%VA=ONN-JGG))FE_da8({5lJVL z45SyxJhP9*>OUd%pxdT;#=c1elv!z{2?S6llh=p?^%(Wm#(7Nwvbf^FTlVEu*Jo0_ z#@9_54opSLi4<|heSHsc-(K!(l?LO5t82GKy4fNpiqx~`&e_I689n=ZcF>rO{@-6y zLwc*JvPA=Ml^gLfJ;H?KIUhntu=UX0`M7qCO}3q_yMC6UYpE?$Sc<%(aQNVf+$lKE zZ9Sp$G(!S*X{OeXl;~>EV55B z!AVUB?(z~9R3OetI2gvBBHtHFRMCHCua`<{I3*k)GmxMIoHB!qA93lfgy@UW^*Bjt zHfwwrYI2p;HIY+ClwjbARFU|B!R_ylPhDtq&W1a1u$3DdE2wg;Z?i48c3bwJ-TR+m z)otp!Ce37(N}@{ohh9%21#AUAPX5^Aj>i^FdhP0lG7HRYpN)na>{IEWnw|e`&XR5wbLrzd91yy7qhF{EjkAK%(;d8HQnHj?HVA;Ud$eXk* zk~+;G*CjY^Dij}Mpv@UMJcp-nG)B6q|D&q$SLt#}d_PcdFWqeOJ$ZMgxAJba~ z>6t3(;VdbbG?AAJ$$n$8^!3+1(aFJ-k(?ZmeYI-z^Qm3X-T z5Z_^u<&HF-W6Dk)gCCxi=DW*O+~REa)>g&br)Tnqr6M>8ews9`r7YFk z70!4Z4%yVo8*@^};t0ln1D zAPzp~B#Z%DZq3`&4a-dx9`N3Gd#rG<;Y(LrB&w&m&jNVoB=^R9>1F8UL+4T$duzX; z@PQMIlKGwbE>^F^OUBsn6Gux`Xt%wr)JkDL7Z03ruJh|`cN4I@`AzJ0Fpp;hAq=&;fB!k3!vyFBi*~4${{;O^Koz^YK zNoTprRy28OWvDy{ZxjV(0lc^eKF3J$-58akM;ZY$!ZkfNmNZ!_^uyyRYL&bh5UK6} zI$yh5{AFW|1M<~t(;6%Nis4CTt*N=(>5q-#Rs1`u0yu%<6Og&aK+nHzT=h6gQe!~a z9kZ_-_Utq=y+d8RWKyrCDna?y7y$IZSJyLg?!-{A1qlT zEAz&6dvRr3O`1+-F)ll2>#fjRc^t6DewviF=`tjZ%H!J}x*<;&1tG>xhUqb(3|b)x zAy?n!sPn|gNhh|COAy9YbULmauWsKw=xn2;xmzIzws13{PgbZ7PBeC^lsG-dzqXgF zsaGc>BSsxz4J|WVX_#QK^w4^`_~i@%1O7Vpz7~l)DL+tjyI5pi`D}ePMBgZO-z(bc zg-*<+w7p$WFivsu`Tqb-Zmym{51jt`U#zTSk=%ZIjpYNu3)+hEax!v0x*t7sgOc)W zetOY7{IW>^kDj1UP&~svnqW(%IqpZ%^Xcjau=uoL#h>-iSt?F-u1bS|bML3O1tvz} z7m`TakgPp>V^Sz%Qy^>{4_yO-RxSeMoau_r6_4?7Nz-o$Bqxo#PZO*>PBJiY?VLW^2e^2cUMkr)SF>#v&LqrkBLW(dt>># z1C*3jn5&T`i}8Q zTkfl8he!C88&lEA!^IT^TLu~C(s$3~2B+0@bko|I(&IFfh4O%-j()nh(uyTu!2A1a zW71@C038E7Pf%*gw|H)!kQY7Kx?@os{{R<%m12Z;2!||Briu-LXs4LeG}6d9VKd(v zxM#A%Dani}2RYE`Y_$A~GUw^-tzO+EhTK+PV`F@wBU`O7L;NUVRtx;ZcgWVug#~vX z5|%8X99RM0P2YDAIHY8Jxa&A5Okm*)e1?GPK+h`1n{cIGQPEZ!u}ZO({_`@Crd8Xq zy*4GsA@T&^X`VU(>EQ(@-x}HQM0W?<_t3vpc>x;XFd!`yN33G3~2N+m(Ripr5GJn5~fzOGFQ*jy-16b!l(WZpEqs$8nOLx{g4luo#cT zKjE&NI-Ts?xijgU**5k}y8`6}GD8SnYXJLKozI!M3U$9fYz&5z^SvEx}QBEhcJaEc}M^Zw!;vX_JuIZD=pE2#kpRT4uIfaLWr98Y? zW3d{-u4v_yJWvDyaM;gt^Va4w8CglSrGg;9^&>df!bZ@-1C+AjvK$MN!vOp1(I0Yq4QR<`13iwV($dQ)CNb&lqM#Jz zc@kjy{X1ywmKt*Z0K`(=zIeuB&QK~7#$(}5}haXK_J1eJ@TdsgrTPUi-Is8&a zLLT17^2W2zFpakC1W_^4I+~zaF4mapAf%|Y6;P!CQInJJk3;@CwDvzoEmcSFipF`O zcIJ!dSH5&dV)XjcXt=#4)TI0r7~^=bSMxbJ{PlF(>FrQO9B>ukj1y0^DppHoL6cPq|f!kQiNlIXOX;cOS@PIXhH4RB0jO9>c zwj2H$;!7t`VRo4qVai~Jik%yhC=ZWC>_&*vS|el5S7Vdt$0JMB70*0^Q6m5V_Rg7T zs)>&z^K@a{e6@m2!E~VwJ(QojBR*7w50`CArnd3($fG)$PU|FLhivO%Ao}Y$aa)@h z3rfG#ksQ&;77;NATVG4iuHnUHr z5{1uFQB~9Bofr~)*dE%EY}=yhOp*bS{Jw`*HD1-AnkHWh8TZD9uFhIyFHQJ?>_^L6 zMzj#Q=S1LDZ!XUZDlB36XTA@c{529?jaeLyX~R0_Bbdgm!De{8#X}tGXTZnso*aq^ z`Qy`7?XC(92t2B3wv1*lDr0U~&u>iYQ*4!#My3xpsVC46maQs_8FAs`BRYdsZfM*1 zN=tl>oZVUVNp_3WD(bgoLr;MefVmkXj-yd*bgf}5ua_Q*R{(0qOI+*(j55d6<56nq zB%%gEBk}ddnB7s}6r-hR$rwuC*lQdO{92N&j_3$Kt}&qZouScZnOrOU-BQSxtHPZp&I!dx?dhNHk|c%#?; z?VvKssQh>mM|=UNvQY71CPwTiJJA82AQFA?sIpmPf54;@{qEW}@-%J>MthGz^Vh;g zJfuMU*kcFfr?u6>K?!T_z_Ju9Jw3Ci)6uGq99ut8-&zB~S=`42x|HqW z0I}hIc=pycRD%rJIrchXYI1~+3}fa-qkY{h?0EWTzqfrDBbAxK#L`cwp?6?g=k2Wz zMnd`z@zZ>kSz{cZC*|8we(90q2&u=B_tOJ~q`8NX62jXmDx?t8L|KoZ8kIKQxZBV1 z>7F(t@jP9#^gf!gC^mH^Ej(3?R*5W&kR4AI{{ToF_x!P=kld!RQb$Gc)YUN|E{!5a zN9^iA(qE`IOctKaHaAFVQk9<=$gs4zRUOqq1NPU?O>A0V6=gFO9%928_wA>x%^iK} zr{g2G(}p7^WmQu6`V0^0rI~H@m1M{FSP~A!mOdc`N8TUL zLXOc;OUb8MV1HFqT(9*x)-_R3415|)Fa}GoIX?c{-|&R@3Ql|Jr(^WfbMO1Kc1^Kk ztgD@h86`+0c&X!NWriu1OzOv#CP;3`Hybo4S6kR@t%iGnC<@n zZ`Ui_cz^IGi0Z%jyqWp0&UUBc{3l#G_92gd>#V4)Cb5bvihy?|&IUg{bT;YxQgnOm ze{Y*-((H?t$lTP)_nnI6c&7p?_(KF`447^&_;ZE}jQbsBZu<^()~=o!ksX4NOzga7 zxsp*wqmqcghV>XE;~4`@@bBWy4z?2MoFj1TN>_^i00sDuhfWy_42>g@s3|t>Qo6}b z7E$c0oRN8ZriPkVmNZ)*%K+C)ZtFqma2l z{nYCImcrM1m)w9_P25rX)O2weQVF|KmG z*krO-H3ZD1kOPl(&$0TAYSC-q){BU&ej(x0_<5-~^+32}k&nph#6k(=GpWWeTzh-_ z>&A(>00we3yK3f%lrA^~pd@G4ShQ>E22a0lT}v?z#YGBAaQJGMrE|th&*En!T#@m+-pPIYh#E?^wKJ~p(7d4SoKe6aTWp-Bsc|! z9@)=*MUe~RC_jA^dT;?!z5T|tv>p2?AbSz3ps#k^p=KYeBk!Ri9AfL z$w#MgtYw(|Iz}M?jFNcwC-cy`p)^Ww2z+$;K2iNNT84~db0FtYU}BBTr~da%8-BxC zcqGy)mjm#e_x*8!`kiN#hOI2Q9ZPi-z7p}zpvI@gSghC*410sAReLtN-tdVdZ{v@| zy~3Zaj@o*2Q&g)gtsj((;!KmSWYREst#qJ{L*=C}Y*MvKIiyu=k;$=~X_gBVvA$&k zxy}H_irDr5+CU}0ptQsUXov_I3O#FKU4+JR?k?!yTH2Ou$1JW)8o zA1zFRGT>(!!1mEmZ)QduPp8XUqP8|WDF@~Txsyr`S4tKUgvVcRCzE3XK&ok38IC(? z{#pl-A2F34faB9bDs7<&3^Sc`?$<|cBwC2r9>e--B$2<%ztc{#*%nneQJ<%_pwD1r z0I2;n38ifol)^K1?my$K95SCaMm==HC83o59BLIsvP91{C%32?SvHs&d!Y{|G1%Y_ zmb5b*9FysdO`4U|Wal7jLsQ`A9kHRbTWw<;g->kbAC{!8bc^WSkIzu$Qm3)@^wfTM zLKye_wRWp%7*pP@&T!Z|#j2Ym2kt+8MON_?;P)E!)%q*ZMCkVaz~RV=cw`2 zHh#VT09|a6RZkJ_ef6NmsglD#u7>*~1G?I*Ni51w=dDvq9x;G3+d9L=;-F-VcE+^H zGO#%v{qzWj#e5(#5U4wA32FGSMH%_)7^<6=N4BITVhpnZ^Tst13Q^{!JbiLLnhkSO zG6HcJ?sR%u#Bh5Noej9DolXG9zNISVDON;;aUf?y+MghhKMs#nQWk6vZ=R#cP1_-H zjTg;M$RyCn0V|$4)Ct*#&$gLlC;(0azqr&2${3h4FR$hAs8IviEl9-qvT>;I_`8h} zsi)vi6+XV&fg&(JEb5P{E*7xFdY@lydaOYM9ldpcP!AG2YcIow&PG0ZiWR*=vXO#G z8o=N{ellqVS(&bJlhTN<$HLRcIYl#_tRp~kl?ryjb{-G)df8p&CYr)>J^;b$!X zPfu8>WO+<;g@lbz1o}{X-Mtytgkc(0j91h1);RImkKbN4? zXr+yN5uf;KQaVVuP9x>3v_K;^`jt`qQSIt#PjS{+@L``|DiNM!m2=9=}ZqD1fCZEV7p6@B3?DhE91`%MY2*hPfEnaDG4@ z-(3{9NY#F05LP~?LQMo<1uiRW^F(J*S%B^}9$P}zQ}Ud9sTs@ zYTC5(uA)`eV>)*xcJg;VJ<5 zCkRL4BU#(FtZH+@_LdS3p#M zqm4OVq`A^mH9B&US&3kOmrAwNie)Z@@_$fAq1A;(sTZ^gbco6&Q0LJzkJnMFZolOm z5EVY1j)tu?@is~H`s)^gRc>-NSfA5YhSAz;tPn`|^*S$4b!f`4KA$ZsQ@oi0iNQU! zIi_TfumES*QCLs*yWA2*{7?fQe|<=*ta_-{2r@zSBju|4ioQi~3t$ua==Hkl$^kNd zgzD?jL|JM4HaTCz^ExSSbcsP?0Ur6(SSF6C6t`pPpKW|$;MhUi+f`~5*FiK>5LE#f z#&eB6ZOGo4M2nO@z4cVvt{({CEtUC?<4}?Du{Ftv`d*ecQPh)E;@7eeCSb|E* z20OE3wwn^JIS^v;$oTbi2h3adz*{qS^ZIe37?w{LvuWe^KPK~Ba<8YW`L z(D%l(qO#DG;|zp2&*`0NtgD`GQBtlX{`mFQRFhT45|GkLUSNNZ+lsb555A$mRt8jS zp4+C9n>9@l$6{N)2hB&Oey3H{-(d8%df2KjHIporY04!+N+Aq9&4Hh6cfi3vn6>IG zFv-e8RZ`@s0SR1xfd2p;RQsoBLAI&tE|=+G;MGcyR7$cmTo`r|a2Zy~IR0GVXXfY~ znl2$0--3y0**g)g^Ft(1&2EVrNTFz2SeP6yh{TdSrHMR%z!~rBqA_i5kz6Zl4AfMy zKqB~hDQV;*hVZ!+&2N~ns zfsR0He%YtI-zzDavf{u36bHhhDaT*{z#g5kt)ovQjp}cq_e21?0Xd3ok|~WfvuD&y zR0zb9Ou=}s^M(vheEWSfsZ?7=mD%P>P9XP1Zv02fI%Kd|+(sj)bumORiUQ$&UBDc@ zPjjDBrdXkh5CmujJ@tjsZ8Q|CN)c=-O4@aKWN0Qv42}nILC7NqBfgpF?eS5UkyU(Y zm^9J_0LVbbPv{1v_Sc-gnn`hYD!{^nUt_b~WJzu|+G?gx!exv$JLlh0DB_`~Lr+5l zQ6dwRjX0<$x$TW_1bS;1Rw{fp;(mD5D1g>ouJKpBD57PB#v_yu!hU~Uc$D_|58k&r z$=!|=i6m|Ty~?g|Gwv~?4ND}5Bao>8=RW$2Q)7my1amnloRvBdFO_^LD_slI8R?Ws z8vC!NKAKs%K}~kKRNAW6DuG{0RygEBaqEzMvGw&IF_ETN?a{y^N^(*(^+D)$y=mh| zE)WBb$J~Bey7W}5o3`{*ik^JLK0(??ZH zD^E)@D@{~c#P&;k zQqsmEhI2@c%D4mH)Zs^SpG`Y>aTA^hNbQ_=)_R-W>ZZWC%W-{+HeL4PE!IubcZONy z4)LIgA|pM=5WT-o+e}uvUYYa;6KdL9c9IFFKgOsmW~!K+f1H(xVml7rgV+sQSGcO0 zmF1!jQE;F6=h z2tLC^*uXeI_ZMLczE)+}Ng-l=&wVD`W$_P(8Vq`p2fx=-?w2XuvZ_vfbSgPqzFj;1 z+IT5@RCsN?-1IzQ&i)3j(5JG}|0QqU_ZbwT(OUs39b|+R` zsINBW)497p#l(r>sK!ridwrFCFJ z`my!U?lypcaH?90SEpu=K8IMs^W<@J+v};dFp%sAe4Q1sTWQ#Ml>hA*U-6~;(!Q=e^B+uEk*402q4=18TKkBg~7U8R`!%#25N zKBr1_*V)?rCg8lsJ<6_GJXd)t7!vvQC%IwmjE!9zLgiD`%DM||0s~u7D$`TZ@*X6P z-ho3LpU>&9SJ7^TgKKa(E6$l+tZ@Y7@D)$8_GaqpMbYA+i5LuXm7_cX&!7r5d{{oq z5*323uJr3riUHvOXv1T<0O0GU`bG9=y6k&o^mmFFmbR{;swG&{h>wr}CUSB>9nZhZ zSN`AV{i-S?HL63Ofq*bQ$+hV^cW$7n zj;4^5c#c*3ALw*ut_q_GGP=J3^2WIOuM?kA($_k{T}?NKL#I2M+@W_%tTdnq{XR>q zC~N1hR`Db%o{QTDL$2aChs9Q2NuI>|9YD6;Dd?nA;(41KmpSkB)*G<392-ra1g0b6 zfJq*@TduNDyz)G>>D_R0G;TV>R*LH<0qlLXrt3lRXcH`4k0}FG(m}~q;bBpoRNS&` zt9-wAQpZy)j21XNKm&hWGX0ykjdtp?RsR5J_RzLh)6c|y5|YL0tOz9M*VkU|9-qr! zc4Iv+#2y?Kf&x`r^V3$>u~zN35&RrsNFCzs+t?qTwYl+_wpM*sb}{{3-IbdkbOA@F zZDPdd-#QsZT{6wbi!gs;JvBN>NzZL#s#`f*L-|g7>IGAV7$ob~nB;)RI)hLpU`})E z>7fM@(>I6Tk^QtL;}m6k5shuCc@XwE@AA-k$)(4c@t>}UaDfK7I-=meuWV^j$?PCb^QlKh7eD^pSmGQCDAa#wKC%77O0S5^Vqsn)%SmV0I zmShLe4{~%~E}M$kxOjY24&N`&OEx>=(iHGw?BFqB+^N-rVBAy78BYj>J@cOWao*g8 zox5+$qQTPGX=5U$K){a6jbr_Qql^}&Asu}Wq0`MZR5euNEJJ;J`s-s*Ln;Dg0H2n# znV;OPLKap6sBY3+?IucTrE?L;1dQoUdTFI%;Z6^}uKUfFjgf?dm-!u3#r?*H~7|(ni6Sl1-Z4W6_88OLqZUhBQr(r77ZTad? z@Zl}n&@PC}vnxe7lfh+DJ=Yp`v$Z|GQ6ivV21p~Y)ccO^qpXSIWk{8K0gl=FX(Mqs z3EozVysDn2&@IEAVBo9j*zKs1R8iJH3I_O|{C|RZoc@|)+;@b!+v+W%2<7AmStIVs z573Pz^lsJn2Kp0U)r2yy6=qyU4=i%da0$rv*0BvnUU>^AR^<%rd#5Jab+FKy>Z&&g z20$Y@{WO(bYL4k63sp3tr4B+E%CP+peRacHt@k)qG)3X;Mmv6*4Rf_wZG)UNP?<-o zaqofoYYbY=xU8-6=x>9C$&@=YdR=ZU1opat5cQDbx5yAqep-vTW4UbU+S6YeOHmLG zL{14nMnGZgaqX-6pLSX56Kr$E}-SoVaRg$wUOit{7 znYC_7(XHP|i+ii0b!H`;k1*w&fsc^?0Mz;EZs$WS1ds8kt05iFAAhIIU8rY>d1D~1 zH1JLDJP?svZ{SNY@XklC%Ry@)ru;C5R$OH0_2#CcmD(r)c;xjTEkU!;t>Ud{^7D7^tzs4! z&sU_w?%ErY8uLvr&!Rk$Okgdj>C>dJLA5P zHJWkw#uJW~f9)!=r=ya2{3IDCOj~x(6xGR3B)E{|C|vi>ooxLE>Qy}NB$kAXBVc%~ zfaCkXjDh|?O)!m}S7}pMdbiWVEM!IsPnU1Y1O7UW*Fx+uz?44CJ5QaY1UqK*(8GI< zs%c>|vtk&VJVD6s{{Rhi-rIYPrrIr#+K_l?6f#AH&(M1fBWw#*CAHwV)=$ltWmCTp zr`zgrt7eaKBmgLdIGk|r>bTdO*XkW9u2*xz^!+C8IJM=bAB=ZO`X!CX!!S|ntyKGY zzC4)jfnv!c2Op-GEq5Cn&P0+0oyJae2K@ycJc4+oVoCfy+T@uXy0~3%#_a~y6IDGh zk}(@jBOi%Ru9WLH6!OlnLXH>M=Rcv*`0nN~W8suxgWFM}ve3<`aT zn^~7DqV5wW-nq$5LagyA4}f&xMzNBzpaYoikND|!8#KIr4w&-+c`;w*(e1xOQAmX( zPDj%xu?Ok%*FI+lWpy;|Euc}#dO1cpO28iYQ>kl8Mt_RHonZ^l$Skq;K8I2rxQy!= zC3KqB)>e#|Tt??0`W<9R9rK-O@fMUSyN&sEUH{#;3MFrnQ*Uz5p88kNr&R5<8LW zsH?VhZ;7>S&)|K zgM}1@B@8sQfhL8ycfcAMQ%6BDLmdONx%U46j-KvRQOcos`ivb7p5BO_94tct>#b4E z-D8tZlrA;ax)>S>=~glqv*XGRstxTuy0U_-#|U#6JXupCm-|Dw)!TQp!m82MNAV8* z@O>9m=HT0u)pPiC@wP$0QR(|@tD}{n*0}oET;|XVn|=amWnyFOTjh*tj?1??;A#zJw1|8t)S%Dme!ATp#12*o zVZ5sDqSnYs;hxyY8jbKui=Pj^JxJ5=uufFDTra+L3aZW#xU5{ed!JoxW}tAgJ5G{b z1B`GO1HQGj9IOhaR1iC9$!sjxJ|Ay!gQ@g8WERYWhq*Y;H2(l;YeG@emvWJ5>{B~n zqY%Tlw|x?iZAcUriGUw5r_{Go(&QE7M`4lQTZKAs@h6Ewj{g9jmUV}+A){|~Uas3$ zVmKVm}KGeBU&W9*TkHX;`k#UkJlefYA%({rmRDv z*LjthN7KEm)ay0sdXXxj9t>_U2eCR^yjyyCZ_Qg;t12Lmwj`ZY41EB}(zH95aJn+n zyG}Uyj}k~9U!I~;-6m?XiySFCEtse%aFI)iXrWY!8{Tou<&q;tmY} zoAd&eHlJtipj>JaC@E>cWyyJD2&i-Df9@F5T?g4F@L^MRzSGB0!z?2ulzlP>f8Sj# zX6V$^^)pu0Tx#cOWbqXP;bR}&0DEe}x9rHIa4OMbjR&H8kJnyvRs2^waTA4nm#NWz z1!LnK=m)RnPrik2?a^=9_Bxy8z&oTv$r4~Z zkL;r)0re!{07>jM;>&SFTr%a7%B$j_d)ux)ax%xcCAj}xztDEA~QuB zFax)%w|~OE{{TL~WRNxachpP$Pukyf+~(X}NVD1=f_W)yc6W7Z=_YRsG@K;jy!(I# zaGin-<@IsyjqywNhw4n!^%v@jt)*?OiE8R8JW1oMsV)2{pz!j12;8djRqlB{LE`6q z?_=#NuJxh3-u88->3gtJOGQAl*3>|>Z5)at;qfyc4ar|GEb>AzfChY=`oiaai`T)X z5w|?9D(ZhjI;pevJ%@eN*tXr0uW8e*9c?Y5<>FN=Ybyw=CX2>%#zUO41s;q?a!2Sl z{tiF2`*nY5{{YF3`KW?D$74?pjmxlVm_W}09g7xT_&GUI?T+xI=}yz!JFIW(=GCX% z_u9K}+(}beO(jyrPy9gY@HEQ@6N$k*@&Hv|URvRvqIAP|eUiGXXX;MTx^lH7;%jYe zQd3k-3h)f^G9~zgGs7P_|e(;qvBCE3f$(@z4f!{#4J(64Pj;`BJ zTQwAu!qKeI96FK+$U08@JoV3Q_2Z`Yz2RxEf@-O$Ba*TxhZ2l=FD@A+K`7${oE2e{ zjOxOgvNYs`5OMSEuFO(!_O3MXiY$8ktLrC9E}RU!U9Sqx*|u zQhnid3Su*~98wu`8SY0WDiq{nxFlyIJ+<}!0O9W+X1*a5#-1_rUk&~z{u`IWW^~YI zGiT(hj|eHq_t(B2PjG!krnEUY#}Wsi*TS1QUwwM2UNA{quWi<`ahu`(A}E}XDUq-b z(^=G6YUvZiZZ4pe=8Oo}in#7rE<1KT^Q@S;RUDhK_c{X73eeZvZkDL&iTqjb>)%#y zOnP~`?sKfr*k=^AE99D3xa4QMDQ|DfLi$;>F59PfTW!|3!x-m|dELJZaVri)_wU=c z>#pZoSfErZ7zIWE`D0#J_=CnhfQVxjPuY7P;lBm`V&7w61f5>8?b^1n-ei(mxcKE`g!A(r*#q0=bB$RQsA>QsE04vWL#6w* zlD4)7j@l`FM*Lnhe1i{{WBqmG#<$v!{{V0=?7h=8M@rh$pYp5Tr*#glTX(=(DJwBI z{NyXig8cF6kI!7kxhvN9bZV7D%=rrujz{V}HPLs?mAfVQn>4oh)-{O946r)1Z=B^$ za6unTe!8b>I!C&e8k)fnGDj$hU~%VQPpH?a@M$!Cua=r=SO}wcIK~uY>gCx#XDz|HS*q?gHMY>k#S0i2rgA-asldn7pVLeO?7?)R zx#6#L^IHRg&%u&rTzX(+56?R4N#lAb$zgs%<3s#AuaE}_@K-&{LhxO6jP&_K~Lw9L!cs}Rxu0JZP)@1nbJZrXPJ2&boo zUDN>5x`5C5-~sy$b7lS{fH(R=%Irb>DLHr&xB#jCoNR059ciz=+vJL!)A(rY4=(=W z+qSHWzSM^6YN@8TQPKG3HV7s_265ZI2>r&IWTX->A|d)~OrfdD-~r#hyymCGUTNgHyVGA67D7+`Ti!}Zmpxq3lY zw(7L?p@UJ#=ToL@XX!pb{CF!hfk+|$y=1GYT0!a z(lj)$;wWGX1U|o(tUar0ihFk2qS>8k@|&~0l1a=BD2wG5*rMgc!f zSab&4bX?o%SgNm~0BeV=@i$ojVRv+17Qh3E%B{BLlD4|8F?6SxvO4 zUNjI>Mxh6kU<_wR=(hO)O40B`-v`@8;IzRh9t}bk1P`9L6YERP7omeiuw*2Yw}eB9 zKy&ieueflh5uWE(jV*!&!&I*k?Tu$qX`%4Xhs2O|gz9Xq&C-AsUH3aAZJ6>k>QY35 z%$?6{0jG-UXro4qr~nNv$!n3>r4gJDmu(4?cPWjG1i@J>Ne6~P6tL6Cq&omf z>~p3EvxX!#w zV4{BsqiG-4%r%qJfW_7&1fMbY)sPfp$QcSfMYa|llxSr|sTHx0&$f?6;$Y{{A5*B6 zNt53rIq#w2Fchy>X^n$_l-3Pv&>ZxL4Z~#8ty|fmhg?!muXWvmmEi3VnTong8^_oy|+>ft)6q<|%C;7dz z>#ar}+)5tax%bpm1t=UcnfE91)`x;pGuVw2H24S8=Z$JG<2dd5=nfTxC81&JFm(~Z zjFJzpVl$&s#hiBa_tYwiV5c6q83R-fRiQ^9=ef?XmUdMH93Op1l|f<1cK6hBp|ZFD z{Pb3!So}izk(_$#7pO^l9Apn|VA1h7#s|w<+$i_&jZ5sHT4s!AAo_ZD(CUU@I}gt% zQ{;T)a_m03g-|lNUu_p5Rj9LZAA}K+`)VAIk-<(5x6dfS%IJKqd0_tf8c-aqGr`Tf z{PaGe6a-*rzos-upAZlSeQIb6IBq?)Ntfz@$q7~&9-6}g82MDNuge{^ha#u*9-6`5i7HQjugh3+ z41Kibm6||7QW3Ipo%JF&KBNy``0uE3sX51?)QH&Rf^tF8T2h?}InF)%XpKAe$r>3O z8~}AP7W((jrK{wkuuH{F1+qQ$1{WT_-#u>+k74WYsQAli$^cuBC+JJnP>cx><2X0IE@p#W;xH&F`rS ztvX;fNc7ZsDf{wJJ+&s7Jb23bcgWBa+@k`NRklmwfq{-*+GMm+2*3xnJ7-#AMJl9# zGw5-m)D+Jn0GRB3^dzQNWM0`rAB?09+4BLbGi=q;(GC(W6~CDKX$poTP6HOn#t8Xn z+;z@~tly?TMxAFOMjgVpu9T`nlb4qx81>Ydqn@T>k@N0G0Vg^m zMYJcGOS>@t01Xf{lt3swJq(jB7B^xsf$M{>Ufoor7pHDH!6)BO7VBJ=^#Vj32cf|4 zs8=!ZQ>KHm*ap%p_n*HLRDj49>n zd!E{yr~m;j7>M-!j-*@iB^!Q>_tHaO@OgzkLuYldT0>pje_f1Gy(g zMA4MVVVq+~)K#a7;F0suSS}?-IcGW~Z5C1R3u7!XqW1cxOdfc^#*F6 z6QCh0EmkP>_QBHr`P#7V{l7JyS1L&o#yyL#bqDF46SU4|rWq_q>aS= zhdeua>(VumTJv9P?@fKEiG8nfb@0ITI{2~<+=hNyh)VPv>%vX}Tz5Y`e6Ef7TRQi# z>~$3_Z7V4yknscCzIEtwLwQJ1=ze<7E1o$S`DajWS88iiV9KPE=m)-{id0i8Gegh# ziGoHk*!pS}{{H}L+g9nW_jy`6XaF)g#$2c;1G41$k?pK0Zj)3@9jV$na+xn6z{&K+ zeY6toccz-Ydp+`w2c+hrF)Vz;t^qk7n9tAt8n7&?CY0!R?$xZPS*UKQSIj9105U(D z(<-?m^~R0UOe!Pf2b6aC5&4ZprnA~9+|3QDjwU_%#|ne#k5E29Y904)ixV*u59b&&RW~hqn;XcmM>O`agp^pIM14pNyVyO>d?s< z;TA|INfql)$(5CX`Dy-pRK5?2o{imr?nZ)D?Zl`ho5?17DH#2Av1dHmK&z#MfW|f$ z^(6afdcgv?;63xEi~R)D_(ckF+p*9Q1d+Hdm?zxocT&MqZLlYaoM3^G$4rcbqPRZT z_0rWf!{MC(MeIAB6@t6QCm9Of+K32E`(~D`REne|DHzU+Z(1nkr--b)rQ_Uc4W6<( zN=Sk*ATCZ%eCkA%vDMD6P!y0xJL-t;s4C8~3E`{2Q-FJoZ(8JPSBbM5NBByeJzw@> z%8OlZPvJQ8sO~}e=`OczyfPJ$TmjtbSXMqLEO$AjpTm{gx$TdAHCWw{p9XJHf-|7) zWsaSeW{iaO8Zm4M81W+ZQ4OKUncd=cAvf9iwcZ-!J2$E40UlS_F z;>g*;A!FS3^d0rLtlfLqT^ZT6o67$HG?m{AR47uCi3HNgRLRLAY#c|CgUN^h5%b2l zKkZk#x^cbeqr6b={yUp*D1zNjOIq1(axaRn4m^Y}m^dK$Ks~XpUaYUWT;wv`u2pr8 z@;v3LCuvEM@y+tYo=t(1?}499cQil4$5b0Ej-lLF=(zgt9~x3(V6)iT=)Ljw{_4K) zwco7cYi+tJd*u^QlF+p6PK+?cId;kUHy{tO_17}bJ;JUCDXMB^k~&lo!j8m*Uj9*^ z&r(vEy_Y?)oo=nQz`~4n8uFey<4t>Aq=Sy<pS0WR^uZ1GYW%uXU-Ksf#Zz-kH~sUZ#}FozWy` zn(+yp2f6PWsZ_;J-=f(C`|o+x+c}-1Bt9564cc=W|~6I=fBfl zQ9vprSf*nbAIv|;Of>sySqNqg`44?++)+N?v^ByiXq}XS!TS^WY1S5ZHnNY$K=E49 zZR5m{dKWk!uBK5{FHM+NBXt zO5QT(fKK6#mRRdXBmr7A6Wc-YNl<%ak6n2j)X$efSPsAso~WeUw=2v|EQVL&dn-0D zLHF;bt*_Jyc&ekIy0YQ1hi1VC<)YhJP(I4E5t2mYs#NFO8P?`(cJT-6uPEfAuY<>> zbYMU^2Pa=VXbB%Lo`En7+QIzY{dM;RE7*_AQD$dM@h1TM^`&bbChh?mT_aj9H01e* zx6@12uz{a#GS*kd%Z5+^`ssG(RR;rx9-1mDu$69W5MsiUnU?N<53!*zmZedM9@-X7Hvw3p`(2IjOW)=R;np5#k=Re zhAlj@FDxGZ!(OyfKr`H9-%e`G_bKyMMjO{3uC)E;(6?efz4SS;AC(DiN__*>j(+^7b?@;$-<|=KuD^tYY9EFn#oq@+Aj`%so znyuXuy4-B?LtJEnrPGW=j>>*ydyl5CU5m45Hr19oc8&=AB?`nKQQO}>{{Wtz{bX#5 z0?J6zK1n&Cpl#bt(z=NythO3nU4Uj8YwdGKTQW&{-}fuJcNx)(^_Y$Zxp}7i2G%{+_as#b_L$w;z>w` zL|m0QAnNQ!a6iLXOw`4Io=EZrc#=Id$n{b%p?;N*ZE(4ogKpmLl^zVXiDd2*_^3e7 z=6!T>pQbya5j8_1Q-lY@jQ8jHA8*%I_2YK!yF&PqR7QS$N2Zsi>lV|NGGM4ZyMO8p zYWBIGz{1Ehkh2BZRpUJ~Tjqv#RH%p*W#x|gRFVKGTD3`NBgkbP$olE7{{U*R@5}mK zXs>Tbp)hIIEO_ou;v}Bl!_!(K>1OQi(Muar$V%{8JL_CBM!{sPlEm_81h;Q!?rj^v zMp8FZ-23ZQZK9^WrJ{k-RW0Ea@bl%>tshT5=AflniD?RV9_y&q{iRPwa`=gcPx9y3 z9aFW82HLHfClCQgwmmgUMMrH8;yQTn^0CQ~{JZK$RBq#F*d@B#?8{eDs(2uTxpR+9 z5Aiz2uJE=cvzXrQ7FG((f6hSdbv>#g0$uu2^-vJd7@#ZI58(b6();l}7M| zES39Kww3B7V^dKad`q@NaaA87+qv}i)uGY-q%N-|#Q%SOhYT@+?WGH+LAJ%pUR9KF%tLd|JNoAuW4CSwsH!SdM898bXq?wsm4Svp!MkT% z)=ea5$Z2%l404KiwLlNE=q~RJh4G{p2 zL;16=j1lY!9V~g1Jhc6nra$0mld1&W}U}yU|i{O+1Dc(<4u^^ zu;7efep(e|=~Xm$wzw6YFp>sM-#pTi0UKc=Ib zOo4RV5<&qv^u~UAmshr|w=|Awn^Z1T@>9dp8WC~X z)L3E zyuH6|C2lC{?L4OO7%H5MdSh18tWl^q1Lvhp({HA)rIMe}upl?c{PgWEptbqoXVqzg znN8(Zko6LHrB4-6J7rzY3DK|Z@T!D~Y9f${ zmaA>rMp*tKotHe6_EF#5>(s}igHX-wE5|=ssM5b4p|Vby6F7|8*2bXw^qHMIUqrFNCgDgwvw>I(tpQIBtZHt|Kr6&IlAzwE?#NXzicVSNx;Z#53KKUA* z9paEixp27c$LFq?($hgBD~|nTxPij5tycw>B|`Zie)=eqeEXeOw%fdDzAP$0Ugztk zdMo5}#2ET~#(`PZQPY8*8P%aC*1QUUiG&P6S4a?JMatWUYuoVD;_ zoeg(H4X=pz*PtDHkVbX)ZCbD`d{lh3i9mIcZGGEOT`fj1J%+GkQ`;JlKqFXqXWP?P zXbV&s6FrFibq%Qkw~3Da+A?DL1FRaHH*Pr52PKwTSFfW-R^&X#-$EkWFvK22Pdtaa z5!?@#(@!$dp(L^|ZAX@sLYyysJ+l^ywUSLZak7@9vr|&8TP)tBlc?-zu=03Ziu>rb zQnHd55Wi1-1D+|~MhXh2$d1~4ZrzerIb#eM30nJD^*oSbHS_~Xvf5BcW_AsO-@mS` ziu*FRCS)A_^QFqGMo$swPjjxU696bKMxqk#Qm++O@af^~PCE^FZJ@U)0cIY9<)+wd z@Y4VhGRM^8SX4dSui{!#Eff8*`Pull@3RLrng=9 zMJSi}SmHf2B3t;GgDWXf+z)fDk+wsXfVO>4`;JHJ_0(Pp4pcGuWb16VxmW~~wmpWmd}7X_(Li8(kDj-- zH+Kt_B%7CmxWf!Fo=q)OyitFA)uhzMHg)_WSj2#SL9|YV<)>#UP1Gx9S4IWHa!@*Jdfl@ z<*tm4!>DWk52iiFzCq*D>V2uv&x&7s{uqNubZnPTn;)9NY2!~t#xFYv@7h~>P1D`0TMa(kq^T6QTY#?%219x1;34A<#edGfA`Vd%mzX18+B5BwFIT#U zQPCcSUgC=UzZFXb%6a}4o|&VJnM%mRw1q<`d>%L)MIG;zCR!Ix_UT6e8-jT$D-3%1*dlH z8{2H!`&@Ag^mH*5Tg4!Sf=4KxQ2;LaK=H}P1&5Tzph@awF5EofPzr2xDRz%ShFnF?%ICzM|Ao2$#eU7Z&ux#$H zbqd&eaaV7)TJ}ZK+$t&Vml|q$YNEMD-@!-{o&NxaII85i8CGxsBN~-$p`oF_E#}un zOG+uGh)Yn)3IgvLQaMxx<=Z5qpTMWSovHVQ>{CkCxVOs@h(FC0|G zAUJ4PA~NG0!OjYue!yC5ZF`E@OMJ7}LtR5%63tIMP8lSPhCv5koc{o7UY%{uru6Zy z8yrOHoeC8p;j?xbikfaf5;g^v0~IqE-jD(?hChIh=9G$D!9=37reW+Hw~U zQ>Sd~F}zqIaJ?7Vdhu$wTR!`E?vTyotV(t<_%FvjkE#B$@=ik|H3s;g3eg@b@wAQCV;`{ayv&ZsTN z_DZijFEtyvwy zrqn8F;seGs&CHDYg1)%=;~CZEu{Qm&sNlH#I($bSIAfNN<_5a{CF88q$JEofI{yGQ z$?$*S*Xm!>)ikt&@=Ki{=)KQn-QwJJm$r&foJ0_e2UF^=oaBC3^wrljV-EaKDfy9| zL@`Pb06PsvXp1uB_s_n*cdXV)uawI%vc9FD(8uBN2w@b}HNT3SvIarz^4HY#jKoZU z<$LQDEJqMK0ixFT{{Sb;C>ZUHbL@^5_Ank)I*7!`#iI7drkCNcQVQ>hcop&Ay6L(} z;dNx>2j}Un1H+C2L|~uq1EOS(ZwfvpoRz1*hL#a3CP^8<&?}vEtQlq=8lK<}eNL;Y z&y@1O`ssS@RO-H-zW)F%8xC@)fk;)x8dpLRVoRR>-SjbGNRNQyDt+28M zoab6aQZ7kgPqv7-gt`kVn3)tRKa_eAsB+S?Fz#C?^wgs|y7%?Z&sx-nZz1j*wySwf z+9_uR7>PjR>#dBkDDo-E{0%` zmYAv5ddg)pN0G=Jg1))dsJu|Z-J^w)ZwV8>aph4>(apCt0{9Tf^+-8#GWnSNv~O!| zI{Ocl(1_6bjAZ`0y&$vg+C~i>wgSWX_zeE~oFTPJc^G3-f6>-=_@s{%au$gECN^Yp zs*yuIQu2*_zdU;D5w}@epM`>P+;%##Yi%^K)GUb@5wY*Y<5F719HUBOg#S*IQ>mrDG#LhrX7o?UfNbuQKE0qfTqLB$hdYgvEEVRM2Il zjDUL#dL06iBH*fkNbl>bK05uqdq(hPh1oq-$x=TceZIO)zsGB(s&U^o+15u_y#9_1Z`D*!4aG^@1A0Pzd*H9`JY!U#-2Snw_8C^&779fnBSoKoS zMv;^d-y{0#Q%njrK^?)-ii!~;@(Mpq2C1hpu~2>VLn8`~6gk;XZvFjx`f4k$kmPzD zZJ4^AE$!*3?ESIdzJ=IU4JipsSwn&O>){dwBR@@PN|L$r90RXfrCG3KBirSw?`p!; zI{WtT{yG&?822BZG*&{aPFQ}rgHkX!ja8?NgdU+XbB|A!wIM6->Gjmvg8u+Fsru(o zv&5bxpRPSL1gNrdTOIL%>#a&~NbTF@thsW|Pq(hLf>uI4dSq^-xf-TMG!8PB$xYd9Ion-6>+Z*5D25!iAxuRqK4fZCaexkcgZt_<0|x`sx2C580OgF4?ldUHsT4`c z{K`oDw9Rg(R!~>5&OLo}3fQeK6#8=Srwe^8EK0I7jORYO0*GaJ@YJJnMfCUd)~}7M zjzE(}dwl)$%&{cVs;3_QnACc!T#}wBs<`#es*|YpOBFSBti&v2a`YJQsIl4Vt}TYa z&#rXwYP81`jAQ|hI}_=tRTLDkWuw9zcO&0W1p|Fj9F`$Q4<%CA#z&~vg16uhbAH3y zMedae2smQr9=Os?+IgpP9ZoesAbGA4X)k{jAw(lN^5FVw-bol~T=|c_bh}MZwB&*T z&%SlNtNHdPwu+MXE%Vfm7nU>f_BtO|T+B&k`Qu+pPzdeZd+23MfP!*Ie%<}FKq0=% zO!W@u%k%fvh~@->@7xa9)`^`)N6h={0B}cR^e59s8ivuTT7?P-E)u zn%OBdEzKAZ2pzSYbCPn58%ywbynbIjO^IqdV<3Cy*Fz*d!rdOEcSqu=02O1~>8TXc zo?tIwod2t={WW)OD=Gl=KnuU^x;0n0DbJZB5oF`)*!9+V2&zgZ z%5bKuujj7o4@WhOW+2TF(@7VU&INfgo zqHhW24iNUwa69OgvvJj15JO2QUl5K=nGD0_$alxnQTl5fWdmp0Xs(Bz?3YSj8L#|%xm7f0qS$LLuxI8I+@-f@z_0jrG$+~T~V^d+dR0*nxLl8Xq zckHA#bL-pOXIBk^x((i+cJ95nt6dtEcQKq~diNj^-?wb{&XnkkIZbSWTrO6(#a&BG z)XyMxa0hkw)O($(poM8M>)4M?bd~=Aq4bl~OEsciDB~d;*!;7qlX-0Ew%drOEh2Xr z&usj)ZFqMDM=*s&?kjAKD-Pq|N>!1{pTZ>e{<^YvGQe|z#~!B|Osb?4sd&efd;GN0 z5{?R6c)T#BzdcN%au|7rHJxp};_|AL1KM?)N8i5Dsy)<<$iqc zt%trUw`JC@S<}&J2J|J4{y(1^?JY2 zM^i24)poTksur0{r1;P)I1+>yN_DkK}POr3XYVFOpXlLB;Q<57#d!me*wknH2=zYS)RxI;4!=zJ{{WMS%MM@wc%ItR1SUCHIs8K->906{h_$^(JRBa~hsk;t z{{RnY#BE_29sPc3bEFoU+aFCf?Uuf(qN++N2&v4~5-ZB#R{*;x!8jh@x%JbC0apv{ zty4+ir>Fy3ja*_jD)}IKYli1;aVxmi?E$JibySM1xETDj7mtkOtXKr-)P-fI%)_}k z8jVp4B^$gsB!kC@@0|@Rv?@w!S!P&JWwYP5F{u>xr)ifdk)21|w6fDcrsN%}-OE2C z+wvN0g`;)Kf!jrpsAX!72&vRz2Vvh;&sY*Cx5ZkLpja|ElkfEZ0Mz!?jc_Ny#BGD0 z-&L1UsovpYnN~#&7-r&o=SI#_bBU33%IyF>~rfV@Y(gx)5a-ojW&JO^*Cy{e@FHTDkgP)S8PmqGqb800L1J+q)cgz}1m%>MPa78&$%pWyTmc zY1ZJkM-)K=mL!rpd+Basb6EhAUR;Q*|Cy z?|BgSSpg$C8cw|KM-=TMIbbxKa_U7aV2H~(Bj@R*>9<@p(2%kb%iBJ>7POOSk;?tp zCPoTL`TVr6alH;q%(x_aoe7ref}qCIfUGl}2fW=Qjl7cv$Ja+nscf&i%`+0MfCsjO z%`B64!32zrMi)e4OCL>d7YcU@B3$Rx{ItffoS=K?Etb0_P1><3AQ@>0A5B=$bdcL% zj;_5!ry=4MKZiiJHEk6gf5g;6-@_o}jas*kr`nB~?eM|Lir`7xI(TUmvpCwWFZ9+s zTl_t$F(LOXeKf075=`YVf8(k5JA`x8Jf(vdB>i+TM3c5587EI`aI!d|^3kb2OyvE2 zH9Ffs%;PJ|zow-dRZ$?gz&`q)LqXuOGQTN3duXbXi)~mN3uDq;LK>*Ub8L6^*G6o8 zgKn@d)*V&&=??W2JHCv8r5BRYJ@b_w~WlgC!cH$2{T>n%v8q(URERY{{XvAG&d-kh|3S16mrWP06s%VGvDei zmGehmM8XFujOe)Ik3**95nCusG>m0%fP;@r{eF5kH`OhxdR?n2!&OZJl|G%aK+#GI z^|GXRQPd!p)sT!GEUBnaW|%amwiNvJx=L9cgQ6s4cPAJ*(9$4C;WHbpI0PnGkEWwF z^NByh10DTz0W0`btt^qTEIY6rvIe!?C5dU7W1UgYp!d~=WkVqf9_Q-q1&*1ffT3uZ zhgR%BA1!mX?CTx#aNMPqE4=YWSn!S`#|!ev@2P!GyHin5H8EtJ&UrEQ&VE{`pqV77 zX$N3WU^TWVn$c?%l9%$G67_n!I995XLfwcY_SLnqx_v#uo+`VH=rX;Oj^t{b+VwnZ zV&duvZ&EuAbcWyD)Jbey&kw|^0rD8seSw8hhTc(X4xd|Tt0JiqVG|xv>T&hclrcd< znWiNB;P=Lo?YG&hrBKxfR1ZPvoifw3(!rJ-S-WFCy3YIVR+a(TeR8Og<4%N+;1U1z2u-Wo2D?Q8RF3+YRfj6#FUR z9xt1huAOA2j;6VpO5h&HOf+P$3#6d68))3&ET zq9`$r;CK1z1$9%Z6;J@sWf=iwN(w(R>-lFzBd$;8d=Nf*QI_GsO9mqv*0*&Hg5$TY zuB`}ibu~2X7_iUC>J;*lFl6oW($T(f?6058Ukk~XBRJFoxKOwhMdCwHWFt8`#z+QO zC#U%83S4sd2PaeEls+(WPp*hxbOw|PiUnhrjGq0y^}3FhR8z$Yu6|l6ABMmyk3+9z zl~F(*nkzgd?H6b@d|VK-XWzb(ulFRSM`^=w!S16@S6ZZW3(pwUW7G@9zJ}K`%`#*I z*q^4h>0>fDG!9lBRDvcKUkNX8U9HzyVib?#x*YJwb^idjNPC{gH1!7KXi0~Ne~Ph_ zfI#oq`ghWu&v3Mt4~(Ln<5iHk;oG)#Vr`rKH{G8TBoeznnB_7~ef8~Q(Z5E}=C1=T zx;=Bt9gm81=nW+IUD+M8a?m}}nka~pFh9%|03)#XUr~>)eF4{E#SC#GtZ}LZ000I6 z8sF`9Jgk8C z&b~igYcg@~jbdldU^{&E#ii)11@%Dzd;4i>{Yz6>O)62ci5W;+(*p1K@%Es1YGe5Emte%J`yRAWAXYpwju zIh$NF>bU2^9M|q?$D&HNZJo(Nq}Nh~`SEbT{-Z^0`9a1s&wnt^Fm(IHco@zIA3pk7 zo}MTxSfoKi_s+5j%!KY*PLxGkO8P3&tg5+Q+A|G7WEnlrzJ#qRGx(?1-%>-WDIB|v zDc~Lxnn*wPp+ja+@*2{8q2X5I*hUd@2!gZszw~QV;R@l#7GaWz2%driq;Y! zZ0lcyGvD&o;=?({yzBuv^wos708rWK6uurjgYT^q+M|$V03EyNxgm$9w6bSBMwlE& z2_`U7jcp6Y#2CwD{Ij4{)KZ**2#rDRPpQ?6)ZG675YW55j!N2MAs{gH)|jUNyJ%dboM%VfOye>$8nC@ zoHo@l@;qRMA1_U6J}bA7u>Sxk-H=x~cokHW7};O9)B5USUG5aPMTuER?7>EVeO~qb zJfpcp%NlVkymRdU*$#VV}ZvaUUSCtH~vntN5zL82XQM zsP7eIg_ITmda>=NsJ0#923DCt&mQACBOb%4XhKz}E$$F&SGPdU;bHz;sDEOrS*Q&} zixkP*Ipv)Nx@{(zo5CQBE=p7`(d z&bMj&Mlv@w%bBb2xr4Snhbor1?V5BU`q4<$^{ zKopQfigY&p()(Od#VTHDA~^G_0te}xbYk(?OSU-Wa%cV<)a>d8(D<%+@T$&8S1P^F z<*oEKi-pcd7VC9gQ$_~SGYYJ5P2xteAS8OIA-OpRx%3*IFZ@9lhH3hZqVvH0`XKNR;d%UPSJHKe z$Gq=Phvt`hVfJ05v&~C*-Z%N~G~%8KlG>r7i6;SBi=M@l5rDWIy>qUBdir>e0Kw1G zUer_ghl-vcoRjabnu;C;NY1`Vtk%!3ldGt8mG{37@Yp;q9)^{)KUL?)Lc@@5=i6LM z{{V#R?Oj*VZktnd*JjnETc3JGAd+CiogD!3yMg`ZZz`Wm2l;EXYG8t%7oJH1Bx+rl zoB#)MPQRaDwr5%;>(AO7bZvjXo1I~js|%$S-cxtj z05bLQFVzs4%oe)hjPpEa#V9-SStB|1{$uOu?ms|pmtCb>MIXY@L2QziC#I${&*Ia^ z5;77n=))L9JVP9I$FbK2{e~c|w)HY8=~-ftt<|Y3G@>#GD8>OXzkfmH0~r}$3D;)R zTEvxAm9uvP zD)93!Y-cP^Mufv%CgG6MTWc1*Y72iqVi8wmnMr4cv{FY6+vaI;2Bz zPSqYAEfoiX)5|l+BUn#~3IUgp1ClTmixGpITU_!0POuRxRZSESC;mOBqMblTnO(zR zHhHRe(ku5T8B*C80OWzbo?4pAoek>CJmTeCjpD`e1)e#^RI_-If)sJVWyV)HJ@881 zHs1Q#wY1UhdsKyGSzeysh~!B@RX!3(hETX=8N_{v&Oj@uwH4Q=w##9;P+T6Krf(7% zB%?9~Y=T@L;k15%dk{`D+b0Lpb57DJ2T)+D2YGeFqucWH2GqGd*5$VCX;D4Sl1eH+ zhcdHUEo@6#@UZ!mAo3!n;9c}2& za~@49$>87vkU+>fOzZyZ+toj4Ez>^Dvc*Y2wF_vsJbYq$cc(>!N~IGhOo&^`az~dW zYI1I!_qV>$_pPzH;GmwOrdaK@wD(GRE1_hDFkn2VW|>!#q?uO?0qxtiyOBT`&_Ts4 zPnbHze3$Be$NOn?T0W8Oozc8E#6KNdNK#m7Ddnk|+9ScFDHvu|Vlp{={{TH!+rR$+ z2=$JhYL(d?IjF3rL}3kO*1ajbM#&092pNdTCk2%HdK}|}Zg*&8y}c9B&|4`Uso?^f z5Yp0++(};J3y?iA>wpJgsHt5;S#qt0OND%t{k$TWMgSLV0!a^&P-J8RewfgEWX=@a z1hb`xWaV|QNWR(~WUuNqE%&H9#@{yDl1>$tsOX?r;)RY2N5C0Jh5=wnY~u%(b=#wM z?XB%=qud)N_eFZN*Q*#SXr>ZG{7)7fhirl{N3k0Gg0|k4ntOThB7uY~l?FF4tg4O6 zk;voNc}6>d$P*vS37cCuDa1Q;yp2$Es_X3r-gm`ZKVmpvM zH439~GD2fVVmLjM1Z*T_c{?ZNM1uD1-tz8Km}Wmb-u2(Q_8Fcpf$mmb~x{-m2JqDS3g}3 zlCOcsEaO6bQwOR(m3@XAQmN}kd*kP&gsvR3pI-j}ENVm*puS1(ka3*}&J~cX`v&{F z*=U-UkHBPOkX|sweFGm<~-)elK=Eq>_8*@bhoe;)nywbAdKO4RMg2Tc46s&N4BGic7h)PShjKr zKDt=iokp~78bH$4K}}MeM6ooO9FO-&^&Pa$@ybw16pG5jDnZC2T=E@sS4g{^6V z7V($1F{n}nS0xyMsTDO6OnbjzJqDqWLFLHz)qtlf*=sQojey6@=$)3WY9jFdBa^4F z`Dk0hz8Nxm`e;0LaayaEs2Adl3k4pd-$Wa`2riAMxv8L=yT{-5Iu$()t>h~#vH}i# z#E=f4MZah!pTQJW36t508kYB!s3YO&#F#(K<3Jkb@{P`6;Xt2l)5zW;PJG1o!PE+^ zpg5O`RBRv1M4xfk;He_2W{O`zrAYw(n);`9SZSmP)zLR2k`W0Q`sskY93@jbu6>_z zNTY`@&mHrq65XeekQ{6$ig@rEAXEYKRPLFA%xn0MbLPJW9=XFF7N(ZAD}OdjNB-^%FVB#-cl(K#||m8l_$BYLYG^B8LZlId}BN zs1*nlgU<<4K_B;MRLO$C_QA)djnub3UHv_Nx*aoPAg`{WLWGoM_tvgbXVO1N*lu{M+&u;n~%C!fVzx;LJuOW*IV_`~->l9P!2De5D0Atft@>bd_d>yfZ zH6&xP4ci)x5`_akqg#}Y#P}ot?40N!Tah}s7iFUR?`;<09^Ld0!JLH#T*0q>b0b*m0uu|0r}~& z-FfiiUQLtlk*GzX9HvSt>x~nS4M{~K)4p`aOLCT}6`m8{K7$z2eY*A%V0)3D!;LV< ze+?K$3lKi|(9sEvbt8tXMwn5k6?X>71ok86pcS`yn2`*C_x!a0)lDu;u6~~(s>(g# zY`M?ku>pR0?cYn)X@E-)*WW~HDgxw|B#u7nkDCWN8uJeRqrdghAQW#-5`{hRPBb!@@y9TI zH99FzFc4!`%DbdaA&eFn<=pCZI8&5W%VXbAVUAgXw;X+bdMiUkBFW6S#xbG@mg;tq z51j};#~PncR!|ja!9PE)x4}sp#9J9ZUi#Vagp-KMwuzPXP+ zY%M@3BM74>(_R;dcO-Z1op@%Aamm0ea0aziN?r%}d@=5)---ORD%aCh(m+B<}fO+;B&HdgSPnR3OiW z7bp7YI7YTS5lP3A=fiGG^dng^D~vGIcx0^RO#T-Pb_x!E$6p(rBFW&p@sONxI*QbV zRFCke$@T5)ud}T)*3#3&XO>k6qa}xZKsSo2j}z|NBOpc#%1o#^8SQ{i^wnCJM5m^P zsXRI1Nf7#n86Vd}Yc{=>x?w!jqmUeX9D5(@-}(&_E|J6I&Q>r6TP@grr(VM}GcP!0 zR$j*{bCK+IVA6zIk4HmCY^PdkWf7wKWam-uc6w{Ix}t`%rK65?;_Rdhe)=L%5*TB) zgl-E9UtoAvq|-AYkC;&0f%YTw)q|B)g%-(U+f-qwDQ(dBkwzo&Swk6AjGQ;We_aH= zbbD>xsw1hSl1c-DBv^+a=h)z$-Ti)f((TJ;?|r$N+gl2+hFq(_aK&?zl|9dV`<-XD zy0auT0dKV#iSf(khv(b+>qA=e=8W3TT*l$zk;-0=?E7tORdG_uRV+wU#W7b7PCVVm zVl=VTDjlb2gYMcYDtcR#pTuEH4-k9%pWD;rs~*R^ZM%jeS8JlHkvvZbN#S`(_wSy- zeQ~Y(gKW`mRDmu~M&cG`T!KoHF_3Et^wTHZ7Qz%8 zbvKlfF%TFeVEcTub81@r0D?Fi+?4{se5JY2i3Ms&Fi#Rl!Sf*W^!3I^u8?}aZ8bJO zzNl!K(nIGZNMs}C5B{h8Y{)H^`ZjS*M^6BlVT^GFE&1cuQ7*RXQ)jB6nlv=#Ha>4p zp0k1hu(Xk4is8M)k%?M4VeU?F2d0A?F!*CCMxjr!_0`3>_C;;R=`z`p?hF;k5Gdb5NUrnMA}CoJTAhiqzn9Ek*eW*Hv6^@Svge~Bs{ zU(;U7(aIT6@gw?uH9$NR+7y=N(*BY;=s>_mFBxmQQowp=^6(2A_&vFKU zj>_2Vt0v8EMZ~QRd0>y8o$VBn!%r(XBzSB<86MhRu%u1H!;_Mn0i8U{OI>Q9in5B{ zYfQb03FxrMNqXAw6$-NT^k1|Fj0FR+>Sx{ zYobg;Ipyi?tv)3@GjzmUfkh+3VVW)GUJ0@CTKGa286z6j_|GIH@fyx)p+W248rFxJ zmOl!p%K=nwI5^}rUT!$ns&9sBi4QPA0duQDrkVc}=9*^Y7rM9e9Y#)*=claPImF=aML60T;3$&H(*%jag8&1-zs3)`sVlqs|biDN2>hnJRx>WnJ2mKtWT1 z-_tt#1v1L`A0wgHsY}4P&&ZtW9x#o(q03gZ(iDtxIUZr_ub#S8IW5F}bTQo%d zs8v;f4=ZCj&BEFdDx1pz#7W;!P3mO)E`Ln~sjUm@-ltGn;#VYNxcAj4PE$0u0O%xH zNMJkU`W*+Tx)wZ3l1I-&lHf=&hx|kL)JmqA2O2Rx$ZRo0JnCp zf#I5&6geP(J&u?>p=NQ)DMM?JM5b^uet!Cw1-4pxrDme!rG`lM8g$$CDCcyJYK#%) z01W>6VV;J|4LOc((gy5Q>13+{!Yi=0u)EST#XPG377^tF^&!7aS#-BL8l^uD-c{CFTOX3T6(= zC>^oyub!Gpc=*b}kgf(s4nDe_S5}e4Sy(Xxx96Z!Rn=5B8IR?q3r;&*!qn6-Qc4;$ z1V7>!&WZdaVgLpR#&sSDiBZeB9l`h1f^fWjMy(DM3f}@3S7}210QJyUs;H55o{p@uP@-kM#w+v{lCG&KxSkD4Qo@y3m`5S0$&SMaL}R#b%Ke6Py{pO%n! zcKxE;v=U5e+3FRTA~&z+qI=@UcCL6Oc^#sF22R~*7B)_QXJ>a?moKJ z8$lLI#UtEK&=o_tw=G8Hxk)4CiyYxbq}lf6T+y_?12D&_^cuEq9UG$C6h9f@nQC$P z2W)A5Demt44Z3LI2k@e4-9SbXL~aKuL{mvaI`M2anJw2UtcFR-$Z_edHyb6wdDW@n zlfUwm(d!Pyy0KYaCsy^t3~Gyq2-*rMVXMB;P2(4GuY%dr{C!HUij^tRP)GpFx2V#@ zaMn_=r>dbmzCix~hL~u!#U;j_CU}f24{@B5G?!7yO=a*Dw(1>4LxVJIryq!Ve%h9s zy0W=~F<%U0>75U)+cAoET4=cO@8<4wK7xv-7Vz0lLDC&vlfkSM-%D|gq~HRcN7(vl zy4vx)0e*h^PqNyH9yFi@&%T@}k{Hl;#x#O`7M3C_1O_q+44-{q(4u1T;V43r14aP?AgWKt?wRa>LJoBJcS5+i{!#W@<32t)oT$MbV2j%n7 zY2^s#xz4uKTmv6mcJ=w_e9{*M^ONbL+LdcFaUk~XpRT?8#g`=?wuH;r@(1+S%Q7e| zTNw7yQXRl1nku(;4Uvz}N9pR-MshLv>b;8P;dz7q09{Rr_*?Nmzt2-??1Vi!8_-U} zIrPr8$#arX02bsJD*>kj9Ts0l}sfgF{$^_0bHRk+=6c?ud`d3?3@haznQQx z@A~VV_aNLAHC2$@9pzX-Gb@ZD{zUfIWF@U2rW|4t`?h;vX?pvzcHPNZO1pecwHYpj ze5do*W5c{fnp5U&t}lvsWSZvNT}zIwn_9~y6I?HqQo^K<36Q8$+utL&{IR0ellP@$ zc6%K$m4NcTdlCNt0js-tbh3u`Y+7q|1QD%1OkoEcpOMC^`hAlXnx;0Ph{0C_0WXIy zaB=?t9eS8NPAywa9QrRAsPKujE&z;r`l-8qk96!^#Yp;sY_yK3_lwf81)l+cDMDPvBLf$<4A$_x*Kf*gA7+tF0Ass4*xR zTn_r-_>-VyV2bKds_A11(+$6bMBCB|$PZ@ct$h=#L?lL>z{WUNvt6+}9 z+gQ`aumKcbfj|RNI}?MiD&j8-+B6!<)+bzeU=rSkw!TRtNAK!=HLw6Oa5duyhn;`~ zd*f7zY%WL#(>m5=RXxsis!F)keRT<|5S$V|dVnf)m|N;R3w_$3FzG8XcUJ}^nb%PYkrG}Y)-A5PlX(nlaY@_ojW+P10~jFT$F zq>kmg4Pcv&NC^yijC!foo{2eX!gV3Ia%ZSg3Ge+iq^y|oayZbKcN$b+0C{}0TAE`j z@+6O@sI|@HB5Z-@3n;4PRv9NC`e>~+NMJkudW-P>AmlI`=Z$<6$J_epL;{}I5Q+&w z)?z{P(4jd-$1hE7TC#D0r4|&?AVh;>-&w4#J@o-6Bn@m?{<;z=7;>H_`Ri)R559-2 z!M*jElni&(QXu6#Ki6LJ&uv3ljy-j;W+3|NsTS{5Epe|(k6<;XBP5-WYEr@n<80~^ zMKP`1weZ*6N1-0N+u$$qu^HBu${aAxpeh#ED@3%xv)eh;N$qIy6yQ7kG)+i2*Pi+? z`Z!B5hb8a1<5GMs-%V{>YVijLBSn}ldw@0Ss$)mgB_wIuJ1A7t{u6f{z58loQ^6|v zlo5@5RYC8p(C4u99kd14l*X_DMMA2yKx1JVE`7UtXlm{09G)dp9;Eiu7eAh}jxxtM z@}FH_Rn1Vq$DR`Owi)1rv+#eH5un3uiKX!p+@z`P#Wi4XTyZ0}%U>jE7{Y<5H4h!p z9UBj2Q(mpLG-gUCwybi`l7yVDkZ)T~385qpD?UnrP%H_)9KG z()Q)rDRWkujS(0q0Tcz~bKLyBHPO*{pGCs)@myaL@I$C!EziL%bknC>SNk(Va<1EU z_pN3#EUy@m*T0nVBi8^NdmUMd2m`)=?VDR#VOn*O)+Gc8nMdM2r?!vlovNABN?hY> zui^T3X`pKw(A;HseLZogRaJ%ohF?#7YH8rzj-b|fY{ffzV@MpWk2qZU_TcML=?B@P zcf+wl|5MlEwrJo<@>+n{`NcFdRa1S769ox9=-@omz(+~V8cP-`C z9sO?TA5QJL2P9a99f+?sf)nbKbf$r)le$c$S&ae_~jU=llZ z#U}0CKOIp;4bGn7MJRacsllmP;^E~mx|rmXpCZ621C>+UkVd&9?9XD}hj`1l_SV#U zg}Q>@Jv~)K)UNbVG4RSPk|6~TE+2$5;PzA8uSMN2eM`3SiluIju-o~{$#{vSig_f< zn4)>P95XOhC7%Vj@&ksv&a%t!yO0n9XKRH8OoA%wh=w<*bc&(tD)MI62*F;N_V5zP3m#}RT17{g() zqIYSmo5N?8s(I97EWjS*4O*4^&#Dj$MZ0O*A$V@~`nsW1 z_YQQ=BCIVDM`Z<1BHf)q@{oNQg+ogX;;tHsgiEuph^mgTnbuW4^Ag7-WE^0Dk=q@$ zW^8T6Rc557hUJ@eER{3VLK>1rKumZo6Yw5yFv^42K1tQ;H6l_ZDn}Dz0jiX*+nZx~ zQ&;r*>9uJ#jQ2{KYni@NTIyO#x~P0c;%2BsMPgh6%H*+;yApM0)%~CComaSB_g3Vi znv$;NS#D__n7hjp(m>JjRsn`xTr2Wc4aD&)*y>gB_6fhG)`xOdRF|GcnuULl8nGzK z;Urh{l8ca`amTl&tZtpqG?v=U!EV0RR$ElgC#0)Jj3~rqe}c}@vkv2s5#%`-?X1#k zoP4Z(e*P()7Mzf%D0)M-ucmq}xkXtuHM(<8SuB*(8h4RLegGI6PDd;s%DBJr)W}3Pgy0pk!#T^sn$YZkT4C7C8J`&)CCMd!R6{jq11?Oe|lT@me*QEisSIk zvcoGYm|7<*6P{s&W&0IQ-fSHAI-hK;wb?fGRyt}HTbepo)(9@uT-l_I5M+jFS=$k? z1h60ydt)k1vk)*&P`WkEo11T5cI1%RCZVmiDMqRADpExSiOB#qeR%%>c!T-pOSdh@ zRp3n>y07^2m5~EXqk|7nbB@Gz#s}g*A)dLn(vG8E>g`*i)lFMZED0SLs8Y`pGD<@$ zlnNL!C@L^8>*gGkYMI@?XHB0qY?V_*bh9iq0*a!Jh9|D@B;Z+PDxurMZ{@~EY#t}J zwQ1(Fwdee-voP||tDTqCJ;&3X>ulefYUJ=%QB54>UCtPc2S&zxtN~W~YxZ-Yy=U2- zbl7ljZI@bPrxLv-TrM#sElOjYPwa7!Lkxxl5O8()nZLR9>6YRYCV5gi+kH%aEgfuY+zBJ}$o6$A#al9JgrU?=NV9SwlE!}DdL*pbcJwZQn13Tapf|(0f;BetCBE5 z!3PzUN7^rUOL1zNOC7V|8YNbZszio1Qh7dAgD)UQ;sg%fx~2tGw@Bo;iv`Mp6>R)e zsIm9-Y=YmX&*!ahRL4+^T3!JdNXBPLO84|5uwZfSa64cb{Ctt5X2O$| zQb(yHvHdk#q|~c)X=6u{o>+L8;~dsQk8TV=Be%$U_xVJg7}9?9b0VTF@xs+b$OAY~ zqbDcpliSx>Pl@Xt??_XIhfLgt1kXQKH?2&GJX@xJ8@$R?4+=J6<{0h>1$z%p_`uJ6 zZQWGr98s+eHuZXir;yDo(!=4GE?AOJu=N3QK*!%R7) zF+6*=k)vjIl`0~M%XS<>u~0z$!TI{>f)BMV@;Wt=J6#1(37?9Xn8UZf@X)a%*SN>0 z@6MF>gr|9-l8I?$hF=KJ3g#Dn_yNzMKhqxC@(bKBTumL)tKur0D@ceraz3PU#z((# zgP&9Hr?Xe9i`{ujew$AwO9JR9e%dWWwDVjx>Ue~xkVR5qIVS^%e1Z9vIKj>`H1S~n z0Kz@Itu05!g56g|CpZNye5A6t$V^P64kH6SyNr?QHO!MyRD29qDj$fZf%79RML>~b zfQ*oep_sAkJlV&&8WVEaHk;+DW}v2unko2Bl@JU|$Y3}tk>w*jvBdjn{{YP9dq+{^ zeGm-{EjGr5`Wv=?@Q2%)-S@8j>4naYifLnt3cEdARdM&nKM+XK@ZvJxh@WhG>gw3v zYMz007NVM$Z1p1EYbqC#QdcaLa`M0>0GU-;#(xSH&JHpGI{eAm>0p~*#R-74YJ-6x3*pzAsB@2RmTJnG9Nmm@Q$-cF^yW_%-xW)>CQeIYCj~M{9g1hyA3a)@Kee^;f=XC-Es9y>kS~v4 zPdcn2PBK|>c$1JmdYj?L zPfGO^*UFWw^-|uSmbrgs_0w-&Dk(nT-82=lNThr?oC$x@UOucxxEaUw)vZUqmgNCQ z!m!B3d*j=;?XIg!UM+^g<&s!w!jn0<$|OELXNc@hN%z!RtE-_T$&u}(s*B$l@Xwr+ ztrOkI&K%(TX`#M}W&WrXZ&4X5!v|7g5(Ac9RJ5OJK9$d1O+j+5s-d2A4I!2=(ZJZr zS7j#$+vV@+-$p39`_o&K+9bDLym}k7vO+5gn9`i7Vf;jFI^~xG%kB@SeFHU65qrWn zY36P=6=>3ekI&oC_R|%LM_SmYO#c84gLWS+4Yg7Vs8OP2b#CF5zdGg>BBBzIBnH3qJWhJ2)*GjbZFsXZg9 z&mVtnX;=({J{~^0Vra^@fAG{<;Ex9#yZdUbS_IH4fjR_jq` zJifTpIm0)g{<@mWp4{>6sKs0<$jJ7{)smV+y06da$Xwnt7G zyW@}7Ti!Ao10VtKt*|B(hCRM`)sB$e;&q7Ol{DN!kpAQ*Pnr93heoQ*P1Y~Y>2 z&*h;K(n;cwLHgCq4bfqrA*}F1!-w-#(g(hA^fq zqtiZ~+R1Xq0G~Iup@$hKwtHafbW-sE9Opgt6%x}Z(jO0L}}b1$vyPD8|6pL zpWj3%rtUkRmaKXzx=obp2u?|?nWl4tC#SxBG%gyXL>Y7P_1A{9#^L$oAKyjDR0=f- zSjh1hXBj>H^&Yyo2I8kU`eUb%NNTu_BirSpG*WW+8OLFb2cd_=#}Vi>!*8Jq zGwM&%wyfb0$}2?9Km~haOxDUonZ{5b)6+w(7Re@HaC`kVV{P5H&xi1`J7nn+ya1gW zNh&2hxe*8Oa6NrAUf*q%;fuqG0S04{Z#ov#oO?&1nlVfL5j=sqg50{q-knT`KO@!BtU39U}*1J{tyC!NFxCwh8*^ z-a#FXbutQqkYg=1qS*6E7>&a5!0bo|1Gn#>mVL<$&ZtwT6Tto<>P~&ehi^+|*6DaL z$2&y}#s&jmb~*`k+A;0gYHO7(&QVnF$A~xp{PaKyLu%QL)yv0>5$bd*=~Zu`{v^!2 zk7aMJf$h!E$rDjrWqd!TwJ=TtEn?g91C z%5I=X6-eL_U>H)qnbkeH_Zw5Zi$gmSR19+M`RQ7hcQB`sC6t)~^v*Q#1&c~DkXKG# zH=UlU*E|&NURk3nkCsQzRlOGNdK}WlG^r{MA%P>ewySGy4Z&R zTTyVl)2V_8nU}>F8Tse*(%l};Q(AWmOj|d5-LAKD6-7}r@J39fh7=4RG5LCW>b|V| zLs#4PZA#nBRo32es-sJke&h#I2cf_tNgZqZLJzyEb|%xdQN!`AH8sYg!5_qo`9MGj z!Nz->>X_S&U0YckaU(JJ9>eq3OH1L~fpnoJN$UZAfbD*vZOzX?PdqnTVL6C9!{UJG z*zTkgk?W-W>9BUMP-!Y}drs{Yy6$GzwJW@a>Mc-%Bi-pj%H0^4pPbEsapH-zY8jN*0hR zR7FtIM;TM?=*WBfuYTUTv}`?5g6%96d}2xElfzU1u|4oUU;E8*v@za9qN*y{nNO;_ zll1rcY1+xWMVSRh7{tf`%dU8znE4$tUk>VmX+T`RkcJl1(_swZ0u&Cw2`dSnJhl5n5D{Ny*70j+b{OChgocO+{?3qM)N( zvplk8h|V$;cmDtlF;8;0#HuNxj$nQL^e(*8)ygMobq)bs{SUUWj#m1@r!ID?-G_IF z;wz+i48hG$90YBObUm9Wy70Bd3131rbO?3|7v{7E^B&M1K zl1?QfXY^C9V(JaH7ORvaD@h(vxcYYO+ghQ@$v7=4t!sN+C;U12=#+bAf|(XdiGw?O zCOxtJH7?nTXT-P(p65EsWmc==zI7Nm8qz{Vs4rmfShP$0F@xVxYxexKYw;_=!+MZ= zjWE<#QlRjp3<&l*+XW)rAagvSQAS3AUnL|8c{q0VKA!p3*yCWnW%N2PQAmjFs+_)B z(JUQ^BxmF`R#6PEXdL)~GB6L*Rwas(pW&38FS{`H{Irc}qwyqB*m=HMvMqMWhHx$bqcZz|V)wEKMqr*%bjSRL^#OIDYplE|flf(n% z8W0hKYIJxV*8rbiuCsidL8f^UUJak1)Y5o&I;D2JF^B9%q1MEEE<1W?f|Wmn`g-a; zVNn_7s~J%Zq^??Nd^rznQi#Ku4?-#Nyh(p+6g4(E#YI=rFX zNWH?XV^)KU6qD5I4~-mrT1LkKa8k z-EEjfERv!Ez3@Q)01XB~nu-?Nu04+Ok9Hg4bShiSp&Y(*% z_8qh9jWbqR>J_}uoFAsNn;#hYG+4%otw7^wH5q^AE&l*!v#p(E0dc7 zod9N1GyXbdWg*X?gtSK{Ky%wtX^wowjWij|By`$p~QN%j$Uy z9eq9iFrW4vFw0Bn57MoqCM|gSZk^D|& zlpa|1)YOxz20Md}-kLh~=(v1<2g_KCa<+qE5>|3@dlBud z!?O&N`e-P<7-TMcgWnq7mp7|oRWJ{*(2-oL2h|X1Sv=jy&$h9bjQEg_<62`f1I620 z3usBCKw8Ad85k<3^BVCID9B`qLk)Ob`uw$nFw_L2z$?m{YI>jZ(4%MOH5#99+d+^u zG-ODnK=jAdY9)T;wa}9rP98zqiv0B^-FT(1h)WEhA9T-gqNg-k2NpQek!#qtZqnA% zLR=DZzW)FtqtfmBGDa~-yi{OdXk-=5+lypqg53+n;gjFzq25m_!x%dy>!!zwa(`ViGUpoXlJM3G?wgZy+vGtDQljy~oZ~0+(Knp7}t@*T$sto1G{6kwc6|N zHO{Lt`e2s%{#rE!H10|$e6jvxq>)%D;FFXBqPlpP$079Au`^Tv44ipsrS_UmrKW7L z^wf3R2~8O%B>U=y(1?d5s^w*Nh`w6~2RaVWOCua<{!48uF%w1!$77EAiE*K)q=S;i ziZSYav{uxj9C=881tgDxaCHi~W}$M0xg2EuG{R?a`Gy8%KDZgqpQS&;D_iUxG2V8jGfNmBC0nC!j7W7Af}1xp%eket2%{Pd@vMCh8e{4*1RoN|2K zwFcopk^rbk3FtkvR%c~iSSLd2s}zi98USrHv{DN2BpjFdeqP$Fx6a+DhP`(M9L&6U z$0CH}2q)ByS#_1M07q{B09`{^sjf)S%AwXp#t+L|v~!ppye@vPPTfm7WmAw`ZjfDK zN=jK} zV18p#cIMEmpsA&)xYetgToEfkc|Xr5J@ff?_SZ&zWEzOP*dcN>`W;T5e<`+=VpF+j z)b`Fh;OlU1{<@D4jaT?ZarE@oz;mxXd0xB>Exd{JI*(H^3xL|#Z~;Fp52(q=W2+fU zlL{pBu#>-aKV3$om^AowBzNw8wISk+4$cSXs7_gB3lnk#_tQlz#>Q4PCApMS+c*PI z{vDd3R%8r4jy*N6a@R+0rtuZdLglgRrMg|zc(c>gNEEN3?}Pg3%#Fpi7I(_f?WHr{ zX{ey4Y$qU7xKX5NX&b&{nUs1EK7TzBecMjbVrG%^>Uj3iD6cd#Q!QpvmvPK)md9nwfKH6u6BY`kje%ef^-4Ia7!4MJKzI7e9vrHO3A%0%k zVS-6AlFdYLidGCYak}JSk4<{>#Cw7C(tVEOQ9fO#JWryL-#Rr6&CIcUsrJsZJ}rip zrfN3@Da$;W85+tt3jQK7twn(#^1#o}UI>AHe9kl^dZz-XB*PxM`{D>az5DA*D&rip z`fKdu_8qjnp&gaDRUG`!5!Eufm$*`(V~G&A|3IRoXb+J|VPmW~!#0LvanA3SPi zvz}KpFioXqgc7f!PNyGEk_t5UjjWnHJMCn5OV`FiS)3W!-EgX+DtA$tsGT2v9~tc193CqPpGt`^;R20Lgb z>fakjW80eTySE*_(MmIkD(6`FkTbs7Mh1RaqBpPp6gp~ml9yxjt!BU+Dz4X*Mep1E)GFCI_A)Q$ zpgM@hbqr5Emw7_z7$v_K<)PQz-?lczJav1Qaoa60O5!-=uB(m(cPFp~$jR5{PVD~x z!ZG%T+!R$CcW>IZrIM;(RNQU!^2;PEj{FR=w0R%iDt?$FI_2J@-M3ccpZiO?w}r!U z)zk+^tFN9(Wkv)M#JM;_>HzKX`RGommH_2J3%M)zjyt6+u%%2Bq_E1Nqmd6KV0{Q9 zu?OZgQ}2(p583|!VO*-L`?sq03LAwIa-NJ-c+*GU97;wQ^8Wxw@q6Q6h!xw{ea}Tr zXMN*+`>u=yrKM|({sbg@#~&^$>U{^kpg~JCgm}}l8C1Sx^>1F|J^g+3&b0(RJLP_t z_2cdD_G-Rto!_-~bsgU8e%zLdt1?%?W>|p|M#!b)l&cg3j@T#UHTjifqk$lnSyv`0 zBq~ecNICcY2Y;ToiYBP5i6hI%PB9oKj(;ql@z#sYWi=v8YNnPsqmVRG$U_ebMVr+K zZ!(a80>cNB91I55X&hyspAAGUbm!S>@kw2>tL7B9T1ck38aks!-24C{jaF4h1$lt( zPZaeackDF7c(-3Suuau)zFijMY>_?;K}McEO&O?eBsd-eH-ziVGKR|fA@xT4GE~^< zx^Z=C$Gn=_tE|ZD3;0p^d?N&-h#Mr1%%#ZBs*cB2b>;Tey36;SpL0u9QzUCGJvC** zDPoYxAmrp81coHHJg{7n0RS$!Qk{~J(6>f+3n>G0D7fG5uW#EoYP(;Av_hJ$-t7{e z+{rEOOS^&@hjDKQTZNL{Xr{1M;+~#|ZOs}aLEGKyp|ysF2OazMyki7S!Wumo+YtRgNU3f}(!+3R?|!%21(3w9LJ((i6(3zbzZ zE66SJ!x@>8hC^au5Opda3aVHTLce^4Ned=6;eV1QytlebcM|Xl|N-}TgKMB zrDdKJm687Lt*5zo(?b|i!SKVGMjjz5sLG&mBg@}b4ZC~oYn?%NN`$Yv!{M(PY2}Lz zjx5Eb=5SxkzGIQ^k&4Bwo2s(wHRj1rEiv)FCT||?PGpty7y*GZk_Q}-=oN9_un(JZ z=q&b_7VmhP-vl)V8HFmt#&a=Xi^64!ROCqQ@5ca+TteR%F9UU(0}Spy1_4s8GK2H>EXOdW!A3t?reTN{ZJyE>Sf=QOS(p zDO7chShS9-$c&!(168)|x^34gDtisus{3N2iW%yzwKVc5r>g;2j!F)Af&n~2usH49 z7b=^Dt8>s>CY)AHJq)!~RM68;I@1CJA@Ph%2|y%s=gO5BAo9V+C44f5*=^??(+<~) zIb3JBcC|jI4j>6{I${l0A-G)T(bVO-19DS4oPF{>JD{X z?+VJR&f}$Ijov6R#-XXeiP@QnY>!^~>`BkC9rd^Q#QK>C187;J@c3bGo6J?|zIyM~ z4cluQW)Fv?r-|8WDOB{mt;*k3Ft^rIJnb789IG^~&pA`Xa_kSL3HKToHDRZL(s}FFHjCm+oXZm{ zFRyYHlyN?}Bop7ZH5bLS-cpvT+G-l>M#LFXCMa@7Jh@~*269iS_4LxnvuA|SjuDEB zq%;Xmw-l&j3}$Z-w~OPxJ>$WBR$6?z>>tnT~a8cZ8sp+X=a_$2+CT7EO41XVR z2XH$KdYwSJSH*RbDCjDo7WRXIq^;zf9aVUM1~`*~*#LaW@7RQa;)uekAo7=PQN)Q) zbEc&UO(knQ(!Ep7B+U6CUpNJPtTLc}F6ZUGre16g30M_yLpIF{N096r>--ltDU|INs$FbS2iZCQc$VL0pH8qFIXGHJ`~brd&o1KU}O?I{IWaaRAY>{9n=mWl)+I?4Rmr{W4JU6Oujs` zLo%|{fJc;{Rwpal*q_f(Af6i7seT$?jJL?_iRk;L_E#5;D`#)5!=5=LMSulOCPP^}zhK z9RPv3HmR=MvAxq#Ry1{U*6^wD#7oXG430)T;kcZPk&%&)U1_RmX(Ot8y){C}W$~er zCnt#*{&fY1U`8?SGn{8yE?cIQ)Xi&}jykGO8RP6h3PA3;7z5>zjN{keM6D9oE>(3@ z#iK+v%ZNXJWSqm!+b_c##4%xfmegVUYfefYEnvg%^Z~od_gCowsXsn z!vmZgjC%TM-oy5R>Q>jFp|o1Jbe{=K>oAev_@2Rd_#B(R4&Q|Q^PK23yK;u?g`$NP zNZ@aWX{I2^q5TUC-~v7S{IlOdDlNAwbu@KzS*v2FJk<;&POdOJlfZJr40gsd`{{#G zw9{Nc`K3u4Ux&06d)j{3dz{?hmg#G;)zehQt|6rotkE2j*d^E!7ub()QJia}wntI+ z&r+$UmcuOQ^x;}aYNHXzoU@MEIUi6+?lr(s{5=iIjuOT!GKYw|VV8>X9Ey2=GwMgK ztu3k48Xc*0g8grR$t^6A$?){@nB}NEfM}#FSqhXMszwR?CmQPM{8mU@I)>VPS2lkR zicoe6DM;=A0E=nrZI;<8-Px&FsyktZ0aMHmLNWmW_WE|!Piwf_t7*{3Izv(zIw~s& zTyY_Z9l^;xv7BIh^j4pLY^%I;Q_)>sL~_!%i%;Sz5&#@>GCvT=9^{x&F^zX+`OkRGUw9iRx`i?%ZMqS!t#1 zki5A04}7T^1a{YX?Y-M&+}n1CaM_@R4gda_QP)Q`06nkxTN5>ce zCOPBdB9JmlG*TRsfG~bT8g%K8ST`q1>8hwURl=rFMpesI|Ugd=dM+@ zeYzt4)7vaNlWNAWRd@?ibBbOV%JFmHu{gw@o@15z_SLIv>u*o)HzpD8x;bMmQ9zg@ zXE??i1pZp|5bE^vi(`V~%>>aJb4svk>nbD|kP`}}UCwrfI*$-I zKBout)>XFXsadKTMG=K0u|0quy3`#>BOyk%T<4*wNuwk%#y~#0XP0n%R%0ZLdmSa& zs%`s(&rxEprmhsycr$!FqE8L+o-L0*Rorsa1R1O z^g5SHz6d0-g*onYHdG@xA3W)rTSY1RpMNewxi8B#&Gl&qkKr>5pH_TjRBXp4zKKmxU2* z_Rc+VsSw+H=NJTI^wIRQklEvnPlDO$l^u+5JxpokEtz_$7z8%U8KV)Tbh{WAg3WQP}Z0 zC)4MqirYMiA0Vu<|GBee_`o zq-q&(peY`{hf+{iN|x>-|MWJv=B0R zV?L)q-eyzfZ(l*L7NwYZi6i_q5ThR%l21Kpnya63aewMtX(=>*=aR z^IK{vPb`C-MUrCU)6-hn%N(5N9mce@fq4cw&!#=K6>*g()Zm4=TVxY z*?SYMv6B9vcRDanbyeuMsn2|jYkV>%zkh8;lPCc>{{XjH#=x-70Qc0wt_qYreS2y} zI8sJVKAO;xv+*NR>0`khmm^nxig35b0b`$*rqa@e?cdX1Q-BBzy|h-26n0iE*n4Wi zoPu;qY2&X|@A909I--cCyCLfXpJOGr6-d+Dms-VOrjEj(OL zzpjc>o+mldOROyfCW>m2ASma)y{a4|#A_#i?wtq~;v$2?CnxcHXuUOTa{zs`RBF<< z3#C);yO!j$R=l>FsZob6F}fB-&+~bQ(^~c()3|QijQ73aO-)e(#uZA^M;g>Wa6@2Z zh3)dm)secbbe9WzJoES}o@P0~U_Fo1P&Q50+|)mIQMwO@W*}$PNzQ-APwJ4$13syH zZT@11ZfXnVp4Uxj+Da*-fjFRF!m2&Av1;FYhiTM2dzBtqas~(;!TIXiuc?NX15+yU z;t2qE)d$th#|=ZcM9OhJf$yD2{QgoEKgw>_?f(GPsz!{>X{rAJI9ECROZ3%wKUXWI zsfns3X_7BD7i^5`w7J|Qc?z_I`+@TBpt4rTC1Rxd{PnD9n%pZAw4AHO){xt-Ab#Gu=WVY&RTWCj3bBxW5Thqf^}F(yb^I3I z-ur6cws>kIXAsZENsb5ru^oZWpdkHqmPUt29mratdD%*dL`%KWTfNY)iBjc?4?*8g zc8T`=svqD*m&Qp0x9_Wud~^?NZbdzVWlrSJxT! z`fE$w93U5*E^B(4gSCRnUGW(cD$0i+JRL38%T-Y`tvWo48$E|@URU0j*eADA&_^{j zC4Y>Hlg%ksWCPAf1OjpY01XF+rgy6x(pFk-v=c(^O49!T5ldsf0=V;khKozB)4W+U zek%`%X*DrAfU)rZ07)*(w=R^l@Yh_Z<%S8sc$lsO1M)hy_8kSV)W;K$SPZBm)xSL` z?j7m5mYH_tWi)jD1A@q5Q`mO{KEQVL(E1DAWNfuDoJ3zGv4O~YdSgtNOD?K1T|)Sx zus6iu(abj6fUB|fT{BLmIPiN7d+~7j#E->e^(6ahftRRNm0<;4adQ`yLN)*zecRVs zDfZNL^H)b8QG39j|!Jg-Ouj5CYShv4P(nA9D0<=db>5Muo$rM z)kTqyWApvL$6V#VDd%gYM3BP3NX4;@br0Rt7pe++sCc?@1~ZRg?WA4nu*yX(O){@1 zUjAOhoneXLt}X7ma7x?l!oeGCQ7MFP^n-S*;~QXp<yO+rsCrq@|RFJQMAaI0t#W@#9lxGI}&v9Yob++OG?Hv!wNkPfx~V;5y*^=T6MG2MGQ(`xIUU&)0#Ub zD-3YL(XjFpjwE)*p5ffEQAVouMoCy>Inrbl^nwL=k8$cgTK1(?3~s)1J;%0?LTEd1 zoX+Wjbi<(J8vuKqZ;C~o%J2d37+~p6-*1|#rZx$HPasdzM@!VfGOTJ{$7A2rXiGvc zZ9CfMFv7koWRcsqrl-j}WH`c)Oy~u^I-0naR)$m<%N$^8OrIQRW`q;PmjIr}=ybF2 zOdKW(V1fKs?AYz858U=Wj*#rTva;U42YrO{U%@7Gofo6svDL~#@WJ_eYHiBB!jmj& ziQEreLAh0?3_yZ)s@rvnt~ZfqSK@e(zM2LI;1ItAeGi^VCT^J_sGpYz+*i zwM;4)y9{U3<)~8Kl^dTgPp^GwUC9ZYD=|<9sL_Uyfy61-B}gOyFjg5E8da^Us*YkG zkyDe%`{<;#{w+yYeqNf>{0gQiB7nZ*Ix)gg0HA`UnTXDg?V2N3TNB8HqMqX&j=rR{ zTO;PoJWfLZXYik%jabTC4`Iv^f;A5c0hONXq^DY9s-&}ghILh3cD>f3un6MBS?qnt z)!8Lva;ZWF2=CiNswwH&PZR^bs1$B(s+KK*;+$0S&V5Mq))jjifkQ_s=li)B)tJ$& zE8kemw&p_IAz;5j?XHsCmcr4No>fL8 z$~|&EdaN&$W#7R^4W8N4nr$t{l{_uc!5Jns4}<$?CBm1+MnMtn+tXIun<`qKQ=$;3 z*Rj`;^xi_t$}$nhZ4gU2R9v=+0q4Y(A5CeR*5z`e*V`KC6VeKr(viTOi3E>c+J%1T z)m03M4LmGZjFLSLtwQSIP_0Q(52A7U0k5Ey(Zaq!&(Bsi;_2Pq*5xLqa!;WE`e|~r zXIx>7J3`7c?lGfjq=#ilw4|OGmNy(o?~|gG^=2+iU$!xh`Wr<-T|-Vdsqff~YD`qM zuH0jd%Rja>V4-kZO;52TWc%u6Dm>Wpcl7V;tf{uG=4J*;Vgn549)m}%yFTF3t`WO_ zENUvX4wl1FQpmh}lh}_PiXa0J9~QT!k_9@aMj{>vC^-E;kwHdDttt z#!2iovr7+9+2LZ<&9R}aIZf3!R+2*QuHD#70nVGATJzSF4)Co%uVT^v78TaoO0giF<)0r1dzZISH^-b^-T^)wy zcXe3QDiSixeFm*fm$YduRHYh+3YAR}TnB!6T4NFCg0NeoY>!7sP9%l@HbE$^D9C0iMeP<-CB7!9HD*6xxpjOqQ z;{<%MsMA-(6ps_~(7KAXaDRxSA6)9fjw^FX46+k|Pt)5&u2iW~P)Xh~+=6{hw8>l{ z^9LBu&pL|taLvS(AD)V`l4)#uB!WD^yht9yLuF7hCygZszkh9gRed~)ucn4oT$uO9 zH8W@pEG{(k)p%5iKs|{0Y9rd>r>AJ3Jec5Q`yFqJUl90(Lw>rOm}JC{#d!AZ@1n9W zfQ5$IvP#tpG8~mT$@J5uMXrWOnPjF{W7wQ`((S(BkVq9BRC;#N`0gpdvdpYc%T!4v z8vp{9nrlrZDmR813H`O46FdhmAvp9o?V;6|;SnlMFm$_e-N>iI1wi-JWmzG-CxyR9 z#K!KYA1w#2u2Kue!v|H}UhR$|LNWaFq0?`yuZCpfqYOQg%z)uG-Rr>f331y|Z5R0I z)S`(@e?QT zvBhvm`F%0+*E8BTe9$s5W1iX7k8RxMtrg>xD=@|h_0>86RkCt$6`xPJDGf^rJb;{e zMtNxR%M^fckxy*nI;RC&nKI0Ib|dAdn-ucALZ)Nb1sVD2GDaFV1*R#8G@6}=9fnSR zS{qvpW(=SXBe@yW_+?4clAPn)-&+}SJv5MMJu0EV(7Id`a@9dSL&yY?#VtdaV?DhSIQH&6G#h@{;1rR| zY2zLkBS#)M@xkre)6-oYJkXa2+7HLka&<6jn%7F=F~A(sMx(Bymz6nINeSbY9{R?r z>b8_H(@N5KgSpNE>KaE#j9PnSisSpq>;C|Dh{aD~ngJA)>YRt+Q^))@)DT9}9avm% zYMJ1+=%5pB8Dkm3WSn`MBVNT>das>KDHk8^s`~y~YyQt!q^Ai-7{ZLyb?Lq~2P z)Ch=ElaAQaI?SvLr1WJcF2c&q9nLTbkIZlhEvCpS7)Cr{hXV&16BgjNGL)kzTpr8o zsZm!~RdHpbLOsqgu3XJ8H&nYYI51E)izKRW0Y6NQN`a06e1V~OmjspKbDx+R@{;2t zH-#Vssm533terc^TEwBeqx@7ZLD$L;pi``2s6va#fKImf$TB&7eRQf?+Tca39hC-O zw{LxDE{D1>@AB7=55%`}TeqflB9`041;Y&c9ZLh1LvxCV%3CKtrkQq;li}qKm{9$W zJx)9Rdeuv5Rv*L!XSdfzX<|xr5ht+r_ttq{2%xsX3EUo3-1>br_DAB@uIJF}-v0nC zW?S;JFY?wT>(2W4cGOarjq}zdhCR-`KV4&wmZF7XK|1&j*w#yoWcuqKKp$Ngv?iLp z$oDwbM~*X}O$EMg?Wwk76K;LYX|y577Ot(10CV!@!#;=h)eF_Xw)ac+oua;zVOPH8 zza(-kKf_YH(njmp$j*3)PWK8y*Q|DMRD8qJ+e=x zefwyfJ5p(EP{Pb-yIm_Hr=+ETq_R$r#4ivDVpzTgNFa=3=Iu*qp_ZoMagMPmspw)g z6%j{~c6cDGx7^n}pl=z9G-PC^8C9~q z`*zaAu69B)#)?F?w??+bhi}{~HV&XiV1k}V@cf-wLdZ)DaSz|Q3_JS^w|~!D)D8atYqd4KulH-nDh(B~ zI(MfhK^nDeMxG+P{L7QWJ+a@^b#ff5lJ+;t(XgejI!P9H~4D~gX)hKBZ>8fbok&w$9##UBd zAQc4mK8=j}f+y^OwD&ch(SP2Q7usulOD!!dkhLR8B|^#>n-9%+g&cAKY?cGqWT23; z0`BVNU@rhCzK-;Zc5FKh6@q!bHvrbo@SpN$j#*A4hHMucggws=$Cv8Iz34BSPi?JI zQQN*UTB2zsjwuY)99YWmd`Nh_IG7<^`MWYM#xbLDF9^hBP^$g_SK}jDob!QbQbt2;wc(oB=VLk>GA~m zh#kE&PWNJ(!E3a^Pfap`Ffx>8kQOZ>f-nde#(Vbl)if7jQ>4nQ<+a@dzT?ktYWWgwHID1;c9QwyiZyTGdemg(O%|D~|5NJn^4wo1BNFw{LeVgi2!(tS6k+ z2pNKwY@T>;KXy-Hf_=ho>IzA2m0M@0+t%MM=A=q^;aZT52}8p%vA_TYnZRI4SnJ z^OyL*9}~nYgCPr*AgIaGb$8i&XWJ?%cjb21xH1a1rnp5N^-=|^X%u+Oqw~9(g zRgr^v2d$Y6zMpSy3JtjTIytKEDO%xp2&Akrad&9~1LAo&fb0i!?}B^HxY5OFrnYR` zs!-J2ZN>+BmZ^1jgU<@H!#P;ovBpatCk)vK)iJ&8dE^3`{iUHL)lfk9^`d(uGEGlU zQCyM<4~fbK9v~`v$&VH%!Oj5~3xkc5RxQ5Oaw|gX6H+s+STQdX5{V14IouBvM!P%)?s%2FxBiTFrW!iM6wJdZB$cO5n2&rbJJ z)YWw?3K916Gb;8|ML%#O%(8`m;;Zs`aUZNRt*l1z!z~_V9rMdK=I-eh-MrJyS7)rZTCWteA{L>A{Ai?`jDXD`MG`~EmkA;QtW+^v z^3`DdHivQ2Nw@bUs^dWwo<)+rq7xs95DUP+j1`Lv_wu$Bsm=~{&uMf{0!)uy;U7%9 zAgTuExYo-+Xx<4-vXIfq%RE$`%BLSJjQ;>leYWO`Sk@YKf+q0-1y=DGC^^W;?q=*yv-ys- zbd0j`0+ zeVwbUln|vZ;PGS-_>^&6V-6(_u0)FvE!5F-J|TiH6W1ipx z+vGhJq1soczb$&rM@s`M$s)Tdq(j+xvwkn-9Dw!4rcDKHrDCg~T8lH$yPAmWt_{E` z2a+H3xg3tiAfH`Ex(aGq^;_LiOF0n$kW3F@*trkeB(@K8?eE`AjjnC&Am7zhS@|Ou zDtm=B=1O+HNhp~FjFi-;FveMOrLv)!OJkCb$G9G(E5})NhOw>Hbk#g-)u)ipBSqpF z93I2mWD(dL=T3C+(^W?eJ*K_w{kGrjN3l_HPss5SK-RpidB(t zkqi(OR{)%lr?JQ9ppJHeTIv|@ghjo=RF*0PG164sB&non!SEy)F*4)7slfL3&u?+5 zFg?DmuA)mdTyZ3kDhBvr!ZzkR@?(}b7#JS@_|sGzprn?f<#(cr6osOaQvxYjKn%*H zcF8=4&$feFDJ<2sYf}|rsHm8_lvI!_6(f&h=s?NHVS)$DXvCznliTQ~7VC1xjT_O@ z3zbDYW5$TocrHOcV1@l(Imc{cL9SQJ-Bj=!O++vxt>MW_GAWW3?a7Z3>;O6XWNDiH zL}#`}$h4~)r-KYqDw8CqmNM#3A50Q5aG+!z3)=Q-Ww@j@n|?{E>6G|#Jwa5Rl;Dzk zE&x4=9^Xv_ZfjZ8c7K0FF1{2B+3M+}jrR?`Wq8W)nRt-EoQ~rsB!TLCeLIa0bz0bD zw@`dl1t=$)yxCXnoF3U3IRn&vG|3DVbrt^r`0mASh`gu9k?IPb04niS0}P;s$jR(6 z@){L?+w_su&3vr9NenYqv5U^!WsOvU5_T$k{t$36pO&2)o5j)iWkPK){1sEomho_i zL?z^7hCncJ+~AB8#N*dYH1u~XWOXsy9^TZK~EZ8rPdRn+swkVK0ks!Jh85|POpkr+OQ0G{LY*Q0Nm3K^o7rd3%b z8Ie%4B8TkChre_5^anWAfqS#qDXD2^TI-au5fpP3rc_|4?c0);AQ6@sCnL5q=?bcn z-s;rQQ&qaGi#dhC7qK4PnU!tzNvDK$17iBxj|PG!s0mPcwu;$ zB91P_Njy)Ku>kv%k8LthS1koqMJ0T-UJXGYhmj>nm<;kDWRMPh$8bPCy7jjOGux_7 z;;xR9;(KwYjD&UcZrKF-lZ=2)djX|7dn8G8r?}ExLdh*YBT3jXRmM1grw9PZ9DO}K z^g^Zt$;kLB_c%r8siQXa%RcA&4QD{G!*NARio44G7)IiF zHU}1LXCow>{dp88AlEjh<6-fZ7S7}~94S~l#MC4?EJxK59eRY)%(xj%OmFX@5 zpT{Oekz2|<*dUMrI1C8vM`7Dly|t26=I)Y}uGuB7<2RQ>E_6kS@k9{UyDdlUGJw>t#xe{eq$&un$I38iZ9Ii$P4TkO5pIvNo zTPv*CL9?fYwzA)4xV#Y53F?Zci60r7Hz=#?<;Fk&oL~<5)awn-$sHX`cKVOJ<)$ja zoWxpa!5}iJATb?>ZsdNN8%QHt+!qw4t7J-fo@iy^$Gl81TOpKXvG{+N^T3PMu^Jg} zFE7D73d+dx6U43oE5(LReLMWI>!9{dpxWmeL|$4gVY>Haf;z>lmfKArK*%#uFF6+j zz5pCg$o#?VJ8M;{p4D%k<9u4U1!5?SNl-yq8A0WrTz4M0KKatJYjNxt(+d{LE?SJenVN( z2CzjQ5_*F!D#x((YpA<6@fFt5d#0Lz~(!Z9f2e%IPazg`(^aT3tV?Qoelbg zOE8GTB@#0xSCW#!_~4JOeS2%E2Z+Hg1F3VR(9a%r*j*nLvf8eOc~~o)WP1;p)^*8k zEgUpca#S79%Tz_||gnk~{-InUNE6t*Ld?^)scPjWe?lkWmMLh6DT9d}ZDX4JgKHCmm}rVy>L!|qF@Ukj{Ppd>a7p6`>Xk_Ok>6TOi8tdu`VC!}e3!L|Yy4Hu~G+gE#95HVnw&(lI~dvZFi zM5abQTCn6LfQ8Sp?d3qgL`UhNGi`Zf4Bj3Fuer8tavZ!z0Q(ILeVnY_l&^eoKKdZ^ zy@gRy?RRXignw;AJ7z@gP~__Si)vFwN=S#-zI7VEX29S)OZ_!B;Zb2!P_gjFVj%nW z*5$F2f~${zO{;)Wk4uN10D2En$6`Sf%em_KGc6enbCSZsQ&=;Khs0G z6Izq$EG33Qdj7g5n^C0zs(1Xf^Fy{?HsWIbnmJ8ic*yd0Cq9}T$&{;VZK}n9C~^<< z)QY{YO~>#Y`}WnUmKe$wQHJ`B3A$LS6PJ==qbDjxG)*>8I8aq(Zr``? zWtIY@3?I`^wYJj~xG3$D+d7FIEN4qNJ9rX2fE;@bV=md|KLG>|{j~Zm#jsH` z+t*vgte?b#xWVnA%4LG8+MTi;N^$OfnqRo>hDPrfZCsU>=puhI<4~60Z<DO-Uwx&BK$h@Cniz>`Fd!8 zB}?^43C)U(AFj7aPa-H{hZxf;?cWN1EQhhiag7!`U`q%pGllu;8v`l=J1X`@Za4t? zYeazH_9r9drmCHbPormyCq7|M#0u6+i6e=Tl~b|;oSJ#noIK`@m0SdUEOQ|axq9F_zDjT35= zCb(G3P|Ps7*2qX0V}p%k@Gw%mdyRPwE1$+ScvtT!l=BiWeKba%Xuu2apJSlKnF!*2 z4yIBw7E*De0)kN}?J~TMJ-%nw$g4nt5!(niJC~|$Z*-m0uQHboc{pZqcd$=b;rbtu}X(RrNHi>`;V@R zTXzMv#|qi$B9fL0RSKNjk(1`kerMF3YjoEh#)XVUPcCu7F>;=GZS$=}B*=?i%Lkyp$qEp{PnmzN&G}$ewo)mHDupP zZUG>m_4#P69BqK5Nx<#f*HGy=I<5%7^wD}@f(`~xZC?tvEX6dcpoJOq?mKE#6$?!# z1|uZ?Kx-v3b_9F+YE>{YH~@F=>7aG11w3s1qO`Kp+}Y!u;gmOo4`#=IQLcrvQ0>Z! zM5uce7xAMWCJ=so^V`>4`LX7n35;RfA@v#Ut7g+zBy?sNYI7$Z+5TMmYnL^ba=I`P zw+Q{}zSC)?NG+1dMk zN;v`kBy2Ge_vL^)oj2O3Zng?D_x)^qv75rG@!=j?q&DvxSlcK$6Q-0 zAGS*E-6!kZsSuGY zOwvAmh7NPw`VBPMHZ6|J;YyG-O+;8LQ8_H&4KKiLrFZL~y$Zq3E*XuEYq(-aX`H0o;eWXZ$2@n7S$mg)tS-4|aDp{eAEsP(Q zw8r}j8{?vp<+b<(0;dPlTK*W1W23WC%9vSlPPDZ${IuQHfHa{o(j4TD$LFar#f?ie zvdMFNOgl9kiEAP*j1U)YZ%Y z0Q+c22-;~n#da}3AVd*fvxEI*2Q6{O=U&4$qbYw&y3tzxdqR@h*S!B2PYhl%jco%E`30&ho`YkMn8jS6p=i5f8i&5POlss%e9kKHo z_@u3#_$TYFnOyyKn(-dGwLzpWXj)j`lag>dXWvC5sdi#BkEf=f$HWjo{dFN2XZq?@ zq5_dfrYgQ~rg5pL(aeMf0lr!UU9*6DA6;&za~pEbKAHlo1tz97QIU-esN*8ColB{z z5-H=5bRMA0q`3L&!iJPVN<`eq96`v|b$19xOymN?3I?^Ok0BuB4E*(~qJ}94@qK-} z=#qt{tDI|JF^M0L0QVXj7R-vF)#Q{9Hc0wunW(AZ{!`!Ot!p}>@K3@&rjF?e1G@I% zV5JoF@Y4888ld*UKlkWmb*7kc;MpoW05Pc*H8l?xq2jq28iFdzw+!SC-SllG1E}Fm zpyNoK!VW-VBU$)V(=lfRvF<*HLz<;j;6I@KHHo;CJV{>um>MtwSv0oSStu%`63n5B z_5r);a`&>W_4JZPv4w9{0e$pxTares#k=Dp^U%|{rVdlLZ)Wt-a+h?LsXB8&tfFNt zk8EHaGFtj|U|EEsm`22TNk1)ZTk=R42-RQcb@JclM-3VDI+lkDMNZbEhp~&xgsI79#0!U9GoOaO*U0Sq*KC9dU zbh$ibPbANC*!t>aww_k=voI&qKAN%(TBP|+c@%7|FwA9rN3qc{xCEhOr*Ib^JtIvF zz7SQMh2!W?eMF^{)6d}whCREDRa(8oaIA*C$j%>`KAG>Laqb8qrY$QEo(c8UcrG!( zyo(c|mzv6|wGu^8=&HYkbS5C|BI>vWVt>jdBsJ*@rc^hWgQq%M)K!p)qQK?f8s~dd zRY_20EJ@BXN3N_ZE&isJ1abgW_Rf7YGD1HJxTkmGQ~IA|x$YZyj@bxl8G$$;dupnO zqc^(8G1pw7f>Yc9-yOa6XWh3IQGw&4Kg1){9{R1MtlkE!$j>J(MTdOp(C-4RCSbyD ztsvg4Hx0FMmfukzk>hM~Q`;KVMR1xo9wGG871Gart(mH4S9u(gPCfJjUAcc}?L_$Q zJ1Ot2LEfci>E{Wb)oGIu?X( zbDM-pzk14yRb@W@`U6wG>X$3y;CIxe>E__Lf1XngMtkUeXGm{o8bc>8$MBx|AOc;# z(PvA%s)`>^wA~T)6qs=dB7*zL;|quIbMC| z@Q3kdTHA0)LBagH>s!%@2@F(>eD%F8@Nn*4LtRgFU-tP)N)0RN_Sh;I4E+W}eD)2;{0}gQnLC%2cQk zJ|zUEeLHG2oj#G-kzim{cOYjvzwEDPxtDF(sYTBlXo}EN+!m1R09BN{;SUs{&s2USF zD#n?q4$)|b;3ST*61P^d{qKerq6;s>bj_V?_L^0th%Ae2Ysb=m((UtLDHUMZ zXxvZMku9set<>;=T~SQU$YYCw*!gMFUa4(sDj$xhNS#1#FOW#rGfzofbtIunI+1!F3m5?pM2|dcCEx};+)IkL5}I@bOMh1Mur)T@YMzZ z`#uTHg014-+}7WRQ%n6)XV#G{?60WwwUj2i`SYCYdwhOuRY#ut*uk zxzlLm4crDw>*;(>2g|Uy06VA92DV`PXml598puS{)ls+uIaUWicaK&2f77dYx^Kh3Hu$9Yv^Q|aEg(~nOJ|p;?X1RT3<9)K<$klXfHFt}^U%A7>f1Ju8tb^NlwrLMMPza3 z{pK3{I=gjqe(pQNP@hKlh+Q6N=vkyInM7W6m= z(EDkBd-Y$Z9XYktUAKPkw_D<*Qqo3d4>`s%79`8FcO8@y-(QecP1|pjMNv~K#`6IM zJd9X)gb!fHnvCc15ORMl1-RW_>h=Es4LzcIdaf%dL5WIa@_8J2nTrg5A~By|WeszI zBWg1ktQFgP+y4LvrQ+pwuA}K5&7(G$VhK%jy%Jib`8O#NB#}T+6ksy~d4h3{CWYR8 ze)~c73OB!3^-A??f)IQfTU$v%8CAweT5=t~)?(hc2UUHh>td&b*V?3&W~EFcR8)m6 z0;p~%*gd{@`HcXddtQVr^s-b`B=WSg%F-l6ei4LR@&n6{Uim${>lB))r8Es9=`p!a zdluPGxbH1--FA~a0%+r`x>Qs&)1YQ0`LoR(5aZ#x z{{S?KPz4}nOojl1@)^dwv~OGLTPUk9PfrXrlRWY?^%)Z&@|c8K41XmZ^W5N_F^W3| z_p;W_K`kpZ6zx1vG${28*p-Mz7#x;~M=s=c!uQs5Bd;l&Y++N9&09@#0n@;q9J5al zQQ~0WhV7H->&LkL^=HMrsVOZG+bE|-tTf{|zWXl!KJgP8z=@Pg( zulRbEsY=Rj(?DTh$mhN=7u;a_=jZK>_Udcp?zt@VbbcR-O1!S2oaY%Xq#q1=dY`Ta ziO$@k2Hq2#6%^a9qB3Aw+Umd*LEy8p%f(PORg{H3Za4sv6qD#Q!a7rF5ST9p<>8i! zs%C|ggs54SP;n=Z4m_9=#0J8V?O=4br$j=Z613RphrIlV}sk&(C z_RUF_#{*9Cv=Gx%3Ykb*^25I-!y#M`Lf?pFXCr>Z>K5PROR`M5>pI2d+2u2qrUFRs_qvXl_W22SZ=Yz@yR+=4-t?S;sI3zcF4iW z$7R#a`(f`0?6YnwmFC)BnVM4-3{g)ZQat+fvkPZibrlqdewpwUv zqxi#du89?d(0L(Dp8WBGeKC)&bLusoO=NMJIYc6RxC@^ymRPQxV2+l)2+R^*V1i^1 z;h~H=hdhU1xc42tTIp+zRi4XRP_V;YZE8n;LOR(>OUyBi0xZ09oUuM0M;r$EtnLe4 z%W+iM3_E_UDy=Zgz3GtvXTixNfsiqbpEgf?=uP)#)eB_nd)#8*-P}na{v#aV9@!b> zdxt0oeB&9_$*z8+wkXVWrjmG)1df_YO1S4%K*Xz;iHdVR-~}VljO3p1x7z4!TYAYuN54Ki)KI}!OIcA% z7>3)b$Tw->BAiBC1(%b^6x}4(=BzHo?Xpi@Zh;oG*eQo zUBjGWY-6x+ONLHF7AzCHE1|(I^_#xoeZ8%=tj$kRG9!X!TtBa}mMX*4h6A=SkaRO_ z+bl+^=~V^p?|-%%c&NGjD2}wtRJjvzogf2=PTT=ZGXaccbfp}dqQ_^uY?s^-#bKNdN{}AIm&vij0N_jz?kJKEazQ{H}ts$w_Xbp0M{=>bzE22x6cp0CoWS zs}Yb7nEbWn=XE6&H5DCoXDRO$vZA}V3a~6PJ2)rNvJ`&)p1P{7Jwmxjv)PSROSMF5^m0}~hoawI5T2iU#RKkrj`|X<|#&!f~bmo z86y9;M{*e98$Go{WpuXqD;2+XLGNZfFNW5zf zeMMCbCC1?;B_Is^;)F^i2&hrz@Rh*8DhixoeGi)!F}2g}%gvt0Gvc{_$E-;)yj5N9D+Z-5< zCAlB3$svZ%QMGopWtnP)TU==*GgH!42^G&J3d4+y?f_y`fHEB81v;hc_T*4mAh*0w z3V4#DhK{%6BSV zy((%V5TI99_*qe+!zs%Wg_YEDA#?+4-1?B~1&X@kMMq|ZT1u)aiYX~&u7X%o9uRdB z!yHWGxPB}-5DD+C)(YEowrY5ws-=;dp&22qekmdt+$=wcJdO)VmLwJI21v+fsH@(a z_Kuj`?HfAx9k%By!u6Ft60(|SUkPJmWsXA3nNYwn3VZqsZZc51kj=ZWZZcHaX{q;4 z?UvupD%O%mhDw=Zm9XMfsEjdXSllmi03eLy;DxDV+ybVW=R7rUUsF*?X}d>DI4tN& zz|QC+XqF;S7g2-2VX!vajbhm7Zc$mQqpQ5U6!aA0;?<$NNZIE|xJbcO0s;ptf`o8Y zm7!-rn_?Ax~Q)Aifa;7Q=6j0P*OU75-$YIS&@W5tZS2yrP?6C`ii!TsoSNm zk3ELnUlnxJ=pNxLky61>u3VsR8-!%wj_QtaDILHAUA1l5l(*|0U54#V6!uHJbre%W zCOFj6za;?JQpVo0UwN)wb8R=&5LJbJoL6Uvf`{Nn(jA(ngwL&&P^PxmlPK%~!N)3Y5S= zx@W5DS59sf^Uzu^Hj1jst8>(N9~sW7iZzpojH-?>kjKgg7VL0XjF}aCTHUt{u-TzO z3PT-8juvSD0E|d)3W*`#0S=9oST!L5U zjS-gfTS;%0<5#z3yj9kQWvCpUNaPE|#_1fGE<8fOkfDkWSv|_FH7(}8oKI!B)Y_>a zmFZoTS?OPlo*RFkE8(iJKCgqwan6iMKIymL5`E8Uv)pNAMyHZk_|eK0xQ+n3WRaC4 zi*_g5T(b8AZg2Tozy}EB$8K1+4YDg$-oy8mJo0!3TDV0_NimFe5&r-w$W!P5=EJ$h zDoe-N(`8>JtDci>R@&-fnmTrrGdw;kxA4l#B9$Id8O90oj9_Zgv)rpz@9`5`43s`I zO((?C2_5N5Wn>JTl$CJ6HnD`AVA>wrML(&LKlHR7o5UCnjb`MLbX`%0?fGfsR_# z3BfgluA5E*;f>|CcP&h)w{59C98k;ga!T~mL*q=u2Q03|Id^;j20$4dv7r-gx@uY) zN2;yNkTU>_5Q&yWa8Dqh7hdF?pHABS3#y~LTy~VU`(-rqO>v29DeZ4AWT=uj7$#E# z0kC_fa(kSBfKq?*H?cRhbX8l|W=Ba~JveD#rlR5CKl6E`er^?j8NeB1-?kfUTBbRm zN<6;>o!Vjz#&hvp*!@VXsqm>PR7p!zt>Lq;2;~PWfHUO4LPy#iuRf!y(KvmQ-Wu z-#;R9N0|D3b#8SxraL;{vg<#ydy=-zKQA28-qG0|9Rmo#xg|aRU*SGRNZJf2J-2dQw<1eb zdb>kO3rrb)AB1JdAb_ipfsFSbGEQ_#?bUlFx!>-YV>NKGQ3Xvmi5c&L3GO@jjz%&M z&qwMut!2|~-|Y7GCm#@1#UTJ^u?gaK^5AFJCrXxXo-WW??(%LMbxgBH zVi8n`kwa%c%^@Z72W(&lIX$thf;}Xn+tK`Nn)p-DWsclT4j<1 ze-;gIBqBiHGg z=|D*U5EL=E4pQZI@ml(&tE85?YEZ;N77lTbLO>v7Fv!k+UY?qfbli2-lt9o^Gsu7} zk;x$ux*u>G0dl>ulix&PuyOX`EY44??dOgKttVt;tM+9{5 z8__>CQxtKM41Lvu9OJMZhBcP)ylgu?WRl6#tG3vh7$6ZvQ%I9TdKf|rM|T+GC@rgvOJQ7RV^CvBN70TCQSw2Xr<$4-VHnzHKu~1mS`bas#c;pq2UGMvK2yATq@_X z^3DlTPOVz|M$)Hgu6D5$Gl^O15hzTrQltYVRE1QPTnrUCISrG8-C3;?B!)tQh1cfK%fEvUS}m&AY^2AxDZ)=0{N|RFD{x zf=&p=qHb~VRhIkJB|RXlv($V{G0@b{Or^&+@%VZZ=JX7Q$_5EOWUJlYx)>@fdxi=I zNT-m)%AH-Qhz_BV%AOz*+p);(eL&I}NgJ%?6PgASi}XvRbqOTY7mJM;fQ3gj0lZ_L z>WJVH7CaoB=PWajK;5{yF*J||v0tfI!DQfMfQBMQzzoR8^1$SBKDhuaJyb`#MPj;I z5`TlFf;grUf|*Fb1h1p32|04Yupk_k2BVvRTLpHmbVQwc^|vxzmbI2so1_ zPHbb8UN4Cr$Ql=eJ!>)wx@#U1w?IxA>-_9t^|7kTQ-@mROE^HV#1x zjOv;iA8x?(R#@OXrBpWqa2D7kS`KR?ii&?70WLcX2K2$nKA+-sVDyje3DixNi*Aaj z%Si&bN@;^UJh9nEMn(=h0s$VMTIr{Hcv^z7iq%lI0*~Tw3VU%rj4}N^4yRc!5fHM~ zQbi-mtW%g!AGr!o$Y-~IpXPMtzDS#F+|hZ<)ezCmMpy@EY!kDa=J_9k&*ItlD*JQ3AP`3eIHjcC1E#t$hRIZJ(TgAy?`8IQ@6ZOvT zC34FGQ>7xG^DMo{&$;>Pl@hYAE_m&&O;wKhZrTF_PHA6V{95WeCsy{w)*RNcqnjCJ zAh7-PM%lkMt@5+(`gvX%&uIK*3LoeWeRax|cZ6A#tcT=#>F;Q@s^xQpU8-b?4q%sy zxd-&tcf!$-v@&ymx;bg1?g$#x_PT8H@YIlfaj7t*Z4wwe$HZ~RxYUtP+do}oB9_6B zmn*EPC-Ea+Fgg;}$+N+t{dDgn0kNNLU??IZ&}ywpNvmZNc68QDw$X=g+qRp<6l?2_ z`PZvVia^G%bty?jcGynI$T6oFy`fGAiFMJGVR7$!CBo-I}AHyD< z^j4nF0*rWmnwu0nP6*Vy27(ACq(c-R9;6Eet6jAOaU8pVwO+7VZzGH8*R~3AY6#Zwzi4L4hIc53Y5f zMA+N9tsu<#92<3LMdq^WRf>C*MP!S%8ZfTEL#UM0b;uo|f>z_*u!Qj+UzV@Sr%v|n z>#sLS7NQxYP$gK~0I=*EzN-s{*4(yHStPV`MFdz5?}5ol!v24zkreRC-J=C*mrpb& zame^3XQ%N|d6iOrdfyd|s&a%OQafYJ4y9rMoL(%Gt+Z924Io&71Ket!!}w7$Kt@nW zwrqUcoI~n$5`C~~V=}A7$8kQjpmrbz?TO&}TIv4fsRBi8_DCj-8Kgu#`+ z`!7zMh>T?YHHok*4k&;hrn#oG?b}e-tlIi_43@=l+M>9vL#Mt9sZ>9sf5%rZOg__n zGU`=g+0tq3cUdvvQ(Q^~ocyAY9xQ%`i9W#SEjMF;x=mF(WGa)y4Gw!GgptR#tT`z| zgUhxXzO+598w4O7{j^~ErIBjC8-1JGxYW8^41jm53!jZ5*~(VPc`886Qnv z>O)kLZPr&#IE?qxosQJ#>)Sd%Pq$;_7$6w=>4MQ>!!A?$XdL_^XeidzwIqocaf90j zR}Ge)DtbhW0i0qKLdgnk}l{eQa#-X@FBD8Z1A8-$@j9ZNv zm2omDV}XLt>$u8HZQp`kT0)IS^p zjw%LAckPeNjS?}*z=(k5j@k6iw9wMs!I0c4=~x_a5J1b1%(EQ++EWMy$~iX?L%(#Z z7WcSQU7mvf0AP~cOBv$Tu3N$wK{Y8hGy1a-#SC9O&PtW9y~;*R{8$ z(hAsZ`O4R*kJGsAs-FJ<((Tc=?caIUBqAg@@=OaZyLx>VlUr9H zVf6L-uPLtaPZ994;vq6OCd~@^U;9tHyQ|M&y)~vAA(3I?&R$Zi;Ear8)7$5rHS9=Q zYZ~qf>UN5<=FdE#hB&V#;-GsB9Q^z0jp^lvviG~_JbEc=Y2%q>n3OD>K+YKakEXh5 z=}=SnF(8dpc~wRS<*V^%AkhZt;`gg12k_RjS>mQmW}wqaLJeQq3?vc+|3n z?VVNkt=U_5aA)FyI}RgOE!S$*+#>!J$HRX9Qkhfq$U0H9bmHY(J2i6%AXh5H_hXM< zBmO$(LRi6NdRf~e$N>%7Tb1p1NV7g5oq|jX^6j3-=lg2mOgIduAom}ZmMJ=GwkRLs zB>0&KIUMH3KivT7t`t!kctQ4~@uu<+BjraNkwKtUiN+O6uS7Y!kG&Ttps^U&#O z#t6olE9lBj;a`&a4GWqA2|8k3Am*HcM;z3JHX!!&)`--6^|=8U&V@0z-AaxAy56s!Uf(@L zUu|ttef_mgG!X?OmOT!zW8THEs0k~7;|wTV!5H|1R|TygEJ zm4152EYI~3a1W-0Radg-9nO2}O=Z?D2M#go>!3Fast`)a-{v&dv(+fNk?L#6 z%d0*cKKh#t#1b1IXUJ&#rW0mbNS`k2n}3x6ejnu!8M5)zxr}IyP4w zhJ?v;rJM)wq;jP{y%lK2xk5Qns^(3HNgP)d&!&NL} zlfvLHY~w;(NtO!TCyN^Y029B{<*y<$N>$J~T!D;h$?lYo6Glf8SMd|ANp^yqj5lHR z)c|QsBP#@`1cU%NU}{*YSXa!;k@fY`y++|OkP*Nc(E0E3u2-H$eU71GmY!Pfk*A6k zxaS%6*VNZEsmm4~IcMemRb>a(fekW|dETjW5?>K(f`<*gSz@ijd=#VpE_C=9Bt z+~{_db`_-^#c8Apm^t^xnC-WUU;r)1k>9?#<}L44Qe({Cp1t&5pLEp9RaSl>K*$Fg z7e}}wW6M?aFSKS;iEw@Jbu3R$T@mpYx%?+M)ip`GDQ)l>=adkmEX;cWsrK%uT5A}1 zHSx9pBZ~q*EhNKSCW&vAYSL{>eDe5}QhJ>F>9UTVo(NV52bDVx{q;l5){9LIM0AT< zk2I~oMn4zGkUhZFwYKkHcv2-o5aED18dQyN9%Z5@x3XpM{(ASrA0e+GnP&hGQS#RR z01xVPg0&2V9Hu)Fuekebe}+BD)+K(rubQvk z`Y<>;agLIAm4EcA>m>IHR6_2&23z@4zx;J*RkWuPB{IqsA77rU9+%hB#X`}nkpkpC z7u0Ifq^^!gS)Ujlr2FfgFTaJ+gj)b5Yoe8mf5fK|IVX?@wl(aoU{LD5r@nO#d&Rv; zV=5t2k6dXhc=d~9?PPzyHw7dGP`E~wK{)m8plH5P-6o5ajaCdoV42T-ElIUrrzUFF zY>Z@jjdOPM`*G}TtGlV~75+*C0G3JAw2ZulSBOwS^7r-kADBq%SN;M<}~yDF{4S(1t79wgxEfaIzB`(BA9!u31qVmUxlsHLO;mDPTbQ=URB#LEOAxGU2{PcZd@r?nl)n}?nrVMIQ%+WoYpqqg<-C7rmoPuS*#aCl1jKa$iuS} z+-Oz5r~YTo>dop#>az6DXVq^#=eg z-C?Fuu~Np|duQdP+l@k&a@C4~Ph}^zxqGGGZ$6Lj&Ehtm@)zxzmGitd`;EonG>_j3 zCuMBF#Qgav&v*CL=W5+u1HRv2+LWDk+LhO;r#=-eJ?;mRQG#%)8@a$gwwT)PP&g7W z7R#0Gpe@ElVe~o`{jL!o;#393eNU#Uj=6oSKFob5TI)rlb<}T7%S>d6E!NL9H;f0Q zwM1}L2iJ!(Fh(=36y3jV4y9eIB&enoG>}y1j5NqqWA?zwC-)@%b*4ISS)SK|ze{U6 z(_pj`Ww@-4f!m4@Phs3+Rc-gK^;_PKzP{Ug6n6Nt2%Ti}AE00>vwLv?M&r>EVN8*q4OPcvEQ78#}`v*N6;&C$HPPX^=1@!0rVHO|BbU zEqC&3x8v%|)_KIBk5JHpd%h;OSpZH%ogL$rc9-Z`V z#X%g5BZ6DSbhS^MpF6C660dGOxezdWoc3t(8Jgf+>!gF>8h12?Hm|tlbVl#mTaKEE ztaI(Rs;!csP4TePVp)AgFgxS8>^;EOn=9=7zOT0t@z#d4Q$#XmuJUp|!Be@<*BI9j z^(XDk_M+akW}UjJ_arKeDq-7{%Sj9pGcXW|c$paSQgUQ&*vD{mo6`RPwGUmoBXfP* zvNyebTotb=xLWTuGFMX8NTEk5BWDF%FN=&i?p4^KdBlkYKti|1yPc#(M z$NvDYBIW3QXTR;FYM=ZfyAP~3J9W1I083r9s-7f!oD#^7N|OVOqjC=E+#K-8_w>%1 zDeJA3Rz=)2^M|&*DXkS8SSg1Ex!{cB13sGd{{X}Kn6)}h)48SH>lpa2lm7r6=(U~~ z;z625JVt0X@(J_>H_>k-rKXaW**w{)sV2=kJ)-LTJ z^!!|XMnUv6waV4FuUDFxcWv+Es$>GCok`73ae^E9hjIoxVL-^nyx)%h01|k9i0#mg z&mH>@_PwX@kMLKG_=9)&(J{np%iR3ykJVqDXZvejpm-=cLwl{EhFEw_aj2(@#daiM zMx?r^1KfggeX*)0rkANZw(56g^W2vy=BTJOQ`Ao}XXEYDw5lLko0s1ZS*<#$2mY!Z78BN+Ac z*UfdFH7>eBUcTAkz6+=D$V708A9M34WVaN8xKfDZsad8@O%p4i0kBsfk2hi1=vLvk z*I#P^s4X02{8$G8h(N$Ak=&9%J^Kw#+w>OIx*McV5vlPzO0jlxp2e_oaqIK#+a9_* zS4TXdmLkfMc7=?~#qpELm)HfzbMzS}SRJV%fL#ujEUM_x*Hb#v);dg#o+Bt+uO3`` zo;W_Ix6@Ef!L9Nw7u}IJnOZqmaUr{5vcwPvu6uSGeU8y(uD7*)#<3Xqq(%@RjU!SQ zCy(;;1F^^lNmu>4v0WW$X@80sgo6q>x6qE~BxkYtY0=IcXr#G>3krOO3X6){AeknT zNcbseyhzB;nbE(H_Rf2crlDTmy4Ocamg7(8% z$-)vW@V=m|Xz14CcBYxB(=f2$S~P5WFwPD?F5gW!K}Sa&MH#)w9VS6jAP6w1%au+f zhAev#k5ETpp7D~p+er;IDYvMoQaDCdOrbovVUq<(&$A!X-d$YJUnM;yC-7;waE>a8 z-gkt06)wt2T<6QnAP(O8$oT=}QeXk0H*Rax7fPc?Zl|W7;n5PC#l%u9Cj^+|a;@7K zBsP9SK7xD~q?Sthc)q34?grXfc`UT`H0*}1wzXuG$}%vJ0N9V0 zJ|%}NEdeU4YrTAFqm3h1f#PdajkdgudknFkad!JoY zJF|1#DZcUD7l~!Bs(}QJ^QIqIBy*0X;o#<%}F#L!Q;K z_xzu_PqcRS`Ih@=+?!@woh>~zJjjnvIS714QoN%9lwhGa?m+BG8j<_?;YSpk(5=lu zE$TZ>!j)@x4ce-Pk*87Nh;8VzR7^cWyK-36ljbXsI|5Hz*f*UWMLSnsY2~g;A}M7O zQ$Z(?1BQto(*cL~z47g;g}Qmt9h18)w`(ON){BxQRV-)WE7loIk#OT7l{hH#9zD?K zyC0h!4%?)++vP{I)3h$8vS=wPqYPplh$KopL!9}J7v0quo*9_HE>TAEw6zWGZ+3n=(HG%r-ds{tH{3KGgY6;|!b zvCnN6+54W^Z@*PlTP}5UFr-q|Tka8|WtLdO2ZmVi?Vmx|)$gmur+pwuWkZQ>3!d zRXkO+%U|O#k)-hEVwnYqCOiU8ea5=`sMkw>SS&XkrBz#XvP&ef`0G0W1sCXJ*iNhg(15Ukkn*x?Q_ z?Cm@H9&*x2{qlxJmx>1qjjg*6a!pB5d$rkXWu#b{jH?-7st#F)U`PNQ_VmubM|yp> zsqNbzZPC;2D*DNW+@YwJX+&fY;R%X0UO0>?$OXA)9glJrx8F&&?Wb&2?hDL2vX&7T zRkl>tQ`5^>(iTOhDvFgSJeRuv04@pT<{HjzvufCOdOAx*Wpo3@4@TE7ydzpVP@H4% zit+Kdh>9*iW+(AwPa~FjCU5mB?F4ZK`=vH)`z5)$g>bXqw=LeD;~X&wX=j+y(o{eq z20EybqZ09MN`!K79T*llIrDW@?e>3wv(eGiPX$Fg(z`k}O#URC1aITAs2nqZ{8exm z9>D4aV%m4LjW#`1>FT!5=8#-2rU$B|lBH>*Mk>-7C09mzc;m-4E1Znru9mG)8xvGo zE!Nm9^fZ!6)Rgp;%CSl!Y#4c{^2)$AO9RZ{jOBu%+e@r-=$shfnNHr?H^``JCa>J| zGhHHDis-2<6G0@WxMz5hBjK>{!1EK@FmTx{eY9J)Uey7tR%`Xu{6>^5T@y&LDU5=z z6tHobkTU={6Ub-S0VR`gRaQnOsE(Xll_ZguF-WdEVou=+WiNK~?n=$iRXvw$)=^U`Q`XZ|-7OK@ zVUV|J(jX&DagjkNS0k6M2m!-!ZkuKL+#tDFHvF~qRI+qj83}caD%vSk)}4UT?s0y!UM*J2V@nh@#;TOKRUoS> zv5+F?g5Y4|mH_RYT6arTpj}{=-8EIJf|DzCnhGIOC8y%@AdL~5fegni7YpJ!Wp7Y6 z&qZ9tZ&$$X?Xs;QdVX_AqA zcq-6hBniQyF< zQ0o5x!%&2V?0qzwy6BoZh;AE>NliP_no?w-l9p&@LK%Y>Wo$C%(BVR8xUU zTV~{E(J^7T;O% zF;c5H`N+hII1CnL;unh?;jqBMeH7buXwOTcifz#qVXcO~mVyTqFA$DWW0TF6m2#|A zM~1!00hn^gI)~Pcr7ry1)pt94$wPUu-TwKt*RgUb>f&}W$?M%1hE`u(G44BM@28gP zi0`$P6R?%uAk9(4D*hi(KmZQez{k*PT?|H-U|epJC-9P5iP1vwEJL>x`jY4V2SOz+ z8^VoXbEu>L0A}8=Sh~s6OBLECjw-rjdMktxE2`60L!NOCM4S#ivQAX5bDam+sChikcdCgCGbB{YFNcz}xq$X`098zlw?TU@=;eeqAx&$Udl?j6Y1izfHB zM^2-fM?%+V6%mA_o+`ya!<-i8Gp@Sd^*5W0aLH=5z*3pl&s40Ta=9b}+>%#_U~z+k zk*$t*mvHVDeVbpj_FTbu-?j+rukp!ARY4F@{5twcVFZW6#ll$8z$HNlSYtiDTAf2` zqPyOvz1sWpj?>fHx~=O?W1gzp3_wmODb?yJ90CF3oVg}^>i-;1|#fy**3SEx4?ylvPlQdilY zDw74xm&K=8o;ULuxw9u9Dw3_sBoF{xYHgx+x7Wh!Ls3~lT}~Om^1Kk#Cv_@LP7YX% z`U8xd4MnJ>mfvu@Z%br`f*56rTIeP6MKU*-jvcVa%b%GZnK{=YpA(300IjqRR-0YI z)n9O`hE2t9skrU%@tP{i;Z0DK^0>npdogb+woZ8l&Oydw+bQazyHd5p(>uh}!l7x( z)Oae&S<1;2ndRj@y;~#Hk~HUS+`BTxSx;)X)mK|7F0>S}2`OZfcq5D!IPl4D3=b(B zR{$Ig4C4*SQM0zD*Qvb4eW;GP<1Z7^v^-q!cSmTYM)U)S4crz;>+06kO+Beu1q#&DOH&Vr z;{g%y$(JDc)PPB49gm^!sMfkwy`|#CY1}YDS7V@oYF@HwKk_L04#fvg1&D4nNnBK5Zcc_-u7yJ({20I(s=ULABTn*WGsc1 z)1O&eA%hiJWV(PUlbyC$^?VkxOX1T>IEEs@U z4oWCuNg;^rzagBi(Nxym<*u~T$yr4VQPQk%N?vmbAW!8e+~eTyfFC0rvPsm6Xzo>Z zscp2=)fbHx2+c&ES=~^UMrJ{Q#XeXpdjZ7hjbRO-P#0tu1u~kR?QgHPUh0h#(^gS^ z;d7{k43zGn{6gr?Gta~$u|lRdCnL~SduL?PY@PABcY1ouq69WF3L-xjG{n z&wrM>2&mwxoItNw)5}!V5>ZAFnH~;IjtYV5fE6b$G-5ZgrM-_Tfn%L&bse_LbdG-r z-KwrkuOrf@!@?vK;y!V4avfZ9!iNM9eFk%)Vy>#D(`&4)uwG=Osici%f>_CgB6dZO znG66N%Xv?HFQ;%c4{g~byWAm(E%Z{+Ej*IbQBfpN_&MOrk0U}1gCTf^ZXovV26Z;z zWrnVX8X9?0rilDBX0B3Vk_2KuhzP(^M1&qnQ0J18Fa!bxB6d$HIktw}xLoTkYht%6 z)N$jQc8+CkN{2G=zz51ZoMiIk0mibIr8{<#+?BTLGRxq#LsUmBtYqYp6_d=a2N?eV zhC7p~40=!v6MI%3aG2_WV3Nh)V_oT5fYKjYo z5m_3;O;b_g#wp|yDKde}EX(C=`G!%{kO>+(Y2+mqmjtc5dQr4mzTZ_HsL)&Gc9b6Dj1J76S2-RypFA_FEi`8z2n&Wa^2HxFjmueU)E#=(W1>Fp{f&G%>ufAeN?;=JBOq$FWB4 z2OI_@=Q$plA9v|)>7jN79OPIR#h)lx?@3Z zOGV>w#X8g4-Cl@B!U-yInJ0E;|o&+sGxv> z194!)Wjh{Cf!i4Et89@9&Jb>{65T$;vsx-AvhuH`ztSWPRRzMM!J0QJSOqaKQ<(Ub zbKJNfh3})cYYk;QvsTNvF7=c~IO}Q+T~L~;o@n`rV^b~*VjlqVEI}CaKd!xls!-i2 zt}RV$v{F{wDddTbJtu_6lAcaShzkWCm{X8WeFikxFPn39^xirIt+r7@@<|+Xhy-;@ z5M*_e_>82fPTl;ZAzzY~2f*REv;kHc;mVtHs(Wojk41HsT1X>&)>B6H6ox#3F9(h^ z3NoY0z+(rw$7RdD+uk;Nt)(rNsyWvG03*#xlhnxwl$=S!2*rG$D->*c0mXpPdm2>7 zeRq-Q9tWe639a+XBs8@SLCcj@a)p-)P_OzWjs_R57Yh0#X#UVlmv*wwf|yTtEd)_` zUK_LtA}qnf#sOel9CAQGQLAZ&>v!Ei9E7EH?y{=w0$A+xRD(4%)F!Q!sk|u}ULdk2 z5F~~0rvtak7}vM1HP)JWEf)>Dd5uZ&R;6cwoREN_<#-+grw#qN(B$)zc8% z+7Ti;wjaGv8stG`=;qhhcrHcUB z?}42rTxmLMzHhL%##B40RhFc;!r@pj3{F4ojN8#*?Mt*%x`cOg`l9g{p2vRc(^o5BN>w87>Q1&GM5%+Z|Zn*)age9jJ+sI8IO zsLg$KRmjt!{uB)&9||^Ml3%}W*ulX0=ibu0?H`S=s+QeEw&|(FHPgnR7f?v?WK?D! z%wGaGJd_5&;=@bTmioDxNonXVl0*tcQ3Jx^T_jl3lihG={k9FeIpfam8 zsi=aiZi;!5TFQA*l~am3$=D9)eSW^4Txb<#`nq}Q771#gqo^hLC!@ulNE-(SAJFID zUiA*$xVDY{dtsJAK{6{NLZQ)BvUmas2L~g$$j^Lfe%)SVkjTPM50(gK3UTk)diU0` z7nDDggD!R~>nZB2wGh{&tYMLfP7HZ3(>}QL#-Dn7U1;4`gxlAvk)npJ9b&1Fry5zp z9xPeAW0o>IXSnU0>00MWEQFxTsxbET1pAJ}k6&$NXN9RMUV3VkNfiqzre$Yh zr;|6XR~RSs?WM>Bk=f)c1hLpoJDS(L_RTCGdRyx$Fj-CZmqoO7T%rJIgB=S>$(iRabUt z32yv(cI}qVx9skg(Dgd?9VG_fskGNi&T%VKJkiYf$@C+RKm?xMiNH7mNNiCxr>@%g zqH%MLMpJgu-&?A|bdK|9y3Qk^n5{**u3P@17bD^ZAg{0hcF!*3 zws&l`tmZlhwHQMVc#v;t3c4%jl)ClgGLA`ss}~ZN5YNY0wky zTN?FoOv%_JjNq>=Bu|OOj~PvJ(N?hWDe5WYQrPmg2pTW9mhnkZ%fx(g9hJF$!%9?@ z(K_ZDkWl(zwAZ&TaY0m#ElCIn?hm2WJ0l7+3#)o_xh0ctQ^RpescHjYw26!Z=m68m zl~{Hij;d{ey6jWGgHt~#)kKdoN#xJVCmMO1cG>2odb%q3CyGDD(YS1W+UGrn@VXJd z8Ac_j0OOGL*1w7)-%H1F(I`o38I=onIP#Co>Lot&v(z)E#06wxJ#+hf^g9otGVq$k zNjNz=&1EF#(@^OdYGYX=U_*?Id+KC#?~tvWYOB>)Hl#$s#xtEvi9x{cuW0G%;UOd$ zUtZ%yXzi487LdqWC$JrW(3HlDQDTX3K6uvLa6P>>Iqiz1_)f#OV0|?Zl|WKJdHl4Z zn_E|dJ@5&~%UGAd$M|YpFNetS>`3koqrDp$$yWgh&NTv}O4MWkdw%-GWGulEc^{^v z%pj+A!t*}h_Zpi|;4<=wRS&oWLpOP<}k4GpNbPTqBFF!j%;>86^P zqYhkvxfwbb)%3LPzBDDWbWMG55IQ{Mp%(i}%w?*qivcnRZ-1VQQO2(anMM_G0PlhM z>w8zxH7hJ>#E@{KQ0Y=}_?)7*ZrZ0jyC|C&ZV-$1$FbiL7FbLSoQlZ^RVP0_-TUbh zucg)Wa8*jxal1f;}5pc@EDy<7%Pv+(A#; zwwZSnzXuIvEHCIhW+0!-0O}s$*|)k&gHTk{g~7m=kl;tpI&$gtzR5*cm6HG_#$)8! z1M>X!V$Sxx{}x6VKxme=<;Z)8aK1OJa+4yx;b8-3M3iH z1J}65ef{(sdtZ8E)9tr$-uteuJ1v^s5hAK_j~Yy6VvanPc^l9uIXbPr)8B6{k92zd zU9q-hgzl}$Z)J+N;pJ4JrI0Y^6U=g2Kr@hv!CL^Ff(PbrSvtwSdeyrscUJGYO(IJp z8ae?Zd^HS2;71C2C;$LXGQ?!$=sLC*rs?yZ75mqZw{33rid!E^Y%*=y8Dl9m#;b{~ zm=Hk-s!GB>xn}Kp;iQteHaZAE>+{wkF}3b`gYJ+ujl(q zWr>3PHC%*L#TfRAe&@GuD~2A!j&rV!*?(;AlkR)SwB2cLTX`iauvS;BZ3$zXhbYIx z?~D_X+~lr1@MTLyGKPaDPv*{|LkULY&D=JAqfio~;$g!5inj_{xFf5jnkk`~L&qdc z868OMRF6^h(VALv3bG7-y8OE7SK4Q)9VDV#U4rFLS!@z`pLf^A;=~X0a5)T_{{TgR z_r|YHum1pqVy-6Py1Hi!h*)u!g5Xer^;bp&{-al9ti~r^7k5%9Awj{@MXCg17>`X- zeI5Hnbcd_->HV18vB7d!gtZpR@$mI9_rVx%ESSbgjhFyNahzz(KWl%pC9)Krx2!g0 zUmL+I9COO*!MOKCjIyu#LQ>DAq>CA3G*GevWXs%nFbgo-HGyRpZhAD%nvsDJz?{{UsiN}(K^wZ0t@qXN!9 z$_o$*reqi^oSu9~t_jvs*ErxUBLQ{96v|w;383ZIyEhYWH;oiVA5k?bs8Q1Yl$xSrzx%#8a0m`3+8)wG6Est=C(; z^n9YGi}0T3+~^jaM6{?{Au!sp=^r1op{Z{{Wu8zFzBT z{HY^g9D4RTL%-kRt#8A{hnF8cYh*+$&zi~~a<|wRGrc*Lh{$E~{=gjps-v}3CxnR6 zW4I)DI^8lexO9-PKQC=y{{ZH|!8sqEo&r^nUyR?)eptH=kj2fmC7;U49#3wtX1_8&cEJv%$*Ai4bgMvl`# zO)v^1TrmS0HA%E#oT*t9{(bvsORJRyl%;K=s+wSe6YK0W&qcHAs^K#j&u>jNTeiZ} zVO2RC{`#@Dro_5d#w8FiM(vy(WRh^zt|&?2QdawP)K!8uPT>0EwyZ6?YpuAl2-0Vd z`LL%0S2P_8vrpj5RV#)a*kjjEcAc$Z+w_8-j+QvkV=Uh1=5>xuSU3w~G{j`2&4Fuc zQ;r8FMZpD6VXF?BH{<+LSp3MwqZ<24K;Yb9r5P$4#87`s`s+CEwo7#YsFLWd2=C3C zlN_Ir@BKB6?Q_l1`X{nz*eh`Qg*(FHJgfb6l1C;_GPw2wP}ccrYRYI5yhzo95h~!X zZ?CaGB7aR6z{hWvmgW|66Qh-q<%a9gY7zSD>1m>r-C?_(~2Nb{WY_IBxHIWE!}UmQC`08Dd8k|Ad~pMy|lpvY)*<~$L0=< zf^twb&29!1T8j0ioUGlwcqnhfqybo84;eD*`7N$UH`IsrEh38dRET&QzRacL03#Syt1EX~`_i z{JXY)!$d7I2I5{!4EerbXx$j3w#q?Qd=f=ap^$;xXGo?6(x9i4&0{ z86EUas=Uuk(o?|lW6F4sL#)N56{C1_XsWXDN#Mxp6OXTb0GdBB({1`$B&cYlfsws@ z!v{-qMcn6F0L3I#p|1~qN7Lo6N~$L>ZA&qNF{m}D@%j0Aayx1@yNw}xhzkgVRLT)K z01jIkDHK6KP(3vYl2nCB7|GPwYSD-o9sar}G>#BP=GJ*xPfXG%!+IR+=xF7W0motQ zq7aDWP{D={x5Q#Sf%MYB!f62IM@xDY01^n)h^ggHSbX-t&ZNf@_B^xl*DC$2{@ZpQ zk5C=6(>t}Y?Yvf{qN?VXlVpXsMclqMk&W z7KUOahCzZESx!bhMm;no%R^z>GFS8r03N;duw-|}xNGbO_P@P#7P_OP{aW1f+_wbE zYAltt5h9tQM9h#oj24gq%}E51A1AQSawLJLXhJz5c^Bj5A58n502YLerj}td-1=+W zlh_S;B+$fhG=Xq4mh3U5{ms8@8)A#%YN|nYA!CRFT0%$|RZv-vao7W*4WuQ&CK7|( zYtA5d&b7r<9+_ljLgjKop1}UPhLy%zf~CBv+@EafZ9-%LZLFHD5Vb8Sm9Th>fC>E1 zrn9C=-klz$LQ2b*P;f{j>WjS$A0(XB=H`a zaLP$jM6?uSyfGrSJ#pVqs&^Ye=ZRyFZ3wvCq7mQ`+t)f2w^}0Ek%yThqVn;psvNx5aH ze)1Iu)90oN3xtw@LpC$&bWWe4*E$)ZT8Y%Ogm(E25x#BfUfZVd(xGH!9=@IZ^K1732NCQUPI^Zaj0*(1UY7W5OJh^+rHtoq_0ZR%OV4WGOFbKyPZ|{4zAtJ6s&DR z8mUL{LrSk0`LQ7S59)gj9TI>x)#G{UEiI~*r>Ly}DwoE4;C!_kroBv{-V@bLP}9PY zw-|(~WAQ#@XV<>DMuV!`e!;kEHwAs(<$SoKH-#LYRgI5k;sz8if0h6myn1!J;@;Ng zztq>zQAAjuhK40pW*Hf09;ZJoOB@7FjI))|^!u8Ovc`@HUfqwTipRM*q5d}|^y8|o z%~?xS6==pI$C-!oXymub8){*Z0V5|TLrSe5t**GqaY)dGib0&`zBTPteAJ|?NuOb# zbELVq)KkqPLcu&W%M!qL(*4t`mbA<>v|y+6XFi%B(u9-3v8wL!!5NXVx%BU)`L{Ev zB*=RoT^%b&}Ui>mBO#O$^lxI7SIzfd2q}fWZ9D zF{|5LssNr9?^k^@%i?&a0Qc{p7romuN#VgGV0z%`CLO_FU;brzhVFzmMn63lr=zK4 z4KR#8GRk}Z09{=L07PhS_et0ooxooFvyBvc&B?%ehh`vP9Q$eoGt$!2ac(T$rykmY zbiBeLC>$uqZAwCp#k!@XY{=jP*muzyUGGuZ#OM@vVo!Zj^WP;&TAp#^p&8}|2mRVp z-#t#H+Hs@{FnWnj1S#E!)$Ie7U^&K`t=_10Laf*gDBLeaOIYTXX`{zD!vZo1>^=LR zO&#fW?CF-)vAw#Zaogny7mFJ-s;!KEK0x>X09c;n9dWMl>UFmBLbS-TwCY5Jl^hEX zLF?bYzLBi=zk;lmYM7&uB_55F#QKbWzN1Kco5ihh!r7 z;zL9Xj=1hawlWSrcmHjfENtn5oXQgeU_&un^X>*;UXOK|NypDmAZ1*jZ+HI|)^+Ua{={t;fA*)26ScRRIh%2j{h#Z5+e5JzRnAxGv&A1z~i4h3lw z((dM-AU$#U>K#?invo2W$f`Yw*9F}_@Sp5CdD7dh7a;x!aV)V8D(BTs3C=rr8s;9T z{kr}{t&nWVS)St}?M>y@ zQSl#l-fHn$v4P#Zs(p)NILY~bnpxiak7doX=exylHwoSsiat^g3ON~kvJiaT&vD-v z9-8M3?bhqY__oI^w#s@S$HS~>iifL{0ES`!K3orfaq`u6ms^~WNlNwe_zZb?e9sbf zvAac5%wupiQ#JOo8p~vUC0{D3nTx7|szTHch54L%9Q}TJ_T2?H#YZGgLm0544( zhZsiD*?xsv{?-lf#k;+!5#hZPBq2$Tdfw_w_0Z~nuzK=KZq(Y(Z??$Thq6G zJ^g^rh;K)(p0Dp&8~7D4M74E44i#C{WQF1a`=3wguQwyyWXQ%>Rg7-S9HuU_{kJ-Y z)CBlT6~g0TK=K^HGeqSZAOckPI6v{#6;Zx-W%7cO-+kOQRaErmR*ck4%)z81kt|M6 zp!MynZ}!M0hDxeJv+y0Uo=iSt^aTEg(@HPOIXoixRrK}2CtDa>w+R$UMR!&GY6@HE zDjHa02b8BE$liw;^ccVc>7@B3bd%KJ>TJLxus)xQ^UkBs6L>1%f=*6_xWXe#Q!(Hj zi)(Ce!bRjgRD0`OVVQV5c*yq}&jUS>@1xsaeqVO2 zLeFTpO$4G?~zm~`&D%#sq~a|9aO$n?p3v* zj)5ws#8IDl85fT?KAhVvk5Y9(!Bp4~uo(5p*4kMNb7crQ`u@5OlXmR^7W2DuwkuKh z9jtxT3u1u_)N>$*XUolL;&ePtMh;XApO>$FYM|XxTWF=E zo<3C7?50&Kg35<0gX!+w`}feQiuqxkTAh!DFLYTuj1J!8=bzhDz*=cr#_WKO)YC2E z+XV0=rm_%CNerP|1b!6*vBC8|xj!sxQ`xDfaLTceRyi2P`CM@s_c?CkBj=vp!dBDX za9OTxT~TaWwyBAt04ETq8Rnh;01zQ?eLbOLk4DOM+J;1I#EK8@rg525;M91~X2%{3e`B=q&MatNc4Q-g*F z+rNE4`|{^kODZeV_%A4k<*+i@Bj5V#M0F1UhG^$`cmd0?D;dZHAEtYL$KO}hzEyOH z;W}9iu%z$s%<=`n%%6l~(;kOWs;^eNYy28j4EJM%Vw}Cf_0Y?m+`O`x7}G~5h{;Ng z$+>$5#tu8@xb*q=&{}FJo%2^HNTLcElMTgl>^^uNpVvw+vW!LQrB87()Cy?Ag>)?( zlAib(!2XyS`fEhe)QY$kX-c;wWobZAGlP?!*zc_sF;NMn#F8!>hlS{I^C$H`KTS`L z&plPVS4UA4llZElC!3p)RFVMozyrU_koo9$5{NW6fTEgt>KDf#%F+WTE*Su4Bz}3% zVe|cn?VY_rcBrMNs;`QIIi@0c>b!`Eqa=FwKI7lEpj#wj@|sxVRguDZnSeljyX5xn zPp+7!*t?dV!A*XsFo-HC#E=IF0|6vi13mu$pVv9^u=LQ~A{J5GZMSUF3#G8$Qc6l{ zj#Q5Pm5LLEb{^_Otm-8#}zeAd$K6w zfU2jmq63VKe1~l>$3;w+6nJEko5hI2#ua1-xhxw4<$>Ed8fBu|kk!0Xcs?8~l^{SuGa;Yv8l6-m0zMEKRrU;wfYb)gmS2$T<*z4#1K|Sa-{7WTJ%^z|eUr_)?nXA++(>O&D=vZAWrYtgA2gHtqo zUzmL3xX4sxWgYtm&$n*+9GiYRy5S8-S}LibGd(j(K}1pj2mv6d$R39n$F_>4MO_>X zO%*Kl4JtgMNa6>Z078?J2d8{|v8Fx0P9&g;>wBe;R6!b~a!5E}l^OCUW$sQ$`uh!I zbfz(7JEj~!LU#VoiYf`3I46!-7zJ4PFwSyFUTQOppHZCSQtwtfjZJb}Ee~9(*`}$g zNEOuw70E1EXR?0j-f);QQSz;xWmF(Fb-yx50e@!V(daR+Ts0|b{ zLa{5oML0RhIWL@GF~|joQJe$Z=}nSXxR9<`z{h2(vOTwOy-805l2Mpw$MGJeV3KJ# zpzzzpAOn!!g-@<>PIS9nY`5F5&shY~)R7(~k>YZ&xnEJl4oAKLBxmFgeQmil569M2 zQ3|i7(1L9!HZgblGk+ zHhW&!s-a13cIGwn!$raVDAdkWNZb`={t$}{7~o_UV~s?&M-&6cyBMZd7!4pMK-kYV z1F#+bS@$}%X6VI5<|=x74PAoLD@Vl|JecGTWg;@?fXtYauwn^CE!=1&Cr581a<0_7 z+#Z7A@hbuT8GcO48G9m}0$DxB;|I_ZCx}a?l3LS(8$+IW$|zu;Z=WR~&jkeh>L`Ud zLZT#=D8@3U(2z(V_Z`N5pDU-OeJrum?a6LCmKtZ0zCOY?B6@M3E3OZ|Nh8zHV2?%E zI!jGJl^=U=8ibu97>1sW+2WJ}N;!2y#c&6Rz9Jt@5bA85O6gX~ueZ@}dood0(nBS= zp;_jrc@U{k5T_IpD&V;sa1IZAYcyr2%I8q{t#D|yI*0V&VRNeJX9_(19lX^_Xf~pY zzlS^1)w2lWc%=#$FYz3X>w*vScJ$Q!wbEU|wyNfvc*A$H)Cyqqzja;=a#W8JKM_c! zaLgAfa&eFDpKBMRt##X*TH9jW`<@HM?(ZXBrJjYS<5L{moEmVk#5jyMU_tVe=zBSC zdzFggb)|}WG`y`05|@s8uMHxVim!Z$IKN?)CnEzO4^d;PQX@72+!KT7W+d8C?=7LtT3=h=BH4MK?HDcjB(~VvE|)%p>eIJqug8CmPsU;T5pM@ zSfq6)4DTpn6f+-~^aDT3ZU*nNz5Rhz1vHh_J{_-mR9h{^>swPq-ZX7fQ%hMKZ^5Ex zMUTbixnAW+RwI`ZH4gs(ZlpIFYwf3W(A08B>7Ih&x9KOARYt^Q4p8}vungnVmV4t? z1KD=9`u$kd_c8zF(D+fw znBjA@P{F5?6R3AZ<1*t%_cYK_yjD`UP;hJtu1plX>7J4np4M>Gt{A`o)O zk`lbXEY~-E@6?F5efCa|bcV#+Qpp5TM)b8ZM_*M-#I%!|c^S;O1&nL_ISEh(az?V3 z7reCK{7PVNmcn-GErizGRV>DMAnol>v(7@YrF)4O&`a zx5IgchjLtM>G@WKsx<6*#o{lE$+3b42ss3ik4zr=dVn_u=8A5;-1m0umuCltD%fdh z%?s11jg|_@RT<}0XLc@&jy(II1mS(7vfu1Wxq5%OOH|NQMlKP?qPhyma*(fiU&Mx7 zGT@g0g+5Y1%;|zbB^8j`3gFvQZ7Hs8K{H$_sva>k6&YD#s4DA>@l^xyFLHR02{`YJ zH^m)>$F^4S9kQ==tRiV^sc5E#inU?{agUR{t1o`|Ts}MF*HpdoirE}d?mff1X17gk zl2~Gp!ji!Y%6Np~1WN8$s8$T@GsLL`_c65^;YWVH9m!F7yjyAN8i8s>G}h#z2%wo` zj57%wH$Ug+!2$C5w6`(9ZfVEnji4Mmm2owAq%c=UQ4EnRi-`l3 zA~to%&Of=|1Gs~4>c-Q$d|iWYZL5{aqSGv_X!4=sExM(*W&uQB>Ew0a3 zcBfl}cRB`+mfaKvHH0#{ad68oiRB5*bIDv2sP;Ld2R!~?sWsb|bdTn^yl=Y7#6+K1aQm)@oB!z=SWLE}I*(E_7h{tZ((2dd! z&HYsn#+oUQV(xm1OIy|1-C^7E)}OnX>48>MsCbdtfH@>6VnOZZ&PQ`%ZSBQ%wA$ll zp%v9r!-Fj?LLrTLl2rq?YyvI_2$^VCxS>x=naQy=;xaZn4n4!{Owptd4kT z#L8Gi?HEJHkzz0o2hRZ5tGlMhFXq&PhzE+M9YyUCN7eRU4XLFS665lfoy4lZ=H5 zMj;%d<1lEj++W}544 zj?Ga{#)6hXBM{%`UnKq?a6NraNe8hSrZ#@*+wj|4YeidB`-aa+K~8F3hD&sH6mq}} zG9*$elaw4-07AMR`efXlOQW*gZCi4>qUB9bUqvKs6*VVu-&?9`NawAJ zG4E1}Ehk8J_7?)|4ra;(}r^(?d97MQek^|TqJ zksVo{2bM-)+QS*hME?LW+<8R*0JPUDuIt=V$4^^gr0}XOw1VMI z)axI^v|(j_XOnn_Nt_INI^dI?Hf{QvcClLPE;aPga*63DHBgRGnB9TmgfTsWsb)Vg zbDrR?md3o<>9&1`Zrj$?W_Trv>TBAh&Q%zQNeRh_1wxYKkf=#4NGdejbEvls+flh_ zE2_5a60Mt~`fSmb6g1_Y8*1mv7$b)1heBME~oR^{rRJKRk@l67^criPpN z(U^1Kxlu9|B#Z&rC<7xo9rY4A3ylc2TBWyAJhvF+daT45Dr9sgna^T)t0C>{#Cm$y z((b$E2IxvEi=`bcbktK)MP;70Lz!MskyHobzEvX!giZL!E*Jr$H~z1s7cGlhK(zH0 zl;0Im6arB z?~ zo~Gf!CrU*?id}?q1@;a&1Q|yql}G^GR~p-F($dk?wOl?V-YgaDwJAJoNlIz41_If-)Rn3EbIQsDr@9_0EC+9ruxf-&<^#e`s> zb~{a7?#&hILbuyEm|Gf!#1T|gQ`3(mz8fOO>&%H0n@51mq>+sT+%+v~x!Y|~(a>8d zHzBH^MMsKgXsc9V8m5zzcyYcwHe_x&WHgeg2ap|r$sVBLd;U$VwKB<4v(Z!~GG=OLF>vv}l&g1a@WXP{Tjt{%H*D9}U8lCwS?C1vm}%jt z@OT*W;E4kf#k~0P;aCyNxXgdKcLfyGmuqFt({YRV6v(!$vRVTH#we-6@f1#E?s$ZV7VNV4(iwkEz50I-MSN1S7e|tKpkrp zD9|J^G>+uCApulr6qRh@O8e&~J$3H+Q8Bb!X|Em)Dyq6h)X}k&zmdc9%6gIV?ihTu zw#?2bqcOUv9k@Yov?}f^m{{bNv1uiWk`+e~6h97PSqeuaoU%OK+r=Z;XjS8H+$O1t z=X<51r=+Vj6lO_j%&^3qjEaOSdg0kPq->bMABBk5Ht*b5iR3`nYMG*AL}HHK?ij|{ zD!v)>66!hmjtC<-CsH>LS*~wkqp{Q2>nW}fPfYSKhE(Mga*{`dA`CG`!5|J?^V>Qm z&j}g*5?sjvz+0cC9XPyND{eG)8N3>aV2YNOSEq?Ggc^gCZx9?t*bRV400sv-302Xn z9k$GaZgl->8d{j?O#VNE&Qh$X7sWm@D?SW^C2$#3f;6MKI^BJzzT7Hn>1JAcg;A}U zjAEU`v|$(_!QxIo7vjc7ee@!$t*d*1w$yui?N38icvU*QG9LsR?W0WlC{No2u-Q#p55X6#0u5bpC zrPeT=aL1JgeE-FM>A!KzO)Ts5XaDrMX=)X>c&MIpT0W_oIMkB@~2 zaOGoGSl1wx{20$*bipk!HSO>F?wA4HZ78d3YkdWLM&o6Mo^Y6}ib;%;_`LX%2;!wk zR>3(Qgtw{E{dJy(nzQeEb)cw(OtDD>B(U*AG2j7ZcNwP&@z$r6WsXo#o-e=>IbajWduvozt=UIzj%%F&xU7*xj!~29Ga?u+w9{az z3J{iI#X%}EMnD4$I|5PfwN$qls3)+ufkKkW@fA};FC{WNav5+ti2y7-qyll+ol$}w zO9#;oPjn``rWMo?(^E|o($`#yB{zyARGbstSxW{|KDf!i0Avkpn_=!7Mar;9)N)C0 zLBtuGmH}SHd*N|_8`HlZp0GcA)m!W8BDPmFQ>#k#5`~Z;W-P^(N|avfj1kz6nAEyk z^?eN*#b0i&r;_2BsVf0SB$e>eHR5pV+>kv~pL`7<=`{ZU+h0_`DKuN_Yb~38;c2dG zMPxJAC1IAb-%TUZCKQ!cC}iSHLm~3GY-1Wh>MrE8D~ftsn!RLg90E8di6V|AkhEpM z;EH%gZe$(DNUco0Tjoz-4;-qFtVWn8*C5RG*E~H_23<2r}4l&-nx?c8` z>v2kEtD2gQhG=Ri=BJV~iCGD#j!zYQMu?md$gl;Q9f>1cRovh!b^xyEgo~OotZNDtbGo#=%VR9N zGZb0)@fpv4J-$cV<}||<8{21!NF<3+NMx2U!GeSt01^kbf8(taz$u;Ho*3X#1dA>> zkQn;`>N_d@2ewJp2sTz?3Q4%_>y4tgO9C;5KuRB66Q0NA?~LiEr`M^hw|M4|#?nT~ z#x{&Nbv=mUdwOJGkL#ipF-ce+W{w(&kd7* zGm@t*!J|`z?SqUAX|;BC*1y%$((b*54Q&}zrlx;{1XV}F4N=V$Fmm8!vO9osd+UcO zH#C$^s|Y?imQu>z8Sm;cG4=g5)_oG{EW4j=&0xJ>s;DYjZ;7LNUL<(LcSnuSAE4qF z2fj%IT)k9NXxa!qRndl4Pvs*iW2n0lv!zw$*=?Y$qqSAQ?QX0xXNeuecqhz9q4dw< z!0t6s?wjuXwk0I<+$0e}m;|5zaSL#vkD)t>79Y z1$=@fMUNx7TxZzi<6L(~B>w<^e_*aQ%K2_^MDbO@aD^5y;FilA{Fnu9{fNOi8rk8# zB`hpEG6y64{1-c2p^isc=dxM1^{;x{=?y8V68G%n;E&r*TUYHdexfdyxI?H>!O-XT z($@CrZB-->ahumend8X zzMANrrT+jX8~LiQyCVH#y+m&6;Dqx=hqH|Fwdv1fy2>XOfTA4u3M{V%;^QvqLwi%h$EF(0~y8(WPH2( z=SOUtr+-&3#nn|+2(!|vroHZT+>l1Vfp&|WqaMG; zPAH1W8)W>!(jTz3cj4w_@5ucL_%HJdo|0M&9h3U^)Xp*<58?J)x$Ult@Jio?4^LUOON9LnhUdIm0 zQwRep-4Yamrk-#WMoB({_0agPlvOdcLQ0ZlxPk}1rpH-N4I(totCj9PM^&BkenV`( z8*L)f#*X8aK_G?i-ynPGL8PZS!JsQ1Nuj5SW#S3!LH0V-E8$>dSME=ymcBN&@l4Ru z)OlAN9b@eI`5$czsqr@DLrZY4RbmS)CQP$|`TArR#QgY%EnX?%dy6osV;O)3dpl77Wp4t4N**EuPYmhRQS>OC|D41KDvgM z@m~uIfib8)xWUw+b(%@UO9%*G0lu1xb`>=h0-gn8%A}u`tyv?L7*kuQ<^n3Fn~3bK z{{U{L&d%26sH24%Ku45z?eC>~jZ9XINl-^2*~2ynI{IznYI;H7Op4@pQLEW$VZb70 z@8WP)P^aJKHJwDT%?y#gNFyNUNY%IR9h6eEKqqnY@AEnW{aZH5x{4a>bwuJ7;?EdT zsrmQMxIdPNMoGf1upFxf~eJ0O^vSeMMhbu+zdE6O5nc`DzxLR?-v=(LqUHb9JK; zp~n>-gO|wYOdUAfb50&eVn|!REaYQNcPlkSj4NQ8f-(MaqLj8ve24?Sytd!2&_N5; z$r?hEI)Ehy!~?bh>4HaA5}d}l*+H&*F6Bgk(^W!XfD%gfImgRf{{Z%<`&aEQiFC5_ zwjS?M{k*>0Dk-dyP%tynJc`J*ZgM;|Q`{d?M__PBmG;W}XxVxRx1QCto(i4qc8C0i zj#&AnBup55OoOl>5O|LHVS)(GzaF4hP?90J4$3{W+byQ$t3!dpIu3SiiHtP#ecfqm^zM;g` zpXs8m>5C&1#^y3GM`N92ss=`<7zI>l8wz;gBnPqj9cl1hGRowF4{`F*iYltt(5Usu z$EHrQsA2&KGChvGRxEo1k@VDo7FWyPzsu7_%AmcZjRaUH_{?&+*VDjAGq-0`mtRlU zUn-CW4}Z&BqLj!0&lwXS5&XmDsE7;YK;j$Brx?~O3XdVfdiU*}OPUN18Z|s~<{u-i z1|ayyX8C;e0aLp6mZ9Oou8Xbdv5vj30Bg+Hd(^`aC9#Mh$Yh*ql136%$-1=$FG=<2OB}~yT zjU7h`saahxaB@At9^+OtKWLu0ecJ^B^@n;S6pXJ5rS_#l05AXn`+<*7O;#{@B<8)d z*!T7P^}UBD!Z!o%2ABZktnUR_m;V5?2U)jObw$GU)a}VE^%TiRQQ=&qfh2_n0yJ?I zLJz6!<|LDnbt7kept{MjDq^@;I*+(1%pH~)E2N$VUv+4uEgKKbdwXiOLCAJF$F97P zm5iu-lG)CVf$Wz{u=bDs5smpxN%wa0*;X6hIe9eDtI|s8k54Ho8#wRB^woj4{@yhc1PNKsQW!qmcCkh^#}ocD&;;RjQ1-l;j{j?A)>p}?O(sH_4Ly1Db~eF z3~S<3h#{ZGmn4>EkqO6qaUHvR>KOq;?9K&scirvccU^B5Na`>phmjtb9remX?UB@9 zhcQRDcI!)l{8=HGpRbfi2Y&k7P4?F699Q97yKcfQ#47v?MNNR%*apQym?*!zK! zkqtA->l$sHSjb+L*$zel_tQq$x8G^2RyvDoN}1!3I}g`fqe1rk+*I=`)b!fVQ4ntF z6>PCKKh`0EKkVw@+5Z6eL;6a+_eRLvcIiL`7L37GtbSQ$j~}<~rO6|!g!XAjHdkTn z?TH;!OII~GZsQ=H=T`-;*H3Pvju;{c2lUq{Y|s27zh$FF7P{@YEb=U6%2nB2i6i-Q z32~nP06cc}(?uu#5udVUNja?@r;an`u_mgu0(=I9D=&BG&C-c zb^v%t;7HlymBP1+iCTt^YrMUF|`F6Y2JQnI|2*Rr(2l5f< z03dqyB>i-$Q)RBV%wnpBNT0YN!5IMm08y)>aNps#!0<-{ODlPQ5l}mNwTU;#CM}zn_zGB&9aSgvynnmM@X<@`~B)K^p-;qD5)~6M~7r zmR7^f6P5~nfg}uSJe$&4Dbz(TZ%pS$_Z_l^_hD;vlQK%=FlKC!-#t|~ZM%1{!m>20 zGG~vJ_Zrl|95c$vA#-v#M(%fWTA?MIlN0mNIt{yBO0msJcelFAh02+@ock!q87EbD z_K9ffS{mR}zj5!ZKeW+1oK&1=w|@H5(lv#Y$S&zW)z&btFivpk*sgsK=c5!5QO6LH zTA-{!Bn?$`w{#`uGxB8b-00Yl_5M9Vp#9E)(bBfctr|O(DmusGF$?H@ zwe?2inwDm0Wh4dik?EhyK`pl(zf7@PYir<RpH`+an$TezY%4vjkH zd*eN|k5>0(pKWd0xlM6e-Y0^Coc^A=7v-SBq-AWczLIDq6!G z9?`eYO1@t;Q-&wpf(9}282xnTvcB4zTI5AG>#){YNlSLU7}ch^RT61wIRL;aFZtHNKBNUcp!#d`i*xR)zUaSCf4bL6S8%va z^%YXE%RG+7nUB<+V}G8as`2dZ>!^1c$sH02Bvz6!#DUl{kNY&&XtJc1h^CM%Tp-Il zhaeA9$KNMChqjY14gOXfH!!SY$R7Fq^rpXYPI#uHTLXIE_8#!GZ%wmZ@Rut!M0GUN zV>op_gnu%TkVm*AYxcLGzi5r6*B+ZtZ>w{qB<#&gUrOzd0<8e%gFVWehEx649{Jbd zjBN0hPFTtAK1WtxN4n3tx?Lpn7MrZ_+H2(vQ%{mqJ}@K$*|FG>>OUc;M9^FTG!|KR zZMO2iYwoxCDm;{xiwd#9ZalI14J2IlHS(tB_vYQu1n@#cUJOege3GPg86CR}{dK}y zAMJI!VwGT$=9fBH-_Co6MLvM!cgN~<$Gm>l`@*)lp|-}YNyi9TnNDy$03#af$KjH? zjARk&xN_=)Ne%^fB{t%vv+eXsx`82rGSfM7eLYAgzBOFO*GpAq@TRdtJSk_1S?(25 zPnKCu3~>bqAd!-D^2g=FTdS@6=W$ZS4Ndm02$6WSFwDrZKdxH`zw7eSy6@Y>QqsKD z{vs^GNtHtrH=8+fd$IKz)ZYl&32|AStR;Stp0QbX1!ZkE(ULDrgueqhissw_pgzbsfG(Nc+#PTmJxf zOtV$j$4>ls8DK)J!{w4m$J0yxUVjlzW}(99F52qH+iPmuYAP&tYUXDj`%zHacQwL;cJ6vNTBFQVP0a#e`Bgap2tCewdu#LF<8YnYX#|X9m+`Uu zNA=KoCz(pR$l1@a(;cLY4XKTh{FVEsY3d%+zd*HiyS+V0a2v?r_Bs!^_cbY32{QWj z*W>q1I@Q0rV{mHSzjHDNQid9*caI0x3y=Z&>9Xhc$m;!7L~^}t3aoN+XwnnHLH*N` zPwFsrk=kP3>p+mWFVNei`6ZC%QRY8ALyG%FNgFD#XKzh$O&{BCStwO*yJACG+mk~e z;rZbI0EVY8+TU%|%y=7xJ2(u@BxAz|+zb+briezCcX}?cx^7t(KN4kiPi*?>YOiwB zjFyn+)B*4MYMi-s^47a*D}_};RZ`S1k>kn9{X6#gYPr09qNBFTt4~kjNi1Z5r;$^R z+5Gh36$GnsE2C>F?=|hlii$>79hi}!aa;E_#&)HGjzC6o`0au3u2HG${{U24=9QLe z+K~c)d=!kb{Xy0Bv%1^4=iAiPyOxAg!BQ}_5X>1Q><{KW^Z9$~oE$yXVVJV6ExXdM zya1Z(e`U@y9Ah~Bb!+XNnY1hn7J`i$a6HmVLowGMzuGRQ!?`JFt@X`OPb>M-t#Bk? ze+|GGZaFVU+EZzC&foFZo25*( z;C}*wiFr#YK82Y1QG0r^_UsOl)*k7E-U7cadzy*}rmT>lSkRdrj}WRoNhh!$p14!( z1@^q!G}n5I9>Hm^PY^35QaDOgkozO|GGp9;2X4gr>z?}I_KV)VWx4+VmDbiJ@g) zn1+e#DOiHg8Hx{oLxYaz<)rl)?%MZ(^~Y^hkZngbt`z0d`(y2iYqikFMP0ILp=7}E zDXT<)f$xVdTt8%Rw--cRYQ@);OF!8(1|N5r2t7YKjw9-9lM=&ykk63b66>ja{RE=*^@AB4ow6#o-1KBV;kFJ*P zS3293OH@?UJdVVkNQom%$0TZ@vQX&$x47TA^DtYy1Q>j zxJuKdBz`j-nV4nI$miR(mKezRF4@Onlj*O&3gaF0m(1s2Elkrfi#BGFiNLPfuZMoY#C1IgKKgZX`ug z0bWNPzF$ogY6hNxDx#JqUR+x(-yj_N`*t6`gHDz7;U=gG(KrSYS*;@fk*3 z9D5(@sNW1=%FJy83)iZNiEtc@=hGgaU2Te1sg@*0P?9Mm zdyE`lpU{5#fHCcioQ!9-w_24&Y*9}mENs|jPUS)MBkQBGLJ-!4^>sB(B&8%io?l$| zA76cLqvX`3%<3LDQ-XW(J-=UlNN*0Z-q5Ts;y|Qw9r>^&vVK@kVg28)Va7Qjm1C6% zC2(>ua7IV`H3tZ(Y@3&h9AJ+s_HRs&{qCd{cxIZCZb4PBd9UFkwtjy90O6>!b7{e6 zBq+%L032wQMMuWgNi}G0bB-j(j1~)ke=fuR-BP+j8P*qI+3oH$!C{V~=w97yr8N`I zjLD1!TnwL4oc0*{oO|d+eG{^pkN`sE2j&3J`06DEWlg@RYANPuoel#l5PrY*YV44x ziYcjuEV5hvIL7o+O76{0Ky?MMz-J^6C?Fp}oDTisic0&XQ}}RHR2pT>tXC@%=dmOV z0gQV3oa-3gnmc?o9x$EU$es{9S_U43pK+GR^vUEtx;?h)Q*PAJSJu>gUAE#xm9*=~ zf#FO55)bB6k>&0?gX@e5D8NIKn60`Re}{=)DVvO-cgQW#1m|ZLrZ&O-Wq03xse^tm-3a0Ds|y za7IV-0OQxyK=<#3RQ4FG)T*yjJ#UXZbqIS#vE>Rn9OSX{gV+yDXGWw;4a0Xmk7`Ww z+wUSO2&$^r!#*gHWDn`+Na5{~>H+Po_KI6QtESg#tED0}=v`KV6f!crQTQd9hYsWd zq#X9|^*XDhJ5uFDB3fv?C=WMMLo)zz=IxJ69E0EKue=&osAw(n$dt^UBXVA3;{zmm z9^~MAYdWc>ucn4zkt)R+z=0z;k%`AM?VkD1%#9GIwo_X?BXR~W9tD*eRKYPfb!8sm zfX|>k{{US;R45};q}Lf-w27IBe1I_c^u|75{+c~xiqlO{l@i8YNGo6^0rE{7spJ@Y z4n+s3>~ZVgS}0*#+=N3&syta8q>@D>r($wQ9B?z1C%F2K`e1|_in?g(Lm3oB6D~@* z%8|(XfP3VOcJ$Ass#|1{Xs;8jRP^&x)>ak z3hJq7ZHdC4u`a15c_|);xld7?06m7IRMpxpv{kcP>`_5iBE=+O9|98^s3i}%JWf}? zt~>hbEw(F#XzMiZWnz}1m(aQ}&PQ(0@g5@J6hiN2Zl>mE={`$c_q%>fy5yxjMD+bn`oje(Q zN}s^|RahzY&JX_c=k2GhyGL#{u*wwxiJCaXfzmk1I63ZA_Qo@f1x>d%-P8y!QOxg9 zMAO9NVelIRAQn@cXFlHAcCzhBrk z!lbCM)z(cHj}+AgQ4CdT2l+dd3y%>&Wi8(-N1^Ymt!Sd+DLlAeDiw{Wmge+z@}yAB z1V$+&ki`%^%PSH`e^9v2NbU00?bEuTwAFuRDQpl|JtGqx){>!!V%&*^$plE9#t8J| z+d0zR%kQe`ZdSPnmI;xPIF+6J9!yUlRIWXJGDdyzld0Qwz}D%l7Rsuj8pkw2PI(1a zb;~iv06A=d=yRW5?eczTOO0BC6%OyZQ%7-(M;rsP{{RpohcCz1*VJRv8SSkPXcJ6{ zQ+&5nNbBcixFHLIJxTm0C4ODld+PGtTMpNAyVXN;wWJ?*&b5(+m-r?mUMUHsjDlFP zjmUVw0OOVq5;~J=+9RZ{tf{qIs^dt^=N4~^jPYK7k0XwFu2FDCK3=WqJNuCN9qOuD zdOBZ?OBFR$E7a6fco0SuOz!X9N05?9!NEPdetMn#j$4F~i0_S2Jvk`gDe(}Da`ilh zJ7oQJWB&kP?G{^WEZaiaO3s|1r>3F9y;`6z;MGSIii`^KAikhaXqB5-wG;H%l6F+RKc}@uh zfb33J9kJ~u$Dy`TX4SLjTajF&(xkJj0eqwxBr*U>2cma4KRgHxCiHt^)BYaD4-JjE7Q4B2TbW`c1L5El<2EZ5A3>D=X=t zj+Q1>XqBUKrc*G<4w^s0?U*kx~zIODFxj=CK zT;S)jof1nGvYD&t?=n`_Q&xouPc?f}nAa+N)aj6n7>ts5ei~twU}XtHllC#WlWK2fAFP z_-ZP5s%hn>h$!VCg|hyjmMElTFzu-EUab(_lB(ffQMm6H7iu_e6jq7;E|x(3iBIsRQUOJ|}@#~8RrJ*h3CNoi&Kz${=e3+KSgDgwic7E#=h%Ts8nAfDk@ zT~B|ucyiP=El8Hw{{R{B00ZLTxF|T_GDmO;85q^mAoJv(iBue9@|-WNcQ|E+y2$NQ z0yRoIOC(Y&w5iDha`2gn!#sICxUuXz9VYcs#a*-dhc%{3^D89`A!9SWQGlG5h`fZ7 zK?LIf4n$+OdNb`S_K&@6P2WqidTY4aJFeZ3wSD0rXOrSYh{6W`vXD;uRAoBAO$5T__`khvv zdn(RXuKo%BCeeQnc&M9HPRbzAzE?nW&v5PP@lCNR?Q@Fj6tdo|)pTkCcnu=_MJuQW z1Dh5dvHU_bZ>rmZlWAJ5mWn}D9Wkb!N`-1^Q5dtNh2)V@Sy;cm4taewU38CiP+hkS zH(M$je4@b=_c(@PhAP=#GDQ-w%c`oW3<(FHVnzUPzSbqd=(jXie;%H*6#`LBB)k)d zUJZpj9AtnGt_kgx#ptwh#CFU))Gy=d_E|rSJZDMbdgn`_b;HX+6<3#I=V=}d`B%BG zb5!m@QC8?;ik^x%7@|{ynI13>956s~J#mmdGz@OZtd};9#d4C8c%&6E&L$|lWa6N) zBaCO45WtWDAm=&@)GHlc(ds3}o=V!PsKm7ORP!tfj!=Ne<<}^MLom;C$w#0$(#H9z zq^Y<|d6%3}+}T3Z97#_k-Wrq)K`d2@$gEBm%oy^=e#2q}h2u+z$WPnDs)ie+Grb)j ziSW@&LoPfTmy4cCDDz}?$SfFwSPxULYxjg3UQNBZsViz88>>k3rDL>^te`Y?Do7x% zM|=*z@y0N7N>|e*`l%y|IHHy5c||4}<40C-@w$@4c|bYk=m+8iX^NlYu6st4Y*jNt z^;1SE>f~P(5>&?KC0{a=#fAw4vl0U2@pnVj0C@`9w%#r@`;`)oiR!0c6X4b`JW7cn zMv^##u;hG9IO2>6C$J|2MfT46uHBoK<7$yU?t0rpTmpEW8ODD!;iSLRl=a>dZ=@BrhZXmOsEB~8 zJY2+5MBGpi5EI`7k*ReytK=1@a#e1NkHw=bvcm-;&)|{?CRCJ#AcgYa1uS#h0BdyH z;_>0rU3UF!6=_2uN>ShmylCYkEl`U78WiGK4#a{_e&8X@aW)*D$%Al0TeED+Ezs?D zkEpimWlw`qJT&w+xge$RIRZjCe>-z6pD72pz&ep`qTd^Wvc&s0b#1vSspFoWx}Lg@ zv`op#8^cwP1H=Y4IOG8g2nW7R+P9T0=6dMwvHT-c$mU9$Iq-z}P{qPJ_)H9p4`}o6 z%;P#Ya@l)!<#njK(8abuG-2goYlW)=f#i+JlZyk`5a@C3pG_gqygzXk7J)k)D(MKi zZaePLma4CD?>c&0MVjDk^;GuDRP^-`m2f69c=5@=29bR*aUgKVCkML6cDVJsq*3ke zoNtRfl@C=-iaO|m3i%?KNfLZW0MkzFsuh6>`5%YzX=wDDecbl7HHx0~M?94jsyUPSqs>)f*EH4s& zAt48^EDY-Du@LSE?MO-LU?h#8H@5cL_g%ZyeZwW1QuQ{wg}#CiOphE(6sBp2c-_fj z7zG7f6U$D!XK8F}BSAw?Rd=kWN>=b{ZdWR*(9x==HsLIy93ue5LJ+)xBxAH|KS6%a zvs?mPsdqoYTozj6Y+J=jQ%5g|1d|BSm6)=y84gqk$8O|nR?q1-N3B+w_O0r{WT2?p z*Q<;(-L6xbmnyQ#Agc2*5*AS!mB0aq;RFpcsTl;Z-;f{mE}Tf*6^m}RY+K~dcG$P= zzg2jmqwp>?R@$)z5~1THVtCaEGDgso8!wpTscaAcf4KJV#>+<}RZ!e3YThP$e5MAH zbmWQWiviaJs96I7G7fv;_QSlk)%Mw7j@@vA3F%T*G_>^jSy5A)I)Vx^uZ9K=a7WXy z>U$p0itd#54dHfbNapybN`Qr;mBWD|wLTTwlL3Pt%ecTA%=sPah%f{Khj-G_TAanjQ>L5I_VhYyl@A_3L}s=jV$ zTm_{Ht5wUVSE^b)#a(fn(wQZqN2^M@l$LnU`8=`(<1AmnY!(3HvGoMyzAETMI@F^#B$~UBjYe0*_k-V&#EaV>Gf;gNXeCtTDN3xN(eSNy;HB^r>xS^JMh>|%1 zQFwl}`bMCAgAL zVjGS-95-X@s($Hu+}FF0-7)T}*)7z{Bo?UJQ4pt6G0Ves4oM^N0yvY5ds&@QYTJb! zH64Q6Z>)|Hn5Jk;&LRpEB1PocVp*^N_V3?H78_+Hl2{^{o*Ic&nxR%Qg@WMtWE>pf zf{(7UyToFUfg9;*jx)(c_LF=q6?B)HN;`Ed^26iLM@GRV?jtP4$8thojE__6?)4_r zhT=^PlIwJ!S>pcyAuv@!VXCB&SxCnqk`;BqAe;l=i2$AUJU|STi0cwlGiEAEuYpi+@q>1g3e2peQRs z=hOHJDJd$@XplHO6+sw*akzzTwB5~LaEKpNa+hDZ`YAI>%QrD%% ze-ua>SpFXZHS%MF5>%+b3`R$M=`dVTQdsWvja=zSOne% zwqE;hxeDvf<@hsHvUst(c#+Q^G-%Pw3_6x7_`vTN!32$HJ|u8I$^oarC0_Rpl@xX= zh$?C*ZAMtBE16jq7)v=*BD?p&1J~QQ`R7rr8+6g{FCOne(&C~)6?Dzw!#k4BI1qBf z9LVMU*6*BUQa#yNY!@}4ui+dHhMq{76(@~VLJrwsgOS?+B99{QI5W9tBZ+k@;++TVDOt#v(HiCZ^E_Cq7 zoH=t+3ZN-~Sg*|F0(Dl^EY=$O8xlo!Hsc*Zp-JhgJ{qbBz(41m!m=3E@WUAl6lb=M zL)5uxuh$vmwNyPlYQ;0sqo{eAks_58_XjGt0A!vx2R+1U&B;B|3hOlWS6aJmL6SNu zYN}5WsUw;`EIGI=QnU0nqn1!4bn0z^Ek#XL6}sm#(ajukb81QEUkKpx zUO`=1xZncbgpzbscLwOFw_A2i_SYDijKM3(ZCKiqfN$b*$yW`GE*U?QI6k_t8jkgF zp>4qJJuSB7ENhq?$0SMNMyxRWuzAClAg{k5cvlK8kKBgJdml~q^z3VWz7 z#wJgRnWj}~B?WvitcQ_MjK?H}G5U7Ny}GvA&CuH=cV$d9?M#&m_kG4C;~$FW3y(6h zW%2@njC%J3dTr@wH^oJ%WNPURxX({fNfHQNAi-2Wn~R3Yeep2O3&0nUV4ry5LKZ)-tqzeBg{EzcYdWrbr) zYt>Us@r6+dZVY2$5xeIeQV*|jmunp=&MY?zEL0Fi#!v(&$0}GjY&V9^6AYn_Nd%8z zH4^V`veT`aiq93MI{2lAmy{@Cf~2W%{ILg>n5q>8$jcBxBe*8Ex5V77+lIcHuHg=T z9&vM0BR~rjUqqEpaB`|SASG~n-MnxRgLx`e;Dc(zZ>NWJ(p#gYx=^I+9JG)`wIrh~ zYI!gODU=e!m-6x*@?}=8&VmY={gM=|C3uH1Tc zySIwfMYQ^#Zi?M&td1HOYU(DDsnE^DqsDm%(W5H41o1gwZ~)Y6uS3@7x+0~%R7h@i z`Q&?TL)FTX^HRZ;3IdE5_*|V-bI)vN3cfw6g8kC!i;X>+9mOqW0<5vg6r+p8 z42;bfs0xBa^RZGub>oghIMOoTXlO*#sPJ8>rJu!5jPVS}zGBh%$uhCX3Ow<-{{T#$ z=ES!2H>dHXayz88={n5-%cy~0K3@z-OGo86EX0wLPjQ2^ofPS9#jkYKG?K@4x1@2n zh_I(gSuiDH{QXE7Rbnz5-_tWrrbD!Czs(ziS^;&cCZ~1MhP72zP~H|=SY$_PSs|7+ zJmN5MjFrv+kQOICp1^67ZuM#6w=Jg2(`ve^nud3*n(uO>q*plQ_>tsg$sNCjJ$-Se zzxhAdEl*WXRX~PV478H0HDQ`ZAy_nFr9&ScEsjOIKl(W+H(ilyw!t08{6jDzLmmb)JC-1`0taENuRA)v6sN7V)lk#WOG5=*tvs+v z8gm5*Qatiy_?#dFWPzMygNC4+1;2Dab_-3nbwNUHLYAUcT0{vwHAQ2X;+2;RFC@rd zi~+)^>;`#y7_-$|TFlYUbfPY19}5&T#$b{Hqnj%@3J)Ce?s7@MARQU8S?uP^99Pu1 z3%w)qs*aL`@eq|Bt;vZ!oB2re!OpeUTdmD4JQd#$M9B3%6tKvgYB@F{S5OH7dz^;t zj1qIpOFq|l+xJWXY^0B6ZYrcVTk6wdaSGGaG)W5aAgl2R>wqJOaUN5X<_bK~u9kWU zY3mlMY6@Cv2u%euOHU^m<}x>*xF|yL{{TB79FTyjP6o2H*tX8(NbQ?~nvQ`b@ft^h zXC)&iunQyRLcCa>A-#M1XrE9mwjphjv+o<6jc9|5M$UwRCRhb;F)@c?#Pc}*C!od* zJ5tu>iTu@&ZB}+lTSYy}WLmmt<_0&3gQ}ozK)N3{bu3s0$n4qTxEP((O^;8$Z50$0 zkjiQ4>RW_!J91E2$^|(kh7~~dIXGjDZm+W?s#|wm7aoCLH@%19lYcB=O73vBg z>TMNA&uNm;H{G?eG!n-!P_-<3#sK|6UI#eu=J)J1?X~D{6#|fgiVF^GN-SV6VpyCg z&JU+!j>kH(_lDlvw_EC^?!IeP?s-IS@bxiBtU_j7E_nJCYzFfO^78I9gCt1=Dzg<_ zM$0oe@X}OPDvR4a$U%(b%-Q)7(rGSjy9H%`l+apjFi_SGRdTFQg&ty@n2tCDvGgag zIqlo>(7CMeR@?-)0({|$EFMLR%t*l`<#0O>ks5D`(9&Auu8N>Ql+p1AhZUY_19&_@ z2MdA7_9S4FoP(?rZd_^VBI2>tM$!{I!sb}e4=w`{-vAFz-lM*O&oPrlO}E)5RP8jk zrOIgj9jcNwnPHv-D3}%;f)S7i1y8mCIX=3TV6PPQ)bO=KuZ{$7BJ++&WFrN0oM2Q)~AVM?zY9YIb-_KnOk1Avrui!R?Wg-vxX6Ysy+(wI!~5v=PtXRYuP=WR4L` z0c?gC8NfZgeAvOk(;VkLl_0c?2YFL%o2WOzl=R$)R%Yg>XFC3-loReRYwLMqRm& zqx!8qR~Bs|!m#UJSA}kn*D_5@nHeOMw>cCyi3#R1nHa(La2x3G~6w z_-n^p1B`0M>L$snjL*3#ZHA2%g4NRn7>-fdit!|I&JI1Z^6#qciDl2%UeigcX0jnH zXZ|lgJWhezUbPSi#y$0c1GY7^sm5?MhBMrr-?U5H($w@1Zp}{yEhSlagmS5kLWm{5Q<;-HKHfHBWZ z8*A+?*Nv@PPg`#4uHux_V}v!;uUQWebHv9nWh3d0RzM$JdOZ$%Xn+M3uFA20;Y;iN zt|*|mZLN`W5soac?N6z87XBp8CWg$8Xc?p)s`b6b~!)8)W|g;da=yC&J!+EWKJBwh~$z=&PeqpH}3t zFdvX@Tl;72{{Yaf)iC%@piokp!WAN~b4u#j>+x|TW^Xa?^491gZd{M2 z=b`8^Ur?S`?Unxke$-x!k4I4*Qp^O2BrnYwPoY*B2U2$3B$876ZEa{r^(yWL2jq45 z=e0VGzjifT6Ky@;b+#;WEUOF^P9ZD@^F&ET{FzAA^S8d<{Z_SGUV{B&u-_P`9~xAW zozKsZje?y00Mv9?psKTFev)oI!))8O0e3PIIfdq!Ay|TJGE1=!RAjUC*M7^#G7k& zRYM(gm2}?{0mM}f2~bb583+1mgt>L2q*Hh@*ms>W<#{-$c8sa^1DdXrx})~8du^(g z$ZKm0Gt744f8(xf z`%?X_seaGap<}RA!*<oB^KN9upQ3sp3FA&(m25+1nV%8jxaMe6T|NhPFirc~LWgkTa{hQ4pYsV1RSt z;qrKA@PY1rUrl*c0FeoWi;?(G)8uvYp?6UT$V>)4$6s@3q{&|7dV3M_(Q%NiLZ(2j z%O*p6gX%RQi9wuu>uqdm6XN6S#Nmgy)~LBmqdDw!K+*xq@F`+_MthB70SC%YZEp*n z*zP+X+VDq($@V$))F#mkEs)9^9Ki3{ho>R`0B)m84}~E2M((6*W_aNIj(s&U8hGkq zRL%nvgZ^|9ea^WX#Y)(D4*TxTau29S|!O-NRWS00)7_135Y@G4GzLsHp0 zabcd{KKj5zh{F#}LhDq~g{e_kt^gVK))S}k9e@C8OQBu>VET6&(NKkC828k*D=S2a zg#~?1w1RSb{{T%&WgZy^BOfhlMH&1c4Cqk>%OW0|H3|0rb}T z*fOaik>At}6`}=fq`FsA%9BM?B04Z+Wo%&l#=6&`U-(1%+tW$uZTqU?+sej(MI{y1 zbK|OkfMTg2x}Q$X$aeG|y5sQN6lWlM`f5xwa0=r&9mvmp1LKY2oDptt;eP3KZ>~Ke z`$pN?^|fx3(_ASdUyij^0JG7S$OVANWF#CioE&=`jafF`r$ZBX(iE##KDi(P^Xzr_ zJF~ae;@LNP9nZCIRd&mTFKFs1r70rk*VEK|!R&nxZFdh#{{ZlzZmTqs(sgTR(cS3; zF^XC2i}14s9hseEVvmu7+l~nI@7putm4j?#kh2{go=G~dV72-;9R&>{w-{rL91kkv zx6A9S4QXe@et_fCU!T2C{{X_B1y!l&`ctsyrLL4?<8Q8xkq?@~6COwNa6X4zk<<^h zZ(q8E^9{k&+sf0wb4x=xqJxS4UJ&sNKi1Ba%_NUD@4C=kw+z5vw~`qN?sK0`*~W*~ zS?R8zM>m;}_g2Usp1%hvI>prccOgO4UC~ZmSsTN=R4!G&5bXYh4R4pMy-})-Vw|*+U}_+F1rBln{PiNYX;95*k*ATA zDi<97V_%L|KB)BoQIFFNh0!!c%k?KdTj7_%=!pSC_oQ$e|-&s?aSX+{^ka-_XX%*5hF(qju%bg20F%x<^?!{{Y!gb8k;_F{E9^)E4qUUpL*{7-GK5M+Pt>rDlu|rgM|~>Xf6qP%}F;GBl2IUPsR?`kegr zC2ABB$iRm7_ZsSHbg?%s7Je%ZpvZVMoU89uw>d>cb!4>;J7z~GAHIcD1a>5VPq_K$ zeKl?vc!ZS52j{J`RVWyYoP6{BHPvU6ju$Dwgev1gJCodJJ%^^3ZdUbG<~tGnbl&c= z0gUJ6oe8;8jPgttKHnjtbFDTP)2O7moudUEusfFJ*eD&zIz+r~8)eeAGYZUUX(M+@ zn2@j7#}21$rYSP2=OvNPp9%7L8wduoe{_i!mRNg*bo z&mg_I&c=oWp{?5(^KQ-;V8W9^huH^8c&lI&)ax;V&*H()whp|@q{TIN1XOIHTkhusDz&x4&=&nGfmk9pAe3<@S_0;g~d$i9Caq^$C=j*hh zc*$?Pthpr&0DeU010JO64CE#9Fsc}g3FM5=f1sQaB#4^ z!=o+bYBPC?D}uw<%k8hEpTbZPa#&#U?}7Pz^@SvC%w>F@-HtPzXsD9_#Xvg0_@BjM zQ2{tU`a{X#F}{mkRH8fx&y~GM9mb-xk(lw^yZFrP8Si)1z$K{f0)*D zm8rZf5@l734CEYRP<$fq$&MF2^g>wC@=EYQ@ALe%8Hher?7p}jr%89gJ*quKghW*o zE>CZn8i2zm%z0OaIxxo%`JZd|?d z`Rg1N9mpX5xYjO(KqI)+wPLMHj`?{6fw;dFNE`(s@y?4BOpw#fz3p$fZH z5b@HV?AD=U$Z^vz=__!L6SpWt*;C!?t zLRKL|W4CW@dxCv6mOFrZYtRVok6!w#R7$}?Uf(@s8Z)q7`r8Z=&mzMbv%4GxQQYdx z*;^i-!~X!m4(x_75TA#qbJ?32IQ&K5s8^g2EoQx(CNQ?ZWO##ywRgDl=BiZWaA!~&Ij%7?WD$$jzG}ID~Pu% zpl}zt9e~%`!^F;W{RXoHV~o!FV<3aXfPQ_o=M+u!N6QF&TuUwK1(7R-(0)27v{d7%rAR^W4wj-dgw$ooJn8sNa1Q7xfDL4-mn0+vEeLUG7x(~T# zth!xgsHV(u<%sc7$im|o_c#EYcO8$Z?WEnEz31A$5lbY06-85?N~aGK9A%f-=ZMHY zxc1Y|-Kw|V?)0^^Ps!>T)q=1s#dDT9T&MxmpF!w-hO!2j++KKAYOu4Kq|IcnyHs06 zH}Ioa7NZ0-uEBW~K8!L?r@6q!G>0`kB~)>|G^EW^$NbxKUzUDg^3SjCbnn#N*R@+| z(QP^!ZyxV%tyY@0Hq2%p1So~O43OiHAfIq?jB27aa|wKLGjlD^vmVFSKbX{pZJ?S& z__)fkD=hQNZKAh)B$2dmBx)FUEPTvB_au|6n$fqQ+ub&X+?7zRMHdRXh{*HviPM zRVMj>U^I#BB#bG%gU z3&-9!+LhqwsT@%*5d!&D6ajz$AFt0RSxr}0TvnZ>ERp57`vdF#1K(dz)LUk@!$(&H zZ!vkJn`>4|P^KYoNUtCku7#2BAKb>$JiQ&kD z?r;guxzD)NN#c$=E_1VfITa!gl7qK=W9ohT9|h5^j1#d$eC zypIv<^3)o*q43kgg^g6x1jZ2@nMXOc_J2$R18=~c_}&16aN5yyriz41fG#kDC#39%6&f&U`N-sq7LiY zdWo34i7O!>zi&X_m-N;%pn7;}6~`|^J^KNTeN9lb73nmv2~ikwjQTM58rbpXB9V?| zSO9%8J&vp*8Cbf%#27#igV_B3x}G7477-+#8;s-wfJO#8{PU6e9S@Yh#o!P~#y)?R zjz>d7S4S;HO!5Adx_5<@ehX{ba5bjY)ZK;XVGjk2d=eX=NGFT-Mi7-ec zfPXB1+olR7f$6IwXpqU^_=xV{5ybaVpHg{e9=*Pr7flz4(Z=MceB-__N6_j8M0%pz zG3aU)t@ZBFQp+TN7~z<(hnOU)f!vQ?=lbJcOCN_-OU>NGBxNecvXZ|n_VoRRbhci4 zN!Xz)-x$yI(NtLkD=f&sj^N|hBmV$-s8ng}iZw+=C=*9tEFwUuHwPhPP|9(U>N24B z{_o|XGRq%6DmADGa(s7T^nPZ{{Rn`x4}Jax~4gz zk%W+iDo65>-}Tg`LD)n->#BkjgtN0q=^FP45SAolAN5=Q?G>fB(^n(aUu#w{>=cj) zJ}Vy0AwAVWWzTOz+dk{-cCH{q(kl>o24H!ve!nk$7q>lSWd&ubo|x2$;!`8BJfq_3 z-11LvOnpJsT__FkqDvXI)yTH$o^b|ZVj!?nkTcv2_Q&n%jcce=6t0o1kph98N$f}- zzxtm&6`;38MdD36c#;Gw68Lx={RVPD#(M+n*mm^Px|&m0Gu&F0pT@)sdskl}cg&-&sFDnA2G6rxx z`yXE4@YXw4!%0tDNG>r{B?*;LrjZK;41GXfHU@G}%R0R5T_~oq);(;MTh*1mEqZth%2c7+6IN2x)s8C#Jt>>v-Bda%5!g0xJwfh$7(aXmFXL{OQ~ih6*q{E+v; zu*n_0G3b5Ay)C@DhHIX>)eRI8)0Z+uGUqXY#450MJcn_Bdl8?@TxQDY-C=BeZH#3R z+tii|b=4)eUu&C%JJYY;9Al>vc0a?Blex;|C}zkw2UGWs_gg0}RaG)h6O|=BJnO&~ zQl-0lkjEhB8T9wkEw+8HeB3b4ce_Hfcz*{@&%NoGCn;BlXS(v%gzulJ89R z+qEs)B`U1)Q~1oX@dLn;GB8eC01uZhu8v59Zu7Qer%ZY=OpLvNNi)0m}d zay&c?laZWuBP3(f>U76RxUO+i+i5AODXs!|0xU8A01hy6MhPE5{Ma462e4aLPU`BW zWSX*?*Cj+ECX0-%75U994N_lgl2S z-r7Xw7K#S{03_I=k=dllM---%T`ZK8lESEFSY&=qJwQ1u72CP=V81M#57<=|6+5om zXsEQek1f_1W&uY644E0=4{|bcJNNJCbVioiWI*=IRnnji9HFO-&f!>PPkfgcKjDoV z*i-_Cs8)-GPT#muLrGB$Rb5R%;*dZ~d7V2PkfeP%E>C{wfafhgMEMx*%H_ScxGbHM&2KrlIW;hdo)fKIkUvS6yGskci>extOCWrm_Eb&9r0 zm@gR!bS}UZ7{(hUk`AJ7t;@RQq^I0FM{!cUz*iJB&m5;TsIrd_8J02&GL>^M9Niaz z$izwaUsSEh1Jl7zZWYp)nh5LZNdEvf7`XGR6zm6dR>;R5+1E|Oy3E2t(RzyVZ&5?G z_bo*{aX{-U$+IVhT3JtLNhDT84(pSY7#IWqNYl>o-#=vDjBSm-Vc+(;>YdYbp^CDq z8hbpoGTC5r_~oZYkKy3t$BHm6LCIFml-8o6pKu-DyKRx(8sAGYBE044V~8?0nl#TQ z_FSO0nDJrV%)zvh#HiHc$a#F;j%TX*`5@m7; z!0mtoa%_R9(jL2$`pTGDj#pSz|*IrZ}%KCGgmi z-!5AFZuFX{T;7IjrNCTCUm7TF%`y%yt`nX(mf|^mltvr})| z>rX)-sBuSCBvVwYnjHIT!0kKay)&oMnUW_ zbS^r2h-Q{JHvF?kAYOEn(F(ZSV*$DFNdp3VVUM65nI-Za@3n4p!fO`au78S)0yBG- zhDKlIQ=BhwNf=}M>rAuWDFqca%Gh-F%Yl+QXw7}#JV0TISe+jXaJj+8K_?npn#UXz zP2AB$E>inU{gk%PQ6{xqwr0_%vu-Qh=_+scVrKD0D@IX@)5$l6aK%};@jbJX+-j%Z z9T%$G!rRlUj^k?Dt4*#5s-~!oqmEGzHx%^g$ntWJ2=9aE>>CFkpx3>t)H;-&TXYo` z`-M`1)he`)hd(x170xm92fn{Ccjr*|yqos?`p1zLo(A7x(8;4~)QG;{rm_g(j z?1v;{T~7|0X&hMdKnyHe$k-SQ1(L09p6v&?(biUrvegQ5(ZK{S{Cq=}G8G72Q3Dpk z07)IQt3pd{irr?RwB2g1lhjtzOFT_CXeD)#f(VCaKZ)`jAyNSDLjzq<#kqDkwAJqa z03Mo~aNE|UqL0dzF&u(hl9dDit&HclY>evCwD|XV5^CC3k}HJ#s6|i?(nj6536)5U zuK<0HSmV^`vp;iUf|C z5OE-2pGKmhve(>dBBHN#H8V7D!928xi43^o8$MN#GBAl{ULcI0p1MxqPyLd_R+u5B zsIM{j4;EHP(7p=ywgzK?On3lq|Hyf>{<4)H5#1zv{Z>HiRrKnW%nq!tKz@F(hG5}JfFbj;I zZdC3Vp{KLNwtIcfmZ#zAYU<)i=q{17GSf)zNkC?!Bo^V`qsxH&Pe^Vamvqv$J8WyV zYig3NnWFfL_@+}FQ%HHNY?uoecVeRi<+1EYuU}#AeTz*6e0K?!-Qv>K%UF}SkcI&x zs&L4lL$j{xmL2Z<-dwrNo1sI8p?@7$xtJ4;&ICGW(&zmjNk%C zueL1<*8AHXQ)^|)<+rM)zf;K~RfygySdx*WP-Gr{A=*OChYXqW_XG_|`%G=hic9+M zI4uuNRa+~~a`=iiiM}Lv@fVXEh6H7Mj>Ml)s@mCa+zQmtR@-VRE2tFKQ-)z1GBD(! zRDfH*A~Bru^!b<};5aHRqf4TCVb)9ENv^b%_IovSmTG#FPf<@*hn9`pn1w>Jx`b>J za8v`33XfeM-JNWb-??p6^t%t8fo3w)RKgM;h>BNd@r zjytVvb5Yh@sD*VTwHy>zqOoon?8ZQ?fItL*2XZ^?+5JkoQd=!1y26#>-&gmI1a;-( zhO#n+WQs$@K?FEp=O7T7IXXoTcqV)oL+#S7 z132tS$nT>RwQp#8Yt{DEG<1?cp9fBZ{GLGMlG4c=u_SlThJm<_;jxWY_KnxFZuff? zndo7fvimGG6%j*NpAm0}vjT%Efa@?>Lz5Jut)neN!61K%F*4VAI*GXa#tpyX()4?k{9vt~` zmy+Q!TO3belG#u@l5738!%UR7J2eYd2Bxl&u2D{cp9h>tg33c=o=STN@sQ1dNX@!n z+?5l_wjO#`qo+!VZIV`Sfs#jG75VbQqD+Ugr~?Yeu*R~r$t|L??`^&8X)Y;qp+5rb zd~m2G1n~ee0-~N`00>HsEx0&uVwHM0RV_Bkv(Nw)@b$GGF1OPHBjCzhEvF>~7j@o}{+M4aV zPqeqk#mj28#Zr{@DM%INA~|EGrgdiGLdelF<+FruDI|>(qTO{jx+-aH4?`>z(+Jqp zMq9#m?ocC@aHYLLz*!puzj9=_Vc`zJ$STo_<8rWED(V`h7Bi%@sWlBuYO(^##7KLe zDDT;UA$b1)Hl=N?%f2I(Xs%Xmzj&ai1x(OV@sY4O7ZFtRR~X_54cWarf(mt(>v6Kr zGEYweL31K#1wyot#s_uDi;{SZae&M?j1~uwB-YE^6dRJJzB_$=MXvETgHbceq8N#0 zBuNj3JWeG;5!ibUBoK5ia3NmWPf%C%^5I0+C^l`jmc5{Qe~7nD91MvdDzD+Pu>=le zkOmG1Z+-Ubr7Tez7^C=^r%+KRr;VgVi~^`+E^=K%5PYO@9=`Q0=v`NM-0wSXq9v%V zNbV6*lAaU5KNOspg<&5O&6Up=QZvs1(#_NxYYUvzLJ1@*nPrZJpz%#nu75hcFTpj-&+M>l0gkx zs)!-M1(Kk5$Zl`N7#`=a?sSiM`#sq!)|YkdzM$0Ysp)29fodaK+IdUmQPshXoeAQl zj&M#eFh;lz@U2XaEquhaYizNM?aH5Tx!f*Lg}v^30@ZP4mKdU^sd$~i7;(h1pEv^m z@(bC90Whyy-R&EI)wMkHJq5ZtiE3U|jVnq)z{pZShr}e5AU7fu5D6p-rcQ!&S8P>Q zT$_1T)ysR9nAW>`2u$URGAxW5J|#*K<^-G|9rbBPY?A9&B?WbKl@rxX@l88O#wJ;r z3MUs_s)uoc*#Hx)I>=$tJbzbkJb_^`g|6*O={m`3+!Baxb5Pr3lAOgX&WhCj7#<%8 zs?|skBl1I#Dh~+M_fqAQf~Op@g7vYs zotlEGrmJsl*(qx3Y9p4Wl1M_)J2XxNu%S?#Th83a;Q*0_QI@+cx*f}1B34?b+*FDM z9VI}V{5&;i6nr}OWeQ!`aq$Vyh2_VmTSwu#atwm$$r9=|;h`rtMkTjcDXaHp^{HRH zd;tS3Z8S3?I{*rdvdBQ}2mrE{J%ZqowOAymvqehN(#UP1T9Z6;t5sCQa@@uwVg@;` zJU#>fLC$nb?N-!p(VfXhw&>QP;+B}wO1ei*5s2n@byP+;$`Zx7A148WoRm(R?@PY+ z*w!0u?wKfQ=&dwV@JmB&MW&uN5tmd1;0%RESkU>MvQ#h{Yy2K57+m6N{sNV^Snf8a zEv*MmqPR`D>9?)HQYv;c21K0#s$>Gi3T1;}f)5kwTe#5ut$*5gi=B0+r*)OryMtaD$INvO%iN7;+f|TlNNBBf)Uu>B>01+Fu)sNf;iUXS%t>zJ8o>Vm1JgCz184uIc;2aGYz3ytIS`m1) zL42XFiP=04B;k~Rp}g77M{pZB0Q%{ZuNO*v)oHDgirqt1aInH>k&=*@r6`7T3WOo^ z*b|W4ut#I*&-+JoTe^w5Z8wh{HqE$9Qb`45p<|XN@p#0JTDN zw@2=A`=z=qM@^e#8T3#0%8Nv{syS^{H4#!>CYRx>93hRWLGMgR>=-YmdmN82#&rU+ z-%)a_qo{_urlyrrDv9HU6^fj$a>K@O6yqRz9$bB~jbB@fr(03>1y!oP<3VjSu^OnJ ziZn@?z8%PSkFhSyc`j9nDnhn#o=!WDeBSHRYSP)4ds?Y!g*+A3%2~uPOtW@zA;Tzj zP%-7kKnJnZKf~dJ%2K1&G30;~nx)c$<|`TNDkz>NKNC*@d<+m9%YnoY!--+&dz|Tp ziqn4G6m-k*NhBgaB#eO&rXK{cJVC+89D%~7mA2~jS8d83{kSaYMb1Gj1!ck-myR|k z5wL*rW?TkbNKbq=Nx&sKS|4yda_;)mOB|7_(ZK!`669c@Q{MnCJv#zMbKIbR553Ow zAI&q`<6u#@J$+q<+Y8cFQ^i7+5ysBU7r;4E-Y6xw45{sd_=j_?^mhA2b&X`9-IQ}y z(T6Pfe*!ihpk+Z^V1ipGuV7(**1 zsgfEwpx!pytxRw@tBMHEZf{$D(L00ob1l6wQ+NLyof?JFkqmdx}t_0+OX^p&9}Xx;}n;>;v<978r60AS#pVTPG5 z5?U)^p}T$5&{rkFspp24v1Eo-PQpink0{15=Fbp7Cp?P`GWbY^#jhVFx+y`(DX)9m zGx2!l?5#(+1s=i`YEDW+8>F8)GRD;{0zi#V5*E1F$6GR2cUaACsfG9kT`;sEU~%U zA4s^}*TV(AuCkZoR@WS`M%3|V#Vkju9J#2$C!P<}wsg^Azf`}4Rc^UfTV{%?G=?{o zrHvwK0+nTO$`ykQj1|WcIQJm}!*jfDDte2S-m{qisWhgRNdz)E^MDLUgrus<`54QA zl`Vobzi3&lT~)8RZEH5+TRr~S0g|FB$Me#z2XPQU=PX7`00w)HV9g|&_P_d|k^A~A z(nSqm(s93T>s_)r>8UGtB(?tl5m2+Sc_MR`EQE1o#}&W|$G>1n*4?DrcCv^2VQHwK zx6MUV(V1j$vrAB@tnxD8^T#&}$m9}x4%two=}mQp>u<4dDXmvqmHpi)-ksVxAdx#^ z!vNpJ&men@f^q!1XS(c8lF{v2>1%H@!MNy6D$8w-sYAykvZ^pukCUo}B$g%DhzBHh z*I;`~h5#Qju{cHz1N2oJbyD58I*)ityOnHT+GcTAbf$r&N@>iC#zrB)WLD;U2b zInJLgyVq)N15XC+-WHn5W$|b6lGVxHR*%DG;?fmf$MGn^>~ZQ&+PBx;Ff zPQmiL5G-y$_vFM3s|*lw3tBo+u_!7 zTP=NU#uD|CnZ!*Bp8c}f#z^hz#QI}b&F^Szy|HVduBWotZga~qnY>hrKqH9^gpz;* z$w&oDF=7ZlfDu0fPjp|8p|)6|D_n*uOKi=>Rrv>H2*1N2&mJzgJ+M!puVmC8{#kyC z+ar4gQHf@(gwe#(QkIQjUjiw4lZ<6p5t2d2uW_St*GWT1PaQoy!YS4>63&sz(n`cH z_p_6QJ%?;D81JhfQBuWH)s%PIXlkh<0$8j3GaE+6PZgWPPZam#!B}L387COjUE6nx zMz`L!-I|MU(;)-HlGcJbrI0Lq%`4^*LbHK424mPBI2eaY=NdB~vMt%VRhnEYDIj~q zQ(P%hG7HpvDNaWu@p1qR51X?CjcFI!8{AKBhE}P7@o$9?tdaNcksoroBP5S;lkcMU zIuUQ8TU@)jmRiV|8YPwZJf2`xfsX)u_^~WozimdE1$u?4uCAm=;gA`rOl)P5p~shu zebvi%1#b>^$3H$3Pmipi+?Ahv|NNGgC~bYEBGZ;0l>aaR4U`w8k2s# zZmO!WUo%`|o=_shim|zfka(5y`Fz0R0C}_9k;$7y@27W*lHRLo1)6GlFs)AXGRY%I zBk;;Au_ypl2R}3EfvlyuQ$Jc9xmYxZr zsHTKeQ&XP_T_a)ue&-&ga8J`u)HQa`x~eEH7x*KVnpUZ&tEQSftdb&m$MBW%eF!D^ zj!H%eAp(x0;2?$%gq)v+XzL!8+CLeci!fYgu{jJpszVG64GE45w@iMj2RLK|tGbP* zqK-R##-g#QWvlp?@Z^b>M~^4Yqa2t8?A^{3jOwG^V&!JsRJQANOm#N;uM%ipAgkgw zNg>CsKwvQ5fcETjtD3WI(A9X9v~-s`3v0yT8LA#g%X0OVJAt2E4?~Xs0E?78)v=

?BB`+tHc@Pc?5sUy&e*L|B9P4)IvL^okMQUb_DedIMl4aRk44wq` z;tBK^^(5y9TN)Z%H}UGSlIDvXqgPrBX5v5OYfK=iji(Yyi~L1V$UKp*Kx}&q=PUB; zyKlcz?W>#H?o~2HY@8G+@XCxyUMSy(BLJT3k&fN_jd`}^+;bQO>W->-+BByUyC`o2 z1_nMyK7g1gLE41tKqautp<+^8Lfjal#Z*dA%BW_e93 zJfa=}GyU8!ZscI(e2MoOmAQ7T+vogHlmzEN>GNv9(h5>Saz1+`B3ZOn(VZ)7+j~(IUJm1_?q3YzFoB^~SkFsJjU^`a!rY zveQXHSVH0lEQ=;Gc$}Xp!6Ui-bbirt-4+|#*zS9hY3by|FC-NpIso04Mdg($$I?uX zPfTk60NL9&rPrOV+dFa6Rox|7z92@=mMTw~#Icfdl12v{5!@VtLJdLic>}M@-n)nSZiWsW^HG+V|3<7hjcd8u=uiJNe+m_vWXl%7LQl+w*vb7eaqg-V?#0FuU zU>xeStFqj!6+aDhx71S0kHaz*Ki6K?4OBXoheqqQ=jDa*I-Ds(jsjdKbDsX1lkiMb z3;~aQNTrQQ#z%AOol1CRXZICa4t$o;hjs)LB;o$>3UaDx=wYBCSk-& znWRK3oOk(WS9DeF34Ea94{&`o=!=(NJL+RXa>!Qo*@Lof)(SU#s>N$vyE;4>v zmlZG|78vYxx}KP_iO8-2+HxfMtbB$O;1t>zFl!J&Qd*j<%;it@?W45HzqM;1f z8P<43kUE~j(<4?&7K_Tj)8#>5QxfxwkeZ4d)dZwSTTmW;7>pA6`rOKed2U?0E zj48`~b(Tpt6y`RTpgwv30JC24>>C}uwX?${e0is?n=GV&#-9z*Iis-~aeWhwZPyP?+UUzSx42h-nMA%ImOr)={F$aDQQN+|Fs zW(4H>`s-wo@fcB){{RhUu$W}y-yrHwfsx#|CGXp|b$3cy9FYw1^&gnQ&WYYO)GbH%m8Ftc9CK&{q2z}>^Xc4ueMi5~L=UQ4f=8Mb5-=kj`wdBk zEMTIQ0OQwN+MLK2woZGI?lmSjurrK-*o^vr>StORl&38X3NmtFO15$II?^EG*ldsq zIXal3LwHB9^*QgX92}G$!y`;3KrbpII>{kWPJOfQt*(J13KWck$ZK3sGD@!9&T@4w zVAuvUIaB+MSW=3C8nJK(^7kK2X=P(D{mzL>pY*yC!?s6p_0}up3Uh=103A%^9B^WL=Q`BUaS9Kws5tf12R5uJluTr% zD8t|M)cE9(AWmdQj>LDypwR*pf!JzXTzLAG3+tx}3cIfyv1MNQ$Ir3Wr)P|-cPs8S zx=8S%MPhN=CkHz5)JYy!BxBpReHaSuYB4JYF}8m{ZEGs3`~wX8oOaehh~PbV{Jpj8 z%gEp}W8WV7j>?FgmbBaIM2Nm2{5T-v9^>Vy7co$?na48|{JRYWh;a=X77B1re%bcX zx;afn34&k5hby0bQ%x+=46RgGI*L-!BZiJo#~Txd8Zat6RE^`9OA+)Z0o44D@1SRj zM#&<9hxPerg`wkj9xJM_?dI$let7J3!9gIYqM?tInZf-v-~_PdP5>tv*6FDX5-PF? zc?_?Z6>qL}psOjzq4dZ;x_cayMX3Rskag}ck6-DjP>w`nAOZ8#6lpxYyL*A^H8mJ0 z^0q)8=Q?{F3I_sQWw_w|ay-N7pM7X+%T`yg93qbuL=kw8BrZRh5f1i&c2jE5M0AfxF$i|hah*y=lknZW}%gWO*kgP z(y?2FhyP9EH9BneR)8rgOOaT#w0C`oPhhRZqG4J1>;yUN);B$oo z`jxB0^emocx3_gk^@ngteBG}NJwa+JG2y@!j}h$H9)q|(pVvV4ZG-P>*(x4YiW)3R zOB`jh*bd_!na)OpT_>ojtw|*$yC@Bi00-m%>;|qLk!_n4NfpYWjb+AY$U0HojZjR&BrPZ+DJpOlIF|$-z=?v z#r(?XZl+hNMZdi*p3QBtQappjQB_jhc$ao386KwtAC{D*r;!zxhhXc0j_fm?JM~UF zDt*BdLpn_&pjjXTJ`o?v#C!cTp!JhMFUCT|VV8g>y83IQ3EaT%Rf5Dg>t~2_$(K<@2U41r+S8|sPnN^3^DQp8jC$U&XOc4 zAXDcHjNlXR{WR2qqCmKb5y|pMf2i%LlqcdLVoq640DUw60IAzsZZy!x5olIO{5qD2 zmHU*y7$082zioMDR)!-|8F3`VRY>&XgWvPd^wr&EP|BMv>h)s&0&q_iQHW$$#~=tJ zKA9N(^}dgHPf+D6A%ugRcx%W0?QQBk928rEvYv(rqNj;sDzP?HWdS(%{8`eqxXN%8 zF;UC%^wZM9P>C2MgSh#)xpj}DJMmi&0Rbut|~f% zOh@_UjItley)_Ph;Fd*J&!J-7^n0343K~9&7lKubNE8ro2dO`%qf}()kE!~4Ykb7F zvwHUT)+Jqm46XhL^%_ghqH71L9U}JuhCaB~r(8Fuag1tX#7N5V89tcx)MJlA2q5QWZOLQ|8t_7-Nj!<2ltFA|9(p1^htzYXYMkho-m6j2k#3 zKDhMO1b=vYYWP*c)=v?Sp0OaaV_EU!*(1~2UV-j)R;BG;01#sx&&X>D7dRiO*7O0q z%sXdZgbe-v015R!A*vxzIZ;G;I6C>F3zLkI-}2OhlpK3{?n(5{ zv@j$Rdux2a0fIYr^~SX%Mn=H%4_ta`RU>W!^8*7u!?wMQHy&W>K&JNZkKAa4G(tF5 zSrBr6!aczJv@UpRwvELMFv?e)jl_C_PO)Z%NeW95=yBWj(F(Y{NN}Y2jyW7?Txi6U z1O^_UcG9w{2p|*t9eB}#*dBxAee@PPE9FGu z!20_gZ>64Co04(mf;*`0HL^&!smdr(>EF56k)g>8-?8-32T~FiT$Q~>4nAI*$~ak% zBDl%G*16*=7?6?}9^LbuGHm*4D*AynMEn{IFpTg#kIxKyfsXjon<=EHva%FvU8QrY zNoNuGNec3R6DmmW*bH|)wGyV!QF(nP6#SJ7ec~RZDxdaaX0H0(2@ziXuap5fE338nl zX*>cMOR2yM%O@R&(_2L?BT6HNa!|&u+KWzY_=?9ovJNq+GEUVs z5>$wiK5d>TyjMR#{{X4$rsOGwqDpxqau5C5z$qPx$vTnE#DP6Y&a-&w(B<-2dj`NC z(^qtcijRj-KM(`Hh+C@~hE*?BEJ*%YL`M(A_Bi_EJ+-DN6CO5lpmxdb4u7w{wGy1e z4^!NerO4~@gg|<$9(zoc6*ZPy)g*D%v~VL$6k-%;@S+KLuWY|G2h$vU-PoNdRaj(< zrMXp7x|NJFDgxa6(q)bZ^58BtBLgGkKqKd;-kMU_ zFUAXG;s~yB&&eH_iF`I?CC~tTLOk7%zCF8ZIL1?e+^SFtu|l{${@B#oXL$gtTK6qNTkjO<1#FKkAeSl{Je-q|IC;FIJ&8u|r21Hbk|gY7Q{O*`f5S!% ziwcWKD}5T5nWc$21#AT=$$o&3uggQ)X=0Sd@*YKoNc03`4KeKppros=sJPR3;wm|e zXj>SOkgR97$%>!TL9Z1NR?RHS62$U9AQgCl+qn1b^8WxG55Z2ruZla7DoFBkPDJ-7 zwtvG1Q|m1=eb@J_ihLgvhi5qsP>@MJ`Cm_w8pfUKtD%;#Nh3M@WH|>Ucg{XwpU=Le z*GpMZw;zI{f=YkrNpn{=JG40!4P%LFw5#~|~ z{WZSc%{4UCVGA)F)MT6h4u9?c0Mt6l%LtaR)0S|~2vrM`TOEKI_c$7t-CIX>9vI8c z@;L522fn9MFZs!N5`=Le>nSMAG6ixOU4aa~oxnf1^gkjslhUkhg-#v6l!N~OywoPq z1@cxbRgkcTH!!g!7#=RT!3P?FKL%uUPb$cJXWKc^s_T8I+n{<%kkyOYb#)<*Kp=p7 zU=qub^6!j|0+|X(P^k6J56@GD3140*mKyq)BA3KSeDL&QK0p)SRINey zM}hJIuN&0`;qLeoHt`!RPM++Kdi9B+|WP$S0s%mIy zt@MIwdU?D$mYN{ySe`0N#(R!RK~j4I8ZFJig`801yIlScBWQBl+X!okvR*!k#H= z))5SH4q&qdI6t4SU_Eu6@_~Yw7(#_4fYdZZuMCA$iuoBr&c=tQ>5gz}*n zjr>kcoMD3G91l0-59^>5J9_oFZfj3#hO&By!9w(lmW@grb8lb|e*L>@$=aO(-j%l) zE|pfdmfOh2{vA?yj>8#L2Lztu`i}V3wOh0kYu_cJy;8|+x5WyYdU+|OkC`iwSBNbq zryJb2ja%0%Y!>QPN}7mcN>Z@3TtK=;rHD8y z7(wSG4nz}!*yFZV`z#fW8&^qLS4(h`G^R(L6O_&l0wWW^U<_p7x1h-y#Vr0N=9fD^ zl5=$N15I*Qk8IhZpTwS?-0qN*NmJk&#~s1T6Wxw?{{U#{sw%0j&_f%w8<`+(L6)7tPzqtZq;Vkj^gmq! zx6^KGgfvyFx9Vvvs*XivQZz8jI0SKx$|~`~4#50}n2zD@_I`B^t#PKPrj8F1dAKOz zPp%d4$}#Ed=yRUONOq&di?*C7AOu)Um#ghf=AC5t8x&qUH=My7lBhgSC4W^TvB>lz zKH3otuBzD6QBc%;NT{c19qNR2W+1@#Ulm-V4%jP?PQV>6P}19KX_h)0q!r9LC|(5> z7!n(~A+RtGNcJ9{?b~mr+naP;YVB6bbyNvWPw@t$4I|8>Cn~r+d#`UVpeNV1msTq>+0u_+Urbx%zLNd!v6iR3^bPssMc@7r10c0 z)*leb90j>CZ&}%gn6@JICtPdLy_M81o^^J`xUTk@s-S9noiwsR6pi39rl^F8S(GZV zbBt#v0|&Uzd@+#eCCwKDUqiydD~sk~JOln$adfJVs=Dho^|f5A^-o_;0@G1pYGkNK zW8+CLV~!_*1sf`MLv&ixqiiVgp?gkr*#O}w4ECC7+u1|d&DbxxFR<>?( z_elqbBooHX!vF$WB#~NC@7a_L`W&mOsLAldDw&HD%c>5H-DCpx?6jtxLPT# z^>tML02yVgTXaw)Je$Fo2S!dy!Eu)ENMcCz7#g*@-EXM8^ya3t)W^=+@l7;IIA@L` zcoHyhqs{0?em>r#nA+hc#jb(r=Vqq4MGMh9K?q5rW-BCpv&bvAU`9We10z~te^t3j zk(&y+cQQ?H-InSaJAzD?3VCZ%K~SJTslgp2K)4to20P&3jB+{Iys2w;Ee#FoD||IG zU8;OF;7cjCEa<( zt?EuVu*L|~P1zN6^tP&r>K;}inWlJX*-+FR%+v~)x zume2EOG42jMa4rd6acaj%RE7EUj5EE%ogh%>dSK5w>s&59#lrEiD3byiJnqWU|TrAZGi;WNWEa|7T~$qN zcKhrvZ%>P*4AD%h9I)U=86in|{YV~V>@^7p!&41z&9&}bq`N|f#ZOIVrD0J)ZI+rT zBbjjCBO{eFBanb$NCdF@opI*rTkg)jL$S9FT-3&uqibc+17;}00)Y=>SsUrZ9HJuuPiWOo+$uPVfhx-J znPQ#DDmf~vDd&^r87B*2?Tbz7f*R|s&P#PXR|x6rX{b^l>JeFgjR3(wKED@;z{lD1 z#yrX59QMNv2A)^DtLd1p|6Sudx zsfJp+w%~--#L`?=V;YI7-I4%SRxN`Y6=27k5_^Tu5DrRkv~3lFgVoVa)V#j$O8)>K za((AKi%AMpJS@zlikBp`UA-Iw%&;W;!QJ*+O|kcO814a5p-V4tbVb<;28yL8qFaWScwO$2ZkQ^P z!)$n^dU!;xw8n48;URAjC~$`!Via~K0BP3uvJTS;UA3=^da_;oIcZG|bI15eB34hs zGNXcV+^OyA4!N?~4MmQs;MFlqA*-i&k!Whl10(U`a%6Pk5%{-kV1+A=`nmdfUiN*d zYPruHO-!7msJKH=fYZ{_Ln5wah-V|S0#JFC$>0A%$`~`{vxdtu?A0vFDH(0Kw^Io10>*JZr0gW zikVWGt}sOas+z8rqGc;f1uThNx?z}QdlYCTO8Og^AW1QeqSTDZM$vO3)hKVS5R78Z-7Zi+1rZ=OL67l zj9>-h!@nLxHSJYFb!r;QX*V+^Tr>uvmZqXMM=sMTZgND*Sx=OMh9H&faC1O)nxlK| zyG3Qnn$bmBZLILjv)t+YN|;#{Vra0axI|`jC_@D!vVa1PWV$BLIP!uD*BqcmLF}zv zk-F%qEM7Ih-YOEhog;u-LWeaGGjK)k<%F!PIP&by2*~p3((|(}drrq)c{`*~)LiP` zsL=(4E*PdJhFCI;_s_NmI_wX$w0nBfZmO)=7ilc;(_|&FBdC@-gkTxMO5>6b zP9zXP^M89y75!2H=LGuBXRHt`@3zs0uM*I1&j}DfVek0BM zckZ39WSYTOxG3pn+xJ+kwM^Bji0@90t0Zo(%fAI6diOXzh&T0{rhQYc+7Uxd)T>_6 z5RU;x4KS&iSY!^rwetu^-D+tSUexgL4eWxK&g4Lxw3T)(ToKp>2B0p3N+|pq`?w#e2wL z^SXaB!u*2cm!Zk^!H2jvpW2q&4%gY+Mvl#RxnF9Hm*eNA6!l3`%)^H=G06o(MI%hE{i0;?3OK>QD%?gt54lMDPi~#dXxmnaHdV$t zOSJoZYh*vIHlJzW_YGQ_CcC%>Mvo&Gm7GXy#e0 z)Qu;_B3zkiyv2g`i=Edyc4LMQQV7Hx$d%&%Cg$g(wJSI zBjGDcLp)p58|(wC|JF@egfhmGWQWg!+q$Xkv;@8|&-`D;sDVKp8; zTqL-c0$i7@KWB@bC8mNM>(-mi>V}7esZSKs%N$9LEds|eOy|kiWB@Ua{q3qHbJKU* zcI2X`x2yjE7T$uM29iV^mPX(Zw<1}HUcjFIg8{bveahshR2b`fqpXtgjg>Cs+xLRr8E&c zb83GN6$q>RIa8A=I`+ZAUM0OtXFj>nn$(Wr0ZMDn#5+?8nU+bv&4pzQ+`C}ozi#+n zQ=(MW3tw9m6nk>p6=d`<(yOCMiCtJ1bB4$)PDdOlKHj=}p`+L|)_Qtt#^0w)hr?7f z4pv6QhsI?v)*zQ8%xz9-TPe>!!*M5YrA7i9;s~Vdj)I_vhDYlwA>(# z$(AszvY9f-iX#UKz;?m;jC;3idaDJCri*W-qN1g{PjZfBuZmTUSwmzhx}oy%W_BQt zFbms0jBpo}jo8AIvpRjXxAx>nH?H2Ht)4eYqf!U)5f!{YGLU}}85tdk?hZB2J#y&u z9U|(C*1I=TcRJ=;tNrt+{{U@RO~TXQ-7WW7J~pCMR)o_eQh?+IE!lXF z#6ce{_Mp;jzYDbB^FW1Z+J4U42K!B9JxHXNb5~qxem0t|sTK(!EWFk^m1Hd>YRp0W zL;;U(&%1kX+xCn%{iSEV{7g2=iduRKWpgByus;_G7|F^h69f#+jw2t0=w|)fn{&W7 z4V}5~J5K3lg<@%AcbW=Xj}k;Pien)|9Ew&qRtK|k9B{>}tFFl1cdgrh-SpjdmJ8KQ zI$CN)w%;6Z_))>cb5SFR&naEc9Ffd2h0hQXdD~7n9hFG$HTtPFR=vF&)mPHOZdPs3 z)qxs-uvuSOUw*a=7ym`MR9Tq_RV> znr>Sf$9=ui(`=2?xOQChzBKVx#`1WLJ8+5O4KuQ$l#}r(YzFiIX`VfoOI2s6y<4fO zej>i6Fq8e}wC`O~vBs`g8MvzqO6UkZfdPLCil=b(B8~3#JArI>sOEy>Ab~2aRWYpe z@r7PX*@jt*j1}wv?c2MJKFO=ZDymz>S(ZQIIc7vsxgCH6nwi0F1Q6H*5wo8|jw*jOIr<$1J!CZ18;UxbU}Q<;rYwx5 zc^*KiVZ?<~@7aqSaU(|Px(fufYw@?+vqLi<0pf+B;CO?H0YmCp20=LFJf~dpb;kjt z>YY*ZYQmDP;b*u+vI;h$XqqV@NX;v>gd!H<$es$!MhRRh0tr2ioyoZO1vD0k=giv&X``;Bj-W=c&`6HH7))jP z1A)spAb0Jb$s=?1H*{`_dE%s!hK35I;9!V&s~>!jrHSGXuhTiv%i{WIzZI0W#br+3 zy;rx}+M?4@WsWI?hD4euUS@^zONVtVd$IH^MnLXyq>7%P)6|-3kvXG^2-ZIi81W2+ zeKX6xd;I-$7JaX7s;m+#0>OHa43xGb9p3${yTb+Gqf@zYehltWONymKRCNC5PM$U6;OW*W5*{&9y-SvIMpS{vwh1_F_C2$JW-m=I5Za#g zEXXL}r+SyEOKhxxRQeDAV%Q*%2W;f_@24950^Yi7z3eL#D%6nM>LI0) z-5kC=aY`leRrtS{u`B1qZRE&e1_D{$-nH8N z1h=e{)6WcT0cIc*ks)Gm#1Au*>^q+5mN_T4GBy1EyLKlS1Z$=~&|Ny) zwe;7{qiw4Cdb)ag3Nb7k!iGE*8c5^LP?A*fKQCf2stVAew%<@5)k9S(LcRp$LKcuJ zEe&;?PpyqgwDwaOI#xQfTLjiH*E0MdZjUd%;ZQd5U zeadw3r1*?FNf(C`w`{X=UfCxZ83zZ{oa%ip&bC_aK#G!TOh&Avkq%-^q=CH4%aa`WNzY(& zofER#=x7?3?)$82Ra^X;S7_151e_@tJ+c5N1F<>KowIX#TD7(O6p?%%DFBNDnlWbX zzKj7G$n*p0rb;`*nQ3ccrnf~MLdm0yG zLoL$bNi9UFM>&haCZYmgyJe7(j^yC>QlOsr(*2cg+g+$)Y$27h4q-bP-p}dp6sIXl27ynHFy6(6a_idU~Hsj@Z=QxVvVrXM5z?sQCCHX``sB{vtexvE&Es;gT@EYM_%W`HN#y8nEBht{{Sn`YV_s@{0|FU zbAAX|4?6eH&si$TO;O>ub#O3GwzMx8s$*$=0+b^i!2}%sqePw*ky%=0I5BN#3~UY+d2$}#mZQdtPa$RitC7XH`iy9ZOg3invWy?7KI2#=GE5o?4p-;$ z)T&f6pjEXkK?M_43x4gqCawdJ+yKfF-}Z!FE5j0*XgfnX?ccd)CL0}`W)&4 zr470D^uBBB|CpiZilL0NrgXRYZ^VSthkl6(H7}fHv4}MOdf$6NdG6n6Q zZs$@~G-U_AGv8TDOr4|ywskF7!pE0j8CM@qU1uVIqk#uMBdm-H(SoA~TA3tYDz|g; z)!KwCaHJA@9BWj9M_$?NGmUQ%GJl*P41SvNiXdWmj@k9q@1#3PLn}OG9vZ89WaChL z4=IvTd;1L$o>q~V=N$X$D-y@+Y zf{!EtFw4ZF3<5POnFKBYUojca%UhC_VUW{QuLV7`_4Yc$!+0m)@sL#dkbiv>T&%1r zsmF|S-ik_DO(ELrSHZr#ScL_ZFaF zh_aVO2am3y@XLTleEMjlEs2r6MsPtrvFYDZD=g*~_>@oKj{S~t{{U`?b4rP

RdP zFvHW=TO*83gg$_F@2!d(1+%S)q#}^MzPe}_q!y#BVPwRa$RECpZTrP-wtt5bNYFV2 zqXz}C@;=8MGmr**Yi%GwGMNxH%ROMSGOT_v9 zVeESz-iO=UP;FNly9H|^&CZ@qIVw+aoag@C5w=tdZA9mq)Y4Ta8KYc|YlGYl$0JzW z?4~-DNIdkF06Y_*^7kKvpFnY>U` zBE&N|IPQJ3kHkKBK7{DOqg{|tNO445vpK^9jCyO+2Nfm17$@}_BU3{)G|ddrv{J-) zoVQ|it|g8~z*2nJ#x(ZlDPtK?l9e3`1S;Tm`sxcLs8tH_InV2+38_R8mR87f^3*n` zSv$KGBUfU{Mfh@|HYG*@2S0EpI=>RrbU(2m<40${{ViaFfmRB4nX$y(F8U^#Kf`rQ@%%WtBCLz@=myk-2wJy|L}@s38=04d(Sa z+Bov%#|QG%9HqM`l~PA0Tq)xx*S?}g3O65Ma87-7I+u$?7mji0ajkv~uOL*9B%E~ziGWR!r?lLAA0gDnz9{s(v^G8z!WIin{$sz(l#;SqHvb2Mn5uX15 zJu>Y3gf`2I8m3_s!-vg7eRO^wu5>Qgh&4kNvteLwxv(Ii{MX zkVzUXI965|jCVery>X=o&p4SRQIIi^-{GRx3vG2xHA#ArPj4)~B!u9fpC58@>+SQ= z>L!az5qzeAOJq--`xq|MC64B4?DE_yNu4OtS0%D@8h7Iu?T@L(bB%Kq+W!D^zwQd_ zy~aj)>ZbFBAOYVBG4cRlepeNxWgbt$JM^huGO%p6GG3%~yOj z`c!#j2Z#W7$o2HsOKe@MNwaonn&VkTAB9USl9%=@Uj*cL>=zjI$8U40$Do@^JMI3i zw&NhDj*6VWh|!ilA!P#q5DCFP`shh(EmaWBw{7rDQiM~>Q1YVqeDHjQnS!HZ%yK&p z{$N2qZ^ZR3bfOmUGFNX;5NusvRaflWbsfHrIZ~o3fgpJvc|4J$fg*WjRy>Cm?UFDV zaB|oszT~lO3uxTihT%xE)WsxHRYtCkkul`S8kG&=G0)=kTx5bkEc;+IG_`lD?b)jB z-Y8U>5?LA~OlBrO=Kvsp!#VBTV^lX=uD3^O8fhxb32{cN6bL*sPZK%tmDC>1g2a+? zNy+xrMY~Zk1B4HFV@JVOmqSYRRSOY!j!KyxCO8eipD$t99B6Gwa}WSy1p1!d+TTs$ zN#-DBRO8-&?L! z^)#uF_-2SP;(IX9Z}9ZiJ}gE^WJW3w0LSawzKGS-MOff7h9W!@?aSql%TZDWhFQ5` zn~N`rf_oG5{{S6(Pdu+5!b2btfU-UYNo?cS_5QlvPs8wmNY8{o?d_i0g-0vHG%AWP zNGzm!kb7$QQq=j#4NM z2&awF1Nc}6k;o?lKk@yw4hUv7GC@umoMu1(_5(Tor&ixYC1lIU5a19`G4gn+_diT^yfUL!c`F`g_4Iy?`CBKUwr`IQ2LdhE79H}R{9gehdJ}4o3 z40bx$@&<6E_8rL4S{hs8s-7h6G=UWJ99tYu&qOJ2O^#J@3XlKirqLI8>c^wboJ^K;zKQX5>QuZG)w70;*F@#vg zS~6P$zCqMih(B}qv+R4FOQNr}x&d5eg|pbj8oHm%WD)Q4*R?Q5%t=bYke{x#GG<6= zt2?7}a#Rj1fOhV4jd>&?#!z7T{IjVX3XkOn+v%(@Sbq>;oie*B3MV!L1a|uC775P- z*B+Xdz&RlHZ=Q9e#f$@j+Nz?hMr9~YeqFsahya2Q=dI4U9-7sF8@Il#4=d0M9xML< zs5Rn{TOP~Y{eGH~BMP42ooNw;UfsES{PYeqpjhKQhC%o3q86GMiTKLY%mCyd$mfr! z_Rh6M3bAK#kURQd9ZHgUB~Tr?4B+O z`RGN|+f2nMndFZnjD>O74?qb%{`!I8yA^pm1^g@j0IBFT>$iebuqBUmQ|?hCOs87~w={gtGZ?a6A1qw}^o;jGSXzupm+w z-_?(=?X53{IV2E&eF0Z?q}pj^xK_sxq+ppGVm)P_>BF$_Hd_x1Vz z0FIfg)}^-Cqp9GlRagYY*!JK%q5=73kLmK#-Ep^1Jk=2MDqFBs0B7m$b&=29?|@ob zz}BcURlgC%Jh>zjft=`a7iy+)vV$dEJWH8F}(r^634?gt_}p8o*Lk5B8ZVOBK^Tg*pspZID;o*#(1BeJ@*lo6M5%y|F4{_(5AuqyhBWG&q%q}5ZrDA?Z(jcZA*Hw^sI^x*$0=DOEg58Q zT;vg-kp%wwbKFuzMMLmX%Kj|GNazP}rzbhc`Hd&lQkO=ljAWq!{l|Rw&!@4~MB`ah z;3;f&8RR?U`s)@LIT-AJZE1$7L}ocMaD2Z(t>m!Br+=olwBOBTaHWni3x1uoz9hnc zK+by|VGtPrf!O2^nZ~7}HxOLmeb3KCaF(!zc&o{bcEJ4gr->&VM=z&+N^A&x!yum6 z?d_<>V}fE;$@kEgQKVd{CJ4R|#`Oyn%Z61TktRqO7#*-ObDcs+#BLGai1f)P8YwLx zn%z!Uijb_Ok8GUh1pfZNEk&=I8p#By2uTJN_^=_cF`v&$OsWfYeZ0~tyfq0rHW?&@ zo(<@6<^be+eq-NT>8q>l^>EziCTJ>P!z&}>>D*(uBe5EbOItjsmg%RFsevUU&O$e_ zAF2Mj*hG;LO(aLkFg(5U{{X%B)ex_NX_Itrn0Ga@lf|KU=C?=S#plYw5d1MAJ<4a1 z^LGWYk}v|zzDc9;rAY`9Mq(o$%H5CdGpR0_rIe@{3^_JGm;V5JjcufZ!l!OglCOYH zI}K3A5sM{iqEhz=%qZnuiN-O@>8~#op;T4Iql-H)Zv1=p&*`EG8?gu=z>T~2@9Beq z_12o|G@6h}pW*;ao&8QuKcV^R>$;VSS}l`ERL2n^Sg(kl%tk;s{ZH?rx2u&C)2#)n z2d9OjDJryu^M}aqf$|!Qwk_>hJW$4kjPtB#fFzOF008wp{{XI-E;~#`K~eB^@H8~b z6OxP==0sLp<2e3t^uW$CG&~h!j3g=BEygbA&>VXH`q1j!cot#EpIu3k7DgPMONT1T z52iiy>5uz0jHxCGVSqjLbzudSjjq13&vAy~Ln%q%V9MC-`4D|auWv)G@!YE@uIqQB zRDz-@1gV4tLw~Ar2>Kq{grxHI&OfH4%ob{%NDmgrzow-qFR?`GD=IEEFnmB+rl_0E zAVK0t&BOuQ*SPK5-2C;Kq>37;U`25xSys<*7!nQ!JqK^t{QGLV)4>%CCMRI%R1eta zC)Ylo*IO;D1ZKKo%-}Xyx2~wBi&#zL^Isgs9yr8gs{S#Yjz`@80NJRu^x+$kLKqx+ zjAKP&X(~A%hx|Zgq&Qz+mZRLGSln_mVSf=A^}y|p{+bgb z7-`2Sc9IPwsOlC^3`rgp2Y;S%sh0PaqIE*$i+M(VppWqM)E|SMj-~19p(0FqQ1`+4 z{@QTZ8%DnIbfzgvW<^Jwk%k;pfLo41!1;3BDvSrj+B7 zuek@Y1op>&>!XzWn(0K4!*ipKN-JBtq#`6%b(wg`Rruh5QYQ5G#zu7ebKCT`>NsmE zDrR`EUGeLr*eo|I?aGm&jZHK!;e-G)79e*ayJOSm>G|sz z)UdYgJh0s+2C9;lr#XzQycO) z1;P^9#y+_?_WFBknI@z<&8=*YX!9p%spq%ayd1m><#ee~4pRyUZ1)F|$K-neduV-n z*V`?INTf*IGZ?rP;V?dh!*>J$>7Q?Hd@e@XRjzE4+>{VOnDT`?5s)yUv+dg${O}QP z0;T7usgOl5Rg?I$XE+DhNiFDeoaeT=Z*hKmEiH3hl-FyvAG@Han)yX-j;WmZ&j?`? z4F3QrVUkD~Ah6CejRm`3t@cVdDee2Nw&7MI=T!9;_{eFwp2$*Sp#o#RGm?F^zN}pD z_F7mBu&^j4QwYF!`2n1s*!9MKLrYZ~9;RuUCgl0^utYwjWPpA{I>#ofPQ$d2tV-Z; zx@TfvVy5Yy--7=DRbElxlC5N#js|0JkH= z6yw~03GJL`4L1ut1Pf1NDGJDnm2pVYv;0iK8K1-Q|OXC#*M*}I8l7T=WP5>F=2W7p>4bN&+(_ZJ>Fi>-Ms7%)Q zvDbp$Vyfl5MG?3num27K`mHw)rEy(#LS6tV(RwDPRW&Y=AhG;Bk@| zH_J;~!oO@^>ykNQs+yvPBS$((BwiD!V#KOQtV`$Bh7J^Guoy^XA*KxCkf;%*3mYJkQeDW?(C>~`zbC3z(K^QZ3)%LD!(?>&5Y?hJx(&Cyr zvWVOiITI5Z;gQImKrmlGF`$(H0NLABeJtxiM=d?NG?Jcq-nVzAYhWD;GC{BPZTI3Z4&O9I^HOt}Gj zmf}4Jal{>J*;Dju?IkY6tKOBnl`qyoJw&x=sVwUtm7bPp`zege7Xm>V7BCc0@PM_uKt@xZd}s*4y9wwOw|lHso}f_I#ZwheHMC1fB79grRRTpq%sG*sBp&0x zW2DG84%@R<*e-jf%TG;fwanDUo)kugmz*rB?1u`-c>#dEgN6aKtM>IRqT9Od)`hIJ z8}(c-Rc@nN)Q)i(!h;)u%?qIn0X|@d9f8vPQYOA=!<%3XeAk%Ko}(Q8=3jPmPHDAIFk&aGD{1_g3)(0z*b-A>z<>}3=}rW z)>dLq6jEene`A$Xk=S7N3p)pH-m7Q1ShoJyy4xtMH74C#a$41u?rxmVidBqWES!%f zC9*kvKsKJ;wBIaqTd8EcR=kRhQ7rO@jD$GK$K8lM{fX`QgRCyB28FVyDvx+|A9(b> zdo9}IEy?LBDoL7#8)Zsd<5eKX;l$6xvl0h!fIeWIU5mJPtwg4}(kQEiOi?s6wfCV- zQv@<$pi3!NYfjAfl4%aA#Ax{ zdf#t~SnSKSsOgqPN`|F*ZWWP&;9-brQyPxsv25XcD<0ZPtlZs7uDjcI{o<|eg1+Gp zmU@brs43v4RxV^A;3TRldYNC5AZN}7oO+GEcTY{WHN&YF`*gxfYeV;hHdH=pGQuM3 z$%Y7NV{^;VV}Cbcs&ixYil=|>f4HVdw(rGJwRI&$bu{&})C6?oB8_}C=24xGorjd1 zckJhxA6}nCENcKZr+u++yK`xDR!zaStErx-UFc~lJ{YLt3m4$H0F^v*-?0R1lIri& z*L1gBZIQzbmU&N(;uVwOCw1Z(v4z7o43L=wvB}P^AGen7*_Hh_v+aGCEnVKGJF`_? zZuJQfcPSqLABW+~J_6uirU=ik8f`npJQGw>R^00#ifBlQA)kUYiowuGxx+3-d-miM z`)i{E2TTyLOz$%3o|NueMZ0!gww#kwA(qhfP>JX9BjT<+Sjxr=EV(i`z~npQ#Q( zV=tabP^}YyIVe&@gsB7oaq{nJKF-}@@kc{Hfr=FuMRgP5xjB!MCKNyxe4Y5=J)(=^f|sRFZ^_I8|gEeRJK| z;QDEv+j)(AYYhb)^%NE9RU{RZ$ty_6iWNgTlgOV8F-((*4sqK^c@zR`2XL)xZPn~| zsi|awca>?;)}~fj4OC2WkAwpR4=KsOU`DH5=Oq_Zpt`MHHB2i(Oz}WqW`;u|y9~Gp z+>;?#3^43V4{brbsk>WRvRl-a#rQ031nRdf|MN^t~I0Mf%J z;0YlI3a5~7AW`NeLgNQkq?aA7Uwy2%bt=tuwQlO0El0*w(A9|O>MJsUGpqtp$OTTr ziBs9sVM%1T%$uIwZMEEFr>mkw%Tpw0@id2wV?2m%$0UF;j05YY8~)?BZrCoiW>~0V zo<}r4cvCt`YGVuHM#L0f;zK8f7nwLAPz-4ISPE4ozMEE9=iXLJ5vz_myS+S-Nm3_T zsN|j~;*-N@vB(w?x%3B+9f1r1E%`Mq!jhuxeA~%gz3o%9RAQRlEo}5ueE7t&GB*@1 z<&_H(6^37;23Yx6c(^AP%RP-Vf3R60{5iBH=HXFQbzG7H`fODWDX-sJtE0^#4YP+ai zL7<~pC9b$sd@K)Yt2Hk@QUD6AL!#lFAdEBkgoW8^zlj^41r=nB ztAm0@3G71}hVgZVqUiVHwG?k$hAuDw5JpfB4H79NDVA0~7z6S07zAa^aUzjz%Ca^$ zP%Wz*J4WjjKNCtKf@x`%;)ziBNSneX7ByrI%=w7JFe}LEpL$#5lF%(HRZVfMv_FU9 z2vt^J;sW!djD!v_%BsX+$PC^_HEz-s^peZIZ996t?_jm~6%$2MP7u*@Y)0jk)PxL& zij(+zQ{pdgyG4yv$+ zSgur?dZHclH(ZxCwZ%_dvn@PvRh-09NagvD;r{@8B%B^h7glFZZkIjPXqx{3y0^tn z+oY_tkMLAo}NeXnS%vj2*ZQ!OKQ8^wi&jr=-YJm`)IADq>3Ax(N<(l zSy6(Ftr$Ei1FWa@rb*SBT zn@mkK^Rm*{(oXZn)h^tUoVy?fO!FXQ0MEo^ane@pxzvOo)lG7p-l7}0*2{hm5Av2L_$d+BD@n&)aECwjT$t1mxbrA0yGfK@ay+II!2%T)y(R5jN4YMBDXI!TzsVOs}2oJV3kLG;qv_@9P@NDE5{C4Og6 zbyIFu?dRWA5TRe$KSVa;vGSqO5r7niu$p>KqvG z$}r?{V!(eR5t20vquXk+DDKO5KM zV^J!GAr~Y{NCzGN00|0n-yEqg|*d4QsoDA|H zX$x@8vTc-hN)4}BQ#C*cwNJ~Ew46p*9Crlr^vL7&&Yw1*yj1)OS*ba|kg+8s9G#a0 zl84s|^FKdxr9ZM`4=5(<+LfCU^+|uNl2@jxX;xSnmSqm33}la)Be_3;Ti3RV-tBbz zJ8fHQ?oiWKMSqT1qws27-h{9!xnRBWtAbT=+yRipi1+%f=UIDQw_jOLSS}8*_;v8c ztxX^i99Y}P8e_%^c5L3jAHp`H=KGbmzX5rsX-9Kx~p zA#!k6M=LGWo0buBsiB&p3vDPe)6>+HWOh`?GH`HDA;fa`&PdjQb`o4b7(w@Kh3uC_ zis?VZf&wgcE>#179a<(pPY?*tEOr2Q@2+#GyWDIaYz4Y)O{I6-wDDW%s-~o~xM`wU zsnRJ=BZPR%KdT>H9Q^tovM4HS(Jf`YrK^MrXoWzG66B97F#Kw`3yqC7$D19eo^i)sI6s z=8Drt;4E%b8F_Iet`q=AY?s=d(f8KTwOnnHN|h7_s^4*f1&_h0cv(jYKt66f5amhE zdye1;HVLA+RK*;(8f$z)PlkxeBdW8IawKI80m5JazN|Bmtl*8cNrdH9GHx!RRrM!r z?g@4+UCzz4m@|D28_!f{vkktf-1)t#t3c=gWO`t9Y^VY^}onA-tF7e#!85U za5|b9Qd|H*N|q7~GdVneJPd#e+U=5U%9OoZuVtz3@U%6~lSr`CN6Qh%D&<3v&b^#_ zuo?DPprYE_ZoW&6<8Im{rkY1-97PmHLijntj6N6-ki&P+a9QPdAqgha)h_$#-JY>- zv-LA-P&9Fg;Wc+kb`m+rXvAca*$0XB7;fX#>4T?r_8YxHyY1dBOIj)_WsWM9nwh6s zk~0QK%sv}NFnt&}_RgSMExin`+c8zq^tWvI%8yY;G!{yK8Knb}qaHobl1Fcr5>f!LDpk=F;NS+vJmYh`wcI3m0 z7mQ$t$rwNf0y_^y>!#t_71n!MwANbr8kU(kv5BGM5#WW$Zb}a_I|2AX2h&=py5nZr z_JpmoB34%0X%Iaph~;Nx4!BaNNgztaN&Jp7PO+V2M<9gWnc-5uac%4CO&uQMhvE?8 zIBHnBN&(Igh3-HZ&M}Oh+ORhFNbD50iT493ssNRRWvO`*S5^^_!861j;A9N&Z&D7l z^&-`|D(&|zt-7|h-Lc*3{Aehvt#xtMyv^Yd9bCa2kuvsh*awL{n*&XoBIDF*YxTa> zGcC@Vj-4o8s*0hOWtc(%S>cvZoU;ZFhbzcsNbK2R@NGPPSDPq|rnfby%WTVKp2b9J zHeJ4XD!A~cF%^uG51cZdU5|d`a`Yic(fi9*Pinnf>F6SsFAWP&WudCd3?hU zBLj}>k$_IU+?Ps=r`=Td2&JQ{u|g}&!b1y}4C@$+D9xD_OOm9JMlz$Z(BJJH3{s25 z#&5hLmQ34IL~ESyGZCOTfs^ z2w4a`iHsBPz>Hyt(C@S^@D~bt?XS15WYfn};US8bFYw4vsdrEmh6Jb}4mdzbIVYRv zpxty2C0^eY6N+}`sWfsIbz%nw%W)tQ#{dKCk3a@l<`Vw^PB{ZpD{T@mt{blVz23~m zI7^W)#24d&AC5T>s2#KN&`B>hDJe}fl{IP1_>CGlP|QHdIQ8@&wyU4*RpQ%qnxeO4 zOC=RWy`zermG~>v@E}Ne2PFaiT;~`$2O!zq54!E%r*2z*%e(CRtu0i>q^z{J3Sq`1 zjhscoSb;JSgmNbY;|epZj`00M#kJwX=7>)p3r#g;J!H=WZ8U~38bItrW6&IS?V^-> zKX6|BPldENf)EPMUyO2wC)Jy<^gg|^J#<5@w#4ba@7mi&)3+(;&GLqvbm*}dXh*gs-75LS!oZ%6W`0`86evBrqy_j`{9&XIT0xS9$M6 zKICcv7zew@jhS3`;gjDW>20n%mXmZzMRBKgX=3NemHkDHgS zx^2bA|QI*OZpziv**ijqQ;%Ojap%M!uDfZnmF#tuOFooKe&s4bPk zf|kQa6z%>`Jo87*RyK^Iy7Oin%W`0X67|=$vuv~DSihK$4e9*3`#jE1%YPg#kl};kKb1K zpom`3w8smiM7IQVXKU30lrv8xP+RIB;Fc*Qgfp=|Lw$pU5?rCPX zTk2K_Lc3H)1{68`N*EK!_s^*BoO)}ZZ+nL6TQb}y4x_>lxur7MJd+%~@Lw9R0=8g=*^lnMkKxR+O*9}APj4-+APZv60|6k3+C_sCLc4$4#| zviDPTshZv5B@^(DJ`}!B z$2jySL#U7!4WfZq!E%SWEcAP>(@%1a0Bel=WO#p_LBp$e#s{uJ_a5GmsH#%Kbe4j) zbV)~v1XR)|h@iM;42Rf;#sTh21Dq41Hs}`KDQOgrbrQ2BLboJhx$m5Ur@8Jvnvrs; zTYc`|TYuW|8LFfPOiaUzJ^^n`6OcQOz~eoSbh39abjY!qK;cf@5UM*=cZ-zP=x36J zDI3RzS)@EcB!CnjL5zmRMpx;tE!(!o1?DbQ)OXJ09vZfAw6FkSt|fdpl%p$S=@tZM9ulO-z;3 zLLrV$0!-xNjH3zIAyynHG}nPcR!kQMN*ieD$W@~8lk!&GkczTLKV z@BY;7OVBdQB%Tb*N~oX_f<#Qx$A%5rk&66+=%LU_Jj6-ckJw8ywl;znW9<~LnwA^z zHv43ESYu#lnq?Vp#6gkRf!Hod&k`^I0E9lS^qse*4byeoph`{2Lo88zJoQl%I-?l- zIB$}G6|lhIdJ%;Vi}eDUUKdU8xoW5c^Q|oLMM{yyB`+_+j1oa1UopproSY0`9b9&e z=e2h&OxwF_R9tK3yUkApO3IN_NQzaPw-JXYf*#B=M-r-V2Q~3(yfapH5r58j`4rM4 z)W@;i*CSl*mkKJ$XzmvGrLLtQO$@2UyN_?CwNki|!TcS7J^epF-0J)LL2UZ^$G2SU z7DtZdOBV{tNa@f>;f#{AFb|RkoGDOA!)FK9kh$8bZMO;S^(o-iQA*KFpXm={+xqM1 zULUS*z6QuJdyhrubsA?t^3t?V833?3BLmahI@#c!0$9&x#(tXH6!A>qWFY}wE(rJS z-&+z92Ph;X7|3k)Ao?9_NT8!0OiDTv^w*_8Vo2@ib(d|BN%q>N9ovV)U^V#uf|oUr$vr6>;TSNzp2)$cvyqS z(k_XRIQ_MBqSWd@;J)L&ep;7r=NS?P!BdZ1d+H-GXYPm7-%=@a z_?Q8n+NW@=V52o~$yX5!yd)ook@fY|caB<^hcMjZ^7k3?=)Jqbo}a;~e4)V-W4a%a z`e>qAYAM03g;rn(oiK7o%pccFx<&$7r=l{iIFFffyhgF5jpTx&os?!jF!}v-Lgj6G z7mmJ=`6TYk>%{tZ$G7dRZURWP)TCw85}_W1`u6!~+HWeHX+^h~`55J1A&xVEdwp~M zBTTPKt4$Rl8D~x^RA-mVI$NVb;(r$%k75Ry=YpaXq^cv3W$b^^AD7F%j)aa{bnX}0wYGtyJmQ=@U6aNzgg;NXw&KdyjDMq*AuNh~w+#+cJ# z2OOxvH5q1n06h-8okAj_eK97qi`-f*EP#hsLCwhME@bpY)Xf04ookp}iW$<~Kg0u?OGkHMFF@4*)qa01Xz~ zLLG$HZ=;iOQg||=NYQ`flP?uwxjBu#XSeC=@2&RrXw&Y?x<~Nx5yQmpBXOLb{ekqz z?dhSGDw@kkjo@Yo%sD442LAxC{dCh;Q%7{1)I&`yHHd@aY2CZ?9hOvK>zoYwcRq(o za4q>L2qh|C>FQ|aN;>6MA-{(pTyu}udv+bMp;15y@mI^l zMqZgBf+?erpA$Utzl4u(+fi#GR^k+%L)>bI3Kaq+;6wKLXq!bG;aiX$yC3*!9C5H5 z7w4iegTX*h0QMRnP!+7er;>2|KHA15byE`{W9!@8YHXC{yx@-Gu=LKfM;x4k^6~;f zBiH2fHt!C%Dl1ns#V&;f%&WBN{0S2;I2=d3`mBLS5B@`MY|0jY3gU z1;ZKT__OV=ik0&y1p1v$lAWR@NCaoLzTz-c$ARgAsyMB+!LQVa+p)Z#(P+}cx!Z`qRXJy1C6!CDY`G`Y{EoNBO~Q;%5$`E0 z{&Z)zv0q$w8Y6gQn(Z^!#Tudlh+svH7ah9=1QGuLshwjtYh*qgk(4C%@YFUy$FHtG zTxUJC%LdlsDGD)V!jq2K8jx00fHSb;%OI2AIM zHDOEDd*fMyLr-fJyj7BUDH)_FzNmcoJ-|MnPfc{;@mJ~MEdtMFhFt?@csE13k6qN8 zeUAE;%DuW7sn>*@r{uDd-;V>(h3p1#pHZos%d0znqRmrow#^-M)lj5O8<|!Je7uUH zF~I@yd-n7g;=SqH#If9_{)b%YOq!}PxRdi+ zSQ!o&0+9DQ*&}$~qGp9Z0+uCI1K4Bb-&)|5k_&Um1a>5M`s)V>(TC15Prs(H2_#Ga zA5-7@jTI_ak3cu=rps|nzj#lFnACh+6$sc8$cyDi2O#|c?VM^};odiW(Rgi>uxSim zcvekaJ#?-mspQ%5(I6n(g)V);d#cmPlZ< zZTe^=s1={Xl6NW_#KSl$&g2BiAbE%bj;LOxRb1}(FYQgqqaS%l^3$wS2~}cN-~c1o zV*}IZG~F#W<-AtKx9DMarlyiQYR7q`m8Ym2nOt|v4l2l}&`dp&uE5*KZThf ziVqK$97WB47l)C^jQ7d)B;(&l3{8$qa!|d+%}G}3MV;{Nz&R&4`gR(VEd=G1{5+*g z6%0Wj;CI3I?nm#hZ3yluoJQoB`5xIh9>3wE(ZMwIh`h7Pv@(L;m{M4e(*qw(Z%XWx z>aFlBhaHfpE=O!VI8A+u>EAGPC?ko(-Q513umJokOOS3031XP=Y1LZgXc09ei=yiO2B`Qf_l5>n?Xn?gu z_gd9~^AbqMsMownl=AE`f!|uMkS;=yC6?+Wr(Y*wl09{cgV>Dvoc%Re zDo|fV5nyBkw0+K79{&JcPo%lHh`{O2FxkNX5&0iq_D^>q56JW(pTiXhCQ|H6%PsU<#Wf=zw+yOjd=p2x%J0<>wGc^1@~B_ zjK)+#tN`uUcJ|lI1B|)B9kscW1RQqsBUrNFcJ&`V-L&!QmZ7o`PhpTfGwb!%5Jn8d z`r}*94sblfUc`mZr+;jF>Z>-c)(oH$Pruh*MH@=|6?-YcCqyHlUe8c*@=@#g>uOT) zFW|%#bLx8!-``3#N(CFjB!o<#rag7^f+&;+87t=OeevmyN@j{I1pw!^NX~T%S(V8F z7xf;xSt#ja@iF6)z;Zp`Uivpk~Kbu>b3pa?%o;|bm*2z((D*%a!Vljpz13xc)dpJ=kh$}Mt0z3Y=CmOB_ z9zu@DSe&Lux391Lo%Qzs6D|gOc0Rh07YpLCK9~pp08r~hf!T>w_9M5xmQjVFlP`{4 zzK1&5O+_U{s|*pBmPZJK>P`l?$3zu;Ny*?aM{ivi+Ofwq+>}OUh8K9awhugD5%mSR z56ehq8${DzzA1))zNydGD?iR2~PXi>evj%=DFhEv6FK_Ym#_*B!m{q4Cnx)>Ne`Q%(zj69BjV^S-A>t_vs; zvcln{d0DVevi3dweFw|stVa~!1l*-_fEmc_ewON@-M_E^~p{9RB|RzKc{8iWI~}iOI%0f8UIM>U)lr5=fFK7$mbXP`N&x zhs)FY{`TDE2_Zq6CM(5vN+xlpHau~x7e~Y#bNheb3+)mR?#X?sXzb$Q&0SdVI9vVK}jns$xht_ZS~@<@_*2N@VXow2ATSphNR`EqfprEVhf zwE{EcI5^IJS}#i_O>}XYRis$>j!Wtk9{E48&W9%_rATCkG~(r!LO^cd0uRh~AJ_+eQ}I6;(X4&hiLRN~uBSgf0jZ9~IR3z-&WJXtV%Fvq@{dUG8O1=>WcJ~)<|p^ESaoA?emjP}kLYjG$cS_1axgo3_CANcPKZ*}trM!nMuMr)gG5U=}7PnQ;iWh}~ zw<4^k)Ps)tA!CiDr3oVd2XenNp5LaTPe&iY)3U3hwpg)XK^egE`hq+9`s8Shs78`S z0${KlnWQIgtg=*^m}N1T;vfY8k72F$t3>tn!jOlR<{$)#PbOpO=rT{pd+U6W zGdybOTbLlIUPJ@#f5Y|Fx6`^BI~9p5)}A{5qr+2~-JsM60-RIklmcJiEiaUOsk_&%DtEBZHVtctlMx=%||@Tj9$ zBdVsJJTDIMNhFHHJ{~{_02si}VOyW<{{StH*IPVyYKo^=k)EB2bDb+y^*3Z~#uokaxh)p>>nYkfs4C|is$ngHOl_QuX9pdzpKU($`lbpUqiNc+ z)R^d}w!ud6BJqw;Ap!hi2XI-r5~r3zl1R$8G<~!72FBWUo1anI(ASN@e5j_iLT+;S zk=sIek|dPjIEg%gl&q@2;aKG4A6pXyj}bfUk+)#od@iNin?@_Fb+A-YsHdxqjY_n< zM7@Dw&+(>kJFBPz9k4X19?iRL?dLMBT?I`oG$J|7RVHK^P{4^4V3Ck=LZ12U>8?Ec zG<~D`flG9uwC_%-+?Q=nT@|6?ks_W|_=w&#J|nL+MR5r1;3y{=?&^!I6gz^CYt>w8 z>#K!4jT%oBYUvu49%3YB!7bRbfs>5-4Gj86XygIh6j9IZ4LeZ_>Qp7387)f;P&~|P z9Y|xugXnSFBR-wazspod+CQnV^v7l`-pyB4NqDZ5TPb9ts1US>=*B?lB09PR*c{{qK7ix4ah*dxo(Wq0Nu~poH8Yq*KJw=7h4pHaZ|^!Ct3736?O8w1Tds-m z@z9=J%<%xDAmoy~Ks>U_z-yr)n#)g79r)jk%_iHTw^xcf zS7eTwX~f}@LRf;Vpkq9{9I4I+u+{jFi}-wx-3zSzI8~(6Y9nUZ1{FT`TXy!WquADa z{T)qi;jT!7QC39!DU&kH>_IpjR37-x>w|PxZQqC6%WF%;Y|z5r6lb_pc(XK2;IEi3 zn~#adviB?86YCdjQ*9lay6NuwW|ofCPg*3Vxl^sSFA2O(DuzNMX*e$d6@aLIO%VHa~he_Y3=GnQ^n+Z~5tuh8y{(Dg>c)Tl1o-h#_*vCVFpiUhS*$tnhEB6Q}i zxWHJ-{vtfUg{U zh~K5uM-%xJR#}?&9EC>ouV`5}?Z(NqYA#g230X-amWrik;R8bN#4}*vki(CrNymI^ zE{My1+Iz%wzjw*8FIzI<3Gisg-BL8q*rS?$(!V07AgNG&F~?7vV_@HUWpTFGR@d9) zqq8iA3W>ZmlCoa}@#cz4Dk}l*2_MxHbnU7umHNST+;#Rrx2z1(+srr@I=XjmUL{1d z$_kNy0wCiUQUK0fi&f$pcQ~-R@Hq8Br-DWRc(S@)lWAPGT}4H|r&k*5RSdAS(c9@n z62la@AS`PlG?A}m$P5R6C?1+WLDd_jj(F`7(O>79Yza-jZ^*$3#!E{m0z>$ZVtp~H zKAk#4HMX{TB#uhSipcZTUG6evOScG&g_P7PjD=ZLg$Ecp%X>(@H?UnRHv`;*&m^l1 z>V{TiEtU!u6c1Ek$y*^o`Qu#CtB0NIVPPVvUHgluH`}CjR{MNAnuylGu|)M2a}X}r z=Gh#A0HwUg9oM&VGKscsTZ3&}J}2%Q%tn#XRCrP-;;7{FXvZSHfCApj*bP>9i+mT` z^w%r>($hym_z+v=sjN>P5_8FBjZv4lBpC2}cR0>~bq}W(3)0I+VCt-pr9_d-4KK!B zc*hI+AbF695E2GYn>q7iww%e@Pd{<~(%ir>t)2bXtCjNa4W`*^yK*{wc!rSzs(ay!9OQ8!KAWj~@~(8Cg2{8Ijg)zfu4Jc~y-aT_jz<_%fIg!b15~x| zVOMNvBYXDfv`n*>DH_~fRAwG#TnxImY;idC9+}dm^3`26qORpfT}?eJ(!9m_v2;d| z;f4>@eL>DnJ$o$bm`)Y7qzYB9TyFceUEMsppK;AwJy2?&04qeap{0^=00 zY>r0clhXLDGX;YInDZwX0e$^FwF>UFe;46YGdQPS1o!L-Cm;2{uAX{ZTej(Ug@&hg zCElLfX`EKoJ*X?yG?C@dCnr#Zuu+h504D_N(n2<{E@Q|pQ?~6z>!sV~*(7Z8wEv84N0b*>tvEDb*HG2qmFiRpdjRtt1vhmhIq3k?3*g2^SFd?pIq%v@P3uDR!Kf zPrGewl+#n!)2N9fa~qIEY>qOE#ZcgdY-AkZk>N4ZMDqfuv7RFY65dcr#u(uG1@1LAuK7i8G*lM& z)?}nvJPL_GbX;(88z@tb-1~yS`HycdaXrO4F`7{>drxrE?OAsg)x%KI(Ze-jM;Tc> z6^*epOWou#w-U+4xnPt$vKw~Lt2cd)l13+wn-rHGSr$ORum>a|2iNDP z2(Et(PYcGxwQ9x{A)O;iPD3F`RV{)^02T$Y$g2!#IjnMQUC=jYPwQ)HHrD01NH-4J zrilxw@Z7acG>$<=44Es8FgVUI1;*gut-^}WXTX|G(AC}& z=`8`558y`mJRyw<9$3aXwgz$Y&t=IPFH;3{wD8>3V1&K8p`;YCMTrj(8Y9dgQ=V8L zi~vAo8Rc7uPzx)cF1sd=VpLeSwc1OSR5a@)w!7}qR<4#g-eAonatDrR(m={dNci}Q zdk_w+dnZV?yI)g$+AkG%+jGlLSu7U$#0x1b%_kIzSzNCrU<7~?Fb{m{F5b3o>MPB* zwu+9|TS}KFimtlnRKj#+r+Eq#m6=qq1+obKBMb-P#Kn_z&{!!B-nLmAVVkXBdookX z@zU27l?%oyAH#7Y<#4L1JMu$;fOoqpT?z`k`$cRaZQT>!g%#n)fh}!q)@Uhc{91`* zMj>h-AtWb};t4LLTPL^#E!(4)E~V_H>R#QY@r^??Gtf%XKa8o(4E*^fpez0-Y%5&b&}faC&Zo+^0ZkdMk~(&S%_k%7#vFJDfVAdHqOi0 zM`Ue_1)f-{X05ESGjPj}F3Ajpt9usU{f-7e;=s|x5Q(qsxIro|R;r0;uMpQoVv;jU zJH*c`gkS=O6*ye^m;BjAK+HhyG~+|JZaYdDY362X~N>UB3-EE`tMMP<0h6-_lvsSURI1o6ch zN*p>8;asN$c5{I0TOg3K9UJO3md9qgT_UZerlP62^RABO2ZSMsZBu;v%t`-QnSqQ$03y9B9Or60XYWj#F*B}f)dLa4H7$I#6>UF(X4v0H67J?7UokK&}Y!Anh0 zDJoT%taH=JF$qzYf-uV)4$_w7N;_*VjCD_NY;DPHOIF^Ndo9kOiYjTN5yp~uht3^X zDRls-8Dd5TTM7lq6M99VQ(u+W)~gjiPVEz0qT19k(o;ztO?_KIB+*Fx3W|sm_^~cx zVoRt->=@*oJY8Yh*DD3BZp|&jmBt5#B&BIyo}kJlG5OoeAHNcKVOI;BF0$CSi*yt> z3zZhyrnl8cL>;DjH&>QEJY_x^V21@)G9#13f%6(%*l9$&dS~1BS?l1q+~%qfnFNzU z>QM-pBxNcvJVD5*@0Bg(8s#{iLSv7rn-0al*ezFz80QmG+^!2zZli<5jVTx^VLTy) z3(ZT6pFlIj=SWv-B!Jh{?pdUgnwp7tB1%B0jE*448<#PJATM$c%;!!w%IhY?pss?~ zy6yKX%|*tlrDzu85W{dxM4-woNR9Bo!NTYA-)B!=%282~WU#VeRtACZ3HP6w_%2d1mO zz0$SEq!&7S-9!~L+UBOIf}%2igzG0BB=^rGcOIj@tz&7nQzY>ce(ptCBVH_|L_jEe z_xv~`vE|4go@$=8+$d6i+DAj6P8N(s|+!#sn0u_ zZFKKPI*+g@x;<}=E;i@5)x#urUR-66)>D%gGsNSAIvE4D2*^GCb)wb8Htg(YE z4$;FLxZ;L3ZXe8hf}irSHVFwG!-oC##tmr4aLg? z+$hhVImjZ}uy30t+p$_6*tHWwW}+)^mY!iOa(MX?IV9oRkaOKasO%RxI_3VfSyItk zRk$r%O>Jc;7Z%2Ewm2klE12)ZFR3Dv1$0#-!vR zTwshKCj-8w><_p%X7Hri+qwj}MTsgRi^6qqLS{f@R|KmNfT_>8O`w2v2V&CFPM>toM=i;#%OrG=DOEzuL}!oS;<@sU!1l%f z#hbS+H*THXTI=CSJy>xSFNXn9E4*x5k#IQR4nCmd`ul6!uGOug-gHT7mbs*sk>wBI zEUJ>WS$T#hj!1Idlw>cbAawr#zO6K|(J4Ej?|BIS|r|f*iw@0(0L4TsQ8Q##UvfeG;bO($T$jD82 z9XtC{ZXUI6+ogh(+BO}yQ#E}}b<{~)JtTeq0L-F@kf>=8fg!@KTP=)f`yW?Sg`)7f z3iEBKe~X4_;F@)W)rjGQNuMg5#moWy(oTJd;(O+{suEhZ-sb+#*)0_pYrN4#R%eu) zRIi4#%IVAiAB;!11%Vj!)hWIAC)xtPsy5A$)84hmzb*B0n(BLvG*QyQ78%5`x<%y* zsu{ebjxu?0TN-ZarLx!3YAW5;U2dhQu1ZQ{cXl2V)J&@z#V`Z9w~B#RKlJ%vO6sTr z05@sO6?U2Joju!k+CY~VuW*+cstqj-bkwosCG`IQsg)f=v{vqpoNar>bu|R2Dxq3= zW|E9@?l~f|h9HB5KIHKlZ?M`o4(Q&nID+JqFF%N3si82%Jb<#R79cixGpGuAWgFKA zLfyj-#VGvbB}!UdwYjUePRF07*6Xx%HwgahRD~FzJS0yQyWtOyAhoAOL*cplOe%R5zHe+v?f6ZMOJhpsj`* zWmPy5vsp-+Gek&k>io7>)AQERsvHTOz5xYtgOp_SyNl43?svnug!Sa?G(* z0EJl@3x*l&c`iW5;TX{RIPN>L!30LvDp6B%lB7EaQzBsJEI6?Q5tQ>10QntZ@i+#f zN?HLX#s_rmJBwr%ki$hP$41I0c^#scfQ;kJNC9vI0rCgGeQc$*)humWEhJTxa3A8D zXx^SkW60!KF~&g2&V4n#dv~BX77sz&$w;NPi47U>g^Qt zty}kPWL|K{6uE|P5ERNhaY_&3^A*bx<<~T|_=Z`2`K!Cy#;6aT@|hAiaRc z;!Yzyi5{a?7TW4S+*@SZ_ce;#koYT2OGvcHj3Yu(RFw*#1@i&`$0O)TI`2v15VUSC z_$=Krz1^Kpsk=t*o8i!SB9Ra;wW z)88>qFBYDjNse3t*t>#MoZu8zAbNV|Sk&zrE3;BGwZ96S4Lm**;Ug!K#_Byg7gL{@ z{Il&o%c`QQGxcQKrYW(nL5-TigTg{^z3&ja&X%w!A& zT3mL$($;8UsD>(OCw4(?tPLE@=eXpI11LVDkr_UkvS8abKAv>HaCHWXw%<{>;Ce}E z5jn&RZzL?O#$%SsvwxdaBLlePHKNfZbaPZ*E_D@CT;Y~8iQnTLDgk09N0jB2IXD^b zjAWc@Mb5MPQD-|_aSBS>X{hI<%mBvj?A}%^J2p5(GmMTS8tds_4xT_mg%6J@PKC}K zB|W8Zwe>#ao0{tL3ymww#;3*O@J%8ZlM+S)g-$sNrw8lEom<^U+i*i*ZN0Y%tGz8{ z6xS)CmO!+NAA`;OKT^%%fB+wfn4I8howMyq{jEcBrnOcrEV49k3ZlkO!T8xnsOGrG za&zCXIsrj;yx8NG)V8Y1>RF^U9xRB`G>i@lGkSsUJA;p(ZD?e~IGxw&@K@115Ul;L zx33g^JKR@#TF3{&Lsb6&6ls{qrdBT;eiJJ)yoNN(@fhXmeKenK`$XcVUfCoS{Q&Bj_kHPSig{~126e)r$AZ1W#yMn#$vv~33byp)eQs-- zQ6}G-NM^z-&*9T2m2=tMfFAv`-?lxp$4=Ma6xP64ZQL(wZkH;k9&5dIMO?*lW_J!x z3}7<)c3;y2wv{YNJr&BT^Ca>_lJ^0bVpUwYDihI^sZsO;x6f9F>*+4)+Pi+9?^{Dj zQ53U?1awu2Jx4K*SciYxKA?QHL+_bu>1(2zwhEI^I&f%wCqo*r9$zw!`9u49>P6L% zmY(S4mN@*)94C7>Q)9SpV`sM5AgH69GEV+4pE=pwka%39&jaTHWFRjdCnt#mzBG%lZFEr~z1#0mnzof?Y6gLc!#5lU108|M0O!+B zR2#aM%}DWA)Xi_G=Ol`u`Jf~KJh%sz4nq5qGo5CVGYr=XKzWt7B39fMN2G!&Ah!u* zN~s8mTw)Y(2Nox~uO`QEKM29^-c8qIS6(S7LSz!erY2a-gcBza%sZ&{2R*);k7?X;(aMyx_KB(i5R{ZSGRMuAfd()@ zWeN+7U}b^9!P6Kfc;6pllIAl0C}z=1jn?@V+^LF6N#g-S;bY*&PVa)Hcpf9VpJVCY zMej6K``$_ImRgx%jv&&W{76%lACKR#J%N`l%D!x^#Vg$R0#z-}s!Ez- z2&RdolZ1g-s~oC=Ny-HbTL6QAZp&u0-f7mZ+Zmv$HPc&UYR8e-R4FVOWgJ+fU=jgr zfJ(O#4x1}l$B9^OxIL__)Z#Xjf_Gi#Y)N*Yo~F7eqESYk|zA6a%P*rueqUgZ12k*1`l_-lN!M)csf1!Kqo+yxEaAom(#-P@Z;DXx)JLg>sRB@tv{B6bQ?hwgZ3`|_45@binGJpz{9$z+2sD_hL-|Eqd3ID%#58Mv7-lbjafPM&G^J#A&ChV@Hjs+Nr^o{k#YOF=ChQ9C~X zL}a5J9F;lpWUrVVD{cOp*(mL9loS-HC2b32)Kw&qQLKtpk%0Wt)Z{!s#2M&Zhp zf3@_w#knHBTci|qwREPMdN`_NX_ik;by0^1t;8c79t>59k3N8>>D8P2drP$~b@a7% zNZ=Pb8p#+*#+~IMp<=|WB^#a_ZD z*k{eex0rSq?4vk~(|(9aw=NYI8`bifvZNP^qA4jC!D#}rzbS_?%eWzM0XR9&Z5uVQ zHZtQOx*~}Cpy@imEyt?0E?WY}x%z`)XlQJgC}4&E zR+G4D_J;FWVy|7#U9&5m$#baVPeLnx9pOZugkh!xx~S#hgXH8gduNGt>L%K$*ma35 zp0-&G!yKfie=rgdRalkJpeTD2aa`xHU6*y*Dq6vElAarJl8c;_ zsp6|Fk(oTIM3Eux;OBaEnxw`?d`RJD z7!DYzEE54k9FhR+TbsJIv+uhTdel#Mtf8rf?IX;SQ`MxUy_=GPSqN(M2zH< z$CC_m1aec101t7UZSXnWpw|sEkCoW``z*Tn+dLb<%T*jEA9&#B1PQXpJ2d!GLQO=T`raerT9?W_SL zcyHW~pT44;l@?h8F;+Ow?X7r5InQD5ucpGvMn}s!&}JZU1J^=a0-y<7DyI>t1ovT& zUiyrK01scEZ0i|gGRhx5gT8%rx}8f*$G4}ZmQCd`qL;o9MlZzv5HXLQyhzkZpJwgf zTirN}ls`>irO&VFr6aYfp+m@ct_C$7qExC9Qp&JX+l?&(WG&- zt@yoHd*^!nXT%q50{C&wf}dz^Viu!^K?k^v8U9jA>7AqCZ5}cD2yLt5-6!8z+i*;TlD^#(BNn#U6Qp$6%9`q zMMwvbVm$*M-H-L|K3d&hYNUFvf~R(kxCV>FKa3Ilr_lboi2fhM3V{w89IicZN9Es4 zl3G^hZ-TX_K`djI8_)sj*#7_@(@QSeMWO=IT=X6QWnt!GKMua7gW=*Q&6dxujLk_q z%yO#54hOI!*o{Z4r#>E0f7Tx@J&&@1?b;CbhlW`J$X;Fh<6AAsEkvp$f8qL`*v_^% z%o$QL-MfE=q}vci3G5hxeuEm)!&ypo0ZK{+1gQQ`OrK4CPb{Kls*}#jd2%N|roLk8 zrPTI5hgrJ;Lc=4(bL>5}9znt=+1(ANJ}S!Y2=CaD>8aE*q>Ql4$1C_8E`NPQjBtlI z{7ARJo*87DYC+SwEh5^`iL zK6(ALr@UP!G6xhTsoi-p#-txk`inFTBw?L!PrjS!DB+e7IRKv7Lyy;9*4W^YTB4RR zR1C6wzN1yvZPlk86o6eM_@D}a;O9O3y3RUrGi8u^_ajCnqDgSE0g?3f)(}y;NJk73 zeSNgiAS*kdaO5EKKvGhLe5cd4zKJ*wT#WYv+eB+A$mCH+Y-1Xa6bc-M$OMk#+eN>) zQLzz)4yq1Ah)*s@ajfA|sDTHszBE;!LmwOhta~4QMes~P6nbRf{PhF9R4k>Xqb3}e z^DAQ>+KT0f!N~=EbW|XC*+T$ubp!=pEScrs^3iTpN;NVN7@T9%x2~naRIjP+^VYEn ztEeXg`j1UWiV&x;`u5QWQlb{eX#6ZDasbKs>i`#-Tpr`o8ui*mZY1_2I@%6LX6^ta z`{=rorerZB|2W@O&C$9rV=QZ zj!(Gy>LH3UNL-VT+eB3eM~n=S{dK1WSb&|F`e;k(S!IM@W7=MNmaT6nRuQH^^M5p$ z`QZWW@5@@ZebSDK3W|E@R;gY`QYqwAWNcsz_w?=i5vHogJ9}is6l##XsEB0#b}}$5 zGxG%F_SJW~XdI;EEQQ&Xmn(q4{{V1${{X{YY4e>-?s?;Z`7X0#=|mgdBu_MwVm}a+ zUcq^K1Ff^j!k#Epf1Az@HR?j=2osQ8l6^6wcHOUaxlFMo1GIF^9;QfvkfOJzE;$3R z`g-@%OM`MyR^x=b&PB^{7{_s)Vys3BDDUbqtDe84`x@6v6~?ahb(U~c{2#-tJ}Q&k za~#xQdgP4bwwLbvCf?B1izU8e6moEmX$v?^lfW~9$1TNx{E74#(1}4)rd4=lDo3Yp z<E%QYT?{*SlD*QKVIJ0_SCvvvujvhTZL4z$rEB! zSg^4mQbt+E4sZvk_4L)31T{rLzigVCMUt+DqMo)XGsGmrm;huFr_=Y+O+;ydG?5Ve zyuh4(pZcFISoZDPXrYi&+a{fa&X5I~PC_&}4~$@Y{WMbUn^v#k)@yrJPYSFabAiV{ zAWzTVR>#OW7Ol-`;Hrjokdizxj^0o`kL9f4v)nFc!l0m@qC`^VB0|J3rh9&Rva7aU z-hop4Ue8ZJkIqB~{PN=jYeUfMOZw`Ib>%xL9ShDkrlY2*dr zoDV?j=zm>4-ZyOa`Wl)$jT%;e4WyB3C`z79!^o+V#|nQL`RCV5)Yc1@@*X|9(?v-9 z*h$0qQI*C*f#_Ivzyl}r&~-YEr;I7Gjuo%8s%>?a@9k9ttp!cee}!8$1Ne&^D#y$s z9m8bjJ%Gp>JjL)%)Y`eVMfwDob*(fmqH z98WAPtsBQDsybx*Hb88ENIxxQcG-1RS4mfKUNKzJJxz5(a+&*#j$dB+Eu44Oc*`3o zcy*>YJ8se`R+KWlbYPZoA}?%q!1q60Fx}*(SgC&PnVE$e&oTbw%vcZypcvzzwG{Le zl_DE$Z^gs_;^j*F_XHnJPjyJBsshGc=Z#P{e+kGW_Vw(i_t!`p77|VcA<*CMbhXmd zK{TRTh`^LF$bLuzXXo5!T40aOC0yskmP3*UVp*~Y1NT3sydocq@`2>!q@MZj*#4ch zDOv$m?*f&LPc-G+jDPAAq8|j3g59Hk3^C+#NI#}Mbq=05k?9z+f@jMI&Hw~@{aFm1GP%pP|qZ zm3@>e+8R57DS^oZoJXIZ`e=!5LJx+~P)BIGanHkzua2T=fNF;t;!Tt2M z!GQ`-7fk0MXxqglzRJnh!#vbwajX-Mc3k5hwzFR7LpQH%XSTfe>^mHG)s#1UuT#pv zg&>cAp0kx-7$gs#JL~21HgXOJxYjJh%2yzK^QuR}-v=TUGNc~)_t(;#1c(up$tNFO zco)vThw1ayGX?QIhrTsKl`UrK3Uc(vsm{Ho7$cT3p8opAT=;4}xjp?xwo@{O9EX(l z`s#44N|~3M;DQ(r-%?=lBn=#SX%LZt^3=w7C$lXY&_ItHc)t)7_>J4}lj(uq)92q% zRasD&`{42<4^P+i)yDF}VN;vDQCWu$Ky0ZUvGdo3ROJpk4`Gc@q@Qn9A*Q%BRUJrN zq{)e+cKWHqE`DI2%U;c6xy1*>r4*9Wki}<>ODPNLdwLJgT^3B!-C=ZYY7EPV2rv(! z{Pa?mjiEx}Jj40_0PGsh8a~S`;CPtG$MW{q(#QmyA1Vj0xyG%}>=4(g#pL1%NcjC* z*Ywm`Wp+6(NC&V!-=?!IB#!{bKsmq0Ha-4i>*b}Jp9y`>ZvMTryF@8Rb_XZEbJ(8x z)*SoeXv-e_ex3Px ze}=JjiaawM`w~~v>)2}~Mh@~WLk}i$59hDE1(1^`GoP1l`*Z}?D(I~<7no)|V;?VX zZEdHfP(wH11Lf=a9dBAyM&cvofD3>FD*kxamD6%Q3_yAkKyOdX{{X{FaYv2{hgC7C zl*br6R~Z^~>17mg&v?DmM3O~IZ}6im0Uk5Rg>VmJg-1WOeRPP6EQiXBpm!%avn@uO zZ*5p@NFtJ^ zLNmv|VUAt94^IC8ENiZTC#I9fb^aS89ua{W_VWRO-M=%Q+4<as76gI;Ad)@v zf!iI9mnxDTDk7;ss&VL8vG(@)_x*kJY;}uOp2{6WjVx=K0LdkYz(2Nw)DkK<74ANM zx-%!4)E{ zz&^dTCg%{RnU%1ki6ERDf;($cR7mmv01hQZL;;2mo3ZY3@7(ByLar9p5+X(xp^*%P zhITxE59^$E@AcFxgl@!4@o;8~#oOAL|C21>ds zxX)yefyr^~Lu7uPyJK2xSDM=$#w(p0l$s_zhw~`~Sbm_9qBWI}Pj(`-sDhyae-AiT zDx*FB0M$@W(4PM71qW(N=gZxPsr5bezMTk>K*;qu&#BfG5%^LOj9}pW_2oG}EpYD}0Cfa591o+rLOWP6{>Q!RD1 zGhOItZgnynbtOVnEDXnj0uPDD`?>mioe2v=aua=$(v=%sCuy3VY56(=pyn=IS-y%0 zZ`2=6FV}Z-g_qNT3f!ndpG{Z+k zw@Qmtl(g?8m3*QsBg(XhKqDWRCm8fA>!mpDDXkZUt7+J0tF&IOu*pgdx+-b>DO8fn z(-c`VBFX z0(PXmg`;v@toVA`!ⅇ$@8ubdyPbp6bu+CC%TSZ{{UQQn^6>x#xdkBbC5=GM|_=m z@Wo^Z+&K^!06lce2>@A8>1o5w6Ee3F3C3_RKDsey+x3?VsHLZft2`!OpKimq@BTWE zY>bMuBq?6~xpo=)>elJio_U$*8u$Wnt8fxC1{F0?*SOtT{5k? zi6j*9!!q|nC!5Rs#E)#}>+{EK8#>ptZFH4QY?ew^xOmQ17eOOM8v>xO0tXci#|`Lk zea47e87$Umo_3*X=@Z4KSrxenLgxp+B0T{7{j{fgx!2S)T@rSZvT|NpfUKNJz{YX% z1bn@7?XNp5&XkjDrb8p3GMHuERCW;!4GMf@MNHLVqGJ3R`|(oVhr4|HeGW7SbnfZ* zt0LDxqIxNK!&5qWWrQgRj*3B(7;JieA?!Pdpp4vFRe2?zc^D|*u6yzejE>4bKTtlp zvY)1L?OE2cy4w|W5Qgz3@Ew{UiW%6(gq7o&2POw34?(0BmihTAZ*;yuXeBEZma47l zW}~yRQ@0?3mx{L%d1c)I5%(CzbKAMe#)#Bd?^Tk>^|wTZBIC&zF1>+2i`V|#Y5vTT zTq)X;%~#;0al3F3GNfZCmlp$$K*=N2d+1E`j4m^!UBa`)gc%+xbP^mAN2ty*`wejQ z8m&Nn8(%cxrE6<8f>G>>8mJ?J=W?p8sf3VU3ZnzJ^Lh^d04)7=g}bI3HqOma4%(-Y zgn^`bj7{?+@pk^7JsWQhkhE~LSz=$qsgZn8zdQrjdVKx^71}=u&xUdwDG1C* zpzVM?PwTE!n$1(qZXkRxo3*X?LMH(5fug5`MB*S!agH(I`uFTTH9FJd!*-*YU|%fJ zFfqOx%s}F&*pNsW^v;7vT=OrBJOLw}hzwgJ9;^QV9{&JAqMJ@fs@xXZ8fYe!nyMBO zMxG}uNC_$iOJg3IOfi>A)0?oa%`1}AakE+{2Y)S1zQ;#A)m3#9R1{=^5sQRUyyXp) z1CB{50+Z+#*Q`4~sQZE&e%tBx^4bwPEo}qb?H(mPT`|FiqBacNSdtrwQ|t5eaGm6) zp{GhZpx!Lyt0`qs2Zr7Ju1N#&W02#Mk3s9I_rSC5?bmvswZTB25Q|gcz>OSHk^nt} z4EG<4*W2Z?vE{V5P#1lB7!$h!z4SsK=9)?s_*!u^6)Fux zPc5)Z0gUkhvX~A0*zd^XWP52payIt3yx#+KSnSeRuTafH2ZoJRTQwWSPb9C%m0nCh zLD^0TV~t#MJ~;s$mGqk^A;y>H4G!I-hi%^W)E77}Ed|{KHI}8B;i+&B7C^`x#yrP7 z6!#d{>ou&%f}WFg?mB;ucpVZNR%&`+<$*nhSSdU`NhGiHdTN0CGku*d-6h*fHzI?3 zs+H=hz6u1Xk|4{3MGOE?53g~bpQbJ?*S4dz+hp7}`pohV%iMe-oEX7Bs zrg4LeoM~P$;!lq0KKpQ@0^`OnreFKnxc-1 zVN)z)l%x>SoM3r|GJASuvyDKhr#9K-fY4PVI(XcIVT_?291zL7D$yND6O3SFnuxP_wSuep013vrlNWB(S;K<1ge9B+^c&4dwxgr z&LW~M9i!4z)yW*mJe)jMF9=x)<>k+8Des*6kK0f>ft|E`@mlNe9;lw|>NE;g`l(p%qHS zWGLJiaegNZGENRoJidcL0^$j4ymSB>LrY56f6&wwnqT+N>^H zV#Ra#aTQvx!?CFBm`0WG8NpI8IH?1%9sBnh*490+#VKQ{kt8zs>hk%r+*t`H-_-m2 zjY!@*eyL~@^Gzy5WSfYL$`&eV3Z78{a&SpvpD=s(2Se7=Jx!TrsiUfr;OF>7SrRNT zU{Q(l9^nWe0y5o>x#z0dZsa5rfWEwJ%VqKiYi=o76qF>wvU$RY)q8k&1Q0_EWBcB} zCCa^pSy>&n@gC*6Bs38CD@#1m^YD~{LIyYh6Q13>dujTblD1nIwteLnjVFYWcx}tW zkc<{m+*>|n9)rKX&vivCmDAF-6&j$URT9YZhK^&8I17yNKAnjt`s&%K)VAr|a;vAi zBr4|n(@RzDsBKr7>geL9M&v_>aO9q6m(imjckkQuOx+2xHZ{I`ELGnfNLWuiO_3iq zkPZQ}mQX-AKF9OZS6Vuk4%@p_Qp0a*_;?vr(Fj<%0!trG;Fe#eGpw=4_8*qJ{tu(n>qW@&7_!Xq2(ijw-c<`WEwR*1v2okxvZW*V%E-x~sPP>d2;QKpMoE#BVqP4$AAB7gqv@^RZEmP;mP&&0 z(9sAWFvA*7WgNS(Wx*we6n-BvVX^?w2a+n25Y45w>6U70d)Xn~MNB*q76(^|^I~#v zN#od%Lw5rh%MRkSt!?A)Iw~uCR`}6Zg)0C=?g=ZZ zNRupz5l}Ayhe6mXvuB701Rmd4IzPPL+YHq+s!tqplNxdF60r*8fPBQRaM%QU;DTj( zs4`Veai^@MqOD7ztf^{QqcBWDhm!yRISk{-P88!gY!$`~8aSG!;cB(f!y`jh(Z`;s7N}3@;|YI2b26Bk4AL z&|Phdaigjch}{qr@VrD~S#ng87-P&c*aA*_Wo=-O-AyNVDVJ+nKeO(XkkBVMqKrnL zg`)EFJcp^kB<8lTUL51YG*@AR7F(s6BLAC$fh+cxCgQMWE|(WyJ|XW z3g(WchIEFhi!|!w$j*n#Sv_2Ud%A|~GmF%vjxh`ggwJQoztZ|E#NHN4xK<(kXCR`{*ErG;i zzK8Bgnj5aew#T`xF-ax%jcclC!xk|_vjr&FP^~Xy%9cEX5HW(q`*~S!mHTdrmubfh zMNM7FgBY8$!#*G<)@Y%r)#~s092_a6XexdKZ*=(kuhN7Fdfg=WgKItg;PQCzFGpoXeTbab^#J<{OOtI)#?r9>mh$AB^b zoQncOVBis_r`?;!aPFygop(+mq_@);no66scL}+xqb!ubqX|g`fW~pia^c*ZIwfx1 z`+siz?RKD}q`GbjhLBq7gLthJOv=n%iOD3B?f8aIeKYkls(TK=X=xy9eAfZSYMV@R zFT_L2HZJlQxfAFVDaLYh$P8*#43%7*1S;u6M-JimNb4%%N-oT^2_%c2BtAl@z&e~B zE`5}YhVN2!UWaq-xauCmw`eXDTv7|1KMKfcveE>ZBMed{W05DDC6r_-;fYDSZ@clT zqTJHMVzgg;I+!FEQ4F%WqBJ;e1A>(!7*!|3T(^7{JC^B&^+RT?6%@5Fr984n6oAOh z2o({W2>~?-2<&-sVIORhrPZ3WW6G%euF;;wEb{IS-c>O@kYz%@Y(qgrN(=>>{Jo@J55?H ziC5#&&;+Wc2t@SX!lkK%JdUzP*-0Zjm;$Gf!tw_ouP$G9g+0PqZFj0#>pkj@vZl7o zuu{bHi+qw6jYFUn>D{x2$z=?b}q*np(->j-~CYxj2+SMke(=2OCX5O#Kaj-5<6r_gmz(;3jNEl zEw{VN{rMF%wJ3#JnwUf=s#PDwhCl`t9i+|+6)ZBOb^x6#tBX_{=(+~MaA-EQn{Mt~ zeI;U4&=};ek1I`40ahgu2bg3YJXo;>Msi3jmwl(Kwi;czV1}BGddiro?atP?UY0jA zD+MbU3tYN#t9uCmdkj+}70Bt}zHDMQUw^D2+09Xh;I+-q+4 zOWiGWD{-!9Cs|SaK_e@0Fga}G!U;JfaaII!$@{9eZMkl`iSE~Qw8QYN9VGQLQ-u=| zi4=!9Qsy|wY?Z)l;|jVvM_KnxOt#;LmRF^gH%}3v@Zv0v(iI~FsbT5c9e@C11vd&T zmii$L&JD@;ltHWLqNQe;xzb5<>E6JSz8$M;@a3xh9}@F(WFl5Y2f|q}gCqG#KQP_2 zdev8S`!MeQnq254mhT0ft=6U#$KjriSx`wV*g1|^z>o>Q>zfQ$3Jaw@WHU`Dk`$_#LmZKs zHFYI}DRO&fkZj?Hwy&+G)UejILAeJqAPdPz&IhWWLJ!Dfdg%<*&lskfOngz24K6Mp z_$BFn=%${lt{a3`7R<7I05Kl@iVqi;?sO{Q{{Vt#sPtl1+W!D(8ltif!7UWA61|Qe zjM>IVt`DH?uhIm&G**#)3k5zlBZZg0HAyq01ac;-gzDf4> z(T!}4<^KR+lhVG+^Ol?J3HGV8S)<#OUuvqV8d#)hT~Ot#cpR3$7l_bR%IE0c!HMrLL)j#2rMkCcPlgWF%Mcdf(?rKPB& z6=xwNXvkCf{+i)m{3JbU_zknQ_6@$8pidxX^m8=CkH#042&Hc2Ft>7K_=i%~4z zP;S(0ZDFz#PeA_0yAF$GTdVq}EBEC+brf}?O6$C`P|`D!%Aye{LcB`(%C=5UMtF;| z)%HRAC)LFT;;*DONCjlcBxXKv#~}j>0>=D6KHv-!>z#1dKtA1zV6f9|UG=!-qlS{5 zXkn;^ogKUw)GS$22qZ3ln0MDl(|xKsIlS$5b-wT3G9(kp9CVek(V0jnRLUZdsBEhd zliLIZ^LNbm>RRK}2mCDpCO8d+F@3GN71C;bnPT1+O_R0k6YZO%5yLDrvBIVYJh%l_ z0OnMW)OH2EGIdsTy35l|$<&?Gc-&hfY}!qw>8;c;R9oVC1gLpbG^FJN63C$gHWVQB zV06pXexX=*e@gCEJtU%i<$9-{p1yi`JX!w$fdh#Tj0lvQe!S0HclVd;~3CHUh-Vy*;~MkyGnK5yJo?<=BcN* zTJ2kH_T9pqrPh|yPfu{noJ)vNN|lX}1!E#G{wT_2RkdE%ZQ1Det@XE^eD(WvX=omT zl1OP?9ogNPY8W7CKg>2TN8%aIFk5eTF?o5N%rtaruFoY;G=>3zhAc=@NIt!e6lqGA zZ&hDE_$E+3d=&%wF3x%M|lQvBcctCsM*4wCgJdTraaa#mF$Lew+y;?vT*7ZY(A7&%oS6NW||@ve}h zMv2;~g7Te%5=VCL>ObT8>un3i3oD84k*`MMV(JwoZH~!bUlm=dU%l&0k+4Z7sYOCV zI=d<c6({%STTxwN#etoOkKzARdYE)d-Etc9MPSI(IV#Tfn^JD~?7vYzXLbOy=N zdhPrz{afjZQ_)jh>*9*#{3n6dsTM>kkU3WH#4E-{nd-u?;x!Sj7uWAabt@0r~ zeNjh(mW#t2A&`{>w>MB!=RJl%Kb1=Elx`!kCXX;BS9fjU4EwUpQBPA}T=k10%RNMi zB-Djw11}<>asUhfA%P?n&O6=~{klb1tESzzTdjPl%1TtJc+ERxkjm@j3CI$8a2UYG zNE+v@sksrLnXY!~=nC9kl`0J?tWCuD%A?bfIdX6ZA2B}XRvm+U-Rw8Zy?tHMvXmUHXx^VDzb>{T(4)o`tKKs4qE zshbgG@+|Dl=f`pK!1c~`8V$c!31qoSCyJI&hv66kM&~D!00J?N8TK8AzPw}O5Bx{;?dTuhMT~OSeYPdc?8os@bNI`m|tAsff)G! z4xps;m5@r%%_>IB17!-Sek@7v?l8IfHhy~0xA$e5b4l?Y9GQ+JPCg(Wn8*YIr4Qlm z8{GERCRtr6C%2?fq_I0sPRwO#9n+XofrTf-!1f|S2pH}Wz+4G%S{o`Lw<8w_q8z*? z9GEC_3a^-xj2_+bjC$+Xu8>pKy<)}17-l1nDCEjXA5O$;+cQH~3RA3pI@Jk07FJab z1ch)tfhq@YL4n`bSX9jfYwvzv6< z>5Qv#o<9~r%PKo(9l;-&$L;H)w)>s7=RmQDxcKoRNCNjD5}djfs#@g=a`Sg$B6R%2wvYz4Nj)B(Nro@rAE3RK?EETg+|reH=Ds1t;1}qmfc3ijL}w9 z5S3``$srs|1@i@BB|m|GhJ7{Zbh?&JA5o-!Ya^OC3Zb-Znv|uawO{P9cr~S!XNWl} zTe3*Z9AhPk3b+A?7&!x2Esno!!&oSyrWMxcC8evCme{r zLlhE&RpeG)Jk+KNgWMMN^Kl)(w4cM@=%dA-k{Mrmz0_JMs_r$ANG}j#rk#9(GGoD2 zi20F<@^VRV0}eRi7eZ)vB=Qfs?)J)P*wa#^iYgwSam7^A$YhL$c^Oy?ft-`u9kf4Z zEk&|sxKzt3!8KWKH508#qDRXrh=3rBkN{>shwIwOx^3HKs)4r-@Fuz{WQrJOp^2tg z;2^r0nlucs#ACq+3`+n>!7HLe8wicP{T604-sh+{tHpxnw&-^S#;)S9+N%B%I)|O2 zb!>T2*;t0|N`~SNGFv^#QLC<|*#?^G!dhy3mB7~Ur>X;#5@APxSg}%po41&G$s-s9 z%(u%ew%ZERH7&x}^>PVjrl(4n3rzMhf8 zt7e)|k|z?m0Zf?y9N?~7&6CRuT~M&xch=C_*P2GBq-d#X=w;1nwPf&kicwUY9}s~s zF)x?qJK#px`-aU1?5UpLey5%~ehkS_j%uov!g!Kws@?S# zlUWK{B$A@CAw1Yp^2DmeByvg-{6_=vc^Gy+U1Z!enufdzto=s`t#NY;99Jsdx0Tmx z)|+$!D~HC@Q_DwEXL4z&mAN7`BaC42&teG#@(c;p&ppDvi+t_Nrpw(`VI;FHLqiOn zBy|nSMv^hhD;x4gSN6*JeYNzxI;*o@YG zl2Ff#Kk!@8xiBgLz~-c5mvu<47fruiUuoJFo4nQ3mGV+o-Q!1*-acd`%ug^FvavZO zc`5RY20Zw*<`Cw_YzpW1icfRyie0C)?i&p2YN*_wcSQy!rug=Dn8L~>iIynGFdZ2~ zs5nrJPpHM_n<_o)(p&DzrZBZCrv@q`b#h2kgWZY72XpPGbyIB(^-r~~ zPfjW;>8Z0{S1~m+#|cn5Hxr&qBFf$wQatA+bIncc>sIZdNbRyjE1-lyO)W_P5#-2U zI1*(LsK=ObRv9c?j%{YR$kt6AHSIQVJyRjmoV4T>##akn$8BAwvtDU@8k$4GX!!>H zi0plIPL80eW!U9NRd1S~W2cU;?ak+LxmIplj@Y8J!*88vrU4>_o?-(R@WBjK`34=a z<~{S0Yg%Nfj;Z2s2NG4IU{nS@v5#*0`aYU*sDZNBvNKuA^AfPbA!l!jCvl~UK+?zj zJoj!#%1_f#qKVZ*LmP4@``PXOIwgF7TOjy4#Qr*YO2*uWsqc~4j>j1JXnnHnN}e=T zaWPUAW0ODT@~I2ieN(+j%WZ+%0kt%sk77$e*ht#>Pf)z!)q z%})ymqLYsT>)eJT^8WzT&Y<{;%v(6gAZSaiFbY|7dE_dmE!_HhYY>OVBO}S`N2YbD zCV1Gg9_P2|t%gzqEO;ETlc1$zD>w?tlq0@LB#&)ugAtc}WP4{`EG8(!x8nJYVvmW( zt`&O^u7<3l3R~py1Yn;{V2j5kloAJ^8q5w|@J}B@uOw0%kn|%13FMp{z z(Zi2oGxEsBx9~i2eZF5UV!#pkeDqCn614_p813!{(_7SF1oZ>yts^CeZ1?@ODisZm zInHtQ(b^EQNP@Q~R>@y3rZ0?PWhXi9*mfGqcR~}ykAOfIBfsmcDlSxuP6QIj@?;(& zG5{b9WSo6{GwG;`u)UOsVi6YP$~?#a08{hSIOg*b$1RQ{SW7JP5L}f6dSny%>o~+@ zs*(UvpHG&K!ljIyyWvk|{k5bcdgmp_VXWR>MNc5)jzocsdf;ncidr)#&&mMy8ns^~ z?25|2-XQx7>orwqMB(z;IbU!+zvHOwC}!Z&H*)(Yu?IsbBoir`5;-^v zE^+f6@$%7$swvu`VyuAjDU^8oAE)Q47&K8`QCZ$-QHZRLIO18dcp$>74_psn^we8C z)N@BQ9axcBh%vlpJ;r+x^3y_6i;b#kQBwmD1w|nqjB(~qPQ-hSCB-U3SmjPJllthI zck$UTZDkd-R8h@Zu}sYokPvvBg5KXcfyNsmMRkpBSQy|R&D@DMsXs_vI+ zSaK0W*#p0)uCy5ymBRv~CmP>!wpUu~aGN{UD9{mgmnzfttoO7!wX8H%&0$qVc0sI<=u9xA{q zfyC$0wIUh^1%ysH9OZtWO+WxVsxOf8+fb^afz-(xu|w)VyZPvRjJy~pZ$Jpqq@rSE z7+ewhchH$_6!depW(pkTM=syCoY&te4r9r~SI|EQ)l`;T`~3BlR02gpoq#9XThba> z+YLHnUa}X92NLd1Sxz8hmfmk#34dSQR}G-7F#`tBfh;W*f4Ki z#0`3bGzG;?t6L`)1cTeR>7x5)(3cDSJaQ;7qj=IOAaYgj#D0B-wb0w7xJ&#n zd@ptb+d6Tu+YPRQTGfFh5~vZkAkO$X1GnMH!S9a4>#lCUSlA;Va&Wb2pfWsI!i&2d zD=r))hMgmzXgoBL$w?kJ}pEPq!#mYMaH_Qmo6)WSUuj$=3{c z#ygJx0Eh8pA8l}3Fp8H+(U(~Yzp?b%f}#ewU+QLBb|Psi0U<)4b^%El1bgScnOetd zi4k_?npT3DvXypQp%ZrlEa=>uJ%^@0u7ppyHw@J=s>cncM`M?75-6Q<{ogXM`5b<@ z*NsyZG>KbupoTUr+M?Ymf?K)of>$^h#sSoj$m3-GN}ATS9i+ZZ8N~aF3!_3m@;m(- zcz}8kW>JuEPxI86xA0XsYE=KiZ*hZR2X)@y#tZ$F|w)${f81D8#FPd!fpM^&Rx1Wa+0<_wBwr zWv%I2+VZPNf}#%`1z%HHJQoOja!%c@i_1fP$si%T1&;ju$fP-UPe8pFrbL^>D^^FYD zis|77V-(O$6RN1oFk~#J037#h0Cd*96zP<+M{%H~uco?44><)vsmzDeMhFO?_w9m4 zeYJ2tcFd~xwhps0;?L@xuvQ`4T0rOOX0>2NXtm09k9gdQvUllaoqj`XMOFs z?@^EvEx%0{-SHz~L&{=^Ll_(~Ldo2gCysNjW{<=t)Pi3p=H5Rv-jfCZRWv0NeoIAdQToTwS~Tw}T7dw1@Bp4Ur6XpM=Wwj(j|ReYuU_bhu7JfM1G zzCR~d>CaWZ5=d=t4Z3d$qw#({iwySz$fr2(p7{B4_0&l=S5;|l7RoxIPkE%JqJNI4 zl*XPs_`p==Ot=^aBq%4;4QX$U=?k_Q*^iABvlVton}YdYWvP-ga*h00nV<@*A!12Y z01$F=J9_9w(!K9H#^Hj+P}TORGG^r^0ggEweh^0$2R}3Yblqg>J$$v*GW9ykO8x|j z)Fy(qSkVxcW7{kI;P+sDhgS6!Go>Ml($hOe!<1EMKwm(6;0}vb9i$>9YM^G8=yu*5sb&?Qo{^JGwgIa9~bM2nY#}e7$@L( zOmt)BmT!GGwbIw9z3qjkpl1OE3`q%*PBP0N<>x)m5$JF|`{54C>8))D^5oJPA zcmknTB@ZL#Dp=#!zDb(5?xzH!rvz9ln>Lk_-+A3@M{u0Q8Ic&UAa>*d?tSs;tq9Z>X&Wd#@$@2ucC zkOs~H&as#?GJ0fu^_+PGeDj?}W0ZOZlA<)Fr(C$^Mb126y<}TLJzK_xeEUPHez4CgtM-t2(b}+_ned7#hW6ns;Riv60<_XOaAe@1q9N_SRHs zl#|4u!vIesoPL_|nSTNvLmr^u6ZF)IsFEiUsca7H-Mf2%s0~rU2vWFF>KFm^)qqiM ztS?yvB)bnW{(fD@<*3r0Twp?7nBWgm#QJ~gdTYTflX*m`>D{y6^dI)>T@uj1YHl;t z29lisr-4^gef zG?eq)nxfwa#CVdBI7Uif0UGi71L{w1=dkQF+p_w6{Xeo?=cupvtMrwy)68H4!HN(G zXqAZM#IfSUV0x+T-$tKoQQN3xjbWZ?V|dAs)Hj&1mO`K&--NP`%zFWiapu*r@?iXz zMVfapmO`a!A(AVVL>CD}W(gJ{5RkI~u0{(0KpDrce&f?8L{@4^YErJ`?Mq8Y6rpEf zB&*@7zA#5@u0a_m)90bxLmvS>G@lb9Oad^>flO=LiFo+(2eI`T^ga0lpfuMydf21! z>Ka0l5YHmyV1bk0InF*u^7*_oa1Ke`Mv84}`!ZYUL{n5s@jOdbVs-%`$zzO$^AnSj zPs_OM7wg5kTG8-S>a5M=iDdEv=m{7Y0Fl^(k(}TiPZxMr&XzlL43$-(WvHm&qr-_o z0a*6t0_Q!4nB;f$p3*}XjV%Sh(?*e~Q5pdujpP7=&C3TKrwf9^2O6f0id~>H+vy$# zsA*NBjxRZl6;Cfrb{OIt@+TwHI$ocI(=$efINKuw1S%f=v!4Fm-h=0(G1XL6w6s%G zMm!>83E^^8?UKw#bNEYR2h&;Jt@Uw9OK*;jq8Q~>4~0nc&#!yWw!e*U+?4(O?a;aUbxD?BVoWsm?IpO#yf zZ*2WE0zl~tehIsOrV3fzH1!l$hoh-a4~G-Ok71Aq{{S6lNkE1HEXBN69LHmx-skDu ze_c=CH5K){h8miLPZi>YPz4LihzO^*`nb=}I-OB$jy1Z79noXu;rOfEu16I=Qn^03 z?fU4qPyqvmQcYAaFyR^;ay_zp=j;Cf56e(;BX&hr8THW``eR2@(LWhgeRv$M3HJIQ zUrk1-B~oz1DLV2Wx($<{C*x41a%^6lS4;FF7Zg}bky8rM67@+NVuP`GC~ z8Toh7-Vl*y)Q4gs1hLB>`*o~0qYVY0thh@9V1^Dymatc-{a9 zVxCq9*_vw$dR0eEKht7ZAA*3OC!BhD1>Ejy}Nq${{W7S ztwt^piC-QnvXV!*85#X?-%AjqspfmI?tA)Z+SkS4!oXrkq!?xZk3;kI_RfA@`PBny ztR|^g`(Bp1>0-KFC7z@;BpeaIEXuq|RwMg?mmj{KHu6!^#T^B^l}thiE)*4>9~mHN zA|;cSJj6)h2|3S(K6*~FRMW$5s-m7kMMXV0+iyS?+M{ z>FE9}h~tVtgaE97j042r5{J-w=Kzv*l6UO{t#LBkfo+Ycdi#PK^Vp<%b-H{sGRO+3 zWuB#HLNVJal9Ilo0Q(c7RZv@RSK+t(WojB~iDP*=l8+jPGD<#KSl1y(d}I$nuG!g^ zjg4jL3|6{|e=Qx>s-lKgrZafeZ!FQi1AlrtmTp+`t8(w1bJU#*sH2PfPiCkWI$AoK zAv#1sN`$DXL{px?saX@>1e5GBtVUtkX%Q7uTXtnNqS;d=rk7CB^9=FkN^iDCdC zb_WN!{3Q;V&2^4SX^F0my%#0h_K9HBVw5rPT_tHa`EqapJ@}sa{{Xy=6u)%Fx`xqe zx|rD(u>?FJi2gOowpb3wx69vG1@mi5Q?qGz6~2Z#n5pYphUWz~3mF7Q!v$1;iplCe zd0#K6k1c&nn_*_Enih(RysYgPE^J-QffWZa-AN+^XCQkLZ0h703m-%RT2%*0vucH0 zk%}H@kpewekv^&c8SRV{k9}O5X2&}1OC@yiq!1Md^PuEqc$#{rZw$UBqYzp>P+ z`!yer9j2~GDI~m7$rH~!o)}I_j2*jVj1Z)LL-NsIc!J4mg4Y2N!Au!qjG^HaK#+k) zY!ian$F5I*O(I=Um;v1okEM22_EO8?7E|FF5nb{~4a9{cu~deh21b%$A^d!miUkKG68v$F<3Q)>)!u4Z znv&&8mr(AL#ZeDFcbGSf>jd2ob;2@YHU9OS6=1HJ~P%hGG+@Sb`r z9ma#fqO?ma@zhhvNXAA%7$_B3GVw#^7|Rj>0BAjmF(57Mx}Fs#nrU|H92(j={SrRX zqq5tf6xO}TS6gMO@#>;m>ly2!4%}Cfzz+T+1Ivb0=9_K$bm zsO?s_MhNtjh(z_Wu34KN3`(T2U|GN#scX7}PrWxC!*A?)=Z0GP5^Ab1l<;w?p~A&e z95M24GIu3ME=)_Rka+1=uA8%|*Vt@(S7uT}OfA)QwXp=36>+S{kx0Pu;v-d5?&l?# zamdcP@afBmC1LT|G9N~zMI-JS=vJ4SG|yL0Ae6ZX zp~}V=9fk=2hQY}>$!Tqt>lWFqfi9F&*2o#DWLt_Cgm5DYr9*K*S^dsOuYDw3c6av1 z!Tp`z8}721E2?PjHIHPXlHVzS&ZQHSk3Jn`3Q1gfMmqzn<`&qms40z+#>x5+ja}#a zj7qkst1&7GUS*Romh|j9<%q|~b{)pKw|@1fdC>36zT2?KRv_XD1$7{lMmUxPas=lG zzBBEd;A5w{qbgJ*Pqpk#M6g5S8EG9~#cuqgc$X@qc07hjCmoJ6%W>=p_w~}E{{Xlu zxU3UPBr_1uRL1UD@g2NCN2d@l1~tp^2*DdzYP+r4R+o*%8rpXXi;aqk-FKF1ONvBf zlz^r|jD>LE6%B!$VB;OMUY?R`uf<&9sFN~cmO)U-D$W!R$A@5h0y4e7yVz-V*|*`g zOHoa?ZWkXNBk=@va2JVzAxAfLQH+tq%9pHhgs%fYIELtg% zVl1ix5s`pM@?eaTa(;tb=9AgS{G6)&@B_004OBIrhOB8SXTv z*e20XA!@lpJd!Ka)X6067le@@R^my*lt;^p(FH@!oUW!p9 zbc-2j8O}sV>^sMTLt_B?u*YzInil~;1!Y8|`{E0OR88OnWoVH?`MEQUWt?CP_Q${T z4%*orriS2ZlCj_n?rE6G$e9tBAjT7lmj&1Rz>$-Kuc>|}kWu(Ey&v&dv`hR>c_+KF zkiPlAKA9kT5h9jKN*0mgfULBVBxo8>7B)r$utoBz9=w3`KDq1_AhJ}XAW{l?gHa^M z?&XV&uuAU=vZ(UP3*aoO03!o9EEo{PX>y|3TLsSDE7Y&uZw##)tX!j?JiiahLFiZ2 zd;0d%khaYw3tFd$($jO3z%Yjhnag9!a0WpC0JlLUmgj3qp;(kHf7iZ!E` zkcH*}4BSeb_rMM7?~;3G9sZl5d6p3Ja=9`Mj@qm$UZq@YbW_k$P*YaG$rUrv)XB~x z8$_+agA!PGJhBM?07&;CZ+KGNHy4LJH4VpZM?*xC+-i2V;GWkjQ}P7HX`q%km~xOQ ze+-Td_SAdVfM$3|LpNWwOA$g*VcQ_#F+eH92ov1gp&cU_q`)WI_yL4D6De0&wp}ES` zS4bl*8b+TKsL@me4a5l%2nblS<2q`j>h9FBwH>Q@n$4G3WRat7$qaP1%97|omJ5Vs zsika!rAy_w_8yw&4c~06+m-hHvsFg2(zPl}JxFK3PB}aZg(Zgqz^N;l6p~5Fw<-7a zebSP)%|?w^OA^!4NoHKM99Hn zsz(+%Y<4-$c$a+ro4QMTiYm>wL3ruz;uT7-TVbg$Zdr)rq|wa4s0V|84n!Crg*s&E z44-ZtlTg;mTmH}ARI3=48k@b{sj4HAGDAWM0zz3bNp&maK43?1>59Ss013T7c?+?i zutRP5YO7_uRa4X+%oQVbUSy%-%fvGBkP-6j-&kL*(^kf0rj124NRtvvOpPk??Vl^F z;2bL|gg#;Q*ClQ*x8C~cXHc%&E3G{m+!pFsk|`*@?y3`1QWJ;dC0Fp~UgTsEoM3_Y zMX|Cz+rMW%sY5*Ws<|jDVJjrm8-iLoDvFL?R%ltK;$-yobw1={y3?a@7f3`9n~R&0$w!%CawTI5!pn zfXMHrGqJYaB_#JsWQN;Sa8C;0vcl;ctg2M_kw=u5KA`zQ85#Bq0=Y$E!mDU^ls!_T zSgbWQ)R#n}YNmH5gT)|Kk~(n-JWc^49l<1!c=6Ke^g8dig$-L>t1I3dye1;i%N%T7 zP_dH(mzhF`$R!EL?W-=;)1A9)+*KD#Cy7CHt7MwDC`CHR7%>XwHYyjw^aTDdOb|mB z=G~`kS_Lt-)!pWWRVJD?6zEu<%mTT0J&7oabKkyzhMbgJs)JQ?ecP!e5VrgZ#Yt$T z@#^UzjTUOqk@8R&WusLB>>e!pr>FMk6F;b#}_U*2J@IeaAHi zi%Tr2a*hh5nDQ7fI6?zPOiZwla_5X`k{7)N6LDJ-kR zBct&INEAxzkU=UyBRq>w_KDr_UM{s!UMmGX&`nWO0~YvWBykc7ERNVCigx*9=dY}H zkF@>T-kXDKY@O#<1G{Kkw2bTbL2aYuEoP<>&J6oGwLDd@r)LE`KExT5> zo6Rj0bhk@Ut#_ua3KRIjk+{U_2_cGra7WWzo7EZ()mI6q-1|E7Q3O!Cd021VlO5z&Dn-Aj`-A? zpRy0ys=9e?Rh#E#(%YnpSF2^eRjnvs0WrxOQFe3k!m%u;c$^f zO$}p+DkND-D;GXgkpciYuOaK5aYpz1GJT^g+m_$c>g}lw@+*s(ZS_=_mwFH3k2Igf z;?aZ>9P?0npIr#A`yh4pE0h$rZL4azRtXB3sc$Ij8xLHw6ygWZBoBQPY| zv3KPy9hYgm@IAm&+HG*33L2>6XNCxZ^87xLh9rh^p+NjZV^vlE0PPpIYAY%!`cZhg z+~^R=1;)CZO%jpGW#JUR^J6jp0Gt_a+)!}=ha|sKI=Qv3Gwg1mU8^sPVXBgqZN{cQ z0cs;|IB?2VqA<&zE*NEV*!R}f>R(WAve3sz1QvNCBsDFrfm1R&5#?9p2*F;#Mi1^% zG{K_DwAQ;TqB=DvPOIr|T|TOw2xh$1R7o^ayMG;L#u7Iy$IG7TPDmWG#FD!Dd(pdA z+oj#{?^dp^+m%(a+Gr~LP`(^a%v1$X2_*{Qy8?Z?>9eFAY`j&+TxlYxsgC&s*6W3~r4`|knS8!cll(Ud z%0UOPIMT~}rNG$kkGKRXx1@VZaCBGgLu1<2lYB*WJmZ@{%&9aL6wD6>?Z_06_XimV z1djUe`d#s3{>$I!HyuSK$(?BG>Fx3~vAl3|@g+bTl8mIJw+72{kl=t@U!RM)quhUK zji+&v%lCXnN?S}c-YUwd(XWIV2~}Kpgs>g4+XQ1>pSCvDH8$ab?AHGP48tUI#!{}P zB&i6I@eHdb6^K;?@HrqhTP>#Q+%2Wu!U&sI2V#r(1+NtXgvdXO~r1o z8>ZvgRPFJ2m&T4WOC-oa-j@@y$p~WxPn(F(|`6gpR=Dxczmq z={-e6APRbR47`AB_ZjSPbD!JWR2NISiuG3Ok+0k^+~{YOd^D#MEOg4F%gLQG7=m&* zb~w%k32YVjc9I*H-g4DaRsgWHAcz3YRb7D@ZY)V41D|~hqp^gs8|^~Y+WiMsHNo`x;hzDwYz4;wf6<8Nuq*|=xHLNt)?x)QeT#)YaEWVpWUa>r|F+0y)uypsJrjgtPv-iT2&9 zzFN8sY~0pu%P~tH;-;>zg&eBS3o%q)%Ge>@NaR5E^}qt;>0bW;JM&~)w+_>un)7XX z6_R?$ToT2~2ZmM7V|Ccm2%_ z)G1+l0{{Z3JCPXba!EGu8Q9`O)ZAoQ%QN2Stuam8B`ERImSFrIBr2>RAwGEt|HuwzvuVqPJekxYz$Gm=QPuG^;n0A4ApYUXh(aEYRlXuut@$N`f5 z#(f8WePbQQ;agm^%U>#)p=jAEp^iVrjIm|OP(T^M8REGehBPt23OP%7yrI_Zfz*5L zMY`u@p{Lu_=i(--d!+C!O1=ujfnjM^kMj~vK~x|RSZGyGRcLx*+lI-xsEuywv0h}R zxGk23N1CP&B$TsDI8d?1V|8vMs3jykSo+vDtCUu|g&hc)=KFjwq*IW@ z2koq-wbrdIi3MizjrT2V@yKsfD$r9>)JZ%v@k#h341FEyGR;cPM zbenFXu+!14e9KSq5csd*;NT`R=I&IU!_Z^CHGTA!5w|uRD|oXTW!|EqNQJ(cd{w0a zW<-iI1`4VL!NxJ{2B}}Py`r|;vnV%d6URLjVG%%qkOl6n%n1PT86&m_Yw$=Z%{B--DstX)kj*h&ruxm$RuE7MFJA4TR9PKK{Q77;o6)hU%mMU)=X0NL&Wwg+Gb)axoM)zY9f4IP?Vw4bdEkTm+%w#F z?fU87n!`nGwp3TIj8f?$#7LN65t38WzFWf%0PaE0i&M4rllC|DL@UaN7;=&k^%sY_l%evrp zDt>y%Ql&l4N~l+Wn6!mg_;D5p4tS_1xn}wPA@bA>+Hd~=**Zf@TTte<25N~RcI^q zs!X@~I+Ic&k|^O;G?HKrM26y2la9v+vB&AG>n|3_Ara71!YO1N=5|r$%R`a7wgLwtJF3SOo7DdYG;ASt{*~DqQGz^7CO@ zo@JTBALeinWOwf8KAnH$`D24uP1^_A? z#Wkm<^gt$5O7tAwBG3zEOvy8z)OE9VW}twj!F_4Pav)oc}VZaBl6K(g^CKR zd)%I?YFo5wvI?p~k|0hUh6*~eungVQXCUX-OSN@7ijoJo+pXrg>89i%PT&Ea#0-!~ zVonFS7z4hEZR_-LTcpe;2_=|@iSx;1=EUR77GmJ;QnE7=)~WD-2R)^8L4@wgdP)*F(rvObD@#UwRy|&p`ZK$+uTl_Sp7E~!T#$|*m#sa#KPlg$B z+tZeNeVVRJm-LEv+>@RW9X% z^jL^ymKc095NR+K$U>k-M|9*r9&zuklrxQ6InNY?-iSiHu$Y78N9kgd`y^`BCe%Rc$dbl8@r%1e8h-H!&GX*TT zLgaY@q01H>v5e|Q`034`bafJ*^=98R)YSC!PL+z)r5$UT-I2-SM11(d4xdk35l9KM>inr;p5DF!G?R5%N?%p@K!;1 zsA}j;a!C@+R-?j5A0i1ENd?4lNrh~m;*9y2jVkp<)wm()RTUMMwA9B1UxDz^wq6-y zcMPuVRhKH+AOZutB~%T~mNSTodCnfWUebv{WW zka-G)1O~~$=A;jOQE8;=HH`ynvw!U&(gMmSgvGKtd%f&+)Z3rOtGLNk9YfJO!Xk{s z_zRCQe8{aLkwB70j3_lNI$)TnyzD4>9DU*O|Ie zCgZv7I@{&rd(evn521W-HI}FyNpT?S}Lt)1o$wb-7h$qFCw8!6J%U z>PcPRZx4?ZWmO5o1=O77czbd0%JF!l4<_(MDa$#BEcDlm?;2Y zpL~DEUbFa4M|%d-z&KoQ7GM+K!4cCT_W5gMbxT!R?@;+%g4hGUpzJ+{2Vw1vdSjK#;e91s zvBqPSfh^f1p63|H=rN6DNR2X0BOLfZ79``;CaS^3;XGFNu(Qb~+P% zmGY-?5=L{_=Ta&1(d3U!V$rFnQgSjfPL@du)@vanucHT9*R{VJyvsE!Y9*Gwq`} z2pi26DD#sX@=Ba2&t*CtAYs`7Ay3yN`{^&DNC10k6-hEn#n9wnWqtmqK-6yG zYK2+IP!*J%{d2744dEEouy9m{$A8;fc&ukUf#vo0)LOX+U>ETpd}mDME}Sy8e-{EZ zWf)%UJpk8+2~trXCj*Xg>7UzQ1eIgp9e;>0M=w$J*2v<13?nVv<%*ui^Zj&csH`Ny zI04A?$v)ZCX#i@27;wI9Wqw+fEP^Q79}gvuW1O6NV^P+Mrg9!Qxna15BynPK>HRzE z14<7-jcvs6YY@~z)ikLhyr3K>6Y4StVn@HzN4HJ3mYy10ou+RZf<@v3c9J*uM;^`f z^dN#hLn}Vow_7OQr{j%HUmkKp7x}pV01;qwjzAS$ka6F(aiVuhIy&1W9bEvCBdMlQ zB9CcDe4m$m<2c9%Ns;vMkV;(N&mpXSbGO)o? zJ+tmKw`{rm4SY3A2zHK7FekAeUix?3byVAe8lBB)p^gVx5LCje-Y4VufgOsrGxG;O zL!*0xNT8!zXjQWPB{W8rvhi}}qc|$xL+z=TTU6BOmHpltuQIj>;@;|gv-xRdDXOJY zQ%@9}K|Gs*#sJUs#;mIh@xcO9*1F9{C`Bny09RICK;)k($G>kwgP?P|V$}j4=`xdfK+xP*GyZJWL4TZT`jRmHMU189~m*9?y>%v`e*|l$Rs{ua>G7@ zLfKmJVA^KN8B=Iy2^_Mz`Mfe0=yevVQzQ*95K5n1=R_^_Hp+KuTb((2dB6rl{816; zzABQ$~Ru<>+C`I8en$;2^Mm)vR!Ma40BP;(a94B829}3GjZHX zRSLQ`5s7gi2!9DZ@%j;1Op>`P+-d}uRA(9Vi@5=O*!;D!lIu>*$y{U91KZzCtXgXe2<(s1P9s8(P9%l$ zr3+^O4D!^JiWp-+ti>NCSa%KdBj=^*E}>DtliMJScRAGh3%EkD%%q_m`{%jzKc1H0 zQ$S(GE!8&iizM{Hyf!?Td!u~DJ+NIYd7nNGGjB)qiq5TIn>jwk;BQ`~9; zA~7mKxM>Grqi+J^OWvSQC=v4mzHiSu2QC%}p$%S0@BzIQ&>)K0` zPR#x(j#L1CqgyH(DPVfU;o_ggf!v)~1p~(J>r9bDO(91Fkb9Hu+th1iE($xtHcO0S z<~1IUS*L}3ek=jPuDBy?vvP<;vc1M8F9SzETXMZw?Ut0~M8$KuIQSgdNJ*BSg+ z_3fV8%r$I1(H%Rz5SXH#NZ7=z96A zxl0^mqj>Q|0Dj%cJ&E`Jn#$!JRdS%WD@#odJT)(lO_SrAE4A*jqakEg|gzJse#GNA|*J$;=p;a>)Rv# z8szF4>6X~4G;+Rrh`bvmr{UrzK`X%_QuTa&i6;w#>7R3-QKj9*Tewnou~tP-OA6ET znx1(}pcy1$LF#eDk`Jzx6Jv(rTL9 zeKb6zfKB1?J;84N+_FcmvxxTO_Vrd>Yg10PwT1~}ueW%I%9SyRso3N30Kj(ofOY4I zb~7z3*7{j#JWPs@yTT_Q#6r6w`r`xYMm09eK?P*f!An(8_WD-L@w~wwnvOw+I~;oH zgizh*rZCu}ORWld-U-!RyA1L_xnG zNyrV3**`Pe+e}rKOUpwnhi)49(lFCaM@2HZgp~x9MftLf@%3Ocldgj3Crs)p_QP%s zv0EK36(A_%ho^iVL({ut=#Ni#UjG2v9ZuU@hi}k* z$ky{bH1%SZDPn0ICWQE-JXtxjXFuL%!)Lvbb?H2It&wit6;a!3TI*10ibPALIYbZ7 z!(<3S;q-M48dX=j)2`@@>4ygC}P!@*>g z*?{GgbvZaE3_fUgt)KRG>6LX|HRAsOxazKnPOUAeZh;-5Bh+|8FvHZ3KhGmtIwRHE zt+!cKwrQv;A7ow7JuT9@ni!gnOkvD2EMXiKT$N?vnDf}@Mb~9@D|%igy6)Si)ZaT& z9~o$C=tVk9Cm-`;F{o&;PbNUcbC5v?I`O)l5b*s&ftAgO=C@EJ_87;?!qK~U0<-Fg zZNIcXqr|QFaxU@LhJ0wb$HgAfutZj|Jcn`M9r$#578wiNMZR*YMz9O<7Y? zQRla$tb1}?7vm{(Ht&i=F6-fUtiTSJH7^bRZ`WAMv*uGXTlS>F&}IfnDJGT5hrmO`xg)kmWjM}>)>tm^)l^+}`}{4%!%HWJ z=C#+_PEg6Q~<%^G$Z7fnhajY1*EmPY67&1Q4R2?bsG$$0sAy z{WD7-@o1WKuMOK)8-sqOrw8T`3Spv_y2ZI^s4fF-y{3}7qEjMMyVLl_8f=`&;wd2x z1A2pudl8K#>|OO=bBe*!t7Vc0w5`X9n5@#(%JUX76u>LQcwvbEg#;f$aawO(`@HC^ za#6`mQ$Yh(bETZKmzErM^Jh8E7!!lHv zV7^8{_3xc~y*y5a0A(QjRtY5zel2x!ed-1j@3M^K^M7h1`d zuBa^Y)e4BQi9@uDg7`(j&vFKR1{=D+Z`kzjblrD7qSuR!W+3D)Nx%cpb`U6c zAfu91sjaFtO(tHU-M@#H4e}s<5#K$ufb~_}+|p6Q93*}PsZd9^uoykZwztJ5;hq$t zmbQjC)5ytP$o#13&}tbShE4C~vt&Z)$3 zN}x*HHpIVF)70(@b+#&sNTz5dXju>|Fbt=MZz%^O1Gj%p+E=ZzURqe*D`ixOtXRBp z7F8HI$sV6R{{SPaE{eBpRL~2RqFT`rjVY=UNFpyc6ym|1`64MCe++ELxX2otZ`_X+ zuAWPDHfkF!y5l9r;*=>MmA{0s#p0>Sc*g>uCP49ICk2L@9_Ar?0nMsr;kK`J6hi3@ zmbsvW6D>kg$YM}ENqk@d@83X!NgMGjLi_gZt7d|_j`>j?Je!&+r<0mIafwx4JRc&f zBB;pikFVvdddbpzcHP}HHr8+PL zT$K1|ZVIYsHa#h*;^GqB~dfL%7KnZ86z1W z9DML~lxn3zD-y%yr=%RLA$X)7Rv@2mmbA$eEZvX4x64wJ1_zpnJA8xV2<7|-pYq`-yN;7EJ-)~L%ie7&*QjcmA7HC(MM z--`fb40;S}O0tE=rZj0sD`@OOf%?9B{HTxo$%Q zk=%T}{k0NaJd9`n4US#0+w{>HglLh#ic3ciBA{Rcf!zMuRG3CGw(YwG+j!mJv|3>@ zOEao8rB8#X8C_~1K0uv zPjao&`Y86k!-Z;M5!GC(O?24~35{cAiaZ7x9hre3k2XJ>O!c*fV6hd!LZknDHG`<&&m3A9dZ)X+Un{$whu9C7eeDO7NjIGPB3c$Ut+%dIH?D zoMQq0nALK-M{c#(R#*5!Sz?{(q36jL_*i1i!_jch=)(}IQaOKj|`2T zB)I_KkD|)h$8cG`nxy*KzM-t7soNW7v?UBuMu`jomy~>4#4HXE;>f`s&-2zTBt~Zd zwrcjn$I(~2$9~JXE)!KObpD1A1u~Bjc^pa0)msM`0CpYw>0X`WGX)0>NbjHc>o%sl z!32}b9E%iyD;XELQ=DTx{{WQtA1rGlLtO-tQdHB)6twQbNS%0;VSqu;ztdiuXabi7 z*(sXJ%RF#LC&*&^jD_{U zXU2c2I;R?lKs?sC2e9=+vtt9mQxI9BySoS%JJ?23^`!-I92(bR@;_V zJEU$}%WPK@M>KCWB>a{s5IJ)j@G9I$Vl$lg{IzHFKGj=j*;iW(&dD#v(>t`%MoPqG z2p5Ps0JMqzmI(F(2^)%*T3yFeMDT)=Tf_Klp;_O8^BuiU@K5Rvdy}4cdyb**ye+#& zL7`Unig;e-XsS{IEKqPBr;%))UtUCle!2Q+sH3l_v)9cz;Ne-=V0qRv7{-2zNzceH z&sgq!Q(IB#N*@Ngc%hgm%Op~S4gT?b4`2t+O%|j}obthPXlWL*I*6qi?Ht5}BmwLd z3Hl6UT8T6gD=L$^2q%*<_5UYrQa7mi%9jCd$;;Q*KAN7ALeS@kEUH`A*BQ{TP-KFB zUoQUuL9LNXBu)z)pd-rOn9vfK(?wbKdh1-0O$`-AEvla0 z@K)0N45=0sY53%VsyjCm9Bq$Nk&Jgbd6vp0O--X9>>Rsoou}vLGqWBuB3xSeJmw`xS;~om} zAUQ$b2LzB*`|7#f+t%%2zV1qC=13{&z7nblnweaL@Z7f)BxQ#MQc1|b9>i$}s9XBw z8qZ%1QZx@S7YKxCi_N7aCFHzF0EPrEJ8|uSjRRwQ$ONJ?wSvG~I)`_x+x0T7=5F=fXe}q+Zj008QixkV^hUQv{b^HIJw0QBQW5s8P!8Kd;!NQ z0Vlt>!nO0LH@mEG+wRvnt`w9Kp@kiB_;NrciDQCW1&IW=FI@$-&0TepdaB4IiROIx ztijliPG2GE+qbW=*2csd+AECrg6+XtzuK#Xd~z8XYE3XJQBmZNuvN%a$P4uY)1SG? z(zSKQg1X@&RNQBnylWYWAF}$hclr7Zuh+k(wovq&tecV~{>*G0#aB-xK+?4(s&<6O z*m5!j;(dK{$4{L!`yKV8b-h8nZOg5UEYU`?%Sn}F!+4BIVS)%iJpsw|#)qcXd5#qg z&Q0HEO}Di=hq@@Nm%6%(eS#)ttoV6WIY>FcQr=%PU=}`rF~~Y8Vca$yp}aR<>56KI zY}S{nqqQDC6X82Z0{E>NW0gV_5s-P0LQXnAqW=J8i+4=nL*rD}Rvtbg&je~1IO7T(%0s9XAx(!b0PU>1A0j;Z2uNK%V zt}XYI2L_elq<2(9;vi-K`j%{&4hbW%?V*)hc9xvQR4uTxl@B3~ogJLN0t*6!oDvAZ z81o!zMCd7K=BbLlIbE1cviwIVGkfpZkG@p>myLm)Ks~J9n}Cq3zbg($A@6O z$nBG4jm5YEso?r0DWIhd6+K-wRA{m!KvPI#!ZSA|<~+k8Sw|A5xbNsSWLT%OQtZvo z{h#~7jVb6}S$tD8@*_E8%bDjRjN}hep+Fc=0Fs8+;H4$1I$22|B|IS-MqGOFiL;NE zPqwBt#-@_pTW%{%?^#VPAWEYmDCPXeJdQo}pfm$ytj@?^n*Da@^{b^DZ*FgERQFn| zg~?;7p_aa}=Sm7jrjAyQ5O5<6RPs2;$>omS@>Xr>we7WAd#D$7q@|AaVHEQ$bl{h8 z>dV9`=L;t#I2iQ#4PRT&?DfHEuVweXhPR?hLQF+zDN$nX4Dk(hRDlaEZ~>qIj-t*0ENO&0e8 zudbio{^s4Uf4SGgEvcyJ3W8#ZS>A#^Z33KUld~2XCnFuPr*_?T&F@(z*`w+070G8U zFM~P;M)U@3h2o$V1DJ4o`e#YqBBlufd$4uAd`?l@2YHW3=IbXM@S3HtCe5Fvn%Zv zCz3lG(GM3Tej%A5l;rT+jVQUtDyJj$RF?%74a&vWz6mFaE@ZU)OwYm(&y z$;B)!IAssnuQDm#WxUtJ}f z5nFPR(y!uco=H9&swn;w$K>-IWQ-7gYn~QN!Xr6E$sWg97+3b^f_Q0`*H;}yeLX6> z!6Vd!PZ3Iv>)R)mPp@J-dgvlNhs1g95K1CmLZzByP^<_%xQ^r;`jEZHe)>=8b>ng0 zEmT)&p}9PjYa&!casZdiOE-p8kLMUYh8Nd}A;QORs*Xyz>LK`F6y`+!9HMsb>fB2J z4o9IUzplJv+)K@_%XkDRHFsELrJg#-?i6(taF+2rA>jkefT}XYk~x!(*dFIYY_&C% zHx-)UxWqQ9sU?mSYBh#gc@R-mqhO7k9C88A0(g$+M{5lX)QMEHz^Nj#jts+zE#HR` z$@_!ZLHv$$p)>94b?V_yO>w2Q-D#l@P_P zNn0)Tdw#O)mp7SeYU!C+hMoAME*p}DDl!upY!C{7dt*jwYbC3;JQVeml1S3wot#8F zE?d{RIP3riJWscM2B)6SNpq~Vi*hAJFA9jFp`<1-%-r9TamQdr0UWsj-1-uBT55^J zcPl>Ix6_Km@uX*zB(A_8G^ZSid~)<<&V9~w$Hom2WMKd_wbR}!X>M@PQ(ac_W+?_q zSaJZvkj6qdj4!eD11BUIv=@{yjzXF5!yuHM!< zh^%dAwLxlz1f_;*it1@5kYEROSCjy#?SK^!XSe3(QAL0FI4bMtR;I4sQ1H>j)5P*r zl|*9EiFjdGhj#76F~%}=B!IAs11j3^v4*xdX<%6BqFJR@Ri<}%%#D-BiCmS+kiE$4 zK*qfI_@O2VCyEt_63BCefWP^_!Z`5@_(1Gexi~qAQ%`nFlvI()YNmq-QC=n>79


q zNq#O^AriFfT$F~PoRj$cH0}T`f=Mmd=Oea(QdHWi=4hxc7aG$}(Jfzs1ZDpKh`^LW z306WBmBw%zwiU2;*}itg49T_Z(?{_%kUGmn6moeO6V2HO9P=UdV~InX{4MUQE-!mB5Oqeo=6S+9#(9c^1% zq?iRtXnZ*#=hy}T11@q%DtjMqOu*dLLL0?ZzNVHNjL^v6kD57O5UPcdc$qMu9JxP> z-%=);lBybJpq47?3Z{@m(a1q!kI%y;o08>tAx9ifU~&$kxxZNJ&0In$Au#xg)%AR& zNiYs&a5)eZ3^yEMNGG_~C&WiTMBsM|398#|@w#hro}Pz-)z>VPsWWC}Dd%9US0ISv zmAyZg9myG}@7skWo~DM?c|@{As~5(KbK!!ja!jOlz;907jz)2-ZtGW8odl$-x7;O` z?FGgv>UxODcWHhgFk~a~WlldWR9#oKTdJ&(Ul_zG@2e#fK!d}Io~WoY!Z-}%{v~$& zDnR~IplKS7gp7=SUnH5Eu+qz!Y&JBO z;SDd|RJ8v9c*zWBJ~?In8Rkx1N@bLc1ITyntvh#axURa<+b$OClFJvw+iIq*RF0XW zkjEs86RUG(j#MX#`9W+D$~E-O3mV8nS-@Nwhn(6uv#Er)A!@zfV~jx=s-BV6;R!J< z%pe7o2~_nY9$bcUGo;!vOD^!CqptBCB37qr#)?^BnX`nNK$v2uBn~06068GCi^ZyK z^wjcJ)@=)3C7vwHG$^vw!6K0(I=3e)m6PzY9!`7qBUN3>n$1BqOf)n^SlHs~k7@p2S!0vE;bh${ES!~l)#Z^#~G*H5^qAJBr z9P&!)i0XNTR`khHl5wAFd#AD6tQ8UMo1C_4x{G}~2_}M27BM7a#V*-7b!Gqp*%@qL zaT*hp!GwD7lmNm&J-_xVZNk|^)b$mg5#mQrElG}Aca-;HIELE;FfuWZu#qrw$BAs=yJb#PTZBN-QYbGs zik-(vJQdO1?Xd$*R?||+Pf=1NW6D)*tH{a+;v|v~u>%2hUj3lH&iglaTO+&HTB@%$ z>t!l3TrHtez6yEeC45E;#(yw4EF6I+e%T{N^{=*2-RtU}=ePoVT|HeAt{6ngDu?EQ z@FO6W`SBw-)xe!ipK$bo_qT4fmg`(}7Ljyqjdk39?@f8q!P0EF!tGTptO6@6M z2e^@A7-kBi@R7?IZa{nL%h+o{Nw}txrmh=&m2r~Ai4n(!$lB< z3Ddrfx|Wvem@CU`ooaS{7U|q`Pk6RaR7DSm6h8?hbRjqv6^E1_InTdheMg}= z)qm9Av&Q}3ce)+xvigy0ux`azz9!*MYxqg-O2LB1R;eL^bs50t8S;_|#x-1Y<8^(a zwg*wC=@#z$Kka*!bTsB$mB(wrM@KDHIX$KTylCs?P)B2yBLI=D4vEiZ4V9RYcT29G zs!H%Cj^$AY2;=8T*+j}l0;m|l$@KL3>1*!^YVPi`QAte|8Yje>ic%GmlK?!!1hx-j z^~cXjl5gv7-n!Jmf3ogdb5}bwFs|RKaSYy`95TlljFnT^tC62^>#Ad~9b?|JQ&BaC zq+7DlXuC;ENpiYesmxH*(<#KDQt>=V3|KUwR2-70S=$Vc$LfxNr9Y~h&dna}+cf)T z`b-vTn%9!)QEF<7R8=z|QAa&Ou<({fJ?a;d!pOX`JrwTUa)Q&iDD53Rw(bjE%KrdW zQA=N0d7~np&O+tDRV=c|0AQ@70u&L*cGqI`pL_Jyv#0jjOH8zp?ev6G(xlJ?r)p=& zUlWRmmn+McWf{r9*E>nk&9XYHf3sL)x70jRK$H_h5{TgE5S=_SiosO`fCGd0lw;gK z5k?zVNNh;rnPFp?y z04)ivw`#$)Xzk1GEIWo8$t5BigUI3H%S8NuJb^ys9OpS~{X6r|T=vbsqkH~6&ttSb z6~6shJSH(QYB`sRo=CtbKtpGM&JQdR#A?^uw~7lQQd91zDlLSsivX-fc&BWV-VC4s z9H`HRz#hbd-x_k<_RX!-4XFhd__owl+0tQGOs_A()Ks~Q#5@C@>%=hx5uD(!aj74b z-fjwyvz5pDr)SsiTP1$)+0<(_!7ht*q-rSU6)}d%aDzXG#O}O7WhgR6bE`vc{jjMl za8p=1tF!NR`sz8BT8fHpE=!o#4#?pM2OyQseKJn18hdn+P){X;ZPU@vG~eV7v3Rqr zYZ|8?5y4{Imy;+sKIgE=jn%UHak&ij`@g3U)Yh_cpM5Ql=0pfC!A@BsQ&UlsW%gW2hFj10DlAvO1ePHgfQf%ERX@^>F5c-!5X^v zF3zy+WVVYf=CYoW;$$)>#g_2!%2mlskT7wKcM3Zler|ND?d!O<4O{~EvuUTcR#Yst zl2dsqaBw7OU4sSBuL3Yg10WNh&_0{>-|X@BgttvD(cW|wcNwCNIPI4gj-KNPMj?lS z>SammdCFwfsy4u_InPw z>`B_C-lnR#VMhM|GfV(7g}?+paf6fCpU+Y@i^oejvOti{4BUfJ)Uxu3s}%_w793dc zEr2tEz4AtM-@1|0>jlOOX5ie^aNJ_3@C_ufnOrLjqp(GD8sLuY#c&(B8P_<(9fhr~ za5NPS_RyxZUAjYV>4<{oK~sIKf@Y+pr}&DTMshio4XJAA>aG*FDa=`QiHGq(A#;*@hR#Waps2E2jm}=KT%nyN zSNM7D^mMcdOs-$b47$BGzw+kb+!9HY1G^H(#2i8tBjD^DK1lZ z6sA;-)qpMD6jn!I3zEz;<^zziy7=R&O(YQf*v+wIQWN?U;yjm#Z2A{>_D@jt)I|M>|l_#)o zW$)6qi@omIwQcmX(M4N%mXb~5Wi*qnr>}}X18s) z?G}S*__<|U;jWrF-kGWaRGJlt092Bs83%Ab3C6C7dg~oEvgKJK%U4fFKx-?eR%Ioi zD3ZdwvJ9959#PAf&m-Sl{jqwyHq{m9Y+SB}qPB>et&x^~ag><@1o0Gr$VebziCK9D z2LYTV)a@INM|4ewuthGUzE86Hd1JKhyG3<@x*90p!P)C~C;k4;r;)aw<_ktywUv-p)M&Wb|t zq;#(%e+^k#N|eJ4uMXu0w=D#Zer{`!`>MBeMR2#!v=Pq~5ywvi@x})w8~{97Re{II zpIvh1@%=b~%x@yHhL;@U+rE%6KQVw&150nmTfpJYbdgTeA z*t`CH!BTH@@>IbSJuR{0m`6`h0a5s5RaH^v7~{veBRB&FqS$j-Y6YH_-{7Euyb6k@ z@wiRmqW32l$MHzW?ha3KF=D?`wnT9YH3VoQcPg}SQi^s|;_ezgQ8q>~kPv0CG1%)( z?{{sOJPJB`X~k7NFBXKl#f zg8tQn&l@+yu1s<SNVA58YWI1<<*@TkPlFo;_36%g6$=B}Puqo)F* zoIE5XjwEGlaVkh=WjQ401#zi+V&{EJePxoWz_pbH5^8oZvgP^4WNu)T#}Yd>Ny>tU z*H1J%a>H`6o88(a@DdzTK{5ifFhI;P%?BW|cO|_^KBH4DHTNoNBU3}Q5K>y>jb@rk zrJ`g+3zp(tiuWox7s2h@u>zninYPiDB!`++yzjbgReKWST)q`GX6XB}t~sz)RN{=t zzz|hLZeIffxgMHuzU-?_!nQiJ>TQ{60+kfvmc3D8LRC{Hm3sm5VdgA-`%K<+G}oIZ z!KrB4t`^@FR|bg~Ge3n!nJ` zs3R(p0IWNKf(Ax4x$PY`28`98s!@ozerS~kPi^!!hqy(3+ckyHDB^nNh^{0;2N`2f z2b3x9GBi%0MS!e1d2Kn1Bi%Aj&e%e4(>~PB3!CY}?Amy4K$a z+qDRi_>zl#ODqrJ<1AN+A(-+7azh1dj>EJn{i4fxfB8M8y<8)ypp1wNRB~9$9&x80J&0VKHga3kcRFveLH32))iOo6s<%xPbxg}l zwG+!C#)wpMc1Dp3mF{qGFiAKa;m^Oik4H~8-gY&qrGlj*ich%d>QUgF5X|| z&N1J%2{}AH&3;3^pY;%XtJm}Y0Ek7(+qF`S?{(F*?y|@vhM5%@$Kl5*A=R*R=8T5O z?d{y=Jrw(9n8jh982mWt>D~!=uM$LlVsHjns)6b|`udZjwmzY?@~|b>XYBDEXN}=U zRcfcEk=G>xaEp&7AdHNj#P>MHrEg9CyGLpQeYVbTuc)PL%Q?j4qkox&-oTCmZ^?Qt=+Ja}Oke369WLXpcEJ^l0P-|9}XtdWo_x)DcBf(yDl4xQD2wpYJ(V zDuRl9LmNo)cfzs9sU7j}rtQ7BHiXpz+ZRtR^vgxfct>_mP9d8L)a{ijLjq56onksO z0kYsf{;%|`O7d)j`~1~yytZ8}k*Y3q7VDKQ6TBIYhzV(>kdG;5EL~GSiz*ko;|G?E z+G0uzdz-=&BxJ_RBzYMpIR%R6E06+?*k8mBo$pn9HlBK0Jxw+GhI-CoIvMX&uQnr3 z5%U{TgWY5Y9)}ni!5SNLlcn?wt2%Bu-QFoVn&o0P<{qgWwr;kZmBhH!{ste-e8JU;gLxT;we0d;#UA*r$M@EcLvwF zTDNmaV2*OqM_P%9Wrv6HsX3{PVZta10b%A*-L=)5I`6k76Nn|gRT+$v#*$Ogvnr-s zuX*@@L1X6ZK_|YVZ(g2s?|Inn7vF~5v>yuuqOO$%BE#YG;_@J8;D8*SK#}EcBRSWl z(Q4y!L~gCX-QIsik5Iz*ZUJ(~M}M@@v%7v ziN;Agsd{Hk0^2HVHyJ(xlbNalPl<{d`zMGaT(TBG06qB}90T7@G1$6Iwl^&m=9X>i z1$|O-YATAlFkTKmlL3-cpm0c2_!tZvDQmM*^p={A`2}Xj-In#YL}Zd0i_J9~xk(g{ z4k>7SRW0!e$Da^+5V+!X+Lw7H@w)^rb7`iWGOByM9FpHCW82%VnA_!4xl~inBCM+* z1&LloS(yiSO#3!L2O4SVw#&CmzrOF>b5q$WUX)VBaA6cN(n#d+X`oEx0$ec!k;veJ zGp0+Dbc)?)P1<@ndX|pgcM!Eq*N13QXJQJ5ijiYxZZ12V76Z+kY7O%9wy(0%R8j2c zVRWA|&n0Wk;i@V;fk5&$LlqugKI0y`#Vo~<`Ex-2`zBq$tYM8Fq`3pWuV0|0@hO_#qd_S)K0ylnQF&7#>+Ol7cGhRYk37nxX{bSd+%f1wskH zF9d}amB#% zI7-c4nXbAOj>qGi{F3$p+rk!7c73pA2bG4lls6}aGb45eIaABjrIA`rg>V$bfAbij!T?1tMYXr#7R^z(91 zrF~UwlQnp#D84JPU_fvOha&LE&n%S~WgU+mbsJ&bdUd*LY!^84isnjL#tP35BC6vA zk75W1u>@GT;-~5uEow@Yk?Ps;}kb8@7I0pSdg-4Woa!ZL9PmI?HsX83srV+aZQW;UI!D z>~tWx5@A3em(O2BX$}F+?!3E&8a%De!Slp+UrlUtr4+QxSqnDLuV_8m`L5I7MN9 z;RNCi7Z?ZE-%=ql)W*b*z;URw_0ZBINc71g7>FFtp(6pX54Wh+xayu7a0Ur+?t2mc z0H}1L2}B43D`XMjxtPcV91=z|^zW^)uvX1Np8fC!NdBIk^^F^Z%xnNz7wT|+hgr5l zm63@f(EfghLQvY=Y8Ba06mma^A6$EWdi%g%9bJzgNXaMD>8PL1rI_bA$@S0a+vllm zmOdJY`-Ss&HRLLDfy0dz!K$PbR3rDmILmkM`RjM^ zIT!$gtmuR_vUn5<-0(S>SO7m<06YHx?{#F^x=ps~>mECv>q~xH!l$K)JWgb* z73R!TMo%A590Q*E*>UMDJ+!LUTI&QvN}_n=A~`}58I%s>ft;uZy8i$uISMn!b$LW0 zcPhELP)SP@(N6+Aj-lA84nq%25%b5?ckQiDR&0`0Q(EVlA*hK`NaX>Ye4~<_5rA7G z^2SE2?ZLGvDK^YiHl{B%JY*M*aI*zHn~n|@fy$m(z{kI8j(DZ`lPsZ-=LCR3CqAF? z(M2GBP&tLF#kSpk@T8L4PaVFJC0y{4iHbJ>jPY+PatA%L+#cg6Q?_Ij2-Q?_)WKCn za1lXJIE659BrLIycO^Ug!yKPBs}`EBiGPDDsF$$Ad+D!WW@Mf(f|7Zm@alXr2~vTI z$S^zS2R@(6lc@GvPogmFfU)WohAS=LQPafD6p}oY)5j5xIZ!qS9FkOwFd&?QJ^gj6 z!*s2&*LY~DEh7Yuu_OQo1f+d(W=+Qo~U(MMMl)bKBu7d~7jGx&kY z$LH;UkyArc9Gsn5VU@f{`LN}~J&EprFH@q3+bPIjQMYW{k_sbyktr{!D#F)FC8iz)Y#G9oBZC`^)!2w7u^*#HX+56g#rr$+(g4}r4N(rQ6EmWYl6Nr_3%AAUl z*dck~0jmnK=`_;MxGa>hwNu1W=WCprg|C5FhvJ-ha|N5+XOZj%y!4XGr+-natsHES zY%7tf=Sd+2WElelA5s4RVbsf2@+qVHs_`SqN>r3?<)LryFMr&B$4tFj*w(9R&Axhn zRJB`Lszi>Wm03JnJxdS#noJ)u_B>=AkD(;swOI{no?d@9>)YwB^bc;Kfz3bhbKVS3 z+EblfvU*sW;S7E~GmsK=9#;8&zSuqVAXRwYBA)p51%D516Y0L{tG3;yw#Fisp1PVy zC8wQvM=Bf=2>0wW>JMy#kTss=w$f8vs$S4$H1Rm##CPll0}xMs{rjHz_0t2kyJLbT zG#rGpEnQu0ThgqhVSpAOoB#%-(N)MO+IVV6k~s+l;uY*{8h5U<=?(Dkf)8LJbr0__DYVDrEqx<5XXxQdVYF_)Mg5! zPnXDJ>fN!XTiu%POChGcQq4_KPJ9y~QWTI#_4GK$pg9B|%S-ibQmxCFEUGZ4(Bn-7 zAD6gWDiX4mB?&nz>Qs8;Uq^9cBOYY2U)x$1;N`+P4>0na7SL=wn3Wfudt&p_g?mRQ;+ek>0h1A~v#*GHriRnQq} z<3=Fo_4#8;^R^`MppOm?9AmNlJ#}GIn^{v~yEQj&8{fZ>DAa_iH4`k*NhczF-eN)d zV0vlaqcVzHp}YOp6r7|KQdCZ^Bc_d)mnC2r2PHr`UnnELnC9x;^)@)|)K^Q^-J__j zr12!AuBwWXo^u=E#$6ylvJS%!DwYH{5XH5MU2|f2X&fVNn79f!Dv_ny+wE<%cdzWN z-R-rU#5JD>Acew$NfKj@0LkusH6p=a+1rWgE*HL`TB)IgHyEK4v&$$S=FE!|B6?@h zi5`Q#bjg0|wazL_gIKS3N=g-k%Qx}bHmW>3N5u)?jK_$K5Rtf8H1>tm2ZB7B0$4}C<;Bb zqij-dI@0@#WZFLE`?5BUqPA_n3n7fFa7J=`MPB%CV~mx^3Q+xP$e2F;E6b_s^Ji_SLar+!VL^sHD5@-H%y&rHP|j+NLy+#=)Bt$Wiii2}WwKoS!D6cm->4kJv_X^7TSOYIF;h1WKZ7{;&SFt%D0&}Hx z98SWnjTs(munn zaojdI=U7K(-aA>=f=;2{?xJYgll3+;{H0bP%MtK=jvbGPX z?0b=sjWSDZucxJJolJXC<1)XJ=N&x-RYMsWa1k0g+tVbK0B5mbf@57SyLQPW3%BjG zD|2K%JoN80kjInV6iuFBjC+yWBN=R+y6~1js|!VT-?nY~ifLpu6*SfCR!Asm%G9GM z9C`Ssw<6t-r(!@ohM`_5=wx@RqTAH;l%-M!4+T+>kZ^fCY{+}Bs*k7uYJH~9b*`bS zg1r)!-!inu;Ijk~u>%-!<;n38d^RH`fCD|Wu{ECeYk)~5J=vgD@ce%iG9F9aRe;B* zY-IW$PWp|abCMMi-85EQY9JJEHq^6F2d0ilS__eZ>SD(ga%XlV_VmZ*G(2vL{klmS z-1N5C>ff8A10*4!!497hY&2Vh&UJb@)} zSdiGrBhUhL!))07DyiDC-nZS$;P1W>nu^s+T`6kFJy(-PuBhj_vKL7K$Cm^#2QjRp zR&TPayajuGow~iZx;<5H+cL?wuWh&~q>>sh8lXrbuUcSkiG3cahoEWNa|Q1yS24 zqxLsazRev=+#IAZWoz%924x^jz^CznXWewU*yo zO-pN`hK*(>IFZXpVy9l*oS#-cT(HJ)amPK3Y=gXQcS;?{ZAZ5?O<0E3ty3g3K$5Tx zDq*>hdGQ5-1TpRa8h1>CWTlWCaJr)N*ZuF(ez@N5w>|4oaoRt7*28Vu@WVq5HC;AY zRygG+v0N7AjFOxQ8Sh2i`n$VseL)+x`LXHu6l)b_3AIB(MMq9xn~?DQN_bl&9tW5? zB@b{I=`(-ro#DSCj+1F^l)1?@Ocj+ALB^V$Nuq>tTy_U6*%-$e>2)Q4HT#Y+sZdIGd70V7kzD5?svgsyw*oht0j54v6`I#Bz_SZ zjy!nwJ-t4f=x?*0)4oH|tDg3?S?8*@)>l@m)6tk-JABc_80I2>;x8e<;T=N^cJ$R{ zL$|3m7QwabTgDRMaGX8+#(|W>hEpIwz$B5bB3^yNaBLiFsCrYlc6Ug+A!O=a(%X^L z(a!f6_YFlI!6GpPs%Yb>F(iT@L}~1;*spfSn>M>k9=Z;Ug9QGHUc<`d{foGIf76ZG zbhKRKTg@fbYFhEivwz>%Cq8|*>#|>4p0F_GA^gpfl zlrioPv;{-OB9hV4*^$tGT$}($vE!n9U!ykdjc?o)l{Ix6vgKDs@J9$3DxIU&JD%RB@c7L|HM$zH z%zrd)Sr`I8m9j=V9CjU_4E`n88G~e%k+gQ%O+ODPw5cFy7zJ~w`z~I$9nzxvYPnWD z%~m-Yiup>&f#!fPh%zx#;lChwt};GdwLh!ud2VBX0 z*}I;Cu+voEwuQwIo-;1wie+r$2fv#={V}hicz1~Z05T$0&et?{+IjdNDL+MyMg|J1 zTCOzxX=*07)ZMMrl+rd@H@aKtV`UzIq-+80pIuv&RP@`kqjy?rslM^JZK*s@g^oz& zb4tUxj$biQ9zqF1eFg_{nhxu>XPP%^?Z>yMinAjuO+3svp8o)W4{xt+H1tt!wmSQb zHruMXUSi^{a9eFVgi1z{1G95NrvxD#^V_~P=vd~phKT%yB#hx9-{kv-_dT|XI$05F z5mFj>qb(O8z@xqiVhZC2ILC4itB%>BO~+p~BMB(ymICw&8H94QedSpK0K?0SammOd zzIE5#59p@Hwc2Xylc%)O%Xh4*f?AuTO(fI!a!bYI=jMYdRfLh_IrqkNI`7gehfiAL zypwa*-eR|;wGi5_w*fNzH!ekxJ5xd#Ok{ErhdfR)at4O#TU&V{L8m;DxdMtSp6IKd z%V65m&s|6hyfmIXuOuK0z8Jf9V}eEo2<@YG4S`WT9bB7=&$w*0uql!WOG5-w;eg;o z>OGEm1|tL0R<}ksmrr&-Rc_mwJ7vRa($!MUEnU)%u_vLoc!YRy#T+j)$;wsy3p0=u z`FMuH*Hd@(w|4IqrQnK+aDJ|IXt=SFOsKI^&m zEcJrQ)`L?~BU_}nB)D0<`w3|-Z#FU?S0TIXeN_$U#?5= za#ZBa1n8_PDp?LmIdBx50^_!LFw-|c_oniv-836A?^Ak`(R!wyhMp)Ol?_c;j!9wV zB5;wI$P^wYEIS{3=YH(C_DpGLG>YsUolm&89prVFrn_>4&{D?*EoR)9c<{UctGSAv zXIYpo8H}n+cxNmQbCfoHu6K3n<9XaL?&D*ELvOp%+oYwElZ0%(1pXXCJ|sG>SR4>> zj03GbVA@xHm+$*N?WgJ<<)>O3gptujhpe7KO3IBR&*DHb<(M3fL*1L#M|Y20dVjm% zue2t^zgN*++8V0aDQ*!^)KxK$1XQ&;$>Wf&SInY7R|U>Hm?WDS1p}HYy%h~#X{Sql zMT+}uf|@$`VYvwz;)}*bC&GAIBrAd$!2=n{^x{sE6J%E1ZW2YaXzHq?kN#n#Nhe0+mf)md(dXN4Q_Mk-Uh%y1YhAZ5-7$RGr& zv|Mcw!*Qmyku%JkR-j-o$6^nsU;yRlbNOpPn`3aYJ}*^P+;-La+U6Ubma>|4IAxL+ zRvq!*w_}sQ4w+7`T1#En-S3%pX)6Xa6PNm55F=ZW_N z8m@0*+jMH$*=Z?h>l}E25Xd2eOxm&6zrzufSG(5kR<7LSC;Qo4u#3J!z1-sy$+Rz=lgsv7nyRgS&>8Wo~ zP;Jdi8<3A8%E~>;sQ~Bc$-jL;4b!kNTmPPU~z?1aW*q_rZK^})#Lg1-J132tR z_tqI8clnJ%ujHmlCSRKqf!kXlVC49!30CA!xf+Vnb5(Dc@2os`j!cFieEvs7$89Q} z&_XPOl+i+gLGv~W=PUF6nf2D`B#k8uN|0C<0OJdc4F3S#tuap@ii{XBDfpF1Ilwr{ z_s?%ke~zWiLr|?8)pU};vniG`(Uw+FJK(N!^}y}))}Y{4a@8J8n2M+v56dC457QsE zvZpL0E0g$L0c?7K>yK~ywS$UcE95$oG2aX7J7WjfdU|SQuGLv|sx>en<3A(v2N}k!x|LFf5>dqg@gxVi$6=oT0Iy;H0IAzdb}K~p>z%gQP9&0A+MfmE z0FFQqdwlXU>84vA!Acmaq`2MH>uICqQ5r@}ajQ2F20#qlgLdo&8^3Kc^owjS_JXr< zQcNmlu+Y`jBL%{T6z-}31Qp3DGJE$2w_~hRY8V(uS|W(O;CiCh8EzG8c7oW2W2K2H zsRJ>7d{5&%e8eb>9>*S4)VL?Eo|(jaWSx|l)kYb3yEkllH+~_HY=NHI8Dg5c>$&ar zx=VDSu2RWK$|zaU7lN#r1Gk$DnK@NBE!()AyzX@Sa)x0^JgE^>NO2nmp9ojeIT^vi zp4d6bIU4itjJSc_b|agoWFpgCWwudx&WMWyM59#kSlbfw0hssf$&dlY3G8u^LQq<% zt(%TY%ALazf@x(*rIrQZBum^lE=QG$fsP>H_6JA4{E|9Jp{AuMDuPWT8O*9-R4UA5 zlgbK!$N(AhoE&=Bm&(pQGeCGCo-MH zBHMLgB zsc`D7u1bRLQkKtL^U@XI>RA6y7SH`3E_`!6kB_1|X0%^l2s5 zNmjCDMvaQi5datpFA><1%)wNTkORN2slw{`P+?r1ELy6anRL1(O%zo#{4E^3oMuG> z#76~>9zs~$liP_S(0VOzOP}7mt!}WAtkmLGfsO!`-JOBQ^7Cf&Bg#kRsl7awq3jnr z6`+M+rn#hzih|D&Xdj;**dS#+$p<~V4JuStO;vL>5+WpkEC8!#$PgY!KA6Gz4&dtp zLF+iJn}CU-W4mbue!!uU+$1u~xayTx7$~yvDl`4;r}+G|PJ4xA9^|>yr5j5HJ?#xb zfINh}vHFighR4e;J#`vddW5>InmUJCbuiY*v8XK^h{u3aoCBE%C*|MUTBE+teg4>9 zC5T4NRZk?z9u#(XDHncQW3+Bcnk9|nfIk)F;F2-xk=WsS*z|J0x+o*QJ~IeEGdOE>HK1AE4~Z`{{Y%R2+*lhWtE6K*lqlm*uMh&uh0_ z`cYY59ZUkY(|J=gPJf8d%NP-qUs3}sg!ac}&T=#h;Zf|d)zrYnF!G)rMJ>w&FKl)J zy}d?0nl06YE^1qN(4w-odlTRD)|i|eq>tDiPknCq$mLRm6;a=}e*XY7`f4QQ2c957 zAB!j3+eQJj6gXJUg-J~3-F50$NMi70k@za{13up^Yj-Xcv)p^VXhY99ty*e!BCQF4@7xHAGs9Om4h^#&CO#{{X{ZJ8;h+3HHJ6 z2DGOY{$hQP&tDP5^2aRq)lwenL?!ZF@!uYU+eU3PHP=%-GRhY}JC)vfU-8rD*D|cUqCotHuu+wA9f> z6DlD-3t@6!i6AJPBE7jueJ8#{cZShLS0C{pg{g=}#tC;sEIZ%@DtlnCPpNHQHhtL* zyKB_cEka6(E7M3~R#_rgmD*Vq7aV}|4`2R_(KWMA4owOpmL!c3FHX@V%}6`55F3aQ@> zoM7P&Nf{o;og@LyE2zo(Z62$Pul-lGRoyQUEmc&|q%TbwJ%hKyq8~Oioh}A003t_IF=o~Y~uF&J+_{kAb1qk_|Z{AU}J}DWFFvq4J%luR-Ra@ z5cn}D&m-DVj^jDUp(D4?*V|j}H#(XMgr-Wb;(!k%T;Taxxeu9Qa4>$O9rYYVC4t#l zQl%v0H0uWkhswv$jwcz%Y-Ilc*{>~>v{1&rB4%|ZZE?VcNEO;agQxNGeo@jzohJ6n`A}ocS{l zR4Nj~CjnPFPhLIYmz2(%fVFNGr>% z)~XwX5yFN`qzyBI&c%EMZu!VrFh{5u8T1;}QB6HUv!{qvr;b9%r?_7D&(x1^Z5xRJ zK(~_dqz%giNyWXf+y31^y_EZ+t!0s6CN|5+{04E`xb8nr`XS-Xz{@k0z$7md*}aMR z>bl=hR8ze@&v8$2tfW~$6qJHBK)*c5%f~+F%-yg7(xe~@O<)A7bEaKquy1SpJ6Sdb zWfju0X)7XnxZtRyn2te`Il&xd4!A1Fjp>n{S-ZOb0JQDRQAJxFHNLSSW^%Qls<##5 z4g!pl-&_EFdkrt!X|4N)vZ~pzDk?4Z=_Uzrks^f`#%S1?05StB;X95ew{zQ7?)$rK z%T?C4lWSFpB->$Qp5SYeH?61!IUb%km2z8v3J(NQWKg*oI>S9}wV|!^Bb%;ksDiG( zhj3HVO(Zf>ABlxZyj~(hA&4u7jXXwjqXdB>UFLE8=KmiaMNb=*6b!I~=TGFMYT6>908nat6wZ7}60izgEvVTt|DSf1U6w^VPt zY?c|PqluxZS*P&Q8aR+E2WY(bVIbfocRGftp{s;kC!U=rNPC|I@ysI}&m}xsNjZ#`VD55qMy<|_*><(o^>MDc zQ_)pHYmO+WA)c?u?H`E&ZX=f^9vSolBiIpvaK|ZdYaPl73n;n4KG5~bH-RO->}t3u zriG>#I%tVP7A|Fb0pGCXS_W*cogF3gvK7vIa22Bi}-&yG;s1ToQ_&m`X|soIqFc zDJ%%!MgsxqpIrAk?Y0*~m%i6L${&E*PByF5xJfM(RMhgyr4%FOA{p+a6NEYL0*q@r zM&Yy2A+^@lwJ@Oz2NskV_<@BZ1e{=dfuPpr*jE55Z|`ygmz`&okq079e4{Koek|h{ z(VJzDM##Tv);BX6-9)3kY^dnb`phx7dCXFI@O{ZB=D?Q4Zs;;ES(nTeGS*WEXlgLVn zvH4VI%k>_(&bjC9B?rZI2WQw`*+Wn$XhmFt8d`K&q?T5R)z|PbR7X;{1geATqfa|0 z?F?(9lWgwWjbu_$Pzj=*tHPS1YBL%*X^eia!cHZIGRu>KO6rT*)!UzaRqid(exr$> zjJ8{E#ZwR^qNSOZDXJBekl5tB`1!odTd~&{S35R8r`w-ZyH6XO?5i$i zfB8zB5`WF%urfIJkmmpa>*sXt3~((049OejSeKLYV$CEj$CEl{x3s%?B zD3#)Nh7to0Mu@+L_$L|kKO#WTeZgedSEY{Fx3On>X_Bba8`3F^xAM1*G6Bg)lrM4) zS3bHXvNuynH(iD>h0Y@(7p>cS2EOSH;uvi#Ws#(~EOilZNt_tgNeC*XOM;*lE65N7 zGaVL#Y$Y?7Hw(PdR3|TmM=Jr1(+ru6E_ogYJc%r;oPcx|(O+oW`+gfGMOw=&VWEYp z+%vHpj}9=(-~?3%i6Mt^;=+8E76GFMElNKX+w7!+eTV<9YC z$Q1Geh$c8Zk{C$}3dZ1?Xenr|%OteW%{@}FSkj?m6AXoJ#~^@sg$&@IPFT-uDJ^ue zky7wd#YkeDt2{C}Cm?c9`b8|Kz6l|ed2li9vh_n-WRj{&(p14DVSXkf$~0i*4~WQw zb4KNm?m!`MS-WZm;WoiyiYwiMn!cT68AxfKXr-0dHx)$V#m+-|uK)n$cXVJ)#z(_@eN5^%Sv=>T+_R6UXqD86C3N1Pug{H#J=Z)~bEW5soJ|icY!JbG$U=a7U^a(oi%8$| z$TpH54+vV>>gQW@Q`+k-l<{(sphDarI3O_11j3)|wnl)}?dbOvimuP_Xl|6e>JcGe@mwH81%zQv z9%#F|gOW!jK7cbVb)t%j8oIQ#{2G}_24s?0rb!>fcUOr=GQEaCz{v04O0Br;Ry&-M z+3qb%TXT`76(^L6lZ63zsUr=Xc2SXt`(TrM^X~WcT=}&2OrNl-tM%(}#bUM^+cCVy zU2CsuAAt%;j624k5~!SGgc$)GKb$sm*sLA7TSHN^rnJc@fol-K2zO_V<#FXfk3q>4 zmLL(>4Cud9HjdV_Nff(k-8hn;!nREpicf_8Vea6iNH5DyuPfXP4f!dxj zNLZF$_*@RyIBa9nwyo-0okbqrppEISmdYyUF~lX12A>?3PV6$uGC}Qwoa452L{VGg zO88oky-Il)$r59bC`TekWeg9XW1O7o$Em;Htdz7js*04JfgxH*Ca9x#C`^Tb&md&u z=L5b+GCSaDs7Oo(%R{&&s7rB~>fw&2IVnhvJotkVzI!OfLB>8<vc$Q_8%)H7GjXO*Lc)Wk%~&%DKGHbpxiG{ zO>&Al8KS5uO%g1UvolE1pYuu-F=7G7uWT_p)r(@&bW3;E*}fm*Y3#K0egaMkcqT@X zq*(~_p;b^0Fau))usCcXY`ov&wp*f#wuZ8A6g$Qj!GUrmahwtSCCN`rcJ4cB?%aJn zp8L}4{@(kBqUTk+sUx;WOB$oM4?9Twfl(T)YzA0@3#bF|lhfy7>14~gn(=&o2aSYC(GN3e)aRFSOB;;s(pj%D~9j*=ljG%okwNPz3 z%8O04VR$aVWsVr?OsP#(6iF3KB1RzaZzEy5t8*ZgA+=>!)1_qsLLzrC0se3fEONeu zPhb>a1KZ3AIL@lQwG}Sgtd*{Na_hBVtr67xElsifI(nanKGIHXltrW?n+mNhcg6`-F^Z;G<$7mh+@WKY zAd{XWumk2kx~=*?w=S31w>Hn*F-oUwU+d(gouvhCcKViTm}(c3dH(>1FPJFE^~bK9 zD7Ov2;pnQ0f0V^Je};?|k+>ef4EJG@0LDo4&Xup5bEVy1>XrNB_vQYPw)KvUZuY7R zqljm%m&6popcv-LfM<)SIRUT%(*5R;nA!%)X1eveZ`rp57Aq~1vcCTSB{4SJO477% zSusx{_?$)*mM4+IuLk-O)zdw+Ez;e$KKqIxxbHlqyH(0j<18Gsbn*7`MuWQG`IxaI z@PS@*m!{El_j6ZXt7#>!t*?z}<+=>N0KiJH2Ml| ztL0{iup0md<~wp8zP|qeBc(T*3P^E<1_HLO~t#-%8Te%}rS)%AR@$(5ZMk;@cBv`k@TwTpNNM5m%FK9qg8Jh)1mh%j_x06>0fLvb^03{#BkAt)+f(h; z+1q~IO;+hs6jEC8N@oX|T7`_KHF8@gBeRk_jdCYduQuPak6COxkkL?Ws~+n{p{szx zCWg^j7lRz|46YiSgh>#P2~xyy^6Ro_`kiX50M}aQrKym3bqzNVfP!vUZ$*FEnmLlj0y?ad@nr)CR>L{=aiWH2~6VcWNR0_kAC$ka2_ zM3sO-qx_h$;(LI^a!?qY#?!bcX(5gN?6~+64-z$wswvzYd8FjXtf+YmD(CQ@Ugu3TbvA3wBP!I@$Kjxo z4pA2IoCW?LARUwi$j=_!MpwB47J#T_OSSCT>uoh+Caa`|YB>n1x5S~QnTZoSDGqqy zN*5#($rru`Wc254+4l6a)83BVxHamUN_xr~zYZv>qmh_}a^0Jnft6syjv(icWO;6N zzYPUuYAs1eEj%wBZC@IC-ZA4QML-4+_wK!j@87nj-5ajgQTH6e&sFf0k9Rc78%oG9V?P_$d>}U3M+BVN0dRQafb+W1~742UkNa|D^s;mzfPUU+rF1YS} z^-}$ztG6#ucc$Oj_8XMcR1|i&E6uqogN38pR-^9p4gi6EfJBoYR$tM&pN@krX;`5y(=d#Z|B3q@_8 zZQChkw66%$q)xRS+jlV0`;yyl)7NgxR_y7``u%O& z_e-EVp4Vu;3u^NuFT_OPcl(-7}-v@ZD@wo1Wu(wM)3tvZA8zbrV&~ z3R9$sNK26N0A)GB_2ZF}HELX>dJTbeiuX%HMq;tb^+40jBpw=r&P6^|boFEE*eBPv zkUlCF*|umZ=^EQsEwQy_WH7l6B*~J+uq6yi##!Wv3V;C$00hC>Hk3l|0a#P+B(iT> z3dpJ{qN%8&%}pcmW|d=SWOZB<*%;u00QdRo7W(Q9i8hhD*zJ%=T;dsVnBfp3_kVq&8p(N|& z+WSJ$Efo^(3(TUrws|T9($jb_#;xXPonr2Xnx5qPAF0+YR+Tg7EyZ`GM0$y=wY3pP6;y#ls~n90ia=OK z4~K^IUPBquF4yWN-lV=g{knTYx0Pwy4`EP1{w^>CfwFn{=X0oM(5KSixqQ;D3!m5_$IXiMtp$F}k zX504t&$nx6cFh{xuF_T0T&n2c;VVEP9(h8XJ04?;GBL=&WjtM0YWIU*_oVxRIyP#X zl?kPKf}}e%QYBL5qwdU&!->WYBhRLT+-_Hm@wqGRmAi&Inu)4RQ#D0LC-`XDOUA3^ z7+(Z8pzn}yPkwa%J0DJ()M64HxRp>PZB72`W3XRRcA=VyV_Mp2U7jaLaHZX{LvU5{ zk=a2YcJ9?>u-DUE>gwk%Qjwf^a<>VhB^b1B1~R0ikDOqntLf>Y_p2S^JFL*u+9}ei zo(bc5qmnSwBlBXs@JQo_Uf3R74_$7W8&=|^sg9AWsoWyO@8M*ufjrBGQNf=ZlVs5tIMxz-79J2kG9oG!Ig z5>ZTQVVWsXc#jK!EK|yP#}GLgJP)=tdi3JiV2+xeyLWCEqNi0AlGD84I!HruV}xgP z06usC-+-|IXH1SK>0BB}Eh4QR(EGm2%b!nn)ykF{D_w0&PXn~Ppm_5Wu~sC=2Xl-9 zpq!>Me-;q0eH*$`#Z4shUTP{RP>NSzWApf3{RUSN8&7&&A~|(MICf_ zStT;ngsE;unliqvB4N~p2mk~(VS|%`8+!EuSTAxVlG_Azwd@ziN0mz);bTt_CUD6r z3)R0DkyJ)wi>!yqEw>9>bIy8q83sWBoTnh)GkzTnIU4T2Vek9kJlxd zLh$Dnj&Vc(090@Rwh?XJzNq%nCANCV3=a!aO6cL_jz#9E>Ht1c9~c0Ugd`7O7MXEvsTp8-);BGsuy1l0}OEn z;>?fUJc3B#=NJo-kbjhxDh-<~6wuBtbyVD{QZI*+m^hTPfaQyjc$1uzQ-A>tjNs#j zD3A2L?)H`~*>Y{#)%DlCr)0cbs$z-g_bu1q!?;y;dL)W9JV3!Mla9yN(>iKsC@*bO z9^s{mRT2EOAPlS}B%Cn}-tIhmUAt|b$n8s8AKzu zuB6}U+M0`ccr+I(Y2xr2C-Ddz!1cfY5O6`kA0gXAXX{1IS?TNI+K^mnVj=5NMGDd* zCP$q)0=e}VE0pbk*aB(yH22%hH7)L`UZtEyl+n4F;ES2Vmse~c^08hZ0>o!Mfh)$- z*`u3DReD;=c9+JF!dYPq7{3%ORoJSPQh1(4aG>Lky0Lh)q?YO%Tokhl2fM;fr{7nt z&w5L(uW8s7;G4q<4XOv>8I+Y^tQq-&3BV(`4UaL^_qV!xzAsjvymxI?Elg~s7K~9v z8ySk0XOQ?|)i{s981f7-0ABSR6x&+IH1JYfX(CZi9KIBWHgzc`2O?CrBHm>sSF$q$ z+X1qhe%CGT-MJ_?43$mr5=8YaQT!JY9|?niFu3qpj(s^3p8djq8HyV(ZM8!Sh^8j3 z$M$uy-8KOh@RYMi!kUOqDKvi!l8cU6`-6cg_(M>T6Q$mu< z5*#w(Kmd7j&6msu3w;9#^X;3BBB(Zrs(7ye^)$!B?m+AbAOg+noQ(PsPZk}&(v9m= zTP^x43ewY4gz;oA!Wow#k0u3FfPHh5$d2BmK1ONY)7uF5ZA-ViZR)m`TgAG8F1G53 zxDSS*k~tDz`Q&gywiT6uW5g0YM{FU}CBkYOj8|KYJEGM@@j#L@93fQ*Fr=vp7-Q6N z85mrS?%J06+bz19d#R*ak2Jh#k0e4A@!}OnghCu~^!Fz^({`6`-xQ@yWn2v^GCAcO zFNpyRs@(aWOWcv%kHxG}cxIkPP;wJ4cwDz+-1mRKquWqZ7^$%H$0Sgznt`4Q7?3$& zFCQiX<-Zn4)z7o-whMhk?^QG0D=Oe&G%qGuUj(RRLPy~v9Kp#Rg|Kuxcx^78+HEy- z)YVeatJA-U2a5cs04oVOMC!~(6#QJW0Pmerm)(uN=&!E3Gj!EdKqHb_D&@HaWmCL&c&!+bzW#jI2V=PPzyeMiNlBlgV6BkW`^UL;E#gKJ6iA@(Ma`Z>OW8R zP48sxnlUx1g`@b?rK)z430(#!c-+WL4jG%42=RE}sR~GocH^*KYJMu%BCJ-dSmtR1 zBdkcuf<;n0BP)-mm%m}1UVF#v`Tf7!67>$#*6S7PZQt$2o+;s&(yUc1g(cvU%fdBd z#5_X;vhu(<#T8A`{ngVNt0m)d?Pa=AJOkoh28@b+Q3rrB8DsGulZ>HtCj<=kIyrQM zabwRbFx=z4s?Ob42zQU!o~BBAzH@BLy)DL2(Rhy36(OnQ55#g*ERnkv$pa*M4N|nV zcAI_fvS+?ssBD+oaV6rTZqux;NRYQ_T|%TxNXWtD%E0jVx4zGt&tl)YlYX;U{{YMO z?%=V@PSkaA_$d^^65%WmzidTTD)wY5?Bii(>{pnndT9Tm8OG$Kc9cPtSckw^%lprTOy&j zR?sy;sevyMcu>}o&ORnqj3*hmKV~dJB|t0Kom=Z_Z;MT$hCYMXw={MZiT4F$ejJsb z1;L%9;&rcmNg&_cd(G>+0a%^`_AYuOi z60uN2Y1k>P6tz*&Gkw!fP9=tgc>~_=A&?5g4!(gqI$^UNWx&NW#tPmHDE{s%Yn%Jv8x7Kjr!xhS{=p~ z+|`Kl+c@McTpWN6;$$R<6!E}pjGpU}o8NPNpE`eAd#v7@b>p#LcNH9z)p1*?{9Ao| zO@u7)K0G-NGFSqk~0rOwtoCP=0gG}J~I9SSK2B%G1R zDJ6;Y&Z?AVCm&p%`o2EUG_)IL;c$+c$yU_+kS$25kQJv|koj{Dn1g}j#s)F;)eKmx zk^t^KPQAy5$|lk=NEYGlB03wo9~ zAHId(6#|r!KM*1^sXry`btwZ3lA(YYASw0#0Mz|7Dk*s~sy0Mrd*|uz-{+}sR3nMh zej+_{pe-sdrgP#d2Vxlh5HdY-5oTN#}|r z0w7~{DggKGldE%RD*+C#nZ#z8$POjRAZH!BclXxXFiAx@EaWKv0N!I-Z-yhrSQsz9 z3HAK75}LitCTN(4Q;$sOfFxRg=89*dOHD0OJ!cxFVaRh#sQC^*_K(wBE<1u0!qd{z zf~Zh8f~$o;$~$@v-(3xnRye8S4Z=bJJeP=7IKjd7C%&Oy;;W#qcxCY9EI|yo!3VfK zy)&WPyCpX0(%ovh)JuJipj65x?tzt*b|VM7f}miZU04?jthTMYPhSl~%LMZ>L|QkD zM<@VE;ShL~%8`ML9al6~+Up(Lm0dhWZrF-Ll_7v2oF3hX(d*SEWP4T?sEEd>!J!^9 z029oI$UEe)W1psd^Qv=qA{ZD(X*aV$Yqh%8+~ugIoMxySUY2? zR_nEVbazVHq=nRZ%eEDO1BpD841x0X1JwG|ZDF@l?ccs4xFa;NjKUbPT%xeg$mf^8 zvD7Bn-MI7Lq5khQ@RTt_RYsCSi_s;aCP3wfe7G-4->DaFvq z-Y1S%mUv#Mz^zLgtfvZ|a=cr)>{zhC_apMMI%Cv3ox;ra%9_P`^j{8>#U(kaFJ#Y% zJVV<6V?J#6_CSU3dE!J|ABU>v`!Q8i?MGK4(^VGX;8d%`{ITto!R|4wHu*31Ta*%0 zd_v1k{{ZCb>)df9j@k4FJ-t19cRFX@8**y<-^WWFw1QaDqr;k0!CZn$f^mbM+Env0!Ij%9DmyPFVm_dIcJ=xlY-{i@x=ChLk9peG>(#0q*|(vn6!meR zi>B_N9a);!b4;Ey>JQDX;)ounmRj0Tl^@BqEOSj$>B0KIJXYu9QQZ_+aupZ zdTG28!*psZ^Qu0Pi z6^>OPH-=jz#>>Iixgb6>+enSYvvi%o;G=tdn}V%wyw+xnnA;3gW78g^8ke-{=wQ3U z9b~2`r)5WUj7V1}`-Jg7s6W1i+-f{flPMW00Y14H)L617jgBxoO;8Syab8Yj`ph ze-MblCE8Y2bO4k940j#!jX`pcb#$BiME?K}GFxI)xYMGv?ju5=u~%;?B@}`&*qjXH z>b9EePEwM#+h&1$33$mm)Dh!Gpm7d4WHA7f%h&s)1Fl?|&7uz++Wsb;E)cy1;)VjzbBKU>_(zK1Hgk;QmO%iJILm)*`mL9DdI3=#Of8m{ zmNbfsVdMj&q3%LtV2t4WfyTKpYY&BL1XFv2bLh1`5vz{l84HW{)!s{8+MeZ( zUK4|YPjT<^@A~Pxao=jK+m)^+ukTxRd;CxgamXBk3BbdlBz(SIv8#c8$aWavME>4Y zLs&4fnW(r%t(^W7<{ne;@83P~uWz4Z&Bswi1ueIBT5491vd1KphB;a@-_7B(@&nl8 zKBLnb=noz6=f1?D2e8c1ma0aY*Cy|hRNI!?iK;*^@Raeij>-pe00f-^ifW5+o+4Z< z>=I7H1OuFY<5xb}=pR$IP5K+k{n=GaRg$7OYWO&epF`qs@90h&u=P6gs~aMEE4=o- z-*1k?bTEplDb+^`xEzA5Gbbg;2L<~aoU=c+=4)el@;Dayf|g=?ec-86R~x!3ij$RMndpGH&MF#Nuw+fa<9p~)E|1HQJj zwZhtmsBa-y2Yg*Fl!*n*yJCX7_mM)Wwc13Wb zq|Y3f!C~0s4%#CfQBfQFaya~krR|-Iy0=s^&$ld9wbaO@OHi@m2*A!uIUz;>Iq%yV zccAIIZEN+JZ&w7VHI+#fH^W4;Q{=GX&nv4S^*xF(&$qs@O|OSfd)=Qz=0fM13(cXh z_kQB0tZlt-_@$$b=c#COAgAD0n0`6pR4^w#z@I=)jKQ(?e%q|6pLyPP^=(5_L0ddA znumIHBbTDf203yIkfBb(BSCAkQbNk5oZ@PiFtSG6c_Atl zd1PU`5LvCea*R;Nw|7qLhUIiE+TY$uV`k>*#ksV}#Ag_g0zf^^HRq)9=^YrEqX&>V z3t7{Ec9mAWO?qw0c{U!|+?4h^EorZ+sd{PFl=6N^lgSzYsG0Yau02LFbggcs>Q`2- z_ZmH=Xs_HC12Zi1FD6065)}#Ui~t5Z46mj^)u(LRw=J=DmY@4;a=1k`Yt&Uy&e5Qz zD4s?Ti5^B}48RxsBR++fRi9G&kJLT4)H=&&PWRsDsEyV+8itapSB7PH^ZaOeGP{h0 z!>eQg+>B%*)eS_OSTR?BG}bV;f}5ID!ITAQ6j2xeE)-I^^ zX58s^-PW6J;xi8_nrn@^G@F+nV;ZA}3&neq00YaNJyu*gOTDf!Tz6H06)Bui37W2{ zUWE#mhFIoM%F1}C0o8Hh55z$lbK{Z5oGqnG49%cR)Z0xZ%Hy~w_r#U4(;|uJ<*ToO zt+MPa9}tGlcT1hkdn=QI%>N#M&9t2Al^kH|(l zaa~h(9PZji1I;3w|xNc^;p#3G;TwG27R+hgaO>c;YlyN_%}%@h|t1NeAE+AKv(upq0All_M*!KM%^OCNLy;hFB4~s^TwhF{S41gZ~qn15z zSf5P`zib-)y>eQbDQT|!2$offwHl(F1!pnI2t0uR6M(pbk&>Y|e%)@XbGFuf^>?YcTcPkPt7;`Zn9l#D50gHjj;sPlxaDakp!?w)qozp zy|bKlCn@$GrCm0~?rO=aYHHy4mvKyG00!h(Fk+{=uoxtJ4_^9cu>GTV#Vt^Kq_AG2 zfeA5GK#ED@+%q~AB|$!(x$m6gN-em$PYq2)YxMeA)?7R>Pq-v{bYq6WR78H=hnbrI zobouu0OI4jg$ZB-YPR;r+8?HN8EKx2Yu>H2u2HIJhl5*B%wRJtPRcuvO!pp{?VVot z5BwoJ4#Bhyr)TY5!#zVnAf))829gL=f;nLea^u?y0M0#qb;Xy#N4xEF)oksT4Yo@{ z#U)KF6C{c7;5d?BG6rMG;`~M1C(x7epS&47bYYUFE$c z-LplxV}eL2JP4_&;^Hw1@#MhcKCD~Z`*-cFyFYf_o2S=3rMX&~ExB~?YmX9*7^bFv z-Y+xccV>Vm0t;X%BLwQJti3H)Pv~i)sPLqfpNxS{W0E!)I0y1y$e*5t8k&kKxZ1L+ zaY08MO7!UD38X?uOnZCx_6O!P$3_D{rA=`zC0P4eY4=w1xL%>X_!SXQy1`BGs~j~} z`03>gff2BULd3oh^5Jukt*N!}HNKi_O&xunRNRj1aH>i)p=xRhV6saTfk9OqxUu5Q zSSo-CZX^!YwEqBVE_IuVj@c2XqmFr}q*CH*d!i}l-Mq*^Z1y<7C%95Ap04#nVQ&tO z*b(C?b&|FkOWZXDWSZ)<@W1h1b%+&^v{9ot9LUFh#FV@n9~9P*8l-eTdH(=xtl!uP zuN$7-NlJNb%A-e7Bg+#{!@-om2r;iPSGN@*fn@=8a&5~GQMQ#^L4Cek?iBg{5qYGU zTetE{>5zP+0>dgsduxd7eNNmKecMmGmbPz;Zx)_vco;Mh)0oQm5X8gCi3#Etxc~wV zd+FlU_J`bCZ*9_TU7n9UT{U$?CfQPw7?MV29wjt!KZ5RX(Tu^*%orX_PQ3pBivIu) zvslM;0BeuK2j&!Pl|^->R^X_(G^tNjEj0AZ>S93<48#yac#*l}pn|@DkTMt?X<}Zi z?5kNzPf_m_n{MeGJ~5}bGiFGS;E@>=q@0EhBQ1hR?TvF))9sDDE%ibg?W4Bdq66U6 z$Y7Znz+wu&nOn98Z&Ba!)QT>l(DiF!ZyEZ5vZAGuD(WQ>(5YEePKG$94=FMPSt+9j zivV-)lb#-z_)XJk#-GGk0B;Uy7xLqTeRJ5ZthR1Fzq&2Po+;pHs@KC5b?_`^r5SlH zVUq>X)D}~WFj7Wwoq0vm-j_&x3Z9*9#gRvqzUzdBKdS4RlHF#HsxnJeZN5=e?K$b? zlKDkPC2L7hI}U&lbd^ReWi8=&6pd-*YCLJr-{{V5Yn|VB;}Yl zGb~b$#|60Hk;Hpq)&Bqo&jJ4c{%oWJnzBDc!60z{qOsRt?D_>)wrtBCIZW|rEwH1E z{IHM|OgSimpmWrLIMX;vzt- zW?2+C$mDXNzmyD)`VczlN#M@++8d3yB+^q;v~-fn&pJv`qGsX~o&vTN&H?ZB^SY1W zZx`LXxRN~_NmdJL!nkZ3`g(CP?r2i=Nm4_#d?Yne5P?G}^f*;fk5i8Q$vP)~v)K0@ z+?skPgK*krrk0JEMhT2EV8<+MJfxmqnfdFPD!$O$T7l=HptbHBl}#w*Y5Yo8nOB$N zbK|>(9_70Xfu*{Sw6)R-s)XA1iaUJfUMW3xSv>1DS`c9dj1vtFTz z2_MW-Km9Cg+_o;Pbtk;DK1x1b6Hesa_9{w$h^1p|hLj~gg+nvKytx@&R26ATmXMNp z1>|rsjaIL|DyS}Y?a8%gz1iz28D~m|ugUQSeCx?T{6pB|+vGI;v-afuYTOcRdK-;~ z%_GpsQ%;upLRNZ&iCD(p#4H;n{KdGR2;g9iEZBNaMIY%Pr zF@;j&(MP!Nk?oBfP_=}IAN*OI3CmTbxjM(VcXrOAyj9;R?$s3ZjA|#EHc6JJ#A5ti z3bF#FPY_48lr1+pEz@eKt-oI>)8QI8p<3(3O1#eGa>PHycMHXaRF6@gUfQVoYhl|2 z?tRU9s#*h4Jt9IVQ5vhl%E{ysvhh|R<=sv|81?~E{{R#Jp`l4Pe&M~P*X z%L9~RFq!g_J8ACS(u-UjC60R?&JELdzFZm_3x$d~VUBf&k_31^1c*rF8Gtwei342U zy}IYttFG6h*q7bkUtef~*H0}~vZkt6Sy|=BCl1A=kb{HmjP@S7%Ac-#{+_X3*L1J2 zBs8Lmo|@TLJQT4-z^+X@J0l($8OC#h2qAE@42Rw*x{X&>`RP{7OZ^R=h3C3l;P7Cp zs#T2Tg$8S zSJx$`;}pLhBBQFPtfGxol%FT@*>b#xxNMbUoaE?0>O~YX%F^tiZ@W>$@X*(-TLqW| z0J5x%0b_)~;{J>D(%cPsIYZ^{p;TU43H}oOK}uy4Gs^PD(=2dji?;wuXUf?;TO%FD zwC`=rvTpSBbQ@~bYpX#Uw5({_nQ7SI1_m+-zy$vQH~3>KbIZ6b#=dzGs_J82PVL=P zIL?1DodMoc9F2XL0Ids_QtiK;3s z)drIhu&YR)z{8BMn1BX-JNxHSsdlyftu1^@e4>p&lf^|WteGI3uVI2a=NQq=y}x9F zIs<9F)Kbk53okzjVT|Vif|bb%F@nrb<*PPZ#>}X-y4|j}rgdK|G>+uNr@7|JKm@V= zUvhio_tNcDk>Sm>4U7|lx$>q(lau2EBxggI0x||Mt8)3%&8K>%TAi_fwon*jWvGPK znS`&90Z`s$?npT}^wM_j*fpDCrk*NUr@2$sBA6zQk&~GtAY&&dvGhIhojxr?9gE6S z<98`lFpb=LjbkQ#hi`1^eRYEUYlbhG>aEOYg;HQLAA4aE(* zwyG2NPmkn@oq_R3i;>|T0AuDr?lFQAxy)|n_Ey&KG*dNqPc0NQ%Sk5Os<}y5D4sD4 zax`%u1031#3l=rjl4k{GmlMvpW!J7hIb~eYVsH`G4yUS5QP-jL-RS~JPkZ@Fv=Qt#WKF72XdfCw0 zt7&X|zRx{PTu~(&*QoH~RPu#Jbx@}RxyKx$<0mIUZrjSD_qHL~v)`uORrA)CXQzck zF|#TvMyvpS9#vcp#DY6|=p-(9p~a$L5u5Ih^x{i(C9?6l=I~nID2m^1fw-%>nB5qK z^*_V&9RC0_9QtQN_r+aJUBV`j-BOxWbYmmMA1J^%;4m;S$J4kN?ZoPC^}S7Hwn4V3 zDCp`m*Ai$m}A{bU=I3DxD~Fxq%bPf z#;z7P>F_y>`?2rpag+1)?WbsIZT4!};g{lBLd#Ocqm8&JDaXt*d-nwL!R?=YCe>8d z(p?lBN%OLXyqXAnIpK(4Z0Skf;Nz<(Q{^Ld@ey7 zDmgJEWRA<*I2q4v^W36SY@xjPa4NG*@KTiw9k3mT5DOAUPFRu#ISdn_bQ0ZUqcm%} zWGs2|iWg@bNM+Au0Aw>@6Y{{&df$t&+$&(KxU``hLdviBxcX-p!1f)#FP^9iG^n2F z)O)HGm|AG4xYi%xM&utM!j4?I0zU%!=ZH^VQ={~En~ZT&)Y1GbFAGGo_;ka9sd5LL z`Iz!>Gm(;Te5<5eEv~lrUhPv8!wi!HfgffdU?>gTpQ$DO!+#wL zE@W0A(+mrKM4##gbsby<6fMp7rsKL*(3_+ZQqsH29IrBu6E3UVA53-_z{hVgs~aPGXUylLf{*0^gdB_#M|hy`dH+)2a^i^Z!SOtu>+ULWFMA{^t$5? z+qKo&DCm({=a9=QmL;Mi#f?Ga3Xr59OcDre`e|P6Q#AF{#o|bh&P7LI_($S6T%Tfn zv)}8kaE!J`m7&iYS`;bnPSv#+2$-~!N{bw^kHH$`AE?i4Yi~@R*-?7DTW_)$X)dv= z7XXnMSII4pV4U;<^;ksdLyket9Y$0F4ttN7*Ouy83^i`Ftr>7kAa>-+7~qVI_aC6o z<*kiq0V{S>WfhsOyKeQft12RMZ>{m@>O4*XWp55LK14ZH0D6*gJL;OBJ}ZC#!x8I` zeOsG$Yu&n%nW^P?;=e33lB>pCG^-$yA^`VBcR}VDJaRn=)m2=gS*EK<#4$Y0gvnyP z^Njwwa}_+;1r^zj?-k;K9zXJmXm~`;gDVP%ysP!WZ__#~C~509W#z>#Cz+?ui;fl3ul87+uvH{U~mRA>!%J< z>np`7AHG2L)_6utfsbDL!zqtL`ki1HsmT4cYS-L&k$c ztDNMq?b}wTE8saCE-*ft+6yS+Tef?4)t%A)k43*K<*2_@Nl9#mo$5@HRKOpKcO}C& zDAydk#c`32uIOGQ%_kC9$$xv#F7{JE*HP& zk9~fyeXcqObLvf!3#_#CGOpL6s*<9hk9EeU2*Fl46lH zDV{nGD8Zf7k;#W9!2CI47#{jVY>pO^(AQTgv9vt(*14oqQ}}tfxv-Q5;|@ z2=MJAhU|wVaVOcZ6noJCVHY7-=^aHh4HZ06G|$Ocp)9d33x*2BcF7+h^Y5*(*43G0 zh6xXcAXnnd&BZ&CSmz7bSHEyST?mT4b8n91jWpEB6VpJi=-tjq=5XF(2_4QcfIDbi z=XulE?UP$tvKcOOA0&}45{r+*%zZn1U}ySk2ESJxk`p7%DHAQ!s=e)Xyw=?(TKk_E z12k0d#^KY+M~5^%g+SVYixz<#!1kJjEU{oEK&%xGV_)asL1fFkdU( zBd)pBKN@uJPJ=4*l_cjm8SFnU`bMmtM}Lp3r)X)XQZw-l6iTDfmGXHIKpb)hn3JCR z`K)uy`Ao#}wz%YhfUFvRr|v5)8`Gxjz9e#Sc@?fQ{{RWoz5ypVBzgmk1DuUb+x=MF zdxE0fW~1I)g0ACslfb1&=9J4UxH(aPqW~^T5L9>c13Hz`f3yDW--%A;V07s!rom=-*=b+y7c#TLuZ1U;wq|XsAsy;iEskP6tMvt|a?$tFrW~Mupl9_JT z`RJpTIw+1{IUV zX&t*p^vdWr9IU8{t-FGk8jXh}dABOivsqsXkqJ z??rjI*2yO4nwH;wg=)-6M*M_`;UtNHId$U@ZxMhj*dPqyaJome!T$jGm|E9cO0;gD zY2KXDThvv}x!K}iv7n`uPG7>{{Nx~TB52$kk;Q{!*9e>Etd{-C7V%HDEymST1oF>K zd7!5?QmPosGV&#SAYK!W>|ckd2SWOJW4KLpp`m)3OPw7w6wy&ak%?uQCXdBwk1Udk zcsUXrzZloHIOr{(Y||yK*lFovxy>vRP}NivSiDJQs%ZHXkFt>*2)w&?Zo?pPcehI* zEeS#fG}_l;w^Q!#gR><(FH+J5_)B#haK%pERFQ{eOynGp26+1UhOQo(Z0iq9?-jf* zQ`}<|(ZXVunP8ST7=A>Yb3NUTJ$dA09^TpP(e0}@jX`0D;;S&#FAh+WNaj?iZsU*P z3z7)$+a{&zR@=G?drtk^cZ<3;4cak0R8k|gbtLm5)gX+Jq<$9U*zOOfs=b;p)^7Yq zIZHDaI)@9Q;kxbntyL^rdPuCItz}fbNgFgu>ImV$6<2Hr8EmcwGwGriu8nN%*0i;E zKByF`rO1Wo-j*dSjmYIsEP?1oMh0`Jn`3Y6`Z_u-y=jU&d=1WMyeUL#NF$tqNF9eI zEL8shIOX%w_WY%#f&ouxhvVXu%z4dSb%+HX-)R#W0wXz3XvRsnL&=LF%BLFNY|h$IgB zraJGrKjk-k-D>T&+8}KPI4wq$1gRAWaThl@X?e*k!LUdLv64rAgj2!n`#>#sfA)dF z;rDhGJ+*Gm_b96@b`d8hiVAd(bgA02O&TQi9D5y6}_vp_dL_hdZMC&3rsT8M^E8WjKIhE zhk<0`rDVh5Sxy@R9Eld~!odYJb6cvaCP`_aXP!Y4)6%;YUIZ_57+{E_3xY?dZ#Oo1 z@7x1FnOmS{-d3xHhj5#8_PB3|X__NbM^RTCEKH;YLLy_t1Lsnq7d~Pcv){@ct-n?^ zYu#m@r!@W{dwfjMY0MI#WpF0A)(6BFH?UjsO5ZA2)Dsr!j3% z36|T+B_dVas4A(ghUk#RPy)=JDT)9J_E(Q1JV@>9mmQC()myi%kGA5n&2_rR1T&XO z+LlCDb^viEM&;;p$am!9woi4LESsv1*PHFa*C=r8Bbo?mCRnqO?;}hG4-6>q@IhSi z!NWb8fvuKks-BL^QscrZ)b^<3XxssR-RW#2LSl}=Q zM+yML;4t8z9^rw{0q#IhBxcR=$|_aD?AuMorc+FtriP#vo;rx?rgkz$q={ZM$~o=$ zMtft_j04+BdU_jeM5>jUoYYg#Q#DX&Dymr+Mi|Omp<&+)$~h5%f(E8VdmP?TViV5nBX z0YN$c09y-!pt;gW`263xOW4qH${%gF?AmIo8k>^sr@Yamw9v8$VyK;5$sdM;F~-aR z!5|hYa6Ow}MP=LKhL)k9;0LC?o zQ5=F;$~b@s*8|KHzl)Aq(003wNT3a2a-%CqFYLy_TGDr|pluku? zo+X)b04&%6yOtvZCt4_=u-dK0)lE*5mf}{CDnw}g!mOSdOyQK{k97yO4=kB>{lRLd zt%8zUx-<^*nJA%|#YD3rhs2md?7UF6bAY)Ygy8!nwl<@MZnM+8ah8!yVR%g}tHnG| zEM(=lx#nG1j@VO@auDYbWK0w|L1?cR8ztU~j-K6G#^qJOg!92p#j%Mp!HCb7Dl$8F z^LF2U>4mR#SAG6$bT3}aWK~*6jp{>WGGU!E#1n>fa9AciMrZx&MGY6k?T-p7vZ6(% z2_P>L$($*2m{AxUfFFpjJdXOx8|LFm(`u}EWmtmE6x6a4Cz*IU_-;JFH;6HT#46-> z8qVhC=@_fZ8A(fEux|=`Z9-8&_mv#7KZz0WjXMmovSYdt*smjw!^?~V6&q?A3Tdue zK(j$mWVgX1NKDjED!>XBNeD)!*2J2BtMLcs=Z0gID0oqee%Np?Jq%$Ib zc=v3$$8dc+=S|j)?L$u;HL`-t?L?^2Nd#&ZDI1CqLa5`-N_km)tH71?CrgdOGv&j7 zPv3M?F~=?Z)pfc$S#pN)_r$h&RNGx{5r!=y5TpUi9h;60Sa&?J?WHa0(~2#}QuS1| z0-mC=7mO8W!dT=~$#!OLF#^D-IX;81IU}Pbx!mo6s*>UHmfNL4WOpQ}5hhGdGoC&10*V64fl{5lMWbw?3jtFH?yp@XuB=H_@#~#0)y$+YgqaV|D2=!PU4few0 zi(Lg(rr>QYWUKht%#SA)ALUYUC{rNdk2lxnj@TJ)!F#&AR%>@UNFiY~RPETKfB`|@ zi6nvC5`DAjp0lO2Z5`PKEnW7Vo@SVtK|&YBNm)Q4kEzaidx4RRcAI+Ww@)jqQto;P zCxVd1foW-6Lh?96hf;g@KHa^KZFM5?Smz#6EoXEB`CPQI$xG9FeX8MAQ3XxNN#O-@ z0!#cbODWDkXPe3~-Lu;S6{;Fa>or|8G?Mc&IfgoNSTw7gWOEtDS3ZNWImdl~$mYD1&_Gx}yj}dJDH|)#cr_tzAykaihmo;o>HScX(B~0fCMv zN1-77d)gbTtWnLqq3Qm~4%D_=V^r5yiO(qcxIlv*L&=qLLCEl&U^kmp@AlryW~RDs zd%bN^#}zD7Q>!rWkOprKNzW$YQ;|@O*kG|IJ%Metq@moEdywrpE<1u6)vBkhER5B0 zI=od>ld_g15UA@S4Xln0O|UNf`)hA)o2BNW8LFwMk~%7Q5n5QPDyCp~_8E2j1dtDGkPbAdWpi8TQzMVf zLo0<>VSS*e=N5ZEUhZ{O@hq=G1HALp$U)-lCth%<%J_}kC?nUlt`3=W4)?ISfn>YY z?m@cuRo>%MUAQh&+u!0Of(mdPBe4Zj#CVs9Kyd5oH0QLsj}^4{KMMglEHQ31U@oQD#Em;A0cUSst906V8MI#^&c~$ zZTD?U2a24&3qlrYgF*;UIkR`;jv$Pw@}A=aYdmDUnkqkwDVm3JS}qjO$9JHXUOddC zN5)uvL0LV$bNGkn>!DXlss!;Zu*XqZ3e0(b4FdRNo-VRwLk}p=9!JfOo`6kNbGXYq z^86^CNw^*^%CovDRW6Lbi1A#HTw^03=$r0ICAHGh@=8kOl}wSWejrZAxhKtsP?^c> zLBSZ)fOC*gYKuj6r=nGsYG`TVN!lYEH6_$3LEK~xIV+rF8D7Nq8Y5)8-RY_g1JYDi z$2@HDD#Y?gPynSz6(by-KQ8`-bhA^oooA|Nthadb^5%rdBVySYzyzuDAAAg-&>s!! zw>M3ja((@ntsbN;ga7K#W>Z21u29;mb1dLJkHC9zn5#gQrN~G8IR4p2$~7EgRdWn}YeZ zs7S|f%j>xrpFo;kcY)up8*gmfUI2um?5#H$8w1+JF&Xxtm3rb`ayEFP_CY86^a zW`?BlR#y`7WKwXYNc1DVF`ZRiF1T(g>RtP_t~EA`#g3vIO;oiv28N!ljZbQNocRto z5U$zm6-dYo6KXb%-iH0TH=Ty&wAFyY|?mUSzvcUlQ7R4Y;8_*Ju|WFHLF(&52HnPYm4g71c2Ah6^^9a;O=qdj=(Ev}1p z?7h)Xc)c)6I{JE>3P%(wM2@^?Y_a6*QHks`-1l8{Oc%@KQPNtO>pl&l&AO>xIT-_S zJ{g3^zz}oX5^>m{eI31SE9JVV*|!x-)JXKPuOEdNseTMYV<3WkJ03VB;A1*)J0r(# z63$3mgZ6x``&V^B`CVjKI!|Y7cY|GBQt`_ysT|;x;BiqnzT>>lX1Bof)@qBTw%oBa*CPRuSS*4=;m81oA-fhlvJWJtca;0fVs$rgnk$r6 z%WTa9R8&zzPb9UJijqvQ&rKrmcMKR7UM=0YoD+-EuV~-;nbLT6X7;*KUTCf~)D`y{ zAx6~l!y=-}s#)3BA@E35LE9rsZmc+YhI`leP3Y~Te^jxzdgu0KyX|`{JKuUG9c{KW zsg~VIL2+Xg%nGgyag}mI4?a$NAIZ+a*M6H@=_$_0+569V)>hP|0@6oo6sb$W*;$O0 z0U7b!`nwRof#%7h*QR>|Y4u}gZTPuCWTuX;qOvQ1#AvN)?ppa`q^&hEM?8X+WF9yXBea-*EMSH7l%B^rntI!??{!h{ z+jZJ_D5@s$1Qp;%EwZ2|ha_mM3nmZ{!HTNncNxZtOV*gJ_r1w1|xIckZvn*yAq;pb=goObzN*=@v zr?Jv@*Xmy96*TZob7|@=*B3t&M<~@m10x-{s^DM@5X0Ay)3ug@%We4DOI^7ilxnpr z#PaZw00)p^BwFO6738arvGn0|&Z& zWr_-`j5hj}<0Di~k{(=TW?8tTu`WSQNAV1@p5w7sCuJHkTx%^7!BH(7lv2l!G6=F% zatOd@0!%O<734|5>~>yzrij&1Rud#~Oo0S)liYB~ zQ_WBFI*cg6I;=IG3{5m}d?~6 zj_`wZP||K2ow1o`c;c!?;$Dt*nZ72S(2&F)D#IATY8o41X z5PuL;eGiZ7}cVsLK*oG-~>_*MlcU!gO2Dsq>!=};~4Z!V?ze#rn-y$U7n({ z)itByg-yN5sx;2gR7?~&P^UO>-dun)l5j9dfk$i`f{L1;8dzqnGBcOs*ykr1^*@BL zQ=d4&z&Zz8y5*>NAgPWx;HOC>imEq}%fllvE_>j+mu@E@c~l<9I`+?Ug6lHZL3frp z3{$*-PL9)Ic!eqgg#p<>_BiZ4L2lPe&t&#(aJ9E?*{`)%5FVl$BDBj4B-09R3dP*J zDyb4Tlwl4tl_X(G=%w?g*V}w_GTAn|)h#?eC0SZ<3`(xYD9Q^rmO;t0f(iG|uIV@K z&Dood?QN#pbd_&PkUzv$J51tOoUusDaw-9h_~3v}0LK!#SGs+r_oR0j9?erRq^zl$ zWNM08WSfhx2x+2hcxnr>cW^s84>NMdsDr_2+np!mIR5|(3$-WkH|kY&1ue|ot`l6R zsr#~?Q0X-^7<{-SGe)X-#->cU3=49|!37CxzS*Id|GQnfiWil(m9db5WLAi%s5~%#z-3B>GdP2y0S{v9g7ME z&ufjRr4Y`uBqcXIHFC)~0ANzLHe!SEC@RFM?Zh0AJMFMvDu1-^X`Hd9;L|6CQj$r{ z!6dACGH@-G@~bHa@psYs-Q4>tq*OO*x(K4DebOPUS*DCf3@uNF4ak8Y41**9-eOm{ z9Dr|20^W8RxLegcSZNi5DS5dws4K$(-c0jipawZm3BrOy7V$tEa8Os(*Ho~AmL;c% zQcFz}Rhov5HhI}fa4Qfb24C}Nrzm)rOZ}BMg@To)YC4vJP!qy3C_=I!X3v$11r9UF z6P#cu1%U3VtF2DdnQc~z8KtJJT69Rsnkbqx;rNm)vjFPMV*nOX#D;O~HE5n*8@&3r z<$cvi2p3AX-4)Q!z3W8;Hzu_0N;5q~Nh=6vujHzZ;Q(nu6Byz>31T@8N?NFsby#j6 zd~k-gf`0?V#a;wcNX)TICnBy?FBUQ%K<$^Y3Lqn?!%hQ*Bbg>a|eYf>LZFA z)CzT{%gfE8Vp<~LWdoHQus3CHOI_~gxOSCgHsH6lfgZTlRmmiSkp3Q$Naci|acI%{*)hV8l^2|Il#Ts7W zGRg@7k9;zQH7i=|SNQEsL3OLLM^KQ;%UYknsgj+1NgZSa2=dG^f!v&)*=W<<<=xgw z&B0){m@BPS&{Nh$RY8Z6L?|bkyOC461~|;?#GvQ?S#puu~m4d5Av8Ec~(?((a9}E(t_+72pXQ2vNy?mMSwl#MzbFwGa^RFD9`7E|RITcCJ|xuWXt*1jI8f=~@7$ohpvPZU=v zg%qM{iDRZ(s#TZ7Zg@fQ3kqda@$N`DDgpFu9NZi0biJC-GNm01k0g}ttIB0Yhz9VK ze-M^dR`VBSK&SCz8ce%ZTdU=&G?iwaOIt6-Lpx0qDyVc&N+WtmBQ40`f@Bgv3VyF~ z+itXt4%;-G<$wg8R`u0>9bHu|x`adU(M2t6DUSCR#iT3B&f+aVUUpY?eE88p= zSytg{rh<~Pq{kVhs;`i9kb$Q7|AC!S1AxN-bYZzV~NJitA!j2xUG!ER#;M z%FeDEl5p?ET$N*-x?ywQLUwNc>3x0TYt4(P7K(bB$Aa4Qk6$3B5{VI>R{#JdV5|mN zkl=;xFc>#wC7IrWz5!P?<>7eYo`TsFLIvZ1t1d?(0>^?A9>kHA8;qKmf2QI=_=GGW z*=m`5>Bjx7uv?RA?psZkT4CKB$4Z^>3VhcgSpx( zE%)BIRov+XFrI-;m7aC%r3sy-LbxoUgAUj|#ycNv&v~`lBKYT!*Mx>4RXC2H#fb^y zKLX0AJjw|j%XTDy7{nLt<#DKzrUgqSML!sA)SQ*YTPZBF6CuwM7;$exPE?!&qi>4I z8+II`bX%zRRoZ=?Zx$M1Jx@?=_4Q36NmFV|VnFdDHYPqfCRrbwCuNNC$r&J)8h3Bm zp*Iztu7ankHvnRhja@TS(W#d#8=ACH__A@tgR*cw7id3Pqqx!s|vq41d1&rdN~rDZ3wqL|-1*E+fzyx)DBF%hh=IU%E!Cdwo%OO?Ryk%Dp^Z%Vd(`y>7HeXONe zpjUUd%TlQkDnkhsNKg+C#mgL21H_T4-fov{Nl|ENx@&Ke+juN$Cu^9U>k6nq?21S8 z@*zP7w_ttuMXo!y$W8Y`Vcy-KE57mei|Fl5k_*kJeOqWIYD#*Ag6(gWnIoJRkDHY( zhYG`z1LOt9a`GeHR(xWj^j-<2?>Il zp~Mc%Lf_hrz(?eRau1^2R{yK=s$`58B6|$<=L*yQ_92QGMej7sk|5NhD<| zrHdcNi?bA$DionAd!KMaen?$*cIdG9rt`Nhbc++1-KM3H0AcDfKpN6sk8q`1tjrWbLC$lLuPI{jm3gwNgU7$O*IVL^B$bsw!YLr+WB&aURnqj% z9giPCG28P00J~eEn5q!Ur?+pI&Z6;9=eRiaAddO@Yhhm8l;99BGBr6?8|br$$kRWB zxh%bi{Qm&2zOyfd9GK)BYBI|ycwAy%c< zR(C4dC7Gp-N=9+TTn^*ssdNU0IvHN3GvhHH8Y1=tW4Sr)+w;(c4$tPm@9aIaVHPnC;Yla40DFGAh?TP3Zxn@-#o^%wPT(+106(DAdcTHJ zQDiDXz!=DG-TUhs4NYWMm?~*yWihdKD#UV8>JB}%RkRergGr99E_J4RwBgoA=OnH` z2PZwT>x>M4O>Vf)bgSF($t_DsZ;qv+g$s5J0`eexelM5&bTY1b>8oXE*t)uLJ;+iq ztYWN?S=!qx6j3K-<(}smIQ<5dly(Ld+kN?{X=(oej~@l9XObekh#Xl*W9!+Dh}doQ z*A8&fL_QoU%;DH^`40Z0*V{>wv#BJU0)727$79@8_KSS!uKE z3Y(lJdRQ&bY^kcLniVMvzTQTI8}+ zPAef*elpcYvoIu(3Kj&XVA$?YW9jV{>$xkgHYllPjUsA^z9LpY0CY^Mb^{)~zug~Q zFUfU+p(?os!m_Mh7z(6<&B=$)4T1UV0az;P7M*}(jZ}9d$hptY`^-=4s_6m1L%!Fw zl5h&%z5C?$#*N-?l~sE(-Ag@E)Fn5J$~k1mmIMa(&#$kxG3ku~t636H47a0p?SbFZ zwxgtyifNSRkE3_>_WuBmuWgZCkcU;;gEYLNK#{R*oF8p#PFWn-cl!ST$5;Ydm@4|C z9AjQW9e`Muktgt|B z9q<*v_4n5!#HTuPB#ouc^b4h=h|J0)0IDvD>^`S%OXL%5i!4#RbEsvQ3QDWnR$P$;HGc~ed@@w3;jzj`Dd>E;Z2bll1*ht!!j{OJ zs7+fXfnyC-S4xJd=yFaXl_}ViW&=2E5uY&!wu)P~6|-_AueRxG>S@Iv#?#e3JWs~k6lB038Pr!x5l$S;^E3T4}V-AQh)69*4m5Bsv404B(p`tMzX+TMn@~?#JK04 z_~N~f%eIEs+%CQ<+o?q|&-}8@SqyarJ%LtU0ls{(-2VPetjO9{_b}cUm9!L8HIU6G z#H7(701DPeUuFD65;Oe7wmrL@6unw$x}~+FuIeSeEy;A-LOOXXE)1qaO)D{o1&LI; zqlZ>=mL^5XKDvo#_~|03tB05_)p@AFGlEn0J=$z&?k!-D93T&9jmfemXzX?a#H2 z*{!8&dVWmtBt?LUi2hRioljtU9{sbCu3qbJ+4kYnIa1+nsHnKvr|t1P24Rywf=qnI z2sm8)hreLlDO%rKQ$bBnQOcHM8TiBD%yH;hPjw|uagTj_E$*&b8E8!ebqg1fPlWx! z&*77@WE`9m{{S6s@Q>nsR)SL=q?dNjszka-yLeR z-F2qHadn=3y=Je8T^2K2ZKh}PHdmHQ4#avAeX={~ZD&lneR+(_Rnz^nraGppX=1i5 zF?T08GDOSDKYj&B{X1*YGx+aDPT6B~O3ZvU--NC_+Py#Cd)=yz*RfAs6*wL=h1NKf zpG4;5FC*-^&YX6~Ol|N~$p-7cMGel|G!oBhlARtO4ViKzm&P5y&m;;?Fnu$t=X^xF zLen)q$k>$7N8v5PT5DA-eic~`BXo`_3y~)kNewN0 z?QMoN0azBng(>SlrDb@-UTRHttZ zrokC483b|fjOwbjNxtjEySAd9YO7tNv(0js#DRuFcuJDCB^;S~B7=ZNKppf;YHh9Q z*PX<+dK-l$6$Jv58r9CpM?#KA@ZpRGWm0?aKyi-$06lY?;n2d}^BW-Dp36bpm`G4U6Jdp{Xe@> zQZt4%HqzB=&S1{X1}Ydk24To{T=Df7Cy}8N+tAvn78!*jd^mC%;?zS33;jI=Zs z8{X})P*Y8BrZL)uEmag8kSS_;RB~_@Hsq`UF3ZS+kzvcW_KnkNL2&AwQQH?rqi?+F z?>AZPoY{dw9-cWk_ws-^pHw;b9LG!54yfJiliH{1J?dM0Y>4!e++7rpE(ry)$_T+3 zz{XBAk8t=Ziopo4f##F3@Z6HbpG^Dy+0!J0tOIvf%LzgUjFP%a=eFolO0CCp>OR?c z;)+JJQH#)as)HxMS(FwsHUh7SkOn69Gu zDoRHoZ#OPsnOTT#B=*VSm?|x_f*4q@8eZ)nU&Q#&m=ZEUILFgN?c0*R$9#hKV7pCd ztBN8;T@>w4Fd4xrRe>1?&>sE$w8pTvxhkKfE&u~duD72{H(tY%;azpKi)Fe-tKjA=2E(zjE!usKL&ijIn!$nOkb&W+LxO#~paDqB_8CF$a!U^*XW49cP`#0>* zwqIQ~q)~&rp8H5#@}|5Gi9$P`T#4}s9@!@y{{Tm6KGGcn>OCo;>ZjTAlvhk`_+HlQNbGS2jUc8n#*%g`FwIc(6mqEHCs-r6QeV$;{|{@PT=++AK$$OxcQ1A z-&JMLf34k%MFr~M@!PHRZ}2op;l)h^Y5@xjC>A)!7XtuyEJ;4V43Jk|YGabeX{nLu zY1w=@2ME+Rn=XA$0Bm3$*(7Q`s^56H0JT!OFAf0}vxM!CPrjs4^+$8;O~jVUC}L_m zT)b(bFBD9&ck>1+bH&Lcm^f@>&=DJwp#`BeTDldvF6%bo-7`mNqi97!C1{d0nk5+} z6;zU{p^rD>m>35*8k4uT^;M=SdOJ@}c3E|r3w&+xm2Sa|L4yV|1}t05%t&GUy|bjK z`i;|TwcB}NOJpAZ*3&tTZ)*mfgF>1p;=?P6PY^|HeiW4yF- zMzi>WL|inW2$6&1utm&;xQ-H>GZ^OsXy zw5^trCf>eV<*_Jql_4^qNw_bDvn;5NO8AX}z>J0i(>kSVZS^~n?HrVXMOevLSUYpc zJ=;0R$tT}VU=1{rDJO&o-776-s@YXbJX4T(v>GH99C9|n_m15m@ z40Nlutge#WDXObd7OEjig5 z%;bZdfW$6a1PwE8t;0!f+jQF>X;4v9Qo%+40F1mCBwypg?7BXNEMDqt4PRM#p|Hhdw={90LmZ^Evd1GMvl7`Xc(36A07t0=vbRsVe!WSn zuKSa9#|;$>0#Q!!tIZcVQZ@4SQl!3f+p?U6I0q%VJ$>5XwE+Aal`>P%LSk{mlgZ}t z;e9;AIRhZ~83bjD_qS}d4nq&cjAOo=MXkpv zVx0c~f^4GNdw$a^SlfM2RIQ$-tvp(Yq@`DJg*;pbMqeQ+c`q!2KpF*q+qVm~d?{F8%LOKXr# zFmlb|*#O80GOeFtPCNY0thkYnRY8HIe3sa0dgXC+xZ6zj zsA}VsK}yxs)L=w2o)qlJ!aM>!Fma%j+tv$4{{W@jl~&OW-bGnzZL7&3jpK=;mDG=R zkqi3Z5=IEr8ap=ZueN>RW7w7Tu~kG0O#zi+bIE`tavX=c`;sy~dTZXDCWhN&rH^q% zBv(pxuBM}`qa%$$i;JLeP!{q{8RQ7cvij#lD|H^}L^y&+WDsSKrrl?>80 zB8Ank8@!Iie+YeZw%OTRj;{4=dxer#p?bJHcaY*WhnVJA=d$BDKH9(H`1ZY?D@S~~@ny}((X5rH#*4McP_@dYeM1IvJM%&0#&YBo64xKd{6?^CyC$GpdF-}R4K zx35vH1eKR6b_-7&WJrM)6lNeR4-6>mN@D{WU$#_j+S`nMEZcQ8RGY5f@k+5&!3`}H zO+vJia%YaC#b)r7M3N6KI36RB(tYY$D68tLOt%ZDt?*}_<5gSYC2O#8Bdkn{Q5n>j z%V34$%N&mt`S$_YmnseKSrXLN)5x*>Y!F70h7qVm4Lom$R1z+Dv;4*HWu>fO_F%`6%f2lQ#@64S331A@kUl&2^$`0>;kah zJxgFP$kz|Wv>LeDX3@%83-%mt_+3 zDnhpq2w{Wop831MW?PZA&Uh)ife zcj9?qCw0N~_Zb7zT@MKHtwx(l>m~2pIX8k2`BXz%al%jPk4N`j;jW|Hn{v9{QkJER zC8DjKGNd}cIHpn=*|>r{Mkgzh`0c8O<6TeFOO(xdvPoTdYG&~zxjjIl9HcCwKM{+_ zP;p-pHjD$y9J9+^JZ~{9UKJ$ES4hBrDUmbZ7-60`_3U(+)k_@vvu#0X6f|>+N~Edb za+j2RLbqjbJ2xg?<(J$Oj>p@0Pw^C5q9T{deGU@jj5rq#RSOiCUBh6myBjc~q^+u1 zW}21=_|2AXOkSn3>I*L=G7>o+>!n#*>$PV~Mb4Apib*M+*tOBr!%;Re2r$1T;@rEjB$N2LFLy1qS-m&yOHyr% z2utle4(jw#M)UGvfbfS>K?;^RJ zMFsiyjl*o*EEiwDWw<#qhP@2(46{? z{{THU!BY$pHOl84w2;sPPaznbNWAgO0|Y7Mf-q06kai^PR|7#L;hH(4e&FN}O#VYw z9QPR`teTs{r-Gh2AV#W^V4S%T$#|aU_Q?lW-qK_MD;aH+pK;k%K_jFpv_TZg%&`e6 zE-U%tF6VT zVU`*S8)z}d&4dr%%o#yLBNNzX1bSePT`t;gGRe7Nu7a8sT6&~*s5H?l=OaAH1@qXP ze_d>IXm0G54VqYN{h3?7r>VSLs#e}<=I|OCSQQ#Vz1(qM!GK48CnWtfX3^cH*|xfB zN~%bFJ9az>J}W%Sdyp`5k77F?bKDebuHxKVOLA7(lH)4bYHEm$o+4MxgMdj@&N4He z!@jpw(3ykR?%U!TX(5qXnw~Xr85rO)l6GKDefxbi&YiD&yvCc^J)|=Ol-apzY1Zu= z_cJ8$PXa{L5xNOxQgRj5P@{p26;h3i;CpFWyJGAswX#a83w>=hRI$6q6$H;v@%gjL zSlMv6!C%CHgOCo3ZR;d7v=Tim^^(WnWHo%0>D=)?LioV%obo;Y04(Ts^}gMvx1~9{ z#u}mHWR@K94;tstwt0D%y8B?`7|_N`TpGhvslXBDwDS`SjL6c&wvCm`e0YTbSHER9SntRPjo_>;*PBq+u_ZcCp)TPkte+-F!{ zjf-&G7M|+$Pgev8DW!;~20}6zyLzxE%nN+=)MlaB-WGEh94dS_n=GTYrbS&*OHl3|AaMBoaZuIQjgw3YwOplBJB4g?ti3 zo+9^C>F9k9b*MeA7)$q6)76i)H&yzr(|aFIw}sw6gty2io+@~vr;eb;fgmiA1s+ud z_s&@7w_&PG&RF?z-#O26HL|jKs@`s? zB;kf9KAFhJ<*Q?&HTIfojYZM_BV3+S%%P zB79i!891I21yS1^n3f;~@V!PsIT~w49ZZwgRm6gNa`7z^tBPn#ki)P8#KvRvJ^SR~ zWPR4Y>$qy7v|6VWuv7A+rh-X9X%U+)?S> zEB^otwsJ?e1L$+yj^yZ%l;KfAsb030j+SZ&0?NGJDVzet7G>qcgXzR$(+ALZ&ZJRW zsd-I$zE;grJ}ILlMq4aB8JLiJ`LGACA75=wtE{!!>8WlMjV!XHrWq&CE=UPe;beiq zf&T9y?sW^tj4 zs-^AGM#`$vk~j^Jhl-Qjl|8b53v{{{V{v2kD|# z+l+M=I!ZGt)YK64jSN<>*p!y#9X1h){`RvxN;zN1w< zlF2l@a4nm3A$`SxZ$%EjKBd(iuP!A`_Ji0U$RLJL#V zXBxC6WD9@8QtgifcN%Fbpn2h0RLK&s1;%{=Adl#D!?t=;)Q#S;R9H4u-lmdf;wwHC z(wKcr%mM-VonPG>`#N4WR`9p(UClynwG?fbs9-{|EQ|;e85m@R8DLdN$n1M(SoK=y zG^5V!`gcag7n)X0r((xopp9y6l=i!YMKU~;6xBb#3hUWi0gT{NfD(n^y_0D&SD@kY+5sG&|7%VU!jT%C1Us4gdc zA$Ewf-O3TN{{ZlSb;oq<-MzK;jVj-_6%u$?%k=F{;W=L_OBxmJ$c|0T0X(n(J@seq zeZ#vq7SpJzs+wfFTnvbue(5%Rfe9bxWh2&3o;A_9^jndX;FBF=RA>31N^1B9ke^8y{`2T+OD!Jl{HF}aF$mfa^k7Sl9A#Z zgvWD%$rNMLRt2)XXGMzKAxe6=SzV@OKu2+$ug#a&Bw!C=qy@SQJv7plR;->T6H^%k zfIE=PKx`4+kAF}xl6`ds9oD6|#Hdxb-6fE?cE$r=Dt>Sd6EHUJ+Ip?i8GJAbk60wlY0NnL1z5+K#GK zR<7O@v@|pkq^~qgwG$R+AyE`Ek7myz20LKqTn$Wfp514+58=UYw;mBk$BN)c&KI(eQZtWj2I^J1rrRB>ao+CM&C1t?d|Itm>5Xm( z!t!2945mgzAZHmY0a3_m7pnld$+IlfwAFQY0Bz#zC_^<0_&>r#Q->)evr&{{LE>K} z2*#q*?pvbM+U`p_*Va(AswxYBiB_emDU?MMG;FS7h@KuRw;nu#o@D1;fh8I$$iH_9 z+iF~Fds>dZ>22XjY_7OROK&_CxydX`!eT=)K%NuvMm|vCzlvmD5xSLhq@Z{bF)cK* zv(sIw4Zy;%OZ+#RDiN8CLZMHQL#a5yLg5#w@Af-A?&%#B5Nl#oRotm*VJ$bs)k{v$ zCmAIF05eYy8gLc7k)IC-1q%?Mh2o&4>Mi!JIjPzyF15AP>VgUCS~Z$nw1`wI$Weh& z{{S`JK+bbLg8Gg`+xJst>W<&Itks*2hLYKDr@WXc3rS7`s>c{WNWv;g%|9s}R@meszs}Ze~_Wj$sHl>oj8c7m5suORd zf~rmqC}W5$$C?I6`8;YFICC-ORJK@{BMM#<;lEuZsI1%8iSB}U6=tcdqXIKi8^EFG zicW2u$h?6pKv@d%J+$4jZPfRZE%{Lz$!-w{W+%m%&y$k;K<3KD8<5I|E$Q5p9hbLv zm3_LVd!#h9e|$$xOH|IB85I${R!H&Wh#v`6R1B)CXDUFxwgtZJWV1mU#8^8Je1w4~jAgAPjNh zf&f7g`HbIQ{@94fX5!^N7lN6w`#!GNN!?4$|<3)h0R24e+Zg4 z3gnZXK#xr{%t$sV5Qq*bDs26!eCi!q*{iGWG@EwJW|=Fgi!9Z0hA{<-Sx`p4Qp(D? zKBJI1A^wKRV%zi$ZKsa1kt?nr3{=Wz6(=5PnpI|hPDJP5vBsJ$bQD)ju}N>V+-P8R zr4k}hJ4U>*k^s*TGm-WA=@#R#>tViBycY}IJaW?`%8ffL2ZbCI!Z|yBB=O<#uWAdc5wLb>BsAzD8q1BE7C;? z@Y6=&N_rU>p1=}DJxBu_v!6lhq&u|*x<;DYM=jnWg(WXVa52oSo<+fIf(Zoh{3i$B zRfgf}m44B`!)mYHb$7O&I*QP;OBgW5gOFJxQOQ|{bpcQj#N_1YXVi!oT=K1vhnfnv z-TS`vd+Wt+z}tIrK}TU)nJ1`e8cKQUS}Iv(?2IE00~JsMF~&!B!liWbj%jxtIZ9Nx z)mPHB0Fyv$za-)+fXpWIWk~>zKg1r3oVU5aG3&a4W}@l@_qr?X(w^&hs+Oi&bd8NX z(V`*+iPf^hyqrP7^JB0C7d?#~U1fdFD~;OPmn!%bw=3s*VNl$tbQ6FLia#pipQS2E@yg^ zOC#U{pTZ%~608PE0Ob1~-+yN=vD(VXY?eyb;uY>-Hy|WFQpyV-D2V5i0#%sgw=Hv` zZC2vCE&}LwLoc?9g|=2x!FQ{Qt~U)Nm8LHV(4z_D9F>>{3dix0oMZu|yA_vlZTfq( zmnDj7I+~skG<1epB`OJ#WLTpPIfg^xh9f!k{6v=Qt)9t2Ig)~&*CdpzDbgNtW@nI* zg0CMu_ilLL21x*8US43hTWrr+HKx%=P9SqoXTH=|MG}2O*rDS!iz-#qsTSi>>mKunsYa#}gYyuDnAM3}j(cN634E2qatD z=1^$l`k}VFx`DU$g@4@94byoEWIZ34y>Y zvVzF5_fi7B0q)#!jcME)g7hq24Fw!XU&SjWB%-2N-APjNl|dSE$RIK@c3$Hd(({si zRT=_^2-V7x?Y5|X3Oj|iYlRe&Oz_mw6h0UrWT2chgaz*0K=1fQ2-K>&?b|U*dyU$b zn$Tfs{3oMth=o*n$yZ{4aUT7MR^X&*KGkNPd8uv(s#h~lQB2dzMAq~MRa}zFS;58t zUohe3$iO2fte2|#8LR1A;wxZKOa?@!r)ZH_H<3XAsU?RX>^TAtAb9Fa7y#|7`@t-erL%63Ko z0hI*s0ZG-HCCM&NKq)FMRcIt>YD5)M_$wdb0y2TYQ6R}@00J|Np4o0|m8WmP1wB2| zf-8M2juu*{5UoW-s1+kg3mnJ?apZnY=m%^yj=1($yn=ynC{<-$?x|szT*Fa1cunKd zQ$Lwd7LG;-m@Y7Qq-&1Ay7w9fS8#@Fq%@V(_4IXAO~I+-uQa@nDuwaLjKhou3y#V| zDN;#de9vdHNi@~5%S{r*%fZ3&b~0m(s*$fE(SXiy-MxIE=xJrJ-qhoEm~GgvD{;-mP%T=6UC552vlcP5s6bJ)P!Hc2tP8) zY2~}oR&lN^NyZlNBmveY3NR%^oXB`#PdtD|Gm+hNzTciZLquSydU}Rvl&lg{<=KAcKxx z(;iEwPUM>FK+ejq{#zJu>jaA3rSqv$*v?~5T#v)V=WP2dEhpX=Dth_~xdgmK^GeZ4 z&x_$wM{f*sMIK&1h>j!M7$K;>);+?YS6eD2b)}{7;F2zLyCSzH;f9ENHc4_uMpdPHz2$wmRs2nvZZ;~jG}C+0AP_pP=$LFf^bOnQ<7rUXX+N(+!ePds_O1E)#6yCjtKck zir79WjzGj`9nX}ysPck4?l*fy6|!nO?%JB*E7b*6zM@hg$YF9h{`GQ(EYae%h~!dsW9UQi)`0 zcT#;}Wl@6Q`)4F!gAtM-ruL<$N=q%STTLzE84yfbog)&t82~xJ%L03XThw`ma-$iE z)Jl(p9E59etXoTKih9aQx`9aotaOynsrac25~`@{#Dp9MToIAz04G(9+hX}!@lo9@ zv85eC%CF+W@N3yw6_;z#toMti;1X1o zB_H8SG}t^QRuU^nph&|2cEd0umKd$Gb6oCKv(F{EgiO99&5Ci}JO#)HIAX;~1fInD zU=xMMa9pi+)upScsh+B8X=KGzPNc?IDUASMFa&xj!6OF;xM#I)cn)$8D;?!+CL3n! zj)LhG!o|9(mZBD(TE>n(GBPTFQh3=FWGm+Gj6mRg+AkMY>MyR7Z~GOxzK%*}hvDRj zS>{|b8J$%)qhJpz=e9nFR8`vTdRXjtDoJV~qnE{!vyv8)l(evnAOjA=!EkEVsgfn85crZ(QkDMzqx>tDDqB5<7daf4PLIU(5x7RjW0V_h`$$4M z!L)WR@mlJOH%zwOEEO=CiRvwsW(uh}N(lwxQONNuTbLn=x2G36UFr0X9CK|;RZVS0 zyT_!O*$vvc<`ig?4-sRDn26^&P)P*wE!^@aN4F(4*Y07(8jUCRw0!^o9XRWspbj0Z^=0F3dX_lP)^4`u;K!5BMz zu4&lofBIT|nav=9Y1?$u$3tYd$3t5+CC<%FNa-{TOHY9ZDsa9cjt>Mm)uEqdb)3RSmazRHpQ;vs`U4fl(sdqLF4LnlijG;wj?ik_QVO6s%{^ zWa%0Y5Y;*-HM{^)9}T-Jpzgg@vQ$(}Zneo-PA@(Ud=)Z*8&T2-;7&}-$aatw1Lkwv zwp{F6j*=?MUAt9LN(_{ue+?J-Wk5bv$t%qQW4T;~0DAJ*KT+H3uCj{jtrbAD$-;^j zm>Z$$@DE*pxD*?X$mRd(vqB8oPMtg3-n11Un%FBp@Maq8TI z0>>k`!{VBU40cO8OmMpjyKAdQ4ON;{iaMxFZzUKYvYZlt=a9~QK6&}*WP5dK?h*)K znr4Cqo{p)}9#Eht#z_s#5)Xe+Fm*#&I<3^*xow(DX5oe?C6!@{qU9nyW~0I^LvYHE zLNcXBNXYG`x{kTl?g*-?uF}!N1r146Elj-RjB;LQzh=O0%BLTPw{3U7p6SFppJ1dN zE5+qoPiM2-A@MIO1oY9x%$Qrnf@M*j*~#VY-vv&6yO<|!J&k5dN?TefQ!NcbcxwYP z4ob?snRyb&y852^Bnc@K;fZV^BganQ%*e5So zsqcGovFw%B?}@F6m7c1hI6|dKGV{PzP^1vJ?}h-KTRdk?D96}9ZaFlKjxFUvKm_0n`e#9Q-Q-+uG!K5bLT((YD(Z}sp<);w zBC7En{{RxOBo<;A@h#sH7qm z3ZrgR!6gN@B(I}0Ra7|exb-3+jPD$pGO!!n*GRtT%}0>ZJIEr)8$VhDITC6DtqGiWo1U zd3h8bVaR7Bo>P|RHEl!`(o@yTIDsk@$x*^t4Lo8n&U~r?n9SaQ$QphP zz{tWSl_Ux~HxixH;D?AEq>qQo2+INNx<=>Jt2EbYy}xawN$V*bFT~Ksu+o;}lh2Xy z19}1!6O-A!Fe;|$yDStk&AV?yaMUT5u7PP{5z1qiu#b<4;xuE5aU{9*$1HhjJ3Up) z!>4FG5leB3IBDsW_;Sp_!4eha-Ex`0$>L5x0O``cih{bjrukD>Un!)LT4{fVQ{t8R zvPSWqIKYtyBBT7=ZG<2c5LgG{Zr*G=s1<6Z4II=Fx@FP9qVz@&sA#hOD#)H;VZ<= zRHQJFI3O@3WX4o_h6Io?jn8h<{m9!!`}eF+P|TA!UmLixFxvvjRfK(y4+Q!QkZ#HlZY zBjOvykyMA66O~YM3xS_aVq}s$*gP#XC=w7DEOlEx?DaMED_Ku#s%ko#**GimDa}Mt zzYv6RCyG){eiwXWN8vE-?;QBl>xYn~`;qY_5SqBG5x4tT`iawS{K=%*k~s2k$mp|jh}Rdf*F5*W->r{biJ zsx>49Xy1-_5J@V|<%*sjgBD)aqq16drOvvXr4ytxNroS2w2kScG){ z025K49wv|`WBw@R$Ro2V9wZVl3lpcj#WRNdEd_zCpcD(eeamxF$5n2Qij``D!jjwV zu~IC24~VQBw>B@q2bZ=GWaC8E>u0o3eZhQ{Ws;&n3~1EE7MQTWFAx$2?!Iu%oZx|i zbiYZrw-uIZJ3YG5PhA=$J|%Rm8!Sx2i7I0Zkjhh$JeUtFcRoT)RNk-lYFl(N+pYGn zl>$VnqJ%6a{U0LaNxkXb2d zC#b2-4AQkb(=|z1yzMy!0cYbGBpzUf`4SHvz-F5#skbQ>n`z#st9!4;HALu*FnV|L zqO5a}NEu_B~!LETfzp`dtTh4qFU>URy@@HEhvCV2gFAj$&kFx zKtk-HayfeB=Z=+kEyWs|p5JTOrs|a?UF4Fsdb!V)mKAnK;&`JRsZkm1SOc6oH`)8B zsT>sd%Zjb7slbj4w24U|mJuVwaVOzkB$mheEHViM^)0txY}??YuHJQ3iX&;`p|eRP zEi+UTDKYq`n@)LhP_dvmLxI@mp{DSiNb`0-FtNUPhkv3e471%Ts_r#3hHBRWDXK(Z z!!Kv>+xUtLal*Lel6fvc%WHMg#dF&=meFfoF>_dEQ6eH!2#<(dsxa*oYa=%v#iRfc zkTh0`32xF*I?>b!C?%F=f}vZPULdma3_V#x{LUBGwx{lUy`Haa!D_6Us**dUM0Hh4 zfnHjwe-yi*KzykD7`9IwCJACr15e^|IpDnECujzMRPNT@PkG!?K-5B_qAH1}6UI0* z$lt;;ataud?}Np?IN%io>AuNH9VLocC}`?!?=(h^syXCXBvXbA(kT3DSgMCOP-7YH zz1FuRl+RyD_a4q$gq4*PuMBS*M+{K~CyerVh{cO4zoTP-z&JR=_$7bJdYJJ64Ff|lqLhd5C9Geu0{is zo?Vw{x9;Smnpz8uwmR7D*9dE>sbKK}Qq1EljyW+%gD?5F0F}df<5;%L_{v%9>S?Or zxKvchEVY!?MU5ORphBQA;ED$#Tah_s^7(k4Y;4^%Oemk;7O24tq|dq|q1-(jrJ%oE z-WV(KB8K`#iyKs@zb^S3dKeHI{gb_>L*lfSiI1XR?zZU`G%^$r>lJ zrn*zup|n@nW-SFFo{nUaIbrbBk`^~r46hIc14ZX`AbJd*kBI4iqZ^}l75fP+HchE% z4Q*sIH6zz86<38xH4F!cgwE=+N)+)78<8xgGF0ckm^QWTD^0G3A!4bnTg!@uhMp^= z$vkxReDK9#ZYASVPvKLXgWm&3Y>_2(E6Gx}>a?e;mE$u!OsdR(0dwg{Q^Y5N2Xo>A8Ic2KIPy+3wmI$H_59J$HWbSZ zCgU3w+Eo9qZ>qPN}ZMJ>XnIbxP7xKG3o>}28KGBAcE4oW#V zJb7Rq1!Y!3`jD@@`dJ-kjEKhjnJ`PIwf} zJeqD!%(4ei%^_Aj`3;uJ825CZHQv`zP?p-`6*PB=eimeRn1-fihzRA6k|_LMV7>hd z85?r0<8oQ;H56B4YpfNCNpz~JT4;q+60%d}Ws*VXlgd1+?1Q&=bsWcAMY)2Hp&q|9 zI{IJsgYqv~O$$Rkm&2zU^A)~8NHY0#|Eb6{qS!Dyt6OTMFK3}?nv$s7x zV##K;+%8l+9_sSb%^VO+*e-?CDQ5~9l&Hz#*kjvB`%3Rkva8zLyXfm7scJ@!vg=Uv zu~OBCK*-NK1(4ywVp3bqLiu@&k4~i1?Y^K=+bopZLZ9!r5~86VDC#~ni?@jy`LidP zGG8r>_Q*^XoiA2*Y;G#S9DGOoRvsGBmFRuHHRfyGp(v{EcNz&4P_Yq}Z!^Iu5@nT- zgsq$(G4ivL0H0G`6|-;3H&WWC+^tUx@K)O%PYR-*Sj)n!>KF+N@>ULckT`{G_m^~C zp=X2di$=_fYZqy*Xk#g5<7?9 z7W!w2poxofa*Bdg{1_}(3mTkdPZom0L%<+jGn@4I0-*$&ysAdevv#FE_oKC1YUwPs z)ve;(=|#3P1x!q_v`VNrn50QL0)UKwt`$A*x3yI4+r7Rkp5lHM80w*;_=PjjxIh8k+RkbLPJ!QENZkc^-%KrFs*DXp!$rdzF!3wXWR?NzZ? z%|@2{S~GG*?uDdm`0{v*ASB4#ywBSqbzs+0!MCiJEuU+o+*ZxUb)kil({Gs-FCpC# zWr3N9@dCRRja6_M2%Of>bk`iW|-d(zakG+qsCpMFOp zK~YN##msTC$IQDT6;s%Z703V`0KHkBhLLQwxVc+up-C$$YHlq%p;H{8kRDHtVH+6Y z#fM@>Nb1Y)QZ0KvhM}q|sh($gSzxM-MAX#aq->0chCl{OF+L$)AxLl-37f5|(g>=q zTejWsl=9Q68i?9SDI|_CvP?%11Z9Z)3m!-$HBQM-w#sf2Lzr}05jwJed4?5xUiK~`ZP%eQg_${>?v-_IYH zjM|&YF60xptRU_V4z)W>V8! zE$=C%m6QmYDHP!U01bz!z`^a1K^=~`+paPTwUTP8o#lFpmys~x7zOMz z+tBpi9_ddj6z+fEUAa@XR^(-9?e`d=;lehN*hMOa$7T!@zhRD9z#hGZtL^01J-@u| zHg<_^*6YJ8A0I6{JvBQkFNVG>U7`=3BgH&91?+uAv$Ho91zwM=qNs{UQYrH+J{l-_26>(%zt`L6>+7zhUL75W2QG8< z&mK}0SbBLK%WGCs?HQum`-<5jycJPG!Z~N)7_6#6%0D6tAtZ7oPIbQZV2=H0lp0?K zY0$wkR7R4caR8M$MpjNt!wjR}@Sgf)-FH|iXIov;uB6je6BJ7|GzOkhs!5Gx3V68# zus9@-DC}`d^~0?7TYg#%weWVjd&R{G6V#b1Y2%BzN0v2Z;>>fzuw}}&Mh|yP_CzQQ zr9m6!cg=FQ+Jo$8x2pD~=XhAGHmg0_f+_2KYgt93s3>zJY!Or|@;C?-k?wf@AI_NQ zq>>k^RQ?oSiO*r2j>G1AkKbRQ_PaLp-g}A9wyDSaFVIA%CK{dKlRc^y@k(Rio>9ld{DNg+cjsO^tmeQBsZV95Ao z9kcJFYqG4evJ_@jNn=h7S-k-D*2&f}2ng(5nDbJepDjgao!^r-K=;qSvPorR@N<<7 z%NWj1iqg&&$-Efh^!_ifBepdQkTPXB@;=1pUr5r7y078&$i_9UZeQol7_s@}jUEz7 zHntW4&Iw}Pzbz4YLd6t7V}T@=9=XPa2PzU*jCOBdbM(~e%Ym(Tn5F?el~e(ZUI0W6 z6nQ0#t22KwB?t7;ZL3EOLrl*i#-q#4y$8Sjngu9~@la1;jC{_SHnf7CnsP`$6^jx; z?nVYOdz}g4SUziB_?`_~qp$-5JbMxDMs=pXMUq8{0YE<&F8=^MLUP8a#~g}OF&x3j zJ@u7T(83xd!N?#SdL0M|+@hFXda+L#41ER;0VMp-Z+%WHD#RjG$zhiC>^^@@L7_ww ziDqC^2h<;2Xx)N1Cz0x#kdaH0Pv9sQ{{VaYjUOsCXl9N$j4~@>aKQS3oag=@wxI%L z|`k1JCoeqv5Je7<_!ZQ`vX%NH}- zixwk~(;kQ0_SOzkPvNP+&OJR(*IN}z;w557`a?RLApUN zNoVOr_xzwA4Anp>RgQ6t%va=lX?;dV?+_K1m;0epadYr|pkSSDjt7u2jyGkDdAKG( z{Qg?$4Vm^oywX%94^?KG%T{Laz77>HBy0{yk+_t>UgL>Aqra#H=swA*IbQH@h^vIo>=(>kKdxzABE~90mM)%nW3U#OBCxF z4DR5TJbX1=65n56&$hF*($!SY_kARCHO8olD5>C$-f7s30vF$xU@_eH?XJ|1?Dx{7 zxlyJ4>Nh0RNr4s4p;N@c1hH5Ie7p9;GyD4bYRcO7J+ro)(`@~}XRsHMLOmt2D9eH| z#L5%IKQA+SkIP@aZ3f31E*VPv}N+ex3gSEn`!-t11IhQ_Un2N5uaClty^6_5>(q zQcgYd`Hgv9U-1U3SnL5^u)0mt#~8p^R_)V0M23!g9W^7yVumJG(-W+N{#yez; zp4jcEvTa+8$qI_PR1wBhv~>u9#!qH{;kfPC`V*f|Q>l%2YG{iT%5o{(|Urrwkwf_W9)F*Ia_<$(^)_5-)H#&i($L4LEuDXHT$GesR-V0s7Ou%Pz@Du7NhM{o>n4b@IWl2Jw@1z)w! zn1@{U37OAx-_U11+GB}nCXCb4wKYSkgM@V@n;y>LOEK&L><7<8ktn2yO(j&ZNy|SD z*68KzI}yv2i-X(nzt7Vc8>WQoCF@E&+*rl@!p_T#ZE3;@ZrOLri!D*0qo$HS;?=Dr zH6zDI0CHuFC=Zoh>N}pqXBtz8&G7;%l#x?83|O!y1W0yxSZ#QNZ# z!~@-v_KY_6l!nL^hgjn^9YOsES*4wz7()(J5Vv zJZ~c`o)3o7Fjg`S!x+IDr)^(gzqDoYo)r|^ew0@@iA?uIeo4q?L?|1YX9F>YCphns zuBg1&uXbvQ?H8&Gg&R!^)5;!c<8cdu948V&svRo`s?a^+i zek)&Mh8Bu&q>LvHJ|-l{C$R17<<69PtM)nEI~F@dyL0vTY8ra#r&<)fc<@Hf5uQm& zcVtuBiDoz?sLn_Q+S&Ge`(j73ZPsmr)$O5AXQiVHPxm#&p?TwHG9&y#L(RE(j(bQH zs2#q29bbmGR{sF%gO1maUKKWQ#@Ki_@TJ6eZkctTYS_)%`>}4cR`i}qUx=!pnh2S} z;zu@IcPF+_e{AVt>u-?ACat$tM!r@U=c96AwQY;HMyw>x}y6 zNtce8Z^}maVL+0q@pg43S&wXk%LL;cy|L(Xqi9XvebS^g3o3cplyNM~%s?a8h{vJz z)FrHPa+8!KK{OxTZ&VCQMInJSfQccNHG3O(mS!NzyBgzIcMolCg8l#2{x3M-wcI(_Y zWv7DM9G)D?a&qnla;@7cA0XiIBbKQ7;-!jdVU$PyQl-dXQA&_|@yH)CJqNCi$<=P8 z)mh-P!@6pyt(5VMQ`^GRz@U%kjs;M}jB?01^&tD$X(K5v2as1r^xvTS*LT8~oBrOQ zuvp}sIVChR8O}XpiKKr0h8frZJMjeP6(>~w&UdYqdE8sGb6u?Tbb{p1O-LDJGshzr zM^If#s(=)s!=E+|FvSv|seMA)RjYQ|``-OaRSbezmMfJ)G_Djd5@G!7f)s_a5qptE`;Y z%}pCiI9Jaj8ivY@7VVr2WS;*3QhR4psor-D

IPJM)IjSUjG25b(IVvN2H18WLJ~;PR=6{wo@(32a1g6+us_}8-#~Agu!Oq z^wjk{cO-R{l(VM_q)LYdt}a1>$;%)We=@iO4d2b^Zf&u#wvAN;o3m{1YAR|dB1s-9 zn8dR~&6s#&!7SW|k$meJEXS|_opZ#KQ^^^8<{bPwI0(65J08Qh2iM$!J!_}my(ijKMp(o;2i00zW)GCalU_P(t;`Dl>{(CY84xTw-z#-WO8hhy}`&H zgS?4=aH?1Oq5JAOD}L0beg*0onwp%IJfx5iUT%0C#}W`8BhZj=bo*D)Y7M)z_T9&* zdy*R@H8Aj`TU7_eTpD1UJ1t-uyN@Ig3Ge-{;tZsM^+x-AX5C~EJvjje5{G*-&O zW~EArS-dnTB>+Sub0Z=!<;UA32AhuZ>5ow;t&;9K+O4B-pz^S$qBBE3HYB)CU=ARv zR+M(Xf)tb2>Rtn*^`>cfHFY6#s0S(xZfsJ^ZGh|a+ z+}}5y+L~2E#bdNbA|BZsS!X@5pL~yTqLXdSmsde09lxq}Rb0Q4s+vd{i-#x7S=29O z^={?651ebSOm6#vk~)e$pzQhEmxUrnb#TD9Bn)#HLP$}MH}emfAv=jVDdCL+i$`pG zX3=TztE`E*1-R0qRkhxO;iIXNVmvmbDlx>TC&M;)sXp3~9aTN`uX}c)tw2>0ntzBY zqy-9Jzifl*eX=v_tADH1_Uc+oKHl5&Q>6mkS_pgz6{8}Sk_B7<$JJ{yf({5O8N9^v zCs1rK?ip?fu&h&1O#CK|8u1vwC<2Ph>axd z*kgwf6=DWeTi>v%=~(|FRzBb{CjF9L|TFC}Ip9mW78W8CLVJ1(Mq-8I@4m3{(M z`?=7R2b_x|Liuj}nLR-5>T#2!+HTT=ytR2&p3dHbsGCByqLA6DB3US^Sb0KnLxKlm zj2`3Z>!=rN`_~FOimTln>hFD|qY%*tT0Mch>)@voOeOGU z9|t^5ODs$hSp0zpu>-aU?lbBOZNGd|S8Z#}vWAvvBdLetsp-fvumijC7*bhAN}j+J z^g0Pz;6ZP7Q9KI-tADMVF455q^+#%ZHR`ErsH3g3-s!IN(9_mL+(#8(0fEC385yuV zryvoa8&WYPedDM$8wG`9v{XW~Ltk*7XqHKxq$MHbv6ns>Vo62(SjKUtN)5|t>c`ps zEw58@wN`Eol_Jj-&{vv9NLrkiFiKY_Kn|_U@FpZU$%4o#zqU6`oA)WBg@wY` z95dGmnN@%d3rb`$w}^x>R>^LLm`5!@c0|O6W|KIRAtXZ@pd5(6AQ8Sz z>2carkxOr;hGnM(mRTZ&S}?$&VJe`g1QsNLClVJJ8P2imyfO`bozb{{eu{*LeJkp| z8-$VOGQh8t#NY7A!2FJb$v@pn)ittHQYZ6ED|l)#?~~h9F39T-RQiXztL)ZGwH3;y zs*U5Jg1q=~hYT>$y9@`*Dyeop;QJj#9bH?fn`QOOW>qysAObg`c%rOg0m|x;-9w{P&!*dD^yX%C2f3soXu_?51-~`BnCfG%T-3? z>K5s`SCpS|T;ZiDgrQtZ#Yi8Fg$(%~*qfl}D zMFiv=daDq7_8x-w*DUUhMaL3cPe$88c z2y8LcPjbH2Tk2@#5G^|M_=b^*^#_Pm1b#mJvD-Sb`lr_2uWhbsK9!2^hNVx3f#<6; z1VmL{2_`^A><<`*2`4N;I_KK`*LAqc^>sB9SJh1!B!|kzJAgZO1GyL-#!kBeLnQzy zpC9y);2FuvVX^L-jlB)n*rBDQxZV}%>n;(XH9`PLF~;Pd30($QfD3WsoMaVSoyv}e z%(WC{Dg?}fykL;s@>e4ucVUs-r~|gKGE|zFrJf3>f_Y(zcq!yXnn?44sz_j`1b|L^ zw|?EUMwZb>L2y^BF)za^%Nz^Dm2;l%a0Umt9kcJP4f6|WO1oMuR$4nGHu}11VFgum zitiK1S&=cG=l&XJrL3o9ntG;<749J!o0o=H44^jx4;@-k zsj5i4Q&EV_k@%EEBRZAtcuK>TPH~6NZEd< z!m56Xs@d*%kWYVNbn@-3AofF6R;}D3uArmczXH`Vn3KewDc2E85eU4H9GrkKNK!|C zW2q2rdMoWUHtoNBK!P~~y*&fQvc6B_kd9n`-9Mg#QrT^HI9uVXqo)q|e~2mOAa)8% zV*}^r_4d;ZnvPhhCbu-zaH2;d!6g*Y)T?28d7~@D_9US>IR{x@PvI%Gd0ICHOd=PWoe6grkYW1wS$|t6Qhb}RQFp8Kx_=WQ0^wH(mQb!#X zboaV?SSy0~Ge`keZ{`^Xw;sbM9sXF;PS%Uz2P$pXe3h-INT}A1kz)c%c;i$IarlpJ z{k_l6QU3t6)EJ2tj)F+ctj;8-0na1Yk^uC{z!=BZP`7s9hi$zuroL0$ym*#D!||?t zij$H0{J&DXqCX4xe7Q07`u_mKQH^ffYMduKFHUZomaa+ZYiJ>YMKZLLP2MnA0CFMd)N4iVFRZa9vJENd`<7~Y)&RNLlsse|}j2|NsC0PxIma!>)!e|(XQV^BIl z%@t%cs_!xb;wbd@?X8i!gUF8KzO89GrYmU@3x?O)QcWm$-dXL?6P5>;nPU%v53eFY zzyuD#GUv4#3YpD4RV)RgH4#BGa4x*D#y;#1%mPCZj>p{E^6z+37cdSDq12b!sLpB$ zbX8R3I}o5_85k$i(>V3cbvBOWQ+K&kRf?k=l19%kE|DulfD)mJ#&D+t+=cZz(Qn#& zs_I^zhiu#`N;Vt9rgA~$$JZDGk;mt#)th&4+U1+#Y_+h8X5%B6TY{gfV;^5#7%j9L zRM%ULO)f1|6%K2dvpig#-;W~eWwU5%QTUxNL-M- zhjKk#M{s`^&%TCQZ!KuJLtM1<^Y~62M?68}Bp*Vj%D|6eF{>KYc-u4AR#jDAYUib% z8DxT;V1hW*uo*6=iiQLO<-s{1vG=oqg)+D8?YuVqZF5%F{2-E#;-WE=G_B?wQ1Jnn zWl@i!;P>o%#k_6H^&JH`hSgg0+#+$FBh48(a$krC06L#>+&8ASQ*H{nxFNgI*o3rJ zSmLFDr7p`E2pEikfbLPe*(7+2i~-n{NSf(ws;%4?4+fs7a+Ph=tjd-!pWGqxDuvlI#j6@LzUchTLyV0t=F z0jlBf=Z$JBC5&g|d1a6v5UcUROWU%aDfDjYpBrbNYEsbztfr}oH*S2RSS6WHpU?v# z10-bjC(!rPMW(W`?X62(wNF+W@(|~M@H!eVeTLH4o-GBfv$InDBlvh`)sTSIaCUR0pyif~Bha}*DFiuy{5HpW% z>NPj2ntIBXF|@B7#D$TLG5)V&2XCjZ>8fjRooV}Z-fb5O>dTc?T+xuvE-BzVc{k!z z1B#|f_9L?M82(~w8_1-))Kyl+LSmc7d1j3Vh5#*)0Kvy>_V(2HH#3@(R#u&4X7f|D zJfn~m!*X8TkLR5C7{DVB;Yk%hc?d;NR1V-CCj^egh#j--+~*`^jJEQDz!WaTvcXF| zOTkAPql7b5u1InTP@@F*!So%o-x_YL+?4dTnmTA9j-{Lyk%C~L#sTgD?n7g@$mmtA zDB-6NR8hI+1c1I!Fh1(4GRM=uuph39TK2{BdRDEIXl(l0=O>ayMI7}N3_Ewne2&My zJdn=HMeb98li)wbe!uC1}MNlm}Ma6v$A*YbK6}%5B?1Df*PJw-lcQ;&i482H)bHi%1!(TNE zf04BB{3J(a?8E!u0qRfYHEQ(l?1j>69m0m?d)+mgo~|x6KMs(XY4Q$0DUT4~j^N-E z+ZykRJ(*?c7sKr>owXLlVW)`5*7^`&S->Ndt>K?DFkEGcV~*og*H*14u~ytRg`$p{ zWJrwEQ%=p|Mjx4wB7x!KpW#m{7~8gRPd~(D)V?ay8b7Mjr;0M~I*GX9r`)*P4Zq%%bnjgO!aa)m9JaGux0vY_g9f$;Wae$W5Org%S!?jM0b zP#)4Us2S{WpEsv(o~KsaUaA^ph%BUle84J@2syz7e@}e&(tV~^4pT`WS{HDrD@cXt zEhz*o=8W5+Vdl;OK)G*zSx~JFJ!FClJKLF54AZ178NknI*-sIScLa>*wzO`W z{jS`U!b`joOy~iPB_zhf9gF9Wu|2Xe+uIsmweCvI$GE9BwT4PYx!tE&sh)XCMvaa~ zzw&{{xyQGs&5=(qaBEGHlxNs16x~_6YpE?YG!+m>TMb&JKY;SL@ncsHhAPYI-H&X0 z0o;uzJ@(sftd@q|Q$<3OMj9lEd4=<5g6H%7ea^1?2ib;=D$=8MZrZx(OskrDNQEpi z1C}S5@ft-uSgBtOk?)cKwuekQK|{7AvQM^bu-euijH;-(Qlm1*oV&>Kj(NZ*k?t@% z_8RC93)M|w@7fk;>H*5(*|%jZ#pk4TtE`#UKZa(^k~t%Sg>3tZQ{{Vfg z@U1rLdt#}ssEw93X=G@^_#!0^vMPn-!~n!QYCXTGT}$c(&e^-K_nVy!H6^k;t;&Le zGSNj+9~`NWnR5_Q%2@EoIU&0gq2Q52PLSGcPBID@L|dl)GTSxsHTLgWy{*I?+UZsr zeqbl50G&W$zkX%$j^0dqp8c_>UZ7QOYI_Z?uGh3Jc0I3C3=x`ZMOP*;ftZZ5pyK6- zz$1_c89mMrcV)tru5edcV^eopp9-4kCmM(Ni4GgWjB|{tqpk#M#Dm?3Z71%X`5oh9 z)m< z?XtyC_pY1mB&m%lqOPc|xYX0gzAP09&Id+~nST<8aM>Orf~VL8^7uDp)`N9#+vL$v z!Fr~dZSgcNYN?}d5LXv-l`+975@4SaGZ|d4Y*n`1aQ@#7Z~HO zmYKu&kw(kI;!yags;3gTQ-Hh!ooC)1EZzHN^HX%T+o*RXEjgl|t_PM%UjhX*Xlcvy zi-Iil((&^!MGQ!0JdeYOA+IvRiFc^p)~LkqK%jnxdXq;$n;# zG*F`yAcGIDuIUfGue01MX{plFaHyiB0@%!L_jqWdc@VaMHG<3UpnO+r8H8Qm=bXp5)T$uX^JYlg|l|q zWP;ylwbWD9)S2y+veWqV&0R0~L=m*8@rcxq5)=hkDPRGSvQDv(Q2t4B&9rO8^&U0K zwh1=r+wE^@4Yu7w zPftw7h|e7~lGDK$dRRn3rmQb8d1PUb7=g#lkEN0;#qlXCD2(YEcEYf{ZYLK0R& z(oD-7Y)J=}4n58fe);d~-&!M~nu;l?Za2GvK`dda>0+p0S%@8j0()Quz#!mydusIe z1FYuN%o{Uyj8c2wn~s~O%^dd`lA;RbX%YyZ5+E4mhaezc`2s>cz$X9=mztYy;M+e1 zNmp!%?-XvdFI2F}hjlz(!sG;;Ne2pWaoFiM`*l}&r{`{l-yBrY@*XqAHB_a0V62>- z+w&g&o%N+|n}Xv!RF$@xSmW@To}4v3GenD#fDu+NC@0V}ckVT_E;rd_9#();{=;p} zwf4;(-`qD!E4^(DCY@@9zu|cgTyPBBe<9n`(;e43gIm;k`DJ@iY6%bU)}AvROcKY( zvz|(%Hc9dTPE~Mpo4a>6S*!~?ZFv4NXr+bf5>l@Vr#0~p7Uh=Vk^t?Ij_0qol zSo28Hc)V3viD2i$Nf}gjWx+kz6K(ZQwrV}&xvuuxJX2a@f|^=+W1)sVRWho}Qm~ZB zSs5BB70MMd_xwkekoFGMikovuds|)7S|L46L;^tkBB!1vW`;J&mQd`FFO%aDv@vqNJv#RY>Kpr<28&nkf!dnb{a{azPK0 zKM2UyihJFbij{5fy}~Ffd9?1ZmX#)UW8v`%S=B(wu?0!U&PO6IWl&OG=HG9f-HapSekiD`s-)^fWK_!>F7nYVbc&&lVm>sa5ta-5 zFo({$Zr$M2OK-e1ysWkvX(gqaq5(}B8l|1Nd4l&yoDO-DD%`s%3VCY2>z2yiwwma# zHj%ck7U5MR!nIE=xg9upmy*dGa&j#p#z6sl=L1{r>AUGFprw|RYFet5C@AT;GDtjG z3{5CzW@!vDsbc4d9#zW_6zhC?W3`T92bGx03y2{(-1=p0hAKJkZEd1vmP)#1n!0FY zW0hV=(W9<$lbm3dLyWg+$7Z$a(^B(o`&4nmRTX1}zf6xix(McJ6_q6C*^g`~83Y53 zYE9j`rnXyda_xP-k=Dr6g`){s49gNQ%v@B6(Q$@Q9FpXK#CBw~TX!Yy&ka4#Xjvc> zj);bix!sZpgPuxHhys=g8UA1cjIV7gbd6xM-CYMCibvdg32(O8MZVp06>lM$mZF;d zB@0M=hB9N5%E5<<0PW^tdtq|lY`6W@EOEmmb3sKU-Ws)AtE9>SD;kn~Y$?H%uohwWvBiel9 zTZ*6VXSmTpQ*x!Ay6H!AuBoxzB{R@dv=GGwE3*>FzD_LVRFKTzcOZ-bqMLtk+b=Ok z@SE0OB!O$7w$;NanpqU8NX)$ZyA|v?jIw$Is1LaIq;ykR=d8HZRnQpTrkL9qri}}f zQcenTF3vDAbA?3&952jUGZV|$i@>AI=t0WPlCn{ts&NNc&lKOHd3P&$a z{{YRyTB&EH<*GuMu9FK4A&Y9eR`!! z#(oOn9H}&*Fn(#tM6x;pa2PW2Aa?9TN{zN8no8SN(vZZ|=^$Flim2*2NUU7FI;xKh zcU*D)V~~4|Esd)V=ePPyQ{ui+R8?Z_TR}}%W|84A_#&32;6`3PA2}GZwh9uGkl8|4 z-%zeID5RpQr)#aMSFe(i8*)aqMdA__&*BoOA-qf}Auyo&92SPnC8}wwEGuTBon!ca z3ZjyE=6Tt($;ogTLIw(_3b_E`e7eG;Y~8mVOm{8oS!}Nq&Z;96^TK1OlkmPorvN7` ztb%08<>}dB5ogoUL189YH+*}mdK(S0-*BT!DP^LLH>cqmGJY{D^Ji8*B9(Z`A1MT5 z7;LMoy;Myi(bv(`Rz%(t(nnJyGE|Q)B<078I)F!Uf;*GxhMFCtEoBUJHzk&>p(`w? zZbC_7B2H-;W&l~$tdYX z#)ir(?GNT|SxT5+mt=7ol1@fcoU34V&tVqnZ=T(Dnrdo#$~Tq3sWT(K7%o$qJCTeY z{6hL;J+w;Cysfo1s)V)8Eo{_k7QT*tOpPCYQSrwqBWz>P-~c;!%I%W*9d-I5a3{>b zhaK;^($@c*^TBO5Fl=B39LNLnokv?lW@_pSMWrD_ zCxt&1NaLPXDH`!DgZxZj5Dr(@8p7dVlI#t>uHS4FF(gbXA*z*4GmpYh#5l_MMjFr=E`Yc)e8`#vveB)pyftU$6*+fStM3rk{<;@EUMTCvDW_p zfxKJ9kk4aTNx^*wyHD_Y4*OHk6h5=SFTDUg;0i9yU{ zj04F=MigT@2wqt70997w=!DxYyJ~w~1tqY{6+NsNO2;cGh%|$aOGtt@^Da1$Pa~2> zFbe6k>ME$_yVBFiPeUY)GP@*v>DEQyk~*5B>a*{9ub8HZbN1y>h?RcuU*&w13J+?|iPb4wh>fn*23J6(>dDoaE zGhqQ98V``u+5=7Smf@TfI`OpYtlMf$xlwd7%UbY5QsNhi28kPs^DGQxnFMQt>Pc0> zzzGp_qU&n5)yrt6xHrdKD-KQ^A0ZvbsO;a?KUHNf5GnoJ! z`*I}b$}}-gxrMj${{Y3BNW_QD%B-$8%6n7`QrBdxriO-Ubb;YUhACW#*~n}*N`@|Q z2=oQ8NY}Nl5N)T1uCkh*3QFk`lG`DXWe`b_3JBK*HRL#g2p|?9|v5kpZH_CjONl+t6}whgmwrGs@|E9fVVo;c}?Ra1$1lql`zk(J-r z_r^qk5OgQ*J3O^AP_>NG)Lu9!pr&?cYAKHfbdR}^BW6ZNIaOi-BbH0{-?dvRtaKJT zNSz0VP;H1|to)>VS#YN3?cYSn4!>Pwkvhzu2# zNOB1X6P5=ex$=-nNR`b3?APog>H6g?ZHpW`NE(g9@e5ATF^o9y>Yf-`m%u~-GZw^r zokk8^f^*(3=jr@AsV$}oYATpvF?=&PXv``CwmFE@kjEd1z$cRsd*;R5Pn%QKB`h;2 zrjf*P#>JbF2gc=q0V9hN!yuMDfjX--7h4ZydG?4g{J zdmlDe7&WAtQ!i2+5~oe2wBU^G>osw(HKhoapBy|(po+tlk* z0jQ3Ud>6%!9VJllx*_opVC6?}d2s*^Jaor&q`g%|Qk#~JDp_hOWUY&fqdh!~$I7S< zc@i0mFFz;+kb*SXUiX@CqB4Ye1rF*K^4c^TipbGLe_>xTDy>~a(MYg?h2b1n5fWKR zC3qFaPhtQ^+jfeYJ-F1j3Y4sxpWinwy1hft~)pMGGHGuxJ{KA>%jjJH<0+V5~ZUBT87Ob{1ZH3y1< za;|^^pbT;&@ez<41iPbjM}n=bB>JQE`)6v|?KW-2TWwwq-C20|8A849OsPr%+Sk zWaOg}`CO^=ZhgCgHSOnXZ9BN8o~9UX;Ka8mgyB;B_xI8R;iQt zQbewb(jN$Mie4fjeCikmAOduU>BL8=1GC8){r>n?)`uD?r)|w8uDvPeq^+oeo}Fny zNx34($HP*+imAgULGp~8lb%|0HcJ)hDeW`VS5ZS5l&=|HBQkh>$M9sp1e|$T6O0k_ zRkX>ss1ho=AApIWk-i-unU9~cE0+PXPbJ9=n83p>0VS;4u8xj`?fbnvRP^2#!_vt+ zK;}1QVx@btW6FDwz4PdOV_MkR)CcCY+3pvYNT@9IbXLoCb$5p)SH(sssb`V7q((j^ zq>R5040CtO_EFpe+$HmKU1@0PAd=r(Q6vM5GR;L+R7c2^!>|p+b|f73W$po8JX6)x z)7Pcej_9%qc%@2uaZG9)N#MCi;{l9n0<)65Gx&ymv^wFqXfHPSsp@W3FdCW7T$c){ zLL|hh^J5E0sN*3U@UsDeFh^~1xtf-412x%Qme47Fo~p8*f(uL6)J0h&D_cFGr3xpB zyD~77$;%7e5J&<401u|O$+?!#NVE@bEozEmM-ghae}8Q4Cd#zu^+GtU7RS~_Z{kdE}hY1z>PomIUCC0Rb;pZGqE!l?L6azFh8UT~Qg0AW0qycpXa+-`(lS?|XWV z<5{)8v(-#)3s-HZN&!~$)BgYzPa65lDyu7UEL)Iqlh|w5$D`52-OtbHu)1m7Xklui z>usLQMOM}5ajuRtAo1=ubgvZ>q2lr+abYB741B?e0D+%i)pF|<{{VM5xor!rbzOY+ zmlrA;S%cHiL<`Zu<$ci8SRMk0cNB1mDDrb!Z^!f|lv;uwx{jm#)+T#ho$ z%cRD$Z;${M7d#VhB$Ywg_O1HvEivA9j@5;swp6VgGtez@iPcG2BWZ&e%9$COFkBxG zxIi#b_rBh^L0?e9uBjuVMY>x=OiThq^Spi+93TvXhzA^bi~u#$d+2PNWxl@QT}vEh z8N4s@dY%lx_@Pnxo(;g>(%0-bdl&x^GQoo;K?Kr`2d4}?Zq%i zY?1-M811eXig<@i?Q4cVRku#SL3JoF*HIy=g2`P)Q%y@wXRD~5-CXJ-gS3^ zrCO_WsPs`v2nryHgE8WgHz_>CNI3EY6U&AUh~DNcjty|yIZM4Wx?HWaP*hDtZX#NP z6w)MS67M6&6l{gnSsTMGoUs1)9U{4-ua-D{{_rtW$y1F9yB}HXs{BEG*XD=UKTTk*NOZsE9f> z64NY%Mo%21lQBg+A~+9^$KUX-Y`bMW1vGM9YvlNvxVh6z_ga)b1i?olRasXjng%0^ zwh8xaRo{DWGg7w-y{RdNwsv-{GRjLs&&(9W14sCYJdY8AGv&secH}g$RKX76skF;O zbUzb2Qpk{pPAp=Tk@D)?mkpJ{AdpXUrOHb-xQp~wMPM!4+Tm4A(kfalyG=`5_l^F# zB|%9i2!c~azr;w`wmpvy=PTHGm{z-f@phwGZd-wk92D$JR5VjOUK*eUq*%N~2;^jB zXEqEzDEq~Lw3h} z?$x!m@l($|x=B_!m-sS5i%|$L7w#o3GO#MmnH!E66(kJ=PHP+<+>QwSg+w@-MJ~0I zQf`|ac(B|jxXE;o(8V0_VZ*lq&a=2;Ola;Khzr0U6ma5Z-+Fyz+`CfYL1eU_y=mDJ zmExF3M+~8ekU`>1ivAxW8ypmZ+%vDP8`ErW%QDg1<*KW$x>KLH>uKciV~(U^HiO24 zD-^;>U5bVTDgZ+U!LF>^=W5blsP@%0n*ANhQvy}XT~93(vcRg%{6FNDSV2tkEX>3Z zaC8ir*;z$rWfWpYa$GFMsRuerg!Z1l}p!k!v9 zU>76e&b%H*B7YfvAj;DdgL6TO_(OTx%*MucxR1 zl)L2%#^t0fCzFbRt0SIC>#G}W*sHH}l-r)&VoD30y5M{oE2TkxYZQQ()l0Ih>B2xn zZIhFer$^h@ed$9DzP`n_sbQ<9jpgxhJT6a{h{qzTF>E0Nm;eFE7<$unPmBhE#t8c; z=CqqBT7BJe>6)n|PZY~@q2*gg*Z zF6_N+Hl?v!Z)fi63#D7a(Xfoa9A%zZz#xzvJj{gTa$$SgZT&xvJD%*?O(3a;2%fIl z6w$}<(uhj5VgyE0!z*G2}r|IO%Tx09zkPXQADc+fI(hx2_dJ2yanU!%;OYD&gbhBE^+J50yiJ zS&y*7oTd7_2T|>u5s%GCz=&O80Je09+^OleCdRqaZVQbJNhCJ9xC&F#4nkKx8RYEV zBA!4HgOKCsabnuHAl*?~n{imK@!e@4St@DkrioS-0$<~-rZhDXu|PR8gM^P67;_(O zZq?fMI?eA*Ovjsw#h%r6X(FkRhYbECj0&azAQj}GV+RYMLwD>g#c)f#ChDh4oqf7$ zOLZHNH`#5d_GB_HLexMqAhUT7cHrI zmV&Ctves5mB2v994Kb{pN1j!ZF&X9Nl<{_u9C&VS&_n`hk{5Z6aVvzy>$XkM`?75q46f+*jMtT|)fyEi8eavO^02UTZP z_Y^mZn;PyI>T4;MNGYhNF&eHeR7A)SDh?h&+4*F#D8yh&q1#(ZuKh>5?jLog8#AoBT?Ya_;-&Uq%dJ&(`PHKt8~))2^Q1>%~X>Ah@J74)#?ddVb%$4ZGt zLa_xoM)?G>1qWbrft`DEmu?Dbsv5n!3fQNOB&w}5Ni4u|IT5}~C|1i3>^pb!05$IM zx$aG(4G!l^4OJ}8Rpy8lW|nRdMj7(un+8zWW5_TEAIl2;xvRFNU6xB$(wg^ls)cH) zX(m}2(MepqMt1W!NUvH!kE6ql=Cac44NLX?s!(P#bQ_W9g@}AmZ zez4dmW#zUfTW7`3_i)-Dft}!fC;tJ@|+$qYri;)c~x&o}qNGsU;Yn?iY&?whO3a-3K3IJB@2+w9We#qZ)U!ze^V5^d&ml>R-=w)C( z&VLyb3VV>m;E+O`_SKpzDplcv;aKraCQ3lTNgxj6x3BI_y$+ss>%emz`~220PMDp& z*BQmoItn`au}(LAWbv}BwCQcAXrp3sh(u_<-`>l5chSpbqkCEW3Tst{`+BxVAWDi# z>lF1AqZ!Bm$IdcA!DL`Z5PSX;*3z|7y0jGqp*^tV`}+-TULa%~x$HPO&*hA2Kf{>w zlYf$E@dpOgE=8;9-qE+*R`0c{>b9-It>W;l^>a%VKaGZPqG!hu$N~ICU<;yALqnt=`8;wOiS<}i})t9(n2pzk`-1&I0$rSuh@hU=| zUA?>ho%9B#-)Ndc8twX8hJ*mJRjN70212nVhq(3t=o{hgfbP@3X+iBRkZqNgzdHAi z*;nkZxTy>)X(B0Y5d*n7f z)$mmYsxvh$Z40wOI0pwD)mRbRu^!-pM}2;tb+cjYjhl3va@$QEEz~Ut zxP_%Lu#IvHFC`vkU~)08GW%s!&|kK0(6~!|k?wZt%DOq|Weq5Z6<@f;jpEjcaua3wTixC!xvC2h&}9T<0-Ef8vw)u*7!kG4#}TZvYb*Qc1z&M{mng zPljV4WVg##cSU~5ySuG4(_b!^>K(0PT6dD3wzwHyat;All!x&75DWSY_6^@sS(yuW z$Y>c>Oxhm zB|5D!k$IsLV;RS6`ub>|(Aj&te&6HUnr7)1LyK877uYDlBSQkLWepm49Pymh^60LvO9qSGq2>izL+ak*slB zY8gM~*^$hQ4p+A%Bzt2zaE{N@ixpd4cC7^srW*D#%^iZ?t0gP4viN=^gyBI8fUMog zI0IgPUHna>(vsHsoIfG;{{Ty=2ZhTpx1FJKzf6A0eOBrWzY#4BKG?S5UP|lZH8=`S zs>B0K{{ZZvA2Kz1(fyHnF|a04x;O3TcwJy<Y z>&t7ujP(VDkhgEgmC=X6;$gR&M5?bcQE{rU(MNBi5rGX24HQ%f_`I@WC5;&N#(0+X z&uvDQuIq7hxIOWwr+VmqHZ z9!CLAJw9VtBsS?0W;C?YRAqA_Q%9cdfy@zsp2TrJ-u{~L&zgB%)S5y`%Ib)N1vFtE zpft4nV`|#vjiu(V3p028T#1Yk81*E69{9=D=7!forbz_#wC;jYC?ZlM$GU|F9D%_B z&-$YP2Z!P69$yN+Ah91Z)bMEH`G7e2PkfIrZ=Q9U)*DjO)mB#12qaPCHABY8Ly|%4 zQ?Lga!+M{Y)^g6Ty_FP`y7u)_h;8?38k%{*bX0iM$=oU8Nm1J)^&`GJYbCqHuOzTd zP^&Hg@MMpGEBRqtx3A*;J#`)`$SzLRRMOK-AYKhqOyP%{83gf=s*{eu0qfZ6EPG>Z zEc4B4r*)jjN~A3$WHvh$R56?aGu?Y*KE#9RX_{+s2n*=p6147ktEOb6sH&-OaOz!Q zT#xjd(E1+O2S*mBm`bZz6+}~VCFBvwEFpa|Sw|MmJu-V^^S}$C;32 zn;wNj@*ro|2j5=OR?a7pWl*w46qE5KN-t&e$O%31fS?okX^}+1?yD|F>+W|eY(6|N z%W+uMOT!3UG7x;quOcdd0qve${TtIzYGS6pRa3Nd(^Cu-mQd0xi|zqDxH;w9j&cXT zrlrW%`dPn);ErgfFkEGU9r6Jroc#En-u}9aS}qM+%7%iXy>O)z(;q8)klr8xa6NrH zcO%zbCN;Txj6FjCNtO(f$k5sq1zy`d}Nc`H*G3b zFksQG<;;s7JAm&gJO{1z`~Ih+XTeql&oPA*-bg;#1T`Sdl`* zBnB)NJbAJKAY|tR>4KRhua#3<+i5}RXI}h=8(%04@`+T zd554R5!)vi^gBykVW@@!e-|su#lhf`dIt<7;xH9>WcSYz+??kG_t9pxN6t8w&^{hx zBgEpSPYk{TAH)X-J+h@h&O7=8DV0vU9*7z!+C{!woto&kdqf2#rIm}))xfOWN2*SxLNFlujQbxc)E&!fj+P)A zf|+S15_o2M>SHov&<_$o&602c2TRlmWTJ*jwX@b_ukh=rC!U&UBqVwKINWk40CFcC zyLx2elWfunU*veA|x)-pX6yT2s2{h;kuXe_%%kWXTFp1RvnQxA&Nt_sZz zF(;ZuKf-TC!2oy3&W@Z-(!QN-dG_Yi_`6}7D^jvV?<W1L9Q(ii0)q1V7 zB?VGb10~vOdUk@SIzNgd1cz2t;NGX305ji3ZTnAm?7og&PUz~rZR+=MnmUQ5ddcNT zGU?4J)}*meRe5@PlZ*@j9`pC5mZ3JC-jSpgvZF?&S>u$W5soSglB|1$!vpFyrmo7= z(!CYMDk4}IqeX@u86Kd9^!>hAIthGMc(naF8=gNkY>m8yLf^MvP)_Ngf|A=bmGw&< zBG;|zH~5-$k=8eeN`eYw#DzRnyAyz~pnI=zb(+mFxl`R@uBBL7Q%yB2PYMORAjsBJsO*;z+bNhN5vNlJksmNw%fnU5(5m0QXPRaVNbGn0`b z*|@2wYc1Po#4BrHF;T@YBMGX<@QbR9l`KYk`X790t?|jU&x$z!r&oT(5CP*0oNm2M z>IFnAQ*pb+ZD`dAg=ph|pwAz|Mn+CfSpL4+0d3#cD%+h^E&i_OJU$b)Ab5$DPy##2 zkg5S(60MzB_D#pKw>?$D+0^S@O*7GRtFJXx1=i(IaIizkJT`_kmys+Fp~1ji1nNK8 z-qp5j_N%{6`iEfN`+`-Tw*LT4Y`j4=J+_^EAc)0+9$e%o-f~Z4#CO-LjqQ21l(#%I zQAu}8bUVJ)NGY!pF%uH>aV~hAF$_F_9Au1pWaH#F!LqM(6?m*a6HF?+2-_v(G8p;y zP&==3G6?Q80;A*Y7wIh5dSAP$NFhbIUl11!Aoy}|vnk?dc$3WJ9fjL=ujPcXPFfyGV|L{MD@2nAO@P}l?5_CC6v z_xfoj0oF#SLeCs*sv`#{81IhQ&!^MVT32*h>y0fw;iwA{A!OcXL*Ei%DfN*uJ6RD;Zj54vC#?n(5{K0`yXR_)6Rhs92+l+{eH zgmhP-B##}`t0bJ2*9E&ae!kk#U393L;YDbfnZ^W!#7~`% zU=)u)0s837mgr}V=B@!hF51fa4e?)&I}1hYYV57mGLL$Uz^4BudDU0?&+Nkt#zj06oWi=TqvVl9XI6 zwRP0gh9nY3ttoVq0O3@28N(b5dy(&=0F68v;2<1z2&&?m)(yqq9=j>8Ga=Q^zdKOv0UfvN}F-j@&@}01seKu1mPJPjar*oF z0uGLkbg@kaklovVlBSLuMIm_Nk|q@~tW6|lCIz@Za91P)-G|JdQ>`_Y`HVHy$8){b zC~20gS3?Ylt1(1r0A>Nyp(GNl%jNCahCR62DXHgWmf;P;I;x6#ikhL})06}pt|a6i z8Eza&KS8M*-D=>o!(y@1Pc1#o0j#)1PU4v$4cZlPKB#_EW$+M z%H4oq51{~^WEz%ksyR#yf1;gW{l|0f`+7|s6c5eBB@vM% zKpC84)T10^f;)_0_w^cco1x8buBWEH^*YHx2k_c+6p~cQPs{_y!r-Bp0!i}#FnjCT zeUsAKDuQcoTZ?k#r0|-Ck!gD(wq2C+^dLW$Ok>o74xHDtskOtANv~(o?hAdt;r9hO zqG&5xDt4YJ7cPMdk;wtgh~-j`1O2Wv#o<1u`Z_ z48aE%d?JI(#2wj}1gX`d(>}O#^JDHCgqtH_(rucGnur8dcKM{9ia?IwNs6)JE>c%s z=uQrNxYs=1s*OGFx5iwL7DJvPvI`t`&%Q>7CGkX%MahJQR8>}QC^^TW7$5qdrI_~t zlnr}Y?h{?k(+<_@{rb~vu7+5ktgL_{$YjcMEUc^t7E-)OBil_o19n*`BEH)$)$-e3 zzP^SrQB6ZgONNYir`AOT2d_ z-^Tm;N^0_|WvPm-ouhmyC>Rz1fyCf@V^Hg^R?B=a)x8z6fXhy`2()zGvTzQ#%bq9A zjNo9LcGDi{+r28RtreX<>OE3Z)kG>QD66dIF9Jp^T_Kai;Up=5sz_G!@}BtDMYnou zK~^d!-n5sP=MKIM_Vzv=RBfAO;m?U!z zG?g^?SY}xuS*hEWNG{P6kbC(7J;~H+OB8m>6In#nDe#ZtI=q09AM=&Re&2}q^yGDP zZe7#TJ;k&R(c4?5x?xRVr>20`TTCrAeKEuU5y*wW36e?TKqQ>;sBE`ahN23eE22(9VIPN*z1tNb)ct^D{y4vB1T&vWELQv z*}?7TEdA%Ww+_R!$GG}aH4U$1O7Zv;@ z80V*08xKc3u*ESz${7h(9lJLc$F_TtHDPogs8u!#1y@gZb&95~#FKs1PB@6_D;T6^ zoteCk6okj$x{p!n2+@+?Q+Y%l1GDI)UH5D|2HUl(YWDvC-W#!x-!jK=yVcAs=-sK% zBS@;UupTZym03agYOk%jUF&x(7^j%6CB`RQ4T%&g`k# zf7^@QP3og_-tG-uQw>E#ki$z8&TzgWt7VF#6UBIeg-+lMXg9)$$^z%|fJjpd}L=FM)#J>;0 zXC6>hilYEY$?mPq^_Cm0#^Xs*zbP(Pt-WricvAUCA~WZka1y%`2b-7U;=};oL-y=V zpRum=6q5AX6|>zWREF(cJk`PBVmU~Ol!&@1{5{XOBOvK-kEq~DAp8~Y+S5Y9Yp>|V zt_xi@?%VZuTiuGTl*>hMq>1XCVbt6sSN2V#2wL#nA9|dzyLDw>`p*KkS+U7cGKww*dp>}eYI6AZ%^P-O;Jw%E**TJ z6@-v-1AZ?2eaVey-Q6kbwME})*lFOnQd0%2sG+;j#|&~Ha5+TE=0rK-4-z{O>DyQ) z)kzPT(OXA;>fHzxNAgM=YwT-v-m?YU9Ydh4saKXUMO8sH8iJfl6(q4?=L0-Pwm{C8 zuKN#TY)I>=?{^C|^0wbnX$nzJ-VctX233(lmH?b{{63&}8nWMN#cs3QtyEFf+bZf( zSYWDKrA=6bI`GJ)pCC#XDkMn(!6N`^dWWa<7Rp6Sa5eL+(aR(=Brv5*3=&_O%Ko6> z23&T>zHrOpejllL273E`NnIh>Dlc&E78eQVE%b{GgH0p|y1a$p+`yQwk{Hsy50RTKLM5KMq6#8E##h)F<-y zBe2p`9W<=8)jc&${{U~)PZ`ZjP+wq$O!c+(QY8~(WMvL@hVx)oxw^z{9%EJZ_P8{jRkf};3YDe0ytN4x!kv$WhM&r1o)Rvo_ zGRR7pBU^+q7nyOezwt? ziK(tM&`!l9c8!uZ$jBVAgOD?irkq)R>H+@%?3%5@yJH#Uy;z#MIgzQRSs@P|IRN1% z8D3u58T~!vZ9%o~)%6ffD%(S|vd9Ql@UWqf0yqxb@!!|mu+p>}s_#QZEt;C=Ft*4; zns$`3`yWBuJ%&y_wUtH1QK>4ZrH$$xIXQ>O(U8XjAo~m)fIWVi631t;S7ANb_CDXO zy$K_|M^6PYj#*-4R(Vvn5=Sg$JxL`;Z%$a$oAs7W&3&l1o0VeG(@Ej{J0N)@3F@nY zpbp)zzT+ddfLU&8;J2Fu1Flpzy|KF_zUMNmIFP{>b-xt!BtT$KHZji zDZFnIKOKOd3)p7|1fO2R*GlQUzU@mJX)({!d!1QXC8~-Tw z5?_ZNDStO?XE-01_0Z`fXqUwCLk#1}dxQ1Pu6y;1VbMb!x@sz?iU0&tQiMro%Pu*$ z0p-IH$oD7f-%xJbBW6zx4Z4}-YS$m;sazIj!Sb{DmpR9OOdr=wZlSpNsj#Z9-(B~8 zN>$T086!NEih@D*Bjj}=d%a`TM^d#;ldt^ZF$cLPIXOP(R&}SNwmQ2tP0FshX&MS@ zxk5^0kf(Zx-6^0l2jp?U{{Sh^)6+h^ zv|~{jJfYf3tm^A(8H{gG(gE9%81(I|=&F(?CaM*k3bKV_KnER&$GGjQ9xbP`EL61c z?zj)d*7ImXGoa!|5t>DAAx2d82hjTV8U+0{sC#4FsBRF>qG1wokvI{{1&bC39mX)d z`;V4LOvNcgvh^=>ZOQ;~K#sqcYbAX2bh2?)q>iFr2%tGCM=tq2&VBtcr)j>@JHn=f zTbjP4QmUA|2avKnL;z8-jDi6e#ykB66e8(n;2spUPfZjr38<1!6DtxN1m=4TvoHZc zE$iF1wBNdQce7s2sxXs9jzXoGRS;vph(TbO^z}XadiK=*lb!KXAxqy|#?ic?isHL= zirZeSv6Dug9BmSyU&1}c2fxqfr5LKFg;-O_S0JMmJ<6X^`D#QIbxz-RJVeUQ5;!sE zXD0v;uYcEH3mxI>THOt@q|_nr5Qy^i#z_48et7xm;+iQ1Sx5HH^Qp9;q?#yXr{&D@ zUj8AG8=i6rU=RU=^zJjJ+YaEiL29Wt8?;sP%M@}$OB=e0CV1pV5)eE_l$Jt5kUevO zr9H9JUBS4kt0-lU?&PMvND9)Xk4Mes%Dr+s)x{B(` zgEddah+u-42@7MggW0e`uWvEVMzWsqVW+urs=1;LT-H{~r1B{w+ z&jg`!N#zBzziaUB*5V3MxuS z<$gG%nwfk@^&kZ9QZc}&JR2V=PCeKd*f@Y;KixQ>pjXrQ2Hy z^>u;g@TZw$Fj2z%c>yHye-1w=805g7*!CLj&YgeY^4oveX{dLllJQG>j4IR$I>=|I znYfe2IfPzE85zjIAPkUlBy4jz&7=311#JD5y*iI^OGeV#)t6eR%5sK^k>_PX%AuHy zm0XZB>EG+FjoF`JUbXJ}JILG;+jiYX-=`HdcItv=t(pc;5KSCWg08FsD&_mS73@LB z=uXY)t*d73>RO8jPbS+{HgEDu8mOR-o$6`WhA_-S777Rjjvvgb**r)Lo8xlrjg3!L zy>}HA!oH%MK}F%x(;AAS;>w64rVwSB+1)~p#gEIjnpK9bV%fj=JUT08prG8Bs>{aX z@u7~ll|o36yi7BdjxH=vuYbhe{@UqopY;1=Z5uTi>2ArS+OWuDdWmUi;fPeKHUhW+ zw4u2+IS}JH9=fmkb+|hE*6aN>%FS!rakc89ZB>Hg}0Z57*!;}!RETVQHBI{Sr1MNh&+#TDd^ zJjP_?BP2VXXEB_NciV5=drPNs*HG=cH{7?{>0_4bajue9YL){T#sDoff8zL(@G5~QH^kQ&%udYT{x2IVzHd&`FS0!6jqO5e($rJ)L%j5#y zeoO-3dARUyz~Jec9nEXK+iZJ}ZZt7aQHex|q$^35FTIuLuqK_MyHik4MVDb z5jZLGsct8@@1IaLOm7~o34^7+uBXA09}GlDXyROVQIbb|4^O5wgTzLVw1Y**>X{6( zSO^}XH+XSc^Fkx^JW^5%VTIE?r1 zJx6id=cH?{@t(FxS{i__5)z1eWpV%`BzN<6@8}P=psGsy4O2k(DPuK+l!@H3v0`#S z#(lkxbNw~LY*?ilyZJiV0XT%*>Hw4Kt`zG-?_X|+vop}111uAQI(VS&oB#UmCdxyzP5 zVlq8RDr~K}b-0$Lvs)&Do)0moicZkEWx_HHksDwfzCy6ZR374vy6k(s&v(sdywL@& zs;QEt{Ca1E7?-&bljY#J&PSB@@9aAMC9QUl0LIxVnm9VPNx(~14Yapzt}W`{6t_!j zmNG|mV;#OZd?L>p#2r|MmD)!cQJfAZn*nieefhq2{gSh8Ty9otg*|OtanRcBcJ`$3 zU|<>|y~m4^p)uRPY^fk#nOE7z>g zNlwEu%@ZR;^6@K(i?}T#6&MPwfG}%%ex+`$>36TDib-ky`BbP9P&{uE%Pd^wUJ`l* zM@M7$kEqE#tUZ@%t+(B2sq9zkYfV$sN#k59U|AhwQWeq6fO5;8!C#LojO1YO<g60e$5m+ecp@u1LHqiwgbo12DG`4H#XBT1mhM1q#D?T8ZO;TYovken+pmsmtG9%- zcKMV%su!8?p>pz&c(5D@0F#s3N?Si`?phj}iD~UO{{V`Znu+O6G_=vehm>fqEQ+z9 zIOJKRC(J?mJ+IX?ZiwH^B$lxGQiaw#g&mq3y6yU?s;!pePX)e~Qt`(MtkKG^DjB)C z@l3D)s(8o55J#P(sFeH8`Xz2~| z#dF*HlEu_p&20n}bt^}1sd|csppJEvvYbY^1Dw2Ah8&Z(qOP^+XOdeoilmpejS!4& z{kL6g+Lv1<+qX+cC4=EEX-jW}ae@?`RjK2ZODomCgCa3Q+kiY&kTjnaikoik3T>}p zcB7>=(AEjp$7rjf<4p{4zcnp82_$Bb8Gu}59zbZdkAKf-wcEC4->0qIwDmQ!R#eu^ z-gWT_XacvDz*!`B_B@z^#GYEwaHZT^O<}pvY>K;$XaG{BWJuhq_S52GPn2Hf>usE2T}I!FRY*R#C-qrKXZvNh%{}Rxu82ycZ0>fJc|O&PUcg zlpW3R_ZceTxwSNB#wKQs93SqW41Ilw`e)x%4)C+xI`=2uHB_{zQ%bWzPXh?nnl$7* zP^G~WcxN1#hQT--bDea&TVkTwLq$t*w|EI85kX5MBJe;Lk8|0v*!gm&>8G$aaUP0^ ze}3ybJwDK_sFIl|{3QUYEks|!@d513j}B9h^xLY{_r%tqclvA zKZL}E5utfGD8_IIZ<)q(F4uCXj_(b=-YS}sjRbYo@>M)^<-3rho>+|g;Hb##Mo5&~ zmf1Xy6gACNSp=9`b2^3yRC$5U54hx14&CrO>sTO#oY*KWy0xt}RZDJ|)3hyzhPD>L zQ;y1T2O@B}1p0b<=bQe}eQ~U&zAcv7aH+FQgTj_njbw@_>J&uM`ej}jB#KNPDp?17 z@x#{U>s<`%aoiR3vc+trMrdkfs8m*#GsWXlJ1?J-haO%__<_JYPt~p5`;UKBUDAr8 zOI=(PjY(Z_SBxbr=(7(Y?o*Bxh#(Sk*tQB>2pCOZuQQdWa_YQsY$c$%UoICLg+Jd7 zQ#9!#KN(Ue>Eq<2<)dYg91u8?Mlpe9^rq~$`4;eMMH1B0JwJ(ER}ghA7+x^}!73tr zVOTdI<`@KWdXHdjO5M|P`@3sAbhk9BlIasEnnapaX&*80M)3{u`d%yWgNS)gtv=Phkot49I2lPs_>BZ~lhGXDUGhX95R z*nSdAZQ|{6w^LSI;-QKqp{7}CA^0p))Rv7;hE^FFVHm*hR+fQd}_jK zY7R?wxKdJ2DTttd0LbACqag~O&6SP9hX=|&gH-j>9iOqceHz&9S4zv3O_~aIoKy+v zVW+2MSrVQ!A*3t9JU1MWP!%8%s}$7R>S-$Omu-V|taz(D2Z8H^Gsz1AO;Sc%!{EG# zIRK2FM~+)TJa!u9;2+E}Qrm6s&L*8Bsi{husR;^0!c@1Ap?)Pmap8_QIZ*) zvobyhQS|1)d7y&Fba-kgC94(C(n7LF4K+cKjI~5kAZ6lsWW~$O-oB#MtDv`W#nR_h zNe_y~U?*i9Re19+$Q};e#ubJSlo96Aq6x2YTY;=vXyC4zDrqg(2#)H|m)fz)BzA7ut6-r0Krb_C% zhw=F!Zb-7QCAk6J7#}VO?m(GWWVg>zO*O_LJwqqMaaEEixMgyuwh)tn$-Kc>_C4|s zEolUvR2H?H<;uE^A*hbYC^Y^Uhs9~#eE4M{%w&bh&!=^4X9Gia<-XBw5w$%OF;g=X zb0lcd%atn57nqmMKvu^faz-u+f71edWA6YET7dWUQfr`_kj}7Dmr;6>wp3KF3*(eC)3ue z5L-nJs+wu5ww*1ym15-#O$8f6PC?+sOh#8erAGF0)oC{ z>&GEMVWl0p)ee^R0t(H!M{yOYNnH#TAW`^yP!A%p5psN$am5C5$}o8hG+1nF3^Xrj zwo^yJ55*!>)I}21DNtMC-B{$Su`0wIIP#2VNsHv|@iyj|y|k>s1=UNoeZGvcmXD>|YBmgVN) z2Yh6n`rk>qYG`fEQE;iaTZ+PEsfOPWfl*>UQN_`4&5_7FnB$N!j>KWyR>a_HHx$<& zidjT)%fVSfC}O2oEL(?g7u%1ou9MOaj_E*1G?yyqC6en;LwJ+#N$M!lI<;scW{-*B zKZ;pd%Qt=~tU+czkJ=CRMw;s_IE!sbO0CMPoW%}F}YC0;9!O2qSsqJbxm#3y2AxZ$tQ;c z)6)nTF(BecjTnGI?#I)^Z)GeOBU}w9HO}EEZe7>2Hg@NdnJKRqm!U&Ap5H&iq;)J5 z_==7^Ln3)k1uQ^pk8D3$Hzluj!%aOeNQejZZRFzdtTH9QQpWcGVYa8~jWqycn)Dh_ghp08fV^ zGbxTkoaLA(aPC)3&wv`sdKW^!mUehy~Qg%L~Tz~OBt9a7F;p~ z<^}?&$o0VG*bEk$dsUv#8#EKF$WIB-gph_Di4#1DhA)!DIV6nt$ilpxQ>w97$!^@1 z%DLj8U?zCtFsX%uF_k%hlDfD6a6Y}V!x?DWwbuTiQ?*^5=3o>N(zuGH3~cCQ7jvdKK@YL&B zEbTmzy2v9a00t$aZ%`4GNF-E z%B)E*>PLM+sk^P7;ZH$bAB##1vI!O?lfsrD%Y;yjPBK6&FmON^In}YCWMx=+x+)Du z?lkeuVR~zQWo^v6nG$$smUtF5;?apCaHGmV<;WBL?42lFb|sr|+vBXHwu*`1V$1PW zFACybF|cMT0dwV1$vshsUvVDkYObr?M&Sj%_|}Rzq!9cxiuCU!k(T6HiSWX40O1K< zYm@j;y6w*n3kAl$k?!|qg!tkVs|$rpER^AppBE$+R^TuSk10AQwoSunpoPNlq3y$S z+PiX+8++AHK%6<$Lu~P6NR)+=ERdv*N~1C>A1MA@VS;PrWl*NC5>v|pQnXXm!xB@~ z%_6QcRz;9F8968k9s3di9^b5YTG(2)#YF{7weXpxTA@FVc&G5g1z!!6h5SG;$pGWm zOVZq`TJJQoY?QRxmZ*_X-bCb$kfV%0%ohMTjX_{R?gLX`c3RL7A2w+jw{Km%)RlAA z*R$LrcZuUQ3*to)j24U+h!t|)UR-$jfH=+q?DW;~*26=#ni^Uv*&!YrP6>(SZdfKK zRYxR}2#oi^E$gX!g2iU4zRS9)>T4qLxXT+oJo3}j;iN`@@lOnc{61L774ikgmd6paf2 z^Dkh$fWtqlI3r-Muvh@chykZ_ zTdn(qT%fbsD()22GEULU;f!)Bdt`K1d;eo=C%n9p(a*Aqj{{Rh0Y0T!12Uwzw zV~t4UUBDS7hn=udTx8^e)Yn?JOFrG8u8Q8?FDYZGxWiB`Qj0=D9UV2aVR?eJupIVdgf9bA76Q_fi7J|CJ@ zj|myio4*j`4=KSKb)~vpZnPpw`kAbj(F0Em)T=3{tB3IUglC_Op$~J60uFv?*Sf11 zwo_Hrs@j%9vq?QVNg^%*3bXU$hGL{)#z6ppMox)XTAOm(sw=5(qMk)2V>A#WES-ZX zBbtmdgNE)i$Px&^Tgbas>pZQOtD92S%>^x8QHnSce~V#?cw!|-1O>U=|x4{V%Z zS9kkWf83_%+j{r7LrNrQp_lk|0zWb^21jS^>b!wr#CK0Fnd-LvnWB>QRV=CZWad_; zYhj8Rq6CHnvyMTA2r10=2Z`);I^jOqw_E49*>ALS)K=sqHSI7744i<4c`7O3NA@$~|pEs1S;-DzOAdLft`Mtgw zEERN?>geieT45=#hxlxys3D?R6`4x80aUR0oND4&ZnZQIBkj66*k6pk1+t<^*yYNX zmo3ML3QG4R_5pR2779qM6%ofwUaIQ^rmCKT1S=dh5phIi;fa_P$nF_fu169`($_cL zdn_nHaj=1H+lZ?*6m?VhEqQ>;6mm$ZBy|W7N`uN3$qvO-WaNyl0oU7;X+7Y*5V@@? zmt#>hOwz3uRQC~qf$SLR!(?pRon7YJZ@=28Xld%*=e0a9Jag02s4RJSiXy!7jsD^Wjr&+&Xd-&nyE?U6mgE;Qb8mvWDH11ZaEL%c5OYm)A{Wb z0a}c6w@TGqsc;8wN@WP*BFlmh_hmi7?kbJ#b6A$&cQ+bKlr~=qIyjt(gmJP3e+PgO zpD4*-!MiemqC5p@qS!+Y3I;oIz`{bg?2W-)xUDyfH3QO8n#HcFqN1&f#UaS#R2A_U zocb@EI`b?*?QLw$?NdC-Ww}9cmG<>9n5cv)t1~%xqw4aDE`-UX?6^kzGxK-S0 zt`rwrlUpsbJkl&xrdXzkMjr|!O!I8M3NTzF1uen2YPl}$x$TlFE^kX0`7||44J@&U zVZ*Zo<(@p$$L1^w<&F+KyC#-r0SR($&BE1#bLw8@+J75YZ@f}mDJjT`tnnyeEWTz} zNj%Ctz138YkvUyg?e>G-)t9<@6Kbumr?*EnL=wdoQb`Enj^{j-6@JCrzI}keu5O#I z4XZ&_T?Mwd)5#2RtwpgKXN?f~cosv0k{67G9H_@^0p%^`$yZ)Qgsh6V$?~=`28hz`iv8<&xLYVAr>CW-=Opz@FYu|#sz$PTiWNCrk=rH0 z`{Ph{EGcxSCaRjQv8~mMMD38P z{t~S-SAdG;4jl#;TH<^en!*ts_ zvWAUos3hGXYoPdQno5<7%F3Z*S)->s9Wq#V;u|0U0Xpu(DFUP)ovH@aTf6#~afWF2 z~yhRH?(_NDk_F!6=-tG>l*+a>EV>H@ggLJjS8t#_<=># z87Zyy?X+rA2DsZm@ntlEDE=m8$BObsv9y2(z-D0BD!qtaT14={Z7mAg<5^!`?^Snr zel@GABzozdDmjeq5~6ir6?`cP;J?FeJo^lsdYr@i^5J8NY`2Q~`Uxl%&+*`8js%iL zR;Y+g>x5vTl%8J4%19+&W3}4t@(te$RU)e;JGCIFRAy3AQ5O&iAxjX)0CG<+uA)=# zY8|Z$fAC{Hmfc$mf}eAlJ~>z;lyMT37~-kOdICsM$f#$tiK3zZ0Eh##m2d7#MW&ae zyJl$Xg>@BG*5NGX3bja=oDs27%iI+!dR^MqYH+ZXRAcC=e9;S+#b(R_Bjo8AYpOBCKTVW@(!VroaFuF2z3nH@`<;|{Umije2G zlvd8@hU&L&`~6PhrrQ)ETa{%*RZz4~Jo2-Yc|VCzKx~zEWmV!wm*f_Da|Qa#JaOEXr+!d4$0y-5P3ET2e~c|*FH#Qa~$kAeA2duQ5=LXtXo3cw4{f5ZgOFgpM@n= z#+7O=Ycd`oqF7%MLzZ-6WqfD0NXD6W)s}~O?b>@5&fW%u(8rbVX(Ev&KfX7a)cFT-zzjk>}WbUDfLH z{{VT_+i2~zG5kHkS=md>Q!E-eMlgI<^J4&V1h^pUFImoGK=+t_-I0b@D1S=i+*Dg~ z{{U)B-NFg(R|bl*r@@cFm5D?I$r_0xW<(Na1y{rX`lg25t=p>EcA~J_w*^b391U2~ zAB}0G@p!k5D2#~IXOK(`C@bW~S=M^jRlO|TK-=`y9YDF;V`-xee4xB97$T8Dd73i` zStCABJM$zkDo!xr)Lr+wqSGk*iGU88ftxJY*Z=)8>;V*EfIemd(GlZglpA zwZe-P?uND-dh@7(W3GpqGWfA1V7oA4$^sYU9fP+n>)Uf|-gf@?+tnL;Wzxr0bGXWt zb~|#{(azi-vQ39r{1i+UWKVB4K_^YK+-a?wZaSIw9p2Ato8l@Zis2V2DrJ#V_;IvV z4;-o$WdIWzsgN+vMomT4K9^AKdu9HwZP#0=Zc_?sYPhCaimHg@k-3V9B!>|~Tu3;c zOXDkW=-Zt7&eb!AEDcPPGk0wLUC$Y{l9nEHI$E z4tUQj@yP6@zP0YHp=sMNw&14{*Ij8A?y*5p!D|tsJPN2#T=O_19lbCDhY41XwHMvn zhi?t3@h!Bj($yBBskewDNxVX?WR(=M~wTg<8 zqQ@2L&jcc(8?|&oGb5yq%qpM61fh`Nh5&-fNWdDeD6AX03)S-Zw)T9xdVyAwp0TT{ zyeOg{!ci~{5qCvLl&^++VR9H_Hg`_1)g4{3cu&3}r=p~9iK|Jdrl|sn`167(WJThc zS5Pp+1cGyhVVg&A?ft!7M?<_isdl<;7-Oxp+l3WUh}B$xl+x13zId`SIb$9e;zFDk zLnETN-|qum&Hn&`eHBSg8^OZ*J3X6rUQ+eAEXzDp%!nGE-d>s+qw>alDuO~cBEiZt z22=+aIRb0?k80Y@QL%Te>f1;ykYW?C*r#R@JlJEma1g z>w<{uJQ`#OkxksJPDGAX7XSt1qa(6ewbuE8>5fNs{AhoL9Oqz1?|qS*4HT4=sk=6# znYP7nHR%jAs3NI6RJu(p_>s!2{D1+Ik`SQeW%iy6Z8eUPm-|sbXQfwZg>i_rB&HNn zd??kpI+gU3@iAo#r4FiXo7GF+(Y#e{`t7rMqK1jq6{@9bs-GG0;&xeNc;oaf$P{J_ z2@9s1X48`UYq;+1k1eTZesy(rso6r)OEQA-$1G|kQX`Lug@Io`b_}ROr-P_RSWx^f z=l=leDA^%s8&Aw8%B$p*b=PZF_qNAp% zg`=pArHH_JaYYJSJU~RmV4m0}JgZ4v_m#JD%ULZ{l#)XvRPw5_RtRJa_HWZQ3q7 zri$TnYU-)JBko&lFvCqOZo!#^81Rl*WEn_u?T}6xacXoAU>&oJkEs6usjQu^G@Ulh zCC0#%RIdwF&jcW(uB{}|pDKVQ?A%Txiy=z#$;sjdt?i}NXX(T%OTH(X80r=!dXUr0 z1S;-uWOL}PklaUZThubdPTR3gdzCJ2T2pFE*fG7l#Q zhsn;>xh<5tdXA>+YpJ5Go{#Z(3fKs|WNs31j|G*;Z1W%-DeuRP6WyekJ{Mhbn)urz zX~A@^(%&0rb*!-1FZQab>A3jOQ&mGLKz|7#dw@tIKQKqHZ7{_Tg+C@&1Rh-YhFpGQ zxczm(eMFaJG$$>TJ*VctcLmxgf4N+CEW%m-tux|4KSw!X}# zy6?ZVZtSY0SfiR6n{67T)1zUP=9EOizX@D2uW!Z6UfW5p6SCdU&2pyF^pBL?u8wg| zBWd2DVU8imq;}$*ex&yO^;7RIq4c&2)!Ox4K)3vTOH7hQOEb$dk_&MLFjOB=<|7@w zGBr(ZTMya4dQ}MbM^t)=WVl^pcwx9pc#>Eq80E*828@0okOG5{Gn{KXHpke}QA)G# zYEA1+Rf_6Mt5-64e4ugzzC@8ZId3a^=Q@1T`9T8(R8R||P5hHC$>_&TBfeWVT@Meu z=ux4jnljZ+#~4`*@`A!ZSg`QQk8d|}cJ;%c{XE`#W}6ZDAV>%CWargYDLSjuExB{9ryWzY(oJY%3sNn0Gt0#KtZ2>*gRmTek`71LS0>!u z`-h;ZoRQnNmx=WE#E-?iLJ?C&96dqL z(F3%aX-%=jd@KB}DY^ZVc8^Fe6Pw-HcSUU|@#&-BA>_P}1K@H#D=RXC#hq~7@r>%% zrnJyiM-4?*^reBTY2Lb-ZIH&3aK{%`bY_j)m|@|wXA6VroplcA+btY&?s^N{?OwLh z(L+f7EI^L#5nQV&I2mPiZ>aa9=G(RkO3KRZ$xLXcpNUwSk+}%h)H8Q%`G5=w#sJS? zb;k`vq21JWD~`~)O0m?~Zpg901bFOYh@q#2y_jHw+a%+% z2JG6MO4#pnq1yHuhPF^DRi)We!-insF=eM9umiYmS>uK$8OteFb(3;aLs_?P+j_%M z6+fDqvb86P-vlrX5R=0)1?~t;H=$obI~o>vt4<^vdu}#X8DfF_x9FMrmC|3b-%yP@ z?2Ap`WZvqZ_>$7e@mBFSGOnH*U;qyu@s$H4VB;Du(~q%dN4Ax1Yjuq-+m@X(@YB-P z{oNZ72b98m>^#E`j>9ag_Nua37#o#+ zrg#<=80{p8?HqX{0geCzxfsZwaNirPu5nY}w>5R1C`W-JkkdsW5Lyt z0j#L5HtRi1UIINljueI{g`^ogRixwXgX(krbk%?Aowle$W~tkDtEFuoBmV$BG<<^b z2_R_)6m|iDDZ?WN)Om(m;WKJSgUkCxf z_(SzLX6}77PL*s`b#xTc{A4rNW+e|-IIeS!=O+hG)~>2L!A-YrR*Rh+wISIa*+VsdjUZ8lRgtmS zf!$Q6Y&bre=ARGKnLL0zcOHp=xu97gJyvbn7_&XH0b2-T3riYI!XwynkT_8vy5JrI zkFW<(s%<-l$k@5aQ^Y*cngqnL`f^7kqahu;76Pgub&} zY=RQyE!w2UAK{~50BP1p#802^5uD>4@&P#Y@7q~jC6WgMrr*z!284WB!YeLGQUN4( z{{Tnw9rf&RR#8$%aF*RvlB!7|f~uTN;gCNEVgh6^9#ie}?Wh#BmU8b5GfaV_<1Do* z0LQpes$7ow?ScoP$9-TLA*O!GK?#BTg`!k6V{{W&u zKH!{aoRp6Qk)OG!VpR1&@fBc4x{>C-@k1~tgu`ukwWba#;`ppka7~X8gW-FHzH8>8X;wg1VwbJ|d!i8CeH#ISERR z-kx0gchHJw`=Y0nveQjZDhCL@c9qq;upHc|ZpqZW~Y(}=_M5M%@FvOxxplg!As;tDJTmN zapCvxgUI8$MV7wLMP2c?TVvAJDlCgVW615xJaDY?h4m}g{OZWF2K|n=8W{C@33BzoWlY zQPjyblCGjbAXz83(?2PcHb}rm<(xNmB#z%)X};52wuK?BmvK)|ASPOyHQLKkRo$5L zFv-lGe3+2gKz)8%T6_J#Q!o|Gw0*~>SF#iT}?m|s;_=?NarU5 z9=>c3Ha+R8eZ@P+Il9wU#eG&^3aV(GKu#nwwtS$l$MFyY-@h+ST3bJT^!A5uuG_!u zWu~c;qavc)Qk4x{Z~!t1ioSD7p_@J-2Me!7O2xsE_(4p{Z8f9`10s@xG;2a3Z1lJqK zraOwqS11(86mgDJ?v9g>2%jk-5jz2q*+9=>^VVMw@cCH?BRft#YvO`ASWnGVJx1Bl zeditarq^zuH&{!ol=UAJuQ+ewGvhuNGD85}@>{V70u6%5^Z?5hJxr1$u+%*jHB-?o z+9*hIOzt8)qhpUQ0OS<;NY1P~&%JsCEdL!E%|Syg=z3p9eEzgsH$DF}NTGJ;a09GL2Of8?x|{ z#|2GAMA5+LKs7Ay8BfFIlr(HINy90|PBE{d>Gd(s6J!UKg~E+2tERe921@&1z{^D# zrXlUnFA%vIEF%G%Jb-M2<@fc}>lW>;vCl;GY}9qFA{U&ZpNNbeIU!d$820-5p5)E9 zsD2eZ*1glWDe7&Nb9mEF3}_^05_9BZIae4gJTv7yzJp#~c5SP0OH;UdbyW>di-Pnt z(Q$MhfRA4dy$=uyjNmr4G_~UhcMy%G(`RmaN$M|$?%SMlGCgf721Z=5E>)M`iS_P3 zTxwJF@}X@N5!mZ!=8cpUk!0rFeM4n&mcaUV)k|`c?Pr=wI@(DoU!F`eQ>rJ52*Y*& zGJruNx}TSGrYl|kw%JJ#wN|W4P7xS|bzzQ2kqp?wu^sSzf0Sb+8cG87?dxh(Qc@+| z?q`xCDv3}=;{-1sE_kr**!=Vw-Fmpi9Bj1j6yl2tgl)*=~ih&SHn!L6EuKwA-jy80F3t- zKU~1k-A76fx`5Q&s;jDJtB#T3Mr1skE2_5~5L@&hXFb1deHu$oA_*mWaUft669^+7 zp}h&g!6bL(qt*LR!$&nmuBut-q%BA3$Bv$kDPRzW2hHx9ZfD5IILDU4&Cs*(@ z$n?}yiAya!h01u0WKsuU2*^HD>F7xLYa2xMt331Vi;Z=yiiBw*t1uKP>yj8bIL~aH z<-WQBOI;0Ak;13#uz)2eDE}ANq$<8hV$bdeyemq;V>EUJexCcE$j~Y%%ZX zN62GJ5e^Y=Jf?Z~?)tjPOKg{UUmBX2oWUK!K%l+@mEr~fU`ZfnwlmmZOf;0O1$38+ zIVOr9BFeQY33Zb^K`NHThDjdmS`i2Kx#l%MMe%v;du_=l6?U_{f3E4ZkpQ|SZKjyRg?I2Ap`e4umA)V3Rs+y zM{IhF*-FF8H53hKww0{7()g8h$;KFrguVtEHs(nS$B@srd;mKDc3X7?E$-i2S9IY~ zMk88a=*cP`Y`}(7gM*x72P3f1%PlR^>$!17StY$15FFA-V`&hu4atXh&nC$}xIKn+ z$8g%oMNaoCeDc)E3-aY6jw=&NsB&?VJi`a;-?oUxNLC-4QMU%xvTn-OsHGKu8CJzo zY_g=11K*fA3-u)adWUA{4dU?=TwIziXQv5^3 zEmw;ag=S+n8GjdLB>o}m+Z~QE?X8sx?<8{6%Q&7u!;8BW1fIvxY;>Q zQf!4_bx&z*zlF10Y`dPCuD;h;O>HF+ z9G*eFH8$&f*nS)|^7J2S($mvR;vBU~)Dh*3E4s=#E<5?7?#DgJ&aKYuLI$wcDy*iv zOHp#6wOf2Cs_I!`jL0$=^2o>_0!a&if8(ZWjiRq_-s){qBQn7tWM+w%oMdHKDZ#-6 zdug=qJ6*l)*LUdN$cmoc&S)N<)hr=q@^O{qS$Rsps`g`md3FT%m%BIQy;YLmalcVn zHvPha87bqeq^ByiV31WMV)#%9JV-)8cF$~a%`;2=(4}CKa)Nl@A8w9m*;1m27~+w; zG?4dYjAI8O$@R}?`6wEXUtN2oijQ^d;;m6-sD{3_nkdoMM2*8N-kw)b22L}?=OeyK zQ*Hg#X}eNe_f?PLZKY}>f~JXK0)9`#ABc^(O1UH}cR1zW10zj#+TPn*{w&e$OQKY( zt3XncQdx7_KvW!LgWQY&wRX_yPVU_Mg4_MC zrh9(YbK_TCO?5Rg7`(@t%QK!{Vl%~0srT=uM8FzN;T*3fg=It8+qRo%-lnCimKuv> zys4!KGZK#3kQO77upWoozps6CS5LN9&)i!=>9y_KeqG04z04|wG?eVoQc629f^hi* z+y)E8mMVMduj);kq5Ediw7of%YA@s&maZDrxYG#2l2Dn86d-^DBOIKZ0fDNbn{{38 zOC=?3b!^cBT1eVfF?@q?7*Xqi+u!unxxHrFEGpg7BtI(Gyx;oKK!ZIagl%-0=xE}s zx71FOs{a58Gdr_MDC314${c_J&v1Puvd~SwA>Dgox_z;5rL1KZs(4;{CUB-XBW0EO zDzGjv+=vW&jA=H4`M7Nr^tU=It->1mD9kjoEbY#j2;+r0%623GK7F*owfE(g!7Me^ z-9C!zB()RN*2^v8rA=JV>EbR(06ti%ac2Jb874j#mXI*1k~BCMF2jZ^F71LEYxOG7 z-sAyQRg`4qzs<16h`1xk_=g`{1C+hXwQd`86AGA824bky4xvkD&^CR3osZL11wYzu z=NE}jaoAQV;}qgLWEC}Wj~vOL5>w)~RaeRs5PJex_tTpFs%etXQE#Q&Q`gN0ptN0c7p9ln~TZg=jV(8(Ul=_B4R2^z~#@zeJ=u+S!F+|OR(No|@H=_jQpDuHb{+;{l%a_^jWpC?*_X-O|WOsiC zN|SQ4Pw=xspmKQ}5x|dLMc0w<-``k#6ISmFd$iiH;HN8ls+f?vd zVZ2bAgz--r)JA#tv&n$Ix zJA$r(YO+QY3YSty?nyv#p5ziWXum-BCDPyV5Ou0MxR4c8zF6X{4H-F6%2tqe7(S!u zG?%@$r&3m?hiui^wzlSi#ZIe9@K8MufRB^J2%aA2AL$JG{I%+1@hB!BMDg+Lm(o4L z4OwyD+nW6xk?pGMO$7ug1sx1j)ipFU>lh1+s`5R4k~Oxn z(O|5ppKIKrB$hYF53J@|5vk6i5R` zc{k$j&D`a1NNb%}x1PyujmEKsT3xyUdZ$_sj96_GT^-VrI+<1`WI_W=Bu?HUCw|Yz ziNVHoS={XlYPi(W!&sG(Q_5gzVp5qP<33^76X<_@dTXG!UgfCXRf6+lhSMJAr-Ep1 zbn{QmXPo&SSS4m?WL_W${mB{gcGYK9vTE#gBCl}4TWV^r4pnI(NhVm>kXXbRa$eoC z26S<~)ox3BKs3~uO?|psA$kZZD z>8YTrL=dW@l4T`G8D;byn8&H?Zik_j`{p_CTV~~Fxg!N>rhz4;b#C2~5*N+eAB5*Q z`s!r85V6`Q1x>?t$tA*BVWWbQb##d&e3mW{IAja};toh~aeeKAo)jcUfPw^&6#`HJE9w8*O;qo>(okQqw!GzW*`M;RSXZ%5Ir-HbmO*f zlzSQp=H0uS;;tyX%{(+Np~yAD0dE`PN_nnw z?RJJ+e=iH64DN>|{72>pESVr6&tu!)J0&M@b1Skk-ZHY>7prd7qNf#9wDMNV5*m6a zt?;!X(=?9A&g?^;L@C1nPs^~v()AY0M?-j^XbQ_$J4B^pMG?eVjuZ@n0Vh6hOaZLx z`h{$vxJ_4KqNO#HNMw4NhCG@<%Z!AMAsgTDp63`I=ywa$HCK7-?)0L$*;!kaL$b4H zu`CEI2dDtAx9aGl-aO4hM&1fysaUV{vRUK!O3S1!)A*y1SByu28g>K~#(VnX>7a1S zxh)gZ+NGCNjdH?J7DMEIypgng59@ax!X4MXtPzcGtJ?Nm_(jp zvG{@fF^9o9C+bISZ<}|;K^yKEXz0@6Tkr_mlhM&Xn9Gqv9l2{f~mLvIb*meLe_azflMYyD_@dT>H(D_}w zG7AHN^8_B*$tOB12j3SiqHLnaY)YDa6;i3-A0OFBE zRk6vANn&xFpIrmsG8`0Pz;YK0Nz@8^Z5W`Xud0fY7m=Zbrj>wa&msm#7SDfA&pKPX zZuz;y)>=aL`QhOwiV9*vo!MUt$f-FYv)||Iuha@l57-Z*&LECeYgus|fLioT&i zU&LNQJ-=mkucYRvEz= zKAJY^THKW_%kqi~rN&u4?c3GW{yk24)6&JvGh~b^p!s9}08=F1{SW&i^*^oGT6X@< z+-;Vaa+B9xDcYKySJRGo@^{JX066cGJ^D}Vqq??r_kK%v-910rcDgIv(#>m*g&fl^ zIPfVHWTY{%504fx+^7T+0PL%mS9WIGwNuwe1Jx~Ec(uh%X@#oh<;|Bq9DV#X;z@5n zz5beaNCW1=8Z~^bFSdW+%dl;&$#1RQ8=`CFEhSm_`*l19nmU*<$q{5SGplj+$FHYs z=UoY9+5Z4#O@fKGrRlA@-91}JZp_w)X(#bpim#4TGy0NSCjexfS-Z1!3yob3Eeugf zB$2&Ja;QpYk|n@l#$PeR6z_q6eNKTJwGG5n(

v-vAh=t%R^X#|l_{@#gmZiN&n< zR08=;w%Q%Jwk)4=SZq}G%XKIUl*o(VuZY;mBRR=qp6#5HPkiYQs?+ZYEEIcNrweqn zK|MlAaJx~>O;1ZrO0C9tT1QD}ibC?UR4|gB zOcJk<6gf~EE8HBZ>{qy}uTuI+yf&p}yM0$&;iJ8>i7gj9l+?-LD*|~e2hiYU0V~@C zw=P9ycGgWM2*^&B`&8B~l~2>VE&A_ow8D<1{vg!U6N8>pPvSW&T)Fy>ks!sg^#1^F z+pRXMd{b9fQQG_kr;4)UEl&>!j|xJrO8Hq-gX`IG=ro~e>fX`b7QMSqN580cy znupTKRZT@}q@;i~5D>xel;EX5B7CHg$mb;X_9xdTJo!9Q2N3wvm^vsT?9siC`8NU<`Mcw(Kugjc(qu^5NN=aA(jsgk`6v}VuJY9hE!w7{oRwCV zN`in+$G%oF#NcG;P2YFRX}7(Sj$sulR0xY?xNcsoKN#(AQ+Tx)7ylQX)s zi~<4g?gkD!XV*TOueUbxhFX~;psbbTe5yvSI3C31zd`f;^~{DH@_7X%zCcD%o5u5! z*K(G4>w=_!=2A?Dh{tRblh_XZv_9j0nx+iTF^$J|^5+YHz>I!lzt>BV&0Sq@k~f}i zG5C_maoFS!<@`snI5_Q(Z9=QR!%Ig?Zjz_Qs}bRxl;BeXj(c$(hq=lAn(4Psb?UR1 zUv)O~HB690RU+J3%xq=wWE|xo*n|Xr5EX}SsQKwpfDJ4#QQ}Eh1$o_z@XE6j{n9g! zV}g6=%|*r5oJ&zt3=5Hu4p0?={%qs-#(Vs<0q!C@m&L$vli)Q$1bIhdq@Qm7-#u)J zgmz0T2PHaM>L}?ZV#>klz;}?!0-*Bo0|PydSg}3(cF%Ls-)70=soQtU%{3it)hlxe zR`_G#sE09*eevA6z$cGvfu8(xUAy_bFHR#dMafw4&vwBI0rnnJ2fj7>Y0wRgZ`$8y z?X6d4hv94P7O3tQN!Cs#s(Pgo<>Lb~s2ovy1=bG zZGEhfQB)mg5=g!oa#*tf$B7J820H~H`xAyJC|d7JMJ$yIUvr^j+a*du!y+62NK=qF zf!_zQ_XTykS}d2^N{e--v1#k$Ls=wz)~21o^Ql1GC5cCwxGOdjBg6zSc7-YFXG^7~ zI&^fJj!_jeekoa(w2}5uRJd&M?yRRhuzJpDb_xJXc<#B2uiZf0Hch2Z4#77lH>G7- zUuk8EI(Wq#6vLeI$|NBX2Po9@JX!WcfrphLnX0o*9WJoyQNr~2~>)voRy8!5tb!LkBcO6F;)jY zZ&9RB;Dq4w$S4O+ww$|8(M@FD7TJtdb32NLiKM8FCI!TEN{ShZGkIH+FQ>S{*SjdG zBQVwNt;a)im{i9SuZWUO8Rv;0l@~3J$sr*@{ut~%bZ@4;R=LBz@7qdyU9O{PZIj?s zSA}(w26+oas!%e?&3P7&h$x_Pe*AS>Tq>wGe_wY#@7mN?ikmj*l_*}{LuRR#3wl#T zukn(PFkA@71Rd*@ZnFG@G&!@OPg_UXLbC8FEasrPN&Vk;%qmnXtm)sdIT7?xxy+;y~Mv`G9Z+#9e4ug20D6;FRqt)#y+t)GNcgiYOU{tctdrD5FL2G_nK@^OEzLu5 zAOno|w`SZOIk=>EOJ(z8)6@JsTq|ap%w!ER zl^`7DJ;=sKVy9hVvQ1M}xOZ#VBZRb-Tw%GGs$zr^73J_uq%!3@_(7Z!Kb3VZd)?0C zL@YB`cr>-BVM5i7F~VS!V6qZ2F@xpEBO|^8OO7ZZb#Aq9Z7tETJP2ajR|smTqpNyZ zXldgnDmEEBLZ@}hwhH}AAAFsIb@dXidzA!qmKC(Qg_@$inUK`;EO?GG1q3SNu=hD5 zwyQmjv9|`?sEAXRqK@Q16m7<(6ySdlNXz1>VBLm&yI}g-i?w$Qh&fc-e05AR#X?2{ zW060@P)}p{v5e`>h5Uz7Q{-pj7NOpS+}LG~NnnPPn2Bh`#k^@aoZ(DnG6rzLeAvM6 zs+O`!t4+G?9oukEDtL)Y6+Laa5qB$rzRN(BxFG= zyCQ(c!3uGV1f5a;0L1GkM2xF&Tl(+4cMaw{-o&tkx7_XYYi@X=rgt@Tk0t`DNq`mn zMDqnwtiFVUpcl@G)=6mT^%T)Ped5(`L}iH@2Z6)OB2h}{;gv{}D#yBrv6Tlp6(;r@ zp7##psM?h_yM;0vC9Z7^XO>I)q zC*8BdBvC0@DT;(r-e*#Hv-wl`ju#~B7Oz`8AT4mi6Wd{H>BW+|$8w6la7{-|T}L`e zPflv15~M{kC6yJPNlB2phRkd-;4xmt(M!wIQq{^XKz-i>9FhkTNdwHKms#(fMilc=)A&4i6(qJsdgA_ zk^%EzVAu98uWG^JSh=&2&6N(Cfvz#tGvI6BbyOC0BxoP3hHjqOCG@lRs5 z*G+S{bv18v9K?_pwJfsI#H7Yn7e&cgBuw!HVUUasI<3=fR8myjY5J2JOerLxn9=uPd@bq=n;tD##$dV-NhXu-$+4~ZEC^#AyUBB!VHI%eeT}f(~ zh1nRw*BC?7pqUVfK^(PJcSnJhSx*?r zhb4z^5M!PcI3%#h1FpL#X4$SH@-I~O=cp3a#95rW>Vu@+`x(Z~;*ldm8=*~UrjjThb4 zmv@TUXx%Dgtw*2342*#R081o>K+(1d1Cj0OM{XrT)3)}or#D)vRi}HEv{F@5J$gkv zEa9Vho+8Z`HhxEvD8>Q7)-l?)fTLSon|oJVBe*QFt#!VoYJ5of2}?-QGV|g_89Sg- zR0SksGa-n`=7R5{D|i{CcXVB@R5Wx|w31tcz`SeA#;pDqWmQ=@@?Pc7CJbB93=Udi z+V@MH%i-o*{i1tBgW?uACzu7e zx>stTrnpn?8|}tBO;tRKR@ql1QQM*o>Ig!p5edc!A24`=Cv5(pTFpci)m66HYaJwL z>f^aQ%9$i{ZfBA(&!S;`=L)(pS3T1AbZXjKdPyi?gre05kKAG;o zh9QiWPjs9rp~^{$%hQUxHOFYBvZm`xTP&3IsZ(7lIi3kje9JSEIPpEk2O}04dk{Zy zbPuNsYBx$vgerqXt5I21c&S;VWnL=sadPj#keM8ckb8FTVMSGWtfaTS?$JwVYEW3w z_=y>v)nCjDdB9Luf}xH_t1cM*d!>RJN~?77Eh^P9t&XOh;g+SO2v;c-h(KZopjGTo znCTwXByKHhi2AG82%;1Xvu~GYZP@5@c0l=vPh%1rWw%vUj>L%!`g|1z0y;-gC z$h8#k%U{*HD%haIcBJ@PT@i) zC5i#XPZ;?g+_HSfM=@w_?xyGZ3@c^(wMY)&u+v%Z^fdd2p@#D1`fQ6O z+UFbFTF*xFz@i#8c$s2Y!9Lqr|_sCWF3*yOAV>*FK+nDeS9kuQPRU7 zHBL@{g;0z9Y=Bjx@biKWPJ^h)25gSw{UX}E+m)49TVvN*lBUl|QqnDDL6#?3GC)aT zc+99A9Qk~phArmw)o(RdR4-RatDAM(ZPxg1Q$-yebTg!Ctx=T>#5ztmiCBAMxK#k1 zS}@qQF3`0{HOjW&w)o^{hTbl90hI$)8?XGMb0Y~7W3bVFa_mzs_99O@(w92Q)A-_{q-X*2@V?1WAk~o)`B{&p7TOem4m($do>KLKB(=Xo? zmrI4R;aKY+p_Z~Xid01ziC>R6&*Jl=0;J)T;{z~=hXT_|@ZpnaX65NkhV<{dHl-Al zw}`4^mF$MSL{k`vMvfP7LbDDyR>z{KVhIAjn|RdiSDWu!6pLAHjUs3&skpcSF(7H9 zT!&s>WFV;k_>3|cc;gr(>vrJj<)-%TC}Ez8qOO;V zH54Ggqr?CPQ5vB{0Z$*Fus?|9zoeC$F3%myX+=v`l{F7gCZeSh!5=UPnn;csKfrR0 zKV+$9I(?UNW8B|M|&p4uGto4wxJw+aX<=q}<>EX`10Xl^kAtt3W3 z*&Wds6O3SEu{nuDYpu9LEiJa)C9mPpBU<3fykK`mF&P0U{5-=QfyZJot&NB^+ql6w55?po}xi8WWI7>=-D? z1Rlh1qqpwrYo%$s-06~yl~SMJpjw$KKZr9S@rQ_|8AAY|MaPy7dy@_T5^$jn8MTGY zEcQrRmfPxn9wd2&G_7BCsJTsUcnZsIF`<%KBv&-! zGAj5_oc<-?ONJR-kiDBtvQln2X{)NM1-@A+?gFhVAf#k>Mm$P*k<24xA-FhFxjFUk zr2CDs>1U{^yW42eqNehmB_U(*HE-K(_l?B_HyXP&ObuB{GfeYBW>1K5 z60C|;$heUU^1vV*1CHd?Yizw##S|1CC*Ls5Ad;3kX;Lo?zwxA&nRu*>P$=%4PiD`2 zY3}{Bw>3SslDa^)+KQ+`G;stl(S&ZI;kHNEaN_4h4Xn=6jp(Lp!>-~cq%5c892+r_E3k%3$nQW7~lwR!`Ole!s%YRTjd?eu5igQj(Towi+B>#1yHQ5H=?QV!93T@4m)f1EeYFepj>j{g*f|fX1NYlF`N?BNy9vMJ=Pbm16AZWe1l7^M4hT|K7DrBdU z8++13QZ$H#I1z!!u^zYwAb0f06C++W1x_>)r2(jAsg8p88~yE1Pcl`Df&K?(Wem!p z*+UXIw{Ta~mC4HAX`}e6D)?`;_X>)Hc;|A$NYZc*Eb%^ta&p+qFK?l{Ceqq=wz*bN z2`T8Lik_aC14$1ExEz)P9vQ@v9_kM^$T&Fw_l0P($4vz#0Hcz)7=u%x5lI@zy_t>> zc?x9VP91{dS%ZA#fho?gv~HHV(AEoeMQ`0!YHF15Cv+-{BeqUsGLU(4%M63>g+26A zD{ZAAG*_5w>ngb{w^99m3JInW(n4+8fkYD{VzIo+T(&_@_WlI6Q33#fjqBJUE6$^&p&UrLd*s znvexVVgXrM!Z`jWB}YRlt&q?zL~@v#o~Oh}5qwzHW_~4t6d;vhBOGVGD_aw# zkIFKb!(^g1dU~s#(5O3ig!8KuRcf$}D#;)#3p|4=tr~`6xga-T*lHan;gX%HWvsSZ zZZ`U7f|@zGETLJ+%f}R)r4i#QIH+Tc5&^(v-WDrOb;93dj-gG0ifC$0Ep02a&JZ{N zki>?@M<(?Q!IbvWbQSbgpAr~$)D#ibTi6QP9#J08oRCTZ#hviMfdPjV$8A()jq)6k z=&T126e?=l7VNB8uTs0*Vha$JCyq}E%Bei5yg;lIJ=L-SWcBVePO_H4ZmC`6Nn1V2 z<4sod;(0zEINcGLaVn|7xOyBo3UPy+ft8_9AgqXaZ(eLgWErc0F3Bum#9>CSz&Z% znmVR{%3`>~R~U{)D11P&5OCfiXBf^sI~^42Et{pA@{uU6vD4i1Qw>0RuOK-qV+EP- zi%leZh&#KL2KHoCDD;$jzURD_8X9`JW2U;v7=TBNaFfIE*r?*CG90&j@cgyV*2_)$ zj?_Nrx{F;*T;JlUq+T@W9CLX>#_9s56CT`|j&fU7$4_@%#{U3ZCatunsjcy<{vFt= ztkSV{!Q?*)^Kr=@p53(JPe)H)5*xktnmB1@k!giRC}xR*mzy$Yit;!kE<<+*ImqI| zcgSc^YNj*>ms&V!E;Wr@XhU6TX{jW6Ws2t%4OJqbR7H(YB#KmLE!dUp1_9EJ;i}w} z)s}i;BzCHLlwTP9Om&i}k}SiKAZ5;2U;;)705=>dP2YH~qPF}cOVHh|?IVSG=%$@O zk(Cv2k052p<&^+=kMe_*i(Sh7ysPUdzW2A&)!Jr_(mw)3ZeYj7B{=ei2N~p80ggCq z4!y+2@7rj>BQ~1qw)DGxrZ{%=!hz)pSy@@|l=MV zt+>xuQfp+20Uam97FimdM-E(qlFCGEGFKp>!6OTS*4u^R}z~W#N66p;d5Qo+ZK;In`j_o>7#ZOapyG;?ANQFdn2(8P5bDIoRRgO5aAW)sy z9Gz8rH>CA;o6V}DYHtb(o29nmvUoJ^1PMClnk2G}NHNDCV;_is2R&N*j>)}j^EbxF z4&tP$wyNCiu~SOXG^)$vi9ALGabk_)G>bC$y^cvb5q++PlEq0k{x7x3T8&c`3}_5= zPUNIbG|ePx&VeK$my-_{4jhBa(#5F}!_sLP{{UZAocivK_r4?AdbOQ_Brpq_i~}!%9Ry6E^0-si}*_nqBtoPkx{WGJgQ0$ z%;T{c(#&_}z3ux&x{junTa{e(RJQr)m8Zo+gew!dR%nO~BL*jfD>3vVi;YcFMO0de z>oH;l+zACV?o*d3@Xf=Dt1&H*pt<6##If@cwn(0SDUEk!7V8E6?{=1kQN*=8^!)rt z<@mGZAhPm&_g*86L;?nJ>!j_ews$QK<*d1F?YB!oX|g()-m;kyD&Y{QWPA3 z0&*T=J27KTqq(m(-x9BG+-{FnTjOJ`si~)F8FQS<3FXVM4nY9m5IYSF-aET-+NrCd zwr%R!jM76bN5|Y{SnZK3cwj(8n0zziE0)V4006q`!cEXd`gbWWb#)VQU$+ub-YxXE zDk$n#!hr--;aOC8vlwC_qx=Mt94-ks9Gh8f&ZS91bCYjURNMHm5-k-iIgr$z=a3|p zX22x8ZW)wddH_Jx>>At5GqsM2fhxWgC!Ur{#aRRq$U@YK4omS;uH>F$4oZSMm9+FC zzQuW}x>>GkB~QepP*g=lJw!;#Np_Dah=90d1-lO~;?FHT(ZcfL=VdLTjqOYu*LYhl zbaY=EZIbCE=0~ZuQ^uYpGM?R%LHuwB5HJreWRMBQqt$GyMf$C;*7>2K@Y+9HxNBjpg5yla1d4T#_>mIF${gba zsVdFb@jaaD<)zy7HY$qB23px!SHi2PStN(Pi9&F@f3>6yc zYPydNzd`y1nji~odY{!<<9b!oQpIlg15r1K^pz2-M-&xmv2VHw$ce@YMZUrc*|2LTs$k_$Q7l;j!7#h3PUhe!7cLBSvS_+ zy3pP2*N?jBsHB*~CDr-YM;siCutw08Wy@uXxyb>&#`fOc11o zq)jM|#v>p!WMNy%r0D+uR(e;`jpt{Za!?AXr?<=ZnYzrg%8)s9kVGehxJccDj}ya? zvo;i#3c7iUHtPe4AUJvt$tbx3!J-mZ#3{pLs4?5y3JV?O0)5jI*L?zV={3u z$c^EkIOE64a7V5kIOu$KyA9IqvM%)dis1uAH9p-}skhro=fr|wgZOfxZqe~q8RaLR zBTrog=>E&J9mQ^&XT@+zn4`SdsO#u4P>f+EVwcPfD_rsR;9dB*HSow z76q0eA}5BRv|&bLLHyi~ay7?uWs>y`qULw!AClHf0NLt>T6%{*>=s*2-RYy=t(Kx} z*DHMu5ycVW7AlCvrX=ORbKgDt3aZ+0CeBS$Rv!e-aN876hZQEXs$G7oGM4PB*l%fM^9aHQMl_desTzgnWU%9iLSj;4wxp_&NYkja*gNmM!`E5=VI{775M z2-n+Ymen2kYB%QB#7l0To_KDR5u`EDL>X8Jqm6t=CDjo4j_uqW;5e#lHdj+EyN3S& zx;J!}TEw?F3|)B9q?RY;g$EdPyU7KqM{(3#sl{ zg=J7o(ne*}0U!mpf?Rp@vER{2U9viF=(X&P`+l|4Q_yaUy|$j&c#fj7vRUP5s9~o} zM-r@5@SuiB<-@Futb8y@7*U%mcFAz+4IOnB+pO>=xKN6QHmht;LiLfr$Nc1Y!I^@V zV&JHGGC|HN-i>d4*LU2%dEDu0_YJzbo~y#1k{JY$QpgGL1$ICSEF4hYs4 zY3y5ff5AQ4*GorbrK)3XuS=xDXsRWgxJN>+&kusQB@uu|bPPwP*nhPoh{-6*$PAoAO&nxrf#luv3XgtXI$d_8 zqoA|iYN4*Aj@>0P+7hV5(0IN(wCHjWNCTDN*-?|&1Pon6+tpj@zYK3 z$bc1g9AlA>9%20ydZ|!zC`NO;mXpWJ81+X)5_t4Js5QAQ+ud#zmVMJk^-V_rm7x)= z)UK@U8>v=g$0b3@Sf>eWV%O7ZE|b4x>9(R5wHvJ(=)71kr_S< z;N!ZCawf8iXmty1?>gCUbk=#OsH!d0RV%luAV$paaWexC2V@lppoMUKK^?}Q2Iq>{ zCfpY)c`4}-K}T0paj9qFJ1+zbu@{k3FB#{A&KoV}?6aqKlo1<@fx`oe_2EXiNtcSG z(Q~)-->7%%Ug)sfuGMwv1w}*^jD{$xp&~?SmD|J%As8G-;gJbsPFW-_Tf1`GVY2k{ zlA4OT=M@`xt#uTu{51|;qjDl;b&bF>1X6#LIqjj_uc-TutEW^iEhRiQ$}5yK*C|Tj z5=RcD#H43{R4II#AMKG1zpd1CD3kr4VHRpZw_coQAH%8oOqDWPVJWx0IC^Y zJSp`B9|&@dGlYFZn8$0fK1r>Sf%`uf*&np^2C~oML$qq)zC9R{c_I}t!BA?$g2^nb zTn0HHw2zF&$F`WSyS81ySoD|YXQiZ(D@r|TPSHr5xk#)^gW@n@h{0pa`F%=t7RuVT zyPX{!+K=xVWM|;DRm_#N*k|!4g9>Dq$lOBmIAtR#j0PK=`*U{OgjVR`i7C>V;dQNQ zcciC92qOYU1~LkSBnIV#Bamdk70+)r=UW9<+o)>t@-01WMJ%&VT`~{hv8RC&GK4S;6nXfL{qdt0YC5}3 zO~U)OuhkFZI!9MgQ5E}ra-qqS#;ZSBpz^#;9E=yOFMCv2_~jV81Q%Z&k%Zxak%OdT435RQT|+OsL^GabCp~ zzB9$aIVUHedU@4*2Jn)mw{yZQJA#siJB4LTZ5V-IVIdQTZ17?b0+J8qAZGyUzopj0 zFbt}9#bMMzBzA7XvbToL+S{pNi*jsBRedyQB9cnl2&Z5>E$HJv>{2mua<>M|?x~m3axyEs>?V|fb?0Oqo*F?8l z#UzaB4Q;-J&a<#M;94?JHbEI;qqlq|HdC3g#Ojns0Vn2h+4c{QK8qt2}#lqIo-gb@7l*tw(YC5PSF;pt92xUg| z9vy%RJB2yzs#^K~0ECli+irD{(RBK$)qiLW$9SW)F4eW}E0w|$u|X9Z(?~n_l0qCRpvFsa3Oo8|UT0h2aO((j zyrYZ{`n#~q_!?*jcgazx_vP->X^MvRD@!uFqD3sP6*~fg3wj z%iV3eckPQ+WoeP16%=mnlJP!n5@#LP%h=?3S2*)gp&itC?+yw0`cXF9Q{~(dirYv{3}_c zX=?#+^#xGz4K&nUg1P5(eV(@F=dN_w8>&hf?Wqx3DwsTYY71v3IYWjDITPElD&6pN zs_gWObM4xgZG&}*VY*Dz^%V4$?2x<;42WHUAz6s|5!j6C_N%G9S+5rgZP6Xd)pbZ+ zS_y|12;P`D9Qj~*fXB%D>IJs^l=OlpnG6&x9p|cXEY1S)!Vm^Wr*rA^C%&ei$F*8k znBFeEc~oc9q+IfjQV9WD+^GQi z>6deFDrxs+!D%;TWeo)K!!1mbQap`I$w*Scd*Cp}eq?8{&a8{J<>{@`@)d-l5U$^Ik-o)w$&|K1$UlUBY6u2BuM!{FaQiPd1NW~ z8X3G-O|OxznWZt17BgcLHp--;iq%b9WHgtBsD>n(TfB&kRoF8)ib#}&Esh`pFdQop z-$ojXXIgjo+3jnD=R=;gZr9Dp-9w?{*Ij4LPgWJu4*yS4Ed!( z+_`fZCFmd$EW+v>7?AYIo9(-9EU2*X`*B*bK#PO`JYbU z0&sE$NT=HUxMq{?YVHug)nR$k%#ukISRqbW=gouVSI6PczF+SbZPjF*rAy?LwIkwV zUk!XDjx)68By~?e!@8V5IP#u>NI5ERMn#zMx}R`CxB3MnU$ z0CQo02-J&2_U_(u+Lb;)Kmkglu6l@S()CwothC+WhBYfY8R_Q>kK(Qh!DJibGIpY7jyj5sY|?gk@q+ z5(1S2xMQALFzrKFUe{yNx%s7SZLha>?xCT!NqVl`x4ELA07*wqfV2{acU2P*!1gK$ z2ha?UQUq;&uU#U)6sEGwJZgkW3X1Aq97pJIq;Uh6CI`2p>~)HMEjc zOhIVUPZh+x@Dv1YLp+$VWd|{zQa}P~w)MW>6mwK0bykE@(6ZI7KcECiypKLO11C5k zn<2D@2H1OSJLyWCi$L4{!q& zCfRywQ7-V4ZqwJ+aFTf?xR;7Z2~s3gjY&s!&O>Aaj@|L9j-Pt%%N-PS)pyF9B&MAa zAevJl2u>qVjOQL)oc0*>InKA+H{Q{V9mBbFwD4Y6~Xrs zcgpY@W50<6{gQ!TCex+z#YYsyY!W5mq#Rn_@s*S@Qr;SJRWi4ffy28IfH`?|F3o76 zlAcNlsH*t9(lWbO&h+uWES6aSP6%_@vE_nr52md9PWI^L--qvC>^)UO&rGt-EwM#& z!mN0y@Qe8Te9C-)<2lYj&|CiN+gpzBCEC|XyZ zP}~+(Qyh{C$eu3P^RO&(J0Im3T>JObs!R2tC&bq68(l?3Gq)v30=uuED%ALFd*FQ@MT}6fMl5tjYd62^x4VfJkKsfi#PjCs&vw+Bjf}YZQphQg`x=~y2l7$xnt%n>Rf_-$nvT8#+2Ku)_Td(ItySBL{dO12m)Bh z^OPizRYn2Ne_r02%CmBaswVrE$wLJbNf=*-f-u5H$D)vfjumsCa(xG_I&jZ?Qh3yE z7qvXl)5{z&RaHYv6pV`)<50oLT$L@vdSO_0?ce2%5u>PiO?@D0Ic8}gLFNGQ4cj4u zXC9}};~$o*N_(#Gmf*EC^;J`?WPTh_$1-zC7mE-TNhh!bxWU0A13KAr-ZzcD)Ku?k zd5b#25)~22$uJ3-3o&9z$sNBDAmd!wJVC-rV?q4VjIX++;MEi*+T@i@TM2Iu6p^fI zjoG`5dLCe8x8ekP=UOQ%WVKVVquW(Abp!a16(vb&UOvnLM#7?wO6quuyg!{ zSJa#V<~eN5mwDWEQHra5MF)h)%u<@5PGm2E;DH+Wo&9h?8C(mjoo`n z3V1lvLro}GF`|NsRgy(4pr|h^D8LMRj?Gf^_pFwhcrO;Vx6N1Mtdz#0>W(`c_~J0! z&zm?3V3)*7n(B%vY7%e( zS1yiShXyTx*iv}oBRaBn?G>8kWm+B4y)Cph^x+h=qC-6XDIgV%9waCU{9egs6mJ9(6+~6FZ`me5cS}m7B4Vm{Zk8q`U z7FwvN)Is7o;zCCg1^|o_aG>ON2e!I1y~1v^BF7X@AM@t3wlZVb<5k=)g5I4h+oB3< zj=;N9(o+Owr;=u#wmD=@!DIzQi{G|+F(4c(VZ$6Q9_S;Rnt})(sW#yt(6}Iba*oj*TQBqkDAH)Ij z0(g=~W2K$>_Kn&-Qs4HzpKZ>LZ@O#Mag@RLntU}iOc9}$MN}o0GQa`ifULO~IMmd5 zR-0P`jvFD*l-kZDm4>L6j^$L+(a>Ej)wZeWyrwl1QT}UmenC0em)7>J%ShGmtgbwX^-5H)X1-%Xfry*6T>i z;>&X`oQJx!zKl5^<|^18Tn$oNn)SD=8-hzs4&tZWHYh61G?z*!%(Sy%6__iL$0{9i z%FGmzlddClI{h4B&`2E5hi`=)$Dr)L! zOrlieS1tlJJEI zoekS-i7TklR%t1kUQH4g3b~Ld2R>1f6rA7#qWi0-mwk(LN=yB&6_QNPOHmr;I*9X* zYI|}X#C9XlfO~2Uy79QSM=PBuo%ZiE@gssy2*ky~Rq+7Md3REIb_90rb?vm8$h8$m zo(jhyAtxo`IIVI;UhU#EYONbU$R7j_L4i3qA5TwRZ?^6V%FBdJY_5B9Wb=+Uk-2~v zVZ%T7S-|=8Bi~jPlY8w=$5%C;;ZIK;9M!T^KgF^!{wua}{7VorNh=s5x$F+UtLcpe z&6?}6?(ou6Ra6pVM@i#|1af^*(=2*w)|@Nj;Fue^I^`x*E!wY3f>?Pn|I0 zRxO1t7-xY1V+TID_R+8TTX-pcfrWb#K z_?vpgT+GM}6f&75sV+_$DDWCg43ZRf10(_8ST@h7sq&r&wiRPz z*_@tP7yw{*$pcJj1Z54L%HG_aPTF_tjP|AYgrd8|Agpk&3-Kfdj#XJWx|56yvi2Rj z>2lZ8y`I+U+D)-_S4x8$)#R- zXQEkbb)Gn?KZN*Tta$DuRUifjiNPGOduO(RP}z58-)c*JJh03pGDNK-Iw;_Ka#ak& zw{xE7xC6GL+jq|Ll4y)~pAxBwW-feL0QL;ToUiHn>cfMm4^d3=-zeyLtez>AUE&Hr z>{q*bdSqbg29uDE!mLd-_L{C#p50Kh_G!5&7*ac7`3_3OzZYyA1MRG-s@_707^q1e zEY7i`xj7(X0yFM=_CKlhv}iY$&fGv$O>>6c^F!fyGLHr~1Sg9NIqU#E(DKRpV+4(5 ziqA|brGmPKNlPCJIc5wC5rzbg$g(N^ZsC%qa zg{DNIm7R!)nuNrw#|`Gr0U#Wlj4}h?8buZjw%3U&E)XqRM+k`^3=p({5zasdZ{#Fr zxyc6vXohQ}>fLEV< z{vJKXc=q|@xYIo@-`f$?v&l>;M7c=QApZai43V7j>>Jk~uWrQ~Z)_YxQ$5lah)%FS zirMbW6kvJ`W4ZM5=f0|nAUlMK6{YSnRn!VqE~?T@^2n!;p(K_gkvxa7$G$Xbg6AdP zrYgz`AG_&1Cvi-eM2wT@26-QEUtajrJwDgkmGtiw6!G{oFlgPX3MXNbbDlpgL)3n_ z*4k}>XR`?9o~4x!7?N3P3uaORu;q|28y_!Usn9vLjimaex;uQek=G?O;+s!pnu{vnZrV0lDi9nL%802{w?tqXGL1xDhU<66;8Z%9mD z9F+1nn*)$>kHg1^QJfy_ka9Ft=&7z~Cvp0Eq|sS5@|G$&=SpZ$^N1{nd9wC7jOCAV zdxQ1wt<=!Kh7`D6Q3oWFSmTe3s8n_%zhi@sZ+~4h8;?oVDm)uSL=vN^R!lc$!rE5r#;|R4wKyHr<&P(ucMMr22%=C@_9ybJA0m9q-W{|t8L{&KxCnmwQ<2+ zQ$+>VXw7_Frjj`bL(7wRZa@q`;-k68zI%2q`=@u%()=Z}cHJc=IT_+xq}~*v@Qzd* z5_siF?hhyh-*Tn8{a*X2#xd$uh-1f$3$CMzR%Vjq9-nOaJ;kTXA0ZKcQK7-RqH&~^yQz}$I7YT-(AarLL#!F!GBRD@Z+dj=!{jp}LoFu#M-I-(tnrdm_ z2cMVADlyInW0lWr61sC;m1?W2TQc6@f*I+=b+psO)d*w`d_l0}nw z51O(G%BOa$^jG_hOhUGXjyg&Ss==1uGh4XIw%WV9#==r_9881^0!bt@U|v6JmVrvz zTynYMp6><9mPZu-00&zKDIO0AjI4X*P-oY_U~+Tv_k%t5nxdLt@=CUz0I{rZ7+C-f z<{Vel_ddPwJ#~9qI%`i~DxRU<_GB$TA_YDBl<*S77DA}PMe?x$NnY8;ic|C>Y3>tO zOr25K)$|ZbRuc{3O>#z9aN`@t8}dAWBLPc#k)@gBy4tL>(5`Eyucxo3ni(i(Ndtyb zOFIvuuczzls1*}kr>l~Ji5!TWW>7;&aJax_><52sbQKoN>5a0kOI`1(mioWrEix)l znt%og;w21MBe$jpe_Ur+d{^1V(=sJ(-*8?_z7;4S5jPAsqY&Nlzc4YK70O4tr~o-A z4@~-ld)s!XY@497P(~f7DgYeJe2R5qkhuOEamP=`;tG1<0Oo)YRZM3oq2%DA&Qe{&nMo$<-xE;?N9TVI8 zj@|cl)W~i7lHD_{F|4PldKIUai()urDm+4Xl6bqEk6ex*thL`~{;ur$?Z>d9sF!n5 zTWYQAU2L8+P<)|#)67JZmJB@p4`Ae$$nDG>XV@QT?YC^CgL-WVp5H15ioV{k%^JpX zL{8NCSbOA{@Sr!b*DQEMapEr_?tk?&aT#`gOQCMFZHikY*KOe%+Nq+9{{R~qnEwE( zkJ}$MWBq$;pLgF-x_u_yrQ5wd*|k*k*IKT1cN?%PE6y+)pb+Y_H*A7vj+$%0^8vISg$Kvx0 z5Tud`z{u=7WHqH^`!sb6Yh0FUnRXuFr!hP(8sTw)GTaD~9|;xF@yT$&55?s<1nsN) zG9~ho>sKx6n!#LEB&4URRjGh#;JynR$|@XBga+nrMB z?0YWRwD+}=;ms){rLL`7IyqyGEC8Gpl*q+EOt2*2A3}5v3F#^KY!rJVtF-s38;m33 zCA&srry!0juN_Dkd~z64$I7_%^61?E0A|jiP*qDrm%BaL;gTeY?Y9*PA`nZEvxwwU zJ1z=&vVDeh!M6U)v~+t~I=%F_<5euuqfy)7j$a89Fu|FFj^vz%9EMT55u68CO-7&3 z=BPE~iU{`O>fX-TcZv<2vaL{DYbxDhyk009l{&kQ43zQn{wERYT3#gb0efUtm%Y<$ zuHO;IYD)Pit@HAYt`xAc4m08A5G;HXA%No2H+3AC;~KiQ-`Vr0l{J+0b}KC`WT+I) za=y(ht;hvp@yFn%Msto}aU(dvA&YTz;cWC#+vsi(TB+))7M`BnY1?T|8f<_anT(Q^ zLQCh6C%Ihbx}(%-V*dc+$^7z+#VnrkG+kGM0l3Ssld{}SR8hX_dP}PdKr;@A?Nm$VE$sBzZ829cyGkn){cW_qS zE$wZoxo;02lr_&+O*1qee5-|K5r!z-cyT;&kWaOdvbqs`+nb)>at%vI zgsTQv;_(ABgvd|`#(dt`xiziW0}T(S{2!VDrzP3Sr0yLX+VuNcn$cD((iL;@4ABR! zsY2dFT%ZXqeSjn=?}5l^By^_NLrZy*TD$!e6o?gRDijKrc78k)fEeYH#Buaq-HvtM zbvq)mR=NBnZ&^&4s9%eyjT%KhVxl~-$Zp(0$IH`I*5%&swJd`Bbm_+K7T^_LdRr`w zPXHWH1}obc;4{Q}k8|HVb81PUpUf!zD*?Ur`7Ri_>`U0Hh6^W5>*rXEXUC|wP6Vu@ z&RN;G@$!?N+0URFap~{bYpLC8l&;n3CCWIKp`w<)0x9WYleZ-=G2r;fI9y{o{dei# zM)v*3VNkx~+kzU4mA*HWO$b_=cacjKJc;7T$Syl~T@U*|NV`jQZ=Q-v6)C;#>7cu# z2|-$_N~8-M;a4R`D3~&wFeG~rb=HrqZ4VV=*Mx^PnJp`aw%7g&Zmm+=C64vFHu_Ul zmCY~4Oj#HZa@dQGeMgl3xYFHs{tRxTP*m5?blm%Ls*VI_h6-BA!H5Bp$DDoeF_p+a zU4FkwMw0-qBXR!V7#aEe^%iR_07zqv1VSU-)pF16hB)p&?$fq+1uQO8vHgzz&C_j2 ztIo}6W38ZxWt>*mvKZDd4nK+J1JfWJgX@hI=x5op?89K8x!ix`zi-sfY_F1@I=c8K zpPHBQ@Jf=vWxWDqcLTZAyS=RKK@BY>zVmd2E|rkmBZ4}G5rk(h*yq_osCI7Pl|rMw z29s|+d+A2q>SJ`$vwB%AmGoA|zOh=N9XW(Q0}8UI7L$qQP##$H_tgMFMYIuw?|i)3 zXl?a-J8#dW|t4D|!-3)Jo7eZKF>cQ)Li zsJ~olDxTnyQ&5c8TVSRAh!P2(LL6i*p1F4-d9-bqQ%3 zoKdt9hK0v_7ykeUMatc{D3_`m+Do;Tl=G>kvcj~g!yU0KvOAVj_<)UaJsUY1x%Tha z-=OqBc~1h*L}S9$lEz8Q;T%98I6YUqW4V4>g)I3)zauioo)cD2%4=*eZO0W&WNFp|g zNCdV(IQ1-W$7yIP1*}=2SSVn58b^|iivts=!UrIHhnNA__V+sFE$i1!-@9mkvljzj zUuu}7lT^t~2$`8395Q%eamUI*05ER-v80>NRJw^gw3QUwuX9^zMLVQF2hE-!4{|Y_ zWCp`$0{~;tYZJUN*87fIb%%|<=eenA6<~LYDvH>nGDM^Y!bn394-A|U z+z(v~-8;I$wJj8p!#yOk&YbC^3(R95$^gPB818UC!(5q9b-Ud@F6m3SZWQ98C0VCx zm0F3F&;U4v3Z>3ellZ+ob(JLrqi)4bCCcRSMPKBS-SFxv8A-#du1P|0!;lY-{j;P$ zUin*av-3n@7ewF5JMQi4F73FaW-Eg_Ga{I{7}w-SBZddKAbf|uXk>Wty(4 zF(i(!Maf)oV}p{ZGKP{Gn_a2z5W7ATL$kC}Ux8Sj97x$;A(Cq8TVq6}~t3Vcgn zPej*B`UzG!e}s_13h;76cHluhuyRSpeKdC1)psj$BzGz*Izr0JONl0FU$+%lkxw!S z$>o9N!1e4tJ^M>hc3Ns%EH?@YaU-A98j)yD;nj5nd!%6Utg1G3WL2UYfQovgc*JI& zGQ1OjVvf$J5yKJ~d6aRMaP7y<~;4B}c?^lheDZ;A1E7@n3HKy4_X0 zERfiK7irznqNP|&B$@#nQj*y4(MVuMRNxX%srSfClCon~A>5U1O;8)ekVhbs!-$6B zQ^Pz|umiC<^9+OB1ZrXpacp9OJ;sJ|rrvsoc9v@tS2hW03dS}1T z=|+9;EHt!}v{1+Ka`IC1g=qowcL&v1Ka1s&+rBh-*4R=xsIAbwcf=>bqk`=^bL6>h zL_e4>;U1Xppxc{l)ot409rG|^8;q&o)Jn**P_RewISxdoS0^~eN&f(d&??(iWfg2| z;z;7AKZanHEN ze@S)rddrn2OL$8JauiuA0saYI>7H0qliUN}C+VVQwXszTOCX#o!p&{C-K3HUDk6<3 z5f2D!9CdEdJ@HQLbr2(2XUZv+i9*hveiG1NjSsAGa7~=e2R;fF8N+Lz$e$f zH0Ekc-HZf6z@y4cxKz(|qE@oe$>C8TSqd;`60UoZfIT~Q1bp@StI*xaYq<2Er}3)z z7dw{Of>fG6BFvQWh^LP#e69F+@=@I%wtpArhS2GKb^CMLtQ_OC(N@n*O;u9mNsGm9 zB!Y4>19BjGV+R@6=;qt${?F-66{~FY>f2bo*IOlO$2ng)PB`AGuM27;pGNlR|IO=_xIM-5*_V^t#(R06TcQPip7_*h}PXHOB{E8rBg^%W0U6U1c{O$c(a zl_w_yJh6hLW496s&UF)RYzs2)T59dRU3#+9U6rA@M((1X<01zUmwqA3sBweLJ1=iQ z09k!`lK{LNDO6iF1-DzRut`;VhN6xt0@bEBtC2z|Eae9oq$FhVBiAR_I&Yx+KHOG> zN%zW9)=5p_tZf%DoMV)XtT5OlVRA5Z>9Q@-+iojyxR{Wwn15b`UvJVrsDA#gYn2_z7qO8w__Z5OGEs*=+4#a$ZK#a~}h z@KjJpa<3E4wB}r>EWU87mOj2xR5u>*x$G^+_iet8rK5tRuy|f%ni$ztf~%G0k)T$} z`Z)E@2pX;ZPT6x*(BF3j#;%~rRV!UB3ce&#&`2Z>AacbQx8i2v$O$Supz8o=E(VsZ zwZfBf+?4ZIT=!K4f5F;SX05x+Pj;l5XlVqi7-dL=9x3KifM9c+kgQl~3c=M4(|X+X zJEGHZyV7l%b*ZGLtXfzmofXj&jZ#9OsbUo3OsaVZFT`Y*T<4&?-u9-}q=G7HI&iI9 zLuy44RJJ2tJ}QDHa#4piI9&JdfMx9Nnp4)tJr>McJXiQ;tfZ=$qL@Wd8_UWmBa${T z@`X%_#oxO5Kpu0gBVcYj_e=9Qv~0^?WP!1#|L z*D4qxDji5r7x5k^L^lrd*ihUC%HNjMiL1m?L0v;LG|4+m$iKpDw?88=Bwz$57#Y(X zmx?P*x~5Cvo~qkCim5nWF9W=tkvr!KA0&g@CnTKbpZ?Grg7dI<9^|L9*e+61OJJvo zuhlL7Pe(B_ua7gbg(YH@#~xs~EIq){xxs~`a8f`n!mGa1)OYLU$*KB%aJ$I%N_wig zr<#}IykL>J6A2<2R>4jxMt>0}%dT0ni)P8Z-gm9So@&*#)y}qRFv|Y`5ioQsD;(ux zjI!kS$-wM$i^ADkQMI;>UGUEPrl#-luPxF;A*Zf}p;!2Q$PvU5%7iKpES^1p)n%~h zq27C(wel+OhHG6z)J9j5!oAf8=-B=xULHw|6d3%YJfnXI%lF;YoO z1XS?O#b;u%q=rsjEP&)PfCwr9J@cx^WOUbUbl-bhZg<&|OMi*s(bL;w<1v)S$h@%$ zd6K9z$%lUU$j-V_8a|lU?F)wJv0QF)QKQLR^-cvUQaT`9AwaUR05Rblq~NhVjy25J zO&+1Zx81Lz=;?uui2Tt_#kgeKG^Y7tvrhF@5$1Sgq>*Yl5<(vcznl|-N-)74$GFFD z?E~$4Y`#e#d4O}<85z>%-l3+nq`OkxX^L@jsA)t~ zT;`TIY0H_sQyhTEiOs_g4bBG>p7=8AELV!T2lj>~pnz58p0eEZ>fRbJKN44C#5s{v za9(_Q01KY_!pK@=plz#Qeo;CpsV}bu7U!}_55fm(ba(iO-^Bb4Pb6cRlL*;vB(56- z=d{P%v>Sctt@di_0VQ<&l0>cXY9o;H05m*-IONPgz-1UX8Dbj$0BC!i@-&{|0#nq{ ztg_OISlMZ(UL5L@eo4VXG%mvhS-3U^SPG^!*i`0vDmm*e7khm|(bUt+aV=K@&f+GO zS0DljUffH0k8)c&)eCx$piK`#GecO&JS28g z$e`mHQyS#}9fzic@B1Fz+}62lD|wVjc2P!X;irVjPfsk|)w6>9FbcDl@5mBH4o2Ie z>8+4iRy3`xqDW0t4r}=rS;MJ$jB<=H<2eV*fC=9S6zkHC#h&W(IpA=4#dto#^LR*{|EdHtLx23dnb+mOhyIrQH?*hRD z9HpnJi3~A>N|x~nZxE8qSgR8vDL;#n`?EJKbMCs`kjXrh@zc}AP$a1{#Y+~M2Z}5*H?|2<6pmRH z(<^rUth`?Cmiyg;wl_3lOGZWGrkzVJ3b+9j*zxQpLRE7Go; z6Wl5ljB6`8M6n+W7*O$)ZtSFm@DZ^lQ7U&BG?H@Zi32*NX7-0cSHXocA*WyY7`x1={4_SM`KR|+X4Xq>61h)14iT~SD# zKZ+2LFoq%A9_<=>Ydsb9C}7)^^|9Nj;rL3okWOSlFN-ZbI(esg0w`j+!i3~~0nqAQ z)xKri6&rH0)o-}T3bl1%j5Fbib_)y zP)gS5vcNW+lz13ibPntIpPTJ8NnQr?Cr z%DhobD#@x@&vgLF$18}@iDk|k3Pw2^gJ;<*XsrJLd0uY6qIVi$Y%DLs9DLz3*tGrb}kxw|(cx)W;rtDCJ^uV~s&0IPo#& zSI8LvE=9}GzNv25>gcUk>Y1)|Q_n2x6~d}2g-}Bu5KIRksu}x*10JAb28I5`#Y*#E zE;l(PXe5cFNh$<%s>j3`Zd^b)LOWv^J+s?R^i`FW>2sP&sx|%xgB3+2{tU9mfZSBD z;_L3L7@j_i0{~7|2_dHPJJKc^brsdO-M>B8bv@S6S5rl7r=zB+q@IfurJa`yS*0$n za~hBlbDzcl^J-mGY%R1_tB9+O8lovDc~VHqt|jOEMf^(ql;sI301b?tA#~HIwSwCW zQ&Y)Rcd4n0Nu?fjkg>uZL$Uyh4ts%=%8ZiCw_5v!b?b%V5R|t_{3;nErh0E3P&;Hy zj1*)D%83~W@ejGiun=Yy=$_nioha+4sI#)s*j}O-V3Wc~p_VWh5;!8985j_R=O6|r z%-&NP>wT@HqqRcQJW@Q546$WZML;^L3#0s6$79k zf}jOLKw_kfjb?L0vM3O&d{)z4Z1@JTT(4BmcUne{u8Atqd@{|1V1+@?mC0aF5EyzK zYdV|lC68%TfqAvk)KXF!fjzQl;D$$uhd830hziG;MFB`&SzuYaFYX!(eAfz!>)U_h zVND2*H-Y4xY0SiUF{FK^IrQ_Bg-}%S!$_i`x0=7Xk_zc*C#$HMHEK9vr$$vM8ZSQ| z!-6=gIplJ_q(*=S@pi8ySqnt;bWt^Z1zzEL`#r;)?MV$4EdDY`o+L)1K%uk4)MZ=D z4<_%dcEpzmcLf!nao8iWai5(fPr$(i2Z)GFD@akJnx(rTcRVWZEn#sf; z6p(|_k#a@|0F#^>WNi@akD7+wJg8k=RJ(>dRffLSE;kjed4v&G2q&UdSK%uxM0rAB zo-Dk%1w65+_RB4{l9DSu`fzLQQT#hYB?pO&N6#R5YmOrWjl1lUMx{$4upbvlbctVTO&PjFW5>V3epc3rzcCCas4S$unZ zaZJ?E!f-o;F1{jrD)wCW?SXR|2GlKa^uiBX(p;f}hQ5ZmDXLXgDvD|RPAnB)jBOtz zX%)fZNaf~0$`2E$u-xe>YD~2>5LZ>xK-Cd^JvfqDxS~D$L<*zDGQI!`;fn$|cRJm> zDr`1e#JheQe0M#>^s!Yy(L|K&^UA>zI3;!pBpKz&7m_a%k*1xP{{Y$Ffw(RWf9F zG%~s7DcSPK+#4uKz`*U>M=5SmZn_DM=y)tuGs>PV+L1wmW>5n7(J&02y_z%VbH%%z zMcSYF$g8 zD}-o?WdVyZA$#SrFre!9&4!Y`I{9K~sp~>F!qLBpA)O;)VR-{_Ry>^GVD?dgoCNQL z-`gsL(Af7KqV;WeG0$$6C#<#AaQtb;O!6ZhUIa+F@{oMGX}N43nBU$Sx?1+xce#8n zbo0yc6b&+9h4DWWWm&Mi#zp`v2W?dC-Q|thJ-_c6{EA7EX5z8xov5E|!BEu{TS}f& z4I@c4PlGXq-DEgUAb*^7RSLdw$Yc3D%GW#X=J!im71#@HGt4R=S~}=wnh1GC;eP}Z z!CBS2g1HIUFFw<*V*R!GQ{HJMw^YxXnp%+@Qc}zmDQ^LTG4mnEAQ&IwWQ?6EZuPyx zai^)e)(U2pDPc;Rdot9-CJ4xp=aTv;8Fp94pujq&x|_C9m8*3P+=VWdhv91_xY*^d zw@_6y_1+*!;Rzpt%mLs$C&nB3uz0BR0!SffpQtqJSxt4eEyj}GSs|!~U&7BPld)pX zO7U_q$_6~gvC?E$eaAt%5B7FxYNhag9uOdoMS00?A+X3uc-hWI2_!LA^)@_vx|;Cq zVV=aX!A^-$DziKgq#(SFQO`IF$glu+!pHe(Vot>Tl;4`{v$fYyl>}a>JW1;nY7N4f zqe!Oa_(TM$R_wtGDQ_ooJ7`Vb<$J5R&X&5FC8dUQLls>`DV-)}g&Jewcw7}1jBCp* z%t35`80bdnJ8tW2rj}i_;Di0L|al*C= zmKU-vn|^9{OZ{B;3++8Sv?iLMcyz_pUxaTVR&c1<1OUEnBPTj#slVCmsaPs*(Ih4_ z0JqAxpR?W)s8(PX*s28nC2WnY z(XvD-)*&KBc(E;nV#-4W1orMu29n0Gn{u9DmiHG^Y*5fuNmY6^3l&mGD!dN{M&JUf zs76xflkzI8I}ykLaiEs1*S+r4>0AA*iYh93#PU>2N@T0!Cz(n`Ka;yKP`)DZ$6)wv zIacfo1y#bH^F1njMNGxj>gZZ!hFJjtLrWtvk@Q8zd*I+0SKg7sd5z@Tb3uNuqJDK% zGfWE6%oMzg$mFufM2Or<6~iyN0Cb3E(AL@cs%wi>8-C`ZtgMEv`&Cxf$4McM;qWFf z-X|XoWQ63f%>z3(LOQTv4$G?7A>|Z+2{ZOLO!9&jp%EL{wwu!IYF)d*ctg8yu#?qK$ z3&GtLhhy0Q$iXE(c+q;BXT{thS_Ylwt$@z$aifd{iKArxE@I$>JAzoQNXaB%fR_c1 z(YNfBa!K*uLY$Hid!;QSL9(ppFgRkqV-tTl93TYT4MLn236M_hN9dddN>PmM=~iT{QQU~(MOnN zj&BPUJ%;l}C67<>fCULXKQ2n?rPAkMUAHxvQoyo*aaXJuWs{VWycC|*kOEmX-QDz4;~ zR67Nv0voN#j!)o!B=9Skw4f@}i`92LXSG6VaFhF!EIZn z%evYvKYEzst-Hw@+$NHikz)IK*Ro6bDLqRRYshR{tnUWfK zrtlNPQR2v|p}}5kF@xq~#{iDnqlxi9b8vehBt5v{3AgPi`fXcRUv`!Trj6pPw^GeC z(pA!=QAqQJETNgeVDYaa6!VRkF<{anzHeLYA**Uy8)b4#3{gT9F=mC{PD=;4i?9k;o2km4>`pKW>sGs#dtK896 zI?fikRhMrWXz1mb%Smwu#WOAd4m=~_WQF7SdlktZ7sA|7N%0BW_+}14BIW~N_@RpUWP)8z ztP9riw^drrT}4cR}p?Glw>O*U+)hxFdV%OaBB9nQr~GQp|;y0r>rv=su}Ak zqiX2elRS>W7qH|Q19AG%`auuZY!Qe;Kh0AMn&3j%x0l%O~fQ^Ud ze^RvBI(ux|wO2cx-q|HP)>ls@9aNIFMI}U45JwEDI~Y+)$Rbcwmt3hJft^XaSyGE( z(X3YrNE&L$riR?MsP3@Sz){o$kRtGQTyZ`tKajQ?C4?HC;njzrYgMkIo`R<7NY^^5 zfE5-hd1^T*ZgV=cW$FD zOUnmN5^jB=6`HoiZLy_Qzu>AOwOr$=s7ji%PNXx2{{T3AXNqto4H!;L-W-G|W43;- z*>^_RqrC1BYZY-CMV&;I$xN^{IgtMV6$Hhy6~7db`GMqH*H2{#+$3d>OG_l~8%-6@ zHa+i0y84G*d!tL0vfU+nNhM^6DebYs&X}l{XMYW$RanVpUS4?PLIxLI8)?2$(L)CD zv0UxDlfaUWoXTm8RF#mKOm6EEM5vMp1V@ueApr>N#Yly`Ha5WOUfH3yJv}enPgvIm zthUxk!g_eg2^&S_5@XH=W^WCZnMuoFj>6ma%Uwh(w=1skZMvEOkU($0w5Pg5S0}|I zv1W=;s;vy=g13p1t_fhpa1NC=rVT`6Xs0)^&)raDjV8_y?}Y=V8~XnMf2*zO^VOm2hNXCB!1TDo^J|QdzGVXacOKWcI-c(l_Yy4vQZ>y#7o#>}px|)b7 z>SF+cgp>fNjGrSoB6+p%8a!Ez+gz^c>?5y zMp2S-={n4Ap|1_9^(rypuG&F3O`8XPba*Im-lOb(tXAx1ywREiEVYYW4H82DYHo8z@|XgX&N$f_RF)!40LKGegRoxF)vdo* zQE;TJqxirfj?YzaWilrv@mwuhJ4Y9W^5Iw(bHfeDd3I|Y{S`|U79MDFkqB(Shw>7a zO12flZJDaCT~VvtHLjl>CHca~6~3+bt3s1Im6>El{5a#yBjQ0^l#5Qqw^Z*cOHH=) zmC;}6Ww=wrZK{CFJvz%FsHUn#=P|^o$-=)7{roTq!-d-2NfpC&Y|3qeZ@R}cIkwvB zDIfq-OHv~o3P@iF6gV*WNzI5MNbc8R+g&!XZJKSBa@+CSYHub=2rH?n-PS`ak>+D8vBRDykJ#hnRY?M$VgnEI%7oBXM_7}MB3ErZSYHY*eX{v;7B&IVelg*0dPl?!~ z<0NR+B%LtY8|tctJ&cz5psS1F-3&Y`ppZz#+6I`(!J}m!QcHP*FO_l%@w=^CD|FEA zzqsJHR9!Ca?-J6?W2i-rX&{M3e!Vr0w*xIKpEwLGPxwTd=|m6Vki9>P>Kh7UF5T{gb&Zz3{!`(Lv8M^F)wRYWYMNQ6@+j6Hh0uZjU z$pgC?S!S@{*AiR$erV@IxAn?`g7;6ks4JwJ zvN>p$zrd0DuK4iJz?#$8AR=aKE*Q%kt++k9-D)oG-;C1YAHbTG2sWObMq zV>E3MjpJgdxGF&>`EUs%Mx8a@mdYxNed4aMQJDtvsAv41ye0a*w3~2JB@^1~F z0hkrY9Cap}bzC-H*{{EDDkv^gcGRb!g{}6G{{RO}zFJzoQL4v0o^|3F1p@>es0S0n zPNdG(5dPPIdnbTf7Q#Vq!ZPnYd$rsd zz1LWQiD=`uD+-m5lw?fhG9`_2a9l}|kjw6?Zk|ULyLe;8+gn*s$j~SPN2;^vdWUcn zQ(h>n8-B>~RFOk%tEG~Xt=3TJ?JUdUKX5|_EC+7vnBZ6}HjUe6wq9>`nXPwQp`n&K zSR=T61w9?Yoylrhkx@lJ{w_{UQ6!XgO2dS) zLaQM_t>oa@X=BS0R|f}P&%9jg;jN{PTA3W06mek;cYXo#XDfkAdxl z^cY;Q$2czx+DCVH`=eu=+!KE#me{#&>pc;@btipNY)NkLMI9B2k~o*+BWWi`%R1&& zV-|REK36zy=ag#Q)h5o}CfB#;yTf6*yph($JIMl9iQ!}6j}R-!oyv|Nm0*7n{8j}{ zh$c2U6@7h-$2rk&EqN6zwcj0iIM5 zr|o{dP@7iek83qUth6?Y!y-dHE<+gEQJnC;gYO5awHhYAd&{VqFtA6+hH#%<^MGDK~$HX%7M&QHO zi}vJ-2~mH`ezGmxWP~2<}U_Ff+VbpL1N)c z6OoTibEf3nEqULUstdIR)(c+OO3CVJD(FQc3b%Npf#pQN;v{rnszAg<;HlSIbaSsg zKkAj1f=0N~(O%jGTG~5|(WH_}s6UGl!la>r2eu9yxEj+A*-!N{ek!#dRsk5o#!s>~ z$+=BeBzv=P%SUvko*LRJ>Zg_|vzQ+%Hvf_ChA7#i<*c`>#{WYdq_rG4L;cOLXX+RE~!Ou1)1&H?a$H?~8jq!34 z%ka`1c}5%pe!rLNtI$O4yQTb<_=c!Rc1Oo_GCieYMoDC#N#~9>h)FpOm2>A9BaRQa z#x*8OWC}vkyFz(oxC|5Y^5fv0lA%Gt^ZqFY zpHkiN`~LuM&2}^fXkE4VYT-wvs;|2}7s0&@aj#-QPZ5y{sm=p3`BdX47$YAemis9+ zq8gj*^iup7O3pEbij0opLgWPJ!~@&748!TJh}^$tevvi8rft2tKI^?ABhO7)R3?sM zRGvy?9KswP>RY&Oz>OhR^k(hR_&)NQia&#_SDI>}NGjlwoHkpCE5|G7uaCqqeRbwv zqI?9pQDYe#e*SB^-Ar%8dHAa1aM?Dcs)m}vFV!*JR00B2tb%SN2;_)1w2p1nMi2I^D489`jPAGbl*d|?p1FEJojlW40G@@%rJ_dkD6sp za>t0s#s){RD;-_wrr_MvLj5J;N{Z@O5LCv&ssUtT4~Fu{c=F1ZEU=}Zdw-&+O|NB&%}E_nD^sU|0!J{9%-D#27L0_>amy`( zf^-i3Hr=#9BmT+ORcFH~Srk4TCZM5<2^y-l5m}B%$sPQois-!Ci*Ak0acQnF!1DNp zraCGSTF^?V!bN!&PSPunX7&d?#-vqTsA}lqp3d~!il&+@RgVGSlf_fW@`0DiLUAJ{ zk8s?uMxJAh$76|7+}wnc{W`SOPggzSmbN+=2r(@ai54zQN-!)~A>z9WI|p(zA;FbLZ1M2` zCsENwAlTt)WzGl_)op7{f;!}|%|jG23PzecYnddGk)JWtB5;)%Ng#H>@9B&oPh{Fv zuJqOW2I~#Isvb$*E}j$tL9+NQ`f+C3cs8Uqt7{{g#2m>D3(N#l9EgW}W zziN#%5@QW1@T6R244gdKUB^+fzjT|Ik z5*1}!$BU<6OAg08i5bp)k7KVlJZDEKWsolxIUSL* zM>q>iOtiN&i^cf5g030Buc%14gzOeIaBTo_cN)588aF`z{YBcQ+ylFAA7 z&UG5sB}H`v?@={WzBKYch19bd20WbdKpvkjL6O{K&EnYwWikowGzO9bBF9W3kVzQA z1H>nkp5T${ao^BpH6z@pD9X`@?ocpPf)rFuV1J_$4yIZTOLq$OyG}Q66OURC` zFNuH|O1m5Y*1dtrcWRRZ}Wta$o7y~&S{Q>k+J8EQK5|lKl zNo|S>hR2CLJwcTWV~7g8hhoGr?g$w@yW?7-*3YAH5xRlwgAO!Br@3Xd)zr^d)cV_A z=87p2c7}N8qWF+igEW&y%gcv;B!%ye$BuP6@lkHRRomZb^oGMtZ$)&HmeUISOz?PY zxHVbkSB6KE2e|~FO(#-RTq)zIplS+>f`}eAGRnSCsyr{@HV_iQK)_rNKzofa*U~+F zF(ox`+;32@%`H?lGBY$vpcGDS-XCE23y$a94kxjv@ppz>-B;W9m1Yp*Xg%h`7f7UT zqQ|pRF$AiD_~nHdR-xFNwxW6~C63)SuBK?j^)}iWeiAozZbZk-@Lph`;Jy2D zUgMC^<{dl3oYL1G<2U&%<)OfkK?&1qbc?4OusqVFz zH;ic7(+$0lRmUx`6D%O8^CL)}Avtg24#AE};FG6~k9x1(R|>0bzU2W*H^p^KfqYp( zaCoI6GX@04a?DELADGo09*4v&lgCa!Fi-eMkU5!Qu(_V|wd>x}_KoSbCwgxc9iy6w z{62XYcqLL)oL~~C1bXBhX`w~V?b&lz1$8&<;V#&?E%$0g zJzc6v15SvfnnHW24UXu00DX^dZu2%*NUgUTT6yQaT&=eNNv3A0!HtQ>CB_+4`j8Gz z4i39Y3ue)ww$@uFv#iw<4ly-bKaK$e6=;Ac$ivuRi~vdRgowI3ZKv_4x7Exl9$4dq zOAoA+Zr$a4w$M^dH9f(pnLIj5nPh1rcMZw-v#W7D zj!zZ@_HNl2?G4w{+eYWw(ONg2+FP9)Ou`!Y-x5*~d&rUkc#+$ZcjO4lp2t^o#Qqa!W@&*NS9D~2-j^9p>kNBV#0W&H6$FIaCKSpoLaHtD+UoSJ= zV7TrI8f)BWz&$I%AXZEfmT365Fr-Y?s?MntEyJBZxwy#g4ecJ52cWQN$Hd{pKCY>VcRxdZ$v2I|6%SAP z=WDZ5&E%4nww`Lp%X4h_Q#>l8BZvUVam17B*~@iMZGG)g4JP#1)fehmY28v->V6gJ zNyqt_l{m2N=;4Mlfs>t7TZin+cv@+0yAHmB^8n_40-`?(wiG0VKnW2_z+e{2F*(Be zYfh8L^tz%N=k0f){{U!Tr*l6Ig+6bx4(qv9Pf614)wB1t1yac*e|J^JYAF{dfM~%4 zxlRl~8RXb1GQ5Ue{>EK;+tlq_Op85wI=y8*Ec3-tO9Z=ug-MB$A%(1*LPg5VEQGJ>xYq8U?k=}nZqoh9y?0tb z)AFe_)5#-%_{%yoI`_s2Y~&0Rjdfp6Wb0Pjj;g&nLS_X21nIJ`uA9$oR7Yy6+o?-iN#;kWrIBWK zQRQMBj@*ZC-G^cG)C1LyrC;lku2;6(oO2>bXjGp$V%g8A%M*iDX&9Xw z#z_GxOv@PZg5S*EqrZI@i*;RUMMSrIvsKAfk)=yAq6xSvg)EVPq~S+$GI8ALqifrt z-EuWJtAd%LkC;+OpZ*>pYc+C#a7YT#QE+`jDJven}4W2U90-pNJP#akfx!BHLq6Zr<*e^ZM|PkQUF~-2 z_@anJsZ|n9!GDwlA+iU5mOni;zr+q8ZepIu(0Np&eUTudsfyaYdfK&=a(|M>*8c$F z)ilwnOvuqRil2a&{6_?L!N#Ih{gH0A<%;RI{?Ha%obrc8OjOdkhXl4*a`G_Z4n1;4 z2wdx}M_PJ$L9yt1cX8?UEghDIo;YHlw^Kl9=6*!6V)-1Iu-tf)oRgF0HQju>V*dbj zp5a2X+oh^1#uPD26lyy$SmTZ*8NfNuu5o~HG|%Ei%nsAIAA$yH!8GCbT=+iETf)ar zKI6Jm(B7&eoS`%o9~WOQZqlN$QcxUr?AY`K_S1c#RS{q>Opmp4}~Qq#G|pIZnPVDwx|+O+I(LXp^X=ZiVrSWDo8o@TmT9A=)Jo4M$%1DPhC|6 zlfn^&O#c8C3%Bx?Q^9fT~BF(;RpMyCaE22^7w zT?I!hR~qV+y4oqN^2vc6eX=V;q8#KezzN?Vn9-N?~1YlBr{YzM3a!<^%~0 zUShs@&vgWX0V4+o85+{h8P&#jv;yCUWTT~F!<8cs*-vO*?p2!w_r=;un-fKwirPVj zqOwlh0g-|%ai#stY{{XeG_Uch-cZLh~1tf1uvMZ?MtIBjU zh^A)b26-yBOL?_^TY5{lclF8Y?7K?wajB?)(|lwGXps=-CzmyiSc1c!;=%k{f81RI z>tgN0w&#+e;hJ$-;Wgd{mNp28pci7qD#jEHoC15CgQuSpGBUY9MpX4_WG@$}sCauH9vt zp)iur&h-(*Mjx6dV8Z|aa0vGp(Ur34r{oHlPiA>EC4|ro9pA7ffpfrlzlS?i;lwv{W@q#T_lKXOYNQqjV0< zg#m~Kh{5@Rs|w-0H%`&DPWuvtsr))$;8G-26Bm*-EyguGLY6rL$^k4%&!($w@Au?w zQE#iNrl4~WW-2OUXu<9eCUfiU+uOF5skct>rlhB$8Jc-`8W3Nrs;0G&lO;|Sg#e6y*0%|d_ZWG!v;qH@c;q= z^}*AY*s}GTbXKhm)2lyq%qk`q7?W&UUYeFs-bmx9dM5-11B-HOg1?@*Z);k2F7T?~ z757xSQ(ZQMkk-R|mT4u9nr3GyO&AUlS*Dl7R6s`+e=n|j2Wr%Hn(bw`M^$L4j^SGp z$ncmXa3lx}g;|#!z5Dq`zin>u8GW3!z}Rgw~&&jxMI+_ zMPB#>=jwZETs@i52+%A69QRTNI|1#lKe5}IwmB{}9boFk9IDa zQ-NNH%{6nZtw>@dq=+y%6)w%hgPZ~L&b>CDRVSWLD}O8cQXaDb00ql3bkZ}RsaPq6c%HX z$w~JFV@9rxV5ktrqD!ohp+%B^2uUQ}m(@TR?Z|_k?TnGA64BLC#VJsdOEVJEu|-Y< zU;)4k_RpIQ{{Ux{)p(5I<}K9K*K7^sqOe>pRnFF!Vx@TGUj&aEk3K)#NVusTvFVP$ z_ZlN`hSMC;$|@4%DPsu8iIt7WS-@%<>p@iE37d~6pa{VILj7U1HaF|r(>UeBG7Jw z9P|7=RFjPs%_LG=ng~{Hr>xycJ3i$N`uk026sDSj3c9$~qM*g%kkx2nTzI8eC=KGOl~z3R z+1=5do72vYbsn#ITW8%jYwr4^m*VexhPrymJP2AWB(o3{E&`a{hj1B59kW%}?r7<1 zylJx&z{(?TGs_@wFhUfNar$w_agS{mquw#st0lIs@@m`CXH-#;r_ROl!|)U8dw_A@ zzoFCk@h#6~iP|CAbiU~8*45h-e;ru^ykH4?3H4g39+f^;7 z*W2vxGqS5fCa8^4KwAfkDQ;K*pDuOIS1tERVuED0)QXyyi^G;NEN;#mj0ciN83c^? z8TIZove$Zvp^mbio|4|oi71+E&h-8N01pt{Q5fgUthwxQr%B_adx|$e(aJmailtt= zZVP?->3ZIF2=?y@Z17v}QN;vx3dc1m08URX7^f#;f!G2G%5(JB?De(lzVVA$)*YXIYfp=Kok`}gt08c@GpFK$;e$`e~xNS0sAJ6Bx58iI)m*8 zx@`M)O}R-(P(w}NtgYa!WQd)xSSjy-0A?QJ%c|<}yKhrXC44mWkhF}e5;R{H=&jhZ za{vMf0380E`(r`3cP(9@)I)BTiEAbBo1IFmqyv^YIFK%1-3j(M$U1`##lFdPuD93M z+wI;IX(ci(Jk12m#396iFscADMX8p76^g4a%L)kE<)s{L2lhO2E$u6{iyr4t_f-< zmfuo=>J!9%9Ek;!`>)R=kUI`o9cZ*MMmGl${#6!8F-jH2^}e>1IIz(55~kcMAtnk3 zonfU_W+My`XO=KHK3C12>PID-E4J#~_lsuVg4=eft+>4MJXV<1UwiTQf9fH0{$N+ium%&10>-?pkUK>8rQLYs@t3 zEUy~HG5jb=D$Utj%t>SH7fch)bF`7t< zwpwoE;l;Z1RMeDw0(@YPpDqQvBS-u=^2f@cWkF2-5yVB}wt~mJ+O8C*xYS6DC5DTO zM2f|oyg(JBUfe&JvG4QbVI}@ik3|BLxwaJz;i0Xq+tg51!wk|i=@3CYigE!6Pj4t4 z!sPp$<6Gv~_R~a-LvpkHTEena)6zNy4vIWJB=Z9yK|D?ebA~>P^b}3^#9!Je6v0za zMPx9msvL995uCJZf~)wDjzD9+bavVBcItX6W~QZR=_*9=)KfQ)O6paC$?_7VN}*BT z9mik+rw28>s=>%!++w^?EU?s6OEs|!btJuNNGfU@8D(`;VlZ$rx$>V**af+xlvdNN z9oBEVCvy>}H3yR*<(A0=9C(lI-EoW!VF&PPYUrnx4MjW=lJbW>3oolOX;muV*g&vj}RMXE* zQ!#pGiBaQpjpSep1yDc=02uYiARG?EUR>+ox5-z3zgs4Xo;cO0q$CA}Ku+vx&r^jRw$pNwIqK4;YN6syh7&1t9wG+ragY^4WD+}e?}(LOcHAPTNqjk;jx#MU zipQN^NWcR=aI2Ay`91TTV-tuk$TUzngk&LBt<1Gl5>+))nn+lP<&d|A&Sdh2%U}*5 zXTNX98xAI!Bik1f}DSukFTH_*>1PoAgwnFnPa6`Q6+doE8-+Q(4u51B%dyS3CZt_ z7fGNJMJ)8|r7nVdRl+KJ2>6Q1+J{)9tZ-cvjK5$wf!jDFvF+|oH74_HzS~69mgwVn zD?ABQvdDNs+;B2*d#*-3J2zl7PR((*wM}ihndOAZTxx0Ma0!U|gaeQ{C9{L++;$pY zyI-p>cM#tf;L%4ISx}N(6_c=XP6G1JY?4U;<2pc$K1%}u6_$%ArBpj^mY$-~9V__M zz{@2}(iZ0OWsysFC^8Q&_&vT@BkXpojT+G?ejj*qYGc6ok~Ubn@nB0HJ=Z*O+rDw3 z)?M8|x0xZMA%b5maT<$Xnl+eU_} z3Z#fVTjoVi3`QpGJlXn20q%9sk4osWSJwYz51=u0b5( zdfSxSR_3&OUWhPRRU>ZxACv{+d_mk}x1cyUS*VJht{OTkw99S##o!xR1=Ad3?m?lPA|oYEa9=( zWk$Ka-Djt(lIy$bn!aU9=C?-Eg;P}+55f?qk0w$FiNlZbU}KprJwNJp=dtdX;ktd{ zb%Nz2=}j7dUSc_`La?9{AvkQBpi**)(zB3SQaX|T{mpp`@-s$9nER4q`0NZ z02tE7ut@af3nYpq1R)%Ub&(0qewx2}dtWS88r{XYXrnIyki|1JQ@Sz^Bnc8p8MBrd zI3VO7ZE;15tu=iwvd6dghS6Jv1v1GMjtDA*b+pilj$x@OkQ6^IC^<3!Gv5GM72Ry# zG}}tmw~E>*98*1HW;MDp!m7oTm#fRZ4=nIfGRhATjOvu_0K2-NH~CwYXkL1&Y_Hrl zGV)5ons=*8XnaD@J3`45b0l&ee?K0;;~2p@q&Hz~jxW)HhC`i~4L!m#DYf>Ae@L$pV$eN^|?An%Fer`)v`otHIr`qyrn zZ;iUgOB9sS#xn8+a!js)d_o8Vi*hIl1Z&D(u=SRjh8~}ryp=ZhQChW-cyl{O2`UMH zG`Ji{Mqow;IFZ{xgn`ON;CNOPCuc`_SgLw;XtCa?=9Z>u6xBmbPdrk93RA3&7!n2^ zREMq_x{vIywJ7K&-21ZadLb#}r-&^~ zK^~qbk&81(z!p-fa7YlgdP4 zfo|MifIYw?^G>39SUjj19Bw(~ZQA{3yIyS@g4epX-3)?(8EPPwJ~Xe0$XTP2xi5s| zqbcS)6$FiO?^f=y@A^B|^6CV3z8FkwB!C z#n-#)X?E_|rAj)gYt;8MHANfK8QtXYgF7uk1r8R_d^T*T@@kS}@zsjTWkPt!!MjleUTq*3`wVn-Jj(*7p=A^7{X(sg7Z%1^gpn_VO zp|u_fYYkF?FM#o(2+tI%K*WUdD&H>Mmo`4l+12*@gYFAOiaMG)io&(jFw}$LxOHeq zjbEFu9I~^suMSES0s-@&)OGi39nSY%RQr;;qOX;GK&KYp##aG{7jleqjP?Y_qOYx|nmgKG<)HYacDc}qUY-b?$s=I#m>9t3 z004&0GsiuNQ?361l~vGQEwz#?UKJ$uRKaIOR8&-yG<^If9M2-m4nGkrNWpe&6}E$L z6l+ko?h2^wHyA`x+Z+6zrlDkooSc&UONCxVnc0Kku%4J0i*ei6`7XCQ=CRzU=&Nbt zw$R+Ik3?pue=mse)W+utkX4kXam3`{=%(ACq?x9qtes_NmPL+F3{;9bjyVJu^LRjG z9vkt;mj~1VyV#1}QEm5Yr4__emxipnyg5e?GZdH~3kXzrt0N4C1Oe--Pgysb?yAWb z*-5bN>(X7LsfwcYHJ+-447S*t#aOtuRzWhcj04DWPF=_t0h_gN)NT1^lKCBd-u+ii zOBm#9sm(~EWJ-QM1i^zxC-EDPAQy`;?h2eVQB~YG1*6B_cF0<$Izvk!rmN#yG)Qsg znN*0tXC-{&xyS)PVG`qQ*!8zGUD35^?lD{;mYTAjx@l≺o#O>auuHn4OkE#N*1@ z&+`$hPa7j8?-%kZPqI9uB+BcrLbpEI7CVLBXut8g+^QjZff&T8D|l%yAWTjrBar!> z8`+f`CWm^(4HnH7t92#1f=hhy)Ktp_MOmnS5Qce)Y$*Q#IgaU&dkrvbyGKH7uu)m< zPql@3reTYF&i>dm_@71nxq;S;M{X{%s) zD%C`E$ew7=BLspl>V#k)#CzatTWToW8XfRRr#Oxg*1hd1s;DHn)TKg2Elo0hgp~Vo8x=J*1-HTh z>E)F?hBj#OVNn|q8v*$7*aavyqit-8I|-@WJC^rHRNQH2o-2p}q>)vh!dE!shEQ5g z%%w;LSPdPwTkZF|^T}$x+o|5Qi~fK^n=sxnJOj>Ils?Av1bce&fD z>vvDVSg0vg%%2jB)s+Pq*s34`6j9>x_C9P5*(#f(q*Qbl8r{QP*4L#IRK{&lGs#$x z*7(aWggij3qYK4zCIDaw!r+!|l}!bw^YpcJ;_mVtg%BR$?+93 z$>K;PpCVKMbBneWF~_+9LDC;3RlC!&Fw7eLRV&o4q*v_9+s4DS@42e(2`3tgxL1LR z-EdMeFw5o=4#%<13lAx$tM=yT>UDVB6&v{6Ql6NO)^0t{McQlmTnSw^L z5Y+Md#>8^K7&vS@dSn*Px_u46N*%WT2_@$&ExP!odnV1VxYtQRV6SwRv4YgoG#?Et z&A{PWCSJ-{E#>l(0rm7a_R5%Arde&$R#Qf%j!{oijLeTA;*QujQeTe}KQW(9gy}y| z_P0;0$?<#2JMH$_Bob9z7|OBIOT<6oVnc=!s>8Rw6Qe**+c&we&0>d5f4hB84K2jyxEdEH^&|B!LiaHZCJ}uazQO!;~R)TbA z7>ul7j^T;RV*uogkVZzgSm3l&g{Gsbc?C?IRzUMM4=Ek8(h-19oj@c2Guu#W ztG4`gRPRqbwa+|B#xYMRr=yS_48fQ9jgT^OK?k>{a~8JYUY2yP+tle(F_nd}RyQ!p zQ#{^M!;x?llBthT++zi;jn}e`6*n{s2P*XGWl^J%?Y5+*x;OzCMOu*042Znrc;m+@ z6^RFjW9|!MyrBnBZa0d}#c-#*S(bv1iWiC(mLWY%Lm4j@5b6AR0U7gf3NRZQq`Gsy zZ&vnOeX7%9YM7#EBaxaykg}#i2003Q0n4}^xER+$y$0pnn{3TWWdZpq7dsh_}>F7x@UCif{oBn4!t!xbpHn@!XiLxI?-umG^C{ zX`!QzD2+@^Tf%~lR^ZYBkQA#r$0T?^iB+wQly-U1)X;|btE1?ULSf^k_ zR_~e%P1s2qPg6~7j8AQ;g_Nypy7LkE>%?%7vyu@>Bzhd+5Q*do0J}wflM$eb)RofE z(8nD@!agP%c^W9Z9}%;wW3wpY*%)F@cTv;bE!$_E(%DN%RPOLpS1mMPIgcp` z@M9dm2u2I!BhSkO1vTGJs3&{Q;j5*up4m@dIA|nbycA50&N^0P<;g*gMv>H(%B}-2 zCdRqgbwn)b!K_eg&9&knR2#yG(O+AVQJssO{ zTVb`__q6nNS9*vm{E<8(k}QlwOvB3MdlV#&9?R*b>S`NRf|8eQec?-0c%-Ef#;rV^ zfjnfIM?J<>h-n>*5>FgtYPy4QS?Yf2rLU@`T06?DaM4Xp^-Ul?Qb#FVyn$7O zm_V(J24eeFX{k#XskliYiIAg79{h~%Z6cuEYM3Gr94M@97wkQ-D%Ed*o~Cb>j* z-4&+MX129tkk4+KKs;(#A*7Bce)2dD2PJYa2xdLiNXP_6r?Xvd1lQA7RmW~fyc#Jb zz02W+jGR2OME)e4c@Vx}0WIgw14WL4mWtD9w^#45H6f8=o#; zG9Umd5(xwiOT6^Huc-D4N*nDe&{^P;nyO0$wyenyh?8YysFH6D+W;?TjGjTV0Q9yn zST5lKaTy8*@uR(N^|Z`d-xW0kQcF=ax@g;!P%NCKS->72B$4*pNjtG%Mk7Vy8&G$y*sgnJ>Y~pL{)Tn7y}2skqnewPrKRIC$ji)N z$j(`Y2_>1wp%=h+4ZdK0-}s5R77;p0Z1wZcbD+9V%TZecByihqe-a{u7nN6tVk9PF zT(MRp7xMr>5wE*eiv2*(Zn;pJk|i)0BWNdC*nlJ=FFT%DJ{unluMZ{;bx3s9$JY&l z)Yi@GxTM_hB&G=%RY6w?f+)%uQb!U?9z={t3B|`C3Z5)_3fH-|#Vj#gD5j&Z&@DVQ z6}I8wM^H;fS~!U>gl}T;;f_pDG-o8RAOV6z-RogWsFTILQpGz+0GL2$zbPY|l~rtVlydIH zzrV$N_~OjK1yB`i+RF{j=}4EFOOjBtB+m@bB!MHQ5vb&_OaNl!Hz3YP!Ej2Dx&c|S zwvBC1-}JOo+-JlLY>_Do5i0IH7U9U2jTb5#kjHFuFp*#?0nQg_XHKuz%6?m3 z?`i)4BQ+*UyKPD;Q^q)kCJ-Mg6v>YfNF|igankqVBfj@{eWRkh1>R>6KYTejU{NmELcY_L=`5lbQi;y6W*GfO5<74ZwI zfs78?JGfq3nW3zrji;z`sYfJFO~5+H6$nLdDMVFV2-mTGSnL2gPbd;L$M3qQM}GpU zd*098l-)q3n|#?REwepDkW?*M5WKMt5=Bsnl9Cl8fs!)W1wrl$Y3|Q>uG})*>*9i{ zN?4vqWN9R9(o!lfHhzt24!6L>jd0OIS#@{)OL(58uoG08xmnw(9Dbs_Jj;EkA-(wZkOF#IrJpjDZRg_{#?TB$Nlf zl`q?3qL$n@wZ2N4s=6tj=LFNo9IGWtfTY=Eju7Z-^ zJ))+py*+)X38*Q+Dmi$uvC9x&0zwW~wh04TBMz3yRhBahPU?*mbp9mm$cU9vWHGCA zQvJ>{-HQ5!xb&S;3Qq(O3r(POG|y8-Jv%(7?;3v=ie*`q=}V~|i6FsNAg)y54{UO5 z%!_6U>MLzMZA6h=fd`MyjT(m{oni=xh;7$8>y%Pe zB}6nevdIKg6UkP~;>7%fjIKi#VpxErD+Mdd@Zg0W`D*wr)%NYI)~Z^X$mt=Csa1qD z?GI-`IaT~|qK4u~8BnBWTI=kU*Nw|hER>a0^9NaGbYzw(SHlbAcuW3hb7kbcxhf7M z=PJ$N_$JU2?&>sj^feC!zU>3fkSk29QBNNvZpvA)7zO#Ovq-8~U~*%`5{0|EaYJ2i zdP)oR{@ZYh;HgN+O?+1hP!-$9M;{LJER2VfE^xkKoUps6@0luUUR#6Ji77ZzflW$*U-(4GxpfGtS3W8! zd@uy%pB2aEY5b7eP8DOdY+Jxy;i9}>X;R3vgj9~PQ-s}Ksa zEK4XkX%V7{V+#}DGI3uOxSX>o%X2|baI;lf7|k^C#*o8VP1&j<56LGooS2=;u{=&y zKt1u_EbL^G2lx3a289xjQqMtfriLq(Z2+sJRd=chIcAPBp_N&m4~_@`W<2PDrNET{Jillibl(FvMJ0~N8 zP(B0VMdy$UG-P-rANHxcPvr>L4p zj0sI5a#vOhAmHke`51(377NUTUryRJxA#mGW*YjtWyWi~bx_i~&l2X8mL0qmVir|G zKxPa0Mn-)Go(U&}zzO$MVv=nQo|09yV^z|R9;yp{I73$}GdVnjtc1`GKnkbrja9Rc2(ebAOaZ^ zE!l<@nL!PlfNSp{BP4K9YE9{F+HgZ`wb=@-V0z1V5|{+&&O&kGMihl0_v8ja?lqCD zl-?REj4wk+;W@ch)NxiU82O?=*dBQaOk{uv0D5aeY>4dlJ9BK1^pA%y)GE&`u*PHU z!Joup7=TMR7Rx`NBNMA_5?n0wmYdz~rpWZuEmFJ{6;uBJ5uY+5yuIVWRse+qE!_6f z#BVMk+;&zdi&6KM+oGvdu~(O=qmp>mG^K%jPX)@91hP9xmcizI@!JTXS5s5mwgoa= zp_*#Td@#9&l1GQLA0}~9$f)=P;d7jR935K}^wvGUUnSO-rby|jry_ft;o1qgh9)Jr7ZUun%Ok9lgCRF&qoZAP@^L}X&K?k!ex&f79^ZwxEfg# zS%)KIwgA@flD1{m>u_bPhK`2bv(=GD6@41`&^ACUTL3T^1IP%+zqovQJH57^s-Ek3 zvsBksv~s}o%xS7BB>|C_5ryPRVRCVwe3A$RtpTgIt+t8Qrq<0W87cUcMMmyavgEg7 za0W1cy@Mlfth3t?+iGg5Vlx_u;aNbLJT44*cdrPf8?ui{ za;J`-8)SB0@;d2WR;sCvDOEu{xGBkO0fo*v3>>j1zB}66aJpI{xKLdOz$z=fBZAz~ zK~|AeNE?HvB|cU@UfDQ0+esBoMHNME>WbGujPp-P8?;!fF&;ctMe=d-;1*!SmgU%a zgkEhn-gausjjqhsMu4gDT3VRu6<5W0AYUv`D?Dn5I|0Pw>(Sf&%Q$ecwGTIKsY_v= z=?x`x6mu+;6%`83>rC8X#~6#J0gPmEQ;>bY1hr&#ZNY7Iv)$|MR8huBd8#H3(ct0o zq^Za_0Z3vFLB^}wEmeJG{<@B)sdog+6W28x#}~tuE<{5u5px=0jtU(3NrfJyt>*1? ztfaVYsyf;`byes?@FI72cxly3Fd`VZpbOz(mOw;+3}aa0d6oR(5dp^q2&dVje(pIb zDBc@oqF4nGjZ?!FVm3IKFyc{D9lQ5w8wB$wP1b8wMW&*vL1(9@shUXOs(%?R@KroT zRuWf-9w&@M_CAccBe{=rx7%;=)T9?0+8U$?Y0}i{C8Jf5Kx{J*P=!4CD9BQHWr-;} zqN2ZX?N{4!Y$UF!j+J0Fw@OuoQ6ym(ijOmKjFw_C%PGk{5145oyMXMi&LmQ)w-4U* zuu@)k1lJplNuf1uCE~WBr19hOmUr%|G2Eh_C6N010(M@tZTKwo6jsRYRc%a?QOfNn z!}F`=NPa{x9zphL6f0b8}FUg%DC_O|U z{A2)zU;5cCTvgOo>qWdf2UnP4X{32LhLe^^ivV#4zmxz07$a`Mr`;FZz_?s*4^1Ih zD(O?<`SW5}i5#QzPtIG2sJT1ITQxMIRBwh;FNNhfE?5x3OA*0`5O79Gbh|0d7D!ea zNwm=h#l2tZXWSGw8q0)FDz!>OZJ3xPWoJniqE~#YdU=Cj90mn@GuUSp_KU8;ztgi_ z<0j^4C4x~6NAT5Slm{%W#0Csk0|}pDqkDUH*|y%&j;`TVYpRkmt3^v7SvWd|{v$M; znb_q}9!hYhxd3S)`meYmw_JAMi@~0jwW;YIh8Kt>JyeR}hA>K%4hmqLr?^l`-7}lF z7T7vItn_igKw_7Rx`)9sbt|tQeqD7lazm% z0H#UpfJtt^>au&)uX$J9X(_F?+USycI(pe_p>k502_F!#kRxdyf~XCUJfvVLZFQ%R zb&C&b{Q?LYOku<0`mL2)n%Pyn=`HrNw~ zWNSw4*n4i@JJiFrYv~=Kt)+&dr7A_XrZ<72@P$eessLsHe-q7*Mj>>Ixp&1Cy6Zi< z-&GBkdbt)l$Z6^LRnx&I@YMDPv0yUXi)C07j1wzjZ9UGlRTXy|Rkv}`$n?ocT|!xf zEd*wEl@bJGn7QQ+8bwbqZ#GU_S48x8hX#@NLi-N^Y=+-p*_JwpYxd>mcU!IKl=Gz= zQZq-*T2&*!iE+fnJmtn6x#2y9?OW$qw{^1LB~w}~G}frAV6{Z*Q8(W7+c1)4_71y>0nzw2v)hqLny96qIIS+zbw=+#+7YA50x=@XC_d;tP-F zvuZDBa8_4M=Bnvd>8rC=@)=VTtxIsU-t8Szy-77j-o7m)S37KUP}IFNvPi~E z%Oq>YEX2bFiOcsn)q5Mxr}~5q!|oAvgJay$bgf>ee`mMG%Aly)v=QBvBR_mk1Rf+c zA{cP073tL$R%jJK3ZRS}40lD@dxE-(!)viwcQx+WEwWarrK5ge-D~RG#9*YQGD@oeo~oU=wJeP4z9Y!I&<0coG2yua z9D}0h{{T{U#__+f-WQ9dx!y>nwBDvKM{uQ*IQ)5|F{zQ8l!zC?PZuB#<0nTKP8OJC zlk9|&PUg4nty(RkZQb`u`=z#~)lAnre6*K3`bwo)V|fW$kBE)XsF;x-5#jnsG0zLh zVzYegO3kS~qRq7`q@lJ;5>wo6_lgP&&0E0bpjD-rV_+sEadpTze6Jt|pxCK;BXHYR z{h?)+?N8vmR8@6Q))PxLLe&XHJ3UF{WGqxVqY@cV8~_~1r0EYy_I26~eMq!E-QhC3YOa@KZ38#gjy;yWVTY&o=x*H_T(y{SvolVVt| zcG{+}OG`d~$m>*wk)}xaj!uXPLx3=>=N_eOeR`nktrZsT+m`B!-Ax3Oq_pDHY9Ln% z5n5&?S^!zYAYsIZP@#y|+t!XfySHH2ol#x0YL05gf(jM5twglwz{ecVm&h+0xeVe= zs8G$24!OGF)=PfG+-j72lWta8IlMIl(!lF*2s}D@WsWG_hlUsq4yvES1OwQG!=e*3 z#nU!8H;P3h!H0W@rO>@fi+VvrW4lnZ{TEYXH&OmnQfg8;;2 zkU=;#mClo{`#B|v>`~u#^y+HrE*A^rHIqbu@)4++l|#lK0J3oak_w}DN80^HgK{T_ zRllgx(Go2cOn(TFLmffw+gvFtQOrqpR;=}H({J_SPfj%yF3>gUreg)Te8h0H1|ubnx2(us;si4W3=WmABYqZ z44iN>Lt(V})9s(SsO>eI%QbtJzH4PP{{R7HqBSjU6(S`uBCr4_gO!jDW%3AID-hXX z0s|Ds%y_JR{{S?&++8O2@!cHj#?9K5_14Y(wM{G=t7@^JuB4BRJkrFE3`mn8C6oa= zF$@7X>_F1C%ijBAdPwzFYi7(8=#M3Rrh?iMu0&K*;t3~s!x2~R(s~BTg8n^@{IxR$mEwr3WFdjy{l~6x{I};qH2l@HQHcm zQk4YM_joZocuO1tIYT2zNhHb1x#tR0gXKqF?N{B;x~+5+@YC)KbwC#AZghYN`;j7q zQ{qT+9Xxz8*=IIa7+sGRh+`x0E-E&5n8V z1u8w3Xwyrd^)%C*jB^66lMNx2)K&e2@#X*r{ zY1(Mtv~0L+vvw+^28s@)>@BZlr(M&yC)@7@G!B&1$d$pBz(^ykDCC|V1_MhUn6MdA z4i@CE-1}dslt0CB@|BH-y3T0Q6|E>*IX>dmdhpOIMd5bN{B*} z6w=~ahE-)y?w${rwpTgCPN8irk#nyraJbOZTv8)bZm6WVuY*}$pbrjKE#e}{87j}n zuP^~#Sq9%8!?oai2n3Pol^W~H4}7(4PK(U9ow8-!^;a6YhxlrKS0{nN3J=5tjzwV_ zqTnA87G^v+j!pJW$-B3#uBL{fZ;XMbsTDM^REjbWHU@m9FNfkMK0-%1U<#%iF<$L( z+g5ryd9RcelsCyEYUY-KW~Zj7kVTl0r||r52eBMMZ#ebFbp|`FitYD3J@w$cS!$Tu z>TB$gr3_Tmvc^0K6{>(TtFwYIhmRmRDN?$g&L?Ox4dizwzSu*!u+TI;0yDSl6qcR2 za;DtY8Vb$RaIQ1bT_~!OKN6l7FUg`R>av#Nz8_*0hzwNZjJQLwcZCg}r>U1K=FO$L zToSIPj!2_|)dXl|62lsmjy9T44mg33y5X6RGlC}7NqnKBzf|oCJJZtGk>eIR?XxUO z&@!kJ02`aUVkrkTk$@arU<`uWcKb^v(W_+f~+$zj&tQO0!Yh{s_-9%I!{( z%~+8PAaxAO$bf)yIpwT(6Aeoj#D6A4ZsAGlV*%6T!y_>(b zHO7;5^-{i`kL=;rd;Z4otQ2)~ zRnSbvXyK?|4J2of$rBVfDA`3!uml6=z+9F0+LZgg_ielG*ld$SStJ!R%S$wL)6%Oh zK#F%NIX5LZe1rYrkab`|(yhN+w(Zn63i>*0s>cOgGc>{8rD>sf$aIX7*iSGDz?D!k zpmNtQQK^n5Y=}`OpWkJpruUn73!t|S=-S;wwB75z<&|h7nd6#C6vOd!kU-2)&JI+} z*dcu}^8jfg$I|YI+h_Z}k7Wrr4IMl&nVt#imOKn%800x6KqHr9+auFDt8ZOZpKZ`l zM+D7D4HIxyrJ715sh&A9yil<0&nO@kDS~^q9F)p0v~}(+*;N&fbC{NDliDoK(@rv? zH4>8EcO(z)s2!N713sHkH16G4?sy5J2F5x01>0L|WZEp&!DqC?dX5@d zeDlLd+|Eld{8$-me6-1HqN24SsJB8^1;Av6n1G-RV+t|b(*xI3_e^@#b=-2&19PPn z_UTve3vr-GC#X}H$1^D&80N@BC=7VG31I@lT$_rTqiT!;C4{Q1Rq1`kFKnFswi(!JWWjS zcn2#YpagsN$j@`?Kd!6Wmgk_h;i9?0H^t1f>WxyU<@*FhM{KJfHaig5$Eg}zku|hh znG~*hqB4><4%dQ_7S&;v7;f~99Ff!1JG)dV00i-mnMpj57Rcn|zkcR6Mb7hL+KTd6 z?od+2A!+C?1U$6zjAk;jeiif}mQ}$AIBe>}k8Cw%9N*fTYScwt8HFi3o&b+GCI^;J zn1PZMA75PyJu{}T)7Nf2wMF5}TB|ih36KUXA`z7i4<71^-?1bNwu!LF1%R2?jmK+} zmi6fV#Oi$~D5~3TR#mTtivlchJLEQ6F5@Q{Ay05meD~D@zxp@3_KkElTaML&s*94t zOJ7HsAjTW`jz^htapYh!K>+*fr>O3?KY~lGO`<8Jh7%Iy%1F|$tY?aqVtatek>&Kp zx7~NO7l358Q#`IAlQAT~Il`;rt9kULKMvo?oNDk)8aipLTWfMfRJ8CgT6&2b%AEYhP6f)d9AFDNDY$(ax66a!W$LSaaxouL^TmjA*ZGBM9~04_-awT2*ihm0Z!x}S4tm^xYp3r z-dS!bRT4vOa6TELlyTu4ix4~`RWHbqkihl@m}rAmCfKasdAcu{AL>$L5a_l>bJnTwoFO;=0J{yI3zZSCtFEAx76>DnBxxf!Agbj+jgYs{f-*@O zNx5|bxYWru%-Z#a-B()-5ltj9z_aF4g=B@vEI9FegN7I#js?L*_ITa2w)!gVxfOld z8aj1J=qjqx63PUGhjuCm!!QL~)AH_vNowC+D7(!v?D(FR@gy}A_b6ye12jZ=rjx`e z%aJ@;4oL-$4whhhS#y(KqXkC3%`sMYeZjhD<9f^8y6+Sc#~g@KiNJVd@o-NiP!}o? z4{k~5IGq;R6meXy5#1xE*c#<(;fb<;Nb}#6#yP}O(fZw)ydbr~Q&)77-A?hCYc0}L)JoDSC-C@qa(MI_I$W6@tkP`Jq2?*BGXxtOY7zR%YYHnl>tq$39br@*J65&JG84y`^W^_L`-%?pw|B=M=KTAcg}4JB8+a z6_L+0!+AmMJF4LFIv42W*Adhr#sUY>7SMyyD4IHQ(=)?O6tc}wrzLU^9w>X2AOoJ* z4fO63qK#-NW2~a7YH>f7j~EJF8IBnD>=8lj=*QGx>7RG(x(YkAH$9hP+(~7*(=~U( zS3@Lo)0Ade1dM~spt(86W#Do%okq9STdq`Jb{GMtmk`9Ee5O+1_<+8Cxyi?wkIP&g zMv?j%OJx`P`>J8yEo!n~t19Ts>m*h27mvi5rd3Ewasd~Th9}BF!5PL*0Rvm$xp*_v zJsmJuDkKooI!YWgqzr}b09+|Oh5;V_qv1V*-0;k8d>FMKx2`R7Q(4L@;EQ2 zek0f%Y)Xk_LvN&leo>ZC<159P43iWCx6G*ek7KNoM#mfsAK&VV_WPwZCBm0*pSr0G zDGal9n_ZgMB_t@$z)F#bTapIO4nrO%w|}ky?W6_Tw}Dw5 zMPtcD1nAL*oSA+gFk~`0Udk1nUl=FKzNggGRB^>e;Z$CJCMY9wFNXYIh#)I6k>muG z97)e&4}U>1n5(AnLVQw^2INBdeA;v|W_nsyYFNf27?ZnT^DmM)VUMN&0Q>4iU)=)S zE9j~tiWQK&o+KTKF_+7;egnuiVn<``+d`7eQUs~-XrGbr>d%YDC+*2OFXG7ZjAVg= zf13b`-`3ki_Zvl`sp_dEc#>G8!7>nX$~_yqb~*e*Io62Jn*@{J)BYxswc2N*+%$$t z$t8%WQ3r*DL_9#{$RQca5<8GUJ&(BhJ(azz^>WbAR&aw2H;E-tW`ac_Lj@evfJSl` zJ%&zlbtYQd-7F<9by8BxRu-C5Q!)tPk-f+&53xAOJ^c=f;>lLG7^!1tkhC+R(=Uv( zNtF^YB!8R0Q|*kmrnZS3)|QrlK30PTV^c?br==5{v}WcxD^taAL~b3jI1(6kB;fQDC$YwT8`sq7&4B6Y!PHfk*x_6?-BGpmHqkw*isMrR z^=e=-)BgaIsm^>rj`5a4bHtSy7{+pS8pE^q9?FWc-zNV6yVcN5NhM6^%CfvZUPTsn zRV*^(4kOVs+t*a(U5bW|vRj3&rnU;@k>{U`F{0oDh|2LC2`$C3+aPv0>~77}3yr!% zX{Nnhpe9b`qH2hf9$YMHLaLQMVEG-pk2bqa@tGb(Q=1>%Sqm`J?XusZZ?pZX=`In= zLnL!e8c*=?&p2Q5lAycuR&^j@zM;DSPBcc(XR&ogqD$qQY)9jO?wNB>5pY2$Ks=C= zPBK0Hbwlp%ich$0;`6cUsp)2@MwY&kIRt(*>Ifvn*eIkP$TA6RkCval&wJzkN1(ad zuGWf)60!*qC7n!fkL2Mf!7<~?aK*FiaC6Xz$2QkGVq5wpIh#Q&ZdHRW&8OS+(=FR+ z-l+?;jpEZ?4Ma$tk1U~VXShBup~1s;(QUoF#egl!_j$fb?M%?cO7JYuECdcYEh?<4 za0otA^9$*zRbOdZYlRcjTWIO6{zMet6%?|^Qmy|0G&v_FU_0Z9`Hx*AU$+6=b@cMR zT(q!~r5c_A;UGSxn07)z&!Hoc$?OiUd07YbbWQ}0#C`9-=91P(>ujQt`JUa?8K~*D zM@}lN6|AczUCO#Bt&nS2`ej{^XL3Y&(pR+sr#> z-x}yUbT&%cR8!hdKYU+lim8c_^ z_<gc>W3OWinB7$Qml7@jJ zpUv64>kt?t8SS4zp86q2S!23QO%2|Pj#~ODiz%LlnojHp1;UkZ2jU&cIPMR#{ja4| zG&Ck{$w5ynP(~_h>T9HEmKAgd!&ZyJE;9fq?6t;QD&I`G1IrM1%(tIPQo`rzWxzrS>s7A6033wF~|ktq_%rw)C`|(2mZ@-4l1X*O=Y=N zOGhJ?nx3)QIVtr;M;<0U+$r?NdmUwxC$*sKbpHTBU!hP4-~Rx{^u4{l&KA1s3d_8u zOYO=!WOytuW;52bg%|iyh?%5TQo}BThyx_?)h$Q%L)&)k-6q|`-l($1A-U>~t z`!(+iR1vL;nwq|z2$V%FEWAST7|D`VLjM3v5;Qi~(@vsPS3SCyYnkpSzBdMVQJHcE zNhh%S=ilF5K_A*GI4G&in@-&&9XVK<8adm=L{0XldmWA*3#OiQFSb!yTDh3I;v059W2zy+`{+ z^y2YNPX$KPxn8Xlby3VCqlwx@s)j((oHB*u$#LZ;^X@d=(z|y^_g2)Gc}q)KdV94? z%Oq7zEj-YYpcu_Ok_KGh5D9Nka!JmPPvNLu2S#77{6p4w9(Lt&J+E$7brB%i)s}&| zB&brRAqc1eM}H{fd^~#c1YqRp7pOmH8wIw$8gJ~)>cv$rbc!ieqH)OgDmkD%DP*nN?Jwc4j$Za1KHS&AYd)Te`YU z)j@N%++{F4KNoJ5C8ms%g95+XOo}Pm06Py8#K$5|dnq`_d>t^@b~fL$+(DqCSSunJ#N5(CNcRPbk?2MT ze2-s$(tAftwza;#ZPjt2hUIW?{9jM;GJHvdD-!3FnZuR@p8bHp_axW$3fob2iupAK z6+E=g&j4Boc`IWAPF?>1Fc0)PC-@xlV9WmipCucpV|WYmve{w2TxT>?R=UcHlC6cO zr)QL}`zxQ!=*w)q<4uZ+ZJmE!BOIQBToc>h7{TrRJL|t`HqErv$9uV@E7nuVnP1_= zK#n{|VcQtN8T85TudW-i)G4Np!DF84AX2XIg^CF94hM+jXV8qGY-n5jI>0}vC)@s` z_Qzc{tA(j{7f~;E>FOvpb!7eoz6-B}6Age^1t*bU2=oU)?mIVjQ&ho4KFq#R&s!*p z6*MxboDtO?x%GErq?G*Hg`vNHGO5uDw-;L-8&elmYo_%!?jD`BZX8XF$XS6 zhV<5`ydDO-`h=gd2TtNYrl_uo^lxwVc9!Q`LvpK1J7q|sl+(x(VO7VM7936#4_@EQ zK1Ww#eT%HMyl0bg-5L1eBJCbf1LYrs@;TR^W)70j{hcS=^cUx*Yu)~|*3A_uGk6dr zjp0Wmq=3!BWdT4ZIT>v+@4vKO;kDP@=w!EBP?zT$>KDshl-~J4CE3)I%lwHnkX<*Cc10)vYzgn6J&JOrkb;L^%CEBsPQ<| zT5M9W#H2Cc)oqB=3XEp{l5=ro6pHRW(7VtCaGd z8N+fk{vkiZbuXR>I|Of2+$~@B%{VnCF_BWoW|2i8JwqSy_;( zV6jt@%rH6ct#_C%R5X)qN{cw2pW;@o*J`>fwQErEt2<7dP8fp7c=Bwq%M9yY8Z4~g zoAA}U?KSq9ui5wdU6s?_+fOtil-AZsH8ge6yOwm4HSs__upfxWa^REg&zondkGtBDrVwzZA#4?eLe+_^KIl#yXQCUtX zZFiV%G_~|M2#kRuxU_Q2*&r-JNR`<75(GqG9Jg%hgM#L0BBQrMOqEr)XQq0x>Q@bu z#33GF84#0#Ig$v^5KYaqdOJaU+v1;g^#v>!TZL5BR9ktisXUbN7vUVLS^PoxSl}Fx za&k^|i6DbiK$HTG%LTNlb~(1H@4IEgbKbXIZr!xi$9Iy&Nh+jtw>4PRYLxj*jD|Gw zxW{vXy6&4lP&!xEtIp24ZH?hW1%B8wRn}0{W|Fp`%7POZjzB+#UBPC~G8c}0MIxVM z+RdxBrra01rLwkyiWhkYi!7j`70O$qFs1~XBWi@1Vw&P`5K}`sjnxQ3Xr<1rOL~@}(I3N!;N%>Kh zEvHudw{TwU_0qK0cxi+jya{EJNKi)`c(N&UOhx5b_^D$4W&{mGg7Ij)$sGv0L02`t zV+@hKWWFzo6r+4XC@4rCBbM$Mf$A_ciS<1u-4xiM>K<1`)^#&v*kq_Qb$3q@Xr8L7 zxLN9CjwsaN4rLWN632=zP61*#g4#mfT};@$K-iV^TXOY1)uN-Qj!0*sXe6AnGXDS% zkU=0MckqcBE8KPlk-eHp5^b@!>XN28>L86r859IS$to8ilmHp9xb2((x`|b^t0<*P z*lbpcNceaZ%qJ^6Q1ax96l90Oqpinxpcui9CJEKS0h9rC**#HuFvCcg-a?Q4PePp)F zuGxm^Pe)HAf_kTBkHwP#Kt{)udy)t}$mQ#h1pkfogM|wztt(rr5VM zlG58CzgI&PZ^Egl);cip@xm@yUBmc;&PS-nwltkjLl)$yub{Rmf$g)@QCuKum5yj? zqhPG0D9+p#|^jT^s5NflhT3-{Q#~scxCZj>2)j6>UOGxIuKQs*!2A6KI zQoXv@O>LH{DJsjoJhB=5E;2iCER7h*EuRwuxA#fy>#3DiEzwnIdBwV_mYy__Oo+T51zSC~4{{R+iW-%xk~rFG`nf6Oie&8R!VYgB1zSEseTWA- ztTzW+`ec`?o2{PhQ9Zgipofhe8=6{n3+4*47+kUSIZ_X9`6o06@7{Zldv1Nff1U2~ zsX-*QmGFtAT<3!WAVgBf0G#Fsw;bn%F1}y(^V0V@`oy|C`KS-%s}#<**d0f zcB|c81eV(GyA1=!G?7T~LS~MnaAuHC09G;6l<%Z5Nod>)1cX;l3>L}LBVzN@aE#TDBPRJop*>cL^notSAHF zxW<*X)q*n6SD==T3XW8?wN(T>VWi^7V#wryS~7ixR4!LKvuA6yF4-GfXxC81UwLTl zPg_wOLZ9P@iu|K8EAo_?(n33SC0Dq@=ib2P#aR6lHx>=RD%Q5Ec+_qm?Byp=uP(Dm z{z!>f@h=CAV}deak9__$2evSMA>1u;L2{OvHx2Qmpm(VFsk}!*mavOpd8D{omSHkAVenOI zO12rY!=Ia%BEd-^yL;&6k7!@(YzesU8=|6?gwVRLg+^X@!a9^fa1bdtC4%G1*d*#D z%CF)+2G>JrS>vS<%TdZy;H?-3y0$>ZRE&Z!eMU8wj zbJWpQz3!Iz&fi$8M(HI`=3yYC#E5$jC{O_{*n1AzV{0RLu|0LwDegA|EksE5Xs$AY zut)Pb$8P5(eLxvH*t9mAJAK}i=#s{$9lI}&6M6Uy1D5a0vkYe#*0ZPtWZ^4exZGY>u2gzpX=&w+xH>3cxnv3(lb{99bC1ZDYYykz6WZQ78zm(|_>7Yxz@NcJ!aK<# zmcT(LAh{S)G7bg>R?t($TO@H>x&HtSV>p8@`9(P@7cN6N?hbo;V;b4Et`sRvT~kZ< zc!mY%BvH#GP~Z$6vgkT?0c7>t9+GJ;u8Wd{eh%xFE<0VP8dP2)*4 zo&+BbSz5eEwReJ=+H0 zs5L~Vrny*WsiCf=fK320e+=^RMg~tH2X8~jAAEc1nppnsdS=}AI@&vUj7=wq(g_GI zN-{qMU&Pa6yNrySdTB}MWRj-t6;X{kW6$G#ID<4luW;-2A8ZK%4| z)i1( zw-SuF8SXNf@8$5$NEy)EgqF&x%3E)TUh#==vBLs^97>2W&jDg2la>Jf5`FY}DByb~ zOh}JK2s0VlJcN`Hm2mBXz0~(7xncT8puWp+9u=w%2-AD)}DX)fglOcQ8rO?*_Aw@O=N za=lGE!Wu`7Tf`EvU*hBk@{dLD>7H5#v37>y-g3=j*p_9xZaT>1L^3e&sbP__#%5x% z#t7h<$vv<;w-W7U+tOXDC!JycLz}E>F$?! z;QPX*LKLK=m`GJn6$H#w2ta2FguXC)VVa2ED5+{%0W!76#LN|uwLq<6Re_Es1$$va zu{gm19Cp-w<$rjpYooeP;Z7bo%Eqe7-0~yC02VemiTygiBwywCN|n*HkV;Y7n?C2iL+$;f zOiu+jj@OHdp8_XVV)70nE6m_=3Q1-dIV5V==$_iJY@NeVdff8VT=x`GhN6O&l3xjV zM8m|Cy5}qBARag@4}6U>S?AkZYi!ckA-LMx$Ey``*HhkNcM`C2pr8pPJ)D7@jEuHR zX%g_&R~vTVuS;#V<3TNQMJ*7KQn$oUGPsv4o^Hw*pah=5jsfYq7U_jd2zRO$I6ExJ zPgM;q&bD2}S4}}LfYo!y_mu=-(nipbvH$}4c#kJ8)-L}p%1#ZO`w4kY1uFecmD z4Yw%ie(j3B-eqcu8C~R(Mv(FHuOd%}kl%((u+9J>uzjoBcd8AOLv7ubxbHH{B8qB? zn4M{(b_`+^Ya6E-IAy$`kHy`Gp_+<1&7ZT@`(IB{;?B=g8eJ+x(_vE~%1b6xDyugp zIRS77uC>2QGngz|TXhkO7M7!_-LqX|+0+(@tLfyTl4@(B)k7M?6tCd`A&po!E-oCj zZUGH~K<`LN6`Oe8ZaW^P&~5b8RTETN?g;8tqiI6AGBRnd;di=bKfEHzL&U`vvK zl{v;Z=ZPGBdx5Kt2SZfKKDLLf#~*n-^oygLpLyS?wxY-IRJ7;fnzo)uUKrz$pA(X! zGDf-bfu2muj9}z+_0Q}Zv9C0dd`9A~T7_t3erU2P%7gK*;b4E-&(wNqxat1@+GB3? z+TR3}yEWvYk>G;5zM{AqsU*NvdH63B@{&~mBOQS!I_Q3${iJp`Q2>=dYQL@bJEa{3 z>VksXQYqrBsa5z|=}HrbWr>+&TzijlJ;n!07-4HIFo1ODrMrjh=S?jJ zz}dD-{kC=Zi>*|34^4Her~s113Np9~5mf;vx$aJh{{YG_+3%{9ZAHEAvo#g4?+HOxC&DrD@Wgrkk?7X9^XvtgKEz?c~WFv@`0Vf z&i%3XEsJtpEd2}W-O$zBA&#N!JC=EBsb@)~Bf?oG9HYTkAmsWCk$_7M+uqx@_2SRH z?6kJHLK6(IO%$;CLk7gk8CM;@Xr=*$SWihhgub8bg7;g%}&w$uCsmoL2E#i{Y7 zG6ErrPY}9^VvOW~N_*sFngn64cVr~COnRVQA=x{ur5)PEx$d?Is0j;9?HGu8j&i)z zaUe)}I`Cd39@rYYEVp~b(t0?q79YChG(sz_bsJE^tRp|hCBa28#lWxxvBQ2QQQi*U zsgl=C9Zk|ork9fQw`ut zJvSc_Sqt&*@-sQ`!h#2XFMizFOXZTC!CM#ucw4CJN?L63Qpp`nYSj2twG~k#3doQ* z7~=~Ycs!7IaEJhGucI>*uuZw0O;=AWF+oXAIPsQArBZ>IFf0*yWqV^QlIe9FusA6slsGBQD!8nUX}|I1MdGN- z5SEc9nks(_EiocAWJOhB5Xxkp3cZ1K5lgyl_KW=u@_Mszp^};E>FZ~N(@RZNFp4FL zK_{IVOUua_0+A1?AmJ|SO(gr08#dvgsod31N*StSqk@{>Pa@1zKx%OQBfF{2Rgrj% zD8X$pR#NT#!_#Q*RGS*I+cibOD4X8k2I<%+1M8G6 zkhoHvx;NbwZNkw@WUkzFR@$REsh*O@JxoxzcO2ECA6~kx@udM%8n)w(V_^{NLYArn2GL+&c0^x6qCfN)ZI}XK&#qxw$7TGi)P*MWm`>c z(sogCQW;WJ%oq`PYbzpi!8l@|j>kG@aJI*{?VBoFTUe`YbP%`4Nma(4r77oLODyWy zUgf_VapXuj8n@}5G}p5ykUq#6D;)Z?<4vQ$Xt)qGBJWJ8(SNXWrgctZJYf?6@KMO?J~yiK}RJ$ zs(D^zegpv|ZlyS`Q^tZ!E^^luYT|CpsuSlpGP|qR|gevm@ zu~rdhmtb^W*(6eZ?{lxS#am`I9MWZ&E6B*6A!g?w4$P_#asdFGA5tRW@!NJAm38!_4dO@U=L7r;?C)R9g`=xcCa&0@*)RgN2 zMMVs8yo*x|XE;^>_-wI15?P5p4t$|V&^>{)`kzgBj^}&3-Y*u)gsq+$!!j%hS-^^T zjBGqnC=JP+x{u+Us46tWyLJ`I>AWr#w++Qyu}yNOtDdF>;)UJ-8C_qw^+KfbVsJ6U zg&AA+6x6m!Y!tUUG~0u|BZp!JSl}i}JceBDmGII+x0q_` zT8SwUq^FL78L82ii_EN8ab7Lz-Pf5OY;hjaZ0C-Z1^U}hQ5B}3d<-8M46kzWqEXDT zKf{Gkl@X{c1ZoQ&CsQmNej7FNdxb@1<8M+>m}sgZVqgp;R%S?iHaw)yh8Zx?jB@e= ztCn{?f->P_;Yb?L(_k$dr)Jvk220g!YLihyttDh|C&Gy34r8C57~z+leEb(5vGjxOE8R_ZPIa33glx4`94#Y5E0a<}Oc=FYqyet(r`l|bdg5g?} z@zJshXNsm6OwrBf!#4ynh#3`CoCi5MV7liXw$t3L)zo`#j_FT!+wF3aI#r4iS{itx zW@ULfV~Vg5;4*{XI0w68CDDeL=F;8evKp%jt2LqKX?GkiJ$+Py2#j^97^r6_B)0|& z!?5%|o`>GS=yuN9^VgbbFK*JxO(je-aFil4l8fRVC0$>LSppn@e~0dAUCUK}NTHT0 zVg=Hn{w8P|Na7U?50WxKjmAhkff>mF5DC?f)BC33u#}WnG!fQE%0ChywMgm%WH?Y+ zGCPI@;~YpMwz+z-w{KJIl+f3ob#$)zrK#9^8V6_^B(YFa)qz=7%j2W31I@r!kzkCDy35Px)UMW{qZkEeOhmXt=RJOJfXsXBtqhi>f=y z{dB+6#Z^l1Ok|RlqLMK}crOyXUBP@6Y?2rbKpZ!q#Mw8C%`IhJZsnfWTD31zB$X^` z8YKgig%>Itu*l**c_WA{ZEs1G`7)@2O@?7bte~jbHmVwnb=I+|YTYOzNTDq2Hb*3K z;H-E#%alBT9C6=?iSM?^XO5=pS#4?EP{TbO?}l(Yasfz27#RepIP~lehBm|8cMG_u zhTT^~ZH$=fsun&?SXNQosa8@i18Z*m*|{mGCffGHO>C|4DXmuvinUw8;c*W23SdC-K6tC4Kg=`ODWtc3 z4Zgz+GskkPrM6mWS%jPnrg>x}w1!y6l1Yjzz53ZVe1$V5vNnDp2ikReiBa+=p zXA4GR{%7!+8^o3SfDbGlI0HEfk)xzY1M~GwW%U5RqUamkQqHl>aG;9kR`4K_T9EQl zPb989K;~7!RRlV)2owe!Nh1a}rNeJ+`lq#9w(?R@(|k-Hc|;P32~@OxUPKd;08-7! z_B>Tc8iOrNHMMkfH!2fAU_}W%br7io4VGhu2)F@)m0V-n(RDK6_m$Rx?F$Sv7b%EJ zYLd{xU>w*6Eu8aG7=&El#b z4Oc7i$mYCZ?n19%x$^~T;%(p4eY;+kx-0$Hanws3)KFB`*Ae40Hy~CKKZzhEfCR<{ zV)BK^Cd1mdl%ArZ-MuO38u@A*R;C{ko5yJbukk}5jmH@nf>e@FkFKTATeh9Gm7^4o zSq(c&YOX2a31L$qNFszfz2&ei z)a_XXJ5`2@kA(6s5?sbnRA;^mGPVW?c2k0v?xxk!*xKnD)kE=CrK*~pZVwmnR&}N& zeQ_JGEEg)w2>=t^!rIqe)3~LpFj%d?RxGtN%W0NXiRnTCKOmq}#Q=BX;rW?~P^0;^ zr+Ztd_pNQ`YHm-w;H8?+K`jA!>1m{>j55eTk}%B?jHI2}vE8xQ&jys z=YnlzxGlEp-P3E)Ee&Pn@pm)U(p1v2uP7siLh(GR<)TyN1sJcDunt3E%A;{w?3KUx z`tw&EsL4eQB|Wle#WWH#$B9vym8Ss6t>Q7q5)TkCHBeFX`*hacQqj|B?G_7^)sa2c z>e4++MFdOYqet0`%2f+_LiQ-3h$V%KZ`p_9QZ27zx6;`rmZF}f>0e6{$#9-kWbV(} zNaSaYK|&Pp#sKZ9EO8Goe&Og4#9ZeR@k!Hk@2YwTXP}Pxa+Mgq!9^#JUY^L2%K^02LRLk&nH4Hz7j7KFguqm7ohi@-& zlD9jh9omlFHIUoB@wFg)p(<*S<1q-bUS+9 zIKvc?g=ghE$~;0_h?1ehcPWn8<1=X3FFR!X6-^x#S)->#no=YZNd#$!%Ak3hlL=cM ztV}#e2MQ;sv{qZ~#@n|V>0MHiLk%T+#I8a?1fl0wP;n=V$st^q20%OHG1Hxka7}5n zy}CP(_HL?G0qN-yX%xoDipDfj2$5Bl10#3gkQ*JOvX_jX$x~V?nulB}1qJ;isoTQU zR%KWb?(?lpM96>-45BkNJS=3+aljIDk`AUO$gZGz9n)OFp|;h%Wko$5Oi;!p@SHEi zDzO0qsKSsrJAv5=8rea&qO>aAw(T8#`np*|LvXBsnrDrF8^?t_r6q_wlsl9?n0jfh z-4#Cv1qH&-UH79^#Z4?Lc0k@%9AuU`UNaU0^Wv&b0cIKEG?p~(w&60%f<0!ftgU6N zzgI&^xXQgdy+mx3-W)^3<4%YOUdni&0lYBmSoaGCTeU4+{+!q@Qc>Jg2^yYDWYETr zGW)sLlPWShq}q1I==j+$mMSWm+kXZ4WvZen zG%=OQD0n(6@(!48Su7X%bk(+ZG@JKgKJ2WnqI(C%y#z}NJZ!K=LKTTfR!%NeaNv4i zj@o9R+p^o5u7z)Q%Ia)1l8y_NR3IxdkcE{%#z1c5ch7wm&dyG2!+q6I*ELO5N>WwU z%SSa!Ij(!u&lOD!BL$V|!WmjVEUU#F2gZ40Csj$?_1}5dU3y!!Ox9W$9$S?g)5jW7 z#^GE@hxw71F;)aV3wcyvo7-^heV=oyddr^Vqq##2v7*BCNM4Q=Vypo|yg(8+e&A%} z9Ai;>VYBwVHu0yIWZ&vm)YU@_0ff=Ka`1GgbBu{RJ}(-_!SGHLsmmH;3?QnI)#6N`n$Wh4#a(n#MH$C33V{STY4eohpt+yG?#%rKfT4t)LloyHlF$Q2F z1R!Psok_-YPVo(=a8p%O!nRwjzKxI?>x#8%(nwgND2piq6#PAiWB`-PCtTsw677Gx z^|XS};1B4B-1g)hLZYpq*xR<6dZ4RQOtL7Bp)!2D!?y`yB@g+zT#iQyF^wS_+t%B> zr55z2x7h1rj!`@_4+UM(L0O_-G{lcN!A>Pvy#se?zU-?NwgbAC?+RM_X*@|~@;>VuEq=?OxkI$>bnQ)BPZ^4b$Ch{{cEd=q$0MqwioljYz?>;w zMZFrVw~vFWr8bMCwa-+t#`Pv3L#GBfX?(?91Z)p%VGnXfbf0h8{VBQ8RaNbqt;1;D zs}*97g81^)P)6){cx;GA6WFNb8x`a@oav7BW9r3|Y%TYv_BbyHj~^KA5!vIN9fl|Qj&2&HzIj{NtLOTT8vGYVu;F6)!Z`!vV)`}rAQYwk#p0)|R zM{;sy4#=vH$wIP(z#gRPL{xPULpQ`&X*_X4j49)YDTJ5HyUh4fN#lf84l#f*0~*h7 zRd0)x?&~MQTj;YylQp)6-qNUsHo-@cTLsyPB~ZU;l$?(#v!b~(BT-o`S19gAX0MJ~ z!4xq}fF4;2v9U%2y7){<$-yJF37+Bs6r-3M?yZ02@l{mcE_HO@1dzxfqNACg;^N_j z5~QjE@#K4#_5~JzPyJy_nt83h= zcJozG-4$v)9|?h4W~J=XFf66=tun-@7z}n&4{+r4PW4e&+-)@!=&?^NER0rIDm<); zAv{ZfvA99WRE1(W94ONIZjA7(G>odk=e4?vLk*fbc&QC}qw2J9-Cixhx2x4FWEB$`<%$)WnO}==X=Oc>fa>j-yu}d8tsf$xi=PydPJ3ZM)Y&$iyJmPMwNzWFDJ~^G zG6*D=tyr@~;e=+J2(j~TIdlLnLcejRmb8i^DXhV;tm_@}YWf=J)^u9>UlZaC5*cBU z7A`T!@+m0XfDP&D8zUf%V?|w6x9PvgWR@7J8fYGKBxuu2LqClCq>Pc}3RgMFJ%|Jv zPMd#H?fccy_U_}Jn$;ylcFF0k61_zA)vWRumw|368I6PS^LY!F0f^PpwzrKH&uy$V zdv>N7E_E+eMI{tP5#BdW{7Emw5=g-B;gUUuxyBh_lbcL%uuUTmQ5Nx_rl7x7#RbmQ zDDh&3^AgBI#pNbA-wX?m1xF+JPJTk;B7)mV6=e3?hz;JBnFAtn0fS;+#6q4Sn3T_R zk=sYN0kg$wNU6RaNvhG7s(4evoz4`qGn6dMLjm&bf_=4CT`BE0tFqj!J9#ME!G$26 z;aTIB0wAocoQWlHsxkuOm*=eqs^gwgqZ__TR`{-}tBe>@_iSk7Namz~%3&_-OlYcr#b*Ho%pq7T<>LoSShicF)mu9Ms>8T{6jydC=9L%BS zkr;Stz0ned$-XX*W&En#nyxc8XdL1}T05Y2~VQIdxWG9RWZJyAMPdBzF+1dY1LnW+>@C zBBpquj!DonvWzc^jetswqU0RoKQ=nYCXvuK;~c647f@H-&ihrnEzfFORs#Wp9@sVg@|pI(Pwq5k>0UPm;--xfSu3VL4dKX4UMw#d zX9^g|bK984JcARq*5S9*S?8Xw;f+;Hs9>v_1>*`~V<;iyI0f**<&|QkhnKi4H%GME z;)1TTZCom&vPP9u!nK_uot^kHM2XvrC#sVn2u?u&;%T0D1`f&=9^r0|*+a1G@m*_a z#j+?Ml_!!a#geiNp6w=W)346 zNf^YSoVH3}@@CIqq-Yh-W8bSjChfPYsy6oKW%#GGwIr%!j~V9l`5qgwQaH4JWh>VcoHVUsIp;(Zslp`&HEuzD@DREVDr@C4a zO7FfXTbZX40<6wuS5%CaJ-jyMf%rX5XLq^KRZ(B6rQMaS1=;w?PY9LkO9~LYSm`kQ_?|IU30rr+bXI#RLfbDGkI{Q!6lkhJR`w%3NhTLsj~RPX{RW6 z84Vs4wP3sLtB&eO@4K3c8r{Gpj-}?N@h6IPj!5Bnd?iTXD=PLpk01tB2|TI`thJKf zVUFi~j%$qsZ9#CAI0ku8nc%8lD8sU;7(T4syMvQ;+b46)Zls<%ccQ8?NiDv={{SXZ ztN;cv79wAtbvXnap86oxXf9js**$Hu!xK}&ZVVTQjzK0GoT(mR$Si{)ae;zC0B4dZ z8??B7b^GO8hDnEw``FJ7bPjT3cAJFMy-??^$+O}qv_h5<`;PE1(sez%8R4^nLZc6UO zR|R+gc;mku9U7JqsFBCl{v>JK=EC1jRW;N|H{CS_Y_RWZEHsipCHQ(k{{R}`@$*L{ zv4(##F*#x7!V`rVi(qT~wo7g5qkCOzW#RD?IjgF(OIN{_5}gmM3LIsg9$d1DyfRLh zH)h-0RkzshcPQ!NGKN!7lnx~;hHx5wKq|3NK#T*#U?>M5S52y?vfO07bt23lpqfgW zS|Tdxspu@>6{RdfBB5?@$AvOwa=?~lU^K+wV>j6o+UvFD9`@eV)b{$g1-dBODQnC% z*7~_>7L}w_Ws&8nRCwebAzu-Je<)(Xd63^}%N2BR>z4ae{+_ze7G!*pBOBEe8O-)#ss=);p!%P|< zReu!5s;EyQNj$9^Ur>LvLQRdg_FWB@*Hr%icP*;_01V^eLK3OZCp96N2Ny!paO9+U z)W1d0G7`;1Kx3N!0CuthU*&cZUe}qv6h0i;|>jG(&rBo}~3|(?|DAcfF~8s&Q?qwA0i}ZSZR;9p^KtD6#OCHjTM( z?9oVL>|ALhcx(=!-S?YrRogbG<+e#xZ5H}TQl6Hwi-Q-Yj-sSG$O4j8ayWO-3@Fr_ zM*8cQL%b?#o}J(B8&>EIS-Hy$wJ=d}ZX~%_mkux(gXJNV6mG{(eaTY9T3_>2Xc~Qh zte%bAZ5W=(xl${lSmAR$;!BkjaZgQ8Cz=|Mf`w(96E`^F@y1yB-A(~%q^CSpz4C z!y#%5a#7_*BN@E9;z_|D45O}-aotP3Uu<-?i+1MQmkDlal@|z&6)bVl&SsTq;gyo5 z7Bd+DBfNu=R$nei99A~fcG8}jmta(Fi?to9jn-h3c%hzDB~46<@(O@_5Xe-> zz;X;D{3k|iyC!}0VtY-tb0yA);;KAPj4w56_w_X%zB+v#o9R{A(5j-Icwgh?tDou*`2V1U{l+x zwn8Nw$w5my)lXYB4BjHkB1a`$#7qk-k{E!f{h5bjZ1ob&W@Oy9)6;K&t!p8sON)ss zBc6es3beU`Hu6p8DoT^Bx>&@_EMHl=Y49w34+wR5cWA!af}QHZn&&JZz!J!Ay*RN@5zm zw#mhT#iJ%CGjmGf+Pl9{x_w?NHbs%G!UNznN?9n3j-wt|oeYJ80=(3=8@M{?f3q)B z>{r?9CyujoQf~&SbgTv5z3I`ys+feQl0d9v1wnZLE0cke)oJS2NjlfM>=t{z*0^1$ z?s82{Nm~uADaAa2%cN6?-Q|laxe@@!)Q4|37CqC_ee+3dsl99}ODU(ZBvlY)swC%3 zkw#-yfhznNXW$zw(T;44czJ<6J#^7Z&t}w}q>ffNBP@4T41wyZ&ZB*rH^%zE)ZaRP zvL&RNNolIBHS^FKN=oOGnVqLIVWMRqc@HSr5Qg?9#Mt|Pt6OqAKFi()+BYiH#UynR zNUqeP1VrZ>&rq?dtYngcCPG(`H~~Q_DL1z2+Lm3n)IH%_wC1^9B^K%mYnR>fQ~0oX zB7uA-0I!sIPlC97KOC}v>JQobb0w}jL?)wg)m!Lhdx)$o^>tzxLq$)@FlC>B2)q_$ z;@M?fj@ex-5=PxTzG1+}`C0@rZZZrX-(+gDWo*sM1Y4>tt3OfdY%JkkiW*9&XZv4cdfqbX{EYZ%$0X&>WaqD!7wh>9wIO?%JD`B zKv|i%l|P8q9U}WcT6W}gHZH7H?VY1*SYdRlrb>zG#!}@)Q zD4O`>X_1G`-45RtYaLHaYw4{UvYLw1a`2~9j zaqZg$&ed~*o}}7}CyMpbDoCC*F|tHeVezDmgmEbhS1X@1fp>XyD|uQimpcBObiU6) z65Bb;7^D-md+}c88HiydY}~o3Eb0#xEDo~Y+Y@;0slM{)_1*-v-Q=yhyssp()IlS} z>M)9m&lr@uVU#Ml!Oj6Y>H3qtBfHmFsAG#Xy90?sa84}s@0WdhFM@ri35aJRT5wjta32e)oD`) zQaVYqu5HszrFh(FaIdGNhD(S~3fl~63vpp0Jv@G>y!jV$$G9pqF}@k6z#>nX0Otil z9@d^V{nb=%y>7ABQ*2b)JBkZr6Uk3cc&%esa1J8^Nn?Hjobv|?RRpAe&kpBSPfs^a z#i-r_g3)uK-20X*Z1(G%6%Qnn&k96bg^Fa5$jY&W88XHnmUHEB+p_whLwBc;Zu^9^ zcM9rhYbvcU*3Qw&sLc~k6Uhuw!OnM1Jjwz?6y<;VPk%0iZVFw&dEAp)Zx*R-RCM)jUbZKW zN&F-#Ow*Zz%2fFBXW^a{0R9FbuAL6`-&=l;=xAx9xyc=D5>0Zx&Le`Rm4T5s86Fji zQlt{5P^hZBQG#Vq`ib_0wbCsZw^!Qt3^#hlmKi5AOGc9ToF#9HQ)Dr+gocp$wmNPN)-O9ht6O6HIQW4pno49*79^4eRRTu}szKnOo+NX|b+lf3aXke^ zeMQRGXqM)#Af>Gp5L2~su?9%f!HRB8!_PeGSqS2%%mB14)bF?+($uorZZvX58G@SL zuj8|am1GX!kvEZ_@R9y(vB$2HsMHX4Z6>`%BVZxBu9XQrEkqkS;p5cJ6)mcgE1{ma zf+ebP98$noV+MD#+MIcE77Lo1Im4#$NLY4;YpyCM_Ap0UTeE7$Li0H*JosY|D+ybkDbHZB-X&D^Q&s}rY`H(H7`lW*FprDRf%Pv&ZP3~qmjys?&G zKa^)A6WkN7J>OflirEyO+KDJW7E!_$XL#m~vQ(qOynA=W_myTJQj zWp!ej$$g`*TACVrjlcYsrWMHeb&zoZeApxc-Sdw6*8~Oa1n`1#8VG8?ZjjlU;YnK4 z)Y82XNz9Z}n3zfrc-caN514x#`VpZs-D_^QkA<*Y#HwK~(W>~2!17dcD?SutduKd- zyK33^Dy_*R*4^1+OJ!>-ELBuP@lrl)uH+gUm2FtgvA(8=5KnvU5v>LxyBT0Nt^i`wZzC z!S;o^^&Utmw&ve>trF3RWv!VVS~kOT0C!W6uf&Eu{Xih(Hqo|it+i=eZ4TtU-6?|b zYHI0K;)wT;hyhmwC#C@&`f|2hcHH%nB0{NF(1?VkF!=AqL2RBYmcaZYCje=$)Vaoi zOKz4nf_B<5wkdCmMNLf=Z6$p~LCKb?9}K8xC<K_wV?#`egQ-Hp{Wx>ubdHpw`xv zf@%weLl`PJs6H$S%ZfMg3X{Y(Ng2Qz)lE%RQ#g*M=+PAOMk!Gg;Ck{UPC@eeV>voy zrtp%SQm=|(F@FpegpX|5EoI#gUe^k0T0e*;3U#0@ zC*ca<%5X+mRGwl?;GcZx_Tn4$t!(rH+b1Uv9P(2cN@Z|H3bs9ta64zyJ+RuA?ZH*l z*zOYDs^hlW=%y0Uf}$6aP69Xd!YU9^;lhWvTAi5H-JDZ zj=HI_>bI~#ltm6O@s#{QIWb~L@7#=!u-xuF5Z~2%*KfyBSz@`oG~0&I@(E;uB*+zt-~q{0 zWQOj*91=*+MepsoOS<;WTvqFaH7u3T__Wnxk~yPhDhihpWnB+!gN%as8#X zeJ#$O+jX&DcSN(x&LocABqE=Tf5VMYlZ1%J3NeBJBzM3&>n_*bjlJ#TeQ%N^X;;LO zYh_AN2+A1c0(6nYXAFk~-~tXlZ8cjvc3tYL?-uGgE^)j>toAu%c1Ft)$~OWw8Bj=d zIXLbB;=FqXsxnYS`rYg$YOt7lJBIj3PrGESiKB+T5la+G z@Nn`=5=opY9z+l^>KKeGhIMNMp!RZd0w?zcmv%`1RtfC9iSO-)SbcUMbB)6!o)%%A^inS7${k!NI^8>~b^T zRwq#QuJyI;nw{Nl+Yj({G{S1BC#$&!r>K5*saqO~ z3y$c9d)+N6B#6_xkBWZ`Jn_1-G8R5w@%C(~$iX=E5JW~BpHLGc+%vm`i%+;{_XX}- zeS*+yU1_;XELDHxva^uGD&9g_3n(}ol=lZZ19+j{R8^IATQ1>8QEO`GtFG%yT~9#t z(ZunD2BJE3W`Twj#vMpJOA+4;)-SQGV&C2?=IXUl-AoVSQrF!~)6~ElE6q$}@PKf> z*vSL7ue*;%I)h@i#RkY0oy9{_M-oYIS>>jUoGDdcIT%@cpXMVO3O$YZd`y7v0H2u3 zT*q^0l}|~z_nZ{8bh2D7uTLv0Me&i(9VJW*6f{6$ZX^zTTbcoeI3)I|H!PIm^>ejK zJ{o@+1=!2a1tG#;;Qp!ywChZRA}aTTgxfVQLw()Be$+QWF1VdrMy%-BqvfErG+kSz zjgsxN_eBL1Xv;YG3H)EeKn3Jh3xWf31Ms)6Z9}4voy~0_4-^4g<=Or-M|-Wc)wGEU zOB4`PBO@@$1gR{2eBPjT$8+CVQq|n(DQBmP;)6o4tC{LTu?oP1Dyxy(xdpu!*S3S$ ztKN#KDHg73c;P&LCZxQqjyRE(QI5p7qL2oDSJ>#2KBa&AgHt+pFIk>a3<%5!-UlDDw# z@pe43hAof@$6?=4_k~8{-gm6k$qZ2ylBJCdcx5D<=a($58`y#FG22}>YDY*%v|q>3 zQ7#?rXLYyFdbU&2?pmvqH9$i+@oGd-oG9|Y6Xpd-Jd}PR-y;Qawpp%LiP8#7>|b|C zIf{|qUlB%d2<+YRdtl*yr05NN*Lf}wLE_R!RRu%K7d0&#FD2qga&j=t2bknw4qd=+?u0T9PAoE(qhD9ap>6_3cO+HaB4(o);0>K;iMR_g1N z^>-))RTPAy&a*iRyg|s~0c@yV=k`9DY}&h@VclV`tKU|4mW`v$4AjI%;ej9rBy%MD zaXyUQ$04QZ_WUmy_?9R40h1OOL4j1SOf5oe^Tw^RHy-Ze@@B}t}W zh2>5~h*bwY&JS=fgVd6Ba7paaHSKms7m@T-{{S`>;jnC5BA%H|w!>qNd1Lrxmful7 zoD!;C(r4n>R?9AMpr2AT7k1dFBC%VV-LlWTTM+<&M`QKR#c5a z&Q3gmjxaNv_a6DzdEdl#&YPnjl2C=auFAAFF8RCKH(i%u?3y}9j^RldtBN!;Ei61) zq>!sIU^oma#5?7EhOe5fr?*~;b~}28lIKmui_k1|(K8h6d`T1mj>oYW#t*5_DQ%mE z?%Nj$cMYbl3BZKYJzBt#w0wXnj6)XV?r?Ai5rA~XbLt-I-B)^OYcCV5u@T_Pc^DA{ zWjsKIlf--$BbS)+Bq{YBe-H7vLn+MM?t4;Px>v~T8VLK_@0WVksi-#FdL+(R(@tvX zg-l;}1Z9SqYiFXxMeN^zqeg}h>jmI1_c}N6+7;-8-JzI}!BK6Tp zt7>Dp?a8TVr-{5pqo|CnIc)y`bqABn=x}?S<4X5lmTpTNGOab5YDFW6siOjD*U*4? z0U=O*n1P35kb7w5)A*K>LnDsr@5oWI!7Fy~rP{AjZz?I}v54(c#K}noXN;z9PNA8Q zFbUWKJLK{wu=N0XowjzC(bOItM`$pwx zuc!}mt*XEt9VHDXjKNPV1N=hyCnU2Fr?4D*XDZr?<%ht$R6}!=L>?-6lfzyJe9rN{ zLMo`w;=|w$!@iXN02Y==jC03s_2=x2X__5vI6$-_y79_j%E z9az%c_RS%V_0#^7?K+=@g`%PHDdUQwJYWQga-$23kQ@vg{K0|LN&17is%WX|jKTsfuj64I9w3U4;-B11(NuFh3(xOn67K@V!uUknL)_=s_a^KRmtO_r>m@a zsP}EL!dg4cTR}W=B(Susr2_X<7(Ttdy^cLKVbw!nproa? zL$`$m#oR+(aE=cG1(n;(APp-A3CN%%08f~9843{W-O%(ud_lJ@x2jc8@`kF1;)@g6 z7)K;)8-d&KkVwhTVpArATcvOsd2he|s0$t~|uHPNjU$my zRZ9$%g@S?+P@FJ6q@MY~KbJx;7T5TDD_G6n5O4HI={3fgh17c+tv7g~q_oj)*{LId zxvP5Cj-q#G1eS1P1&W;aUr@fM-OiKk30<@)WVY4Q+U}J!=fe>~(UXTS&|4<{uULe#t2}B#k<{^F5}^!vBaZx+vFxOIf%Z7$t-G?X z+p@abv#>Ht(FRUnFj+R=1Ek^$#{{=KQhNSI_QdMUg0Ep~vZ6Me0x?6=s>f3C%)ymPputhvH zZB%3N0A^;&^6a_(A@b#X-osU#&~NMgB&JKvXri^DXsKsINc9p-ixi~tRGcHHonwfS z6kq|LFHl%F7fY&klv{escc!SI_*ABy;iy=podWmq7-77_B=__zG_`rRTA;70wC&j_ zXsJarEj!dX{440hrZ_0%+({rW&}Tats)|gt!9c>?Ql&OeKf>HfY+lrY#vmEJdI0F91tN$WG^g}0^EurkwX;3az~y`h}5d{E#fKij0~I{5v=a1nq1fA8<0*9J_Wa5?pKM+!NAmy{}tYbMdCA@dEhK$s4aXkd@DyiQ-3Z#z+_%=1Jr5 z7Z$Ol-zB0wE0_for@OjCV)&X(yqo^X9YtI%F=A?ojb}VpJfc--#vBe!%gc~*IRWwg zm}(-~M|EEJe$xAznP-(MC#5ERMx!ZQWzIvfFp&!J%7Ka!9ogSu*%_3&0Q&d2(D9Kt~b) zB!TDx8{$S@Vk7fScALKMvZHo}&7!$n15vDi|6v1$!K&z1XjH_UR0W5Mb zGtgZQ=;+=%+NXcsD4?hNnHrkbr;|xfavkEU;@*))z5B5qCOt9QDe0F0dO(H0P;J$e z)%HE3WVeAFKMz-LsqP?R0)v+b!ytp@&zIL7v=@4HLb|Vd&(poBWuBFwDMv#|H3X5= z848AGc?4`3m18m%H5_s!Y!&(aH2(1-tqwySFtdUF~L@a#2N8zYkAr zxk5RTSH^iFnGkYpwh}Xd0M1Wxjd{LJv?(roTIaLw@z^cZkKv_4!A?oagjisV0^kA{c-)?h~ccubVD<$*eKn zuC(;UA*8CNwMS1+7;pkKlQAd6Otu?<&k=+$M^2&9TSYG|ruaIAQSGkIUnhU60jE<Z7bEa*s$WH~u#yRz~aI9}xGP)ny|eMXPWgic{D zv&W*fck9i&w#Am)y}F|&)3{vBMjKs<(F}7=X}^mdM2#znVP7|5NLC&2NFWy6KWa{^ zHL6ek)~c#4^vgq1-wPR~3Ic(aX*s!bjEIghbCG~Fj5eOupMF!-!6Xw}mAo5;T1pVf zFNcK(xl}>TfhxTG`Q@qGqSa@sdfR1_ZB-gdpDi2wGCRtuLoo4VDW$}drvCgx< z#~K{a%lg;V34w=^l$Bq*Ze3yCX}E5+G!P{Okw+CQRn19D1R+nBIQjUcncZESGdnQ@ z7{Jlmdm`-Wn!Aebsc0nx3Y(-9j?*;LN>yXQVxfsrOS>jApm~pZwtk-N+a2~>)hv+D zRUBzBo>*R1h{(o7M)Gpb2dg`J1B2T}ZdDXET2p?n=PhkaYw=UO4BiVD9r4GK!_9ed zP#ZYO^&xtn5pZytF?aVV!KY@xaFlM98$$DGwM)0QHuu~yN`5BpZZ(Zc^UPI(h?~Z2 zF+L&383;g57u4mnt$*@!W|Hf(>~^NVTw~)bHOlhMLBOlX(8yRSNKvv|gW#1N#&p9~ zd#Xdjh7q1> zoWc%L5MuyvY;t0Aj{EC(tU>D@;~-S8kie2$DVnKil}-&xn4%sNF?lk>1bAZu)E_RE z*eNX)^;1?`A&pgGlAg1~k|6k3W>$=;aQsu3U_6WE0F$q*71v2?TJ3SQT2g|lAyH2p za7bsQr&#bLh)5U#E6CUdv&)eR0R(QFS08YsZ zj+zBZsUz^0)#u>sSF+@)f2O(g!H2T;JtfBRYmI8qnd4=8^Y^R)DL0sa-8)jrRO_TIgI2a;R&+yM6n-!|D0IbTZAwpd6M_xf&9f9=6 zW@_t{)|!fyw$D{XMJ*JR&M2ROkvNz0$-oXRA!5J~0m^`x$xht2D|LMxy5cu&#VQ)) zu}3TwA}VO6JAbF~3 z5h>~32JTiSOE>1O-)~?x241aT7?3VbcW`?Z=J-m@5sH~!5q^gpN2wn@5 zj{UMUG6?Mx+mb28OD#n4)+~YkDR{DsCoBMRr_lPG{PK6+mvqEHs9>#oMoiRPN|4;7@a@TDpsMJHcAbG-}|liI-6MJ-kQq zpD%tvnUlBVkUtd1GD?`g!aY?)u~L^;RCD5ki4Lp+%g79^t%YNB4wz5YYzft(f{%WJk&Ty3an30J5Mz|9eo zal?)|Dv%U+7*I$!%A9I#1=i;&w+VJzZN|Rdl{7Z*5;m%mA|lK{5ruFGbBvht$va~n zdX)Z?g?H?-SaWZ;~E+q%TtM)z;0xml;4wyv&aH4QM92LW3o%DGZ}$1Ccjf_=2hX6gOf z^5*kC;;}1nJ|tAo&r>Wa1|OM?3`v}*1QK~W4L8}RZ}j%%QFA@(OWT)licQ05ih@aE zqN<_sC#QC1Xk`o>0Epa}j4_6&U(-@sZE`Lf>cUtP}g!3fM zR#z!i+Lhv82q-E^0D_KCd2)TbV+iXbxmMCq&{IUQQ>1JrFc}&{#1hPkzGf`MXCA;G zt5bCgXKj_Gf;cTvR9f7Fa-a)S6=W|fuZJ{TT?~q;80NSkLh>E(8LPMbl53>cs1i=AhK-yd z@SFH#w=Xvll_7}IdUcBw*zZ@ms~N z?Sx+GF4raLg}3B*vhG@5ueS zHHJE?B`ozd6;n=Mknqwai<5B26R=^){+1g?Qy;jL6Uk zB3xu~^9I0E zf{VG*vC@u)&G1NStTJ8es%DwsQ4&a00Ok+V>pTASzzVH@EZ}QSq7LuhS3h=>HiNS;LKw43P#Z`&ySCPmd-d#U68mIyr8+xRq@N%V2xEfV#P^OUmpIr-f1t35+MT*58uAU;T5?~p5 z$o~MtQnC^hKXH(8)SV#PwA(&dx8CurhNkmX1W`_Zh?1--;z1KEnH=-L5ICq2k0@?L z+%a|BBX0wr^r`OXFq6sQGwt4&Za8g7`+}}oDrl#IvNfWs6ICc|6A>)Eqb>u9#QQZtIH0E$QTX8-+Lu@%RnRq6y8M9wRO}d4Rwky1jQS`+I)dC=!cm z)=^eg)IBWK?0ANxkHkEe1efGlfCOX{k)9(+okQ7mJF<1Gx@>ucC7w=T3FAI0ymLf> z5!ICkB97&_;2+CgfuXDb4i_MjO_jy{IolBKi)VqoW@>5aWqIi?4&{7E*!glsGF!Rx zMy&$q6w4w>wW*4V7LY%R+Oj;7YLQc&D{ zFy@*?B3NmqLU~|`a;!Zv;}{*Q?ZHDX+`lb8;GlA->nyY|zXxZS^6-uA05DMoR*@vtl8_X+F^pv61F=1aueUjx zQs);u;HLEp50tJZJwoap!L5QRw(G&;)_>z#`KNlRqYOgI?}(i6BuT`O!vh2n>vBbN zYo5^YsqYn$RNd;JC5<$6{xoJlSU570WHG9Md@@dZ0HokgTzBpFdHtq#ui4k9_Zha$ zRb&RMcGuHQ9HONRODKpd4m_idBi(@W$aDB}qrEKXHo@tg=KQa@t~VvS$59l|T^d{A zrQ?J$2-vP>!#*SjAZG&^$?9|wIiPn>k67Y-=+@fk{qBaoI?3y41;Jt-AZgLwC6W9@ zrXcx`c0vdMjw^%hp&Nq3U3tDy?fZrLrL3{k%ki`|5qP1|a^^--Qn~7N>W{IW%ynq&5w7~La?h$YS zn|*_R?d^c}3VW?7mfYa(M__#>;Guo}S^hRIXjF*!c7KN#A)phlB)RflS&e=-IP1f&Or9$EQn*xTOB86ixW^t?B#=~Xo9A=iwl$`! zVr=^*uAYKw$~Rwxx<%nm>={H4NQOt`r<+J(bz_B4!#F6qQ%D~8yYs+8OWHQI%BkAb zd&AUde2zhAPR?#F9u+JUQtVWGbPGh?5-rjm`OEAlv%~bVYF5aPCVrJk`-8 zm37MSNfl|R26bs6kzr?O+lsb$@=@Y)1d*j?>Q>p4c~x2LlH1ni*D7jDr4_=yrXdo* zz{zloxgSRYgq)(+V<_^KM&t^Bi;oAX~I3*ur73!#=0n|Z`IVRajdG631+RNSris6 zBPfi>*by!x&zLW^G#cAz>33GPT^&ubhLVwMgHEzbDT~G_kkLumJy|=SGRPUS7_r4S zezM>C7?4@5d*+*QRNQWGR7n|c0(*kMxk#eo;S?zNmJt#hx}Xfi1sQGnuCZ?Y!A-k9 z^R2Gfw@Jg*Lp7=VS{e@&hK48<7Z~Dr_)Kzml6f45dmAHW=w!zrpV0t&h8*1dJ1451 zlwJ<&OQi+g=$7GctCqS2439f97yuGN8JX3Ba3xiFAU;qC(w|Nrc2I6hZrG>ZGtl3t zX(e=)stP%(fN5Kdg_+qyNHUWl(r;< z%L*t^V1 zMaVCAZLKA0UttvUH>}J)oN@ zzTMSL)4buPj+tPn+w)%*($?{Bfsq_Cw9!30k$<07 zS>(S}RY43Cmo=yHA%v>@OPSJUJ|nxt8z{a;0|!midp~{A)5UPR?mee-yjD@kTqcIX zwDSsxRlFsoRdXkdNCkj7JV`2#kn6{*S1jh0iO$75o6!w%i#0c7MAH@FvHWarY zi6JF%fY-9(+!gy?$70;uR*cu!>l&KvQ6P=dWM<_&%83dnT&M&qCmhG05HZl*#Z>Xx zsOF~W<%HAPKZ#LbtpbXYGc0`9pM~RxDysf$6Xy+(GpzGT8Jo=*zu(0%tRcQqP%A#- zD{Z(v$Ei;Z+V4e4aBqvISgPo-hBt7K)HjCg(d6I;c0xgKO>+-ZH+^p6+!ePcs;H{C zZW^jFeX#`$ucjP)w9E8(k=?coH{! z0R8}F!m^%TKr(U&@1XmtzNTWeHNk12GNcIwzBUt8$jTW!(sxH7sb=<4P6_R&J|fA3 zfakKSFJanvRi$p@n#*vlqmnv{Z5+2;)mKjPRC6I%aaWZ~NUBvs06gDZjQzN`#^u}4 z_;rveimQaQQ^Lsc)5@#TVy@^YZ$=OpLcX|rqY-N_x|!%4WQ zBDq+rCW4Z?#(q-L23Cv(Vo!zvKB?L8%E!4HVB6hAq24z`uL``W9y~S*+uytOoylLRL+#`U^OI1N>rYw>vb}_SprFfJhC6vFFdwGKe+aAQ+ zHyY}zR9n4lb=2iisC*P=<&1D18jP~|WqnEVu1F_V)n#@1zSn7_vD>QZCQ5??M-nuV zkm|f#swoPmi5QX42|*}7uB&1R@-8mmpljLUAk(#Img z)a8I^G04XhoI$`bt)|hYm#v6?W+}(Bd=pymyt^NdXqsGEV?^4po!Mv*FKnx3F zGI9$YEzrp$sqY^z_?XABxr{EhuvJ5M+sL#&CCxdk6%$QW5JLPh;W-rGl>jINd5CO& z5LA@hRkmBqmfOW8zJX-E~QcJ^t0XN#%Tmy$H@w@Gch-#wTmG^kOSW+s1H1^tQVp=(T zH!;m3_zBCHU^wv|iQ>*zQ>*JXRsPWg`!Q{_vQedc6m&O9I0)(_T)c;xxXVTuVWVtk zmvW#8JByr~TG?RR)zx%YEx$8URaKfe8Qvcb2|~vlti#3y5CN)0 zdQHbAUDa-%6lQ`rp%lg*L`3kR{w_cSGm#j;a;gA1&d0W9ZE?swy%R{XXkjpo^G`KJ z;yP5SyIdB~sY^XH<*7wX6zW2_IF;Bm*(9@a&mt6Ib)L`a&qj{z=$oyQfQpz~;!2=wi(oowr^%mg2TlV#BCAwH*f|V=jU|V#oTzGOu zaEhdW6@r%L8#wZlrY+44bk?{nwDzbdYVWo5b5vbkDE{uNj$q2tqX%LNsz~8jcNi+! zUep}~V71LB;#Gj~Ii)6Q+qTuNrK7P~X=k3ICUu&gmRea_SmB4lS>wlM@StMKt>2jh zocH#E(MP!`ZPz=^`n&Ec6Rmny)K*4ixXVp1HECI+=E0;@c@%I|5vW!?o08qG_q?|Z zG3_m_YTK22ZR#bUO2(m?xYH+zACFKlit6jEEn~IvP#dWw}D=R7`dFkzRvHTqwQd&fX%ksp0xR9(nCj}=1 z0&Sg2+1Ds-bXWPQEngMk&1|d_s~;7k!>$J+vNJ^4^il(3Cy^?1cDmb?!0Q&?>unX! zXjfeB6`NWiZ>ltTdRXWxA&>-+ylN$lnF?n-itqu7`MVu`6>M+RFTQAL1IZ(NJOVV3MPpm1ieB zlz$DK51e@iX3-i=-+!9dLucH(g12i+byn~Noe^s5`L-geEgHO$^Zqjh^C(fs$UPX& zncR$6R9pz<5~J!he($ZeS#I@}bypfXX~o8v+?&IOWdURHQY0N0GhVdli z%fcAWK~C)Qu#E}e`jW!X?=DJ>lFrZ&3rg;uo2B<>?;YKGqo%mWB2w4N{OOSl(KRg8 zvPfMYk2en)On703ZavAq%ew8WJa-$_=9aSiQ7{#<<;RN$oCsxfQ53Fw4;p6Xc!TJr zOsmf0x7FFMTaTyxl_uG^sbGTXO$7Bc^1#VkK@C)}w28;UkCH3MpoHQSlIIPOO58T^ZBtt2 z;Bb!Kwo2XX)z%qI6v+&H;)Z_~N+A$#N5mZ7NhA&YtOBz2nSbDOLQZ-rB?!DJpvhJ5XnKTzm!K9$9@hc>1D7*@a z#o;8f#~@L_tcd)blmMiV3B{3VtGQk_{q~CGB=&oj1rkzQW+I@|!tAD_k{(%OfY^2* z;Ckmq02KcKkLH;24hd1grMp!{-kPqSiYv|i zWrC(C{vt?afuN@@<;eJqy0Hr(48XAp2iICAAMUQo1j@*KUIqU@3vWshp^57y@2f1BoXSdVYZS>T!RJ_$P-0H}G2$EDq8t~%9 zha)5L;tmfk>_gqA=LA-U_y}li@g%a-RnF7HGzH0AG?KOip;x;^=+uJC2WmFMGisrzVW?p@@=Ymx|nA$nz?8~ z^Js}=i6di=8F-VD2O^;0t|f~K?MvM&%e?E2%7%@us$i>@hC;Fk`G?~XJ|C7e2O){Z z0X&F+8pqUIg}U)UxGSzUS_uq-uBPHCsZB#<8iGnEj>x1sD}odt%Ag|}T1xAU=G$3K zEEg(kiLH`pD=D4|r;bPXkB3I&7@j;7lA&^_OL~n{*ct#~H|neh1CwLXH`;gB;)CX}5XW`h8){_X;Y)6j>L{Wi zh%1;xa_1;AWDS9W2+Qh^+}Epa(z;2u_d$@>-L30g2an0El|C7jWl7`=&XN$UtbD~B zj_MZyvt>V_x zGGG<$oMXSjTUCrF5xYPyh#79vf5i=;m7F@cFmLtkUI!>&?yp3fK zP&zqBSxpTHs(OoWDjJjzi5@m&JQ# z49y@>#U2JcKmdS3gO2`~$qh9SBY67P>yNq;NH*X{-}m%N)x8tg_c{uz+i%<4bo8_@ zMNLd6ilGHO)3nO6OOb@+305u31h>fRUd6ZVdxTV1iWzEZw+&r9)YOvA8wHM49G&B* zmPUzub8IQ98+t3oAwhpvDIT}T`^Q?VSnIjH2 zBq`SEL%VJkR->bmu+r1qDC243Y2uVAifEEKc_dB5cJi{5lgqxIHsyBNyVF#KztqQ3 zQ%;iHX)9^t$`{?2Z0061*= z0b_X_r)~~8DT3QewHIu~l=O;ZUJTDPKu0MGL;2%n%AY`T1Dho} z@Z2|wYp&w2%&%;qyDQHWaXOR+3Qq;9yf$F28^2{O0T&|C8RX( zR2iBev79hIY@8k_+S3?ofw98RCgAK9CgXbF_WLB)C~Ve?Ugft{(#DTXPU}rptdjWd z&l-kiZxpc(LF1mmuym2I6L(kB?=9leLZZ3_qoSy*oqj5!Smhj$va*IwD5zWxet*I+ za@S_ECC_S44IS<}R%?%pw3P8mhBESq`3CXTSppYcYE*!@$F3)CTaM3@ZChHw!$W-JB_ax##Ce3@whJ}aM?)(uQ@OXeNa6#0!Dv{USQ>u2^d+YLP> z3{o?ywZzo3yR3w)Q4o2!XCaRzQRqoHBa;AQTeO(Oz1zqB6`<0VoN=B0MuQ6(1$;a@skx zEqjt0I4_q4tv7q(Q|9k9rOLphHz*@qOTpMF9(!BF=m%%zU4 z?pNFGOEz(40?kY$S;k=q40IMY+t)TiH7*7|y{y6TNMuBd>dYR~*ZGDh*g5(t5O z&*C={Fu2HHvcA!)+|_jk*HqT=Cx%hhI$DZqh9I=aazI{0D)T5xtCq?6;;w+)WXk2)MzkGw=&}t6!xooYhCH~HC3$sS>RY@O!s?#%0e~8S6IT4)s zg78o{frUM_U0EruwVPt?xGc1_V(C3QsH3{l1cI-RnVhVN%Kab5)v}d!&utHAtgJ97?m8gS+GdfZRu*Im+ilHqP$dwzR6U zQPj@eqWd%SGi_aCtGji&<6Uo(VJM_(O1JSML55CC zfJr2Iv61XOPKZmge$N#5iknO~%bV8IP2tXvzT$YF=L4Lyjb!=Yw*8tm#0a*{#lEJBnbaCV zB^@MHXOVs&NZ2JAyYa&g{{URi-M1c`?&}-U+P3BI$E}X8nt)s{B1NRAG5HUKiU7%A z!?`&J1J_w%(sU&fZWZ%RFSZr{SHEX1?^l1Nrn6mZDe54mi7nKNFbZIaV`3NR1d4Ee zP3x;ucI}%M=a$(_*V?K%D67(bbS$mN30>gw1-nJ;J`hQzb3ZmamC4@+=G#<)K#u^DGGBLZck^I1hU2^pkIUr&XG^+f_?- zt7=MGm@CpE>G6=l$-$j6(IrAS5@e1l*#SbaWLi5G`@Fs4s^4X{wMU6n5`;3BR)2-5 zY&4z~D-28gLas?ts!1nE)WTmQqz&YhP`hhd+f?;!`YUwwlshgibk?A0?PQ#5km zuQf6r@?rA0ZfvQ^NyeGSS9dPQO1L+!=%Sj-fIa$6og^PYr>`VL*M_)AsV1jArkt8N)OEjTn8Sa3wg-;*Aj7bMeyF;nFlXLFt zEfvb|v}*RW^~TR^s;#SvDC-tFp9Pi}#|M?lAdy>(DDgZtBZ}#fLR|(U<2gT~xg_(` zoS^mIqjt+BT)RTYe1^oj z-Bq^%N(#!@(W9Pgj3r2i!H!l|WmS#5%B&9)l_Om-g|N=e?oTy|1&nsk&_2Yp7Klj>~nYlBUsZ+!o)7 z6UWD!FCIc7tr&a&vE+<#86#SBOmvW#jCDye${It9xm_`F-&Hrgty8pYSNk*W3Fnfe zO0cC>4>_V{DZvAfdV}G# zk;zQaelitHaV$b`UO)!fxKnOBm2F2z?KBnf)YG%vY!vjfP`Ic7$rRAiMwpIOEL~Yc zpeO+VctJ{vBt8LU+H|FKq)wY_b-fJz>ZdFt(s^NSYin9j)K6JG;7@{j9g%si3pl?o_q3Zxy!XM-HVR}NFHJ1EEkNHu9#y@pnT5CVRaZ%R(M8kk z+x?-BYThHB`3&9^S0gP&LQdggtw%1(LnP5FabU%j@-f_M+TB;1-Op^vaJaX`ZOU4@ zdxSR#sNhzlc>e&4B`mQ#XnjZcIQ z(#Jo8Pg_nfNuD((DRJ1w$XJ#cH>4d^*n2`q_BQ;xUZsMPnkcDn7h0HVV5zBeaM3() zl_jt<{6t1vhU9^;UE+~RzpJM_a;r?{mH_^L!UxgcwN+mD-1nO-n||B2>;5Q;7-(k6 zrslFgiy|@wa>Nf4!sHoGbU5X${{U#di_~v>LSOC@UoGaRfVln3A3JqJmOLk@K_a{> zfbp}Ce5G*21pr<1p?hZI70!aoZ?{q38U(p*>%FkYEDXpw#m*iBxA7l{VlcoA;AnLv zi*whj*{mOEiru++vLF0q1+Y_FUImF1$kF(7C~AC!1Ddm|6BzQh5~$>6q1*J*Z6lFH z_D1NO-XKsy{)xu$>K#Ro+&seC0~kQkRxKu zNgBWJ(%ZN76+And)nuo)&l~(Le4Ao74(kkTRyT~iToF}!xEL`g^J7&`{_F2a_Z(ltflt9~cJw^he9aLXi6Q!j||yo`>o;x~q@aHNH0=N`9iPOo(KlGA#! zQqN6p+z2XQyh2u@3W>Q${%I$TrE|tkY9x@5tOh$BZPV!_k{b#>WUAFWRywPq0mf=q7S!ZZwjoC0v zymAnh>f7$wwQRbGlEJtuDV{}Y+IZxnmLjViIB1gs2bD)M$C}_rkO9t$ z9X!q<@U%4WRmm)Id0&v7dP~*5qwGnWYjqQ7UhkEAwz?>(?^dbgxw=Ucre~cK08RSl# zT{nMHcJ;TXy+qqEP+sWkp|7*l(_4fT)iJ4Mk~vnCDlCL?0N|(ypoAordg-l)dGyxZ zL1>?LU#&No4QQ#f*&>Op##z)XYVeQ7$Ut{#QeM~~f)r~msgVf|;ZhHw^eE#5<(}!v zJ#+gj$FiZXzS{S_JQ2>V@S@;;HnL{Q^A7`Xfj^a0u#x>g4*Q!zfkgOtvhW1Tx`qde_Q~#{>h-$nEVn6k*HgN!Sk-H9VOKr1gd(0e z>ExPuixp`6F@#hk7UrrvxbD9xwB9azdi_yuth4SLolPpGJ%5Ee)WGqgc$37VfpVE- zW=!LQ5*HkoG}@Om2}szEIO8rg%2wZr(i=QCd#xnxw`r;cI!RY?NgW{1D3Xn<&e zR%DBtuZZ1=EOHV+l9wxZa=>7^$}KDt=78hvwRIps)?hE#4Kf%#oo&$JrgyxIHeRZkctQq zr-s;Gop zC}f_+JQlW|8RuCHK$Y<1g}EFfMxYjys{*8V^;)Ril{Y>9Zj?~cTkMfWXyL4uv1=+X z1p(tS`2&}AK;)1dHUT*u$=j;;9Yyf{(Yf!^+Ah}lt<@Da_}7&)`Q{8vq$^J$UL`{k zs=dw*vuZILKdCn^o0;_sY}N*e)$YEmwp0 zom9;oR3F1<_>$~Z6%`|3;D%wGF!OeeaM`x)-A{6*+4Xf23YkoiBsCGGFld;v%PeUS zjz2SibM4>c+7=Qr5io(up}NPgqTV}RX?E>&Gl~kx%+XZyNhw^1P>CiPWDI?Q0|S?# z1oM3r9qQA5iksoG%Gp&%62mV8mMZ8^vG;m9eEE;J4RatY3FA+Ok)LE zzdruH-r58GjfJA9xYklM4@$%`R7xDVQ-xp<6(ELe9E^6z2Reh(U$mD;I+;UDCf?pu zFxJT${{WND!ZFJqgAK>i>8l3sEQ?9c;G?Oi@|RfDvakm}qqzELT?B5(2?AMTG*u~m zrE66G01@|XRlFF_jtDA!LG|2l*#wrQC_de;nE26)-TZp-Qzf!nui zdJj@Hdsr*>rT%uHc~T1XQz)lmM4UnHS0lbNgU7he53aP-^vc1sbX{AJ(Qg}QQd9) zq@;PCIM@dBwgD$Ra9H-nG%B;DF+)8yZCyMP$4!?-iFp-aoDvUqI48faeO8yt)w+WH zBrsP=1zaGrB~mgBNPzKdjEoNaR~^01bOq0Zd4(eli&AZcbS0|&ZlGb)&ZAAfEtFMizZn2o%$yj>n481zCK!2CsL3GwkI0=+n`?H`tf^52F{qjt z-C7t`zljb{FjR&iah4eausGD+v(_%3*?;kEvVp0}W^ad*nVMe{2QAMS3_!^zx%Kan ztt{~;;kQ(?$>EgZK(%z-t`?oa63slc_0S186hf?kj@cRPPjl#V-{qw{-rlfGC#a#h zJq(gD6LM5+^1waF@?aM3q!zajdk=+2o<3I2^lFlT_%8=>HIKticWv+su>$lDY?T@9V5up&_)$wP|7nNJCdw9jCN7UPCU9)uc?XU zT1e{c;;hrGf@tmz7EVZ{bHfi+AmazH9-i81ZyR>mO0Zo-^#(OrBzPrxmJawvR$fO0 z5Hp+~koKs~-WG>5cukwu-DKXB7UY(C+DoF88-<+ENRv{`O+o1UH+8j9I*R8u=n zLdM}y*|_A7U{7pzIn_h3cNXlg-qwrF`@y^VfWs%gSRa|yN!1%h>)Jc^ zkEu4;Xf8WxX`Y(lNi?ZW*7su>X}n)YRuLh?1BXt;a_x34P>Fm={76fJP`jgHN4Fw- z`e)x%@7gbLZhf(`MONMWs6%3tr&z$}hGFZH0m#YI<)*Nc*<;gN zqzxU{yOuj9_@j2KyVFx$Y?Uh|4Sf|^g`YWPjpS2+uAGA-oMF9z$;WB#`fa^mZL;ob zno|`LrM>HABA_s0dl;=RjvTL(Z!6x9zqnOmnBdHYT zM9v6wOff|chsso(1Dt0dI#jy{VsE6})z`WkWy186$8mE;#}Z^L+hf+fwyu zplZsLp1KIp%yJl{X`%0xJ{ce|C2{DjfIF}{(H8MjLj>R1s;cPf14hjhl+O}lkZu6V z4}4>Y{D;1^S@->>%?%x=b?wXDx_NnucADPvMnd=UykbNQK3$FhIKVp809^BABlNZN zQQs+Os;w(kB&tGG#Su)NKCZ5C!_D2$laO+_8PqEKUD7z?HI?K#KNXPE1oJTjGB9QG zfOz)=;CktIeD!;5Y{+JkzP1%~QuNdlNT_6tDPq{hd_TkH>;V2?2D$HdeY^J5d#B;y z>FBPZSv(bv3j3XMRZh*Wwxuo3=}wep;Z5=M(u7BjSi1x%gMtYdN@FXJ>dGLj$wWF&#`6vzsIc?E2qK4--|ExMUE#6wBv3!w>c0>%;!$mwqMuS0y2 znrm&EI$0`ft~J6#PZ|@)lDexihR!mp+qooQom%!Dn{7(?Xl^$R?L}JkpX8B4PfDK= zDZt`|8N`FWG06zS4?sqjZGA!NO7?h2@DVTs(yaK~^AOjy;d2f0sSZtB2d3JOYY|;vG1q4 zE{0gTdA2Av&6YW-+T|jjyzVi)h+mNfnqsk)05b&xkZ$A*<2dzx7B-U}52B_%%@tNs z8=cJfRWq`9h^-HR!C94^a#)-k6<=I?kUg|3aBRwYh$c!|g&iZ!%_f!d)eIDQmyqN= zKt5c0=jm}(bW?NO@8a7-cBQALtZdWV>LVg{JdZV4l$Im{Fb*^8+g3fl?4`9TV-(dL zLBG_={3Up4spEx_f4aQMAUA&F=bdvQ@NIOC{+ny!Yy6Z?mL~GKW<8y7vqw5L(~O|U z#<<7ft8i}RPh!|oKBous)F-smQpCne$|Y52jiiB>H8j~rBqIO|WECI|;E$d)-Bi5; z=%uj|rs1+GYFd&-i=9nWlM?y)EP+&D`#O@%|vA74ADb z5%24d@EYqy{57nvGuwZk`bs*+4jNbI)6IMMY8u*FXwf2fSdnK|e>MWCah1RUfXDZ{ z@yXQ4t81$-Rf|b(aYGUa7sPUMRFcR>1~AwGeSZ--0Bf^4?bE9U;o9|yW7%6$npCC| zQe0`PO3u@q5gWp)z94mCps^$|2akM?JGt0z^({qL9m<>ID=J5VwI~c}AbjP4UgR-u zN)KXBiAQgM}(n@p@$Xche5v-#l58sPYXzj^1n!5QYle zTgnbIk3v0jgRCjG?QIlhdbrl5Y1E}S;Emy;_Tc6FmQ3}6B74LCM3dS;Uv{{U2H!nwU#SJS~sD!feR;iZaS5=?d& zWo6DmABc8l`RZj2_U}V>YlKlG)pTAf!wgES)Ujk?lqPcH3xrU|u&xm!we(G`$W7|0g*VneRy(L^w$#0JKD`c0$I0?{!Xr9a0oXsmKSElCqK%U>?Q2Sa$gm{{Y{KyIv@&7M{%X za7jp#AZilPFCbKMQ0pNFz6X~fP7V&KN^YE2)lW-wj^#sYrsk4=l2fZZrGfqvNL!O8 zFrkW)FbO$hnYG&rk&SiMy7^r0Ly2LbsPLJiPzjCc`M>c2J-e@{1-pZ$3MzU%@kc$H;X^d< z@TbS3@Y)~Yl?vRlI1)Jl_|AI{TIG$!(oLv$6)f;tV3zA>r&@YKo(h@8U&4S6$xHS%t7yy_1L{?o}SlK@$>0EG|#z>WM*|~Z07r$VAy?w^Krr$NP z!&7X7g}OKqP zJXIGf%N%`96ak$3=w(IPw(D-JuA#4i=&0t6Baj?JC?o<&?~gEJ+diWQ%rru3QD0}b z!&z%fxq?Kfp=oMnlgE*{7BfiW@g8Ha%AP=Aj9`@nmhH4{w%4S%+v%B6sT@ZmVWYrd z!>}B?WcLHgewtf)Zm=AP8s$TSaed?9NmI6HWfb(yC@NiQV~F5);zOx$Ndo}m=yfXX zC12gpRc+dOia1gRAq3nVQUba?weS^D$jpiGH4KoNrA7f{4E_6_dC&JxuCu(=+-vEms_9y) zI#!GtYFRNjR^m%>e4Z+EoPLE+zETL@Nl~Y7WRqmMUG5c8 zUer-VYKsd25F_(tY_OHw1qup)KplWNz#7|6zpj;4GmC#wwyhK_r^2Teu29Fwo=CEw zAdpxFd<>E}UiI#}S2fLs|vxiKIy1ewUdek2xd<$=#^>Z5bo3rnq8r)3A4{hBwxYLuv* zd=$1+NlP~_TzMmB$f^!WVUK)il1rLTYKrekG&cKH98x7THCGxHHG!9bSrf!Ws8Ps} zSu(803{EvKa$9!wq(xCuZS?H(B{ea6g^3lMabYBi!CNZdgq#A|9rXtHO|tFge}{^U zP`ob~q?M$Zr*h2kI_0u38_*nf$Rugd>K~;Aqk@+2>JUgl=z5`XqO`|BcC*PHFOTAi zYh0}`g^wI}QNf!Ga~M6bpE1#mnbba#QCGCLijiL|ZcINNOXKo&B0gp@myqW<@|99~ zU;s6QR_ZzJ>Md5Pc_WTBgw9<2JTHO-;5!zOa8NMpq>@fE%TcK8TWZ5}j9ep1+qAU2 z#as!P;eQZH6qV0Bg;L$}Z~@P3R8l#v+)vjkh!k2B4d-*Q$$pa8Y}=Lc$sZYM%`8nu zwR1TmiC99T4*mUd7XWtFHqFl0D;%pWUH9YuDnRkmRAwO&KolYqhAKmj{mwuDk$~$X zZIoClr=lQ=Q&^NuPE1cR4xoVTl~Ttba>>d1fC|?3NGw#}7X=zgNl_@Rrjwfqz>g)B zsmWFBe*pmgF2D}M)N@{6xMfh`eN(o#P2QH>O&rTA$xRh}f<{+`IDP`n+A@TIdv_j( z+ajyFcf2oh{85skmYR-qGQ6(q4N+pOQCOAaxntk+9>XnmPN!|Ux@Vf6wyxfkvAcXp zkg}9U%Z7}Q$&<$&h)}<-malz8yxlJK7P>m|@Q)dZxJr4I%1aqiq=G^#fq=Y8?oI&# zB#^ry>TVPE?VlOu|^mSuq*%p<)$S9E^I7IqnXKKSa80_LD&@ zbd_&UKaOLSL}w&t#&V}DLa%d6ywlr~qi(cL=wIUgHJr+^2?CBRNlxJL z^9=VVI2h7}!>AXiWu>&+>*L{0ct;^+jp>NU;G>Z&jg}`l0b3X&2TS&tV#`})P-Dr; zy)A$8X=u2$`)}Fp)d*5ocSJ8S0qFY7Q&eX~)o~~JzL`0p)1sE?S1Yt-cI3#x+hM0UxNZb83g*I*FUX`1M%W1WW zZ@njIq*ikEb$y9t*GieHYNblVf~Dn#DT6Fhk(L85__4`IQIUo|qgIDXwl3k^R1of~%1~Kpt@jAy zhMJ}a=P_3d=!5gXE^;zP0mhXSn%z{OG~}q~1~$sNn{sX4m~E8%zLX_(_9PT=EQHaKK`PlHc0$hua2W&?JFyWcIM8F8SJ?LV6%4Y80x%(tz9~UcRd&U zpWSDmnxZsGUYJfGs^kk}oSbAN6)YRdRQ|g4jeA*8w-wF*0F*Ja%3gD5y>)HBaPHr{ zE>zT#pN45t*-tE{6y|v(Q!tkxXNWui0ZW;WjvDz;X)bOAn(YWamnVKg7zegd2qaK zjjcm1Vo_XUt(9H|s30gxg_D7jcCDk z%ZA5^$r4XK11Mms6ddu^b(@Q6)h%Vd#b=J)P64>oJyk0B@{=IS4s3Z5#|Mh9n*$ig zIV9?W26NA%aA_-E$)%;EuQ&UwRFyXRsHF=mfK^mfs{qLuBe8Dj+rAEa6RhmD(rylP zw03$#f-0F35}qIVF>)SE$`}?Sx395L=rN)*+v1XzmRf5~Ju!-zno$hsfda$}f*S!z zCG&&Z1+a0Gq8i!}aHOe9T6$3gs|<2SPbFJa0V8lAs4Sxdj_#Nk#&D~p$mumBYfV>f z$b&%PPo|G>P{DFAQqfYzM=Duohrj`NWXO313{E9D2RTu#7dxcZx}#4&-L#WZLdefd zvB)Ng-1k=;hzfaf>_Oms$J0^oHMYw{jcJm)3Tu?^Qj8ioBuHlDSdwKtV^>5%RC$}0 zKbtxsYoMUCTB$9y7dYyj*tJB70xM0;xOj^nCK0Nl%jEXw_(rmrww>-AqO7eIFI7ic zmY;)Xc>7Oqi^Pc*umG77Dkyj7;vovoe523+G!kidb@uh+(^-u@!Z@ZpD`pO23yBn# zCj%KOG8wrXWOmSf@@`9aMX9Qm85x$KM(kp9Q6*C}vd%bxCUOd=)B(qix6{w@wT)+> zxLp*9%TF^0f+Ge|$9IlOn(DbOwL(XYCo)r^le1?rNbX)@!) zA!A?yGbvTc?}86tr0Cq&sjN01yDT(xO;=TRm^`)BOX3xe!6Av$*!rsh)&hsb#5_O73+vl`_bI zVp#jI!B9(#sr*gmUPrjmxuMQz7zleKn`dxdCrX${6C##+>Pk?eX_b+bhLKaw2yu=~ z-NN8!I-6T~nhLr)%e&IiLoC>)T2zZM#L0j=E=gcX%XY~a&T*}~X0pz&EY`bV__~=@ zYij~WNf76iKwXDy6**;9!59bU7VmYrSBf>;n~7wBj70ddP4KkQ__;j%JQfU4J~Ba8 zQ|XN5kdlvCvqc0I)lu9dktK=Dah?jmW6Ai76X*jBk2VR;uVDlR zn^fH80ib>Fx-M&G>7LHG*2`>j9Ojydq!6@SgYrU7Rghx@07&)ijhl~S^>WBdoxYg2CPQ-=_o=#**4?GO<&JGSVV{CO7a#|v-rP?)(ZCbhT)S@tp0u$f( zBm{HZ0s?(|dTSlgysbO=$gQlYxLs`$w1$`>Q_ARLI1Hvd77D-&l0hTpHMdMO(UK$w z^+6+KKJ6t74#bkPbsB4{)-*%-wW%E>##*OP2;$suSOS>FKMD02!yH>9dD>1O=~eY? z(lV7l34qMmDuub>34Tn$+mX&VfuXkjUPjngjnfs{uo>u{+W-|2!^MUJaqN8VPJa+(J-cY)(`n+AJKi4> zf#yfI(5G9b-08hNOSaeQwYv8zJ5a+&ZPU_I!!8`M2Qsrr%214PAe;=IK$UAP4K2ck zv2OFVk>HHec+-yn2NB_9iQE!76P$6$86M{h)Yk`fRIa<*q`OH{d_yvUQ5{(X$a!F@ z%FI#oz>JSx+0$)y)q>?!M@zUdLt7M|5VK8GWi=zVWMUAnss2#7&PTSLtBXe?YfdS_ zR-Lmj?v>UGP1yZ5wA|r}f|Btx68P-(5zA?0J`gSe4Dxp5%FKiV*!m4@zie9%O{wYU zze{kw$>6ioQ=n)TNedC-tb>y+6!8O)ZYMYnLE>-#rQSE1pS`Fo7QPe-hNX_WB}pV? zNg13ja>pYqPJEzt&H))yNz^;tuvn z>~lpAQR(*hYm&SMSW(@n6`9zW*ocVigm)x&00Kcet2ZTW4Cxg_^zve!77;;EvA`;D zRzn(qrMo0*JO2PEz&O%Hb;hr7-l(fyYBZr@k{F|P@m)i5jy?gEVH|*B0Luo+Cq(^p z(@AbP3WRKn0CJtKSL$?@XsR~MwMvqB>paj$8n{t`D{>)le7(nPoD<&~7jWE{it1^$ zwYKG2ERszAJXI2*rbhvph{s}}1A*KzAotSE8b`V7Dl0$8C$70e4JBmK63@jX1TwUl zz+M1hR~bxsyA2wrmX3wuir*~I&m~|(G6sdBR^$&P3cR@B4DnHw9e~Nw3(eq=Q;8Lj zqgt;tu-qvqD{d(57GN~-I?X*ij56aH@WSy7Tkwpr$ES038*b6!Q`cUvDLqQE%#q5) z;*J-Qb0}2>oUCPhshk4MoQ}b6TYk?~R|&sdDtuoOC8r(yO4z${Vq?p&P>fWP0nP?+ zz%bhFu^YQaExgOi;>7g_n2rVnf}w|IRQzf?o;c5PG>Mpf;mV$PHw% zajr<9MMewp3xJ*`018-Sf=)cXgH|0JZBJxNO{~2S5U`oNV2)!z2k|q=9C0Op2PYX& za7Axo`1nXWNx=Rl!pg$Xt&<0vTg?<%y4mU5IZZ zVOSMq_Q)gGK`d#wC%HvUx~i(D$4268{0pP5`Q;{KXGPpk4w(Q#jZ|)tg zX{q-to4WbqwAAr6!Y5-)1NdVK#%T#(F=i#b0Q3u|GsCqrd!AGCK|&ZCj={-M7v0PjW*P6%s`S4LnO$ zMThN0uxUA%F)t&Pw)^ zwK|v8RH) z)%Dg{t~;N0&u^@>Ei7SD)kx9!;aMY2a!Dgc7ZAmnmnDL~5X_CF>TSn#yjIIaL2rU- z=rWR9UyVC8JGofA6)M5s3Z+AgIu*`&YQU!5)V8a2$uAKYp4|+S$!AzYw+XnONEgi# zG`-KOqnVz|@}P*>Z`h|4OtD+?k85}dCk$jA%$fd@Axju$&{ zIaJx+&dJ}Vogb9$3w7e_NlR&u;Ka7-csU3lF)&Z!2JT#TWl|ReWOnRs)t6>kDk@>F zzFS(J3JA?bRMM~J5@oM86X8(Mb-i>4Nut-Dzr_$yBAMXr#|QBwoN zzAS}-LZI+M9b_d+c2SJ$nYy*qy~S+a8;ETU!+NaSH;F0DKgRg67lsbd8GOLX$@oLb z$-8$XMKH1(qX0~n03VIlA6|z)UWvSL6tt%^b7)m38$D4{vdRG_?N!XA3Ux+;lgKgwIs=xWw_%G%>5s#gSAz zi~(irN$=k}N8I)I-NiCi+^<)AZB|w~Xrh#<2mlQ29~KVTKC%J^Php)a(C$6?()ya6 z&1c<}6{4b*Xi;k8rlS#Yeoj=w5$;5Ou7nZ+8OYL{3vvabu;Evg(pRmEy{qMTn{IH0 z86%033W6J-Pc7Zr;WwO?%x_3l7A5fo0u3}H=rk%WdvhI_m|q2qI>(L z+m_X7>J^?Ui?yDnm_=7n@RE-a3IJA8kNm^fdgs$b;0{U_wbx7X$Np4nfA{Gl>Sfv) z=aRnRB~4T-Q00<3g?>R>1o;*F4*ir5p1(sa+m4>&1s%_A-f5<`)Mftwiz4KrAK@dG zJUOWh51~@6oa7yHmc{7i+@s$YUByj$wOnSexm1fU!PUc3(9!sE3U>wgXgf*Ze%;cU^HdM%^LlGK!jFJx?_;uQrf*LSF+o#je zw;oqcS=s9?HBeonwpLx9u(!cRBaqJ_!z(zEkrqW|J&$5>klplweBM_Xx23kJFP5qb zN~?`bHwKzmX01wyQDhOMickgcoqPG>BcLrcO?eEFoV! ze8I38!NL}@?~84dW63bz^F>(|C&#nV+G;15##o?9Vh55B7mAKtOn|XfBe__(?rr0= z>+0$^y$!bOO+iv9>E@DvOHVp_LljD7$&?1<7A`EjSf631J1tL7tuWK29@0o|7bT>o zrucSPp>K(BR-YZ!II?7dxo_slBok{NROZ00IC}!f^aMtc0il3YL57I!R%Q zrpfUBEDs@eaE08-1Axvj7Fdcf4i6>Ki#SV7w$)!-krm2{vT7U5E8{G}N!m66WJt#) zjU&S}XA9irOEH&rv+WzKl5XfW+FmQI^s`XZM$v?csNOe@NaczJV#pUMhJ}?%+t~yG)8YF7ri^LW=3M5QWkfh>Nek2Urj1o97VEvE) z@s3pO+0}b~&8N27w>*t-zBWOI?N<_~`P5ELmvjNvNaRd0QXPa~5rcC5lDeVNeyi;o z-MvF^vO&15RT5L&Dbkf9_?&;vLZq=}P(n5txUe9daOYlj_g?7M8?ENPg6%DAG<1}x z)R3PRx58M~=OeOaB`U`S+X&cEfI!tnv9~t;>6Z69V`;@hRZX;2UY`E|O>c^>DC$%e znd7S9SryB$JXjwtK4V?45Af(Y-kK9TN>8; zEMd5XWmhG0k&Ix6wSBF+&9=HrWa_*$iM!yfGC_5>KLo2Npe8$CU`qUm-Y7%FKlQlSD@Xc+@V$pQ%uPn3_C)t|CAmg}kByL#6q z=BlTf^KPzcD}B01s^IaUh2<&D`^L5^@-Ll=1Uf9b*x? z9>P^p8}JOBMy9Xad*+6Cti2~c8ffa_noE?_%|mXWmSEDnOjcM2IM}Q4UPXxT@tqs! zrMIBlQrT)Baa`gXvd z>8=Rt15=pdmN+FbmgLH2pBW4a_rv6pC{5F}HpQ2HSyt_R+w$z1t86qgTq&*5)X`Q- z5bQ8mvgbIojezd*mgCp-O^{3g77wEA3s+Mo+}64}n?(X$BTGQ5 zjuBFgEMU|Mbf1xvGDjdX;j^D0Cy669uK4PV+h(KT?!6zXN=j*d==iGby)|3H(xQj} ztB^1Z2NsoC$qSAof>?QX*w!7{Z4})zsHLs7Tx>sfGd+BQ5lbAAI>7$`!{+RaT~Wq7 zvH_4+%RU=dNqTiY=QMTo}Rky=bQo&OZlrg99)?|c_5EH}@pl7=Peq&dr`vb0hJGbtw zsXZ+e5K7R8ofwL$j`?b-hAXWN#3X(s^QAH8OgIG$@-V>2@c;@>sQ?m2 zfc2lJu-jVAX@ZWja8j{yKYa6LRsdJGbvXqml*(YeoPAg01RU!`}&PT zyZxK@wNBnk^{we`v9(9T{55iXIRvr885_4?t)9wrjw*R;8(fsq&v7+ZzY>-hVy&Zs zo>hh-WXWkcoHjX@Cz71`LB|j@;>h0(hm%Dw`i+vD&@imq3^bJ$QQY9BSEg_zidU#; z;F2g@c!Xh@Sy9Q(dpGw^MyKxDOKq7|=`EI-D(?KMQmg>aEIuX*?mKskhYAs;WU7M^8`-zXE}|9#|xyQ}gYCpqrC?TQ=1NEuQ^BcDc1} zI|OeUaEx=nJIK%cW61yO$Dm&XU!$7n&{mrt6~i_ zP=tRntCs=Wh&XfT!z0r|w)Xpjd{j#fbf%7xW@I%GM(U~~PEI&TPmAHk8Jn`;V=Or+ zJ2sqMIJ`!(&u91wXeyg>%? zM)vsV8O9a^g6tTOtV%FuerJ|*#{qCmY%G1br~N8%mF>1TEn8!7?a1uYS6lA4ns}OO zWtHWl@S11~Gst{E&&05GV5kVjbAU6W;v3EGw$Bwk?dcw+Vc{&T9Y$2~3RXg-qu{U} zPX7Qg>!@^xW^8FK^hGYz6H_!0(L)KArdpbH1SzOg$Yf??#aD^O52guVn#*pQdv(&; za2C1l(;7b-MX7+ZF&qzrBX(sRvyun6U`{l-+FJe16b@{nVe-*ATQ*M8mXd;_aIJ&rk<)CcvSTif+%TEGuk00 zBLK!^EbO_#W81!K2>c3Km~Hoazkv-z>od^7M=iVH}k4vG&iGUqBu3^V4)133p6q%%l2IIVGpvjJN)yJCxQNmP$yuc@u5 zq9H1sJONZoh6OxM01SKKg7Y{aFMSqTimO%f=~R{NL$_%TX{}UoJTZhuXoPIBg7P~S zIevY!lBc$oYdXodVUg+}sJzwPYhsd}%}Y|pG;T>$7;t&vF_XxUNEq#r^`EK~dzPxU zj*{73LwTNT#wx9kIaOa$tIZg{lzD?FUu+E^X!V?gx zj^W-E+iEyB6cFC;+lro};A-h9-bocCYz`2WNkWhi#pP9ERJU$HjfDi;W{N6}!)LCx zM@vB+RaG>Q<`0JwDv5A${3$rgD`8c6mLtmEVvSDr>KYopt=(gyvu(*?o{ryhsAYSE zalQa(oJR7jj7M|H5fu4ObAZ!`oOU^+p(XcRBeyNlxGU{7v{LPhqOCm?Qc)+y!7WOo zp3#a}r2haqhYVHY3RgMfh8nDXEyftCqOGW_yVgNTH0sin@RVej*m!4( z@)+j4Pn?Z8Pt=X0(>vlS|Gh0mA4jX0qz>&HFuok8ieU1QyLSTEb+>$j}d`CLH^QpX!q zLrRQ{V<7^hd2~=%N6Cl)y9y+yRdCuzPkA=y( z5>K*>fHF-HG7?>XByqS_0*QFM@0;zOn(c73ZdwYPQ~_zAr+TVNQtG8a2|BE7o`gxm z0Cy+0m2SI+{{VaGjWjoknC_R`l|>6PQnwmtqj`u`G8W+^pTjH(A}q<23`Uvv9S2LV zw<ZPZO3Ru)Z&G{@G9I}?i32xaW<(A2Nw{6HHvh5pfGWmyrsY1 zY|Qdqw&m8gnlkp<=Zh1-k~tEpx)RROD}`SaMwrB6 zK&Fs*V3b!_rwn|q5jbTAUm4C0s}0$2-W#Tt(`@*Ay^8fwRTQGSnz~3>3&b%#Ywc~@Ui)O43GJ&LJ;s`4Xr!rxd@KruBT)p3VqxM0Ze*@l1DpU$ zB(ed;m1p{9fJ)Y#iFVpF^%uIfmgPwdChJd41+qw(N~jwt1d=nRLKPq)smhUt00jHL zN;ehDs`k6J74GPk`U`AR&jQ<8XnYpru7`=?l7JATspjC|;f}1k_0x3Otu(J-RMqd(1AId>o70F)Y4C_YNdv4sUg3C!)6TL_9XQH;(hKZe_Rq{d^ z+1N72mtwqCS2zO)Au_f5m@~q?#P_r|*|l$VcZaU8v(VUf{4!Jucx$do;!;3T#w01? zVN@VOKpe8imPWO1nY3gE*-9s!U0IbrO zqDS(|#w1{o%&bS9my0V011aXcJa0L3vaD`vvbl4qmfM|Kn$bfYC7x*FJm92*!wnLs ze~2?7Xxv75lPHn@02gk=jXd<@e%y;ClB(luYS*M%>RD&0R%?W75b+~)DkO`HLQmqz zo^C1$QUTT3vbufK&9@70J6)4+S?-my_>EEV&iIY6GVH)HF6*AzP*D8I&@IEz{e!x% z6qU60=&g5psLRuM6s=8DS28;lc-_NE5*)Aug-l-Y>8qM)> z`1Dj+4zDpek~xcc%X@bmy>vF+()l`fOLw-|tI})5EyKsFo}PFTx=1I829vnvhCdI1 z$!_JC5!eX#ik_ZaBCeu?a9pkQGt@&-b7;&oj*^gkGR-2hgUC8Gg_X1KjBAmn)5{Z_ z0r?;S&K8QzTPup2Z8X%A)JH`vWo#`uO8)=_q+x*~yoI0)c>;_(^2&kgrE1>W7OklT zB^@L(%i>EtJuIr!@k|lYIhq*DB9d}U(zyqcmdBTkVY@b7&4QAarrmbCQCG_g(z|tzR|J9iM9QFMoYT<>&u z9lg~{g^*sL6)hU%RKUE-BFQX?5`Phh3J@vsq2fp_;VACCxRU~nF}#+a4<9L*yT>Eee_l9#25ab($LFHRm{|vNni*Ee-Sw-MnC`{ zs~=2bwyGPX(pxLug2h*SY9(I+4<5-kg6t99=8K}uj!1O9Gt^F6ti9IyOIk}T2UW#Lrq93t0=0d zswtz0=2wWilN^#Oy7L$TTn^x4O8aAK^!m}csGz&wDr=2=Q_d+UVk5&mU&eVFHYQ4s z<6t0p01J;UduOz#rQepiyS0I%v|Fq02`#2ed@|G2R4g3+DXXH92b{kzc@H30kX2$% zJ#(_+!HV@9s}c1)p~v%4{{Z*ccg?+Ev-JCOZTp433WC&vmvcqVj+_G+WQ~WNir^B= z2_R(UbEG}x_GJ4*TGi_+;oqC0hAhS{oCQ?Otc6d9I4&27Zc4|WbQx8^)8$bR-25T6 zrJ`NMN+~H!R83cMrXB!AtB{a$A9PTv3UZ8=D#Wgd+P3w@0H0>=HluC8iC}V0k610=bTurSwdzv7^trdmEm)3uY6&bN@WJdyA4XEF zGlF?(vZJisc&aoO-L1H8ZBr##in3Oyk{4C+dkCR+WF=D^g1ZnINdrfAynROMWi%C? zMcjtzH8M*ibO}bYNMMW+7(xNvZ8L=>g8^ylWkZG_WR9YYB6qRa;UOGOU)x>lPfu1avgpWV%!( zmRe{G(Zw>)bfSuAYNH@b3b{ZV3?+?*LmmUTXKeHpyX@^SLkuDXtrdKjdp ztq%06%g3_?J%@bc792px^Jg3PLEaeX)`O{A3Mx8AYHGOT0b-gKiII`P4aoSC7Q+$& zJ+Yi9_7euw=e-Op&LwQi5>rESjBEmddvVhOH^Q*@qA9om<{ zM1c?!gUBupcopxWSN@y$eRZ*Wg5q=?hgFiDtl23r!=8i~#K7AQf;2B0}jQcedi(R22|gx45>`($R#D zj)r3@$cj^vA|uA$xdBj~$Vth=94Aqyfx)-W>X_Z+VI=QOy}2o>=x4OrY3aOJ>rceW zUVj0_L6sznf)-UM#e+sN1CqtKjYPF{zG@3WHTMXF(tx#4)W+}{sK5&A0>c=bcOVXN zkaBX_Ad8m4IIOf$MYrqL38F&rnyF`~sfq;-s^Xe7DdH4W;mI3{VOXBzSN%hR!CPpW zwk^whvei^qJTp>L(ZM9sb6^EROZe6Z_%UFtyhoKl9=qa^lmWt`2{sfBlhdmwP3?E9 zuJ5XsYFeo)RUoIS@vG&Xm;V4(m_s8U4-No;l^GssJ(}y-F;eb2C~5ZX-rHM2Jo44j z+>+2J;2~oRQieGsn7PLS0y2dX0zt{uC2QWh3Z~m#dfZoAj^nm1bu2YiiAx8-QP&4z zw9rE}QaCOPkWm!!Q{DTWHEo^c(OU!}(GKvlSuJ-7BCDF7`CT16v&>24-XxLJDlP(o zk}Kq@_VNugQ6E{f;OqR-G98W*{dUjW-6_0Jxz>+$U+$Z_=?&gWx~bLZXlfg?n4FXm z%fZkACpINe_;Hj&rkSWMJ8)aKMcb?w{pB5{Bcm-%wI;2rjsuBIRWiiyP9qB3yiy~O zg~@3G@zTZKeU(>FPj6JFHi}hocde_28oBBz%NZi5MS@ue3`U_ihslXEpDrv59UY1q z`U{ZS8|=|s=$;Bo^>*KMjNttKe|;TL_}5< zVLssL{{US#CfD8Y?TVW$l~>8=>8mSGjMWzeRuumL6$&Vg8;qP&l!Tc0XCXl~mrN)q z?KD@5#@y)U@rJt5bC#-_>q3!SYE-;|1aOJTT6Y77ok4X7#T%A!)0@9&QQT>0Y!xi=Z9`b3)~aRn`3b79*%EIX6Wh`{JGpNRdf;w z=^o`!%#u%);|)4;{t;FUih&=i5t0{2p^>tewVS?KLm}I=(D|#r+0u@mb;ie4QuQrO zdyd-;q&;mQr?@?2OeI;2(8?L4RtGO2W-3lwD%zv&A7+bX&v>=VY;QZow*9s%Dl2LY z`k4Y$GOEn+ERnjhv6Y=bW8GVqA>SQ4e5KgiYW23Sn;l%mbF39fJP|`8*U6URC!SS{ z!F6VF&4WJz>daNMpc2^VSL1g*OIyXyYnp659YLz8ksytrS-@F;m2_!Oo5J zlJEVOxYX<#+bvuWIEuR0TS(OCYhjbbX=?+j@qqyD^FQPn1q4gf5`BIFh{ui6uAY!067OJi*9x_4gVOT9!k_$_ft zykd$;Bw6H=6#>aCphm6cL+C&UUvz7(9YVKFQ@M9e$7!~mWxAqgf~wmm8*OxGI8zmF z9gZ8qCBFlZFhdJ|H_8)DzLW#LOb3?^HgwH_pGAa#xin4b))vLvp! z7y*ZJHfV&+gQ2Jc;oI`ZdReDyTPFC4wJT*!bll!1{{XdYJ@rj)oq)Dqt~C);Q9zA| z*;m3;LK~X^IJ*o09AJ?bs2g586jsit?OlOmtG?HYvwI@#RV&$%8KV=TB)$VuNWNl{ zBfsKONj@g7TF$8TBc-&PYVSk1EZ04$aiyl44t^Rrqh`RGo(SpO#-)kmr#x9s4ja9J zf2phLjZ}MX=RsX*f|;r*rJX2~!>(n8))?Wd9z>X;#Csud7F; z6Ed7_RG((sRR>bKhf{jn0>!v!YU#t=+L%Dbj;^L*`dft_m>(jV^!w>D^c)HH656*fzPLR+h^8jia}2{VCmjH{2Cf z5V}N_CK_rQIw@4(taG^WW{VsSUPp7=jvE9!$GvXW`<0@$uGtL@Q%B>+SMcVdn!L1O z6v#{rWZ{sCSHe&kvw}`xU-q8z>Mgq2b-&b&sV$C?>r6KL%l`nDI^)DcP6k~Wj}%b+ zqd3nHPYN4;?kF}*%D-=1uj0RFMCxZ1lmcmO^$p3w8m3+{%0a_L637k*Ba|`(#{?SZ z5D%Z=nqKIJN0oH9+5@ILSAF!$ZtrV^yROwL)p!;3TVdIxN!gAuADnmrvhE2Eyhm~| zioR~H>`L9cLDL)klG%N{UaYhgHc2-Wi%T6s$t%K=Lb!T(DxyTe{2cp%#GC@Q9=qMH z9W{c3rdx(+E99w?J8X8!Y|_?7V&UPeLOv_mi#y1RksMVL#+eeoAiwQZfHW2co?;e2G4i@~LGt)CuwC#U3lfbd9MwtjfgO8u=C+TCR&xkl9$Ez6q;OerBR5Jg>U>1O`DTDBD(M&#;#^~Y?T8o_w)K>9FR~;*kUlA9GrRC!BNC__?Wh@H0K*1g! z_7}QXY?IjVi&PHXuHh?BwRg|i&u4#Ywq1tdxGc8mspPL+!E#u|B(ivJtql}KSy|E0 z7FU^Yt{)?|pSoez3rANim9&*xr+4iQ%;^=SR-W$?!6L~hmPYtzc$zoNWqe9!1o)kz z7~`UQ3piZTi=BAl(s15r-BIBhJFTU5J-gbwUITT(;GGPf<}N#;%s637$?|a(T4v5|vJ9LZb{g;sYykWoK3*+3UM@ea~@U z_LYXVijrz7y|ZQsS0fM_k=~)|)>?%zgU_3u;j#EerESWdo9+9>A5nI{R<~`|?QMn` zs;=8~ecsc%1nr>@j0Np+J;pG!Gf-qTKp&duj-BpKt?gTk zJ4WbjcRv{_?la3%TSYYg03R^$>C!kOWrm$lq9FxHE#qS+y4suJD0bcD_ch9j+H0k_ zQQIn}RYjZ-z{4DI$b2)(P|eL3#N^TAkW`{-L~bY+52L84cBYt_BT}0fJCRiSOd)y&JibiQF735(b z#4`tWUQnnpuQpZ%Tb~}DOP#4>`%i!osExU_6D zH~OCslBR0jPSNEas>X+^cX~gEqqtb=?35EzP>B-h0I!wSpu9^gRRv2&#%PQ!#W-S8 z;2uDOO|vL^uVJa&H|ssDU2Ze2*{LYe)KvUD@iI4$GV+o(F*j$xE5LEU4WSfsS~ni) zo}#yM+66rnOSj{<4l>kM$4fAgm7@+K8Da<}#&BE^20#th(HpJvs5SjvwQq{rIH9L@ zxLR$OYE_6Y0#cfGAgl`vYDX50fmKnI^FFY#{?-d*CMw|eT8J&k$@{Kr>jy@9(YAVr zTC`O)mA5+8imTwMC2EfqQar>Xj!sP6SzkB}80Ewf>8lf?7n!rlBzNDoD8p<`LV7^8fJj~J%?wM_LrLmsW5c|s2A&=S5T_J34os*=l77)jC?V2XP*2{pKZ!NFC8w6TE7 z%E6Q>axP0L8hP0Cb#qF)cFjDs*175=RFXP1G!^Vu&l@Yq#wI|Vd`?KYZz}p_ZtF%y z@&5o*S+{L8pjHl&bvta|Y?sUJraIN3ovF#CsxJ*1GB<-VOEKm6_>zG*3@P&!80Q_u z_I#;|yWj<`-A7j}PL&c(EXwIVNHHt3h#o*jJpgX_^}y>({kwDA?vQS z+oYKbGdaw1^7E!o0t*!wSlI?npk22f_e$NrQ@%Q2D4LE*72RH*v1Ome4Dv-65g}8Q z4C-)5#}Y=jL#!;w!dYN{Ib3B~(9P$!Ewp!-D;miSL`zXmEcJoW(4Q_^GC>4qi7JNx zWl!SM_euWIKWPq>ZW!&=yN;IeZ>Ccu330hV)Dy?sD3uQ2WGN&CY=S*74my{3Z0&)* z>bAYcn{`@NS_Fc5QRE$+Q->^sjw3$A4OETLos})#uH|grl~pF`S3A8o zg3m~1A(%#DjwcP-SYY}C+p$rt?C~H6pYlrRf+#D--}b}lM&+?kU3YBMyK?(42BxW` ztywAgi2|SFp(t=hNGFL?^~SAxFI;vD#<>>a=xQE{R zM&o6-RLK(5JeAhJ0F`pwRwsPMc?BarQV76iIU2U>ESD8Mjjj||=oQ?(3_22u-TfGYs*>Tiw^viHmG{xMYnrOE6li0rr+A=8QzDK<$7fYw z11h!v`uF5sly!O^vi|^7-fh#gsVkPcm&c@@ot&7VF}@5+S%{IORtJ_w7^;;AUE|Xq zwI4`2w@=Q)xns6nfiYCtZb#v&qmX+9VgnxMvXXr?=f-saZ#eiR0(4~b+h^DQDza{o zZi{e|ZOKI=JZ#g+6e}}BCUF< z0gscnUd}g<__wf>)8a z__4{#Mlq6q5DIgQfO~42*t?^ryXJcCpxt%_ZHBInDhEpH>yxc{t6)HcQ@`-hi^U@s z=D?vOg=`&IPuH6j3>OQ{)?K+#ZnsDtb7_FJeFa%pWNG|i9#Daw5;hnk9#P!WW$5`| zL@JTHj^^F{Kiau=hfTJ2?X{-x+Iz7sl$Us;mYSr}_-au@0g${h+?k2wIcGkY7@2YC z-4(i*?@NvLm-*g*wq8A7fl8P9D{qHfZl1^NKSww5;geUytdgD17 z(;lh^3oIci(P~CR(CyRqN3!(>;YGV`SF{qxO)MsBb!WqhnB-i5<`8*Ce59!@$a?3n zRLi&6QmV2#cc`@5YUF|msKiwN01ZP6Qc3>+Fv|rreE9l!&HP_}SOrauLDowxmf1Wu z`%G&5X_l?+vAV}dW<7~g8H|0K9fxdVk8%lZo%gsebOyFdwbyS_N)^RabrDxAn8_!M zsLL2&Ib@aM2Y*dHvuWLcN($98%s{V*Rku$*#P+?FTK7wS#{0ISN_3}V1SE3RX>Y|f}pz+GwqF2`|`5w)s4voO`~tmNn)o*Fo^+nc^OD)C5YiwhoDeS2blNm ztam=d>6Pnx$9>p$NU5%pK@2t4@MMW2jO6mBidg#w89r2Cc#LuGbz=1Er54#5w!3rF z%8|81kV8(=#-2St5IHiWj7AAzfPR4D-h6 z$D8?cmR5Y{xyjY zjpx%zcMP=mOOOt<^13&TNKI0LIWn>^;ZX>X5)ywh_GOTe5cQW_?(1>2)KzS|Rb5Wt zwM5Lar6ZbmLb>qW!5BC^)Z}@T4@T8DU9yY?1keDx$}@I>FPbr?tqo%kJ7!EOT3}RHBx6(7PN_?T4k5wE@Tyv z8Nw3+CV7z0h3&*-6M@_mm+akhwoH=l3vTtEXOJnV5>h2CI+Z+Kh9qQOTtNYx0N%u7 zU6}ne>Sa9&B-?VsdU&ITISnmf3ny|N_3A|GhKXMoDf^99gqe{-BR8mOn zv&&62B{Rm7_U3$E0$F=83dMY&j>HWT++Stww@*biPQ zO}6Pc60KE7Q6%dq4y2ZvWoeW!QT#P-*udfo1AA=`vlLriI;rN}l`>US!V+^0B1;0s zyqkgvvfNKEHa+p**Eg(kNdS#zjUk9~hB{?ns$&Bx=B}6B3u&k^a3(d|sVN=)$o0CSF z90y=KcJw4@P2;9N2Wf^zw^h~4O;jpDs7Y!bNeSZKBL{T=gPzC&j_Mb-E-2(T2uW~7 zG>ABo=kaGNpF!#ChB?l>NQ3}F#blKmG05?DMIFh=I32O>57X0Dbc{+9xpTG3yL9d7 zs&3Ye&1*=MGa58Xd5>^V_&mc!GNI2&h@|N30qL#Wfz20}s<>r%;LSCKe zRG}a!Rfsd=C$}u;^wpDax6t1bNbYM-TWhL>#S~MzRL464PD-{%m*xh09a0@==w{)s zsIqSUm|bVL{2RMmsVS+JdYPjmytL9t${&t0u{V^DGK_!<`X!ke3C)l@2L(UW(OZ5W z;;C<{)Rb_e3Wte;#JJ?yX6}H12=jk8Y-dBRHoA7C6-&%Y?#WS7nS{ozjE@r_mF`Z84yahJX4_A)p_*F|UlQPIoHU`=%q2*q@S>4dfq13Qc3&wY8r`_Q(_5C` zw)`cyECywU;qJdhadub=LaJ?R;x`Ox(7i1dwdGEgB!Pn&h1|; zu}d6u^wlX`?fyznhOAh5IRHB=C~`mt@aH{Y(f8fH>$5jqcG;)5)hsremlMx77nXb+i55ZuWMsi0XWSBV-Zis(QAYw> z=C{i%_X6eGL9 zoxze%PFN%sM#6x+duQ|1np*qgzuoXd8(ZT)4~Qx8mOPxxl14^6pkvVB@xdk)#+sU> z(^aJtl&Dh!&cv5V0VEDz$PP|$Kai7;Z*BLhwHP9vy&J>gm3dx4VCCD1!0bp&fK-#; z9fq-LBmvpYq64yLxY5aS5(}kd)al^{R*ZylU!fpvm5dZ%5S*=b*S*0;WU<<2j8dN1jp>qH z@*LVsVYu+lGw8!3zBP@m^|_uGtGR9&Eta>DDjJ@ipT?Fzgz|};p6tLb4-tY%^#fl? zb872-I{p1Ts<9IBA_s9$NNxoR`A46>6g~0SgW5cn&A}o|a;CW&Xckp4pnxS9@y1vI-vqcS0Vg=muDgA9;;M#N?ovrn;2~;iWS%lh05R#7 z40{3(sqNpm(E5wr-bmt>MMxld6=~rg!;$jL4hs&%WM%u4j3_#DH4;GAHKz9|McGQ# z(#Z_b)58Y|Ws@E{p{R~EWa6XFz_H|e_aTYToAGPyzhtankz>r$FH>F016>dqcT1Nec}L13+%MlqjLf!|sL^%Ao+ zLefzq;UcJ~lfs&*Jh%l^b5_Z90m)Jb8DZa9L)=LqRq}s-;ZVWKV2gUZ6qI+Nw`-~* zt1;6@S0zCpag!oEd2y4-g&<_$ZKsXrk^2cHP+V+|s;m1JIT`d#nG5Oys6ZPP5+aDEB(C)5-?$JH7aCH8b zg=^$>g1Xf?MDd6iQt-yA0m~4suYkEDQg2-w*?T75Zo40;F|3kA(k(^GrCd3{I1)y` zmPt|%rU$ic);-D6TcyC)?fZn5y1IH&T1sjO7T-L?x{~A=!Vq#wqRE~oEAv{S>5ozt zXkfC`wPmbR$2}}oc_p1?f=H0@X6=Zv{q7)vl>i(N)j)LMw^bWldk`r7lOlXmd82V} zs6X{PS4qD2C1mtgy8W>|8?&uA6;V6ODFK0l%nOn^fsjT47zY}Kb(;HTrB{~E4J|{Y z#;T$j(U&odt7T84jOQ80raO%RwC%~DiYlv|jc%HZ@kkk-SP+H*M;9Onf|(9m1Rfal zCs+%L(#W>z3#5>k>rcg{EZm=u2JEU^x_4G3eArwZch8x5V0OWRR^ZT7_;+k943PgIgmM_&vOGAypXGh(6RVpI~oY;o>K z`Xe6aQ*8T!mZC_7MI9_rLnJX%Jx#tR5>ldek>pStvtTf0qjkRzP|ZovE5Cmq;%2C zO4SerEO8i&%iQAxf(s1xW84jUuXD`RmYdD)dU;@`mUcx&ia5l)T&qT%+p!7|Kd+R2 zQ7v0TVq9rty54SYZ=Pu+o+@cz4wBE7;$_5xf-1InFPjVRk~Dskr~NsqY8&m#t5mN- z(Y$o&ZnG)BU*bgy=F@YVc8_UfqVrKf2g zj;qDsva12ag^m0&LaA&O&m5fh)YSNXwg#C9w)%{ZvRRS56G$b$cdc~NS}Ww1I@Dk}|r_jJ8nEe#2&q_)mcsu#*i z5Xz^)Uc`BrFd&X285y*(YBkQ;3rQ;6Lq(HF1Ur(o?K8`Atfz*m0pQWeO&he6LqDCt zC$h4UkDs9KMs=d)ex$XCt*LPpa**KGM+kB}`t)K5L&EN{X+Jj=DAmRa%H$<5Q95&PNs?42*zAewt>A!&|s0 zqrciVP1>f>QY63V8BD1w}&|o&%DF>^OG` z+a0L9Ik84xB$@06Pv)vNx$dq9$#dPaVQ+ftxR%vRQEjHCFUFwU8We^lVt8Z{%m?>Z zwlGh*(*(P2*;89@vvn`2m&T{BtrUU_ZH{}4J})E*g~G9B@e~G7-u?YXo@2h+DXJ#g zmb;A`RS8-aLjt15&%_0fqLO*95(f~hp_xZw9w{caZV4WXeN@t1>4UtLl2c7q)l8nT zLV{#a7D)d97D!?T0_R(FP(xSf0bSTTS~Hbl1sMxwhq= z&v=?oi-LI?)RdISv9TZI?NHL;fB<1*=HN-@9m4Ckri)7}&q^@gh|0y%d~Mw4U%@GL z3vSu05gTUW+m!H3rIynaEhRj)5B#OkWQ`DVKZq=Z^8=4^HL90tZ0i**y6?HRJq1Nv zki_rt6~7u9V23PJKz#UQ;HS9npKV+lmK!bZjwo*1dWxoaY79_N&sWYkxfV#$SIaa~ zGbT%A*V^-Z3*EU_gHUoq@s0Ey4DG z>J>%2!xc@A2`RiNBAPj#dNij{{FRrm$0QjK%;kwA0d>(kZ*kUK=;x`oQ$t!LMvf`q zol#|G2L>)rA~rj6Ac35K4mIZXz3vNM+%!_%>MH8$W=MQWSU^}+iOS`PM)E87?VOGv zW037f;gAp>=MsHaDC_12XaFv3spwx-_U%+w^Rp^zC}NN#61C2naCxwjM}`*StnG|o zDe|e~z<_iMa_kPPQr?Am+BYghdSm0wBQ%lHEQg3;3|?mMg;y=;qyP!dy0j$}^+?q* zz|&e8qJrmHD4Jvpf!&m|v5iM{0P-M!d+9#+y6EB;xZ|_@UCN1rR zM-tf>;z%GX9WPU&(=c^j;wdscT=E^Ep>odSw6&XVQPSV-al(*A8x!zF#H#VcT%QyM zaHd5BF$~;Wu|B(YrNW+yk~(W8GrdHDT7MP_LoQwNK?FDv4lT#9Ipu zR<~`zVXvo-t~rv5;C?chRz^M?XhiZ7NeXe0$G%P%O;;+-t97(iy!5u3E09w2#YYm+ z#DkLuZZQuqD}`eGi+OR3YtOauHLlw5O|FZ#SOu!2yVBFgxM-_PbWtit0$i#iNu-vd zRs={nG?+$00{U_*fy8k*19_iuZVQ6cSR{ho1zR*M=;9)<027-la|Ezr0LDRY%S{l~ zZOLvG6_0&r!&z2uGd`>yG^#|qa=4GkZN@Ia(w75*v|Ms;H4aezR{AgdL^!wp@kj_Yxj zTasMbBr;1c79)>>(K{j`PymcBFaRCSTRK$RR91+Zwi{J5QZ!2^mP?A6DpiT`6r&>! z1pzz>FOE6&?#KXfx4O`{o&wWu+_$~OJ6q@;t{9CxH1P{{GKL6Uq~{+Q6+kSb)dp5Z z15z!UX6)1v+v@7&XrfezhY8826M2(#zVzRoXFb5UN zk>9%vX?7^|@IO^DmTonI*LStUT=GppYm~<{P*F3vb_xp3DZynv8Np>=FdvK558XEn z(YYs1&eRG?Ga@Pcr#Y5~%J8 zQZjv1V~=t<5#_;GxJSD;1w_+5+Mc?ek||`CApBlzC<&Gg%eh$BzhED>aexed;4C5y z!BA$m$7rXnYOTRbQevHI9*UZryS#V-rIIBjz0aTn(00fsP3E48&sXv*`kt8_SGe}( z+oYqPaJR(N!xPbc(PYvgWtSuc}D?+ z(0S?}NmN8b@ksr1Rlj%~fyv$jQ*XWM&CTCP+AYKf7XlO$nPOngBN<_+cp82}7mYQLJg zKf0(bvBN6P{u}soRKd}sVZ+Yh(3600-y$=QO&TJCy2z7LtdtbSsK)hSO(=z90gG^S zD(4`fA$ykf_tYB6D|j?X$}Nm=qP@BAjq^R5@7lPbk{a5D_;U2I$IYAhd2lSu0ysUv z4THp=P&M=3q=~8RRW(RuqZ9F(>d`!rtURO!G*2qCgOl3?uWsiP@0YQ;t@GNfl}SYf zo;fQcDaEkt!^8!$rJJ`N%18~|;AD)m?iLhvHtH*lTTM!-B}9~z{D>ZOFtnyFc*`lm zyC^J1N2Zn}dz$AF$K5i90xW1Rma8QrSH({h#;Fx)#Xw;aD&R;9WIjrRlaAzP0Z1y8 zwp*1>5G3Eh+ub7YYRQik^FB)iXQPxFAM{<_FzNKP{nu;=yGp-5+iDG6w`vM0XXTESk z^u^AW>y){uv?A8q)%NRemY(Yjw6{7kO(gXYN|Qx2ht1=JfdY&SmGdqbf22>6#a~uO z#O}EoMF_LR^pvVqozHi4fQ%r)ImqpW@7O$T&$FKTucMCNzO5~_Z86h{WvH&YM=4cq zM5bY23t(r%d=BF*x*Z|Az)AFXlKqNw9$~jQDMg@okmAwa>M6dQ;uxqMKJ4Z}XwP<6S zXzHh>X+rW?qnG(|c!ewhVVrU!w3#5W?j414zRIM^r@d3^cAmH~M zk0X=op!iOs8;C+Rao$1+NoEs6L@4i+@ceg$@iY-rtkQAhd`QR)r2z;?C6U1@3moh1 z!jDHHwYBT3ej=?*zY#{N*7(q<1(upd;;c_^6@y@t-?7x*oz_s#aE6DgX+dG7mQySh z^%adA5YBu)?&3r-hF&bB^HM?Vry9O3dz++mLf^DDcKWc^RoBdCo`Q}fFH*hAGL=V3 z9}9uvHc1M9H|hK;SH9(N0SmQlC(11*>|Tdd*4Uxko3C;}whFw@QCedY5dF}}6LT4E z;xfWa42ASi26ye9w;;Hs4Tox8?lja7Q%WVdNQ5llqv0ApEY0DNP8ctImnXii+xJm- zO~Y!{*eIlq@m*1C#XLU<6v+7-v~TXBn=KcKx3OOWw2`$bo~ov;)bSI%X^7PU%Jz?r z0aY0F7Y^my_Zy`J43syT`pIdkJ~iN~K^ytiyb;K8R(vQ?5bhY0oos^pc%Zsn?)28V z4P!wFNo9tjuA(Z4VgxNH;0rnm9#HTE)_DwBCEHNB(9Rm zrIA`pIw~#|Q6Gs1x~5c??}(_}Ra4kE6+KKFhMG363sB7jki#bu$Pz|kfak-*oRJfD z;@#D67YqHKiaLlUqlTI4BtcB>Y9yxN0xBeaDxT(6a@aY-HxbB|)-fpecq>z*ABZXS z6+4dQbfcu+v)}G^=+Go|FjhlFJ2FGaBdAtM90x{jE!>g`_R-3H!FH#x$5Tf?j3%fk zjWJ5;qXI%=Ld@hi?wBB`Xi}rWLrziPNaKyN8=hk;#X|>P#lQoQ^Z*wvuIfIi2e)-R?pB71 z3k)p9PbHF+y=3KNW|C7HDdeilDeeGLNE}C-N1@%eJ)3Hr&$wzRsB5A_1*vI)cX<;B z!X6+e%Fd*d#kl}awzN-Rp7TivYHJGDTZCbnpOVUe9$W!A^ z{{V8;ZT+>hsicbD{v}<)rGuU=9_@;^dNXjXBfwI+v)%;cvZd8e6j0z$Z%giJ_-~ zf#UJ52O^*VMh6kxJFCQdIgmG*PcOJ^UyX$u1 zx^Ai)aJorP;X_0usc4iGfr0d9JlBy<$JqRV0F88_(~?H)EOJk6rmE`C(#uy)Y3O$K zo(grDsSy%hDx`Atjut>wR~@n# zckjga8Xs`#E#9j4S6f>0+o_&4_-B;FRIA28;;ajKnU~5GkO?^$?4=CSLvdIwv=nlf zCPX0~AkLX3vc!3pAd*gdFUwjS&u=M+T-$d1 zw6RpYZ8(Bbk+SpUl?u#oJ$U07{KmH4`hC9oi&C^S7Q5|LJ+&i_31+KRinUjlCW?0; z4%}6Wj%U7cj`^h^KWRqB<8nv2+V=I<;EHcns(Z|o&Xg%uvIUpJ!ZlEs5gc3y3Vc9g zY!Q^>l8JY@Uns68Yi>%Ki)~kq;9Bag0y*iHY;kCrNNGC(j1$Ysc{l_!ZuIF6?X&I( ztu@xgTvAT-vQktelhZGSAx{;N}WpTqNkjTg-v!Q)L+k1|Vn{RJ^m{#2^qH`5B z;k*j!8YYY=l2S^yfW@=?5_mQX4g~XMxSghvv}e^1>6b+;%X6x}+%7cxdvH#r5Hz&% zJaYaCssslp@-XH6CZ|jj$dg-Ox5Hl$UxHxjoqP*$p-remm@JfjeUlxZYs-NX&u zJyJo$27IX4yMB^ygPUhf9aW|$mV#OsGZn@bD&j~gW0e<)&m~s?h7a2#1t#IuE7hpV zn{xSZsItt>8d2SC{NbtOOkcpQQNXt_q{ri9xyc0Ja%FKjeXZ>_1ua!uzkFV=aec+M zquiTX^+_eS;%&|(nwD@_x=4(nl58JP$O7le3Z5V@TjONfTA!vL+eqv;0pPa^MMSt# zT*wa5q)`bI!SeaMO!62w_t-Wfs*(bd1+KPK@R{)h4N^wu|f|92$T2PUX;v*g^ z>Ld<;d0C0hh*|90k{X(r?o{;g)GauupoUv~aT5MG@g=9JV}*pP9x=HLGl>E3q`9%Y z0)EMqYKkdYX{_FRd{E!*iwrjCBQ*TDtw@`X29ia1nir6U981E=JB7d`ipun8_Ezts z+ct^dg2N?bGE@EIx6LVrQmv9ID3MXPzZJs7JxMt@b%Na%+7s>#%(Gi+p}9{jGMTEb z(!!TzWLYK-kxP|s{8}KYrO}8kFb?}>+ly=3C@(wfcU!h?mZ`)OLnY#W5(?#zDkLc+ zJ{?3vdAUYGByv*0PMGNBV5l9t*7;S(!8)}S8($~AUL%lK(9G#Zk*pOSlW7>DhO>@~hoi^mRIKisnQ%F{lqBp_#h$k{5#w1C*FLTe# zR03K}Q$uK=xNb^~!?!QCd8%TddbwhrnyNdUH#B0yfqq=L#uzDXOs+YCNQ=2Ti3Y(- zg=OjsT**yJ8lYV65z)ssOBi@dSA}=%#ep2h9Ah{DV2W2r(p$k-B^Hxvg1Pidd{l2b z&D}L!vi|^K+!TLyTAbggY1*Pdz)L7tDzFQl>K0WzfB_XiRb8a$p7iLx>bG9DzWl7I zhU06fq-s$N2~$N;AatiuKL%G}AdGn25OT^pE=V^>qOx8tTat&T6Hr)pWniOf-MaLCoAN1bAOEWa29l)TwQ>YVDbeb#1?x~)5>mFF=GFoY;s)e|YHFY5w z&K6t(+|}E#3+gm8sa;U9O$-(aYjv)+j=JUmo~LI&!_`I?i+C>198M31=5+wDSATZ1j-46j3~Qf=F0I@|*+Z^AVmvW)vxNPc;@6=gtc3X9^Dr;c2Q_m2c!;?8=<2+$sgM|PA zkrDEq#NyM(6X&MLdF4F31`=D9MAbgtvTnNu!0E2<+ca|4R~4zFy4n~~RzV!8PsUVb z$(J$7Cl>I*Z!jouHPF2l**#3!Z@A*$ms>?$Rn)u`e|FTz6$8<)i4cN5V5*4(rcMgE z9uJ!=&8k;#?jD%+Q*G7m3mjDpw(2EYqdX68s)pRH+N4w^StVm;9wLI=OQ|T}>CRjI zZp7Sn?ZdY>+l`sHZ7FcD&0QI-riwR1@hdA3U8+_=C{yGGQM(eQHQ&_5Gnvt2zQ65Y zidc(_$}3>$y~M|Ty=|+Eo95#|BotJ2H@d`v)A7YbX-OPP?cyW|%OtPNuPB6Shmm2I zMq%nbv#6=IcTU~0MQy$bDXugS*=XvhYFxy4O%p->WUSnxIm+WXM9(b?-+K?K`?}VK z>D7^H+m`vrvE1dgMQWg=r)MaV0XbM@=CWtRjh1gQAihHDZ`~b9vh13B^*ozqX{}dk zigR>^?5iAvy6}g?gO~Aqr?^IDELadp8dKxcwmq#O#Qae;(C*F?O@B?c{{T!c)H{Q0 z>>EYSf~I=P3#~&__|voz$Kt_mh_CScGm^4S!CAP3FOh-@r=@k5OXXe0-qe#+a*DAi z=%cNvcammB4-$M~fkbXyj836=AUO5Im7{&#Zu?r%wkYgB5x8Kjnx<$X%#Lb?JXOs= zhmmO;0a&a501qC+11ma()eXZ9RB%~o=B2gMI>l7RoYup~A)Qi23?*a7CN5zSh8Po_ zW`(-;NDG_rI81SdvgJ$A?rYB0WuV&oa_6^^D%ZwqPUX1L)5jrhGX;!PGDjdMk&RS_ z3<`!;T{6{mlc`Z{y8W@aY+Ha?XzM4SsJYZZHyX*j_)$^e#$6grapX=2PjRTdJL?Bm zx@EW5ZQr_GW~_{>Nh}9(M-|>`xqkuiJVC-gFn$sTEy;lF!;eF3&Y;`wTN(}bYucB~ zba2b}QwpfrJopkM)3i#c<&Ft-57>_}CmP$R)IKsC_<;x`iIQQiHn{fbw6<(^TD|qS zEVs(qBX6aaNhxciM=gxcc^#v1f|3A#hQpaSD&Mt!&UF^Mp*G#gxoEy7mKI6Y zj&zyhatboW7DL3w%Gu%^;ry9QoAZ3`&Z*xvrPdvXX0yRRp~SB^-dmmv0vbvmV15z9rtHc5l-q z9^QDVuFol^uYkc;k>%XTts|&0ger1W6&^rIKD5owru|EHsiLU+s?%nf+FESO2>6sj ztuqi%JcI_xA;8Jvo^IM5BlR0hWLI@3Y*r*&E)gwlo;!67Ej2wwAd+{Z4yVhJkq6}p0uB!MdFk|mYVJggQ(0pw;JiO*n3$sVmz?ph0c zlG0iB{l+2Xu=wH^<{Q&Hf9DRAnlir68a2a)Uvz!;|HvC>pmM{C|R*D9(yrJ72r zNH{FMdl?|(kxJc5txX=voDD>u%f8X6FFcCYP4 z*~GAXRXo(v$r4ls3{(KK<0lLNe0Kz6J+!w&Cas$u;GmKyPVfm=T@8I5HPW`*J@7d?(WOH|jGZ86$w7V~(Hz09#m6U|o3CIImoM`Dnm3E6Pu z00`shsz$?Ee5$icc#b{AJ#9gXFA}C?3bg2pDf5(WM1vR#pueyOzK+3Dd%xDx+$kOH zRp4 zJj$$`#C%*yBCB>%4o@1c=MPXX7pi@~LX{6FUKW{ZDBzZ9SxaJB;Z)&4 zBpRB}xucHTwKx6V;Pnvy01iqvwzL$`tIipwAg_Ypmn4-3vB2{kHQwgJ`U!1sn{aMd zMoA{js}$Rpb6o7ywDc6N=}Ajb1dSIIn3+O}WQCXpR9L`lf*65~Rb4^r3(vW1Nz)58 z()Uw-td6GPT{0Ae;dw_DH^p#yBnOkTfB?W%EC3+Ii>LQ(qgzd7q21eh*Ub>+Syl7MHeC-zcK7-P_l!wo5xs?@4Zw2;}&x*r1xRsUqYN zgO^l^yK~Puc`Gr)GL3KBk&dTrC0z1PAB4fUx$wkn12Y$PIU1LA-`73Q zYlZA~DEt>RuT68VwnV&|Zx_T$X=4zhG2o-V6BuKHF|ATYI$`lLk7BK^bDgxh$D+?{ zbe^6_MHOV<*}6*vlh1beS*hM~io_&k#A_*8mp)*_y0VW|eOR|{p04Jy)7Cvrs%wP| z)Rn#nwNp?EdNC(7iIf2BycQ9}oE#u5#q*|Xe&&;EI@qrFh^wxYmai4*;*hy|^*l$8 zP_aG|F>egG@_>B0m8q2{1tID1pWGPU2xeOUYD{DHvi&Ilu6{dm-B)3@V zlMis3RcETfau1BL_^LY|DoJnd^g77O+I(4YF$}5(pzITn`i4Zp#W&pHs z@+F9n`teXeb}2shcidZZb5v7pm=fJol=asel{do)49ianJvfFq+CtH|B)=ZOxDDx~ zANgCj-5dKwCf2vx?w2UxO5=8JGt`1hv?i69g<{!MZ{es6Pafdu%z}AY)QID{k8=Uo z;;r4eUrn=mbuQ(%(tYtPRCMveh{6~oWjShuECM2h4#CTFC76~afD5*+rR{y$BHkZi z)!Qkhj!11+`<>~YE2Th8OtM2dAq$i5_=@21z&e>w`*!hXsIg6VyH{6CYU=4}>hNA+ z5CT+amDoYR1I5+V7c0yFZ~|@}+hy7tW^2`>Z9{p#{1h_T?UgqLmY!N^7&Hbc6of*F z#5eHNoc=Zkkn59y0Qy+N9Q-a@ng8|3!S%Z!D2F0Ro2g2XNnry_+U^AK^SCk z(eaUdSwK$2D&XYI+#8c=?ERM>=&;`)6JKZ&c_g>^%q#%=tl9 zU^7{+%IjZJ_kV}H?f2_#nzGXGB_qR3BZX(dks_XHGZ&PqvZQ>NMtK~b>m64cOJP%3 zW3Ri_uHmJU+ita2*^z1DmYtSYlt{zI1I)ZQkLL&QjDfS*;*t5NCN#}O(Clvq%m__j52?UCn9%1;ktA1E1_ny=RdTDXI4Z&S3)eu{+G?d1j z4w*%ve4Q$M(v`SvaX5Zo{r&gNb9GDJc#2mMIer) zBP`%CScjk`y)-W|HJ2Vg!XU>2H!ZspVABt|6MNmLWUIE*iS4%OZy`+#5Y5U5ge609 zDpn=rBXuf)Ng!uVx2tHWisO8Zv&S?7NGqr$nyTS6>{1xwpURMxAo7hP%X+bFjaeO5r<_usg5MN2 zacO!;soI_tnnoZ6XiP(j88PNp3=|M@x$ms+V_jZsa++)v%{HymzpS@8Y)7Zx*}b1> zt~EEik-E{;)HjIioaJejXOs*KKof~0f`Neg=xC}sbu!Ukme!3;H6qDTAf$}WDcV9F zS>Tj8Zedt~&4^TPK7bT@t&z2Nh1+!PC^qfB$GNDM)jQtmrmD5l+%7Jv$|QPrF}%)L zFpWwKzDQznd^>M;Q(S7gfl0Pvq?T%CwN^(VuSz+gjnxTh-wam~o+`1IK4&DZ0cNS~ z!2-X3nikntF8=_uT%uaL?V`nKuKTCMmXxh45Ar7D2?&xFd@7?5fl1Hd&QvX4ua$MC zwrWaxx=19XhLM9(%J)lq2{FZGUa81qlwyBWBV)*Q(uM>Aj|n_paQeud1k)N(x$pS!$?iCK8l9 znovw?BS9fkA_rWRYz(NehDO|YC--4hn1~L|Cu@CX*QnVP3rkt?W|4T(R8`8TwT%pf zc2l~J%sKFhCRwB0FeHv5#@ScvLnro1%ER+2-_+1N!Hi8)Hc zlX#rb{KEj@b6{=DMXPY!mvo+8()+C9GE}q{}ljjJ{C7pbiwsNpHeVM^r}k z4aXcc`;@%}MMK2&_Ub5TfneXmQzbl*DaZ|j&5n659D)J1GRk))QIMBYdn)d)qL%t; zrMFqE7b`V;c(oLlD~!`jVwaSU43R@4w2}}U4EgZf{Hc&epMbjT*qYf}4MyMhC(p1Lrck_dDYo`&dwEZ*>)jCvtMb7>ujQZm3WzqG6se*5>nUE!;svgW6zXi z;D}^JW0Kh!Ia99NRhFvQrlX*{O4O{?Nb)r9^VG1!ki#4)5|=z99%n@vag*-3T=7&9 zM^DR=aayf|d8d-+XO@z-vR3fxuP{u)dE<{UNhIya)VOwBmsL~+(ISs0IbQ5n>zxg% z=UaBCv82!7MOQ7|s60aI$B07jEktXDY%>B?SIoGmd)m){dik_X?vXUra zhFg53u~Flp%7Q~AgOh+AfnY!&btc%h*(o7{=L|GL?u|=bSx<0LTUj}Tgv603Sp2yP z?GV?e3}huOp=GQDD7JcfC#J1yj*e)4@wYMGM9ONATFx&&wdF zlfp(hC5R_c+wCP5<*TBzPqQnM*AsYB)7g}L-&BfNcp@0Th?$ED2_!2i;xma1-lYAT zCB9S3a<|moCsiW4N(tUeZJ}Qn@n(<%J!HNc475T=>_&XU6?XHq-a0d6x$WzPhMjJe zXe#NWr?wkxP|+X^&nb3lnb48NRn?z4EUVdDq3p5C7ywy6lE?Y|7eejMt@MUX?P|6b ztEv>y&M0e*pwb8^yao##(6GeCRrs@Z7>$X~ER!^p7Hg%71+ZOKy4_z;Vz_=-q*V2F^T~BcQER>;pb;>c5QQkXZU|Ih2Ftri%Mp4Mi|zjPd$v=}bFR2; z`dafOHPkgt32Ki-50x@F0Ri%sR1GExIL5sjqj~O#?XXu1&AtnzBt&j1a%E(dqb=Y` z6*P@B3a$$BJd}hOVc!XR)LyUGdRrq}VwTNDl^=Lr3%k?PI(a-tbt>wZh<0fVVfc(Q zYDV4J0+ZScc{ZCjM4JIiWhMMZp$>VVEDU_EEm>FZ?R`mkGEv;@eO*LHfYgZIC^%F+LSTZ*#-CUO>MavKCi~<@>qUM%cgkoR2ZkG9y zDi~;*IcgGiG4qVd^FZf0qS0H{;JDUF9cBJ0BV$b;ha1Xal&ocuejy}|IZBk| zK_QfI&KK8D9Y4M`#(Fp|8-`N~OW~-eo=B=%R_=T`03otR9z!?;AMn>I7>NDg|Kb8yo?~NOn-| zOCH8)rb{Kx&2O_>=8C!NscKwLTPi7Y9I`w}6-xy`p_zyQc&=M8usYE@m~$2l49#An6V&?_T(1>BIBU8Txl)|K|bKPK^4L; z!DggpNI5a^$bpxUT$O&za0e{=YIjjAbendb-?cB1+T@mwAM#+PNX=DiF zW$?i{D7-wx6Nap=Q*H_?c)Q+hGf~>)M4GCdt7C>5x{R+A9MZ9NoB$uQ222$NSGI~x zKejwdKo$2({{Z6|7P@lBXr%kD-D|d9B1q~ZG|Lcy%v5qcm53Ut zH_qv+qNayzZSB)F=ex~EH8j%Y#Ir(`5wZc@SOsY#I4g+A@2;Hsso|}- zu2yZ4xN@pKfb^kyZ&N)a_gOBt>V%HZOY7*!bYzoiaW7xUBS4w zZ8p){(N*mZq~0oPrltzj!D*}Osw$ragwAMWh8T|=C}~?K1CSl_4m-`}!MX(&#)bs9 zQd|r&y2}8hu}3n4Eo0)TXO)~V#LRgT*y6rYYR%

JGI!<-BZnJKU64!An?`RS`mB;5-*_Wmw)pmQ3c}2}*5V<9YK<gBm8Ooo+PKwubGQ$eZ0Cpg< zj_RyP85~I^>pD}iBAqRKsew_>XzQVcB=JBh$gJS<10-*+0@bk>7dl0{Vbjn5}BMjfBR3Qq#OnU8fR)6f7kr%Q5&;@YJqg1NvvoI-n^ z;FHI>$1eW>_Y7UvICj;p;a_XC?Omt@l}eP=6NQPJ!aPePj0jRoH>eznD|X3IT2bG4QUudFsOo0B#vWam+_UO$2J)`DnNV^aCHWfUSBWK5Ri6is%^nu-ldNTk^=>RX`A4^YBi9;}TXdb~G|@wHiXRl0foYkeS1ed545uBtW41uS&NXY= zq_f$0QC8AWZh9)Xr1&@_w;Q34ThS=UnsxN{&qEv>XcBYP2YFK!(63v`B^AI=_ z>ztF^3$)ugnEgU6-vu_=ecg7)li{uRYFSJU8dRYw3MdXslD&eek~^sbC(}9ucl*+! zIVdXHpi;u#D2=2}3P)z_NEz*dG3+}G4LaMOVaIEshSz_DR?k){7AWYXgON8-EZc7zp1)C*`5W_vR8(2sG05ST7 zHy=cz`!c5CP?OZz?i17rqKYpXFr{S(jDb<{f#I}x^c)J0!>9skYRg?sY!xo_)lL#= zRpALM^W(sVK4Hm*Km>R1>!*F^Q);@?QQT7H9J5tbLs4*~JWACfV1mmUAOsY^QNW_f z$GU>rN3CibrM)OG7Mq<#I?dw20@So%GddnjK*GKw0f^*D3+w;@S*KvLIr^dwEj%P` z)j?&y*43qL#-a+(g%nZAQtI)l1J41M@B@xr`wutQ6@99<;Z?b7E!UMPO+_(Dqh0|L zHDY*ZEF^2u6%} zo+daT!r+tuV1i2E0txN;>s=-LZ_wN%pxkxS#Ue;!L|Sa|WH{~|jARp>kEqs~3fXDu zDQn)TJUTTzlO37WbIgzq8}bJ^cd_^dk1&;fuw6 zuXCzZntUx3a#Jq^kmn(X9$n5s4eQ+Y^)f9#eAmS^H@X>w^OEf&I;oatK2|t6a!Edi z1h;=vq4ZSt>(=9H%B{ZirZMAF)EQ(`BB4HPcjcc_ax;eSqXL>*?gw>FIR(AZtBnHK z-RDzDa-b?2T2B!&OBCrBL|F8AP!(QFw8(74MwCr+kjx zhtJa*AH0!nHkj?xRH{t1D^ol&R5KExUkev3uv{@XX3kGx@2M8*@l9o?f`YANrHUCO zlraoSDahhZJl(x84{u)JX&ZM&4}ag}kABxF)i(9GP*zlmidjJZjH1wV`<_M~qI#Q|&4rNix4%qbd#&PNj*!Lx-j+rWICzg2- zEGLQtC`rRG?n4hYJA>#wk8C$C!ny7$nrp40Vz!Ya(kmoQ;z&HL&2Vws50w}`UqhW! z96Zp?fJZ2|kO6OHeeWwAH)}+jt7buHh6+k^HPPj*601frf>7Xb;u{(MnAa$EBVnfB z6!*J)lAP_t1v#+#V?NuKOcA%b?Tz&~-C`k78*S3RI4yB>dy4RkT7s7VDD5()3A5BVz zjIxFc>OID`LW`9@``rQktX!k>#N^7{K~fhvdyH5^=`U_l-K0DXN?K(b`|5;8R^YB!`~;pD_y zBk8T|^!^g}86*IG^P;*`0HnSk;N=`+UIZU3=&f`dU!DP0>`3-Hi{SB-1bTPxq8Z8> z&J=MAFMM`7+fM;??XIt4(kO0FtBet&4@>aND01Wmdb{hM`c)^SSKpnNT6lGM-G4G9h zLjtlzgX}@o45Pr|L}-hXlaFKHUWGU#+vlzG#BfTSAC^6JigITo2e+=63ZfRH%~w3I zG3l)@A3rub`sz!sZYLP`&a}$Pg9FQ++4*RRr72_OL5%zN@2CK;Kv2IGb(|QaL-RWN zs;m#;#oXr^)L#sYwCBIBG>Ig<1jaV9w3C+iA3pxN_lA7F_||+fdk=ot)<}mScki5c z)^ytoTA?Gdj1SjaqlXy4Kb|$dGztJC^E%8&pJvbW)mo+OYN`of2O*EkUZBGs+Srk^ zCuPnCya;*c-{qYZT7hmz7lD!{ZxDAYjd{*VM;3BackiijP}C(eRmcF0I8lS#oa@OT z5`F+w=L8&MSHg=zc#c9Rrgb8sm1Kv;hw;XI;GKKriAs!e&#%i^!pyP_GW@YFfs;0}x0bKKa&DP>4vC3GmqEb+#DTrbsv)wRWZYs4R?JcE`Rokc_Fw z?Tt&8FAR)i{E5~k5`3iox|iKpTY*aIegFYF`H%X4U(ZpUNnqdrM{dW^>nPNQ9DPT= zq)8h{h5K^;ZCDhcIYp>Qy%?dCfiz2npO+KZb`AYI>wQ^9jb$q&HLxBtp*dL>J(v;w ze|-X^mZF+Ya5gymdlB{1l@&!b^43zVLNz`FPO;~SKA_|IexAcRql55N+>eUE;HA2% zOe3BrmCs?08TP>K>-GMc1w9vl@)e1)4jB)x^g1G`Q$bqR=i-8IFke95BBvdJ(aU`u zHsX$0D(WJFz6LyIX?UxTKp11cznBkh{<+ZuNC+e(x~LRJtq{teQ>{=!IUK1Zp2tQj z?Xyr;H8o5;54g@jAKnMtYeW>~J2&EE*ypyL8N4MQMT{{Lp%|R^$J1Kg1tdIqA2IdR z$6pKvC_!GwUpNY$BI76VY1c?bR2C@|Ts;eS)^J7+TNxPabFV5OX$qeFK+or`^vV_v zEV;%}?oP0oSVW-wvIeItY*CTa;qfWfIqYMlI`sk4SRA8ha z{q-J5$z$v5>8Y|X1h0O;ep=L3o<#$`g%f#Lq#1t42iRv@pjkpmfIlKNAkoN)9Y-Kh z^W1mA`D-B`@LP%kbEuk!nqZRWi70!6skD)DlaHWneG(D^KhL&Kq*JdJC}RU1^=i~n z27E-%<@D5Okd|OU&Zjd4Z^)k6)+R1Z;%7a(_S8{fNh>VrgOQ@~a!FaxknQ!*s&xw> z!OwqRmWp~X<=-PsZbnozw#e>OyD>eoN67wK(Z%@W6Wn$>-{Gq_4rI14S3maaS^}(N zC%?CBXvS5F3rH&}fhi$@{SLf%_~g03A1_^HAZX;}++=sj$=Ax?!X%OiK8IFtrz^+@ zqjUB40O^(L=D6ELD4bdz%2XVY>*{;yTp&VRmo5k+zkL$7R7nL=%1JzlWqabDeIAm`_R`C0V#GOCw=``SJPu{(98$`2h~D zzf5QK)0pAeERR*3U67)l@n%f;vpG;9T>AI))|llh46p|&)YP>%2R{uNVmr1najo|2J!RH^hlvU* z0`DXFR4#B%PNyW%P&GB4-dW7*v~u-#gtrho8}VxFBpSY%ClrJEq$%ijwlVU zj*T8yA-sZS!uJG`j0W`po}kwpnl z5PuD_(uE{>e;av@F~|L`BZ+z4>%!~CLkG+CRpm5MLvpRY+~Q?>bPUw=#dG1Y$V~eK zoRRXzk?Pu7`3+HLmO~*f&)?MNR#HIUV((W^uBk)Iij?W{tR$ z8*yTXAmws9>lj!@@kN~Yo>C9bInf$Q1@S-1BA7h$gh%uQ@Fhku>yo-34L^@t1R?kn zA#O*|05X3+OX8|-5IBb zo^6$Nt!N->h$?B;Hz&@j!TdpwLOU<-q-nfZ>$reJgY0z3rF(tSLR^ut-te^fYQ53b z$h^ZOtURL`2eNPtz@oQGN@OSEVcoq*{IwOM!SwHqB&-Bq5qsbW^$~DBN@Szoxz@2Vv>+&ZHQ;gsvDLZ*i?$NImnY6v4{XjCu@f z#w3o~&HXzM`*r6W3}fq^OH_SUD4_Y9(^(uGon!_FAD**i7~%(;InJw-lM}=f7u)g)Me;5I~9H@&gXz+wva0zPUcSPH8+vDhcAF zwzYZN)Q~ajq_|%wg|BKV>MLhyrfOLO_SFGd z2-}lu6&PdRxYx(jC_3LAF(Z*3&$v33NkY>};i$)KvmV$VJwiZM4e+8OOy`0UNbYg3 zN+fv_I49&gpRdzJd^pv(#-&vM04O6uYa)2%@ktmb9sRVUAt|ANEF^LU6Civ1^{s;i z;yrzJy{6 zo#TqD!)81f=Off<%#@5Jxt@w$Ew-Yt6{m&Vk6tQHH9oUz)!Q*0RIv#pUIXDA9 zKYz$+=WbN(t*=Uz7YWTq7)*f#Y$S1<5JqyNw_iK?pDafmx% zBTVGyIV6%#c|niYh*$BV734`B>QV% zNEy61iz)AdPILL|DN!O(6MEw(zI)?B=g`8iJyS;ClCI%wuaG&ahLSW&<#<+43Ynd8 zG+FMfvT^Lbx%qM$k+^J-v5#=ADlA4b6!5f!@pgom{{TNJR?aYReSHF@y1u60QypC# zz8sO9sm4d@2>$>c+A%?Orb~?**D0Eg21amHF;qTQTz@tJAbaDtu*Pc5l-BWt66J1^ zj}ohRl43rZQk}Q)i&DdXqd_-qY=Bj1r&b~ z%!PYk5=#3B$Dz)ts+(j~VJfL>BdUf%!-za&0Aulw*zcteCWoAulF#l6_k^ z_c=NpF9xMZkp@+daqLh2_xfr8sO4$5mol_C2gO3Y!2bZ$&uwUUOfuodFmO+?)=AD6 zR~g9j4*m5y=$zducoj)klAitha6Gju|EF#j`b0} z6cIE_m64ew2Mkrel>G;&{Lj+_Z8X-#txvusWTXTc2NT?61DtmN0#9!Jv^KhkQ@gBE zB&dX8)6o2mef0(uD@<@BTdL$Tagr&cD!u%`hRFRe4u>PjO*%4rk=qy=n-jMORVRy; zECzhUeE$G*`|DLiYS8(VlCA5W+O!sm!XGIj9^{-KZsQutm`5u7B%ozvVlaCH*n)mz z)M_;p>n#(bE*G~F55A^QQ>4o58-tP~&U+83{+gj^GHXOcO&y3nEGjg*<(m&qA)UiL6DP^k)J@N zPxa6B)mo~wx-9im!YAR$1DMF=++)-C?~lmqbpgE_&+>Hh$| z)14)+?@1~nw$VnUNi9YrQGl!;DoZguSAoa4B;=mj`hBrGgj!T-nor`ZGJ(XeuWaM- zdS}-fTci!;7-H2_)hR}jR7hT6fG;8VN3VaD2BvMgDQ-1S;Dwihkj@h-%ba8nOyrNy zYkjw5UN6ILP^9 z*VA0-wJmRy8!JR{IOOoP?dt?9QA;994H%n@ydy5;p7;to;A7VZ)6-9sQ&Vl&Yi6L8 zsZw@Vn~bmT>=YcIOk+PSdF@uGs7MD3d~73ttIfgG553lPj_ow_^8O;U zq^}P^NbjFfgZ>`iDYj1X-Vq6sj#E!iNLlK5#;42WC|Cj5dSDViJze`>p?8aFU9Wcy zt5GF<5f?!OLa8AD_aZp+nLYhIef{*uV6;;#0mZ_aTa6$xPsy9RWPlec$ixuDfO!rl zOM9k^8g}Q@r!pY%{X)6^pP&~?%cVWy;d`c^!#*GJ=Vy&u*cKQA2a(D5)8|k6WetXc zqK4?Srei7arx{@ik@#`Ti8;yi_VxD`JoGS0T{WtbuA-ix#gwOnG;#nyD#hF(LQlCK zpFdp`UAIkD5UE;9>YC^$SS6M!ggm7H5{CszATYq}4}51D%{HUN$N|~Ef@FGVn(Jvv zi(rBpSE;qdYNEQDfb-M{6nK=_L55%yyAB5gl04p>v!+{1TCEH4be;`lRg2+C;>8)@ zyhvgfION13Y=Sa9^^HxfYH7uMdv;n%LK;*NtaS|0sU))?<&5_1**(c107iq+&30?* z(a>0>xFt+JH7z|P21>K|_^Aqq0Fm5beL>E%8N5jL3Ed{ulA9@Swwh5(Jn%^+ML7`) zs>;&s$o2}{jt_CmIM42NoO_g8C7NnVC>o-IZGG=3dE8d1xXn9IqjfzHtV`k zNY}|}?e#2YmRKJ=yhZG&z>nek4B(mkWZUCHCoLj?<@-*!j8)XNOtc2UO>3?-nAV3_d$V9Jc-Z(?M>H3x$5@ano?>ml2Js9TNN-M69Y{gidk|=>`pxaJ(~3J>t~QP z@1fkD$R81CQoi}#)HM*JV zN0bmr?`d>yjqZu=+%Q2^BP7$0>Iy#0~ z`*KT6*2;)ri7qtIyEI-bK}iutz0t74iBR3!u=Um7_GqZw)(wHRtT(!Q#gyAFmpX~e zkqF#HF{bV30Izr$j@|Rv_tx(h5xNM&UzU-6xmYxoBzED=uEXh_9pht-x;~DvP@2ovQ;YP~UvbZXJZ4H9`MNw_O+V1}V!#9kdL06%-4gWbR@@tL&0Hsp32%y>WAN!qMb1ab1hy5p{L2qflcqWs>TArj z7VF)nve+asgK(iWt1%?@M)5p2{#fvvA74!@Uhlh}dPr-noie*!_YJ$nh{p{DTygjq zVIYhuh)a1#4oi%c?ldCzg4JYOO{XukaznhjEi~3isA^}4;jfaOXvZgsMkL~-pEC2o zDtx`jCmQ39nO-R&xz$*!>S^g|uC%`p3$KV;dSJbqiXLoGW4Ok9oSxe2st4WMn$2;u zKTr1^sMOmYi-p$C<<;BN#>>e;$MXVv`V+1vt%^;&4(R5@&{h?=#?Ga@%F(=TO8R;K z01+AXBOQlg7Z>?lDRX3I+^eg3ABWo%yMmglEM5p6jb)ArGdWHUfmG!~00AUp0D3V8 zeQk=Wn{3r@8kDE2HpoH#8>l>k9ytUaN<7TU1`4ZxbdZa+FE@SjwrVJ1y2&h-xgiwx z!32pkv9VT%guIFW{{}&R5w(HTa_zQRQO>~M1TipL&clL4&ab8m1E`kXOJOfmWeCay;4y< zSBkOlr{fyqnFI{y1bDs6{uAllKm@ecxvaFbHC8%$>s!qWLdz4aM63~qh6&4}u^_0y z9^*LHaRage8Ddg5kdg*@2JTONOd<_UJ6~&U+g*~k zZ0)OB(NJ9Dk}Hi|)bLETa{^gbRFyCXFGfYk$RoBh%spYSUAk9&slE`TfIVqV)PZJ{tluXzoiT-rPeTQuzeW*HV zZIak8??xwqqmr4{I#l5K9$sDBiALgifsBLbPDF^&B%^S!09^0W`g;4-0JR#4_XLy0 z8$?Yrc&43r6e#@HFB+-9<)1(@duwG5$F@#t=WD?GvhHV!s$)&gNW%cb#1biXAfY6I zlj)Fgpj#T*yY}@hRbJSkig~PvXDDfzWu6rwnljCvL(D@2&I;!^?kvrvyR2PBwO!zv ziR}#>vNFkTxm7@EWa3!LilYx81hG~j8^bsVd1RhQIN?UubswgCAlS|g(Q7R4sXCc_BQgAZfW(onQ-?iq^7UK(-?6*27 zZ+9Bo{?@Lo@W06@-nuXIXcjk(BQh}X9yEM|&kDH681q=x8%E)p>s5ZaO+yVeT{T5A zLo%eox>PJnNU{+amnz)c;FSZ21feiD{?e0d?V4L<4JX7*wyG+}N~$V(!o&nFWKTmF zEM>_k`A1bJ7&=|s8@4K`8jj_;BZ@W=EEQrn%|b0YPO+*mZUs~_55$TW1C9a7zMk6% z+A9S{-IVopt-C5|>0_^&=RGlqy&62+U}*BN)H@fCvw6WDfiQ9D2YT(xZ6&RD6%1AW z0?(OactfHq0B|^xr;9JB03Kb3Y-z`E-1j}#VyK|mR{3q!mzk@m>XtDn6^}}&)S@{s z_>cr3t8w#rRInIe-1OU$*JTvfT6w9>;+f>BwbV%MJPM9v92`rY3(SB(410!F3yogm zg?mC5(Y@6B%W~9GULu|C6x4CoRlx$u;kyDAq>eXW!JRU2G702I9FeOxa%_4FFNwJ} zRqS4@HA|=8*Cwk%9jJImB=+8+n1_k(L#wTg2^F~MjHbp31633jaN9lw0V6rDfZQq~(RCZ?L- zPUnxq@e1s*c#?R`1C;*&Q?_t$M{Vt)Xs@l6TDqP(dWz|;6w^r;gGo;ej!TmSe3mxO zdmJcG0=U4!9N|XzQLP~1eQ1B|Ys+fdRg%_I*7#{aB2O2>s)#R$3j!Yn85x~MI}^l( zCrnpqZk1LjUa_sUf|STBVPD~wW^m!!OdewZs;B{oB!4IczR=r#*%Ya7yrtAdZun%k zJR(CJiu|XY)xZi_q>Vu0JfNv0d2|}Jn_m`tUZg$f4- z0ZvCGNlBvMXPD~>z^E>xf+lHtmC86#D8 z=)L?d#5bw0%$HeYPYQxsMlCvpjB;kr7|3%klZaq>XYhs>l=K%Sr>do!bCsGp2dbs2 zs*RQWMwK#JNSO&js)r*ad3zGNqB^}%zP8<_y7ftHrLCf=SYxP`>j#THG?8FDY84X- zuF@+fpyY6%b{xsHVtL1u5LURQ0x}A)`gOY~sO)iEE^=LDr=FNoV&1FbEP;%%i2LDG z$P~Eb0}@yf+!xyIm2tCJ?t826*Px#5#z^hVu(7E@76P~=hj30o#z{r=J&!eX>+Ki) zp4;>dHp#h3YK9pjoh@M`lvJVv;vz`uIIA3m!R)LE{3Tv49ecR-YD=5+SEL)38=X{< zO9Iu|DOQE&RtqR@G6K*1vyp3dpNR%&*9QB&{BM#`QJGDh@qnz^HCKo3rm%OFzOP~KC-1<7Y5 zogCDMvr%pf6xR*E4ZY%yJH1U~nWw2q7z&C!<${k5jza=_{IoLv0K7iZ zJuKODmfJD4?n>%Ag4jI=e!TPxdT&bGj^MS?*V}E|j(51zz0bp@Ga+t3sbj?D ziyTHsB#z#}+RbJzbvLY=p{_StUkF>4TU#{~h=gt7j`4*o4<>QnDhVW=J4atz z1=8eas9KmJscEB@DN2dAk?I6%Tc6+|*VGqo~OG@Xk1m@YAZ0mvU#7y#!|;;vYl-%ne&=nU{l zRG$(*liCKg2Va&wka!3^;a>X%Rh2fj4{LjL^!40n&%{F!GkJo7$tE&a0IpB?>cQFdb6cf`s<|rUuC~)f zPAU9IE}pn+qYs* zxVNRjcLj~A-kLjbq>3a_o5c* z!M1j_>wj6RuX{3U^}lsuj{9edtH2_pDm^_^1Df%2rH3r{3fcTe6ZZwbs9P?U^Sr9- zZu`=Q3T`!VRKT?m#&`u|NH@_T!_PFxI+Bs$-^GdX|ygC!foMDLM1<_U@-zx8G51 zwO0EzH{DnH>8s5}OzjP(p_-ZmS12UL2yS5)88`>)*dEZ`DY>l|Et>_V=9L`R;A>-9 zVo2Od?dDgDE_e(AWWeR0mSl;Ii8G?QKn6*r~V1d@faYF(NHaRa`Rjk&%$|^OCq7)B<@5?%~tx z^{yzMOU)i+&o-TyOG7h9g`rHsufjZnWZ=LB;DJkdFT zy}@iSBn@(#Cb8b^W9qci0Lzng1wpL5*AMLsw*eavwX@f><W~QGtPsfq+2nNt=87NyQBu+eSJG=8m=?(A{A18KN%4xqmA6T!1)} zl?&)|t!G;ka$FKjWjt;D#deNrX-iVIeLB>{{1qx9sftc6%CS43;Fw=SmF%INPD(c9 z-Zxt{1gmk{^mO$0>D16jNCH$|As$iU<)6edFB2ahAi=@OT)K6(x8b9=Q7ly~>mDkq zSsx?K0Bk;fgcO+xKER&p**psX}j~Uan z7O>g)B4l0B3!hhQRku%wq_w3mDAAZ+mPo)n3KmTHNjW57d!Nri;N8>8=}AR#shX%r z94oR$;{&q$b_3fQ8Efg(H)4?6cKuCsXy!gCO(dZSIPO(=<0IEUJsPU}F>X!EYZBa` zYi%7evr-wZuH>S~u?3DCJANksDy}@Ok}<524{UW8JOta=6pJM;;=5KQC5q2=sjB8# z;HQE{bRM}pMne1N(?lZKo5HQ8H8c^UCm9M<)Ph|I7pV8OI-l}S7>Mm|XP$jg909gXLEX)yjuQn=t-d{iuAn|Fe{te2mUBL}3 zK1zzXlwxX`7rq)}#o31>2P4YLa5Jp;M)Z>AZ8en_8NMC@=?hIx^2iE>PYq>%##jX` z-kwh3iO!GtewnAtKBZpc*=pLG8*5fpLj_;Q*3T5PBP5FEG6n=8yfMWY&tSa#$FRoEu!Hh>q{z24Kz4a3S2y;9iNe2C33Bh=y8?rtxLEmeK;*^=sERf7!x;bY&NbTPw z=T_MCZ8byegzgDm^HXbv`$X+%r?pz^>7Ht5nv|iM2Xl#|Nf;Sa1ji!4`PkzDK~SW) z#?Z%Kal25%K?0*JLW-R#YRHiTDhEDez)C?Ru2kn3?E>KT=dGe!U9|GI)5!wG5Rw#N zU5jzzTO5ZBV2lCt?g?I!&0o`rZ4&L8U+ol$$t#w8JaS+RpF+eBP|c4k5J~mY)@bg| z-?9rK0eTz!bXOYTxuj}bJhrJ|wnp+)#0l>#ZN#eb!X5)SV8fE*Ocb_CTAjUmuD(r6 za9TQgwSj)?s0EoJQyT-~_ERG|cjPjp5J#n2EVsIWKgRqr7)l9VNt22Q+X;peI9!Z& z?guS&FG(#MMup05dfFL;wAB$uG*W`D3}{M$#ds6QuRd7JXC9+0dD5RNcK%d^Io}n^ z8_na~5z|%CTTL{-641*KDv^{#V}gVXb_<+mAI;p1{c5WCsM?-cj6fjdBn(slM-WHQ zdLLap^=GG%bk0i^EOpUV3dBlt&XZ3VAKlmw1XdDdIW6 zv}jx^;T4pr1q3f8A}JA62b8`?X?S-+FbHoc&%Z4x{Z|qmjyAS}THh9>uDsS%HDq+f z;^g2!-Xp3h!B#)aGH^&41F_b-FW$RqwJmKuM7G+f9x+=Rs^U_)OfWwz)spr=_im*L8}e79(<~X;O7% zIB-JpjRJ%1f;(d)I&+TZhB)7DI90c4CaGAH(QRGHVzk+}1uedKY|!VN(tz+G10hs8 zmM0j%Bh%AMJDX)#_jQF)trfP`o?@V|W{73TM+Js?GO8R8PC$3Ybg5mp_g(FN@p@#Q z8)K|Q+iD|{GZ7h#j2x9=%NYQSkU-Ox)!f&Gp{;_Ru3LCl;A!V#(nd%upb&dD6AC_U z+vIuVOQNF_t-$)6e*Q_PWWt;mWu*mB6EBFKpiy}J!`fW@rEYL${& zb15Cp0RvHHqK-Bm7$*cfDeeIJYJ0+nPaiZd_4GRN(+;d3y7^D%tE8|LMxL9&B1OqP zv4QER6Hj=ZCJ*!&OF+#aM_}7gIPT-7VS7??8xjFRK4ge)koNGS@ zR?8Oc{{Rho!F^5+G4HG0SwU8z%Cg3+%%`{0-$LYyS*0QJzUMkGS11`&Ac5vOfgmj0 z*ylc^eDtTgcL}U*D4Y=q2pc~$ue>7U6Y3AHq^u>zaqq7jF!F(%X-d>$o^C2Wdf6OY zJwZA3!PfZU1mSy=@*2y-ZhR4Y`VpyB%7I|0yb1Rm#THWNh2WVKbO~Dl`4zd8T~bOs@9JUnSysC z<*Bjp3Sw0Oi5Mg2tOAm71`fU9#%!mU_Bx|#!uZ4|RwId*7$E!q0N<}+h#a{Y3+?sP z*P$o{Qb*YO{{W(OP;e~gTirx-yOa6loZaD9s@6O4{!T5XPQ+@2cFujjMPUVo9F=@__tb-hY!6Z~t*=hdKY&3}r@nQPDQ6&p zduL7pkP~ZDz!7;b;Um7bQ_D3hkmjm`NBvm_EFIov?fBMZ&=?u0=^6Dw=t7;M7FfNdWgBUzk0{hDmIxiWRSpCh&`4 zi64Q!UrjabqV?8_iV0R)g;X+_m2&9A`IP#O$GQB6eCUC$I7=e=N%d&LP`JXe_4U`L zp9M+ogR$?UcN;i?J}Qx(qLxF%F&r5mnbASe{VM;>kAyUVQ^={{0a44O@$kA$u zLWW>`q~ItqBxd>bGU`)d{FoGx+coOcf&)@Ubh&~eCM=jRr8?r~_i8+PwU+JGvJ7*eBxm@G9TpCj>=2_32 z-~gZw%D(3VTFaCcq{j#3=s0z4Uu+-lDFjiaLs< z_>xG+rgV!{JJd@j7IKI%p_rWed+X|Oe2jppQVQUn`o*Tz$piP@ty4hR8Mc+Q5s#?= zFR20B1#3! z<=2P@wtaK-{QWhv%Ep&C;bkGjfY6(!xR<@t#|=UF&go7CnwA&LhPG^4R*7!C6G z>`!d|TCTq4xIt^*nK-9{;zi_6J-z#SYpyI-+ZRskFihrZx#ETdiYjQ2CYX$P zYv#)_W9iuA&>u~CuM^c6qYY;+UV}*&P?w&`LwC_zDz~i+FM zDIgpUU>^9&=LK~oHl;r2nwpMz=_8_ojESH^?&Ohn2 zy#!J8+8Vjfe)n!DbRtl*A{=r97||H5%!ySR%M^kI%d~Br`ga)h_13rWB6$HH=NAd> zsWcU$3K?NCl7EzX65NygKqvJ4wA3g}veYcDJVq}c7govnYsZzSr4<3OA|PZZx#jcJ z>Zqeq^$JEj5~PpQP%B@>b&!GnY~bV5{{T}Ot_`aBsfudkNof3GiI_8vTvU+Q^z`-A zT9{s*xJq1k2>^l)NdAO()QTxY%^TEXn}!+AITFN^uPz9xv7S79CIFB-kWO=}2P%s8 zNhO`$Nu61l+a*8%r$*n{u;{{V)y)p1VbnQBlQ$`ucq}wHU_{?TmNrqXi1s zlFb}})14|CsH$N=seu*RSy94aloQymS~ z$1##CjU7yKaV0!CzlKlC92vX(v+M2#wZ%OhL!SqfE=QFlY?kfc4S+vPXY~zsQjW=ivEUppRQb8{RADABC_9N%(>8R621D`^<@2xa9Hs+~Ztt@HS z9FA(gAWn)CYN?2PB}}gVzr>4!57~}&sk)Xw9oAzLo5u)OfL*USnpHW|-vU2K9d=Q#BG z>nUPae{u)5gyB~OYVE`Z1pNDYYt*NfqD6`|%fF!cYhs~n`{d)W)aXyb~mD6=-I*15!7T0}2e}w07{-L7YL6=Mj|@kqyo#5PnY#>nV^VwqeDV|9+y4DyEQQHjf$7^zJS($Q zw6u-PENhSSv}PzIp|(d?GkK>bPW`aC!sqMj`;X69ZL3swYqWIJDQFOQv+?Xo4`6<$ z1NG6p%Jii?3HYdyfrLi9ijXis$-o1*%hOq+{vssmCi!h|W0%^78I| z3Hj?PNCsY6Mj?;Q+~b$98P?W?mQE8oU7@8OU6Oi1?*e4vZxp;g9IqXKDycy&4Af#_x0AP-ZgRv&wo?&(348W zSJbh86=h{6H15E5Bz(X1JvFYj2*kYMsuQ3KhE*%vfJiy{5=MTSmut+`swGw9#ef*k zs6VE?0xBakbrCG7I0!*+G7x=6Mtf)pvW=~vwcBWtwPfK{63l=Vjf--A;1IY3d*`_w zf%<3Kb&@xlG7l0v@*_XtsPN4-6w5U%uN;WpNfo<|O%EjME5|30^6^O-1&_b#G&HTL zmuT;5&9okhpi31qvX{b& zdWVK&K2yYw-Hw{AwY0FAYVOcUJgv*alf=OcRlAXc%hY~fu9xa4!dE11-^3$1KQpH5 zWriB62f0*KBqp7SLm|Sj4;Ub4)PUgNWcL~pt)h~p#;xk*H50LBWe67s&~_iwLop)| zz>tH}9fowtx~x?;iuI?dsf^@-AsxaTdXJd;jEw4{4nI9#C{5ak%1JHDJ+Y6V z(GR^VrLqe=z)4R8hDf;&G-a`zACbqWr|+n90;dGyBiMRtY%V+rBX3s5G5P9Jt3<6= ztCVz0X)>eH$1t2hBx+ULBk>$(9fxfE{%2oP(=7B7*3BF7j!z4cj1FXW8OA-bet`OV z>kAz`Wu%f!f)w%Z>UE_QCB|B4rE>#HdwLQ9ARKyU_tYtY5aT3BUYsF>#K`L)&t@3N z`j7F}feCbFIdGr@fB^#-?WwX#B1q{HHhwGSRXIPFwip@XW@uG%qsz;=`V*=|Qul%b zv|wW%pG{<9@f52jap*JH>QE{fh(ZnzxA^?@*SGc!`t@#}<4r`yoG+cTkIZNF8SnGZ zx$R)L93c%P&`7k+@RA-V7!YuMyXr`vihzy5n_MUh!P zxMA4i>FMe7)H)g|Ybqgzo<2-Rr(j)&uXEc2P(7z0p~y5*>pi|o=+vAu6OHmYQqB!+6`GQ?IN z5Xu+1VS;^uAD_=!FEPbV@TINHlN2Mwa1~6PfaWpodmm5xHIV9BTtF*E%mP-etGOnM z=9DngL?(zxT2P2%mMI1mc$LWP&Hdxp5JBz_TdfOF?GZvDM~$#}jx2<*1LfTMcJvw6 zje)afp^575H1a#g;&AYz1hjx;6~}f1>*=P;z@)a%Os`MET7(=RMkM3czCHWo{<`Pt zH9(R9T4IdVo)Z?-wZ}zG@ibJW(ejcI0cCT57=C{E@Ad7i(Non+B$a7Z;-jYnQaFi~ z`Cwpo4UiYp{vF3#sw!!yBbM^$VK_9*SSs3$#vYi9=%+`vHNtK8M;cX0NgY&E)6G%C2^tvKg5ALUVKQ<6_0~xB zI(Nt;ZE}oC;3;%fJ;H|fd!|YXw}$AliQ+3N!m&s@M;M+c#D#e<$U@()F{pI*>uqJi z;c&WHtzbs}H;AyuBL*b0v2s%+x+CTM-HFC>2D?7Pg3Tngja5r>j-C@FX&W>}okmn~ z!x94!-r=!=MshtCXs!UXKuf=~7PiCjM!sOuBmtkz9D!u<08y7*;G7l9j^`k2q~?pD zQ8eKkk~{w8wA0(B+i7;1npY-~>tj|z0AfLgR##x7(=CjQfOCW)c8%6;uU%u3tw;+9f ziW$WLNv`R$c2p(`y~nqV)5j|KQqNr^EV6SYP)8$27bD1k4`K%&sUJnX_Eo-?rnv0d z3F=^)Dk-ip+bLmcb)FH2lgi|ilDI6{##kQBM`JljBumS)~MnDu*ZzGll>hIT`fLmWMb3Yt*Mkb{4v? zBOa=`y_yNCHe8pAK~VzkLr!B!ql5ub6tKj;Vg~~xv7!1N!1fxe_upCibH1yrn;UFd zE-{{)(a&3Qx>VH4QmVD%;N0T;C6u(E#69o;Ufs0e_Pyy}P^0MOS6jEP@~pGmty9ue z#b8+$NP@LO1L97k@|sls%y`^TSbCu+gMacrA1t8~(6+er&l$z;w z_SifB0B_uCw!oyc#kZ+x(%~gng9A~*5Rl#>C0#iTWxtu2aUQymDlJu8cGbHq`(bw_ zs8tGkbp^J(2qc=RTss&z6%xin4@`z*@9F2v3~cX_?ei7SYe8c}ctkpH{i(gv_)Sww zU@=1%g$3OtskpT=r|{mQo+BR~eq2a!AMto-8?*go2H=dxC8DyXMlKejww~2H(!<;z82sd_=x-Oqcz?p>8vTU!-<3KojK6lkrU zNu6O2B+>?H9Y=Ig%ZMP4FCl3y)2Q-Om87=qrjDIc6*KN9@Oht6z*BMI>yN@ta&)-{ z$++8AO6xU_!9jR=8cTgbT50J%F)*qib2%Kh&u*Qfc#n1o zAbA6lzOHFPsUsY<$o*%x-zh3CH);zZGFQBwXB^E+1z99ffjK6zlj%96-)a0&etMA6EJ@o1W>r#k!<% zs-dK{K=kr0Y;u%%UanUk#o|KoRYS=8`{<4G32odUdm3WLE1&kZ;<4@R=eBE2WN%M& zuZEqZG9+U%DG)owkMm=cirtF&n0Lmlea}e^=+M^ODXmqIQ_npeD$}z@v9AdlX(cih z0|XX8=L3&rU^A{!t+-DmFWmA~mWJOkmI$4&RLAHF=NSYH`{3i-8ntR|`>OkHgLGC? z)LZPgl#b(7PXyt-X;@@|7;;qzow3OJ40{kd1(!M`Hbwte*PY`sufE-?!PH5VFMiD9OeR!21u$mcF{ zr1(KeU^9SDF`Q(fnORIbdhh=U;4?=_0CXdu)(aPSilDgmN_v&yR9f%0M|d&+{B)U{ECy z9oIYW&A)TlH#%L%PfuKt(uax)q;`K5NMg$%3mUF6a>WOf1Li)hyF&YHdR>zrT5T6I zaheF$p6hItDg0U!1GEb|#m%ruZp@10eiA`!SbKt@S~~r-lhVOLmnqg-Xw#TT(*U1- zM4swZc>4GC8Yvdwv&Tyo&{}b5pn}~`ZFy^8Ver$4{{Vp^I0~XQcu54ZsqVxUIz83^ zPy#qe8(Oz++OE5Pl1kjkHO4z&tN6hohB;bgh{+qMEt2u6B}bRn)p=MQM2^>1w@X&@ zv{KhrSr3V};Y)1wa>E*?WvVd5+|m)`BoeGVr-{a?DE8L-UZz>?ma_J0cx#fbRf44; zP7zA72@+04gEU~bhULx_cfka7F6P_@@w*1m*);RD;<*~38lFfJIHLttQztS++`t9K zG8qN|Ab1ST|$E>G$m1=D)oEmr#Pj-|NqFh@gLlf6`m@{!;-grsofW#J!)r9r>| z05p+s+jaI0?RVLgHfZe<(A2ci+npqpW02uw5V{vs%5Wk{G3nm~5v$e;&AVsX`-0oN zA-`2t(#b2u62U6fK~>1-_&MOLs$*=i&N+_!PAU8C`EJ)pcPxTxSXMHy;#*d0T)ZS|$F-Qt2;5fjYPB`~c;;uyms(w+;D>;@Q; zRgBxI<;J<)TFm0Eji(pA+oyOPCW zxZW)Gs%5IU(N9bl!;Kh+kT7LsK*+6vMn%cIwT$xo6yU*Lf-S^-a87BBxu5k_<#LM#>Ib9LO)sWxVB^JV~pT-Pko2XsRJ+ zq^YiPbe=>>4Pg%`jk%b!&%+!6ZYnUtA(*x!Ub<1fx4z1=Td4OfR94D6;tI$rM6s3d z(m;~Og>k@vAPjhp-z6=o1YKGORaiqTRdhDGie2cNwrcTeiVF0QLlkw<6k?2w$03Ii zfO%)O4t%3lS5B{2P3LQ<+*_A=&$Z~QDLFMP2#rNhqE;&mFiQR_IV_S44lW-U^%}2t zF4~`KUUt0&vWQj13{YHUrmQ%YwxMw!0)Y5+G0B{(D-eJ%?r^QpTQTS>dS$ojtaLPO zW4qH!aEg|_Qc9S@zZZZipb|(LR|}FDlY&cNX;T^-mA2_dvDBp{;+pkd*V*Ngrn-(K zt)>YQM@}MSc~(WlL7iF87iDDuNL9+MgL}79UG}vlz6faLpp8;Rsgj;(>D^>3Qa=(k znBM*QSLsc&Q2EWpLz3=$0UP}B=;5d-p>V+`u6I}tu*#~pNO9d?x>;G zPT&TUn8~rWq!lpo&|CEb>nosdJR4F316XT*w&!Gw~T- zI!WF4D##!gc>1m+qg;jLdDh7h-K|EJh zl_jQb%oOCK1H`H9uB066uB5)uZU|?y-e`@+I=IA=!#Z(Ac3}B9<&_`aZaw?<#;Z=X zZHqqUzU=+8ysKC4>!sK3`YV;jMro~*v}_s!BdZsRY#;@@t07=cPPIiif0f}|<0H%p zgVTSsHo)B5%9(FfQQN7eoBXOfgiI2poZvgj;yhuOmU04&4&aXB=j!KMI!CbSsc7&0 zTDjk+mz5nYp4C{jF~t)_#5tZX2~^;NhIaQHFfu*q*V(J1dm`mUN4ffEwW=;QxfkMQ zt*DlyJMs#yt2qb(J@}O*5^?FSow?gOUBCK$9@gA;dm~!pWtti~mPLjM5yK!}3;-e5 zi31q`jC|JD#Owf4+|t8kera2JskJXwyPoiWCqtc_~^*{4`fz;zWJVEDy*7pI?0*-APk?vDziJ z?Aw&qdvAjsRqyVT1T|G;yFZCAc23P8Uo!#a^d6dH-`mAEOjgamcd^lxp^idjiNs(^ zV^vj&&InKlJbRB!>A3~ce7$IK|tBb)+ze1=IOd+8Rq?0Y84wo_W`DkZ!UhOEaYCCNR)wlUkV7$?x@ z*lE{k3$0B(6+M=mNLprDS!D?9#1f+ix$m5J^~bQ%q@zgVCd$*kwpDegQ|~mAvN#1q zeBgFZ6swL%9xoG)IODL-<(&|Mik{iDAE^`5(bZ5(Sr`-%%G}im&x#j_34KKjtek$#`C1&2f!oLM9 zfTAI3(WM~&01yw&S3Um#62F4+e}Ew+oT_RVkGvr$fsM7-ywj(-kvh+jA@ju;#} z^3QRBr;DJHNbIz3-LF|=q^6qXP&^UI+5#9;7|XCD(8#i99f12+GTk7d<7TT1jr+I1;DM~v=rCW-t zk;rm9TOEsJdgoln_K2_DRxY4yd!34ns%orWCCkAaT_NK#l0azF(7chlMi z>nhr9wQBX<+pl_Gt(5zO^!sqyz$&JiTFZ1*5OYB6#a^jTEQaDp&!{86bX!gOqT#!3 z-9_6Q3=5TAJkZ@z>jAW(45;vxZY*RfECdi@Q^X@xU`ii2NZP)5)X)aJb zv_;OHBs>69k_axOV32zp9N>kxZcR~BEhLexClFqD8SxbpK4HX>k`uc&Mp*pDvb2GC zO|@S20`=7j>m7d4qS|)Leb)Z~PHAX94(}wAOvXXt5gSCIxkh*eBpmku`f0w|)t!?; zv^MV5-SjK7_hkx%tEJo)>EM;{Th1n!2we#QfNY;!p4eu4j@gRiRQD@(;)bfOg<`3s zYB}cSlD0TXj8$29j>j2pOOD}5(2d_iN4ajW-!3%P>y+XGk5N2m@-HEVb2Ae81y6EM zz6N_}!D$piqDnJvzU+!SLde_Vz$53Tyo1#Cj=`Tfes{q9E0Dtd=aR7BCDf!n&vkyob8*9bvy-RTB-9lr@!Wu50S!pb=Ff}m8O+g$H$}{-zgNes1XTC9x#GMh^ z))FrPELm{0&qGmLaEfSCZ&C>=>DnAMXyM}Hmx#;2aqf7wSa!k7VCmaz#amYu5TLL4 z81_J&J8|^>C#H9lJ3kyPj)nDVglJ{C zNVSlBJTprnQfeUaQb0X~k)J92$8AjbN(+2%M}0}{wHZz&Cd$nlDf23x{-A^DkCv>8 z-h*3c=&B?`xQT`t3k0u>WGN@-p6j1{{Ej>5PfWHqR5qs8xYkqJ?YpwaajK`RikACd zJtXw8I;kJn?|HM= z=9)QLdPk~)WS0O)Vo4fOW$aWdaSTYoQ{3xpJ{P8LPDo08u4e**gKVd^Q#IXfmMU9h zHE5LSc}{V-gmIEW=ovsCfeHMZ&|pltO?I^0DkhSSl8$((V{eISF;E}FXpc2xFLDkE ztcg*7eBD1P^r8ib~0PBh*!V3L^xwqhitV0#=6`O|mZ+kV@&E>Q^$ zEp57@o|z`8rv4=ID@>IR$itb4BhQR+CBkK~%Q_rc7yw`)ZIlwLs`eg{8Vhvy+N-Tk zz|_-xHAD(ldQh@7aJg1qXPY1r_B=}tCnTDZ<<^^(%93h$?bOgf5;NFoNo3wu#j3Z|*sb>{ zC4t(T!bjwiGT;DNvxW5`gJ+M|I>j@NrPRqoN6{UK&zLJl=eX}xwI-%$S~Z;bj#K%V z0fK(LhwZ3S-e#J2tFElBl}Zp;xj&!J>Q1Z6XHjacwDyI$Y?`TR>B}W;RFw*mzFc;U z7>^GiBLtr}n>ai*)BP{$=G5Q2G9C9tv}zDBtes%G*3-{VO&vP;k{9qyPR_%J5y=#Z zKhYyuWboZXg}K%}Z5W-7z*TiDGFL{D(9*S3t^-3FyB`#LD9660%du}T(?@W)(LFqK zA$5(s(lIgf3a9~NkW_*@cNrr>dU<`m?wKmSDNd|WWw<{{;clrn;h>K8tlIRhU0vDc%+Z_usFaM0drq$Wt> zqNtolQ_VO#D_#A^^=ghc1x?tWEn}&n?N4V{DR{h+KM?IVCnw=JCI6_N)8C_dGYl*lX&Xh%KpmHSvJPdw{78TovI?LmL;m5q1+I> zxU!W1F&RAZ*yLkM2XI|&B+$`Sd`&E|7-OlHG^I%3Jwy=8%9gg%UowdUs8%ep96O;W1C~3cGTqLb2BobhaIjLfF%SiIRh6=9p5~xc zrm3g#gEN|UW#qnL>zwz-ao-v*MdDe7JjW|ND(0d;6ZmK_a5&^=A-#RiriN{b+hr}n zu7clVN_iuctF)8&VNWl^&9X=zQ|a~5`=uQ<&TO>dYa>NzUFr!}LJ?38UdIIB5$mMR z{{ZT3stY?wQ1=earLDhH*4pUFNg-#ILBwUxb#I|6#N)X1$G$Y#?o^V}Pi>xIQ#`6A zlstdLiweV!FYaf95Cmf^r*2lJg2jxek?Y8$^m2V>GRe$TFVu_ z{{UHRyIB&Hn6hfQvv9!+-B@}K*&iSX_0SDNwiY;D1OQX52e;BR)KYE~ty*a)iGU?+ zzG+YnCzgAT+(Lu$IXc<4_deRLYKvuUGtND2fD ztg+4{Y+(6cDcFVLPq_|&w^Gx$za5h-vWj%G)Y)pcWV>pn)dXJ~By{S5d{}C*g#?l- zc~>3DBRI%DZrGD;OA}GeXWaDjJvub8$?=goJv%BB6mhP3vX%#kP~5njdKJ(Wvzyb! zdfRpQxZC58mzc_mIgncp6t*!UISfI-BaQ-;CfeKXuc)`GD|K~UW$rlX-jXO)(w?uH z_@x_>D;tok;XwehoD=2Cpwh=Jg6be}q>_=xb$WEuWZG=ia9!;+w?j!^M(VVb@xMa=*I6?~48`S;F-MstG38r`!OEPrNy3w^e5%~rkEi>hS@!k7 za;`>61Hsv%XCTH>Ze~8E_92*Wu~GP zQ$P}Z-V>1_f^IQb$Y7Gc&Sn@PYM|#c$dSJJ_;ZW#ZEFy07y2ik8oJ- zFZZU;6}KaLsc9-zql%q`ild4M$7c0xfbEbEy6co1s_>m#wGsaS!|FfkbJ-rMJ%|4Q z7Z*VFR{7?z-f3ilrUxj|%7ii;_sBoKw~){=fA0wFn?lm* zSrkyw)Ikg}qc0UwWRM2VNRcsx#{he%Txy%~XO6z6&38bxRIbrKY-NG|hhIj}Ygw*^ zvbT~lJr|mvPVGC(9ovN`g0x_AI6a8**RZowM$pLJy;1S#bt$4o z#awKs9h?K{_13ydr62gHGC}n@*Stp)<@F=e=dJUnB1&NA+vIhEK1UKiPkmPk=u(ST zh|7XIk&J`rMzkO*pn8xyoa=nSl4b|dj&OC44m@2O(>%NSjYI%aiQxYL6U;_O^wvOe z5Z3g9p64Z*Dc>!r7~+rGU!D0SD0Q?+psH zMQ}rtoOjmNPEM|Kk&o9{&V6{}{@p-SD@$QUKp#%p!U}elP=I$QJ-xoV_p$Czzi#?9 zY+5KOC!TkaX7I`&1G5(G{sijK+KC%SZG?nGd1MC+d+`UiwxKGtl7?>VFFh^nP8`nEuSd)ol!(NSVv6GMqCVo>#u$mL?mQ)8TIrZT^ZaIUv&s6CdbD( z5=s7o5HO^B9OpWR92x#BlH?T6)AiL_gi?ls%G}8WA91f1K4Tf|JL5W*$>J^;cmDt# zY7i9%iN+78)T>mykRkIdd_Wleb%ZGGFMI;swd}6=Dpx(nroN08a02@3)JJIEQx}F% zvIE4Bb*M!pJkK6^LoxLSwzgViD=6aQIT=If-%T*ZXokEor1{7G7v)$sk*i1pCV2f`&Y>O1!O z>Aunurk-jUkcmPUh=bUX?TmZ(&^c(lSql{-9mvLwrtnaq$rodm#!qvtijl7)kV1~< zS@8ixw9`oqL{di1j{y#hzN&NT zHM{QOv2!cLk6&S|p@)N)jGPr22m0u$!Vpc;V57ZFTUV5&gv~JHRS{9bp?h}={H>1X zA1vsMwtCAoQq|i55y|{W&oFyuy7oS741zuWT3NS4GgX<86=gX_Q-U$_)4jU+9QMg6 zFKIUnfgM^NUJRh+Nne+84nDoKE@5s*3T_9L626>EO4n;#PoHa+y^S#mZigv~pc-AHvw4~F^d-#m=u`+FP=odc?*f;m1Sjk#0H-E;iE zL#m4hDmtk`hA$2_Mj7HWl0JHe8Z$BC3Bm7=mW;~0D9evF2VgzNxYP*ZM?mTrF&NWJ zjas1G0Eg8>Bx(R((Cb98k_HY&Jx{RFYN+z6xEz4*k?W|F(_vYHoHF{4@Xz|epvZyVnV`R-GCjt>PyAO4*ukKBhcuaXjk$$|{hI+(tb# zMPOLmmKe|1KHAdIBh?3wzCCnkmd`F25uew#qRR+XE(dRa&qUy*j(K>qlspSA0X&-> zhwH6e2L|yEx648lC^E;%zYz0ig%LuJ5yz*e&ssbZt{4;R+d7v>tQ?*olkRjwge7Jm zSixoU56{!-uNo5^fz?JA)O__aDEvezfH{3Nsz@DKLNFzVZ2BEvC@zZjow!UTU{q)4 z*o|XT02K`36r-FRduwVVEMPl#2flmbTc%?qV5)mek zxCrB=FI2_m;S!b@C$P_%MhaD(>? zE2vrlL#0RL?8KjuEy$6tX(5xuLkaiJ52mw|mRyiY&U*p>01bKLG)uuwIe;=hu8bN$ zrdlsm7MhS_eo?UvA`e5WN{@wgEH&J76u@|87=ix)Xw^EffW^JOV0vlGWpA5~+*hCx z)74Ti4)Ik+(niV;aoL6rx9L1U>3J3wO-7JvIKfQ2p6t6u+}8@LU&N%yRRYctqGRaf zcPF>ZW4O<#);2z_?Q?5?j>WOL#+)HCi7FE#mnT!@9lQFU?tzkYfxov!>vYK~)io-? z0<%OZpfTZCjAyyeqK{wY7}6a>$RNP=jE?^Rrf_wheN5Wh>XHHM4k#6hG%2kl74>u^@J@PgaOzeFweHJ z@cmtJh4sPwI$IbRHiW`#+CR20i?{DoH>qgFR1~r+yiUi>k8plt+g%a4x~;dVHqDOr zXjiYOrtxd35~5WxMKr!y8PxfjMJ#xO*kt3kVayba$1ytRlKk`eX^&*>`8RFahi#=q zFiBNVA&yC<2)r1MKok7mAOR%y8qKKFGEyXeWXR@xV70x~xw7Ql^mMXs%d)&v+*UNV zL{Wq^H1bK=`4+&)D8-luMJ9%GNUmgA@rEHYfg|6GwbqfU0M?-E$tL!BV7CG8AI8_Rb#GL*Ra54^-t=mTU`+C0baif{* zYGITqgc9V2A(+;|w^0pnylyN2E07 znZXB#BZ5I0@7w$|zf@L7Ks&OG9R7d%%}^A9#chsGDHDu;1e4p}KKdzD8dXs{D+2sM z13tskx6ebUp^{oAn}cx-$(|<}#(i{Q;W1fbpNH{OBa#kIGyec#)G7-@=mS<)(9_pe zJa8cJgE24QrgD3HvPs6Z)vuPc&EHc9u^)>V(TG05jy zV;{!OMhWy9lFEFb_W2!E-W0-&gX!Fp*dE%K4Meu-SB3*CXVftN0JB;m&u-)rb@O1z zat<-uSH}t*1Z5`pqRb*3hvEaUKVPP`6abFc_3U+~He?GdZdBt3<*BIYQh>M_9f{7m>{oXt%EB%jVgc+JFmZg zPp+d(hmJpE^VHdUb~whhkaL9{kG7!-!KLD-7=XuZVEjSkGwa70)W~UGUg?0o?0W&J z28skg5lgru+avbU-O7NdkibznxFbG;8rqQ%JXamQe?3Yu2#@hV$n;$IKc2KtP=P-R zp4c6|w4;PzdZ^}TBW@x#Z1*@nU!Jg*aNx#+fc4|^`uEq4c^vRw{j-eg&jsWl2*3;9 zImR*h=oPI?;^)3SKP`J462l~@_$9IB2O}p^LbP1KQhua=$6rSnSmmfF>B+pAAdG%_ zAK|LNLJh4g8CCGYcOCFPdc;QA{5S-8iO;ULATk^(oWEjzfA?$Ie51pU*kjZF8W$oM zQKbq41u8M=gRMdw;1Wsq)QIWjm4bkK4Q+U#rpklK{m;)yccL(kZ7LB@4Q0+ySIh9w z1t*bnhH?+lKp*Xm0J_xAS$2$gym+uk!t%EJ;XA!{I5!92g!-%+5301dIWXpcvLb>v1b(ZD%sIRn$S20c%6t@Rvv8B9e4ZNR2~6MV6p`~3cT z@zI0vnn^#I|CIPKVAdUw>iL~^4;Y^ahYs94H)`3Phjdyd_++uV276%;81 zW^Wl>$K@qK_3!9U9OYC3ztofYkEdjr3$a(p`Fi&L zx^LcfZ6!d1x&W$!{Tv*g->#JE3Z$GzmzUGuK@gy=%Ux84Yy4c2OLMPu&kk;nTVPeLQZ_$v!??|ZdoGo!xM!E*E!UIAz-MURa23VZ9ZweyK+0UnMZ+z+_mXP|Ldo--)CnvtOsU@=K zA7A^lJgG?4nii*^sjrQYx;iORGQo3_NA3RrZ?2?xw!57@YgHLmw8~|tIpxWH!6c7C zjYFXS0Lg-!s!hoW&#PlS{{UQTM2=k+mRQgjIpOi#=N+^3$8XH)QnF|*GeTf&NH~%* zGBK^xHB}Hy1PzZ7c=0~t>#b_@M^hAnAnb%N4l)nFf2O9|ppEN0Clc%cR30H*`vIQ+ z0KTCLzDUiY(rRO?nnW>(Ad+@srLh=8_*8oOXXV?z264A=(8EbkDg!q^zZpy(< zIQx41y|lx&Z}8LXd!@c>g?EV{j*!C<^2rP1lY@;7S|_>Q+Sxiy9FV(H zusD)HVvLM-027r1x4)*Vgz=o9a50_-V2TfjIbf2~cg|0@ZvKP$z4ewFD&~!3R91}S zgX!BC#-&ixh}LMLFXfej_U(*!Bj3<#+wHC@DWhoGLmz z%^fXZa?T_n#y!9FF{#o~)z2I;Rn^ETRoYmg86YvhBoCRu&(IBNw8JZS@Qg5eFX@MrjCnk4~z+^}1QSZA^K2Om+YC(#fXv`2E=>30U*+w{~?p{i)5 zUSR;_?IRvNy~Y@K_9}ffRk5&i9vM34;CKHfPGb)vB?=xoa)+pA#k*_I>gPG)PjAp zpKWMU=Hnl1_VmV>_a@Z3ZPulF>M5ZWbg@*&;-?ni;P>Kt>j@#yfnyH6BW8mv<%8jsth^+Oc)iloR6!(&IWbl8nL>H^gZ07x01tg;l2FX8O=aO>XxNqa>NK93 zig{O%N0o_K*S33{c0IcfsPxXdf`g{?yH98%S}O;QPs!DmBA}9^JP5%($RM+0*B!tm za@^F_@%`69O3^SxdOB)I$AwM@E>8TEhh{%T$8V_9ogK>m0AnKMZMF#L=~754XCO~3 ziIb8ZKoq~??xTis4npHze^;q=^bP{s94%<|RKDb*rFmns#X}r2IS?|*$TUj9fb%m9 zcgA=OlB?YII+wOKb%pAdrb}fFJD6l>{6FI?YlUUvpFGRla_m9%(H+@B)o|6;(5xcq zArUQYMZMW1GRPz)X@FGZ114L;AYk^?+g+ilXQ*kMJYpd$2FlFpi*DwdU@gTk3q#UC!jl^#%3F~=i}cJ%DB+kQ5vdG4WN znnzLMA2CG(@Tp=;D9ImFoj4aXP(cm35=wO9%^EVSaUqNzUBUOtfN|=5ah+D3LfnkA zMQyWI)k9tjnWt6Cx}0$cJw`kJr?+iniSB!;n6;y2w<+SkenqzJ^w!!MNaHdA*?*AdJ<0AdrTw!@a@_JwEvFSVO1NgKocN4LB;y~AxTzw0WL~dG&mErY zT3yI;lx4Y+GsMW)3O>Eh?VWTtK{`itk_+6o+ig7^OGg|~GE&r47{i9k&%#nxeuSNtuM3vEUDBvYnoSMPi(2029$|n zSzY3cIw|f5jhJVKeBH1?&}cN3J6-6M_BiscJN??9Y*VqUl7ojkWoM@30Rdybjsj3H7Tl&}Qhh$EN2J9qT& zjVAOjsI@&t>Ev6&vwd8vE3A!CXS&E~VOYemyM84N8eqi8+=v#WR-!6}X0gyQof1KNgNgufGA4gF%1yCTKI3J{*- zD~ufb=jZRQ&pxpA!lL`X>UR~laPBxHu{74Z9nw33N#N3lV9LQ`R*@ZxoU^egLY_c( z@4lhe!fI>n@J@!RvIpWOAwqIi0hoi6=yAs<3QwRq<01AgxV0#TtAAToifNaRg-s*L zAOo>E;;KPo?td4jZ9hfgS`93(_J;uAK7TczQwFAJ+Sq}k%CYu#^0f6UW7?&8sAIoN z{!wy@3KxllVG(>&ClVPQoqVCyS0l-iPMK{rmItMJ6T0l`(9hl(ZV?Ag-n>f>%jR*7 zIdre58(XHUXS!|ZuC%rGsx+f=YD9}y8wFNYP78ooD+UJ{9rW+HsWvv{iktgIW`eS! z2>|hGsS;Uf@WaiL8IbZX;DZ8zC#r>&Wsq?5B!g5C~76=orE zgPdSDVpQOJy;8j*Z7MClUAipSG=_=o)m2pDI4YVi4;)dJG)TzE;-D@t51Zbbt=heQ zr=*qOgKk|`rZtA1=~G(q)T|gGBPk4KHFW_ys=*FqJGU5svYi@ZMkx}Qqqg1(hEGw zl?%)Oz(m3p0YTu*6|<9rjedph%VmRn^vauLZ!ioOs~gZaC54@ zE1vjWAp*Oqe}3$p-?6ux``cvQHoVg-#HjT(cEI%20Fc~LsDsJC&O7(z?}M(c*?Usk zzcx*;eO|0Ksx9Ox(d4?>#WGbIluqg5#mOXJAo9N@$6!76N_9GguC!IQEx9#~Y`c~y z>#ORn@j*LNKQiqdA|QDOn<1obPIwhw036QgPS)vdmuf?7yUZ)2f>)@i#eH0GQ~~%^ zsY&ped#MDsK1y&1032GKcAiQh`C4F&?G!@j*moB0+tn)jg5h|FrjfD@WFG$ zf_ov(bCcglW~MXlxi!qQkev6$=W*_*iti0Q;=UN6YIxAm_+~a`0!QG>+-D;sHh6+E z2-M{3b8HJ8RYiRT-dc2;LbS2b)YM5(>{}5ksN#rNXE+!H5_778n`c^@*YGj#+FMo5 zSmUUU;S|?+#Y7;42x5qMKCTq9j$OO9dy0E|bkgy+E)_NRzM)c2OH)7a3*F_F)Q>=U3Yw2DjQTcs)`GhWU;idO$UQj93)5#Y7TfHVVr}=cJ$5y^tQ<6viw~wO(d|u ztv`sYS(z8ec`3jHzIzXI^BSP{t<7(nijtYjtvYy7$YYI(Up5Ki&60871dr3#P0>7R zC7>`lLo>EA{Zz^5_cp~eTblD`x&6^}JgKW^qLm@4jFP@2PU8$oR`l=K>#=su=Cfa{ zJ0H)0`fw@LU@439e^bE()Zb_XS6lTrk6^JNNzN=Cc4`#B|_9eSw$urjB;f9 znNCIl$x-~L9g;)aYYlBG`LJ#KZsAL#&{}Qu_UgKM)-;xj;U$ftDj9@QqL5D@2`P@m zgPjMihVfY~BGC~=K#>V2js{~Gs4AllszQ&(e8hJ=f%VpkI*T$~;EIXo@TekZiX#g| zB62(VT()~Jm>xL;I63TY<#(c^iJ(MUhN`L)Oi+eMC1oIAfzNS5>*t+^bTyj^RBy zNNQu5Bw0td202!R#sFY_*BHlQ9qN2ld zYU+v_Ss82MRxqrb3FMOig(N6q!BlTE0uG*Sy(ik6u4--Tw=eZ~XeFkOS*fY#N>`Ap z#ylw+By}!hM-AM0yPhO=@|M%Pn&y?3T03=b{xhOUrn}UYYBiQn5SYunWpGtVQU?T3 z9Goisc->a32)x4;jBJQ+^GgLK+L_6xs;p(pG_yEC8#pH(8t^`WvNF~V$?Juz+ zn(q$dq_*B<@#2=QqPnV*ngynfV&MdT6B`0BsIl;wi{vTD$vRD@={`E$h`+n{IoLS-6J5z7%+PUviPd%O7s!RZ2f;mZ7R%qi=LBM04 z!yVzVm2H1z!mMu_X1+=~*lQuPK!%#GNLl50;cqM9YJY@#j!LRfN_u|+P`HLt2}Nv&Aj!*VEjU=*@$(dLImE=PT+hFV)LD_NARNUfAg}M_0W>=;0iZe2YGAkz_ zWXV!S7%3>DIxe6gHqtfQa?fhCO>*k372=|9;2HEmm`~u41(N) zU}|MIS~m97vB7SyjVowtWmxU^sAovhDT}O$%0RAApk{JcnB=%TM2)5%quK1%d$q;x zG}O>lT@|Zix~LBv!Sb&pA}lmKc}bK!Rqz-w3;?8VboTo_wx4Q8y_$-WYPnjW))sgk z6^=(~o-~lkK=9Rr1IPfJgLWjC8zu-!aUni+dZxAtNN#O$rH$&-z@U8dK)p<*zQ+#_+8jTkdygA>S~ zG0KIdcRx>d?G1+AXt?h-xtPsdwzw&2ss$xdvlWVZc_tw$GSEgDV`17-+=)kRZ0M&{ zw+6`E_SkJ(dP(fpS zX1B++sA8n1k~)ipQ^4~@B%BBp5Ge6tT*TQfff(Z_BABmNF+<9ZKVmiH0iP;J1`(lF$~HW&CynMg$$LC3^6 z^(5pFGHTmlwi+G96{>>abB3~NS(-I@q~pRyNfApweo_)+6p1HbPjGoF zNWR_A>8n86ZIsJAM4!8nRpU~nPlQHL_wEN02<%G+2iG~PI?r?4`*&nqZTHDqN_*U9 zo`ODp8yAp)&kQq!7;*>qR1>DaPf@k%n)7Wtis=r4^$(}^u8vSeCC1+^&Ujvi@60UH zG_=6P8;X<393XtQF`W6ey0fU;GSO+jTz7W&tF&3#C?KWyxg}(s*nbfsoTG_AIqW&- z@pm4a&C&=?(AaCWp@CH{wXZDobg3+5O*^_mvSW%gZ0x?QeLogR8tFN?Mhaoh3KOGxaXnIMvGSmLb1yGj0R9zeenq2M+47G|3iS2A^@tKBo*dxBfO z%;#52H1zY-T&eBzQ>8?RI5C(Ia=~%~1@21{ae=EZXzx9{x3=A%?!OwMmeyvuQcX`k zijq`2g>u;=BxOiKp;v*(X4g1%vdtYWO;+W$Z5XYp*pi@7J0c-?)bsF*VN{mSlgsQr zdVc#f^>Ux77nn8%^1W2WcX|mZEKT5+Nu~oa)91xc2(kWr_xh3!nqvk%(W$uZr!I%1 z>wfX7*vDfQrGmv?$HRH)LQd$?bK(dpoC^cyDoO8y@2#6oqSb!gR?Vln0@YGi)JKSX zHVz~N`GktVt`jNif*kotRnV%NlI@BXuo_AMUj#BkBypLg<4|P5@mbx2p+n^Wv+D$M^RY~B|nMc##%oa9Tk+u2>w>=1ATh|tF6cbh+21Tjt-)2m^TH+jVUfv z)a3+-swBuvNlxvYm2mBW+zf{8p7obW?vz_oe>B_5?cmk@-zq&+=p%*+SYc5TO7xumqv%XXu;7`W6+;mDLE%F;PRa0pVZlY$h3>)47r zt^2dAcI&OS$I|}*v>Y4u8|3Lm^w!!qX?_ZHF__ed%Le6@9ospKhR+=7;`_3yw#}Z) zyf@u74SwmQqBRxsxGJ?2-XnZOAm^JegwlDt638%dj1B-9LJQ0_v2Ky@ z6_QXz9b7i4o}F1dN8&lF5**+kAz#E!F`Y2Y)2^J)MIPU|*)BEE+mNeUYp&IA41@84 zM~bFH%h}5e`+Tb2l688Isggstc2?iG)ZXYQ$Bjm*Bj_nu3=# zd=ZN*?Zt3}apXgiK7GAds+eiO(_v0Sn2tB?a6pDuCVBnSlqiK;+0H&3om+p2d4 z>e;naHyVX;LbVLG=SatyCJK&ZMr`AYCOdx&C)wWH&7sAsuH4QX%lQiKJ zK3x@)xLgk}JmmHVBU36msd}|g$qjWU_ND32Jw-T=;be>v-MIt6ek^wf(-|GLh~1Zp zt=f*1F7wMp5u}nPZfI66#g$pG%iGKk76S*ibx&&~V}am>V7abIw~I~w-ta*kj;6oj zLq`PEahaliFUPY1*yMT;52tTUL7jy>@l)5xu*nbbs$g{sByYsw9Y`!O@AMjJG#kyW zGtIduYdmTixt0n+A$2ZSJk~z$0RZKj3)uYhwL>Y~bh6dbL>jJHV&maPK-uoCPH3ziel))=9i;PYd>wp6Z63&lp>G=Tc|5?`IT}r42Q(y;MrP zK#gXQynMp3cf$BsRnMU(uw$s#I{VJy18`j~Ygp0{hJO{Z69lNh?4abFcJG}-uyoF8 zWD-cwB{@=r&-`Mt^5Wj3@f9D7*XlcIp*CGrzA-(zdT)n}@f7FD*c=Y|IVbbS<*rAF zYgwqRhJtiZJ*M0egx0idKZg!k=@c~Kdg#IZ+J zG!}wdXpB{|gE5ftSmaJzWGbW|pCjr$)eKB{-1!I9II#8!V`OZKZP8w6Zxr5>qoIS)n`mBv&SCaF;E7c3F30>A>}HuOoFV= z269dmsW>4wPKls4+B+RBk` zwNsxKvYuHTdCfISO0oq(!Xj`}$^j~;KEq1;#>I4~-p1gn^fXUj6-69%9weezqNn5H znLi3UKV|RuSr2aHr|()@^j8Qg7N$w!rDc|miV}Pnf`RzRICGUaInG#qTKYS-^t(o6 zw_2*`>MBY!j)+m@LOZ4g2NUU@Kg*+va?x&ep6J9o%>>=mUCFq5Te#@0aogdYsc9ms zk`#yqqG)7tgONew7A~#G7CoQ1z$HrU)(y?RX&|A7;MBAf?ELBCB^FS`96o-dAY4$TG&!5cA7&@=Dw;3!W@IyN#qv?*NzT!wR+iieUEmmp}ktgO-($48Kj_p z7M@1z*;h{9htuoy(LO@&I}@RetaU#rcXt_XQ3^;*>m^1BZwx!A0f%Niz|SAsSkJoX z_N9_KTIEWa8w(syP#B|Q)mzjI<2m%>f$yld`>asX%CXBO6HI~DRz@Maj>;vg*xOQ8bHG)pJfch5>;b$;uZ1 zjxT}OeKjuLWwHu-Rhet)DQZN5vK+&eDy`+n_ap#29FJ`gp8o(zxT>k*wbu%{X?aSk zQ5Y($RFlb%l~0$qpvSj;VQ%=WHw{2(*?%cohR-El=BtHm#8VgVG@h~`3IhfA$nT#{ z=N~;py=?2nuBuz@J5|=Gb%~P#Qs`Weh`7#IAY<3JZ56o9Q*XGl%9F8LZx#x7aEsxC zfH*MqZrD^}TZ{T&XtZ{F&s4U>+S6-ivXqV~xrF8_BM$DNLBJDd`IWezLyQrvkv2f) zy~GBQMQ3{(M{Y_VvnoY(y03E9N|41!k{N@^h~^H;fPN7C#!wFa-kpxHtFUfMCLR@1 z$gWwvm?+@cVmV>PHEp1OwOd{y8s7wW6{dzM5}?H|ZUH=@n;^CYmXY2VD^Y=UMC3qXa72Dp!YKgfIyFC7dUbQP zMt<|ClB%di)zs@vBr%B=MrJY2$FMvViWNWSFbVDsJJX{*I=!2o_NI=M(B3Pf@DX`Z zqCA9Tqj;QC@e)^u5y8C%Fh6#59@!4$w_mo-(Ws}|l@`dv)bre_-Qub)@u7bW-OORi z;PG(EgDu#Rv8~Zg1IZxs*eW7cXR$==7yYjG@9jJ^GQ$cx(^N@2EknpWCS)rTDNaMT zBc5H5aRicG>#r4cf|_g2-nslW;-8$;&|3n0Vw|c4kjMB#1Ryafjy=HiT9>BwHMgyz zn$VS0roI-GnwZ{Nq>Pygz~uIjMj`+oX;^?k&|41RwLv3neX}jr!os=ZsD|eoyfpAM zY|}=O@IDZ4!ldAnljQRN9XPcId}oi-^+XA2+U57$9Ur%D3x%GJ<4YC3`QeI)?e$Yl zOG_D0B>Zw=STnfdOoR*-E1f{t`v#h$suEi6wN&#{?W&r14Q2$!t}Ymwe|#4b<} z7`Ow87%V+W=q;;t-&Oieb+cNYBx4y+uoJlCC)@nO0ircp_r(sK{jE(SR5(MtJyS5LFv)UauQbsctu&wO2fMPYSAx zn$L##XK0I~NXpF226=ENxK7~uXy;O>D|&rZQ$?Ap>1tAXijyToT!Kc0(mA7uXT%&; zqhl8(y6=MZB{0!`^LU!sBsaJQ}CiN*jJAv z0<5x@W08_roE;4NT5M_j3pVOD-eLn0|1y*rM>_1DnXLnCo) zD`y_L&+DPhD%=63l(>)wVTN66jd>}-@`LNC5{4de>5ll+aQsPS&mT+=Z9t*PT4ivn z#0+4b+R%76aB^GQTk92g2J-j%{{US=X)tm=S?qO0fy$~jw`Ec@hU`1~>KjNVm8B=s zu+~#CmNp&oM{kz2h2Vh+2flJNvTYa?w}`w%IRtkDIM>od9AGO9cJK7mkrM?N8SUKb zQOGz>-=36BrVK9}FN64U#~8+8(tRPIYZ4N{bvha0wV*`jsmK z{1wlHj7ZKipRet#VndVIk~?hmnv5aCIr8f}TDNpA(oReqax8*IL>%XAhOf;wMmLQCeL}GP7WM1B0&* z`Jx6pdTV31V&wiI+gjC?c{45nA0wgxQjElcaoqag{PnRR;Gy{UZ(jcZJ$&4ApGEc5 zif4t4^D=|spz!QK`!ttNL{fK2F*!=an3!Mehk_vRJYI>pC68XSC-O2VkFH2oPxT5>E<;H^b3Gl~1 z!8y)xpJU(DoE<5kghf}?bdO0lnDSGeBp*@p(-zBmQCP6aD@M`|A&CKUeX@Nu68`{g zmY%G^G*2Iwm{#qK{JvxBuWV^d^+`)Ko)WmnJZFP@AIn+=xrs#4q*`cUqO6h%mQ;A$ zfDdn;Jv}|YeQryAy)E+9c#=#(1iBDU0(+Jn{WI;auG5OY49^&87#N-VWtlzCZuuBL zT}j($pk$K4?{)a#|gzbdoOsiCCbTq{GJ%Jb_>8SG4GOA;-Be)uuz)9eaAaNKc z>#d&(%_6dcpO$pDxB*Fwgp@vda@<0ITl3UuVvxB*7y}*j!A}xRIEF>xp7}nR`D0Vf zs*+gV7ECxeR~iE=TC_JsBZYvG(wKO}ka78X9c(dz0`U#s(2Qw@s@Sx0JX1y$i1qo8 zZ9KgeZ6s}wm?ElwC@~*I!aCu7e()$<5~n+V8n$#UfuL|YGdGnRdhB=avg^s zMj9>P@PV;X)sAcUJl`Xz&_l*jNWnSmMvOrU9^>(6(Y{*2>A{dpi{HO(Ui3yf%8L*@ zl)2)kx8vbQHlea9c~P-~aqFonaKn~C zKTg{9qm9*Ac2GUXaj#;DN-6cn%<99ts9L1LVp2=w`T>r|*XOKX9%4_X4t`q84vCdG z$9;Pf=OvG@?d_s#tpRGqm-v1s0#x7=^48FY!78Va10y=|q~P3393No08qP8!lL4}g z>ONYca;yThM;Va}PmF&qqf1Va+6j@+|g~66il;InESM0ivIu*al&Bd`@PSuH5;e&LVEg&_orD5 z5pYoFwpiew(R2Ige&eWXy-j6Fl1UZ{z8Hyr2m>DefD?=#e@$?FLr`U$L^yBiS3^k_ z$hV&Az1&wyTDybKZ;DD{M+rGf7%|E2paFsO(7HDT)2V(8Oi05ljx@)jB6UrkF;r$I%`0#u9YTeyjd8Z9CqMV zHBi8oDgZw{2$`g->6KQi_ACz{t~DZ#s-iiTN_X(t4GEXvC@d*FODUO zn8+j*AouJ+{{V({7MpAqsEuxQz61{8ODZ#xGuU7QkJmcA;Q?t1OuK56a#5`G7kC8g z{&8lLg6A3XkUoCc{Ir*Mwp7tod@XG^0OOD#f*9u>-MzHqJMGQ6Iz(lxf~EMm;>v`t zuMz+U(EH%`?lf+S{b#;g=c&3WXyyi(A|F&%1#(IM0Ef1zuaF!I2#9GMs(LlVY>`F= z8@bMPibPnpVANI+$NCy$_F%n8S*Z2Id&Ra;wT+U2CB0=DRq zs>(_pQaKq4pyw((WMk#0b-Pwl%PCh zB`-%ebzKp^A7eR25=<2n~Z63T=(_l5vH z{eAxcbFQ0S94sVdt4+$XrUZI!atM^9h^yEu2G9IXwAS1%7q0|Y)E8I~Dv}2yk4&F_ z+TD1PDQah(p)st7il-yk0DJ!W(!L0zRVn;%!w1k{DgLD6MiPyzYGN4hV^S3|nI4Qr zdyn7xX?{4BsKJ)gi~vRt_0gDPnm8r4 zO(O{5c?zaT1TgM?zJvN`HNp=CV4DYok>LB`hhy7B-csFkqstmOCNbaCeRZU;V}p=! z>y3Jxva85(`Hsg~HVJO|&$v1y0F~wja#WB8F|DW=r*6sy0Xo1FgX~ZB)>8Rn#sD3M zZBj9euOj3mEs>vG5vd^X0#lDh_U)W&L}0R(ED0k%n%KkmIKcJDKRr@}(()mm#|J+x zW5kCTImgWF*f2Zb5%2TXC=Vh|3D4#=ebu56@i4OT0OLNI&Yi;Xa&WBNTN;yMsfM1a zI+-Y9s|o82pp<`@IPb5jAyun)P=GUdfCcTI=djfWQBs$$;>CjKc(C%HY-Itme5eOBhK|<1OfTuoyl2 zep=le?QrvQu}KMOvBD2BE(73W8p@8G)G=~707qf}0IAzkMZU5rj5RdxPB?~PDiz53 zXXmZPB&CG-X@&V`wtl}oILJFC(eAuu@P`J7;C59WgZ0#TW_36OFLBv_!2bYEeDV$> z1^J)QetOnnsF8Vs4i1z}s}vTZ*&JAtlkMyJ>r)OyfsQ_>L?fjq1dM{+@#a64JvEeZ zt7QZuAd}y>^w5%+1{4Tsf&jb$0Cyw5>#U@eoT{)4eL~~VRh)TE?~ ziIA=U9odM^eR~i6?xZTEJZ#S&0&(5)52x-=(@QQ2#uQl{DCzN!I}cH)VkVLBa#{Ni za^IKq*R?MruyYx1eb)#708<)0vMotndyZ=7RECj$A-qH7$RH>`?G?|^X)kbKE-2dF z#)5L))e-IL3vHG^;L8oZ8hM@|z2xxJN=f`jxIW|4-%61wkHl#3i-lrHN0FbG@{ah( z!T$ieN4E{q3*}>0M+jDuUluOKq%reybKKxy_x*cnJJQP}aYr1I7XJV^B90;Cd>#s` zk5X7<;NWNF+nzkF&ns^w0-l1K#H?8V0L}(kRFQy-pXSKVFQ;!$bD;IpLdBz}M&KAT zw_(WR)SUij-@oam>I-Q!RXKP8D2%ub!F{lBFmcN{&O7_)Ec6l3!3xg6NK})TN3`3TxV%uam=pc*3nLdq(+J7i@OvHAMr z+Zu;FQWQl+KtMm&C%@12(?X(sR0>1MSxD`Uc~CRkO814T6sB@tyLRAE{3Rsc?FCppg`RLe*CZd*9Bxf#LGCl(SfJ#44@2qo z)cTKws-lK?mAq6Q6u|ldJqY)~9{&KJ=0_8OfIEYMfsHU5ODN@%s+K4uqN}D^J~M!h zQhd=exH%oY##i>tMlzv& zzIvdg;caOHF9^;(iR=m2v=y^k>eiweO0xPe&u^L3Xk3uNhqkaR7?H>jM{EyGT`IF_ zo#v7$lCGK$7vf`hhnvy8d0=DaeST-(zKR;DP2p;-FtiIVVyso$lSk*rYv_;ec7jMlg=6w^r6vD_w}VuXyq@i`>p(2gzo6Y|mfHC+|b?S-U zo}MxT7FA~9$NeIqhC6p)-37x&Dcvf|Yx8w9xzoD%<6AaCxU%lt2#q;7@7za{{Sj;EJl5Q5huUTR&Bb~W}2?GZZ$p(%WRgil@Tyz znkFsB<=#IOWc@Lc0MKjJ+Y;L<>tlpOu(L1)N2Y%X&(wMj+Oa4ES_2t&LO`m$)m&hD zd(5p+%8|yBHc3@c#Yf}-(7%Q;#u0IlPDwZz&#s8Ix_2TlY zAs(cLCm)|}Fm38XR3fGDV|K%{25)5wNPdt?sX`+H|zdsV4)j;_n9$k`h+ z%E~HR6{em$yH!UW8W|^wN;2^Ym|*8U`S)_8J%%h`+Y2*__`*Nf8kU^8mkH5 zCoGN|xIVsP?sMy*duMIk_npqB(3MhBQ_|9!lAsbn3>8$4!FfpQl083tIKj6qn`)?2 zU2PFl%(E4Opv2OTE(>vX$`S)F;l@j28t2PxZsVVlbZ##@T4^Gt*SgGPuZqHt9YsKz z2dPjB4o8+`aCr<6Ktb+ueNLF6u+>9ODB`#+F)<>@>aIeCQU?S8DxUez<)^C3OQlV$ zSFL&QACb$eLfOdm4}+Xz_xk7*G<5Gwt?^eHj~z>^cuO2>f-{nPcE_Oi*9%jv)RKI) zNXD6sHgcfDvnghVSu1NRZYv{l;O>#2KKxV?Pw$OMquO>Gb!n-m+w?0moKK3;D?cBY zBop}!XEk7r361GqH3SENgR=qhBR%u)tWxtku4ATQEZ&ITQV(noPmuQd>y;*>QzY8t5?CW>GwSdu%RGgn+AsG*~(sEReHdSb|~f&T!T7zZq) z0OvopwD?qC{nJRk{{W)0N#!x_KC$%QV$dzVw_xsl+q$bfTKdX+7!@sQqDKg77?xE8 zvvy3D@7#fcU|Etq<7YREY?Z=>v?EIuUA5_)#7FSNo&9@|M?7V{4m;!2DhgY*n&nk^ z_!(N?GE`GkPJ!f5gkU1_ESchRN$h)p*lNA%M^+Q3J9d+E!$>BG7?eP+OHQZNTR9!a zeD?e}&wYC{wdJg=l%h5Q@TFfmMIHL~^wwBvQRiBfp{M2H!4%RdU_b*M-T8gd-C2NIfD(fo5@~u30C$kgWlNiG(^asz8 zoaajrh7wzaT~b9Hs8*{T(w(cLQA}weSz^rcB)sz6NCUEw<{*b;J;p}AHMh@CukiIO zZ##v)l8tV=imI-P#;GU9%SO|=6=Eb@M@~q>voewmN)~JexT## zb;H+qtnxk2ETjASt(tu!Sisw`kMBFS%iQ-SxLIlHC#|k^HJ3W5aXVu;K*Jm(1BeI! z>^tP>4HVS$#6~L;N^(n-$CX<+$tz*M z%~V<0;%G^T1yB)t946KtEgfsXr7zG9t6@gLBRANryfDS5FqwGp!?%gF;l=KVN}pZ zGOWHj$`M&k0&!v(W7i;h_V&i5J+6|p$zMxbUo7>JtSV)Zf_V?1TyV(+ve?gY^2VFx z9`YVhZx~FF#%k1nOSx76I<7-tlY^2wk3o$Ly-`^&RBpcq@o~hWNJkI=&wu47)6ky8 z{I#66in{8VA-X!BmX5U+HfhDJgDJ)e@BwhrH%N#7;bI2U2SHTKN@g$7fOObU^Vs33O7n?Bjqi+zMs29}nZ0XQrXS@`&o<#|RxQGjD5a6t6V zs{P+%xZ3VCqTg0$WMo(@9n5}y`gTr+v%$=F;_t)33#IfNW3`Y0UF~S&-kAG^|rdnBSTFb zH1jQB!p$`9B8P^2tO5pnjQaW!^7cOT)e}RJtTG`5a)5)8%kl@fz&X-- zvoMN0sttE_UDtH>wyW;Dg+AoD2q@8Eii%0(9Zf zU0obBu)L*%^Kl^xSn~Pu?c3B0>dS^cSE#R2QwlmH05VGAOfEY%0La5&AAZy+i?}00(a;HXsr`BUV0`0Y-D2 z8ryQ!-fQZodditI&xs7#^9+yI-zVptc2`2WRkb#*!?9J|sHrM99b7GQtDZyrdTwcy zjae8-F&O~hfEkD&oNM3scZZ!X^`7$Q5V>;A)biF9i?_Ch*4kS-p0d?yN{iIo>uQNc zsik=t-6M#=c`CD~Vij@x*uV@mTT*EtDjf1$gM*L*XI%!k)f6Zu+Odh{hNACHJscIX zuZI_eoRU64OO(T51^cR#HV*aHJ}7E0Ru8kEU=( zaj&bWFI5+GmvF^cW|}u;EHE>K+b+ROdvk5B z+o_J8Ixi5OY>MmQ$X%R{Ob>qiK_dqNbK6Y&p4C-xvs2YmQd7!8v&m0X&QeJ|LnuWq zG2G;L2lWO8ik6z$avm+Rb5Ai8(#WzFlZYIG6inQqcUTW6?-8fv=q zgqZ}9y13(pEHD{za-+(_w;}1K5qU}+g;8}QXj$()7O#%B<$tU+X%v-DL&iUdlAbo< zMqSuOQ;<#|sd12SS&o5CR|Q{7DFyz{u{Gk3rkKz>agr)}a1@C+uN9Q{Dy53?!r=Og z7jfEeHG4JS+OtO`)~>n;Boz_Hh0l;N^8&Fu#tuBCN$rvj4H?uu<+?1kt1Zr>Zqr*9 z2Ct-!j{Ima6t)Nema^|%;RjGrc&!b5=ARqhBR zg#euo=rs=XwpgUy7s^^nTc+T6ORXIQ~09($~f$Pz;3 zSIdp7y>Gku>Z05Y4T{NsjwXU(bP&rSR1F6c;f@MN5%^S}4Se2%Om`j81>)Uis1+2| zFvkqf98wc2G$2$)apHn%5E0wW$%K8fPM20uk1C_?TS}(IEY%x|*>$R*Nn(;W5Uq65 z#$o}3#9SsKZei9g)TBO zM-gglO~8)YPoxiAG!BY+qjsa{#X?I>;yHL~+d zU1+{gRMl5nQl6G4oLl6Oyh+UgG6Fp69Jhyt8Acc+%VE1vy7^T<_Dg?s+BdiSHM03( zqoDC?EZ=&64&z4Q1a%7(#CQx0i6AQ&W;}}aIncSSo6@57K|PYsRR-I%RK@VM^)N?L z*7RJkSwsW|!=oa*cOyK=Jhgl6%Pmsu`Z}7O*>R)1Tj59=3ees>P{-y)kH=zT46Vek zVneU9jGDM^Zl7B&SMLh@9W&3~C#9wE){fUIO3RhhEDl|P4xI#<^gsjbEr zL|dxFdw$uqH&wQlsb#j9XRTcPJzODh!Za9c9FHqNia0pv!EY|Zy%-n%ZqEcFRes*K`Rrz$x{$`V;ru;8wq zZa6)$oO&_6`+U9b`=mE`D{R*Ewm`J-)~rTTSY1y%OCd}uuBBh!~p{O1gj?r+482LC{cV*^J zzH@{Wy}}4-S*52^++>Wx{rd(31Bu6fVU%qo+IvkLs(y!Y z+3Ml8)NXCXMI9|GyUkXeV5L-8r*gU#FpU}(zKXfa!@IfVoDJ!qKw9} zWfvpA5>KyZJ*U>XtEbs}cXZz6K_s`BEbVQzu%>T?dMRa$Ni?`Qj#$^24%i1OJCfSn z6mEox0q#DCp5X9Wi+z?alv|?9W3xTd*)7V?8YFPmQ~BN&k)J8ui-_E}Z~;89Ljj$2 z_uuzq)-B+>ltM)ll!~>D9(4zoLCCZz|f|{O?Ju{npCY>s!jk6yGfmku{ z!2o~<0qKF0TBzL=r)j%E2G_RSt4^kUo3H(C@hP@-<}Iz@&^0f>UL%R;s$ff!3=Tqr z$Sz-wO7;M1m)ZXS_%b@Ne7Q9(#_4XbPY5!s^;L@_NCEYYDa@EZ>oC_{SfRL4+$igz zmU)b@M^`j($0Th?8FImtxhDa+2hJP6Vc%EQ)M{AkR;jLG%b-;(qyyX4Po@vhogtc; z;}p|LkB&DGX>oNw{t1X0#FZBww_pB0Igyft7&!ZJ23|+?BhyeT{{ZkzbpnyzeXaI^ zt@94cEex@~4s)I}`g(s}+Wj1g?C{(1;iU2;mi$G%A)rkU-sH@P2)$_SL2KKUfAMqOFFZ>}LYfZP(dnVJiQB*WrrfFcFS63!9r)b=OGBU*D z2bZ8ex@>xxX7Yn~`6_H}X|fRi0JDeK_hwdYh<7&kslD$@73r#KAh*MGk$dAaM`+PJx1r;wYK)9q@ksnY3fSnBpkOT z9#W;o3FMvgomBk>mul`>o2KdAdlJ_!=d@2uQod?FZAI7aqK}W zjJ@vMN+&c#-Ky5#yL)PGSgspB(YH4B0>f|n!Yi<{)59e@0z^{M1Z0uqQcGkUVn63r zBUPT}+V`4$>uE}@$#I`+J)X7d$&QVxC7A-EvpI}nHZq|qF^&fWXCc=4ewO`Kd^iF| z&B|VU{69mNckHAB52*fQ_0@H_HskLat-TEm?cj#Vbc(u5ofL8!N{VF%#Dm0At07{s z9z2N{&a{I~qxVT~KLnLg)eVKVI`d)Mojuw1nhNT;C8W7mP&|-MzAN(_)lY{fm3yNM zfZo0Fu7HB8<1Vo^bwUC{JS@byR3PvJmRJyZcF+Bq=ev(bq}tzVNVlEt>r-7vxl*d> zM=f$9RGNlXM}hb+4sn*{*e+KG0OuVEZG-qw)NxXCMshW~cv&LdR{F~YWkIHnt_0yaAL7R3+MM22zr%Ef*O<4BH?UF-H0;!q` zI#q-y3QLti*sov*Zsh#?=@QjRNA{1q{{UrZ_Vd#2>mZJ@+-|n{sXi%y3i8b)hy;-s zq>(`*mK6x}Tph7=`>2*(r*EOU-f5Bu=$g1Z)V?gO!;gf%BS>R)E9sGvyh$1LA?5Aa zSr^Jo-rLHG(Q_8so0j5^s))1_)j^7A;F!t6NYvmK9*l4pdkSg}kgRY)OtBtr$CY)w?p4;iozCYKb#2mFURh;lqyWh;jh1Cz z10#zrJNm|P*y-|$^TIoYJq0wBwQ8ON)7L-&9GP6>2eTD$aBxNka7ZVOHm}LKz*XS- zEs^>K?EOf!n2jWK3@MgU$mFWX7a(!+kA7KW`2mkzMya{m+T$ekw6MfM;GTq4UU}GcXt*Bi!I)$h-$(uPI__KN2A|&ett8cF3goXkH#>SYuG&H*kRC zKEJ17@*0;*EhRs|hkAydu5yAi$be9ign$48@dAI-Bx5H~C~Oq62DMD$I);)sWT*hL z5}+KXU9Lpem@hahK{rhRja{QDoDZD#i~By-0kC!3yV zqC6f;>dHN^eStsIL#ZUHNvY|orV`B*Qb-wN;_M^w1AZa+gT@ISgp=H0og0xTr;44t zWTSeeD+@7FFtPGry~mhf_CCJZI=4l&)U-Bg3q&`#sp!5QGKi|2q~rnQ#It<;@(1ax z==WWYdz1@Id_V!`+wlCm{@>Fu#r# zS!CiEsf0Kn_wyfI9^~pWSBzRV%1R?1+_aocJ!QeEoA|0?xH7ozNx&elrg7Q7PiA{} zN-Z@_8{7JmM@vGGKF!v>Xm)E$XcZrqdF zt?x})1xVtu(xZGMf!r#wAfflhN4f8yTbHHP7V05zmui|7hG}W)XQUj`83O>y<%U=B z4*q~@@~HmJ+b&T>EY%3FKaZM!EBKtToG-5-l0o)n8TZhM_HC}uCFboO^R@o~Q(fO>;9=TlcOHEyCt1{Xv(5QK1o5hw! zfFO&Bl>itYLzCQ(mw8)C#dNQV-}iN{5e#vfnQ7%#2!)9aC#ZQ2RDuZ^2h$@~A5l6^ zVKf!JHMU1tN@9jvr9C>c%+oV}7D4!YoD5hh0PWoeY>uF>tJv`+46%U~#&o#TDpWd5 z9|!})xF|+QU9yTEi$TCzM2EjQ8-$`51G7&rCj$F+}2ZE+L}7Xv&?F8%o!Fqql`!<^%CdB zP**B4%rHYR)T>_Tq(MztTl^1z5=jkJwxy$g37ENK225pn_X^_&m&+g;+LSf-N=mz3 z9bGLIMIyX&!yyHvrz)z-vN~b;g>%QY8;L?a^zKRxi)fmoZ!4v~;~Z|j9eO=1RY8=o zj+DH97(!W;5~Q~PN$fIZ&3m>qap;g58ZGN~?v}+-aE5AuAg$a~3&JUCB#s%3iUDp0 zLP1vV*}=)kKILxRdXH#dDR#w7m9dqh6rLJXBh3{=Lo3X2ZxS|kc>pVe%m8@jBsU)G zqobAS=clQHNaLkyMT*{@Dgvn456dP(aD?L-IAuM~w8Ob}t@2qe&uX|^v1~}H-BF>E zjxt$}R~UXOSx^j~=RTt{AX^v`G?xDWlm+&7gyDI;RZ`K_T&$AMQ*D{!6{4O)Pay~x z1K}KT_F`E<0S*d)Mw0sJwd(F$gznn9nmS5K$~%2cTvSu6(s=x1jJqlCEMc1^m>eF% z>dDc|?WU%yz^J-g>L~6d=;wkZba=~1!Z}^!Ah8}*a~=ZYk?rd%?x=6ncROdrMk*;G zjtgQ-GKt3m(nO(~mxu{vOnMA=^aoj?kZ83xTw{(wuhZn4xXTvOS326a)z;g*V%t}x zhDS@cE1k_M-eDkdhQ}f!TxEwPP(q9zSk=j9xL$01T)s)SwM3YTMlr;%uY_2uqKsv`oMcPc6%`iiHE!9t!Fr>%Zm3l#E;jnG??WV# zVL*+DV9ImLzCxp~qTnT1cQxjQl9X*L71r4RVz&zVRdTB&U|_4TU^0Z`k!JIglq3yc zh8IH9u-F81{{GaO_t~@>$!pxUYsy)#+lo7Uw%VBKr-q@Vo^r|f;}OM%F~2@pCjq>q z`W;;Ny@UO|=%o8*3))myM^x4Hl?4qlI5+|+6^Y~cc>>2cTzAe-yYA1kH?95)&9aUm zJd`qgMP3@FK>iw-0c1IH2b6*^fVY@>I~Loa-VlRHECRAW6`^{z2usL_1Gxk&gaV_M zMm)obz~!u(y>p+_)J08rAf5;B>YEmymOCJ>9j&%pEEhVPJ=UDVRZ8Y5Qz5vK^&OAz zqE`BkGWl`|0zv)Z^BQ{Umet-j8?{F1y=`hMEiz8jCKd3ab22VpF{urM-G^*?0jl;| zO8RKf%DgbeRDs_=B7foa*V44pdqgdGA^^WYK)>s<^76B#A!q83Hwvg(B;>^#3d8XX zeExbGDUl{+?D!;-t&h;>MQv1){0rPBSi}l^Cy+OrkN}*ouf75FIt?v)!&R6S$07=G9YfdJnV1@=< z_$k|o=kv+O=yVn34~&929^>Vz-D!YQ-BnUskDCg6<62}#SoyXx*aPNuu2%;fea5pD z4ESg6RE|0J#)Fk%df0`LA0Gkf@li2nn>#Sw1l74Fnuu^gv$Ok^;j{W}tU2BiFUCvt= z?lgOaTBWu}5-DIiV;`rsqsWfV%1<61p!$t&mE(zci5HI?%rj|+G!?rBfnwXk=OyK z1*v_O@JM2v`+am$D8Zr;mgUL0f$!TvD45mU7M4H7ARKaiGwGu!r@<<%%fdLw^e5@6 zB9(%sQMg%RX5y=n$3CB361g{xB|T(m#gv3*<&p^R@89yz%R(sTj!snap2X#I=o{Pq z%^#-Gp!U-hrlQ`BO)NEs#*hY8f5OMmjQ97_RaCw( ziXcV+&+DnAh~b7jj!H9;>O1Gx+f?}MQjIxQS&oA8vQpCJCqyA(bA^9?Ao^hU`hqm0 zb&KF8T4`gNHcTlFpcVRkar4wFTb*Lgyec0UCy_nINI3`CpTHL6&YIOF4Gyocw3>-%aXwrZ<&SW3iG9H6vvA>@ue zYDfO}QLPm$CRn3lK_rj{d;00Nwn=Cz)|TK6MI_3M>+T0`=zWec^!)XuuPt`ey@0mT z&>|rza(OFY517;Hzw8a=j&anGudhwzCRX!<4TQf3Ci#iA*^e40W;M9tsvGEZj#P_$O0!tqqU5 zlN8a&Rub6B?UABzR#2?o9I|7#9^>EJzJnz)7}B8_H+&vU2W)@atrI*2$#&xT$7AV_ zO$)%Rtr5A*-~?H!Bo#-Td~x_#cLaRF)Y+?ZEKw-)Due0jJ@h_~K~YRV0op%R9;6?Z zq);^_Mj~Q)Cv?fd$@bEAj!0UYEP!Bur`EL{bUY<+j)y4Y)O^R~s8Gy{J0#4Za66Hx z((sO<$E2N#qk5_KIu$rb+>ZRS z-#)&&Ej0QSa+2-#VX zs3hx3z>;JZ&k%4mX(lun#!g0CCs{5dWl&EZKI7k8rd3mk8wcm_tVDPRE08@KRti~e zR@Yl;K+hC3?NWIQ}}Wi@+TxQ{ST*Mr%P_m+Ey^o($i8`+{xhZR#r3 zk@fm&R_UsJy)<^aB?To_GDIFpDa3{0kb~KrHzXrHv)@3Xth?N))9(Xqxv#2+morE5 z0Ftgx?ms2H#ql#nk>k`3P6Gb^x^TPG zd@XxhX81Pnk$gv{Zb;9MGUO5o2i#-du+bf#zUnqyvd1No-EpFj%QG5;G8p?Rj1No< z0&q#eI2p#8^CWCNCfmI&EP(HLrK^A0lXz9C-M3|9Q_Vbu+l(TjCeNYe3zq)?syzpN zSQLL}O`T<VA!m$GFwCNwhkha;ICYHyxw*bde;M z<+o2%X{r^JFmWQ6B|CsTgV6a%#=hJ&TQb9Fr=;I|&d_UJ0@TB3K-F=UVxl;e<9d)e zILdfxq>e-nZX6ybshU#9yc)$bkeJw5(Sh|<70aX+x_US%_VQl73MX2DB|HnlF&Q|E z(VO)ol5vyjK;5&nUfR`BZcA+%Tot4c%In@N61+KorTs)Gjh32d5*BP7l%h~5}89y>`P6-0(zeO ziN-jMY(6iif!!%*Ztsbrgv2?dpI0T$lE^B4_>M=XS9j#VuuGu13q<5$GFMPpLY*VdYfMrp=zx5zXfB88?*T3WtB^VClZ5* z1O@aU=g^;LotLzB*3yljv(r~l86@WXW_gpu$A0WdQbs#xM?Z{16kFpv{zm@*OsLpP z&2W<}R!z@)+q7{>SygcrylN#u5m_2fUkvBD?|?n>GlA)-HIQySt5H4Lx?7w+3Ouzj znb}Xpw`Nv|H?No`91=KZ^139dg5J$ff27QEHe!|$+;{i%Be#CTRmS~}*VIL-*xNgD zQ~mV|iih#hp^PAIBzT-jW61viE=Q(y&e8bmrg!yOP3LgPub*$tJjJ)-l=l};t=Bts zE#k{!g5xc1G*wk|{0vVrb5Afu&RCIw+yFjageyU_dS_1pec?e@1$2_KG~P6g2|xh_ z5-cBZea1e$h0oJEn$DM68*Ft~Z`?0IaZ5*YvBeysjvqx52jJ2LC6Aj2qI@OE3ePT;F)A!A?}r0`y!m?JpGahweM>IE-AXTDQZ+_pa8UBOQiD~L@oq^M*( zvfN~B5I7OrIUxReBXHW+yCu=D$o~Kf2a4$xT`gkg42(H)Qrt-gJa~^m^%`rexLG=f zVB5ADit5Tcg$8Z)Rk1n$04tG$G-o+NTb6T@04{OtHLy(P)fJi0wC0rya_L6tlDEcz zDOM?Yk>bzcgbKlY#jrcJ0Kx7^(95?^w>`QEja{kQ6i~)g?!Cys2i*7hduP+Wx>C01 za)#kuvv(vhTxspJOC?u@Ma}#b-~eWkhEE`*@&~YP=eCJan}30sy-tm0!~ITp4zdikP%@h>DopLks)oyKwNy~bWqIOh<^_S{<`^Hh&rh4`#kMJ)n%{R=Qd<5=6?Gh89K@0pYL-lQ zo{plj)ijk<6zYnGa*@gx2PeZ0$Je*G^w!2o9uf-+3Lj7bm=Z@8 zY#!P5#&w0>iyl2OUo=vejQqjxpYYeQpW&%+bJ*aIQR}VsfD-N%vBMza*U1{kY1pvcaNS3?{#d_wn)lpOKz`D!ai%y@~%%s&slm<|$76lKUb z7}wITwn5IbULne|kV(cs&c1btov`2^P&5Ak4Mbg*F{g9*d-`_P$pZ+(aTvz2;L14t zduwc`C>68WPJWuA6z3{3At=Y!_1B8W9Q4oDTWc!2&VJjf)`uZ~gADql&3RJE_AAfI%b=ZAp~Oxeo*IBz`0R0B5G1 zbd$E$gBTpU=eBS>pb_nzYe1m0zYyOc_>MlhoA9M#GgLS|f%119{l2<^D+uuJKyLX~ z#z&{Vu8CK;0KAb5qbE4+pEs%2sT~&?Vxd2mK2U!z{ZCzMo~eTcGA?o476j{CA$ZA> zSn|Lq131U2?go83{)1A2uu9oaNYx7Uo}nAV10JkF@A(W5+-qyB6lw~xc)W1g$;auR z{ZE#?xl~h8JXZTxc}MdGU|_?c0ds0f(A$XD)t0467wrdbk_6_<$-vXoTvjCKS+V0_F@bCa%KuU8l$m-Acn`gf7Ol`nClu7=qy zOf=pMW={d6Y{opnn;1Cd>5rebF^y$MIHit%f(=zO6bg9}9s?oC1OgX`I6qvIs}FtJ z;ih_}RF<9;Sz1;vl?WMmFE-8_kZc0Lwm=vs29Ad9@HOoVRmvk1j3Iv%=eL_607tO@ z01upx`mME3@|>q?X?Eqc;isy(7Fd#B6r(Z1J}?w=Aa>+3K|S(FIMf@ZO|Dd_hNcNT zQBdL|G^7~fz~S7d;=-O@gy41uB#pAvTA`|0DdC3qkD?JrhvrJ)h$xO5;bN;;S!Zr z@-7FiSY+gpj`^<@BK|Z6f!O&>!Hygb0MI2QRJygt| z3Pw~EU&oJf6lW*c1D#%-MzBY0>9vVI0z+>5nx1M}l8lio&PIFV&Dtp!ACdZ+mQd2r zd!|C$4l0nLrl^v^U0DhYQxp!scTjr|-$E_0HC(15dmioO?Vqlitq)a6V!l&TqLEcj zi#H?(%B{>1pHIS0ep%3~1tL#DRPqPRbr68aJf%)~1NF}ge!r>it0)d>MY&VbL?dMm z%FJA6KdJTa+a0t9cu_%cr1!>0{hr!u+}77gIfozPgU+V|KyDeMY?sN12EpT^a&HF+|i6 z)JU@)F;po79)sT>r)>+JS}8q12M3lh?d&!3@$j-)h(qNW)LCUY_4oJDwGTK`IsOQP z5(Y{3)|YZz`Hy_|*U8C{2$Q+``s+i6SvazlK7<~}P%5P^o>r-X3W&SwwHd5PeXV2h8r}Zfl1{j!^(h#0D2r_C;o7D`Ly->WNhv6eh^qI zA%IiV)z?iCghtIY{uGk{*d|UAP3B|i&j$nzbIieP5gS~SF37cCDQ)$FrbzBHRY+h| zK*8Wtlec4#d8ohu`ZuRyNL;q{%C1_gbrlQJLs=A%@i67E!;kal9r<_v01YyACuHt^ zmPHo|YKN+`T%eocLNs^k_gLknz0!Dfvdd55fT3jO z#o0zl80DVFIPLA*S>%+A`X|Q_HVWo_&#`{&yQ)oUmW?8ec!~^;52!gShsq4HtX(X(YGGHaj zEJc6?SspdY4EbLp^_c| zsqt72Wk4Y00FFr+?VoP?v+6DHUw63B*CNR!G`=k112l1GfKUlhmR4?E&V3GsTOhYa z^n0cXh!Ub0eghFoUP^e-F_Fdxkz5c5fA48;)|WK3$~FyzI@E=wlG?&aYBNxk9OYFF z;i>Y10VluuE9f)m2)#ui<3#sF z9h(Z~=vB75woA>{o{eg8@YK&5F(5B@Y%>5D@{Lbn+XMBrE|k(d5ycn7!BtBbQt`)x z0pw(4D;Pd(_w-)mk&kq*vjt6Ll$ToTg&oF?YsC#kJuOr%9MUT+zF@2dLnt`o*!m2e zT(=s?uXNB~Dyv?m;2KCGrwGPHflS!s0_W3{a$)KM@*o00lEdh=#NEukQe>9te(S1+ z+jK-Q4#P6f$@zPjQh$F#xa&$$&gS zP~ky1q}Q|s-+7gb15;)p5zjsl?OQG--u#BK7_X3x!bO@%VV`w zNkvX0BArk=q$ndCPy%@rQV0W(VgT+5)k->qhl@>Zw0Us3`oE^viaM!`h2*1O58`eS zfFs0=2}K!FNWeK!k6e&@92cfryxf(xmL+CYN`Q|t;CiHsfZssJIrr7vY*iP! zSge(`3nfBxm61tU`FWg(@_eJeZ0A2Loe8i*O-piyj;5W@7Lb*Ugyy};;@;Wp0ncJb zwl#6-VU?L`j+yN^;Z_wrH{4Wo%TaN%Rj~>Qu-VuYnV@kbqDPP~hPagD3dE~1 z$RK8Ew2fo#HRyaV`DDx|#3b89U;;@U>XV&4p|?e;ZE)4n%UvjqYGkKT*<>N(Eh7{R zLKwj>845|k^w%VPt8aFzhV87IWn1Q5ruW3Q+oOli8K$8{rSS*%R$1P12{<@T+On)$ z?|0jcyQnnpYq$s@r=G##LkvO+K*m*$seu`gxdHi-KtMqOmngqyKA!cDaqsGF*}19~ z-?k}5WYp7PgcEqHBdgQ+tO)ZsU|+rhoF3<0XkrmGNLQ2AJ)Y4dF`p=LuaYD73f&d= zZRdO2wf2Umo#(2o6~bAH(bP1Ns~#dw9E@)&0~&`tmzFyo@0X-hm&!$|r@LHfXHN*o zB9oq$%`BADUFr(X7DGhyAshfIrFf2A`1irVBR-=_JF|96w(J#kG1J_s>8L3t zlZ=hY)leK955l7ZuqV`Z({9(>yJFwCFPqk`y1#JTD(%$t6qfqgk~%mk(FD;dDO`z5 z$o~Mu1;`DIcGW%A>b=H}EcWk=q)VeK#~jhK#)=p*hsDRIYywCuJNC&M!>DUo&r(*n zcS!2sDu$b@JxJaO4Gdl!luK6}ydDVBa-p)>kc@>H86LRoy|rW;tuscqsyga~3z*R& z;Q?`sVZ1;=!NKfTKc9UlNz!Wu--YUH>Z;PFUUO6>y_~{i$t+nTLb=8U6!zolJ#>DG z+fz?bMj0xuG(kB>;!&$h5nwXKat|Ij!7Lk*C))?h%ejQNb%oPwHf2t#u+`F0B_u*Q zV|V7zR4z;o-lb1*k^=f;zkHAeg{iqviDXLZioY_2hC~jrAtyNqpq|7peCPK7%(oE@ zHB6OMa#S?3v!qg~D$EFM1|)(HZtMmRwt?KBK#6Yfr>Ba&)cET0G;fT!K!lbg;jjif z2K4}BVFZdm^OZK!@s)@gS!tfTxQrEEE0gKw820q~4_y>WLMDohDX3wbs8-^!m6HmY zCyqVW*SD|BLFg|Q>PC{&Xo{{{_iSaT%Esrr5?qB$5=KumjC*$^%^+C|)Yc@FQ3{4c zSC%E>#k&q*2K6JhPqE3*YkNy@s8JbGZFFU6qNt{=rjg>Akxwwq4oKyad-{)WU@fb>ELcBQwIH1Nm0x{fVj^vU?qroN43vFUmye4ApQ0662q#xx0fp;EO0Fj?h zkXPUkimI`@DWoKoXR3{UZI_?QY86BC&FaN00qh9 zJ;z`$ah!KL2XRVs_)gGFv&NCEl1Pq2@>vg}f#&bUP5=iSbQ)`XhL~C^ zD&m%^s$=j=EaWinmVtwwN`<`0SPVJGqZ}~SL}d*_ZKaN1hO1fQX#r^wvFXg^n*^}W ze_RX=4BQko6K3NY)IW{RDb&d-2>i_1Z^hfNBe$sa131Y3YqGtzliH5yG#3#yL0Y-0 zc*h)(ad;O#haljNzzlr!D{n`4r&;MLFEZCe9hc$X!xNE$MhdwDJ+cl@?b*hrXshay z-FYN`68q0a+v*bLBVzfdmphMNTj? z@2pOUv=Q5os5BwA%8Ql0S!-&%JhW`evB;{iD+84SxbCMQK9DwcWp%#LVPKT zDwCWuKPaD&X8?8z21)fKojc#|Z})4_y&M#f!@@RakjX646a$tBASvKH!~4v0?V#5B z`k3fNZCh4HG9yAcLdF~fFuKx-`r$qV3J6m){6x$Ncd?~ZS$k%uYEyGZNhpA zYM7y5KZo%|Hea~pa#dS62fr)=NY718ax*-z*R+(h_Ow`hCI(4e1YpFZ6=m`xvg3&E zrwX~ol=i;B+?%dT<#pNOqx+6FsG)%aG;+(`_%Q>q9vd%kam&mz=zgllOKr7OS`ET# zYMMn+SuC=sd0k&B&EFl4RFl|oBeB6BOz=Z1^r6z5D~&kX`U%>})SHEhIIC@HrQV#? z2)tv(ndOlQJeZJJfq*%7&!=IbTaoVD!rwg*^RLMG|LXb0e;o`8#Y#d+%=3|T;k?!x@vd6XR zsj8u!YirpIF+57I%d|p9;=lV`F(Gm_*4srPFj#k$$7Ss)Ew)|8m+LG-uDV-x z=%|#}M9yTAK^?*{>~i^T5-Vk&9w7A7T@O_@-q)vwn|NC;dsZoGA$ofIibo}yq$^=j zu5e~J-9|Cu@W(JQ>NU=H+8d3A!(v#dqpM5Ye-P3;Ge(Hy1IUG5M-DT<=g2_-3=2Y zFQqo`wy#gFqSImC+h2X#SsE&LzT94xT4qeVBoq8xvX4(P4(dn%9WSOkAF6Lq9!Jr3 zgcdj;riSlsx4lwSF=t7mNM>GKNmf!gs|H0QCq4a7q1}3-nx#BySVw})RgBc}w2I2S zTaFn>D%k9*q=xK$^~qb)?b+1ckZ<`muUa}QcBHpd(5*r(vba=99L{oPhIDQYoP!V# z78wA6gUZa1ygNw>S}GnwxVyB^%Z899YKYVhosLjItkJY>`fk)zT1h zkKbuwwR(% zO0;dn?gxRGtNU$rGZ@#IVef#5hbCcLxAtwtYsIR5FU}g;rYk z>|If%hC4jf)OV3hC4V_{;bHu;M+(KZQ2dRE!NPlLwBlJ-m{ElX_bR1;;v(2pm<(@pT+5n zVUKfe#@iN;hc@cF#PKSu(#AzPGZWc>S1!lOa)_rr`}=4JY0HsrqfJ%C?`|vGR@3kz zI$KpAk6B9;af$1KCm=ZtnBAY6yTjaMIf;m9x*4w03a@*qeL-Es{VBaNKwQxjHvB}m-(=aMo7x*4V8MUSm)b2 zl4=7bER!Y4De6*kWEe2Ap#h^N7Fb9*bHX*r3*MTlxm;~K(xvw84P{!S{tNi@?xG4L zmDENR(ZqT2RRpe}f(ZmJIdUyO+9!BZ+^-YGc&rrHKOVAp9FtGuBxHh%Ben=DA8h9U zYdbB+?MZUC!+P608+ug1GXzTi0D+YfKzo2CU^2Ww_v4Id-8l%VLFE~>(;Zi^$u*kc zbK4b(Y`H@WR99<5Rx{I1$Ri#)y0KWC0>6j=zyaSF*CzE+k8{+SE4NP1y)ws6lEHL( zZy9_s#bX|9Do2pR$U@++)N170T_gK*ZwnkWvuz=5rlgRxRdu%yy)Q`9oZ-Xx789tyzl3K#;XKG`|q9nJP*`$i`6gQnL#qZP^0H>;$t z7p8l9LOh05XTd?_0|i4ID93T3ul7RwLH+YjPq#L$wz8->#bq_+86#kElI&9$Il=Bd zhEA?X;IE^$&1V(MNApwK^e;(pu;e`_)$CXN~BIC#7OgcjE6Z>j`dUYm#bIJqfxvr zyTxkS#}tDcEj{U_^1-oAq86$CTZL%6A@p{%ymqP$Hh z1fjsm1~&ky1QCF7?Vv5DmjhuRdLdOk9om=vjD4tVyHd7Kh`3TuiCP9_Nnxm@Z18T` z1tdMkZ07`y=kx}XeAx!q+%y}Crjp{%9UWagz1~=!I79fdAPvbzR!p%*%W{*k0G)n* zQ0{1VSK5DU-CE7?5Y$OeZKtO3R#1jG{1jv*R1wT_Tmg>Q#s<4PY;BrqZNmlK?fw~t zSn4A&)zrluNJNW>Wmzz!s8D=_lDxdxI&Q7P+D~wTCeSt5qU{Mcnvc7DQMYHU5mCie zQqdGoBRU6^G=VsF4nfWbe#8qqXKqNU(%WO(H9r#=EWry7VHEd3&N6Z4!TAqwQB&>> z>$t796Lj2rE}WXaGKr&%(#a|ic`FhYMk-ZDr>HIXc!DOksS)&|qR(At*^@^V&5;dK zlPygfO%W*kqmUL-!a#gLLCUbm1$B$wcG4Ds?%M4NOND(8h?3G16CP18B%uKMHaiZ$ zW9yx6xl~V6PQT>v6>v`$&v1Kt=RV`pT>H}Aqf1pwbZXth4bFn5MO2ENW(iK9b}U^% zRwI^24%ivMIW5g_yGmlaM|7H^il7vPz(0hlPE}-JM<&5yPBW0BBSPrxVJurpEqbcm zRIRQ4b# z3+3CoX(xVCMNZ*HBx60^lUO%yb@Dn({c3$m#3 ze8dcb4{?E}+Yi~6?{DgDCsQ{!OEwo!V!K-!EA_WN3P9?pBasZ~=_{Tjw`D!OPIV{k zif@1W?H9|nn{&#uP~53*RcMS=W~LJ_DEkH@E>QR4GCgtFy?vkhmoHE{Z)3h~8meo# ziiu{dnHfy9^9T<(CR~mkha4XLx)9_EZwCodJnh@uAs=O)sQsQS8xG}t+O~>) zw|uJHl{9rbdN@$lij!5CY2l3q82~5&QN??LdlRHf7TLa8w+`+X%k95xOLMJ;JE^3% zii?C3K&1ji(_#`?SxIuQfIE8xXO}x zIngL-Xl~PPTdl(96+}XvudArW~)VEgK=RK+CeG!V)FfpNe`kgR!eYz_kh8gjC9uI)YEirICRDB~_TIFAb~N&`q(sn0O1 z=a+A(^vNB;T}`wu6ts5PWsVvQqRSJ7RgF-pN%(mVOad~t0mG5V3K(o673#aX6~G^k!! z<;jU|;QA18`FiVX<;9|>KN~zuTrmw#8I6aO;YkFX5s<_Tb|dMcGqh342YIrB(`^2u z?i*!AB^JY}uwG$~7;MyUNP&OCvc?O39S?kmZ~R<3o|f zvPo>`JVre`R$WBv6}G?aH`6Yk*=`iKcy{HQx~p*{GxJJmDkAX)2+F*Qk)bF9d0eUW z?CrKKC_3;HKG)xK^@2x^kt*$!7OK>aXzJ#aS5!@xJ{v-=6%o;yu))hIlVIEa-%LPm^!7h9jcuaa zRd=e1s@9v~<%XO}S0gwp$CoA^xa52G1a|d0`Qx16c1UWLu_+l~Mku~Mz9)i8N{FI_ z5huh%Q5m?8C_cCzPX3-{?0uQ8_7$F()A;d_)X4;=m_taxQIslvCT{a7z&Ir585)&x zORwEfK^4kpcXW-Uon%*40b7rk(MeV$f-(LTj0vbLOCqQzwjb&;GoupG-fnd% zR%xcVEE$~9jAi*mKyF$2vJBvZgYBr)l@+0yeSn>0Tsq4nsuekM;1H_f$9i7_?$AHN7SJ{nbw-yO)buAoqUz@K^;vpM$;L| za7={wtOfxJ%AgVKKpnG&nE~?lRv`ffbh%Eyc~prloMxzL<1yvF7D3HqkGKruo8%8{ zpI~(=wvu}42*q?Ryd*L~C_p4B-MNM%x28rt!S%+r(?NHMZwVFMs=fv|O&d%P1B^$7 z1dIb4pKoF@k}|JgO6rQrx~jU$zl(O2=8j_{ykvl?JD+m$5=rlt$R6}rW6DK^LYQc# zC%Z#O4LtEBVV z?F|hKQ&mv+z{>B( z1CK6QZp4*bmO08@6I?8EQ$bUszSX^4Z$}*|sh)8ZtUEU+#}VpJ^v-kg(*j>1mWErh zLS&FgVS)K%u_p=%AOVxik)GbiN$t1ht={uQ^wPrx!m+9*g&)ir-^B+6mf{b-F_1gx z&CB9e!B1+aiKCXJ)4fOx0|`c0_Ra?;Yys_zdTDY%*yyIR#o8l7b-FbCD=s$p8XBi( zL@uBpP)Q&ssKy7W?esb+M?D<%FH-PC^3$wxs}>RmK&qsJ=yA+0bM8L4K}+1R&b5w< zEC`IXS>#n@kz8^Euo!i2N4K*M_{Q38!$#Eg;@Hgc)KagC(Zz$>Kv|TI;Ml9wJl6lZhM9gi?)@>;`kDT1qFcSZVIWO+(?t zOe-KRAGr(aNd>#-)bJx6w3WAHxJz!LhTTpPY2$d}i3kqiSOx4)eEN`m4n{!M{kM6p zTG*ky+Ks+?7gwllwQkC@H=P zm*GB|#!_ z1Tii6aq2VJ9DU(oj5R%cZ1ppSYIw(s$hjmcs^sxJB*`Nf&NT+akkijCUAF62_k48- zt=O}|a&o60ox$S7WDq@1eRY}RQbq%0X!!b}F@jYk)Fis>`igliG$JpKG=e(y23RAJ zgK<&BWf+j&p-IC63G~V1(R8*$G>pb7q2MHPo>D1bM4gy^%rK^wb+u zc3kA7y33sv9N5OXR+*k#z4|O=;)QY$qeSj)HrLWqhM*N>td2g zjCmc29$=)9jo1Kjldis#R}Q>XLWuQCdrWyLdudxX?KJmFo5V9)s^gj(XyV!Y z06TzCp3DbsC$R6K-AJ)j+$m}%H5S{wJ!G`O1 zFefmTj#Vh599h$fu2-}6#&G6tWP#hODyw@>$yD{XSodA#?@sS=yU}gx%&o$eLsrF( z%_Ec{OnxG_63g6oBomD{S*5UUO|u;>Wv&=*^-#@I4kb?!;wVA|Ef_+eMqCE~5O zAgELHn|xSy)wUg@z3uODjyYPYMYv496L%;gL|*@g0W%H5c&tP!JRvn1ktkhKZ%iIy&s;xC5rHafMWimpT zc$8&amIv^T<<#V09aSG_wB58js@~?H)+GW0(;&oL9$dn}qw~K4(XD88?V8CO*;yDyaz^EQp13sYXhkG?f*|95D+Nq?aju8wJHAKQ@ zPctAHWhO;(svLq#DI*~2w%psLY@5cOt|_K^rivx!Urdlj=eoMAp%gKb!vMJlxB#4t z>H4a>ZtiBMprhM!Ne6e1LliYJhC+F-6k^JQzCcm_bTLv+u*s)!ER!^wxByz9Qtq1j z*4C#M7~ZPWa<)AMz|z28sTHuGr-%S~c}z$ooN+ig<)r%h*=X&yy}G-G>19acmLg1q zmzc&vxKz&|V@@X+85s3A5UDpsyJT;w&YaWKp|s0TwDpZu97rR9)fpmZVhYHul_Q6; zp2U%*zP@f9&27Hfs5W{u6!zY7Nd6a>^^DjrW0gpbRQGD+a1M10N@hzBPnS6u7T*za>}`b)*1t`SEiIQfI?$X8l~w$`MSs97hElL?r(U~}p-+rNL<_s(_f{{V%a2-Z2A-H>GIS$YQ(G~ zSb)X{Z>RX@Uewk!bn6nb`J2STfG~YOz?^)tb?C|UT-v23N~wH7By6D*+t3q(f`2VV z_=cKLLGrVD51G`NB&JGn5j=?`x3*3@f9id85}rs_SW5%JSQo+i_r|M?6>5Bur96{G zBMwM7fDUrmANT80=fYnvpw6R$XQ(_*19N`o*aCmysR}t`zqWDo(4T^VN}|sa9Cl;t z_1D!=VCUG7PBrB_W?V0z?Wq%|DA*rwVWpBnysRUBBOgBc-iJ9Su^-o3<4~~xq>@0^ zOv=6S>)S!fw(zr1zJs=XHGy6^3`ryKootQFiO3vdu?GWK&XS0Ph<#2wdV{DrQt3u< zgOwvW#4{WSS$suzkg^=8A5)EMc%>-P z<%u4+{!#Th@dT2;FyLTz$;PuqXOv4LWby=IyY~M8)E~BtVO164##SQE?VNg(>#b7| zA`Do5GB8FkJ+&x@h5SiWxd$v6y>%7Dl~NHLWx0|9f;0L4T7%-HWqU~*hKhKnV&Q?p z_G8}z9{PW^+imwNJJ6^!w}|6xEQbPM7~~B4I0w_*1CITQ#@X8x_41i6)yYQ$FNEX% zanB_TJr5jm2Pg6w?}wXZCAM0MyGf2!oYN!IGaoS}_<@}FC$JvpKApR&XPWZz6Jiu> zq&WOjRw~{1_<_viVDkCn z>)8JKXxjJs3yq0(#lnUZmRf{rdZroT<32|3o-L9xJqgY|b!EV^z*Yump(${d-&(T3 z#a=G!?lfu?lX5{P!y#E9^N9QT{$X+Gf2Nl%RMkmd_UT}Ck~U>j3P~96>-6uVdp;W4 zd7LxP9Lngp2u1^E2fhdLpRRjquN&2Or3b?zPAsHj*He%yM&Ytsw{Sf^T6ULhQ|}rj zsZ;IFe_AF1u@>!kOlsiK+bt0QPkc@7w0f<2Cw*_!MEj7MCoDcQM| zBSb4IRp${Rjv+t;KTSiX;;Z6?1(5Q=_wSiftdNYlih!E4wPpn#pZoM9^U#WvyX%U z$r%{@#)$f;+u$iSUDtQCPVY-NAO>C!hEC%L%6oUw%1JCcrjNWa(Ox-Y5Rf9MEPHtg z$T{uh`HtE}M^PyZFsyTsHRL`N?KBed;s#IU^8K{Fotqe1nrvk>RZ-Mi1tisQI@8uK zIHd2zhq{yejy=(^!`ycSz<&ZlVU<}CeF;8O_0gI-sA{TO-&p{W>daL0tGLBi6T~u{ zkK-qP4U?Ygat;Wq<)XI5FND$>iW#JIqpL9#5`pTaf09A&jof}%Iw0+*Yq?BdTNx=9 zoQT<*jtE~}MR?(r2Zp75RU{95choky8fbuZ3H+xcvG1)bbcJ}t>_mgUO5kApw9qVN zIi;7`8lyoMf+OtAamzTs{{W7Pr-fT8%qhZ56D)w^nE8*cm(9{JfTJlYG62W#tf0D) zP|mDbR|B(pep&|tQ%1prYHDa}6$(3egA9&GzsUVH1Wh#sQI1?9ws|8Qexp*>wkp^I z1IAH|8$nTpGPGv3 z*oAUDpkt5y+Q2nCvc{*wC%y;#HH4DS4S0qUoNkSQh*$N3lM@_twgtu`L|`01CDA^%Hg?D9J2F zag+VuPkd`HwKD3}^c`17L@MNf2+uFCzNN)&xlbb`R5Qp_=dvG7FbWz?o|07Dt6_VD zd`N;IB{8Y~Z2laaj`{TT*VJ{UdPyoNtEQf=qmhhA2r;1}AP-Fc0ABh;ny^hZF}hym z4W>zLkK#$iq-PQEM$2Oap8nq2XS38@8l54km6iNHQn*|c1N_uy+rD%2?leBh4Q&*X zLp377%0=+&*vBUV4|NJoJD;v`?T=FRV(Ye*>n6CF#H?hMJ{~id1GXO+9)kdZu6Crl zYYS8?5z;v@OII5DifGb$bO3m)IKq1|Vl$lQxF0X-0=BPn+pP26RT4nzNVr8HJ|i=! z$A+Yl*tS`Rd}uvg$_nZUU|}2)%HZ)}S>|)-82SthdI65W4MnNC%WkZezT0znYK#dI z_<0Hje9M#R{FunsJVHhj%j~UkEo8M)T&pRjmU61{)mtP#!|jk!fN=kv%`uHj$uXm({{S}5Mihk@7*$@!2RyXR zMQW`!^WeiBY*CNmK~Zlpym$nhILY5L2%SMpFPXvdIUigr`hYZSaFmAd zrrn~|ew$9R;c~3C-8PQurl^WHcb<;fP|FBUQrzM_%HdT;NoG$#POJOneQhSqkK$9nse&kFmHa1URwa2B;LJy3=mxerqi?E4 zTxcVIWxe9ptL;BZZ&vlKqX3pbX}_&`KIwO!UUbz*%qa>Zap3rJ2vfzI414x=>IX>r z8}ZkT)4DD-n|?YnqNcnLGk~5+1 zd*P3K{En(C)u(TC^0Lio+?_e5xYblg1y#bDiIDi*B*QwyPZGW-0uW#yPQ%J>U5CEy zd&0uC+ip18*d%CUq-8~toGHLkk&+Y|%vR$3o!y8fPDWIB_t5(L6|$^JEMa4J45i1oBOU&J-?okLnpE+lqWE?ljuRyO z{(6G&%^2k@Qe*i^Qa@5LuLTCWT{N4cb$)5}*;gC(kE)PaWL}-xsIOJ3+?ooW3|=f8 zsv{6NWUewsagSVNPR-j}My}sz+`UHHk7eD9OtVx^7M33d+8*$!pHNDCwFRVSq&Wh{*A;o4S+SpPBW*(O#$S zi?ye8($#Hi9l~g13nff5k_>PT58MI=BY}cDpFy8`duerds&>80QT>|U74%gyvjAh1 zq(qN$8?f!4Z>GKXgz034AL=`I&j<7PteT0NxHK-Z=>E>H>OGR4`%`R$R7h$hbd4Ef zDvVc@V1VW^ket_$%AVl*iR!(EPMU1bii(1lk-0=D*(zDePUV=8T$VTrPk)%zCwJbv z_VYEiuX}Z#8j3n<rqQj2w}-061JT{X@^ zDfzWkBSkE6mO@nIc!w?R#XDrRXa61QYnMwKPlzhUQwFk6ii>L+!0hA>LrxS<8bZDt^HRJf=@Z8zER7s78CjSDqmvJO5(afP+hv;Q$!)t;%}EVhsp3>k8%G>1 z-9)a6GQoKgKm_+V_0^ha$v_FT+qkWvaVsewF&Xdm(d%a5q_XZR8u+2K)ZD1#@u94|Q!0-VHFFsezyMGff&-Tvg7R!< zM8_5j94O!%6-5T$y-0rVdqrzZ>f9j|&SW?zxLjoa0NtQ9_RE!;cBQycRMJkp{5hd$ z+ym%%um=a{tA_c0YB?z^SKIp2R#GIZa8?qTOpMA^M2LhsjyFLGy zblf-n9W`~Too1n;_%3qX8H=hYo%o26O8L1Q<-0DLCa-&hqYmMYRT8b@AX#JtXU*GQ zNeEWvh+Z}A$w>A5v_@^OxZ(J4EY)&~xWurvJbo(3rHX>AnFq|QG4lj!9C3JZyfdrD z(Xm&J*9@#X5JB`g){u~Kidy27a>SvAdxCp**4l`}#u;BDKP_x%c^r9&9f3XjYjP(P zDIyGm>DxN1R6P*vH;2TNl6B})jQbAQBU>tz0t(~|`FraevaSF<^<*e(y4wPk%Zy=H zI6nH7PWg^Q#PVU1eX;4Ne0u@u+fwK|%2l(1xX;T$-83lkJ2WlNw;w^DZ4L}WaX=5# zMCzw_qLQ6P5>h#2WSk%Aph?f(MnmxgO&qTVa=h$S2bpjARN42R{1Q4A^Wx z70MJ`w zTRo8egIUuAk(VT3wzP7RX-JKoK~jJ;pa56f{{T>HHdT>T5C$0U=LhHeYa@usE{ZYP zxq9FbN9XD6HJp;7;wlyDj?n)iKYispv zv8~78;)aq*^88yRreZ+GeB_XOkbU*QV_f&`U8k|J#2if|e!6uAmeL@#PzYs;u9>4O z@djoYkQqS7ZY zBNTSz*@O~CeQ-My^3G0%$w_t+Jk!&$6p|zk;Q>@*o+@$MCyQg}gRf7gh(#C+gERNK z)XOyPl@U8Lh}ptnMo)Zp@Rl@`_Q4Df6*=#c4u7U_M35ykQrozlYAEJp zqfo0TjSwlvgrMWUe)(gb;~=kY`p;`z<*kxC169n!f^bA)zB%L%7ReolEc}Kut-Fev zYPEu*beu&ztg9GIENaA(0KggUPBHJHme@^>xhmp{rJhI_D0sY%SxC=+Y!Ur*7%WB( zQ3a%#w>=)+tr8^Dm}#Si3`oRE1Y{R;VSC^!^h7*hcvR4s^tvsL|sXK8Mt5Jwk=Y z9^+D)B1bhI-N(!8{dKL?S$MWH>x}4uPYjP3j1qEY61(AH zJd~>g`I3G6WcJ39BT35B6UEVArXOdj4Y?0aDK{PNu)wlXR9hybHQlOiVrE5nlmGx> z3LIsI9D&&RjHP`a_O9-gW|a)+l@!e~1)d`!gTN`sPDU920107^Bk8U>=^s(1n!1y3 z(AUX5B=<+Enqb~qb}~oFSCQ4KiscY%JH4m&7s2?~-3J|BN= zS9@l~XtY;dAh^vGwH41y%4LMKvrijk)SM79ACV;YEPx*5X#W6LcRgU~tyT8a==Jn4 znT%-|BqI1vjFX;R%dq(Yk@!w3d*4u`GS=Iws^eGzSxj-$$C&)GBCvnN&E#X~z4-d} zBP~7owD4OV0&VI9l{YFsi?{d@*CjmD%U&23M2(w>V~{;d6l{_(dtmFHE_<13E*}zO zqn5sshvDUtL}?hHAyM+Gj2-+pE#^OjaqQZKxw@IU?RPoY-WnU7IWS7`r)re!0pJe> zQUSp$pTrO1B&93vz2jXqvu|zNt@66MV?9)KaI}(0J9(K<6M%AiU<`riHLfT&@>e%g zD3R6zf1%#@YGBdTRwR)$s1_)x!WmVHC|-H>BsNAt^8kAcYen+;Kf%0pv#k-D5>%vv z9s2==B;@&a3&K9pz6(z!Yw^>_}aIk zrKF{^(>#k&Qym;C!DBJRN$f}?89nfDMz4Dv+Lr50CCmq0jP=f0$s8o|EjmZt=IGlW1J6P}-=eo0TG( z!7P`M{u2W;b+t}fg{+REAhIZ~k8cFCcJ1gDAJJZP$;lZnp^7335S zK0ps_b|X-lhKAW$1T#ZTO43i5C6=BMA0kOrRtUX=asYaON3rZd>uTt33Mmz;15=lg z5ctw_;8bTGW&?_@ahwsKZEB~uT;Q4u)omo}TQx8+#V9}`JhE3FR^&UDC%k`$BQGt(jmblXTGj@87=d8)e(F-d?`lf8v&1QMX*PI>#Fyv)}8abw?&$LyHOn# zB|WZdZN{c5(-TP#l2tAYB)fQ!#s>np9I{C5q5!qHIZNf%xRdPnMNKDCuRS!Tu|OP?2rx2<-_tu(dL(nP553!_65`tm}7$Xw?h zUy#)mvU*1~!u@e3;{O19-{xuVS7`V#F~)!*qLNX^2+tJ^Pi&AguA+x!?2iJf+i$br zQ$`oZ1-x7`D~>FD=-zDhAousy%X^zvvr`)KNJ$%yW>j7b7lG5tYfVj268O~Y)bAvV z?=S^p1dd0}p^wuCT54!6){6nFf{%m>N>r9#7D!Ven<}BQSd9FEUvEt{RNHTJ($(7L zy|oo2v6#$qHcP7k<}B=RNCY+qt7jTWx?Jh3^+H>8Rn(O+iDN4ys3NRn?0Bnrq*erx zj>HV((>NvD6ZdypqYja~RbjlSdc!{FwpQ48Z9d!D^^(XcBuSwXRVh59NFd-zWkqsH z{5|q}YRtdf6K`#sH9p{|N*QERPd#N+s_iSPk1^r`@*~ZFJ^ekjW@>G{ZCX3#;Mww9 zWsY)?PLMytyswjO zNwSuXwnu{0CRrsxJWnf3@^b9txX90PJlO0$nxVQ8y?2K3w=&#ou2oXdLE=GFV*tpi z${(|iOi3!F=R85}-0JnHqqt-N3yhyq55AY`ZM$n} z$!~>h6cljDBSJ+rE6Y2hG8r3)$sO^4ta17s6OJe@6H5&)+k&cFY=FTfa-y&e_?9rr z6tP||Pi&Al>F#4(-zhY0Ch2=qSy2N|aec#2Ow$~s5fznMBHY8fE2vNb0|4Vbjj2@o zhUBK(Q#C3>B%t_WO2k!U1gd0$S#S!TKHxFNduSf(8_v&i_}f*Q*v~X@(@#A27}gk~ zQd^sIc*`+&zzkoyoDSsZ-H7g6tPNFKl+aRKDc!1>Dq>1{ek#d^;h5O+B!kEtkTAS^ z)1V=t!~zwEi=`plq{$_HFB9;sH^gW7L5mU!k=TMkJ(tx_Zra7}AwpKPFv6YHW><12 z3~)eJT=sv&GP&$esMIQ`Zxr_Ug*^owz0y%ko;)hVL_uy`VsfgvV%Q`$2d8pIuZ6Fw z32Ugh(Ne`#1`=vm^CX@7BA$L+FRm9OmItBI`eTBK9ms*6ie&~#lB#M`mWgl`V+n+I zB!4JiJfl9H$8c6_>$dGQqMBRfV>E_ET1e;`nnjeds}Rh5;|vdPT(4}li`HLuuF1Jg zHP%R|u2t%*2PS54rLo~FfOwKser@ZVo;aO%rlj4l2fNxSr-q7EtDu%(Qdp|vWdj9{ zc@xYA{8?Vu$klY(+Aju=!4BehLS);}T&=v#RPkJ(s%6aTtdop!9ux2&2LnE&90TdC z*BXjCJ*P`Ii#*VzlEE}pkrS6vFgS%A2bhw{f_V1%4{B~SbERCAwN&!lC}7Qe3|*uJ zWB`^D5GC@r9zYy+7(Iv^aih74PmQ)Ds>>jemRi8k$PbyB10O4eZUf9t08lU&Sf2@K z^i65pDKd1%nv#2s-mqI@r-BMOjX|DMG$k9ih`h!?0T}nm?eo=daIUA@)H2&?stk9u zo?2F;DdN0JJG*fM9gj2X?eFQUgQr#E;b+}&+}?~Rp)_k9JcW@|2Q00~0<3ukD~`h- zo~j$~jd9t(+RFNeNvRbnE@oI4laMh49aHG7^SJTRn$2DAVD%C11vAd%wM`dJ?2*R)=42(9uli`svI2y)q zxLSZq{K$scpq?AVHX8fGP>QD_N?O`>g}A2?3rL90JWM~Em!ad|z5?dvY7x8Qq-Ck8 zql)1p{7haXz{1VRQHUV2p$ep_B;?}+4BWQX6c&}LtlO5Vnu>ZjJUfHLfv1@YqlEDT z^G@ha6$w;a6(nlB+%Q>bZk4j_%TQZ%;!!F(mx2~>e*-fg4SA+MeTeiVYoG|MB%!xi zrQFiXW`>d5?%_AW)zZfzt4#oqaRrokK*msU&!Ztd&P0u?OIbC*!&5JXSQR0t9MosS zayYkOPpYZooN+CmOpBv=+Lp5ALsK%rO&s%6Lkvsc#{*2U@(c-eKBQi&WD4o48cU^pYN?f@s(L#n7MD(&=-O>UVWcja+-^Dm5qW6*!AYrh3 zliY0$+i(5vQA+hc5l8Vv{7Xw51gZkesKlPx;f5uP5C?4bFMLXS1XVjgMXy#4oXHk#GDQP4MsI@MCi9Q6p?BjBXOihmt3Qa8aV$K_W0qDX;LNMY@Gd@B2zyU0!T2oQyrAyWd9vMgf^!9esQILq<_J@sbnWT2(o zlF3z91-?qCn~@}l(*zY^fycNB>wrK#&%0S9n?I;*{E$nqKl);+R~5_E?YCV84)xtu z*s7??!BGr$^`-HSID$Oi#sna4A#>a|NFZp;+n;;EPGw6~Ey|Lq+r&sj$qXu73DEfT0gz4W#-AhY#Ocmv|&b1phi*)WPneO(= z3Y3H_Fd8`{p(0{bhVgtUOoS?ua<~K!PS`-3?E5UVwfkP0Nb8}vu!6NDoJ&(#;!Bui zBOpmCax2V7A8hvQGu-qS32#?QdworPJ<8u!h6xKmfs#@H?~(oG9lcbM+znE_IkVXJ zRJ9xK&vCii($Qa6O>C)+ltnOxNnvTkcm&2R;izNDcG~zV zpQTn#m~_{t*T^cj2G_5l+BXW(O(k`&!>ps5#U4B@;wT6UqA=icLiZi9u8O0cvg$3h zR(t)YbKCw5RtlPG^pYT~ISd8QGsF@BKK_SQms38@9Y@|9k{#{SuA^D3TcSwSYbA!( zDSr1Y6Y*NugS9;P9f@eO#F3NRNgW~HoqXGS-s#ev-S&3d)6Z&!P2#g_!$(QuWyncN z86!y*yf$1fe&+)t8qoNh_E0NGr z8C_LbS5DM))WJnh#M59FE68BD?tcRu_a97WN^*4)*SD%G=&tsC)g4U6dFh~!ZdMm( z%kzpC5pZFE6cEG^e;{dYv-NXuRql&L14xfj)Ib&nZ%Vp8At@QlBnY0S%>4woRHy< zEcf*%e$u@esx(%~tkF=`Jryi)tSZ4-in%yat;Znp@{&N}FnzUO*>>IP+qL1LH=3EN zXsMoeplJceCM?Pb`wbUFI*S$B&uEf{-F>O4#1AogM^#~ljlfV8hXg3jJNF&6a@cQns~5x4Zj_$Y zG*Nhv!&@5_kOgjS1fX$X6l9^p0h8Z4Y~FTVr@yx4B|lLt^)*x!(zQi2EjPl|%+f`M zX#4j-sz4!#BRNsni;v3ccLhh;%H!S9vTmE2$u{rV6n-_rn(z0O8_>rvs){qohy(k) z*OHY4t}srmZNK)$w%Q}5v2{mhUhTECbNH1r({YnB6ihQCgdh+`R2=qRt%bq8Y&U+08-CG}~dzI=dw`Wb^sjHLx{{VwD z@l7X)NGf=qAgbY%DtgE3@1twUcG-X}?dpcRvjsQ5T>4Se8%4f7k-gUGQv`BDCALI( zWmLgpS!TmIAc2$w4k2Rrw|u6rajRY~fi$1^{G}rCPn~_Mzy-r{cF%O>?yd zF-KQk$#IT3Sd6ERj#@YFe5}LY15Nf;OPHO10)wbnJmGf_Nvt%JUL#pz@ng13DWa>S z3^=KXlAN+Y1h?Vz1mo0d@7%jG!L_OF&t$vSQ`20YK`MM%ZVEBQ@}0oJ!5HoU_4oYR z>0jH^acmm6Mek=*O>V56Wvr5$$x=bUk)e@;1<3Ejj2r=w3D4*!O}g{;c>6)y<$a~R z=xVMrLmV+$?oS;(#t@8o4+Yo~zJwGk2zL675Yf4;HZqp|M&|+!6UCm;ZWQoU+og%( zY^_8NtUN=H?{@Fp9{&K-J)m879L-SPJ#Az(@sJ8rj`Awt8X5w40Cmeg^sXF%`QFaF0t%}{a_a!V9@YINfB$2eT6mgVd zsIJHW$C&Y7DeiU7=?5BG+V=y6OMR~X>0X7;)8kEXw$<)QV}#Q|55!d;4nV}QUP_#p zMu2*f2oo&udCDtMb6)g;l=JoEYmdN}g9qcZ$ z>~Yh*;cV+YZT|puUv2lg?ow0J)1$#jz^lY!5O5106+A)yU|S)H(b^xhzVvG?*Kq7w z$J`d%H6g9IOH&Myy}lB_30z9CoB(@(P8A8yZ0WEUF{Ol9ME2MYZ$G>(yN;g0Jq@z? ze!0|1Rd=JVrm3cWRBtTtIw*njo+Sy9ig7XmNx>Ng4K~@j+c%|h&{`|!u*tz1aD@a0 zLE0`}81KxCs0v4@UvUQGb=^Hmnwl#`?g)6&rQ+*ew&kj!mcCYvxS{b9BFcmY!xBO6 zTPH>-td(|Kbd@#TTDenHK=3K17OFZ*4oQH_!YI5#6-=yDwnuY;lcN!qiwHpmflim! z8w$Zw@kM99zZy$z6w(;zp0GJ37nVvZWiu&0W$qMXy>GCsm&=_jG~2Up!%um)(yLr3 zW0&INilRxRc4+1#@rJrw9RjnVvO3^wk zTvMF$VhMEz)3^r?aP3X7?!V;*?;@<<2_S}=pi4gO2zBEJ|KR3x*;k8Dr)2!sPl7qK4hSS8p1+*V?;!_SE#U zG*3}qO)avLN`-DBBPB|!gOF5&iO9ju2CF`(ZC|wAgv)T*o6geFQG8R|=%BYG#R{%P zJabDc6;OZyj1iUXliKa+HT!i_>>3-c_ghuw`6S|^QEdiz#1A2iNB|$j%PTfjbBrHQ zbnU{eEJi`3tGs^8mEB+5<8gHdb6p(H0$6U9VGJ%H!13_(D{)2PH6=KuR1y#BkA-r-NoJz4FZXtaUiBhECoY5Iji`WP;dIRFDAl7#h`GyS9xr3PmL?Qp;6P)d=-;(5QkmDtHGGs}YV& z2?HREjB#RaEF!Og+q&2x9MY%v2G+dN-mP_&VoHh@BqGs;2~LbVmI`@xRV$VU*B!fQ ze{?t8#->PUt`+b+#756cJ4fS4{CO7i2N(<(p2x5NYQ~#)-0ydZXsDw5u8xPrlA^L& zyfUJo9kOsvN~pjr!~i?vRo3a>d&_Rx>gp`lyRfHoFUP!5yHm+Lprf+_2<3tc06oag zgGo{lD3uH?0Flbov@TVX)lsQw;HH@tDUo61sFEXqr1n0fw;YU*QZcEUZvAkJanszs z>lJp&nM42@caRuC3P+WTWr^-i6!IQnjX3NJHMeuvDQfPMGSRB5R8Gn=!B=q)$f#ME^Zta-;YFsw#yVSL0WkiK$B^8!vZ-(9t-F1Cnbpz3Xe_^u>r zAg8WC?!~;sH69lLgUAj44RREfnk#E;Gr}%+3L~+8Qd9Ha5Q5@&lhMk2evQQOGD` zh4s%F_uaE?mgz@dvf#VX*UdYMyL^8WIFyE5BB~^ez8NI>6d}e&Ksv-sAaf%J7}mxXnW!4BwP5(VW>AUoEFUZ8 zXCRJ50P28(21z(Q^3wz#Xv-zqTI-BE!iv#9@YbE`UZBWXc@-%ES!ph`G*E(*izPikmQX+{Op)W)2LyA*4n0PSUk`I!FyZ-s)M4)JNApXR z7JCeql51`>(M3ZHts<#X@|IZw6yygW3#dJ^bKe;%VbfG?OFOKwQzOz=RnHWKV?`k& zjUx-#90S2lGJX4w`aN#ygV)!q+%{g*NDIeL&f#i?h=vLa97n^k@5FlN84KGa_txo; zX;Dx~N6{N?=_;e;D5o{B;1?u_#C1GL1+(Vjdy+HmmuTGkggc*6kMf~=z~M)vtGB^I zlGDc*!dr{R#Q_nyWaZ~7bNt!{vlv$W|=JZkWyj0uf~RZntLA&Fz$ zgYW7L+AgVVd(0~5rV)rLq+4LDisdTPJb-|apB0>`$pg6c$R8~+?c3(aTBxnGy*Rtm zc+VYA`90-0%t>&pxu#-#!G~;nYXkHq5=n3$U-Ya>;%<-c^GY|}fkd=4mG;XuZ8Y#l zD?HZOej-@F12K@qWR6@^s*{qv$mOV;Hjqb49Q8tVqIkSm#He!ct6=iwgjP8O=Q$%7 z8nf>eyFQ6ydWw7XoL9<_!4%huUURgCgk=$_ln_cj7!m8=)M!=D{!Az!Ggr&F9w{JY zb|ME@M>FMMs-rxU)Pvlwp~ke$rZU0?3GMr&*yI54mgp)h*DH-d<~dX0IKaV5O5Tlz zR|+z7+d0pC=eq^Q(Pp|>rQ27^I;!hbo+3jlBKYva@s>Uue1fN7#|4=A5c+_+8%KBP zZr+lvx}i4}165SUO36u1Ow6n01bCi+C4Q)>(&$Sy~A`C#S5nO658-l1Z)3za!mE(wDp&0>l-@2bx1KSsd&bw_2+n0$$ zSALormRKp_XdqxY0u`6|{Il)I`{aDarS5%+uzH5F-C?tCDl6r#nn4@W3P{aDgbq{{ zegu#JCm?z7-rDp~&L<_0AQR|P9_KI(gN4bL+wSYzJNoHvv|1yoQ7kT!#SbimIaGvU zyhuv%@^)+!liNYMqWf<1a*ptCbp#mQ{_7F5PeTBdW{@e6sLZb;mS7tmU;w~2i}f#~ zl(*_zT_sNXhDsQMM-@cWsYao>DUGCG5TgDggV+|x_0bEhm!vnEC99uf?&`l9-p^Gp z_QHl3k|bc|q$@=s z88m^eZUL7)b(^Xw{Wr{3kwB<|DSQFSPCMpZ;3t_XXn3ZklbuwvwvZ zRTB7fqDpxZ&A>+>hG9Ak<;t)G_XJb5&_O+1m+FG0DJTtLmR=*1m*bP)0DdOHJ|TCDsaSl!;FbMJxt_rXq>RNFDsYjGpB3Y!&PXVsmLlyLP1weO(UZvesMZAZX*H zshUQtlQKEuBXHpSf-vQR4@Qy_r|#Ie{B2K z#N4$zZub(IAZ)`TkWy%JLdb*?2sl3exgOf=-Qjw@P<2vzYFZiSG=~cuFEZhrsWQ&2#e!j*wg;xPr~!!1HLI3W zk;l{LuXD%+>Q%7{<1qNhk#8$&v@Qbsjmq6=gh0BLM3^5tQ*< z;rpKczb#U*DG{M=B%Fd+W4ZLsrmW#)R3QHV5RcnXAYX?+#X@|l_&taIr>3{dT$L4k z;(;QLD3uDKJ@M+@@^XDnmPMi!-E6Fb5`>8ulDWYD0Mzu?rz43};-k6wXXJID&htuU zDmgD;M|}R8nIrQeRctE^Fd4x5<3dF$BrKz-f;Gni2di@IGwrXLOwnZJNjbp&ZAX)d zX5-5P*q+({03B_oD6tOQl(!z_`F^^kL*lWkK@~a`81)^y;Qe)~-xACiw1ItC@)`X# zx^-g-C0LgHJ;BfCsMM0iV&F=iK3|rY(}hG*Ad|);;(&yNfG|6s*HNl!0~KN2SJaWL z7?_n7GsEU_p8o(NsIt$%i1EmGKbDHJh-V69wGGICFfcH6tjQtrt^q6G>7K`0GSaff zgSp3Ye51aOTQ=PD)(UxUR4UJ&OV68upJ2HSpI|>+YKaXB_M4!F(!gpZijeSLLjk!S z#Cqo*+Rj<2Aa4e#WDI}>;=_ky+qWM<`HehMbkZ4nRn)b&#FS>Pswa!cS1Qr3s|<$( zu~FDy_tPy$Mr{d7l~x+ci~J@TIl4r#OB+XkNkGkj53Wi1jA>4qG08>Jap6{pZK_BO z!dT+qhapUgaNi<_-v{4N8k(3#QCwD7ClaGXMg&;(Wgz}z)9dSknpQ~@;lODXmHQ7A z9Op8eocbUnoDCq;#UM<@Bl1I>=N_8hZ@5lwP}Wc5NRcvkR`2+L;trbT*|4Y@Z531Pm{s_4d#}cH2?E`+_BU+_hB_+UhDK5!b_?9#wzG#Q9mU4oJZn_wC`5C<;%Q3^o*ZAoe-X8Tr#Ra|Z6LOAP-2DfJ(b*1LUVQPsbi zK`f4*2gAf3Wqy2z2Peou1GvdPpFKZgTqq>jyDO-+mfoqUs5BO<^b*@$A*+R8rB$Ds z`Js^kRRF6J%zQv_G3(qi?oEcf&YiaX+J>Hkctjm&tN653*LCj5T;PRrgSX-Cd!J!f z^t*gRT=3bet%fR*7?9L_OGF6(Az3?|smH4mj`;P?uFEFjw%@GMTJE$D91_UK;^Gq0 zpp;}hk*k6j0IEX{MEwZu=k;PnJ9Bvps|aBfcq^Ol_A9>CuWMcYiRh{wIVwoXPp&bQ zBxkqJ(+ALlpmeutyIonRqp4`vd#|Q7(A`VhRD1f7Y*)L54F>n8!`bdmixoZcJY-X| zkT}0`M4gwGLGP|%yDe>|=TU3BQ%Ox%Nh?8941*4`DZ?oPwsJMm(CS8|nfJS_`k1;7 z_;yZmQ&8U!OK46rxDO>5ABP_3NjV=+QT5Pz>7}Eb)6E+~QOXcUp$7zh<3QuONlhx$ zLn8)G;g{Q1Ug55%-F7NF)p8?To;YDyB0>Ck)eZ^o=5-^9JVpl*lf>g|iHw0(3Iz*a1!hoL$iDjo@9 zk$@ZsKEAqZP4Jmj-4v*=tER7~c&ZpRGxCMO$A&@9N6QDkth*IepLgxKC8k=By{Rd} z+^8j#$d?Gy1XV!fe-5F0`A=dy4#cUdW?vR)*^dw#C3$Ba`jKed_Z_`)r>(Wh(U=^S zDo>e71gRe2s4Jro-}Z( z1~NPPeKcy$(kvp0ag?qjd^Q17oM^;VbJs%~R6io8ixKOLd;I?ZJtuga6UxDf`3~AA zXR4`+q(}iV`-7-Pa+oqI(*mtTh}5#wBgP4SF1^$bOdqfOG#8g|~{{RiUWrhmp z{{U0hMk%V^X_6wSOLs&4?FhX_W0=QP2;(8j6z+e0OGH|)PXmG&e+=jF5DC_4^+QhJ*998`p54tWo;IG|-P@4O zPqwUgE3}YA(@PyCE6&Ln9;7HI{@fi9N(m*XrnBF!w3a%WfU>MN1ee4pf0#y!&VGX# zI6AOv_vOC9#)ECf)KXJSs|0kc5(rm`%Q+q7ZbKk9;m0N{PXrBZyKP>e-leo|jl+MF zczjHB)K!dDrW&4TGaHvvBAD2|NXqsrf^n{No+Tr%V^)Ug03Kt6Cab2Ka_M}durtfOqRJD*m>faMj46x5jk})I1 z>KSqFK{!6=*G)F-wFQ#XaE^8R-rUd<)>{w7$xTsLmkjdN#_@6|5dwq|fZ#8#mmr>s z{{V3o&9l;qn`72DhLkf~&2f%H=8Th9_=kT+1QEpc>~w?T5)eRl%@cH^b=L}R+v!&L zq}i70`m4UzrKX=XlG42iud2zAM-=7Cvdhdn6#gQFN6tWUHDB&M!?+^7)Wt(ZSAUL` z+BKRuq>Yyf2O6%kD}JFx=}BW5ZK<0A}ll2vdHwAO7a>=ccCquQ3X zx70T{<)xZ<#9%*Qd`AI$;CE7TG+%I32`QpGYhrC}u@yXGu9~^j)~rnGSP81wy2!&E zamSLd@5GMF;*)vqMw5Hb)Kw8Hh!|O}f=cP6e=t;rLl9LgnF;pD51>R~2ql?MtA)umP{nZh{2a$*|_%bw%q zlanQyw$i)Sa(7&^up+wJbYp03?P6+=>GQWaG! zs&Yq^49S43GlS{v+gf)X)w#!Zl1pdDRY@|U%SlI4CGaFXxkrxdc;nEFg4j4dunRQe zhOufzrfI3^ZjBbyv{nRllB#-%Dq?DHF;!*e!F^Az8(L~E)m#G7+i3$vIWw*1l0_hQ zz~rTe=zrsoP~GlUYL}~w+!AjO!gXLB3gC9`MlpemXBgD&wQR8O8|;I3(#K}8MH>8d zWX{yifCU0r;Y_>bf#u<(nB|-v4w^=ucg`vC1nI|47W;(nI!R{2&_CXLhvJ#De{cr zdjh#DmhpMrZBCYIaRD(q)>Nn|9X&Zu!o`R{e7OU$VsV^gmI%wK*Fh}N!R3B|b^8AR zTebRIu@j?RNT#Eb2A)d$wW=s&YM53qIe|Qk(IYz+$b5N^d^UAK^>^(px;mG#?AvmQ zQsEqS$!+&LyIbwE)Lx0>i5CjbObRv`RCZ_e$jL*B@whHqc8)swWvprmI9q5TW}ZYv zH4DNiBs_$CfhBXq5Ko{4A#CrnSK1$NBd*@*lGV&qGbpP)J~f32Hf3k+OloP=;>sV-w{s{ zCXnS>Ae) z%E=RnO%Fw9DG=*83dE%JWKd(x}6uZvBUBBLOXdnrDoV;a|0ai*uJ zh<)z@G{meCnLv3kGTuYn;12j2`7V=Fs_>~FrhF}N=A6(-{{V|o41QHMdS&*NxdOKy zx!dS?4&s8?8IS4~JwqR6`{b3-0IEP$zg)L(R0K{p+u>3p};Q(CuO%Ew(Sc&D$YRFp>J7%vm~U45`P zpKwOE>Hh$Ub=^SLIgvE?3=}?eEd!usT`DiGeIBFU_t>p86g8GRO+Udy16t^sNGh5_ zVs99hSqVlc#IfQd^ubaz8qxN9+~XvE;0C3zi9i%79aYjXGniQ$v1D?RX1CwP`4cxrbN zK~&Pi8CQ}>pRjgdNg2*{^iL1*hj@)b-9rf+fY%UzG6f&aV{}28+K?x(^^b4V_*6EE zJ2^sHMKM}vyZ6TuxFC1+(+@{3TZYNK>1wz3!YWunj54QENSH8AH)d9@Rbeb z81(seuV&jHtPZB4^hD5a#OmX@w1@n(i5N|>2c@rED3Fr;=J z{MjUAVFzzq>T0N3A#Y;*`194p?h# z6_nA{)k4v!;uqqjW=99aVriAbvom0p(|1|A)wAn*Wkt5BZ7^;<&jl<9wu<^0YNoK& zp;nWG%N`hHGU6!|a_q^0lJOxR5II%R&PuB7{WqqHwoz_0b4MDY(ocM?K{8az6eJO) zJkhXXbLM6P_-t|8yLG-Wq1DvacVh@xt^&4qyEwf;PEtzi=Ggz<3;-;na@52f8`vFx3N7Sr5sc-@s2Ym(e8t6xb9LlG_;_)8@1DoC%E4-t)k zJ@N*rt|S9_2%N!xG_lmX6`IjiZl~JT3YE8Q>vVI^4C(~bg{OBMgvsKB4CB*~!*|ZA zP2FIy)m6`1OU65u!e*&01xPfZdZek-Gk;jaa!zf8Ws#}+SRds`ERXiq~+iGWuIoJxc7)j$+Asl1y;|D%t z+~DAhYfB{93G`VW%SaEfcb&GA;%oNxV5A_okKyu&jAtRnRQCBD2$tVb41`Stu`-gS zWKy`tVlaLFnz}9fw)3_uwaHPotd*2#=Yv%v9ufu^WmO{wwsZQ79B5|j-V{5Yijso1 z#S}jU+Nz=Dk@>zub5IB%VBmsTiSNj1jGf1_&(f@dsk*Qua2yi3&OL^)bV8Y4Kn!-y zn6K7=(oZG6n7urFNs+h{icyh|-5z5rEgO4aOEAk_j3Hf8& z`hVH17%-8BPno!ke2>hZm-W`h@G0Q{xE?7Df~*NqoQ&hQdQbEt#08+WO|#F{{Rb4-0%t~c0Qf>uv7BM8PjX6(w^%yMpasOhB(qf3vwbS zRyp+Sae}?PpI+Oqw)u9Ik8Ew2=?8?=KN60pc_YnJBe4JyN$}NMw{!FC2Blajq^#NS zU#jTmiboPs(!%hvgpM~>a#@ZTWRg7;^8+h}8uR*t)g}FxVjt+!ehYmpwPLNS7M-3Z zjI>IF%D|%s1Rrt$@Ayb7@;a}&zX-oWLu_lDaEf^s#6?ikHc?lbr~oKI5{weP*nm4= zYux*dE3Y$C5cR7~mcvUdV+!G!c#iISXC8yL3GJmF-*l0WXF;Nb-E_ zJyf$6K5qVV$ok@G^xGUBi&3fSw{N1&YHf7ZI!bA-6xFr-l@bt&rK9EHi1@2=8Ac~P zm}Q6{kVqS465MDiDt;;Cr>2a#Z-*@$OU&dR*=EZQ;ZJTvHPoq)9z#^_ zDRU!oK)3<0dxO{yPj<()pxG&_Yf+|%yHqcmGLT0AJB*(F`;tCc?WdZGYidC)8~A37 zD?%1ZksB7`tKon!!;c`$a#Ub~Tb2SXuI+GRQ%P4Tjx>1Ul4BltkHo#Q22Tu({{VMG zR@^9>tk)T9w?uaOinOYxnkeC)E#w@Sb1|UDaD|8U)zQ>S>8RXCM9F-!f2|LtwR`EEDvg9`-o>yKfM+QU0;Mh2}=J8K+DUfWVd9pi1%)Sf~sy)5Qj z=OAa0_U(ec-`@4mI%-OreLn2WZ{bIJf|@2EXOv=aGCpJhkPp9oPNt{lYp9gWV_G=K zN9~j9y}iM1_#@@0_p9|~yJ}RmVDXy!RTXsQ;{j4tT!vqMMOf#)4p@6>?KgCQmAiAn zJPE1;z_M4%98VYs}d4W94lmC)Sx=PGQcAa#e0$4vEmQQO)jF9SV$<5 zc${+T4{tF2^`cYY;PUnL(QDa)-%=wGw~3BSS@Y)nzG1m~=e9pGGFf4e@{^h5a>KAc zUiu-CXljbWKp8osWruU})L7<{mO(Tu%5ZQ&$F8zj85pS`WP0mUe7#1Q!mufBl69Gs zv15UPPk!3R$XMVWBh!~`>sR1CyAPJVEHX&W52@6pYkN4)o71*CV>-+dQwxsAB$Mr^ zpaMo;0CpP8fWrXjX$cE9V(d~ej@|vni%&sww524q^tBYx)xxz@?Ia~c(DEQU6Y4Uo zGCOuZU0Gjb>WzzR>lFs$>NSFUy{gAgQE-ZlX`X1Ntw_nH6NE8vv_NZ?leJIfkD zT2fr3CQDwls9i>>;VT)+ehqo)f?98vW}qD z#kXnNIO(e)im7TVh>}3>g+}nBZal$vEW_C|>uhX&yVF}m;YE{XQ`;bxpj6LO@iQ6W zSi+T8l0sRdE$9QxZ+3T?fCKEksNy*k@U#WHH~Ph zOni@iZ8U8Topj>W@o?HYd$;WV1m6iyAhuJrK#m-#W_~^^`GcNpNjiD3!)>M&G`|l{ zlNBF^5g2igYTN#vqde+>wKc5hDg<^qMl_{kBQ5dEW?+SHZy=R?tAIOX7B1<_iLlP(#s`1 zwq)@lj;5HJi32WFv5lP&V1~gwy#eA$8dP&KLPJhd3mn=cCrMI`V`9n}A>>XydlB2~ zq0vgMR$xr8hs2)V&7MEM5`S;YSyWV|bOI`RxaRIVBdfLn_f;g1O=^mosw$eId{N`d z7#3560aZW)<&aK(XGTf7P*TV_;>h`6l97S(_C57UeV}*s7RtO>1xDJd+ydbUw;j<$WJO2QlJ%9jflc;Hs&|2dSZc1r_ z7@R~T+_F_tyin1!tmCwvASgiNkftV5LuVl8zBL-la-fYVXR}8&9YJ_Zm2k+)7B@)| zmn!8HFNScVx38u<1AXyti*3~#dslabsN5drfSW#62hb} z#6Uu`5J+Sr83Q1W=eRmF)`=*sHoJ|UN(ZE=62e72KvamSJW*A`u^d&`3Nk!1>IQ~X zT<0{cRRmOUz_KEfBX}gRWg)p>sa%kA@1Lf-Y|^?C9AvTRxsIGa8)-9Hu5m>SUk_}8 zIjNar92f^BN0LWCLZ2x0BR?;YofZC`g6&Zi;;6wrK@~31NH{hXQy2#$0aRcDG5Y8w zzNcp0SH`|ea8Mab4;RCS1ce1kgULJO5J2vJx+@(=Pp#Xg-E!M=+TI#UC-G&et1hs! z6jV@*#D^f9kO2UU{x0t7H0N;op{gediYa#Od`WQ)4P;<|9wFlQ?~p(_&%Ql%uDV&_ zw=Hhkwjl7?oHZ;fA(enD#D-;GQ;zIEF`+xtb<&6`8kWgTDo&^;s-i<7W9B%@Q<7)@-u37wlC=Fg3{3 z>KFsdId3awo;N+fCe5E0!B9l6K(Iz3jar_WB8}EVByQeBU=9y5{5^SlVWQ9}k@K40&8Nw`?J%=Jj2`!wo&$WCMj*2MG4%5hnttaCT`H#4 z(oD15C91h9*5B)Al9o{Z9R;$sCP^b4N`mq`$;gK|I9}eF00$@@^0G9qQ{qxE5qLFj z#zb&fxs13B4pa^<7>tvbUOHE=p`)s+k{U}d#E9i;={^Zw2Y{#`nHicap4sx``h%Zc zZ>G5P?ptk2U1)4@$sGLSNhLy{0J-fWsbl9J;Z8>q$C1}b#yJMy2;&J9LCI6=BBZCF zmX7PU>p9WI;?zsxM@uIT4(b<_g&ms%9wtM1@<{KjtUJ4CQd85>*$ukbtiZCdE z1J9M^<#NQYU`H|B5(yZ+n`>NSw%qPiG_?{_38SZyI81RE_>uf&MrTk)LF5OiBn1aT zZuX6bRcn&NC1TJ$RXXyS?_d~0zh}(SMx0BN+~X_=^%&G^BOox7-+-ykJcM5PWZS!n zhlSu;XTH;^gbH$rDSPNB}xVd$V0;qoCZhsRxpxNa?AH%P0j%d9sRufE;kH%gI!B<*LSg z{{YkNr@L0wx34so3Y&zV4_Ok?%#%}0pcvy3G*U9)&6e{wl~i^X8=gmNBFAC$P$dP_EOAA0|jt+ zchO;Po{|Y^>t&{?dL#TFi;hZ3T}Oz-2~|r-yhujmigVdZ9Y(LFmY@fzG)omV8aLgh zrYQuV4kegP#z#};?~pO-GH@~KS{^v0)*8q_`b%=8v&YofZgtSfU0-{smL%p2Od6FO z5DCsnILG8M+d=89vfu61Ryir5`@*3bYEu-&lBdc1S~+``1(kUsoF5@jGT98*ItmKP z%A4dCMy3+Plf^Rzo);0S2$xV{+|#C5qYcUOe!$)bgAwj#Uv7F@ettpMyQI z?gl~)cFMcjFI1)`Jm~5?UlGrO$jtqTEZmS`K`sFNBe3J0U-dTxN_u_cR%MUk86dhn zI4kh8oEYjOMFfP984dyRzcnBX4P{T@CgF~qYHkzTp0bu{DI%p=Aev(of6t7)9*b`*j2RmO~GijTTNxTuapaPs-~ujgM(EuiZw0@ zs+BPo1DhPV95PN=5L*i8MFoaxdx11@)M7b`yGa_mVj_w^ym`6qFaXFpYwEtx+Ll-i zRhHQ`J$F0FVcKX&y^GHrPr^D*Ihj^-|O%$xk|BG*Y~R z`l-O?JFy*!$Jf&(BsX-fxy$RR!JWS*?^|pp4W~Gx#NlJOgsefKiBESp}OJ<&8NkjuRr< zt@rBIj)cl;>DisBipLm|H;9POFDfWj1+k1_y?u-uHA8KxE2Xg2EOORSH^caTZH8%>oWo1CBT8ZlF5*G1+NF*&J#zpzyE=V4@QQsp_XfD-tgk7Pa zHBnO}aWrQa?fU71suq~&`YF6>Y|Tn)X)FSWM-<_sXjr>6sUaS8Dyxpz0r7$8bnI`tFFT1X zmdN9+qOP07@g5+a6ibmTgE%UDH6*X5J9q9ickT|K&wJ^G{=~K_iak*c{7 zpAn>fK&XvYHUlJ#7f=V`C2l)NDU8qNg;K!P7S1Zm6TDHAnahGW4-Xy3B@Cmu7{Fhq zo;Gc16yRJVig!uo;Z-6RDv1y*U0Vu!cF!VyeSy~`Y=!H;O?I^=(zJBL{!wfcrc}38 z)7P~fWK^UE5J<8{RI&^lsW=%P#~lf`H}%qsYyIVS>2~a_se{9oD^wLZC_senkt z9t4DJH+6FT%HfTVai@;1iZt+~e})U65DYQxk_w*KRloHHi*3DA*Tk<+NbKAQ9|{Xb`TRJ`cI-Wg z1NH2_a)^Qv&4W`7zUe#5rRWrn2zW6fGQqx1&{9fy57TlW>brM9sbok(tNPY^2p>JB^i8SXLY zGmK+Nw+*Y({;u!s?|xnX0JszGM53ae(?@lGhI_GqGO>rZb&W!k%qByY9#fT@b7>nW z9H#2Nw%aJTM4M}8SZZ#2ogze_wKY3K$;%8o$W&nhF_5zWFsIysrtX<-dL6rIuefe- zru%hesk_!x6fIX-li5xO1wzbHA-@lN}wZ;pC3|VF3pxX1P&y7>36MNB-)*L*zoOb`|zeXgGo(s5P{)H>EvZ+ z&Qm;dhWYmG-Md>LBao)z+!aN2f2v>G4ZR)HY*WKtih0c?A&prQNI;fD8wX~KmjjS| zq~(XHG+yrAb^AtG(`{}~0y^qd@Sv0$nTsoc!6R_l^O6Bvb_X~EvR?T6JkoSyc~Dt8 zfp)*y_N`=*ym!if7HAiYN~C`Y%3++cqcaR~!(%5`HsI-=$LLPyv|R3Ym}=?w1q{@YO|?@`53PQ`L)MbDsT^8n*LS4Op7OU|Kkf%TMvFz=ZW8 zB>Wi%IXs8cOBUm2ltz^51ie++;%nKrD$U>POTCD04cx$vfw))000gO`9L6gh*}gGQz*7% z^>$j}8&%OkB@+~>p@~77M&xIA7;+W3lq^^lEUT%VI@@+_zST4rp|>tgd!~3RXe!Kc zMN*E=c)uZr=D5nRW+R9>HzO>(U8>FUTpz9En(P%u2+WFAr9 zzO*jx-B!uk)lw~0LfJ}}nJKY6EKywKB9c_N4aJ_7B*sfF3TkTe=YT;~JxgMUP zp&5*Tf=y7>aEP8_;ZHE8QOKNe zQb8cF8oIC82zSLJV|QdOvfUI?+bs3Ajk9c}n$n7qqSxOl;Fg{k!R5krZxnzO5r+rL z0+JYJuH9c}je)xQjbpT5wv3x{-#xybs(0J6!XBpQl}QWLJTEgU5IC`Zf5gu$J_Vn& zM22YSsV_0W(jGGxg#sACWn!eUTzLpAdwEVidNH~$TapVSUAB_ai@h~7m_+dNNzQRB z2MnYZ2*FNQ%p*A%BT3vrw0vO->6Nc^ZSBc+*cZLwCE^{5o)xM|;89UgOEnrv3eJ0m zXvB`Zkm1NIam$XI?n`98?JIpQ=G)X&^ro28ymfG^1YDGpivW0nJ;1>LX$xxfaq*S*n#UAzPW#aK_qp7$+yQ0}>ye+jSi8!x|9D#5cCOoGA z0CA33))(HDQf(jYRif3q?$=ryrF|5Y6&I_}sH=tqLhVYgAq?e@EQKKPWyr<}wjgSY zX40vK^GiufEHTlj*;4CMON{ANtolX zT*w$4l1hQVYC`WAFHj}ct9sg~tww60BoI+7vZ9KaWLaaFza(I%3ai@#7{~`q^xYBI zw>W36P1m`W3e;0QJd?p3brDDkFDHp&mNagBL00CE7zsdt}IA>2Er%XOuv_@B70aY;onP((|HjTKyAgkT9H)kkjF zI$pnDuNRuze%t%^!-H=_3^Wv#6SAc&s!@}QFa)p)6b8x0JL5RPFOJ06$Y``e5=ePC zRPFx#ceK#gB_$_~9JREy6%_2u&l8y2#o~Y}gyc&XR367hBH7{=qolOGSfiGnNz7HP z_|W;7BVZm;v}H=<{x!x%n>QZby3-0vZAG$@q!{6r3G$9sNYPlR&VLg~eTgH~f!kkD zNkJ-`bwm|{zM4trn~3oSO9u?SfO7m;WD}0#(MGuwYg;RKvAOTx_er}N4piD(C0)vn zqK2C2%QTZmLbT}PoRSs@p^E|uG8oGOe*+v~>6@p!hApjWsI~7J3VY?UwvuP9=NBma zCt-#xFhS%=2L}ZJ>`p}=QEa{K9qUVRvejLtmOA9{$bv$$Vq{=X6~+mP279Q$IV6og z^s0u2`$GlR<#CqPNm=4Y;Wa`AnwVr_Hj!{0xt0K_$@B$)2BU@gQpdH{(tlLS>JkcP zsOk3Jp4j%ZteQ%>Tf~&X;fBicRXm739xzIbmdIg%K+;wJ0HYPDO)M3YUhXvhJhc(3 ze+{Y!hB&HY{Oc>IcS=`U2#R8vk}US^T%I8`#pu%fPcv#)i+lh}78oE)|^ zFMV|iNUsC#YkfGl)S!YYj}l>w77H4gLY6)v4*7B!NoLLonn&s}v$D|kv$`#?_Rabl zX`;O?HW6TrrJiL-<|{ENC!KJpLocgjvB(~zLf-ThDR8E`{6!7Or#Pmdd%Zn8oDU-E zsDYKcvngD0?4gMVMCQ2N8EEd8TAI|PhEmN0)Xo}SEgWka#23xxVw|!G!6)dQzi#I5 z6;w1<`=v*LA@J#_dzBbf;Vf{uRbNiUNd%tfAnDpt{;7LLPok#)8H85%y(#u(6%2JX zaY_;RRfm;cP>xag0KJJ07e42cVMx-gw|3mO478NiTjY^a(!|re=?HmRMQ+H6AW+%j zJ$#@kCpggSF3_^v=cB&R-YRYKLh;68iXg#Vxi=`m1oq{~VOP_>M;x(G?8)P&T9I|D zq>@UMjK=iA{8wiP#PTcTK4Ilk#|lGsCq~F(W3E4cz4j?%bFx#OL-vROElLBV#^SN%oogXqq3i-nc^{BT3dGFjVl(3;;4=(IhbkWDylP__awGB zjGihoJDquY+e=whv#2R5);6cwaH2*dAvsKBnMiKT4rLyLu+MMquI38-lb|b@oA%_l*1cJ;}NGP?8q2`IjeU< zc=poOp1z8XrWz_`xUsL2sw$EIb;v|Q>~nm_#@Wr~p9mrD1o-vU?XM{T|adgids^H)e=gtEuBs@Est8rZE z=r0vY^0W9!O&b}So+l+tg^}1Q;D;;307)N_QZD1uBSUuF8bLt(-d0nTdwCugSt4ljHFfFKIUD}td($^PiY=d^Y<{{X+x3y$KffKaa-(Io^iO(7%*{bS5(sB@KITg(P>NU7qY z+ICs0Ag8aRMHH%JhEp4`#DEoYRG#O$f~(mJ0x_n_efL~17H!2vxMitodN##bss0fT zJR%qYg}{lJ7bv+VuLPiwONJ4c~gz&?EPiGB{J9Es`l)ZimqZ-StuF#a`hN! zG7fz^rJcIEm1Mw4_`WNlwyU%-7 z%@5yln|-bi5mul0V7meph$FY+9ldabV<$`7i)%|yXquX$@lR7%9O(owET(pE;j1_q z><=Q@VV>C5&u-FA#@GN93}eAIZ7klpn`WvFPc21bw0;<;5tcKCR3bi3@h9NPA%kQC zfDf*K-nZOw)l+%9o0L(LG6D zDz!~H@bXSO1|>i&ah&91(2{ttSo%%9Dr(yPEK5aAOb|T9{5YmwSvg=;SOe>vonrJErtne-X@j$I;&Ky+3{>Tuk(}f=s3$$ywQZG_D{VX7g&Izwq%qTZqfP_L6e@uk z0D;HT(36p@Zj~E;_CLxiYTglO!Wur1c@kwwku39HnW93i9%dj2u zs#5#0cjXQCL$fzMOz=Y+%Jp*G)k`UF38RUelNkJD1H@qG4elqw%ul%F0Q{4iGh8Tz zchz+3WN)Y|s&_`rp;;Cl6m?5UBr@~!aq$(qHVTi&*qne9*IcyGD7`zC{}Z)V&!-Q3qo`Ctz}8aBvhiK)u;F4PDo8HR^kpIG}5sa@5KorcfDJV}W@X%DHFGBT$?`IM&Su zmR2~jcZUy$b(UZpH!x8`=yt~J*wnYpuY9mApW~=nlA+=vI{2w%F-ys#jkwI5!eD{h z4TeS?w%TnKaBaIy(k;hFQuI|-Uls8*@>7YLNf(V;KOxC5!1oLnvyw?Vzq+ONWTxr` zf*zv7){8Cf!FHpLdv#4D{{Rb$u!J*2lFPwXPr~u3$sn8pdsVgjYkBnUOD$IM+toKJ zRE>>X(N7$UP8Ke7@hnDIi?RkekC-G5IL~vtP{)7p-#))3mOb0Ij>^jFefHg1(H*tD zYi3z1wq@E|M6p8icKjRFw6D!$Bk=9pNJ+qj!~ZSf409nk1VN zgLhn{dmh-fOIHD&TH9kFW~YhfEe97dl5ngLF)V|_A&3WvimEH>b7t zNiO?doj0u}*?MtyW4A5p+=@qn&m@XDsP4#%>{NnJly+r@rd>C+)z5Xed^H-=N8?q9 zC{_jK%LQFQjAe?3%JIe=d4u2-+ZGCay>GAha#Ghx2x#aYIbnh@1`oE};)> zdgb-m_IA13h6ktl`L1K`xm;;{gV!BP z=swTh+lCG09Ya%YBTL3QYJP2Rr~x=eEw;^Y>PIZFSo4Ut#L)D7e^) zn)^kjUmgJsTygkI;4tztIcCWPfmp#Hg&4%h#4p(>+~2K}>3Bp-oIJQGE2sPKsr^*G z#ksdl@fOKvtCgjR7Bz(#%9Ur~DP&^UUgL^^^wZ5HcHykvvqicUZMCj~u8Jb0B~3RW z#zNUul{ooF76-BJGmTX}G>Y9|p8o(z6>`(VdRB_A+h4)t@WY1*-AoL@)DHY`r8rc16jVD( z<8rprS*u=_{#LFU%8ZDN;zDJTA2AJ)#eE0At_G6YcM>mb_6MY=bJq1K4&s@9X^zvT}rQ<&t~$9_Lg?s8kl{CCe8fv+I=^KAM#gk%n2A zP%u*vtvrO-U)ele&oo;}ZhPWqcLpbK?Gl2gi( z7UCm(1tZ_vBjusAg`PrL$qd=YrapQvQ#^Gv#imlMMnhv6A3w`WaMXBJ9s@Rc9@y`z zV6|rjF+~J3Q;DUSkN{X99oT0cr|a_3Z@q04bbKi&De%Zdi{JuZ=*0K!`RRV$A)HSo zL2nKfjP{k67wYMCuBSdvC#hFm&!rl_}e3T4*|MdJA_Lii&H zgevhtk50qWww^X5^)*XL95u5E<3sS{!tpsGhU6c^0fcz<<@7zqbz3d6y5&mM%Mz_T z5{RU7K*Jv6x4)s&hS&JXrj4oTR7X!22_%k1jfw^Zvdx?ml^wma*!R^qVuCO;Xq~5d zMz`SARW-0u7~Uj~nn%wfayw@P4&AZbXwKN`oc78Tqn@I%r&dQKvHmjxaoKqK=LBcJ zeER7Q!(pVmUaD=?m8nhP$N*y|dv_QFdXn5n{B@#KRJ}dEouhCOAH=~JBLf59xncU~ z9TQwBSR`_~Mwfe7*1|5-(M?ek!UWYupT?e*%P5UNE^(4r5X1wIY>eyb9@eMolC|c+ zPVZHM#snjnZM_s33ukz>I)%?SZ13 zSAJL7Hw`jG9-5M5NUEdnBDhoC!txw_J&$j$vimEVcf@j!sd#q_MayU2ty7PWx71M6 z)NznWB{TSFPtGbKkaoJLwX|w`(aYAh*B-f}#8{<&OoCfgDK(3fTv- z`3-4~R~Fm3N_1dgaGJVl6(;SqO||d-G*iY**7@>P0{1cpaoh}ygOS`20VhJQP)oHg zku}nib2o(EI8w-YG7z$(f&&KZ*}(@MgdHeFU3IctDJ!k@lSNfeHcV)HBdP8%eUE;} zx2~=in{RJ@gHa{6IfT>{;Kv#x4~CryP2$YGZ}nZ{TGTR&diwP9>+^Fd@V zT`m_jp-M(t8R%9OXzLY#QqG}~QHBN?yW^Pv;1Gq-3*$-iC zcHGlcw427^OHgEHj7dj;v7GTPNXvH}%Jx3k_12hv$yb|OwDuk8Y_CZnDA85Yd1MSb z;H#6{*B}B8KBHY9=iVPC1fUR-JU(V&%~V3}8Y`VWJsrY{W2sU@)GHr0Nj!-9=f0!f z_RZSOB{a44H88_c1l00L6DrRbIOK(ZK;I&sBy;|1_8f-L& z2gZd69%&N*g(UW1IN*bx`c8%9jl4Gpzi-c581}z{g52B?oveGpLsI??RAMTa z7Dia)RRkv>2+0}9KHA+i(hBN?dY~!W12UlOPCZKd{dA0znCI*V5Py9UT7#Zy{fNh7 zt1K63f%c5l+pw%uXVy+5xN-gD{{V>4Y4}70q!}ZA%H4q$n6ZJ5z<183(o{1LyhuM^maw+j>u;6u z+bq;|HPw&VAf|}Bp7``1GM@!ba=`nM?eo@o zwNSurM^a-VCjkZ9w%Ys5u*X1&B<$_r#mIP)l^mEN`nDGb1Lieh-MUkAvv{x68oo(qNA%dXgSIV~9PogN6i! zd)DIJl=54)EoxmQtA?gj`?^y&sgk3XOVp%?D&Asz*a2`r0|!?A9U z6cMA;Qv53{5!6akA;gnP1Z4W23NeySG_BQZ{l{zUN($Rn@Vi-Vw6#$~#)6^Xk}hai zJR~xbe7GbK#6NOJEMsqojZ2w8lJ0&KnArBAR$ho-Qg*BBHO4)gZ>xH5M=oBP zO|bPh?E`gyNp`r`)I%6Xic7^Da~Yci84R;VS;#=jNhIOO&!(*FZ%{0o#?Cgr^xC%C zDXQgKY5ox>6w^AYnE67kNX}mlrHJB35^xT;wnIg=UC|l`%xtJvz5BG~f{N2c)CQ)9 z#vU1t3W_+2^2-vG%`j7faIJ%!wlUjN?fq7xx>TE0Tyz&%Ep>4{YE6U~-n(UM?KD@4N~B&-ZlS$MW1?c5nFMmh%$`{UwgB}cejOuH z?2eA#>(;?R)Y!KD;+f{2;Ze9EnmMYZ!mwUg!-WIa+~>I*bf$p@8pH+7c*#uHou_Er zE-!aom2>ecDo9xf6y>Q?ut!+cGBT$QoQrZ_LIy@w?Aj_Bo~vkEr?p9RGA+8M-E?^8 zI3P%kOCuR27;ofu2Z0_@<{P&C=cK(ZxFtr<+#8>B--9Epu~$oJwDS#|cxd8TfFVzq za6X@1MBSZP-n;0_CC=$rO%sC?L2f?`s~=(`$n!Yl7yRQlpzrUevDeuSLB|MA^Xa^X zc;vb6yKR!q6pO~s9pv0=;i!@*%v}o;j)E zjHK}q1hPSeP|cP_I0_piwgDOLd+5VWP*uCJM=2?#uC9@%on&=VvNOnV?i)U4{%=oA z{cv%E7T^bh^t5uocuXTMW>qMmLl;#9{QX&QPj6284`tdr+jv|flWgDi-O9QiTxkW~ z7~WX($Q6mola9oKJ%)4KX~OxjW!uJ{r+jXD2#j#MPiV8wCz2&b?;Mjx9U?7*jv<1E z2OY`P*l*1a(oH3#t*f_GizO4()mPO!#I*DbURen^;8YyrEBb@mKF>+AX>9S(9pQf# z8MsIE=Rm)z=`)RUj?P zyAk2|W3j@H!%1zqCu@t*rLLyqRZ`|h>|SYHspLrmKBMzFJ@m5TI%*`e5XCm(=5M+4a^cN;|UBveUe$;VGi00G7ceV^NcZ7-l@MahzjI zn>VZb-)7Pqb+>RzU}<@nCyk~@atLxV4hY~$_C538MmL{QcGmYaQf}>_&tGqeAX(^c z(b6=~73G#u2~vL%C$aB?k%a_9%ZH*7vu$@rw$EL5lyuQH3jeO>&{FRCFbo zoDqT9ixb%AB>NHt`_hlLr%LvXJd@94+)Z9j85)}1O&c^>7!2ztCnM&5e&-tHYF*dU zN{4HGx2E)zF;q<)X0%)$Y2q0L@?}>U^%-0q{@s8{xKQ7Ay~~cP*^Y+#Bf$W6JcwKAMU$qhI%~i?^Wrn8IClJ!cC7oxHsT7td%rV@)2?243BPUgc z+})S!2JEK2*!(0GzBRRtBM~A&6Xb}%^>V%-P(}}-{93O1cYJDl+~QRDcWP&7`*tj& zIrZ&~9>Y-TCaslj6*lUb7vknq3Z_@W8Rfx!h{g^F)M>SPrC#2O0YJBl&91#@D5>iw_^Jhv z+#!mcWC$ue&aK0Wg$s=51oqWiY^$fb(?z#oc*S&;4C3chU8A02r!gM@lt630HaM}) z3H8TwjE!`EM7K`V>Ami!VehL=O)VY5mX@k0-ccf3s$)Rnp%kmJd`tjka7q#nEQ~5Z zS~1xv6f%I_RLjNVj0G{} z;&|rp@W=2-58}urK^)D0ghQlLQ+vh0G~_gYl0t4QWy z611TMIA<|n2L5HoeR(|}@TR4Xk_}XCbZ+h_5%CyII*RVPlF!uco!#q2KH1!~mlZ$x zMNJ~JQ&YJfMUrv?BQ|iOK4J(NJ+w}Gtv4JulcT zV3%{;DWbJtd=18m7;exK;L98Wp~}jt%_4wM_ECYHlD$vxTOn@m4wcP!8SnXoZIrtY zR{UKy>7XKOcEa0>e!Tvlo^XRQ`S z*^Ii7LlpJ)_VxGE^}hSJH(b97ODftf^2fm2rtK8?IX(-4fJw)c{Re$>R^aRI$)RI# zddtj|;hGhcq)RJ-g(d z+Hj})L(RJEdz)r;4|7>8)-AzrdU|@u?jqw?O)F&?@V(q{An+wr1nfa1H#^o@_Qitt zI$Af3`Q$siP1u1=?Q&V#B|boKWO zH4GIAPADU;XqGCu!^pBq^OYtMp9i^Mdnd6vq4y5-wN=zhLVo+NmNaHbBDlB|ina=vsTm=89Ro=en3E%qFJ&XPKm!_VdSM%~dEsVpFUm8~Ubb%=J+ilB z&%CM)55ml}7W%wR7mnoe2e)-2BZ>9o#~O)q-q$I&Ls}lLI8vfm;R_XP^t9kf_??Q$ z!Z0}lo&*m09lOP&=%?Qny}4UWe~O|l$pqDK_!K|GiYN{y@g3b6LgeJCG4dRJW7b=? z1a}L4vXh0!MOLvIZ~;sq*(A5H+c-ZTV8|zyRdyw{|Gp*SE85 z>%P*el*q8Gm3K;+42_Tn7ycA(N%>@CfHi9EK88aFRa0#5KA>!>`>Ya4J6A5z7bH z=b)55Tip2U!NC|mu7Xq*FMtQX>8slNZ0V-pt(F-o>0_9qMHH`C@H|c2=ZPgq0Cyg}{{USi z)^vtcrmvopa?@AT(#DbqX=%)&MeUQw9E@aRw|@F$dZwRy1fh~Lebrlp0FXVty3CMQ zutwF$~(QhkI zZU>$)bK6-;{#I;#b*@9^_xbv3*?$Hy(_FWH)(AZ7e=OvdTESE zSvWkwGNTU4q?~pc$vua2s`-cvKpE7_Wx}G0t~%OT+8H2V;newu<*073rDb$R&*|;X z{b-8mxE5DQW_ckG6QhKU#BwUatHoTA+a#z8NdrCPrq8$3T*TCS5TrFy85(#9Z`xd!;u^#jD;lQBn9^eM55Sts*UqSZ<#6VS45bk4bl4yV>o!VuOBg=xMARH3_5TK6a z5EQa0|iRFOzk-3&) zBwxdVU%#O2eU211b-AEHrN3HAP8~hUF;a z*+vcuvEoP|s6L?jk=Q2XovElKNs<_5AHs!XY?eX+?5*wQ$Yb1s2*xz)yeu@UQngPk z=>#%ISgjJN!n&-4`OlxbkRJpb9{tXe@A5}2u96B`XjWx~DkWN%SXD;=agQi)aq08p zjFNS&g6U^=3K_IY(lX4{@^PHBUMoq&$QhAvs2O>FA=sRE9s74=x7{vLR*C)|k{GSP zA~{tiIT1k;24Koryxqn~>~aUHt+u}7GgHcL6xQfs0x;1qkIJipzy&${Imf#(KBrT! z^tWo;YuskP$vWj@V<{>Ka?Sk1Be*9Wy}p?dNI5Fs!vQ zv#62TOR>T10PY5TbL;Fe+!k9!o+?C+s zUiSs|j?pmt!X=)bty(Aw2)tA&$PxxSfyICr_Wo@uTP(?MkX`O|bZ){*X}r!IfNU{5 zK*l?d#7Avzxz#Pj&1F4IQLr(vjTAJJN}-pTBe+lpaqsJmYpMI0?DcIO%CdPl1Ym$H zMSl>&dtjFL$8N*Ept_|*l=Wv@H4J-d;LYRwL1|-;l7jL8>LdUIl~z-bap(`ebz=2C zo|bB|*@|j3{vr-QjwLd|N%i(Q^Z*}!N>gW4QCB^pvaCr~EfU0KMwN%~nc6U?7{}s> zXXHB(gNti^ZW^174J4*6EFXYKQ-~-@K&Q=x{_mHuz&OrH!8B*8(i7O~VFe^zAvW7v z+Ez+so}_~89J4oUo<|rM^uW)z=()M-WUQk!kw)=Avlfas7z%)TcK1HNwu#lu!kE=~ zfW^ZIrAhgY&F)FhzD^0!*NH92nUa;ImRT{$vd6c%{{YnX)8lV)mRzix{Y5CI+xzOx zToU6=H8V{cf*6$GL;nD)&M8OF1bp<9)$1KCvh5wtg=0u=K^(*+E@GF$MrA+U$aQRc zXXT8`ih`oD?+pzwltohvo^Z#@C?$CE2LrYTw{m|yN9rZY<$0i>YoduN7NMy5vKY(_ z1aZb@dyd_Rf&%5Tlsgyuh6LjA+*0x&Hu@&q*+i(kNzVOD0H=rU1{&-}3`aBEnlvX=A=< z65n)$N5#2Q#_q~}Sg6VTvz-71O8R;a>#HlScG@}{ofOn_Lfq(~4q+vuY_3$JA2R}^ zXFd6H9)N1EM+&@8a6W#TCJ!i4<16VLI2awqzE)2v`je~yURfaH>8}}=AOWT-3n?QR z1wifWb&7-hz0bbA5;ibB2W?8VTI%lg(NIw;nPogjCsa^Ati%EOokbK;#eMsqVl|qp z4=_FbeKpq|6Zb*nYy6zLk0(Q(+<(*E0@3U zTJ(zNW&1u~x`k70Q8w|p%TEMTQ;9`oG*JlQ42J;6;>kHVAP@(r(+@_v6o?~QXye{Q$u+7|D;b|&7etFzjnhRJZ2=}gpd)K0NwE$A4b>PwJ-Nyg_P?J9Th|d0c@nE-tYEMtkJ8a53`- zMeaA4Z2lkK6#_bHLIkEz9p@QhLV!unra>be&NWf*-NjY8E~zamuL4)j-era^Lmr)! z;GW-3+VeleJ|r~pbYnhq_6gc%0d6CNi+M_Vil{3ls99PbTqUT_AcG)+0U6Fn8SU-w z-`f`J+!o^VEZ1uojDbp!*0}Kkk8p%3&#=eKK(Ch;u9mKzjbt!VF?Xp(EZlv09I*j% zPp`{3I2yKkRrYe+`?`vkb8b2s>s6lQ5#o+2<&tTmDoB-8@>vPS0|f*ej@Spx_-uNY zospX<#ne2=J(H^Y({gTTY*wwyf2*#pVI(wA)yXf2=erExfC7SjK*09KLye<%)l%DQ zuXWqYa$K)A(9+Ru=_cR40Gf;##E70w#4Yw+UsPt&{ox4ynlw0 zcA3bj&Y`IOGd$DX;z0DR!P_Wd8E!#% z_9Wy02wdyc>6s>+2TcC}^oTQXwKIJ6H+Wxj|@}wt1SAtnpPzA9M_g{$(<*Pn?Dr`DjJv z_OyFap=<0^?^`_WTU`w#axE=HFha7+>f{0=VgYX6X3j$8qV2w<#cH!%Qm*~tRzXlG z(q*N=k$ke4`2H0ckgq=cgC+y^I+Dq_(-T0UMK}b7 zf{r62it^&Vz>deT-Ltn3Pd0580@1@IU&BUjHyFo)UDhG|QNdVo$W_1qC{dhx3gdL_ z>iS*lvG)zW>vxXbU2rzLr8EqVlTb_@#F9tLiXf1B{vsHWj==OJh0kW`J??%1XJddn zS;FYZuG@O~Ure@khSJrM%TW#LbbbNVh5!mzna?H#i9>_+%M{|ZJH1$-JajMlb7Ah1fxf$e7;>J6iH>Q$pRZ&(aHrkaE7b}=t zi2ftC4ipj;pP9%Y_rcCs8>hF5o41a;W>~3_(cwi@r*aew=aI`}1$(EqMnM`MU$w7W zZk6ev*{by@J|I*rYnGE31dzFWWDF;40>?h5TsfeYPdsrJ{ZHzg!y9m2WnFtmq}NN8 zx(kS<5DDq|qdo29SbRa>jB6JkZ|`7}>4HY9ue7ax-PmnUwV|4??@Nq-3}cOe{{UEH+gWVxthUO&#bvwO?@?3L!4?)8Qyd7)R}R>9^#wzF1FnN7gW14nA>GgsAd{Rb z!)o13w;FouMTsYS%^bAwEj?Us94{1XP%uEq=1G<;A#4_0V+4bA?YTEab;`1;rn-Z` zimNg_& za5IKda($bYt;+i(6p>FuS5q`|QbO%fFNC!8(m4R3$C$^+DuLzhbCKBc=TATO0iVro zg`0U;O=7(z6xQln*%r$9URdU;NOFu2csygsjFo%?{5&@dhxux?ZC;@WY5w`HvQ!Bo zW10$M3~ECHs?4wWuns(h4tz&0`kgtp)db6JVn$;X_AspDcFO!lhIY8^nup}rXkZxg*0OXK{!;p)m4eEx~Xo|_=NgGYz zR7ovmbSoG_z8LVrIFXBY?tuyP9h);_wEPt`QrFkiPO&2RpB5^CDy+`D72;l9$9@2i zJN6kG-A_e*j@>+0XNA$(jU=(tOHLDzd^eh2E!g+Mf#1=9#ru2nZmcUi^dOBUW7eQ5ZeGDSJnvnNxMJ+ikyk&{NJSUQ}hN5zpbl zGhrD}vNH^+#&7@)p8AV*qp`zJ4NX-gMG%2XG;qSu$AVOxctJ~dQI$NDml+gXWP|BYmLGF0y z-p7_ZV?DxoYv-0Kg@UT#Q&2>cHw6(XSqu0@m;vb+9lbpa{p+}E65kvYv>Sq+Qc>so zz8Yc#C_$5vWsovsz8IixU}u&_y`izrA(D>kZ=SMxDDt!11TYxc5fMs-Y!IkVaof9L zaLNlzl0G_eUeFFXLv6P0qZIb}FW=dta-ga+(7e6`bp?S&@RWlbZs4%NIV;?Gj&+*Z zw)@fj;YCA76m@bd;k*)!P?H71fLYzVtQZ4?DV{?BsLkgEBs9`eQP;yoYcx|m!@4}a zI`Ll)7z&sOjQENgPFYvRFb^pkdJ2j;?f0vd;upG8Tf8dDwVEdn8>5PN#A$)%0E6MX zcgGRLuq}4y#3U}Sg`fakQY_XxEe#4mXn1L(s;STUH-?^a5b+Gkc&{WGU{r(0x8c^B zIBZs!YN3r)<*DZ{gB?hO&KdbEjJz}1+=ImT&o1Ehmu=h@sIC!Hz2PN_XPM`uf@k=d zWsP~2kc4RpaSYi61q6>ngOs-PG$^-figtv57yPiaKMgAJMU%@JJev$d7gi$xC?$!; zL!3d8GaZurw`$$LUmUcSn&2wxya5F+86ooaFOs=X0{#)@<=YtIN^YKsl zp5+T>2@NcWWR)0zq?e7ESg#&TU3j;+IoAIGyy&5!_^q(9#adKIDZoa$|&51}C#{{UmJs-e2ns=V@f;xZRQ0w*OP_AIObCmG~8j@Tr`xl`>+ ztt@FhG=4micyg~6Rp88}h*D1;$Faw*K6>xzJZdmHZowX_6XCPQ7aP!8t2X`H?uv^| zN8S<2T1jJY!go=R3@|ugK|a2@#xvVlZjpJoMHPmD9)bW?PlscIk{|(xuM)?~Gm?8B zOlz#E?ORKCQd3l4p=NnxV=C|=c_hvPva$Ehd3=DzG1_(Wqa8b}vA*Y}rkb9W<3aGW z%p#Ij;!iavzjN)|*z2noipMzek!v%c7s};|RGNdP^z;`>nuscHZy-fiDi(etxd+q- zmQN_hn2$_gtdC+M8CTC*AJz(gWkAB{6RrU`Ldx$SB8$ z%Q)&_?bkNC6 z9oND^$%JxFc`#C?%7kvfg2bHm2es0Y+qmj?7xqR=j^T#9)JIs%tktkchANs#*-IRP zkw}s*Kxn%TCkEZEiQVv=$PL)-*<1T&8EE6Krg|wA=2ngQ!Z_iV&BU?6I8_-L^*)~K zwN(EA4RY~dsF6%;UnwV<2n1)b?d&tAI;#8i6)VGe+B=fYRwGjj8V0JOloEdgu>$JA zcOjL1Pp*?+sXHQuzF7A~4AloFC+2?V>#C zCzWexV&g2I#fj=4#7G=BAi%F8&)kBb0!RZPhh#=~*#%SmN@=COZTrMfrN#y*V+tyf z0tGC5yz}J*eMhg?zL#z_bkz_g8&OSF93ZRs$gwKO21ZH2WjP}uPH~@14F(lgDv-Ab z;H6olXR7#gm5gk}hGG{3zjh~y$0Biz=*4CA?qZ6LhFGAOqolDkA>&3MW+L5*0gEsv zx$W!AO##mtLqVz}7ieOE5=hn~RTQzRMN!Nn2RuM5JN_=ff!U94!04@>?R()-ZJOIt zaAX0)MI43MS&2eli2x1{=KXtvjVC_Xk|NI!)^YX;IS1A%u64_oc~iidAg zTlZZMyjibuv^6Twg_4>cP1&Mx#IK>ra6@+l5*t(=>*%)5-?kbWJ-uA^E3KZ5AfThK zs}fPvQnSApg2^dlJckj$lmq4mA=h0`zg+k4Puh|?3L2SwIcnmXonA<%WXB#LV6T2W zhhdZ4p66V}eWYK*tRtjOewNzSp|$H3MtzHmjt# z%=FOsQapU6Dnmr;CJD(sk$~=09{#y6Os_T9nm()TE44+orspHUc!sLs;lXh5)A(#r z{{V;a3&~G#d5}me=*V<78I;u4w#;xbdROMOYV9Kq; zDaiFn+UI}{Q!)a2+LRx9+67g<-&YzktH7xk;^;iC&ly|{h8a9_=zh9pwN~?^6dR6^ zt-76^yj=xt`W3% zRu<;z{?%R4OIKUEWT3KB&^WjS5zjNm#fv;;@{5&>CUNfFk8nZmezNrb=UCEgouM_> z;YCigH1*#G%Hfqtw}8A$Hx30$81dh*9E)i`sl64t?H%v1@4Lf%{C!(i1i6@!Hii+& z2~<<$QmE`h1Yg0BNh2LwYS^|Nhhz!1D3%%I277^dYHFux8yPJ8xX4uU{#72oJt%>7 z&-hkJT&GjgE~WK``A1PwF(ll&OU``3{xaj1)?hg_RG?G>%ULXD} zt4EGvBP1112*<%nk9GF#p23N$?&Q4D*H2{JGraPckqly(0Xz6)h8bW~lacC12|cl$ zG&r(6cHu07NCUd$KeOdu+PA6~diz4f(tAJMZ4G60OGhlSs!j_h6{nwsz^bqaT~uLv zjCZ~I&$}u5abS+`xbGDfS_ovOvrTiiTUIxk<=`0=g2*I39GpZs4cN1C$UKsi-BnxD zVRaXCEhWwyZMe-DshWlwd1S7pia92VIq9TcEc}QJ>BX{G1H|^fZksaw)Q*=&vNyfb ziuFfX4GnF^j8U~buu8G4s*KLg30J`(LV9FlK;2ky^9=W--j3Qg^-7y_u774*w$rmy z@15x#9c8*W>ZZ5SP+VNcDFs&sILgS_W%K0cvHYB@U3Tf6wvH)wR?*&@&a$qhZR$+jcHcSm~mxsjQ0NIWNY+BeTI9cx6EH zoB@oH#FK>@zbLwuUvIQmRYJ0=-Ksn)G?{!T)l4z7IOP07h7H&$Ib_Rs?U?wCaWq|i zsNbdzCvD|czi2PCjaA2BZr-14Zk%pwKJU52Ez(O>9CN%-mjY&3k<5e;+(8Tf061IJ zYv?-Fu`jXG?@B7_iaKQQmTDVCIk5qyVGN0^X-&O0dV4`MY`^+x5jI-$9$H$?@ak?HFw>0Vf6h)3WsWf+n* z{3XPUPxrDj=Exa!UM|R^&P|Rz5yz(URV2;r)jMU@OPX4*0={!RkQnLe)==eTX++4e zlfbA+M<2rBvODq`L9_KEa{Ns8`7X^^^p`m1f~04{3WV`0RQ6SmgZ9ti$tO>iS{p68 zYS`_T$eqk*;$q-W@Uh8;LkEdNsca{p?}MCZWo4IYQ`AAYXe%lsXx$^KV@|?IDvudr zsY1-`o*-5a8(|NbvmYg0b04USUe^jg1j=v%m78SVdzRs9tf`vh*E#EA=O=~-h6jeo zk@4aJ;3Hs@fsWc!yxZihsc7#EB&(>X9}y&{ftd^{%*ulVIudZ|f0w%Xlnm%vNUyaN zjSWLmNd)D>28cz=1DK6~$xjmutTH|O>*{|H?dx4t-U;G(X~%{PW>Zfjs8%8wjzR@b zLF%jqa&UM6%M8?icusY_wb=-Lw|t|y_!N9AY3hrEZKni~7c-YLUPTjA8TO*ud%EM!;l0PMkg9Do2r^D0Q+?*9M<4ZgM;Wc9T0fpDd- zCP<^1qBv;}rv~*6p7~`M8P2s?>pb(fFa26wM!md_$RX8x7c=BbG=~bDU|N zM>a8I;DkgdQaQ1=HFe)>#|_$nnzGEZTB_nKoT;kg3Xw^Id#sVWXO4RgSvby$T&$Kl z`}NYY+~ScQm8wcH5k^%FKu+f;lQTzv2_uVr2C=6bT6H%XSz}s?r=?l=NPZrE9OHgj z3Q6G13mjoef%rpdTXl6*)0&HYmY$kHEQ(pUDT<%VpAmzAs-z;eMmc2q`sps+ETynF z<~(c4UbdvLsR{?93Db2wdkQzo-dogx~G));tun zwGzrARDK{Q6zm3j1^_n|^~7ukeFv%CwGZ(0l?e*L1N>xFh|b)VnNKnX0W4Gm0H_>5 z^dlZwZdCVKsp}!T%@mP_WZ%es zs$is=8c6A*%nMD&ATzO5Qm)*X4kY1l3CI}HOU}Z*TdF7?hin5yP9hc6CX^|sCRs34 zsO9{`GZTi#*E+f_ePr2tW^0vYr*2Zs9VNx5r>t`FRZ503Ijay~ICa94kf)b^K&lM}yy|QY0 zg;*+C_>$muRZ^>-*bSdjszR^>PMede`>w8<5ki9R5$9N@NFsP(h(<%k+@sGB^1~qH z!~lej_~fY${J8E)TDnc|vMjW8)lAS^>S!q%j#|Lb@*IHfs+dvD)dPZ9IP^K>@Pnso zwGq5ykyNd^vPceZ-6Y&aKHsf|A$I%Pql)r^j;kz;(X@O+h4o@G-k9clFJfX{EO%=) zF|DXYl4?{a5nLG+qzocaB#|;6%_9slu1Gw)fu|}9RW{2XR!?QGaRStR;@2x~{k7DZxS=-79i9jHgTQfGMe{gN3Xv;-4?y%jga@*3HhUC8hlGRlz!6d04 z7{aeUK!cIVIFLZkZbb$40>Y}cyR8z(62)Imgw7qv2_P@eg0p!JJ>E67Z;FBb(>0;plgltYn$r!CdDS8y9$+GV7jslrX- zG?GM$p=B6ygg7k5EMc4Q@;NzGSl<^7&0T7_4i5zxP8Z9k{UW-CUvKlz1@ezIE{J8 ztHZIu0oSSUw@^Yo?^0RDw?p*rWkc9xW27ln~9vHp>-eJaQLj?;B?2*tZ?Rl>3t3ErO&a zDX&I)nP-vOGZbN?VImL$gDC7-vT@s6<h2?3=bIbCDWP}pI7=Rf-?m2fTmrfioEL9Ql7{Adl zJdCRj*-Zsq!VA4E@)ow&R>4avy-RzF% zWNLJFS;9uBOE)su1BVgf9(+n;0|AJN?e%k>)oNQ#`KrCe0~oFqHjA;ul<2_7(Wy`z zCya`~46yTL@yhDjJE1STf~v{5Y_}Ud*51oi0iNgM&tE`GmkQNC2TfH*In5zw;rxFNK0~loJe7%4lDOrg zyO(|L35Ai8dRka&Db{l7nE{Pmd&bPH7mhF_k(qm@0m(W_6?VJDT@~SOF#HWoL5f9{ z>LSel0K#VkBzPl(xZ|Em+?~;paSJ*R#|M-hDyr^!ckPzBfo)HaFiIFL^&Kg;Y55L z&J=^h0HEaQ8ndO)-BNFeskc))M2g=JEbfozV<}lssPvEwo@H1uz{h<%8+3I3xo7^# z@7q05z4EVHbd`?q#~4DM90=;F!ymI)z=QdhG>TPMOs zhyaE(_@3Z|<;bYdZp4xfbv-ltL|pdueYpIMeZcGl?*PgGN87{+0u`uuO-J|U2ACC zdESOOt`yUl>NzJL6_XwjMoBP1;Bk_pu`9mMxi)9nk9utV<6Q;bu7>Kf(B0>^Fc8XR zeByPK5*Zk)gjEbXTzZ}VWug+sJ#0nXb>2H^u4i!sA>{P!XBu4Hqc$^!#o2lYwX;HLiflaM!6$!eU@$&6G?R2+qU6Z7<3$_q!ULpU;q`s zmN(?8Jy}k1^Uz(t)84J^75@M$*zbF!TGXqWnu4x5kQGsdXr@f^s)nwmXymsd{2?m73n=CR0KyAK0}@Dwpw>K&b>8Fnu_BM zEjx(q^@_4DjF7XeOsoKA?dtxZ`*#|x_CHmVZQE(6cT`)KZpCq{kW|Sf4Mg!<4<%sI z_=v9z0A)mgkUQtH=U1%_!h(X3$vs>%391^j)hWF&?s11CMRmIt-X z$->O|%L@Fo+tjn|*1qlM+SaMI_3Gyj`DMA*Sm@j`%BpkxMP))+SJMEGFOh zscn&4v-UsQQ&iV(U71;P+oJP&c@13@ zrg^9w#zBptMgm%JptA99N?e1L#<|0$yQ=4Gsid;qX(Wc=CMzXO6zv;GIE*@^zwyksiZEq7|krvt{}rk#DzkcLBtQ| zIpd5Ray+i5wh!}rop;|=o|IL^2d zqLylT3^f3xh;Tvq=Uva?d7CDT#yM#}b<6RXwoD(`g|Y)0M$AW?pPyhg>@LKBnFWt* zdg?9|k^pRjsSvmxWh8L)?~Qsx%H;s2Lgkx_55Nur{#x=m8Z1fpfcp2=nsV(Z#sO~H zmgyW(j_Sp;o<76%8nB2jVwfyPAaZl>{{X4=*4X4>AU@rJ&atS7NB!L39ytfO`Rm11 z;#7M70DB`C{Io>cs#|KLG7JO&`vI+l$Q&2Ss{w#dx3}l0l01>Olw==&ma^v|V!T5i z<;Q{-89&S%z^6WkT0O9%QD@Za>pM2x~ z?Pe;?JcZ&UF&I31clOocQYU$?j8Q>D0=alphm)}ZOAz7T{FDQq*H))FD6>gL!gEUOku^euLI7g8$s~8jr_bL| z>aMcKPf<;+9CtpLKc1izQSdUF zt)jl7&jq<)JRRP0eV#@b1n0M5>G_|Yh*@6oO?6reZCk}xH()t&!f-4`epnu#mW2Fe zz}RVNC7s=)1J#(eGD!Uf0KoYTVNFw8NpYvElgivec%1M+#yjWfr5vVM8D7&?8Vkxw zWmuUcW-i3wk?Hw&&bOt?TZ2I)Ks`+`;mJT5^W}d(*X5x1Ng8UFnl>k!7CxP|jiRnv zO33RXkwe8IwlEK&1bscUKv+T#nv?2VC8Vp4p5$SL5W|w5quL|JDTUW>t(rGYGsJAZdAy_!()IIivAPmy|JA8>s1EvtZTfrH562h z0)Lc9kifBdkuV4VcFF8}{{S)4n7%V%RryII+!M+PMGT}BKc>8>xl_bvG~CuVV7PJ% z6eJuI^YV=kNOM_KUz$>;ntF*RnzBqBcXS+KbpWNt%$h=kC?$Sw3ShVbErBjy2 zEUDv+`+{;mEePV@3?)z%iNi0ibKg1C5b`95+3lSEqfoNO)my37yseQ^zF=d=xmE4$ z_0ZhNThoeuA)j1+T9sbxE+L=sV5@h@$kZGamjsV|5_Iq>CDmw!63sNR!%VFtvbPmf z9Etpfx~piVyQ*7qhSzH8x6n zn2UE-+~}@=4SDR0q4=`P3tS2W!m>Qzqsdj*4SwaTKM*;ci2@Ixep zkjUVmkI?aNTw@2*U9Yk&m(8_rhTphvl$BSSbK%t`o|U7dQc2)K7ycOTFhZ!u@-KYC zwsm)9-|TU2n_QLkc8H^CDvT;>Cbp(j29hWlo<2d20}Ox;N{-~Ek9Jr$d4aZEHMa^{ zxE`j8sp(P`ZatVtvdpsN0ow@q@1EWD^Y0w-J$AjFCquELx%FM`3=wG#;Oiwyx>oXO zBB*F)m5DN|N09xo=(xwrBzt`{F{oK#4MrnrWjulr96-1F$Mn|OuXeg)0jP~LIBl_wE#^qfH8Y)o$c@HXiD{A73bziFSBer`M_Q!vHc-FIxrF34x zP8JtCZ8S!jTI8sXRFlNwYX~E@PaKiVXVh}z^Bu9H*7+-UrrWFAo14VErHLNlX-dk3 z%_ShhNephN9$v;b!!vPI!1Tt0S<>M=^RXplg*eGi@lZ=6xA(wT?V(_Jl;A9B_6#BW35Dgo>YN?CAyI{}fA+f|QRzRWb{f_=@i8K<~L%_UU~N);rG zV=_h#IJQU}K;m#Q-0J$i+o>%VYO7_kI`@h`F9Y0>pqb-f8Bd1bGLM&R{Ki4n6!*&5 zB9epPqMdm2;?YSWay^Qc00kr*cW+GVUx)ty5bFFtP-E1*x{ZGR3p@1D%FG4%wO2@C zZc({m{dJu^Oo@aml{)8N}itWR^>*tipgbzF~&QNGDpO#_xxEWzvZt`-{ZY2U9xE02w9JYk?xhl_Um=d z^;Zq9)kQsBZ9}R<3@TZqW9R@HcutV+3mwXtH}yc~KACopmGe;j19&#W0Jr&*Y7|BEgjB zwB*_w6KqdnX&R`{J0rXvLn#j28b^$}4DyePPdxf&Hy6H@n zSf!QSVO+BCVpTzIN_(zHVWHKt%^D?DRkXX6!r+f13=9+Np8mQnj87LIe&I2&xx&kr zOYh4kRP7VQ{UwI|OqVJpg5hYaw7hZ5VOHm zIQ3>AWaqvI;?Hdf-4|NBq_WoTOW>=jk(rCtRT-uvu_r7}N%ilMpUXrc9X^vy4~IWg z1_$o4S4i%?owcg#DlJ<#sas|nYOy!TWZbUuEW}2UvP&zHk^qjZ#5Qx=pM5d(a?e*K z{_jb*ZToilYok~x-u)fI1eQX_CNT26Z_AJ@IF;qZ(ttXuh!QnP8;b-A%ouRI&JJ1J;^|V*{{MNedtt0~~M$b!^*y+YxRg zh7Pmzdu(phfe(cuK(We%ub6`(z7N$|PEW6gv}#s%k$nBURE(D($XPjZVc7BX>~oWa)v0{kpJh9Y ziC?yQb-e9nt&7yam*}I0MQ>7kMV;8MCcqp|m$CKK&AHKeMwZ(pZOW~~aE?DVPonc3 zu%o*%#ybIp^$iWPHjSG7EIZe7OL&q+XP(()tax5l;!8$mcuZgdMnG1`0GdE$zsMc+ zGW*mQxLT*%`&tpUEpRHMQNS5yt6pqF&myY$q;mdmVxztZ73|Zm#?f5qkhLreEG49o z6M=QW;t3p&r(v9W;~texak7hQu+H)Ork?3&*)}RIoo<>Slf`Gk%JD8)MMXg#H24AX z3jkZbKa`8SLqkTA*=S)hNmT+wB!F{}7W4>5p&ha82|mM17Jt4fmE(ZQkjU7P-?KRH z=%dsA%^bPhZ`&H4JJqH@D{AEMUTKvW2*Ak)kT}K{xb84D21=W2Ar-as$9`_|ZPeCk z%36ANNhFc~0Or#Gt4RIT2flKBPCap>Z)K?X2Devi`7Te!U z?(x&M-`*5))WaK3D_p51idaC-e5(|J`y3uD!?syS?uHs|DbK7FcXRF=-uBznZuFM> zFsYq>4&7&g&I#qDi`MPE#bvp*>aGB@m5@W=A!v9GD;!c0 z%qa&fIbfB^8Ntz-stuiOsESJ->b1SzYCjg)82E+b9~X2;q$tpb45hrU$TRW6oTAnJ zNx4#7>YCqdm1cH{Vx75@++CZ4-}Mi znOh;V^6onm-~Rwm_{HJmaGkt(#q?t znp&HcRZ3cxSmH!xJ_(rq6(sgkG813Hr$s{W>j5MwweIM&MDnNaC%j>lJHzs*jluTx8Ogcl|XIDyNN%$AfD!36imY@I#sn}u+w zppSM>1oh?PwWVDxO3M_>5NM*1Jb4ZoVL`|raguxMM@@QXR|f4%_V$BrwW^+ywy7Yh zxYN4LQ5;T@z{*>R^Lf;FU*Y4q?Ww&>qnO_5ZI-)qG_u<6P*FWP()d6KY1L)&jDX%E zF*x@+f!ARADlvhOd!))MA5ds2Zd-q7B!m}w+KT9kQ!GeTN~Dv@KvV&{FCYn%=i6Ji zJ!bEq+f!TmoX+q`BsU5>iqywbEPOJJ4>*~?MiPUJcEG?o6L>d^?&hwy(pcKDL$Rn~6b5COGll`MlK0Q@ zH)E>?fOC}=mpHYFWp|Ax;j!(jNA^{#sx0DXfuXH4_b&LB zg0o{=EEZdRmY&*Pf4(PqA*Q5R+DADKrMO8saoE0aqdr_yyQ5=O)876EX;ar%P#96r z$`_c?tiGP@`{WxslWs?~=clQzuBffK+*(l_6tKb-qcxdBh|xsO2O-_L z07x2=P~i+@yO5o(8>e~QZgqQyV@WhLl{39W&{NQ)e|SmD#uHSIlB- zJHGm>vv(v`eyDC?Bo#GuQ`+kq*+!B{NnGR_bbp>StuGB zOOM@9coi0!DCm0Nm91^4DW~G)6W_pF? z;lE+Wl9o_@VZi{ac1Vm}l;Z1el~_q{nyUF^nfC?JHr?`(Zr1qeY8euyoAJpVP!hix zRd}li&v3!LduX@(s9xYp6{f1L%Rv^{xunM6_XugGF~kgI6@JyQ;LHdBOz$!XY#Kh#en8B$xqW!(PoOKNGig#s;?7nov7VTwOs!H0EchxZ;Y&` zSx>@LQu7HVGR8?>$s#wV0VTWRB%bf+ze&2kNW0r2%T@AP6gXyd8yUSBB6yg|JDWL8tlId0j{qOU+@ zvDDO%wgC>_7LdHQ=5#zsbt+dj&@GGekl6@6nXW!9?b?4H^3 zrxJhO)$x4WwrU!BdyS&+X_k_vR*h<@DiP_WaCq@`Unp)tfn_-42q7>|mkqtra;Z`9 z&ma;gjPL{>MnVbo9)us)UpMhBXO8JfY?8XYLceEV;3U|(1JgymO$>!EjGl>3t1Up+ljq;~qMMv@wG>j`-wbpwcI!QlRx0|z+Hk>H*!s)kp( zXP3Kat3Ae5Ijv~M3XQn-rC#dWb#^;t`Wgc@JJ8crq)6)mIgqlnDgviBoyj09gq8E* zaC!T6^t*9w3w2~$x`@wfr4!&-<*Jk7-d4)Uz&J>PfI~B>1F#C`T@;sVTDwVayvH>_ z83>K%A4Xrr^Xx{lTeF$|Eufe;Wt7HzK3O?pP>)hQ#ye}-cxUlIBr{Mpll$dUnArwb zEH?Ok*Lk9|*|wdqib+yvmK2hrWMCIE$TQ(HVGA>el;jr5_s|`|WWCc@)!$x*s-Y=l zm1@bUh93cm1tenwa%hNQfrU80;}gin=Hs8D!?fnC2=- z!wiL01xFm<_lIELbBKyVO-FU7oJM4<^9Op4C-{e+a5*{tT;Py#>#uPe*!J&cLd52t z4icS)`tqTwtEjJr1Az6EH8l`L8-*oDj?%w~%bb|jKK;DFchZjdzun@mucojXY_L9^^NvbJ0S5qN9a!CUvv2*nn{w&6ESE}a9E=URZ--Q%P(eN%Mld4` zKrDN5Be~8qprdP6UUo$HTDYiaZ8abKt@xKFqN=G*38hX2odE3Zl}~P5fL%Zu{{S^5 zyb)nm)(Xpv7kXNgOw}=$5v*Y2#6#N|`QzVKc!{BjJOfc*9l>4`G?JpcSRc)W9I>2x z6RLvEEcV;19yyW)F09KUuH)lR zsfO^QZYxEO?ufI()pOewspTR(O%_KbD4E27dXG2Ed+9dqZ>QSqwKP?*Nm1F-Ng@$U zg!fWZGb;AkY!>4Dk4MZKrFm@5st$?-Tel&F`iHmlavm!vv_Wbx;kr|0n+s#jw-5{ zqt7J+kw?HPqt^o-r&dxKdrEYXJEnMO@R;Zo)Ac$E&DyQ`)&FSx@{&%`gnM%eVkOYX-7vyt{=N-;| zTE#y14=x+sHMGuoPqjDEd9vKC^ve`6Q4a;Dd3h`4vz}P-IcEpT4`NRrnzXk4nYfxb zFElMI(W3{s&sbB%3Ig(t(Ew}=6;@o1DoTP4Q%469b0qRYAjN13Z04%Nm()-Bk5ZO4U@7(^IrQ9Q3FOkizc2 z#6@x6B$o8_2M5<(IOmbAqA%jJxs6o2WD+s!+rGC!BBIEo0m%r@*Z%-eX|r-|T3V}% zov+E`V9aBlXpo!?mKh_|A53RHna~>jyK%J@_?mFRh#aGCN*fvCSa!(HwzfvQx>*D( zPweydj_OZBZWXibD#(Stwjh;J%>+^v;mOd(?xd%kyYa?z>~KYIxi>Z6blKeZ zAX@0U>z%HKgKk)@7aMW6(9?W+yfHkoG_pF5I5Kh=QWSC-{uuXe;%(Hmb5UERsk${B zRFzZsLST5e7fBVkG06(Vu5d{tFMiVY3gLP z5>iv%>C@rhEYB<>4%s|_Biqgt;C#Ov`YF3%DJmNH<6K8Ln@WDP}Y$8&5OMFcKU?i1A7g2zis0>wR4inRu)${ldU{52#A3GAHw-OvETI+bu}ud`H3 zHB^n`!|@27AYfgLgc0Rju_b%2r`H-=sI=TBiW-W`r5v!x>lG_GCFKd_;(!2n`HA)Q z12{O*D~;w|r(tVsb+9#MT6hP*oHItTl03=@;B)932exsh8a#4^FWzUGhQ68BqmPJ3 zmw;2ne4)DmjQP7~>+;l@ZjxN7SsYhCHdv zsxapuvE)Z=56>n83moA%O!JzyxF1`sz!^ajlLkQ`QPvBT}dk46kx?BVZ0#818+(S~P;5 zTbcXXqqOW|RHd7dVV4}cVDTIPZ^FkQj@pA2<{!KuqlwH5MN(ysFhGmK^)dRAK?Sq; ziOw)}R!WLxu_-NA3TSB|cXg^*CNp9lGm@q-au5z;Ya*=zAjQ;IR+KaBj39y z?0cTW+g2UAp&xIp zp&)h{89n_pGD@nGAA)6Kp39!yy){2=L0wT?KJJMcqA}tIZu~&?Dm&%ASOoil+gc6+ zu&j=tR8PA0(6yUw#qQfpqo=K^mK2U9rsKjOPaxch0~ucV?%tWHAvEB~DpEptkbxT* zZ(@6D+u!#?eBFDd`DkfrDK6AdnwUmcGsKXzpppQ`BHo?*p4inzJH{nvi29yG9^Xw{ z9e@>*O4MJI-~b1>*Ti~j9Q%9dg`UNF+%=1Du-YqbRZZPsqo;YKZ^={>qf}HL;NX5* zy}rzQVja^}d4ab5HB@vErA=jJMB+aNEK>%~S}vi^GF zc%O+z$ekPx1?L#-wCSQQcr=Z4N&#T%UAE^5mZIGaB~?94?};T4yi5Qf_d(B#VOzQH z@2bXCjk5UZjUwdi|Qd z)ptu>w{|-0KZ=p2+i>`0>SStj7?oaF!txR%e6uM%^Mjo;f67(|WfQe61Yv{7`DS@! zETbMHaK~_=a-?ncpvcSL%2Cm|rhu@W_IKJ-tleF!x}ED~hSjxdBAuydkzkTyxaADY z!3>^MUics}U`G}0s9VZQ#ZK&+uI*P@O&DrwNT_%a7BR)a0lb~?i~&%boSytLS?m-y zs=6C(*LB6WZB`oiCyFW>el+kU6ipxT-CTCa1Suzx4nCTJxT`2@@3q&7>m*@WQR3yM zE6Bv20t8clJe|%zo3Q?Dpm>{Ohp9d?Yvd4!ss2=ElB~yaFjv7Rj#3i5nIz&>oU!MO zaVo07fIut{zK+d$t)#4uXIeiHKxB=Ur-(p503mr1jN=?a#HR>HB{1(j!)KS3RmS%s%;sO<#g*o&bHQ1^mmIt2)ctgmElq88R8*AfQ71V| zM^D2NOin@ti9yfe<&5^@?}AJJ08Y9UbLy7dZR-pWQ9~=dK#2Til&^e{U3e%243=Y% zdwZ14?|-4%HwueB&!LjtTR^QtJxw)fsCt4h9sH#DT(Eqj1e|sl*DgN`n^Z*7;2!6b z@=dVgL$Y9@+uK8ELw3D&F7LPQmpD^}F4${?l9ZH{UQ;9|%s>F}UeTJG|v2_n| zPYOhbl!DxVI+aS#ME_3U37_X>J_<0FEAC2^mf~ z$V|mous9?FKpcUD+?L(NXRD*zO18?1ccr@v;kPTzQ6k9W!gWk=G4b%<2OOLd9eeB0 zMGSgIY>Z>~$`Anfl`nZ)D7OCYw?Vn?cAe1;d?KQ!?m7vIQhB)&`E^oy7N(1EmW$A<$NaQ=bG{i(usl(TqxneII~EdW!#H4=B2pY>8Xlb zWS&}?+lwsJl`*`tnwCUk88q&^BUj{DGX-1_M%y=s+!o&+l23-X&_NXyt?ECBlm(h; z>MEz5^Ww`SVj!ct$g<^g>Zd35hTp1!+HEy%?ZITWZd-FvJgaJHY3FIyt)%#Zl8~Vw zRCbWaY2Gk$BXQZt!m(z!(1^`G;I`7*XkO)C_rx(qQz4Vj8YHKJ0;x_*NHSRR?dVGE zR?2OWJYN*mGzMr^-)u+`IZG;0)DR=_BX(w1k>lb42av-aIMRJ=SH^4VHk>!IGIMIuv)0v9d>UV)qO@-7otbV^ zS3%9Ci^c*{C52=O97)J1mRHUb83sUgVQss0#w$G4twCQ%Dt;=Of{bBglZ!hma>)Rc zV7Y$m6Ftr~T+;N{b#4vKCGT+FE%Z-aH9f+jIkQwAWMwN%ip^%n&_VAKk*ZFM$qUrTr-q{V-?v;;p zt%yBDOEXOhH)0t)KpQQ98CVZ+N4bxG>6Hz-!qeSE)O8eWwMku0QGBVE5lXyAlexzc zNQQjb)uJ5_)>5{Ch=|@EA9B^^ON!bj7Fy%`(FGcU3?WbzFY<0J*O4qzH zPE3A0wJ~^*6v)Z!Kvv~|xfwsxM(GTKk91o$XVEY1eTjA5cBuDe^=q9OphHbVZjPYR zyT+ki%vIuv1P*BL^eSd-qT~1Mk?KR&={H=qVgrt~Z*BG@59{b(IdSByHb@ z42*CH`Eu+J(_IMR5Q-f7tOeoxr&}$uuI~W2+$|q>&48%pp=*|5s`k>( z?6uDYEn8fpr8MzI#$yph3lJllWx&s79-wz1WxaHnc~_R3?;Az-`D~gv-Z<)Ms>8y0 z9C3J^Ta#o351v`9rIObFZd?+_wr!xYnViil70)E(N)sE%8&2t0 zUm_wv)HgbEkqVMmEa;@K1$he`0x-RSVXGHoMLJmOUJLYf)$vwGJnc(P^&&n+u!!DJ z&LzVDKwzAg<)1OGHut`&>2)A&kz6Z^)dh~8+e2@-+UKpBik%~dCZ|bilK~hPDl z6%fL;3~BBKW->7DL~YqfY<5@9RAas~rmn?vr-}g$k_w81aMLYuSlVS(1Cp>zDdb-q z!2n5tfB-n+ZqrUV3u}P9aD!hhGfi(0(p_sQoYa-6TEiAZasV7BB_uPmt^sxjILIJr zcEN1iJ9fuXx5{WL7Pe=aB!-dLR3PG#EQTnR;$rB>ktk)*^whmKtdC4e4}$IJ57+9QIU?Kah>k)etRq`g&DNhbgZNTdzM zKH@@L5(kuf;B+Hvg9CrK+DULG!u8*8U6vbkJ9gbsQnCt3Y3i+0GO>UFOpFt;Qqo|S z1&&zcFwtwjO)plO8-2RV_f!#4sj67&Xx2bwQ;V%N_*e4JcUv{8c!BFpkyz>1L;+r=hL4*40u-f~F>;;U*sde+X0)%gTxwff>ha z9O_+dcII}Lmj3{IqKeZDak`+TVJt}4QXEKGR1y_PA(=yuFA@P-w%BE(tf`u(sh1mt zDwWL(P(_&Buzr+78+$l}&kZMP8DQdVdb=l=X1NxKSk0h6pkM7-i%z!vt_3kbK$55j81W zeNC=YbZDfJL@84nBrg*$5G2PC_+udAtk3u}*m2bA$}?)YM%31LZgM^nM2cvs% z=a&N_uqQrlAeRhC_12b}<4s>2_Zx);BE}MWh;C9(91?LP_?*Zo$P9e0nQNt@%Sk^cM47~E3QfSKK;o)JL5&m)JFV3S__9|#9CrEC_r~d#ck_M=dqqY!B z8t^g(jJ|j#GU{*$;#sQgwO1M#tu5-lv3F))ERW?@Be3+w4pz%uUD9z`1zml%q^G@wz_(1nwcI2hIwNW z$Q_P*EajA*M*uNUd*>MeJ8tfKuK2m!EE5SpjcE~S7M@sSiUyOzkw_q~ynb~##z7s% zSmdFuv{6fMj!2@FfOdj;8Yv?Rdvb^Xqzre#0APcke}A{8u4v-ehTRQSBvO-298tkD zvfv&B@i|ff@`4HDoE%{Ry9lyDQb;V=MK?sFY}o0ohK9DjqCWzTo{E|TBBEa3#o+2! zf|kJNll(r|Csl;oM)h-~s-d}BVEB6IN<`B{@jljyeT*zEaum5mr!MspYDKvb7|1b9hh7 zC0#+681I(s20IMk;F|5ZwM~Yya#9_aVNFCLx6)iqy=j>xWscz^BRCDjNAV?^B2<0? z?2W+rv&#(&WU=j|9VN=;xQ$g@s-hyaqEw$h=X*#Q)T=ND9zy5WECCyJ^6OheRZ^4` zu}Z4Y$>Bg5l19Xdz~j1vFW>vhNY9uoP0_lm?UYp%4AnLD5G*lNEXwITg!!^pfW`{} z-^w$Q>=?$YbG*($hP%qzO;+va_hoUu?cLWq7^0SXnIMY-a_5Q(VUZIgWiY_wxWR8t z7+$R{)!whDwhL`^9}0xiln%?mi4wLG0oarUR1gRnqVCr_wFUYFc`B-HhJrL693`fe z$ds7EkOvl%gk^~%9l`X$s%oKhvOq0zRa8_x88sC>yf_aqVu_@0EJ_rP`TR`S^93VB zUMHwyx@~uqAZvHOVHrzZU)dWIaEi&PI$>a3^dYG&lyNV97mVSN-zloe6y+h@9zjGW}fqK zj$4f8o}!|XC>3LNNQ$bdNZFYAq$H3@;-HhqIvvw1ExL!OwD%(vRM1Rnd`5F5N_<*x z4qwKL&JPpADgY%I`{&E4+PS2O&M)kKOHk9fgc?ozh3P4GJ*K*Xrg)~c-Qa>~*Dh=6 z+1oKX_<#iilLN$-RXvZfdQImQlX6KNEYj9k?bRlxu)rD+RbvrGIJe@FqcS%Wf#n_Y zIDvP1DvD~|!F^XRO-Ca-sPwz4;*-FDrO&QOVSwWx)>|ueNm*NPvt4aM8LhQd z2_r`{#MzOHDa$rkf#NA*LWW>Qdu4h*5Y+oQJ%Y^WEah|!e^IU1D}>uxjpbMP*(#=} zoCwvUndUIS-N<7kXNeq!6cL`}3j)EoXe;hjHY&=>S$+&FNtHYsmmlILN$h-2Fb9`> z~T=qzgCHES(7H|E4PA9jww|8l z4PCmhd?iPZ5?}%0qZXA_O90@Az~UJ@76(J8@m)ax@&_mmlMAsfdqrcYc&X=-3K_yQ zri&}$D&!0@fsGvU3!0RMWb~^=_&ILe6l^%5oQiuw(6#MsccI!Pai0 z?WkxXd+jt-5$8@3~=U6K_(!6(8#a`XA++%qzl!-Kjf5V~q6!v(Yg5GV@(s-Ov%Ap%?<(mHHI`f@ zJWC)%@kx;w$Z^B~TMLj>7e1}oOkaAXS#q&O4$`TidD>){G_s=2;t2yJN*rP2cEDc4 z8BX2F(Kp64(t<*!Y2NcqOWj1?muGQ}(-@`?f(uA+6@-J3Ib|!31y3Qa9nnEkk6-A~i~{a;s2cBb(Y!j86zlAxP(3!#q89N8Ts9q9-D1J)JfAHpUH47Xb=BGSP1db0H!4}7xYSh13#9Xb zB9k8=LuZI{hE8sKFdmJn4;7D77?Zf=0E9HqS5?1yY^~R`>Fix0=@_TH?kfoqHB9Lh zHJ)cy0a`>1ay&L*oIyEW_|*NKPgSz%?^My-5-riVZXPB2zIKg-^@^evmr*} z+3@_>D00I+h&rM!Jn18^vF>f3QFETIW(yC65fsrdl?jo&;5k=d0&;99ToBsI-B$L^ zxNY?E#Y;;SLoGB$Neoo5Vox48VPdioD+o%t8P6ab z)ppA@8XB58+CPe(0e?kdkUh?d zRax!z&^5}o;a076rfNA1iOM-0c*NBXpx|*TNf`5TjQWjce~w^Y0ao2T6shAcQf{qu ztbrrDTIwULbc%TDB=9M!3Fj1RO?%`#&y-L$t=wy<*su?Y`^Q?XV6y738NJa7mDshh7fgW!9 zk4@BDS)MCR-b&h9wh~L_j#%ZH<6k+DfLNz8$1ZY2t=MtKxo_0TF5?L_w2h&l5ow01 zi*Rlo&lL3*r>99EdB}}qhCx%}DR(CzHcLowRY=N_lA!Afy}3_aWvAKqSGq&+wJ>}m zylNJ%uP)M&%Ooxv4cpAICw|IHL3t=Gi+;C4)Nr#21PdWa7)h6v!?{oa{2^F&9nJ{G zlxa6yYrdqtS1fdNv{mr3%TF5kY|c*wjl$+ez$(%LFsgm~YaDV&{{T2VEmSdKD^c6q zXjU!C>sYeUQpr_CCBjZ7Lg*trqlx%%3Rs-1m?J0yu?`M3l78Bdqb2@yIMrSRPEEjQ^28{A(&n94s5FS91J+d`3b!~fw<+2$plG9OC%?xnVR#mLQP+&-nCkV=UT2ccs z3(Ghp<#alqWNvPlqQkl_H22kKr;e&iWx7RaQ!L<<;&3M++ybM`8ge8NrN3k-l}*8WFbK@mUm#;UchR|v(wl%*2=kE zDW`^$h!KbaDG^rRyZz{aQlw&J^PYi%T0eGDc=}jOG zG@M!*+GtuX^%rf)6+DzM(ou@lPA@@iijYU)vbGeH;yGX<^upm6Bq9VBt+#2Dn0G=UJFW5Xcfyu*$d z>r-^ot2bI&izSx2<2@YIB0HSWL~5j(Mvym@N_m0@9t=D4G?g=T2s)Q7Bg&&QuO;0`~3ZJcdSYge}dSOzPPaq&PkgRJEP;wpkOyCfBqA!$|8F!;vmblbk>!?ifT$Va$G0HaY6C#EZ75STvUdfzqK?6tRGj0M zHCkU1d!2G0DpuRD6=k=szkS+n6Gvg4ktq!`iZBtDFA-WmFa|&dGE4FVF*)R<2fABz zA&Q#S9V?}_;VMZjGDss{C4!VO5A$q`%b3YvrHCDltMs`&uC}J*NwwBGdvy`+*G?#E8^5OzV%Li29enwHD-rA-as9^&yYYLg@^;wO0aJY%em+ll6z-~ zQ*pFKPfJ+xIEiCd0J3C|?xHYDhXt1a_v{#Yf76;tx{tNuw!OyH1a}H5fWn~2m8ls8 zi!aK`<$X994lN>DOtdR?M?c1V(s@C}EeUW;{WD zAgYp645~C@_|nkOO?HOgO(j#TUMs+niD8F0E&+*^loFtD!tt0M{-h1A>utBv*IunP zH%i)y2bMbFB%)ZRg;a;bo?KY8eUY32;YJ4?RB}Ecb-}{A4g@W)X53e9pU~c4bE%6e=nApi0v0{^BE#1!`Gs`(krnFdS6`sRzy;O_k8ZFe(?dKG=)k(=# zvOesr=bciis@+G@f#&n=DO5586uy+j%cA@6~BZE_;U!~n)602kP93xx^9ipm$BR$b>U|e zXpYDjqUp}j#6z7y`IdK?L{W-YqE7bM1`;yC5 z0}%8S4GkJoR6wr_B$2aAh5$;+T(kK}1o{@#OBIiL?CsN4O>W%QSS%IP=#+Mvs(M^V z1ZrD>XuwuJC}A5cjoq`zjTqhZdpdD;-`1O5;coO*OKV!HBNItT(n<@|MM~-vERsr` z`0~og-o%j(**~Pyht(g5RmM+btJqJ+arQ8>-wOwq3bX=-ZDdm|d;f@tjN*H^E;>r~8c5<>9@TZyL ze&cPWf`X@VR?&D@3xqLv)6!2Ns8)GAjIbAktGJ0{E*LNwT>G4NJvQjvn@!D4zT;}W z&|CqyQA=8ed83V49fUEKjzJ*tF_tQLdj2dtYA#N;+#f5ii}h6IZ5wYPJKA?0<7L>z z)}oHC+60bk;i{e5o$|e~z_`{@PpW}T!h!# zu5Gh?wo+NCZB%Jda%C5IJO`4TwnEP!iI>BYFz`kf1fqq=bz%;U#|&$GiqT85ZWI-3 z98*%qLnxZ23RtD($RyD^gNYR+Q0PgFXDkTTo!XZzqqm;jda1d+ouO)5bsNJ^OHnOL z11tCpUNwu%sg+RRqAq!bEZSkNs~pjuMtL5e@dNVHXXdN^lI$A==Ca^6rR(7>)~J%P zXc7p7)U`229&;5(B=VMwaC4lmY_S2gX;R#4w(Vukt*gHAyt~B-r4=3lH0X$AWsXi? z^ReVSSWK58z#~=m%Dd8St6fBpd~WJn9g!*{p%+%BoIfX#5txp~7=|3F!DYZKq>y)c z@7o1-*M|Q9WT>*qd6scCRkGtOkSZ5X1~#jwM;{R)G6fv@9jUb*s zGbD%jbA6h|*udN}Y+!v>p#Ci2rrG`@cF?pNirBUq_pXS=QAt}Q3viA! zZxE1xsse?`1co8UsLnydQw^^F0BoOeK}-_UTm=nG_0ml8JMdWyjT2>$l`;$R{z6zB zA4T(b4dXSo>38t0w)h^VE(@O#$>V@yiIkD$1y_SEQv`x=w|=IeuDJgIW%q|r>`+u* zVTRc?TEXJ2c2JC~wsVO<%QHAURr`D7V;&CEKpf*gPxPEzD1~=7Q>g9Hjk!}#Y_?O< zzwjrGmKb@tb&ftVGa@$#*aY?p0prog|lW29BG82tur`^<2*)p|}M_@`lE9 zgiLTw>w>$<4JdlYw@O%Qq#{PJ5{?VSc=5?KmxL{;-FzpK{z4KiLQHciPD<3 z=>LxHXda=G62Sx#Q~1o%GO-7|sxs~94!Wc4 z-PCJt+S>mB@-4o%MLj)jRZR0*9$I8l)Y1hU9#m%$Fp7$A44SC62 z`Q&?i%~xcbLFM64*7~6Q-a!RhG8KP7LOC9X97s|<2*AdXb~04%4eNN@cbFrJD>F2$ zLs>@aC3QOxS=53fom7IXQ!Fx>$Qai^?V8%vtV(Lif_@!Hjn;lrN>ngqkwX%W0q`8CgTOGs6nX3%SORf~3Q ziQ1aiBql4RsxVb%jga_KL|JmOESMZvg&~{Kv7kLh*ol9%%R;bQJ<&T+8a(jd9-9G1Uik7OJn%e7WXlIJxk7ab3$xGcw*tY(d zm#Lc4v~gS<)4VY*WHOc{@eBBofnmsj^H2d8=TEdxPV9Hhl~KIy+il>hw$sM(%?3te z<@`mI5#}r37y|$wY-;Y>+j^c`JwD*v)R)G-Tw{)|r6s#G??XDMSpxWoZWb$*`QAOZT*HI*Z zgW<3${=cE`t?N$0Gy%PSzWUTnpF1>M0YYqxI9lB@?bjwtu+!% zphp|!eY@*gOEfMRHVXQC<2pM_B9`dHe3_=t0(+1<{@RB;k&?iL3OzgHx9P0rE^q>z zx6}SQ(V1n;4}pW}oe<$D-K?0O56s^A9DRPI>SexAoTe(r%fxo~BSWJuTZoBR4?ul2 zGLqxrQW_wjW==(b?|?ltKmnC)J(sgeIHHm}5=r`MJWCAqk)nge+%M)e^o2=c!GR+H zpP$eE8p_rYD`J!a+)hRZzNtcQ37+Rpw9%u-ByGt7BN-r*=zmW7j@2kB6^glRdXtb3 z%Ln(@yOvSn$B9**G!d0o2LyWHgWtY~L{T8|C2(K92gqnPrksTytIH2E>R9_@xYpWA zd0~&nVdcSKaz8KlY8>tHb7nFWU|?fYp%kq(Eh~a!IPo}o{(oH@+iXQWoFOqpU+pv2uQPpYKpoV zK)^tTKHtM{Hc!tu_Q%UZ=apVgQJ;QFxb5Hn08{0rUA@wdsBWJPcJEL31;oz5QQ)>r z(UN^U+<1@F>F$T@b@qjxkMFC8Ppa*9(ITYPRgR0`a{gzHNt6!#{G|Ofhffq%=eP>^ zqY=6E)`dj5b5;X)Ve{5$4Dy*7VP+~aaJk|>XXUP;kL-nJn#d|2dObbjo?#s3YG-I0 z*N{|I4%i%ULGRzwwvO1o$-8l>QlkF=)k}?JG~{B6(?+x@3wjgD%awEJPZHh#0Dd&T z#hw=s{{ZCU=l+(q_)ek5oGEgBEd-ti#4JqD;|RcG#~rd;^wS?s`g^-~{o-qG)}dJ{ zsFX)7L&#!{72K$KB!4P^PCMa=AOKFgF2m9;mrzkg)mAD^$t^T~9X(aY{HgrCyP^IQ zH*9ir8SUJRYRk3(Nl0L`(@?`l7Zvy@X$3TKoMSve%@ zqUq_pEzy7;RV%mt#*en`RM6V`$5}yjidg58SSUz{NDCfF8Pp&E{wD5m{GgC73J#Up z>1gQc?z_&i?|!6}s_Codcch3_U=Y$Q2L}uZIZ_Bcfb}eGb*#6bo>->AR&cQMkc=Oo z`F#HXOlm9MYHJ_IYP2-$osr6`s{@ZSnFr^NIr-<;URr-1*6Mxk26$Z|1Z?+0#-nf5 zN)>6>Z_}9K5t!hWkd`2Mi=;u0d*{$(=hSCWUu)dj7^3m%>AV2U9ctm`#FOR8D#!h7 z`f6oW)=5~=$df}L^A(DCqbzakN--decfrO^bF7*}TN1}jEgQ@a6A`NMWa3Bjj12y# z8s)jtN#+g8AmY)4GN)=MYFq76pO#hDgSOb^ufc?6O5?ceh|CALt~NVQcnaV3Fgo~lMi z82mU4!M*zw8Tt1kO^P`Q;VsW61$$|zhk5k=Exk47gk3DG#)bh0!%HwPf(}*~0U-GR zkw9+0ytxH)p7_$Q_E&R8pwCQ{+{j+l&`LngITTrm9mlU7H&X~%qpC<2WMRSD1c

9tQ;?%SS<;wd);T_CNtTsGp@ z393viRj1;OG;f|m#EnB7Daz+MxJ%@A=btw?{oz>#wvG|&F8A2<+m<_?+1r(rb9fNZ z)?6BCCAdLLI{yF!Jb8*%jH3*L$(JC4!x{R?(2IPxm}+;uk7t@XgYdQ1x{5Nx!zax= z%u62;yzC}s3^1T_W-1EpD-Qdk@W)g4h31wttx%IpT80UnsVc&y6`2ozDG?zcV~zki z)zqGvbrSyoXd9!Z-A%Af8M!PANm7Af_@qf9NTHh?Ns(kYGG`L;!32@4kvdk$Sl17l z(%{PTD=%%+^e1xJt4*%a_mVw2P$$CCRnHT{6DI(&R-|#tsr)x8gaEl9k6kTqK9+3@ zPUpAo2+d^-3jYA*_i-bn5~zYv%5xxZD{^HbLn$D6TsLN>Y@3S3)5z@>n)qRw^G$3Q zBV9eNV>*z9XNsH$BcB;R&&91<8w|uQiB5@?_qQIR_>i*+WV#r*|+zdRk}G=IWJaP z*NSHNM2#6*G!ZEjdbPi>lj33(k_O8W7-mwgSCK5yh6EgO)}Y7F z16tw(hv=!Hh30`E{;JI06+0S&lJ9-CZrg2=^>FT4J4nes`F$k}oEtW=;$=HDH zw{4rE`?_YS-g|b>aobT{CW4ZRyu?gUGD+do#R5XJGIvr`s3iiNoB}N?HJ@y4Xz1)a zKXKODu9QnuwA59R&0pb9A_tYES?0<@yrS^I<=Hu9xg6#iseC+bbb#OI_w7iX3{IyI zY$g5iPq%i~)2gVjEtj4ES5w=mqob~J6d-nFl64G>$~Z8T62W3%%23Ac+nZwb z(^~uf;jvxhvRrMnS2|$~WWjHcFM;40Wl!UIxG?b)GGt(Yy`m8+r6!bJ^{8t-1dIEw?-7+uigJO%!)Z zn4x=opesjF1w>9)%ObBRJcv=pe2qtRiENI3M|EV;rn8k^{h7LjCfA^%wsj9>-KMct zy zXcAM85Y$NuaZ*Yu73YvRlA!?Pdmll!jVw^mZ;QUtN?*H{H=?(yR#wRqo-b1xy!`xP z80K8%OiTx1#PyEA+&h1!RkXVz-*&5tOGPVC+@q+bN#3LgyjV=q$OMDP+_)%iL$*Q4 z8a1-PJ|i}M2qKC5az7-)M;*6v-tKmaoAT3KWmv;nEtAspT>`jlLd0ElgWl~8%1{o-*r{)v0B%vYB~ynDJtN& z!qCEzi1Q-UC?+_Y%s@Q2$&uLb$>RwmW4x`()wYEKs_vrKbzf;vZM%<5c5TwVTeW*FqU&+fzL~U1eMpG`Cta z5R`a@NJ$xGJNt zm0OqMDhqR#*xg&g{dE;C)fKghw;^+mC#$Hr!%)#><6__}wBdtCfZEiI%3Onyv#|K_xM&VICk^GXX^; zD<~&24{nAHbC zxi>!MXW6#HN#csFN#|IXy4c)eBrl6sst$`?^w?_A9gVBXtbc*(hD>U5Qs zS#PUB_jPfUi*+MHuN=MvGlL9=!oXe#SyYl6J>gn5ZD#G<`!?fCzo*&vS~ymMvikZx1^fXOKdV5Lm+aii!{MnR}H}$Tl?J zwD*4Cy;}_=7Jux;o{~8$Ca$S?X{5LWC7lcujzlFvY%>NW0OgaG8#Hg9Y3Vdys#MXj zr)-YFTotxH&mU+Q_bp>xC_oa_F}kJlLX_1}#CbJIGjZh@T#+V01G=0Mo9frGcFY%f zc1KFBn|kkjh($bBtUGhA?5)4|Egs>Zs}Wr86qJo$6>L$- z@jn+M6W@vDjzb8?}fo`T;=IF*s3 zaD@Ycs8ooAtVk_}QckO_v1R*0*={X--SXeAR?Ec<#4XMmipnWZ0I`{)EE!ZJibotU z3`t)s?yGWKrL@_) zXJ1xbW@zfgTv1WVoa2E^(|#D#v`7joDwBW#EJl;|zeOu{ecq>W)YfiVIts=x-)UyI zPg5OQ;1)E}La4GTvk+QRBL^e6IM$1ITl$&0ER`abx~k7_tb&%Fe+pw)Q$aDA<(X1B z3(3jZxcEFcyI_tUy1XylU)tBI8cRjHd)zHn_Ku9wv{a8h$_XM~0)gU5Odb@01GHzu zPbfHc?7n^$of8ajlH>FHE}Mv-%tEEQufMGQ9lcqtb(?;w-?i?c5 z(W4161T3lttW12mvbuG@_5~F+>i+;iew12eMY>T4>6WTKafKfZ9ZnKF9G2lEioh!a z8Vu!QeA9IAtQ$&#vIMzR+%45G+~IkPOh?Q)5HJgLuV;(FvsW1o77xQI61Ul( zx)%TsW!e^<$+LIeo{r?(TwHFGh^Zr{sG1n%1ads&J}*8jsrbC$@flXg%6{YNhfO!r zZR_6Xrc`^QN@*fm*z4e_nOlfnP=}W>h)FUl#@ts21F);D9aFBO>G-|b{s`^L7-Vae z!t*R29dV|TM_DIob%?em0x9?88KBgG;0F9idi`GGQXFSsXRuqXkd~@7i(FO`7IBS zSM-QlFFjYH>P>|xDy`QVt1ZHmHFw=YCZ>LB08>({=b21~FANjp3KS0NB2KRL@yk_73((r=EVKQ!rR>K9v?DC%qIZ*Yprc~g{Bf+|`# z!70X8Dz7sY{vt+6<>GNn@;b)Z)Eeu}HQK7nS4VQ(wKWn_+%Gn-@>p(yvW@#K@5198klK_#BIGnnvBZ8RrfKSmrFkEaL zB?W^0b~ejJ+NfTx6yF6M4AUdSTJj9yt>ca}#|qL840D0(4oRyv{{Y;UC9bm9U+QaY z)3WjrKeVKho*zl&sBZV2mcbd~0s5j{jPQN>kMxj^c_4Hz;K5O?Iq z^F6d1YS-+_?Z0riTz5s1b+lZ?LPs6DhE{09Mhr42@SGM<8!V$IBO_Y39@DtbEW4j- zTWcVrnkKHg+G*ihI)|Nvi6hT4^Nr-e<;R0%Gm_+uE!=io26_v1x8g0;S6>FQg5BXo zJTkOu>yHR=lwdlra04DEvCegv$O!>39iZ7q_eRUPZ%b`-mfI`aWHU!3b5&7FDU57* z0@KeL7~d+LfJO5H2_BU;=KCwsQ(U8|q^4>sp`ciziJmudTonhI0dQ~^R@tO~EhKhI z=`bC@IFvcVbn+RKB|(@k)h)m>wdvdF6%Ayw>sLgN9nyS*mq zZrY=-yl*SAR#)!Ck_hPODn2%Nl*O4j_)Fo$oVYnIN$uGBjcVST8j|TpEu!INuZDup zCx=yTrnbjTO$w;-5}*W9rPP-Np~GTUXyly)c_L_}v@~rgl90G||xe+p}O~@m= zC;`)w<$HSI0_o=O+;^LWw$-(Fn_X@#M$ykxO>d}}K&l*>Won`&jePFdCPsGQ-9Xa3 zwY%==xHnxU{@E5vx*GVF-Ah#!&`VPsYawcR=Sq2Gl>)Kyu`0#cvU~9lfIX3UT|ry6 zI|L?O)zu4MPAl!y9Y&P~k zbx5b48j&?yOA5;2Ner@ZCBO+HDteKY^ENgcCBLbc?Yn2&TT%;jQaq8=)Lm(-A!=Iw^$ z=gfo<%sx>@o(Q>@dY?YRR7JQcAeqnvyzb=4yGNU&3RR zyEA8pB7ls7GwZ5a^RU?48lvk}wl=A)s9Nd~48|JPQbdD<%H%47s^QD>83QCJ1#_r< z4ZH4YntFT0l(&0b6))WNB4{xUMLSGew8ES`Gpwhxrenbe%1G8YgF)XYBjk&3QKM-3 zuGHEcLaQ$@-LXv*K@ctIV~tY*-zrHf=294e*!m0|DRm#Mb+THar`mSvYRIap7BM-f zLE$REH-|>_)s;0cO-52E*eyDk)!|1G zr#Vovk^uvca_!O!_ft0B6q?m;=z@ zjrxBOb#%8H^&=@>$~v32=j@xTTf=|tex%h`*4m|lp5!Brx@yXa55Sx;6By)fUI^l+ zjxmrxV0&unw)L*#V^0UEQrf6%qosPfc{Yq;Qt*5Q1rG^WGLrGgeLrW(VR^R9Tj+K~nij7qj81Y|RC?~p+C(6_|h5ht>1;A@YVE3)6eq3RvtyQmh5x~e;E zZ8N2%WTtmouLYS*>WoC55x@no6!G-RpNM)mK#%Ullby3<(xx3`IU8buN1%sEvpU2`zv$N~f(I zZL8j1HM*9T9hYN{rh2+*A&Q^)sysRYeJ>-jv^R+xE>R9n4i#OeK1m)>vW< z5nmP6mASAakP5%2;UISB>l%HmD{Qk*x;nXUp{JEc-L(RS-BV1JO;E~X^TN&t;TU$x zs`g?>ab0Gn>$S?wXl<>&X`n%E<9Cue8Xgr%%(0%K)}56kbdVGLKo9^yA%kl}^)btA z4zHR^H1BD>wymv~*SjxE-lD;{?TJp?XoQ#hD`^!{Dzh+<)FeTIu_(;TfZd4Xq+s-Z z#p?#Z>P?6HN3}Q2zU4|&4z%sz$xcsf$rJwo5gWK3U~qqZetGOJi*60KUtM&pX)6VN zGgV#b;4s{2>SR_d(7ddMXp4qcQjaGW;><^>2YlGIJtf@9cH8?4c|4aysJ+_n`+6oo z&I18SJkh9@oywL4R$O?3Gv)`g;nlO;ZfP!k87{spex*r%w!+CswGoPsFA(90l(6mS zq>xGV`S#S9t5Tq)bX4t66+)_~D0oQ3cf*1KQ}PG?BV0Gr-?nd9w!OaHNz^@vHzX+_ zp*LBldriSv7nccgtqhW98B)kI>z{s(vHhibJy~v&t*+DBr4sx-N=XEjEdvqA<>`xn zSTXZ*?dW@eHKm%Eq{wo|CYDBaR;4_~=Wgdtf>R`%CXL7nr__vseLH6aj@r@i6|;zq zWK@yH6}(RjFhDRo!_fVGe^aRR7wxONY3VOkTg@%n22vqIN{3KgPxC5+ z>D&-KfbH$6aYZC(>W_mi2wbw90qnUPf2Zr5>+gv19Gh>6QsOXGF~$W>;AQYhIQH-P z4MUcug41u3YljHpjAm61%3@3sy#D~7)7$IVe1y|-R2EGnJ^9gFCH1NnbvwIQC8?$KjKWp!3sq40-<|<0*MKvA7SIbdP1jUN7$OL?o z*oI~!84ATly5oKIcHgsXkz8$-#jlp4iRvhM%Ft6nh@i2aWmYlA#Dn-xr*IB6K(^+% zZcE~CUHMaK+%rzjwpr+@6BhJkSi-70$>A1aOl>1_Vpx^|f~O}}(7S2M>*%GJ4X*c7 zcGWvd+qbDNm0K>3<|$<2*E;#3lf|nKj%h540p;C}9X>!mu87rM>MynQ^^_ZG+h0V% zVtMK5r-$K#A1KSmz>ZkYt~>YAicoBs=qYx{vfD0}iz2hfPjYIwC7!#863tHmbPAl; zut@lW<{yh8pKxz`2Hv9hsqb-Ht?g^QQ zh@q#J-yG!?YN2ln#B7d2Gy{_Z=-rzqzjK{(^;&3UkjUnON@I5h;a9cWN`}u=&{bL~ zT8apKSdc?3?SMORP&1r*mM1?k>7z4kZGjfp314faXyh)+^h_X{5X1P6!eRp=jv$54 zAVvW?n}4O=AKD11=x}E!AfKY>j>UCUPt#_+3#aD29lUGJ#f{r*KkcDErnbl5OPv#-p1GYc_ zV010og7%%!C9tA>E0>hlf`;i2uzDgpWA=Kal?bDZN%VlSutF_B*{d$H8qhl@b<-sRZcE z(GWbv)OI*x00-;&&9ASPmUBHCTj30OBwPU~M`XgD#BspE{+^nLU(?H_ws_j}PjH%= zSt5dUf<~6Acl>O=Sjb#=U|F%m9F^mcW*Z%{DC#EJ_R3h0qlqM*6Ef9gvdEcUZ48RQ z6yof;KBLrh;qYBd;>g-QJg9XH?Ue$LXHU3NN~($JVv329B%=<6fO1G!>7n!I(*Un? z+-Dkmvvjv@+mbq|ZSPYBIC`1tZWRej95QjiJUc&^zDpmMl%GY)jn)4ECN=9ow#&S9 zSGGu6s)1vcDC!E~Sj4E#jN{Bk7-tMg&NYSKbJALzT(34pmIRR{b0t+tm6&(#%~60@ z43rVa%NWV*y6ow^Kf`q9q|1k|3oNHn{Ej{f%cZ|qw#*t1+)o*%LT;viY z3aI0dJ=-6LJ@qo-yRCB3*Uh*n=u(yBFw`3Qu%0KO5QT)F5S)Gyf!OB5q zQmkwVMRZYwC(x@B!_|j;=`QiVEElOIsJhqgE7stY%3j+IscRsKv)!SEShhHjKM6jh zWSp5-y}vh1Znm4Q^s-s^4%U*YqL5S7BS>RXtHxOpQ{kCPhg>s^a{O$3y0LaIQaV|? z8e2x(yHvyBOEUNdN27sMch8B%qrg3~k^(S2JB>H49CjA~eH1YO-NB@fRm`_)x_YaH zMVi60t0l3$EGc(av=Gei=3?Y3$qNh+(;zCnfgbvmYwMp{dTU2d)6SIaDiyTbs$rmb zX=r9ysm~U16Ug%TvJ4aaM&dlDy609$+aIdClGnB*=}$!W6*SwHvYje#7a9wMFiSy7 zOasUBSDg0!p=#d8lHFp@{~a-^N2&*j6kI zXOZRKB%_1t=pzG_Zlh+5iHQ#tE7gc%`%9IM3 zJC3A?r?fP9ladmu9ms{eL?trkn>cRj7r5g1gXY$N=^~S`%ypoGql{30iS zfG6<`d^s>INgc^7PDulfbZY+q(#raKY<%tPD*O@{r5Z;x=)*Cd&QEZo%-F#M_s*+( z{`jif?;2gI>VEFFt30toD@ilU+%&!;ej*FF3@}2R{D9}o=^gzx1k!e8SyVLBQba>R zOtlk7GB{d{#VV*F@q>i`1ArK|26NbBUgOLI+V*^Nv9dLMo&Leg!Kf0w)kUUy5wP)Eoa^Xo!Uw60H z-$g-Xl8#d+!U94Fo-hC`bKf9=*m~q@;gY{*RY6RZ>qjqxTTbgkFj)mh2aGx53m0MH zFe<EpQ%+*w?3F5LT3zowp1`30azymytN)7$@ zVYOK(XSErpGeJFkRBa=`A14u!DQ5EHl8_Do!CYkf%`UG?;cXglDEBqVS-pkRjrN1? zi*CZ&Jyxft+dF1*YT~M%mMT@6L`jhIEAs;bMZ*JgYox zUY>NzSv&})nkglX5vWX0E*F;+GJ(sOBbmkvw||%#G1Ge`=c$bJJJwn& zWONm>LvE_F31WsglLexUSV-x|#6g4#NbdOe(R8KTm#cy%?b@FUPL&EEq^jajnN$$v zBrC|1j=*3ZC$a6O8#R0zTF+TiYTM@55TaUodg&sBB$1*J#SbM8+=w~I{7NzDiKlZk zk?jq)cTIZ>$21W>qE%R|*XpF7a?psHI7ARhOhogDk}#q!A!1W010-?meG2zwyH$0< z&wZt9np~@rELAcsT|CH<$^xS}FbPl}FDB!I$O73I(Dae3-Kp%m%ExhdD5H((r>o0I z5fj9P6`8p+AyqN2WyU)N#;4vaJBrC$4VDV}+l_PzlT|{M1PXeFJcCBagdtzTP%apt zVhupR4gg=#;v z6wgQT4era!nIF)GC^?P^GT&q6&+|?Ia$&pgkY`9Gm849;26C7|*{+Z;Z$l?Za zHD2`#to4-(@KtwSBU3P$MN{auz6*67x!U`OiFjfCIF+wu8G=Uui7W{v4dpQlVI7 zja0Ew;Kr(%V9LA^OJn(oZp3!qPb?J84J8HXL)1{2ni^<@IhZtsnpxbq12SPkI4l%* z3!cRhU2;ik$E=ctHXx7P|4bxF1 z^mR3MV33m`f|551t_cIhVS$9?N#Zzydy$OGYjxtPu9h1#@WnKsc$CsKMGVU!P+22) zSip>N?xP`zEHqZ&-ZYg&p@Bc@jh4tWLsACP5<$tMer!%S?T0PxUB z;?;%|i$rU>H`7b3KObGyO~X(^Ni>pO)npAKWGXLo<%Vn!zlRwrFm(>TyKlV{?cSY2 zpLj@NW)CEdNhFG6P!*)k8wc>OVsNARbqU4WaM3|e1o2#9byy&h-x-1=5vMt@ywnHD z00Yew@@%$oqkT8o)VpTiOC|EW)ZA`D7ckdN4Do^j_-a64U6q)e07tGyLmg_3-BKF* zZ@?v+Z^c2O*_}|_RECntZKGh`9b8lR^sN-C-dQ4HEP#3^Z(I-#6rDwjrX6>+!q+sk zKq?A<OiXkO^84ncPmnsS%Jo!@iO3 zTcVcVJm9KP0ikfGqjl5bYaNL!ghGoGciDCf+`}WdQly>_pe{z^BCt3i^@Wx^S znfQ|K?pq)*C5M|G+pz7fskWy*v2(NUdle;;D&iwp=p-;vGc36hEGd8#rdJqolj>K? zu6XOkfqH*)+Lu`G6!F^cm8RcaTy2reV}!m?v`_@+g$z}3mJEAj+)6vU0z$jr-&IcA!70@sw zX9pnK_MX1&$pXzK6?H8YeG*4=w+eO;8MDZQZVSOcC4Em4KDx!H@XgLWSMB_-?yd5= zyrS0~__d#S4ZU)jYN^&h(y5(VDn@4*a;``LPjiv)?Tr+@(p{;k_+0)dB^xreEd<^W zV5E@cN_QQ>_XLkY>N=}+_0wc2zh$aL5>BV1P5Lhk9Ce9^sPB72>8!VGT=HR@c$P6*|@Oh1x`|<0cid zqlq2M3U4KU(u~ZW_AV#I4nR;>@pDo= z7%BQ4F*eKR)ifCy@2Sht9mC*Knct+IGyIFkUQZ4 z<;}w!;|MXHzMD&>j9F(t8%dG!jE5t;@1`3n8DmwtRnSi?@&dILN)N-J8YQhe ziBjhAH09;5dE1U!CW%2(@gXn0L=#)&r@S?}B{kC1m5HGM z7@3@;kzh%dR9yD&+>Iw!3{kzk27&TNrw@Bh^J?|#CtXEck%}AqRADKhmU;=)h=Vh5 zl#VNr*$Dy8cz`kOpz&X}Hu#0@^;Zh}?a3*gYS`nikxWrKse~Bv89_J&fM3SB?b}?^ zH(Ez%TZY}VP*K&=#OP2Dl2PurwG#hqP#p3I;(nzVd#0q=}1uPCD zXNZ`BGN_0%3}gl!${rcjcC&0-OG96_cHCbc>n&NH&s4&wkl?Jmc!zkGiB#gu067_K zXol+A7A^T`qOHACQo&U_#RWi;vAhaGksLEf04yC;FKiHSGDb82Tdo^+>lF>Q<}Ot& z{2*SB#D+v!d+}(HgBqw9>S)3_us+fqR+Fkvv!iCZ+bZiL z@oVoi{{RpY0mOxgQGs_(5*%~n%nK3aBToC@s&d{gbr+qVx9zWQiDLl6Ks>*aN{@ni zX*_t`p~Dp@ps{8PE=Lwqf$6Vp)mC~$_!{f<(b?rf&_?XyDq`NN#Jj67Ao*M8fN%~{ zs_u0)QPLiqkqs%0cb;fgDtNaz0aOZ;hjB_!>?3Q*f%OsFERaqNby( zfn$@O9}*X498OhOkUcm9p667p{)+K(t4i4tsS=uG5V=5#ydw!9SwPBynI3Oa#AhcO zn?b!qc3W&P+Nk_E(8mKT>|%l^Ec{(i7GK1B5Kb}MzNwP6jq{5s$9$9qDL9*@nxfCn zqM2c*xN(JrKv^YLZ*LV;@&LF1s}9&19-3d?w+hR(QLd+?cnu^bKN2YwmC7(2-?tFQ zE1uo*J$=qo#d^NnX(6*kOLvZo2_;noZej{fT}WZ_7&rqN89ns<)6S6AQb@618W^c0 zib*LT5;a+s`2t%WiV0LFwnuDd2N_11NuOXVe64F~#Z)^sO3Edxi*N%`@ZNZyCK03-&*+FN2b zH4$6w$;K#i!@^pUjG1X9<;Z##BrXO{whs<)^SR$enChDPXdhJT4#J}8%~hs7+jUy% z>e$+OXO@(jN+_9!W<*tLi66rUlP~~(DebE^4y{wgWs1kN=Uc<=by^e^I7M{&evkq06KZV>WMHaPLmY-hfe zSE-b?PabX44fZfxtYU#Anx?X$!6Gn}{#b|$h2(L7eFk(My8i%QxN7Y;3)a@$6!wRe z1y!oyO-m}fl2t`R#!KV4J=^hm`)b=fZWnk!&}8>QV7KpE1>(^qRZiWW3R$Tpcy3TH z8hH@&0y0;CXT}KR2Y%%GgR5h0TaEoR=5bK~++UkOg7oX&t~H&5VHLljY8H zuc|I|dtO-fg&nsRIx0GOQl1E-Wr?MnacSL?lA%6<*+xmg?UB{Hd+zwGk&1Bz0#dFL zo0((ta2 z__IeViIj%*Q=dWDV2@$-)pK&X*VA6-vLUV>8_UTSG*+f&Ms;Y90v;j2p23^39;3ay z^u+{_H}aHst-3AiRcU%lokbnvY_nC(ZTNUh_evraCRE5)NmYt~RhP4z@*Z6%^#1^- zT{MX+@7Bs|jgotNRV4CEQYxj%b>THH9}y$S$wk5wf)iG@@A%ZCsjk}aTrSm8(#rzT z(AURIv-t3+5=wy%233G&zzo^S_8}76XQJwz1-p4(_H=gZ-KH`mHCu5irfOK&uY;Mq zM^{iVc*&Mi$a;6hDc{E{Lp;9(pR+oba^05Ol+tfKp?|fCi6~=^(^FXl)Q#kX^D`@$ z)v+VG_~V&+EOz<_Pae7yuW6vAj(-ymB%(-4#sq-yksG-r072HB`O~)CloWe=sBpm@ z4R950C&b3F%~+g^G)tVwO2|kn5CkzH^Q6t&7kEeE5ERKka78Ctk_KMruY{%c08mMisy=6tdsi|G(o4PYjvA_AX zGJ?u-Pq^)>r|k_(zN;?Q8f#Ba?K_`uO+^e9l{Q;(ywlV-hI}9pvxyVPKxOdQ9xIdB zn*QrYv2R<>n|bt8sO_mp!~v%^gUDGnuIS;kWwi6N&sU|6($>Eh`@TE>%(Sveg1`90~=KDSFZLM>nx8AJxTYZLAsJTY-q-LSt zIQYqgIDa+}Aa49Jpkt1XU2|UV>p{EnLNufbj!H<|uc|#?xb2Hp)vw?4QHQ9G^(}4s z%J%pwqGDqlsv}7fE=73>3v-*yWgM`GQ|{};mYLG#MK-N z4so=hM9QR)0+86!rB6$$uNDh^WtQJ11)_?!k8@e=?F=^x8ea}S22)QbGb_OHE=UWK z%2`M~w9nJc{k7^XaJ;t&A(DCIf(odqj7fEcSHf7PhH~5kgia#>a*f<^!xPEz8T9UG zF~?MXD?|}V9l7qb2W52v>$PsxTX$~kUDZ%&xl^{W!=cS>54-1Rn^ zN$u3M2}M~9CMe^fimQxL5lI+$my$^l;8YR@GBb^Nw04%z*mgQigHHt&Rhwu*HGL%4 z3c6;e5=lKl3h{PAOo7TXc@>y0RfY{A*4?w!dv$i(-Fpty+n&L>sBQFe$9lN0#?#&D z93zRL3Tp+L@r z6m)4rxNudUjz~~3_=VJLewObm4$T!7<8P_5RekACLlsG-rl^q}6OBU3IFf-v;J9xo zTn@@;?ZvdWPfjioY%S5!3trixy1^}QsC$)v!nI^BvBqgC<6+=Cz{FwrfIO^FayqcK zp4Yb9>2|F3HCO8TsVKU3q@G3y!4HR=D-9a0DPsYS zTOkB)Y=jpvGT$~X-Q1hzr*l+p2<^8j*(qnIhCxpZbmE_%DPWC83eO^QDvVi!79+6M zt&`DxxovA-Piyx&%RLQZ(O#Mg5jVutl$DZ6nWf-@F+511t16Z5zHzG&_MPWz&lgbl zjsE~}G!-{E4U1`t_+nM~ff|p9Xw#B~CBKIgIb~l!prZ4Yar! zQQDxQtfH2grC$(;V@?YYX;Hh8nG34HPm_J!I>ZB^G9 zC#J2j){3eSmdOkZ(SlYvBn8?)IEM0^=ZuMrvbD!*y5DY9P{M4r6aqzpCP|`^DdU9) zEXm6yu*<}=U^4pS15_7FdZBvV+h**yI{La8-r}?Z3cG2gX(m}!r;S;^fRk`8`5-eg zxIM_hZMoHS-Sd1N%(&byG&1<`+qWE%Q^>SQBaz~wk2ngzfEqbG;c!4~9&EaOQy;PC zkB$>s$o=;B_$!xjQdI5xMDKC5+p6uCdNib|r=)27R#@Xv&yfyg3IS3`UoUV*0W~jE z?i*^|w<+r^n~Cj}wKUPv2(D9j)OCvyj#f}p#47xvEE|U&?7;fAh;PmKY~4e&?fRO-N81QnzTsxKP{}3EN-A5GOy)>T{{Rszl}{t!c_UC^Q;g$1`x2z_ zA&#!mO;dK0Zrm<)lTd{yZdVsqk`Vm7CZ%N|9ayOh17`#gjAvC1R_NHZw=0I$siC_q zqPe7Bik_XZ0yL5s=7IU23=iQ3;)k9avB1v%01t`okQ?D=)fTm!a+qzK6Z@4Xq+M_a4^4w62sMVoO+hMQQR)pHKDmkBC_3(#Z@oDI($rqHS?Y* z!gP3-1nWXM}pOBg07b5LbJ;BTucewOHCY-7Qy71EC-h-JaO3n07$Pp zw(=?|?iTv$3oQ*DOwhB+yd_~LpE1T1%u|y-6W0llK?hIN!7E(pOMw9{2_rPnIZUuv ztoE7LZ*A&|D6Q^A!7b899P$$y@ywWPOTdH0oCHCVps>ishjneiEb`QCx@aiqgNZAa zgW%Rk4-7I!va#e0M1sVA5rWyqwp^}u+r?wl*>?3cJIG{Dh^V$fR<(RoV9JE@Xu%o6 zu~Zlx!5GHvMZ6Z@HOj$FYl;X@j%w(@qKRqb$tI(QB~TB10mCN%E|(YeTTXW=wXl-W zg(IlXZ{9Z=3%p{P>~)dG!fsBGBSZ?4V~93NyFLkC+?)HyRYy=Q`*xZSikeD#I+|%v zM3jML=i%}J3acw2;zj|+JxKS}v2CKD8)jM&eyFa3XrqTPN8+MN-gbT=!w^)F+~YVn z&*H52Hrd_ubk@s7h8vYxsitOzrYy#l4!&2CenXPS8sG?rVtmKf8a*SL*X-TG8Sicz zlA&#l#+23ZRoksod_Bx&TFOV2ni>14Nf(#_PE~nwP^!ln@2Bg1Zp7J_fGTVEWKzK- zxSyOtdX|u`N)}L99w2kW4KQis+93t?VKy$`SF;4NEY7Mz>w0m|s{h=*I za>XJw%7(H7O!LO7q9%yPI7H^p%aQe9r-|aKU~UTPd1&RM74=ke3KXQHjv9GqmKa3R zI0+faUgfaPZ~!MghKX6~DeUl7d~V&mO-DBsfhDGA@$ft3JK}7T2mxd(-vcCToeY?u z+#btghUZzrzqSNP+QEN(tD)B?c}kV~hfh&Db6xPocYyXKe{nZK$V* z@0($%G>!gJ^-79aDdou^$UljN;;n@22jLd(&g+Gva$7d|vFvT}Yq!@og!KzYB`KT0 zl1A}ZtzwT2o%rzLNd$tU3PyQ4%yWco^8Atez-~E5;^^&yN(G_bG%WNMu2QTKLa6BAmI^zBkSY|CNZc7@EhutiBar0Xf#jgJNce#-P*Y#Da;Da$ z6_2Y|Ev2(;vTg`(bYMvK=aD9ems7;FXcVFYC;>|VJ#bE)rP}s=v2;pp$+(u)O*fpZIF56#k*{88k+%4kSZ>FT$!b%yIRtWP= z;Xn_BKq|7gEF2u3J*4!fYIT!uRnKL$Z+E7lr@Km&6U|u^>0JjE9G*y3k2Hx?zje<5 ze7@^`pQt~mXpS$snZ6x1k@C7L{}QsG=Lf<4lrQiJnpS0Thh<=lB^g!ZNGxP}R>II;K?wJkVWTQ_zp4Xp$4$6j zY+e5ErI(XlD;z@{v$AGHX(pMOfIJt-jetvc=cwCLX4$tRChM%PtCsOK(A?oEG?y4; zrjTWgNvDW1KzorVf>d_q#ZQ#Iqo;jWy>(j6x<31kpJrGo=pcfMDON9qRpye@(Zops z3WY50K_`mw`ghPmzLkAl_#36-q4bTl1H2s3FHA#Cm={YhMZ-I zf}!p|VFMcZb0=g8H(t!PZYpd15!&|Mrn(xcit3tGh2@@jsuC}Ugb-4pX2Cqy3JL>) z2Y1ezTAx6fDi%?a7oZTzt&4`^=b=x+g)I}UPZR!Bv$xp zWvi5u5$2vWV*>%$a%BL33C2#jok<+>18|(yxx>wcWnT8I6qU5wo~v-~dOL))60}sC zdNDe*1|^S^)y?74NW=y5W!YGe2~*h{aCFmR?i)?I#k{(YUrR+!R#WkoxSFiIZdy3J z5m53(%F;{4qh2IFJ%(6q6*b#us27cxlUgXK>PNy_5YTvE3l+{wi_ef}MZ5PHQD3 z_AOV-t;coJ(?emiSSaTd^IFg#Ed+H=9U*BHBL;2_hQRJ~t5%Krdu6|kr+lAnQQat| zkW~xhzp$?&Bw2jP%!2BK2F3x#1#a8q)fY7W&06X=byU}L6t?Rv${A_xm0URdT}cF>^AEsO zd6|!P(Hp;1>|2_>HjdlgF&fFDN@{AWd@)r3!LcjONe-CfDe%?F85ub}sz?^Ley3M$ zyHnL(_O*)LJ?g*V;isgx)hz3TT6#!^Dz=l9J_BV5yEuiY7p$r6`aX___Z8oMIRNtAmUfJ8~QBG}KgkhHCSEyUR6LhBb2Y zkPn3_vywxEAT%yn6z7wtk+k78Z3SlFth&ivCEk`8sv>(tk|?O56Zf8+%3l&Q5EvnX&mx>BI>eESGG;!r-t4XPFBbUPP z#}OYAipWv9oHktNx9(kwTX?z01R~9JhI=59p>8wt4Z)dT!Ui$;WGn}jS=8|=Mf6hT zyJ{^r3q_`$uFCZHc_|@!$`z>}3Xw-F;z-1T9DXhjj${YQf<_j%2H~RFyV}{k>g~-B z-&Mkf;VlI}##BvC=&I6Gya8fWS7+@eLhwu>&OpC(&asbz7J&1(oE4?J`@nNQJ)OUDiZZl_I7BLyOul%$kDr{^KQ3JV6xb)c89i_`b%_l z7w4&(u4!duKgBJ@+N61L6A)EMImc}?SKe!cuw7~_H2Z?0lDVm=+QTWOM4)iL#F1Ur zFBAt*$r_RirxFPS3AOG0tq$vZ{?4AjcI_2(4|k;{sjA{^hZ0I-A~`#FUKoBY#9#xf z-t*suU^ENLb06}5U^d#?D_uRcR(DEuge)~RGAQpM{v$Dfxl%w+=Tb(MZ(EynEYMo7 z)`g>r;KU_VPAlZ%oY;mT+Cq%Ih>=lOBe~Mu^Knzt-dgn6dbD+xMWGb2ma24%3}EpK z9uL5xS?|WVj=G^<% zLM@b6S*z%28gwy#lfdsNrT{o;8vt@1UqZ&g*;_90y=*q?cIvI5xKq(VEp>Hc8DGL4 zG_0#6@^JBjrv)rjatbhUkV;6J+Z>v>IM7YocWv6?x!GnEs}=4P=JQu0HAO^B z^2?7BDGY=WBIOIZaU|f70TW~0)@lpt+2X2$YFy^5XerT*bn!J?W126DBYASzBg!AP zOJRxAEOg6%p6Z)*q^7skQ^Vq2B&A5;jx-0dhmD?MV_3O=n~#GGW4?)QOIF*U+qG0T zU4?JD)68Nq&su28JiHGVMUrfmUL@eUk`H5`jxgiO11m*>GL`p%xJ`Jhl6#f1Dz#@c zl2X7WmOcZ!%@Q0p85O&-kQ=rM8e6*b-(}vfNw^ZlD_!?6HI+5U?Nc!d>dfsI`M6a$ z@K~}-&XRCr0m@w^5#gau3UBDE#Nd|LEN1I*n5J* zC8EK5vqfYx!zEp|;Z(Hdz62Q{`C48^QtZ4*$zVug7c?IG>6O=HQe34=T-42JxII;%Imzj(d&ceh-vtj`@Bh{}+oR039W6v{C#gt5AgAaWsqK4m%v zmoN{9(Ji33(&as|)g8yRVUfk&I93tyEcGoE%(6Q1Oxn5o(I{9<%2pvuKY^1wYS+4&8+B!9*xXn)KRmlZ4xnq&PgpznnB#}^} z7SAUjpC}E7Hh9CZD5&7$ZAqJht91Qff}-DZ`?^Y+dz_U}*8E>2h5(2WOSU*9N)QlZ z0mAY;jx#%>zj55_>na7>JC)k1xK!Kbx&uo|8H_T`a86{(6FiX-iILbd1xy87Q+EB3 z?U!BAbG}1G6c!7`zOtg?ZJrWR!BY$&xaC}884OXk9>j8WEszPXHy=WGhT5j1lHUwv zC56k@lBlr8v4%!atgysZF^~i0K)_-bLn#8-2PgjkQllW`oc315%I#sY-REnCT-Hlu zG_p-S#pxmjT8V=hOp&MpG{}s{7?htN1ZO%^+S^xg-D_j2+dGQk36?ZkTix!S3Ur<@ z95j(qlDu%CTon%CfnkB2S2o-Iw$VnF8%7E0DiKVpbfu0ashV&AW8oq@v*rA+koX;# zdg{*UcU0`w3R=o*W!BGU+?PHwUGG=r&aa>9tn!*4i6>ZNa!G;=0Ei74@l4#-(7IF#)JWEQ|h6lq=zv zRSMsVKf~VzD{$KPJ&iXFO}3+P&_zt~(K5#riOo)BX;x>z2nL+?w zDSTSmhE;k%2pr{%Ab&rIc&JPgGt0KCeZ{qHmg?WU>Gv(`axFzAbU$_4>P5POLWr_| z5QKFx7H3w(ajqm@N=lY$HqF&*?G;rc+hwnMQ6I!nB_+)bIYvBui{X;qVh3pn41K*d zX4`(yH<~(=MSr(W^fh>TmYSNLr`421rII!9m2gRBE=f2AeRMrC+P=y&I0=fb19j>B zB?9fqX%ll&v((dV=xFLOJbXMvQppcAcvKL zit)I^QHrS7#ChdLRTB_!e8IhOzy%qZed{L3xKz_W-?jr!PLQoJg1&lM=_hc+CKyN~ zjDg|5Y#e|K4B{mw`P)}2Ww7l1!m!#m0#`!>bglP|U7qJE@Q$HY5?V<4tjb<8#D_f9 za7ci%A0atE>`lFXeX_nvZ^=7k}7z?Sn27G0V-6+ST0q) z+ji$isy2M4`*gbBr=YpSl(Ip)uT)J0BoE=Eh}Jn>yYW(t<$G}v-~m-zHwRZN+q#~I zr}v$^Z>6WFc(2tLY6kxR#A{d%~;YVVeb_nmCk4BplWJ%_0N}Lj#Ry@;)#gY#*=hX2*y)gEN8twoZ-pZ+P_|rQH`@zda>I^zJ#Nv09eW%X6Tk zw*mlGR^TL&{5lurK!r4bxX4`<)($!VlDq?hC4~0D~a`O&x-G~H|4ja^KG_f)}W6wT{_gjOS zEm4=fwzj*4tEfAlrgWBzZ6y92R_Cl_6GtR?awLotUflTrS>1+ocHLdk{kgdXPSoAI zhRsjB%QtLl*kKwR9Kme~6BOoI6+hX4OlYF14R5wne+${BvP}KID z1G!&N#>YHQJwO!KB4X&N*d6r1fi1|su z8^bJCHSAbFpfV}!`>OS_EAN}qzQ%I%<;FH*0=GYH zPOGHYHOooU%bxVze|}txd=)jSnyQk9T9X-Sh?K&?WnM*`lOsk>KZ>378tFrG+8aP! zt((;@)E8-KsbQw6p^~zR>R_p5jzdqt)Iz~hNLk;+ErtFeD!Oi@Gj8WLiB?{AfZU{g z`L!Q!Qp;!C+s;poTAN_1O0S5M;pI;{$>V}D(YmlHQ2um(!x;)%%Y&vJAnFy)Q+ev` z;>mfoaazh7J@#m0SynK{GAA=eoWboJZOMo8WM@h{x-I3?)su19?UvoqX|q(pO-XO1 ztnp|qvQ3a=k}(^(3e4aIU{#8)4moROS6n)ew zX~6)HGu#$FpKh(Kxi0ZZOtyPsUGr5zR&7MVbyiSijw-HF5g>QussvK5GGoCwuy-Ea z*xf*urrA+ypf|e-GuD0(cBhcBTFBydlHrw8n@Lwt`CQ0e4ZPblT zO3xo9jwPs(rZPsRKtk~g?cXFBS6V%#XR})@drHAqTXCavMy+eKFh~*zhZzINPnZBl zm0Ou!JWesLgXeV6Y;(4s-{z9g80(^<(^t}MyFI$?Tezs;pm>@HB9`p4)6C#1#}r?L zkokBX>*_^3uQaR+M|lO34Fcu^Ke@_lDmgt(_HAScH3uzYov;*s-85CNJx!jA>A7e#|w@jReeUd3ux}H ztw+9NZi!hgm8RISms)FcIczEAB}Zao^^-2l2n6}?20DwUy-ciuzp@ui=Wv61$-s{`3}q_=DPj|mjJ6bjbB$6PW1|a41WfIUmL`DmhBp{FCQp(t10U(5Y#(qQB zT_LqPztb(lZna%SH7(6{r6W-I6jbuss@jCBb9vGSca-ES7XB)7B(YK3PJDmM*}F*6 z>-_lt00|A0Yg`28lBJhob#C{y>bEab_Z1!QY|-LNMS;eIGW?0Bk%l&()9#4fsbq&;`( zKIGdoQdwcHQ7gx8rj|-Ncy(yFs^?*6(| z?!ieU#9FqLg=#@Ae}@c?&a)X5up$ItJl<>!>m(ZKXKVeiY|b#BCYg|yn6jK|HpRlW z#dD&k+dG=0c0oM!7h1}AsVF9I3}zxcCn%7}vL6tsehZKZFvTTP>y|APGCjc*8gu4#MMYH{$RV@b3|k*>@9T9A=v&6%r^7&|$!Eu(L9j zEZIJs>DJwgzNqaK^nE3}QErL>T|2b}G_lmxT56gh;>k5QiB)7}1w`&$$n+z**GEU< zhgT;-%-Z4m{{Y36+D63FE!a(0o{HTry9&j(XfAYiSgAfPTY}V)P9~)wzXuNJLWFb* z!^KWxJhL|aaQ7}@-6`-MoH6u zNji^c*_McUTV1;CcfH4Tbf>4LzFQ`S*+Ww(AVn++gw&2_1*P!#oN>tYzxr3SH&%o6>8N4wcvL}2P9yN?)uTmk3FIVpU=)yaQMdVZ^&eoI4*5TN zL*>-g*3tVaKVsen*4ea>eVR8W<+xsMl}||-+|f%@Nl)R#C6Gk1kB5P>9}-HrDy)Bo z0b?OP*gI1DyY1FJ<85m>k}5c^7Yc7B6ctK?#dnH7;z^QNG>*~&2_7B>b#RTR(@mRM z0`v-o$5%&mSXSvY5LI0o;_HzeJkf-b8f14on8_lSz{>zNL3Nj7+9t1R6SJ*$8vC`@ zT6mUo5yqX%j229fDNKXN=!;v`mt&i4`2PTvAEk2{xrT~=wAOV)a@?=m zv!-2NvhFFPklU!97ycy;pi{a*%fE=8uR8<|0Q@V?9ZCf`j!(~%AS$N=Q+pHYgrlm4JKKCh8gLx zA1th)qKJ|bQuro5MJ}ek-(}i&E}-9`yId^r)5}#AWi4VPH%Mgi_;AA`N5#3Zi<6|i zk+`w+(v64hb79;T3r_6ZyGmWBc&(U6NmoMBR3&88>N!-96p)HZ97;K2&zTn)IPQX* z(Ky4@dDzWg1@akI;;jtzf}Ami8mLbgBP_D3MudcBUgsL%&7zAqTWVOD ztLwzJ=DM>YMI26B!!STmnRy%zStWoY>QaNQH@&G9(`njdj=0+3h8UuHD5~O)IWS%0 zXvvmR%vUb>?1hVRI0$`2>P@ccSeA;dpL(+Iea}qPLVJ9y^zP17!{SrMvNEAXauwqZ zmS*fSPI&ar)W`%R{`kVu=|cf?m6f%3obWK*8?VHum%}M@b4KP1qzYp(n4>(T9v%yG z=lr?HKH6g4`|6b>i+smlx#p#EDXFZsORO|PwmC^=si<-#!)H8@@o~fk4e736vTSam z?3+CF_N}p5)GM{|Tf~Bp`1ZFWK zwB1Ey)lF2clgz{kDY&B}xhs+3tZTsM-?pCpC$SJ^H~C@DHHw_OEW z+9@Hs?b+tUu;1?zSItWXa?+6W@RB>9GRMVpf!qxpyIQt2;8g9~j>)v&tX6o(-Sx&< z>0)W&Qu0MdB|LC6G1Jl*tsY$2?(?kfW!r7=jB0#xzrO zZ0(J?tV?6CwchPP9AciG?GU8{#BiadX*@t4p`2u&A>s%Dhhtn_x|3nOn(AGd9UX?Q z!C7^d7%C<)M)j{7cv8~goe^D5RX`XgmmIGlTlD^yqf|GPrQCZO{Ykp(Wv1~ePz5^4#gZS)3mj+Q3{^tINf1icbPiP(|bh(8+}`GP}}0H;4UIM z+2e_a74hA{nR0yLglYi5B;;iZ#nheM)tT&e?dj6}sTHgtrhC;?Gtx|BR&26`B0Pp% zW16;jp4iT;8^2RFP1@H}wl?jOrqge*R!MEHsjFiYRLoQ~f-}rU=n5%yjg+zeOoO15 zk6ClI+b{bj*Ja#td_Udvl$2=^g05AN_>~FcGRP^Thr1j{%1jL7MI2K(&J|Oju&=vH z*<_~Qky)X;)6%5yQ#CykQqII>XNAOM!X;9CG2*bxXOZr;^V2s`_dV9ZS!Z3k)n)-b z#@|y@Z%Su!N=U(!pi-g1WGsZ9JiYX0$+GJqtGMiH3w;%m*F`RTN|Mq@VnUL`DpWOD z3UkefX$NOuxgE80$l4SLul4Xo8zXqlp*yxc*=ww`&_}i+qN{@3(XZTe%~?%VD5!r7 zc+TM*@eJbm8QUTGy(&adM$rb@&LV=}~0FhFIN!LRFXtRyZC|L-EvmcH+2J+hm@|R)Ng% zn!xp8=aQSv%1RejNnbU z14A396?PnQuYt!HJ@m_4)tg0%;T=RaXey(ISfFERxkut$DrZv9f)$H$3~>CFGK>!f z16+w({lUG;cn%}tj@RAybOKbSwQm|Lb&cMdq3p`Qjdc#(lX%Ip zD|ZD(+P!QKxuy76Ew?I|%e0ct3WSkXMOgS2$sC)^MhH==nv&C7VZG7qx+wN!7dxF& zRL@hk?6SNyF$X!8X}lz-Qj7yWC16UE#TXN=q)vQLblpVroTThzj<+9z=G&iMI>BP9 zJ7aZii7EFoywYOlx!x~@Be?-dSxPVm2{iJf@-2g%J#;H`P)XG4inF!%oh_ZM)t6Z5 zp{$h!EpeuKP^~j~jleKq7&%tvJfx1@1y^#hn5{cIcUA3;(|Bn9?^?S`GzH7Z@**UY zN)kQ@Pc<#N=0w$bk6vOLR?O+~*Vy*VIIUp6j$Lc7?Kr^#wgO9R!ixIG~}Qly1=qie>nD zUEVn4W=?!$K7%A5n|*Zhg56k~pQdSTxzSs}V?!essF29YQP6NAMLw9xz>kRmv8vOj zo6m6Fw-vi?bz;*k!*AD8u(BzbV|Bpg}0dM0$&x^0zvCw1AW4$rFH zR~S|)=)USoii=E;B7`i-63)eopa?WUK-|oI8KPxL#!WE%hKr()86jZ z3V7kYTWJ#REY(s9YKY_bv>qBX(uq0uQ-;7SaHO94F-`W8y4GKI%{^on8%*}=#NQcB zRM4ci3eZA`CKUw7PN7s_<=mcr8966Wc984kl-_R^K8;u;rMOX4RV7KIMPEFzp@ri{ z@scweWSJAcAH&;GcY@#UJAB=(T`H%#+P*QMxl*;VqK=d_tUm(PA_|D}7&$|hC-5me zh&Bhb2^!9QDH*4@w3^%q| z0zd^T`kB;AEe&lZ+}cZgtA&KINfpA58X8EAK0!%jL~?~tad4#@DhD!qRa>UhS#7${ zws!W&r?|q@5z8DqdXgH}fJnTSITWy16vUY+=2L~kmMRas3iS>88roQPZvL*Jrl+W! zM@O|JON0Rew}TvWi6Uq_KW3Pa=PHPOY7I1!0OvRN@uhp3(N1!(X@1bRox@d6x^2x- zaHX$U=x3mcv_mbrp?l8@!srV(CH@;0=!dMD??EC z3c2Q$@)~+_rArc^my^qsM^e1Ar292D#Y)!s?U$N+&2xNYlU~xAf{rBcxkvFNy9ff7 z9$>i)$b^D5KKF0jX<18bzTCE3wPRA;Wum%V=>8_QDAj_rGb0t^j!AV=7sT1a=Vut1l*1EZ8hPLJZ}O{+m3;lJAC4{G&L6cHTHqySf;dA)Of8# zSRhF0(r+ZJF(3^oI1-Yhh~ecoH;<3YPNroz}Wv&0*j^Z^XzvlsXP~H&RYRbi+Z?$ZD`W>4 zE8DiZUK_0HH>WeKm5WgTX%1&^g59*bV@E@Gp6$7}Ez0pMuGEL%?f(D;PfA>JAPF96 z2s}n(FUL3qPi#2UbVqGf)(XgXw&{WD0An0YOaR6*WaUg`BH>FaCcs;PKgq*h0Y z0CET-KnE5W!5&~nnrWV)j7@J^VABa4$sC4dW1pGh=zgQW=c5oa@YqT-IAGCVn;Yu4 zeRSI6Z>GHT{##^}vUsMxw(AuWRL?4rA@fPaWL8`Z_{_%#upk|lZ?v7eZ`6D>+TC@y z*0XrA(o~ZpQk)Q|tsI1Sc_WjY9^`;~YxHw+8zHdEPrl)xmWpE>Qi}NEXlfa|a0p8b zliLUPI_6%i{gCdvp3PsndL6iG_RW8c8XH~0cB-YU0|zMY$ig$(e;NQga2i{*wZ>B$ zsRsm7RM>q|sI*H%e7{>^x542SSgK|fv(-xKR}^esN{JW~{l>sO%KB;Ek9<|`s@m0# zlImp?{Dc#fSm+~9UmF3u2^%@$;adP?4^zvP+Y{}BW4KgFx-9nzD{CY)P}CS+X(^ML zU-DiaUO$M1Oo9h2b_6S?&gfC#8pikg@GO`nAuW5+((_2gJa)V zr~^c;MTg!2b@d$uw(BHylkWW0R2Pw`VYoJ8jd9N@AdxY}4nRUiKbKiwY}adzzM*Hj zSZRTES_)cN{LH|1W+e=2;ZL*U(>mg+llFqR-Dj`5P~R_7qBJF{ft_OFz#c)EDIkxi z2kW9+e)ZQB+;o#}dOh)Uo*^XEv~yC{%N$SZ&xs5G9DpPof$so;Kz_ffF}31~sv|40 zc9fQ==;`)^)@yaHvaX?No5oDZEk+oVCP@-VM`b^N9DoSb-M0EAZ>LOF#cz&|Sg`Q5 z0?R9sF_YsLjX@r`j1!aT=y>06bvt}n?J>0Xd$qEp)e6a@q?sy10s;>J)I?;9ixR{K z$EfYA3LWFrd&L=}+`UV@O$bRLR^*iCt)0gXMj!xA4ab)rB=Hy|=SMe)!=Mdj)9|hm z+oO_eA=UF;Q+HmIZMYa;>Ne#n$qLi5RhSpVMLn0pI0pp!0q^>1l-%3_I*`N(vxS<*BGKQc*dp}{958! zkr|w+?7)V6Dq|hag>Gw)Qn!M zUli5r8e0Q4{MNX%42avExixOL+fZC7?sZp2t*oz{LqkPhRF4dGPsoHBC9>G`8O}x- zy8=IPZhLjIDd(-Fnf?jsqPZ+F61|MZ#vtA74w?5S3I;pEAFUt7=FBI20sZ|JT~(PG=xRb00nRn90~*%=_a zj|Px)9NZ)DibLIUBM8a~?nxR6y{#QN+!lK`Pbs!Fs_SRB)j)94JvoT6=JFboGRDk* z7Y{KiIN^p!PQGrt9j4y*Q*x=GqNh_7RP#!PCg!07_>x2XLm5)5#htvz0QMSK{@TyD zYw7;$-SxK0hy&8vC}?P_DY?5J;dsTNk)#+SAVxFl$^g@2@i(~KV!cg&l}^((fHrHg zX1{b(qIONqZr_va`b!l(y6xJofu1>PW8|R(l<_o?%o&3oCNMzaOL5AW_N$*r?3?1! z*6x*6-z|{6Wpz8XePj@{l7>$WDW{ENWY27OT(@C?q{}AJzVyz+Q)#>P5(=BGUBPSV zWvFinQfWDtjpSsLJhR6kP!8RJ&J{MT+o|^b-D!Hw&wku>)YLOUN?Ocms9{MMzcqD7 zd0UVp#27=5#oM#rs*&&N2MZj0f8qwj#(^GauKlIzb%M#TQt@A1M_{D4zk)67>kCqh zA^ajT9I0ZtR4a^NXTFjyy>;6Ax-^faHPt(|T(tF2g{Tumhd5srKftU3WeSb;!1d=V zM&|1kH3fb5Y3%Dx=DSxUaMg2}kl>cguFe@+A%o_St_k!|GF&$0gLrK{p-Z=S9n#6Q zXtxD9nd&I$_$575l0SzWk|IpJTMg>T+XZR_H;F2c!#*HE+~dp!mu}nAE3}bXAh}*?u5|Y5 zTAG?Et*(d==fq`bluN;6a;+DK$b+1pce}>MxLWSDcJ0H}4Z}rGQ7pa{1r4c~PT~~^ zt6t88AwG1#E0-Pkf^_e-I$P1}RlaKLt=ji{uiO@ypjmGbB|%x_@{{7l8Fnfk50X=i zV3hQ2a`nuDbG}+1zmn;|T?;lg%0jYko%KDgQF~~sC}T2J1&XGd#F__XL_(;>V!*Cg zNTd%Ca>2mS+q8Wy-1}NO-TAkxtZ>y&H9T(AA~>W}V$I?+N*R~yf~$eszMxR-&7)JY z<4Xk8m9X0sC0)LVu=sHCpYxE$1ch2ikn-*@=N*?LWE*p(+p0GYg%60Z~9o;{?B_FHLt$OzGS%CYLI+7 zZN-Y8>&TI1r(iIE^!;xQy^ z$YahvN3b|1!LEm4Q52HPW~I7Qw94?sPZY7zQl>CTC>dHYj04-%hzCKh^>-O=)Kr$M zwSq;dp^mDqYIYS7!xA@|CtvfDK2@*)P&;INyZUBnAtHbzcU;#o@5cb3oA$SECBogc zt`{)0^HIrBOkQ{b(n=eUSvU@5hvEZ)2i3iMp;@f9+r{7FY}FrnM5Ky{)4`}KBQefn z@W_`q#$!1kXWv`ruu#`4+o#%9cI&0;qDH$_)ugQ{f_GGGD|U>O&!abBsu*P9`YxvJ z&9P*v*R=O=Nt>WLb{Z@z_G!5Dt zYP+OewF^mbJ7%VN?UR|!Ft>zA!0`pbWIBnEIYKq&vmU`;+jph*) z=8%?fjT-Zj0!#XHhHcA)(ZOu9P}^uFm`zzdGBd|4s751(B{?bxV9v!oO0IjIVw1q9 zZ=X*6-wqR7;*k$5fQ3h1ZM-0}USy(2kWwJw%zmL+#tAGj-@Sjn zESFoW($iXMD6Ld9G;bMssiLcmYFKfT!-pdek1BC)*(U=BT^ZEPqeZu3YCFd9wur7x z6%0{7ixX5yBAFx35>6_smS!gk2YdoGTTjy4jmhDxpr^FmQ7fXev+_dzjKqrc=CZlI9 z9IWb+NP;!ND!5X?m$(W}n)-WipoV(7TP^B#w?P4?q^ql!!;VU(3*pL2M6&SY6CIn_c9vP$dOL9W5dnnPj7$ zDCU)CkHRj}8Dvw-i!-X>ih|<Xn((u71#!^?u%9#QV3}lK`5xEl)FyyIK(B& z1ppu!;s+3WF~^z(%4#~ZMQ)1o47R!?FjTYC`1z4rAoF4xJRAT{e1MP}u?j!hJ;8g1 zmI``0+f}T&tdg>>NX<;Hv7XKdBgJM=N`S$GWM_yP7h>FS)kA38+iz|_;qjM5+FTn^wB0ffrmF!z#+y?9m~b&8Vz08?(6>M22ZOl?gK1gjHdt|L2J4$1=&jy|BJUg~VtGY;I^DM3eBaVVqpo|1|lA!=S)c`9lPf{2815w8rB zl;ktmoa0)mcJ+qsc6k$W)6!Q{)q^}#lr1{Q(G|j#a2>Eyj&h?1vS49@aIUGm$8uYs z@L--PT}#Q#l_!yI7#+%B0rNS?9oK2a=J8bx_Of@Pw$;=;lq*#WG<6V~g7b32fe>|{$#}#c6w^A!%C6ETT}E@~TGv2vVTNNEm9^QJG?la8I8dJgH zOBy7ka%b?^vjt@xysAf-hE@Yj(%)Hntf91AtLbX4aMVN<>8=k@)Zqj1MOdW;URGr+ zKxPEzJ+ZB@K;Un6QqLiyg=AFjYxVZ7TV|m6$07z;VCzQ3=%-fb=7NrcZPZca zjYTzW&h{V z+d|s~_ikG$-bq{G%L|uhaJ-Ylc6C*JkbE^G<^v42ns#khRBsd%mYu;Bg8K`@8l@H1 zdXkD~U<+{$@)AD^_VWTtoMT$x)omLH%1hyNhj8Ipo5QG<$R@jO=x%m6mO2J`=ZdeD zH7rNJGb={1bMAbiK+1cJf(fc>w_RoO^>4Lp+M27(btU8zQ`E~OYXnQ#ndI`wLx4dC zxX)v)yRT~AtY3IsDB!Z%;iqXK@F`}JSW9HD84%P78zgWDd2tt_-#Qh$?umAq@olm~ zw`zM`Qh1Hv&nna?T&ts$R0r2AxW+#$^xx%-wY`GF7$w5hb5+qBWzT26;Wv6}xhN+v zs|sfkM8yIT;j>4Qxg(J+oca@jbZvdD6`r1w=eK&F3802%O1dk(Bc)0cATKhpbK;N- z70hkKXY^CiTqtsJg*X`X1mt78tkT)%ihb1ER>e_Ro*K(Z zVX2*>MA(*BzAiB=#93C^sJFOEO8g_T=^}l`17TqYFB=W}t#z=Cqg(5hl%P)2VL3aEUmrJ#6*7X6~_R3Ed7-P5s zOpcw>b>gZMi+P!wzo^Cl!^IpBEjPhi8toOwZkcNhM00#7xjd7A%+BYq#XtuRQ4NNpNb8ZQzcODtUwGzQl1g8bV0wUwc;G6@i-uGQ`tJ?H8 zE4|~5rHqj!9bC^H8jzw;jmkb#FJc1~{$BX)l*@JFZr&_)^p-u*w<{`QgB2*%w92Uy zurWG7nQ+V877Lg6BN#jSF@fbIEL~^dxLqo2P*rT&Ydl**!4)S26&00`!qBXuKPg;H z)d@EwXLH6- zs%YU_$SGc}+7L>&kybOul91h%08%hAbk}FUEHYBuBHJI?%gsGuru)Ka`N3P_#;KP; zNbw~dvRM8Rg1yQ0jk{~z=^LOqi0E69ft+z!zWtk+BJ8_|>tAQ!)*J`Rs9%L?Kiw(yve}<{c zkps#|EPX8Pxmj^-vt71jqolf8OEWU?R!L(4SSmX4c(|1vyLRpv;OKSFWNvNIXqwGx z+7*uj&T6Tnjlx9`WX2YD@`H?kSmgI7KAO(vHN+UfzUudu0@*9zku1q@tE;-D*4*{# zCWqizD(YjNOiX`_j;yD|TrnhIwp4P#Cs~_i?{(V_+;*$0t+qr9G*Q&NwFnO!$h=C4 zJx+Lr@7%YjwmNzCcfA@&qTg3)N>uTUOeqCK6*9n7C|H=H_FVTFV~*sE4O$ksHhHf* ze#vJxwX{i7Pf<~CWsarTs*DpLQ6m6*fIV382hen2(8~P3%0E@lmsrT~%$3i(L#Es6 zkKn9Z(%D^Xw<4KZ8rsO#DKfp8qiHhgjo$%5VA;v{w>JL8+V>5+aEfa*wby5*V@Ged zG?bD?z!oa*3Nd#h3Za1DOcjfSg>Ws)bv}Sf;x4Qu)9?( zm)TO+UbEY+yG9E}+OW|@M{%zdb@Nq(Nufq?v9z&NkPGC2Ay-C2k~wWvntTC1#0zualNa*Z`a2B_+o5wxZWb|ujZjPWJ+?BDz zK|=KkC7KWelFY}~@eNa7W6kGt*)}(~$xBgd+E+QB?vrzxYWXXxgB6x4emQticnk+d7#^b} zYo$}F+iKLdy6wR$!1wvtV4{MY)d?7!0tGrVdtms09D&$(*Hb_vb2+kkSTzOhb#@+! zCaa?qxG8GAd<7Ii;*0M0mxu9ABv@rqd>~x@1mZn1Fa{`|v{7DqJ2kuE_na=$W|lf@ z%{?^Iw5k=kvk&4*g-HbXg!&Fc0BfsnyU%h_ih64&Og9rnPl(LY1dOh53rFT=81LAx ze2%vAL#g&E((R(0-hfFme6+p)Jv zA@3r}fzZwGwz`=^G|}1Z^tb9el-BC>r^3SA`}m$KGPHokKtNQm9ENpbZfUl~9oAbt zroISjWrP^H#*UF-0fWf*JlK95_8pE+xud3g-d>E@?VIxXv#%))(iAndRW_;VralUs zgl7s$4Ec|Sz-O>H&aUmD)SjR9o8a%;V{uSWT<$S=t!JpKjLPmwCN&G0Bqxgy2*Dnl zNFZa8y%!c97REcM(Dtoc?%P#gV0&ke98_5NnyP_Lj2>kGlF<@FAz)7jAx=kZ_tegx z^{aGQwtXJqtfiofil35i~3V7uS!R+4Ydrxj{T1!skio;tD;D=|`2Ne{42M8sRaUt<`+kbakYfkc;Cn+z|xu)5WnynvkOKYey1!(C=rKGH=oJcuIBErf$ zt0NM?3=mIz=@$F5tLkd$sVzH_zCzK&OcGtCrk;jXV!k@grOa{`Aw(_=X9SUx-Xyj5 zoAmM1+hazv+H2Jh2o{L#k`m+j1UgCUAD}7*LU4+*82tXWbPW8 zb&jg{LnL!7%CUl}RH51#RE!0ARzio6J-g@wSs}5=R2#IRHhs;0+gGR;a@e?G%zDJ<;glmbvCxBCRqr7ZXWMDwQA<1IHu)Lih6M9~bWQKvtCA;nWzOJ6-X}8{N^}AzmRs;8K6}UoT>_a)LqMS&WDoG_+IOEH{Q%YCr zTQ!=Vj+biC-LA&ZQ3sDxM|cJ#sfZQB3Z8Q`T(Y@}JRATT zo#A-i9}ZcH@nObt&RiZqnUrO5*-xf{U3Wgn+;+Kb_9!e@3fo<@#T=I_#YIHIeq4gn zx<-nV5Pf0`A;9IN$2pYkdu$Ja)wDN*$_Kfxl{brx9^L8g@VDA;cGfi)%IK$s;dNol zpMzGSNsoxflL%u+?VmtG=h`lgp4-yO89Jv$L0eZtScZb-Jmv&g-K6H)*7A4C8Cb$PfuS`YO2yFKY`6eijjq2Ns**10R^$#Xf<8q zYVMDSqn5;!bQXma_X`B|DOcd~B#GgV)h3UaWtcM~0mT@M>E6?))0=3(NpoKDSC!7Y zdJVaFp4ZjQ<t?)FU+HFws>Uj6B%z=Y zAU8wqXIb_$9%sFtrZYvD^! z)k>nOF)Eo@Ez%sqNn2Y2+o9Y{^;Gp02NEnc=~9_ddjO>H zVjYP9VYH95H)m107?j%%$78(p4((fVn(esj=xKPoQl8OU>GI68vLEw?CXj>420%I0 zdb1OQO`k+1u=PPAmFG1*iqX0D*G(U4TI(RQQqNOKTSOtGrKF<@g_153c_tEMD-Phd zkf_F%x30mmTWM2ybo%+ZXeO?wl9umVPc-7blq!(F5eLK1@dYFfIXDbd4?FfDJEmQA z*%IDbmgx6ArzN~jWlFk2wKS!s$Au&)3&^AvT*we)94RLnw{Lr2rPs?s*6wQRyKR>5 z4LTaZS?~)Wc`}ib{{X~RB?-Xf#CeZm+Th2i)iO{X!)rlpHwO!q`hm7OscEO44e@#1 z*DGu?Q{0p-iK?J-4-f>Dvi4s`D)57j$B85e{TthR^JU(sYHR+`aMjtOaak-BG1bjI zB2OU9r3`Ga1?I%Y*jB+98RRW$n(mfvJId@$oz&`k9rl_UX=pC--RkNkrlvI!u3?T^ zM5j{h?S~BK&NJvV*>Tx4_r05M>3{Z=UOqfWPfc)nB9b+c*_A4JqzZw7%M;SD$pDm_x33~F zSS0A|yW@7*_P+jMOC_?|HMadE_oTSXT96=Et72aO2&#DS!zqs;M>X$)y+`(Jui1M* zZ<_}Ds@*mkB#!AdMRYXOz6?2&`I$M(=!JYYD&6ovz|m>l;g3BsJj2mbj;*A)Qj2l> zOYZ1yHz;piC*SZ%8$;mDZAz-kWx@uFi^n8W2Zsxs2a1A(2=GDHIC)08m>hV^!|JV6oL*&>oELjpwrO_kGbzQ)R4z=_N%w!E>G} z%IbH^zaH;T$#OWS@Y(Q3CG1PS?C2E)cD=oD>DN$qU1ip;NT-+YNvY8xp^&1mm1^^zYzScc2Jr`sFi4x4Ukw!pa5nu@y0dQTqXY`Cuw($uX~ z9wA(YQ_Yw%^C=*};%e{FUZD7wd-mSk`{p?*r&qU%l9x}74 zoJLvzS@ipG?VH`U>l;=>QFekuJTOzzy0t>nKzu2pkT}C}mLtrgI+25w!5CR=w7Xtg zwI5h(+Vo6CHNUDX*?w6XPPrgjBy$qlw6h! zMo1?b;J#?&d8Zrhv^n&5Qd8YHOXPLT{XzAr$T~!t5Z%u<2#F0@pwae517vHWRPlGG+?65HNU0T>dKlms;s2BQRYfYe-q+TW&;t74pFpY%Dw)7hykcK z+g8>4mfK%;sjq^PsK*Ue9bzk`K3g2f5-OsAqY>mV%MuT>^opGwrsu*V5W6 zYNC#K3WakRR$^mrK6S|$ZasnZ018t5x+(8c!kczFYFYzsse+C+iCYp=NMsVLdh%fB zzDMC6nzgnUR3(k-5flVe1L z@|C8XNOl3jlkhf~Y;diu?oD!kh*_puR;XyaD8q7AQldeQMNFNz=gitn-c-B&Z5C^; z(Kp+QR>&#ps=gH#L?ICjj8i@uk}w8H!jYXn&2^}b)fFb(zQQA=suZ%xMhuLF`7wy1 zlHt1pg?{-zEe)WXc~qoPGQcgBB-0Ao)|M`LjN_PQT(KcR!#T!qdk}frc^bpGjy+b{ zTf52%r+z=GH!0-WHS@re$r+4EBuf!xQr*?iarQo7Guzj;t}9J~xwetJQD5v|bi=}i zz62(&dU}RlD(avUh65lv1IyDO=}zSq&TExTEY_oRyiw50OIP7jsDc3|BS6a=cu9a; z&B+E&b!?qV+gBZ@XWQ>@w$WQAsF1ZSZ4C`*hMB2mP_HdSip?32a9nW!k6%OIW}q;) za~ofh&mFMj{nD3Gw)M)VW6xhndwQ!aCBbQ=dU`fjSz=C1(jZ}<#oV~;-iI1Rb4hWu zJ<=+BjawqdYQjVzXW|H1vP+IQ0ZH$YHE`Of#j*&gQoe$M(*b6JXzn7Lw16zmW{{K; zW0LSzB=^Ad(2f59zc%F!p4U%f-d8%tv(!sZM?E?SdD5}~QRkQ=$WA$SjHfSioa<(b zPzyR?xLBr+&rljcI$gO%`r`D>4S1!aF+FWOl_8{f1_GiLRDL-{1RR0OIT~{>UAu3z z759kg(hB(E5xot^_!G*`#hI2a>U}{$$0QO;fO5TP{>$9%Qq)A&i(C@GCs|r}sOFUj z0g-~T^9Ls=s#N#xFjT$XueRr?v)rtAsviPYll+>127E(;V@JZqp}Bdm!1;%+vg*s4 z;v*DR*v9zsQ-v1WSuU{AZTgC94W^bPr)d@$A(rPLB#9}@R0;S8Bq&rl^(WJflhbMl z<=wH@#kp>2BvAhV9tkaR$q`n6`PQd~X-f`cyo@`7PDv+Jg~(p5kWk)kJDT$xTZX!+ zO+8frVGF4ld0C`W9BRLZk9;rFIweoM>8$&Pg1*6Oj_n+=$u(h?St#O}9ZNSnHZb|g z1;ZZ19@@a>O6K$1_iIaB)|&3S6Li&9&|O}R#cHUOH5yJJc%XKvt2heY1hT1N$&8?J zOkqwW8C@(j9_zW-rh)ebC4Js0WQsSdwM$=JPI#6Pu@TP^cXP~miWxZ^4%r&yF9ItCz}bgx^WBuUl5nc-wtO>X>_-&Zyk& z_h_o7rn&PFg)tap@~|TZk2Z{u-c{rw5TcC5EcOD!UUE6XEOaUmpSWkO3dWE1>D=mSxwoVdB% zA&7zi^&Q(o%;?T zIKf{tC^^+>QFrQuo3CT-ebaxlEuPn0l$4Ea+mKu#G6hBWd8V3J_`fbJQZyO$1+$Z8 zHo=CXrl)jLS?_hR+&(56N^9-TD5xPSI3SLibPX!`e2j|Yh#3de{k?X@T`y1QtdMk? zj`wx0KrPoAcV0Brkx9xqW15|5;u0YwDc~dkV~Z|z(24q8AO*Hb{ox~Iju|wx{{Uca zI~Q_Yy4SvUH1zeh!qh2CPgCJ5P2(zfq5w=$Bw+GT8NuYE0OV=wVsAaSx$3GHW$l~A z^5-0q1gg2w#FUgE7U0~RlQSGCKP3e53^?M$x`%U_3R2frS>vpnu31~c4HF653xbIvHW=g+fXEkHhWg$&dfmTwwNOXkO~RVt zd)x9-#Znm}Rt{ozXr@t+oIp{WFkl#fmu{Qw&AooM?7i)5t!=wKbasn;kV00tNikxQ zO(U>)91vJafxzMv02qx}89QE%rq@NeE{QJGo;#e?Gf7UUEHqQOvQ%4?N1llH-E_xnBLTt^4z+ zpYnZRw_b1i@{ZYSxK>3=a<8tV4J55A6C5iUU}HrLGsQ?8$vkj%Ti>^K;Y-C`i)~X^ z?W;9WYL&cG(32%aLpv!~N1VKfaIym%08|X|&NUnhslw?~cR!T(XrR1RM|Nt>sd%Sb zG|4Tp%zQd0nN}BawKWmDEkI^aaK}8G&FXbR+y2t`OSLLf-FjPkk8$|bO-*Nl(@#%C zYhywk4~-j2!_17rBK(Wz3NQ_!ZQDE5cKvCSd&N!8rlPj@GraKw0-;|#1vx~m$go~O z5=Who71eY)J7MXT#*cRN{{H~EVp@qLn9}AIyVk1!?Gz-`H-#BOyo_T!SCI}6A+JvD zIU8je?1n&h(@UIMy^$x zzY~Af+2XuyYvoGq8=dNpa@*2*z9Iy3Nma)Q5a3n$q>8VQg}66%#t7$&7fvcSy?)Wz zJBmxC@~~YcyIt@KEmY01uN4-W>s2=1pq8rF zP?iJnb4twXfYZq&RP88EMW*ILv41l0Al9Q~r*ua@pZQ0!ulg6=D>W zE}~FKR#+wC!1pXk%WaFNw$0gBcIl0)rn`==!3B7FtK@fjg%C>dBea!J)rxr?Lq-`$ z%wriD$pv1|UQzj`IBgq-0-d$K?dr7>-)uLktKGKa8%I*rba1m-B#85#MsE$8X$b=n z_@zTSk524zing}Et7+M@)1t?FFC3H;NfkuUA}dMbL}>#7**TVxP;$z*qUylgdw#*T zDW$z_n>{UBm4+E2gi@GpQ7dw93D6cYC}oqDT}h2VZ{`(+J^uh_ZOi4l*|fehb6aX> z5z$h7KZ!+Nj)>AlJD3bn6exoV(T@>HX7vRQb6RoV>=fz=Jg7%jw^amCZFj7&*59bF zbx}!2TS8VX!&Nmjqx_;M3~v;%s=op!b&%lkagn9|lhM7is8?URC5pbsetD@RtsW_> zuZd+s%F)d$AXuVFSCcA{AZ{%9&aPXPR9n*HO>5liJ)Bc4X3l9RVI3@}rFkMiIa9;S zIeBD^wigO;4yk?3e6jT7Vjb6Yv&S~yy$4jZt}d}_N{GwHq;An z7Ev|5qoYw*LcAVHQCgu4PY4P~@VkQl0D*f0b6M;(o6o0K`di1|!q;%1dEofSMI2Kp zSd|s{#!7QoFcc8kaut0TByMY}vW`Fi7BH9Os<-bu9bFyv;cQrIB$k?>(L}*yf+LrS zq46Rv;ru{KVKN8+<4l&yj*CTXw%c}^nl!V+;Mt?1rvjFmM#*x~w1iB{kX*l%7EGxl zwPQ_Shjv|;d`En>%TCd?G$N`oY>t3KJBZA5%vxe2PGGdEKK)c6oRDsWU@C*e6Be7{{V!yv^uK(K``!0 zB(&OQth3X}y00;$RCV>WyP}esYBvp)i6K?QZX{O$RRiUY4m6>?Hs4aW62~14qOz8v zvNiaVaxqA?QZeEbGAc#P74BJi5Lo1XEii8l^SEg?l_u!e8(uqQWn*~v+dX8eZcR?U zGSwqa%%M(InmIWXW08))G|h+98)Xc8j_-2temagdnP8^1{{WQ7BB=>Rtf2Uf#G!H= z{xkjV(s^TJn{GnF_Kzq@n;-1?a_KyG3a`E>ZkPJXb$@~T#gc-7TRf#I#OEGz908t0 zXE}1qWudy!)XzzB-P>Br1eCMJAcpQJP$F|_Eq^O4RVKbJxEb-P-)O<{(RainWVu&Ym_>oD;ZsmXp_U_`bELD(K$0gFR zt*|oEx^hF48OpQ9A~B%^4*ALC#fCGvuG|SIwvE1sC3i=X`I~(X(URLsGRhumN>+}E z04kyC78iCb#JS+ks0?KB$>P-SP=3yv>ulTuZD^k3YL)Q}^zg+LU^r8SJF@(7KDh_p?h+LwCE!QB%n>pkXAfEOEbz%2h}a@a3Eq1Y@8bV|Qc& zoVLF;RPAb{r@hx#+Nr(@(P zv;P1@Z9PRBcGGUXZyUN(TdAnwh(`?!3QW}sB8oK*Wb&yw^6>!Uwv=D(rLi{z)%P98 z6=PFYBtLpGTWM!>P;d(KM*uND%ov96k}#U-^d=tQzm67PXkqt_DR;h?bw6m{BDLI` zWC*HMJ4;!3lf{q|kVHnY$j@##$p9ZuO%&T*KiThEl~>C>O%CGQ?^RJAA%a+|8RAnM zsTrJ!Bae$REXp&?jF!$y-TL3Py0g=$?h#*WC@j}FzU84|!YMpRSeYf6UH}<5vW6w& zT;MOrEOghZuN{u{)7{%yE#|Xt2d&%nOG;JdQ=j2>C6E#^;sMLdIRZPC%*i5SjZsG& zjc~iQ7VowwcYX0I>FcZGq_*3ltfRDAA*h0)7vjK89Y4esjY$KUjz)jNa-;B^wyxpc zR-s8974GL}fh4%aRWhlkqO6H=EDuZY(p5z%@62Szz~r$RI-M6$Hr1!96gzhR0JLv5 z>d+u+BS}Rx6cWcIYatCg#>wJ<;28!6dwDPpoh|)Jx9%;;TSK{R8|Kdyvy>*~TqOdo zjzfb_Q4{$pAz*T{Au=HVjw7~&zTq84`(pjFEL(1tj`dgtHPRpL6m-JhC~h(dC5ysEA$W!04}6j7*dt^nOdH@2 zk>>tN-KcxUMHEK$_JX@?D(hXsuc$P(`rG}9MO2W{Fsg#3W@Ih=WSg2YucU*RVT0SS z4RyNphj~Fky{FxA?tQTxUn(OaecJ-f;sGBz%2?1Vck^>pY?KEejXCsJXK#J>w?3Ek z2JgEStx^5yMRKFOPb1I}%F-fA(6q)k{_X;jI}?+hg0%FR_GFc}ZMV9*g>{nUOk}y$ zTqgqD$fOwKG@ePGMFgm2jB-+WA6;*l>0usGXXW~LS;M8jGUkee-jWjAslFd}m$DZrL`Lu9`a~uW{M#5JI(;Gf_Q6w%3i=zl0;G#C~`4 zxXz2=^}+auGY@Jm%l(Qy=l6lILes@dkN+mCX@XIY@} z7~!^Tpi#{mrSk`5D&B_sy*4!^pL$%jX6TNV;k`tVP{z}v1(jk%bs+%Y85DN+)lDX!kSWSB(i7&&iL|y(-sxq+Ws7cG_EUT% zRSi`JEjYSw73wh8N0!&Z#tz9117#6ZRJRh66& z2q0%54dRogeKff2t2_@$@Y6tbF#=T8M0WoQI4Is(PY^NhJT;zl&6brMQT zNxk0-;b<_3{Oa?P!4;O{S#jO9)K`j2q;%H0tF0xjM|hcJ1r|`eqnVQp682zRF6G9t>y5^rY20qJ*{+loGqn{(Jv?zk zcBzR+mxK6{kHRojkg*2@IZEW)A-Wj#IW-jwvS{3Os^A(dEoks(!gMQ3jO z&O4~c#x`|Mbqs-S}Te@Zs9NQH(X5_5!ckwHLUU~_>Y z_B!0K^#^Ni2`eS1x=DSA#?=oB(@`y2Nb3G1%Sd<@e>pA5qhiCvjN_2$utVYP-oPAw zDGq_!n`vBiv-*XyI#p|(>kcq*oF$0PAVW8mGn4&>{g zI)Br7I*GBan}ehx&2q9OQLI{Oigmf95)42?jQgh;Us>24&)7fA6R6{*cjEZo$94 z>8YN&N-B-OA$cn(Xb9mfk-(>z0FXd$znR&BXOf;Q2p};c=eF-2vhRZy<=WdS{b#F5 z#RRcXqev~K+?PV>8w$utt>s9sdAo$Zv}|t>7QF`s@-GUn@g!zI%*3tyfoW(I=UK)TZ)Ew@THQX2;+DP^2ZrCc&mWR zl^6}wmP;cZ{(c6%6pfubYdH9-t9bpKHulNI*{#`4QuNf-oj{pcAeC6FR6zu45cdoeI><7t zd-m5#S*~^FVbuPrb!LK}ZcATI^wl@n<*Tb&*i|{rY!x0C!z`I_TM7VBRI47vE1#qt zN!z=X;E!`U+3TXKxY=Z)g0Uv1oii0oUMZbOW+Fi@P6=+uxzv|iHjp$z-zG2N>-AaA zm9jfLsvl*;2JqN-YVNXcE7szzy~8!W)VosHX|9hLkTkQzrQ?ct+mS|I1(;(YvE{8O ztWos68uPXHPT;GxEnF1$3q4h+tqoN(7co6tF-Xn)nIWQXL=Xr#)x*?1gSYoR6)mr0 zTKANdaY*eq#NAE0zA5~R9YhxQ3lxzrX2gCFP?;ol&2x79H}&15q`dD=wn&!BCV3*e zR^2M#ii5c=nTg`?th}ePy_B!arAk;Vdhn~q&#A3r*N)JKynd)xWHMDcZXS&A) zLcI^cT6labGiF%9WD*#_>=B!e0La0>2fBB!U3$%KrmBJ+!$)P7sEVtUZ&cLMv36&g zcY!!zON{wR1Zw!&dqPW_&{5Ovxo&gSLz-LVO;j?-^OnzzJ+(7RigAI=Hh&i~dlrtg z?5?rUYl34=H8mf{(Ql$1)$P1;#9*!AzM%M25 zD|2QnBOo7^S36rb^BB5?j2>>-bKgS z;FgM7X(X<*g8?p{DxpYbi;!+2X2BRJtaGR8eeG_R+q}1RlIc>n3L7;gC6e7&PSey% z)2NDhBLYP$G=#QU$7Kvj0kCLoogVz(TmF0JM(dMrUfw#Jp602Z@MX49q@0AWGR_#B zg4tZkeTW``i*fEwl61}2?>&}o+k%L_4bJ&ZN#WAbRva{QEv9KW%B5KGW@ymkB0Pbt zllV~9PTAyl9g`V5Vs6kri%#0wH@gv*$GJDA_}O$@snKY64IFh7+n}sc=_Clzm1D_R zq2O>r{Kxh$GFp1 zL3)*P+`UKJcWO(k@5@aE%92`|Ib-KhS3G2Km0)19$24Gp$yuV}xFd)sMy0D+F`{YI_&TLG4S2%~|s(}}`V zzjU`?ZmYyw=X&mVZN}#mb#)Z?3iY_#W#--+h^r~ew2#U*lMDs{&JVkFzo8uxq_JFE zZ|{4?;Gc9`&7Z@yg{Y3-LmnBWZv`FWj!be==%9d3aqDH;H-^Zs*dKju`)o1S?DI=# zr?=DH;*M#pqz?w6xsfxn2k?qB6DMKvI^9_6arJ9NiYdKXJIws3qT zZ}V^~vXqdyRSN95CqACJV3pe24<)=;{(KW2#>UWN7wU}HbVp;{w{4GYYzph9@JJ}# zj7?1RBAEh~Gx^m)jAcoY{4~Jz)xXl6tJKry1IKy$saOU$f~fg zDhV8&fyfFyjdy(NzWeG5N3l9Bx2m^J&8LDIYrPH9lBRpbQ^fxO=j*EBWtw#i$BM-- zhNA$e?W3J4x6od$H1~bWZdf9*Bly<1_bgPEG%RH0A2g~9A}&bEw9W0d2Ss%Nj$MIPyW1|cN?TxxidZV>>L7}RYehXZ z3%Zt#{ux!`kjVKSJg+Z*LIA*7=?3rWY}WF%uAqL|TGG zU(ZWuAhPlCr88;ueZms4!DSHA0Nk zMH?KfaE@5u_+rWk_SC)EZ0nUi*Lo^F#T@jo(zP^idXh&-q<$pHPJ2qA4qjFvdoO=e zsh5rK(ms<}C0ZFS4_SMmsEh9%!BSd|C|H9dM6}4w@?H-a#sMwsom+c$#nkBNHz!Mt zvPZGjtTNTa=#%^^!o@itr-!)~z6 zBvI{-pI3eD0g|5Ux+n+2MFcDqyss>xRD1-;;UlvWPj5{Fy!CeJdg>|LbR9&vZJK)| zKO1<$e$NT%W8FB9u3 zK2(n3MuF}+y^FLd=B2YciWI7X3d@xoG_=(9JR=2_Y2rd3kp!^-9De#eThiT)a;c@U zPi%_SQ$32N(>zwXNg;+$6PJea6eEM5?n%!WJ(W%hwV$M&Jhj|ylx(X4Tc9*7A>C5c zMLj^z;)!A6zGKI_jAPL2FlL^9Y$lTH?16PppnH3$mg+6zJ$Z^7qC$+kc=R@;tU>$P_Hwo=<^qO#FUR$6qTre8BeV3Z^UOD=f=4ZoaqRqB;zQe9-M$$(|xXV`?K-CJoRDm4vFCb18ijoO99rY(=-Y&Nd&v|>z z?vrlq3MzH@<8efhZi~cap=ip>Pg0EB7x;vnfPKcd&$=i?F~1d`ibGqy#zHB1wik2S zrAmF9ylv20_Z36jg%p+PRZ6p_1h6zpUN>MzB^*5_aH z+OHBCq@%Y}O66mLqk<^QMvBUKxb8k(v}P)r4ZU`|?X8*pr>rz`P?|WVvb^w8(eY;f z8mA8wlP50h7e1#RqlVSK?`_~A+nc9r8!e`~O8wDvN_u%}De1vxb|P1P5@kTbsQ|V+ z_Zq_lI=Lm<&JAb%qkE%`w(^{MS+j4}Et_!v0F*DfAiY#eG;b_*Gf7EBWQ)yJTz()E z9L&6<3|!-$Ka_z@Tl%fDZ+7d=1Uq`&S7NQ2rR_Fb70!w|txX(&K{P@(0J|V8*g1bf zPC(U{dfrCU9ZtyH*2`6n(Y_{TrmKpUqNbwVMJ8S)t1_<^4#&i3k-Kxpm3wN4-G5;C z@Av7d_N~IpZm?CCl3JN+mR6-sS!oqR5>7@HRiDan*?}jysGCmO(atE0*x_S|vf0!| zY#&u;wGU1y?e;sh4#cdz*IT8UGX*s;tE`4sAb9fANszIr<`52RkZ=l&>n-cnTR%-E z8*6Y}FAgrSPL&IEjbf)UKlz%B^5Alv&?rUje8hsHoZJ5ZWj?R;n)h7|)@iPGSPW@T z6n7Amu}EbFW@x1=C<)!UEPh~5d>t}Ubc?O_${oAY$u|)Df_sd0n~tJOtil+hX%UdR z$}@ z9$Kb1rt-SdU-t&%ujE*#c`n4X^hSffY{^cq;Dm= zTrMi!-Q^eSof}nF8fJQ!1tYwI28#hyu;I;^b|3(cudSU+>J{H+&3UkGO_51!l_$B| z=<4YVmsp`j#PO_hF&=VNvd*A!82mWa&aQRpKlv`Q?#hmx+;5e2rg;Q$%q6!X0Ua~5 zNK343g&;IxfoI4d_tEHLov%AwE~~Z_ozZO@#i6^q?BiX$>g@Dyux>WGN=Rdd3%4q0 z=&2KsWmk7^8OU+xj5EG-#~iqao8L*d4JEoRpKpn%E|6{ZX=v`16Qmb8<0?sy22_$| zIV5<`8Uf|=`f8==&)SmPVcXR9d&bm9LNLBgjm8a<^ zQ1_i!-B(@hb=-AS3}uS8vi|_ix|UC0#DQxzg$>fb>weB$q zs6~qzrhkP<%JCdXR$xdRn;rF~=3O&67JX6=Pf-2Y!a$#)h3aZ1zFqePQ`Zcqm+q;8rG+nN_igK7ow2v-YG;~Sikpp9WlISHr9C>x^y@b_m(Bb(QV@PI z*y#+LP<-Hu2x;O6V-=Hs~B9>;K}yHU_uC{i-?buv)Xvf`Z#VIW^KNWrqon83*;R~m~^)ayKV zdRuiBhAKV9DonQOQ&;0hQVlA}1J5ZlBu?*;v7_cmQCnO0>!}x5E8f3B&-@Y-<-9(4Z`mFqG;lhJsO*C?k(^)PXM{~7J zvvwxd%#qeq{2klk=T$B|HE9}807Z-(U=pkkbDTCux1+JkS7)J)vaa!TwoKGDm9>-C zL0o1304jh99IPmYG08kd$YGB*Ni@v`^7lNbU#C_-hN}2_Izw-}+$D}wgU-G!ER{*& zg#dCzRpfKqS6tmoue#Z)ZOKthx9Tj4v~w`v)m72(;}c6pWCjKj4l(lp@n9R*RAK}c zxz|}l*S5iE`l!~;xwtO&^}FrKpsQ*sp-E9qT^mUBvMD8a0HDhRpr8yg$tlKJ1~s5i z+~%XY?MfHT{MGpNbHXZvQozxc5iK;uxk>?$_EqFO!PFe-a?!l{gS4*ix8Sd-tF_%} zVXdmEs78*l#8R9})iI~Tr~tCCcS2MJGBy`XokK~lHFo+qI*Wa@Tj#72y!LmNj=J?D zL=GaTkWD(LaxoY&=OEzgBXsSF;_wgegfhuwk~m5iIqvpViifD1-rpwEp=McWW4Z_$ zC_8{8@fK*KX)=iGEAr*tc&7joUdvou={JCLPiFhzE*scsSBiAW|w=m#f$(jdlsGQ-nb8yIm8V{Cmeg^eZF zQ`bwr)%`^2wZZnsQmpis+day+f=1pjmWdeSglg-}#~$O7FXALI7{^rX{;>3Ka=|@a z4MWk^KqL^vslsR@3zFnVAzs6ea6$Gx_02oSXI^@vWVh`N<3YG@`(-KQo(ijERO=-q zoE@S_ood{)DsVfYUf;{@&lZlG@6De@CBmxPQ*nmf1l1<0ngS`{XvS5flO#U^xgkR* zCH!8Q>cOk>)BcMz+FLdk>IEm-3#7{nioT;;+qPtwRmPG=N#X>Ap3R($70+)?dnaCY zOp#R7STB@!2(E%eoH+8oO3&JRq?X%+ zwU+A1Zx@KjgW~JzJSuq32rR0+ih+}yAz}^&bgjSs+q5()wA(h8n(HYi#JE+ol=Qr@ z=^Ah>0Qu)VyX*7Z?)pjmG-`@0w4)v?7Lc#Mp~Gk7N9U-Um#K7g_Z0YKsj87z%(H(F zAfDVo$CvW|0EUw7M6MLkN$t|Y%)Hv`IJ)b)xBWv=?>oJ*>E~84c<>o%LuVk%6qyVL z01SMkf8Q^O^^y((- zyNYWK3&V+gT6m(3i@8IdAHx~%j{d-BzrMdm`YUk0Cf4^}$c7fm+wNm90o27)StJn7(psDrzchB2&SC-pgCfcde@9kjz;@s5=3NU=th zY`Ec8hEpK-K4l$%?4`SmjOWuEZtkVSnJGZc+fWcC1t2iMcz*E;eKyj8OUN5LFq{6TjBdWOl*>`rvy9Bnvg z2{!t@#Vu~D4*c6xMopzf9d!_5^V3s=NhSHN3K7JQQQtZC_18G{5n-sPxm@m3Ty3>a z08vLBxnY~ckOYhra7>DO2EiD|rn^3#rgs??2o)tfjIrR6@&$2^)E#WBwpuSM;azRi zb)X(WXNhD0oD1Eey1@hSj?vv-~uo*-EA* zf;HqK4(jp2GDKYQMu=qN1mikNtlt(2Cyt`myD$4<;-icN$2Hu_u8qlxMJIy^2>g=H-|8Lz0CwMP zv^I$>w08Px2`MP9vsZQM_(NkV`EH+DZOmNdt*Hlp=J!Mlvkps&daq^7GkQA{j0my8eH_f^_@3wAI zMZd4~Yej8=sVi+%cC?O#%w8Dr{6^24fb5}s!N(Nuoqc=Xds}YDYqePHm3L`ADGp|* zoGc)mppps1idYt2FB(UV-SFL-zR|UI9pkq4?b@~)>U-tJN_$;hBrw9Jb!?Q8Qc!rX zBL@tu0RZK2bu0$C%rsE!{-Z%|I8@zs^Sf@j=_q#HRipbuNd6L~B?Cf}P^J$RyP&DtvyrS6&rRv$w{(ol!|7kdKXH$Dk-IsH7v47>*66&PFI59 zcLzrIe^2b&n)OX?vsBhhDG!G9)%6fgXd_8W9}LchHUQwNh4QM9JweyDPL{=Gg5$Vq zEwpr7OU6oSx>{-0YN=(IIWa`ZBr6iORH~M25<$o$Xd~E1Qw84?^4f0FaEjadPhOTu zEmppu&n2qcQQ&-X$Ku5rGOEi{P#Oop9vB0+h5!K%^J>_*bV}7-Sq;k1bD^rFlG_qE zr%0+p6>*MIO(PV6vPuL+Qac}+rzkoVxT&v|)i*jDO--@Wi@^=%4-~|w#R7Pe5F~Eh z%zUwo7b7|WzO5ZFrQUUWhjdU~#Ym%i35}kTM~-x#J_EcYs>UN@8v-Ql!?E@R$zzUP zvbS}mxv!LeN%c#qYC1b^u9_-q%oh~7th`N9Tx6^UPzHQXP37_oa8L#@j@)!=D;%|y z&u6Zl)iotWN-`L!Tg51&h%&6fxZ?m5k&l?~t})s*eOlSO&dGPOTx)*iEYnMHyW2=v zYI%CeI`KXmFyO5#Fa)sTdmUN(8|_il`z@NHyLRon9bKwA)uvjn9=4PQc4-_IYIl-A zpmtEjNK@Pajd!A-O&diDzk=q=rJ2Xxx?K%_*%s=%6kA^XLv605saFMMPAa^xKt~Rv zCm+hleLh|4p0f0-WNkfG%ytt!HEX__+EO1dtBP0?#>aX3Kk8y9^^#!)~1ud?c z!Am_@sA>o#X~{Wn3L!rQVIwM)V=*CldCoAsSF^d48VM@&vChZ&jRDG&(yjTutdup@ zUXg7PUqxtif@)c8JjFDQ?9#0588~JcegNQkJwZ8Pi|t#xZd8o5E&!M2q2wdp1YmP&DCHwRVQ_-;|v*+M7FO zQd=pc5;aZ2uBy6pSTGt$RU`-(yknOI9gm+XHDqu5Wq(e(aZ1#d+qUhpQAQRjY9yAk z;ex0{nv_;7iB1QxLQ4>G$0t`VmRFtE!nVl4Kw&4^I)S`s?bn*wtg=)=Y^Q+Nii?#p zC2Y>e#%Za9ff`KYaS?zIBH41;C$qP%%%a^f?j7g0ZPhfk>$uDPJWm_|NGmqMvh_CAV7u7&?Z$?JyD z_K!<%H*2j%_}rVSx|Yio##>9V!J|Z-DSJQ4Z@ppgqo_Uf~^sV!l8fWnR}TC1JDEO?X8r1CfI>1rn_8jGS|uR z4r*#7cq8O}RvhE-F&=D=!_X2BI&_NjZRstZ?LoLj>R9Huv5l&%&oa4U2{1ZI&AA?3 zlovV6srA=G!(Tq+v_WvXJ~-iQhzQo>-G0$><+E2!Py%cVP>#J z3{`ajgU9in8?ypV18`R3h2nYp!)HfXIhJPRg^y(gax;@$ z*fj&B;0aFCM)us7K^p0u%c3{xM6>SQmAk4YNE*7PzM|x5(ljhN2U>8dfD94elN8QL z15G=VVDut8b(HPv9{EM0A9z#A1w%&}f>py7ny54ODhd2PV%a%5Q8Z^@@2dT;OSrFe z6!4jvZ;Yl=^)h(GMdF?i7|Pj3UEeabP`hblVd)>>ov~tln&s^+YXw4e0juHjDLxeOvfBo+%rXCx?L>WRFsFp||g_*6*l_o{E=!QdK3IoL2Z%bWcqH9G#|*#pV1%$N_`p zP#3raV@CAocJ;Mh?fbSJzhtedu92a)$z=%gQ9G}dgYk$jZahgKjxJOJ!v}T`UcS(q zR!VN3@4k#x?lUb(hLXOn={RWHxIQ!>%_&tK%Qt*y0~&ss4LrX5bbUfZ?Rx z{l&EJJvN}MpsAv2W|?K4I_X1HEm2tlw<(jzsH)tLA`f>sKDs5*Z?cb5y31f)^8WyF z)zj1oDQGI5yvIcnM*KlUKTV=NG+jiNar-#i)OCop>a$}GJq z{H}B9=1=LrKxf?B?%P>)-Ef=r3&pr9<&i5Tt*3%HBN3w{kt-P$)iR{;7&#cg9bdbs z>vvA-n%lQ+(pT3_Pc*12Vl6>S$c|G^R|Up9gbV>H03EVwiVl{?V%!v4uW8?JRXdsr znI^bh1)Jchs|O4eSzVYcN3p|3=va(^bEl0Y3~=eRn)sj+ytn#}qOTsNRKZTmSv_y? zDxzKpzC*>w_l7Wg_8A`DzWm$OON7>|?Y!FQAX{YxJdG(d#F`Cz^%4cr1p@WD~@83R>r;%N6w3s5%2L?*8y znp*0SQ08I?3hR|nc!Pl%IY3El`E|QdscTv{;bV>`UNRRj*!OPrw%zahaqDW@pKzd= zD`P`c^pdVrG|E9DE-XRk*d8Ybwl5XjHtv+|x=sDJw{8Cb`&SLW;oT|VDzscsBz09# zyEJmEVM?@wp5w`nN{VPGBiuJFvvIc6%UgDh;qdLR923)=uMZ5f9zD78ICk&sJ8RAR zd+IHMvX(m~eRQ^HXvGax8cPtVtWG`}3FSU{WK4nv2+yWFopD{~lW=Vn)M+h_iNYy< z>K*fRP{(84b>_PLcRvwQmx(2Y3hCLrMV3Fi(;>SNk>QT`apW=zss-(W2s)k8O~+cDM5MY~TIqXgHp~{*gW;g7#GI9giZ%)lx_}NwGBn`# zhksA+@l$IY-LJxUwDs4iwbx3y@4H)SS*vO)Nq!=tS!H$}bDtF>3>Ue}u5qae*Sp<{ zvO5iK%(PHf$5d&ls;%<7O6%H0mQ;;6e-bdINS7cm!S^m5N9nfVy3kzr{Vv0~T5Bes z<7SGU;`I_p?f!I_1YC&&0|*xiG2bUV?@1QvN{UFg4P7jj)8hP9JG&vOc>xOb21I8o z*?Sgj0033bZAM9`?-Y<571K(;>NjL^TkB0_ExrxUb)HG$tEH`f4ypMC_*kPdGDjf5 zWV>FHxg3^PUY9%!i9pAmzjbUMxzsFuqVg!@ZM!STFXveVb~#OK`YG%`kW) zps7f?pb{zvmNzO#F60uq&J=;HP`hWJlj^lU`i-S;^>|!%T|J+uw|<~WQ%q~kT$I%G z^({|T$dwebLNpL(0!n5sxI^wO`*1T1;T}#RKm4OBU95UmFj1-m7c2{Y|!l+qiBia;>HkttA|$u9BT%9FzF2V_X0*RIy{&9FF=Ox361n zk8jge)$M1z-)rhiHAIxZ3TfwDmsW_+{5J)#BuJYh(2?l#t>0&E5?iLBR-JcGTQ^Nr zzMjIHcFAgjV>=SkL`BqqO;IhCGlW+qWjWn z_j#h78B8tWqZdKX%f*8Xg+8R<^_qrF!??=tO0B<9RXtjzV6T~En9sKb)K@(C*BpwF|DnxjijN0`zaDc0AktkGT}iCd$JzdvUYuv$xCah+&6oV z!&BWMA(|+RGWg^GWQs(OoRKLl#5t7rbx~+Y5QHqLrW8@=1tjix4Jc#1poad1XjZEp? zM&-I*n(Vfis_7}{sqOXkhKNH?QXWDIj}cfXOgIhz<$>qP$*?+O_BHA|-07?8_Jt1L zx5UgMing&`smI|gu|_zzB^VsTU=!<|bk5HEI9Y8wUONWuxf`c04Nxdl(4@smk;&pB zR~bRukO#g;eRZK^j~kx3vdJ3_0=X-2^v`Z}BG+$6+ZC&SvZ#7_qIl{IEU)H;g19W1 zPy&RH+l!s&Bv zN8y?|>fV)VI1c29@a>lG=I(iC&|q}U$7X$4d*n2XSb|1Ro4!t~q`{r4{iZ{W%blzcrKD8b zCF#_AYU>5XppKborLBqLC-`$Cz6&WM`8=eP>!vv?E)_S1f}*yrrgjRFx~B;tOy_|> z0Yw=;nI4|KwQ!VO~{-Vo#g7z@)oJ3J_GFv*50u2d);vy+V$sN1baG{&I##wU=YPKzp-Rrx$zv7Yz`9e`n< zm@>T;d{udNuv_7`)WdhM!&^WqBB8t`!bstgoJJ5Nrfa)%@Om;DsEO zh6aX03uvNmHaT4Jvp&vrTj8eNy9Sn_DXulr)YH#UCRK(=`9#Bsbv#vuFgXxo$1G~& zq5C;f+bU>l?{`_R7fPgI6-{L^G~>z+LZb6ikT85j;xX%-YTUGK+lJTLRz0UhP#WV& zMk$Px^#*s2MO?p$fJbpko2 zX$3g%=Hl2Y7!rL-pI-Wha;&^oP|Xs^qHiLsuE(D*OyDa208dYG-&#Xj!GN+k&T-{1 z+^Fj1XrX!QX}mP?W1cFW$P{;0Gr)po{~T zfuF>ubAU;N;2-28vHca@T_D*z{S9{Dp{0uZ6*qwm+KNDG;!>qUF=AEMyI~wM{zqIV zyt;FBvv0e%N9&jGntCdjsp+N=v-s{)oJ_gMNdl3`XB~+>y$R1@Zr25E4hGs+T*1@s zgLOM=(^OH|J;&h(Ac6q|X*YLl&8KqP(^&0Ry1lAe zF-IG1)ijkf&>@K7W#eBTq`zX zM@rS!D^xKtw@o|X506NcwC><$ObjPrrvo}hvGo$arhRLz>CaTCrLfmpbq`Ir?h(qNYU*g>nj)0sO97c<3Z<6}t2AL-)7MmP+UefixAg|Ma@Fs<#^R#8 z%RH338hd+G+oMUFl#L*0*sMYP_(ewN>6Y)UH8wWrzW)IG@;;_Taolxitx*J$t+qL8 z4iThCW~Y21ARpl}E>B=VK+%eOdWNs?qqml*^A#Zd1EHC07 zfzxDl!iRhZv~FrzN4G|>icg4Fj;g%y9Ht0I7D2?5fVlNs`>O8!ueWa3>fN&p^p$^k z)BIf)x4Z66-WHN#_7?w#ER^0!~^@+=_@ zbu+a@6qC`2LUDLh7?1-RoWjS{7El-+Eo~|7Hap$Q@oKG_8zsuEsKqM@CxBIh!BRGx ziBPOriC!)VI3Q`Oq|#qt+c(|2wC?vCgIj3Y^+OD^JaueCBA8?5(qf$PASpQVjE?yw zDX+Cu8+xuP+j~`960Tzne&4seuu-JAJS14ugnl^^BQq&0oTG8aK6!+kaGKYM!4;He zYHqE8e7aOr*=~t@uYzbRs%Ypg;o6$GAw^a)6yd~%3RvSki9Un{XG*$XTMgc$c*}IV z({Edf!Ej5ou&7FcOo&o6J`;~91;XG1o?fR&*A9bQ_eHYdvvzk#Yi)It#ZD%;S?|&` z_~+s?B(+j_fQb|~8?uJNhsnT74xe=oV9#43X14xz8XLnMKuyt ztY?F%2%qN`KrzIhdJBAghxf#{LwMG;7&CAri+0zZV zw`#Xe&Y`2d7$&$F+UXXzBMbxUaN>r8u!(_c?b z;#;>Y)UqWZ<~cDg(Z=W_LI)766qO{d1)e%pyexN4pWJO1>+aIEO-BW0<)SyWs!GX4 zTSW1!TvaM3nTH-(e^7Drow4?|(%UvW#?I-53|6hlex^01j;&<2GOatXVNA^&sHL&Y z2bq~zrV0QCtjq50h*Dd>5?V zNgsv+52(s(G-4n&AD&m&?wNHTao?|(v%9VvTB4%sX&ypnhkag#F1EE0(sWQtA& zRG9+>Uu=ayG*- zbL&p(-S?fpwXAnot<%qLTA#aSn7lK^Di)0;ghFEmDEQ_lWI`~`2m>Q3Hw+f;s2eWb z>Q%4%QqLXNa9gevNaFTUIR5|y7{fD0P!vUtfW}ngwu4Vm`P{&3;G~eeoSL*(WZ11+ zzV9DQSAJTdO10-}r)%X!b=V|ordOUirg-Fxl;n7^=2knoHj4wN1TmJ3i4h!q+t=Wi?%G30k2= zB(Ae%d-#dw2QS5<$sBMr#cH&4^KtDv{XN$A3ELM+w62BeCvg=Fag{C2fN0@$kQefn zOt2#ZAZKQxDI^5PX^v~at5i=^y0_L^D!Zkha%`yg1;)Asn$ur$S{e%bP$3u4j`!rQk3-7Gt*GO4<>hzzzj@V04R3JBf8@{!p-)m z>0eMS6K*QKxz#$z6}(xf=pc!yX74=6>YOWUT%eZ$2`n_5%6V(`e z8iLfb+x$|&qG(M^w5$W63a5zg*fR0bJ)6U&JNuMIO+fO{!t<-2Xw9|MYh}Nur(y4n zv9;(`d^ArMDs$tEt4$a1i{(foBq&w#=q}*srd-*{!v#lS^HQnr0+;j|l$&$`k7DSC&BV z(0NQt&q7ms*8wPxYv+8F^>*VJ((Ee9n>FAqhN*@wu3=qGfH1{ zoU3a(iA7pc*R?1wJAUt5@N|h1G*iujS}@ovFeA*vn&5oF)SjhXY`ap+Nw!yKo9)iL zw4hc=G|5L!ozpP~egT=7W01%m!%2HvWpy`cZ3~Us(6ig?uaU`Zc;qgoIDZ<+9Fk!$ zN{p~1{IR9Zq3w;scf8VF?ZVGH?dd72jhX6F z64z>|<%U%t`FvGSxdr(U{ksB4#&ulmuAc4+dzkz3qQgf+TO5$IwYPYoNffRK{9Mnj zMgh)yXGa=JI<~jLbKKEY&{EJnsyOW)E5#cufHZ3qhzs+{V)!f@&607g+L+_i!{*Az zr+eX((O9=?x?R7t?x}TigPpM06CnF`d+A}M%%PTC90^PN>!$)R;UJ4sf!~jVFkH> z!LrQW<14N9eXUDbw`whuRNSPXoeRTP2@bTd1L&&G#x8H$9Q@vZ_d4Tkhyi}NT_Rt( zCtUZ2-MZatBfZ@#rZU0=QCC(=Bt~}hd@_y;j`?3-Vl$maUZyVAmN$LB1eEC9TAsF& zrdn!@dK}48RFFRlDvWl~%a2Ve?s3_m*|t0N$k9&FR83J$@bIe^=l*efgvsyCyuJA6 zJ@sF9y*wATywy{^%1El?q;;c$v(9?~l5yg31bOfQ#yk3Jp}sQCEo3c_JCx8T*_-Oc zTYcJA)`oby*o9r>QakM~WgmWOfCJ05`TUGo3NW zErOxV`*F0i&?G4p1$8WPy!8wZ6rB<|8^5VuMTS83*EG!b8epsS6H{z zD@PsrI!cNKTDpd*p@+exIZ`rQ{uW{s_J22JW+06nq^7aGp5wM*_{w_Aj8Z{yrMcF# z312t@7F??K>;^djfODXoP2IJ3Y6_|djjot$Nh@d(=^~#5xHHO(sfHea_Z)kU=S>WoQysa~Z9?Wi>J3)4 zMWW+=rJ?vLs(Xx<$(Bo1HBm0L2(hXo1yC3qpyV({d3v2nxLNj=&!dX(xhQFCYN3uu z#8i_pYH1yqcrcb+l<^Ay&a89G1Pue)ce?$jak%cYKKV^#S(EU&4VEF@@$d-IQ&`GDOz9w zuiC!K=ISoo z>jg!+3;a~6adb*ZsV?_2!Z32>Dbi44aphJL$j9HXAZCEx{UE!x@2gtIe z3bM@6_%9)OBjN;}E2BFw87;^Rub^N`KXe6QdZR78Pej?Qp+Sw z#gC02c7+p@a6$(xA8csVHIH{+Zf$YcP*y{?sSw9OJzs-MOYo|=J|v-~_=PekIg%yE zAH?38O8YzS4YhY=hQVK1UnKU*=x)nTMFLVuPb9;|ncdn_gpdniP%4nQAPq2Y&GoXj zHAT0i({-d-t(M9fc_}EUXsIJ2W|IgJs#qMV{{YSuVZ@VwF|K4sQ1=!|Wd4cxZEdPf z)msComMbe&J?@sFsc0oyv|2iHwPJS;jGz=QQb_WlhnP9Q9-3UC+?L&$VZBXji)~O% zSyp9urM%L3uQBAtIm4^0L0F$794~JvI!u@C2}U#3y^j()VzrJM(bYRn$ReRWaAKWkhkjvZxsq4pIRC1QX#Ruf9n* z)pIvp_Wd>f3dQLC!v6pnl1I7Rs|m#^PzS`*wM0=RN&p9P>T!&Ef-GI9w)S@Gwb$)U z>m};XJq+tn_f%IGjwgaNKgFZ39w)^>|N4-LUPls?ktT)W=BG5v*&3ka%WUr02k*DF*==NJCv-U*G#gw^rca+c@p(PSmcfmV1<; z;-jXhN{MBJkm_Z6gyjnog`|)_n~}io4v5fMc2w89mhZP#ynB`C>M1T%Qb7%EYP_eE zf)52+I<*C|!-tE21AMhg-{?Nko11XbT5NqlrAR0!p`Onj%4j4tk*sQ!B6?ZWJaV2U zRON%mpYaIv`>A%TEgw)emAk52?)kX)eFIY6>1bkt8arLGfS)-yMM>T8Mhh`2am;(@ z8VKK;8>{A3b%A!!6`Q>Jg?*lei)Qqu%AWp$roZyL%y-MVfD zN#i?mFe&jCdB&A9@=16R{%rT=Fi*awSM>&pn%8WbdhSbo%I9{x8dSF2CJ}wnPZt%N z;^amJa7(WQF`*=mE(VphuS|Dl;@&pB)nTezUe()DNl9n6P|F;V&`~!iy#_@vEfWs^q9SHN`fH}bKIsV_!+XbU& zo$=PH`_E2kZ)l5OMPGSmH%R=siBX{r5sEGqe0M+r!jZ0o+Lq0$)n1<3X|{viMK;{= zsO?n|)zwjoXr(zR98paSbqb5clf`gA9%a#LG|hp&Qhs0}iblvyr@KzW>E^=PvOy-# z+wD(jm2XCBOH@?W^&s`&7V(GB?Qew1Ibw4G!wCT8!?Bgc_SbmYxr^r z16UmAHbM!%-zr3RUO3@h78}`;j_X^s5ZtI~9tvu@iKA&K8nv;^q(g|2$71dn9!EX> zbz5}{eNt^3?dFSg-M%HM=oWXk&`PFTO1Q*waT3cK_wu{Q6!2^g-SzKOx3%MN?R)fn zFp%CV{u19)M{a)`x%PQsidFD9u?2uU8<@x=kZw%r+&kLyTVHGHR1jCm0OI$F(cCun=8RHT!i`t9?e&T> zS}4FUc;-SXL5+##4~fOWDgaVy{pWC|muhXBZ8e6Me7K(CmZ&Rj=~rJ#91~$CrkX^= zk;dvgNLg7(Dpi$1!@bV+aNGSJx9%(DWv;ICL*T_xYKN9vIv(n;d$zb@{{VSOJ0GOWSuGa#zuH;uSJaA*;Id2-38N@oE$}LqWrbNm zk%7wq1~S^Sx4!4L?i-c5ia2)8_h>473V=$h1dp2{p$ez4AqxUWajHjk zbt|d2yX(^0>UP8z82lxriuqO}XuLLwgT>Dg)H3lZ7yx_al;B`TK`fnW-(5kQX7z&4 zRY~ds z-1mK=qPow0rCI7Ml#f>>H^i`>dwf!|#ZH0DadK97P!Ds43#&fkOSQKK>6+S*IflmG8#~!~kUFx;Cv5+wxl}XR}7|;!o|a1JBMgbjoE2Xj0Im@S2*y8{gH-Iku5|;cHtUw(w)Fnhwj#Mn zG#2gE6>NS7D4a6MH2mI2P|=nV@lwQt*n&!8(#xuFEZ}~r6BdVVBOl=~Ro@`HSZ{l7 z!G4Nbz1bm>y1uGo47Un`2aimi8U}!ekBT!E1gnmHiPF6tn&URzzu&fw`rG!M&v1cd z{{Y4pkx@kw&Dtm?l~Eor%(+a7BQKMj=R+;m9lg`NvvAzD%Y{waPlS@$OMRXZK(~69 z=4O_jIZHf(PE3MQRk--2N1u~deGIr&!@FvFqq}T1w!2!$ZS_(D#spSXFasGb!BqKt zK+&NlFjS7(^zmt5q0^UD)_!XYlQwsT1no)HZnW)P&1UJJQ}0`HzQ1#)#fX-gm|Nv*a3@J^dm8@$cUr2MWjqN0s9;3WtvqRc}#j?Za`jEMX`_Fx?_)DCsGnUk)~lk!1cD1OTA1Z>i9_Ub%Ju0B>|# zbIV`2Hw;yleaCF@C%DTh%&9ar3nGEoGCvr}&V3Z;Q`lP|1~-rWM%`A+-qZ74mqofS zll2nLFV<=at#w4w+wRu7ikT##YN*~Os*9R9a)6cbSn>ciFuk=qWo?^RO(VZ;bA4(% z%~Z1kaccT}QO6k$so_n>1&d|N`I{uE?VWO`+4ru!Tk0BL@0;6p?W;9CBF9B;x?HS~ zG;ed15e#y;jhl%8f_=GU_R-32wtb0Y)|bW`m~bfS)`;Xy9gvf?UPVRwS6R$nnNM1s&G+xGJgG_+zjy+`@3v({{U<4YeaN)(Z#Un zAf$f?gH1hEOqr4hc@ZRq1X(Q1aG)P4BO>;nN%36tw$?<0W__ z3mj8JB+>I~a)EO3BV>cjCNgm8{l5LRw-)2tRDWn~*#&W^sHXn_A-P2zvW1t-rfH2s z@dqk|iZVOrAbL&y!R(1QHreYqwToc9R?S^m6~l1HM(|7NqDY;KAqt($@7Ck8l%T(K%p)BwPcbLpo#SmTPC4IkFj zEG5?C!c*A$^L1=X?I%nwdxGJ+qN@?rRZ`S#sycZgmzN_XGek!`A%z$88H>u%-QlGALZ zo_fm=Sk_goFx6dBrdRT}H< z^-)iDpsM)q5D3yC4K4&>-G)mX05j{Zql@h~wkWp+R>0glqixbx(X!CgUL#kQDjSLH zvC6EC9FYPz@>%(=3FF_0=KZ(P{mZlZzfZe%X35)KH(SX2!U{dde2#Q#1j9)($xS4N zIL{Kvv~~JogK2$!TfkpUcnT>FS0mGF%=(Pp*3& z`s(Tqo=-3zPhX8BwXYxp`}r=BrN7+nTVPO64Vtp?Lp#S^3@cPAZhVxyZy7PNvofw( zLdr5Yj^t~RzR=xeH|mQIPWLrV*|AVj+I}YG1T{}g)Us4aSqyL(LYX6sFXLQ3eHT5i zo|W8hX3<%1+Zzhv_DUMquC(`wS^~9lf-vAyQue~1#;e-|76Vk*TY3tgXg&9F-7kBN z#BWUI*-5&Gi$P6YPJl@i5=APA;gcM)!#VUu^&H(S@HbPkYZ$^)qm`uWR3Ae(F2(8p z08k#$wYsZpyUV$k;lwplSEx$R=fH5$Qz%96=ER4y5Hs6Wl{eaATa`ZIZNq%JMRnV= zNfdP(Z*R*bJ4&uO2l%G}hh|omULBZr|IAqheon4^Qpa>uapC!gj5` zrOao#NRvve#>!B^(UD$WMp|>}kXG$oq{{Y)omX7ruuBqruH6cNr8WaX5 z1OXuAy~xPH8P|VV1X9Kyvi|_m9W3r^%L}PJZvL!v!ppp@oiW@r>0iA!C5|5wzL_Da zx6o8G69hAemzj-!6NP37PC+=vsEyHdv@cSs?t7Zqy6EnD~J0y6?MMF;}<@bvuIRbfu0PO%-5J)YM4=@-yLrw2?y2;NW-eHOumN#YR5?0bbUp$s{d zIXdYI*{e5fR|u^&6x4IcLr+CfShUpt02q=Z9yIk!88ABG$yndRVc)tb2V4(*+&gn? zZezYTFHhU48WFQ$VE01}oPU)(YmO*fB6j>ESI*b#trqjJ-e|gW(~Fkp z-t_a+*42fADhd@7#Gq8cM$dr?f#LFLd9SJR=M}He%P;j}H}K&mDVh$~ium%bJ#Xg1uHb6#)tw)m>d7UI`>`>Dl4QGL}}AgQIOmRNjP)GN1y>e$HR+CT|@CFBzP*I zFCquNh}r7)-G1(S^pw=qck9G){m79;JWz^61d^qBBtwdU$;f5^f^bGC{;TzpgQd3w zwLxH>IpS~`a5RUuKG!w7PKw*I>gld4Eb&KC zXTCDh+v#V7kNlM*jb!l<5=Ra|h6ED2)encyD+7v4-x~=dlCB=0+4j!Uy2*a6xqa_+ zyGCW6$x~8df@-Fe$MG;a!iyWQUf@chPvJ)NI5n2OJM9&o=(E&Q-6vXM1(I8gYfgoR@rEg772`eV4|oWj=gIZW5Ly!sE#PliIA9Vfv)F<$)lPu51Rh~!sJaP;nu@Q zlGf2~YRkstzEExpj?Jm7sJgu~TG9bQ2zDkqAd4)H<%vKGBAf#2h3&VeH%+^^t(Q9# z-(~ss)sC`QWTw2mqORj{q?C7tX?Yhftbr(~qmixE_b$e@XR>@8UERTlr@sL3`hFldA z74sbVf|A;{Uc%bDrh=bk^_H%xs zrFNyXWp$6v{%E9gS`Fbf%eG%s;H+oDzXElQKX(Hh|;j^uBjgdW-J|tdiSb5 zdZX!H{+p$HXQsP~3VJ9~-xkR>xG3XkSx7SY=#4zSAacOOBUcPPMl~mPLDtRJMMHV% z#=~nH)=iJN+KMWByb}PZ!a9i=q^KQ$%DT7%x&R5+MEFsbM#&?F-$T#MXKuBv1hKY$ z%CX$kRUKEQ+%=b&Hw86aV@Fj<@fTqYj@?fh{{YUwP)_6qW#!$x+4GhA51G$00+=cOHYJUknV`?2oN1du5&b+k%-k2U;&3LEY4}n?tC3b~;JrYA3Nv&Ksgr zHctp@YGPqK0x%h7ANvhdoImyQyQgj6U+FH$71x&U*!$%cci0h#^W6bz+sqqNr zSSnzza(@xxZQ1sI-@P(Mxo&!6Y*-~z6eWz6GM;2F6BuNORp*%c)uE}jE0tuj&B>{=%Vxy$IEi_@7nj{{R!9)EGRo zwEWjy^oHrv`F6d_cKvBg*Wv-;Br*_~IfSFG!a?6GB85ESt59SAzdbzv) z&^HdE)z7uJF8$aRh6xolzPkNc!ks`0V-Flrf}De3aQE%2!(cvF$pC;qhSDmQ10aoF66`xR@S>-zzicg=ReDMmtrr_~o-~qF zg2jMJRFWuVBZ(`;fhBYt%G$4zg|A7U$Wt zF10f53&nA?Jrgb*yj92p)JPRUD)CHn*sgVP?p~$Zda+YVn^SbzH@$n;2w|hRTdC-( zV2=bt98lGGOU{Cg)m_fvjv-fPhFX?bnwlt-BhyG>1~+)q0hgHscE@~+ z{9{h%VZLGMl?IjJyF-n9Quk4MW!GE8R{ouIdv95+boYx|)9#yP>n#W@Q(tb5^S6f?UkRklNEjmy0HALu z7$;o^zAn9f>D?75>Gs92Tx%qPI*2a!TG*B~@ehXO&+yi16-Wp0wgD^1oe7|<>b0iT zxsO`xG<5N`d^Xye>T0TQ4TV4|tt@ggcub+c_Fy+kMPO_1ktf$$t0&_%H*(5T~K{#+MCm>6t?;5Y!^L~_eHsucqM;`rD}C> z1aQ_D#DuvZE4X5Dg>O@%!-TQD($4HV?3X)Q_HB$CQM!G&IziKm=H==Q2(R8-l7;}6 z*e$cY($P%=%A!n1RPo7HRaYE~lpUE=@zbsPj?-Y;wri}rg5$m`dYyEh=TBE#QcUS* zi6Ure%a!Wg1-Y_dGTVR`8Nr*PKMZXLT0@Yr|ZQzgZ1wHA3E)jWz-iN!c!3J?fj z@<`rt0B=yeHp|>MJ;_(NdPzr9ZroRznyTpNYH2EBr?@Pc zUDu?2L04PVm#KC8;^R<08jgzQ5_r;;4;B6d^&DqnLG*SEbLDMSdx~DO>>a~Z9`Uuu zK~Yl5Wwt%2Q^h(fgCF@C1@OC|0H|DJvwYd6(=d(O%iHLGc1O)BNt|7EMPAz{u6<>t z-BflB)ndMFi|sUjb;|c!VW+n7iAySYuCk>V?T#r6CuQ^**PB1A_U*~N<*-~RDz>fW zDHeFCYalg{)Uu%x5>iM=sdtwzjJNw7dc>JKa7*mDZ(6JG>|57 z*yBx;!1UUHOK?>)#9tYw3kqLU?6!^T9h-Om0BCMCP*YMLyrpU0oVXGI%M>$Ic)l8e zj}*q}3Gb3MQgw3udA(XF>b5+Tl$%nAFhN3=^gyb6B~U6!kiG~m$B=cwuga(a)~NaqgB$WH~_jLjNtlbMYatl&c0PO^J;A;yluVL zEkw1}n6409Y3ck!#Jn;@O+_0?lFJ*6b~)qQO> zEXLU;<*d8d@ByW{IIO2kJHlJ7frVd?FHG@n_{MPs4-7pOC{E=hzsGlh&*e+sAs05UeSONga$j*5rj&cK| zzf2=+a>ILGkZoO1-91m->$kR^@VKn%4AVon{8_1~;tG66ma>voJO)Y2BCnvp8nE{M z`>TrKZ`hp^-?mDKsDn*aTW{eE_o?5!sEVLe#R~VsG9Q`FnqQ^2P47dzHrChQteb9H z!z<5GYKUE~aRmh-G6G9NtAeFaa#i*|lWu=uJ4a9V4Ib&~wenh(y1=l~(nl3#Kf|94 z3Ea=(f<|-YEKkWu^tq+cvNtuLZvEj%n?F!EoGU9~UN;^3)pV_wcvrBesYa=zteR#l zp>X5kl%$x;D=01Bi0m_^dvyg(CG>7v?)uypR0ZkMj-t(2zC4RD;{csy9DR ze&kpCQ=pxB*qfqyD5$rz7W#*%mg94`)Kfy#Q6B0+cjOP$j&3u>hkZHpGp8M2ux>Q4 z?wYB$9im&S){6Uu9TiOUP_RA>jwJp$l(!Z*9rM`xjzi&zm9|Uxe*G6ryLh77{L|h3 z8R`;&?-iFi3frVmQ@YD`du2r`i3pA2c$P!JtYHN=Ay7OxR*7V2+lq#17lv?D zvBA=w%De6j-@NO#y>9lY_{zPu^TQKH^2unBOUd4+;@ByPmjmz&k_Zdys-LVCb$u+{ zlvEpv*|O~l*p+u3HN7Je$c=#%%MyurWpZUykQ{c%&bbacjYX41-zBWHGs*`F$lele z-k_zj&q~q(PLDlYyM-ta7Kyx$TL_`VWdjB!aG1y-=DD1_{tK01_)J;iX$zC=ltG-3Uo@z)mxp0DjUr-vkku!nt3iU1)7>jq*LdO zl4zP>q~xn1U^A8Nr=96!qa|#OWnIrvQVmI(nxYDdRCyOBYGjiLjGO|nbzUk@7CPCa zo1iz&!G5ach0^(0RXedZ?aH_dZL4=}*{uR7p7|Zxya}O5+sjbUJxdbd+q8tj%EtrH zYUf^@?Ws1gw%)Au7dV9|du;Wo2Z$tMS!%+^D=kPZ?ZMari^w)WuJ4;hgJ@nXJMJ62 zRW_TwVWvBJO529Mx|UjDB^^Ue6mKt;l+&33Y5xF~ z0_5deAROygTxd7m;_D9U+}2B-d=`po#e^bU33_Pbjbl`FibCA{gmD=oiOw)}+J{dU zOUmpOhD}7FwRHzZj;sq$Z$mHROW;oTYw05OcY_QR99mdaUywOc0 zkU(9kQkxtSMd1>x5+ktkxRx{cnUpSdNAy-cziiFkS9b25@m*ACDxnbEFEi58!1F@F z5l4`dH_JFs{cBL0u>h3n$##@!LrVYa)$yl+d6Vc03N$}S_ zm(0o}OkfkG>h$oKnmU*nvy?4#k~p28lITX*wrYrMLd&}9E^<)PNd;tZTgB3%NX(>% zaK1#(m00DxGNFMWjaS=-!?|i}?=<$EjMY-yT60k?RPiMx4A9102>bvNJ~5d&JD=vm z^Ur-(i&sP7*L-xr=B26PsZNo+pT%TM5M)^}?5;gKg|pMnrBzkb z-!FYnnuJj#^ioQf`ip(GM~+;jLYO&VN^{$i9QjqUFnKVIKJ2^8@LC?{#?eB`S?ThF|5f!)ognT6aD2nQHi3Zh>ZaX{o$05#nBM3^F$n;gYY|vZ({O z{jn97r_;r5j{Qeqv|BPGY3wk~TP<{%!{m`69fuN6BmL2g=}&fzxs3V0JpQNyo;~qF zc9!73UTl3X%|*g0iDHz{RMpBB%`B0ud`W2CM}(#0CHypI3OJ5KAk}ug%dx8N^4_UB zsT+OMx9Tb>>FKZ3HAxj?sg4%$A~HIk5?*1S>svm7vpcx?;5IJQ|;y$*{XO*XairqMp-+t+)=z%o}Y&boi)LJ6$%W;@Q_NpBB^FQ0`c7R@JU*VHuK;bLEuyi2Oelpic?&Dw!Fx z#PI=Dg>3d3+Ou!A?HS^dMUiPuzLLyk;~YVxhB8X5fl2R#?TmZ(_P=+Tw*j=(($-mO z-@%LGCAXlgj-o#(d@3YRaYNYh9-|otIzu&KpaR=YEdz%kx6R2{O|dN#Tkj$pgBfXH zqP5#And+qu;ueOUqM)n66AGS}$kb4=gw$H?^)XRE%g2D5!>D+~xC&Is8lOxZ5Q<4o27ZZeb4zF% zOS`VOraJ}ew~*SVt8!OOBnwt9g0h;?Sm+r*grf=FJCfXZCNPXobr;iapU`d!%f0^q zbZvXx_NwD$tgDu+M9{#YIF_nID?VgV%L?A)U}w|lZyToNPYvFVD%uskRmV&%(M1Z) zQ!~lJK^$HZE4QbZxyU}b)v45Pve!(uvRddWE4SR0FAGZ~GDR8iWSK!U@yd(FL<|8b z#rx+cI_bq5i)gz)ye!UZK?1FF2JqN6%Ld^~rp%JMYDa^9XR~b-sIHjpTYdIQJFfHDaz|jSxHU4?P~2jMrYAv|oe*D|!WE<1y4cu`3O1>2Ls10KPoO6eqL#{j^PPE>hDmi8mk{7iO>Rc-#Z zg7VUcsqVB=#}qO~z%s>E!^McP#tA^Z{KOD7Zfw2IyF!LbbeA2?ZM_;}3{-VdPjsb* zQdr=;P@wnzR}1v+Nn4KdM*%Q5rZ6m~U87OB>g?6Ke&@7dA}Hf98iLZrDo22DDWOuG zyM_EGunYh?u{QSCju<3$f*Nx@l@!rX>-~ z^)O3FoWGp3b0}#0gMz~(cNrbb_iE|mtcIrPQq<1g6ca%qSC5D#iSX4*f$4%ze_ZDp zYbaIaWRl4>gx5X=cl8oN*9Cg37vRw z2*MbV{mbC5r^x3{4*(>H$#pGvdzapmJw-D~UmX|^;N=R!=lO|5EUZ3Uz5O-5JB3$- zCz#46C<^$@22~rs+65UIqh|)1FHU} z@~fzm;=HU2g=YYI06z{rvyCXqIa&lbq-IUiOIjnh(Nxh>On}KLQQ`=b2bM%7aDHB+ z>8$JflGLV4Oy$Nqat3J~iyuG- zx1j7a&uOwnZm1K?;U$x>XKv@%%?`s-CK`ktLuDITI%nTSK-GY`X@WGKk(?US#nwB z095{Z@|$ki?Nnw8i`;_A1hRZf+~spUO+as6a*>7Q*aZL|ZDV$wlU~tFb9D}f4mbB) z*|w~mbKPaBWa+i8!AAtO3MHS;r!dgS7~x35 zIsRVfS5@Yv>aFzG4YRrFt?@i#4$vncf4s+uVfkQcH74iJg$;GWnzmGp z;(XW`_E0Owlbyg_nL{r_>Se0@a zlw|fE-kM3M=)FSRE9oir^^vQmqk@JBq@}8gNa9y4-Vu&suEny-?ySmxz1vrW_A906 z%RNQ7+lvG6wG&R~nx8_-xb;5Rz|jcgrrYo>zi?EoMNgF#go=@>fsmsZTnv2=%;^1w z0!Nh-b(2*WTA_C*MEZ+9%l^yL?fTES`7_fkSBG?Qh3zmBIG#yKVydjcKmd{m&ZzzA z)1I+YUMZ+9`)VDxwWz2~Ej)En_|rB|c_mOljPMvTBt(qhmn4?%OOH?}-nDF2+i{s@ zDG~U0j!9c8a${9&o;}GPmd`dxcvRmN)BXsV{UQ&Y3jN>-w#B8`sczzh(2oSgUd z$5hd znc_ynsBQ{40z!JREsgePrm|C0ZT;QTcDd5hEnQ6Y){3~QeDf$%A9gb-bX4!>IYGn> zoJGC;pLUh5`%o7w!YK1x=~$IaobkZNv>4V+S%xg#yW)@9x~L}Xr(-f z3*B;A`DeQ8M0SF@{EnGjb$3iI6j&!}x$b;V5HhE-$l}zU>m~ zcFNr~8=j*1Yur?ol@}{~aaK=qO1RpR13HAOS)-Q~7kK!jn0wcxWH-ZRU@d17tD0BEN*3y0F0glClYzFK8Cm4o9^joi0&#XyM(tJ=ZadO z*C~NkMkm4J307{#P|Cw9cxRSQair>%=E1n2-5YMnQqx*y`>;b)Wr|K@s-%*akzO=% zC+x8S-x%~=az@?Oc=cTg2xuU3oi7`Mta}@B)LXYk(5{-AW8%}-$#Hn;=bfZb$i_C3 zouVMNd4RyTqW5iD7u)T!>rE!#qL!z{osv6ErfRld4Wd&iNZLm5mCFt)9zvkV6bz}* z+5Xf0I=WFux9@YksqVDTJW<72DS6PoTAVY+vPk^PC^7yl91=j$3w7gTUoF3O#j z?M+ShYQ(N+#{gb+3JFqkjz<6y>)hmh{<`jND6ZJBU}3$)jZ zB^Kf^%*|7Bnipu~MJ&-QvM^qJKrFr}ASuZJcWXRNjBdt@rJLAX_iiSF%X8ZHe(1hE z?%TI*l<=pXXS%__8NoP}nd4b0)6qjLZX6O>aJkm5oorfp_bt}LOStW?S4ygDcr7cu zVk?PBdpCs!`#)spy;D5YnNhQ zFHg3MTkQ7O=B1*iLp-I031B}OnG9{uB!Dn5eV89W%W&THiE)~ZB(_NL;ut6`vQ#sI z7mCXyVYx6J$PN77;A@62m%a5p(w}o}ozZ(VR7&vOB5H=8!eQo$B>2UeH8Kz|AG;iP zBfhSlmTumn&qH+|*^AZsY8v>OnQG|`rJ|3PM~3vx;nW3U6rMR!2;v4v>oZdgQ0%zU zX=DdES4QgTRsN#d;@z>OsH`%^LP>ItmFAb0T*NWK^MY{A%mLW;*1CO{UmeEbWshey zJ;~&XYTKn{zC}fhAObX=63P!0T!IIDliRthdar(|+|+h!hU?m^M|MhvskPQoR8tpO z)PTwZL@Kh%0v}`OM{H|e-0BZiY3XJAlFxs*nIshOM?T_>Oi&CJ#XHj@w-U!AAo0i@ zyXeHxNGp(oqa<=@QK7%>;(!Iy*`?}J- zuC~e}EHu34g0*UvLm=#UmB7I5+~+>MyXwf?dxq0hc%EI!Q2ziJfznEvU`)*{I!t541l;TJxODx zl~nYnq`RA_8=k8BFsG-r&~kaCXi*|Z@68wzTie?pdSQJveQgeu?F$3Pb+XaWJ<>I9 za>g;r6!mB2$y*@f!w667srFbPFu^2L6WOC)RDKj!7@9{V!3-gZ!H2mdl1mVKjX%Rl zcdC$6T4$z~S!HGsR7)Z(QIEpFf=e@ZKa05b(L)Pk;RKSo!ioVEi+Ww5uA`y2OlfC| z9}=2*BT0CkJfwDJ3ZsApV*?`?JbkPFpma*Zx~eV^7p9Z=V44{fqWGCcLWv}dw2FI% z99$tIxzBA|R_f(~lIwrpHyDS&$RR;lNbo}(qslVm<-sSg$G)fTI_ZSA>R29y<9cIM zwN)~tf5Se>$QMo|4&-;p@2!n?GP7hA`IpollkZ-g-ek6JiXm4+$%Jm6Bexvq!(k#X zEDw=k_0EiJsyGC0X=`dN?Kc?a_&FM!%?S04hH%Fp%H6ZyU!YaHLu_>p*&ULqoi25? zG<@n3rdcwGNm*HV4o~t2KEpWG3Du9XjiYZtU4Ghe)Y>Dag>w~79w?DdcaeeOj>GV& zC6CKNButmy2-z!{!BjohZ*2og+cMPeN(pQ0lA-`fm6)s!7tvWk1~9)--(7Riud+@1d^KkD>KmZ36=bzj zOpYolSBd^7C1J%*Nb>?%XSOk}HnDD-p2yvm+oNqu1;J@0FAP--@=;WReOgF}aM{5s z#CmraI_$odeY~%=*9k3sM_s#bwp2tC39Zy~NAOSRppwiTN4`A=rgRW#cDr=lyCz99 z%XY-NGR5{x=tVEVTrN8jp6@g&JQcesmN-59u($Bj*ZaD)>{e~RWTIF$)t-ie1{vW` zOt1s_g#*9lHA(HxpjFj}x>>iE#93vA za;mvB@IbsCj!JMISh?{@R4FX1#NZz4*!I^(IU{Bo+E^rlSDPl)z2lz~gJns`RmXFW zuCQsL83p?T-@m>)=Ska%#POO$RVMLIg)0NwvvJ}(dUgjG`s3H%SiAgE z_)>{{P)J@m9{405$o)Q=!YR_BBx5WxMV>)J9!=ZOf_r?itv)nwP%4swqsC#u*hW-( zX9VNEJ-2ad`bLM3P~7F?1R_J1~HuH*SR?N&Tf_9pM;dt@jPbZ-!-xSh-0d3{oCUVmxBN{nXxZcOPE;QC{t8tQsl~E+Ej&dSwuOL8nRNw)};wQJE#-!5q0h+3k z0~C-`J9ttFKtljA^H!A)nligO|j=ES#QXD95nx z+?^=z+O5yjd(A%B*;Uo_HmW$uxL4VyLoH1+4qhD~;=vh)0hyjYIr8!+Q|M}J9Sg8* z&8c{?*4rrNe*n0J>jD)A&Sg@>IT&WosL1X{LX4r#&k3C~w!5oFwQd%;1%0C1Pf=A{ z5j52tmm%8+Cy-uQ$1hRnet_w_+bmB`F4fj3;+DQ8HFKNiXyy3s>Dc(_x~6`?>4Y#B#Np=iBKvKO0YQ|P;xQrlaEbG zxZU=xzDhYRwbbz%sTL?9EE-v)Z%zt4&VGO&pSE>mq2~cbre~tz9RzJTP$hXL{u+Hq zVx(s$)3y$Mw2QbpeNneBJAL8 zs}Ct3iy8I#YC4B1H+A_{IcDA6I^H{o*>{B~+t-WyKu}zksw%n}j#r8lk-1X8F&<-N zUPKS#F*wq8%jjj^*VKBdo%0e2k?oO zSyW|ZMowC z1Ejk#wjSJ}+FOax$6sAnU2@yB=~B_OLQZSSH*^uR3}Mi*zyPWC%Ot|7rk2Ryqq)N= zmKy~vbFRU-T`MM`Qi2*dt&(%6jzj=>v#f6*;Dq;nKEA9-(^Ks&!BGDIceV1m*|)7U z&_zofKaE*KRZK}q1mZ?1&Aq$wUtRzVXl0Y&wrzIn-V?=ovhDjUGSoDc7U<=ukAijy z0X(M55DT&9aH^mKopW_}T)KUBuvJx8^^#P!QC9Mnmd!yOn&#!tAcZA=5g}*p>aOFr zs`_a$=w#J3BPys+TpwHS!;AjZ&9Nc2qEh0C`eUJqnYK)ehh3{`vb; zLoLer)p`f8{7{)J_WQ)c;D|yOo64&c{DwIQ=E&{o>8pw>rDxgirF&;>!YeLYa-6jd zeId5gwLrRuSry=#LmZBuB|^#VmKxaNbaC|KlRv6cK$wE&tamQj==H9KnghCSNl{-- z_jD3aH0H9I+mD2jG+@jB05;`AOb?rh3=eOl>F)d4a;?s*!QA$H9LaL34RA{70z6=) zL&raY)Q&+7h{T0(31&X8yA~dlZ%xxh@YW$!b-VMgZ@y?&lBS(~d=bwjxHuofjD}v! zxEUayRV|yA=(~?+(g-dvD?vppi*A-=jip5#SjSQ($RE!jV821GBj$9C+b?gj(_xRW zsBMAPKAzU?+3V-(o&MKxdb*l8Y$lD|Pce)uNh++&)h>Ni)PtOP2AMaH+DE4yKil+| zZOOYTsw1hlptSrg3@uf2qITladDJS*jJRM`T}Z=o&UItg_Y6&jhhty-8O!}*&B}h*M6Svdugn%2@JIs+9;|(jT8XUGgHaoA@uUhqu;U8e^+`9ktkX#>vnDcDFrW{q^wfGmq8NzV@#PK3)41}wPiTtD z-MLM;HmX`aG}FlyJk)6;QqhIUv$!YYpX=h(Tm}Y38Vp$ETE0JYnX9coITe zoVX>7jK?ZC70$WeqnomCw6^BE*y(mneTtTfp0eg{aYq$>4LZgeM2e*)h`5c2ca+`h1 zvh`5tVxWeVzABnjVv!J7@May)44mrM+?O4t)D5FOlFfXEyJ^QvvQ$HDt%O!H@>V#h zLSu@RBSlcEoQN3p$<`f5iS>wZZwJ%&^H$9}BkS!Ey)(@Sj^xYE$%QtQFF4TMYukTV#Ipv8bmy(WM zyd@|A<;OZ^>8aT_4xXCmw)W!MHp`7@qqDP6Q`#zQ^2GdwNU3)ZQl+w0Uy}em$9-;^ zc->x=l6Vd^D{rgKaStHa^R8=04rj=%s289CMCwJUdJ zs>;?oR@J4b+m%&7yVV)|S8o{=r<^e2u$5PKP{`$I>DcbJbtIzDRYS7=(;a@<8*Yzl z*X-T5xuBwf;qnx_ixi zBoWJVhz}k#c`F*K2J$lEFx-oGMF3{VvUKmI7kivr=I11pH;THM1w~!r)k($W;BY3I zMIoOIL6629c;KkO0wI2!^r+o;J%^?gm2X#9EmaNPiowQ~S;1gK$^K9m1+pF@ig^+g z_r}NSbdQMbVald9UZ)`bRG{0siMVU`oc8^{w-TnRy1D3*;HKMisfrRCmS$S0S~yUr zb(}nkgc8gK0DiZ1e{FQa&rff=Ygl%RzfUuD0>0C4p57y+s*0jks;b5dLmER0q+>b4__L@a zfIWtl?G_3Z>UGLVtlllg+iZrRDem;NvG8R<=6Fjs3Wd%Yjt&9IBVLLrVi20`@wLp6 zk{JPV%WQ7T<#lkj+^Drx~)YQP0vQv0!&d!lfnOHhw97$p6=x}z=CCc8EmukxP zu7F4eBMnYzk%4nJmnszCVWMs)KEx5C>(pJFUtkyiSQPk7Iw`w?U)KvtA z2~`nPm;w$teiQWvIMbEer+XTf^G{b~vDDF0NV3vaQO!=$4-r=eMDb)sDC}}LxgSxD zLw%V567jM6! z9bdR_#@kD9ufNh;>#FJ&kW^#adkPdN?qxPMlw^}O8_1cc-a;T|VdwoKKB{{6B{7EPABqR~TECB9tf--f@o=Eoj zLfHgw(R-n|?ls=~kK^oX43x?Db5taBVls>X6XB%f7nuH0-_)@K`g^f<#eD^{ zeo`8hN;j#3TXkHpm6C9*@zgJsRG@GeB6y9IBQ59&*>861ZQUwL9nmLpBYZX$-;(?xADTCz?bB2ia`3z%86TO3L zNB$=|7Px$pyf9F0I`}SkN@|MhR5cXx$hFk6QBEaZ#abwvP4fO5IjZ42hLxXdyM31w{Q)qXRK&&INqjEufrCB9-X{rQu-ZH5n=9#=m(vb&bQ63$b9^J-OTIqhg_8oohy3q$xAJm9#%W_bBGtD|;2 z`+<-<==V94K=>=5L9&*UpnGj9YOnVS+NdqdFNafa_z7lom52P%M?&a3{{Rq>0m#Ai zHdfrfM`YV}${m-u>E{u@g-s1&F=VDHSR|1<9C0A8ERvysE=ORCx+^B>uH&{|(w?T{ zxu&5FQ%L3pqNajRNS&qyq-O(@5=Umh(Ho^jWhE}z-V}H0noYI1VUjjJB=X5^saDIu z1d;M(OpYKEz+r zw+LC^hl`wX0}X@N9QX3~e~)L~O--u(MNNKLUPqRuN#yWR`;fHohG5;w`9pdf@jbMc zP}ll<&E0MLa=NK40MSUy{Aw<877Q27CpI!=aDX!q4|D9#VYJp+jjlbb&dX79oXb^g zuVtu$hsp;TV~hz$CdeFsBRDOBb&0xWz~JYVuu5cUYZbfD3hO)FY3rKkwf7ytZLFlb zH4Cj8SfO)?B&mvNJiLY_$MBqjP7XBrzq(`h-HQD50^3_vwca~jWd&UWRU56eDEN8e zaWuTR_XH460o_LxZBPx?Zj5w>wp*Q56|#N7Ih2aqWt;eHvY}Z}NfCu4^=y&MdlRd( zr~OaZw%w;C`uZ#FRtx2_1*E!LZ8OgC+wfGX%B81`!3QkM;i$+CbDd|@wrJcWg{F$J zP6SxO+p?>tmuuX1xvjLr9bIVfn!zfxblHd$N+g_s>Q{+p=LiRo1QD&rbuLn}+gLyQswp)5+V8Pev#>Q2g|+n1Xaj(U2U>p+&W&s>%p zjZ=zM$ta6FWJ8F_C8CvbeFGDXRyY2u?7jE8hTOKpOa&ezd>TFtRya>-os(Ebq@6uJBI%Nc9hUo?I(sBnu>_rtgu(dCm3W>OnhgKFi9u3 z&e7>-PwiH1?N4g7bh0~juE>+r%XgxWgr-sd05I=VY0h#7nPLPVMhogqx;M8sJ?4Xd z?TwqZY2$jOsh;gLDC=gNF==6rF#H}&j_t{m5HrV3JBz6_^H^$bn=5V$<=%#%EP{E~ z++am+J|t@B5?m5{hm0TZ9duo*>UkmHp=@BcbC#)Mxm;=~t`r-3@Ltn$6=I@}wk}H; z?}?OFOXE3DE?<#3U=(&bhh5WMyS%qyv>0uTB}=_bmiMWpCb|#+ff*FbG!cTpmsA9C zJ+tVsb^BFPTH#EGfBW&BQ?1-L zuLq@9>QPfiOG6aN8(XVa!|Y6yPgUZgliwmhy|Q!PS>w`bp8d@f2gO~nfE%T1b>DB@ z?3OD=)3BwQs-DcX32~>Rx=|?cIP*^tXIGO9ywzAYihWoBP7*0MX6C<9tL|z_>n!&A z3SmhVe&0uCVn~KR8j86jsRR>*SjTK~ILOoNT@ByeKh%x#Vl|`+_#y_HV2dfbjxz-#`V~gZ(`d0O@irlxKu!E<+xt!=9WkbgU+B8@M$7h z1dG8TW;tBQp3u5g)7m|tE1}pMs`*zeD;TVX;c}T0=_|ytJ!M?cWUN70BxvrcNh_R^ zbX$7ec6Uteb(@N^x(TT+b5#A}_Uc!)TVgJxMGSRFN=YVoo+-?pIVqhf+NQXlX5-|F zCI=gnl$m4NTW+-O%KoI<>TWxZY3d2BucU(OOHm*|QE8{Da|nz8P9yUu9hrRE&tmkG z`zc|fpxyMeR%>)r6V}CW_{EmrUt2U~Ow!L%tkK4>g^VhAoQs|dfKHz+o0n_vy{T8S z>>HjMNUqSppLSD5WuBV7mH+ZCYNf^jjw2+wc2+5o;fWh z-(MwAqqtOH;y9v+JwQB*5#gs{kjzx$N)qZEOE2=y6CTzRbgRvgNng_o)7y3}s*!31 zZCqDc86o(JnwJg|F%3&{EQT^1gg^=~BP8HmR$3aXhR>#?pL|kSsNSO&dWghzi39<- zq%q4Zd>)|)3an821>3P`o z$qkoy+GX4~3$1jNe|lMV zoTLd0a$?MJ;era5KZthIU#Jds9_ewmjRVJY8kVDX%hLJ!a|P(v-(kD7luu=hQdG%q zkyYNU9pvDU2Lm!lL13)GhDL%{?pwW@==Upz>!!I@LKE*AN;+vHq-cDr6UkLHQ>A;U zI1Zdi?l9N{HCZ>_%c9v7mh_<%bI=y`o-D~rEU8nDB!+087-7kAqqaK* z#*1>?X*R_+!>hJcNgYL3-LnB&QKBF;kj}_eRfc?4k%MOebKgta;3*yLb(|zFzU&?Q z)lIh-Qa1G*m#wW|OpRB!>S(2+o+^YKR#cg((~Nz~5g=Y!1hW7Ye2FKqZyQ$8rng5* z`)6!LHHzU)Qxw#Y-25hrVBOVZF}pbNB$ZGeJX9R=Y24eM>C=tFJwVt{iY?7ZBaW`k z40n1yfl}&XnjOF1gX5}r2c{3sH6d83&o)tjGI;q;XtwPj_d>w;lZ^iO_@O(B zhh%TgqkZ*BbF$oPDXcYAD@%B|RW)rpa$`{>Fu>wA#5oJc1&iPjpw^n-vuE}~@ol)& zy(OD&&^-#*EwZk%8(b2eO+>S+hDkXv5=MoxP74xFrgaN&^%r||+TFMIv{uU{$97KB z-Ks5@YB-kCVNfb^!ge!C2myF;3K%g`R1I@qP|HZUG~$C93}bM>S=2 zVq?TBPPHEqKZe;nKqo9q4C~SOeugs`d)-ISEE<`lVcOAz^SK3&se2BAc5eFF@kwl& zV{QAgGeaD-3XCHY(^rLYBN9&-j}RA@9F95}(k_y1OP2JSn{{j&J1bC7MFNTpQ`6rk zjpLbWsor++fl-!!43i+v0^^3O4XM;#l-RGa?dtu5WBAHwgfdgz>S`@@-Yi4NJkf9x z<2W)uCM8ET9klDXH*Hi~@gmw1Q1t%mZHZ~kZA|v%hO|b1fZ`Pi;mydp_>Cc4as`1S zGglnUX=6L^jt8~P-9Xa6I&Hc3ZQpq9&87FCs)C~5aJpUII$+lP_^B*4C5(OQc@+dG z!SeFX>UvkxLd&Sy%>(%DHm2GogTH#O&zGE*;{xvl_WRD?LU=QH~Rvp8t zHfk!{t%Ai`E}M#>X{|EQM@rEbnV$^w&_bE1MrPtijyw7S2-Wqq?Hw?pTXhcLu-i9v z#?sSA4bqw!QVV^?5bZrRH10#FNcjdWP{aSh6t!-+%#1wPj8Ok>&t|!f5xqQ22~nvum+kV3D@I==xxFBF0<3}j%@v1K^yYHBaD9TiRft8A3HOua$4$S9#( z^mP_-gUHlRA_D68_7F|__dkGwix2UhQ!rB`@UZMtzCD?gX1{|}jAlf^c8FwYIk2K7-s;Z`x*UTy?>Tla;Gtx&7aPLtNRFsC0VGF)_XNdpNnmt zlF`(N_O0)8UH<^Io5zJb@x@dwH0F=F zZ-@>&H~<`oP@I(IiCpU4+WWJlR-N)TRUMAZ8k%uKQE?X7cKI7^YI3m{zOIH;YJSC)zR0bt~l+~f?hE!a)8XTGZq9lgj>s>FdC*e{>kaDNcOeh-0qyH zYi@}mS*xy8RF>)njAdVp4NmhpATo~ylne|Xayuuj+taBx>dn8gY$>?vtTpUvR?Aa8 zqPm_m@-)&>-09_}l#f!d&l~)>gQX6n^#1!(SZ3;#uE%q!^3l{)(AeREnqbHHQB*US zT_odx#L83!2Oj53jF2De@#*{F3`MeHGe_c+H!jubCgi-?I@@&LH1pVZ70L<*oOS)-96^dpk69m0YD8h6_pt8MK&RoAE131OnP{q;Q+HNJ(4&3vc|W^Wp` z%CyRz@y0Y@*j%vfsG9=i(mks!XH2%&Og7ul+)Q#-g@pk3LF|6p=Ynq^U9t$kVzn^%JG!3=0PdQ91z*pGX0<|jny8g?u*Ay`e%0C6t&RD zPhT&?*LZVH3WP^i*d3X>0Z)P?#5#b5d5tfc%Ftt{O6PfMn(Q z_Qtz9&r3tK_f7L@ZtBgkX|d2wm#bB%&q*~+Tnu^3T1<^J;Z9r25KR97qpqurP&|l+ zNWc6_Xp%_xNbC%J)n{qww@abD7usDaxm)fRDAp=Es{O{Y%@oSOnG&8F(I`XTJe;@4 z`)bJCHjb=xj`tO|>DC>|TVmXFf@58Dve!*)xAE`c$v4Ea#^bt?Fvc-}eRZn4a_s*A zhe-Cl?_$$b-fCugYp?b?H>QVzmT+W>KN%m2=Mp0vj^ydZ_hH}tFSTsFv36bMO?9W1 z4a07dmZ2o5jQ}yp7mk4`hJ6fzJoY))Dt$wXi{8r|d`HzhHPL~z;d4LQRk~SyptsmB zmwn;6_XQkZ2hLvEJc1*L1}vy_Z42_*sI z@fhd4XBqchRQq?Nw`*;}g=lGR*68;1Z&6=$dRhuNRFB2ayULyWWO8N$0zUa2O(v!< zXV^|_KLwIqJd#V*YUv%(f4y{iGMigrRZ`Kcf)jY$&|NNZJ!?h}IAB#VK)ELlt1deb z!_!sud|i0oaNqv<*pxR*wIZcD{ohk4HBidm!6`pBQ3}c3kc4dETOG!_J78~ZtJK(R zwD;P}Mc$U4hB_pbrAva*6ofsJYEO_tRx^|akG*%dp!>rC=Q z_gm)atc+BoAwo&MKES+N7+rC|+6`N?< zYAnkVPg7NBrKEa>DmyvL*U!SVg)i--hU&V?FCwbj6 zo>Na9JxryLcMdqR;GC%S)5XhUY)d7qR_;4x_io;65*ldI*I8dz;7x}956Ad&Q^5}c za7f7RcnoJscCNDAcC}U3kEa_#y71dM+S+S9y0)rH87|LK$xTry1%wFjq@Edd z4~VA#5Hw={0J8dlEiFYh%HHkir8yDHhZr@<0mBe*@0+D)+YI&-H}}C zpYEt0D4uF+c-w?VIq6-dkr}%clfnbPu?I-jXlIt(Gu=J1#_U}yO6SrJq+VKU&giXM zERRU0dsMfEthUOkhlrLnNnl_Iz%oP4l#cv|BgkKCn?A{_+M7)_T|LUG?P@aH?$-y1 z)6xvd$Tx=JrSQuFvAm8Ls)2*p57C=O?Xin5gSYApHnx^=B|&T zy-=;L-Bwy^nV!dT+G{#JG7<;y%m^Z$n0oLrl06rWdv=}B)*a%k3;Oq2W0Ghaw~$qr zx#H@juKjDN>Xo+BJ)Y4lGC@m2Ei$O7GDrwrF#h=0zRoevwZEom2XYKuzF2W^_SZ`l@Qg@ zS=N$Tvv+LiUu6BD>3W|NTPL?uTultkBwJ%~xVl{EJ7Bf8 zuCLEBi~`UxSu#ANk1mhYbSq?S3x!tny3n)k3xxIX)z((l_zMkW#zP#k!c@rwOpdr< ztV3f5-&DTm+g(Z7_UWtk?dN4!E7OdV#|XeHOME zyr5Y4`lM5uxJvi&8-Ke|nzLeJ5;kDK({p++*;kZ*vT)=suhC;|g9LTb%4;F9;Bfid*^^2&N zi(c=WsW44TX=)gOx!NiIA_^+OBw-BHy!$gTQdvx7;Ea*!Dz|O*Y}Q$?_KU@2JBAsj zH2J(sO$FL1SC1MA#v_D)ay>-_!ajZB>y_?CQrZ)ZEkuSzRcePkd8~OTvgW^i*ggo z_;MkZp-Eiv3gEG91sE%5S}e31rk>xkcT}H#ZK{i6NU+Uof{9nfe_1K{r9?af9xcR% z1Ri9l&zo?cOKp=G;dSDUFw2bLQ1!*Ej*p{ny*Q$b>?@hyGp025+sFA>l z)-F<-lP&=P7Z$oiMSvVE&Dj{m597rbv zn)+me->vR@d9C{&`vG4qd{)~+3V#kZcp86ZFWPrA)jzI2_(md|^ zstV21n-zUjn~$eEU#R=h+PPtxYY=)kR#E16lBdFX$-rZUiAv|(_tl@&3Hs@}HuY}C zuGu@f$!LJ8+c#sv)zuKEmyHcYTtmi|nnHah0np<)^cN1q+nod1d(Qs=Q+KGb%@*L6 z3W*l&br#C62g30MOVb$;Ok0zW7zo(;gN&1>3l7cc{RtM zHtr}2%ORR{eBpprib4rF!SxS!h;C>xjCM+N0E&4l^D-Tky()T$^1y6^1A)Vr;$ z0uP9RTd`adrm1Y(TYFN;y7v!UBa$0xx;;&%-Xcd>yQMIoDtu?mqc7sNGx)&mrO563 z-q9SETXlE3BmHKM)D?mG>f2{RVJZ=GTY%gEi7>x zzpA!&&D*DoNouNH=}A+%WUQ=Ox_gDbo}!|n25wBSR6>eXZ~*2xB&En;x+qSuTW^cWpQ}&0kRCNgx~%LT5Y+PjS0Z&XWdr?S^mNCU%6 zlMnJ*jy`4aqYdGM83!SIa8WQ{U>th{mEbDay=y-kaIZK+Mp zx0E{F_GZ;Z(cgwfU86Z=wQnzlcY`evM%WYfj>9Zl4tHiliR@kGcq^R?F zj3j07<o5C{i4qW3=1 z`1-i+yF!+t!?G>6C$|et6p=v;5qViEQ4o<-BpDLK=0^AA-HyA^w@V~jrHr)w%E)@# zfoTO8>Q6~F6qOd+?HIOi1+JrZr;2-}G*$NS4i+fsnyN1m##r)ZV7|a(8e6w*KBV35 z)RnKZt2Z6uJPFOjKxrYQQc8;1^CCZ!3eLP-;{nM7Q|xw4pRuX8Hr=k=TcV!*Vzbxo zdRc9iMJ(w`@@6Pxr*IpH%zdK6V~{7)N)?}Iihc26pxaly*;i3U+$o+LEx9VK(#&MQ zX(+4VNgciUtwS7O0J?l~M>9ZYy5EPYQ;2JgpD{|Cu06HV{lg94YFz&K-7w1XdF-*Z zx}BJxB{J0sB$ZPjEQ}Wz$RzjGL41#L?+e9M&iQnzxZP?P%Fi^dD>*)+CqJ;)Z7$X5 z(%MC?iq~(Ro;G!;nX0R4B9>UyjE@y3#K>d7QVD4yj5p7)(0hi^=|xp#re2xuTUOw= z2+Pk)1x2kS#(crvwIq>92LOeXlbmC*I$5d&c@}e|bDd5rkv0b6-yJpGbeFBWS3Lyc zMUGq+Q0boGhCw*aewwncoA+?t_Z`P@-}c_pzF2KFZAh2PwWZ*ar2haa8mev*$tWMq zlHIaN)9+HYtv5@kt`wH;j#}odj!ra}X>PLJQdD9Oh`tiTN~0gj@e;l8qez=uZSF3i zlr$T9(jcH#daBE;hD&v=S-Z#pWsL@ZkcTAt4L!0*UN(#*Iu^81Dc@!FZ*tdPBct0p z4|3JbdX)`5Zr|SZR}m7gVdBG7WsN`s{&XP&R<7jg{i6Q2oxgJHHrw4xw;)Q&^t{+A zDN-p=@ko9yl3ovnY!VQs`X^M@+Ul;->0a`#vROBp-7S;Ri0%_oZHg;wb<8vT1w@64 z#DAHchc8mTgH2T1zwG6`ZFb6ge@kH7)z$JfvbvhykviAJJ#@STjYERz`y4;3x+1GcL@@zO}EEfy`g zux?WH`KFD9b+X-HuQgM!mkTVp^Eu)RXOS7l5H-!6Roop)*&F)jU_C&;UJ`}XW2?BQ zhb2sS1T?hrGm+oWK2N5w#?23ke^ITY>A_DApGZANs{H`A^(%DkyEK=Y4dq9>ZdI|% z@wBw+r{m>uni164Iz$T)(f z6UC<OnwUk2U0O- zweUVEPw@x1)3844&ZgaKIy2Ln&56^Vlu}wQw-sx2bre-hOjPqt##uW^@@I+cSOUGq zNzSQ`q5Yq2J2$4=4{OlReA|C~%~824t7)myapLkYLmO4d@gfCK&xT@r=S*9F?XAVHn&Z1E1G z9_;Hz&SPTTy%w-i(Mx&2xJ6h5DN!#Jap0^{OzOjrBy|JIp!?*G{i3$+D|H6J-@B6g zTYRgdf?E2DTE#`T*2tlwgwZ7NiB%8)z?LQ33y)1{+55RVaa$D*^Xg*N+G%Pdr8L!c z#*g8`sp1w$@UV`<_)CWk6k87G7?@#)Z9X#6!0Qa#V(>c zYaa~~d+>>klX)Td{E@Dqbt`D!I^AJS(Qey2e)YDf>aSNwD($Aes+D5Q$l=sW;2!?~ zfn0;z-v>!|&bj@Px8;TkMy6`pHJT~SWhAya7CM>daU)boAc5qC`GO3Jazmd?0j>59 ziS29c`+6l+rdu6!v;x6e7U2Wcw}{`wXlbEVSaK1V;7nV-G3^_oA7!nxB|T+*2IHEs ztBM@6>j?NwDYloa(wfmUVk_`v==aTyqZ;TW`qSO&=K1Unx_>26i=)m=KXbF8M8 z;VM*DQ&$SHRRJx;n8K35Mm$eW1RQe6BGuo2X5X{Sbz7Tp+V-7>n%XMZQlwQ9su@Bm zyli0wV+d97z_8@lb;n{aaP;EI1)fWFJSL`k)uDot4Yu<*k3E6-iHTP5f{rA90(lfd zdvWL1K-Z3+9s8|NwbKvk6;timXkV{8V%gHJsoVSu1uaBgB?aD|i6sI#1Iav6s=G)@ z$;&nX01=H{TQjX&PVZ`3#OiIAb6)JpS5_^uO-iyzS=2f4R-$Q_lNIE^1qhv$PLcMP zO063=c3JLmbo=i+{Z-m~d)C~p2{m}$?Gol zm-r0#c`0ZLaHLO&S&3E>q>?*EtByeUWRkpG`fFq5(Q06B`v7p1VbsF=6hT*>-rW&V zRYf+{xNK?fwJkMRsQ8+CrKLkL0HR`Icyb|GyWoNpcN%Ykz4qP4rXBge_N=urt9Y`| z&B`^5k_ZsG#exVxOh*HcX#0>;`ft%~wZ5t8?zgSiY@4X)Dj=gti`P!mMYiF0tf#EEOlYMQ6b#g~WHDzABvYv>zJNyc(JYkub5oi4INOKZ2@m1=(Rj*6OlO30U3!+P+l zNdS=)p6ode#9@6j22PiB!>9F?5?0V#D8+3+cdniq+N!q9%id&?q|&%T19?!k0X$bh z?z@L+Z2N`Iy1QYs)Qg;}&f`%f$lP8hAWKh5u!x~oR>3(?LGO{Q&wiV%1Z+H7t$KLJdX^e$&j)D${BD0bKIz^x6Hc}e03Vz ze&0L0dwt_yZVNu%vO!bePmXGfQ9UVf6nsEC#m!0BScD=7OUC09nz>t8JQE zNM4=`4HT$pQZ`W2Mj)s~$1dh1j1qH`jZVAt=WcK6YCDa><8@l9nl=}kJ5b32K&m{B zv~oMVYQ(8BMx>LEGG{t`dXU#%$^*ZurZB$&47K%Rby;t;7CKIr#a?Z6EoGvN*3eBG zOp`msKNO6ZrBK-Z7z7-aQ-U>(UsJleZIIcwe$cXA>!hrX-$_GVQ&6)dvKT^2YNSlA zO90AQ9eEaEfJTT}{>uF;+Y1%q%X$>`HT3B%MY5K9nwjL5B3e!olBFNh7#x?l%Z~cY zSa%IY+OCd*&s}V!x-8IDMsE{R)boZuX){4P;$T&9;x$zyc4hR{Ni$qeNDtrUnCM&^ zWYJr8MSoBBe(11K((Y@evf8Gk-7WA%@pNF%=?YH@#p2AZ_#eV&TzOkltG2Z@X6AYt zE~Ze^*sQd&cv9P_rIxOB50&OHBZ_1U6`j~PC_gO*P1^U`xoSE^Uu?dn(y*Glk`1@; z)6`B$3?Zmy69y$bqCQQ4**)+s`)9$`FoUX_V{FkqO^Tl9TYFn;ny9BPIHc_-CSath z;oK0xjuZ~k2R?|@d)>PsF3*>a{;IvJ+R$6=)YZ3pO=WF5$dt4eii(a^HIqnuQ{oBY zE|LWt$wtT=P60i@(`-${SzRqnmiKwuaY|N0A*iRVkgqTEO)Rwz@~3nBJ_&J}AUmGJOapI8w<;Ezzi^0DLMkPm zM5Cv2*z+qOUlag)0;}KWp4!(K*ezL*U3W@0nmyGDi*;t`y2V0}v^MJNMVM00@fgEM z;Jctuzl*~KzKiH}(d@ZwZ7tU2y)U)s>^us|ugy~gtXP&sUxx@?&tieUMI%hK{cP!e z*xd5%z4c$n}eFsA>q<6XCyxpvoBF{{RyJf2uob?b>zw1{){e-8`eSq&G0N zMtV9nQ&0#Tc^)OX;~$70$ZJ#~lW^hwR(a-pCd&%u<><#%3L4IybmwlzQ&}+;b5~G^ zV`!fz#9s!YF*JZ2W>9^=BPTY-(&?u8wOeUuZWR{GYEzf^&K2dra&kz*ag7hOYH*{r zea*I;kk=KB>29zNA(X5v5xe`y2LbsP{WY7-PHJHl5K~DzWX2?zG|s2oDD9r#JbgyC zjVmi9VRp7tnxv0)*i=>3VxH}|Dk&(P1Ij2XB#oykJh(iAcJ;{Z^Uk(^XRQ>Jkk4$| z*Ba)iaH4wp$73K>IFe-tfl=QDzJ0NzPqYWxqhxfry{>zOb<*KFEJL2)q@{S+0=fT?+yFAwv3zasMf2EvUw^@HcM>ry(Dc*!Erp07A2UHK<3SWJ7d>X z{WiN}1*-yAFi7)5^-y=eSa!zE+)!-01&aA{zg#0mhI@N~Y${Kfc%n>&9myTBp52dg z#%Qh-sYg{DO+8@}M-E4oJ&%*hxEaCZbJ!D|C8g@eO}H!S?R$OhH`$7%!DfMs2@j|$ z(Vr717{UiQ?SZK>@7>v5RwB5=ZH|hDA}U^*-B%Qnl1~`&VpIhIInSH(B5umq-(rV5B%&To(3X?Bj5)wU&@GytSPTfel=9~SWG zL}*I603h;VxcZU`1Kes17D{WFnJyPbt*VMbB0*49Y1Kz2W>iF9FL8zokDDI)AV|tl zYkMQqb=O*|nd|B%LIReIp#@6g*NNm#KAJCLsWo6!8t0ZVAP+LJrV4^0K=&*`Bp*|s*IC-Ct@hZy>9to&Q&|~r@{0G7*-H{U%5ZVm zpIrQa>@`CL6PtKV6U`FK9ZJ!BEN#k1cz+iF4;6MG_Rdao+rF2rRTj^^s&10g(6owE z;Y!o4O6NWsO76tS$G??VA1vxMH{Mf49X&ksq!Tv>8RF?$y$?}2jeRU^o zY|9mw#N3zL9qOj(Niw_*UvR2;7q?)M8DszqoU+Eb`smp5_fSc58phhNP5!~NDAZL7 znyZAsc+u0w^%8=8nZ1Ddk_XUfF8=_vw^siEsA)y&a%J+w%f%__V?LlE$!7VISf6ZY zgqyc;@)fshy@}u_%}EV3t19R4fLMnk>JT5xSslx?tX5esmo;l@K4p`|46aDe;%qAs z>^U*V)6-jQ5l4lMt#eN9>J5vdG41NPYHD|V!lpkDi#(KQ&aI3RC2Wwm?T^Fr8fBxu zZT-5>wk(vD5}0CHCYVPgrGfM>B7%Q&>GaiZzi5+so}P}!)BAg40{{YB^-R~AX&00-W zO&BmEN#IU~J`#EYd5{>9pJqM%v@+QxJd#!_QdOF#MulFULebQq{620xG2g#&^4519 zmq~EH&3U^eo{Y{TM23>8Auf3y&&U8-)0d`k?V_)@ zZSrQO3#=^iPQ2Pmeomwg<0k<7{JVP%AXjyhVBf9(0Dn^4R`(qwGF3wj3`ET&WMFeb zq~|yxjC@EV8P}5Ut8{WyLnh6<%W|lWABjkj=4j(8q%(#C58sYh1s^~)1KJenyzs2K zHzmKtG*uOH)K5y@Cl%r&$Dk)90CDrsT8pJMVnbDKrg;(OVNyic;-j+hM_^dv*N@M( zfYDS_%8}K!+Pzw!o=4=j6@o|YjB!X=`3z^jER1>$8KnEBrsY{@qMo8@pa{~kK*1dx zWHO#4{Dwvk%imYHoFVCka<|tMs-#JZsfL)83m|l2qrq zQ-aA#3ul>P6aWWo0i5IW(_|EP8iOr5QK^kbC?c4H&43`DSS3f)u6|3bZx(vBRJ&ZO z8U=&~T0*LsISLUOKr9EjV0nCohy&dX(WISpv~BuEmRqITIsr)&Nl)O-hm5D2o(nc} zoR2Wc^c}UGb;7<)y9Gq|nKwP5qFMM*IBYi{P6h@Bi%nYv)vBYq z&{O}a} zC;$g1j}^h}d+PRrhjFpFBEz$Kd%Nw`6K@@vK?Bsr3$Md0iy>6WD-45_e1Sc|8SSd_ zeVeeXyOOG=$F&++t0Oej5Ao&_BM1iuz>yFFJ91(`7yxHhXZ)n>{kca367Snl!c9Ci zVjwBqLBoJoCCI_zV)$w%UZJkHZCgZpPO9dS+H0$6_)RQvHuN>NyS>)vZEN6(ZS$GFGs7|tL@9IjCC)fJ zXIeBhXW|0!jaG0}GoeAqx0o?1OM2-eWAFRG>OG%vY>VVjS)`_vR@`?Jai>bgjYy6p z4I4bXM{+qJ2k{f2Fh_O;C$?#8-oKjWtKUs%EW3*9V6UO5u~A#5SgK4lCY_}$;FD3} zIVBJrf)tm}d;&FY>|K$wD5J6e0B7u#*9%paYKM+jhG&AJc@##i43VdZjgCwin1v+p z3*S_yQ$E%^->Th9z3w#F+jS{sni%6_6VEFwM4&OdKM~@9J8|widSvVLLu%dX=jry? zywdH;$_p)B2&RI^B^*&nM8O6_MkFfakj?B!IVw)Fx(8Wlb{4UyZ2|^YBJRJl!N1E# zZ+*3Jy2{Nd%M3L%uEmukmT3G*R4^b8Xb9{{<*7S2r<-4C$8)*IS6ghn)7>L@429lW znN`VkRt7%|6~f`zj>Cxod-X+j@YzkazW%+@Qki3#3S^|ZywcO5B&1GPjvI>>UMd`~ ze}7DBdXKYhlN-eQZW_`OI4(7I`WWY?q>;HPz%la)#d|Xm#E#k3`xUot`}~rft0C4| z_gsY+PU`Bek=p3DRTLK6SB-U`sY{m%c>L^4bHynt^#FxHt0Nx635aY);!-ry-ov0JFB;-!sxNp-2FtpR8znyR)rsmvt*01tzP9eLgkSJuazqp@-TSO z$c4aB%mM~Z278TUc7svxMnMU#)W*|J1S;QnQChb?;iTUCTXEc}?KWgcX{D;7k%Y0} zk;R>*e8g2xCcq?~`P3GrqucOFxU5zyVnDOWEyk+f48q;awpolX$~IuZK~f4Ud9n%B zxwm%5PmRFKx8Z=rZL2o+r-CR_qIsQo%CS?)C;C|8#jtyV4s{amu&A$dW5Epclt z!WXKNwknYF4jdRN0MZm(72(K7kZ^IK8eK~Xwx7uXo)URVE4%I8P_-EDHbX-#ekO`5 z9c=L=peKnTD;mauxPg`|P6!ztv~JKGbB@jDkMA?VMh3sEz*Kk)dbON9#99mpSy5`DX9;jniqnwWfza#hz{ zFOPMvpqJqqC#G7No)qA{nHb6vH}C4WBSm)n^feWCS!tCQ;u&RynZ%Js!1m@eexz{a*SR#^`y%-VI)|c&(!LrIR z+aTnV*y-*oO-)6*vG(1~6ttfWPOhY+Lmq5M0?qyJ!Vjl%J#_+#D+L`=-!08^zsqhb zNERu~QLErCIFP)8oSf(CNzrGz3$ui|cj>LSd{uHUg!4(kDVcH-NR^u- zu~UE>)3_R>H-FjNZCc`%(_}NraRpq4lGscPMVQO6Q~zMyS=4z9mSPi6;(#v`h!dfY(p-XYIkaca`cZe^V!-vtFp8 zNNJU-7(r7x#%FnXGQfNGMD6NxoMOGM>F(&VL0>)glCG92UMV!N!yQDi%GkgW39!T5 zGUp)Ve6?MUk5X^==dXg_Z#NMa#JnqtI@w_#igYNU8wUXLJhFQOq`Dyg0D{ojoX$nB z(CSU?MQ^ZG-L2OON~u-edU)t)+IZiSfZWgqke4GNi3H?i;0+e4zwKJPMJf1N*$LrR zlu%1LRmOz!=I|4hK+E_*Iq#it4@xe3*P^%Mx7&2i_P0RtS??3Y6x8V6lEUnabM)c~ z$D!9~*{SUpI*TU#S!gS3sp*)_RY@U`h%ic_Ldng!08Vj?_8zB5b6(Sxq-=QH6XxEy z(^XocU7dJ|gj31!vsJ}9vq)Q$0?b2p?}Z=%`F7JqsizUOxs*$Cl zjYdxr{JY~hatIh5kG7hwrPfwd(^{=hJam+>L>jiLF(XeY!7<`RXY}q^dlBDJ<+sWQPR<#vkTveYvLF)5W)m5Jwb%yuIY zk5X_{XF&NJ4JJnuUC(80rs%1usgjDGWm8Pa9L!^4-K@~T7?5Jb{{5@}dx%s~za0lV@5=Na|IiLV7wgJltw zBBndEr{Za!DV~ppH&3)qj%EQlA!`WnhUk?5@5e@*#(Q*ck8Mzik_(mDaG)R4j(1#(2-% zKuP7;;Nw102*Ag0Oyf)djHI~sLiY)*rk)CU#4=l9MtKBm7m@9ftAfM;a91E>_R^l{ z@o6Y1Yb@4iYG#&k6)hshA(d1wl&f-FFPEDjC|Ds3eF2reHs1O*a!*aw3ynM>nd79S zwZwupAY+`ovdQh{$oC-Qvc~R$T6@iwj+*yPQWchYDkY{hkxIfM3P~Jt!4y7XN1R9w zNy6%=VMy$nInfr2&CGtV^^dteNI=iOB-g|mm zeP!~B;cU4;$OputnG}yzIRugF2-Q(F9eqV4O>W$i&{sMnl@%TcSsA$bhXBlmK0b&` zC?g{}(Qn&VsHisWrmt~as{R78>ZPfbycsSWo0p%0gMsP9o+q|c;0-adNCw)%Op(S; z>&n?zXti{jxfg167J_-|B3?$hBI8bp%lMN>j3Wv`TiAUCJmDxYjgEsEvS znr+b3v~pHeR9J5D%LFDiP(-O9R#S!qB9~*326ZENO}8v!zWaQ&Ty5SoOG`C$205Un zjdQ{kjF{DONhM0MvCeVt$vs5sw%obFb)?&t8na9)qm65+E=v_mVmwHaQwZWK3CiJ_ z4`bzEbzMoB?zajyIHewQmDGEit-E(|alTsa(bdLj>7%Qlib*J7qk=^&#o9nv_u!>W zSkGhM(xSiJx{-aoJut7^+cX++bFFjX$8@QWFAB#Io5V#>Pa?>nuz4v5(Icw+vv1w@ ze0zhVb{Q%z8;Xez;Jx!Tb#rl5R#5I$YE!un5;S-tJUe!)DEhlux^Kx{)fyUle*@uZ znySNZ3r#~w*%;4GfJn|thUd>J%jGNIK=~#-l*U5~a24rM_Kmvjd(F1lecV@l!C*C% zjYU~&yuG?=ry-+g)+nMe)DA_6f;GcNB&Pt>Q_QR8 z9w=~6a!A$r(+%$i(%&%K?zbv9t(7#fMR9_X8B^eAJ&{>wUTqq%DqI%hj^uY5Q(xz3 zamA)c&nvoPG@W;4nQN+~xZiD7E1;{4Q>>Fy^OZwjn1g}{$j$)_GChxNP#a!~zhUm` z+8ZxAS`$&=wYH{d(pNydiUN+1go~wv*i3dvLbkJwmhfI z!1wgRoE+mLROaF7?GEI%>CY0EJTp&GgL(#Qb#m+ zD#}t29UKry%x51_=&MB?>gQH2J0ozUl*q)@+G=HR@vLe&_)f9}1QC@l7$A=L(q9a2 z?3~#iJFhv}X{nl{r`2y|j_Sw!lAaYI9Fknc6if+LW+%)W8OIhKwOjA)(+1GB&>Fg{ zeKe96hP7&-sWk3a1S>}rakMA0{{YOqXTN3E+xGte-PINtw>IKxOTCpV+36~2*J{auJVUEvlCq-{=*&CmdY`Pd`^9Khy6tJEm%u|ROMDQ;YkSV@y|&?=`0`0THD$FHt?~guPV*wo9AiJ{Syi#=^V6R0ui4eMzl*NvowB~J z z3W{mu7(*C%Of4egikEzXatf2CO^rPJs;ZxD(cgCs=E-4>u83Lh4e=H9lDOdR^CZr$ z=g_Ohsq8!8n@s6zU^|x9El-I>AUoM>Oj>utL>?C( z)@|L<)2-ugvsYGA-!{J9f?49Fve^RG)5xkng)tC?E+r&##D~k1jXm$)zSGfK?H5~R z^LE)*s@^KDm;1yf38$!uds2KPk%pLd8Du#0I*ZrMyL8^WzVCFT-kWy8XQG`g^pn}H z5#27c!pAZ&Pl$;NJ7*^)@z@0!$PLkZz3q8c?R(uj-n(ki#{?Ae?pnmBim_ijVM;k8 zkxoyiDF^`PzhY!CL8<_pIaBoyV6rfr_D|X;YTb6-(|y4eG*oj%QAab`r7>J;NsMI# zb4BAw%=tV~*;hWE!k+05+L~(Kq)<=Rz5f7zv(Pa#_F71-bUy=47m0!K@ffl>6&W!g zVe6@#Hrq5kRKC>Ib#I_{owv0poYqi1OVq(MuPT>@3Pq)80~g0GSS#DP)3tBezhdug z!L+M49rtii*zb`%vQSMe9Ojyu73bkYnA$>|K?T-A6yy_~1dY*Y%bUCseyZ8mmY-Cv z+r>vtXeuMI**CR<-foq%)zHmywzQEnvnsR6360=k6oWmo<2}0o2Aeko5RH#ZWVBcz zy;~~k8RwQ*2y=aLpw3P8yNI-uyfzi?ikt(T_TqS?{itwmZRv{cBo zF4c6zvhaAsel}PRW_FY>EDk_wFHd(5Sl-!owb`St-rIh@K^0cwuG}kWwTB}FtHmWu zl1ZF#RBl5afahF^JR$O2jXuA=R)ITx*Of13{h#(-X8OHcY};C<4V`kJT34Yl@rt6Q zUo0YyqChds^2kmI3vuq*(T&^oQd>cfe)Ok*OL*N@$~2^dZpksDj-?}G{4ntZW^59p z$l&04fEuf5_vK}WeQiowy^Xjo6Id!L9__eesJK(8rU-b$;>rI2l`!r@yjj5jE|vDj zS*$y^es0U%+QGQ)^q&gUbT_+*hMr4wEJ!slnPD(RFwQwYoxhifI_X0WvrIaKk|`zb zic%wK3ftP-!M9}{M$OsuU)igTHBwSs?3I@(p5bMTAz4Zp`K-JI>(H-!O1a#t~|pkKqkoPeea?)8!npdxH{Rm z8Y(&9AAQ_T0b~V4UOhBG&dM8zPY`20$-vg@cT5GglKr_h{`a}uRg$K?)}kP^cMEwO z-bktCr~%t21cx{S2fvi#Z-`G5-ROODpU)`0ov$MK2?oixHwEiwQtVEk*fxQd2q&cb zvf*=Uja?K_q2OSMxp)hOI8?x2#7HEa1&)WMHP=f|MmDWA;;Q#JjI5RmywoFaE&+B) z(l$wkIW)Y%UoRl}@1{Cxj+^d_ta9z``&+edl#+;PYi~Ppk|--_q94YVoc36|da{Dg zzz*b`+B>QroO>yme+dPy>#6oJ2cHDJXbnu%9?6MlyM`$O0`IV_d=cfXCu_!*4kTparOF} zuX{S8?F|T-qrYuC<+4_qiZ@RNYIU6hr9v{ZGO+*=%OGioWppER**b??bg9|ajj6Y( zsw(QByVqN$mFa0w@{0^CktvjC3iEjYJ+cP3J5i>E<*x&Ujg6L8?go~d7W{_ax@)BB z*HJ0HD#EO?G*oSAuZ+vU{7_zF1gYW~qhb_*tO3TX{e@XWx$YOO+qb%nH&AU9IjOnX z%{9I$VTx174^bdgXxQPMT*gCkWjW5G9*1ph$J7grZqeDa_jGk?K{J!-6GkSj)YxqQ(5D?(WSuL@AXu^0figGLqjDkF?LY= zq)=hy?Z|#DV0@ZM?6H|YzsYH9r)>i33gEtO{l&Q{=;E|f$k!`m2x7J!%SUUL4oi;& zD#0mp*+Th>aUk;7K3y*#Xr7#H%8lc)tk=3JVX2T@tQGr`nzbI9Ms$?kQ$0TzlUjG2x z+lBW9ZT_O>EOg*44OfQI6{&eY&5^|eCmfQjj_L=oIoDHlhUc~{dpgZeYO&hyqV;l~ zn)`T;k{WBZB1YL9si0KxBQk|7!OGwagZQ<~S6ceJCgHo;^IouCWqBhtlS|_d93Z7OlZ(z1AfqtHKe`vrAJ=I>-o6%P0|y07+0tBh%YXTe)i5+YPT} z)NQ)W$kcJ$qiPE3d1a@7E+jI#@d3_Qaq};$95yr}hop6PIcvx1yQ>9FCGF;G9 zNX!(8QUf9>!N@Djb{^zwu>`Q}Ad3BdYYdS}9u420H~lhs({D1 z7{-yO=)DyM!D--FYCJ_{r0~TsX$b5YK&&#c$T=N|!NxUaZH}04*lnhVd?Qs^;FIF* zbtzXQ^HWub`Tqb8p+gh|4kctPJ%ctetda=o<2nBT3HzVJ#i2K?k-RUI_IdWU%dJ&q zl9p?Yx~`g7DxZ<$OL^KNq>xrdObh|UcG9g5{oHmLY3$O`Lvp0KK+7bxw^^iUm@~$I zfbKv!TzPp9t~B*%zteRB(`>&~qEf{2wYFL=e+5rXP?F|05*Y)utOD~R)H4&0O(pdX z$-FM`)K6bRzkm3_>gp)MK|LI5TM;@-AXbme2$2|;&vWUk(!3Y#dr-+4E!@LJD^zc5 z%(j`5+qf!h)7cBs)v7d-#UyLlK`?+wAOa6z>z|&BTK9Z+_~|zEJA#Rxf}ih8jYRh6 zbaWg+NS2_PnDHki41ehQcU6Y64Wqkl*Gr{cuBw*vPG~L=5-Joj_6%?xIS$^r`h%^| zU+*y8E3ITfL-3*G5>eZuB3Rq-;+z2h`5Xjam?vFrR16K=*6_K|%Kh6(R&7KTlvld> zX{Sq_1q5+J9CpfvioF$AlGUJ-IEqTQ%XR9jK(Z$|9zk zUlavk*(uB~H8^fQPD22Jp>#KEm3@sb6jmElB9eat?^?=4f>dys%A%q~Qm0b8A+(P*L1@;y1=0#qLT!3zER5J=Y;x$Pqr>bhWVZ#J>8JIzxu=wlPr%U05ghw%ph(MFsck~pkjlHG|`)qlEe`^Jj(ai-hW7;@7|9F)-p zB#vGAL>quy`YA#AXHM@_wp-kkR1?cJThyNm!$@V~7CaPojYtoHf)^!wp6Anb7UtW# ze!jlzeyw^bYH8MaB&Kz!`^1&zFw-9(9++1>`*BmJ!!e8)?{YPPvb!l7o1T(ym?x-o}o@=Yr*}g4&S{jO< z0YVCbiON3@ih0K*Bn*WfZB-S$dwMQ(FS0FB+N#HhlTt?JV;LAeeqbp*@WqesCM{u zDH~OZBE~xjIT;kF$W|;=6NA`ly}VQJiLdh1ZYo%*>8cSa;-{#dIOC2b7+9kR9h84` zXE{E()v3~Lg+sEg^!wWTEj+Y-8_8~@s-_73BdJ(`mO>FhV~|fCSnPek>L6%t_YA2V z?iR+St;5h==hO1iC**WGG7ui-N^ zo)l(Pn1F=&kBWewC?5H4-SM_*YTDOJbiCdhc}Vd|RA^Or+pq>{VW=`jW5!pWA}1vG zBT8nzS6pvs!f4X8oxswO(|v;$-rIK?+ZRvT6uytUq)M9Fdy`aBJ7LGgmVl7s0N~Gn zNE) zXisdcqmeDt(_Ct$dRpF1#fg$84&alLUAT|sPyiZwqP|%ydxrII>O4?a?YliUg-$J% zFHLjx=hbDBE-cJ**+WV_D@Uq1>#$6ruS^QPNEBKJzbtiV7J49Lm!J*m8uBGuO;vJj)V2D z?Mb_A+iPoWy`6i9sS{UIc-IK;_SUP463h%xno-6g;fcX1{J8Cn6gnvjsJ4Oi{{U%H zO2&DCwQ$|8+osW1Nxr}3YiHbT&{MlrO)VY1hN?!vJh?`t7%<|b_w~pJ(^KrdKT;jBwUgJD1A9#dI7^0O`rCF-21AEN_!=jY+R-j zRkVps6*I{b9FZ&$0?a$%Rg*aF-&d#E(`@WLy}w&-?wZrNt~a-uhI=i#8mK7gXYk9j zOu1|@`V*ghYTW%3>UQ|)t@CG{&vx9EH@^zvqT_N7+j-+*BTF1@G?K9_ zS#pHrXF1MwBE7oTNnp5GQsZ}8C@PJ%(L=M9saldjmU&vFGfD!E*pWDv{dB=_uIiON zf}Y84-RW@M6tL4%wZiD~)K5(skYC1`VpOPr3P`f{LzTdrA-Y1f->rQ?WR8psUL@kGuarChA~bL za2Ow565rb~w`Sh8ZN1~QD({i~;}t~p)dD!gi7ds0QMAt^qU5ilWaG09VS2glTdw4x zxj7 z;~GML&xoOUX6D2nG?NY^CxU^jQaRE(#wi#BmnnB$-MQ@-8j3m=wOQ;`fJHzo)CR20 zImAuQc-ZlE!j^KV!GF8l>YJ^&L>{jFx^H(4&MtK|F}hl)Wx4ZZBZ@)d*6~))aLAYk zAdov7YV%W1v#s^F9gDavv=o$bM5|3nZ)=5RM7*-*a%A%oKaeqD+=XM?OWO^v`=_XO z-NSLS^%Bi$qMfCvp1QW_Q5|a%2ZFTWq!6#TB*p;jP!7P_3kLK+HKM@miR}%aZQAJl zO}A~Ty9I2PrK*OmsUu3d+3FYyndXX+EPSE|iSZK)*zz6DnRaI2vfM50HB^@CRknt_ zRo!Z)qmC$JAitTNe}+4*TP3mxAdXtoalUmMbIol_j@7#D2`zUwnx3}3sm%*WuPA7M z6^e!#W06qhFiFM<9i>Na**n*2-8R)7B~>(6tB-+KwqTS;EK~T{C1#AX2z*Xlixb2s z0aP66FPcK^V?EMKjbMMpwno`I$}4qE($#UJc&emGE!LXIWRgf&fF+U%9g4>&0FlR$ z2ft!TL*I6dw_;14(W%@OG{UMGXnrek!4=2ES!U#rGx?Z7;t`BQ4nQ2R06Xjn7fd&$ z$806u$7Yh>RO0PWD(a+>0EN{w`<~;q_Y>YP zn{L-(x9!Uk*Vok3SDECfjsjQ25EBzLc>zRa1aXf3qzzY=9qZHW`FXY6FZK01iaPbI zkcnuX8d|v$IXo3f<$^-~5)hoCC>4n#IXbL*dvvUxrmuc=7p2wq>;3snC9b&9MO9N% z#D5kkE$UIHNjY&cU^j7+-Su*9?V`3@)g9ks-z7_|i8MDDZk9H#j#DHheikZ|G(-qg zpCnjS&u>iYSkT3%1ia*Z5jI`mY#38E=Sg}iV4madZ-zzMo6eT1_v6bwFWv!XiKCaANgWwkJSi#Al~-O! z$Pki?%O-Zk>E`mX!)voxtuWiCq_#b_qA0fHR1;J$id@KKH4Pj|hw}Dd-T5Q>3DeQ; zzM0)9toGqB%-Pa2Ex|7n@ZL4X8>ndyN%(o8$DGwOdnbCo2mpMcc zy5}VJ0FqTY=hQ9TxZ~Pe8rw%t3`_A8R@!@N$xmXFjt|FGJe*~f)6Xd4SQP*j10q$Y zsC#2`*nZ*ZuF0#Hb6XW-HxG@bo|e~1G9GhB5(J0h6;p#W%w2QHvFvn0$+)jJ3%wT9 z+n3s!t)o*gp{kPYW~RTw^^T1xGR`X2T6OTUFKXP$aL|x=8O-8tPYZCO+@SX z(%E#}a`gwKJGW(QJIr^T$+q`QHIvg@<99<(G#IOOMLe1nkpaLiG628?VxH&~3{f6U8!Ra_QFwR-*`x5)Tk&@UYVExAAEyf~e(BoKMkJ!9 zdz^pSYTBB5>MFF18GJffCjS5^4W2<>Naa94V8D%F>$rMz_f#A6b<^AEg8k=9Q+c{Y z92Ltj3_M6`cvZXl@`oAn;5qCxqpEK0&~OhPh(js0CnvhDf8?ikZ|#@1uiI|2%e*(9 z+GL6Vw_#Oqr=g8_nUKmIe8aL$mgBX$7txDO z-|MXQYy0lWB$}q*Ukt94)Zin?)TRiD5+2A3vM3<(KH68Ju=NXe^%B*3=}yR~y!8Hh zxUUh{?KmFTAc=p5ki7ECOZOdFerNZpn`?SPsw!N!oJeYyDBd5 zZ3_nBmZ2b)&2zEEDW1N9X+SapBr^^OTQTtp84sJd$(ZjQKBelHQSBDmO1M7lrHYR4 z6qe?Wd1@q(EHivhE?{~R!H|x``kg9C)N5wTyVX$c^Dy1C6y;{VM@q?TiF_g=Stw(Y zP%EO0AjLZv@Ix^goqM$1cXiFTl?BzLroY+f8h9!y)p0liGf;v;=tu*RFXdB?F*!LN za$o7V-#wO?r82sR!dUBO?elw$1kEHDp4GTv5kEcD#ILv{o@@bp_#$U~!)Q9G<5g zaiFTC__)3tDG^h^(}zHkmyG#Ww*sSxI-j?84X2>{8u_?34%~v1b;EFihLAH%wC=Ox z#4}Q(7GxlhVU^uM0|OWVw|Z`9=yyb;r`5C_JlrVA)zOm82m(!Pekvd zolxC-FKKQmY?b@M_j;1m8%Fc(=xOZoRMdqTd029Qr*Nbd3TFp*k@>Q?dp>xkB!EY<+rYpMYifHuDhP~ zNnt{0VT!)0o@r&4esAI=5yE^V3P|ytust$PPLp>h+Nze4%-dF*s8m!`h=vM!>rU6B zmaSpzRRp;O8CyNn_wGT#13`L+)BdJy-Jx#YbkvrQzZN=)cMS|ym{n+0FldZV3|VAl zah#LiKAxJYE_St_Z&Geu&1z_CswQzQvMVpbW*#{e0#O?FB;y(Hr$eWM-@VCmO!p0~ z6s<0meW4PMsWcag?y_}Tb5+&N9Xv5SGC>C{;A4e)j{g8y+ti$AU4yc^t9{XfBBU9MGyPf1jJb z>PEjpHn#rTl=pi5m9{qhcIm5H$tvy?HrQf`ZR#5VxJ!#|bfmCi;71Ir!qy5jxMChN3X z)NH6X#m+jK*NN$GV&NQiw8t)DnfxwFpya&L@jbk!*Ih4a>4!#oqi(rfqv+MDoY7aw zEk*jp4Fpp`^Npln1d<$){4{kR-p;B{uWkA_+ElwgWnSy-+gig_G`DIiOo=rjqbLC< z9FZy|AQH~`0Gt3d%7#rlTnKHG@LG&7HXDUXUHZ$otrW0XZkHWZT<4{_3Kt z@hf3_WE`?_nHqC86FKe0RY=EU?|8w~j+J$8NcPpAWULi+6co1=`@%{n>D~_EWXX6GAJ zUs!fV_@18MUDG|`a;)2Sb&A<~YKbPKxx>lX;{oH3gN5WrFo@t`PaS1R(XF{+>7}CA zwqmQNy>25d^0JF`HDzre6v)SnZy80FR|l9(oQ(SV>!<5>XHBd&N$aaRS-5u%roNI2 zT6lxe)Klgz@edKIyi9|V3ou{bRbA_>(_0{WXHNQcQDC}8vs zPEq8XM5TR4uDOxwrVR~n0AK8;G2!PR+UDJZ)vcG)9rsbPdXaRV*CSO(zjtlgY2t^+ zZ~{v6O;dpie&e>Uu91UhNs1bT9jsP zY*|?toQx7R&sScW{g*aY-K^_BTek-K>J9o@mJe&CjN4+UtYTPrl@0`wuP?SVrQ6jaN{cO)rW!cvZP6Y|?>$1a^&xNrW?XuZxz}!3S*VAp z7JeuE1)42Gn<-?29hXS#PM}%tTWT8(wJ7%m;=xkZ>*cnhscG6+%9VPEqN>3PnZQt_ zK1c^Ay?xhCiUF}J?)xUmX0+c#u*@hWs;IWdTR{?)@B=welVIedz6JmRhkY*9Zav|; zZA)3XcHNG?y6$QxwN&1!Yw0{XMPY`CKoUy5{{S3o=l96YEEL)M<9F;jn@tw#wbxsq zq7-#vu9~4>sFa~)@FOkH#0LtjjHQN4e6{A~eydM29}&gmE`-buZH2+xH)mQe7n|nJ zyV!o_+YC4vC ztqH*MNg9q~oxmL3Rzv{hijkdOJw{k8eGu9^JF0yzzoK938{#6Ng(_;Lh7a>nNhfA- zNgyjo4m;LN)ZM=Gv#!#TWW&^4_vI7@l>>&1#G*NBW`+2H#D)hs z>^qK-+dKY?sk<(hY)yEY`DCs5Q!H&AR0Zo((mED(4D6)ml19o0sK%+CyIpeH)@iox z`|4iRu~AY)(pszHy3}2#rKx#US~h9v+Lgvw@(4L6;vSk$-IG^s9oup{o9!pmdYZUn zjBuc+l0=d|%)BO&ZZbmNpm4{i;ynOrydj$JHPIdI0M&Hqj{O%;?p~kR_onu>-nWj- zzin%^M00J4?l*e)kHpdx;yiB!aZVX?!bVjrP683%Ro?0QA1s@a*J|kpNvJ*wqG0jv z>F#wEF{;M?NZ-Y)jI4+N1rid?fq|;>545%CXxxtBHa*c-WUe&O*M0FE2~6>?5#&{+ z2muS+0DBXztlFJmuvss37D^je-&Q@_{zZAS)>pJk6s?Dk;o&GFRWUmyM*R2&jN|$x?lX%=A*w;Q3g5hK}E@-EV2tF)C3&2|o{6X392+8fPXuQ$& zcV#tZ>7?AUZk@j)d>wOE%Q;&A013SA(A0&IfRKhR&H;YAfh$mAgLIxhS`7 z){-ihv0QJ>9FWuT3|K63Bw$FZpW`YLr@tb5+na-OS@yM>+Lo=e(V98#6&^LpRj*cw z70($BJse@$N%;~B7}NrL1M9AIvNK9c8r&_75;=oBu4Vf&^@eSY)Qz%kT^+8r+HN-r zt94!8ip>=rEmV9+Xq)(KW#B@e^O+v`_8-;#<7e5gCsAy*b8V}fcWRBlQ9$3k3(Yaotsa&HZ{t{S8B1`?eIxYak|?tHreBXbc_Ut6%&*SiWCL}uOpH;j>R!} zyZxw08bd(O#RRYxL|EZ>!sSklb=z+4s=9icE#~=lrb=|AxNPg4R1aB917uBUcH{92 z$o7Sk!~?RQKy6K-6$esxjYr=WORdXtZ7R69)7C~U(@Shu1q9U94;ni62*fHC>_~7p z>X6^RWp1YKJM6pC|XexHAA_T{SI zSdy&QnpkFn5{jfW(z>)`k;5@bqi;9heCyhc!MoCqSZAlYNliT~Tb|>#1U1xY;t)gB zP&z|VPT=}^)p++)j@snM;TnKR6i2~q_PFrV&(Sq?Po;J{WjuE}TdZ~(S~^Ls*Nc>} zxUP{ALZw)hl4**b`QlT%Od zZ6*hB%n2m+(p@K1x~aFU7aLbgx}#y{WQ)Z9)zk$QP{er3z&wux4Uz#^{5BnlYDjG)zk|6{FY{jp(q_w!)2NKFl2+o9-dG;Y0Wo1?!MJe(+g~LR95P! zD2=A^C0=4qDho`r@iF;^RArTLF@-uqsoA^SY`U8s)$2o0T`8_>Ew-a*UPDY4BIa+1 zikO~x%Mq4mEIr4fG`=KS{{ZR@t@Y1zQZ=p>S^ZX4jitITJ7xB7_FnyKwMNoQLp9Rn zM|6Unkl{QOhTSZT#E!?vPJOiRy!w08dxpn~{bJkJVO%SrpqSBE?k0M=IU~WEsu*I5 zNTgmQGZbaO9$fk(T>8~hMQ5hm)ZI(0-B)TDc-*JGT%@M>mW+@W;NoapJ`ZU|N0+~S zeXu^$Tf?X~x?07T0ew;+5! z+DqgSV2S{#KvuuCWm5FXcFcC2tGl;%#M51Fv}tL$Ra%F`(^JQfiUO=gs~LXEQQ9dE zJ2|FWSJAl0Sxt3Js!1oa#11j&qt{MvhB_ciO?{Gvtb2r7nQYr#Qt0Tli76_?FZJ~*Bzz{PV3owr)cfVoQ^1N zl-#DO0Amo$vPiMX#~D)u%7^m=X|}TUMZP18V|8n8SI>TxXH*r%|oRY@9n z)7vX2gxSj}_0ak*kM8ZiOH*guRn{%ZXTCq(b%IM{$28D(Rj86GUlJ26OjP*H!H1z{ z?}xiz9-Iff41LF_Np_vi1PlKFN|D*r_5Dt%O{;6_l?~$WaUvUCZB1iZ>)rwQp*wo~GwHSo}4K%#k9<0+8=#?L8{CSuLA0c&!!Ig{Jt){_AIwxtQ?ENXk_JCk7^U1b5GT=zYs}^?Roja~qEB zx6-wBIH#zzUW7Dg5s#I;Duo^-K;(fM@WDQ#Rqb&2fVhqi?*0gw8=wHYl^=3-4{z8k z=}mv>gICxo=;gNCq^`NjwA`cO!^J5eh4SBuC0vp_G0}V7*Jy36)zeMkRcWMZDJaF| zlEY?_J7)<4crK=S3+6T$WjFwi-kMgjZ*Hycqd~RzM?yMzx%Q2gs%qD|0r1oiESM5I z*V9TNQP>_ld1Q86>Am{J_Ica;GK$4R)6eb9TVCfs-OpKankp(&C|6?yYrxb*ACMgQ zas$^z{H?LWU5+{Ziy^YLASrN z8+L}n9y|(Nu^pa{iCZMR^I~Y9x&CPpkMu9QBW2Xs>#D}hqNu#xFBIbBw`pLWuErNQ z=Sc-RO0VCM%${6=c#LSYo*s0hk;kejCuFSvbLhEOr}l=5I?ktWj;l4I-AOkZiW@z^ zi>-43*%mdxjSr_b?dyPa*LLf7S2xA3qTgWI5wB0x)uN}WqTvuAc4@1*#$HV4xs%lP z16O5(?9I+MPT5HOE7A z>6MP-4c6s*f#$Z|?RC-5UmK^PilziSQ38fNkxozI(`NA|z&xP*=_#5r{{VdcONw^g zPRpvSTisU4xLaVhP7O=bS5wqew7k10j;vx{`11Izk@WAY;;VUH;FjlGw)Y0i+y4L= z081tISGHNErHH8K2ZbDn5udm+$KnzG7Cd%35A00^lCyMH)UCW!i=>xpWYp$W3d@(Q zsEIh7j@WMh0Nw+(xUYHb?V<4kWV2o-t&@@+t$%Vxod!eC}FizRI9P|3>8f9kNt?N+rD+nn{#CD3;yP(vf3qr)m1#4 zVv^@y9U8(tjFP_|Kb{7^Nq)}zK35-0Hs#GL!#;3Ps z!R_jEu4KAhQ{A}czcsPCh=AJDN~zvG7p0`?Q(A7@nu@ODQB~o}X>W9a5lX5wlPPHB zb|5cgL;w@q>EB@4X}UGKZq=Kgu6Bql8)}WK;jvIHU2G<>WJAg*)z~07CB__+-vd!P zvu@p;Ti%sX^t$Iydbig}6v6Cw+AoNbS8~rR@FO{3g@yvI08I8evUZKPXUwGEz__Y&OF-DOA$WTZY^C%0;+OLj}63nkd{RBc>k{6eouOJjIw3oG*PMUlN_x zB8-#q?5t^kIduiMY})#3vn8*odwsfKzYQGlQ&t)}h`aYhm^#TLF~A`ZxmEK3rzJmp z^#`N7acZjm&U;$x72?0c0OXAyJY+3gx~!f*p>@zcib^gJectdN0xCKWDF~6( z2*H|Q&4S4gR0a6HPIPV`vgW}4)>yASLh8@nTTgCMrJBlQRiYD5AAa%{iMT9;{sko9 z4rjia?wuj&^;Q1gwbE#QI*zcCXlD2a+Q+!e{0-c&R!EQL>NEj`;wywjkxKB@0IJV8U zoHa?LsYIxbaDY2WNYY5LyA$O?%yaU=)}6n!c3tiY8y?r$bZu*>t7osM+*L0*GZhYM zC6p>JqLYLSi}K0W80sOgLqPQlpvE{4@_=oPzkb{uM(NzQyYBA0?YN|OppqS_OxD_= z#PjiIrm1!0a55P(r_}qLx2IC0ps#JMxi)_2qqWzXe}Xc6MKwReMoCnVLduu`=Ptlt z5xoj49AqT zOk$2MDt&nj5!@X%!L%+m8t7uS?YkxJR;7lXvZ6jTvnUebkgO85F#&)iGBG~+_vSlY zqkh-ME7#WjJ_)hMJB>dyhwg5o@1B}&eYU#-{{UUOt@o-qO4_WJ2u(Fz86U!yDIk}^ zZX=o%RwXzPNY12h3ogan)YcxeZhL+7R+83wntIZ-6w&ijB25#SAZJ*~V2T!S8A$VX z)N8juth?5hn%i5st~GRV$563bC@QVFe8^jf_;6&BK3VdJ)7Kyq-%fo#>7L-X&$zmA z(;H3R#M9H$$6Zl-vzh5CRus>MiB~z2C1fQ`ffYxf!w@ym(a!^$wS%!rmMJdWsa@;3 zI%3^4wAg9tx0d9nqpF^&yK>rX^y~2QXM||byqr)b0pf6E&Ps#dN*m9mJ4WxZUvc!~ zcWQAIp8 zNNa80I1qeUvbWbo0b zPcY5daB@KPJrT>~ZfK@z9-rT+ zXsB0>L7Lr1Llj}b!_7TJe35%#9Flo<#*{o&rQiHkenA6t#Cy)9KILcoOj~yq-rWY? zv0JI3Ri>b?q`yyBLtYuP5LY!a_$=eOGelR{B|*`;z0K7cTkSU5d(EZIEd)lrlAg0P zl~Mv8H>;(m6!MM?RY_n#^bUIy+e?4+(YJvczJ}#bc!-#2p{1_3%GVeIm60Nu6i>lh zu>_3cu+uGd`*T;`Yqs^rrgsZ7_@%AMa+(FEbdYvNG0f8|a03K!0D6Kn8i^i8{h^|k zmSE8&{MSC)Hg)FHcDdYkw^%8tZ1oKzi%m?D(iEu!jC01~7*?REJ(#I({)FV~a&(ie zv~W<|I*V|ssg2+f58-)HCaR3A`vBx01zSMd1>P;y3c47=?t(Qgsdj+eEn`jU3*I6iPc_E)V8(eOa0|x~sVV0IJ&)OLvn;u}+jVt+Z-IuWZw9T8V3= zEiCm?RNSM2Fopame5p?uAUBxK9Y`K#)Jrc;C}1TUR9np)d4wkWrZ@lCFD9^zca<5F}KVR6PCs{u&1MB#!EP%W+#b3*4?d zA9HSMilbQ#J>sej!z3{^bcjMEaFAY4C;?-M(VMXt9rg8}XxqA@Li>i=s`eU`kXD>Y_%OK-H?0Z6r-y_%CYUZqQ1Hgu6sC;0a5#+ld!1eNi$GI$Yr?+=??{eR- zl=mB~EmQH;5_~)k@OY}sO5uVI;YT7@*XDHHUw@X0iS88k8tdc6qB8{vhD13%7u!Fl1i3f8_Ha^6V&8-W4QD>g}CXrMbzD8veMdi)gnUCRNQMFWtKL^d2!;H z13lQY0gr8IwBM~Y6q!4kI2vdiah5r%W{wtPlB~H{RF1>A1M8w=Mj!{_MQ*2owIINHM` z@;$`22=%hdwro_-Phhswq^{lBh*p+Qn;d8Jz}J@;EYxyGHBCG6IcXdZ;m3u^V&BR> zzu~NQ{cTOsUyg=WlAprBjK*SB`JN?158u9~Qc9CbY7#nE5adONEx>z#NFTPI13;#V z2^*b$V`wB)mOa3UQ9)Y;Vn3lWvMYhu;P4>!(EF_h)u)YQg3B#zk?{)^90H^foO&K0 zsLp$kJ@9nK_qZpiskYj!%F@O&GxJ4^IUj`J@+b2HP_0z^mFAon<%vk;gW;6VwlUuy zo-`yT0(m$}6+1Gmu2ULDdts4UPZlT@7Dr+L91}7Y_at^2t~XEFZ{sRH_1%}9$$g8( zd4)YC)#-#e9%fLgztxoeN!8-iu-471zpQ&kS!_GX=>?6&L#z*XsaVE; z9wY7HqIV%dZ2NsRZRa6J2UnD)dabZF{k1MXc}WUVN#ZmuOC+jP`(apQjQX78+gkSJ zX2`zWWu&SU6tl(JIOLPz>R6ua%O8}g`uYQt@1i?~zN2$mYNOc~YgJukItc3}lB|Oe zU=OT7jD_yRZ7vMZGnR11LLfXKf40-sIjiH0~uZwL8?tk5uEa zjZxSJJh=8A{jsHM=JeVd=Dz7}weRi0@Ro|Sg1)_Ek~&^rh(@m&9Mt+8XFnn|xpe41 zNB13lRpP4aTU~dRJhd~luN5?p-Y~B(6h-WOst059(3(sQbx~L3HJ59pO)Yda(Av>s zBc%<^4J5Z|=e_THDoZ4allar9lq!(QkpL9rXB=>IoRipU zjH=sxJ=%AuwsLi%qTzn0qcs(FdRn=^fCd;a;@}MVvR&{yYL@E`(5m0tuAY~s(_QX6 zma3*YiW^a_6GaLq;*sU3fTAhD2Qo0p_t9IpR2bIeu9@HSK|yh{T-H`x9W|{9I?{v8824YE1sTnLoAeWO(Nk&Npab6<^&H< z(DQ|l?8DUijFWFJwr?e^T04?YHNMAEvKbVptvG4J1szb|q%0j^Owq}I@_%DZK%@X=P-)(cb7O*9n{RJyed zQ-sHcDm__w93Kyv98N$w<~_~VtMYGZEt6TgtoM51Q1lW*1skm-atGraEI^d-<(3%B zb{XUCXz%UWy0>>oYBvp!XVh;f=o%KJ?m@bi114Dpk-+R(xqG;8s2~>q@dOi^sBnyZ-=n?VG$^E!Y(Xo?2gqy;Qv? z#x=H>Z<};JT zg*k7Qby9DhpIo-D+7^Pve6~wt*qi?Q6FX9YQw8tECP@-tj2T@Smy2f#GmPc5x6ia$ z35|-)TC9H0od?~N`^M3>cRtVXZPix~hpVTof*9&!jWZ`W=R(YJ$GWlZ0Rtn`^g<~v zo1ww)sw$|WqOGN#oguBFlP!-H z6>=bB+?9<0291w z%)&#A@j^lOI$LdxNhG%&!%taIwne%^X<(;mYyYRunJhWa;p3G+S+z4sd%EJ-LO$Zb#ol{DEI zRaEx#P}0)H7zJCza_T@tZv0f_;A9h_r+?B}#oEJiw$xu1nupIFEizO^3(VPP@*tv2rkyyTaJ5-)pPB7N{V{>hmUNzEhN*d5Db8#oNx?CB>033V>!Xo z{@>|-=GxCoQ*P=lu83S7dJ3op-@;VFzIf0XiD(>>!!bn5+-QE>>V2>KH*=|yzOLbN zHx{6xv(qGI8Dfva#4>r8BrZwDe=O;wZhO6b=G(dB+S64e;M<-GdP3se7h%dc`SI*| z9>9^4+!5Gm^)v=|m zvVUspsc0!J7Q+dWk{79}tPx<9@MTmevAOk)6t)j`)=^MV%X+x&irUHl0LW%pq?uKc zj;3}widS|#8b!by8=tSJ^w!HP_ifdEo>{1-qx-3nwytRw2<4}iF2Xg0c}hv?l?(wV z(?SUc3e8oN4Yo`>n)SA0wAIteUGVPp)HHWq5+yvi@O(uCDwQkPc5LH1FKWMTZM}cG zOLw{7FIVVhlGe7lDd&n22ND4u6GH?6f+rBj((6j#@wSQ3J^BN4aI3F)cUPF$H}V%%kE2n>ypf!KrS z&BuhY8tfF8ez@ZOPfJB?sd;QRr>MMA-l`wNWys?+EmKf(0+ZxO`4iP3)S zX{k0%1(KqMd1qRRia^g)l^6s|8HrV4JaTd8L+PKDSK*@FB6aih@_|(&U2;xp=zRvxYF!hp;36JsHl?X6>UYTI4Ls9S*46Oo(M;9 zMgVV5F~+NTC`5E^E$lw5?rW7a)U_0pRaYY#BvlUpigOBvP*j4vot2mpd1oirR%NGk zTB`RItt#jR8&K1lcAlbThC?TERaKkI{;>p~QKSw1vbI*zx9u8hXAvcA?)5jArjc5v zTyuEig~XteaQSk*p_mPZPp3}dp4k=xT*x{huN(js9N3US-}k8ED4(yU1hT}?R?QqxgY z4oxDdQQ|lyQ`C8I4=iNsWDvb#sFoVI4I?`(CCJ2l6_fE6m^^{N?l_E&_~bOdxB6Xn zvwU5Wmvk_pxbXP+>C{Hi_sAJ_^%x#p56@p+_Lb6_yYA{%sjRM;GQ{R2%(*?4n3X5D zvVsTC8e?RnqaF87H;ZJH_NrK@%#hP~sZ}(!E$}qOSHFiIPDnWUqGf8r~QSHgERn=1{ znlBcrnl^N2P;hwiB$e&mhC6%bQZ~v6rW=mkT_i1C46sKN$smmqLHM0nIX*pzBiGwO zVXm;fva*V<;~TevCt=MwMpOA%Fd|0!aUb#0mA2nlltNn_#=a}0ROVRL2!DwqIm(s{ z5n=>;ml^Z}R@oIgKUHbj>+Tz2lF;^AX(f#$;Zj(Is8;^~IU#8VWMBqyp543SO*Ho# zNrI9}nw77pc*Hc*oO5K)p^b@gpRPtRs!Faaja}*stk#-ai_z1Co8rnI2alb+IM0R& zJ@QHP87EEltNoJO{#9>+qU|)%!xYm-1y785cS6IrB|plf{$84EWd$Yh)>g}>Nj9~` z1#>-j!Npc&k~(ZWaJeUmTm}JGxE`TKeKkk*3!*o{d5v~GO(l}P-7D5q-Kkk{>FhK`4Dyb#n#j%1RSSyTx8K!=knu;MY1f_&PtKtkK$a}70oo2G-|cP`v&jlo9p zt!PLLBCzB9`jS9kP=lEdui;+(k*!;*@gCxyho_gTl{Cc=@~6cV6$C35kHVB-0gQ4X zxnSV;)298eyYDO9c9XL#_F-$NAACu2j6cGZ991J#MnD-zkb0b8{dH7tB&4wI%jN#l zaA;JAH-lV`6L$NtUx&Q?j%}v>Q;CBu->fO;)iwa+G-1)=pv(f_^9T(1DIh(UMfkIkyS^{h#sd`UFU1i*g8_z z?XPvG-S^G2b@2BDwwkCaBDYcZ@YWPYaXPW$UBEnZj4yMbdkrgOjVrLI@5?i->bglS zFw{=Ql1i|(boCObK16rtmTcfK&!`-ZhFL4Gvr;$Sh3l)NmCX{*RhpQUXoTLZR@ICFS60(hwND^CrZfk`JiMU!$sNe_)^{+Im7%f#EGFvbuB58ET4cOa zQ;K*ZjpbS564XcB$qVz!!#^PGrbkeBZ?EJANVWjOsSRj>)z5_2gf-Gt8B@ zsqPROnq^mlHW=Wbav??!5X6uVwuzA)z@8H1m=@4P=eS8jUiSJ1R*Jq)7J9g7=A9Zd z+ky}oRH(=ck_XGan`f$K@vQ-*B$5v*!MSw~ z)pNN|L2;#td_~F^t*|RUTb5N1g>HWM@tmkWr4q$ z2_z#700(j3(?05Jw>}D`7~1PzMyd0mti*A~Sa$LPag6%sN9nKDotabNP)R&=($q&3 zZ8Jvduj*73URWf0A6-GspdcOsY2KS6-Mn^nb(3%k$d>s|&`S`g#IZMW5sI8P4m}Ug zzPOiuba#L3$*V;6+Ka_4wwYss7-Kk=Ey$A)K~S#@#GIk*Msli2IQ&Q4;OTvKmu&;= zi=yD&#|xagPAybx_Y{^DyKRpj<6w?6QB6?=Q0`hI#KxR*c_We!%Nlmw7P~IyhB}KC z&RSNSRL15CJ~dS8e+*N~s)|=2kROmZ!m!oHwKui8=QYCFdFj2J*DUDq(bCQY!Ev5^ zxsr?qKL&efRmQVv&^(EAp`kU=$%vj93(B#vB}+Q0wtb0V-yXUdq%n)DD57Uj(ZF2! zY3LPSPi(8Z>>I|@87m^zc+~-u_=C?P;Eoa=*iIwVjOjMh)wJ8!8<$P)5!bs%TN#S7 zvQs1y25wEpIo2Z-ZOHfWGCjF^9^8Ya+cxoSr=&8}%QbQ(N>w9(s(wizT;u3->8f9- zzxX{M+_hCVoxQ#$b5Z_Ki$4pVV1=58M0}-B*}rTmKAFR| z_MKhMrh8oSOG{eUfEsIRsXTl-h34*uuvK&z81sRHuDG@JTVrlID5+t%(@#+(Dw05v z89@>*OEgKD6cr%n3=gq7{J!0vXKuCaUBa6;aYiJxR!9;Gnp&x3hM?ms7@lMZ#0Ad+ zeYT%>%UpC8>rEw-bkWxd(Tps7QDlKuZgFU`#3dD|x`Y}TrO~hja<(V`5gVS9<)18%Dv-eefRXxayeN@Jo zr*;vds8Hz|47V&``mn}Mm@eCv`L=Jjdf2Yg?kiJA9Xe3M1ZKLHM?dpz1Z?vr2yP{N zeA_*z19d98G#BT-$>_z)Z|_@X#ILEf)z42+k71{6 z;nSOr;@?y>_ASSEy;&xU!lbiQ?U}2np^O~J%U))MAeX&{YGShEi zVYb-q<`0Fcs8d5zR40sy{56d8M+JxRcqj}oao;qDPP!XBHmRnt?kKmlise}<)5(3f zR8y6Mu}X0;NfJdQd67|hW8YkjMxeywYkXk2wMcFLqib1rFTiwbXGeLuct#oR7YpCS zQc2+Uc8V&9)!2jhS>GASj4!#7T+1^|+ zuC3{o;@Y?CqqPa5zV0imwP2P3Ox%h`9Xa=7-{^gGGi=;CQMute8>{y^Iy<$hzDi1J zRt+Ob6>)A>M#=&wUoPmansg9 zvV`KL=_Qqk-~hsQA%Fz?YnS}2>OnCZ{Qm&z((OYTi49-Pb!`1n>7LfRjkjB2sam_7 zWSKtdsl8B?1n_Akh8JmA=O8L7dvhRTMsBy;^);eudRgw*YKZCiQ%zSxQ%Mxe>*R!6 z<$+;}A)e)B4UFd=hnRY6_J`j)a`J80ew=kKw$*WHgb7t(sE%cof9DHCKyX;+ij`b; z(f+$$?cX1A-&>mg`*H3wK@~)=c{F!9qvAYBX=tZKk~72Z zJxI<&fkZAl64TV%?VD)r?c-gs_pM})S1tawe{OGq(rMh0y-_tG8 zX56iMotp9Y;EHR76*vqQmMNq!BSsSnd??sw@Ppr1Zus0ZJud@oUG`q$z1d}>S^n&R zEb%Oa7FF@j8G`;wLgNFsZEb$LQv>O_9*BLG83y7P7WLD4ZvC*7-6iVpMyV(c+qisW zGuk2WX{u0;OC&D}h|0Jjxi7Kv4Cw6#+OEsgsi+R|xZbI&uR94)kQUep6hs~hD4bVmI%`DRE+WVomldTVKX$$o}|eeX8?9RwbYdzP_XUGmg=}{-Twe)oV*@1 zlomP~d8DRh1H`B%4lOou=jId++)4G-QM7EEby4q`~Yr!t`^SUW0w$#&Yt?4fFxIInB;I8Qmf*wlfv55>k z&;WmeTR$W6w4~kF?caBOgSmVizSjD;G_`Ganu05x0Ul!VL|>634o*oq!8keA{qxa1 znNztoMP|gb)T`L3CZf3BXse=#tW!sptmhwemL?pNvV+KA5z8FYuG2~jr)TD#$YhV) zIQb-gt8ZPSTeIx&TPzfHbQ@XeZ8L4Cs$it7iWZZ_s+Jiho!xmVgjGjoA2ID;Za%7S zJF{8rJ4>UxzI$awS);WY`?EtyPXyUjK@ZHnnMG&}}~Q85^j68&&9rRc~&f)!F_gveRElc-mF8^mbjp zd$LqiQg{^P=4b^R2B0S_Hz^SJQT#*cuQoRBzjS+SUbhEU>^tXnN4nMODk|yfE-}!< zR?~-#);TF7YBvp%7^IBH&|^>g->26-*Rv^XbKWg?n)@V)T(#Bo%6&q;NVO$ko8DID*(&?n0^%F@nSZd*j=F^rOB|Z7O;z zuKqXMy@}=(jWqHsK^c6pMJ$RP+#dbA`j4iQx_c$c@YVK>%Ux3}5z?EA@u>bVjwNSh zLQYVy82xps0TagSS>=)YgH^q?@Ape?#<%V&0dJP;*6HhMx6n_geQ3$*A7LRaH645^4;M zA@MzqR7e60XBaxKckbl1Zx{?#&ZF3>C#i}tD+^`HIc2F)f!;_>9sCiAf%DYQCG!ptO%7W zk`xIcQ}jK?GpXlo+i0n6GjBRuiruIZXoHnWQP3$>B_b|VgM*fDUi^JEXHrt!tu&QV zUN`j}b;LvjG_>x`Gs;sf8iKG4CmWOw>$0P(_Kewwj$l+no(C=9y#hBKR^U+ z_(@UU%yEEo<=sg^|G zs-6sjHpoTEA~FVh9BAF6Y9)Pwmi4zOX>Qf`Iwqs5ifI_r#l-efi7AmLQl*5Bf-v5i zXQ00IHl9i}J6d{4F4&@t>7WbE2X$v~{E_|t01i8Pe9cEg)Mt9fx?8teB{vn8c)U`T zY3RXz6&S}L?0Jw&4ENT3MBO8_1*!;LAlzK4YVMt1Ytq|U1w|}3H4L@OJZTXeTPaW( zm$@Uc;=GFt@$aTf7Spd&Pc7c-OCh%NsHLU*t!dtQJ;X*-fU!Q~`SFhWeWf;fq%A{f zukk}HQ&rsr;Ds3+5X@FW$NR$sd+B=TS-B|qUFa>7&_PX99U+lomDPbBMPybl*mpS| zy}Rom*F5<)kI^{kKs&6ZT5gxxcP+YVI3AAKR%%{&;wAw?oW_2A7Py~ z>`j?*wd_sHW87CeII=@iO(ICFk4KZqAIj4#k-m7Id5oUkqqc!nUefKmrdmta$4yZA zl8J=UR7e@W3%P~7JZIFAkDjd?T#I0~9k*GuswnO5{ACkWNL-NF0jGBh#1e2gofO*H zc7Rl7nlkSyOWTrB+PAGc-tAOY`(!b5x6vh1aCr}r11j=E8+Rj?3l_mAOfV(pOT<@- zS}E$@nzbs$4D_;^h>LkhXvsvt?ZhmOxC6JgnG(^p5{@V&wOZj1C=*Q$$~im)W(u-pXpcIGXo&dOKyVl}$|rJuC>%S21q>7K%aOSru0vx-Cz2ve#5wFEUU` zNY@#Se2~Z~>SlIj;A3Ls7;p*51F$2^Jv5yyCjB$qQo5d!p49>PdU{$KX<>pj1c4h! z%z&JKd9qHW^xl$xzhb4a?D@PUXYkU3Rrr~zQCJ1>c@%_XJnTALn@NTeu6d^zhRr+7vH^I}#W{jsC=JO0S6v+h;4Rk1eu ze-znPrVEY2Xaf&4lB^2~08f<|mT%?HW1&>rW)0I%RY|ofZwq?2@{;3!tGEiPXkP_n zRBEXZC_&wlHItC-k*jlU&|bEOODDALO`%CL-Xmp@+m>wnR$H&BJYurj`fE?PHuc?caB5=bbylv~G5em~SoNxVo8Lb=?*6 z3L4Y5U5TKYUumJI9u$Ns@ej`fmU2#^?Akhe%@ww*a8%nxEiW1h3OTMX{!v)i%}qfG z#fTn*7+;oq>vWpPbnL@yB=jV9Nus{k9WCDb_JY&8rRfz-eP!OLGgVzGQjH*{RpO>r zWDv~c00d@~cJH3q)1Le2p4PV6>F#sxO}A&OwNw>0>e?A8X{PP?4OA?#o<7{0h{+)b zp>XQ1{@5KXwnb>&*UE(46cNUh7TXP8W~7YqE0<}4ER1}`--+TtP(5|#*6U5C%eSic z2I<}RQ%}T9C*AcC$pmvgNJyV9B>;LPStH$!u|8c)%@QzUwI{Sj)3(t5i}Xr6B}|vw zMXrh(d+a^ zM^#ZN;Uz_1Fjy7FR4Q@z)nj_=yYHFW{SM~%J46r8-E@w15>ypE)(EGSS~VW5#|Q`V zw`~-?eWf~6LwK?O0B^S{&v3XvOLl#k>PZx_W=EZrsw%f2MpPBJMBBuh_^Ln-sz6!pKsfzFj(TL z+SCxWUD1`eyv3d#2_Aa|PUH|t?~QHK=^o)#f8ioYn$e!><=j`>PTr%MpQzV5J)J#0 zP=HdHDkZ9~i;?5T2&R^{r!DAZWQ#w(iCS+F?NJ4~+hM1pnIxvKiidD~3{o>le28Ph zl$697@g(vxjAsOmFIqM%`*)`4x~n&Rj(csk;A*d1hL)&P%TGnXfRarL#Iv|=#c{|U z-nyo3yPu?%F0w;=zu)f=QQbtZX}LjsYWj7j2tvBZ=+cH@*(e*Da_%&K%@mC#mPqsn zdW2QreAiBIo8{wj-Qlr7Z+m9ZK#@HSH0t!pa&>;{*8?I19nK?Cd3kb1oairhiW|Kx z+RxMR9Sw9UmDL!D8VG`MGSsvvdEkS@$1f)SW%o4x-s?8nqP|+J7Tc}MaLsk1S_vx> z+VfJ|sgtx)S5!z;K1Z{+=0+ry}uDg~N?h`V9fh~JWBPD2?V zj&MDD^Bi6cRV@Sp0vWzHSh3XHBbwh7lvd&QfvTvdmRfn?cJi2MR$0WSxC+m~fgO(im*?!k3XMQZeC8C}1&`jAJdF_ScpecSlsLRrPjj z{k9#qV~U|>+&3Fb8cC(@qDMz{E)_}O7t`0dIM#^Qr#(H7Z*=2h*28z)wCPJxTU6AG z8nkmBeBwf5Ml5rH%-nlrLGPlsHZ!}QPl6WFA+?m#ElmdLxm>qR)h-l!YKE#&VY0E1 zC29ay#`qN;bm!*rxSq$Bduv2BdxK|GL2JG43w5rx@k=dS)s@vn>S2M9l95PT4}r;x zvYx~MbLdXCTgLIAlD7W z`dW+7e{k+gB^vKWiRx+g?b=1> zSt=?kM=_X6u{HtlzlNhFaQduve@`}k&b;o*Q*W>|yI@pLCAPMcjZD+SF#a;Sv!X$k zJ=#7;4UG39!P)-+WuBgFZP!nBptn@bL9?WWwQFw_wJ~9%{{S)IfhYMx2|dE_?~ga8 zvEDnIr*o~tYgXMU_SN5XOk})$;--amBsk!BlgJQ4?^L?gZRzIu+S@uArl^}^Ft=7& ztv2_lnx1DxZx_ZgD@#mQ9;!%TgO1u+s{2;%o1O9=oo#C#=CV@P*7&dY%{Pa3xVsVJ z2U>(^z8U`j2L+KB1KT;qwdwTJNOw7yu2TBlKPgHdXf2o33%>H6>#(X_tL`?KX)hGA z*9l%(6TZ)b#z0_Fu_-oJ@5(FXGZf2Lm&DqnxJQO zx3|SSbPr|S?{;m?v34z0pKDyLmGM?2i*_Pvgb3*+Gu2Zh%%R7e#(LZwYqx; zS2lDN^X{$E+q&0HMy(ZXve{Qx3(m#WqFH3bp^-^YM|A_bXFBGMu~oD$yXX4}_H~}+ z7R{!nSgy42(uwYynZk3E#VmONpFkB7KV0Xwx}&78KG*5}{O@hiX18AV9aGgYD;$bK30=YLN2n|u`|Fze$!_~R-LJO_0Hr`$zrFco-G=dMa~*9(%Q4AssE~#d zco0gw;w}BvY@GRtJ?xIFQ`5!Mi-zdxg&p?UOSP^P&uqF|F0CAsNzV@?@GpxLMn+r` z%f*T8Nbjn?x2WA9>t5QsUT2QFvMX$SU~SViU)*%A7m_Q~FDx;Tf0|Mhk~?5_%cRpd z5i4&vBqu*;acQJp+rRcU-|4N>s68*QsHbBr)KT5t9Jn_Jf;g(chw`x5r7hmv2?o)ujzO@-kJtRYXc3*BDVASduZFS2yjk zxp&suxAkYJdv2WDEl~)p)Rw53p7T%-6pjqEfnh=cF{TuE!Vdbre$Ulg-lpYGxA#4^ zbclzksGca=xvcdq5W3!AEOW4Ir6Uv9g7*LUoT z1$O7%7kX+vze`bOcw&x9ii*0)>V%B5^HlJ_jq(|j1F->s@6{U{?Dw^{zTbzZ7fMSt zCfuns*9%N=)Uw>=u4v0Kb}Wu0?x!k1#B12;I_(Xz&ADmQbG^R*07FSq-^8hwny{OM z1Nc(;%Fk0EjgKKOU{rGMJFsn=^}^A=BI^ZRRpzqZlyV|mRtt2L8Eh(}RVgmg1^{?S zhCmKDeE7#%E6&1AX9)U2A-oDz2T{J)`zFs(x$GNvZCfcSgmTioO0Mu{hyK%Ep+yHs+R2(OtHpdg_yuRC4M+ySyjml zr%hXnW^8u3RM&6o*2J^!JH1@B)~lt)@g*#^GG{9b$Z4XI2!YOVBCsbI?TrNLZ%H;p zHmgqf+C3|&+*Ors&sSAo+%*>(NNa+Cj+0b~!E=&wUBJTjI^Po@dqFKX`?Oo!50r(b zhU0tQ`(lEgvvNsOv*~4)@dZuhh|)?!oQN8l55xmunB_;Q?xZ%IHU(zrp^n!LRmX2u zQc=X08VZ_gyGWDNi5QlWI*Agf#8;AltAxP(SQ@G}{{Tw<(w4oxmrbKjYOqpWE83%T z%YL{;GsagWC1{vsmjfKsfO&z~ch#YC>!(hd*4s0vT{W=KB1IiJmfK4eMWRWtSHxOS zTflJH$%);8{7OO6^^Is7M;{J;$~DCK$WGg;rYn)B-tph%yzS;{)TXdkGA#b}!T>kE})LN}j?)Yw2_KM|OTPcn~4>jOqgM&Ou7!j0Gr1k~7 zX`iKCG`)1gaPA?wrKpc;*Q|0|swfOmq|Y+qSS5x4U88jFL5Wxp7!KJH`h9uWJ4w2k zLsMMmXHrtdV2NsFmbIX)tCx?L#E5bu3V4i>*cH|W&dtD_{#}u8Y4W6vm(y$gF*p6S z(@3wIPX7RNiK;gtz0=J_M8ZtT{1};KmDrqQ1(Ub|#-29)4@0_hzBeU34$-09*P5!P zrl^A7Z&ZfdJU5YmYMP?bFj1B&;|H)-IwM`VELAqGt61GhdzD__l6u}0s*(_23+1xU%1s%ppsiBa_QHR6L;uMWYJ1%TI}_{Q+e$kc>p|0gquP3py|&f5lJ&Lg zRz=|-89A7`)>lIgn6y7`i<4X^e<+uc9k_6^H! zzsGZmnz3bh<+#(VP@iTh9wJA{xsmznqB?oei>AW6?oHuiuY-5Vb*W(X%S7?jP{$Of zFCnIqsk}!6xooM(>^07tKdN0N>i+;#Y3zw}-8R@7?>)*bzGh15NeSfUR)wjOFBlSh z(zO2F`)btPRx9nfHs1H>mA=U>xn`Pbt-*A-OL&@(Jt*_HZmdAFa-q{(cBiwsuZNRS_M5J ztgD!ebC<#jIuI6M!f~f{({4M>lXP4 z!>PNrwu^ah{)p39t+T924Fz@l+uBSFm#3p>-Gg9uSjG;24!LKoeRkVhgL7VO7EO^u z4WX);-k)?wNl@k2%0TdG58Ul0RmQD)|5ac}!lt&Y!B8jdiuT@7wMCWYxTFHLiFAmEz{Fz>g`ll(3BRbonfZ8Mv)wr zl@%pL!SfvC{RWD3BW!J(4e~yqbh7KS?C(NWlIaDqn(0-}A~84lRYL_-K7nJ6*q=;| zPrmghZFDY+9#C~ZGfrZxNm2~wEpR0Bo ztw!_P`*!EK?KcW_j)5qstLm$~JQj{LB_e_-mHm81k-K&SLpDF!Xl!k_L;nCO+YXWU zeb&5C+$|#M{5nc;*i<@)mMVF3$FW6o-zON*Ev*e(bo4@SazG%06T{x<*+%avNY(n6*w3b?Rf|n=!^D^W~Z zD)4c~^9@ovn|4{Yyi~V2y0dhvn{SBdE!Nt~YRHS!MgS&siU`#++^;bsF!bzoYIMr4 zc<+j;iuKyxb07k0>w&hUbdtp)fZhUBGl9z`_xw=^+TgO zu6XR*BdQjghTo@#t~etWIhORXmnX%Mo&Nxd60;seH0-}2ooVQG=WoNhD*8*i_Cjw; zJ4(+TlD<1M*9wYe+x@wEHFWq+(+tdP;D`O+d(zHn-fk5q$ zUpf9=cXXa0@-|4&0s4QHl5IHN9Mk6d+N1Xe*>`i^FOgIw4%f3!T;@1wYi3lMaz}3t zmY0?>?pM(Ij@Z)%-`HD^ZC6lK*57EaRQ77)XWQ26IcmukbW-o*Okplj4sg5)48#MB z=$B7AMZP*|v*)_+9j{kWYTH38>&#a+uBcKQBBBohiZ*E2{wR!%*ky)v&$)VqcH5$c zo1tAEg7Zy#qk77!nk#Wx9;Q-B3oT|@KvRN+SGIk1TAex6w{3?v>G zFfE4hTNSp`cAgsh;FPOYJmJ{Q&CGb5lsrUy8}N)O`f9A3Y;9hxZ(FBC?0eqrK^=yc zrEJ%^UC_a2RqSEwM*j z{k+Q?y)cbel8kZ(Ao}M@@a<|=wr)GN;pz6{vCve~Ray*_(91_pMzXkM@Rg)8h=~D7 zick-!L9Tx0=tfQd0EFW0{BXI;sb6G``@T1^-hC0jyKXq*hG?wSQ$4<~gi)%;Eg_tT z;=ytiv4Pk#X^(90?z7td^0f7qo|-MsYNlI!*86)T)iWICHLakAnt01+BuIE?)P~dE z?c6(Jt88t}rCkQ#-#e<^O(h*QEiAQ=)TJx-T4HIk<|H6EX$zcZzkNsDwrdX4-L*TH za>KZ{5V$~-+bs6jRL%>AUA_-@^2vOTsp5LYEZ&)j#ztrxzZC2_Fe}_Ug)#XKc z6>s3uc$GthhDQX2$~no-dui{Dg^lSpzbhZV%|=bV$9u2rtj(prsqYr2+gq=vR?AG6 zN-q|pZCchU%Ux`EV)B?l9}75P;xeN`z+mzuYtE8fwhr03HrUx_hRtuGE`IHu7HMef zq{&GP;&~*N2^e=q0D`N@PN?Z1A>YuvXh_Rik6+RJ@>OC4=Di6FR8$fSie64cSVn1NFRkJ ztq!b*0Pb^Hpsc-x!O^CgEz{LWYA$sy26)maD5Z8(lVj_UdlH=#91MQX4&*4(Q@XKkx);o6&ZOs_SuEG=iDsD?Eq zluVApnU_^4w6D)E73Cv{x`DkwC zxLmh&`r&e@*xPciZ5oqLS6gs`OLVZ6IB8P6GMV#?j}hhd#~f>>_Z^l!k7b^#XzsnK zEt+_|D$9k^?_YU(QMF8jA$c`t_*TTIi@BOgX+ z=8~o~`jz}YEmn)gpCp9J-J_3RsO(giN=tUfl@EAO^e?Ek`%d4W>ILvyu2(qHiif8z1vwh#rluv|2bdKnG^8A2pUu zOt2fJdG+^o?i%`yqq25g-swYpt+V_^+TCllKo%)vV$B(V<>HY68Ik1+?ik}pHr|@_ zy2l-=hp3zS5&zS*|o zhvA~MO-=F2@Mj@qo}-k~9>dMdW7`^qvAX{NL$x;>?z?W*lW*Uq5-VIRlEmwV#zBIz zIr2MtB$57OTI112r;lV@{T5g29V6|-3#z)~(>hzm&Z64;S9I4t!i0-0Qq=ZKNty04*))_5v5HS(6v)O#hbaqas}nvQ~&j8~L~H-;5PNL6Cwj8AqT zo?qS=)qA$OyVc#v1h2GrFWyvl>hUF9S4%osqJpa&QhyQUYD4nCm00|Tu9}j~)*Gz_ zO@pYmt3}jU<1r*Omp*mz$i%mqOraED^1)`#e3{oR(Q2CSIRtugwzf!|H#91fa$L8^ zR>D~9`(k=6xonO~ntKI?iwP1gGb={D0Et3y*pj()B=%0 z(#JzThGad~MZ|@X$qq6xkWPJcn^|?Mud%VL)E(=wYI?D;A={VA3oT;(`Ds$nOGy;OmO_xqkKuwlj>Y>Nk&qLrexq|9!&H0l zeg#`w7;Av;hwO`YUG`;twYPoBi*P)`RH}yUWT(8O6xi-sspFC3C%}9ue%xQTwg3QWBXadhn$>bJ+vsa7)Kt;@1u|NM zX4y4NtN3a>DbR<>Kj$QJ2d*)V0qXecw$9vCn}2`Z?%Qs$sbPweJ8cS><%QFfejQ9Q zFqb3PJ7c&2X^^u~s5_?M{`(>FLOiD`<=nkT=rxO|SG~=)cLhzB?N=GM&rx=Yxu|O5 zC<75y1d=N;^#1@h6dfyVj*v;Y#Vv16=cNx{~kI?US-PWlgy) zmWy@Lo+$qS_!!x?D83?wk-+jzSjaz%C%>D@2sp{_uFM)}7zbF=#_ddwvlz8H*m^n9 zU6mz**LmwH?-tu_PT<)4gQkmX zWi&LlE8OSd;v*rYh0MhcFirw`_a5h(u0Lphv}WbqP+x9)rfQ1xs54Q+QE!4+Y2P`- zXz`U$qxBfp%I>uF4|r5XUA{KelKUx`yj67uq6aPxOCX9+jDINDeKfsy{{V492W5FT9lBQ8E2;KX`uDXX6}vxo*sm1zaALjcDUe*&B7C6E;x+>VC(Yrvy8DyWy&c%w z`bv8(>fLp&g5O0g#%jtF1uI(RB(a)a0#*TzaE!cP)Bp~Kbc5|Duy+pMx8FL8(^s_B zQ2_wBe0vzDjua}2f=JRhoSxj2i7-1HchrpzQ%v`bcejwmvvDcNKNvM3g+V3-d>$u5bYjQA9J?r*Gr0NaQsN8QBt8COXkw3*z z+oY0u%4`D@$;d?zlNnM`hH>en3jYAICrh?Xx}SP(ZP#_XP)#dGZ?)U)uLSjy4)~So zSz|>W{29k@T{Pc5(zX@awYz4=)SErR>oJ82)Y{>W*c1cI!t=Cp#7<6oI6iZ(gwroyc>40 z?O*%vR$A(MSbQ&thK^6Xd7r~8whD6YP7x4#ckPqVTi>F)p8a&VSMEKtVX56!YJNVl z({iY)YKl;ymKN}5{t+0%VirIE?Wf+BYyz8Es5ZAm>bb=Xb(E9brjNp{cI^CQxJ7`e z>{3N19)sPp>Z;=aAa)%(+IUV$?;Mb@pSw`6(Ysu4&d zj3~|KXAx!^X#{ceZ$MSPjqj;ezOVG3;3+Sa7m75YvPm<}cr`SVjwCEAOHUw2kIjzg ze?MI~^!sIW(zkEWPqa1_=EZKk#MjNn)7=(oe}GbaDQ2gTI*wR43Z$qb7}m`Wu#)Md zhO6KfdGwY88vLJ%v$L2#Cu3Q~t7fWtO^q>@i_u9@jy zRQI0k*)u$JM_KhWmN2|HPe2hHAvm|NGIyR}5m5V8io+Br?@1u=k=+@b@-1?Pn z>Bi@|!C6n^Q9xy=p4^jiAz7&yAYi!8OZb0G>6@gL_uIEZua~MMxleSy?g*;rX=*H@ zf(nXQ6NKp+^Oq}!AeO@Rz|d-Su}IDAXVp3_G_abH)~QM@xwN<5*W0&Wx_1@6&1q_? zTe8VpMNdgrI|9(u$H_R1oFjQT`~7uc^opydl+`sh-I4;_Y>`O|*KRt;o{Uj3%#Bgu z$UHJ|LPd-a198r^-}YwV-PN@A-Ni|5r?pr`MZkUIYI-SVP(f&^=Sk!;C9?)>f9(S-7kFwyL2riN zG?g{)#DN^M(!!_0@A!EEk?V~y+@R>~?yk$RWP-;t(Y*B^bj3+qAi7i##j0IQtIAc& zFPcn`VgSavCsDgj-SP3p5<@o1;>To#L~Wn6C1*vD^k@#L#z)_>*Ev*0}e9* zp4mQ{vi7%9`e#pDA4TMzDw^7q6!f%|_L_0hBB0Z$QQ}k0h-HPK96$(OJT^!^m>;z4{XM_#$*A_74aS11;}X=_h1NP-tu)0~ z%Nk1`ky!Uo(n`esc+_budtSc7bEE1y-cnmM%wVYYlR=kzV1Uyx!{VG1hW!YMp}shv>*Y zq-#}w+Cq}yx+r&VQMNAc+cHyzN_(xSMRVItDR0Fzf}JJCJ96as7{+~cx4WsjGu8c> zXSc6M_Wg<-wK=sl=BD*i96ks>PYz(I{4m6W$OQ+mI<5ZzISbd@8K(SaBN+daTK>PXlINE!7N_gVJNX!?9tM&Iw9Hoa^pY_r;~+ltwI zubTN$QMKf#hvMXgGLc0h1>k^k2gL4k+qoF2?wv;+QnXSeT|3)0E|b|ROjg?^WOb0$ zHAi91$g4=|CI=+Qz><3qPPJQi{T;Wb_0~(BEwTFyq=R!_Iaxo&8C^6+zl6$cA(cY$Y z!>M~;Z(MCVbEZ4Y)$Uqlps2bfWmRKP8CRJQ)1GS@$fS`ZY}q;U3}Z@k8xM2dR-WCv zF)iX+wWy#JJHFrXmkM^qDa?wa!(}<|3_*@aJdT9ZbxZ9Z(_PbhwZXM#xa`|U{{Ss* zb$4p|*(jjL@d_ClDFb7<2mtNh9=hr2#_ubQpP~uc%C`Riv}xmFE1t&$jcB&*O9xhNn{xfLx`h>z?Q?>9l(Vdrm9KH8jdHC`Bgz$I7(c_1 zj>^C$ziJoY*DEOdxx4&$h>bBo~8tEw8 z^t)26D=Fdg%wfFSlBTQTG3KfUMpAj_yD1EC2?Pvk9DBy!*Q+b-TQ2*oZQDyu^2@iT znpBnvpDObB(Re~u;7G$TbkAT2)F`$_--eRkOS4w8mZsHFH8V{~Ey2Wt7lyAx0*UQp{KV+T-0e%8jN$O zERrxBFvO_F2*xz;w_)CWM5w0lWV2Z9)O9`_O+!T045)A&nxabBpZzg1II*WaVI(wx0N zIUQtymkgmIl~fSG9!w4}duSlkUI%jSPwTMK3H8t+naxFTPiAd44ZDn1zppcn%aAMtkXn?f+Hfc1pojr3D3R{Z4SCx zHx1&p8^xaOx@hPwb7t8czQXb|MnL3VSOA;C$Dt$-^}RIdw6+CR6)hdA>u!myR*JtG z;aOQu)aKw1nPXUG44CA6(l-Xk>^0Dd&X9(*9Hf~V(RQ7-p3JAN5k2~eqqb2-Y8F0z z3ePXJVlmjD@1Fh1^wWh-;IzR+7UxwpwFE!GH0rz~`69+Mf&9KRg|F zVvnZU3!L{ETnqmI@q1{v+$yQw>tiFpsyeg`NQI7Fi+7#Xv^E{E)jeU=7zeS zX|iHtUoAOiKBM?fZ~*+jA*KD1CH{d~&{8r4^Q{#pgduO5hHN%|z4Xa7%`MW3+nrTP z#9PB^s>#&>KBY?lSC4-|+f8dPDQ`4sZMRs;$vv8DWmJ@}4}i$^QppP`>_#PHpU+#C z*R}1bO=XEIDXAdxMyRT>L-WBtZ`5m2Zm5kdRZ+Wzr;b9=M-f8u0oZX0IdS@**I3-E z<2LCo7fQGV9ELUVsu&p5`*tJ%bB|I^jMrqa*Arx-G#e)06mm{4HT4Zp%)#m$IaT=} z_8%_f{dKB!oJeVCw;U-?41AuSz*Xdj`_93K_#G?m%WXyFY3(%I#;TXcjK&2OVu@tW zar{3|Pklk#)VB?S^3z;56=TNW2x;qMStKBKE+jc1{{Xt6duo12sMV63t_yah6m+)u zC=61baWt*RlOJ9ku*d0~{+e4B>*W>te~yl}^+{LVD3MqibBrh$GiScUMwx zw!r2Mw-)1eBjLpzOnkt{rdcpPtf9R-4G6ULOR3v}no1qpu;8Mkk%%$SNju9-r#KQ3 zDm0nx?4OaWFJ2LRxEp87%RGIU*lm(dIGHE4yCi^n73JI4wi{GPJf^g4&7@7abFtNYe&4%v_M(~T55-f_ zQPM~7{x=-6G-RF~`)45IKsScdHEm6K-1~;l1l2quf+Iq)LjX~ei4=mP1cFm6exADN zd#x?;SiL=xg5y^tf5fO*RxGYNWHvqiry8#JveZutLwlyM%{)>@@j+E@H7NimiNHQk z#2-?BKH83^iYQv*=UCxZ`)g_2Z9OLPoU3dk@NA`x`DMS|E_64W zy}@hVfs{2hJv+e^1Jq?Xhm$1Ww{QUU)IHN2l(bZ}H9KmY&m3?38W@%bX?v3+;5>u@ z^Eo3rV5zIMTWBb^j^?vdElMn^QkBjEjEL9G*sC|AF$^*3@1->Awc_1RMSrcd+io@L zTHLIvp(Qa%0>Av3Su^mU< ziFm7q3M^xng&Zt{01rY3xcTWi&Gu8aP;W`=r``Lao|)&8OKq+y*&3FbC&LpOWupoH zj~@R3GIYa#>Ynhs?-jLd?cG69Bo^kKpteyqXwM)X2dnU=i1~YA$_$*7rCZ-t_f3~^ z(A+j)roCOcnC750{LL(ZOZSpD5lq2(5~vE2eM#&SCyW3_)^db3+!b@~D`g#)Iz7E< zpqi!%$XXi6oaA|!cya>3Wrzp(Wq|LV_{NYo6dPvWbhTb)>9gJ96*5*+!9CUp{_pUJ zRGp%zb$L&Spn|=Je0yu(`BtH|*L}-)j+|X`}8w(HRw8@CF> z*^+Jwnjv$x?fN?t?uv@5g=5J$sCXU|o>KA|^Af-^I3Q!nbq%)*?hVBiqRqNC<(l<) zfuyeZI@Ok60xvKz$k}w{GRF)LZrVoM9b>ENb!Enm($;zGB1mZ@s7Wd#_;MVEnOb2J z83OVd@9=fA4w z2DlYZAY>xyQeN+i1r_dk%3h1dym}l3Of6$&`(qF)s)uBL^CSJ z>Og6dNg31;h64k+&Ph1ZrGE3=7MhD@!L#o%a;m;ag5qwJi1fD_a@=EzKOkk|Nx%`7 z9)X6YoKNnwkb5OO-U`0Ap6Q6#?iTBR-PI9TVp_Dh)v%FNkUS|DlunSGfI;;iFMWBp zFIL^dwy5@X*L9-Fd$)_V+9~)+2!AmTEUF`AXUE_yM`4U=p6VqX6%CTA*=F1j+XXd5 zP}N##mgP)tRA>i|wF^>AMqb^Umm&bb?VTH->c+?2yJ{PKJr2{eSJFy;9+t`_4Oeb{ z!Z~IE5$6mu!;^Y`n(ITX)kebZrGx-q0||m1nP#`#_RS{7xI-0P!F*lCJ!M$Kc)zs}QG;%|C6!!Y+iAM%uie@bQR0bX-UHfy^yFc~{*|4UmlBP?g`R;J66D7Lf zpAS+-GfrAjBUATa#ByRm{8bQVN z;$59^;WYu$n_u|+SzZq*yt+lH=E||wbfDAaS#e>Xs1s&!zqmdmS2;$20b*P z2K2h@E#pzMZac1;(l))l=BJ+5WTtky2^6e`s!3X5BCB`&DoOMMRn1RRwzUMdy|-(( z+3R;jzr?Ru_SWB8Lr~=5jc>#`@|>Q^h8w<6nS4P_B*iHalzK9kkUKUqe5yNZmFueE z`@))ucP{y-t*eS_jow)5mfuq6*=djRix?3ycET-J)K3#%`kXX(X;`4uhSs8o$s ztd$=Ol`+?0j(IC2XvROLMsf1>(#GxkMC{W}lqznYa@RX7)sfP?F6@5-s*<4;oZzt? zy$62$@wYk=u=fu3dR?(_q`Xnat36Ha?)AlFkmE73#K_V=vB>j#6Qf(tpnDHz-z0hi z_mxC2txUAEHrOhFR%~%HR#cL$lZ+JP2c|SZjRvft-c3*n`l9 zMyIz)kbi(pRANamN8&}|bAsA|gYYH?*SxMs?pB-4o{ryZsUH&*?=00c?w%t7fCH3P z%K_Wh8P=12g3TFw{PWXG0}6@iY9#TQA_s~*h(L)yCM-Z6nbk#2SGcNbWwq=(1Wg<<$ez&^*{L}>RcRBW_YxGQ6N5YJgfEOgYx!2V#bk^#eROu`p9MqQisd<(R6o?R&Qct;Tw|>fTjU#Uq>PG6kTCSE|y+>r*?+lWkyrhPv zuA{%LJ7dEH064iIetNEA+Pmhu%YCK3?#m6j-8I2xq^S6-ZEbyPr+yDBRYMRs#zP$a z4m;ChX*Tkql+g?rPW#90LrHGi^&5uAw(FkQ0>e!~aa7{6BY&PFfaWvUcE)pzp88O( z`$F|EaMmrNhkyl0BFpY3LsJX{(`uz>* z2Tv}$0?h{Z*QB&q=SZ6BJHxcOGx;wl2DP-OoikE&^ zxXVSwUh}jme}@N(f6i1>#++7GC-Fw%iSO(9Nw<4=A5^E791^%XkLGGOC8LC<`Xt1n{MI(4uqt0C#dhL$L%#$$@MStXs9&^JC# zTd)AJz|W?td9KM`kd~f*h*u_1GN?fw#An~%8eo+tpr$u##nGGM5Car4Ow|q#qX44- z_5&pL9@-|f1s#5>=%?J5+nu$m#3O?qUk)ZL+`qcatBzl{rj)L=RhKIGt%ByONmPs{ zREdm`NIw$!R|)hvIrkc?u2*1`aMWBWrKFOih=Mg+B(WkAd9mWz<=Y+e`Dn`SN-Mp( znyS-(sTT&H!;%+}D-_5`MtsNxJyRkiY>U}c zeuvxNCr0hIDo81sS_`~T3RicISf7JQ$ah1@e8a!4Jx{)&&i4hkB-abi#8XEwri~+a zc5dIx&pgRKq#S597V!An(YHk$)7z*+lZ8|-Hb2cVB>6%9Z2Ia9q9mhL>Sdrd>$P`? zTe6AE5)b4+U+Jkyx9UW6HBwPUPH+|G3mA8VWQ=#nIl#ysp4x#~KHuX<3{|sDbEuVM zWmHM&!u!TioeN|8`S$F(`r%u;sqPX|+^FaS%IdMy$0kuhz+AMPReeC>AGW685a+V` z3&qkKyV%gn;YY(2G1E9#M)olhIhFb6^cvMrmrA>v+M=Mc-YEpQmTWXdqaFD$!w}=p zD{}9T(_ZoT>jwI$ptq$(Ae!ABz8cAp{4)nRmyE-jiCK;ZK0d%7n+C_Dq_S8gv)5aw z=p=fqj~cC2-Iv_=Ib-TU@1O)Z5%P-(N)3fB`K_s*Dk_UWg<2y8={P*>8?g@&Z2bud z>*=g-T_n0I(^iesOu~g(W1yC#&5}O|jj%D_`AGK8Mw++IVVH#OGOpJu)rYsH&`&3$+9lPbEcEw=*qkeorw3}@nI$IPJwA8g}Nmv(O}eDt>(O6$jfYJ$l|lL_IJ9?pxC$0U1X9E|ol zLED>ma93U)@kLEdd7*?95!1A3P@aQ{3J7n_i2U?!vf)E*s5Xt|eW%&Lshwd+QE|d?>S2j}9t|i8JK|7Cd@(&H*3-Nyc?yUi#Uxs4HmTx7^^W zrK+k#sES&6LXv+QPb`Bm$N(-1vCa>E`lou8_OrKc9mDWD61v%GwpeQ!sjK3aqI%k= zQOAnMEjz^HzIX>cy}><~ypxW}qBF9k@soqjV<#XzJGL@LK0`-( zTh(jrIfG;0?2EbV3>+=KSQbYzoN*}RhgJs%lx(foWRNkYKBmol+!c2n(RAunCEMep zMu5@U^6F2lZxLfG3_JP``1aLkB3owNJEoF_W~Qg8G;+&P5S62ym(`RJ!ASJvt~2w| z?-B|*NewJ@w+pa3Q})a2Ho}ghZ1l3`yY80R6p~N1cT$(Gqv7glYL|(XRDUTfKp%v9 z=)U~_0K#*BptF71vpRJK-rf~7{{Z;GYN}RRE^fIm#y2l3V2l!1+bN~&%bV4?xME!O->Ym z9YRx&X=E1ImhQ4tN{9&z@pBSJ?7WyLX?+5mXRv*rxH_e}B)09% z`_tW-ye&0x$x{V&Wj!2z67v2hD%50UZ1y0xA@Vw8QE8_0NmdX(N#VAR73;G4-@5vt zww~W++!Xs(C|u2Nz1h}8f5z53;?|^F6j&8}8ArfB#(ni4G_Na`z56Qs! z9c-oPmHHdJi_*@tt;*8?6U4Q*Q)-wWQhYxYqhlWOrcbu6Ukb&+9b^vX zmqcqKlZwAZ+8e63XvIUfYUpoP=Bn`?p=)nXJ*}$F3aTlJIJjfcTOIrQXF8|%wezUf z%l)@vTQ?@l>D|9_xvHnQS!vNOcNv|s-W=$hi)XQCF3e7I>55Be(*39FuNJ#b#p)fG ze^T1a^lk7}iwU7w9}dj3#Eh;ESP-v(J7>0@`tA0W+Pez*Vd>RH6;9>e6wxIe({;^n zj@KovGl31gq=^W|Pbr9AUc_gyX*5!4WUy}i70V=YuwFiD(y6s>y|cBXqurassT;Q1 zE0PMTSQq1_fyv657sHd)uuD6yr=ZS}_uttQdqitDChVZLZl`rbrG|@Z(?wAsWh@7X zWl*jZ0Nn61=m|P-*xND~YF<8)@7=|>DsDE|sy^`enp=eTs+3~#K=J%Tz{Q7dO2g_k zVAb_f<#O8f4@uIB_-|KQrn6SiElS5rLlUQYsgguMoU(lf5O6~udVh>d6TxBc!l&q> zE#Yt-#>;K9)6rF3x(?A(HAIx~t+wMm6;jN<-YF@KoMS76T>ENNeOlZbELGCgeWCi> zwq;OSnu0rlnLT?cZ;Mg@`QV?Xx|3&Ix@obl@vF&ZsH$gZDC3CNUFqPe1oky^NFzr+ z<{=;i-~s8VR=$Ds7OQtr@0;Z%$8hdzl#(G^#o9}C6ta>@cp@+?#egIN3~Div-@dfB z#~SAmG=D5Cr$F&tB578%+cr(ZK%1+3eXM$!Nk=4b$RBcB<+wpnEB+n`^Sa72=n5Sq z^#kmK)LPxfvPskpnJ>h~k4FV*YcGlzWH6=hxS=`8?lYZSy-%pzdkc0o4%LrtS?sLA zEw!6!%TATPDeP71YGJ9KN6%t>bkEIn-@mRKhiCj&<-JcO(1|Ey_!|4Y$*QEPaD#y{ zR5dc>@;H?|zbp-Dk5?0(3r9b`Rk{c4+TvF&NzlHeZN8sgHh#)mEq3I()R^zy1>Tkw zikS`;D4JPSr3Cw`k=*JXr)%|Ii)y~q>K@9tTMvBb=JeinJCzmJa@(#ycI?wV){dA^QUpFcjXGjEkwX)P!*T$mKwH01 z-OiXOcC=RuZpz(Lb=u1XHHgz$w`BrQ3SbW87OR>0{fMlgTUwrRn0UD5JypsVV58H7&#sC~O>h>e$)e zXdaMX?)^X7G||Bfi1E_Ol+ag01w4cjDB-3A4j|*jX62H7@vEt}2HEO9{*JF}Ty`QXK3ng@P z6u>Vge-Vv6KQBH~AYD|9Av)!k>2;MEX$I5Vx(tK)DtGNYb+uMF+EyFwnwrUCktyb? zhULPJ3Blyh7+P77ClXhfgfPGW5s{@1p7jHx)+(0%+4T~J_eB|5Eq2Q$-S`1K$tF^b z>sB~<0zf>P3?F0dp&c~q7gsk0=Gn8X{W`R6ifW0L2s3uH*2jLMwp18ut{($gOI!iuTnbOrJJ%2;C=#x*Lxrd9-=g>IW>I%->saHXt*sy2xe8OTpN zIUee=52l%@gGwE_=~2FN+8IoBoqV9&l#eyW3+mg(;S{h0x z_-%3c6*p^qq6RWZ6w3oJkVPk=t8-#9NyoPHX|dSQ-flm2+;3GhjE3VWc363?3wWp% zS(J9>bLvR%ta~)EwwOQKb6+dH?pC3=Z1!sCCu%!P^mTDfJZ%-Sia9CD$Ww`Lhd54N zgr370)MV<7>P^dEXf^isFw!iPs~oV@#JF6K;zp6K52FlZe8;$ZwUUnUMP{(tw%jjE zPLi}KM|MDo$c|*mBl7M>Kp-Ecf^C@g#h-uMh_Futa!T~jO;c6kmXxU&DZ_#9kHmfb zJvFaS3}D&H&n%J!XGGWAjiQ$2f0kQyJxw{Qih(Mgy&iCI2U@?)AnF{tGd6b^n8PMB((&Gg!y47f&wwC*PkBi-; zBuyncxh)c-I38jAw{0eD%UQ9dRCkLc6_sD`xG)rpk%gqcFjoQ86Hf$gl)F_GY$eyOc>(W+k7J720= z-#AGsXq+f|@Q}v=`b0?wxISkM>*?*N_4nP?QMYS$-%o9lwAB$9X1aV7k6iMuIV4h( zx<_|&eau4rVYoyl_)iVq184kL~M&Tw_JPY8^)-H&96W)HD+Qnyd(_n>;Mw6qr} zY9i%5J5+d(OUpiQQVv6R2h<+=Y^$|z{iS7+=X$!|Bb*szh9!;Uk~z*i&yp2EAI*l( zuB+|&TfFR&S+{I;^=ogeP|4xWd?%28AXFbxFi*_uJG z{b<#PB0Vs1t&?dCnKh5mXNOVKz`U!sZdz+M#SNx6ejzmYM9ES{m9q`dBUWa!E>P@0Esvo+8bV-W*Nh1K8sZ8w0+3>ZaNfi0SS! zZLPIP1uV<)lHAgCc5~dAVU1om{+zSx+-lUHbl&T&@?2oCJxl>3r)yvlybmw(%BkW1 z01bw6NM$7d04BJ4h+Px6jINw=g3R)ROKY~8Sgu=-sC7+J?hQR9wuj-VqD*!_6How< zeR9q7IwM`PZ#9c*y6wiPmW`2`8fQ}UjV2CcdVt&?7%lF7d;4m3>*>7Lt?5^4xY+J% zD_d5gDykZ?(90^S<_`{Z;<5mHaCOc;x)Zl=J9DP5QE#`^%+W(x47WnQJBR@Xgk&Q) zj!s1KIc~!k8d2KeZ05MED9KAscujv3Vx!%sWL&H0V6CdAq-Lsw_;5`qP|~0-PjWyU zMmwAwXHxB!nj6$tt93mseJH4uy=3!JOYxO0#~}i&MkRZ>D~dTI#a zs;r){OD%KKM@dM<`}k5apNNzm+_C2;`GD=Fix$|vUKX(4joSHJZ;DFV2v&sCTjXF= zcyG&$lg7CuDRJ&H+5*OU)vXP6bCs2%!MNyc)fAh0@qdA{h};S~Ri^UelB7HXF(mn& zvOhlh#@%GR(p%-E>UG}hd#9t6{7If#o19Ff`BkH7{O$4?ZvOzveKZ31H&`oaD|XEF zv@~8koz&bSYG;eF0V$z5fO`SKjt8kd&iSU?yH3w)q_%DAO>ES&O;Yi#C0$f9c`z1O z!z}!N(@=g`U0b)3` z1}OrMU<>P{&kTZ4NH^=1kn1Fj(H~`h*YD1c-zhgv*^b>ErX9~UBdqs}r4+_GgkW6q zhNB?@=kbR*IWL_wS?hKmNM&8iQ@u8|1->#Uto1Wn&3y!GjFSL|2=fz`GDuGos=KB= z9_iNYwZgl0I{Ssy3sfzx>lHl=l~b>9ky6T}vXC$yDxXt=267)Z+}keBmufDiYzs}6 zuI*Z(EY(*@C|ZtS51MGI8hFPg8DBFW?#6Y7eJm_EapxnIswtf}l#JJOlQje#M7>`3 zZ%w*&)UD-esJR51qL%qQQAsqoURXvS!{zyL2L-XM8-u4kWrBI_y-nKNb7}2MLyLTr z7ZX`rVp2IOsEMY;gb+glGEb@3R&=u6yeT&n)bZ}ywPl{;Ns6mI15faDQ347*Jnu(J zv6KK3puaD0bsql!w{Mp%%Xi*4n|*B~Zfdx#^6{(`u}@6`l}7SO;=9PW1r-y}_anZD zc$;*mYg@XKB+9*&xZreW5VxZm|7SFNi?yj@g?Y{ypchLwS_>Wg8V@!v(K=1NVjat1(+MPv~s>Qc< zZs51<`YF;#jk9iA-Rpr@1*#--6l{Pg_k5pneRR#gt`;r7ZL?GV0A(*-P~2k;@IEiW zJxnAjVn^_%W5j}Z7Y&S(+S30365h}S3;pDwW|^@#ZzQHpqVFBs)Q*wbcK+R}zgF4q zfndGVT5fd0rj*5wIfkt{$rF%49wKKQmj_i2+WR)r?mnPe_l(;|aiY*h%SI|K(61>_ zU`r~bj~9js&tjwf6W>pBbyur*+ACj9YdQ%>6$Di8EhJWHo~^A&r!OS&PYS~*9-ogs zzNbsp-n3Iu$ab7vHoD&}msr{>mF^9_9kfy@{BXe{#JqzL0}&ViWDZ`srTP4Z-_S)zVS;_K~YI0zY$LLayOhQ5`u~@$;3a@k-;DikFeB_OQ~m@G=4b!P(DbUYQ?6Vx4h`9Ew^j-h{aSQrKG5qqMjAmOIjsfDUsx=6 z%hyj9lW=c%YbY5S381Kgo`RB(zn|f$Kr1VQ<>lui0Fp9wr(tY*x_yUZuIax~Hw@6% zO&o14bu&k!zf$fymeo@gRYlgc+W6YHn_nbFg0dFn z@bwh2s);fQR`CuYDnrEflyS~0CL^lwCf0A2cW&#*|O#TqW zf!LGZOJs~J*d3pWj@wsXML%@iZeB2~zwPmOuC-M;qN<>$ma-}gp2{UYEM?9z_~3iv zlIa(A+q$8)x2E5VWLmEqrj9t;TB@s}#Z6;L z(vy4j0+zns)$`SD8a>HS!lEdd&xRT}47Cz3afXyefG%*_bcc9V)oh#QR`19158t6+O*xL4g*Rh=a1cT2o`Ur}yS zLq&VNHDpwEwz|rAB&Z~3!l#Nj-Q!%4tt{B=aGL0jm~WkdQD%-kr(;;QwX#`Wd#!CW z5K_r9u?WEt!*(OPOnU%5b;A8n`(SFFV$tfZ2zZxXM`<^o!GR}QV) zIUtdq+Ed&gX-d7*Wue;Et4{2pt)*9^rMB9)8%U)YvZ^BylI}a_pC;{+N!G~xDp!#A z{n8AOM$*7?x)QJLadfTf#_ieNM!u?8?$osw<&uW&Zb~Y7NevBPmNOF*!~jX>CJq7D zAzJ#QZ@E#>?3-0B({GzS(n{l9Y!TN*Ek=0!L-_cRVMk-)cJ>29W!Ts4)qJ-7-Lto) z;^fX6N-35}-l8R73}RJMV(thmNdx3DtIU0wtyY*DeD#j)wsr>HD6&%Q+jYWv%DD&~ znx&B+na`@0P=0H#NvG1q7`Luu+KCUAJSt0SbnA6>A9Pk%*@WAMcB(!--n*B8tXsRg zF)cIu~AVRWZI8b{JQrekU zxGnTn`+dK0rPA5AK_=O6Hkuo3Rq%t@)Hlb+ByoVjfb#P8Tpc-Dx^>b$(bApAu(rQh zj^u{rT@C(&YE;KdRdlmW3ZEHaJ~Ycw8>z-3Ms)yVCpjtgk;mm|!Uk#N{{ZB9RqcJt zaW7FTHY!vl2 zyCpx5RP^!HWCJTfRSI1oFl>x|fAMv+fzHVYwP!<;=hJ8?b}Ca_ZuKFmYU!+V zC0&|n82FD9FPcYuWAQpC6WcnkcecgaJ6ejG4k!b6O z_Qz?~?29JBv0H7`L0;omeW#>*&HkZe9vmx76)EBazZ7!ny@$-|xV7!A>A3C}JC|Sj zZ@q3dOLEIKC9K{@!)w5?=_Y4&A z+_w7K>ZTikQ2rIEd6D7_dytZ_9^)Ogb;&`w_VwC*>9VDwpxIs&F;m;9-l1){Rcy40 z9FhrN7!2IjFh*TYNz>$ebe*zm)h^4%*6@`&eJ;kobb`%)xolmxa1>S5aad|A>KdY& z*j)mwDe(?MX8>^|;Qs(HKC^mVvToZeq!$}Kw#c-%TZLt0l3S&DB)8Ofk`Le{2v}4S zSJMXpyI^Trm#uedyA|CoyK>#SHf3YP_ftc(JPAcox1t(4#b<9!OcbfceTdb8va7ca z?Wd?V&9J>Ps*bUtHz71L;? zqe&UF6ka-1fy}5N$Wg+v_5;01_L|zeMy7dsgSKw-)K_jFhMFoW$fTS)_KD-BxZA2) zHSoy5kH9^!eA?Bc*(=9WWNyrpLM7sVyRE;aF&=nJQ}B z7L>xD5Ula!vGbN=pO&6F0n&Dz|J# z?%szeG%s#!J+HQ?tn+mHbyn7HyUjyVtueeA=ZvW1FM`!^#v%i_Zb;>^$IIMm<)5N< zzNBm$hTh(n8=CGPiyt3RZ1E~#sF^@3EmRbO88gSq6>%6n&Q1=xOw`2D)7wq`{zyw@ z6ykEKdOx+D>cvwh!QE{&l?q+a*K$1#L{Xo`Oy9$La1W>o00+~KtX`dU^KtL$mlRbN z`E2wJ@s(xo2`uz675p_URzo2# z>0a&A%TDIo^|4ucgkp}iMrkbclPx!ZVrAsBR9DSEhN+O}f(0YDES*2>o0axDd-lTL zP*hjJP-Cc)`)Zz+S*mSd6)cMs$C9rcu#6moo*?T4rWR2a;rcB^(DOBN1=o5~T6XnD z+qg?!E_Q30O>Owesc33ECtOJzQ^wven>q6WF^mmdv^`AP7K^37Z|&MG!B;d?u~YD% zu6R}C;tzuwO$4Rzf4jrKxb@cFn0=e>8;^L?U%IJdrrnQ85UQZ4qn3I}P$|y|O=HB; z0qQ>y8n))>>~|~WcIoL><-YCP`m0IsS2&}ow>b1G$VSLP9ly>KuB@+ttqdRWWsFE2 z@cW?EJyD=r6JC00S=3u)(w~hz-i`Lyyhb~Dp{Y|Ks#VXaR*^@r8mDf(GU_K=F6nKo zu~@0+rV>=s(aUlBqNbuZKg$(VN#E1ZAE`RAquARrzVh2|ee6WF+~k5;rJBNtM^8~O z9r1}4HV51U2mL)D*YvZhR~qDfl~-MBqn1GxO?v!94@ejNEUT5k#!^R9+gamuO*@!C zuT`PVF2S|4?DzIx>ZZf$>h8<0OKWJMqDi5KN$&Ahw2nt$BBF`N{M>={)#Wu=TSQi9 zY#XwUed zSyTs^vizNiKg?wV>8mewbgsUFhDv?2(`~zCy8_bN;kw=?hFYWj*(Ibghwbwx>Q1j! zsO# zmJUfcKP^_4PqDT7YlrsRtyVOusk$dPC~9x;Nmp>F&Ix%SQ4~v@XP1h{yT{(n#Fh6Y56HwNl+J`--2XTXLJg2G6yu zG<@dEc3G}p6p~6?86%J+e=oM1ubowmY|ulvsxOk-?#_@#l@xwCAy*zGDICh@2f1Pn z4{xreSbB=Po(f7!R@0MuQdJZ+l$RS#L~zK7+{(si!~vA|7~}b!C~sb$bmw{8?niO8 z`NdV$CW_(rbrl-Zj1S-=$hep&01PAgYg08o&^AqvL}m_&-5RSXr|3NwP%G(Xinix_ zhAC@ezhCdy6>}>N(S%fnIKb=)GM+yCy)^f2>rK0DTj}Yoy zeT+IIXR8~A&0To1(#p&5H%pDxW=esNGAtA&W+%7e48vMFns8c*0>e1b4R@{pb#APN|XA0m0!Pl6_q1ROG9*=Z>lW)ykLw;JRqYUvaro}zAnneD2 zCvs{fBObmWA5BwR<}Rb$E>)M!y>z3Yrl+Q9{vtKGzm_m@%ftm_f2m=top-|eimS3V z5b;x8j_NMmwe?$X?wb|P^SCT~hLU3=Pz#-J7pG7_3rQfSRs;`J800-qeO%pD>U|xz zbxE*qJ9gtyO0=|fRaJJ1dE$m-W#r?u$rNQzaMA!iy5pXjb)t)AP|dkFUhS{D%~x7{ zXzFR0uXEi(yB^=_oNC?OeSGOBSgrQ@`!4IdZ7YqQF$>c@LsCUk5}w(YkOTE6MChlM zLLS_Dfl2LrG${R7Lv*IQqt_WEyQcA}-3wbkf}tpuxY1OO>&emw=Ih%8lDQp;(=O22 zdzWu-+Wo_JxZkU-GdDAHd!<6i>BwR;MOO;L2>F=YcJvydDEjradVfnvO0<*GJ^ql* zQ*(yCdW5OM!5C=xeK4)t z`@>P%d1Dj?65i&%+}AFI>K|CP^*zq%x2}6u`$=lFNRw0Ch>D_-r;y-aj!5_&@LRWh z<4OC=s@q!8w_=XhyxLW%l_HY#Yi*(hVlluJlo*IO1SswG&^rg(8*Ee4TA79E1)NILf8!%H2!$0`_h9H|4)6K)`kixR ziSB(#dGuDtH~<9WzjXX#H*WV?T8mMUm#zBBJ_;~Uk&uH*!wgcUC%1qYOoe+_fpvz#IArRfIJ+_Y2M zHpbtk6!?-ltErYMnEPj!2AhhU`;AwfOX{}l-xo@oomWlv{_45NUXFqoZ1U9_c!PF! zb#oC?Jv|P(FhL~l4HsX(nrr3|u$KX4b$24Q2yK<<1z2~GpEHsj< z0@6b7Pz#{+;{1>ge?`$rI+GnudD=VgZdi9c%C=bKqkEMqMwJoBgN_!S7Is8l+@F9a zvX;)dQ>RjHZkcVG=qh#vt8Q*u>WJnQFLr8rI%p55k_W3Cr1u_ys zZrwL}J;QmO2RSy~&bn3blwm-QL*c9E`=QQ#3D%iBB3Cb_>$Fl zNO8t+xkbnFx@6}_ouwy1?zc)i3^5i0k>nA{IH6WdgGPj|mSI)h6~Wd6&(*T2Z+np>Pk<8Em`l|fYTNGI9Y z0q#iF{matMqE>C%n#zkc7SO7os_`eSr?QwnCYYZi#o))>E(hSx&q>utMF1<~**{Gd z?=d&bSy-g&~6c&$YMy%)QT6X(34Jrk1`6bftLC9$D5#KtLk}m5z}=@%@^j?Pl10cYV)$kh@pd zsjaisS`9bzGck}tq$-XR;!&%bmoGE?fZggr>{ZZ$kC*HLt}+|$^SzBc$!{$`e0JDHy+$b|{_I!>vuh7I+91vKxJIMGCU zrL+3oXxnuAlWtbUN3nQWOUmPrZju@iV4e7)X#H` z*v_K{uC>{?_@3cH41E2yTh#TJWZfz+GxcAnTaMQmfGMG!QJJNYve8q^2#^@R(gP!0 z*&C}3xQ07+KQ+CwLgP*fu)6(>R+_ZjtlQd**49cA2&?Wi$RcG2ntVcXrYnPx3Wn{B z4Mf}j0B8GM6_T2QrrYKf@=7rG(md>F-tTrBN6ULW9_1~`%e9QiqpHgnSZYqim3plp|?W~95jocF`80X zfJc0W)(IWrWxHRD{`gI7T2gm4bKUErQq)${-ld?u)lu5(gVI_kDC8VtRtyno#X|T> zqq8$EPquw^?T75=Yv1?gJHu~Q?VB1;Jyf@wRNg($$B^+zftr*Fq7iY-4f!{{UqJ#1~0^j>ElnuJ5pI=P(o0p68Ml3!CMzOt7c|}!WcO65Rt(C%$<2WN?yR{}ZjIG%+VmSYZ1onR6%tok zZQFJ!WTcUOdDTTt41^C)G_Rk1YiC)*bfX`?RFc@omNS)BY;Kd#ucf9m3aHFCHk1GZ-8y0ze=z`TX^LbmqZEwwq)-I8<(w+f=D-ZRdYhN-9X# zIa&w`v6aCj0v8>>5$&SeyLfarc%&5FMYP|@YcBGLD{z1x5B zUrWC2a&Ifuqi$0wQrXdF-8;W=LX}ldPJ6U)qaz4LJrp9J$m!~XsJ$oNGsn5M=J&Nw zTdAo&?}nP)RJ9fNh*W+Wm6D(MKECHZgCKX(&AX&@lXUtz-k$GCw`H=J0bRDu=7yY^ zO7{$61ght@GEP2vujATuyM(o-t7L3_vv9Z5$pt(Y3#BbgbqnuJm{J*HW1qyu$vw!| z7sMxvT50dEg6Qd(?IUn6;;zlVbmP4;S?Yw&Z&sM9 zL~}3m0Th9KeGdXYhglh|D>-)CD)H+L^@28!f zp_b(xEe$moOv9fUA9T7ld>P}bn*Js>%UufM{h$#2Y;jh{oDw2$dth-ufs7HwY1d(D# zMq}!G6Z0ccY`rD1bk32lTVHQgS$5md3Zq#yrWq=$4oHkVl?>6L&M>73&#>27`nPGB z(wx?((PAnOKZa?!@W%+ znW`pZmK734d^s{Z0Jz7n)lE^M-_`^1t2|_QM=G29aIa*KOU@Yq7uW?csTn;lxuV1xD6_wgiRGnM8*R%eRpPNA>m9 zb8e~oLfvX>t}%4OZ^$gF>kJpmeLXE|#;3SQxkn~*-^!qUb-*&rp`{=cXIvVMh?+b*|RME(3 zqRTl!@d2Cx+bRg}-&^{D_P(>*_m%eBXX#Zu`+fo}@gcg-u+&r2lB<*|!yU7Mrr35x zyQG^c?bN=WT;rmx-BQVGv|Fg-k!Gub$;)Oy;A1_wD*I_)YkiS!bp1W6>NfJG-C~Jr zQk`tp_@XmOJNwHljm9wajTBQ33Zu{|A6;~A`1?)Scfwou4%szZTE{_Yg`29oQCi_8aVOJUnoUwn$6iCPP_*018LszCEh z=P(XLcU5T_en4kXw--Zp1-o$H?tN6;AK0bb6;jI;9UYicA35FFnB02Pnf6Fc zO*(B)wns;9d)BV!y83~;tn~84pT(xM^GW38kfs@Cs7RwydxcSuPo}czui2aI+wt<> zcYjqZmD5tU#KUZspYG+F3=l)pPO;0&zDF5z>DcJ~gP}iV&5^Tfx3qtISJlN;B)03l zRlT97g_QXrPBJ=j`58N%bLN{u54)d&a|Wr{amUFkZ_7M;gKa-mD0-8*MP<6^WN7y0 z-Huu{rD9q-)p)0eiuUdc0iRGi=$`lL?$+uhzTMQCIvbVRl2{VedA8ZDgw{n+2YJ}6 zz2cLBJXzQ&$o14(D0W`!tCUk!)m2tIq_WQ#jcVztbI&2^cu27-oRC$!=Q=yKI)P)c z)!ZiAR~x+|tWOO^O+A>yRZ%yh)E2`TQGJL2oaEzJ&F%?Y-3s3qo}drMvTE#Z@$MT5PnpC}}NI)G7}RDih(vkeBU- zB20tm0nUhSE&l)yOE%pvQ8$-Ppt;jr#Z9*BP4Md#b&UT2n_5+n#I6{D%gyCs>^*fJ zmvr2>1@fZw+g7V>nUXZ7sfv{Eu)Ql=6Kr{YM0A~t&V}mE_rE2b% zOF*=Hhjz(!w#8OVWXD07k$Gj@O(RJ%dy+u?MuXcX4&8t|clxRjZWVb$_J>{~=%tc| z!@iyxdP}RHxofu0-k{@dmAzz&tVSSGGu;*$F^ux})7MnbQujAamwQjteZjRT4+w6R z)mIgxHxdZ&WoopP8AGYaNDwb$*q+*0xbJ?1?3m@V&$%kMtdA4fmz+2xY6a&AgyfKZa8H9Z=LyDhDu_+?U&LR_@zgj?FAfZ%vm~ zLj^>1F@fdd0dON=53Es1pPrufRhr9u+xu$u(jCFNQ*2urY3>x(h?<_VCsfNuvCGC_ z(qM$+QNZ>ASJPUO4UC(Dt7}|V!%2Q{jP}|aZAE|H90zGqrk*&&W9Wzg_c_*>ES)c- zzg%|!vI;B4+eqiBfobX{sd77nic?zhM#SUH$QS9`TjG?pn`LhtWPbjtbjRT-y6;VX z+nYMKe(amx?{1#lnnaOpRDTV8q^nVqD&(juEJP9CIZS)^)Gf8w4TaPiy}z@nt#muK z=Ur|x-ENfh!fLoGQ!bS5B88%zxT!44LC$hUJI<~9V(eSh${P;gqo=gqY4K9EbY^O} zmUrw@WrUc?;uJK}WP*Dxv~EtSQB+uM+hcrf4X?3$Te4g%w`*}*g&o22c)!MQW~P+- z_bZQ=wzRXuSu}PBKfjtwwKPLqia|?ZyfrP_-*?**ZSodt%}ou(R$pH&G~%9l23OgJ zJD%WrX~S%64U2!RT1#c>tifMUDrpvyDv9c0ScW(=vcH$Vpvq+TT~S+Sr2FQ+{c#l) zd%nJ8cBrDRtgn)a-3vPt;-rZqBjHbWP(LpE>5hqQk!MLKnx^SJz@yR|h0dNBm%naM zJj6W84ttIuk8NN&MlxN8?w!=~ZV8j_jpI)pJ-X9+s*1&ILMmzJg-?jT%mEbY9f|b? zNFLbKD7v4ps;lF&+##llzIX6dUXZjA6*y6Y4-_NjPNMHM>Ym-X3w@ueTVrt1)<#qA z%9-h@3}e`;hd^=iP)?RMt+MHEhN}565Rwuu=EJdoQWOAe7~lG*{C{^9FpCJMI&=GsaalvC{!G; z63^U$?7(B$bUxL7N($L_o4X%}_;;53{EJ^%GsU+dZkM6|lfs^t&DQ&HWdxbUA zdBs^YD2mAP)blz1T*C@+Z_MW!G1(;X!q{k{u)9=4Y^thxB@q>p=L~S5_Xj_OW51?! zM&le-suZY#lHYQqgo1MvZ72l#tc-Di`DaPHo{wN|D$44sUeT>ulEy};sc#ORMgzN; z%jAr9&k>_rZj#$cY^Jx*afX%|c$iB}8Zdvls>P0eg#KEbnp6dgD|{QPXVTO%B{d}} z6D;N!q~!i79gh`Wc>RWgbtdJ%ym(^Uds31^BtH=K4NgqTr1~!rOvY#<7(t&f+u{f4luv{c@dJyf@Qc`e6;5;}Oe_hO(n2ewGmH^LA=%BHQ`n{~}w zO!wWjRXlW3qD@savBxBFW4KobkpuKUmaY0N(XvgtB52y0nxnddOiE;bGk5R#=f0!K zw|50CTvb$6w35Xh6_&o7^W*iHu_yHe=%r;ebK;?^C|O__fFvccCOcr3;zoVA=v!eM z$bAGJx2xSSqN8V?_6tVEyeS}(84r994HzzePj32&OV^H>$fUz0u{6^yKP7;3`}v0CfK97+3o$>eRMA8 zbLq^Xs4JEj;Y>>De#oU%`T*-@&msPk-i_ek&{xKdr~AT*R!Hp`%lQ_TMW zf&3KYN}k>2!EbC0aWy)Zxc>l1;ca9g*mb8)sr5eT)BC-;rmB*Od}>J|YHFK;Wz3$8 z9h~rQQ_YS$b_D1Ym3yWQv1&Vp^=r0LR8Y@6rdzEt)Z87;Vtl$Qlm-$$rt5Hyj7=f#LaexK6OQ08(iZsWUsQK$LMyuQvhN9Ne-4@9 z+-Wn2#(b#^Y+6YO^&u0#&sheIljZUn`2PUnAOi>hWm?z2wNCD~S!#BryJ6Q~Yc~DH zIP32)tddhkBm@XzjK+^9G2TJ-BO^+b-F)h1YH7ALpJz>Tn&O@na@`}6zX5weG$q8o z5FNOc$F6n1rhjJ*vsGJhw9xLW)pISVRNMp>xu$rfQ=bXeSww8!t&A|ndurdN=@&{R z+sSb12I1O!zM&&lQv^mUgr#s|rF4W0q7VU4GBMbDX~bz`0By9;4+W~5vh{DT+vjnm zS5-FU`ip4^+6T7n*i2M&yAZsA0fK=muGFO%}egBztam9DW;?gNY6_pI#KZ+VF-A0>ywTd z<=n8<3}={sodE!%UsQQvmAPUc&s_MPcX6;VrdEjUyB zMyPMZSPuE(2-8@`f6=^$ua;3 z!CPY?!LAmoHR{*dCvDlT+bYLbC0vNo)5$$*PY=U@Nq46%*=%(+Aa6aqF1PB?Ut)ueL7pAMD%eJ$U6b*{g2mLhMFm< z!KTl}XOucKM*%9lT{qhscF(-3w~p9~n(0KT@QfujQnwS~$uvq{LdWK@sXqSzEmjnl zo3+l*CC8^*TXC}7?rlj?S4*}brTBVv?#LcgYKBH9vjPr1K-3reOLbOj%%9rrjkb3E zsby!H-)5(h<#VV=`zuVaPnN+0yp8%}TQ?6}E?r56maf%pudl~At~EDWBg7%>AV}%t zcjUtWWD>tkQ?z{}VYl(SOW(P*%9FS{O}VOVl=pt7>`0)Jwx(J-dxg^L<5W~Y>z)OW zj79)Z0^oz}bf;t3w);i9bM)HPWTKYlw&-e>p4##vRY^%;d@JN$vGItG6|$ ztGm*U4cEP?FI%x03`U)8DM%6k+_*@{s?JxoR4#sPrbi2(V4D8`Kfj76+eZlg=<3~% zr}cNcR@SDi-3?Tb$3=0iNhV8hbjKP<6N<$rw-z3w8ijM-5>INO_&u?8x>VKIH53;5 znG#yx3}cM*MeySetcpx7xkam*pz0FTm9fI*)Y^d95B}!W9ZB*281Xj-g(mK4% zKhYe%XI2)$-&9vknSI^TNxP-GQaU7(6D)B;igHgfS(85CFde-{wirg0p~EM?HkK#f z&j>x+ZdTMocCMbPOLex=TB>Q}txAT1RqR$GuLKCB;c!PTU4owHRsP)TMAk`Gmb-Co zC6bl=T3D$o)u2z2Wq0F`nv8yWW$JHK?=3}5OSyNn`;uG2=aqeul6ex0cSx00+yJEH zF=TC5_pP)lHr*!UquKY$nkwQ=J;bar$2`7)OmXu)zt$g?yP7#$OF?F8q?_jUc9{w<@(wVzD6`#s2^|;pe_G zPk!WS3Y&afVyv`nO|2|dQwUxO7AG^1-mQpX98ddA`L?f(>9lv<_hs9wWuuzWSy++9 zP9dm;yfnreES$gqqCj209{fB)LG~J1Ch(n#qPRzP)NcL1x#5!ORb35DzY)_;UAe=9 z*;Roc4Eqk+=^lpl=Wtzax#~@oYN_O{ zOI=SDe0O%IsS$I6SCz!1_wf@U#yxVOhu2l(%~P=VVq4pCJxw$&7HXO#ZfJ+`Di*;6 zeRVdm_;Og1NRO1R)Z5iPQtK7X?0a)=?B5Eewn{5~!sU2Hl1GGR_+AlLkT3U?xXy8n zUAuRqePgsk2H2?I`!0fc!i$wamZq+uqCJ`wS0#skPT+jUwz%J-v2SWitXtcreL38h z*k`K5R|p!Wq2n3uNR5aM^(+ASYrUxYnRDqCX3|cu(bU0RyE6R&9znEl{h$-Zk**u z{h>OiLH2*@9A6o>MB96RQY$9yqQtc-BP2aM$taN|K%s@Ltg)Gn6po|s$ueX_67ZadAAtV`qkV))cR zk1+lc@Nj(!mKgbITkL1l8`kgLHvO&C+x?^aF$_E@ZPz=R(!hm10z#NqB>O&pEnA}l zfQmUyQRQ}J{M@?Z(6}phtQWnzbGT8*RxGp4<2^)SdqR1JSW&&OMn|@|CWGx;S<{W% zQDo{rORNiZ+f%hAJvFYHDhc@d5N83wJ^aB{3HK+{U#d2}&9&>{TP;m(II5LA2;jHQ zSsEeuTQQ$0$G%3tF2C@CeV>lP-hbO|sc)~A%W<9D)sS8&YER-)`6TD-t1M{(!dqTi zXeYg&*DaydJ@HL>pxHZ;ZOc*4DteoR;pMj5S+T^k#-IU#j0nJ9$vD^LeHGfS!ERfvlFq9ej}Epu8Rd>=2Rxld zJ0I?xjdmy4TdJFi{nbgIsx_4pQr&IBl7>zX{z{AZVTq4ummb3!OQ8VUO4lBzc-r8< zLGD*Cx~nIKx@cZ1E=%C6ao`z$2;edLX*+o>&dC)mww9I{sp_Ph~Xl!r4cPD8o*``uRpl{Pehjo=bH~)V+N1LVwL921)ab06AkHt9I1f zZi=AL(YaR@yQ|}_DYtj5bt`zAH1XW&BS>yBqjymJ)FjLPi>`6#+Sygpg|t}d>t>_4 z?g|A7?H^xi%A=| zf5_`p`=@x(S?0Oz`xKQ`aDsecF@@s6^$1Tk{ITCw(Oi{TIch}Pn^rCTQ4{UE#hw~< z4mtd3mD)l4rZrz7`Zp7uHC?t9%7<;dbrea-e7*!l$liWsjvAYGkVNCJ@^MSNvY`(YT2K0ZJlY2Ea6Yd6I*k)hwFS!bX(=J&1EkWm#+ev4G3LytJ}ve`>wiVCPG)Yj3xPzuW5j3Itm z$K*6FlmLybCn;v0Ged5LRISZd02*jgdR!6ejIMA-PDVQ&HEkN|?Y|wLY@v9SY zZjG0*O6jS)eyl7(V&*k}c&$fWbZ)y_8jM77st`NQHs%ok! zQnH?&F(k_rW@mtZo`LvLnjm6QhpB5 z$QQU-7msWKsdN3HSvack2ipYa8=P#g(K|Ez!i>c9D+iF^ct}CG!J~**Zsj}x65**w_B%-G(s;DYOg`yz`ulJBzFCE zMc#Man_x7z+tohW+?`lx)dE;*W;FEZMjA=Eu!-4+cEBU+s~2qjr8aEy+HI3Hb#b@b zWR~qqVvMa7Jh&yqrBjoE>5glUVsxj^8%|Lcxxi9mv2N;H&qwNF_;#bOiU}?1?@%T9 zNuMgBM*t8Q;5z!RW8YLYbynxv*UL`XtiCLJioC}S;>%OGDqfu=CyJ3AbEo56dL}WV zTQlt`aotwU&0lz=+Pin96qRmRN*+1x6Q0Qc9%&|*I639pRhL$>HWhngQQH*ln2m@I+nB@Zer}a#3T1gxy{-6D)@74Q>x>>yUsH3`D z9;qqp_5il}MP$zkYKf+dw2#{(!;pe~bEM9t-!}@{Hs;ISRyg3j?keMRlB%wmX5fzH zA)!Z)GP96!DDyDEW#bL)*u z+?zXhUn*$#H%nGc`L}KI)cDrw`r0TKX$D!23kh((ps-fJ_0yc~?;CMnsz5n6!XMQ= zmu%TdPttli8h9?(I<=A;RXZ}g&~d^KiusTu@l^yA^B{t8Ze=GN<^}wN z9fm{a<*A)b-gOjpHtnmrExUhkR#MXniT?n}q^B`OoTQ*J5=Ae$Wp7LqoiZsM2@U6) z&wo@hix^z*xVD{s(7r^I&M0db8CDZBr9?mz$CsFe^vL8_IP}%W(~X;Kx>+c?jnsb< zTNF&KQ(Z>{aJ6@T{F&lRHA5BveiQC<+f7HN+efJO1?m;-HJ&)CQW+{8T-M!)P*q|- zf=0;W%gTMp_SQFRUE{0!VkxdR3y$8}dt&L}!ADX|5W^a;n8{Hg!$`;d6ZzvzlUMBw z+AY4n=p{9+4n5U*d)#*o?Y(Qa?F{vHXO1_51f>o93S?d}#vooUiWFlj%zVaMR$8O1zhaa z6l$78`+(K5U>6;Vo(!^Gqio;E!H0NQ36WLkH)7qrud zfACVw!KZA3!m%!Cwl=Lr!p&jnZ3f@DTiX-8>cdfVxz?!kohjyIr&Q0ljGugKM$zjX z-{NMc+&yHt+eJh|1+`i>)j)g($tw&}Q^u@EsmU7Iv3k1{yQO2UhFa+E(+?U8>`~P; z1&?-zk&MEAMO*XLp}XxCYRk=RHab;~v*CbwE_QS^^M)Vh;_xDMWce0m$n`olPb^+X zXZP_4j4{dP3OqL$H?5uMc1vz6zUGc~mfa;4wn!(640+8^gj5m<^bY*KSk;NJ?YrY? z+UDHdQ|cYc&uXKE>Nmh$sQR-tutcmr4X9|St?^{{StA6jx&HuBzb$BP zuTa}-hzK`3Q`_Bu`DzE=H=9P-UY_19 z+ZLwIE^Bq2s4f!Hipf{enk9i^{K6`O@2fLsZKl1{Nxe3+Td3*nrGztEA(d9yBd!~Z zEUHyczB_$2o^KRnW~CVTf6wxp9-Dab6s^0y$uo4Hr;+dLZsxt+DX1z%HI{;T`9~YG zV7M`ur11$K$UA)X^}_Qp*vnP1dbxJC-Jx^;0EzBgZJ=Ssy)fZIfm7UfH{D&sAh=%G_%f zs_g`J*ed9mf%27-LYxZ^eqieqdYwM7+xvb009B+3VQ$cvte5V+Lq#1n>iawF?ek9V zv&S{Qs@(G{&B?rPR91L*mqTt>IAbQZs*;Y`cBPt)6m~?OpC^zW ztg$MOZ=RvU&^rzG>eY4&Rr-peo19*X2TAG?Y`qv8jbYH`Sjulp7f0u~-^`~ZsQbC5n9*IEeVL#NOso1&?VBMCg z{qeVF>So!erp@lY!f#O2!woV&X%EKXo70{p_8J)m=i58x`&V8rw!7sNF*8>hx=Eyl zX22dbQ(NbHc+Nc;nFr;oEN||oU3#Tgd`b({$6~( zx+7V4tgUN(CiU15Shmroc9L3p8d^#i<;P(S9PtT{&5UKq{`NEyNXYIdn@k6DgTP9* z?yL0MYFRDU88?l-(L-s0t>^ncTTZepQZ{%*hEvZz?-*ta^7YY5iTX{u_We~&>wi^l z8aldQ^z_!tGD8(DIC2S!rdA5h2Q0HVag*+GsTF-4=?_?TRUO9XunBOJ{{Tb(0JWb7Y}oar7;Sg37Iq-yNS<~W zB=OEq*S@*l&8Bm|rsI9^nssl;b9hwR{iOcS`%=MGvNjdwYX!dD927#nzO61*=p6U( zP;(|fQdMLie1@cL?!HxQowCyHZjbM7rCaV({BZaR1*n9D1V=26u(5;O@mTZobD@?m zv4>7}uI;*9Hm20vb+(H_$ue$BN3*f$>P-Zx6ilp>wvty45V4i9ci9MTV7;N)ZF zrTdoN+xJbkN3^JSd@;`yzAwVusa2<#5s+2KVz~As5%bqtC|bu zvWRNDF-s#eC}`ctV%Z$d4=e+#5-ry6wLb3n{k2&^9D+n9a|6LE4``Y&Mt#n3bd^uG zcD$C`g-E(vX!t*aPSDa+O0_cs{%uwHV*|M=e|<$>oNfstrh*>%YM|8fm0>45WL3 zA}Any@^n%~9G>z+B$d1?Cumn(ER+{mW3@fjji3`HG)fvNswB zN9Ce)`@3{k(!la=-wL*g{{Vwj)y?7+_EK*mLF4?X z%h%_s_6Dkwx_ge`mWJn4_+*pg1V=wM^7s8TPjfZCwvrax>rDh<73JqF61;N#9Z?() z%(j{$cydovdL#809l5iq+TByN(|A{1oLuS_uapr|$VVUfwk5Oe+z+AAUAwvV!Iq*+ zWr3`960Z=5k<=K;9o-~$7(Uo##*=rZ+Lo5lXt`W&wAAfe5Am1cSCbE7Nc9>WVWO99 zRhx~f*JrpAr4Y|qEAc1L@r*7{)40{orw{q4$;*C9+SvAyd#|d4?)&t{b!v95g02aj z^X$2so);n@d-+w+kIS~U+pb+kp3QQmr=*VKL**`IryxVb_c0=c@AJsggbr!5Nrpx^ zV$){MwVG=^!n&%-0iL>oVQ!uS;Ydpm0dO*QB?F$5QATT8T{#jC$<1ngZ0&GY`ScUbWvI3%UF$= zt0A4^>v%JQ-x}uVxIst(niQ=~v0Cx57t@Kv5+4h*{+Iv=?!7>JV)oE*G zmBGm6;h;nvyAVHJRNHEbi>dSxTPkZ7j_X7TY04JL{{VR7zCM2~F>PCJ;OVW#dVv$& z>1AI9%OtW>o?qQ$aJ;|P&*iK-ogo7buzM|0>P7`pb6xqoYPnZ#3k`H&%w?yNp3wC& z_^ddd;lV=PyPuHkai?2O<4v^m_WHXeMa9iC$eE%-)bkYb0wY|OHwst3(e_0pXj4IX2Z$4MzS zR1ruoqQ7t4Dk9i)_SQh9>nCcs+N_i2;8d#2#Qy-I2p)v%3k~;jPjaHB-Ww|2T|rM! zCaOwU<}(;F4qitjusHhTFI3WK3&A_L@PCqg` zX=Gk^1;+0+s_nS%7kYZ8;ZacW_-{;D_hBG>p!x;_+eX72t^EoTUJe!JHzn(SZTrmB z`(8Mx;-`{|+|t7xR27gm6=Gq{6+-_2bsS^lbq{6qcI~w-n^SOJ=r+W3R@%8GsHnSD zRGL*+7+P9tcYgkv^1gHP(mv0kv|6_$J5JyIsJR+Bgyw4O~%E+_S6jH!;91DDgirjA-Cuo_ZqrKhkH=C>w%N=A?lUB-9 zeiIywo*ZL7?BsuZCedE<##j~idciZ0Hj^AHZz|-0<(NfJMx%^m)Y-i_=In=Gy zQ&GC?32v#f-L5pWlyOBnQ_#yf!Vf5Srw+29`AaAtF{^A3mB2}YeG?m~Yfm3k({bt^ z&iFby9rG-;wd$oOYp=vNiu|$*tWV*w0E~YV9-Y0lsN8Zf>tVaa#*M>mdb!}k3pgJd&g+lX0Yx3ztl<_ z(5;UVCAPrwS0j^#i6V&%5rt8J%&g1bwslGF%jKhC?$K{e)w}wEai%NEwxrD+nvwD8 zib(;PfbEQg_QtGUkoALk*bUa#b=x%+n|l8M6pu@Kw(a#(M-F9 z#&YW%{_SY?jm@CiD=p1_soVRSo|?mI+?#@)n~ZeJxvKsMM}v^B6;57tQ{N^P$FCux zJLan29@LAfy=C1gd9_o?#+ExIek|V=>)^#Cj$&3tDvZok_$7` z)*-B-uCA$ywwk5Kc1*E(N$ual!w;Um-CMfbx@)$c$(N@)e(Skt)QBnIre>p#KTb;< zmnxls;Z}&=@8@AJpDz~NG3*5Vrt2b`N*?StnOIt%V(wgVF{7LE~ z%XW|kSK@%5Q6GNT&YyPQLzjBYYoq%^RBtW!wTHwi*(+WecxT5U4GdsH(=brk0#!cT zbStiXd#<}+?G`&4_s?}Q_ri1cJ01{;rXntia2D;Z{n@$ zp1SUf@>AL7>7_(h86D{$soap&O9gaskQ@k!l&wP^UFGaQymfPbZnst6ZrW?CdpK>| zy$M=-jSqoNYO5`3JN!JLvJ7{~9A6(SV^zQY{{RfJ-0N$t`)=R;p^_X{&{N%>nutig zR$xL$ER1p8RNx<(@1Z>s>l|CUuXFCb_eZs?^T!LrNlg{2?-U5%ibtKiS$Y2eqah!b zxzqS`lC%*(`r31~LxYuYR&{q{+ij83^#1J~8luS6M$HRX&2Ej4@ehO$#$?B0?~ps^ zR9(ZZ*2>MmlUc9Z#L!z3NhqqWmg;dVgC27mL;}PSkIUPB+~ zpgL}k!r2RU-nIL zdF^fE<~-#0=7Ep;t;gr4t4+_Noi?^LJ;d&6C@6zLH5I<2;Oc87`pXz;j!*KLIDHPf z(ZKk@4F3R$PnI_jT&M1uz3gP>u zpjD`)tfQuttH_bC7DwVDIR0j3A3b%ovdu46>`zO+AfcMa;>cjPRWejd*m-7226(@= z6|wZzCu`ZJCO3ee(CPs2X>-2f>g+Y~-RpL&R>-dPBAiv$)OeK;R5K_N$pXj8a2Nx~ zA2s>OR8vDFT+cjkjy3}x%G$qoe(TtMOs%kV!=^iGp6D#CJIi9K@yM;7 zAQbSeMlQJa=6n3~{{U!=2Cy0*zeJ6O%j(LauJx9xnG)j$+uWOeo}P83wTttL`<2O$ zb~NZ!DWV75$C5oxPKDC+n`l85?{;-hsT)GwZl!gO6t>l))qG1HLMf$6XLy`?5}==5 zJ#`}UTVjUYc)CS>qO;p-o`LN4_@bVs(!_a@rk*yHgM7*nk48FGyIQ&_yLP2T6~QIi z_E(Xr^05B^VOLZ%rbpavuu;2GS}I1UmHVdYS4~$nuKBmGdvd0x zl9ICPBD_?QKtKT+s%KW2*B#Pm{j-2HKA)^R0?~22+G(h)mTSGLvEYhWVvZHBqkMK* zV__NY0sKHP_4(?$tLO{X#M10OprNOb@_4J^P@nBIWQ_ev=`!ii?e8UeP&LlX@F)Px z_XNUx{J7*tmG8J;1uTw_G(97QMrJxos=GEVSuPvrQ#*)s(Qm;_%v( z&m2U2xRO44eBPTcq#IVhY;IAzcdY*a2n3WAwrSp~dKlXW##1yJ&8G zYHN_JKNAZ9J1s++#EnL0Xh`tjaPKrz;!OzzZ~ zTjy$Q+QHL(;k<9gg1RGLG%aD8=Nl^L%+pjeENo5*bp!JUT+=Jwe4_bGYkFstiE7_8 zX;)3ud(zt}E_-(1^fcn%b+}Z|RZqy19cO}ju00)*!vUX7TNb{hbjz*Pg3oQRQ_x+^ zZw%G8ifp7xz1fVYsPe>p2;#lY4s}}e@pj#lZEgr9+SbS=yF)A4VXm-2O)bumNh}YB zU(VjdNMxyX4$rFpK(2^t2<&RwMAD{ z@Jge`sCAq8QmY>PQ;7cnOdUt*mcy*tR@$Df+b{LIKHmV0TKZ)T= zzste+liN7f8&h@l7U2y>-Re%qnyYBZCxX^nUVvUZrkU%Rv!`*b&3aq-!Uhf($_OLhC7lI1bsD*S4IVbQ8Z_1!1PEx zO1@X`4Yy_3x9b$CaKFbL=9um3x2F`es@Y$Qj%jJoo+t4mqWuo593IG2&^c^3Tj(j8RWH;uzp9pi1*FW!(_;EG6Vp`)(0 zS28X*q>81{v+Nl@eYMA%%c3{U<8`}TH%7*qk8?vHmb;GMxKz_DeuIRt1uc%>ho5a~ z&_@HUuQ>kzeyMYZbirclPL>dKY2s?iE8Q;!wmvq|kM|a8g(H_O;tPbAh*X!tYqM?aiex9b3jn;Shz) zXrt;0I{MA_p6eyrsLiuBt$lk-9wdA0kQpQ&-AL626-Uds`HeN2H=40unEwE1jO-+q z{W7k7l92UVr}Y!q`p*a}19P^mhI>V2Dlqgb6-HUV(j2v_!(^!2iA!Rx=xx^LMM)W! zebG(62%Vz!GDu{M$rvBqcL!8W&##-B3r&4>t{v}ho}Qs&sDc~+04g&x9_pq~KOFmH zjag9rsQ33wN)6G{yS2s(khw(@aXU%0B|N?ASBOTj_^0C|`5)>j^`ZCaW-eYJm~S4D-E0?I8hBFFLk$zjQlrok(ULzt$5`9p`Gr`{E!y&{ zQBR)C-@xS=J^e^i^U~$B?H7IO4Kc6j*3s~+l1t8}8k%}p9#j649z+xMT|wRbN3D8J zH+_?Gwm^~rFTzz)@o%7u!sHLsV10E5hDPUqQNSO`3w0sB;I(Pqw{Wi6_ARAHxoV=G z)*fo>o52Bsu^1jmlbm<?^Nqfv{d&_ z6VT`T(b3K4&rfc=Y^x29;_Pau<+sN@OI(l6HjEg@ zWSgHq!FV}!SuDqzQ z)O5ar<3}FHtGMnO*uEUv3&~3@RPUZs2W~QWYJGx%r@g^)>6cNU7i(?y%O>^?WT}SZ zJxwh_Kc^In#ECzk)h$iaeyDAW<#y@3Y_U^kX$-U0(b2(QQA)qxM);SJe=hpgAknzx z`Sjsre43t15|-ot0F_G(JvB%6YQbl_Qp^PL)ZJjM@}EKBNywlc{$u%RyKB^0-u!4f zzi8$kpmJYc>VG{++dV()H&S=WpQPLMuU4KR>gTGV6qQgX zy0mow2FK8yI7?&Rmfg%Y<@<5hnwq2V@yl6jq=Ojs2_iXizg`$WJxA*_FdeP!^GR$v ziA|MfZJ)Bv#k6dl$zq_mU28UVO&VP(sb_)Skpuo2DQX>jRFrxY!PQ^5dI{4PrQ7zp zYMYBCq!(G>sT8RwCy-fIbjvXG>;|Rm+wWEGH`|T2yMA7!x7lNQI4zYt7M^s*I6)j> z9$)EaI;gIlI$GPMQQP**wZ+zEYKwF;d{s;!pEos9tiP$woezjFjYg3lXv>+wHk<8Jgr3x6FV+)+j!mGB;D4UdfR@(md9^` zK2WK$(bPPu-l`p185`dmbB$-Vs=6IjNk@LR?VZN-)O8C2)6_*e_>%*l;h~+DH6Js} z@;YpS)zZscYZXP}3XA={xg`hzVx%L~kgbo~_tD*%wR%%kQy%Nwy;HbR)lXDNq@<)m zfVZ#;?0fvkI^|2^#xp^rEhkLgUzCs3EzP(06|(8OIxD=k{@AIE0db+aS-e?|NbDIZ zLi(SoV^uAqto!4qcB^gEsr$aZOV7vrZ3J-FG?evJ8>u@ZXjN8J zP*T@z8jE!>ceGn!TZFaq)VHLQDtS3)zu`LP{;BkPb6BeFUkyPW%JD5Io~TqqBX|U! z%icE_$Fl+XYh)fMWC4$L51;u-c9pT)+A_9mUbb{ocW+Al#k;F-J2!INnBub0QmIDL zvF!0PhI)4SlEr?5R^`Wk!EfGFJ8DgjW89Y(r7s@fs)7mXs-q(-nv_`b-Mh9N{dGc8 zbkBTWsM@O2u_+#|JS$CXY0@-5>5l~>AHJr;)X%gZPa}qnt(3P2?XQDFRb3Urna9ba zSLGk+tu8TY2a(zNp^fj4-WXR$Pj^+${{VWZro7m!+j@XYB$c%k6^X`3^Mf5jEB8P@ zm4W(WQ}?8M1AK3r6?I1GT3PHErlG&vqKx?yylBLQ$X`s7=j*C^)ApR{+DpJz!O%I9jYKMb_1Q6q@6g1kih!C!9PnzZ)j^Mh>D%Xi!hU3s}v z%JI-!&3e(xN{8KAlNh*>|aHIlW9W&10ow;-35j*r3{$d992}_-%R2F8{_>1|dZG4K>gqk8bSM0zM}MH(*Hn@TA$r7r z43XKEHB}(z<&7plsZs$?6&+efBvZfoa`tBj+!kS^8wXIgr8efPux@)6 z+PBbG)BHS2V55t`asF&Zk^%r9Ky)gDcG$N4LqWD{yh>VQ<+n>;HFGnMcT*Pte=T}9 zUre`E)}E)R8!c@&bZo<0PgE(<@#)SN=HKq1(K0qMl^bY%(3wlz3(7A`)Gg_3hI=OI zvVHI1Nt#c);DM^w2l-G2QornDUv96n&gbeCb-#S=YvoOnvbT(lMOjYpD!BIx%kg~p zu0Jh8-7)R{sZ42h_ff5J*HVEDG~>IG=m3$LEc5<7?Nd<% zHPw(7Vc(pzfyO>yNwC(8-MU_svr1l zpUhms8C&us{EnmbJ7ZoWvAsRBsCGI#b8EmtGdb88|6;&uC#1R#@V@9VP>X) zRMATV#K7R-J9v^D{FLWh=%Ux1NjR@h-KIV`Lw6HtLuPDU*R=Npb=z|FS#G#T=1FN~ zG|whVw|1{vw;tcD zP4U!0YTGp_lxp7^8hFpnDC9`nKk9#7ZrGgx*jB0v>(=+)7R$6W5_s@cD^*j?I32=) zAj2=v6+c~f*e7rQ04u*CYY}X2_d<5*_V?(AQf^;$-8vg-p}8yn00}LS%N(({`lL2H z{#e!bwKl%m+Rkkh`|fL4szxto6#`&+A6LWnZ`FS-bJq>|)WHps$Gi6C+1t#*6>3=C zf#gqMSd%1&A5t}VbmyTpmO99(C~S1Msu~0m)m`otax{FtVK{)_xz>G51h&KJ6jE(< zRiaz#XziN?p{^T}YQ52FSr$d3q@**JVdy+4bKHE{#)K}w*xRy>k8nlO3(Pfd<+s~f zCZiJn0HrB+Brnl&e!6Deo3D7-YecbE+v=jGALO)@RcqnIzusjE+)wDgo~o_E*AKN1 zQ|^tlHf1!{3wr+m3QDNrGFDZePBF6_f%WV(%|6JPayuU!{gp`BUh0g0#M`@XTYqR! z$874o=Eq{Cb@0a5wO$D`FUmqgH|9GHSNAHN>AR?Aqv<8yJ&m*I*PKz?k?G~1<~&G% zc@NM5pM7Jxx_i@}lgCY4)r(BG?dMVirka{E$xctBRJiQz{*J24y|%A(UgW$`i-dE= zIa5HBEh>TR5*XzK57YC}yI38Df(NR$X~-7iWjyTtySYl@=?$%ddv2jxjY=Y;4m;%6pLS=jKPq zdTW_GSWWKbZ;X=Npdr+Eew%dG@~dWANN!a#C&$S}c8HMdeI*b{3}6pW^JgDD6|T1K zddlkC-4%~+U1PerhN9&HFOm{FNi)o?5y1ZJoQ{&ewfogJrCj@J#l3#urjUU(H^WoA zx4B+%qkukK^;X~R)LV_=s;a8$yfU8LZ`98`CBM;iMnJ!>>#Y9(%f#Mo+4-nu+vN%B z!DZPSe)_c*jnith-t3Yyy}s5aRILD#506bEMc?H7hP|z=>5l5(v)}js07)%NEqyaZ z47W?IJyJY?b^%fRNV0vycGWvz*;|Wf-lg0TZn^+!2?9#{v~)$m{!r2at@&!!+FMh9 z*`$|nHKvvv;-Z$Wrr{jvlm7ri1O%&-^TxKtpm=ue*N$^(22gnlHqF=?*Z&P%qlGncG#!4?tZFWsqJ@*q;XuPr?@1(4lpBcD`$_)9^Xw_ zyBdb`vZ!RZN3wR5NpX+E=C_!sQgVISVX0&z<_0sUGVd#W4Zgn5edtA|MW{K7vuj%b z@bT)-#lMPvxNTvQX)+ot{n7O9vxJY-Es4Bk>PPlIs^zq+D;|(dL0K)ol$GiiB1M@M zeE$G24mC|x-lBPAk9=(E8v2TPS}A6p*3gFHam8g7F_!fCYp3n<>}!RZp5?P@ygQpQ zUx}}po)?L|;|lSG{Q(DC?Yk3n*VMh%mu}Ux$i7>Zy(pulMfVKiHZI?h2Sugv37YM) z(Z|B=DoraMEFaZ!{TA=puXLiT+5Hx}nu-SuvQXVB;c&yl+bu*7>J_r%ey+9Bbjp`=?D}d$X`!x;?E^y`ew^bdg_ZvRLHX%|vimOF*#7`>CfUC| zo{pqRK}BbZ8>Pi%AM?{Rl5oNF9M`rxYmKGa-ACFn#eSlK`C_A#3Y7T!XM&Qb9h(r3 zF~_;nF4yZ_&iX&IwEIem?p$WAl~f1%g#bFY`&z-PGfgi2fzA3Ya0bU7!CqFat9wc~BZWT%{e({p)=M)%;W^cp3x4^uYnqVICt_nn=4rMOfYX+AoI zsU~(m^IYGHC%3F*e2CIE(%oCyuI)#AJv84|>br0GJXO*KhBkxKinNQ{AKv5+J@mHt^`_!Q9jP9+(8mMFcrPXG{m^wt-mDvP=SeL^Z&U3R*8q$}_X#ecB$NBg z8bFGt>dZ&b>hQH(7j|A1H)h1!mpZCkh;DZ}Xs4+|^_DVKhx);WqwiQ^xIs~DrLk=F znwd`{O!nwnaq`1Pi~9`gd>V*gYd~&(VPl#(CUGRvuKvta*P9nuY;`g9KW$Z0!Xze; zR!KaP61~c;L_tCPh}G4$I_a`(Qt!Q^y?6G;r-tKP)iiRXwGPQLk_eg*o)IK=Vq}7 z)KEyOrM;zeRz>yqBV9d1^wYo^@!e&HJw!6w5dG)Y`<>yQ-P2qD08cEmMSbdPWU8Ex z`M_DER0r3Js*k3SXXkKKPc7eL(#*d+hPk zDJ{|7_QG{W!!5IM0@SNL1zjHA>z z&Hzv3a;xn}m`)Q`Xh&>E=fRwqRzJ5k@|zNxLtu+lz13OKI61 zaq49}w+TRcIt{x@@n=4YC8}Zv>8`7L9?a?;RZi!#*4SyLwbS@F2rWE~Ow2oSD(Z^g zu?IyczRfo4s#~x7V`x#)q!Bd6Yo$51%QTETvph(!_H@s9OXY>GZdzZl?I71h0byw^{3y?59(JCdh&T)Jydcc7|A zN@!l+1g&qV$C=q7FM!9?l1_qA^j~J}iK=dwdTqT^P^G+EV^#^HmQ(0g%A-H)1}9Rj zdm@tMwdv_G)TXYEZMS7w zg@Y^L+$;D^AwI3(yMo00y*`?IJYYftNW#rNkT~6>%MSYM4)eD&b%S%+wp3MA=yvs0 z6&MwC3I-#NI(QxyTR%(J8mcu#62$(Qc-Suy`5)IwZkJfo zwZ|9pOfO@Fpf|pV>?-Y-9Sv>ni)q#c0-}c8)6~;VB9oBOi4zC?CTG;nmsq-Kx2Yu9 zHT#llrK;otOHWlbZ5=0x=v9X@0Q!Qzo~v8N_T0N-wwmEjxFV#dVa@5}aWrgCq3~qn zx%`fV#nozS-0e?vTN}*H$*L&rrj}Aa((@w!07LofqS2|1nQ{D?4vxD)Rh_XzuH}*KIn; z?Y&y*9k%sR5{80Bv((nOkJ-5~;NP0Ivw&Ui1ZF_q2v@&GdY{s3G(UJ%^xtXHUuTip zYMJg7Zew3i;6#OU^Wrn}&aBqBbjqqZE|)t+y0UwZ@nd=)2{{w(%rf@>0Aw9-oy)A< zIkwd(+x9)NNbEShG@Ewk3xV>%Qh@$iA-4Me0By6=7%gIgnl+clKjm>i#Qc$E$8V<~ zb+$LXl+lDIW9`J{cT8W|%Z0c-KHoI7#exVDFBK(W{q9Pu`)5G!LW0Y7iiU!di^3LE zmYR0NS@t8kp!yAS-q-tBed9XEd#RP_ov^XAV1*wwXw`;)+SS#yy2;Yyr!v(=B~3tF ztd$Tm{{Ys(T-N0^+_#mIXrrXub(Pm1OsAM0CL7ocFEOU%mabcD6It%n zRQ&LZ4BU=Kwnt|D^qXz!ZrZ-xzPbNY=oa@rT^RMc&%mY1*w z3b@n{%LEL6T{IvhFNWE?-Q_V{H$`M{A`>Wu<)$BzXv*Y%Wa(n>%av^pRNCiH63I1Xv%!=a!0#O8(Ek8+^11xDlckNuStT%1Sd{%M*XHSgHNB&(vvkGI}B!p~zIt1s(Hw z)7~kr($rsRqMd@&#b!!|jx7Eb;{I%pe7CQrn{D=ufnt^SpMrM3SpqThR>ny!{wv7%EXu7*tH zhLQZJ2>Bk~+183)ifkLk&y8j9A**>vpo*HJC?kY>l;gy;4!dP|WmgR)H7U<7uV!2iwr-Zsgs2 zBBOlJ?#o@U(KW6$j!7rEhLvOajIfOxK7>i>?W)Sr_J`pgG8-T7DLPxH>b(VBG;`Z*)fF|e zFs6t{P@fMRWcDoR?a98R4OZzY+RhXcY{nA}PgC~}+L33p*!NwFZ&OpGGN7c73jYAi zxt3>UX8E%d_0S1=%e*%o^{6Pe?R_1s;sw6-(DX63Eh(cCW8 zG_cSpUNHFbG>+dUGDxUL*BVpY_im?GLblztJrl|ZQYdOT$>9&>1qm(N>8fMe4o5zy z#;Nsyt4-mvH*Z*;lCI^nZMHRPhDTaURD^gV&^cA&SOK0xiTUa==?31n%|k&2Leq&V zdIq4F?F&DXF&3W2u!}(3v?ff7pI{Gke*)CudPnQ`Nm}l~XXO znABWMrd9{=FfEgh^jk`ndmYMv*Sd)Ay6xw`Zr0b^_r3oBY@kY6OHtBHDa3)j3p*^F zSN(DM0jXPKq_lKaYWez^yDyNtqe#{AT%x2jhX)_UrU=vH{Wk;Txvp!|P{DyQ|Xx|~A zaI?zhA9*z`x_zZ*HM>WtojR>~YUNa{xZb%}M43KxUlC;teR3uJG{v#EO?54OuGzDy zqrKKkK5J&0`83o*QhUkZEnL&PACSjyZF5fT>o-a_rNWZwxi&4z*hDZ;{l=wfmN{6=oyT z>!Q2U?aR|HyX{K-hq$^eb*#7C6ZoYnp-EM}nF(?MA5C@acn!BTw{I3 zMMp@pNa8b7a;JNXQw8+!=4j+p{ET{Tr?K_3dfCm^&3~%8*h?x&J-(t8q=f$fc1Vwc z0}u5Eo_b-nb`I6Al6!vNsD*2p;ifgkJ~P8Us!GU%KTxFV{{ZPnO=&E*<*nNEvm@0h zY0X_wrvZPu#DARs0NH@+8-toQuq}*?a!TgyleM>o)V+KK>t|dlL4ru$zS~6gQnXL% zIK()!eM?|`^fvKFNxHX-Th`fIwQTUjX`?>|Cy{V_y+mchJ09MIs*QI&K(_7e)eW}W zZiB!LikiBLsG+9}-k^fGBkG{&7V6pb)O)QZvs_I)HL`M=DjLF+vIFe7_58Tt>2XIU zOPiG9LB*gw8QXn5+PffFEPKT-HJtwd%BSREQ6U-15gdweJ-HlxHK%plE<2#qZH={m zukor?RESyUjK(`LkS`Z({$PDHYVMb4Ae!H_?e!L_NDeBh5X7_R-GW7c!2HVRLiUAD z^0(e1r`y*3vs(o0J|ecFn}qEjxG}OJW1r?;{{T%9CBE{TeG)CBq!*2=V7u94y*0en z)GJiggq|t=J1B1ue|(>mIH+-y{{wNgtt3o}6F|8OZtSzx!`>7pHsQ zs5?__?aJ9IZaY4t*3?|-CjS68ApZcHS8&0j`0**puR4~ecKjpt_o zcOld;PuCi&I?KMTmtFq=EPFd+*27?+EFP+|0PR@cKf-%{XIAHuzz{Wqt8}`H?3>j; z`AXXtPW?o%nM4s2aO0_X~y3Ze6Y0hB~`dB=N`u?0^9o80iM$B5DyB?{#K z0DHM7^T_;$pAb88kue*MFV7C4{h4gkGj1yFuX6DzA*hm}q>!vGBf&m@F%93)fPYO< z-4eZ4*|%*ZRGW5+;I#FH)8b%~Q7Fy|WkysVp1acR(EZ6zM{=5n;-d)CD$+EbF_1Um zRW4L<{aoshhwR_gos)BibJ0=UZLlQ5b*QIRaSWOMWdM>tO&AC_WG=>Qj?TXA${MZ7 zY^tScAYTHWwHYa(Za#`T<$k!%HCS&=zhBjTulxKPm?OiApJyU3`Z z4|YuawQ}_5`$c=OB)f-cLlt3xL9UKPZ;0*qxR5v>d}mcQ>#*(%HP+!i>z*pDs;p*d zuJta(Fzas8miZ;WrgsWGt8sRmTk0y{bb-Oj$rG!N zEWX4I1K8(Q)N#nxVaxSGw9qB$S_4N_OgO4WN{G1+a-exX-UmwClEYQDyi3gu(t3(H zPZ>o`BvU+RJ-E7YAMw}b^@r`Z_J`^6Qqb-yif!3ww+{#5Zj|cI5PA<80DOV(ldD=U z{47?pYlbxGO~Q(*A;gM$)RA-V-GD#1I;Y0;ZIQgIo2WG`@;!Y$d)C!4xK$5hhWK$Mm6NpO)+1*kR5hBNP&+a3P^Tzxgnn~VPd2+r8O&i5LAjMUTJ zoB}Q)qB9|HZb}qneoQ|t0IB%BB#qbplE*EH%dx*xI zpK9)(%gUD3u{S*x%BeXTs$2Yz{TLoY^BT<{k;4tN#!A8XmrlKY+21u0UiY5gtWH$s zDP*QJ)YoX-A6X%gJaXgNkSh`Hb*OATolk72tG8Kcw`GnP%#vIpsZmu(-r{;c1V|6n zMn1acs$Q>LYbT?wjR~h%^9+dymZov{Znn)8-{Q$%i&f3-WaP~NSyG_)`X1vM;H)deZ!Pks?dttdYJr}EOx9nS4TNmAWF+}mD~ zdmTS#w${RtQn?+XPYelVkospQ^VJVczBe~ew@e#b@9UUGndXU0DVziDBxEH!dS@p{ zGId;b-Z@MsqTe#=yYEq`?38f}a~jzug^SZYCyK~Vt`(p7i=UVn`D(Jg^_%YdTvT!1 zYNEN?=UTdN5(w3zke-y_?*f+Y%Jspyv#iua8-VhEXpXQoyOUa*M zW|HSq8x`Z~!bjp2eyqK; ztJK}ZwR@&JTok@1z#uTm3x|ZL^a+8*{{S#F5^0?~fNQaN{Jj#Sl(Q6?cjww-<8MW@ zZCZ7xH1i;-ues7ITq<~vER7%}g&xRqG3pMrZEmaB>kUcpt7_{mvKekGPZcE`H3Sbu zkswmJ^f?3b($3iF{YAp2n{(a++98smSyo6%o~4QZ0Go|L!1|B?)uVFgN^S{jue$<{ zvhh~}1fGrs4_G6u7!Uz!$6D~*(MZ(KIdQLc7t&gG`1x>IfW z0!6hgwGNaPn90Y9HA%;fFS!ZG=iF#_R(Cxfph0i zQ%NMgCDdOGF|9){<7mnAGLHD>6l*-OT!HT4yalDt{+`xyc|p2s)7{(Eew50qw5}I; z<+;5wS5Zok%SNDnBF7#geGaV-gzQV-L~HJsP0zZXih?LavDlFsIT}^`6%HM|UdQ`@ zgWP8tO-YT2WXhm18M5HKlaW8`?i?Sw+w z5Zk_O(bM|Pr_rVRw%Jiouo>Og?>gV_zlIP1pH4vibf;0W>8;R3MsHM;NX04RsPX24 zx1L8Y;E)~9$VLeI>e|9C$p`QGrjyhFQgq(GY7N(GyU%U0ZEH=o)oxhU+d=Tpa#0ZM z0r<{o2?N){jx+Vt7{1WA`?lSh&3fGRl@nJ~c;DLM_~m-QWcLL%F%)BPP6Jo zZHn2xHty2fJ9=6hY)elKMb@&SM5(Hnfy)Tqa5MAI>7d(_f40cn_4Ri6&17utO*K1G ztE`GWLo0=mhx$RZ_D0gs15({=!-_u!&8Dr}mkUPCxz`=Tbtx_K^Lv_cSZIzj90?v` zl|FCCll0U+mh|&=^xJpWUh3qKSf_?q1oZVPQfT=3ODueVKj^sp^^Vc|LR!)qnj3Dy z7WxTDd1%^cW{yT4!C#R;euQIB+g9mq+&4OTAZe(ft^t~mG_yrd^hX$wAEpkMA)bp! z!TDNa7{`kTDIe}VuXbZp*V_)ypT%~lx<*nG@t@_ABv1+ZBLVYWAF$iD6mUH_-aFCb z4TEyE+lt2_`Kc~B1M(UCwC~jWZCwq*-*$@EXImw>D4wqIPbFhvNw?%KqFB&g(t@Q}dkF%&1^I;| z^Vdmi{gqH}H$B%cR_ES33b9%-LvEo~j|cfBcXnn2obd9Gaen*R( zAEC~*k)oLGX&{uIrlt|+7CtKAyTj8O%8E()U)BpPEevV}OB=M2PayYE;t_>EUi!-O z)%%^VZ`RrN=TWRXcs?ODG*^GTDrytlGRnmUet;cwKHJ|kSGssnEb1Ei(Jzv%hztah+<9q)APR&Xrc~!AiS5#C~H{}sve>~$t{S09H)`^;@yN1#^ zvbwtz_QivK?b+@$_Ii0|{?ZzBjiUj4zr&9T<3B$7q%YrU-RpCtJ9e7&LGTexBhk&l z{vr-X&^UaBBl%87x)S^LdfE5=qaEJWv^Qr@qpnUq4P9WVmaq?Yre*O+`WG6iW&0s* zYMN@9?YrvQlG3SXhOWm~MJpeY`PdWk(zN~^rY>{nSw}XeZ~zGhYjvZn_xBq@%X@32 zvN#aX5bYFepEH~=@W<2;bnQ1)sjPiOwnt;C+O!wSC5{W)QP8|5yb?J^vPT@!Gkn?3 zbuPoOsrKgGsj~FaYeZMV;M`=mUZAF_Kj;Y96UXRC)lqur_fnzU(_EI*8dTI~NBh3I zo@H;IStTvs^49UEjwT+M0G~yaO)H){nO~tBV|#7Rt6VCro0D_V+ES0hk{gAFDAuM( zz{!TS%xnl4#(1ed`l~+CJwfOlUGA3Sv#z(xuIjfZ-E?zWD&wQ1P~C|NVggKe$;ywe zxm#x3I+L_-4OwT{RnlB3L0=pWD1+QGs<~|ab+2-Dp2ZDxw%zH{w4!hB}WQqU=7IZvCIp`)k)pcb?m5tA!)ET&njSER!{1@5Y`Q zQ7J|5?77hUhhAv5)v~U-SbsXQeKD>vlkE^HHuSq~ z?Xb|n%Ms0Qw?PE!81xKA2|t@1ds+5@+#8bDNket6nA6&$DM3((i9CPn6OeyQX|B+Y z094&uS8VSOwe8}QZ_`6%>BK^gDsu(8+_e)GrX+uzkzkN0ALzDQ>#kqF?yjlsn}nlu zK}Tn{3V8}gZbqj`9sLPu7`wK8iO#9l>J|R7R`D)#faDUj6=?Ce_sEd22l5(hux={_ zV1^6b`)|@xw9Cn(xA@Hn_avey{<^kl1S0Ctx_$U=6F$>>)kPe;XLnW2T`&poZ7hyL z5Oac9;E$($4!CUH>3_V`Tq$f8I+$stRF;|=3O|Td9+>8=bNXt?Tc=0pc9qta(w9rB zMxHE}$mOSrSlx(#g|+ zk~oW)+?0|S_w8{^l-ors8JBWUQ$lGW9t{#uM@v@>XYmlQ@eB{S3N)c|+V_3eeyOga zv)nv-6%x|LFL=Hc1~_&AkDwsv$5A@!_szlZ8$#IwNKP~i)@u& z+1YN^(JOed+#oEG0)Lf{b^ico8q;^#bdk|iM^8a*EhzIRfKVaMe6j(S{dCoK-!|&1 zRHColb~}6(j3kzzSJa+pKjzdeJK%o9T7R?_X)9@_wVQ9i(Jlj1*36PP{{U6|7|wpD zOeS;YEucVY#(n)8^o^qK& z5A;A%N9(Ir=F3?+)X-XNG__IFHA#jz5Q*a-%vs(=<@p?HC6jjAtEo_1>`=>eX2_(1 ziibG=09~U$;iHdJCE3bTqGe#ENVel$ZI+uZ>WK7 zKXo*fHrjcl^>Qj@B!4P!9F%{o2iHy(o}}Ghbk^DKwA9pf5w{rPk~oC0x3~GFRU=dF z7yaM3s;lCo+jW$c)IhMQTD(%qzu)lW8DI8Xep=ZhpSO7w5Jt$)lpLkoGVPmPs;1{_ zRrpFr5VW;VElo%{{{Wgi0>pnHbi)|gcZedo+o>-#mE1&9c#wEki(aps%+W{KeOg z8IP`fLg?L+FRjk*-29SYpUBf==WC3 zGpt$W!am^``l-jNoinX%_O(-WZAPu4sj5yj^tmv{A@}?w1N74kH9aoerTfnD;8ma= z92C$XpM(2yjFPzh287@2y++_qQY5m>-0Uu7s^Va6g*S6O_t23f8 zWRyml=eRGgPaV!WNv05z)f1~k$OodC7X`l}aibQROC2&z#zRXr%?&leo}Ud2$?6>W zlLzblPOED@PVTncKIpn_%9=WLZw#803nWeT<&N5Rqv=lOsGQYQ0UZMj$vkxt;uSvZ ztiT`BKbEk|4%U(m7MNrN)n!-?_jVA}Su1NO#Ux7vRWMXZ8x&E1L!yD7^_hmgsNFYf zjjBsd@ViNN@R-dUH5UY)Nt}9kf;Byd@2Z1%K$~W2NNw>_OexP6o@)3cie=BQf}jzr z2E%gbwRohdd(~Av!DC+?DCqoJc$??t%c=Z>YaERspn-pq*w=1#9#cfG2H~~P?i<9m z_}ZC%7*fqdABg!UGtUR-gZXK0^%By;C6bokQBE=%3aS$o8ZY-)#$qxLkS9)->OH-6 ztoUf+w#jRmax0droj{ZO#yPM-`UTRS>e>`^dzL#@;Wy6Yf?^&9k;F7SeXvoO{=jJw zKWn_mq-73NzMcKbi(6lsdojGBq5lBHO0?1xKBO#-A;;Bw=(P6Uh*?0|`-f~??=@~b zw;Jn%x(|{SP*3TBpm*)fNn{zD*rkPd+uKUeJTuglwBKV41 z=yCat2-Hk`+mQ%Z(^P<7Hn#n_-{8657Afn`@#3MR@e&$*dw5}3kUjZ#IjlybG+3R1p6f_sv?iBbssd(8R0RpF}~^$x6QY= zDK!RT|a_L)9!7 zGSbBv_EtbLe;_oO9OIfae>G>x-CCDhrtYn$q@|&;)YepO>VrKUT|rpor*D4?!-<`N z9lXT;dPUrur>QgF?mLe6X{WT(g+4}_TYWLhai1>>Z9JfkHWd~r{7lEx;24T z8hL6fl0@zJSg_#d^ElEqZsdyi(pFXN`u)vvR1rjHtIRNg=y*jM^ZiNIn7kc@x6Ss4g^_7fkIBQIF#N`! zEf)HEw1VL^x|Tbv2uoGkt|dG~$8p6!hEL=*qu9hiZa-YA8jbub%V_RetNp<)JwV-^ zFp(|Nc=1?vU7`w#s+oOA60BKXN7sym{WMbl0M%XJQ&&9|<73<{wfFk8HqErR+RJrW zfOZm>kB@|;dXl+5+N5^XWf+<`HcsxTSE!Txs+d+JQm=P6U1a|NgxK8eyjR^R^>W{M-1h2vJ;_~5v@Epz zg!I-Ws;#J~lz%L>av^yS%#w7Gvv1uj+jMO<&)as&o7FRz&2{p53v&MeN5xTt^g6k& zeQT=R7k>+L?K@Y(;BpOAs__x*-WvFa@?)%SJK}=>0Jg4;Z?ReK$RIEqV%va^kFn$w zANRASL*sF?${0SW4$*ZE?d4XoZw>3e?>4Qcf8TX>$nJ9pvq+HA(^Ia0lO>u=k7eVe z?akBu(+D@DdV*}3{@YN(>N zOXI^$4KhSkhv7WX@)-IIYR}z2Y6&YXM#t0smfh?tQ$LS-y3)kI5i@+%^0@rlKbD;) zx$-;uS^X8V7BEwSr+O8*I=j&hrHU)=*uHLCW!j&^x!d6r$u(>*^5&e5JwWaG`|GCf zSJdgo>QQLe#*1mzQha5mnposo+DfuAMi22LV10O;AAIVOt?S<1qFH_mryIOnJU%~o zjnL~~Gkcbh2=EX0aQaMx?IA6;hPsjZXL@KVr4q?2Up!idaqiMh1e{O$oOR9A=%1{A zQ()cSJpICW1{d~V9PiRh}8p`Nah1zpZmJ%q0$O0Y%Cxd_bv0G_BC{{Xgz_O)Auw`gp0 zXfvk@iu<+FuH#uGfAniMQ^8N9U}-)*+tm%xX{eUdyKPoT<&emfcFM>p3$gVqLGhgb z0IbBF9DWTW8?;afUe^G3sYg-`8#T zbAnj83Tj&F!%xf9b6RrFSMw{KI&HtTKG~zJTNdrOZhLCet|)l4lwS*v{d&$HADS`x z>v1}W8BEW}QW7DQ=N~ex3!mAep&M*jE3O-Fa<=5Blq*j~1QfRU*Eqz@1m>T`ALz7s z_gys7bW>|=&ZSlEYU)pkr>25BiZp1%X+_L`oJb?*6opTIM1h}Qo~iHs`r0m_RDa3! zUE0FbQA>(S>eOYLcJv-3lCK$m+F#3B`k%bM&^-^g!v*eoiMBm@^NnT_H5V4{7B&Gq zKc@mU&yn6CJGO@wrZuoeFab}y^QODPZRKa&cJ1F}-!(H%%}{SQXJH>t0 zhOR3hfud^aqa;wohxt;XQ<3@>I+JPY2G!ja)b=~Y9CBHq94W=dNUCCCpID2IN`KP8 z)jgWr30r~t?yZc8#@g(wFMn5BH-_Nd#?yJTLTzarQAI^`rIt!)&~|?f!pY){ek73R zN;JExt6M{B+%C19Y3aL*)RK~l{7(c&N ztJ&mxX|E|SYVPgzx@ziop6%&HEyZZU!ArUJrP8v6UjwrWS92S%{MS)0m3G=_uXJ=5 z4a-^mqLpX9L3^Wyo!XQSG;y$+T)FmQtE-CD)b5$>yGvX;y}GxFx5ZFeDu$)b=hIO;XvG1)y1KNBRo2aiZhv;%KDQY2G@WB0fiiu^jOo zmwzy*?U=T@&DBeBx9*MAZRzc{MYqL8a)iXw#(iUrVgwfl(m)jJsV(=5ZsgimeWPOO z^{(f(s+JKEmLnZXOgn#DasF_Ueww516b382b=!Kf?;Q9(EhLspWYNaI-~ZWg)3YbKZcUeQ+WV@(w`Z)q$??%zCh(<}7WL-sP7fUXxN3;%6YX2o z##;1Cp$%PbxhLzc($n(`Sjllj#I^RuxyVljG!ck3Wq*>jo77g_if*&P#$g{>`$8PFy zN4Ax29XH)wJJ>s3O|w;5xOR2s7V)61riOZT4e9|wmGAD#bPHh`pcKtyb zYme@Y&uV+!=YJ*Om8Mp<_~6z;?7Smf%xx86R^-7MVFQ*OSK z?yH5)f%4E)-IEYFKK>C7n26uSQad+pwlZy)T<`+i=kHk?;U zBa#~xm=6Y~Zo~;4PJdFmtA5v4-SK_i)=rsNcRjYjw`kx=DP)@CF!BC;-X(6s<-}`d z#QQ;7y4}?cvlhqL*E&jVxD2K`x{%0Ex28z_PPcuif43XAeWl{za-z4#93C8WKfx|X z&yyxV*4bkXikXy%rzT5&6m6S-xKr*+Fq5y_a*E+%3ce+Zitll#Wge#J(27nXS&!G<6{ zTm*%2{>HM~>9@LfxoEc?1+i{7Dh3R$Dx+v3Vfm;mbMqSEOQmthZhwCj)EcP&01>s; zTTaze(!G;&ZQn_?seb!!5{?@TQ&UDi(`O-252qi~N}ERUxA#QLMO)SVm$%-EX7HY- z;T=r1EKg-AAZZu#3##Jl_MrP!?z`-qE9t9kv&G>>NfiuKL08)nB6EJ9~=9{RIXdTP`(@f#k(CE?l6>60 zqgL%NSGs?>_Z0@%q}bbH+itg`EfAA+h~t=i;WD2Le_e8IHu2k68E#Q-{yWq|%EppRBP8p%-2;O* z%R}Up?NeNBmRDE~nf;$`VYglSn%%ePVVR7EO3N*LF8=`DR#L9r{edL>wA<6Jlx!W@ z9P=eDF5|VxS)i&rBj6e}9-Lk{hJV-OPq@`vF5$J@_9eozX>U5+yLPd~@Ru4&YiA0D zIKh!s7;y*YSn8a#bq3qDtk)U}PN#Ji_chKZTDVf&)op|7#hy|Z^wwYHuRZbeN9{oJ zS4=_D8i=ZH`!j3R+xGRo>cm!DV!u>XT^cV;5m2ZiU!e5TEhkAjZ(!Wg^g*|___&LV zc!Fy6YWih!{{TlI2(f;An0)ogbvOQjL$;T1)mi$1B~*0{HAPiC^t5d`C(=WQZ|HSq z^n-TocrJF^{^zRQc73aFKjh-+x)NHMz#WnlFezWm5vebRxs39=^7TO7S5eeKSG856 zYWm7A8Er`=I?GjG)I4ZpiL{>rJa`RZb4gwRwK z^%2P$M$4bb>#-YSg}phA{T3I!&UMFyYwfMKS=4QdMbtW~I@;@ckI+tv>dwsK zw(c=elW>woQoe^hy>#0zU2Q!}riRVdJ6&Zp>NQxQ+*a8bN`786WRU*=r+pXlh$PFt zh#jtw8X5SmncE#kntkI>vuig$OJyC5CXT9OJ2%NBo5e+c&j(Ib*Ikjice>F_)Jj_| z#)NT_jbl?(Ncr=4)q(k_BV4bvzRTO*yKzu%NM@(5v!kt4HPY6{NF71Q$dHBy^g4gv z{TJ$8!*YLZ#fH&d@kSOFqTEr56aj(Ux{`i?9dorF8KV+;zr`&qo<}y^x(j*l&8K*= zO=tMpwXC*)DeCGE!b3S9+?F#uJipfCrMm8|^we!DPS%g7cgvRPH2_I9#=01zDeg@~ zB}9mRKoWIF^yKbsvvjDV-F-F|*e*e%nx^A*5F?ZP+{okl=Q=qYR-LPGn!{7NthEqU zD>6{9lCCJh{$R-$nEiB@M+T7GWBjMKLR*y=sg&tS)H`jLV(p6!o}RRZscJh_DoCt- zcuO)fx95#Zu-f|Lv+uQal)KI=jkcjoYeQdFWD1{AO&K}*05z3^YtOi2tEk$&L9{=? zsS_K7vQVr8JBH_yL`;8jB>`XcIM$eaMrR$R z)m^{eqRA|6Cfe0#Q`veEEv2fu!Ev?PswxP}EqtO_8|INe85n&E<3%erciAgtRZ>^Q zbLw^e8;okEmf2dg^pzR(EU{sfeGWCs8^fkGbQg1Mx^)WMSzaG8(Awh@wsYvJjM&w) z(@vM~Y6=w_s?w2J3i4&Ib)=ow=BlK>^cvLdR-b8fvQa<25`cIhHLIgGZ&Eg?scosZ ztjBCxsR3B*^W1(KTE%a7l17ui*OqnVzVm3X?;{KJ+3j#i%Z+t!!%N`j`QxeZn~?ti zSgHEzsD!zN8#XpdW&f3jbiKzjWwfZEf(aGZeA>OaL6Zz+$+m0 zg#LhOy5h1{QWpZ6^DG1iX{alzD`jt%OXZL3G|5S@dbPSNan;sYsp;Y4h?ehisGyQ1 z`6vSz*Pw$*FkooUB1Wzqx6n%Wt!3Xkrr$j)=M>bj&tB+0lXgM+ zome}6pdV%%Vj8)37scHb{Ipe$Hfa4V9idHRER+4gFi zHPYcjyJ4IB?6&)zB1_BWUKR2G0DTGR{ik?t>0VBk?HfkkoH1&O+3xVmDf+RId{5Zx zsqVDBJF{Enw9)jYuDM(g4WDh&KpX06szl6B*BYgu*_Ipj_NS)XJ0qxjdZ0fil6$P? zA%p6_4FVw1+)!l53HT+ovd@6SNt$<(Z^sNv;Y)tM zJxnz(^6=OORsOnH-QQ&zdv?&MzU~ukrn}tZD@$^MT7ye7e|Y&kr2TcA_@n^s0X*m? ztFn)db?TBpIyVS*0RT67;${9HP zjv$mMAMEE>k4^e(Cd=55ciXiySKh0m@>W;O?$Clg2QEMnu0y(PZklxF{Fgh|Qf-lZ zG03J`jxs48%7*}cL4RFX8*lByJq19t?fYc+J1shJ_?D)W@gv-_DFA+%*CYn+Gz~4X zJ<>)R(mpAo?e=_q)pDr0bt=AAk;!&vsg3dV^D^W1*Vb-|Y&%^v(d|0xtn)5Gid#ID z6p|m2Xk*I{&m&aM_WO9ew|V2J*)%mx6LF@if~rWQ{Sfjjf7Sz2EI(}lC5B3QHiqyu z5;k3_;rOO;^760Hcx;1`4%=`y&QYSM)g7+kdWqW`3zy>TFwr z)Avr|bmJG_F$e&Y=2>|-@9&)H6aGi{e6ZC&PxrObvZ@(52qwDJHJ6F>%gH=`pG7*5 z_*SMzQFc=usD?J#Pe$!y+50ksY}f9$xxgF<9(u*5l0lx`g+k-<0BD_V=IGU3t*v{H za9dKYRLaX0V?9I*k4(F_?x#O3R<&C?mv7Ro*QznL^SRQmKf3ntac_wK0PESBM&H7P5jYG z`uETsvo!_2uW{aYe}gZF6)i`rBUoD8d1r9st4tzUa8#rUAXR1-1mB0W84L?HC4L!8Y#YyPU$BT`u@63f~TSz zO5sm)wp8CO7fBl_U1+&c7?UF1i-M6OGpsE{3X;WNk?R;tFyx;0py}U#CyfvT7JO2Qq zom#dZwSPve@>5Wn`>k#N00APej?lAA9QqRM{m=V4eZTIGv(?s6Zfm?7cG0nyjZH<@ zaNFsUSwQdFJ_{*0^x}VAV{WTl*N&@k@FiJx-k0$q#`Knga)T_@>HZ4BUhoMx)x~4%aw`$9^Js^r-W)jUGoc(;? zo~&Cw_}-sp{hLm^>u}lVEi=#K7^bhMyexqK0Ci!dAbm2!NbyncY3ro9RNnV=bTs++ z$u2u3#7qaO2?JrX{^uX4QIdLGk z0e*uivb61>ZA`IsD$n+S-}imq+y4M?*!I1upOtj**eT$omNoCef=UAu?Z^}PXv9Bm zAG2+u;$Vsk_0lVE7;UXBxgm-$zUsW689w;Vwr>7{SSRW9ohjN|mOZy_x5Q_xNF++R zYNQ^_q(>wF0K1J-9X|UQZXMkx`CKvCt#pt70Lz&ussxS)rwVYqnZG8+x^LBKTFsn# ztc=rYiQGmN*}1;c-4nd-8eXPu3VqRSl4@f~BymkpD5i*x*&+fnsI& zOSdc#J%em-8Brg#O-wZO)x+q%BRr9()MHpRI;bO~87a|;9sdByNh0<3bh0V8-ekU9 zEtbcW4s^G)H8Q8n#APe~(0|iT726x7T{NzW^S64#weDAVsqqaR;_}TbB#*@*XL$Mi zhX4krZ*7$(+_OgoPWFz?a;pmT(MMP%s*L>PoPQPmpe{8~Zf=yxzwRqT)Lx|6E2-5- z8j3qti(3BxOvZ}&`nfuhYhg6m&3uz&(weyWNfwQbxcY(CS}NN$P5$e17X+E4gK$tt zFb+vTg%2O~S6xZHZr9D1y;9%1x2s#F5=Sglb#V&COaM7Zk5L{^*9TPQ*63$Ox^22` zJC50LxyegSGMa-}@+`fNsf|o{AFF;^Qu|)?jy>hS>9?;>>*%U&R}@4u%T*joj6Pwo zz<&DenRJ?{x@6&VT@I^G{ncf5&8GhVYrb7YeYdLr0C?5GNYxcmD^S9C0sd+~<20&1 zfMZow@!l66s_rXYOcw32Y^I@~!KZ3^m@ZW_WB#23iAH{afv!W?A7{P$ZLF!Qi+S5N z;zf`Ab46Tgm;F`vV#FWyxa!xrSnvC0n$q{`72ee|lN#4P+@minXWzwkIX@!6opPno zXkt5ebK2IJ=a_-HxmVQtt9Mv04{zC)N_uOcP9O*bl7`23NX0Xpd*iXxnD(b%_pP~i zCEKW0IOwR~GeLX%)k~kGVl)azw;XD>u>FQox8Zt`d*6w)EmMyYIs~DL3yit%;iQo= zC@0f8pS^lf)*B5KH8$4i<)dtE1<6|5{^Ic^t3J{@8A^sexW=NmDH)&ka(C)Nrhgc@Lp-b&c+irrX}-_Z`8O{{TxU!qd*} z6H`C>CMEcFKT_J|3$IQu^xKju>e{*rtDFPHj6rv#Xy*A2Oyjrdt0K)`Z|VNbxm{_t z{ENG7T~De_M64GaM|i+XO_C(QzVr%&F>kgmN@_eS|fb`#QLIo!jaLx{Z8HJ7)6_RhYcHEEIk!wxs(=rs~^sQ(4n?+z5QsPPO$_#u9zN z_)r)3#)x$LcUo`zrkdFoRQKIAVgS`~EU?QEjCz^D@bIJLTlCe-wZ6|CI=55Dw|1)D z_Tm(HZctX%vb+BPsDYh`(E8uAZqcRXWudh0IqedXwJj7e(yNbh%wTC4f3>CiMw4;a z%zCL)ZOK7z9ccSKTX#{}(Au{JaGT35(hEH;LQgI`n7BHD`IUV*+d8Auc=pVRV6D2` z<+fxZ3KpQNkNp{5k((>^G3j2{_IT;u&l8&$PWE+KSLYpF=Id~VWd8tE#>zW>S}_>e z7AZz|1%lWrNJ`)A-HHm9Ut`W$5#`7FM_KhVX_(#7Gwg+?Qby#xygKeA+d`{m*e~sP zi!SPF?iG=$k5E=5L@IyM8P=_>*3HRtOMQFoTN_c_44nmAlWiD=F%U%oMM4QdO4^{5 zPU&XU2x&&w=ui-loODUUV54g^2uOqE7%<`kqz0pNxcTiT>^Sy5aX;5}o+_q$oKi5! zz#^H9AN*Xh+BI)Ni%l$x7IPkY>ziHVE5XDR&vSP!B}E`3Y#~{!3AEZP%KcdWR@dy_Osu%dKN4EQ zwSsVHMe~WKmJZL~--#iHMHg?o3uLEBIYNuUuPc1Es=qvj_9_lx=C zDH@g%YxDb&6HnQ6Kne3%&$0sA zQ7$ykplV2t8u{3Q<5Z?`nEa~L9LJZ>riI+RkIle-^UV~c0G?LYxFA}xcums|1H4Tc z=`G^iAi;#uuL6}r*;j@}1{o~b{s|V3tS(ap(cI{dGBn19MjJ9u*zd=-l@Zxes9ALb z#XOF84eY_Q$3LQ2bc9<2=OwH;%Cq|$5aaqYlwPsf8xn7?j{+d~h8Is{tl#il^_AOx!r9oLW!y(g1;7Yu?%nhj>?J zXRy3}03DF=tm1lUp}o2?$2Qk^-TQkX2yJIBO}XJvo}k^wk8psa8JjfH(-kcjZYi-@$@Q{tUb(Nl)z1Z*Nwcw<PK@`0D3sb0VtT|EM?rQ1y@Q zb*gnS4goWnwwhzH+nELkRCQnZM?%GlpMTW5dZ{V*0xoNG z2czX76Czu_qH3@TR(R;|^`o6WlK%3MR%_eT#g9g_uwliy%P&CoCuy66|6buhd9NGk z`eUD7B9=uy`}NDj?uY5YePmb3Yp1?fL^5Q z|Dn38y|2tp+HZKyD~t7Zg$YNjX}i>$eLIgh^m!;Qt0i#bV`JT@)ZC^fzXG+Y)*i98 z_Vx#}$>ME_|0>>I-~|>@w9fM|PG6UT7X2q|R4%ahWB}ibMZ`Qu&ae7dr*JABB+bWF zStHa1($Dio!KLjErx|diORed{lO`jkkT>d7OU?$}j-$*cISB)mNf0ihtiQiW$PAdM zz&_-#wzwvj)LLz7{TaG<^im5Y6Sx9fryp$!mRbanuJziFqdmm;+C-hzB)&A1tQ)@H zq3fr8X~&c;?jGSe%XyRX!42nh#}J4ss^G;xlHLrNwetT^UOLgO(GSVh5{ivnKf7h; zb{gqEJNkRSeB@*F%|z6n)$d41<7+9_I{1VxX*Jfk_L%1QQO{!*RaQNHXsb0gUWdF@D0mQLdwnS5UZTN96^QM4{fMKc`Q22D9{n9<;o~O!DRC5 zv%lAo^fvVyceF{j9xJ>RR$9v$0%bLiudNd1yY@XKOoVuRO?RD9F~M+SiXH{!Q>5T( z?#=0VkeG!UqbPxaaThTN{rmgrxOVX4 zldbH?@LT6znS?eTn>{Kc9^QwIX|%M(b5QOFJZHzWvMh%n%A@I}+OKm?|43Q{VdZFZ zr`le(%fzCCYqm6h<)=$}NdwBKte>8;R7cAw`SqJ2ZjknS&E^77%NOOEBb)3$wx4#` zQp*VFo`9d$pzZ=Iy$yzrtY(1+LK*+d?6FHQr=nT4yP_0@&`$v?s;yj~T1I<~?XyCa-u@$@@cC~tGdjyA zMZfzqV%BuK{q2$UUCMtXefsD#@f_RTwBM%&MfYzhp!xf~e1cqD(UBSz0}l#4S05&Z z9qbj0+ciKFGmQXKqmMqvj~%Czojp6e&UF&XJR&WLqNmk$rTo0Y$H!h)*@*K0N;L6( zyOJjx8|s6cBYS54ku(gPS1-{%Hr_zY%*bat#qJh4PIV3e__4TK6)0z)#ogAgNoJ1~ zG`U|eHJLnlgZtRpgTqWN&Q(xOuz-i{RISS7N#2smufBaL-*+aCaC$)is>^;8iyRTT zaq!yT7BZ0ZQybOP8&>D=Iq84+MFrhtaGge7ehhHf$T+Us=*|NK=xb~0K0bnDtc`>9@$(D!d!~Ydk6dEx(5U84v#N7$Q;ybw zWDbY<5=hkFTCGIW94P9Bdj4Wu4xaek>)6o5S_Lw}P7r4XH0?TU^NWd(w1yv>Sjejp zRbo;0KTIF5oP}dAuby~_Y4%&Vc5#7t;B5L#AI^GtPX-DNjW`T(v3wy5{}Hk9@1_js zDD$r4Vv@pG+o-zs&pb$vb{w55%>73>F#88&xUxDVXQvo=!toXbE%Yfn)0cN6^Ekdb z4#%9PAv2s&u03WEp>BJTEpe7KBYu*X?EzJGKU2TOiU%tlGVeCq52dfqs6UD<2E9rm zV@Y~`c;gheoI|+wXb%oiFsjlyDH3Xom5xvoQEw4!`kN=Vsf&@=IG=sn(5fc%{)qN0 z-*J4(r67p3K2T-H)|#CAq*i*Hgjwn=3-+4!EfO_n_w0m8+jgS-`5D7jXZwu#ly9pX zElqH-FVTV)$)b^K;T!tHEuqG^(Z?Xo=mqb?Dq-6r8ACFLoDCQP<`w}3L1d4 z)XT3nDL=ee@~TaP@)o+;R8?y9k_7ck0{ZXEBfaP1w+bgcfpCpUcU)fuqvpBTi5PtzRVg+I)zpKKz- zD%btySRlR3J^{{arN5^9GC_GND2=5i#5*$iG}H-+==bad{K6(r7xh1-3T1^Oq}$#G zU<4Ny^*K2O|BH?M5ynsySgk?TLX1b3?G;=gp2}(4v)VZXYr)Q`{|=#{6Nt6%@5nu$ zj#Nt3ughlrjY?`Gl4Sm%pP7igz&7?cH>>7f7 z$Bn=(Q(YE?d`JeF3mOQ> z2GJpI;{iow{c?9D4+3MSvlF_$%Ny)$#!hMooE)FiiP@XpSZ!BaZ zqF%lKbh-&Vd)3us;cn#Gr%PeyDtR)Sgn@0j&zM+jrGUmLOY+?d-XM>A@BO= zMP=k7K8Kd}K)B41tXzTI@9`48E6NT_<KZ(pqI%^Qhac)NzmK zG>MtPysLm8@8ZL}88D3a(Nd!q+2+p98E(r5G)Ls(4{X1x>q@qqN{s&zSe1zxnls@F zVj|%=9vFORmep8EXQKKlc+r*aQ@F`yW$Xv12QMn9sUB}*WRcDI*2ca@#~Q=-NTp-e z)E;HafJb$`D_NAke^DjFxguuH4nf9=C9icHNl}G>K^!56 zZD?aJ-CPS}x9z@icy?p|Fdooki1XlqJN*GAK?lq7r3hso*%Yl zXzT7AWM;F_sfbQAYk4wfz;DOqa?#7LNHj+@Rfxgyl8Mi3mUo?tT68C8?yRA!-zoEu z_>NhKU)h}K7klU2{gO<6Q?zL38UeapJh+_xtn#phZ`TP{Oo>u?<&lztiKIu#Xrr|| zZ=(Url2tX!5)oj1T`aD=gJ*XmzF};2WP(3F?>SkQicEUNjs1RMgmcb#gR>rbr7+%w zItrLt5RCqnYjmk!kQ!pvY5FNWJhp2_Tj}L!)yI`Gr~r;vjNqF)8I%cRAwym0DP#`< zGYs9O2AeKNU8~DoDO$Bq?Me#hH<^hVl8dYp7l zEpF~_D{#wy=W}>oUS3MlKBvj3kj<72ULuWonCDadH*c= zeaHJ)Je{O-ei26WprYj=#l_%dWzDO*g--f^MbEI0EiGrvZ`Dgr(C4K3pombho7}wF z9gg%3qj!tRZ_l36n1x0w`rMF?C+jqf9~>Vmx`j9gAUFm4n-&Gq=e}l1I@|G8-K`D@ z)_tP-IIQvkGN8GF2N42vy9pc)UT&a^O-_%UrKnF8JIyLRZ3v3DIYk}<>wHDFkb*0_ zq1R=VEo?{Gd}fc$F(op~j}$#2lZawhiq1}PPb(O-co#nnT}xS4Y7wM4n|XrYEcte4 z@LU`!&fT*T3M+cf1AjXcCSi= zD3oxam~r&~J}No+mge|knB)7JOo+KTd*|6G{37-@(V2@hzRWe|UG>u`?kA2>=934M z540+)b9@4OW*%UCtG3EK4+7w={Apkjo$*Hs=y=B;^yibq)lqjkMALGGs()T zGH?+8K(veJV?~1k&Ri}B%b^yB7eP?CrQ07QHCfNeR99F!jOz0T89L^2NG(uBUE8Mmi490DbuFYmPO%p17j;ju2hCo~G@-d?~6Sq7bOu}=v^)SwCno}JxH?Z0}jwUH`*$6zH!b{63 z?`jpqLZDUavQz2q@;#KI+Zl9^w}GlAj)yhmEtJn5z33Y_n_}TatCINiQE_7-6tSW^9n!$PMAPciX;;bXCpL zD+~1F-Jq`f0XiXrphBZ~o7&qdAGUWWL)!{nGV&@86NUxH+7IzPeiiX2u&b&*k(!_1 zUSNCRPhJq zl3JYCq#9PyWqx2mGp@+Iwcpg-cjxy>t%6haB0WVXsX^*GAL6=g6$FCwYM)+t3f&{3 znuUsUnr#>_RS@H&ATTBz#hDu^02uhxt7<(y>C>}2Xph>JIzhBO8n%K z9BnVJRAi84+WP1A;u_1jhG<~;w15~Mr7rXB@83Z207cz@B>V5LY4xuY91?JYB%;%= zh97gxn{xu15KZmYv)DZ-W`USXiTe$YOW<_XC_}1!E;QOp(88D(vk`fP3+0CaN-Ms+h8=yI3ZHjxp8e zOxF56tDvl9`49t&#x$yJ$&iQ3PKW%(R+B5xJ<*;RXwZ;XTIkj*FJ^#O2nzY{pTE(s z_ae5(M`ZYS2g-sMx4&@1x2Sn<3S3gov5>vO?@PX&cgKa(FT?1&-WL#6CLiA4ya~w*lJg80fm{+NJUG0^!llG! zNUyUbAciBq$1yCL1w#X4KcAB71U1S5X~9u5daw4Ce-5+Nvy8_%;4mdWh?$=!@3>Nu z3n%LNKbShrAEYWt!Wfm4Z(a5>5juRV+TKl~S2x@|ILPxjC8UBCIB)^B>%=^S)ry}v z@nP~4l!&izJ6aOh=Hb&HQ^m=AfBAPHh5FP)Rad}!Ncy1sQ`2q4drnodVL*7TOm!`V z#^HO~YXRvADhHk^mx`##M&QeW-6bOiOg(4NYJA%086Ym7h@k`OVGsh@U3=OAt4Lb# zQ&|NmCi=VURQ2)c>(ay`f>pQKg~)?O%W9t)PQ~w)KE4=L4OV3$bX!Y?^<#vaG04sG zYA)a3P;cPr+v&Do^{4oyKlOj>wZ4O?TM~!IzZ5nPnOc_>K|BEmyd!)Y_FPfqVGnb; zBc9zkIw53NYvxS^R5%%5GOP7Htvi|~rmV?E+X9p^!V_-jc0@W4oUgRBS=oRpLJwK= z0rkgNC<#(9o6X0f>w0mi(8;i?{&ui;+R!^nj*y+VI=QF+f+2v^!JqO{UZEJ_8l<&V znt$lr^F&RE8>%uj5Y{pA19Td6u;VLY9rDYzw5(c3O<(2+D&3Kv`9UUK`JrQ zwV-)n57r&0N8s}$3Cw@Pkzc^-M7!-`b_t)tKIG&`qpBjDuolL-%GYndyo-)`!~T) zfG!42N8`7-y-BV0CCBlb)XK@yg-vB%0A2l`v%ZaWlcrhzwL63nr^gk0%lTMVa7i(VoNorQMW#IoZ( zzZ8OL&(iK7?Cvb8J_la*Fd+Kbe=uoDJr>sm%5!SZ{VrBDAqQIIWtZmKn7k~OU6^RN zl~Q3@Zf@2wH=*pfqJtcj^qGpRX*PR7_HN^Poud#Rm2weiY&s6q6cEs4ulKLzFK^%* zl4%Qjj6drPf#pHDshuR84SCk5I`m2^rS0M~XNF1VX;l?qnD`F*&SPy|hbFVqz?~R7 z+nl&zLJaG5cXbN)YgAQ^Plnr}`16tk#<+g{l_Wb(ebu}GYI>=+?Onm z%cYK#ub!5Pk7rC1po0|Iqn>T}vzRPi+ft$=Wxo)M+XITcd2h3FZ6z={Lh*vuFQ`#} zGFWQQ&18p{HHX@N^3+~?Sm9RE$<#ypU1$?&y9wg#Twgf+!$Ddjtd~x@MW>I@0IG2J zvGhN?C^8*M*ws{UBBR!LMkJZ&zJ!pS&*CWaUB}0P`ucXOlxZ$u-#|{>yJOvE!P+5@ zrj^)TymwWKZR3Rv_CoPXXlEhK4y;IH({cDz7U;kD2<%TSIlPgQ01&D+YWHc;=q4CU z)~^58-@k`tneq?Sg^|2iXkVjVFyj*M9Gc1V+ls@LNqpJO?|{0AKj8Xtcl3?zU(p%! zW=nI{&10nA17_6=0Dws*#IwwXiOKv2CvKR8p@3;y>gjNW>t1KR`*HJBO?JAH2Qp*zQSu z^Etmp2=7_tJAz#{f9%@hU6pnFafg!?2_(t>*_U`sNYlWnqcmvx^UM*uo{#gC3Ep zw+RE26(V_~&6{ebvE2hbm8 zpYptnyd!_FH~%_J7oNC^a>hn|Ul5eAh}@yCE2^rpzW+CqiC{9t+<6f_U#I!9dA~w% z1;+kD3K2`1A)`wEl)x}5_7w!SaCq}d$oT4SHylxf5h(W81h!y->LEJ1bw|GpTPcKl zv`=5hJkfYyHN(e=Z;=&>$o{)nUO)~BfJfYvy58>3<>D(#t(FPD=bCKMM zCp(Y4!t9>0>hD`w&v=PBzuX5qHH#@e2K9!ARY|sLnKu={U7KbD*6Rk@$2Rzs;t=^g zLjSTvc;0TiX>Z&eN-85xu&biKbno47EEjRk`TY8CuuS-rjql!uv;iG$4?5d4gPRR3 zYJ}Vw7z&uCfQ~PCKwr)&sEfmuw?r7rLtewWXVDJ3<3&4$#kWm?`?F_{i-RJm-?cNF zWeD6%5(*aJ0?;hyUHHovBF0741-vAO{nS4yLMy?B#%%#psA~6X;p!m%x~|aU^3VNz zqG9O)u*{kp@uz&~WN+dj8kXaiNbRRD{oC7Rgh7aRN<9b`uPz{D{_9xb{K-J|n2fmq z@Pb|!JEas9?PbDT*b}b_3bfS-;u~kE*{gs8yR~s30KluAVxgs4i%PuBbR_GijLefy zcUa1&L(0nA#lQzob#1~^4K(J{NgK31T8S4r3q61~O6f(rWuFox*{FW^U^%>&Fo))? zdaB;#f(qoT)u~?O0$JA89@5pCj`{l?t-4O1Ym5HLmGs=}n(wX@+ZkK2H$FX*(@! z>Hg2qs_IJ9L6PRSrD==iTgBva&C7&=S?&7>u9YRR`&8`aKx-QCJ?%sOc=?yOZ}WJc zO=1Q|91{sg-$naA9GB{dj>@iH=e4>UNIfnJJo%4o#(+6Y$+|picVicCaDEb&=|l@I zlVMM1rJ8gGvn;?|ridCz0ot?ak$`u9ofN-G%f96xd_&)HI1{%)$3Wit`IDa4;`qLm{)OY}Vv;tl1L z7%dJjN2b=t(#87~zvf$yVIe~l_ZD+bK?f2ZPSQWzzVXbo8_enHO7cqEoBj+4Ye)dO z#lDL3t~)katqeGcT2MViRxo7QpxcQ735V86D4V)V9V%EMsPUkfWfCJemtQ8O+BV3d zBMxrot|&|CaZYGU`f4?Cs-pH;My?{l*>%tN$O-1iY6>)em!6I2>Z6q+E*bkn+cDZ( z_k@S*F11yCOF4g|xYp{Bss@ihx=IwI$3eHa1D=E}h;vWW?~>M^gq=HvQm>6Mq5$dzK2Q|`sL%4mavjRYO1M5YxAn&DP;Tx~X*xSmZ!6D6 zg_kEj8u%<~fcs1dWWj=t8$8M$hdMGHWStoRUN72I=P+z=PBnu$v#Yj_6Y>u*juCzn z(QC@jGj=nqpcGRrzGaqM<{RByDW48LSicaEoYhxlUVX9i*;-}{g3_L2j<&5Scin8L zPNn-+@_~LBF$p!W!3@X?5o=}cl$pcL&Q8sh%hroTjNUuidrRZ`#s(0ar~qV!K{4B& z>GrKFt_D5Ke}zG1)r>QNGp<#UOf-n)x+VkVkFM0gw)-2k0d%~P>!I<=n?*ph=d`OD zBj6)3a8E!Pn%(zjO?PT@`b<@L+4@#|f;J6>yXdwk8>`W@d+X!$^i*j<`9 z@3xRM&~B0jV&pNf4yZI|q9$+fjYSS&-+Z#^SP|k^Q1ivnMud~ z!F^;C-11lB!rhYix@43N{n@8&6BEKnT8+4-Tf>4i$98<0-awdxMwmHcu(CS-H?G1r z-Ceeg-45KnpV4r^7|c9^&+-f97HtCs=~RH#bG5G>-?&B z6)|Twm=1cCZIxdZl{pvXTo7ZvTF4LytU_C_n$tgX{+U;p>j_cW z9NGSJueHYG>|xQRO0as9>&k}LcRPkrbt4wGkcCpg;&bE|vPDXYOWRhLTvWrQKw_S( zO2ryKh#uD}>jPvT87L!~Z;~dlKQ5PE4(O2?} z8$M1pBIUT2(Lp0lS-{(-?coCAVU;i{AzV@^B@~|{=C-=@WYjerX(T+t9Ln4wqJ7>P zu1a)z{>O8vcuq?@vsewG8PV`*0zeh=Kh=#t7{q|}S1<1EI+tWft$J6YeMn;xxz*H# zsJwKvk>JDbqgOq$KZM3AInXhWM_r zQBmQy7`Bdb2Bu7B&x0(Mcpq={WvhJ~l2M`#4|6q@dW~5%MsO}NWC}F%U`wNa0gD?) zb!lJ+G6`=laG*a@*z%!U0@aRUtej5}rYNXUbHqW&aclKL?>`dem7I*rmY>FA7$2vp z`oO-ngQw<~4qEHkgBJa_%`p9v-=sa)xzbc{n2BY}MRSxgnQq|g4&FdNp)$f7gaP`e zgS%JKT^EAM^vdF%{ZT$U|=Qp+~>mGqPx{6}Ivb{jH5W?VY+``x=RA)J-7 z%VY~ts~BU_Ce$d(tRZINn|R!&HUB2PJhsV7x>p$dksae%7Se}s3F;lZZGrGe%*Oc||I$wXnkm$fAWAn8@RJ-qq^eg=BY!L=u^5@!ykOpln-%UHiKY7WA zPEeZ>H3!K^-oTu975}Pvjlyf>s^3;+-lT$oD)6d}5 zg}Cxbg0g;a19g}%v+>@@Y)-3hh#l8@4Z;L_cB2MQYMJD$Ue>7KzStCwG-lZ=Zx}`j zrfaMFSJadSUZ-BwnF;81c*BUu%kL+TLOY@oYP8$|^rM}9l~Udn{hv+IbD*D0_)FfaEX$>+JY0RX$qJLagiDcKv6?_sY`(s%Fp_g)NNK&lq8 zM(Q5bx=Kc`V*pOnBO}{OFY}M6%AP`j8H+;uGqdE}u8hSFX1-%}0eTy5#tYHNt70#f z{RCNz2pZ%rcNeviXx=55>mQpt>IE-L8^mccsR32neTS{u%t+haefI2?q&+14`J9aK zxENY0Y}NSmFR$~o#Vow8LC%EtqK$2ck*ObnqhtKZp_xds zZt(zQd-bt|(|8l&*SYhnueHV)#iW${t$XemAH4e_x(sBXY+_>G=v&9U;bhc=p19em zdA09doQ78qPv=zcUL;@8U^_5e^{>d25AC|^1jJ)M?%0rd^WxPSDns;9?Tkg~zhiX} zn;2|(J-*#S&_I+AoY7zU1yZcBPG`ivIVxWvXbIXYFJJQ2>_@9vAl{-mQHFQ+ToNkY*DCgRK3#qP#_QBR=suVkbK=nNfyMGtP)V)7g1TN8*)gTdrIX zy?WZAtTfy-sF|v~ zuNzVhEkoaA@rzX^@~LZE0w0Q@)<5f)b}M0zU&enDQj?gyH+jv!Bn_?!+C$tvS+ch zCg2m~t$`W$W?4z54N~vhAA+*J?>*cyUMIO!^kAo^Zur^Ypee#3sxH(ES^VMeX$fV# zYv)GoftMLbEHb3%>t%8{^uC2KvC~nRdxq!Q=`cG4$VY$=vN2APyvK|_->2`K3jY2m z!*$2_-11kVv#;WM=aWIn9_2Hnx!(DYp}`CYKIw=yR5D=6pOZfKMYr=;!f{Yp8aEiM@p@^HrP?SLVmV z-B@!nha3H~`n=qyVLoHVbau~7M;iqmhQX)!@)xw44jA)4x}PPq28PWrc3wbrM}+I# z=y>wax&(jlLWaSk%uc)g7-DHXz*U0GtH+_tOo`DHP6uY$rH2s2OT+5h+eUSWLN6(E z_B-+Z33nrQLPVOiOQ)ZF(!H+K>vCLSL-id;a%CVM7^|o*3QKE_AOoWYu*(=YTHs*X%T>%#%~{tv9RX;@;?UAZ6a&*eFx! ztifjlwrMj*P_W#|*38x5=^drLy*BFOFLejLqfG>j2W82dCYHK9m#kOi5%_(OHbsQQ z5A8|zdq;Dh;epH*7hb!rJ=5)l%vLLxpR!`$JTC*eSGS%}Q45_?lq?S;vvW87CGPm^ z9zJ}r1Uu;mWs7sOmT9}aRVHDDWQp%!`s&i>FLIIY4TW$L5#b3&4dO%x84bBvG$s zhwwb_D8mGW&!_JrE=7fyXJ`bXvR2pFF!v_Q`OlYpeCBlv3si(ER*hTqT_`69Xi=Lt zhgp4ZZu7hT?=y5(DuE$~SxVP^Jl=%R*6M5Vi?Cw4kq>7UFF*s{2(rPO0Hu$TS?IHGmIJV7U{cr2sjVbu~Jvw`&p{sck%y7qAFV)MJab`OrP(Hk?Ry)Qn#_l%npy@ zoS6u(DgzdW`iLEpT}O!4KyLqBDoC6b;lx`Et3vbx+)7U+8~10%{tJ4lO5PTFjf}Hu z^zqfDiRnDJ(Yqh^)v73AGiI>xX|U6C#*?AxXx%Cw1fO;X%Raq=64dcmweRfo5Y9B?#mqnKH6Can;Si6-s5CSEvdq{U!S?f zj!L2)CVuw@Vh`ng226o@Xbg@1DhI2oO|$Gik$M#HaWP3*!KuZ~*w5YcLQ1LVi)^Zr zvL@4Oy^!FwWz~r(B34afSoxeZ@^`Y|-~j_)IW|`j)4eF+T%K0nFcL1 zH9nTd8&ucVWZ?!|0?RD5ts}~!111$%-^e*GSumuqBxdT*3!Ce0TvQqYD@AF%D# zJ;1OkxFtD}9X4wK_$4(zl=O`KZ(3p!u|wWD)A|}9A>-n@UE-lp5zr-N*Q>M2_L6V# zbYDbyIdnWH+@Bk6eQaC*>Hb>t@8Az%)4%k>wNlV7Ze5uNw-HyDUv;}}MT+1I+=Ixp z`o2?Fn;plk7y3S>k}N`@dnK3idt%p0b~UB%R(Z?qHg)~#EbU_Kdj63VrL++gbLAS( zr*90{5#X{|uc45|V0Bjk(z!W~@Tk z8|vr|-W_z%Ig}t}Srsu<-z-{tJEEfvhG!wWU%j_PnfwW-qY?^}!E0IlCQq8B80_#( zaFIxkE2GI-pVBHoW3rQyod6e9+Q|~Z=LzjtKIb-7<(A9k^bJiB5-M6|=IC&5mgo#J ze$Vqe>gamyMpwcqvo5p^DF2?vlIu@3-{2oTF)&N*oS*BA5vXZcsnyXByuQB?2XI}U z5nw9q>Jk!@xfCgFGiR^B|09{z%GUj#0WY^r}u?lMwNQcYYC z`L{@Epp0TeaLYb^6;YPv!e}Gh6=cyi&Uz-R7ABps@NFH@31cy-(w^7+vP z8O4G59!T${?+N`Rj%J9t6--iD8^s=?EfNt{pQ{~!eXFS4i$V)}B`Xid6|T#?1NVmL zb>Lwa!NPvrV$ADmx1Jf^w8U7;NY+y`D&UO#Fx6+R!67S&6IwiwZ-Qcc9%`lTXSNov z3F5CD*WQA2xLx_x@!n-^89D8?Hw7LjjKw#MJNY%-%cqtV?LwqpVuc1$lAV8R{Y{i3DLc`9bstvPN zPwt%K z738s>eG--ySVdN+>HZXB-gcRr-~9Aq*+@?JxKP?zm$Cic-^7X+t;l^m5}@8{LzJ$U zeSf4g$AH@<&b+~rL-K^cDQMI^@tE2WT9xgj-rb-Yoyzt#J)}*`vV9etlN4ZXcIHZ* z|1nm@WXcndLYe@kSQ_yWKEr`knA}NMQaAezb)Gys?WF&vZYz)F>LM@+{TknEw7Mpc zqT5~{%(8*;`XgQ2zqds2=OHdwPJYW>auCNA z_SwU1kR_53nO-Bs_KZ*%U%3<&hF-Ho?529JanO)Z;amV`14!=}{!m!OyQ(H$yDvzX zu7FhD-%0$jKfc{6M&rvZ2G(5nm9oym3}qA2=Z+q(&_5cE5GKTM(0Io-y5M^-wy3lZC@J*--cV zch$qcVJB5=_^FFJ1h)NG?E3|H`F8l%r+@33?`DzBbO{fF(Q_-=W9yrBJN&}48}|ay zA;Je_vz3wFIMDm^pfaS0ee#RK*(!cWjCFBIag6pP>F1;yOqdLYAtCcR?AM&*XF9XO zu)}6Bb!;marp5$;pB^71Kg$W<_!XS!kf_K~J_At+lykV5+jcKpbq%QHu+`SkTQ+B^ zI63~DFnH5Cl_Ppq)W&8kdT)5yC=1QRX&=sQ92V67;0rFnuC3-Wq#CsA$D(#=v5_$J zPC>nOn&#`@h8{WmS(!8ETmYX_kWE4{o!Xs{o$+A$UlCA7w^e{6=>3SBU)E+gd){>n zvjJ5BnFg}+O;zJ0qnVH4`@P=NWA3>wmG&Fn6Tl$GXW8hYbT_njF%=@J}x+0QEs)FQ1vm{BeY&)UZ(5oytp|S(TLTjcwYGY*s%n`>EeG~!4bhy zh#Zyfxsj_HTodDL>$_7h5!WmTctaf20r`G~;!rj_zyGJ`JlxrS+bFIBT_~kms;Q!C zw`Oals#6^QCZ)&ny8uN8Ox3678<|b(|{LU^2w&B|FzN@^E z=XxpphsS_~g8Q=n*;lJAdJ~(kRgcVlsVf|ga*uLy6Au0i-sS?F2P3O*IS0b=dm zpApNr{kGQ~ymRU_v{@Q%?=@@rhm{Ds1pM3t@q3n0lFRf%jh({^SDmTj7MPCC&mXfP zs9r|agN>COy>b7n>KrZE&hSGo=@bJfO!1j|A`RF*0eJ{wf&pYfV(MP(G4$)^RU6Wr25-|_Hy zk++|g=Dt$B&=990$X|F{b_p}bF@Ftnec^KaA7knt%X&{a^tw?ILL`l!moZyDM(!oh z=-n1iPH`YX8!O#JuvoZpSti!#Ke{B%vH$22Dsg7ImD4!a6rb&(4o~!gRGcy3m_L{0 zaQbQ^$fI1$@Ef5nO;`>(QiS@BtS%7+Zrv}kp*<`v^N|T$J0blRc$7z#(2z3VqmHP% za&x3CoFF~^re?O}3&bse62=8wiH^+9z6{J-F&HigjV;CbeG~S2=;6_)hz8p zw}j7YO)`ekc$`*rkvQQ%Bk)f*a=z`Wx<5~o6E+_{I4>>pT42&{9@~xOx!Y_RQt6Tz zmy!Pb11LXxKqK+*^pNxLoOH}>TwCYEV8$S!?t$|>*MHQ)LubB5F^-$x&)D*imEm`H zZW)_k;8Rj`Kb~XORu7Fsb?C09uK}VJRpZH*M2gIe^ z-EAjBq;hcf?_i1dB`UIonmM%#QZo$Adrp)+TrqABXL`%NSN5m2xqlbk#GD2dDOEw1 z&(#iF@Y0v2uV^ke2c`fqvA%k?$E6T>1M=eM@tXslN z8)g_(Y30>%r+wVu*}*WV1Ihb_JQenmo)cZsABE$IPf@1=1rqjef=FlJ?8 zcn36Ny^QlrFp!vS&^4nimyk6zPsnS{e`9D^6qf}(?!LmepU6mdL&J9a$w=DTfskFa zmA6<~T#iVvYBF{;EV4l`5*};wre}*q*Gdi)jQF3*yW1RB)qZ(n_L#$M2ZErvNlME z4)&Me^QLgJ&n0pOe?J!cTjfUD?`2TQ%$(b=K$x^(F$;@hxW7~$S906#Raw{5`jz3jtaYWg4f4+m z#0#^{w1R_-OWZLrW=cgXwlIYBttEHez2x>q!<*qMyAr*v&z+6_~hT2^hgtub%%~$9zx{D$!n8; zSN&Tb8i%XXQ+WZH<~K)z0XvV}XkCr;VwXSe4fva-03>bH=&0F!i!KXHHn325#i4NQ zh6~4(Ocea-O-Ddy#c1_gN?KEB$JAVETatZQdi=?{OiQ6XJ*K~L-SQPs*5#V*!2niy zkpQZiQIY81NpBe`f75_DDO)@J`ec+;B`e3%W2}t^ce#4`Xb^b>S`on-|I#Rpb@)#H zCP;GbHg}9+qQc~lNU2l)ewv+OQI+x1cGNcT^VHct5mhAIHNOAFk%)6-NnDoLB9nuad4 zl-ENsL9?_*7zO7Nj`KL)uD9-s6*4M~XXg_*o|6}zkdO@D$(DKuA@VU*x+3(Q(CINB z-?4n%gL#a$hpx1rY}ZB4RSl2C4~)OE=x=V4pO00DW`u-%s#t10Pvf}EaxFVSpHSZ* z01wk_JKXe{vd>=h=rEajGP>u*?oF#lbo`im6n~(Y=doe>uCL*>CA?7sOMLalcxq>m z)r@Q1F*&V~}(s>{+fUyR}po zE|FwN7GH4F1kS{|Lij)0O)|^3a%_iirxp> zu&@gkS4ML02q`X-cf%HBBYbhktxScUQE!iyuCUe7wl2TQm+Rf@@=3Sq%25-o*Z*Y1 z#%Z)qP1f!GQJP80$T-9@?BY^$TCwcXp|^ub?BD2V>W8bq|CD&>3sbiBj zD!xs)wA&Z5h*cRu#Rwx{bKSsd5_Kepdw$Qz_9s6pA1J0|Jn+l_wm1w65r#w&B9m>f zU~K+{KY&Hk*LNhwP28&&l-!V*Zm|wwY)Yh}OF%giew1}ko*{&Ba@>$tSXBGfv!1M@ z#{ExI*@pkyBjtj4fn^MdXQHJHCoPlmy_mk_AdaFfbm?%qIp{kREEq@(8H>0IrId7q4#=eX8c-{sY;+S6W(JnwUhBf*s)?Q$bH#dx5gDe@?~= zneU9L*!WVtwxpwr4Kyb6 zE*(#@dSP1S7k6bbsmw30$){(&r+(3m7ivF_?Wnrq9OL!*(@6+2@g^%3CFO8DekQvz zH%%~pk=ms2;Tt@&*fH_}e8Q*hUbwb&24~!LT@RH32-LaTw<4OWv3c~NCWm&R<0aq_ z*9TyWe4uogRQ-+&YJpvDuoe7)Mak3q6*F)vl4bzrxq#VaYDiXJo)b%P&SKU*cZYGr zpSI;Q>66Nja%dAI$Z~H$z^YMnA-(3cDCjVr?kAbe?_-@=YsBN8%qMP+ft$LnUX5T= zn`DT`RoGR-HHPD$zrHERa5Za?*JAhzW19m{gxZ3>*W4K)Ba6A@< z3Y=?8-l_M$IHTiNRJwa_n!pgF^>mvU2bfW>QgA3eiJ#I5t()xC2i=HqC~!BvR0YIZ zC2sk#RQvy?majPhgszS{!-)Q)<^DPLCm871lqNGT#<-;{Ev!Y0@1n~82~~m4ghc~u zq$j6Bc=sHJ;QKw^!7V-D{;!9Ky^;Vj!TGR}^h{2mDUdXb66jmGpM4Dsev96ZIEbBe14|H6y(@TZ4z}OlE(|*>FQ;DQ zZ)9i9Px@6dqH%V;xJ}Cch{ea`+@2)R1a%#-5O!eThylXap1AQpJI%+w+LaYU)9`=& z9yuV8n#vzH!fy+wxbyd4-;;@AZ49Rib&YvV9^g@sM9Nd}&x$+bhksbc+;(Amw3F#@ z<&qY2jVU)_Ku-SycMjsHE6mV(vZA`GoI%_9#C#$3>M0p-w5)H@w%wS@jW{#B8sDM< zdb)Qbk@A~x>NRx)wGpG)cS21?coJG3>Pw3>X3v1pkI1}<`j~#N(05KhbPxGK6lNEYv(V6r-`_*SK71d zi}pcT%*JtR5$6$}aF8F!my}J=>S|zDh>Yia7V3`-SOp&Qf9D4vK9F)p>qsZ&6GO%w z;>__M64u4Iu(jlmNnQPr%kNkopH+T;sHbf(;&FLqKbe z{Ki?lq`iJnU%P3PXXH2bEw1oEZYRgi^f!{~Hvo7RDT%{r^_J1V9M^Mf{F7klt^eqf zM~Zet(Efb`o)9aU4{b&Z_6gY!^{cL`CN8Ut^fh^EgygPw1XyQ{<+JezpprT>4LHd} zVdioY)2_WW4ZI(YOAES^ab1mne1P`C1UX(%&kgAOg+HFg7-M>IkdO-sjyr7~muy66 zz&rJ)-K<@zD6T%*)7W9Zf6A;rD{2wB5ssu}*uf*AN#M7ggF!0B4z~=YBGLH7ijnT0KV{hj?E9W+E( z>mJ;fm0e|jKwiRdtVMY&C&q(%T5DTfnA20LVA;tT!HJX7U1Ccdkf~@TDeRN0V=i5e zyVK~pEtWgAxLGUCsgpIYfXV!!#?<4IR)C6gz&JgwgIkBc_4g=K@_z3(joszq!6^yr zE!~(Aa;`9F*?wNzJwq57oDY*eliIfQ&^ud}$*~`oT!9`bx^KdZwJuxJZYpcD4p-ug zCT1#YCs$(eEPSx;k!9^l1&1*lb?;M_;D%p$BkS`Yy=gFquXF-FfiIiliycXYH^PLG zmF?evAKx?@nHWqmoHi^;MpM{{MP$1frBbJVIeBDU#!&crv$|b$U6GJu+RbCeA31}w zr}4%L53g?;il-dOH+fa9l_FqoxF$c1DzNx#Zji_o*s9;e&cUu97_q&YEevTeD@av9 zKZ?CJ@x_a$yuft-n6Rr;z(J`4NLIO{Zdra&$b3^+8xs|=7e)jrZ8+N>nxt5jet4x{ zkYsY%^KE^+Zu`#tQZ2>4^^Vr47Ch2-#Rxj@e#e#9_O+J9b(RX_DrfXo0(MbKsRv3a zRul6#J}`GLx8P%(y~^uLJ53?RrEpKBh~8s;L)rAL;!!&RPoE~hpuZW7BIWY!QG8oO zL;l8-4xF}U%MmD`bcEY%!R&cn>G|`5>JBddZt6aE{96GP-ie;qA+1Ae`kiWRpqO38 z)adA)I<;hlFB7^};jyLHAYJpy!sbhusa67U9R69q$#w0i3vmtfkmhnWVUjRDibWnQ zIyb^>vSjw96`e8D(5}dGpvKo%c=8{QEZK-P`m{X=-&>y>H{sGlpvG3#NpG+#G^Ytg zEc6x7JqZ?GoY(iU)GE46eHHK7<++qc>PR#XD9v#;qFIAD+%P3zgFcP6r+K>6pvk*r z9xS!a(q(NN)LlcE(oG)15K2-dMst#DsF@?>gRsx$0hEzeoD;Fj$n*LwY5V7%`tmKO zQYyT(JeLc^kL=LE(0-nH)hPPOoYz=XS{@9!L%=jZ%3|=*4~$7DX_GZTGPVX#!Bu0o z6|h>+s67+k9qjP~pZUAGxmUMgjo3T6c{pa>VSC@SWt6C&rfR?I>VjJ4sBd-!^zwsE-E*M5ISo$?ry8}(kFQ_W zy$L{RRi*?DWxK`edwpzzt(viVF@N#mR$mFV`8A(|JOB&*B|P$YHEzIg!uu~zb)Qt6 zp>m&#bM;@}CoE#iQNaTs3(+KA-jXz3O}G)uKi3X`ZmAn9y?^JG zuMw*P=FC8KI-USEiMfxk#mfDOBh|`=nqMs|mpRy3-<-mkh3<}SOLxKW`E$#N3_j+q z>>O_cml!1@(-y%EDW%eY*9>*WzU;}TvZLJVcp7Qy=`Xy zN4?mNAq{Q!9g{QfqQ2YN&x$2CH}1Hc`%hzduoKr5K44m9=lx`h+6w@IjOB*=_i}#% zF<;21Fg(3~y28jpyGhpA>Wdmp7K!}ei`049;jX09LO%wn!6HwbRQSxoFEB?V(~FPE z*lz0;P~sOgK_DjMWMpZ9(!G)b{I!~e6op7<$?5O;o`P0x z2?2~sYstA<1v&l;V-rg!qKyW(QbgTjh0e1wd7iXCF&DCy+`gG2#v@ZzUEwaz3x+)4 zDX2GkF^)ih78{$vI>`s}U(hjkEjfL(m z0CC5pGgmQb4v1xpg-dCRsg(|Z85kd6Lar6P4j8iNsQoY|o3ov8tp>T=R)mOF@SM?! z;n#Smk=g>#qvm6p483rq()l1gurS!l5F~fXY^>xqK#;Dh}i;$FHq)o2mRZ*XltzC*$`rcu=0r zismcB9CuCN-bp@Ph)+u)IXdQUC-imEnS=k)ZMwNX68t#!gpNw?_deXuo4OO~zZ9(Q z9ierXbQVGJV|p0s2-Ug2k&u1}G6#wNJ&tkxE1t|Qi$@Tt+N&SXg96j7%6 zFWf2f2JxCZXiD)#w!miy)yMX7#OdB;{EnyN>j^{OT_NO=!1M&3rW{GcRiybcfq0+- z7P|+g!ac`hI=2ryrWg6knx}>p4;=ZAF5PIMZk_X)TZvh#H{qrcnrkfH&{GXj zrtxddYQ%FP#s|s;zqkI(Pec^9P=#S>n!{hh&w~={?L6f3CQ|5?tR>G1$0DSv2%{bwc$byi4MO5>G`kj|lP{KSH1E*?^D-oImuvw<^bho z%|GK9$25!2OPOs>M z!y&87F?Qb0?Yov_TXIa;p4-hv(X+`#yOi@k9AhhqXLgx#1cr~(hv@2nIXULh3#K{0 z791}y{?V(Oqlh6E0xvfiFP7JAj*0})!o698fz)ibWeD4uU0(WfgPanwH9PJCF9P+q zCI5}l%M0?p{)UP8FNKjBOx>oFp;d?vIm(9^>2ZL>Cu4EtF6%o@e)}_R{Cl!}ThSbL zN$kJo0D5!%L<9}UFnOrOa58)JcidsXWU@pgO!Y?MEZ(QuQOo5&y8ax%n}Hj#8?2nP z|MrXBELFoYVWw#?kfmAsHumcy2=nk#sBrl|S_PNj_BgWRl_R`{W+2OSOYW@l=BUD2 zGxh43jOvZD0w2U_P0%wMRegV|(q4(EX6$(RY zhg}e~!uzeyIobBQB^dnT26?zFcCm?@<(39V)=Bglsw(;=J^7DLTZp}wYTfv?QNdZE zgj1Lc5|zDn>k@xM>1*+@AyH#G_!EZIbwVPz=!J;jt#5e=4SU*Mryr=BmJUSqy{H%y zBhI+QMfFtuwLAAG35HB;j~@t!X*RA zuHtwG&LJixjAd>GRz4)OO#<+#esMLz_uwj@HshbC$h@#+hCf-l(}Pzw7+WXJ&Vdp? z>!PTwo&|MY_zE^mcfByONN+>O=}qn=e7oTdJnV9a*#(NKZCAEKX?vr*sVVGJ090Vh z+?|bb>-DITs0{eA)NC|hl_7a&MkI~$Y&Z8TJO*j^A-YJ&8ZL3A{0_yRx$Ui2j*{iu zFz4-J%`<7^LIC2?r%PvUIj|!dAwZa3rZZs^!WAH)lze;bXzz9*9fc0NhHWVud^Z{+ zBrKK^5St9?{8Jf~7|h$$mlAOxBD{GlzhCWURq5^+>aw&Ft&;Hrta_y8P1~g8%YhTU zmYy1h6K=0)B?d(1Nsj*rSJO=Z65VaJ$-=Oc;!qj3CC}7OyUZk=B+3q33pIOUr&!%c zy`R0h;ly;Mb{^>tGY#S^0V`kZW`9#8H!7BLMyPDrIYT=wh2Y*vWjJhV{q6R}r}kCn z9yOtw(w0Jfcd~UjIQZD3qvaj0yjE&yw#vt<%Ia$!Pv%5lSN|Q-;*hzwS7P(#Kf3lf zI?9n@O93RN?0pZI)mW@*<=K~khv`b^7A^nLy_BAD$4##0_t%-1!%`$yvd#K{0;3e?B_mnYY@qMC@_2lp}j^bBC5UVCKrph>BxMbw_d1pUTRll~P4hZm_&2 zd!l{lrWsp~>&nANT zsO;4(B7N{<^UKt%sWxw11M85!M=9>j!j?wH+UwRUi<}ez@PmAuu|${zzPE0^NkM%& z@8FGLo=o6>bXQrs=9A3MrTNU~p1S^GcDb0Q5K7!27u0AtM{mNSuk_JN%l3Y{K&?5N z;9qoG^17r#DPnju`jUzSrRo? z{K7b{OqVRx5Kw1T-S$0%`)lq8))$XF|D!{#GSA!jiSNq+_?a9RP^bX^l(O4ftIbO% zX?;W!_`N5F1N^Sa+CPND*VF>K49G51BHozcX4uI!1I6?+w65Xze8Ot}r6UKVhKrwE zkQeG|r(aP5&k7s$vG%YYkvi}bIHM+(dzGlfZZzbJE~;;bCrs(`2(yr%`DD=s?$6{q ze@<*QHX1^8(d-boK=?eyU-8KRB_mr{{;`rBBu?fFEf{~tsH^j5PIx_q16UCI5Plv+aZIRl_&#EFa{dS0| zCJ$}b!scE&di|2}7CfAhw58A6eg;7L`a_?IS%*$4H;_WnrOBI3TcY*eyzXLt>{DN< zWxYk=z|L~F*4`G(I=zXhj*pkSn{R4zFGychhx(yb+LPr^J_0oqIB!YOGM&tTbb!Im zZ(gJ0%8gH7=MxJ~{-bMPUP)*ytB8zI58vyNeD#2meNmq<@2AZD_(wdw*g;*5n@5ZP z%iU&SOF(-S=7ZQ~Nf&2G(CAOij(&nn)sa{)y0#Oy;4{6T@00!*FKoy-$}ie7<=xuE zvlcv+Jx}WLun&zY%i=Sn4(`#+HLCUV8x@%UD&C$dL@!LdS?cvbjOulWT#HS zXziVG`qCVa1%YP{nyyzgtkk{yuBgofq&|0Qx1T>_>JgTA!l*0Go)#9`Wjd`s>x!P9 zPt}GO1g{5S0fbErvfA-G%wbHFnCW%LT9m}zjljzlf#-9RYlky!qey9MbsC9$p9qV7 zun@<2`$4#BHv5=9UvUrQST9-@C=R4maT>@m?T^SdfsU(2EV*7kGXzQdTlJ6r(;gZk zILfP)>XklP(MD{EO|RK%5Jh0g^O+{72U+Gmv5|5s)0N2IYAg{U6;2n%g%JaoAXC z{c09-?aHT%9NB8==2UGI0mxf;W?LHS@!G7nZ5MM*<(}c{S6#`NuuQcdUkRqODTwjZ z>KuPd=fB)v-xwK8#AE>Z6y#ZE)M#k%6wIUseQU9UaS8j-ccGHj9{x&Y$48py@7=7G z{ATZ5g{8}SYcsi+%A&vbSTyWBm2tYafA8LrH#1 zeng#@#b1zT6MR3z*wd)3Q=HMH+neku<-yNN?jN+s3k5aDgpIm&OpPc!M>JcB-29KO zZb}$V+-ko`iE%5B)bZ#lh1^I*HcbBpWTbC}hG*N?9P({bOg9p8!c50!!f)-RCG}nf zX0BJ-Ztpgbj*Pghr|hbA*H)&hS7TZ79PAQj^!#eS35^1c3SzXF#?Bt)B@Z~Z!XmtC zCzf0*CXXc-ZrhR5U%(Nq3`H|aRTaudgvn#1ahw{*s=!+~QX$@`(bi?Sq6xPu|GDKv zY~FX#u>@5T&3l@j(nKmqYr_?^2^*^T){llKNJT}izbP)ibbl^BmdQ~HUm|M(&p5Xv zdtH2wIb)IEvyEiTy zc2kDN2?wk^=zqRKdjpehA1|8?48cO7Rqik6fGq5^z(O$_%h5Ek)O4YBhz;(%;~Nw{ zKBg*n^e>L^rOOY8gxEND?p`A`fjw>Zjm9B7DT&RZmZBa?jV)x((EsRqaXO`@?x6lH zaWq4(Ecs4PT_)6U zMVOfK?AApyf34Ez(yPB5MW|R%310a1ta@m^iDPy1po;WgoQG4M!2ODNq)w|iZqNMI6OMnOFlBqGFqOkU@_NF`!V?yshA#yGU0+5r zk!vK=^7s#xr|zuH(dzXOz1U4Uc$2vQNT@v1j9&}dI>kw5FeSrVQEdi5yvcYpqXS)x za%!7TN1imei(--Mk&xfXZ15*6|A_Zmw+efrsBUPi(nj~$W6VxGRB$~&C&SQ-qk4n= z?*KGjH4L7(Y*59+hp{63T70QjXlV5KhsU+~*>dtm!RGNK)2J4#K85G@E{=VVxBtCN zrf7b~gECznrBIHe;?fpqPWVdfvqy9)l)*R;h4z>7H9uBL;eoU5 z9g^nCxyT}u97Ff<-#%bfB`Ri~Iwptm{0l3YlS8s0C!usEZ{M~hQKV@QYvv5neCEzH zkze+s6=#ft*%R`y#YH#>icBoy(XQcEiy;aio5gQTruVPqSKpPY+}XRb03FtMgt-<} zkyh-tO4|@$NL3ZXp3SCLf+)XhCMpZoCZEtH;;eG5>pMqozn3($@j$MLY6s<%_aqKQ zJ?A@=x1U|SJDX#=fp3>bE2P85Crmpob&c%<_on*2-g|BTj5nR0H3|HwIXG#J+CrL8 zbQo#UCL#fNI|k@yyZa}V!WynqVGwE>>vV2E)UYLYW2dYZu@o3g>m~7?SW^pBp280w z%Bb(mKLsf|w4mA+OTUB%e`d}MNjuJ|#Hb&KQu}HR4dqhN$(h9wG&t2O2Qt%(xwgPE z3bcM$$C04EQ$H!c`MacCT? zqp9p^Gn|%^VTo6!KGP5|%k#49Ep87X2nsubJZ_^OKe@Wesh6G9VOo^$#ILFGOGk8e+90eH1EmI$Mq%mc8oX~U zlc1mBNUeC2X_{~kLLK9vZRersnNch3jjY%O4whe14_V6tmQt6<_4)!fvxG1tNoS!~ z)xv^bvivmYbs7NC^lZR%+&0<3@%5$%avQDX7sWLk$ky=wd1R%0B2}7Z*r|V2wg?e) zR98P(;$Zi^zhtpHka(QYWBn#fPQR&I`^27`1f3qgrW`zvEHzW2WIk%;8a|Gzo2{S; z9?tp!3~zkTVkD39tTt$~3D=w%Ax|^hgVkPllNP%v4M})He!? zD-VosEwWyRS0+>$1S#?4x@iKF%WW43vCBZaYfO#oM;vC?zZwLtnfX-|6nz93@nllx zTk&!*9FF~y#NxBIAv2nyX52~GTC=63KVm%Ol5$z-c-nEhq8**V*j!d!UEN$x6YUT7 zfQSaQicoG{Z_4>ZoXW-!G(6lkgjdU{Jj8=1tm^DBzc2(jY)rMTX=M^rZIa?G?=X+g zlduWontebzwAr*KcI7hubH!o-AG=e>^$JHIYHNAxue_%+*_b$%*^0;tGX02-{VPzMdUBH=@^f8@Ysd< zqHL|Zj5Be`k6i;g24CiOgupl5@Qcw6fL#881{$5d#Om(aI;^!Fd`r4+z-z*-r( zx`{=t8leDN+gj8rQ@`gJ$>qvtTXkiFp=EllRtSmDB$1}mXp*NW^xoC?`=mR-8Swg$ zz5g$hJLROn=WBw4lf84Aw5x0@3qj=eZqP9L_wSA^LP4RDhhZsQ1=P4DOS=54*#zD4 z(+ZGe;zzR>80A_Z+st?3r2_~dWXU;`$aK~V0HT&+931K$w6$#I;%y98G1S^!1?$zU z9r;L`=6D=k95Gpvr&Ww~E7|8A+-oL#t2Nj@c@s>u}l+y-i~M@M~WNINUBjszb1n9QCKf|J1a z2a4aZI##rRMMFC$8E;DIppMR*eexJsk__zmDYSCw#Mx!q`~3Ocp`}}0IU&+jvn@ve zyIt;b54F|n!%uc- zD0V)NA{XyB>cJm#XdF$EUe8)Hw10D#4ftDUEqsM~FBQX4K^v^94c5C5sMC7}+~VIu z-&*XymX>f?;*3WbOv!ri4EYSnt;Iw}36IfUsp@G>k5(4tzAiq(TPe7G^p%-T5{jVQ zHv!D((ilI>4IJM)l?%ZdP}ThR;Fvhp{cni?Oe4(0*3?TH#jrfzBocK`l|DYsjF+4q zqzNpT_+V+C3v~l}9iw-$ZGH<|9!<^^RkHs_Hy@wBcX{uL(cHtzFBHjo;6HqFN_psQ ztO`%SZc&Gc?%Ly|`SQob4u>p!S`_JiD4wV9*nCGkbpeTDfyq+p%~bP;S6*?2)l<^t z-(selcVSUGY?(hb#m%ld(&|sUX@09lM5wV`@LgL!9=QvfK81lA)=(4aE^d2#OJO1v zRyol(5&pJB!vH=vWfw^7H#q^sxDn+9z?@}~M-x|`?h9S^7MGcoh6I)>*k}o1n)I3k zia$E=tPUt{X^>B8y~jaoc2-XRf@SsQiqaC4A6TJ;1b}B^D~^;S*xr+0X8%;S(ZMxl zyin!VW%Pb2{ZMI}WM_Ux=78g^Nx6+3b1Io2{?*8Hr+D589UcWmJ=2U0+K1Sit|!_& zO#^m*+R3l)oLpkRGCc%7*2<^)TtB}6oCAN>8s{k-k6*z;f*G(N9T*=&SbvClH$dgb zrq!bDC;1ohve$6;zg~EiShU7-HU%204T-RD$5?w5mz8CHTEj@bC~z5bqJ5YNS(p>c z)`)Oag4^*1KF#);a9Lp)?If!j7oxUqL20naL#c+tX|enubmo6_2aeSXt zT8*-~VwTo{aJ@eW=jX;?{{$II>0Sw?;b6@(=E*(9W$Ao7xt5Xs0U?-JeG6ZG?wUYI zP?E&wzo|bP(xBv|hxubnyzoI1HpmhwD!J4I>NGKmyyRM(pFy4wc=k5D6)#xlm+koP z%!x-By!ZW8xGY-bJY8D#%uT$kWF~&bLSf;=-Ed4c2>Y^*Cgo1OHDNsBGR^7FazSZ% zP1v?-Z&;%oae>^En4GCqR#Wr6UU~K3l(#S5lL=un{(hrSE6eWYwN9H4g7+Ri>A6WU zTm~Yl7SR)}Jh^S~fo%>mSBt+k$&qmt=Nqp{b3kuEaK@O{B|@>fBl>|)g? z6Bo)uvnD)x?T6i0(&j-4qxNwuy=kawxS#lmK>>o^}IwOP0w5ng(tdRkTY&TiAo!1=AV>H5GLWV2(cEL2{nBK zVM!VQTZ5AF+t70Et)G`EY}f~eXKuq2FAtiNflsLu3nvW@!c03owy^3@Prw{y#&^B% znb?$cZC!pjObl&8p(83ERcH_QI_0}#d#Nz@td;Gqt#{rOe+fSg-z^e*&0&7Q1ZlmG zo_x%trUF=ET3LaI`NDq3h8;2NAGIY0tN2s~2>zRSHg2|c>B*(znU_k+Nku)Mfr_HA z90UC}6@TmM*XFHIle;GZ&(Oex4(NAGLH^-OCym{rw(J!QX}UN(G|l?B`mSwUgZ?EK z{C7o`WvfKhaT}C&cclr9bn-8pM5{fdt~nI@`X!Q7wRCS_au-3g7C7l6FSdwNg?M3` zoL;Yjul?;{4JSVUsI|L=SOvc>R)ko*B*!t3e?vLbX{xY8NIc`3u-oIZMqc~7y-w#7 zfGNieFsDZ6=%UYJ+glUM6Y6S7i(rY7iDFWfayaTN*K$gUaZw@svjmSC!Rf%;s{EZ- zM1#fF*GQ$Tg(uXHR#`uoo`q~lw^Qkhtm}K-c8+qs59x#S3Wj*Zmg-7bus1`fA8i&w zD(pjyJ#egIOI1&)&WSM8{`m%4yyp-k0;856@%iB3bpgtGuh;rMdapzKSgcTqbE>hrS!gisEkz8A;L-4|@&sa`&V#PXQicL9iG5BWwr z{0FJh`IRQOm0bO2&@)5()UfBjXv41|D&&2|u|jSngy(Zrt|r^X`v?qmy3ckXj;8Qq zP4xEgtPB3h{etS{$jhXpdyq)^(-|Q7fVF97{_RcmO~Y^wWsQBVPks_4rrHy|z3c(C z2J!s~y&oOcJSK-b#haf7Xm1T`v#K(PEXt%GBY_Hz_Z|7@YZZH^YijQj0AC1nhS%TY ze&o_+a=6juRdH8x)JHYx^e*mPrno961JMTCdpMVkJwd$LA80FzsHc{Fpe3VA#bX%y z4f9(E?jy~#^jF+4{vn|}MlfW2{SEJ*ORi9#HX8q>h3h?n>1a~;`V>ERx^+Z7Ng7+0 zS9D;=bYlcKZl5K1F!6XHr*EYWH0=>OW4U%WAl7d{lAe6W!3=<@$m!rzYl>CG*N6XY zxfsm2ocN69pPU6hjwd@3KfHY?^fe@*@Gm85EW_xIsEkc&?6^(AOEEJDXz*pH(^-bU z;n3~yaP^mr8#3{zVv6$ON%TC#eI4}5cpNriJT-bM^zWV4j1m;5hO@W6zl$Y(*)s*G zMed416VpxQRL}74du@SxOBdIT$B2vIb)0et9{H*aC~+NtkueP7mYd{?P;I1T8U{$D zb6we1D#dv=_p0XhiMx9i&*+oPkVT-g>Dw)v>zk^-MFzuLooF;^9)5^LGy&qou zi4vWDoH0L2lE9uhn#cg00}Bh@T=0lB)vN@LTlk>JH#|lPj=1I~A)bN$Tk+qgg1^F3 zJ6bg@rSgryv|Vm=$rAe*%tGS8l6UI;Ki24S{HWH6ss#+PbWSwH>#Hip-w#(S`{x1r*M~;%nu_8SS>$|8Do{k7zxRpe4d|tnYMsE|zR#NV)E%t-lnf{MpBQCFLgH zeLNnsDfH(ZLRE_$G6n;%ALP2j;YH~Gj~0ZwP_(R|`V}O}RqSL?a-s8KH0Dz~ z-0E&0aB-5b)8L7W^+pyfwWVJvw(6&AHhgCLg-(k0$FpF&nEe-$08 zv%1FJcwUUq`~$P8+@+Q?tz-!fMXx`c*DNJzyJ&Rp9oDkY%eR8F;9ke?er^1j@Wh`O zV~(j^jh(w~)zhxv=6{Vd!q19Q!!$pp0}WB!VNeD7rA4u7=yIjkgT$wxSCa>mKbN-# z`@aCwTl#&VM9L0h>$Xjl`3Z@?(~I5%#;U6v%}dLaf=ogYqv4I;u(14^ug7+I6Ig+6 z^Kfa{zgeZk&xiJ)t=7iPHdZs=ZI1jEMxq-mKE_0vlwN5v|9E|gq%H@18 zI5}`@j&FQu5GPM9d-M4(P(HD&EesdDgmyWz=1Ara2K+!ZXXk{eE63Dr0ue3A-H$SH z+=;a1D7Um1N80$JDp629Ly`-DFfkG2Ps>! z2Glmzy{;14C`Bcs02cPEECd;^W$J_}x~wt7JuL5d1UHYp^G{mp)$817C5Hj}#7(4r zkQb$`;kf-aG4JGa8sC*6&%)$j&HjRv?00^pwQ^0M1F;Qkjra_Ha^Dg~*|?LYKkVR4 z>rYC!>R)}i*%*8p7~G4vL$06n2=g6oV@vdrf&53urLfH$b>Zl@sk%K7WD%-L5`^N< z;TP(T!Xrb35mbn5=u zckGRY(TzhNZQxs15T`bE!v4xulf)cyt$DSNt-?!&m4lqV_gsQdY%_r@vP8Df6=_Mhe!BMBWoe#`si zw8MpSam^=(vB-3jTV{uPy)O2?cbj*RgBZY9H{So~hR0p;)v0f^Kplm&E&9k;{qC4) z@OjUZN&3351~gt2<38wGvHaI)kq|#<^|pp1Vr)Rp1*hsDEo{mfO%w0op3O6n8)SACbH(& zAUB?^XPy?Zp5BXxoWL6VCMaIe4vc8hkLq>PGPGX>pd=|Gf5sA>9upI5Jl4TO#pJ2X z%acvMupEykG%{#Dzb=CDnJC{}lAbI$sI}aYtk^kX*StepJlq1#ysESgDQ(dCJyidA z)o>OGlm>3sU}-yB@WO=l@nmGiNMzlQX-o)&^pfvSg2`mm$DR4HX*R`f z{^o>h^^RwHs*t-)`ff#K1$NOf=>i{UpeSo0n-fG&+mn9^#!p8qf=3ec$tzteNW!i& zq7-mT!yVmRc9PWmAKeR?qjZYQb$eL;ls;#(&oEWk&-z(EJL2?OJ(N2!NS$WjEzVB= zn*TVLDq2l0ounn$7jfLEfC(HI)34MSIt}NFhA5%a`+V|+m7Fr2GyP0?!+woVlvZwC z8BZKyU;|cF$39xCa#Q!a z5=pGn=xwbkn^DB!`g`=#Bd*rDYmK@`8IN%jW(!Xr0Lyjp>DORsOTzH_DIE6Ayoc2u zeG~h+3fazI04+#Kb0o3SmZz-1esdmV-0PV0u8FDbUCoIj zmVhDfy=lKjgLGvr5s5}@8O0P#&Gv)j8&r9Jo1r<;>wdfRC*MH?o4<`nx68+=qPb;P zKbea4+}jK7Hg+f$h69<6;D}7Do6VKzqJ&C=2En>a~_(9m_ zeeFwKrNt#pB?^&MFSV)99E3*q`D@0+O2g)lLjo%r=1(4`?Mw)4xH|z$4Bq*BgPO|a z=-D2vv@YW}UtDa%trycu8WL&x9SRF+H{D=6?8COAo#6X9(C>m@Sq_WiBY>F9(VK-| zKF_7JAp<$r6;Q;$I@w9i;aDk_SNAmGH#|gC1p)8T7B{f_yVeW<}Tv<4O z1!e4iSPYw7u;gZ5LgReugC|;(k{CBvh2N89KdX!pmBixbEa#Mhtzu%sq(^>Jb@<;? zt3Cx)zF3bE-J(@~ZeHJ<=h_2#?}4&-D+GTH-29M_GZZ8uwwogzq7SaXf4C9Lbg4)h zx4Vg#hAtBRY~Km)@OxWBKN3@S+3>W%y=w-t!ztDw0DM|Q;*_zY!8>GbD!`{=&gPhlSM&u@i#2Y+8+6Q1a}DzUHIZ3Y4zo)D}vlC3rGJLZ8SvtDx7Fve?m6Ty{vhS zjY90t~D19bEmSZVw4-) z#L=$opS;dQ2TA|l;o1H7?rm{dgx8iX02?MgcTZZg4#Q%x;F-0pUxmtg%oX38z%nml zxndr^MCoEMUAf=w`*F~aAXie@jp{wlJL!L%Dx879Yy3%xXFVF?xa>V9MFR_2N?1{* zgq>3(E0W+%{h9n2{=>a4 z2Rano@;{2MGN8%7i=v1qiiiR#i2Exgtw<;}6zPu9CEcS&!xR(*rAu0x4F(e1V3dl2 zfaFGw5CMU~D9Me@_jy0>!|Fc2-@WIYdrn7Gaaj&xHFdeV3IDaY^qas7>e?X5XB*r7 z#XOMY%y<*?Css53;sfl>lqn11B~RG{GjKq;F}HSzo)rJBBwawv_uL z$O;t~WaRYYAr;yo25)PNic_fKy{G42+0;^xf^F`4YDWa9odGSwZlGgsGMvQ9uO5tc ze0S=a@X!8BAVRiO0c%Q)%O}8QcNQ?)u@+ahb*`%p-F<`y{yyYBp;QVyF2j5(bFSeZ zLnyUGEa#K%&NyZ~@kTx(LOoHfH$?+5IZrnjNOSAmu9pDFQcvHziw4mZsrS2Ctly>s zyn*`-&?jzG*K&G!o2tow@7WCRFRoD4*^bwIpgJ|{7n9?Xca4hOeaNv?RtDcp93@wK z`oXF2pROo@_6t5#438dn@Y%}n)&cjTri>y3#ySi2kYxb$3Q}CFt!d!j-d+ zJ0d@QO)}tGX{(EH%p2$MT%ZQ1(z#y=Ssqq1&3F-hDiq&AJi}5iW{qVTOb-MbaUFlC z7fPv*^~##0Ev8lP&z)P~Ob?ayvW4ju^*jCU-S_5|`Lq^x=njP`673rm*Q%C)sa5(O<5W z^Rkl)aguLaRmGX_tOzFYfeDP2ADZhvgJCM38sZ{fnzs*HY?M#iz4P^aTm!i$7593& z#6&e!XwCl^ygPW0`?yx76uj{o#~kV_8q2k_%w%MahtJ^V-&2{+oo$gr5%fFyO+v>U z*z9o2xUwSYPi1?h_0DjO7`Lbx>_UQu1kYRkgxi0@sHv7#YWTW2$s}&PD`evj%`S*AOG}CQc z1Q)J3j2tzu4LkkmQ@nxX{;(*MrGECH_n_l(t5xas0RxqILVYd|y@65X&kWYHFKq0o z+Fj7!7hi-9qhMqw%*;e(^orFRonUZu8mFK}*|pg5EFz$9Rxt6~!YQ6JHsGF1`et=iJ|8Og6R@j0ene zKhX081emt)7pX1Z)tUdktxSV|=4Ee?@$vR`Z?*#zqNa!ayPf@ z4QPgEvQj}d|F<|#PiN&vHc=K2Q^u2z>S~-nLl9?fp#3lBHHPnTPS;}fP~YG zjQ2?i&iw;8gXstZexQjKiLt=7J}Iw_3;L5hZPX+3T!qa^Pu+q}o?U;Y`D%q1++r@? z9i~KjYrxtwiM2@nHiK|GN3(hkpbKyG{HW^I?s-cMN9U*7J}aceV+=29QmWqqv!v0H zD1;PK_=a=-?|;f^`PNLQjTZ??`JI#;^y;D))~2cWn=tYzIMrCD@zLd2QH6ot3-i0A ze+*W?vo%AqbfwEzKX{4YQ;wG2zGFv6UYf(g;>U5`tLr}VeiQF}*BaW2fQ&pt5mV5QZ&ei1^4Rm; zmHQ=xfm?qs*{Xu|7NU(<-q{ zIZ@;i&5|Q2@XGs7ivu3x%mIX4rE?RQt50veW;-E~-p+MFl62sDveQ0PM{O4r&X)%! zmZ*p~?(?t80Q^|8=y@o)%HJDc1Fs~m{n@Pjrr2c2)i3voX?dRtpJERLFClNqF~NS< zW0%kqDi;43I=TVuY)0$0Xy!fllgDOrAS0Zfb4R%x>qgg>QH?{lwp|c(|7jKj92kTiwYEWG@KY z3>+!je*XMPe-yi1v$oL#ZS4`zB5g+_> z+d^VeJ*#nQ*V8uT&-vsTjJZ*b<8g#Cp?!oeS|~01GCi74B8}~(vLY0mp0X>buv6DU zT0v$Y6cVi=tH_$CtU_tRbs6T`3X$)AB*N9lY|A#MeP(YXd=!YjlQ-Gi%h9@A28T0d zv~JH=h$(Dg`l@eIw%l~)e46=tfQx9qp$Q}Kg2s%)jz2EqpE9tXsbJC4XwPPH*D03 zizjSl3Vi>^aPCHaOva5LOb@sKRiw^&TI-++mPcW1&i70t+MKH0RzI0q3Oyy?B(@m@ zAFv#;ZX?Z62>;S5#q>lx)8lF~`TMWlV-H4s2PLhQuJq_5UDeXIt^8ibM#Nq+~C;$?GmilG!O z9CvnRXD$2F7Vg}u20yrhn)2lpB+4#;f?=_~gnP-q8E+f0{m>Zv$FRX`OnXj3tFI!Y zc|}Qw-?EEjmu^3>Ue2xuQMnrc*W|o}bt$}H-yUKi1#e;!`=YU|{sDJmY~wo%!RAPLvyotA`cNVc<8(WAWff)G z`zKzDG{hvm@<9EHeb%ZrC89BWI=YTXh17AKD{)L$LN2n3+>VUV;PHUgfnBMU_*stZ z!F+<&)z@Zbb&8yZq7su+>do5G;@7Ro*Fp*UU$HI+qihYUEpq)F$_m+ zl`~sat0Br!|I9YmhZK!_me)%tyPV1f)0&mXt6!9k81CC`HjkLHVmDn53rVn{Y@+!j zA8+%oc36!750ZAbH<02<2JHUaJdml)mM@&}!PMma}$cGrE1V-#ejsEwR zqicB4P0GNPUwL=NId9Zh%^*{#nr{uLI8QopOO$-$3jr$6!};vJG#8X*kq`ci0iEyS}B1RIec&jJ7_>htnzV{xRI= zd_=7Ds<+!pu#nQ-XV(#N`|GhwWsMjc>SFB*%S*1Wz2TLol?lG?nUK{r?+U1f-J^?j zBy7MUX0BOXpuzv_!V#nI_WIQPNRl?S+B;k0;GdMGGIe8*sS+dFv)hVkZ zR^k~WtCyRDCzBX}Lsfu#n#U>7lh6J#ydrC?g~!hjn?1R%+@HsjHrs~T=BQHi$mW(c zDC00m8S#YWA@NZaocXTF{}^<%ZVs3Zw)5W7ptPTdaW4hbfBKP8n2yfUIBzjFVlTAN zCQLwJU1#SEdwp?1Ur)SpZc6oXkg8~z&%oWf>^@wZ6$e=77oM|9fwRFp-uYf$;$zE$ z(?t=l4=ia zXUvls;q;jyqD(g4^xBfdVk@?TS76}VyFCCLAKmhC5O}N^CW3vnoq3(*Tj|B(XH^OG zJSU7Vj_oSXT%2dmz8Jc?JbE4IX&(-t#i?UBE$@6~%v8c0{m#obJ9gIxX5|MbFQ{47;?}(Yunxc75j-?(ecda#Pe}U-?6?| z&~kxRiz!)N!rdXKlecIGD^(S30c6lO>!Tm9;Q`@tY}6|Yld4BT+DEoGZeY|*f-CGT zU&P~S1*Xb|5b0@6B_Ut{4TB+e+#ua8;hFWrtP*OnSLo{c?oqHY6pWoG!xx`DdHFUR${*XDdJnUxaj9Jqa@iZ)BiEidbDm9aj#h&uXf?Mc6Nh(>Yh z>$2%vr2IeOJbAnoqrM2f-s0VeZ+7~TDINXaFa`ArNlJWeSre%A`$;bR4{5ESeq%vi zEQHa7Ag*m@(ZV=?-OKfTO0}cG!Ki|P-8Ly_LT|?gQPNpq%bVV~2@N5EDwEtU1Zik*)pdt3eR%GYxtc6i)qkFbZg+05q$V`C-+{PO8uBk+;5 zS2gsEdMqV>2M@bimS=#r0Ug%GPufkgoDEU)&6uc`8mtf3@y78lgL5ulQ|j-j2fd_j zgtp)FsxlNAigK{*gHZe!x&7Dch!yR4X-;hTi|Y~>e=T--dx%DnmD;cpd)Y0TJA3@0 z&3kZN2QSq!x4V+nD+RWOs8{38UCksV2?&{Q<)+yaW)!YSdW8Pc&X31h7P043Kp8aEZ?4X%KGn;T*p9$soFg^RkOl`zh zr{`%G!k72Qt=!%=b(`MRY7X6^zd;$moph5Iq)UT%2YPEPpMs;^> zAXkM>$+`gHTN=gHFv{D`T^Z|-vfyj5e)FVv{kI#%Jt{M8o9{3i82OvzFjG?vrWfzm z4XPT?&1jb*Khykyfq?ZKhU~HRTT?8eF8S}h%f}Bie^S)Kj z*pNK;xBXBKi3>V14;Uq-4Ei#oy^s%O3R+bKx41v}q?sDd+NHoQ-Yrv&OUQ)Vsem>r zAN%sSh888h8eiA?{M;-uI-$U`E5(tV*UJCWmlD?^xn%h(H?ufLl8r9UZu=?vR#)Fl zcHjULUGXJY=Ke$Kn(pPW0mRj`!JD389Y!Nov!xPjC5Oy`<>l(Dnznd-}96qLfv<9@{p0vorbLsFj8A2dTSYW@tF>3 z(2PDhdQqR>VMRX$)+B>T|OJ#<~%&b3P5PPOatjw1m0S zk<6`~hwMKvZ+?e8HYB<~Sv`680JOELYesuV2)~z=DT5&fR>9H>1?@ z877tbH}JI&4`0ybfxA~s>RD-Vpf_d4GK$-fag~!?z?n>5k zwUDezr`_6pkQP;rp=zcDuPC)|;k|m++(2c>Lp+W}uxRr!{QxEbhA^;kEVo|kfyAi2 zp>r!)o1%UMz0pnEE9Z^yowZf2OAR$UDsojCKW3-wLgat!R=ZctOkV$`yk>Be^w+og zEH2`CbAZl2h9}|;%fs{;zwSdqgrgDTsoSZ;2BRAHWP`; z@C6)aQ+~qDhmY4gk(ygqMNq6t(!c~KdvK2vIw?-)?q6+fvEsfNdQouP2&?9u;9Qyh zh3~}b1vK3r5TZiw+pkHx1P9MFr*!_QFH8Is^Yx=OpYiHOH{;P8`-^J!seaKLhkU84G5VBTJ*QM!Hgj~b#-si^ z1ftINJINwCX)#IM*Rvyu5VhIN^HrfeOR)vPUTwbs=oVOcL^kuEt%eJ8@O+v=Edc(a zNiw?(U#Pz|D{UgjpWdYDf1LBB=527u4rE$~Cl(eww5Uqv5TdCJ7Ei6w@TCeuz9Qp9 zGi_rH0nhlo;-5X`B&H`-MMwpR(ir}hP(tW`2ub>0Z}CQrq=zh_o^ffwgRS0`Rav2b zj`&41|Le9a@tTs zr?npStPw8;wQO!DGO6}jeJM=`AG~>fj=k>rbeo>X_G$nGO7!^{xT|Z1^B0;t)2Lt1 zB2i*$SLj|H;<{QFC%`iJxbQ_UrS-p!JEixwgGw>CflQxK{rrQm?_$JkZjq!fnpIz= zWxNdT@{P#d{8~KXiJ1cCjm`?PLK9&i5aZJ(z+YI=zGWEyQn|0UGf$2w-;EHO!;?H4 zQM=T2H`McPF|tfpUM=6>JHjnNu}yGxDEAWU^SD~J!)3|RSCq=6(jT-_!_?2-S^m(< z^`wdK904OnTQgHP-VJL(^f`+6EeVAI<|eXRy{MKyMd?S_6_aCuB+=ApJD$tYGt?m1 z`6B~}xLSHtmv>cwKlA-Iwmw4-furw!1>;BN-DC(E7{!T600s% zWtYVvJ z10ta7Z`aA9b@8uwU6?>>^s5V#Pb&uRxV&uEj6~)ni8y&Dt^sq;g;6SR;!${^BX%S* z5Zes<51x#3au13qH+hXhmURx^-(DQYXFY@4J;Cpr4YoSiaczjRd_I3xYVZtg=^q2u zlxzsSm^5}hy_&am%(}p{$@Xy2+imigv!RV`{S|e6i-;$eu-)QEwe}i<|L`ojdDB%N z(_oGRVHkcvwI<>x=9Ap5CO;^xg@@Zp2aQCoEGhSXnptA~lYOc7T3fWvuMApHmq#YG zR$Y4cicRIntULq*ah#XQxe4GorHSL$+fr!R>dm&>3$7bwY_SdF7rHtRZ>iFq6Jv{s z>T*}+)>r;~_S{rZ8K2E`c^?>Y1`AceY=BzH9GtM%C#-7en0r-!pRMX=QU`o|zf1GPAW3 z6!m@NN$!s1k|Z%bzlCP~($*8Z zsIX7&&8sodHNph#FqVT3m;qTw>yoAL$|vjU-mGYrK?WOm&_J0 z2&)WE>5-HQ5+N+pGBbcejL$2DaRh~$`{=Fe{AoV+xyCv zoPEq6wa9iHFsW@_2g!PW$F9;$DrK3gB9e}Ly|DqfYo0xpO$(^Yp#Ed%t{kS%sYnAv zR2;hsEhg4Lv`LG!?wc4@gyC%pFNu8}X;D5>46SP&TOX~e#^KNuN~4<({5ng(tQd17bdKYqJFD|rE8U>PWw}Z zq;By{3mNZMMZSI0xj<-B)QkwdrgH}zd~I6;;z=y1Eow^0 z)-5$mKEhh6C}$^EZ?N>Tawu?HEFz4^C!3~%jmo9oiKO>{7e@|cEaV>p#FW)mmLiF{ z_0dC;L(2E&g;P^wV?~maiLwWwwng0`Ba(`Uf!}$ncs!T;y z17M;~b`Dp^X+_b>F67-N>om*gmTZGvZafBu_$2#HV%UA2kj}nR(IkLOFkc^ZVWr8~ z5@2Vs)qatzG2+9|e?ETw@uC@gAG}oJv`L%r>^bh2pIg_jpVfkBEnbdJo_TowJy3lC znM+SL-*3~V!$_Pa6?Jn2D|tbs@|xLC+A62*YM@DNLb0n}an!r*OWPKx!xMwxWU}?y zAIb%oQL$ksk#hFG0S=U^E;r&8YxyVD0vV-xVS?c*N; zAI{wx%Bdn+cfRVwS~I>n-BG;`Ukg%hRQ~u;S%B#?a3j1)IX#c=`32^rdt3q2(I*mb zrr{ooO{3!Z1L1~S;ryFU)s@JCrL{rruB9^ULbK2_Z0WJA=UOn$BzW1~WwChRQk||n zdG2`(7+06Pa96YU6rhcpk4zhmC%G>o;_F4;0?H9?IjlYqaQCqyW;fN`!0O0{l$euL zT-_GFs=4q(+(>k3;d9%oI?KU73zFRb107(Dy#t9PoZ-lq`0 z0Hy#SVqPxu`COJ1-FcUP40E9%yjEjSe0V#ET~$rMYUy!BN-k|u-lG1~wl)8(Alg>= z2ly{xFy(Ym|FzFz*;?%|U#k$Q)@z8|0(t%-Ih@O0U((!2?zr$izudHEq^H#-)uZ9; z*fiP?p=WoydM~H0`dhpY9i8ya zbTT5#@D3jGvWhkqbYSf_*F2mby(D)z{HAkxR?6BLc~O^6n1uIvA~CT%LduGrKyM%M z5VHGiqLkMPsaU8`((mkkHy0Np0JZEkkS;EI0`#{`^1@Gj$hIvtivFi*Gksr9+yE|z zHOQMMKhpRrdfx|X5L}CXc7dko7-ariEXT@mQhZ(Y_UjP#DSN(yb4jWwiIvY$9PBcM zSr;*+5ZV6oq6YIa>_rPJvbBO>sdz&<*9FAf)4C9xPAJsmtpGD^JWD2kH>06$oPKL= z(hBP|?SZI>KfMUNsnQIEO?^iUbAZ!+4IEWB&D-7K3n?lxkgd$Y{8pO?#|APo{JYsq zTvKc~ZCC;vjAAsKTe%;1}m!JxNFD$Q_fmP-{#~x+ts;7!zYJYd4B9 zY?caA|Dy5@UX;r(rd-CJhWsAR?mP$idAQU3ow(C&dHa4B)n6Tr5f|$fqtT3gL-#J2 z*NsvQjHZd-8V*3tI)+gKxM9e7HcAWwGj+z6B(X_iHuoAUt*VOM;7k0L-1OUGEI&#_%?EP$c;eUJ{0GnO`?!Cue zI?~+!*_c!X>&F}hqjExe^7%|Hz#-ljROHZ6T3PUe4gb&psIU7sl}8WdF&|_oCBR}| z;kCiO_~o!d7M-=K^@-;0?iuI+Pq7y3@J-m_}ulli)WXVv5*nu3caQ%>}x z)k|N{@eSKmyj)pdi!?@sh;HX+uJ_E7pw=TS+R@ot8-rTpAx+QY)xRudx(_60u7#)h zclp@nH<$R*W#}IVMA$w&TVCCt1lx3ugFPsHmj=g^dKu_su~L3es!>TXb(aQD`-ZlC z)@CL*gx~`v@=4WlxX8|K>gQ;Wq+MQvfHsyv*=yU3hLFTs^95arQpAiCv#mz(*+0}l`6CD7z| zd9Rs{P)j$niZ#}}=Rba?nL$cl?HeCY2)93I6Buw-=Ku0?tWA5dLqzDQ3}zkebvF68 z{M*V9ihsHcw|*;ZHH>`nGg$ehPkx2UrbrUgqaOx8F8~6IQBP)l3VDpF(tv!Y2czoW zo1X2_tpThr%I14TPni$4_Gdu%dtI&FiOsNw2HX$s^tNz+mae>RPC@zRrn80YYa?2t z$LI7id*<$U67MfGe%Mf}V*(Y#-=s+oH-}$x*Le+5^3);wT7#LPvyPwKmcKhP(lKcv zZ1zOI&>UVoPQj`hMHJ?8zkuoy3CDU(_`+WW}aMC%y zZ9E(yIfvZ6?))b9in>?NPFV}f$@J@J%O-^iB z5s#Oj%CKk%fpT_!_tJbI`6lEW4VbyU4eZORTCu?5&DmdYOB+v#zf{QPyEzlVh1u*j z7oK4E<%X-kIf}WGds=T5bydNn3i?}rzYzSfqAa`ebDPwG2?)-$;a~CA?GH!#jCM^I zbfq=|Hp6n^1#@CW;;;UXQI|F0y_)G;oe6VDwXb$H@1kBjaf`zXo;l5CB9M{>#`>Hf z_RZdVQgn6!rstkuceLAA83u^k(XP(nhl@v9*oJznPvL_W^l+H!^$_=!Yo=cpp4r_c z9^kVV=Q=Kv#3j3Zsd{yZ*qfZAQuyKG+}{g3l`bihXK3QnXskIOY*q!&g;qWzcb`IZWc%Rm@Objh9FE{2WZ`X2FI3gJwf72lYX|(0K|Xi}?p^W8M4Xiv z+Mmai_GDRSxOw+yE%teA$;C{cetY}TGapB*k#!+)X;La2n#+q5#If>;aN_B! zl!Gxf^BJKRKGSqT{5TSajC&#}KGTQ>&puF>$(`rCtMJ}+L^)U?zD6?4w=UPGb-8IP z`W>0anXg|Evru%Ij##1N^w72#9kaZ`LVSdPnq19;xdsKmH%!0)PEXilchHXkXJy~guQnOtkpJ_*-QL~A2?O$)x?mS^W zURUj2VwMy??GFp{`y_55XIBIR`!wrljchQD>9W!WRJJ(qm(Mv{lyo7VZ|mnp?GlbP5j9%}Jc;qP>H$X6=11WFAI z;;JgESis|c(ys_$jHJ1b*O8AtrRd;Nn4Lmm?{!J4A8>B+GR#J~ttBtF-13zzoW#r) zoy2gz{Q^WsxUJA&5(^#j<|f>z_-Zqc&wzTb_9KUJwAz@E{RS!t|KY&_Z*|f%BbeXB z3o72#PA*-C&F9?rx*ZS>WKl@o1e0?3qw}CmgUzLHmdh*B$@l42tPA4eT0kFV7(qhM zT9+UZdNRe8Sv)CxcLd5p_JjaAcop}Ou8&lOzsRYyQQ4l|;xYRZ(mPOr^A zVf)D)3B>h0_Vz5?6~CWEA4XdT|M$Q-y$)jvh{=E`vFsEj8JQ@R^43kCssR396?S8- zJquKreac43gLU=G<-(JhJKuF@eU&Z~C(wu)VqR7yqaxodI*gWg9_Z}OeB2nA=ocg8 zB=tBreY+qLX92gtm-OJQYCcXxtOzA(;0M%RO}X`ym6m2dJXkcp?;|)k7KLy0JzFU`R~ zl&9zOhn6%6k)+$Qea!!5opFf=N%)neg7pIb ztO1dMF7E51zBw0PDUpOrB8vxeat=nQyhqg#;}0m)BYBHq8VA1TAswlCgW^uCWIckk z8H&DfD?}VRG)=JJlEzJ&8^n5Hfd+?WDTMm?!q}5?otiRsZ0~g%qpAmh(B$#Qo?q1+7 zQNBvKm-Q#gqtfQ_*_}k^rV%r6;4T}laRx<{v7&zn4UH&A=~6@7bvyCpj#=@OBC$G$ z_KoPoeY48%t(RFzToxA{;J{Q?ljBG$#=XIQeTLq(6^6I+24(hws6Ji2&rWzixaj`w zqlo^(b{JcD-z5{7{#MoC9dg^7v-Q;ZJe_nPwkpuvwq1_tc6_H`Cw`E2E}@PTzqx>c zre1_r))AEzGFx;W4pSc@Myw~FVa`t^6+n4M?}G+7d4mS%@~Z7m2e*&Z?>eQN+SD}3 zes9Dyo7&=H{i+iTP7v!JB%}D%B}|>Rj#>W>r%xMF=f%@M9GEgu}EPxbgyV$$u{h5#$T2p^%&(pU9*N0-sF5e-J+V?i+13ntc!G95U&#HTxRht z&vl=kM$TJoYASz$eJX=vkAS-M7N5V|Jlh7o`?`v)MMDm~R0Dn|l{xDI?}cfj_)!S8 ztcKSd^Q5wRoz}YJKa^Zr1#ZNEE8~gbN8?`3V&tZ+q$>*LLw6)+G!y7JOk8j4+!xfx z%DiHwlS|)AW$h1LtDQ>F5z&?JKh(Fy0NWj^4N3RK4{GQK|2K=$^GUJgHTjSkGzJeq zVTx__Hek=&8gb%iwzp5DIsAnWjzn)xIwhA_*7JzFW8UV6D5$+0!Hc~PKKk_pt{2cT zEe~VlWV7#eY>yKcpb@&l}lC3QZ|iXT)sU> z!VIE5LE4*huKzfbpmHf4xnt`D*gglGm8Lmu$Wo@7&u0YA-k-#Kf^M<{VHe69F>9G;5NZ!~z0XIt$hlHN8+pK#sfJtqu zhU?N*JenuQcNNQ8s5PB`+kJWBT)Eze3GlgG%#2>U6xPSiUk%bx(9`={f4&|Bjx;%U{ z0^|k)_LQ@%!`~MZj)j1A1dsiO_X~J>dExWz-<{P%r_>N=RIkN0M%-koWH_@su;4Zv zd6QK@?J#dPD{GnYyfN|ZEVlY`ioA)ud&iC0fuE;3}Kh@OIXANGfs^QIZo|G;| z%y-%JJPyo0e(ck)c^cz>X`-JFHm_qnx zB&;Q_Me*g~&59RAQZ{Pq59I>ku#$K)rE8rt)aOAHr8xO;?dV!93IDg-`^Vr9zhO~R zA;sEThby(SX7WGE7zMVoqWS2%W5v7UBH=#h;LWdItYG~r??cy^)<^Ue6L?%@-=`2> z3frE}4TBZsuYxU_@VRswFR|1$wk!3>2p0ld7;-+Nj+YbjxRe-?*T*Q_8#lSA%}k$r z3y({@xE7wT?NC|Ku)rSg{%f8?>d9#w2PyZHk1xXK*3)-B)^}eQWS7n~@1>n6rmvcH z#No!xS>T?MM;Cw6UN3-sHh4NrN z^67wJX}-TvA0Q5K>ydF7*^H`xfjNc+ds6v-Ip8bA3x0wRUpxy$5IUX`iLM3wXSvr@ z_GA4_G<%QE0hQ!rOQ0o1#0$IP@PjEP_SaLUK5>7hIiH)@JpvZJ$SEPrU6*y3@_Gegq-73Mg?$Qfs=sksz%?*OXH)*mJ(i< zqXz_J6hO1GG2>W6;iX0UopD3>M!x`zo)~moT#;%N0jF>8mn04T0%55dhdCBpf8H^H zHLx6SXkitPV(F)p@a%PLS&2-}l{}?RN2yEJ?p4sq*C&(m3v#gJq0=qXd|6@O5g*Tc zV$?)YnPCTHKoc_OA0vWw6Txf1Q#g@fHC^`R!~+DJdW@pE0|o@q@RhdU0`%#I;H>Pg zss@bJo%5jjlwOJ_Yj5CwWuj!Y4H$%zrR?%`24H2s(F;0)Saq&p`;N5qpPx=v0wr#oHGdmaw&fxxZ$x z`T-BHXTkH0`!j$B)kC(+$jeQv15x7;_w*zfyfgV^%nV9=f7e6ukmCM!lfR|bwo9-O zCOZx3+I)1JNzLxxG>E<-lt~}`xv+>D)wmuOLTcy}Oa2v|;8mA7kyIFz9g#eg{p$?B zj*hs}edy0nF@tSnq6E$w5&y<}9aVWxfw?BF0zStnL&$2*FN-kxAo0oCtM#%2o^Taz ztd8gaTBVAQefH@DoclPu9Qg{LJ*SS2UTki$Sta@>mMrII5e(4&?;`Gn~vVx$U?xwT8pA ze++iB!~YlxC~i&NYw57-;gz^zz(!rdxty51s9A+&;ZESQiB?N)CQ@SCH$<2M?4VGI zFqhTGLVvlLnITY)y2}dJT|V7;IdvDhyIqNDo2=QCdP~AZe0l~CJDef|tr?+EoMI8B z{A0R0XIy%eRxLk@HG2$3qo3s}++?zf(HIbWA7m$qCI@YG@uCq(L2$BVdLHTn-GJf$ z>Rq2J=*^keplE^x$`~l7pX4&bDcVxcTYLEoG$}P7WPW7(2=r79dq*tV^7Y2`-}ok` zsx^$1$B=3aufbu;de)yS*2OQ(%6~}pj%O;arUHWj8=!~%&~esFhy@xAhRFv(z|{-z|F(vmO@#OaghjftqxNIBq@c2f1)~I6<^_09foN zNpgKQ(D-hS)U`%%0&Oh@Q0nGnkiktS%nI{ zGr%iVa4FsBEiXtJ{8%$gvlS=em?!f05)qX52cu44Hn-V{K848k`kNz3z4$AoJ~3u_ z-61i6BzrtRZWH~r{B+3k=9-F=QV)&5Py}5E+=)aI94d?DcqB$K|0y?A4Cid$xJ!dc z@pj`$es`j<(2gHUWz}u|fd28hD8g2vjs$u1Hbf2*?9-SE`s`ILVSMIb$q?5Sd}L11 zL-XG4Jdj8~FpRjlE=#Ev`fKh_3lg&U^LhcuZHENXJp_V4qbROO58Ij08!EU;6m zCT@j}+N2eVr9W-PM$b0q2(g=tf9fSa9F_ZKy{5eKz(X#1J?>;8QM_K4Kpp%3H0nR6 z*N2G6g<^U5F{u`}UH9SOUNt^B*~d$g?;k^!>irm}gEP4r`{RK@Yh2`-6^jttY|NwC z8^~O0bV=N6e2`ao`2w5oY_L23iE2QM9F5Uo!%5NTWmo~1rJ~}Y=bBR2m|Y=CD8)bz z=K3Oaz}IRmo| ztI_j!!FU6rfddQ*RcD3J_l=^Q-sCk$?;hgg6T4|&+zy!mMX!G6G;V=^g}W1P_HNC6 zOHv*D+=Y?iAxrPj72c71=zjt~^BbU>YWaY03RNY&@P7;}>jH@vqyBVQJ12B0en>f9 z6aU&9SO>pGBy=EtgEUd-7i=r9ZpwH4c?iZ856nN($@avMdxYPkv-4}~^aBMRo};&n z*60mvRh(^{_DcpwN~P@P!bbG)MO6?X$vZ2S?DSCIYeyhNPn;PrL!Hodf~;ePBH-C} zS?1tWZ=fT8ig@#nA;G{ct$@i02pu@QZG2JWzt*ydOr!{$G&F+=H#tmQmmSJjtW4|_ z%;@(NvgBVn7*=9xp(WQDsgK8C1~1#SdbV0D{S{6D)XxDyQgiNUr5QmpPh!{52mseW zjjBot7-m~gMSH6isvLbkA5q<`xGH$WcLHqlq>7*3N`sknM>frh>Y6H~m$VdI`?AEm z=UV+`jB)>aDk!!?Rg(TCRqj;%&BUfxp|G;3DRwfRe)N3q5zp5fo_1lE%7baeRlDjE zGS=^4CgvZP8%K!io;`3#APpu`Pi6}wR-k}r(yTf2{tR26{j0kmk`6lvZ&Pz5-Q26} z2**2u7g4+4tyBz~muRI1$LocR)C*CSIp*Z(GKepw0Z7H@_}#}{a12<=UwcKtp9ABK zu_-q9y$>Fa7(&S_;TCP@>rjX{V8}E5R{g^I%wLJZmBvxejWdTgVWp)hfu^8qUa-go z2tw#Ih*{Uh=PF@rZDZTEo|qi_%j-xNp?>~c5MfM55Im7*Xh5#mU^Wd#71h5d=J@>` zKHcckWv0)3@Jx^Ks<;BF4Uw$h1=yl<@>x25m5D|&KFPHpn-1OBe+*Acg40i)%eajP z>6x3Zksis!9T@IC{^H?w47|9?X+h6Bqvt<6e(5nYZTXFrI zsPt((lx~L1?fS^5PrSGBqBbphcU}C;Z-DNC7_fk5lf*n^cL>pAHc~6#5ORdx&{HGG z`CsYK)r>_mb#VLCNSiBhYQL^tob#J@$BDTHcO87(2GD?t)CX;f$~=&6Q}CXlhERJt zJ&F&_M<{H~$pbS2d3hPWgnn>#^3O50qY9@o??;d`Pwx+a0%B${D`smIR@Py8b%p28 znXc`8q~&yNmzd4vcr@Cu`|gYxXDMf0cVL_Asq$UGh*S1aOl6)k*B(vDs9jcZqCvQ8 zN#Wh$^@!tlaWlk6mzR;mv#SSo6v5Bxyjjo8if%j~H~nJiX(g(s(etv!g1nn+8l4FI z^})PZCNROGzpXXi)$?gO=Q8KIR4Y(PlfGGaDYbTrzx}loOR-7Bx&gJlp~kXv6zs+= zawj5um{3{FTbARe@QrO_K{Is#XtS=Hs5-$rjTIMM3y1wu_0UH)FjB;uY)eznVFI6e z={gsAx>@l^cB<+=b9i1*o*BqaQ^6x(_pl(Zv?9B|$yi07OFlb1o@SuLQb(FUYJKij zF~^Zz!Ke7r;xFL7_V94>@6%h}tcw;H>njU&{}@C{7v$87B>piliGO|0xW=Umk85n3 z7>&P*j$QKP+hlq^(pY?4Xz~Eo7G~|qLYPNv>i`S6%hiFDUGBSDCdx;uD zI@e4ntJ>MDTFdqWhn(o$*WX(l=Obc}^87%`%7;&9^ODtH7mwR>XSCu#LFwI`L)M@< z?|1*>=(^*n{{OE}gHmW1McgD=A!QVCDp9Nzobw!f_xI-3VuNQ)_tcMrFm6{g0T6+OUY&+N{_5JUDAX_ExJ~mvwXQ&dK5AW#JL_MRtbbQOLXJcDXoj zS4Ku7zmV*25UY{t-Zz712XrmmlU>bV&Uu8=d!fmmMcFDsiAlOTFLqTzn;x?I;$j*t zeFe`f{bU-=HkyQW=mh21f#eyPs*_V*&tyDKM<{a>WyKxMC$hN4%zaJN_^UrWSv>eK z`6ZYsp$z+oSo_EJVchKM2SB>30WK}=cukl;{YOsO4jA?>mZNp&06$pcS|0&QTkTs- z-?~PJHxI*;jlkks;~%mP&5MUO_&TxH!WYNQCd~AOl9odyk9cs74`k^^zt220+CN#W zJ}I4gCbI8;xR{NyS98@0qduek8Z3jeEQg1P1qz*grLn0ZeYv0Y*5)gW11|&6-rr&E zGOH)JAm;_L`6yI4Mh3y}czy1IshsjF*Il_V6Z#zkXN$6pH-w~rld)A{e zX~e&op^nJt)zp9uiObwxU(Niqsa7SF0Kvv>26rP%&$@r*{T2eMz|kKkUCAeC-_;j@ zBw(ZLCpn+NwGa1z306pl;Nxanml*ewh7rTF5_OU#BV=B$U#RT_K7*AN%LiPAHJ{9_eW%MlbMN+~=z$|2d-iZm!4&Fkm7%jhZj_3e_XYA$-+n4u_3eb6 z;+pLyUuVosn&l|=KRUwOCG?B%%=PX|tAnnw-qXa2EGgxK_La9YL)8f=`Xen>khP{) z1FjDBGBi}GZPlyAiTNpJVw1x*qv(tuz1nX5VlE8zqBMBnVCwF7eaoJtXRsk-p|dQ+ z4+Nxb4 znW{b7>t|9ax0|&hKVQFCW90!m9g~$JDaNS#Nrd(>JC_TmkkTQid`Oa({ft@BqH_@L zvYY?dgu+{f^dE(-Envw=079jyyhn^ zpN%}*cEyF`+o#DovCS9&CCd~aFGSxrvB|oy@a>71E2t)rsU)|Fmbd!T-Lv;Jz|og; z0Vly+lQ4y}X0&f`Vj-1t0IkZwT{if= zkl>BNLEN^Cun0Isa$_#?H?nX9_v}I@cYz&Y7pT^`+E2r`I0^5`Vr?a#1$jkZv|)dY z`*8JZPy7iTZs*06at9qt*>kVAKRd}BdMYO4a`lY?&mS8?8WavOUGFAV_tfS6(LbwD zOTOG#f<{fw&0P+(G&cjcdpMZ`2hu3($MXFtIwS3TqrYxF3Xz`KXa{jE^h)nNw;ZD+ zalp25a^_~^;I4pd+=+p(zZp;YFhplTn~_muj}cJ<>8N-mfB#6 z7gbmZ1{d^RYt}1tSh4rv6`?1TR$gfrvEGRptP|FTlYAaR8au7}HSJ`0j%FYW=B&{d zaJ;3WTBBK=i{$jt|2VC~sy9Qc!EblQu>sGV?*bG-cAQATs>#_a@|7z5D=}safvI|F z_|9!EBYbZ&lwRnl)oDdl9^nB$$>3h|FB_Cq58gwq|Ye_1V>2(-Qr-fA|hWeS!<~TgdSG z)x=A8$N;UeM)>FDyET#d8;^Ag&9fD^K7^SynnF}uF~OGL)$WofWh z&wHWC?TVLj2Z&_j#xC%#YTlq=SdrjgHMuv{t@|5WJ**1GvvKFaJ)`OYVq_TvKL{ z=A+4vEvF~%%_-TUjK0mw-4PtDc9j$<>M8=HMstnFY7vvFQwml}omH@)ZV-rAq(52n zWnuFVd(B4YeHwNE0i%i@w=$aBm>hZhR9+=<{vP#-oZ=H6*4oJa#KxoHXZcyy%PHY@ z0CC*3PeeH-bz>ApxDJa!PC-={10L#Yws^3Io%~V>?zjk`M>u(-P#(Si^2)NaR#j>0 zmi=A;^yLZyP3cr$ASK-SfE@12nB{me=<@@%xhI<+*!b&@ZJ20^k-c8+^rS4c#r+A% zO6?@+3dO4W)ot*-Z4OC#7+3U=+`BCgMMG9n(A_#+ZyL{Ij_@ z!#RYMHngONEc$SkfzNm~=$gUgoW&?(ZA}7(l=%2ijbtChm(;q7R-4z|d0)&=OW2F) zPX4bl`^UD*W40kavJ?erN5JH7a2!lR`Q}ZLZmzSI*3g4pso;I1GA8j8th5ZNy=6*! z=lq1Sr-#Br0~h@V%js&KCV+W^!ZcRw?O$=HXDnKH@pPMH)ki}+oN!J^`SINwote2X zWynn*BNVv}ZM}NFMJnc?@#miLq;=Jh# zK(AciNagOF{d^4`fb9@y{6zX@^ae&+O1w5##guPcRpGF@i37y@RYR8I_drI&hd9$v zx|Ucw$x%G(u~Iw=m#@Go22v?S^E%7CMj;+{i9_q2f+G zDnaY;EHbQ1TvcXR;aRVdTR#D6xc8v~^D>m(&hd%a?OhY=U5a-ku?U9GRT{bDpv?46 zX$af0sADj67A?iZ|Mf&E_24H#8)L~M5ZU|EB zQNrXjD57}_m*C{$A=$}@?=Odj#Eox$@qYgp!Lxeh9Wf1UgJ>5mM&L76Gw-bmclyDI z(bcAS`BeE>j&eZH7LHx4%bK(6{1X+Vm9VBsQ+z&GeoN zh*+@gVqN#-FdBy3zqb&-jF?|^-Ar){gAC`u_bec@QsClefd%aN(KE%E!%V+f&uLn? zLvQ9cpcXmVxl%zXI;KzAh!{fTuScaWS?K|H$$71lBxy>p9SlYf0jQrWd<` z(E{Q%6AaUGnk7x}OP!!V@Yoq=kpxTk+IQ!VZmKt8wc3%5(alC;LfJ;+GjC!e`2&eN8Om%&UchORom@E_*tG4*=j#*cytzk(haCeF_py zXfg%flgXxituI6^;!)cQV(=VCvzjYVw44we*yiS@8gFmZB3PTnNU9a`eM;Jc)?Cig zNAJtG)Hs0tPyQ z2J@)AhHiKH_w(r=7KZrRvw>%%oDnW(^fSU@Gqi{w;6iHEE;Ui1!Y;438kLl|Shx9b ztuKT&%LJQZdx0`ve(Kl|#*S>LK34!P zdtd4MzUluLoRPS#v?7_Pg-Z#&x@5kGZLZNlZI3_{+x*Q_!QA8X-_nsUXJrg(8Q8)A z4yF^S_?3#vOw!l)4)3NOtQ=KTO1XpR8EJ&VL5!+|F}&52+Wjs}P~S4^5!hUtJ6BQd zl_-zZ(J8rQx(JkWZLQ45@uf76pZNF3pP8J(XOQ~>Rdi{SDSMo|$0zEOwZmk1|1~Ub zBqS(l^|I|S2I{oXzDX6o#0J~?oT+b==j#4x@HO4=Ky*?4XQNWwKeo^Q)m%{zB=1IC z`1*7svOjkWB|CMuTb4Fr7mz*5T=Y&q4bJ|rB0WbkcMc}o;in(wr{1JoPK4&beR{puKq?PA=Q2V@L+agEpP4ed_0kEe+@Iiw{=p>@V?`?@|5}k2)Zr2BJ%8mu zoD`eQ4hxQP7?36@HSkQQR`98ZE&?+?Wm&l4efPSWrPPI)0O#-rhYLA&5Wbt6{*mA)x{eJ8#NQasm;=p$x&BhIgcdTP+I|-*|tl+ zX@j!*Iq--n_H!D1Qb*NMMfM1C9|6?V#t^Z2rAO1x8Z8B4(4Jw zh+P0)VC$6^Ux+zGfKM{Ce?m8K`|N~bC2;q-P78Xf|BfVHTJ_~1=Pl9iZw*#CMYQ2; z5o;RpK9;wDVqtS5R4g3daN1CvM&SIqTiiCh8oMgyY|$Oj>o%Fw@d4O*@1_+3*uT0u*1A<@>V+4S+%f(`OPh8AhrP~T9Mwc5Z8 z(u=AL(776x+m9%OgJ})U`F%_W-$UKU7HM6?OT=%!}>z1)TZB8>?9RsjOKv0q8b5z`r zeFl2hRN)?%x4C zeS&8%7YIhFtrT5dC$UnmuWvBO}bZfXzG{x`%F$Y(E^sqY zZoWI%tY;kivx|kANX&x&6KD=Qk(vIactiVF%6XFC+{Fn6(6c8&k|d)7TbnF+!@8lA zD`>B-vFZoouXdGC*(@j@)%VLnSYv*2)#t~g>3C<+-tQI`+8TlzN5>gj@~wNDC+D!+BIu|RpM&lCS1uTE6J!lJjcZp<&z%>=_@09bR&hK}o7Tdkgu0)NSZB9bE zZH9<-rq*>pr1wm8XtK9K*}dE2xv++<(3K! zST8w)dC_wWRNTE8aHftZm=jTF!MF^i&W)B znzNPDe06-dUQS*_jm8?+)MZvw`KG;zxKM#nD!^*I~&I_EEi47dGZvd^mD&}Vaba<)^I8iWU{_Z z`crvur>F1v>5V7m^d4G-+=_gl1t&uJj7Hs7%spzL|Jb&tomEw?x2}D3^2wPK0PTkb zKm5n`Ux5;eG<9Br&H)8&+W3LXRlS`v>6}kfL=U3|RDH6FqdclqCO?JzR5{_hW3Ole z>?}fFB3oR2~mYEjSGQC~pHjAXm2C+y+tl9iI4KFU#ls zuKHXf(=u-QuAkM~#C({QV0W`mcKDR%-q$&|*GAc>5K~Ata$43(_M2PGeg88%28$Dk zfkdcvhyqJ_q7*<5w-Zc#4-@&22bIBgA3Tuh8F`z+g-YNSi6^Q7YBx^XlAm2n&n&fj zV-fz+E@0T=>z}?lK(+a&!qFr82cmF>_wJ>2%fQ4B%n5?r6s4lgq+GuwUMejVampDq zey3Cqj077Mb}p(yZmu82>t7xrM?VTGS(^jA8AJ%2!owLj|33%wj|sJ`j@_jIjl5|6 zi_@~&n$(C)?}ZNsUcB)JtoZ-1Ib9@qiuYXK^BRIM?8cVy&j-;A?ERle}@3)9La z5w*#EOD&@B;Mm+RScS94s_wR?)m6AR9o68S(9=Z=XKq%3BVSGRV9HSJJ7YDLXJILJ z#{V%Lt+k3gU)uIfsJktD^fAOju`9FzrE9e%If7sLtFxMb&N?OpDg#S2N+Ue^&3i*4 zZ`#tbW(fP<_(G+tT`31fD*ZoZ-R$Chd;T)m%03!z33rWh+%+jOPT9v6@csZq$}_R7 z?(d^|u&SXFNI!P??dO@{rF;&0Bd+lXFzZV!i4!pjxpw}1-x+)H*5WCf?=mWyq}{$S z4x6+*X1{X5R1gIno$iV$3y~BR{!yg&Y6q+o5ESc=3X174U9nwn9UcfcYpL^(&0vF+ zS*vW=7$q$we_zMv_FyuAy)_loz?M!_5*qiOK>s|Ia5fB{4tu{i`sMypO#X8v8Mm>Q zttSW6;FLT5n%ylfPfM;wwy4gBY|fYY!`bay`5a&bAky7xkjcy|eDe zDJ#{VF8fCDzkX~;7Iwi_51)b(9CWB!mMKF`ZkYxT#D%WqiWWI=-oR;k2s{FtdZ8#`M4^CDe9uv_x1inpeqNTuFTf@eRp#KwB+ zW5`Ls-DQo7qhc0$DUfj{`W9>REGz~c6TJnU2z~XFn&9)>L@kedhR>R{b#F{n?o-Y1 z7nkb%xtAt?;*@JaM5XlEobR)K<37uoSFxm%RiAYK1KCg#EHlgOudE4m`~2<208zu z`Hkj;be|iW67?6)-rBrS%hm5ZmkcX2iWgv^G1R=j(|`r5cNuh?cQbw^}uHe=#AW2xj754qkWeG{^;jTZ|SMp9CEnC|Tyml?UT zr+Imsh|lqjs9}z}J7Z=zn1k5UKa&D~Pt&T;zPl5Zz9}i?iD$?xfPp-xVrQi0?~S%FxrR%*hvpT;tNSaT;>lEyU_E+Sh4OgGdB-dj(!tqN#hy z9^L2sDKzH2GvGr0_18j27eMxejjI>6&`Xk0`LFLO(db51fegnafOb-K#bfA3S4{nV zbFw{3L1RjARg-p@w!(m-=jKIi zf$2UkiZ)w1%bA?q+3IFY34Lk_Z?48d(M*$BXtYj1u^afCd2P+)NMqvJ@TEFKLqVFp zG4CBVjl6DEu*Zyw-OJ@l-ypd9Um^1H`aibR^JQ7~D--ma*Hnko92tBdTA7RXU7G7~ zx%%&=_f|bXelO6b6Vuy?Q$-( z_`&DTSbND#rPC@rkHu4!W%K;=Q)hLWOcj6}{gbGKRrz-6-Bs#oH$76((uXRhav@tN zV4WsGD_8wU_5OK2t&xP+YEGUhzwXzyZ-IjwVP5qDxCt$q8st899pC7qvo#BXHaYy( z>_r^>JsWBUvAqT}($T(=Idxz?R>MX^q#$F$ z@mYVmCMKT=o3Na8u! z(}?=@lXEuRtPNAeluB_`(QLcivHg1yvShr)aY!7;J9>z`#hO>~C{YqW^u}2RmS%$r z`vLq(r=FPwu~X1AA)l&w7I7KbCPM z;l>{p#=3#T`pGjYx^_R~{+S!UmaTWPs*fBc_Mfti&o2o&4~}fI_~7R=>5n$cLsVu0 z-UZfT?8PcTBZjXP6Y>sTl}7u>l|l$Fyo|CA*d?RS%J(den*+ZL5;)=LEmHBT{bUWU zp<-(E)d5uLCD{7Yx}*HF_AzULT}e4RpJQS0sJbsa8wQX9k&7kn7eM)1BrNEMM#&u? zjdbW#`5naxJMxrGO#r`4`Llm)&AktJX6#7nFWEx{r7L=CRl_;}B5(_P+$hwS6ujA! zMe-}>IC91-__Mxod9_S2YgAOztMFX5LK73V&Iw@himly=^D7k;pu_UX)nW0V4chiO zY8$@U55-%GR67Qnacqlu%kUVZVt&DRBl3|*yz9Yv>r8)|yr(IIf^Z862;B<&vZlUd%Yy>pr`G>!uVa+wZd+Prx}~(Z9Y~~ zFXbNQq+JZweCxWf(iQ%?wrago7#g zi-YOW*z1ifeABcq+}2-U4aU6BG0N&_l+|Ihx;dutI9|xT1L)~2l+a0=pbtvu7thR6+)Nsm}TMROPaa{P!1 z=BT!V7DdN5PQ=Fdl9(gH1bUvAHb zthZu`tTjvLd2V>UVIhKsAk#RNYyY8VOGcQAXL*>ef(pi7vna{f&ZoZ-9Mihi+%PKt zw^Y}$9}7xg11ALd4isoX*dJD1c(8Jqk#P?Jkjq{7de4PS{itO{F1J&5@ z(vuKjllfhq7t|a)2o+r@a=~~@R5gQp(WxeIEN8Q~yJgCD^?1v!uhMm(ZZzZq{0nm$ z(%VQhFRI8y(``LtdXYtAHU`loyM%>Guiw&$Dyb|1*h!x@+M@ER_!_Db+X~5n=|$oH z*d}AG!o_}T^r=@Dp@>ypkZx3^7k}2!xc4NF?>Wt<%u^$WUZb-@$9iACv#<|tUoMtt z=SLt!nGeQmhMNz#2QM`F?6}YM#In+BxrAJ0QOr^DD9n#KE4`z%n97v~S_LzB!{Y3}?GxOtGHp+|=1&1b=zj#4! z9*f<;%y92<#0r?)OcbR??L97{@YLwE&c7%Z-z=`{RA=aViT`68DV{i`;?PlW#m8Db z|H;7+(CA9VB%<$SA4aY)OTK)54V!^_F*DFmee>N`p2&yyhAsK)Ph$#^iSoKCT#8^G zJ5y6rb_IsoHG@+O#={!p#skMf{+4&?D)#NuESq1uaKa_*K?6yP5?J&>M=^MOaUp)i zBK9BKCuC!T@m&%XM3Nj7phl!ex3Grh#oJ|&8+htlQHGh0TReC-jhG1>Tvu2FwE275 zRCT{^D#0KJqm^j{P~6e~iMge0zWPAt^d{MW>WWn54Jic#j&m1U1Ak!vFf-S9H(zyp zNI9Q%4SXxbEq1L1Sy?cDx%ks()e&+3jKn0Q@P+;uiW7Eiv8@)@jlu7&-LdHoh> zIbs>mPi(AV`UKVIjljOc?cI4RyHwJN*zpQ?(&iA1zt$od2`N0d^> zB6AmAJY|Iqs}nK{C*tG4`>K}JbQRO?%!CTwzqPgA5Y4QfgT+j~yz@1e=`(Go-~GiC#wUWtw@))bZ|D4Jn%98rgIk7ln}m(&D`M~4naqBcX=1^ zW@1Z)4hy0YXSdy^lJ7S$FI1Zbrx{}9S(}yGP(aW;qbTDvU1s>W@VRK}A>9o{9HOIpjsjDkKLck>aU6+w^ z+mX^wN#Llomq)BN&j~TSn$l^qcmL!e0-@Mo10<$#M3)h1DWsS5)x8B#X`-_MMB*;( z8b=SKD0@PgDHjYELxR}Rfl5k+d(V#gT%s1hl~{M$#xS0!JlpswcwuTT zc?EmOPXL#7c?^<;++cm1Zbe6&UI1PPc;Sjxr3OsOd-$LRl9`jO13=in>-F{U4OQ2= zU2{%q{J2fdW}5`bt~M zJsm0nfdDbY$2cLluErg^3NQuK?E)i1TvJUo2Y$r0w&pF48C1>DiM%^xVR@uw878s0 zq6hY%%&w~SZ{b^dkp9cZ>$sRD056~O_tN4g;eGB-Ioj~}NdtU{zlP`RdiAbfL6C#U zFl=Rw?@pSxP*b4dku!jvC!qrLuy!q#Zm)BSo(j+Xs=kj~rzyH{%B_GOJ#hw>PP4c|sx2vOA#^VbWtjns+lkrjRs~&Uw z${KUkn&1O~B`;hVS$8Zp(Cl$6cFFQ8cs$$o@-ljC@KI6W`@t^=<&5Qumx*~Tt{~>R z8Z64$&Vy3?iPF5q^(!(`7-<0HM7X`NF%tFequ^>tvlSc~7AFmRXk5z4)f`{cJB|0L zz_i(!n&>hPdzA8DO>`}QV2428da-jQ6mUIN_(0Lv);UrK0k`zCqOn&{tRI>9K56iq z_Z5XLoaK$1k+1Bbd%fbthZAk;grJ*kUHZEL=jl1#nKk%5U(uM1^+u9u?O(j)lOMDI z^Ma71);Fd+Tpt2tEr9D+FJN}9l<&^da?gvGN!E8zTLKS#bI#5qt9}fb*#!TD+yddC zFP~{l2)K*;v?9Ht$z1gkj;sez5{h&NRcRycwp{W-rIvLKc#}`2OxxuvgKZ0T4#6mL zxfiS@BYD#~wt0A;FAf0A*LWbe zuoy55-jlF@oRR5`yE0o|Zm02a!jiz^%ktQba7UPb*O2QFor-|d-a`M{A=3*nz?Ut` zd58~27l9NoVpVAzXIW1fx(y0=F~ZcwWr{59avT2be~hti24q4j$dVf~4R2Yd6RKKZ zNtKg57Xf6y6x9s{eJBw=9(K|a!{VO*DWK$MyX5Q7sQ?-k)&#;FM@c}GNb(x(;n_si zU0l!2$-6wM75F#>0GG*Ls0Qyf1`j!+sy_-w7Woi6{;t4+>jXoRd0{%J~!GE@w=taxUPqZxIRh}e4`OCRpm~B z97i(~Ro^=gPC;fHP08u|>!4Qef|U7Dgy;PyH|9gED7(n2avpk$-1nNuY{THDD7A=N|YzHK>0IPHwNUt`{%u4;)#0HIj!X~B#K5DA<(YVvBwPUTfw9j4`O@>Q)@mqg?s>95P z-XoaU3q3psg8FOTVG*e@Uq-fCDD@rc>iW9Q2*p05S6}#Iw{$0@D=pXjzidkB!(KfU zf%zvwBQT!KY)G+SSdKGj`~D2;>;8~WUAEby`3J*sgKSJ8!Qfi z{+yT;{%Iqt@jC_l>8UWdqe<29ZL@dL`qO5H7Ijw~h}%DNLLllYn$qSUg&#Hc88ro_@cU1_q*hKK6u0-#KIBedOjCuJ5N$Ghgg*6X<57o(;ZyyVAZc+49A zUSzVjHS=7v{a- zdf+&7BL_?kihamnDeqJr8vk#ps}OWx?#1cmYZbMm!;GAw5u&25dT{HZX`ec1 zx%7JEJ7@bNOYD5C(RY%v%%7KPZ)|}T2!2Mfg3<`Fr4D4}8vM_GFi=YWy1F6E(7a52 zU+DY(?O`Ung|9HxlA(xkkbuuB#w&wxcd89vFaGUxPQnKG!E!e0VSY*rW>1}(frvF5 zfK{PpjaCDFAc7s)(NtU@a+8mLLgc$dy#;)yax!p*77+2XYiUCL;AqggiQ2so;E+MN z3}1Te3PQ%?(Z)DYP@KO0_hXELkju=bMN53llKVDao|n<)#t5VuJmxiA)G--ZiOpm0 z_a*$i8hotCXZ|{?&3m_0F0JNx^F9{wU^mZeI}}rSSPY9P=p9=qorGl* zdRBoh@Rc%@c07ovGJAn^o=bE5o(bG|YiJZin|<7ZvXT*(53CE?a-k}=Isi!BdL5Q0 zu?aI<6vTBurMa`ANLa6M4;O?9%s*mW{{_yULbiSTPD%j|Q=PzRwUtDz8i2EPPHASs zE+owQNDDoEiEa*20^vSy6b8X7)4fDyyem5Pmt2cuX?3G84bRnzyg_I3L4Qz=`a7v@h`42(febYeM3q3aE$K;oz0a zSZKr63`S!4fRE=mY;(TbC~y33Ox3HEFvS9vqX4ybxM8%t;0Z(HH(E=+zg!!3bmMas zkdcy5Px8%XY9OG&B>~V;uVb+?If`ue>^W|(%1rX$;^Nsn+7%C<_EYaAHL>&mxCuMf*U6XS0TEdbWP@ zzE!Jv=VHU#no7(TGvQ`cG8u7KS0lOW@sG%fq6e@)+3r@kj`&djzu;rQ(Nhr6`^QFP zN9{0EVd>hi3q?}xT`1#18&szA6Fe5;M<ABe!|JlpHrW)C=X&V8}=CgEr2eJ&* zi`?D}nJmr9dBDU!tZeUWjXZgSYu=^?oKo`&sMHme(MTbCblYA~qtDUAKQ<-5-G6L> z%gR9x+}S}{%hB7MHd49=cknA#ph_+imKclzM_^X{sp5Y8zvtd+g z_)%})OkocVwU9XYxY4^S)Y=PN`0AXm%{QXAHe2gN95MuqpLGYk224}07*;@qB^#%U zWFu#wymt?7YuP+tMqcqoZIY#4n;+Z1k)){JVrrjqk?yDZR%d*Wug6r~;m3TV3w4Ey zl{`fW!s@^k=IY=>#;fTaXWo~VY?NG<@vqVgP=D-Jcb;}BNV#xz)Kub<9MnJ~Kub-Y z;%UFWW;Z_1v zKbq9m$@YY(o0Q>q^FJ&Xl(PiD`&f$}*ybah1FV*W4pO}@08gLtox8;1^&;NpVa+9T zqcg%{4ZCikgHoNe)maiwjqB8>N}P7F53O%9Zxd>PZu+(TW#*)5A*Fed+{{d;D=$1+ zlV&9xTzJRd@Y0)WT;46lOZz(Pn@NzMeGU$N&18QzYaVXB`{x0eGM7aR%^4f_=+NUz zKzedCn34vj{aO3H`YLa+^dG*gQxZ+_aPTh+toSG z9mFE0r617;PmHCq)`Cu^w8qn^V0MI?iWDVW7LxV$}ywUrd zhbsQ7a(H`lu*{Znf9!L~ymB!Okh@+3A2s7bnyESl@>(Br9(>m}W;Kun#3(@%g7@qP z+Xv9}yH;&r!?MOciR!x1kzR~+DCRWA&)UF(zGm3M(>2;3o-c!MqUB6Pru0GksDci; zt^8%gNW$^e-JK!UO?2#uR*|@)MCPkBAeE|l7iBZtupF^@WKB{Tny5xK+qRa|6@QEp z2luOYF5F@L9{yCbuSl&iemWkerK!SL@8k9?0DxM{C}Z?e4at!!W+Y3zT>^AzKoNENV% zLFD731of`cu%rWt+7lt~d00!ThKS8Y{Tj)~P1e${dG-==Oj)@XJ>8Zjsw?kgHXYm= zXJnM-zV7|UR+MNu?ls?0`%83_kZFLI492A>@c-JlPU%!T?d28CI{M%xOo=SC_&Lao zX&O8aTEm^Y66r3uMs#TGe|a~$Jj|gCsJIKOK!i(UASO*6t9w~Lav!gd=gcQ=1`PH* z!2@poC=j}#=6RR#j7w8n1^V+%J2 zlh$S$M70@?l~_5-zh~s;-OwMt>)S(pG|{qt79w!=Fs299o)$@V&4cVsxcnye`-PjhgU0$ z^=WREuPe`$XL15wK&(vMuZM^h^W^H{bo{KJ1cmW-^DTN!)W~JK?H#ZHWs&MZdFVaMh5Fu* zkMvX%*zZ{@NGv7Nw;N-RQSb5wAT6bJ%JHqe?eAk4^^X62uGp3u%4_$9_$9Y@jO`Ae zWem*5@sE70YSIwN?3AqkSm|JSI`q7XU?rz=E<8ZH?i6LKq&nmtKlsnpHmW zAKT%`_FqkBdglFZ+~5_NZr?Onpa5EEQYtK~RPOIM{R$`mXZX^^{?|TAr(@iwG3>wb z&H!wh(0u`?byuK7>f35a^?q|E{ z&l!(a2RLoxd)P}mp56uT&k2CZok6Rvbx%92^2&JcfWD@0gAN~7Hc@*G)h|Xuz5z;w zPcTAgf*gfFV5k9a9Jad!ra8PpT1Q@_SY5Au+~S_p^@LYK@8yxm8f%bs%d;@!$SV=p z|JI+_#6c5EhVA#njG!q%hqQX!mzBN?BiIU?h7$H?RxvLn{x$>o%jZpp)RyV#kq#ww ztNGe1?$dA)*ak`p!1z?(n`7IeBS@x=K3$nq-#wK>ZN&mpdBe34**#Zq`hfb`@&ZCQ zCLz?;cr_5t8sca$p6y))wkm8U?SH*amklZ;&z0h>T~_yMa*dhn#p4l)Xz|MzjGfSV z`MMy6KVsQVUJs9<3@@^VhUMu>!c{p6=4lH%@-)<4%zlos8xH0V7zjeMH~5x(=_*0& zgE4B_o1%`a_rSxvSoDeH^U)@g*G}&6eZ&fWRON8<>w6w!K;N%4anF3UXI+4qHRL*b z3rNdEXa@|}(p{jc{&2OIdQ?Dc7;{t!%NYOdjG9sTDu(Zx-H!#KiLDr0X*sQS&WI!S z2=Jjmq2ta+g4%X92K1YlgWs=xx7jmi_22ZtZSo302A9G!jH*1`m~YC=G&WU-zitag z8Om)hTFm^fn>BG}_HnJweyNp7KOdL;1!zPT=I`?njY_Xh$Vs;*>jRY5<%VOaHi+? z*pcl^V<_}Xg}FI$3TzAgztNu%Yw(R=0x5J@=@$%vBEChRD6r`Sei?^NeC zNgza3TYn?+h+C2Fl4w^QXW*BpNXT7{I&+ibOdBFZWF)`uFsu6^S*i@BRpE>C^7x;< z&Mbw&I>VaRiLAFOJ4&puSj_A2N{TiKtK@kT%sd|o$;Kjk7c8jpwV#EOQqIBVUlcad ztqVt==Vp|2v_o6R{9w00x@J(6zx+{7))1?H3&K z^z}WcC5m37>bQRuVwj}3OA%vL;LFlcjb<-=SAxKNX1=pvhV zvKF7C)#|>@DjWsWvg1#I=eE&<=-Je!zXQpinW}p0ZUL!xy zeGecz>i-5z_!Y+3l5iXt1F>?k0|)qUo(^o*dj{b2 zvd{YNgZ2d~AM&ws*w#QaKx#jTFm$Bw)H2P1*ZZ4dY#3T?q!z@g2FrNK9~zhML6WM+ z-Gx-Efs4|)1nY#T^-tQ9XRN~i$m0HO6G8V@oL zQFQSq0Dx&0j5g%Jw5ISNzVYYLN5*6yPDHl-U`v`h1)TFjU#5CR@_{3X9TStWkhf{H zxSMTY3WdGaWcil`OI)opAAZD-Eg6%S5%uvu(apb9+QqDP-m$;6if_%8pnfTun0ua_zb+O~Cv3 zwo0l4r2*gXVFH?ubxZA^rmW$AZ2>X;2M zlDjw$EKNn>AJ)FXu|*DZejPO+^4lJi4{Iv`UN(5WQpT%yPh>ej3$J>h4@Yuq3`YB3 zHw0Naced5YBhfb3x%7)#m@S>4jESucXwf&7Jl9!mN7*XQcrM&pqFPZG?Q_;}*2E9I zs=0`KmuN(-^b;|kklllr9w4%Rfk?CD_l3NaxxKb#^W3(AG%pAT>5$3*D#c`p>V+YaWjT{o&rMQ1TT%`$1ch~H_^kqoQ1DiZ$We{#Zf#(8d4 z?+&_^uO|qhJD!6C2I?k(>}Tuja;5%o%_v5qZ0$2b&ZJI&EEL>iFTIHQVmYYI)XEv{ zKUtu^@c!th(>;dW_NS8qd{$F4Ckq0|!z+`#^eMKSvY&xs&jXnHSpX*tE@yI+9MhLI z54x&gM7K#Zih48~mf%!~XQYI(Z>xEU{aUJx*C6p;$jo3uA;`%~u9}$e)ymAeaWRQh zuM`4=;`}9iQZ5hW>?Fqze@d6xn=at53Ox#X<1DTY0yz7r2s292ovR|vBwXD78z}&* z6~eFGc1t@YcLxe~qU9k`Zcb8qfvfeo3H0r=rsDn9=P^99f;r1^Ixp1THOLmQSNAFm zpRsDRaVTKcKJ=*Pz}BsbS5g9aBKz&z;Dmr$_6gH{4H2#JeM_WT zpOkM?-Wtgl+E*S&WHv3xrqR<=u2X$Mt>j?l^-lUOtl){+?ZBlUkgC*;5uvYzYyHbB z9|2cJ#%2G`0HYUSMjlO=Q^~qn4dK0~smvUi>Bx*7`O+sVw9MM;(OUjs!oO>T<~}I@ z+AIFEst!Z+8&XY~?g=8@@GJ9)I>^{1i}pn$ub)OQ22sjMUHe2|I(O}peCr=cV;x&a z?c)N;0tm!Y{L*rjD47GQ1^w(DDGZ3aapV;FSIZ@``e27H0K;nsG4Nrsl$e2Z63r05 zXaX5|4NWr?m7RZ%Phgm6?}u~p!+}9Rd1?;?MHO}QTc^nq{mS+5=|1nf)X>QC9^nyU z3pr6cpZ;FKk=o_@0ZOgp2LKU12uZcQBVwk!z>W{n1~@g4)Nox7FM0!-0z35gl0R&G zUWLmJYv~*Qkq-103#|2h#UzW%b>^n={lyDpuIq#;LULdU2zRJI%6+GMZ-dCiw{sEC zrpp%g({Q3-K=HjPZ##cs5Ns9fz~}{qO^4k!h1#YAE3&=QP8Bm@YK%snm~8ZO%e>Sq zy3cJN?b7ZC5N*J)wZ}c3WT9Iw7y=}1MKBgn^2oph0jX|0Z=>Mj1tMrY2>wDaU3mHc zSsKC1xIvp*J~?d99R{GFDw@YUwW$Km@V%nPSa8WueZ}>W zB{GAwFLdeFo6SJ*yT=EhWNAbdXfe@2f&(+OBB*_DFeCL0;v~3rV1EUaI}yc0)#0lT z<;C1I`bjhx5pRf7Ypa1oY9CaQt;&QK^EK%HKii<3Ti3xp)DV(KnXpy#3~S05SbrLj zAS7vXRlzff%`iq%6#bu^DFCDU7!p#(SzQ~XZDL_M^zoM8THe_4Y68Gwdi4`&2V_Hn z>h`W`v?2Qz4ypDHIO$oq9^w}FR)LdQz^Tf$V>qxM#7IsV(`pbSWnZx+Xf?wqXS8QkeBG`Zq(j^)``vg!8 z!K*5pKAv{~CkuiE#n`bF60Q$dS#cn#m^<|~f4N0f#u=#Q5+J#Zo^S0TzKT5&JJ|*= z;Qs#~j%b$4XjXQId?W_C3PkHZYUQe%6wvq?-*(Bibst2W-AB zX41@bzML;z58JusYfWF=p%+d&J^$iCERe1*?f;V#ZQmoiHR3c^2=>vu-$h_oJINmRpbCq8hQ3}oLUqu<8X!2?PS!9=M$-<7lCf zCuffy{!i|%Wb?To^arDSky{#0=}%#SlF^QkU+00=wae4g)|*qnUZNEpLwIM|KUNmr z>Mm{!*H188WN|@zSEtN=)u)E1vaub5c3`H|@95zU$tFWbh!9c0$rw)E8?(etL}EQ3 z9XoRk(3$F4l%2tK#h*y;mJ488s`f%N;WifC7RLo#-v;P}0~W4j8mJJA(k@o&jC<$z zK?juE8@WW&CRbs&H76KkatuF8KQDUI00cuJ?nM(b$588H7DrOEVS)IxFY`_wrz32l0euh0p^qQ^KvSIK)ABvhi{4~)zn`er zY4_Z$_8R(t!#rx{$r2ZZ z)Cc?T0m2au;^5Q%ux_E~;4$=7YB6`Z_GD#UN#14QGT$$#@-~XhnV@pLt`9wz)>1Lv z*^#mxGoP!7LJy9_gb>HCqu_Khteam7lQ~((-RVAKvLaJp<$=46%_P8ZIRnfO&}NEmNot|d|-pTamxNXkXKp}ojVuvA zbEF~VB}m<;(qpKP)u~vRX=DT?wupTvF+VdCq&Q;JQ#8J9$)e5roU~2RWfHU?2D>#+ z^6(EMw9Kj9=>#-sVTY1^ow!asFx~Xkz7wgWRX~4o)0_N8o{f^2jexb{1J7*N{|F&M zMhh@yTi{yM*t7s+j67fUONh3wbhD_Q3k&rx%rY1A)wYi`t61JM z+K@CGp6~4nfH6pvUE{~9M`4&Zo`VBGnVkPD%;+$&K3VaSv`~V*Mw26SM_m0FK1Y@)3o`KNA zw;OgYaNSh@b(Oge0tQUr ziUa?1+EsSdi1iITfFpZ=(7lyS6`Jl%f^_~*(^*A8*Wb1V@RRBQz3*zF2nhhK3y zYkS~eUsL2|hUhrGqLAAR|2)uIxtA=HZRr#}#Db0(-g+xuxC;Ym&GVxcK&!|0UM`?&2qAG*y6wOiLlwkPv)xI)5@ig03ywj~Ur;L@-ME@h5ZmLJP;d z8i~C4sodb=`MY{USM|KKcQ{yC%Nvl)US@Y~Af!d(-eZSbo;3?f^G`BO3A? zsXE??@cI?B^Fh8X`SXw@1B0Y?D;ymyZ=47LZ@+o*Qy=q@`zj)HJ+(C-G`)b=4z|(Q z$9T*e`L;_k`WSlX;ohJfg=;bEIlXuZ%&Rw~OJqsWS!{DpK$5gbuzuD$E6kc_pk95m zcrl$gU_|cQfS-1~xsmtN39Ql5qnf`ta(=dK4WR!9f`ibb2YX$84Ik+&GX0Xoi*8yN zL4PIf1Lt8wPBw?a3C=@H3oop{@V7@(_#2FPDXa0aj<)X- zcT2ws-S>B|-)RLW&MVN1l_A?5-Wix_?0ry;&L~a=`{ zl`|ZiY13T4kKq4*Be?Pu8Q3+1smV8}yUKT-^I8QZDL$rwq_!_}+M|Xa%bnG0t2wo} z8Z2m?Rq;a(+5Dw!Sn8uLsRH{T7^zanO8n73hDDn|hqL;~^UQyR9?y~>sjju|rk>t1 z&8iYyI(V{sAK{;=Dwl{ZmnrK}b`n~~^(cvUODeUSnXWq}E9n7zp!i+y)h8S>&4*w+ zu%8owrz8K9`}|w2MVeCcn;rZxGEV==C$Mbiet`AwPXSF>2Gsew&*I2Q|9jBGWo}Av z!uJU290M{C0WJQ}`B^aQd$ z-YQ;y1?XEne}9DU5q%^EFARU(8!ZIh%0&ivz_?haEab*W-CIyS=P1N6NYi`kp%HvS z`XCeU=Vog2*u2#~^rjhV!7P1qkI?1zT}P)951%w;tfAa(OtVKL}-M znltZD?y$s}kdY$-hZ^?KR_#uC8~ZcZj`btz@T?nxO@oKIlBuCFb-ZfbyIfb_P?p5i1*Ok**FxkE}8d5Trz2l zIJwV~Zfe_tnyf+FN_~$3L^7gB=RSqRH{NYwEsa<+!a&Qc#sRp%Oa29Not&vWh5V>7 ziq3mx5_z+(Y;mr13)ny}zP@A7$JIwdDCc(aX_Y;`rg(JJe{vPkAg!CH4CgWub-zxb zy`lx_wFf{IA9?~KgRUDqMaKqYHxMc{J{e7CW82=hBC7)pD8&n%3IogO*!zhXfg{mPkOh*dgCv%`@q6RbKP8R! zBO^)P&}6@SuF?v6hr4JV64Y6M&WgOQf+d6Lzo_0XrAd0923XmiM}+$Vz6tikA)T4_ zZ12~an9U-wy(zq>=m@Ci>@>?Uy}+tZQd$$?8j%2!EJCg7W~9*vWf zNo34F4BgIZVM=IAVl?sBREPf<#M+6z3{M`iIKLJ4wxZG(cTWJ$KW^y_wRKzR{^ZCT z(^EQqp*FT0(CS5Zd<YR->|=#p(0gPlO6FcSJ2^E)=Q1u} z1R-3HZX|NF@q0Ri?2Un1oOeD8+ysd?pJ7ja#*Aj|RFadaPEabpaciy^b)A?qem(W_ zixEy4&{6k9ybez1UZjInIYf2Z2R-3syJowsMn_Tv+Q^UxK<-5-^N<7NKee~~F>ks7 zkGmZDIU_-3z8%C+C-Or4E0(LG*WbvMH3I_Mm??m~+V?L%!WupgG}T!UU`=xccBgO8 zcly^ra7B6iC`QD)>cda697)Qh>4>r^m|ua$&6)5cch+H(3b>?5B)eHPl)AG`b=iM% zM=q4Yl@o6<3VOtFr|yNzAT@jMa{DbzTLm2}z4wc^kFrIekfT!Ku}>JRC`R^8AFid3 zbxGg^(O{2qGyk~u^j$`1BSCEZf zQ4f|3I#pf>&8@-n?ekxYeaD{(*95QmPcE}d>6N&Yb^l6uy}7BF8jUFAw8h5>ucgGt zmUlpsL%RS>klfcX^Q}aW2kq?whkJ&A014(QE1l4_s*iq=<3#KkJas-+Jryk&xaca| z(}gEjWLzrR5{ex^+K2jE_n@Ix<;u%hpZGj_q6h~Y7JH_%0>Sxc)yjdnMnH&^it;S^ zcZc$CPCfiKP#7O^O3COAT4ElOt13w|4qsIJ@+W+-OmqIPzp)uvpLTHP17|~82Me7j z1YY@iaB(En08v^wf=&dAiSup$#FEJv{Ls4d{#!EdVi{>E^z)O#7J!T<5|pSuwxeY0 zq8A>><8MGFY^zkMMf>8Kua!n5b%N|&#n^5Gl?9(yIz1wc;7`KzzXUood#HANMLlsJ zzG)%Y@aRVN~T0i7DSMG&fNnW0Adp-Zm+&gSS$4zS^e(B+*}u6w(FnShL`x z=if6&m$*NhUJ>6K`SA^z|DT+fmU-BUJ27Ypaumq*3-*wg^p2cai-3xSb?oZ`pAuzT zluS8yaj=eyYfkXy$yfU>%c%PRMB>OVMC_(6#tNLoh|Ka8vDpEO?!#a9pAE=MRK~Fq zKPC-TmX41pD?u>^8LqkdIkGLT5a$jKK3;6u8~=eG)ovnj-w50;U65cBS4x>*HbK3` zP=1G1VLW*w4{!5!0*(noD+>1&oATM99XdT{UP%I9X$RzUrhe~y<$~*(B1_y$Psj(L zkgHAq*H<6u=Rymz54k)&d?1~|JIAo}-oReyO4VV>V6UJ-0|)|M=cLu>P8yK0{F@+nOaE>2wymMz6S0|y&9w`*$cZwZ zf7>&U=I!c_WPE!|Ihv%j6q-~h+>R0E45kPCyQw)4gRH#h+oJZ@UpWt95 zhBhFr?6L-r0=akTgBHLr zm~vdUI1&IjV}L$bS1a+=!Xkx`$OZk|5`JV@*&^ENLcg@%y{yNtNXA@a%~;)0_5Mdp zq5jcjuNPm;xZf@O1c9MQc^?G7-{Yi-HS4FUx+YiZ+LO&;x4^*A)iZ zz3?1nJw1dZRA^zip98gP^Q(6IVd;M9B#FfvP2g8vSu^LB6`oY?E5RWJD0rXEp6~h> zFUAS~wj2qPj0i;m?sLU_P-pCN$@^*7VsSfB;JgKUIO`^jG4 zJBe%%#o%cl2cnANtj@fRH*QnzppsJT09g=i)z9mRP71oI$hSBE4J&sWk@(p0UvxfT z)ow1dw-@sNp3ko(*$5pcA)i$KuF=hHt4<+;n`n4R|7NuB2}bin#;d#0NPYSvy4bPs zpIXd2=xsUa_qxA6x&sHE`Jn#P)q=wlbV-2SqTWksL|a1%Wc`|l^jWx(cec<@$oQ%l zp@-sX!24}RVf`fk4^UTn8Z>{Z|BwKppgXJg;NTZ@Nw8~gR@#AM+^wx`PU!t#F`p_9g&gX!Tc`>HvN?7u zP}aPw0&Ld!K&Uxp;Sok4in-&SSg(t!_{QDzm_$?KR&Oq(&=@2^t}3Q(Ld~D4)qShA zWKh%^zy-Ap7L4L_j3s*E!Gd-&5)EW0g;*A%)J=}a>Yyjq>cA&*6;{5v*;7b8H1z^s z+x+f&yHOhvbIk86M&P2P?-X=drW7)dmQ02nqO81n~Bw@o_uJriGQ)v@N1WnF-m@!kNs z{iy&RZ7O-5uooi&GFReQTVNC&PL}`0QveoD90vqqk|k=QK=hMBF$p;WmayvVGWnkl zJK-VKS(`iLG!vj#yYXlIrR;g%3G#da=)9-0f4u-VIYfR^m_$MjXELg5jYaqi z(1J@H8Bxh#40SI!_}-OSy!7BI+yQ{ALK6q$+eq*}SJ%9v_EuMRLhNrB97P_m+9Z_JIH*#m;g1}ap#S?sR+R4GOGCc|6|Ci!x z*E@tqh0QWw0fELi3{=l>a9p^N^oRx;*-)4|pHT%3=C3M4zP550=AFoqzaRTlqc$5D zmEhjmnfD?}CW=rV4$&!I8g&tcm^Z_~*tbm#K!dG3@`G){_XKiAwykGWXDV=u> z#6<^lTe>h~TwMqm`P)TjwPdp_&8!*-mti?@!S5b-@8rj;|Cs)|^wP3dg0NTFS<&~m zWyze*s&Yo=t{~W3_aYpCd>SmtB5XYiCFSd55KKCHreC2-vL8a(mXKjP@UbUO61iZv z-1;dmMTJARX;M%Q))8KdnHZ}h5FH;rUFo?@TKbVa+s9>jW?6C=Pci^tFqx2->E?@) z&XK{!>3#(Y%nxi-Hs?S@HnOSfyFBsB$YJTIsP9CzM)oV|t!Fwn3Z9X~Pm9Y@FQpcA5PwQa!%p$0>#m7#9Lj8! z+0@pH3bjxjtc!V-Xjrc$of?E{sEw0J(v(uDJUfIc0IF_uiXvhlF7~3C!f8;xXR7gU zAKWHsB)W|_K7^UzLISa#o2s4R06=~LXR z#x2L8+CY&eF#594w0E1zpqmj)`qkB;-si7=(h(CU%FICLosXiWS)u{tqu7p-;TQ(IR;ik$syFWM_=TJb(ePscxw+b_4bbO z9Gcd+z6tzGDXVm4p?C={L3cl_h2!CM9Z*Cw>5gW$JnvZH0q!WrSiCH zdm71l=_0)v{CtsKLy1_!Z*h+q0EJ$$*YR(A z1SB}ws5?FsPM%&kI-`m$c{elQG+AT}ra>Ph33MmGvCj#GlM9dv_1LmPMMp3{GgZQW za_OKu;1CYB8rf#V9&lgS2eZNIIfiKRb<8k>{(l=bV;*|5KA?vO>JQ1XL=4dlP5uGU z7B!_1qW4akoA&XP6tcYjLq%wpKlxSQz&~()6i@xTa2LY|uuEU*P^XKKElc=?q8p%B z6d2BR3hZ^_nVgeI9kied-@K`*GJhOW~M3vSu zE9_gObXwuy_h{zM!p_MGXbALRIt3C9vd@RRN(hJiGQRiD3q}0%-$~!vyf7$N@7!&n@aceFj685ZI9! z=&u-Gt0#t=M9~FbeC+{3N5Fn+(FN+FzPFlQh&g2F>w?z_w6u!D6WQDX`s6$CBJ|&4 z*4Lew%cS^$O$^mOJNFph=0!VDJit0_ytd#RqcdAx)Nkw!@m_)_oQv7Rir;J_k!XW7 z4F=E9zS(;txDd#uH7EhtbqOsd`o-jR=IB9|zAny6J@F(?es8>0c^?LT(Nd%>B}`8y zAvOLir^75@U@9m@Fqt${$Q<}6g6$}ZCFQV#Cj4^e44HLNAy>XgUeq_F$C&1vHRTi+ zmUGcP@$@T&gNkWR1^QAA%mfzjKrdPVo|>%FDw5a$K8k;iKfG70rtN!)vB!q0QFswBD4rEI!CeLK0;c7bp(pFJ!3+W9|*IdqqPR& z?ZDB>PH5GK^fXKHqK_0?tb++q?Iff;Efjuko46&53*L zlSDwkK6=`q1mFhm5L_9gKn624+0vk-M@6Cx-ApD5^LJ;1laat*R@4Gy=Ai2T{s1$* z?g{^kYka44n2J2mwk#{)8Um;>2+&TyKZgpviv}h*@H11`QgObkf&ogybNL?M?Shn`og ziTXnId#{eL`i(DNQbI`ZH|O;d%?56&5@8#Hnl3J^`XY$Ik188bjp{Kbiekiy5IzW9 z$yD0B^+au+V+(1q!Oy}J{adk;WK|GdNS)M;&Groj&s zoFW)+mO*L9XR2W44U#f1Rk#UcKse6EvY=t%f4|NDyoUVji-x0tuGJR|kiUog{7>#M zbO}$~^u3V%2$CG3Mr?1%#`QX)L|PTlHxh@s_FEzP3%xN{s0R)x{bVB~T-Zsn0P4lE zze}2Au~Oc~3T}&x86j!l`ku$F1vuGLG%&IZa14kY7^W548`=m#DABGE)K} z1`G$h1+XxDbSmf@wibvGS6>F|8Y~Pdc;VEH5o2;27d(-1LGN?cJn1?tykBNzcm|QY z%27i_`AUI{t2$q5RzltT^zK_%iZy-~&^>K-v96VTjv;9nhE5 z#`SbCu@-U2{{fgE&!BH;mQ$HkrrW|fP@Q#vy_`LaqIi{gdoE4;FHVB`7#uC$!&vbJ^6&sX@H~`+Z3pg_YY3D1N)0m)q=4;hzp6mah9~PRJ9*?{#j5qkV$J&@=ff9{5WPLt%0%631n`6_5oX z-|K8pvMvTklfOC*=>(DBb3p9}1puEC@pgPBU7+f^vI`hJhk;aoLG`kyi-G_lO9|ao z>VO|Gw33YS0VEozk@6()A3iWK)I6JB4w?giDVFL2&t?R(ZopF=MhW_x%7K{4Tqa;} zRv2aj@p%LTgWIPwtc~c!avL#(O;*40Rj^P2cDa3q*(JA;FAkyS zAm4EKc|MplhE{vhM-h^!6t!T%=ZPqaWkKlaOU$5nCwM)8G^?o+)sh5dLkj2zO>0m- z8HvObT@}F^e8c_yaU+%fZZl3`DjKkO`WC#UJ8ytJM+DB7R5#0bJLc*?_basM6HgnF zFAVUba$t)rtqJ}FSH^OFqla)TI}dx&gBprd6*N8j{|A+2z_II{fF@c5{py!b1O0#~ zrvC4Z^g%_kWG`GfE&`>5VtCn5Y2YYAaEC5);7oL5Zht<1?IrgA<^>3#9%;2lEtZ!& z^NmKqt9i>xe_`hL6@KqC%xHf@e@8?M?hKFz4ai{eO5#qel1B>T2`3cQgt?6WJ(AYJ zAR}?S=8ADJaf1nuce{b6@x990jlo6#eImUi^n@b?JkdE>Yziw8(x0|HK_Z>gl2Gv4 z+|LD~7d5~R-)C)j)%Px(L`GsOA?4R7;B7x~7%efhjCbOzSwn-dV8K(}mCNFcpv=RE{FASN)i$)92fcdOVr`YkhBaec^=p6tk)gc+k~W~=@p6| z!Q4@3!Ph-+ZTR2KkI4&qykoW=r#lxrP`H{4v>7YC2bv~4%p+70XI|6 zO#UxTi-+F*C055~;M@O#@x}YrW-ZF|0Ug2_4p2ZV;0eh0t{9MuzXadqTTdTS>|upN zwHROAdBD*X(p)T9d0<8YNy+_0ke3+r_iw-?8Kmu^RA>oUI3$jM29A(8@5LhLNhg<- z&+=8E+D{=b8&}6hVhE#WM`q&<8WK?coMLTnz;||;)RGOsP5SUQxbkNcz9x z7q6@|TmuE-Yqf|UP(Q=Biu#R!1TYnK-^lcziYMUp(eoa5+0>$S>@^c~TB9au3Squs z6k+}di+Vs-%))GH!6qw=30(OH(~V=={Jub7IS?*PWAg`Hgk&epZ>CZrR-!2 z%RTJqqRb%kQ|Jef_2}8ah{mD<{%GRP)}n~D6e&gA=X-X?meKuW)#9*JqiEM}CkU=* znitJ_SKZ3A`+WCJB_aGGKZP(Rj(ym^)m6JS@yvN)1t_A|`)>jad z;O93VO&`69);MxJMa zcjsn7p{P3>;o&=ev(oqEsWdt7vBfmJ_YFi89q`--f0FOLarexUoNSM z-K;>`MV~$@yscm1BDx+LIHSI1RS6pDJUgzN9rt5H_;1oJT7V^$;l>7zT-!hsK& zrzeR9j|01nk3xC_QO*t7{%m8T-MFc=@Y%zmB@`R06xClUhRKLT{0wtMGI1wQopHbT ziMq~WQ^82?C;flJfvww6^x%IiJHj}`MuJ5HLv$ghFIuxg^Wib!C8)A!+jFiQOx*kg zgc#EsXJ^2rYR_?qCAmNrjwFBZuX0lsIvtld$$U29O4>-}EMn^eYJ| z$yuR)Tt0M98KP-AU95A;I$~Gg9rww}6Xk!!PH@G>F=$vS}~9M z1B@kGiUzqmi%IRS@g7U=tB%igJ#+YZ!vv7l>t!yFJHm|>ykC@L zF`fEfI_PJeNVBB$UC?}>-+8wh31ROr1;;2n;J|&qwn?Jk%GttSCp_R`%Mzzkx&LIg z6kk%e&5B)%d9ntoSeXzXRyZNgFX|by#Rl5yx?U=HnSHeTQ1c#V$@!z_6xVnx>5PHT zJ$o^(B{~R@zpq8s#y{}`bBd`u>`OO4d__<~G|$78l|Co@7r8qk&O)s0f2MAQF1%(u ztUY7+JtAaj%kC8gAEN#F9^V}>Tqb$tAWJ*Wek0Of*yhULI=@!_&p&qU&9xXyjVVVB)tRn~ zE!oczX6oh@r6g4qAayNl7M$Dd-=R8fH{b&?veK90E>`03%xlMCa|pFwLb&bnQ*=e* z^{;NA$BvT2h=eVERAWkb7%7yuZQBrTL$A|pDFjAF=**^e*{HZ@vZ^pJd}M})bVP#+ zX?w!se>s9wRNTqL{pu?pzr|2_#X8yslHKG1Gle=I;FTzx--zV*zZwcUXIKCbPB40w z(H8roPd&5uEOZ<*HBe}CfjzDg3$f(Q*4!;W)){*Qs*DfwdsV&ww6;?>>Tv<~i?8p( zS7V{#v**svcdMcL+7iW4bE^#(x6Vx$cU8O$ipurxBL)^EMqOsHk3~y8T$rhTPmz;A zq}+(#o0B`cd(Ny0m#5gL1|&=@cQ(!uv+@#K1)CK+*H_bEa2MgC{M>ZD4L?*V#Dd&wo$uF|em9+h6@8|twdF)Fele94 z9o2KVx8-MrPfIVILw(vyqyCJ>31C} z)Q(iX0p28FeYmjjmXqlbDSp4k7on0ejgj9Ik!{5p>NEx!;LD2f#gaFVb*cl3j#272 zD6f0o_TsKh(3TG%Aw1!kse>y0}8Y0O-jy95b=jUyCdpLTJ%)ucx z?jF{S^U{OMguM<9v#uxAZPNQ3rZq8R)$q|K)o0Jv9pA4-smo*B-QPv}w3{2o-?#B` zCN#*{9tPsfpF0KJ(FrRP%(N4{d0O0~2{a)%5rX68lh*rRG?hx83Z9WaTZ2vg!K1Rdk#a0RXco*o?$_I}xv39m2nI*Yg>Tphkk@$xChawq*N;K)|2 zfe+JZ?`8mHqIWM4M1zoD@rMWgQ=`Iug0X(PWTM&jjS&5$s-)cck_==tF*nz2bopNKg5>Zy z?$G{*vo1lvFYWpw^-pc8^7dn`jAV{{4U)3!<4Thy-p?fY{eqk)(%M}WdC+r!@p?`PZ#i^|nN5A`qnQs8VMh98VBvOi0~p2@P^@D>xO z_$uM`-!;fKJu}`70w}%sl6v&xc(!EQ})?{7?q)WjjwEdy~_NbhAzTw7C4`=$;AYy zK(HJw-_dLb{5kKG9_Uuz|y##^r5Oga)pP2O* z2U_c_U$7Go)tLzA}_30GOYb`jdx%Y_oKeFNya ze;1clvn@2-e)`c9X_kA~4*Bn1w`xuJ?e0(BK&nzM?YO%r^J*08D!uXDf`;ilWjaHF zxUAa@Cgu$u|K>wv}&C3ZW0>Ei(?QeYQSA7d1v|aMbNiRsGXd%d-n>y?Q%+Nbpj^Gj_`X5{1D@G`N@Rd60C0aPdxbo}v?>9O@ylT-gc{+l(5p%eCL2ewd;9o0vZmCsoi;DwNvmPZwJTB){z?iz}}@+9DX5Hsh1n zF3!Eu&9I<&wj8}Ugw#q$)pi!cM7>1U2iLq+kO_m2$q~jDVhJhA~2;2m;LXGmkIj#TK;E;t;rvW8JWgYM7fbQA;ECO+)aiVo%0IbUNK_%v#uXRos+ux ziH4*FJS`-XtMWA-qyix3Ja4?ytrr8DyB*??7Y4t%vjvXWL)iR7j;dVFsxlvC)vHu+rEg=wA_Z{qJH$+7NGAlIGG#r z)Ub65ccVqV79sxaE^*64{*6e<+Hh!hm&<7x^JA+{r)%85;Z~*iAYs?G$Cne=d&z$# zpjX_Q&axyxUX?k;hc&0t34VPK&#!wGYnsVhx-KLiuDDYCaVNI4 z()Z&JidEP_)Drn=;LVR-yw@#nB5LZV#f8yJ?tNyQG1WN7UM)fMiY#|a0zT&^FGBj^ z1TS#@H#8^t!R3TJ-}CaaAN{c!h_k_)tEye`m%B?5U+wPYSI<3aU>k_b$RW&8HbQ$ zx|N$rbI*%5-3JLuY5VVy=kK99ovtWsE|C1e8O4AYs#sP!)qOyqYq!e{$}o1QB&|rm699l*Ov;G zdq2|dHm`Ang#{M&1X-(;%dyZn=7)KL0ml(G$om z>U49SprhW~Oki-slH|5K@;z$6IW690$$pgovyObrChb*dLwbuXhr4=x5;~vJR$R?! z*|62t$iw;?&7A({JNb*Ub7{;v8*@*y(w!OW!UXPbqxw(H5{5~VT?%_s%q#x-VG{x@ zw>M`uG*TQI+cMjKIzMxnd~;VZiVu%}rroFgIvM8N9wx&{E1p}}EN^t&;5pWb=~Yx& zvF5_y1C|{q<`VM;Vcz(?BC+kpD~)8-!{Qw4@Z&G3yJ`J3^TWkI!tS>$@OVapHH>xm z;?MD@c}uXR%7^x{SP381B7SE(VcKds7rbwrTGtb6a(OH&BoE;A^!J>o$F1i#Z9mL@ zq2QJM&Up$s$EX&e;^6c#vure{Lx1&D|BpTO^mk zo#M>~|C()rD2Uj?!iZbocX;h_@q5L6CRd7HA9t`C>ns&?FX1{^yKprpR^B8F>C=o= z-g&0^%iyxi-braBRpWij*T(49cT`WKjm?tA82w+l>jtk@#m(BXODdoj`JIs@UZ%&@ zsn)eyLYxQwm>EcXqluJx2lxEbi?NAH}C7`HK?fE--TbwV0`|b zvKNjjfF1aaoLaB_7Y=J(Lr;zyQ?`8UjJ5%)(bL#A*A(4ssy;UmwJ#y<)1GX!fT+`b zitVtcK`-oGBSzcrvCDeW#+Q)g*#~`rN&RdMwBDJOB$nRF-?efKd$krx^)jJBYK+O4 zjYo+5vN&hiY;l~oL+G}FdEf0Xb56WnF=ijTPND}j8<4<#B>fV%#A`U{BgnU#F5b0U znr_>7X4TI95Uo5He{pD^<+jD&9v5_a&08M6vu$l>?^&N->AG_kd^D$1;S>-R#vk{q z;{RHbPsQcgWRwPA5a9 z-;*$P{H9}+SIckt|HsjJ_*4D=@82j}Mr4E|d!$kn$2j)hdlTNqkz^dnI7c?&*dcqJ zVMVsA$S&*H%3eqIKF0U=`uzR?ZqD%<&&PG$uj_H`$6rYAO__DKR`HrWQT+%9opr~o zzJ2k`L5?c-u5EqG3fsLch^|`RK=Z>Pi3-FEEG^ZpV$)xN=S=df_IVG%?58oCd~5Kz zXRY8JgIVwVU-fPNItMw!#Mg;1Ka$WiGG3a5$dN5Sqm+e|B>ks2xA>qBj{m-D<`>`w zgFMvK9MkBkBGN4F#&?_64RlrjF)l{2zJOI=1yGPRnrJ9F;8{}_OUXbM5U`b8*_lmH z<1>~0OxELa9AJl|&Cw-pEf`zCI(J$LLkuyvm3AElIy#J??#Y8V6$48<<72U+ z>{JhgsYflY_EnCbig zk@M%g9wKo8pTFVOZmm8Fe^k7E1hV6X9-z~CwEGw?SPbVbG=F%L-zXQtObx?-3i=XO zm0h8LWGOC+_znvaGh2gu{CWp?$|lIud&MtTs^ht|qHj`58%w_T2Y>6>n!|a*Zokz) zzTmsvwS~iUH~Cy?4u!81>vE4e3B_?z-(B%OIIIBxAE?Sp7w?RyT=L1@s!-#N zxP-mxnRqzLn)eTh(>l6uAN_9DUA@9koZwc;pPkQ}Aao=7jHyGlR%Ba5O;x{o6XUJ$ z-?cH`RxFb2;j;CqQ&F;Yk1|=V`H}RbeNjar$X~5nz|-U9OkYXpZMM8q7{o%_W7XU% z9`PV6h5)t7(tbXli4;Yi!>Fuv5_Sxc{qA{1ht773RCstGn_*zXIYS``m~dNFC=H(u zIV2y)MS1l@`C6^iM}+x+NndTFZ5%CYYkt#4i*BFb*jS3aovL7r8vW3ad3yNYO+A(8 z*PRRJ)Uz?mDq(?O(F}yGiaWn=e*DN9Vt;~IB!)t^)u;RtAUf{Zc38Z~fV3y-XvJR} zBiag&ex)KmfuCvJ5zu}-G?SXE9;DMP$S(KabOJ$8-%SA#|lN|EWlH;|ivKq^>c+vr|Nc`>w}s>W^&-I3xJrfxb${ zaT5nl3xJ>z=QfR_b$;u;N+RbleMhjCf#CiNsvI}_gMT`Y&n-xJD%?UY&12*f`3!vS z9aK9m`S5$tJA0f*FSh^0e%`QMP_P9#Zyzuiav$uWpy4fwhHljE^ zgrQz_b<%9S@TZr3%I(}|+8Vhrgr`Pgobe9Z&8Y}jfSkknjGg54WqPSt(#MThy%PQw zdLJG`0$#S-@`4OD>5zdpNbAY(iXM_E*|LShji!EP&;Pq07QN}WZK-+SPMe)H9Fn;naiPoM~7 zf3Aa@A#%lQS{eFD!+LH_y&W+(_06Aaxg*5EGn&o(=Cpcmb^k^}DczIb^Oec%;f>zc zR|Y};z!Y1lvlt;hz38hI!~}lSIHsHUuh!%92yl315x-d`aK1j55k963c!TeralH|< zAl9wo%<%HHH}b9&3otyABJ8ZXsh)Cl*g`%0l&79UY%NO2eJ-oELQLR%?E?U*0SJOHqS@#>K3yu!|bc=#Gr2C!m@0r^Z)_Scr?_3y9rgAgVKJo>%yJFDB5 zYA3IA1E4N)nfZ&Bbx+8G8LptRNjgCv32xn1)d7}r%1@79ZNbo!+W9}PfNkYqfkgB+bhHn8* zk%y%)+RIY>cB+m&G%rzqw?h6f$=~7<9$3^_cFsfbE&p;9Ve8qA+!)y@wC6Ni49g|I zvg(;yP_MpwW%F%*69-VncgJsVktBq!xegDVi1wdD zJUO5}2k9#T78Bdjr%RMFVbxHetjtRZum~GO8JT7OtN@qyiPf0c#@#bedt@8mha-{v zX>i}NgZ**j{d3%QF`aSVIr&#lw;(`9hmCAVRz51*jqC3S@v^e=UF?ei{BlWa2J-Pl zFWC_{z3&$TC3`g*5FXewbsD=d(6qHtpdXjp#L2*ZfgCf+Q!{Set zy75AwqMdQvxWDKP#V7|aouX`D@^$BJb|-EU=?P+zc>dl&vPMio_d=~e_aJw$p>(Z4Wqry%RA+QG=#d?rn*Zb;dZS!-N-K z*z5s@#e)sUbhuj-fKLhPj_P+_~HVl8tQ;yVDY&KEw&2>uFL)enR`+oq-?A;D|UEeNO!2|Rl ziPFn$a^U;beSJW?WwL!((fL1lw!V7L^mec8r>#TM-?mps! zNY~jv@#g{#Bc!Zs5ThTV9x<=r|plsq-(I!inTy!Lowr>eSTVc&fbC{O$|DS zds)~=WkjFTncSQ|DNy#r`T2c4rO-a=)@xp6#Yroik)Dm=BZ}oy;C%*bC53Nq#o0O0 z^WqBst?wqNrt7^(E`~AH0W7#w-zht%tl#2bm0zQzTy4S8+UA5|T!A#~ckFK-JAAx^ zyo<{}rjG>od*rpF1H^kZ_s0djNFiBMC+I?6F&)S$#Fi@OnfxVAT9fFqb^FOeU0wJe zaYLge$CTj+2)(S9vdJ0GbE5W17EPXQEoK>3GCz2zRp>2)xfEj8 z)13^6016@6ov#zyLY4zQ*QHkgdxrWh+`#A_eujz?R3tKzFCU91eMbI0{0#gLP8Ls*OW1B6R5wEU)eW z!&`#N#r0zeesp&dDj`Hxer|k__*zhvJ^AK$eYWx*F}rqlHb=y_r$g;E{cn4K-^eV% z(UEE&GS7DHQTiaQb15E8b7x~+*%08__4zSN=lUm)Z`w{q;yEQEplXf&Dh-de76G14i# z=uUwc)Uo7yabvb6eTanali2HTt#l_*X*|xxIZnn#Uy0+lKmH_k(An{~H-csVbs}#G zFZH&dJAT=yD$}^UdbQQ~Xy(2_i?ZNbK95EAS9`XhH%(vq)#MYiOk&R zGb)g_OhirK`YC>z`C(f>dPlv!g4&7^h&l(hk8$yx*OZ9*#!*3nm%lZ8e38Doua-5ylsf*_K(%og7|7X@CF$w<>~DdAp$ zwHmPrC?i3!y>dMMQZFJ5MLi4Fu3wXXr+*bV&!X87OgeZEuDfXW@(9@6)TLMS>pRQc zb}(~a4Len-2=3!}NXb#arw1Ch_*HA?*^@Iguy5rxnkXn1c%vj{U|+4PcwK}0J1;+0 z6#rc*^_KjJP%J7{MSrr!T-(8tzB%2d=qAk`pB{4{W(!VVWn#&=tGftz zkrE#+V;swM6pD&LDLdv@JGM~P9bMFU#>z`bQ2rcZo6l{KKGM?jqQWfFdH*4OM?(oe z^K(QFX8&^2SjfNd{#(v2QO2}*b%Fw|QpOG}{p(rJ^>Gz^D8tnG5L-uAE)>=eB{oQ!>%uBkKk zeh|TO7r{TZg?)b`^~2POtCwT@NP0Cx-glClAU@S??M@|a!>uH*oqqu(d>-W1s@{1e zXdqlX{ELNQ&xuqC1mBAoiR-yhS~cVRxzvQbTaD#CGevdYoKTg!_h`747kQsbfh#9} zWbUP}F1E(b5A(ggZ9q+US#@@=xN#y!rj4EFcNpY3@b>fTl_wdqEJJ3`<=v4NTXVL5 z4CiNrnSy%csVAg>XhI<0QQ5A)%NB>SS%2`_p~$Pdm7G`U{xBdLS@6No z@V(Uj!k|Q?N&b(x3jLF@FU%=>W1kc!WSvsfAzPcE<)XpT+El2ugTYZBJ!l(^t5I*j^yO}U1SuA#+8LRy zFdB96=tIe{c zUGeL#&(hF~nMc$*vXYL}_pdG02 ze-yWUHoOWtxAwz3Z)9woMjkd_#&1Vuq}=I?v;_37$K#XCw@m#AG1KyIny)KP-_fXR zspB>cU5cywE`QoeYHPxHYesg^wMN6m*M-s{M8N9aRIEIh-eefW9yU!i^JTE$w#6rz ziAz{B9>8TQjV$@mc50zbkgctcRJ9qH{mD=9hlWRj#;E~uh~qd`pvDTrxVz0zn-;9! zUsYdU+bkzc@3hgyF zhJx~lCh3_iRkrpgVGb`^3Lq~MbfJ;3;rb=G?MbDvXI0X=dl*n`0OPQ(5<)P2x`Y~t zSnA$$FA-$^b-O14E)#hhvYxHqzZIx%6W-c<-P;gs+_yvh;QBPkq{Y}MBfaydX#VLJ zYxWeOX;Fx;XvkmC;kUuIY7*tnVl z8nI@qeW6s$2`4KaC7~8@@t3Z;|aJ6@5aw|@fVWC{`Cj?p_;khPvT=z0%!32 zUM?B4_1Sp6?T-v5siujXAbN>1uLF<4{I3|EL#E3 zu3l~Lyk}*TKV+S_8Y|Pccrq4~w68m1H+J0nF?z$daFRuO@nD=AWU~!Bm)-oDC>x?z z540Bu!27yEpF`*q)4f!oq7S*8V?aYnSWye-@CWVCEj;-lNdrRH0~QVfQYpX-tG2pi?j1{xxA=|3OQRWC^crx~SJ-O#Pq*{jkZ*yp@RnEl zIe`}@_jzgA#fxu74ZiG_qMSJpSzHN3pi|pWz5f&geB*1GK5hCkm_d z|D``&+L9tg31sNQ!QMkL%JD;?Hj+b@b#&HbfMRcm7||^w`rz!YZ)C` z>huc4Ghj%KJi8>nfc+soO~>Xv3AL1D{yu*o@?&#{SEr6XV&z#+h+adtJ{yqwA37Ps z%aCX&9?Wd5Kbb2bVu`qI0lAmh4KliwM%>;NJSMk(5c}nz2cn3&cx?7l%JI_)uew+( zG|W+o3DOX;LzUMvY1#+P{Vn?nl(Lm8Kfm@p8wik3_UV2@{|H|uowqRcj48g;!wXT8 zv|EVS3d5)-x?L6DuS^=93Xep&0GU2~Kl1J5H^eS0b-NmY@;r3(lT@W0i*+^wVu(b-u?G0|2S*v+kg8Du4+>ntnY1hxZOvJh%dJyek;9JXy1fg%V!T; z%`eaZ5M}ZAVqPNjb^Spc&vP5s<1v^PDTQo-($vm28|2^4BSjH{n)sy~zBlvQ>3q6J zt*s5gi{=w)%SDUKZ;;Eg1F~`DN}QdPc=c{k95H8o22+j?xa|z3l~m{@c&GxzAUxjC zh%Z<9nRhG6G~b*eyL;6>B$yqQ^$6|-x}2)qNFLT0=C9dLtHd)P-`sdtWaL!C#1a5L zkA^~f7ytM@5ZW!+4YZ_OdFB_;xj!F!6XY>jgm^obYa~<7Ksx()sLqkRfqb(PG;7rM zJ;J@mut{#7*RuXeNIkg9#KFriW!@&J0J!=rI9p<5(r@ZE`kns$%5_W06GpJ3Z~T-T zGj?Ty_-4hP37z98w|MMT+5J6W!f)~S+F!;A%dm#tNc4{2KaYvDrsO<@sX=tz|BF9! z_L{->r1UAtk)PmPYsNu(kg6O(suoQOMdDi>(2%8=6zKsmVS7qjLcu@Q+K|6NshErl zl012u#2ROQ;Pb5fiq<{QpB#ujC1$P{MIxv{Lk5CT4Eaj%VgvcBN8;n;LRe%A0dDo_ z@xTJwCQAW6Pw59Q%vWAR%f1Y`o6Z7T0UoJ#hohh{-0U{)sl<@ zJo{lk@x^g>txD;o{q?;N;8PJ3(RS!LL)P0jo)5`kNRn+cJ>i z0@-z9`%=Pn=8bo0S%-EG>i{SZc*=^rcUy$y!AvS8B1}(>5CYSQJMjSyaL>~GU8z1d zx__|B>RPSmH6P1M-NQ`QQ)->I=MA~2YTt2+pMn{m)U$ONR?Mw)vv~t|sHv8-@Gnh+ zKY2!wNieYMEa=*G&rfDQo%RA?mc0IUCU!EM;^tx)8}&VsXl_=B2+;fUT*~2g_Q&9v zX(sq)45a#|WlCgw{@1EAa6B3{Z>lJ&$DTn8;90*LsqW}4bl}6$E47gwYDi(-m4(N06OPztY2Q>X_}*BXSTLX7zvGsCD;#tk^Sgxan%qTyUP1M@ z>F&&J;BRo_mjXkn(T{CqQd0r>*yzId6 zq$09oLviZF8IH$7bV)yMoC8$W!Hps$BibYEOPKHfT zk*lisR4{Rmg$1dRZ&%RPeA$qILPfqlOH0Vl4^hlWSqgghzv2-w!*^8Vf6#3U39tE? zU(&&*2%lgU9PwEMS0y}ev(S&eqFJ~1k?|*W-Mlr|_4lm6#@G4NR_loyJ;&U1Wi@e$ zMaG-Sp#haUF+X_9Hc!M9WbY!Dm)~J)qfE*#2zQ;Kx5@}q7Bz7lYKW?uj^?>L^r`>yc!`O%Y{>{R9rg0FCyUn zB@iBa6XFd#u6+7NH?1D#$(&8Sm!IlYYtS_MTkx@xPPP&d6A>W}z$9O(dH~N>UZ@u@ z-*_*dkUwH&$w45loF$+1t&9@t=TN+nNKG#-OCwK+_N{!}6PT~drty#?3_w8}`gCbf z7r5Y#vJC639AG=!f2mStQNP;!x(5{ciNpBqO#_L)*IfN}(P>|atO)yr!fCzDlKmXEOG$f#SC z0f&%yz}g3M>%RE5Kai@n9Bup4HFb20T2URysq#N1Mn=zhq+1An}>68}hee579voAG@ z03yQ0xnlWr@(osXX~9@lf@JpG+^f5IgdITpo?$yOj(!F683ElO&_n z?n2*jqw2G3syAv;lgivcgXu-b8Vp-hRQo!aV*MB#H8EWvFDil@VK3Sb`#O2DQV)4R zK4ExQ*Vz-m)`Y9xs52@;@(Q(mL}!X_!?io&+}w?B50W?@1m6ZOqzl-M`+_pUzI<_& z>kxYzwJ~$aNda3bnllvUjS2q)sF!Mf2>|lwp_1;?7*HyA11m(OcieZrfl*QsnWT&* zU#Ra_X!q^T8){3RPJjF|0cO&2b30tfeS=)KSxU_xF_88@y^*Ztb0M7oDWhM^8f7|0 zUusSfvvPzYJe||hDcX53yc;rj6`DR0jfvBLeyee9cA$! zhndjA%{{#mP1nT2XQPJzLP4&x9mxHh|8wf+0@JB*!@ki37VLaQVZ1WyWgg+7SZzQD zBgf|AqW0rQtnWm%CSSf&YY;OIuP$z!l>X5xxoW7-&|U22{x_ylBW~$1-&TX=FDZvf z{*dxiqS?PkhRjO{_J}pf8l-I0gIVmD$(0R*1wm&aIW|56w=SUO_7c_X1F}Vr8bmLUvGXsojh3x z65%gSi76e+Ctf25FEV%2&d#b&C>7P=x3`@N>yKrD-yi&*v>+Fg1$ffqIAUSFC2kI6gPXtE+1WTU1)~UC#?&4@?)1^<@S3 z-8`97DQPx2BF*AmA5wGo8qoLfHN=aNkL1LHkq4;4RXPk?3LuhuPD-;864 zj+!xcO$XkK`fK%}MKfYkU6rZnmG@FomrxxuEosQ_YQ(&9UPA`+F!S2#yhZ8u%^mEb z4Sp+<=q{*at}gxqV@HOcl~}WWkFZ5L98NISzEXn3Y@UEq$<~y*zT5w)xBE|s>;6N} z770KUA|zu>=IyeTGrW zRvwnQZzawz>grNlnTig5tzNA#iTg5%q2W3?)APFk& zPm0R4@;duNuLvGmqs4hfTGq$lHZ05C*H!o^iQ)P!c<9oW?NG>%EDI}j$QAvzqp0(} z;E4Q1>)SQPWzAEJf>Uzh^&feqkmA&SEtk0!`2+bCY7@-I*(*Y+?O+=4nAtLy1+D!J|7r5YJx}{|ZK#P&4WMI$FiP ztl-vcaMl~U%X%Z(cqL~rL-Zm)iCshlg*h>e0p-Pv0>d|%)xP){Ep{-Cab7-^Mrlo^{g9?fg-|pYWy~mw4Kah3b zJ%#KFNG$5QRC)L0Jp1>YOu`Q7DHA_!T42A29-aG2rCkD@O?wc^O~@ns)?&xJ=Jw< zaCNC~>t2BlHafKv@mvN^3Uw%a@rwa2aaNDOfRSPx-$bPgD3MO{#;Ed)SF5_DuA6<9 z6BD-34rbX*`OOLANEv=h&-AxzV%#6K7Ja8U(a7W# zC1=cg0x@!@e8JR6C#21kl|(DUzJMDqX4=|iBkcb07*KPK-@X@rlS)Ezas4}NYOiT? zkm;@c))^o}$5<-4tK`L1=7d?YY|Y>--7RH0UffQ>%B&;(eg|~@L`)!TKXCR6UFrX% zBy9E4FMr^1YWmpmqVg%HCZLfs2ySKJP}L}}F0+CB6Uif!9+~>Ckug69v=+ySxv=kq&&3&&1C~&%0R@=h( zF85>^mX3+yr$TL)QkVXXq`Yssy2YYH)%fTaJd?5Z?53Wi>cn^J8De~Dy2aAfm+4)W z^+eND_9wykJdtl|s2SoiBIdXJ)Y#TDK6QYW-)N)TROqOZY}ocvpyIcVB4EaUc~%88 z)@BfDdNW7qXVr8GlJaWCKsLY0_4OKsU%pWoiAur(0(K&=l{N4athI=lP_{xh0RNsU z#xn~OdYtB5zx7#nRE34VJDs6|@#!{$t#9fN>R^zk~0j`lSEJ#^em!QkYim zi*%N&Z`WeuDt81HE?~sMgs}P zn>H-^mF0-H_!#2Z`Mq|qZ&quovPAMQ4PIo)?N3JZjYgi_# zZY|&8Vv^6&<)J~VXEH1LrO z$C~=b8wt-mL4O6O029#Pbk%`0Z_%iD0x86gl`-Td+(#?*RUQ^?c&$Fx4WDce3(;VV|NqC%YU zPNASAaQ6I4!)#j0fGHUHLB#^pvMs0=U16?n7dY8ig!)i%diL2t77LvgBtXA6hm<@? zZdNUbG6S73^5QdFytJ;8T(nqF#y4YJk6Y$kNC6bj>P@Y*8Z&^S+XdPCSDMUu=DPJFimppp48QLS=tRZM>&J4pz>V5%m~Qbz82Pu8!4ij(45@0gU*ww-1tD zSBVL3E*dk=)`@*RC~4qXgFh<(EwbBw=WJmOmyKCe(EF@Xw#U>~*)cx;;aHS-4=Y{( z3sI|^$k8|ECNSAwNz&eKB+r6+(d08iQ<07T)|2@4W-y=SF6q4iA`W8GwmSL25+`Fb z7|iDm;RaY|v2%V}t&6Btpwg;>?wWW4Cib!`QI_+Y1^Iw6SWLU_Ot(vV+~}9unll^8 z*$u@Q*~eMksU(LMoF0j)cNyBgO0PWwi;>|8g+rf7^ugyRr)Dg-ylVT)FPs?4Boe20 z+W0nPN=v}5hZyDgBXTu)VoIS3Uz?eu4{^w0w*-DSB$u>1`6w;9?yp8IN3(-3Yfe)$ z=XQU?$5Fgn`R7}m@-fC#IEl(^w-Qpkcu}2)#WPFq%Usck{Z^hO(bUU?`>4NXeVvvR z*S+y?Pqh7U>zaIn)s>*&*y`PbB{##?=_dheARECaG=@@Ct44()>aecs`f%{Q z)oa)iR(R%#9W;T}-4K(V?XPM+h66AC0_DP|PlS za3}eSlNM94-*X>*-=v8zJXgHpuGk2_7S>@c^LHdpT{LiMhtk8D3t&j1PG|oO>*Y=H zeHMc;wWCOtQK8`%h$@t(;r)Ak5M8Bgy~T*z<_Rmt1rtZ~J)q9%j@NuFsOoF($B}~p z+{h8zA%r^rSItWt}*H|izGzanUj*39=7Z#Y{OA9P!U@RxU0e-GxoTXMvCcA zJo#vF+`**i`whgLpn`wVjMn3N#{1!Vz9*hQswvw`;h3INOgluMv zK*3(AsB+MCJ|6Z5vvkcD4ipTAq6bxCyV@8a!T{j!#)-$QR(G{TnonwE*B&wIV{vVvU@_B==0A$qE63AFQHEMPH9eTH!$;wzpLa( z8m9$L`ml302kDo7DEA)@S#tH$q=V(T>K6kdnPC*;gLY1WF~N8hbIj)hdWd4-_U^LX z(g&RZPfPVxJ-db2=>&)GztUsTaeyi9TW~VX-aG?hj$V`S|A_B0f;tQ0gWNbaUx{?H z?kP=z^!J$Mp|MKW7XV_}XZ;y9HgV3ySAFT87gk%Zu+H=B(n;qfVb5ZdXkYQG4={YDZR6_A3Tklqn8}H7V6qQ%r}BFTpDo1pmSMC$iY;DluUZ= zFR`UZrj6)rT%38N2Eko#yXDEO*J_!3CVQ&S+?SFJI=wD<0nP0kg}*1kPIdc0{a4*6 zYtklU%&I=cNKPhOD?q1dH)RpHH=6fY@{!r>onvU06RO-M*2fv#gIUmN-9^jX0mjJ%I&M@Wm1SK`_;a*$y%O$S+tm* z9E*jfXiYym$x$}zeP+(N1q-T%WI6&buc}e|)KDfgy<=*(M8NBv1|+XG(UJ+ydx>u; zWzk@oH8*BLUO%NkW&(UrpW#oN!yKxCq~LH4_n_WX9LJ6`EL9K<)U%OxnNE~+o!2`D zFic70tJ^7C%b%fg113k+^na4ZNWp(x$~b?6xbYFP-00@_9f*;O~Ns+s=;jCk}eK~%h<=H z8jYHuor~D6ueK9EZgg7JR;2CACNZYkQVYC zYIH&wrvt;ZB9ris>({TehD(B{!B5XsbwIs*^oTK>^md-k@fy+Py*W#dR7K9DSP{ot zOEP$QrMrRU*BMAzBhI+fhj>puJM4hS2YI!v{!W*T%JN`_iyzp${wBJHy;H>^e2B2~ zghS6Vs$ekZ-8aUDpqk&chwCTnS38VOynI}XV$OHeFKfyT-&oGj<<;H`@vaOu;p*`a z?+MIRU^W`?xh+-^+TDIcrep%DDtHp)eU1xFf24dbU@SBOMGcdbdn{|Hl640DB*y`} z&l>qOimszfqT|jfR8cbrR17s=WIoJa!L=e&#V3^e{Mt~p{_|6!auOIZ)p6GT{U~;r zb$x<`Dpj{AL+FA6xhX%tLwT}6n)IpIZdstl)=G3zGTZbhiTdg9c=`Y>U){21%D5D_Cjiy@5I>=GqrJ&o3pME%#e;uTOPNLBDuAK*~v54TJ^2B%&8UwO&-JQoO0+5H?<;@$8tv7D7iLK@ zeV)3%Uq-@IHB>YhgGD{-0wy~+^)-v6h((Ta|T_P&7`+NC%cRMzehBJ+yE@m>4U zl83N7jqb7`8%z7MzJ^#srJ8`ZjB39ryEXsq7s)HhY^_7u)Z{C`l9_ zN}u)SG~WF!6Q8)NpFZLuTsmeTyilvsv9}ejE;M6nVxsBT)RX1L0r$*RgvR17zZ~zE zNo_F4Uc)G_HkEgF@mbDqsv^7Y+os?3n0qwS0BeyMImb0#;Hh~EJNG2Z#W)J8g9Fb- zk1`YayZG2_!jHh`s{(?YS6lCzmWh~lFC%-uTW1LpYxJT+4S5bTl8}t*h8SwwyYkGR z^M|;%LOAC>A55xjt|{OM(D@HaMv)~DX)>~yJ4I#!r|h>(+}HJK@0;baIv!P;N`!s; z&V;WBQF3jFF|=^BLOg(OO#+Sjooi6CbnDQ;@pG!};F%=4H@U8Q9@y{bioT=YC}V2} z#;{Yrf7Y{^{x>J^#D^g*_r=T0Y`Cs%pl2da>uAN^`?A51NnCBGCz{4=>k=vq`w5&O z1L`Rln`GiWmSkY~rq15gm6%B^vs66gCrO}m;}E$gH)SZ1!ZmhI*ou^6*3LgBZEvu$ zN>pOa?_bq73w-GJ(MnU=Irya3ong>GOB(0Roxo6BiyMCaDL>!S>cP(4qC!M8Iqxwy z=fl#u@w>w&ScP+LH|ojVc4lLJ2lQ^5BizOp<2`5ffMb~&Xx01gWnZ5afnS!DOt=bRgPoDNttR;^OLlyqW=v5Esnr>Xu>AIsEjTeGX z@QbpEb4*$i=XC?}TbSg;5?YGT+J7jkr|nidl2Mf zlWXxKeJiih-ftY+rmEsiif5v^B{-I~c`_4)tTKMRY}cHW5vwVE>n%|PNd|WH3VJkH zKT75*(?pJ}NvbwfytWbkFs}{b&vhOtoKo6#IW@D%cl0awO7(iI_$Xndk%wqXa^){m ztxlYJ!3O0`-PgZ^-3fvsPVVT;@88ssHi282U*7hhx)Usby6WoEi|sELpy-*kox$v& z2*qrzFvJ)eZWdp*@?~F=iB^DNFeON2OEx`8?I)Z{6Y-+-LiE4bOO1t^#bLxQj=J|> z%B#*~ClI&9>+}fz?zBlUue+PHf~2Q%r%ZpJ0%=<67}E8eZSGT&xU>s>1LoLMxf3;{ zul0_B?70FuB(&GhTKqrS;t4O&Hmbw-@pJ$ic6S~<$^6(McKFxzVD|L;rrkapbz=Y# z*DT@A6&W$tvyH@-`XHJY!7pp5b7Cjo#?ph>(@l{@s{n0P7N@1vc!+0XSqw`A@_(t- zQG2N8?UX0dE3gFqHEZEJ0yTE7*A@!;`(;sq+yc$|k}o~(LXVO%k%XreZZB2a-Fq7P zMWC#N`vPjI!hiEt{_>svY#U7O;gt3a88G!scWhLoi^`1^nJW%0Jy*d7`ohtvsdevu z-c0P=vfuTef3O4I*fdbQ6iLmMHT7y4aOCYK-wgG>Wk;W{+P!7YXVWx&UR{090@M)M z++_l%;#{d6tn7^w`K$a@yh`E;#krg!PaJi!@s>^|s2vu`-QN2{E3?RyYj+`+;d79> zI(c`uuFP*bUycCVXHJpUHL8?VbFGcb2{z;4nt|0-0B|!dWpk+1s=n9WUL+tmA=^>q zH*bh&x7jdpE7j0PJNjNhP0Xw`7ju?SUK{(1diQAAlvGD4T@shiU%Fl(V@Rj-$fEy( zlUH3NOT?WPNKw@30`o-?ZAN@K>W(sWhm(j8^GP-$>_rn4Mz;|%h$uf@Uwx6Yd=s+e zR;&nXs|i^6AEo})DZ4OUBsvCq8BTCp2%_3b_NhSr?1Qhi7Z3fHm>wX>rqJHwUeJIR zB}z0g$&Qj5NU<}bQ{7!W#eqNl@f1BOjWk~i2)}`~SgaT+O>ixW&l>_Y0tRD6`HQ-4 zCR&&8_tuNp^rJ><{`(El^+-iut-QB1!*l}t`3uI6gm@1nqlwO5wJg1$%dbE{)0jo{ z{^ka8ZzlW1EHU4?+A5xFCpmq`>(w3AQ)(Kmj^*6vvtW!~6~^?|T(H2BEzQyM+A%#=;tHfbUJRbw=e_Zi=f+m)1>uAq~uu7LdNMDCBIezf!*OYfnxN<)` ziNCyykJkRSGj-xI4P|plzDleWH=I$@8c z+R&Aw|Lo0Hx!G>&96w{;6_*%}X+C!Sra2-tsVlkqdU7Jw*xL3^{t5J_`c6-RYT{fz?%P-q(AQm8~8cD90?E5&4~BxAu7?BBl_l*qLSn z_6Is>fDTX@TzCq~sp}PznkHKN3d{50fH&`;lJy&>w{=vs4Oh2I?j&et zs)3Q02QmSr86&jCBXGEWHpl^4hwr9{SOtV3&v2!5!CBK9w9NJXfApD0^wvgAg%hk) zwOo1osL0hf_c>+p20|X;y^glh+ir5WSZcf_9)(x|{yH%j?n)bSxy_et)(-Wm%6&5# z{{S5es@S`Jp_mEd1Lm$Xq^KjViX}l?G$lPyx3}ZirTEm0C}G+%yvwmgupd^iK$Sep(N9y;4<@)lV#h zj_egjf6GksTPbcvN$?aC_?k11(?IJi@vMy!!t(__s4xzQ#tMyna+9Wzv*sF^Lg&$! zMl7*ZRT1G=M!`x1lx8WmS>sH2k<;wZrM;#VU>(nr+?f}gE7 zi%qUC2JF{1KFd!WVSiF{rYmnytTwUYTdmcLC-=%BZ|ka>hHA(dOFc*<hY+j!YKgkh z+2LUH6%s2iw`K=gVBR+xGO!hjNSC%eBwz3vS<|9XqIm3&euKHzF} zK;R)RJ=KM5-;^~D15?fqy9o#VnlRg&;s{!IaD9Ph{{V)oBXF})Wv!BgL+A5@>1HdK8-Q=&@QBX<$09fh`ZPG>m05k)BM@HQxaH!8o#^F~35)ckwF%jeYjX;Vx<|Up{69fK{ z2lUe9HPvjqiFMD{QsACOBgCEi{WRw3(v0bv8c%U7N9rRZ{yHs16+p)a z6)NN8PkkM?#uMDybDtBCC=$LFAe<4cSNApDNBHNhD9d+2J^OeVBv z{O-1;!Lfyt`e|iq!6PS9Qoah?MD|?^QQex&$;?-a) zt43AnPonqy^_Y$a_8I*2JrmRTgHmI3ABs&4`YEw)YABpxPk*kowW*1~AnSV17hoGY znFoS<14yqDF8(>(U#K^V@VNoQyNT>hGK zWeFw}x<@|W@YW4TjoqAR?6z{FI0Nz;i7gUG>OZEKBnO0}83;SjMmwzMQKqC)Fl7hx z@1rjSOWcA-<*gD$5&l!AHR*1REmcs!KM~LAp!GD08z_5e#(HI7aG;Grp4=D{!%u6{ zi%LzFok8xbe=S6kn~}gxHqB^}^TslNO+;%%%lN6u(?p47sY*&o5b}+HI)yt_1I5({ z{PfvXYH~?cKemKbTV{ymQ@77eYtU^=(jfl;qhfwQYXyogSt+sk=SLD22Mhy#Yptmp zXYe2&RnZr!*q3C7BQYy}o%M_~K7Lgc@-Y7ZR~m4HNWPFnXnZ}=!F(+^k|A1zn31!4ktNb{gVUtdzep-h$t}g7*0s3f!fdSlAX(rSJ9ylLN_S9C}JV7}fy|rOg(^8=P1NP8r zl&0^+NFPlwQA4=3D1FZg0;OC1ooP0x<7~zW{PCuFBBpNO;Qo5U;o%?x+s0gglbJaEwXPci=6#%bY@7AP8HPS=igf9dL&R~iah;09ZjfrsE2OYBh%b>)ocm}6h5PB7)dY%VXWzF(Zn-6 zDhTk(q5KCpUA^uY< zFR{t(tyMPb98vg`^^Cvj9SWASd!%7}<)hR_yrFC@Q3L38q1xXLIZWgqc5LTS<)XLN zd7xvTm^!MYNRQr`jGv2Bp%r!WGZK<=Kc1k~P}D)%KM{}5KDvqGwK4uTJbU)WH4y-& ztqP+@CzLuAR^{Pi#HZyN$Rdt5koLF#yBc=5)6JRqsvqyS$F7Wne!crkV@IGUF}ZRs0Z4gSG(r zYFbLkfLp)kr8*GgVq(>9TJIDLM~L8KO*Y%TxrhlWld3L_Ya}DXk^ca$kK5AhtT@#b zQS%-3nfgF`tr6=etMZnzmSq5}M1FdZ*6L{oh>X$xM@U;zYK$nI!;$mVk8cYsUW3!y zT)AV|S5g_efen(ThMkOWHduW103NUT;CZ=R%a z2Nbzw+Ppi4p@~L}75U>(E>hd8(}h(GZS`f&gjH`U8cfF}BJ%wS(0Z-$NZ|1SN7U<~ z7McBm!0khOltx=Uk=qGF59U|XSUswNSBRE4$M;kP(#1~dj%NND?tQ^J)VBy_Jc%q% z*IEP;4oXSXH-HgKm8#ns7kT4Pt2h0cRk%xKiHKK&i-(KkVpqhXnAG_Zm}(90cY9 zv8blQ;x-IDj-yEghzTfvJnL&qAviN*_1B@t^GF-#-%8~?3Q<6i{PmD#9-|tbsYxaY zbwl(zlkirjT#AO}^g6wTUD6QBjr_XAL^JDwqswKZkPZ`&PNh@q`iha7b!R`8HCqa; z;VuNm7bj97rFlD#Fdt1d)9kv)yHt>a8mByVKq!(Zjv5~@ z`3)CI;VX$o2h<&9Ev~u|$oNHvs8+}H*0_>&^GOFU(@$*xLe{vf9}G@v&+V-eM^W#S?2N@~;-}n@ z$AmSIGM{!~oe=)kSs`EI)QtSqhyA*v1yxK(k`wdSk8rA+%0c}GhR33=g{#$f)qrOe z8RO`AjSj8qC6tyDIbc0Fk&RSTh#UO;nC1O7yu)pZPx6@^$IVF9WUJ{ngzql!r>T^! zEiejCsUtxy_TP<=R8mUDZ(bn(0O}1!qmyf&;VUq2nUfj*nv&a!j*+|@Z6Xdo&Rn1I z_0epxl>nnbeQ3K}sHy~0!6q}ro&X&-&2zG>BjRIsVmtZ2?$U?$;#k~*A&`UX;A?Yk zSZb5S6uiEEP@sN8PcVrgov z^2GT3MF~=WOllO3wIXkajtS&uKB@>`>U1s+Bt@m;ZLTtng%|J+v%aAITnctG%%)kusH9Kb)jNV#JFNUnmBF49oLE0wzq`r zf5Snvs}4fED2W_WKz~hq)ZjKiZ50reAA}FfSTrxHAzhUUI&iJXsUz#6w3eY%Is6*| zk5F|TVUdO$5zh=+|SMg(WKW2iN>v@MoVC~udpi_=MM zRq*O-T5vmH4P=ztZb>;L^8@|d9Z|?raU7-Edv!#BnrC5;n8u_>9dOFD>_?&Fqt#yt zBwht1s=uGF^w1ibD)`%ymdE-mNjjnc7KlF7$Z6+OXlwj!1HC4Ic63J07h(~lO z+xOOreYFb@9UvJVn%>sykT?)?PnXM93IahZN5^gWWXy{0Pq!TxlXKeSr-}=G3qJ6HWe*2oa632PBo^Qwyuss zvq>YV`Dgm;2`i_k2jQWZf;~8qoi1E1wWfU4z|biCImjnNYQt{{jlL3D47u}rhSu3D z+lY_EBrjo~Z7tGV>8D_(qBJCWvDB)GG3)`+44{6sxS0VF!x7(78gEOLGsqsv&O^3N}#Mg@ukS7sZ+?X{q-ncDs5FH*x~U+kDD`Wae!7?_=_#Qc$Ywv?In;_nPDmWE z2eH*)Ah5SlB+HBv0Mk99dE;!E8UBOYL#aG00UDn-zKz-_%#!9j=li(Q$Q{*(Cd(!6 zvKCVt6$96})s14^Ex~+Rl22@f9ravMTWZI7u&eSI$h zSnE_OM5LeQVU0w++OAbYj1mH^>>DFOY`33@D;isKk3z$?o$a-AN(4Ox%Qr*O44$x#0Qd7~tMO+K`c(jG}xx%psgc)Qh9LeRQX6(a!g z1nR?;5II$K!tBAv36%%0;l`s>-sNb5hX+2O4_!9h_6fMNRvG(#AfRai^=GKJ%-#$W z;X4)}=z$L52GZ5K8n_w9#CT{AzbqX~N}F`~i{juwKcB?|OYvFduZYbhM-?Aj9R{tU zcw}I(mjkwabVD4f0Xa#uX|6~3S6Jl@?yuZvWz(khbS#oBVR+A{2j%=QHR$=}J zPL;LZD-%vx(E4HhG`m|J#-?u~$mc$V@uIvaGN)OVp4T*P_TbD9n-obvs(Q7x|X5fYa~Pkf&G+}BE~WGIx4B%Xou+d@X=WcsUG<#DmU`HG%0AM|_b zJPAcuIDB6se^aW$g0ijKHIcaQ+>Y8eMSnEjSZVxD{{YT=YNEPK{kMQJ~zM1W> zmWCL}idJC9+ZoWBYvi&)%d)mV3LI($UBmzHyB! zgxq3m!o|*gNzSJebe?ru+Lk{}8K<_&3YEAN_XDuig-R8=^LD2tYMs@`uo=#zR_`0Q zPBBvg0QGUAjYDu%4+%wvc^cRXkD%^#SStBRw@u?&9YK1SnTN@J2DCQs zhNJ^iNx*(t{{W7dX4>#q1IC5$K105Tw#;~Qn_!SQE2i6|jTT8N zVwHc<@1V6CWulDK(n#^L_ZZ02MJ2l6gZS#t$L5$i%Bd>>@`CB^kGQ^{?Ado+89;Kk8RKifm*!Ck^V-rJCKgpzl2cQIu=m`}; z7EzjNYFb4SS5-|R9>5;@%C3`X)q&wtJIsBUcFvk%_z`Lm-hOBO!_q8;&q@jA>?{rrYxHpBHM| z7i#Fa_e!P-Kqa#Siiv zH~0-$ww{o6KXljJZCiJ1)X!OIg{muInM4l)07)#e5Odh}_0l!pXzwdLh%UCOnn#zq ztwawQVe|wH>8&;;1JDE;<5f#9JBlA%$34O7lmA1cAf6sD@#jJEn;Nl z;s-h@wz4?d*tvaF;FHYiHe4<84#2%6E|RJ)(2`5&qO}A^}74efZgUbvET>fC^_tPSl{pAaTPr+4o&80_lMv{)YDcAW7cn9?@okzHI zs_h8)xS^U*f9A@P2jp?0m0O;tW%IYkw`n9)^kCip0K-dDb$4^(Lj&q3$gwGgL>m2k+U_QBBaaN{Y>Y-Cf76yHTbf4w&gb#xM^_qp-U)4q+{W8Btf zXlm_M3+x;^us_#Tq!ks=uu|><_8d+>uAR31+)~12s-2|ml@fA4wwoKQq{_{M)j3fM z%}a)!7~@|~c+c;qTTIc>%kcFVB?RN~V~NsT7Wgg-h!7dH8frTBiqkDjYEP6_O0tapfMY}VKUVjJCkP;!DZyXFo%s)^ zZrUQ(4BCK~8d0}5Pw%^EW@F>R#{Y)^6qji&n{B9xIV zgZat*PP1C6)a7Pzk6?AHD;H)x{{Ss)Ss^DOfjTi=(#cZA(yXXb->$t&jY6KzbqnGS zdoRDfzG|i|-?!zXXlfcI5f>@HnCDwQ^egyIG#BDqk-_xW#-Nkm8ZbaYS!nX#CqM$s z+LcYX92~c=&r1F`e&<=N>~V(1G{E4N=m81Z4an#4$?5BXqjt^K@el<=s~?%|s>D>V z{%mVvRY*IBI$(28AtBm#4hp-dw`EB{?<%tW8zg9yJNaqb{O)n;7-v*W7kan|D>Dz* zMXC23i~`CP{&^a($e-CE(ag^3`k?9^B)C}`KhxVxbbF%PRgN>Req4sRu->4~VnUyh z)cOs?(J;jBqe67Co)Cvf7fY?mnZPS5AAer@nFW0z$0~pi(CUMr-jc)t@%aytI%Kx* z7^)Z#5Gx<9lIF35{%zELy3J~9BO{0`2iHRAtd%T7MLEIwogbsJ)h+`*e_bKPjo_y> zt}EEDHEO|1h5F+~AilmaD-Y0WWxsAoFA~TP=cDx7J~;p{3Jm*!tj>}?>FkC>l(;Wy z!vRizEn+L@e*T}9og&$As01RB^cs^M(uGI`2jn!av|&5h-jU;|t9J5|G)f6;Nc>Iv zY03?&N)Kqj$J0~d+fjjqOrMrCvpahuZkha~n9XK#%G#M3l#CPHe8!xYZp5F-ubXcs ze6aqyS)Hhkoxv!Cs4bpD_SA@@ay;icV>@Z{_(1(N;@Bt8l~1qBSJrACfk9S?IPM7j zHITGM{kdt5I}KkS!TD=7vdX6o5zecw6^%LcO0!v`<%WMvJhh?6q(Gmp zwXLpFFjtOZ_W)yTqRkBafamDt*5udjd17c-YooD-YLM4W$#GMbieZxk2n? zs!DymP)<)T&}s~pnc^g6hv%!#vuZ+$K~dXESAC|>kq{&6jXphI<(^F;XjPk1PCuMy z^Tx4iHf8gl_~`w|Y{>(aGvw#f-$G@!O%_2U>tkdN?ySon2_Qm9A2F|%kr;!w7`hqp3 zkOq69XMUu=l87XdH(?+LTI$Co^EOY@LB98=l=Jb?0rbJ|skGH`xdEzIiT?mgO#rnk z-a@Vv?cW(7{Kl86>6vrol1h7a+DhWT9 zht)w^$BOeGk<+xcTCn&Kb{^+g8w9ds$ozhaHKDI+OPE5hrJ%Vn^2>wmoke;Z>oAR? zMjphjHDgrT1QGceiTPtfDkv()a9C$d5;xT^YrPOiVXdd92~$fJKEB$27ns6gxU03FHR!<6T9n%a}ng#Po6r}veZAYr1r&jW;oPRuO5^l=F{%l4N z`*QEC67C9_3Gp3A&<#o@7T^UbGh3}g%_>WekSAKr4TFc4qD2_|C$@)4xdOk2>70A& z4Q=ug$AWUt(>j|Ikv zHqeT>Xv=bnGK@}$TB>Vu3=($wokV&tPa?g(qf%%j_+i87o3A&29s{v-g zKbD9s&7;S*KAKyC=Al3&XX&pdxEDBABU7e>sg%~2US~YUK3UeoSm(S_44+Q=NELGr z=RcmMMR1xk_>b$U(^b^I>H6JqxB&*{6R>poA52tT!1*ng5+}Mm1M)mx(pFz|r7;r?0N%rNYI$oqw zNf_c3on{a|KXt1~nmGkHtSh!99H`Y7N`u&BDteQu*K*Lq9Z964pgad|T*{qVbsM%y z$WI6pA4bqgs;TN3mjH zuld1|sP9)CY*?q__0F8;ilpd)?u*u4qnUq)AtURcwG|xmjOSWqxF@C+Mu*REOr8fw zbZuK%YubgK@>Wb}O;XIHi8Zt8|$IuLDbwtW?vBp19qBAUncOxHN zM3$eCJc#e5J|djQgeq2kSpy%IwR4bs{{VeYlA8z9T3V3j@M|lga?;m=qlxBEeQt{2 z(e`LjkJn!{DfV4pU~iT*8yt)lqn7#TD*#%k;#irDUtcPZs&-UnK=` zBpQ>E?eqP0GORL`ii)2zaFI{v>7jKcpCwA4qUeHK=8zB&a`)Dmt+kOK*h6 znn5Irp}z`{KP`B+`q_UB1dpCOXtLASMsffr>OD2|hNsq957QbF(cLgO_CwQcTxNdg zpdVs;=#(2GMo{v~tCQ$Pwo%snIpp#a`L>Q*w@h%z8d`r5N6*txFjAYGhR4#&g?Uw? zs4P#(2^xid>2Bw+$Ie)Jt~2;ZCsx+g>aDhhPY$M?6%TI82A}D7Ue(+x6iO5@@7NKg zxuLz35)sPdd19!9l$It^y@(^zSP4KFP&L>W9+PaH$0(_X!g(>4;-eY*<4K#J?C)Zv zji;v)LSMKjc@O)vqAcMsN;|G{!>~MZ57%1QA4g95wQKqzcB6%==<1BIkK|+_vGd2i zlkOW*=|LfmT1P)s2O1ruj3#d#lC#9?=E=vdy;$adC@crQG-d5|B0m%1WaH_Qry16y zrC}lDgm(iv9jLd3rjDJV$>JEF-%{XN=3oSzN}k#5H7RM@H0Ds_8Tw;G>SlPxV{Rut zgV<<@4MDh)nyeMCN+kQlt1P)tcm~hujd&{Jj&i7bvG~yg~J!3dAPsILOJ52oL zQ!0}o>{+v)>7ow45D`TmqPNpd24gw*IypY#IBfgqT@+FxsSXzd+eM(RmOKF~ z9BAkyn<{);4XYyL@Tgy&bSm?(8j%`GV9kM_FQ%F7`=X)%BVZYQGIYsHakW*DDkB_- z{qzo@$`I!Qs4AKnU~;l4?Wp_+83bqRu7j@GHmc-$m4ynh$sYPhy7cy%rbb(MXtDEN z+EH!roY{wUSe22oM{l0Bks<6!?0$IDEyHY9+u7rjEyUp9XgsvV7^y>?=m<;>1qpKD zkC>dDU}u>}5bccm6RGl3oRSy!*NaL>^J63AG$QR^%|Synrw7Uht~Hqc8T?QB>SVAg zf%E$7N>37=Ef8;>k8a*oU8xjQi&OkWsC2;joDF?7ZNMK1D^Ym%3`hKR@>Br{6yTxx zV^E99&oVDCeZ4hqG$ASX zrnpeB5lKp6(jv#;3!sq>BLdD98GZB25yb zl}}9jYX^xJ2gL978UZ7lgk_C)D)6)Q2XC|?Br(Rv*@@Ag?Pl06z8y-bBP53HopaGz zIHK`6$j|H-)A!cu3-eJvL?Dl-&a6pXrI-QXUvqAoY{|lkra2gVvUIguzb)3e#B~bQ zC5|}8JrB#il1EV^j+Da%zl)V1xb2Uq#)Ht@pq8jlTga|*e!4R8!%(&plI3neyXvaJ z_&aEgark6iC2pm<*46@0zw==+{Ylh`I)Q7Vq*RK6DULCN$w<%^-muS5)4d=}_5n#G zen(d4HmcP!H-lg=Bh4C@mW548(sOB` z1uaXJ@g*Sl)|n&@e1*MmHS)s6at?L!#&h!|>gh$cE;$^S=j*B7G=W0Kae?YIJtIB6 zH6k{3BOS(|_#rELPdc0l8~4`G(;qXOjC-AFQb-u>`e>vmDd9sQjl+8pqiai$-6*lU zcWfO_p{Vemn<#IXBeu0MKys>ZM{%vO@FZa1eDrN@(uAABD%T+C<)u;bAY)jhvL7+X z`W;3L$08tIeLDlGRMy*tLH__If=2J{-%QF;0AX%JoDEEg06weo)E|ebhbt^HAqT%D zI+F~HM|JP3v;oN%Np4m0(iR|YWXUNL=sd}&7846 zmZnk@Gx1e9KbEyqM@bw)UPG758ZAM7p@pO69ysI+Tn#lP-IX z=Sd@*Z9Jt}yZD8%pUX;jjpKc3iZxrugWY10SN_AH4J0cDxmP@vvS#BmWpmi5&VOAH zptW10{wpq9+v}>D+tg`ocBM+FU8R1?rM%z1o9vtJDd0ttt~h!6p}`|U=8?)UT2s)f zsExRxRZl=T=eO&j*GhX;#C$znIx{z`1pxm5O>3pO(bdJz)IQIOmD_i=0|MfPxo!7Y=WiTGWmDCQzd4I!J91xJ9)m&tiK#Cv_zI}D|9VJaeavpD{bPB4Xswvp~ zJK%d~Bx@MAC0#KOPZY%GxC7Hfal)W|Q{6q4Swl{k`R7yVHoSA5X$~X#h0?8$aaCL< zSl$Rkq3J z2CiuyLVGA&59l;`?>6`;o;Z}3;y~oxhN~#4AzbbW1c79unM(WdI+;OtrI(Iq=Q#Ee zlcF^5RdAQWNc>jMa*L2ZGIY&p+jkfOm7mKe;=_7>+o(+{0HKsuc4CQ1YpDa!nG=Z7 zi6E+|1B57Cf#t@3u9zw8kih|#zMxddy~1(Ajc%qyZ1{BJIPJwfG&YWpbUxid9VBK- zxZ+ZOyRV5#$xKwXf#K&I$=kTcMnmDpM=hsu>qK`J- zs;YNL>0^&4vjd%NgJUwpuT^nSGw7}kbk7FaxC&zRR|69_d`3IzTX0cUT4e^FW_BbJ z@-PJI2U?=q7EsHc*I3__Q-KnnHe|un6tc@9{{SVU@qs^xK1QR}?jBW!I@q1ckHpP^ zpWo9^s`s_pClFK2vD22pXq03R&qto<5lX$Ub(sPsFNO%iGhhMx`s-{v7Pbl#;Lc2q z+_wx5>!G%N$!ngl8vBJ>p!blM8Z&j>cKM?CTYbwU4#n~meSLfC^K^#@WZO!%I%k%9 znncP!3Y?$mpr3qL?PzJMWcbOH_EhfQuYC%vwOy)fh>HCrtvT+X5!m|<{j?HYxpT5r zKf>81sFb%ODmicQ(T3WqP7`hjY9Y*4sVUU@HV<+7XwJsmvTdvVKH#wilCGaQjj{xQ z`lpBct{9|!RLGpuQA_f5W2SsZNXA9A5a2>rEHiYf!N*jKeTQ8%4+ z&a(A2vd{5S89ow9s9H(rx%&8W1_b>%=Ne1h+oO41#g+<+nhKfr`yYmyT2^^qB#ZMv6 zIJr>AEl5(>&J1Mm1p2mrEhluxciw3(BKWuJs48G2qe^@{eEa7FeKDpj_tm+t_Xw^# zmi0YMuz<0wP_GmN(}-07ewq!0I{+qi0d7gPstA73GuB^vVI7O_3TWh7yOb2r!xSS2 zD%|8$@W;>*rrUhIV1oYuwW#+f77CSbfw5H2RZ1cSk96@9A&-B;a(n4co2<9Z&2*Bs z&0AR&byQ*rs#$_~$U6madocPCb?xV1@7v^b*J!R3vR2W^Dk%(W96khtxM9IY7$0$~ zajZN5ta`MQ`J$W0eo*b(&F5g>cf|!YO zx7E7gJ!J&9DXJ2=%wbV^6_q@uCi*ZK)oF0r-E`Tz8it0^yD8+^RJTSnZ%p)+YXxX* z{{Wp%QUjbEGj{Ex`zvd8J84tPB_-0L*%YunJGC^pnWJx2B#dDD0P{*moZ-IxtC~K_4U!A+6m+ADVLAbbn}Rw$;OS-mJ8D zI)OwbthvK!w#!l=zyXOsTz0_ajQw<)*Kf3~Zp7QR>3U&m+*V%gw}rw0X2}D*L0t@o z)3N3GX|wO`{eH7tDKFhpxU1eE6!nr*P(l7wquN&xmv7u18{1SDOxZ41jsF07tE}6R zh^;0nIAe;EKbHw1D(C9Tbw&FH5I*SG1F{MH>2mc?+AFM^DjnCdYpLL~R^LdZy7QuF zD(Tg6{3O915WoW%^e5-1UA^{}-M2e_%(vH5TBW1eQyPkRWTl!^s*|^Qvmq>ddvWzT zYu_C*=|$fE0AF~yZflRySJC<60sNm$Fo^EWj%Kv-QryQ&+if18!T=@4Dh>>Z|0MXEf;N&*7`C6C<~; zY@Jq@ZL`tpr^NmolAiuBsB_%^08ijeE{5A59?2V*^Lr1LKV1M#ow{sw z(a0$(>ga=IWr&cjqv`MaX{?2fb_!on?ine@>9+b^Pf`}eyz1#HKqcXpoXZ;@p}@!W z*1Bu+*kcHS8s%Q##S1Y%(^G9#+Y0W`(OoEN>1slj60(HOJy*Uo^I)<)Op2Rww$~&@ z3ixv>sr>SD-$eH{h#PL@A=Gs)o~i|j?A39c;Ig5>Keo5Wx-HPgX8Zn3sN_?_AdjXG zf7?tO)1?)!6t(r0l@xUWJc^i-osZ0g{6C(m+ihK{mc6XEXkX&vY%H)J6H!i4KV3_z-mP$OW^YF8RCQG^VNg!K=%@E)k-KOw?av$GJMyG z1%H0}gf9`(6Y(_hoO%MowykQqx+~Z(S1KVs%;)?F&XIQ%8xd8Z6<|&~7m0as)Gw?6 zq-+G_q3wFKy%?F59#`~3l1KfT12w{+N@ZFlV0{4^i7k9|wQQ8NJ|rq|uIr4C%TuAg zEJa)h$^5lp_lrhiE$wR=?r%IIKe%IAbN+B=C-l@g+T!XwS}>|UasL3vL?+x2%__?A z63ggw*lQZQ{FQLDN=oP7J@sxk-B_{sP?)B8&m@6C{Iw=ai^xBXNfADo0|!wGlHPYG zUY;lUkL#cpNrVD&wj_#MB|z4|(DndpKt27nu~6r}m=Mrg)mWh?Y#n>Y<=E@Or#-YltL1yo)4shj9D1CMV}p-vd;tU7MQXOKqDCvNiz^`qI*y~c z)?S0>{{RgbaX?x)QxdVj)VQn4sPCNo^dxp4PoB1}IAs3-T`)X^mqgML=q~QK!5zIc z!)e?!XoOV}+~5)Iq%~p&OCRg4fsb;`+Gvv$R(EN^;H!4kx>B5j4MbZYHOYH;CBJr_(^_W0YlQ+cZbZmDd)X*=u;w zp{qbWah&$kUB7kF$e>3wZTahwt(&GcQ6v*LiVjFEqOkQ28@F@^;$W2B~42=w|@B3tsd{Bnm$q1 zfJo2NSl{8!Z!1GJ)~^{i;9?RfNct10R2$1I7E;6NTU5Os;Gu8FI`{98G(sEY8)d#I zl>{C2%%>ihI*l!LG-^4V=jE#YlXLSpZa{yn?Wq#pV*{GV zyj$ko^dnC1MSj!|3BB%=;0_F<>c>#zzSBf_p;sg2q{^G*5#;#Fewp;tB;8QQFY#Rm z`qX0CJ>B z8OcSiaK$(z1qAobJLztrII+U={RX5>TELY;eR4x-VcP0s0!a*VANn!KX*T<|DlHWZuwrP(qX060O+BuT zOm|8xdorG&l9sLoV_6wy89WcC(?Tv1800WOobm2gNU>dKq&!T#G3<0s9r;m97ldJf zl>Y!R_0_jdLLRqcgjP!P4pL=hKEw@uO?qSnlC67sb3VFXtKW3hRP2dQhWVKAKYZu~ zM(3&wOmUO%pHZfW3G9^V=;2rs?%UloMnqYHFMRPNAKOD^-?wE3Lq8yXL=0&ax8=f@ zKfq4ivyS>7QM?U9^J*25y~~gA(;26(LR+PCxG9SLzb|zxOV)8ve+svK4yWI-tbAu@ zVh`dcI#jvdJYaE88hu6vfy;5I$N(uM_5;4OHYy1vf(3dO5nx=x{15V1)pHjF4 z{(6aU+jcsW&kY-&OlQCCs@9hIRTu^uvba65oao&q`>cS3nn5TZPUl6kxKnXFqP6=T z2_p|nacJ@L1ozNMHqG9Se67Y8P&JDQV(D|z&Zs31SZ8S0C%`YbTWQ}Ng1yV^~B#(bhFf=8Z3e?pZ&lKWu z+Zu|^F(iptYD2&m@UZms`D-5lw{zRuSz#uf0E)u+{BXxRtCKGFQLvt&y=) z-#@0jEIoh+^Yz!DkUQfi)8(P8skvv%J;IZ(Jej~4{{V)t9fnm%)@jLyx%W8K+KShq zaB`>h)?!hQVcTCM9_x=z`8Ybkmjlee5&Gv>O0Mv;@kVy02g_AfuP2o+#$%r6x68h^M^sSr$p_?h3&k8tkaMq#Dedy~1n6m4MgBaut7qq_ z5!T}!xP5b=MpC$5UcR03b@#^V(j&TnPV)VrFE&?8hvay@gQ*NV7iMrf+n@?Pgux>a6c z?vlA5M(wPl+;<9R#M3b&N%mk5l&u|d@kA%TzUW0sf~d+EdzI{Ul}*mp5VA|fvDgwc zi6!}}7|Ayhep(w}b*Pjd4O9=1(R8bnH+%%IJ!5wY-nxS=OCQA9)>04eXSdAiB*)E; zBObq=mP+YH7P)6F+uKp3mmR%zvBrDjTBM7&)Ey|fX=t^jj(hy|tC3HB+S<#G-Tr#i z*~c7b>!mr#z*5AVjP};H^v7|LuS*a}BeDLv%YqOC5iQH2&xJiBX4<+JqqXph2% zBP=j=xo9cK$sqju<3d_WWuQ#FyB`4dKncHXZHk!4a2K%mBS)5o+=G!^x76$DQDest zplEh_s}Jmhn{4bnv8nxa=iJpyGJHSFIw+yz9I$z4!tRyqR4j#C4VWGGl? ze&y9i=dD7{=y@$rL-hwlUZPhXL}ky*TPdTBvEni9-{+<69g{beqM0r<@}vA(I*(>K z(Q$RCbnu!803#f@lc+Pw@qm%|XXWM88Lkykc|?SL02tKwRZ(_P#FQZ7(W4*OYfVhV zW`? z<35_+uopkX!5@~lM{14V$q>)aKuNqNU<`#D;;Tt6YKrIe)LM$VoO$KuGmMVfE^M_; zkrZbG(LiXTiaF3r1;|%%$ns^V=#&{{V)r3nx}?we*Ye zbh(Xy{Au6zJ@pf9eV(^-!X%EKSbWQe!3l5 z(kt9$#3Z7xbss$_y{EdM*8xd2dUtBMTf`vKsBgqy@ej+}I$x~&F0EwEB^AagRr{|M z$sd>=x^k=8`<~ayns9)6jFG7p3)TLDup`b{QL~V7fuSyU;VSJ_JD=>WyKVGOSxFR= z#s+wVApY8~k3=^Inku>qh+R$yXqX@BJL~i_Yi|mBg$mML3bP)^BUs+7HtU2^H4KPJ z_P{4g6S!f>>c$u6@BEW3x-L`vM<<+bt>c2KLL4BQRJWJ1J_F=4ie2C%D$<# z)7CnN=K1ZA1_$Y^o2T@Z5aK#WeZ<(*B+ z>aeT3r%Lw%OCm!+aHqC0fDLd1WouAaU0^3iNU)YOv> zIqXOLbf}wYYwA2U5;fhp(*z2ThMNH(L-kQRFuW4+p4MSvq zDfiX=y0)#3j-95RGRiUpE9t7f@{~yvm`TX|A%Gen1A?Z!-6V9cuA&AxD#-`=PjEG^ zLTi+_#Ndx?Yded=sJG%G8C3j_FYE25jm#EM9j;NXDMDr?9Y7~OMI-dk{z`=K&QH@@rB-$=+@G1( ziw+J+?TskqFbZ3syH!9qhX7+AJz(?8F)XR;>-E=|OqJoSh#X}{zt>ljf~Eq+LV!fD ze!12LC2a90*W7ACK_rikeTU1wj#+3evB+nyLoi=NJ%)*_E+|XGa!^WZY|^PQFgX5P z_trw+Q_BSa{dDQ#+YjNl7~?*iKjZV(`YIY*l{?i=1QgIV828B^@YA|ME38sa-IAgS z8yFs#@84dn44`svD92)b^w}hqOLG>DJ|;2f3k;0|ubv9IOT@0D*%;?gumx>-avR|k zV103^kW3f5#w5VUePiJ%1B#rVuBAamDC5RHSssCbIsCOvZE%Q?w5*}q3m*}WL8;c; zd)CyX5#R?s$v6Y^KHApk@cAXB;(dFJ9TTVA64Su2)6+u|f!wTPC-wKy06U;}7zv&| zw)B#$6H89fpur0;!Oz!Bw5dsCpbsSU;10?QgWpwS+$txNl&*44a64*bFC3>eGPmib zZXJ?c8LXxa!*qhIbB4Vg*#7{ViW~v?wuIB=Mi<=o#-oJGc}H(w&r>2p*k`yt$5eBY zs)!V`#u$3w9c&zd<;PwqZdm2$b)1-ATpxb^+NDc0sEI%WIsH3p*PT;2VteZ)tDb6E zA*Z8`MNaI|CP@6r8XX*q;%29k_C0_ey1c1gs$)$n03v25*mu^_ml)M*Sd>sQ7-wGF zT8K)&<;L_wx&w2hn}w_pXVp~=#{^6U-wyv(;uTjAp*NkbA`;n^Kr@IFEZLeC< zEkdF(AAx`a-|-D}2G@ex?Hm=LGXsnh>!e8Wcus45Rb^SWZqFMu6z+ku%0jvQw24!+ zZZvhzA&xW1lb0U4>zln@rjCac^syW+1{b!fOZ6ldIs8|qXx1`L5aT))$?Bt-O1HLC z*IS#EzBGW0s81*d{yKKsn}Vt^R-%{%_vU-+*&}yVj!5E)G1*iAPv?`YQ7m*d3X+*5 zbKBD+`e=@Ft8Jzln!9DjpM$}c#y~~Rk+&tnIK$D=(47AOdk40k?T}EgCJ|Ht9e}`H zXs)zVERJd*WrX_hZs+zL^+C$3va4t`(2g;<~2gNhxZ$%949>>_F3j1t@}=!5Z(p%n45{Xh4l!Kg{{{X{NZJV(wrxdj|rjx}uAWhhQK+aG)SlvQ!i04e9mz>1w}hM@fdE zs-=i8b`leee%c_=rQQ{Tw|bMaZE(cZQ~X1y^A0Bf{P2BsU|M>kx9$*^w%TeRw_;Pb z>8^F7w$VXUYK285OSiBG86QtgTU$GKQQK&QHBeH=;jUN+!N~mcpnEJ~TU?&T?V+iY z!Il<_kOZ$CGh6po-$+d)OA5)y8IX-uPq}P2TE#Td@cH>b&+VhpTdjnAL=w4j2X$>M zu^4xBYI@2?c_)D(7;jf@-=2hAH&pRv3NaTU*qDYu)N0CTC!v-aMt3XtfE}~>>aD+2 z?wUHEhogo`BG2GMf`4xMCa`c-7b^<0f7~hMT5L+q{LC~MCm)ssd+-Aads4o{rl0 z4SiK&3ye`gM82iD24VCARa{p~m2Ard3c&#(PVHAKH z%IFyCc3f8Vo{|U}LY`y8`m~3(gsp@w| z>b6`_eik&OVn$Vnb^Qlpq!HH1PY0!dt^4h|3xfEsVwz-8$QCMi{+_zmX1K>;MS6Px z;ydOa#6Ll$OK$V4tBGQX zpjo4_RMfdvU?WhZfITwZv-H(3J*#lu;Y!5W^j5`YFXC6!mzht`h`=B39bQ}6r?|#x z=_%YodpweuyfD8}h0d!APMz*4 zsvWOeW};P8K3a;Gm2>aKSN|YaYt*Ge z%W&G+;>CizYRW#Kf&Ty~DQnl@$!{Vw>?JI6<-+BD)jg$264 z7{_v}#OL+Zbi0ZTt9xoXEwNU{qCg{7spA*5}JrZDH!D3M-%z_>a&x7Z%FCG+qV5YvbSLnt&Pw0?frF( zX}W4bt-NhP;;`mK6(azB6fb|!>1Cjtq8os~Rs@mk_)iz`OCL`^EdKtQN#537rl0u6 z%~MZJP{Z*l4oM%^_R>b_yKe-likjcEs?@(B8ByY_fcg@+45#(hh`M>dZcs&6c(=_- z1f-B*QjDLNIo61n8=FgbJe0AxHy-(_e}ziPr%0Q(guG5aFMTUiRbQr=qPkR7cxU-! zazCc5OOH;iw1dK`-_k`P^^Qe6m-f_JK9W558ib1PC44HQjY9DmKTuemJht)_WQ}W8 zbv-4FD>6wcIQGtUqMA7pPI0q3gXzb)8nfzpF-S==USWu@t}=heUfKF@MMFCpo1H7M zIE)Wp`05DqjOqs3yD4rPyIk5&NV^3fS8>S|(Es7(ENU?0y<5cKXl%}UUV z#RNtib3(7pN%Y7ayXh}`(NS&L+Kp=7LlMDLMpe)IUYdCMtd>cpq87>Hr$A)3xnu1d ztaI``&WKcX8oq`zK}%0HIbn>6KqK|es`_o;Q%_VLCCZN6WMXrzlC4eOHFDG`EPJYt zO$%NKp_FfcwA=8Qs;*aOcdo4qQ%@s#o#y1({QX9hu1g%X4ryjpRyhmH)AQ^Gj6<^| ztE5?=o!ztM$-q(Wd+U9}VpCC2JyTZ`Dy~8f`PI3OaN!(ojhVE&Pe(}TMD>cT?VRKK zXJ0fh#CWWT!{$5cIHz#_7>$lSz4e>ZNfUQMzeA;g@J~NAv7pH02*>g`YHp2HoOX0;4Zf;4o)~7dXhJCz4a~@otQc@jCQ~tx?pH2ZgC4hq?9gvGx_Vz zEDlKT^3gY|LFSql&&VBMC5m6c02%q69?+G&-NJ%04m)?&^+IvnWP9V=Udb3&#~$BJ zWC;2VKoyd_R1N4yZF|SeFh4zfqp|$8>B+%TJNtU-#!98*4*ALL>#v3mKt8^@%LV;L zyyM@FJwAG{qWOm}LP;LE*1yHvjcy~j8UDJ&s^s7g%Q~<-Dz&EsdgEUM^ZvTb_s_Z4 zi;Q;~v{tdlF5SI;diXDYT%BeDoB#&B0CFG+epbihy&vOrI` z?X8NL8PBG*hB@qiJ!TKf(CCGCOK>Z6GBji|oN9Qw)R=@qPbfI=p`4C?4zdTgzL*Vg zkmdu*Cr@=~qy>g?-?7sLyLnVnV5EFArs6T{PoY)z2{R-LR7Od{{Va3X@U*OMLYPk^~6b!bBzPE?0+aX$sc9V z6x)QkJ|r!Z?nXwY{{UzROnFxx%c?%lz9xk5o@S5?W6h?zJ;fbThcOk-JC@c*={A(+ z>H$`DJ@z?&hJ%4V>^=1oUBO>NCzXpXdy(8}HEwF1`7sC34{dE*o1A6xhqe!Kq;OH7OQ5xccWp?JG&N zLUK7zb^D@61VK_j_RnnyTita_W=Y&A_Xj!+3x-Z@HWwN9IsJ9CSJSxSv;O+A7Ty&Z z3$mE0ua5x#06NG0uT2=F+|Hx1&(}$Cux~Vca!0Ov9ZX8cj{)IdPWaF|G29{#KB~&1 z-PI0?zAF%Mk@C|OCBl}j5-MGly_tLJq^7QrW5QNB`5hgjx>ha$QUS-WZD)KUu#K`F z6Z_J}$IDR}2j+Y0N>cEX%E(50=NQu5cXvL(oa45)rFBUqy@$7^m#~Co)}C$g%ArJf zV17U@jWq=3AtbHHADPlUp6ODg0DI>h+e|Hg_;|m{q+-YUasL1lr52vZ!31Sxa+AS~ zaS8zbV7g4d%~x3yMw2MO?A&pt`HJ7fGbF5$9kX*o#2N`u)%x&HvaMQJW?O9IOD?u4Gl z-}>v?+p@~6ty7YJl(q=f?kcDrQYBRxOvXVjK4$~>(CUd|qmPTavmV}D9BAFnz0sKi zqmOV-bEMjc8hVd6kQ3}Q;A~P$o3!Ccj=9u>6o>LBIM&$iH4OY*`upcYYN_Fbe-5Cq z9-~-O%yGp*>~o(@UkVN|m}#yuu1t&hXTSB)1Gr>hs@`=2(>hy?bWIUIU=Yg%pjWpe8$a(y)ez*W=qLFJ|u4m_k2 z=yB<+BeTlK1Cb-9rcWqtt#OL0Un3n z_S2JCayb~LZ;1&fwmzDJ zRSXCS1$};cCcGXHIx-T|!k}XqC)*vhiC!Za?V=Ta8Xs};&$fmd}hh- zpU>&2+7#e<%V!^^wfSpp3UvwKHs*zW-Hl-hq9%x zzaGVVXV=$WyLZM9(;CtphjM#o=d8K$?tKToqOi6XKh4-@woiR~$y9&_K8IS>nEQqq z_Vw3=@G*~1W9zEE%Eni(DbI*J-_u?hm=TZh*0y38lHQ(}I>5R1Q;i1+tsbgc))m2S zYs^Qef3t zIhYu!y*v8$*17s|QBd9_bZl1`0A%AyAbPD$nX0KUNI<}2^v1pvZo>jBom&*0Ex0iY zH7tRBu%|}odP+>8yay}?^8QxjJ?P!+vS~fQRzxZ zfodWsagQk_PwA}V=&in03Km{pATymP>_piQqURO2$bSrgA6~;=HNLPP#JKf1Z}@8e z0J!u*cu9IfrG8le>2|NDRTK@DqLq)i#)g~OH-0jz2BVZW60P62ro4J7km6P(kK0$q z-szo+;KbED@l1P#?T_o zj+%V=$y4ZZHFO@BR3xQiz+B+5U13$z8dz7vm8316_+Hu)(b%Kkl~O}X5$!QzeX*$# z(H`ClDb9Zvrk-jxRXh)aGll;EQ?S%wwqQr{)vF)wk)h+1!0?l#wv|l3>Ojs8puMrA z@~6M2Y--GpYtuIrdz45VckSt^17%wP<@c;Fj`$sk{In*OZ=-6ZYb=FJV1t=8b-D33K-cZhLus5(5iZA+KX@3MFeQF z_ED8mgUhQgZCLG<5GzO^J-Z%bzxC0fXRt3e3nAb;gc%yf`K;j(X5_!KE_XX;4;{Q@ zU-m)zeRSJ!-{8d2M`%z~XC#6N(%ozEA!s9IT;O>$HK;F=N=Z`7k8$gyI-G4iwgn^f zoj{qS3sbj8zFIi|?fD=3bjfYJ3)E$n(L7O(-^2iC^2T(JYuoopbK=HAkDqch-9tlq zq=-XKlK5lXjA>?(46WC@6(wqMijFYH*UP1Ox^+qeGRBC^bDU}32&o5){bh{;%nt24&;Z@IKyl^z#Q)8xy{4X?TKC9?; z4d7dBsfZ?&XYvR2(YG8RaNL(B*_9F@aZk&!$pbnQSF`*xmV}&qm%gm(ea&q#go#Sa z-^jbV76ZUm6i6+q)Ha5_o|750!L%l9T#pi&EamNh(|vp&#$=} zfRLupRcX9>Vr#APL~|MiIUGlC>8@ekoh0~rhmVy&1&{GS{{S6!#^~NQs+bDJQ|+Ez zhNvE(?pi131tmMXA68M3r$*uqQrrOHa?SH)(^=$rB&sbk`!jd_w69lg@cA)ZZ)5Y;Ya1EjkBsyvrkhRC<7l|8@yIU zYMw{1%F@73o5jZ7=ZP zd^JQV-@b9*Iw?zZ+|)co6b@0qAgJV|Xw*hZ_<~OqCPu(G2O#L00pS62hbck4X3V8nyQ3!?f4ayIo?#lZez0U*Afb?!g5W#c5!-s3XuY(cWwx`=7m0O&2=5oF82d1x* zsNgM01oL1ykn-*S0I8jOB^4%Yc19GXOL zu61?jggU~~F`mQe>FJ^|(xQM`ag*Gs*0;6K8mr+5Zuv&f>5Y33c+NWzJw~p*Rh;mr ztnez8Ddzc&da?k#gB<5kRkG)gzhE(~@gZNvha~pTrllaDrNu5lCnLVTc8!>Lga!8` zWNXA#7(8?Bt^WXaiskTJn8EezbE;K^E{49s@ zy6_PJlm@?|SN-81$J9MNED6~f8h;hr>B}I0j(}Bke(|g1`<@2fX%S+@*#@mF}FrL3cTN#ew)z8CsA zBH@}J%!RxE0ERUCw=O$%q4;Sj`8XelfI%7&Wul<)7HV2pNtA*Sm(c$JT{1zo zq@Fn)p@J4+1Kr zQgPi+zKYVt4dWjSlP(5)#CJM1X|vQT_;OCnp6q?K3y4rOD!$>cCaI-KR*4mm68*4$ zeI#xjl`Rj2auw*sJNQi|aDKSgO5C=|uZ7}D*&|$kC;**STcf2FlO(TCQ#`Al;a`a# zr@olUZx4#nnxBOWjGTu4x{DV}cVtp= zrIk_@9$b=7?dhl&I?dN-VQs3R5XTwwNgs0BcHn)|mABP8P+2WCO3_Bu5;5#w)4%Jg z)2N*(mKnY>-yoD0%G^6pUI?*1& z+R_311dO5lOxZ2;_0#tY%3i{&nl0;e5gJLk7`X8mTz1x};GXJ(!<3XhJ3?r%^pfXUBDm%70<1npo!sVCjN}f4Co~x^URb>PMmFbBp zc@JZ$D{!uwpvfU%Pi&0^D*3Ahw4Npwq<||Nw1*wOxzYybvsr5dg=-9jKNBhR{WMC5 zNhoORYNTk7Y-cA$;-{fBEkQ+Unlx;elaJ#1lcH`F)rC?EMWNg*l+~3O>`Zc>=m)Ni zMNy0TU1eV6{PT?JeeZ2F<)pGC@j4$UOtw$Hw{6RQ;)Z03;Y!sAPj+Mk zsM86sflRd5{p^A62*<)186}2)Bk7@AiaT9<6k&!?KyiVMHtq{u!j{_gR{B&4$0UQt zzt;m*6t^0?m3g3Y5>?9{a(3;#J+-a3*VA6d}^=Xng)kgu_wdXVApo@YId5Q&C%9w2(CDneXMu zZ`T?gkfl1ASLEBtkNGl(s*#2nQM<3#TdCeR3oP`qE>C`5Y<_xOftH#G(%nfkwOm4y zq~z(2DhtImsMTD*h0DK%DZ>xXNFs`G%G&n3eDaASNQ-Cj5D3TRsTEKf2#0`SA2Jt8 zw3UHYLsKh8%EtyVf&2UDb#GJc)b#@0Q8aS7JXbA%bS17lA_NXmi=8~OD6Ooh@uJW9 zypX3$Rabqh9Y+eQa~BK#ZAb)-MeKh)LY9szq<_YiDg#KTMq%uIiPB+YpM=K+ftv5pLhpL(?bS$}sTXc&kdyW2f+hcW30q zd#5tr(?n}F-GO5=8%!?P!j?ghKV4Lo-l+ZYO(M%Yl*bt57C~SAPs>o{>J=TnaLu_Y zCd&l~$C>1NchbyH;U7`Fryap=iUT83$sIOFlyc5LOk+y)@m=7Ru~W!5qoGs%HSKRx ztyM6ab!tG8$_lGz&5xh1m+8%h83~s6Qu04_Q2mCDtZ?KiF9(9GJ1ySh;dm7?s}=Of z_5Qj(ZV^WimU>7J)lYp?;^7Shiz?Q+Kz&PkeNSzDUA|}`h2}Twt)xAc6e~MD4pL@gbg` zS%B`Uu6zA(G&}zQe$og+)Xhgr7(dO!jz{V)p_O-YZy ztb}Di?Vp~ec>BtV9x>ag*srp~h5gQS8n^9hw`=A;JOWZjV4(j1jz8n5a`pCFihR>h zM;vnxD?0(LY=&oL!DM^mW*4{1&her{R~!hvy}Nh$V^x;q-Z!?HKKhbH41Gkz0r>%~ z`?GZJi~8c7T3FjSNTdXQqdHtWF6i-_jm}koFwZxWJbs)#HPeP2qR3dw!7By2ZEE_a z;Z0E0NBOv6N%@j=8tc>>-J*6|G|5Z{l=cMvW7|zueT7L~R~62ucGItlJh>hi!1f?& z4)*CiYrreE{cKku7$#v8rV&S>$7B2Go^eBz#ujfIxJVTn+jLwQnv0K$TR8y~XZ9M0 zPjaoER7tBR033E>+g{TvTI!vAEXtsvS3aLVO-`T@%G@Q1BIJJ(j^qB_EtXD7)gzeD zNC>^6hUF^B@YPiw6ohguD<>j7Jr94^Q8yK`=Mo93s)#~yhNv&d{Q=O)tEwZBgq0;g zI18L-QJ$t+m*gD!`je*@vZ*DEcy{F>trW4w8S67EcL7utADPemG{a?}zEaVAT|5+% zz;ZkAoB06UYH&A=*Q)e>@_No+Q)_tPJ3(IXD2w$vd8CuHR%Tgk}`E*TB2)}h7Ztu z^Q>5Q@`m-+#z1>xA6(%=F+V_5J5@pn1a@~1f~@0{xrIe*?YDNV~- zu1+=ZQ=FY=*n4X(IXE5rd+2~vO29A6UtvZ8I?S#+=U#;5Fn(S1KvIOPLTA)ue6{gG zp5r~eHM5Av&pPnu<@)G=Rd&1zzK33v1Gvc_EbAbnUXh>Q-$nuwyjAXVjBDJVZrb!N zKE>4T$5<$N=o4Q8Z!dTS5|Z1%>o z$M;95)qy7^dSXGCc(GDVCWjQR~i8hcXA_+B_y*tuI6 z<{GHU1Gr)c*0FI6c;*tl{k2R-cbk~Rg-6V2wH4l8LlsYtV~qidvud|(#Vc-}sujnH zGAw7Y#&tRyWHkWEPgXve)p=^WA;6ZZOnMxg=>08yKOn+cbB^7yq`oo@D`b`}In!CD zLZV5$Kz>KlMCola2G2JG)67nlt@ZLp=UGb+UhSgkxM$8>V1Iaf>nqsq%S#>z%4wvb zSfs~`&$cvLDsJEaN9(0}E8H@b>^`SWwz}$Kt06{m!vyD9o(N2B74+OA7!aJ~clqmD z)yfZsbNU@K(^F8^f;c)8_0)Quxe7Np^VsJD{{VZWZXMB;hKvz;wWzYI7s9DPC7>MN0kWCdLpKAH8^5Kjo2Mdddl!wkzDXvhz2s^n;- zR_ZSZVe(FUDbmtz2o(WozysKU-&rp5L~jn7Jo{yimrh0tLMvTmg;U0rI1g-kjUeAD zJ`QIT@;{tlvz(vnqW8VZ^-uvbHzD&Ui2XFUwGh`zR#>HwDD975&|_L*X#(7k@(u!n zOIcRA{{SeFUmmJ4pnHb$UM;SB_u+V?L)}HrS?^7L~kH^Kbh# zp|Ug`#Ubo-g(_;U%+H1%Kz+S5Hd=p#ek{a~kUpBXu3KUv?6Jiff#?QwpLp9vNmBvI z`Fd+xB@PQKnnGKV<7h_-3z9#XutuVYDOxh}Fz4z)(FU}H$m9TDOzJ$U(Ga}UgYAyv zO-nqW)wHz4d9X9zxYGS(Fr#28$INM-rj;c*5rR&9+0+)ZJgy1HZ_`a{f}+#NO48f; z9!fLF_SV>J^O6EXoc%P{6@qMnqX7K-=)Db|p)ejW!}9jjFCCN(CzPi{W^#DT4`JT} zOqTt!@_-UH_R}pDy9wT(^EmX;>wP>>fWTw7Zr++(q#;e9AhzAJIzAc~0OK9IXylt- zMvn~~g}#4H8-jV!0fZ|4nwbSvYd$4lK7G4s4wQs#j1;Igi>GEJ1L!fW^!r=FaKT6! z{PgVziH2k#KV)RQ9A*1>^1Lbb4wi;zFbx z4}V=lY0(Z2PqwS7O0yVf$_HC#MSO)Hx2A{9L^%}VGClF8Dw(`;6voHpjY6r4IFl!_ zKAK}BJQNOYQsnSFIRs>%r)>tQA*9EqKAJsWR;r~)7{)W5DOc35BFP~9v#kxvOSoF= zB~?R_oQ!FDu0?U|56B$qWnD`?M{+%V^dg~L<%#c)O+GPLS)M^E4B^W-@W8Ryda&y}{F@(Wn zF9GB0*lX;P+1G;^1dQPO9et2HV?OxLZCK%2`ISd=l68oFWOpsEiy^@8ua(t6$A8yV z-AbjA0F1T=zoxtd1vn$;^*Zy$VUvN6uC;RHc`v3iKpKY1ysf#;SRY@XroQux;eq_M ztFvXjG27*=)PhMb+ze<)QD#dF=OlV}I>^b9=ssQbsIl*tC+n;k#z^^pT}~B+zr^E$ zduQvfx#KuGj?xf2_b1Q|c#{a&a#bLE9W0}0Qld#GaH-w>vU?3~lHXAi2Axz7p0q8< z$03p!5Fg97w*BE#R6#zUB_5x)s?m;Ug^P$l_8*?KvmiMkSYz8;9w%eRn|I0XH5KBS ze7XAe^wP=7djMV+iOvLA*N(_Q{vW99PQ1o)PH=USD0bojZ+!_l%6P(wFvdr4N7vU{ zC0P%l?W2opN`aWqo6vxDy>{VYmXN7jdYveOQSJdV!EBTP&4|ZvGo2ZxkHJL@GuQ#! zI@)Kq@h?2#RDUiAI?$I(cZu3Y$EYO!+NnJfqc&9ZX=9Vb5so1H_Rft^T=J?%1!0k; zx4u$DxFJptW1J0bUBv)V$s-y1`)ebD)X3*DpoEWcsW4pY6bAdkHX!4<8n0UY z46eZglk7pr8W?YF6-PPP@dw*K@Y0;mMCQA)wq@Kbig`;BWBGe(Gw(?0!7mc=0|cq> zs=l`UGcovO{u7LkH*>8q)m1!XO&p!aVaqyMWhOPmQnN$jaS*qY);yZkYwuY%RI?8FIsidWsD(vU+;w-$UlE zc|nb5QT5Vu{8u01%$dpHZqJ(?gRDbqrN!`1Qqz`JDo(wOivk zjfvuW_tu%}s-RPn&OJ%@)E|wWe$j$X4{UnqPsI=mWQ$1@flVoK=rDW!+Ra*yA(-jW zTOG>+brOGxP&{gPR&L#fv`6E-p-JLDQa@b0N*JEk^)P1JT*svKmk$oUb1 zGMM@U8=A6 zr|-poFGHyODqto+icp`QeMy$>UkP{Wq&>{2Ac8UU z)G7BZBp~>xe_d)9%6gT+fMK*g<4X-vmQKX`XG9z7r)(j+hjh~jOGOJdK1U}?wHx!| zA^3SI3ZFnn{raDEg`g!?HT?7tS!Sz{N>#J^V@_xklHyT&9b472Jc*o-TwssOIyViz z3Wwt&G3-dkWBX}dn%Pi;9N!-x*v6Tx)5l8SN~{+5{X)XF)h629s*LLkcvGLB7w?W#<|8&zkawSv&9K0AU=Nzf{* zx)NhpQy!g2~jGVh#xIG~m?Hx^YPR5!?09s+u{;XxL*K zf!3zb6;pWF)HedgXjr*DikxX`?bFAhPvO)Riv;Dqdb=Lj+{?&;umSq(Rb`Tbu>hK! zy5qikO)DOYV*xzys8q9%StFcp_19DjFGDLO;DXXMe*$%XI89@^=PS5K_5 z*P6OZTQs=^NErbBx^JJSmG##D01>Ea5f{1ej}lMhHCvjQx!so-4wdfWWsuva0wacE zgbhWbYo^?);2Ves3`cS6uI1Ys7T`Ry($z^%$Oc(q$;Z&^Ey?zA>HTAU;qVeb@;Q;? zP*;3ap-2FYMZjz2dQzZt|ex;=HchV?p&Nx9O+b#bnm&P`X2kwuvyU3GT<| zkCvLQ-8r)DYGsPw2x>);w2(<5!9VKyX%6#uz1F)?(fBbyrwB2C2mEwfuO%piuxqb- zny?$hYXmL`9)95ab|+h(r_`${mg{}v2MnxeF`t)ntu?j^s@CvpYuYAu$Y{H3Ma!p? zd=%3|e5i90`EtzMzL@W(hk&c|Q7&5&ouOKrJkG3pcuc{;`uEYzxzg#aw3OHSig@a( zANbM0pfcr8V8Gy?PjBB!)`|H42-TU$?XNw%mSHjO7~Tf~k@iN~j) zIV66V)ZIeDgq{$p3a7i<>fxuOG#3R{k)ue1DL*0@^7i!yx645-7OI$Hdxg-OHZ)K#!G&=t-WOb{FL&JXT1 zA@qa$G2GuaT+>Jgmg|eMjZ1hNbOR8Wl=!8fVXG zNC7kYohMbZRzGY%MVfQja!H(D%$ei7cs{} z6Tn_d;I0Q~#AN67(S4^$b(W;Pvai9Ac~}+6$K|Wvb#!g2LPe?i-}Tew+ozQFN*QY^ zjYOPB@ce~&{)b966jD$~7N(uzE;)pC!NK%846O|ytRgZg$Ilr0ep)k2M^RFYUQW@D zNBDUo_R}uM>5XRPcUVMI=sLR{|UrA0Wd6zspmg+jc8$ zFmqcHRJvw1icb-c{{W;HB!0S!VzxcT^tAPLEisZnKvqANd-@$qpoawEPTLkO^K*ig zq}g=!l+*dz8b&PY3BhK-;tBZ%)Q+Zf<8|9?^zUc0RMUJ^h9nHgSqc7D1Gp#KzOQ|z zHzw1Kt?nuwfZ|$d)>Upl=(y~|-|4B>i^o+jH68^Gjydh5D>Y1%!cP;wpuz3>>o-{5 z0%uL6+M@bjES)XdbrN3Uk*W#BRW#9nSbG%iG5PAS-n;HwrNT=4e04O@yshGiBqXx? z5X+2yS=GtatF7*~(^ElNw@2`zep4+w#G?loD%ipKWMKOp7U&1r&ehc&mmOVNNlhxs zd`M$;kHk-6!H2(m;~&0=NYFPqO{Lr+y%76IrqbKix+>#GQbdd;H8Qixid(ia!yo#d zy6L-j+D5~1NFlaW$1K%Ah|xJ`pUcw#{<==T{f+u@WU8PziTVCo%tTWgYH4%h!Cf=9I;TrsBxy-`MoUI} z75xF!J-uV=+gAvxmId5aYRg5+Tr+tZPC)zNa8K>4 zpKo-|y6uX}i>%cU~OIFs=Z+0u^v`#!^0;n&&s1x*9YLd+4@lH}u(;A7uL?41#@ z+UW%a^K@S>KqxWDYKLR<@&E=w`M#*mm*nJ>(Y$bx_n+D_3OSn9Zh%!>0}Oag&mTOG zT@zdRT?k`O zbz$yqDRo2_s#z&<-HtL&G$vc!1#8Pm0mp_s>~n$i)mOHvw-t2*(+k|jr~o;~5I_gN z;yLZ6n^mfoky;OrsA=Wy?9ZH^a&)5Iyru_QC~oxARGNB9l>r6{_Vv)+#TB~e7lSIm zN_Q+zeCt&EMuL_ZW}~cToVOy`$tOz}TXn(FqNG2^^%-u*Ok+nV97w?lAE}0It4$pC z+SwWzUyBG(Hv|5YANXpwqui0yTs&*CO;&({B4dpHnA2}iESKr+vrAhi6_3ow53kq% z0C}p*Y}qc5)C%~SQYP=`IX|e@#(}kEaLT)_l@_ao5^>w|Aeli@zb!?c(NS(P3TTug z9ENj}KU1ObM-*20=c~WGGNPOazYp!G)i+w%X@gZ&#L)m%9!JA|xYdB6)e$EeXrgXn)`_2H+GSjh`lCLa$oR6W@8?Nz=-7%oT z#_8FbL_wd+MOIMp!XbLxHP@M?w5N!wM<7Dvf$!fK)Ow0LRTUIezjvXUQT}jaIn=GW zzO1$AAg!i^G7K4c1<3m2QSTC2YHHd`ePnel$N?HQe{D__t45*On|Y|gdpt8rP%&UK zM{k~@RPAeLh7~Cu05RAvW21H&>bPl4aZt#`M`a}T)VbuIrY4fMmS{qE`~w7NcNKdD zAW-cKY*hTJX;x-)fU)=e&Vjz(w#QQ=tb9=q;AZ~-yE=24>?!DqQ`1Z0W4kPQAJFL< z`CTw^D38S>@gb83*W@)|ln!kvv@|w{Wspo^Wq$b_fFJPDd!^2fXbm+5&NWZNk>v-s zrakpvO?zq?3)IuRK!A9L^v~z4>Gv(JIK+Z!oy&JJAj15;w7}az!XZ<$>g!!zlIw{* zc&vy1?Hi)9UTqfHJbqDA+p~Y)#VgsAIzloT0)o%_=?>oy#ITjn$vuFiHeqvrB~QZ z%>G~u>d{TTwiZEkywJB87m-$MC?Dw$`*p1KH*DD5;<8&U<~1ByvY`Inr&bQ`0tZkQ zRBfr#>sH_i;#$@z)B@fvRf+!q)cR`J+Z`k}u=N#jQMWh4DzkFY?vWc07)6b}3WzD?T%YOz;9Lyt~AQcufNa&PO6H9$1C3WSNf6c_^^LG$|Pg+1Qs zc~MzcMORr&orWVW#1CwYe)@N_x3WnuAQB$L!{vn)5?fKy2KTR*~ z?yc8cE|EcZx5ZMD$PBIq2p_oZ`s%i;+!nK4B#&q0na76m5LZzo-3A$%=qMqLbLHka z6(63Dq`)wm)=2Klr!N(DUlA@AX~nF+o5@$l#qI38v!Bnlq0PMcQnFTD7CAza9pyky zJ^gje^KLtpOA-PjH?M}cKfa{eF<)3d`n<_WOr7MAdD%y&Wh7_v8W9V4cJ4^PA6-9dV;Bhx9YanjZfnIt)JZ%l zBP>p$i;Y9KH*&{5`m}6+X8x&PDwc*D4CUk?kr)g>`ecFqM!wyjX1=Cv>zJXU+gA$c z{55u(ID-g}y17Ei2>LPn^_0pkt#n$})&i`esh#BvFscqnKAQG<;Kw3i*xzHOBBb#9_5n!X_vnfU}} zW9j+o`mF-4((Ds}s7rm;rh-85%-lz>*G@K#sG*X(_@d=ejeus``6(^-zC z?Y97y*qY)6u6exlhjPfNPGX{{oE{=afJR&D*w6F_N_U=^UTu`<^U;{)=flDg{w6+z z5!)ZOyISuJExL(blHVO#Aob;z$J07etg5hH>5U~tF}KZ}DRl#hKhs3bbDzs_nEf~d z1#zS73z;ly=;~sTk7hA3UjCiH?VxvkwOwVY_)46tgad#MFh)mwYo<4MOD{D3J5lZl znmVi$SXeesw|xHqL5(8RbYFPXJa1h!T%1A2h)-ek$kw1@c)LpvdkUm}0rC+!7Cybb zHRDC$o&>gjy0ULQJ=~T#aF*E|sqZVtl^?IBk#2NVG?fgsJOeS#7tkFUj8(N0CoVKp z6;MAHePpUWTJ$I$y2~G?H5x0FWUm4bT;OCLn++bjO zYt9F-{<_+zKRoEbpqApXP)>fIU2R19pIv&8s{sje@F+O% z>Ffr*@9&S>Spa@t*I594^18jy|2eb@n@FS(F&p zfDg-7sJUQ9GwZJc=eX^ygbjVf9Cz*gHFTw|VF17bUj_8?<6AhB>+P?CV;YpDt$aA2 z%UW>j*{KV5r_A59Pn7X^Z;&(B_v zq+{Rdthk?XuXy9X_-N??cXj4FWO{tH_a8C*^_X1bYupfhwO}B%hzA~;^km@Y-&q0M z173bwx>UX+x8<+B^0^xHYtR5bnkI!y!|jor`gYgehttzpfCr|&z#wYslvv>U=U(}< z?TuyF4^4UHC)e9nqQ|h#z3q&TeSLyGeGa}O10z*vO2-Y3X^VNhWD4jHM#ucS3RGc4}(N(Os(5PwSMouQnw_z zn-!Twx*_7R1q+ef9T=y$#^aK{LH704T@6WQ4m_oPM@J~GY?uYH+e$HBLZLAjD#@d- zMPPg}rps2~rin60$UX3NP{n%(0bjWF&WKap(8+6+Vx>yf5WE8n z>s3veSbhQ+`vd8q*2bwVkt(wm(?m5d3a`XQe=s|1D~C+sJ+$sp^I4`w1${kFeCr7< zwJt)S1L}0u8UATl7}uM z@ej*SG0>z-zGmhSv)6~0l z8_=8|Z4sLr*m zUKrq! zc2*ePH=GP1u6R+>QYlI zDmf8=eU7#}7m*_maUvp8A-TV4zONyHs5X*%?;$sIr`(S8CDUacg%b!!DwJ8zK z5PrHJDdXse1LdbM(o^!GmRJ`hvVF87>2c(xK>W2TzGYCymIv2LS2~$VVaSYnYfN$H zaal{LM6Rkb`AQ5Qk<#^KN4u#0x{*~p=uTXabPlfPBtwo{2Ow)>8hHsWBC@s5H-=9j z27R&Xp|umRa!?NATB@!=&N*ZaM3S*w5uA^1`gmzr$<7zkPDwdE{dE!L?e+TW$)r{! zokw?Eu+B%Xu8Peo0`jwxKt_JQJ!vi2j34`T^FPf009|TkVtspiXo5e1Sr%Xir~R78 z#XNk(=U9+(2k+ll@&EzvqAC@bY~X{FuN>fG*XOSS;AKuub?@UKatA)X+OQN@=eK-% zXI^q(G8ka|wYTBtVUG?0j3UQ#t0c2s#kPuFKBk1U&AX;2+29mZ|XI=qRsFqWebEofgQ7^kcyG; zNgX+MU*cpb{EmUv+p3-0#H=$T90I1t3ye+Msboen594T4c7=Mhci)xc3>; zH9e9_OiJ|(6!*q`bu}m>k&6ijACYeQn@S-1;Uo)8i~%URS)?}%RFvy&V!Q?TmkwY-@`2=IJBT6es$fYvfR}}*`hqOXQR($0Z< zU=n}B8V@r`8yM-w6+Qm|Jxr#dmPmmysqfo8&Xh$Xq1|tqT4{jefXkA&IMhb0xYH3#Rz*&7JVsDEjA#h-MhBwWFE?OAW*}f-RMaMa zhE6~p04M}$d$E-5hLv+$By`9WW=xEH&+DxaLo|@`mk}#^5=IWQ+?LAd)S4J1W1O*4 zPBftcvfVH-;5+zgV z-?zT7N?OQ!h}?xfxz!Sk1ZDhwWB6Im*FCkh3Wx7a#QPDbly&VZig`yFJ7Iy&KRp+M znE^7jVtaYG;Akv&MZ(^()D;eijz`pc>U?c50c30ssnF-Tttlwa%oFN0<6I)BU*Swy zhs^1Ggu#SjBE!nED~$V}O)%LdXk?6Y3`2JVzL1t_Aa4+`Q}WchJ;5i5g+^ZfzK2U7 z6kV-!WrFWOw8_qx7REg1zKOl&ls+Rdk9-r~R7JOR%@QbCNMY}t8>QUq$V&2aW9oCA zAi-+d;;rPr9~cm0CJF4IfhpC6ZfD8+oE z4+hs3$JIL7=P^Mz;qB$p1a~@#Tf#t3<*fc1SzLIL{NHFZ+Npa<{k^3@jFCckQ%agbFvGEN6<4Mv8I z;9nW00ekib{>=rey37FLK_KcYUnGeRPb~WnZAOJe+Bq%7IS1m(ar^2#cZH^xn^ZFV z!SAIyoAW!6xnE)b0H`$rYRP7h0LKG9z5D5bxXMZ8S`>TvpaM6kW&_hbwZ5;ZhMGM5 zNgiIr4Chq)RY;`pVAvhA>#c#RrHmGYpO$^~HU)d!n``=$a;ukskgzAzkNY*Uj_Xra zf>xN0Uq0GVhKgx?!4w@Hw!t)G1P}JR=tv6g%0C?PI`d*-G8A z_hQD0{Gb8bR1ai8DxNC@bqaseteuH~~Ywt7{lwB6%bWb9&*atGz|(At}ARJ+=Cpt;l;E&e1Dk}_SN41Ivo z;@PG6L2-i1H--n7%h+eh}mtVRN-U z&Ar`~OtQtStoPb7*cbS@7U_x+qODGOtU1i7>M`oN6_fQO=gBf zrb}-;p7IldKP?|sQI3XEU5jMFExX~8o5O5*r2~om^t-!uy%mu>X)0ruY@ZDpPDk@P zwrcBX=$yw-OzRYb-LgmJq>I(Q3!TG~#!TppHtITh+RK##MI2ajE4T!bI|204t;=(L z*-o~)3Mx6#+Ytzu7RmYNxH@BBiU8Ng+VIixYfU9ol7A5R zkqK};hI{`2O)$wq${n_lcQ;kzw20!j3X1vLuxOMNi}N13Te3v`SGqO7;3S^7l3sBs z3j+MxK8NZ3HPZL%EuM;*q^6>`(MnSUQ&OaCK=c^{zw4?#itTgRmwTeeOlcOrR+VLt zfE=IY7#~jm09^=ugG$^3XcS9t*e?5Gil*Cgtc4Ic@Z*D!E~C(#06%RGvd;xYWc5{a z1d%rcnPf+k*S8gKQZ*BB^)8mC)hanwTJcX)Ou5K+FW4ToWj(s~5`|7c> zbe@*u2akQYN8%L*K`e)yL+U}t=ylL^Td#N2TE(s^sP5449J?$*K^~rjH|?O7o}WcE zbhXuY8v1s3GD}24vPdzE00304IX2mSUsd zjEb53hkZ|^+m{PH#*&urLsvmnP=AKfjPm~gRQsKEp1|MxW_x5b7wx@d6||_U1xG(I zVm)$we?h5NJKo5;O(45avNbcSIgFkXG4vzUk@Wy+J!cFMowOXjqTYT24`zo*TDrJqBLJ7&`#$LdBWT+pWx*KpoZ@Ag& z?Q0xMM_7#vaV=5uDILy64t|-}KGOY?HyvfpzV{`0}=mr`vjXWkUsaq!?hO(k2$$J`!$vJblCjWzVLl6y^m-W?~FnPQ$F z3RRXs;$JpFUrc_-Lbh)}c8#v(Ra<$oTW>a+#0tJVK+6M+LKUIyD;(EMv5@!(Tavr!#%PG?Vxj;kkn0UhEcuKxuJr!(|F%#Ai2XCaRl>t zBLltw^v~4k7jWG6M^pClwUATP8hK09@T|(Rj>HfEE&38QY*TbccXei;k5M<2lvMIZ z$AzXeKv(;rr4lv|*T2Z?D=*luXzl7r=`1%YNhTEtAJtO&Y9I$1BFMp!6Vi814Nv)B7sfd8)C&M^NFapo}cCF~c$W_U)w2 zpJ=`88r9nSq7ikcbtaBjXu>oqvcE+D}&rvqL4bp2Jd(A;OJfrbSj%)AO>paqR z4in*wFl7|BZA-AI_=>vpBp%6*zO)N+c5=1)+6 zZrVb;^-i;=cUbA}Hp+=8DjSMOgOdVJ*Vp`iJtSG-I@&o$sCJdZY|gSr7@ZCQe|So{Fuq4*XxF?OU7$3x^;@ROpjsVEieWH8|#T89l#a>83rtu+vmi*Q^n7iw;yDQ~v-RYoG-r za-Zof)D)5vJ_ol%Lh!7ex!{Ea=KO3?{nO46N-CPB}PUQk?q^*+d(ciYX1Nce(;Ti zgnD3~U$4(sjiX`KCBNgKg?vDHei5I@4QF|^3c5s!uAKOQ97xIEKeh&}NT{>Aq%8Id zsazOiDum$jZ9Q$P2)5LUmX0!@Wx0;W^3k|0^mf{a{7IHiE)NnJf%@uwa!pZ89wp@f z7(QG#Z?2(#qOjjoZEjTzp(TbISV$Zh268ni?R2%V2B)YY$iZfRDg88uQ9*W`Le%Rl z(2p(-aHITmM{m&X80KbG1yKES`)Eoo6D`kY-D9;*ZPOFYbBNdz{{VKX+P$TDj#iRV z@Re@nOk|x~DZA2$no78&X>dCbSNiE|a^B~tsAho46*ye8%iVt=qGhGNyQ;$VW4Ojx z%Oh0h@e_{c^CwA_)iYXNRjsU=0C9-R7UVy}`svQQeeH@G_KLRVDi}6d0aQi(eSfBw z>aKeidEI^lNen(Q!pS7T!9L()xcv2{q0Q`&>Ns2MQ&-f%6;-C5uA|2Ef&@H}{{W?) zz<#>hxl?;rP)SB?byVOV^RmjMKhGRV{{V)WKH#|R+c}`I+#_(q%3waA{{W;;k?uRK zw#`AaS6oCD010Pl8=q`^@qzkjjc(^*DbCx7(NFNWhnG^hQ77sJ5P|QKfl5c}Fs{Hy$I8*@RJLs)Ojl3WO&q0w&J!&Xlm)6~o-C&ZRq6CnLD+efG@mMNx7vn4p0!3iBg zkcGcIkAJSVEE_7O-|_WU`dX@#?u*1bAJI>5-#{z(=G2LWs^L!aq$lw5@WekXchuNj z?w}7&w`<$lY=r&M9Wp5O60aQn4yya_RjMM*jeWe6fuv^$&hrZ&Ixt zwy;4%5W>QelHZxfZ6UJJpxX)`tMX#n@mG%lljS39d* zYA2`)e-APV{dKP2F59J%s%xOBs#We2mle;pef5o9%HMjOp`oRqwU!)wX%{L7^&|5g z^ybC}N&@WQAa`y3UoeuIib{weW8EaEX$yT%ES&zj82iU@RntX4CSMLVCmctdA7;;E zreQ_X%U!z_cN)8u&y#qPK~2IOW3sP{-`DxDKP?HHa?#U4BHHPpgtGqv1n-A#?EbEnmLDVak)}IQLkpK zN#ss2vM}sVEay|MvCx`0zwwI8T7MEMlf->n7$--x0BKd50l@>Psg|honDT!4W9r{i ztxBM0wtro0k|L*$Mn=2}PL^74D?lJ{v!|27Ze9>$?VRhxMrjCU;#m3(eTVeUzR3qY z@;&uos;|)+ptw(CluXM6tNsbV9+()8UNINd&bT-fXNbilaQw>a8+F2@4_=mVy6OYSR6=&Lx z{{Xu!_WA2664qn#$uN>f@fSX=3`)Z%zo{QgYlc| zVo|a4Uqkxo57R>_w>K)PScOJ#yH|JCZEeA~;HvnDZL(P-!$-ilP*yRPF+Q6geE6h#_+J8ctx-|bYm`)R0wPKz6LKEeJ0;JVkq{F0_XeLYUHj^Q*7$_Fu)?nu#eT4Xw3~zX-mM9n$iKIM7>87>npu0x#ZW?rz8zUUp5HaWo2mCZlhA?a-y^?{HM!SCQ zOI7k(YX;${5Xh?{^L}F^*Z%-eXvL?i`}R7aEk%5D7(o&TCMEgf0B0xm(lw)U?JGs$ zE`M{)TCg5)#AGq?VeVLZjQe9>Q*L_e&C%zUT1bscWX4b^@AUwm-%Z%d$UsAYwS4UT z)m79Rqgpo|gZ!SV78q%UId=Rw`3#==1=Q}AZ3{)>md|FQawlGB-10IztzxIfol zp&QSoTVhz&OEr0kPBG!W4sq&F&s1kqzRYz?O)loMUJE>foRH2-u|DUJ1K0A@k5?45 zI4btZAHTxpbsdg-jbx~OK<%QpO|x{fxk|cbTpVYQuAwR{e~1<*+tXVEJymr9;cHbT zaDBd7+!MBNHShz}41D#r5XZhTpQetG7cWo%2*CO4U;yW^`Fd+15|+XF>t}`Uja?;| zQpPk22korSwg5f;TKF%|*IB4I81J1}!V-N~fDC?G%qclN^RH1ehW`MDw<2f02|ryH z+CW|CwQvXP`D-pX&upLY)P;w(PnR0>#t-e>XI2p9Mk(u)*lWT7$<9B->v2_FjN?9^ zEn)^U?g#F5Z2?hn?zM3serH~l?0bDRv9sMy4t0oApIm91Rb8wAARgWQwfAs4YiAt( z`o|n`+djIATKkWo@2?2R?UAjDq;|*a^4GjDc^_ZPQBu~U=i6T3cgA(F4}5m|Yb<=v zricYCX$gU^c>e%RY{$9nkL$0vl07r4qNtUJ40?~(UaAaa909EOXZ&^PQa!XmrA^CO zLHZAn*W3mNVfyQ5AD_RbzTt!Es}>a!u;ZTJEqTYw>D=pTsTdg7+bpDe84< ztzr*jkLj;5+gWixr@p=`*x={eRG}*#J-xkq>(ZTpCtmQzzBwc3-`7zISd?Df{{XM1 zzEGg&2U`jQjCTDs=MuO$_0%C%tW*?i4&z(ks*)l&oMYQs!soyB&Nc562<$at?E|Rt zi^Fo|=4=kxBU7NRR$nxvX?aLJ&O2**$iU~eKAJFV3p3*#lRYiT6^gTDe97;lG`EUy zzIOoqG>9c9(2rxSzY^*O82A2~ge2@Bs}7d-1K}s`PoO!|*4Nxo84*m5JB;LKR9!v6 z(TlM!Yc4MnU*b zZ1&c2(lDGJ3NF&982~UJEk>SH2wMb?k@nOhT@hf)#An-Ds%x;MWpyc8cdFWJVh%xG zIM$h+CeLN>-@b)QEUw3oeCu>n^(}@ci20M>O{z=XYfW4Vz@`+BZ3C*cwsI7lp5SSX z#DL|<$J1D{t~{UNr!~}+_F7YGORyyg81^H+fmcy1M22Dr?T<|A!tnn9mD83_ZrT@l zw8c>#auj=#H0DY#DK3thtC^*e79tsWYd9;a`1Z*s+eEAFl(g-hN?XulP!8WXV;gY2BBjuqI%CIX+WL`M*&NK>b$hk422FGk_gE#W5 zJvvLcQZvNA9^RSM+I!e|fLU>$uB+O1YL_$A$hh_HbE2?RQ$`3zWAZ2d8jppl#I77C zNUn|?=0ZoNrLB2?GhmGAPL@e!9#_E5ajEcgfbwSkx>KV87?RFY0g;$w9w2(?HQwMN z7)Htb_2kzOv7h4i^z3x0cDT8A0grE%t|-YiP`&+@n)}4Ok1?Of=ml-X&wK#6){6Uq z<(BSA?n%%}+nN9X&wX!WEoXbMx7OE!z5TP;=oMXDWl7`@{52Z7xtlx=GxgA!s)_B$ za`n^N+6y6e;-t$mK3ldvT8!+B4ge$MMx(sli0|pFIS)hY_0u>Ac6Tc|B_kjcpM7X7 zPoVBQdh5wBxykHxshJniwJOp4mhN~Qau3hGyyQT~_12#i6cR8_v1!IfU_sH0aH8BK zC(E2K@2?9EBjz<8Nq{}E`W<27oB};Qz4b**t;S#UvyVfpROJ3IuWf1P<-j28B#}da zRFHqJsai2>uC1q)UJ@l==8cIee=sy_?}(3SY_vxsxLC=-{d?$DzJxtEnwnqYXAGgS z+v}ZA7UF!9Rw6ST00=n$0Mz;FkYK44o38C?>$0~D=9=ql z6jDl{G?6oLSP`5A@I)MA8ldvZ{7I z+@qCcj_U11>CCdePvi*BG&*Vas$!nmM(lZU4I$;rNR;uNEgaqd0G(74KU3+iswKKKW@xSL126q5j{g8(O-rs(hMwr1%6jyHB#spe zkDn}Qa<=C$BP@igC_U6*Xmv%-(hUcUW_cIH;qC#(bt;~^aVd!raK58D z4b&5MCrZk%C|Ige9QuQ$`kVE}f}x7V;;6t32e!QCm2{0H?9rc?1-lPnq4K;YRacRU zk4EmN^%@dwTL4pM+cZ+=~xjBIuO z7->g20P_HHGo-ybJ3Z2*RdG`@MKCxgw`?EJQ(>-F@^~kK^&>?df}Rn|zL~O5Vc6?Q zx7r-1hK2?w)mZ-khL%mOEv{CH)(FvLkGOn#`sYzT_I`Nw9kZNjMb6n?m=Q!O5q%1r z9R!k&sb>M{UNt@PaiyPva{w!QUe)GM>%ocj9;aHX@2LgotcY8YD5}7JcwjDxN44jUoKG0>6B%qUC-%_a0pVP< zN;u-Oh!9ii^*WX+PAVE z`sz&E+5tw5D}ZG5P#xpq2kauY!U2nr25XDPYkRcFc9|c4vy_h zy`I{>Ev{OGE;7ssC%@;XdM({aDj1}innrPkGOin0oLtn<0p(NlJv**Pl4^P}Ga$)d zOnr3EN7JOb6{KnTKLE|)Ll>ZTWUMZVBd5=q;D|&$R~+tMnJu!OF$z?>XUyD4 zQZwzI`dO1`RKT3fZjtA)!J}+Bq&5~tbZ(N?{VzUfUR)_F$jmZA3`(|J2a=V#C!W= zPuvd)C|w|yA|qIG0Q4GYw_6^rJcyVQGmT+IXr3H56W{k5cd}E*963G77$?_2;yF{~ zgj+18nfbb4;|Bvq)`Fk22*z|z;6$UgF^ua=(mZF}1wX!!N-^r9%M39nDS&@HMUtg~ zVaR@2)Y^y`E`DP|s$rD3E`O-d)s-!6dej|>#t*im$z2?oP)0SPSV}3w4Mxb1xb9E4 zu8Ni37K*T3o*D1%G#+frs+mQUUsCwLK&SKZpUsIZSHA|_Ti$o0X{l}ch$LmChec0Z=RUMtyg>x1&vqVM74W52I`Mw7(~&&vRJ z_c|Ix3N0OKfCff&AuCozATpAELrZNr;Bcqc<*y^F2_{J@Gu)3{XlXDxAMuZI$Ya+Y zy5C7$V_-nT1M|>7kB^Y^6Wbm2u+-zs8$Z6PsU4>XZ)+kC5QFWals8y}VN96Lt9dSP zELl?7C;59G`jci-@OSKkiN{Iji3O$I>8k@~@jmf5A zkIz`gd8jh-j<1OWxF;H+g?PNJ7i&atPUaxs1MTUcuj5lo%sBx2=S+1sQ&f!~75QWn zp%no^DJuGUcGSwDT&&W%d1Elsx1ZSL>V1;Ubgh?-bj-`@0Xfjh6B0k+1m_@)7>@5* zMy5zhC{y|!4Wgv!Y@v$Ys=01J=eJ-q!ANNhLOk*r53idVt|<34eC(!G9goYtiN|!2 znO>tUk4$@NU8`4q-;yT*DP!UfV!?FVPh*LdWt8(LC%EsbyJclUt4Z=k8c0K(@h1OBUYJ60Tx$X&G+12ZD zjSM8DF&;~vM;fYkRUeBKu}H|c$vyk&@xIn~f)aIfv=c;SsIE{?lm#8Y(5fA&4Dx(k zC36)&iI{{%$Z5E+?}9-iwww*{lu$mP)gQU!+JAjQkxe4W zAxQ$c$Dky81K%G_B3rt7Mp`yBl~pVbBbf$WnG%L zZb2EfId1=G*i?>*-#|z59_8I7RuiArkY*FOH4&r9oq*w zv~D+B^_}raO*@|t2&G7JK>F&Z-!{IWZ^;sts>bDFA=UD{{{XLie@$Br_fgmsQeOPF zTWSHGj+gijgNY=JpQby0x)rhMuF=r7A+;oQ59AFXSAX@1Cq-wyh$o9`-Ki&%XpaK2 zMTJrG&W#E>UA<0f?HB53d3TaF%P9W)e04<^jcSMqWOgcqfPIIz>y1F)-D4Kp z6K#r1gwiLf#Qa-``DJi4VWs>kIKf2sA5sI?#P=wsHrXTQVw-}zZ;s4`MsfP%x2BLN zC9!Ue&rtREb}@n;CYlmXbNE8`$piA$U0Yn&3b&iX3JJ*iYGt~hr17_eT2*jEaz2`V z(9uB=ZWlvYWrDiBDW|&Bs=xQa`fwcy+s3jEmSnm$1W7$1K4-%%l6fw(~E0uDy4#~%N0X+MB?RGpJJFN zJ@fL`d0BZ1G}1S+cRu#2yunFJW$@vpQlAr8kNiQO!l0q-K4rCa)L1t)%7lH{T*5iz z25}w&s$;lN!N1|_pjJvq@#3XSlg$zSCkV*^`s1+2zKYwg`>x%0@TY{qYK!=sAU#lkRkLg%3<)5XDu6KAP!2%= z6O7{?y6H=2SL_?Y)kRWkB%o^7RE26CRz{QM$2kY+d+UnZ?Ge-JJ7U;qsB7d7xfNoU zgFwyrmw{le2ep4JyoOLlt9wm2k}523jzwT_8^Yh=IfVOcLwLC zjvL%DR21zTo+GP;_5_39_0~H(bjxLuaq%7xj7x_Awh!07r?PDy6+=)-_%5-vZcEPB z3nbAnhM~BJBO^bbu+tXY-$DzE)!bzqkKiafcli&Vxtf!!HwR^xYQ$T_Pqy zz>vB1)l;*2mj%kz8r&!NQmD8@0m<$28f3U{OGUbfO(kkDzyNari9b)DePuB?8d^kv zjFbbYKWF{3x$boLDm3sarozn}FU2H1&mwSeeKkYxO{M*Y+@EpM%OkQPyQ_ELPquzq z>59F{L1>mE_lcgM;m3yDln?l6FRK#l``wbV_c4k)+_8vhNbfAt4&VX#XD9ycJ|{e3 z+$6}>oPv|~bpfcOYPdqQ=sgL>o9sJjnOd{qO3E80c;`Q^l{$Y-T}Kg?ynq;vC{76c z^A3jGP)4r>1 z>DFp1PsIvKdFmvY2#Nec2+yIxTmUrYLg!&5$^ySHTZX1+%+%&7>DRoB@#H7w+N*bm zT(%t)64)!9CT2np1PC+k0~YO%%O4}INZs3;s294aYN;yjGbKR~a)sL-Z{--qeKlV- zzVG8a71OjCe7Gt}E$DCusr_}Wnov1OGKcW4d;4s=)y{j3HAOu#xGMtSGL!x3Ik{u` z571*umiqau6|!7Sv8y4EvdJhhqo11NzxC3!Hrs}3R+%q32y*bWPOL}mkLq;!Y=*9q z$M-|dw5cjIs}!=B7^w9Fk@vbo_l?7y@Gv=z@t)eREW9u8zfD$|UAFD(B6 zhJv-H1^F1jd5OJNtb!uTN!N>rqc?w@DQ}UP7Ww_!8vy3-e>BR}HCi zuw0Fv?r5Rl;y2*jfj#@=b|=?8@IR)Bkqf{>VE0Wn$S$u8RSC8zs_G++nZJ)3vt!&U z4{xq@9*WyZzzGYLzT~5Gn|ch$^pP# zcP{Yz8#PwhF;W_8Icd~1D@{tLks16>eAxYU$vcy#`;xo9}ZcGg(!jA&_I z<)p4VYt>Radh2fxM`8O7dBX!EQk30GSWtW88uWqkI@!ZGCs}xT@AA|QRk>>k^w*(R z<*dYReY;K#!fqHFr2#$00lw%zHIQ@+qb^53+?Ik#-_lBa@49< z(^&w1c-F%h>@%-I_Vm@3TB20C3i)V=k{O*G9D*AMI%?a!NWX3Q15;fp_y^^{IN|Hx zu^LMrfc6^Ad6AEni)D%_4`?f>c1K+;HNieTC5fU>JIvg>{J{4bH@o_ac&wY@XfG74 zPvGV_2=qd^txyeF1NU?&;+v%&W>cA%} zO2RY1{{T&9u_*WNt)?(A*dI@xzE#4U_5-=qhO6OW;g$6sy2O**0o&VKxesq#YYZIV zW54~nCWNwR;YMr_N{oEvf%4Wx zK=0|DOSN{r>;_2m*MKR>J)9-6cp)MZZJhrYAnk?rY@ z`rcvAJ^n*qaO_E6`$n#i7X_mXJsZ$>*2Htgv)uf(pND~!ANOnSI3)i7O-e%I7r>8S zPtRNFWf8FMNctUUP{bVTbRcAR_4U-Glge+f?kTOMJ{q9De-e;RHEHe5+|yI3sA&}B zW4B@ZXHfmD} zc>s284SH&brYcD|J+!^V;Wupsu`Nw863;Ic&!>HC@FET2k~?-Cy>-5y;vIc`J$0sf zRt@4ji~;rb)Ut-DK&p{fJQp9B?sWoql1TYW9#`eBt~L0mFvj^GLEAxYH%TBL=LRv~ zCt6t2R(HKcy4q-)EL0GCgYwe7#Zs9_T#?_n(XYNCn=!nZ&%et-u9QNpM}s+I`i*U6 zgXUP|AdD*d`*f);V2dig{^b2N8r=iP<154;Qgq`M&{mMjP&R#!eCkK`VbOpH6e#xf z){^#uvw>V7^wgzC^D!SWt+KRKgFi9fzJOOdi3<3SpKq3q{53NMo{~LM`5b8G<&82614}#K_6ro4dP@2`)Eux7fSZ{c9S4vBmNQl z>l!P(D<8tv$tQ$Al>iEVLF=P7tM!`RuPk<-6F$VCVfdC(d1LqQ`f5abmeW}0Fo+d~3NBca^cmJt?fX^N2A*jt zWsqeSWFtS<-&OKOxSSj*m6F)0p8!+WD~tw>2n+h>Ln~_RsO62bGbqZk$%S1Kvu#Qg zkBv|g%A|%F&lB|0_TaTqQ8|*HL98O8eDh@Dy zr%SWVrtAQwm?E^}>Rw6DJ zB*(-YeFnGE(Mu#krU@qFC*W2bNFO3J1fkqPOLs~;qSOka$mP9AP*i9&ead-aYIzfb z4#A@xzfq^@Z1oe2$K;uZ`L!L6maewCs!64Wc*h_+_U(-c;|c6OsYVGZqjAN^3;o{Y z=#Yk5jx$qXSd2Fz-06~oZCk4-{Pl|z7b2euBEPMDQ5ANNY5_A^wQ0Q(D3AH z(_^TrjEc#rQ3s*th9~mYbyQaRBGF8-NW|kKzH}-oTf8+U6_Lw&l*eKEoiWi_ZZ+W~ zWmL~%KVlkgjFQzl77g~ykVU%3^GLL;1lWq!SX(`!d;&K7) zjSreC>PbwJ!5SBNMgag~#MJlDY;~qwTa0mnq zK&+C8kMdPz^vEYw&nfM-0$HTuPbVaLoni6yD2Ifdy$_dJo+l-I->!8IXxq8sM|~`e zBN<;B`q06acNjSsZDRK-i5rv3#gAfgd+ST!cVX|}QRFOf#CFb>a*l!|mzw0l`0d1h zAw9qE(?x@Ht0KWr5HF!66nFgbogr|Sl8`mF4~tx`dmpZraF1@~bJ1<9?fjYiSYf6k zF|Z(pAEt`i_O)dwd1avS5l;^oL`s(VclXshX{x+YymHdi)JDq1fsL4c*w;ez=cu;p zov_UY@9XcSypR#J0BY72i#1&^GED(cN2;bfXypwm%__nZ zCmo-Nz|s1(u}ey6Y}W}Sk>dpfu(V*0UvM*|I;sub6<}IRk&K4G7z%xTj z!n0Ccs3yx)D#iYZILFUTHm$`KB*&d>l9f31z}0_8PrjmnMJSqOZ~4RX`sYr2b7EfZ z2^`lL-4yp{D~{js)@OmslUhkuHM;E`WFl0Ni0np+!69-Pq>)Z@`Rm=YwW(o^7ts&^ zJ+$NZMI$1%1AuUNuWaihoB>W~G?c#bt%;0FG2%V(sCBmq|DnSl}rRIcL+;{54H*B|_2yL#?JWl4QdVag7c;eirjas59-29;l6DZwZyN z^8>KfwWn1WS3SG;(?_B~7ME%)W->sGH*ZiiF4t(0P8g_PT^K{`$XH|0YE>j^%nG5$ zq4{cBl}k_E=!!U=B#!4;Pe7g-@5tl7Z4jxip@|9yA=C`^?WG#s?N3K6ijSW7z&aeO z;cu;{lp$^zP(99pRYv*pl=bc3vDOtE+Mc73afKlE&|0gVB|~N;X#Tm;?WIc{;Q1nCE29;EjK>oj$rBT5c87=e9yniobQZe7S z)+;DhEJhAHVD{9tcBY_-#~hFczBQRzbp!aJyLQxHi9$HLdV3FjV)CyQWpXkwbL*i{ zt>#FTM>faMYBfx;vY64Ex37I+B~(a<2PYo6)EVknpG@Z-gH)v~-OA^daga5u`La$h zd!MGGNmfUfCqG?inz2SXu^&GAy0l%?@a(=~ox%C*O!ZTh?7Xq*-_ub(DHwT4$v-_{ zCzKBl+<#qFBEIY6Q7B>M#!hjb+LupJBQWFJC%z7b%uINsIdOo}4`JV1Wgb5iYGxQ6h|xPunxwFHfv`q-H@1W$3J7&YCP=)X_wA^Y#U)JK zqgD&swvBz<^_6c5NH7n4XsFv2bcyDtBhk5flc;hPrEj{PoQ6HQdJg)K4PA|Ot3t-!97G?GCr;aX;Z;E@$IX-0cy zdrP?$oeM9gxIVgSpsjhMT9~0M2=vZ$E*FJh(NFSUd`VN#HZaFJ`L1v@OqE=pnC;(H zon`*68RQZ`%7?cx>~$*LxSF|zJg?Xc0zHP8(=}@MrYhS=t&_;JWAgHk+dys`0xINb zYO13d^iX{@uH}2KwIj0Bv4G>$oM}$4sKM$@6arZTc6J%SI%68{$!>5ZPN~^aQy&S0 zF99PCJDmKqIvq|GMQ%HxuhFBi@Zl|iEmC{OzrC%tfHb42IyL*d_@3@hpP`Dz%96yX;$=|h8PE!@l+sH`)b(=yH6}?p0L8waENRiW4p2Fy@VOUrSZ@2G_AXM~ zjD8*j(J2d%2f5Ow=DpiC-E?q6$)cwqk^v#TGwbX6>!_|>AEL5DRa-S$Rfbc=*oMb$ z!|SR>`O}Mi!l*q`wDaYP#>WGs)UK1tGwWRbzPTjcrXdv=-r05>7a<$l%NK zz#2lTN}H8SPvJ>|0X|dPT_)QC-(#nOqMv7%G7c@^p^@WUWVs|`8uxw~wNO1%Dee~p{@%J}w{-I1 zM^pvLB!DR7%D;$ypPsL7l5H)oNi|Kvgw@2JD2(8+3c!4uzigi1d+N%%^!etaXQZ}H zYN|+KG=LU#2RujjbB|xHmg&GWnY6erciO*w+-{Wi+FIsp5gGI-GEDOq=6xIaa!=v*?BtJ9bKBTxd>s~Q3*I53qn-s~X;!AI;u%lW zjAPjL8gpczpaoGBTR(nWY2&+7Z3ym9x8#IIF+38;Xm7ZW2ph%0fsu>;NPDe?2v_S;}j0s2Qnh>Tv~R^;FQ)l8UZ4kINrD zO{THhAcx}Xt_j^qRds$@`C)KBuB~eRp1d_wcMAQ(L0Y5Ls_VGOgBj(AJWuFet#jB^86k;`rRg@3*eZINYfbGFpHJ<7MP*~-OM<1BEhl^+FlkKTg^cS7OSSjo_wWytd#8G#^J%P&}**@9Rg$GYJM@;pFyw4wq6c1C#cm1`ZU7)nrV?{wJuWKS}o++$ia*p{9r9N`;Z?19)u599Sk# zFP<_6eSLKG4??M_VyQKks7a$tO)oA`tK&RDT$BAYE}4z)gQViBHJ%tF96{uMdf1l` zNaUk9)#tamCvUpNOG?{5rU_*}TI!jc!zcqhh7X}0ormkG+l!%A$l#h3x3wcKSybMC!FjTkmz0j3lM1WjXDJJ+#?Pe7ap(zBX80NJH;)4SCrt~;y}!15^Ma^sM1?)N(K z-z4?23cA^h#gvBR*zb?uwvg&PCI=qr@><(ULXAXG3NMIB?6~>k-%>5ND`buEjdC(h zPoQ7$)iZdzO=_N?NF_3`;TbG&z5Q{g3k8biEpc6GWHQMp4TF)${ZIXxr!WC%gqEzC zDyD`|G+<@dGLJmHDoz9fE zWp3YE$!2<4+0lH{Osbr_df<|O!&VKpvfpf>dOJ0&RMej@iVhTK-#FD*)logVGjYC@ zj#pBtPaN5IKH1YFZIlmn3rm+&Tdle%YUFBKH{~cWz$6?&^lv(xpKJrFFLYiuRCk(+ zN{V^ogad{ofN}1?=O5QjgLK}^^>nVawRFD-{!DRJli2}Y<0Iw$HA?S2pTDndReY0X zRNE+{Va=pwBm!_S8w8JkL+*9bhA`8WjqcsTAxXTpjjE^r021BmP`Tt|Yz0$~MLd0f zf6rJg4YI!Yx5?{hLqz0FPgHO_j?6$f&#%w&(vaz`OqCG9Nw}@D&hAx~IaqNy_HH;o zrn84@-)%2dO(kU=FN8>DorjAc_3RtIKS8anU_I7yM*$h!8;0bN8-1p-onl4|9*q_@ zI5@##0~7oHT3o2z^%RkYqJ^NIPV%$2B2VOdWAg-`p0HZjOw&bMTOSCNz7a6Ry}z!Y zwPht#>ok;+$Vu)P5D)BhWKh9W+B}6i9p6xCH$3>JGKlS4n=YkK?9^ zNF?O336gW|=s!(suBEbhT@|UNe&rFwvHqUp^(R`X;DMbWfJ-wxgv_v~iRQ-yKwl`BUwK6TkD}k;b zW_|rnZ8fbe6IORW0*5#r*pPWi{{Ym^h1$N)``)^|QP(6iSxoqinE*c{jDL>1#_vT> z9zc#V`1xr{OjEnOYA}5V9{N*tuX2VOTxGcWBfWOx3y3 zHyLGyNW8oyB;)?=c2@qLJMY)68DqGRGqbazQZ4@)%)@#AD?FMoIlO3RoQ&t0`9g=@=tTw~n3fYb80auCmIo z$L47xaNI}CfO0gm9Fs~~W^%=ksqRj?3~+Y~F|cr<$eevfv=t;DOdVN0J?M7-0P2&L z+cfl%!lVN&T*VOo0J^MuY14E4i+aIejyY-8&vI5?Olhjv6*=_7qMzG32kM}W+Z^F* zOCpfBa2Qk!bdyfpB8{A%Wf|?M6&4G{8HiO|s$ublV=_ckIQfkF>HDTz8+^&TmO5>f zHDIBftwPmOv56T^p*X?rJ+rRM+?^|fsCJrItM>gxvRI;2{tEh>e82>08jXBVI0KMV zSqzW8y_X#99fP?jDrv7!(pO0(YH^~9iCoU?#9^=$jy}Gm53avY`en0ibe0M?`=!=# z3Kx2m#HH{uNXfy^*HrgRx>LM*eLO2_sA|d-{{Wb%E*S^OPH~USYojc+GJHB2sr)zN z=0J0UuRG$};ix-V!s_TC>D#2`NvpEQG8CVQQZQEw15Ph+JrFu{HpKe+F! zBO#O)AQCkKvYap^<6IFt*l<@((J|bGS5@?%Wvpz!bJMXT6?R2-Tzif{;Oe{FKV_ba z-m2!f+&1KLRn9!}5r*5Ir zZD^~Ot7|+$o}l-q4VHz6sQiz&_~}2n?ls;5!soV4!qx$Nxjpsw5H+9T*WJPG=yiKA zrse0hHSP{SuD$^4HD2BHRfR;XPp55o1A2RFa8=KyvM8s}YEm84qmW1Mtd&VPZEfTJ zI?P9b+rF-lmtkrV=igfu02l)~)?zdA@2tX+*ss2z2n(%a$I3fvBtUzB20b;HML*-M zh`1h|^gv$;Wy{2jA63@Hi{CjK^-!=ZJ++udC$Jx;j5R6GUU+#p1ozfzj1F`94Q)u< z7|(Xr^`~w;h$LwCrI#%U6BhO-<&8;-n+!5FzA9(q=Erl7O>GFsIPvxLZ>FZzZ8ept z10e(Y9dA>P{f0fU>93YEp8bxtEN8GIIcq$4+Pn3-I*1=8)!5@$sClv_(@8zkG+Zs>8r03){GL~M@fVD3r z;<@zwH3n;aPFRT9fEnyFr&O_3DwzZfRC?fgYE3P+GOVRCea1C-yC@v-*;gq8^Yg9< z`Hf1brZORxJcSs__tV{0+gS-BFJGsohRI=Q%VB$J#UbimQg;Sc!5zu<*2O`d-L%Oy zojsSozM?&^hh-nGG(ZJ9h)7KOWPJ6P4|9&%n$(P)@!ML&c_ib$j9^j?>OUUX#q?;*9sdANZF|I@d~0xth$BC)y$C;;dw#kqL%SG|pA@)(9p1uj6Z2thqRy|bQqxf0CAEv$V z$s<0x-W7hIroHg~p1QsjZ|<~k_xIPnAAE7fqy*2RoNF!v*V9svm(q%3!9QJiVjcM( zT}$A5gOWcjVq?i9f_}L7)TKg26i1HWW4^sujx(Hh@2Nabpj~~yaqp>0br!UZc;h+7 zvN87UjDA|$iH}al>F=!g;Q9i6wP*|JM-b!Wb?J=zoD6#EO2_(VUKsE_^(j$$&=Vc| zWQ}-G4#U?{7A%q2oo`5a4B&U~+-m78y+IMN1b6*)_kzT681Jd#HRX~ssS8MC$zSl) zLg)8FmW|JDCtKEufczx)^v;da+hvp$flD8Jp2J%uv(>Ra4kRhuf$B9ZT3LBet<=2a z1F$*4(`~MiA_EQ&zZUn>v`aEb9QI{DBb_o@i_8En+4k+Ac0!FH9HvTm9F)Uhbi+YJ z*j6}o^!3nc6lW@=f>3F(o3iB;Tw;c$Cu8{sZ{F zXHX}oh1uyz6~b-%F*INYJzv;+uOc_sa&fu*szl)j7AyV zLWCW@XG?d=%6|l;PnP!>@1pm53g?iI8JS10^%@K(&Hv^oUoDx4RHJ*zz zk956Qd@xwIZ4G(L5<$SxJBr05o8xp3*xnO9TG^z1BR5z#wJ+g||8Fb}WKR6qelLc?dMz1(89(s43Aa2M5Q*4yi3qmmMiryjWdbUK=O z=xS1;2P)`81_#qjE4^!((W^LCs*d7da=$=FeNe|J9lG$O*fzsf^Nyy0n4mar_{sWc z+}$*yN=|82S2F+$Ac!v?*S?HeckPl3Ld`7`%7BD$AH08D`~F8xyJoJ{ei7AKZ)r}> z+*UH&PCdsQ{{USqp6U(6s*;zd)t?lCiRDmRw~ZOVAL{{)F;R4?`#pG3I}wjGfcN~r zEnOmyZ(6ExRZ{ZE!^~Xd6ZFulp6a2tOFLTWjJ$jLdI9=rVn-Y`6M^nhEniP=J8BvJ z9;kS7C@sqba{RIX039XV?UdmJ)v<|q6XhU)Pv@Ol(r)VO=m}1cc)9Z=m_MM^Z@wxk z>I*?46+E&Q842z_V@B5!D5&0PS5*aJoy2jJ1-mYD#C)}+&mcUJ*b$=DmdT)}6HHl| zyOKwyh9(Ih$Cb~^Lq%(AfkZ6ZuJ>rES*WKBM`Dhlm50nai02Wx9gD;xEEbf;$aGJFFg32596SiVttsP$_P-uq@HkNc!dmPP7Ok*rK45}D`Y=%c;IR^WwM^Ei0Okq2d``arq$bvbHH%J zwg>&%lSj7A6h@qoeQJ6TEbOJQ)QkygZ@Mn0PM`UAD)-D4&1tUiy~92qkN7A zuG-5frY+7^VEu?)2$F`Hor2X-)Rlh9#AF>%mWnL2stK(!BeKs6E&riPl&6mR?! zBS<)>Gu?i;8Xz{69nys%wasqHn3EmdfV zLk7SYTzrm)b>SBO07Y1TVJoT&tWznG2@Iu4;(oaF(7K(Sf1oVQZ<0h`bs6pR?XG~M zs-$)+95J|Ja_SFr^UjT1sAQ_og-7BC?AZgplw6qCxUOKLfnk+W;Y%S>*uxAr>Dx?j zZM$7{LdR-qq071Wjs>bEqe66ID+WT>)K#sQ~iT=vAn06mZmsP#m7@f8(rgnz3s`SW2n(<#9=*j;=5} z0fXp%UG)8DuNNu27o=3<^v;Y>>SF`=g@%!BHx0{05;XF!6a1haU$1?6 zd*Ag`H13tt`TO~C*#7{>NHMsS(I5!@+N9T)hFL@*Mt)f_@FD+l!lN~Hn zZ{)8J@bW8__2PRe&}z%%_XvtjQ7Ar`9kkZRMvyth$%4A$K@@;JRA3X1S^dCJwn3{ZvsR>9B9wyNppbRZcs+uP@;RTWNAxU*v(nlTtCOQ|((z1>37Gye_{N^Y`?Q_If`-H*Pd#_=y=`577n zl`<|^3=dyjZ%U_;vKzS75tU%tJrulKE8J(-+eK+=!T{z$-1h|OUJ9pQP)R>c6p4$d z1cBctzBD8%Au*b&dC`A{qK` zs|YnqyLm#9gPe_Oh8Y|NWXI>J&EYxh6nFI3ibi`C?Wl5!ij35R_6wfJ>#Ph#7tM@u z_a6F~N_rAO$In_NC7cyw>EGx2YJ8P)ppzI3?5DS;2d<&dSO7jl#QXg;N~IuRNy#|( z(7CANXFbRV>8i9qT8TXI$;pJ6)CoyuCm{UJh)+PJiCpR%Q!*bfa&=1Z6i{SSUBUY{YYv8=4%F7v}8*40a%U>rE9R6$;T3N2hMuGffYM0+`qi zIPIkzrU6SUX{ZhwMGl~j-z_~@;iIe>g@!TJ+v51f1n9CgY z)m0+-C#pSzCyv!H!pEK)lKX0G_A8+*B&iCR813t$8((#lg&~$tE-+3s$6Zx!t&7Xt zFznrreJ=8h1y=7JXs9FjJB5<6o+swr+$pp%1@Q`@(uoi`9Ma#*v+wlushH6ctQ zFgYA|(QUN>LQGX)gCnsXryB9ADi?|&&JS^qZ+D>)2|l zkphcDJbV?Tz$e?~ri&Kq`?@0u;>q72j^jww)Kwh$6gfH6`Dktp2w<&@e1@nCRdku^ zcSRKPvl1Oou^yU%QMoPDQ3>IX&F-k)x>Ph(o+uni`G9+CU2-%@;qhz%`W;;bR*P5f zPrhUDej(S0;;Hig0JlS_WolV-Nl)VQBgA9e=R#wSb&uj!1H|_|yJ^d4#Tu!qlA9rM zmB+S-V+cr0`(occ(wUk<5CS`afIgp1IK^OUI7L7T%sVM3Q}&#exu}4pq3|Nlnb=@w zO$oQ4s0goFn7MN7d+9EIQ8k35b&jn_961B(Jv3&_XAS}{Z1x$>G{s%FV`4=mNIZLx zag1naw^hUBjdv=@V}_(i1A3J>{{Rg_k8aZnh43NB2O*ok_0hXr zl1)llV2G>O^7ho3CbdBjCae;B{Dy!gZ3c-$C$>*T0?!gtNCtl#m?QGlN4|Fr;a*xO zX_aM^kgeR2{-_?hv9~7Tr=ozp6Vvh;?<0V}*HjNxKG8PKl>^P=K|M*tX$=iGjVNR8 zNgPyu`q3L4QeH)&^=WpfNSt&q&2k~zQtgXjiZx%~#I{qegkg7himwaFxqFsLRP zb0YCL#~cs?4(BI7mu(|%-m70XrDT^orNQ~Wc?N8GN1}i}U*n;cd!Fpxa=~V?K_bGe z5$XuW0ng%ZQaycj(PUICtd2HSr)BC)?KG4YN`;m}$;eeoyuu%R0o?cW{t46o*7BRsyN<=AUp(A&~oejjw!)WuY0K>ibE#-!a+0Tmc2meCr!h+z!Fc@`{{4oCQ`;oE z$Kc#4p%X5BaNINUJ+#)giKWMgtei<1&NHlD&rb5Jkiy8z>c_c1u7J4^XbQHxZCiCA zh6};+hAJ5e9$!#$Jw5cFQM0af_ajq7c7-Wp2o{u~2*iIeBfd_qn~kD5Y75K*AndBz z)h6GhWK~!Oex0;UlDR{)DxOV)Z>Uo#6cuekuZ$gP0y*N$xd$QVtdD3zhDFXWfN09aCJP z4N@g;B94{hZXUocdl8>sPo|Qp{>ghYz^JRYSuP19C-9@Ht1*)P?c_QC0A~aB*I`|Z z6f~_BEJzuK2+wcVLg-m)u?0j>f$xE$6TD;;bOPYoPJ(qmZr|z6u$mYh0>@hzWttqZ z1Co$C{Fr2YMz4*Tvu)H9(%E+o^0?owHJ*8CYs5(q!2`Y*lZ=pXTU{A8(y`aXhEjq^ zk2GQiRQ|g9hiFmL-KV>?H;q)pFl9mK0An9P^wmF5=is6MBun2xHeLGMCa195~^EX;iYeB=S2Z(Uf|U9Guo7p1t^ zYAb1ycIMRnFC;lRKZ`i|diM6yotEo-F+(Ku^E7fX4-~K6Kh+?5X>FCw6bdb%id?y0 z(tfCIi;V@$T4S%Mx5&*J(;cI&x_1?Vfj;@8s;Qht14z+^RX*d(l27#0?JmuuxA?MAC&Rms zDx+i%_-PM%-sZEcv~^b)-li`wQrvPrXCC@6@gcxUEi4vFNxa?ZHx}TglH*Mc9UMKR z=Ll40KKX1AMwqK3>Fpg2JqlbPj;T<*4HSe(2h4XTiTd{WYoB*L#^HCZsG4aeSW6HS z#4Mk-md!`q@`)mlC!ZETRKDwzDw zrl3*YE2phdNX%sbl?AZB_vxk`!-N8A;a~fHOYJ3c+%A{2uJK8BcUCe*pXCJOA1>Xs zuXA;3(*-ottpSu$KLYVeRLO&eLc_o5pHE#?mJ7Y^y$wb3vb({Ll0>k|QYAl7I}`cp z7UbL(>s=&pz_H<+mw7;9Gn}?PGxhb=H%*+Vbq27rldtq!cK&NtnG9&mA%O|u5_$pq zV^KE;RW1EMsEWSfP6Q;F(HwR?y|8k7A@^wXf{ERby36#RR6X#t7o2^2L7+ zJu~^|SC`rM?Bts&s)u(~MGXbR#Rf$(z!-AS|#Gc2h-D5-GMC^N=U^whDRSZG222nC6)!5qE!WP+b3RQ zs7tcDT`wr5&Uc$+h~-E=`c-i z=JqO-tJsn}=Auam!Q?|8+QOpA6br<}fT--jdymZf>fElg`AV!{_W5aMzQWAp6u=|) z)|SjxcSIF$aEl%+TTMKr4LffkL))8X*R`sI)R!um$t02C z#~gf*slq7!r0KP;khlU+93I3SEG+6|BBD3p>)Y2;z9xZ{RbzbT8DcZ6Pdkm1m8piX z1``DpYz@U07?lU0$88mk@eLq66l9LTckiVnWM9BIk8B-ojmxkkkC(2qNZTtzUrDw- z%_@KlUC*Wtq|@$4Y^gz?eJGJB>=>`pTcD1knC{s6=?)2@)}E=a=-3R{Vm%I}CCkJF zvv&OSsTB{10a*!bYIs>vAQ=t-?TssKl+fZ)3i;8wVE6aNmn#Cu{gcr8<3yGz>Khry zZr@#Mp50Ij01gk!P&E~x^U*} zIP}vRz%rpWFte$kYPkG2B!TkPeZTrMw|9ND>Fy!ZAdw=FS$?BF`m?F7G)(**!V~j8 zx`nwUp^A~-TCkCoK4JbE(*xfdfo=*!k+Me9!sPq6*+XXBt;=e+)yYpiHzF!jsg_Rv z0L|M6T-ntwmEC$}dH5RAUY2s-3o*uBN3L<$9d}J_=Fwn=YT4#ufy;6O&>x<;hwTm3 ztA6y3I}NghLq#FyRggi9e;^p_bKfBA)A)9yQ7iVlA#pVm8q34>1J^~!J)wFIo~N_81+pjc;k==bWja?{Q0`Z0yB{S?hdg~NV6VzkAx1nM{#xwHP*y9Ru-vH?LcPfmT!qT+< zo}gz^Bd5kVgX@iNjw6A@cKYgM6zX%^_S7LOaVjiyxgl|)6t=@L8H|s}>RmOyXBmw$ zahwlb6SlOKGb?t+pQp zkE-#&Cs+N0Y|u{L3QHqoae)Nvu9r|(7Ve- zT@&#Y_RyEJty+*{2`6#~&s}43*uM)?H9N*bupoi>TiA_Mo3E!rj&o3aNKhWlz~B$B z>UE|aPle@zdTlLsJR>8ffb1cpPQ)6yJ%9XMnvB>;GE*aN=2@PHljpRR~h zQ(y+~^46mt_g5XXU=frg`Y5~yqWgS?vIu>_{k6Se1GWZrmxr8ZJ^T7-sRr_+cxRFA zkFK)d2dLKm87E%&NBg=U5SOUNFg{(i;7nsujAWkv+VP>w5$UVir&5$~xcsxPxM#UN zwYZ`AA77Tf@LRX0r6Jx{o*DJ*HQ_;k2dB2AcqER;UwCbik=yDuHmTHFJTd4OIM=*J ze=SJxyXUsCXoh>|x2~^huA+cIA7}VOUdenR4u>)D6 znHYdTKV4)YY+;UmpDlc-6|$quJL%7G#riDSecpeNs2#j;7*if#^9 zCAgm|DEBSt{dF#eMUpupk&X@s>l7W+FbIb|+FKPE#|JpE2)`U3#&c=RZwY0b8842#*jjdu#3lV2w*eY!5De zxYk|>MQ8SDTcGlI81Mur&#LL?R>vG5FN|E_$sZH2g1WHa+cRso!Mqoq5 zh#uaV)NujJI3Awbkr|Om;xqL+gdir--;A+(IcG^N^^M6t)&bi30^F!$02n>57NKkAnaR^f+($X#$qAL<*sf2ex!dE3BvA2lCQf z#Ng#-!(T}hdFH4TeEl^7qk7U)JB3jA9lLtz4r`@Dp$##{G#0M1PF}2geEsykh&U*O zgeU6mpvd94#uNeVlc6zhDW{X0$-@WO_tG;|RXHIaJiWcOww|7$ol9ka_3fQsNHifb zmn$xVc+`n_d`BQX$@SBP9paiu#GW#vV<$SPC~0Je0~q@M0Nth}d}^z0ONfDduK3XGDceKj^M1BM0dyQ1} z_qzIUS~duAk}x}J1up5S880t2{$fw2nsk?xpKGI3teWaebx8)8gYzJJ>3*iq9Q6*X z8vv&S=p7#BpPNXF+drO|t+$r0Y#2L}>*=D{_<|mzWHg|it5~nk!($Qep5B@fcreie z6tJ=d^cXs~EVY!8p9-yz@*R}px9_btZMki_RIX=_fdq0OHV@Aq_vvF)L8lBOI$-Ac z4plDH6_=_+dMKDiatR~TLg;K)i+rq%tuixZvbe|Zu8!M1H`-FdwCQzn%E!beG6DJz zQK|P{j9Ux5^pnLRFzxJr$3^_oCY^;}^0{6E!sA|}o5dWAXpabSlH7)WO;&61^$p0Q z$l2}(n4NZx@aTWU+ssKv48@zyt1kxw^Zx*blV~~{YqOIi5&6Kw_>LHi`ha!1KM;k@ z!B{2m`I`P0E>y}^PYvV4FJgVhzLH25BC)nvyAz*J(^fZ7I$pne)KyrkU>QI8G^C?v z)5_k5`f9nk?fbQ=Lk-5?Jv#y1x^_R29f;QGrE7(SjnS5Jp!hu4`L!CVnW8-Nk@Fg# zOG#BLafTO^4^pE#lUHt*RuMXtaex)bPt(4cM5rIMrSh3LWX3+2*M$lk9E|-nK57bx z{B^OSLtof|fxgL+}zv2u1pnrN09y&3)h?9|=%S7B)WPKI2oV zEj5yr%rAyG2VEUx`!`frY{sW>T`8(2koh20@~Ow6C%OH!wRz~n!62z)T8_>~g#<;^ z51vQ2udXzf&l|ncn)sz?vK1XsO*C?}W+qk#jtZSmv~2Cce2JyD+bSv%a#^B`xF1g5 z{{T&0SG|(;RI%Hw7LVeD3TBbGl1I?{>MRSnc0C(WnuwrQPbmNjLG``>vt)e+G{E5D zj#7zpMU`FKwg&2=idw4sMPkwMJ}QqX&O3QeuCuaQE9qrg=nujo=giH91M>MFpM5w* zxbF9Qa}4#f$Rs6>6as#L5I@A}r)E{q*MyGcK_u{uAvyC9J@KFe=6iZ~>@>k0ru$o0RZ9)FG>Sk=O*8pO1JfBe)q!EI*;KO2Pg8ArQlxQj z0FFcR1HOt}Xe{?yc^=d_1~?C&FYAqGGLm>r48`767StE}J#Hg{mEwf+!m;FjnbC_p z8+UigRdSgGo1$sB2ryKT$r0`cvDIl@f@zX^=woF`IP*mFjC}hZ+G}Op z0v7_qMJ2~YQjjNwRI*eC^9b{i`Vr}(P}--ip)mXmvpzfWUqkcl{{S5^R%{w7+IG26 zS3EPHFd*l*<(z075?waMV#`r=ifVZW77V~J{Rd;C+&dxXx&i%ytF3nNWP%w(e+)9P z828R}I+EL2W4bu3td${!OTUDBILBf6=Nh)CD(UOE%tJD;z~rQ3OZ%RdjVE`8IE%O9 z1Z3zfFg)FMRmf|dY?D?vni^*AgB_de+fyyOhl({FOifeE%DMLa^_^L(mz6BCcnH3O z814D%JAD{|`BPJ)v-%U?`f9Gz3BFgidU+b1R54gd0DuVNpZIClXIl2<1)s;1M)EJ~ zlltp*4%&*k)ylqQNe^J5e-5NQg4a!MS~^>yj4KXBVmyib^rv%5!8Em5E*GkKejb_< zS2@C=039BJYPl*8#KhSwbEjzR_WN2%;Y1Zre*WLCfcO-qrdMfumpn#(y2B&yg|a4= z;mg`8809?7WRIEF%9|&QPk_Nm?Sb$5YjqktXDcuOdIB_36pc!}orbeH)xy}&3Jpgb z)D7V?9{scIH95fz~!PGYY04HTF76at`^pb5kp?J?t807hX zmm#ffYd0dSIV?mIf!haKr>HYch-uZ-{KgJ`niqJjzEC_;!iJ6_xo;InR>%5UA@@Q` zi+I}BIEj+$TNOEBg~9U=*HxbCvfQ@kJB=Mji$+*4IF5TCOzEQWE!T1n4z4&ri1Jwr zcF(cLrh`-4Djph}T}8{{TL;KL&E$LI*B_Rg+zwD0JR#d_eO#%eih$CY6|;#QiF_Z^ zM6162xXAL;$24_ezlIt-ujk*kw%In`+o>^pEp+hKM5QD|Qco|K&tNsKuI0OEWol2n z;$?*Kg6Y-~7}ggH9aMB58C7573PH`I=Y~=A`S#LW(&LhiuMJI`k9S&9 zGSXK%D*iHZSMuyN7ix76qH|Tko1Lx<$b79FXUcv@KH914t0=1K5ol^BnhB2~%&kTAbIB%Iufx{>d*xx2+O2rrMlyHzmWb$dEe> zdgqe3olF$2WjDiD}~jN%@0}AIxiwrrK3i1XU&8p`Ia?S5*kZ9^d!qA-!Gg z*C^?NReuQjDsd+sy3BN}a?shx<#pZf?KNF#qA=TOR%wu)0n`9T*B+-ywSQ>+%P$(} zZDuLtAkC6|GCO`BTn}GU@2c92PgM}9X;eF?ED7#3N{*(2rl;X6ye9C+ENA{29*kqM zKBJFyY0>?mE^nFVr;!##0LBx<1M(xd*N|>YrQ)HgsArIKKgde@{Pa%8(`p*~O+92# zhKiyv>yE&JJ+#ST*)v&SXx0P7l1Cssqvf4uabtK1;5hP?QuTeIkiAV^Ln``%-vdH7 z6!lx33~gC7K}X}rZ_Br?t>1y8Tt`s=B=$L9O$obNEpf_BaG_?;WdlGY0O20W$yF_a z$^D&oBDGy)Y@SL^k5n3Gj5zSvW4=9fLgi`j(2)idoDBo`DclnbV+-8s7jDX?;|NVm zZyc{ISZx0QE`2__7}drpM0F@*X3jJG-B>h{e1CWTIssgQHzFBS_Vv!E)xvpX=j7TMJQ+RI;~uBBnv~&;A=0UQ zv3!s<46*J;KW|M;nlw^DE%WWDuBePj$UeHFqgT=LC(~Qv!oG3otxGO)K7T(=W_$M- z82M;8N6#pnGD5@9W9W4;XN!o#d*eS{14(`J$6J0DiEwkD zp0HGMNcGO5mY_86$dcWMrndOp$09-P>!}S%591!X)bz5H00439281Z1nIkM%&4G_Y z+gfF-fE*0=$9+higyDcjQ^zAZj4iUU@*x2C#x+XqYGy1smKZ1IHL2YPb_X8ATOQpi zmG}99?e*5PPb#YbJ${|WqOf}}Venh97|*ZNYh%X-K_l1esLKsba;h+OnxkNIk3I3K zR;IxUIpVRN-ktPHjsPE$smRcHW~qw{!z0rG<3%W{qz_-SY0oU^7`ANZ4%T#nfu+9^(9 zh~zjV`;q<{g~&W$r*+4-ro9aD;eo&d*E+A7fihdK4;kRahCk8M4G!aw;d7iHbEIfk zNrJAyhto%G$>I+-4m~skBgb^nEm5rGSoiih^w5D!=`L93&DiJHQfXr(pWancjvp$e!6*XDH#k7WlrS=jndENmjK@H`MW_8BMt08naO(`VT22^>;Z z(?*5HL0}v8#-}}2;B-rTl`0l)K`Nprmtp9AwNhUzs>a}&3)IF+ayzM$(;kEo=zf|3 zZZ~Mj0b93i>tovX=%{HUj($V|$vLPa+e^`P0^wJDXsNA>PLdTNS0P8w*Vj6&Y`5xG zsbg?Xl_cNNy2lax*vfOl7)!R747-z zR27uN6U`q53zOS9)E&Rm`_z-iklaxBJiBA&bu!~`qqN-~mb&2|IIwY?0iO8Mskel| zxC=uYb<1|Fmep&bWP%37^%LPo&kOU_ZPdGx!j%xy-Hsr~iczz~pFx4ECi7QjuBLXj z(7_~-=PbhjkI&y+wZCk8+M4Td++itJ)l)AfqK(T+D^T2dD-r?Z0-*eZAFh>e&_i~z(n}m|Ekde^*@yX;@8lmoz<=sz zLw4l>o>irWon?@>6;{bCbLar~(@RBV4Omyrr>y&)y6H{0Yp$yl%@Ii8NZ*7UeE`4! z`(*dkk$c>A^X!>-Ce#$mxGpMVYS~=0isTHH?mVCm-{-2gW%N@208rFdeZg<56v)Bg zP{d#{_fy-Bx*uV5-L89`>8WX^l7)bkqE%SMF;V<9Bis|n_WFD4pEILr!qXcaOPlt; zO)nGM%~82lrRuhzy~^OqyrCqwk|IFzk?sliIM+{f7opomk8QPmzM-mtV!ksH%t-Fs z%XdA`Y{nM|Y`;ATUC%GoOFcL}!*XPB6#fVQ@}8^)l5#Z7^b%BxVB)S-CMEneKHaIyle~ z;e{VeXj3+&$Arkdye9mQ{kq#uj6Bjp20inm6T=IG8o!u*bqy^=n=L6m{<@Yss;@YT-e=4-NE%g}2svXzVE5&rJ%H<=F zxKO>6euK8E+my8vlJZE*$1F~_!KR~bS!X4{?M`=n$7h~N+LQo{a=rb3A*5T);SysgzY8AIh9XE_WtiQIEj!bgaVe{C*Q zRTONap2xWQY82NMn3V^K*0CNICrFG{?i%XJF(kdcJ#nbNea#f1qMVK=yJthGpz#YA z$prQTUe{B_6nNps9-mXD2*OjPDY}<^)C(m|1J$2D;Zz;TKIin(ZQ80jx@1Wukg|s4 zU9u15sHp?Sxdda^*Ff%bRmCY%c?@SvWI%AMae1p+Dq>XRN2$-Jrh-@T1GyfW-#yLF zRfp3QBl0o`ul}UosS5V)J{5AGF5y!FlYiUNtO83`*V<2FDdZ9?xAv2MTcGkp< zlY&2OeUNYf@2$$N555n4=(gITR>5S%{ zaNrTgIKfsu{kV-$s4!1ssWDU-$SII>+d(V>Ru+1w*KIbxZ1%@at#`e*ZM!Xh#U$#p z$1p%vqCP!|&!NwL+FIQE49Qn3P{}mXA0$yKg^oOT$vwWmzP~v-H`o5H?Fxzt)6@;a zO}A+#0#usgBU2cZj}Zd7E1m_gG3&3@zMbxSM^$!J4&vH1G09DFrb#?$A>$%*K-hTu z6l@T1eq&x!S*DjlL2}mvFNO1*DHB8936-!rc-E97)I1 zRy9ecpDOMZvF>!Ybf%3Jm03=yu0rPeBuQI{n ztNN-m2PFahJL(amcK-mI?d{vsPEy)XJ~`y)wy}cF9$zZz7b^`Zc9w;lDl(s6eHf;+ zxIgB8z5D69-?keH%LgVt`f0Z9C1m9^U=j1uT;%4kqzWqoOu>pC-!Y~teYGEgKZoBM zb6vAck$IcYWpS;vcKCyE2ymnI(v1|>vbjqTZMY*`u)#k~Z)+T8J}9|AmYhYlJ|yrS zpFM4-x5a`PaCEYq*4k5~+tDBn@R5P3Cdo`g4+kvXhvlZ1r$~o$f$gnKBPd2cBcML1 zt!UvU)$Nk)lt4y%jA$LxYeeIbhs+PIHD(BhsU5T`;}T$!zf5Ywh)}Urb$dZ&T!a9F z*yqzpdz)Ds9~o^F4781m`OJ(FouDj! z#{*d6{FV8Ixw;d)taH~S6e6ZNTBA-{BHhR&5;8q9Jx(-}ecKo9uT&{7*1C!*okJ?h zxa2-y`WT3Yb|3%=gi3 z32uF%(ZI|{mpYvc7**x$HL^Njpf9QX^|}~ve5=?Go~vyl72SOtL3^@{ z?fL5_?n3%wSt#szD=)CY_0t1zfzB68NDZ7m0Vf$6%tTIm{V|{TYk!1tNj>s0ok&y+ z2lUm3fPlW%fdS4(x&3u2I)8Q=+Z-o8fcNyyrb7TNjCcIB2aKUFwWcak#~*}ewun(s zsddVdeqTKjw_DSWxBy{T}Zen z)4}2jO!7i-QzZ|}T&Z>YUxl(gA#-e%%o}s1_evFxO6gsUi`poZu_xPCCd}!b!l@B! zt#gRizD^e(pKtKi%Wcl#M|=1<7r~KR$~X@F{{UgD!oyQhEh^1Whmlc|$369fRjGd~ zPM=P~Z_!5EJ03fHYVm~RFfr?o>!%591}K)HSp(y~eg6PW4uba`12-U&VEp@yFK=Dj zSrxuTww${!amydJxkO1T*Gl7!szvgO$kY5$SY~+7ej`2gPjw!)lClz_m3Sd4%2ycr z>3*Yh-Yw>7>8qzzmCG<@?hngK7k$ZBJyfz!Gf2zX~2Ra)yH?}=A;gquK$`(_;IGkg?y;ytxAFib|dF_mY>^1OJ z1o6f&J8HrL`{hUQj(Y$#@r#ap+LyopZ~@M|XpeG7zI0(PdW>Pt3GJ^IAAI)DVX2-8 z9-#dWy)j_meEo)q1ful_#0PM_{$Ojyr#*?t2UC1JU<~#oop{i>BO~(FjG^A4i2Gm+ z=f8h#d|^2l{dFY9-Os<*w!Pp-axvT6Qk8WSQ4SBTK>oVKqJ!CezkN$6paKVP+g^x( z{!{e%XoD2$C}t%-*w47uCL^2!>Fue8F@gp&kCwdfj(e%?skW7M6kiB;BzMT~uY_1R zP)Yv)4NCB{>~Zg}yf!C@1PxedQ+m@HL==a~IqWqqj%XroH5C3T`eV~SuC<7O>_P9Z zRY5*dMm}d#YMbwskAw?niBXf=IU`#{3VZqytm8mObKBQj!U5@=YPR~T-`Ph<0QU9w z&a?2BApJc~q%1(-;C|ZlLcXIv_G*aAo5Ii|?n8U)Fseodb+^Op7#~e$v7Bevk8M~P zSGj9gfb$cOMz$g=LCsURz02u2(haZpE z-$O+bh>?JM=fBfZQa=8tKjW;{3=HGz>#d?6PT15{ev9a1!3B#C(;%PewC9_Jd0XxZ43nFGG306`tQ5v|dZpohTEzJ#HL9`-8P-z(lLH_RbEo~iyy)!LIIcm!=Bf;S zA>zL>HJW1ZJe;S(*vp4ggzahjJ<`>7s%h64?A?d-(|liMyG-yEf*C}NFdZD=9X{-h z>u$MHMLf_WM&KS<$Ul+Q#bdZzCXH4h5DkoDURPJ*dZ>*rO{DO>G=Xr=@#vROHgxS# zLvNn4ok_#O31Rt$3U2kDJ>Rd?CTYt2|HmFGpl1|cEv+x?vif3vR6wY$|)(<~0el2l_STU+DM z5yn;tJOX>g0JxS%z1B`4dRZZ3pDz*!{WMC`O>*%H%w%O#f(Nhl*Gq1lo44%DTtd|@ z0piX_bjPbQokOa> zRZKiONeiD(mYnXDR17dg5-A;+_x_qly4O>=Fj4^<9^=9ti28QcsK)%#$0*o&Q2aXj zrE^f>R1Wz*y7D`31i(;Be=r%=u{*%nn4B+iJr1@#@{%~4E&<1&_0#qhl*p#j#wlNq z4oC;TvDBomb#dUaP(6F;ZLg8ORx)$-)(LlIRt&fV;NwXu($vv3ihX>U{{V)nU9EDq+*KIU#Lhnu$G(l# zQPccFNktrVlBPWk_w#cbO&T{PUj%Vlc&VgU{>fd0+1$wJP-C~V^&*XhI z(dzH3wyto9vg(|P#jv_Wku6Ono|u^v`^04b0J27v?!7YD*ICL#Zd4#1?K3c3dw_Hb ztqr0VqL$%NOIVpIuNf*&unmF_>7W!{M7>Q>9kkR^qx0h|#ffD7J#qSJk-;_YW6412 zp*~l%0*+iZ{{T+x6sDFvy+vC&Z#0VlARqYXO@`@Upu4>Ewuq=CP*|WsxySPlZ`T7& zv0v@cP|H0_$8aqmj5JB+{{YnQp;t`YVpwq^y#fSbSk8qw(_h`5!^~XdD2*YHM6hcOhHe{{V3D4Q;dGlfwte*tULy z8UDH#ws#~KT4$E$My%b`w2A;fkkc)8-?d$2X`-v(pnsY%sR#Ggh&J6KAg4$bj(heW zr>2Cb`^ma25i>M73a!AC`)4|^_O;XD zEpJLH734l++YVbFBc=oYlM-nio*b|lrA<3JAG5a%JELjU1m~QPCmZcaC>AF z5RtQ$E^FrDf)<*ikd9InQHk{YwD+>F)N#^7MSO}%Zc=4f0#iRSHCrb-bV`cq(=ZQ= zK5z%jXWvg$x6QFxY>I)Vi6lROxj5zRq{`7%NwBL}wn_Sh!9ind6@08<5Aa zZbg4R1QEHIB{F$iCO|@d=AcSrG<8iAV~Yi1#~)Ss>1MVYEKo@b5m50rm&7^2{eAW3 zf=JbSD7nzqw91t{8=Ta6X#HY(e8s5?|p41Kc}&kIZS>n#*LUxGLK?Dh}iWk)S59iMc@E zWc}qDOe2w%K7OZL+hWxPX|0IGz#W`t8nUdGidQcIm`E6R9>Yf>+tNqLlgt428qE1X zD@<^gWN@kow$=DRAC4sh(MdXoS#P~8UL8uhVB|3EonDbxqmfP!7d^-;+d7X~VW%qJ z6$oSOr%E$}$WHciUlgw_w*XzLLooH@%R(igo@%F@vXZP=0rJ&@6(uCe%0@;$%b!gx z)X|YuBV>;`0AuT{?tT`QHAJKF7Ba5Bf39`n*VacjhR9uVK<}bZ)69Q{V<%qEXOdPO zihZqGi#nS9vc?NZ0JmusKOR9oX#7!0hK1Zk?d__9M2?1~bAGV|A zvuZXfNl{R=H6mH9t4Rp#(iH$V<*m1>4Yst#;|g(O|wUPv-k;9QnSDVv%F`_ao7-jzM6oC4Z&NRwC&|rmrK3O+~yQHXeP-D zqdZQ2nr7OzOXc;^B@DO zF2~agD$&JPEj1$5N~HLRg9;CPXIG`--D;LD3__~*9lM^|sCPX3mTKju+crs!GO-TQ zVM77(@10`nnT2q+^n_5BWkFiaNo_2`aZP1T$X|D zRC{`g-4u(1QuSrzKT(ZA+ub+cFiMhLu0livvnPmIhvapAN*N(u)98{n^_uOs*hxTt zfXmnd2ONC+=SjO;avFWnLT4!=tL9X4LX+$X$oI#-x)*U;E!5NuwbawjN)%;K82);o z_g>lC=>tn+tTgusrSnAoKu7EEqlQrNw5aHaHoN<1Ls5LQ(A_OmBvS~NDUU3DyWxFt z`e>z1%_)P&Jqnofjz_We^w$}En7X&P`fa)@Z1?M(MIEBAlS&#VmL-?4R^p(Z_{M%; zmb%J=bVa#dNone+Ya*y0ij*@9khA9l)Q{I#!;fXB zZ>rIC*fzyNB&+bl9{C-#r*Yag+6dmBnpoM})bjrT4Nko78^NP=l2mlh9^h#PuKxgZ zjifCp$pw7bIQ+Ee!;VQya07t0Hrl1}OGP0p8_W-|(7U~|iUJlR=EtUW3|#AS++ILN zPI-6KGc{#PshWyvQ-pQ*ugwD@BYSU!J#$G-oV>umFr5 zVLh#7Jf)Waj>j0)DgkMyse+-3oGI2dl<}c1%h>$8>Lj!c193-U0rdl46{zAO%RW7O z>LS{_ib`oR0&zZ=I@K$|8)b0K^cvLh6$gkRv-#@?AgN}@6NBlWZBnol=uufiDvmhL z2-ZPSd#f+c=b@6tTMPdHobrujPgr6j#O?{sbxQa|6v*d@oZt^b?X0*>$c2}gKQCQq zmf=P?u`SEy4{czVh*Cu=2+w~h?sPkC7$~(ReN8-G3#lqQ_ZiW6YbmBr{GdkI_c+q? zTnvDCP6;Cz_tv>5F@mojBkSq?Gz3~OQ=KK!nl~}Dh|C5_Q=J>PTrJ~j8xlJ&q14+>)|$GaG>e2y5adZx zIggPVQr>&+mU@9LxePfODh_gWKc}5SnzFHN^$h+Y?hbWi8nrQbPTP)X?AG6hK1r1b zW*K5Te6>Q?Q&-PBwM)v%ScD7+?Vpyf{n{;+^lqfHOC(*Dah7kckgc0mw(U8LM=XI( zJj?h8%NmhjT92|)j@{es@llGXj{}Tke_eH_O6_*)Yg|#gt7Ec)ajKq|YejEy43P6^ z&vG%1Sld{o364CmMj-LWrh;c~6pkz#R>D$26mCU0MRSAP4Cyytd`2s8fm6>j-qT9 zDV&1X0B1;BXKY@#P11S`RMD)_A&>_x#entvAd-CtraSBOe`S4@dR4TiR2KLz60?Vp zT^>h7MLocb;UDnh&Dioe7|{)<(jK2|t=n9?V{KF0zA!A)tW^d`W=0*u)42W{BPx~f zh#tAeajv1)v8|>Bk(yT%=3G6szQ~;UDy!|HYsB|T3Sm9M+);>)ut6_@k%d)kWRHA)g{A76iqO+7 z&MNnXFj85gg_*$Y4nV;_Q}3=r>mS;~sCIeo>uB05x0;G*s10penO0UgIpi5xVeq=O%#>5gyzNq z>DxrB6*WX{5eQq5W&U7)m}z$TK@EF+CB6y7gU+svpWoP@rj#zb#*U8LEy_#S5Xh!T zB##9VbL-e=AmDzwN$KZbXl@tVog~#1=_MB@5=|*VFCu#YeaCN~ZDnjva4u@82pp?| zmyX*J!CeJP!wg<0!-T-)+tmL6G4&)2`suFMcYhbEV5(^JM(8M#omeQy zKA85@qfF(ChZt{dV@P0hlV_{jN{itUp~p5 zXq9}qAOZ5#WnRz_YO2?YHYGAgwuYUznt}QH=-n+tm+}A<5r7Y_jE_VF z5RIg>yW_(FPNbNCQg~qh08K@PMEls-H zNi{t+Gx#cH{A`F@9FM=LI@P6zs_gKUBle-!%lwympT95n)~>2lC(pRdkPZP?-7WK}9T&gk10i61uO*z)=sjd_>_f)E<26yn;V_-^v zGn4vgB=(y)idg-ngN4{%SuzP#2@ z!Aw=^12`S9ee{X3?ztI3asp`3sS_U=f>&s}ZNAN(0RGJ=NVH(P3EyVu8BhTr#P zbHPg`Fyh{207=P@B_Nytdw1`ycB90!`eH+kk=QMe=%t#76bk&}+dC_C?`y<+cWCYU z+r`porJ5=_ILwneMy1@Uj^_#q!0)Dem)WcB2W_U3s;{HFvN)oojbCwXfAxK}u zTOj2z$$h}r>wSmph0z|I?&>b2?0uBBE5)uuEi|BZBMTzmQYq zwKCGy(9ca#3lx$m<7niKhhnU!1Q2~e8r|Wtfs^a<)yvntklSl~Uk#C^uCPa0AfT<4 z(WQ7fVN9HT{ekr(1mKc2QLqe110T~~juIZg=J#B8;l-tB1mKQdr&zNQg$zOU*55`T zfDV0rde;79jCcC!&HyD{D;J_YJ?bx5cPtwNXi`^JP&>yZ)8UyAQ`0nxts!RYz0Nb- z{ST(UXnF_Hs~1Ez6)w-QAxKb}U3qfDw|2`O?sMwL*XS?>IrbLm{>!xVYi!i*+DIa; zSRSV1T}prQ`iF7}l=`p$4j}pfF|MPMpg_ERe!B49Ev|N^PM8z|^|rr@p5JGe?W0U{Ov4E+7{yImxhBa!W= z8ptJf!G*GZniE-SIXFO1uI9N=>A@;VZG1VCpg>d8$S#+;NB{u(%G zmPp8qU}L{+1GBRrT(4u_O|-@ai@pKIaiu!ekw73K0}(ulBlFhCS`=)C0H0&+sda%k z5(vThXhhxIV*qM!6{8H{mk7DQ)=Pjeea52F$U>Kp;2Z(1?8?I-htoh)+E!94zn30e zYIqYJf%VjwO1a~ZNcn3yX<3ONU}~utI73-jc2U^s6>NOhxEawJkjglpZ3nEV;t2k_ z9khhHkUIE^t9W=G`V{PA^0NBsUCyJMjt+609B5p@*fB5LO>0kdhe@0*H8n9ptmVM< z_0q-G@`|0Xep%5P<%7)Ttyr(OF2hxZ_PtU?F@l>_0QDFveW!S>%*3ZY#^P zTNY=jt(piHe$B@jKbhA({iSMlHO|jV1tmgM++c7ZXj{4|Bbi`*duf}0T!l>pXqReu zB3Ji5x%oD6`s%BxwAt=;Gg2*g#1uGJJ@fkO)_7iqoF;KA%lMawSTVFJlr=RObXqi< z0}5pM{K)tGv^cl&P%?sh9Aa>WP4FoO=XRIJ%CkMaf z>8zCoao@k~qB77+f=I%To}+jLat3kf>)S*HCUparp%Lr|#y_sMtU1HuA3SR`jIkko zb-g3vaI2AzL95z?zcd$=a!F4rNf{xO~Hkj=rotH6}0^IRbRAJ^+nY|;w;#f{Dzs8|Q^(Nio$0;Grkga;;Z(Ce(nw+)| zha&eSzPjOS9OpaWx;k2GZ1Sv%8e1(nisTUk#5z%1^-VE6UacXhT^$5g6fnl@I*Abuh2bEA|LQotjqsXT!mgk))sU?5sk z9_E}P*FDEpSbQ{&izW_7u7a)lwkaN#s-(<}dzb7~9TKfRDj`e+J&KP}p%)0eO3@G; zxnm8FL8%)>aDneP%7J>Op_(@Z6bT0|AZI=GTJC#e(VvTf11~%rdktDQ=~5Ve78uas zbDVe2%SqKzB(Quui^Q8_R)#jSOpba3?XbP<7K_2P>T8XeDz~mhmNvoP#Inp`}ekWq%Gc*l5*dv7$pE z%VWD^zBDCU!D86%eE}NM(}hQb3ZjZZl2nhDMu$yKIT4Q9W2%*I)!5A9TBmtNc>83OikWDB;0gQq@eF4|M50k_W z-L)*ngCL;?^Vh~Klf>stq?b6Tj)OSIzrXlv9tSx+z4b4`EJ@-HdkkwM8OQ;BJqDT^ zX+_E)i29IwpO(DvPCGBZ&r*maapUi=6$^TU^2UfU0eXmGC)8)@uZ$V`{QKyLqmU>p zy^p4{j)nPm@1EMdw5zBJ7__d(uph3r{0sIH4EE1$G*NAuiimt=jr)ByE?uK=x1v;3 zqecnt9AM)^xx890JzXTpC>;0j$RC!mG>`q#HDgC?hE#=QWq9QWEHT?!t2XDs)W-~U z5w1o@FG4=L9;0|FZFON+{{R6mb_#oAzBS^}u_g| z)#yCc^c%5 zWQ_W2aD{V%e_djW#|#I*zOzxuPJVi-RJ}-4k><$H%USpU`Y)$_c^Job_SWFp?W&_{ zzDov+!y~qSTJUiP_@AbAw6QqI&Ih6N*0~XQj`%0g9aSg^35RS&YOJ^<6_n^u4o%8J zqgOuE=}z6aUA%UNk1>$T64WylVE;?~N6RXsD zOzb)GKO%G6^41M-ds(@ME2E$+d8q}3d+p7SZl{7FQ5;@CIH?_h`f1+RXpRY0lmUa= z2N)Vlvfd!CNapyH9~B3HY-dh1*BEjSib3t_b>THVM-m*pu9U_-)a^>^3XB|M(^3u6 zBs^T{T`Q-U1%^=HL8%E#RWJ=AHhs0uG3P6+AABkIJJ5`O0CGC4ch2kFbnv=cXx>L- zg~%WS^*V66m!XWiucyyR*PE5rrj?BujgAOZDo7_=G_4JAHESNJ#I&~QQroL`-)L#` zczC0!BRo?qx%}~}TXFB2rFj~9sbx{vs(Kvi#_H`Z@~Dw!qJox`FPcEW<3BA>6>{$v zt!Uv$%;!a^C@GOicVXMxPudcLiOSthW@0$G1pLm5Ej+BDU(8Rp z{knw=wD9Cb<~hc6PM%c*lexxy^c!hS%M%}i50Nr{t?8(6%{x?Z@O}M0x}7o^b0W-v zPuE$%s~Tly9I{9U2SK!Qj5w6bv#Tbdo5mvpJ;2qgZ1{Td@l|JtBd|XI0G6v=x(9=j7GPQ2owLQF_0)8!wcJJF& z?TmbY*1mwO0I`i$a!=%)s^~Wb9kr@zH$0Qp0v)MjKHr{o7TDGmQFFM*15|ctc>8`w z-0Hut-1n-Qtkk(?81j*iO$}<>oUJ1ww+=;$pF#WTghV!pMr8!y?4xj$2)wH-sdNgQ<3F`gtC!(f#j_&O66o)w8P&Q^3?L%fy}2&D_0V+60{bmMI5 zoh&oKL3P{W9~Hv2L{7kuks#-`tH13%I=EG!K$$Ioc;x+coo?llssS8vh}ibdJqOD= z7eLo`MkR1Ou93B0t<;c7aHy>&5{C<%jC*&|4a=xiRP`pTyNE-13~UJfK-E_k=B}cm z_yIAI3C|WM1GlH;p_1Mud=xB%dXHnIvq&0ADbCcFQ+QXkpQ<$V(8`Nb-3}RKI331> z+;?0)B#9%$WA$YRKDwnAu4I(S1cgRBYh&IkWMx@pZX?_uT{XI3G8H;k92IHQTxhG5 zLrjc8Ae@@=~R9ix@dsG%xrrN5PHg~0jQR*#*;im zzWx0{2eIvOP*g=FonqeE(!ozh6(mR2Vu`B&4|L#nQcE$G!P3RF_c<;N3{$MVuy zSZ05Nq@j}s&6ZpeK7IcH;ip}jwdqpUm34O(V+*sGhEEae+voMtof}!^OcFTLR^7=R z72Cj`%85lRLk&+ZF(=pa)C!%iJ$)>0jFCzS$W`t}J-xL$p7SIZLr-3`e+2A6#}+3( zhq&#d%~5O=ie9Up3E)2t2j`%7mXWmX$tYE;r?j;R9IaZ+%)D7cav3@?4#}yu!6a0& zh}Vh!Avh=X)T@2MJ9?Uma~bkwe87(X04$vmp}19EBbFMN8v#$Jx%z1iF1t^R4(JV( zSK4dCN(99A#@mNbc?+}jIG676=?Xjj(LQIhfcpHG<5wZ{8fJhI}Dvae+$)awhK-Jy{9 zug*X{HLi}V)RNB+l=naA>o9K7Ye9bRD#--ydGUEfaJdKu8OCQf(M^y}YT;zK$ zwZdw-yquL+ks~A1zLzi|J|Vc$odhcz1IQlwnc=I2#xtRR5Zth40Q~W(w6m`uIp^CW zSe#bY1-fXm0;DG+*BXf}vPt^_e{RD@Y1Bv%A29jjQv`AL0C(@}q&>tZHMW;2ZETOp z@ypO?j1)7M3zlx)`Y%gv@!SPWp4ic7EpzySDs%=$7*KtVlwO<|mTPQ02(FQo6dl!@ z9ko{OKCKH)!b=5~TX>Tvl}oQQOnV#=kIy=^x3!aTTdO|qyT#(9$TIM@cqtx-8e5?0 zmeP&9cCbM!gUI-i2FdxH`sm}4gWgpm9BXP+Zmw8sw&;fQBzJ3s4V*%S6gEAH_0f&3 zxL)$b;I#Nlfz3_<$?xCirm9V;x6ytcmdQl|t8(I$>YyK=rjF9>*cLp;3Xjv!X!?u- zfK{>N*($2OY$&c*196U$DCTC#z{nrh8gl9PPG_L1j!IYoaNvdm@SmQU*484B22gwH z(__>NZO#eOAj+-_qk0jgNjtXEWN|ljsnYaz>u|PwT2{7a22J<$y|@Tx=+@mfK<}#5mLYwXds$4 zbM)?b_xc@B9Y*M1TW5)`*L{;w9tVi9!H0BQ;De6m2kH9j^;)9sO-teU@+zyaT%SR# z>nNyhkYR*wJ(+#KT^xQU_`e8OCV`UT*W}kl?}@YT#BTdjPfp9=yfT1|AIyx5gYDbb zUDdQV$4l?jG<4RRyfD;CxQ;(BAP4gLdJftT)?R>6UG7s|DXi;I9El|G;~a_iCj%$2 z{Pc}M(n^aBigmHu+9qa60y7+rKI+5F4x2R5>Z#lmnBsf{w~()~Lrr}JXli06A|fnC ze_aCH8#!pnF-RUH^kINLdXK%glFX%H;#m*zS>)nB zPXP5m3csGQZFcHft)yBU`$C?oV-nRfa$NaP<3B9`-5of%TWJkckgFm0Uu{FF>zo#u zBd1Gjek3j0VEN9WbqlYO+^tFXMMQX!ipd<2jH&u*;jaXGB^{}9n$)!OFr8P4_ddtv zsUnt?Nr1=?$ac=F#Ogg$PUf=`s}q&wf;FO}bICKAVCJfQGTH5|02G1+;XT$+Lm}te z8VOlXOrBs=k9=ujEU=iGB*G4@MxFYV9GLor+`0bzWIf3Cn!_bYmGvq&lXQEUk=Sdulg^Nh`-A=6$s&$ns|c zxgPrZ0Ny8cC-c>-TH&QC*kvd3?VU}Ek(;`q*3e>N6m}XR11h2Kk)GZCHAsRU5?HVb zoQ+F{Oo7ag+gVA1NH_p@9rYdXGINkUG$$OZ8B?QWQaF!(`P8z_9DR;^e6%7dyQ%Mt zW7kt-oD!w7K-A?~6t|$7SIGot-{+}tz(;Ob0D5Cl;i)PBKAIy0kv=i%22X7d0Z|L+ zB0=N?kO=Lm%^IA>Q$2<=>#v}NRh7czHl;Hpc|X)02{x*b`6$ptM}iJdW1T=sIF*V> zNCPB*JLv3_c)mc&quaKj)Kie&A#9V_c&Hx6ArztM2Dz@q2=vm?UZiT9pTs zSQz|TfZCgB1%(tGO9pfMYivnRB#a$+6#O^`T5A6Qg#4C6+tX16TXM>=@9U^kMIB+M zZfQB?@*4U}gwiJloD~Bd*S?1|ywnB*>+|&2vp@_*q9EtjzN(Z`#EG6_U>no((ThFm zT1gZ*UI32ANrs|Ic>^4<9-1?5ucV!^QS5Q+>7hgwn?rx4sbzS~E1V2`&Y5YanpMOw zVLoazs-}S_E3<_kmV4=yx^F#K`9)lQA_WiRL6z^PUAfa;ywu5E2&#r( zRgv@N{ST&$ya1>IQ&d(2tC>7eBA?|WxF=0^&8DdUGAzTNb_zhq(Cb81^l^wKc&30a zs~k7eQMcCauC!VpG%~bxEh@yF@(3WDd%kkJb(I zdDt6Hd-mM0MSHmd7M_8sL?&bJ<~@J|B~eoVeRWUo zo}+Z?>qSv>yy{&;f`7Qk}>RcK-;>B z_g$*0w@rn!spP)yt7XM$=cP3Bt-cs|<32}zXiwsPB&i1kXICE0yHnTLW4Oa4PO>0% z5Vwd%dyJg-KVMBzolxH$C%SH$jkVMpGF~Q(@k)A@j4!CbK+ilj};UT2ZXfA50nAyK=d8G{XTkr>3>Q#w^3TJb6(3@)~1+2 z3qj>2lnk>l^!y{|>Ge9|%3(ZG69mm3dlICN@YVkS(GBTU6u)p9y8DcBE)w4ajT;s| zuFOU_i~)~c{{XI$E|{@|#%U$w92M3*KBcm4YxPyK+A1yyO9+syLo0Y;dlplk=dtbU z>H1k#3*|Q9+#;Q6;g&e#FC3&}<&bml=zASkJ0h|R4F|^E?J6gM!{y`$!t};jN#*m& z)kV3!)Rz5`zZ!zin4PZ&;xlafkGhS&f(p1pgDA>jjcxETZ;Ro?!86UCG{*!Kf z`wr==uw8Eg8mQP-t|G6M*t6P0h-Mpi^+g0 z2=vvo(h@S3DPgazKft1qhI_F%7}1(*P1D2-iX#Km1Ey+phLi<{6NX=XNrlkJszx~< zmtm{ksJ75JsVd<^Eo7|xdxc)WX)CB3*6nSf6#HV^Ek$&V#DCcNaau;V#?ESD;9-sPyT+MzPZi1?6dV5uE zH@GuS7?t_<9-8gw_SORBPDpaCD~$2K`CN?n&ts^S7s#pO@u^~3OfcdZxt_zh=4 zzRnD8^q@K1b(>#7PG?GmOJ~|KzvPSM4f(}D*3P--W zTiF-|=9YgqY^1x6^{AQ|VO*0V@@CFS?SYe}w!PF#GYL$b53jyPj1HOg8hYBBWhT$P z)z#BLYG#I-f=Svqfx&j*r;6vcPpS0Mee7JVRkaq2t-hv?vXQ(gspgENk+?W2%6o!7 zx_o7hG}CD^Nd9V*RF~QTN+hJNskhD;Wz5-7xbKz6ujQgUcW2RVXnb+Jtuf5Q#433! zpI<5Dp+Wt1QdQ4T?#$(ak?wnT*OYg9sxZQup_Crj2TyB%wPtxQ%ae}m+O@WN%+D%C zODA|GIV(8+@_g6oJ844WO;blN3V;DVWh1y@^BUU~;`wu~f|8ijRn##NK@@0Yb|=wQ zMoIjJtR17ZdZE;t)IB_-*tK<)#T+6_OW-sddy-lBfI-God5@q6(?;ir{qhh9-s9vJ zs^avO0BRYo+3Nq@7~%7Br4D8E1JIg+=rkBzGWsop%1j z{{X>fV*bp~-#Vq#+q8AnH1W?-Z?sXz5T|AtG5C`QEJi@j1?~@TmE+LPkZkX=_T0MK zdVLLT%D(S6jahZM1o7EaVIu(mRYl1-_au|7nx7kqts)G&?6pDRl5QPr1kv_M=^bxG zIz4Q)?wKQpao0v>yTc7bJS#so04kDKkX|ZTKn=&-V^;_Eg4qj*g+lWq+N;L7s%oR!xS2*%d%6OQq}Rzp=Z=CDc_ zabEqDeKD?d>ILSmTA5x+8@7Et^v7`A)lxf%rC|~8#P`xZ~2#-Q?IdojrDpl3Sf*${*34hONY9-@bVJf(0@c>{u z`-7^>t~aih?`sy-=|@NQ1Q(6zJRCmbEy&jKU(*dQp z?tK>~Z7%GCpVe~@9AuRl2VQaF-d@`1+OPZ{ziHYjL{nNJOZu-7}6u^Y+*2ciCs{LDOBc(^_q-1=`(5JtZjk zN+zU|o>o)@$i0w>Ta$hz>`BjV`r&xifv#wl7Wt1Wso|Q(2W*kpU8P@gr=Yn(O~5#m z9#5aakDjHaL7u5#jsn20bDwQ-!~Li!w{+Epx^rlyl6QuJSaReA@8Y{Q1`ZFG*lVCV z6~1pfx`LwhTT4#X>XNBJQ4=0+h&YnUdw_cp^Ul27x@jP7ye`ypvR6||v*x!U9Goc6 zu+r_;jbY`$=Q?eZB{^~jwuDwwnL)yXk6i00G@jFTE4 zp7q7N(Unm3QGMIi8$F7zls9^L)HWGo20(lKmn3Se-Twe;ZxGhn zEs&z-G9#1BvU+zQ5&r;gx&HvEHv9hoPj9JJ9O*3;Qx**yGU0*zFZI@{EzN4ZK=(ST zBMZW$Jwr$sC*`kMrSN!mwoiC3FRAfaNh}^xpPNYiSHHF(_(tbrB%RC?bre7qO_M+q-A6$A3v6sk|zaxrzgK-qER!n zVM-FX_4n4cv7l1Q_nzs}p7Ls=W$}vwGCq0NklUcTDUqB9_4M`nX7?X&aXtQ6 z(TY2}LoWpX3Aih;Aoj@h z8r5{SQ&cNu2O*LO9=ceRgGDv1RY-$`m|=hqeM^cZW+SlrV@B(3NI5e59@)_3g_MME zW2e|wF4jK^7X^NJ#;{`R>5kviQ$&ob#E!>4+K*9A#y=Fc0rVOZlx5U1qDsvs3BbtD zZ+&2q7C8u8%bwlwrrnRX8tGV8rqt7~4=7?lKad)|_J2q1P|X~(TU8=u!QmeVT~uY)iq3IaO*27 zvY)4?ZFJQp*|$)^;n2Yx3I+nI;AmCPVtjn&qB@sGI0wv1{@Ua>#h&-y0dybX;x^S~ za-?<(uOwzU`}jkw5#SYxvcV_gHec13k9Is2vJ=06Z+z(1~*ZW~_fJt0ck zdRhKW7y*a-Sl0GyL-Mh@2Qvj#@RwfPLC<5`MQwFUPcIo_&Pc~^L#HS@X&l6OH3117 z!w|(!>Fcc%YGZqIV5su$2GF!J~v~dKWr|?f63{)I8b)Hzmg0?x#D%tTV zrKlc$F@_8nF$ebf>cq3wK-4jZVNhdU?~eZfo~fO?X53eBv!CJki^*MqAe}$$4Y|23 z#z`ufS|X$jzEu8TYnwD;xm%%>lftlCs)pr4wZ0i;MJmWg%U;tW+-M|z0VC{Gp2N4x zP$+8SiiLoTiK01W9kM=p8Fbz&3!*asilkw2*y|{axZ!FqXckd*lG{fU2dgESeqFS) zeBBiEQRbZ$nL#7wMwV_npOoBL*o+?hdyMEc!s8uL=7g4I$9-yxPu#3h>P1sjySDJ2 zSk`7M&HFF|8ed(*JJlyPQog{B+8Ey%!7~^_18i;fZi%R*!vxPgJ(ldpd6LHJHd z87E8zlAf1-9l78pzItPVTL9^VQ!IG`H7D1&))cmR>uL(DUR5QD^aD*}{Z?1E8083x zhm2k{iU=4W4}D57B&#;*$=!G?)iqFIL#+$sPxT8^HO$Wdv7 zVY_mVC->Gz_>c$47O4C_z%MG5rs?&QO39TBYb0zyB!I_Q1z&QPmP|@`UNbaG+YccST5|cazfxijPeYuG=&cU;w@! z94>q4>G9-9omrMMjy=6~4y}|*&yFYtKVPPk*K?hAm||;20#~?fTS#9KLIz`kzdbJ8 zx_bk2SVlfa<);dSsCmG{xsiqk(_XNWmPAnCD*A$RpQg1kM-J;VqX(5w*6mul7j%^m zl=|p>MZHu37&#uNR|Vb_xDFA+hF~(-(yiBTEJunV4UXp;(%H9im9mOK@B~K$1FX>p zBb5iXiq+f9Z^yaEuWd(I)o?hI^cv6|XlX_86^2GTcKK@-rc$TNl07vvMl+5b$9$8m ziytAx1NHByJ_=eIw8IC>gZb+(hX5Wv-%S$uChSoTzBH@`O85C{Sw(1Jr5P;Wpx53J z7{JjNh=YuJch;j8Pj1>F@mFO;L>S2(^WPfyqW&exB>c4`LM&JNNl(APSIifvH{)0C{pXj{-nBKd8|F6&EPX#ADO8zQAu)*4K%#p54dG(_RSp zjO2FF1|Tn4&|PJ<)Gb62FEBeF?&zewLA_Ndj-o~?gb|0q?fGaSjIhWV9-7c&#(QVe zR$*)MLRp-%7lmeR9;sbmuQONP=8SL(vGC*@9)z6#0Kn?w+dX9xnAWc8O6kvvfhwbu z`7zG9I5B~_CzPLjXI@7<@JzK4O6cg}k+a+#V$}FtGxnvYP2$q&s*Q#EZL=@1SJOvX z&k+y~SdQPGo}j*4WsH11TyKw32-oL@hpjuR8)90j?vf&Q8IKB2Z*%YYY3F8d8j0rd zs`nLHh@Zlw4*vl5Ysua8@IQ7<3rnOMpcY1 zJLiZewy0}gR2G)0DV5}2UW{{&-v0nB>4*MUk_jA1SW2ME;j(qicZKR>G}YB_i)p0G zln$fp3*^2u_bYu&^pUY;FifGy{RgI~Yt%M7T&+nJ4A8PRP6+11{Va`M_nx{?2!ukn z#11jv{{2iTYotrjwJjg z)^u3_`Ud|1vqI;$^zo_XTGW=KknH9{3ZJGsX?u8FZIk~1l3OHMIDRR(;OFzkkfpp- zLXAvVJYOPngRe&pn2})8^7HE&4G;<^e1_LaaF#1^9=mNk(F=1c2&F`W%y~)Ylp`>>|MjzCARuD*+%!f*0qVdGW5kVnOen31~&uP9J|V z5z2fh_Rck~qjgId^2|N`Pkkj%adsrHFUuIzNh+jc+m~$*NvOo`PV;Uht)pa7mhL$c zbhgk(;{{dZ#OKq#hr@NKfaeNFsT$6EM(LvR!?E;(M^D$W^0NUMxs zwuQ%Xl9YoO1(4-Q8uFr9Djdln$v)oN)8K>V^go`aMgoF|D_oUx$umybF2^Uorl-?g zQ=I+g03xD`EZ(pRCCAqRluNbRVt8Z5zQ zPT=Ra%TlOgnL`?BfZ_qiA_@Nhw^+!0$Hzm+AKzA6X>D-_D<8XHnX^k!F^Kf%)rt0nBH&eD?Wkdp{AuBN!dSH@=5zXp*p^H4MlR+yEQUdTZkog$v*F z)Sgnh<VS%YU8;E7^f$6WjBBLaXf!kJEi>RVW z7oWKFAD(rspe!;M^gs4$V@5#vldlQ_-fv(#<5jU9`cQ)L$jMSZTFgs0Zb8nsy0bQY z7bCbD!+|aB`g&*!D=Ng66D^Z*)6!ErToBJvm@%>l6xQ2Ty2^2t-nwTzf zq<8%ff8R;U^%KSLk;EGq8V;SN z0uD-Zj#=)W9OB~KTwumn_WI*b8&XS(1yOrg(2gsX$8XEuRMa)Ku>d2Rj}gRV1KUMt zuT_95O(StpfK=d(De>4w$L%Yl(vHt_gc;_Exh@&|4oCCWh$)uQERxbxIa~}3{@SQ* zd!DkHV}dz}1F^~X`RT^raH_adnB=HAI5`JB^^Ne6$y*sPJPf1NHBVnTpR+JN{{Sr+ zq?tu9Ddu5}jAKj2GaM+vyxGrvN}-lllLff1sn%z(6{;r?QCdrCxDPgP4zVdPmDQj4 ze9i&)*5#T;?H_*qfY#XQUVcT8=O^D-XLqXT!ZU@HI>5={h3)T=t+7#fWI8!h{{Rhd zqNMQO%)Y-q`XnhpKyj1vI>PrY&22Aj;a3WBPp^FxjZm=84um99CIT_eetO*$vPap0 z<@5Pz4$f2Agm#{)D2N2$`yDmytECz^lC4K29!FlppRTKrWnv34(RMt@E`MENB=0A5AmICGS}7IY zO4{+p9Jm8mF~U$ zk9`X;^HNpu^co)2fVnKkCppfRS`R6fLOPrB`n5?STxSkDa^!pI!o}8F>Is%wz|SEV zW=6+vsPxre@W=)cvPa1J>*bA+ha>CQ4K2-SL>xy2Tz3wji|Yr5wnYH)5r)Tqo{G?Q z!*p%fMIwl*Aszn!iZI{4soDjRSiB%|9mY;IE~mn%kBwx^A05E-(u_>trw6!XD+b~A zi`E?8d@=W^t^rc^M zD4QY z_tiwz5t1DCIq%rsknukw>8se#Y$CJW7rM_CS!orq-y`aDxmhJboUw2L$J0fr zygAQdmd*#uQ?7InLv0c`j52!@oa({NDy!in8Qe-FI44;p$j13m9! zeKiVM3u8UBSHiuv5th05i~^DfI>=SIT!zRa8Uq~7$P?|U3sB3CPfb}UHrP|7mDK0H z5BO^j81nV@>~#)Gzg!YC?X7D#?%cFt))seQqY+JveD%5H8One(Dmsr}`+fDjXE{Cc z4vAG-B@+^IKW$4{a58%h3rUv)2jBM8q^Kld9G{=IqOhhvCtoXhzFN`Am&$)FeGJ7; z3GJO`SThblV?atSFtIfr6M_$7J@v6_c>(4C9^SgwBBA^%l69KEIE=S{Z9t2hsgci& zoaFoJY%=APt9>z{zY8W*t9^TFMLbf*a24N9igmhmao2+=HV~y40yp3mF~8 zm#J!`fMh5?JszN~ifI&f41LCcgK90Y&?3l0t%2*Q6GsBZV?Y@C9ZbbEh*8rGpIt(d zDA15Olb+rEG$@6kO=-lZztkOQo`P7{3ER!1+!Mj`5Ds;!BCO>-ThROHNu)!BzdbEN zQxnGrzJ2r#ygQE!#mz^*r+q%v(V6n8kO=wcCC16d2IDuUe@##}tm6p=vXRIFR9q4J zXk^q5pu8+ff&1yYOC*!zsmSl#{IoW%gwc-;oE68nwv0N^kd?%;Ans2sd}OLBP7X1R zNuR}q^NgpiF``s2Ni0mS7FdqNd+P5BlJS{b@sM^t*w=;!&S6vB`VAMj+5mGbc?0t8 zsW$2_6#xeqKBq!(EfCHYn>>{ivZ*dk7-Lq2hU~8zMJPe(`so%cM3Kqj4@2M6N3E+Y zZoVp#0rk?$yQTq!Yg!FENgf;wk>5JAtZ!2cOW`u{Bfr0GR6BWmLmw6;iTP^GvdZwP z7iIusAZQ${CVKi6sihNCRkUj!NKkS}{In_vt1Fe#o^c^n@(1jDXuNaKO#x_Go>T05 z4Q`-jtthhwDO6ku6cSm`dRiy4O;&KUyaKi5o`8)fo%){dS?Ap_8o7l6mU zx7y`-U&fq(6krVF8r5`>W2q9xWOl}IPh<2NStOLe+T{bd+hw!WK{d(cRg(>#MV3Ma zNMEnMmO8V&l7^zfY_Uf1DHRVPZtTnapHE)@06gi#epTG7Y;nw}V`>lM7_;4nq4oF1 zs)#ny?(8GN>^1G8 zh3Ml%JW7G>tv7lZDiO=LV1Jh+cKPcq*;;_6s<*3~Hm7!466sBQdN!hlLE-pe#GsIW zJofG1ALFVYXxR4sAh=Z2+3)+Jsi6=}1yyY{anW}fl_~j>a&ddaC2JsIKrW z1YEmBK$WC$P@IrJ2M7MmC@(~yq^f(R#`e>n55id97?gNyyj=^ClBD3^k}>t~r^PPT z?Ilx%@VO6j+jnKIvgbX%#c-^ewk#*bTn%hYnaO90EO>pf#ImoazNoFw(~a{Sm0N=C zWu{b#T1R?n)SEc(#4j?ycliI%=R-%^q8yV;-A-2O#^9&OrO(F$Zu%pU*w_*-*G1$`0 zzul#o(a~1F*`KXfot>~JiQeCF99AoJx|wr58Ym)1F`#J~Nx?0HgOYVmb-St8?eV+o zDJv)_=~9ZUNgKrqd`dV{FlHWN22XC?$8nLW+izA~cD3@7@n)~6qo|{mWQw9A=SKdS z9>gBRb~hBcga)RBCg>aufsU$m6~V>^0RLCHpl{ZHmY0b?#5PZPBAi_eIhO*wT+tNV@V4< zjiJpa&YJD|E6tS>{{V0`F;$g|!Ej@f*C0H8qrOLR^Vi#t>}k@y&r+8aqNuk>l>%2Z z&*hRZFk`{&2X4f7{+Q?6X8eZEi4Mo=#bvc&%wjv$qz8UJ+@TNUKj{IDM89?8u3N?r zhl6pgJvB3cWTa0CX7(8;vHqIM-7NdJG1RlU?BUI|+ILDVvC<8fQ7+wz-*1AJoA^=6 z>l!;M;X^q-zM~}j>zDd@y|*o|sg*mPk*8 z3h76C4Rq@E@wr#hQBC6-C$D9vb&t%*(fY{Ei~zXLq0{e3_XXpsy;!Nd?YjuJP^Cjw z4pOrS6yXE#X*h#`a20=&rnrA{C-_)%UP92Uu3$ARJ=&tmz)KfyyF;($twgWc2(9j)YzYL^WNRx(b-aS&8e3lZBItM6ZDzPNR-a7}WLXn^zL#q(t=))8}P9`y;pfxGuwA1MI~xYm6r|61orjU>PJKF z8`=$#Y}^~xC8CPDnih^4n2kJ<0x^Rd`Ii6z-1qgs&a>M666r3@v|Dz?hiTYquXe)) zLsv~j5vUV!3ThPb?B2M?p+BCX^}~NvTejszzST^%al{HUxh;|DoSyuF&U@=Vqf_lv z*0pGgE{;jcIn*wx^uujiYb~-|U^O!iPZbvxV&5{uwtl|4<4&mT9f8)3rFE8;__n>> zX^vW(MO657o)uPag_8&Qh!|`Vr#ST^NIRnKRV{0~)H5+Ygz05(wKQ|{ig!Xi!8y*G z1brVf4pOBiQ%)FF-ofZy^Lk(Dth=8702b0&q#it%DrpPD8z&`@Mlr}XMmvCW>#n@D z{f55E@a_6|tGcsvxZR<_si~!^hA8Jg;bUYx2Y$nmJ-tq-S+{k@aAJ~BQ2rr&0+s#NZc!&?U8ieV_W)K5e? z(95U+H%-d6D50Kn zB1FWZKYj%IEt1=aAW2Vt+(!Xu|y{{?=RMz8hUV z&X!<+msEaCtUtU*WdLW?>OWAnou81F;5Dy8JX4S|nb=RLA>^U&-4n$Ha@%`%ly+=1_{7ft6+OES~jWrAV+ z%nm~7J8c?J&%0qyS~EAShEg3qets5 zJ|viL<@NgMUh!HSmBv8UxQ13a3I|gdb>-XTjQitV&m6NfvP93!0?C}Iz{h69PxZ@OwXe$%wYL3OH&;pD7D z1^hB{R0G%pf#^HnXz_!>?hqC}`1jO`0#;m}BfqW&nbjn1C^k{GV^{Se`?z5Edgq>~ zvVdAu9Jzbojc~u(&!rTbYU(i(j$ZE{{O>Et>(jCiovrT1+vi|_ORc;7sAObse zBLf+jV+_&)Yl)~?yV+S6}<&q%3B8agXFu^gH6-_`T_0k1)+@fNpB z*Q|D2m~@6o`d39$(|w-0!Ev(C#Zh8-Z&pD9h2yYRX|j+hw$;Aod)8DoNRs_urkS(H=w-O10J9nOrc=66i< zAY4~XW1Cgk&3XJw0^gyens*IQ*;s`$a@);zWYyre)(4Az8(YOqm1nOtQ42KDvdTQ-T zUW;U|s_MOu&si8u3NirwHNWCs6j6d38i^&xK381lKDrtuTGwAX$xp{Tn;zOoya$oa zLG9a3wXe(ui9-DJzh6(yOOkW+)$xT+338GWW#YgPPjXI}Y3=l~LO%&O&JKgfo)Zu| zY7I@nq3kDbPh+9vslZ0A7Wg7=QO39*EeEKSMC2-fzWReD`f!DOW;pNPzJ^P1l4c}G zJD&MEFcRETG&MA})RIv$m1B@Fd+M{i?FcPWy)`rggqdz+_aytDu8&P#Y1}YiTh!p{ z9d+rdz)2ez{d27_xVIr^m9`ZVz4}Eh_BN*r9aLP4gq8jNx}mpkNVi3f-%)F&vD8gQ zl6bx}2gJZ9B}g65?XJhT&rF@8r)MvoYa$Qyu#Q>8|dZ#N^Wo8C*R_hO&2A z!lbsJ*;)(U-le-+Zc;4I7bOk`S3b-L?efN#HxJoMeA!w`ih5{k5T0MdjO35p`s=Ya zy+Ec_i4_rjFb#ZA_`&&_bse+=VsvNV<5Rgy(*&6h|8LXR7-lV=zyzhwU;nO%W zBV|UJ;d+mUc_MBg6Wh7hl2D2HGz!YzpkrBm&v=5V3P#A~a-^n=P}bdDjThY!%)oyn zL^tcMlb&k}p2iX?ko#*@#VJAO;f#-#nj@n%QHENN3B7pZ8r4SyV3bEa62u?5R$lrp zme>h0d{V{i5&In_(pg$s%pjGvU=X~L4_}bbYMr=@7Ew?ak;XWZbM(fU>nWlP2Z&uy zpa)v%)Y6rrUk)i^2-rP6x2`)iHJ46&HHuG=ah)^!8Kv>7vf_7}aE#)qP3#`Rjo;mB%kR zU1+r}W*8NZEz$wzQ|<0Ett+@93cv%A+=K6`=I?O6P)M;-%B&l>BzkH!Eq>vY7pmmI z`nEd(`D&S^1YN3rtno_0n)ydp{3#*qah#uRLc83pv{49Pr-g)_fGT@w0;0Cy)d?FC zsHA26J8Erm-00BNMvpvYe+U`=n$*Yx2w5bYydtY4LSMuqQ;sG)V_Gh)Q&xT!AgVLl zJ;D0^dRL^}m9-N*62=iuOY&S5(YhO?aMFjKtz^sPL0>S|y}L@v=aYm2<7bj7Kgtyp zoScsQkIPNFI)dA4SnDg7%j<^pKcUfUYEa!?Hj-*(^d&|azbzT9x5pJ3WVItkJspA7 z8LP-uwmTbw+x@tTE-OMfz`uiu_W5g5bs~7#qlMg~4>I!f)oZwF<~1Zk8ICa70W*z3 zN{W?qU?d3Mr2FZNfv1p=Wp`q&3Lc_M##9vy1b~mI{d79RAXl!SDI&0l9oeF`O?E>z`Ak z$Ec1@T%-)R?S}82eH`yQh|uM}Wcz8oAUh@6VV>qqQ)eXd^%};y;`uHQa53+#G_q0C zPaD)s9fzCrv?-}t`fJ6JbZ+0aY9*>zD_v>RI3>N0 z%R*cla-hlrkjVMMk^uJ9+IlG%g-E-cU~0zO-7>7ItL00^q9flRf*60p_0^GY>3XF* zJXSV5u*9*9fIYy#$nUJO>lq((#z6Tv3XryKTG``izI)#&v_Cxub#tsEr}x$It=kt{lECJch;>dLIaaF|_4U7T$_|*)d-q#0+tU$o%_grDsZFx6_)X zMDmQ4P!IeyX}opy&xL|equ(91rmDwZP)8SH-kHa?lkL+ujm0~t@8=i zoaGN6Pkj}R{Y5{Ps+KYjl;wQ}tVZeas>rBF{d17mIr`&5F8w8DPIRoOM|>Xs-p5QD zsN8Z=&XPutC`dO-EsZOJv}#!XFApn&`Dkrc+p@F8R{%Z=3}HP$KRq~8^p?IBZysf5 zAmbyk8qo&CdU~&iNqiN?TbiB&@;cJZLk0tuXK7q==A{WX=GUk%Qd)MGxxha9Qo3y# zx33b=Q%NKa-s|0eJzaBct6h&X#ak6a9_)c}-|6$z>rKOMQ7W@St06fgu5q8wOm3)w zZOT)$VfZ*yg>@wK=v%^Ku?{`QVWpb4GRx&2L+$m~N8BoG6>lSodU+O4QGhZunQ_`% zWXNTvr(ZeAO!v>zPm5J&%ob^MB>SaPhLEdfM`6t5k>3MRs_nvYl#z$aI=G){?b+dV zmM4Jcw-(C*pw}&rK=G^EZq1bZan6`Op&HW7TWw>0iNGq_j@dk2nB=dZJ@qE5Z^c@Q z)2S>0#~$9=Z>ZaJ^z0>qwPjK4SBcNdUeVg>TBF6D5@H_y*!;BbY3>p|l<-2U>UK&w z5fxxhafQ?=wnY^=B4i}Dpw-rG^b(S)jSsQBrg5DNnvG)xc;~;abjBmjOYwe3^&0fs>D+!Es(OD84eVj9>*QD=B2sy%8v~o zrG7PZ(fNikAvpu-jY+7A%F4~+GXz|Kh!p-u*H}!B?$06b_12+IIF>{i`H!BNOEcsL z2vq(XIpBmKZzw(cYY6F`$z)v@G=WeD10%Pmwx-h4Q-#Ndaqp|7g6cwPXeVb}p#U6b z8b2LWme8yvJc0IaO=+o_Asi|H0154#1h`h0emsfPG44av+ubqCzwU96(bciQzy#+y z7gfKm#}DF=*dw!_U!InyR%6>a8T8h#2%Kd0_SJ|Pd?9wKPwpyo`-<&UOSMaJe^Kgx z?$l}SRnm8Amp)t^>*`oclPeg!MbC8|v-xS^WZKrNOm&dk)5w^VZ)8V3XXBZF}LkUVM9J83W%$ zW3^&RT2UHC0!acceRb@iLtzgk^v*T8BX%VM=a+4G&^Q2*+w{=%?+ApdJ0xZ`BcCsD zb>}`R5FY*ghPQ<|0Qo@q4P_k}s&5ViW^YlCQ>a)GHbnr&r?X^h7lA;?ZutE*IjH1@ zLL^Qk4*kZpG$$UPxX>1+wf_JW3x+-a0IsA^QO8kGBIU;_ef{;iIyGqB+Fm?IZpXiU zNTj!{n0Bj!~dta1*fCp$d=y@`2du zZ7Rc*R;Tvle=lu$;BpuvzNa*57(dhV*NztlmP2Z(5PBaZ4x``KT8vHVazf~fU>tGI z2W@L;&k*?@z4a*{Qt+bFGs7n!?go4DJ@uxkBANVFcVfr+yPW=dl_YuW20P;#i19H8 zKR=d$wK=Z^Lz*#=RQCL_sFEXO5Ka%ii8^-#p4rxigd7o|El+FIEV7*A`f5VdFdPWZ z2c|WP#4(RjJL@=5$bAof+0sibFgQ{zX_2LqzhSE@ZXrM$&;gu}eOGp9JUIemKTk~R z!L~|ag-2`p2Xupo~`m2p5IL#vc!=@v&hOh z4C7cO8%3^+HeH0#1*xO&#Fo#trqd$=RfnPf0FI2U1BN}1ZET9%#ffG2_Zr|$HS)Xg zN3}tU1CV=m`f5t2AOX+mq6=?$z|XPw*0+y=?tXg0=i1!X_bM7j7aqN{tV%Co%O_i1 zik`zKI@0nFT=zZBG!~s$Shpg;4!{pxdL;7?KenU1{qVi@sLXjB3}@%5xmXH!<2{?_ zpPsT_TyP}y$M2!dBV*_FA6;g%l^`5``mNzgM5IngMn^9|ep=NWMKVdrA1`63%U0RP zERTIpjnIr^J-xMC?HB=K-Vy9Q&&%IhBvs|bQ}guHi41+PJNk`k4H%F!vHI$Zfkp9A zxXBpooI&^0Sz!e7EOK;Ss(848$N}x4a#ho~?dlFNbR?^2vY|x0WCfRy&N2T09c`$R zJcL34$F8uNT#Sz1+J!u=jDz3iGzH1EOMJH$gn3Q~`ghbxu5TbArR}H{4({X=>+?E? zBDdikyJ&AJ*S8AM+=mQCbft4!X!4vcGYj{{YueC8cBqB~}9-qgDtCkO?Xn z5(zxLKP_&jl=>W=`p&YMV#xuC&Z4Z`a6vy)qQ2_e6h&W=?T?W!gH_5i%FPL1 ze&1b7rr_Q10V5#mPZTGM91Ug%06e+l^3)0=RMh2_OJj-c-{+~`0>+%#IS$7lduTO1 zb0lFyVSc)uNpo@Ja2b6DbV`=*8U^LV<38BdD^{w+!PtMtTbdZ^gEA=X-?wdew({8U z;_vku6Yx@zx=Vve8Z4O|yPuw>yT;MvFv-v;W0_b604UV-VgMYlKO>+hg5McpNnzzZ z@vn>UY@(9G-&k`4E1o2LbEWRSiv?0#Ol5-kwnNlLXu;>3fK?XM)Lj!5`2ACUQK zB$6gE@2@#X5DyR$>~sWY2$n`9G5B~NLI?QiZ*bAV6uL;N$G04I8a(R5kY>pv&<}kA zyU@!#W`5(hZu+5usJ7BYSeZ*90I40l@vN;UjDQr*PJ3(0uO1mskCs1OPO`%r)CZNg zhCh~?NTf7TYRDvdPDKi)Ji{7`X;>DZ1x#}GC)ZA`XEoMwP7rbjk!<>prk7rf&`JP^ zHxu&p(rl4QzEUFjqlKhy#z_!69FJU|Pt!!$$8`(+6K!tyxm_A~>S__Aaq6p#_SDUi zZ7|dmJE4|uFBf6~Q}P4y(qwT+eBNxIU#@gw+iiJeP|Dv!qAeAK7n@i8l6xew3w$&X zm64U?Qm7QSvj9E+08Lod=n*Nzae|0F18R`jwyT9S(Y#LM7$D<1ye;ua@T=74Bm#Ak zK}Bm}B~AF0rKRy^d}QE#bqcEYK=F_zQt9fs^M2l=Q)O7EK@)K*K4UmKhaIkhNtR!R z4dLgBVeWnOpqzk5b@5cz(ke#Wj#Rfl&mXpiTx=JO+c09HN=k=Ro5XG+6d5^D-zTv3 zAFhnu=wXBjXduk7NrsGm5)ZC(ubS#DlyZt^<06cRR2Ig4yJ&@u6$HOqOVizfSw(fP zy4)ISc;yg6YMa88k>@1_7DN8FK=#4W+SlpVQ|uDa->sB2*7pjmwTgvuM{XxQi1~x4 zJF44m+}3o4uA4IevqzO4q+sLa>-{xH^+w%CMQMh`M32NP{8&i}ETrRz^7@hM^3&mu ztZ-r=VZOjCSvx2dC(-Mz`(i zS$2%}`Y(u%Cu(Gpui@fh%kU#cj01L79w(REN*4<&T&ZHS*(_|4(q?IyB$8Jk0g^|4 zzz<>A50<`?3gK^CWHl`vAXeoX3@h>gH!OPR>+?T7bz7x-fTx>69q?A2F4gI-%BAou z)m2oLv{1<#y*+GC4NH$v;z~HV9)ms@J=Zz!r`@U6{+#VwPlHc(x?blX7KmGtDHcxP zlHjal5yTE9yAM;Ye%qTisY&Tnrvy z`Hpf31GYVVw7E2KwuFu)5PO}%E!DobRPRebvfHhV6mrJ#R3xpD!Ge+x_m3s|06u!> zO8ZQbPG7UiV)G#uaf_LrvnC;RM~NCYaD8y!JzLbDXG?_?w0E84Qi9w{yTeA}Y2$2+EAku^dzJ;j{{RDL zX2rTLFk5!4Q{1Aq&z4y!BN6fhu3DraLNIg0fyfWSPM0ROH+ez7RT~KzE1Y(%wWGPi zM)o-C<8oF=9mFDBjBzeQ5HpWKoZ}ce?4E^e-IulY*WNZN1*Mv3{3^NKgEWq(2hP2l zzi-o0V(7J!f|4oYvr^4*R8sEhg+unqQmU9fxIA>FyX*J1)}^D0mfaK-^GeXc6kH*U zl?0N`{82qUNgBba)eTk|gmJ^t%J--}U53e9TR}$ERZ^D_Nli8kGN&&w^cVzWWM}*} zvuSh|)9_R78d?}3nynsasb@kd$#7W#Uf4zC1~5Mlrj{&Loy)#AWU#|)rk0)*XxgvB zS?QI}5=b}!$RrNO*FF1c?z&R%t6eQIw%5g9BGdR%BSx_XaDUDmXNbpaXIb8Qbk-hG z09 zSxYUZ?<^EC#Gk^Mqv9dJ>`IScmVJHnn(KaQAHD51y1#}M0tTp6z!DMJbDZZM-(3`f z@3+<&E!&>1JLKXwsYsZQG_j@xX(u9B5COpLmG;h@<8|F9zEaKq0BsBP$Zg%fbD_T0 z)CPFo25c$fNe%2f0&)rbJ@ryuEj!m@*O;QFnvz+;esUmE!B2iHeS3{MRBl=kTRqa- zPc@phqC&C!8*qv=$8`m8Pkd+k`stfs^(wJzVx`@E0e zqc4mTRu*%$#)^^lWF1AiZaN*yCr_?Bg3T1|Nd;1>h-s?{0Lad8NL6M8jD^qb-Zg<} z>7y0YVp!EU%_zdgiSO99eZ90BryE9HwMA7TtW?zZ89pcAVu=wWbL!)Vy9{K1$2w<{ zXy9n6d?x-Va!Y55sP!cNqt{$LO#Nv$RW7U$^qEN_`F7enPLgfWZ>RW&NZAC@#vM>& z(~ubhzBAv~T(#B?r(2riJXExm5=m7PFY%?saE8IkfsFUb@7uqoMs;*`Q+JzA)wt0t z)Dq%S1W>Y{4l+-#xyc8e_1DR$xW9_Cw&%{!tcVx47l`2`JNc*2s zeKfCBjAS8*8PST$sT4G2`*-!wIoafH+0WBk8bwk=Le%hr_$R;5Q|T!FY{%PEtQH9_ zY)OsSy3RqxcI!c5* zYy)RaJ8tp!Y|9`39Q$YvaI1ycJ40mb&Y#dx3d$v#qNT72eoEinbLAhlhi^;GJzc=l z%~bvuiGa)8Ao<|xxU_Z3Y3)?@YSoHLYGH`W4=^LszrKcD_i9|HGDP2xzpk-#i8fZA zpsy-zp7bsA5pAz}h{*255yb0K?k1c!JeDIl&XJ<6tzbg8WAygXYh+VMLrhL_>8M#q zNhqyda3dqvL2BH}31jFzbVh1&426&U-(2Z`1;Sq?R zC;I5~ZO04Aq9l>)jeQ-2M;YZA<@sr#+E&tm%|i@|L}0KZ<*2l_e9mzhI67xbYZfLY z>^*a;%dOp4yL7U|w;N8{YQod3FH<@2;Ea>#apolV#sK{NwD=-??%2*!q0MV_>cj(=}ZdtCEJA48+zBJOt z3QHQaMPN?rBC8PClN^95K<%zk-TiRuPT{NZ*K^cZDG>}_9ipa6c$_ir#D*-*>E9z5 z?Tu9P#Zy&0)e}u5?(!CvXJXAG6Y5FsN%@_2^xg{M@a;xNqUKHFgJng7>a)7suUnSo zQGC8!Dy|iE4qj>MWiISVC%I#sWS-jn2>StU4ZmaAHMN&3^i-03YEvXq$WcPD?Z=Vs zOY-y>@7rIV2~Qw!svEiX_0^ryi{9ay{{TU=P^?sywGo-#USGoEP9z|A?Vi~8I_UV0 zkE^CJi~;@@9TuynIFRI(`&&(XwN*r^Pgx9%rwmoW!5Y(XfojnBcqbmZ<=vgrt=+Zm zUwsYWYw4s2)Ra`V`A`K&&vwhPcPAd*{{TI7mdKKNoxev>T~AjHQ^LICszR~@j{Je{ z5777d>%mJ9jQLH4?4pp#?+QRJc4+)>5!AB}LVdO53xXqJa0j-SZ&Epv!B{dqnRFuU zTSGxkC1qte86Xp-WQ7O;X^t$&IGha@r*@5dz6ZW^txLFQCVZna4C5bP%TR9DyM_R$8Df~YxIaY`lS-#*&SD7-`23D>rJNQ#LeNlTtN=bYz7X{hCd zfbGe1p-up(Yim%UvG4NN(o>vv9-1~I3_Ud#XpeEn14CsUCF+t;W4R+iYA4{pk)1JC z!Ir}xUu^@pQYwzxFz(1{4VL2)pF3yr(E7WC3)xO{^VU^Vm?VMvX?nYuBmhP|wF$LE z6`g%RY_Q4vw7XwYhap!VQ>^M_bqou)Z=QhHRk-bvPxxxNLgvuI*H>HNmccmsXk_)z z=4E0(U23YTW@FzV=ycO?1cnFG&}oTOr9H+)V#J>R06zND@#@XUoP7?4Pf?Gk)NxQx zxb@RnfRy2A#MKcn$$sSi+SGwvyJY9nLB!;qn;;mdN?%8XF$tzuwcstMMUp@8ahf{{XaWq#vpvHO|7t)6;I;*5xeKbf;@x zcSTHfRC9beZcq&IA79hgQE%NRwC($~Jl5ePaieE0**W#?f#^QEW;Ig_tW~koq_aZA z62~38WM^A%`>x|zSs#yY91(C;dz>F$`qbH{vF5_c?K~SvtlF%1w@xW4XO8!8p_7cS ziMaMvIQ78!{ItDr>6%=iilW=k#x49$7b>Ij*G*gP?OQ^U!wQ(^QQwYAoP4wn>9_vx zlf#{Hp7_R#`HYd^Djpuk8!CaO=-UX4)pf4Vj>?Cy*6T+`YUGoZWyqool?prl=T}$3 zKtKRv9=h8dDyo2|JanPrnuCi*?+nwPS3h66RdtTwDeba&ke}z6fK>kg$5Z3!wXQle zrfSI=p)e&Y*c0^C*->s;zs^Jm(8`M(3b+6aoc7k1_=M65C1rMsIGjjTg(lXvTbK%U zCyquN-2C)$ZRf(_6e^{c%iG^g4`_xWJUD^YvunyOLSOTfaVCEAy& zspT<1ps({d$Mw*Zv9gzi$>)+7dU5@A(A5^mglCLh&&X=4-IiN~RUR!B9L}Nq%2yfv zb<)#n`i71dH&vuD4=zwGw@)Rq;UC5?goE%gKa2O(+h%$@-Lv7QR`A#mc^@{b+C8%O zYG@p%hS4@jW%bjorr}RQ$v~*tBfDd<(zQ<#d%T3rBMeu36bEx`ovlD=)=P{uqnRNk zC(ruov)s=O6=O$7Byz&OoDN4H`*mXO`(?_qshNnH2KRpaPq%F&UTh0RPG_iv42$I) zbKGlIjlzL0vaxD~IJK>ymhHCzC2$WTAoWt%z}BtDnQFwGlfsdFte&2lhVckyW_ZH} z9$X(mt=}39207yK2wWjQ%ktM*tt8l7@^eUhaVRGzupXfL>n>P6QbtFvvxxWL%ikW} z`jZ{HqN<=r6eQ;!gH50igG)qmIAGW~^zEWiT+C=8@D-GwLObZB_KI6I61>5rmCs@a zzJM7R%JQo5@7!vd8vLl|5yIP1Ab&3bpO&?8R$ni_uhUwZLVbH2>)6n_7{*D!(d_{Z zlD7C=z{u_O)T(7t%gFW`#M8VbOZqpV(?-*!wp}V+hp9Js)ah7bWLU8u^i= zh?9)>qMI>N#Hm#i34PD8C+`9k8R0L?HE792g)@nn%ZKNWk6LwzNfYk z!9(m<$W-)OHnAU!@%c#k_a|Q+p94vhiLiUVeRXeKt#QoZ<6b3wMukab2wp~C#oHt0 zrZ-qh2WV)}3bu!0Ldx<;1WWjbVVw_~X)usPk{%9m$S=06rl6ghf{YcGtC#T`4AbD&TmE z;2e(QQs^1Ocx~NJufDtC-NN(xM+*q;GRg^oNC#1#I*44UiMw{rG}Ua97~6p5fO~wj z$lG$Bwvbds!K6LPW54ODGluf4LR>JbAdMiwTzA*2N#YU_bNTyf(U)gX#cBAtp$gCV zaz0v7s;7dGu#G!RJ#uxZ zOO^1-xX8m0b)l!aMOpzhnnX@*#4omWrKk`_8zlDj(;VVgP>833j122gqtD||Mh9&@ zuUX#GlgBrbI*O`kXv8#i25j;}6j^iak{6ft)puEM zxKlew*2qk9AM;^D0sjDIiYXlN<`huP8(3+lcjSXpLuM5(;zb~Y$ARX{2Kj+J-MeZ5rFm}xDRn~@4sV4y&F9}&BfFi0NQ z$=90k58|H=&{*BLj>G-%y=R4g2zZ}}?K?KK=Fj@&a_ZAC2l!-oXD^P}&u;p~>D2MY zJN&!ry1vK%0BHXJv&Q_RuGm{!r?uM}(elb9-8h2mQ1NF2Zl$Rk8)TA8TsS4 ze@^=DN8=hPg|cSX&X=B(!8}3&1dup>SNbZV=TB1&WQkI!vSjiAj>q)WFAbFYcOCTK zzWQ~&x_fhu*}eAtRjR6?4A6;+y3By!vbq*l?~H(QGBb>gD>4vpNgC?H_~(p1G6+4w z_6kHa|y^%l7Y&NEJcg)P`LF2&}+m-9>0;);{3xGjYvJ)+d9P}4aoXu=b_n1n(2|nZ!P(ZQ$%=A3l1l^KRrZv7dgT0+aPLCIY(r2 zg|uW7mF`Zpcq~+~0DJN)&j0ft2-IWH{Z=Z!}+QZXs4A%-lHrF)M~+L232 z%s}it{WZFGGRjGh0Oa-<8k0mzkq-{%u{ukDrJ=7R3q&pS>k$qymG#l+YLyTMYz$+z zrP=m9%DN7rPP&kz^%*Beo&ZPQn8 zO#^_p1pff{8Rz&tJvHjvmM3L&3;B&%Rd&jFn6zr74}9rf<3MMeh=DmL+tXfL&AEDp z#2S`rsD#V>HNZcnfYwlyI8omxww^xkkpPFnC%=6_thNxvv+tn>(>C`=H4!lF$G`Y$ z1EY8Oep-2!(vr8~AC{m^w@z4v!S?!UT?GIn(oSVya8!@W+g>zop!@xF$u*hRCxHC* z4r^4LNei5M_6I;*j5MHSxTym^n$;tcdt?tz+95p?DPhEcjYE2Kf(Sf^r|qCd8nlKX zi5bpwsZmw3XNmOs>N~~7PBJwe*@T%aF{lcyg%OgvNA+R#I@9q@jI)mC8iulW$9!j7 zJTgyy_&FN8q(Qh@OHxR|e*WK04>P|!k*P8&k1@`3sLq`5=k?ItBMl2PBfk;ck9~O~ zqK`5R<64V^Y$(UqI@Hr=vCwx!2deT;5;0}<^wtec#y)I2WD_{)a*&g?Sz$ z8PgSIHVby{eQ!>7QLjo(QL0 zpDE96TCiy=%;!8oImV*Cag1jgFIz^a*bAI`cF?(_U@$=#`RGybqw>Z(f%DhJjzM1k z0P)r=tPd|!uR?;SkFGTb3N6u)a9DTxYuO^nBmzEJ*0|1C9Qu1|PvRK$@2dutZQLlW z11fyW?ef;-oS)|XdutgN3{R*dSO)G#9AoFFHzL+|wu+RG-?{hH$YfGN5P2+^b#4*pdS9GL}8nd13AX8g)J3|W+Ohokkp8! z%94D#fdrWB$LINKYA#fAJ%~CLJK;!=&EE$a-v}qTI5_?F9u`E$W2tdeMV`t5$G)$! zy0k)yLm2>$-z_mwPe~(jW(o8?^rwag3+R4YnNE^qFmuRz9a5B>gcRHgixRxukr?zQZu+7fN5gYw;}l6GC-(LW0vEMP2{UF z*C}?%M_Uam!tpTyK?>gbUfefHW0jIPI04%neSW&IH%-2#*BCUj60zihF^2kTzql;b zu@hW{7#xfbT~I2jluJv;Q!w#}i_9{|wlrqpUllwdSIiId1CyoIqm+WkduQkVI?dsk zlq)d`zMvfv5sV@5~h%V4<6^!I=fLgTJK?G zRFGwV($W6_yHI21$?Te$)R3bZMcEIhcLYnhWREZds3y?gZ z`fHvhyvI=>_(mfbB#)M-+qYblm0m1v=v9VBbCImFH!Dj4T>;J0x~LxcKKhYKFq4y? z#p&y$Exo_euZmPWcs;wFH&V|Wqr{1_8{~AN5r9IGUlbs$tb_t`NIt)wqW#@LJwnei z_i;bCdb!xzozhHQJxXnd&J+j>x5XFU%iN`)Ol$>{+hT zQnf3zu|(=8jo1S5`|S&GYFa)+5$s7h5Im5j?8-!G3lKKhwez4vX0YJLf1NZ zibE5#M=G)r*^)ux7sw!R7zfwWIss2#yX3i5+wN7eB>pD}nOR+&V;C|Fms}rAk*}}9;(2q!m=T;^rqK0jcT*aR<$Uf!-8T&Kri=80;eO*pL6v(+xHEs=QA}P-Zu3N z4<8YqE01t{FX^qDHp5vJBr}S&GQX6Og6c9bFvGW??hZ$`HDgiRDd`jr0GxN$NnB!a z7i#OWP@&n-Jc|*Bj6`9uKdz11wtXG1ltsk!=3!8gGImJ-$0hk6%l%HR;g=zdB|L?RS4co?k%DpteKb!a-(Pk; z&wUD%hu*5IsVO{LeK(CJeKDTe7N(;1qB_Z{DPw#e4mT)Nk6e+0LGB3A=8A6YUrEV+X-_*OO-?GW?D^{@RsG zVWg#ZnMd(oCz$mbl$3x(5>GkKa(#7Vc2OkObkk<;+NIn#3v7Nfq(YveH)x$gl5^OA zLC!v-Lax0l+tk%2w(M&vQgD$K@kxh}!RF`(zY&s7ta{sWRmP|pkS|~twg#a*R~lTv zqsEB#%lE+1HSQb~C8N4huyK{wuo4IPqFQB z*GUDbD%$3etwYt~R&aoY^%(a({<>$i+HJPTWR8Z0o&}ymEUOv-8QbwO`ID*Ys-p-1 zA5C8OdaBqJE4qHl`y+EwHM~_xYo_r8h?e?j;wyoGIS@(h^Emow4&M7L^q;0LCgi=u z`;MZTLnSxfvIdSZjCY7(9ldZ^AEq_X?xmw;Rw_uwN4BWWy+?bFh6IL3cteE;ktF?F z>!z}450iEh-xCL#vYITtYuokJO-VYfGAEWZf(LHe3DusVP}Nd3w$pksFNe&uWMR*) z5A@eM*4=AR=4suUF~xFw06t$$EM2!u(j%h+GCh0h#6s|a&m>aSysmOoRZBFLO(Ac@ zOJ^rlz0#>N&Y?;6?eC&DTeQ-L0307eetK7^tDaZOp~tw^k%X#IB&K?XJca@8etMlp zW?2D6Q`^w%bqj`YrBr*I_wA<3JrqTjMgXU7{@T6DU@cZHsdYqGf|z(tKqn(7PZR7{ zsexmW;ZlGe=OpWDU8$&}jbb2$#sJd_R0N=wt zBQi$h1|!?Iu9+{%9JLK95$luRLg{GydXNhC&+Ifo-l~IXVM{$ydNUF9)0Wz(UijAS9+CRDQ%x+ItwVI9bAr0M;ng_$OJaMK4U)FuG`Wg5gbxZQBg$lM{8#kv z>8?$OeDB_&TW77_t}nB>Lh8=>>O3^`JDRkJsM)ze z5{QwXm#Zl3NB|E0nC*<6PuP3zJ5+0Ar=eO%r}DhAOkX7S$tM5|oceb8>(}XgKiJ~B zw=XrQ*9}aR4K*g-Yj1To2egWJNghuR!QtlQJ75wst8-(0o3{n-1**K&EhKda3an8R zAU(gm+ZfO5tDmEvXWP$ErMGW*sj20%+v_=+lu+Vn7d}*AeVB~5e@uOK*IP@Yv9&@9 zs5~gZ!6O~Mn&<2MYop|d=epaX@SdREDETfgu>F)}nrd1qO~p?N1`5qpZdpPh{6u+% zPwn5|R=&*p3sO;UTTbk95C~+BK+={N^u~vRuMS9ClG#N=NNVCp z<7n5+K?AV&)fsQ<)%m)SOGKMZYpp*PAgQQFQtFwk=TBVeZ`NpHp z?%;841?3u#QN*0&e!78Bkus1wpQ+YWB1Fz}`RGMVvj9MEPkmVRLQwmfsuIDm>)%Ru zDFZPp-$!mzxd$vs(#>NzB(JBxZ4l*BUAjvmInGEvx?QcQ1TvF?bb9MIc3#-Vl`bTL z&5qdhIwfB;I;u?Pk;XJSYJ|xd@9D2==OCPCL8q%Ak z)CZ^qfGzL)YD{vHo`)J^eNr42(I*G(-|3>XlM%(60DI_6b0KW@^~QB4$6RyB?WYfl zLG(Py_g2a01qT6{hNTziwoE!%2qGBkge2E4R&q;K$1Cq2d zDBLisYnIxpvqj@u<~UQ36!y|>-lC?x!pK>jdmh@n>g_N(F)mmilynRwjXYHUK{3NF?wR+5qKM zl^af~2PLA;J9>Y^Lh2^9(6__SQ5s4}0UfYO`e)ZxJ@<1{$0v^qz|2pX7~mh*RKHU! z^}B+(Yp5W2l&KD=zlY??N5AW>aKqF-d@PgCvn|SVvso)IQV~f>DFd-3NC)ydjkzs! zwzl{>+GzoA=HNbAw5gH+X1qpN=_ z0gYigo|J?*aJLOFRxswCS03DU-sDKRS}13DWI0d<1~c>4&|7J zln&+?%82TAr|0LSvUf!c&~4B_0nfh_f?uLzf%-c-yE|-KY@=Ei|4Tl zbKD;P0G7AIs*%(Kc~~aWF@Tcnh0nLW;As)!dTC=WSVln4eIi#2)msVVX&N>;#(i~V zS^96fcWpR|g4jL<9fy?QnE*K$_U?240I7{(aoCsLxe21JfPkNmlAP!0ep>FsED@S% z7PvA+sFk~%4JyU#%~Y5%gw6&D_0&rHWjzi&bRE~QU-;>+?j!KnM%-R8+XEf+nO9pa zM7gSrS zFy2h})27quz2|r=)7uI`90$)ONM!}RhH!m<;i5Ht3*M1a8lcqDkL5AGRgcjB0Ntg# zQv)5exB{BkCVO{=m0UbtUqRcq=c$yo*%=mh7*c+H@v9!I?Df4;l8SpoM&R?P_=wN| zA#cw zBTG2q8@!AUZ_8J&NcNfA^wHH(!39#o<;YCCH@VNSKKfeQn{E%hO|}w{2oLcJF=32) zF0VbSRYPgF$4yG2M~HVUd*k0aO?z+imM4$p<+{bGuL>`dvM6qE7k4jl~2P+tW=frV?Rw~^)b>+$s2OwdlTPS)k#Zvi^8m4 zEQ83{^g0^zTak94pzX`0O=W7ksUz16Jr1n9b!t~LK`dwrV0{jiHr0+Kfv53?WA|Z# zbi);zwWW@ztEg{mdh0%+?Qz1{rem5DMIAfJfnzu;{u(D0EAhiiA@A;W7LVd1j0oZb zw{Sf_eG-L>CnjDe<*sXq?7H!=6|Je+Mbz%Uh@BMXFrq!ZI#}kg()CrWSz#1mYpJS~r0>7xvh#yp^H4I+B^X^Z! zv`C@YFR?l{LC6C{3IfFeX(7kpA5PlQRckd1!kBrZ=Z%1Zu#V6p(p`w|xSV+Y?IDK1UsCWY@~e zCY%p-C&NugPGqST@)3IuL%IC4vAb^8c8mo@LOU4vlG*(;s~)!3BOw@ziMM|;9Wd!QVO{THNQ6uhtowKF;_TDf!@v061^d8z+*7Z#yeu%`|30A$DwxB{{ zJPrWw=rpT#+tl$-A`dw&+v%r@-ZB@^F_VF~`bQt+RPghRRRV-$P$-)H;@q zotXM|@0~D7RZo+}aDDTrrr|tnRywvqdjK06+{ZqsE_{MJw0~smGb#yd!$%aDEZ1q_k6>l|N;h3qux!lq(e1e%>jv{F+?85~$LAdsJtW9B2@0O_X7xA*PhNa<;s zb3oByi1Li%(<|I(*nz11x_>i|)T@j;R(7y`07-K6yLR8(oh2eh03@DVv7bSyc0aQY z{Jb*BTO}0)2h9BD20{MF*FkK~ie9JNs|8<+Yk3?J(Y9QG+4Vi}eLr1VJ9nnva)wxg z%2_}rcPt0Yjc_%8#P5RH6Nk}yJs0qNbJOQ(&&6`ptL&#eB~){pr8P!7aFneEtJPPfpaTQa(Usj(ZmM1Giv)dbTYaPTxTB)ySOZPcX^I zQ~v-T*Fd_t)f*>FHte@MrF}g!vN01+BBV6Qj`K>y;3)PUtZ<-r?dAMS_>)(ujIr!x{ouyZ)o-~2h zUQE0T1CmKO16+O64a>d$!#`*>n(1(YDjD5Urf3o>m};q7Pb-p)LZhm_LY_$8-GSDf zHl#e;c^v-!2@^w#U%2lgj>KnBoC4jHWAf1br@L&M(!oo)EESQ|(p9cik%M7}s+@a+ z{{U`@&mto7$F{nSJF*uozzjKaf7;`scV40Gv46GQt6pmiGgU!sjxgy{CI?^%99sdq z_x0E3%(TpsGDwW9zEZ5XDo3#g(ChXFPCW?j zeKqffKq@=?X#U{awVP`3Rb{V_6VW?ICy|t7dyYUHA7kz`H{ttaclqn-jc|KIn~+z@ zU%Dq2KLjX=7juD+%=Xb(w)4+Sl~mPmHzwoZm%{`3YB+;{<~xI}iV85poR3g7PHF6! z9J{+MGEh%XDTZYu2e`;On`^RH-K!#@wouPkRU=^{i3_p)0M@AEd1UTRGoJeDkFxg7 zx!dgb4aaeTQl92fX#qK6fOl_P0CGQU>zU%(;o63n`GTGKWzk7~lw#78kMHqal5Raek zvGx5mNOebjTrPE0QdUz{B`mpyINm(Q{`pdS`}=C`-J4Hx)kf8p*eK=@g7BcsZ`ghk zd*}LUo9YKoH&x=6n!PBi5u`qNGLU zb5iLU;t!|GSO|z9;NXo|GjxY_MO-cMLMI1;q>-sA%-+WU0ouXIAU zBj#8VoR~oQ7tbvHK>ZHARGu%RfDP{%UM4RB*J=qYjN|fL{T;rkkh;^z%A+Ll@{iY8 zd@`Zsj!Tc_*GbrZ&NTGU$^EOiLehie@Of}Sf!hu0eS4p#wjPu13vJ38swf>qeVscL zlzmj^82V#aB>p1OG?3G4rw{P9vCRe46#;A78;<7DrLxgd=26Hw98|B*C$ZJzv-ZSx z+e8%CI#Bg0gPD*9Ap4KVY58gCQZAyeCl_a3^wX)4m5e9XB}et7Mp6!!>YNhAx|i1Lx?^%~C)jOw)e zLrw=}qHhDy>Njs0J=Y9Z*=z092AaNxqMBjr9MPEA56F#S4VU7(azrcXopmo&dT9># zt)#ip*Ci~J(HQaIgUl0>NzQZZKV4I``x36tc$VFXCJ{GgW{{UxcSQ3@InL8C|k9{&)dUtWDXy*t|ao8q*T#YsDjiRQtp5W;O z0P#!$h}O4aaaXlrK{jCf}t<2coWOJWXxhRGuR2d0Uol7cw! z>;q(E9djS5E2$ory3r*tke+3ZK6-~FQ6q664*j(6KHrJ}Sg<40*BV;7+9i$4$0!4q zJ9_I2WDdgUnB3mTSa{>)%oP0dpp~8!(-V*vImU6L4M6T$W=8Msduk2CZb;yWg_wS+AHmLE)E{ZBTGN@n71KS$SM8bQwLpN9c7#BMBm|+Eko+W8Xt+DF`J<@A+x+st8>> zpvS(0)=;Tzh2%9#>e6#W>ZM3My*2moLV`){qjfYZ+~DIq{#uFf{14zH6WIG|)or9a za%1N8*0+h+;Rx^F8YS@Lo><1UJQz9odyNTDAx{I3#Jz^1)I>o8J^i$8<2X6N$F`wO zP70U)nj1ufNLjm{_|_cwgP%`bN}fIdfIYo+5x^M0_4Uyy-D(vigUICme!BS8pac-3 zI`UYD;vW9`(#p6b{XbnxRJ@ogAEu>B!Eyr(>MXd)$?kuqt*R2BvC6Sw z=3PaR!k%6K09{Fyie*R#C%1oH4xUd^x~}S3TB;DR1e}BE^w9aK(MNxleKj<`dwlh+ z;w%b*>!^7Fd)P5X$dLK<3dTgKtd;b7k51yQ_Yj>Bb>(~z3tE58(Oqlk<>N)qvZ?3*}?UU*6tt{mFk)}rMB+Ama7X z`FGan*|G<0duk$#;0zCcT}T|488`&#mb0m`u{anx)Yu$k06S=WEJtzqYGe)R`RZD} zaEe6!{@D5IV4MUQC-NE@6J!88`{Pp4$7AoRv_VQq3t(ja`jHzI^cnWl6q6nC>GIa! z70Jhb!&PXh7pI*605f(!T@j8#M<9I%rk9{{2_^jpaiVd|Lg$~Z2Yp?kAsI<|b}fUQ zVNhK=h9l*uNh^-o&%dsv#LXg>BO~SV(#w$mI9f!clF~j8wzgBvBb+n#KfX1T&<4m= z9^JLB2&7gd0B~{n=t;g&fkAyyK_rAS3rRpe-E~Z(nJn8{#f~F zF4G1wiPBO=;YlBt(@y(pIH`ng>5``;eDtqvqICef06t?(bX6{ZpabM|9n+W+{h9lt4q` ziJo4?iS#6DOIqrOXzAF4=rN{hEw42cfzWb3r#L;dO1edYpNHYct_H7iUeuFIYIC$ahKJb`XwY$v;Q?novDvM$|hBsIf0J^;}|V~ z-lNc;T@j(a(Ojf+LS2w0I}%9A z?dhXt-$GGgN@&n0bP71}{ITikb!L#+Ia0e1q5Sn*b$mfbKx<4+<$(kR{3jm2T{6(^ zB9+w@wNw(Plz&e^!aMrhXoy$ zu135|PG@2lu_xC^x5bPSzwXgzI}u=sv^*iQa0kDc%9ihf=&*E(bYX8 zD@_(jIQr_%ipxcPrFb|fl}2N4koDioOeCFHM)kD2wX&{*$2LTHFmEFs++`}V-mR_b`7gH zXj-Y-Atb6B!|u7xby(Y*E}#xUeFwIz4YgTXr9#WWeKCy#vK2Q5)vsiMn!253iwHm} zLC~;KF9Irw;x>Vm^y*K_I}>m^)^k(e5Rs~ z=T7vl(p8##tbl?9gSwn&81JvojnPpBlK%i*WZ4_4=T*0;>ik=DpA_m3kPdiUDPS3s zm{E{Bb~@jn@MrjdChEQzSoPj6&kvzj`L5UdMt|V}mu~J_&5hEXy#;DpC3Sv{-Q;BN08Dw%vW+fGKl1bJ-7x8%f zJan0tpR(QI9vJO;>bndF>X`QS-?nXSzeBg}l&KXp3<(Tqz462Wl6}u^=igFcc7(gM zU=MONvaiKq#T5GJP2#QLUxz^XBe~bk+~VW7uXxsgC@*X8;wLf1#F6N8p!GY&<3b4> z#)H=US1c$vCsEecWn%I+PCE@jUDX>LDEB+n!sjq|Vv&RU=xmZm@^T=s?lgKU6tf>L zaiUb)Xvd7NERR+ia4qb!xuoSr+P2zLFN|hlSbh&oXxwdGOIIXvz^0x~>cHiP=c@j% zd>akcrk0|W7C0LU(VxYlHy)_k>C`<+_-0kgFCbWtnI75~G@ONPZ~~M0sGw+!QgJGy zx4xr%MF=J++yk6;J%`g&wZnhZ)l^3fzG=J(v&Fpzef6CV=Bu;RHA{jOu;ep-BlXk` zSJVWnv`GkY9}dKNpG|FCFC)mW=jot3PjlJt^s3QI5S70Y7teh$%>p3Ez#0?EWnNaI z+0UFD{I!Cr^1~25TEcJ?0*Bw*P~K@1-#9+{5{*f$hmw#nrOMiVB!V<`ZXhQXQJJhTnN@IhkcVv(xYn7MC)XaDR=CxKCyp_uT8kT$@r>a2{PYH6dW_Y|qsrL;{LgJcm7nlCAIn-ydB+2tJbJ9oAr^-4NAeV>)+Q) z2}eAHGMs946{_J->X5+fPt&>61Bgo^)691&c&Pk(NIBH1k~5%D^-p%&uF%j>?fFB@ z>l&3Di!%@az#gQXIqbfcZo2;f4qA#?k_kVUk8N996Qgli_Z+ub!buaXXp1a-nGdTU zrcN>P#Fe)Xq);{IZM<(V$jJ-DeAs$}^wpgf-Dct^LNn`w z{d;MWhKh~?&fmOJ$RbtZM8* z7{-HDS)54C;c*+vpdvE*v?fH4h^aj5y~e<3IY9? z7Z`)go?>t~{Ix!tr*!JTtXas(E#FPF7N&slkpLL<2j4|w445218PJ(rI4Z;qJfuhI zyhb-@xd|9~0B*qjbFFutnH9Ij^elcLFYyL@6RQj}XUImgXY!tG6@AI})r~{iY$$Zm z)l%k*-rm34s=gf2OzPdghOGYprZpy)r+bRyPP0;4L{3`_#NhsT`F~ws^;NcdIQi7n zK%s^~J@lzr)m^1+oWU&qa!61I*INd%R}U*zGop#7%;j6uZTkJGQ4(Ebjz}dOR!-^z zeqP!OxFe^M;E~hF32}uyvyDFPjs3OvExLO^sKZQ!V{)9rA7=dze_w4Q(e%2mN?2CI zdo|J??L59ioP4r$_+$j{lLcp*D#UpSdP!rWt2X&*T3Oji81z3~N}7$n?^g^Wc`&3h z=OgmdzT4?t>FZ5J=0FTlkX$xF)VlqelEvWwR3Sb7nsfD0i~^L+BhE-l{X4Z)+ir7Q zBvp*ysPnNUj-+1tZD`zy@e@V} zKB0%MwJzhCU;xGlV})=%Gj>GmX&6;){{Zakv;GE9 zvLZSL~5-m6lE#Uct^LO^wo)5W%zDO6ns>AXj!w!eB3|{qV~7E+sYH8YX;T~ zCF*;PJ%W*5c(D>-vkYK;bVi2jXWem^riKcIQcB1_dG@k)8oS#Ag~zkq1ECO83bn^Ekq7H(!wUKV5o_ z9B^wHla=H(vQMIr)fBXIf&f1=u707l-UI>GHkpXZ z{{VmX({|8@a@1yo+Ull|u|6CsUQ$P}QInlq`W7*_YH9pVN4NqPN9{Y>Iac^&^Lr7H zb!^)uj;56*@VNHuGp>K>?$PQkQ+N|vsx7c9s>>~WY>(g6qWk0Y8o%u{642V|sAZeP zk{H6gm?N7HQ-kw5@|y6*x|(m~y{Crndu_mh@lyK(fB+iFumRWHJ9_FovlzRT&wqV$ z>eo@nXi;k>RL*hh@1@$^&al<|Dz}(=<573@{9A2ORYl%VaGu@IZ6aCka7qP4&d%@n znV6h?2D%Vw_qTZqm8jKhcGjyFmhZ}`WNETbwtc>OWP+h&KkEqDbhFD19NOd>KPDv(pmn`UIJ;FJTIbeb5sjDDuWi75&_P*Bt08yP{d;9m+ zJdQE1i+1$TRi) zk8`8dbmaz7e@z6q2jW0hFWl$ltqhdB^0CPXV8B9d^)XUIh#>BL{#ro2K-KKQ=FW%64NEdH2^_!`kPx7vQch zi9M}x5#)NP5=UDkoJn>7cLPzTiGT)0a9h*st*>^gfsZ8$LGE#=uXhgP#9my#rn_y8 z+|u)}oq%NJd@~pvGBNen%~5fFDGc(*pG8*fop{r?bwuV4qsuCc9F=AHXG{?lnc9E{ zDdT5sJN5Fm3VN-_X`_;3%p}evkPmZ#@AS^Pw_tRxlEp&_ti07+-8{lh91wm=y^gsj zru)*O&3B}VN_%9~#qi5jOUVz&o+J`}gzLYyUgEUgtrX_i)Jq_Y86c;W5f|y|J$=T! z2k~sWy*qm|Q*a>uALl1TesZj&P#{jY?S21_14>^bdOP8xFwQ_Z{E4 zt7D|L+aPJ@na%>J8u|O3+^?xMpkM?Ws+~))^s{W#?hDmzG$uHnNS1j*CJ}PZ#QGwR z zH5+!+k(tt@iM6n+~jGJsn?ZY1^rNa5>s1lSlqzq;&cA#7sLC?wr9 zexGiZzF4C%~AxD(5ft7X+0U&&@JHGKqQ{gGnTdf5vLQJ1|B(nI3?a5fI z$O3V201MB`;Hfyuoifv0Xk(zfTIyv=W?ITqQCCq>NfH$(1VqUg4}EgP z#67P$rLc=>0~UdFY4=onPia%`dt<@7s;%*@#)f_|*G(id%84_i<#|hzjqapMGyJ$! z`$Tk$tley&x!X5{dveQBwyIzIHnjp3skqR(rzM`IH}FwfK%57dhafgQxv}=DNw+*| z`z5|AWvxau@be1tv}+o6kW?e8Fa!gOR~v z*atW#xl!LF5`6}mU_i$!jj4+}mrKh;n8y*@-$JV>lfR+JKDuHt00}yWQ39Vq>Dyb{ zXs&FGu(^A$Jp*n30DiXJtiJ_qk~pMWg;7Feo3QYgi0p7d86;pIe@#=jzJ;w zQ&MfU2;n%BEkkxCTmg(J83#S{uVvugJ1ZL9JhJU;eSH^!@!#Rdp6BXfhjZLJS3kb% ziu^Dbli54tIyXVH>n@b4^fcZx$c96g0{|ak@9V2>{{Z$^-Zr-a-&GA#@GQnf;hx7B z#z&|Fzvgf??!nks&9iqFebsB0n7`qdIY1BhSaxlDxjbh~=uD725<4%RX}kki%|MG& z8E8HGB@L0#&Dpp!EW$c8W;ikqSRXTjHPwAR+mdXJwGQ7mIcwG*z-7iG&#JHbInF(G zvd3qnwbQH=5Jws)z~C|YolllI2jcCo0ph+hFNnKi{oh6O-v;nVJT1H89%3?WNqUx* z!Z1*CjD!9<)g)Zl4Cg;BX{SRQ7Wth_rz|E$E1hthXyJMQ-N!3sJPl5z3KFgQ>IK@} z6FKk+lP|*=XsP!di7gPIHY+u9>Nn z#ROcB%<4sC!ZYNLhi^c160WB_m=m9TogVVzWdLYsq$=e+RYw&Pk)K=)>2k7`IVLhk zA@cibea4{3&a8Oj+vlM#I8s-Z2d;F@#APhBTGdrza!~=JkTOUR5=`* zzIzd^R=%BhHO2>t86#lFC-Dt39e+gbYFz#vH4UdKYR}VJJB2_unvWJVISUah+w1=T zc8N>UDhfK)sj^VBqj`>BD!-<>8k=Qp%V-JkXvyptWE~Kvq_R?}iVJ)Zt9uB*8Yw(o z?mkozcre@|qV2Fzr}Mls*Ey|1H?F=G9Xt~FuRSc)r16n4}q zow3diNji^qz|MoMc`DAHf}c@owbY?VW+9yS?=+s7YM?qY%(5s)^J=nT8L@oEZ6O7m}6!{46Euv@1=@}ia8E2M{EjUQUg&=6W=HNG&*HM2rcQR3F&)hkj69~vK$gY&(!M1 zR0N>Yq3*~}W9gjg9I6N*hKjlomG7MDG>|C=3z3{-R((_j1gWJMB}NW=jSQX^Q-D8B zG0jiNX9NuA2T)|B9oySM$|MVea>IJ-O8|o$LC?3#MCvKQUnhS09W-y8`i$x!I9gp} zE7)LtH4dQ{J+brDnR%fgXD3=EQdcdZB9)AxQ>X-tXOQivj}YaI6Wc_mL4ZL%hxF7| zLEkOy*lNa99H=rV;(G&+Z9|+%lh|r`ULg1H>!`AG&wot%YQl&_##EEcKP+lH%sfN+ z=;XBGVS=D`(5l)m3%EG%^U(r0RDDzl-AO0EVsWS~-GNc->NO^HWbd4heL`m=^zW)6 zMU+tZj7B~3HM8NuunpMyXHnK}BoI$?t&LPT;J4@7LW}0UnOEBy8&ZJh)6=#!HRM(t zgM*)$)Oo^;usPKdn!|(|bnHMLxd%}2RlhwGn0n{XduLE5;-nCLeTIaTOYTRB82Wtm zsj>+4KHrwIG9Sb1^g7iyZ#H}C*zBQr1TFEn9myJy2qa{V{+fv&m}j@wI*^>Rk?E&{ zV%AbKl`13Oh{x}#Y2UE+@2GI+u_GVx)TCqEkD<<`qNO@BgWLM*Ol%h&@u(3yEQkB%?e7$q2xmazfkhlaKoaa*GnSTf$OoQp6(Kyd=dmT)R)8(opC7Yh9TO(2%2tEAFuMI#it3u8BRTZdfz1%BrK{M zKAIZtoCXriwe?a$JUF|KZw?5@~idR4yb35Q_boQu@IU$3n}0Rnyz9v6ps*)2VspTUaOshEKA$p+gIIFuolVp z0-*5u0zvQd)|Hghfb4v}pl3^Lc+28A_Xh;(Sh$WDUfRAAZ`Bd5sZKl-xF1aosH|Zh z1ULlb>lrGQvEMo$Q#L@)>#G3T5>}e3!cG+Ed71NuVT1D5)egDtPh+U1gL;2WFf|E8 zsir{K4W8Y!P8y!wvVZK-Qy=Ulbq*4Atx9< zVeO((KLq*xH9#f@(qpB#2-KqxPhp>)q?)lK0wfBwR-b5TfibLw?&>}`irOEh(p&b0m+CoG|X zU-Urt(q2FrOLMnytnIf!H^8H^<%q#8>!XcV90g)v*~j7c)C*NvGA%Sxw8{tK5s(l4 znw?QfIjq3<9f0-LLZDJXC2|LUmZDUpRIG}C1q=&he=okbB(fPoFzt_)w|b34T&z#0 zHpT$#G3l*w&Pl`L9@_GvsUbXDzI{e@5raDhL;8B>QA9(hGgBKQ z#p=GGWAfEnCQvz8MNp>z0s8A~wLt*OgP{_Msbl9V7{{hqcF{ zxA>F1bv$#1Ag+E#-yg1+Tel8bH-{6qgd%<0YobSj*pj640zt^)KBr4J4fO?V2Gs>B zq>?rRaV|q1!OL>)bPo1rp{kmKc>F2jJY5HWukC}N)dgw7nUjY}Mv82R8F!vNS)mkgO(k*-|O)8)y^TvLDy}rJ`O;y)RKSjA+BJ!4>K-46AV$uo z1fIjbFf*#ttkk=TrrPxDOd651{6I7N_wA$#{ljy+QhBRoS4QNm;xHdT25>z+hMe|B z`rWcajl)MJ(%B<;D=d-Z zn;?%3&0!yi2%S5i$*%>0jiTetWkfgU*{Il%|#omV#~;dz-CyB}ev4ib(M zd&161B%OHy;&2=>BVYE5CaFct7@f{<7(Wk9I7RyVFaDk!1T|t&FaINnw5``1bg6WiJ+hsx%=%uw)f@Gecu(L6K1BVSyHWWBT7toIlv_V zIT^^$ZF6O2%G?w7amq2E>V(jGe&@2vEb+_t&WK{{R>ET{sSC z053JK@PBHYxH#GDxRa)R9p2ql+^}uEp<%AC{wgJ1O*}lJq==sHBQaDSP{b=REsPHO z>CUeI0O0GqZHpXNPLtlNw=HrsQO$0uNMV)12b_r~B~HhWkdI9FC$_q;?A_4n?uPBl zrK;z7x7N>jtQQHEikQO`5^xG*L7WuAf-tM^+g7DSEh86JI332h+VA2$L$w>U=9)hL z05!iw{5z*+pKRjXe%~d@e`9WeZk~}}V!mJ2>29yQTIG)8Yo18F2;Mq^6@XlpB|?yW z23xrV4R#L!%a^{egeYE1k4)2A2mCd`)#{(Cl+7n4ceJ`@X(ACvz*{P1XqPH8 zpf&TEpA3PI<)ZIV;!F{I$URP@2xF3C;r8#HXIc=Kh805f3&+@Y&ajHyB#b;O*}IKl zbEK@E^-NER@KFL>D8^gc^wSNw>D2;+z&(LFDj`rgTCH}}iY`*1&(~Y-J`tpv0>K%h zDh{WfDm{jmF0wkia&g6p!)Mc0)kh1QH?>rD`kJeLRokCtQ|aGIuOX?WdHEJ9FbVh5 zA5(2rFyCclWpKkGlw(NmHC+;(K7@A%(Ca`885zQpWZe_nYhSSDqD(W&uo13w>2@ZtS*tO z>Ja(a;L1Zn@tG1!Dkq((OfTvK%&Bx96yJH*CmPmUWC*DqwK_xb341v?PYFrHV;T zbNGgI-mSU_3J ztfh%|g^I;XH{MFgQyDm1_CHTeDA!FJu?bG7gRlcl`~LuVQ*H{zk_8c`uM?yx>JmmA zJ%7hfU|Al0R7#p?oRjJKYeW=n$QAU@zKTUdS5OND?XC3or{$SkC?3Rm=<1RPv{P%? zMRinBNPsST{EoT@V06CQG|*P~ALfsk40rtXOYJ!8W2;E$>HKc_0OwsZu&=PtQAJBy z%kd67MxLwl-lS5+!VF)OL3hZo_NMyGCLor&Y4!+ zrQUFvtLv&vs|`F$-@A9uZ~Z~9srMZ;GWd58kn!{(PBWpEv((g7G;tP=H5eVSldlm> zit%^@3Fyo-lcC#%cS)e#sM%IjlsdoRE8jZPHRV?vP?7UGTOw){W^fsQy1o1BbQN&b zQpY<2nf2%FbvAk{-c-w;@}jiHvQ`j^-iK7jQ#$ijkTs^;P_*yN=1BYbe_b5vJxmeN zy-c-=VNCH~W;prlnD<@Q8tT)+G*14b+gjp@yp@t!oNOiucg^;>h-hS4I`iE8Pk z3Q{UdGP9K)VdymDx3<*) zynu)@%0`cEH6Q?%!1V3kMQA9Zi;f2zeuVur`z;kZ#$O0d52(-=wn;p>SonwNqETB^o)G{HgQ4wn<&((keLYy0@gCYSeb5pXQ_`0n zneV7+LKVk_77l)1`Y{s@%tn5ikOWKTQQtZsNZ~Eb1rBO?IN|gAX@2h`LK}~_sM9q~ zQpOJ>jOR)>nwVFU$shpd)akH-N<_304&vN)$Q;8{F^Sk7><%-k=Hp36aipG^;Nr8l zDC7i!TRx$Or*EF4b!&3ad~u|PMQ6_}uW~V@-J^byYm$zxNu@&mAReF$`s>-~d_BSu zD{xnZ@h=l$n8I?1Td6PBTGyCQG%+Coo=-x#?fPrBIv;7Gr`hy%(pegk@LF{p6H zuMm$MMx?_ELcNYOr_oJiwG~;j-#Xjk0z2bEO-M${wz4&=pHZc4DZ$`!if28+)(Mv1HB^W>N(>IN1ZpUhYhZDzq(RGm z0rc0p*0K#{$PwF75FoEe$i}p^V>;cOYaYi?8dTs4jXgg!!icKl`8(e)xnc&qbcBa{MtadRgFa-8GgC5nn2k|7Pe*OIqZC!9$Am$coVubn-J@iVS zZbV0zA5T;3u8;FQf~j(kg>?;*x%#TjR|=Vy85fA|G3~D@r>lTv23QZ~0O$ADME?L~ zD5oBHmn3oSzN7Wh<@==1SBYqWTy`t+)8X-GTxs}Or|@aoH%FCFo6TiP_%p%)J-ZAH z{Pm_qs0vER%sxZYPc?lsyHQFML*i%Eh}Oz|i+2tc;*DcpUoN)|Zk!7QE^E9yROeHH zwOq|lSI3l}?&xhrjw;9=LJG4V!<}4@)881kC4OXfAZb$fvo98^jIefyo+?70UzW6K z{6;4lX{C=<;d8OOoZKpc=d>q4@`2AM)M;)@6tEH=Jdx>-U0(6*`>fIcU;$Zz^7R8J z>7tT!u9&dDn> zKBFDA(mpMxjuWVPriI1+Nvo4mG_f|^djvnD9U9ynMZQ!~M>SQR2&kH+DI)X_m#EoI88IM%wlp~-pKLB|#JMFh4KeEX7n>9W&mr?lFs zZBS>zrGhvUk?(|1qdz}QX0&0Qq?NLLhQ3kb9zCe>cb(>$*e|;O01tl)>3jkqux^vP ziuhchbAgZ#p*sAm{{X_x_NlA5-{bo@Z2I7~`*d;DZV4lQG}R6{M+a{}szG7yUmo56 z07^Qsy|(vB`ggecmAD&?4&Ap+T`GfvDMiZ0KhkF6qw2$7&Q|u_ciyD$d)D;7)EbMW z^0s@8Q|Hy>V#gmr=stiAdHD#X>Z05YmD|7gIt>krU~fyE&eD})s^LWZWU6?%ENLqz z;gEkgQV#~f?mnG4bFZ^cby~|UL{{p_Clbi@U&eN05CEoCA0ZTEhQ=~UJ%+ij>}4HY zA58Z}ByoqPma0GDEb%M53U&M|Bt#N90s}Z1Ab>laUX<|DSm=d)&gD#}jv=U;NF+xt zFw9vcUPN{o;u|<1;Bg*XROcC-<=us$v4Pz;z4mEdnJA&Hs>w+su9jHp)Z~(ms!%tG z9FH&nb|8-9Kr7|6R@^JDF+^$PsqoonmVr>YP=TW}2aSsnk`;>MzhFBZ5Jy*gj#{6N zVGTMHC3Q#)l>C#*Bb8&2GU1OdM1jN%oRA9HwvOuD+lTJ$v0(e&x|)URWv+r+WTk-i z5spr=Gf2$DFCR`MoD33%#`#Xr5f?S0$y;E&Qd^?DNZVK zLSrRxa83wK%e!nHEwtUQS9^s|_IjRpmZ9m`PE2KhR8Yzp*>TJ(5V%()eAt3+Dk-aN zwb519Rt8wvybMiDRZMKh3noc1@WEvFIKa|>Tz6$94^3}(&Ff;4ce7e2juon-9(su* zG1IS#--{A543ux?>@rAXY~0`oK<9?4YjJPhjrCsBS3dQ)S1s1D>u9$9!r^MCouj2W zkkW|hh-Jus5AhS-GUt~aB5XayN%mL!SW(>e-Pvfih3ZJ_D5<2a_=lQ^u|y84*^W}l zD)E;tpn%yqI;MJKbKM5fx+(Tt4NX0pZP!%RntGX`Y3XwuZ7v|;&5%gVnF|8B1RmOZ z=#KlIUYFIi;@P*WC9zae(A%D-)`F%wcle1|$1-4+Nl0aG~us%Tg>z;St{t#Y{St4k*RR!C1 zSAgC`gwVjAm@O>85(y*lt9$(c{Nudc?s8K@da14W=_{T1%_FnUOn59Ak8B=!&PmRD z`s7tr)|2k~DIvKuQdHC_o(QoZjTThouZF@B70ymQhp%l5wemdFVvr3J8}FN4Thwp2 zw^(<5$_sB#&97zBARa7{$qi((KP()}GKB~*J1PU*_dc5IKePV;+6!-WFKE)(_YUZ` zO}*&pSk}>|BATit>?)QolMHg>*f4Iub|00IRngOYTX-_f9Ms&)&iRrVLvqS84Eb;d zbNI4OLB@^RZ#OT!p}X0qt)#lp(3zg5j;=`LAUKdBG+=RI+>e($j@(YF9b?-2d9ar* zorSwvDSot7c$FokDpe1s&r7#DWM<(w=0~6dT+7hUwlvdK+jeJHBB%>m>q|wr!BNTb zMk>=izm#~3kDDm&$FuF5PFmD1?-(Td5%|8K>(FWSjFG#eD~Udp!0m8I&_gGrQQ&G+ zw6eyaxINCS=Gs(Lkd_M>D7?JiJtywFgcNSHaMAE8Gn^0)@23fRhJsOpq%5WA>5EIn zj}hyvrI1rFBhAM?`qyri>ncK*!9JNf+joq@I26J9X@Moih7>y6!k+#w5svy5CGabU zW|zIrLM6cHuA-pl#wbDJ-gtK zraygMR6By%aztu7j1w17!BN3I#(h0~HHJo(pMvQ_AaezrsTB~(D+UYMeZHF0Qxq!@ z4cWE5>zo3iho`PIK4Q(-$ldg?6AHy;F?p1p+Q8fb)U2h%WFF_{HRwX#Op~a$C?fFt z`uzrobCf3uwgyR|4j;r;9=_U*S4Bs`nZqFWD91{+&C^X~f=YR!o@0>66yqO1T@|I? zG*!r1Adv|6W*_6KEO0nP9>OxJyX{NTg^q^vGg3ElkLnJBPjYS;S+nRrJuO`~7^;Jk zI0PSKp4tlcj$ksj56o+8TDhhD(_HuViHQsjJ^l1LTkNxWgCFqH(_KubxjwqU)sc*! zQ=I49PG~86lLU84q?Ke6;|G>W&Y39pR5g+Kb0Z0qdZ@@F{u-|g`F|-VCrlQ~g^HC> zfEb+T-0C`@ym@!muL7z`eGws`bC4GvTe+f?|ApV`T zrr}^t{tuHYgWJ9|g5XUp8%Y+Br?}Bd#T4-%dXej))2A@SMs!Z^wjP#Na^;uTzp&7+ z452F=jBq>m(YGivFjOgHJ;`6wQKV1-;>Q}9Rf30+AfG|$tpXh5lM(XM0jwb-(GGPg z*(8zj_S8y}p?!Z(T~DcrkT)k%2iMy}W}QxWaXIzvsEA{fI%Fgj^aSb)Am!`a9AIi~ zM9c}o`}Xgl@<>i{J0EeVRUEByL&=E%f5TB^PyrauH7CS4!1o%#)Z>IZE=nlRnT$sXF3*dnANSjzf90GU$_AwxCk}Zp>NU7qWCzNG=T;3VRumL&Bh%MXVwnE` zFJtfZ*8c#3a6*yk*pHU7N<0Dz0pCszNON+wLOTFXrJ~~){I#wG033ggq$-ZUFg^8P zl|ZbKGQ$U3(MZSy6Rcv4jCa=L3=RnP)hh%Qwh`&`#-4h~5DH6k1+!6Q0~o&2C@x3;Fm5cD2^chv(*3hbmph1&$3O-5M9oDfC^ zaj0l9-93)CJZ{V8KI7k1i-4ykTuOm50VlSIQPx1&&u|WatR1o#_CEUEACn$q>)c~g zl{igwwbbEbaL5x ztaT9086$1d}G@OQzx7NNppkj zbS|!}DzFXp@2jK^b)mIka(j3AWBxi7G^~di_w>|?y0CIV_t1)pg3d|r`sjjRDrv3a z2OsOG^%b3gR{Hwt3)Ev6Y$(^az9 zB83>iKIcIx04*_YaABJfp{#w{SJfl!9=zv=At!XrV}ZAj15$k!1WWuNG8g zlw2qdmTT^t|(4_RYa*Ys_r}=fRXe`Ni#=d*{B0H*mrda-M4*8I?kuf$#G= znN3WQMkMFmlzRJVQrU3$s>Fyh#*X+ryW>t0JaMQ}0r>-=B92i7pA|jxll0axLmVKa zYk)~_)SR71d8*&NFN6obEdK!8t&&zHItHBJW4i&{I*MA^;K!Vh555S_vnSgc(G6`p z>&`h;gX!P7)Jm(}JTKrvuQb7xcp~SyKR-=HXp!?|V^C@=*4n7#j(S+}FXAcyC;t6s zMKx_hNGj=4B?rn?i6{31Ta8UB%3w3bBv1)nLm+z{RjJAyL$)mT>DH#2pNp#C9!KZg z{{USPbV&gMKokrdeD$<|dmjD0^`=-=;Aj~`D}tnYb~?MhQ~@m3?VY&=-h0J#KOHRm z5u$83KybMW`C~sW`j>jyJ7;lI2x@3!wf*(-=Bi++91oR8&2EvgDI9Cx&8` zIG#S8kEU_-(zEVe;j-$5s_bNfG{eQrh77))kGSopv95h>c2XQeIT%cEbTe$n6aD2~ zRZ>deH-L2NHs#tDc3qtYD zHEluSVud*z{QXC7Q>OSQYRH?7JH(meiC2ju{asU^D@{F9TN}N_%=dYLf+Jd4?2RhnNNQ z_9r;TJ^g!Wp79Me(kHdDGfL5!5b-5@eSN>IDwxEQI&GSB*>W;J6 zDJyE3>FJhAsTF*y>csZ$HAh}{&DUCH^$f|A-`7kbD%7;6mPm*s zt7qJ6bu~GG)XCT${m!tanq$Q#%dRp$dLZ(`s;U%>cF)gLp(}b^JSGvw_|K{OX@~)?FfgjqPscQqi6=bQ<)V~V%4&B4NX`#o zq=vY((vCkrL87!%0?U=pw|xl%vX*UGHmZ2*io9`>Jx+A*XP`h+f^gz{=SllO!1T%l zrC%R}>eJhH&yUDMlAxZ$xyF#}8cyX`eR{aTWZH7qno8DKVi}s8{{WgknK>Z+JACxv z_95yO4)*DVRh~3x>#Q}e6zVRb9!`A!u+qrN50R99Xg6VFWZbB-G zX#{bETyiqL8^3i!C^%{myPRwS_}>#P_=6yb@;*3u)5e8>0HW|}vC2r_lYIbCIp zlDsR#b_Y>{862?#zNSc-JRAX^L$5_9JClL*)KNoV5S3Bf>lj?C6UYPd)Vb+m&pa_< z_0&a#vl226bpTODt7%Cpgy8nkD{KnX$}#AB=jW|r8f8<>!C-T#)Zj-LRbJW7hy_%< zsdq#rMo7|C@@Hk3%TQDdf%Ma~!Ci38jP}qQ%>^NUhXXz!$;tN74p6&=PhNK29o8nO zsG35=VM!R$^nE&7nz0FR=vT9!p04P&y*&Bms~}8-LFwu5^ViFbDl(F$J52z1San2wJj?)a7G4o8{^(Z@+n+;ckDF|yh_tHGwbQ7GS+`99^h*;uvWZW{(3$J|_C5RP5tHhfh25t-C3XWCQ=LGqxilyI z>Bq}Jn&e9k<0H@wV>I&Aj}ZxO-r6>|32t_2O>2QK$T7w>^mWbRDGi_!&ms~Vx6i)5 zhPlRYe=o~TXrpN*-ILut<|-~T$lSA!FUwMDcZ}8KavmRUIaBI1hLf=&na|He=~+tw zf=N1XqLx5R3v;TNkR7p~bFK8%H7v?LN4~Vu&=N8iC+DV(zqP9BT_$j;AFfzwjTMr! zIHQ|#ma4Kfd}RRi(;>9G$K;7zk6zvMLv2{%g+GTd3+mbS)roGhP*Xu1)4zzUa&j<1 zI;Rj2w<%X+PzmZ*2Z`XAunEMRll1!P>w~AV^QNgaG8tnYV#I^}G>t(evfp!B`+Tgg z3uQq$$<@1I-S*q11T`;}n2rP=pVL{TE&~biwWr=&V%t>WKMrrhjCTJ3w_c@~Qaddi zq^KXvGBj1HVm^=G8Ntwdg~C*G93+MJKQpZ0lC+T4g&w+w8pbAdUQv&2eQu{m^-viH z$PDXLB3WOXoR4r$rzB!Ak=wR$t3%FK6Vt}LgB1hUIt5u)AytZ=rA|&8%kA^g=kMx0 zbT;Q~_=WKjR*l#2u=drr)T%i`xmEHq33(_7x6ezL8`T^rlN$C3&4b|NDfb^u6s)Gb z$xS?KIq?80u08Yg164KGXWnLxTYM=q7jn;x<3Bv>Okg=>neJ{WDD^+83s_#&LpLZ> z`LW%Ot2#O%}2W*ALuXl7?dm_{|7g~@Ons;SP5CQkqg|@eS*3O{Sg5F->=nb!J-0bxJC&TkY z+>z=ucGXE8e8M^Cj~4ZASOZCM1vC?QM;ED=2@IU0UJvN0{G(fG_uWBL;dW*n!;Irv zquMld*?uhS#~}L+3$C(MQq^-s9DREXX)db5dr5C8mK)R5j}oM>BHrgm?A2*Bf%s$T zohRF9XPuQek(1b-*wd}5f;wQT#AJHu1wEXm7^8|p8J8pEb+O=twvXQw##jw5Ah}uVt``VktWYPBLpD3HA5s4RZl*mB*W0qQP}Ivj;9=u-1cUMf0o&=W zpsv_kZYq;iO>3t$EI4y?1pPHrZXS`+TP_mURZ*d(lg-P-Ba0L1-(I^*<1o)mI19sT zJO+I=$UNT^xo6vV+r_F|euPtQg53s)Rvml;>5B400=7JDJMP7 zPJ4WS(ru#KU1?8+r)j<%K0*g9zdc#ob8o?Xq(2oBt1ti@cPCl=LF{{KL2X*REwZuT z#A(U@0B7|UEzMOGG#(?=5zcUmOlYIfmLOw4ENSh7H<=epJ4a{R_T4dPK=_Fi25e)H z_R~rdM{|#!yl$Y!y!5zU{{TuP>5i`}1#b*;eE$I3ubM@WawW5aDDX_dezPp`W;nTqWV%~s8GGMDz;Mj@7x27>nSTE zk1J3v-BEkMrb6x{nn`J%rkJ8)arM|qo`7FF{L^06V}XOr>6e^HTamF zN0#k0GB7eIW%XWN^{ufNeAhkG^v}UKP61L>te!A7iY8lcZTa#qegLDglu}U}-l+klZ`{U*?l5{=9NW?K2BU9QP zXuXk@!mnl96%o=gr?mzH%txo~q}%1TYnv>o07w+!z&>OD0A{aj3}YR&4eb`@ib&Fm z5M&4W2d=ciuXIk_a5o}h9N)a{;f(Vs45$T+1Y;2dLx}{&4!eOJ4KsbNM{32C$RESj&;FTJMvE`St$*h3~A* zw)!xz>~x|R;9?4q z)5FUn@wQ3N<^KR+)_p^$8c)-UBG+YolWy00cTKkiSgEV0pf{F(iiFMKQ?gRVS)F5( zJQZ*|#z5jbk^t4u7U{m!+NYdLFQP= z1j*$MMM9Pp*d6jT|c@jBjGhDZ1 z)`T$2on})6w6X?Js!W6hA=eBz=Q#tvax|%R4H9ql zO=|!fRXMdb-Io1(pQsj_EH?VOt+xA4zip)?l#x=xP$6T?B(nbia5EqoP)>NA7~MZ+ zorkh)@$O5s_Xt*+j)vVL(!(qKL5d#;N)SgUISv%J5~@`J!r+pA+IF-pS3yI%E|SST zK@r@35odBavoAMa4gUa{yBTxnbL*>m`$09j(H7acS0!Cl$tvTZsHvIV_yFz{%1?>e zL0n|zQ}K4rv%6gB9fxDl7e%8qxygDJOG|C6t&ZOGWg%*sUmg}&u&5X-&&;ZZ03Okw zmoDc>^qnr;6!waJ#kb*>`9*StrY0I^c??G%#9%oNB=_~@>*XH0v+Xvz=r6UFd;KLp z+&1}zS*8^;$4?X~0ymUFC{PLKo_?h;LB^eL8^)whTVG&`W%#(=;dZ&bOg@>wkobfz zkS~`QBM0OhB_jZ!EUcBwa9inUDe5Y%ltP-a6d`^YJTO$@N#cWv?Tq<*<0R+4hPBR1 zQ4z~qnIf0QSLJ~qVe)KbOpkcqiA27U52~Y^ne12JO9jkxY^F6-%W~!oa{$6qa01i)3La^-K zhqx!xLo7Rv`?NO|vvch$wN0YuZ*PgCtfpd*1grRPM|^hxk3tCqVE66m{Fw`%A>D!( z^jiE%5X>=-`lfgNT(wtc01?3OQGz=Sa92vd@T2vvk~$i0pxA7Cjuk@rLXz@N)iHteWNeLV47>6M^!j`=72b-j-g_FTzWVZk<)u2-0!<(~eBKrR(aAq>AR z{j@H&=Q7S$!YVWAjaB__>&DvYbsO61YmncnY5YoBY=T#oKzI2L#E+gd$);wRyWUcw zjnlhpQ%?EnmfY$6JThKpm8YsWiWpEaKHQm!3mWIQCm?#`I5?)SKWQz=TP$Y5x2WR@ zKZs+RwmBL|NFXl|K_?^}uh3&u-NSL#?<2|cXwpZpa;;N{rew~`s$;WT5c3? zO*)r_@g%WEpb?CBL~M-UdlUI<>x@uMP`(`$^sv-BN5$$&0#1CzbDrO~Z%eNTUpz_3tlZ9X~bCZ|yx7W5pyMocW82cS0e6(5z~HwePAp*_U`ztx77UWk}_V zu^IeJ>-jOq$mx=U?KymcBOB6C+}&J{Pp_t!f7e0J)|DCf0B7l$8+ zCZ~w7i4UhW^inbT_t(`I)uye5?spDGT=*)Z#UV50_Q!vg4{uL#r!!Nki`;qrQlF=S zLFQmx27cJ}bTLXUTY89?T;ZaUNY#)I{{V|Tj()43V10B_$@c26vDFLBiq{L(amtTwQZg%ifJ;dAB|P~9}ohqBLT`z#1nuq>Dy3F z+q7;PS?8yvf#j%)NN1?W3022+Wc)qB!0a>I3_Z1>zA32NPkA3izhHnHYXa|$qyGSe zQnIosZabr;a!YBZg_?S+9eUJCkDo3glZYXS1G|pLkk8@O#j-xxpJ$!*@U-;1{tH#Y zsg@styGHb_6piSuDFzJ4-Og$Sciv1WD+6#?DtM`dOz0rsBdh6;~ z5@sy-Y1TOgc_*P7Gp z5LKu+Y=BA53Gex9u)^5}<{Jx;=Q=l3f{Nn1XWJuoO<7Gnb+W}R6=G!4Q+UEy+mZBQ z=eP=eMh-`&x>I5GD{OE2Cwm05qtYq~;i!y8>PSA>IrQ#EM{%wIrfNDm>wlZVQzUH3 z%}8bJTyiVr_4Oy$9mcIarPLZ7r*?w*Lrf-;nn>JJ(#p}vQJe>kLgkl_5C|$j$v#|b zfu`|EA#mPpzZKe_!{U^A1rWPBM3NWf8iJ?#Yiw;igc7*}RZSn-i={JHQ(G%86*Mx; zfuw071~^-YC0&%99GrT4e7lo0eSGPy#!EZfZ(cPG-baj96)~g*atDa41Fl$O@cV=5 z-(G}jpmsyT;vGD#!C_WRO3i_Rocem`wKJFEqq+C(s8;BNl8!8_7-d)-f<9pBy2WLu zmZ3f=nE@lX8r6!*LqR7A%V%CEuE0+t_P$zF|*RGP&e%bMn(= zMT!aH=8QmK8yX^LgiZ4WUDTwH+Xo}J*H9#-1F%v%`r}R)D>_7lJ|HV<+XNSzs%i0yUyY)xa(5?W^3cvR`^&qz1tHW7AP5UOj=% zG;(A_QV9P5yFzNC0|Ym&a5YL&895E+ zECzq3pwu}BBfdxNqBRH)a83Zw=}_e3x7R|bC~`3XjFYGn&QF)+sndcFl#}urA3S8_ zocH$7A~^~y&+0j6+v+t5$pZinr+rIsLlMij&rzLQkScSZUfR1r0)|tMazMti%H#|T zW4F^;OZb4|HLR+m0;H4Ndg=pV5b~9?!WkovZ+_Z~RRJRl>5WZE2Olx?)*Xl#^!6u9 zvuUF_LRKjik1oUwW#RM2J#{*wF5H0gW7y|dBxE>jdTJ|PB?>wmj{g8XOQ)kyr7@m9 z_}2PGQsqeX8Y2ZiCdgl3O;;$sXe~tt_Yh=!v^(J)kKjMHpJ{E8xh0N!Yin5Im&{}S znjq@s1I45TqH;SgeQsNHs5u{B%TH0*BOt2B{WXJG6+l8g`<)i_t%*G;m;gZU@11Qh z@KEEi$EVLs=FkDkj^CDr*3h!&iuOL5z4oTmECIv;oa0*nJ^1&>sMgk|b;Dt@N3J#E zAq+APrlq0_bP*N#eRVE1#&eu@_12VA+XGvpKIhZsbrI6ujmJEXr>3%b59BqWrYb!# z^47B<{%?Nzr9+h|X2wbFgNue)_vYFq-I+nSk~>oXpAEH^Sr7=b#i*jv$sR`r}fb zvyj3+x4wvaDzs5m{{R!Xz#YDt**#QoMU`&)3-_Os89BzIO>k`BH`h9#uJ469dhW-+ z(?TmNRrwIv$IIVQ>T6G%zo^j3>JO(dGpbZgtm>){n~!goZ%sgwQ=TB_-|Md=mpRTm zdg?KDEO1Ho)zYF?QaK}u?SqVK#3YYTQP}I{3_iW}vMdaS)CErK!^_iOFJe3Y0N<^Q zIWJ;PHS$M+pPA8)6<$=RfGWJn0~(nKKn@4j8i@!zLC0V@6t-#!sd@dg*U?0WqS^6pK~1KMXL3BxuDw22K$%kEgzw?K^!Sr^`k;5sYI- zZ5vz1t6tzPd*@gkAzfI8)}h;TZ&%hxixPr;`*zj2X{AeDJaI^PFdl78vREkX^r#_- zbH{en{{VxHMVtR{Jy*a~5hd95Q9Ny9Np0ILP$xq1XM_OGR<;0aha`hCPYVecY9D z*(xHVJY9$4_ZZcEL9pKMBTaU=NSuaw2FVB4Lr+?T2zxq@~kV zz5Q&K3|Gm;*W7o{>7=dUx#`X1T%qP7Wbp70az1^vOup?cR0LBn4d{7j-MZm*t&$2z zk)N5zA~HMt^e&5LQ8D|%e14(a>6CmmT!AD3Ksh{rEb3QN`k_;`HtnfawN~v=re6#{ z7YYIMu>R@v_V3(!9ctFE6mClvl4voBg(2tLj`wTi_?z0(ciey?n!BAW)OgrJeU(V zY~-8(ef00RrP$k&nwH0Wohl)%Jn7jbW%GgT=zAO-`uFeat}EO0R|mJO(hdsW-t{9> zt`xUPDN57S%CI=|AYubx&OHMY-%fUf%FrHemIrGDCgT(e?Q1pmJ;7`>%QR~X zWmUfjEI%`)3hVuSHPqYUxl7^l!j*H4P_p$-x)>7KNistaAeD)50UrMVo}GGm)D68P zrc3m)1L_@{mRsfRjdSJj`5^_sVQGtA$*5jc-A!LV!iK1<4Bojp@2@U*D}vh;+ENy& zIqvdtRrwN5HSMPHw`!?=B8q6-dnq~AH8%=+n4SYjp<5vRbpLg}-MwOMY>i@BZw zd%WJFo#6%iI#5p&@+A9yLshQsy-ioPVALx`8vkJCi1G+z&0$v_}#O+&`?poSdR0fu$5mP!0jGQCU5h`sl4BvC_lhN{ljdpKW^$N>48eR_uLA_0SwECenF-<%fzp5PTKh* zkzcs&pI@GuuNKH@+bH4Kjz=Ea6lwi%yheS-s?~)KAK|`0!3VZ<+qPkfX;jU{vGeyj zTaKSI3=HJ^_tUo4wY;v08!sk3f%nxLL8U+dX}hxA zE8agnVI(+GK=szubj};G)JkR;j^t`OU8>#w9T;Lx$2uKbS4|c~M?)dFGF7CA-IV9K$8VOH z0$r6^^+uRouM#sv1d%aJV+4%<0EVlo+f;?bD7YYc0j`1EHmEN3!sSg&8DtoCQRv@Y zCSNw`h1y_H5$%j)O>5{<0xeW^G;d6D(UXs+g-%NrAOWjJ<7%ds49*5h=eKjD%DYuM zGl&(KeRXbr5wX3J1!}svbB^b}m#fjyivjPPX~OSAJv*F7lk)oM!r^78EWu%HA^z@#EtTYR$|I56RvJQu)|XM;oM4bY zEfPt@Q4oFpdXrOY5jP$k`|3HNlma;95uVy%7)UOpCa4KX$87rRR6&ur9N^>g)S84U zefxI(brkj`Thw;-(*UHfZzz%i%fu6(mW)~HXPTiRKuO5#d+BGPvFD&SGVb;b>B}^4LmF(OpFb0 zr@8p6#oLn;r}kLy)in*zB{P|zZX-VW&VH-irH(2#a1k?%dYvUz%G|h@?efs$&86%= zEl>d!r-=96#7wd^Lykwb8%(y2sa_~2jHO#)PDT&Dsu@~%$0a2GUfPjusHka^nwBJL zIiXN1v-TfQCEV1%5iMG?s({gs{7=tLkye?>4d^?KP@NWZja?)w6D|*^^L+EGwhGuv zW;}U@u|2eKwlUk9igRK-qqomlhh^>TduTkDFse~oBzHQ=Z`_B16D`}mmqido*_#;U ztX6(OqjCA?P*O={{wHybNDN5HJ@rKp%KO8OPj78vVuv{~A^kP$J~e@SkIO;{DU=5* zG8c!1!FUgBXnjSRf~14+@rKW@5v`R~)U-+B)l9Lku_r@m_f@i@tKrg2DedAnVWR=W zSVHpJqKHkj?bY)@MJxdoLbxRN`j4)TTegjYhCVS;p<+AzbT%r`ym&|seLMQva0zO&pI$QyRtrB+1(Y=ce&q9$sazK3WOX z4cSF$v6^uFs%ild06!1R>e}aB1TJd^N?fM9$7ptruq8tRQH}n+Ly7I3AB`$1!+aDk+?DTn{d+5P*V{=dF=cf-rI0wuj4B#N;1M7OkO?rEwf= zM|}x;2~Kdm$G6K&rlkv7ekIRx-L?0Q-*o|2+*(oZY;zUW!fXTvGJ0a$Idd@{CsjdpMTR`!Qv6h!r21zl6Yj%I6ec%Wbw8xe|V{! z)d@iuDu0*drZC;TbiKAMboQD7MdG6{Za{G3$3EFT&!&%Z$8CA}$S)t&ZWXw#_d048RB!K>!#t3nzX>uI-DLQ zdkpEZu(;u8l0eaJO;j{g?+Y}@6o5~0@1+gP3{6s=0zV}LoDRfmDR*O}U`sm{;yVG{ z>)I{NZk_ne9#8sftuTki?aM61k~eCHNo?`o!eJ~-F`j+2-E6i)N`ME+1HWwttGm<2 z9k4JI6z`$ZZ*_-ZEYkD;CIlLguqJM@hmm!)iB00sQEbW z`Rg8e800lYfc96oqAOTCXV+VnpdWl42UjXQ&9A;Ek8hrYu^V6NnkZ`NloXVJ$LH^& zi}*&DD6KWpnBN9U$Y5TG}%v%aqjd=^*Q$mFiE*Qc-@^a<|aMP=gLb@m6o zwz~2;I>4{CG(#ynRyYKAI{S+I{{UTkfvi~M=z^5Kz#9AV*P%we?W?sZco*imI^PnuGv+7z^^`~(#h zbro|Qdij;2_9MR!T>9#V>Yrb_=hsnEH@5tihK6XFps?Hd)6kU}AUZ2$^PFZv$J4*a zU8{@^R1mp-!`b(y)7+9&#kY4guInWm_;o8oSsdmT`8Yy&pU*<~-&8giPVFCkZ@t}W zu~33kOi*2N3fboJ=F4FM|%*`SLf=R&#TnP0v_A6{v!jwxRab7OuaX2_`-OeyRUc*xb z3~|9FU1Z!TBMQ$k(^)* z4)_H3?sB~KU1xx_L_}hO?^!Q*3nty6k8VkOg07rW)6mB#j%ey>jsv8PC@e^c2vN;R zY-1#2NsVEq+0SvkJ#F&mM_+C=NgX{CtWegLVabrszW5TVitLT1&c;$&=&;*U@v|Ius-Xz`AN7(X4;#gmPnVS@4gxfhk>v*sl1z$9`xF$^j~!Twx{b$&S4<+Otq$2)8ROsz zmTcrOApE-wGs;C33&=^A2`qOy+A2|eqgAK0EfnqH3VM3CNQ7b}o)H&5JXjdW$l@4s z;y@c~+R1CTR`0tV6?`J4;F1`q?{iW#DeECwRGB4K>`yl!0K@^?2ko>*vhjIa-rB3X zR#wk6^%cm16sks;#~b7!3&CRq9A!g*Gm^)2^cI_C<`{3bON~*ao-YEk!J1Wu7eB)X z!75mp5xEy2@e1C>b$3RBtHQ7;9gGzBo28D)aJtmOsZ&!WOF8G^u~3Xvq!ITFqmvR? z5z%}%HZE@YCNnMM}@80P`ioM1MGS?)ADX1a>abl6Z=!#nbV<4tXft_dm! z@{k$bM{Zb<6WEcA9cOl$ISsg9ei1f8-s!%!nu?COUh}l!sC(3dKK-5Rf78@*Bhjhj2mTk@R$R)mFNxXk~`& zx9>E97%DAyRgRWfBd8`o!RiMLg(L+H=sSbyY>ll1H~g!6&DmB4)!+5j{l6a8+*I&M zMNUjG%n63FRNz`eCq6N`9;?~OC%@tuIZ<-9-)Ly+w$I)#O=ppkq7)RyNszcyRpRZ% zRN(hzY><4}AfZ`p`?A$p6!&id=~kgC(G6U3g(JmY2+_dH9~4H(W+-wok_io4itR%o z5Y%t$oE7%Rd3+>>2?U-XQv?7)NhIJ&p4ctw+;UL(_T2?R_HNNT{>-;-tF0X*lvFj= zc`EAH#H^!alA)Pcy)^DXUd#idsRR{LJAkiCb#tP9D%*5-3hl2I%8t5x>i=BnVLjWBF8lY%A{dJWGOj0!nC@V#UW*pU6shz%HA@$ zLcePz4ShGl(n#JkZrBPKsaEbgcm8qP>D#ufZh>!F{+{moOZ^&`-Z%D0mW}XB!6Vu2)jRAE~?%nanAYp?QA(y|VhE=^KuG~Bk zR3m1Lk<2uN`y{kc+>+r=e$o7C_f5J| zAg8QmFfs(4gtAHsE);p297k{nI3F)PL7515gvvhhKAxLxUPwKrL6E9@1`51R}0k?4b99=H1bwE$sB4z zkc;?nf({QNG1%+r3&9d@TFYn@=@F-Z$4n&i402+}xE^@>gV?|6qL9gFT3Ki=QA1S3 zEO1ak%0Zm>er(|9u=FGj#~!(rQGU5lU0?2-QbjF1E8x(lFtM=!10l{yJ+?djjK_tY$mw$uf{rfF&7zkd-X;OeaIBAr{|)j=iMy}K)UN2ni`h9zt@PzIu_ zHwsT2EUL|(PCMn}W%C2{W1MMWD({jd^(7wDfhe+8T{# zr&kcjgsT{wCvZsY53Wcj8OCxoF3mlL;c+x;Ral-pB&YD1k`jtMq^oDqaoCbDGClOR z?_+Ji(mWmz3X6r7N#LpQ8lHKwlK8%G+4W+3A50vMC-c*O-RqZ7_Km6w6^nRF6(@`& z@r-{IAmZK8OXPrm5gozKph>r_w}O$!5`eKxX{4G{mKniZ_rUz{ahzwk&^hh5D`hfO z%V(^LoH+rYVNkEwhRG@B!(d~#uYazHH5*MZkbY@0MjeNMQyHqYNqLr<3DV3N94x{h zk#Yq{OymLY{{W~4q^Y8g^$i3UDrssYKqT1Sq zBP65X+VQsYRjjpkyKI$ar<5Gk8Gs`L2axZ?jDT=J&!#dwrnTHH^^n8i%#hS85~_iO zGARTSMo4V?V?N(K5{rCn+odG5)R$J32O=6;e-nd|fEOb?axvS`pG^a{*FdrwTYX$| zwMk}q5la{bNDLK#0F(8{_~~~jBpdpZ?J_{X3dnsk*#+i&Dt#h=G<`X?tWT zC47gzK^X*g*Lv*B^}ll1X}1NMRI0bs#vU2fyO2kwJ&&*Cb@@or$#kcBD%rj`z_}?j zd}c-i`C2IsNx=2_cGI^^y2ZHqTTfYT*%vCRD!S>Std(k5JW~{jxsr|nAc+$`V0@z) z*MGzOS=w>an=Kz@&DD5tm-><6%k=^a!p4jgk(2M+Iu~-hPs@vB=Ukg?`*%clC9iC5 zZK|IMJ3=S9$0$O)mkizu9>hPlBbCp;ZCf>cZ|UXYNaM3^>KPlK0)|k8oPm!vHRxj1 z>Gc_7g5u2t(28?ag;Q{>!R?HXZ3e2D`J4i|_12j89jc^41k$Txy0`thFIR7-sHYV% zNH9~I9QMb#)_``Tk2VSfCy+5?=rq-C-14mw$1!ZF;t$MeN{YVGd}*Pw+^K7R8N^d~ z607)bMnbkd4m;?epsRo?$r(^c^#{J8Eg={LBK0+fW6fCOI)PDC?h5+j>#S1{u}M{z z9@^DBkuP*P&$-oY1wvFg)R0L8eDpeASRkI-oixnnf*#(z^{zTOWlU$8_rTF`s38)@ z7-Z@NLU#v`p#5~lZBnx3Q0Gz2hN?nOhJS5Qbs_`NDbz;I{Jz?SEChlG_4#Sdw%uC} z(H{M^pzS)9A)N>wowOyutJ+FNl9`W}zE96kswo_kfvX92obt+5qHj;0y{OtIG$1B& zJ9hWbZnXm`Rg%&-cH^j$(zm$v)ss=P=S3~xocj8D4G5^)l7d;FZX@3st3^t@o`t;4 z>8K48ua~$dzv-u{t2>D>Q2zjqhSpfv_bchECeYPnB=?WDSa&%&)OCy!Fg-NQEt&I- z9Q)(jQNHRSi7StN2qj-AIfFgMdut_ykFIm`(Wvd1J^ep@ZChC&WM}l%S|Ml|rY(X; zugq&Sww5Gu@9(A+wDay4)BJTR3sGEULDg7R0s~KNJcD58M(HSh4m3&|Rz^bi1HOq; z+OVZSKDo}Ngg{z{O+>l$?hk!Vii-qx_rcWoZIW{wLB@UbNLr*&IWBwZiKQygV?d}z z2d=cqMW0YRX_6~@$T)G=vRP&9#V`o(+fwT)wxs8z$v#~}sJAPO@EUV_BY;>Zr_)g8 zw2-;rd+PX51d~0n0Ki`4YB99nl2_Y0bCTE(s+{AuZDIFPkaE7GQ*ynhl$vel9)tm? z^HQ=Wq0^j}Y!2(&^VCVKuIxZu53a9ry{SAx>Kor$Uq0iun;yu+nB$+8gVoz53{;Q8 zetIC}G=unqIL<#kX0qqYl1TK%zMh6yi9CL~jptL@PDgzhHmLB4)5(Sm$GP{^$mS}! z7Xf6Q04GOrc+jDDhN5%fQPa<4Ra@E{+f_0!R}kzzt=#-zF(K+tUfAS;1loZ zsgyh;O;`p3kU#Z5rm=d%#DKtzdgxluoSc!ZZ#R5>H53X(RYm~;kL9Q>Qr_b^)~Tm2 zk?Hl$b)rWg1IyFbI;9rwMCAGm<2cvcg7?mIsOEJXh!`JVp1w&-9^KbJ(?l&*DL{_E zdi=Gq2v)&9zPi+^c$19l#C(&Vo;&LBRb+Cfatr}q*IC8}ai3oK)|h<200*ak&r%|Z z#tHAM?4>DD#tIHOI+q4h}u_YI3*RXw=F(9Gq#w)oW=E zcy{>>1-8J7SBc5_>cHD{h|Ii{cfmTRI*~OQ+naGE!@6XQduq(FSmTF_1qT`*x2U36 z!x8`(&Yo!LV@QFI1Rs51mFCvy8EaHjxg)os(YstCCI=n!sL?=j2^u3#Fh(=$tlO<^ zt4!2&Y^tOAbVP8GLyrFdmY3=0@Yf_0k74hr^cOT?#IF)_fvae-X>M?7qJeKgS@51M zEVU52WC<6MAby&ws%v-F%MRGabDwQr%p$3Xqo^T=eIdWy zJ8N^TRJ9^WoVPY+?xD4!7wr{Rl_1DO{;B1@wU1o_~_}p7pMrK<@6^w!1V*u zNS7-9qEJ;edrr+1YznS3fuBRGju}>H`33|Lp5HAc@6EwYNpG5!Bg2KjC$@!-B;;DR zG&j8^`rfbGDlM-~Rmuvq10lZ)F!lX4QQZ2$a9Qe1HEycRKni>etE$h|69fj5SQUdFOiz5BZI^!i%qGkI;IOb$#qjv(l~cWxCT`cGXC}U0z7# zt*9vSQ^?sM!<=|wN%?2klj)=_<@R#DZ7X$MYwk)%6pk90FbO3}7XaZwJ@9jk{{Szi ze%o}~m_X>CEq&Ea$NS?d6nCq8DTbOdpbvi9&1z|yGTe&~Qhr)exLT^MVh%D$@(>h* z+_Cx%9NX5Loy;^gxYDYsFs0$~IPnDI1+YLr_v@id4c<-{CGT_JuyVeZXeFJRoiMoW zPi+mnRY;Mli8(Mi0Zw&pZN8bq43!e!sgSEThOwE0Cj;-00nez=iTXnYW4!h|-2_5P zr+RNRl6Y~0fD0}_{LX?6cAUsTI3GlfW{XtV!Dz|tbX8$vvR|(iZnSh0NMm0W@T8EL z9r5dq`mnaux}FI*RAfA71QG9|@l@{JhZn^dsjA@vfvSu6irMr8`kzfJw&J|zTtLC29fdD*n7W%5{ z%VSC&rw7DbcE`wmS^k>F^Rj8HDI|>%a5BRKzIDnU(R~%&vpYAnay3m2OtYUAO0Ipu z&*!a|8%;eeCpgb1AQjb}x;CV=b?zkt!(QEot~9w;bcur`f!(^m{vFurfa>v*A)s0}UhLR5T zMI**ae9n}uP|?WPZrJoXB(X-JkTwQAGwZD6CWEy&{{UB7V^zW|))*7(S8Ul)Y zoh8!7^8*q@atXjcEiuqhO-Vwmdn@FX2S8d8gK4JG$t5n0#R$%sW2zEHLN9z{Nmf~_ zBt8j(MpNiiXF6ey3b+|OK4H&t8`Ja98cc2iD+?JxMmYnqA1x7H3lLO2lzV9s?Qy+Z zZmC^PhDcd)GH17MeNX<}Qo1OF1TH+l_aN%3!XQFw;0tBFM!lYNf-=N``RE*bf+?hg zG^-hxupZ}9u2m7VVOWBFj&(#*o0N8}B35NlgYThN8aj&B@sQ)cu5}us;1P;*#-U5N z5(L2~_w>;QlawTiMr5N}dR|gsj9};AOIJCjScibj!A44hsTCKso{%(iFu?O?QC_7A z4==A`bZr&NQKP~OEo6)``OmmI&IWm;RT(9_cF{R4lr=1@&K14LKDwP9x{YQ@DbvH^ zFmdjFdL>(Iqt=UT5ZVWbxNhaLJCmya0Cd`Ctdc`R7FkX(LB>9L)s;_jLkL!k0;3=I z>s?QQG34qCA70u3jI^Q@(Zep5C4tyr>Hf z>T&6!3Kt#~OK|C;B`=7G2mpd{+>Ie$HjFgEl9m#GOlza7ZSuTQDzM;kNhk1)S38b| zIGNfx!vpEt*Gy?jI8+T?k)f$RJVXQY(E9iUcvX)+!vot^m1TkMPsAxDk8FEtDe3J* z&R2$5cg7EkB-L}r z%Z^Hc+do}egwR~_*4dHE1kMky%Uak^7h{u;(^nODN-q)9OEh%sQ9VXG<4LpZyOT=e z;hY8k07tfnB|O>*Xg)iH&Kv4<&W$W;p`2$P+7C&$D`{%Tc+Nr5Hj1^+2^5|^y9{W< ztuC;pPg~E5xS-LVXmv3RU8`Ra+JRGYTN zlAh2ONWT)O1Tgf|gjXqJUTP0v+Urbe{W)irbF zNelnR^U|I0PiXa1zySgt_}94p=+?eq z`;XsV6Tk+)f9z$adDH6moI%M%X*o7^B(vBmX#@<#V^VBy8V>|%|9lPokMM84Vilm=x<51+g zi2HKRj=Ln4^4lQfU6eDNl7702R}`_HDsZ5B5wE7ata0-MWc-eX&v|J!dVDwTUvU-j?0mN zJ@oftv@A3$6-owATps#ejo^W@rE~K-V7J{CNW!&3jY3IQzy?<8s~x^dfhWUo#y<$g zb)2w>8B7uoJqY*4v8}p@*C6B#0j}Kf!mP|e`Da6vcnOeQeh?_<+t?G|T5GP*)F=Ul zeSLLZSMJE1b9cc6_RfOMy}TyMw{NM@ZN3m0J15%u-ps7P9V%4Z{5i%XBzx(4qj(+bW%nVCzKV&56o%G-Fl)C2aKJ>%0KSS_F4UE=9unn{dAVw- z7g=gz2gT-~dXHTcu+>h}v{9Ug7$E6p5lcfRAge$!k(D_I<*gI=(q&^@>MacG81P+) zBObaW1_=Wi&BE3XQHmzq_o=$A z+go9lC`C9O%bh$riQEea4g0Et<3uDHl$fA641NCq?$pyQ9YlW;vlzk-zz+Sj=H$0a zM{$`ZrnI{ zU;@}Wf&HMYkhFB`2_v_D>@?9&YumLm_^lb{2Vx&vn{Lvi!dOH>eR&^!JV_fow6nRB zNOx{Qta09@JmytpKiwDyPnMZ0qsNSxLE9P0)EY~Lrq-Nh@YVC`4yUE;$oy#|Nh3Xh z13JT~CQcf+=|@OWb(CEuLVFYc01Zfu$si_3KP?P_>m*#wOsF&J4zix2YDQTUfHUYp z&Na_0vrDEV09rd27VKNTwh%G^$;Zn>t<|0;30x1$MAB&3WD(ozr8p31tueeiE5I8W zAmdt|ShK{DpRTi-P{;y4GxgSlw+RZkR?n_=Ra~MZoCV~EJ%elLgo!#dY0bF|cFs<8 zN}Aixh{GRl<3;H$aKh^@a#!i4z2IFZvKKuUg}j44xbLl*7{;`r1PmN&-!`$8)fgCC zO99(h6R$h#?0oe~WUq6q7~@$VO<>se)KZo`wTT$-jbwALn*-BC2~rl^%7iZEH^b_%LKWS+xS&hh(5bVp)9WW99`)ij{6H1_#^HeghD%0tMfrZU(W z_tiPUqRB!IaI7n(*4bpY)LpLi&{5G+MrNL(cL^M52XH(}^a8}^R-Pf6DsyX|Uv`>l&-QyAuklv9x{YYY)A z&a70fLE?iTdiOq+O)lxFwbD&*+qRXbhBM&wXa;}`ZOPxP9d_%dQ1<;qH{HVm?dpgUqN>+M%fVO2@DZHGd__iK=tv_OX2c(%t)TU13wRE;kNjg-8C z7mQX;AEv4;`@>Aa=)a4}M=VPkk7*?dqEAybxTXS|}-zemYm3NI1#n1CVe} z6bFep9-aF&#cqP41&XDX8i}fz0=)557+m2(VQ>$fatE$S^vTpc;~cd2N)4@OsCxT> zt%jbqIM49iBxwCH+^3lPda2U7u5qB7v7lKiEtS$Sx-S%$o7GfS>jiyV!3}L;F~v|8 zK!hMsnFu5d0qPIo0hwg=HpA2FO+8HouX!cO(~Czmv~H6a!z%G4IgDXXE(5+7zsT9U z+sE14GV`-*u4_H6mZnOvZTr3^cIL>ELkqfbSlgSkDx3~#a2d0z`ti4R?LN|^`_F9M z>31dV66Z>gz*ab|#IZ94Y?X{EaKQ>aTetwU+)tR4C7@t;RQ}(!QeF4;mezhQF>tMp zI9{0(#FUH>P%+{&gWQY^`fH$fLhW6}b+3Z?X{W83Es7zI>q3ceUL5l>JWH8!%zZg> z!hk@|xs#?hYW>00>m$+A8DO{6Pf<$%m_)IvDRRNROL76R?t6M`uBi6ByPm2UrnOwY zA=Jqsr>%}-HxLwL5@Ze8yC}fz+qpV^q?T2j(ilLq=(%I9(%ZKDc6&b3z3{TuL~hei z!CKNpY9n@zHfZzYd~zTYo+s<09XR_Z?_JAe+I!764XQe8#LG}AV|hhnNRl4Ql<>@i zDP>+`)O?B5PqcNiio1K+?Y3H(XH#qv4;q!>A$&<21TuzWkbC34M!J&0Zr+<8Vq12M zJDQex{_2b2JPHgNSDGBKP-G#UNydD+J^jej#HKi#>QEL3JkpzH+S`)8*&OmyDe>AW zm=>g%nL`sH42Y~Bmn9_R5Tnz-WgW?Juc6*k***rHDG)4jLr5i}f|jN);z+y}L*fZm zLK(QmIY-;O5?Ho`cl&f}w)VxsdEai+($mL3$2{*0YylFyWqG0q*}{(yg30bX0<^ml z(_eY5xkX^5cU5;;41AS*qC z6NsJ1H!SE6Jbo6)_4Ff6^fo)qzE!D)qGov^K{5ymAc+@>_>s*R4TZ_<3Y_G79a&Z# zn=Mt+nd_;)flgPF3AnKJVl(ULGw<6v*=%D4(&+`tl4f}nq$6;sa@2%uvPZhwp!@rw$Seg?$&#?bp){_w#qpkNtiJQ!D@I}3g^RdA8Z1=xgSuE zxi;_imvX~-v)$+>u-2_CRdd!pWW|%RoN+PEEQi9RX|dW zJVcUks)*?sQb{AR$T?x$56e|eqUm|K!Ee89IqRa1<2uh$NSPRLiNI$Jc5+|-+*N>`<$aZ@CVh^C5Dz=S8CE=94BPCZA=EN%U*aNPHK zZkEl*Pg%E$MK!LPnmT`rmah_ciab|UWCP=+FJn`s?4hE zmGwA*yISMjMv-9(++7-`>NQ-8xv48FEtON##_&B&H8hmdGsvn?)3FMw(a7#MVi-c`fu*AX9m}Oa2 z&t>C>7$tC2uVdvVpsS*}-oLW7)OVVHjJGOFOK*iHW5wH>7K%1_kaEER$UN8Zo_e24 zwzmv+NNtnJX|+(SlTvc0h){*ch(fYQF)7G1avj?MgO5!u$-KAz(YvZ`jjcf_ZVPaV zTA3!Qr{j?rg;{)3vIc1wgc;zZw{fO9#I&>@l1|!nsk@7&YOuvaWW3z#E8>bd>6-Cz zd7eOKjRQ!`2~{1&Jwar~Rj^kVdf#>>WnS9d_US7qO#BMU$Q~7O4BWg$Vh&bZgWo0n zv5j0?g8LTbl7{H-c#q+yK~Xex3=$zMYQASG>f9wroT6Zc!vomsDJ+{?b4goWe6m?& zrFAs*RWg%7Duxlo42_cI0D)Nes@Mb|?iAyltb{$=xIUpiJ1wpiA9UQinkq>Lg&oQy zr8C>OM3F27k2w}nNM>9K27E>xk+8nHt@lm9E!AbAhIma>0p{{$C1c&faXb_r_zR!g zS3dCRdu-~uYqhqiuePX^tn(y5NF;gNCF34R(2hY`F_O6@Kwj$i{)F3WY3pxs$#A2; zPNt=8u47tyigzR-D6y<+0ptS`p-u)#7&+m0pKRRvj_A5%Wl(inx+7L7XlZ1oiFla+ ze*XZ8iS9?fK=kYex7ums9zAzBnx>@#Nh7OEo+NiFJ2Ak{G3a#TS@wJC63`r}&b4mrNt&OYC6T-^(iMr( zS%4gvjz(5wt-iLq!9Ise08is6D?A;wRLQ1_y7ht~<9w?^a-9v|gyLG0Q5-&{VjARj>-i zq1llzPBV}}$T%Y!P`+$!(_@L~H(txQQyQsK35r3K;JM^MR^UK6?nxX@ah+ukr&@1J z@Iqd;TVtLidUb&S@S|5rvZh1Wlgy|chhc($(a);=(`?`F*QhJRbd)aBe;p4Hse*Ys z9F8OTyAC>&RZQ8MTOBn;qM{0vnN0T*AwZ;lJP-h70~qup9km|qJZ&94UFNz8gz+?y z2q(#uGx7w7%Hcrm+;%<2n;Tr$ZfPIq{VFZIQY~|&xlv0+;a?Suv0*9c>BNkrFLGoA zD*_ZSP<;=nILhU1ecIc0=2o%et&x|-oy;MlMJNCy_x3sNdt<(uXnp~x<2K64R<1x( z!XyX4&*^{w{PMW%tSk17>Pv(zMODV42M9v|BUR)w*vFW#X7nRJKbqp0HQQZ7=Y&PK zkd-SSrGgo0q`1lKJ`Abb4vC1kWuTB~T9H1ML5CIXx?sUrcI*pGi< z{{S3mvX-8zgu2}>^l>dWII3lOb^aTWdxP`hqw#mi9=ZoZ1(xSrYCb>4n7cx#vA9+k zBmz5w>FNmi{$|+;2Ky<1v$w#UqlP~Y;a?GX86}j$ulk}1J6FcHlE%ys#bt2resyap^k|})5atRpu5Ex?~ zr?!dNX}13Wda9~vp#C$|QaOwTG56%HAi(eCIKTr0dTGvh?6vl3C4|W$R3a?1axqB^ zgB(h_kV|$10N%iR>2qpnz#coQXzr?;ZMKT}HO3mqRv5^ZNfv1e6Db)D%#407Vt!*- zN4J{YNjgbUAQC?gVM!{XhnOMnoa4Sef31ajv)HL{5{ zGJE6GC$t)>OM3}vAf~He9cJ)k3|PaESMd*VkOyyL>7qKDK3)}VzEaISig&$J+^K4! zkpjmPyihz(fC{@6B;mNJVgc{m2Wu5QSl!A8=1%PBH=c0i`;797}Y9x{mF}Nhz@!R4`(xjB&!8 zAjUxB^CRCx2$&Nl2vgkQ3$5KU*H?+{^%ZrHtcZg@9*5QSvH-Q#DT6Dj7mb9Izmwga2c{xcLDR; zK3_}>=$78N?YV0fYjsV^wp2-ng+oHz*OC}QwoWn`!+PVk0r_+TB4GusI7<;Y;_{WO zB9aGsyNxt9*QH@61_2oq40*W@OOnH}7{)X0rg>^@^FV1B7$KYZkyJwmmRysZ;9&Lx z1cUO?>z%PJJ_)$n>*8mWhr$M$Hc-A|Ih+;;)RMiMwnj9fAgHIh)G4K@_(I&6q_MeB z>_C4mLBh9uWqiHB_Dh=C4(x?{cHv36(b(#IS?h$;tqbv%MVZv0#sEA$e+f9i_dWDR z)pN2^S-v)!r|%kdlpv9!@xVgV!A{=KxRxvkJp(zRFKLJ>PE`IxhJ#z6|$z{t)4^cl(34Ifj==Nd$0Ey|gD z-S#TG%`p3-2_~F~I4ts(!*&O-99TE!^!CPOE5>!OYNjVP-$miVEV z<*W3I?4_`77mcq~)XkH)ZMPXN^%5mp&nG;{q9d6hMNrcYC2;Z%A&;*jPh3l7rT9>v z2Cn=;9Moid{X1u0i(NnKhf(@zR4ck?ysIrg!~%HYKf|g}aydlVM)_xnI%A8jeQ>?? zDlP9*)ZNWhUrR8kRW;lqNc;Z)1yVItQHCqn0p>qlYLCR(6F;eflI@U z)Vb4WCXXOmzY>Cme>aFn9_{I=OAVHqjJnR=EQ&`H>-lP?+5L9uzVZs&dv{PxGbfAi z@;`+jUfuY%5AzS}^3%<_1Tgv^eQj%+@nG0kUe_}Y6sNpF5oC>t zU~|~&FW;4P@{r>rJ^3!ZSG=hbrU->_)Ol z@OgWCXjSKGEO0SM@&Wm3*_zD|EW9({KAMSFW=W$d#OhiSz*jt1ZN&J7VG;H1+d^wL z>&nt3y1nu@*hKS?nHIi8}F~bCU9BSl~W+*4i z>8NsT23GRLpRT6mHkDYxVt>QO(+5(;g_pXa`gYZVn_<jeZy=zdxfvRt>5xRWzG&-kC|5p*g`L(?IKNbkUNE;f6bQ)r)$w$c}j|z=4t* zzJNV4rX8s{kCD!_wmVsii%PF6ERpg&7e8HUiq3g{4_#QbHjzIEN--E=kV9l@Kinb- zSzV*g9QHl*E@4K;j_Dpt0PZ*s+gOddN|D6=c+=RosU=W`{D!tgYi=YI{{Xj3AcWB1 zRc|iX;hd-E+d=F0u?ozw=RNys-l?@m;g@9}o-{66N^FoHCAm_fai{T;~3PdcHT!qG2a-+&qYoFKtf1vNt}W;p}99ALDRj{YC4}F z?~LO?Ww6vj04RS=1)>RVQ^cO$r%@)6hio6uOjFtA4UQSm+N)%~WmP2obpoow79Wm7 z{Qm&1wygNTQGxy%#-iO&1`3?^z}DDkCvG@HocGbUDsUF`s4BcbIo1fp-10w`Pp+hj zHiHF*d*fQoJDEEv1JhQe+K~*r3WfI32qi^e&5aHbcthk!&a;8soD-c8ZY=@AI~0Y0 z;tmh4i_pO#9gcf@Xf3=m06Tu#Y_!FmAg(j%_0_6H?GzFc8MBOb)r+^SQp&1SupdnV zv0J_;2nS)SQ)XG(UMi{BX%aqxPK~>;i|y(^2*(7Dcy{*F{1lPGffaBy9*b|m9~m7K z6~XQAqU#6%V;bi@_E$z0?d51#{V+W}bs{D2uU0Pk^w!Y6!%I(DtKefe)-u(y4nf&U za5z9{lmRCoV3&2r80PJ zFDVJ&?mZNrZ~ae}u1d>HRVr3R%CN!u>k2Dvmugj;)HKfZGa|$YY$PfNb_4sz-2A_; z*ya(mfHGD&A}(+w;WXQ*E3EW%^s<$g!9bHq8ODCN)m_$0{C2`TN^~j5I6u#)d%sYr zD5xKV!K7uvlh}^mEprc1_g!`7vC?XuaYvpwKAIR<;_E7Bid1U*1 zwMAOiSmugFEDn1Rb#d*g#^VgrR5BG%2`AU-u70A{%{?nhT3xqJ!l+vzf>NbflQX#vl11YmvA#n)ij?-u!O^HVHFL?B9t1F1gX>0@Mc zr*Z8Hnuc5KKL;$UJH_CKd5Y%&nBcEt=so^=wnSaS5!>ml;vjvGaiVUvSmQARZ7NBl zidh>m9%1O0=}%%O+-}=j#Y!uya#+yzFX~hB z?t6W8e48DzO0!)x1X5HU-Xo}H1K14uewxvIp4$sh(pS(mS*WN{3an+yFz?T>?T`IW zeQ40@eUe?wZG*@w2a0%qx52hoQ3nKa6$7&E_s!S1R@Yi1w^GuDlCc#8LE=;2BhdSL z>g!#DvF>t3af;DQ;bSo)K*dn5eoAnA=Ub-O7W<9rYrVncbbczd==@ND{q7)V^6#VZ zL1^3b7+;2y`cAD+8Q&YKi^pZ;?{Gw@<(V8wJj~rv)mvR39 zX03TBZFjn8%`(`%iq zBoKIQWBj3Zoxf(HDP2ivN_mR@CdrTjF^rNk!7KjWr)DtYTDBWsF*EBT0C+;iwP$ar=f^1TFQgcdMTN8L7>Tgtn{gb|bZ>bAP= zqf1XKNTUnstKPoV1w3rRK3NAEuD48atSpm80V5y|@%t6oOkSX^3!+hbwr|Q zD@<^QAY(cuMxi?aj2~TTjwZ+e4#(S5VULamfS*Lr-&9JDLKtA^v`$;p_t0no0AoZT zEEfkl0u_;Hci|3Dgik(qs~p!O?13#!x>k2^d5$Q>_JLbfifal!1Y* z^%sd8F%lA6>!nz(4aZwnu&~f=36{6kwN+ENYKP+E1%0uo%Wgpm#uRc<*z0o3ldYk> z^=d5wj(H@7%VV$w~v=?eGtLf?7aE)+(y`2QFw({u zldEJgBjgT>!&2!O3Ul?;RV(t((_7JoHE4jOMhP3#oR6M$IvRy6Rzr`TbRAy_T@<8Oq4 zqr#3|$<`CeQJy%+2OpNPH0>b%CQq^NqokwG5X;4NG?AYL{jr1ZrFpjSuXSf^0yE!D zRTkP}Ljn8hD=bhjWCtTYzWN|(3C}7%-P%-C3p=|b%*c3hUci6btUl#}AtOlX$-Th# z)R(K3ND&V)?Trnns**Q6@(K3QhZF{>VGX`0Cc=(Ne!3+rvC5(u1{FOtGshf!Lf9u* z{BIGJVURua%oL-AK6(mSq9~xMw_-iC8l!Al$Oy152W;ayllPA$B$3-tt1o^7e+ZI2 z{+c8XIkc-^)2cSFl4U1@cl7u7)ankL*_nJfX-ntap877ki~g20V0{jI>nFYtPliSh zrlwF~ON(S$Xz7#TqE8PU$H?jw_9}XE3IUAZWM^CA+;svXjy%6DMXS5~LU9g1Eb0uZ zG@;c9<5C!bjcA6hG-2WX5$p8SDZ!KyS(t)-^&TkYl2D7tE`7f}7zGM@w^n#@W-Mfk zj{dqeNx2{@A^b9d+#cQZl}S$Oxe~A;dw2Bw#-r7wk+GHP2*CAS00_5Iv6A^N8CqZ1 z>QxQs^TdSq@9V1ihO;q(@-gk(QYE{S8^aS7ZX{>lP_Qc!IX+ysofQhRk{J7U^*Wul zcda$rKMRf@m#ICmsxq!R$!6fw$tQn*PWort^>uVyc(B6bzovCY7J-gbZ0`w0jn-O%vugkp-A@5lDB=^a@EMDfV#z; zkPmH0LzrkQoVEEmNgJP~S1Sd%ZqeMMo;=}~+-WvB>R@5(kFKAq({xwStt{;3JeK42 z(!Flpy?RGV?d$x#^|h`elCe3L!ryAWco^pY0PAN~_f2;VvRa6snyx@W%7Xq~Qj|MN z{{U4mLrUwPaxgV(^y^?vK`5=c&K2XqKo76yrOxJ-n@)wLt^_MbaBYEfUT`91y^r|k zRf*UaIqnq@$r)vclacSMjth#2!j%AH8P-vXD8osfAone}oXDwwit+toFD zvc-YR0Qz>-k#4qEQc{LzenZrcKs7S?bEb}r{1kvlGlSS?T6WIlHw9`s*iVS3)kkc7 zbsYCRZYoCBvD+<5hP~k~m=^nn?~*XyYd*VP>+zEr0#9Au8* zoM?avTbz3+Z@w!ekYaq}*HYr$k30;LNTt1rIs$rP-UBN^gmp7EFID4*vkQic)PGuMpKl z#s;7t6*uRFAl2XrL!4t+wf&R@Q{P@xP?$f5<0~9@*0`kYRi|VBBn+%F;K050PU$%ogtPL1*cViP`K@lSS=i?r;@2j zYi?6Fof{|h#=c5=mt4GW-`6_nTTe~)?JNo^=@LmB)tGu}T~68Al#!Q`-vWg7IL?Sl z-YHi=@=E86F4n5O)GQE0{Ey4!qZNHOsir|B)a0xB4}9w5ilb>z&m44=@h2hKqh90l z(-^f;$f|e=RmMR&vo&^5Kpow4j2%0fsu30zEhpgxblV3@E|EsE$4;35eiPqU0^4aR zrtu9r@&gKS=ruYc9snQ((3#2MSkpJUtF60Is?{V7G-ZR4l`4B_hPH;DlA&j$05@#$ z^cp+6E=_B+$yp63n4rM~`e#)E>K(zVq>d_bs85@a&Oa?1cSJCh1-EW z^RFsQH4(H^4oJi2pi|dTQy>w}A0EF=3wyzmVH!$!1MYQAVLU4`FKMi|Dm(JE9H?N% zLzCQnG4uZbw@fX!t7ka}!b3k3CpB)~x-&Jxo#OEpQP>mM z=$_|c3~XaY5WBsOhOtXLJcv#p4`KOgxx8$-X`Q5nWn{;crgPus4y+@%Aml<%8Dadn z@2@KBqh$;eu>hSu4NS0+OD>~F4y1X4qHFg3#+p`ks;i__2QCyg54Moxt=&s3vNify z;*6d|5(Wp)<*t;jrLRdgJM@N1^dx z4%tU5$@rgvJdMye;?+lI-L91j;?}}K<2>ca`ugh9v+t`AiJZJ-L<2ca;YaDJKXPr! zEllz)7=@hRC(GMFqolquBA85y-n=q1uR$kI=z5<2sKHcTMfGx<$QUlAu!3(yEMrN%h9Lmg7ZP1DPsPK+Jte?oPH_?)M99v9&a=3ZGnP zoBT7T*}5}jWt;fhRUDgU6g?MT)ANyeH0|L(r<>60=qYZM9O9sxhhkNU0>LzioM)Muu2qEUO`VO&5#lwNSQV z>S_3b^!%k8J5WpL$bVDLgl*gts2;8w1TYmol;Tr25 z>ZPf+Wv0ipqQK$G2Dnelw`X|*AXDGCk05^IE2U#_O4uxg`dQ1{S}JR)DFJGlxM2Wf znIsF__1EIRQU26DX5PYCH*Z!i6D4I*K~Zd?s`zSoO5*`wjDVna$F4~kIU`FJt@m(} zq7}Z~-ncPlNGmHG%8A8>0Vh3=x1s$85dA>|$`Jv4mHTxT_Sv(EOgpm8AcTP_O88F# zP6sSEY@XVkS9r70Q;NFlr6oN%I1xVWI;bR-k0-VXT<2Whz5d#Lf8MncS?qTk zcG#w>9#^!|hm|4jc^Tz)C`cL46gc$s$>v%rt4my_YxHGmYTPWs2~UUNkHgRDR` zq+y9U_jU!;W9s3ZZ5>WQm_1$$BLRy)mN>qBO;%cCa%N%eV5CVbi$N`T|+HJD# zYen%PwcM-dC9IJ|Q%vllDuCyJQz7lhWaO`=dt+GLBmV#vQyS246>GSIQ>TkdPL&iT zLdL8IEDz=!juhd&Lty9AOdAIO07YhsqN4RVl_T)d6>`9gWxtgOV7^~adovuLZJX}Q zHto);nN^mKsG)|UDnAY>W^@e7pmWYL!yugFC){amWvrx)R+f$D1Q3Q`$eAO%4nxjy z{Gfi`r1#rtKq%Qyl^eL-rJkDOTN4IhRF!fQA*zroW#t%C$(Z0SK*z6PjT^M|{+{6! zSC+R`)6s{BMI0&NznH9IQmn*~tV=flzl7kDNIUvH)6a{${pY)B>g1<-cc{mPi3D%K z!U=ehBA f;$g(0NC9@VYMxe*SeWaxx{frOC=~ShD^th`7FxD67x9)qoRIl6HhMFkqD=J`)36bMinGc&XkW`R6 z4o4#xK8I4P_D%l)Y*E?lm3MkmOFV4{DjRxLcybZQw47!ofdGzpIL1D;GGTL}S zH$PA}UsP{1-+F;}x6n~Y&rt*(0f{21apiCq_>wRrhULovNXKwAhqyX}xYjzPiuqAh z8e0tvvOJ}pswEtRdE=CbFa={wD8^56PMK=@dr@?_r1v}AMiCi_M6k&ijZuaJFB}4S zcFuFH(pl}6*0;}Mwog{;A!lP4mzV^1jd9&T9myTR{39LE{d8@045ARZ!_iXz0B2pd zLs`6T6Wpj)tKsc($r7~2EJ#^@!8vE;f_=4kw&J3s%;zm2;12{PK(x&{gwV5QY zUClx+R4C4rGgQY4%2zp7@d~RE<~(C&W++q;N}U_EQuu_sA_Q@oC|bb_ET!(EOLO0w zxkZi$#PicbNbthV$g0VY<1oiAOabKCCxBy*Q`DQ53+hoc(bN1d{wcajA&p^- zhQj!0g_MO~z{)^wU5_Km-(*{P+flZS>}SzJxmfRM<}YPNg^o|q>90mlEmN> z*z2n6;oFxer(3S{YHL+ONTQyWWTcg*U_XYTk(OW>20(!`k&s3+)R~4b*ska##%|y0 ziS6CTecDph*=Rf|t<%x1O-e0fZ78V66PIG4K}A9o5{sMwncxm>TG6=a9y{S!MH9`R6_}+mI$a8l^P<;BCSks$)j}&;aC*Me&5P+hKdTcMtUR&}MUo|>En9E!%M8QfgU07NM( z(l)mB9{4U42v%sOnq{h{m001Wh|Cq2BOr*lK0!jm1nBa#WoHZ|;XLjOolOK1S>ml| z9;&Vy+L=R$kHSYRLR>o#p~|j!bNIRPU08w+g*VkF@)zx%S+a9hb_~5ZqRK~(p zaUgFjY*5D0sAV})o^CkN)EX#uY$y@Q8f%~(^R6#86-wQbt>uIhB+_* zj5exUrrU~!>oryX0CZH;-Dyx6B#IIuS&IgaH(5-)qadpS7%vbGaC_Wr4jC%VflBwd z)!p}16n6U+H9ahKkki!sC1u2<6MAxvRAq4BGRDAy58(v*sTXwVf;GZ=n5L*#V5T&9g<5;`h*0-2cP5!y8zSPt;geZg#s z>a-TR$_wy;p$jCj3OdMIP<$X~Z~~M@P~d_Yp9~ZQ()70L?9ios)|^Pz*z04axK-U` zrmCljomCauRdM2x#kmw2;uOemGBxf7=}^@-q^^oue6%ejWz5vs{{S+qc*i3g$;a^V zCpgD*TSx~sh>)gk3ft%QnfI2}r-WQ8B{h|F5!osrR6LO%G6!hU9J_~dfE-}61As=F z+qyR*TWj|w@1DN#Oe$-s>Mdl!OIZqdQbiR)EPfUhTaHR1l0CFm(Y&wrsN#=lR@kMI zqP#-P^$f2#E&z+iRwZ0>K8iD(b{H%2*>AMBnQ7zNHdrcdliVvIp2c@cX+xTT=#vlO zvv!aYfnTx{#fcif!hrI%!)Cp0Ycvlv`s-6I!s{9w|cSkf@zqM8;*Q{y8C45bQy z2nB;P*2maZ?bkhBPl-41A@Cr$K{jd>$1=z`$};&zIWRSl4S-M!RH=Awx=eO+@ zm3Hm2@<&GkI99HBWFNtd$lx=ES6KI z1FUNhWep^b1FsO-2eWn(w*KPWd%BhiE6deG4I)VPx_X<9JHNz~9!XIoGB+SFJVxMI zk(qL!>izphbZl--yAJuHhFP!Hnm44J($3MzEgvx6V43keHYK>6s0{c7kab&Z{fl6l z(KHoXW}4MKpVUTpFlNh{$30)iAV0}UeGxwgjXsM|H0evZ{Fb2Cduf>}WG zh5^`x=gW&8EJ6Hu2e}&6aWUO#;*ut7UjzP@#%)=2ch$pW){`11ZVU z-5nje!%Ps=tzAqP2&f=p98@z)g^T!*`Z^M*Nd-t`$N(|dGf>@`ZzuOlR7TEIdR#XG z+|8;RlL~0z_$tOP$~mV8pNk-A7a{q9oT<(TA%W2`aE_wjmYKH2O{N-TlgFryoR?)^ z2mvW#06&d*46!GZXSRS)TesCTl?IOc+{9Q@T&V+?qh>h+iz~1Nc$VRUdjd(;%YDM_ z9jc<&Q?{w0yh6@t)`DnVUz2h%ycq|HWNyWI3>^(raIM2a%*BOoX&P!boh0Q&az*G%qR zy!(RPRbisN+2Xsw1WQX#H9>#{fsv5BkckOmy_oUI2OYI63-wD;Lwux`dW)2495T}Y zVV4UhG9&?t@yhZIgXaefxg$Y$1;YtlFnC-Ky(n+Dd{SL(!6%)TuA*m2VR_~l9$;9n zp&)rdKKanucO@kqtzfFGKjhQMz7oPBenFHD>N3NMjEvxS`fIy7nMZ%P)?4e+)VG^_ z>}V@41wJV$I7Gf51tfTc;Pzw7IW3Lvq6eeXzB#lZI9Q-i@ z@yZg|1CcoIjNopIQpyaJW8syV+Gh_l4t^_}2U9EM@M4q+X=;NNejH+#x$^P!UpIeI z^X_qsmZ-uiqo%x=p^GjhS(xx%B=P0TIP7?wcR1HdQ~j3uH@fQ09^Bizg4YeY87c~` z&DE-Wku*|x6$)Hu#AR%D@~H#@abMj2$dcS_)m3{Rc*|D#YGjIfGC4|tyhQOMCp>W3 zz&*w@oQ)XvL*;3&m_TEey;WCFc(qeCzS~7uo)YIb3FCGJn1B=o1HU4t*SFVLLek$a zBHg)flxYPttcfdAu^z6Vj=+5J$YhKj_!^u($h}DsElsa*+3r+Rmq}WZd1Ep0Yylvs zNWy}}Jx)7=^3gkI*~55QA*H_GZ1;Puo?>JbHu{8opAV474tP9Dw{hDiIRNWfk4+f1 zzR$08wlY^5B9@=N=xuhIXQ#T&cBH0%0-j~3kQ}pQ;F7AKU=KhKuYX-azI8^Lj%9jw zZyE<7p_HSEx{p8E!wKrb%KpjkWR3E$ zp!VI%cHD_AUGD7-Buy}N_;Qh#Am;#NU}HXS%$(|d*Q+*LdpWd7ja3sB6!lczBxlWn zr1!>r-N6~i_tOQ#YgF9!jqcFP6%B0v00gl+I(dr9&fXZ$dUvVK4;&SZ@=6q^R}g5x|f%4r~mrTj%E zC3mNj-BFzJ05j(Y>@7nXGpD(YU0jy2vUL zYPn-GN~**JjA6UR6#oD+pG*+m8(@pP;c<(pFO3H(tlR->H$)?BQv$gGtw|TBMSDM)$`5fsaJfyCx4Bj#&K{!y% ztVb|Al^_fQr!=&;93i(8cB(DEMN4#eCb4e|RP}OA6U9k2aHeR=5J3>l<>Gs*5>Ki0 z*Rt%3THYzG+xy_??2<@P=QRl7a@=qyenD537_sv49ga$aWM3&Z^`XhP+#+g6m&J+T zp=crHfEp;@hyVp;O!hcXIDjw#&9gRzS8!l_mhZA)gz+!CYHn}*nqQj@XsKjT zO-O3Fv`$>AtYP_NBV_SYhWP>MBHOfT_RU>gO4LO)GPJ85J!Kq#KZ>J~Bo$n~17m;# zir|6YT6*QIHgbceEC4W@YVO+?a9byp=qEIBO%!i#siETZ_;Jc;V{%Z3&${_^sr`-U zUgW5|(a&S2qE(Tiq@I$RT4x+1l%Es9A~qf;hv=nAz{uc16MT-U3)Ry7Xr_spy57+{ z!(B0kD8!8B6p8Rh6B`l8y5#}LBRW^9+!Iw?t`G z97s6qbPU`Fl$1mS=_f*ZS5RqcZI_FsF_5fjPG*i-IFibx!Q+5N0mxiyM(*ha+Ma|< zV7O9MO-{}c5(f_{2OJf$a!+gzOgFD%tvhS0HcRNMtKA!P$dMLGj#9e#h)zxdo>0Fd zk-&w>?lIV%{?^&9HSxbG5ou$Rnxs4|5?A1O773J-E5v6D>JCP;NZW8P%_D0;7*+LN z!`#+;LtHmimg7fG?CNHEX_5$}FC=lJIRQhLhC|1ZI9&Jc0&d{B(O7MC_Ug!?mML&o zg7|^`a91NAFngS5=jqXLZ*7frX>Io#rLMY?v=*L?fRZ@kIKVPWIgjFUJ|+VU=j*EH zc=X!KQMGC=n`Y@jDz_yOUFEmQ3s5Gm+m_T^uhQ2bnnt0y!8iTx81bWPH5w2U-5hRz9G|OKG@N%E?1j5h9kMdth>7m2UX&{yMu` za4gB;vHf-V{TwEyjwXf-_zESbN0X94APif97z^e-$o0pkzOHVL^`@udlWuO(;+?{z z6%KNc0KJu;10dtoi6HjL?XJg%c-vljI-Y%h-}_u$e}xu~uAh%Z)lhC@M;C;L9EWlb zY-s#lPrOpo!xb&cNKz!=sDuHJ%imR8RkYRA@zqdOM>G;BWOQJ`htTWik?;v-2j#Cy z7}xxl3wdg|sd~45j&-POgGs<+i+5Ao+HVYrqLSSL+tWNRWbROI5Z8W@T_XH|P^`0;IkNY&yQPka?2~p!sGQKj= z$Ju{8>y+cUELm1|Q|*(c3suo-5hG^@zq#+EJ_g!sbGR<5q?U%`1a-6%B+y7QuBSN~ z+a&=Z!{5t2pAgo z;bQ}k16O!bl8^Re4&`&L(CzgH1~KjJrm+NIb^}`ynLoR#yH`O0r?5f>3_xSkMCq)s zCO?J=(G{n`y7XbL=ZaSy{7 z)@GZy97a3(4Q|FYgUISTcRG|+l>)AUo=@}8hV6jZ?lh^nZBju>^U%eN4>=gXA6-4b z+|Z=44}6_RN2U_U7_ScF8SRhDPL2CYM3ILKsw5dH;*~`|DOraT><7M~)W5_tOHlz= z#y$J$-@I5YF*8j_&?%F?8FDnaKG`*J%Q{oB3!n2zoPq1%T10Jk0c0||JSo*T z8gi$DHcxMsggwSMIS+%1T%6^z+gl}v1o6%WqsvZP+rD)8;AlvGspV{2z3FKj#|Ii# zZUp!vhJIPcu7a&J(@V`!zZN?V+4&7!n@?}ruUj@dO~RZaPUd8Ik9Bd|k^22KA9wV= zqRuI0+qCs{5y%gXk`ETh!R_Qf~-G_&fW7_5S-mcCdniWmbWt$RAD*?`nH&-n1M>q&w*y5t%It+(-EDHhFzOqQf=x(| zlF9Acww|thsujRqTt|ElO)bkv6fr*|jS*lf!|Rl>Q*2ZCQ@6`e7SS6@a~M7J*7QzC zGN+C;2DYZzYKf|DRh0Cx4@oDKM!uQ#Vg{GCxlFr3CED;ia(KtCM{Qzu^eB5qxYZ@p z{{Xg*)7v)*tlJvWyN+l`5>^@fI$x+#0cXdiMhD29M%f>2?XOxQrr%pes@WqjSE{$j zCxiq1%#DWteL0;0G@Y^4!n~hta~;<|_GooYgv9to^*V8|-t1eh*9GrxT`8_K6(f{W z)3^ZYKo!4bJ-s`65$+BM_ZpJc^pmkrNd0s``lXOY6?$w=$0U6Hb(~v$)v_bc{51HM zaC>pl8Y?7xhGNL{@1osEcBHBc6o8DvSL89Kn^mGtK$XW~+Zt}B+t8TQ2#2OKqVzTZ z7;#WX&}xg+4a(1ITaPsixfs>Uvu&`!{7-CW8ceX-d?KVTudi)bwrGrMxESrMGdptE z3T8wMGQNXZ2)doh{wxW1n+@?t=w_k>)#LGwyava3qe9X zMzqNjas)O2^%(WknWjirlXqU^k)YQt%SlNIbd8*h_5;3&t#hyfTjXPTDrAY_qdD|Z zlcZh8x#47z7>aTO2fnvmH`-NO%DVk~>c6;BQb9`h8j9f*pM*pinVe(l zG5vM22!FX@o^a~em3I!~5lqfYu=FZhI2x>P+mAu5>DXu7yxHgr3%R#e-IyCG11pG zI$=+#^*-7cH_=VhtQf979Dq8n4C5f^#8S~p{EH87Q>wn6^&y#1pZ)HLo1IzWOZ#>{ z+5*&VeXE+tDH=!*imZ&mau1>WwQJGX=Z+Pf4r3}9s6M|fa(xc%uBK@G7IZ%4Pp+*^ zg}<+2T46Oz#+?|M6Q5?!(^)2foQ0|xK*3k#Jn__1GD{a35eVa@_@ubhRtkeVm8X1h z2Ou3mqTO~xxH8m1Jxfo3V&};Qd-n7LzvrtaiU?Yr9ymBGgO?IJ_xbCb{{ZQ&?YR~f z{{R+f7Fna<#CsoIO$a!Xf!JqT5*z@d9fzRQdb)eWk|3a{q=`S6%M(b)@&Juy!7D)| z3?;jU>fAJT@p7ixlGR4i6bOgEALV}8I6qY$+9zh+c6)>h)s>XgRf8TaH1dR!GyT#V z2O~sp7R$wD8H&?=Ykfx`M1loyNB2l<>aN_~D&H5&yp^+7L00TIc<&%U$~`=Qd4DeY z>gi+CYFoBP27Gh>0E^G~j-y|paFb5MDD=gA{eH>wbZ=T6y=thrQ$j1g9g$o{ul|s2<7e71NmXy~D(8{i%#rbv8SD;wfsajeby^KKhiNz7_c-9L4~F>0zsEdF zq~@68XS_X6rKZVdhMa|bf%G1lQQkYgqT4^fP=qNYecROc(`{X@O1T&b{52!j)af5^ z>|49mKq=?=rIm_?#~wfHdiMJ3fe2>omF=bKZKkB=xk%Gd<`{En@ynSD3wP?l+V zR77~oge&sh!PBZAyj`z5905D3_4L z6B#2?~gF)c2eV$ z9kJ`J=-Q7E2j9M=g~mJTlLeksgmbA8$bIz{KP_!iai5;3oFh`QK6=Et*1kk~Yb9*< zI#_bL^j9QSwd*n4 zQ+m2vqkNv{Ta!A9jl|@gZHlMGW=PjOJx;HcK#msIV1q1mp{gU!3D&C59T%IU1^MH) zqO&7lDa*H}i<}@NgF$YRXhU*XfhSR>sKCJY_SVLT#-W{#bULcGD6&cK>~uf`B(G{* zh40%zWt$RmCph%)tu^=PkT7Wg`Dformp$L`vJuQU@7qpm3E?I3fSf0+ht=id`Fm;v z^$97;RHJ`Gs`jsWv!2cC?VWA6+-hoN5_qS98Pj?vl9Xk>$=T$T`C`L%^#@QsG>%BX z{D~UV4bC{D!%8`E$EJr>-jp#Nfb}|{)DC^Avs?^ekdN0xYO9N9k-#54N0#vnnLLNn zzJpfXQ!o5M>*=R4o~b3(!kIPM;(s?~&#tAV*hqUwKYvXmR$N)xxVb7lv#hQ4%2Da;o>o`^&Jz~m-5_cVe)C#Kp55)U>=uI8s3Pfe`m5Dz3`g^q`idg#h&<0Ue zxG8OQZ1&}h{Ix2I;Ef<9{{USqy;ICQgn^xJhG7;t$_7WaimgEMN_H0`#45QX>8zuw zX9N+DMwcjR)v#7T*wI*OBqx+{vuClu(3a9LLLydt@*S7@Ye|v0_+vbe%imeYa*6;} zWFUd)Mm3^KjUkohM*|>s&!(sXuLy-4Gsw6obIY+|sqhmKV8weJVCV_lF~*!w_tY70 zvT^1m8PCsCX)0Jwe|Sc%;euG_wmY3`d)o8xo619A{ z6I85`G()&>-rB8)y0GA^$!e*F9xxQB?mdpDTQ4z^JXYcW_SGX%zvUIOEK}thzH{63 z)QTP5P!zG3xzBw1XiF?ou=?S2F}~6)1CxaWcJHm!_jqRVBNqgB8l&yIh1r8t)U#v0 zGor_-maA-{mTIV?kc{yy<|9eygyA)-ZhKuV$-J$_dlTPAY_=O^t%T5$(jQ!%R0-7k zWh5Ru*Qi7M#P$d4qx%!7v|Fm7){b>_RtlsXhx(76fy{6T%zJNzZt%}>uY_aesI;}7 zQOpki06h>@<~ak{>nU3rZ-uAB$D)mSz-mW^K4(~z1JhM%==M?G1dw@@5%n6uAb~sh zN)OO#Lyihq=eB~@ZVGyTDIgzw>e@XJyn)J*Sx*ZgW97i^MysvYc$$J%jy5JB2biAu z(TnEoj8jR*P%x!|2UHID>H@5i%xd|fkPZ*w`s-9tmlcXx0O2^#xsbj~V0wD%6x|U5 z7sM=c-x}r(&DY<#?=UP$6-^T(_=t_g&OP#dG4l7*Pfq&hu(!{a)q03k0?PE2AHtjw z>xFN`KC6+feL4#+^VxJA9^f+03YPU4#<~k{RJ`_h8L8SPF$2N9eLeNf+d962TZ9rM zkq!l2i+A+)*G1ZHk-TxVY#1D54Pw+_fVOFk*|jH}$vQ_R0t5#v!1`)y9}p=c>;C{| zwbxu}VFSe~Gxg9*mg}_I>ExbT_@a$6ShInRXBK%{ctmQd*;J+g!P3pn+cm|*EpHIn z$o~MlRXEHZ6Kq+_W2WYFlL7d#7{KS?%up%H>+FX z;T7+3Z=2+IYA7Lwil&OTN^b#E+z5(}N7a~&vtuW)1E)GC{{V!V{Y_&Oon)|!$%rg; zw@Yl%!&5(F#LW@H5s*QV2qOb3Ny#2LL_s_+(mJUrD`RSUp7Ebip4wNe*;Xpsf*Lr4 zOZ?sYAJbf;WBYwvDrzLX-8y24wqmFd)JsQjGgZQjfy0GlRC2y-u2&<_jCblCkGwX| zQ>+x*vtVDKx?8Gp5@?u?EIng&ATl^Us=yKZYNC5z?i4aGwzq_Ki)d~8G)Iywj8D1L zTacrrLMYZaGwMP0*EoHmzSsLJqFa(Zp3+wCi`q&B#*))21-GU%#z`Buibru6?~lY+ zwpjKj+86BU)eW6byyNQ?1%f4G9c{k<09y?eWjl`eC|?9)xMVD+=jsE8IVpAM6^C=J zT5#NI(n5RpI$NsT(n9^@1)!YOzZfO7Cuhw zJxBnMJD%P3!~J>tb!~d8-?@4lZ=Om74bJm+h(|RkL=%DZeM#?7;t*?Oa)E2FZ|?T)Q-dubj5GCByg7T zd|2D@BMEZ|SY3f<~F_@E2b&;Gi#Wkk{oL-}pg3)0=yD)L+}F%UTR8O!QM* z;c6BDc4dJTLNUQ5mx~`m+qSPU{{V(2C^mgM{{YD2RqnnfI)nFshT0n)rC!Y`8SY~v zx2K4GbY9ssZP~jCC&P5|J9%KglIuPFv-e$W-yF8+C8UNz=8-8!@sl|U$3CO-8mI0X z2X}63#a(TmW!D(wlb44C7>Ydm0y_cn8s}@j{uEENM(d%hsi~$0k@ptZ$QU@doU#go|?Df6vR+X$WT2iKTJ~brsH<#3a z#Z`kJ>EBhh=X>p<={>Id1T^)O?Zm{f;xfL)a0Ws7>zw)<{{V#FsM`%9*}ZXwebZ@5 zSB?wJDh1A+$7B-{+-e8m1&rqef5m8b>lfx_(o!bhEN|BtC^zE*9-~C75-A<-z!7VMK$wVoDx0*llkFwHuU>d zbjxVd-6=Nq>#5vVm|>6sM+g+AbLb3?z_Nqflmrkv9df4W>!)10-d@{Pyepc~48hup zoGeuF6;cLKFwNPB^Re~NYhKt9O0h(;RLLn1B~DiuBPRvbut%l<`SgJfuglY4De*tzIrYxk?mYti1>m2;+D`~=#0fpgHd5^s1yV1V6+Qd< zlYl+&GpE*|r>eO}O>nG8>1IZnP{9m_5Iq|``;+PHNItq=-5YMyDDz6B@pefZ;hh{~ zkbL?cqs^BI_FS}5eX zLhwf=MKg%v@Pa8AB^X41nBxRwU@$*T47F|hy5@N3(P;oCIT)TYvJOYMI3wmhe%jEs zYWvv~RCdu#OeW{TNJOsAduNoHE8p8V`Dahw4}2xps9xGCZ&j5>ie!A3GNaz%?o^J+NMsS`Ba~bsR2WsB;%gMeR12|d(zET%Og=V4zm}t@UmPoFR(;p2lmiyS|SSa3K{uw^zx%N7ts3pdi_P;ZRsaXw=UDO?oHdWq>`qp*%Qk%($?~3U_$^S z1Z1A&zPVGKG8z&BcnaQ0;Q{C#@U|_TD>n5Rr+Y;(tgWdR@rckEL{aMBaU30JMR={BC+i(^@BRh14PmZFA?(@f1=PFh6xYIgqsHeCQR zN5m;%*m+6eE8KTI-FTTQqMm!5MMJyBvP&eMBQYg>`D2XZ%yaWUKHT5Ce#yJH-KTuP zyl)CE$t*Udv9lLNOuX4GA0r{lb6h9@74L#{S7UUV)q16>ueRIwFT%Z5MIerbj8nq| zirn3&6L_P3C% z+T?f<7D}E8$BHw8pk_s8z$Xdw#=75hS|yKb&sh~!(db~LSE_>F13g4k&O~w;Srx!& z`G*0b@4$dT!xUEOF49f+Ev}xca@1WdbjeiJ>r!gXDzgTXm&2nT7Zz09;MGRBSC8MG#Ur_ZjAz5QGqfD4$LiqL%_h*iJs%Z^Oe+-Qza#FNnCu8CGOr4oeEaZdV8T4%;!%d9; z0JOlza97goy@yaz<#4+0>WNZuBpxlcrZ`z6Vf-&N9m(!8IPn7`(^>92glV^GEn8b- z->NFwMeFmlCgy4-8UeI>$prYd8rsHvw%l3BTx3cb%2@9o^2XR#VRxfY=l z;o_xerJ|6bozs%DNXYD=dj$dcs2*YM-`HCr7fLuGI|FFY?d`i$N4qL*_kRW@f;vhX zaSX7)L$4E=dF6xu0C*lb?Tif)g2PKE!%Ik=CMs<@DtQMna$ z1)Br|snoP5`#$SYTW_@1)lO+Cm{JK$2Z(Zxs>)apgsPTYU=H2$hS#}X>nt=iH|xwV zS4BLuwKULEBS9rXvWW^}atf-2VawV;2~){IZYRyz2={BcTCCdpn%gy9wA^bNDu@j{ zbuwEXrYDr=5*CaF0kSb041zxs0yL#zu)%t*hTmzR_=}Wl6m3TxQKxY-f&q+))c{sk zV%Y<>GH^z%PrK&0RlT;RYKz5WviQFaUy+RfJaVzIRXE8YV0Q=Wq1(dMMJ07TUf`eZ zIVkE{imG}Afux0s@^)5`OTkJgS6r#e zkO9^ehANBgo=de=j;^97bdI`~Stx2C@gf13fb6m(1;ckxao>{|5XxVl6g&Y2Xu9s%ItP>ZO;>KA4@(N$Z61zA?5SW6UxF}N%dm4P0FXScuPb;mop zg4xn43$D+g+Vyc+AgNlL9Mn{mGQ_DTCwQJhj}q}<(fDjYWmPyC)wA|%>n*pb9TKrz ztyigUcN#haZ@-Ntm;Tv{llM%yZsmixB1M3*Zep4|Q|9Wif+a~nq*GPfRFLFBvxD&a^x za8GOwBHdfT)j_zGpThT5>y^6xXTfbL8cwSwRZi|+dU#vP(&ol zQWAs9k{gSR5CJRMu-}9n_8JFlyhU9#X4e**g{tSaAdaSWmY5_G^K3VU>PojD7$3{f z9@^(j-lSx9TVgceiPPMtv)3&ZO}=4WM+($isiTqA>ktskVnS3nVS#|pf^b*1H3s8% z@g|dd)=^8hYH6BhX{U?AEfIKHM|2rk5pZ(OG8l3g1PvCuco)5|4X)v2se+;wNQ0@# zP_BF?NB&X_xIMj(V!pC1(=Dodj^Erf$8eIz1JuIHJ4ZZG7~N4-)rS`I5PdV-J&v$N zzi?^cXdpKzJke9Nww6u3bh6e_)d_B26qi_+_->4HVJsJt$lzzW^dJu4X{M*C7G_F2 zlr&YXG!01d!V)Ti$(9oGVt{#b#hV z8z7A2WRs9F+W>{F-G1A)yU3@pUv4r*W1)MKCpcy-$~cY<8Z3^%S&>yp1h0IPois;h z{3;K{Al8~nEw{LuiKytH_!@)}Cyb^tl~P~{qR$irume0sP;n%B5W8HeXl_=+aIK!% zOt&_co+9WHLP?K`k=>a~Fvd!rzy>^Z^?jx|==SCLZ*bLEYN4l|h6*b8NemNl;_|a` z@wrG;9^i}~&6dd;>t*8kWS}p%X({WdD;O+wv{AffIb9jrDX_vfS6)GZ$spt&`fkSe z3R&b7uDgPv#B>$`H9ZnsX1dl=RZ}a=RRm1jygY&#yx8<^O~8477LC%)K$~K=YOS?X zRbMU4veYk!1hPW74apId$H)g6^(-4cnLf_78*LuCn&j&h)_10_!o0!ZkPxdXA`(>JN_+ICY3-H~tY-MO+X`%Mw8ZmEDuKZ+k{)x=?~OqN=QF*L$sN zyp<|4V-XchJ{fs45!mNBIU2%(lIdwmb6EvaB`ju0=cIDf@<`#5WJ0k50mMgv0~x?# z0UE=5?i&5FDK2$&At~!TOMI_1u`k0<;Jfhifs`ZxkVbsO0i8U?=MAGM1Hd*y*S&Vk z`=_Us`zrH#tFa3AVFg4qW$F@=7Gg|+GIFk1U^on_fQ+^@Gi%UW_QuP#Z6&I$YC1^g zNvkR>@>5kvTY{{OB)CrsKtKh(4jA2Cd9~&8LMK zw)Z2{lyvs{wYIBnTkmzLSv1rUOl7AHOz@dQAqaa6k0~5M3xd9cz}=K|H#>Dr9p=GV zCxe%UYlS-u!6A`Ug*=E}#lH_@#P`OhSnRbH>s>zKlHD}5e-kJ((@7j^^0b5=2&kM8 znOT5QgU21%u5;RU`L0(P=%}b5skf3|8foejNJtCJ5Ym8IW*h>@Y{|<5yX&41my7^lBs%Ow`ndD)7zMF5R8k)f+>XN40OH#m6#(|{b_yZmsXMke9Z~$zd zLVM^{9jck4@aXQzOEs*ZEOOydoL zxd3(CwF5EC#wL6(cVp z<0O-Li}`7|q-XeuSI7~LREz*Z-r(siJTA~$>_ zjO+;YOaMUzGH$+9^LcMJYKn@blf>{Koma8o2|Sl2&kx3P>IMiHX?7m5i@nxM&CbIi z#XDQzg6B^h=^O?^{Bs(hb|;QW10HVOzz#FPR_;C_1sksEi*9Y3OUn~l@3qu++PYhOz3<4%lTPC+uGj1E#hgS52A!?X_sFExr1%5C5cI2cC zV*!C~!y`9GQSH(`+bvB(VWg>XO$>C*@k=k2q#j0mDo4y5p7~t*;GEr}({jE2=}lK? zs^E=HB{ei@;7=Pd=OAFrBW!U2xZ#1|d!H=0a5x7c7S|7ohbt;ulmhL|%BBYn#AF<=bIG`=)Q#zCg8u+DMULI@)=9n^rgp5Hy#u>17YaiJIWe9} z3Z7lrfXHR1`~DrVLe#gKS*|pda!nn4we<;Brbx<&(~3A5G6m#am&gkbDbmclnj3Ax z=_J&qSZ`B9EykeT7HX=vyfs-8W{Gg#d=d($Vc6%ejWC<@ebl2?gWf5xmkUijH8qBs zXyA58XSLR$m7R0R6gqd zGiuzMTDFK-F1I^{hJalDG6sU26O?u#x$$LU2={K`uyQr0abGCw_Z`;utwB>g1gw;h z3SzXiYNd&mXx2wl%~*N7!Akr0Q7ShI4y9m_P&&=kvY<+uyM=w`ooXdP5U8MHhA|SU zS8jX&Ea9>jAB12A03}fDjg`3GqUB+hXle*qpbuEk_^P>C6Nn(^kw7?x!jsqmjapIP zuJJu36${g?9UQXL8LJl}wMdP*#*c&nQYJ%#fyoFBfyOQF)+lcDyK1x>%oS9#%+bdz zlA^@HpRzXqBw0*j_+S=L*~!kB+;HVAJF=zj`(|0K?^MuTV@Huu6%fZ5X+e{cyT+t4 zwtI4H<4~#s?dnuoit5>`WQ&qZAw^Ynz$=dV;tzAkp2Glp*mG@}XyS_OzA&PzjiKX4 zzB>k2A+lEw{5${)A>;#mv!GWEuU~zodwbHz?4GsFIHK^+>TXB@9?BbAo&J8NmI9rP?Z1Vv$sbG0p4d$Q!aMptcH#=&5O;SYe8r zB~>}IfJ!gb6esy9}OiWl8HSsRfBfVagOAWG6r*` zwm4eT?E=0iiF=*>G{v@ew&}9m*70P#O&Oq=JhVmMz^IA)w-_0Q8_W(#10DNgU0<;` zl?L{(#dxPd3l=fW32sIy0q&&Z<%9VVt}3Y78-r+x9_3plbimCWEcCEBU*VoC9I*r+ zLKJ%U@2NW%tM}c#ah@9`b45;t-Ra8ZUAuar?pU@#Be?DBjdZ*}TKy}Cz0CM_ST*_) zs9+#dmvwmHu|*^4uUe%-o@@aa)jhF#vli~PLt0Q%R5=RD4i%WMA{V(i037~WWIMi} zlO*#go6^76vyU9saS%2-;h@lRP#l6@OKn%7N9cM_v307HK)nq8#5 zP*y)GdX(faJ2=tHeP$dLsP0?SmWa_p+XY{J6}{YT_Yoai)jcx<$yG9p*zJ?6_Kx8l zWL_df$$~}>xwEI6s@Fvd3fhN~HE?_-Vi>pO>5X3$TcdAB6jZTXY1UZ=QZp#!`)BK} ze5^LM!u(QTmSCz0AZJlcRzI6M1t#RCl6QbHCNqZOGC}pn?Wi>y&d*HoBh7-@4U^qZ z)M;A^e(_1G;)(5^+VoCa0F4H=U1;u1!jg4Ej%pUYX%$xS8^;Zcu6$G(cfluC%sN)HuEqkRrehEGQ%#P%UQusi9hXwl>1 zz#Ml69-0|bBrqJZml(;%wunBC0;jO0qid;>M5b&yxyK+s4vW*#!AC!V0tFmEZ~HN+ zl$Seu@x&ZR&RFU-Q?*T3iA~u+_0N4rJe5t1H!ItPqJp_uYUtye$XCvw_CC1JrmO46 zN+VekYfWP;J-ksjnTLN>!0+4G{JnK%K^P#(EX0g=2U&>Y;o3k)uW_r2c_Kbiq`GM3 z9$=^)!?micb@EWZ@l+znvIHP7Z-1xDQ|&!DyVO-dQC&=lOUs;%%n^a?e?R+mXxy65 zUsEJ^8W^NhUIh2#S3aGzKC-Hw*FeI6P{eTWvICygd_Z}2kHhlKG z!rp8Qk<&V=)KN#}Urz46-y@ID^3ghLr0X$;amjrEVW>9U-32=ee-DzJE=y$SwM|{R zN>`|j7DfXq2hUiX=RUVCgBsQkA_==TZMSjKi4}etuoBV9zz$z9-!ZCM<3iMxGSSSV z#D&T?<~4I%H+YUe4q9SNe*T}ftBd@US8Ab9vG{CQmSO7I`Rjg-?rt5z=WAkX{LJMq zTi=Z96FRRWjIr!A*?QR5m~AO^rFweEpVz>0O8$fo_~>1x(QTfoR-=(cIcDXLFXgMA z*;8kxv&Rfkt5c!@!F{vz(a%28Hl*ov<=4LohquwSibGd%r;b#pQmqplkTdQ*wJYxJ zu~>y5vpkg&HWedN>GR1wzil7;Lv@>^9Rb+;1S8# zgLT~5%jnWSolf~yr((H_W>vSWhdJdsHZPkewhkv8nD zjnff9bZ6QZ?Vr+)lh@pKKFPMG?Z48ZqsbeALrFe6q>_V~84s$U#&W!rgOAUSqjf`i z^+x#D&D(Zrmp!6}F~S%Z`>2DmkFTlqB%GZn4opr!$@ywZphd^I_SJ4KS_2y17mA@* zFRjSz%)a1zYXKiKhCRJ?xg*MwrvXpzt5^#@4!c_m0M`TbN}Ny|!d(cTD$n5-?>r{!F*0;u-D7^v?oB(9fI` z<;TxaWQIm{#_ENrUAArN3dCOXKt~FSa($$X_g~MrKE&zv zmYF>jd*fe_+cSA?O@n-<+&fn7HNL)-<~d?M-s(ZfWh2!{AnT)c-~JFzqFX!|Hx|;e z-U2uAC5fJvNfYUesA2QtkEX8Ab(zqS!u2-~v8!Nl9relmEBkr$n|Ic& zvw6|g?HSww6x9#$G|t_J6Cx;NIVZa)PzFm4bRE~N{TkTyR_blp)O#JZ?v(9SM$*)B zj%b0$FzO0`PC&^SAmcbX7bw;cXoYausMX5x_Q1xR=xEgt0>0X%`d{{t`#o=Gs*i5< zdu>ZCBNUQ4s=tDM-^{5{5uJb1P*>}v{q6q%giq|bu&*;%4(hMmGt)98lUS(5T{t9= z!DcL|{Be`Sk=$cF@sYs004*&P7fVK}>|-vdeY2^nM$r!|=igk#vi{%y0A@Y?xTM>( zo5rfoC~h!SUZ~9-Ek|tjl#&zQ{O1C3+dZ{@Sofs{;j+_THs$7q>ujq}5}LM-WSSY1 z=CUa&!|F6WGu;;OIY%nxG%*SI^K;t=+e@=bo>TWWWeJn^h;602b62T+%D#LhWW$HNCW7$knWOS?x` zK~fTRJpDi&^$J_KEx}Z-2Y;c~w&~m1V|Jm}l+$szTPi1dxas3Y8!uAbhQzvTKqX6HV3A*N~MWl2<_|Xq3mlZX7NZoGx)Qk4OR^=1)S4P z$Xk&I86V@RMwB8IVhJZiY2>A<;^n|%JND6fJ0um^ZxM6obqTIiS1JpBhucy(>K*#NYgMvJ$YSQpft>yv z`|1YYyFE-i=3vE-e4QR#Ei4u=;3CxwV26^AL*GLxHzh3>26ZMj{72+|TAgvLr)ozA zRX|mVEPe5+j;8cwt$ITza@>3RX_3Xhl&NLg!hgH(st9RMz#eW#t}(>uO+M%?6g6Pu zzkfG!G_7*B@r7PVxi791=xrN?lqVvqk~`_WCV-LEaVqh&-RZ6nD=EX{1ZPv`fh3IO zK{)l*ZMJ7vn7@d5uc*(qo++-;N~<0TE!lo#>pR&?OC$tkCvMw!7cvDc@;XJUi_G1% zWNw<8g+^wgkSg{huVMM=2C+FYV7|Td)_hV=C^N&J+QDN1xclmBM~`1kYMK&P%Gf^I zy2_$R3LLVkHxRwg%Tnm+*%UkEvH9u@C-}$2!76k~D-aL}2O49TMgmJ7F5IM~SsyKF z6q2iuq@4QdRW#8{ft(Zd_0-TKLZyhw^wNPKr%-UhiA`@&-avbg+fr7AllQW*& z7;P=}7pfZzq?RA;4*vk$bher{ERdO)m!3eSyg1ZkvtS;;Y7&jHgV`Ibk~%n=qOPVG zAdPbJNZ}Pn%#+w@R*SCP6P=P6`nj|n<&~jD`{E3l6ycZgdV||vm%nHawue-@-7R+9 zg5cJTsU)(jbaaYhGr-IWr9%RILIRKUeS2%4WTvWUzmARKE(*%+fIf#lqd~bnux-gJ z`T(G;p}A7WU2d#`s-98GIiZj`IQfPd2U663qp!s;v&Y(tsa*=(ln`6@HF?^pT$0@F z7+GPSERPezSL}{JI4V~p4D0q&X>ThA_u4ki@3v~%uGe>@O3GG6%Q7&}5(lFL*pFfe z(0kk~b9SSH&FQSM!@s`11S)eNsK!Y3BU&c8+o?w>CsBcugXlhbEubJSrN4=9QLhRO z0NZ=s)4FS`;kDExuv^_@X-6U*nL`dNM-~_(JW0XqdyHtMeRqTSeg6OsJTDFdAPYwXN5*8U|&!#`)tp4(XmJri8&0~qX2I-s9oPQbK-O zE4i-9B5w?Xs@lG!y+98AiSMVx++}Bx*jg^v$>(n?WrwzP3L1Im26=!Z)49~dr;1f+ z6;urR>J5ET)5pR#^Lyi3LB0|fh6)AAnl)zpyA5loyd(+6FDMDM1^KjINZIn`#e@5a?ndv$iyDFmbs@37oWehu= zLf|=7vB$Cq+qy{~iaGVsS_{j}SNM!c^u~(Y`U!s`Lp;i&KU1bFM@!+f(miE;NK&Nm z82nnDLD^QvAkkGyRY@ng^wz42%TtiA*k{=1Pu}UQibK|ld5jj zS8bzZh3itfW*oT=-ecd>(0ggZhInF#Pf#=4m&+O&R1Ooh&ht@IOy-#Kkw!@;*F$M1 zu4+$+o=iFR2O~ijs{W(HXob5-k^i3j?>iZcH$BnC3;kt+YX~4)O^a24nDq` zJx2E$^Uhep#yj$6^!+s`DMT75yqm7NS;rT4IqWo6j`es6#LC=QcNzB3nkrR>Wom;M z0|y{_>TN~No&tD)4nBU`x(biMN;k@wNE!aRl~28-Tq4Rd=zII>yuMzXF`AlSc>1UJ zzg+~MaYGF}mGvBH!Y?TckUh0~LagwvsXB)}Bua+4Ba!_v?W(TRyX=?!`%{12TedM( zYkvi4rYa+eRgPIyoc?W(L5))t{cg9^R8%bfBhy4mt0LscbM2BpeN`KiaV6feS?K{( zl0zvi*|L4Td+Bd2Xu(=yh2-Uaklgyo(mO-aGu^2q@ez2%6B$*r{Oq4EY@BNO=?_q? zm%5lF`?{Wvh$uAm03sxV(*bf0KTUo;+xOg*6kI8!j+L2L#Sz2H#=s*Uy@n5Q>7Q*m z?H{zKP^^2xn{i2Uf~F-46H`qX5GsN&c&P1x@9W!HoYuHir-r$v*X~+fC~0a`&s?t3 z{{WkhKHp6-(_E=#0~lPK1Fy!-;r8p^HCIb@+h@%sJ#`rdaWtH%B_89$_3zwd5!?6G z@6(_BBG$Xb4Ltj*SF%;ZA_?F{@uQVHWTSQ?zp?Zl=UANsscCG~ze$YI4@0d|R7L6t z*9+Z$@SOCv-7Q5uEe+zU;nT|}!thyS&Nzi*$bMu2sQe$C$5o8ss;ng z^Zd2>UA}(P9c$l0dK<>_u8NXbT4$%Hk)uz=oO9+%4Nd+9^KtuzEU-1T}5L3+Z<&JtM(r}YPh#`7i;c2i@{xb zG_lA4P#lNkPj>Dxj1|Un__K|3KHvLB?>kjI+jntO(_g92k~Ews9Kr0wkU=9p<5m9Q z-8Y++(d#Cye~U-+%8iahb{GS)*ex`02-tDA8Q5rTZ@Rmf2&YuA6x7d+pYtb288*hp@t~6D**d z_rNFL%iAZQcIVr+<7|nl-)glbiiS@OrJ2mL$fbgYDh?0=!`%9Pb-^7zrKUCU31v_q zhFXxg^&x%#0CB56)qEG5P2X=vPb6kBB|n6)hcm86g3FPRNH5%c`}Q5UTIaYw3#F!G zNUrOkdXfJCgofo;8&g?!rF9_;R8&j{7fcbJImq_)BV2!f>-SZ67UqKcHubzSK_kfo zGF7|B9!Wodo+sDk^7(6J{x+GK8?@?`Ymi~!R0SQs^*wc6-l!zE)VL9W!yFiA58oZV zy?uWzNK1VcJQ8Udi*PM864zJPyww~+tX#=1-TSwGz#jPb_V+qRxYpEHJ54JVW;y== zkEiRY6&`3o%kn+7C*wst+@Ufgexw8GsCa)2@k7S|5_Ps%*ML-hWUfvJ zq0jxD^+tjst*x2X8=<${ZCi%%P}Bts@r420%n&MeJ&t&&B%Foif^&njr+;a_u5^yN z<593TMNOG5(TJ;Kr8rrD&KnJt4mma$0Lz}lYMVxSX$ZjNhXfBzNRnYPb0h+Eu^Ry- z4po;piYn%Aq0nCI1;(P^FN}H1B=0*(H1!St06Qa+c^u^X6O-S*bPnTcn$cWV0oYaT)TDUr&5!rQ371<8x6sBD{|?$B;OM1Jl>A zQ{VE?25dOt89T;8%F|O4Tv`gaWcWFoi^iovB=%f0XC3|Zk+Ou6p(YAaSj4dzTg{GZ z_{lAwJiHRBjJK;{mx~_9 zzo@|keRT@wx$AsU;Zwm*193#oSbJce-SrlxrmmvCN3W`mIS{lwqiphF-yXh%XTN-r z_0F%XtD{^a5mi>)40Tl$+#ADGcV8%S82A0Vb{^V2Up+i9#VurF1gBiZl30`S9*0V{ zn~c#@O-LaDnd4=eQ^&#>J^PGtAoj@`fpDoc{3aC!W)YJtkCB!qBrbkL4K31H!XX)~ zqW3HPEnGb5Wiq;kJV+`?_Y6;Lb|0|Nq^YT>gw()7213k{jPb$78^3Q*b*@S(C@9%w zmHclgY%WqYIPag|+daK?s*;{Ls(u~{haj9YnK*MDyJO$E^zZGUE++vNz|yjXr>KZi z$1?GG8OnOGAx3kK{lOr9zn;AK0QE3OJW?cbumcffk3rwQKd!dkZKl;b)4M||H0-d? z6P8xuaNJmSApHCL`e5kZ-`m&S*>r-@YFJiw41fclFJYejusMExkIO@Vj9&^}2HLVy z*;e~4`kpI*t6vI}EaoT!6=s_q)DGU@`}gmomwH<-h-J6RDkOd_Dx(tNoq2Nk5t2qh zAmby~OLW$Yt+MC$T(1{8sA3*e$t0qOQdLL?%;PKvxhEr9e#YjFLacL~S-? zxB4-#-B<+UAKDf_+sT$*IHDW`~R_#8Y zV8EcDK=*n@c&J~`+bT+d83Yg*k>9_fgP&9Btv7pA%JDh@pl6R^=gV z3=`Pk79-qhc&KRRlCGSsQKM#F5vO4wKOx^a$o&uJqBcaWxm;(Zskha945=6@@vM0q zNhg}OBa_Fs>GRenJhIBxS!h+eWyIGwd}J~a=J6wO6{H_>q#TA!Z$=1+6XmeG&b$ODqrKM zp5tF4JV{c%7=<{M01!fwFb)}qWABUzTc*QidNvf-W~%~G@W4uwnMfHpF@h7*7#Szu z83$Xp4Qy944~Dg(;<8AO43QY&iAD|;jtF2*3USZRLE)eLpsf`YhE?)Bk;qw;<2{s* zTzts){Pm%w!inW$a2zZvZ&ftb`EArOQpFsCJg_X0z^jnMxyxXM^}y_X{XN;6W~*~t zsclqZzNkv&=4x6uX_6J>WpobeJh7p23n;+uKmh7w5Z2blYQ7zeP%wr`%K;xYIPk~? zy#4vP%aqO#EOqkDa{H9cK@B~m&|%3eq!kHgEJBP1{j?sd0I z3Di79Ia#HULend~(3ZE($i8&%bk*%G#~p1YY)+*kuA`1Onhf%Z*#~pUFvWS0GmPg@ zWx7R8#8oT{#BvpKpjHjvxb8+V+Za8EU{9@&)?dE2{^uLI(P+I}Xi|zgNG7kWHImoG zPE2Vyc?k{3D&*vm=n3pJt+qC;(W9q=@o134T4jzZX=CJP0z48zE-kyqPu0bIitO` zGu>TG>sbrpSfs{T7^wh(`SGisvvfXT|zTfG|fm)(3zN%UZX*@zCNC1BXIAYiVe52FTmaK~<{@Gg`RrcDs z8qY>NCY}eM_%a?OEXBMqowUffGjoneZy zg5fFfAaj&Th=e%@K4Qt0BP~ItNL2|3YLmDrFu1N~s zUM$)EZu;GQqTAQ2Jl37#*1E=}nb*Xol_}qYB&z77q)moG6>=L40q#Q`0cpuOL?1+U zRg_}ObV|9aw+$sF!QQ6LS}1LCI&z9eK_uc>*^Jx=A%LsIs064QS+rO!aojEIxb8MP zy^_IlrMcGC#kYWFrHrm4FHbQthD328Wa6SMHhTeRr$FsJOS9F7xmfQM^%AUcHGP_t zRLM*tP)REaOHSki#I{*Hg!eeqYX?&-oiE+i?V)qn{{VDt`f1vgq_TJ>nW7w`XYiw8 zBa~u8VHlqNnuXMDy!s-+8CI_6iq}oE-*W9bJN>qe@5VDW!6$1;GzkGU*6g2^8X zg>`iFlr{B6YRbr@iA2V-Y$~jU*dSSBJ=wjy$F?O{-)xIilS?(qvZX2}hH6g~CSy>c zT{0LEocVwU3x;0#(j1UkHfHFk>Bm*~1?9H{Gl*-_>2Y{POmaDRswsFCrwUZ3U<6gOc&|tXy#RxL0Lv5P<%B8H&Y~JjA3%2yOZnR05+xDY1+5#O}hKEuU6WM zXg(qvl1#OfGseupQ4$3bM#?fkW5^XF)M|>FfLblJHcg$rD}=OFl++b8w6=+ACWYo^ zVxnxSrcqhfiar~N9$hkTMPIlnu5@>Z_U-P&8Jb&l-t_QNT*8bH^2q2_*o+_N4xlzi zECG$d)J_iw{G?rQt&0AzbW3l|71GB`Q5sunmL{GSVpUn0mzkKCKua9(Qcn^O_d;(| z`klD!*GmoCZ0%jeLvJ+IpA%O_6x9neJZS5e5spMJiO5L5G7fz!C@z;P-o#zWUD17? zO7xM(a;T!Bql@o0rH(-(Fg_9nCNz^FWGsEhuAR31r+)Pc*IoYr!8AKg)p@r@l2K)< zs}%DRq@E0K;j1@nowVJQw!FNqg|==B zozmt6)4?KBy#D|d0|bs)2|>w!2`3=ql8)tD-x{&DmgS_m-O(>JVwzFm!$AvH8os6ue-{+oL{%S&ebKBYH3~VP(?=y24>?VZ!0?xUy7CFMshggxnPOSIY@bF zRvz`bZSBcJJ<{V(YoWP3QBq4i*0HIDVk?k{LJ35S3$O!$ZY)8-#xmHOt8HIadYH`> zG&boahNz^iBO@W;yu+%M`~;4`5PNd&bhEtnZGBD7%x-t7sYLgO@gjkeIchuzqzpt}Q94H68mE-GV7Lv8;{&#EeSNgMyZV0jTDnNkN%6In4J5OW zSR9oZKTM9^!vJVa9^{URZuOS=7{v^24Y`D#BBX(^gCsKJj!(Z~+t8gU)Ad%ba8lXt zHVS*ibtPDcT&H?UxTS|2n0QL;hElmgRv_%-vXDlTu)J8|HKfL9Dyw~MIl2eb8~*@U zdSx6GaN9Q|w(ZHcBdK&ZDmf#jWO(84$;`Dc#c&jPcz^>bw0EB6scn%@6%O9Jtxf*0 zQmY$W(Y+K>AeL6BM&hX}v3R?ja&mbRxYCX9d0l8Bp80&Jd!+@srcWM{<3lUgTp)Qu zL>RLvpOPVHi^fUej1mr-?Kf?gBx$}jPT#X$CKQWBOG_Mrj!Kp00ZHO0#LBPB@t|;3 zM`a}G?>pKoafLtzoGk2D8mpe-w+fq}@U9l01(4z7ieU=L{6a}p56W ze9QpI%EpHZO*qI_L{>|b*SW5BbkwyJktdE(IWu^Q6-4Toz;Vc)#EdBJ#~K?^Y?9|_ ziuYYtaJE(oXN4;5(MG|@Vq{5Bt9Yx(7E$YvFvBE}Rz9U&tkw_hJZ6UOmZ~Vr%>_I z3ywL)F{E@vZryY^P7f{=Le*V8uVwA(`_0PXPH&Xe9}hg0&@0CADO_-qjA9|!wirsP zMhCVOEgeO((r&1!*6CdxZPq`Cx5Zl=X&f)XWQ`?o3noe_{6Gc(k*M_WU+x#R+i=#_ zZdwym%(XRk^@?YeK=j`rJXRX zz{{T@$1r&)BLs}&I&dtq6%boRH&AWMHCAmmip#{bX;jrKYp7T&X^55DMyCPc5|u{t zDOs?-BH-YR8iH#@s*dYwk8xLAEYi%fQq$JOP;23*5-T(bG;GC}h$UrrNe3Je-CQV7 zxTvbPN=H<(QLQxWsM0=JF@;=`7<#B&p2T|lkaBvuyPUQ4GhOpC)uQpGk|^X8avX!W zkSw2!|oLE=P7%NZdGK zkW_)(91*42Ar#j2yPG`JOE4=1JQR%2QxZm5q{6#1#xPrm4$2%Bbt46Wwt7v%DJb_N zQN0PNVzrK(B}f^R_-!Yv0Ir}CeFvfJKo9vjpzvaQT@`fJ{{W0?U%a5L#1a4x@qZgO zToS|8dmLlSs_9LAzeQoq9IY39trzw+Xymk0C1e!|a9WrGafMtgz84Y{@nk@lUSwk# z<^Va?Pivx}u-DjRuC-h$Inz^98))GnkOZ{ z!@-K3DUCC^DC9Zj%N#5~>_-s4Ho?xmmeX;HqHAS-?YL1;QIjTOidB&ib0%O47AxLB zM-}a!{#yvh88F++`A_6gOv{GX!+q)gu!Yj(E5gY!waJ zmo7-suHLVga8=JqbxV6yTPx+XRkc%zrC9;-BCMvK0KPPCtA<>t45!d`25!4QZ%G1D zQ(mogs61($_=qKuS8k2bM`y0t_Np|m6I&`KpcK;zc_c^Y%@qpqJVw9LmRL!j_NSODm|E;0Gc|^5jl=WJUZ$s>fNnrh)*R1&=?ybqFPe1nEA0|I?6$4 zfKUS}l25jR!LxShH8w5TY>sNE8hRQ?QkpfMIZ1B{W@mF4QpFb>z{plA2b)tY+urxL zt`T15wcM-eVFos5x6}y2dCPg!5RKW`w{9f>&tfzeb@hh%c1_706$NBeH(EM)BSTIm z;o$}DO8`M8Jmlx_k3ut}6T(|(^hqs{I+OJ^M#H;Zrnt!s6>aH}k?P?1be<#63X9=C zF61#_oKGgf811dE4$3u9rAFJfO3>1z{xs_=yBL|2p$vGd1poy(AHz8Z)CZHI+xm)2 zoyOo+0xuCs`!#$y+E(k{A+nr$0_9Hbu5O?%$}Up-ZjAt#&I| zr9Dc=%<&Sb22M!I-fXv^Ki)IA3#}>#n|A90+w8P2OT>iG2?)eM`M;`k(etS z5s`v$pk!sUjr(xHT}JdZRFziLjEZ`?MT5mvQI%1{B&RMTx6{6G29xZtG}}deQw9^w z=KlcWnp&He+%&UOQ7m!QM{lEv<&_v7eAYe+z^L;t76Dhk%Add9?e`nYMP#j(SY9V` z{{Rw<4A06|R&&geo>@L_T(s46-=6gjpVPO2D z!>b|lV0o}O{P2AT@2;$+n%RDWC}`T6thX5wpeo3mh5-n8`Zu?mwtaAQLT~#uJr?es znmXuRYq6SU{um9wIRpXaImS5TcJGZIns+7SALeDuW?Ij84KB$3NZ(Rge4NhSQ=_|6Cz`uF!a z(-O5Lx#F~eC17}VW&jT<1RQ$(dv?~AkTN;!vytkMWV2l@6_V4soD+p|IV&zle2-sm z-&QwFcTAQFvn-4m$2FB!HD_E5hF*C9hVBkB57Rn@Sw%eXw9?YkO3tGSWa8lW0fABJ zk?ZvXI$pjrM}%Z z=&ZNhZG^2krxD8=$Dc9dDIhS(IT#r2#N_Lhs$|+a&O0uYGBZ*tvZ^iRwJZ8xb)RW9 z4Q&j64(&r)vhgl}jxLMH_auPBIPIMJ=?ie~PM}$7r;@JZ^V80s3|d7QLR233J)6I- zeYM&BQQI4Pe02JBxLskr?uco!l@oB1dY1u=d}Cx(56g)BAbR^9axIGLw>yMeLV7yd zn}R~|R>fNatZO2Zklee1JE+Jw^zYjnygS5YfratpcOT_)_1Y-qc6scSEZtMyR(V!f z?rks~iobm6mf7}(-jr27D+H1v;IfuJp7{A|Ui0Z?MKv?rZB)w?)ZtR9g-PYiljcBs zk@D@|+f|bzAu8a44hTNl^;$i2ddT<0f8ya!r0F`IGP+ie?Rzz%M4Agcl}-RWT23AQ zMEBFBgYDO4QSsY@XEIiW%C#ii{MbLPnj@jYs4v@=RPkr>2(O#MKLcX>Kh-ROdPKM>czBJ;ti&d{WGA z-G%yZwkN+`d7F*SNci?##l=ba51;3!t4*Thit;^dQjg_adwlb+&I>307E273nZ5Li z<8GyH{OIoS)jEt1F){fY|YyMGan3` zoB$Y}-kQxLTyslQc;$698LIpee++|+dgofJE>vk&v@%pDh~4;m>Nei4dYH`9j3X#y zbNs{RKAIK2wD2=Ad;SDW>p1L;{&#^HSjZdISYpD zbdk5WoYz`WJaa^3cHm(|1%vA5xF#s+!aPXUi!VBsCR?HY?7g6 zL&W3_XGIe;a-1|_ju#^t(v_ccr;ceU>O5kK3rI1<{dCiBx>LNIXPJ3pmI=_7(k8oc zMP`N8nbsmp07%eI=s6;c?21MhPEPH3=q4Ybl)lTwL z)Vyd%^K#A(i)vkfQM#*y^mQ`DGzu3vL!5#=wTv~%EPf$9^XLwht~;ulS7wRhbAq6r z;|EI@ZS7UI>DHjeW{sPONbp&Y%f7FsPYR5+m0;D1ab1x359%}PuWr;9s>^imEl7+* z_(|>G>8iT3s`mShL}96>q?vHMBvF!oF{yQ%;b)`aB#IN%hCceegdpAu-3>63r-B?V zdmo;f?RLt5V|M_+Pp>^7#k;oEyhkO*@kI+re4MHkbNOWV(?vf}EwIuoRIDZq-9R}9 zKKi|-P^7`SlGOI25=MeXz~zsZsL~VcyS>ZLYl=A#9FxpsewuWOR@_t~MOt{7L1dCr za9icuP${1AWv`Bsno3E7@+@MMu0}F)#~zwCJhV_lBSX1E=z4i|rKM>lni%Sv%BVp3 zeDnhOxb595qp82|Yt1zkqTd0it)6GXMuYrMumdEL0LjxH_v)tD*n2{+b8l*g8s zz@;IYR6c-=VB~viSX|>L{yN(nWnV4mJ#}@2^}1ShRTD+s8@J?sTKFgTk8#}UO$p?$ z7(o1ob@#@-l90vcN6cjQKO^!wV9FDfsQ@k8-`nS@K2<EXA8 zeMi$e#HSxqkUc(Hp7D6VAvtV$82AUW<`)3_FqOG+MgJEgk!@$ z#0NhvN9(9w8BdW6F`oLHZsqXlx0I2{cgBr`j#MgTJx2+72P&lTCmx!0*N^JYI&K}x&f#1uE`PLNTqd#B z?TW6e?wXr@e2XOU)LkW&$zI?ru1t!#!78i)z{oljI=j^ux*M#$MBOr0$O64fUaCx` zK)@XN=dd^(`)Mo&1O}5i^vTx1I5M*~2stAjx-bG&E{@p0Ztl2j*QBGn-Klp~4J&|B z^9PADM}RTouNevL_?WTz=T^-Z{t-)6R4Y?|=}7peVae!j7(y~~L~g#rAId^B{yp#&WWXILP;=idH;8u4)Mo)3yJ@fnO63Wjf;_knPPYx^? zS)Ha1Jg?C>yei)gYBxz?m3btQuw`NM3_B6^)a19wrHf$p16&8QdX>EPB<5|ce43My z1>qn(Oh6;LFe~U!e_dQn_Q%~78+NLhw(SKi;p6b&t*6P28~gqf@&x19oM+hjYRrJ3 zI#&(~>4R@_r^~I7+j%Yuf(Y(Dn&dkN+Rv(1bd@e|ZoU_OO4XFYHbL$OgTuGyq7`3k z&ZD&@OceWjZ&TFF>d;RdGM@zpsN(KJliRt*JNEC`Oq8J0yzsipJ*p>l5XQ()xb)FF zUAKLpllTZ`Mn1zj<(pUAvw2a`K^<*Jy0| zJ5vb_C=S2OJr8Yh_RRkP!ZG%6r>H|;Z{75W6PJr6t`}8r?%^h8&(|2$uNVFi&$4iq zC_lFsJ}jKtU%0Bc$J-%KlR5V62>R=nKT*ep(Sk71mD1c+G3Fsa(7U}Q?%*O@Manu@ zSpNVK%xA>MzA``T)k(Cz+ka(^_c@`q^-_Wf5AxjU=b={bj?XeGlb>wr@3ma*7s@EE zHandqeI%nX&r34P8xNx?BUy#8-Dl#S_K615$H6D>Evw?&cv7G78%A>8V^+;>SYbr_Bl6lsx<5sxAB zBRKuF)$r{^&GLXY_g+W%k4K{b%JO%d01^^X$~%&MG)j)^d$+;x^fx+~Q$3L!g&(Gi z8#jj{340`iBOUbLYuKvMBTpPrumFZ6@;Ub-KlW>@sMbWm=K!xI;rvvxm)Vu zG{rJvc?czku=(iwlwaI!mRvdOtK*Eq`zUR>vim@YOd4V z?KO%PVoNI?+5Z5)M;&lgyp!e&eP-yMpq~(DoYSCfIW0UuL&I}YI%I$Ecen)oWVrG;dQ&v$r`UX;*P2&c0RzP9OLPOpX;V1 zz3s^8Ca71WmbzpiqIpqcjGP>(1HYjik8J+BL1KGe2<1qO6d)wz_Ru+- zauK#b;6+;!6&wvceBK;NGTrgpT#?oOt5!p~>L~W* zOU+DxuOsRE`~I5Sq0&24>H%ceYD6`addaw>1T1nZGkOl)^*TGnCxRYH)np5vEOp3V z@~2TWbkz0cqLtzynrIl7I62RL+4lKpHtXw+?ykJ84~(>MfRW}x8Hc$z`Rk}W9p?+4 z-DTt}m#9B#nyr<0skPcIlr{1~LdPRi9y#|c7wMkaAD)BR{@iyTh>!2>ivvUa?Mq(4 zhtvi_KTQ6*ZW%!lFr79w(-pH5189WG?C< zkpjPbl5yPU^Uk#FxPpzYLN_8bl+*10{Q80(~>A zW&UleV?o<#V9e#;EtZgeF5Y9D=U<>-_&UDTk=Uf8`#0!K za>s3u71*{5Y}-=ki(7k&rWA~-MG)YTpI{Vr$G_%uE2te|vh5h9nxVthM;|C*@q!6t zIS83OvQPcG;i})X*HA77Micxok|KelVsPjAhEJ&Ps`jI(TavD|=dHcZROGW4s+LK7 z#1Y5?p5xe)t?clJgK`yx+S63fzeH%d=eDi;R*J81U8y0z*KtW9QdtsWd&UX*dT6ya z@~Wz@_&Su9kUwR1LcSsY07pKf^4I45H&dFMZ&g!O$MF|KIhvZXMj@l@JurKpU*AP` z$J%SCR>>fHj^U`NrlmegWQj*1?m2ci(4Pz=-9j})^1n$d>B#WuqGjK!PaZ%jo zTkTuE-lBI}q%cykiRB~(1bUI5QLoRP%l6d1*2yhJri!APNmW(jk-^ReJ21(?(hXPI zd#KH4lE~6iH9V@z;mD=V56tJku95t`A%_=VedOlIFoT(#Y;quBr(hQ z8@5M&{=ZE-SMG~zQ*wf#8Bd|e@2|q@8^zk&I!|x7R8vVCWnL*+2>nK`if^_rSMBy{ zTT)e9+B#(L)!HX6z z;N7kE&fga4UMJSe%V$^;V7)L+-X&C(TIY(6Zzz7n;i;5 z?ZtLQcID=H(V=C>x1iFk!*a*TgS!I0x$UYGX#J#Zdxo&n(A+?ihan8h#h7E;=0~_1 z3AwucYHGTcfkLzk{8Ge>pV!y))0+*1qFv~(s>}P&$~qY2nX&DlRikkLvo#C<01)6P z?tiAae)sl{+*S0ZJ-#HPlZFETbDaBrnmy89y7gMF>Xxedceszn1kK^fSJ0Kt17rUH zQ`=TrN4lsmoR!hGos)mONQU88@Da!|Ir`)B)t9#VPqk=2%C6N?Tp2Nd=Zfd@*F9eP z+^|tSW7bu}SrEfR794}`k%QQ2tE0bYyKdv9_Cjn_Bg&q5yRaEy$VOD6WBLPNKhwZ4h zexpTgqmrWOUkngI8EIs998pK9Cs{)YS_^|!kyU=BMQF2?K8GESseiN&T(&1n_Ulw` zYl}lv@t=XCr^D1#pHC_hFg|Q>qx0>qW$SO-gW=(?+PyED;`Kl@KYU8&1cZ=7G*RQ3 zVeHIT1ZRoHxX$Nuxn8R!xLs@NYigxAl6r|+NgVvkF(m%FYg=3>*tZLEw7Q-4hQIHs zpAO#xTWLJN@^K`MpRO>!r+==h*e;g}XOc>KxlyDAU4tC3KDvvJ-krw1$n?f^%O{lJ z#s$U9~Nh9p80I+WgT4fH7Qd|JI5qsFe=0yXe9FD4!$Zd0LN_sML}L0JMApn zYFH(&+J7F%rDTv-7})pifxwU7Ir?hPq5EL%E3|J8kU#^o zXY$t7F_p-SdVO?aR}SktwDA$by>}nlQmLw&?wW59Baj*UD=*VZm+rCLHzZ9ZO!ZXr zI2_g&03XQU`)ager_^iA74AFg`pznZ5roGc`o7YZcg zHEgU&Ck2i>{D-!oclqnwckVSs<=xX7#y5bNwkGYU+Iyak@Y2cf;ru$4Q~2U;%rWne zU(5}4tp@6Xwvq~(I*`#!iz2fA7E&?@`Vp=v2gp~5?m^GE`f9-GuTW~NENoW_h5Nox zS{8p;U)KQt0Ce~5^X@T|mO}lej|n=6dX2X77fa8(f+0}EkVx!w9_71aQ{qc92vtdD zCm8<#w^UZ^>T4slJ({bOo`uKZANJ`wzj|M;lz#_TT*LxNBe5gp+ge>C8c11LrF+Gk zD|&vSRopMKQ&7}H4J=@@RXGJm(;80QJxxmKq@xGpAya}FVO)=YuYFd+Nrp&v@AcP# zd*p$nI&wt?t-4kNWe~XCrMNH!5+q!Zs<<8h04+l9y}N4+lb+qRk}>qgbb?7XQ^P87fktRtg_ z^G9D1rJSm(vw^}=2`Epa4&8{xeLZxBg}LDv0DVq9G}4=*RomllC{;-P3k>q^OMXP0 ze#1aZtZhPCJFHb_=f*;;SKUZB1GoGRq+3_Usqh{^rOyNmNCf*2-%u&O@va=8s#&IG z1csb*AYgGEh$Q+P4EEL$)y+*hHwKO4KZnq(eL>cSzVNfTl#12bDoshIQyVdnf#Dzn z1M~Ln>U(M#x2-)w!!(QB`i$Uyx|>CCskl5)MvKZq6_r;eQ;cBz^YYU^-PlqH=e=G) zSgDXaakpU1PB7iQKQD3z(^UBcd2vA2ml{boh@nX%si7@|;<7OuaQOE6WE>qrl6RVO zD-p_0>`BQd+~@Pth5pRdh%Pi#;yBOnj64c9MtL?5e#f!WjI>kJu<;{df=8w_On%@B zG8f3lC312{x4x&Mvc?CyV?DmQiA_y4RZ7PkWu3cY8ey~8s&1E9E%8YQCzVr^NB|i> zUtJk^33X2&Ev_AtPU5uIUGA@06}ZR92VPk( zfC(8m#!fwd@TfZEBWS;tV>aSSsHp`TBn_$CHB{D@5 zcwm^61ss4m#!r7ifs=qcYMa~_tG492e`u~#N8{AUO2V083II5$R?ZXyfHHj!eq|BJ z@&$?s#x~imQ2LtsSwKkPXvhIh26-Q!bMLJ&RVOloA&y&<`ezx(>*=WTFA17FW52F_ zwWZXsRs?x|x_07Hi&_ycg{Y~c6)M1=L&W^^j^6&Bx`7)=vnMyeQZjvqe)=UxG!RqM z&g$|U$rDHDxGDm$`hs(hpw^p(BP~nI5yA&}gnAo*H`2G3UYa#LHXt{wzPDwkGo0v!1r%4R=&h+x zDAoA}l13#*J08VI@Adq(0VNeufgp-m<1vFzNYg6F z+==3he-S6w0A&9FhL{=)1ufdyEp^SBl1GSCwIc?2!t#yE4=;S7VUjyCpM7khk7j>l zD*p1XkX__vhL)BTEz3B=xjuk$$RPLQ=zHr-G!tD?$GB&O5}E5_wbg{dC}K#Ek_i5F zQgQPQscI3FHkwK*irFHihD;7hq&MPR5Ezr_N%j2o_ruY*jU_})A0wJ{Q;@!FkbTGi zj1TMB>7RSm+HL#l>2BMUbpHScPV-Q}yxv8AC6~lPP6u(3$G3meKq##f*3?XhvPiU% zG?Kh=ci;ynW1Mybfu7!@^`LJm5lSsWGh6&>nIwN4#z_b=4}4{@^3UzBsp%j}c9L_< z#KD;uc}rG^NE%+e<)k-~tWWAPAt$0xb;&akYu8hdipw}BhZ zM}-)`4!nRkPjC)=$F_5f_d2vC5W7KYlG81|gTW>XlS>qnl@hc>VNnmzIBX8YjQ7CC z{ja+2_IYHv+FD8*f{7wlM#?e31YrIjT#otAf2N{Q)mz|(Nb4z9t}3V@g(Y%Cki2ZJ zc;`6;VSgdp7{SWuWsd3N*(f8WrJ6X{AR)8ci9aPL86(rs<3dOQSOsNKH9IWy@`70N*KzCKvuBxt*r*G1WZ9KtIqVbHTQ;FqFYASk#HQHK8 z9cl#9EhM>NBPtg}3fzeR;PUiRgp6Z4Yjzx3664#14!)aoR7Pq*r?yhMl#WWOgf78b zi-tacjDU18E%Vk$^p!XI8CE~QBd)6%yBas-Dekp{lEzDq6VYmY$vJY7{A#!iistx#9>wt=Reyep%6E*=Fe^ zu~OZmmXcxt5g_o#p&s}d1JfP<0Ir{_>{e~J95tWW3Rx;C3&_;;w1$c4=?rolyoMmM zMyf-F61SiunerU&9Xhn$7+#vl_bhmFL=5xA6fJ^FJc{x7hZyz8EEV7rAl%IWm82_91P71(rGJXW$}5K)Dy)meRVu;ym1vgMHeA3M}-;U21lylvy+_n3|7t2be`=^ zOLKy@rbc5~1eJAiNUh%(X$O8FliwtP+aT*)cDhI{^tAHNQ$5m-Um6;;xtf6!d7rPbDX35L_rrWmXw9-!rh*EQ#~vJvtty!mfXB~<$?T+eHD{-`QNeS+R9DqoYO47Pm?V_c zDM-+-5dxw08Dc{6D&(_!Ydf@-t);aq?$@o?X{5H=>BW0bL2rG}}sV%>D(Nxs)W|Ex49(nR&sHE|bXX?^f#fm1R!TzSK}!Ybusl z?MVVo3P$c@imA=xV8p*S!;fBbq}K zvPjH9ED$IF=lh^dPlC+n#_~V_*{)Z#{ucf+()bpGSp$W>M)?623FALit8(=&8{X%t zl9G)r7Ms0lR9s@FNhFNUfsYKbhK!eN@yE{x8WFfJR8+MTwJ_7oOFcwONg^I`v~svo z4hBmhJaEG&I3u{mzUu9cp{)CRbwPBNXj-A^Cyi+PMIv%JMe@IN=DolfMemFfg?p@8 z?XyIUO;b6uM>mL}(6mwES(Smu72)E50ul)X4EH@qw9JfCMK1}e)=#aItvidILnqK+ zC+oLVYX1PUG|zXEmg7#fNVCgXj7ATdBjN@HT}B5H#|2n0(1aM)a-8K?nkj2^W{l79OE{)K%3q6;uKR<5^5970jp|C3u}%_^hP1To9axA5nvz z%uMY8UAEHiM_7qfNXsNsGAIzDynd2Kdz|q0>S@&khGA>$<7c?3SdkRZqBdE*a0i7*S)`U z>8{kMDx&Q}3)^L>7PqICPX)PB%JO8RJ0N9Zyjv%@I1C_!14?xbTI#L09oEHNEor&i zB&edPnlnm^8>cAoo?d=TrTB$71$-dcMrD^%yWts z?AUH(V=Qu`&~iGjdM#0U>eotb*PG8$YHd4$o?p9ZBw3YMqAI35K#bkvF07>ccl<|A zH(M6tn%dR%+t%NIp|qEY?Nu~0Rk)p;d1Q)NRQX~nl2kFmj4<^IAeND6_h#*Bv{H2A za7$HLxNUc(hLi~mHtVZI>px&4X!3j_0h86TMn`{gJM(2*w+$_#n{Ra&bG&WtEqYk&hx7Nb{$lz$9wE-LdZq3W`;>?pr-A452<5>AXmT5O5<{{5D}B!hit; zWMk7h*|)5nN;J0GIJaB;Eku4QPa1LYpvd!03-XQI3F=H__Rq^uv7DBo5xv` zB`s;FtZJ4K5TRC1eko-DoR0i^5u zlgvG}y1%FP`V z&PfE8ImaG8qe-IDk}o_Qp59mvql{MOA;k)nDH8OANK^c%{A68l`oD zGZQnrzlKV$3=pAv`f&$MW8;j`HV?rh?l}ue>>Z_1d#l|SJ#L4kUlC%>Zd}B!!~= zwVyV2g~cv&s9 zGu+ZSI4c)#S>ar$KD;t9ftJ(7;*)9BTj}nT?whqWRlYeUp{S*X7L3Nko@}fZVsM}a z4mgD#ozAhhUaT7?+nDzqO;t&ZAfw?sz=)GKi_0uB9yTaLGpIZO1&1wX66Vhcizs0w zZta~1SnZa5<+isi9WC2!-KpTX$84M7WV@LRVo0QpX9>sx8-tehkPr&-XU)m8Z<5Np z_QOprt?lwHJ0z8gwDm=1D6r2>#N^^osOU+`CP4rJ63e`7HG8c$3|4AdDvF~NGuDY1 zv#%1t9B0%svhpAj0syQ)Q@;-QI%v3VT3dvc_^Ts{t@D|ZwhE(||ZOFBsLh0O4`=?z1MMQ zW_akX6pqp)Qc@0T9I+)FJ_F~oI0W|{&N4!5`S#w(qq$RCJSgncHBC!NZC8(k!J9EO zC5Xsa%o!}i=hLtN5~JLWXQ8OvmTH4FO+!Z_IFKLUk`+=%2P`=9D~{ZY1CxfFCT4OxwWkijzp`4OHat2i7W8c(j z1qS1?+=;51;?y-S_+oZ$K#t5lUGSs>@;XWJ2$*(<3*{ElMnYSo*p+p(G`8B?9X5oXzF;XfbxMggz#tsXDGk~kh)3G`~w)SmB zUDhhgWzM?oLsuE3f;#Gm=2+sC2gY)9#STV50OO7iB>*=L?~=NbmO4tx%4eaQknp4o z<;V+x#QUfXf%Ez2K)&?4EON;`Z1Y76;$bUzi^uS~lHL2`KR}}dVC6b_BZth=FX)NE z&lFXGzP3$1-ri4Qp{YiOmX#|i;fdX(5XKexf&qMvETCjD;oCVHA-3$zxNGk85sPJA zD$6BYXpojlUkyqkfWdh4;)DP@W50h|dg}F8zk;@HvEbB{BI8ghKZeL(1Oz1Ivy6_z z@ef>SronN#+AVTJTV5)sqkn{iI`ffX{5%!1NB|St*o^1bI)9mY{O2Duzi0B$_q!mV@pZKXyBF3>ESv>g@8nyr1qc|MA*aMa^+ZE03>%A^%VqLRun!c{8@X_2}w8aHXG>L;y zh_x~Ta)vhK2Qm;4eA(5FxO$4;4IK%k(~v( z-uDFeiVfAbsHrOEwhDnz^>p#X)h1Zc!G!P%%pZ~S5#}equ2~+SJlM*!7T$1>`iawc zcO~C#?^`Whllx7yt7+=Npp(X)T2anfBX)}(R#MEMNJ^26;O9@fqP8o-Tw>f6RaD7M z95XBUrX>NL!+DDNik>8c>D%0EcGkJwFV|a@O+5u=Jw@cil%}#gNS+%WO_<-xaukl^ zBR)}qqWha_Tx+4YQ&!we6;}0rG_w_wIUp()PYeL8WW>&LJx)O&oSgo(T=wL}J#Yp9i$dp7 z`6hTQkyPzSuF%+~uCAk~F}SO=JW^8elCoG^bKNdPjO92O_OHKwDc8w%x8^GD92gq85-qj6K_%Bar?j~uaXUSdZD z`L?j1qI)luWg9b6l#UvaGI)-W1T3!JcJgy&A%QMegJDEEI))SkGopP`y6xjccjuqP0?&NkYjbCn#TlQXB-5 zS&$bkpT&;dhtAWe=-*3i)b*9GMH5<`v@NflTH;=TCik9{LgvuG*n z;I!426QGuOpW&s2rvX7h%&RXWpF`@(-H0ofHTr@ooA*Fjeby263c*Pvl+>|FK{tY9 zi-?V6V~hzIP@YeNgWuSn=Ith3*-2GfM3oc^@Q_MpdYGz}XI3b{u`D?`B!bw${_Zo_ z&7)|=aC%F9MD(HRWSRpRmN6tV2-%gFlk$)Zua}Av6aq(mF3Yy}1uWFE)z3uHxAEQ} zvCAsc@hZ+lBmg<7^0rTKK*p6?o3KaS7#5|zkn$)XJtxc!`!N2`|q$82tG1@8~n>+gs_y9d#8&#Ia9>SeQ9-h1s70 zMNpt)lQu)Nb+ABhBIfLwYtiup=1!@bcU*)vN%5QcKB#& zU&9f^gshJv0C?rsh&_QJ@O-$`Nv$^vTy+yQKRS9?d_DnO9h4#IfZT~fJN_bobHX{n@Gk?5*ssXUmd ze^N;x6$)|31MAmfc5WE=Ho@DeZ@9#gedNgUH^sSZnM7V8D9i~2jDw!zxzaTI zG}N_CJw4J7<4mbXGfBcQKs-S>K3?Et=eYII%3Za8w_V~bUrQ=W2$8Dj2`Y+n+~ol-$JNDGwPeJcGYu^dD2CJFeAD z;*WE+MkwwOMI^P5ObIeD?g%OhfsBq#jF3I^qZf6%Q&?rDs;Q=q8d|XhG|5s~B$tWu z;~s~GJLB6p&X087hK^|JY9O*!(%n=nBod%5lA~RUL=k=@AS{hzN^4U zJahHVy{3~?&0IoA&-`9~Se*m5y=o%|)4$VL6&~Xn+EnK_)(j4CG5c#mMdfNeyW?IC z+3bFL+9Tv}JK%h^=!!x+9>dUlwK!I=1pLQw=ym7e?4%8P@h~Kw`t{*x@yMylf-rrx z5RCGk_CH^`)zfUQ$m)jVv`56Rg9Ut^4n053u_^lF+eEH^YJap zr(RHXpR2a1UG2S5-IV5D&%*Ok1N{i+-}Ta7IUdK;UgN$sY77O_eLMdE!WZ_7>Fp4= zwbIYHp&pHTpz&oMp0Y;B?fJ1MR@T@50K(VQD}7qjZmy7ROP?70FlcJ3Xxw-2-a|0< z^uX5#Ds%Vj4}E;m`TJ!4nxe*@%EQPj^p4m60EPYsuTQ+!bL zaJgCMO8Z61ri!W(87HQhqLEM0l!7&L^!x35*1d^O1u5JKeWHk9Lw7?n<2lES2$24) ze{R~okOG3NlXkyY?a|RgFr=2MIayaY3>&xas&}d#NlBR5ZPUveQ`9pP#Db&(0Pl|4 z2)-a)c`zeWx?)-6(HiszQe>hZ2Dw^GyOEZ zZR<}{trbG19p`bV9m7LeDX59Qg&!mK(3Xzr`v_mJ+drz5b@o`63YdV-Sy_Q9enbyV zMd}YxEIT`H*Ke!U{VmiM%66Vvd_bol94hD4nBhS6B!D~X@?w|mJJnk)@}m1exT9K% zfyd#+G8%Zm#yFwuzMrmp=Sv+_>yJ`;$58~k+Wz$v^rV`4D1eHZ5`9X>I~Mlj*=%;s zHIdD0P7~P29JyFuX`i+B`s?Ln_84j&*Rx@toi()&nxv=Uns)VO_Y3$}>PB_Xs-cd3 zhqki-j>PLVUj4na1JyWTVj^I`b{_iJ>fOlq*7b;Zcq6~h<*bBbjyvZVJ@s~?*=(jh zFm_;^dy|}Y`Dmn~Cm17(AHpu=fiw->xf1Zl4tSD6w zJW`Jk5P92|$jE_%V+P%n@5Xr~N;FUkP`s-y(el%i58IeX?{UP(#B{-Y|>Gamx zLCQd&fcQLqzfBJazG^Id83-%tI}_}6^e90&T$S@w@2OFwV5cHUC%!#~w-^<>vZx-vTr$=0z7yN>uc?V>JJ*5zs{g}k7583gO+j2Jkm?oV&qTb42ldU-~$Xv;)? znZ~NrBGhgj&PeP&TGIIk*B_R*qLb!5{k4ROyv_kV{q!W-AhiMS>+<&0fXWbp6kuTE z-(M)l@`Ikox1rY5gOn07FPT5XP-LbK7Bp;(cozuy0UO)(_QtlUnM8=>9Cq^H`h9g0 z6>l2^<3%7@u>;pRoeQJP zC-Pb6(?zNytk75NB`t>C3IHgfQ|Q?oyMDTnG|<3EjQNkQxQRdTtaRYonda$^<67{Y zqK>Kq32s01gz^JDzX3S!^w&0ZQ~v-6cU||*O;T-}tv1rN$iznlwjgH-?araWZeLUh z^cv1I(#U-O0Ce_-MBT9f7wdvgEUG{_$J5tZrBLJeq=at7@jCn!xb=Uj^|u)=RsBTV z(^WfVrfbDRIqlobUq6@2TUV|fTVs~$hV2d`5UCf+q5Lp7@%(<6BxCER4GWKTHxd`^ z=HuBD)YEgb&alo2Ipjwz2DI%uh@8Q3mD*MHDssB~V7GN!el<~&yLVn{447FOTKQdw z_0CIuGx_Sm+Mj4nwd`A(SJ^s^xS}8g%hkzLjG4$&9K6%Edv?{G8^FN@D7m-AFVXI= zZRjW?G0-_?lye{gd+LjpmZBra`N{g}52n9wo!bTBpz76*Eyrw~I88kYM-6p2KKKAe zif%)Jq(l{uZ8jqYLP8;V}OI?BsoQp^^vjm66c7t7NxR z3x_uV$^Fsosc~O;#2sn|2-m%(gnxd}gq9yLm@&KdtI#9X&qVACf zr`ofm5#t7+hAzkb5OIO}YJ#}$dY#ESRNkbTV4s2{AyGbfAMw`1TT42R00_eT$@KdD zb-zuejGK@wvlrDgs~+vtP0_eZ8?NE5s14YMorv%4kCvCEkUDW-2>kTF9a{sCFn^|} zrDSaw=bmG;4EpP{8(P6_6uA;L)^`=Ex}9Y~!vh}p_0rvCy-q<-q4v`msOC>He?0nX z9YiZC5Z%48Yu_3MnNq)KrL`HClCZ zg;s1SI82f8R%?JX~kjvG>*rDkOO%3`=;# z6YG$B=Ux?9s)R$5l^$S6)c)FP&Q{1PIXd^@EN!1nSymnNE^SR}t*0=|+_OJCi3r93 zTzPwE+~oYVRnq?e^2yNom%cu_n+06H3p8X25xD2vckD;ku-3gcrTSNgGmifN6`pt- zJ9fL3b9_q^fKL(FXVXz+D!`QF0M1E1x)EW$EymK5$W%<8NmoD3^Zbvlw@Evd$PMQ7 z8SDnVlry$=2eZ2JlEC<#waXgGkw84Ky~mhqLcbtc@@^N{XLj>;&ZkH}hH_7vu_S6SgTy>R0e)m2-}dV)nNDsL zNa685SRTJ!VLF67RABykoWWu|6-XYR_v$2x%oFwWKBHO4P6ca%qIyY^s+MPlXxKWu zZN-%Q!5Z09ajdPA#HpR7VtE|%$G>e@D(E7U?px($Q`S}7W|m1Cle00y zpQ!ZKbz6?(EXGQH6v$hjg%98v7$XPR`;7`!Rv9B+V;+OHpfsw5u7T;_+RJcQEfLr^ zXqv8?oj5^N2p%#h9g%?`F!TWSAbRrk757v+`Mmm%RAKnJE!Mcl80g@0=I!0&Z&qXa z0qi|VuB18gfv-G1KBG!_OlS?wD9(pJGwOBlA3bekEPD-k$0vvw1K&%kPTgxr!1mX` zd4WEsS+MWedVA|2JLGzuQCDjW4CD^ySzsvab&ww}`uHgzcg}{;lCa==9ed^;n$N#u z>7$!>XWh3gLM0Rg#m!aaIpUz6=j)9NoEj{sEa646?Yq7HMvm7+)07;XpF=dh5mgwYbLL-E96^#3064s^jK+{@T6G z^+qzh02~jNy~lI(*SU`wEHjOKNc^+))o*Fwsvxfb>~OmFH0_g}Z3xPU&cBRhdwXa8 zsUg}0rVca5>2ZI3v39@fK-y*fcMne zS{jPQlfY0}K+aA*Pt58vj&7hFWAxVAhIj#qSb}g44{zzJjaR6nk9p4tBZ)W*F@RH;cLRs`gc+ZwjvQOa`Zr0_k` zTXeyEO31`?>{ld7$PgDEeRVG4FESR-YeW7S!^4E&FMP?WQ^ zG_h3D)EH)k)#GnYET^(}3;AA&%LUivXqBoSZyimHu8Z4z* zR#umQcRA0P;jl7C>F(*bZnh1#M@6}>u8%Zc#3mf3%)Xu5XHlz(kdx84%mX=rCD98w~X zzKn1KANE-O+HvWI(~hfoMSH6PIy-o23lWjxV1@7KPJ8~ErzvjN3NYzSTRH~>HwPn- z{r&JX!AH~$#wg*owZ=h91_H)_AS3IKU(EOV=-(@z2yQJ?7#iT?nq3=wm1(Q*_Q>v0 zrA^9_q^6oD;25&uikzG=!w$o-#;R_!Z(3PyGFdjPv7*mK5>?KpCyx-~CGFT_j&bYQ zcE*yfdxqmZPsK@G(hxkXPvQ9ip>(q?HOhjr;39ZhVAFW{;L1)LI0dnc_W=DpHJCxu zAd_oPS9myEZT8A~+a*-c!1Xl>V}?Qy{{RfIEC|oOP_L(akPm%BqDq$(@Voea9Q*{F zxReLiCkM7Y`}%0bvg)?XTrH6SAW)MBZbQXFaVQ?g9sB3GIMDidVQ(b-OiWdrf!`g0 z1Gi(}`e^ANC|zt2N*SRzc*^84{8`ROKb}8*YPZupbi#>M43c(3lak*pNv#1{=7KpQ zM3k&($0q~S6ZsLSbs)nrWo|x-Qr)oLXJnnaNn_aR0BKU@K<;;D{WSfTKgNdvZ9`{>y1`Vs#C zTj{8*dMybXM;ybDJP7UkkNr>2Qz#?xBw1uoBlTt@APkKE0EyO_1IDwk00Kwkef7H6 z$&r<$3XS~U+JqttCNaVyVIh%u@@39@1K1Jla6Wp|a)?cFVM;Kv72*fi9kfp6L2sg~ zXsz`PJPc14!36i?`FHgnLO#0FdPttCnp$|Hi6)6;0yhj3KHa?zbJ+J9psa#{!d9NC z9&{xGWrlH)ojcV>O+7Rh1gLedk?_GwaadI&5w{`-e1=?maTx85DAhsAk~x<=n2>zg zAnWUV)iS?@hHnf4et;ccC_$r0)x2U437LTm=-?bN^9&q!&M~Yjs^patI=bmlK!OQ^7Y5pUOX#NO$)}Ol*O2+KA7*1@%=SO zmfHn-(@8Y1Lk!`80x2ZoR$>?=oV{?lCmn~TeKgItH)h|oTyNDks|mPMRS$`$p_WEf zGqzNa>x^+HAo0n@I}@Zh-@=o|3VEJG1#{p2{Y{mns;HLX9BT-4?iFyLpI{DfKAMCA zs5+5~%WTyb2CG0|Rvs$_1%h*4MLC~woFB;RC@HH$%LpMNX+%yXIULY&1mO1W#~C>K z=R)JU*TD>Mq|C9z#z3vyWPzOa&!8XI>#gut%`@|M!mn_Nl|oOyuBQsE7r9w%u~Ybv z+{mhlluG9yte6ZLR1d*|JNo1wrbeWbR8zWDqevo5h65gB-z59`WB&k9=#|2TvguHl zTB>nN<3SJ@T=<+&FD!pAET?q`}fak-Cx?1wYS@;QDbn z)*Vi%v9{CUiP9QDY8bVFCtV0aYg$9_QCR{QIYL?x4CZiLr|*cJXA}CTU??z2X|# zRaQ|;8oCw-%w$lm7Z~>{z+<`2n{IoKmfva>V(Su8GXm04RK~=kCU^n>>~oSwrg5Iy zsOxVQyQMo&UG7l9Ow}I~IwS+ck~MLJ@fW!{Ck2T22ir_Hn+>k2(HuKw@f}pNsAz46 zwj(}XQIU{9?UKY0JDh0dk8o%<5Ha)!3JqrXmgi8?Q+RazoI-}KGb_9*0;=aZBafgt z(F;xD<87t6H-$$8sU%$Bf<7+8xIaIC4tF4{@P)+^wP;eUnNb#<0ZnTd4^R{15V`kEruu6@!tfHK6*^127&=6@=at? zxZNZBY)yQk@ddt?ioNo#vPwv0e#(1ij#T92a`_Bu!081YMboL3D}AH4&{9EeWAQTZ z5Wv1LOy`WMMh~kD9Q!tKsZC;K;VrjsUTTtK$V*ELGIA%54m&5P8OOJN`mlO8bA7*6 zdb`w6%WlmJQ&LG#LmHXZPT@GbUxX_ha|Gpaq(DEbdrc=u!W&83?mHb^=}&LlR=b52 zHCum`T5c4oLc&SI9H}LVWy+NYi2xjuXD-r+QA1sL{?Nr0B}a=#3|6SCmL*)M67W`8 zM*{i$KZ~{)2GHxp-+bHm6mad!oel2aTS^+T2WN=9?=+5O=QMmHZs3&-C;Z-BLjo|T z-JMU0;59k6P7#(l7=}>2@sI`vbAhgl#blI*5))3+zVv@#Y~9bl zy5n(@>uP(IJr$CYD-`s9d&sIDHK(R_5>zs=7&!{OLmy%iYWj`Q9o1>LZcdcmsFt=^ z+%*;2&sj}VYm154V8xg;Y~$A~d+SYoKH9g^tTZ$ znp`qO1EIidDFKN9UhTPzSuLo=*( z)sRIRIg7tdPgLf8`9CuQzzpxvtb;52i)kjquc%B62U}lv$_Gjdvd6y)ZnTAF& z>Q&pN-7#7@1#JkdzD6N_F;rRP5qPb^!+=ndcwvCTm(@@p_(})QT#tCOobsk1MSC6mP?0AwjaP#9i>|ZZOs_Q)YWoIgsP5Q` zM`m34dwOU$Rvc9v@P<#fZMOPo);*vhs9@RP)fDm!0&uaAPz+>afY0u9GNWzLZo4%` z)!chj-0c?%XQP>>wsDamU_&656B*&(vtuBr#yw4n*PAubpo)`bRaer}OX8}>xr!`6 zc|)u+74L#hFh6}^L;be6)z(|=8)ll0%(1G}!SU$zf!ztjk;vRJ+aAD!*q==&Yf0R~ znUE>LaAxoOBGTD9zjWR^PT@zf_RXrQnoCtQay+Hu5OJM($s@=mE*l6#o5ja(SH&SpI?2F}T101dIsPjY$SENS=EDyYlAgyJ=_%}VcDSP44Qir~ zhXTVn=Ipsv3~+%4P=p|5j~`70EpoZbPg`?>o_3i>hgCeh8_rM&xyYeHpDFjq_c+F^ z3druN@k^U8b~|W2v}T8Q?O< z8c8h@$N_krN?^3SWMR*j5(^(iCrA}tCc0W`t1r6^IKfiR(8ROL{3m#$sFI#BCKZCn zt0o)%nTP|5>qBJ18oaJs>Ls!Et@5vDnw6ZaYfTMT#wm&6N%_Gbkw`{E7>r=#0x&Q~ zXBuvyS+Bbs^z(I4Ra`2q$iH;S2#rkhnN^i!ksp()tILK5Cq2htL-$)Y`|f_8TCbvx zdaB!96jaoeH8ieLN*+XbMnc2PjCk@O5LJhE@2U#bNqMcO5m#GfN-LC#l=TFNkhD$2 zo=gBZ1(f-Ru6=uHjc|CsMI72H@!6ZgyQZ@(e$24fM>MM)O-&T?B~&$0j5DJ6Y^9VH zZ#Q$;WtfK5q11o01;XiVUCCkD2D+;7Y38Y)!H!uYkrO7Av}L8ohQ$D2RDcP=!4%{z zRZ+4nwO8b+rKhHut;uniCkknN>xO2>kdF+XTy|i4oe0@G*6&AZxLPVG=lD9F6vk{x z#u}KVMochVl@5vuhB@}YIza%NMh+=;16Azp*|lkREfvLKbcQL~iEe2t(o8Z)Zbvu_ z4iAbO054`b-(smU*)98ls3eZZ5owH;*f7;;{{Sf)R=(1g zTdv=(^cJ4)8j=vi&qhy z#0vycxp5Mh)-@{J6tgk$58=QiTjabV*x$`P(B0^671tWuotD{efhCdYT8P53)I_Q~ zO7$wTux!dkJ$RFm#|#d=_a&0cQCmSJp4oGPb`S$}ifHMHY;r0Yl(q>@CnOm%M-kqV zx^CJV{n4#f8R}^6A*v+f49+6BNf9Fe4i1@uQ=cFN79U+jv(#5ww-p`A?X$l1p{{~x zB2}sr!fF~aqyrvf!#zYmNKj$Bas_j%1=ub{uy$QJwYHMh?fXS#TUh8(q4CAmu$tIPL2O=RtOw8Y$~5l3PNDS~{nzVu6-VFcGL>&nLcA5s{J(2B@u# z_JXS0@xH*m!BZa8g66L&S}_yQQmdoQ00e=;Ogj0v4op1&8Yx4(&Fa@GSz3stJBenE zV&fzLk~uVOf*XilVRF1ewsDLe=L6;#L$G!#*pjB7UGxh?nmXzNBB#lQ!^>ZZdB}AGW>|o z82b-y;E8scEu})jmX^swAdw9`5Kln_q+tr9vlcwTI8n)RPJ8yotG(Y9(xZ62*2!7o z+$yNJ)5MYtS3Dz(zIWm|k_4V{jyZ0{NYh^4-_&nWP{{O^72gaJYKSNrC4c0RV=kaD z$<9Ka%zJrBIcI^gx6DXQjpc_KO*7xAEtJT#^l)3Jpn@?nmQb@GT!_LcCjpp|*q-V= zI}z8Ot6HgT^3N1@>UF26JRifJAqy`dAaZyxCko04aq2sFI@7jpGeY_Wl5xl*aOP44qF(%o;?8YQSDqNdC;PVgvhE#bE! zRE3e7yA{YdI6B94?g`?K+i#M2E|XPO%wVlTl*t&Af{1+R6T@alY~@#wA2LNtdFV%1 zt=CyMqi=eutE_ahEi`cPMF?UDB#bPiG-P;zxrNUk<~h^#j@4amwp*>2E3DO$Ee$+L zByA$c5vNHN&xXsBpWA%$ z6xSLVZCOu-8;uvSOj-SmVKU9izzmT zq%}0Qcih*l)n7|!@Z^%7mcFKrDWxi)95hlgj!on#<^w7`&4mOuw#r&5E3C9PSZMMHjG8rX89F_`Y1I*+rI}Rru ziybcTh@R5oO>tOJn#T-nPIT72i@54x6K<=Nbu^4xRaO!Oa0)Uo3FSBpMovyJSGXr- zR_N)?>wAiAwYhG0i_Je2Sg9zycc=t$7=|t+XVl~$QcHI3k9}L--|Ib(Z(L|*siC@4 zHD#)1j6#wmYDtI{Pz;H|h6kVu2=>=Vbjtf`v|B4<+i*if@ltryvsFfOG>n{(mSP#f zUi?^qFma7@1gg_`?OwQ1TdJ-WxFfUBS5!tIDQpxoQ%4{u z=uwGp!^gW1pW(pKxo%gDvtXK%lB@4@wisfnj^N7EJdQlgo1mIH6Tgsyk|fLVU>hfnM{l1fQEw>s?6lU1t6IaIrcPEcD3Z+RUlgy;3?lsC6jl;Tjt@>@P zvZDUlTLsyqtf8c#nWb7$-@=#?#T_z1!j?9?!#KsO-`SIJfJ^e}RO-0`3)fATcdF6=sYbwo7d`O%Q>U*&`T%3>x z5ON1$q`OUzt2Sp7(OfAu#WKek6qT1aOM{$=d^hJJdVtE@51X(6@(lO+=Ul<*vQs%{68a&6OUBUs*RabYpm6~bk7uPPYrN|nrQhU zV;2mb7<@U%O!{DwFiFmUZ5r!k{Un<2xv7$-qBg}OOvXS%Hbdci_wwO;=hXXY%FRB_ zcB@vh!!=icYCb8aEmbHBjw)GPcN~G@0m;vx(7n@WwO7``R5tu;HDw3H2d0m}mMERr zj?jaa^B+;jmmvC)tzZ2((9#RCv-@Oja5aQ2sosHZcE;bfs0x6Tl*`MUk_ID-e=6r0 z8Rg&8=ctss#!F1gwytsqO0d%SF_9uGs)fiZ#fbOf21rmb+q$Ohue9uq$sGeFHErIW zDCb&snWJ|`W%4TqNc#t5109S&VBmoBak*`q^mXW#Q%_E`G1t+}NpeVP(pFp)0P_+O zN|2!TUa zgjT-U;Z#L@lBS+QktEC{Xt<2vpmT-*WaqI2gXx_On|ST5y=9sW!6RBAfWs)Ck_s701Jhnz3pCr<|OCM2{Fu6WsCi!sm(g zsE3I}{jRbH=k{6M94CcgO>v^9mKrM>R4W+|nO;wbfSB+~G88;~;DNx54&xlON_)*5 zHu}h}7ul*Ulybu?TxQRKH}OFw_!Gsvo=#ZHJ_3dc6fXS+-jo$fd9`nwR5t$rg!r