From 848ee41f2fe10fa232ff9ce3f65a0b107e404e1a Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Thu, 16 Oct 2025 11:42:23 +0200 Subject: [PATCH 1/7] Ortho projection support for GS --- .../ShadersInclude/gaussianSplatting.fx | 39 ++++++++++++++----- .../ShadersInclude/gaussianSplatting.fx | 35 +++++++++++++---- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/packages/dev/core/src/Shaders/ShadersInclude/gaussianSplatting.fx b/packages/dev/core/src/Shaders/ShadersInclude/gaussianSplatting.fx index e1083199bd7..cca5e5043d3 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/gaussianSplatting.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/gaussianSplatting.fx @@ -180,7 +180,7 @@ vec3 computeSH(Splat splat, vec3 dir) vec4 gaussianSplatting(vec2 meshPos, vec3 worldPos, vec2 scale, vec3 covA, vec3 covB, mat4 worldMatrix, mat4 viewMatrix, mat4 projectionMatrix) { mat4 modelView = viewMatrix * worldMatrix; - vec4 camspace = viewMatrix * vec4(worldPos,1.); + vec4 camspace = viewMatrix * vec4(worldPos, 1.); vec4 pos2d = projectionMatrix * camspace; float bounds = 1.2 * pos2d.w; @@ -195,13 +195,28 @@ vec4 gaussianSplatting(vec2 meshPos, vec3 worldPos, vec2 scale, vec3 covA, vec3 covA.z, covB.y, covB.z ); - mat3 J = mat3( - focal.x / camspace.z, 0., -(focal.x * camspace.x) / (camspace.z * camspace.z), - 0., focal.y / camspace.z, -(focal.y * camspace.y) / (camspace.z * camspace.z), - 0., 0., 0. - ); + // Detect if projection is orthographic (projectionMatrix[3][3] == 1.0) + bool isOrtho = abs(projectionMatrix[3][3] - 1.0) < 0.001; + + mat3 J; + if (isOrtho) { + // Orthographic projection: no perspective division needed + // Just the focal/scale terms without z-dependence + J = mat3( + focal.x, 0., 0., + 0., focal.y, 0., + 0., 0., 0. + ); + } else { + // Perspective projection: original Jacobian with z-dependence + J = mat3( + focal.x / camspace.z, 0., -(focal.x * camspace.x) / (camspace.z * camspace.z), + 0., focal.y / camspace.z, -(focal.y * camspace.y) / (camspace.z * camspace.z), + 0., 0., 0. + ); + } - mat3 invy = mat3(1,0,0, 0,-1,0,0,0,1); + mat3 invy = mat3(1, 0, 0, 0, -1, 0, 0, 0, 1); mat3 T = invy * transpose(mat3(modelView)) * J; mat3 cov2d = transpose(T) * Vrk * T; @@ -213,8 +228,8 @@ vec4 gaussianSplatting(vec2 meshPos, vec3 worldPos, vec2 scale, vec3 covA, vec3 float detOrig = c00 * c11 - c01 * c01; #endif - cov2d[0][0] += kernelSize; - cov2d[1][1] += kernelSize; + cov2d[0][0] += kernelSize; + cov2d[1][1] += kernelSize; #if COMPENSATION vec3 c2d = vec3(cov2d[0][0], c01, cov2d[1][1]); @@ -238,8 +253,12 @@ vec4 gaussianSplatting(vec2 meshPos, vec3 worldPos, vec2 scale, vec3 covA, vec3 vec2 minorAxis = min(sqrt(2.0 * lambda2), 1024.0) * vec2(diagonalVector.y, -diagonalVector.x); vec2 vCenter = vec2(pos2d); + + // For ortho projection, pos2d.w is 1.0 + float scaleFactor = isOrtho ? 1.0 : pos2d.w; + return vec4( vCenter + ((meshPos.x * majorAxis - + meshPos.y * minorAxis) * invViewport * pos2d.w) * scale, pos2d.zw); + + meshPos.y * minorAxis) * invViewport * scaleFactor) * scale, pos2d.zw); } \ No newline at end of file diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/gaussianSplatting.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/gaussianSplatting.fx index 3251ae77215..b710e6ae13c 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/gaussianSplatting.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/gaussianSplatting.fx @@ -185,11 +185,26 @@ fn gaussianSplatting( covA.z, covB.y, covB.z ); - let J = mat3x3( - focal.x / camspace.z, 0.0, -(focal.x * camspace.x) / (camspace.z * camspace.z), - 0.0, focal.y / camspace.z, -(focal.y * camspace.y) / (camspace.z * camspace.z), - 0.0, 0.0, 0.0 - ); + // Detect if projection is orthographic (projectionMatrix[3][3] == 1.0) + let isOrtho = abs(projectionMatrix[3][3] - 1.0) < 0.001; + + var J: mat3x3; + if (isOrtho) { + // Orthographic projection: no perspective division needed + // Just the focal/scale terms without z-dependence + J = mat3x3( + focal.x, 0.0, 0.0, + 0.0, focal.y, 0.0, + 0.0, 0.0, 0.0 + ); + } else { + // Perspective projection: original Jacobian with z-dependence + J = mat3x3( + focal.x / camspace.z, 0.0, -(focal.x * camspace.x) / (camspace.z * camspace.z), + 0.0, focal.y / camspace.z, -(focal.y * camspace.y) / (camspace.z * camspace.z), + 0.0, 0.0, 0.0 + ); + } let invy = mat3x3( 1.0, 0.0, 0.0, @@ -211,7 +226,7 @@ fn gaussianSplatting( #endif cov2d[0][0] += kernelSize; - cov2d[1][1] += kernelSize; + cov2d[1][1] += kernelSize; #if COMPENSATION let c2d: vec3f = vec3f(cov2d[0][0], c01, cov2d[1][1]); @@ -234,9 +249,13 @@ fn gaussianSplatting( let minorAxis = min(sqrt(2.0 * lambda2), 1024.0) * vec2(diagonalVector.y, -diagonalVector.x); let vCenter = vec2(pos2d.x, pos2d.y); + + // For ortho projection, pos2d.w is 1.0r + let scaleFactor = select(pos2d.w, 1.0, isOrtho); + return vec4f( - vCenter + ((meshPos.x * majorAxis + meshPos.y * minorAxis) * invViewport * pos2d.w) * scale, + vCenter + ((meshPos.x * majorAxis + meshPos.y * minorAxis) * invViewport * scaleFactor) * scale, pos2d.z, pos2d.w ); -} +} \ No newline at end of file From e3a463289be4b07655dd102e8eb1402cd4f350a9 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:49:37 +0200 Subject: [PATCH 2/7] Gaussian Splatting Shadows --- .../gaussianSplattingMaterial.ts | 161 ++++++++++++++---- 1 file changed, 132 insertions(+), 29 deletions(-) diff --git a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts index e2078c5e1ec..2b1c481460b 100644 --- a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts +++ b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts @@ -1,7 +1,7 @@ import type { SubMesh } from "../../Meshes/subMesh"; import type { AbstractMesh } from "../../Meshes/abstractMesh"; import type { Mesh } from "../../Meshes/mesh"; -import type { Effect, IEffectCreationOptions } from "../../Materials/effect"; +import { Effect, type IEffectCreationOptions } from "../../Materials/effect"; import type { Scene } from "../../scene"; import type { Matrix } from "../../Maths/math.vector"; import type { GaussianSplattingMesh } from "core/Meshes"; @@ -12,6 +12,8 @@ import { PushMaterial } from "../../Materials/pushMaterial"; import { RegisterClass } from "../../Misc/typeStore"; import { AddClipPlaneUniforms, BindClipPlane } from "../clipPlaneMaterialHelper"; import { Camera } from "core/Cameras/camera"; +import { ShadowDepthWrapper } from "../../Materials/shadowDepthWrapper"; +import { ShaderMaterial } from "../../Materials/shaderMaterial"; import "../../Shaders/gaussianSplatting.fragment"; import "../../Shaders/gaussianSplatting.vertex"; @@ -67,6 +69,7 @@ export class GaussianSplattingMaterial extends PushMaterial { super(name, scene); this.backFaceCulling = false; + this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!); } /** @@ -126,6 +129,23 @@ export class GaussianSplattingMaterial extends PushMaterial { return true; } + protected static _Attribs = [VertexBuffer.PositionKind, "splatIndex"]; + protected static _Samplers = ["covariancesATexture", "covariancesBTexture", "centersTexture", "colorsTexture", "shTexture0", "shTexture1", "shTexture2"]; + protected static _UniformBuffers = ["Scene", "Mesh"]; + protected static _Uniforms = [ + "world", + "view", + "projection", + "vFogInfos", + "vFogColor", + "logarithmicDepthConstant", + "invViewport", + "dataTextureSize", + "focal", + "eyePosition", + "kernelSize", + "viewDirectionFactor", + ]; /** * Checks whether the material is ready to be rendered for a given mesh. * @param mesh The mesh to render @@ -197,44 +217,25 @@ export class GaussianSplattingMaterial extends PushMaterial { scene.resetCachedMaterial(); //Attributes - const attribs = [VertexBuffer.PositionKind, "splatIndex"]; - - PrepareAttributesForInstances(attribs, defines); - - const uniforms = [ - "world", - "view", - "projection", - "vFogInfos", - "vFogColor", - "logarithmicDepthConstant", - "invViewport", - "dataTextureSize", - "focal", - "eyePosition", - "kernelSize", - "viewDirectionFactor", - ]; - const samplers = ["covariancesATexture", "covariancesBTexture", "centersTexture", "colorsTexture", "shTexture0", "shTexture1", "shTexture2"]; - const uniformBuffers = ["Scene", "Mesh"]; + PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines); PrepareUniformsAndSamplersList({ - uniformsNames: uniforms, - uniformBuffersNames: uniformBuffers, - samplers: samplers, + uniformsNames: GaussianSplattingMaterial._Uniforms, + uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers, + samplers: GaussianSplattingMaterial._Samplers, defines: defines, }); - AddClipPlaneUniforms(uniforms); + AddClipPlaneUniforms(GaussianSplattingMaterial._Uniforms); const join = defines.toString(); const effect = scene.getEngine().createEffect( "gaussianSplatting", { - attributes: attribs, - uniformsNames: uniforms, - uniformBuffersNames: uniformBuffers, - samplers: samplers, + attributes: GaussianSplattingMaterial._Attribs, + uniformsNames: GaussianSplattingMaterial._Uniforms, + uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers, + samplers: GaussianSplattingMaterial._Samplers, defines: join, onCompiled: this.onCompiled, onError: this.onError, @@ -374,6 +375,108 @@ export class GaussianSplattingMaterial extends PushMaterial { this._afterBind(mesh, this._activeEffect, subMesh); } + protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene): ShadowDepthWrapper { + const splatVT = ` + #include<__decl__gaussianSplattingVertex> + attribute float splatIndex; + + // Uniforms + uniform vec2 invViewport; + uniform vec2 dataTextureSize; + uniform vec2 focal; + uniform float kernelSize; + uniform vec3 eyePosition; + uniform vec3 viewDirectionFactor; + + uniform sampler2D covariancesATexture; + uniform sampler2D covariancesBTexture; + uniform sampler2D centersTexture; + uniform sampler2D colorsTexture; + + // Output + varying vec4 vColor; + varying vec2 vPosition; + + #include + + void main(void) { + Splat splat = readSplat(splatIndex); + vec3 covA = splat.covA.xyz; + vec3 covB = vec3(splat.covA.w, splat.covB.xy); + + vec4 worldPosGS = world * vec4(splat.center.xyz, 1.0); + + vColor = splat.color; + vPosition = position.xy; + + gl_Position = gaussianSplatting(position.xy, worldPosGS.xyz, vec2(1.,1.), covA, covB, world, view, projection); + } + + `; + //const shadowMapVertexShader = Effect.ShadersStore["shadowMapVertexShader"]; + //const shadowMapVertexShaderStore = shadowMapVertexShader + /*.replace(/#include/g, "") + .replace(/#include/g, "#define SHADOWDEPTH_NORMALBIAS") + .replace(/#include/g, "") + + .replace(/#include/g, "") + .replace(/#include/g, "")*/ + //.replace(/void main\(void\)\s*?\{/g, splatVT); + + Effect.ShadersStore["gaussianSplattingDepthVertexShader"] = splatVT; + Effect.ShadersStore["gaussianSplattingDepthFragmentShader"] = ` + precision highp float; + varying vec2 vPosition; + void main(void) { + float A = -dot(vPosition, vPosition); + if (A < -0.125) discard; + } + `; + + const shaderMaterial = new ShaderMaterial( + "gaussianSplattingDepth", + scene, + { + vertex: "gaussianSplattingDepth", + fragment: "gaussianSplattingDepth", + }, + { + attributes: GaussianSplattingMaterial._Attribs, + uniforms: GaussianSplattingMaterial._Uniforms, + samplers: GaussianSplattingMaterial._Samplers, + uniformBuffers: GaussianSplattingMaterial._UniformBuffers, + } + ); + + const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, { + standalone: true, + }); + + shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => { + const effect = shaderMaterial.getEffect()!; + const gsMaterial = mesh.material as GaussianSplattingMaterial; + const gsMesh = mesh as GaussianSplattingMesh; + + mesh.getMeshUniformBuffer().bindToEffect(effect, "Mesh"); + shaderMaterial.bindView(effect); + shaderMaterial.bindViewProjection(effect); + + const shadowmapSize = 1024; + effect.setFloat2("invViewport", 1 / shadowmapSize, 1 / shadowmapSize); + + const focal = 64; //shadowmapSize / 2; + effect.setFloat2("focal", focal, focal); + effect.setFloat("kernelSize", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize); + + if (gsMesh.covariancesATexture) { + const textureSize = gsMesh.covariancesATexture.getSize(); + effect.setFloat2("dataTextureSize", textureSize.width, textureSize.height); + } + }); + + return shadowDepthWrapper; + } + /** * Clones the material. * @param name The cloned name. From 16492074d1512e9bda5eb8774c5111503585e6a7 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 21 Oct 2025 12:32:22 +0200 Subject: [PATCH 3/7] works with WebGL --- .../gaussianSplattingMaterial.ts | 141 +++++++++++------- 1 file changed, 85 insertions(+), 56 deletions(-) diff --git a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts index 2b1c481460b..d760e184c25 100644 --- a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts +++ b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts @@ -69,7 +69,7 @@ export class GaussianSplattingMaterial extends PushMaterial { super(name, scene); this.backFaceCulling = false; - this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!); + this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage); } /** @@ -375,63 +375,83 @@ export class GaussianSplattingMaterial extends PushMaterial { this._afterBind(mesh, this._activeEffect, subMesh); } - protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene): ShadowDepthWrapper { - const splatVT = ` - #include<__decl__gaussianSplattingVertex> - attribute float splatIndex; - - // Uniforms - uniform vec2 invViewport; - uniform vec2 dataTextureSize; - uniform vec2 focal; - uniform float kernelSize; - uniform vec3 eyePosition; - uniform vec3 viewDirectionFactor; - - uniform sampler2D covariancesATexture; - uniform sampler2D covariancesBTexture; - uniform sampler2D centersTexture; - uniform sampler2D colorsTexture; - - // Output - varying vec4 vColor; - varying vec2 vPosition; - - #include - - void main(void) { - Splat splat = readSplat(splatIndex); - vec3 covA = splat.covA.xyz; - vec3 covB = vec3(splat.covA.w, splat.covB.xy); - - vec4 worldPosGS = world * vec4(splat.center.xyz, 1.0); - - vColor = splat.color; - vPosition = position.xy; - - gl_Position = gaussianSplatting(position.xy, worldPosGS.xyz, vec2(1.,1.), covA, covB, world, view, projection); - } - - `; - //const shadowMapVertexShader = Effect.ShadersStore["shadowMapVertexShader"]; - //const shadowMapVertexShaderStore = shadowMapVertexShader - /*.replace(/#include/g, "") - .replace(/#include/g, "#define SHADOWDEPTH_NORMALBIAS") - .replace(/#include/g, "") + protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper { + const splatVertexWGL = ` + #include<__decl__gaussianSplattingVertex> + attribute float splatIndex; + + uniform vec2 invViewport; + uniform vec2 dataTextureSize; + uniform vec2 focal; + uniform float kernelSize; - .replace(/#include/g, "") - .replace(/#include/g, "")*/ - //.replace(/void main\(void\)\s*?\{/g, splatVT); + uniform sampler2D covariancesATexture; + uniform sampler2D covariancesBTexture; + uniform sampler2D centersTexture; + uniform sampler2D colorsTexture; - Effect.ShadersStore["gaussianSplattingDepthVertexShader"] = splatVT; - Effect.ShadersStore["gaussianSplattingDepthFragmentShader"] = ` + varying vec2 vPosition; + #include + + void main(void) { + Splat splat = readSplat(splatIndex); + vec3 covA = splat.covA.xyz; + vec3 covB = vec3(splat.covA.w, splat.covB.xy); + vec4 worldPosGS = world * vec4(splat.center.xyz, 1.0); + vPosition = position.xy; + gl_Position = gaussianSplatting(position.xy, worldPosGS.xyz, vec2(1.,1.), covA, covB, world, view, projection); + }`; + + const splatVertexWGPU = ` + #include + #include + attribute splatIndex: f32; + attribute position: vec2f; + + uniform invViewport: vec2f; + uniform dataTextureSize: vec2f; + uniform focal: vec2f; + uniform kernelSize: f32; + + var covariancesATexture: texture_2d; + var covariancesBTexture: texture_2d; + var centersTexture: texture_2d; + var colorsTexture: texture_2d; + + varying vPosition: vec2f; + + #include + + @vertex + fn main(input : VertexInputs) -> FragmentInputs { + var splat: Splat = readSplat(input.splatIndex, uniforms.dataTextureSize); + var covA: vec3f = splat.covA.xyz; + var covB: vec3f = vec3f(splat.covA.w, splat.covB.xy); + let worldPos: vec4f = mesh.world * vec4f(splat.center.xyz, 1.0); + vertexOutputs.vPosition = input.position; + vertexOutputs.position = gaussianSplatting(input.position, worldPos.xyz, vec2f(1.0, 1.0), covA, covB, mesh.world, scene.view, scene.projection, uniforms.focal, uniforms.invViewport, uniforms.kernelSize); + }`; + + const splatFragmentWGL = ` precision highp float; varying vec2 vPosition; void main(void) { - float A = -dot(vPosition, vPosition); - if (A < -0.125) discard; - } - `; + float A = -dot(vPosition, vPosition); + if (A < -4.) discard; + }`; + + const splatFragmentWGPU = ` + #include + varying vPosition: vec2f; + @fragment + fn main(input: FragmentInputs) -> FragmentOutputs { + var A : f32 = -dot(inPosition, inPosition); + if (A < -4.) discard; + }`; + + const isWebGPU = shaderLanguage === ShaderLanguage.WGSL; + Effect.ShadersStore["gaussianSplattingDepthVertexShader"] = isWebGPU ? splatVertexWGPU : splatVertexWGL; + Effect.ShadersStore["gaussianSplattingDepthFragmentShader"] = isWebGPU ? splatFragmentWGPU : splatFragmentWGL; const shaderMaterial = new ShaderMaterial( "gaussianSplattingDepth", @@ -445,6 +465,7 @@ export class GaussianSplattingMaterial extends PushMaterial { uniforms: GaussianSplattingMaterial._Uniforms, samplers: GaussianSplattingMaterial._Samplers, uniformBuffers: GaussianSplattingMaterial._UniformBuffers, + shaderLanguage: shaderLanguage, } ); @@ -461,16 +482,24 @@ export class GaussianSplattingMaterial extends PushMaterial { shaderMaterial.bindView(effect); shaderMaterial.bindViewProjection(effect); - const shadowmapSize = 1024; - effect.setFloat2("invViewport", 1 / shadowmapSize, 1 / shadowmapSize); + const shadowmapWidth = scene.getEngine().getRenderWidth(); + const shadowmapHeight = scene.getEngine().getRenderHeight(); + effect.setFloat2("invViewport", 1 / shadowmapWidth, 1 / shadowmapHeight); + + const projection = scene.getProjectionMatrix(); + const t = projection.m[5]; + const focal = (shadowmapWidth * t) / 20.0; - const focal = 64; //shadowmapSize / 2; effect.setFloat2("focal", focal, focal); effect.setFloat("kernelSize", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize); if (gsMesh.covariancesATexture) { const textureSize = gsMesh.covariancesATexture.getSize(); effect.setFloat2("dataTextureSize", textureSize.width, textureSize.height); + + effect.setTexture("covariancesATexture", gsMesh.covariancesATexture); + effect.setTexture("covariancesBTexture", gsMesh.covariancesBTexture); + effect.setTexture("centersTexture", gsMesh.centersTexture); } }); From fdbd40bce7b1353a30a6624187da7c19a5407e9e Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 21 Oct 2025 15:22:24 +0200 Subject: [PATCH 4/7] discard value --- .../GaussianSplatting/gaussianSplattingMaterial.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts index d760e184c25..2f4538ba892 100644 --- a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts +++ b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts @@ -437,7 +437,7 @@ export class GaussianSplattingMaterial extends PushMaterial { varying vec2 vPosition; void main(void) { float A = -dot(vPosition, vPosition); - if (A < -4.) discard; + if (A < -1.) discard; }`; const splatFragmentWGPU = ` @@ -446,7 +446,7 @@ export class GaussianSplattingMaterial extends PushMaterial { @fragment fn main(input: FragmentInputs) -> FragmentOutputs { var A : f32 = -dot(inPosition, inPosition); - if (A < -4.) discard; + if (A < -1.) discard; }`; const isWebGPU = shaderLanguage === ShaderLanguage.WGSL; @@ -488,7 +488,7 @@ export class GaussianSplattingMaterial extends PushMaterial { const projection = scene.getProjectionMatrix(); const t = projection.m[5]; - const focal = (shadowmapWidth * t) / 20.0; + const focal = (shadowmapWidth * t) / 2.0; effect.setFloat2("focal", focal, focal); effect.setFloat("kernelSize", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize); From 2026bca12a7f3e127b380a483f04b41a826bf4ce Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 21 Oct 2025 16:43:04 +0200 Subject: [PATCH 5/7] vis test --- .../ReferenceImages/gsplat-shadows.png | Bin 0 -> 46096 bytes .../tools/tests/test/visualization/config.json | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 packages/tools/tests/test/visualization/ReferenceImages/gsplat-shadows.png diff --git a/packages/tools/tests/test/visualization/ReferenceImages/gsplat-shadows.png b/packages/tools/tests/test/visualization/ReferenceImages/gsplat-shadows.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3e8aa96a2d917283f71899096bcebb9f099aec GIT binary patch literal 46096 zcmdpdWm_9e(>6s)aF^olR=l{oYjINC-Ccq^#jQYbclQ=4RwTGn++Bjaxt`;=|HPY5 zo9ygncIKR!-Pze_H5FMjWFll37#K8pIVlYo7}&2cFdvctu+U##b)%xbrRkGYqB>a%1{~9=~u$0lz2Aw{<1hk(@ zxfu}te}vXp0C{MGdxi=#1v=EGNScBsS&n8_DppMHzX_uMf1F?hEBvDS#y}Drv>R^% z{7(*4@jrJF27y@KNj+3j=Csg-kIlGz*j@s9V#Yt11FE1j?zwm0#l5Q^z2vBd6riFR z(NjeWPYv#u#QvlMoq?!09~OWVGNNGqRi0)x{Nzwf?j;8^83>(gIz0h4JX~ycl&U&K z?&r_~WoXi)tbk(?KS#9G@j_v65~f`C|54_{#eaelV%wPiH!eSB7*1k`JlY*qIwDOf zrZ_AVN=T&~HCmsNuN#jpAwdx>CGg+3gy@KmlvjyTRHTy7aq-oZVsZee5>u%;t5b`= zQqaIdH9IRV6>-PUj2!+;6w0hXKGl$b%-u&y%Ky+oCySE+R>8!E{SOK5n8I!@TdGj* zssF>l)jW_`Cj{DpVr0PAmTNxszot8h)c?;g*}kceDD0O>p#Yqku54~vL05cxdiXD~qyr_=ekU35srR~F9ybO8_T06kx^)5S#4E_{9fv3%r=j)j_{ zAr+bq$8L?*Zr(gMgSOidTjZ$HfwfJ5;QFsi?jbJf}O8*YGkmcE-ik6CD zhuxm3AP$+~CPE=yZkj8#{2InzANV!o2h^CMrY+=-_PZ}^=pu@EUW)vNqQ;)w8H(O~a5Pm&yXWor#ASVkW!$IWZ$a5fL^1es#rIPKqX(P7Qvrp#s$Z`T8P> zg_@Ymd!+km!up&eI~HCV+eSi)f+S2vW~==VMlVlb-q2D8sfzpe_?Z3#2`Z}STYo4^ z6!8)N4ZdXARRbqzAUX*OxNe`Hvq8~0od*anX8yS~pzcNTLPeb7Ba1pZ(+M6~CTdE8 zE?9Vk3NxVyi1oPUb`|XBVI9tK1pEguOUJ~L|7m3eKUj!>D?|aCNS03RL{zw=!UdZP?8uxcmp>N57>yGbC?c32664mniCW$HE<8k%OjPcN=|41 zgolBZ2a@GImjuzZNAoqpvWNbv^QM3DNsE%BB2~o#ATppMjA(OikVY~=m0_1n?a0n` zZEKh14DIH_0u;}S4-83e6^6Q%4~E$bnC?9ac=uj%tc?F!lY)vpAqNm1;6aEhl%Gjb zC=>{STX0%b(;F%S+j9GM9MJtITz6@T(;81?GVH2^xMD(}83J(jy zax%PhaRyQ(&Fma@NPQ%_+yHes$8bs^GNNOQ-nN>DoP+F$N^jt}loa++6m%*rc!Wfl z7}extNj&s5+@`@L9$4rcR)`SRHUdW{CoZVhpn)Q~5Fa5i-^WbWGS>**nBRF$%>%uB zMn8#+S#YUAj33Il82n%XqX+`V>H#T}`0|{c9+y@NkcS9ix#0sPRT)_*DhWV>UksH(Qri5MX#v=I@{jWwCY4M`$U#-fSx zqTYNBiUWzSIDaV;*-nxos-q(cC&e{a<=OY)b{G2AG>RSqIulGtU-e@u<)8x?RIN*q zc!of6^cy$i(n>%9Il(1k$ZsU1>a*h4pncLH6K^s6;W+2Uts*J)aD>eV)5(Wdbo^FR zq@0gr^(`p>{RPy;(Fq4gxbQ^xo#nHXi5R_xpNV zdTtKh)`AR~(j?v(V~S3mbL#r8$NMfGHhSIO`2u$@w5oXcFi-PU%IZwIe2;I(WD|9q z*1GlTz>@efmvzPdZf>d2a4eE-h$#|_EA+>LcOrnWgQinRf87tw4lOYPv<>^?{Pt)r z=zjWTbv3%3&Fp!XAaPqz#ba~*k-bu{axXR!7W=I1ydSR&ZGzLzaB@Bfb z3<36kk8Jm6Uq$m1q3k**BL=($2Z_GBnLM@xU2LkGFSk~^cDSFM_heOk`pSlTO~7t~ zodt7eIAUz1x4yFc#cx0E;!2^#b?+Kad`k(pW15_eUDxieY7klW|@N} zoc{oXav;3;S{!tWk@v;zZQ`g&jcx2(hgRre`3WRT3t6HlBn^iK39ZO%wZFr%DS3KN z^XTWnQ)MaKKXdtJmQ{{P*OF?+6|KU41Ukh~200NcyDH|Oy}B2#&F6cslRMwOHQ==N zAZ7IY?9Z^vPgI-UF8nh1GK+C~*hV7ud5&l_-$?Lf>LNntAU8qh(}CNuCb*dZ?Mm?T zP$b48-y*I&^FOymlkR+_pZ=RSa2RbJ9W9N|m#0~7&Ob_iOG|@)eCKjBxK9jv+0|nD zBFJaJsLO8LS#4*#^>nG+ca!HN`I>bkVbdoh%olXNmbG)f@c!HuxV!j%&3_PqiF#J&a>%fVgT+mg)s1q(4r^lzT4)Fx3_vI%m-CdN>~iuE|ubqzp3)d>dND@ zIGrqGy@~2-tFRB&W{_;DBK^9c+nLB(yB_B|0eHRl9g~-Fu3ZPvnyxw)pN3RrIiZ)$Ipr4vNa7c7?1P=3BX=k38SFy##L`DS%ajscff zBTrhkfi^CVmb__GgUg>cUmxDXMBl-6f$KLy_;BG+_OtDk*#H>P{->8`>kZ$`UzAzM zP!d0e7e)*M`B1jaORqcnUNYXe=>CX44q%x0o~4odKlp7eOy!ICov(FNWM%2se0=Kj z=Pgj83kGeWY)fn7eLNBu@AsIVH0Mm%6_df74H-aa+;V`iWXYNe=4w`g+W;KHv6Iq& z#oKeIV~kEY@eveUjrnPR;b_9|b${ODM=)i=p^THX?|TlqA%I%TwN>ByEBP;Y%5Fz{ zdk$=yYnp~JP0lQmGj);cYoMAMfLjX)v4hx7XOoT#Cz7j+PT8tT&tqYcM-~M-tr%?> z!ya(yj-C`bKd&v@E!LLa-o7F}kf<68d=7e=m6lGYB+XPPJ&7M~>wTIuXmd=ze>fn( z$JKuQCl*H#`x`^lyKfl=j3=$5%>#o?_UT*xMbE?e{lb1=L%A)(BbX_=sIns7@}}S= zwQj950J0J0XRs=m!ET~(s9&O?NIy%wnnNCR3*;^6^E?A7l%yzBm_YFj2|x^|7d7#o zgoh2}!nR4_E=*A4H@|KeDl^Tk!OB=>!VSG*6|}u)Io)8oy>k2PWb=}8cI~(h(#QMCV~4(i1{Pm;RG%kTeJyi+PFcyZvqQni{l5K%su1`|!ZJ*wOa# z!;q~jA$8I`=p4mlbpJZdb?m|a(iv0%ODJBvT#rhfJoSeYQ|aS)dv9w=`RvXhY;~Pe z_4L%#00NAPgFU`&G}H<3U33Dz(osomgus2Z;Q6V1ScBtyH3MR)yH$ zy9-N3%!jZ{Av!P z3Eo~sQ~85jTwIW_1F?sBug>uFKC_@W4nvurI7R*U!tHEZ(QHGw`84&Aez7r=IyN|u z`%AE)r2GH{lf`1gs~58F=XGJ5jeO^!9hS)?rN|>x?SHdBN&faITWVuli9TT_E-FzU zoD^WFrx$W++GJB#TbnQFhp$9KLo|1EdUvvzT7gT0JCH^MW277j$IikMc%;~OGLbbW z`nZiTgi-Z6yVGsiq^CfVl5eJ*OP!mQWy6YsSRYZWO?a_zc;h6^zdDppnY6M_re){l zO1Y{}TT_hWK>4>`!uusb)^?nzv310{N@bk7b))J4rvu{ZoBnH=yZYk`AowQZr|3KR z+X}df-J2}v;I+VZEPRF|8@yuY)Vs``os)C2SlbQrLH)I-u zmoC%A5aW2v%&Cbi|bG{nP zTlErs*?N80c!lZC`+FA0ZkScNV*j|s?Vn$ z(RA4AmdX~oA!UQ_D?$@e)wMKDtR{>LIJ`#75uu9qt(p#A!A=1;c8 ziqK(7B72>#E>8eV}+@;yCmb0Foywx@*N&9}lQW6Jw&`}nz$6t&p0W0uzYrYVjdZ{stGG;0D!?fr7NP+#!?D?$3 zV~d%RHA-FseY_<=5%AE0zIq&hb&is=v|C+x$v^n1x3Lw*=7cA=DC9RpoC6n@`kV~q zO=8PLIpyt<{4v1fF|3c=j|+foey0F|Y`#8Uu;hu1OAna6O!95iD;-pAJ`!OFpvGW- z8 zmpfn2M}s<^vW{R4r;b;ir>1I85H?7y9KZ2bP-0HG!T6X$wv3Kju4CDIT(8#j$dueL zX6A|cL}7!L%fXssG~RQ%CIKDlRcXg9@7JR5>U?^}6E3D4W_U69Zp?@!p@ql5M_z9UHM?!8Q)s@1C3(57~l?h0WC zXO+(U^&mZ8!w7saTWy^A@q~I_o!CDJnG`0^L_FkVF~I&Ae}~5U0ZHf-01yRSKbh0z zv8OQyH{15~Hng@jH;3~X_7|WiHqE6crg9^BpJ9*Omo6>PMX8%*_(n}kDSfalBRDu{ zJhGp&7o)?d6vJHftUk+QRi3fX)4==m@^1+7Ax&%lp!X7#7C9dDFY&eFd_XSJmli)I zA4AzOfur{stD%cyf1!Z|(6f@?OwdU0C)H1lM?oO+DAA%3aCyv+elo{cv_}9M8PMK# zk<7v8H^8+g?aT9F-HDL315RV$lBucVGK9PcM(Q$O{h z$FuAm{tb%IM^QSI}K3W!fV$!)w?oXqL!pXx3uwOx4cT{L ztEsneNz4r}S%~Sk?qCT+ig7}Z=(i%_4+avE79-uR^(Vd7`v*{1@)UaBo~ztYZk#dI z!L`O+#%r63G+gY4L0EBHLwkGBc*KaQsX?>pCcL@4v9i3p654I~Flp|vS&sDsz;9?^ zU`8|BR62Gnf_0xqh##&hjK9J~wQ?PFI`)yXx`thwi;t;=>v+?>|Sc)8^<&(2Z+aUEkkU{uKLDrsm}9Z!UQstb4WcwvpG?DB~e7Yw7F! zgJw$Fd*f?Z(YbL#wT7z>XAIVdmo_tPx|^G|3} zqc6Lq+9c!OpP`h@=dy<7Vp9KKWtn6 z$o;gEg&%|)NJK;8#YgHm1T9qkeb@E(yNJ>WtpOFKzuRf!=c9&S(?g5^4l+$}`Y$fA zIiCA1BQ~p5SG*uZRMiTPBz!ta_*P^|+lUMj9Y^(6i_dzx^rQEle8rk-n8Bn@6H2d} z{#P4oxNuYhg5IbvYsC=g26w&hZRd{964cD1Q{fWIg@n1^akE1C#HUSIMjXR zR+g3Gi&it%3-ErPuV8lSeVrW~+$e^0#edwm7Jo6j5*vlaGb=S5#KA&_QS|tz&kc)B z-Lwm(3EJ#xelfLSGOU1x*3z&uP&JxO^)zjh$ZqppTt^F&J4v7R5^{5d)rP>kCpn{# zXD2If+XIpfC0E?{`@J;^8Q93ulrhz^#-Nux44kBAfuLbcbAHx+%5d7m&7=7zH!Bmr zJ22=86q!giU*!>1Tw7D4#RP6Tn3|ZL9B|p%vAbL8y6Dqo!RKphtpw|fh~CY{vis!s znAFB##-;t{GY)E+;U-(_ZSvS1?rUm!(2;mA1+n_?TqdHKeToMCw343xYH5Av|7(PD z4Up!S?v>f+>DwY?a^iBaYhLd-9`ocNIn>Pm%h!WwS9Skir`^4#D7>c$f}LdPn{;jmh{+@5bjq2v+cW`^;hFO%GpC6(* zY3U~RXY$SiAh(0K+aWLfw8tKF^m4=n^OQ=jg6kD)SFio?PiJ;zUZ?9$M&J=a$&W9G z6So;b(1Qb-5^l`3mN6gEqy(GW(GCK^Yl-XLO3TmuBs|)Taj{ePy=_;zoS`wltU86+ zBTafdY1Oh+nYl}&ixZRA%9E8Oa$K#we=kLLs|Fa0_pM%2M3%2_zP5Ig!X1A*g(ViX zh_R}$K!qxK0th(_E^-3?ZKz}x9ynICYJno}g7vb4PFO)zM5w9j;f|tS$ zZ|)cSln}*m^1H+O5`*QxTaXW{5UjzY50?^~bco2w7@&Hjo%rqFgSJuA93mul=dhm6 zhYXruAT3U>VpbANsVXKtk6V)&=X9K~5AY+4*UP%lW#bz8y}x?-v#AhRiWmHC{a-HN zUwGivt)8?d%uwAH7}FpL;T8j97lx$Bq5 zU=>zYT8%N+64Zl^mZsNY^0&kJvDAY1(}S3j>y3@`l5v91VoZQL-`zZ~%^ICQbv@53 z#o$Qi&rNQz&?9{1!k-k1J+~)WW(@LL;S{M))*0g#n}Ii)&PL8`kYQNh2X{47z1S7i)UPq@9h8{QSRH?$BeF!$M_tEpP-|+}++UsE$T~iUvVj z*~Rdo$7^%d`xa2koI0M{BZoSV7BPa9Y&3NDKAG;&>%GN#%Cwu<$KgE$`_Osm69tQ`O`}_M_xrA1j z?=1Kac4C6cVdiAMdgATg+eI_wa7){2d?IhAPJM?iTScORf`~|iM_F0%X<%aVO$Gul z8aA*knl#+W1rqWn8ovDKywuy-*$EB3W^}N?%{@ul9c#}dFXiiz zeE0AdmxLPazJQK(x@&p|i?)0!gk6qCkA2Ex(+_F{G78$GE5d36@pAfsNAqTO8{W_~Vp zbc^tA_$b-j)iN&&f@v-0-(_5ehroKu6EO4I3inszi!J>s6f&!x}z2E=?|a{Cyt14#-UWL(t=H z3m9B#6OvbTdisHabZ(-=y%^YilS;nX=V4G!ieQiwV@k*jk-qG79u~onB}>!Nj@XqW zOE~%X9Y2#@oCqf;OrgTw^=SUco$hAJE719(I59o~DFN5<*K%6Rb&Y}c;;SX)36hej zaBsZXi%4YM7dbPHFpXIkXhlQx9yQ%g{|KU=QoCmgk`Y{dD^sM)j81TK8oGJU#OA=+ z76A8DmksqgiZm0qlWMqT3J+-a!x^UIFN=Qq@6K<(ffkJYKQV7fQ3bUbato>!$~--Z z#nL1cbUvUvD(FhfFF_vjgWe{l+y`{c)3^|1S%!N0<3FXh=(3zSp3N(0*B8>BvLD94 zFnFURYL9~>y`1WV+pP>_96d{oow6rOFMO?33qGhm)oebk#3zcfoS$}zBT9|FGp1B4 zBq3|r-91lj7?)@@5J#{@^`7|-aBQu)5brU;`@3NBi+_g;x6y|^WA9G{GHJAuF5e8$ z(b0M`CUf5_iuU@9SL#sYFo~g&>?pTiI|rQ4=T7}>n<{`bSbX(88^k~M<3D^@czF6B$bMYq9eaKL)FV2 zjQ?qXDoxvG_pZfWnstIasG$^m613L;j+L2vsb zMsMl5Pv+#o0m*yI&jqy>p79+A6FJIjdi~qMe%Ho`pJr6Bz>7Wyd<=X0$FlzZY~f9i zF!Vaj;TYiBS`Q$OkDl9l;DC;cD9hE`_ z$^W?N#`g1}RmJ~cwIk8dwgs6F&6q053 zECsVXAB^7vCR>jtPP~W2=={}MOmR}azS;bkyg8FeAPJ$$hOjJAUZ!^eG6B|nkEH5= z%clE{+cO7Q!CxQa-#LkhATEl8vlNYQTlSlLo#=kE@R1a#lBG3dbitB_fO8~x!uP|x zy`Tn17I56NvBm2YX`Oy5=O+)kkq+u|TUVQzCd1QoAQ9JHc5_4C)uVqyE;kFFV=;|4 z<~J}mfW(*tdkfPhGXIMdG7(wI9@Ib9e^iy=7dvSN$Nm_5TG zY7ZHeCGX#ghI7Q2;naihfIG(@rs&>E*SSCIezzdO2a~k#Zm>CSq&P~HI6n=Ex{V_m z6#HJ&>`oG=xO3*RcNAl?6`Y4|$CYh(={tLG!@M5qOv0L2zgN;bu2+DM1&N7mnSLAj z9SjuLmEEywCp_LaNcsEaICTv_Q!p}iRVd1d3x)y)hT z$o54TymqZLUS3^op>5%78DoLXcIoa`u$bLi5^=JY5&;@TXLVIrih zNgtOe&adNX*230^?hRcQgdtoKFQMuF4?cs7{N!($Z^gfFEU)t~&P+0b zqrx_UW+fZeSj}B{z%7%djKyGMMLy^TQs$)q@)xh+Sq{{GJWSA9X3xuH4t$$4t`LF@ zAo^BR=L;XKCOGML+Ss9R1w$)f6qB4-bXhnO@`JW7-gmhS=QV5|wDfawD%N{*y4{a= zduk@_6^3Wjf)I8JdU`;b*<`yN5=xY!V&R~T#!-_x`|7vE z-}j)Jk4a}4e{Bg?vbUpzv#{*>f`mVep~DPj){_t*>^_Pvh-whUh@Q)TO8Bx!)Xkmi z@|U}2I{n0S-}Z7ImgjmV-ys~#Kl#-dR}ce)!FJm zWZ?TJ-Qw}vvPe~RT|vO*Axi6$z{7M_`i`4{X2%HbIQ&6bRpm*C>5?Aj7^&{P|9(dj zILtq<;YDtB?*tp8~eR}{oh2~S=W{zyT9}9bI%^LUm8M&LH;DFB$IYc ziw9pCgOYMZn*Py=$@F?pK^h*Zq3OEwxJ94MsFjNINR^Oxv;Nv97n-c82#!gTR6s!F zy6-Rh=}o6UX`Q~7@?QdW4B67$x(i|^&OB~F-i7MC$D3GslK)kLU8;%k+k>LO3zD+l zu3u;BIZz*3yf9DCk=Ng-djjs%viM|>8|6H>*d=NVaCbOZTv!cKe@=tr45>WM*N)b9 z2A_wC5|D-lKu>H3+H=(zl_|jEIUfrb75Y>+-)qt7y?u)K zww4R}+nlbd*4>z-$*?%mC0PREVY#C3$-nfJ6_xi=Vva9#Xi~?=!iyVD$1_}}3|1qA zzWJ0{<0|@K1Qzr2ug|uOXSp4O?|B&f16RDPOSG0(NwC@F3o~k+B++)iokzz0j@e%c zrOH^~orQQIyN|M?eX#qReP1!`;fu+d>;Ik`^~7ITekQH>8*4t};w z9UQv?3Gg$LBv}(^!$^2iCR*_4oQ21bNg2s1a9LRy^j`6KB90}t@X^*Z>jYwVYfEfnlvJZ`z)Hwh>$#0ZL*4)vB>I)0ep``pNT=RqVGW9Kg z$w#u?Xq6UBPeMt4@@S;wz8a|#Zohfg!#X0V5rJi@N>)TEzo(fYot{GhpKR`O)XLAy0 zwdwe+;8w>3hj<}^srf9ysp;Lm)BP}WbkQRS*%mIGH#e|w>e{JwjP9gUw)j=5$F6gK z&c0ZQm+I4cVW$MEYfDtx)^o5pu`;!>FqNQQ*ABg~pO(-x-6BOWk-Pj6CW=9KGHT&q zA4BcCgrOd4$dJ)cs79BUr%*cH<=0h`$LS`7m2(rNMxDp+_x4TW`+3)tjK;(2v!3VX zMuLIxwW~W&q@WB6FaUR}$-{K|3h6dhFh{453UDORaf8>{dWnxsih?E5O|AJM@4%tB zw%IN`#ih^%9_rN4#`_kGV;GEbvtCiSngm6klgs5$BfqKB=<&91-k!;{B+FSN-zUPT zA{c%bS{#^)LE!>Pu+>>`^&TA>{!4KJS3>LzWO^t+=NIHpmdxc-38q*4 zoO_J`5Zl=krrbhLB{5#-lKK#$~2t8{eaiGlR%q3^4t9GmiG6=2~q5dn8GX_tWulMNH-wRwX8NO_jm zyFpvES=gq>lTvQDLUm3;S;X=iDBe>NPk%10?#DZSBRd9sne@=RBp zUpUm&>YkvDG)cca4cZSAlgOfLBT!~4z?P428@bhU08qC$ir2QQW5NbTZK-G>WC`*^ zS>;SDgPWM^M~a>|a_ z%kHd19(XiM@*P^|_{a!@GVmo!25fADymcIE15jQZ(L=HznQz)(ig#_W5lfm!cI!aL z!EOFt#Ok{mudr-wt~D8c%ANo@L*iHC_3Y;3pQ3?%3By2}P2*%UW0*&R{X!x*Gt?o+ zdxLUx+kr#SsHqo~=D60US@-=59Q&vdC7~+1?Dl?2QOGhvgl}#1wiZA3Il5BXl_!jx zw9V`Jdcc(Xxps=pz(|9}Q>qK#{$GY|Gx%}*Ou%h_qF6SOFxnjeeV$MxLm}I@d)eAx z+G+FyGtOywkj78wGo|0G+BFy2tcXcS zZaC70IkW~TEz4oyETWg$VAPWkP~yHHjB`ri(&oA$IS?oK(fvrq%_+)tHym(bC7;L* z#{4G1j|AWt3lqj_oVX4U!$EHw_V;E+^3P++3N?kJa%r}&MoCZQs{6q6C2WgT#R}lG z^HE-5;&1?il$@jzc9=Vv-)FztxJGGG*(YHf*T&W*-^Mne4{&i#lmNewGz8iCKrsW* zJ%7AB54>~;MoH3pteJ5a;}pZLT}%g6)&i8h4a84(Os2JY0U<18X96N42?D<)W+|h^ z9_Ml2k2c>Pt;uye_Yel&#~STdTmSNCBV33=el773J&s5Z6mF0PDUDXsTxMI?iyDp{ zWz&uKGOd!qqUxx~=?X_ET645$C) z$LuL|XKP+dEwA2_Zr&S>>cP2?g)Aam!ATR8(Jz>L> z5yGeU{wVq8eW|f(7R>F<4(QF#%xZ`&aqVEM?yF;Gt5=X#IfU_FOji8)yy}zRvA&d z<`zd>%HuBn2KW!8tH8BZBYVJ5eID%+L$e*fD*KdLR0Z#CRQ@65^Srr4zxlVNBwS+0 z%Enx5i-93yWMwR~cqEd?sgYVVXG}UV*y*8d!q_$L5K4V?8--ZH-XX?At7|k7Uu&-Kc zBW0@#x450zf%9@UeaOlQyM}PQ_8fAJFdrlV-p5HxaH_U-n}CbBGf~^7ovDAAm!p|NaC7Hx_gMva8;bnh8k3H>*&y^4_-31PJJgmr^Ttr zl2XWkUu-;;ffLdG$K~(V9IrI)&CO4HE_Vk z2VcdLa-q_r&qi4rS)X@1dn0?%dbFr!2Mmbp{aJfAc87D;)34OvKC@6UL%JBHr zFE-JLm3=hdA6i*}5}EE;@=@}!rF|5A`#3^aUrCVAYNWxwMHulDjVVN4?gc5Ox+H~w zAOqj3%pDHXqGmnFbe{N<9=1)be~AiZo%An4QEorav@1m+Jw11Ohln{zLr57z8MbDH z(*3Qxvuk5sRVj7}Sa}hinL#eQQgP?y#qfTDQF`uG<7ohLv7C+_7o4u-W4Lf;X4KR@2V+bEmpVof{v90KNl|JxM*v81U6 zJxmZ~(D88-Rc^Kyo9Ph(TOcjFYvJ_7HJYE3WE=+g8t8^Wg|{5_JCK;+|_Gk|IdZb1H8JQ$-H{ zPgAAL(aT2_KTAK)DV3zc;CC6qF(?;&DFHSr&mNR^)c&)tEz`JPs6~6~t~fF*><=}L z$hYYC$;>tAy=ZsrnQ5-%iL#|rVI6SFUKf05<6BgmXmX$?d;sZPVo4fvj!Jz?6nnhY zM3PiDl$O!(V+%J7*<#a}O1q3}ApVBAg(i>&D^5u^PLUh4fEmcs0Fy-axTtj8Be8Lk zeJOQF{&M6=A$5$9K5Bt2vCbm$b#;9s^whxBhB9bhNk-K= zdw+|+2z?(A1_9tA?M_j>#rE77t~MCS-UN(!!h`e-{Orqih%J2`BP3y37OKzjN+Plv zuyP$MkY`lXzt6=sA?fi}rP;QiiW>LNFMesGl#hJ<^mVSq7DDT1RcFX@?wejQ8f9ir z#v(zn_%TW`bP(YSKQ%>Dib_b=?a#k0JN5>dedegHx#GLpCV(=Qh&4)d;z$ScK?M3N zSJC%RHUXN$pDp3-1Ry}VIar_|FV$C0SD#zN#a=)DT?Iv|dtR*Trx!7jMiCQi=p!Fw z?xQafQ3+Gi(@kdV+w%I6rS%Bi^yqGh=PgXwAb6H z)0Z~jBJlct=&mc#R@;Fob!tNSq!vzPY#MG4{s|?Nw|R;kk8B^iA$o_-y0)lh&b4BxMzPE*BCcx$Zh00(4tS0 zMIVgzi;dXX_mP+&C2Wh=Vt;FU;Aw}SlRt%jDv*#4b6sor$*6#}=dH52l@lT?^zrMs zE$_(Ji@(-=ht^V3&ATV`x5(+O8Ev}O0Yj{#WgkPGJa}_{Tgq$)cP1vfy{&cZ83Q%m z%$c^W-|(TY{mL6Ag8zMTvMXP1aOSps|GeRNF?jGD6O|UHH4oUMWNvrca?T~X1&VtR z`6W6Ja6hdL z-*n!c(W#pW^MIy`9)wwK{37N^U! zQ+8sy+wbs{iLYSaWe48Rr1Yk$KH|KD{ojG+I9)?rqXwPEf5Sn*NaRgk1dIu)XNgFI z*w`}s(lWH66`y*Rj?9r?U$W~9BALA@WrhkA_(R(-KCT~ZEABiM9d-0yn-6+JCSOe+ z8^@d%HnUvOs+sr52z_%pEx&%J6r~LOAbVhkw3_FfMsQT>7Mv>{`iX+-; zkX{q@FJ94^K+sV1!0=(QJIrqIl#~$y~*{Mo;n#?@K1uAsZs^M za8-E+isYqOS>7v_{7|I6$HV2YKS4bFC7;oczQadNNF#F#!_r%Pw2!j*r|)(zhDCfH zKav8JYPS%2j(aFRJ_g@(y6{j5XFBu^Dzicuzpk#X2w-^M65EaLlhprm0VchuAZVzZ z)~^{RA9)%IxH8XCHd+lU4hN@u z$C@x5KthBDA){Jz_WwlO9vSZ-@lOBER!yC=LxMMtSCO_5=-Xf7EXCLCMn$2hTvqG9 z&6PfV+;;wWlHZ%R>bFzISFAg9udd4?Uu~B4e`k^ zgojov8R9r9gp9xQC!p`DpzmQ7^9>vs^|)^j3APassOI*%yS#UaUUF<%n{nZg6lJf9 zIQbfb_%vz#YSVMG^Zuyd#pV4;HzUe!^u8)e9|u%6|K&GWWv<=mU|hjWx+TI+uwZ4V z1RM$0$27w0Ob=@r{WW8^F2L%RgDpK567{Z*_?&yk8UWaV>9^X>w@T{zZci>*Tz#Me8s7-Cp#Ew-t<~N6;*D6S@vwp+)q)`c1G6 z(PPViR=lqtU*eFlxM9;c-_#q6k4Fy7oHZ^8y|#U=2e$ zh6%#3yfqjbn+y%au+4nOXZIdFxc%_K5)<<2q*kfnAf6asM3i_qxEePdyW+X}qxzzr zT0F6sNvCkuK+kV1uj?02GS?QX_1WySoAbB#cEIZ4oJZJhM!;d&1kvz4QBzdJEJjf! z#}lxBJr{%AA9rzVQwG7$goblWG#a8*=9&U_ZF*{2ODC0ds<^jj8Kw)z6vevhOTKNd z)YGaumCt3S^Sw*$ z3rRz1(z{Qz)Mzx)=``zVZ!+4#2&>(%11p4C9QL>qq3~GYDtr9M2zlA6$p>{Y6rOCM z8nfo1uJ$Vw4v;cDcjol;>Z2Nn)>iR}wzr1ku5*MWXdbMeq0^&qa6(u1_p6xajDXFJUo;!E?%;|;2 z6Q!Na;KL9FU3EQ21~jS){8p)1O~LaMf@Ia2u7Fcm6kfcRN$7B>Qn6^84Jb4@YxrJL zR4r`u>D!H_YdH<(ulr^bC*Tcx&%4M%4_lbpvTWuH)-V6!?&m*U$z`!uAxVhQ77N4ac|%{w9zQ!eX0d0n^M(8Xq12}(AzsR` zX<3rMF{LI7;GG*&g~rc+rt!vW$*+AQdGn5H*^=u>L3fw7tIvsPzDQvIM_wET5yD54wK z)OogtE*3V6IA$pXJneMG`P`=~Z-1%|PSSJn?_3bQ;LL(xD8z9c%W@$rsq4uUW4h^L zS48-#KsZ+vTM5EAMv%q$MED?`4Mx+BIG`|mgHQ5>q?jTQ{!Fb*VW>Dy`F?fysL3`y z5?X}E-6UWE5Ewk>K1m#Eng&Ev6s0w7eb@o9HGl83qOlOS{UBz;a4~&{DY~G=2s*%e zTCe}=FXg}ZS>+#pBXjqj%zVYgJ`=bf5W@Aj#P(#N>RPiO-^uDaQ{?S>Z5zk@#4$-z zI6WcY&BuA;lX^CnlLWyimxTw8tSi=DJ(r(eJT+I{+S=UQwH(Lwpr&7yus?*B%V{$+ zO4=yif7GZofWTGY8@PEt7#|J7+CI)O??DRDa3PteGVTUBNB|$Urs3g48E^uEbNzbx z7k_sxl>)mbw%SQyW|G-B%ae!0iwh8fl@(0~%!_724Eo-~+le^oJ#UX6^kiNfw)Na` z*v~8aAl-EAC^>)r{DTJ%7>N`q3XMLYgGWb4SdF^iE7e=05x%o%hukin0MvQl?!Cm01L*cW&sp>fny zN0FY8q88e3WvW~QY|6e_rTFYY(P_SNE)2`7pGvt>rI$e@<%`7kX{6sPfgvPnPt5a za>9YpH7-TGSI_SWv5*uk0%4~P2tqcz7i42apwJf73QJmZHn9MHt+uADf2MF`ys

%IA!lucU@g>2$n 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≶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 R3HSs-@%;zcYH9PJ{{x(c!{7h_ literal 0 HcmV?d00001 diff --git a/packages/tools/tests/test/visualization/config.json b/packages/tools/tests/test/visualization/config.json index 562c19319e0..fddfac4d220 100644 --- a/packages/tools/tests/test/visualization/config.json +++ b/packages/tools/tests/test/visualization/config.json @@ -1,6 +1,11 @@ { "root": "https://cdn.babylonjs.com", "tests": [ + { + "title": "Gaussian Splatting Shadows", + "playgroundId": "#OE54M5#16", + "referenceImage": "gsplat-shadows.png" + }, { "title": "NPE - Angle align", "playgroundId": "#H5RP91", From f3cc01425f19c4157020d94403a370eecfd85b6b Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 21 Oct 2025 17:22:26 +0200 Subject: [PATCH 6/7] cleaned GS --- .../ReferenceImages/gsplat-shadows.png | Bin 46096 -> 45278 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/tools/tests/test/visualization/ReferenceImages/gsplat-shadows.png b/packages/tools/tests/test/visualization/ReferenceImages/gsplat-shadows.png index 5f3e8aa96a2d917283f71899096bcebb9f099aec..19966c75065ea48262dfd4e9f8205e2d3dd5fb77 100644 GIT binary patch literal 45278 zcmdpdWmly=&o(f~#`nhE9R_A_cXxMpcX!vp9R_!|!QCAO8Qk67_2s(Pdj7=wt?O*s zrb(JMM{-8U%Zeew;lP1`fgwtW3oC+wL8ya)fyV(LzP`MxMNET%0l_4M1(e-?pS{EW zA=B_&gwW;NN*G`Pf!L(nB%kskQNUj^>gGOTR;ji;5nEcZQHk% zXiffw$v75;8R+>-#7~r0EZJyglb-A)JoKU4;dAd(w|?QhNY_8!kLh%~-{}tecvsqI zYdArk&?0^$D;C#c#5^to+3p9h?DzuioO z{*yyq=H z)A#^;6rj7fV1MM7WR2!Y!H7w&)L{{6zr<;ej}M6VLnUFZ{Gz;`RqzLb!f`aiRnXvE zmNK%_m9_;*Dl44E%qst_EC?jp_n<7=_6g|OfdX)VnW!32egzIedPGswad zfgmRNPxGQ6oQ2)WAOEfVMd%KPc#8E8KRBHKKi%WWu&b^LgaiJka4OHUot_+j;B(l2 zcC%a7&svEm@MQ^TmVx&prln&4HBZ<9|38~mAEnZ=bqWG`%qhA(; zcmzdC){oqAqvGQKCvAbJB`UawAwY)%ex%|`GZF+!h#-$3F(9_FZ<`IWA|`_6tVq?8 z1Ydz_eg+`m-oZ?N6Ak5VRAP$ewj}lJot^u2z=*#(=;ovRKnl!Mbuq0BWT3bR?JrI2 zq6A*WTcADRqYw=@+6g0?0oyM^{_7Be7jU0H8SCzv$0o%OD}4i?gHmk%#YIt}(X;`B z#Y$u$L+8xtoXKM4GBX4a4L4r|pn^%@Lf|k1ul}+CKSjefL2RY4d0|@n!fh-{9h{n>J_&X*|LA*vSv;I`MXKC zsRUoL0C7N(RP$u;0_>(D0$WQn?i0I3yR+eWGrC$@@bTea{s&Hgos|W|F8YC=U_uu3 z?J|um2YU)X)CrUqE+`WY3^w}v7l5bse56&d$nnc(bX!<#v=(4ZD@>9vFV_SNCbeLP zjEVOPGsA`{cTK|SJU{vy^7{Jvr4k+oK_F6%e_%nu1^bf-BhhUPR$RYJMQlBbA@SFK zJOe|B@I-@1t|AV1!o3;Xtqh(HRZ!#aSz04Ov(P=FZncpe*~!a0@85=UQv zWZW0WMl_JyV4RYW1SkTpwj@DdmkN2;=Ci>*Qf<{FNMB=R0ez*Bvb_peuI_KR^nsGl zh3ngS*H@zH*fCK)YX9wdmju#)Oh!h=1p_I%4mMyXoQpuF_$rQSsjaQKS?o*YKQRJp zyE&=ZnMaYlh6CV6NiF4_usFwt7=>y`zS!HPhBP1)$=hm?9BSX?5811;k#QP0Hwo3X zp(p*~V3z{YAZ>-p-5tQKY>%YOK2{8(6KzW^Z~z{XtGd2 zjmATY^rwQtsOAe$0&Am03%5YZSVp7#AwFy(mG-5ag-r!UlzKHLWF&Ad1A@RN+TcJj zutBkrkpQ??+emeTGn~M{y^)5X&J-@I)$7vSskvAw*8);r!hSx}3E%w19|%mFPcNMFux7Z@taH?ys91#so204Xz4;2|kSZ!g$qUt z9Rbqu@kpVD6>pE$jW_>=lNS>9L*ILE-@`yHft+)&WzPSkdPwy{z)dGsB*uLne+P2_sZ0KN%whR_fa8Pbn+Cqjv6uWucZ1nw~L{R z%lj@ao8>>vo<875W3ru{9V!~!KcPhUzTx;lu~unl52XJz6jtF>BT%(HQ~N_5Y(9(K zVW<1e>T_^TPH!IyG)A*O*8MiQ`R4X{;r4xe%$V`>cJrNZHl2Fd)mVc*8Q$-{<}KCg z6j%QIeo^nWNbkkSZ0dK2B{ze$o!uMT=VZ-Bmk)!!aft(2XX}5`Z~Jn59evrucwq%v z{lEi}VS~+#nFw|~_yYU*7oQJ*znsrCvyT(K*YO0Rj1(0b4BPcqwyex1X{M}E?KbE5 zb@*Y9rpB(OriNy}mphB;ykyDaoBi=KDj;3a#@LNx(L!2QdWG_MB+2yDL}b4H(F@<_ z;pZ#g+r8hKwdl!z{v z{jk-^jA!_L@blKs@#1Z8j&j-_Z(k%&n+`7j$WxaQBP@>U{t;Ce{9=@~%CTt8e4gpp znH%J$t(Ky)=pYi$BrUZVtyoq#ax$-sAxjK*g#a0wFd6;ocX|0$c>A z{$)EXEXPFNzed<}@nYgbwpmD1f>V(-OO$*futGw%D+0D|K89*OHhCYP3BMJ<{H{wyhv@5qWatRL=lgsgIUjXp#}h*@2ggi@_37Gq zX_z9^>EixS!4*w(xPrOY?t%#_(@u25`Sgfa&=>fnjw^YTo7iniZ+L-ygghHLI)&l>R$7 zoXinKXO=KwM16@@UfeH?6XP+I7M0|Ax9hi(Dg-p75PyLKP<#w70- zUYEbQJ!q1p*E@U~W_}RYK2J2rF-$PDR!=%{3v;>Xd=4#kTXNab5%4+O3@D}2I|YiT zNAE@!^{sn7f_Y_>_vDyUWE#OdQcd56=J{R1@Buvp_MVTIm*Eemg=FI}-G}R%o7{Li ze0lI=r@v1KUHl-Bds#I5T>QMR@jbWNbk<1~1|t^0%cs!#I)y?cgdE;pZk1TrKBy5x zeFfkKxdHY|qk=7IWzsK~AM2kny91Y>TUBOy-XE`<&-5*gOeL~8Twe5#MEyA7|(7k5f53W>^PPQ%$?E?PBu$|Q)0B)pqbz@$|wTU~a4Zd_cr66=Av(v(ZOL(t1B z>}hsh?=$%AA53a(5jDF#((AN=1* zyCSoihoEV33Ge3$ZMIOh=fUwI@BP~=p|00Udc}R)HZD6G8%sf^C?f_;ppZ+LXN-+g zN1SXC@jo>?X2@(zG7u7MuYx#6AD@^;O5WdsE%fgSV3*=L!!wAel?D`v0f}&d>QrcN z#`%yX_S%;lV`EwE%_U58sq{IqWk21ef&QI7hZpa!k8VxPAIp5Nm^zbs;S9oV;Tg;_ zYu;bCl=a*a_0r>37)(c#RW360k!8hkohzR9=|XN{t6D7ryuLr@X12@?6#B~4ztpI` zzx+%04+Uql8i`)+eS)fpB&kXC6!V8F#AOyWA5XDmWi2*Bd#DiU3$r^rLqjhsEAQ_? zealQ{L|`Ya5WynEqcAP)4!65OLEbd!q1Ky&@P}aWS2;w$Fng=h)2|yr|MK7vQVqNh?T9hN|+E)$|q6s3p+SfGHey_FL# zNj|)jQ*B#oBL@=`d{~%{G`w+O?C-4fpgod#W1druVYr3kzIyAeO1Qf@Ww4u#jj4!4 zvr|t*grl!}+V6Rg;f;*@A+y=G^J>irXaqIa($@Cy`KIOf`f%eM%b8X!IyT^QI0 z>|VQ{o=~aUY4?!s784yGhP7$t6h}v)5L>^D=u0P7Cu>d5!i_YI+ot?c!4fAeMi!b{ zYKwThf7?0R{HXbeblslq>w}0gjwGSohm=Tgo(m4EW9Q@JVM44`MiYsq>?P}ZKEGUR zcM^*lu2)hD6o=Gx#y`Q8dR(>hJ-o=`s;!}t$jGnNFQcNVM`+)CdfFxIcyF@6iA10l zL|-fXT!m#AJPin>XcEc)RP?itA95M%G@+15G{t&bR1@nfTEdvWuZeN!mU zH=@Qip3;SrJ%}b2sSL4QO~G7&kgX@1n)zZDvhOuBrdh>e*4Y)OxUILYZ7IUb%%v}H z0RL0WV7>QKzvnVqxpo4d!}rIemIZ%pz1D|W+8SmAA1|-nv7!=Wq=&6X47sBNXe{3Q zqEx*ryA=68PGk&8D0e|T^0@sV%H&Do9*972W&|d^k?F}vP`6sXg?gR4v>~?eLvC*0 z%gNZ;*>5QweS!f+Gt)z2AN49#q=#m;MOK~ZPWum(GlE#F-kL;j-p>UsJHFRDrlwun zOKYExVc$1>zsFR+XFffRR>BJip7gC0i5}rl~rdm z7i-ZL2M3u7ebnY=)@pFl)2&QG4ZyPwJj){z|L1xB5}nzumHDW~c5q2E} z-ezlCX=iO?gC>RUZb&Kn+nTw2u|}`k<1y!k~8@E+1xVPM(M>Z8?KfuFWP+4q1O0+ za2B^eHJ=w>XuGNmq?i~Nm;(hOhycBgTT6j5;J5rSyUfTNO)K7CapkHf_T)F{VUW7y zgiZTAEAGlm-?_2nrWvoU!*@PV27Cfh?UG5A<+!FtH(UkS-#fk)vQ{R#pTqbP}65nqw8bp;5*}Ljk{(*+}&tYjPld{sx-6oty2B`_$~07Z+2{x0u8w0N7E-x~uC(t2PzBk;83Vgf2S9$}P?rocwGu z`~|N)cN$4;=iGf_xUgyr*~#J+oRL2eLner9?l<-oQxyH;@I;v%);!9$XyE@^U>2&* z={4g=8=2EBX6vxs5G6HdRxK_$aS#5`yeS~uRhQ)1n0doFrlQ>=%gHS3y}gAHesa6F zKZhvU#~9Yh)1X6%RL_qQcD#aP@wHIKHqyAr{Z`M&%HUyN3iC6oQ|AW7zQ)kJUq_#E zt!iOTo>0VyaC;h-urX7~N^ zv!+|Af`_@lV3jg@Ed%}ONtnPGu@we1wUzh>Qam%qzDGAUU+Ek1 zkG*5iryk%fhXl}l2jlw{L=@;8OvO)1QpYTw_1DJy1F_z{EQb@DgU>h+zu0R zGS=BHkKGl9DkTLEf7@DyfM?@lWMp^Q)r|vk#7S~(C}5IR)MvnRk?-7hnlexgcmqV)ECdbNVnI%T`7B4ih+F;qXKmI(KW8nK7{`||J>@E>MC~cc@Re73?5yY%L z;gTg<1-&ewGRM96`mt)Kl`?4>cNGp}A+R6@Bxr{Jpi7Yi=Rl6BnP7*yJ})(#lTF}$LwpMtYyz^;5N);HHnRac|3e}8@&x2@2e-GWMg4s zVq)RrN|hx$6(voVyg5_2PB9YjS5{Gu$26AE)@tu=t0ytPp7y(NI;ExUzN7rqKGZM# z=0gInAQwu(CWfWc8NQ@}<#4Kw(PC>OrwKpW&qLA^0KON9sh4Y7j?8PbO2NY^!u(G1 zNYpaMV{SeNX_go`x!cTGBeAw+E_3G575Ggu0g~Jv8yq4Nnz{7v3PSRq0fp7EVOfC< zn5&9u9Tzl~p=+;@w`kmEqPEsQ&Wu@;o=r9x7+@6}KNeWokREP>Z&GZ)H{5ma=up*1 zVC`Q?AgS?NET3|SlEzJbBvtR${iU$h$EPOKFC!AXQYlq!@<8GyymX-NnFyWC25X94 zZ}>DOA{BpQExj_Pn=`#t0Ls>=IjYeYDN@(wU3R`+6pdpZm||9Mwlp%cb^mEG#(k+; zb+cXX6ni7?&~rbzQ}cWLq&hnv$v5YHGPRJ3@c?{<{}5kC%9}-_N;HU~K+FP0>@I{D z{ixqYMO?}_f!lmTLi3jn?P|u1!i7NQ^n&0^E;^OR7ImhLu4XK%ex=3+r;ulZrac}J z{q=VX`;bZepsK3x%35-hJm$8NoEbN6^iJ;?u}CW|Nl$2ys$~gD%E?~iGcy|+oZ_Ot)k@U2w7Bowl_`Ztw8v+F^BcvO^#Ehw)H zw{yXe(bQqZ!t^KuM}|=)Oz#0O!1dMDutUTY`X3VzR;B4+c=fxrNcX{rej(+ux@LXaRPk8b*2wEL%WZRcd0At9DQ(O+F(Q~O zVoqt!-bRayYd%Dn0GBlMNiOL2l?fOV)`35uKx_>6HxQ<{6fRd@sd3A|#?CHt;@e6_ zF%%{e{a1L(4|}M^?~bwGooCO^P|etdN`5X+F=kY288jBu;K{MI{(!#=X*4z#@N=+Ls&dP4BL`hJ6!m3W z{=MWZ$g=~+{ynA!S0~7}9Hnc8bZa_S5}cd@O-=3C*@1LaW1ZYg_j;|y9=4GXKyWgo zpEyG&o%_jNZZ*74_sN)iJX~x}7iZW+F5DP$B~14C#Rg!_Cx}@_I=Jcxb9ML%3IEcd zVZdq*P*Mbqv);HL(jW!q|6pa7*KSayj3uRuT%cNmM?n1~n4|OiBhTtYyodi?Or`Ny z`@$*b^=vwRiyeM;Ak=6c=qJfTTMC1s= z<4h?m@hnP;^>?!G;-oyb>33Kq(Y)N%7Fr=qyKL~8&x2cInTwkzq^&Tr&7%hkyu>ob z(8vARzfXt7Yh{$`maOXLbKFnAMHgfqPO&EdK4N;Fb>!^JbgIk_O%<1!g^9=on($6n zH{YxG+4m(q+^pW0&2riuk7oyOzv8y6zlfdM6%f;g*TFVggNi@%2D5!%PEKpQX{s%7 zadGYW%FErW-QxIa5pMgQo$NZU)6KGdi#JMD#>h32c3~$&6Hyql!*h7N4h9ePw9|6B z{rrkFt4~7fTI*D4lBcsdnArF#XlTgrEB>9d6Z*zYAG$TWjU`)hCi)yKAL1?2rO^Dk zf_NMoXJEs5>Evp5&lYJ?eL5ChBKJFDaCO&Zhv8G_F>*!r80N8~0 ztM_dVYLazjrWd`}y{sA4ODqOEQt}Kk@JQAI9q_Y((iZ`2h}En= zyeBi^REZ0qwZ35ja%#t(tE~M)LJfKZw?IL>xEn#H>eV# z3|;Ek804%v9b%C5@v?e8yU__VK#}EoYmseX-M4qXcXB1RCf7&VEKb@;MO({^=&mf; ziu(G-u3oSK&Dge|EDwVW-rHx#b70R!gM&dqeM1MuM3TWy$|Agtf9{GlAIW>|oS1pu zL;P-VyL&0F_KU1VnNFgmIbDwXpaAY;_0IbzN*VcqGZTf0*Y1w@ACin&JFtf!ny9{G zR7x@l39{X2&u_rj=*`#2b9EpWIyz{gz(_;uaq-p*#>~0X)s3mHVf*)QJ6?inqw?su ze{p^MUoW;`nI5k|L3|?-9~N%xjO^@#p+g8#+vqM}-EY@F*cL8cYe6H#KS<4omdW(M zMiww`Z9odM(N5c2ms(41N}J!B9!P`7zimNv$=sn65yBZH=2P`f_F4K*6Y=7?y2iNJ zo6{yzKPTJyB0GB4DKmOJzjdbObfU^R%3u&BW zY1vv{4nd`qO`#>9$yv8|F>-P7K};bo$dE13^?Fu$;%e!3w7b8MEK|QLC8f?NrJCk` zJPWx!+)l9(`n(E49%=4wz0%U#SYP=}M&$@=f`K*{BaG19SAdHTDc!9cg&;OJH7#!C zhI|t@=3}Eee^K4?j4crLE^I`4nq4UmasC6a;fh%_s^>(pG%HZ1=qIVI61?5WTt5lg zAPV?|=M7RB%=zSbLI|ybrMcsT$GqEjPYYor{#;({5<_>m9xKvjr9M88v^_aUpTn5X zkzoNe+dtghtqHoi>drB4nDD}AYsc<$WZ!%nw=&LEA!S>Y> zc6@#;oX}`1FlKRkef0G?SFimL771NtvHZ8c|0>!jprIz}no2p9otJNaJJk4P`%%DZ zIn7~f^n~*t>LpW!4hBgq%3~~4ZLc*8}E4;}W z5kXQ@VbR&Qupn00>J{z9J`84sw1}+@6R%y244E&d=NXDvekKPgqBbcL&TRm=AN1qt z3oUsdWlPmkFGaaYwX33|n=BvnG&BfhQ28x+ei4y=%FwxGGRG;$6V-a+Oz-j$lA3t@ zXQPyUQzJA=-WYxMVw&fXWbf8;u%ibSaaBW4D=3Fje}sEAJ3TWyCw&*nHEU}F2`N$~ zH>*;aHhD{{#eO?qw+1$!X#6DFitr5m22APc!qm)kI*W%ZdEBO|>OUmK(Kq%nSh9+O zmgH2MIO5vf+SODvdXTNT>E2TX#bijg&-1<=kK=Q`2tJiw+3Mb!wPf*>z{O^+<6%MT z7}>7#`eJxB@`)0O^@MKwr2wPP*qhy2M@LVO@+&2Z8d!UHlZWEK&Lz%8@l1-$CHO)# zyimE>wq}WX+}~8M6dM<)fVJFl1LjiOQ+#(zS_F)?_JuCAZX4>sX+rXwgB9FbhA+Oy zjAB`KIAyzt{5eVb+xa7j3x7_>?Ed-Cu4IlCck7o65Yl-fOFd14Gk(I9ssJe~J-zvE zX!x?T+55JbhWaqa?_q~&S|dhNG{(~1`AZRrpA2L_D=E2iIGf=^*%EdrPV)Vdo!%KM z{>U0PDNsgh!Ai-wWT|rPY;fiQ+RW&ehAO|<>5_2V%?v{Hr>ffhN8%_U)ipKiFdxe)8dS-+(Vp~~LHH~hU9Z>C$eW&CMn0W+S|oU` zm-=pItBk*-rLE?p-8Ma5FDA7*ETXC@9XqHb_6>>c`>o$_Smj94#05ZP;jmY6on#+z zB?Rc|&dT8>hVYcK6g#7C8*dxyvDIuioMcGb*jc*kRO>Ao4q0}xX&a z46sT&;)8Zg4thhxh;bSY3Yhc`lN~d^Z7x@((C7@>{`MyB~v8_er52d}|FYQVHmJ*&z2*}_jL~VhuOUq_> zzdDdPjtdT*X4D4z*l11o^ko5{DT=u;%Jkj9_Zp7Oyq6OL2^5y zz6rm*|Hr62Y^p_R4vWQWzEQSWm@^@;N@5_~9XCFZxHKw|A4R6h2#Q$?8frHcy1xTT zuDDft1vq{SH~bDY?$!TLnO2`Bk1n}P*Bp74Vr9shshw6mqDahU(ol`F)y$pjQl|ec z5)QA%{AX^qIQy1Hqb3Cb2$lhs&KVvctKz5R)$WjS)37~H_daP43z?N3;3XmzYQ2Gd9fgv zdaaIrt1%bjKqSll-ecG6tkcKn@txR;=(p1CuM8|rc9M< zCm)%|S6#_w0GOcYZ|DiW&Sz2l)tMvTCSZi%+`k89CBP`z`wJjIjGU!IcE#=PaX?&;n_V- zZAgMqA2v?_KV-7F^)DO}!490X(J0S;O)Z`E)n)Cj&NF6d86f#^GI(*m{z-}rS3aGP zc~VI&eB<|T{3C|zNVxH#h^-WGF($|R3EFcF?OsZV{n_cEQQ+_h*b3m%BrfQZhDlNv zm%rU_C-3fKlPyEi5Nj+Y$E`5oV78cPNrct6ca9Orv11pTACNDqbVsJTbjxgjkGz|o z$m}mUY{!q7NbJFoGy-`9SrkaY(W0dK#F){R#>}^3q5FEPQYE7etO<=sz6&dvU5)4F znd05odZ9u_47Lv6aD-=Ze^b>)aQSn@Cubt7MY1Y)=b`9lWEz|&O=+2iI|CY5*CnGcHhyz zTnd)N!wnL3E)(Yvr96q?XM~|Tu2ZGMs~Jq#n(!}(doUtaHKmh46wHONI)JFiw~0uB zrPbsd>{6ODC6Gna)+jDc?`nT}ULBu~n$_5uWN+H$gwPhD0M}&@I3E1G+Am>Uls%57 z7IE~DkTuuszoKy=PCdX^d)n{{sZev*NT*T3u-m9sJ$=>6ROA-0HnKCh$Az^K!w~xL z93_4e;>XA*sG@K-PVcIjA?0#;vTPvh(OShN!?K3jI1_MlT$yRePxku)xu(SAUUUes z&oxBENF#dqP&BGKkWJI_KZKQQ@tljmn8)g^pA%G|1Vc^)987$?d|g>t6K&4g+ANY5 zn-lVrGAA7)(!TMp)6QfdHR=qHOcd?z@95fUvLZCj$twm&h z%AD$f8F%>pP$k43?zjp3uL7~@_Xj_A84lNY%7iiLYR}Uc*W>xA-V0Y6`dV0Yzxk!K zKW_>lXbEAT577V0luEXoY;2-)<;AKaoPq~pV_e@oqy+ss6Y5_0P?j-Sarv7z1RHeB zf9$0#+KgC#0j&3|{0Sg_EKtgBzCPNgn5UTJw;327>Y$&889}MgOh`DP&!S}q8K&rl zX$k6#&ZV{##_NCJUdiE_NlXwir828}G=i+qAN9w<&ZhLBTixR`Z>HXflvM2Azt*I>M(#qNV z?!97Pvs7)Ct|Evwr&>~Cb28>%ja;MG>GXNy>#=byy-0#6M3po-DMMLpTCXJ8s`xgv z$mDiWC@g_a)|$^%lmLT0JV#k-lX_`aiNAN-W>9C)^IVZsy860zfb)~5SsruTW&f_j z+45SNBE4?y(S66+>q-01Un=Z}O^~M0e}!IG^8D=PQ1pV@NnY;iGr2zikBzRtvopB$ z7t&6bd--%WQMd$o7e)r*NinpoA5;#~QlMbA^5|bUd|sZ^oquZU8jnHYa&1T^Osq*V z1*)Zh;<7^2SwmHD&lIbLm+I1?7GXs?)x!6_?ENcv_yYltk4d%~U+>qwvbp+FOD`1* z7an3yB+3$ioXuRtKMtWow2)%OKpW7i(s!jQ)`3^6Yd2nZPq){EeT$xPP10|&woxuQ z_QJYrD^kACrzLhZChn{`PiL8;mT=FD5^Ajj+kDK40zH!Z@#15;V2!U+d9?&fG$ z(5Hwn!&#$0oiKhUNhfdikGka*(I+=4(XB54DYz=6s!Crx>iJgF^e>_|l1~dv=c1SG zDse5FD_l%CKVysLBizuj?0_Lt`2%0^98;5+>uq-a+K8Qc@wlfF03s7MRVGp#N;Vj6 z?GMdxLyyqlIs-gKGV?!0iIe4VFxAC+q7IFfX*Q%t4SOG?Z?TU1iZ^Q-_4V68&5WtF z@j@hK5%H3{Im#BxXw-pna72sDk(L=5utY{l)(Ip{ec3VU~Wb0V~ z5DkE%>focME&J^K%nbH{PVY_WlS79k_~W35@E(vpb{=<>WP|E=G{$K3lLafpM#Y@$ z?2K%g3MLMPJ@V8wi<&n%oZNJ>awzy!!={YQS|@&4;QpN3Hk7>Icn^BV-&sMFrNTK7q`~KN z3M@wXZM0gfq`k@v=K=q_Y6NR>OQ%oD9*BgJQeB}mE#ZXtG^8BD&(E9|1>5ul`hsXzUL{SY}U;M0b?O7B;#7_A;FF|vcRab6YR;3O2*#-!x@d0QDa62`tBhOCJa>OUb zEjEA}%cOVz_r)r&)jz5rrHoU@sRR0d_yCEO5J{tM66$h?M}i#rL!*eZca_&ptCH^5 zsk_E@?J|KTsSDjvoz4ATI#ZMm+kZEMZ#VCjjn?vuH>EpnMT?02>*HSNoo&tC?d>It zwDjQ9qm|hL=1^2(&uN=71h!KCg^m=k*aFizv8jRqL?{8N#?*=8CcShQ=a-m|Gy{$t zu1a9MKS6vxFJEpc1>cIc*z@~49T%b9Y5{>KN5_xEQT;SD7f77dn%7~es+cPPKb9^* zQSG@Hn+-NQ^ARp45ili)gG%#tYA!`VO_N1WR+FkFe z-7N{EAdf;Eq{4i}qWy$t6@iips0AW9eHBHUHHr4Rw>P3XGj86RK6A3zWMoM|H5TqF zN9Fq=o9n%%4jFS|rtBbUH62GW{h*RJ%`#Q;f~uPII*=nEy1nVgr3OFALQvo|#TXY? zw6{PF+Y%-%fTcEbUdEn8oAOZ3y@rM{7yehSICxVn=^J15$TB%HeZn*f@z5KdN!HUL zBYOPLn0FQXueb60ax1sJZ?(b7J!hI2%@wcY^0QK_wCt?n9FuG3gB$zls>46nXd9%? z2w|imR?NRR`A90LCxFv?&w=cFF;hqhNY18m7a;b^&2Hzi$L~{29~^wI*pxu+C(6(ER@4p9qW91`8 z=h(1HE8K|dDd&(aO54=htXw#WF?xx~UK*&Vy9g29b`R)HyQQL}t)GMgce7Tv@y8yp z9{-?fsK-dzP$8fPF&HSgL2yI6|(i&s*0_1Qd<1Co${5SjuB-SdUpU};wbD9K#FMLhOqwp zyOPYC7L=dPTln1qm+|Q-|ClOuA!Tct8In@*uwPIijb6K7wV4Ys0|Z7TWvp9FHHYcBBVFI5!F6$ z{OoXlwug5Iq^N`X8D-ea%Q!aJtVp4UD{q=i5`t!*OV=uGh_~xt!HqO*^*#&_3GjyT z4l;GEg_rqjJE*`Gl4%4|+&`wbQ&}YBG%k{wzg?Wjf_d@6h>$-O5Swv)T2)Hqa&%2@ z8S>?Kzy1~gvOscp;)gZ;f|@&q5D;jOJwR(0s7>OwraB&pHW5{G-ufz12Wou-*EB5N zwXM3eTDj{JwDetB-E>-JfVKC9==fOvq>9%85Wvm5x(ggYPC5H~0=Z0dO z$Mna^0v4f&O*uMtAt1hQp-q1agG3=ar#j^Z9PN}H*U=Rm?FJx@B5syU;9enevL3RT z8Ei5V#opr7h7AvaU-e}6QG`v_pO##h$H9iWQ`Zd2{^qSxrBPzySZs=*GCnkmAW^&Z zAS$<70v?5A0r0@`3$2yeKhw@G(lYOsI(qc6IF?LmRB!MyCG)9oSY!@xp!?lnKHI7j zd;w%L=8F$JP5%Ti@{uF}ePYE&cApE2Vy7*$G7NwZWZl#h69;@HmA@Mea=&!?1N^kn z@Q%*TS^#IDh8xFQr0g}VekH6sg%&qOg}6qk`<<1g}2h^z(L?tajrp? zzYjU&!&sC8(rDZzO-DKUT@gz;ao=g| zf$@mRU|0`;0a+u>v$wK2M^5nEm6s>dr)*+)09NQ#^C6?PC%w+Z;JJ65a`|m0Ar-t+ zp*9Hh#M@RjiteH(K6I`RrPlI2XAb09@z$?xsRJoL#ntr;k z#M^l5UPPY(4heFE$!v=MtH{f;BjYa~v4sSxV^|6)o*_$N+$olD`#%V1@~TdX3>WiQ z2jdn8Gf1%-prSY@qnv^(EQhS-o}OJA#=sAeYJdilph1YdpC?SJxIWY}AMyhjxoV&3 zQ-Spd%n*-)3P+0XEoG2C0it(Ol0SenjW*Vy0%p8{lpPE-kxYNbp)FXhm?E zLVVjnBbX7NYOESELzN~663o#5Fr>+m&KZ$5lbxi=Kv64n=3M;F5mo#5e5s0_DQX+o~!I4XnobeOA+Zdynj6=`|ewwuAC2ZU8U$pm0xj z4?MJuaL|ouaoitiabc}C0)jf|K&8#j76a0vPMV`%ZglJxK>{f3<3-s$6<2a3@rrn< z%sAF7q`86TtK6(W*6{@o-{3hW1d_-E5_nd!HR~M4Un~$HmtK|9B-tUQC@0xQMLjJj z)S8ac-#nI8ubPMQKD<9uk{ThNg4e`jzIsrPDBF+>Ait*TBQq zj^2YH{cs{~(k z0SLEfJ>*1^O2x(XbC}b{PRG_XdFDUc4eHaWgwsvn(f9Xu`udboi{-MWD3luC0&JE^ zPA_`6=nN%oYCTg7l&u_M>3(w+O-Kv0$*VR#Sz}xj)Yt3IRv?Yb+)&`|WF`_n!9I&j z&)kPzc#@|l83){ZL%u+Lk9sGgxDBiXA+MG2f&cW6Lp~rmAclo?0~b)h;f9wWj=Z~& zp7H=%1L{1rOF!Wm5S~$50Sj?YG7?fnC<1w+3&KHhcLZ*C?EbZzOxLX2 zi>75Wj*^xA>&)^Iky0P9 zI~XO21Q$2|Ynj9dd@&C`JZr0^0(8*bjIJq5EA+?=p*oBZYVOnUQ@9-z?zpwdo0XK& zm`KY-3|FrEv}=RvmC~&-Tnk}OM7ddAN;+ZviXRfuA2 z>MXBp8lIg*UfIR$j0%>a0uTk*=Wl8Rngz&A)#1-IqEDmJB__ICJ^G&|cebUcjVq)# zRNS8kWQVCl-Nc-t(Rvqwm$eS;RMNnTwknpP1xUn|R4Q0HRc0Xti{nS;h=ElWIHVI8Jur=&>Z2uSqrrGt@B=gJVCKx2ogj$#pkT7yaipf0q`HwOR}!}u%5 z6%)CGgRptGiS((AejYN_+-j{(;NEn^k84X&WD=c)^y^;X{^5R$I(?aLaADbncL>K3 zNkkG1kD)+`I5??;GB`Z-zimgj@s$cAGQmoM@vYNn{q7;8IS`E=OiJ+GP{N(#*j=@g z1`_$=Ozy*d_jp{E1fwR?*=evbe{}P#d_E#O%!N)cT!tY=yXv zte~KO`|F;Q20mEaVOK0E>3brvweHl1l$U6ON&epSLIjXK8gsJwTrp72s3B?jqt-px zv0+D6bj9Nk!Wzq{`T^RkbHu+xjNUKbhbpezh=0JnbbizD6KBi*<9kAR<9CHAJrkw( zn&u*X_Y^cI)hse<_1thAjIo$E6}EQY4q&*XJ8K-vV-b#)TT(Bc=AW%XWLd?C5v^jk zZgdlHPPz?CfaMo&>uuzC(L79!btk&$t97gC9S3EW%+F&0aVZ?4=jfoP#s{G@Gb};89Ush+Mp+t(MMYBb8v|ch&`iT&+ZN0HbdNK5e zPP41((VL>6s|77_rwerEbZ#hmVBFdH`Q+qeeDA+h$XzI83y)YfYAkQoO;GRIZ7=R# zcpc9Js>5znl50&*e(+RlVoCMHbfnd)iv~0CHN_2QNUe!a(@dIV(USGOXOP^W(P*%A z88g$MmE_Cb+felCzTn0-gkY`1qHs4V)Tt|FB)wc@47udbVa9Z&J@)nMr5@`mr(nty zvrDx#c7_uYy4MKqk%@qJqpaJqF-``-7W5l85?DOq(+*^itgE#vYW|VLnzFE3x``AcSGB2%?dd${WO=%!-xp*gk4?n}xFh!&AB0nkUb zrOE=)2syo&WQM48#k1Q#=vsj~Or-9(s%>(e5ISK*N=O4Y#5>Iru_F+d9NMq4A)d6V z>{~MvxHf6X=e`9F_)#L9{VswC3j%%GVVw@gW2Typa`GMA=F9A|d2DF*k;m(%2{nLS z+l4?Yd%QUq9?+*LqogxLxNH%xMfLfEa&fghfN6< zDMTjNVmUDrto11+wyhNMthO`^Qmj@L{fS8Ch=)*K1~sSjolOZNfn#48*<3*&f!jR^ z+#y?vMHOlXqp*T8YWb@(0!pxehtm&MM(mR)gKw;~Wv7C-6O&j!I^)(|2C zrlOdOOXjCu%3nOs+T%2IO_M!#b%f;(S+gHDdK{8(baYBnEjYi}~#!Vs&SpM5I?Sse196Cw9N%~qqqD{)8h&myv3=`Mq!SGKHDK2OSZ z)rK0LzP;<^>y@podZ9FbKZ?#`>3I(T-C6RcVtqMh)yWuLi{RM~iG#eBgw8V+0`;cA{6Ba-D0 zaAVbV*R*TI*>p{vjiLsp^|;`Nj?22vTY_k0Gy2bb>ELs(SJG*gjAR3&Qdw0V{B#0V zQp?muN;2=hBO4Zjs3u%rT(apye}rvndy-K^BB*cuuA6$5U^`M&bfF{cFFJC=(L=2t zM7TKf+&BURiC_qF>lA6=j z2R#m(^Y=b38Vhk-4`S4HU;*KR`Pn&tfEH3qsI{N}eVNa_A$|E9$y>KYj=~QLj`(&< z;QZ+U$-YP`jxqi5t+c8UN!+bfcRk1T!=VsTfB+*KipFzzO-*MqKro|J;+Abu70rA- zota)ZHB;T*-P+l=EI^_QX}K!TI=;*4lsY}*#r6F1YQ0(m-&l1m*Kb7X50XY5$Ucg^ zCrU(TGd;<0E=h109X!9qDD{VcV?8YFr=KeQ^iNge2@fK-ynoBgBC?^jEnv0lS{9qz zUV*_# zFf{s*MvsmTu^Mqx_$TpSTik=VXwx9VtCspMu-SZuYw2{+yzySkV_Y5OIAr8tY3HV? zT<+|-lWg`Qhs{9i`E4@=e_YObOtYSSiadSA-7ivyP4Xu=u0J;e0}7Z($h|={)p5LX zLoax&&x*kMt~hKUGx#B*NV*^#SSDZ9(*mE$rKn>z4oYe=t}Wy$TYKeVu_*D5ZNYC7 zop2RMA5x*_am(ex3IOgoePzf|21zj3n{?bn`J;g5Nv- z)q5@{IJ`iY7OTJbi#snoU!sl#gck)8jK2o7V>}P0Z{h?t<&+Ev=rhYuX5F{E&@5pD!Lms0@s3QJJWV2a#-UNl}Ed=313NnS<_&`VwAA!9-o1>4i z>3|*>!RD+Kq{V%5{cyq^0^Ya*$=A0+NMYAhLJ`lGF|sc)%2p*tiF zlQH|*r}+zKt<8N~QXl{gP~wO`7q2K$&*3DoW?RlD?Nj`*MiTzr zEJTG1LD;SlK}ZJof@G`+zn_Fe5&7_l12FpPJ8 z`0jJhJp<_SePSg~tC~QgxL4?4x?YX9I*yW18Td34)`;bCRXIznY^#*ZVn{tM%G~k4y zF!kay&;0eja^s)wK!Chzz2L`-Xh`$U;R_1Zl$Nd7EeqLZ)p*q{pv~42>{o_&{QLJe$GBHBHNx`FOHi)Oe5&QCm_~rA$jl0}8zpL-$Y1gg7wp6n*v7#2PkD({&)wJF?4!H@!a&>A{$Mun6J*yc()`r#*8FEINK3~ z`qWhYxo4Lb=4z&?nr0y$t9-ne=(cIjN|dq32^ z`8@}=vjm&yLSR!8&;6M{k$CZ0w_e}=`~Pd>&F@&IPO}-BNt1NSEtlD>5dwiwC~LI)_&1C!M0FL0M!TqWN(ye|pePwI z97+a^f`(TJUTV#`DVlu>TN}>wdJfzngg}Qr$j~LEw|4~Qz4X!xKm!hp9mjusXR$?)H^GjKcCe7XP&A&_}Rpb z7S9Y37eNCZD!fALD#l1rokB<0M|AM$C>`7j4(j>(o~ZQ-gV_pO=?G!c;8%HbR8rbw z7W>h!Bznz5wU1o|xBv`T{!py&EMi(rBGUeTeqnJTnM_%}Eo0A1kQl?j#IUBCY@dcK znLqV8^2!UzbV8e*trPFY-P@@|qF$;lZ)~3Y13z#6*yp_8`#Sm7w-v{hV=6IifTJzS zY(7EwI_Br4|M)-lPA*!N+Cj1C@O(0r7S#Awsq_@jRsPbSyS}_uRTXwwl+){V0j!=2 zCX!=5if7X)G2XG3I{-hA%?}JecvwdZ|2}}+wxfta;~v&eGH5d6fxTs;+pymHj>|@O z140siZeg)h31()3{Y^<~n|FeY&j=3W2&2bN$$&b4{`|dr_XrC0K` zHw%fqY&tWQP4SF9wAmn(__Gkg0~7qY;2|0cP&6bF%u~%V=VoVMU&}CU!#s2DobA!Q zV)?G7n6JFVSvJ|(i+P?P3RNX$sha)^KXd1`Pu;WKDj_p7(|{&XmLW}<&ZK2Y${!RK zE?xX+i8ioNxhft_*Jp;G_ z??f8x?0@5I#$EDBBmiy>g5%i_J`@WDHt?Gy+`ICW+0UGD(L{P{(E6jO>yf9XrqCCn znnFj|Q#(65%~mrJMIZIB)UC%1;MY1lH+j(45K@M$QNC?Ar*jH?;UK3v^y?>sPjp2F zyejxvV7nxyDsOz|bGBmvFp8z>_kQp_)_)#Q2Z!Mn>%|vSVr5jGTGgq_$o0inFWn#D4_ zv;K>eWr-UN%8RTo1@F16PyLT<7B}o@G9=W}b#;WD^+!)7a=nB9=nGLzAqe}64&G#x zj@IgucC?Y9gS48VEgb~82i+%v^5D(FJs5+uIYU!0ZAE~?QLa2n&7qGuXyv|2rc%#5 z_w3Z{?7h3oQ@Pyg%I%GfwNz%xu}vaLY?225R16pd3cw@!kz~rT1fu_+$9e#YE-&si z^o_57-FDrEWdQ}*9Jssy)*Ifz6-70F=@%>6j1CD!fQ{!?Yjs)CJT`QibWpC8^tvp_ zf+D*dzqP#shSHy>LSS<=v03Ov;wS&W^OYKU{^qSSXV0jz>abY~Dep2!Uc2_u!t5N_ zQr4M+5tH%{9uu3CkU<;%W06w^8x~#V{lQd;Y6h-t$BXe2zL)LXqU=zjjg5(=9;%8pHV6Y$8pMa3fkmPxl zLJ`0O(N&MSyd<+}E*wvaE1o}%Jd3-sp6#ChO%Oo>M9S>_&nBA`;Q}n%zIEfKOTF_K zE{cS^yK;ADdrOg2Mbp^N8U|115dDj0!>ehMQa5$~JLOn{k+7s8Wi$A)qso#{|HhkY zG4IdaL_AG%c%QnyxZX1nMpqP=MdTuhj7Bc<{7uM06hRR7)t~{=f!^bT!f%M<&#$2r4psu(8?X-W~{ks@H)0Vn+-(@;B$SiNZ{9o zZ99;zV>2#6Y7q>k3qeh%S}p<5Si?;}+6h=<{Skd+La-Y0g@$2L|JMtEadUGsrp0)H zH4BAL#zodg0)EQa*FO4iW%(|nBY0Oh3D6aSrGyLenvn04W!ZBr2*ARw4CN#kHjVQ~ z4SXx|;XZfbU-2#ympnF-(rI0P0px3;}~=pk6W=(jN3ql;2lt<^+H zBsOaYbMwY6S&^o)Il_SCN`gW}p15qH1_&$$!A5w3nN(_Zbz^UD|J>O#>=zPi(L!0b zdp1~^Z^is6=ixs|1e>N15`-o_-!^g$y&=G91m5r8>G>01Fvt;qZYFB8>2!ftw&(6_ zZGYn%Uwi4LS5oN|^*h1)IZF1y3xcevk}SgU0kH5zg1rp35`Quc;H?%@0rP$+lnY|y zfK@8;L3esVl78^juX11h`n2t`Nep?m73w(g1oz3j^-Ns9F|Q*koP6QfYi=ET*TYsJ z3nyF%!v2bA3Wpo>AI2L@2}*~yyc@Vu2w27e@- z@H-?&*lW{>HZh`F|4xvFlPm;bBn2!S&I^W@M~7c8(SC8!w$-MZuN8R3Ko||;a`1w+ z*{EY&U>1Rk0So)Scj(b34u`1FRi>f)cSnITEc(bMm;iqT8B>Kimg|@VHYuVciQoxY z3XOGScTL+!B$EJ2;Lx4hw=(I}=`&|Cvf>Zh!Wwu&H1Y@E{{cL`kFQ^Q@r4(!JatuY zY=9o*0^uje-p#Mz-;1QS$!>S0JnE zlm-D$Du8P=twKHz|CdOn;_(<5P&m+=Z+;8*{?se4I39hlAMcw{$}FYmkEsgFp39jI z3$ya91q}_lCKBFEBwMF$J_1MBi+tfm@Q`dGvT$OBARL2wp^*+^YkF1a_1SlqUMC7x zo39dpU$bXDtZJGDF;aMm2Y_^aaSu;h5&eM-w22G?)FIH=Sz?-&=MSgin<{@!M}Krq ze<+risW(`^^@fozm**Ge{C_Nf6sq`RYDx+PO&AKKl5*_uhZwjn}U{_0;WKx4-t~ui3T*WQD9GCDxCwhjspwz<8>f3b2Hn zp6gO(CIxm$Y_bUWbz(b$$ODogcB#k;{B~iZyE)GK#)hgYrD6#{8c!zR`UN)lx8Ud| zFZjcQQ!uz98-v?#MB_K35#(A;_B@$z(kBxZGDPahSZnZ{j>8c~jCS@id{Kxv3J#4-u50}vu7UWkw&w8M&GaE)kG*02v1Ygj)BFM#gLAdM zacE>R(V@bsWWdK5g?w!#)k+m808n#X+wYCX9*I9eFJT^0;Mv$R9G5>Ry#3Y>Kl8cI zIf{)=MTl^u{N)Q-=QAX1fF%6@x#De zl2ACh9CR||2y6&EgCxO?|5K~0ztgac@Mdplqu z9aEE;kivl!0?}Tp&4uO^zD+2?t5#LjV8Jkq0Fyz=kUZSEB0Ay5QZwRnh+YS7aP{7u zGiT4skW^!%m_d>bZqsFLXdzR`+#=X7*3%qH|MkEAw~`?L!hiI$D|haE_`ye#Ec3G9 zcn(Xw`OPwANsKv=bF8v{_>=`CJvK$5Nl+Mq05FuW6OTeeE~Mr zYmFcKvCpTn*-Etn*YtxQzO%Zznw_4$aOnc?e_QPOT}R?Y_%d`;&*gISbF=kEqf*m7 z&q-x6!B+_fgoB#~1ajkSa5fIUM1Qs@*lOFV>&b9qtT_$G(x7Zu8DeN^^WkvadLRty z3kS7>orTeHNJcP-$ifL1f^f{D(ZZyZ_DSqT{|vv3@KxH;h^7sD;0|Hc_SKx`K8Tn0 zJrNz&GKQ${F{7U}&{x0utt(e{U;oUf4cpRU$)M12{Hc2VNGO}Z7J`b9l@n#la)13F z{zk1@k`**@J;b!<)$r*c!T zedaTjgM$}edP#=Vq9m?uY=8TkU$Y>h%K+@M;q>6hcHnXS1~h~G+{QMnjT?*mNL^4$_RlttJ#R#J4`aeE`QPSb! zAu*VoN~Ke&bUM8$i4CIxXD-)ksw{oxjnAl>Rx@-ql>``B$B`gk2v`0|+?S`8S>M{u z|N3tzj?1(DjBI`i)?tFh!P!Ol{ps5g*!D=H_`>MTKBK^IxM1m^I7AjstPq3)tI5J% zib%xp%H)t6%k5_tQ6@WDqHpSsFM5+%ek4DiC7pTmQCf+$0JjTiaFxy5Iny}G%%xxTr+x3^a; z6hyyLGMS2L8c?rVud(4|*a?U~tQl~Si^b!ym{vL{7^p;^LLd#e9)HbB<>t*KpkBD_0Wnn4qYD&I{+xaUw5JFzdXc z!ucGi3^_l68B8|Li~yb6-uQ85Ven25T9#0M=xWFcLXZ>Q`j&5h;ngdPl0R`( z!*NZ3nWRXmWGWF$#Nsi3{B5>3>n{kwQ(zIB=+E=#{ewWLD0^ZGf|xV8jl0YDmzRxt z!!b=EmvMs$2C3h(feRY8u&Hw`+j3mbFY|bjo0`hL@!8LQ@69(0e8inG67-Ry@TC2mjvcDOyeM*_Z%?72)WrBuKJEE$d)stMaus>D_x!DzLAW z3T*ssHWLN$rzP}MjXs#Fp^buEv$kGFs zr6>~dry!JN>A7c~&hHoJm*z9+gl?JX?3BXhPBIwET)!PA&$5Z4-)ctUy_xA*O;-2v zd(@#*$)qYN5bab|1%5REM`LOXf}F(n-G1jpFm$Z(3}j{r3y-qVOCg~r@Io$^^KAPk zzVHROu(kX5EnUx^ItdrGv%4!4^I$`B*(pQU*LHUd!xF(iifkk{zgZ}Y>cZ&&@_M~~ z@X?3W-~I~3SOt%@DTQPq&w5XKVlX5dYp>(+EWybhP*)1JKDQ{L(N63IiW21P3%`M^ z;V3D?ix)56xpRl0o^&AyhtzPUu$Mn;-5LdZ5o?YMhk+doTF}_GttbkRPnP8%l^FEF zhYGOJ>KkZ3X7^eh;uazvw%1eg7|6X~oHN#ufdwfUQ-UTZaZSrkW#;GS*^KXEkRk;- ziaFAr7~DilXbv%-+k}> z#l?m5=g-5%IG(e%whpHQY|D~N{B)!1_v>d@Mu_g(`&+y9fA+7*{(-uL?h%R=}>7EXc?gu^R5S=g64A(eX_ zZMbT*M^Loah4oqpf}+9uC>W%hJV+cuA(R9i5QAo=y{;|F>KNfiJHlMFTi}bee1Yqi zh-DMUZ@uYvCS0DS{%lOe zVgc$|wr!cZEGIeMJ=i}em&@sNnzHd_OcBzVjz7}{?~e@NH$sIM|H}PkqhZSb;j7NU zzUr}m>H^DnvbhSmARJ49yO19g7<(yaWzx-fIO(R4O?@?78__7%Fd_@NVMCp80hla& z;)OHRkECEC`{uu~wuOl0eG3Qrj8YiAylpvfhlEYeCk0(8WHw0<4L-?(UWskPbhSOS z){Lbi^30pM!f+zOD7X7%SgR?tuZ$@3zlMfYFd!^N~KI)Pn0FFdmd{x%8VxqLDY+ek1*aWx$o=Aj;urE*ejOfqp1ji7$`cqd**{RMy+FlQ^S>7qq zTb&iUmJGcba$Yim3WWkeJ-I>hMk_yZSU;y!Q4q~3SbH+DwawRzfJgKf%?9jQ`zXIjDr3k zYMwtfI0rR9{^%o*(#3@ns-^-gtKa&L=h!mPob~@;Jtg2fQ{du!kC>I&?1>`lzUWn6 zdbz4;TsIJQrAYIyqSvO@KcT++9^UF$G&MDaEPR56ARL3L)oL#ma)S_&8-$D8u>2!~ z;ILO^cpV3$uLTqg3Im(i+N`wM`ZQ3Jplyo&UK{ic*jCbdJ*{;D`3X_>xw5i+=KMLh z6PCjZT9pE3{4@faQqXqvMja3@s|ss36bx-G2&|zdn+FMEld$Ynt7VtEiFi_$fpeT; zu;6AUlK}))N@c+Z80Y_HfaAaduuRu$sZ=_fncCYwfagnt-W${_SF4t7!47IH#%!QJ zUj%cO9REpAM^Pr8yScua&+q?{Km2o&$TxIbk`;mD>)&`2{H#C;`)&xEkOJJR?B6#) zF~bsvY;p~-sD+nb(SeK6K*$XOo3;nu>mZ%qOL%1xdd7%_(Sf2^ypf)meknR&SwAD}7t;CPcHL(}WTmj|5Ous=-{GewA)PzmsL0A1C>q8&R?i8r) zX^@uJ*3jw0){@Sf>iVc1$F*%ok!2PzV&uEWxz zU?15$Otwq?{G30nJUd6BSkzP{E9F#KlEn1p_Ksn)xu4R>xDX6Y;1Bc7Mj&O+jEx(^ z21a9GqJCpe>UgwXuX90J^Rch zxQp+6`h+$$f~hE5B@MPEXhYGz(xRou|e2i6Y*QSFuNx5V!(OU5JeCS!`R#3b{#f_ecdo& zU+|Rv6oAA}JklV)=moPP`mAFe{8&DcwS58833OIv)wIlOAAXd{q|cl`3;%Fs*5#jN zFK>SM!5gn${h2p@Kd*4HxT46SUaP=uyz%NYFPrv1_#1zl4VEer|3q-zyySo7EZYkq zRw4kv;W8iu>qz2=oQR?*&0C_gu=Rrbwxb~t{xEv!2%Ze;5eh*#Hf?QfwXv{GLz}{I zJ4pMr6zz+>w(E(G!`8xpc>&>qz83H%0wMwif~GXVycS-|NHnl17{w;&gW+||^c2EE z(qS1xVA&=vG*4++7Mp0v^*B-GsPAYQp*Vl;Ts9UOn>DF(RtTEU1P(9w3?{x0R)Z8> zFkmTAFq_T7TMQgekWCDF<+uGX@5{f|P2t9obU04-|AK~_58oGDTfJ6KrDe9+V}qdi zv%K?cMkUrD#xL{x`GGlPfm1dC1t863<9hOf=MN1NoWqZ&`X1D8_Cox=iiTnO9qQQ_ z*eotAFvICjxWvh#q&FG>FUC&G@*~Oc!@{4Lkp0x4J}AXfx$3U0#uG_6bu2EHi&ewe zRREZpIz2nHu&{8jzYoSXzq>^xnKSCFS0T#|5`j(7OGN5$ENcj0XK_*9A6YzjI=%jA z$E&_991ecrTqHd}IMAI!Weku$c|s75Spf?px~^WUt%`03qwp`vWsp$db#;g2;cQ&s z^O_wEfrVVl)V{&13d~}FoM8Mm#}|MQtYOd@k&6%urTqe`&GNSU{n1`D;1Sn)gK!Ny z+dGML*6*D_*(~mmY6EDn2_)FSoGfDpNkJk7-5~pLFPBGa))GFX*=u^&efsG=NtzEnclv{YmQCwTXfxD=PTVOg0x! zCOw-?Yfn6HCYRdYTB|pV+*CFzWEwSH(d4P=S#Xp0Zr_Aw?>UOd#x3;+Huc-cz#YN= zWR~yrbBzv9HHjW=0I)9$BN8se1x5tnQQkG`cnU!{ezp0+Km)nMA-LGL8tF&hK^I61 zT{@Tf2h$t|tz)R4N^I`l>}VLoP62`73!CmRSPi##;j5%u;FLTJa!T7rmu@Y*d-v|u zXP&m%m}CUvl@Rab{K<+qe-Jh>e~`=znu#(q=LbMpa}?G9lMNU{c!;gSsz^z2OmJNe z>zmJp##V?8nL-*2I>7sECDeZ=%$5Q|r2}d&x$FR&wwF&`TNfNWML>wHd%0u+k^Yfi>?VRgR>+5+?0Z7hy z7F-=oB%6h+fs&xB|VHIeR%k{)~jth$ieQ3109H}ew5!j)00(q!w+tsP*Rq*3>*?bPvQQf4208oEFve?mmZpWm0Y$Z=eU zp%RvPAr6O#X_6wbo)(T%ubR0`65wmYgR{+8JXx&Nb={C9iRunGK;}UqMr&JeG*=cx zprgSeu@djkn*p1kmLmHjt@6G8HbRz1QQJYHH-3q-+;)+@{#lU@(IaUzggQP#5FVm{ zg-c6IttEX?)LJcy5$vTwtzqAC(m}P5LekqHc3lnnBSI=s^rf?rS*&0yEC67db0U&{ z=5Nqd@~~h0#IXA106f5&%sET(-M4NwW=~!q4unEQk6OO_V?NHGy~6Kd!2+SoU9stR zSu~ZhyAc!!L_$>Z-SfZ0ZTt-wv{Rf^cHWpCL)`+m8YZfjq3cJMZ}IWIVskC-2&Y zQe}Q=9$@COmMpBHj37$9>%_DS3wlCWRS+!OBy8w3*7%cM1O23ZDd)PM3}6G*I0|_} z$AWONE%*&f;dGEZOr%nfL}VdWH)zbtrhnSm-GlQK_X|+n@v4xVoXTV>`Nn#+%9;WF z!Jl&8yJp;6hb*U(iaBL)mkt|Al@kf?!X*U1GOoP*)YG4RePcKO&F_80+B$ub_#}N< zNJfY*cHQyFK-l#k8X53*kcCf%aEP_TRWSNmTkx%IwO4uPXUL|mpV2pkEHuyCtIj~n zT{pFE4Z@_s$ZgHByg4?QiyH(pxlj*5LSKblD+k96nr3o-(k?rd`K{mlNB8dCpH|t- zi%?=ZoJ~@s=|T(u01yC4L_t*G0Sl#q<5ESHB~kEL?+LmE`;m5o}H*!f6WYrvcOilFiS}D3Z{qRlob) zZ`TbALZARD2)BX@OlUDSjt{$9>d%kC7zX=0jdJl|zoFMm!wfpjm-2-|KJPkk1$Lv+ zD0)l;IC|dh*9DvD}}%MD}U~9|F?f5mB~P`k@pNqV(nBM zhZEP522r9b+1p5p~-+W_9w!s5nzAGx(Us2( zXl9`QRY}n?;+6F{2)mR*ku4-DPT(td;B8^6E z_5QM{8*_8Byx+M(W`nzMth1%D_w1D!k?Mcojg6IU*K!k6*<384`H$w4VcytyH6ojI z*S0M-XbkZZ{zIzQ8n$JZ%Xy>Ga2?OG*rbMVN$?*SS2#iX^deVp*xNg@N9U)r65$q} zy?F6&{O8K6FKEfQUau$88Aa3JxzvkA;xeAOE16j{LP!U zOw%Eu2;@SE*jI-a6b(PoSYo7T3LkeN2#-!p77m0!(i?ANSpJbv3bq}&*8=J72%ERu zi+QcUBON$wJ6*uPfQX==yG8Q|QLG_pnSiNT0ZL>^SUPd)H-7!s{_LOqrBpiOQFzxo z9_Lo7HA&L$uWjq~26#Wi@^u*2sn(sk>Dqez z+yZ}UA@=V3cV^~i6@iT%3g?Pxs%smj4jD&@2%Ka4vpHGb*3Q<-y_H(Iuzd6FKlL*Q z7ca+nx1?&@l1zE8GCiF-sGX|U8*hK_yEAk1i9|eTo65W)8`;K{Md{Rhg7X{^$P5_d z_*6Qb&SZ-R2jHmL)JuNUZ2Nlt zhd=m^VL6Hl$viCxPx>7esmQshm@=DIcQ@7{Z>c5XaaC~@$tAAYsKruAqgv0-EEtAP zJ-Z6czr9A@C#P=tn`v*PDWb0+I}f!`2sQ+t$_+a6_>eyv3PoUJ)KerlFfdPCN|h8@s{?P~|2*CmiC%Kvd^ZF6Kwv8C!Y>Mb9}Do4 zz)?QMc|0-7r7D{lm=~2;JP}WLuFX0jx^*=M;anlNIGakOced7fv0z&kgibBb%J1%9 zzIxGh;WAmyRq#X?_HdnQsRZsYDe{^S6V$lt(dCsD*B@vc&TSh`v(*gk)@7v^EkayW zSFW^Sm4uRy_U_a%&~n%F_9{d@kwOqY0=2O)(1`AEj1=U0xK%QUHSD`g9_C*N{5nej zhlxZY2$q5!tW+vNrwhy1j~;X|vjp2E2#peW^S}0~m;V0W|9hgu6W4;w9Cf{NHP1%+ zCf4lSNj4v@Yf?_IZ8Kl2SkSlPnfUS*3Or>qI#Hrm z;bL4!PS(sgT(lBPG}wrvtn;DY$$DC7MHTq(*oz^_x43WbeiFf3E$MOpGEyNAOuQbU4}4OJ>A zLZi}9m1HuNQqtZ@^Ch-n7Bd?(7zR?`vKOHTT7ySp`;%(+SCg< zZAUu-3Wiui5`pf>!pBqy!bd5<;fWI`NMt+M7jl6Hf@S9>(gME_BRF1bNQT8>z(Rr_zvBT*NwUfRL{Z~pDv+Q4=~uV5w(s1#cVg)z&l6LxSB;e=SqSckb<^j( zhL?rNtLymV(U^K+f8+A$c|I*ef-pNX!@6WBnk0$kQjvNd@RswyQ$o6vVPDmfmcvFC z^$3?tB~L6Z}12$wsv-Nxv4}l#b%@OXCkcYCU7#IOaQkQ z7ZwyvURqo#mP%k2WkJ#_`I$_O4JInd9>=C>dVA+nr79b{RMoUor%o-VRY)hYQAWXF zay-BqvX7-g5lk@LP=GPCA!5b@Gg?$dEFvl}dMR-AW{r zEX=ED@l-}lrQyl!Ztt?mn<)HBup!@ikS{tekpZYSd#1gfyA$3=>ca*^#|n-vIO zZQVB*cMY&-Gb6{cgWwJ=(_}O4Nx~ob!$0?*{qld2ot}4?1yuYU4Zpbxuf^cUhs&mt zXLil3luD|W=4Bv5noULzkx!!mhDwqps3by|)P_)Myv)Z$*R9(HUS=bOve8B%OiHM3 zTI;$kuv6Qn%^ISxy#Q&{75tnaxJXFX#WdA+X}zIaU>JEe%Gs5R=isu}Z{FN_$NT<4 z{e>^YWyoFHbnRW)m`xlk}nn0)3b|`8WUB;s2c~nn;yre zECd(3w|B6$y`Rm@)(wM=UHb4`5M93-E<&!iRb3+%ty?>Hq=y+P4L?_}OX{U7SFYT= zd6S?XDYRQ!)6L;zqlxyCW*BUf!Dr6{W;}f!GL$S zVSugqnV^7|%v=@gTeAQm@(ohzd$#hLkI8Izm>BS7Qof|A26w!{Vj>P}nwHBRDX~ z`ayWsBf${a@Snt-r{@oI%`%v5F5j)qb*EICuM}(7(_g)A%Yr$TVC^=&Ig*=QV5BFU zDsjoAV(3=2VBL-Y01yC4L_t)oRsn-nt+J7`XL3_;Y}Q;>x8SbJrAnP`buXSjFUlgE zW_M!)a2`_?+tw?E5*SU^-ZqhX`SU*o_ZZJ)ArZL0xmja(hrJl7lwK=gdjXF3Rp;cG)oERR-my^ zFvJl?gd*wY5lIg&k{%W*|Xu>70na)Ja91Q#hvf*MOHT8bT*O|HbcsWY-VwjxOhRW-m8v3`V%r*J{k zpLDR%ppZE;8)m6mE?4V>I)Ws@(Kzslg6n}5BOW9cMP7t`ML~u`vKirdHu(`}J8Z~M z|0dW7r4G$xrVh4u9eAj^C986r3VOvhYDLCaHhG0CiDE7td-0{GzV(f7SIX>^M#Gqy z$zHsCQ3c9L%6Gr>ol?Gd;N)$`QZ;e$#C$xKfJ<7Kp8-OHH??RVdK`q^gzev+Di z0IV!Y4b#}(++=xF!W9dpjm@3=s~a3Ao;-O57-&1L*A;^u>go$g4_@|lRJ0=j*|up! zQ%HK#v2&I5pfc%qBWMaAJ0S>G}nE;Lw5dPhgO&@d_K!9~*BCX(I` zBj8`~sWU-J%z)S^VC*ma`M+k^MvO~XcF8fzHf!-h6(z+#z>jTKIZ+}WSFaW_(+lwG z2fFzP2PufD1TO{u6N?71%8BER;$tj*XiNfD|}32QTYpLHQ{S!nT|u$_>*o3GW8C8=jmGZ~euT{&Xcx+LYrPn_FDx?L$fP%}tzk0t| zEGn#_Dow^yrAm=CCQ{YsUVM?TiK7GwQjLr@SzIgTO z)y&i!Wg@}&q7lts_|{IqgzVV58gh`%zalcMDI~p#NTS6>L->t)EQF0^j+dHkXSj!( zAw*g2{Oq-9(7n2D9dsf3a_wF9TU1fErWwfrht8oprBP}~MY>_=?k;JD5P=~?5kZjd zl6Gi8KY|Z?a%g-F{AOi-Ww3 zjU`4;^_J!rJ*DoH63c!(t0elKy;oUr(Zk@t$(W$xeQ$RmEyIk}h;%vItm!FNPl2#l z+T!v;c4k(Ztw^R?wp1{Y=A)U7*5RE&FXva|1Y8J4fN@@Xt^`Qcwr5&WT^mX@pN*bBIxiB*l&E%RW;h}V13=*&^cX`=Ib zNcWc|r0%pRq4Zzay_A)p5hp|ziT84&=R*{0=w4cRi^oY*ig%QMvek}lMteH)$G0b3 zz?$!!wa!D!UKkQh+INQ~Azj{9)C}jjp!_v5akmfW#|HMs0gMBa_>o(>4hugO=CEYO z&tJ^zd=gCP#cQ6^cN(1TEy6qhUz8&;#)?w?)%JR?s#yvcAyLa0_=1yY94m0;U zKk*zU4^j+@r{R)S3kv3uOsas!Ti~^2fPI2BN&pTj>%EE)dEl=lSopeH4iD7q!OTrpv?H+%nEv@4+7qXmbHMF-YShzC?MdHadyiG^Vh&u=D z9BY2II_rz8ronzbY<6DlJ6{InV^}H-{Y4eylRYI73J2@h7Tc-I(#d#z$B~KZ{j~gv zZrs;H&!VM7#+*@H3N5FzFJP6^c?C~UgMJHJ_hVKj`a6)3LPvc*H@DT=!RxJ-Pj4de z2Ksc0Ck*)d*Sz?$B*VPeNUWjbK6t+>Nhhp40vnv>zVIq0L=>97H$lV4F9ILOdswev zOxckB{^YS1{z5hJBy}%fc<>lSZ8+1~UXQvMJELh^xSG346RyXP4;a^YG|tFL$r129 z-|#b>8iPfP&l;pW>;E>F^CKmo2&MT;HP zxUyC4v^%xl5wfnmdI(=-=}%kl>uQyvu98B?ML&6n6U9!%`8k=QYYVY4os&f#d6GmP z8SZM;*0@8dq7h?FL|-1Q*LV~Iu&KWG+w=2|pRx7vkEvvZ5pGc-Z@mQwnb?)Xc8 z<8}45dYvRRDq8;-(xcCFR-Ca}TD}}|0@tK8YH{xO|E5ASWMZ2tKeMW}5!MDXI9ABS z$dHiMBt_*iE94!nqs4u8e;g=E>u^+KswAmGeBF?!gb6Rqu*8V4_nshF_>poQGcJ^n z-gZdIk|F?6586ibUY%4+hwzaYtf=Fuwg(91m2r7el}M1w6e2YNr0i{7rG#&kUV-pw zD7dF!tU!h>MiF%0RP+iqd&6&`S>JC%0B5XCzL}q{PV*JJ79WUJt*?Icnr)h0EtuIuNNAxog84V%W-v>8(uCB}*%-ANXF ztnsooCU5fCMM3LNsY|P7N!{>kT4#YB|ISC_5YKD`BJS=!xUr-PdSn1d&cC7uH|$?aWH<*_0S^3}q#bZ>D z^y*;#IDwKb#1!z36JYVYD4ys#t_5N_97@Y-p95jTpX$YGgk%~h>cP+&@O3v*O$b#kbiQcnovC-G^($PZrW%qP`OW?I5HF3Y@ES2r3%ir$eXOeD0&mN*f;;U?feT0@pA_GIVca z3d+hnd0b0D($0(4HM{Rt8_h;YYzeiqxQG0?r-Ud+fy4y!j!K_tUt5a)wE~1{HHaxjYLy+8M0Efe~$16txbv305R+iN| z;eP-qda%MBiSpg>nPjhU0>TQVKSZIXsh5h-WttM;F(Tjn^Sf)wj_GN>(<6MV0=sWd z%7EK~n7d7;)Xs>p<&JH>mVHm7;NX1A3n$Ca0}Foh85*8a91*i*Dj8xcWW@w_LQZQ1 zv}An&=23PQbalT|$D%S|L(8XkBqc>tbA`i107#e-6N*8i~__!%4E z`gqU?LTAybx}*;eN*I$yZ1 zRMrLW(C|+_G^H-Ph!j%8Hd69!tnLUA2&-beV=BQz?Il~n2W>Aa$43>mdAfKp?=2r* zafBmT(QQ-4lC7hH>NnUuDhU^b?#4{?4|o;W-0l5?{rwGe$ZDcAe}4I)z1lgo%hjt< zs#iT#-r93>a>n(#S4$Lhx%un@FF?QFvkT431+TAw2koyS2PXyhR1j~PDwd8q`b|V+ ztJ|Wv5g+8_>ecGf-Hn+0;@sj0#dEz&qoXyM^T#q*h))Gi=`F=ox=#?8nccNp4jw9f z5cIySEo&&?$uD9LN33enT4hRu(jrYTXsZ~^yAUeH)0QfBOz0bJTj502?$I9yM%<3 zi58c3!ztf1+e?tAOY%FzcY!MCbsU_9a>6gB@xIk|;utqJgw+^u>UEmqrG9+l?BN>Y z*er_m9BSvJu0W1tZY$)nJprBIrQ=0beE$@9hEU3{YpNf>Oo9q>fX;%*_y&nr@fy4Y zQ-;wlpuOeaNdGv6TrE8n|9d~YgnHX>hk8}0&Ht9mBhmaiq{H3MZ6P;4@oNCq>R%v2`FA3%w>vJUx?FO%KJXm`0Gf0ZB(#dLc-$4b z9fSVKBulC`fTyZ7J_^<6-)_dE-+;i@(rFYsFyJbD;YLL2o@Be*NTo4c(oct1Ndc?0&%Bxs|ucXeja*B3GY`T^%BGIX@kKgxJREp>M_c2q^t5OQ{%a%_M zbH!Drugi}C%NGtQDlTTkfAn{Jr2T%!dql?jPiX=L9~>+JL=4@w8o%E}7%jjJ-?#ZV zy~MfYG-k> z|Lo>h{ZUWnO@Wca!x7u|&zLHny^1RbBb6lD*pP;f4h_wI6W~13c71vAEgo_Di;^XCVl7NP9zR>5rCr`{8T}iR|YZ8n&bZ z>79}t#qWwzm#@0oJhf^9B=}ke`VLwW?5zi|cI&nRkzBtP7I2y0zi_e;H=EAHOpRA7 z)NKt5n;K12tMuEQMiEypHV3XP?Oaa}2vcZ$6vsRtt26WvaiG4AXMIx?H_&}Fx>akt zI?B5G#|#L}-UAw?Pcn#HN&0vTpGD|Ien;V1BB3;Sg4{j99$hrY(A%Avj?FI1b+)cHcv7R zwl=o5*0iz2FFot+zg9G?WwAv z*TrEw+~zmaFGRhR^v*GOQOo@=|$-Pq_Arb>a zcO|OdO)gP?UOmX%CK>TM3aJj3@sNx>@jAh;FCN}IaFHh$ew(dk>jew<$z%FnmY2nS zaWL(y2P&+pbginWaC14}dVM|I#(+BNPUun*6ZMXSSNG38_d&)8qYP&$Ub9daGC6(a zVX+p9td!RY_<>-2wRcuxID6((iO?GCv6KMIDPZ+$&H5-g<>$@N5UOM1#9s`aW#8Wa zdf^x1%luZ|5vh_sYseq?y>Wl9CgLd>c3rd*YEWmP?hRhnImc=M(XJ-(A?$Y-(d%Wr z$tTnk!on-p&42WXaHXO?NcJ>rs@4{KEr z(3`5@ni^BSCg0ZNq`n?+AfZdn!iVD=!$w>j+J)0W*~v&9Gj+s%%$reOv5-@?qTDrZv60FW zDE$;88A8yK7sjf-`_imw8$TG-{2CmGI5w_4?;E-ONIEgQB5wRDIN00OcMR*wsZ z8uJhL_H2czB7V9-Wyy&vpjhm8bE()160H)&tLpwXin@Re-&JDH7 z^Bsx~EOL^q#)bx+>KWRRVTSbcb7DXLm5w_K^IJ%NLL)ZOXjBhwer4(ye9je!oWt=^ z&s1?Cs!wQBHJOxHSg8c|{VBy^V0wEf=#y;XcX^?7>^Gr&Lb+13_z&|~NxbyQ8X6k? zRv&EV(0FTnaBl)*Nf}ve2@3OZ0(G0&Hp*7%AcQF3jHm}kYZT2Js`M#$#lc(_ zCY>AVrJ0!f{}Acv4cXOm(U`_m?_TfRowZ$vrN&?CvJv`>S=B0`fSc|*A&>xPRr@|G zTTgeYfpNH0;U#htT39@}s~6#$S6t;v6GOCzY4f@cFLz;S34I!aM`9$Z0;(Y{s#pE} zt96614y#A-OO&xNA)R)3Q^#3ImGMYl@puf~OuUgB3%@xBM9rh{Vn$S~$PO5LI_xI2=g&T$J3<|Sre8iAf z;F#gpG9i^3>>M?yQ*dr zLR;a%iltPx&T;cgp0Y4SEp(v^gPDwXht)1F*)qW!zpmT^-iCStrlEmwuwR4z7jUvq)RebKFMG+aqB zh!AyXJT0Ru-xuEGcX9dQ0)q!yKu~2EFoUju6i2qSNBYD--w2=AAqM@VN3>d8J?{-U z$S=-;b#8oid9(%;Z)%s4>geWD*RU6T2m=dGKdAEkVw22#znXnjcOEYTA9XgIxsGl9bPBV!aP(s^XLe=|PFhn#gL=IE`=lbr=;j5Qg_Dz$q@OW;8ITt3 zs&)U1hWFGOMR!J-9A^t3B7J?#vd%Eq<90_}4>$jUHiKa*%%meYLt8)xvLVejefNU8 zmhPqde)9)W19uKtT_ek%9xqTU68^4->jT2|^(SDGeHOJ%-qY4Q@`-XgIi4b-m1xm zy1Tm*cj}i<+v>Gl{Y})BtYo!H+Lx!D${SufClYV^wfB)>%w~~!XR3@zSVwuT#tk-M z6>9&AtljWfVgHH%F zj({$>0Zk+mX#~ROsKny(ucM9gtZzgNb#I;oq)Op4Tj1pgnOuMig7G5{0DVdiulb^` z6*t@T3UU@w*+d>`NP*7~i;Ig3{>bxoC^4pRV7{Nhe8jFUl0#EI!X9}9r1MvA?bTqG-+I5U1q4>PtRXJ6L}R=gmtz9cxu}lb6&6vO?@u<7AWfQApj{; zLXKBjS_x#YLN)p7wJEIT4ZQ^t8&@g|Q zlixlEDd+Np%omn+^Eo+1s1Uu)Z~kUmSdXZdC-8BhRJ=;_esf=9OX*IF zViwA0@;(f$hLwZ5t+}yQqsykKi8ev`+@E#!8s?3jjbe|E$%jR-sJ>uHTiMSztZqN+ z@m~sj$gf195OW_nO1-@&T>50yU=guTmJZGve{4|v7^Kc}8L;W;Z(hMb&q!K}uOra? zgEdzBRMsL-^9RKs_fWaN{OV&=TIJ_Qh#DhU zZt0o1*2SMhio8kc8UC{&7>xc#i98SjR34ZB@@3p}CIW=77;TgU5o?1KN?PJ1Q3x0l zx;+nhg660LB}2$7VX^G`v+LXLR9710DJBI-a7?YVwW;l~Mgfaa2DG) zJfsw4u<&?e-WX+>&fQ?#kinmRu-GQnA@I=Far2g|pN%B?M54-`)rv++iv49>UZ-ja zNkNJcWeUgGr|~#O7L@0#Z_DnP3|9>ykjhv~773n0RYN7B(^p3=$7|85xoMd6*XT_Z zgi!NR@y0;(rb7 z$pTa*G+wE*2tZ%KI;WbJ=w;p}`fS^Bu{v%`m-=A_-!7&p?03FqssrKB|ppyy-ZE6$FN z)}WEv&b``g-rSc^^Poc%amVqL`%<%Se~n9XtT>j11k;hcUl5>*mDDvbRCH9w7qn79 zK$YcmP36~em8~>r-ZV0X8a7W8%`ypzF@>L+h^qm{1t2gb4347$+u*M8D(Vjj))a|g z>*(hnva&E~KNOYjN~XV4n|k}U;bikAJE`hBbpuL*x}Wo-on9@5E|bnvcv!H69MOjR z-T(Rm){K(ODyL@&NP};7X-wX>YPoL#%@Vu1$V5*G*pF`aetdMKY#j^7jNo)Z;ZP5D zw=+7T=CqDvgJ&Xl$4j`pi@mgB=cN~TZM zu&d?OC&x{59TqUQBYGm14ztf3-SJZMWL1JRYxbSm;J1dkWS>`)h{I}wgM+brc@T^+-!Tr$ zaV-d|IprS^lo~`6LJ?_nXm4*nk}c(be;YV+c7A>ig&UVncS1J2S^{2JuleIg^28IG zh3&>3KFlv);g)5@v1=!-+0^TJfQRZLJr`FD;&x{%o~;%Yd1qMexx2UJcpvN;jgOd( zfiw&9{E#u%IY;Vd2C-<+_&xjuzM`2wV?-&nPPx|qIb})?Ub_+YJAfCS^jT~hE`^7f z|CMe3_U)TmVO>j0gIAcVw{x(YpC8*hk~xdT`K;x@-GA&cZGVOB0^dzSI^SN;bPz>M zUtL{!RkGFRsebdO;5%U0W3~FLfjUjyZ84)sQZiyC?x z2XCgD>DK^sg5{38Z2nEJ`kzpREU9k3DJQa=`rTHrGa1$af&w0Jf3*n@J9`VX?>X2t zf9SiOmpp1nBZro2t&9aRD`@6gr2kdD(6Wwh zBNe9LwmeITs!`|S>-Mh>GJJlOxg3K7Y3vam7KC9((`{j=$@h6)E!PVV_uQIGZ*jq< zW=2Nn3-**7<<%iO8uz6#o~zwgrf$@OrMq2lmzT?Kom)WbmPp4Ey1j(xBlXoGA6am! zrul3TmFv67T_y#-XX~Oj`UhuVNx<*aNd1t7eTKFBBU6}#8v90wzd*iM(t~_KY zc1iFOi|Kko2MG_3FbC4Kn?vtf9gQ`f`UW~X+j~2oJeRp+9eQ#>Oq7efzco_37=;H#lSYnj(_GBH5X((MKhy?C6GI`<_TSBDzaw#cI;fLMgw#6G9CfOk zi&c8}ktE3lU6t|au45?9y}Of>lUpc}X3*w&b~|y+jMJqM)r33#{F*&_e7LI+k-18Y z5W)tlm@>rNC%WHg3#6sM)k_^i(fB$+sq2V4{+_h>F7!~jlopOvM@ap!t1sx^6)EsIy>Ks9 zl4c|H4S@Q#9?0LI{wkdB1Y-#`GrK&c+uulYz>=Evo68O!W4=HDORjn-weL$|_DN~x z7*347zXG^*z#=bw{W^&+_$u*gW z={ajWdy&1=5Sp$*8bOF6zvfF@s=nFU`IW7d%LsrH7vP?&aA2$U6Z$Q=RHq)%>;=!v z!cQ;p<>DkEXLT{^Pg4UNVPha9J}0fiMDC{${9xWwvxC>s!|K@=Q6=mUPpV zNq>UtZUtwvP!lm%jT7MkWu|RvLDE%78sZF+=zepM{A3=!p&<{sRIt$- zjBjJ;s=?lTRwDCRuTWg4WiN0op@fRo)!5@vN(C1*9re;M)Q-O`=C+@p512NFV*ER7 z?;5N1Sz=tdYg5d=A_G3aD&+#SSh)iv%o+AL#ZMWmS$OweOtWElkR*9JfzYg}k@qy@ zCe7{ewDALUr@>&84q<9jO~Z~EiG&qdESy~!(_4uc%1Zr<0>(*dlZA+QQaX&DTAI_z z$-X5@=-c|Vy1COZ?;PQ?X7%04#L~xiv5A8HnvdYG#1_VWqAID{Ao9kEj~T>(|FrHL z#4!nEJF0ZRSE1@JZrrGS-pM6SgbXR*-Bg{EURZ#SJjOspNEq6y(~;HY0Lmds z3LrR}1U~ydxkJ=*w;W(HaXODs5)Oc8wC- z-}nK^0h02QwVLHp>r7elLUlTC4ELLjI=7TO_L2l_xc3wLIAD8i0<@q3#&+bJJ; zwIZE4_TTZ+QqJ);y_Z2>EAlCb@){{l8jmeAHe~aG1SF@`fWijfnGlS=fFmrAs12!C&y9pz)z;r{+3|Am! zXm)ZHKea-R-)4~qUaGkh#EEoIDCWt46W0~%|EyRb6~BI)*UR#84j*cdXa zAR`}h{u_E?b=4zxN|4^;6cIOsQd4=tbgpNhr1TfDJ}Rq%a~hY8n3di5-ywUs7_DG^ zv?EhUJT0zRNNS$PtiO%{BA}OqQ>712UPv605~&dbaF*R%ws#c>qvF+jLIs%i`)qOh ze`8B2D&*%E(CmB{2Zl{fAuU)*=~FDd9k^A&2#r3hkw z%fblq=%_x4u&8vgKL=Du@AmI+30>V#PtUzSQG5ioF91{vOgX_IpL7CJM%FP|6{Vzf zVBE*Nz_?yyU_nXiKB7j?6n6*mb2CCtTC=hIe49=*PAUm)wICA(7v}5rM{;o=e9na8 zVsXD~Ii-fCj3}H%t}$7qqd7u2h;Zd2mB42;;AoCXcItO>w1pd^_#yZM(10#aMdbla zbZsvXBS2a_Bod5pGB99D!YIq{hr{j_Pb1faB2lLf)&(q)biE#1X#hcZQ#!J}wYkox z;+rJFUCceJ9D?Htbun0pEB}a)Kb!G@NfX=?8mQpdL$}r2$KokT*%DRcyjZ5ei7U~7 zl9DGZ0vdg!^u)W;3qJJOV&!`aN~^2HB&H-;5vme1eJ1(H0cgb%s0bd3a_Mvv^34i1 z@d$Q|^C;!^Y$deIa0?4K666!hpmE}`h6pYsiQ&H>rWS`vAEEp>VIn1d_KSb-d*bDa zOM-65iF7UFrjXt3SvcC&7TX?z+N5eyq)vDw5kNm&D4s7z>#Hj-?<HMd`5wZ{SO#o6Jl_Jm+yEP` zQRsMt@<&FOiCjMbo{Wejq6BcrYLzInh5wdibLTmtVPy)Uoli>bl2bv3m1zEZw)PoF z0e|u?nMXv0-t2j%{@8c3y@7BXlB?JqKveL2X{VxpZ}A-=wWF+iS94wMKZk>_VqXJW z4eyMSW99cMLLoK@k(AWa&g*a;S<`@Z6-zA-Tq1XBA-SGkS4W{QEKen&)O67xnaMc7 zrqk-8dc-BY*ma2!Y~aywY3)ZcT`wRI*V|*n__c&zq&nqkk44Lh{K!3RNek z$_=FO`^TM`tp30uu#LPVI4}dS1JvP335f3!lY;-YjC`KvW8RcpO%4d2NY}raI3P}+ z0gEY5lVcM0Z>{n)OXA7@`$K?!;0-q8e*+=p)xQ8d20nan04Dr5z}Wu}@PC5`6QLsG zXlQ7}sxUd-|L%#0FyNbq2SPFgP(FZ$^Y0NR+8P$Npb=<}2KWX|Rq-XPO5P&!e*nYM Bol5`! literal 46096 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

%IA!lucU@g>2$n zwK8}@9O9aZvIH?kY-XycK8^$fd=Zp{##NOovLMQSLI>AqHBGl%ZEo#X8;w0~+qs;t zh`wPk2v2jtRMiGhSQe*WfARW%@M|~!m%r0kU(4n)wu`envA}>fw1feV^5662@@L+b zu3QF_2&PakRniI7;l3+rjbHu!d%yU*i&Ht5i98r&jRo@zvLI-RgUvulKok`j{*|y} zVKC5mFxnb^G1Nv)|M5>C#VA0+^7Q<@Y@YSPUiV!+h}bZSxo^a$Pb?%wh;oFTf=uDU z!a}&r`!|!}<7ofFN6H8eRG2SpS-`O2OqeEYy>APRVaT+Di2V4qk>N204IfHy)vn`U zNYk=xpJ}=#i)fx~57TfQ=cbp`z%LpSbFN%WUb!IMyeE9~du(S1Vx_8!BewXMa$`-# z)DsKbGQE1ua~wE`lu9akf=K`#+40IHI9ft+8N81SVO8I9B-e3qFc?pooz*-qKf7py zNi6MG7iRe_S%fW$44<4UiS@!%{pFXI7Z>Wbsae*3DpmQ#-<@jI#eeek?AluO^4Zd_ z{{9jUlg4o%aO}M(1RXUz7EZ@2pchnv$uT@3@UFoxC5CZe-w!6xV0B9rutTcA?HXha zAEyRe_j$aTzfj!?$OC2>g+Z-pC|^kGCjwy)4fUYs<8Ck0U9J6<#Sm{B5G0I?!fUuG z9D|KL{)yd693JGM#$&hr;bSG}xQ+(D7ZgP@P2=Ip>VJR+B+1FoHc1wHz_-kG|^^3p$-`)G-FLK9r znctY3vwrRin+pr8o14C6L10r(NS_=CS)kfxD@j{Oe`ez z6op26sMV*CjUy<^h75TKJd`r{Rslqfc4x^yh*hEBk2o^1vjL?y!=9!bu+pkNKtXFET zY4bN;P5oQ{>gC`6%W5IpV61uJoCQK=Y+E*z?O6nFl!U5vLM@RYaUT|2?H}H+x z&oG>=u$_(&CJld;w?-x9k28qENDsTA+^X<2>|;-b17(Lpv4VF>BoeZq?Cus9mKHMU ztc?yX82?O?aeCh1mO(w7VnS8SU-*LX=Bt@(IypDjWc8jkDPUMiDWn4i~@dOnjYOy$5}`QgulU{`EKgB|TS8b!t-xd?@(s#GMY z?%MP7GxPKFmT5VreeT=^hx@yw$~{dn-+EoJ9Jaliha^2fEZx`3sFTeDvHm&^R zy>~Y@cLYT?T~|vNwtxPMjn8~a`rCg`HSN+r{VUBACu)LND(UD@2-PN@3a>?}590gooiX0;s5#Eav$!AI6?HWSGN#6IBz!&oiEM{yh&Y#!s` zXr!*JsLb^OV;IhI5jKdz(60xdIQ#$-FhmfxkA;vg+$kI;plL8{Oan*ralYR+n5{3T3fAWQ-mI#D{#fNV)$`97+l6SR{;ls3=;cXoRg~#0|!t(IR zB0L_0v^7IhIBi9U!-Jf8oSGvabJ)rQmCfZ|dgYb;?Ckx!_ot_)A1>crTVKg$@~-Q^ zj|HF)AjA(6ayZqyB6~q61UHB&hE5yOegZZGm3JHF+SkAC`d-6!LKSz6U} z>yQ46l|s(29JuMs^JSVgEQp8FP~3x!k8KKc+ijD@xs|ig2`+J z30u1gICGRQhn+!iU;!q};e5V5nJ0`CAdSPke!x2*8Y3teevycUq)-IHC=E1)@zK~( zzuzW4Bx&OCrbWTtZ{?z#STf5qd=SI7S-%tZ9G8_((g9nlURx)OqFAm+n7& zbWu{ypF8*d`yXy>u0MLTS}DK(`kSvya#HYd7F+=bs>TW1vH6K4*p>|`L-d5ms9-cQ z&kJLw98-z#V?q%=ndk$JWjMR8hiSQ>xr^slOC{hEcd<*o2nG(j>H84m{A8981~pw4 z_GiHXVKiB>(fqmCe_xU%+i}2vdfdBs>5?J{_wL`{++5cbO+&H<;{o8{0Ae^FJ=oWT zrZz0Y_roA>;A?SE?qKc<-v_!kzwvE-e?J^xoTm~lqOz|YWWy^C%wlqp#YUshHtT(~ zh=n9ZARMS+1EfPe$A^XA2*=@%M^kG#KcQ{@Cfl|(O@l&M2;-$K6WMx*@KM8$ajrd1 z&BIf@T7%@=`yYNF%Ic|8Cu+^csWaZIufM8mDkO<9qKH$_3&8}sIHC;jYiD=2R;!;q zcSco{7^1`~DA)CIaVS@r;>>vHXD!^5`;2#et@yhK8H(h;`qm2iOe zG99cMh`sg-11(^`04y7%*0+vWNFor%5QMvaINuhHs7C`q0$Dk()+S*04FK z9JE@3ib9Zh#IwUjI9}NO4??V)8=K$!#@Akd<4sA)u%LejvJrbW%1mNvLRVBgKGM_+ zrk_OkK`a*|s-EvA5{X)^CIp{(@R7oad0hTvJXJ|ie)KzE6Mp-5W*n}nxIGwxM(|SU zps8waN61E1H2I>j*V;Pvu7~X+7EZVbgo72+6plv3?wWCcF|cOOH*NVs;c-7gY%LPZ z;u{V<1Fx+#VQaPu-m7N?kLTw`#w3sJCfNZzYolSh4vu^snmDjozTj%2>~LQVnxOcf zv@pUUMzI&3fb$$dVsF2=_tT%e1Btdb-h3;W&{D}1-boSXk;i5%o^M;m&dydgorc=r z*}w|=!Q8x-?Z~QH-rLKhlGvUFdqm*SrUIq|v0Ag)@ICK;`k(%%X1y^pH>cqgNoX3G zg#937MM+>$RF=nkocW6$RL(CsQI0ohGcUuBB56;3d#DXi$SaArbYVS;a0C z5}>pB(anM+>8_iA%fJ&rXj++U_$BFv-yu1|ewz+x6Jx6VdqOOnWDy8sDP-YjUNE{m zKK%NL4~mO+thUs8tiU5iRaM7vfQ9fHQZP&9WoEhp`t+cPPR=0+glp;ezh_`KMS~m+W`M+nhMlW712^9 zUDW}hV8XUGx6WU<1b69&KlmZ!8X|g%U8336*5g564Nzyr3iDoQN)Lg&!_(8jyu_9CvkX zP1m*3ei^Ji5K+LH6TuKlj$vYNNNfY+1hZ6%Vb}Vw84YAXRo_=3go}nTXg12lW;W3t zJm=$ZgfXL?{S03mA|3>X@xRri=U4>7xB^qSxVRXz@(2&{n5gSne}r>jVdCiV@Z7ER zAz%+4vf)@W!sBUvU7VR#=y>Ar*ks}(g;m**w=oX+I!bEQnuz_);d-6GFEMQW88nfR zMFu|&oZtt+?)L5vzyE{J{oEI)b5o+EX0lnhS$FQ-DwV6RzVwooNMQPn`}gnN+pm{KZjb&d-e~^Z&;4AkFjcKrVYeUreuD^t@m7iTX9HL*VP zJw=pZXUjCEW@hK-W(=cQsT<&6Gr7DN*XYxT zUgcelXgaV5?hsa;K&@%+!+7byH{zpO#t02OX8bn|_0_L_^Xk>D&wl>XhGi#H87#tH z@zZ6b_In9JXCdH_1lBA+eA&ln8{w=}=8! zd>+KycUT;T{R^=ze$bk<)q=D&wP9G;IzouU_$-WhZZS`L;9K;o&|U%;b?esc+qdt0 z<}+`fxpY~TRUY=A$MIx>VRs;Qier@fID-SQ$a7QKq$caG2fq#Y^z1BTRn`4{!!Q&H zQilqT0uwY%VF9!JASUSoygV0i03bGdwWLs3lAP!+XYZvYEF_qosOdZJ-A1R1^BCz9@#_@&mn|;QC-)Og~gX%y1u@? zzPh%$v%OQ^FNLFDXEV8^o`6)H+-$(@2!0(vV%39xfu6}^I+09P_PA*@>&>RWv6awN zL|Ql#WY8ra@fo;JhC`kSySqgko(8+Ui3Gv(?q_?*tr5v9*iJ-mYd)Bw)KM_COjWPu@FC%;GHEIXVnlT zE{Qz6{y;+4_+-K``NBAT2gilOFj1TVs~?yzt}9!tj|M@DAIhpz)FfUDdE#J^lhf1FS;k zPE{HW!*NWr*@QG+Hj_;yQpr@($H{K7YXkmz5P+VV>)DRW#h?$orpc-==ccBoW~bNg zJ$U$F*=#mk%aW$^UnEL^^fnLkA4b}EsE12n8=aj)ok;bnd@AUB*I&dRIG%yx=fo7Hc8o8P?;2~Uap z5_Z2A!ru0HCjg9kl0TlRp@V`#>=DcQDQ0RgCJu+Ph9j_$^`EhX^jwNScqocV#5h}7 zY(_>@tpehaOLXlv-T@UddsHgK`gXtcMl>6pCYSz#dy0=!~ig0X^#b24}$*fL4g zpb%&O(^Tc97hWvx?Ju5K$Ys-pW#u3>s45U;#KtbzZj%SiYNVi_gCvXY+|0bL>N~|9 z?sAA?>WZGu<}@A0JX19VAPO8rT47U7$Rgrk-q?R1NB0&m2MeGu)l~KX01yC4L_t)- zp}nQ)nHkr0zVxLpLHWwcBik?vr%u6++dI3vrD8Ibf+VG7T939iOw-1Z)+8~Ub}(!Q zEHQW&!Duv#AAV5#t*=NPS9}*Tk!WPW^fO;(!B+)g?2Eb{KK^@Bu>HQp35|ARFI1c$ z=Ro)kWepFKGQ4!@(%rjv8R>Z!fpA2PW(xcHv-YiVuotuDxNsQS!LS8Q*yA3^r)gT4 zN(@V&0w&Gcd;=fE?0%~wTtdvl_Pa|yf?VN&A%dJ5HZ2iwXck}+tV7r{SI8|a%p+Rl zU??>-e~ORoTtvrpln^?cB@@Zded_I6y{;>2qiHCLyuPu%y|F%j;^c+1X9~Ft+$}|r zP1|rCoDm6Ql7i^?o)GjV#BLjs95f3R1Ea>~=jSuoT%}ww0e6QV$(p4)1tl}atl z&91GlOTmCI0Xwkw!`|+WVOYt89v~725QSeK=t2V*D+K5hu$v+dnq4jyAKt$=U6`Gl zpKE^OJKQuC#3aT|u`!MyC=C9EM5dUNMf@ED?<9-$YgfyKsqQarzZ=*p?-uK??g~9i zMqZ70Uv>cP@9#6x^D6@3K?N+#WHRBh(1(01l6EW}Gm$t#wTc4$ch2NF@@}Gt(PeJ0Xb$93zHrig{lu?U1?P_0($$3kHkA_~KBQ5cnfY#1E& ztBg<2VDz<+f?;836Wg1WwpyQd5VS+_pKHTD0Xz2X`DlK!i7aO39xgvPcj3G!D?vRB zCc+jBAmWtn9;EjSqYl+nO@q`O0oUD@B;{X_rUuK?YerUO|+sL=Svcl@9)KcoR=xC+P)3ZfcZH~7h% z0uYq3)1mM0zwu^MRfKpT6o!FK_dV}-a$6h#d1(b&~{f0g9!=4pT6E?BOUG>AP4}UznQ>c!+ z!P*{MBc~5rB|UfVSqP>OP8CPhR^+g2c`z)t2eDqbN-=E5f;i-jW?0&)66JRKm}C&Qxo z*asrG2^bWGJJ@J6gkZW|?9`7F65?oZV)%muxhNUc>e|Y~FMQ^OS6+FgFf;YiOP9f{ ze*4=$U0L6O+pS=@6z5EYP%1XX!TEb3ED8}{h?YX$&_l>G!PeB6s1Qa<7RGGq*>~L5}4QHNL5eUbl&CSiFr6m^G# z3-IW(XdDmMx*@*?hNTEiaqQl7VsnjA_4}&rZnNa7Jl1EG_WZg#U|{7;djmS6v0B) zW$AiW7W%~WKB*vdZh~?gRuyu82zZPcBI1}B%o*VY7A@@K7dCVWh70w$>tT-txC1uW zE-rY1?Fkc#K_>_X#@MoL03kSN*RjPQvWzzkTg|xK<${c3x(PwRIh<~S2VL@A+o?3_ zvZ{-6FxiBp)T*_QKKNj1aS8H;cW>VjTyJSU_u7l+C0PT1Za2)TyMO2Q$Fi(sGTEgQ zr^R5lK?z4$6N2_KzUT(+Y6MYXE|@_@mEaeOBr9$()Ehf|#bIFt;bLxL!$fok{@iSR zX)j;CeCN&`MtZ(PARMP!EDSZ8DIC@gwkswY*^s7C7!)IIRS28Ugbpu!4JW=2SHo;v zIAAGIuuv$#Q_QlgFq;_m%J2ALK9GOyo4QZ6`#d{JSTCT$DK)CqY|w<#$CfhKNHgGC zIK?}p^DssVfWf(we9RFdC^^pL5PITZZi&ZjJ_CM=!Mwl0Kr#YO2<-Vn(ANR0pj#Hg zK&dLrreVM)@TGRsMqUPkuAxK4Np-mxOg31m*4*WXsdNTBUNR|FOLf!OQB_$_B&KI) zmlhXycX#2(MR9ALsj6T!@eF;A>C9jzdI?SyJ{pXVLclbb$3l|B8`1AeJ6;WB;b`!S z<|69@!lAAdDpP>;`4fR~%nDf;({=S*ZC89d7>9pxPJ=}Puctd?PnxjM=e0T-;*_(2 zQw(c{3t$!n>@Z-4 z!N&l7BH|9azw^MVeS$d&+nOQiaFjKlh5aGG-by%ylNV40LaAuQc+hnoPXxK=Yr5`Z zJT>?ayZ>R=3)m_#h^xu~+NNcKV@oEJm0DdEf_KB|b`=HNm$H0e8v7}F`11np=G=6C zV`HV!G^Y#sf{5eD;6(N_^RDIGyL%fPCYnVajJ*bD69imwjBU|Z1A~YOL|bGDg&%DI za3Bj~5-!38#suL}UNz}>ia7g!q(yO+hs(;SAaV|b8C zZ0+9aXc)#$0fAt`TJA7h?Mc~~tL#bmg$u%yMzEz8|H3w!EI{>xdv~wDbRD3K?LdQ( z=8#~>ws5*z5Bu!-=<0%TXoBLP3_V{k>wPegwHyp3>M@K>a?ka^)nOMy5eFmn*kknI zWP!mwkp!TfssP9|fGhkQFpY+QJu89^jG~aw4T1cc*fDquW?_h_03ETXL9!^Ig`H*D zF8Lw(Y}*D%R4SEls2U3!iFiUE^B29!`dGsbb)bzQ1}cAYTq2O-bp2g_&9 zp9Ravu;C4MjrVaL`+&7xn9mc#6S6E54X1=tQUq;QMKFS%>%cCmu0tR+l}IKMnyyKD zLcjjfYsg~9E0@aTBr5wX@aYz|guv`d&Lb>R98YFhHi@gW`+1V_% z0P6o88yEcAHL$5?OfL3Y9vCTQ2e5<0!skf@!oyNe7KVx$sBBmKplBS68BM|NC@7E7 zcC;ITtQQ?SR>Prc!d{6$MC?(XN`-S=Ksl_2S;Ou(>OTHZtNd|Jk+lIktQJOPeb2K! zaUoGDB#j5VDPNSZH@t^4QeglTxF>~E-r~HwQjqS$h_1+GNeyy;*icAMXdmCYDM`Y$ ztJi>I8|!O8HBC>blHvg7eK#ScB^>4(j3?v)an?WqJ5U6pcn8CIv#<{%6I>k775i2| z5;CQM2~4P(f>j-_S+BEv8b`UazztfdRJvTPHw{x$6mB@+PIX-acPZEoa#)p+j%LuF zH5j`_@;Gz3ud6(;o&CNW5z7Zr$3fyZeu=Z(agsu8JIIfu(GcnQh(LIV0v4V)aiYCs zAd1?n#W8~YG^{loSkAgY5>d$d8^oTgVShwOCCY&e9GS%qx55JUVShX)A{%7>hFxV( zKJ`90Z`|7f$78^?;?asaX@hFO@Yx> z*hNnyQ<)SxQE;ijB*0VCGai>7++SH+Tgzlpa7wc?vye|zRh{cx%_XY4`Ftm$3`@t3}rx!fa6tOFzbYv{-d4vdb4GY4E-B~0BV_p}T!skW=!oyVr zS2`;6Tx~Br$SWIU4Ov%<%7HlKG2)^F9U*%XqF@R`j~EWyEd=dufQ!7VBX;+Nus#h+ z*&rX;UdXWR3U=)S8|QhBgpo;6m&KC>FX()S6WNLiu+T$L3fKk(2W7!NeMI4$(3|s18d^PmG681@aL!<=&01yC4L_t&p zvMM6DM%%GnQ3$%+b0%v_I+Kw_895qE*o1S|i^As4Hl+IY_x5cw==S0HQ~5%z+E}gE zu%qH1{N3)mADg#V0MBYB=~f$zxe_)&m6_zpir_+umJ3&2zxKlCKeM)7{Koe`#I{Z> zZ1u_pvXC7hy4Z8aBLiX2KQuPv577{7hpTY(wbq}O@MIJ&y1e@}VpGr8_?sdY zTJPJh&QQxeH??mK!=&NJZLP7qp*)O{4)hQ#@=@5ca(GPiR^ciWrl$+P`FH;My}QfP z2`iXlP&6IpFl?n#EbRj~G+j|3#E6sl;Ut0rPAlkJj<@{q{=NJ6=4a<1(2F@wi1A7g zv9ux1yS=#qR{%M^bS9O}WpPXwQ4GgW({T(obaz0$h51=sk&H&|d*Ay`)3WtM!pGhw z3b?>@GAS!E4_dAY!5B9fmG!yPEbs5_HJf$FDPn(qK`0mZK{%m?;~LGzzUQoZ*0kYh zE>GZC2a+NJ2K~GwdN|gMIQ`kz^&& zJiM4B@9LHlT_L{Ub}`a3E&}19tDS{IA&?D;y*RG}3wthv1Zuyik#Wcd(J|~(7`8PP z0*~05;37;Q`JZ$|i2Gwd&LcY`CZQ{T>u>(g^}11*no1;6>2xZWOKU35nj19B z33_qhurMrWw(8CnlCafi8gN)pB9#KW==xq^W*$7N@7h_=;^O+dAA0o$Tzgto;q9_$ zG1Y{YI{PpE^W{&ypl32t0*6@BQpu}VFTMOC#DU$d?L8)l5%+Us9F9PpF)}hf1>?Nw z^z<~b@L3mu@F)ZJOTpQQBkmiSgof(`-Bo5+-fZx1cyCqhRtWfk}!!FI>m6b zw(enQ*f4Z#Ukw<Z|wGm@nG z*bC2tfTyO))k;}XRLlnk?MNB(YL&X>y5O-4+ge*)OJy^9G6|5>lF3@RWLr2NZ?joj zdHB#YjrqBGG3dFWg1y9nvjxH2eevq7!kfSUGwTmFUDwa#3)9I|BDgi!-!JHrkCOw# zClQX*27%L5Fnn6G(R6I5QZ5?JCbsmkdEj+D?&7DYh(i9%3Dz*2t!>r!7iRO2BV2g# z;^qJ7-_}0$s-8*0?qF0^JpuQnQ7SXnU7DSGVAJI*$uq+?aW{_eurQ%isUH~;3(f9Z=jGPcCHXSkm5;K9S1={iC}5;e#P z`T#6F1xPUJH3(5AG#$>bUaxT1hIl6&3NnM0dfjpTgeH5wpGs$SUBj`uB>^0pWm>N7 z;0(SV7&Bw9xPSNFZMd?TsVQ00A*ooo_m5wh`RTX+XVPGE&Sx9BGC(fV$ z(jWR~w^kk&w8TO-asH3}Q|=dDS5Kc6bTygJr>Aq+x6t$VHa0gOJxpeE95^aVm#$uU zK>oYaqet%dHw?&Xg9{pi^7b|L>lB7(y17Of-1v4*T|uBBE5C{Y#Z#L3gY{@4EE zpZZgO6k?&+O`h2hR;<<=ijr76vV?ak^1&{OJ4No1I@wr<0H%6oaeBLEC&! zm6g*AY0-D#2ZI9V#H4I4m(LeUd&O`-Hbn;eCrB1bcy#Z6ty-%#tbrdf8wrPT4B0^}U`%H@ zLgjW52%l*Y2#-{wu`oXN;=e{8zZ)Cf3-P(w4~Hz0j_oBO4%NpBJ6a@@$#8hKjv?8) zt_2o8>FyAYjTW#(Ola!A_OJYjzx4n43v+W*Y9awVg#%kA_`PN_HKnSFdw1_v>!!#B z+jg6Vb$!7-HJ=a#%eO7Zm%#ABVLb?J3eDM+pVv*nsTY#Y{0zo9?=J71SXz<uVlzOTiBI8U$rU%d#Undsv#?`AR~^$bn+BLe zNs(>NtK6D7eM(Cw)3Y;*hHX$?$KBrC3MS}P1VzbC6?Dj3CUZOc#oe7h#~RhDZFGtJGs>T7fEa@lu% z2WRAEVgk~HV8%>$X-@M@&-R2SB<5UadV0pPou+Acj;E*^L{nuEC#JyYX6WdAuBj^c zTR8Y)wxX%YW~s*aYXX-%i5q3_yFV=mA`ni-aY*H0>fT^JL|qZHqAhZ>QmWb(xJ(I7 zJDo~MtdDv!lJfzbMEh+z$a2s3 z?N>;8E=3@G3hH2CsGf-GUTv>@NEGY|zk%e7gTM&>MZmAS1aO#6r^8@rv)Qaxt6`@L zJJ8Q=bl?DkUBb{PHthWLr(XYW|H^+OK_<|%d>2RHtkjAQ1S`2cmpFw(ih3p&WXG}g zOEs%j)c}pEV#^BW4KQ)4tePSYrJYHp4AZKVN)4-Y>EyhxNMQp}*RYccIyV_ulu09` zEknk1C*&RloXSv=;hk;Qaa=CSZbHvyGTNJ0eMM1m+-}Z{nhm^kU9oN@;gVD7bfei2 zkbyFGKotC>Tk-`QnACMVJ)tX_Y8nQ(I?uH|oLEWFFit9%Rvpl5G>wL7U%YU7ap`1! zW?B*X?)DDc2OI;yc6au6v)Md^N6)?RlIU3spqxtY7mKA*SymzU7|t^V0a-B^OhDj~ zKYCbyB1S8MqlZDh=wF|#KLVrO;gu^_Zr{GmNY9`MgilAnLU;un3WLU%=~(5xI?~1D zU%$$%KYiJ#)-e7u>+ck!OF|H;*rP!XDG0u>(P)HDkzr?bK?uX4B7>-3A)o$B|Mma- zrB~lp6nv!PynL>&K}b=X76j}R7)&Dp_Roh%BJAUEF+Vd`tydbAnqf7uEebd&ObgnA zj{||qidvYSX%;Qq7ygngB(1Kord@~gFf216$r^aUaEd`7Blt_nmzXbWQnPC4YC4<2 z2`(CSV{r~Zjb_pDuyG8|55W@P{Q%dlZKcwgWFm=EMKt%bX}Me~=ci`i-E|#%83v=f z;oKd~T0@puZfY80$LZv>=~|6O4U&CHFEu+ipD$$LJyMx0T!w9#^+s*^-W`aACev8} zH_oT1q&!twSy?d+3&*&zAeL+I?3BLxJKsKg@oL!5lEwQ#*^n{Je#q%K+7VDN!Wyy| zbSD-*qaqMKO#u#1o;=B7+rfd53pErhyEm~m_(d4O@mfPRDh@*yLZmeGh2dm}$U=s} zMl~! z8h`v95}piVvpxo~{WFTMe)}GhFYMmLC^|Z+qQ){$S@8Id?p6_J^&qd^h5c50?$y4j z=ho=u_^Yhf^C+ytgV9QPF!yiRp~7(-9DPg_HC6oA{*^!Z-~SJPb$WV1!tkb#O+qBq zG7Ul2GU&)XJ5+w{K^%8MtkVnoMPL zdNvDhy0y7ct=4d)QwQ>z)?Tp;Swtm~wH>^t{XU4EA2%CBj&7Rv6d%->g%8*y9opO5W29$I*4EbAePK*@7%EOsln)A-4(kX7Ay#x$h;0WutU&Z?`@Z40 zYv2Om@f~Id!5!L`1vxTBk^ay>|Equc|NL(kW)@w$2|>zWM-!(B6vad`2YdUlJ7&J@ zYPqB(a@fW)l?AH@Udpx%pr#~4<`3s@_gvqX(iJh;l@~JKAibfpGS-E{L8VjSwT(+peAwi}tPEJMzPflt#a@dl;?&01yC4L_t(n zzfhyx^;_@o+%LskA+$+3>Alkd{De}Gzvz)FB>vU%0|r;@B5Ro$}o9jgiT^V6q-qq#U8pro0N{YI^1 zn^iqIg<(nbl`fNHLDGSxIJPx|praqak=Gj7PDfAA@k-V8Jw;I<=BXtUvMjlR;=2%b zmBTp+Sui-9z{Maw8BC=FR{?1~i3ibB7q3Z#bRl0~Uv(?x`C6&*aqg=hJDOxoWm2M+ z@#ci7xdo2X9tyf5q%$g{?jV{A1+{7w@HabyCk(kr)4=(cDwRs3UV}qlzHmWOWw<|E ztE;xvOeJ*3F)RBeIDy2g;Vz-86@9$S0t*mbEmd~6% z4`>H37{H{j$xq%;C97Pi-f{1aJ*`P=%8wACU6C*tzA`l)Ig)HQKnx#Z@E7Vvh z7~u$GLXq|Ih^!A6Ss(uOgkNhlbb*Fpz~ergr^$d+o#Vp7silQq|MkC~NU4zR6IBf= zT6SI6)2f=*v=p2>hcudmtwR8#V9WGW7DJkFWZyx)GCVT;rzuKW*T52aumjEz$iitN zV71ZoGr4KYuu7FuwcZ2@ONxSQ1D`0nz5z6aD61~xsN7t}@wh!~w*%P2941aR%!3aN z=O2WGUw(RTYa6nWf?-3vG|8oA)iH&A1&8GZc7oZHr?RQnU%UFPuYbGd*D95|*)(To z3zsfm(v#TV?|a|-7Y$=l}IX!Clu~SXJr{q2z;RRlb^nG{iT;vxq_mn zu)~I;HjL)R`mzw*PhZIT@N%G|;#~>Ij!g$N zg{(gvyH{BsDziZsLZ!@e{@uc43n}xTx9)iBJ1xk zLjHxX1`5KBCd5X8X8*>&`e#ksOr+DcQ*x~eI7J`FAE29gYBFFBN77A9nxJx zv+w79_x>xs?*~}-nz`0JSDxo})^XtLs4)e?>OAg72Fms+Oyb z5>L8Sv)_n8@cD~^f0_Q8>DKLjm4CfbzHS~k;HD=xp^E+48%uVXnITp1( z+FuuB0+F%yrY5si&*QJ1yhGk+eIQ69-Q(R?SRYy61|0o4p~-LtIq`Q{IT zM`kf1K!Xh_S2ez=>Uy0Y(3cWBb28_j8M;!jJ8MC<$pc^d%Z{NHjE{~wuA{E=EuTt- z?q!yWha!eDEoZ+B^=*PKk%5jXh!kJs)=BR#6IN)ZV&P>^4+NWLosLxTwv9LY7w=k7 zNcIXp_}zO_dgw5O+f*X0kfE7G>MLQQy)ds}lJhJTelAY&IT1*yrJ><&b}1K=#v0;9 zZ93>mgHT}cmh*Q`PI^Kx))vDJ_jl}Rvre@3dMR}QxUGR7X}Z9+@a3XTOSWDVp=o5Nss>FI9-ng z8TJrHYw456qe~xS_FAc`%8qkceqJvyqWWkAux{T?rFOPAH{YfOWd}D8>J7;YlCpac zeV1?abTEslAGK_MFKf|cYinCNGx~q0q0*^Uf)hmXZd{=>1;!9khj?WC~|Ubc9g3k+c- z?+*-dici|pPez(XF6KSr52WP_|JUJhJQDJoth>e_r=znG>FC!^38-@qte*5*6QX=B zg4ZHLkm<)i;Bb`dHFXW9FM@ye>9v-R)IB->57_W*9#;`zy-|(j1tGgb2qvIo}kEmEA|B%T<0D z4I1J5D0YVuHM<(q4@E!seQ$cp7Ce;ZwBM%wc3ih3TDKqg+Tr+4uwQh8CUu95elt_a z)|%uY%)I1Th0+bWU`(GqVxg(7u@Tk_5JVp|eC?QAUR``T+cGlB^l`@mpoK{RFG@V& zwuL6IwpS9KWyHM$N__vj7y{~zZXLN|h@~t@v{Sf|lUjeZ7N01dCfR@qD`ZIPHi*q5 zXq;%CUyGRAq!se-0u|LRAhkRE`1nLOa==;;k6UR*`!|0-C}Bt}ywI>NEB-sQQtDO! zqY)=2XIOL&QI1V%gdbojp≶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 R3HSs-@%;zcYH9PJ{{x(c!{7h_ From dd0fad969c36e0d80348f65369b7d502da73f224 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Wed, 22 Oct 2025 10:57:39 +0200 Subject: [PATCH 7/7] webgpu --- .../gaussianSplattingMaterial.ts | 88 ++----------------- .../ShadersInclude/gaussianSplatting.fx | 4 + .../gaussianSplattingDepth.fragment.fx | 6 ++ .../Shaders/gaussianSplattingDepth.vertex.fx | 23 +++++ .../ShadersInclude/gaussianSplatting.fx | 4 + .../gaussianSplattingDepth.fragment.fx | 15 ++++ .../gaussianSplattingDepth.vertex.fx | 27 ++++++ 7 files changed, 87 insertions(+), 80 deletions(-) create mode 100644 packages/dev/core/src/Shaders/gaussianSplattingDepth.fragment.fx create mode 100644 packages/dev/core/src/Shaders/gaussianSplattingDepth.vertex.fx create mode 100644 packages/dev/core/src/ShadersWGSL/gaussianSplattingDepth.fragment.fx create mode 100644 packages/dev/core/src/ShadersWGSL/gaussianSplattingDepth.vertex.fx diff --git a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts index 2f4538ba892..5b91d5925ca 100644 --- a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts +++ b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts @@ -1,17 +1,17 @@ import type { SubMesh } from "../../Meshes/subMesh"; import type { AbstractMesh } from "../../Meshes/abstractMesh"; import type { Mesh } from "../../Meshes/mesh"; -import { Effect, type IEffectCreationOptions } from "../../Materials/effect"; +import type { Effect, IEffectCreationOptions } from "../../Materials/effect"; import type { Scene } from "../../scene"; import type { Matrix } from "../../Maths/math.vector"; -import type { GaussianSplattingMesh } from "core/Meshes"; +import type { GaussianSplattingMesh } from "../../Meshes"; import { SerializationHelper } from "../../Misc/decorators.serialization"; import { VertexBuffer } from "../../Buffers/buffer"; import { MaterialDefines } from "../../Materials/materialDefines"; import { PushMaterial } from "../../Materials/pushMaterial"; import { RegisterClass } from "../../Misc/typeStore"; import { AddClipPlaneUniforms, BindClipPlane } from "../clipPlaneMaterialHelper"; -import { Camera } from "core/Cameras/camera"; +import { Camera } from "../../Cameras/camera"; import { ShadowDepthWrapper } from "../../Materials/shadowDepthWrapper"; import { ShaderMaterial } from "../../Materials/shaderMaterial"; @@ -19,6 +19,10 @@ import "../../Shaders/gaussianSplatting.fragment"; import "../../Shaders/gaussianSplatting.vertex"; import "../../ShadersWGSL/gaussianSplatting.fragment"; import "../../ShadersWGSL/gaussianSplatting.vertex"; +import "../../Shaders/gaussianSplattingDepth.fragment"; +import "../../Shaders/gaussianSplattingDepth.vertex"; +import "../../ShadersWGSL/gaussianSplattingDepth.fragment"; +import "../../ShadersWGSL/gaussianSplattingDepth.vertex"; import { BindFogParameters, BindLogDepth, @@ -376,83 +380,6 @@ export class GaussianSplattingMaterial extends PushMaterial { } protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper { - const splatVertexWGL = ` - #include<__decl__gaussianSplattingVertex> - attribute float splatIndex; - - uniform vec2 invViewport; - uniform vec2 dataTextureSize; - uniform vec2 focal; - uniform float kernelSize; - - uniform sampler2D covariancesATexture; - uniform sampler2D covariancesBTexture; - uniform sampler2D centersTexture; - uniform sampler2D colorsTexture; - - varying vec2 vPosition; - #include - - void main(void) { - Splat splat = readSplat(splatIndex); - vec3 covA = splat.covA.xyz; - vec3 covB = vec3(splat.covA.w, splat.covB.xy); - vec4 worldPosGS = world * vec4(splat.center.xyz, 1.0); - vPosition = position.xy; - gl_Position = gaussianSplatting(position.xy, worldPosGS.xyz, vec2(1.,1.), covA, covB, world, view, projection); - }`; - - const splatVertexWGPU = ` - #include - #include - attribute splatIndex: f32; - attribute position: vec2f; - - uniform invViewport: vec2f; - uniform dataTextureSize: vec2f; - uniform focal: vec2f; - uniform kernelSize: f32; - - var covariancesATexture: texture_2d; - var covariancesBTexture: texture_2d; - var centersTexture: texture_2d; - var colorsTexture: texture_2d; - - varying vPosition: vec2f; - - #include - - @vertex - fn main(input : VertexInputs) -> FragmentInputs { - var splat: Splat = readSplat(input.splatIndex, uniforms.dataTextureSize); - var covA: vec3f = splat.covA.xyz; - var covB: vec3f = vec3f(splat.covA.w, splat.covB.xy); - let worldPos: vec4f = mesh.world * vec4f(splat.center.xyz, 1.0); - vertexOutputs.vPosition = input.position; - vertexOutputs.position = gaussianSplatting(input.position, worldPos.xyz, vec2f(1.0, 1.0), covA, covB, mesh.world, scene.view, scene.projection, uniforms.focal, uniforms.invViewport, uniforms.kernelSize); - }`; - - const splatFragmentWGL = ` - precision highp float; - varying vec2 vPosition; - void main(void) { - float A = -dot(vPosition, vPosition); - if (A < -1.) discard; - }`; - - const splatFragmentWGPU = ` - #include - varying vPosition: vec2f; - @fragment - fn main(input: FragmentInputs) -> FragmentOutputs { - var A : f32 = -dot(inPosition, inPosition); - if (A < -1.) discard; - }`; - - const isWebGPU = shaderLanguage === ShaderLanguage.WGSL; - Effect.ShadersStore["gaussianSplattingDepthVertexShader"] = isWebGPU ? splatVertexWGPU : splatVertexWGL; - Effect.ShadersStore["gaussianSplattingDepthFragmentShader"] = isWebGPU ? splatFragmentWGPU : splatFragmentWGL; - const shaderMaterial = new ShaderMaterial( "gaussianSplattingDepth", scene, @@ -466,6 +393,7 @@ export class GaussianSplattingMaterial extends PushMaterial { samplers: GaussianSplattingMaterial._Samplers, uniformBuffers: GaussianSplattingMaterial._UniformBuffers, shaderLanguage: shaderLanguage, + defines: ["#define GS_DISABLE_COLOR"], } ); diff --git a/packages/dev/core/src/Shaders/ShadersInclude/gaussianSplatting.fx b/packages/dev/core/src/Shaders/ShadersInclude/gaussianSplatting.fx index cca5e5043d3..835db86f726 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/gaussianSplatting.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/gaussianSplatting.fx @@ -22,7 +22,9 @@ ivec2 getDataUVint(float index, vec2 textureSize) { struct Splat { vec4 center; +#ifndef GS_DISABLE_COLOR vec4 color; +#endif vec4 covA; vec4 covB; #if SH_DEGREE > 0 @@ -41,7 +43,9 @@ Splat readSplat(float splatIndex) Splat splat; vec2 splatUV = getDataUV(splatIndex, dataTextureSize); splat.center = texture2D(centersTexture, splatUV); +#ifndef GS_DISABLE_COLOR splat.color = texture2D(colorsTexture, splatUV); +#endif splat.covA = texture2D(covariancesATexture, splatUV) * splat.center.w; splat.covB = texture2D(covariancesBTexture, splatUV) * splat.center.w; #if SH_DEGREE > 0 diff --git a/packages/dev/core/src/Shaders/gaussianSplattingDepth.fragment.fx b/packages/dev/core/src/Shaders/gaussianSplattingDepth.fragment.fx new file mode 100644 index 00000000000..a3076ba2d32 --- /dev/null +++ b/packages/dev/core/src/Shaders/gaussianSplattingDepth.fragment.fx @@ -0,0 +1,6 @@ +precision highp float; +varying vec2 vPosition; +void main(void) { + float A = -dot(vPosition, vPosition); + if (A < -1.) discard; +} \ No newline at end of file diff --git a/packages/dev/core/src/Shaders/gaussianSplattingDepth.vertex.fx b/packages/dev/core/src/Shaders/gaussianSplattingDepth.vertex.fx new file mode 100644 index 00000000000..54a0c977063 --- /dev/null +++ b/packages/dev/core/src/Shaders/gaussianSplattingDepth.vertex.fx @@ -0,0 +1,23 @@ +#include<__decl__gaussianSplattingVertex> +attribute float splatIndex; + +uniform vec2 invViewport; +uniform vec2 dataTextureSize; +uniform vec2 focal; +uniform float kernelSize; + +uniform sampler2D covariancesATexture; +uniform sampler2D covariancesBTexture; +uniform sampler2D centersTexture; + +varying vec2 vPosition; +#include + +void main(void) { + Splat splat = readSplat(splatIndex); + vec3 covA = splat.covA.xyz; + vec3 covB = vec3(splat.covA.w, splat.covB.xy); + vec4 worldPosGS = world * vec4(splat.center.xyz, 1.0); + vPosition = position.xy; + gl_Position = gaussianSplatting(position.xy, worldPosGS.xyz, vec2(1.,1.), covA, covB, world, view, projection); +} \ No newline at end of file diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/gaussianSplatting.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/gaussianSplatting.fx index b710e6ae13c..c301acc99af 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/gaussianSplatting.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/gaussianSplatting.fx @@ -6,7 +6,9 @@ fn getDataUV(index: f32, dataTextureSize: vec2f) -> vec2 { struct Splat { center: vec4f, +#ifndef GS_DISABLE_COLOR color: vec4f, +#endif covA: vec4f, covB: vec4f, #if SH_DEGREE > 0 @@ -25,7 +27,9 @@ fn readSplat(splatIndex: f32, dataTextureSize: vec2f) -> Splat { let splatUV = getDataUV(splatIndex, dataTextureSize); let splatUVi32 = vec2(i32(splatUV.x), i32(splatUV.y)); splat.center = textureLoad(centersTexture, splatUVi32, 0); +#ifndef GS_DISABLE_COLOR splat.color = textureLoad(colorsTexture, splatUVi32, 0); +#endif splat.covA = textureLoad(covariancesATexture, splatUVi32, 0) * splat.center.w; splat.covB = textureLoad(covariancesBTexture, splatUVi32, 0) * splat.center.w; #if SH_DEGREE > 0 diff --git a/packages/dev/core/src/ShadersWGSL/gaussianSplattingDepth.fragment.fx b/packages/dev/core/src/ShadersWGSL/gaussianSplattingDepth.fragment.fx new file mode 100644 index 00000000000..d2766bd467d --- /dev/null +++ b/packages/dev/core/src/ShadersWGSL/gaussianSplattingDepth.fragment.fx @@ -0,0 +1,15 @@ +#include +varying vPosition: vec2f; + +// move discard logic to a function to avoid early return issues and parsing/compilation errors with last '} +fn checkDiscard(inPosition: vec2f) -> vec4f { + var A : f32 = -dot(inPosition, inPosition); + if (A < -1.) { + discard; + } + return vec4f(0.0); +} +@fragment +fn main(input: FragmentInputs) -> FragmentOutputs { + fragmentOutputs.color = checkDiscard(fragmentInputs.vPosition); +} diff --git a/packages/dev/core/src/ShadersWGSL/gaussianSplattingDepth.vertex.fx b/packages/dev/core/src/ShadersWGSL/gaussianSplattingDepth.vertex.fx new file mode 100644 index 00000000000..38c0cd5bc39 --- /dev/null +++ b/packages/dev/core/src/ShadersWGSL/gaussianSplattingDepth.vertex.fx @@ -0,0 +1,27 @@ +#include +#include +attribute splatIndex: f32; +attribute position: vec2f; + +uniform invViewport: vec2f; +uniform dataTextureSize: vec2f; +uniform focal: vec2f; +uniform kernelSize: f32; + +var covariancesATexture: texture_2d; +var covariancesBTexture: texture_2d; +var centersTexture: texture_2d; + +varying vPosition: vec2f; + +#include + +@vertex +fn main(input : VertexInputs) -> FragmentInputs { + var splat: Splat = readSplat(input.splatIndex, uniforms.dataTextureSize); + var covA: vec3f = splat.covA.xyz; + var covB: vec3f = vec3f(splat.covA.w, splat.covB.xy); + let worldPos: vec4f = mesh.world * vec4f(splat.center.xyz, 1.0); + vertexOutputs.vPosition = input.position; + vertexOutputs.position = gaussianSplatting(input.position, worldPos.xyz, vec2f(1.0, 1.0), covA, covB, mesh.world, scene.view, scene.projection, uniforms.focal, uniforms.invViewport, uniforms.kernelSize); +} \ No newline at end of file