比较提交

...
此合并请求有变更与目标分支冲突。
/Assets/ScriptableRenderPipeline/fptl/FptlLighting.cs

25 次代码提交

作者 SHA1 备注 提交日期
Evgenii Golubev 37728488 Increase the maximal number of lights on screen 8 年前
Evgenii Golubev abed39d7 Merge branch 'master' of https://github.com/Unity-Technologies/ScriptableRenderLoop 8 年前
GitHub ded950fb Merge pull request #217 from Unity-Technologies/metal-ios 8 年前
Antti Tapaninen a3f37d52 metal/ios: add UNITY_NO_DXT5nm path for normal maps 8 年前
GitHub 17f72c0b Merge pull request #216 from Unity-Technologies/metal-ios 8 年前
Antti Tapaninen 702dca0c fix box projection issue with DirectionToSphericalTexCoordinate 8 年前
Evgenii Golubev 7d7050ee Add a Batman cookie texture for testing 8 年前
GitHub c8ac52da Merge pull request #215 from Unity-Technologies/metal-ios 8 年前
Evgenii Golubev 456c3509 Fix cookie tiling for directional lights 8 年前
Antti Tapaninen 0bf56e55 Merge branch 'master' into metal-ios 8 年前
Torbjorn Laedre bc798247 Add context to warning about missing additional light data. 8 年前
Evgenii Golubev 6b6c6c54 Implement pyramid projector lights 8 年前
runes c17ae966 fixed ps4 shader compilation errors 8 年前
Julien Ignace 526ece06 Fixed a parameter inversion in wind computation. 8 年前
Evgenii Golubev c4ee2251 Fix projector light dimensions 8 年前
GitHub 2bab5440 Merge pull request #214 from Unity-Technologies/Branch_FixDisableLastLight 8 年前
Evgenii Golubev 6c81aaea Implement tile & cluster support for orthographic projector lights 8 年前
Julien Ignace f4ab45df Fixed a bug where disabling the last light in the scene would not work. 8 年前
Evgenii Golubev f5b4c7e9 Implement orthographic projector lights (single pass loop only) 8 年前
Antti Tapaninen 097f384d metal/ios: proper fix for out of bounds issue with g_vBigTileLightList 8 年前
GitHub f953917f Merge pull request #213 from Unity-Technologies/Branch_FixNewMaterial 8 年前
Evgenii Golubev 08262cdc Implement ZERO_INITIALIZE_ARRAY() 8 年前
Robert Srinivasiah f5f9f47b Return correct light count from GenerateSourceLightBuffers 8 年前
GitHub cfabde6f Merge pull request #212 from Unity-Technologies/metal-ios 8 年前
Julien Ignace e3b0e0d8 Fixed the stencil ref default value for lit/littesselation shaders. Wrong value was causing new materials to be black until changed. 8 年前
共有 33 个文件被更改,包括 1400 次插入415 次删除
  1. 2
      ProjectSettings/ProjectVersion.txt
  2. 2
      Assets/ShaderGenerator/Editor/ShaderTypeGeneration.cs
  3. 42
      Assets/LowEndMobilePipeline/LowEndMobilePipeline.cs
  4. 631
      Assets/TestScenes/HDTest/HDRenderLoopTest.unity
  5. 3
      Assets/ScriptableRenderPipeline/common/CubeToSpherical.shader
  6. 3
      Assets/ScriptableRenderPipeline/common/ShaderBase.h
  7. 8
      Assets/ScriptableRenderPipeline/AdditionalLightData.cs
  8. 4
      Assets/ScriptableRenderPipeline/fptl/lightlistbuild-bigtile.compute
  9. 2
      Assets/ScriptableRenderPipeline/fptl/lightlistbuild-clustered.compute
  10. 2
      Assets/ScriptableRenderPipeline/fptl/lightlistbuild.compute
  11. 1
      Assets/ScriptableRenderPipeline/ShaderLibrary/API/D3D11.hlsl
  12. 1
      Assets/ScriptableRenderPipeline/ShaderLibrary/API/Metal.hlsl
  13. 1
      Assets/ScriptableRenderPipeline/ShaderLibrary/API/PSSL.hlsl
  14. 3
      Assets/ScriptableRenderPipeline/ShaderLibrary/Common.hlsl
  15. 10
      Assets/ScriptableRenderPipeline/ShaderLibrary/SampleUVMappingInternal.hlsl
  16. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Shadow/Shadow.cs
  17. 21
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Shadow/ShadowUtilities.cs
  18. 118
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.hlsl
  19. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.shader
  20. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitTessellation.shader
  21. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/VertMesh.hlsl
  22. 6
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/LightDefinition.cs
  23. 4
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild-bigtile.compute
  24. 9
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild-clustered.compute
  25. 8
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild.compute
  26. 32
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/FeatureFlags.hlsl
  27. 10
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.cs.hlsl
  28. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.hlsl
  29. 36
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePassLoop.hlsl
  30. 445
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.cs
  31. 202
      Assets/Textures/Batman.png
  32. 98
      Assets/Textures/Batman.png.meta
  33. 101
      Assets/Textures/cookieTest.png.meta

2
ProjectSettings/ProjectVersion.txt


m_EditorVersion: 2017.1.0a6
m_EditorVersion: 2017.1.0b2

2
Assets/ShaderGenerator/Editor/ShaderTypeGeneration.cs


shaderText += "{\n";
foreach (var shaderFieldInfo in m_PackedFields)
{
shaderText += "\t" + shaderFieldInfo.ToString() + "\n";
shaderText += " " + shaderFieldInfo.ToString() + "\n";
}
shaderText += "};\n";

42
Assets/LowEndMobilePipeline/LowEndMobilePipeline.cs


namespace UnityEngine.Experimental.Rendering.LowendMobile
{
[Serializable]
public class ShadowSettings
{
public bool enabled;
public int shadowAtlasWidth;
public int shadowAtlasHeight;
public float maxShadowDistance;
public int directionalLightCascadeCount;
public Vector3 directionalLightCascades;
public float directionalLightNearPlaneOffset;
static ShadowSettings defaultShadowSettings = null;
public static ShadowSettings Default
{
get
{
if (defaultShadowSettings == null)
{
defaultShadowSettings = new ShadowSettings();
defaultShadowSettings.enabled = true;
defaultShadowSettings.shadowAtlasHeight = defaultShadowSettings.shadowAtlasWidth = 4096;
defaultShadowSettings.directionalLightCascadeCount = 1;
defaultShadowSettings.directionalLightCascades = new Vector3(0.05F, 0.2F, 0.3F);
defaultShadowSettings.directionalLightCascadeCount = 4;
defaultShadowSettings.directionalLightNearPlaneOffset = 5;
defaultShadowSettings.maxShadowDistance = 1000.0F;
}
return defaultShadowSettings;
}
}
}
public struct ShadowSliceData
{
public Matrix4x4 shadowTransform;
public int atlasX;
public int atlasY;
public int shadowResolution;
}
public class LowEndMobilePipeline : RenderPipeline, IComparer<VisibleLight>
{
private readonly LowEndMobilePipelineAsset m_Asset;

631
Assets/TestScenes/HDTest/HDRenderLoopTest.unity
文件差异内容过多而无法显示
查看文件

3
Assets/ScriptableRenderPipeline/common/CubeToSpherical.shader


return o;
}
half2 DirectionToSphericalTexCoordinate(half3 dir) // use this for the lookup
half2 DirectionToSphericalTexCoordinate(half3 dir_in) // use this for the lookup
half3 dir = normalize(dir_in);
// coordinate frame is (-Z,X) meaning negative Z is primary axis and X is secondary axis.
float recipPi = 1.0/3.1415926535897932384626433832795;
return half2( 1.0-0.5*recipPi*atan2(dir.x, -dir.z), asin(dir.y)*recipPi+0.5 );

3
Assets/ScriptableRenderPipeline/common/ShaderBase.h


#ifndef __SHADERBASE_H__
#define __SHADERBASE_H__
half2 DirectionToSphericalTexCoordinate(half3 dir)
half2 DirectionToSphericalTexCoordinate(half3 dir_in)
half3 dir = normalize(dir_in);
// coordinate frame is (-Z,X) meaning negative Z is primary axis and X is secondary axis.
float recipPi = 1.0 / 3.1415926535897932384626433832795;
return half2(1.0 - 0.5 * recipPi * atan2(dir.x, -dir.z), asin(dir.y) * recipPi + 0.5);

8
Assets/ScriptableRenderPipeline/AdditionalLightData.cs


namespace UnityEngine.Experimental.Rendering
{
public enum LightArchetype { Punctual, Rectangle, Line };
public enum LightArchetype { Punctual, Area, Projector };
//@TODO: We should continuously move these values
// into the engine when we can see them being generally useful

public bool affectSpecular = true;
public LightArchetype archetype = LightArchetype.Punctual;
public bool isDoubleSided = false;
public bool isDoubleSided = false; // Rectangular area lights only
public float areaLightLength = 0.0f;
public float lightLength = 0.0f; // Area & projector lights
public float areaLightWidth = 0.0f;
public float lightWidth = 0.0f; // Area & projector lights
}
}

4
Assets/ScriptableRenderPipeline/fptl/lightlistbuild-bigtile.compute


if(t==0) lightOffs = 0;
GroupMemoryBarrierWithGroupSync();
int i;
for(i=t; i<iNrCoarseLights; i+=NR_THREADS) if((int)lightsListLDS[i]<g_iNrVisibLights) InterlockedAdd(lightOffs, 1);
for(i=t; i<iNrCoarseLights; i+=NR_THREADS) if(lightsListLDS[i]<(uint)g_iNrVisibLights) InterlockedAdd(lightOffs, 1);
GroupMemoryBarrierWithGroupSync();
iNrCoarseLights = lightOffs;

g_vLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*offs + i] = i==0 ? iNrCoarseLights : lightsListLDS[i-1];
g_vLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*offs + i] = i==0 ? iNrCoarseLights : lightsListLDS[max(i-1, 0)];
}

2
Assets/ScriptableRenderPipeline/fptl/lightlistbuild-clustered.compute


int nrBigTileLights = g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+0];
for(int l0=(int) t; l0<(int) nrBigTileLights; l0 += NR_THREADS)
{
int l = min(g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+l0+1], g_iNrVisibLights);
int l = g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+l0+1];
#else
for(int l=(int) t; l<(int) g_iNrVisibLights; l += NR_THREADS)
{

2
Assets/ScriptableRenderPipeline/fptl/lightlistbuild.compute


int nrBigTileLights = g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+0];
for(int l0=(int) t; l0<(int) nrBigTileLights; l0 += NR_THREADS)
{
int l = min(g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+l0+1], g_iNrVisibLights);
int l = g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+l0+1];
#else
for(int l=(int) t; l<(int) g_iNrVisibLights; l += NR_THREADS)
{

1
Assets/ScriptableRenderPipeline/ShaderLibrary/API/D3D11.hlsl


// Initialize arbitrary structure with zero values.
// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0
#define ZERO_INITIALIZE(type, name) name = (type)0;
#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }
// Texture util abstraction

1
Assets/ScriptableRenderPipeline/ShaderLibrary/API/Metal.hlsl


// Initialize arbitrary structure with zero values.
// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0
#define ZERO_INITIALIZE(type, name) name = (type)0;
#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }
// Texture util abstraction

1
Assets/ScriptableRenderPipeline/ShaderLibrary/API/PSSL.hlsl


// Initialize arbitrary structure with zero values.
// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0
#define ZERO_INITIALIZE(type, name) name = (type)0;
#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }
// Texture util abstraction

3
Assets/ScriptableRenderPipeline/ShaderLibrary/Common.hlsl


// Texture format sampling
// ----------------------------------------------------------------------------
float2 DirectionToLatLongCoordinate(float3 dir)
float2 DirectionToLatLongCoordinate(float3 dir_in)
float3 dir = normalize(dir_in);
// coordinate frame is (-Z, X) meaning negative Z is primary axis and X is secondary axis.
return float2(1.0 - 0.5 * INV_PI * atan2(dir.x, -dir.z), asin(dir.y) * INV_PI + 0.5);
}

10
Assets/ScriptableRenderPipeline/ShaderLibrary/SampleUVMappingInternal.hlsl


// TODO: Handle BC5 format, currently this code is for DXT5nm - After the change, rename this function UnpackNormalmapRGorAG
// This version is use for the base normal map
#define ADD_NORMAL_FUNC_SUFFIX(Name) Name
#if defined(UNITY_NO_DXT5nm)
#define UNPACK_NORMAL_FUNC UnpackNormalRGB
#define UNPACK_DERIVATIVE_FUNC UnpackDerivativeNormalRGB
#else
#endif
#include "SampleUVMappingNormalInternal.hlsl"
#undef ADD_NORMAL_FUNC_SUFFIX
#undef UNPACK_NORMAL_FUNC

#define ADD_NORMAL_FUNC_SUFFIX(Name) Name##AG
#if defined(UNITY_NO_DXT5nm)
#define UNPACK_NORMAL_FUNC UnpackNormalRGB
#define UNPACK_DERIVATIVE_FUNC UnpackDerivativeNormalRGB
#else
#endif
#include "SampleUVMappingNormalInternal.hlsl"
#undef ADD_NORMAL_FUNC_SUFFIX
#undef UNPACK_NORMAL_FUNC

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/Shadow/Shadow.cs


// set light specific values that are not related to the shadowmap
GPUShadowType shadowtype;
ShadowUtils.MapLightType(ald.archetype, vl.lightType, out sd.lightType, out shadowtype);
ShadowUtils.MapLightType(vl.lightType, ald, out sd.lightType, out shadowtype);
sd.bias = l.shadowBias;
sd.quality = 0;

21
Assets/ScriptableRenderPipeline/HDRenderPipeline/Shadow/ShadowUtilities.cs


return proj * view;
}
public static bool MapLightType(LightArchetype la, LightType lt, out GPULightType gputype, out GPUShadowType shadowtype)
public static bool MapLightType(LightType lt, AdditionalLightData ald, out GPULightType gputype, out GPUShadowType shadowtype)
switch (la)
shadowtype = GPUShadowType.Unknown; // Default for all non-punctual lights
gputype = GPULightType.Spot;
switch (ald.archetype)
case LightArchetype.Punctual: return MapLightType(lt, out gputype, out shadowtype);
case LightArchetype.Rectangle: gputype = GPULightType.Rectangle; shadowtype = GPUShadowType.Unknown; return true;
case LightArchetype.Line: gputype = GPULightType.Line; shadowtype = GPUShadowType.Unknown; return true;
default: gputype = GPULightType.Spot; shadowtype = GPUShadowType.Unknown; return false; // <- probably not what you want
case LightArchetype.Punctual: return MapLightType(lt, out gputype, out shadowtype);
case LightArchetype.Area: gputype = (ald.lightWidth > 0) ? GPULightType.Rectangle : GPULightType.Line; return true;
case LightArchetype.Projector:
switch (lt)
{
case LightType.Directional: gputype = GPULightType.ProjectorOrtho; return true;
case LightType.Spot: gputype = GPULightType.ProjectorPyramid; return true;
default: Debug.Assert(false, "Projectors can only be Spot or Directional lights."); return false;
}
default: return false; // <- probably not what you want
}
}

118
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.hlsl


// Project 'unL' onto the light's axes.
float2 coord = float2(dot(unL, lightData.right), dot(unL, lightData.up));
// Rescale the texture.
// Compute the NDC coordinates (in [-1, 1]^2).
// Remap the texture coordinates from [-1, 1]^2 to [0, 1]^2.
coord = coord * 0.5 + 0.5;
if (lightData.tileCookie || (abs(coord.x) <= 1 && abs(coord.y) <= 1))
{
// Remap the texture coordinates from [-1, 1]^2 to [0, 1]^2.
coord = coord * 0.5 + 0.5;
// Tile the texture if the 'repeat' wrap mode is enabled.
if (lightData.tileCookie)
coord = frac(coord);
// Tile the texture if the 'repeat' wrap mode is enabled.
if (lightData.tileCookie) { coord = frac(coord); }
cookie = SampleCookie2D(lightLoopContext, coord, lightData.cookieIndex);
cookie = SampleCookie2D(lightLoopContext, coord, lightData.cookieIndex);
}
else
{
cookie = float4(0, 0, 0, 0);
}
illuminance *= cookie.a;
}

float shadow = GetPunctualShadowAttenuation(lightLoopContext, lightData.lightType, biasedPositionWS + offset, lightData.shadowIndex, L, posInput.unPositionSS);
#endif
shadow = lerp(1.0, shadow, lightData.shadowDimmer);
illuminance *= shadow;
}
illuminance *= cookie.a;
// The difference between the Disney Diffuse and the Lambertian BRDF for transmittance is negligible.
float3 backLight = (cookie.rgb * lightData.color) * (illuminance * lightData.diffuseScale * Lambert());
// TODO: multiplication by 'diffuseColor' and 'transmittance' is the same for each light.
float3 transmittedLight = backLight * bsdfData.diffuseColor * bsdfData.transmittance;
// We use diffuse lighting for accumulation since it is going to be blurred during the SSS pass.
diffuseLighting += transmittedLight;
}
}
//-----------------------------------------------------------------------------
// EvaluateBSDF_Projector
//-----------------------------------------------------------------------------
void EvaluateBSDF_Projector(LightLoopContext lightLoopContext,
float3 V, PositionInputs posInput, PreLightData preLightData, LightData lightData, BSDFData bsdfData,
out float3 diffuseLighting,
out float3 specularLighting)
{
float3 positionWS = posInput.positionWS;
// Translate and rotate 'positionWS' into the light space.
float3 positionLS = mul(positionWS - lightData.positionWS,
transpose(float3x3(lightData.right, lightData.up, lightData.forward)));
if (lightData.lightType == GPULIGHTTYPE_PROJECTOR_PYRAMID)
{
// Perform perspective division.
positionLS *= rcp(positionLS.z);
}
else
{
// For orthographic projection, the Z coordinate plays no role.
positionLS.z = 0;
}
// Compute the NDC position (in [-1, 1]^2). TODO: precompute the inverse?
float2 positionNDC = positionLS.xy * rcp(0.5 * lightData.size);
// Perform clipping.
float clipFactor = ((positionLS.z >= 0) && (abs(positionNDC.x) <= 1 && abs(positionNDC.y) <= 1)) ? 1 : 0;
float3 L = -lightData.forward; // Lights are pointing backward in Unity
float illuminance = saturate(dot(bsdfData.normalWS, L) * clipFactor);
diffuseLighting = float3(0.0, 0.0, 0.0);
specularLighting = float3(0.0, 0.0, 0.0);
float4 cookie = float4(1.0, 1.0, 1.0, 1.0);
[branch] if (lightData.shadowIndex >= 0 && illuminance > 0.0)
{
#ifdef SHADOWS_USE_SHADOWCTXT
float shadow = GetDirectionalShadowAttenuation(lightLoopContext.shadowContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS);
#else
float shadow = GetDirectionalShadowAttenuation(lightLoopContext, positionWS, lightData.shadowIndex, L, posInput.unPositionSS);
#endif
illuminance *= shadow;
}
[branch] if (lightData.cookieIndex >= 0 && illuminance > 0.0)
{
// Compute the texture coordinates in [0, 1]^2.
float2 coord = positionNDC * 0.5 + 0.5;
cookie = SampleCookie2D(lightLoopContext, coord, lightData.cookieIndex);
illuminance *= cookie.a;
}
[branch] if (illuminance > 0.0)
{
BSDF(V, L, positionWS, preLightData, bsdfData, diffuseLighting, specularLighting);
diffuseLighting *= (cookie.rgb * lightData.color) * (illuminance * lightData.diffuseScale);
specularLighting *= (cookie.rgb * lightData.color) * (illuminance * lightData.specularScale);
}
[branch] if (bsdfData.enableTransmission)
{
// Reverse the normal.
illuminance = saturate(dot(-bsdfData.normalWS, L));
[branch] if (lightData.shadowIndex >= 0 && illuminance > 0.0)
{
// TODO: factor out the biased position?
float3 biasedPositionWS = positionWS + bsdfData.normalWS * bsdfData.thickness;
#ifdef SHADOWS_USE_SHADOWCTXT
float shadow = GetDirectionalShadowAttenuation(lightLoopContext.shadowContext, biasedPositionWS, lightData.shadowIndex, L, posInput.unPositionSS);
#else
float shadow = GetDirectionalShadowAttenuation(lightLoopContext, biasedPositionWS, lightData.shadowIndex, L, posInput.unPositionSS);
#endif
illuminance *= shadow;
}

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.shader


_HorizonFade("Horizon fade", Range(0.0, 5.0)) = 1.0
// Stencil state
[HideInInspector] _StencilRef("_StencilRef", Int) = 1
[HideInInspector] _StencilRef("_StencilRef", Int) = 2 // StencilBits.Standard
// Blending state
[HideInInspector] _SurfaceType("__surfacetype", Float) = 0.0

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitTessellation.shader


_HorizonFade("Horizon fade", Range(0.0, 5.0)) = 1.0
// Stencil state
[HideInInspector] _StencilRef("_StencilRef", Int) = 1
[HideInInspector] _StencilRef("_StencilRef", Int) = 2 // StencilBits.Standard
// Blending state
[HideInInspector] _SurfaceType("__surfacetype", Float) = 0.0

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/VertMesh.hlsl


#if _VERTEX_WIND
float3 rootWP = mul(GetObjectToWorldMatrix(), float4(0, 0, 0, 1)).xyz;
ApplyWind(positionWS, normalWS, rootWP, _Drag, _Stiffness, _ShiverDrag, _InitialBend, vertexColor.a, _Time);
ApplyWind(positionWS, normalWS, rootWP, _Stiffness, _Drag, _ShiverDrag, _InitialBend, vertexColor.a, _Time);
#endif
#ifdef TESSELLATION_ON

6
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/LightDefinition.cs


public int cookieIndex;
public GPULightType lightType;
// Area Light specific
public Vector2 size; // x = cot(outerHalfAngle) for spot lights
public bool twoSided;
public Vector2 size; // Used by area, projector and spot lights; x = cot(outerHalfAngle) for spot lights
public bool twoSided; // Used by rectangular area lights only
};
[GenerateHLSL]

4
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild-bigtile.compute


if(t==0) lightOffs = 0;
GroupMemoryBarrierWithGroupSync();
int i;
for(i=t; i<iNrCoarseLights; i+=NR_THREADS) if((int)lightsListLDS[i]<g_iNrVisibLights) InterlockedAdd(lightOffs, 1);
for(i=t; i<iNrCoarseLights; i+=NR_THREADS) if(lightsListLDS[i]<(uint)g_iNrVisibLights) InterlockedAdd(lightOffs, 1);
GroupMemoryBarrierWithGroupSync();
iNrCoarseLights = lightOffs;

g_vLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*offs + i] = i==0 ? iNrCoarseLights : lightsListLDS[i-1];
g_vLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*offs + i] = i==0 ? iNrCoarseLights : lightsListLDS[max(i-1, 0)];
}

9
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild-clustered.compute


int nrBigTileLights = g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+0];
for(int l0=(int) t; l0<(int) nrBigTileLights; l0 += NR_THREADS)
{
int l = min(g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+l0+1], g_iNrVisibLights);
int l = g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+l0+1];
#else
for(int l=(int) t; l<(int) g_iNrVisibLights; l += NR_THREADS)
{

// All our cull data are in the same list, but at render time envLights are separated so we need to shit the index
// to make it work correctly
int shiftIndex[LIGHTCATEGORY_COUNT] = {0, 0, _EnvLightIndexShift}; // 3 for now, will throw an error if we change LIGHTCATEGORY_COUNT
int shiftIndex[LIGHTCATEGORY_COUNT];
ZERO_INITIALIZE_ARRAY(int, shiftIndex, LIGHTCATEGORY_COUNT);
shiftIndex[LIGHTCATEGORY_COUNT - 1] = _EnvLightIndexShift;
int categoryListCount[LIGHTCATEGORY_COUNT]={0,0,0}; // direct light count and reflection lights
int categoryListCount[LIGHTCATEGORY_COUNT]; // direct light count and reflection lights
ZERO_INITIALIZE_ARRAY(int, categoryListCount, LIGHTCATEGORY_COUNT);
uint offs = start;
for(int ll=0; ll<iNrCoarseLights; ll+=4)
{

8
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild.compute


#endif
groupshared int ldsNrLightsFinal;
groupshared int ldsCategoryListCount[LIGHTCATEGORY_COUNT]; // since LIGHTCATEGORY_COUNT is 3
groupshared int ldsCategoryListCount[LIGHTCATEGORY_COUNT];
#ifdef PERFORM_SPHERICAL_INTERSECTION_TESTS
groupshared uint lightOffsSph;

int nrBigTileLights = g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+0];
for(int l0=(int) t; l0<(int) nrBigTileLights; l0 += NR_THREADS)
{
int l = min(g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+l0+1], g_iNrVisibLights);
int l = g_vBigTileLightList[MAX_NR_BIGTILE_LIGHTS_PLUSONE*bigTileIdx+l0+1];
#else
for(int l=(int) t; l<(int) g_iNrVisibLights; l += NR_THREADS)
{

// All our cull data are in the same list, but at render time envLights are separated so we need to shit the index
// to make it work correctly
int shiftIndex[LIGHTCATEGORY_COUNT] = {0, 0, _EnvLightIndexShift}; // 3 for now, will throw an error if we change LIGHTCATEGORY_COUNT
int shiftIndex[LIGHTCATEGORY_COUNT];
ZERO_INITIALIZE_ARRAY(int, shiftIndex, LIGHTCATEGORY_COUNT);
shiftIndex[LIGHTCATEGORY_COUNT - 1] = _EnvLightIndexShift;
for(int category=0; category<LIGHTCATEGORY_COUNT; category++)
{

32
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/FeatureFlags.hlsl


static const uint FeatureVariantFlags[NUM_FEATURE_VARIANTS] =
{
/* 0 */ 0 | FEATURE_FLAG_ALL_MATERIALS,
/* 1 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 2 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 3 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 3 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 5 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 6 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 7 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_ALL_MATERIALS,
/* 8 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_ALL_MATERIALS,
/* 9 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_ALL_MATERIALS,
/*10 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_ALL_MATERIALS,
/*11 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_ALL_MATERIALS,
/*12 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_ALL_MATERIALS,
/*13 */ 0xFFFFFFFF,
/*14 */ 0xFFFFFFFF,
/*15 */ 0xFFFFFFFF,
/* 0 */ 0 | FEATURE_FLAG_ALL_MATERIALS,
/* 1 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 2 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 3 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 3 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 5 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 6 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 7 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_LIGHT_PROJECTOR | FEATURE_FLAG_MATERIAL_LIT_STANDARD,
/* 8 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_ALL_MATERIALS,
/* 9 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_ALL_MATERIALS,
/* 10 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_ALL_MATERIALS,
/* 11 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_ALL_MATERIALS,
/* 12 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_ALL_MATERIALS,
/* 13 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_ALL_MATERIALS,
/* 14 */ FEATURE_FLAG_LIGHT_SKY | FEATURE_FLAG_LIGHT_DIRECTIONAL | FEATURE_FLAG_LIGHT_AREA | FEATURE_FLAG_LIGHT_PUNCTUAL | FEATURE_FLAG_LIGHT_ENV | FEATURE_FLAG_LIGHT_PROJECTOR | FEATURE_FLAG_ALL_MATERIALS,
/* 15 */ 0xFFFFFFFF
};
uint FeatureFlagsToTileVariant(uint featureFlags)

10
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.cs.hlsl


//
#define LIGHTCATEGORY_PUNCTUAL (0)
#define LIGHTCATEGORY_AREA (1)
#define LIGHTCATEGORY_ENV (2)
#define LIGHTCATEGORY_COUNT (3)
#define LIGHTCATEGORY_PROJECTOR (2)
#define LIGHTCATEGORY_ENV (3)
#define LIGHTCATEGORY_COUNT (4)
//
// UnityEngine.Experimental.Rendering.HDPipeline.TilePass.LightFeatureFlags: static fields

#define FEATURE_FLAG_LIGHT_DIRECTIONAL (4)
#define FEATURE_FLAG_LIGHT_ENV (8)
#define FEATURE_FLAG_LIGHT_SKY (16)
#define FEATURE_FLAG_LIGHT_PROJECTOR (8)
#define FEATURE_FLAG_LIGHT_ENV (16)
#define FEATURE_FLAG_LIGHT_SKY (32)
//
// UnityEngine.Experimental.Rendering.HDPipeline.TilePass.LightDefinitions: static fields

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.hlsl


#define PROCESS_DIRECTIONAL_LIGHT
#define PROCESS_PUNCTUAL_LIGHT
#define PROCESS_AREA_LIGHT
#define PROCESS_PROJECTOR_LIGHT
#endif
#if defined (LIGHTLOOP_TILE_INDIRECT) || defined(LIGHTLOOP_TILE_ALL)

uint _DirectionalLightCount;
uint _PunctualLightCount;
uint _AreaLightCount;
uint _ProjectorLightCount;
uint _EnvLightCount;
float4 _DirShadowSplitSpheres[4]; // TODO: share this max between C# and hlsl

36
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePassLoop.hlsl


}
#endif
#ifdef PROCESS_PROJECTOR_LIGHT
if(featureFlags & FEATURE_FLAG_LIGHT_PROJECTOR)
{
// TODO: Convert the for loop below to a while on each type as we know we are sorted!
uint projectorLightStart;
uint projectorLightCount;
GetCountAndStart(posInput, LIGHTCATEGORY_PROJECTOR, projectorLightStart, projectorLightCount);
for(i = 0; i < projectorLightCount; ++i)
{
float3 localDiffuseLighting, localSpecularLighting;
uint projectorIndex = FetchIndex(projectorLightStart, i);
EvaluateBSDF_Projector(context, V, posInput, prelightData, _LightDatas[projectorIndex], bsdfData,
localDiffuseLighting, localSpecularLighting);
diffuseLighting += localDiffuseLighting;
specularLighting += localSpecularLighting;
}
}
#endif
#ifdef PROCESS_ENV_LIGHT
float3 iblDiffuseLighting = float3(0.0, 0.0, 0.0);
float3 iblSpecularLighting = float3(0.0, 0.0, 0.0);

specularLighting += localSpecularLighting;
}
// Area are store with punctual, just offset the index
for (i = _PunctualLightCount; i < _AreaLightCount + _PunctualLightCount; ++i)
for (; i < _PunctualLightCount + _AreaLightCount; ++i)
{
float3 localDiffuseLighting, localSpecularLighting;

EvaluateBSDF_Area( context, V, posInput, prelightData, _LightDatas[i], bsdfData,
localDiffuseLighting, localSpecularLighting);
}
diffuseLighting += localDiffuseLighting;
specularLighting += localSpecularLighting;
}
for (; i < _PunctualLightCount + _AreaLightCount + _ProjectorLightCount; ++i)
{
float3 localDiffuseLighting, localSpecularLighting;
EvaluateBSDF_Projector( context, V, posInput, prelightData, _LightDatas[i], bsdfData,
localDiffuseLighting, localSpecularLighting);
diffuseLighting += localDiffuseLighting;
specularLighting += localSpecularLighting;

445
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.cs


{
Punctual,
Area,
Projector,
Env,
Count
}

{
public static uint FEATURE_FLAG_LIGHT_PUNCTUAL = 1 << 0;
public static uint FEATURE_FLAG_LIGHT_AREA = 1 << 1;
public static uint FEATURE_FLAG_LIGHT_PUNCTUAL = 1 << 0;
public static uint FEATURE_FLAG_LIGHT_AREA = 1 << 1;
public static uint FEATURE_FLAG_LIGHT_ENV = 1 << 3;
public static uint FEATURE_FLAG_LIGHT_SKY = 1 << 4;
public static uint FEATURE_FLAG_LIGHT_PROJECTOR = 1 << 3;
public static uint FEATURE_FLAG_LIGHT_ENV = 1 << 4;
public static uint FEATURE_FLAG_LIGHT_SKY = 1 << 5;
}
[GenerateHLSL]

public class LightLoop : BaseLightLoop
{
public const int k_MaxDirectionalLightsOnScreen = 10;
public const int k_MaxPunctualLightsOnScreen = 512;
public const int k_MaxAreaLightsOnSCreen = 128;
public const int k_MaxLightsOnScreen = k_MaxDirectionalLightsOnScreen + k_MaxPunctualLightsOnScreen + k_MaxAreaLightsOnSCreen;
public const int k_MaxDirectionalLightsOnScreen = 4;
public const int k_MaxPunctualLightsOnScreen = 512;
public const int k_MaxAreaLightsOnScreen = 64;
public const int k_MaxProjectorLightsOnScreen = 64;
public const int k_MaxLightsOnScreen = k_MaxDirectionalLightsOnScreen + k_MaxPunctualLightsOnScreen + k_MaxAreaLightsOnScreen + k_MaxProjectorLightsOnScreen;
public const int k_MaxEnvLightsOnScreen = 64;
public const int k_MaxShadowOnScreen = 16;
public const int k_MaxCascadeCount = 4; //Should be not less than m_Settings.directionalLightCascadeCount;

LightList m_lightList;
int m_punctualLightCount = 0;
int m_areaLightCount = 0;
int m_projectorLightCount = 0;
int m_lightCount = 0;
private ComputeShader buildScreenAABBShader { get { return m_PassResources.buildScreenAABBShader; } }

m_lightList.Allocate();
s_DirectionalLightDatas = new ComputeBuffer(k_MaxDirectionalLightsOnScreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(DirectionalLightData)));
s_LightDatas = new ComputeBuffer(k_MaxPunctualLightsOnScreen + k_MaxAreaLightsOnSCreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(LightData)));
s_LightDatas = new ComputeBuffer(k_MaxPunctualLightsOnScreen + k_MaxAreaLightsOnScreen + k_MaxProjectorLightsOnScreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(LightData)));
s_EnvLightDatas = new ComputeBuffer(k_MaxEnvLightsOnScreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(EnvLightData)));
s_shadowDatas = new ComputeBuffer(k_MaxCascadeCount + k_MaxShadowOnScreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(ShadowData)));

lightData.cookieIndex = m_CubeCookieTexArray.FetchSlice(light.light.cookie);
break;
}
if (additionalData.archetype == LightArchetype.Projector)
{
lightData.cookieIndex = m_CookieTexArray.FetchSlice(light.light.cookie);
}
}
float shadowDistanceFade = ComputeLinearDistanceFade(distanceToCamera, additionalData.shadowFadeDistance);

if (additionalData.archetype != LightArchetype.Punctual)
{
lightData.twoSided = additionalData.isDoubleSided;
lightData.size = new Vector2(additionalData.areaLightLength, additionalData.areaLightWidth);
lightData.size = new Vector2(additionalData.lightLength, additionalData.lightWidth);
}
m_lightList.lights.Add(lightData);

lightVolumeData.lightCategory = (uint)lightCategory;
lightVolumeData.lightVolume = (uint)lightVolumeType;
if (gpuLightType == GPULightType.Spot)
if (gpuLightType == GPULightType.Spot || gpuLightType == GPULightType.ProjectorPyramid)
Vector3 lightDir = lightToWorld.GetColumn(2); // Z axis in world space
Vector3 lightDir = lightToWorld.GetColumn(2);
var vz = lightDir; // Z axis in world space
Vector3 vz = lightDir; // Z axis in world space
// transform to camera space (becomes a left hand coordinate frame in Unity since Determinant(worldToView)<0)
vx = worldToView.MultiplyVector(vx);

const float degToRad = (float)(pi / 180.0);
var sa = light.light.spotAngle;
if (gpuLightType == GPULightType.ProjectorPyramid)
{
Vector3 lightPosToProjWindowCorner = (0.5f * lightData.size.x) * vx + (0.5f * lightData.size.y) * vy + 1.0f * vz;
cs = Vector3.Dot(vz, Vector3.Normalize(lightPosToProjWindowCorner));
si = Mathf.Sqrt(1.0f - cs * cs);
}
const float FltMax = 3.402823466e+38F;
var ta = cs > 0.0f ? (si / cs) : FltMax;
var cota = si > 0.0f ? (cs / si) : FltMax;

fAltDx *= range; fAltDy *= range;
// Handle case of pyramid with this select
var altDist = Mathf.Sqrt(fAltDy * fAltDy + (gpuLightType == GPULightType.Spot ? 1.0f : 2.0f) * fAltDx * fAltDx);
// Handle case of pyramid with this select (currently unused)
var altDist = Mathf.Sqrt(fAltDy * fAltDy + (true ? 1.0f : 2.0f) * fAltDx * fAltDx);
bound.radius = altDist > (0.5f * range) ? altDist : (0.5f * range); // will always pick fAltDist
bound.scaleXY = squeeze ? new Vector2(0.01f, 0.01f) : new Vector2(1.0f, 1.0f);

lightVolumeData.lightPos = worldToView.MultiplyPoint(lightPos);
lightVolumeData.radiusSq = range * range;
lightVolumeData.cotan = cota;
lightVolumeData.featureFlags = LightFeatureFlags.FEATURE_FLAG_LIGHT_PUNCTUAL;
lightVolumeData.featureFlags = (gpuLightType == GPULightType.Spot) ? LightFeatureFlags.FEATURE_FLAG_LIGHT_PUNCTUAL
: LightFeatureFlags.FEATURE_FLAG_LIGHT_PROJECTOR;
}
else if (gpuLightType == GPULightType.Point)
{

lightVolumeData.boxInvRange.Set(1.0f / radius, 1.0f / radius, 1.0f / radius);
lightVolumeData.featureFlags = LightFeatureFlags.FEATURE_FLAG_LIGHT_AREA;
}
else if (gpuLightType == GPULightType.ProjectorOrtho)
{
Vector3 posVS = worldToView.MultiplyPoint(lightData.positionWS);
Vector3 xAxisVS = worldToView.MultiplyVector(lightData.right);
Vector3 yAxisVS = worldToView.MultiplyVector(lightData.up);
Vector3 zAxisVS = worldToView.MultiplyVector(lightData.forward);
// Projector lights point forwards (along Z). The projection window is aligned with the XY plane.
Vector3 boxDims = new Vector3(lightData.size.x, lightData.size.y, 1000000.0f);
Vector3 halfDims = 0.5f * boxDims;
bound.center = posVS;
bound.boxAxisX = halfDims.x * xAxisVS; // Should this be halved or not?
bound.boxAxisY = halfDims.y * yAxisVS; // Should this be halved or not?
bound.boxAxisZ = halfDims.z * zAxisVS; // Should this be halved or not?
bound.radius = halfDims.magnitude; // Radius of a circumscribed sphere?
bound.scaleXY.Set(1.0f, 1.0f);
lightVolumeData.lightPos = posVS; // Is this the center of the volume?
lightVolumeData.lightAxisX = xAxisVS;
lightVolumeData.lightAxisY = yAxisVS;
lightVolumeData.lightAxisZ = zAxisVS;
lightVolumeData.boxInnerDist = halfDims; // No idea what this is. Document your code
lightVolumeData.boxInvRange.Set(1.0f / halfDims.x, 1.0f / halfDims.y, 1.0f / halfDims.z); // No idea what this is. Document your code
lightVolumeData.featureFlags = LightFeatureFlags.FEATURE_FLAG_LIGHT_PROJECTOR;
}
// TODO implement unsupported type
Debug.Assert(false);
Debug.Assert(false, "TODO: encountered an unknown GPULightType.");
}
m_lightList.bounds.Add(bound);

{
m_lightList.Clear();
if (cullResults.visibleLights.Length == 0 && cullResults.visibleReflectionProbes.Length == 0)
return;
if (cullResults.visibleLights.Length != 0 || cullResults.visibleReflectionProbes.Length != 0)
{
// 0. deal with shadows
{
m_FrameId.frameCount++;
// get the indices for all lights that want to have shadows
m_ShadowRequests.Clear();
m_ShadowRequests.Capacity = cullResults.visibleLights.Length;
int lcnt = cullResults.visibleLights.Length;
for (int i = 0; i < lcnt; ++i)
// 0. deal with shadows
if (cullResults.visibleLights[i].light.shadows != LightShadows.None)
m_ShadowRequests.Add(i);
m_FrameId.frameCount++;
// get the indices for all lights that want to have shadows
m_ShadowRequests.Clear();
m_ShadowRequests.Capacity = cullResults.visibleLights.Length;
int lcnt = cullResults.visibleLights.Length;
for (int i = 0; i < lcnt; ++i)
{
if (cullResults.visibleLights[i].light.shadows != LightShadows.None)
m_ShadowRequests.Add(i);
}
// pass this list to a routine that assigns shadows based on some heuristic
uint shadowRequestCount = (uint)m_ShadowRequests.Count;
int[] shadowRequests = m_ShadowRequests.ToArray();
int[] shadowDataIndices;
uint originalRequestCount = shadowRequestCount;
m_ShadowMgr.ProcessShadowRequests(m_FrameId, cullResults, camera, cullResults.visibleLights,
ref shadowRequestCount, shadowRequests, out shadowDataIndices);
// update the visibleLights with the shadow information
m_ShadowIndices.Clear();
for (uint i = 0; i < shadowRequestCount; i++)
{
m_ShadowIndices.Add(shadowRequests[i], shadowDataIndices[i]);
}
// pass this list to a routine that assigns shadows based on some heuristic
uint shadowRequestCount = (uint)m_ShadowRequests.Count;
int[] shadowRequests = m_ShadowRequests.ToArray();
int[] shadowDataIndices;
uint originalRequestCount = shadowRequestCount;
m_ShadowMgr.ProcessShadowRequests(m_FrameId, cullResults, camera, cullResults.visibleLights,
ref shadowRequestCount, shadowRequests, out shadowDataIndices);
// update the visibleLights with the shadow information
m_ShadowIndices.Clear();
for (uint i = 0; i < shadowRequestCount; i++)
#endif
float oldSpecularGlobalDimmer = m_PassSettings.specularGlobalDimmer;
// Change some parameters in case of "special" rendering (can be preview, reflection, etc.
if (camera.cameraType == CameraType.Reflection)
m_ShadowIndices.Add(shadowRequests[i], shadowDataIndices[i]);
m_PassSettings.specularGlobalDimmer = 0.0f;
}
#endif
float oldSpecularGlobalDimmer = m_PassSettings.specularGlobalDimmer;
// Change some parameters in case of "special" rendering (can be preview, reflection, etc.
if (camera.cameraType == CameraType.Reflection)
{
m_PassSettings.specularGlobalDimmer = 0.0f;
}
// 1. Count the number of lights and sort all light by category, type and volume
int directionalLightcount = 0;
int punctualLightcount = 0;
int areaLightCount = 0;
// 1. Count the number of lights and sort all light by category, type and volume
int directionalLightcount = 0;
int punctualLightcount = 0;
int areaLightCount = 0;
int projectorLightCount = 0;
int lightCount = Math.Min(cullResults.visibleLights.Length, k_MaxLightsOnScreen);
var sortKeys = new uint[lightCount];
int sortCount = 0;
int lightCount = Math.Min(cullResults.visibleLights.Length, k_MaxLightsOnScreen);
var sortKeys = new uint[lightCount];
int sortCount = 0;
for (int lightIndex = 0, numLights = cullResults.visibleLights.Length; (lightIndex < numLights) && (sortCount < lightCount); ++lightIndex)
{
var light = cullResults.visibleLights[lightIndex];
for (int lightIndex = 0, numLights = cullResults.visibleLights.Length; (lightIndex < numLights) && (sortCount < lightCount); ++lightIndex)
{
var light = cullResults.visibleLights[lightIndex];
// We only process light with additional data
var additionalData = light.light.GetComponent<AdditionalLightData>();
// We only process light with additional data
var additionalData = light.light.GetComponent<AdditionalLightData>();
if (additionalData == null)
{
// Don't display warning for the preview windows
if (camera.cameraType != CameraType.Preview)
if (additionalData == null)
Debug.LogWarningFormat("Light entity {0} has no additional data, will be rendered using default values.", light.light.name);
// Don't display warning for the preview windows
if (camera.cameraType != CameraType.Preview)
{
Debug.LogWarningFormat(light.light, "Light entity {0} has no additional data, will be rendered using default values.", light.light.name);
}
additionalData = DefaultAdditionalLightData;
additionalData = DefaultAdditionalLightData;
}
LightCategory lightCategory = LightCategory.Count;
GPULightType gpuLightType = GPULightType.Point;
LightVolumeType lightVolumeType = LightVolumeType.Count;
LightCategory lightCategory = LightCategory.Count;
GPULightType gpuLightType = GPULightType.Point;
LightVolumeType lightVolumeType = LightVolumeType.Count;
// Note: LightType.Area is offline only, use for baking, no need to test it
if (additionalData.archetype == LightArchetype.Punctual)

break;
default:
continue;
Debug.Assert(false, "TODO: encountered an unknown LightType.");
break;
}
}
else

case LightArchetype.Rectangle:
if (areaLightCount >= k_MaxAreaLightsOnSCreen)
continue;
lightCategory = LightCategory.Area;
gpuLightType = GPULightType.Rectangle;
case LightArchetype.Area:
if (areaLightCount >= k_MaxAreaLightsOnScreen) { continue; }
lightCategory = LightCategory.Area;
gpuLightType = (additionalData.lightWidth > 0) ? GPULightType.Rectangle : GPULightType.Line;
case LightArchetype.Line:
if (areaLightCount >= k_MaxAreaLightsOnSCreen)
continue;
lightCategory = LightCategory.Area;
gpuLightType = GPULightType.Line;
lightVolumeType = LightVolumeType.Box;
case LightArchetype.Projector:
if (projectorLightCount >= k_MaxProjectorLightsOnScreen) { continue; }
lightCategory = LightCategory.Projector;
switch (light.lightType)
{
case LightType.Directional:
gpuLightType = GPULightType.ProjectorOrtho;
lightVolumeType = LightVolumeType.Box;
break;
case LightType.Spot:
gpuLightType = GPULightType.ProjectorPyramid;
lightVolumeType = LightVolumeType.Cone;
break;
default:
Debug.Assert(false, "Projectors can only be Spot or Directional lights.");
break;
}
continue;
Debug.Assert(false, "TODO: encountered an unknown LightArchetype.");
break;
}
}

sortKeys[sortCount++] = (uint)lightCategory << 27 | (uint)gpuLightType << 22 | (uint)lightVolumeType << 17 | shadow << 16 | (uint)lightIndex;
#else
// 5 bit (0x1F) light category, 5 bit (0x1F) GPULightType, 6 bit (0x3F) lightVolume, 16 bit index
sortKeys[sortCount++] = (uint)lightCategory << 27 | (uint)gpuLightType << 22 | (uint)lightVolumeType << 16 | (uint)lightIndex;
// 5 bit (0x1F) light category, 5 bit (0x1F) GPULightType, 6 bit (0x3F) lightVolume, 16 bit index
sortKeys[sortCount++] = (uint)lightCategory << 27 | (uint)gpuLightType << 22 | (uint)lightVolumeType << 16 | (uint)lightIndex;
}
}
Array.Sort(sortKeys);
Array.Sort(sortKeys);
// TODO: Refactor shadow management
// The good way of managing shadow:
// Here we sort everyone and we decide which light is important or not (this is the responsibility of the lightloop)
// we allocate shadow slot based on maximum shadow allowed on screen and attribute slot by bigger solid angle
// THEN we ask to the ShadowRender to render the shadow, not the reverse as it is today (i.e render shadow than expect they
// will be use...)
// The lightLoop is in charge, not the shadow pass.
// For now we will still apply the maximum of shadow here but we don't apply the sorting by priority + slot allocation yet
int directionalShadowcount = 0;
int shadowCount = 0;
// TODO: Refactor shadow management
// The good way of managing shadow:
// Here we sort everyone and we decide which light is important or not (this is the responsibility of the lightloop)
// we allocate shadow slot based on maximum shadow allowed on screen and attribute slot by bigger solid angle
// THEN we ask to the ShadowRender to render the shadow, not the reverse as it is today (i.e render shadow than expect they
// will be use...)
// The lightLoop is in charge, not the shadow pass.
// For now we will still apply the maximum of shadow here but we don't apply the sorting by priority + slot allocation yet
int directionalShadowcount = 0;
int shadowCount = 0;
// 2. Go thought all lights, convert them to GPU format.
// Create simultaneously data for culling (LigthVolumeData and rendering)
var worldToView = WorldToCamera(camera);
// 2. Go thought all lights, convert them to GPU format.
// Create simultaneously data for culling (LigthVolumeData and rendering)
var worldToView = WorldToCamera(camera);
for (int sortIndex = 0; sortIndex < sortCount; ++sortIndex)
{
// In 1. we have already classify and sorted the light, we need to use this sorted order here
uint sortKey = sortKeys[sortIndex];
LightCategory lightCategory = (LightCategory)((sortKey >> 27) & 0x1F);
GPULightType gpuLightType = (GPULightType)((sortKey >> 22) & 0x1F);
for (int sortIndex = 0; sortIndex < sortCount; ++sortIndex)
{
// In 1. we have already classify and sorted the light, we need to use this sorted order here
uint sortKey = sortKeys[sortIndex];
LightCategory lightCategory = (LightCategory)((sortKey >> 27) & 0x1F);
GPULightType gpuLightType = (GPULightType)((sortKey >> 22) & 0x1F);
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 17) & 0x1F);
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 17) & 0x1F);
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 16) & 0x3F);
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 16) & 0x3F);
#endif
int lightIndex = (int)(sortKey & 0xFFFF);
var light = cullResults.visibleLights[lightIndex];
var additionalData = light.light.GetComponent<AdditionalLightData>() ?? DefaultAdditionalLightData;
// Directional rendering side, it is separated as it is always visible so no volume to handle here
if (gpuLightType == GPULightType.Directional)
{
if (GetDirectionalLightData(shadowSettings, gpuLightType, light, additionalData, lightIndex, ref shadowOutput, ref directionalShadowcount))
directionalLightcount++;
#if (SHADOWS_ENABLED && SHADOWS_FIXSHADOWIDX)
// fix up shadow information
int shadowIdxDir;
if (m_ShadowIndices.TryGetValue(lightIndex, out shadowIdxDir))
{
var lightData = m_lightList.directionalLights[m_lightList.directionalLights.Count - 1];
lightData.shadowIndex = shadowIdxDir;
m_lightList.directionalLights[m_lightList.directionalLights.Count - 1] = lightData;
}
int lightIndex = (int)(sortKey & 0xFFFF);
continue;
}
var light = cullResults.visibleLights[lightIndex];
var additionalData = light.light.GetComponent<AdditionalLightData>() ?? DefaultAdditionalLightData;
// Punctual, area, projector lights - the rendering side.
if (GetLightData(shadowSettings, camera, gpuLightType, light, additionalData, lightIndex, ref shadowOutput, ref shadowCount))
{
switch (lightCategory)
{
case LightCategory.Punctual:
punctualLightcount++;
break;
case LightCategory.Area:
areaLightCount++;
break;
case LightCategory.Projector:
projectorLightCount++;
break;
default:
Debug.Assert(false, "TODO: encountered an unknown LightCategory.");
break;
}
// Directional rendering side, it is separated as it is always visible so no volume to handle here
if (gpuLightType == GPULightType.Directional)
{
if (GetDirectionalLightData(shadowSettings, gpuLightType, light, additionalData, lightIndex, ref shadowOutput, ref directionalShadowcount))
directionalLightcount++;
// Then culling side. Must be call in this order as we pass the created Light data to the function
GetLightVolumeDataAndBound(lightCategory, gpuLightType, lightVolumeType, light, m_lightList.lights[m_lightList.lights.Count - 1], worldToView);
}
int shadowIdxDir;
if (m_ShadowIndices.TryGetValue(lightIndex, out shadowIdxDir))
int shadowIdx;
if (m_ShadowIndices.TryGetValue(lightIndex, out shadowIdx))
var lightData = m_lightList.directionalLights[m_lightList.directionalLights.Count - 1];
lightData.shadowIndex = shadowIdxDir;
m_lightList.directionalLights[m_lightList.directionalLights.Count - 1] = lightData;
var lightData = m_lightList.lights[m_lightList.lights.Count - 1];
lightData.shadowIndex = shadowIdx;
m_lightList.lights[m_lightList.lights.Count - 1] = lightData;
continue;
// Spot, point, rect, line light - Rendering side
if (GetLightData(shadowSettings, camera, gpuLightType, light, additionalData, lightIndex, ref shadowOutput, ref shadowCount))
{
if (lightCategory == LightCategory.Punctual)
punctualLightcount++;
else if (lightCategory == LightCategory.Area)
areaLightCount++;
else
Debug.Assert(false); // Should not be anything else here.
// Then culling side. Must be call in this order as we pass the created Light data to the function
GetLightVolumeDataAndBound(lightCategory, gpuLightType, lightVolumeType, light, m_lightList.lights[m_lightList.lights.Count - 1], worldToView);
}
// Sanity check
Debug.Assert(m_lightList.directionalLights.Count == directionalLightcount);
Debug.Assert(m_lightList.lights.Count == areaLightCount + punctualLightcount + projectorLightCount);
#if (SHADOWS_ENABLED && SHADOWS_FIXSHADOWIDX)
// fix up shadow information
int shadowIdx;
if (m_ShadowIndices.TryGetValue(lightIndex, out shadowIdx))
{
var lightData = m_lightList.lights[m_lightList.lights.Count - 1];
lightData.shadowIndex = shadowIdx;
m_lightList.lights[m_lightList.lights.Count - 1] = lightData;
}
#endif
}
m_punctualLightCount = punctualLightcount;
m_areaLightCount = areaLightCount;
m_projectorLightCount = projectorLightCount;
// Sanity check
Debug.Assert(m_lightList.directionalLights.Count == directionalLightcount);
Debug.Assert(m_lightList.lights.Count == areaLightCount + punctualLightcount);
m_areaLightCount = areaLightCount;
m_punctualLightCount = punctualLightcount;
// Redo everything but this time with envLights
int envLightCount = 0;
// Redo everything but this time with envLights
int envLightCount = 0;
int probeCount = Math.Min(cullResults.visibleReflectionProbes.Length, k_MaxEnvLightsOnScreen);
sortKeys = new uint[probeCount];
sortCount = 0;
int probeCount = Math.Min(cullResults.visibleReflectionProbes.Length, k_MaxEnvLightsOnScreen);
sortKeys = new uint[probeCount];
sortCount = 0;
for (int probeIndex = 0, numProbes = cullResults.visibleReflectionProbes.Length; (probeIndex < numProbes) && (sortCount < probeCount); probeIndex++)
{
var probe = cullResults.visibleReflectionProbes[probeIndex];
for (int probeIndex = 0, numProbes = cullResults.visibleReflectionProbes.Length; (probeIndex < numProbes) && (sortCount < probeCount); probeIndex++)
{
var probe = cullResults.visibleReflectionProbes[probeIndex];
// probe.texture can be null when we are adding a reflection probe in the editor
if (probe.texture == null || envLightCount >= k_MaxEnvLightsOnScreen)
continue;
// probe.texture can be null when we are adding a reflection probe in the editor
if (probe.texture == null || envLightCount >= k_MaxEnvLightsOnScreen)
continue;
// TODO: Support LightVolumeType.Sphere, currently in UI there is no way to specify a sphere influence volume
LightVolumeType lightVolumeType = probe.boxProjection != 0 ? LightVolumeType.Box : LightVolumeType.Box;
++envLightCount;
// TODO: Support LightVolumeType.Sphere, currently in UI there is no way to specify a sphere influence volume
LightVolumeType lightVolumeType = probe.boxProjection != 0 ? LightVolumeType.Box : LightVolumeType.Box;
++envLightCount;
// 16 bit lightVolume, 16 bit index
sortKeys[sortCount++] = (uint)lightVolumeType << 16 | (uint)probeIndex;
}
// 16 bit lightVolume, 16 bit index
sortKeys[sortCount++] = (uint)lightVolumeType << 16 | (uint)probeIndex;
}
// Not necessary yet but call it for future modification with sphere influence volume
Array.Sort(sortKeys);
for (int sortIndex = 0; sortIndex < sortCount; ++sortIndex)
{
// In 1. we have already classify and sorted the light, we need to use this sorted order here
uint sortKey = sortKeys[sortIndex];
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 16) & 0xFFFF);
int probeIndex = (int)(sortKey & 0xFFFF);
// Not necessary yet but call it for future modification with sphere influence volume
Array.Sort(sortKeys);
VisibleReflectionProbe probe = cullResults.visibleReflectionProbes[probeIndex];
for (int sortIndex = 0; sortIndex < sortCount; ++sortIndex)
{
// In 1. we have already classify and sorted the light, we need to use this sorted order here
uint sortKey = sortKeys[sortIndex];
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 16) & 0xFFFF);
int probeIndex = (int)(sortKey & 0xFFFF);
GetEnvLightData(probe);
VisibleReflectionProbe probe = cullResults.visibleReflectionProbes[probeIndex];
GetEnvLightVolumeDataAndBound(probe, lightVolumeType, worldToView);
}
GetEnvLightData(probe);
// Sanity check
Debug.Assert(m_lightList.envLights.Count == envLightCount);
GetEnvLightVolumeDataAndBound(probe, lightVolumeType, worldToView);
// Restore values after "special rendering"
m_PassSettings.specularGlobalDimmer = oldSpecularGlobalDimmer;
// Sanity check
Debug.Assert(m_lightList.envLights.Count == envLightCount);
// Restore values after "special rendering"
m_PassSettings.specularGlobalDimmer = oldSpecularGlobalDimmer;
UpdateDataBuffers();
}

SetGlobalBuffer("_LightDatas", s_LightDatas);
SetGlobalInt("_PunctualLightCount", m_punctualLightCount);
SetGlobalInt("_AreaLightCount", m_areaLightCount);
SetGlobalInt("_ProjectorLightCount", m_projectorLightCount);
SetGlobalBuffer("_EnvLightDatas", s_EnvLightDatas);
SetGlobalInt("_EnvLightCount", m_lightList.envLights.Count);
SetGlobalBuffer("_ShadowDatas", s_shadowDatas);

202
Assets/Textures/Batman.png


�PNG

IHDR{C�gAMA�� �a pHYs���o�dtEXtTitleBatman logoY y/tEXtSoftwarepaint.net 4.0.134[zщIDATx^��XT�����]��K ������ډ���-؅b��݁"�H7��������Mv��<�����93sf����3g���n��>��>�S?L؇}؇}
��� �ޕ}�GV��>����G���F��?��}�G����S�o���>2�|7�J0�M�pH�tJ�vɰ-�e��������>y??y��ppϲsE[��R��R,����Ml�Z�Ѽ��>bLm�f�
@��K|s�ā�؇}��$ �:ddڰ����d��9r>�>�}�Ǎ�nլw�B�Ӟe���v[9�0�eA�����H�bg���T����u��o��y�/]{� �5r>�#�f ��N22i���W�}؇�'�E�k����&}��� Y��Ǐϟ?;vl�…�F��رc�Z�\]]����a�������*Q�D�:u:t�0dȐ3f�Y�����_�~��Φ��`HG���c�����uz�Q�;�!&��?]�y���Svl��i�:��S�Q���*-YҦH#kM#��45���o�����651��A��/�Y�|�������޿�ةSf-Z�b��]���^ ���M�`�I���ߌ�0������ݻ/^<|���������߿���w��Ջ-j[/��2��74@������e˖mܸq�޽�,Yr���'O����~��)&&&++�^C$"& �����?���oذa�[��R����������������������l�@��c��� ФhX---�3���ͭ~��}���9s��ݻ߿O��!& 1����˗/�����۷bŊq��5o޼|�������a񩏚 x��YԪ1��)08 aA�R��ԩӧO__ߍ7������`��(������ccc�~�����[�n�����iРA�"E��R�� f� ���`jjZ�L�-Z 2d�ڵ�=�勎�ƥLLLd��& Q���?~|�ҥ#F�hժU�ҥ���`\ ���`�ak`}�&P��P ��Ʌ ���A��b��ږ+W�u��Ç_�h�������fn�0~#%%�ŋ!!!'O�ܱcǴiӼ���U�V�hQ}b\���P �P& �
�b���r��^^^cƌٺu��S�n߾���z��&�������Ғ����₃�}}}���[�NGGG�G �7, �1 ����B򰱱�_���a�v�������������O�-�&���={�k׮�S�v�ܹR�J...���FFF��g��� ccc;;�%J�n�zܸq�֭�t�����BJ||�˗/o޼y�ԩ�'6o����#�45���A�Dy�����<Pwggg�|���۽{��+W>|���{��X�aP��
�4iR�V���S��(�@LMM�U�ַoߥK��y��-;��0(D��;z���eˆ V�V-2yÞ���}�'��lS,����������1����'/�ihh�S�t2B�ۓ�]�8Z��޾x���[�?~��5kN�<���Gڍj5'99�˗/p�n߾�|��Ν;�/_���u�(� ��{1yf��AJ�k��eiiieeeccckkkgg��������� m���� +U��[�z����7m��}��]�v�իW�n���C�m۶���nٲe�f͚4iҰa�:u�ԬY�jժ*T([�l�2e�U�%�'rvwwwuuʼnpF���������̌�
_TPZn!�ʒ��v(p�h|�0�=z�^���ݻ�_�Fw��̤݋��0PsBBB-Z� +fbb������ ) 1����%�=���T�l4L9�շo�A� >|�ر�&M�9s��y� u۶m����x�"���ӧo߾�劍�MHHH��������[dd$\ݰ�0X��ϟ?~�V��͛����Ν;q���Çw�ڵy�fD�hʔ)�F��߿?�ҨQ#� ��Y��}W�H���*r!�@� f�6����ʕ�d.\��I�C�a��DGG_�ti������oӦ \`x��������
-GPH###�N�����T�R�^=///��q�����mٲe߾}�O��q�z�*�Ν;�����l��/Ȳh_�~MJJ��Ȑ�F�ϟ?��o7===%%%>>�����B� ����~�:�… gΜ9v�ءC���ݻ}��5k�����?�_�~�+T�U�V-� "������Ê6���ڊ4Z��Ǖ���w�����j�*Ԕ-:��0P���a�>|���S�fM333:v �~4�H๹Ե�0%p* �XXX�⻸� F���ݻw��#GN�6 ӦM�r���ϟUq�:�#""�޽{�T���a��ňT&N�8p��:ԩS�X�b��h
�$POO��D��hڠq)qvR��u�֨˛7o������U� ��p��y���-[:99������?�ᠣYQ�6������ߨQ��ݻ�3f������Mã�s ;22b���3��Sa�{v�Eȍ���X� �C�m@����[D3��+��nѢEժUaa���i{�A����җ�������1��ѣ�s���� Ձ ������s�έY��s��eʔ�[M��Y
����w��ZYY���+W�V�Z�ڵ;v��E�6n��800�֭[��0��>����̰��۷o9rdǎЃ�s�6�U�V5j�@x���ngg'칂�.4�}��nnnM�6�7o�ѣGoܸ���b(=LT�?~��`:g̘Ѽys��d@�;S�-�Yr�o`�������f��w��aĈ���߶m۝;w���i5���������[�¼���ѣG�&M*T�����G#�����e�r��N��F:.z�*U���Q'AB�a��DDD�ܹ�t� MLL0�8T��G>[[�����Bu���j˖-!!!O�<y����ϟ?����{������vC����͛7Ϟ={����3gV�X����Gp`aaA�A.#��ﯿ����!��ݻ7��˗/�j0�&����O�^�ti���^^^E��#��\<2�����pBa���W�\F���˖-۱clj'�_����7Zn��������w�����7~�x�Y+Vtss�144�%�׉�܂�����]b���y���ׯY(��0P0�N�<9|�p�p��=�E��CS�F��={Θ1# &&��Q (ܷo�ԩS{��Q�vmgggMM��$8������C˖-�C؋�� �Ν;�ׯ5jT���1�s��+����9~����X�j�6m��������W�\��>�;��+QQQ�^�� F�`��N�:իW�x���' ��J��~4�����#�$[�ahY��V���ŋ�ƍ��mddD����=t,���������S�r�:t�0f̘e˖!���-%CYALp��� 6��߿�ƍ===���"Ç�_h���.��Gw*Y������1����R2
&� "�>}�`�������A�LA�t�򰷷�Y�f�=�M�v�ܹ�����������t�P�����\)\�������w��mݺޮ]�
*��.L4�v��������D�>>>G���d(L�����#G�̛7�;���>W�%w��~��彼�����;v���z���'O���i�*˧O��ݻ������\ǎ�T��G7����ײy�3wttlԨѢE� �?��cL��k߿߳gO�-�7ma���9.ٯ����Y[[W�X�������###i��Hvv6�:??������m�ibb~:���~B;���;�o�Z�BP���G����d �@Y����ҥK۶m�������#������*U�}����<�݇%&&���������FEE�}�v�������U�B@�3xȼ�!C���4��NNN���P Z,�aP��|��ĉ3gάV�Z��t������yxx4h�`�ĉ�ׯG�>}J �(||��9((h��� .�ٳg�J��)��9���Ly/ T�Re�ԩG�y��ۃL�0(0233Ⴝ�~��𼴴�0��O��� +>�/|.��zzz���-[��0a���jj*-��A��P�H%++K 6K ]�r��!C�֭kccC�@��ۣ���W�\y���Ϟ=KNN��Ƞ�a�&ƭ[��̙CL����! @n��%�v��_�t�ŋ���*=��۷�X�|�B���z�J ��C�"##߽{������C�mܸ��^;� �����#*�2eJ`` - C�0P4�n?~|��9��ҥK������� |��}�Ο?Ϟ=w�ޥEQe`�P�f͚!�Q�9�(�Ν; ���W����J]�zu׮]s���ݻw�J�`��d�4ǿ�*V�X����߿���H�L͝;wF�Q�L��I��9����֯_ذa;v����;-�Z�0p�@ X%%1�qqq}��122:�<�J�@��m�6x��ZZZ���W��ť��!!!�� 9�@q<y���ϯE�NNN|
N:��ҁ�H2����˗�ׯ�����,���Zu�۷o��ި���ݱc���ʣG����P��˗ӯԎ/_�<|�
���aÆ�ɼG��$�{2�F�ѤID�8)-C�0P���ӧO/]�4�܀tw)�h�����յ��*^�x�=,Xp��%zzu$22�q�Ƥ�q
|��?~�ڵ�l��8@��<���Ö-[Ȃ���Φ����R&J@rŊ�4iҭ[�؊r2� �܁mZ�bƉ�� z6��LF@>d����%K���k�޽���iii���j�/4�^�z���<D9��m>d�b!�j��+��3��ի�3g"����%�CV�%9�U1v�W�>g��ݘla G`�O�81mڴ*U���rC��\R���vvv5kք/Fn�(լ� �Z��u����?��Qr]pE
�Kp2���Ν۸q#��r��! ��Ah���v����~�2eƍw�С��hzz�t0� ��"##۵kgbbBz0��R�7�����ܼ|��}��]�fMXX=w��r�ʤa���� ��Kvv��K�`�Ia,,,�]�F+L����I�ر���;�=� "�������v�ƍ���G�M�&r�����K�*�{Qڑ���`hhX�V�1c�ܻw/***..N �?�w�������_E�-��@���s���������:u��V�HKK���{DD��ӧ}||���6�I(@�\�"E����# ���!)Ld̳g����߽{w��3RZK�:::���M�4�9s��}�nݺE�Z�����Çs�����ɓ�g�۹sg\hR���]��o�����˗/�ܹsʔ)���wrr�wci��7�������֭[oܸ�^�&�& n�Ǐ}}}˕+G���}�C����T�V ����!������ϟ�}���lٲYF����ו*U�E�M����S�'��INN޽{w�~��/�EKK+w�&�\p,ij���#NIIa�Jِ���f͚�;�G��^i�8�;;͛7_�|��G�����nJ�0+h"�>m���@^w��Ga���iQxOh� ��3A9���S�dI�FҍKF��Ʀnݺ�f��Y�)�a -YYY>ܶm[͚5���+�]��������{�����=e�m�b�
�J|�-Z so���&M�D ��6mڰ-t� ((hɒ%:t������W$i�:u*N���X0������o޼8p���5z!��Ľ� ��upp�ի���?���p��̙CF>��� �V ]�t���E�Z�؎:y����3�>:::�{;�o ��D���cT��Q�&�����cǎΝ;;::��Tw���v�� �����괲���L�2�6�/����M���W�߾}�{B*߰�V�������+W�@�a����0v�H��122*S� �A��!.L$.����5j��'�� �����8q��'���l����a�BCC�o\\�A�7ni�ܴh�B�zy�ܹ?v�*Tx��M�
�K� �E�� ����z��޽{�*U��� �4��.����رc�ܹCO�I��>|8�tMMMt;����cI����:t��7RSS�=�����0___�qŊ8)�A@���I���J�*�7� , �_n���|���PФ!!!#G�3f�ڵkϟ?/o��,&���ٳ�]�v�����$J�Q��644�W�������B` III���Æ +R����₞Jz���Fɒ%�����!�-���dr^��ǏϞ=;eʔ:u��(Q�|���ׯ���M�
�p��H����ѣG9n2Y��а�<�X��Ԏ=��ήR�J-[�\�j�իW�;����|���-[Z�n���b�%� @_�d �=#L������̙3�Z��o�H{�8�|��gV���Y�v�ɓ'߾}��Idff&&&"">~���Y�z���iU�VU�M����z��Iʟ4��39��۷o�5�r���~��}�HE@'ٶm�r��ɲe˞={?=%%EޯY��B<Z�BSSS�Q.�d2��H-\]]'M���= #L�?��� ςXp)�&r�\�2���;�F�$BCC� �}�Q�n����LNN��T�U�ΝI3�A���Y�s���_�� �U���x����}��%U���666���0`�s8��^{6::::$$��� )�ģ� 4���m۶p}�i�`�?��ϟ??m�4�k,�ݴ��鑀�k�j�Ν�=������/^���?u��-Z@o0H4���hj�!55�]�v��S�b�ׯ_+l
�ڵk�����A7FW?q��Z ���u���ڵ�֭[�ݻ���M6��f͚�͛��ۓ2H6�9��ĤM�6�o�7�i<���$byx��ѓ`�i��o�[##�:u�̙3G~��1��#��ǟ9sf޼y�z����!#!7��L�O���U�V��cjj
_O1�v3f =��XYY�={��S)�����NKk� ��cǎ]�~�˗/�<������R
��?�x�I<p)�����ŋcbb�m�LD����ϯ~��0+�I�ῐ.���:q��۷o��I~nԫW�N�<�t�R(���B`�� 7 4x���œe�ӬY3Z��AM�ϟO�ə�oߖ/_���w���Ut
�%:OѢEiMr���gkk���w�^��r��)�Îflذ!�>o<��,���p��l0ʋ/V�X��G� �o�����իA4=����y���ݻwg̘ѩS��U����y�������#����5�C�n�S��� ������v�Zy?5��Nz��A�
^���׀8�a�)���w�܉s�(Q
D
�Ə,--�t�r��y��` 8ő���&M��F�������ss�Ν;�>}��@����}n�~��[Ј��j�S�Mlll�5hM�P�\����Ӥrm�q�Fz�<�������,ʕ���={��ᅨ�z���'OޱcǛ7o�v�+�\dJLL ��4dX�Ǘ���I6lؐ��$��
Lp���A��g�K����'X�fͭ[�޿_N�x���_�paٲep��+&�v^�̙��Ud\�R�Jњ�����رc4����D�AO)��cǪh���ޡC�|Z! rqq)S�����>|����� ��=z4:99�4A9fٲeq�T�}=���7���?~<|�p333��h�� � �aZZZNNNmڴY�r�<n�b�}���ݻw�V��߿?�#R`.�����N�x��ږVFs�ΥI� G�%��1p�@՝{�޵f͚�K\��ֶ]�v�Ǐ
�<�o%Իw�N�:�V�Z�'[n��h|a����7oދ/T4V�&���奫�Kz�� �����;���oߦ����^0z-Bo 9��d� r^.L�2E�oK�����\���=�Ϟ=+� �z�R�Mk@�D<h�XaMMMmm��M�.\��̙3r�~������k�мd�����q�[
�^L(qqq�w�nٲ%�)�W�C������q�=##�b� :�F�nnn�������x�"�N5�|���G�����ٳg4�HHH<x0.:=� �v���[�ήX���ܕ#>eʔiܸ�ƍ�_������LAH�S4lؐ����'"|�������Lr����ѣG�ԩC:� �AO"nF���G�~�d��'bt��߿߼ys֬Y0.|� ��*~�Lق���Ζ-[hID?hL���O��i
3��֭[�JoǎU}���ϟ�]��#�NF��}����0��^7�U�ܹ����`�A@�$g� `\ �}�6:ͺp� g�3�V�-d���~@�#}�nݺ�����#���I�]�׮]۾}{�<|�E,0T8 �79�@�#��ݻ���r���ʕ+�N����<y�?~�|��<x��(�..��3ȋ�"@����j/_���GLttt���n��ᅦz���T�@Z�������zL�$g��P� �i���R��ѣG�W��P�1���� n��0�!C��0�ܹ���D!�I���Y�&�\�h۶�j�S/��;w���hѢ���Cӽx���ӧw�ܹv����+p��6z{{��E�V�Z�������s��ٳgϥK��_�~��]hL�B'�a�`����x�왰��8R�x�f͚�?-*��O�_��oԴiS��2��qd�#��lc�z�Ɲ�+��� S�N%����1HOA� [3v�X���Đ��B�۷oʔ)"��sqƉ��ܼy3��H�ʓ'O� ̜9sԨQ}���QƗ�j4�plllj׮ݥK���ѣ�O��h�"�
��S�N4�H�7oEK��dggC ���h`� �lٲ��理� ��y?<|�0ڜ,tH�'���!E�Z�*�y򘻡l^�u�z$�?y�(n_Az��.��d;������}}}K�(akk+��8�ԩS�͛7����%��� ;�Klgggeeennndd�/��"�����755������NNN���{v�Q�F�Ī � �2�����tttD��p6$$D�O��#>�0a��+��8���0<(��A=\B�;S��s��~`iiٶm� 6�v��ƃ�v�ӬX�"9��@B ',�iT�oL+�z��}����X�A�D���O+&5M�68p��S�����f��۷g̘Q�Z5�*d�r�?��T��i�&5�_*�B'��?~�޽; �w���fǎ>|H�� !�ׯ_w��9l�0��6YQ�ti�.=�H/^Lk��ԬYS=V�����֭[?ъ��<���@�����{�������1K �� $=�??���x�M�(t߿_�~�W���9�x���fͺ�� ו����x�"�Dٲeȉd�����#���ּy�hŔ��>|�%Vq^�~]�~}Z1abb���֨Q#��w�ܑ�����F����1x�0���#}���r�¤ "���� \N###\]������_�bEX�,���Wq۶m�����''�-vvv�R��?`�̙�bJL����&�b��̄k"p�3)�0�W�ޘ1cn޼ H�+�_�re�ȑ�����%� ���;w��.T� 22�w�ްิ�bu$FW���@\�ر��TYM�G�z��UD��K�wE��}�b�M$;e�Z1%Tm� ��<x��0��L������޽�֭[�?NO) �[)))˗//W�9����x��� �������E�ݻ/�k�^an�C��� t���o߾�L�ɓ'O���שS'8�g�H��ŋUw�ϼ ��Sb<==e&8߿�ӧ�!������%������۷o<ح[7 Vx��C����N���� �����;���G�����(�� ��c�^��ܹC3�x��&?~<k�,///� *����*n�+�Q�FѺ)1h�G��MԅN�i�&�S`%���n����1fe�X�� �t�bggG��v���z�…QQQjsM�� @LL �7r!ź��>�������UV/1�z�j׮]��0��q_��M���k�eȐ!�nJ�����˗��X�"��ߗ`�A���444$�,Ξ=+� ��*22rƌ��8������� �I� � j.O�>�����O�'�?�ֹnݺ6l�խ�/_�ܾ}{��ɍ7FTAJ%W�-
3DO�.�����)1�;�No����8�VOΔ+W�,����K޽D( g�D�d�ì��R�R�J�^�ZBsTq�V~�����8s�L2�����}�5j�سg�Q
`��#��?b���lH z9���߿�r� ={��5Tnv�ء63��O�600�Փ?M�4�?�͛7��˰%��{xx��'#��|�puuݿ�z�j+�>}3f���=.��ˌ�H�?ڴi"� )�p�‚ J�. �ON�����o߮�k��K�.����ʕ+�L>~����VO�:88�o�~߾}2�����k2��@F���f�2e�.]J�Se�S޼yk�_�^=���s4;)���|��=��=zT�T���0����/J��ڪU+ZC��P�+D8�gϦ�S���^^^�'O~�������_��Q�F$���)U�jՎ9"�9��� �ϟ?�nc�YZZ��!1�޺ukD�4GIAI@hh��U��իG:��>|��=����kצ5Tnf͚�I˭.� u
2�����qqqdp�I�ѣGk֬������� I\�B�'Ndggˤ0�� @jj�̙3�y����dfff�s���7�P��/�ˢ02`lll:��]S����/N��N��~Ӯ];ZC���䄠v��Տ?����%$$�>�Uaj���uuu�ׯ��A��
�V��������-\�?����dk���`���`�#P��Կ�"E���(�*U��|�R���۷�R���̈́ �/+V��'�\�U������߿/�� ]�v%� �?���!?�v����ʕ+2���H�J�;�����G�W)?�����ÿ}�&�S�7o�lذ��� ��"�4F�� ��{�d�;�9r�Z
B[��R��1kjj:hР#G��d�Cff��/_z��M6�t---�$��J�>p��ѦM�����G�?}ƌw�ޥyIJrr��[�&O� �[��犅����]�Ux[���������e����s��F+Y@���4h����òZo#$$#��ٙ�O D~��ȨW�^�ϟ�y�� o߾E &֕#FD[[���i������4;�@�w�ҥ�c�-Z���)]��l��RΞ=K+�����OE� �&;;{�̙x�O�֭���s�dV>�Ȱa�`H���#���ҨZ���Ap�;w�lhh5�~͈t��_�hQLL��w~"##w��ѪU+�$
)@P�v��EGG�©ǎ��Tzz�衮�����ӳ��?~|PP���.r����… �[�܍ I����Z�N��ݻw&L ��r�`HF�/_~͚5R�������ѣe˖կ_�`o���3�t�R���8@���t��I�a����O���5k�z4���]�t�gF�(/^�X�bE�b�H��j�q(��u�h^J�j @\\ܺu��*���R�v�\����ӌ$��lpp����˔)��-J���ݭ[�h)�DZ��JO�6m�R@||�����jA���o��������}@T�q��b� �WW��Ǐ��������G����9^$�]`�:A3��zG����F���CrVڵkCK�vlڴ��S����RW�������pQ011)R�l7�_�����+W�k�Pb�455�W�~��Q��r���qu���*U��kO�@~�ĥK�^�`�4��dff�y�f�ƍm۶��
�0o�<��Ҳz�jZO��q���*�ŋJ��Jl!C.]�$��aaacǎ���C��H�$eǎCBBhFJ�J
���۷+V������#��(��l��8;z2����R�:;v�W��G���ԭ[7))��[퀅m޼9��2���գG�}���ɓ����1b���!������C��@ި�y{{���8^�3����,Y"�N���7oޜ1c�����r�777�[.7�����J�Q�[����ŋ+�Ky6665j�@�.�[p�0�ƍG4r$���ā2y.-?TLp=޼y3p�@2Q���Hp͐�������Ǐ4/�IHH�w�ިQ��0���#66��X�6m���������'Znu����Jx �OÆ !Q�?����ݻw���oaa�<�?@b؜�˗+��P�����Ç�}ml��+all 럒�"qD���y�ҥ!C�����<��E�I?B�Q�� VVV귍xn�߿O�*'���.]*eL���Dr=z� A?1,���'������iFʇ* @VV�����3�:̏ŦO����#���@xN�8ѹsg�� �#G��B�)C���Uz���oܸA˭�`\�hт�2�e+[���ѣ�UR��y��5D����$[jbDBR֫W����4%Ce ##c��̱�� p�֭�۷oiFbB���ɓ�}}��>��@��9�\׮]imU��g�Ң�)�g��(��UV��O�6��ÇR�����^p��� I�����K�����ׯ_.z��Gz���0�_���ڵkW�&M`�������S���MjjjA��#J��Ɋ}��Ѫ*1�px��EZn�HOO��t�Ё�bgDc�ĺ��p\�piX����Љ'���]EB.��o߾W�\��� ��w��mذ�A����+7s�̡�WSTh7�Zt5����������V888X���0 ��ڶm����<�� 1G��֫V�R�Ya* )))+W�455���Drutt���$^�����׬YS�V����
hhh�ٳ�V@M�+�*��6o�L���DDDԨQ��V��}0`@@@BIi��<s�L�J�0�`m�<��١@�O�V�8@���p�Ђ0��)EC������Ǐ%~�ɓ'���%J�P���|�/���+Z5ה���*�]��]M��4n�8Z[U�
�:)�sOHH
���D������u�J|OB(�`��7 � )H1I֠A�C�$�Brr��G��O��'�U�4i�~I���ܹs��ު���-���~�zZ[ASS�m۶۷o��- ���wss#y$$C�4hY�KA�������߿�=ZWW�����#�uqq9|�����2w�ޝ<yr�x'1=z��ɶ�LHH�j ��ٳi��Z[��Z�j�6m������ �I�&�C-�H����pѢE)))����RGX2��K�����qժUwp0����� y�D��X��|.^����M+�
���EW_n޼�T��rD__�T�R�֭�f��7oތ5�T�"�@��ݺu+͢@QR�'~����G�)---G������8����x�b�ĉ����J�@\�v�ij]U�3gΨVU�EW_>~�ȿ�r4h�`���_�~���v�Z�f͸/MF�۴iSeشCI 22�^�zhM�����;��������:u*Y��\!բH�"�o�V��R�=zT�`������ F\���i�U X��e��޽;>>��GL���ୖ/_�q1VH444ڴiS�!�2
����ǍG&{piP$��o۶�իWib���#��䙾�R�R%��vV!<H�Tz��E��� 6�VXA�\�v��;wJ|�8!!�ȑ#�J�"R�$�5$377_�p�d��P:HLLܰa���%�v�釖������,�!==�Ç3f�P�;?|�~����J}ٵk.7��*�X��20}�tZa���� ���q�qrr"F������q��]i�H����gϖ,Y^�DC�����?.���_�^�`����j����j�J�����͛7�VаaC)� S V�\I+�����6j�~���pΜ9d�8��K[[�cǎ8r�K޿ߣG4 Z�������Ν;W��CCCq�ȣfU�[�n�lr�*�]�V��ތzo�@8r��j �@���[�hq��y�lx��ɠA�ĺ} �����U"���شi�O�<�!q������%X�"����+V��}>h�#F��K`������ڪ���yax6s��}r�V �ӧϹs����%�w����z�����`Tc%��J�*w��)��J$�n���$�о4H�}��i���nnn�5�Dzzz�V�*�;�
c�����
(��۷i�՗�_�Š�:�8fffmڴ�x��d�����.\�P�\9dųU�;���۷o�y�_Y���1c�\Z i  48y�$=^���׭[�B+X� �̀�Z=�rԨQ����*BPP������Q�F�ª����������%�3���-[FV�ם%���ɩ@VrT
@��o�>��}��rtt�`�u�t�6��D��t�˗/�J�/����Z��uV$sST�����M��
����Æ ��>����233{�� cE��KH�3V�V-22R�sƔB���k֬�&�r� ����W�\)����߿�ݻ�dɒdoO������͛��� �IJe��:��P_ -[��V�W 8�Ν;��b���c///�5^B �6r�Hz��(x��>|8L?�f����С������;vL]�|qss�w�������KgggZg�a�Ν��Krrr۶mi����'�}�V2�|׮]d�"�����݅ �4��`ݺu���9aR~� OOO; ��ҥK裪>�_ ���>��T_<x���H��:lذ�V@}�t�ܙVX��ͱ������l�5y ��ƺu�FEE���O �͛7k׮M�6��:HA^�rejj*=�?~���~�N�p-s��������{�BBBTk;0¢E�h�X�=z�
�e˖ݱcǗ/_hm�������ߙ���4FFF�g�NLL��˙������Qm����o߾����xn��?�|���jv�?7Ŋ+ ��X'��9�@�x+�d����H������'٫6p\*U���������;��bV�-H8x𠽽=%_ah�Z�j���;��۷oS�N����]G�����'���h�U�&M�������A�h��؟˗/K��Mzz��={� ��L8����ڭZ��lY{q)0x�����7Z��͟�E�B��m�O�>mٲ�L�29�P}�����cZg�e׮]�i�Ugggi�Q ��҆J+�����ܼyS�x�h������ȇ�5!s�H���/##�/7
FI͟?���K�-4BOOoذa�`n����r���u��͹zj "���� ���T tc�*W������0aBxx�q���M��ƳmB!P�t����������`��r�m�k��:w�,n@{q����U�����L���'Oh�Ք���>}���uVЍ�=J���@H+�������̛7O�i虙�<@��|�q�z���a���$��۷oC� ! Jk,2ګU�v��1z07RRR�_���S�
�P"����&M��
���۶m��PS0� ϴ��N�ʕ7m�$٤ �y�������ؽ{7=R>(Zќ:u���գ�Ass�5kֈ�*Nk8bĈ�kU8pww�sA믦�����J��<�|y��Krrr���i� u��ݷo_���D$$$4o�� pрҥKCi��y-?~����Ry�f�ȑ�F[����ǏW�7�$�H�"j��˗/1h�U ooo���. ;v��-ըQ����l�{��ғ����l���R����l�b``�N�(4 *_�|yq�����<x�D�9W��� �M��ܸq:G+�j/^\1��
����6m���� r��-q�3���i�,,,��w�A�K�.�)P��z��jժ��_OOoɒ%b=mG5n���.Pa����… ��\�C���bU{{{�~Q�_���`hh8n�8q��Fg kٲ%5v"�����D)�&e�Q��������yܴrB ��m۶�_��scl��������28p���:�i�̙��H���J�g�&''��r����\�f��o#h8~����;r�VO8Hccc�i�& ��拂�w�޽J�*�2��r����E\�?{�l�K8�����#n��Z$$$��R3pJĝɦZ`�թS�ֶ�Q�^���q_����;v,�=��>!�بQ��/_��F����XI[[�<ڥ5��3f�KT������#9B�.��B �%(���k׮��QG>|�@�=.������W�ix0�_�~%�IL�0`a6 g͚���N��
���ϓ���?��Ӽys�7NKKC|��r�Fa�k׮��X��`����V�\�VU����ׯ�O�x���>��gg��S����6g:D�6�6��i*T��v�G�E�=y�+�JB�}�!;;�����r�C!�E���ѴQ� \⠠ U_���+mذ�ֳ�w˖-x���rk�8�#F�����G�E������Qz�5DTrԨQb����Q���/�Z�jI�z�J��Ǐ� ��N>���j����ٳi= +0��˗�`66�׆ "�|�c��������r�E�۷�X�J�*�5Y"99��߿bŊ8�����~��]�?#R222�`�yss�]�v)f�w�S�^����gϞ�;c���d�#.F�U�V�N��|�;ꦣ�מVB������E���R>x�@�� ���{������۷o��ק�Te���0̉��022B�!�+թS'ĸ��I$��Ԝ?�����W�>}Z�fM��heHӲeK��� ��ɓ�X�Z����>}��' (�ϟW���[�V���޽S����D�r��l�"�+k~�� �4�D!� �lٲ�z�_�c�l�2�|�_����#dz$�oߎ��ir�>}�H�2���b�
ZC�L�2Ϟ=S��t�.]���d�����ם;w�r�ccc� ����%cǎ� �K�~A���Qb.������L`ӦM����U�VIII��Ԉ1c���8p����*xWv��Mk���7jԨ�_���܂����(Q6��E! s�p�ʕ+�`)�����&&&���U�dI&=�?~�Z��?�>�>D�H] S�8o����'s�̡�c��hѢ۶m�IONN^�l�����Q0����Æ ����K�����ϭ[�FM V�Ԃ@M�M�4�Ɓ��tx��0��@{�ܹ�6��p��yԋ�P��ҥ��Ei0[� �@�����5�+<<�nݺ����&~E�Ŋ�w�=RR�"g>�e�$�I���ӧOkժE�e���ɓi3� p�h�ԂR�J�z���M-�q��������#G��������'O��w<�*DBGG�#[��s#���'�C�������+V���q ""bڴid%F^j֬�N��#�0`��Z`dd�f���B�OOϵk׊5�7&&f�����8�JA@455Pb�H3�@���\�|9�UU�V����|xm������S�h{�>ϟ?��L��.L�2Em^KOO��K�C �5�y��X~����NJ�}�6����� Q.���(_�7����n�ʽil�k�NKK�װ ��Q)9�O�V�� 5j� �5Tq޼ySh�b��Ç��� "�9s搵O��� ������n����a!{࿶CK*h@����a������S�����4*C8m۶������� �?~��y�gΜ��Tq��0C�b !+V����b������*U��X�n4����BSS���V��2���,2���T�<�͛7���Q��ݻ �N���!�4Q�����k���C�?�����X�� �i� Ѵi��իW��v�{�m �l��I��҂7�����Ǎ'qw�������?��B@//���zX~<x��A��� Ѡ�lڴ�6�*��_�ʕ��.З/_�6m
cDk������X�߽{W�^=K�&�n'����D/^�����,����ݻwG��'hy����۶m���GBB�̙3�����={���3�.�͛���O��^����>}�VU5��y��1vK�;իW?z�h�8���Z�*��t�Ummm����F� �dA�,}����W�4i�}����`�ܿX�*ܸq�6�j���g�XT ����/V��@�0z��A�� ��]�vk�H�E� p,��hm���T�VM�'2�����"$���s����~��!O^28�v�<y���q��Ǐ���;99�����7�~ T �pႛ���vvv3g�k���'OZZZ�Xb<�i�0�|Н b-��Gfp�ΝbŊ�(<;/R�:�c�Q 3%��˗/i;��-R��~p�`CU4�g:u�Tr�!U�T
k�K� 0���0���ML?|Ӿ}{ ����e�D �ohhx��-zL~|���m۶�i;w>,V?S`_��їhe�]]�3f�h���ŋ:u�К0�Fr�ȑb�z���c{{{kaa���C�>�jkk+��b��ӴiSE��>���:uJII���n��-[�f� q���8p�X�(׮]S�� ͚5S� ����y�f��Ĕ)S& ��s���&Mˆ611!����A��w����n9'���'�G�F��p�����LQGh���K"* �pww?t���m���^Hvwrr��Q��@(��g����Ҡ��ٿ��?rYưT�R82�3�U@�ŋ���X��@���Ջ���y�O( :ǥ�%,X��-�& ZZZ]�vU�'o޼iҤ ��Z��<l�0�R踸�ŋ�:0$�H�";v�������Ν�y�^D0�׭['֍_�ÇE�f���W==��K�rY �r�ڵ�ի�(�4���lڴI����c;;;Zu�t��*����˗�֭KKϐ �Ν;�~���,N�8��c��� р�mۊ�>���3���bQ{�R�2e�<y��&d3~�x�V�Z=x�@U�3��;v,-z!����O%��c`~��e„ d83����j������;wȃ1r�E ����D��@�
��jժ��8=1�yA��x�&M���^���?{�KV���͜9�ӧO�}��۷o�K�M%����/N�͐Ɔ >|���o~��4h̬�O`����H+�O����&�~uuu�z�*=F8�×/_��ٓ�D �P�J�m۶)��C��pw٢E��={�6�����^�z���r3����x޼y�'�;v q$�^ �=��*��
���k�޽���#�a�D19�Ð�u�����EA�����+�B��M�2%##���R�@����L�S�|�k׮�VΏ��8����@�H�z�jzL~H%W�\!�D �@𫥥%R�c�����4k�,�a2���h���<#(++k�Ν�S�===o߾MB���9t�P�2e�}a�==�Q�Fq�qѢE0�"4?!� p��%�,�ƍ�Ɉ�)P�6m�1"IIIY�f����$X[[/[�L9ן��#h-̋>M�>�� �
�����:t�e����3g8N��L���Y{��WCC���`z�H$�X�Pc/X]]�����c�����&M�c�\�ҥKo߾���2+��~5^�-_�3x�������V�C[[�Ott4mq�`���� G�L�`H|ЧOz�H$�Xx��� �@Ak׮�e?�����[��J 9��֨Q�+W���C�����ݻ�/.�����������Z�hۉOޔ,Y^2�)�.\ /����`𫇇�i�
���LJZz!@����ŋ�1"��勷�7�5�e���gϞMKK�>YX��$p&\\\h�
+ŋG�$ol���ɇ*�������ԩSccc9I�S�􅡥�ۛ��% �޽{����� EĨ�������������̬E��#���� �7o�t��MSS�������7q�D% ��U�Ta7 i�5`T9���p��^Hиq�ϟ?�c� �dff�^���Pc���:�#�>xyy��C!������+00��_�׳u�V��ʔ)s������`Hb Ӓ1� ���+����5 �:�
��W[[۠� z�$����Ν;�8 1�@Nobb�oP���c�r�b���o|
��fmmmh��[�Խ \�+W���%s��QP���?�ٳG%��C̨���* .��N8\p���c/r{f�����$���cgggrnb�����f͚q�t�P�Wq�����}1 �r��ʪG�gϞMMM�C�<{��_�~�@ �EY�fMAM ���_�bE���������N���e�V**����Iz�/_&[E����=�|w[�-�^������<�'---�O� lݺU�w����������#s��
��S�����
^��۷os��-�S?�ѠA��
�;��}��a�ڵ��~姬�V�]џN�?�9k���O3=��)�-4~dd$�$"���%��E����}FlHHH�Y�&�� ���~uqq ���BXXX�V��X)�^��ttwP��p{���?N�����888�B0r��0hР7n�ƒ?���ׯ_������$�C��afk�JƲ�O��+>In�� ���
Ϟ=����u�ƍ��E X�b�/=,b �ŋ��N�}ȹ�w����!##c���
^��?'�{W|�s.����:ss�
* >�ʕ+111��� X�'N�lْ�G�����ɓ'
x����#G���ѣt��d�y����m|.+/샑����O���+�U�V�L��e#?~��F$���sww�!�4�8�p�D܉O���G��L�;��y�Y���v��E� !g�>}�UN�E��;�&�CG&�������������o�&� �l�? ��2�aii������K9���cpѢE;v44Tv��v���{����� ��9��]Sy2��c�R�ZE�Q�i�&&&�������{�N����|�'t$���'�N�B���P{��T�r�o߾�c��;v��ՕWk��@�pzzzիW_�lB9MH?w��?�C�.���������|Sxx���ǧM�wMGG��"�  n��_�/�G��u�kfK3R2p!0@�|�B��p�]�cG�����d�zL�t�#5�y����'O�'))i̘1�w����R�Jm۶]�zupp�ӧO�/U(����ׯ__�z�}���g�G�)]������۷erkQ���{�Μ9����6k�Lu�y� l� k�1���>�9z��}�xj������ѶH]m%�B���O�>�e��W�^�*U
�Û���7��A @�r?w�&�w𓩩)�ş�?�@!���� Gʗ/?h� __߀����(vZZZFFFVV��H��0�&nܸ��bȐ!*�i8eʔ�0a‰'RRR���=c0�{� � �q�
/_�ܰa��Ν;�I�� _��v3k�� Bm]��>�튒C�Iqp�df������&M�O/�H @ /��yA����B
1>��}ΤZ�/���_6l��.�蚈J
�>� 8333���)[�,��֭[/\������o����� )t���08�k֬iٲ%dHsgpƺf͚P�����y��۷o������� ǏGH׳gO�fllLL���[v���Z���>sDd���(��Mur��(!U�T��{G`` �v@~Z�`=�w��s�ΑYG������\�K ���|����6~a ��� 4�ڵ+b�)S���9r$88����w��y���ӧO?~|�޽[�n�B!<z��ƍ�O�ޱc�Z�j����C�Z�j-Z��ӧ�x����K�.!��}�0?���P�ݻw/\�p�ر>>>�ڵ��X[�2��En���[����_ab�s#��5�� b�^׀��d@�1|�<��+P�R%B̽@�kݺu���U೏?y�Уpy�����1ߥ��U@@@AE�L��3l:lJ�=��=���1lذ�}�v�֭m۶�k�vsscv_���;99U�^�ܫW�����9�_�����T#�*W������.�-�^ٸ ����C�Pi�H�n�:***�}`�ԩ0Ȁg���LLL �r�U�E�5BF������iPh�'�� NOO���!��
� ����������:88@��vvv�1!�� ����2@.������=$�࿸����8��; @-m]80��푍�����`L�>}���y���v��煘�E��r�UBCC�)B28����:$����|��jժ���� ��H, �۠%�uM0--��ӧs\��˲M�6ͻ�Wعs'�yr===�)��<p�ҥKs���i�&��Sł� ��H#0D`<�xQ��͛s|+x�ڵH/Bb��ϟ�~�U&L�@n&O�'��������3f�;w�Ç�5ʩ\���P��~�Fi<;��`eeu��aj:E���3sssB�}`� 8@�'HJJjժr'�^GG���#_X��/���w� ǎ30(�'�L 5@��(���rY6--�nݺHO�r^𓖖��ɓ���9 ��;w���_y �P�N���p�@��!H_P0`0�i�௿�UDlmm����Nff�����6�X�? ��h�����8 ��C��ێ�p2 ������?ЖiӦ���qJ����& � ���?U�.b9OBvvv`` YяX�?���Oŋ�� =�G����5g���� �4YYY�o��� �B@�A�$��� ��h֬ه�NXXX����^D`jj�����>M�ټy���1133����!u���wɰ���6m� =�-@�0j@���g�R3*����#F ��������/�^�r���Gr!���孭�555��� ����+W���� & �Px 6���p[�l! �Q3�;�q�رc��un�J'͆�k```gg�������f��^iii~~~H� & �P�.��{�D;� $$�H�"H/"(V��˗/�Y�#3g�̛#��������oe���FRRR�=�,L 5�P �����M��]Q���7�,���w�B�K�.qx�d�N�A.�5ǿ%J����"���=~��l\P�0`0ԀB%��� �rhƌyo��!F{�ҥ�����GILA3�E���h߾����Ǐ�W�Fʜ�4L 5�P (_���ׯ�IΑ#G��������!F�y�������7n�����'hI, D.� BJe� ��H#ßUSS�ݻw�=waDDD�+W���< +����� ,;|���u��i�X���իW�բ�a�`� @iM��Z:����؎92��A׮]E �������I�|�m۶������O���7�� � :�S %� ��H,�������eTE@ӦM�}�
̛7�����9~�2e
I,J`م= ৺u뒌����>|�p�T�0j�d�K�(��=�Q�ȋ��ݙ3g�� z�֭|��{yy��B`�A����K �2"J2v�X��0>|��<�C �@����=k'2�񉇭�wu�G����<yrFF��B���"��RK�����I'��%K� ���?DΝ;�;�P�;F^NS�0j�0��份+����9�`h�2�?�6m�$&&R�*�z?��y�O���aaaH)X�xбcGѹ���FFF��(����H�<0`0��`��qo}���I�o�0슮5�*�:�����oߦ�U8���&���#G�RHp���?J�.�t��<৪U��� �ݻw+VDJ�� ��p���6����s���G�^�ٮ�Q ;�B�X�xq��BBB����:�i„ H�v���8v��m�&�A���'�FPP���R+ L 5���2�9ai����������]�s,VK[������|ڴi�{57�$$$�]�37����)�7c��N�^�q#M+"/۷o'�Hff�����Zi`�`��
���f ��lG�}�����`���?���������
G�>�T�dɔ�Ԍ�c����c�hhh��y����ڡ���l����[۶m�T(L 5 _�edkO��������X�,���� S�LAJj���� ^�}��� ���;~�U��4� p|�"ED�����k%Y.7L 5@��4�Ygju��9�1g������������ #3�H�!��E,z?~=x��ϓg��X3��M[�W�,�q�7nGϖ��?^�x��ښW`%� �����f�f��_yM�r��5�a��=��cr��J̱�n���ܱv���?�xU�Q�F"l/����669�H�v����s��w��7#kb�$X:^9���Y��5*%%��-?~�X�v-٤X�`�`��`��U/=ÏvE���ߐ���9�g9�o㉄r=��##�[�nQS+(Dݺu����@z������
@����vM--���>l߾]����>>>$Q*�0j_� �v<mi���G�C����3���c���xC�z�J�:���>|��Z!����7�E���k׊ٽﻉ-i.*)�E�Ԫ�/|Qi|oll|�� z*A���W�Z5��JC � @��[����C�6��8��m�jfj��s��� ,;;{Ϟ=�n 5ܿ��\\�͜o�@��
@���w��/'����ݟ<yBO%��zzz"�����Pr =��+Y��5���E�ڵ#""���ϟ?����Mxj�ߛYY��;�ڙ4�4{�������؁HJ�ƍE�>33s۶mff���� ����x7�k|ȭ��?'�Z�prr킃Ǐ�X�\��hQ�z)�EHsQ@;v�3v�� :TĢtIIIʳ�0`0Ԁ���ڻ~�+���?�#�����t�R���y���
�&�۷o+W���]y|���3��3�W�q䥭��b�
�NHHhӦMN1�& ��x��-�ki��%������o���)K�����5BGGgΜ9�7㊋��ԩ ����_/3�t^3����C�ф���LMM�I�ax����F`�`�|��[���F+M-��1 �tGw��lG�4��Z9O4� ���;���P�+����)S��M�wn�B�Nz�|��U���CBB�I򐝝�u�V^!�& ��[v���yw �����_H�/Y:��D�ʕ߾}Kͮ ������
��t�7[�W���T>/�ٳg�"*!L 5 ��o�-���k���N� �G�H�Ů�63�r�5#�����Ç��
�������HL���@.ŎH�A�`ذa��JC !����-k�/�EM�ϩ�|csU��1?���`�ao��ĭ[�D��#/v���1r�H�� ���:w�L���0`0����m���]�r�y�+Y����J�,X�iӦ���R�+����J�*��y�D����ϟO��۷oK�(A���0`0��@���a`�oRP ���S����gէo߾��NKK�ر#��y�D����l�B�Ĺs�45�Wf�0j ��uI��� �9�C����\-�m۶m�������0��|��$```p��i�� �tJ C �.�5��s�Lut��;�%:�ݲvZo�t+�K@Æ E�+W���ե��w��������Z�ܣ ��)%L 5����&V'-�����<ι�ζHE-�����������ٳ^;���#���ŋ� ";;{Ĉ�p� C K@�d^z���+M- r&ë0:::�������8uꔱ�1���#I���f,��_�֮]��N)a�`��
����C���$2������E+�����A^�d�h�y󦩩)���#Iлwo�� =zdeeE
��0`0�qt�3�on��f��k o ��\<]U|b��q�D �Ǐmmm!Ԉ�B�2e
�X'O�$�RZ�0j�@���[4��#���ЧO�;�������Sf�n�:�� �y C �@�t��s*��{9��s�m��RE5jO��j֬��Ԉ�B< Ds���)�����P$b�x��)��f��?G���Z�7U���������
�u��2�p2}}}�j3m�4R,�� ��H#���_Cm]��{�X�;b���o��?��s��Yj�лwo����=�RYYY8)�����P�`���',�` xo�L
���Kٻw/5�B3f�l�t��4KA$$$ԩS��Iia�`�R
h��ˋH&����Uc�ƍ� a�ܹ��5j�,���;'''R&�� ��H/�}��6�� d�����t�Rj���z�j�@�f�h��x�𡱱1)�����P�ୣe_����NeT�Q�̙3� B@@�Q;� ��S�N4KA���򊤼0`0����'��8�/2�P�5BnjCM�<x�dy�����4KA����0`0�Y @iM�H��;��������8��`!$&&�LM�/��Rs��Q}}}^��& � +��dq������ѣߪm۶� +�PS� �`ƌ4?A�ٳGOOٛ� ���Pr"�d:z��T�XQ��`?�tpp@Jj�!��~ܼq�Fe��0j� �[׀����v����o{`nn����E�EJj�!���[7>>�O ,P�� L 5@�~:�����9S���]�F���+�dԚ�Bl�~�:�O#G���eO& � [��)gY�p��V��ަ�*U
ɨ5��������4�<dgg��ۗ�Tf�0j�l`��Y*�2$;��7U�Mr��j��P�|y$#Ɯ�x���%�QCfff�n�H���0`0��
��_� �[NP�I�,����!BժU��Z�_�'&&&4�<���v�Ё ��P������s1r(��힍�/i������X�j�B2j�!�XZZ��z&))��ۛW�� ���V������]o�h|~:z�T�|�_�>�Qk� ����J����{yy�
��0`0��
������Nſ�[A��LФI$���� �������mܸ1�0J C ������z�����2���b��]��!�Ω5��x`gg'B�}�V�^=^a���`�wN� ��q��&�7��/���JG-�}�6��lv��&C��}�vj��@��Sk� ����A�DGG������`�?U\���`��'W����RK�7��Zl۶�b!t��ɨ5��x���,B"##�T��+�Rïm���^s��f�2��Uٝ% U���N�}Q�q��o +�7o��XݺuC2j�!������/_�T�P�W��_�o��Y��N�����YYK����`ȇ�f��,�/�!&�]!�n�Ԛ�B�����2e��
���kc�J���'����]z>�! �������_��B�����!B�����Z�_�'E�!?~$�M(9����iAlA��`0rf�ڵ� aȐ!HF��/�www��ӧr���
��d���#5���ǣ5 C!�+#F�@2j�!�xzz�����:u��
����T����� ��زe 5�B9r$�Qk� ��D�" 11�M�6ʿ�:Ӝw=2=��A���-�� C���"�СC��Z�_�'%K�!��� P�����;����]Q�}������88@ �d��t��"��ϟӧOW��@-m�jZ:����ҥgb0 �s�� j�� �i��o��˗kk��� ��PΟ?O���v��dԚ�B<pss-�6m��e�/��`(��W�R+,����#���OD/v�����`0 ������B�V���Z�_�'������4?A�۷OOO�W$��`([[۷o�R+,��M�"%���OtttRSSi~�`�`0��L�2111�
A;��߯_���q��I}}}^� ���4i"b�v��{�7�޼yC�D``����H ��P]�v�&X8d�~j�!�ܼy��'�K�.���`0 E���CM�p�R�Ԛ�B 8��ѣ4?A@�0 �"=z45��)^�8RRS� �@��ϟ?������`0�`֬Y� ��-g}j�!�,Y���'�o߾U�Z�W$��`(��+WR,GGG����b �h�����ٳ'�H ��P�.
Ƚj�!�����4?!̞=�W$��`(�s��Q�+SSS����b ��Q�h~BX�z5�H ���;�����
�Ǐ� -j�!� 0�f)��;w�J�`0 �ӤI���$j����WMMͿ��tq�S�N4K!?~���`0��[�n��h׮]CJ@� h�BV�M� C=:t��?��¾}�����\�-�J��Y
��˗��ּ�1 C�L�<9_X�lY^��-VVV4K!���6nܘ���`0re����
�ԩSe#������4W!�݇ �!W`�w�ڕ��M�� $8��S�h�B�4i)��`0䇝�]HH�ϟ?��B�d&�֭��
aѢE�p ���+V �W�ի'3�1c�U۶m#�c0 ��h֬���ߩ�Bfff�R����\H"C�� �… ZZZ��1 C^t��=>>�Z^!|�����Nf@�h�B��� �}��`0�cҤI)))��
�Ν;fff��R�N�����{��M �`0 9```�}����,jy�p��Q###j�G���ӓf,�?~�7���`0�����޽{�>޹s'��Z�ߑ$�������[��.]J��`0 9P�B�w��Q�+��+W���R �;b @4q��E�� �H:pJZL��`Ț� ~����]�̞=[[[���ߑD������G� ,, �D��`0 �S��㓘�Hͮpƌ���A��H":::K�.�y !..�E��� ���)p�W�X��B��:u8H"�����Oz��EK�`0 �bmm}��jp�]�Z5����w$�������G���'N$e0 �l����s�5�¹{����+�S��;���P�§O����dǎ��2 C��-[���S�NYZZ"=5߿��;��8::^�|��A>������`02v�cǎ ��
g��݆��b?��gDN��ebbr��az!@��D ���9�����ŋ�} ٣���\�� ��_ P7𽶶��իE?������&� �!+tuuO�>MM�p������,�������&�g��9���ƍ'z2���ח��`0���������
�Çu��Aza�\KOoR���v�� @���p����t�is���}˖-����y���}��1sss$f0 ��hӦM���/^/^����Xr�e '��MRl�ΩPY��@�n�X�d��ϟ����ӧ�3 C6���Q#+��w���� =5ܿ��ͬ����d���$ٸl�jeln.Blmm�;=�������H��`0 �p��!jdEr��EMMM����w𽭣�ͩ3�-~�+�s��Z�ۋ8RWW�̙3�����͜9�<�f����U�*U�ի׼y�֭[�l��٬Y�&M�ԯ_�r�ʞ��FF9O� Uv�����ݽT�R�*U�Y�fÆ ѷ�z~�r�0�)BS3�������+jd�����f�r��׼B�*Q�w}7��M���_�_�V����8��]�s`p��I===R�@�utt{��=}��U�V�ٳ�z��� .�={�w�ر}��-_�|�ĉ-���8DKK W���`(1������/+V�]�vcǎ�S�lٲ-[�<xp�޽�c�ʕ��ϟ6m���������14؝a���#;;�ZX�$''��� =1�iש��/~3��MbLlR4�����@�M�>}����ل���C;;;^�ҨQ�!C��[��ɓ'?~���������G�&&&&$$�︸��߿����p�‚ F���Dn�1JN�ҥ{�� ��СCw��y����O�"""�~�����?н?��!��͛ 6 :�E�la̚5��W��z�)@�j��<z���������� �4m�/�8�'z6!DGG�lْWl����g�ƍ�o�,zQ�ܤ��c�ܼy3 `ذa�˗G�L���T��+Q�b�y��!�}��)��V�õk�8?�T�R,4GCCC �X"��� ��OX�z�gc�l~D?O���h �h��A�VVV\�����y%gP`�}}}�]�UP�m۶M�0��ё� ����Ĥo߾K�.=s� �يy��L[N�ʔ)J�H$�Qr5ٿ���~��i����p������D�?x� =�p�9B��M�6]�būW�bcciIDFFƗ/_�?�a��\�r� F���s�γfͺ{�nXX��������~ٲe 6dI��oߞ�&0`Μ9H/€#J����:r\���?���k ��G��:� F�&�Ǐ;99!q!zY�R��;w�[Ӧ��L̞=�x������d �b144,R�H���O�<����N���lڴ�z���^�N�>=ߩ7��8���<��Z�j!Y��Q�~�0N�² P�Jr2 ��"q!�c����k8^?� ���̈��///z2C�ԯ_��ӧO�e�ÑU\\ܾ}������
1�����Ҽ?�tqq�!�^�?�]����y�`�С��011y��-���C�Œ�������eg������Ç�u�V�D zVC�xzz�k�n�޽�������;� ĸ��������+>�\��W��7o��舸��9��i������܇NJ��r!A�� � 'N����'g-�����.߾}�6��HNN �0a���[��!o���,--ǎ���ƴ�<{���ۻ0�j��>}�pl�� �C������!��x���w��=�w���ߟwFQ ��|w�v��gϞMKK��!7���SRR޽{7o�<������M�4Y�h���$.�&ICFF�����ׯO�]��)ޱc�=@�Νq��y�O�+W&Y �- P�J��+W��i�>}:I_�033[�d�ׯ_iC(ĉ�6mjР{tƐ�խZ�ڵk�5 dEtt�����Rqss�� 0HHH�(~8p I�� 6 �E�244|��5I, x�F�ɩGa���ŋ�!H||����˖-���MK�`���͛�:u*99��6E����F�V�@�oEDDІ����uuu�m��֭[I�|�̙3����AF�������Iba����ݻw5k�$YLLLV�Z��q �111[�l��FK�`H �|��ݏ;��i�lIMMEPWE���_�|yFFm�,Y��gb�������#�>}"�;=:��W�^$����ƌS��H S��_���ٳ�\�rle��XXX4n���4oxI�ݻw���B�����+Wh�$++�]�v¬?@n�J�JII!�����$⹋ȱr���>�����Ç �fhooo�N�����͛�U�F��`H,�3|N������9s�����b*T������_�zzz
3���u�ܙ� �;v,�!0�7o�$酁h�ɓ'P^u
�֭��ɕϟ?oݺ�, �`H���f׮]������^Upܹs�t�Ҵd���ӧ�M�hp���̄�k��ƍ������޽{q�q�#P�+V��"@�ؽ{�³���� ���çO��/_^�lYr) �XXXԭ[W��9���ܯ_?8X�|ꎁ���3gh��c���"�5���ӻq���M>�t�?��$�M�ӧO�w��`���&&&9u*��ѣo���˗/P~WWWZ>�={�<v�b�|Ǹb�W�gϞ�3�γg�h�E���I��:�����x��%W�?&w�E��˗�2#q�1@˖-��ֆb�%�;wn�J�h���}�r��O��UJ\�����VP�FKK�E����
~�%_�ݻWx,ɰa�8����� 1��m5yЦM��������xr0��w𽱱149_!22�u��9uRw���/^�H��L�~�z޼y�oŠ��������� 2F��Ғ-_* ����u�bŚ5k6f̘�#G�ޡ� �HT���*T8x��2<��X///�5Ek���O��VVVfff�4�rÿ3g�̽I���kӦM��
��5*� �����^jN������h�� ���P���B�Y���-[u�����"�m۶�ӧw�ޝ&b��k׮�/޻w�իW?|��u�V�X�����V�R�֭[˿]�<��lܸ�0�7^�N\}Z��عs'�-b�����C�徠� 
"w�hN�Ct�F��?������sj����*����@ѯ_�ުU+8�U�V]�r�Ǐ������ѣs��!"��KSz�t#��ҥ Z�իW�!RSSI�}�� -v���nݺ!�� '''�j7�*nܸQ�8q"�e��
�,0 V�������������d�)A���ippp��·o�z���S3������K+�� Z�W�����
##�U�V�������0a���a��& MMM��E�]�v��N�_�x���[�q.G߾}������p����
ɧ ��/�����0��j�a�-��ȝ�� 4h�����&M�wAp��f�!�
.�5Zae%&&���eʔ���5������ѹo8�%!!���ɓ�)B�,�T�Vm׮]_�|}+�^`` ƣ���������Jx�?7(���4��#�VX$�>L�";0�--�)S� %=�'��p:� �� j֬����ٳg*T@zu�v(p"""�N����A�-;,--�r\�ܻwo������pٲe.\�q�/�&�p2�`#*W�|��Y%��/�+V�r�#�Ö/_N��p�1�ȁvvv8�Ans��1��>O�*pi!,43A���9�|���Kʪ�L�8Q �� ��˗��enGڵkw��]���߿�t��F&�zxx8m n \�P�YȈbŊq_t��9t�-�:����%A@O������V�'��8d�����$%%�l�RX��3g=@$׮]S��w�u��IKK�����O�o����8qB�5PSRRv��Y�F �K��v„ >|}�,/� &�M�J�*�`����Hz��֭[
��``K{���Q� hkk�(�b�qhSSS�C�3�O-Z���<����K��L�s��V��5+�}�֭[7dū�Z����S�w&9r��Ś5k�dR:����%���� �W!��СC�ݻG�@L�V�J������M�4���J: ���~��_�f �=�SSS۷o���͓���s���ٳ��C^�xU!9
g�y�� =@8˖-S�i�����TH�b��ܾ}�Lƒ���;ɪ��޼yC,$ԩS'88X\ߟO||�… e�Z_�6m0�U���I+�^�,Y��ӧ��\�޽D�����-���.��T1:CV�&'� N�_}}}��A��uI�&M�|�����S�*R�׍>7u�TX%����3�}�v!���^�~}ll,��Dܿ�cǎR��\���8��JŢE�h�\M�A�o�N�2G����A&�= |���ݿ}�FȅD�����T�zu.+W�zr��VPt�֍���ƣG�`J��شяL@]�t������vFk�~I� �ڈޤylmm=k�,��A�ٲe ���+r��iZ�����A������:���_޹sgz���'o߾%{KQ{����@�7TR�n�>������ i�l�~�R���š5kF3US�/~���o���^�~ݲeK��� :�ɓ'LW��j�u����� X�r���.l/5������"7"�֭���x�^R�jUdG�}^����s1��7&�� 3g�T�P�;c� ��ID~�{�`���6nܨ�
���'Jy��Ojj��%K$���F��!��*ǹs�И�2����ӓ��h E���E�8�Z�\�#`ll,���x�L�� x_��D�\�#OLL�6m� ��8��%~�� <��S�N��B�/^L���?�W��DO�^���ܽ{�VUܿ_�y�zzz�7oV]<x�@�����L�'�J�.]���aB�~.455���H��*U���Alx�����@CC������Gއ��5)��=|��
M� ���S��4iB�č�e�޺u�f! ��������D��'Dn�gϦ�s�СC9�4���._�<��Z0j�(��?��ԩSqau����?=l�����<�-�j�+WF�‚������۵k�a����H�6j���4Y���.܆ �o���ޯ_?�o���E+VL��?�Ν;�W��u�_�>�*=Xe���j޼9���������-?���k׮��0����S���{��zL����4�Lm��~����x�"Sx��1qo8(-0��i�T�/_�p�����!�)䁁��ܻF1�k��MB�9q�Dz��@Gݸq#�u��u� ����ё�iE�Lvإ&?�]�%J���Ml���>y�d�s��?ӦM��p A\ǎsj��xzzryN��5�w��AժU���������iԂ�eˊX�YJΜ9�e� ===��w����T�Њ�8���;w��x9!!�G�p�ao���q�G�-��[B�cdMN�|�_�ԩ���.A��={���N�ҥ�?Nk���#�I�w�fmm���W~�dpp�̗<+(ttt�g�[)�ӧO�:u�'�f�ƍ�q��P�G��z��gggE�}�����a�%����A��ܢQ¹s�����陵Ȭ<p�_%@����>|��iZp9�_��E�%#%%eĈ�d*�����ӧ�7�>##c�ҥ�_�433 @�w�����i�T��y��q��}�…0�����Slii)zxJ"�=;v��w.~�߿?�~����l�2c�_�B�
�_���R} ށ��"n���k׎�*�s��GGGzJ�mխ[7�ĴV�����"��jii 2D����„ h�T�R�J�R�*��H� ��h�B�D/I<}���F̽@𫃃���T�R��4�V�^M^)� ܖE���5"���ޤC�.���6l��;"���������g�"8(�{QP����@�9��/^$��[/�2;�# ��رcQnj�Aʇ��#����I�&!=�AT�2eʼ|��VI-@:z�hZ�߱���z�*��VCDCCCzVդbŊ/^��������}�� |�QԚ5k�c�On�@����\��}!��Q��<S/�������d
�|����t�g�@\��իGEE�cD�e�2�8���h*�V�N�+tv��A1��!@$o��(p��O�.ۗ������ =�/� 0@&ku(j �{����ݻw�+��� ��9�&z�p$؅&M�C�3�@)����?��񉏏�ӧ9JE)Y��jm����putth=yhjjn۶���30��Bг��U '''پ)-Hr�^�r��T�Z�Μ9CS��.������ɏ?~L�<G���L�``�]]]�l4$�� 6���[��2��ٳg�\��`)^��ӧOi}����O�`Vh=y8;;߼y���3(@ppp�sR�����sy1^&dee:t��� ���B��)Uooo.+�"""������   �%��J^�zEn�s/�jiiy��z�H�G�t��CT�bŊ�Nj`9y�d�%hU���S�No�Ʉ����}��έZ�ڵK~�?�ƿe�@ ���ݙ���`aa�z�j��(���i�]%�^ $���@z�H�0x�`�OD@�ׯ�GG�Uݗ� ��=�5Q;�PL�>����ߺu+�AQ�o���U�TQp\���>s�Lb \]]/]�$���J�ЬY3�.#t�e˖�� �ٶhт��
��{��z�� ��ׅ�1"���K�=r�F�`{��!��:r���֭[��*TP���w�ޑ��U�3fp��O&����ĉp��Ν+�w�����+W���7N�:eooߋ{A []]]��{���关��+�"��)hT�5�]\\�c18a��ܼys���1�222跊������g�JFlHH��y��m�57n���r#l����ؤI�Ǐ�j�Gbb���E��>� 9׭[����
|�C����&^}sa.>#2������!G�
��Q ��DFF=z400�o�x��m�,mnU@�R\��Ǐ{���t��"�=dY����d���ܯ�GGG�gS{�l߾��?Daaa\ֆ322ڴi�E��& ��͍�P����!J���[j���7 �ʕ��xZ�#�رc��
�˗/h.��EE�7k֌�‘��nj���AL�@`i������@P�Q�F��� ��t��)::�������>}�hjj�4���j�X��@<��$V__���rӼys�YuY9�1!�T ��˖-���?}��,�D�� `|��Ǐ�eo�"M�{��y �4W�\�"���U����'���*�ƍ��Vnf̘�:�\��U�^=�ܪCÆ ߼y��f͚oX�������իW�g d &&��0�HM~x�k�С������5�T���+x�Ga~����is+1���AAAb�F��DDD�ܽb##�իWs�CZ�R%+J�}�lo�n�bcc�aܐ��u�֑��g��_mll8��T��ۧO���DZ�|8y򤒿,��ضm[������{���ޯB �U���0�7n�Q���jnn��~zgd&O�<)U�
J�� HƎK�ɏ���Þ�^���:u* O�
���h%!^�ҥK?S��q��9X�誀����͛�w����R7�'�� �РA�K� Df���<r�H򜚘{��&����Sgff�ٳG����-[��1$�5�r7ʆ���z��$���-�"4jԈ�)�]�v��ZzA��rY�3/2�Ov�D��ϟ����Ǐ{���BӁ��
[��Ђ�s����%K�FW>�ի��K�ː��i���������E������ v�lٲb�
Y
@||<����T�Z5<<�&4��#G�3��Z�j��������"�b(!ZZZ+V���6&Cb�/_N]4h�Xwi�l�bjj
�I�� 𫆆���e)���?ߥ�Pb(��={8�_�|���Ue���ŋC���y��x�b�|X�H(�� y2w�\��� �֠� Zn��5k� �RK/�S$������?��dff�B[/"h�Z���Ft�ƍH�ӐJ����͛7�����G�<==i�+m۶���eȓ�'�FWn���}}}�r�׬Y��`0��~E������N��X�ɓ'���<k/�jggw��QzL~���o޼�X�b9m��hjj�ݻ�=�S����G�K�^iX�l���`��v�J]���nӦ�X��y��nݺ8֒���CZ�\9�� {�kF^Ԅ�ϳ��O�_�~ܧ̣E� �s~�?�fHTvǎ䖣�`mm�� *_�~ͻ������e��N:�իW�w`��L���ִi��a!8v�)=��y@�񫃃õk��a��F9�|�*UrZT�7n�F�w�+mw����G��Xs�� �_�p�ȑb= +S� �����^HP�D��/_��$B�"""5j�����������������7o��y|y�ի-1C����8�����_��!g�9B�]��[��ٳg���L�N̜9�L|��^����)S��,�ʴf�===�R�XYY=x���6"ٓ'O4h@��~��l9 �q�� ��1������( �F�2cll�d��Vy��������^�x���x��$E.K�����U�����#|����֭��c����cff�Ӻ�
��ݻwi�r�ݻw5k֤M_� 4(%%���!gfϞM�]Y�ݻ��g�Ě�ӫW/������ �_kV.P�ɓ'�x��a�%X[[<x�{ ����Ν;��Z\����U�MMMM%X��!III:t�M��xzz���@��ŋd1b腁������@^P��E�
��%000 ��ʖ-���[�IΝ;goo����ʪU�hY�f݉6}�!�*� ) -R�mz�V
�Ua`���j�
=��y! gMM��#�C����@��l�o�K�9&&&�����Aʨ�(zd~���Θ1���&�����ӧӲ2��B_��ǠA��J�
�֭[����镏v��=�\����n�jee�c��8::�j���:u��ij�y@ⴵ����������;w��~���Ç;v422±JHϞ=%[��!�Ǐ�M_@�+�رC�) ��;wN9�?lt�ҥ8@ � ĎM�4!����?�e��KD#_�x���F���'�:2��oP��U�rY�ǏG�%/�)!*T��0��a۶m�H�� ��ի����jX2�e���ʹ8|Y__��߿s� �� .444D&�^�����ٳg�! 00����𷩩�χ�7�aÆq�2�f���-�MR0/_�,��B�� >���U���S�L!���
���߿��ׯ_�\�2�%��^H�*ϟ?_� ��]@�-���v���{<�O�������ȑ#������!C��'�����҃>��D[_���پ};���0�&�Mȕ
t?x!AAA���������8q"���� �$�NH���0!�ϟ�GL��o��6;��M�jո更��s�N�:u����i�&ZJ��AO ����W,E������( ������W����������)��Rc/$���{�n�>\T�@������k��}��/��� ���՝1c�muw�\���Ã��1p�@vO@adgg�(Q�m}��ٹsg���dHɽ{� ��(�������w�ޑ�`��1�z>|�@���p��5�~3ppp�����?Y[[_�p�{����aÆ�9E�C�2ed�1DܱcG���0���[���! ����dƤ����ټy�+W��"r#==}�ڵ�I��� V���R�*H&N�H'yՍ������ׯ���czp~@* 0��p��� $$��!���6nܨ��@��Ɨ/_��`���C�*�>իW߷o_RR-"7`����I�b�=��ٸ�\�z�D����P�c/���֞4i��ϟ������x��a��%\GGg�Ν쾰"�u���� 4hЀ{GeHOtt4�qDI�G�x�b�O. ���#G��}G��  �)r��Iz�LQ�����3�Bf�Pg�x�v���*�___r�2��"�a��)�O�>)��???zz���G�������K�.b�d����������y! ,I�޽�z��;����#GGG�j9f^8H�k֬y��Mzp~��ѽ{w%y?u�1�I��cȟ���%K�hii�k ��9s���!���X+�;��k�F��C�غukb߉�N���*����P���cǒŜ9j��q�+у9p�ĉ�͛��
�]9�@�_�nggG/���+
�!`j |�>ŋ�Ñ��@ Ǎ���m۶���R3/�B[[����G��
����Ķmۢb�
 �����͛9�b�����:D�8��{�`����^Ȍ3��3���ҥK�������ŋ%X�����U�V�����Р�^8K�ҥccc��r@��|�r�j�P7.A�U��ٳg��������+V�9�A 2u�T�C�"AkO�>�^9c``���V0�=*��=���̬O�>�_���ϳgϺw�@�< ��p}}}y�0Z7��\9j�f��D�#F����$� ͛7���+-C!� Oh�z��������[�7xa����.]�D�ę��� �e���8��}>�06i�Dܩ��R0��4hi��
���,֍���,�Y�F�"�(@����=�h���3Mpذab��e�v��X[}֬YCv��Y#������?r�4VVV/^�� Ƃ��U�^��5�B@$���<v�=�P��ׯ7lؐ������ٳg���!%��)S�� 7LLL���S2B|||�o��oǎ,�~�����|ˆ�������1�� ��P��B&p��,Y�{W� Y�f�>}�$�$�ڵ �_D��͛'��[\8r䈼'��_={������>}Z�xqz
[[۩S����LVlll���I&Ġ`�LMM��H"�+V�ƍ�xyR``ͻv튚�´=��dP�q��q_'|��u�ʕ�@�W�^LLddd�z���;vd �)�Ç`@?������'$$L�6�,^����ᩐ�K��K�q�ܹ��<R�N�<I$=_ @$���ؽ{�X7^_�~=i�$�Q�P�T)��1d�\�,_����d�LHKK�0a�
��аU�V�o���Îoݺ��R#��!s�D�?�կ_�ѣG�x9S�&N������ k>� ����˗/ź��ŋ.]����իW�;Y�!%7nD��@�xzz޻w����>|�����``|pj ��!�Q�k�;�]]]����gdd��K��?/���n�"�@�3��^�z���|�S�N��M A��s`�/[�,��>[N�\�p�<2T<�j�ڼy�/dݸq�u��䶕WKK���dݻwWd�*x۷owqq�5u>����>��/_�����;q�D���q,9�"�T�[0@������� �����{�6#7��ӦM�@�8::�X�B���pmG���[��/A@444�w���3E�WJ!�&O�L���Vi);;;�v����'βk׮F��p�b�ر����͚5�^������)����r��� �@s@죣�%��?r�H�+@l�@��?����{�̙
~��=z��х��H�*U�>|��  {��-�=�����|FE��Ǐ�/:;;� ;*T���9s��y z�������o߾-��'$$�\���55[���D�G�ƍ�엏�8z�(��W�`r���������u{=&&צD�$4S�_ز
F��s���K��s1� 33s�…
��ajj
�r��5q�ޥ���>}�<�����H y+��E�H� ����&��D��C2CC�~����^4.gDDĚ5k�u���V@@-C!$&&ƒ#���@�D)���������v��AAA���,�Y�Z�|�$���$��cǎ2�@��|��C��iH��h��������Kr#��>}���*2D�r2����={d;uA�ӧO� �[`` YBG1�����|��X��>|������������pF��S%�p�� �1�b��r.�_999�� ��Yp����s��566���(��%KB���
�ŋ��)�S�Nqqq4w����^�`���>�rFWW�e˖�����۷�S��[U�B��LMMa���B�������r����C� �Z�j]�x�f� waaa'NT�sann���g(��߿w��E��j�*qo
3�r˿+�`�O�<)��O�>�oL�� Iٰa�>Ԥ2�߼O�>�Ο��d�8D��3�޽;d��S��A��L�"n����̥K��j5@ ot�5C�dgg������� O���4h�k�. �xJLL<v�X�o���$�Z��Ν;i.�2
x��Q�R��F��9� � �)ǀWK1�}||��xB�T�P!44��Ծpr��U�ؖ�t�ؑ���H222�͛G[_������۷O��t��]�V�|y���X�LZE�)�׃�T�&>|���EKі�"�<�?��C499�ƍC�U�Dckk�����CJ����7oN/�t,X����"�X����иq������U��{�֭-Z���"�����ц�
�%�k߻wo���K�" R�)S���_\�E�r�J�.]���Png�7��R$���3gΤ@
��̓��h� �����-�D���vww߸q�d;����O�0�L���H$�L!$0`���d��
��ŋd�0.�KZ�����;Pq.�qׯ_�6m���7�]���w����7 ����jՊ)��Y�l���dɒ˗/�-��ݎ��4___�� ' %l���7��2D��+���ݻ9nH_���jٲ��#Gh.�ILL|����a�*T��|����w�g����U�� )'Nd�)��o�6lؐ��|�V������ {�\�R���^�z.\P��dJ-�<u�Tkkk4w��ڵ�5�`+�[�n͙3���BB��9�:u���+=C!�7���D����� ���}���v���Aٲea�CCC�)�!..�ƍ|O��� ,����ڵki.J�� �ں_�~Ļ�m)�RWW�M�6�x��#";�m$���t��yz>�Bؼy3m}��U�VN�.����4��eyP�~�M�6}��Y���^�:����1�1k�,l��e•+W�ѓ�yhs�$�
�n� >\��ۈ��'��f޼y
^������i�� �&�*�۷o�i�w ��M�nݺ5<<��L 'O����"w�� �%�9B?�)�!�����ʕ��5�K.}„ 111�aaa������p�-��І!%?~������/&���K�.e;�+ �%K��֗� ��[�ju��A�6�G�s�/?�|!�
>_ݺu�={F3RTFN�:�e���HHJ{{�1c�H�~/z!�cժU-[�$Y�CCC S3$��ϟ�-��/&ŊC�(����J�*�֗�����Ν;/�3�7n z �pwCA�2eBBB���hFJ��HLL�4i����������z�j�V�惾�{��*U��|?�����e� ((�t�@O���+�����[����� #�-ڧO��g�J���իW� B
&��quu]�p��L��U#ޫW/\\��B��{��oI�/55u����7&7�H��cgg��=WT��i�sF[[{������4�<�p���s۶me8�`ཌྷ5
��d�`���ީS'����D�m``0f��UGި� ��a�6m��6_HO�*TX�r%�HL����?���ceeEN-=���~~~�$z�����=��>g���N�8������v>�<�PV`�O�4 vC�%�o߾ݯ_?sss�!1,���p��y��f�|��8��J���u��.\�{�.]���Kbb�ŋ{�����.���pH%{�!���;w��V^Ŋ����?"�9s��k��/����__�����s� ���� ��FFF��$5("!N������ׅ h^J�J
�� 6���h��GN0��}p��Y��8�+�=�s�΂ �J��ciiy��iz���|���X�y�� 2D�&n�1�@?~lԨm}��Z���%K>}������i���ׯ#G�444$P�"$��˗/�䱣J
�����'VPF����^�f����+� �PЭZ��y���?F�|||�aM�BBLLLǎIO�Rn۶���Q�d�(/,C�֭�l�*��-� &)R��I�H��İ�G�-�}��������w�η´���$��$�$�{��iժ���wk"gg���`6�P1���̝;��<;;�Ѓr�ܹsg�����kkk۾}�ÇGGGӬ��Ⱥu������ �������Ҍ��eaaa��B6��A.���vŊa�i^b�S'&&^�|yܸqR����ϰaÔ�SP~��y����A{���vpS'N�����M/)�*U�5kVHH.�ġ���������z�����pɒ%3��r��@�#ߥK��X� �Ѱaý{�~����%& �o߆��^�:?[ ([�,�+͔!g���kԨ��B[_$˖-��1� ��ȑ#i�K�u� V�\���ci<*�|����(���ң�>\�%�
�p�� i�s����9s<��K�����Y�݅��@� �|�ܹl���2d/������e;�(���lDf��g��ȨG��礹�C^��<y��� ��nL���hݺ�ӧOiv��:����˵j��u���t���$~K��lٲ�k׮�q �����#�#C� �߳g�m(ooo�|^1��1c�ij�˗/?iҤ�w����I|��v��� � ����d�ƍ�={�ZkF��H���۫U�F.��W��͛?�L���??~>H�R���r���r�ƍ�MLb� ��hѢ���3g�zC�ܻwO��wj׮�x�b� �������ƍ#����B�H� t߾}4/�AM���ꊋA��(?��vss۹sgJJ����222�^����[�Hx(ə#ݺu����y1�����۷oO�]����(P90p�s�)�\ �>}��޽[�e��@9>|�бcG�;�xf&X��J�V��˗�{������p��XSS�L�2�gϖ&�G$�z�jXs.>fn����;F3b� x???��B�_���'zC����֬Y��;g�T�2bĈ�w�FGGKs�8p�S�N���`�i��N��]����hv*�Z � �6m-z�8@җ(Qb�֭R������ӧO�;���S�I�����l�r��\�t��Ԕ�� ƌC�2�Iff��M�tuui�s��ֶbŊ���7o�\$%&&�ڵk�[�&�5 ��+6u�Ԅ�����n���ϸ���3gsWr���ң{M�>]�'9(Cvv6T��0�@���|100`+C(�k"��%[�~����\��T�~}�����4h��ݻ�}��Q&� [B@@@�j�p�s[� 1|___i�8�&��ϟO�8��N9�b��+J�#�H�y\���0�0��U�V%9�K�n����
Wg������P�d����V`��l�":���q�ƣF��u�����%''�[��aÆd}@�Hz{{�9s��Д�����O���Ջ�������ֳf͂�H��njjjpp�ҥK�������}�eiiy��I�{*�����n�U �p�h:�܀�߮];���occӺu��۷?|��,Џ�Ǐ���#��GĿ�C� Q��|�V��!��ҥ �Á� %���cҪU+)Ws������;x�`;;;^�
�2K�2 �#o߾����Ο?_ w�S?����eY��+Θ1�ڵkp�e2U�+VLSS� v2����(�����ѣ1���QS[ �|�1Bܝ�eЀ6m��ڵKz����z��I��֭+�}1ggg�<��III�ݻ7m�\888�;wNʉ%�|���s߾}E��%K����^�nݓ'Od�^Y�ْ�Ų����'޾}���⨹�/^�m���� �0G�� �%�T�Җ-[bcc�|f������722"�I^p^�H���_�G��k�V��^�A��>}��ӓ6��`����YXXL�<�ĉ2YX-555""bڴi�(� s��,��&&&0&���4S�G� ##fq�oy�������憠/,,�f*)���߿Gן0aB�5H�yquu=z�(=�!~��y�Ν?l�����q������,���ݵkץK�B�d�!��ԩ�?�9���������2� �$���]�6d�D��&�cP�H�)S�\�tI��Ӄ��V�Z���$��hjj<X���� �jҤ mt���{��e��MHHH�r�h���_�Bt�S�N��������ݻC�u����ؘ���mn�Cp,rP�� �x}��122�E�Y� 2�P�U�VO�<AT!����ă4����9��$@��Ӈ[���]\\?~Lf���s�Υ-� 8�j׮�v�ڧO��dnVVVZZڊ+ʔ)C�"��'`x6n���ݻ4_5� zóg�f̘!�.?tr���i�f�֬Y#�GR߾}�w���ٳ۵k�/AGG���F W������'��*��ݛM�7��%J� mΧF�C���������`]�zu�ر�������!�2굵�;t��2����B$h������ԬYsǎ�_�����������
{{{�c��ŋ#tU��eU��/_��E���[��������p�H�MMMgg��eˮ\�2$$DV�oõ�~�:Fznu�Ø�(�e�;wV�r�N`����'L�@�?WHz��vvv�D��;��HpE!7n>|89��{��R.L�Mdd$B:�຺��/_����0`��۬���������xa ���"�ڵk��'c�@F1GP6}}��={�{�N�� : �3g���k� �$r4h���������������
u�ҥr��8�������ٶ�������bd͛7�xP���0d��u�ԁ�� �� ��|������a�q��Q*���(GGG2�_���R�ѣG;88H<- v�� ��˗/�����ԩS ,���������ի�F���{�.� :w�\�C���������+T�`mm �]�fM``� �wA �A=k�,����j��ihh���6L���T��+����1�ɋ!��@�Y�l�)S���Ѭ��&�fr���cƌ�[�n�Ν٫I�����>>>�����_1d `׮]�j��������r�JRR�� ﮜ9s�cǎ���dN�Wn���_999��qqq�4�_�WϞ=���p�?�D�C�=t�� �! �@l�jժ#F�'�6h����ʕ{����!k���w��1x��}��I���|�� ��i���Ғ?$����J�*!4A i��Na���A��!�B��u�=�;�ի ���JII��KMll�ɓ'�ٯ��/AAA�G�V﻽ "�`�u����#""�nݚ{*���!8ÿt��~~~��0�}�I�j�H���3�==��ŋ�� �YK �cBBT���!>~��y�f�������Tz777�f�ȁ�j�Bn�m .&�o߾��h֬�
h�� 9
8::��ê�YD�!--���B �x����֭[K<������4i�cǎ��8z�B��8{�l��� �s�?IХp�U%K��3g��ϟe�n���1���#G�tqq!cM�q��9�o �F��8q������7����Y�3��4����W��"E��ҥ˖-[
�tC�{�n�…�����ߙ'��;�Ajffַo߻w�����2��֭[C�uwwG_��{H��ׇq���gϞ�v��Q����˝;w�ϟ_�B��"cM,ȁ�������:U� �f����_{������]WE%��OYDH��3��\�*�b3&���B����&6פkbS�����4Y�EE$�mT:����sߞ߳b����>���\�������~>����=�_����!lE:�VlC�+fϞ}��>A���ӧ[�lqrrBFUǿ ���������� ����޾}�ȑ#a.,k��؆���`ܸq�6m�����_���>|xٲeVVV���̛�����VEE���9&&FV�hא��;���F����ʬ�)�,,,֮]����z��a��Gee��۷���'M�$���t�r8yyy��'�ܹ����!�7���iiicǎe�����������f�Z�� ��K�.������*))���qjB����h�"�� ��l���7�D����NZ:+�Vl��]�4h�…�����9A�!###**j�����zASB���ˆ#֯_��>!���dee͚5 I����"�3J�0dȐ�� �{QQ��Itp���
�h�W����`n��4�h(�o!�Ӳꯅ��TWW��兆��MSj`� uttlmm/^��G"��ٳgW�Xagg���۔�lsuuu///8���Ǭ @���� wqq��2 ��@�2��t������;x�`jj*�D��������lU���_41�������oٲeqqq|$�$Ґ��<e�$�(0ap�T��`[f�fff�/NII��3B�� �񚚚������9s�H�1"/�@E������ϿC ���������j7��{e=t��Y ��ڮ\�����|0�xA�g�<6lr)vk ��c4�)**���>|877�F��y����͛aj�?f|��@l����d�̙ǎ�|�r\��x��{����磢�����O�� �G�;�����Ƴf�ڿ?-��H�5lmm��+W>��3�&��� �� �̮,A��o����#��OQQQXX�������v �|���L,--W�X�!��t˷!�4�����/"����QRRb�� S*�� @maoo��/��! ��T)""������B�f/hJ��]�󎑑�����k׮���@ 3`��kP�6�1�@���"##�^��򹴴�Im���2mzzzpp������N� ����z��������K�,INN�C �@6�ެ���������+"#���<�%3���K�&$$�Q ���������#����t��IҰ��K�e.������~��dE��T) �1/^ܶm������&�Q��V*Ķ�t�ү_?T�ׯ?p�jj>*A�1.]���/�lذ���F۹sgn�2r��������k�PHWG���Yصkmmmd��d���0$�Հ��cHH�͛7a���;���D[��������ÇHM�/_noo߽{wn�M����\@AA�:_�n�5�DH�������l��Ç��������3r�H���hzZ�hu`��6m�={�СC���D��jc}X?�D`` 4�ѣG|`BZH��7nDFF����P�r�����D999�Y��ȑ#.\(//��D�p�֭��Ľ{�����1B��~���/i��`�رaaa���|l�i�4;999�V��c(**J.��7t�|CYY���z����GUUUuuumm-�A���Ó'O
6o�<u�T$��bWV��@��ƌB��π�$��$77�y@@���9 Z�N�z�����P}C��W�^�3 YSVV<a�mmm�ۼ2�mޗ�Q�={������� Y@�r���oذ��ݽgϞ⧡e�*���`���� �K)))�����!
�QeFDD���If�@�9���r����GEEѲn� @ˁ��ٳgYYY(,--���J�C���:u�۷���GPP�ɓ'���D�>}z��___������&���)�~�:::���۷����qhi������edd���͝;����D�%2q������н{w�*h���08�����T� 叉�ٸq��%KlllP�v�ڕ[�nyM�w'z�}�ر?��SRRR^^�� ����Ɂ���(�hɵp�C ���*ʎɓ'���_�|9'''??��j��ݻw�ƍgϞ���/?�裁J>�&++bC�hiiYXX,\�p����jK @�jTWW��������F��|�P$�����)**�x���gΜ�nݺ��>�xEii��}����Q����())�x`BܘDp;k2���y�W�^�f�
�%%%HM��O @�����^�p!::���2 �7��w坊�3 �Z(���d[���<�s":�:����o�����ǹżB�q_l���bTTTRR=�Ӓ��N�8�����uH���/-ٹC�x mmm ����s��;w� ��7�;555H� �� H�Ǐ�X,�`�v##�I�[��DDMMmȐ!K�,���i- @[���<??��ի���vvv��w!�@��K�.���={�3f��ŋ�l�B+�v233�o߾|�r777SSS�����5(��p�����I� �Oo��
$m�7n�ٳ'$$������H�u�}HvHz#�����|�����}LL Ô��۷o������ʬ�� .�B|>>>��������T��!;$-MEE�������������� @�������C����$//�L��ĠO��"P 0`����7o�~�zEE"ȓ'Ojjj� �����ϟ>}Z]]]UU�W\\����v�Z������!?�"�â��T9�ad3jjj�F�
����%Z��Kaa!��ӧO>yw��qW��{�������@ 011����3gΪU���!,**��$�*To{��ݸq����ԩS�ګW/}}}uuu�:����(�{ѣGgg����s�Ρ�D�'J�$��+W����ϟ?Հ��n�^��Q������������qx2�g.++�s%Z��w�ܹv�ڟ�y�ԩ���E���� 6 ����}�LA�D�l�:cƌA�)�����m���8���3���v��1cF�>}X��| й$���@q��������{�ڵIII�A�� 5�����A������\CCgJN�-��K �d zf�_KK F–�� f�|�DkCО�믿��ھ���VRRbn����<�]Z���<�;CCC��G������Rٻw�P(D
���&�D���4CDD�W_}�`�GGG333###�]�j��4_���j3�2eʶm�������L��&$����_=a��ݺu��v�a��9C���:u�ٳ�������?���5k�=z4==����999��݃zӚt�:�����������fggC\SSS�9�r��ɓ'�9fP?ⷀIKPPP@�ruu
����J�8$�d���EEE[�n�6m�{g�˽�E<C����#�C$RVVVQQ���G���� =ظq#�Uz߸�ܹs�~��ͫV�B�����z g\OO�-Ҁc�#�����`nv���M�8q˖-����2D����!h�ܽ{��ɓ{��A����лw.$F2
H"''���f``п�!C�8::~��g_}�UXXXtt4�Zbb��˗�������q���_�u���?��#$388��O?urr6l���Qc��� �����L�uF����ɝ={vdddBB����!xKx��1B��ŋdp�v��L\���p�m)ģסK�.�b���+�����/]����{�����|䏏=B}��XZZZYYٮo' ���E:�� �����*,,,((x��!�7//�ʕ+�4z{{O�4 9��A�A9���O�Ȃ^�F�o``���l���д�4��D���-�ٳg+<���ٱc���'"���p]��-�����S�N����>�u놔z`aaagg���>s�L__���@Ĕ���ݻw�:u�޽{�A������jH�c\\j5���6mZ�v-�6����رc�ʲ{uuu���8}��`G���2`8>�����#�?~�8��]UU�w�h?��� �<v��?������J�D�O�u��$rrr(\��������666���ӦM������o###���w��!�PUHNNNIIA�p��匌��������wﲻ�ȸe~Ù��555v�呼cD ���z�������'O������"��TQ�mݺJ��_̝;w�ĉ��й>����j������ݻw��V����9Y8A���������������5$o3��A>>>������(slI���"|o�йsgD�޽{#t���#�"�Į!�^�z�� �mۆ� �8w����͛���/***Eś���+�"���[�neee]�v-==��9q��y���?��s��3fxxx 8�1���S�����}~8Z61���r�2;
��0��C����Ai��;�J#0I~� �ɹ��,�>�7���ε#}}}YCC�=z��111A���{�YZZZ[[��ڢ��裏&M�4u�ԙ3gB6�ϟ�X �{Μ9�f����O����O�>eʔɓ'O�0������9���#$gԨQ�܇ ���4hP���1"��tuu!����jjj��L��?w��v��֥΄Q�aO��ݿ���3g�@�ܹSRR�͋h��t��=z444!�]qF��񡍄�:��c�"�kAHc����r��鱨�.��� u�1a�[�����h?�(u�-�� ,d�ȑ���[�n��?�����-�x� �(�|_��Duuu\\����=<<�)#���Y�b��Ж�3k$|cY�{o$|�6 ��H�|��\]]a-/p�%�RH:"�?F-���>mڴ>���Ȩ��j!�'<�5�t��׃�n�.�=|j�8;;�Z��رcgϞ�����r�!�RH::UUUB�pӦM~~~���fff���u�����R?���(��rߖ��ӧOG�߹s�ݻw�e����'O�TTT �����:�t�RWWWSS���� ���/ZZZVVV˗/OHH(***++����Ś:$�?(,,�t�R||��]�֬Y��`Ȑ!���n����.Dۃ�! ��ZXX8::����������ǏOMM��9tXH�7��J�~�zooo;;;Ȁ����������?_R�� ~������Gf������4gΜիW�޽�>�H0H�7������r�����o�>t萿����'�c ���:< -�d�g������kԨQ3f�@%����������G���������h(�Ν������ܰa���߸q㬬�LLLtuu_�lI�̩�����&���������ŋq�v��)
322��>�Z^#��tH���Iu���g��–.[��`��EE�΢��^�+qu�� ��rrH�_���>����UU�t���B���O�|B_b!���N=8|��� �LŋUU�>~|=�A��[��9��ƍ^ �{x�Z[k����[�D�P�W��nh6�|�(� S�y/
޺_r浫y�r
TT�-]��<�5��t�U��Q��/����y|‹�^�<�"1�E�ٚ_���wp��C>�Y��t�������rWj�iJ*����k�����9DL���^�� *��)8}�ũ�8#�K�٩s��Q����D���� �P�&E+@C)ncj�oh��h��=Ԩ5�� ���R�{h�S�֨V�)x�mX��n�n�r�^�J�>U��d� �T
z������q��.�ޣHˠι�F�AM�P��'ԨQ�F�C5jԨQ렍�5j�:h#�F��� z�?6�0�ST�IEND�B`�

98
Assets/Textures/Batman.png.meta


fileFormatVersion: 2
guid: a5f5ba3665c610f469d392e02dadb3bd
timeCreated: 1491904075
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 2
aniso: -1
mipBias: -1
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: iPhone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: tvOS
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

101
Assets/Textures/cookieTest.png.meta


fileFormatVersion: 2
guid: 32c4b9c8ddc1c5d49ac7d10122540447
timeCreated: 1472821822
licenseType: Pro
TextureImporter:
fileIDToRecycleName:
8900000: generatedCubemap
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 1
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 1
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 1
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: 0
mipBias: -1
wrapMode: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 2
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 512
textureFormat: 4
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 1
- buildTarget: iPhone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: tvOS
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:
正在加载...
取消
保存