比较提交

...
此合并请求有变更与目标分支冲突。
/protobuf-definitions/proto/mlagents_envs/communicator_objects/capabilities.proto
/.yamato/com.unity.ml-agents-performance.yml
/.yamato/compressed-sensor-test.yml
/.yamato/gym-interface-test.yml
/.yamato/protobuf-generation-test.yml
/.yamato/training-int-tests.yml
/.yamato/python-ll-api-test.yml
/.yamato/standalone-build-test.yml
/.yamato/com.unity.ml-agents-test.yml
/com.unity.ml-agents/Tests/Editor/Actuators/ActuatorManagerTests.cs
/com.unity.ml-agents/Runtime/Inference/ApplierImpl.cs
/com.unity.ml-agents/Runtime/Inference/TensorApplier.cs
/com.unity.ml-agents/Runtime/Inference/BarracudaModelParamLoader.cs
/com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs
/com.unity.ml-agents/Runtime/Inference/TensorNames.cs
/com.unity.ml-agents/Runtime/Inference/ModelRunner.cs
/com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs
/com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs
/com.unity.ml-agents/Runtime/Academy.cs
/com.unity.ml-agents/Runtime/Actuators/ActionSegment.cs
/com.unity.ml-agents/Runtime/Actuators/ActionSpec.cs
/com.unity.ml-agents/Runtime/Actuators/ActuatorManager.cs
/com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs
/com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/BrainParameters.cs
/com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/Capabilities.cs
/com.unity.ml-agents/Runtime/Policies/BarracudaPolicy.cs
/com.unity.ml-agents/Runtime/Policies/RemotePolicy.cs
/ml-agents-envs/mlagents_envs/mock_communicator.py
/ml-agents-envs/mlagents_envs/rpc_utils.py
/ml-agents-envs/mlagents_envs/communicator_objects/capabilities_pb2.py
/ml-agents-envs/mlagents_envs/communicator_objects/capabilities_pb2.pyi
/ml-agents-envs/mlagents_envs/base_env.py
/ml-agents-envs/mlagents_envs/environment.py
/ml-agents-envs/mlagents_envs/tests/test_steps.py
/ml-agents-envs/mlagents_envs/tests/test_envs.py
/ml-agents-envs/mlagents_envs/tests/test_rpc_utils.py
/ml-agents/mlagents/trainers/env_manager.py
/ml-agents/mlagents/trainers/subprocess_env_manager.py
/ml-agents/mlagents/trainers/demo_loader.py
/ml-agents/mlagents/trainers/agent_processor.py
/ml-agents/mlagents/trainers/policy/torch_policy.py
/ml-agents/mlagents/trainers/policy/policy.py
/ml-agents/mlagents/trainers/ppo/optimizer_torch.py
/ml-agents/mlagents/trainers/ppo/trainer.py
/ml-agents/mlagents/trainers/sac/optimizer_torch.py
/ml-agents/mlagents/trainers/tests/test_subprocess_env_manager.py
/ml-agents/mlagents/trainers/tests/test_demo_loader.py
/ml-agents/mlagents/trainers/tests/mock_brain.py
/ml-agents/mlagents/trainers/tests/test_agent_processor.py
/ml-agents/mlagents/trainers/tests/test_trajectory.py
/ml-agents/mlagents/trainers/tests/torch/test_utils.py
/ml-agents/mlagents/trainers/tests/torch/test_distributions.py
/ml-agents/mlagents/trainers/tests/torch/test_reward_providers/test_curiosity.py
/ml-agents/mlagents/trainers/tests/torch/test_reward_providers/utils.py
/ml-agents/mlagents/trainers/tests/torch/test_networks.py
/ml-agents/mlagents/trainers/tests/torch/test_policy.py
/ml-agents/mlagents/trainers/tests/torch/test_ppo.py
/ml-agents/mlagents/trainers/tests/torch/test_sac.py
/ml-agents/mlagents/trainers/tests/torch/saver/test_saver.py
/ml-agents/mlagents/trainers/tests/torch/test_simple_rl.py
/ml-agents/mlagents/trainers/tests/simple_test_envs.py
/ml-agents/mlagents/trainers/buffer.py
/ml-agents/mlagents/trainers/torch/distributions.py
/ml-agents/mlagents/trainers/torch/components/bc/module.py
/ml-agents/mlagents/trainers/torch/components/reward_providers/curiosity_reward_provider.py
/ml-agents/mlagents/trainers/torch/components/reward_providers/gail_reward_provider.py
/ml-agents/mlagents/trainers/torch/model_serialization.py
/ml-agents/mlagents/trainers/torch/utils.py
/ml-agents/mlagents/trainers/torch/networks.py
/ml-agents/mlagents/trainers/trajectory.py
/com.unity.ml-agents/Tests/Editor/EditModeTestInternalBrainTensorApplier.cs
/com.unity.ml-agents/Tests/Editor/ModelRunnerTest.cs
/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr_deprecated.nn.meta
/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr_deprecated.nn
/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action_deprecated.nn.meta
/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action_deprecated.nn
/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.onnx
/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.onnx.meta
/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.onnx
/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.onnx.meta
/com.unity.ml-agents/Tests/Editor/TestModels/hybrid0vis53vec_3c_2daction.onnx
/com.unity.ml-agents/Tests/Editor/TestModels/hybrid0vis53vec_3c_2daction.onnx.meta
/ml-agents/mlagents/trainers/tests/torch/test_action_model.py
/com.unity.ml-agents/Runtime/Inference/BarracudaModelExtensions.cs
/ml-agents/mlagents/trainers/tests/torch/test_hybrid.py
/ml-agents/mlagents/trainers/torch/action_flattener.py
/ml-agents/mlagents/trainers/torch/action_log_probs.py
/ml-agents/mlagents/trainers/torch/agent_action.py
/ml-agents/mlagents/trainers/torch/action_model.py
/com.unity.ml-agents/Tests/Editor/ParameterLoaderTest.cs
/ml-agents/mlagents/trainers/optimizer/tf_optimizer.py
/ml-agents/mlagents/trainers/ppo/optimizer_tf.py
/ml-agents/mlagents/trainers/tf/components/bc/module.py
/ml-agents/mlagents/trainers/tf/components/reward_signals/curiosity/signal.py
/ml-agents/mlagents/trainers/tf/components/reward_signals/gail/signal.py
/ml-agents/mlagents/trainers/policy/tf_policy.py
/ml-agents/mlagents/trainers/sac/optimizer_tf.py
/ml-agents/mlagents/trainers/tests/tensorflow/test_ppo.py
/ml-agents/mlagents/trainers/tests/tensorflow/test_tf_policy.py
/ml-agents/mlagents/trainers/tests/tensorflow/test_simple_rl.py

43 次代码提交

作者 SHA1 备注 提交日期
Andrew Cohen b0c02ee0 Merge branch 'develop-hybrid-actions-csharp' into develop-actionmodel-csharp 4 年前
Andrew Cohen 9bcd3c39 fix 2d sac 4 年前
Andrew Cohen 7af25330 fixed torch test sac 4 年前
GitHub 12e1fc28 [feature] Hybrid SAC (#4574) 4 年前
Andrew Cohen ff324d0c fixed sac recurrent tf simple rl 4 年前
Andrew Cohen 8c42dcc7 fix tensorflow test ppo 4 年前
Andrew Cohen 4bf182aa fix tensorflow test simple rl 4 年前
Andrew Cohen 85b18389 fix test tf policy 4 年前
Andrew Cohen 22f42f5b fix torch test ppo 4 年前
Andrew Cohen e88558c3 fix torch test policy 4 年前
Andrew Cohen 701c1a3f fix test torch distributions 4 年前
Andrew Cohen 1812f08b fix test trajectory 4 年前
Andrew Cohen 0c5934ec fix test agent processor 4 年前
Andrew Cohen 1e66d623 resolve all conflicts with staging 4 年前
Andrew Cohen 886883b3 Merge branch 'develop-hybrid-action-staging' into develop-hybrid-actions-singleton 4 年前
Andrew Cohen 704be28b fix subprocess_env_manager check of action info length 4 年前
Andrew Cohen 32d77b5e Merge branch 'develop-hybrid-action-staging' into develop-hybrid-actions-singleton 4 年前
Andrew Cohen 6ffbf209 fix imports in test utils 4 年前
Andrew Cohen 11e2f5e4 remove unused imports test_hybrid 4 年前
Andrew Cohen 63f86950 Merge branch 'develop-action-buffer' into develop-hybrid-actions-singleton 4 年前
GitHub cc948a41 Policy output actiontuple (#4651) 4 年前
Andrew Cohen d0c8b5f1 added docstrings to action model 4 年前
Andrew Cohen 662fd6b1 added docstrings to action flattener 4 年前
Andrew Cohen 7ba10239 remove action spec attribute from policy 4 年前
Andrew Cohen 89bb11d3 remove actionspec logic simple test env 4 年前
Andrew Cohen 60309d8f fix torch policy tests 4 年前
GitHub 9d8a7d6f Update ml-agents/mlagents/trainers/policy/tf_policy.py 4 年前
Andrew Cohen d984af1f action model and network tests 4 年前
Andrew Cohen 2dc2ffe3 add action util files 4 年前
Andrew Cohen 17496265 move AgentAction, ActionLogProbs, and ActionFlattener to separate files 4 年前
Andrew Cohen 272affe0 preliminary aciton model tests 4 年前
Andrew Cohen 35769b53 Merge branch 'develop-action-buffer' into develop-hybrid-actions-singleton 4 年前
Andrew Cohen 88b8f4b4 replace use_discrete with action_sizes in simple_rl 4 年前
Andrew Cohen 95566e44 Merge branch 'develop-action-buffer' into develop-hybrid-actions-singleton 4 年前
Andrew Cohen 7973b46c remove print bc 4 年前
Andrew Cohen 8d7e449f torch curiosity tests pass 4 年前
Andrew Cohen 1d234d1d bc works 4 年前
Andrew Cohen 60466287 fix simple test env 4 年前
Andrew Cohen 771f1901 remove unused code 4 年前
Andrew Cohen 6174c428 move action model to explicit distributions 4 年前
Andrew Cohen 7750bccd all hybrid simple rl tests pass 4 年前
Andrew Cohen 06f1f254 1:1 and continuous/discrete train 4 年前
Andrew Cohen 498b1ee6 Merge branch 'develop-action-buffer' into develop-hybrid-actions-singleton 4 年前
共有 106 个文件被更改,包括 5053 次插入1343 次删除
  1. 2
      .yamato/com.unity.ml-agents-performance.yml
  2. 2
      .yamato/com.unity.ml-agents-test.yml
  3. 2
      .yamato/compressed-sensor-test.yml
  4. 2
      .yamato/gym-interface-test.yml
  5. 2
      .yamato/protobuf-generation-test.yml
  6. 2
      .yamato/python-ll-api-test.yml
  7. 2
      .yamato/standalone-build-test.yml
  8. 2
      .yamato/training-int-tests.yml
  9. 6
      com.unity.ml-agents/Runtime/Academy.cs
  10. 8
      com.unity.ml-agents/Runtime/Actuators/ActionSegment.cs
  11. 3
      com.unity.ml-agents/Runtime/Actuators/ActionSpec.cs
  12. 4
      com.unity.ml-agents/Runtime/Actuators/ActuatorManager.cs
  13. 57
      com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs
  14. 44
      com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs
  15. 5
      com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs
  16. 348
      com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/BrainParameters.cs
  17. 44
      com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/Capabilities.cs
  18. 44
      com.unity.ml-agents/Runtime/Inference/ApplierImpl.cs
  19. 237
      com.unity.ml-agents/Runtime/Inference/BarracudaModelParamLoader.cs
  20. 12
      com.unity.ml-agents/Runtime/Inference/ModelRunner.cs
  21. 35
      com.unity.ml-agents/Runtime/Inference/TensorApplier.cs
  22. 26
      com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs
  23. 15
      com.unity.ml-agents/Runtime/Inference/TensorNames.cs
  24. 20
      com.unity.ml-agents/Runtime/Policies/BarracudaPolicy.cs
  25. 14
      com.unity.ml-agents/Runtime/Policies/RemotePolicy.cs
  26. 12
      com.unity.ml-agents/Tests/Editor/Actuators/ActuatorManagerTests.cs
  27. 74
      com.unity.ml-agents/Tests/Editor/EditModeTestInternalBrainTensorApplier.cs
  28. 62
      com.unity.ml-agents/Tests/Editor/ModelRunnerTest.cs
  29. 212
      com.unity.ml-agents/Tests/Editor/ParameterLoaderTest.cs
  30. 2
      com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr_deprecated.nn.meta
  31. 2
      com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action_deprecated.nn.meta
  32. 138
      ml-agents-envs/mlagents_envs/base_env.py
  33. 82
      ml-agents-envs/mlagents_envs/communicator_objects/brain_parameters_pb2.py
  34. 45
      ml-agents-envs/mlagents_envs/communicator_objects/brain_parameters_pb2.pyi
  35. 13
      ml-agents-envs/mlagents_envs/communicator_objects/capabilities_pb2.py
  36. 6
      ml-agents-envs/mlagents_envs/communicator_objects/capabilities_pb2.pyi
  37. 27
      ml-agents-envs/mlagents_envs/environment.py
  38. 8
      ml-agents-envs/mlagents_envs/mock_communicator.py
  39. 11
      ml-agents-envs/mlagents_envs/rpc_utils.py
  40. 27
      ml-agents-envs/mlagents_envs/tests/test_steps.py
  41. 6
      ml-agents-envs/mlagents_envs/tests/test_envs.py
  42. 8
      ml-agents-envs/mlagents_envs/tests/test_rpc_utils.py
  43. 26
      ml-agents/mlagents/trainers/trajectory.py
  44. 4
      ml-agents/mlagents/trainers/optimizer/tf_optimizer.py
  45. 18
      ml-agents/mlagents/trainers/agent_processor.py
  46. 1
      ml-agents/mlagents/trainers/env_manager.py
  47. 2
      ml-agents/mlagents/trainers/subprocess_env_manager.py
  48. 2
      ml-agents/mlagents/trainers/buffer.py
  49. 2
      ml-agents/mlagents/trainers/ppo/trainer.py
  50. 13
      ml-agents/mlagents/trainers/ppo/optimizer_torch.py
  51. 15
      ml-agents/mlagents/trainers/ppo/optimizer_tf.py
  52. 6
      ml-agents/mlagents/trainers/tf/components/bc/module.py
  53. 10
      ml-agents/mlagents/trainers/tf/components/reward_signals/curiosity/signal.py
  54. 17
      ml-agents/mlagents/trainers/tf/components/reward_signals/gail/signal.py
  55. 10
      ml-agents/mlagents/trainers/demo_loader.py
  56. 64
      ml-agents/mlagents/trainers/policy/torch_policy.py
  57. 30
      ml-agents/mlagents/trainers/policy/policy.py
  58. 27
      ml-agents/mlagents/trainers/policy/tf_policy.py
  59. 6
      ml-agents/mlagents/trainers/sac/optimizer_tf.py
  60. 321
      ml-agents/mlagents/trainers/sac/optimizer_torch.py
  61. 33
      ml-agents/mlagents/trainers/tests/test_agent_processor.py
  62. 10
      ml-agents/mlagents/trainers/tests/test_demo_loader.py
  63. 2
      ml-agents/mlagents/trainers/tests/test_subprocess_env_manager.py
  64. 6
      ml-agents/mlagents/trainers/tests/test_trajectory.py
  65. 21
      ml-agents/mlagents/trainers/tests/mock_brain.py
  66. 73
      ml-agents/mlagents/trainers/tests/simple_test_envs.py
  67. 66
      ml-agents/mlagents/trainers/tests/tensorflow/test_ppo.py
  68. 2
      ml-agents/mlagents/trainers/tests/tensorflow/test_tf_policy.py
  69. 120
      ml-agents/mlagents/trainers/tests/tensorflow/test_simple_rl.py
  70. 9
      ml-agents/mlagents/trainers/tests/torch/saver/test_saver.py
  71. 78
      ml-agents/mlagents/trainers/tests/torch/test_networks.py
  72. 15
      ml-agents/mlagents/trainers/tests/torch/test_ppo.py
  73. 2
      ml-agents/mlagents/trainers/tests/torch/test_reward_providers/test_curiosity.py
  74. 11
      ml-agents/mlagents/trainers/tests/torch/test_reward_providers/utils.py
  75. 44
      ml-agents/mlagents/trainers/tests/torch/test_utils.py
  76. 22
      ml-agents/mlagents/trainers/tests/torch/test_policy.py
  77. 2
      ml-agents/mlagents/trainers/tests/torch/test_distributions.py
  78. 3
      ml-agents/mlagents/trainers/tests/torch/test_sac.py
  79. 122
      ml-agents/mlagents/trainers/tests/torch/test_simple_rl.py
  80. 48
      ml-agents/mlagents/trainers/torch/utils.py
  81. 78
      ml-agents/mlagents/trainers/torch/components/reward_providers/curiosity_reward_provider.py
  82. 8
      ml-agents/mlagents/trainers/torch/components/reward_providers/gail_reward_provider.py
  83. 46
      ml-agents/mlagents/trainers/torch/components/bc/module.py
  84. 19
      ml-agents/mlagents/trainers/torch/distributions.py
  85. 24
      ml-agents/mlagents/trainers/torch/model_serialization.py
  86. 223
      ml-agents/mlagents/trainers/torch/networks.py
  87. 14
      protobuf-definitions/proto/mlagents_envs/communicator_objects/brain_parameters.proto
  88. 3
      protobuf-definitions/proto/mlagents_envs/communicator_objects/capabilities.proto
  89. 360
      com.unity.ml-agents/Runtime/Inference/BarracudaModelExtensions.cs
  90. 11
      com.unity.ml-agents/Runtime/Inference/BarracudaModelExtensions.cs.meta
  91. 1001
      com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.onnx
  92. 14
      com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.onnx.meta
  93. 867
      com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.onnx
  94. 14
      com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.onnx.meta
  95. 462
      com.unity.ml-agents/Tests/Editor/TestModels/hybrid0vis53vec_3c_2daction.onnx
  96. 14
      com.unity.ml-agents/Tests/Editor/TestModels/hybrid0vis53vec_3c_2daction.onnx.meta
  97. 70
      ml-agents/mlagents/trainers/tests/torch/test_hybrid.py
  98. 81
      ml-agents/mlagents/trainers/tests/torch/test_action_model.py
  99. 44
      ml-agents/mlagents/trainers/torch/action_flattener.py
  100. 107
      ml-agents/mlagents/trainers/torch/action_log_probs.py

2
.yamato/com.unity.ml-agents-performance.yml


- ./utr --suite=editor --platform=StandaloneOSX --editor-location=.Editor --testproject=DevProject --artifacts_path=build/test-results --report-performance-data --performance-project-id=com.unity.ml-agents --zero-tests-are-ok=1
triggers:
cancel_old_ci: true
# TODO remove develop-hybrid trigger before merging to master
pull_request.target match "develop-hybrid.+" OR
pull_request.target match "release.+") AND
NOT pull_request.draft AND
(pull_request.changes.any match "com.unity.ml-agents/**" OR

2
.yamato/com.unity.ml-agents-test.yml


triggers:
cancel_old_ci: true
{% if platform.name == "mac" %}
# TODO remove develop-hybrid trigger before merging to master
pull_request.target match "develop-hybrid.+" OR
pull_request.target match "release.+") AND
NOT pull_request.draft AND
(pull_request.changes.any match "com.unity.ml-agents/**" OR

2
.yamato/compressed-sensor-test.yml


- .yamato/standalone-build-test.yml#test_mac_standalone_{{ editor.version }}
triggers:
cancel_old_ci: true
# TODO remove develop-hybrid trigger before merging to master
pull_request.target match "develop-hybrid.+" OR
pull_request.target match "release.+") AND
NOT pull_request.draft AND
(pull_request.changes.any match "com.unity.ml-agents/**" OR

2
.yamato/gym-interface-test.yml


- .yamato/standalone-build-test.yml#test_mac_standalone_{{ editor.version }}
triggers:
cancel_old_ci: true
# TODO remove develop-hybrid trigger before merging to master
pull_request.target match "develop-hybrid.+" OR
pull_request.target match "release.+") AND
NOT pull_request.draft AND
(pull_request.changes.any match "com.unity.ml-agents/**" OR

2
.yamato/protobuf-generation-test.yml


git diff -- :/ ":(exclude,top)$CS_PROTO_PATH/*.meta" > artifacts/proto.patch; exit $GIT_ERR; }
triggers:
cancel_old_ci: true
# TODO remove develop-hybrid trigger before merging to master
pull_request.target match "develop-hybrid.+" OR
pull_request.target match "release.+") AND
NOT pull_request.draft AND
(pull_request.changes.any match "protobuf-definitions/**" OR

2
.yamato/python-ll-api-test.yml


- .yamato/standalone-build-test.yml#test_mac_standalone_{{ editor.version }}
triggers:
cancel_old_ci: true
# TODO remove develop-hybrid trigger before merging to master
pull_request.target match "develop-hybrid.+" OR
pull_request.target match "release.+") AND
NOT pull_request.draft AND
(pull_request.changes.any match "com.unity.ml-agents/**" OR

2
.yamato/standalone-build-test.yml


- python -u -m ml-agents.tests.yamato.standalone_build_tests --scene=Assets/ML-Agents/TestScenes/TestCompressedTexture/TestTextureCompressed.unity
triggers:
cancel_old_ci: true
# TODO remove develop-hybrid trigger before merging to master
pull_request.target match "develop-hybrid.+" OR
pull_request.target match "release.+") AND
NOT pull_request.draft AND
(pull_request.changes.any match "com.unity.ml-agents/**" OR

2
.yamato/training-int-tests.yml


- .yamato/standalone-build-test.yml#test_mac_standalone_{{ editor.version }}
triggers:
cancel_old_ci: true
# TODO remove develop-hybrid trigger before merging to master
pull_request.target match "develop-hybrid.+" OR
pull_request.target match "release.+") AND
NOT pull_request.draft AND
(pull_request.changes.any match "com.unity.ml-agents/**" OR

6
com.unity.ml-agents/Runtime/Academy.cs


/// <term>1.2.0</term>
/// <description>Support compression mapping for stacked compressed observations.</description>
/// </item>
/// <item>
/// <term>1.3.0</term>
/// <description>Support hybrid action spaces.</description>
/// </item>
const string k_ApiVersion = "1.2.0";
const string k_ApiVersion = "1.3.0";
/// <summary>
/// Unity package version of com.unity.ml-agents.

8
com.unity.ml-agents/Runtime/Actuators/ActionSegment.cs


System.Array.Clear(Array, Offset, Length);
}
/// <summary>
/// Check if the segment is empty.
/// </summary>
public bool IsEmpty()
{
return Array.Length == 0;
}
/// <inheritdoc/>
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{

3
com.unity.ml-agents/Runtime/Actuators/ActionSpec.cs


{
if (NumContinuousActions > 0 && NumDiscreteActions > 0)
{
throw new UnityAgentsException("ActionSpecs must be all continuous or all discrete.");
throw new UnityAgentsException("Hybrid action spaces not supported by the trainer. " +
"ActionSpecs must be all continuous or all discrete.");
}
}
}

4
com.unity.ml-agents/Runtime/Actuators/ActuatorManager.cs


Debug.Assert(
!m_Actuators[i].Name.Equals(m_Actuators[i + 1].Name),
"Actuator names must be unique.");
var first = m_Actuators[i].ActionSpec;
var second = m_Actuators[i + 1].ActionSpec;
Debug.Assert(first.NumContinuousActions > 0 == second.NumContinuousActions > 0,
"Actuators on the same Agent must have the same action SpaceType.");
}
}

57
com.unity.ml-agents/Runtime/Actuators/IActionReceiver.cs


}
/// <summary>
/// Construct an <see cref="ActionBuffers"/> instance with <see cref="ActionSpec"/>. All values are initialized to zeros.
/// /// </summary>
/// <param name="actionSpec">The <see cref="ActionSpec"/> to send to an <see cref="IActionReceiver"/>.</param>
public ActionBuffers(ActionSpec actionSpec)
: this(new ActionSegment<float>(new float[actionSpec.NumContinuousActions]),
new ActionSegment<int>(new int[actionSpec.NumDiscreteActions]))
{ }
/// <summary>
/// Create an <see cref="ActionBuffers"/> instance with ActionSpec and all actions stored as a float array.
/// </summary>
/// <param name="actionSpec"><see cref="ActionSpec"/> of the <see cref="ActionBuffers"/></param>
/// <param name="actions">The float array of all actions, including discrete and continuous actions.</param>
/// <returns>An <see cref="ActionBuffers"/> instance initialized with a <see cref="ActionSpec"/> and a float array.
internal static ActionBuffers FromActionSpec(ActionSpec actionSpec, float[] actions)
{
if (actions == null)
{
return new ActionBuffers(ActionSegment<float>.Empty, ActionSegment<int>.Empty);
}
Debug.Assert(actions.Length == actionSpec.NumContinuousActions + actionSpec.NumDiscreteActions,
$"The length of '{nameof(actions)}' does not match the total size of ActionSpec.\n" +
$"{nameof(actions)}.Length: {actions.Length}\n" +
$"{nameof(actionSpec)}: {actionSpec.NumContinuousActions + actionSpec.NumDiscreteActions}");
ActionSegment<float> continuousActionSegment = ActionSegment<float>.Empty;
ActionSegment<int> discreteActionSegment = ActionSegment<int>.Empty;
int offset = 0;
if (actionSpec.NumContinuousActions > 0)
{
continuousActionSegment = new ActionSegment<float>(actions, 0, actionSpec.NumContinuousActions);
offset += actionSpec.NumContinuousActions;
}
if (actionSpec.NumDiscreteActions > 0)
{
int[] discreteActions = new int[actionSpec.NumDiscreteActions];
for (var i = 0; i < actionSpec.NumDiscreteActions; i++)
{
discreteActions[i] = (int)actions[i + offset];
}
discreteActionSegment = new ActionSegment<int>(discreteActions);
}
return new ActionBuffers(continuousActionSegment, discreteActionSegment);
}
/// <summary>
/// Clear the <see cref="ContinuousActions"/> and <see cref="DiscreteActions"/> segments to be all zeros.
/// </summary>
public void Clear()

}
/// <summary>
/// Check if the <see cref="ActionBuffers"/> is empty.
/// </summary>
public bool IsEmpty()
{
return ContinuousActions.IsEmpty() && DiscreteActions.IsEmpty();
}
/// <inheritdoc/>

44
com.unity.ml-agents/Runtime/Communicator/GrpcExtensions.cs


{
var brainParametersProto = new BrainParametersProto
{
VectorActionSize = { bp.VectorActionSize },
VectorActionSpaceType = (SpaceTypeProto)bp.VectorActionSpaceType,
VectorActionSizeDeprecated = { bp.VectorActionSize },
VectorActionSpaceTypeDeprecated = (SpaceTypeProto)bp.VectorActionSpaceType,
brainParametersProto.VectorActionDescriptions.AddRange(bp.VectorActionDescriptions);
brainParametersProto.VectorActionDescriptionsDeprecated.AddRange(bp.VectorActionDescriptions);
}
return brainParametersProto;
}

/// <param name="isTraining">Whether or not the Brain is training.</param>
public static BrainParametersProto ToBrainParametersProto(this ActionSpec actionSpec, string name, bool isTraining)
{
actionSpec.CheckNotHybrid();
if (actionSpec.NumContinuousActions > 0)
var actionSpecProto = new ActionSpecProto
{
NumContinuousActions = actionSpec.NumContinuousActions,
NumDiscreteActions = actionSpec.NumDiscreteActions,
};
if (actionSpec.BranchSizes != null)
brainParametersProto.VectorActionSize.Add(actionSpec.NumContinuousActions);
brainParametersProto.VectorActionSpaceType = SpaceTypeProto.Continuous;
actionSpecProto.DiscreteBranchSizes.AddRange(actionSpec.BranchSizes);
else if (actionSpec.NumDiscreteActions > 0)
brainParametersProto.ActionSpec = actionSpecProto;
var supportHybrid = Academy.Instance.TrainerCapabilities == null || Academy.Instance.TrainerCapabilities.HybridActions;
if (!supportHybrid)
brainParametersProto.VectorActionSize.AddRange(actionSpec.BranchSizes);
brainParametersProto.VectorActionSpaceType = SpaceTypeProto.Discrete;
actionSpec.CheckNotHybrid();
if (actionSpec.NumContinuousActions > 0)
{
brainParametersProto.VectorActionSizeDeprecated.Add(actionSpec.NumContinuousActions);
brainParametersProto.VectorActionSpaceTypeDeprecated = SpaceTypeProto.Continuous;
}
else if (actionSpec.NumDiscreteActions > 0)
{
brainParametersProto.VectorActionSizeDeprecated.AddRange(actionSpec.BranchSizes);
brainParametersProto.VectorActionSpaceTypeDeprecated = SpaceTypeProto.Discrete;
}
}
// TODO handle ActionDescriptions?

{
var bp = new BrainParameters
{
VectorActionSize = bpp.VectorActionSize.ToArray(),
VectorActionDescriptions = bpp.VectorActionDescriptions.ToArray(),
VectorActionSpaceType = (SpaceType)bpp.VectorActionSpaceType
VectorActionSize = bpp.VectorActionSizeDeprecated.ToArray(),
VectorActionDescriptions = bpp.VectorActionDescriptionsDeprecated.ToArray(),
VectorActionSpaceType = (SpaceType)bpp.VectorActionSpaceTypeDeprecated
};
return bp;
}

BaseRLCapabilities = proto.BaseRLCapabilities,
ConcatenatedPngObservations = proto.ConcatenatedPngObservations,
CompressedChannelMapping = proto.CompressedChannelMapping,
HybridActions = proto.HybridActions,
};
}

BaseRLCapabilities = rlCaps.BaseRLCapabilities,
ConcatenatedPngObservations = rlCaps.ConcatenatedPngObservations,
CompressedChannelMapping = rlCaps.CompressedChannelMapping,
HybridActions = rlCaps.HybridActions,
};
}

5
com.unity.ml-agents/Runtime/Communicator/UnityRLCapabilities.cs


public bool BaseRLCapabilities;
public bool ConcatenatedPngObservations;
public bool CompressedChannelMapping;
public bool HybridActions;
public UnityRLCapabilities(bool baseRlCapabilities = true, bool concatenatedPngObservations = true, bool compressedChannelMapping = true)
public UnityRLCapabilities(bool baseRlCapabilities = true, bool concatenatedPngObservations = true,
bool compressedChannelMapping = true, bool hybridActions = true)
HybridActions = hybridActions;
}
/// <summary>

348
com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/BrainParameters.cs


"CjltbGFnZW50c19lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2JyYWluX3Bh",
"cmFtZXRlcnMucHJvdG8SFGNvbW11bmljYXRvcl9vYmplY3RzGjNtbGFnZW50",
"c19lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL3NwYWNlX3R5cGUucHJvdG8i",
"2QEKFEJyYWluUGFyYW1ldGVyc1Byb3RvEhoKEnZlY3Rvcl9hY3Rpb25fc2l6",
"ZRgDIAMoBRIiChp2ZWN0b3JfYWN0aW9uX2Rlc2NyaXB0aW9ucxgFIAMoCRJG",
"Chh2ZWN0b3JfYWN0aW9uX3NwYWNlX3R5cGUYBiABKA4yJC5jb21tdW5pY2F0",
"b3Jfb2JqZWN0cy5TcGFjZVR5cGVQcm90bxISCgpicmFpbl9uYW1lGAcgASgJ",
"EhMKC2lzX3RyYWluaW5nGAggASgISgQIARACSgQIAhADSgQIBBAFQiWqAiJV",
"bml0eS5NTEFnZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZwcm90bzM="));
"iwEKD0FjdGlvblNwZWNQcm90bxIeChZudW1fY29udGludW91c19hY3Rpb25z",
"GAEgASgFEhwKFG51bV9kaXNjcmV0ZV9hY3Rpb25zGAIgASgFEh0KFWRpc2Ny",
"ZXRlX2JyYW5jaF9zaXplcxgDIAMoBRIbChNhY3Rpb25fZGVzY3JpcHRpb25z",
"GAQgAygJIrYCChRCcmFpblBhcmFtZXRlcnNQcm90bxIlCh12ZWN0b3JfYWN0",
"aW9uX3NpemVfZGVwcmVjYXRlZBgDIAMoBRItCiV2ZWN0b3JfYWN0aW9uX2Rl",
"c2NyaXB0aW9uc19kZXByZWNhdGVkGAUgAygJElEKI3ZlY3Rvcl9hY3Rpb25f",
"c3BhY2VfdHlwZV9kZXByZWNhdGVkGAYgASgOMiQuY29tbXVuaWNhdG9yX29i",
"amVjdHMuU3BhY2VUeXBlUHJvdG8SEgoKYnJhaW5fbmFtZRgHIAEoCRITCgtp",
"c190cmFpbmluZxgIIAEoCBI6CgthY3Rpb25fc3BlYxgJIAEoCzIlLmNvbW11",
"bmljYXRvcl9vYmplY3RzLkFjdGlvblNwZWNQcm90b0oECAEQAkoECAIQA0oE",
"CAQQBUIlqgIiVW5pdHkuTUxBZ2VudHMuQ29tbXVuaWNhdG9yT2JqZWN0c2IG",
"cHJvdG8z"));
new pbr::GeneratedClrTypeInfo(typeof(global::Unity.MLAgents.CommunicatorObjects.BrainParametersProto), global::Unity.MLAgents.CommunicatorObjects.BrainParametersProto.Parser, new[]{ "VectorActionSize", "VectorActionDescriptions", "VectorActionSpaceType", "BrainName", "IsTraining" }, null, null, null)
new pbr::GeneratedClrTypeInfo(typeof(global::Unity.MLAgents.CommunicatorObjects.ActionSpecProto), global::Unity.MLAgents.CommunicatorObjects.ActionSpecProto.Parser, new[]{ "NumContinuousActions", "NumDiscreteActions", "DiscreteBranchSizes", "ActionDescriptions" }, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Unity.MLAgents.CommunicatorObjects.BrainParametersProto), global::Unity.MLAgents.CommunicatorObjects.BrainParametersProto.Parser, new[]{ "VectorActionSizeDeprecated", "VectorActionDescriptionsDeprecated", "VectorActionSpaceTypeDeprecated", "BrainName", "IsTraining", "ActionSpec" }, null, null, null)
}));
}
#endregion

internal sealed partial class ActionSpecProto : pb::IMessage<ActionSpecProto> {
private static readonly pb::MessageParser<ActionSpecProto> _parser = new pb::MessageParser<ActionSpecProto>(() => new ActionSpecProto());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser<ActionSpecProto> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Unity.MLAgents.CommunicatorObjects.BrainParametersReflection.Descriptor.MessageTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ActionSpecProto() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ActionSpecProto(ActionSpecProto other) : this() {
numContinuousActions_ = other.numContinuousActions_;
numDiscreteActions_ = other.numDiscreteActions_;
discreteBranchSizes_ = other.discreteBranchSizes_.Clone();
actionDescriptions_ = other.actionDescriptions_.Clone();
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public ActionSpecProto Clone() {
return new ActionSpecProto(this);
}
/// <summary>Field number for the "num_continuous_actions" field.</summary>
public const int NumContinuousActionsFieldNumber = 1;
private int numContinuousActions_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int NumContinuousActions {
get { return numContinuousActions_; }
set {
numContinuousActions_ = value;
}
}
/// <summary>Field number for the "num_discrete_actions" field.</summary>
public const int NumDiscreteActionsFieldNumber = 2;
private int numDiscreteActions_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int NumDiscreteActions {
get { return numDiscreteActions_; }
set {
numDiscreteActions_ = value;
}
}
/// <summary>Field number for the "discrete_branch_sizes" field.</summary>
public const int DiscreteBranchSizesFieldNumber = 3;
private static readonly pb::FieldCodec<int> _repeated_discreteBranchSizes_codec
= pb::FieldCodec.ForInt32(26);
private readonly pbc::RepeatedField<int> discreteBranchSizes_ = new pbc::RepeatedField<int>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<int> DiscreteBranchSizes {
get { return discreteBranchSizes_; }
}
/// <summary>Field number for the "action_descriptions" field.</summary>
public const int ActionDescriptionsFieldNumber = 4;
private static readonly pb::FieldCodec<string> _repeated_actionDescriptions_codec
= pb::FieldCodec.ForString(34);
private readonly pbc::RepeatedField<string> actionDescriptions_ = new pbc::RepeatedField<string>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::RepeatedField<string> ActionDescriptions {
get { return actionDescriptions_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as ActionSpecProto);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(ActionSpecProto other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if (NumContinuousActions != other.NumContinuousActions) return false;
if (NumDiscreteActions != other.NumDiscreteActions) return false;
if(!discreteBranchSizes_.Equals(other.discreteBranchSizes_)) return false;
if(!actionDescriptions_.Equals(other.actionDescriptions_)) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
if (NumContinuousActions != 0) hash ^= NumContinuousActions.GetHashCode();
if (NumDiscreteActions != 0) hash ^= NumDiscreteActions.GetHashCode();
hash ^= discreteBranchSizes_.GetHashCode();
hash ^= actionDescriptions_.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
if (NumContinuousActions != 0) {
output.WriteRawTag(8);
output.WriteInt32(NumContinuousActions);
}
if (NumDiscreteActions != 0) {
output.WriteRawTag(16);
output.WriteInt32(NumDiscreteActions);
}
discreteBranchSizes_.WriteTo(output, _repeated_discreteBranchSizes_codec);
actionDescriptions_.WriteTo(output, _repeated_actionDescriptions_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
if (NumContinuousActions != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(NumContinuousActions);
}
if (NumDiscreteActions != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(NumDiscreteActions);
}
size += discreteBranchSizes_.CalculateSize(_repeated_discreteBranchSizes_codec);
size += actionDescriptions_.CalculateSize(_repeated_actionDescriptions_codec);
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(ActionSpecProto other) {
if (other == null) {
return;
}
if (other.NumContinuousActions != 0) {
NumContinuousActions = other.NumContinuousActions;
}
if (other.NumDiscreteActions != 0) {
NumDiscreteActions = other.NumDiscreteActions;
}
discreteBranchSizes_.Add(other.discreteBranchSizes_);
actionDescriptions_.Add(other.actionDescriptions_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 8: {
NumContinuousActions = input.ReadInt32();
break;
}
case 16: {
NumDiscreteActions = input.ReadInt32();
break;
}
case 26:
case 24: {
discreteBranchSizes_.AddEntriesFrom(input, _repeated_discreteBranchSizes_codec);
break;
}
case 34: {
actionDescriptions_.AddEntriesFrom(input, _repeated_actionDescriptions_codec);
break;
}
}
}
}
}
internal sealed partial class BrainParametersProto : pb::IMessage<BrainParametersProto> {
private static readonly pb::MessageParser<BrainParametersProto> _parser = new pb::MessageParser<BrainParametersProto>(() => new BrainParametersProto());
private pb::UnknownFieldSet _unknownFields;

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Unity.MLAgents.CommunicatorObjects.BrainParametersReflection.Descriptor.MessageTypes[0]; }
get { return global::Unity.MLAgents.CommunicatorObjects.BrainParametersReflection.Descriptor.MessageTypes[1]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public BrainParametersProto(BrainParametersProto other) : this() {
vectorActionSize_ = other.vectorActionSize_.Clone();
vectorActionDescriptions_ = other.vectorActionDescriptions_.Clone();
vectorActionSpaceType_ = other.vectorActionSpaceType_;
vectorActionSizeDeprecated_ = other.vectorActionSizeDeprecated_.Clone();
vectorActionDescriptionsDeprecated_ = other.vectorActionDescriptionsDeprecated_.Clone();
vectorActionSpaceTypeDeprecated_ = other.vectorActionSpaceTypeDeprecated_;
ActionSpec = other.actionSpec_ != null ? other.ActionSpec.Clone() : null;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}

}
/// <summary>Field number for the "vector_action_size" field.</summary>
public const int VectorActionSizeFieldNumber = 3;
private static readonly pb::FieldCodec<int> _repeated_vectorActionSize_codec
/// <summary>Field number for the "vector_action_size_deprecated" field.</summary>
public const int VectorActionSizeDeprecatedFieldNumber = 3;
private static readonly pb::FieldCodec<int> _repeated_vectorActionSizeDeprecated_codec
private readonly pbc::RepeatedField<int> vectorActionSize_ = new pbc::RepeatedField<int>();
private readonly pbc::RepeatedField<int> vectorActionSizeDeprecated_ = new pbc::RepeatedField<int>();
/// <summary>
/// mark as deprecated in communicator v0.22.0
/// </summary>
public pbc::RepeatedField<int> VectorActionSize {
get { return vectorActionSize_; }
public pbc::RepeatedField<int> VectorActionSizeDeprecated {
get { return vectorActionSizeDeprecated_; }
/// <summary>Field number for the "vector_action_descriptions" field.</summary>
public const int VectorActionDescriptionsFieldNumber = 5;
private static readonly pb::FieldCodec<string> _repeated_vectorActionDescriptions_codec
/// <summary>Field number for the "vector_action_descriptions_deprecated" field.</summary>
public const int VectorActionDescriptionsDeprecatedFieldNumber = 5;
private static readonly pb::FieldCodec<string> _repeated_vectorActionDescriptionsDeprecated_codec
private readonly pbc::RepeatedField<string> vectorActionDescriptions_ = new pbc::RepeatedField<string>();
private readonly pbc::RepeatedField<string> vectorActionDescriptionsDeprecated_ = new pbc::RepeatedField<string>();
/// <summary>
/// mark as deprecated in communicator v0.22.0
/// </summary>
public pbc::RepeatedField<string> VectorActionDescriptions {
get { return vectorActionDescriptions_; }
public pbc::RepeatedField<string> VectorActionDescriptionsDeprecated {
get { return vectorActionDescriptionsDeprecated_; }
/// <summary>Field number for the "vector_action_space_type" field.</summary>
public const int VectorActionSpaceTypeFieldNumber = 6;
private global::Unity.MLAgents.CommunicatorObjects.SpaceTypeProto vectorActionSpaceType_ = 0;
/// <summary>Field number for the "vector_action_space_type_deprecated" field.</summary>
public const int VectorActionSpaceTypeDeprecatedFieldNumber = 6;
private global::Unity.MLAgents.CommunicatorObjects.SpaceTypeProto vectorActionSpaceTypeDeprecated_ = 0;
/// <summary>
/// mark as deprecated in communicator v0.22.0
/// </summary>
public global::Unity.MLAgents.CommunicatorObjects.SpaceTypeProto VectorActionSpaceType {
get { return vectorActionSpaceType_; }
public global::Unity.MLAgents.CommunicatorObjects.SpaceTypeProto VectorActionSpaceTypeDeprecated {
get { return vectorActionSpaceTypeDeprecated_; }
vectorActionSpaceType_ = value;
vectorActionSpaceTypeDeprecated_ = value;
}
}

}
}
/// <summary>Field number for the "action_spec" field.</summary>
public const int ActionSpecFieldNumber = 9;
private global::Unity.MLAgents.CommunicatorObjects.ActionSpecProto actionSpec_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public global::Unity.MLAgents.CommunicatorObjects.ActionSpecProto ActionSpec {
get { return actionSpec_; }
set {
actionSpec_ = value;
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as BrainParametersProto);

if (ReferenceEquals(other, this)) {
return true;
}
if(!vectorActionSize_.Equals(other.vectorActionSize_)) return false;
if(!vectorActionDescriptions_.Equals(other.vectorActionDescriptions_)) return false;
if (VectorActionSpaceType != other.VectorActionSpaceType) return false;
if(!vectorActionSizeDeprecated_.Equals(other.vectorActionSizeDeprecated_)) return false;
if(!vectorActionDescriptionsDeprecated_.Equals(other.vectorActionDescriptionsDeprecated_)) return false;
if (VectorActionSpaceTypeDeprecated != other.VectorActionSpaceTypeDeprecated) return false;
if (!object.Equals(ActionSpec, other.ActionSpec)) return false;
return Equals(_unknownFields, other._unknownFields);
}

hash ^= vectorActionSize_.GetHashCode();
hash ^= vectorActionDescriptions_.GetHashCode();
if (VectorActionSpaceType != 0) hash ^= VectorActionSpaceType.GetHashCode();
hash ^= vectorActionSizeDeprecated_.GetHashCode();
hash ^= vectorActionDescriptionsDeprecated_.GetHashCode();
if (VectorActionSpaceTypeDeprecated != 0) hash ^= VectorActionSpaceTypeDeprecated.GetHashCode();
if (actionSpec_ != null) hash ^= ActionSpec.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}

[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
vectorActionSize_.WriteTo(output, _repeated_vectorActionSize_codec);
vectorActionDescriptions_.WriteTo(output, _repeated_vectorActionDescriptions_codec);
if (VectorActionSpaceType != 0) {
vectorActionSizeDeprecated_.WriteTo(output, _repeated_vectorActionSizeDeprecated_codec);
vectorActionDescriptionsDeprecated_.WriteTo(output, _repeated_vectorActionDescriptionsDeprecated_codec);
if (VectorActionSpaceTypeDeprecated != 0) {
output.WriteEnum((int) VectorActionSpaceType);
output.WriteEnum((int) VectorActionSpaceTypeDeprecated);
}
if (BrainName.Length != 0) {
output.WriteRawTag(58);

output.WriteRawTag(64);
output.WriteBool(IsTraining);
}
if (actionSpec_ != null) {
output.WriteRawTag(74);
output.WriteMessage(ActionSpec);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}

public int CalculateSize() {
int size = 0;
size += vectorActionSize_.CalculateSize(_repeated_vectorActionSize_codec);
size += vectorActionDescriptions_.CalculateSize(_repeated_vectorActionDescriptions_codec);
if (VectorActionSpaceType != 0) {
size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) VectorActionSpaceType);
size += vectorActionSizeDeprecated_.CalculateSize(_repeated_vectorActionSizeDeprecated_codec);
size += vectorActionDescriptionsDeprecated_.CalculateSize(_repeated_vectorActionDescriptionsDeprecated_codec);
if (VectorActionSpaceTypeDeprecated != 0) {
size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) VectorActionSpaceTypeDeprecated);
}
if (BrainName.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(BrainName);

}
if (actionSpec_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(ActionSpec);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();

if (other == null) {
return;
}
vectorActionSize_.Add(other.vectorActionSize_);
vectorActionDescriptions_.Add(other.vectorActionDescriptions_);
if (other.VectorActionSpaceType != 0) {
VectorActionSpaceType = other.VectorActionSpaceType;
vectorActionSizeDeprecated_.Add(other.vectorActionSizeDeprecated_);
vectorActionDescriptionsDeprecated_.Add(other.vectorActionDescriptionsDeprecated_);
if (other.VectorActionSpaceTypeDeprecated != 0) {
VectorActionSpaceTypeDeprecated = other.VectorActionSpaceTypeDeprecated;
}
if (other.BrainName.Length != 0) {
BrainName = other.BrainName;

}
if (other.actionSpec_ != null) {
if (actionSpec_ == null) {
actionSpec_ = new global::Unity.MLAgents.CommunicatorObjects.ActionSpecProto();
}
ActionSpec.MergeFrom(other.ActionSpec);
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}

break;
case 26:
case 24: {
vectorActionSize_.AddEntriesFrom(input, _repeated_vectorActionSize_codec);
vectorActionSizeDeprecated_.AddEntriesFrom(input, _repeated_vectorActionSizeDeprecated_codec);
vectorActionDescriptions_.AddEntriesFrom(input, _repeated_vectorActionDescriptions_codec);
vectorActionDescriptionsDeprecated_.AddEntriesFrom(input, _repeated_vectorActionDescriptionsDeprecated_codec);
vectorActionSpaceType_ = (global::Unity.MLAgents.CommunicatorObjects.SpaceTypeProto) input.ReadEnum();
vectorActionSpaceTypeDeprecated_ = (global::Unity.MLAgents.CommunicatorObjects.SpaceTypeProto) input.ReadEnum();
break;
}
case 58: {

case 64: {
IsTraining = input.ReadBool();
break;
}
case 74: {
if (actionSpec_ == null) {
actionSpec_ = new global::Unity.MLAgents.CommunicatorObjects.ActionSpecProto();
}
input.ReadMessage(actionSpec_);
break;
}
}

44
com.unity.ml-agents/Runtime/Grpc/CommunicatorObjects/Capabilities.cs


byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"CjVtbGFnZW50c19lbnZzL2NvbW11bmljYXRvcl9vYmplY3RzL2NhcGFiaWxp",
"dGllcy5wcm90bxIUY29tbXVuaWNhdG9yX29iamVjdHMifQoYVW5pdHlSTENh",
"cGFiaWxpdGllc1Byb3RvEhoKEmJhc2VSTENhcGFiaWxpdGllcxgBIAEoCBIj",
"Chtjb25jYXRlbmF0ZWRQbmdPYnNlcnZhdGlvbnMYAiABKAgSIAoYY29tcHJl",
"c3NlZENoYW5uZWxNYXBwaW5nGAMgASgIQiWqAiJVbml0eS5NTEFnZW50cy5D",
"b21tdW5pY2F0b3JPYmplY3RzYgZwcm90bzM="));
"dGllcy5wcm90bxIUY29tbXVuaWNhdG9yX29iamVjdHMilAEKGFVuaXR5UkxD",
"YXBhYmlsaXRpZXNQcm90bxIaChJiYXNlUkxDYXBhYmlsaXRpZXMYASABKAgS",
"IwobY29uY2F0ZW5hdGVkUG5nT2JzZXJ2YXRpb25zGAIgASgIEiAKGGNvbXBy",
"ZXNzZWRDaGFubmVsTWFwcGluZxgDIAEoCBIVCg1oeWJyaWRBY3Rpb25zGAQg",
"ASgIQiWqAiJVbml0eS5NTEFnZW50cy5Db21tdW5pY2F0b3JPYmplY3RzYgZw",
"cm90bzM="));
new pbr::GeneratedClrTypeInfo(typeof(global::Unity.MLAgents.CommunicatorObjects.UnityRLCapabilitiesProto), global::Unity.MLAgents.CommunicatorObjects.UnityRLCapabilitiesProto.Parser, new[]{ "BaseRLCapabilities", "ConcatenatedPngObservations", "CompressedChannelMapping" }, null, null, null)
new pbr::GeneratedClrTypeInfo(typeof(global::Unity.MLAgents.CommunicatorObjects.UnityRLCapabilitiesProto), global::Unity.MLAgents.CommunicatorObjects.UnityRLCapabilitiesProto.Parser, new[]{ "BaseRLCapabilities", "ConcatenatedPngObservations", "CompressedChannelMapping", "HybridActions" }, null, null, null)
}));
}
#endregion

baseRLCapabilities_ = other.baseRLCapabilities_;
concatenatedPngObservations_ = other.concatenatedPngObservations_;
compressedChannelMapping_ = other.compressedChannelMapping_;
hybridActions_ = other.hybridActions_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}

}
}
/// <summary>Field number for the "hybridActions" field.</summary>
public const int HybridActionsFieldNumber = 4;
private bool hybridActions_;
/// <summary>
/// support for hybrid action spaces (discrete + continuous)
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool HybridActions {
get { return hybridActions_; }
set {
hybridActions_ = value;
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as UnityRLCapabilitiesProto);

if (BaseRLCapabilities != other.BaseRLCapabilities) return false;
if (ConcatenatedPngObservations != other.ConcatenatedPngObservations) return false;
if (CompressedChannelMapping != other.CompressedChannelMapping) return false;
if (HybridActions != other.HybridActions) return false;
return Equals(_unknownFields, other._unknownFields);
}

if (BaseRLCapabilities != false) hash ^= BaseRLCapabilities.GetHashCode();
if (ConcatenatedPngObservations != false) hash ^= ConcatenatedPngObservations.GetHashCode();
if (CompressedChannelMapping != false) hash ^= CompressedChannelMapping.GetHashCode();
if (HybridActions != false) hash ^= HybridActions.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}

output.WriteRawTag(24);
output.WriteBool(CompressedChannelMapping);
}
if (HybridActions != false) {
output.WriteRawTag(32);
output.WriteBool(HybridActions);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}

size += 1 + 1;
}
if (CompressedChannelMapping != false) {
size += 1 + 1;
}
if (HybridActions != false) {
size += 1 + 1;
}
if (_unknownFields != null) {

if (other.CompressedChannelMapping != false) {
CompressedChannelMapping = other.CompressedChannelMapping;
}
if (other.HybridActions != false) {
HybridActions = other.HybridActions;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}

}
case 24: {
CompressedChannelMapping = input.ReadBool();
break;
}
case 32: {
HybridActions = input.ReadBool();
break;
}
}

44
com.unity.ml-agents/Runtime/Inference/ApplierImpl.cs


using System.Collections.Generic;
using System.Linq;
using Unity.MLAgents.Inference.Utils;
using Unity.MLAgents.Actuators;
using Unity.Barracuda;
using UnityEngine;

/// </summary>
internal class ContinuousActionOutputApplier : TensorApplier.IApplier
{
public void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, float[]> lastActions)
readonly ActionSpec m_ActionSpec;
public ContinuousActionOutputApplier(ActionSpec actionSpec)
{
m_ActionSpec = actionSpec;
}
public void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, ActionBuffers> lastActions)
{
var actionSize = tensorProxy.shape[tensorProxy.shape.Length - 1];
var agentIndex = 0;

{
var actionValue = lastActions[agentId];
if (actionValue == null)
var actionBuffer = lastActions[agentId];
if (actionBuffer.IsEmpty())
actionValue = new float[actionSize];
lastActions[agentId] = actionValue;
actionBuffer = new ActionBuffers(m_ActionSpec);
lastActions[agentId] = actionBuffer;
var continuousBuffer = actionBuffer.ContinuousActions;
actionValue[j] = tensorProxy.data[agentIndex, j];
continuousBuffer[j] = tensorProxy.data[agentIndex, j];
}
}
agentIndex++;

readonly int[] m_ActionSize;
readonly Multinomial m_Multinomial;
readonly ITensorAllocator m_Allocator;
readonly ActionSpec m_ActionSpec;
public DiscreteActionOutputApplier(int[] actionSize, int seed, ITensorAllocator allocator)
public DiscreteActionOutputApplier(ActionSpec actionSpec, int seed, ITensorAllocator allocator)
m_ActionSize = actionSize;
m_ActionSize = actionSpec.BranchSizes;
m_ActionSpec = actionSpec;
public void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, float[]> lastActions)
public void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, ActionBuffers> lastActions)
{
//var tensorDataProbabilities = tensorProxy.Data as float[,];
var idActionPairList = actionIds as List<int> ?? actionIds.ToList();

{
if (lastActions.ContainsKey(agentId))
{
var actionVal = lastActions[agentId];
if (actionVal == null)
var actionBuffer = lastActions[agentId];
if (actionBuffer.IsEmpty())
actionVal = new float[m_ActionSize.Length];
lastActions[agentId] = actionVal;
actionBuffer = new ActionBuffers(m_ActionSpec);
lastActions[agentId] = actionBuffer;
var discreteBuffer = actionBuffer.DiscreteActions;
actionVal[j] = actionValues[agentIndex, j];
discreteBuffer[j] = (int)actionValues[agentIndex, j];
}
}
agentIndex++;

m_Memories = memories;
}
public void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, float[]> lastActions)
public void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, ActionBuffers> lastActions)
{
var agentIndex = 0;
var memorySize = (int)tensorProxy.shape[tensorProxy.shape.Length - 1];

m_Memories = memories;
}
public void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, float[]> lastActions)
public void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, ActionBuffers> lastActions)
{
var agentIndex = 0;
var memorySize = (int)tensorProxy.shape[tensorProxy.shape.Length - 1];

237
com.unity.ml-agents/Runtime/Inference/BarracudaModelParamLoader.cs


/// </summary>
internal class BarracudaModelParamLoader
{
enum ModelActionType
{
Unknown,
Discrete,
Continuous
}
/// Generates the Tensor inputs that are expected to be present in the Model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>TensorProxy IEnumerable with the expected Tensor inputs.</returns>
public static IReadOnlyList<TensorProxy> GetInputTensors(Model model)
{
var tensors = new List<TensorProxy>();
if (model == null)
return tensors;
foreach (var input in model.inputs)
{
tensors.Add(new TensorProxy
{
name = input.name,
valueType = TensorProxy.TensorType.FloatingPoint,
data = null,
shape = input.shape.Select(i => (long)i).ToArray()
});
}
foreach (var mem in model.memories)
{
tensors.Add(new TensorProxy
{
name = mem.input,
valueType = TensorProxy.TensorType.FloatingPoint,
data = null,
shape = TensorUtils.TensorShapeFromBarracuda(mem.shape)
});
}
tensors.Sort((el1, el2) => el1.name.CompareTo(el2.name));
return tensors;
}
public static int GetNumVisualInputs(Model model)
{
var count = 0;
if (model == null)
return count;
foreach (var input in model.inputs)
{
if (input.shape.Length == 4)
{
if (input.name.StartsWith(TensorNames.VisualObservationPlaceholderPrefix))
{
count++;
}
}
}
return count;
}
/// <summary>
/// Generates the Tensor outputs that are expected to be present in the Model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters
/// </param>
/// <returns>TensorProxy IEnumerable with the expected Tensor outputs</returns>
public static string[] GetOutputNames(Model model)
{
var names = new List<string>();
if (model == null)
{
return names.ToArray();
}
names.Add(TensorNames.ActionOutput);
var memory = (int)model.GetTensorByName(TensorNames.MemorySize)[0];
if (memory > 0)
{
foreach (var mem in model.memories)
{
names.Add(mem.output);
}
}
names.Sort();
return names.ToArray();
}
/// <summary>
/// Factory for the ModelParamLoader : Creates a ModelParamLoader and runs the checks
/// on it.
/// </summary>

return failedModelChecks;
}
foreach (var constantName in TensorNames.RequiredConstants)
var hasExpectedTensors = model.CheckExpectedTensors(failedModelChecks);
if (!hasExpectedTensors)
var tensor = model.GetTensorByName(constantName);
if (tensor == null)
{
failedModelChecks.Add($"Required constant \"{constantName}\" was not found in the model file.");
return failedModelChecks;
}
return failedModelChecks;
var memorySize = (int)model.GetTensorByName(TensorNames.MemorySize)[0];
var isContinuousInt = (int)model.GetTensorByName(TensorNames.IsContinuousControl)[0];
var isContinuous = GetActionType(isContinuousInt);
var actionSize = (int)model.GetTensorByName(TensorNames.ActionOutputShape)[0];
if (modelApiVersion == -1)
{
failedModelChecks.Add(

return failedModelChecks;
}
var modelDiscreteActionSize = isContinuous == ModelActionType.Discrete ? actionSize : 0;
var modelContinuousActionSize = isContinuous == ModelActionType.Continuous ? actionSize : 0;
var memorySize = (int)model.GetTensorByName(TensorNames.MemorySize)[0];
if (memorySize == -1)
{
failedModelChecks.Add($"Missing node in the model provided : {TensorNames.MemorySize}");
return failedModelChecks;
}
CheckIntScalarPresenceHelper(new Dictionary<string, int>()
{
{TensorNames.MemorySize, memorySize},
{TensorNames.IsContinuousControl, isContinuousInt},
{TensorNames.ActionOutputShape, actionSize}
})
CheckInputTensorPresence(model, brainParameters, memorySize, sensorComponents)
CheckInputTensorPresence(model, brainParameters, memorySize, isContinuous, sensorComponents)
CheckOutputTensorPresence(model, memorySize)
failedModelChecks.AddRange(
CheckOutputTensorPresence(model, memorySize))
;
CheckOutputTensorShape(model, brainParameters, actuatorComponents, isContinuous, modelContinuousActionSize, modelDiscreteActionSize)
CheckOutputTensorShape(model, brainParameters, actuatorComponents)
/// Converts the integer value in the model corresponding to the type of control to a
/// ModelActionType.
/// </summary>
/// <param name="isContinuousInt">
/// The integer value in the model indicating the type of control
/// </param>
/// <returns>The equivalent ModelActionType</returns>
static ModelActionType GetActionType(int isContinuousInt)
{
ModelActionType isContinuous;
switch (isContinuousInt)
{
case 0:
isContinuous = ModelActionType.Discrete;
break;
case 1:
isContinuous = ModelActionType.Continuous;
break;
default:
isContinuous = ModelActionType.Unknown;
break;
}
return isContinuous;
}
/// <summary>
/// Given a Dictionary of node names to int values, create checks if the values have the
/// invalid value of -1.
/// </summary>
/// <param name="requiredScalarFields"> Mapping from node names to int values</param>
/// <returns>The list the error messages of the checks that failed</returns>
static IEnumerable<string> CheckIntScalarPresenceHelper(
Dictionary<string, int> requiredScalarFields)
{
var failedModelChecks = new List<string>();
foreach (var field in requiredScalarFields)
{
if (field.Value == -1)
{
failedModelChecks.Add($"Missing node in the model provided : {field.Key}");
}
}
return failedModelChecks;
}
/// <summary>
/// Generates failed checks that correspond to inputs expected by the model that are not
/// present in the BrainParameters.
/// </summary>

Model model,
BrainParameters brainParameters,
int memory,
ModelActionType isContinuous,
var tensorsNames = GetInputTensors(model).Select(x => x.name).ToList();
var tensorsNames = model.GetInputNames();
// If there is no Vector Observation Input but the Brain Parameters expect one.
if ((brainParameters.VectorObservationSize != 0) &&

"The model does not contain a Vector Observation Placeholder Input. " +
"The model does not contain a Vector Observation Placeholder Input. " +
"You must set the Vector Observation Space Size to 0.");
}

visObsIndex++;
}
var expectedVisualObs = GetNumVisualInputs(model);
var expectedVisualObs = model.GetNumVisualInputs();
// Check if there's not enough visual sensors (too many would be handled above)
if (expectedVisualObs > visObsIndex)
{

}
// If the model uses discrete control but does not have an input for action masks
if (isContinuous == ModelActionType.Discrete)
if (model.HasDiscreteOutputs())
{
if (!tensorsNames.Contains(TensorNames.ActionMaskPlaceholder))
{

static IEnumerable<string> CheckOutputTensorPresence(Model model, int memory)
{
var failedModelChecks = new List<string>();
// If there is no Action Output.
if (!model.outputs.Contains(TensorNames.ActionOutput))
{
failedModelChecks.Add("The model does not contain an Action Output Node.");
}
// If there is no Recurrent Output but the model is Recurrent.
if (memory > 0)

}
// If the model expects an input but it is not in this list
foreach (var tensor in GetInputTensors(model))
foreach (var tensor in model.GetInputTensors())
{
if (!tensorTester.ContainsKey(tensor.name))
{

BrainParameters brainParameters, TensorProxy tensorProxy,
SensorComponent[] sensorComponents, int observableAttributeTotalSize)
{
// TODO: Update this check after intergrating ActionSpec into BrainParameters
var numberActionsBp = brainParameters.VectorActionSize.Length;
var numberActionsT = tensorProxy.shape[tensorProxy.shape.Length - 1];
if (numberActionsBp != numberActionsT)

static IEnumerable<string> CheckOutputTensorShape(
Model model,
BrainParameters brainParameters,
ActuatorComponent[] actuatorComponents,
ModelActionType isContinuous,
int modelContinuousActionSize, int modelSumDiscreteBranchSizes)
ActuatorComponent[] actuatorComponents)
if (isContinuous == ModelActionType.Unknown)
{
failedModelChecks.Add("Cannot infer type of Control from the provided model.");
return failedModelChecks;
}
if (isContinuous == ModelActionType.Continuous &&
brainParameters.VectorActionSpaceType != SpaceType.Continuous)
{
failedModelChecks.Add(
"Model has been trained using Continuous Control but the Brain Parameters " +
"suggest Discrete Control.");
return failedModelChecks;
}
if (isContinuous == ModelActionType.Discrete &&
brainParameters.VectorActionSpaceType != SpaceType.Discrete)
{
failedModelChecks.Add(
"Model has been trained using Discrete Control but the Brain Parameters " +
"suggest Continuous Control.");
return failedModelChecks;
}
// This will need to change a bit for hybrid action spaces.
if (isContinuous == ModelActionType.Continuous)
if (model.HasContinuousOutputs())
tensorTester[TensorNames.ActionOutput] = CheckContinuousActionOutputShape;
tensorTester[model.ContinuousOutputName()] = CheckContinuousActionOutputShape;
else
if (model.HasDiscreteOutputs())
tensorTester[TensorNames.ActionOutput] = CheckDiscreteActionOutputShape;
tensorTester[model.DiscreteOutputName()] = CheckDiscreteActionOutputShape;
var modelContinuousActionSize = model.ContinuousOutputSize();
var modelSumDiscreteBranchSizes = model.DiscreteOutputSize();
foreach (var name in model.outputs)
{
if (tensorTester.ContainsKey(name))

12
com.unity.ml-agents/Runtime/Inference/ModelRunner.cs


internal class ModelRunner
{
List<AgentInfoSensorsPair> m_Infos = new List<AgentInfoSensorsPair>();
Dictionary<int, float[]> m_LastActionsReceived = new Dictionary<int, float[]>();
Dictionary<int, ActionBuffers> m_LastActionsReceived = new Dictionary<int, ActionBuffers>();
List<int> m_OrderedAgentsRequestingDecisions = new List<int>();
ITensorAllocator m_TensorAllocator;

m_Engine = null;
}
m_InferenceInputs = BarracudaModelParamLoader.GetInputTensors(barracudaModel);
m_OutputNames = BarracudaModelParamLoader.GetOutputNames(barracudaModel);
m_InferenceInputs = barracudaModel.GetInputTensors();
m_OutputNames = barracudaModel.GetOutputNames();
m_TensorGenerator = new TensorGenerator(
seed, m_TensorAllocator, m_Memories, barracudaModel);
m_TensorApplier = new TensorApplier(

if (!m_LastActionsReceived.ContainsKey(info.episodeId))
{
m_LastActionsReceived[info.episodeId] = null;
m_LastActionsReceived[info.episodeId] = ActionBuffers.Empty;
}
if (info.done)
{

return m_Model == other && m_InferenceDevice == otherInferenceDevice;
}
public float[] GetAction(int agentId)
public ActionBuffers GetAction(int agentId)
return null;
return ActionBuffers.Empty;
}
}
}

35
com.unity.ml-agents/Runtime/Inference/TensorApplier.cs


/// </param>
/// <param name="actionIds"> List of Agents Ids that will be updated using the tensor's data</param>
/// <param name="lastActions"> Dictionary of AgentId to Actions to be updated</param>
void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, float[]> lastActions);
void Apply(TensorProxy tensorProxy, IEnumerable<int> actionIds, Dictionary<int, ActionBuffers> lastActions);
}
readonly Dictionary<string, IApplier> m_Dict = new Dictionary<string, IApplier>();

Dictionary<int, List<float>> memories,
object barracudaModel = null)
{
actionSpec.CheckNotHybrid();
// If model is null, no inference to run and exception is thrown before reaching here.
if (barracudaModel == null)
{
return;
}
var model = (Model)barracudaModel;
if (model.UseDeprecated())
{
actionSpec.CheckNotHybrid();
}
m_Dict[TensorNames.ActionOutput] = new ContinuousActionOutputApplier();
var tensorName = model.ContinuousOutputName();
m_Dict[tensorName] = new ContinuousActionOutputApplier(actionSpec);
else
if (actionSpec.NumDiscreteActions > 0)
m_Dict[TensorNames.ActionOutput] =
new DiscreteActionOutputApplier(actionSpec.BranchSizes, seed, allocator);
var tensorName = model.DiscreteOutputName();
m_Dict[tensorName] = new DiscreteActionOutputApplier(actionSpec, seed, allocator);
if (barracudaModel != null)
for (var i = 0; i < model?.memories.Count; i++)
var model = (Model)barracudaModel;
for (var i = 0; i < model?.memories.Count; i++)
{
m_Dict[model.memories[i].output] =
new BarracudaMemoryOutputApplier(model.memories.Count, i, memories);
}
m_Dict[model.memories[i].output] =
new BarracudaMemoryOutputApplier(model.memories.Count, i, memories);
}
}

/// <exception cref="UnityAgentsException"> One of the tensor does not have an
/// associated applier.</exception>
public void ApplyTensors(
IEnumerable<TensorProxy> tensors, IEnumerable<int> actionIds, Dictionary<int, float[]> lastActions)
IEnumerable<TensorProxy> tensors, IEnumerable<int> actionIds, Dictionary<int, ActionBuffers> lastActions)
{
foreach (var tensor in tensors)
{

26
com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs


Dictionary<int, List<float>> memories,
object barracudaModel = null)
{
// If model is null, no inference to run and exception is thrown before reaching here.
if (barracudaModel == null)
{
return;
}
var model = (Model)barracudaModel;
// Generator for Inputs
m_Dict[TensorNames.BatchSizePlaceholder] =
new BatchSizeGenerator(allocator);

new RecurrentInputGenerator(allocator, memories);
if (barracudaModel != null)
for (var i = 0; i < model.memories.Count; i++)
var model = (Model)barracudaModel;
for (var i = 0; i < model.memories.Count; i++)
{
m_Dict[model.memories[i].input] =
new BarracudaRecurrentInputGenerator(i, allocator, memories);
}
m_Dict[model.memories[i].input] =
new BarracudaRecurrentInputGenerator(i, allocator, memories);
}
m_Dict[TensorNames.PreviousActionPlaceholder] =

// Generators for Outputs
m_Dict[TensorNames.ActionOutput] = new BiDimensionalOutputGenerator(allocator);
if (model.HasContinuousOutputs())
{
m_Dict[model.ContinuousOutputName()] = new BiDimensionalOutputGenerator(allocator);
}
if (model.HasDiscreteOutputs())
{
m_Dict[model.DiscreteOutputName()] = new BiDimensionalOutputGenerator(allocator);
}
m_Dict[TensorNames.RecurrentOutput] = new BiDimensionalOutputGenerator(allocator);
m_Dict[TensorNames.ValueEstimateOutput] = new BiDimensionalOutputGenerator(allocator);
}

15
com.unity.ml-agents/Runtime/Inference/TensorNames.cs


public const string recurrentOutputC = "recurrent_out_c";
public const string MemorySize = "memory_size";
public const string VersionNumber = "version_number";
public const string IsContinuousControl = "is_continuous_control";
public const string ActionOutputShape = "action_output_shape";
public const string ActionOutput = "action";
public const string ContinuousActionOutputShape = "continuous_action_output_shape";
public const string DiscreteActionOutputShape = "discrete_action_output_shape";
public const string ContinuousActionOutput = "continuous_actions";
public const string DiscreteActionOutput = "discrete_actions";
public static readonly string[] RequiredConstants =
{
VersionNumber, MemorySize, IsContinuousControl, ActionOutputShape
};
// Deprecated TensorNames entries for backward compatibility
public const string IsContinuousControlDeprecated = "is_continuous_control";
public const string ActionOutputDeprecated = "action";
public const string ActionOutputShapeDeprecated = "action_output_shape";
}
}

20
com.unity.ml-agents/Runtime/Policies/BarracudaPolicy.cs


/// Sensor shapes for the associated Agents. All Agents must have the same shapes for their Sensors.
/// </summary>
List<int[]> m_SensorShapes;
SpaceType m_SpaceType;
ActionSpec m_ActionSpec;
/// <inheritdoc />
public BarracudaPolicy(

{
var modelRunner = Academy.Instance.GetOrCreateModelRunner(model, actionSpec, inferenceDevice);
m_ModelRunner = modelRunner;
actionSpec.CheckNotHybrid();
m_SpaceType = actionSpec.NumContinuousActions > 0 ? SpaceType.Continuous : SpaceType.Discrete;
m_ActionSpec = actionSpec;
}
/// <inheritdoc />

/// <inheritdoc />
public ref readonly ActionBuffers DecideAction()
{
m_ModelRunner?.DecideBatch();
var actions = m_ModelRunner?.GetAction(m_AgentId);
if (m_SpaceType == SpaceType.Continuous)
if (m_ModelRunner == null)
m_LastActionBuffer = new ActionBuffers(actions, Array.Empty<int>());
return ref m_LastActionBuffer;
m_LastActionBuffer = ActionBuffers.Empty;
m_LastActionBuffer = ActionBuffers.FromDiscreteActions(actions);
else
{
m_ModelRunner?.DecideBatch();
m_LastActionBuffer = m_ModelRunner.GetAction(m_AgentId);
}
return ref m_LastActionBuffer;
}

14
com.unity.ml-agents/Runtime/Policies/RemotePolicy.cs


{
int m_AgentId;
string m_FullyQualifiedBehaviorName;
SpaceType m_SpaceType;
ActionSpec m_ActionSpec;
ActionBuffers m_LastActionBuffer;
internal ICommunicator m_Communicator;

m_FullyQualifiedBehaviorName = fullyQualifiedBehaviorName;
m_Communicator = Academy.Instance.Communicator;
m_Communicator.SubscribeBrain(m_FullyQualifiedBehaviorName, actionSpec);
actionSpec.CheckNotHybrid();
m_SpaceType = actionSpec.NumContinuousActions > 0 ? SpaceType.Continuous : SpaceType.Discrete;
m_ActionSpec = actionSpec;
}
/// <inheritdoc />

{
m_Communicator?.DecideBatch();
var actions = m_Communicator?.GetActions(m_FullyQualifiedBehaviorName, m_AgentId);
// TODO figure out how to handle this with multiple space types.
if (m_SpaceType == SpaceType.Continuous)
{
m_LastActionBuffer = new ActionBuffers(actions, Array.Empty<int>());
return ref m_LastActionBuffer;
}
m_LastActionBuffer = ActionBuffers.FromDiscreteActions(actions);
m_LastActionBuffer = ActionBuffers.FromActionSpec(m_ActionSpec, actions);
return ref m_LastActionBuffer;
}

12
com.unity.ml-agents/Tests/Editor/Actuators/ActuatorManagerTests.cs


}
[Test]
public void TestFailOnMixedActionSpace()
{
var manager = new ActuatorManager();
var actuator1 = new TestActuator(ActionSpec.MakeDiscrete(new[] { 1, 2, 3, 4 }), "actuator1");
var actuator2 = new TestActuator(ActionSpec.MakeContinuous(3), "actuator2");
manager.Add(actuator1);
manager.Add(actuator2);
LogAssert.Expect(LogType.Assert, "Actuators on the same Agent must have the same action SpaceType.");
manager.ReadyActuatorsForExecution(new[] { actuator1, actuator2 }, 3, 10, 4);
}
[Test]
public void TestFailOnSameActuatorName()
{
var manager = new ActuatorManager();

74
com.unity.ml-agents/Tests/Editor/EditModeTestInternalBrainTensorApplier.cs


using Unity.Barracuda;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Inference;
using Unity.MLAgents.Policies;
namespace Unity.MLAgents.Tests
{

[Test]
public void ApplyContinuousActionOutput()
{
var actionSpec = ActionSpec.MakeContinuous(3);
var inputTensor = new TensorProxy()
{
shape = new long[] { 2, 3 },

var applier = new ContinuousActionOutputApplier();
var applier = new ContinuousActionOutputApplier(actionSpec);
var actionDict = new Dictionary<int, float[]>() { { 0, null }, { 1, null } };
var actionDict = new Dictionary<int, ActionBuffers>() { { 0, ActionBuffers.Empty }, { 1, ActionBuffers.Empty } };
Assert.AreEqual(actionDict[0][0], 1);
Assert.AreEqual(actionDict[0][1], 2);
Assert.AreEqual(actionDict[0][2], 3);
Assert.AreEqual(actionDict[0].ContinuousActions[0], 1);
Assert.AreEqual(actionDict[0].ContinuousActions[1], 2);
Assert.AreEqual(actionDict[0].ContinuousActions[2], 3);
Assert.AreEqual(actionDict[1][0], 4);
Assert.AreEqual(actionDict[1][1], 5);
Assert.AreEqual(actionDict[1][2], 6);
Assert.AreEqual(actionDict[1].ContinuousActions[0], 4);
Assert.AreEqual(actionDict[1].ContinuousActions[1], 5);
Assert.AreEqual(actionDict[1].ContinuousActions[2], 6);
var actionSpec = ActionSpec.MakeDiscrete(new int[] { 2, 3 });
var inputTensor = new TensorProxy()
{
shape = new long[] { 2, 5 },

new[] { 0.5f, 22.5f, 0.1f, 5f, 1f, 4f, 5f, 6f, 7f, 8f })
};
var alloc = new TensorCachingAllocator();
var applier = new DiscreteActionOutputApplier(new[] { 2, 3 }, 0, alloc);
var applier = new DiscreteActionOutputApplier(actionSpec, 0, alloc);
var actionDict = new Dictionary<int, float[]>() { { 0, null }, { 1, null } };
var actionDict = new Dictionary<int, ActionBuffers>() { { 0, ActionBuffers.Empty }, { 1, ActionBuffers.Empty } };
Assert.AreEqual(actionDict[0][0], 1);
Assert.AreEqual(actionDict[0][1], 1);
Assert.AreEqual(actionDict[0].DiscreteActions[0], 1);
Assert.AreEqual(actionDict[0].DiscreteActions[1], 1);
Assert.AreEqual(actionDict[1][0], 1);
Assert.AreEqual(actionDict[1][1], 2);
Assert.AreEqual(actionDict[1].DiscreteActions[0], 1);
Assert.AreEqual(actionDict[1].DiscreteActions[1], 2);
alloc.Dispose();
}
[Test]
public void ApplyHybridActionOutput()
{
var actionSpec = new ActionSpec(3, 2, new int[] { 2, 3 });
var continuousInputTensor = new TensorProxy()
{
shape = new long[] { 2, 3 },
data = new Tensor(2, 3, new float[] { 1, 2, 3, 4, 5, 6 })
};
var discreteInputTensor = new TensorProxy()
{
shape = new long[] { 2, 8 },
data = new Tensor(
2,
5,
new[] { 0.5f, 22.5f, 0.1f, 5f, 1f, 4f, 5f, 6f, 7f, 8f })
};
var continuousApplier = new ContinuousActionOutputApplier(actionSpec);
var alloc = new TensorCachingAllocator();
var discreteApplier = new DiscreteActionOutputApplier(actionSpec, 0, alloc);
var agentIds = new List<int>() { 0, 1 };
// Dictionary from AgentId to Action
var actionDict = new Dictionary<int, ActionBuffers>() { { 0, ActionBuffers.Empty }, { 1, ActionBuffers.Empty } };
continuousApplier.Apply(continuousInputTensor, agentIds, actionDict);
discreteApplier.Apply(discreteInputTensor, agentIds, actionDict);
Assert.AreEqual(actionDict[0].ContinuousActions[0], 1);
Assert.AreEqual(actionDict[0].ContinuousActions[1], 2);
Assert.AreEqual(actionDict[0].ContinuousActions[2], 3);
Assert.AreEqual(actionDict[0].DiscreteActions[0], 1);
Assert.AreEqual(actionDict[0].DiscreteActions[1], 1);
Assert.AreEqual(actionDict[1].ContinuousActions[0], 4);
Assert.AreEqual(actionDict[1].ContinuousActions[1], 5);
Assert.AreEqual(actionDict[1].ContinuousActions[2], 6);
Assert.AreEqual(actionDict[1].DiscreteActions[0], 1);
Assert.AreEqual(actionDict[1].DiscreteActions[1], 2);
alloc.Dispose();
}
}

62
com.unity.ml-agents/Tests/Editor/ModelRunnerTest.cs


using Unity.Barracuda;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Inference;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Policies;
namespace Unity.MLAgents.Tests

{
const string k_continuous2vis8vec2actionPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.nn";
const string k_discrete1vis0vec_2_3action_recurrModelPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.nn";
NNModel continuous2vis8vec2actionModel;
NNModel discrete1vis0vec_2_3action_recurrModel;
const string k_continuousONNXPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.onnx";
const string k_discreteONNXPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.onnx";
const string k_hybridONNXPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/hybrid0vis53vec_3c_2daction.onnx";
const string k_continuousNNPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action_deprecated.nn";
const string k_discreteNNPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr_deprecated.nn";
NNModel continuousONNXModel;
NNModel discreteONNXModel;
NNModel hybridONNXModel;
NNModel continuousNNModel;
NNModel discreteNNModel;
Test3DSensorComponent sensor_21_20_3;
Test3DSensorComponent sensor_20_22_3;

return ActionSpec.MakeDiscrete(2, 3);
}
ActionSpec GetHybrid0vis53vec_3c_2dActionSpec()
{
return new ActionSpec(3, 1, new int[] { 2 });
}
continuous2vis8vec2actionModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_continuous2vis8vec2actionPath, typeof(NNModel));
discrete1vis0vec_2_3action_recurrModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_discrete1vis0vec_2_3action_recurrModelPath, typeof(NNModel));
continuousONNXModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_continuousONNXPath, typeof(NNModel));
discreteONNXModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_discreteONNXPath, typeof(NNModel));
hybridONNXModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_hybridONNXPath, typeof(NNModel));
continuousNNModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_continuousNNPath, typeof(NNModel));
discreteNNModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_discreteNNPath, typeof(NNModel));
var go = new GameObject("SensorA");
sensor_21_20_3 = go.AddComponent<Test3DSensorComponent>();
sensor_21_20_3.Sensor = new Test3DSensor("SensorA", 21, 20, 3);

[Test]
public void TestModelExist()
{
Assert.IsNotNull(continuous2vis8vec2actionModel);
Assert.IsNotNull(discrete1vis0vec_2_3action_recurrModel);
Assert.IsNotNull(continuousONNXModel);
Assert.IsNotNull(discreteONNXModel);
Assert.IsNotNull(hybridONNXModel);
Assert.IsNotNull(continuousNNModel);
Assert.IsNotNull(discreteNNModel);
var modelRunner = new ModelRunner(continuous2vis8vec2actionModel, GetContinuous2vis8vec2actionActionSpec());
var modelRunner = new ModelRunner(continuousONNXModel, GetContinuous2vis8vec2actionActionSpec());
modelRunner = new ModelRunner(discrete1vis0vec_2_3action_recurrModel, GetDiscrete1vis0vec_2_3action_recurrModelActionSpec());
modelRunner = new ModelRunner(discreteONNXModel, GetDiscrete1vis0vec_2_3action_recurrModelActionSpec());
modelRunner.Dispose();
modelRunner = new ModelRunner(hybridONNXModel, GetHybrid0vis53vec_3c_2dActionSpec());
modelRunner.Dispose();
modelRunner = new ModelRunner(continuousNNModel, GetContinuous2vis8vec2actionActionSpec());
modelRunner.Dispose();
modelRunner = new ModelRunner(discreteNNModel, GetDiscrete1vis0vec_2_3action_recurrModelActionSpec());
modelRunner.Dispose();
}

var modelRunner = new ModelRunner(continuous2vis8vec2actionModel, GetContinuous2vis8vec2actionActionSpec(), InferenceDevice.CPU);
Assert.True(modelRunner.HasModel(continuous2vis8vec2actionModel, InferenceDevice.CPU));
Assert.False(modelRunner.HasModel(continuous2vis8vec2actionModel, InferenceDevice.GPU));
Assert.False(modelRunner.HasModel(discrete1vis0vec_2_3action_recurrModel, InferenceDevice.CPU));
var modelRunner = new ModelRunner(continuousONNXModel, GetContinuous2vis8vec2actionActionSpec(), InferenceDevice.CPU);
Assert.True(modelRunner.HasModel(continuousONNXModel, InferenceDevice.CPU));
Assert.False(modelRunner.HasModel(continuousONNXModel, InferenceDevice.GPU));
Assert.False(modelRunner.HasModel(discreteONNXModel, InferenceDevice.CPU));
modelRunner.Dispose();
}

var actionSpec = GetDiscrete1vis0vec_2_3action_recurrModelActionSpec();
var modelRunner = new ModelRunner(discrete1vis0vec_2_3action_recurrModel, actionSpec);
var modelRunner = new ModelRunner(discreteONNXModel, actionSpec);
var info1 = new AgentInfo();
info1.episodeId = 1;
modelRunner.PutObservations(info1, new[] { sensor_21_20_3.CreateSensor() }.ToList());

modelRunner.DecideBatch();
Assert.IsNotNull(modelRunner.GetAction(1));
Assert.IsNotNull(modelRunner.GetAction(2));
Assert.IsNull(modelRunner.GetAction(3));
Assert.AreEqual(actionSpec.NumDiscreteActions, modelRunner.GetAction(1).Count());
Assert.IsFalse(modelRunner.GetAction(1).Equals(ActionBuffers.Empty));
Assert.IsFalse(modelRunner.GetAction(2).Equals(ActionBuffers.Empty));
Assert.IsTrue(modelRunner.GetAction(3).Equals(ActionBuffers.Empty));
Assert.AreEqual(actionSpec.NumDiscreteActions, modelRunner.GetAction(1).DiscreteActions.Length);
modelRunner.Dispose();
}
}

212
com.unity.ml-agents/Tests/Editor/ParameterLoaderTest.cs


[TestFixture]
public class ParameterLoaderTest
{
const string k_continuous2vis8vec2actionPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.nn";
const string k_discrete1vis0vec_2_3action_recurrModelPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.nn";
NNModel continuous2vis8vec2actionModel;
NNModel discrete1vis0vec_2_3action_recurrModel;
// ONNX model with continuous/discrete action output (support hybrid action)
const string k_continuousONNXPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.onnx";
const string k_discreteONNXPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.onnx";
const string k_hybridONNXPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/hybrid0vis53vec_3c_2daction.onnx";
// NN model with single action output (deprecated, does not support hybrid action).
// Same BrainParameters settings as the corresponding ONNX model.
const string k_continuousNNPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action_deprecated.nn";
const string k_discreteNNPath = "Packages/com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr_deprecated.nn";
NNModel continuousONNXModel;
NNModel discreteONNXModel;
NNModel hybridONNXModel;
NNModel continuousNNModel;
NNModel discreteNNModel;
Test3DSensorComponent sensor_21_20_3;
Test3DSensorComponent sensor_20_22_3;

return validBrainParameters;
}
// TODO: update and enable this after integrating action spec into BrainParameters
// BrainParameters GetHybridBrainParameters()
// {
// var validBrainParameters = new BrainParameters();
// validBrainParameters.VectorObservationSize = 53;
// validBrainParameters.VectorActionSize = new[] { 2 };
// validBrainParameters.NumStackedVectorObservations = 1;
// validBrainParameters.VectorActionSpaceType = SpaceType.Discrete;
// return validBrainParameters;
// }
continuous2vis8vec2actionModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_continuous2vis8vec2actionPath, typeof(NNModel));
discrete1vis0vec_2_3action_recurrModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_discrete1vis0vec_2_3action_recurrModelPath, typeof(NNModel));
continuousONNXModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_continuousONNXPath, typeof(NNModel));
discreteONNXModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_discreteONNXPath, typeof(NNModel));
hybridONNXModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_hybridONNXPath, typeof(NNModel));
continuousNNModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_continuousNNPath, typeof(NNModel));
discreteNNModel = (NNModel)AssetDatabase.LoadAssetAtPath(k_discreteNNPath, typeof(NNModel));
var go = new GameObject("SensorA");
sensor_21_20_3 = go.AddComponent<Test3DSensorComponent>();
sensor_21_20_3.Sensor = new Test3DSensor("SensorA", 21, 20, 3);

[Test]
public void TestModelExist()
{
Assert.IsNotNull(continuous2vis8vec2actionModel);
Assert.IsNotNull(discrete1vis0vec_2_3action_recurrModel);
Assert.IsNotNull(continuousONNXModel);
Assert.IsNotNull(discreteONNXModel);
Assert.IsNotNull(hybridONNXModel);
Assert.IsNotNull(continuousNNModel);
Assert.IsNotNull(discreteNNModel);
[Test]
public void TestGetInputTensors1()
[TestCase(true)]
[TestCase(false)]
public void TestGetInputTensorsContinuous(bool useDeprecatedNNModel)
var model = ModelLoader.Load(continuous2vis8vec2actionModel);
var inputTensors = BarracudaModelParamLoader.GetInputTensors(model);
var inputNames = inputTensors.Select(x => x.name).ToList();
var model = useDeprecatedNNModel ? ModelLoader.Load(continuousNNModel) : ModelLoader.Load(continuousONNXModel);
var inputNames = model.GetInputNames();
Assert.AreEqual(3, inputNames.Count);
Assert.AreEqual(3, inputNames.Count());
Assert.AreEqual(2, BarracudaModelParamLoader.GetNumVisualInputs(model));
Assert.AreEqual(2, model.GetNumVisualInputs());
Assert.AreEqual(0, BarracudaModelParamLoader.GetInputTensors(null).Count);
Assert.AreEqual(0, BarracudaModelParamLoader.GetNumVisualInputs(null));
model = null;
Assert.AreEqual(0, model.GetInputTensors().Count);
Assert.AreEqual(0, model.GetNumVisualInputs());
[Test]
public void TestGetInputTensors2()
[TestCase(true)]
[TestCase(false)]
public void TestGetInputTensorsDiscrete(bool useDeprecatedNNModel)
var model = ModelLoader.Load(discrete1vis0vec_2_3action_recurrModel);
var inputTensors = BarracudaModelParamLoader.GetInputTensors(model);
var inputNames = inputTensors.Select(x => x.name).ToList();
var model = useDeprecatedNNModel ? ModelLoader.Load(discreteNNModel) : ModelLoader.Load(discreteONNXModel);
var inputNames = model.GetInputNames();
// Model should contain 2 inputs : recurrent and visual 1
Assert.Contains(TensorNames.VisualObservationPlaceholderPrefix + "0", inputNames);

[Test]
public void TestGetOutputTensors1()
public void TestGetInputTensorsHybrid()
{
var model = ModelLoader.Load(hybridONNXModel);
var inputNames = model.GetInputNames();
Assert.Contains(TensorNames.VectorObservationPlaceholder, inputNames);
}
[TestCase(true)]
[TestCase(false)]
public void TestGetOutputTensorsContinuous(bool useDeprecatedNNModel)
var model = ModelLoader.Load(continuous2vis8vec2actionModel);
var outputNames = BarracudaModelParamLoader.GetOutputNames(model);
Assert.Contains(TensorNames.ActionOutput, outputNames);
var model = useDeprecatedNNModel ? ModelLoader.Load(continuousNNModel) : ModelLoader.Load(continuousONNXModel);
var outputNames = model.GetOutputNames();
var actionOutputName = useDeprecatedNNModel ? TensorNames.ActionOutputDeprecated : TensorNames.ContinuousActionOutput;
Assert.Contains(actionOutputName, outputNames);
Assert.AreEqual(0, BarracudaModelParamLoader.GetOutputNames(null).Count());
model = null;
Assert.AreEqual(0, model.GetOutputNames().Count());
[Test]
public void TestGetOutputTensors2()
[TestCase(true)]
[TestCase(false)]
public void TestGetOutputTensorsDiscrete(bool useDeprecatedNNModel)
var model = ModelLoader.Load(discrete1vis0vec_2_3action_recurrModel);
var outputNames = BarracudaModelParamLoader.GetOutputNames(model);
Assert.Contains(TensorNames.ActionOutput, outputNames);
var model = useDeprecatedNNModel ? ModelLoader.Load(discreteNNModel) : ModelLoader.Load(discreteONNXModel);
var outputNames = model.GetOutputNames();
var actionOutputName = useDeprecatedNNModel ? TensorNames.ActionOutputDeprecated : TensorNames.DiscreteActionOutput;
Assert.Contains(actionOutputName, outputNames);
public void TestCheckModelValid1()
public void TestGetOutputTensorsHybrid()
var model = ModelLoader.Load(continuous2vis8vec2actionModel);
var model = ModelLoader.Load(hybridONNXModel);
var outputNames = model.GetOutputNames();
Assert.AreEqual(2, outputNames.Count());
Assert.Contains(TensorNames.ContinuousActionOutput, outputNames);
Assert.Contains(TensorNames.DiscreteActionOutput, outputNames);
model = null;
Assert.AreEqual(0, model.GetOutputNames().Count());
}
[TestCase(true)]
[TestCase(false)]
public void TestCheckModelValidContinuous(bool useDeprecatedNNModel)
{
var model = useDeprecatedNNModel ? ModelLoader.Load(continuousNNModel) : ModelLoader.Load(continuousONNXModel);
var validBrainParameters = GetContinuous2vis8vec2actionBrainParameters();
var errors = BarracudaModelParamLoader.CheckModel(

Assert.AreEqual(0, errors.Count()); // There should not be any errors
}
[Test]
public void TestCheckModelValid2()
[TestCase(true)]
[TestCase(false)]
public void TestCheckModelValidDiscrete(bool useDeprecatedNNModel)
var model = ModelLoader.Load(discrete1vis0vec_2_3action_recurrModel);
var model = useDeprecatedNNModel ? ModelLoader.Load(discreteNNModel) : ModelLoader.Load(discreteONNXModel);
var validBrainParameters = GetDiscrete1vis0vec_2_3action_recurrModelBrainParameters();
var errors = BarracudaModelParamLoader.CheckModel(

Assert.AreEqual(0, errors.Count()); // There should not be any errors
}
[Test]
public void TestCheckModelThrowsVectorObservation1()
// TODO: update and enable this test after integrating action spec into BrainParameters
// [Test]
// public void TestCheckModelValidHybrid()
// {
// var model = ModelLoader.Load(hybridModel);
// var validBrainParameters = GetHybridBrainParameters();
// var errors = BarracudaModelParamLoader.CheckModel(
// model, validBrainParameters,
// new SensorComponent[] { }, new ActuatorComponent[0]
// );
// Assert.AreEqual(0, errors.Count()); // There should not be any errors
// }
[TestCase(true)]
[TestCase(false)]
public void TestCheckModelThrowsVectorObservationContinuous(bool useDeprecatedNNModel)
var model = ModelLoader.Load(continuous2vis8vec2actionModel);
var model = useDeprecatedNNModel ? ModelLoader.Load(continuousNNModel) : ModelLoader.Load(continuousONNXModel);
var brainParameters = GetContinuous2vis8vec2actionBrainParameters();
brainParameters.VectorObservationSize = 9; // Invalid observation

Assert.Greater(errors.Count(), 0);
}
[Test]
public void TestCheckModelThrowsVectorObservation2()
[TestCase(true)]
[TestCase(false)]
public void TestCheckModelThrowsVectorObservationDiscrete(bool useDeprecatedNNModel)
var model = ModelLoader.Load(discrete1vis0vec_2_3action_recurrModel);
var model = useDeprecatedNNModel ? ModelLoader.Load(discreteNNModel) : ModelLoader.Load(discreteONNXModel);
var brainParameters = GetDiscrete1vis0vec_2_3action_recurrModelBrainParameters();
brainParameters.VectorObservationSize = 1; // Invalid observation

[Test]
public void TestCheckModelThrowsAction1()
// TODO: update and enable this test after integrating action spec into BrainParameters
// [Test]
// public void TestCheckModelThrowsVectorObservationHybrid()
// {
// var model = ModelLoader.Load(hybridModel);
// var brainParameters = GetHybridBrainParameters();
// brainParameters.VectorObservationSize = 9; // Invalid observation
// var errors = BarracudaModelParamLoader.CheckModel(
// model, brainParameters,
// new SensorComponent[] { }, new ActuatorComponent[0]
// );
// Assert.Greater(errors.Count(), 0);
// brainParameters = GetContinuous2vis8vec2actionBrainParameters();
// brainParameters.NumStackedVectorObservations = 2;// Invalid stacking
// errors = BarracudaModelParamLoader.CheckModel(
// model, brainParameters,
// new SensorComponent[] { }, new ActuatorComponent[0]
// );
// Assert.Greater(errors.Count(), 0);
// }
[TestCase(true)]
[TestCase(false)]
public void TestCheckModelThrowsActionContinuous(bool useDeprecatedNNModel)
var model = ModelLoader.Load(continuous2vis8vec2actionModel);
var model = useDeprecatedNNModel ? ModelLoader.Load(continuousNNModel) : ModelLoader.Load(continuousONNXModel);
var brainParameters = GetContinuous2vis8vec2actionBrainParameters();
brainParameters.VectorActionSize = new[] { 3 }; // Invalid action

Assert.Greater(errors.Count(), 0);
}
[Test]
public void TestCheckModelThrowsAction2()
[TestCase(true)]
[TestCase(false)]
public void TestCheckModelThrowsActionDiscrete(bool useDeprecatedNNModel)
var model = ModelLoader.Load(discrete1vis0vec_2_3action_recurrModel);
var model = useDeprecatedNNModel ? ModelLoader.Load(discreteNNModel) : ModelLoader.Load(discreteONNXModel);
var brainParameters = GetDiscrete1vis0vec_2_3action_recurrModelBrainParameters();
brainParameters.VectorActionSize = new[] { 3, 3 }; // Invalid action

errors = BarracudaModelParamLoader.CheckModel(model, brainParameters, new SensorComponent[] { sensor_21_20_3 }, new ActuatorComponent[0]);
Assert.Greater(errors.Count(), 0);
}
// TODO: update and enable this test after integrating action spec into BrainParameters
// [Test]
// public void TestCheckModelThrowsActionHybrid()
// {
// var model = ModelLoader.Load(hybridModel);
// var brainParameters = GetHybridBrainParameters();
// brainParameters.VectorActionSize = new[] { 3 }; // Invalid action
// var errors = BarracudaModelParamLoader.CheckModel(model, brainParameters, new SensorComponent[] { sensor_21_20_3, sensor_20_22_3 }, new ActuatorComponent[0]);
// Assert.Greater(errors.Count(), 0);
// brainParameters = GetContinuous2vis8vec2actionBrainParameters();
// brainParameters.VectorActionSpaceType = SpaceType.Discrete;// Invalid SpaceType
// errors = BarracudaModelParamLoader.CheckModel(model, brainParameters, new SensorComponent[] { sensor_21_20_3, sensor_20_22_3 }, new ActuatorComponent[0]);
// Assert.Greater(errors.Count(), 0);
// }
[Test]
public void TestCheckModelThrowsNoModel()

2
com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr_deprecated.nn.meta


fileFormatVersion: 2
guid: 8a92fbcd96caa4ef5a93dd55c0c36705
guid: 6d6040ad621454dd5b713beb5483e347
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj

2
com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action_deprecated.nn.meta


fileFormatVersion: 2
guid: a75582ff670094ff2996c1c4ab9dfd15
guid: bf4543cc3c6944794bbba065bdf90079
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj

138
ml-agents-envs/mlagents_envs/base_env.py


)
class _ActionTupleBase(ABC):
"""
An object whose fields correspond to action data of continuous and discrete
spaces. Dimensions are of (n_agents, continuous_size) and (n_agents, discrete_size),
respectively. Note, this also holds when continuous or discrete size is
zero.
"""
def __init__(
self,
continuous: Optional[np.ndarray] = None,
discrete: Optional[np.ndarray] = None,
):
self._continuous: Optional[np.ndarray] = None
self._discrete: Optional[np.ndarray] = None
if continuous is not None:
self.add_continuous(continuous)
if discrete is not None:
self.add_discrete(discrete)
@property
def continuous(self) -> np.ndarray:
return self._continuous
@property
def discrete(self) -> np.ndarray:
return self._discrete
def add_continuous(self, continuous: np.ndarray) -> None:
if continuous.dtype != np.float32:
continuous = continuous.astype(np.float32, copy=False)
if self._discrete is None:
_discrete_dtype = self.get_discrete_dtype()
self._discrete = np.zeros((continuous.shape[0], 0), dtype=_discrete_dtype)
self._continuous = continuous
def add_discrete(self, discrete: np.ndarray) -> None:
_discrete_dtype = self.get_discrete_dtype()
if discrete.dtype != _discrete_dtype:
discrete = discrete.astype(np.int32, copy=False)
if self._continuous is None:
self._continuous = np.zeros((discrete.shape[0], 0), dtype=np.float32)
self._discrete = discrete
@abstractmethod
def get_discrete_dtype(self) -> np.dtype:
pass
class ActionTuple(_ActionTupleBase):
"""
An object whose fields correspond to actions of different types.
Continuous and discrete actions are numpy arrays of type float32 and
int32, respectively and are type checked on construction.
Dimensions are of (n_agents, continuous_size) and (n_agents, discrete_size),
respectively. Note, this also holds when continuous or discrete size is
zero.
"""
def get_discrete_dtype(self) -> np.dtype:
"""
The dtype of a discrete action.
"""
return np.int32
class ActionSpec(NamedTuple):
"""
A NamedTuple containing utility functions and information about the action spaces

"""
return len(self.discrete_branches)
def empty_action(self, n_agents: int) -> np.ndarray:
def empty_action(self, n_agents: int) -> ActionTuple:
Generates a numpy array corresponding to an empty action (all zeros)
Generates ActionTuple corresponding to an empty action (all zeros)
if self.is_continuous():
return np.zeros((n_agents, self.continuous_size), dtype=np.float32)
return np.zeros((n_agents, self.discrete_size), dtype=np.int32)
_continuous = np.zeros((n_agents, self.continuous_size), dtype=np.float32)
_discrete = np.zeros((n_agents, self.discrete_size), dtype=np.int32)
return ActionTuple(continuous=_continuous, discrete=_discrete)
def random_action(self, n_agents: int) -> np.ndarray:
def random_action(self, n_agents: int) -> ActionTuple:
Generates a numpy array corresponding to a random action (either discrete
Generates ActionTuple corresponding to a random action (either discrete
if self.is_continuous():
action = np.random.uniform(
low=-1.0, high=1.0, size=(n_agents, self.continuous_size)
).astype(np.float32)
else:
branch_size = self.discrete_branches
action = np.column_stack(
_continuous = np.random.uniform(
low=-1.0, high=1.0, size=(n_agents, self.continuous_size)
)
_discrete = np.zeros((n_agents, self.discrete_size), dtype=np.int32)
if self.discrete_size > 0:
_discrete = np.column_stack(
branch_size[i], # type: ignore
self.discrete_branches[i], # type: ignore
size=(n_agents),
dtype=np.int32,
)

return action
return ActionTuple(continuous=_continuous, discrete=_discrete)
self, actions: np.ndarray, n_agents: int, name: str
) -> np.ndarray:
self, actions: ActionTuple, n_agents: int, name: str
) -> ActionTuple:
if self.continuous_size > 0:
_size = self.continuous_size
else:
_size = self.discrete_size
_expected_shape = (n_agents, _size)
if actions.shape != _expected_shape:
_expected_shape = (n_agents, self.continuous_size)
if actions.continuous.shape != _expected_shape:
raise UnityActionException(
f"The behavior {name} needs a continuous input of dimension "
f"{_expected_shape} for (<number of agents>, <action size>) but "
f"received input of dimension {actions.continuous.shape}"
)
_expected_shape = (n_agents, self.discrete_size)
if actions.discrete.shape != _expected_shape:
f"The behavior {name} needs an input of dimension "
f"The behavior {name} needs a discrete input of dimension "
f"received input of dimension {actions.shape}"
f"received input of dimension {actions.discrete.shape}"
_expected_type = np.float32 if self.is_continuous() else np.int32
if actions.dtype != _expected_type:
actions = actions.astype(_expected_type)
return actions
@staticmethod

"""
@abstractmethod
def set_actions(self, behavior_name: BehaviorName, action: np.ndarray) -> None:
def set_actions(self, behavior_name: BehaviorName, action: ActionTuple) -> None:
:param action: A two dimensional np.ndarray corresponding to the action
(either int or float)
:param action: ActionTuple tuple of continuous and/or discrete action.
Actions are np.arrays with dimensions (n_agents, continuous_size) and
(n_agents, discrete_size), respectively.
self, behavior_name: BehaviorName, agent_id: AgentId, action: np.ndarray
self, behavior_name: BehaviorName, agent_id: AgentId, action: ActionTuple
) -> None:
"""
Sets the action for one of the agents in the simulation for the next

:param action: A one dimensional np.ndarray corresponding to the action
(either int or float)
:param action: ActionTuple tuple of continuous and/or discrete action
Actions are np.arrays with dimensions (1, continuous_size) and
(1, discrete_size), respectively. Note, this initial dimensions of 1 is because
this action is meant for a single agent.
"""
@abstractmethod

82
ml-agents-envs/mlagents_envs/communicator_objects/brain_parameters_pb2.py


name='mlagents_envs/communicator_objects/brain_parameters.proto',
package='communicator_objects',
syntax='proto3',
serialized_pb=_b('\n9mlagents_envs/communicator_objects/brain_parameters.proto\x12\x14\x63ommunicator_objects\x1a\x33mlagents_envs/communicator_objects/space_type.proto\"\xd9\x01\n\x14\x42rainParametersProto\x12\x1a\n\x12vector_action_size\x18\x03 \x03(\x05\x12\"\n\x1avector_action_descriptions\x18\x05 \x03(\t\x12\x46\n\x18vector_action_space_type\x18\x06 \x01(\x0e\x32$.communicator_objects.SpaceTypeProto\x12\x12\n\nbrain_name\x18\x07 \x01(\t\x12\x13\n\x0bis_training\x18\x08 \x01(\x08J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05\x42%\xaa\x02\"Unity.MLAgents.CommunicatorObjectsb\x06proto3')
serialized_pb=_b('\n9mlagents_envs/communicator_objects/brain_parameters.proto\x12\x14\x63ommunicator_objects\x1a\x33mlagents_envs/communicator_objects/space_type.proto\"\x8b\x01\n\x0f\x41\x63tionSpecProto\x12\x1e\n\x16num_continuous_actions\x18\x01 \x01(\x05\x12\x1c\n\x14num_discrete_actions\x18\x02 \x01(\x05\x12\x1d\n\x15\x64iscrete_branch_sizes\x18\x03 \x03(\x05\x12\x1b\n\x13\x61\x63tion_descriptions\x18\x04 \x03(\t\"\xb6\x02\n\x14\x42rainParametersProto\x12%\n\x1dvector_action_size_deprecated\x18\x03 \x03(\x05\x12-\n%vector_action_descriptions_deprecated\x18\x05 \x03(\t\x12Q\n#vector_action_space_type_deprecated\x18\x06 \x01(\x0e\x32$.communicator_objects.SpaceTypeProto\x12\x12\n\nbrain_name\x18\x07 \x01(\t\x12\x13\n\x0bis_training\x18\x08 \x01(\x08\x12:\n\x0b\x61\x63tion_spec\x18\t \x01(\x0b\x32%.communicator_objects.ActionSpecProtoJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05\x42%\xaa\x02\"Unity.MLAgents.CommunicatorObjectsb\x06proto3')
,
dependencies=[mlagents__envs_dot_communicator__objects_dot_space__type__pb2.DESCRIPTOR,])

_ACTIONSPECPROTO = _descriptor.Descriptor(
name='ActionSpecProto',
full_name='communicator_objects.ActionSpecProto',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='num_continuous_actions', full_name='communicator_objects.ActionSpecProto.num_continuous_actions', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='num_discrete_actions', full_name='communicator_objects.ActionSpecProto.num_discrete_actions', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='discrete_branch_sizes', full_name='communicator_objects.ActionSpecProto.discrete_branch_sizes', index=2,
number=3, type=5, cpp_type=1, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='action_descriptions', full_name='communicator_objects.ActionSpecProto.action_descriptions', index=3,
number=4, type=9, cpp_type=9, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=137,
serialized_end=276,
)
_BRAINPARAMETERSPROTO = _descriptor.Descriptor(
name='BrainParametersProto',
full_name='communicator_objects.BrainParametersProto',

fields=[
_descriptor.FieldDescriptor(
name='vector_action_size', full_name='communicator_objects.BrainParametersProto.vector_action_size', index=0,
name='vector_action_size_deprecated', full_name='communicator_objects.BrainParametersProto.vector_action_size_deprecated', index=0,
number=3, type=5, cpp_type=1, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,

name='vector_action_descriptions', full_name='communicator_objects.BrainParametersProto.vector_action_descriptions', index=1,
name='vector_action_descriptions_deprecated', full_name='communicator_objects.BrainParametersProto.vector_action_descriptions_deprecated', index=1,
number=5, type=9, cpp_type=9, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,

name='vector_action_space_type', full_name='communicator_objects.BrainParametersProto.vector_action_space_type', index=2,
name='vector_action_space_type_deprecated', full_name='communicator_objects.BrainParametersProto.vector_action_space_type_deprecated', index=2,
number=6, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,

message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='action_spec', full_name='communicator_objects.BrainParametersProto.action_spec', index=5,
number=9, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
],
extensions=[
],

extension_ranges=[],
oneofs=[
],
serialized_start=137,
serialized_end=354,
serialized_start=279,
serialized_end=589,
_BRAINPARAMETERSPROTO.fields_by_name['vector_action_space_type'].enum_type = mlagents__envs_dot_communicator__objects_dot_space__type__pb2._SPACETYPEPROTO
_BRAINPARAMETERSPROTO.fields_by_name['vector_action_space_type_deprecated'].enum_type = mlagents__envs_dot_communicator__objects_dot_space__type__pb2._SPACETYPEPROTO
_BRAINPARAMETERSPROTO.fields_by_name['action_spec'].message_type = _ACTIONSPECPROTO
DESCRIPTOR.message_types_by_name['ActionSpecProto'] = _ACTIONSPECPROTO
ActionSpecProto = _reflection.GeneratedProtocolMessageType('ActionSpecProto', (_message.Message,), dict(
DESCRIPTOR = _ACTIONSPECPROTO,
__module__ = 'mlagents_envs.communicator_objects.brain_parameters_pb2'
# @@protoc_insertion_point(class_scope:communicator_objects.ActionSpecProto)
))
_sym_db.RegisterMessage(ActionSpecProto)
BrainParametersProto = _reflection.GeneratedProtocolMessageType('BrainParametersProto', (_message.Message,), dict(
DESCRIPTOR = _BRAINPARAMETERSPROTO,

45
ml-agents-envs/mlagents_envs/communicator_objects/brain_parameters_pb2.pyi


builtin___int = int
class ActionSpecProto(google___protobuf___message___Message):
DESCRIPTOR: google___protobuf___descriptor___Descriptor = ...
num_continuous_actions = ... # type: builtin___int
num_discrete_actions = ... # type: builtin___int
discrete_branch_sizes = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___int]
action_descriptions = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[typing___Text]
def __init__(self,
*,
num_continuous_actions : typing___Optional[builtin___int] = None,
num_discrete_actions : typing___Optional[builtin___int] = None,
discrete_branch_sizes : typing___Optional[typing___Iterable[builtin___int]] = None,
action_descriptions : typing___Optional[typing___Iterable[typing___Text]] = None,
) -> None: ...
@classmethod
def FromString(cls, s: builtin___bytes) -> ActionSpecProto: ...
def MergeFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
def CopyFrom(self, other_msg: google___protobuf___message___Message) -> None: ...
if sys.version_info >= (3,):
def ClearField(self, field_name: typing_extensions___Literal[u"action_descriptions",u"discrete_branch_sizes",u"num_continuous_actions",u"num_discrete_actions"]) -> None: ...
else:
def ClearField(self, field_name: typing_extensions___Literal[u"action_descriptions",b"action_descriptions",u"discrete_branch_sizes",b"discrete_branch_sizes",u"num_continuous_actions",b"num_continuous_actions",u"num_discrete_actions",b"num_discrete_actions"]) -> None: ...
vector_action_size = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___int]
vector_action_descriptions = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[typing___Text]
vector_action_space_type = ... # type: mlagents_envs___communicator_objects___space_type_pb2___SpaceTypeProto
vector_action_size_deprecated = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[builtin___int]
vector_action_descriptions_deprecated = ... # type: google___protobuf___internal___containers___RepeatedScalarFieldContainer[typing___Text]
vector_action_space_type_deprecated = ... # type: mlagents_envs___communicator_objects___space_type_pb2___SpaceTypeProto
@property
def action_spec(self) -> ActionSpecProto: ...
vector_action_size : typing___Optional[typing___Iterable[builtin___int]] = None,
vector_action_descriptions : typing___Optional[typing___Iterable[typing___Text]] = None,
vector_action_space_type : typing___Optional[mlagents_envs___communicator_objects___space_type_pb2___SpaceTypeProto] = None,
vector_action_size_deprecated : typing___Optional[typing___Iterable[builtin___int]] = None,
vector_action_descriptions_deprecated : typing___Optional[typing___Iterable[typing___Text]] = None,
vector_action_space_type_deprecated : typing___Optional[mlagents_envs___communicator_objects___space_type_pb2___SpaceTypeProto] = None,
action_spec : typing___Optional[ActionSpecProto] = None,
) -> None: ...
@classmethod
def FromString(cls, s: builtin___bytes) -> BrainParametersProto: ...

def ClearField(self, field_name: typing_extensions___Literal[u"brain_name",u"is_training",u"vector_action_descriptions",u"vector_action_size",u"vector_action_space_type"]) -> None: ...
def HasField(self, field_name: typing_extensions___Literal[u"action_spec"]) -> builtin___bool: ...
def ClearField(self, field_name: typing_extensions___Literal[u"action_spec",u"brain_name",u"is_training",u"vector_action_descriptions_deprecated",u"vector_action_size_deprecated",u"vector_action_space_type_deprecated"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"brain_name",b"brain_name",u"is_training",b"is_training",u"vector_action_descriptions",b"vector_action_descriptions",u"vector_action_size",b"vector_action_size",u"vector_action_space_type",b"vector_action_space_type"]) -> None: ...
def HasField(self, field_name: typing_extensions___Literal[u"action_spec",b"action_spec"]) -> builtin___bool: ...
def ClearField(self, field_name: typing_extensions___Literal[u"action_spec",b"action_spec",u"brain_name",b"brain_name",u"is_training",b"is_training",u"vector_action_descriptions_deprecated",b"vector_action_descriptions_deprecated",u"vector_action_size_deprecated",b"vector_action_size_deprecated",u"vector_action_space_type_deprecated",b"vector_action_space_type_deprecated"]) -> None: ...

13
ml-agents-envs/mlagents_envs/communicator_objects/capabilities_pb2.py


name='mlagents_envs/communicator_objects/capabilities.proto',
package='communicator_objects',
syntax='proto3',
serialized_pb=_b('\n5mlagents_envs/communicator_objects/capabilities.proto\x12\x14\x63ommunicator_objects\"}\n\x18UnityRLCapabilitiesProto\x12\x1a\n\x12\x62\x61seRLCapabilities\x18\x01 \x01(\x08\x12#\n\x1b\x63oncatenatedPngObservations\x18\x02 \x01(\x08\x12 \n\x18\x63ompressedChannelMapping\x18\x03 \x01(\x08\x42%\xaa\x02\"Unity.MLAgents.CommunicatorObjectsb\x06proto3')
serialized_pb=_b('\n5mlagents_envs/communicator_objects/capabilities.proto\x12\x14\x63ommunicator_objects\"\x94\x01\n\x18UnityRLCapabilitiesProto\x12\x1a\n\x12\x62\x61seRLCapabilities\x18\x01 \x01(\x08\x12#\n\x1b\x63oncatenatedPngObservations\x18\x02 \x01(\x08\x12 \n\x18\x63ompressedChannelMapping\x18\x03 \x01(\x08\x12\x15\n\rhybridActions\x18\x04 \x01(\x08\x42%\xaa\x02\"Unity.MLAgents.CommunicatorObjectsb\x06proto3')
)

message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='hybridActions', full_name='communicator_objects.UnityRLCapabilitiesProto.hybridActions', index=3,
number=4, type=8, cpp_type=7, label=1,
has_default_value=False, default_value=False,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
],
extensions=[
],

extension_ranges=[],
oneofs=[
],
serialized_start=79,
serialized_end=204,
serialized_start=80,
serialized_end=228,
)
DESCRIPTOR.message_types_by_name['UnityRLCapabilitiesProto'] = _UNITYRLCAPABILITIESPROTO

6
ml-agents-envs/mlagents_envs/communicator_objects/capabilities_pb2.pyi


baseRLCapabilities = ... # type: builtin___bool
concatenatedPngObservations = ... # type: builtin___bool
compressedChannelMapping = ... # type: builtin___bool
hybridActions = ... # type: builtin___bool
def __init__(self,
*,

hybridActions : typing___Optional[builtin___bool] = None,
) -> None: ...
@classmethod
def FromString(cls, s: builtin___bytes) -> UnityRLCapabilitiesProto: ...

def ClearField(self, field_name: typing_extensions___Literal[u"baseRLCapabilities",u"compressedChannelMapping",u"concatenatedPngObservations"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"baseRLCapabilities",u"compressedChannelMapping",u"concatenatedPngObservations",u"hybridActions"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"baseRLCapabilities",b"baseRLCapabilities",u"compressedChannelMapping",b"compressedChannelMapping",u"concatenatedPngObservations",b"concatenatedPngObservations"]) -> None: ...
def ClearField(self, field_name: typing_extensions___Literal[u"baseRLCapabilities",b"baseRLCapabilities",u"compressedChannelMapping",b"compressedChannelMapping",u"concatenatedPngObservations",b"concatenatedPngObservations",u"hybridActions",b"hybridActions"]) -> None: ...

27
ml-agents-envs/mlagents_envs/environment.py


DecisionSteps,
TerminalSteps,
BehaviorSpec,
ActionTuple,
BehaviorName,
AgentId,
BehaviorMapping,

# * 1.0.0 - initial version
# * 1.1.0 - support concatenated PNGs for compressed observations.
# * 1.2.0 - support compression mapping for stacked compressed observations.
API_VERSION = "1.2.0"
# * 1.3.0 - support hybrid action spaces.
API_VERSION = "1.3.0"
# Default port that the editor listens on. If an environment executable
# isn't specified, this port will be used.

capabilities.baseRLCapabilities = True
capabilities.concatenatedPngObservations = True
capabilities.compressedChannelMapping = True
capabilities.hybridActions = True
return capabilities
@staticmethod

self._env_state: Dict[str, Tuple[DecisionSteps, TerminalSteps]] = {}
self._env_specs: Dict[str, BehaviorSpec] = {}
self._env_actions: Dict[str, np.ndarray] = {}
self._env_actions: Dict[str, ActionTuple] = {}
self._is_first_message = True
self._update_behavior_specs(aca_output)

f"agent group in the environment"
)
def set_actions(self, behavior_name: BehaviorName, action: np.ndarray) -> None:
def set_actions(self, behavior_name: BehaviorName, action: ActionTuple) -> None:
self._assert_behavior_exists(behavior_name)
if behavior_name not in self._env_state:
return

self._env_actions[behavior_name] = action
def set_action_for_agent(
self, behavior_name: BehaviorName, agent_id: AgentId, action: np.ndarray
self, behavior_name: BehaviorName, agent_id: AgentId, action: ActionTuple
) -> None:
self._assert_behavior_exists(behavior_name)
if behavior_name not in self._env_state:

agent_id
)
) from ie
self._env_actions[behavior_name][index] = action
if action_spec.continuous_size > 0:
self._env_actions[behavior_name].continuous[index] = action.continuous[0, :]
if action_spec.discrete_size > 0:
self._env_actions[behavior_name].discrete[index] = action.discrete[0, :]
def get_steps(
self, behavior_name: BehaviorName

@timed
def _generate_step_input(
self, vector_action: Dict[str, np.ndarray]
self, vector_action: Dict[str, ActionTuple]
) -> UnityInputProto:
rl_in = UnityRLInputProto()
for b in vector_action:

for i in range(n_agents):
action = AgentActionProto(vector_actions=vector_action[b][i])
# TODO add separate fields for continuous and discrete actions in AgentActionProto
_act = []
if vector_action[b].continuous is not None:
_act.append(vector_action[b].continuous[i])
if vector_action[b].discrete is not None:
_act.append(vector_action[b].discrete[i])
_act = np.concatenate(_act, axis=0)
action = AgentActionProto(vector_actions=_act)
rl_in.agent_actions[b].value.extend([action])
rl_in.command = STEP
rl_in.side_channel = bytes(

8
ml-agents-envs/mlagents_envs/mock_communicator.py


def initialize(self, inputs: UnityInputProto) -> UnityOutputProto:
bp = BrainParametersProto(
vector_action_size=[2],
vector_action_descriptions=["", ""],
vector_action_space_type=discrete if self.is_discrete else continuous,
vector_action_size_deprecated=[2],
vector_action_descriptions_deprecated=["", ""],
vector_action_space_type_deprecated=discrete
if self.is_discrete
else continuous,
brain_name=self.brain_name,
is_training=True,
)

11
ml-agents-envs/mlagents_envs/rpc_utils.py


from mlagents_envs.base_env import (
BehaviorSpec,
BehaviorSpec,
DecisionSteps,
TerminalSteps,
)

:return: BehaviorSpec object.
"""
observation_shape = [tuple(obs.shape) for obs in agent_info.observations]
if brain_param_proto.vector_action_space_type == 1:
action_spec = ActionSpec(brain_param_proto.vector_action_size[0], ())
else:
action_spec = ActionSpec(0, tuple(brain_param_proto.vector_action_size))
action_spec_proto = brain_param_proto.action_spec
action_spec = ActionSpec(
action_spec_proto.num_continuous_actions,
tuple(branch for branch in action_spec_proto.discrete_branch_sizes),
)
return BehaviorSpec(observation_shape, action_spec)

27
ml-agents-envs/mlagents_envs/tests/test_steps.py


assert specs.discrete_branches == ()
assert specs.discrete_size == 0
assert specs.continuous_size == 3
assert specs.empty_action(5).shape == (5, 3)
assert specs.empty_action(5).dtype == np.float32
assert specs.empty_action(5).continuous.shape == (5, 3)
assert specs.empty_action(5).continuous.dtype == np.float32
assert specs.empty_action(5).shape == (5, 1)
assert specs.empty_action(5).dtype == np.int32
assert specs.empty_action(5).discrete.shape == (5, 1)
assert specs.empty_action(5).discrete.dtype == np.int32
specs = ActionSpec(3, (3,))
assert specs.continuous_size == 3
assert specs.discrete_branches == (3,)
assert specs.discrete_size == 1
assert specs.empty_action(5).continuous.shape == (5, 3)
assert specs.empty_action(5).continuous.dtype == np.float32
assert specs.empty_action(5).discrete.shape == (5, 1)
assert specs.empty_action(5).discrete.dtype == np.int32
def test_action_generator():

zero_action = specs.empty_action(4)
zero_action = specs.empty_action(4).continuous
random_action = specs.random_action(4)
print(specs.random_action(4))
random_action = specs.random_action(4).continuous
print(random_action)
assert random_action.dtype == np.float32
assert random_action.shape == (4, action_len)
assert np.min(random_action) >= -1

action_shape = (10, 20, 30)
specs = ActionSpec.create_discrete(action_shape)
zero_action = specs.empty_action(4)
zero_action = specs.empty_action(4).discrete
random_action = specs.random_action(4)
random_action = specs.random_action(4).discrete
assert random_action.dtype == np.int32
assert random_action.shape == (4, len(action_shape))
assert np.min(random_action) >= 0

6
ml-agents-envs/mlagents_envs/tests/test_envs.py


import pytest
from mlagents_envs.environment import UnityEnvironment
from mlagents_envs.base_env import DecisionSteps, TerminalSteps
from mlagents_envs.base_env import DecisionSteps, TerminalSteps, ActionTuple
from mlagents_envs.exception import UnityEnvironmentException, UnityActionException
from mlagents_envs.mock_communicator import MockCommunicator

env.set_actions("RealFakeBrain", spec.action_spec.empty_action(n_agents - 1))
decision_steps, terminal_steps = env.get_steps("RealFakeBrain")
n_agents = len(decision_steps)
env.set_actions("RealFakeBrain", spec.action_spec.empty_action(n_agents) - 1)
_empty_act = spec.action_spec.empty_action(n_agents)
next_action = ActionTuple(_empty_act.continuous - 1, _empty_act.discrete - 1)
env.set_actions("RealFakeBrain", next_action)
env.step()
env.close()

8
ml-agents-envs/mlagents_envs/tests/test_rpc_utils.py


def test_agent_behavior_spec_from_proto():
agent_proto = generate_list_agent_proto(1, [(3,), (4,)])[0]
bp = BrainParametersProto()
bp.vector_action_size.extend([5, 4])
bp.vector_action_space_type = 0
bp.vector_action_size_deprecated.extend([5, 4])
bp.vector_action_space_type_deprecated = 0
behavior_spec = behavior_spec_from_proto(bp, agent_proto)
assert behavior_spec.action_spec.is_discrete()
assert not behavior_spec.action_spec.is_continuous()

bp = BrainParametersProto()
bp.vector_action_size.extend([6])
bp.vector_action_space_type = 1
bp.vector_action_size_deprecated.extend([6])
bp.vector_action_space_type_deprecated = 1
behavior_spec = behavior_spec_from_proto(bp, agent_proto)
assert not behavior_spec.action_spec.is_discrete()
assert behavior_spec.action_spec.is_continuous()

26
ml-agents/mlagents/trainers/trajectory.py


import numpy as np
from mlagents.trainers.buffer import AgentBuffer
from mlagents_envs.base_env import ActionTuple
from mlagents.trainers.torch.action_log_probs import LogProbsTuple
class AgentExperience(NamedTuple):

action: np.ndarray
action_probs: np.ndarray
action: ActionTuple
action_probs: LogProbsTuple
action_pre: np.ndarray # TODO: Remove this
action_mask: np.ndarray
prev_action: np.ndarray

agent_buffer_trajectory["done"].append(exp.done)
# Add the outputs of the last eval
if exp.action_pre is not None:
actions_pre = exp.action_pre
agent_buffer_trajectory["actions_pre"].append(actions_pre)
agent_buffer_trajectory["actions_pre"].append(exp.action_pre)
# value is a dictionary from name of reward to value estimate of the value head
agent_buffer_trajectory["actions"].append(exp.action)
agent_buffer_trajectory["action_probs"].append(exp.action_probs)
# Adds the log prob and action of continuous/discrete separately
agent_buffer_trajectory["continuous_action"].append(exp.action.continuous)
agent_buffer_trajectory["discrete_action"].append(exp.action.discrete)
agent_buffer_trajectory["continuous_log_probs"].append(
exp.action_probs.continuous
)
agent_buffer_trajectory["discrete_log_probs"].append(
exp.action_probs.discrete
)
# Store action masks if necessary. Note that 1 means active, while
# in AgentExperience False means active.

else:
# This should never be needed unless the environment somehow doesn't supply the
# action mask in a discrete space.
action_shape = exp.action.discrete.shape
np.ones(exp.action_probs.shape, dtype=np.float32), padding_value=1
np.ones(action_shape, dtype=np.float32), padding_value=1
agent_buffer_trajectory["prev_action"].append(exp.prev_action)
agent_buffer_trajectory["environment_rewards"].append(exp.reward)

4
ml-agents/mlagents/trainers/optimizer/tf_optimizer.py


[self.value_heads, self.policy.memory_out, self.memory_out], feed_dict
)
prev_action = (
batch["actions"][-1] if not self.policy.use_continuous_act else None
batch["discrete_action"][-1]
if not self.policy.use_continuous_act
else None
)
else:
value_estimates = self.sess.run(self.value_heads, feed_dict)

18
ml-agents/mlagents/trainers/agent_processor.py


import queue
from mlagents_envs.base_env import (
ActionTuple,
DecisionSteps,
DecisionStep,
TerminalSteps,

from mlagents.trainers.trajectory import Trajectory, AgentExperience
from mlagents.trainers.policy import Policy
from mlagents.trainers.action_info import ActionInfo, ActionInfoOutputs
from mlagents.trainers.torch.action_log_probs import LogProbsTuple
from mlagents.trainers.stats import StatsReporter
from mlagents.trainers.behavior_id_utils import get_global_agent_id

done = terminated # Since this is an ongoing step
interrupted = step.interrupted if terminated else False
# Add the outputs of the last eval
action = stored_take_action_outputs["action"][idx]
stored_actions = stored_take_action_outputs["action"]
action_tuple = ActionTuple(
continuous=stored_actions.continuous[idx],
discrete=stored_actions.discrete[idx],
)
action_probs = stored_take_action_outputs["log_probs"][idx]
stored_action_probs = stored_take_action_outputs["log_probs"]
log_probs_tuple = LogProbsTuple(
continuous=stored_action_probs.continuous[idx],
discrete=stored_action_probs.discrete[idx],
)
action_mask = stored_decision_step.action_mask
prev_action = self.policy.retrieve_previous_action([global_id])[0, :]
experience = AgentExperience(

action=action,
action_probs=action_probs,
action=action_tuple,
action_probs=log_probs_tuple,
action_pre=action_pre,
action_mask=action_mask,
prev_action=prev_action,

1
ml-agents/mlagents/trainers/env_manager.py


from abc import ABC, abstractmethod
from typing import List, Dict, NamedTuple, Iterable, Tuple
from mlagents_envs.base_env import (
DecisionSteps,

2
ml-agents/mlagents/trainers/subprocess_env_manager.py


if req.cmd == EnvironmentCommand.STEP:
all_action_info = req.payload
for brain_name, action_info in all_action_info.items():
if len(action_info.action) != 0:
if len(action_info.agent_ids) > 0:
env.set_actions(brain_name, action_info.action)
env.step()
all_step_result = _generate_all_results()

2
ml-agents/mlagents/trainers/buffer.py


class AgentBufferField(list):
"""
AgentBufferField is a list of numpy arrays. When an agent collects a field, you can add it to his
AgentBufferField is a list of numpy arrays. When an agent collects a field, you can add it to its
AgentBufferField with the append method.
"""

2
ml-agents/mlagents/trainers/ppo/trainer.py


behavior_spec,
self.trainer_settings,
condition_sigma_on_obs=False, # Faster training for PPO
separate_critic=behavior_spec.action_spec.is_continuous(),
separate_critic=behavior_spec.action_spec.continuous_size > 0,
)
return policy

13
ml-agents/mlagents/trainers/ppo/optimizer_torch.py


from mlagents.trainers.policy.torch_policy import TorchPolicy
from mlagents.trainers.optimizer.torch_optimizer import TorchOptimizer
from mlagents.trainers.settings import TrainerSettings, PPOSettings
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.action_log_probs import ActionLogProbs
from mlagents.trainers.torch.utils import ModelUtils

advantage = advantages.unsqueeze(-1)
decay_epsilon = self.hyperparameters.epsilon
r_theta = torch.exp(log_probs - old_log_probs)
p_opt_a = r_theta * advantage
p_opt_b = (

vec_obs = [ModelUtils.list_to_tensor(batch["vector_obs"])]
act_masks = ModelUtils.list_to_tensor(batch["action_mask"])
if self.policy.use_continuous_act:
actions = ModelUtils.list_to_tensor(batch["actions"]).unsqueeze(-1)
else:
actions = ModelUtils.list_to_tensor(batch["actions"], dtype=torch.long)
actions = AgentAction.from_dict(batch)
memories = [
ModelUtils.list_to_tensor(batch["memory"][i])

vis_obs.append(vis_ob)
else:
vis_obs = []
log_probs, entropy, values = self.policy.evaluate_actions(
vec_obs,
vis_obs,

seq_len=self.policy.sequence_length,
)
old_log_probs = ActionLogProbs.from_dict(batch).flatten()
log_probs = log_probs.flatten()
loss_masks = ModelUtils.list_to_tensor(batch["masks"], dtype=torch.bool)
value_loss = self.ppo_value_loss(
values, old_values, returns, decay_eps, loss_masks

log_probs,
ModelUtils.list_to_tensor(batch["action_probs"]),
old_log_probs,
loss_masks,
)
loss = (

15
ml-agents/mlagents/trainers/ppo/optimizer_tf.py


self.policy.sequence_length_ph: self.policy.sequence_length,
self.policy.mask_input: mini_batch["masks"] * burn_in_mask,
self.advantage: mini_batch["advantages"],
self.all_old_log_probs: mini_batch["action_probs"],
if self.policy.use_continuous_act: # For hybrid action buffer support
feed_dict[self.all_old_log_probs] = mini_batch["continuous_log_probs"]
else:
feed_dict[self.all_old_log_probs] = mini_batch["discrete_log_probs"]
feed_dict[self.policy.output] = mini_batch["actions"]
if self.policy.use_recurrent:
feed_dict[self.policy.prev_action] = mini_batch["prev_action"]
if self.policy.use_continuous_act: # For hybrid action buffer support
feed_dict[self.policy.output] = mini_batch["continuous_action"]
else:
feed_dict[self.policy.output] = mini_batch["discrete_action"]
if self.policy.use_recurrent:
feed_dict[self.policy.prev_action] = mini_batch["prev_action"]
feed_dict[self.policy.action_masks] = mini_batch["action_mask"]
if "vector_obs" in mini_batch:
feed_dict[self.policy.vector_in] = mini_batch["vector_obs"]

6
ml-agents/mlagents/trainers/tf/components/bc/module.py


self.policy.batch_size_ph: n_sequences,
self.policy.sequence_length_ph: self.policy.sequence_length,
}
feed_dict[self.model.action_in_expert] = mini_batch_demo["actions"]
feed_dict[self.model.action_in_expert] = mini_batch_demo["discrete_action"]
feed_dict[self.policy.action_masks] = np.ones(
(
self.n_sequences * self.policy.sequence_length,

)
else:
feed_dict[self.model.action_in_expert] = mini_batch_demo[
"continuous_action"
]
if self.policy.vec_obs_size > 0:
feed_dict[self.policy.vector_in] = mini_batch_demo["vector_obs"]
for i, _ in enumerate(self.policy.visual_in):

10
ml-agents/mlagents/trainers/tf/components/reward_signals/curiosity/signal.py


def evaluate_batch(self, mini_batch: AgentBuffer) -> RewardSignalResult:
feed_dict: Dict[tf.Tensor, Any] = {
self.policy.batch_size_ph: len(mini_batch["actions"]),
self.policy.batch_size_ph: len(mini_batch["vector_obs"]),
self.policy.sequence_length_ph: self.policy.sequence_length,
}
if self.policy.use_vec_obs:

feed_dict[self.model.next_visual_in[i]] = _next_obs
if self.policy.use_continuous_act:
feed_dict[self.policy.selected_actions] = mini_batch["actions"]
feed_dict[self.policy.selected_actions] = mini_batch["continuous_action"]
feed_dict[self.policy.output] = mini_batch["actions"]
feed_dict[self.policy.output] = mini_batch["discrete_action"]
unscaled_reward = self.policy.sess.run(
self.model.intrinsic_reward, feed_dict=feed_dict
)

policy.mask_input: mini_batch["masks"],
}
if self.policy.use_continuous_act:
feed_dict[policy.selected_actions] = mini_batch["actions"]
feed_dict[policy.selected_actions] = mini_batch["continuous_action"]
feed_dict[policy.output] = mini_batch["actions"]
feed_dict[policy.output] = mini_batch["discrete_action"]
if self.policy.use_vec_obs:
feed_dict[policy.vector_in] = mini_batch["vector_obs"]
feed_dict[self.model.next_vector_in] = mini_batch["next_vector_in"]

17
ml-agents/mlagents/trainers/tf/components/reward_signals/gail/signal.py


def evaluate_batch(self, mini_batch: AgentBuffer) -> RewardSignalResult:
feed_dict: Dict[tf.Tensor, Any] = {
self.policy.batch_size_ph: len(mini_batch["actions"]),
self.policy.batch_size_ph: len(mini_batch["vector_obs"]),
self.policy.sequence_length_ph: self.policy.sequence_length,
}
if self.model.use_vail:

feed_dict[self.policy.visual_in[i]] = _obs
if self.policy.use_continuous_act:
feed_dict[self.policy.selected_actions] = mini_batch["actions"]
feed_dict[self.policy.selected_actions] = mini_batch["continuous_action"]
feed_dict[self.policy.output] = mini_batch["actions"]
feed_dict[self.policy.output] = mini_batch["discrete_action"]
feed_dict[self.model.done_policy_holder] = np.array(
mini_batch["done"]
).flatten()

if self.model.use_vail:
feed_dict[self.model.use_noise] = [1]
feed_dict[self.model.action_in_expert] = np.array(mini_batch_demo["actions"])
feed_dict[policy.selected_actions] = mini_batch["actions"]
feed_dict[policy.selected_actions] = mini_batch["continuous_action"]
feed_dict[self.model.action_in_expert] = np.array(
mini_batch_demo["continuous_action"]
)
feed_dict[policy.output] = mini_batch["actions"]
feed_dict[policy.output] = mini_batch["discrete_action"]
feed_dict[self.model.action_in_expert] = np.array(
mini_batch_demo["discrete_action"]
)
if self.policy.use_vis_obs > 0:
for i in range(len(policy.visual_in)):

10
ml-agents/mlagents/trainers/demo_loader.py


for i, obs in enumerate(split_obs.visual_observations):
demo_raw_buffer["visual_obs%d" % i].append(obs)
demo_raw_buffer["vector_obs"].append(split_obs.vector_observations)
demo_raw_buffer["actions"].append(current_pair_info.action_info.vector_actions)
# TODO: update to read from the new proto format
if behavior_spec.action_spec.continuous_size > 0:
demo_raw_buffer["continuous_action"].append(
current_pair_info.action_info.vector_actions
)
if behavior_spec.action_spec.discrete_size > 0:
demo_raw_buffer["discrete_action"].append(
current_pair_info.action_info.vector_actions
)
demo_raw_buffer["prev_action"].append(previous_action)
if next_done:
demo_raw_buffer.resequence_and_append(

64
ml-agents/mlagents/trainers/policy/torch_policy.py


SeparateActorCritic,
GlobalSteps,
)
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.action_log_probs import ActionLogProbs
EPSILON = 1e-7 # Small value to avoid divide by zero

) -> Tuple[SplitObservations, np.ndarray]:
vec_vis_obs = SplitObservations.from_observations(decision_requests.obs)
mask = None
if not self.use_continuous_act:
if self.behavior_spec.action_spec.discrete_size > 0:
mask = torch.ones([len(decision_requests), np.sum(self.act_size)])
if decision_requests.action_mask is not None:
mask = torch.as_tensor(

masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
seq_len: int = 1,
all_log_probs: bool = False,
) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
) -> Tuple[AgentAction, ActionLogProbs, torch.Tensor, torch.Tensor]:
"""
:param vec_obs: List of vector observations.
:param vis_obs: List of visual observations.

:param all_log_probs: Returns (for discrete actions) a tensor of log probs, one for each action.
:return: Tuple of actions, log probabilities (dependent on all_log_probs), entropies, and
output memories, all as Torch Tensors.
:return: Tuple of AgentAction, ActionLogProbs, entropies, and output memories.
if memories is None:
dists, memories = self.actor_critic.get_dists(
vec_obs, vis_obs, masks, memories, seq_len
)
else:
# If we're using LSTM. we need to execute the values to get the critic memories
dists, _, memories = self.actor_critic.get_dist_and_value(
vec_obs, vis_obs, masks, memories, seq_len
)
action_list = self.actor_critic.sample_action(dists)
log_probs, entropies, all_logs = ModelUtils.get_probs_and_entropy(
action_list, dists
)
actions = torch.stack(action_list, dim=-1)
if self.use_continuous_act:
actions = actions[:, :, 0]
else:
actions = actions[:, 0, :]
# Use the sum of entropy across actions, not the mean
entropy_sum = torch.sum(entropies, dim=1)
return (
actions,
all_logs if all_log_probs else log_probs,
entropy_sum,
memories,
actions, log_probs, entropies, _, memories = self.actor_critic.get_action_stats_and_value(
vec_obs, vis_obs, masks, memories, seq_len
return (actions, log_probs, entropies, memories)
actions: torch.Tensor,
actions: AgentAction,
) -> Tuple[torch.Tensor, torch.Tensor, Dict[str, torch.Tensor]]:
dists, value_heads, _ = self.actor_critic.get_dist_and_value(
vec_obs, vis_obs, masks, memories, seq_len
) -> Tuple[ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor]]:
log_probs, entropies, value_heads = self.actor_critic.get_stats_and_value(
vec_obs, vis_obs, actions, masks, memories, seq_len
action_list = [actions[..., i] for i in range(actions.shape[-1])]
log_probs, entropies, _ = ModelUtils.get_probs_and_entropy(action_list, dists)
# Use the sum of entropy across actions, not the mean
entropy_sum = torch.sum(entropies, dim=1)
return log_probs, entropy_sum, value_heads
return log_probs, entropies, value_heads
@timed
def evaluate(

action, log_probs, entropy, memories = self.sample_actions(
vec_obs, vis_obs, masks=masks, memories=memories
)
run_out["action"] = ModelUtils.to_numpy(action)
run_out["pre_action"] = ModelUtils.to_numpy(action)
# Todo - make pre_action difference
run_out["log_probs"] = ModelUtils.to_numpy(log_probs)
action_tuple = action.to_action_tuple()
run_out["action"] = action_tuple
run_out["pre_action"] = (
action_tuple.continuous if self.use_continuous_act else None
)
run_out["log_probs"] = log_probs.to_log_probs_tuple()
run_out["entropy"] = ModelUtils.to_numpy(entropy)
run_out["learning_rate"] = 0.0
if self.use_recurrent:

30
ml-agents/mlagents/trainers/policy/policy.py


from typing import Dict, List, Optional
import numpy as np
from mlagents_envs.base_env import DecisionSteps
from mlagents_envs.base_env import ActionTuple, BehaviorSpec, DecisionSteps
from mlagents_envs.base_env import BehaviorSpec
from mlagents.trainers.settings import TrainerSettings, NetworkSettings

self.trainer_settings = trainer_settings
self.network_settings: NetworkSettings = trainer_settings.network_settings
self.seed = seed
if (
self.behavior_spec.action_spec.continuous_size > 0
and self.behavior_spec.action_spec.discrete_size > 0
):
raise UnityPolicyException("Trainers do not support mixed action spaces.")
self.act_size = (
list(self.behavior_spec.action_spec.discrete_branches)
if self.behavior_spec.action_spec.is_discrete()

1 for shape in behavior_spec.observation_shapes if len(shape) == 3
)
self.use_continuous_act = self.behavior_spec.action_spec.is_continuous()
# This line will be removed in the ActionBuffer change
self.num_branches = (
self.behavior_spec.action_spec.continuous_size
+ self.behavior_spec.action_spec.discrete_size
)
self.previous_action_dict: Dict[str, np.array] = {}
self.previous_action_dict: Dict[str, np.ndarray] = {}
self.memory_dict: Dict[str, np.ndarray] = {}
self.normalize = trainer_settings.network_settings.normalize
self.use_recurrent = self.network_settings.memory is not None

) -> None:
if memory_matrix is None:
return
for index, agent_id in enumerate(agent_ids):
self.memory_dict[agent_id] = memory_matrix[index, :]

if agent_id in self.memory_dict:
self.memory_dict.pop(agent_id)
def make_empty_previous_action(self, num_agents):
def make_empty_previous_action(self, num_agents: int) -> np.ndarray:
return np.zeros((num_agents, self.num_branches), dtype=np.int)
return np.zeros(
(num_agents, self.behavior_spec.action_spec.discrete_size), dtype=np.int32
)
self, agent_ids: List[str], action_matrix: Optional[np.ndarray]
self, agent_ids: List[str], action_tuple: ActionTuple
if action_matrix is None:
return
self.previous_action_dict[agent_id] = action_matrix[index, :]
self.previous_action_dict[agent_id] = action_tuple.discrete[index, :]
action_matrix = np.zeros((len(agent_ids), self.num_branches), dtype=np.int)
action_matrix = self.make_empty_previous_action(len(agent_ids))
for index, agent_id in enumerate(agent_ids):
if agent_id in self.previous_action_dict:
action_matrix[index, :] = self.previous_action_dict[agent_id]

27
ml-agents/mlagents/trainers/policy/tf_policy.py


from mlagents.tf_utils import tf
from mlagents import tf_utils
from mlagents_envs.exception import UnityException
from mlagents_envs.base_env import BehaviorSpec
from mlagents.trainers.torch.action_log_probs import LogProbsTuple
from mlagents_envs.base_env import DecisionSteps
from mlagents_envs.base_env import DecisionSteps, ActionTuple, BehaviorSpec
from mlagents.trainers.tf.models import ModelUtils
from mlagents.trainers.settings import TrainerSettings, EncoderType
from mlagents.trainers import __version__

reparameterize,
condition_sigma_on_obs,
)
if (
self.behavior_spec.action_spec.continuous_size > 0
and self.behavior_spec.action_spec.discrete_size > 0
):
raise UnityPolicyException(
"TensorFlow does not support mixed action spaces. Please run with the Torch framework."
)
# for ghost trainer save/load snapshots
self.assign_phs: List[tf.Tensor] = []
self.assign_ops: List[tf.Operation] = []

feed_dict[self.prev_action] = self.retrieve_previous_action(
global_agent_ids
)
feed_dict[self.memory_in] = self.retrieve_memories(global_agent_ids)
feed_dict = self.fill_eval_dict(feed_dict, decision_requests)
run_out = self._execute_model(feed_dict, self.inference_dict)

)
self.save_memories(global_agent_ids, run_out.get("memory_out"))
# For Compatibility with buffer changes for hybrid action support
if "log_probs" in run_out:
log_probs_tuple = LogProbsTuple()
if self.behavior_spec.action_spec.is_continuous():
log_probs_tuple.add_continuous(run_out["log_probs"])
else:
log_probs_tuple.add_discrete(run_out["log_probs"])
run_out["log_probs"] = log_probs_tuple
if "action" in run_out:
action_tuple = ActionTuple()
if self.behavior_spec.action_spec.is_continuous():
action_tuple.add_continuous(run_out["action"])
else:
action_tuple.add_discrete(run_out["action"])
run_out["action"] = action_tuple
return ActionInfo(
action=run_out.get("action"),
value=run_out.get("value"),

6
ml-agents/mlagents/trainers/sac/optimizer_tf.py


feed_dict[self.rewards_holders[name]] = batch[f"{name}_rewards"]
if self.policy.use_continuous_act:
feed_dict[self.policy_network.external_action_in] = batch["actions"]
feed_dict[self.policy_network.external_action_in] = batch[
"continuous_action"
]
feed_dict[policy.output] = batch["actions"]
feed_dict[policy.output] = batch["discrete_action"]
if self.policy.use_recurrent:
feed_dict[policy.prev_action] = batch["prev_action"]
feed_dict[policy.action_masks] = batch["action_mask"]

321
ml-agents/mlagents/trainers/sac/optimizer_torch.py


import numpy as np
from typing import Dict, List, Mapping, cast, Tuple, Optional
from typing import Dict, List, Mapping, NamedTuple, cast, Tuple, Optional
from mlagents_envs.base_env import ActionSpec
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.action_log_probs import ActionLogProbs
from mlagents_envs.base_env import ActionSpec
from mlagents.trainers.exception import UnityTrainerException
from mlagents.trainers.settings import TrainerSettings, SACSettings
from contextlib import ExitStack

action_spec: ActionSpec,
):
super().__init__()
self.action_spec = action_spec
if self.action_spec.is_continuous():
self.act_size = self.action_spec.continuous_size
num_value_outs = 1
num_action_ins = self.act_size
num_value_outs = max(sum(action_spec.discrete_branches), 1)
num_action_ins = int(action_spec.continuous_size)
else:
self.act_size = self.action_spec.discrete_branches
num_value_outs = sum(self.act_size)
num_action_ins = 0
self.q1_network = ValueNetwork(
stream_names,
observation_shapes,

)
return q1_out, q2_out
class TargetEntropy(NamedTuple):
discrete: List[float] = [] # One per branch
continuous: float = 0.0
class LogEntCoef(nn.Module):
def __init__(self, discrete, continuous):
super().__init__()
self.discrete = discrete
self.continuous = continuous
def __init__(self, policy: TorchPolicy, trainer_params: TrainerSettings):
super().__init__(policy, trainer_params)
hyperparameters: SACSettings = cast(SACSettings, trainer_params.hyperparameters)

self.policy = policy
self.act_size = policy.act_size
policy_network_settings = policy.network_settings
self.tau = hyperparameters.tau

name: int(not self.reward_signals[name].ignore_done)
for name in self.stream_names
}
self._action_spec = self.policy.behavior_spec.action_spec
self.policy.behavior_spec.action_spec,
self._action_spec,
)
self.target_network = ValueNetwork(

self.policy.actor_critic.critic, self.target_network, 1.0
)
self._log_ent_coef = torch.nn.Parameter(
torch.log(torch.as_tensor([self.init_entcoef] * len(self.act_size))),
# We create one entropy coefficient per action, whether discrete or continuous.
_disc_log_ent_coef = torch.nn.Parameter(
torch.log(
torch.as_tensor(
[self.init_entcoef] * len(self._action_spec.discrete_branches)
)
),
requires_grad=True,
)
_cont_log_ent_coef = torch.nn.Parameter(
torch.log(
torch.as_tensor([self.init_entcoef] * self._action_spec.continuous_size)
),
if self.policy.use_continuous_act:
self.target_entropy = torch.as_tensor(
-1
* self.continuous_target_entropy_scale
* np.prod(self.act_size[0]).astype(np.float32)
)
else:
self.target_entropy = [
self.discrete_target_entropy_scale * np.log(i).astype(np.float32)
for i in self.act_size
]
self._log_ent_coef = TorchSACOptimizer.LogEntCoef(
discrete=_disc_log_ent_coef, continuous=_cont_log_ent_coef
)
_cont_target = (
-1
* self.continuous_target_entropy_scale
* np.prod(self._action_spec.continuous_size).astype(np.float32)
)
_disc_target = [
self.discrete_target_entropy_scale * np.log(i).astype(np.float32)
for i in self._action_spec.discrete_branches
]
self.target_entropy = TorchSACOptimizer.TargetEntropy(
continuous=_cont_target, discrete=_disc_target
)
self.policy.actor_critic.distribution.parameters()
self.policy.actor_critic.action_model.parameters()
)
value_params = list(self.value_network.parameters()) + list(
self.policy.actor_critic.critic.parameters()

value_params, lr=hyperparameters.learning_rate
)
self.entropy_optimizer = torch.optim.Adam(
[self._log_ent_coef], lr=hyperparameters.learning_rate
self._log_ent_coef.parameters(), lr=hyperparameters.learning_rate
)
self._move_to_device(default_device())

def sac_value_loss(
self,
log_probs: torch.Tensor,
log_probs: ActionLogProbs,
discrete: bool,
_ent_coef = torch.exp(self._log_ent_coef)
for name in values.keys():
if not discrete:
min_policy_qs[name] = torch.min(q1p_out[name], q2p_out[name])
else:
action_probs = log_probs.exp()
_branched_q1p = ModelUtils.break_into_branches(
q1p_out[name] * action_probs, self.act_size
)
_branched_q2p = ModelUtils.break_into_branches(
q2p_out[name] * action_probs, self.act_size
)
_q1p_mean = torch.mean(
torch.stack(
[
torch.sum(_br, dim=1, keepdim=True)
for _br in _branched_q1p
]
),
dim=0,
)
_q2p_mean = torch.mean(
torch.stack(
[
torch.sum(_br, dim=1, keepdim=True)
for _br in _branched_q2p
]
),
dim=0,
)
_cont_ent_coef = self._log_ent_coef.continuous.exp()
_disc_ent_coef = self._log_ent_coef.discrete.exp()
for name in values.keys():
if self._action_spec.discrete_size <= 0:
min_policy_qs[name] = torch.min(q1p_out[name], q2p_out[name])
else:
disc_action_probs = log_probs.all_discrete_tensor.exp()
_branched_q1p = ModelUtils.break_into_branches(
q1p_out[name] * disc_action_probs,
self._action_spec.discrete_branches,
)
_branched_q2p = ModelUtils.break_into_branches(
q2p_out[name] * disc_action_probs,
self._action_spec.discrete_branches,
)
_q1p_mean = torch.mean(
torch.stack(
[torch.sum(_br, dim=1, keepdim=True) for _br in _branched_q1p]
),
dim=0,
)
_q2p_mean = torch.mean(
torch.stack(
[torch.sum(_br, dim=1, keepdim=True) for _br in _branched_q2p]
),
dim=0,
)
min_policy_qs[name] = torch.min(_q1p_mean, _q2p_mean)
min_policy_qs[name] = torch.min(_q1p_mean, _q2p_mean)
if not discrete:
if self._action_spec.discrete_size <= 0:
_ent_coef * log_probs, dim=1
_cont_ent_coef * log_probs.continuous_tensor, dim=1
)
value_loss = 0.5 * ModelUtils.masked_mean(
torch.nn.functional.mse_loss(values[name], v_backup), loss_masks

disc_log_probs = log_probs.all_discrete_tensor
log_probs * log_probs.exp(), self.act_size
disc_log_probs * disc_log_probs.exp(),
self._action_spec.discrete_branches,
torch.sum(_ent_coef[i] * _lp, dim=1, keepdim=True)
torch.sum(_disc_ent_coef[i] * _lp, dim=1, keepdim=True)
for i, _lp in enumerate(branched_per_action_ent)
]
)

branched_ent_bonus, axis=0
)
# Add continuous entropy bonus to minimum Q
if self._action_spec.continuous_size > 0:
torch.sum(
_cont_ent_coef * log_probs.continuous_tensor,
dim=1,
keepdim=True,
)
value_loss = 0.5 * ModelUtils.masked_mean(
torch.nn.functional.mse_loss(values[name], v_backup.squeeze()),
loss_masks,

def sac_policy_loss(
self,
log_probs: torch.Tensor,
log_probs: ActionLogProbs,
discrete: bool,
_ent_coef = torch.exp(self._log_ent_coef)
_cont_ent_coef, _disc_ent_coef = (
self._log_ent_coef.continuous,
self._log_ent_coef.discrete,
)
_cont_ent_coef = _cont_ent_coef.exp()
_disc_ent_coef = _disc_ent_coef.exp()
if not discrete:
mean_q1 = mean_q1.unsqueeze(1)
batch_policy_loss = torch.mean(_ent_coef * log_probs - mean_q1, dim=1)
policy_loss = ModelUtils.masked_mean(batch_policy_loss, loss_masks)
else:
action_probs = log_probs.exp()
batch_policy_loss = 0
if self._action_spec.discrete_size > 0:
disc_log_probs = log_probs.all_discrete_tensor
disc_action_probs = disc_log_probs.exp()
log_probs * action_probs, self.act_size
disc_log_probs * disc_action_probs, self._action_spec.discrete_branches
mean_q1 * action_probs, self.act_size
mean_q1 * disc_action_probs, self._action_spec.discrete_branches
torch.sum(_ent_coef[i] * _lp - _qt, dim=1, keepdim=True)
torch.sum(_disc_ent_coef[i] * _lp - _qt, dim=1, keepdim=False)
for i, (_lp, _qt) in enumerate(
zip(branched_per_action_ent, branched_q_term)
)

batch_policy_loss = torch.squeeze(branched_policy_loss)
policy_loss = ModelUtils.masked_mean(batch_policy_loss, loss_masks)
batch_policy_loss += torch.sum(branched_policy_loss, dim=1)
all_mean_q1 = torch.sum(disc_action_probs * mean_q1, dim=1)
else:
all_mean_q1 = mean_q1
if self._action_spec.continuous_size > 0:
cont_log_probs = log_probs.continuous_tensor
batch_policy_loss += torch.mean(
_cont_ent_coef * cont_log_probs - all_mean_q1.unsqueeze(1), dim=1
)
policy_loss = ModelUtils.masked_mean(batch_policy_loss, loss_masks)
self, log_probs: torch.Tensor, loss_masks: torch.Tensor, discrete: bool
self, log_probs: ActionLogProbs, loss_masks: torch.Tensor
if not discrete:
with torch.no_grad():
target_current_diff = torch.sum(log_probs + self.target_entropy, dim=1)
entropy_loss = -1 * ModelUtils.masked_mean(
self._log_ent_coef * target_current_diff, loss_masks
)
else:
_cont_ent_coef, _disc_ent_coef = (
self._log_ent_coef.continuous,
self._log_ent_coef.discrete,
)
entropy_loss = 0
if self._action_spec.discrete_size > 0:
# Break continuous into separate branch
disc_log_probs = log_probs.all_discrete_tensor
log_probs * log_probs.exp(), self.act_size
disc_log_probs * disc_log_probs.exp(),
self._action_spec.discrete_branches,
branched_per_action_ent, self.target_entropy
branched_per_action_ent, self.target_entropy.discrete
)
],
axis=1,

)
entropy_loss = -1 * ModelUtils.masked_mean(
torch.mean(self._log_ent_coef * target_current_diff, axis=1), loss_masks
entropy_loss += -1 * ModelUtils.masked_mean(
torch.mean(_disc_ent_coef * target_current_diff, axis=1), loss_masks
)
if self._action_spec.continuous_size > 0:
with torch.no_grad():
cont_log_probs = log_probs.continuous_tensor
target_current_diff = torch.sum(
cont_log_probs + self.target_entropy.continuous, dim=1
)
# We update all the _cont_ent_coef as one block
entropy_loss += -1 * ModelUtils.masked_mean(
torch.mean(_cont_ent_coef) * target_current_diff, loss_masks
)
return entropy_loss

) -> Dict[str, torch.Tensor]:
condensed_q_output = {}
onehot_actions = ModelUtils.actions_to_onehot(discrete_actions, self.act_size)
onehot_actions = ModelUtils.actions_to_onehot(
discrete_actions, self._action_spec.discrete_branches
)
branched_q = ModelUtils.break_into_branches(item, self.act_size)
branched_q = ModelUtils.break_into_branches(
item, self._action_spec.discrete_branches
)
only_action_qs = torch.stack(
[
torch.sum(_act * _q, dim=1, keepdim=True)

vec_obs = [ModelUtils.list_to_tensor(batch["vector_obs"])]
next_vec_obs = [ModelUtils.list_to_tensor(batch["next_vector_in"])]
act_masks = ModelUtils.list_to_tensor(batch["action_mask"])
if self.policy.use_continuous_act:
actions = ModelUtils.list_to_tensor(batch["actions"]).unsqueeze(-1)
else:
actions = ModelUtils.list_to_tensor(batch["actions"], dtype=torch.long)
actions = AgentAction.from_dict(batch)
memories_list = [
ModelUtils.list_to_tensor(batch["memory"][i])

masks=act_masks,
memories=memories,
seq_len=self.policy.sequence_length,
all_log_probs=not self.policy.use_continuous_act,
if self.policy.use_continuous_act:
squeezed_actions = actions.squeeze(-1)
# Only need grad for q1, as that is used for policy.
q1p_out, q2p_out = self.value_network(
vec_obs,
vis_obs,
sampled_actions,
memories=q_memories,
sequence_length=self.policy.sequence_length,
q2_grad=False,
)
q1_out, q2_out = self.value_network(
vec_obs,
vis_obs,
squeezed_actions,
memories=q_memories,
sequence_length=self.policy.sequence_length,
)
q1_stream, q2_stream = q1_out, q2_out
cont_sampled_actions = sampled_actions.continuous_tensor
cont_actions = actions.continuous_tensor
q1p_out, q2p_out = self.value_network(
vec_obs,
vis_obs,
cont_sampled_actions,
memories=q_memories,
sequence_length=self.policy.sequence_length,
)
q1_out, q2_out = self.value_network(
vec_obs,
vis_obs,
cont_actions,
memories=q_memories,
sequence_length=self.policy.sequence_length,
)
if self._action_spec.discrete_size > 0:
disc_actions = actions.discrete_tensor
q1_stream = self._condense_q_streams(q1_out, disc_actions)
q2_stream = self._condense_q_streams(q2_out, disc_actions)
# For discrete, you don't need to backprop through the Q for the policy
q1p_out, q2p_out = self.value_network(
vec_obs,
vis_obs,
memories=q_memories,
sequence_length=self.policy.sequence_length,
q1_grad=False,
q2_grad=False,
)
q1_out, q2_out = self.value_network(
vec_obs,
vis_obs,
memories=q_memories,
sequence_length=self.policy.sequence_length,
)
q1_stream = self._condense_q_streams(q1_out, actions)
q2_stream = self._condense_q_streams(q2_out, actions)
q1_stream, q2_stream = q1_out, q2_out
with torch.no_grad():
target_values, _ = self.target_network(

sequence_length=self.policy.sequence_length,
)
masks = ModelUtils.list_to_tensor(batch["masks"], dtype=torch.bool)
use_discrete = not self.policy.use_continuous_act
dones = ModelUtils.list_to_tensor(batch["done"])
q1_loss, q2_loss = self.sac_q_loss(

log_probs, value_estimates, q1p_out, q2p_out, masks, use_discrete
log_probs, value_estimates, q1p_out, q2p_out, masks
policy_loss = self.sac_policy_loss(log_probs, q1p_out, masks, use_discrete)
entropy_loss = self.sac_entropy_loss(log_probs, masks, use_discrete)
policy_loss = self.sac_policy_loss(log_probs, q1p_out, masks)
entropy_loss = self.sac_entropy_loss(log_probs, masks)
total_value_loss = q1_loss + q2_loss + value_loss

"Losses/Value Loss": value_loss.item(),
"Losses/Q1 Loss": q1_loss.item(),
"Losses/Q2 Loss": q2_loss.item(),
"Policy/Entropy Coeff": torch.mean(torch.exp(self._log_ent_coef)).item(),
"Policy/Discrete Entropy Coeff": torch.mean(
torch.exp(self._log_ent_coef.discrete)
).item(),
"Policy/Continuous Entropy Coeff": torch.mean(
torch.exp(self._log_ent_coef.continuous)
).item(),
"Policy/Learning Rate": decay_lr,
}

33
ml-agents/mlagents/trainers/tests/test_agent_processor.py


AgentManagerQueue,
)
from mlagents.trainers.action_info import ActionInfo
from mlagents.trainers.torch.action_log_probs import LogProbsTuple
from mlagents_envs.base_env import ActionSpec
from mlagents_envs.base_env import ActionSpec, ActionTuple
def create_mock_policy():

mock_policy.retrieve_previous_action.return_value = np.zeros(
(1, 1), dtype=np.float32
)
mock_policy.retrieve_previous_action.return_value = np.zeros((1, 1), dtype=np.int32)
return mock_policy

)
fake_action_outputs = {
"action": [0.1, 0.1],
"action": ActionTuple(continuous=np.array([[0.1], [0.1]])),
"log_probs": [0.1, 0.1],
"log_probs": LogProbsTuple(continuous=np.array([[0.1], [0.1]])),
}
mock_decision_steps, mock_terminal_steps = mb.create_mock_steps(
num_agents=2,

fake_action_info = ActionInfo(
action=[0.1, 0.1],
action=ActionTuple(continuous=np.array([[0.1], [0.1]])),
value=[0.1, 0.1],
outputs=fake_action_outputs,
agent_ids=mock_decision_steps.agent_id,

max_trajectory_length=5,
stats_reporter=StatsReporter("testcat"),
)
"action": [0.1],
"action": ActionTuple(continuous=np.array([[0.1]])),
"log_probs": [0.1],
"log_probs": LogProbsTuple(continuous=np.array([[0.1]])),
mock_decision_step, mock_terminal_step = mb.create_mock_steps(
num_agents=1,
observation_shapes=[(8,)],

done=True,
)
fake_action_info = ActionInfo(
action=[0.1],
action=ActionTuple(continuous=np.array([[0.1]])),
value=[0.1],
outputs=fake_action_outputs,
agent_ids=mock_decision_step.agent_id,

processor.add_experiences(
mock_decision_step, mock_terminal_step, _ep, fake_action_info
)
add_calls.append(mock.call([get_global_agent_id(_ep, 0)], [0.1]))
add_calls.append(
mock.call([get_global_agent_id(_ep, 0)], fake_action_outputs["action"])
)
processor.add_experiences(
mock_done_decision_step, mock_done_terminal_step, _ep, fake_action_info
)

max_trajectory_length=5,
stats_reporter=StatsReporter("testcat"),
)
"action": [0.1],
"action": ActionTuple(continuous=np.array([[0.1]])),
"log_probs": [0.1],
"log_probs": LogProbsTuple(continuous=np.array([[0.1]])),
mock_decision_step, mock_terminal_step = mb.create_mock_steps(
num_agents=1,
observation_shapes=[(8,)],

action=[0.1],
action=ActionTuple(continuous=np.array([[0.1]])),
value=[0.1],
outputs=fake_action_outputs,
agent_ids=mock_decision_step.agent_id,

10
ml-agents/mlagents/trainers/tests/test_demo_loader.py


assert len(pair_infos) == total_expected
_, demo_buffer = demo_to_buffer(path_prefix + "/test.demo", 1, BEHAVIOR_SPEC)
assert len(demo_buffer["actions"]) == total_expected - 1
assert (
len(demo_buffer["continuous_action"]) == total_expected - 1
or len(demo_buffer["discrete_action"]) == total_expected - 1
)
def test_load_demo_dir():

assert len(pair_infos) == total_expected
_, demo_buffer = demo_to_buffer(path_prefix + "/test_demo_dir", 1, BEHAVIOR_SPEC)
assert len(demo_buffer["actions"]) == total_expected - 1
assert (
len(demo_buffer["continuous_action"]) == total_expected - 1
or len(demo_buffer["discrete_action"]) == total_expected - 1
)
def test_demo_mismatch():

2
ml-agents/mlagents/trainers/tests/test_subprocess_env_manager.py


@pytest.mark.parametrize("num_envs", [1, 4])
def test_subprocess_env_endtoend(num_envs):
def simple_env_factory(worker_id, config):
env = SimpleEnvironment(["1D"], use_discrete=True)
env = SimpleEnvironment(["1D"], action_sizes=(0, 1))
return env
env_manager = SubprocessEnvManager(

6
ml-agents/mlagents/trainers/tests/test_trajectory.py


"masks",
"done",
"actions_pre",
"actions",
"action_probs",
"continuous_action",
"discrete_action",
"continuous_log_probs",
"discrete_log_probs",
"action_mask",
"prev_action",
"environment_rewards",

21
ml-agents/mlagents/trainers/tests/mock_brain.py


import numpy as np
from mlagents.trainers.buffer import AgentBuffer
from mlagents.trainers.torch.action_log_probs import LogProbsTuple
from mlagents.trainers.trajectory import Trajectory, AgentExperience
from mlagents_envs.base_env import (
DecisionSteps,

ActionTuple,
)

steps_list = []
action_size = action_spec.discrete_size + action_spec.continuous_size
action_probs = np.ones(
int(np.sum(action_spec.discrete_branches) + action_spec.continuous_size),
dtype=np.float32,
)
for _i in range(length - 1):
obs = []
for _shape in observation_shapes:

action = np.zeros(action_size, dtype=np.float32)
action = ActionTuple(
continuous=np.zeros(action_spec.continuous_size, dtype=np.float32),
discrete=np.zeros(action_spec.discrete_size, dtype=np.int32),
)
action_probs = LogProbsTuple(
continuous=np.ones(action_spec.continuous_size, dtype=np.float32),
discrete=np.ones(action_spec.discrete_size, dtype=np.float32),
)
action_pre = np.zeros(action_size, dtype=np.float32)
action_mask = (
[

if action_spec.is_discrete()
else None
)
prev_action = np.ones(action_size, dtype=np.float32)
if action_spec.is_discrete():
prev_action = np.ones(action_size, dtype=np.int32)
else:
prev_action = np.ones(action_size, dtype=np.float32)
max_step = False
memory = np.ones(memory_size, dtype=np.float32)
agent_id = "test_agent"

73
ml-agents/mlagents/trainers/tests/simple_test_envs.py


from mlagents_envs.base_env import (
ActionSpec,
ActionTuple,
BaseEnv,
BehaviorSpec,
DecisionSteps,

OBS_SIZE = 1
VIS_OBS_SIZE = (20, 20, 3)
STEP_SIZE = 0.1
STEP_SIZE = 0.2
TIME_PENALTY = 0.01
MIN_STEPS = int(1.0 / STEP_SIZE) + 1

def __init__(
self,
brain_names,
use_discrete,
action_size=1,
action_sizes=(1, 0),
self.discrete = use_discrete
if use_discrete:
action_spec = ActionSpec.create_discrete(
tuple(2 for _ in range(action_size))
)
else:
action_spec = ActionSpec.create_continuous(action_size)
continuous_action_size, discrete_action_size = action_sizes
discrete_tuple = tuple(2 for _ in range(discrete_action_size))
action_spec = ActionSpec(continuous_action_size, discrete_tuple)
self.total_action_size = (
continuous_action_size + discrete_action_size
) # to set the goals/positions
self.action_spec = action_spec
self.action_size = action_size
self.action_spec = action_spec
self.names = brain_names
self.positions: Dict[str, List[float]] = {}
self.step_count: Dict[str, float] = {}

def _take_action(self, name: str) -> bool:
deltas = []
for _act in self.action[name][0]:
if self.discrete:
deltas.append(1 if _act else -1)
else:
deltas.append(_act)
_act = self.action[name]
if self.action_spec.discrete_size > 0:
for _disc in _act.discrete[0]:
deltas.append(1 if _disc else -1)
if self.action_spec.continuous_size > 0:
for _cont in _act.continuous[0]:
deltas.append(_cont)
for i, _delta in enumerate(deltas):
_delta = clamp(_delta, -self.step_size, self.step_size)
self.positions[name][i] += _delta

return done
def _generate_mask(self):
if self.discrete:
action_mask = None
if self.action_spec.discrete_size > 0:
ndmask = np.array(2 * self.action_size * [False], dtype=np.bool)
ndmask = np.array(
2 * self.action_spec.discrete_size * [False], dtype=np.bool
)
else:
action_mask = None
return action_mask
def _compute_reward(self, name: str, done: bool) -> float:

def _reset_agent(self, name):
self.goal[name] = self.random.choice([-1, 1])
self.positions[name] = [0.0 for _ in range(self.action_size)]
self.positions[name] = [0.0 for _ in range(self.total_action_size)]
self.step_count[name] = 0
self.rewards[name] = 0
self.agent_id[name] = self.agent_id[name] + 1

class MemoryEnvironment(SimpleEnvironment):
def __init__(self, brain_names, use_discrete, step_size=0.2):
super().__init__(brain_names, use_discrete, step_size=step_size)
def __init__(self, brain_names, action_sizes=(1, 0), step_size=0.2):
super().__init__(brain_names, action_sizes=action_sizes, step_size=step_size)
# Number of steps to reveal the goal for. Lower is harder. Should be
# less than 1/step_size to force agent to use memory
self.num_show_steps = 2

def __init__(
self,
brain_names,
use_discrete,
action_sizes=(1, 0),
use_discrete,
action_sizes=action_sizes,
)
self.demonstration_protos: Dict[str, List[AgentInfoActionPairProto]] = {}
self.n_demos = n_demos

def step(self) -> None:
super().step()
for name in self.names:
if self.action_spec.discrete_size > 0:
action = self.action[name].discrete
else:
action = self.action[name].continuous
self.step_result[name][0], self.step_result[name][1], self.action[name]
self.step_result[name][0], self.step_result[name][1], action
)
self.demonstration_protos[name] = self.demonstration_protos[name][
-self.n_demos :

self.reset()
for _ in range(self.n_demos):
for name in self.names:
if self.discrete:
self.action[name] = [[1]] if self.goal[name] > 0 else [[0]]
if self.action_spec.discrete_size > 0:
self.action[name] = ActionTuple(
np.array([], dtype=np.float32),
np.array(
[[1]] if self.goal[name] > 0 else [[0]], dtype=np.int32
),
)
self.action[name] = [[float(self.goal[name])]]
self.action[name] = ActionTuple(
np.array([[float(self.goal[name])]], dtype=np.float32),
np.array([], dtype=np.int32),
)
self.step()

66
ml-agents/mlagents/trainers/tests/tensorflow/test_ppo.py


dummy_config, use_rnn=rnn, use_discrete=discrete, use_visual=visual
)
# Test update
update_buffer = mb.simulate_rollout(
BUFFER_INIT_SAMPLES, optimizer.policy.behavior_spec
)
behavior_spec = optimizer.policy.behavior_spec
update_buffer = mb.simulate_rollout(BUFFER_INIT_SAMPLES, behavior_spec)
# NOTE: This is because TF outputs the log probs of all actions whereas PyTorch does not
if discrete:
n_agents = len(update_buffer["discrete_log_probs"])
update_buffer["discrete_log_probs"] = np.ones(
(n_agents, int(sum(behavior_spec.action_spec.discrete_branches))),
dtype=np.float32,
)
else:
n_agents = len(update_buffer["continuous_log_probs"])
update_buffer["continuous_log_probs"] = np.ones(
(n_agents, behavior_spec.action_spec.continuous_size), dtype=np.float32
)
optimizer.update(
update_buffer,
num_sequences=update_buffer.num_experiences // optimizer.policy.sequence_length,

dummy_config, use_rnn=rnn, use_discrete=discrete, use_visual=visual
)
# Test update
update_buffer = mb.simulate_rollout(
BUFFER_INIT_SAMPLES, optimizer.policy.behavior_spec
)
behavior_spec = optimizer.policy.behavior_spec
update_buffer = mb.simulate_rollout(BUFFER_INIT_SAMPLES, behavior_spec)
# Mock out reward signal eval
update_buffer["advantages"] = update_buffer["environment_rewards"]
update_buffer["extrinsic_returns"] = update_buffer["environment_rewards"]

# NOTE: This is because TF outputs the log probs of all actions whereas PyTorch does not
if discrete:
n_agents = len(update_buffer["discrete_log_probs"])
update_buffer["discrete_log_probs"] = np.ones(
(n_agents, int(sum(behavior_spec.action_spec.discrete_branches))),
dtype=np.float32,
)
else:
n_agents = len(update_buffer["continuous_log_probs"])
update_buffer["continuous_log_probs"] = np.ones(
(n_agents, behavior_spec.action_spec.continuous_size), dtype=np.float32
)
optimizer.update(
update_buffer,
num_sequences=update_buffer.num_experiences // optimizer.policy.sequence_length,

use_visual=False,
)
# Test update
update_buffer = mb.simulate_rollout(
BUFFER_INIT_SAMPLES, optimizer.policy.behavior_spec
)
behavior_spec = optimizer.policy.behavior_spec
update_buffer = mb.simulate_rollout(BUFFER_INIT_SAMPLES, behavior_spec)
# Mock out reward signal eval
update_buffer["advantages"] = update_buffer["environment_rewards"]
update_buffer["extrinsic_returns"] = update_buffer["environment_rewards"]

# NOTE: This is because TF outputs the log probs of all actions whereas PyTorch does not
n_agents = len(update_buffer["continuous_log_probs"])
update_buffer["continuous_log_probs"] = np.ones(
(n_agents, behavior_spec.action_spec.continuous_size), dtype=np.float32
)
optimizer.update(
update_buffer,
num_sequences=update_buffer.num_experiences // optimizer.policy.sequence_length,

buffer["curiosity_returns"] = buffer["environment_rewards"]
buffer["curiosity_value_estimates"] = buffer["environment_rewards"]
buffer["advantages"] = buffer["environment_rewards"]
# NOTE: This is because TF outputs the log probs of all actions whereas PyTorch does not
if use_discrete:
n_agents = len(buffer["discrete_log_probs"])
buffer["discrete_log_probs"].reset_field()
for _ in range(n_agents):
buffer["discrete_log_probs"].append(
np.ones(
int(sum(mock_behavior_spec.action_spec.discrete_branches)),
dtype=np.float32,
)
)
else:
n_agents = len(buffer["continuous_log_probs"])
buffer["continuous_log_probs"].reset_field()
for _ in range(n_agents):
buffer["continuous_log_probs"].append(
np.ones(
mock_behavior_spec.action_spec.continuous_size, dtype=np.float32
)
)
trainer.update_buffer = buffer
trainer._update_policy()

2
ml-agents/mlagents/trainers/tests/tensorflow/test_tf_policy.py


behavior_spec = basic_behavior_spec()
policy = FakePolicy(test_seed, behavior_spec, TrainerSettings(), "output")
policy_eval_out = {
"action": np.array([1.0], dtype=np.float32),
"action": np.array([[1.0]], dtype=np.float32),
"memory_out": np.array([[2.5]], dtype=np.float32),
"value": np.array([1.1], dtype=np.float32),
}

120
ml-agents/mlagents/trainers/tests/tensorflow/test_simple_rl.py


assert all(reward > success_threshold for reward in processed_rewards)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_ppo(use_discrete):
env = SimpleEnvironment([BRAIN_NAME], use_discrete=use_discrete)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_ppo(action_sizes):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_2d_ppo(use_discrete):
env = SimpleEnvironment(
[BRAIN_NAME], use_discrete=use_discrete, action_size=2, step_size=0.8
)
@pytest.mark.parametrize("action_sizes", [(0, 2), (2, 0)])
def test_2d_ppo(action_sizes):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes, step_size=0.8)
new_hyperparams = attr.evolve(
PPO_TF_CONFIG.hyperparameters, batch_size=64, buffer_size=640
)

_check_environment_trains(env, {BRAIN_NAME: config})
@pytest.mark.parametrize("use_discrete", [True, False])
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_visual_ppo(num_visual, use_discrete):
def test_visual_ppo(num_visual, action_sizes):
use_discrete=use_discrete,
action_sizes=action_sizes,
num_visual=num_visual,
num_vector=0,
step_size=0.2,

def test_visual_advanced_ppo(vis_encode_type, num_visual):
env = SimpleEnvironment(
[BRAIN_NAME],
use_discrete=True,
action_sizes=(0, 1),
num_visual=num_visual,
num_vector=0,
step_size=0.5,

_check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.5)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_recurrent_ppo(use_discrete):
env = MemoryEnvironment([BRAIN_NAME], use_discrete=use_discrete)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_recurrent_ppo(action_sizes):
env = MemoryEnvironment([BRAIN_NAME], action_sizes=action_sizes)
new_network_settings = attr.evolve(
PPO_TF_CONFIG.network_settings,
memory=NetworkSettings.MemorySettings(memory_size=16),

_check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.9)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_sac(use_discrete):
env = SimpleEnvironment([BRAIN_NAME], use_discrete=use_discrete)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_sac(action_sizes):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_2d_sac(use_discrete):
env = SimpleEnvironment(
[BRAIN_NAME], use_discrete=use_discrete, action_size=2, step_size=0.8
)
@pytest.mark.parametrize("action_sizes", [(0, 2), (2, 0)])
def test_2d_sac(action_sizes):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes, step_size=0.8)
new_hyperparams = attr.evolve(SAC_TF_CONFIG.hyperparameters, buffer_init_steps=2000)
config = attr.evolve(
SAC_TF_CONFIG,

_check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.8)
@pytest.mark.parametrize("use_discrete", [True, False])
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_visual_sac(num_visual, use_discrete):
def test_visual_sac(num_visual, action_sizes):
use_discrete=use_discrete,
action_sizes=action_sizes,
num_visual=num_visual,
num_vector=0,
step_size=0.2,

def test_visual_advanced_sac(vis_encode_type, num_visual):
env = SimpleEnvironment(
[BRAIN_NAME],
use_discrete=True,
action_sizes=(0, 1),
num_visual=num_visual,
num_vector=0,
step_size=0.5,

_check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.5)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_recurrent_sac(use_discrete):
step_size = 0.2 if use_discrete else 0.5
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_recurrent_sac(action_sizes):
step_size = 0.2 if action_sizes == (0, 1) else 0.5
[BRAIN_NAME], use_discrete=use_discrete, step_size=step_size
[BRAIN_NAME], action_sizes=action_sizes, step_size=step_size
)
new_networksettings = attr.evolve(
SAC_TF_CONFIG.network_settings,

_check_environment_trains(env, {BRAIN_NAME: config})
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_ghost(use_discrete):
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_ghost(action_sizes):
[BRAIN_NAME + "?team=0", BRAIN_NAME + "?team=1"], use_discrete=use_discrete
[BRAIN_NAME + "?team=0", BRAIN_NAME + "?team=1"], action_sizes=action_sizes
)
self_play_settings = SelfPlaySettings(
play_against_latest_model_ratio=1.0, save_steps=2000, swap_steps=2000

_check_environment_trains(env, {BRAIN_NAME: config})
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_ghost_fails(use_discrete):
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_ghost_fails(action_sizes):
[BRAIN_NAME + "?team=0", BRAIN_NAME + "?team=1"], use_discrete=use_discrete
[BRAIN_NAME + "?team=0", BRAIN_NAME + "?team=1"], action_sizes=action_sizes
)
# This config should fail because the ghosted policy is never swapped with a competent policy.
# Swap occurs after max step is reached.

)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_asymm_ghost(use_discrete):
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_asymm_ghost(action_sizes):
[BRAIN_NAME + "?team=0", brain_name_opp + "?team=1"], use_discrete=use_discrete
[BRAIN_NAME + "?team=0", brain_name_opp + "?team=1"], action_sizes=action_sizes
)
self_play_settings = SelfPlaySettings(
play_against_latest_model_ratio=1.0,

_check_environment_trains(env, {BRAIN_NAME: config, brain_name_opp: config})
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_asymm_ghost_fails(use_discrete):
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_asymm_ghost_fails(action_sizes):
[BRAIN_NAME + "?team=0", brain_name_opp + "?team=1"], use_discrete=use_discrete
[BRAIN_NAME + "?team=0", brain_name_opp + "?team=1"], action_sizes=action_sizes
)
# This config should fail because the team that us not learning when both have reached
# max step should be executing the initial, untrained poliy.

@pytest.fixture(scope="session")
def simple_record(tmpdir_factory):
def record_demo(use_discrete, num_visual=0, num_vector=1):
def record_demo(action_sizes, num_visual=0, num_vector=1):
use_discrete=use_discrete,
action_sizes=action_sizes,
num_visual=num_visual,
num_vector=num_vector,
n_demos=100,

env.solve()
continuous_size, discrete_size = action_sizes
use_discrete = True if discrete_size > 0 else False
vector_action_size=[2] if use_discrete else [1],
vector_action_descriptions=[""],
vector_action_space_type=discrete if use_discrete else continuous,
vector_action_size_deprecated=[2] if use_discrete else [1],
vector_action_descriptions_deprecated=[""],
vector_action_space_type_deprecated=discrete
if use_discrete
else continuous,
brain_name=BRAIN_NAME,
is_training=True,
)

return record_demo
@pytest.mark.parametrize("use_discrete", [True, False])
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_gail(simple_record, use_discrete, trainer_config):
demo_path = simple_record(use_discrete)
env = SimpleEnvironment([BRAIN_NAME], use_discrete=use_discrete, step_size=0.2)
def test_gail(simple_record, action_sizes, trainer_config):
demo_path = simple_record(action_sizes)
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes, step_size=0.2)
bc_settings = BehavioralCloningSettings(demo_path=demo_path, steps=1000)
reward_signals = {
RewardSignalType.GAIL: GAILSettings(encoding_size=32, demo_path=demo_path)

_check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.9)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_gail_visual_ppo(simple_record, use_discrete):
demo_path = simple_record(use_discrete, num_visual=1, num_vector=0)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_gail_visual_ppo(simple_record, action_sizes):
demo_path = simple_record(action_sizes, num_visual=1, num_vector=0)
use_discrete=use_discrete,
action_sizes=action_sizes,
step_size=0.2,
)
bc_settings = BehavioralCloningSettings(demo_path=demo_path, steps=1500)

_check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.9)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_gail_visual_sac(simple_record, use_discrete):
demo_path = simple_record(use_discrete, num_visual=1, num_vector=0)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_gail_visual_sac(simple_record, action_sizes):
demo_path = simple_record(action_sizes, num_visual=1, num_vector=0)
use_discrete=use_discrete,
action_sizes=action_sizes,
step_size=0.2,
)
bc_settings = BehavioralCloningSettings(demo_path=demo_path, steps=1000)

9
ml-agents/mlagents/trainers/tests/torch/saver/test_saver.py


with torch.no_grad():
_, log_probs1, _, _ = policy1.sample_actions(
vec_obs, vis_obs, masks=masks, memories=memories, all_log_probs=True
vec_obs, vis_obs, masks=masks, memories=memories
vec_obs, vis_obs, masks=masks, memories=memories, all_log_probs=True
vec_obs, vis_obs, masks=masks, memories=memories
np.testing.assert_array_equal(log_probs1, log_probs2)
np.testing.assert_array_equal(
log_probs1.all_discrete_tensor, log_probs2.all_discrete_tensor
)
@pytest.mark.parametrize("discrete", [True, False], ids=["discrete", "continuous"])

78
ml-agents/mlagents/trainers/tests/torch/test_networks.py


from mlagents.trainers.torch.networks import (
NetworkBody,
ValueNetwork,
SimpleActor,
from mlagents.trainers.torch.distributions import (
GaussianDistInstance,
CategoricalDistInstance,
)
from mlagents_envs.base_env import ActionSpec

assert _out[0] == pytest.approx(1.0, abs=0.1)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_actor(use_discrete):
obs_size = 4
network_settings = NetworkSettings()
obs_shapes = [(obs_size,)]
act_size = [2]
if use_discrete:
masks = torch.ones((1, 1))
action_spec = ActionSpec.create_discrete(tuple(act_size))
else:
masks = None
action_spec = ActionSpec.create_continuous(act_size[0])
actor = SimpleActor(obs_shapes, network_settings, action_spec)
# Test get_dist
sample_obs = torch.ones((1, obs_size))
dists, _ = actor.get_dists([sample_obs], [], masks=masks)
for dist in dists:
if use_discrete:
assert isinstance(dist, CategoricalDistInstance)
else:
assert isinstance(dist, GaussianDistInstance)
# Test sample_actions
actions = actor.sample_action(dists)
for act in actions:
if use_discrete:
assert act.shape == (1, 1)
else:
assert act.shape == (1, act_size[0])
# Test forward
actions, ver_num, mem_size, is_cont, act_size_vec = actor.forward(
[sample_obs], [], masks=masks
)
for act in actions:
# This is different from above for ONNX export
if use_discrete:
assert act.shape == tuple(act_size)
else:
assert act.shape == (act_size[0], 1)
assert mem_size == 0
assert is_cont == int(not use_discrete)
assert act_size_vec == torch.tensor(act_size)
@pytest.mark.parametrize("ac_type", [SharedActorCritic, SeparateActorCritic])
@pytest.mark.parametrize("lstm", [True, False])
def test_actor_critic(ac_type, lstm):

)
obs_shapes = [(obs_size,)]
act_size = [2]
act_size = 2
mask = torch.ones([1, act_size * 2])
action_spec = ActionSpec.create_continuous(act_size[0])
# action_spec = ActionSpec.create_continuous(act_size[0])
action_spec = ActionSpec(act_size, tuple(act_size for _ in range(act_size)))
actor = ac_type(obs_shapes, network_settings, action_spec, stream_names)
if lstm:
sample_obs = torch.ones((1, network_settings.memory.sequence_length, obs_size))

else:
assert value_out[stream].shape == (1,)
# Test get_dist_and_value
dists, value_out, mem_out = actor.get_dist_and_value(
[sample_obs], [], memories=memories
# Test get action stats and_value
action, log_probs, entropies, value_out, mem_out = actor.get_action_stats_and_value(
[sample_obs], [], memories=memories, masks=mask
if lstm:
assert action.continuous_tensor.shape == (64, 2)
else:
assert action.continuous_tensor.shape == (1, 2)
assert len(action.discrete_list) == 2
for _disc in action.discrete_list:
if lstm:
assert _disc.shape == (64, 1)
else:
assert _disc.shape == (1, 1)
for dist in dists:
assert isinstance(dist, GaussianDistInstance)
for stream in stream_names:
if lstm:
assert value_out[stream].shape == (network_settings.memory.sequence_length,)

15
ml-agents/mlagents/trainers/tests/torch/test_ppo.py


update_buffer["extrinsic_returns"] = update_buffer["environment_rewards"]
update_buffer["extrinsic_value_estimates"] = update_buffer["environment_rewards"]
# NOTE: In TensorFlow, the log_probs are saved as one for every discrete action, whereas
# in PyTorch it is saved as the total probability per branch. So we need to modify the
# log prob in the fake buffer here.
update_buffer["action_probs"] = np.ones_like(update_buffer["actions"])
return_stats = optimizer.update(
update_buffer,
num_sequences=update_buffer.num_experiences // optimizer.policy.sequence_length,

update_buffer["extrinsic_value_estimates"] = update_buffer["environment_rewards"]
update_buffer["curiosity_returns"] = update_buffer["environment_rewards"]
update_buffer["curiosity_value_estimates"] = update_buffer["environment_rewards"]
# NOTE: In TensorFlow, the log_probs are saved as one for every discrete action, whereas
# in PyTorch it is saved as the total probability per branch. So we need to modify the
# log prob in the fake buffer here.
update_buffer["action_probs"] = np.ones_like(update_buffer["actions"])
optimizer.update(
update_buffer,
num_sequences=update_buffer.num_experiences // optimizer.policy.sequence_length,

update_buffer["extrinsic_value_estimates"] = update_buffer["environment_rewards"]
update_buffer["gail_returns"] = update_buffer["environment_rewards"]
update_buffer["gail_value_estimates"] = update_buffer["environment_rewards"]
update_buffer["continuous_log_probs"] = np.ones_like(
update_buffer["continuous_action"]
)
optimizer.update(
update_buffer,
num_sequences=update_buffer.num_experiences // optimizer.policy.sequence_length,

update_buffer["extrinsic_value_estimates"] = update_buffer["environment_rewards"]
update_buffer["gail_returns"] = update_buffer["environment_rewards"]
update_buffer["gail_value_estimates"] = update_buffer["environment_rewards"]
# NOTE: In TensorFlow, the log_probs are saved as one for every discrete action, whereas
# in PyTorch it is saved as the total probability per branch. So we need to modify the
# log prob in the fake buffer here.
update_buffer["action_probs"] = np.ones_like(update_buffer["actions"])
optimizer.update(
update_buffer,
num_sequences=update_buffer.num_experiences // optimizer.policy.sequence_length,

2
ml-agents/mlagents/trainers/tests/torch/test_reward_providers/test_curiosity.py


for _ in range(200):
curiosity_rp.update(buffer)
prediction = curiosity_rp._network.predict_action(buffer)[0]
target = torch.tensor(buffer["actions"][0])
target = torch.tensor(buffer["continuous_action"][0])
error = torch.mean((prediction - target) ** 2).item()
assert error < 0.001

11
ml-agents/mlagents/trainers/tests/torch/test_reward_providers/utils.py


np.random.normal(size=shape).astype(np.float32)
for shape in behavior_spec.observation_shapes
]
action = behavior_spec.action_spec.random_action(1)[0, :]
action_buffer = behavior_spec.action_spec.random_action(1)
action = {}
if behavior_spec.action_spec.continuous_size > 0:
action["continuous_action"] = action_buffer.continuous
if behavior_spec.action_spec.discrete_size > 0:
action["discrete_action"] = action_buffer.discrete
for _ in range(number):
curr_split_obs = SplitObservations.from_observations(curr_observations)
next_split_obs = SplitObservations.from_observations(next_observations)

)
buffer["vector_obs"].append(curr_split_obs.vector_observations)
buffer["next_vector_in"].append(next_split_obs.vector_observations)
buffer["actions"].append(action)
for _act_type, _act in action.items():
buffer[_act_type].append(_act[0, :])
buffer["reward"].append(np.ones(1, dtype=np.float32) * reward)
buffer["masks"].append(np.ones(1, dtype=np.float32))
buffer["done"] = np.zeros(number, dtype=np.float32)

44
ml-agents/mlagents/trainers/tests/torch/test_utils.py


from mlagents.trainers.torch.utils import ModelUtils
from mlagents.trainers.exception import UnityTrainerException
from mlagents.trainers.torch.encoders import VectorInput
from mlagents.trainers.torch.distributions import (
CategoricalDistInstance,
GaussianDistInstance,
)
def test_min_visual_size():

]
for res, exp in zip(oh_actions, expected_result):
assert torch.equal(res, exp)
def test_get_probs_and_entropy():
# Test continuous
# Add two dists to the list. This isn't done in the code but we'd like to support it.
dist_list = [
GaussianDistInstance(torch.zeros((1, 2)), torch.ones((1, 2))),
GaussianDistInstance(torch.zeros((1, 2)), torch.ones((1, 2))),
]
action_list = [torch.zeros((1, 2)), torch.zeros((1, 2))]
log_probs, entropies, all_probs = ModelUtils.get_probs_and_entropy(
action_list, dist_list
)
assert log_probs.shape == (1, 2, 2)
assert entropies.shape == (1, 2, 2)
assert all_probs is None
for log_prob in log_probs.flatten():
# Log prob of standard normal at 0
assert log_prob == pytest.approx(-0.919, abs=0.01)
for ent in entropies.flatten():
# entropy of standard normal at 0
assert ent == pytest.approx(1.42, abs=0.01)
# Test continuous
# Add two dists to the list.
act_size = 2
test_prob = torch.tensor(
[[1.0 - 0.1 * (act_size - 1)] + [0.1] * (act_size - 1)]
) # High prob for first action
dist_list = [CategoricalDistInstance(test_prob), CategoricalDistInstance(test_prob)]
action_list = [torch.tensor([0]), torch.tensor([1])]
log_probs, entropies, all_probs = ModelUtils.get_probs_and_entropy(
action_list, dist_list
)
assert all_probs.shape == (1, len(dist_list * act_size))
assert entropies.shape == (1, len(dist_list))
# Make sure the first action has high probability than the others.
assert log_probs.flatten()[0] > log_probs.flatten()[1]
def test_masked_mean():

22
ml-agents/mlagents/trainers/tests/torch/test_policy.py


from mlagents.trainers.tests import mock_brain as mb
from mlagents.trainers.settings import TrainerSettings, NetworkSettings
from mlagents.trainers.torch.utils import ModelUtils
from mlagents.trainers.torch.agent_action import AgentAction
VECTOR_ACTION_SPACE = 2
VECTOR_OBS_SPACE = 8

run_out = policy.evaluate(decision_step, list(decision_step.agent_id))
if discrete:
run_out["action"].shape == (NUM_AGENTS, len(DISCRETE_ACTION_SPACE))
run_out["action"].discrete.shape == (NUM_AGENTS, len(DISCRETE_ACTION_SPACE))
assert run_out["action"].shape == (NUM_AGENTS, VECTOR_ACTION_SPACE)
assert run_out["action"].continuous.shape == (NUM_AGENTS, VECTOR_ACTION_SPACE)
@pytest.mark.parametrize("discrete", [True, False], ids=["discrete", "continuous"])

buffer = mb.simulate_rollout(64, policy.behavior_spec, memory_size=policy.m_size)
vec_obs = [ModelUtils.list_to_tensor(buffer["vector_obs"])]
act_masks = ModelUtils.list_to_tensor(buffer["action_mask"])
if policy.use_continuous_act:
actions = ModelUtils.list_to_tensor(buffer["actions"]).unsqueeze(-1)
else:
actions = ModelUtils.list_to_tensor(buffer["actions"], dtype=torch.long)
agent_action = AgentAction.from_dict(buffer)
vis_obs = []
for idx, _ in enumerate(policy.actor_critic.network_body.visual_processors):
vis_ob = ModelUtils.list_to_tensor(buffer["visual_obs%d" % idx])

vec_obs,
vis_obs,
masks=act_masks,
actions=actions,
actions=agent_action,
memories=memories,
seq_len=policy.sequence_length,
)

_size = policy.behavior_spec.action_spec.continuous_size
assert log_probs.shape == (64, _size)
assert log_probs.flatten().shape == (64, _size)
assert entropy.shape == (64,)
for val in values.values():
assert val.shape == (64,)

masks=act_masks,
memories=memories,
seq_len=policy.sequence_length,
all_log_probs=not policy.use_continuous_act,
assert log_probs.shape == (
assert log_probs.all_discrete_tensor.shape == (
assert log_probs.shape == (64, policy.behavior_spec.action_spec.continuous_size)
assert log_probs.continuous_tensor.shape == (
64,
policy.behavior_spec.action_spec.continuous_size,
)
assert entropies.shape == (64,)
if rnn:

2
ml-agents/mlagents/trainers/tests/torch/test_distributions.py


optimizer = torch.optim.Adam(gauss_dist.parameters(), lr=3e-3)
for _ in range(50):
dist_inst = gauss_dist(sample_embedding)[0]
dist_inst = gauss_dist(sample_embedding)
if tanh_squash:
assert isinstance(dist_inst, TanhGaussianDistInstance)
else:

3
ml-agents/mlagents/trainers/tests/torch/test_sac.py


"Losses/Value Loss",
"Losses/Q1 Loss",
"Losses/Q2 Loss",
"Policy/Entropy Coeff",
"Policy/Continuous Entropy Coeff",
"Policy/Discrete Entropy Coeff",
"Policy/Learning Rate",
]
for stat in required_stats:

122
ml-agents/mlagents/trainers/tests/torch/test_simple_rl.py


SAC_TORCH_CONFIG = attr.evolve(sac_dummy_config(), framework=FrameworkType.PYTORCH)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_ppo(use_discrete):
env = SimpleEnvironment([BRAIN_NAME], use_discrete=use_discrete)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_ppo(action_sizes):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_2d_ppo(use_discrete):
env = SimpleEnvironment(
[BRAIN_NAME], use_discrete=use_discrete, action_size=2, step_size=0.8
)
@pytest.mark.parametrize("action_sizes", [(0, 2), (2, 0)])
def test_2d_ppo(action_sizes):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes, step_size=0.8)
new_hyperparams = attr.evolve(
PPO_TORCH_CONFIG.hyperparameters, batch_size=64, buffer_size=640
)

check_environment_trains(env, {BRAIN_NAME: config})
@pytest.mark.parametrize("use_discrete", [True, False])
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_visual_ppo(num_visual, use_discrete):
def test_visual_ppo(num_visual, action_sizes):
use_discrete=use_discrete,
action_sizes=action_sizes,
num_visual=num_visual,
num_vector=0,
step_size=0.2,

def test_visual_advanced_ppo(vis_encode_type, num_visual):
env = SimpleEnvironment(
[BRAIN_NAME],
use_discrete=True,
action_sizes=(0, 1),
num_visual=num_visual,
num_vector=0,
step_size=0.5,

check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.5)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_recurrent_ppo(use_discrete):
env = MemoryEnvironment([BRAIN_NAME], use_discrete=use_discrete)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_recurrent_ppo(action_sizes):
env = MemoryEnvironment([BRAIN_NAME], action_sizes=action_sizes)
new_network_settings = attr.evolve(
PPO_TORCH_CONFIG.network_settings,
memory=NetworkSettings.MemorySettings(memory_size=16),

check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.9)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_sac(use_discrete):
env = SimpleEnvironment([BRAIN_NAME], use_discrete=use_discrete)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_sac(action_sizes):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_2d_sac(use_discrete):
env = SimpleEnvironment(
[BRAIN_NAME], use_discrete=use_discrete, action_size=2, step_size=0.8
)
@pytest.mark.parametrize("action_sizes", [(0, 2), (2, 0)])
def test_2d_sac(action_sizes):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes, step_size=0.8)
SAC_TORCH_CONFIG, hyperparameters=new_hyperparams, max_steps=10000
SAC_TORCH_CONFIG, hyperparameters=new_hyperparams, max_steps=6000
@pytest.mark.parametrize("use_discrete", [True, False])
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_visual_sac(num_visual, use_discrete):
def test_visual_sac(num_visual, action_sizes):
use_discrete=use_discrete,
action_sizes=action_sizes,
num_visual=num_visual,
num_vector=0,
step_size=0.2,

def test_visual_advanced_sac(vis_encode_type, num_visual):
env = SimpleEnvironment(
[BRAIN_NAME],
use_discrete=True,
action_sizes=(0, 1),
num_visual=num_visual,
num_vector=0,
step_size=0.5,

check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.5)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_recurrent_sac(use_discrete):
step_size = 0.2 if use_discrete else 0.5
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_recurrent_sac(action_sizes):
step_size = 0.2 if action_sizes == (0, 1) else 0.5
[BRAIN_NAME], use_discrete=use_discrete, step_size=step_size
[BRAIN_NAME], action_sizes=action_sizes, step_size=step_size
)
new_networksettings = attr.evolve(
SAC_TORCH_CONFIG.network_settings,

check_environment_trains(env, {BRAIN_NAME: config})
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_ghost(use_discrete):
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_ghost(action_sizes):
[BRAIN_NAME + "?team=0", BRAIN_NAME + "?team=1"], use_discrete=use_discrete
[BRAIN_NAME + "?team=0", BRAIN_NAME + "?team=1"], action_sizes=action_sizes
)
self_play_settings = SelfPlaySettings(
play_against_latest_model_ratio=1.0, save_steps=2000, swap_steps=2000

@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_ghost_fails(use_discrete):
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_ghost_fails(action_sizes):
[BRAIN_NAME + "?team=0", BRAIN_NAME + "?team=1"], use_discrete=use_discrete
[BRAIN_NAME + "?team=0", BRAIN_NAME + "?team=1"], action_sizes=action_sizes
)
# This config should fail because the ghosted policy is never swapped with a competent policy.
# Swap occurs after max step is reached.

)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_asymm_ghost(use_discrete):
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_asymm_ghost(action_sizes):
[BRAIN_NAME + "?team=0", brain_name_opp + "?team=1"], use_discrete=use_discrete
[BRAIN_NAME + "?team=0", brain_name_opp + "?team=1"], action_sizes=action_sizes
)
self_play_settings = SelfPlaySettings(
play_against_latest_model_ratio=1.0,

check_environment_trains(env, {BRAIN_NAME: config, brain_name_opp: config})
@pytest.mark.parametrize("use_discrete", [True, False])
def test_simple_asymm_ghost_fails(use_discrete):
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_simple_asymm_ghost_fails(action_sizes):
[BRAIN_NAME + "?team=0", brain_name_opp + "?team=1"], use_discrete=use_discrete
[BRAIN_NAME + "?team=0", brain_name_opp + "?team=1"], action_sizes=action_sizes
)
# This config should fail because the team that us not learning when both have reached
# max step should be executing the initial, untrained poliy.

@pytest.fixture(scope="session")
def simple_record(tmpdir_factory):
def record_demo(use_discrete, num_visual=0, num_vector=1):
def record_demo(action_sizes, num_visual=0, num_vector=1):
use_discrete=use_discrete,
action_sizes=action_sizes,
num_visual=num_visual,
num_vector=num_vector,
n_demos=100,

agent_info_protos = env.demonstration_protos[BRAIN_NAME]
meta_data_proto = DemonstrationMetaProto()
brain_param_proto = BrainParametersProto(
vector_action_size=[2] if use_discrete else [1],
vector_action_descriptions=[""],
vector_action_space_type=discrete if use_discrete else continuous,
vector_action_size_deprecated=[2] if action_sizes else [1],
vector_action_descriptions_deprecated=[""],
vector_action_space_type_deprecated=discrete
if action_sizes
else continuous,
action_type = "Discrete" if use_discrete else "Continuous"
action_type = "Discrete" if action_sizes else "Continuous"
demo_path_name = "1DTest" + action_type + ".demo"
demo_path = str(tmpdir_factory.mktemp("tmp_demo").join(demo_path_name))
write_demo(demo_path, meta_data_proto, brain_param_proto, agent_info_protos)

@pytest.mark.parametrize("use_discrete", [True, False])
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_gail(simple_record, use_discrete, trainer_config):
demo_path = simple_record(use_discrete)
env = SimpleEnvironment([BRAIN_NAME], use_discrete=use_discrete, step_size=0.2)
def test_gail(simple_record, action_sizes, trainer_config):
demo_path = simple_record(action_sizes)
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_sizes, step_size=0.2)
bc_settings = BehavioralCloningSettings(demo_path=demo_path, steps=1000)
reward_signals = {
RewardSignalType.GAIL: GAILSettings(encoding_size=32, demo_path=demo_path)

check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.9)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_gail_visual_ppo(simple_record, use_discrete):
demo_path = simple_record(use_discrete, num_visual=1, num_vector=0)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_gail_visual_ppo(simple_record, action_sizes):
demo_path = simple_record(action_sizes, num_visual=1, num_vector=0)
use_discrete=use_discrete,
action_sizes=action_sizes,
step_size=0.2,
)
bc_settings = BehavioralCloningSettings(demo_path=demo_path, steps=1500)

check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.9)
@pytest.mark.parametrize("use_discrete", [True, False])
def test_gail_visual_sac(simple_record, use_discrete):
demo_path = simple_record(use_discrete, num_visual=1, num_vector=0)
@pytest.mark.parametrize("action_sizes", [(0, 1), (1, 0)])
def test_gail_visual_sac(simple_record, action_sizes):
demo_path = simple_record(action_sizes, num_visual=1, num_vector=0)
use_discrete=use_discrete,
action_sizes=action_sizes,
step_size=0.2,
)
bc_settings = BehavioralCloningSettings(demo_path=demo_path, steps=1000)

48
ml-agents/mlagents/trainers/torch/utils.py


)
from mlagents.trainers.settings import EncoderType, ScheduleType
from mlagents.trainers.exception import UnityTrainerException
from mlagents_envs.base_env import ActionSpec
from mlagents.trainers.torch.distributions import DistInstance, DiscreteDistInstance
class ModelUtils:

EncoderType.NATURE_CNN: 36,
EncoderType.RESNET: 15,
}
class ActionFlattener:
def __init__(self, action_spec: ActionSpec):
self._specs = action_spec
@property
def flattened_size(self) -> int:
if self._specs.is_continuous():
return self._specs.continuous_size
else:
return sum(self._specs.discrete_branches)
def forward(self, action: torch.Tensor) -> torch.Tensor:
if self._specs.is_continuous():
return action
else:
return torch.cat(
ModelUtils.actions_to_onehot(
torch.as_tensor(action, dtype=torch.long),
self._specs.discrete_branches,
),
dim=1,
)
@staticmethod
def update_learning_rate(optim: torch.optim.Optimizer, lr: float) -> None:

for i in range(num_partitions):
res += [data[(partitions == i).nonzero().squeeze(1)]]
return res
@staticmethod
def get_probs_and_entropy(
action_list: List[torch.Tensor], dists: List[DistInstance]
) -> Tuple[torch.Tensor, torch.Tensor, Optional[torch.Tensor]]:
log_probs_list = []
all_probs_list = []
entropies_list = []
for action, action_dist in zip(action_list, dists):
log_prob = action_dist.log_prob(action)
log_probs_list.append(log_prob)
entropies_list.append(action_dist.entropy())
if isinstance(action_dist, DiscreteDistInstance):
all_probs_list.append(action_dist.all_log_prob())
log_probs = torch.stack(log_probs_list, dim=-1)
entropies = torch.stack(entropies_list, dim=-1)
if not all_probs_list:
log_probs = log_probs.squeeze(-1)
entropies = entropies.squeeze(-1)
all_probs = None
else:
all_probs = torch.cat(all_probs_list, dim=-1)
return log_probs, entropies, all_probs
@staticmethod
def masked_mean(tensor: torch.Tensor, masks: torch.Tensor) -> torch.Tensor:

78
ml-agents/mlagents/trainers/torch/components/reward_providers/curiosity_reward_provider.py


import numpy as np
from typing import Dict
from typing import Dict, NamedTuple
from mlagents.torch_utils import torch, default_device
from mlagents.trainers.buffer import AgentBuffer

from mlagents.trainers.settings import CuriositySettings
from mlagents_envs.base_env import BehaviorSpec
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.action_flattener import ActionFlattener
class ActionPredictionTuple(NamedTuple):
continuous: torch.Tensor
discrete: torch.Tensor
class CuriosityRewardProvider(BaseRewardProvider):

specs.observation_shapes, state_encoder_settings
)
self._action_flattener = ModelUtils.ActionFlattener(self._action_spec)
self._action_flattener = ActionFlattener(self._action_spec)
self.inverse_model_action_prediction = torch.nn.Sequential(
LinearEncoder(2 * settings.encoding_size, 1, 256),
linear_layer(256, self._action_flattener.flattened_size),
self.inverse_model_action_encoding = torch.nn.Sequential(
LinearEncoder(2 * settings.encoding_size, 1, 256)
if self._action_spec.continuous_size > 0:
self.continuous_action_prediction = linear_layer(
256, self._action_spec.continuous_size
)
if self._action_spec.discrete_size > 0:
self.discrete_action_prediction = linear_layer(
256, sum(self._action_spec.discrete_branches)
)
self.forward_model_next_state_prediction = torch.nn.Sequential(
LinearEncoder(
settings.encoding_size + self._action_flattener.flattened_size, 1, 256

)
return hidden
def predict_action(self, mini_batch: AgentBuffer) -> torch.Tensor:
def predict_action(self, mini_batch: AgentBuffer) -> ActionPredictionTuple:
"""
In the continuous case, returns the predicted action.
In the discrete case, returns the logits.

)
hidden = self.inverse_model_action_prediction(inverse_model_input)
if self._action_spec.is_continuous():
return hidden
else:
continuous_pred = None
discrete_pred = None
hidden = self.inverse_model_action_encoding(inverse_model_input)
if self._action_spec.continuous_size > 0:
continuous_pred = self.continuous_action_prediction(hidden)
if self._action_spec.discrete_size > 0:
raw_discrete_pred = self.discrete_action_prediction(hidden)
hidden, self._action_spec.discrete_branches
raw_discrete_pred, self._action_spec.discrete_branches
return torch.cat(branches, dim=1)
discrete_pred = torch.cat(branches, dim=1)
return ActionPredictionTuple(continuous_pred, discrete_pred)
def predict_next_state(self, mini_batch: AgentBuffer) -> torch.Tensor:
"""

if self._action_spec.is_continuous():
action = ModelUtils.list_to_tensor(mini_batch["actions"], dtype=torch.float)
else:
action = torch.cat(
ModelUtils.actions_to_onehot(
ModelUtils.list_to_tensor(mini_batch["actions"], dtype=torch.long),
self._action_spec.discrete_branches,
),
dim=1,
)
actions = AgentAction.from_dict(mini_batch)
flattened_action = self._action_flattener.forward(actions)
(self.get_current_state(mini_batch), action), dim=1
(self.get_current_state(mini_batch), flattened_action), dim=1
)
return self.forward_model_next_state_prediction(forward_model_input)

action prediction (given the current and next state).
"""
predicted_action = self.predict_action(mini_batch)
if self._action_spec.is_continuous():
actions = AgentAction.from_dict(mini_batch)
_inverse_loss = 0
if self._action_spec.continuous_size > 0:
ModelUtils.list_to_tensor(mini_batch["actions"], dtype=torch.float)
- predicted_action
actions.continuous_tensor - predicted_action.continuous
return torch.mean(
_inverse_loss += torch.mean(
ModelUtils.dynamic_partition(
sq_difference,
ModelUtils.list_to_tensor(mini_batch["masks"], dtype=torch.float),

else:
if self._action_spec.discrete_size > 0:
ModelUtils.list_to_tensor(mini_batch["actions"], dtype=torch.long),
self._action_spec.discrete_branches,
actions.discrete_tensor, self._action_spec.discrete_branches
-torch.log(predicted_action + self.EPSILON) * true_action, dim=1
-torch.log(predicted_action.discrete + self.EPSILON) * true_action,
dim=1,
return torch.mean(
_inverse_loss += torch.mean(
ModelUtils.dynamic_partition(
cross_entropy,
ModelUtils.list_to_tensor(

)[1]
)
return _inverse_loss
def compute_reward(self, mini_batch: AgentBuffer) -> torch.Tensor:
"""

8
ml-agents/mlagents/trainers/torch/components/reward_providers/gail_reward_provider.py


from mlagents.trainers.settings import GAILSettings
from mlagents_envs.base_env import BehaviorSpec
from mlagents.trainers.torch.utils import ModelUtils
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.action_flattener import ActionFlattener
from mlagents.trainers.torch.networks import NetworkBody
from mlagents.trainers.torch.layers import linear_layer, Initialization
from mlagents.trainers.settings import NetworkSettings, EncoderType

vis_encode_type=EncoderType.SIMPLE,
memory=None,
)
self._action_flattener = ModelUtils.ActionFlattener(specs.action_spec)
self._action_flattener = ActionFlattener(specs.action_spec)
unencoded_size = (
self._action_flattener.flattened_size + 1 if settings.use_actions else 0
) # +1 is for dones

Creates the action Tensor. In continuous case, corresponds to the action. In
the discrete case, corresponds to the concatenation of one hot action Tensors.
"""
return self._action_flattener.forward(
torch.as_tensor(mini_batch["actions"], dtype=torch.float)
)
return self._action_flattener.forward(AgentAction.from_dict(mini_batch))
def get_state_inputs(
self, mini_batch: AgentBuffer

46
ml-agents/mlagents/trainers/torch/components/bc/module.py


from mlagents.trainers.policy.torch_policy import TorchPolicy
from mlagents.trainers.demo_loader import demo_to_buffer
from mlagents.trainers.settings import BehavioralCloningSettings, ScheduleType
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.action_log_probs import ActionLogProbs
from mlagents.trainers.torch.utils import ModelUtils

update_stats = {"Losses/Pretraining Loss": np.mean(batch_losses)}
return update_stats
def _behavioral_cloning_loss(self, selected_actions, log_probs, expert_actions):
if self.policy.use_continuous_act:
bc_loss = torch.nn.functional.mse_loss(selected_actions, expert_actions)
else:
def _behavioral_cloning_loss(
self,
selected_actions: AgentAction,
log_probs: ActionLogProbs,
expert_actions: torch.Tensor,
) -> torch.Tensor:
bc_loss = 0
if self.policy.behavior_spec.action_spec.continuous_size > 0:
bc_loss += torch.nn.functional.mse_loss(
selected_actions.continuous_tensor, expert_actions.continuous_tensor
)
if self.policy.behavior_spec.action_spec.discrete_size > 0:
one_hot_expert_actions = ModelUtils.actions_to_onehot(
expert_actions.discrete_tensor,
self.policy.behavior_spec.action_spec.discrete_branches,
)
log_probs, self.policy.act_size
log_probs.all_discrete_tensor,
self.policy.behavior_spec.action_spec.discrete_branches,
bc_loss = torch.mean(
bc_loss += torch.mean(
torch.stack(
[
torch.sum(

)
for log_prob_branch, expert_actions_branch in zip(
log_prob_branches, expert_actions
log_prob_branches, one_hot_expert_actions
)
]
)

"""
vec_obs = [ModelUtils.list_to_tensor(mini_batch_demo["vector_obs"])]
act_masks = None
if self.policy.use_continuous_act:
expert_actions = ModelUtils.list_to_tensor(mini_batch_demo["actions"])
else:
raw_expert_actions = ModelUtils.list_to_tensor(
mini_batch_demo["actions"], dtype=torch.long
)
expert_actions = ModelUtils.actions_to_onehot(
raw_expert_actions, self.policy.act_size
)
expert_actions = AgentAction.from_dict(mini_batch_demo)
if self.policy.behavior_spec.action_spec.discrete_size > 0:
act_masks = ModelUtils.list_to_tensor(
np.ones(
(

else:
vis_obs = []
selected_actions, all_log_probs, _, _ = self.policy.sample_actions(
selected_actions, log_probs, _, _ = self.policy.sample_actions(
all_log_probs=True,
selected_actions, all_log_probs, expert_actions
selected_actions, log_probs, expert_actions
)
self.optimizer.zero_grad()
bc_loss.backward()

19
ml-agents/mlagents/trainers/torch/distributions.py


"""
pass
@abc.abstractmethod
def exported_model_output(self) -> torch.Tensor:
"""
Returns the tensor to be exported to ONNX for the distribution
"""
pass
class DiscreteDistInstance(DistInstance):
@abc.abstractmethod

def entropy(self):
return 0.5 * torch.log(2 * math.pi * math.e * self.std + EPSILON)
def exported_model_output(self):
return self.sample()
class TanhGaussianDistInstance(GaussianDistInstance):

return torch.log(self.probs)
def entropy(self):
return -torch.sum(self.probs * torch.log(self.probs), dim=-1)
return -torch.sum(self.probs * torch.log(self.probs), dim=-1).unsqueeze(-1)
def exported_model_output(self):
return self.all_log_prob()
class GaussianDistribution(nn.Module):

# verified version of Barracuda (1.0.2).
log_sigma = torch.cat([self.log_sigma] * inputs.shape[0], axis=0)
if self.tanh_squash:
return [TanhGaussianDistInstance(mu, torch.exp(log_sigma))]
return TanhGaussianDistInstance(mu, torch.exp(log_sigma))
return [GaussianDistInstance(mu, torch.exp(log_sigma))]
return GaussianDistInstance(mu, torch.exp(log_sigma))
class MultiCategoricalDistribution(nn.Module):

24
ml-agents/mlagents/trainers/torch/model_serialization.py


+ ["action_masks", "memories"]
)
self.output_names = [
"action",
"version_number",
"memory_size",
"is_continuous_control",
"action_output_shape",
]
self.output_names = ["version_number", "memory_size"]
if self.policy.behavior_spec.action_spec.continuous_size > 0:
self.output_names += [
"continuous_actions",
"continuous_action_output_shape",
]
if self.policy.behavior_spec.action_spec.discrete_size > 0:
self.output_names += ["discrete_actions", "discrete_action_output_shape"]
if (
self.policy.behavior_spec.action_spec.continuous_size == 0
or self.policy.behavior_spec.action_spec.discrete_size == 0
):
self.output_names += [
"action",
"is_continuous_control",
"action_output_shape",
]
self.dynamic_axes = {name: {0: "batch"} for name in self.input_names}
self.dynamic_axes.update({"action": {0: "batch"}})

223
ml-agents/mlagents/trainers/torch/networks.py


from typing import Callable, List, Dict, Tuple, Optional
from typing import Callable, List, Dict, Tuple, Optional, Union
from mlagents.trainers.torch.distributions import (
GaussianDistribution,
MultiCategoricalDistribution,
DistInstance,
)
from mlagents.trainers.torch.action_model import ActionModel
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.action_log_probs import ActionLogProbs
from mlagents.trainers.settings import NetworkSettings
from mlagents.trainers.torch.utils import ModelUtils
from mlagents.trainers.torch.decoders import ValueHeads

else 0
)
self.visual_processors, self.vector_processors, encoder_input_size = ModelUtils.create_input_processors(
(
self.visual_processors,
self.vector_processors,
encoder_input_size,
) = ModelUtils.create_input_processors(
observation_shapes,
self.h_size,
network_settings.vis_encode_type,

pass
@abc.abstractmethod
def sample_action(self, dists: List[DistInstance]) -> List[torch.Tensor]:
"""
Takes a List of Distribution iinstances and samples an action from each.
"""
pass
@abc.abstractmethod
def get_dists(
self,
vec_inputs: List[torch.Tensor],
vis_inputs: List[torch.Tensor],
masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[List[DistInstance], Optional[torch.Tensor]]:
"""
Returns distributions from this Actor, from which actions can be sampled.
If memory is enabled, return the memories as well.
:param vec_inputs: A List of vector inputs as tensors.
:param vis_inputs: A List of visual inputs as tensors.
:param masks: If using discrete actions, a Tensor of action masks.
:param memories: If using memory, a Tensor of initial memories.
:param sequence_length: If using memory, the sequence length.
:return: A Tuple of a List of action distribution instances, and memories.
Memories will be None if not using memory.
"""
pass
@abc.abstractmethod
def forward(
self,
vec_inputs: List[torch.Tensor],

) -> Tuple[torch.Tensor, int, int, int, int]:
) -> Tuple[Union[int, torch.Tensor], ...]:
"""
Forward pass of the Actor for inference. This is required for export to ONNX, and
the inputs and outputs of this method should not be changed without a respective change

pass
@abc.abstractmethod
def get_dist_and_value(
def get_action_stats_and_value(
self,
vec_inputs: List[torch.Tensor],
vis_inputs: List[torch.Tensor],

) -> Tuple[List[DistInstance], Dict[str, torch.Tensor], torch.Tensor]:
) -> Tuple[
AgentAction, ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor], torch.Tensor
]:
"""
Returns distributions, from which actions can be sampled, and value estimates.
If memory is enabled, return the memories as well.

:param memories: If using memory, a Tensor of initial memories.
:param sequence_length: If using memory, the sequence length.
:return: A Tuple of a List of action distribution instances, a Dict of reward signal
:return: A Tuple of AgentAction, ActionLogProbs, entropies, Dict of reward signal
name to value estimate, and memories. Memories will be None if not using memory.
"""
pass

super().__init__()
self.action_spec = action_spec
self.version_number = torch.nn.Parameter(torch.Tensor([2.0]))
self.is_continuous_int = torch.nn.Parameter(
self.is_continuous_int_deprecated = torch.nn.Parameter(
self.act_size_vector = torch.nn.Parameter(
self.continuous_act_size_vector = torch.nn.Parameter(
torch.Tensor([int(self.action_spec.continuous_size)]), requires_grad=False
)
# TODO: export list of branch sizes instead of sum
self.discrete_act_size_vector = torch.nn.Parameter(
torch.Tensor([sum(self.action_spec.discrete_branches)]), requires_grad=False
)
self.act_size_vector_deprecated = torch.nn.Parameter(
torch.Tensor(
[
self.action_spec.continuous_size

else:
self.encoding_size = network_settings.hidden_units
if self.action_spec.is_continuous():
self.distribution = GaussianDistribution(
self.encoding_size,
self.action_spec.continuous_size,
conditional_sigma=conditional_sigma,
tanh_squash=tanh_squash,
)
else:
self.distribution = MultiCategoricalDistribution(
self.encoding_size, self.action_spec.discrete_branches
)
self.action_model = ActionModel(
self.encoding_size,
action_spec,
conditional_sigma=conditional_sigma,
tanh_squash=tanh_squash,
)
@property
def memory_size(self) -> int:

self.network_body.update_normalization(vector_obs)
def sample_action(self, dists: List[DistInstance]) -> List[torch.Tensor]:
actions = []
for action_dist in dists:
action = action_dist.sample()
actions.append(action)
return actions
def get_dists(
self,
vec_inputs: List[torch.Tensor],
vis_inputs: List[torch.Tensor],
masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[List[DistInstance], Optional[torch.Tensor]]:
encoding, memories = self.network_body(
vec_inputs, vis_inputs, memories=memories, sequence_length=sequence_length
)
if self.action_spec.is_continuous():
dists = self.distribution(encoding)
else:
dists = self.distribution(encoding, masks)
return dists, memories
def forward(
self,
vec_inputs: List[torch.Tensor],

) -> Tuple[torch.Tensor, int, int, int, int]:
) -> Tuple[Union[int, torch.Tensor], ...]:
At this moment, torch.onnx.export() doesn't accept None as tensor to be exported,
so the size of return tuple varies with action spec.
dists, _ = self.get_dists(vec_inputs, vis_inputs, masks, memories, 1)
if self.action_spec.is_continuous():
action_list = self.sample_action(dists)
action_out = torch.stack(action_list, dim=-1)
else:
action_out = torch.cat([dist.all_log_prob() for dist in dists], dim=1)
return (
action_out,
encoding, memories_out = self.network_body(
vec_inputs, vis_inputs, memories=memories, sequence_length=1
)
cont_action_out, disc_action_out, action_out_deprecated = self.action_model.get_action_out(
encoding, masks
)
export_out = [
self.is_continuous_int,
self.act_size_vector,
)
]
if self.action_spec.continuous_size > 0:
export_out += [cont_action_out, self.continuous_act_size_vector]
if self.action_spec.discrete_size > 0:
export_out += [disc_action_out, self.discrete_act_size_vector]
# Only export deprecated nodes with non-hybrid action spec
if self.action_spec.continuous_size == 0 or self.action_spec.discrete_size == 0:
export_out += [
action_out_deprecated,
self.is_continuous_int_deprecated,
self.act_size_vector_deprecated,
]
return tuple(export_out)
class SharedActorCritic(SimpleActor, ActorCritic):

conditional_sigma: bool = False,
tanh_squash: bool = False,
):
self.use_lstm = network_settings.memory is not None
super().__init__(
observation_shapes,
network_settings,

)
return self.value_heads(encoding), memories_out
def get_dist_and_value(
def get_stats_and_value(
actions: AgentAction,
) -> Tuple[List[DistInstance], Dict[str, torch.Tensor], torch.Tensor]:
) -> Tuple[ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor]]:
if self.action_spec.is_continuous():
dists = self.distribution(encoding)
else:
dists = self.distribution(encoding, masks=masks)
log_probs, entropies = self.action_model.evaluate(encoding, masks, actions)
value_outputs = self.value_heads(encoding)
return log_probs, entropies, value_outputs
def get_action_stats_and_value(
self,
vec_inputs: List[torch.Tensor],
vis_inputs: List[torch.Tensor],
masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[
AgentAction, ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor], torch.Tensor
]:
encoding, memories = self.network_body(
vec_inputs, vis_inputs, memories=memories, sequence_length=sequence_length
)
action, log_probs, entropies = self.action_model(encoding, masks)
return dists, value_outputs, memories
return action, log_probs, entropies, value_outputs, memories
class SeparateActorCritic(SimpleActor, ActorCritic):

conditional_sigma: bool = False,
tanh_squash: bool = False,
):
# Give the Actor only half the memories. Note we previously validate
# that memory_size must be a multiple of 4.
self.use_lstm = network_settings.memory is not None
super().__init__(
observation_shapes,

memories_out = None
return value_outputs, memories_out
def get_dist_and_value(
def get_stats_and_value(
self,
vec_inputs: List[torch.Tensor],
vis_inputs: List[torch.Tensor],
actions: AgentAction,
masks: Optional[torch.Tensor] = None,
memories: Optional[torch.Tensor] = None,
sequence_length: int = 1,
) -> Tuple[ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor]]:
if self.use_lstm:
# Use only the back half of memories for critic and actor
actor_mem, critic_mem = torch.split(memories, self.memory_size // 2, dim=-1)
else:
critic_mem = None
actor_mem = None
encoding, actor_mem_outs = self.network_body(
vec_inputs, vis_inputs, memories=actor_mem, sequence_length=sequence_length
)
log_probs, entropies = self.action_model.evaluate(encoding, masks, actions)
value_outputs, critic_mem_outs = self.critic(
vec_inputs, vis_inputs, memories=critic_mem, sequence_length=sequence_length
)
return log_probs, entropies, value_outputs
def get_action_stats_and_value(
self,
vec_inputs: List[torch.Tensor],
vis_inputs: List[torch.Tensor],

) -> Tuple[List[DistInstance], Dict[str, torch.Tensor], torch.Tensor]:
) -> Tuple[
AgentAction, ActionLogProbs, torch.Tensor, Dict[str, torch.Tensor], torch.Tensor
]:
if self.use_lstm:
# Use only the back half of memories for critic and actor
actor_mem, critic_mem = torch.split(memories, self.memory_size // 2, dim=-1)

dists, actor_mem_outs = self.get_dists(
vec_inputs,
vis_inputs,
memories=actor_mem,
sequence_length=sequence_length,
masks=masks,
encoding, actor_mem_outs = self.network_body(
vec_inputs, vis_inputs, memories=actor_mem, sequence_length=sequence_length
action, log_probs, entropies = self.action_model(encoding, masks)
value_outputs, critic_mem_outs = self.critic(
vec_inputs, vis_inputs, memories=critic_mem, sequence_length=sequence_length
)

mem_out = None
return dists, value_outputs, mem_out
def update_normalization(self, vector_obs: List[torch.Tensor]) -> None:
super().update_normalization(vector_obs)
self.critic.network_body.update_normalization(vector_obs)
return action, log_probs, entropies, value_outputs, mem_out
class GlobalSteps(nn.Module):

14
protobuf-definitions/proto/mlagents_envs/communicator_objects/brain_parameters.proto


option csharp_namespace = "Unity.MLAgents.CommunicatorObjects";
package communicator_objects;
message ActionSpecProto {
int32 num_continuous_actions = 1;
int32 num_discrete_actions = 2;
repeated int32 discrete_branch_sizes = 3;
repeated string action_descriptions = 4;
}
repeated int32 vector_action_size = 3;
repeated int32 vector_action_size_deprecated = 3; // mark as deprecated in communicator v1.3.0
repeated string vector_action_descriptions = 5;
SpaceTypeProto vector_action_space_type = 6;
repeated string vector_action_descriptions_deprecated = 5; // mark as deprecated in communicator v1.3.0
SpaceTypeProto vector_action_space_type_deprecated = 6; // mark as deprecated in communicator v1.3.0
ActionSpecProto action_spec = 9;
}

3
protobuf-definitions/proto/mlagents_envs/communicator_objects/capabilities.proto


// compression mapping for stacking compressed observations.
bool compressedChannelMapping = 3;
// support for hybrid action spaces (discrete + continuous)
bool hybridActions = 4;
}

360
com.unity.ml-agents/Runtime/Inference/BarracudaModelExtensions.cs


using System.Collections.Generic;
using System.Linq;
using Unity.Barracuda;
namespace Unity.MLAgents.Inference
{
/// <summary>
/// Barracuda Model extension methods.
/// </summary>
internal static class BarracudaModelExtensions
{
/// <summary>
/// Get array of the input tensor names of the model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>Array of the input tensor names of the model</returns>
public static string[] GetInputNames(this Model model)
{
var names = new List<string>();
if (model == null)
return names.ToArray();
foreach (var input in model.inputs)
{
names.Add(input.name);
}
foreach (var mem in model.memories)
{
names.Add(mem.input);
}
names.Sort();
return names.ToArray();
}
/// <summary>
/// Generates the Tensor inputs that are expected to be present in the Model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>TensorProxy IEnumerable with the expected Tensor inputs.</returns>
public static IReadOnlyList<TensorProxy> GetInputTensors(this Model model)
{
var tensors = new List<TensorProxy>();
if (model == null)
return tensors;
foreach (var input in model.inputs)
{
tensors.Add(new TensorProxy
{
name = input.name,
valueType = TensorProxy.TensorType.FloatingPoint,
data = null,
shape = input.shape.Select(i => (long)i).ToArray()
});
}
foreach (var mem in model.memories)
{
tensors.Add(new TensorProxy
{
name = mem.input,
valueType = TensorProxy.TensorType.FloatingPoint,
data = null,
shape = TensorUtils.TensorShapeFromBarracuda(mem.shape)
});
}
tensors.Sort((el1, el2) => el1.name.CompareTo(el2.name));
return tensors;
}
/// <summary>
/// Get number of visual observation inputs to the model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>Number of visual observation inputs to the model</returns>
public static int GetNumVisualInputs(this Model model)
{
var count = 0;
if (model == null)
return count;
foreach (var input in model.inputs)
{
if (input.name.StartsWith(TensorNames.VisualObservationPlaceholderPrefix))
{
count++;
}
}
return count;
}
/// <summary>
/// Get array of the output tensor names of the model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>Array of the output tensor names of the model</returns>
public static string[] GetOutputNames(this Model model)
{
var names = new List<string>();
if (model == null)
{
return names.ToArray();
}
if (model.HasContinuousOutputs())
{
names.Add(model.ContinuousOutputName());
}
if (model.HasDiscreteOutputs())
{
names.Add(model.DiscreteOutputName());
}
var memory = (int)model.GetTensorByName(TensorNames.MemorySize)[0];
if (memory > 0)
{
foreach (var mem in model.memories)
{
names.Add(mem.output);
}
}
names.Sort();
return names.ToArray();
}
/// <summary>
/// Check if the model has continuous action outputs.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>True if the model has continuous action outputs.</returns>
public static bool HasContinuousOutputs(this Model model)
{
if (model == null)
return false;
if (model.UseDeprecated())
{
return (int)model.GetTensorByName(TensorNames.IsContinuousControlDeprecated)[0] > 0;
}
else
{
return model.outputs.Contains(TensorNames.ContinuousActionOutput) &&
(int)model.GetTensorByName(TensorNames.ContinuousActionOutputShape)[0] > 0;
}
}
/// <summary>
/// Continuous action output size of the model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>Size of continuous action output.</returns>
public static int ContinuousOutputSize(this Model model)
{
if (model == null)
return 0;
if (model.UseDeprecated())
{
return (int)model.GetTensorByName(TensorNames.IsContinuousControlDeprecated)[0] > 0 ?
(int)model.GetTensorByName(TensorNames.ActionOutputShapeDeprecated)[0] : 0;
}
else
{
var continuousOutputShape = model.GetTensorByName(TensorNames.ContinuousActionOutputShape);
return continuousOutputShape == null ? 0 : (int)continuousOutputShape[0];
}
}
/// <summary>
/// Continuous action output tensor name of the model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>Tensor name of continuous action output.</returns>
public static string ContinuousOutputName(this Model model)
{
if (model == null)
return null;
if (model.UseDeprecated())
{
return TensorNames.ActionOutputDeprecated;
}
else
{
return TensorNames.ContinuousActionOutput;
}
}
/// <summary>
/// Check if the model has discrete action outputs.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>True if the model has discrete action outputs.</returns>
public static bool HasDiscreteOutputs(this Model model)
{
if (model == null)
return false;
if (model.UseDeprecated())
{
return (int)model.GetTensorByName(TensorNames.IsContinuousControlDeprecated)[0] == 0;
}
else
{
return model.outputs.Contains(TensorNames.DiscreteActionOutput) &&
(int)model.GetTensorByName(TensorNames.DiscreteActionOutputShape)[0] > 0;
}
}
/// <summary>
/// Discrete action output size of the model. This is equal to the sum of the branch sizes.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>Size of discrete action output.</returns>
public static int DiscreteOutputSize(this Model model)
{
if (model == null)
return 0;
if (model.UseDeprecated())
{
return (int)model.GetTensorByName(TensorNames.IsContinuousControlDeprecated)[0] > 0 ?
0 : (int)model.GetTensorByName(TensorNames.ActionOutputShapeDeprecated)[0];
}
else
{
var discreteOutputShape = model.GetTensorByName(TensorNames.DiscreteActionOutputShape);
return discreteOutputShape == null ? 0 : (int)discreteOutputShape[0];
}
}
/// <summary>
/// Discrete action output tensor name of the model.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>Tensor name of discrete action output.</returns>
public static string DiscreteOutputName(this Model model)
{
if (model == null)
return null;
if (model.UseDeprecated())
{
return TensorNames.ActionOutputDeprecated;
}
else
{
return TensorNames.DiscreteActionOutput;
}
}
/// <summary>
/// Check if the model uses deprecated output fields and should be handled differently.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>True if the model uses deprecated output fields.</returns>
public static bool UseDeprecated(this Model model)
{
if (model == null)
return false;
return !model.outputs.Contains(TensorNames.ContinuousActionOutput) &&
!model.outputs.Contains(TensorNames.DiscreteActionOutput);
}
/// <summary>
/// Check if the model contains all the expected input/output tensors.
/// </summary>
/// <param name="model">
/// The Barracuda engine model for loading static parameters.
/// </param>
/// <returns>True if the model contains all the expected tensors.</returns>
public static bool CheckExpectedTensors(this Model model, List<string> failedModelChecks)
{
// Check the presence of model version
var modelApiVersionTensor = model.GetTensorByName(TensorNames.VersionNumber);
if (modelApiVersionTensor == null)
{
failedModelChecks.Add($"Required constant \"{TensorNames.VersionNumber}\" was not found in the model file.");
return false;
}
// Check the presence of memory size
var memorySizeTensor = model.GetTensorByName(TensorNames.MemorySize);
if (memorySizeTensor == null)
{
failedModelChecks.Add($"Required constant \"{TensorNames.MemorySize}\" was not found in the model file.");
return false;
}
// Check the presence of action output tensor
if (!model.outputs.Contains(TensorNames.ActionOutputDeprecated) &&
!model.outputs.Contains(TensorNames.ContinuousActionOutput) &&
!model.outputs.Contains(TensorNames.DiscreteActionOutput))
{
failedModelChecks.Add("The model does not contain any Action Output Node.");
return false;
}
// Check the presence of action output shape tensor
if (model.UseDeprecated())
{
if (model.GetTensorByName(TensorNames.ActionOutputShapeDeprecated) == null)
{
failedModelChecks.Add("The model does not contain any Action Output Shape Node.");
return false;
}
if (model.GetTensorByName(TensorNames.IsContinuousControlDeprecated) == null)
{
failedModelChecks.Add($"Required constant \"{TensorNames.IsContinuousControlDeprecated}\" was not found in the model file. " +
"This is only required for model that uses a deprecated model format.");
return false;
}
}
else
{
if (model.outputs.Contains(TensorNames.ContinuousActionOutput) &&
model.GetTensorByName(TensorNames.ContinuousActionOutputShape) == null)
{
failedModelChecks.Add("The model uses continuous action but does not contain Continuous Action Output Shape Node.");
return false;
}
if (model.outputs.Contains(TensorNames.DiscreteActionOutput) &&
model.GetTensorByName(TensorNames.DiscreteActionOutputShape) == null)
{
failedModelChecks.Add("The model uses discrete action but does not contain Discrete Action Output Shape Node.");
return false;
}
}
return true;
}
}
}

11
com.unity.ml-agents/Runtime/Inference/BarracudaModelExtensions.cs.meta


fileFormatVersion: 2
guid: 1193c3bef93464baca0d8ba2d6ce1754
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

1001
com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.onnx
文件差异内容过多而无法显示
查看文件

14
com.unity.ml-agents/Tests/Editor/TestModels/continuous2vis8vec2action.onnx.meta


fileFormatVersion: 2
guid: f90bffb60a3784a2385299a321f354a6
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj
11400002: model data
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3}
optimizeModel: 1
forceArbitraryBatchSize: 1
treatErrorsAsWarnings: 0

867
com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.onnx


pytorch1.7:��
�
visual_observation_0
5network_body.visual_processors.0.conv_layers.0.weight
3network_body.visual_processors.0.conv_layers.0.bias35Conv_0"Conv*
dilations@@�*
group�*
kernel_shape@@�*
pads@@@@�*
strides@@�
1
3536 LeakyRelu_1" LeakyRelu*
alpha
�#<�
�
36
5network_body.visual_processors.0.conv_layers.2.weight
3network_body.visual_processors.0.conv_layers.2.bias37Conv_2"Conv*
dilations@@�*
group�*
kernel_shape@@�*
pads@@@@�*
strides@@�
1
3738 LeakyRelu_3" LeakyRelu*
alpha
�#<�
>39
Constant_4"Constant*"
value*J�������� �
38
3940 Reshape_5"Reshape
�
40
/network_body.visual_processors.0.dense.0.weight
-network_body.visual_processors.0.dense.0.bias41Gemm_6"Gemm*
alpha�?�*
beta�?�*
transB�
1
4142 LeakyRelu_7" LeakyRelu*
alpha
�#<�
0
4243Concat_8"Concat*
axis����������
�
43
/network_body.linear_encoder.seq_layers.0.weight
-network_body.linear_encoder.seq_layers.0.bias44Gemm_9"Gemm*
alpha�?�*
beta�?�*
transB�

4445
Sigmoid_10"Sigmoid

44
4546Mul_11"Mul
�
46
/network_body.linear_encoder.seq_layers.2.weight
-network_body.linear_encoder.seq_layers.2.bias47Gemm_12"Gemm*
alpha�?�*
beta�?�*
transB�

4748
Sigmoid_13"Sigmoid

47
4849Mul_14"Mul
L
action_masks50Slice_15"Slice*
axes@�*
ends@�*
starts@�
L
action_masks51Slice_16"Slice*
axes@�*
ends@�*
starts@�
�
49
/action_model._distributions.0.branches.0.weight
-action_model._distributions.0.branches.0.bias52Gemm_17"Gemm*
alpha�?�*
beta�?�*
transB�
*
5253
Softmax_18"Softmax*
axis�

53
5054Mul_19"Mul
H
5455 ReduceSum_20" ReduceSum*
axes@����������*
keepdims�
.
5556 Unsqueeze_21" Unsqueeze*
axes@�

54
5657Div_22"Div
158 Constant_23"Constant*
value*J���3�

57
5859Add_24"Add

5960Log_25"Log
*
6061
Softmax_26"Softmax*
axis�
�
49
/action_model._distributions.0.branches.1.weight
-action_model._distributions.0.branches.1.bias62Gemm_27"Gemm*
alpha�?�*
beta�?�*
transB�
*
6263
Softmax_28"Softmax*
axis�

63
5164Mul_29"Mul
H
6465 ReduceSum_30" ReduceSum*
axes@����������*
keepdims�
.
6566 Unsqueeze_31" Unsqueeze*
axes@�

64
6667Div_32"Div
168 Constant_33"Constant*
value*J���3�

67
6869Add_34"Add

6970Log_35"Log
*
7071
Softmax_36"Softmax*
axis�
#
71discrete_actionsLog_37"Log

6173Log_38"Log

7174Log_39"Log
0
73
74action Concat_40"Concat*
axis�
< memory_size Constant_41"Constant*
value*
J�torch-jit-export*=B-action_model._distributions.0.branches.0.biasJ*��B/action_model._distributions.0.branches.0.weightJ����I�<�/-<_# ��c�� ��<Ǵw<ę�.�*<��;"�<a~�;lc�<Z4��M���=�x��S"O�e�5���8���:!,G�.m�d�W�t�������^<U������;wd:�ި;S�<�&�J1��YG:<#��;ڃ�����ǎ7�k��k��;�M<H�%�g]�;��ȻHU'�ՙ<���;��<����뭩<?ҹ<<a/��dV<�:|��f<7$��+������ss<W3��j�� ��� 9����<��ػ���;>��X�U��;�����a�p+7<g}�TVD<"_%�fU��Kv�W؁��q�<�?C��N��h�&���~�Kג<��9�ʔ�'�����$�<�ä�B����1���4�4R �꿃:�i��:��m�~<cGB<��6;�Y;���;��1<��!�O��<���e+�u���2��;�� <
=Ҁ���t<Ou�< h�����;[<���<�P�;���]h<�iE��s(;M
`<�R�F��K�< ���8˹��-����<p�F<�Fh�"#���.��2��/6<c���p��b �;)�*��0K<�����E<�#3;�;<��:<�-�;���;Lݻ�l���T��(g���K�̢�<+�J<�.�<�Y<��<���;b&�;�پ�dW4�+�E�dK�m<�J�9k �;����ĕ�;~?3;�~ֺ�6<7=��w�|���C<�̓������.�|f-<�8<��5����8q�"<�T<��C�3�8<�9�;Ӧ<4B<��F<d�;hC�;1Ω<���<���<�D���;�
����3ı�K�
=��C��-�;���8��<�$����8�:�s�����9k:��X� �jxa<��������o�u"ớ2;�_�Z<�N<��ۆ(�G�4<��!<�ډ�]?8��<`3ջ7�Y�[J�;��<��<ĭ <#�l��"<�a<��f<��K:��4<o���i�;��ݼC����<�, ;�ޙ:�x�����U��ٜ���@����:��Z<*AB-action_model._distributions.0.branches.1.biasJ *� �B/action_model._distributions.0.branches.1.weightJ� �E��oB;�;f<�Z»�IJ�hэ���<pTO�ہ<&亼��<K��;���f�;vj,�VM<9繻�,�;#���"<�?�<�-�<�V�:]pֻ�&;�V��"X������3���%>%;� �;�gt���9���;��=�F���<u�����><AR<k)�c`�����O��;�Ⱥ/)�;�<�:g��;�ʳ:�g�:o� �ؿZ<�8���%<*Q.<��o�u�@<Bq��}$�<�\<�ޔ�Eu���ԅ<k���*�<*@w�@����듻�gl;y黧��;��x<]Z]��Z�;�<�s��ˎ�<�z���q�o���6�;7���e�=��c#<ؤm�#�z�/��o�����P���<���#;�/�<gg�;�8d<��v<�z$<g&����;�l�;cP���<��%<Ā#:�;<��K��<�<����}���D�;B��;{sлң_<�)���;�à;%fV<�ޛ<�%�Qk�<�Qʹ����0>��z։����<��<�׃< ;�r߻3v�;�hc�kS<8)Z<
��:�B:;�������/*����;x[3��z�;M��;��<列<*����D�� 4;��<W|��8x����<�l�9C �<�>=Y�M
�6ժ<��u�7V�8{ < \����ŻD�)�c�<��)<}n;rںl%H���;=�:��@<�8���<���<�(�å�<c����<��<��ݻ�����P�<U]p�;����%n<;�P�O�˻m/�<9<��29<o5Ƽ�4����;<
1j<���<���i�<&<Z=�;�t���Q|<W�;;K��<ǿ<S�2;c'<p�����鼇ur;ͥ���,���jB���|:'8`��`�<� C�s�<\g,<��;O䕻���Tg�;.j�:u���wj<]��<ZI��y;�r�j^���<�j:r��w�9ݓt<��9<�� ��$�l��:}�Ӻx*T��=<�;���BL8�vɻ2H���x:�08���L����; �:<;�1��^�;�KB:�����);[�I�ԣI���<jq�<�$=�����*}<����z0k<Ȏ�#떻5#)��bȻ��<�V�:�,�#��<ӎ��L���Gƨ<@�P��u�<��s�/_��oW�!�5;~#<b��<&��<��Ǽ�%�<���;i���{ؼ�:��!6�h[��%�B�;�'<��U;#;j<���<�VI�1H�:*��G���ߤ<��⻯��<^�U;<�?3��" ��M<�Yi�Ņ�;�@j9#d�<�g0����N�<��<�U�:/?G��L1<$�����;���ӣ�;@x�<H��<\�.�Pg�<�Mq<��<��¼��<OZ��U�8ӆ�K{�<o�<��ü2ϲ;XT:�f�ׅ3;^Q�ڎ� v�g�<<_*��s�2��Լ�%�8������ � )�<]��;��̻n;����v���ƻb m<$�<b$��S5��a�(<�[k;G9�<E�û�__�Q�<�^�% <U�<���Ji�<W��:�C�v=�<���<T��<��;�Ò<�7�:*Baction_output_shapeJ@**Bcontinuous_action_output_shapeJ*(Bdiscrete_action_output_shapeJ�@*!Bis_continuous_controlJ*��B-network_body.linear_encoder.seq_layers.0.biasJ�*����B/network_body.linear_encoder.seq_layers.0.weightJ��j�.Ħ�?��=��g=��9����4K=d�"�'�.��y��˝=�CG<��=���*����.=���<�= �k=���
ٞ>ŕ=�V�=�k>w�a=?�X���0�,���=+�&�c��;�4��{{�=-Xý��/;��*�����\�W�ʃq>Pָ<��=(aû�>��˽��k=���i�~������˫�Ŗ��u�>e(�=��Ͻ}Ճ��M>b��fR����&<�x���i@��*2>:����e�=��<�D�=��>a61���*�,A=��/�����E��=�|L>Ґ=�f���y>w���tʷ9ܹ;*,=����^/>�G��c��4��=�������T��)
v���=��=(կ=c�R=<0C���.�:^U����=�k�T =��ٽ:��P� >r>�<':
���J�31>����=�����=Lۦ��\O�?��=l�">�'/>�V>ij/>�5V>��y> x����=�>{+���㦾�W�=����P�=8�ɼ.U۸�����=U{h>� ��+sz>XD
>%K+�nM#>�#���=�8��F^H�0��>[�'��wѽ� ʽF�>��d=hx >������L�>� >09"=��;$��1Nh�A�z=a�H�h�Լ����5�=2
��Jz��н=5�>��z=gl��=�m�<�lU��.��$T>���>=*y>_y��f=\ɽ�� >&�����<�o�=�=�=�TJ=�>,� ="ń�<E����=R.h=<0�T7
>Ⱥm=6}��*�(>��&�j�ʼڣý� �<+2<vք>Y��=A������=� �<^�>���= S~>AZ>�N �M3����;LY�=�ǘ<�/6>Qݦ��i =�yg> �=Y�B="q=���=1k�<� �=%z
=K�$���^���=��=[��<���.�gzu�;�>T��=�,u��pW�cr���އ=O��>&���;7�L�i�4AT=�+>���=��D= �>��
�;�\��K�=��=�d�:om�=��^%�=�Qx=�t�<��f>�x^=n�u����,V4<$���4�=I��
#h��o��=I��=.�=�6�=�=�=̇=
O��d�a>_V<{@�����=�S.= w�=�O�_�D=�Z>\��=�_�=T6=&ꌼ��4� �>�_&u<A`���G:X0н.�>�t;�F��{�f=�>�ᴽK�`=p_��'�@=�V�=n|u>�`��G�V>�V>�z7���۽��=Zg;H8� ƾ>�Q�=sC�<�z�=�B�=HW%�=�-����� ����=Sbw�}���k�>l⺽q�=�"���Nz=|B"�f�H=�o���=���>�3=�׽,���j>窜<�e}��<8���0�c�&>K�˾1ܽ�G�����=�<����Ƶ�������<~�J�R�X��� ���?�Mʼn�0��3oѽV��==B^>F�E>��?�F"=,An��R->��'���=����2=�� ?�֍l����=G�=3��3�K>�n�=Rm�����D�">u0=¹V��;S���*��%�˽6��n"����ņ>���\f�=�C
>cD��w��>� =��=� >�q�=󏌼61D�Bu2����<m6��nԽK+ɽ���<�5�=�nE����>%g >����x@��n<Z򹽔V��{ti����=vR=޹��p�h�->��ý���=�rP>Q��=-� <w�F�aѼ=���9���U���gAH�8���`��P>A���H��k�_>�8�QX�>�VT�T >4��=1f=�*���^��4�S>�ȡ��W�=rS:=�*=�8���i���p�>�����< �=�,9��= vJ�ʵ����<H �yo=�V]=�F=�=yݢ�bUm=��4�|sZ=�&>{��=l���ЃϽ��-<x�]<��=/�����+������a�<�X�<�o
>>������;��=]�;3j��n>��;k��=[��=��=Π����=���<{����`��k�潃\�!�]>�m�=N�O>k���d>WLd>�+���ه>O����Yýc͹�j,��uo �P��� ��0�yսH�����
�g�>�4>��,�1�#�CF<�㽃�w=���=��D���^��o"�#L=�w <�P���.�=�Z:���Z�f8<x��= �������ɽS{I;��e��h�<�jG�u `���������q��#<�=�oػ����
��g��<��0��ub=B3>���=����7���:�< S>ef?>�����=kkY��=�e��Oܼ��r=ㆇ�Kq ��/���b8��H'���z=M<Խ���=R��r�@>��t�/���kW>�>��n��=���=��t=���;� *>��L=���=��-�(*��A�=t������b|�S� >��=sx�<�����ǽ�H�oX���g�=eR;=~N����=&콽��B�5�l��2:��)>l��|�$>>>���=��^��<
] =쥽d`����=�RT����:XX�w� ���=!�=Z�=i��S�=��>�.�(R!��f���_ʽ�Ȇ>�/�4��=qK�>��A=e��Us�<y�0>* �=Q���h�c=i|��W�W>I�^�S���� ����o���k=�V�Z��=g|-��×��/�=�Q�=E��=��>��v=U�O�
t��H��=�}=��=O5=���A�XT<>\?�W�=���=�Ś��=9�7>Be�=i ='V5�T��ѿ�
�O>�{w��92����<i�8���:=�6�<���4����>�7�<4`���l>�4���d">l���z���^��s�(>�!
== ���C�D7�<��=�<�=�˽ g�h-�͜�=��R=��ؼm������Q>g<{u�>}s�h�6<2��=�� >��
>_�麛lz>�+����ý<G��N��7�>���=�ޣ�g��@��;��8>�� =�Y���H��\_=i���E��� b�;���<�V>|\U>3���Y ؽ�G�;�= ���[e=�[[�,�q��%<��\��r@��1�=�I�>qw��A���'<C�.�C�:��N��o����!>�v(� ��>�Vn=�=�� �=��A��|�=z�l<�l=ʾw�ICɼX��=儾<�>�t�=��߽�l�R�/<]�H���?��!Q=+}�8�$��yF=嘸>��ɴ�Y ��o&>�鋽p�!���y��>��>Ɖ�=��=j��<�n_��n}>̶k�b#,>�-="n�=4`ٽ0� >*̏��=�=?b�=I�<@���C1�M��͊��|Ke�n����~�="��Eڶ=�������:�=h�=L��=��QD��=�@<�އ=��=���=���=n�3>˜�>�3���@>��;�9D���B>{�3=�DT��d'>�q� �z>Ï�=�ݽ����:Լ�q��:^����yH=�ɴ=����ɍɽ�@�����:G�HKU=p��>5�=��i�)��Qz�<px�<�<�>e>U��=��>�<��g>�/)>`a=�/�=�{F�!���n��B�'� �F��kD>f}��"��լ�� =�V�=�����,> �&�#i�Dҽ� �=�r��J$=�Z��9r�>��ܼ��=\�X��S�>�+�=��)>�x7=veR>y�'�ey�����;}�O�g]<��¤>uF�{}����;;j=?o<�>V���%�%���� >Y�󽚾���H���+�����>/oɽ�:��M>Xl�=��c��U�g�=W�� �����O���W׽�<�<�V=��|E�������˼�'�<y�;@��:P��=>�ӽ���=�2R<�Z�=89��}��=}���M���!���5�Α̽�)�=����To�Ff�=���G*�FS��0y���;�@\7>�(Ͻ|<n?Ƚ3H���x<���\rG;�������r�>J���ܯ���:=8M6�"Z��s�->�Λ�_�X=�~�=#�=,��<�;_�3��<%�x=.��=_��=+R�;�t>OR;z���G�<m�,>�>�<���=3�˽��=��0s��w\�C}��u�O��+�P� ��q�=�0�>�qǽ�IH>6�޽k��=��/�O"�>���<j۝�j�w>"�4���U�s����|���<*��=4莾F�n���?>B��<����?2>W�M>\ =kV?<֛V=�p<.|O����dLW>zZ{=�%�=FӦ��7*>Ų>y_�aB>'ZK=��7��}���Ȍ<���=�m��V���-�]>�H=g������]罙�7>m+��?�N\���>�<6=�0=��;�������>a��=��=>�)>S �����<;ّ>��>�� >X�E>"и�~'*=>����b2�>�>�I�Ժi=./ӽf@]<��=�T��"#9�Ly��#qp�o/k�o4�=iG=�Ӱ���޽Aܔ�-n}<D� =�x��b>���=��]�$���`�;�A<\_���3��c��9�"��>��?��$�d>3�ۼmE�=�o�<���;@��YY>0tx��R��s�˼ٜ>~^l<��5�D��=K�ּ��!; �V=P�ٽ &=޺�/���$=d#�<�ؗ�|��=�;�=��=5=��>�����>��=�����y��`ż���=2��<z�=���t >v�ѽ���R�=٫�=��=e2Ͻ��ƽ�i���Is�q��=�׷<��=�O">������=#��;}�׽��ἀK���Ϳ����>(�=�O=E��%�#>v!?>��=�奼P`K>�/��� �21�<Ɔ�>�X�=�[6>�">wd�����hp�������=X�7=�ե<8s<���=���=��Y�3�>9!h=٤~���^=-�㼑P^=
!�={�I��uT>�� =�<b1�>���=�>�6��z%<*5'>�qn>���{�;�z���rK>\��=�L�=j��sa=� w<�s�=[>�t>J(o��p>/�)=����N.>:G�4��=<Z=~�ν)��<Qq<� �>�g�;���=8et=3�T��i[��d�<Z7+��Ʊ����6q罘*�=��>�Ù�+�">����tI��ܨ�"'G>�v=�J���; ۶���3>/��{#>��C�K�'�%Ξ�4���<����7�<<:>�hM>�z�<�.�=[�ͽ59n�'�O�n�=x�=��>4��=�S>��1>�����V<Ž`��=ʥK���e=M'��F|=��&>,&E�t9�=�m��w�<ʄ>��:=�)�=K���BL5��ۀ>��F�N�����UE=�Y�<��z>Ւ=�<�[�=�H<}l�<�I|>��̽9h�=��'�Q��=Լ�N,��^�ɽ�2d��.<�W�>���<NP>��>`�=.�%�p��� ��{�=�3��>Ǽ?�T>�>�[�;{m�=NU�<��𽋧=K۶=��1=��9�UZo�B�Խ��ڽ�V>�f�=�.����뽩X�� �Q>z��<x@�L2��kL>��<��R<��/��Ī<��@>�����]">̵�<��V=MЉ�2d�/s�=a�#��W]��7��W����=1�Y;��a>��e<�^��<#r=��ν��r��e'>�r>�<�<uP�U��'�����=w~~��E�<a$ �[�E��P=��f<�{��><�j�<��:>�}>��žԭ�=/����K�=��V����������=ﺑ�D.=��ɽ��%lA���l>:>|�=� ޽0�u=�]=�}=�uh<{����>�Qg=m L��
>CP������X���= �@�Y`�ѮL�e���@��=��= 5��y�K>��=�r =��">*��=���=���<E�F�l=V�E�� >��*���˽��>`|�;%\3>*��=l5������)����!���=��<�"�w��*�:�+�]��&߽� �����=�02>�M�6�¼S�⼹���8�;�;��a׵�ݽ#��T�s����>�{f�*(=��H�q�p��VT�`��u�>�����s�Z>ѝ��w�B��,н��>Um>^Y���=]�f;&L�̺q�����C�����yઽ;�<�ۯ<�>��?����;wĈ>�O��P��8b����7=�I����-�ya�=�7�����F=>�"w���Ž*`���F�'��=�=T� >-����O9��=�{-�@D�<�+I=��V>�6�;��= ⫽e��f��BlW==��� ɀ<�{�<V�֯½��<h)=J��X��m�!><�I�;=<��S�m�KM�<{lO�S�F>�Q�=�y2=^~��C��#y'�6G���)�=|��_~�>��r=�&���5Z���=�-B=��R>�� >_D���{=�li�ͫ�/�f������PT>�N7�����1�;�%>���='|7�|�x� �k>ο���3�"Dl�TZ�=���<q��<��=Rϖ>�:A=�����:��y�=�B=�(�m�T��<F��=5u��wO����dC��:��=+��=&������w�6��u�� >�o+��1E=��ʼ
t>�z>7�B��w;G�y�>���6P>B�e>�V=�U�b�����?j7��d �g0����<��/=x���3\M��%�x\j=w��~�>��,�뵪���L=� '�=�^��m���l��ԝ<֦=?�۽0�=��%���>�[���p�G�>+&�=��=AO��$��c�O�� :����=0l�:��=�r�<r��� ���^�Ǿ���=�v3��en<3�X=U�?> �p>�o�=�yz��w�"���2�#���?>��N� >%�����߽�3������&>-�=, L�_\>:�r9�z9>n/A���F��=�<�G�႕���뽛�\=�<ѻ{y#�
�^>vX۽�+��Q�$>�ި>�r�=��c�5��=�h"���f=hDӻ�g�=�����'=OT=v!�=�G˽ b���_>��������ʽ��>��>���=���g��:���<�����o���һ��;����=�[f=\gW�$��=+ي=��\=��g>ɌL<dKK��½L›��ҍ���='Ly<�e�=,�,=WW��
�Ӽa@f�Μ�<�q�<�
S� �1=V�>�|x��ؽ�I5>��=w
��H��Ĵ="�&>�M�=��y0����=�#3�~X۽~Tɽ�8�=��^>m�Q=�A�� >8N��˶���y?=f��=Z1��\�=�w2��Zɽ4�M�7������<9�<�չ==1�J�L����=��=��&> Z^>�X ��ܾ��9\�@�>�fl���M���E�����c������6R�=
żI��R�̽^3R=ݱ<�
�=��=ln��X`��K��&&<��>�G.� 2����;}X =�T�<;)Q���i��Y=��<��<މ��G��=d�>�6K�y�=1�+��C��̅h����=�'�<Yb]<�g1>��R>�0=m:>�ɼ�����>I�=���H<��;H���w=�(�=`].���-�3TȽ
�`�U��ԑ�<ėh>�v����>�%%�~�=�ވ=�1>��v=��Z>_֙=<�=��� h�����=$�>���<���=޷$�\#=�����C�m ��B>jI��G17>�M̽�~O�~A���+>.�=�`v;�i��j�>�~�P*��g3!����<��"�R��g =��h>+8׽X{���%���X��t_վ�@����>v�>R�'=�$��W��W�=�;潌���b�1>�El�\�-=�Bp��@.�9�K>w��O,|��ؾ�j�=��纼�L=������;ĚV� �M=�X�=(g�=�� �~�i>,9�=faX��Ǿ��>(�P�lZ�\�%��9�=?Л::!����<��>=2�`���9����> �=%�򽩶G�W�!��\��<��/��=s�L>�Cu=��U���=��\<����n��X���C ����8(w����~s=i-߼���=ok��i�ֺ�=� =��ܽcD`��k�>#�j�.K> ��=����3=�슽���=���<��"���7>A��=��|��N+=�R��G�=��x�f�B=��>Me>ko���ֽ� >���;���<�b�=�✽)�=��T>����1�=��y=��V=~�=
&���>��>� �=�3�=�$�X!���&��!�@>� V�$z �Gw���_��z ߽a���5j9=sc_>E�J�5����C>���; ������?uF>ڔ�=yu>�X޽^�W>��J<�K�=W� >���;�+=���=�5ɻ�KE>̢�=S�-:��\���7<���=��H�9�>�3�=i >٤r=��������Hh>����*��>�2;����*��f��x>���=\c�������f�3�#Y>�@��z�v#�>m����=3�D;��<�hd�H!�=㔀����<��=<��� ����བྷ4���:��B>d��<����Q<q@�<91��k��� >�b/>��=Yټ�����t�k����g����=S�ɽ�?X>��'>�S0=���=z4��K�<7X�=�0h�Z.i>�~�=k=����̽iν!�^>�{��P�<���=lq�� ��:o��6I>�r;=�bJ>� ŽzW޽�L�=�fv<�=R�=A��Fj*>�ؽz�\�t�3�֔��L��='���zEo��주Uy_��=�|ֽ�g>3>yNG>λȽ�6S�
�F> $����%���?���H>�'7>Z/��r8�\H�=]߆��6�i�'w߻�ó��\=�j���)>��=�5$>/,>E�O��G��̊V�W}6�H�=�K|����=�e>�(�=�lf��:U=� �݄>��6�Oe>+�=2Լ<�$�F<�w��u>�gҼ�R>Ùܼ/��=���=�n�=�;�=A�q>B=��=,,�E����|5>��#���>�P�=�󮽏3�=@v
=B��=�4=<���<eqֽ/tE�p���t�=�p%>@弍 f>�}W=H-�=7C��=�<���mހ�@����<|ĝ<As<>�<��m���A� �=�+a>��>6�M�[�6�F>Y=�[9�$T�<aL�=w���%�=�#>��=^��>�9>�L��EC4��?>��5r>+)�=�O�=7-=��׼��(��_L>o��� gO��d�= `�=b����u�?�����a����=/ۚ<T�����=�&���@м7OY�S彔�(>��4��M��$O�<v�>i =��A�#�+=
��.����<�*��=���=�Խ�Ṿ�s�����=�g=.7)>,��Z��e/��>C�=?�9<�XF���c����<�����q=�]�;�!1>w9�>�� �9. >�8>F<�=��Y:;(!>)Q9�5�>V뜻3������=�tg��+'���>i_T��2<>픻��R$�5� ����ּ*ϰ����<����k�=վ��� >1E�=�L�s��{�����i���$�2Y>Y>=��6>���>�(>�A$�D")=�<�Yd��c�a�U��= w�=��<�g>�.V��0����P�=���=|�<��e�΁�=!,�XU�x �"f�� ��>#3�f����@�E��;��2��~�S�=Mg�d����}���:=}���,�� >k�=Ba!>wB�=j���SV�=��<Y��;9I�@�˾��`>�@�>�P{=t�<_T��BwB�xT�<=l�=ˇ�W~O=�4���6��ۭ�=A� ����P]�G�^����=JT�髽��I>�3�=��Q�1[ �J��=�ѓ=@=g(����������hڽ�>�x3>.I>���T+���Vv=�ܼ�2��{�>-"y>�3>�|���ռ��_<�5=���;K����6��ֵ=�� �3�*� s}�?����$7>�K�=�$�=76G>�"q���w��օ<�3=tT>��&>�����l)�n�<`{S������!�b"�<�e=@-Y�QH�=� $>�� ��!.�#.��Y�=�-=R^��&.���5=�[����Y�\0p��_�<l�=�N��2d��ok��@��:�<+O4=�v=6'��6���սk�>&��6Eý(='Ē=�>�� >��=j �Y�u��\���`���=
��=i�?��Q�>3���w>� �9d>cӚ��dɽ���ٍ�= G>ɂH�c��=s��=�4�=Fב�ch�;ډ:=&�%���OV��z���.�=]�������^=�Eٻ�>�6�=����T�=u�F<��V> s�>}�����)�ӽ�pB�i�ֽ���;����K�<����J��=��>Y�S>��_=KH>�˽�̣���2�,�Y��
�=����.������I��0�<d �>�q'>z`���<K&�;)�u� �=�n���g��TwA�eG�=����_�>X�=t�=��><,�=]K�; .�>��Q= >���d>����n�4=�w>�,��h�J���p>�D��� >AL�<�n�ʻ�<��h=�� =\��>��t�>�p=���;���F�"9b>��<SQ�������{<�^ݼ����<�=>, >�U��û�K�=��[�V
��-�=���ܙ�"i�=]�������L>V��=����$@��3�=�"G��O�Q'��X<�r��aK>$�A���
��ҽu�M�e��=��>�/��)��Ɔ=n�5�g�>5(��-�=' > c&<�����\�Hi��Wq�<x��;��=ޯ4��fw>�d�=f��<�_ý�=To(<O�=������=&�>Я����=�+���$E>eY�nʽ�{�=ܴ�=]=�=�?<8U�;(+a=�b��`a�f[��pj[�ĚD<�Y�>�“�ՠX=����޾�=��޽!�{�t҆<��=t���p7��S淽im½?s��~ن�^�,�A��=X>��.��y��=/�h�h��=���=z>,)>0�~�G&�^�8���=��$����=�%>��>m9��I�Uh��7���Ȼ��q����=3�j>��="�/>� =q�'=��1�A�H=���=J�F>ĺJ�fˋ>�x����g=�n>�ِ=���d$��!T5��f>ֆ����=�p�<*|��8>ݑ3=��{=�'�<�f-=@8A�� W>1�/=�^P;>� >����K齖"���p�=%SJ>����:��;AO>�l�����>1���*�>򬞽&�=7dq� {�=��e<�:�<"F<>d��<���G��'��6������f�:>$�>�'�md�=���=J?~=7|#>�����a�=��+
�M�� &E��x�=4�˽b��;��=�80=�f�_ٽiג=c��j�<�7��h��x2�q��=�"+��6���v{;��,�B]i��3(>d�`��h|���4�b���V�`w;�X� =)$�=�Ry=7�-�B*�=��ڽ=Eɽ������=�f�Ou�ApH��
�=՘K���d�`�|lh=�k�<m�A>�h$�{^�>A�-=N�4>⃏��WX�l�.<\�?�U=���>�b��|{����<>T@�;�x�=R'�S��<�� >&Fx<���=���>�:߽�DG�E�����K�r�`�]��=��=4��=��C�V@w=ݖҽ�U���9��4��<@ =b(�=��D����=[`�=��1='�N=���=���>{E��M⼱f�=5�H�.���M˽dZ_�__�<BV�<�g��N�=�u��F��=�8���<u`��k�� �źOF=���<��\���r<4��<cU����=HѼ����=e��?��<���=�W�=�Œ�M�%�������+����=�o��X�Y�ؤY=��3��Fg;�{�=K��)> �d�_�Ӽ�I|>a{d=N�[��;>��(>�=
�=�w!���U�����OL��b5��!`�6>?�W>ѳ=�<��]E�k��=�@�"�g=C^��1��;��p�L�����<���i�<����<ך�u`�W1�=����c��)���#0a���R�HK�=��=�eU<�B%>2������[�<;Ex�M�I;��5�*�;=���=���l#7<,��z팾�f4�w��=���=��5=յ =?�e=�>mԻ��s���^h�<�=���<�谽Q�=��ӽ�a/��R'��T7����C3K�����㥽��=��E=1���<���U�=ʐf��U�<��=\��/8�<��3�P� �r�i>s����>� =��F�|y�>g�9�.>딃������ҽ���= Ž�/�>�B2�^-�=�7�U?�=���;�� �*�;n)N>�<={�9=z�"=ѣ��wTi�Ȃ�=ݝ=�> Q�=�=k��%�$��NI= ׼y��=�q�<��/>T ��"=���=��Z��>.�_�f=�U[���=������=�^׽D�Ҽ� ="��=�m��A�=��%��E=d ���Jj>^H���oJ�9�=�&��y�=6�H��}�=�1�!�J>3���!��i!/�.�=>�]>�p�=�a>��Z�ڡ���� >���;^A}�F���"�;���!�=�!.>�����;�>��.W�;��=W`->Il�<��Z>�
�<�l�;y�q����
���J,�=a���� m=��=�d]�����N��z<`ٹ�Z�����͓;<��+����<�{�=�N6=�
>52�$�v�����R��}�==�K->p#��ڽ��=gv&=��=�=>�z��15$�>Ɉ����V�>)�E��=� �= J���k)>� ��x���2?�����7v=�׬=�+>�+�<~43=�ٽ��\��o;�R��I�>�P��#>�0
<P�!>(�.<%�a=-5�e�d>���=��񽍲S��]%��[��?�����n:�v�=x/�:�~@� ���s�=����<c;GŹ>�0>a9Q�1'�>-y
�Zh����g�T>��U�� ���‰=ɬ��C�=��);�u��N��eՉ>-m��xP;���=>��=K�A>�->(�9�� ,��ߥ=�P�=.�=�Y�=kݒ�'��<RS��!�}�����훻8^���h����H�R$��L�=�/½�����>H�q=gXp=�o��� >տ�=�{�=�"�<w�=j
�g��=��=�/�=��ڽ'v� 㛾ݟ˼���=[M��D��=@<,>Iռ�W�=�� ��w���`�3� =�T>�=�v�=Y蕽� ¼��d�Ͻ�GP��k�������}�]"�=�=��n�=����ȶ�=�+X=Vfp��x1�+H]>j$�~g>=�n޽�E>q�>Ix0��彗��=�m>�Z�=EmD=*��=��_>�Y:>�m�=:I)�2�=?��>�e�<v�=p���u}�k%�=�3>$� �dʃ��8H<v��= kͽF0�=�0}>��>��1�;�=&�F>,F}=�Q��3<a<>�*4<1=>���;S�>j`�=�!�z7 >g�=�) � ��=4�<\1�z��V>�O��c �\�=h��_���t/=�Db��ҽ���>r��;�>�A�;������<��S=�7�=�������: 6Q=�<D��U>\�Y���2�S-">.Kz>=�Լ <C�_'�=1��:y�Լnh(��O���-�OH�PӽR���K�(>[��U�3���� 5<���<�QX>�� �7����>��%�e0�M�ͽ���=r���^n<��=ʡ������0 D=�~��Z���
����B���,�����K-=�n4=;�8�U>}˽�b=>�"��(;=w�h�0�>���<����R��vO����=�5=�g��N�.� =y)=[u>�������D�k�L�=>>[2����<��'�hg��b��B�>�v��ގ��.]Z=��<����>̑�=���r!�=%�;7o��-*2���:�N^�*q�=x�=N�����ۀ>�W��=֒��:K1=�k">r%�;������=�:=�J.=f�(>i9=^8>k����=��'>�>C>��#�|�� �I>zi=
���F� �8+�=� !�z�!<�׹���)�\�ϼ4�<��S=x">�k>���xƽ���>�|$=wG��jvн�S�>/4����ڜC�M�m�ѽ�Ǵ��,��J߼L�����=ۧ�<^`6�/T!�A'>/�=d����h��<� O>���=F�=���<�Zs>�D><�5m��- >���A>�^%�N�>l�:=%8^>wO켌 ����=�s�>�΁=?��=.��+��<P�=U4D>&�/�ͽ��[Rf����=�R����=���}�==]�����=��=���{��=����Yf;���>�V�;v>��8>�p���3>�&#>�*�=�K=:NW��W8�/�>�>=8!��T�b=�� =� ;�kB=n�|�b�����sxýնE�Nʐ=�������=/Oȼ���=6�>�=4e<�8O��2�<�ɏ<�:
��$ >��=���9M�9*����{�]?D=��>V�Žwd�=�+��O��<p3��G�>���= ���z��=f��gC����=V.i���`�!�T�;��-<lӗ<&-�=#��=� >Wǒ>��{��_����ɽ�hi>��P>K
�<�,=�ư�T~=ݓ����=k2ѻ�N�-���� >7!t=���k��;4��=hE�������� >.\:>�S=�˽��h�qP���+����g��?���+��;���m��=��¡=i�N=U ���{=����;>Zv�C��`=_���LW <.���~ ;J�4��p��) �d@>�j�<�s��k=�/�<i� >=��m�k�7��.2�˕�:"Q�� �M>�.P�t��=]��>��9=븃�4�M>S��?���f�=���U-]>1w���t�Q�$>��=�!n>�o��Ν�ie,�,�,��� ��y���� =yf�<d]&>�4�=�! >� M>&}�<���=v�J�̿9>Pf6�����-���_�{I��<P���� =��*>�.,��~B=�6�=��׽`$>T.->9��=��I>�Գ<��y����P��=޿U�e�m=���>����A�=U����=��>?�����>�x�>=7.�;6廿?�<�����������>�?���*����=�����Y��w= N۽��>��3>*�>J%��S��{>��B�P�d=�d�<�}���A�=��9=X,�0��=[=�s���|�^��&���A�<��=��>1졽%��w�*<�B.��+�=�$�����;h�(��k���="E����>%�5�6�����㽯R�������^`<���;�m��L�ٶ|�wە�X<t�3�v<&�>��<������B=^�f�t��=�Ǟ=��ĺS6o=u�=�ܠ=*�����>`��>���<�K�>�7(��7�=�{p>G���s�=�XE���v�6���׋%�p�'>�^=���g>��.=1�w>�fE��2Ͻ^�v�-K-=�k�>��;�> $���=d��=#>�=�X���8�e���� >�x%>h ���9Ǣ�=� >�"<�h9�Ղ&= m�=���_��z�=����\�
��Eƽ�<=)�$��C|=��$>L��������N��4�
=�;>�e�=R�=�w ����b`�=K=<�3��i*����s�=�.�=�Jǽ۔��I�=��=]���<\*=�6�==�C�/����~��>��8�kEڽQ(伒4�<�H>)���6k�%��=�����#�=�[�����.�Y='�:��Vk=��=��=��o�o �����>m��G��<7���#�>i2>Y.7�sӠ�:n��>����F���U6B��'��6�~=Q[I��5������=(����[��2<&B>��<I>bQ"�"r<�{��n��=C ����V�}`�4.������gu�Y� �+$�Hи����=�J��
�=I),>�����~=<6>D�N>?1ýjr�= )�<�Ǹ����=�(�b�=��:=���/t��>)0���Ҍ=�y<�k=q���������=���;�;���<��[=�w>D�o=Qpo���)�������@�ĥ�����y �=Q$>�9;���<�Ѽ�w���.>��<He��]��ۥ�@��9��=�|�=k�`=��=y�M<��%=}����7>��Q�N=%>�a-�g�>:d�<��&���'�1��> N��*�>�T̼.<8>���u��<�T�>���=9�b���ּ����O&>���=#L1>3��=�>���=�M=���=��]ł�h����==�*>�����^^<X����2E�ۯ��ݸ<�OٽH���%�4�=��g�'�߻��=��>�v�=�El=�V5���<���< ��>x�=/���
5>^M=�Z�=9 ���� ��m���^��ҽTd��2�#f����9���A��ĽRB��a���j�^=�Y�.��=�=��ڈ�=�q�<��4�� ٽ� ���X�1�㼶��=��aUн�R=ɋ���'>u ����9I�=���<3�G��i-=�PN=�4�=8R�<k7�Ɋ=��%�%
�� R='����U=0��]��=T
F=:�=�� ��>m��[���X(�VV >L�O��>≪=�{��3���"��m��=��E>�{=���=8k�=��9��H���Ƽ ���Iν�>f�0��=/>�>���L�1��e&����
��=Wĥ���� fm�P-��k�>���=��V�M��E�)��Fi=$1
�Fl�=ܥ/=�e�8#<=+��> ��<�4��+�"=��*<�g�=@-U�*z>��N=�z��=�:��q��<!=��7.!6���N>$آ�*"<ȷ�>�龽���<{�,��|�y4�= ���D�lR5>���;GmX=�D�šٽ�P��w�,�)P�=�'�������M�=��=񒌽��ս��0=�y��ؐ>�V��� N=�@W��)q�����g��A6>�9\=�V>���<��6�i '�I@��Q�<���=�����dǽ��G��Rؽ��>&;�=���<�P�m�y�PǞ� ѽ?8��;伩;ؠ��;�=��Z��N���[#���=�@��jӽ�O�;�����F�=Z�����Z�<�����=�[O��O=��˽�`I�r(�=)��=+�c��� =�:|�1��<� Y=�c3>���<u|�`�E�N:=>%Y<�՟�(�<3u�İ:�gD�=��'�E!�թP��=���޽_����D�=��<���=��=?f7>ڗ�=�Ž��>=y����?��e�=Q�;�:V~>�^ϼ���g��=�}�<�(��#�=й0�B+�=��{=��==e��=�(μ+�P�0.<�j���r�)%��t�=q,�= �D>���<���M�н�:��r>B��{�<�����]>�&�=����|�_�;�%<� �����=��>���=�����+.�2�%=t�}>]<U�� A�6y��k.Z>��=�F ���Ͻl�o��y�<4��0A�Z �< "ּ���=�4 >[���}X�g�>_O�=��`�TJ�=G�~�������;�Fe�qƌ=�o >�E�<g�=�ݨ=��=�J@>�)��Ng����*�<�?ս�'���Ao¼N]��)\>�c>q=���N׽�+�����ٍ�a�5�X�F=�����������{�>�~D�[�=ͫ;>QT�2��=m�<W� >]H��Z��4��;�>�+>����ZD>Ǭr�緃=}�x>ێ�=p�/����k���|B��8��p>c'J�z��=
m�Z�o=V���z��,�B�y�<0�=��]�6{E��j�=y%�= IS>ƾ��q���:>������6E�����,n0�V0>C���L �=Uk�<5u=�� ="nI�m/�Im߽U����U ��o}ͽJ.#>K_���x�?�0>j�
>1o���R�=��n�?��Q�
�I���c{>�(<�Ƽ1*��pp_�p����lj= +�6��Q�
��F^�F��=s���S�<Z삽�� ����=ޏ��+�=�U��&B=� >$.�<}}�;/<��S��=}� ���ѽ:���:�3<6�'=2�= ��<���@3*��>Q>�!>�i�<"=B�V��h�=z�<�S���J>l����P1>UY>vW��4>����Nv�{+�H#���ٽ��k>�r=8ۦ�g>=b��h�=���j��5�p������j
>��<���=|8u�p����~����>G�=<%>��,�� =�R�!�����='����u=:tB�T��@==l��w�V�!�R��Uw���O�|��f�=(�<g�5�q=d�|��ʚ=}˓=�[����B��v�Ѽ�l#>��Խ�9&>��录ʽ|`=�S*�?V3�"?�%�*>G���U(���Jp=m�=x�p>��?�
�X��&�=%[�=�Ѵ<�\&�v�>�‚���=IƽHE�=�מ<��޼��8�y����^�=/PJ�u.l=F����?���a�<ԝ�=UUj�� P�1�.f}�O��� �@>ޡ��d��>\�< Δ�PD>)�>�7�;:��=b�=� ��pH!��B��1��������>�X�=�� >t�LNʼ��<)(�=��=>�5��h�<���;L �<E��<�}�yPA���z�|�_�)~�=`�y<AD�=��B���K=۸ ��n�=�����k�"��<�$D�T�h=�4��{ES<���=y�=>-�� "Z��� >Y�>Ԧӻ�n>*6��[=��� ~��ٽ�17�=�0�=R?0�t:=^�#�L��<*=,>#���ϝX>ԥͼ��S>0�m�k�(���>�q�� �=ǼV=,z4���;>m�=�M�>p�B=̯�=z�Q�+��=6 >
�޼� �=�(����<y �Gk=*�m>�#�=�
�=��=R�7��/ >�ye<���b3��!��Xڽ�J=@�=ij�1�q>$K��Fv�<-��=<�����^� >����=U(7=o�
�q�>i��=�3���|�W��<ۭ�d䨽���=8��o�ռ��B���?���(��=B�@����b�=�j;[ =�q�<)h�>�#�=t�J>8���=I� �������>$,=����C/L>���=�7 >?] �} _�w�,�O�<{_O�����s=<㟾9}⽍ C>i��=����J�=[K�=<Z=���<��=>e��]��9����Ն���0���N=rWm�uyE>)���\H=:Bӽ�/��&�>Bbh�~)��M�=��>d�j���.����=��=L��=�7���x0=�X
�#�}���ֽX���<��� �=�;a>�Y&>�������{���ً>�0a=E3��I���5y=rT��3�=c��=� R>��j<�`������S�=�9�=`-">*ƺ�Y�9�\m�d��Hk� L��� �>�;� o:��=G-��>⇘=E�߼�h)�!}<���k�=\Ƚ�B�=�v�����=ٞ���c����\�Dn�tr6>����E�_>J��=���=}ٽh�> Z>���=��4Ŝ���m>{�3> ��;��l��a�>���<Q*��U>&�Ok ��͞=T|�=� �=r�=�T>��ƃ>͸�;��>�����1�(�2=R �>���<�@��-�����>�n��0�4� ���yֻ�@�=��!>�'|=���=
J�<S�C�[Q�t1���f���~>�;ǽ�zJ���[���8�����������g}��I<=%Uؽ߾T>) ���E>��ý�^�=u(/���>䴡�,�<���=b��=�c>8��<�Z=��q<��A>��=5���`�=�L�=}c>ný�Z�;�};<�?>��=�Ob=��?>�N�=�[=Ϣ'>��� ^L�;H$�����=��]�r� �)�{�4�<O�м�"�=���h?����v=^�;n�G�ETb�W�������e=�Љ���=>��=�����h=L� >N�>Z�&>:��<�6�>JFx=��#�<iǜ=����1��������8���>��=4�½G�۽۷��>�>��l��ڲ�� >kٛ��`r�ﯖ<# =�P
�.���/ �=qZ%=kf�� ���$=w\=� ���\��$_�=����_��^��� >Т
=S�ͽ_��>�"�>u�q=D��ZY��A3�<�ND�a��<�t�=8oe�,����0��7��<��5����<R�%��L>���+I<� ˽1�$=�.̻q�d=��ϖ�=����k��=�Z��a��x����r=��ȺHy>!m->d{f<��>�+g�5��=��=0?ڽ�g<i^q����<�*5����'��<g�W�/ ���ٽ�?U>I����u>�� �G� ��d�r{�<��,��O�=�-�=|~
=�u>ja=���#S
=�g��w����>���<.�¼>��ݿ��%y<�m}�w��=��#���`��Z�<��=� �=��;�$e7>���=&��=���=f�J��(=kH=�ay=�������=/�=�G��Ǧ="���ۿ=ߗp�'�ڽ�#F=�7>
�O>C�����;�ث�n��Keػ�"<��@�X0��v>M��<�[��erg��$�:'jʼ�2���=�:>.L(=�<��$�qغ���g����=���;'΍<��G��h�����>]����I>A��>�ڶ=Il�w+)=[�3��<��4��25��o=>T�<�=6S��8�=1�ʽ_�7�����}����b>�ƽ�{?� �������=�� ��'Q>z�y>�0�>�<A>$D>�Pɽc�o�PW�=��B;a��<��d�+��=j"�=\Q�=�!��G ���>k��=1=ɍ��WD>���3�����'ʼ=2�1>��གྷ�=Ą�>�w2>ofѼ�gx��b >�y=��>��>��\�9V�1f���?=���J3>��p>�Tr=��� �N=�Δ=4�=5S���z�=?�C��`��!ن=����dC>sʽ��=�N���m��� ��� ����=�3����򽪗O=Ks�=�_���P�=C�4=��l<��G���F>0=Q��=�0�Y�=-�;��n"=��X��+�=4��<+;�=}K�=�[>M$�-C��6)���=��>@x���.>���D�;����=`D�1�=��< 0��a�=�/ݼ��=B�H=�^����ͼ���;=��=�|ؽ;\��A>}�=@s��tx�����E�,>'��=Tib��{m���/>�� >�0M>�FQ�˖m=�}�<�f�=�~}:0��Rq�"G�l{�=�ܽ����������Iw�<�L�~�F�C=6U/>l!�=Y�.<�)׽K�H�$�6=o�;��Ľ"�U>K޽�Ըl=S��=�u>�]�=������y�6�U�h>HTh�� M�����E:S��<��<n"A=��>t�>5�=>�>�6E=��>](���G�u���� ����>>2��>��ݼK���%W�=���F��=� ż�(޽�P�=��r>a>�=K�m���:�X;3�v=��b=�e �[ ��@�K���:�t�0=m #;�MY����:��>��J�Yw�i#Q�B0>t)�<~L�����<�K<�����w%�����<�E)=\3׽�Q�=t��>�>�=S=������>b6�<������>Ie�������X=���]�>2@�=>J�Ͻv‚�Y:Q��㣾�!�z/e�V��=9�]=�Lļ���;�]������5>)� �⃯>����l��� �8(�� �1.a>��g�2܀��3������n��u���p=�.��X���gE�*s:>��>�,>�-�=6�y���>Jyb=�<�T�=%N\=8���i�=q �v�Z�K��=�߽1J�2s�����= �y���=�!B=�W�=Ԫ>ǭ��nz<>y�7=0�X��[�=��!>��=���>��g�[�2��K*>
>Y>��/��~�=vk�=(<��=R��=��=*�A�� ������?<R,�=���=�$�@� =-��>���=���=��>���=�f��dZ�KG>Y�ʽPн�g!��zk�h�0�K��<FL��1�;��&�6�N>�2���������V��<�3ν�� ���|>�`=� C;?��(�=7Qn�9:���=+�1������+�=R��< ��MJ�>�B���f=_y�=�Ց�Ŗ�=�O:=6�S���=YR>���<���*�-�1����#���&���> ��= ,_��Gg�Z}�7
�> ��<g⑽��}=���<9�K>:=+��z2=E��=��=j�c=��A>�_>gÁ=Ƀ>�������=pء�R���`6=/�P�
��`4�=��A� �;�]
��b��Q�϶�<��A>T�=���炌��ݞ�D*G<��R=d#ܼ� >����>�=�����1�=[��^������<���$���=*F���z��~o� hڽ1�-�V���Nh��7�R���e >�R��<�3>"�� �.��r�;�LҼ9�=�7��-���v���nսCnE=�9����>.�A=��=P-M�\ ����=A���/�=�4���b=s;�=K�O=����M���3Fg���=�x�={�>b
��S��� >3�t�XD>�VY�T���=�v����=�T�< K�<+�޽�>9�>����٤>� ����Ⱦ �^��y��)��w�
���@=�����vI��`I>�G�=Q���qL����>И�d,�������(�:e�;sл�f�
�H�W�Z��=��=� �=�8�=�p�<3��� �=0���n#��_r��}�>!o4>|��x;>�R7=&E�/�[�oA��3=���`��h7>Gx�=VI���L�:�E>�1�פ�=�/=���=͸ֽ�g�*[�<%�>��=Ϛe�ng2�̽�=���}�Y�#h&��6Z>�W�Q ��>U��񉽉��>/�S=f�?>ۄ>��l��� >���=-݅�v�����</Y�=4��dr���敽}�=P�=!0��8{>Y`�� O=�b��i����;��
��:���v���w>[I�[��=*�Ǽ�#�;a���X��*�M~���c@����=iη=�9�=B�&�6ƒ=����qa��Đ>��p�?v�=xA�=��c��F >˽Fc�<H�?��4o=S���[�=B��=���h�� �Z��X��d}:�O_�3��q��=B_� �1=e���=0�<�:�p���J�������<>�>
���l�,>���=.�����>:�<�
���k>]��;%���������I�6��= ��r�=Ms߽���=$a����>~N��h�=�μ�_h>��$(� [�=V���U��v�0���f���Ƚ/�k�k�<�y�=�%6��Fb=���q`�<����t�0>t��c�:�#��=B�t=��=1�L����=`�<��=��:t:�<��,<�5U�&��=W��=;?(>k���[�I>|���|����!��k>`3 =H���f�w�~���9��4��= K���=���!>;�-�6`��/#>��>4"e��4=mX >��
��P>�]?���=�ʝ�ky�<٧$��al=G�=��2����=���=�^.>x:���w>Xk����=M�L���1���,'���
=���=�H�<ۏ���#��7ུJ�X�>�%��S.=�փ��3>�S0=�������ڍ;���='2�=���=�Rܼbؖ����
�<Q����.�<���=�nx�A�Ƽ�Ƚ2X�=N}����\���;> =�S4>��K>(�>3͉< ����(x�/>�������׭B�QD���Yc=�*B>����L$��A=1)>�x�=�;�>B<�<T>!�G�/�>3l��]|=��Q��Ǭ�I/>�*>[���gYM=�\��w��<�����>����=R� ����� ��=&G0:�v���C���I�I��=9F����]W�����:���%��Ϥ�=����<��/�\>]������\Y�O�˽����ߋl��]ʻ�ٽ���=�:�<�se>3�/>�!�<�ٶ>���|���ֽ[6_�|��=T��=V��=�}��>�# ��j���˽>8��m���������G����D:����[>0��= ̉={���ó��`�=N�R=޽<��s��W)>[/L�� μ�#���2{���i���=U�����c�z�bbM����:����A�$=��4�y+�� ��>X�.�<>
�j�O��=:tE>�?+>����R>��� �='�)<��|>v��h+�=o���hgx�]�����_�S��=������V�H&�=J�������g�=�4+�;=�u�=���=W&>�[�=��^����<�u���u�֬c��N ��6�;����=q#�<u�7=P%�>p��=#� ��J>�^��)4=<���=%��@�?> $=����wB���X=>��=y��<2ӽai>�R�����>r��=� ��)�=k���Z������E>�!��8i�=dV�H���3\>�͉=�����`��̩��ݥ=t���W�=������<��E>��8>�yn>�H^��+ �E�`<8�>��d>��S�2>��j�h��= ���41>*Ѹ=(W���D>�Y�;�ck�I��߃�;�ﰽ�_�ǚ\�f֘>�)�9�?�>��=[�g;�+�=ƵN>t���R��< �=� �NT">�z��S�>�"���+�=0�7>\�>h����$=����J�>NNj�HK^� ����(=B���:�=��3>�W7>�K=��9>��2>U�=�晾�0ཫ��=���$B�=sR�=�>��������O߼ �:�+�>��M=<� ��S���/-���%>櫖�0��=��<!��G�+>��=K��=�蒾nq�=-v=P(>Ϭ>F͙:$��=$ņ;Nށ�\��<?Ӫ=,��;ا��?��=���>� >j����֤����� ��=h%���=f���qt<���<=�W>~~�=�"��]Ѽ�y�=�o��ZE�� �<�.>��u�ν��Q<��f����p��>eW�}��=���s!����=0~@����=ܓ���+>�����nF>�w��{�(=��z=���˗�=��-><�lB>:p��ƙ>>܈>U`�=-?�`��J�,ͼ=���������y=H�����%>���������=� ��]p>��=��9�}�ڽ�Uh<7C�<��4<�~�=�mսSu���D|��*�=Q>Aw3�!r=��;�=��d��Hj��7.>đ�=u��<����K̆�A��ݵ/�PtO=� ��o�<��=;�S���r�x))������� =B<>��
>�U]�����~g�>���S������4��>׹�&L=Ll<>aV;���<�jJ��G��))> [��G�Q=|Q���у�u�:���_� >4�Ƚ�Q伪��<� O=��L=S����D�<v�� �V����Ԛ����9��!=D,4�f�h�!��=/+�=����Yr�{K���u޽� Z=�1#>s�T�Jhǽ�y�����@g��p`�=og=�=u =y�2>�&�=��s��_���]>�ƃ���]��2U�QMA��#���A�Ȟ�j�P>W�=������^>�=���=� ��o;��u��2��<���S{=�.�o
�A��= ���`��<���>��0>LF�=� =�(B��
#�y���1��y
q���=�'s>�
�)�?>� ���=DoX=��X>�>IJ>Fh�e �c�W�ʏ=�dx�k��=ߧ:��
�;jU�=�S=5��<�<:< �=��=G��=yJ%����R��=g��=�b<>�O����ֽDk��`!=.-I=���= e�=�Z8>Yh=x &��˱�k��#W�=� �>A����d^>��ýI�
� �:<��v=.�=?G�=�z�=�>6[@�,�ҽd�d=:�����=���<lfG>��{�=V>;;Z��=�) ������=����4���<���H]c���4=�<��e�K=zk�PA½�%=�0>�mE��Ͷ��>�]����;�{��T�=f�$>wp��Uy;+b�<�U뼀x�{N8>�{=�<��'����e�̜���8�dz�=:�������P\>���=\�=��-�b��=]q�<����'<��>�n���g����W=�,v�h����]<m�=Č㽵V��ܢ=����x��<���J�=Q����={1@�Mf=���=���*^�=�䟽8:0=����gV��N��>hp?=�
&>��@�zC�U�����ҽ�vh�377>��=I�_>�y���
<>o5�<��e��T�=,pN=���^*�,���D��=�h9x��c^&����=/�+=��u>��ʼ��=f���7KX>D庪���v�=�h4>,Q�=�s������m >s��f�3>̇��u �����<)!V>j~g�����D{W>����M��b"��ș=�V9=%�=�y�V��Mq�x!=+ ��xo��W潈A�=����r�W��A�=<��<;S�=���يo=]�]�(�%<d����'�k��=� �=��s���߽[[; �>���[=�l>o"�����>�!->�%�p�M������ ;��Zy�=g{=�>8˅=jF2�Y,��j��/�)�p���߽�|����=tXܽ.X>@#(��: ��t@�`銾&z7<�V>�U �~����=��=>��=/{Y;WP�=���П��,���K<�mP=UG�<f䌽R=H��;ݢ�=�q)�����g<��=m Ž��"�-=�r@����:���<���=�u�U�̼�k>=Rk���>쁢��G�=M��Q�@=e<$���l>$ս)%u��(�T�=�X�Kr�=B��=��1>�o����Ľ��1�� =�?��Sq>�‰:�r �~횽Z`>M]��\��C�W=�<�=$'��Z8<�!⽨b�;�U�=��q>�龽�>�X���2m= EP>��1����>G��\y�(8w���O=���=��=~l=3�C��Ъ=S�<�T>���=2#>G>K� X�0!�=����� >��9��H>.B�=2�1>�u�=3=�8x,�K�g= ����5>����n���-:���=�c�=)����c��������=�������1>R��=�&6�Sf�:������ >�6�F�i!�=�V<=R+�=
m�<�$���(�� k>؃�>:`/���<��4>�.��⮧�-�|�`>\�R=›2< l��2�G���=�Ǜ���ӽㅷ�o��=<�o=5�<���;�-��%y.��l�<�!����;)���~��9�=��=Nj-��u,=؂��`��=d�l=๺=��P>T K��g��w:���=�O��X*�'O�=962>9W=�m�=�(�;8��<�&d��r�=\��;,;���=$X'�����Z�8��=B5N>�o)>��t>>�����;0=�>�yj>�Dv<�,�=V� �'=6����-����=L(�FP)���=�a�=�3���/s=P9�=�I`���)�wWV=[�=�W[>9]�=�F����ʼ�$�>@�:>���=�ˏ�i�a����=?�O��6>�P��c u�aL9�fZɼ��-�:'���l/��
d�Q�Q�V�ѽ�s�=�(�<�)�=��Z>���=����SQ��*
>>NRz=�x��-��������4>���=�W.=߸�=D9~>���;Mj���1� >:�#=����uV�:��W>��0=����z]={�O;�+��v=��)>Ar �P�%<s"��y���;=M5>-2�<�ȫ���Y;��8�n�=r��=B��>�E1<�q�=n�ڽM�>^zU��A��)����'���>���>�G���=T�p=�0>�����R��K޽G�>P�9��)���<̺��l
�;�j޽���=��<��q>*wĽ�5���}E=6x�<��a���o���=[�=����!%>Hw�=3E�<���=G=�-U>����k��X��=�J���ɼ=� ������f0>�����3<=��<E� =�'>�[�=�>4�F> �x� 5����=�ƿ�����fL��Λ&=`�=|��=�H��,<�u���)9=m?�<�e�=�&=Զ�<�je�U�������a�=.}ݽ�Ʋ:-���Os��L�d�ֽ9�=�\U=TG˽�v�=����p��m���aK=�>�>W�J�g=�5�4<)>�����X�Y6]�;s����<� ;�b�ڼ�=…� ]U<0����ʪ=%�=E�<Q��>�����=T�6��=ܯ>Ȁ��\��->-�X��(=c�=AO�=؛|��2�e���9�����D�ܼ�ѽo�q� �p:��I=�Š<l���q��=�}�=[�,<��M>u���ua>�:>l3�=�&������p-=��B��ǁ��� �_�K=�w_�p�=�v߼����r�i>b'�Us0=) <=��=�eܽ��<���|ώ� [������b!��E�ۓ��q��J�<���-�ߑ�=W �؋ >Q.��R׽�
i>��'>VM�=$����8�� >ia�:��G��g�b�<�{ͽ- e����=��<�5��]&>��˽C����;>���>�|*�&�ҽM�x�Yt=�g��i):>G�Ὥ��>�S�=��^>��$��V8>*j�=����2�2�����=�bܽK#= �b�S��>���=)p�=�����+�ٿ=�f<����Q2��I�>��=P* >���;͗�<6@A>��>�c{�<��:񘢻�jA����<'M�=!�=�
m�!�<`�
>�c����d�Ӝ�(> �=xSĽ7:ݽ�G��_&Z���(=V>��Ƚ4n��p-�=�9Q�g�"<��+>+��<�ܯ����=6/����>n_(>�y�>�<B��<R�<���JhG>Y��ý�=���=��=�ѾS�V񣼶9K=)Z�=kN�=v,.>��>,��<%�*>���=#�p9�ች\��=�6y>c�G>� ������J�,�j�>:=�>=�F>��c��!>{ ��r=�B����=e��<�,j��� >V#���l >(>t�_=�Ş��R �� =Y���Z�Žs)��:"�޽�;j@���Ɖ<�1���~='�=�4�u��<�<x���>���=�C�;�
O; �=�aj>��>�����q>zU�D���F�=xX}=%᰼��
>�Tx���I=Z��<��K<8(��=S���sƻ6��=k�>�D�=p�=�n�;�d���K<!8d=q�>Q� >���)��=��G�o?�=��n��>��S=�B���,��͊��D���WH��.Ѡ��m�NR,�-�=Caн�ω=��>IY�<\,��Sѩ=g�����w<z=eR#=���<w���U=;"���B=�T�>�< ˜>����C�<!�>U_M=����s����r�Ma>�3�;���.����t���=�8�:����<8
m>�!ͽ�%>tr��T�=�` =�HA>P=9=�ּY�ի�;�� ��[o�P�3>Y"^>�(��y[<ٲ#>���>��껺؅<�2�<v��=��������� �t=tYh�c�/�����݉
>o�ؽ,j��Q�5��q�=t�b�y�;>k��Hq��b�x= �K>��>D-�V�%>~}�=�jνv�a�d���0��'�=�X�<}����d|<�H>���=N�;|=i%=��>o���mA��=Τ�r��<��=9Y�k�K>��>̞ν���<�HA>QĂ>=�Ѿoⲽ����S\< �_��{>�0���k�q��=��;��Z>9�T>�Y�ϗ̽Ԏ����9�+��x 9�:��M.��2D<�<J>~�<�H�<����K;���������=����Ϛ=.�>��<�;�.����=p5�=�?�����=�~�= � ���>eb�=c&� �������>6�Խ��k��6�RV�p=��h>�p>F�D= �#>F3�<������I���:�5B=3��-Κ�o�<s�;<MJ+�s_ �R�����<����(�=�gH������56=ԭ=��r=���:z����ڽ�:��9{�=:%>>�{�=9�ν_��=���= �=��P�Q�=�޽�[>�13>~[���Q��!�= �J=�r��ΘF=��`>)i½c���&O����=�/>��`>O뼿����{W>�=sr뽐y%��.;���:�UTO:%� >�̲�N<B=F�>wPQ<,����p[>�dt�􎧼54�=o=���㽯x�=�����a=Pc���>��=��:>�7�=�h���YR�<Hh�����=�� ��a=�) ><�&>���@�>�w=��1��_> ��=��={���>H�I>��\�N�M>X��e3�q}�}tн�mh��*��޼�=ݨ;���=��M�.lG>L��ٷ>]c��O�=� �<|�ýZݽ��>�A>o��ޒP�����*-=��r��'P>&�?<[�=_��=�7�<f$��-�>%C>����v�H>�7�=�Zx=�j>���:�����T�;s:��Ke�<o�Q� ���Anr���G��� ��4�=�]@�aN_>�MͽȆ�=ϕ��$ҡ=�T[>�tk�J9��W>�Y˽f.>>��<���u<��2>�����K���ּ��E<D4A<}�L���%>iRֽ|����)>�t�=��\�+�>�6�>��>?��=�9*�l]�<�ww�����j��=��� >�=~��:�sa=��s>v�(�<x��2n����� �=��,>UiB=�$ ���(�S�:��(�̗A�OVO=�'�>����3��v=7%�<������b=�A~=�q9;�j��&�O�8��=Cr\<z�� 8�=R{�k��>sL�=�4<1v߽i��=�ߞ��������=�)����<s �=o��k��(*>ee�;0sK���=��>���K��;�u��67]>�zF��h㽴:>�Ƚ��>]c��%��� Ov����=E�k=��#K>:W=|z��#ʾ��R=�g_>$,�=�=R�0�m��=BSg=[�5���>�'��
�/���<��5>[���bս�$>8�J>+�����=����=-���s�I2�=䄪�ۙ�=���>��.�B�=�!�=�����/Q>�1�:�ν�ۧ>�`�~�=������K�����E-������@��v�����N<ʁ�z����(�䷔>�j��۰�<tՈ=?�><���'�6>;�Y=iY���T=�m�Vc=)y}���>��[>Dh�^��ڊ<n妽��U�w ������u��=�/j�%
���ݼ�C@=~�9Z���i)>�̰�ɍe>��=L�.>s�Ќ�='7�=5�<Wܻn�/>�UE�s$νFt�B� �J��==DQ��Dh=�<m=8C�]gp;�u��� ����=�sX=q��7��a6��JH>�~6>��a=@W= �;=��ɻ�<���]>Z5��F��=�~�=a���F�=�>��DD�<�������;x����)X���L>&\G>L�B�c�A�ӥ��M�=B.����>`�>��U>D
�=׻׼�Zݽ���2|�����2�<��S��GR>� =v8��ǀ�}�>�ᴽ< :<!��=NB�=�|�=���>���=�w >�˻;���=�/��]=\˽�G�AP�����sU=�a>g|n<N�O>6H>˼����нS�=��?<%k�E{�<N�m����B�v>��</=�>/=��w<�f�=�VD=�g��b�8>/�1��љ�"F1��L ���>:f低�9>1�n=~ H<=��@H�:�� �Pv���F=.E�|�>7� ��>}p,�l8���ȴ<�B<=�����ļ>㤻L���8q�c���l6�=]�#�7)�=b�<���=%\V=���=Yea='�+=�����z�M`i�
��
Q�=�k ����=A0=�+=q�j�Fh弊A�=pե�@3A��-J>L©�I��=e4�� %��9��=��6���<[�X��1
�L��;���<d@>>uҷ�*->DL��?]&>ٮg>h����^����<�V>�=�Da��ʌ=��t�I�����;���z�<��<��-�8�1>��1����=C>{�g>)����=��R>�/a��)�=~++=��&<���= 1:;i�I���=z1�=C��=��=�"
>?�>�A�B/<-��=�F��<|��N=<��� ���yw�hU�=���=qWF>4�H��%P�ri@=������Ma��y>�B=N-�R�o=�۬=��D�<t�=h���QJ�=Dd��̄��8�B>�3�<-I)�� ���
>�V=�����ܼ�ߗ� @�=�h�� %"=eKý��=��������}G>�Yf����H>%��l�>8m<�����ƾ=� '>������==���z��⦆��=��$>N�=����I��� #)���
=0�>��d=(�<j0=���>��=o>� �=s�x>� �� �>�7��=�*`�,Q��.�;��y�8}\�Q��<(����V � ���: y�S�ʽ��=&�P��)>Y.�=���o�"��[������ˮ<_�����B�j7;�h�=���Q.;=��=��!=��8� 2���y�=� ��,��<羽B=sj%>�/>!�3�Gy=\��=B�½`㝾�_���<�� ��|>>�ͽ�[>��"=D�z>����̅4�|{�����h.B>�B=�>�>� >� U=>�������\=�c��o��=�]<��h����=�5��Z���󖗽���Β*�e�>K�����:l���e=v�I�1��=e᣽�э������r �ÿ����<�P�=d��=�@�<,�]=�fW=���=%Ah�C�оΕ�=�h���/m���%=�t>>�����->�>��->���=��@>6���=j��q�<O��<gF��{|\=ʄU��;�����=�F��n�Ž)���۰�;)��=�Q�=�nj<Ûνd�iZ���{�����������= T�< q���6e<�2�=��=<T���J�� ������oA���.=��=�r�<��>;��$���=�|<=�=!�=�c=1ە��ɍ>��R����=���<�NE�zܛ����=$ܶ��X�<DM�<p�4;d󨽰m轨�L>A* ���=�}>���=NI��T$��߽ �׽�U<c �=�=��������@;��=�� �t�K>���=)��;���9v7o�ZZ>>$&��5u���K>�(�����R����
���(]>E� <`K�>v�����<>ez�;��&<�DJ�"(9�J����k�d�,>gٽ*�<҆�=1,d��}� ��<C�Խ��=��x=�Ѵ����<���;����v�;N�<�A'>�Hw����=�t4��A�=1p=J����7=�
���=�Q(�V��=%K��Τ=u�=�3�˰]��}�=d�=�'ּ�����n=���=>�zp��a�u�>��u=B���� �A��=w�=u��=�П=�3�=S��=��=���=#�>� >��;@H��r�S��=]r}�V��=o7�=�z|=��=Ώ=@��=Y[>C��{-=�A>�J=���<N>�ے�pYg���<�� ���u�(�=j��F�Y=Gq�<�����8e< a�&Ŭ>�����<�=Iƒ��|>C}�<\�,�Υ ��膽�K4��6�=�El>�u�<�`G>��=��`=?�0��q�V~�=��ܽ�q3>4k(>e��;9�����=��f<w��<�y�=��ł�,��<��*>�ؽ�9]<�U�{/;>�N<� z=��=>(����SH<��8�gT=>ɗ
�V��x����-;��@>�lH������U=��½��<��>/�2= J�]���A���>��w��y�;�=*3e;����;�1>N�<����W��|���"� :��u�>��Z=���զ
��Ԅ��-=��z�
H�'�=s��</��?I�<"��=�!U=��>�9�=[�0=��9�UlӼ�t�=�*���g���$�ʰ�sDx<I�U>2����=A��;%>"����d�3<*=��&��q,>�KQ��������Þ9��d=�ͽ�U[=,=�Ŭ>u˴=�>m����5S<1�伶�S=-E8>��
=�;=:�b��n��
��x����U��!9`���=�c?���X>�,�=�i@>�Z��,���`���P��P�E=s��<�� >�->�8K�b^�<��꽳�[>Ï���M=v�P=��񽈏 ���E<�L�����=��5;��>���=�������=VAB��+-�]\?���P�y��>I�=�đ���K��]����o>�c���� ����=]�>�(>�A���c<����n��HZ�<3->&3��\�<F2q��]f��N >���;��=���<`���* �<�z�=�>o����$�ʫ�� b�؄i=AC>�BG� ���܅�<߀*;7L�=!��=n���t�\=�PU<���<Cd�=(ӹ��#��2���'_=҃B=W[���(=}n�6�:�M6 �yx�=����d�<
�=�l�=����e�Ӽ��&>Y����=��}�����>_s'�3�z��ƼA=#���>d���.�<N����\�>�…=���d��<P���^$ϽW��=��
���<bf��:�=W���'������%k����=;A��B�=�ݒ�����Uh��`�� ��=Z�<�M9�KH >�T"��x����^ ���� ]<�rM=b��]�=�� �-���ƃ�!�H9C0��ey����<���=�c��J= ��g;��W3 >t��x��=����~h�=��.��5=+ �=����5>#ɨ��l=&��=��,=���;Q��[�=�>6�(�X�Xn�����U3>�p��yp���}�.��0>w3�Y�p�#��f�=՘����7<���=g9o>}�@>� �=du��k�<�G�=q,�� ���ak>����v��}O>�o��}S�
�޽�Ɍ>����F?>ʽ8>>6�=��=�SA��Ų��̫�*t��P��u�>+�M��=��P�Q��� >B!���=�= �ݽCk+�C�M��.>]��= >=-f�����=�c��b����m�=�Ƚޅ>��2���L��h�=�b�=���_����`����_<M��<BU���݀>jpؼ
��=�I�=}-p��{��z=��5� �N�J����G.�-��)��l=.g>�v=,�b=.z?�b�+�:��y�=�uJ��ͻ=|�F���*>�������=��r=�`6���=訽EK��I��o�=e国 ���=��ؽ �>���;�G<~��>|���[x���%P�ٚ =ܵ�^�->&.Ľ������=��z��#>��8�����U>b%7>�����+<ᑯ�Y������<���>�ES>N���0;~g=N��=#� ���T����'/�1��UD>�(S=a��=��=|*ӽǁ,��=�=X��<<��=�D>>�";�+�%��=j��<|� �T���G
N=�ʥ�$��=�<��A�<b����77�{��<GR���Z>������ >����v_>.b�͕�=�1�==���c;>~p >"�/�RU�=S]>�� ��m=�v=�W2�QN>g/y=m�U�h��;�7>z^h=�������=a�>Ys�>��ڽX��=G71=�N4>���= >�.=���=_���gW�ɽr�>N�½1T=$�8�s�e�<dĿ��)�=2%g;�Gt�̑�=w���{x���V>�Ũ<6a����:6�V=wF�=��ϻ��7荽�!p>{S<���=��~��f7>�ɉ>�{Ƚ��� j�=��S>h�<�>$ν9��<�ϓ��+> �+>SK�=���<SX>)����������=h���E�ݺp�*<���>q�c=p���O��z����4���=��"�8��(�<Zo>�f��|>�f��V� � 1>�j;��Ҽb�=�<J�G=�E�ǧq<���_��o<�>�-��3}�<�G��[<�<m'н֬-=l�>8�7<D�罡Y=�7��M�L=�4R�~�}>��G�O��=٠�>E���9�d��a�=�E��V{>���G}�=������O�$��2 >H������;���=��xѽ�Ool�pkH<��><&���x���!�=���̬��'�<�#>�YE=hR���� ��x�<ĦW>n0=/��=W���. >�� �\�½�>�=֥J>:BǽNS߼�h�>����K��s6���S�>���=(����P��t�=�u>5� <1a��ז]=$>l==H��=>�j>��W���f=��J�X�O>?1<�yP>d��;�Ł=>�=�:>.;d��<x��=@�5>C�ּ#�7�-���==(��=o6�<u���z);jR���
>V��=�஽l==<���=o�=>\�P>T�b�<��Y� ����Z>O23;���=��Y�aт='��=>����ށ=\����w�=�W޽qn=)�@>\r$�
P>�S*����<M~�=Y�(�S�ϽK���-˻^߽�:5=v =�} �@엽,ȹ�����R �=[�z>Me =:ڠ�gt�G���:>�?���t�<X�[��Y����=��=m�=�Y���(=�*U��"8=� ��;��L�=��!=)����K�����GJ�=d'����m�ԑ�=@|n�uҼ�<���Pu=k\=^��3�6>�N���(�
+�Z�m=����t���%$=�,��n)>H��:9*}��X>(�=��%>���h�=,
н$5>�W >��>搾�¿����;�d�;�� <�%�
�$>+E+=��i�v�ƽv�߻��t=H����=@D5<�b��K�>w=�N�b�1��\�=�
����mq�,�I<���<d�P=�<��4:��1ܕ�l��^�G>H��=Ef�=��=�~*>�SU��uҽ�5��>�'�����a�<�Is�n�3>�䚼_V�=b��h��=0(��Q�D��}>�t��=���#����Ϝ>ԏN=u�=i�d=�˼�����μ��.�lE|=�D�
r��b�Y�?>N;�O��=K�|=n��ͽ�
>���={� �;�=W�>y>�F��r����=��>�ʋ<� ��_�<`i�U �=0��>��
=��3�f<�>�-B�%�E�7�=��ҽ����$e-�\����>�G��ý��6>�'�=)6�<��ʽ��=��g<�����0=�����UR>W 3��0
�zO�=P =�xJ�&^�=���#�p�<(�=�� �Aj��O&<r�>R�,>�B>�r�=~�`>WgҼ���i >�s�<&����������<���:��R�AgK<��=l8���鼮����c=<� <>d>��u>�����!z�7�`>@OZ������A=-<'>8$��y�=�N�=���;�� �ƻ�Y�=���=� �Y�8�1b��G�μm� >hų<8H�6�U�o��=+��=t�M�R�:�r���[�=���:Vh��닽p��l=�Nt=�|Ľuw�29>�>�#ۼ$|���>�<�\��n�c=)f�=��<�~a�TY� �$��%X=��>����1[f�noU�;}�)Տ=>v���� >ܫ��M��<Q"��l���^��=z��<s=>a���Fٽ/
��`�h-�=���<4�B���w�ҨL����>*�=��p��V�=��5>�<���������xS�=���A >���>�oN>A{�=��@�kq���N��=���=��z�ꝼ���=��;���1<bh�����s�ɽf8!� ��=�轴�>�9�=q )���B:��~<��Ƚyk�<$AӼ�&>���=��G�E6$����Z��<��K��� >������m=R[>#���}�����;�6_��� N=��=:����g�=���<_��=� ���Y=����z�<k񽵶$�G�����*ꗽ�f�=���=,`�� =/��>�$���*���0���t!=*��=�*{>8���>C���(�J�߼c�=��ݽ�A���v/>3tu�c|�xq�=��<=�kB=��= �->���=�>�����R=
��=f�v�X?>}Ve�Ҟ�j�Z=���ȉ>r��=S^G���=_Iq=sfQ>�^��__����<{>m��<��.>�K�="=@$�=,?>�t�=+g<�X��Drݽv
�<Fom��-����k<~K�]��j �=ޕ��|s\�r|*����<�j�=)���$)�Ϛ�<ta��+{>y���Q�o ��2A��{M�qŃ>�Z�=��׽C]�=�����b>��>a�(�Q��=j��-.Q<FbS=��E�" >�I��
ȩ�R����6��/}�<���M������;d��f�6<�;h>>�o>��<�+�������<R�<��X���=UW=�Z��c���|X&��/H>>��=ƻ���[�K�!�P4��C��p��=�w=UŔ��:�<А=<�N>�&w�ު�=�2��7<���=t:=K �= 5�<��.=d�"���>� 4�C�/;�j >VTK��Q;=f�(��lb��.=Hq3���>���<�~T�Y��<W�>����ə��ȵ=@�c�>��0=����r>Ƃ�>J90�#"�<�S�=���>)��=M
=�� >�f��B��=Ț�8=����5�eg=I� >�ɽ���=�9>e�m>.�2'����=��>��<�]���.�:��н���=����z��<�V+>�(=��P=�T����ʻ �ؽ�->�֠<b3�=����T<h��ٽK]�<#M/��S���� �\KK�8�ּm&��>�������tc���b����=�h�=#�1��'�=� d�'�A���=�F.�r�j=_Ks��w�T�
��:�>�x�2/=���к9�;���<�&!��UZ<�ݽ�
>�����D��Lj0<��չ��8=_6W>P��>�����e �V1c=,U�<'��< �����'��k'>���=Y�=;<��2>���=����6�н}<ؽ4�>�.A>��0>�'�q=���5�_i7>�7����ý���< �'<�S��v�@���`�����^�=�%�=��=���=D��>N��\/=�Ѭ
���=>]�=�sL�=�d�>{).=԰c��X>d7�> O2>ⶽ�����N:>g�E<l�/�~��+[��w��\��<}qI=�l>O�v���-�-�-�F�<�P&>��>g5�={1>��= �6:�� ����~���=����������7>� B�=j%(>�O�=����p��>�k:�5��<��=H��Z\#=���=,� >H,�=W�J=�Z���=fp>�c�=�?F=�쎾��G>�E�=�����>>���=��>!J����8<�Ł=��߽Յ >^>��W>YU ���t�YD߽O>���=Y��=]��=�`J��˸���j=���<<��>5>h=��=25��49���Z�=��,��$0>��6>�Ë�S|;�̿=���=�=b�-��7�<��>�;=}��;X1�@��;�����=v ����=N��=2�»AN����*��=�'ļ�ב�~󶽌�[>渮���]�*z ��j�=q 9>7�=b�s�6]��Y�ֻ��=�Ú���ҽ�=�`=2���^�Ƚ���8_��=ϣ=�B���]
;�(�=��=#]���($��D�=�m��7� >]nP<lF:���-=*��>]�<�GS>�b�=���<F���dnB���1�N�
�����(Y��Tm=���=��5>.\�;��6��e=���=�ۺ�?���2k�=�mj�`S���ܼl���"A������s��$ >��+�b=}�a��2>���=l:=���B��#�<o(@>�gQ�����>\��"�=�ɇ�;n��=���="�q������ؽ�6�=]�r��o �Q/۽Q�w=��'���E>V�;� >��L�o˽z�ƽǚk����=����ߐf� T?��=j�P�e�=��=�:��_���&�֮��>Խ���yx���Ɛ��_���4>ܽ�����=(�=Н�>I�>�ſ��1 �vy>r4�����g~���/�>=A>X�s=�U;>V�(��e>w��e�F>!����<Ҕ=%F��w>X֠��F1�a.���<��d���=�S�= o>"�L������7��"Z�Z<���=熋�׽G���0�so�� �=Yэ=쩧<WK=B��<�S��K�X>ή�=�Z(>I>R\�|>�)G>��������.��D�=DO�����Q�z=6P�=iռ���">�I��T=]޼���<
��;':FE/�lz��3� �VC��彬� �1���ƿ=�5A>�g�=��ڼħ�=����ڦQ>�s�=z'>�>���>��e=�<M�����q==�ɼN�$=��t=y���1���������-
�²���=]z�=<S)�˲=��;�&���Io�mx����=��=���=\3>ҡ3���]��R#�I��=�w�=�*"�v?H��P>�pg��뽼�����=�O<��=�o�>}��<wy;S� =���� ����}�om��el;��V���;����>�����)��*�K>���(�n;��A� ^m���:�Ѵ =����[l=ٸ�=2���
�;=�+=������<������9��s=!߉�!/��q6/>�v'����� �0�d�˽�" =�b��W��;C"�=�Ɖ>K~~>a��� �����=B6�=��K=��ػ�T�90 ��[r��L��`I,>Ȇ6>\\�}�/>R�����>(1轞��=>� � g=��~��Z�>�J;1�����O=Z��1Q�T�T��+���d`�纃=�&�=
������}���� �<ں�=:�>!3~���7>ӂ(=���\
�;��^>�=��>l��=_��=��n=�>��\x={��=�X>(F>���W!O>*�Q�Ŀ=�A1�R03>�`>��U�U�|>�U:>^->{�0>Ey��ƹ.�� ���UL��
G>�����!P>e��<U��=��h��������?L��n���)>� >��=�Q�<��(=Z��= ����>���<늪�C1>�<�͍>�LZ>ې;�n(:�I̽(ۂ�2%��ܭ����d<�Z�={Ǩ�kS���>ʍ��VDK<��=�d�<$#=��=l�1>F��=?6=��[�+�Ex���+�=L�{j��Ә�=���<|ZռKჽ�Ҟ>� ͼ�+F>��ͽ���=C�0��ֻm�ӽ�D������>�6����{�3����� ��=��e�z:�=-*9>N�<���� �1=� �=2E�=h�X>��` ���#n>�[n>CB�=�[`=�#�:z�7>3�=(���=��=�����WP��P���tG>�U����>�r�=NAM>>/e���<�L�=��<V�@������*>����:��w9=��J�r~ =H�p���?>��<����6b����~=t��|
W>�B{��+���u�󴽧���C�I��S_>μ&��"��`�>P>��Ax:<"�=�Ã=U���%ݿ>�D�<yQ����ؽ��X�e�=��M=����w0�=�.m=(�k>T(>9�=k�[�F+�3����=h�=ES=S0>kc�>�L���R���Z�u�w=��:>�܁�j�2=c �����=W�U`=�??�ף�_�f=��ҽ"�����= ���$>l�ڽ���=�$���p
>ȋʽ^�v�����ӿ=�,:=m&7�$SG<$���>�D=��=Z��'�r=)K��)A=��=����P���;�ݔ���`�Kx��m�d�Ul�=���;jR�Y|�=�������=ؔɽ�.�=��=dv,=�Җ>l8H<f�f;�F�=��/>&��<l>�O>=���<|O>��ͻ}��_���v�)>��ݽ��*:�:R>pdӽ��=zvͽ���=�OP=���=��۽о!=c �Ew�=[G�=���K��=�F�$�˼�z�X�%>���<���>b���$��<��k�k >Ǿ�<ʜ���$���o�[
>3���F.>4}�=�Z���>�r�=�j>�*/� A�>������>����j�:>y�I=���u�C�3ٗ= CE>�0<=�s���ع� ���'>��Z���h>�����=�V�"�<��,����;֛!���M>Ҁ�>x��>|.>�a����I�A@��#!�N|��2� >Gb>i�&�z�=��9=��>�U�=m^Ծ�'��I�T�i��=+Z@<G�ǁ�=a >=,���1 ���c>�՘�������>)Ij>O�g���Խ}|F��%����>š��ڷ���e�� ��ڰ�<���>V[�=�l�u)��:���㽆=�5�=��=�k4>��=cgv<+�-=���{�k<�M4��<x�@�5�m=�F�=�0=�佐�ü��;�!�u��<+�N<��$>yQ轭�$���<�����齑�,�aM��W�>c���c��_��^��[�¼<4*>+/�����<�i��ϣ�<Fb�<��>1�u<'份 ȉ;C>=+�>��>��>:R/>� =�0h��Ν��齧��=P���CZ=�i�=;�"��r=W��=����[λ<$��� >_݇�, �;�0�����'���i>Z����N�m�G=ľN>�+]�r7��u���9�\=��u��>����c����<��k>B4>_k�>�,W<������ �#�6���;ij$=�I5����=)�.��H>�"!>�᲼��>�(x��Z������w�W��lΕ=��=���=�����G�=�x���-%���󽇮]�l�4>E����h<71)�����S�<0��bV&��"�=)�R;��?�0��'V=����W6>TI2>�-�=��<��=���<��4=o�󽻟f>7�����1>�x�<�n=�!���� >#e7���q�Oǡ���=��l�ߍ�=2��<�c��*r�}F��d�>�}N>&�l=�l��0��>���=������=R|�<�>+���n<f���">�t�:�>�� ���>�`�=�?d��̽v+��N?<g�S;��`=��䷽;@6��x�= �.����<2;L��;��
��F�����=h-<>A�n��5=ަ��'���)�r�y`=�-a�-�T��E ��^�;dQ=ĩ�=(�= ��K���D>�������a^�f��ߢg� d��$>���<����?��=�|�=%��=J�=~U�=3n�=Dx}<eJ��&�<��'�����y��Ѓ&=�� ���@���>��<����crk�!?=���=����ހ�=�%�U���>* H=A}�=���>��J=l i���(>��.�±<`�м�-Q���$�e��>�G��`�y��q>9��=�$Ƽ�ժ����<�<��:/j=y���I��=iJ >]I��X��.������=���x-�~X�=Q�\:hy��& `=*�
>����C�<�B>���x�f��[/>#���`��>�K�<��R=�c>POս��/���=t��<���<B=��=*=���<{�7>7 ����=�f���Ի�>�]=����҄A=sg��������h>����Q��~�3>��>����>tؽ=��a(=Y�v<v���:�ڼXv<����P>t��<s���ؽ���Z���!�;>Q^l�;=�x3>�F�m ��/��Ҷ5>t2H=�����������=_�&>�� =��6>�+K>7��=ԛB>�f;S�>�y�[��a�=58�<�����1��]νϸ��d>S�^=�=���=�//;�K�`��<�����3�<����%~<�O����J�T�a�=To9�9�3��o1�J`c�.>�e��胊=���՝���G�=g#��z=T�<fԖ��Y��@iɼ���Z�e=� T>���=~Of>�ƪ��*�<O�X=���=��=8⧼�Cx=�Gb>aّ�?��=��<kYw=�r�KY;; �����=`�����=���=�&>hA�=�-=�U4=
^�z�|=��t<�쓽���=�;�?̽c��<H�s���u>�Ǚ=kJ�=ʀm<��%��X��b�<�����D���=O�B=Z����=��$e��
�}��;��/�<#a�<���=�<H=��f�*�.����=���D$ȼ�ʣ=��F=r6���]�==���3{�=���%�>������<������=ܿ��A�ѽ`j�;'lL��*м 뚽��>��=��ܽ��M��� ��>���[�=�ܡ=E����K�=*#G��a8�ϙ�<d �>mq��� �]x���A>u��=|1>=X�=E6�%��=��R���Z>�j\>�G�=�k���mz���T�����(�=k�����>o�м�tL>4Ӡ<��=ދ������=߽�㍼��8=�� ��n�r����h�=���="V�=��x>�[㼒w��4��=۝|=y�*�a��� �>a��E� ����>Ê���J�z��=23Y;��r>���:�Y?���W�������<<���fG> �d�O���
7���4=���=5T<&�R��q�=�i;>�O��Q)�=gh�>U�~=V�Ż���pd�=�mc�I�4=�3�<����a�x=�̮=,��<�
H��B>^w{�(��=��+>�s>/ڽݾR=3���5�E���=y45�8��9����3>�轚X��qڒ��4&>^1�T4>���<�j��j=��&>I��=A�\<��=��1>C���=
�=Zш=a�2��a�=�����<NGg��&<�K��t��ӫ;`��A�<�����`��.����L/��;Խ����~Z��.f=ү-<9�|��ֽlW�=�J;�+> X�����,fӽ��6�6# ���=\n�.���g^�=��=��=���=D�c;�κP#�=�zT���u�y3ǽ��L>�}�>�[�����=G�4> ��r��d>У��<g>ֺH����<����8C�=�^��pU�=6H>ѫ�Ik��
�<����=wt!>��>1��<�=YnM>�p<�@�+<�3r>�ga��O�:�E�=��9}��rs�,���h�<4=��A>����䛾��1�|U��`��)4=�]�&�= 5�= ����x�F�@<qd=�����'�=�0=�&M�F<�<LP����|=���=L(�Ů��U>�F5> (����>� >�m�=�Y =�s�����G>]���8|>���=q����������<Q��=�*���,��DX�����=���=�f��I�=�J9>��ľ��Q���ݽ'ӻ���)�RnG=�-�=lС����������I\>x��;&���rv�[@M�[���Ɵf��F�=�������N����Qb=��="�=ɨ��� ���YڽGQ����n��9�=CR�$\�=Yi�ٽ+7�������֑�%��>�E�=�]���_�_ N����=u�ؽ��g>�Q�=�{>b��=���==T[>R75����=�Bl>��=vDZ��d>�]��룚��ǂ>��J�6œ��rg=nF=��>�sN:�%<?
>]�V�`/��1Ƚz=ɽ��>�'�����:Hh>����='=�@>b�U��ҍ�R�=c���p�n<|�7=�k4>�}>u�.��� �H�>�e=�Qz=�K�.ϥ:U�Y>���$8>2)��o傽(�ʼ�Z��H�=x(�<Ij�=S���� ;�ԟ���N\2>�R3>�1b>q�=���W�7=�׺=�����J>���LТ��N���
���,��U �`��=��ĽX&�>T4>st�<ٕ1=�>= �O>^��<���yy��<ֽ�Ǻ���=h�=#�=-�\�(�D�.I�>}*��k����O�=��Ž~8ٽ��¾r��=E|B=��j�U~@=�����N>Pfe;ظ�=�>�󡽁|½G����p�o\=��q�Z�>�!5>��0>}�����=e�'����="����E����Lj�=i\Z�L��̽�.C>�� ���߽�x��C�a�%a.���"����]����d�=����Y�o�m4;=��R�?�*>|Q�={e<X8Y����>��7>j琾� v���r�s�5><Q(�M�v=o�>��׽�z�<eR
��ol�t��%��Ua>�E1>0�=����8�ؿn=ޓ��������C=@r2>����_���mQ�Q�=?d���!��^��.�=)�<��G=���=��<SK>k s>�'(�2�M�e 6=Ԃ׾!�8<6�>�<Y���>��5<]�(=@-��;���JX�$?`=��� %?�3���>�>DƧ=�ϼ�p>R�j�/� =���>[��=�
�4H�=�~�Bz���c>z��<
"�v���n1>�ً��b�=��y��q�=e=K>*O�=X��=�bX�D���=$��= �'�hw�=�=j@5>�<>+%�;i��=s��=� y=T� �Qu���-=%�/�zS�= G���K�{0=t\<Y6<>������8>��8�;7���=���<h-�=p{��D���^ђ> N� �>/��c���†=-�.=��=POĽ��L=���;�'��5)>���Y2�=d� � ]=��{>��>1��=w!�=��Z��).�z�n�^Jm<��9����5=�2��h�*��>�<OE����g�<_�#���-�3�'��T�=��L=��=�M�y��:[F�;���=ނ�9H-��ལ�[�>8zP�Z5!�ї����]T��N�=m:@�_��= � ��=T�=���8pu=T �=M����;�P �F3��Z �������=��Ž�_��d�=��d=����B�>��h�~5>J�d>]�s����=�����o>��`����=��s�������1�"wP�d�
�}�=Ƹ�=2W#��D+>]�m>6?�4�I=�Ss����=���<�{'>B'�=K�ѽ^�;|��>{��<�|8��`������F�.��s�=���>�(>�\��&�ZK>���=�>2���2r�=9�~��\/���]��4L>^ ��\�Q�b�;f�ǽ$��<|*>�Ί����>9�=`�Ƚ*�}�(, >̜��J�<���s�=�}�Y����F>9&}>��S��I=�qa=�����BJ���������g�>#���=H)�1f�=��2=��۽�
�=�(=��$>��>�����v�>�!����<n�Z��-�H �=���=-uW��4��-m=��D��Fͽ���=$��Fo�����*O>�G>n�X<�2�=A��=�ҽr�q>3��|�.>_k�L �����=.չ=�E\�aԇ�5|=&<ͯ����k���ܼyC�:�"�;�ù:N��=�U{����=�Ç>�J��Q=rʋ��<���P������h=�e����_��<���9�̽�և=p+>����,��������g��޽�B���=��</\ս�f���1= ��w����th�o�"����<��b���
�i&>��=�qH�9�ڽ���<�B��z�����%<2�=�=��=4Ί�wTJ>�-�ŻX���l�zH�=��ȽB۔��r8=1�<���q�𽋆�<5y�� w9>mn��UQv>�|a�p����J�~�=�"�=@!�=������=� �=P��=�
�<��E=�]�={Q>�Qսx�$=נ޽�|��C�=� &>M�=Qk�=CS|�OA��ѡ=dE7���G<�f�����;�Җ=����`�n�8>�bǻ�i�<q8�>Sp�=,sR�������8x�=֥��k�U�Uf�<?�ؽꝼ�6+=W�Y�S�a=bW�=�a�>C�Z=5O~��W�;Η�=%�;6Ȍ>e�R=�3��*>�(�=~…�RN=_���ھ�K���݀�����q�Ƚ�i���i�<0��=�%"�(R�=A�%����=��������V�Z=��=�cU=���<�D5�,]>^�<u;��Q#���;�k�=�R�>���; ��>֊�=E���h �%cݼ��v>9��=�G>gA��
h5���;���>��3>�D >�Ȳ=�V�<w��=��=���=܄*��!�=�ٻ=)�M�K�=r�M��Vq=��?����<����յd>SaI���&�! �=BQZ��^�=�6�<�y=��i��~�����=���=aZ�=��=擙=����������I����!����<�Ƶ=܃-=۫��� ����=\���˺������z���=�ru�E�ڼw�n<0{��7����!����<�9��>�c}=�J����>t��=�N/��u=�6
���>�R�a�Z�՘��/ �=o,�=��S� ��W|#�i�B=��h=�·�o�=}L_=�Sx=�u�<����1�I���J����=�R\�r��=/��=7���i�;ī��yȽ=���=B�=ݎ�=�Q�=��
>��+>�aM=DҶ�yB=�,� >?5)<+F>�h���9��=���%��2o�{>��{�:��I� �qq<=>.����=5m|�1�J>���v�=�!�>����0A*����>���=�<���R��X\>S0l�=~�������җ=u��=�O#��D"<�mٻ��m�gP��:|�=L��~2/>Dž<�4<������+i=��j������>+��W�#"�&��=����g����>��,��h2����= ��b>vA����=*�j>á��߽F��65��������=#�L���&�4�(=��B=w=�!��s��3<��Q��=v�(>�nD>r�a>��׽`��=�c��' ���>���<_�ɽ���=�a2�CU��]IֽH�=g�=���> ��<���]����kt>��<|);<|*e=8Ѓ�&7���-��F>R���:��=2/v��s>�Ľ�����R�����)�Q���9��wk�>]�M�=IA6��ޅ;U �=�E��MI+�ә7��� �����߽��>f-�=$)>x���b����[�ƭ�=�GR���=�YO=!Š>đ<��K=_q�>��<���=U�M>i�T>��v<��V��M>�+9��>(��`�Y>���=Xh=��w�2Le��r=����(�����b=�D�=݉"=�U�:H���!�<K��=�ّ���!>w��e��<}S�<��� ����݁>��R�B�a=B|�<�b>�Ȩ=��G>`�ֽ��+>��ݼmr>�%?<�2J����s�<�=��T>J�=���=���<'������<���=�"(>������<IE�=��w>�bݽ�����n�N�u>�۹=�N��Ҩ�H���x��隽���=��<mۨ��Ş=������=O\=�� �wO;�/>W� ���=Jㅽ�g̼.��=h>�����=��<Lo(=�}Z���$����=y^1>�n�>`5�<��H���B=m1>] �=q���?xA>KB޽�iŽ}6��<�=���<����7�=��<:Qy<��"����n=��F�F��I޼��$>�䲽����BAҽ������8�Q&��e >ѐt==����3��=�C �� >+5�=G@�<py#�.�l��`��>��l�g>����:��=u6@�X��=ˆ= ��>� ��0>���<�<�L�=�?>��,��>%#��m�����<�(���8������P�ݤ��L�����C>%es��K��&n�;;�>.�+�\4���m>�K>�t5���>��>ѻ<�Vݽ5�#>��:�=`u%��[�=�B�=��� M$>��+=�;���p���=�;5���i=�8N=F�C>�q�=ɗ�3+>݌�������<��< ս=��=fӤ���>5����bO��x��@ =ni��O�&>� �<f�5�\��6�=(�^��=Ʋ�<��<�`k=v�v=2��͂>��<$:�=�� >Y>>/>#@�^4_=X?��m�=2W�>5!�;�$S>q�)=&���(>r�:=�ֽ;�w�E��<O�T���"����<B��,���5x�z�6�����c>Q"�=�A��A��G}�=����P�9=4���:Qp��L=/>I5�F
S<݊C>��7��hR>yJ��o�/=�X���X����=���=l�.�ιE=61��C�
�Z>,�=T�>(��0Ȋ=̴�=;�ɼ����z�<���=j �=Ҍ��?��:=Z�b����f�&�䴗���6�~Rܽ�@�`�=�g�=��=}��Dn�= *�Q��>u��=�K�O="='��=L,����<Yb�<w
�ۮ�=���<�k�<� x=�]#���#>�fZ>CA!�SO�=}6|�.ܻ<�'�Ʈj>W� �2�y=N�k>Λ�>�y���[ؾ) ��zb>$�}<�򴽼��a�4>���5���*]��Po=��Ƚ�'���v�q'0>��=�&��i�B<�^S=?Z>��A=�����G��������>u��= Y/<���;(V�=I��=[�Y=��!��K�37>�P��6J
�������ǁ����>5=��5��λp��� �=���=2���b ��k=έ���P>裳��e�=\H�#@��t�<̚�=`�?��㼊��d�<-L>=��>�bq�&�=����a�>�týeb�=���;�V���x���f�� q�=
�\��&���e=�|T�����%�D��)�=@86>S�=���=ʀ9�=ꭼ�9�>Wn �M��=�]��=��=�)�� ���R�=� ��_���<6���
3�~�k�������J>��y���Y����jア��=&�뽨_�<&��p� >��g=�vͽ=��|e9�٬5�� >-nS�V�3<��}
;�1Y;Ud�n�=~}j�>*)=�O>�2������ȅ��+��� $��,V=�-������(���J��B�v��L�5���8��=њ[>�� >��=dYA>MB��=Xj�e ��z5Y�N����<���:G>_���E�z=r�=G�����g��=$@��-��� �n�C{6=\s����(��y>HW4�_'��X�c��r��5]=4&�=@���� ̽ȟ\�xl��}!k=`R>\�%>��=�#> � ;���= ���G>�1�=d��=�`T>�u=�a>�e���s�=$�ֽ���= ���`���ͽU�n<���S�9<�$;���=lt<�=v���>xo�{8𻪻w=��?=����&ɽv�m;h%�=H>(�������<5�=y��_9��S�+�E��:�9$�\�>��=��~"<�><:>+�E=ꔈ=�R��xX�YP8=<'�<�\>�l=��O�+��]6�������p=����(܂=zqɼ��C����~�6��=� ���d>�����S���=�|�=�w�<�O��q��=� ��X=�����>ob�b�j�YD:��F��&7߽��f��V���І���<=��[<�o�=/6:>��'>���� >�d���F���z��8'=�M~��K��ż��`��]f,����< X�����9�ڽvx*=�z̽��> oo�U��<_Z7=���=MG��`��ɍ���D� ����> l���p�Bqռ \L>�lD���;0�N>>j��.�ڽ�$�2Q����ϼ�6><WüK�����|=�Wj=���>�c�=wa�����=����}\p=8�k�S�ս}�e=��\5�-�O<J.�� U񽏝?�����,���~G>0�=���=V�H=� <�E��5Q��1� ��<�j+>�X�>�"m��M��t�<�� 5>�ſ=�]M>����Rֆ�Eդ��Ž��<��=}�>�>;4�(��}��H�9>ʭ�=�KѼ���tT =ع�=O[�� u>u���1���4>�/�ه�cӓ=p�Ži���'Z�>��j�\�� �<Zv潼�X<C����zA��f���s����=L�%�ݹ�����)*�=k>M�=���=~=�/-���R?=��� pa=n�s����� b��|����f<��Rx=󯽘���-����=��2��_J=1���x�� �>�`�����=�����S�=ĽO���<�^=4 4>�����m>m�������P*J=���;t�/>KN=�=-�R�ʛQ�-�%�J⤽e�O>>k=��=��)> �4>�C��S} >�@�<�Ѻ�]��t��=�V�=T���Q[�=e����S�=� �<r��=��%��/�۵=#�T�33=��=_XȽ!災��ڽ�{����=�mP>�|罰���P�����'�>_�=4��b[��qT�F�F=S4�>��e�ϰi�+�6=�g����B=�z�=e��]��y�=z3����;�{>=�%>�3�=�9�=\��>���=Ev���ݐ<��*�N�>��#��>4�|�Q�?�>&�<�u��ț�=�����p�-�=����̗���?{��:{���t�����`
��k�=J՝=�FO=
\�;)so�35�=uJ<�)�>j��O=d�=wf�=�����B�$�&���3=)9<�7>��<��<�X��=��$�C8l��U<�����i>���=
��=�J;�kM >�$+=b�I�(s,>%rƽ��p=��7=��=�m���
��ч=ײu�p:>�&���>M/G�z��=�@<����t>�ć;��-��t >�+_���=���-:=l����<&�<�lO�@N��0�=1�ν��\��Lq=+��<��L��6�Y�1>o��=�V�=�E >���=��'<�H<� a=Q�K>>�݌�pf�YZ������B��e ���9L�<��=}�4���<\���Q�?=��m7�?<�ý���;�=��=)�U�G�0��<h=����BE�� ���G<1�������t�=m•��~c=�n|=��`>Q9���Q����<�]=O�!<�� ��&:��{Խs(�*� �P ����<m�>��7���O>� k=v�=��x=��G�}��]_>� ݽ|\�=�|r=vOX��N6>8� =y(��1�=�m����u>U������h�4=�s"�&�����=��2>C�y;��
>���O>ۃ�=�����A=,[R>d�]�SE>�ɼ$ �B��=�7�P��<���=�ֹ=\汼&�W�n�����'=��¯��A�s>ٙ=:����2�e��h�����=~9�>v|���=
�=�F��*-=�3e������>��E>h� ��{$��{�on <Ѩ�=>��=c�T> .�M��;B���؀���ͽ � �M��<�L��e
<=]Iܽ2%S����=d�7> ]W=R���H=y�g�j2����M�F�U�Ŀ�=�ێ��2�= A����.>�2=��ѽ�� "���>��x�L���6��=.3�A�ռCg>�o���ʓ=J>>Q����+����=U{��,R���n ��p�=o�=򫼤�]���>���=���=;�;]��=+���X'>�ܛ>U��=�V2��᡼�0��(-��L�j��>N�.<� &<�t �4��<!�;j���=~����?<����6��=��Ž%Q>�R�=K������=�f���F�b�E=U -�,����&>-\�� ��=f�!�j������=�A���ȼ�l=KG�=V�w�3f>�6�=`�x=df4�!�I>�R'��wF��h�>�T>��5�;����Yս��>@,3��yF>O���ܐ=������=��V>��L�'�~�=�v)>�h<�U>���=���<�Ls�Tʼ�7�>��<v���1>�����=����>߽}��JvL<�/�=Sf�=2)=)�g=N����7>��<��R���>���x=��Ὧ�`<��,���?�Xó<� �>��<�T_��5>0&罚�"����=�:A=��>���=X��=Cഽ2��V@�<'��=ҁ�����4����b>Z=໴���=>f8����=���<���<����N�=
�˽lM�xD/>_}=>+�= �ɼ�Ċ���f>ȴ3�dC�=�Q��0���,\�=�R>�mŽh����=ʤ�=��r=62<�z�w��"�����>Vټ��>�;�2~>X�'���x�À ���:�S��;#�=-W>C׹=m�<�*.���=�-:����;+T���_�w�V���'<�{T�2���������=o�x�sHK�*HC=��^><�̽2�[=o�8�����=Dh=$R�n��<�/$>�p��� >2o.>�,�>��/���=�����;�̃�<㝱=�=�=`�張���5=�D >e�L>�ƽ
P��'r��,���$��R�v���.�
S:>� �� d�=I�<�����b>c �<�Q�=��>bo�����=�LǼEͅ<�k��i�J�C,9��`���� <�5����>!J'�*�X=�cC�f� ���p=�=��O�b����-&>�5&�+����ݽ ���+��E��9=D|��I=m����h�= �=
Y�=_��=��n�$��1S=�]��,K�k�=�Y]��i=��>���3Dc=�t���\
�߇�=nj��ߓ=�X�=?{=w��Dž����=N�t>Q�Y��ژ� �M���=Id>�˽ni �ֹ�ӿy�?�ރ��������v���U=�#Q�P��D��V�K���>3�;m�d��v�0�<J� ���>e�=Q B��=���>�넼�������8��0�)�`���է�0�;=�L%>/��7�����=��ƾ����� �<!�\>ᒯ=�����P>�W"=B�1>�<��!��Cϼ�c=��>�H�;�d*����<�q��9�<� L��X�=�����!��|;�w�U<�q=:�<� >�k�=��>ppκ��:�"�x>,�M=�=_�=��<�̺=3I:=]�0=G�Z��E��+e7�W`Ľ ��>��>���Y� �\d:�׽���=�\�=��2>l��>v.�}xY>�ư=;�5�MD@��Kͼ��<�#=Q
0>ު���f"=9ݲ�}\>��Ļȩ���sN>��(�����+���}y!>��
>��T>��V>ݐ=D�`> n�< �O�P忽�x>l���z�<Z��=�邾��=t�<DHN���C��ﱽ�x'�Τ�=�L�|��b�Z=jx�������䈾�κ�t���%��S2
�[�@=��=����^��>���K��=��!<Rp�� �=7}�����<m#=-+Q>�Wþ�E>H+^<T;Z<L3>|b
��'b��#�=�I��y�T���<+}>c��=�.&>x
=jJɽL;h^�=x둽�4{=P.n���н�=U�����1�sŨ�jr%�N8q>;^(>!;'>V������7+��D<�y2��#��<!>�U�=8�>v��=$ɚ<���=]�=u�; Ž��U=WM�=�Q_�I澼B}��V(>Eg�����3��L �=��.>\�Z���c��>�� �C����`;.&6=17�0D��7js����=�BV��.��!�A�܏H��b.>0�L�����sƚ=��V==\l��5Zx>W��=ص�=��ӽ��=zL?=��>6m8=�w5>��j=���=�g�<4�.=������+�����
��\���C�=�@�=�� <��S>��g����?v����ҽ≼��l=X�h<Ճ��X'=�a�������M����!�n�y=+�K>H �6l-��+�� >�;�=?-7�N���� �=�L�=�p��z��<�� >���=��ڼ!~<.�=e�I�z n>AA��� ȽU��8�&=MQ���� ���S>�t۽��>
B��\��=�����[=�>,=�y=�����v�I��=����ZG>���>d*�=�T�>7?��o�O>+�@>����c�*>��>�/̽2�����=4a�ۮ�=�� >���=��5�c��=�>>&<0��]���̯��W���D�>��/>�;��Ca>k� >$��X�]<��5'Q��U��ٕ0��9o�&w����a<_��=����A�<�����숻6m*��W
=PM>s�F�؃e=�ܽ�'��dž�h#��#�'��bC���q�� ��μ��=����"c�=���<���=��y����# n=��=뽵�`7�<J�6=��E����;G!=�a��Z�=�
�E�4T>�����<�R@��u<��#<C��=@�&���=k煻�W��69;l!�=�=�]>Y��=i�=Օ�=ʼ�=0�<�:н��>�ɇ�S��<\z>MjŽ���=غ�)���>h�(=�V� �k>�,�=��������(�`d�V�� ��r�= q�mj>e`�=^F<>�a ��@��] ӽ�����zc�"j,� �Ž���u�&�<Hν.����4>���������='�>�2}�M|��$����2<f I��k�=@ <�T�=��>�E�=}�=�I��F��DV������ ��U�>�[�:cx<�>�ךż�M�=n ���6[����=�b=�VL;o�/>4����H�=�ߠ����=���[>4�v��=ڣ��y]����=��;>�
ž�S>cy�=���6l=��q>yw�<�[?=�* <�HH�ռ��\K����W�xBu>W���^c=����=�<:^�<^�F<CB;ë�;�Rؽ��z=g���f}#>*��F�6��i��yw�=�{G����?��J�m=Kj��T��!�'>~�U�w�ν�)\���ν�&�=Bi�=
P��d3��i����=Ҿ�=�<�|*>�&K=�k}>�\��#�#�� >�
>-� >�2J��_9>[�>���=Y!�Jz��J���������#�&ʥ�-�νK�X= @����7�̻��<�� �§�=�Ĥ=F�1���d=�# >&ڽ�C������ą=�(�=m��=b����P����=v�V>y?�=�A-<|"�;��H��Ĭ<O�S>��9� H=n-N���8>��y�'����K�>�٪����!6H>�#���פ��eW>�l�����ɫF>"�]�n}>���.C�=|Lw=x�ڽ7T��� 罌��������ü��6��
�=�|�=�.�<2
>���<�Ya<` 1���>C�>�d��A��=��‹s>���=�(#�)R>���=�0�=7�K�@�<��ӽ��ս�q�� �ʽ:ŀ=�Z�q�>��o���=M �Y��=ֵy�9��=���=�L�����=����b>�8�=?�$~���U��i*�)pѼc)~�M����,�p�n>4�k=�ˎ=��=9�K=���9׽�<�����,=�Ɓ>׷x�L4/�c�=`�<��~�W��=O�=�=�=�8����QB���k=��/=�/ >��/>Fh����7��wV4�
r>d1�=�V���=v����`��e>����=I�D��3���;���ڎ�3pA;l�<=�G+��l�=��]>��v��V����鼧�X=��,��lf=�� �$�n�ۃ;�"�X2��P�����<I?�<�I��Sc��i=�O=>� ���0h�Zt�>y5k� �c;��;z�v=�\U��=� ܼ���IW�=�a�+��=]%�=a�x=#>1
~�Ix{<�-<�t�=���;3Gǻ��>!�=�2��Zu<���=6aV��*>Y����%�[^C=��&��`,>G�t�ؙa;���G�;;�x]����<��.��59<��q����=�����d�>=�$�r<qU�={1>���=���=4���!�N>��˽��&�m=?��/�a>��ýk�)���< �U�=lȇ=�(>��G�� >7� >���>/C���=m��>�'����=��6��Y���]�N�4�gS��OR�e<>'�k�T �� li���<I?�/�9���O��<�ǿ=��;m4��AG��t񼋘�=�T�=h�ҽ9h$��z��k'��"�=�g�S���ɽ�h�N����/�t퍾T�e<glܽ���);H;�=���j�c�Y����m��ȱ����L>�4�y�F<܋�=�2=>|�K=sK�<�����>Y�64~<�3�
�ҽ2��>Ql7>��<ɢw������=�&R>�Z��,����<�&�½��>��Ǻ�m����ѽ�ډ�� G<� M�#3���I=e$>���<3�a��kL>}3������?���P=��=)&����z� �X�m�����>�5�h;�+
�=&��$�;�;3�=�/>W;�F�#>������s=B/�=�T4��YY>(�=5"B> ���y->"}P<%|��x�����=�H�=kX�>j��= ��#�����ŽϷ����1>�3�kv<��>�.a>f��=�*>���=9/�=��z=,��>�>���;#>Ow�8 >�(����<��1>� =I}���D�=6*� t$�+�>!��=�F2<�o�=��>������a=��ټ�À��_��x�3=�Y��N$���Y��3�=�����&�t��v$>38����<u͢=ɷ�=��Z=P!��7=�"��Ƌ�=�y�=(�=|'���=������=\x?�2+��
�O=�==Ԃ������������>�[��$>�2�����=���U� $��+8����<rf影 ��<�<�u=y��;���<��< �(>���?�%�����)<Z>�^��\2M�۵>��-���j=R >�$���>�Y>�(�2�n>(�������F;���=;H�=�PM�%->0�=�yx>��:�В ��ސ�d��v��= ��=�9�=���=e��=�"ʼYʹ�Y��p�=�� >$^��3vǺ{�+���z�h��=��)iW�-�Iq���T�=|����=�I��-��d=N6�
zI�S��:��z<d�@<�_w�+D�=F��=Hǰ=-����$>sZK<�#�<�-=�}�<��-�X����t�:[�>:f*=9�b<���=6=��y���I;.��y�=q�o=�(r���<Ӗ�T��=5?>��:>�K��a��=Q�=�!<�h��L.`=�����G鼷� �|'�=p����(�<aF���N>{y����<������r>��->~i$�>��+҂=�l���M=/�}<k_�=�?�: ؠ��Te<��M��E�2:4�>�<ث>U#>ԛ2���!g��Ċ<��>�����=����J>���=]��D�=���< �=��>�II��@~�.�㽄=;PX=`„�ZV�>72\>Y{=��>���
#�0uH>q���7��Y��=�v�=�=�������Q�H�<>5����$>��?{A>y��J�i>���vɽ�4�>�Ŷ�K�]�o���D_�=(�C���ټɠ5�8��>�Z>�� �7��`
��հ������.��ս"=Y��(b=_q;>��P>� ��p�<ʲ>>P�=<��S���0������<�C>[S�=٧�;�c<�#�.�Xj<>U����>74K>���=�^q�2 �=)��=�p���W�ѹڻ|IS=�/��U�+>��o��|=�� �%/5>�֋�O��<��̖s�}h������T1��`@�>,o>>C����<��#>�J�=Z�=�+V���޽�4B�ɕ�=���c�����<����N���퐆���佝v�=�d�>������=�+�����m�e>��w>��ǽ�>�>���=��Ǽ���;��=�1y�� <t�#��:��'�>���=�b��ˍS>��`����>��>G �E]�@������� >�����=�}>-5��SS=�w=�ӂ�N(���P>�^8��m2=���U"�>��=���=�7�=z$Q>�������=�<u���>�����f�1�>��w<s���h��L�ܼ�˞=�r��` ����z��Sz��~`̽\��=���=cIȽ�O=g*��l>/���B�>��'���>��N<¶�=v|c��EG����3QL>#q�=��=B(V��9i���׼`���3�<��>C:>��y��xD�v)~>3e��!��=�`=����b�=�_3;��4=(�>������ɓ��P��YC��KW�=p0�=�>S,�={m�N~=�X�=E�����Y=`>�
�r�X=��&=�S�;z�#=:湃�P�M>���K�.�=��P>Vݽ:���/�t>��ռ[��H}�=q���:zL��FW=��=�3f=��>�D�;�T��������=�.w�Q�I>���;�$>�ȼqѼViýa��<��.�[��SrC�F�e> ��{��h&>m)a�g�>|��;�ͼ��N�7�E=U���W>��?�"Nf;�6�=Q%���E&>} �=)<�-$����;�|S�Ɔ">�+��7a����>��x����M���G� >��*��H��6ł>u�)�yh>H0>a��=ĝ%>����W��;^�Ѽ�J��o�����=�h�=����Q���1�vT�=�ƴ�BR��S���5�;q�;^$߼����j��S<k���ǽ9�X>��/=t
h�9��,���=kT}�EF���N��
>9S>I�����]:r3>�Ŋ�������;pr���є������;[�X;����uk�=I�7>l�B�W��='���J��k�D>�B¼3e�=���=���>:�アy��B���b�-}�{�U<��ս���=L�ܼ6�>��A> _ �+ؙ=#����*=�0v<��/=��n��2U�.�#>�՛��MN�<;>��@>�U���,>���;�����jF>4�=`o>8�Ľ���&>^� �*��<�AC=�a6�f�=�P�=;(���<>}>�ub=nk�=&���C��Ϡ:�~�=�}�=��8�}�ɽ�=DY���b+�}/
>�!=��
��iB���j��H���B�nJ�<�bN>x�=+R>l���֚��<�g�����I�����
P�}}f�b���Zv�e�=0%=f4���)���G�=���=�.���+c�����Ӌ-�᤽�L\�!�?�����>B`����>|U=�d�=~C=}`>D�9������ ��>)��=�U��-�=������=?���[�=� M>�j7�����H�<����+#>/ҽ�|��1�<�`�����?w.��4>sw>U?����)=ǔ�2tl����>,:������_���p>8��=����r�:� ��f��<
>�L��*��<����p"��m���͑��)ݒ��2ݼ2� �Aj%=��!>f�=g�C= �>��=��>�d=0�m>���=ۮ��(��G�*>�pR=CW��+V��T'��˼!&���`ü��<�ߖ�!��=
׀�O*�<�>1����=u��=�i��o5W=�p>�P��w(������;�= Aq�<�����������=���=�U��������ށ=�
޼��>ڻ�i&<���jV= am�S�=>"R��ħ>>N-������%�>�p�p=��==���=�)y���(=�U=���<��knE�rI<M�@��B >l��q}>yH;,<K�Gڶ=~�μ�%�3U�>1J�=& =�$��CC>B�=��)�hȼ��=ӈP>����~��:��<gf>��>1Ν=຅����;}i�=��E��vt���j�{���=��=�h�=٬�� w�=��=<�~>c�-=:r��~��
[�=�c=>t >C�!��=�I��5Ƽ<��;�]=1�}<���=�Q >e慽Ȓ𽐱�=?��=V(k���3��Gg���������d[>,;�v��Xk�;#���>�P��7V�=�X�ֻ)��׈=�F">B�=���b"��<>/+�=F@��%��=�,��{�����y��=u(���+>Z(*>��J>{ܼ��=���= R�=~c=ܱ��� >Ң�5�Q�ùN>V�>[�C�� �>�0W���R�=$��e �7Nu�$Tؽ���=�35���u��<S���r>�q��۽�#X>��K>) J��N5=;�S=� >7���)k۽�U��$�<�b^�_ 3����='�:> x�&���ʱy=P�/=�����uF�/��8�ff�eJ�<���V30>?�ʽb�R��vE=��`>��}>[�*��^��!>'��=�>\r�=uGd=r�N�K�>B��=�(|��}=,�M��L�?��>�?�=������=x#�u�B���-��
�<�y���]h>�m���9�,BU�<��<� �<tc��f~��ν��U��I =��]>CJ>g��;����k+f>6)y�C���<�����#(�<�M8>I��tN����=�1Z��K/�x�ͼ2r��G&���_�=��<�]�<{k�=(�>��P�HM��y��>��:�a��ӽ��{>~�#������r�<�9���Y <<�=2�����=Q�3=�=<���=�K���S�=����Q?>�}�<�s�=\� ;���%�=Lؼ�~%������㝽�+ >#y�=0D^���+=N��=C�=+� <e��=m�?�o��}8=������>&2 ���=g��:��-��Ǒ��I�=?� ���J������We<Վ ��A���a�:�
�>#��=���NJ=i�=�18�1Η<X�;���= \!>DNK>z:*<����K�s|��ӹ=��=�P��;���޳��%�u>?�v���Q>��#���=���<���¾��/��>����4��=�C,��:ؽN�|�X<=؄��VAj���v����;y�=e$�����E�=�Mս��L��Q����?�g{�<�g[=S]�=�p=1K=k��9U�q�y> ���&N>7���� ����0K>��V>��%��"=�G%�(Qu����=ڍ�=4��U�Խ��V���н�f=@p� a+����= ́;��`����T-4>`�#nI�`,��7=LI��Z��e�F�R��������g�:����*���������r>��>����2e��v�V->��=���=i� =����
>�}���X��q�[��5�=+l�J�(��Gֽ���>��>:s۽?g���>D�<��6>�o�=���=�H�;�(�'N>�k>B�@>�~����G�r���>(��=S�-�ҳ�ho�<wp4�i$b<��>(*�=>V->=�M=�=��>��<)e���>��m=���=�*�<�ʼnT�<n���),�A��=�M=L�^��<�<����).�,�M>[�=�t�>� >�&=1L���G�=�����a�F��� �;>�=���>�νt��=�$v:\s<w���ź/>�
�= ��\s�=��j=�*��]�=���=zd��p=4���Y����=�F���"�����<!���\`�=y�'=
�Q�Po���[>jkP_=�"=�=D=����U��8w����׽�� ���伺��������f�K��=;��<xa0>w�=�[S<A��<Lv>q@��<���>N=�� >�D��Kٞ��o������n>������%<ӛ�>��F���E;$��<��e�q����=��û'�<�k�>�
���=F��;+>$W ���6>�9�=
ゼ"��>�}d>������=?e?>Ɲ}�r2��>A=>�/<�>Z�U��*Or��\�=᧽@����M�=�%J>&v7�҆��Wڠ=ƅ=*�d���=��8���Ľ�G[=��>t�;�v�<'i���V�=4h=>�(>�}�=%1K>x�H���2�CG�>�i���T�<�P�p�=���>�?=� q���J�7���]=�u�� ,=
N�=G�$�r�,>"k����g���|�
� �=�95��!>��=3QĽJ&����9<��=cu�=��K<�ꅾ��=.[�=+E�<�����F>wt�<��=�I��b�Ѽ�r�=�"V�0�@���<��W��{�����U<��=̪>�C8>��.=���=�L��YҢ<��ͼ���=h�Ͻ|9�<ċ��}��'���ѭ����B�Q� >��a�j�pl�< ����;�za��Q:�U�=�� �„˽�G��V���">Ŵ>��J��f���̽�Q<��=� ���)=�V��o�D��c�=�9,=K>���=�J�=59=>sN<>R��=r����U�=��˽�q�e�F��=i �>���<y�'��3�6>�"7>yP>��R�L�꽲�½�
���ps=�����}��g�(�@�!=m�w� )�_��>��>�q�=��=�E�=׭���5�=�X>iP�=�Cv��o<�EtS=9�I���_�]d��!�����oi=��)>L�~=׌|��L(>B{2>(z����N�GJ;�Vֻ��=��=��ݽ{�>��}�j���� �������V���|>+m={6>Ώ�>���=��>pw�=p�=!��<��=2^=��S���5�~�>�pڽq+�<v^޽��==)7��s��J��8�� ���
=�͐=�h���a�=b{>Σ7>�d�9!���M�<�vܽ ��=�����>�<�)a�~����
�=sv��N]>�Jl=`^��:BT��ԛ�� ���Q<C=����>�{�/n,�RH�=���>�g ��R����E=}��>I��=�@<���W���9��B�=:�=�S�ZK��qH���< ���e��<:�b����>�>��q�)u>`*J���j��_�>ҏ�= '���h9C�`�,���=<�<W��� ����>�j��=��������j����ڽ��+>n��=�w۽8Y>��=������?��^=��_�U���0�6����Z���=����q==��gʄ<�: ��䭽y_x=`U��i�=@��>�仗��=���<#�s>h�*�ͼ���� =\��*� �z�o�u<���������{=W��՝d=��s>r��X�>s
�����$_��1��=K�ʽ.O�= t�<cd]��3<�߅>�~z:� G=,&����5�4` ��a2��#����>���=������ӽ�Zs�&٠�s�>�–��x>��jG���ս��J>=DϽG�=���=�m>�>8
̼��5bZ���E>e��<���=���=�$>�v�<:��=O�;�� = #�=0l��O�<��<5�=TS��O�G�T懽H�(>n�x���c�r/ =�i���?��W>��}=7<.>ga2>1�Y��B�=�����<Q-k�F�\=�h
��Q���ɽ �I>9���T��=��O=�f���娽�>�m����Ľ%���M�;w=�'���5�=�:�L��<x�E�ȇ�<d2x�^,j�:Rֽ��?<�B>)��Z����;M6)�
�=�u�<�e=`���f
�k+�<�� ��^=|Ҡ��� ���/�b`��'��j�V��b��5��<���aY�>�R�6^�ļ�����=�:�=1�>�# =w9��M�㭦��D�;pM¼8F��X����нJ>}�$!��q�g=!�ּ�z�n�1��� >=��3"=fv>�X׽��E��%�>���,��=-�C=a�
>��>�$��S�>�W=�f��J$��S2d=Y�+�9m>� ���̹=)�w�s�Ͻ���{@���e>D#�V~=�d>�K�=Fd׽{&4>S �;�[��/+�O�<���=���r6�<�����=�k����P��,�<S�/<��!:+�M>K�k>^�>���<�o/��g<�x��"<��O>��F> �==�K�'�=} =��C=��Q=�a��'w1��‘=6��=z\T�Dc���Ic=΄V>�� =�0�<�$>6�������=,Q��掼 m=]�?�Ԧ�+�ͽq�^���ż�D�=���;��b��T�tI>�qp�a�>�g�=�}4>����ռ �R>���:治�1�==xڽy��<u�<u�8>*��B-network_body.linear_encoder.seq_layers.2.biasJ�*����B/network_body.linear_encoder.seq_layers.2.weightJ���%Ͻ�𞾫>=�`�;���=U5��!>� ���}?=�L\=������= ��<�Q��r�=��d=�`��A���0r��O��To=�Qk>T�=�M����b����z=.Dž<�<������)�=g�4;\q�>d1;��L>�5*�
�T= 4H>ߺ����8�k򢼦z�>�w >{S��N?=�"�=��K>��C=�=�-м� >�:i>E���O�"��ؽ�q0>Yv���8=;�Q>�ϻ=����
��fp�Ծ�>t،�P��=h������D.���:>��< u�=� �Acҽ;��<���=57�*� �!��=8>��`>>�p����yo[>Z ���=C˽�F&<c��=�'ۼ&��=��(H=��Z�q >�1>�Q���O�`hx�ʷ�����܂ݼ}c=^�g�Y�c/K���^>9T=���<h��>0Ǩ�kNj=U�>���q�$��׽5�����==���^h>b�,=-�5�tF=���<�,�=[½S�'>I�k=��=X�d�'��@�n���>��(i=����4d�<�I=>�����=���=�>�G8>T�\>���>=��<%��"t�>d�>GHY�pl>����Xh%>f?�>�R>��b*�=E�:�< ��L����=� t>����~$>�yP>i縼���<0�������-T���}�=xɢ<�Y�����=[^��3uw��� ��s���3>���=|�*>����{|=��=Ȼ��Yk�uM������M<�Mؽ�ƽ�vp>B�)>z��^:>X>h=#���(�=u$s=@N�=ܭJ��o���ϽQ �=��>��='��ZvH;J�ýL�0��e~�I�����=��B���>�t=�/���>��"=��V�����*, >~ Q>v��y �=��j��ƌ� H��*܁��ޮ<��=~�e�0-���q���)��Ÿ=���p�^<�p�=KN�=�L��^�,<��3�P�$>;.�<���>qxM<�4ӽ�z�<9e�˱*����=DRƽ�n">0�"��
����<��=��B-��hォ[=O�v==��o��=���4��=�G2=o�'>�k���ɼ�q��F/��a~����=��ϼ[��=N��<�2<�,-ܽ��ֽ���=۳�<�S�=�A�=z;(��v =��=�Rݻ�8��UZ>r=����� �"�j>���#؊=�T�=���=�a�<'{�=�����&�}�>=�4���W4���={<���a>١��G��=�43=��ƺ�D�=���=6E%>�V�-v>
������K<{ ����C���<ƀ+��Zc> ^�=a�н��z�,����N��->�7f>��ѽ���=��<?�S����H�f07��ɴ��T~>^/t�����I�ɽnؽ l��1���cf >���;�4�<�Rg������G��q�n�u�7=������=���*<�Y>]�d�M(?>�w�=�})>���=�=wxƽ�v=����!P>��6�(��*�r<�P�����=̻���C�>A�ѽ��r�Pt(����!�>���aJ�<��E=�`��^w��Q S>΋���1=QC>3�?< ǽ�.�?�"4w>ߥW���_��n =��ֽq>�����)=���<�/#���νi>���BP�� �=�����[>��>y��;�^/���~�d�u�g{�=m���LG����=Ц��.�<l�&>�I�|0�=Ah=!��=���e=}����
>�*"��VI�&ϗ��;/��nI=[鋼�c��Lޝ�����YcI<���>O�_>�o=-��c����������;�/8�]y�= ��@�^�;>�H��Er1>s�@>Ib>K~7=��:��ͽ�r<��J�^��<���>d_�=@�&>xٓ=����ee�=�5>�R�!kg>3P��([6�'�ǽ!j!��wS��9n�=������>A�輌��=_�Ž��-�ޤ �l�/�@J4>���=<�=�=�����Wپ���Ћ�Q��P���L�k�d�@>�5u�^]׼���PϢ��ss��mw>��P=x� ���o=�A׽�Q�<P <��W>���=��������UM�V �<�4���=�V><�n��6���%(����;^�����缐�=˓��CG>�B�<F�8�'=�&S�'-�<n��=z����=02�= �
�!��=+>��4��}u��v��ս��>a��=d��;�n ���<�H =��׼���=�d�=�=�%��N�1>]J@>��2>fJ/���3> �&Џ���.>|�=���>�A>O)�=iȽ'�y��ʴ��>��>�sǽSf��=3����hp�(���Q���� C=�'Ľygɻ���<�hK�Y!�;���<'�0��P�=;R���UF�ij/�/#���[=P���t\<!��;��ʽ�.̽ R����������f�g�U�J�5>���6&��9���r�>��<R�=� .=[iO��P�<���1
�>α=�5��t� ��z�=D>*bJ��| �_!��`ŏ<���=�<�;ۼY#�=��'�Q��<l�=�����&�<%P��5!>aj">����e��W��9 �<� <���<B��<:<|��kS�@�N=���<.����== �=#c������n�`>���='�:����V+��Ux��3�<d7x=��+>�o;S�g�**�= .����i=��K�1=���<|K���D����U>2 >2�9��>߽�� 1�=f% >���=n�W>4�|��=�Hֽ�~��c�޼�`���">p��=(1{�3l0>r�<�􁼫p{<.�J>�d>��νO��:O>&Q��3� ���D�m��=�>ǽqd��x��=Vƍ<�~�<%R�=P��"�>�jཝ&�,Hc�|��=/~&>qG>�ؼ^5�>��<>?v>PC=�0ټ���iB=j��<�қ�6��=�i�����-�=ެ�=�63=��*��nƼ�U�*��;��G=�����<(��>�Z=�,�H� ]f>��� j'>%��=�MN>�y_��>�K �&������ي=��n����=�LX=�F�������$���W�T�v�� �=�O��Z=
B��*�n>*��=OJ(�SY0=_��=Z�m=icC�X���+q����e�-�=��=�,Y>͍����u�EZ�)e>&�� ��H�y��>�����c�=� ����=g��;w;������Sv�_AH=�����Y��K�;(՟>�D=�V�=����f��<��F���]��j�=�nK�����G#��3��<>�<����Q~=�L��@���+�� /�)��=C�=^X��`�>7Q<��牽c!8;{�W�%!C=�M��u�=y-c�Iש����=]ϼ7��&y>
�x� N*>TX�;Yĭ�3�>Ӵ�<�C���X'=V�/�P�<<{
��2�"��=B�S>� ����V]���� �fz�+�;>-�M=�!㽮�>-\b>�r㽺��=��>�B��$NH��x>�J���S>CB�=��E>�lj>C�*>mg�=�D�h�P�b � �&=��X��2�`��< �/=g��=�(�>Xa}=�X~�w)1=�������>tƓ=𵼘�>Y�=���=��=��s����ߗ >�t
=?�O�Ǡ2=�(>p�C=@ ������t�Z=��>�M >+-�=�<�=& �����<�M%��(��I8D�:��Qy��*>�a�1��=�`=�~1>��:��fa=���=x�[��U�=�/!����� z�Am�=Y���[S<B\����?�`=|�y>�/ =�!������7;,���\*z=�V�=H���4`ϼ������b\�"A|��Ag����<kν��<��@��d>�}"�� >���>Z��\��t��<�Q�<+�����b�� >�Q���0��� �ih �$҄�c��= O<=8���x�)>�>⑄�����)�;�l�<�vA<^mɽKL�>!�>.�=ۤ�=v�t�ǣ<c���#���O��'*>��B����=ON�z;<f �=�xͼ�
3�XҼ1�&�<۽�e�=����sU<Cb���=�� ~�=TGm=ي�Q����>������>5��i�*�r份f�T=�4H>`�L���ϼ�J=��c>jP��0$>,ֶ=u�;&��=���<;��==���w(��5��z��g��<C:����<�[�.�>oC�<�Q>3/$�QF�=T����=� =���=!J�=�> 0>*�,K��Խu>ܔ,>�sнO�>�*=�/J>�QƽPr߻}�p�o�[�t;g����#��~��R��d<>��5=O�i>yDҾ��5��� �����Ԕ=|;vG&=m�~����=���=�'ټ&�>�E�9BN���ν˷=��J>ݫ
���d��������n� JW>�):�|>j�o��>^�=�B>�m> >�ꓽc���=T�=��2>�m>��v��5���ێ��_�=�^��y�<'/�� =��><_(�=]m�����_8;QF��щg�N9�=_N�<����n�d>φ���@ ����=���=9�����L>->�������dd�#�޻�F��� �<�M���妻��=�-'=#H�< e���V�=.�=�&��LY=�U��1�M=V]�=(F>�c�>w���+�=�X�f�׽�B]<"A����=L#�=�">�s<r��>熽-c�>4�=�ֿ=��>���=zv������v�#>�����E�.�4�j�e��A4�\�y=QDz=�9�<M��'
��r�=�8?=�V%���ۼ�����z%�{i��c��<�DS�������<����|���K:�F��=����1 �=�㰽��-�<6��xe���=�>!>L�)��TĽ��=�G=[�a��ս�, �s�=O6%����F�<�5F=�o'>`~���R�=��=)6�
�>j]�=�~н��>d����/= =�Y=������d���{n&�^�W;@6�=-�|<�q��'�Ľ���=�����������=��0=[����%�=-��ش�<C>���;�G{�P��=l��<',��\�W�&�J=�ܬ=M�J=S�>���<�s��l�=�c>�c��F�����>t���;\>�= �>��1���c>�����ҽWVq��f>B
�=�✻�=š=� <=�! �9"�<���<1�=K4>Ϡ=I��=I�����l���#T>�˼�^=9�gi�=:�u����=;�<>b轕y=G��y����`P=[8;=�Tr>��0>�'�=�?>��V=1̿�d�μv�e=?�w�5�����>�7�=�]X>�=�k��M��N >�d�=�"<=��;�X��]\���Ľwr ��Ϝ=]ry�~�
�Hf>c�8>r���W��<hI���0;����=�&�S�6>��O���J>J@/>�2=��X=J���!3��v��<\C�=�B��� 9>�b`��l �1ZA>����f;3V�=�: �\����=��Sȱ����=t��=�">�n�=� �;�=G��� f�j��=p~��IQ�hv�;�n=#�2��
n��-!>�슽��; =�ڃ���A��\�=[Z�����1��b;+i��r�T>(h�8��L�B�oOf�/(F���?��A"�4v�>_W ��>?�=�Q>=t��g�:T=�蘽J2�x?<�-Z���'��@��m�=�{�<� c�x>uv��0��=�==��4�ah:>���<ƕp�W ,����=S����)ܽ�
���b2��@ƽ;;/�QN��R=*��;n�C=�%> =6_�=�b�9>qu=
�=->e/��[�P<�£��J���?��DE��K%U��B�����=��W>悾�@9���2��d��=Byڽ�R�m�P=�Zὰ��=��W>: #=��h��[��y����z�=�l�>�Z����-�v��=�,�~i�<�ZU>��c>�>˻޼zu�����=��=&:d>�����|>�cȼp�� ��=�–�IC����n>���,[����ۼr��=�R���9>(Q�=���Y��=�+��<>%睽�����G`�����~��=�`�=�1{=�=��&���Z>��Q>����/?<^��=#�X�k�+>s{���rؽc� >|Z��=��T<�X+>u�˽�}۽4��=<���݆U���T=Ր�=��;f8��w�w>�?�<�̔��.�=����u�`>��=z��=����`%=l�὇S�=�-J�<�y�۷���ʽ=�[��~�=�|.=o������9���<Z>�W�=Eݔ=T ?���>4u���=�)F<����ѿ��{9�� ƽL�">SՋ��Eg>�P{�0&%=Ɇ�V�
��,R�&��=��=G =\⽔==�^>�W%�&^��2z=5 y=8�6���<S��z���������=�� >�<�%���v�<n22�ϊ`����=�
罫��;8E3����=�Qa>)��Tu->�� �L������f!��O�<��=U�_=?8$���!��0>��z�<%ݑ<���=�A<�/��[��&��LJ�<vͽ+ҙ<f��=��>�{���`��l�<�W�=�2�����%�Ak�=���=Y�=v&��O/��� �H������=��<�����N>��7>!��=[�<>�̽�?�����=C5꾽S��F
=���=/H1����<�6>Bٴ���=>���"�>)�=��=ˇF=NK��:�=�r7����1�&����_
�=�cq�Ɗ>db��L<���>��<�S�=7�=�����"�>uDZ���
��U)�_H,�O4=�*��3j_�4@@=%67=��!>�(�=zy=R��=ᜤ�Ŗ<�m�=5m"=LC���<��-�Ke�=AxR����=�F ����=2L�B�5>&:�P����P=�d'=��ݽ(�3��t�=khQ�6��=6������=+b����<7�&�U'J��A�:��<�}�m��� �=���=X���]�=q�D��g��"��v<�޸=Ӭ�>�Վ=h?���a<0����Â��h>�@@��,>��+�6�+�y�g=lԣ;<+>�
W�:˼<�.>�t>�+�����<���=]�U�9� ���(�{��.�.��k����`=���<�N�<~�<C�E<�̊�+<`�R �=(_k=���ytV>d�ּ�� ��S��hс��2���V��#>%�%���3>\H��t�=��\>+
>�h�<3����'o< W=s��=�RP��gP��Mm;%k���2����=�q~<���;¹���5>��@�*��y�����t�%�
>f@<c�=8�����H#@>�̣��F½�6�=T����)�؍>�$���T�R���>����-�:�/�a�S�+mZ�j�x��%-���?>�ʁ>���u�<���=��1>B� ���>��>1�����>4� =��V��� ���佡Y��2>,����w=�G�<�Q=�B��Ή��m����M�<j�=����"���AJ=|wr>5�]�؁�I�D��^= ���$Ak>�[�-K�>Qa>��|������^�>�w$�iQ��.q=�[���~�=��H���=P���mսL¢=�<��~ý���6�E��4�;Z�i��r=ka >�}�>զ��;��<�ͥ=�,�=�3e=�>=_N�=pMk��sI>T�=��d�PPu>��1>�ݬ���=��r�h�<Z�->�kZ>�fJ<�1��� ý���^��������=� �Q%E�> �=CX��L�[���.�^)D>�\I>����� �=F���y�8<��(3�y߯�V�\=�<�<Z0�>B�L�I�q���r@>q >@&�;�(d>U����t��=�_>=v�ؽZ >�� >���<�UN=������=�)���>4��pE�<�}�=�[޼��c>�$���)>����Ƅ >�]1�����䌉>y�鼊~佾@���>�U>��޽A��=���<@��<����{>����� z�v9���d=�8���G�<����U/�=�F(>ʌ1=PL��'<>x-����E�=���=�NN��� >!���-2��D�k�sX5>����//>,�=�6�b�=���/<����ϽRo~=}�->���� =��0>�"'>?ͪ=&����1=u��=/ٓ�����B��=�����9�O�;=�L>$�߻Q_޼+~0�c]˼��=�`=Dн[$3�"�I>����K%=:T��$���л�mZ�d�R�]� >����_�~>��=}8> �[��P�=~֏�/󽼚 ���i���/>T/>�]r�q�h��V�=�](�U^> 6<Ę=��>�y�>�g>"�C>���=7<G2���ν����J>U���Q<F>���;��=��Y�x���9Q%���3=��:�׽�&`�j��X[=߅����,>{���yԬ�,">휂�'�6��)��@f
>��ȼ�����an���O>��;>�,;-�w�r�8�����@씽�c)>�6���������J��� C>G/W=Le���!�=+���(���W[6���G�z�+��ք�kρ=�u׼�3���=@˩�9G�:4=�>w�:��/A��7=Lw��{̑>I�)��$�=Y$�:�e=�@\>M�6��Ԙ�� >��6�������ʜ=3�ýMa��f�;� >���=�`½�Q>A�齪�M�!=����I<�=(n= �=� >�A�=���=��!>����w���ƽ�m����O>��N�C�y�P<� |�X���X�<�t콪��=1�>�A��=�kR>D�;��O�=�F�=O\���N���=d)�; �">���Gl
>��>�ݜ>�t@��7\<��
=�Ɩ��*\=H���@�=�5 �P�l�>�潑 f=m�۽Ɨp� ( ��1�=�̲��@�=t���4\>�2>|�C=�������c�ڽ9��<��d�F<��[��k>��q>��= B�=�ܽ]uf��_��T�Z����Z��< �`���ߺd�����׽�և>,��5?�RԞ�2�5�xݼ ' �I�l�|�������5>���={� >���=?r�=���=벢�f4F>��<u�>>]:�=F���8,��y.�6r��U�n>�~=Vz=�ԉ<���<9;]������A >I:>r�=��I����=)�I�:B�;=?��Y�=�4t=%r����=��N>ժ�=�C����; /�f��:z�^>�x{<ϴ�=�^�=>�=�f˽����c5�=b�<�O%��R%�ruѻ}��^f �#�b>@%>r��>BN=��>��9�`O�>`�=�q^��d��i�=��#��h=l��uT=z�̍���X���K= �:0�v�gd��>�?�-��MD�=�P<�� �Œt�/r�8d�=G�vz��.�>� ��м��F��_��p���W�m>~[I<�Nb>H�e>��y�PB#�%'�=�I��-��-�z��Ok�$X�=�]Q>A!�<O�D�� ���(=;�8=��`=��q;a킻Z��=\�O�x��=>�v@=�,L>6:�;��
>2�u=k����r>C����/����#� �Y&лtv�/�ɽ�����E?�_�>���SW�=-fJ=W�=-+ >��9��j����(>u 绰N��w۽V��<�a�K�;=g@U=@.0>�wC>h�=9�9��� A���Kg=��=萸>��j���> �<b�=����:�`+��ڵ=�ʩ=��:��y�=����{b�?�L>;����{���ҼY;���o>!>�A�-o=@U׽`d�=zP������:+ <�$�=�Ɍ�6u��T�Z��Q�蹠>�����Od=�.�z�V��(>V���&�<������#��2�=������=��Ľ]; <K˚=},�=!Ǹ:*η= �)=�� ��)�� ��|�=Y���}|���G��B��׼=�D>L��<��+=��W=���=�W:=Z��l�B����;���������<6� =+
��(�н@�`=kC��p�ངZ��V��=�0>�s�=(��=N���—*�u ���;����Ӻ)��=cO>+r��� �=�Z��5�=� =�k��{�=�>�8�>Vr���ܹ=[`�=�U> ������ť;g�>�'�;3n����>3��B����;�Z<�wc@� .4>H8�<j/ܽ�Dν��J>�6�=�X�<R d� ܙ=rk�R4�=}u>w���@���s&�i��ʡּj�v���g=�����H>�l<���=QZ����<v>�,e�H������:�!@��7ؼ���=�����B�>���A���Rf!=����4�b]$��w�����!��Ѵ=�q=K:�=� >@�N�1����>�]���q�ͅ콠�G�H%�<��?=-�=�Ɯ����=s*�٪�='r�>������ƻ��o>h�<����cϽ�l�����=ܞH�y>��\�=�Sv>i�V��K}�˖�����>0;>g��<�w�=g��;�1�=���=^�=��
>���>Hc�<���= @P>�x ={����2�|����i!<�}4�Buw>�XA<���=�D=��>�`:�Mn��ѠR�l�u=1+�̈́q�4���X=v�½��=���#�����=o��eun>>[�==�a�狊=��=�j>�=���>�ޏ��=qI��N>-_'������l�=솃=��= �>��7��H>O:�s�>�Bս�誽ð(>�W�==��<T^�=I�<�x�=C�=w�� =��>N�>>j�=M��]V=gm`��m>~c)>�%��*����������?�=9����u=�)��ĩ<Xر�
�̽,#>�d�=Ɇ:��Ă�̮���\����=+қ=��=1��� �2�����G ��U>�I>E��>GA-��h�=��]��*���z>�sv���]>���=��>c�.>�b���W����;p*�>������=�H|����>�5<��;��=��q=Q>��@���=���=��E>cP���E���=��;�����M->�J���>����za��۽�- �=�&?>�:���w�=��'�a��(?>�G�=�<7���i�=�l >eN�=�����$#>��>����K��=��%���=�1N=c*�������{/�%�F;T� :p=�� =����Q>�y�=��n=�F꽁�����|�'��=��5=��!>�s齁��;c8<����=l`�{��� =�Y�=�g���Tg=�B��
n��p^>�UG>���v=> *9=ڗ�<1v�>��6���ͽ��;R>���;e|�=��=��= >����ٷ1��ԯ=�׽���<�;`��wm<��˽D|Z�Θ=��>��f=ur>�@M�;k�<���; ��<NҼ�l>�f��s ���B�����=�]����<����>��=e>��I>���=�� �R=�=D2:=�R���|`���5����Ͻ��O�]�=C�=�� �5(&�v6='�=���ĝ�z�>����ʚ����=�_;z��`��<�ˤ>���iT=�L�6�|=c~뾕��=��U:�:�.vO�}� >7�Y<@�,=E50>�����ǽ<�Ž��@=��;>3��=pX�=�̑��x&>���N7�N9q���>F��=@
ɽ��A=�&���{'�3]�=����v
>����J�L�<='쐽d��=p>��ͽ,=�`R>���=*㱻 �{�VF`��m�=o_ >*����c>�Y�=�O3>�ϛ<"����[���>%�o����<��>��
>J?��ln
>w[;(v����Y��B�= Y�GL�<�I�=���=�?����=�TS�G�h=���� �;�^c�>�Z��� � } �f���Z�;>�q��ӽD֜;���Po�<��/���N�t2A>��ڵ�=����c�K=�T�=gU�=F�&>����8K=�K�>�`�LC>U�����G�[�c<
�.�����#��f6h���<�@,P�:8�<�3����)}�H=[�=D�>Z>�G�=X�=��˽��-������g#���>��b������]� �M_|=�q��ͽ��b=��Ž*��Ww�>�Ə<!y=Y"=��=�D�=�k�=�5h<���=er��j=�?�=khi����w���:�����=��ֽbUs>Z�<;G{��j��ɗ�=���@P޼��=��޼��q=}=[>��>B��>�L=O����,�< ���4��Fl���ý�+P>�`�ę��N��=�̌=�8�=�'=i/�<����&}�=tk���Wd����K6 =����V��>����@���[=�}T>2L����<����!����Ŵ�;)t=��c=�<*>�!d�]�<���1uI>N������9�����^�/��=��X� e�<��>���=X�8>֧���=��<`m�=G� ����>�����Re>�P�C���.{2>FF��n���{D�=�=>��ɻ�Rҽ% �?[�=F�L�7H��?��=
��<�� �����\!�܇=�����9=�>g��<��f�2\>ޝz>ĮN>)Nҹ#Ͱ�IX�=�f�=�G���L���m=����g�[������=xyz=���=�_p�,��ĭ��q�=�ٙ���>GՅ= ��"�=nK�E^>���#=��}>�u>�[�=Z4Ľ��>���=|y�<Ƃ꽢�>:k��1#>V�!>��`>��v=�]�������=������,��:��$G�m,�=�"徵ှ�X���Cg>>�s��A=�1��ļf]>x�>���<�7�<>@>�>󦐽Rb�Ύ��V1�� z�=/����������z~7�i~=���=���;�²;�����>(�<D
<V�\��+}�� e��l���0n=;�����=�B=�ҽ#)=ґ=�F� j�=�&����;S���J{�=�% ���V��^0>+�����x��=D%)>g�4>Ӿ�=���:y�>=|��� �Ӽ؎�=(��r���� :Y7����"����=lIX=o'��P�Ұ����q>�%Z����<�S�=�׺��U�g�p�P��=�� ��T�=jS������3*=-�@:�۽�mF>d.�t���W������=G>,��s <�d<Ȗ��7G�=m��=�a�<�K�<-V=�I�>[�=�%>�f<~d�>dS �V�J>�Q^�Dc >_���6I>s�=Ф�x��S��=%ބ<'ܘ=���� �T=���=S�D>��B>L��=��<��c<*EP<8L;=(�ֽ�k�=*����➾'S?�j� ����=�c >�[�}ѻR�z> ��S����D�<7e�qؼ�����^h=e�ϼ�
>L�<`�s>��=�,�!kF<�6����=o!� mp=�Lؽ�>��l���N�O��=��ֽ~��<󫽣&��e�o>%KC�w+ �i��R;���%�=�E> �)=�3�;�CD>���=[�>_�o�FZ��ջ¼䧖;H���5aP��\���d�G ��Y�;2K��>`����(>Y 0>��=��2>��u>� >�7���iļ"�< OL�\c�<�nk��p>6��L�>w�ʽ�
Լ�L��E�=�<��=K�<�J���_�=��={���$(�W��<����5�<Ǹ�=4R>d��<� >� �=���=62�K��=S>�/=3EV�����^��=#�6>��<���=�hĽ@�.�}�H����=T����=G�^>���<�ɼ� =J�������J�ҽ*���o��=Q>+�m<��^>>w���Y�0��G�g=��+>�^ <0<�� =M���*��E����=ML����f=Ev>7��D������i[ �W�z=P繽'j�;�=cY=�8<��o>��U��e(�`��� ���P>R�<�e�K͈>r�>S�=��.>�l>��p�'>%b��$�=����~_��#˽Vl�>�i��A�@���sP2>�D��?C=;� =s� >�G.>���q�x���=W�;>)<�����nJ�Lk4< 1 =�.*>�.�<�A7�8�%�;��=���f���@�=G��=�դ��\q�Oi&=��T=*S�=�P�=౫�QH<���ƽ��y�.7ƽ��(�V�=~j^�1��9� ��� ��ب�<��C��� �h����sQ�[">���=xǽq<�����-��� �=��!��[=���=9�V> �v���
� ��=< ���s>0�x<
�=&oH����=,��=e>��f6;> ��=
Q�=��=�k���<.P���]=��]���B����h�=/��=C{(>�Z>�0�<a{>,��=��>��^=���<�G">l�{=�=����<����)6�=_8�=���=܋<sz=K���Z�<�-���=F5½�%�=Aq�����D����t�лF6�>�<=�ѭ=0S>��-=mP#>�7>�N>#��<�a�oH��x�G��#>����o����>�m�=�U>>��� G���n��$��=����=�D<�.:>�=@�=�L����=�m��}>f��>����� ����=���=M�]>���=�`�>�W޽ �<4�ӽ�ǒ=n{��%l(<[j���� >B���%G����=") >f�<�x߽)�A�k�轶)s;��=�� �5�
�&w�5����jټ%�L�� <Ğ��X�>E�=���=x3">{">�H��ï�$X̽��=�� ��g:=7A;���H��=^�;�s���h�߽��>�ı�ᴋ=J��=����O����߽��j>T��=�S�=F�=� \>�k >,�=��+��>I3��z>BVU�4�V�4I���Z�t^q�#;G<����˘�V̴��4��Z�>.J=�'3>R̿�dG�=2���q~�=$& �Qں�N�Ӽ�$��R=mz��dD��� >��i��=���=q����M>�@Ὦ�+>�]��G�<��.=��ڽ���=�C�;%�=�5>��ּ�B=.�����}=��A��}ɼ?�>��k%>*�:H0e�ꎘ=�g=(�����<(�=����N�=iQC=� J���<�I��\�#��>U�=��<�ʖ=����p�={ܯ���>�d�=M�=8#�=��=�����(>��Ͻ�9>��F�� ������M>Ǒ�>P�^��E-=�Wƽ�t���v�;QR=f��q��<a �����=�&6<��6>�l'>UŎ=./�E�T�Pzƽ�n>��ὒ�=9�=��y;����ҽ�p->�=W�����A���#� `D��� >u����"���?>�ކ=Лh>2F\=_|U������1V<�䦽wqʽ� ˽�{g>������<Kο<ND���=���=�J�=��7�>�[=VT!��V��Y����Y�|I��H��r��=��`=c���r)�=#�� �y���=Ґ���� >��B�pY =�Nh=��->& >N;;v|������ż#��=��a�H��>rY�#�ƾ�d��Ƚ4< =*��. >.��7g�� ���>>,O��N��ك�=���<Z*���
g= S�=�3�� ,=lx����4>�P>q�}=<�S��=Q����=΁]�n �=�+>UZͼ��ֽK� >JCü��L=��>�
>�k��t�=f�bO����=oV>�?R=X8z�܂�=���^�����e�\�Q=�_ռ�G��R��<H�F>��=�R�?#
���ݽA1�(��S�>S��v͖��f�<���=��`;lԄ=�]����=�ܗ���.�k��+e�=!սl���k�j>q��V"�<��H>½���#��_;��͝=.���4�3�Po��j�9>bm�=�����Sb=Im���t�=k��=8%��a��ƿD=����ư�!�2=�����]�ã�>�͌��>S��O=��1��Z �B A�9����>1�
���O��=�|Q={��9���ڊ�=��½;Õ����e*>+�W>�E�=v7��>���=�����I�<�(��Bv=u{h=�2�=ݺ�=�[Z>G���#�E��´�jI|��%w=�E��)����� =0"�E3'>ζ�=w��=o8�=�H5�e㚼D�= ��Q}��O�F=���= q�<)�<�0�=�hi�g�<>�r���~e=(ơ� F����Fl�>u׽[�ʽBX>�s���|�>�]B>��<�����ͽ)=����]=��Y<��<�>�'�:�G�=F�w=<�ͽ�7=g�=ߴ�>����電�tE�Z��8����<��</O�:��i� ٻ'����'����<@߽]�ڽ|�ʽ@� �]� ���j���=��,=�.�z�>Y�x=�U��l�<�n�=M>��=}#��{���h$�ޑ0=�(>aeu<R�=�Xνb&�<m����Ƽ� ��IA�ʹ�<��1�A�4>a������<�6��^�>=��@<�5�=?�d�$� ��:�⹂>Yܔ=(a�=�4 � ��=f�S�=�6I>Qm��X=L���!;>��;:��=Y��<{,U�R��F������=�����<�>���<�R>$ɗ�*�r0>�j�����>���=j�=���F�νkB->@�Ž8���꺌<=��<��潻:��Ƥ2=$�|<�W�<��<Z}:���Լ�/=+�F� }0�h/�=�!=3��=!2=����*�u<1��<Q:9=C�v�J�9��|"�K�N�����rz�><������?P�<S�=�G>��?�ap]>r�a�X��<JA6�1��8<��GJ�=e;=��=�� > >/IĽ�$v��3�;ww����=q� �����M�⻣
m����"�����~K>�/M��ߩ>�7=��������>��f��<d`a�Y�3����JR��`",����=��k�S]e���1�M����I�=�$<=�7ƺ�����5W:dK��e� ��2>��?=�9��y�=I�H>��㼾ʅ��� >"_i>��]=���; w=2���Į��M7��p>F�>1���&�<�b��u�y�u�>��;ػ��+��W��Q��c��;t��=Q�D> ��r��<�:���Ͻ���<��3=�r%����������$=m�S;��=/����$> ��������=��|������)H= �v>V��=+�R�J{�<�"�=K`�)��=&��;[�}=���=Ny����ֽ��ǽ�+>̃\��s�=�r>4^/��
��$�> %�=��>_X%>��>j�{=T�H�.*>{�;�K��j�>�7�=45K>�gB��l�=p*�=�D>�Y =���=`DK�Z�:����������l>����Ȝ�=��@>�7)>S���.�=|䉼��O� �Q��ۛ���;��5S�M)?>�-�=�S���:�f.����I�k��;��T��m�w���G�޽ >���< ���7訽(LA>�l�"� �勽��D>6m�=�ۊ>��?>R!�_
>�O�>�O�eފ=��}���1=/�e�tN�8�>>�,>�g��pٽ��t���=�y)=~��=�����j��R<~Y��ؙ#=Ľ���>�A=x�c�:G=�K6=��>�(��;>io#�T��=�ʽ���=���=`*ܽ-��>v�2>K��=gV�ր�=�R��\��=��5=��:�KK���~�==���.����>6��=>��=)ʽ��k�b�b�C&>(k޽
䥼�M> $�;@>M������=�T���ڽ��>�u>j"�Ӏ��kT�>�*�dR�=Az >�V�>+c=��i��m��%�<:IȽ��нb`@�Fto���4>"{ཎ8�=g��Ҵ;>�N��1}��i�=羢=������>����6>3���x� �Z�>>լ���)[=�3>ǩ�>���:���<����[!�1Zb�"�����C��E>��>�v�ک�=�6����f�-��E�<�b> 0>��K������)�=��?=�v>:%�=��<=���=�j
��ǂ��㙽���i��/��ڲ���=��k�:5��o�=�r,��9\>���=��e=ʱ'��<�<Jt>x7<�c ���Žo�1�X�I>�5o������xn<�
�<�܁��Ľ�W���ץ��X1���Z><���@����=J�X��<���}��=F=�鄾+#�R )�^�">p� �k (=�����
�=���=���<��t�S�~�a[<����>]I>n�� Q���N����2����d=�V�=&'#>x=�$<[�Ͻ1P�=��=>��=/m��3m���=�0��!����ڽ�%�=v�D�B�=�F���ս-ׯ�E�=�+�>j�սp]=ݩ4�]R>��6�)�<��1>��Լ���=sq�=�9p=0��<� v<%�2>4`��-]>>p9輭��=��=�﮾�>�p3�B=]�<�������6ѽi��=dA=ý;���=�!J=��9=��=�Z���~w��]D�P�;C���a�k��=�ݻ����ϖ=Ǜ?=N6ȼ��e>�*�.���2�=��p='\�����>8]�=uAi�Z�!�k�~=]��&�󸝽��)<P��<>fd�w�O��Y�=�JϽ��_>^�P:�ө���Fٛ���лh �������,�H.=�-(�P��=��#�%箽����0w>�?"==�@>0.�=Z 1�JZ ��+���0|==2>�
0�~E=�>�<"�> C���DM���=bbE=�ͼ��u����&�=ͤ���i> �">�R�=�N�>xs>��=>DZ�:��>��=�㠽D=D�i+<�v>[�>��=���<:����B6���D����R��C�=�e3�=[�<�� >�g!<a�5>7 =��c=�J>A�#�B����|I=y�=,�f��Ų����v=�pڽ�7#>�>�<����껄WH>+�`=���<�=#�����Mϻб>��s<�p}=2�P>՛5=�=�s3�$��
�T<.���㓼L���~=Ն9<�}���~�=B���8�=Zw��Pֵ=Rp->�����2�:V���†��`��{<ɽ��=;�9=qL��1D��M��=���=n�r��<�>i�����=��ν��d���=o�<����Wؽ01>/Y�=L;�"p ��=ѼzQ�Z3b;�?>�1=���=J�>���Xi�� �����;���>@������ш��W�=���=��G>M�<!Mj=yE�� =���<,�#>�tS>������=���=�Z���g�i�>��-�@���<��S>Cn�<�n�YZ���<�(����=�5�<.�� )L�y��oaW=VkڽE��<��ǽ���=��`��Dp==����̈�/y�=<1�<XVC�����߀��?A��Z���i��>%>�h=?鷽���=��W�F51��8��� ̼�|�=�߽T�½uz<P ��v���'E=j��=��>�%�7�j<�?�����=ے>2�!�D3Ƽ��=@�7�m�`��M�� �=NW�=oy7���e>VH �X��&���<l�`U�=����K��R <R�~=��z��HU����=� <+s=��=NnC�B���e���wi>�2&=x���U�l<��qִ=�9�=�qv�p�<�b���->��v>���=b�\>�Tt�L`��o�\>��������.��cY��y#��_=��S�j�W��V =݀p<���ꣽ���&�� �'���<>f�+>����v�%�7 1>\��=��=��<]A;�L�����<����+཭�4��ʵ�6�½"���zB�W`=���=>�����<��=S<>���=�=��=��H�~�ƽ�)&���O>*��<Q 6��p"�����1�o��=Bo��Zah�wdy>��;F��t�,� ���TW��ܟ+>GT �$R<ǯ��o�=Կf=�Y��E�
�G>G��= ��8yy=���=;&ʽ��¼�-��0��=�R<nk��p��=7!>n�;>�NB�-E��.�]t�=�+����>�@i���i;&�Q>ᩖ=�X�=��P>�)˼��B�� ���'>�!7=�D�<�����qݽ�YĽC�2<�엽�>�!�P 5=8�v��j==��=v�0����=U:�=�i�DI=��>����(>?>��ܽJ�:=�z�܃���h�J���-�=(�~��T>�=w]��׼��;=�>��`f�ר��.*���d���#��g���L�}y�����;�;83����=$��=C0>Z�)����=&q�<5o=��=Nd�=�@[�{.�>Ǭ��������<e5,=�1->��;��k�� R<�Om>y�0=F ���=�@�F����]{=��8��zv<)�$�g���`6�=��u�\�}PS�_��h�O�b#>�j��=��彼n>� ���I�/˿��,��j�����,O��-���>Q�����d<_ђ=�ԽN�^����=F��=�{T��bn��45�wg���=Gk=�4W�ݯ���=�����~ҽ��)�Tс=B��<V�Լ�
ѽQ">8˽p��D�����>þ彙 X=F���&�'��8>�W=PM���$=�z_;��>�wo��I�=�$�@׽�>�=T�<���=��뽪E�=�c����<�"i>N��<���$޽�NT>S��=i��:U��=��=��=E�=JDQ�||�>
u�؛s�&ܽW�Ҽ�8L�� ��O.=�`�1�=�b��=�F=,�g�{C�<���<HaQ���ün�p=�o{=��ٽ���>C�"� e>m�ʽ�\{>T.�=+�O>���\ �=�!�=�Z=;V>��0=^-Q�+"(��μ�7>�9ܽb`��!�<�:�>/A��,G�=�^8<�>�=z�S>m�=����K���>��T�=}�w>\>���=�":���=�1���m>�ૻJ ӽ��v�����-v��$�~��=��>�8)=�k�>����� ȼ��8>�GŽ,� >ǽ���=2)��ݽ���qP�۟�=�#�:8e>cf>mֻ�va=D �> �z)�>���-D�g��-(=�|>�\�� ?��[�=���M2>��|��jc��pt���>�8(=�Z�=<nQ��%�=9K(�}L׽?n=�1><9�=���<��@>W����F��Mw=�O�=P� ����P]��#���N�=�T��
�X��>by�<��<�ɨ[:�Q1�����7�<�����<6��=��v=�`"�o�;�tt�=ė˽ȝ��s�$�@U0�o(=sM޽�4>_6=�>�/>�17��[:=�q�=h�r��R��1��=ew��9P�=(����e�=�����ӽEA$>��y=j�轐*Q=aa�=>�>]��=� =_�<#�`��(�=5Zk>U1�=�鬽h��=-������<�>a��N���ϗ>�\ ��x>���=�����1�=;�7<﬈=�����ڽ�:2���*=�1<��}Q�P��0��=���=�6>��ӽ�z���=�{�={�>� >��>6�h>UႽ��O=a��=�C�~�D��k=��˽�>����=�������B�8h[=���<�Eq=�W�=aq>1��i�$<zP>�9(>+9Q<���=��>�mS�b�<�M��zQ��Bz�Ɓ�>�3�����ӫ�=�Ao=�L1>�`���&t�!PR>��E=��P���D<-���#a���)�ہ��][�=G.�>�y�%� �YD���ٽ� ��:ش����;���\1=ֱd>N�=����=�����a���R=n���{���>��8��=�s>�t�=�߆=���=�[����\�eVq=��> �2�W�<�~�"1���r9>>�;Z�<��8��2t>o��=�y��ߑP�Y5���5=�ٴ=E�T;��A�Y犽@�!���>�8>�0�ϭ�>��+>ս�㒽e�=�*��<M+��DX佈�i�i��=݇C=��&>��\��p����W�����ș@�v ��~+>�˹�?vνP��=�W\�". ��<�:jܛ�]6�=R(�>��!>���=���_�=�Fz>�`�=A| �Lr��R>�&�=�s��M=�=J�Jy�<� �<�~�=�����費>�K<6��<��|>A��G�-��d>���G��=>�<>$��<k�<jeN�H�-�k�]<��#>�������U=sH2��(�=c�d>f�v�
>L���a>�(&>X(�<ׄ>Eտ�Z�;�K��>��*>_#���)�<�N9>A�[�UA>t{[��k=�GD���/>���a��=4$>����J��������
<C1�:>��'=�2{�L� >���������߽�e�=;"=��M:���I�>}.��dkG���7=��>��<�'N�hlq��aq>�<h�{�i>�O�[�>7u�����2޽d ;���=UL�=����WO����3�����V�����h��<
<_��>Ͱ|��@=�,��*�:;5B�=¡>�&�=�u0�u�F=��;.\�𶔽�V>{��M,D��n�=��L<Ƚ'>�o�<!b >Wq������ �v�%>�j��j�x>�~2>x��<�G�����)���@7��rC>.��>������RSd����=μսs��<�����>$*�=���~0:���=���=ί=��i>� c��a�=1�<~�g=�‡�w`�=�Ua=��ӽ�d2�|d��q�D��I���}S>���<tÊ����>�m3=p,W=�����谽\ �����|��R�=0䱽N�>[� =F�>��;a�>V� =��*>|[̼��9=��s>�u����*�c
�=p>�B���Q>�#��͐��M��Q��kI�.����1G�4k ��K>���A$(����=�_$>6X�=�vp>�_�� �=�c>2��쓏=���=+Ǫ=����`���Jf��T$<(��=gY��龒�Nq���_��W��lg��k���/�����<�[�<Ҫ�=_%^��5����G=��J�#��>nD�=u7)�Kx弁��='"�"p��2 >ҳ���=L;5>��)>�Y��"�=�!�(d�;Nu>2+[�b�Y<�9����@ ��^���W�=]�@>���=
�<>���e�<>�Qf��/h�k�=ûƽ�ꎼ!�X=��=�,���������\ ����h�]��O�=�v��G���e�=�u��F�=��=�����7�=�0v�9 �=7����}��Ԗ=�ü���jw�;��<���m�>���<����`)��)I�딓�6U�h����2>%�2�-YQ>�����Ƕ�Sj�����%�!�;G�=@�ٽ��e=l r>:ń>��=��=�d�:L���?��=�[j�����X��?m�=)b�=铽�Y������� �* ��h��G�5���q���>�8��L�=�Y���'Z��)�_���j5߽3�輕(��Bx\���8�m���ws����h>��d�ý�����vѽPy����t=6�%���6=���=��៽� >�ҽKu�=�����OZ=��L�����! F=�"u�w!�ڟ>`�28�bc=��.=����"aýVuּ���� ����=n�A> ��=�@>��=��;=n���kZM>�I��Y{�;_%���w�]�U��ځ=�gq=��<���<�Y����<�?�?�'�0�=�4��O�s>E�~�c�>�m�<��=� ���?�>xq��S�<y�!��=EZL�q�E<Ǡ9>C��N�2=ME�;( '=Ȁ=���b��=��*<AR��lj�>��۽;c�<�Õ�=�q<cZ��"OY<8�X=C8���\>�R��\�n!���_>X�>d?r>��1���>vk��B8�CM =7��9W��Mbi���<*p>7��;eiH�Ʉ7����=tu��-�<��>>뽉=N��q��J�=���<�X >8��<U >D3�=a�<�˟�X)^=�>����~�ս;:{=�B����(���ԽhE���*=.=\m �J6<�e�=�$���<��<>.�8>N#�>C�> �<q�=�������=�-2��/�;d-����=a���n>�,>:4�<x�F='f�=��e���'>!�g>'o�MO�=�F�>̣�����< ��=v�=OF�=��A��2/<?)2�m�>�'�Q0Ͻ~�G�F&o>�L�=…N�d��/K�e��< Ӯ�\|�=�[��W������]�C�⽴>��`��2�q㎼�j>�M��vP��t� <%���:���zR�R<���MQ>�y�=u�J=%�'����<p� ���=i�����3<�s3�yߥ;�2=���=/}9�R*��O�<<*]=�⼖$ܽ>����>��!�Q�->��Y� h+>E��X�<&������J���`�>���<��`=�U��^��<��>�Q,�:8�=�Y��Hk��m<)�+��ʌ>�J�<
/�B�P>���=���<���a� ��K>fZ!�X�>��=�Z��� >ˬ׼�4��D =�Q ��n =rw��s��G&+���ýt��=
�=!��==Jge>�mw:�AF�WM(;/k*��#�=(�\�+�J�V=/ m=�-�ϕ�= �<#�=OЇ�,y�<��żd{#�3%Y���]��(����􈘽v������=���`��<59�=���=��J�>���{����;�ν�� N]��8>�+��Ȼ$���#b�=�Ö=T�:�{=t}=�����G >��r=~���o�=���� n%�mҼi���i�=��`�� �>л =�.)��5=4�h>�ý5�>k���w�.����<�|k=�k����ý�2M�P�0>�=ʛ�;^�>�u=�'�<>�ż���=|�=�T&�n6*���a=��=�V=���Nho�̋k=Ѭ�=�(���>���׽B9��*��C�>�6D���3�R��<��x�4b�=�>��N ���"=�D>����K�t���8�h�=�A����M=�͞�Ɏ½B$���q=���<r.���{�,el�g�"=oĹ�mԾaq���h>ir=��7> >�:�=)�Ž�,��
A>���=��W=���9�x�;ɴ����J���R=�`J>ғ&��$��ݾy=�=B=�dƽzJ >�GB���>(C���=�����r=��żzb ��]>>o��;K ����={��=e<P�����R�� �:>�u-=؈>�=�����=ΐ>�
���^�=r�c= �>�4��`ݰ���O� uU>X�ں��y=���P1�=��=�� �f��<���4LZ�����5��=��<2 ���>j�(7���=�8<�:�{��đ�~� �<�ֻp�c���<:�=K�U������O���X<ݫR<gc-����< ���H^>y���O��̳7�.$4>�>��%>�Y����>Q� >8�=�� �2ߴ���=�L�<6���5ȳ�*�,��h[>�mM�o�d<'W> <�>e%=����� �0ؽn��n�> �)=�Sҽ���=�0��)VK=���E���1�=�� >�+��՟3�RK��#>Y3%>� =�p/>|p>��P<^4+�O|�=�I>��޽�� >�MV��Li=~k ���<5I�=���=�j,���C>9�;K���'ݼ����|����!�9��<�����Ee>NI�<�dI�Lս��=Q�!��}>%~+�F�j��}�=u��<�Jl�v/W���>i�!>�Ă=k^S=���=Z5���i�=f>�A�=��e>�h^>��U>.G�<I�>�z�<����)�<�� =\8�n�6<�@=�*�1��p�o>��>����y��=.����*��p��И<�O�>���;.bd=!��=���>��V�>�S󽒸�=6�O���i>]�>�y>}xA>O�>�u�;q� >V���:>���ʑE=�ҽc�>�?�<�3b>�^����=�hʽ�w>?�Ž ~�u��<$;�=��!>��=��=�G�����=!%H���Z��ć��&�(�v��TYq��u��U=8��<Dش=�g=��>�1>t2�<��>���>��=�*C>�F���>c����;C��� ����Gl�=�����>�
�=W��0����8˻�����&a>�x<=31���� �3C�=V��<n�0��P�����=0�p���Q�ὦ��={ r=��ʻ��!>�@3>^�ܽ�oM�����+ >�IM�����f3���ܽ�&�?[�u��<��>L�q��t�=��G�7�����7�q�q>�н�>!�����?�A��=����]<=���=�����*�=-�н����:=��=d+ܽ���=-�o�]=����<���[���u=�>�=n�R>W����^�x�=�I:>��f>�݂=��=��BL=B�]��#�<UO��~�=�.*�#�h>츛������2��o����4<zT#�E~h�b�r>k ����?��=e' ��g>�`�/2T>M�;�4,>��$>��㼼�=^p:=�s�=���=�8>nb&���<�䏼(a0�p�����d�@�o�O�0���1z>w�Xr�ц��u��ލ>������=7��<RUH�� =������1=5��jL>T�=/|�C_0��w;ٍ���:6>-����n=��=CM>.���ց���^";�c>�/�!>�������G4=��*����4El=`h��v �JN={�N����= +0>��=Z�=�"�� ��e�=g^"<d�_;��8=�߄>(�p�^$z=�/�={�>"X
����=����$S�=JT>���<A9�]�s=Ŝ�=�:��*-��b�=������=����I>F���jO>��"�H��=�̈��$=�� ��K >�#��� =���<y/=Z�'��>+��_Jb� ��JO�=��P>�l<��=y��=bp����n�{߈<�1>�J���ޮ=���=���ar��4�T�=oω=��?<��н�"�=~[='��<� �=�L���ݼ�*���;�'���N�����=E0=���=*ƽ &l�D����򘽴�ٽPn=�h�m�s�1>~�|��m�| ��%���J�=��6��.F��S�;@�>�@�;p)��M=�!{=Ŏ@>�˼brZ> ��:6�^����n�=A{�o�a=Ȓ��L�R=�]�F��>��=�:Q��x%�s��>q���ᄑ l�=��@>�:Z>>��=q��=KI�<z�Q>`f��𵛾��"<�i=k��p�m�PL�>dSؼ�Ey��D��Vo������bHh=ї��2�k�<L�>�.1���l�.;�w�+��!�$�� ��Ր�=�#���� ���c�%M���p=W�&�y�->U��<�;������6�=�s����>�h�<��<%@���(=L�8���7������՞=/)��cY��Q����[J<$���9�=$9ܽٱ ���$���K;�a�=�Zg>���g�f=k�c=(�:�ɕ.;0�=k0߽�8�=&Z���CN=�����g�M�8=��>-��4��=/M=�|���>�0����%=h`�=RY!=1��>��X=��*�% �=,|��z->�15���:��=μ�6=H�Œ�<C�/<
ô�Q (����=b��z ��^��w?�=?e�����=�;D>�̉=瞰=++�=�;}��=~��Q>��x���#�f�=��y=��`�Z��) �<-�����>�PP>�U*=J� >�'�=��\<GD>)� =7[)�w;ؽ8��<���<0쵽V@=�*�n�Q>�4_��2)>� k>(J#=�N7�w�N��D:����&"�=[��Q�<�����9l=5�d=�ż�:>CxN=� ��T.=X��
��>�Q�{R��3�='��;��=�aB��I�g����=+��=M⻽�vD=���>���?�ͼ\TK�n������Ңa>{�� ~ü:D�>Jï=2퀾�<G�=1<q���O>��x�u�=�q��R땽꣪;ݝ�5b'�3�>��F��Z����OG>�l��S=C>����O�=���=(�A>%�.�WH�=>=�����@��J' =0�=u ,>1!w>�
ּ1��(K�<����X>���=@�cuU>Q��-�g=�\=Gȼ�f�=�.�:Q�=�K!��]�<�eE���=�-�=�����}���>�:==�V��d'�>��
��p�� ->>I_7���d=t4�=>9>:�x�Rd�>�L�<+�7�h��=(a&����=����,{=�+>�v�=����A=�`�=��=}�6>�@K=>�i��b=�������ᧇ�IbS�㪺���?�a�Z=�/4>�Us��9i�#F�����Q�=���=�#���.=��:���=��>U��=�琾8�>� �'�=�Y��)��N�;�9���Sy�@ s>Mü����X>�*���tg=���=�Ɣ�w�齂߉=C.�=�W�=�G8=VD>7�K�����9�>�#�=��J=��R=� �����;&�=d��=�˙=��B=M�=����Y ��R=gZ�=?*t���>f�����ȓ���HS<�����F>���=�&�V�\=�\�=�=ħ= ����>Œ��ɻJж<+m�
=]m-�:�_=�̐=/��=��^�v>����.=<X0���{=^<��T>:��<�n���Ͽ<-��=�=q�����>��J��y�=���<7��=K?\>�z�=�g7��z;>����В<V�� ��� ��=��t��ޚ�o��<\�3>'p=I�=��4=0K������{��B�����B>�J=3">G���/��0�=�e����=�G<�i��P���D>�U�>�f�=�/��3>:�8=����:�=�[N��A������E�=I|�=�v.>F��o��;7 F= ����T> �]<Mv�����<S4>6M���o=��2=ߵ���}�<�k���`�;�1��4Q�hپ�7n��=�G0���7/>2���M<Ң���a/>3[�=%��=oG{=A�X�i
H�ۘ����>��=��
����<��=������<�yA>�]�= �=�/�>\�����<�����H>��Ƚ�\���N���= R]=��8��IY���q>�>��4=벬=��?=�d>�Y�=��������&>`Xv=��X�%y�<�^ �k��=ekg����<�b=���<$�����B>|�I�@�>|�.<cT��&6J�N��=��b>�{~��Zq���=2%�ё*��̼O; ���%�㓴=�Y">0e�=��c��Ѭ=�Ƽ���=͆�ܕ��Q��ڀ�=v�<p�Ѽ�y;���;
���9i>c����X=��=Z*�=�Ƴ�U9�<3�`�lĎ�g:��/��Oǽ��ǼpЀ=׹�>�d�=b�񺃚�<���=�=�ٿ%��P���W�=��=T�ό��g��+T6��ǎ=����X�L=�<�>K�ɽO؜>�S��Ս�= ����q����=�(o���<�#�=��J=� ,�B���:n� o
�ꫮ�� 2>�U;;�X�>�s�< �>f(i�> �=��=bE���ݘ��Q��$�siO)>tc����(>���o�<Dm�<���򱝺 ,������Ip��E&�ά��=���p= �]<�͹��Y>Ri����=M�����=@� �7��=!,l=����=�ҽ��ݽ4 �2����Ci���)��t��y�l���E�>3����:&��4|�������<6S&=hk�=R/�'��=��ؽ��;����=�}x=������=0� >ڄ+>�Zj=�U;!*��{�=��&>�U�<HO,;GY��P��d�@���>^�:�x���v��&�=δ署�>t�=�>�>��=�� ����������=>�)�G>�%�=+һ�3��]Z<@y=?;;< #��g�h>"����K[�^`����>�lG�H��=ڳ=�H�=��ڽ���>�U����=p_�32ֽ�����_=��Լ�S%=������=F�9>}��<v#K��O�<|�%="`s���'�np=���Ľo�=�ƹ=H:���l ��0>�$�*14>�
���*��K<�Y�:��<���;a��>e�Q�kϽD��Q�=�=�=��归���(3� ��=W>=�s����->��G=s�+>\7�=�:J>$��� �\>hH6�e]>d��=I�a����������>��&���=���=�;߽��)=誽�9�=aOλЯ��͓��N9>s�X�C?н���͋�==&���]%>�r��ث�}���ˮ�=5�`=�*C����>��>��|=C�����!� ��;=�|�=؜Y����>ԁ�=}��=��b=��F<�U��7���3�\f���pQ=9#8>x#�{���xۄ=�Hq�;�񽰇����=_5=\�>�vm�cVL>H�.�� �=� =�1|>��j<�� =p�Y>y�/��QH��>D�6>E�<�
�=�;=2^�=F(�=/��=&�L>>�e>�RC�9����=6���e�>s��=�}>�zP��M�>�F��kE,=�US���ӽWJ���O�~���c$P��s �>>�=�x>�oB�L�"�sh=��>���|=R�н�->@x�Yq�=�PW=@���Q�>���5��&� >i� =D5��uݍ>��@>_��=T:ݽS�B����ɏͽ�.>�Z�=_~<��<M���X�Ǽ�t��"�<���=)Q�=��7>h��>��
>(�\�'�6��
���~�R-<y��=h���!"�=3����=O��<H����=d2�~w���
D�O��=��q�6 �=k�>��Q=�
��R��z����V�=Q�<��>]_���=�}J�*^�;*ф=�= r:��X� �<�_a_�t%�>���󾌼uϐ�ǼF=�
>|��k2� CK=�Kw��-�<(�Q<%��ql�=ص*>�wm=��]�C0>Fa|=���=��<+Ŏ=�Eٽ��,�H���w<=��#��q�=?��#?l>Y��=�g�= �|=�o���f��1 Ἣ� �24>���J&>|�>=�P/��O��Cǽz">I�6=>���I�Ƥu<����(�<��=��<�pPr�l�~>���=�諒�wx=Z&����=e�<�j�=�:ڽ� ��> �K��0 �:��!>�k>y=�=�pH>���=��ƽ�<��N���.� ��=(
�����ɛ=7K�0!���Խ�d= �=�wC��?�=}<�/�4��v�'���i=V~�=�no�ovT��AM=&>�<.< �� >���m^h=j9�=��4�
�����Ź�=Ź����< QD=���=R��=�H��Ce������ޞs=��=��=��Q�5�t<�JS�A��<λa��L��<�7��H��0y�=Ȟ�>��&�&�F�tJl�+W=�M�=�ɿ�W����<T��{nL=�o�=����=c=>�@=�O~��* >�I��,�_��ь=G�W>|�>�N<�h�E��=1M�ݳ���r<�jܽ ` �Rd����<)~�:����g�G=�k>��=w\?>΃�<��?>��\=��=ʻ�����=�= ��=;nF>5(����5=\]=� \=Ý����i����:e8ƽO����A� =��캷=o���\н��=��"��Y�=x���3*�'��]���Ǽ��:�j3���ơ=!�0��p��d�=��P>�i�<����6j>>�=����lɼR�I��Lh�ǩ�=��$��
$���&=#��pW+=������T<�tW>� ���~:>��I=� �=�W>ju�<E_�=Z.> �����=V=���=KL>���=�l�=\���yn<�5�t-�=_/ӽ$�<�[h�ֺ���9=�N�=�(��#,��4U>7��=|\ �]�'���G>�-x�M��=X,������=璝��$E��V3>�+�>ؘ�<�
��VZ�=�*=�C > �'=��;>�T������!��e;=� �+�������
tP�������S�d�s>�� =�;I>���/�.=�*H�z�>�ݘ=����Vq
>�|y>~�/���L>��(>���"��=�fP>U �:8!�>jz�=h̔�5��=W�W==-!>�'=0�����<�ؐ=��">�!���;=��=5׉�G�O���P=J�=���Xf�<��>wX�=^��<��=��T�4鯻��o>�,`�k����1����;�$�kIk=]>�27�B�0>��>Ü���� >���=.܊�� ?>�<g�,S��G��[!)>���u���G�=�Ί��v��ɪ^��Az=?�+>��������8'=�^�>�$����=�r�ߺA�'ԣ=��=���>^_K>���=�1���Ǽ?1�;es�;j�5�}��=��>N����T��K>����v5g�i}���=$���[<B��<O<�k#>�,J>虀=�7�=l �U7��꺽j6���\���}>�V�'�M<����V��=�>��3�j�@=P�> e->e��=�K%=���J�������{=)>��*������=܈.�Tܮ91)�=$\>a�ſ��nσ�U�Z�d�F���弗�c��f1>)hb�P�@>�p�gz����U;���<�L��B)�=�Ł���)=�1�<���>�!>�Q��y3�ZI�=�絽Da�= �0������~�D=� �=�褻�e>��)>},>.7�<{�Ͻ�O��t�N>�>꽊,>��3�O:�=L�'>_zW����=E�=u•=����� � 5�Q�����<5(>$��f{�=$>Ľ<e%����n�,�֢W��6O��f>��=�g����\���a>�y��-�>��ҽM���J˽��>.v>���=����>�"7>\�f<X�
�;&5<�z^���>���=:�_;Ty=JZ#>��ӽ�5�����`��>�l�i� =)e=2<�"�@��<
��=�5@=�sQ>y��ܧA=.��=��� .Y>�{�����m��;p�#<k�v>��~�=wܽ���=��}�v�����=� E�>DQ={2G�1¼(��=���=T.<���d>>p��I)<�����>GfT��|>c�骰�.n8=�[
��,��א�=ъ#<i'�=���<���<�i4=,a��ϻ�Y��<�
�=|FV�.�Ľ@������=�ؽ���<;`�=��C�/A���>>����Z���-ƽ�$ >=wʼ���<v0�6h:�Kƽ�����=�r0��=����#����[B>�@��b=5ꑻ��=j��=)����l��� ?= O޻�u�=���=l�q�4Z=��v=ݎ4>�2�Ú>]̪=�,���"�P&���8�_TQ�w��=+���X�;$ ���ǽ�7��-��{�ԽR=>?��B���˦U=�yM<�*S��3g��Xѽ�.��J>w�@�6��6a�=�@=G|��!r\>C�p���=���{�=$���g =
y�F��=��!���>�,�Mg >ӥ�ƬO=��$>� ���P>"Z��@�ݽnM@�Fi>+T/���>
n�=3��=��C>\^�>?��=�T�cq�5�=���=�'�=�����X�=6��=��=s(>��=�Z�=8�<��[��S���=�ڳ���l>F�=!vZ=!�D�Y�8�k�0L
�Ƣ �*�l=��3�1������%�=>aB�K�=�#�o������H~ >��n<rAX>e)�����t�->1��=��>��/>�_ݽ���>U��`:�>���鼽�qA=
��=�.��O�n>��<�g��i���y���}=Y�C�L����i��X�;�\�>��,�,�t��J�=��H<��<[>�Xq�w�>U�3�l�@>t�Ἂ@P�Zf=gtp�t��>�LW�*wJ=V� >�E>4,�=#GN����=w��=1�.������)��n?�=c_l�^��=�����jĽ>�G�7uR��z�=��c=g��<��=���N>�_�����,>[��=`U�<�6���g=�L=�bf=i��=�I,>17��BaL��}�Xh#�S���e��ń>$Mk���5>�z���*>�qe;v�s�G��<����������="/�=&#���`=��w����=��X�Dv =�AK>�����p�>�* �T\�<�~�����<�j���j=(/(�G���Kt�<V2?;K����:�B<��=xk(;�Ի�K��'��Ӏ�=(S���N�U+��{�>d���=�k}׽�;��^����K>���=3�*>�,��lŽr:�<�vнK����GG>?`�=�!�a�=?e��U���L.�=+U�=�#J>�Ո<���=���=p�k>XϽ��-��K��=���=����獑=x{ӽ��!>}��=����r`���ӽ,9!>�=DE��뛦�$���&>������=�e�=�$ �� ��Ǧ���~� ���P>h�7���>b�h>���;P�۽Z��<�`>>1�Ľ ��<������T�!���7�Y�-T�=��Y�ò�=��<��Z=Q��;���s����>����"y�<��>������=�NM�R��=q�>�����.=v��<.���<A> ?3��d�=�_">>^�ֺ;�Ε�����o"M��y�>��b��T=i:��lȽ���:��2>����`G�=�J��61 >$�8��K�=6g�>d<-=���=�U`=�YD����+�Q=WMH>!&)=��ҽ{`D<E�Ͻ�z4��H>���=g�">gWK>���=5�ݽ����
�ν�Q��@N�������=����=E�Z=�V�=R5r�Е����=�m���B�+�<g�>A�=s�����#��1��CO������s=�K>�O4=`��=ȣ=���<irۼz�/��7<a#��\���#�����~< �`=:��=J��=��p<�Oe>Ս��g ��.�� �e�[=��>΃ݼ��{>������μ'�;���H�o���*B<K��8;{��8�<��=C�1����>ڄ=�;<=O82�Pf]�̍<N>��ƛw=�1�= Ƽ�C��-�=�� ��MG�rF=������>�5=qR��">�q>KI/�3}D����<!D�=���<*EO����>�������=D�ҽ�^�={Y(�;$-�ު ��U�<O�y�'�"��=�ڧ������V>&��=1��Jd�<���;CQ̽��^>��A=:�
=w�<�`=�5����<�]=�L��}x=��7�����53�G:�=�"��Y=<��=D�ĽJfM>�\e��(��c~=-=�?�c� =��;�|E�!�½�h�=R^��Tp�D��=k�>:��;>�꫽��,=<+�;�c)�gJ�=4�]=�0>���>6{,>�7.�qá=��R>{�= ��9�>K[=B->b�E>*�!>[,�]< O>�=���=���:�=j,�悂�}�Ÿ�������=,�A���;�b������(<���> [>0�g=/>�cz=�re�W��>�߽<1�>�Q=[4?=�o�=�̤��->c� ;4�к�%|�E:�=�1���뽢��<� A�w����;��׽B��<�ٌ�ZcK>��>D5J�(���ţs�_�����=�W�������Ľ�n,>�L�+��}�>}�=p<�=^���*�)��=�=�ν�gʽ���Q�->~Ƅ�7��=�r���w�����=ȷ�=Ԕ=ks�����=��2=�N޽�� =��@;=ɣ=Bx�����;��So��:=��=ta=cRȽ�,>
���9>��Ͻ�{9�N�,��#�=�n=�'n=|��I�|>�格6��j�=��B�˶[����D�=nw �,e=1����d@=�7>�g=��E�*�!=К�;��(>vn� ý�T��v�EGl��3 =檄=q�=�Gv>S_����=0����X&��u9��Mv=�.z�^5>{_ٽ�<��g��Ĭ�=e�9>����^�T�͔�=er#�6�>��>�D?>=����G<���=ɵ��C.�>ْ�����<ʽ��lE��꘽E���K]>�i�)2;��=E�ż�2�>��_���>l�8�F�ȽX9�i�>��սH� ��b>D�>����d9�O;��������ܽ_j%��kf=���^4>5=4=c��_OS��OX<M�=��=&�����Ȕ�=���.��d$-����=`�����=U���CH=S����$>k��ڨ>L�m����\;5��r�<�;=��� =�^i�=�+�=S�=�'1����/�/<�0��^��=a�������w>�i�`�[�8��[�=,O�<�P�>g|=�& �xXb�G�� �����V����=���V�>������`���Q���P=Nώ=�a6��E�<Y�=>��:)�=#��=��׽䈻#��<㓘��>=f��`g`>�}���-=��M�Z���|���?����<���/����T<�*=*0Ƚ ���q��'Xf=9<Ż�=x=��5>ֶ�=��y�_�C���">l�:��Q=M4ͽ}T�= i=4;>{�L���C>CP ����=w�<P'�=��b��τ=�U>��>=�"�� �=��h=�V����1=[���>/N=Fc�<c��<��o= "h��ɋ�N��;�?>��W����=�P�
�r=C
|=[���7>�<�-
�>�^���]�$���2�q>D�$�&l
>�,`>����Qp>����j*ѽ>O�=P�������O>�ٲ=�p<m1>��>7���Vo9x�c<�0����=6�3<�>¼cC:��轱��=��5�{�#s�<vD�>ۘ�=��׼V�ͽ���hg�=�����>|!�W8< �l�-U�=exU>�<[�N��/Ͻ���=�H�������a���۽Z�=}��>�8ݼM�˽_T�R�;���<��=^'#=���=`w�>~Y�=���=�>�N\��O�<؈�����<��z�e� >W?H�-a>�6��)E><�"�� L㽟5���5>8m��3 �∯=��<�-�=�lj�Zh�=���q�H�=�S�;�v2>�um��!o=;��෽$B=^��<R��;5�=��L�?����$K��T�=��=<��=wE��
b ���5���C=��������K���ܗ��g�=��G��W^�6�z;'����<>ta$��T��������[�N�5<[�=�U�)�Ճ�=`�== ���P�=&i =6*Y>Pfмr-�=&0�>�>1>->2C�����Cv�= �^<�=>��>��==�}=̎�=���<�Ъ=�,�F�->�c���w#>�15=ݛ���A=د�=����cD�=4A���->�΄��>�L��!�q��`�����<v�Y>�Dͽ��0�&
��k�'�&�<������<ٰB>� ����l;a/�;B =�� �'n�I����+>�/νִ=�W���B�h��={�=Iu��_9 =�Y=7��>��h>c�t��Į�J'���u:>�E��B��=��>Ƙ ��"c���p=�k:Z����er�=�1@�K3���w�!&�=O"K�����Sk�њ�<��#�C���d]�:c��<�M =�����B�eX�=�[�w2����K���༆\d�վ�<J�9��q=ᴐ=��P>�c�L^�=Y�2��P�;Uﯽ�_�@�=B�> $��U�
>D���4S>j˽��aٽ�����t=9�L>w�(=��F<[���\�<�C=�6L=���<>ξ�<�s^�|X�=)Z�����x>5>�¯=<G6=���<Oz=�i��1�� ����5>Og�<�Q�<�N�A�<9eF��.X=$!+����=�?����Q�X(ýt;�<�!!�d=R�����⽡s;�=�������AP%>�>���R������b�=�:h���9:��8>I<�=l��<��1>H>o��=O��Њ��p=���< �ݽ�A��V����L)�ͽ�=0u}���*>E����&�=lW�=�P�>��޽���=� �=@��=�52>�h��o
��
T=�O��}%|�V'�=: &>p ��� >G4�=p �=KA�=on+>�b=F�=��>��\>�B��+Q�=�J���™��t�hz=>x��=�('>鹓>V�+>�Tн��7���ɼ�H�>έ�=Zu �D�
��̽��L�:j�=i�=0e>�6��rG�)z½�f�=$A�==I���C�=%q��\���+=�Ģ���U=b�->�1 >�h*��c�=!��=o=��=� h=�#�=|���SF>��>�L7=0�뽛���6�A=�T]�����КG�(64�*]�>� >w�6��z�?���Ǧ�����֓�7_f= dj�KE/�&� >�� >�1޺�ä����tO�s^���A�����>W���(�����<zӽ�G>��j>������ؾ.G=)������<�=(eŽ{`=�2 �|:�=�tr��]W�� ���=*���7���5y�ʒC>�m=�`������=�8@��]�$b�<�'�=m7�, >�a�i@~���L=n>_�����x�=�̶�Nq��[�&�`丽 ��<����
༶i=���=�ȼ5�н�K<�:O>H||= "�=���=��&_���O5:���^�0>��=Գ�=�,�=��ӽ��4<� ~�G4>X�!(�<��<9 �>acI�C�=�9>:�<�ȕ�p`(�5��;�L�<f}ս�t8�g�4>�������<T��=w"�=k։>�xl>[}^�ԁk=�\���ӽ��==�ԓ�\h<*�>ϑ�=�Z{������?=���=ź>F��eZ��� �� ��GZ��㘇<T��>����� �>���<A�9�&���HE��������������B�� ���Z��W�|�A;�<P:(=ºƽ [�6�U>�� >���<6�=�~����,��>D=;��}jW>��=��ǽ?�<;���X��[c>��&���7=E ��M���\����d��TN=��5=��
>�"A>���=�I޼/�F�յ�>�鼠i��7=��={[>�yJ>?׽8Nz��ؼ���\d�=�9h��B>ㅽ�z>; ����<9������d.>=Iɽ���=��Q��*�=��='h!�H �=GO2�q���^��`��=��lӽ���ƽ�kk��.�=����@���m��#�=�p=�
<>�=����}*�5$I��%ǽZ��=�VŽ��G��<�b�;��R>�.�� J�=̇=�Z���>^�[�튯=��L>R.���ྼU�j=A?�=�4���Ԧ� ����_��"z=��e�b��=�â������~���<X�K=n,m=���-�= ߼���=x<B>j
*�}�H=rK��G� ;yb<S-�:��˼BU�=!2}�@�=��R�=/�>��c�m@X=��$����=� �=Y�n��i�{��1:���л=^UG>���>�"[�v���<7>p�R�Rgq=��ѽܬ�����=���U&��kA�j�����<��=�>���=�>�%V�φ>�JA>�3%=�����ٽ��򼉺���Z>P�q>�=M=:����I�>d��Z��=�Gt>�������=�rɽ�.X=>95���ͺL�:=�^ >.O{�.����kD�Om�������<�O�<e�=�!I�ce>��S����q�>>���=�]G�N>z���ߗ��t���oyr�`����P<p����|�<3�*��>e�t�=�-��J$>�=>�a�=�#��j�0���̓)�:�}=�Տ��c�����"i>y��=v�ɽ���=j�=�Z{=��>���ODj�1{�R�P�'{�<���=��]�i�n�Y�`�����ƅ>'�=�,�=�;|��-�>���=����R2��Nѽ��=�롾��n>���=�l�=��ļ�H=ӚN>p�A������ts�<U��=��}�?����pM��_>�}�����=��ѽ��*>����Fýt �=R�=�<�B5>4i�<�=���#V>���Q�=��>h=N<il:=B�����l�=�=�fɼbd�=;[�=������)>=�}4�>�dL��L����2�Pꞽ<��4N�0��=�j�=�b��Ⅻ�Y�f>�2=��̼�3���?%�<��[V���h>�ׇ<K,%>>o=>h+�=��Ps;>��=p/$��aL��Ȣ�cG<7�g>��1��V��~�=�:�<Ҝ.�[z�����=T�a=�C�B3>���~üg���� =<��>�L������6#���=������
,S��%�vA�=���=��-h=a�}=֜�=��ͽ��=�a4=��1=RW��Y�=`��D.���IP>�D>w���BW�;�"�K��=ٍ����B<q>z=���� {=�L�=D��<�mA<4�~>V+`�
�w=b�ܽ�W ='��73�=����`�=s���3�E�Νn���>n�H��r���8�=H�5=DQT<���as�ITW<�U>��?=�
P>!�S��==3製�9�q>I=��t<�->�����y3>CsN<�=>r6�>����$� =ڵ >�꫼M���Mݫ=A�s��K���۫�Xo=�3%�D��ּƺ��m�`l����t�� �k��=R���I��=Ev��ۉ=ZbĽ`L�<���=�8M��$=��=O)>���4�q���9��=�T=�c�<0e=]�/�}&�=�����=z[��O=m������cL2=և��d�� |������a���XD���<�=��3>���=�‡�G�Xh�=NU�� E�;�������nS>ߌ���0�=D°��z8�������
K>��ȹa�>y��<�0��d_=f�F�8�7>9Y���ө<%�2>�<�]���U(=7�I>P)�B8�<;S>~f}� 8R>LHx����=әC����>��̽]/> ��;�K�� z<?Qw=�|<=L=��=�f�X���Dx=�j�=\�=��һ=�� �=�cԽ�D>>t��=�g�=c� ��K�=��B���o��[c�������=\Z>fv;�?b��TٽE�=;'B�8I��c�=��ļJs8>�$�=F���=؆�=�=��ݽׯ�<z}n��z����2=qԑ=��=T�4>�,�=w�н�/��+>�<�/<R�$> �Y���{���>��<!�D> Es�x��=�8G�� ��> �gU�=,�>Kџ�Ɋ�<���=%�e=o�=)��=���6ݽ%�H>?ӽ���uƼ�^�>DÙ=��=�P=!B�<�>�آ�&ނ� Ͻ@�H=�S�c���O��>α�=����J�=~+̽�\��i#$>��ɽ��~��>=��) =q�d� ���C*�<"���yZ�}ō�ÕQ�L�>�FZ�=XP#=�k >�.�=��=Z�<���=,�0���2�hr=�5�<\��<C��A0C�#��\>ҽR>rU�=�lO=�>Z<�� 㖽�MW����;>�.+���=a@>�$
���
>5m��l �z���ݳc��<J=:Y;��Wֽ�}���=�LU<(���<s�9�ø�;Ѓ=���<d�C>� L>b����=��4&<�V���+���$�R�=Tf��ψɽ��l>�?�=��=_�]:'[�=�z�<��¼�O<S@=�k1<Z@�o/�n�-��Z �I��=A����6����Ln�>�M�(�J=-]!=�>����҅�R��<��(>�p��6�b>�$�3�=��a�Z ��pr��?ʼI���^�3�A3ὛJ=>Cl�����= ,��𱻌�y=)=��.>��N�%>���µ� ��>�(>�;½$�=����~��K��� ���нZ�'�эD�� g��&��TR>/J&�{Zi=��>T�3��^��K�<�O�=�����J���Y>��[=Q��{j>�K�<��=Σ�=s���n9)> �X=�l$>�� >NC���=&��?��V�>u���u�=m
^<⯷=^��>�&����=w%>Wt�=���;�?���=$�Y���;�R�=�� >��>lgR���g=���j�=@�3�vN�=g�˽09C<_�E�5V���;\<���<�]�= ��=�D9��*=��&��X��55�9N��f˽Z��Kj�<� ���E�=��7>����s`>��Ľ��������=�I�<=�W�����a��
��<�����(�:Bc��i_��e�)=���<�}��^*z<��>��8=}ö���<Ϡ�=�/>NԂ��ņ�����8���Gҽ�D���[�<E��>|�~�#B�=��>�(#��|x�;H=O��<����0��mOf=�0.��>@���=Uݓ����=le@=.�z=�R>|�N�E�A=h��=�� ��%��Y�C�z>�>�<>c��0
��9x�<q����1='����[�=��˛=�=�d��;(Y�=8�ڽ�Ѽ�כּ������+q�=? �>M>x�l��x4N��nC���J>���GS��A�8&F>.}c=�
i>��A=j��kD�=y`X>{�n�����=�Ҽ=qa���*����=��E=(�?<�����|ݽ�p5=�bH�C������fi��i����m>�<c>�Ȭ; ����~�һ�>E.'�=��=F�k>�Ԡ�!|�=���R��� �fݼ�� >[�>� �<�x��W�9�I���v����>��-�f?�=ѻ�=}�ɽl����]�<:��<Y<�O�:�R���e*R:�p�=��N���=2U�="`�<�];�2S=��a�"m�=c9q>e�>Q��=��4>���SJ0>��ӽ�ǥ=#��=|�e��%}�l^�=-���䝽,Έ=��v�[>�7%=�R�c�=v�"��h�=oL½��<�w=V�j=t3�<D��<�xf>�L
=rN�}� ����=��B>.� =Lw9>.�u>�7��wK��{��<�&�=O�� ��=9�G>�o���=UN=� $�&y��h��=L�q=8�s�4H�d�,>`����lI�E�C���%��'=Q���S2z<%q�h�l��/��[=�.�Y@����7>O�ֽm ��R��4>d�=]ʼ�'.�[����=�=�ߊ�I��bk>U���u�U"]��R�U� d�=��+��0k>Ufj�����N+�����򫕻o�>�m;"���b�=T�q=�K97 ��ǐ��ܼ<�I��@=7�D��\��0�`C�=��7>=�
>>V�=�K�<N�ϭ��M�պ����+> 0 ���=ꅽ�:ϽkPB�T]=$H6��%d��Uz= I��%���fֽZ�E�HH����;��q=���=�C�=t_�=-�K>�/ʽ�-�<LS=��=l�~=�%y�4C{�?>.����W6��!h���U��j=t\f�j��=��C�oQ'=�M*�,��=�/����$����Nh��9�=�=q����ob>��<�GN���B��=���=������4b>b(�:ս�>_.��ݘ=ʰ�Y��!lb�K՜=(���AL�=�]�=����ҙ<�`��Ȳ�=~�=���<<c�^����B����<ڦ�=�|=�V�<��<8j���Q0>���= ��;�2��ɽ����>>�j�]��=��=�8w��j2;T�R;�弆�G��
=C����X��C+<)�=���=0iw�%�=D��̥\;N��;�a��=��3����<��N�^�<�:��Z�}�]�N��>ɻ��.C}�p.������I%>� 3��x==���2[�=^��Fx�����=��?>��w��m�Q��=o�C��k<��;���=������ ��q>���>��o>�Pǽ��۽�y=j ڽ\��=��}�����滼��R<dc2��He=��B�p����'��l>�{C�)L=��e����=�E=�B>�)����=}J>���n�<|b޼ _J>6�򽬸˽/|�;*�t����>w�ڼ������=U>� ������{?1=���<,
��<n���<�=�Ͱ>/V��5d���9��5�>�v�=+�m�Nb��J�>��@�~>�����BP�X!g�x)=�=��н>!���}{=*��IaC>^C>^���?����u<_�>��H2=]��=Cy<��C���=D)'�W;<��>B��lz>���=G>d���U�� ��=��Y=e���KC�2v�=��� c�=�6�;3��<�ŋ�2J�>���Ƚ���$i =��(=�����=$�<��>t�<�X���=΁�:��>U�q=s��=j>q�;��,�3�^<%Q��T�� *;V�A=~��=��=��!ͽ'����fj���6�í,=l��=��>��`<��?�?'.=_?\���>uI�W�������x�=��G>�=� $=�Y�<��=�zQ>F�ܼ���=��>�0p��lS��χ��7�� ��=��1�>�e�Q 0�wW���,��沼�,�=�;>�,�af����=�붽��6>)W7<:J�� �=6�">h5>$Z�=�RN�\�<ČU>���=��X�[�B���>dT��.�ȼ�#�� ">T�1��Cu==��h�>Js�= �r�0O>��@5�ߢz>&vR>�j>�e���T��jl���*AW�~d/�@��=[2��j�K v�d�>DȻ ݊���.����>�� >i�=�F0>�dk������-��]; ;�X�=R��c�U� ���!�y=���=Ҕ�= ���u��T�����,ia���a��� =V>�<Y+o<����ˎ�<��\�<P�=o۽F�->؉<��U��4���>�+>��ֽ^��=����0���p�ݽ��<��X>�a-=Q�]=s��Pv)>lYW��&�<cJ��r'�=kO=0��=�u��.�ԓ���A�<�6ʽ��Y>4C�=�e6�?�=�h5=���=��-�����Z=@/滰bB�k"�=���K�e>���=�� =��=|�����=�˽<�R>P��d4�BG�<T���L-�� ��T5=�P�U9����d����)��=�I>P���:L�< f>B�x�
��+wԹ��ʽD ��\����콙� >VLG�P�=d2P�����j�o=l�<>TO���'��a�F>mB���E >6�=�6+>��o<M�`=N@�: U�x� ���A=��w���㽫�e�ͽ�JY>򫺽��>�cj�?hν�O�V����+=�˺��b���� >�v�=�*P����<b�����ǽ���D]>us;>�#0=V�B=��>�Y�>�ǜ=���Em��R>1�=���.���G���0��=���=o �r��=ZDZ=���=�G��)m=
B<��i�����z{��m7�=��=��=�³���S=$>�~ļN[u���l<��r<[�=��=n��=6� >?�=>��I=~� ��F�=�Uj�2�;���/��{��m��4�>p��E�=�6���>�rQ;��="O��r��pks�n��<�8���ͽ!B�=d�#��� �A�s�z���q�<V�h> >�w�n���gv���=�YS�h��=zέ�F1&����;�>�X)���*>}�=�RE�G�B>���=�>�,=OM_����1��=��A�tdz�}�p0�>��<�a��9U�~�3�U��b�H=Wv�=#���X�;��Q<($�r��e�8=��н�4�=o�l� ���=u[^=?:7�� =�ݽ�f��=�Ǫ��H>ļ�<�`��8iڽ9>9mo����=?8���p]=C���p3��U�S�7�>8�J�9>2>��v=诓=��>BGd<~��� x�=P�<Q�ѼX���k�=�o��}���W&�=�F�5<D�:��2b=Y~�� 6;P�V<:�8��� ��=��t�н��q�T�R>; �����=3(g��b�-��=�cҽ��B�m�H�~R8<���=��8�[棼���>>sO=��=Vk�>F�g���=�c>�-����3.K�:��;��<@"!>��W=�R��R�=O@>�R��Jg��הC=�J=���<��=��b�t�4��>E>k��=�ϧ�Mcv<�&���y<����A��5���Y�=�B�<F���s�=�q�=�'����4>h����z=��͹�Y��f3�=�!)�� �=z)�=��>�S��v >E���&E�ci���<=o��=R�ڼ^�C<� ����=0�=��V�S!�=b��;�1�=�>��k� ���i>�ѽ�� =뫃�������=���=E�ǽ���<%��=�8��d�=��ʽD�<'�p���X� �����C=����J =��k�/�>�p�=�-�> �Z>�I'����<��Z=�.s�!J
���<ng���]>.��=�D�K_������`>������=>�b�M�R=G�!��%�<�L�=�� �-�ȼCK��433��� �fyS>���>5ꉽ�F���Į=�w�=s�Q���T>�c���> �=��)��.'=�S<��=]�v�8<
=�>�� ����~J�����0�;Z��<;��4"�x��=��?�>%� ǽ<w�>��4>�J���6���0t�L��<�~%>��< ���L�= c>��;>� ,�S��=�/->�E��@�9_���E�S�=���=J R��S$��p��4p��A"�;�?��F�=����Z����Hm=<�{<b"�=Nto>��4�#=����I5>��R<Lݷ��� ���=^f^>�ǻ�����i �L�I>�������!���?��=Ge�=��>�!��ٲ������g*=�R&�w;�=ë��D�H���>������Z��#>��> m��R�5�� �=�{;>�����=�C�=�t.=�vs���u��H>2�ν�* <J��=C0<6�/���Ľ��N>1�`�Qzg=#��%�E��"����<�c��Iw�=]"������`�P��Eݽ��
=焞� ƛ=<��lѼ1��J�p��yk=1�A�I��'���޼�<�`t��Ad�O6��A�=S�<d7>e�X��p���$5>aK���'>�>�)����A>�:��""��mG�y���>���y
=�|�����=�T¼괼 Em�%�����Ƚ�C>��m=\UD<�(�=��C>��G�[� =[:<}�;kް=��H==c�<0� =k�4�S����_%��A�=���=i�=��-��h��$.P>Li>0 '>(�&=�w��92>������=����$����������<SV�����=c,>I���Sj=z �=վ�<%�����=Q4�����=s�����>���=�;=a�[��Fy>R��=��½%���'A��D���-�5�.��iA>1
�>4h8=�2ҽ�sA� ��=�sA�hd�;;�>(����0F>��N�7�'�->��=zH�<!��<f�M��ɗ=��K=��l�sJ;��eT�O�V��H>� �=x�3�2 �=��I<��F>���1�>=��>V����z>��5=m�s�� �<���B)>d��[C&>��U=�0_�$)V�ҫ>��<�Q'%�tӪ���8>=���*��=n��$�Ͻ�H�����B>n� �:Z�<����#�<f�>|�����=*�H���U'x>��3>K,`����=a����+�'�/=BW =SO��J�=��>*(E�0���E�ͼ� d>;��=���=�)=��[��ʜ��ν_h��%���6����=ݮ8>tI>�r>m��58�p>M4f��>��k>a̻Z�8=\�-���}��b��W��H�O=�g\�#�<�b/>���Z>k<�=�5>�h\>U#�<4 �s��d�v>��7�T�t=E������>�b�> ��h��=W3>&@-�Nc��� �#�B>q�f�С<>��="�0����=��=��p��m*��R�'�>�0�=�>������*͟�E�<��<�8(�f�>ti�=ǵ >.\=x�ڽ�M��E �t��×p=�Ο��驻��7>�%�= �{��ĺ �����=�?�Y��=5�Y�H<�7a>LV(>�U��%n���V�y�ͽ�r�=w #��������2^:;��T�u4ͻ�?�<��<GF̽���=���^���?��,�1I�;���<2[o��K�v�={�=*̈́>�;��64�=l{O�v�
�EA?>?q�a�)���=�/ʺ��=�f�<*�>��=�F�z��<�lK=��{=B���jٺ�9<�3�=�S�����=M�U���)>��r�b�཮��<�I'�=~2>��,>}`0�/2$���9�v�a�\��)ٽ�2<��)��K��;��;�� >ck%��7�=�)Ͻ���=+����Q��#���2>������<���<<�G>��z��Q=��=�}��v;>B9=
D���~��==(۽dz��콏�����+�6]�<�@f=Rn�<a`7���=�� �5B*>h+�:jw�=�_>v����� ��n>{r�=W>w�t�g����=�a���D��M5>څz>��7=��"=[ �=�1>榀<!a�<�\^���n=�<8=�C�=z�o>�v�rx>rN;%^���%=�D�=Aڽڒ����=���=��[>v�̽�)&<��+���=��=ಽ������=��K>1B�>{3��^���l|�:�0k�g��۲��PӼ�ef=.•�Đ�32n=p�¯r�
�%��>���=;���F��;�/d<G֪���
>Iv�>�j���T��Z�H��Rs>e#�>՟R�o��X�w=��ɽ;�<F��=��3>�nO���=�r ��HX�Q��I`��'��������� �i<Z�.����=Hϖ�d��=�'P���=ti>�t�=�ř>��b=I��>$^��{c���38����<0&�<!\��A��=Rcd=�Y�=Ӳ��b�<�<;����F�PH�=*|�<: >�@<'=����������=�`"��=�=z��8:f>�JĽ�e��`V�5J���>T��
�z>߇S=t}�<x6�=KG�L7��0=�=>��1=h#��@佐�=�L��W9u>uD<���4���� I��v߽s����ϱ�����5b>F< =�i����<cz0=�>����E+>� �<�l�.����=� i�Zx�=��źK/o=�`��!<�� �`���,I>( �=(��ʌe�����s��yy�=�2��L�h>-�����v=�s�6R<j#�+?�=l>���䓾�[�=:��c�+��_�=9���.��AJ>Gǖ�+\�7/��?=�x�=��=v�4>�T�=�O>-�"����.�μh럽�o齯օ=.ؓ=Մ>���n��� >xa����=����蠼{^>0}����=r�O;�>x=���O'������Q
�����&=��=b�=A>B�H��=���=���<rQ>�I�=�q=>��8�� 0>F�E=�F�=���ՙ���CZ����=�͋�@�����=�뽶���%t�>�/@�0���cmJ>��=�|�=��=��D=�{"<2��=�
�Y�>�R����>>a� =䕄=�Z��j!�x� >�>reU�����G1i=�Խ2t]=���=����u���'� �
�8�@<�팼���=�5�`C���Y=�m>Ae�=����~��>\+����=,b2�5 =Q�=zu>�t�=����,��<j�I��ã���<c������xϼ��н��j���zf{=��
� ��z<>���;�ل���T�c�b=�W>�B=�= 洽��ֽ�w��V|��UGc�(��j+���Uǽ-�`��"��U�==N�<V<��MP>�G�=��1;�|h>QtC�=�����="�=>�=˗�Ɨ;=x��<�&R>c�F=m=f}�=�>���^�<��=t-�@t�=�|=����nj=�t��%z,>95>� =sΫ=Bi�<�}X�'P����ѽ�;=������$�Yڽ:H�<���(�[=��'<j撽WF=f�>2�g�l�.=>�B�R ���={>���<$CT�Q��>�3����;�T~<|�E��/׽��=W�����ܼ�=S�N>
o�_�=T���|�= �7=r3��ü�B���ս�L�������A<!�s� o�=�.�<eP�<L����}���={S>����=�Ğ=��%��_Z=u��<�=�R���=,�ڽH�.>� �=��@������͖<�Vu��Yz=�p<�S�;�Y���O �&7�=҃�;j&[=Ƹ�=�P�< ݳ��H��Ⱥ�=wy=/u>�i�3�=��<ٓ�=u�,=�dn<[�=ت=۩r���U���]���I��=Z�^���D��U��J�=�*>��V=��,;C_H��� �rx=X����6I>J`>�����;\��-=n��<�DT>Y�*��.5��I�=��==�Vj���>+�s�-B>Ke�>��)=բ4>ؽM<���;�rz��a��==��a>�=�->�L#��^�a�w���Q=�#���y�=�j��3<�?h>�,B>��#>�^>���=}<��!;F�L�O���=�����&���>������3=���=�🽰;!�*_>�ܽ��>0 d� �Y>� ��i ������̑;C�f<�c�^}=K9����;?� <�lP�N��*��7����g>����X4�ֺ�>/�O=�W�<�fY�ٸ�=5Ƽ/��rE �N��5`�ډ���j=�Qe=���2kK� ��<p�<~w=XsU�2�����=��>y�=�1ƾ�h0��k=c[�=_I5=c��<�<���֍=e0�=��׽B!4>�!�un���y=��x>�3��M0=��@>��W�K7�=G�)�E�=�̖=��ɽ�^>�"�6�ǽ����#=EAC���= ݼ��)�x�P�O�5�q�^�b��_A���ν��M���P�T �=��Z>�z$�xf@<e����M=ࢀ�s'�=�#=)΂��b>~!�9���;ig>�Ot��ih>Z�8����=��>l��=�e#>�*a=�n=<$�`= ��<��!���߽'��=��=�kn��v �D��<��=ء��bB:��Sܼ���=�>[�<=�m���=>u� =�}��[z�"�Z�u�=&2��Q�k=��=�jY�6L>O�e��J�=/���=Ri��3�:<AZ�<"� =T��=���<�,>�3>`ټ�� >w��=E+�� >E��=B�;O$2��/Ͻk�=� >y������>`�
>� ~�UAK>�a
>�C�<O��>L��<��>LUA��Ͻ��?>t��;A�Q����=�>=���>�K� p<>�����ހ��:콠h:�����7t�()*>���b����=��нK�K;~f��*%���Rϻ��=�[y��ϋ�<�=RlY>��B=v�ཬ�B=h����սJF;��X����%�8�Xxr=�-�R�w>�c��Z�� ���>>7J��S�$>i��<����M �;����>Ď����=z���k�"VK>���=��,>�=U�K> 5�����T�
�����ѽ�EW��X���2 ���L<~s�:�����^�n�> �#>¹���ƽ^:>�=�����V�=�v=�_;�J��1��=�����ܽ�H�<;��=�G�W��>^���u�V=���<OՅ�����Nv�=>���Fս;u>>6'
>�d�=2�����=��= J/�\_�=�� >=̽�Pҽ c6�!]k=��;����� ��[>�ᦽg3�>�;�</�+�*�A=�� �������>]�>��ԽaǴ='﷼zo��
�9>� =΂W>��=�D�=�q ><
�>�A�>�A��_���x=tM>"���K�/<�/*��}���=�="E=掮=�E��T����1(�nY�=0>�D�K6H>XZ�&
���`>2"����W���R>�q����>>d�>���<����<=���=���'��"$�8f`=�L#>&���dV½x&?=ɴ�=�ѽ��� >�[e>�r>jd�=�e>avt�:�=)
h= L};|
a=}�e��\G��� >��'>���8k���_>�ⅾ�D>��F>&9�=�=���=��;>7���c:��C�= �T�@����� >Ǧ ��� ���9����<����?w����= ��=���U �=w��:5m��e�=S�8�S�!>����l뜽�NV���>�f�=�����}�3�+>��<��^�1=��':<¼����J��g
� K&=>��% �:>��=Y:������b >��Ԗ�=�r�>N��=�X"�۫y��a���h�<�r�����:ٝ��;=��:�Zhq�#=���ʼE>rD����7>�p�<��-9C=��@�=j[��#� �+׽>�=>x�=��>�5=��9�46�=���=�*>�饽 �8�Mv�=/���v2>dj�=�8��IhʼS�m��T`=�\�=;��=l���$�:y�=�V�<��G�ڪ6��w�=<]=�A�P,����=�uO=?T�<��X=
<𫙽�м=�9<o�<�`�F`^='��E_>�����&d>�UE>�r=*�<=�vF<~ �=,�ž����i��>�t�=·D>'B��\�=9p�>D%7�GH��El�=a�=�F�=������O=��ܼ��>l]u<T�&�Ζ<���� a�=~�>0V�%���T���=�x�<���K�=C����8�=��7�h�=Ed>��7�uD�=����L}>�Y�=�W>>��3���ʼhR��J2G��v->�L�= nt>D�>:����->R�N���<�8��e�l=��S��`>��>��8>�<=��"��f�����=l��=]�L=�ؼW�/�nO� x>$P^=��潝k$>F��=�㋾_������=8����>}�6�{nm>�� ����=��ν0�b���j�n������;�n���X���'k=�Є=Ő_=g*F�W.�����=)�>%�|�=�{���x�����V�����=�I=z�$��X�x�>}Ƞ�<l�=�+>�$��OW�<Kc>� Y�����}����w��%��o)�v<K<:Yc��� �,ϳ���XX���mh>��ٽp��>�&�֏8�L����ƻ���=�Oؽ�����b:�7Y�����,ɽ�� >}��=����}n9����=ߣ��0�ǽb��=�9F�RnI=��5; =ԘN=>Wh���sw>��%^>�;=#HڼwsZ<D�����>Sճ�oe:�SԽ�
�swy=:����8M>H9��K�H���|��[f>�rf��WS�i?����I�.QF�f��=�B�>�J��'p=����N�� h��g�0� ��=���< ��=�/�=�g>Q�=yj��s��������p>=I��=������>�$�>2�+>S��;{᜽���<
��=�"<���=ޡ>��<E�=�` �d��<��ѼMA>�-=E��`�>��m��; � ~���*>0x̽fd����5����=O��Fɽ��*= g>�`z>�@�Y�d>�$�=�U�b� ;��!=`��;-n��{C> �Q>:��=�y��A��CQ�e�o>�D����^=��Ƚ8�r=�t]��n�L��=�Bb�`�3=�{��5��H,x�\4&>q��>+�u>�'>�== M�=ej�Kὶ_>��7>$r���� �8�½"�=r01�W3w=�=*d=%�=d�
�ݤy��@�=����w�=L5U>{�4���`�w�&;�nż��[=�m��L�K>��*�U;�CG>�(�qĎ;}N�<np�;���Q�������Ik=+,M=�ԇ=~��M(���!���L=��><�E>�֘���>d$Ƚ��>�O>�m.�� 潉+��L=�T���$�=��)<� 2����=|��=�fϼ�"�=R�<ق>+U��ު�=���=9���S�>��D�W�>�V�;E��=�W�=���εe>�\#> �=x�>6���k�����Tۼ �!>�����;���<R�q����=|�*>��n>�Q<x�=ݜ�;/��=B7��Q(�����Ty��f��d�b=�����1�=@��Y O�/�"���λ��/=���<�o��t�'=-4����=�!>�����>��=˹<�.67=�&۽?���Ն�=j� =)Μ=�뼣]�=}F�D��;��>߽3>�= ��<L�I>�;]�I>hV� z=$*<�!>ijX=��/>���=���a��<ҡ�̇���r�]� ��$��j�½a԰��G8��!=�bl��*�>��=1"�=焄�����w���zj=!�� ���>h����-�����lpm�W5�=1涽Iʜ=�Ӻ��τ= $��&��jsԼcv/�����M�缱�ֽ��B<��t��eh�������K�m(�>��R��e��}���B=�������='ᗾ��e<:a�=vU5�Rջ}P�;ש���N�= �ҽ�[=ׯ�<�%�>U��;�%彤7��T˽��!��g� �z��<�-����E��<�8��U�T=��߽0=�t�����=��C��u >�X=V��=HW��y�*�@��=M�6>J^�=T�Z>l��o�~��O���d�D�g<ʡ��( d>|��>���B#�<.��=pԽ�P4>���<u���d�U�v��=nྲྀ5~=���<�}S> RR�{�z=�ɥ�Dkǻd���pg�=��j=7�M>=y=^�T>}�->�\Ǽ�>Z �=gyѽ�\�<B!>G�<r+����=)q>*�ʽ� ���W˽�U=V, ��*�x�=���<L;�=��*�'�#>��>���<��=zZ���}�� h��x�>�R�=�֫�Oq>�a%>+� >>��=��8����=t�U�+߼��E>C����>.}����:�|> �=J{�<����z�=�u<���=�4�|F>�$>���=��ҽ���=M�q>y"��)�=^�=V���Y��zK�<Z�s��ߠ=��Z=YV�=|�K>�닾�|?�9�>��|<����]=�ͷ=8C�2�%>���Z�=��,��n�k8�ޝ�=^��:w>�E�9N��:dS=�ێ=�c���,��1���+!�?���cK=�����=���=�2=�Q8�H����#M�X �=������/�l��F�G<M�=��c���<���>"� <>��<
r�<�v��QD>tSI=og����8���=� ��?�2�>��>�� >�#|>c � ��7��=0��=a��9>_�a� =���=-J���=^���=턽�>�7�=v�<=�(�nh�=�>0K�>�M�=VY��@J�=��������c=W�"�PJC=�I>���=���;p&�=�8�=��[>��ܻ�,�+���ɂ����>�A[>*��=�h�=`���4V<8`?=0��b��<��<����1v�+r>�ݽT�%��=��i��B�yuʼPA>�" �u��=Y�5=t >��=t��;?p�=�R����9>�;��������=ݴ��X�DVc>Sh >������r= ���@>�T/>f�x�S�<t[����ӽvˊ��0���F��i�=V��8};]���|黽z ��D�=�6޽��}���� �Zԑ;=�=[H!���ѽL �>�ѯ�G�;F7=1�E<�I߼�p���J>��w���:��W�x���'v>�h�=�s��}���0��cb>89�IE> ��<s�"��=�@�=�>����=��e= ����Q �f��9�:<.�"�0�;k:>1��<�<�D��c��5�='��� �+<J���UF}>��n>�c��kK���/<�<�0��� �=l���#=���~,��e9>������=����z����Լ���*@3>,��=d <9N���|���jaK>7�(>�<@�2�ax9��@s��p
>Ʉe�7c���?U�;ɋ= h�<b� �e�=�:>qt>K�>a+�� ��=�)�>�L'=gF�=�����>� ��(l�������Ja���=�d�=�d�=�꽽#�f<�$e�_B�=p���|eU>+��<S6�
@Y�s;��Y)=��B��h�<��m=�:����R�G<.��=�-��?�����.�)g0=�-=;�b��%��{�c=i�>t6����7>� �nHD�"lq>����tL}�]��>>�=�*�={>��Z��C�>��׽"<<c#�=p����-�=E?`����=>�< ާ��G�=�i=�弽���<���� �(��5뼗����e���=🲾f񁾾y=?T�=�9V=��>�NP=x����Y=*�e�Ԍq>{=�������;��>���� �"�x�>�����~>T1�=���7Y��zm=p�j:X �=�oE>ұ5��a�����̟8<I�~>٭�=$c)�Ƀ��3Z�=��x>t)=��U��uG�m�2>�fS���O=硼AT<|�l�b�'�`3��o���c���>Qf���\н^?��G4�p6z=���U_���т�������>��=,>��=;��=^p#>5�<>Z���o����f=<e�� �����=~���㕽��ɽ����==�m�g_s��������>�_�,S>���@x�=��=t��= P'>/�������=G�� �=BE��Tw���q������﷽�]>��>F�4>;�b=L�>�+�"份�� �Bh=�A>z�����=\ ̽� :H ������sD��U��� �>s;5��n�=^|O�g��=W�>�@=�=M�=���=*�#��7S��x���=�������ɰ���7~=�2�=5e������.��}u��:�=N�q> Z>)�4<d��<*���`�<��u��v���|��"���=�lW��H�<��=ڹI�a:�>�\=Tc=E%f��W�:��=�J?�H�v���X����:�vD=��=�zY<��\>���x�<�@��� >�M�=��"D���뽦�.= ����XL��Eq��9r�q�C��)��7W+�xŰ;��`��r�=D�<�� ������Y7��d��tF=�꠽�����C>�Y�>h�z=� �<�ϼ��=ͧ�I�c<���=�"�=C3q�� >���=�!�=�ю�ѡ��`#�=�I��U�>_ ���O��������>;�O��E^���3��>)>��Y>���=�N�=…��fM>5><BNn>�y���o���T��=[��0�����x��Q��bdT�=>=������=��»� ���*8=���=e�]=_7>��G��~�=�ý=���<�P=Uc����=A��=���&�R�y�2>�� > ��=WX5>�'�=0h=EyE=��ʽm��#"����m���=>�o�=�����)=*Y�<���l=m<�Q=�� >�c�<��R>$p����.������SO�M������=� >������k��㸽�� >iw+>�����>���;ؗD>�˶�DO=����&rB��#"���T>Ur>=�D<�q��J�=�� >`�Ȼ<q=��d���Raѽ B߽i>�܎=lԽ=�����B<3Vn�����}Vn��mC>FP]>�FཏR�������d>�2>b�i=�s��c��*��=^�>��Q���tU�z��=�J%��k����d�佑����VV=
�;���ĽX�/���H�һ?��s>�^U>9'ý��+><�нk!�=-.=h>�\���x�=�^�>r�B=��s=�ϼ��޼e��=J�=��ּu��������=�]ڼ\>J[��^V>��=��X=��C���#���\��=�r�D�=�qF�n���nP���#��<B�,��q��<���Bm�=��=T��=\�<:�->��=#7���w3=��&�p�<>�߼�H>�|����&���9��=��^>ۚ:>mF.> �c�#
C����<)H>�j�=)��;���;X�ƻ�{���0��4J��w����=/�G=�� ��V����=C==TuQ>�-�<��<QV.�������<�K=�˸��M�����=�V(�뷣��ś�U� �+�:��]�F�>�x6��@4=b𙽈�?�hWʽx��K��=� 3=W��=q2���U��O=�9���꽿Ut>4�}=��U =��S>�#�-�ѽb;�=�:>Z�Q>���=��>Y�ߚ�=i7.�,��=��>�iF>�LZ�`ƛ�G��W�罆�*>l]�=R7��g�<��������l=��ռ�Y�<Io��%�@j��'��$�=K=��=a;�=@�k������<(��=�}���31���=�� >�)>5�2��[>Cf��.����~;�k낽=۠���<=K"�H��=/I�<0>���mu;�i����������bl��b ��ڢ�=:%D>�t�=�����wB�������p*~�a4P>(*>�Խ�nl���=;�E�^��<U��
>A�j=%�> xǼjB�=���T���C >�@
���=W�=�C>�-�=��~=Egd�d6��聽�d ����6pQ>�8��(@>_�/�rQ�=�_<?�7=Z0ȼ�L����v8M�;\E� V���u�=Yf�=v^��n�=����e�={.L�6LJ�p.�(�����X!�<�@�;xJ�=K&=�G=����*>8=F�}�=N��N��=��)�&��R��:�>�=�=�����k*�!)>�cA>us>�C\��5>�'-=�p�<��:>��+�dy$>���ۇ�� ��93���H=,x�� �<j�M�m�g=Rn=sA>M�߻� ����=7"�����=N����IX=��L>����{�<Z�M>}^�<c;�B
>W>�f��h?��C��$�1��g�>�.�/X<��нM��=��*�D؞��4߽[�F�����|�>��B��/��$�=���;G�;����ɚ
�[T<%��>�n�=�3�;�u�>�@>�4�= � >� >�󘽔�?=� 0>'@м������i��T�~>��L/>��{=n��=} >�Dž>��f��"7�b��<w?�߮=����)�>s�>�g���X���=���=� � A�<Ϳf=�{i=@�ý!���r��=B����4޽ ��=t�%>���;�A
=�N�< �@� OA=J�=�����*�pH>���#�= Qz=��F>�|�ϙh>g�A�������>&@�������>��e>�J=�|�=h`>��L���?=�(ڽӂ��ҕ�d.;����| j=�{�O����}=׾��WDh=S;y<��\���&=��c=t��B7L�0��=������;»� �=�3`��v �?u�=��D<��8��o!>��!�%0q����>v}�=��<DrQ=��>�"�=�r�;H�b>���=V_
;..��.`�����������;�E=@���}�5�ȱ���wZ�� � X��M�=M�>[s��;�9�yO=F >�� ��<%���Q�f>��:�ڟ/����>G�q����=��/��3H����=��N�kf=�
����89vF =r��Q:��a^���C�96V��Ò�W���Z�<=��,� +=��_��?�<M��+��� ��>���={J��=؄=p}!���u>��=s�� ӽ���9,�����C3��_��=;T��~������z�
8=!����|�*�Ҽ��=�6&Y�}ym��=�`���̾=��;d�A>�$ֽ��=���<ɢB�� =+U�>_ݘ��v�>���=��z�_iK>��>\ލ��� >P~��Ô˽��ʽ��#>��>������=K�j<�= ��=
���P�=�X#=��=A��=�6F��O��܁��}�<.�I��3Ƚ��|�ݖm�i�ʽit��=��J��
�>��ܽ����`H=j�k<+��=&��<ߔB���=�B�E� �YN�Z.-������=�R�=��ֽAa;�������<��Ƚ�?��8�����=]�k�������=X�]>��?��7Z�\Y =;�,>$.���]j��+=�X��k�^��CN�!���� >�yU���&��D.<̎��},һikh>>-9'>!D���>m��3���u>�$�\�������8���0>Jb�u�->x�=���:܉$��f�=�p�=|1�=�Έ��-=F���)�=���;9#>obv<��U=�"T�����}�=�@>N4�=&:=Fq�<)�=�^�=��5=�y����<�&�}�l<OJ��0���tOJ��,�I��=!uC��WM��~��=i���dz���&�<��>Z�;��\�*h�;g �=r�j�<h��m��=1,a;�;����ؼxi.�U���X �Ź>�
��y�=+�=5��Hdy=���=�\"=LHf�B�c��}��G�k_���m;=Bn�O�>��'>��F>�Y��������V*>iBK>7Av�܃==�==�d����P� 1i>* >sX->Hp=Z� ��V�=F�>�x�=�t�F)�����=�� �����"�>� 1��81����dӒ����<^�$<!0`�� =9�⽒��=��J>;�;��>|���k���>���=�֐�ֳ�Ý\>��e�טټ����R��\��p��� U�=��%=��M�s'>�uE=g/��g�T�Xr�#N�=F�����m�[�u>�;=����M渽*����=�G>���=y �h�������;�X>��;��O��h0���>�����9��\��;���\<�<�&>��=9�:&�߽G�e:'�޼��<�m�=�Yi��6�T�D�ol���n>�b�<� >�<��F��=��>�p��=�`]�?Խ�?�=���2�28�
>͈��췽���(,��Rp1>oJ�;�@:>���<}eK>���<�̠� ���y����B�=(%�='ǝ��\ �\|�]��=���"�=©�<}��=�,վ�B���>�L���>���=�m>�Ѩ���Ͻ�,x�� 3=ᖧ=�̑=��� E=+�>��=u�=<%<e>Y,��o-���'���,�5Z�<�‘>[Z>q#�4�Լ��oaн�%��><�O�=�I>��ʼ�ܽ�>wC�</��������4�v�>@WY=+�!�Y�̽�d���=���= ~˽���=�и����=� >���;�b>K�=D">��h�A�,>���=$:����;��b=����C= ��=��)�S�L��n��N>��9X�+>�He�Ǽ�=�m:�N��=>�-=*��=-�[=��>;��=��d=��j�0�=Tl��R�>��P<\>�V=mN����:�L�P6�>@�=�S���7=�����=��4��f=⯩=�{��b$�=|�=T1𹌞��'�pS���
>2W���G+�^��?�=o�̽ճ�@n�<$V鼗����)�=��z���;��=�ܝ�����e �x�<�YG�~$�=��� ������=i����$����J=�
�� n��A��>W��b�'���= p޽����'����X�=ʡZ��i�=�8=$��=;>[��Z=K�S�^2>8h[��Ӽ����Zu=�:�=�n�<7 �����녽�N�=�>�=���<S�=�BK�q�3�b�<)0�����{�=R z=٣�>et6=����J�R�t����<���=[/�����*��=
Pn>��L��E�-C��P )���W�W�O����w1%=4 k=oj�=��>k��=�W`�Ι�k��>�_>� ���=�=���9�0�B�N�����~�$���C=�uM�������/���ٽ>����S =R� ������ s=�׺=k�\>nY=":=3:@=������6�(?h>����t�=g]i>8H���=��޽�� =�q�=J]r>����_���?A���O��=Q �`���@u=� ���= ��=�i����;�qD�C����>�u�M�L��U�=�y(�*>2Ƚ��1Z���N>o]��A�����$>z$�=9�>\n=�8�<������"������R>�79>��q�4�B�wD+�+q$��YY=v�=�� ��eD=�I�t�X�%wF=���=��8�� ����=A*>�2�=�!�R�F=E鴽8Y�=�����,=5�O>-����佛瘽~��=���=�[ܻ8��=�3=8�r��o=��ν,L�</*�<\>�z���x�;6ߏ�nr_=��+>�'�eY��}� �X�>�+�= �R>tc3>5��� �D�m&o��۽�K����W>�P>��^>��n>O���Y�ü�V���ڔ=�h���*�<H���6��=�>�I����X>Hf>��$:b+,>&i�<��8��xG=����P��
�;z[u=@.D=� �=^��Ʌ�� =eS�<��=- �g|/���.�.�5�?�F=(�j���[>���sw���}>렽��^��Z=4Os�TEp>p��=����\�=��=>�F>�0z=g�
�"��(�2�Vx��2�<> �M=D{^=ZD���W=���]?�<bj=Y~l�JG��0�> ʤ<\�J��j=̢�MyB= ཛ���ц��ي�<����o�>NI=:6��>dMX����>��<���<Ռ��� �=�r&��5*>_55>6a���=Z�U���i=�;�Z�&>��=�%�����=u�=���n=������Q>��m;�=@�-�W\=��w=��->򣯽��j��! �l�]=
�P����=�"���T3>0���;����T��.�>��)=�
=Q����5սŗw��9�=�H=����S�F��ˁ>��ܻ�R�>�խ�l ���#ӽr�X���}=e�y��N>y���W:b����^�>��>0���|P��.�<؀G=��;�Ѽ�>��1{�=\� >b�s�u'�%�=~�>��W݊>�
d>AM佸���$.��>ԼhN����=�=S���mM>��!���>J�>�O��#�=�=)�\�;�A>L�; r7�6�_�՗��c����ap�5�G>;:R>����$Eo>�I���QмE��:����~>kL����=nwc<n�,>Ē5����<Jj>��M>7�����<�X=#dڼ�T��S���7���\�<�B��L$��>���=��"=b@�=Z� ��e��[E���&��;�Kʮ=w ����܌�=��>�卽��5��0�<S���䓾B�=��>8R�;��=:�+=lL��`>U>-;�Iy��O>H<N=C�=�ڽ�a�X�=�ˬ�i�<XvU=U�Ƚy!>��Ľ�bS�E>�g󻛿˽����5�=���wU����=j<<'��1=HXؽʓ>c�ܽ�x�#����=W/��;߽�c��)m ���=�>;q�<���Ÿ�=�
�<(���CG�8�i��  �"Y$�*���&��=􍌽�t����X�=> &8}�� ��=�'���i"�F"��g��=�2�R�>n%�=�q=9j>�ƽE7��͵�@��4*t>j6�� K$;��:��ҽ'2��]�Ƚ���=^0���+����q���>QO<9��=�����F��I���4x>�0y=Q<�ߏ�� �m���E<=.�<���=*ǽ�l+�R�y;L��=��=kD�_)8� A8<=��@�4#ֽ��b>-���w7�lB*� �=����Hސ�~?/��א���=����n�V>7>�ͼ�,ֽ��>�30�W,=���=��ݽC���ob=�;�<���=X���>=q>4=�O��<ҝǽ��;��V�E�>�9�<��)b��S=N>���;3�(=����9<0��=)���WR��Z��������<���:���<'Bb=2�4��3½��ĽM&�=$災��Լ� �=�5���#"��a���U=o�<�9����;�ӻ'�\�T���KT��T|�4�=���S<�/ ����=D�N>�ѻ=e�/�y ��{i�O���MR���O���.��y��= Xֽ���=H�1���ɽ9�^��e�=|�<�A��l��=��)>�'ͻ���<�3��7�=N��=p�=�%�9��R<�9@>�Zs�}��<dV�+ >,�QWJ��0����3>�,6>�&<���=�u$����HD=���=�潼/l0:�+�;.�u����:.��(>���=?�ս�!e>���<(����+zk�� �=1 >��!=g2������+�������=�'0��I齚����B���;>(��=xd'�Å��Z��=L�rPN���=$���=�)�Nb=U?�C���}>hs�Y������>����F�;=��ݽ�%>�1= TJ>r^0�/�ü\3�\5D�#��W��=]�=p}��c���s�ݺ���=��#>Ame�(����*��ܽ�W��������=@_^�n �>([>i@=>sW>T?ý�>�Ǻ<\�޼�x>�Nr���άj��F��`>��>.��=��>�2�<�F�<S �=�嶽 ����Њ>���=��&�4r>~��=^��>�w�=�}~=!*H��2�<6��Ʃ=�l=2� > d�=�'�=!<=���1����=K Y�H�l������O=˥<��� ����������^d�=�u5>��d<D�>>7�{�˺������hF=��Z��FU�"���)g<w�=�'�̸��M��L���-�������0= �<�g=(�<��= ��<¯�=�+�"(n>��=�6*���U��`=���=k�#���#��[��[0�>�$<=�m=֋ >��}�T;=��|=h<$�T1۽�/�����O�l��_���S>d�$>�CϾ>9=�ǣ=��ʽ� �s\�<�s��c�=n C>��$�ڎ-��R�=�{>K��-e�<��
�2U�=���ˢ�=�񍽖aJ���F=`ao>u����K��><��>
����Ͷ���!�d�>�l=��ے���4�]�x90�_>�C�= �f^���J">���=���<�(>�Ҙ������D���=��/>Q!�=b�j�og:=��>>���;C�.�ۂo>f���e:?=�t=��|<��>�'\>����x7��4�=�Vc=�1нZ���">ӆ�=��,>A#N>S#n��I�=��=��<1�N��=A'�=� ��u�(>�\�=�C?=d�%� �ѼZ �Ν�ڭƼ��;�:�4���(��8����*>̱[>�R��t�P>�A-���r<��V�.>��r<�gd<��5>豹=.��<Kh����>ر��h> �Yޘ=�ུ&>�.�n�>?
�=�g�=��:������i�={{T�����
�����}=��=UX+>�F=�~�=Q� =_[�=`�Ѽ����Q�#�k�=<�g=�N����jN�=��׽t;��g���ȫ=M캸s%���.=sD���8>�Sw��z��&X�=�@7�x����/=�B�|��=5��=93v=f�i�v <��Y=�T���<�ʴ =������<�w�=�R >�����.��f�=�5e<�0��ՙ�|�-�E����;<H�<z�н���"d7> �=M=0�������;�g�HPU�'��J����m�%[&�\(�E�ƽ��$1>�VA>!2`��m>p�����; νq�Z<���=�]F<�)�=$'򼥁==���=d�:��V�<A����<�e�=��n�,�=82׽=�=�7;C��=_8>�R��#��<��kB�=�y�>+[ͼ��E��=Ϸ�*Ľ*���ý���=~ـ=��<5����{��vE�=�Լ��O��Z�T��� b=sj��zO5=u2l�٦ <��U�ck���Z=�� >h�>�j�!p ����=Ƙ�8�=��=,��cX9��9�=,)=��<�*n>�Z��
=<Zo��.�lI>�y#<%ف=�a��g�$=ః=n|�=h�,=ܲ>>,�����=�v��}`R=N�=u���0?��u�<�U����ҽ�'����>�-���=��>��R=�"#>.) >?�K����ݗ�>�3�=3>� � ��U��݃���n��E��D= ��:���=[T��b9<ʤd=�2�<�D��`||�_��&3=�.<Dɽ*{B3network_body.visual_processors.0.conv_layers.0.biasJ@���;���<Z�K=ͣ��^ =p_^�.C�=������<�����c�<�q����"<�� � ~< �L=*�`B5network_body.visual_processors.0.conv_layers.0.weightJ�`�Vx��Z��%�u�z���H��m�<�tf�pt���ϭ;�<�Sͼ�+�@�{����< P=r��=xN,=TR�<ٵ<��4=�݇��h�;@9ջP�1��Y�=�y =@ ����b.^����"7��k���T��a�=�
��yU=�K/=�l��k?�W�J�L�I�dC����#;��)=��̻�X5:@��h
�<kֹ�N:���+=�軀�,=���<0x���[o=�5=TO߼���<���<�A�=K�<eӼ�荽�aW=$(=��w=t�|���r=q�M̊��cn;��W;��<mq���:=j�$=@���˝�RI=�@��]�<���H��<� �<Y2�T�`��q[�K��d���x�\= �<��<�f��=;, �=��d<��l���= M�(n<�H�<�7=(�<4��<�\h���G=:-=�1L<������<5����<>W =�ۆ��\q=�[m=���0��<��C�8e�<p�x�<�+��v<�j{=Ӏ6��+1�^�l�`;�;�+�=�g>��Zn��7w�4��<�t[=������H=��Y=��!��#=0Q����=�
9Tp�@�v��d=Z����u2<TD�<�֫<����d��=@��:���(O[���^� �����{B=�)��k�9�4��<��<��h����ra�=��<��|�&��]%�t������A��H�k=�h-<ԥ�<T�=4�=@��<T��=`���h=�ʁ=����� �D�f7=���h��<0)�tX}�p!��m=?�vȅ=�?"��c�<���<`( <�Z�<l,�@����9��Y=����N����E��G�=�,�(
&< �s�/.��㠼T8C=@� ���?<�^����;��=��<䆧�@��<�~t�ҩV����=�&�<@�.<�B%=�T�<�U����=�:a=�)<��D�����Pp=u ��kL��)=&%>�v�@=�:5�6c��`*R��-�<�� ;n���7!���;\�6=@^�<b ��ڍ=j�#=� X=���<��A�V��=h��V<4IּvHX=چ�.��npԼ"4�=T��=��G=$k�<\Od=����.=���> ��(iI�`ꎻT@{=�C�0�༘��<�7��På�K�7����<|q9���B=^�I=@��:�
c��{<�D�W�`%O<��|�p�=�-�8Pq=��>;>�`���*=��,=�E��*A�=RbW��a�;����z� =��<XF<�j=�׈�0��=�b��r�/=ܠ�=dܻ���=(e�<ʾ����,=��I<󸒽���;|`�<N�ļ��>=�j��s�:�ё�\�=��T�w����K]�������< ���Y����泛�)&���4=lI�������g�������6=F��= �[��S�<�wF=�i�<Om�Z)U=���<P},<��S=��B���=��x=��?�8��8Zo����<�n2�0R�<^J��4�<���<�D=�]?<.��=�{�<v:H=h'���Ë��&=�~�:`*^=�}��[�=�Z=b*h�2��=d��<�e�<P�;���<�\=$D�<4q�<�ռ��lCͼN���^�;��#<�����\j��q=�A��\ �<$J�<p,,��s���<��,=Ӈ<�k�=�=�����<lcE���t=�q���ƈ�șR=��d� �`<�3=)���8(�<|2�=:0�� ��;0|��b�=�Ta��=\��=���0ߠ�Ԗ�=�d��P��=� ��܊�(��<������;��'��^<$ �����4i��a=p�h���M=xV�<�2�=�|U= U=���� � [�;������}�~�ls*=h�2=..�=��w���<p�ɻ?�k��d�;��5=ʦ=j<p�T8�<���X=���<�f4= ��<||�� ���I\=�?�=`�r�����!=�Ԋ=?�����=-d+�
D:7A��n��b��Z������`��R�=7�]�2ҁ=򼻰�Y=@�g;|��l;��XZ!���Q�D֕����=�V����;�Km� Q.<���<�����u=d�=��X=��v�(U�=����ˈ=�6e=`C�<�n*��k�=�v_�<��=P�=+Y\�4��<`sh�tM�8�'<���� D�(d���<<��P=�Z���?��W�=$�<4.�<.|v��� =𿍽B^w�±9�W-�X�k<�C�"�C=�lc<�#�<`�=<��=�=��_���4�9=�!=x��<Hȅ� ��<`�b;C?� �g=�5��cw<��R�\�=��;�܂=�eZ<6�+=
U=Њ= ����͍<`g;h�����w��q���33=�kb�x
m<C�b���r��U=��&=�Y=����4d��"���<8�^=�,9��� =x�<XGH<�=���=�P;"#=`:���f4;\�=�C���g�lz�<�Lc��Ek=b��(�q�����|i�<jb~�b�G=�6|=��F�J=`}�<pV���|���8=~�5�:�^=��?=:�<Fr���h?� �=��=�ƅ<�}���o=^�4=�o=h�'=H�|=�Kܼ����ܼ,B�<�[5���0=�h��6T=@��;0Rֻp�Y��c�}�;�W���kx<��<� ռ餐��B$=�-����k< �y= �C�bY��T�h�]=V. =����x�h�~����U=(��<�!-;�U�=���Œ������T=P�,<��x< �������� �" ��w�:���<|JN�ܦN=j��h�8<��=<��� q��`=��=�*<�
<�:��D8�8M'=ry��V���/;���<����<&ʉ����0E8< �<J�/�}�<��|�(��=Hdv=������q� �D��+����}=!x)�DU���%=P/l��x��y=Dw�<P�����(=l���(2q=Yo�6A
=����_=NE��^�96� =�x��@����0���&=� ���ts�P�+�@�=d���8�<6& =
o�h1�<"�$=�9�=�O�;��=�҅;���<�g
�L�Y=x��=P^b<���;��<H��<�3�<�ۼ��޼�"i<"%�=��=�T=�i����u�cr���)=����ԻV��$@<������Լ0&=P�<*�%=�m�=����`@�>�@��;`P�Zؼ)=�߼@7g���=�h�t=@) ���Y�>�%d=�T�ɠ5��n���P�<�wX�h�M�,�<�+F='O=?e�H=��B��1���F��=$��ع*<������Zc%=�u-<*(p��5���� !���P��_�;rp���ּ.}��,�D��x꼰A\=wk=����z�<~E=�O�<���� g�<�"#l��;~�|hc=�� = ^Ƽ�� ��d�<�L= A;���Ǔ=��]��0�|4ȼ���<�� ;d��<^d%=���;���<� =���<�Q<�u(�&� =���:�&=Tdh��@������%.=@s���u=�ֺ<8'=暍��҈= ���Lp�<¥y����=|��= �y�^;��>H����<�x<��<p�^��T<�!�<��A��
=Ġ�<"s9=� [��A�;h�=�s=k`��[����^<< ��*�ּ�]����;��G���}�<0�����0=8�����<x�8��7<@g��%=������L;��;*
=��;r�=�]����`Ba�� :=<�k��J�@ M=`_=cc�툹��a�l~=к�[x��?T�z,Q=���X\
�p+S=��,<L"�<0�k��}<����D뫼\�=x"�<e9���b`���ͼ�h=�;�=X�<p��;�#9�q �ly���R=���ܢ�<�4�EG���D��+� ^;|@<�ƀ�ty=�X=���F�A=(�P= W�;U���g�<��=P��8��<�����w=R�_��
���]{�l_�m��`�\=dXs=���0��;�F�8� ��]
<Ⓠ�(�=�9 =�C#=��P=���b,1=0��(�3�`pp��\T:q��n���3%����=�,��ܰ�|&ɼ(�x�>S���׼8��<২<�ú��;��?�;�n����<\����ƀ�fjx���s���<t��<�L� �<�Wu��g����H=���=����������H���(��a�� `�;n��H<�1=ze��~�<�Y�x>A�y�<p�=-@�p�����=s�D���W�"`:��B�=�&���������Ui�H�1<�2/�y�G� P�<��9=�h=Lw%��cC�x�a<LL�<�0��� b��3=��k=�XQ�4�\=��(��y�;�$A<�1����h��<H(<�OB��Rp��ߋ=�� ��j��3�� �����ֆ7����;��l= ��=��<�;E�jX=b�K=h?���"���8�d<��=zZP�l�I���=�����T������`�؏x=�G<Ё�;T$�<��A=*�B=�Z
��>�<@f�<Ӂ��&G�m2n��2��D8=<M���=L=�F= �=�
��:;�(T_=��y�h�=6.����K�������;�EλNS����=X��=^.�����=8�n=�A@=�-޼E��<�R��X�Г(<���=dx= �L��ػ�Qp�H,Z=�ռ@���Z��=0��=p]�k
���<��=C����z���=� I=��=��ۼ.r4���==�/=�ȣ��(~=\�<
��=@W)���Ǽč�<n������.Y�Q`������0[w<݊�����8�t<���<~��RƖ�8 =�l���O<v�V= �S=[s�����l��F<x<3��)=/cj��2T�D(��m�db��
R=!V=���<�1f=�7���C�`Z��V1����ɟ�[�H�(�l<�=�`�r���iݻ|��)�R��T ��?8��Th=�O����=��_=�D�0E���`�`�o;��<�����y=V:"=��8='f����=�$Q�( ��wb���B���U8�f1�=@�';���Dz+=\kռF�=�e]�^I0��?�bgH=���;��d=@J����Q;`�J����=�b<p�л �=�`��<�\�A3=Xt�<�rI=���D�l���<n��=�=�\�=ض~=HBS=ƍ���*}��=��~=�5@=[�:�#U=� �,��=@a���M�<�O|=P�U<z����ߏ�i���{��f�U=B��@�A��)c<���;�{<lڠ<S|i��1���h=��u�64w�`�Y�b���>(<�ć=���=�[�;$�Q���N����� ��?k=*�(=�P�ܝ�<��:��R�dD&�������<�^Z�yJ5���V=D��<�n���=��<�^=���<(w=�X���O�<����T8����M<@.=���<8mq=f^=!Z
�@j���J=��l<��,��j<�t����<�t��i���|B\=t�}��A=��<�
�;x +<о�<�A&�AU����=���������D�<\
����=�Հ<z���\�B��H��ofW��u�����D��<�˵�� 9,\q=(\e��9�<�W;Ѕ��P �<��!��(�<`�y=4H.=$ ��$W�<����Ե�����8j=����x= +<R�-��A�Psf=�)���;���\� ��%�Po�@d�:���FV�`B�<�i��0*ͼ,�=(�G^G��ߏ=@������
�6�0a<<�cS=��}=�6߼8���n~=V�(=�^�=�N<�i�<�_<<�����=�j����;�'�<�vp��a=�o4; =z��=���Ԁ�������`=uY��%���i�� ,��Tz=!G����= (<<x�ɼh6<��="��$��=h��<��]��$v=�����<@}8<� ���u��u=�Z�<�1���C�=��e�����D�=0�󼸖�=���=nч=@� =B��=��}�������T:8
<~Ѽ���< Uf=`
�;�����<���<D5����=|�I����=g�߼w���=���=�ּ<�c���}�;�>p��=tJ�=���G�<Ԏv=��i=���<d��<��~��)q=$����M��9x���<E��A#����;d<�=F�e�@��<~1��(�R������;�;�6�<V��=fp=�|�<ҔӼ�?H�����| ^��Z�=��=�(ü��3��y��,>�D�D=�F��ޠ�0 c�\-=V�3�N�f��8��@�R=L�ѼV�;=L����<��<>̵�6ܡ�L]G��d�=�\��*�="XE=Js=$-<�& ��Zp��|�=p=�,�� ���:�= ����3���2ڼ�Ie=Lr��e��@��<2(F=�Y(��������h��@F=��<���=& $=zQ =
�r�l�k=4�h�����f@�VJ��};�_<~q2=��B<�N=�=��i~k�R�>=�X=�:?����$����<{h.�ZY�=T�g=Hs��=r�9`�O;Ag����N��*�<`{�<���?^��� ��Lf=f+F=X�;$�?=Z9H=T�7= d<�����r��t(�0�=޹O��=)�M���; _��:= `@��
R�H
K<h�5�VC\�Y�< �<��X�X�<PƦ;��=��a�|[3��|����5��E���9�We=4xb=@i ;�{==|�<��@ߚ<R �� �t� I3�p�"=�9���f/;�3�<������0=T�r=�i���慽�мL>=��~=�r�7���D0���U��S#�T�=�&&=��T=��s�"�/=\��=2)�����cӻ*�R�>�ɼ��|Ů��d�"F���*�<��]<(F<�E�=8�<��=�<��=�ً=��<hb���=�5e�`�t=4��<򼊽��w={�9;K��"�81����<� �H��N=�!
��Xh��,����=>6��l��<�꼔��<,��<�,<��=��r����^9ż�Y������$=~�j�0��<4�t=j.ڼX�<�G�:C^������ ����=P��(�����j=Q���A�<IJc=ї��T�=.L=���Gr;Э_<s�/��ټ�=4���*����W�Ļ|�"���̾>= ³<��%=A��%r��LM�=�F�0f��N�H��<Pq�����bE=���R4F��n$<Z�����z�������<��2=�tb=�h^`=p ���A�����I��0���ͻk�����;Mn<Ѫ<\/V���=�������5E�΍P��,S= f=�7�Z�=P�h��Ā=��p�Z�;��~�p�=#�<R�>�h:���L�y>@�`#��8D�2y��Z�B�P�c<�y4��`C=P{�;��<��'=�w=��\�^���k�T�MU��|U�<^R5="饼��<\'��(m�<v�=�5=M:G���}���W=nD=03�� y��h�=T���&����|����q=�C��0*�<79�`�<�*����=� �<jҢ���������*=<�A=��T�`��]��Hd�<l*=4�� �M���b:�i=�sk= f�<�� <JҼ�mx=X�E�J������D]t=�ߐ==!=b�G=8U <��=�=��
<F1�=���;�K�� �<T�ܼb-����x��DB�tMT�Gb���E=t׊=|M�<��[��hO=. 4��i1��KI�8׊<�K=�-�<������@�X= ˏ���8���<�Lμ(�=��������u�4}!=�~=@�����x<��<e��"P��p"�<�p�Xwx=�pz<�p]�Z���X!)<��#=���4�X��-���T"�<��(��Oh�p�:�H=pΰ;�+��_D��\Y<� +�z��L�B=�;e<��=��7<���;�W�<~� �F;.=�d,=�%�=���ʻ�"���)���<=#9pme�<�=ll=`����L?�X��=/�[�H��<꼊��񓼤 ?�#���8= ��u��hĻ���=�P����;�=K�H�y=�J;=Pc9�S�&�0�i<��� 3,<س�<�R��<���ܼ�\���5=�*�T�6��_;~=6���r-.=����D$�P뢼�$9'�Ծ�<�E�<��=д�;`��<l��=� L=BWU=�[�=�A���n��r#=P��<�WK��q=��6���g=�e�<ȳ�<dsP=.�D=x�;�c�<�mv=�G�(�|=�*���<�t��(�U��.T=.�4�8n�<�Լ��D�H-���9h=ʄ�=���=h3f=,��=@ƌ��w<��[��ӄ=h�l=�a����g�@_��Ư�X������$/N=�&�����~h�=0�U<U�=� =��̻*ّ=�փ�p.5=�y$������]`=�t7�\^=��'=���,=Z�2�`V��)�L��<� )��ᶻg8��:�=�>���@�B���<@Dƻ��E=��=$�#��ȁ��o=������m= �=f�=�Ȼ�v�=��f=�Ռ<z�x���ջq]�X <��<��;0ok=C3+���I������<=�-<xK�<TA=�a��|�X=p�r=WV=�p��n��= j��M�=ЍP��:=T2W�������e��ĭ���/\���`���v="����X=�7��Z~��xϼX퓼 ��<����;�v=;�3��B�<��¼�����_=,!��z�����<�P�<L%j=`j~<=�.��m=L>��U=@{�;(�\�γ��@��:�(�дd�8�0�Ự��;��?=�=��&=��;=�&Ƽ@)����q<�9D��e�k���DJ=x�T�t�/�Ϋ�=A� ��&鼮�=�d{��l<�Z�=�GO=�ڏ��;w=������g��2�Ғ*=�b<��;j[=��[���E��>=Fދ=Hl�{�����?=l�4�$N�<,�=C��o=�Ax��-'�r�==�/�<��<$��<� �<x��ݸ�l
�<N�=P�C=0ȁ=�^=��N=@L���G�<#��ȃ�4<����<T1>���(�����.H=�7N=N�'=r�= �~=���:h�<�=�ֵ���R�t}�<x1<�tq=��H��H���s7;�i�l
�<| b=�̼A�Ԟ�X=8�<=Џd<d���/iG�ʢu��Vʼ!ﻄ2X=z�_�G =��9��`�������E��(�<��$=v����8�=���8�<�� ����L�6=a̼�;��3)��`̓;`��>�+=O�=@L�<!�Q�(�_=�o�<��j�hQ<��<o��={�L+)=ķY�h#=|s�<Ϳ����;��<����0��;�^��p=��C�R�4=�1���p���6�F�T=���<x�=,�����;l�V�ݼЗ��0�<Zk=H�D� ���ه=0��=p#���==��<�h[�h4:<p߼�v>�= ?}<z�=�D������z="���_=�ڻ,=x��<���<�N�d<��X�R=�aż�+M�yY~���.��(-�Z;�=h�=��¼J-������f�Ӽl� �H�Q<Boe�C���BL=���<�i2��W�{����K�XN=L� �@�»pݻ|2=V�s�`��<�%�=�.��o��jN���<wfv��m;=���x7a=���<� <��E�����dc=m=����^���n=�A���M<8��=�=#u����Z=^wɼ6 F��i�<�4<b��=�y.�lS'=$ɐ=B�H�<(���E<�=�AN�p��;j�=���<h�����N�������<t)�=X�=���烽������һԖ=��,=|�6L��x��PGn=Jw�r�=j�=�|����^=�YS=�B=��<������+�Y��;&=x���P����ԼMi����:F]^�i��L�e=�o-�D���k
����<����0��vCX=��=�mB=҂H�X���,��)=�� =p+�=z��X49=�[������ =@2A;�ּnټ����s<����Tu�=�U�=�=2=lf+=f�@��x�<b3ἀأ:
昼�<��Z���p��z[=慅=$ =bQ��0�u=9�=>���l~<h�1<�Xz�ZƂ�X%V=��I�� =4ȃ=&U����<�ƫ<��B��Ó�p�.�� <�瑽��)=�>����V;2�C���=l*r=(�<�c�<�`����y;�<��� Z� ,������3#�J �V�����>�`S�=>-�=\o���s�=|+�=�AO� �m=��`�fW=��=ؓ�<'� ��)�=���=y}=�DX=-�<.� =�}'����;L��P\)<�x��︆�tc���K���=p�k�%y���=�7'= �b�^Z�����<G�;��ѼL
?�����>�<��^=��<X��<��=�N���= C�;Vh=`�t<t��<؀=����hk����^�Z�Q�[�S�f ���!��L;=�:5� �9�n���҃ =�V=��b=@bN<2�C=�Lf����nȁ=��z�\=X�<pżz݁=��S==�k伀=zG0=��=4)�����<���=��<�d�=�:=�fN<&!z�I����l�=
���L�j���
���?=�߼`����p�<<μ|�B���|�<�Z�v�j�p��̰<,�U�P��;B7J=<!�u3��t���a��ޤ�&s����L�=2<��(�<���;u���0�j��P��;��3�X�����;���� @&��+5����;L =rC=���@z.=|�=�@�=K!���V=I�<�<=��O=�p<�3�<@�ܺ���<�x��f��,yZ=�
=������v�ā�=��|=+c�~l=h�y=���<��8<Xo<gl�>瓼l��<^{�+ �@��:�S =-����5;��=Z7�������}��D#����<��;�蝃�2����7�Fj�����<���l!�<���pe=tr1�hY=.�6=3�`�0�r�<�(=��!�<@z=��a������.=H���(o=�75=�J��x#=8&�=��,�0�2<�� <ڍ=2u'�4���Z0=�b=��;��s�������;���= }��f�\���Z=P����<b��< =��(�v�=2Q�=�LU=� =ܹ�<��6=���Ѐ'=�<;�|&=���<��(=4�,=nq�������j��,�=�*z=��c=vQ=g�Q���nk���q��X�<�/�x�t=�.1=��Fӏ=���<�}h=�<<�y�=`s2��K=��0� ��;rM����<�̋=����8�<济�f�9=�|k=4"W���ͼ�R�;�J�=@�<���=��T�c�i���Z��C�<�=���<� ��搼�&=����B����M�=����\`�<���ԟ�<����ͻ>���<�9��=��=��T=@/w��hS<�a;=\%�<�^'�(D6<���;8~v���V=.=�^�3=���<@{-=~V%=D�h����<��/=2�=tA����\F� � =0p�A���6ݺ�:���;��>�������<"�=%�p�@4º81K=����<�}=@�̻TxE=��!���x=x�L<��$����-�=�⬼Vc����y�|皼(��X��o�H���X=[6�&MT�&>K=8�k=��+<X���i0���5�0҂<`�{;�E&<��k�����_��t���~���4ǒ<0,�;9M����Q=�<<!�V�������n=.O= ���������M��>�<�u}�l��=�S<T)L=� ����2= <@�{<��Q�@}J;�3�< G�;�c���ü
eQ=,v=�"M=�lk���~<O�e� �M=�;�`C=`B�0ș�rQ=�#���ѝ<�[�2Ἴ��������*�<��+=Z?���,Q<��/<�DP=��=���<�q=?ox�"ZA=(\e=��>�F H=8�����<lz=�3c=�Aj�H�]<�8���#<�$=��*=!ߌ� G=��;F%d��W$�P�=*���/7�0���o�<\����j��Dg�<���<� 6<PD_=L���h�;8)p���O�n3 =�U4�����rt=��2�2&="؇=r�<t<�<��V=ܕm�f����L; Q��ż+�y=F���@B=X���̼�<+,���<�Յ<�d<=����2���}�=Z�,���Z=��@H�;��=b��kd�] ����:@���,�C=���=��3�@�����#=����
Rʼ��b�2=�� ��`��}=<�:�un&�͵��]c�l��<`g�=R�S����=OٻvC*���޼\i�= [�^�C��C=*� B3network_body.visual_processors.0.conv_layers.2.biasJ��Lo=��=,�5=@�ͻ���;f �R�=X�-�0+�;hY=��^����T޷< �z<������X�8�<����e<�{�< 뼀�/����< "t=�̳<ЮH��;<�/;=�=�t =�?�<�[�*ŀ B5network_body.visual_processors.0.conv_layers.2.weightJ����<�4h=<NüЙ�0 V���s�5�lDJ=P-��� 9(�w�2%<l)f=����_n=�(�< �v=b�|���<•7=Pr9�Rd���=�v= �:������;��Y�L���X@=�t�5=���;�����?�<b}e���b�U<��R<�o�������g�d�6��Zѻ<����\ =�\<��-�l�<�% �&�#=gJ��@Z��y�<l��H��=l�`�<<惼��E�X�Ѽ�!�<|����Q^<"��2�s�@i�;�ئ�o��ha���^W<����x�X=���<� :�_Y�&�(=��=�i-��-W�������<R���x)=a=�39���O�,#����k=���;,�ż,JƼ�w���f=0���8�]��̹t�!��f=(��<���<N�U=@�<��
=hV<X�R]}�rAZ��
� �=+=XN�<�#<��#���̼�M�<�O<P��<X��<�ޘ<����D=:�l=�e��@נ;ؿ�<��߼.�3���0���h�(V�<�] �@����0=p@�;�Zռ$�=zk)=�(`��~1�����|j�<�9n��|�<<�\�( p=��{=�� ��'��X]��P��;�g��*�;r�w�ʞ#=R o��n=������\=�ݼX�p<� ���N.=\��I=bJ=���ɺ9h77=`g�;5�<�^%<��[�~f = d��j��dI�<@7��WQ�T�1=|$��ez�d�<~�.=��P=z�y�
$ ��T꼾�b=lk�@�';��-�����
8=.�[�`߸�6�<��
=p��<�ӫ��vR=@t��}t�:T=�}C<�=����}=�� �.^���<��u��K=L�<�)f���[�<���(飼�,=�Dd=`PQ<l��*3���=����&�t�����8 ���I=vb!� ��8�S=R�-=<@v��z=�Ѽ4�=��K��H=�kr=(ך��>=��H=t?]�,�#=����@����ֻ���h}=f�T�.8u�����.s;n�'=�_f=��,<n/d=`�s<��t=ˆ{=D�*�@9%;f�'=��T�Xw��@2�:��L=�fH=��Z��H�0��<
XM��rƻX��$���`Х;����.\8=���<��h=�ui=�����[}��e=�.]= \= R�;�J�\��
��8P�Œj���q�l�ۼ�O�<�^=�o'������uc=��X���/=�,=d�{������0�!�8�,<�y�� U���J��A=R3_�^;����<��=𫫻���<��j����Եt=nF== ;��C_; �?��e`���=p��<hQ=�G=�{!�2�H����<Tg�<(�<l��<�kQ�r,u=���<�����<Xix��3�<�03���<��S=��a=d�=H��<r ��z�ڠ���9��/}�����F<�r,��2<@P <Б�<�V �@���p���C2=@�(�*�u�<0< ��7/<0�~�py�p;�;lE�� �<�����0^�\�ü܂⼸��<��;�m6=-:�TC<�!�<^=7= =z�v�h�+�zQj����<@��b9C=��=�`�ü|����Գv�@҂;��=��e��pX=�GN=��Z��(=� �����8��&�= .i=L�M=��]=l���j|=J�`=�}�0�.<�h9�V�&=�QJ<H G<�F=�<p!�<�m"�pg=���;�,���
=��@�h�N<8�i=ևe���<��$�$v��(��<��4�� ]� ���@� ��2�<��TΘ<@ t<𷦼nq=&!��޼܂�<*q=p3ƼL�!=�<���B���g�ry=f���m�@c�: _���t��#4����<x\1<�J�; X�<в�;<zp= u=����3;�8�X�R�(&<$n���� =��[<�D�<|8B=������==ց =VB�H�=Ld�<�5r<证���]��)ۼ��ʼ$>�<Y< 2F<d�<P<*�T=d`�<��R=�]=�Q�;�<=ڌA���=�-.=��Լƻk=\��<dU��lFt�NZ=@�h�|,-�Ԟ��1����,n�@��L_�<��� m<�7J=�[;�L V=(�I��5=��`<JI-=��a�J \=�J��7 =����&�&�(<�>� u=w��0�<=f� =��O��=�<$�g=@un�Dɒ�P���f�T�����<`��^��R<TԊ�&�l�dB[��'���q�>a=���<t�=Xr�<�68�DǍ�û9'�0�;h�Y=D�ڼ`,��;��H�?<K==��z=|j�<j7=`�<;Є���$}�� ��Gl=h�ͼ�8��6=��8�J,U=��(=�Y�<�=LC�.p)�H.�<��%=�p�;�iż$��<A��ԔT���A� ���<�����=0�<P0�;�&��ءg<p���v2Z=��j���M=�nY=(aT��TW��޹��PQ��_N���.�@�}���U=�A��fhG=��w���t���M��҄<�a=�� =�n�<��=N|���*=�/=ڦ^�$�<�?=L� =�x��G/=�f輜�u=dx=@�w�����G@=��ټpR^<��Ǽ�� ������B=Z�=\�����G��g����j����<�݊��(L=p���Ro=��D=�B�<��;��<r`H�Z�P�����|���`�h,C<�=�h<��:���i��Bv��Q<&�\=��<`�?=��L=�F}=�3 �^"W���=�[���?r=@��:6`7=�f=�ؼlr<��A�x�9濼��*�d��<��C��Լd���0�R'1=\`=��`K�������l=x�$�b�C���;<,/�<7�<���<�"�<��;4�K=�RC�ȗ���ģ<张o�;�X<h]�p�&=4y�<�{q<��=�I�jA�"f4=���<H2v<4;�<�u�;P��<f\������RP�H��H r���9�� =��K�v� ��د�`u��0N�<���<P�<�,Ѽ�a=���<X'�<fE�n4\=��<=^ o��;�;47=
;�0o�<Ps<���< �}�*S���c=r���ܼ�LZ=��{�Pk�$;Ѽp.��`�q;�D<L�^�t��t��<���:��-=4����g���<�Ad��R�<�=�:��B���߼�:/=�~?<H�3<6]���0��;�Dw����\0��y�!I<L���X���^E=�,=vbF=�[ڼ<�<%k=$��<��0v�<l��`�
����X5S��mX��L�ZU=�A�H������Ĭ�<Xł<P��<��ּ4_=(E< �¼���F �Hmp�J&;8�Y�he%�v\A� >=���;0�����po\<l^�<������g�ڝX=�̼hǫ<<����&޼��W��7H��>����Z1��i��E=�ܼ ���������P� ����ȯ<ȧ5=��~��n,�<N�<�
8�jۼ�$�<�
� R�<,�*��G�<J�q���-=l��<v�)���=�h��V=��`��
o<P4q��ag�Vj�
� =v�(���=�W��`KN=�w�z`2=���<�Ch�8<<��9�M�@���L�< ��a���>��� � 荻p��ɷ<p������<�ڡ<��غS=��J=p�<PVL< � <�[=6cC=r�6�(j�� "�<�~��x��&u�TR= �B<�M����m��k�;���<`�I�����z2�x�_=`�g;��M=�Ka=0�c��<�y�0����s=�6��vR= T���{*� �e=�)�<���:�s=R-��n+=���<��l=����ȔZ��"���,
=��(���;*�=ܟu=Ȝ��K#�d��쳻��N��~!���+���<82�~�j=�b���E��M=� ��� .=��8�����d�H��+��F
��g�<�4k=��¼`��,��re=��F���2��V= �h��w=:� =ʴ ����h�l=P��ে<hj'���f�v�/=|���V�4������
=LP�>u8=���<��*=��=��i< �p<\� =���8/���P��<���r=.A=�ڑ<�Q,<��e=|�C�J�8i$�:EM�/���a�8� =��{=F`.=�NW<D@����=�vB���q<xu��J�M=�<��|(�0�|���F��V.�T���pAż�<J�l×<`��n�R��� �P�e���^�l�#=ر漐��<�f<D0�<�}��^�j=8�K��m��������O�(���@ _<��'��(=|��<@ }�V�=�vμھ=�Y ���0�������$�T���\l�<Ξ=4����LA=���\��<,cϼNhw=v���I==������f=p�;�;.=&�\~�<�����n<�{ ��`x�ṻ`l�<�4Y���l�pi��r�<�_=|��<p9E�J�n�¦C=�6=d$��v�r�4�|T��8�<4��<���@����(�< � ��\)����<4��<��<���;\������;~<O��܀�Զ�<����P)�<����v=^�N=����@����S=H#=x�ݼJ�;�2�<��x�Tz���k��`�a��'���<��=#>�L�;=��H�QE�d���#� ���Sh� i�� ��K»�n�<OO<@�]��r��0�$Q�@m�{=x4���"9=p��^�m=h��<F|=V=|��=�;=�Qf��yG�� U<�D(=NOP="�p�$ɚ��P���QQ=���<�U=5W����;*� ����<��Z<@ƕ��Cɼd�=L`5=��d����;(�R�Dj��0��DYx�����ؼ>���~�ޗ"��}���6=�z�.:%=@� ;���<غ�����n�=<?������yu=Sq��f���<���I<��]����n���;(=0÷�<�<�ZP=B7�����(Z���hԼ���ht���q��})��:<��8=��뼀 ;��a:l =l�L��f~=��ͼ��E�j�z= ׼�u�<�aY=x�S<�d5�\O�<��A�0 =�=��x= ����|=`�< ��<p�m�غ�<$��<`�o<�_�<R^=�)���}�;>�|��vһ��d��M�����$�;� �_��SԼdM��J��(S<��=H3���ܼt�P��/�p�y�� ��pP�<��=DB��(F$="�J��\�<�WJ=�=)=��
=�Sj���T��/���gM�`�:�@��:�8�;��=n�d��O����g=���<�}
����;�*�<>����Y=0f,��$L=P� ����;ăʼIJ�����D߯���.=��=��r��Լ<0�O�6�V=����^vj=8hm<@��:��}=�A~�|\+}����<,�p=<O<������
���ʺ��0=pq|�(��< �=��M�d�)��?=`ӷ;�n��2�9=�\T:�r�� ��v=T�Q��C=pC���z =J~4�Ƶ\=r�=��g�ġ#�lQ���(<�P��=Lj�<���v�y�R�~=\���
�=�c��~=�c>=�:
=�P=ȝ)�M���*q���X<?���i�Ґ}�4`
���v�0>;<r�Y�n�F=8������;"rf=��ûV`<��=@)D;X#��k.=�C���tO�Df����U��MA�F)=4i�<��%��Z+����;�U=@��lv=�$=@�e;b:=�T��6�i�:90���x�<�H��� <�<=��=�M��6V�,�z�@�<R��:`=��B�`G���=xa[�~����<��<:�2= ��<��@=��< wn�Υ= ���"=�Rڼ��<,AZ��JZ;�&�¨q�V8=I�E�� �S=(��<�T-=xz�<�E���/=Э��ZM#=*�P��d)��P�<0(�<�#����;��D�3<������/��v����<�/^=�Z����ļP�]=Č��f:��n=@��g=��������$=��C���=`��}I��%:v=2w =`G<�J�<p��X�#�6�<=p��;0\�����<h7l<�| �TRn� '�<p��;�W(�r�]�����_=eM�bZ:�0&��F�n=��<2A=m#=��i=�V�;r�>�|� =�9��-%<�l9=��.<�aL=jb��E���bi=b�T�`ut��$]=���<����jؼҕ0��� =p>��D�⼞#n�@k<�}�=`��<��*���<�1W= ����ڝ�$��<X8��E�:���������=��<����4����yg�� |={=.�E��5(<��T= �W=��=��<4��<�y�@���� j=���<�5=ԙ=H.^�n�4=���<�m�<��;(k=�'�<�+t� A=@��� �;;6�<Pq�;@��<�o=0"&�,ߙ�~��$�B�X����a=<��<pܗ�4j �z? =x��<���԰=TW=�IY� +�;v K���B���=�ɺ<v;
�T���|�V��pN�6�2=ȓ������ =���t�c=��� >�<厼0a������^�$��<`� ��0�ti�<R�$=��==��|<�#=f'a=���(J]��t�:r<Z`=��ݼ��޻$7-��������Hf� ��;��\��< 7Ѽhy�<8�%=v8K�h���"�`Z4�0���j �V�%=��*�Z,=��Y��i������8��<�C��[��` =��x=h��< �<��J���<89s����� d��̕r�@:ػ�뤻d`Լ��=�; =�ez<E6�H�V<X� � |�t�5�P��;\@���Ч�T[,��1=l(������<j{Y= r=~%H����b�~=d)k=T`�����r+L�X�<4�=lK���m\=��C=V�9 �|<zt =�\�<�1n�zN*=� #<�ʄ;�ռ��?=@�%<~�I�p��`�;��|�؄}=Me<X�9<�
(���)=�SC�ZvD=�@�`P=�v=|=8�$�u�l!Z�H7�<�T�̝�<,�w=n�.= =�t=(����b�@pq���"�(� <�be�����ь<�>b����;Pt�tc���M==P�����;������<ږC��� =�Rt<��S<$����o��Mw��]7�+j��L��@m3;�;��TC�<��F=�=�O�r���f�<���f%?=�;=��,���f:�H�&�]=�=h?>��d7��m�n�,=\s]=&�[=��#=��'���!<n/���;6I
=xa����;��=�9<�P;��W;�=�� �BSl=��5=�s=�Mc=�\Ƽ0eE�xA<�X/��8<�$�O=Ц�<�Z�<�𿻀D�;�(M=~�L=�tR���=�<f�@즺������s=`� ;4x��>T���<�^N�2<=�U=Kһ�$�<��H=^X �6�?�ta�< %=N�0��W��v��#H� �K=�?���A<((=��V=��s���;�o��
��,�x=��X�h�<`8(���<ą��\�<�wD=�Ÿ�F= �ƻ��<�o<lo=�G��B=X�5<�;Z=���;��a=�����A_���~�H�<�L���;<�&�L$�<P��<P#�<f�z��ZO�ԛ�<"�F=�F���wh:,��<D�4��jb=�>=��< �.=�gX��w�<��9�2`��ͳ���I����D7�x� ��Wh��`=�ؼ�#=܉�<(��<%7=�"5���+<@R�;��$���/<�K+=��d=�jC� �/=�8��*����;�[<p�<Lb�<�{=�T�< �X�Xć��"�N�%=�C{� ��<��$|!�Z�Y�ij�<�+�<JI1=����]x�@A����e=p��d�#�贁<0��;L``=�q��࠯��B�<jl=4 9��<�&
=B�<��9<"�3=;B��7=RL=�`�-��F+=���;��q���� |����<�_c�p�ļ�=T=��L=p 5<�R=r =,��<�9�;������;���< &��%w=4�<n"$=, �<�\��@$��L=�꿻�� =$H�<��x����<�]�D =v�%=N�`����<�c]���\=�e5;���< �Լ�i����<1)��U��82�<pq�p=�� ���������<�~n<Bj=̤"���*=���`0R<�mҼh��<Fhf=L^�<��=�Aż8=��r��*a��}�<��L+��h��<�����=*�=,>p���j=0[<=ۢ<l���L?����ۼ�Tc=�V�Z\#=�:�<T�<,2�<�+������;�:�Jc<�~L�u�<��|=4F>=@�M���%=l㼼��b�M�$.Ҽ>�\����<K5��ּ�i�d�M�:K?���M���S���3�`j|<Ruw�.2;���� ��JW}�XBm��5=X�=T6�<�4S=l�s=@I �l�=@�<H�M�� �:@|�;�S<�')=��ü��=`���|=�%5=RS=��=�+�H��<�2�;b�W=|HR�~A&=4]��1.�paû����l���� _=�
���ӻ�ǁ:�P��$F��7�8S=�#`��@�J?=H�l<.��`���ێ�‡8=�J=�!�@�5��s=�%e=�]a=��=�jy��� =ܾ�<�'<�=�i'�n[�����<ڼ�٠��~c�L�¼�������"�=�)��Go�DK=�<k=0�"���?���+<.�f���3���Q�6�X=��X��N�<��z��h��Pl�<��� =p�a<T8>��>=��@=Їf<��8�Ժ޼��<�Kj=��6<��ﻜK�<��z�l�E=��S<��O=��i�Hcd��ϵ��S���=dPϼ�eK=T1=DA~=|�2=�R=pK�;��5;�����w=����‹�p=һ��Z���Y�N�_=���<:�(��'��\�<x׶��Z�ȥ�<��m�p�C����<��H=��+=�m=�=���4��<���<�\�<�j=4;޼ ~=PL��n^y�X�=x �<�s<��Э��B��:[h�v����=0Ļ���<<�^=�=�b��h�]<������:<p����0<���<`B�<��-=��̼�\ <�7=H�<8�<�DM����;{!���)��ta=~�=x�9����<�d�<�8�<p��>��z��n�<���<���;�O=��T=�}�Й�o��Y޼n�#=F�#=P1�;��xy��Dl<L�缀ϛ<$�p=��U��g��\)=��x=����C�<02<̮+=�/=�� ��&���6v�>S,���z�|:~=r��P �;P��<�I =�F=���`W����9ڋ/��G=�n�WH�0T��D:8vW=6_r=pT~=��]�|%a=��P=��;z�=�
=���0*�<v$)��1j���W��9�;�<��K����U�<��D=\�=����"�O�\�<�����
/=x�:=h��<��=@?&�r(%=�-�=4f�<P����(�|B =`&һ�$����;`�c�x"��� � $.=�@�<z�8=\�q��jd�xj�J�m=< ļ������l�n�컠����<�~#���<8���n=��&T=�\��F=h��<
����z�(�뼎)=�H><k=.�.=Zat=xN���:=x�%�(^^4'��CN=ܿ�\;��&���f�y)�PA����<��G=:
,��^�,�C=]5=�e��j��Hj=̤M�0�<� ��x<�==.v
=вV��h=�`��C[��K��Ọ-=�����/=Z=�ȱ<��<�=�6<po��p��<I3�<�<�^� >�����<|mǼ�-����0�$\�<|]O�JpN������;�b
��Rüt5�<(/����D<`[��>e6=��<0�/�� w��k=H��<��<�HVl�0�û� =�.�;H�=�B<\1�<��<0;f<=[��;y��-(=pܤ�P{=p=F�F=��<=�+��ļ$��<�oa�n�a=��y=b�a�p�r� �I<�;>���(���q=����e��,�.���3=�< <�_���Q=hf_�j`��q8;��B<���<@ '�«=(=.�;����<,.=Nƻ��k�0#�;��Y<�E!�l��\#`=B�F����<�T���� ��[V�d�S=P�J��JV���-���=`I:�j!���I�\'G=�5�fO�Vy��TZ�� ��
��I6<6�`=@����-�;��;v� =X��8DT����U�\�<�kX�8�^=�Va=�W����=�yD�
�n=:�~=�=��N��qK����*D�^C���=���;`�)<�O*���r=\]���\<��b<�ʶ<Ĺ�<�!=p����8�4冼��i=Ȯ{�4<K=0)�<pW�;�}�$��<`+��3;X\:=$r���X�*}k��N����A����K�d���X�<h�<H�=�"�TIM��AԼ0�ü��<<��<P�g=d9�<P2�< ���l�<%��X�j�
= �ڼ\K��$*�p�)�.K=� D=dY��rnC��_��Jn7=�i�<�5[=��K�������=���;�Xt=@�|<rwy=P�<0ػ�X������"= ����ݙ:p�|�0ż`������;��I=jQ����<X�����ϼ@h;���@��:L�<�Ix=�%Ļ.�:�ȿ �(`��`8�<T8�<N�j=(��<�);��!i=�?��v��h�i�8����Ҽ����
� ���f���<�\��I��,�<��� <D�Nu=�06=��<6�+=���<:4.���S� u����<؊��|ۛ<�v��Lc�<�<�|=Ĵ�<@��3�� \< )<�-8=L��<�1�;�Mż�p��̹�����=��Ë<D�A=TZ˼}����r=��$#�<��HMʼzP =t�\=P@�<��,=�k,=� �� =�C¼R��H���]�:<M�<��X=�:H=��$= �z��ܴ���;|����<�sQ�<��<@���9��м�E��UҼ#�<е��`G=��-��87 =̶Z����o<��[�|��<��d��
�<�Nfm<��<���\<X=������̼��r�8NG=��';=J^-�M0=�8�;��� kS=26+����<�b�`1�;� b<N1�h�D<Rm=�q8��N[<dE=l9���8.�J,<$�Ѽ@i:����<��G<(�'=��<�Z� ���"<= �$;t������N���B=�ex;�����G���w�������H=���;�=�l����:�/»0ѯ<���<�z�tb缬���8�=����9=J� =R�< rm��r�<2�==8C=��p�<m��Z� =���<�5=~&���e=l�+���2<�Si�j?=h� �؏��P�:<rJ���ݼ�gG����<J_��7d�L)��$l[=�K'���b=�a�;��s=�q#���p=|&����< ;����Xں���<H�'��,'=����O�;�i4=�L����=��;X=�%P��1]=x0�z�Z=��x�г�;xS���5�ܺF=̧"=�у<^�v=�5���Z�;��a�����|:��S�D�t�4�/=ແ;�鿼�?�<PP0��ދ<JdI= [�<p�W�� $= ��<;���=.Gf�8m<P�?�4��<0�,�@�;��;������Ac=�v7=���<�p���z����<�F���d<.'4=t�A�f���e=�w���P���7��$�:h_=���<���;[;���6=F��h��<:1*=p�c<��/=XgI<����( =�Z<�?��lz��8B<����<��<X4j=��5�xeD<@�� 7�<�*=���pW�<�� =��=R`8=�n=�,��0^��R�\��`�Y��b�����f'��g#����;\.��D�1=8|���u�.�#�n�b=��A��IV=�?��y=�|=�����V�����`="<n=����� �*�=�P�hp�<��y�$��<�B8=�j�<l��(�N��N���"=
�Lx�<�����~���y���
=V?=�����x�<?�R�j=�(5=f�Z�|�<(�r=��d�J=��X��1������5������λ��Zf�X11=hi�J�=�'+=�v���l�N�%=�38;n�~w=6�)�x"q=�ܼ �I��%����$�~��H�.X�$��<JV/��=�h��,3����x�|�7=����R';@p�;�ڼ*�.��5�;{��48��~�<�0^=�0t�ln=�WW�R�=�q���b� y�< �ѻ� =tb�<��7�Lp�<�`<��)=$���LS���D@�h��<�E=�DF�`Wt<��4= k$=��b=��Ǽ��h�Ȟ<@��: ��;>���� �as=<c�<h)��
�~b��^�<Z�"�
Pw=��-=܇ =�� =zg|���?�<�e=�B�4�Z��?���I����0N���Ԙ<��y=vC=콖<�r�·$�V��x�<��L=<_��|���h�J�,���ma�Z�R��^5��b<�Y0�J�X��7��v�*nZ=jV�d�+���_<�����]=��C��B�D8D=̯N=ܻ�<�q��U�<
�<��~=�0<hձ<��=pY<6_����+��@���?/��/W=~�?�@��<p���>�I��~�<[���л������C=�B�<@�@��C=p���l�h=4/n=d��<�z������;=��#=,���^P�lP�<�����:e=d�h=�/S�fZ��x�<X�U�(0+��~=���=:�]��ʢ;�ó;����x�w��_|=��=P��;NG��rZ=�����FH��gJ�O����/�hl� ���O=@�/<|值�]�f�b=�mܼ�i
=���<N�=��j=B�+=lg/=��a=@e��#7��{�<��<d<v��f<��<6!i=t�I�� o�<�
�X�|����H�<�J'<�EG=(���ø<8��<Pa �R\���=��h���<H�;=0�<~�]�j�x�����\�N=�.�<�<2�y=���"�=�º;hgt<@*�:k������H<� |��"#=.z=���<��=lY|��mP�N;=�������<T�?=��&�L�����q����V�t�J�`qW=|JP�@$'�����XK=�Ş<t=N=T�8=0Ϲ�*/1�TX�<l�[=0(H��J
;����X�<��𼐖M��Yv=4`��l5�<�ʼؑ2<BY=H�T�������G�pz��va\�6c�2�w=b�R=�<��l<%p�Dz�<0��D_��m�:Hv1<�l���<��ּ���<��ؼ (����\<�I*<�A�;��A;�R�<}|:���Qj=Ph_=��P=���;�wڼD����<� `�������9`����3l=����ꢼ��<�s8(�W�hD%���4���~���=��/z<���<H�<Ht׼�Qu��t����ݼ�h/< �x��<���<�g0����<��ż~�z�����\��<\Ϟ<D�c=dl%����<��{�F�1=,E
��i=�kC=�s�Лe=��/��԰����,�w���Z==Y<0 �;tIc���6�29s=� =tn(������<��<��t�|M꼀��������m:�n���<�� =���< ,�P�l��I=�c"����<�K�<��=,i=��,=�+Ż�~p�Xа<�,_;���Dn= �; ~b���h��������=��?=��'�<���K����vC(=��.=���>o��##=�T"=̄�<���ϫ�:�=�����Y��b+����Dv}=���:X�����db��e㼠�B=��s�JPM=�PI��R�u=h]K=���<���<�H|=䈙<@}Z<�漈�=��Yk=��(=�M�<�R=���<��%<ܯ~= ��;�(=D�^e���ٺr�o��*r�f�=x�d=�==:d�f0=D֓���F=����F�F=�^=�*�`;&�)=:+_=�{=�$�r�P�:༠ ��XWG<��B�rSH�H��<>� ��<¼k=��!=�Y�4�6���;;l���8�ϼ.9���Ⱥȁ@��\E=h+=Zvu=�=�`��pﳻ@L�<��Z=��`���<�K�:�&=r��,h�<�=��b���z�F�)�d�ڼ<�)��4�;`z2<��a����<�!<�-X=H
�������8<t�k=��b<��R=��Z��D9=TEj=6~7=�3
��p��RP��:(<��<����\S=�o�;�J�(�����9l��6���p�Qa<\�p=L�;N�N�����;�[_<�m�;HCI=8ZX���ȼ ��;�e��H��<���@=�_,��Mw���;([V=��u�؆���U5=nZ8=| �<�J�Ў\�h� =,���*l��2~�,�z�(�ּ��= ��<��;'���R=�����y���V<��鼴�r=���8�W=vv�P����l=8�?<�����q�<@1���S��l��<j�U��<�:�:�J��hz_�� ���4ؼ>I=����W =�v���,g2���4=�l,=
?,=����@���Rn��A}�l��� [��n]=P?���:�l���,ܸ<�j����<���<�(��((�<N9^=�8b< �;X�x�Lή�
m=� �*g��M=@���\ d�=]�La��_4���<?]�t�����ǻ�˼��z�t����#�<���~l�t‡<@a�~�'=�:6=J*O=
�`P��>hi=�Y=�&=�z�� ��;H�E���<x�����<�k�;��1���;��9��}=��w<��v=�n��{e=��E�Xj�4^E� c3=����>#6=8��P��<��8��ߕ;ȳk=T�[�֫Z�$׼F�(�����޺`#�<�Pc����<�=(���<D�< 1=�i:=Ȋ�8�=�j��K�<��,��<�A*<`��<��@t�;�I=J�2=ȴ=�j*=pp�;�=Q=ڤ9")=*g=&�N=^�u=x{b��a�<t���0��<p0����e���y=� �:6f^=T���|�Џ?���<{�;�5�5=����<��/=�`�<@��;ĝ���<�3����$��E���:��x�n���q=�6�d2@��6|�p1:<�~�<�]�\��<��缀z�p��;Dߑ�m�<�+,�t5Ǽ@�=�36=tG���y����XC)<8���w���xm�0�J<�_P�l��<������=��=�����c<��=��@=�I��p��;��<m�t:�<R�$�(�$<(��<pg�<�Mg=�2=��<�fO�8�;P�<��[���j=*�=��f�*=`�g�LQ�����<d�:=4�]=��;ֶ;=p�D�n�@=�ż@�)���;�29@9a;��0��cy=�?T=�gW<�uZ=>�}=��=`Py��}�;D���|CG=b�6=ب�<x�'<�=:f=<���ݤ��i=b,=�U��0�=�=xZ<���<X=�Y=�<���;��V�@���Z�L�c�P�`=4"��0����_�$'����<hab���A����<��l=Ҁ�DPF=���`�5�DPɼ�)=��<ȫ\<H��<0��;X?H<�� =Np~=�M��S�py[�����t�FR ��#)=���H�Z��>9= �<�a��8��<ݤ�:lY=�S]<V�)�������C<ȡf�@�?�BTH=�M��$.���C=� a=��<`[<r�s=^�B�.�;�=�e�$=(҈�ء�<Tdf=��0;/�<�J������W=�PY=�3;��@A�J)H��=,�~���V�$y3����<P(2<�߼���G=|�y=�1���Z=�ZW��|��$��TU"�^e ��<��)=�|= �k�p:!�f%E� ��<�[~<(�h��F9Li˼���;pp=y[��,��@F�:�ɉ:@�,<��$�>@=���;���<L5�<pn�Z>=0�8�P�,=���<<�[��X=��żh U<��?��g=�my�X[����[���<�Ne�TC=ĥ��б=N�:�����8O���w=R�&=�¼d"�\1�<��
=��S��|���'��H=�张{F���=d��&=ܜ��~󻴗��f�G=��S��V=���<z����C=�5��7� �r��* =��<@�ﺐ�B�J/��ޱ<D2=*h==��r�� �<
�k��>� (�� Ӽ�,{��{ �\o<=� =4f�<� q=Z~D=��Q:̣�<��0=�=b���A���;��>}�Xѧ<�3=D�=Ĵ���<Ά=��3��=|��<�؜<Ч=��&�,�����o��
���\c=X,<B�Y=h�ļP���|An�Rx=.�[���/=6��x�]��K�h��<P~)��Bz����;�ջ��=<,��<�GZ=��6�$��@x��@��;$Ʈ<DS�<*Pv�@��:��<HS<�g�<λG=�m5���<0��;�`��� =r|=�_���c�:r�]��W\= �;��g=��㻀%���cS=��(�z|=P<����`=������N=�ʼD�
���t���i����|�I=�.:��W=��;,�=��F��!x=~�=(��3=*�K�D=|m���ռX��<���<��xc�l��L�=��x�z�M= /�К�;�{)��l����<��<���<(^���%��fp=3�<�P�8 %<@��:��[=�h=ZrE=𻪼\`=JL��ל;&�c=xI==����X�����a:�gO��d)=@A缘>l=>MN=b�f���k=Til���<�4=>�F�`={;&�V=��.<P9!=�ļ\`�<@�L<�]G��H��(x�T^��h}<Ƞ<�l=�n�x$�<.2c�.�3���;=�8Y�<�;=��B�8�=Ί|���L=�7�i)��g?<��<��y�@��� ����-=�S������f~=.qk=��5=��F��c��w<xZ!���<��d =�A=�̼N�o��5X��V�<<��<�}i�8`=�@�F��T/=�1<T�= Z���� ���v=�%ʼȗ;�h�˼��ѼQ�:�����<�E�;,�g=p� <�$4��KE=��C�N�l=�yD<�d
���=��8���1��3*=��S=��<�'��pz�<p�5����xHP��aM��[ =�V}=�9��@DƻT>;DR= b;b�=d~�<l]����V;���;��U=�v = �;d���b��@�;<.-r��"=
P?��W*���<Ȼ�+m<T�o=�~l=�"�<L=��!����<�d:�[���k=��#��(=�K��d�鼖�f=�;��w=j�9.p��ᐼp��;�HK=�E��H|��ƪ�􊮼�}=������/�Wȼ��,�ۼr�=���XK�|�7=��N<�p��D�UH=�b�<x�M�XnQ������K�<Jmq��do��gw�Da=��<�= �a�0�;|+=~�s=h��<4�k��;�:�u�o���e���q��t��l���׺�
S}=�I���=PQ�<D���������{�d�T��db=�z?=v=2j��� =x�ü�Y���:Ԅ��,V"�h��<>Ob�P�X��q�����<���:F)��oD�����\A��0�<L�}=Ъr�Dݼh���=�� ��q�8�Q= �;t���Yv<�J =ԯw=0<k�h�G=��Ժ�e���@X��#μd߯<P;=H9�ޭ4=̘J=t�\�p
<��r�x�����.���� �`3�;`�9�Psa<0Qm��EM=��=�Jx<x�ȼ��?=B��k��J�'�������C�JmZ���<�/�<p��<|����Һd�%=x%<�� ����<.�0=`v�;���ֹ��T�:8D���6�d�J=`<�W�<jI=T���P&�;t_)=���<X�*=h�u��1%���<��d�F=�r���|^�h�0��[Y���/�Fּ�����;=���Y�%�<����L���])�`�S;�=^a=���fE^=<'߼p <��=��kQ=��1�?�<p�7<��<T�ɼVv=4(�<��K<�~� � �(�ؼ�Ga��t=�{&=��=���;��T$=`��<vt=>|=D=F�!���V������<�׼�R<��Z:�6�l�\��;W=��<�����,=�▻�s:=�a <�;U�ЍH<��Z=$�4��[:�4�:�缤��<,1��6;lJ��V[=�bʼ�eF���d��<
�~=�_���y�t�s=$��V�A=LY��`ϝ<����H�$�p\���^=T.ɼ�pY�� "<���t�p=L�<r�H=Hf<r(=Dߍ�L�(= �;8�4���c<D�ܼ����=P�B<����t�0�>�2�C�����P ��B��|�7=��@�<]���Q�4�d�|��L��<W�<` �<�j,��Q�<b6=�n=4i���<= �k���G=����<�-=Ңw=x�<��)� ޼�?2�0Q]�����]<��!=: �lm?=h�w�Do�<+i:܏�<�;=���;l�4=�^�����:��9=���<��d=�VK�Yx:�OQ�p֫� b��Y=��a���h<p��;(� <|hV���C�"�&=�~ ��C�~�q�nD��6��x\�Nu��C�lN��i3=DL/��] ��/4=�P[<���:��9<�=* �X�<�<r=���(R"�N����U��1
=�Լ ������.�ڥ$=2�k=�[<Pd�xV�<�ڔ<Hu<��c�h�k=@�B� m��F=�4�<��G=�_C=��<�f���默�0�4jF=���ε)=��*=���<������<��V=�Ӽ ��D=�̏�,*V�DČ��&M=�i�<�$=�Ř;��Q=�o4=�B=ι2=��K=�[<6eq=���<�J=�:�<
�4=�gz������:8�<0��;h>e�ɵ��6���{=4���(���L��� s��НؼPD~����<��=�v#���E=P�?=Tј� S�<������<��n=�� ���&�����H���D~�R�,��-
<R�>�g<��Լ&�o�X�<p�뻈;"=��¼HP<�{+=����0�:=0��;�K&<�{��$=��9xZ&��l =�u<X��<vxB�� �d���R%~=�M=�� ����Ҽ������i��=U=���;0V�;~$=�،�<�8����`��
>���\=���.�=$��<�O=(�^��T=�=Nj.�0�K��I3���=���d�x^=��q��q�z==ڎ�p�c���[=�6� 8.�v�W=���<x�}�h�k��u����
���9=�V9�r�)=�^�<>!=�`a�x.����BX0=�g�<��л��U�)���<�&>���n=<�b=�km=�Z=���������9t+�<���< ��@�;�`N=zH�$����!^= ?�<�Hu�0�n�D�t=�^f<�kR=Fh��y���v;���V���h�c<� �<�cf���ͼj)z=FM*�p��<D<,�|܌<"S=�IV<D����f,=X]�`M7;�;��< ��<,T�ܿ�<0*\��L���I;���=@4�;>�x������ �_��ʡk=pu��p�<شx<�ɜ<0M�<`�;L�o=�}��_���y=�xI=���<�' �D=�<\z��|���l�'�H���5y=�7�蛷<:�Q�P��<��<�Uz��#=�qq=jSO��'d=`P]��'=ZzX=��3�|���`�<��[<p��;,�<�®U=H�<�g���m=�r���!=��~��.����K�h�g<ؓ$��m?���P��B�:61��kB��]w�4��<ؒi=�v�;��y=,懼���<��<��B!�0����3� !}� {e�8,<��#=��_�����G�<fԺV%0=�F#��W��8z�"Q6��J�����;-g��gA=,Ae=�L(=������x=�ck=��C�Ȗ��\;�b��8���U=d�=�};���3@���=nsZ=��g���r=XQ���:e� �m�N�p=��4�Bc;T!=�%E���G=H�;<�01�>9 =��F�:�j=��P}=����`= =�PC�(v�<�(��܉<� =�E��J�ȁ!=跄��`]=���<��V�ι"=�%��`��<�NB�$&�<�{P=������=xo
�t�k��� �� = ٻ��<P���y<Z^A�2JH=֊�LR��@�;���:0�� ��FW��kz�5����=��E��4 �Z�y�@<��L�36=�"v�*p_=�Q¼�99=���xN��<+���}� �<�V���$;�s:�r=���Ts��ti�<��{��+u=�'<`I:���T�����̰o=���<�� =,� =�$軆Z��@G��,��$ f=�U<�p��mȼ�B=��Y=�#��X�W=�ś�(p=,ݬ����;�,�� �1;�XջT$���1=��<��=0�c<ȥ���ռ|o=��<�qk���}=��K���W=(o�<[��(�<�D�;�ID=Hag���M�
GX�+�;�f(�ж�<�y�<��{�~?0�JxE�x��<�Ұ�x��ܗ����o����<�&<������<�9 <�U =���<�R=��p=
j+�������:�d�4�>=��i�x0�<�d=f� =8�<�r����C=����N����;�� =�:=t�����;����`h;㺹��<��L;��P<��c�h�*�@�=��R�ꎻ`%�;�kN=n#%=��F��&��.X1���&�/�;ZC��1g��"J�P,>�`5n�\�Q���=d��< �#=�@�<Ƃ4���<PK�;��`<< �<��5<L�F��1�<Hg'=
���!���hց<��<~���2ͻ�=|=�<�p.L�H��<p���pb;<��=�wd���e=�=T���#<�8�<�D9�Y=�ܑ�<��=���<$&�<0=�C`<��
=����htm����<�&<(0����R=����C�FfE=�0S=��q=��=H<W<�{Ƽ�,g�T�n�8u�<�)ݼFwI�J�q=�ݲ<d�j�0Щ<���X�d��������<�a#=t�m=(�[=P�,��l�;����@�����l�ؼ;=��=xK==*76=�����
��DI=B]N=�&껢�m�@�,���p������3=�p� �O;��y�,�=lO� =O��1�x*}=�G=�f=ҧW=�({= jP�(#�<l̼v�-=��<x��0�B<n�'=�b��7]=~F}=�[=�ʋ�|�G='m�f��P�[���<"�-=�� =hO�<�n=�拼��}=���<0��;4<@�����/=��p�v<f2�@�';����xb<dD�<��;��Ҽ^AX���_=$fμ�&o�p�~����<ܽg��.�;5=�H=� ���<p=�;p�=&�(�"�7=���N =ȳ=h<d��<�|�(a_�`�"� �:��k���i=�A� t=����pxk�yA�6���R�;Pdj�`ϱ<�S=8�h�0��<V�==<�3�4�n�R�f=Z>���$<t)=����\�¼�Y�|�<�}�<`�����<��-; 旼��M; �^��=>l�R� =���<r� =��2=T͛��M=����,�D���ػ���J�@������D=@T<�Z�� {i�0�9�D7�<Ќ�<�5?<%>=֡B���#�в�<F.�`"�<f�A=�$�:N�J�H�y=0��;YR=�$n���ڼ�j��`�z�SS=�OǼP�л^,B�@g"<-��Ѐ���q< F=D �́Q=x:p<�`�@<?=H%b�Pr����-=�N&=��J=��;��w���t=�s-=V�e=,-�xBo<���*�l=@���lv��F<J����<(�8<X2f<`Sܼęr�6R8=<�ռ,��<��z=��<��=�����`����h����;g�;D>����=F$�j����Y�&�e����<v5=0C����W=�.��&� =x��<�$b<���<�e=�n�@B��8�r=IJ���Ҽ,*¼U��+d�6�2� 췻��<:�A=�5��<8��v��dz=�`��h;���]�Q���ȼ๼� T>�<tﶼ�2Y�� �<�% <â��7=���=�:�<| �<t���T|+=NP9Bsx�4|�<8t=`L���s���T����V=�fD=�8�\���~G���c=h7�<��E��*V�`o�4���l�c=v�������Y)=��=�o=�j�<�F������:��
�E�`��;�) =/��2��?;�I0�ȻX<�!�<l��<�1l��}6�t3�<jL==���nA$�v���A�p
�<<�=@�
;��S�b�q���9�_;=zN=��A=��d=`�߻8��<P� <���< �L��kj�ӏ�Z�f=ٲ<L�8h�9<�`M�@��Ρ��6��>�z=T�D=VJ��Eؼ�e=� =,7��8X#<���;�1<NW�f8Q�(A+=�>><D�=�K�<��=���<܍ռ��<0�<���<�ݢ<ܩe�� -���C���V�ܼ���n����b�` �$&���6=Aּͻ:l-=LW¼��=��޼Cg=z�]=~5=Џ���5m���)�"�N=�T =�ej�����%m�P~�<f���<�_ =`xJ=��4<�� =�t��8:$��<��U<�Je�(�<&<�B� =Ve*��.�:H�=F=D�<�Ճ�`bS=0�{� �=����M=�S���!�<�k���I<<�s������T�ܛż a��Ԯ0=��y=���%�<�L���W���;=P
1<@vf�fd= �H�����:[n��u�l��<�p �@$���F���� =:�9��H<=�~7��b��Bt�XI<�_�l,���6X=<�x=�N'=� ����;;�A=`����)�tGV�j�g=\���ʇ =�Gh�fc=�Ex=��=��d<¤A=���4ʺh<��<@'Y�4�`=J�l=�m{=�˜��i�~R=�Ǵ<��l�(�>���6���u�t3q=���<Ԓ���u<�t�<��6�Ha!���I�����^I/�p�;�Z@���6=�t=0���@5��88=��/=�?h=V�0� ����=��C=���BG���fy=X�|=ʒi�0C��`4��&><<?&����Ne=�#u���2<T2p���<$���r���FT���g=� |�V�8=����*�>�u�`CI��ζ��༸5�<0�<��W�4Ԍ���L�e�j>~�$iӼ��s��� ��{%=�H��V(�@��;ZO: p;~�H=�w���U�.� ���p� � �*�r���e�0"<Њ���y =8�<��C=�����$���;<�<�VN� �c���m�:2=����8������\��q8<�'`=N\8=p<`#a��Fq���k��==�Z(��"�x�L=�Rq�L �X�|< ��<��;HZ=<P��;t��<���<��<��y������<��%;@Њ;�c�;4j��8^\����L��<����ݻ�\׼�r��`�h<�q���X.�lxF�l5==\ =��u��.�<p�C<P����C�� =�ri<E>�d�=�M<��<}'�Up<`�k�țA=���<��=B���iT�`��T�=X3��p魼\㸠���@#�pj�<nC��:���<z�"���E=i`=�^=<4Y�<�2!<4� �$฼�d��06��IW<dO�*���/��0E�;ظo=�;��8!ƼJ-=�*W=���;4�G=�Mv=4$S=H�<��}��+<��<:���B=ȤD�n49���<�� =p��;��@=Щ �z%]=p����P;��O=�$,=��=�����/��t<
Vi= |B=�w���<�Qn=��lO���Ļ�I�� l� �<@�;�n[=P�<��Y=��x�hPp=R=�<W��F=�=��|9�<p`��<q=���<pq�;0҇;��<�����<�e$=�* <Θo�@���\0 ���<é<P-=�
=��=�a=�W��P#�;�����;p��;~&$=��:�.=t��<�>��L��<nqb�(YE=���;Du-=�<g=P��<����2�;��Y=h���ĕ/=����Z�Y�@�:�G�<�Y=��G=\��<H�<0��D���`���:Ww��2J���:����t�g=���<�b�<`=0�m<�d=�5�<f o=$�g=�
��[>�����_Y=��<H�&=� v���B�ۓ<V�p�@l�;�����ټ,X��p�z<_����<t
��(��������8��<�]y�X|/=��:���7w�V�,�f�9=�����<@a��= =�'��@0;<�v���%��<`����ͺ�+G=��<=� G=@�=�a�<([�<�.��ҕq���o��F����d�b=h��p��<��"=z*=X�żp+g�8� <@U�;2�s=�&=,'w�VY3=�������`�U<�#:�t<n "=��H=�]ƼȐq<���<�v+�Ff=T�⼬��<�'��T �<"�n=�;m=d �P�b�`�<�K��P��<X#�<��o���@���<� T��_��ћ:�vg��,5�h� <����g�<��H�\Y=2r/=��(� pw��h-=T�K=��׼�"e=R�p=0�<������g�R9�@��;{>���`=��t� ��<j2'�H�a�P2��L������<�����K=h�5�� b�x�N�ї<�="���"W=�l= �<X�9<|׼����Y =�����?�HF)��!<ڥ$����IY=H��<���p��7$����<�Y��D�%=0�J����;Ј�����d󠼌��< _��E��8p�Ε~���)���+<S����ټ��]�����}�<&D+�xsq<����P�^��٨�P�= n=�`Z<�~q;��D=؜�<P����M�<�F���\=��F=П�;H�t=B >�z C��Oj<n�9=��9=8p=(�A=L*� ���l��<п���L=���@ ���X�<�)���U:@'�;PH�"�r=FB~���.��購`���$�=�g<��=�hE=�T=<�ü��L�X�W=�@-;h��D�<�[+�$ a�@���
=����Wf<���<*B`��[q�]|=��
=�|w=��^��N���=�09����X)�<�a9�0.G=T{r=z=��%��๮�p="(=^X2�V99=\�=̨��SӼ�X7�`$%�x�F� m=���<.G==�d:x0������ED=�H%�������\��*��*��n���Y<��_=��|���?�Z����<z�7=&�!���<�d�<~7U���)=� K=(B����h�N�J�ƨ==3˹ �W�hat<�J�;@ S���Ǽ�(%<�䤼b�����<R�N��4�<\
=����Xi=L䮼�85=�!�<p�~=� �<�׫<�&=< ��;*=��y=�%=�j<��F��1�<����X�x<�=hCǼP��;�޻~�B�p�{�-�<���<؂=<�J�<G�����E#��I޼X;`��Fa����<�;��C<�E�,��<�y����0��E�:�p��g�<
hi=(If��CJ�U���L�����Sc;��L�_�hRP�kK�0��<̊ =R�k=��_<X�R�L5�<��R=���;09
���3��$<�w��q�N�n�~%'=��9�N�%=%?�h
z��/X�`9�<���;�g �ª:� �ͼ���<��L�$h��d,����H?�<
�k=��s�� ���켸��@D�;��;�f�<N P��,t�8�5���=��8�ty=��W<��<N�q=���Z�N�ԗ;�V!:=�9<L�5��X
=��]���h�k�8��<�z��AZ��0򻀮��;;08�;L�m=&�(= �%��3y=�d<��B:�g��������$���W�D�a���o<\�_�x����f�j�d��(�<����r>b�x|\= *�(�88��<��5�T9�<4�-=�C�;�0=�Q`=P̍<*�'=�%I����p���l��<�6��� <���dVܼ؁[<Ta�<��h<�>�I��X=��0<�yo�()A<ѹ<���<��q��+<��&�q�:@�\;FSf������^��{��=d�����y�R/��:8���C��a=x`�<�l<<@%=�N#v=4/`���7=Z;��v=L�ټ�~=���;^A!���pw�;�ۻ���>=��û0�8�Ff=�c)�6B=�8(=:���C��&<��<��s= $�<����:��V=^ _=P�L<(��<rko�Hg*=Pξ<��<��<�,a��*����j=2o� <tC2��B=|r(��6��@~W�\m��
'�:�Y=���@м<x��<n�l�4 ټ�vZ�D�@=���<R�<��� ��<��H=A=}:L��<��$=�_N=
c=�'u=���;N32=@�]<r�m�H�-=���к��HP< ��;� =�Z������`|�\r���oc;�������������Tö<p�:� *h=04�<0b�<��2=�4h�r�
�,�+��:A��ø<��|="��c9�8o]=В�;RY{�<[�<�K��t�{�*_������2���{�lr��^[F=@�?=�W�;�O<�� �0(��>����]�`��<:H=� ��B>��O"�H���@�:���<����==`�l����4n���l=�y7�V(J=~=`�G<��9<��.�P���4��<l;v=`�ǻC�΃L���<�Nm��ɸ�-<�t�;��a<���<�L�08)<,_Q=���<F~-�
��\=@X=pSԼܤv= c���<�~�]�(6�<؉><@OG��<p=�;�P��蘦<,oY=P�F�Nw5���\<�+Ӽڏ"=P2<��,� #��������� 6��p��<�h*<r�o�d�i=�d���<�$|���o����@����E���Y=�
�� �U�0�<����Q���<�t��^.�PN�h��<�0<Z[}=X�|�0���,�m=X�)�$��<��"� i=<�i;`B�<�K<��׼�s�<(�$���Z�P��;8�켬-=�Ç�*� =hɼ(D�<8RüJ�v�pF=p.ܻ�'u<��w� �Q�H�\=�<viM��w����V= ��;ڵz��mG��"�:�<€Y��d=�q����%���|=���<,`��j�D���`�I=�9Ȼ8��\�m=�z<Pg�;8����F�Pخ��f�&�S�"�d�$:�<Z��hMr��cF���$��Z=��=X��<ʺ=`7����`!=̋�<�L!�
p=Zc =��$=l�<���8�>=����X_=�=4�<@K�<���< �1��@��<|r��v�X��!"�(~�< '=x��<�,�h��<�q��4�0s�*�3��2J;`X<���"!=.��JLz=0Rͼ����&����=&�D=�M<���W��Zd=�$F=�B��?�<��<�1b<�M#�����4\2=0&����S�( #=�=2=�P�;��~=bg=([����+<�@��x�,��<����j�<�w3=~�3=���P�n=��<��w<�t��@9�$�� �X���"������j=pp����<�K��5=�:= �8����:�a�����;=(�L�L����eD�L)=�N=�h��؝��tާ<*U9=�P�~�`=��7=>3{=�����e:��*(����b����<�J�\���It<x׎�I|=0v<^�7���d=S���B�|]=��4=��@=<���a���<���;�pd=4}@���=� �<̓�<�ȹp���@̈́����~�U��k3�|0�0ō;�w��z1/=��<��=*�T��;`=x=C<��r=�'��6=4*>�i��;I=�,t=t�9���<2���ZM�����P���"�����l:6��ּz�I=p����4=l��.�\��O0<�h==<��x���<��l=\8=P��< ��<T6p2��ȟS=�W���f��$ϻ�*~;x�;�].;��<���6=���<0ڣ�@��<D��<�@���'�@�:�5�<��_�P��<�S�.�V=����de���6=��3<��c=�ӟ<<ۙ<���;��X=���<���f�q=~&;��J=�S���Wq��kS=�F�羼����o��lz��Ѽ �D=�j[��\g=수<��ͻ�;��T���~��M'�v?B�xR��*$
=Ы��}j�=;;@ar��q��4 =f�e=l��<�=\��@��<�J2��S%�&]��P*=p�Y< w;V�<P$�;���#�PȢ��cE�������=�x&<��G��f=��v=�9��0�@ؽ�
� =�{P<H����x�t�A=��n��]G�^!Z��
=��O=��0��q����u=��=v�O��hz���\=���<ؐ�<�m�;��K��`:�� �h`���]�<��i�@:I<� ���晼 ']<0��;4��<�e����@'F�Ё6<N 5��Xg�n�b=&S�P9>�H~&�P�g<��<��ǻ��+�h���I=�ּ��7�F���=P֤;������¼ �;��>�@��:P�N=X�㼚Sk��Ru=���;h�ɼ`K-�@�B���=��}=$t��O�0Y��v�L�
��(X�< ;XѤ<`�<�:K������B��p�s<�=�;z��O���ф;�}�<HE <X�=��<'�<,9��X��<R6]=��A��*�;��f��=�W�< �n=0����K=��;H�����a�?��qU=@��;�k.�"N9���;8�P��u����=xdR�X=����t��f�<�+Ҽ(���Ƈ<p'�<_��в���=��:<�*d<@M���ȁ���%< ;�Z=d0� l�:�C=��= ��;l�N=�V:�� r�8D�����<� =,=��k=�:2=`YF=`�Ӽ��O��q�>�\�^i]=�� �`j;�K3���s=�9e=�*�z+f=h:�<X��<@�<�3�@� ��F(�Ɵf=o��� �@�G�0k��H�K=�~X��:�XP��q��.=���6�=��x='&=%%=�.�;R%r�zj=�M�;$y�<�V <�C�&��8ģ��\���z��g���<vG=."=�7�<�v=6C��)��`諻���<���<��,=�T � +���B�<��ż�.;~�K=��"�<��<���<@յ�������=ά%=@}�:��:@��4n=XOV����;� d���}<�>=�H?=ܺT�j�+�"�-���<� �<F�P=�
�; n�B� =$ѹ<V�� O;����C�J~R��g1=(��<$�V=���<��=@41;T8=�s;P����_��ܙ���<���<B�,�8������;��Q�x�D���<��D����<���<@����e������z��
�;�@7��PP���`�zbm�88)<��=��W=�#Q�0$ <�>$��Q��]q= ��� *-;��9n�"�JJs=j��dN�<�/�tB�< �����<"(D��.��<_i�`���5==4�<���<�P�<�m-��":����;計�$�,��j�<���<Z},��E���#����ȥ}=�`U�ƌ%�@κ|]b=��r=P��>p;�T����=� �<�-D=P��Bq= dC�������2�f� �x?��H�N�tx�<��;𶅼T�=fwU=x��<�]�<P�h=�4��Y���#��&}�:��l��<���<�஼1� 𑼜�<�t��y�<��1=�>�<�u=�Gs���ּ>=�ゼl
�<��`=��< �=B��p�����A�X�,���)�6�=X�~=�F{�t�ټ��m=N���d�<� <�~f=���<X�w���;*f=��[� ���X�<�b�<�����t�-=�Ae=J� =�9�@c��v�7� �ۼx��n� =�:=�Q�j�P=��f=�<�<�Ӽ;l���nI =�p�p�ٻ��:<��a;��h�$�n�� V�xҼ����P�*�JZ5=PI�<��j=,s��C=��p��~=9<J3��y3�X�0���~=p�6��Bx=��<�p��hn���&���ںH���l3:TQ�<��@:���<]c��a<p˿<�꾼�=/�|<=�̹+=�=]���g<
�F����@������x=�f><08Q<�ܼ�f =��Y<B�k=�� =Վ:D~=�I=> ��(~=�#���Ƃ<$h���<��<�t�;)x=�j�h6�h�=ZY!���n=�6ܼ���;�f��+���\�\�<lI�����<p�x=��\��� =�t|=���;̿��c9���:2b=����pT�vlf��{X=“4=�ny=����x�����'�d׼P�<����@�λ��3�4��e=��}���~<��="�-���:��>=`��<bM=(�6��P=0��V�.�� �޼ �r����<D����ls��3=��:�a(=��=0i��u�;�>;@8~������{�<��-=� v�"�.�(\��������ܻ�N���<������<�86<z�y�p�4�$T���L=�Dk=(:Ӽ���<Rj=8Oռ���I-=�gn=�*==2�=t>=ʟT="J=`�,;� �;��X=${��{Z���7��=�\�<`T5�j"z=�G���C��h��Rd!�`�j�tW9=������d=ڌ�� _��S�;Z#=^�:D�`�`�X=0Eo�D���`�R;ܹ�<��N=Oy=P�-<lL<������<�G=��,=�Q<H�R�`�߻p�廴�
�� W=й�`Y�<����<z���_�@uټ`p_�`׭<X��r=�={=P�w�l\1���ټԚ}=`>Y���X1]�T=����8���BNa=,dc=�yt=�14�0G-=y6<� (=�Cݻ@��� |�<��=���^�=p�����+��80=h�< A�;PS����:f�P��J����<0b�d�'=��h����<"�(�p?Ȼ���Lm�-z���<=��(=�:2����<T�l� \����;��6<e%<�"*=� �;ҩj�p�n=�@�p�5��o<�'�z.4=��]���O����� ,�;�f�<�����F<�؏�<���H\><�
&�\K:�_b=��V���U=�cN=����pl߻����Fl=@E��A��d=�����DĠ<H���H�=0�R�P-A��a�XT���,�^�;�,=��I��PB<�<2=�?M��� <V�=H4�ԗs�0�h=��5<��<�Z�;�~���w=��v=�X�<0�D=����>�;�����X��'<�%��3i��q2<T?<��\=�<���{�:N=0�ۻ��m�J�~=�=���<<�r=�Z+��� <�����f��<�<F,g��'r=>e�Sr< �S=�w�:tt켠��;+=B=|�<��z=0 �<��6�*�=DO�<�^_�(@F�h.���D�<r~q= � ����<<
�<7���:����<f�g�z�y=�᣼2d<=|Gs=2 ��'t=H���x��<ة��dM4���X��=�qG��x׼��꼠|�;�ʟ<J�{=x�S<�V8����<�G�<��)��@�<�f���73������=Hq'=��;Tm�<���<B�]=�y$=��-=�
s;�A"���5������=z�=�p=08�;��H��iJ=��:<0��� ��<<��<Ћ����L�ܷ���@!<��!=��B�8M=t����P*��&y;��;�5=!=��c��"���vi=j�Y=4�l� �z;2Z�P
e=d�y=��I:�%����<��V�8�<� ټ"=-3:� ��ڭO���=V@ =d�̼��]���=^m�H����0�<,h�<��:D]s��[�<��e��zl� �7O=�L= X���6=0�&=�'��p���&:���d~�<H@<N�i���Tk\=�H=`�;���P����v=�_��ī���Hd=��(=PAK<����<=B%S=�=H��<���;�<<�pk7=x�b=X:���瀺NH*=�`��@H����ü�* ��u�<8Ȭ��E5���Լ��$=�� =n�E�(q���~�p�<�##=�Sn=��:�g����;�bJ��O �ڤ.�@�<��I���� J3�t&�<���: �>���6=-��x 2=Prh< ��+ =h��� �<��<��)=,?��輝<`m"=jA=�vd��Ek���.=��ӺJs�P��;��\���~=@Դ��=@J=���by1=,���p�_<p�o�|� ��K
=�Ȗ;�w<\ћ��<� d^�����*�?=HmżT<@i���;J0A��w=J�w=��6<=���B
=�}�<�V���@��+��|4=�b=r&q=� �;"�H=� �<p�V<�)����"�*�� ȼ@��<��1�2�E=�; �'=��{=( <�<�'=��@�0��<��<��*<�.����+��J�<#�:$%��AT=�>Y�&>d����<��==�;5�${��(f<xo�z�9�{�<�V=�Q��^B*=�%,�|�H���d����;5B�0��;l�ͼ|w]=|o=|'$=8� ��L�<na �̢r�� Z� 5�X[�<�·�l�V=��d< :��������� 2;;�,�; �<~[q����<���;�g��{�@��:`iѼ
��9�说��F;h =���\>�<��G=lHݼ��d=\��6S�&�t=����D=��N=>�v�RS
=8z�@{�h�g=Wg=���<
�t����6����;@,�8+=�i���<H����K=6hI=����.=�>�;<_�d�= 9����<�?R�v�:=�T�<؂�<P�ļ�Z�<�̵<� *=�$=*��B-network_body.visual_processors.0.dense.0.biasJ�*��� B/network_body.visual_processors.0.dense.0.weightJ�����<߼߼�����S�=}���E+ľBɞ��+�=�D�<��Ͻ�Nl�ʃŽ���� ��>�[��|����,>P�v>S��=��`=����Bn=�8$��W=�h۾�2>�#ܽ�O�>ſ�>Ac��A%m�q�X>�e�>قJ> ��`?�>�-S��釾��?�P8��,��|��$��>V���x������f>(;�W>P�x>)g�>�G��{����=6����6�>K�8�M���S�'?�{�=��D>��;�E���D)�l�h��B7�&�=�����5>�+�>L����) �-����|*��B����~�쾗��>��Q����>��B���Q=Z?>���=b�H>�8�>60?���>����dq>�z>yoQ>�
=N6�>=ա>�x�i�=�>ǩC>�*=o��>؂�=O�=^���x���.��@ߧ>溾�>�x�m=s�>w��;ڈ=�,�<kS �k��>��=�[>�>Rʸ>�#>|¾CQ��z����t�5@�>
�'>Sr�����8ͽP ��o��<��@>�X\>�3`>@dr�FZi>��>��q� Ҽ�j@=<���}��=q$��;l�=���=�C^>�Y~��ry=��]>;D�<|����?1�5��P#>(Q��؆��Jd>I��={߿�e��=�bD>M�>�+f���ͽ��ľ�Y�=�>��ύ+�<֊=]�4` >��>�&�3 L>K��>��>CQ�>M�w�Lnu��V�z��<���>��+�kMZ��qQ��@">���镣���D>E�S>]�����>����6��=Mŝ��9�=m-�>�5H>=�����e��VR>�����_�R8�>z>�X>ܬ���
>�M��}�#��ʾ��.�K�6>�b@>�=~T�=E�}���<�O>��� ��>�Ⓘ���>{���7޽}��<
.=��Ѿ��~<��L>k��<��������@b=���b��MM����;"�n��1?�W�� =*������-E�\� ���x>C��>u��>�����K�>��m�2���������Q����X�*�٪�f9̾�r<�kZ<@8��.)>�'J>��>̓��wp�>��?}�������ݘ �g������=���>N���/����A�)d�[��<i*=TZ�=<�= �|>U�>3�u�'��=,�>��<�ۘ<n�=�@>��=�m⽲�'<��E�Y�*�-�����ý,����� ��<ߤ�<�#�q#E>D�h=F��>��y>��I>-NT��72������쾃<�= �5>ppZ�tˆ��Ǿ�;���>�<���A�'R'��CJ>����c���gS�K;C����!,�4H�=��7�@E>m^��F:���;���=��M>���=�/����=�@�=�>�td>�,���NP�l����;>�S���"�>�#?�i7>�R�>����؟l������;Z>%�߽@j����>���jM�=���=]�.��3�=! >אA=^G>��^>��ɂ�<���lEA�Ƕ�z1�>�.�ĥ
?��1>�gQ>����P���*,��슻��`=W����I䏾�Ze<��>���>�Df��K��Tqݽd�>�Q��m?��>J�>�믽�xz>��>$μ���>=���|� ?8���,�S�B=ο������>�c���&= ��>xs�=� 6>Ip��n�q>�q�� ?�'���_ (�|��)��>,O���=>��|��=��G�=�<�=�W>�Ӕ��>.�>0�W��G���!>">�;�o?�HYo>�uu�} ܽ[�5>x�����2?�=,��>��'�߾�=�Q>�@]�yEB��F�=�½=����y��l��>� ��с�" 8>���=w �>f�����>���46��#>dsM�=�=��>{��;�9��r�Ѫ.�©��R���T�>9����G����>V� =r�S��d�>k潨�$�2 f>'8d<�7�>�AB>'�?>�~�>�]!?�о a�>��=�ҋ�X�R= �*��������>ٮ>放:㻾��<#����=.�g>���<fE���p>�ϝ>o&�>�=������=��O>
�=1y��I��0�|�)Ҕ>��о�~U�MK�>P���Z�>Y*�n(��%z���~>Em����=���<��c<4r�>\�f���#��Y�=�7>>��> ̾/?�=7�N>��D�#J�>���>dm�����oE�����k�*>r���C������>�ST>�O>�� ���<@��= ��>�`�=�G��������ߟ�fY)��AE����=?�ξ�
�=��T>���na��"��˾શ>y���鶊=�k��}���7��s��=�΋>����&���g=���=0�=���=4.��Li> �f=w鹽w��=���Z���8��>WuL�:��=Q u�z�8�����
�J�p���
�<۾�h���t@�:A ?�}�����=�5d�q;��8e�>���>D��RW3��u�>&T<͐�>�N>�C��)ݹ�e�>h����}>:}�9&>9-���n�����7Ѿc#޽s" �U�q�=�>H�?>v>>i0;�Q���g��}�]=�W��=y��Rj�>����3!�ǧF�|_��,0k>T�>�C��△=n�Z=}`a�+~b��#���/��o��� � �U���?���y�aϦ>&W�րԾ��<�TQ>t���ݽ�(Z����>m��>f�=и��Y[���E>� ���6>�/=��3>�i�>��ֽwŽ��C��uw���=�V������܉@>�4>T��>����./���IZ=���>��"�TI���Ș�ٸD�r��=���=�)=�SU>W�,��g�=�"�s��>���"gV�D��>A�)���!���R=H[u>�v����8?`ܔ�|/A�@ ҽ�vE=�p�梤�U G�t ��'��#V>�畾�N6>�E�=]罽f��)-W=X� >��%?KX*=D� 4�=xl�=�)�����r掾�?>�S�=!��>�h>:O?��b>K��(�v>�*�=�jj=FA��B�>���=�(�����g�a�\}�>�l�>`]�P-�>�?�>��=?�O>�fY��Ԯ>nf�>W�i���0�Lq�=����5����>ɾ�8��U>�ͻ�#�=|��>�<�=�ʹ�퉉=�G->  =7ST<l"y= B��N ��Į=��>�z�r�>����7>,?��(�S���RW� !�>��<�j[>�C�>���=Ⲻ����=��=+w>���>�{�C�>X⾝��������ٽ�c������������Ͻ�e�Ξ�>Kď>�i�=�
T>��>}�M>��?-g
>԰ս�hľ�f�>�>qq�=%�ԽB���hr;�vl=L��=��Ҿz���w����>@���\: ��$��v�'��o���Ri>2s4>_Ժ�g�4��c�=� ���@,�E���!�M� In=��Z>������Ǿ�k���3>l����:�>~�w> ����#�=����Y>�E�>���dI��~R��N�>5�/=��d>�쩽U�>� �>�X��q�=b&� �.>��<>���Ƈ�=��=�U�=�b��@�>Y�O�zP�� =�G>�Ჾ�i����<]8>�Df<f�w�>��>  ��"�{��3��=��F<�� ���> 2�=���J� ;�Ҩ��jT<)?Ѽ�뭻�Ϧ>�(`�{d���R�����=��'=���l�?&�>��x����y���~���>�(��=a��=�*_>�ݭ>�A�Ek��_Ǜ�h>%��>��>��1���x��b�=��L����=��>T�����
>� �5/:7�0����>�1k=;��=�l=�n�>x�`����>� �>V���@���R�<�,�>��Q>U�� ->,��=��?�����&7��?��;ZBž~��݄>�MȾ��>��.<"�_���ھ
G���.>�}���\���>�bԼJI�>��>2%>��j��+
���˾�k��tS�<��<,l9=�L��J=���>&D�O��<�\�=)���[~>B�V����>����KŹ����>,���c.�0����I>_��.0>�}L�/h־ԝ�=����w=��+>�Ə�nS>�o]>��ƾ��4�� �=�9�>���yE�z��)�><����+�=�m[��&� ;8>*Z=�Z����X�9��� �=�(.>i�=ϟZ>'Z���hb�&Ѥ=R�� ���?;�w4>���+]-=;�?� ��>��}>�*>/�%=1�>ۿ�=I�>��>w_��� ��c��D��!ED�v ,>T.�p:>L/о<�=�v�=���Ə�<x�����A����=Ê�>zU
�
��fa�>΂�>2ļ ��+���͐ҽ�u���쵽�E>��><ڂݽV;=��˜���?D!�/6���"=�M���F;��Dt=d/��me���o����=�� >�D�=�!h�� �7��y�g>~�� bf��}�>w��>B$F>�o"�*�:>�v��ߏ��W0�=_���V�;�"����?�Z=�0��A
���M�>t��C�����>*��=U�>?�D�V�>�F��V��� .���N�]��W�U=O��>�� ���>�?I����*�>}��>!r>�x$�N >:��O���0y>�����>WA�>�=��U�BК>�aO>^5���� >脽����b��k�����>���=k��=
�P>��V��B�>�$ξ������ ?\�����H<��=r�<�N�=ڹ>k>&�/�1t�����/��>'��A#�����>o =E�=�C»I��tqT�������������>�&O�>i ����+�K�=�o=u�>�0��$�:�3��=��B��!n�M>�OϽ�\��X���;� W� �p�o��<#��>��<���>��;>b֏�8�=��l>��׾�ܝ��>��?bݝ:&��� ��$\_> �>�g�=.�>ܚE=���>!�<��>���>ৃ>n_>�u)��S��T�X��!þ'���~� >�]3�VLJ=��P��߮�m
=����j��<Չ=��Y=}�K��$4�S�߾q�>M� =X�$>|{"��e.��c�>3:��#�D��=�㨽E��>��8��lq��h>��k�yE%?�L�>b���Qz���):��ݾK����=��>T���+~m>���>p�>͍4>�$���R�=���>3��>Pm.>=B`>�z<��h�E�q����)��>�E>�^�>8n�=ȟ=>�"�>��=I�;��4�>��O� �0>�Զ��E����<Y� >rѽ9'G�<^@=�}��%��=OVs=8��;��9_��ś> I;���I���!> ]�=�O�=Z���=����^�>� -����69��ahL>
?�'�>�q���I>N�B>�xW=���;c�k�n��<��Y��'I>up���i�>;��>�� �����i��e>`j��t4�>��1>�BK���t�<3��=�t����?�<>L�U���.>�j=�3/>�n3>�4E�e\�����g���8���D���XF>�i�=�o�>��(=� >?4�>L:�=�g�<�4�>.��<��s>L�K�j���#��<�=�� )��zž����b�ž E���T�1m�/���o9�>[vp=���>���>-p�=�*�>zM�:ZP�,���H����Ȃ>-5>:�xUE>@i3�^�=��\=��۽�|�=�>鎓>����9�P��j>ˣ�>�j�=A>�j+�zy�>IW�:����C޽I�>�=����C/>����"�>�B�=2�}>f�?��=� �>?“����l��>~�j> �=G��XB��Y>����>�!�GA�>E'�>������$ ��S �[X>e<�h=�� �a��#q>�����<rܑ>7��>�y�=q����9?�7���
�=��9�-�� GB>��1�3k��ƅ����f�����>��5�i�=zDZ=��}>ʴ��B�l>K��>���&�=�G���j���Y �)�P=���>�Н>�E��u?��*���ݧB;.!=���>�Lܾz.A�>;��辪N{<�!4�3�����s>�Nr�P���<wӐ>aߊ>_���k�>pӻb�A�� �>H(d�.�־�⇾�����g�L�[��L�>}o��_'��=7Ȩ>����.\Q�����>^�> �ǾQ=ц��I���fJ�����<�p�#�<�f��ӽIeh=:1��>� A����>��g��j>�� ��N�>���=�b?�1�>�D��?Д>(�+���9>` Ͻ!BC��)����t�=��V�]��=8�[>l��$�-n��Z>B>R�r��/̽t`�>�(��>=�����w ?���>X �>�0�=bh2��7�txL������Ⱦ�'U��?V�E��=q��"�?� >f6����=@Yļp��>D4o>��G�k+��C���S�t�پ3���JbN�N���b�#>V��=Ph�;�����q�F����fC�՛������r��˗k�Y�R�q�)?K$ټ�|�>5�T�O2�=2���Gn>7�M��Y>:'�;����g�!�툚>�o�f��\XN>%����1˾�Ͻ�SC>Қ��?�=Y���2�V=�䜾d�ɽ'\>�6o>�(�]տ>o�#��5>���>T�$>Ȭ�=.��=����-p�<�:f>e�>�c�>Oj�>Ya�*�bl>)3�>UY �Dd����^S�>�q���-� �&�]8Ⱦ>���>ƒ">+�H>�)��r�=������"<h=AJL>*t�=+Ԏ�*��>DŽ���!���m>�xq�� ����>=��=Lz⽧>��Ծ��>��5>�fx���̾�t���.�>��>Ym�=Cݱ==%��K(��ھzZ���w>��j=�1��0*> ���Ђj�|kl���⽖2���>�(����>6^ؼ2 !=����Q���m&>�*�]�>�����>�|��ܿ��6�6�{ 3�� ���CR=?�]>DV=Y�A?B�@=�������-1�C�����m<N���ټ�7'>P �� ��:2�<�;��� ?���u���|�=�;�=�W?+�5��e>�O���MA�.��'u�Cm�H&��`��>�tD�\~%�<�'=i�=�X�=��=�f �� �[�|���>Q���`׽���>`���4���Z�&E��P7��ҝ���ն>��v=?���dF{=�!����$>�d�ԩ<�t�>@��=I��>�����\<t�(>��=|��=�y�>�
ؽ�I����o=���<�H�� 3ʾ��.>�M�>d���B3>����a=���=A��<��Np�=��¾�,<>U��>��Ӿ^[�M���8"<�1�=|#�=@�>L4I>f�ƽ���� �>��Ǿ��>lP�>ʠ>���>���$k>�_�>(xC>�HԽAo�>k���V� >K�$�v��14E�)��=������'<ڰ��8�=�����>����D��vx4�*�#>Qm �.{�>��n�-?��b���/>��>Pw�=ߢ�=��=��=<�[��
�\c>!n(=���+�X���L>�d��D7?���<� �>f�3��Q0�aʵ<E�ν�v��OD>�����6���F�=x� �¾�|����<*��V�>���T(!>-?�>ЋX�1…=�x���$>�>a>����(>)_���=�(���=F�1>@���`��>��F>��= =A�F�>*��T���֢<����f��>�e>��X�썃���a� ��C��>��>W��=<X�> ����žS�н�'�= ڽz�ھ���=��&">2�>(��>���l>�����۾>� �=Qn�>9ཿ47=��$>���>��˻��þ�u��V��P�@����{ݽ-�d>�4��ۼ��PF�>r�>��N>DsB?��>%�v�<Pľ�Ӆ=�?�>:�� ��<�z����F�(�>�QU=,������=�zȽҚ/=����)a��Ij���BQ�m��<��`�L�}�S>C�~>4g�=o*��o��l�>��x���U;
��3)g>&*��O��>�-�k�ͽ2wѼ���>; Ǽ��c�r�$<8(��vT�������߽������ϼ.]�#C�=��D>��)?wZ�C;�c|�����>���=�@'?@���Z�\=�ɾ8�>�>��L>�ݖ�D�ڹ�AP��z�'}>lI�=��#�%UC=�c��>��>� )�蜄�1� ?V��r��>x��ϥ=������>ݕ�>��=x�3�O��'����*$?���>Y�C�
?���=��T>][キɾ�Q�NNH=P�6?�OJ�5.��?�>�P�=��B�?�3�(�=.��#V�<�ܘ=�摽��>�*m�e����_��eg�=�K<�8�>K%V�T���"i� b >WS�Ø�=0��;��p�F`G>�-�>j��>��>I 9>��P>V��>VM=7Mw��r�'���;�(>EB�:^�*�2Ik� �k�P�ļ�c�<��伬
�ڢ�j��>�g��-�<���_k�;�<�:�����=E��< ���"�%=[�>�aH>}����m��t��X����`�ͥ=_y�>�c=!����M�n�ƽߗ2=�ѻ�]=Eר�'���;¾��������q��=�Mڽ�m&>� �>۽��3�˾AI��9�=��D>�r���n.�bwx���#<@��=[$����=�:8?VH>">K����n�=���=?H4=F�w> ��O6�=�=�=��=�ƽ��i� �>�X�=���7w<� �=�>��d> D�=~�=�꽺���1@����7H�8�Q�`E�>���< �|��Ν�P P�mӕ�E���Fu�����%�9;�ͼ � =�����x[� �޾喉�Yo>��'?��c=ֈ��O�>���=z-s="�J��VܽpaӾ,Q3=���>��>J;>�s.:��r>mHa>�]�<�]#� )���m->[��>�^P�#���� ��Q'�>�� >�|?>�����3O=������=�j,��.8>���=J'r=z�������P��<4�>@h�;*��<(N>j���۫>>Ij�3����N>�ؐ=���=�fC���<n:�<6��>
�@�uV����@>���>��>�1A>W=�=�|�>��;>P>k�H=7��6*P>�zS=� ڽ\́>��5��!�>�%>�꾡b�=
����+�����n۾)�=���>��C���<������>U3�=��,>��=��>�K�>&� �|�>b< ��k<��>���>G��=�x�=&�=E��]�~<fQ���">wɬ>9j>��>�\=چ�{�m��zm����>�� ��|K�.S˾@WþV>�6ѽ�V����-�⣯=&��>/�����H>�X���� �h�ƾѽd� ���>����y.��y�Dѽ��=H�����=��?��;�m=����y^D�p$2�Ԩ�>Ŕ�� =ܱI>��I<|��<V�v>�t>#��=��A�x��;8yH��9�=���=�'�=1o�=X�����>s.7�e°�V��xI?2B?��+>Y�$=L{�>M�V=�O��I:>>O�~ߦ>4��=ƣ�=�䚾��f��E������}��l�+�=̐�>QI =��3?�c�<�0,���*>��=����� V>�Ί>bȶ���U�X�s]^>���<���=5?��
�>R�\>�?���pg>!3e��' ?cD>S �=�0�>�p�ݥ�����h�;rT?��A��w� 潽�1�lkR>ʷ�< �Q>P�ٽ��!��"���G$=o�K�0��D)Y>v��� ����)y�+jܽ��;=�;��1�>,V\��wF�Q����D�����>=B�=��Z�t? �{�F�)���;>W���ssU>��9=�fg�,V�>R�A>&�ž�?���r�F>B�`�v�;��E�>Q�>��;�A&D�s�?�t���Ѿ}\�<��p�� ��{8��A�>"V�>�o���!/<!��>M��=�s�=A}̾�\�>�{>����#�<���;9|�>GHC>��e<�廽��>���>I�>�k> �>���>�p7>�"�>����˾
>�1#>ۗ��5�H>D �=�f�����=�����q>�B =蠶>(��>�׾(������81|�٘�<����W��i����ý��<��n>��>sQ�>�f�>�D�>�ӌ=&T��;*��:���s��"�>oʄ>�=����r�-8>@�/>�T�>�Ƅ����a��=Nu=�o���g>�������R�>-/�
u�>��?�^���4>:ч��N�=#0�>��0>�ry=If� W>�Q9>��L�[��?��M�>�9�j�l>P���p 9>x�¼j ��z���&􆾙��=j�V��_3= �>UwýM��h����M����;p�=8/_=�j�>/�O��O_���B��>uxM>o0g<J��=��Ҿ*�ͼ�kw������i�>�o�>m9Q>),)���þ��7�.<{>d �䣖<4�>�?'<ɦ���5V���<.Ӿ���>����I:>N@�=��8�w�̾���=~�>�S��o��� ��Ɲ>�~�>RL="�Ž��c=->�S>�t=CE\�8��[�0>���<^��=�Kf�\ct�J�m�����;�E�O-> I��5������;�=�5��_�����������>$�C�aƏ���<��8���W=�_R>�V��׈=�|�Ƨ}������1��Z���:p>w�!>�^��L/h��?X>�MJ��� ����/ �ć�>w=�����<��>#�4��lv=ұ?&z佷��=IO>|���0�(�>�Q�<07>�/=�q=_j�>e���,-��,��_?��p�t>]����>�9޼t���y�+> �����Ģ�������t��Ѥ�Y���!1�>����*�e�%D<����h9��C�=���=�\>���:�L��1.���>�>�ѕ>K�0�Y�W���f>���=5ƽ<+=@�5� ծ=�̾�<s=��7�מ8�� >N:�>�< >��h�hM��t�����>��%���=�%=W��=iZ>֠��]��=� �>2�>�z�=�e����>�3��M���񯾀P�=��?U�N�҄!��ʏ>���>��z��>�/h�r_�<�߶>�_��.��=��N�.�>9N�>�q��A�(��6�����=��O=�������qۧ=f��>.��wi>�w1>����%��~Y�>%�>5���~�˽P��s@:>���>jE>��轠 ���#k�k�>!uټ���>����%L�$���-�>� &�^�k33�_U$��1�>�O��6?������ʛ><�^��=@3�>�w=�eܾr˽���ϸʾ���kT�QQ��܇>�l�>�C�>�kԾn����p1�7�����=�\:>'s?��<ɧ��(��;�Q�>⺊=I��srY=A3���Z>d?;E��v~M�M� ��6=R锾n��%�=!+?w��>���#��y=D0^�`р>�E'���k=W�~ !��w��9�5>���=E9]>�L��A�=#��>��s>�U�=��<>a��7��'�0���k��">�j��
�=����O >=~�> �=�5!>�$�=z�Y��������=��">2$D���f>+��c�ν�Y�>�~9>.���rl���8>�ln�+>2K��2U>��>�uX�>z`�@�">�D>Pl0�� O>Mfн���4����q���5{�*%s>V�>�"u����=�<��V>%~�=S:�� "=b�k=��]�O˛��R��&�>��3�"o�=�g=�ԇ�� �D�9�=���>nj��t#��83�����g�<�u�>����R�<��=K &�2v��:O����8#>�/�>������W��L��KL=�n޾K7 ��ܼ=d��>��>���>�ۚ�Y4�=����ʼ�%�>Fa[��5A>�Q��(U��e=���>�ľ����nn>�_S?S�
���߾��9�m�����=����&��=Ѐ��h?
�ǽD��=C�l�ޱq�d�x���|��%>fҸ����>�І<՝e�����%�ͽ����w�h>��>�B�>?ڑ>s{.���<����>�v��gQ=�[�_� ���>Uٸ>W,��γ��뙾}�L=��$>�ž+���LA>5$=V�@����=?*����>�s>�%R?Eo�>�ə�(!0��ߛ=F@b>�N�������=x6��j0�=Ǟ��=�3�>p��>sX>̿ �������<�\a>%��ǧ�k1�=r��>k`z��Ya>gV��7џ=��Q��Q�>��U=��¾�x��/���? `>њ�=ID>*"�=�K>�(�����0
��!�i��=�h�����>� ۽X�T���y�0b���0C��Z�=f&ݾ�>�>�=�GD>���Z� >b��;���՜`>p};xk���ǽ�B���>��<!��>�޾@�>J�d� >������> y��ѻ�VP]>Jx�p�l>X����1�q��=eF���MJ��� ����>��;����=��Ȥ�>���>�$:��7<�L~>�8X>N'>�� ���Pz]���n>���="를�C���?����e�9>=Rþ� >M�=Zv���`��,U�o�k�=��<�Ҁ��N>�i!>c��=_}T<ؑȾ7�M� ��=���>O�=1�;��̽�J��C��K� ���>Z;>�͏����=N�L>1;�:&�>����&,�<�p��d�>%�e��U�>½�V��D[>ū���}��Df?���=*��=%
�KlW�I.<��@=޸�=,"�=�YH��-�S=��1��R�=��?���=?��>ᝊ>'��=3-A��B�=)Ƅ��I�[.�[�K>ck>�PP>�a>R^�>�MY>X!�z���'�>̨E=w}6>��q�6f��*�N��Uم����=�W����>�I6�V>�k�;OY\>vн_�>y]�=�r����>��%��!�:C�ӽ�J_>����ǔ�}p�>?�>�Q��Et<� �k��<��������>X�a��<��_����<��������>澾.,?�پ3~>>W�B�0�>�ҏ��S{���L�%�=����J�>h|����=qb=�o�=>H��>��ʽ`�F>� >Y&{�tm���ʾ���>`��=^O��J�C>,�>/�>er�>}X�=#*=v�0��a��� !�N ��C�Ⱥ�I�=��5���94i>���<p��=%Q?> ���,���>'2��3D�>N����u�< l��ܰ6�t�,�k����L�̡�>�Ͻп��)���{ >��_����>E9��"W��D����>�E>>��>�,*=�&2>�� ��oͽ<a��_����U����=�i>�#�>n�>>��=�����>�r���݀�q:0�+�ɽ@P ?C����3���S`>ye���x>2��;��>�$��}UH�!վ�ί�>= ?���>b�>dЈ��>�y ��>:e�> ��>^3�~��>Q3
��iG>� �>����{I=�a�<Ӟ�>��=��>$ d= `��b���=W^��x'=tU����H�`�U�
.�D�>*�����>�F���p�=�*P?�r�ϖ�=�ؾ�kk>�G۾O�4>�Q�=����K�Y��������=?�{>8���$�6�:�V��@4�����u%�=��i���%=U�=�!� W=`�оTw>��O����o?Ci8��p���?#���=��>���hZH�w �\v��:U�>̖��GzC����d��>��s��~�=�Kn>] ѾH����
?��}= @�=t����)C>G�=sia���>)Fv>�1K������>/�D��塾��>z�)��?���>Dr.��P�=�W>=*>ϯL�-w="F>�񤾲���c�=��>��>�� ��S>���>̾۽R␾��>��W>F���{s6?�ț>��%=�<>.V���>�~=�����Y�=d�27�=VG)?��9>���W�<���:�Խ�u���������/��3ィ�8=�`��4!��}6��9�����hO=��LV��dÙ>p�>� a@���U�K�:=c.T�����y�潦ؠ����>�ht>����ɪ=�D>��>��c=a��P��>&��=\D�>�>�> C�>��P�����e<���-���O_�`�,��E@>��>��|�5�>]r;���\L��2�r��[�>n1j>'⟽ ��<�]��%Yd>�^B>�;�>�>�j���0�>鉐�Ş�>�ч�n&|�Ui�>�U��f�>a�3>(��=�!�=����=�=�Ew>dž??����?9��>/o��R�V>��D>�r�>v��܁�6=�x����cȾ5�K>@;�>�ZN>0|߾�1=��?Ľ%�>�˭> ��>u�?�+�=\�= XA� D?��
j>ɇ`�_k�� hU��^�<7��>|ۃ�����N���Q��2����?Z>-> �=�F<$G>�?Xs[>�B'���ܼ�jؽd�?���'��&(>��T��T�>^��>������d>H>� �;=Z�>�e��%��=�~��ĵ���0�����>��<=�a��>�?d��>��:>,����>���>��=@3 >ם��#��D�oم���$?�˗>S`6>4��5eU>�r<��f���&����>ڧ ?E�Y�;XI>o���C�,=Ǩ���_>!�0?��P=�J����t>O�G>�'�=?�r>��D>�ٽ���h�ȽЦ==\!�>��&>����;'>��D9�^5|=�^���z�<�&��we0�k� ��h>�D�>�pŽDۊ��K�=YI��桾�� =L��3Ǿ��|>v��=���>SH]>:1������(*�>�r.=�0�>�=�=�k�>z�>�����K�.-�*j���o>쩦>�j�>�.��e�M��0���%=�:L�����,i���>Áоyz>H��"�;�����]�9j�U������>�h�<R�����!>Cd >�-��~��=�s�>2�=Iv<EOc>�ݬ>�a��:&���=б��8Ъ��qþ�g佨vv�+^�<�;>����*-�>�w�=���>v�
�$���[��>���PL���'>w5>�H��玾 R��sH����>;>��i�E^*<�ʼ�� ��'�
��8E�^04�T�?�)��<\B>N)�= ��>�|��(�>�/.>���pȅ�ȱ^>�x�>_�K>y>�J�>*K�<DZ�=M��>�a =�$� ����' >9Ƚ�6���I>Ѯľ� ���C�R�������I�̾��=B�>�jd�:�ʼ,�=��l�Nȥ=�0��ͭ>�O�|>>` �d����
��+�#��C@�;�>�3�� ���p�>wV��+5�aAB�n��𭏽%:Ľ�8>���>��> �>ܺ�=�N���ח�A��>|�.�~�>����y >S!�V7�>J�>dRƾ|��<\���L�U�!��B>��=h1�~���z��̔��C>)36����>Z��>=��s��⠽t`e�Ə*=|�^��@�<t '>�5��P�`�e�W>"��=k�
=��m�Vg�C����ȿ=�3?
�u=e̝>��]����`��A��4�q�s��4=�U�>ݽ�>F@@�U�D�쏏=��<̔�>��i>�%?Vm1�m�%>QX-�1 �=[�<��T>��=+��=��F>Z�==xʙ����<|+,�^�<�[��񂁾<��>5���Ov��"�;�l=*iD>��־`���%�>��"��վ��G�?`��]��VB=zKl>;��>l��=8�ξ� ��T��a���4>:���@%�ewľ9\�=j� ��Q8?uH��y�=��Ծ���>�Sk�-�о�:*=w�V�`J1>����;Ԉ>%~��6Q���)>Bn>O��=����5�>Gd�<&q�>� �=� �>�:�T�C>/��É�� ��n�+����>NXi����=š>u�@>=׾�e>n ������u�٦�r���D�� ��S<>^F�<@ E=v#8�S�'>�����]�
`J��Rξ,��=�=��<�L��<^6�>��-���=.�ul㽱��>c< ��,��h�6�JV����}(:��)>����l,�=��>��q�>@�=Ԑ>�lH=QS>v3t��r5?G��=���)�:���G��94>�uJ�J���&�k�Ų���>�>E�(�r=>�,��L�������b{>֧��s��j0=ӄ>gh&�5�S>��W=v��=�24>��D��Ց�Qʽ> J ��X��>�4>�K=~��=Ʉ[��O@>/+�����Ik���>>᫇>�.g�rtؾw���4��=��
�/:K>EE�>B��;aD�����=*Bversion_numberJ@Z3
visual_observation_0

batch


Z#
action_masks

batch
b
action

batch
b"
discrete_actions


b
version_number

b
memory_size

b#
is_continuous_control

b!
action_output_shape

b,
continuous_action_output_shape

b*
discrete_action_output_shape

B

14
com.unity.ml-agents/Tests/Editor/TestModels/discrete1vis0vec_2_3action_recurr.onnx.meta


fileFormatVersion: 2
guid: 9383297608d1d4530807d7109ee19d85
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj
11400002: model data
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3}
optimizeModel: 1
forceArbitraryBatchSize: 1
treatErrorsAsWarnings: 0

462
com.unity.ml-agents/Tests/Editor/TestModels/hybrid0vis53vec_3c_2daction.onnx


pytorch1.7:��
@
vector_observation23Concat_0"Concat*
axis����������
�
23
/network_body.linear_encoder.seq_layers.0.weight
-network_body.linear_encoder.seq_layers.0.bias24Gemm_1"Gemm*
alpha�?�*
beta�?�*
transB�

2425 Sigmoid_2"Sigmoid

24
2526Mul_3"Mul
�
26
/network_body.linear_encoder.seq_layers.2.weight
-network_body.linear_encoder.seq_layers.2.bias27Gemm_4"Gemm*
alpha�?�*
beta�?�*
transB�

2728 Sigmoid_5"Sigmoid

27
2829Mul_6"Mul
�
29
'action_model._distributions.0.mu.weight
%action_model._distributions.0.mu.bias30Gemm_7"Gemm*
alpha�?�*
beta�?�*
transB�

5432Exp_8"Exp
K
action_masks33Slice_9"Slice*
axes@�*
ends@�*
starts@�
�
29
/action_model._distributions.1.branches.0.weight
-action_model._distributions.1.branches.0.bias34Gemm_10"Gemm*
alpha�?�*
beta�?�*
transB�
*
3435
Softmax_11"Softmax*
axis�

35
3336Mul_12"Mul
H
3637 ReduceSum_13" ReduceSum*
axes@����������*
keepdims�
.
3738 Unsqueeze_14" Unsqueeze*
axes@�

36
3839Div_15"Div
140 Constant_16"Constant*
value*J���3�

39
4041Add_17"Add

4142Log_18"Log
*
4243
Softmax_19"Softmax*
axis�
=
3044RandomNormalLike_20"RandomNormalLike*
dtype�

44
3245Mul_21"Mul
)
30
45continuous_actionsAdd_22"Add
#
43discrete_actionsLog_23"Log
=
3048RandomNormalLike_24"RandomNormalLike*
dtype�

48
3249Mul_25"Mul

30
4950Add_26"Add

4351Log_27"Log
0
50
51action Concat_28"Concat*
axis�
< memory_size Constant_29"Constant*
value*
J�torch-jit-export*B54J *9B%action_model._distributions.0.mu.biasJ *� �B'action_model._distributions.0.mu.weightJ� [�<A
!<=��6�<�4���<������.���;�J��S��;r�ɻ4���n<g�<�+��o�'�x��<�;��'����s0<n��<���;��=;�"��x8�q��;U ֻ2�Y;����{)*�"�z��i <�7���ʼ:�����;Bu1<α;J �;h2 <�<]=���<s���o[��?���+�;��9�O;9��o�W��<� �<�H<w�����E<�������;�ׅ��y�������c&����<�R���j��fO�0�<ӌ��솯��$��6%;�<��<?�.<7&��N;�'��ݪ�v��?���� i����3-6���J<m0��uo�*J����<Gү��$���<�� ;��6;�I��t7�<J$Y�9�;� ��ᑠ�Ã���Dž�ը,�xV�<��<8�g;���%X���.���<P�w�Z�S<D3�;.���>�<��.<���+u���<j��O�;�����ݮ<�2�;E�k<�
���)<M)<@��Ú�g <�g��;c0:1�(���?���; �K�, ̺�=�<�J�:��V���U;� ;�<(��~ümP���=��Wp�r2�'�-���;/uz<����ZC�<�O�## <�� ��G���e�5s�_Δ<U�p<HL��_��w�l:���;o.;��-<ȁ�;'8���<�\��}��;r,�4J::bP�[�<�Fj<w�Ӽ��q�X���fv�C�<˛K������Ϋ;w*R�
̄���4�'��}Z�7�zS�X=�<�o�7e��0[j<��-<X�B���Z;i���3��ǧ�;~G��<�#�p<���<S��[���E۹.��;�{d;J��<3�79/�M<{4h���滽��GZ<_�<��3���F|����<|K
�1�<C2��?-t����;T{�;�=H��� �z���h;�b��
����)���g��5�<f�<`W���<$�*<}H�<e �l��2l�S�'<�WY;��^��㤻��<���F�����<��b;�S��>�G</���<��������M���ȷ��;<S4�<�c��"��<�sA<��T<�0���p:�0�<|<fņ<|��;��;�y���:����쁼�Fc<�J�<�6�<~��:�n�:ͷ:��0<7��;�ߵ:�d7ݑ��<�2<� �M�w:=[;������`�H<sk��9�?��;aI�CR<�<�9�:$�����?�_;˵ :�ܢ��ٻ�S7�;,��:�n�;CN���e<��ڻߍ�;�1T<h�d9�<�s-�+N���Oz�c��;� �:�9�;Q;Z�F�k��)"��g� < ���-����1�@ۏ:#�<��;3� <g=%� );?�X���D�K8�<��:zLJ<����謝�j�˻�sj��\<�8�� ?�7I<
! <aK�;���� ��Z�<w�< [;��O;n���a�<w��%������;l`���|��+�;1�<���:#"����N<v;NrL��xk<C&#;�u����W�W��*=B-action_model._distributions.1.branches.0.biasJ*��B/action_model._distributions.1.branches.0.weightJ�Q���q�;��;@a�<F�L<j��:�<�䛼��G<�~��?*��r<�D�;������:��'��x�#x<Sv<��+�+<; ;I�< �<솙<�"��ݩ��?H�h�����<j���ת�;*�}��,�<_��</� ��B���l��?��j��5b��/���5�~���'�.�@�7��9TK�������#�R�-漇��;b^%��:�^q<-J��/�<���<�����LA< B;#�'<�齼eY컈*�;[��;#;�;E�M�'7?;�_g��'��Z;aS <ml�;�<pʼ���;�?Y<���-dx;I��\X�E88�IႼ��\�]n&<�dD�P�9[鎻��`��W:��J<:p����-<34 �mJɹ��z<G?�< ��K*0;w��<�G��c̻�rB;�=V<�Q;�р;ȱ�;��ʻ`�=< ە<�~��w�;z��;�&�<�˻��.�b��� �<�F�V4��[Z�;�I�:�گ�j���+6���:s��;�&���3�f��;��<H%ʻ��û�N�<���<=�`��� <s%J��Z�����<|�˻�FZ��y><N��<~Y�<Ĺ&�.(1<�������v����7\c���W<r�<�� ��X�;��l������y<gV��Ⱥg=A��,l;e�g<{�q�bI��RC�9��p<8W�SO�T7���};g���j���ҍ<5�L<Jwc�f�<����ު;PnU;�ry�_=�<d2!�QCL�R�Q�ֺ�F��Q�K���9 �<D�+�ۿ�"gW<�!�<Yˊ<ň<���<�n�<�:��9[N�m�;c�Z:������ ���;�r8��\z��r;W�S< :��+��ǂ<�0��(<=���ر�ϙC;�W}< ��8�M�\? ��>�;1�?�?��:�-��J<��;񧢼�������� �b,��ߝ�U ���<6͓�_�q�����+R%�9������Zb���5�H�x<Zv�<�#�:����Qͺ�J��}��;����*Baction_output_shapeJ�@**Bcontinuous_action_output_shapeJ@@*(Bdiscrete_action_output_shapeJ@*!Bis_continuous_controlJ�?*��B-network_body.linear_encoder.seq_layers.0.biasJ�*���5B/network_body.linear_encoder.seq_layers.0.weightJ��֐��p�=O�מ�>ݏ��0��Q�h�L�<��w�|���2�=X�7��>��1���F;>��/=f�<�K���C>�9= \�=�B����X=��i>Zʳ<u�3>����y9>��*>�z�<�3;�����Ϫ<Q =��>��-W>���=�c'��2���r�������d�V���ľmy=- M���-��:�=u�%>�pi��(����=$l=��>#��=.��=n�P>F��= >�z��5�`>���8�>go����R=�k�=���>�u�<����,
;����>��ۼ��u>������v��E�<�Cn�&�ʾ��=I�Š>���>��_=P�=�=�2���>sP>G-e>��½_2����(M>����(�>>��{> �_>=��=���>�^�����/�<��8�~B�=U\?����=���E����?F?����T��b��r~�]�m=>;3>d�(�|���H}����m�'��>��c=>�꽒$�>� ���s>H;�G�þ;�>��\���o=�:>���a����>���>x����p����=x̊:�.ż�q=��b>�F�?��>��p=��>��<�K>�Qe<�b���0�<&���t>�>��C>G�
��.��,x=�I�=ɩQ>�m�>" ��?ؼ��s����=���=%;I�ʷQ>0�h>j�f��L�>��z>"�Z�;g�ʨ!>�����?>H����@� ]%=x)�>�v)�f{4���Z=�=~��ؔ
>>H>j�ļ�ˮ>� �
V>Pㄼ�7>����=t��j���h�=�/����+=�P*�,L�>C���ގ=P�E�J���>�@+�����2��>��}=�b���/�= ˾�i��-c�>�:۽�(�= s=��<��Ծ={T���ʾcɽ�1>>����Ė>B �>�b(��M��$��=���l�=�y�<�"|��C�ȏ�<q*�=�b�=1ˁ>�eg�qw=]!�=a�2��(�=�#��]���*��e㎾|��V�>�]?8�[����w>��>,x��v��>���.#�<w/˼�14=�=@�6��`U=F�>���>R�c��^@>���ǔ�Y+�< ��>/ٽ���=�u�=W>Q�r��_�; !�e�=m,0�׳��w�B� �[>����P�?zb-=uu�=��f������h��?��6�2��S]>k��<]˜�Iv>�ֵ�X�'�N�����=ZM��M >�K�B�>��F=i8���4���S�� ��:m�=��=Ĭ��gX������=Yt=�1��~����⽾'�e��Y߽ �=��>���O�N9L�S��=q�1��Q�<�����r��G
=7��=t9��p=pV>>�սKb>8Ъ=���=W�9>�Dž>�%�>�A�<��پ-CȾR���Q� =J�ǻ��)�MK�ߊ�=�xN>��]�7���`t>�ع�[(�>x����l�=�]�>W�>���!�>=w��)��*����< ?�Qs��1�� �����k>��q���=�6��M3>�ہ=)c�����/����D�S������r3��
�����=�Ql=��<U�#>�
�=p��k>1=�8\:�W=�g;�ˌ����E>�k�>v�/��1��f�>���=�i�;[���¾K?)I,�Wz�[m>���=��ͽI�_�1\<����x��J*>䝳>�nN>�`�=���=ӟ=�<��3k>G�$�ã�>�69�.�=a$��tb>��w=������<4� >B�?�:�Wv_>���ԉ�=� �|%�|!�=70)�-(,=����=C���#7���u>�0M=�^2>���>)V>Q)=���<@�)��.���1=�PQ�iA=���=X�;k����2>��=�2Լ��=�2�<�d�>jЉ��@>���>X^V=-�j=�@��W�-<�A���=B)���v>�?R����D���o$>��>r�:�m�.>��q���> ���ҳ���n����=T���k���#����>l����zB�>=�>�鰾������J>4�㻌#��_�(�^�>HSb�=:���><b�u�"�<�t�����!5�������y��Z
>p�_���= �G�)�P=��.��b>¯(?��<�s���]�0��kS�=a�P>� ���z �#�#>6�(���j�Pͽsq�=s���I[>��>��=H�=^sw�E�}���q��Ȅ��r��)>ʽv����m>%S/=�8K���B��o���7��&� `=Q�}������J��靾%eN��sQ>G��w����KF<��>+Nڽ Ƶ>�a.����w� ;B=����vP�=�B >yLu��d�ҽ(��7�_��Ie�Ja;�@�9>�7»���=�F�=��Z=�4��=K�"Z�=���=���W҈=hX�(��>g���-Fվh��>�D⼩�6�P��=!�A��G�MhN�E���Y7�>l*0�`¬>��+�Hל�} ?��=�8<��q����>i!�<b��=?8�>/�׽�8> L�=�Ɠ�,���$��Zl���L�<���=��-�f=(!j>Y�=,�н�}�=i.��@H��t��E���[���p=�He>v��>��>�S�=�N��|�[������s���z�I8�=�Pɾμ�> ��=�O���y�< D�FXھj���K<]y�>V,>���>+����@><��?>��&���V>��r>o$5����=��=��Q=;ŷ���>n_�]�#>(><�1s=g_��w���3i�=�����2.��{�M��w�>' ��5P[�JT���н�A���R�=]k>o}>ڷ����f��M��>9m�=;-=��>��=%H����>����H,f>}�;���9�8�J�p����P���b��mb���茼b='����=���=��-<tu��3�G>���Z?�=3q�$��>j���Z�<t�=^�<���N>�U��Oi��0]8<���<��r>�<=>ɼ���%��1Y���Q�(r=����/Hɻ�ޤ��]��h���>���=�Z���sS�e>ې��끾:EU��� >��:=��*>$�=�z�=h/4�Ij�>����s->a= �+D�>���>�M�����ㆽ��#?��)=�wF��s�Dl+=�<����?���=����;����=��ԾӠ>���tG>0��hb���7(=��Z>�ﶾ.�C>�Q>%[���_�>�qj<ݭ�;�ly�������Q�X�a=�q����%>V��=��>�k�;S�>/����P>��<�Ĕ���N�9oi=�u<$���B�� <��>|$K>JO��#(>׆�$lN�)�>�@�����>H��=��>���n�޽��s�c�x�� >��<��>9�����s����>Z<_�i�=(l�<��ȼ��>��=��d��@/���J>����>��;x>nE�=�A�;xT�=
�0��l��k=>�>��=j`�=��H�#���gzx�}����M���>��I�����1?����<��L�S�>87)='�t���\�z=j�F��
� �@�C�5=؉�>b�A�c �K��=���>�z<=����RO���p»S�|�\o��x��=�#�=7���d�ƻ�9�<�&�=�,p>^���c��󚈾=�F>��,=p�+�����M�=>Z�����8�%>�D����+���m=��s�n�[>Z�t>@��=N��>f�/>s�_��c��K�^=�J �_ <��ʼ>������4�8>|��>�b=���o�g��=�aV<J����0�񽯹�: ����<��a������뱽����?#>�{ ��S>�ޮ����=�+������;��=lhg�܇�=г�=��9�{=�ױ>([=ь=�_ս�j"��>c,�>~����
�=�xm=�ǩ�*t�� ��!�L��q�� ->��x=ׄJ>Osf�3��= vӾ��>w�]��Д���(���>=��<��6���">s��=��`>�W@<^M>�hf�e�L>8��<z�z�nn=� ��% ��8�*�ܽ"��|D��W�;�eh>�o �a& >����J���6v$>>����N8�SƋ;���>�s =���;\V�=D#/=�;Ҿ˯�>�$+<[�=w�P�c�žed�=a�Ѿ�a�ߣ%>A�=�'H=�zپz�;����s�==�:>��.>�1>��ܽ_���/N�0䟾9��=�ѧ��]0��=�3(��V:���A�@B���4� �?� t�> ��� �&=�� >S����BýL�g��幽�)��1!$���> o�>u�C�}�ܽ��C>�Hu�-?�<J.���K�>탞��p�<�Gؽ�;=49 >���<z�н���M�����=���=]Z���=nC����Ap�����>,�t>����`8��r��_� ����=B��>��w�~�i�'��;+?���P*>���T�4=#G����ۯ��m����<�/�>�c��$`E= Kͺ�i�>%J+��ʵ=���g�z���۽~g���V�s}F>�N>���= ��=���>@�D�K T<����V=�>��=���،�>Ke�>��ݾ���0>~�?%ă� ż"b�=�5>��d�Gս S�>h��y;���>�P?>���<��.��V>��>׏�>�>�S�:Mߖ�`��w�P��*׾)_g>c��=E��<v��y�ü����I>hj�A����<��?�4�R�%�!>=B��P�����=�O���4��>��=1��;^}^>�Z�ɭy�"뻐��,�F=���d��<�g�1I^>#7>�Hg> wV� �>Һ� �W>Y�w=G��=�^ >���� ؉�7�>>�����d>Ѩ��G`�>W�6<�)>��Ǿ�T^>6e]��`��¤=� �>�-�>~���(�=23>Y�j�2�}�OA���DC���R��O�=w|i���<Am��p>2��=�:`ڮ����(���r>�m�l_��9r>d ���~�i*�Th�*��=�&�pg��6��>�h���Խp�&��ͯ�Q�+�3ܕ=�l���ET�E! =�UC=¹�=Q�G�1
'=��-��B#�ɿ^�Ap=ؼ��Hݻ>��(�^i�|��N>].�=#*�>`!C�m��=r�>|�D�"1�>��>�3g< 2�>� >����ӑ��c�=�ޗ;�c:���p�C*R�^+
>��߽@'B�\ >k�4>j��>��=z�e=��f����<�3��ܸ<����I߱�#B�>G�����˽�)�=V�O�u08>��>%c0>��r<��=�[2��; >���<��I���(�"��>H�׉
�ð�<�\x�q�=��A>���< �Ͻ�Y�����E�=�Y�2Yj�q���M�r�> h�q�>ٶ7>T�{����۱�=o~>)� >,E�<�h0>��R<�J,��Nʺ��*�V>#�V>����@<|E���`���"?���=�����~���ܽ�)�>@� ���7>���<����h�6d��3��<�ҡ�WEZ=d�=;�_�F�o�҆� ^��O����V=\�=99��bKe�b�վ�&H>$_%���C�'9�Pﴽ�ȴ�y��>Q�!=p0?= N<=N�6>`��� =R�=q�={���y�>���=&y�pWŽN�>���%����|�)\T=,�>m������$��>���� �C�1Dt�u>�n��lCW�S���o�<�U��jK!>b�:���=/�>E��=/P�֯��+�>pj��F���\>`�<��^�)��=������>�3�3����ŭ��W��e�-���t� U�jK�=/݂>Amd<z7 >o �; b�`� >.8/>3�V> w�>�F��4���G>?�'�>z��>�&d�b��*�t�9|j>�fE=ሀ=��>��>p3=>��>���=�)�͵���b]����}�߽���=`+ֽ�=>;q�=[��>���=��>[���P��CU�>�_>KO\���>y�����s�� ����B>�J>�)�=�$>�j=���8�\��T>f�>�<1>�H>�¥��;>v��>~ܻ�x�+>jI>�<;���n>V�O>���� ?�N��<M����V>��<Ry���Ώ��L[��"�<�͡=˕c�i=�=�]_=^j��s== ҋ>H@��9����o>�ue=�t��� �@��Uo>��>��=�Py�y�= � ��s>6
�=�͎��D�=85�Ǎ.>L��>�7P>5'þ�>/4�=��%�����'�<:9���M>��^�=��"<kb>� �ͯ��`�U>���>���>���=ٌ(>��=���;6)޽���=����.�F>^s>��< ����������WR�=�D����1��,�=�q*=2��=��Q�B��>������0�C��>�
�=o�^�̽��>?�������'��&��^L���/ >6Y�=kI����< ��<�ic<�pG>K_���܀�}E���M����=�>�|G�O>hG��� �����=��姤=��x�>�
�u�>�5���S�=[�������=A��=��=� 1=T>�Z"�1Ij����>�LB�+3)�ԉ�>▂����>Ӭ����I�����Կ=bn���=4�>Ŏk>�$)���'�u�ϻ}zI�����,���m�D��׽}xt�<�0>��1�xۜ�y3��ue�^�>K��;��;�i��/`=YJa����eȼ��J>�ݼNu >t��>$��=\-�� p>Ⱥ��T��n�<Õ���,
> �+>�]4���>?������p��
>��ƾT�E=v���ϴ�>l��=��>�-T⽤w��E:ɾ�9�>� �.�ɽ��P> �B�D��>y�>uM���`��W� >=���m;dҧ�Xe۽{0V�䅾D�ݽ��!>d�>���<^+�=�O���������X�hJ�������ͭ��#�=#p�>e�� Q��G�(�����L<-m�x-*�澽1��=2���"�?.o��A��=o���+���;;��aF�=���=�T�>?I���H�={a� b�����/�����d��콯5y>-�.>k��N����~m=}��=������=Ȳ2�����h�ޕ�=�^���M�������=M�>�2-��;�9l�=�V�=c����^'���D=!��`�>���<�X>fV=Q�����<�-M��}u>��B���ӽ��|>��h�t���V����<�ܙ�� �=0o��IA0�LMY�d�޽��$>�u�=�T�*����:>�:�<lx=j����;x�鉓>��$��XK��3���W �b 5�A�=��N���P<(<z<��<~<|>;�>9ٙ�~� =��>\y��m޽-�>T�ӻ9]�>-�x=LiB�s�>�����V>�f~�$6��Zk�����T� ���=>���-+�י����l>�d>���<���(��= �h>�ǀ=����t%��W�>B҄��nK>�C'�ans�PM�==�=��<Y
y���=�$����i�}�F�)>v����=��=^:T��I���'�A$�� =�Ž<x �w(����$=��>�_�����k���*>����џ=�y����������\��4R��M�I:���>��k��`=ϥ�� ��d�>��j=��>�ɕ9S�y>a�ƽ����ݙ�͚,>L>f1�=ʎŽ�"��Lv���T�[�=�=��^��=�(�s90>vN�=ԁ�>N��v������=� t��5O��3k��f����5>��R>�D>~k�>�FN���*=o]k>�+9��v�<�����m��G���R轫���׼>~��Ruؾ*�>�棾��(��s��i>�'��$~���E>�H>`ޣ=P��=���<��x>�RF>�\ܾ���>��>��p<Jp�� �ͽ��@���>�Ž�A^P>�->�W�=:�B�A=By��e� ����Pq=��d>\��=��4���]��刽��ż�މ=T��f/N>���=�G�����+��� ;����ڟ��99��ؽȷ��S3��}[T���{��<�A5*>���=�������)>*�3������\�=�>wJ�=��9=�c^<��>�1��;��>�in<��0>@�$�H:F���ܽ�{[��˶=ڎ��^��)d��J� >��=\�⽷B/�yK>EG�<%�<�G�=#J;��|�>v^��S�>�A��@� >"!v=�E��_�>�U>9�>�&>�n����^�>��(>�6<���>��.�EVý>e�=��y>�>�?�J�_"L>N->p2�=����A>�.>�k�>�٫��p�����̽���/k�>�݋=\!j@=J� >Qf��9k����˽�4��K��=�#��+y�-9���!�>�;0�{�����>V�> �>�*d>�E,:�E�=�E���gH=�N���>�#�=�C�����>�Z����>a佯����ν�Zٽ�4=�9�>(>��s>_L��Xy���گ>t<>��>&R2��U�"Zd�o��=; ����!=xb>-�>�U��KKL>�\>��P�I�:�����U�>�Oپ+y������Y>b�*>a\��G�">��=���R��=TE=��>���~:�������)���2R�
j ��Ƿ�C݉:A��=�(�sg�<��������
�>�9����N=����KN'��ѫ� �r=�m���8>.+u>�l����>M�j���?�[��])�>֌�=L�/=�""=F��>�N��L��=/��=v��: >J$��;r#>'���������<�.��[l�=���<m������TൾP+?���a��^���u�>�0���G��ϖ*>�i��…K�ޓ�>oI�<��1=�R\>�=�t�<�*���.�>Zs3���ƽ�Ou>P��=�푾�ɾ'��� ڛ=�#�o�c> �'����=�ʱ�,~νd.��҇%?��@>M��>�4�!x���>��>��J�m���Q���x%ͼ��s=�c\>kw�=���ѻ�l�=U腼�y���� �����t��>;i��z�C���>�>FX5���'>k�>���M� ��yr=�I���`>TV��n�>t�p>�f�<|݃��j�;$>� 5껌/ �f�i�* ��@�K>�&\�[�(����<K`��_���0<��P=� �<䷎��-��h�>�ig>��ǽ��>���>�=��:>��=�n��ܾ��8L?=.�<��<�
�>%����|'�s�8>n����>��>w��>�2P>K�>[��s`��+�"=��Q����=�h����>`��>��s=�o;��=,���.��=״(�H�/=5�����=��B=�A�<�`�H����r)>�h�{��=���!�$=�>d���]c�#�x��>Nk[������6��r ��Qξn���o:/�H�P= ��A�E>Zv>
��=�=�>ο���g�<JGܽ*�D=�1�>�������=���=���>���!i�������-�'ν�K��G ����^��9�V���½�����E�>�;>[���B��>,.��ZՄ��ڌ>.u��?p>��<P�c��2�����xҴ;���>�83�^K>J)��\|�>�n>qҳ>0`�����<��= ,�E�P<�}�<@d��p��=����,�>�=P�H�<��>K~=|4 >4*��L2��u>�v�=���=�ɾ��ļ=�!�BTp>�f��w��>M�ҽ�(.>��>u%d�[�>_�A��� >K��`~��1?g�����̢��E��찤��=b>�F�>��,>滼�u��>����8�$�� g��o(#>I�B����<r�K>�>��I�>`��>0��> ">�d�>��=��U<��e>v�=t,Q��Y>a�~=l;�>�@�<Ӑ`�ŀ�=�$����7>�@�����<A�$�b������3=|78�Ñ=��j��½~���i�S�#OF=侗o�>?��=�����>��Ͼ�\<>��!�R�Q>�h�<�m>�O�=�5�>�"H��CT<�����=�R�<��ƾN��o�r;�팽����n��>�´��c��z��=�@w�E.M>��2>g�>��:�Ѷ =�f,�q<ձ[>��>&������=�Q3��6C�x��١>�7>x=��j=9> �\��O��q����;�=̐3=`�*>���=a����M�;K�a>sj�>:����8��+��>��;2]���[�Ҳ��V�=�H��g��<���>� �=� ��DsA=���̽�=yy=<`(�b��Ⱥ�=�d���>�:ؼj->��;MY�>�6 ?` �=�� ����=�������=�=xRžz<[/ >~�1>�� >�c�����N���i�=;�B�� ��X�0=|Xͽ�l�<=Q��M�#�J��@��>�0T�!�>�> \%�L� �M�x�<�=Z1ʾ����Ȉ�
V���A�>{1>>���>(Cy>�0�>�׫>�bZ�a�>�;���*@��G�;9��D�@> 脽T���(�8>V��;��������%>�z:�bX��$˼�����J=ś�=�>�-1��GP�R�ɵ�������~>���c�>��Ⱦ���ր���G��2�uC�A��=������<�����T�=v��0����v=�k���Y=Li�?�%��]���=�>Ո�=���>��'>w[$��f���:i>��5>�'ýrlW;#!q��q >]�>ş��� �=�d��40�=|��=-.>���=O���T��&��XT�ԙ>�6C>�{�ZO=+j
>��^>73=���Ÿ���{��87>�b~>���>���o��E�>J��<��v�݁X�[A�<s=>��X�!՘��jٽ���>e�����>����֑�>G� =�P����=�k�-���oV�=N���Ś��9j�� b=���;�dR>��> �<���zl����<��b=�Ž3�N<zʋ>�R�=��/9q4�>&"�>´��><e� A���=\Z�=O�=�X�<��������u�ɽz+?����<ـ��T��;�%{�]���W�k=ů����<�󅾽��#}Ҿ�0">��D����W��=Pl��ԝ��Ud��.<�*�=�;��=�ذ��䀾�ۀ�1L�>ه��=u�#>OW�>mt^�K�0�
z��b <�脾]' ����>y����*>a��<s�����8��=� �� W��Y��F�"��9�y%�=��3>m��>i�?>{����p���� W�>�pk> �]>������>܌7��������hw�>n�=� ����@�,C?:�ܼ���=8��ۂH���>��="��>��l�� ������ڥ��J���O��Z��RSf�x����C=]�o���p�П�=������=wZ�>N5>�J6=��P�J썾��=��E=D�8=�bE>q����#��-��Q����=&3�=\�t>��使ֶ=w,�<�|m��w�>Ft�o ��&�.���>�[> �$>-��>�>�<KA�>S���ї=��S>u�_>���=�|����>�>�J(��ʛ>�>�S����ξ�:�wW�>�̺��oj�n��=��]���Ҽ����:>���<���Ơ���'>S���������=[�b�ik�;ߣ<��^�zQ?>���&/<��DQ=Cf���;)B��5���4�$ ��]#u>�48>'�?=�B>�U���6$=8�3=M>\�Z>����w��İ�=!J�=���=�s;%����0��Ҷ�>`N*<J���K��8d+=��,=Fy!=��ڼ��پ�E����>Ivi>_i���H�>l��=�U����̾�DѾ����f��F�=5��=�D�>�F��������=�Yk=H��=�m{��X���'�=� �>�v9�F[���a{>WG�<�`H����J���y9>'�P��BE�*"���>�<"��=Nd��{�P��Z���*�_L,�Tr"<�U?!t%��F�u�/=��@>LW=�ܝ��-�>�A(��P�>W���m��=���;HLh>�u�>�$��.@Y�������ǽ�!ǽ��=}��>�iȽv��Cf�=(r>xH��� ��'�G;u>��?�e�޾^�=�Q�=<j�=�5�yȞ��P>�M�Kܽ�z�=y��=��V=⭳�YI�=���Y��=��=�,���w�����>r��w=g���7����y��U4>�����v>ꎧ>��<6s���-=5������F�>=�>���=GE�Mk�=8�g���A=?�%<>h>������9>b�=�Y�<o�׽Àb�㨴��6W=Qe���˯�˔h��"'�3�)�� U��r>G��\>^��=���U����.���~H=�sp�'���f+>��=D�=�h>�,����p�=��S=� �W!�>�3`� �=?�M�rD�>�V����>ʠѼ,ڼ���=?Gl<�v�>�k&>��Ͻ �<\޽ �I��cb��ݗ�];ļ\X��X���Ƚ멹��ݜ�B@����=��=�{E�?�=/06�`���a��W_ѽ�㫽�O!��ػ>�N��������>�����H<MA���5��F�=#�e>\���>ؽ��=��J=�M(���'>v'��wց=��>"f3>��>‰}��V��hQ��fT>��v;U���nq˾̈��o>�������;m
?7.���j���/�{��HU>�#t�����%I^>����h���$��<��=��>���g7v>d�¾}�w��͸��6f����=e]}>�P�=���1�9>������<d�|����=�>,=�!T=��y�;����)�=a<�˅�|/l>�8e>��ݾ�!M=���6���7�����3��7��,���b�b���}�=��¾&&�=�x:��=t}�:�o�=J�=�1���T�>�@þ��]�I���7�����C>�V�=oa۽����`&�hZ =㴓��#־��u�-�ԫ��� ��u�_>T�=e�K=j�= ��R]g>�é<���=j�=�Ԁ�>P��<~7���c��3p>�i$>GX��o��x����;=~��{q���蹽��> N��"�>��� _�q!p�"�*>Ӎ|=dD�B�}�Cv��b�</�:�VY; ��=� O�)��>qށ>��>Ga���ʼIAO=ac1�SF|<9��rؽ8�>�����
�P>��,�4��=�/��蛾۟�=�+�=|Q]��Z���;�0�_����>���>T�= �)>��/>�޽wQ��h�����޽������ >��ؽΜ�����8z>�"�=8�=�h�м���;�.S>��;Ƹ�=�V��(�>���>�䗽w�7��GH>λ%>�����[���]K�m8�<��k��#
�K>H+�=�jY=�bv�h�&>)�ܽ�
o=�Pҽ��{>� c>�-q=a�=��̾�A�=���=k�]>�;.��v�<7*1>:�E>Ѯ�>�1��牾h���:A龷��=�n���f�����/��=�^�>@�c��R�=So����=���=�k��p��H�
> 5�>(�f���<ɷ=����
o5<�$I��;4��`�=,6q>�w��Yӣ��^ž�! ��ʸ��F�=�W�=e�&�L��>���=,�>e>�v�; �=����r�<���v�<Z�ɽq�?>��>u?>�>U�;��� <D�D>02�=���=@/Y=-ɏ=w��>�A��Q�G����=cV��a�~>m�
>�� ���o<��(�<Z �W�t;�ȯ�Z�:��W����3������N�����=O�=z>���='��>u(��^�=��c�>b@}<�����8�>�c>1�<��->27F;;�4��܂�]퐽���[�־�\M<^Mڼ[ML�^����>ϖ6<�%�>Q��>mj�>� x=�rz>�mJ�\e>Y>�]C��+d�/_g>�< �>Jj�>M$���.�v������>����oj�=�/E�Yg��V>@<���<+��>��>?�d�\�S>X�y�}մ�Q��=uL�^�2=��>�K������>d ����=v�=-���?p>6b
<�w4�Ӯ6>� ?�Ǭ�=��<\��<���>M�|>���o޷=���>l�s���>ũO>J����>m����E�ܽ��8>�2ؼpOļ�扽jB�<��`>�|��� >��ƽ�t��G$���>(ý�Q��3�����=�(3�;���ύ>f�T>ݧ��f׽�=Ī?��E:>�/J���ս�?��I�鼏�����/=�Ho��W�> ���D�'>�dt�_C8�t�=`eZ�����j��)�=A=c���uN����J��%��|��C�6<Ck߽sy��칽5�O������0̾��P>nmR=@�>���=��>�v��H4�Q�b>ovQ=�Q�X>4ծ�_Ct�U^?݅��F;�>�;�=F3>C�D����>L���`^�>z"��D��=nӫ��"]�gBC>����5> ����N�<��>E�=�|�aRN>yIڻ<��=��ɽ�*>{/���x>��=���>�AG����4��Y�:Tʽv�V�4�&<9莾�h�H���v,M�Y�����
>]^I>�p�>i���/>�T�=`�3=+��=���=r�.��𙽸�;`⣽�~H>2�C����-x������lF��ψ>gu���P�=o�?��l�<��4�=��>�-�=�]�V�Ľ�x�=����-�p&E�_>5eH>}������ �O1>���ˢr=ox���BK���"�q�?8�=�9ֽ�+��]���Bh>-y<�f�&=՝��S�=��ӾI��=Q�"�Q[7=<v��6��=���}`����0=�>ja�Gyq����>� =��:�2�<�O�A�����A�7!R��q��W�>+f���� >e�3>(q�<m-+������"�󝑾�ֻ�*=��ٓ��0���2�$[�<���gf�=d8m>y���>���ڱ���x�wx1=C������d���8>����k��!�=ua/>���������Y�=J ����>�E�>M������=ً���T���N�[O�=*�B>e�o�� -<OX����sɨ��� ��{<�l�N�����*��=þ � �v�J=fR*>�x��DV�1Z>��c=䋒:������=�G���px>l ���#=^��;_���X��s�>E =� �<MƗ��V���E#�U{��T>T��=���=w?�����>���4��=�]����>��������ݾ�|�T�e�2Cb�eg.��k�<Y���bI=��ž�%�>Ƕ>���<xk#��Ͼ�?�>>��N<�u¼�%=�|M��n����<Iս a罝=@�~�#��9 =�L!�8�*����=�6��f>��Q>b�$=l��=�w�=}��>��$>��;=��&��(:>�.�=ʟ�>�% �w��yQ�z,�<��оo1��غ���=�� >�H�; ��=�)���i3>%BN���<=;m>��+>_΂���Z�Ć�=`��>����F=j�>A�Ͻ� ��)�t=LW�>�(>aё=9�>Ʈo�� =B) >���[������l>���=��=�ʗ>&�p=]ʼ���=9����P\>�����<�m�����>����N��Ǿ=N��=�X\��[���� >��= �U��x�>��Y>���=]`� �:�N>�=�>�>�.��͈�[�=�I�B�>{cQ>]J �j���0C�=I.H;����V=��>!�z>a'��B/���F��?�����q��H�>��0=��<=SE<Z���l�Ҿ���A�?���=r��:x������������5!�>M�"����E߾-1&�Iͽ�Nн_m[��J߽@�ɽ�腾n �=V�㽹��d5<���>�qO�D=��mP���
��?X��fH=K/>8ߊ=W��>qа�ਃ>V&"<+�ڽ1�B�x�r��b>�$h�"�@=ȅH<���=ai����Ea���{�=`�>��6�iM!��jV>c�%�y7�=�(|=�H���*->0��=�ρ>N�K>�ڙ���ϼ��=a�.>�����>\��\� >a"��Uy���=���.E|>XZ>�ۉ���B�c�"�o-�=I�I�}�#>��4��"(�/톼��(� �,���='��>6�J>��i>�=O= ����C>�����]#��P�q�+�{T'���=�����}>{� �9����ԾT���>��=^�=>���C%��eV>���>���>td9>6c>C>��>�X�=��=��=Xy��t\>��>Ǡ��붼;�?x�����>��C< t�>�j�>��ʾr%���.�>&��>�\�>��e����Y�>CYN<�|�9Y >:�v>�7u>��&=E��=���=q���?5=ڃ9>�Z�=�}�=V�߽bf��Y�2��\=��>�|F>�]t�N��>B,�>ݜ�=0ZȽ���=ӧs���J=�W}��LK�d=�='?�=3T�>Q��󐑽3�;׳b����' ��m��iɠ��H+=�S[>u&]���>�Y =]k����=�X>��V�>����k/�>��>�����ֵ��+?�i�>��<>��ݶ�'��=5��pc#>��K>�^��&F���|*>����ܘ�N!c��>eԝ=1v>�|�>��=�~˼�����hL>E���o��<�T��e5>;�*�0d�=39�=o����F� �-�Ąm>|Q6�ɽY<���>��b>��B>ߺ
=��>j*M��q�sIž��*?�^>�L���~>#���� ����K����V���� ?dV�=�<>��\�����(;�;�&]��؍<�x ��"�\^6>g����@[<�qO>R�>kD���ޢ����=���,�=D�,�6����<wW���䔾��ɻ֤�>z�׽g8��Bξjf��6m\�ߏ�>��!�0�73>>����ځ�}�e>E>�#�=���=#�=�#�e�9<vu��K�>:����9�����>���BeK=&��>KT��%i=&�0>޼��>�”����=�!M>�+l�;�>�<O�|N�6���v���*��֦�= N�>�3P�����n(>Ay"��6Ⱥἆ>$:��!���?��AeG>�U>�᏾�IQ>^�� ߌ>��n���4�<� S����bD'=8���cC�>7
�����e��>O���qϼ���H ����-�S�H����
�$x �w��`(���9�����!ƽs��=]�>S*��}� ���\��d�>�����+��.�њ�>� �g5����o�?P�>[�">ܾ�=4銾\�r��={>���=�㘾��=xe>F� ���^=��>�F� ��
����L��3^����7�Ľ���Xر=�p�= 3�=w{�=,�u=�{��`>ϥ =�M���D=�>��5>� �=�1�<��=ق =�Ο<��H�3|�:�Ѻ���Q��>�<rE���ڻ��.>S���쇽|dQ��0=�T=�F�=��;3�r>���<�'��v%�q�,��޽���=��\>=t���< Z%�_6�� -�=E��V˸=&����*=_�w�o�g��>��ľ+�]��>��\<7 �> �j>G)?�Fl�ӿ����Ҿ��D>� �����A�`=if���p2>�*>v��=̽ >�Sp���=;���4��=(�q�b�<��Ƚ����������|>����%f>�훽]�=p�>=9%>N;����=,
>6ui=ǒ
�G�=� >�g`Y��}���{��!�0���=�V�=��>� f>����%;�[��>��r�a>Fa>�j��U>T ���c�>�Z��d��<��c=���=DT�9\��O�=2�d=���=�('>e���%�=ýt"1>�
���`>�k����>2)�=3��>
Z�=#�+>Eֽ@��IS�j==
�x��� �螖���� \���o�<i��=�i$>�絾3�����5>f��<?�����>�Fּ"P̾B�>��=�$�� �>�V�~��>��O>�)��ɘ�94�=��� �9�
�4�g�ξ*]=�(�r�����X=J��=���xK<�d�=�`ؾ
>b҂�����ҁ>�r?>|�y;���=}�7��c�ɏ*<`p3�Wf�=���e[����7>�z�>�D��J�<�b�=-0�>Io>��5>�2T�:_.�;{{�?j��AE�cǷ�5:���^�;�2m�>���$�>$n�=���=*�]�a[��ʁ���f8��_;i�<�� : �� >�X�=���>��/��sZ=�½�޾��=�\������G�=� �/�>lT>&�<����bh����<�,����;��0t>o�����C����=8�"<n9�=&�1>̉A��@�>�J�>�����96>���%%g�P�>�h>>�#�.��>���ތ>�C�����*v���b>Xq�=�� >x��>�ٖ>1�A�8?�� �o��N�=�����<�%�>����2����;s�!>��&�=��>w�Uj;�-f�{�.�ɐ�>�d>*6$>_l����>��?�)��-�y�f�)=zgy<$н��e�� �>�fT����;B[=2�/�M�`>� ���/Ž��-�d��=�Ĝ>�EQ>BL���>Z��=�]<�E=Sj���H�����<>Pz>��J�K]=� ���SU<��<��I>�!�=;P�NG߾@��;��f�~.�>k�3�����s�彶E|=B�l��@���H=M��9W3>,"&��c(�OM&>Tݒ��p�=�^�q5O>ZU輕pݽ��=��E=����܈=�C7=a�߼��cɚ��p>7�<i? <C>H}���vq>�N�=��=<d�=�4�.Ϲ�+�Y���>9�չK4y=Û^<����q�>&��=(෽,||��~�>�SV;��c�@�7�ʣ >��̾�&̽Q=SR#�D��=��< 6.=�b۾p�4>�n3�x�a�bI������0��]�<XL�>�~����<w�L�&��>%H>��'�� ���82�qӽ����25���V=�6�� | >e��=#˾���<���>Ǭ=��d�q�
>!TP�Oo���d8<��ɾ*)>�oX�7�>��Q>t*j��d�=� �=����b=�j����+�F���T���<¹ �i'u�"�>��>>�s�:�>��������¾��`=�j}>��j�FY>�s��ڡ>6
�P��=%���G/�=��}�B>Pq>���<�W�>�-"�?`A>�F
�ü���U�|�>�^S=/�Y>�L���]��0k��9D���,��4�=q�w�D�t>o�>�d�
�{>�7�=ǖ��&�>-��>?�=2x���<*w$=�T\>����<j�<���>���=)G�>Y�<>�D��\rþ�j��F��!�y�'I��R4>k���[=��=y�4=�LK=؂�ҥ���$�D�R>2.>�!5�Ǩ�>�)�<���<�z�>���(<m�=���<���=��>�bd���>=E����c>�&b��z�<)���Y��W1��1�>�T�= �ѻ�L��c�=����>�<�%���X��ҍu>z�#=���=�%F>��������8�i�T��W��� =�'�>�4�=��H���r�E/�=��z����<��<���=����NV��y9����G��妽Bd�>�@�>n�>�4�>L��-�=QNؼb�o��`��N�X=;���>�L>��P>X�C�^�>f?>������ 1<� =U�=G�=ӉA>�}ؽ[��>ʷ>Į�=�v[��u�=��>�j����ڼ�='=9t�>�5�=]�� ��=��c�]M�=� >Y��<0}�=�U���>5���U��q\^�h��=H�N=h�#��Xھ�a ��B��; N>�4v>/Tξ����^>O>#�=-S�=��ؾ5��>���>q�q>uWg=�O5>��+=�v�b6>T.龓��=C �<3����>��=Ga�����غ���n�Zn>�2o>��' ˽�i�_�F�]7νƕ:�d�_�*�����P;�b2>��:>Gz��<W>T"���<n�g>��⼤�\>�=��>���=��>���2����p\� X8>F�O=��>��H>\��='�>l�����=�k����ս�[�;V)��p9C��{E<8 >��+��t�>)/=/^ռH�>&��= ��<� C=��:>U�J=Q��3>?��=^O=T����J>x d���>�x��y��>+2 �� v>տ�>�[�̃;�ܙ(>kbۼ��>��>�*�=锧;��z>SM�k^�� ���o8=ɵY=���=�׽��_I>�I
>������q��=�*�@4h=��>��@>X�<_@#>h�=�<��~���`�ǽ���=_�>��>=�D�[u�>E�$��=�g��9�����<����HW������>)Ƨ=�t�>�=.ّ= ��=Ğ��k�=0������
߻&��w�>�n�=&.����B>��^�f��<�[:��1�=����=1�|=/;�vr�,�}>�l��T>��
�q�^>X;˾�5C�~7V�"Ԍ��b�3�p���I>��l�b,==�_��m�
*�=*/�=pu>�����@�c*�=m ������u��Y��O�[=��`�}��>��?0L��'c>���=)��<J�=W�i>wE��O'<��؞>Ӷc�8��=����������=�o�k� ���l���7>�E�`�=- ���l�<(j�W3x�Ө�=&�Ծ����~5�PZ_�V4N�`ۜ��_=�:��:B���Ȍ>�{�%����锾ڡ����n��Q@>�8���d���\�a�i>b������$=��>���=)�=��N>k���� �=����ҋ��Ž xo��+z<P�>R��=T|>Z�%�B^��� �>
3��n������*�"�/���B>y�¾W������Y�*>yW1>]T>Y2>�⳾����״�zN�>z\��'�Z�i�t>��2�M��=��=����&��0��a��=XZ=��_���=��>����Iϡ=�\��~d���<?����E=]�0>A-=�Px�S+�=�I/�x_[��s���>�kX<��b=�bս�wǽ���d�>)��������c]>�">�=��p>]!��`�S�l<��,��� >����X^k>����u��&>��>d?�>�m���N � C>���<�g��/���a�F��=+9¼H�����ǻ�=�=�S<>���>� ��VEI=}�ý�$>�\�=|ރ=u�m�2�$=g�$��^�2�@=���=ب�<%Q->�%`��_>���=q���e�о��K=X0e>�����9~�==���>8_��8> �;
�.>� ��Q�=I��=���>ʾ�s��|=�f�=@��<[ֆ=YЃ=�<�j�=���/q=�(R�Pg��Fl.��#�>���>�h�>���<�<>�%�:?)����=�a�>����ʿ�<��-�Vp2�σ�%�P��ɛ=EGl=D�R����=ّ���m=7N�>1r�>��>8P��]I;�(h���Y��N�&�ْd�e��>��[� �C��R)�*��={�7��>ҕ �y��=FY>� ��X\�=�
������ԝ<��1��-�]����i��9e=���=��%���=���=�V�=+cC�tF��B=�p��_�>m5>+xl>A����Ɖ>�w>犽dz�;�ҽd����ac�d/@<J�>��<֭���-!>}3)=�w�>g�<Ms�=�=�>����+�����uq�=����~���ՙ>~�=ENY��d!>��ľV��=~��>��):$�ƾY�=��#=��-=*��no��b���Ia>cQ���0���e =�>�����=V̒��N:>ɦ==i#>���<4�%=(���� ��O���uEh>DyL�IE�,)i�V�<>ܿ��SH5=��K�f="n���>Mf�=c+N�%��=�U��� �>$>R�从�6>�>ʖY=<-?�rç>gױ=Q1��-�J���ؽ�����+>����5��ޅ�>�PW<������>��4L��9&=�s���uQ<��]>��q>�j_=9C=��=�Q3>h�=� >�3�������`�G!����a>��� A�릩<TD�![��'f>�(�>�s_��K`>�Խ�>y=���=gB���>~�վ��y�)#t>�_=���=���:�\u�/��>>���c߮� �>ԁD;�S�>��>ނ?�%]t>\]�=�끾�> ����Y>오�\��=�>��4 <`�>��A�����ۓx;!�����ѽ����֟��W�>�\��`�=Rס=�n\�Z��h�`��?=b��=� ��,>�����x?�4v=�R �?L�/�����*�=�c]����l�བ������>y��>s���_���n>��2<wt>�a)=�h�=]�ü�랽ؼ���p>Q��=���6�<O8>�N�>h m����=pI���ڂ>�r�����=S��������,>sQ�=���>�0�<��<�>5A>tr���h.>x�C>�A�>�=l�S>"�>V�>��>��>M�>��N�M�J>����A�Ľ��l>2K`�����e_�я+>mI���g�<�A�=��н�8�>(""�T��=d�!�ɽV��v�;|������ �u��K�r�
>��[=��v��)�y�������pp=^��� ��<������;��T�[��>ļ4>J�J�Ѐ��gj�>]�= d\=LT�:7�=��T�l��=Խ��&X�<��=�F���?=�||�Yн��<X�>>���=%�v=�
��]�d�h>�=Y\/>��ݼmIM=�O��f65>�)����_�`]������ẽ �C=y&�=7�x� ѝ>/䟽�Q�>+��>�.?=L����p�=;M��I��= �>�n�=�G��ç<����:�>�l���Zv��އ=X�>�5���i��U:N:Χ���\��Dž_=e���ִ��l �bl�>%��;&�f�(Xr�v.�>�< >��f;@�Q=L��:"� >|i�]>5>���X��P��={m˾��Q3>��$��/�����=�o>yj��S� >K��>�\�<scd��D[2>I=�>H��t�5>�rоҿI=��_��8��PX>�����s�<��B���F>dHݼ�:->l�ҽ��>�k!;�N��V=�He�oG���Ú�'p�=0_�>m�E��?�>ڮ>����� >[i+�\V����u�b�|�R��=\���X�¾���=:��=< ǩ�P+�;9F����N>�&�>���<� �= �뻶*>�J=6�r>m����3���&i>OU��9qJ>I��=F��>Kr�;{��>�{��񥼹����^>��9>ϟ
>VÙ>o�s�G�=:=>��ٺ���=�����"ý��>����=T�=� >�5���q>���<'`��vP >�:c���#��|��v�ѽH�~��1���}-=l6B>k%���A����=>7"�}��=��<�P�;�r�vQ�>�&���r>�H��oͽ���O=xp�=Z��>\������>Jy>�%�[`P=��>0���ґ���{u�����B����w�<��?��o>]t(>������9�=۰����v>ք�<��޾������{�ڽ�>nR =�����^ �>h]�g�ͽFw�>�s>꼢�����=��f�b����+=aW��9a>�>C0Ὠ�����N�OF =�=�`cD�G@{�d�/=�i[>;��������~>
6=��F=��Ͻ�޽&I���|�=#j>��s�'�=�>�j�>"]o<F�Q�E��8��>!f>5��>h�N�m! �\�����E���
��>2?�K�#̣��8�>��x>F����;����̋�80_>W�?�P�Q>�&�9s�=��>���=��2��N�='@��?Y��ѽ9�T�%����V�y|>e�^���8>(r�;SN��v���]>U��>�ף=
�O��D��_������>���=�g>To5��;w������;���> ��Ip>�2�=Ҁ���#�ܷ�� ���>>��7-�=��߾R(�=��1=�]���Q>(�k��\\�# O�R��=Fr�>�Ѹ�.uV��*���'!>�:<>�ȏ�;��=dQC>B!:�� ̾*>/Fe>͔�WC���>�F���0Y>q[>��>AsS>A�w�
�S�%��<n{��&8Ž���<٫,>j���>�� >��������x�IE==�L�>I�ٽ�u9>3ba>Hï��z���:>`��>������9>��0�|� �ߙļ��X>��U<����g>=��=#]���]��� �.�^=Z���|�>P��=��V��D�����=�.@>.�J=-�5���ͽ5� >����;K}=� ��%�ܾTĒ>���=I5����>u\�:���7�E>��~��h��p� ���2<�-l>�s����>r���� >����b^�H[ =5�a��:E�d>&>�%F� ���L{����>�GQ���X>�Ex����$��=�q�<���>�����
>�`[�.��=�0=��>Y3��ͱ���+�P�=(���8K�;מ�F��>Ƅ=�.��g� �q��� 0��"����+>��G��=�],�,�O<�8 >y�����y��>�p�<.D>.��>�~>���W0��ά`=��9>+�����^h���u>}���=���=j%���ν� <&��Fi�=���������o�>�l(����=��>^�b�k48>��A�9�t�T(�~Z��(s��ýV3d={=
�F��o�=�"*�*
�>�l>�٪��뻾)*�9B�=>V>CU�=���<���=?�p=��>ʵ������K��� <xp=C�=����_��;!��<�5�=x�\>����ʭ�!��<g�7>�#㻟�">���<��>�-oC>�F�[�=X'<=�0=M��<�� �����/ؽGʻ>�CK>v���;H���>껌2&�c�3>sř��0�=�'����.�Z� >n �S�Z>O�\>���> #��`;X�b�-����7i�R5�� %�����> �=�:�>�>�r����="vؼUc0��hw�!e��&`�=lq�>�-�>>W���5�=���`K>���=��=�1u����Je�=��5=sm½�.ν�M�<�Y>���=��>zUw=P%O��'���t7��=�{��=w\�=6e�<��������(����=�5r�%�����=_����������D0���WDQ>�rc>�8��RǼ>a��>�w=�x3=p���B��i� ��=KF�!> 3�>V�=:t�=�5"�u��h�������<^>���=��콹�R>f}�>��>%ճ��ϼz�=4� �N�(��[>��=�q�I�����)Q�C�>fV��F¾Q}>2(��&齲q޾ `C�J��>a�e=Qi.�-��<Ԛ���߽� �=@;���}�<q0K>ǃ���� >㿴>
��IV�>A�K�����u!��X>'��c�O�b��a�>C�<��"������߼�wr>چ�=�Y5>�?��I�����h�=(&���
�T�>��n>Ip�> o�=�k=������=�f�<�C>��f���V=���>}�=K�m>f�!>6r��D�ýNf�>u��>��<��_��‰�b�%>�Ķ�wpm����>��F>o�Z>�˽Lz��'l{;D��;��s=�C��l� >1�>!N�>z>9/���>�jp���]=�e��DL;-S<� �<E->�}�=�p�����>�J9>�l��gq><˽��Sk�&z�=m&���~�,}�<�]�<�M�>�H?��~��6����ξ�DȽ�e������n�=h��>����#C�[� ������E��v�3�Lۍ<sd�>�<a��޽=��>G�F>�O�>����ゥ4���]<=X9��ьU���K<)��=
��O5���v!=##.�/"�=Z�=��h�wE��Ǩ�Z*�ۘ=�$ =k�F>�r>a �> .��O��<����+B꽠C�=�=#>��`8_>#ȑ�]�5<'�>�aG=���>M�=
�����v= w�����>-(��l��>�x�0�C<#vP���>mf���r$>3ľJ>�t� 8ɾrPy�m������<���<dL%>V��⥉�Z`>�Y��9R��Ұ�j�޽���A�T����2���'M��̾�显���>�J>h� =��=S3>ۺt���=Y���t��j�,<>O��᧼ �@���Y������=�ܩ�� >-� ?�����R:L&ȼ�������'��!�=� ־��D��0���]�.�Q����(�=J�<e >@t{�u����^>P"�<��`� J>� �=�:�=��E>��ǽ�^����>��">�K>6f�=�%R�F�c��%Ҽ,��><�>\
"�i>>B�=]d�� ��>����~�>'%�Y��<�ा罉p>�ƻ��B���4��8��������Q>Bv�<��&=t0�Ǣ<��Wi�>ݴ8� ���u>��Y�} Խ�Wս+G��M�>��󙀼GQ�=�:�=����̉���<�Dv=W��>]�>ɏӾӘ>��������� ��=~8$=m�>
o��<ז����>�r�=�h�=�����ϓ>��H>5�<��0>VG�> 줽Ķ�≮>���U��=�%�{���S�>�y�>4�1>El�=���>�D=�M>�[������84�v�T��V=v�O�I��� o��� <��+�c����<�j��,�� �<E"_<���>�3>�5���.e����z3{> T4>2��2����r>~H�>�D>'$�=-�>�h�=B)���@�>N{U�NQ>p5L� Ň>Jv�� O>�D��ɾ;�.>�P:�h�f=({z���=n����=Bc=\3���=Q�t>$A>
���;��\�m��|�<ֵ#���<�|@�ML���_%��F������ӏ�>Z�нp���,�m�a��=W�;�:$=5P�<���<u�e;ٔ�<�E��y��=+7J>�����r>�>�=j��5����w6<W���C�:�ER�N�=�#4>�~��+@+>�B=毩����D��=����a�*�=�(�=$�ֵ��h��>o�P�T=�>��p�m33>.��vm7>
�3���8=�� >���>Q|�=89������z�>~��=l>*�����!<������d>;�T>��e=��ֽ^!��!-=r�)>�V��0v�=0S:� Y<�Hk>��'>^��>,��=YR<�ݔ>���>�5>̂E��bz��j��*��B-network_body.linear_encoder.seq_layers.2.biasJ�*����B/network_body.linear_encoder.seq_layers.2.weightJ��f��=��ʽY�<-��T"<��=��ܽ͵]�O(>�cA�s�z��S�>U�%>'���B��*��;��1��I��>�8>�O��f>���=��==i�=�����=/��� �e<R�!>s�߻[Q�E�5��x>9,�'>v��<�>,Y�>ȐE�G�ռ�>jW�=��w=;3��Ϣ=���=S���5��=�Bc����<n ���qK>S�� Z̻�ç������7:>��+;�s��h�=�W>k��">�M=B�t�v)��㽥��;0<�U*���=� �<�(��|[=4a���>w2�>̽����<����Ϧ�=_��=��y�k��=|q�=j���pd�=�j�>EP=y������-��h�=��-��0@=��=x��<L�� .�<��>@e����=|"!� ꔽ�C8>�v��!>��M� >��O�a �=�b�=ipP�Oހ=04 >�H�=6��<�K@>e`g=���:i���Rݽ�o��_��� �= V��=�t� b<A�=;�=����
��uM�c/C��H���P�<=����K���<2c;>t���jB�=��^=�U�����0G��^=5��<gvK>���<��+>qΰ�[�0=T֓�� ���<�M=�a_>()!�%<�>�`�Ģ<>XM=������=M�>�e�=�,�;��=�벽Kݤ=|������-�=AҴ��RD�1f >�j�;��;��5�=b��}����G�=e�=��K����;�r۽�a���1�=0���a�t=��J>:sͽin��#r�=$��=�^����7=��F<w�>=�S���}=}bh=$�<��>�9>5̠=�8W�ݫ����-�z@�>Eb����=0U>}.����>��]����==��>-j�e�u�]O[�j�=��><I>�.��O���]���A6>l�Y��Q>}���hC�=���>�~�=�T>�k�=9;=���=m��U�=ģ�>�H=߬�=Po��I<��~�ۮ��C,<�\ľC�6>������
/j>
6>�d<ٸ�=q�<�:>^�'�D!Ǽo'G��$��=NG=�V� �=�e6����=0z==^��<'��*��=F�>^���]���"�&�[Lڼ�_һ`w��� �=�P���0�ri��������_=#� ���g���j>�Oνȸ >�/�>5�J=C�����<��>U(���:~=���=B3��;4� a=: �>���;�>����t��Me�>��=�d��rBS�]�[��L��|l@>Vz����=�i�<�m��D����Dq���𚼹T��c�N������TI=)M�z����t�<��c��d�=�1v=�ܽ��=����Ѻ7�5݁���G�b��=?9���^��$�y�Db���8I�|c�=�A��yY=Gm>S#��q]N�eB�=��
>�45>��-�u�<�7|>v�=j���⃾�\:>z1��xv��"��U��=���=Y#�=�?��BMD>!񱽜�=��S�c�����
e�{� ��'���f��\�>�8E>��-R=r>����� = �[��d��U��� ����v<5%A=� =���=\'������[>�/���m�;Bn>:˽<ҽԽ�a>�3U>;b��]y=2ʐ>�J/>-޿=��A<ϊ,��[=�>>>���5F̼ފ����=G�_=%+���>�>�'�=��=��I�9g>��=3mg=��&�n��;t� ��Fg�H�����>��>[�=�٠��ud�����c0��� >�,��0��=C���wh<Y��=�ki�Q�/>
Ue���U�o�A>���=O�7</Sܽ�b�<�UP�٬ʽ��� &�����=�>�w�=*�>��o�i+�=v��=���=�y�=sP��d���r�E��=R۽�=^�������9M<��׽Bo>�,E>��<�P>���=o�=+�|=��X��<wx�<�>�=U$>k�J>I96���&��ؐ= ���v��r���x���N>�u&>��M=i "=�������A$ >":��&��g&y<�!���=�a�>"����� �t=_� >��~�ؽ�k�=��<���=�f��=^Y ��,��?M�]���{ >ܘ��X>�׽�t>�ET=°�=��=�#h�AP����=����mWv��N�=}�=��>t�ǽ����6�G=�$=���,D��Fc/�1�K��Y��K�=uNF>�k�=����Ӷν+�V�P�•=d�<k �r��<�#��*���fK>soD>��2�G�=m� ���;���=���<���B������=������
�r����&=/�>>r��:W ��" �<�u�>��z>�R)>�F#�]w>��1���c>pg��I�=لĽ�j���B��5�=�a�䊟�)��=�Q����ʾ���a�<�� <�@���V��8u��} 8>Ⱦ�=D�%�&���>?��<��=���?n��� />�FO��$��UV �}����ݷ=�����d������=�邾
�2���?>�� ��)����J<��=��}>�#��&>��� ���8��=콜��%Ž�� ����<�>�I�F>�v�C�D>NO�><>����%��6�;�D$>�� �L��hVF����=�J��)QQ=2/(>la����i�ެ�=!�:֬ҽŭ�=g��ی���Q8>6R>�#����'=�k�—]>�Q>X�Ƚ��=����/�<>��=oU�qb�;I�����;�-=��Q��j:���
7���$��=j�7����=���<hh���$>�����4��3C��}$x=r�=�����`@<��ͽ�8>} �=
ε�J\��5������=�,R��=�=@��^�"�IlI�/�ͽp��m���,�s=K[ =?��;.w>h�|���뼊��=o�/�g �:ma9���>>sr�=�p�<=瀽�x=�ͧ>�=�;�g��=��=���=� �~���#�R>p0�>.���d�;V�=y-&����= L�v��%,=��ܽ�u�=R��<_ƽ����x�<��=8�8>Ez�;#5T���q�����ނ�:�����O y=/���>>JV����=>G>��=�-x<����Lg�=����9�;E�A� <��"=��Ͻ9�<���=�LD���&���D>�u>�e�=E�*=��޼��a�����o�㙱��G�=��7�K3Y=�gY�,�'> ��=���<����!�x�]-��r<[(>��U>�)O>�`�>�$�=�~>�F'�#u���D}>KT��Y�<8�f�l�&>u>��\�'=�q����=f��=)%��f����0��K�v>䕖<�Ί= ?�<���=H���/������&:ٽp��<�����D��k����x2;>^�[��<�SU>l����=�?C>*��=��a>'�'><�F�/�=���=p�;Pt{���=�5 =�����=b��=���=��E=+%�<wс<�S�=LT>�0�=��<� ��9� ����=w?���,�=r6�=�O�=�:�� �/=#\p=TG��ö���y>7;�zA3>�'^���@kJ���i�"Ӥ����=�'�<�m����k>mi^����=�j;<�Xz�O�=�����O=��V��!.<��x;:�)>�>Rt;>������]��<:�+>�ӕ<���=�f��a���-1= ����/e>����th^��B��D����-;�h����������+=^X�=)
�y�=K�������։>A��>� >��h��w�-2>���򥉽���=�̺<�a6���=������X���5�������>�B�/l�=�;����>��6<�*;����M>��G<�6$�������<�D�7���c�S�%�>ˤ �Α�=��D�T��<��9�(�ҽU��=R�~���=Tb3�oʌ�2
Q=�G�<H��:*��=�e<q�
4����= � ��K��0�=Y}�; >l��=��Ͻ�1��>>�����E�!��d_=�Ǝ�yȨ�^P���l<>^K�=�>��=8<c��=^�������d� �;�&缝�4�Ʃ>gn���ȱ=Y�<�����0�n��vO(�m$�=��Ժ���=0百c���'�!>�iλz��>�l>D���'L��D>�?D>� <������?�p�<7����5ὁ�m>sm7=C(1�lm��UH<�Q�<�cg�CI&>"�A����a����i�.n�N�W�/!k=�5��C� �G�h>Q�c���G��d�+��=;v�=�߂=��������t�=��{>y/}�����-���;�=Iro���4<�䜽�R�� �%�� =&9�= ?�=��Ƚ�3S��ؼ_�����>��&�.$ѽ�R��Ouv= ,��Gj�=�'���F� ޤ��>�=�Y#>��X>�!�QNνCB>��<��|<��w=kQ���o=�)E=hA>�=�ޘ<�vy���O=<��=7�ŽuB
<g�������#g�=aJ�<�=n�H> ��Ve����:=��HK7>p)>����f>��!��1= ה<@��Ԃ[<�ُ����g�����;\�p�x��ҵ=�X>��>�To�g׉<ZC���w��� =�'�;*� p��J ���?���ۼ�&���>CL���O���>�7��3ҽ�I�=݄>ұT�53��i�=�I�<��K�N=��o=�����J>E�<�,��=[���༕TY�b��=��=�����m>&��h�����,>k�-�A�=�Ǖ�������=_m >��%�}~I>�腽�=�^E�Cb�=�#8>N�ܼԊ=�ɽR�B��ꚽ嚛�:鼬��=�����=�)>�����ki�TQ��5JJ����=����r �=���> ����A�?�/=Wl=���=�K��^π<9<G�'��5=V�1>` ���s��pĽ��,>�ai���%>iXA���R��R>���+%�<�H���Z��T=�5�=vB���|�>F;Z=d�r=��;=��H��|n><5*�ԍ�=�ӯ<�k�=��3�<�������=;�> )}>�%==�P<>��+=ګ�<��̽�E<lE��34N>� 潦}7��V[��������㳝���;�� ��x��$d>��= x �
Ƚ�S{=2�F=�ڴ=�+�r�i=����$Q=�>���V =� 6��s�=� =��<���<)�=ñ=����>�_=:��O޿=�_P�������r����>� >���=�O
����;ח�;�O �����(k�=�
ڼi�?>���=�=��� � ���W�
�p >��{���(�<O �5c�[�����d=u4 �<S�v��=nd��RM>.�Z={2�=XFн�0����1;-u >��)���m�[�'�u<}2���|�J!b>A���m�x��$8=�E����t=����)y=8Bw=�=��ގ����=��=�I{=0~��P�<N��=’T�� p�9��=�V >�1E>KW6��|= $�=��=��e=�Y��䭼 �>�"V<��뼊��~
o�p׿= �P�A9�����͕�=v#E>��{=_�|i��L�0<`�6��->^�+�=r;�=�X�<|��=d#>TA��@�o<��8=����;ɽ��n�SOB�d�S�i�3=W�a��(�=�H������+^G>��=�,�<��.=6m5=���=^�=3��<����cEq��=��ɼ��i�`T'=GDl>BG�7D��9>v޽�ѽ%��=�� <A��=,�Ž Q �A�=R���N�޽� W=�9>&�7�$�>N,>b�>r�>��ǽ��-�p�)=U�+>~Oi�����7r߽锻��������<U�������-2��⡽���=8(=
�;<z ���=�:.<h[8=�)�' �8 ���ъ���g=��>�[�=;�=�:l��>�=0��<8<>��i=�o�=�
>|1��`�=o'A��D=�u1�/�ȼA��=�@�=(޹�o�:;�ɽ��=<��C���ʽq��;���=�ǒ=R�=,�Ƚ����|߭���V��B�=N��<�J���H>8*=5E��/�>����$��W��ɻA�=Tx4�C\�]tB�?�;l��=�h���5�=D��=�m������ig�� >����[����b��T�r�=�_��4��<�=T<5g�����Dt>��!> ���
��<�=t>�vJ>��+�3�H=���T��� H>z>��#��U� =3o=
��������&>�v1�G�����=u=�w���.�=�8p�ُ��I�=)���\>� �=\���R��]E<t�<>��B�D�����(=8��=$礽H�=����|�l>Ϩ�=lc
����=[��0�7>R��Z��<|o�L��=��@>e��=�v=�RO�"{�=���=r��=l
$���5��y�= i��8���j_����*Xp���=p����"��/=�k0�w��\��=���=,�q:^N= o��l�=������Ƚ��#���<l��=G4@��_s�7�����o=�;U�=��S�T%�<�f <s�@>���=i��6S��=>���=���$�I>��;H<�=U��kz96����=�^� ��=����=�
�=�w�;a�Z�$�P�my>ϛ�e��=�V�=!�ż� p�� a>��<����>�`�=�I�\��=`Oz=�)X�t��=V+>7I�<[��e��<��=.7:=d�=HF�7W��r~���v�9 �x�%����=k�ż��<q��9[�#<��<�W�=&h6=�>'�6���9мo�ؽ9��+>x��=�-=|a�<��"������� =��E����Z �<t�K� 4>��;=)O�kWa��Ν=O�=z�>>|C����<��G=T2;d�$�LҘ��OϽ�<s��� `'����=6�x=����'[�K' =4zx��m�<L�ɽsL�=��>��=�>d���;I:=�O�`��<�� =�u�����=Ls�<+0e��z<��3��†:q���r�=±��W��;�)ؽ�v,���=��<a�=*55���o������ ��$� ��>,��<v�>��&�#Z3>T��J�������h�=�f=R���l j�FCz�q1O>���=
x ��>g~��`,d�0��W="P+=|VὰE�;^fJ��,F> �ʼ��o>�GA>lҽgl�������1�17̼;��=�O�=�͎��g!=p��� ��=2g��� ��ͺ��r>՜@�$ǽk��=(=��(��|I����=�d�<�Az>h�E>�>���<�AɽkE>�fy�A#��tu=rC�=�=7ɽ�[�b�=�|�=��T��e(�=y���`V��'�^�ǽa"��!ϔ;�'@>���ϟ_=U{�=��!>r[�>:燼CM�=�eW=�ʯ�z+ ��� >�(�= �'����B�ɽ[�o>ˊ��׬c=�� �$��<:��E�D=�s�=d>�� >��<�%4���( =~�� 4<8݉=�1->G��K�=l���Ðe�-��=C.�=
��S��=XB>C�|>#�c=!��<ػ�9;=h���#����s>�v��R�>r ��(w�bb�<��]>ߝ�=ਉ='�=�P���8��Խ4 �=�>���#>�J�(}���>��=���<E쾽�da�O���[�<��X>��������%�S<��/>�\��Y*>I����3>LP�=���Q�T:�l1<�
���T=�Z>eq����=x� ��A@�*>7��Wn�Ul�c.w=�§��P��NٽEYýn���A�g��
���+��G��PՈ=զ��c!�=��L�l���e�����q� F�,Z�zٱ<X��<ًʽ2ﭽ�P��=d���]ս�<�� ��믽�a"���=�؎=�΀=-> ������&> ��=��~<b��=�V%���%>�m��ԙw��CM������F$>�P�=Je�<�wN<j�>+Л<�����=�w� �#!-������N��=��8=}�=,F�O���MvM>���=�Q�eP==@�|�>�Wս^�=���n�:>��B�0$�=�(��徽E"��䓟����=�� �]�מS<nQ���g��߱8�[D ���&=��%>�t��sd=��M�pdL����=���=cV�=��D;^�н_��=� f<u�=�i >��<�S�=1���TBY�C٭��-U>�w��i� �g��?��=M�R�~_��[��I+��"t�/f4=H��� >򱥽��6��Kb= �>��R���G>�0A>��=�2�6љ� �>��ֻ��¼Sm�>F?��$��=��$> >��>{������C=�=�
t�_�7�7��=�(�ulս5L�=�+Ǽ�y���>�=�E��N���3�=�ׁ>�\��8��<�$,>ة�<<��>v:>ԫ>�L>�0��+�*�E��=�f�=7c����0I8=.ŝ��Q�=2�������(>�;�=��U>�T�=���=�hV�L{�=�Nh=�RL�"���"���=��v<c=� 8�S^�w���`=���xG���>Ӕ�<��D>���=�a �Dz�0f�=���=�w&=��1<������rz��S �OK ��W"�͟>�c���%���~����Ƞ<=*QS� "�����Ʌѽi���'�8>l�?<*a�Ӿ=0�1>� ��?�=Ie��ּ��û��@>��������I=>��8��|�>2�(�ˑ=��V<>��������&>읭���6���0>,���躒���T�6��=4 ���a>L���� �=��=j�P=4� >W�>S�=ZLY=��=
��=�~߷} �Yc�qm�9�W���{��nMC=v���c����!�=�� >7q�=ؚ�=�ۡ=���=m�%>�(:�Ъ���L4>`V=�7ݻ-�=EmB���;�l�-߀<(�<�$S=Tji��7��>=�3���G� ��=6h���� ��Z.��R��g��=���>;z��P�1<��>,��9�=�;1>"�=$���+�L>�B��ɯ�5���+=�q�=5��S`��}<�Ͻ�:ν�:�]V_=�/T=Ş>J
�� 6>�E>�#A�~yH>"��J��=�Eq>��{�������=�|;<~���E߮�UN;�tV=T:>�hu�,>!g=�:��+H=�)�0i
>��>Ȫ����=���0 d�a~�<ێ��l�d�Il�=DU%>5�=+�g��<V����=�=��7���8=6v��#ʁ=��H��k�<��\� �+��ә��}��*0>%�G=���=�� ���z=}�=����&�ǽ�4�<�扽�p��b�;J����&Ƚ\#��X�c��x�Y=O8N��#���-�<�L��K�թ�>c!>DF�=&`=D��me>[����{ �o"�� ��Z�;�ȡ�t�P�*��>3����l4>1=�0;->?��^�Xb�����>�7��ڥ�:ý�T�=
^�<�����T �=�b��yA伮�+��+?��^���=�3��&!���<��<�c�=�O�H���6Z/��*:=H��;a?ػ�@���̽�g޽��D��O#�r䘽��=��#�����u=@�"�:���c׼��W=E;s��L=v]m> �s�.8_>��=��=�QE>u��<��=E �=l-t=8�۽� �=�.8>��j����=_漿�L; �)����=V�>d�s
>�:@�h�F=Z݃>���=��<Nj=Җ=)]a�L���;�> � �\[H��<>���Qf>Z�>���;���!ؽ�i�=�ѽ�Pܼ���O�8>�%'�������"=��)�1f=��
>���=�V�=wh�=��{;6gн�b�<ȟ�=S�F��'>s�=��V>�7�>�B�=�j>yRT=�2�=�$���٘>��r�������0Y׼l�f<��N��<�.�<4c�N
-=�g�=��f���>�=��g�=K�6�K����?=)h�=���=a�5���> M(>S7O��։=��E<FE=q�\<$)����`=;s����4���N=�->��s=w�׽���=ll�
�ϼ�;3>i\@=BHL��y��H����>V
���&>��.=}��R��"^����L�-�ּ���̓�(H׽��Y�i��>�����i����=��=��7>��Z=����= ��f0P�����TL �M��=u;�Ͻ�2�<ޖ�=��n�.��=�S�柱����=��^=P����9A>�u��@��z� > a%���v>F:->�~6�Q��=� ν�������=5^>���*q�=$�����=��Q>�����Խr�=�ن�:L�=���=Kݪ=Xꟽ��(>�fŽ7��=�e��\�=#+s>���=0:�Vl=��>��(><�K>���������a��=����O=:I>�WJ�ʂ�v��=4�\>l@(>غ=�p��7 �=M�<�A̽�� ��<>H<-=��=�]�=�}�:�]��A�=ԛϽȪ���Bl>0V��o�=n��߯ۼ *7=ƹ�=Љi=���= a_� s\>Z�9>��=^�>K#��k&>Y�_=cg���ȼ˲�=o����a �;�� =P���Xp$=��=��/��7��L���b=����>�i��0��#�z= ��ݱ<�-�=D∾p|�<��ξẼ�>�>�;Y��c��}6���=}�<����!��=* ��=�����=U��=�ܻ�ҡ1�˕����=���4>��=g���~�,�� |򼌸��;�����>���gK�J0��5aW>��,��ּ=��>3�<bѻ���=�M2=�& ��T=a��<��2�N^�� =�>�8E>9�ӽ�i ����=�q��⫽����sP�W��8�1#>X[�<F�=�=>���=A0ʽ�>��k�.��<�0=������=>[/�S�:=�9r����n=��c>�2� vg��S�<�n��mB=���=餕=����G�X���Ľv��<Ss�Es佥6�>~񐼸%>:�d�KrĽk��<8*�=���>�lJ�޶i=)2/>�)���ì=A��>!�j�j���9���K{�=������=�;�=Y�'>ٰ7=�����`���׼��E<�u>�QE>��Ƚ��#�b���Wu-=@>��>yc�<n^�=��k� 4^<_�C>ɲ���y=�󸽦Ȣ��.Q�s��=�89�%(�=E� �H�ɽ��>H�2��ý�����;>!'z�f �=��)=D3�;:KŻ�k>��;=��Խ��>�|>��7������<��Y���X��VĽ��~����=��A>�|W��G>E�=����*��^��T�=
}�=of =��=�&�����=�E�=H������,�=��=����Q¤�TO+�9u}<����-S>k�=�Ғ>:�m=,Ѽ�_���|��0R�d\�=L$�=(� >B��� <�4>��>h)�=D���@3->�Lu=� ��#Y�=���>��)�e��<��ڽ�=lU>A�0=�T����v>��>�B=�T��C�� ��ɑD=�=�ɭ=W(4��f�����ǣ&>2���4ó=��m=�#A<a=� �
څ�|1i={Nn<����� ���>��󞲽���no����=��4>����m\��Ǡ���w=_����'=��=�� �rI>�;A=���=TQ>t�Խik>>�4A=�_�=r=�O����>V�=f�>�O���+>z��=n?L>缂=���;]>�q��O�'�<����[9��ﻍ<�~6�����C>m�����C>y��z����_�܁:>(B�=x�+��0���=� ֽ�ƫ��U>��+���<�能���=�?>$A�>�G>��>�x=�1нz D���w�-E>���<y�~=Y�$=�����p������P>�e�x=��=�@z<��=���F��< d<t�ٽ��?���7;?ǐ��c��h���?�/�z**�Y4��4�R>N>b8������'=r�n=xm)>�j�>�M��;�z�w>��=�
�=��=@�R=O�2>�Y���Լ�p>��W>�}�=��ɽ.)���;�����1���d5����=�73���4��p�<�?�=+���>v�C��=�����>�}6�O�k4��$>���
�H���Ӽ$�B���&<=�t��W���6X����(=��>4���֤����=���<��<j��>i<k�V��=�#�<7H�:\=��=<�h>��(��[��X�r�_�#>\�~�FU=��)��QU>*��=@���]B����=)�=65��:g���>@���ćD=�=k�M����=�ȼ���=?b=_Q���?�y�g��ݛ=_r>.�E�*В�dg+=ټ��N=�����y`���=J�n� ꈽA��� W��T���zq=[4�;R3>�a�ۍ����P��S��6t2�����%�=QR�=$�#>d2��9>�f4�7�=�5��t�)>#�:�Eн?�>A��; N�=> �=CbT�xAh�iX >�i�>5�<��.�=����3�>r% ����=t� >C��=�R���7=����/>�ʜ��ɳ�L��=k�>�q)� ?!��CV=�9>`]�=U���,g�= �>Ϙ>�,~�e� �&�C>q��U'����@=R���x�UY9< <�O��I3-�t/m�/{���s=�E�;�8��������� ��j�=�$�=�u>����`�G=��=҄��L=�룽&��!��V���=���=Li߽!�,��r�=�T>u����>#u�=���=���=�P��-H��
�*��;� �=xD���ɽ.�7>�LU>C�ƽ�:��]��g�� �������M �<.ϔ��t*<u��=�r���-��\�<�ي�)� >x��K�=>�8����G��ⲽ�%=i�=2j�C[f�~R=k,�<ު >nT߼Ϫ�=Ȼ�=���=WC�:Qu��ݼ=0���3Cʽ�1۽�S��Ž�㼛̚�#A��I1����=-�L� ��=��~=�W��EF���ֽ����ǿ=�M ��r3� _;=OB�<�X@=k҉�$2�<�Y��8;Ͻ]6�=��=�� ��G�=Ů=_ô�EV&>� �3L���d<Z�<�ŽfO=0�<� ��1�<��֝���I��S2>XU�ygu��D@>p��='�^��K=T0K��O>%�w����䡂����m^"���=�F���<�54�p�=�)��Z/�+�=N��=�7�1��=�9�>ʁ+�
X�=TcA�5=��8�=��=dA
�o^��H7�=t�z<���%ʯ���!��=d�� d+=5m&�P�>��F��]����=�t�<'��=�e�8�=��T>j3>�p����M>�2Q�j��=ְq=o[<��������=�D\>�dC>��3=��ջK@5=t�r==0�- �=)y��Qٝ=QV�=�[��~�=����s�*��j0�^��=�)�������=Q8�����J��=��)���c�"C�<p�=n�V�w��\���5>.�=�⣽VT�=���=�N��(#��W>8��m�ۡ=!��v�1������e���o�DR�=�~Ǽ4�e=�S���z;)>��y==��x�=��潆������PԼ\2@�n��=���93���3=>0��Ȣ]���<*� >�;6�����R�<�K^={�C����ē�=��=��{={N�=f�>{�_��S��C'�=�%н�Xd<���T�=�#��h��=g�=F8�=�S���ȷ�+��=& �=�ɼ�UY=�U��x=��[��}ݽڦ>ʫ��%���8>���طֽ�&>O��= �������&�0�Y��)>8�r><$½…=��>}�>:�0I�=s>�m_�(I��5���9� ht>}�>�b��bN�=|6<��y=��>��l�����Ȏ;����yD<{����B��
b�~�U���Ľ���<V�O���彣�>��3=c���hg��w�����1=��>����v�<���uQ�<�����oR:��>>�����M��: ;��C>K�ό� �w��y&E>p`�=Oή��޼e��=cg��>��!�=�`7=�Q#����O�>?X���=�@��̴�=]��'q4��k<�� ��$>�c�m��<��r=v�>*�N>�nJ=d='���c=������=�LS��E��c+5<��;Fi�<ۨ�=hn�= ?*�=�5���>���a����9��V$��;�M=�`M����=�=�+>�н����k��=Fa�> |-�Ce�=E1p:hV���>2�=vX=�G
=�Ė�h~'���ܽn|>&l�:sx_�{N����:=���<q)E=o�����=��>��$=f�.=�2���o��o�=�f�=�E="C�=r ���;��7>�o�0����=�>0>A=h��=nؼ�e%��'v<���FG���ݘ�9���Al�0�ͽ<�>�4'�z��iG��CQ>+�ٽM5=�)���)>�⪽n(�>��<X�3>jIW�,ǟ=U�#=L=̼(u�<4&>N��=kJ
�e%;>e>;>&p�<��=��=k\D�o�X=S@��ċ=[�:��,>�E �+G�=����7$7=�\�<�"�W���K>�懽�s�=��|����<��>��w�B~�<۾��u��>��=��8����Ty>h��=y��=s�L>�6<=��N>x�޽�U��(G��#k� ���n��^�ƽ�>��<�6�"���d:>Oa>>�S>��<���=C�>\�==���>�$8<!�t=Q��K�=� ���q���;��4����;կ=_B�=
���z��~Gּ���>1�<��ν��)��R�;k>�:�`>#K��H��>���=
֗=��]�5UU�o*�=���=���=����C9��9�=�g����)���;~�=\`<>�e�=9�>ݚ�<�e��M�=7;>( ]�e��>Z���LjJ�4�==�;q� �>[��=�>�%5�<���<DW}��?���" >“�=��~>��ӽ�>@-��C+*=��ͽ�9=4ֽ� �>�f��w4���Q=��h�5>� �[]�M�6�����N����4������^�����<����|��g���8��r�V�!zϺlIt��E��� �=z�N>�����2�=8<���8>��̽鳼�{x��'�<��L=l^�:$��<n�����< N���3���I= �J!=>ym=��6>"=h�>��݄���=�Ϧ�S��=󾎼�S
���=L��>��E󐼄5��G�=�<�<��<��A�f#=�/=L��-�3=x��=*��=K�C��&����~�T�B4˽��=��\>?�Ѽd\>��@<P���D��㵽w���o�>��@�]݉>�Z>��W���&>����-�>h� =[�^����= �{��1>��=�I�?�<��,>;=8��):>�6�v�޽ɚ�=�����9�f��9 ���7>�h��qU�=��L>�[�;��=Q��3%>Nz��G3��h>�:���-:��`)>�օ�cd0��V�=Ť�=�΅=��+> D��L�=N�_>3 �=���=��M=����wX�*��=�ռܴ��)!�u������<w�">c� >O`L<��*:��%>װ[>6(j>�|�<nAz=�]�<z���� ���=����k��(:>�L��z`=D�ؽzʒ����`�f�+��;�l��a.J���;��|���!�=@���,G<�H=�#*>FT�s0���dF<��=(a�@X5�����ӽ:�]�=�
� X?���2� Ǜ=?34�<>t�=�;�C��(����*&�����+:ս���;T��=>����p0�:���Se�=G ߼_��;Z3�>��{=)ֽV��<=��>(6�>7��=�b�=C��=@>Ş�=�M�֊;>�Q�[���=t�;<�à�v��� �޻��Ͻ�� >!(>��>�1=œf���O�k�T��=��H>�= ��"8�}����bD>�7P<��>��u9��!ý�"�=-��� ��Ak=��P���<���=&Ҙ�F
��(���J��13>b�J�� ���6><�O�'�F>��|>*�z��7�ZЭ;���=F0>�����߼�d=\T��А�����9@=�6ݽܵ��6X���n��}Lp�g����|�=����� T�=���>��=�E�����S��V=�ݻ��C��a��?�?�ƺ��}��๼p�R>�W=���`H9�1ζ=�v�23�=�O����;��L�=Hu���^�=U7�=t�B����qj��ʽ/���:�
�E��
]�<��ɽ���+�����=V���7�=kp4����G�н"�<� ;����� ��`Ǽ �<_qm��^�=�<����>Ko�����;�Nm�^������<<�X>��*>�.�=�$�=�����?>=�>�; =���
��ZȻ�.��g'>X���NG>:ׯ=�+ۼ]�> ����^�=��]=����)�&��X��X���,@=��S��*��O,=�|��>�&�<2Ώ�^���wk ��#��Vw�<�̊� �;��P���>� <��'�=Z�>5�l=��m=�>B=p�I>%�Ͻ�
>p|�<���;���=�^!>"�Y�'V>I ���yO��B�����<粽�_p��ۋ>)�j��0�����<wy��$c>o6�<�!B�TM��N���6����>�o۽=��>�� ��vh=��*>�aP��a�;��;�� �=��>���=1�K����=j����:x=K�N>���<��h=إ��,��=9p@�8��=2�ɽT�=����� �<i��>�ѱ=��C��RJ>�5�<ꎔ<�
��+�>��r>�=}=�L5=bD�<2T���/<���=D����&�U.����e�=�dƽ� [>/�>I��<�>i���==]���K�®�= �y=������&�DD�<UM>�Z��ˤ�� SC�J$F>Fd�=��ǽ��]��Ƚ��!�5�>o��<��Z��<��=�vL<���˂>�&���ؽI��;�Y�K�<��2���y���> �5��2�v��=Wf<=[�.�n<��l_�=/�n>�]ۼ`抾���e8ǽP�����q>��8�y\���6<({8��c����ー���;z�A�0>�թ>!%>pC�>y�l=��/=@B)�}�&>��c={ػ<���=��n>pZ*�9(9>n�/�D��c������=Ei>���< A��3��=�|�<��Q��8�= �]���d=�2���Ј>Ӫ%=}D�=Ѻ;�="�D��=�1�=��==x��u!�4� �텕=�G"�5�x���ܳ�>TI>�� �:�����>�������/>�]�>�_P��)B�/�R�>rH$>�j=# /��4�=2��������H�Vx>�F��B�<�ֽᮀ>�"�/n�aݜ�'�=[���e
>
�G->�`�==��=b�<]
�^A>S�0�Q��m�����;=^���_ �=wX�� �>����u������y�?��{�X=�2ļL�~��_?=P���r���r*W>=;Z=��l=�d�<��==�u<=a���%������=͗.��6v=�� =�"I��Y:�x��=?�b=B�(;< #���;��>0}���ٽա�����@��a@=��2E=F�D��@�����;� >�!�=��ԽZF�<}ý��D�N��=�u��8>��Y�*��=�{�=�c��r!��j��v~W�@V=U��<<O >L3��g�=��O>;�G��4�=t~�<�u��O���,��!j���ɹ�ȃǻ`���g���&�3�������<�<�<��0>���;��g;ygE��н&;Ƚie8�KGF�$��o�>�u���`��&��� �b��u<(�>�9�.�>I㵽Ag�v6="��|�����>�h޽� �Cwҽ4E�<�>�15���>7$�=0�U�t �=wR��Ƈ;έ4=�RX=)]8>y��;�-�6؈��)�,l���/>�\���ϼ��*�=��N=��&���1��t�� 5^>+.=��LR���>��=�x>�=l�������V����/�;٬��5��!�=4ã�q�= -�`К�,ұ���C��DF�Nh��[`��zXa�S����&=wX[��;�(޾=�u?�n�?�����~�����=k����y<�U��S�!>^�c�Ԙ�%_�q��3���~�ː�=�J���>��O��8�>��Q>�m\>���=�چ�8�-�{]�=:��z�>��y�y�A> �����<؉Y��v罯:���lB�q|b>�";=g�P��~<�\�=%�<�� >ӼV�����EՆ��=�=���"� ��/O���0>�I�� ��=�ͫ����dΤ=���;s�=��U��<ν�8<ԣ��Ad��|��=no����Ӽ:��=:�����<u�d�(dV����;��=�h�=����#��\>c�<.U��r@���= ߮��8m>��(�_>�ǟ�?� =��Q>��*�OѨ=.��Q;��ֽ�.�= ��d�&>]d���?�<�\��G�Ἄ��=-_�>[�=a��)n=��=�G޽ nT�9Ҡ� Є�������=�C �^���j�=� ������:��='�㺅�u��]
>/�W���G=�����0?=޼T���>��ҽ[�z��1��>=��
=s��:PV��Xc>��ܽ�Z���F�=����N���|>�t��`�>��V�C�lǽd!_��`��E>���;�X̼t�F=�����$���=<߼�m�&E�>�Ao=I=7��=�7k�{� �N��f�7=*`=H�G>���=�ݻ��;8���_�=D칔�{>����3��<Gc���:�=hk>ا>��~��!޽p���>�R�=�(>F���WǮ��3e�߬��d���n=�&�=3I�&�>殺=OM<>�ھ=�f'�s
[=���<�O�1[$>~ ��"q>۵<�Ľu8�=$�:�
��<�d/=���>�8%=��n=u���.i��dz�7蹼V�=5]7�*#�=t7-=Q;�=x�=�4��[h�>T�m����>Q⣻4�>���=H?8���>��ɾүڻ7=��P��<��=�5��?!>}����/>M��G�=�r�|(ɽ҄�����=9e㽂ս��M�X�~�a�>ɰ)>���<
2��! H>F � ��Q���-�$���=3�=�!t���=3��=�]5�bf���^�>|�>�.;�P&��O��W�� �=��<���=
λfM�<y �H=e3 ���W<]g�;�|����#��[Q>�o�?N>�\#>1g>�? =l����yZ<���,����c<��C>�����$�<���z�D>U"^���>xt�=)��m!X�Lp���w�=YQp��z���ǽ(�K�a��;���:΄������ǽ�C��_N=V5�=>��;J,����w{����C>��=��&>Ⅾ��5>߫<��l�߯<=�~���Ƽ�_"<IY����xܽ���=�2�=�1�=�ՠ���ս߿����"���_���=���=�;���Wн�g<\�}=�N� g۽F鍾�d��>T�-=����a�=sf<)y�<�d�0{������D>sM��&�י�<�3>=
���=`ܽ// <j7=&�< � �iލ<��>���>/ �=8����*ǽ�rϽ��G> �*=@H�=���=��<�=�S�;�zU�q������4Af����=��<�� ���z���J��qz=&��>�h����<(9��O�%��a�=^
>�@G=ۀ@>p�\��0��ȁ� F=��༄�{����=+HK� ��=�8>���t�����<�(=!Pּ��0==�">ڵ����=]眼*�+��7��*Oz�&���d��=wՠ�^֓�z �=dj�:ס�=���=�ޛ<j������<*�k>�e:> �p>�x��]e�����>��=�+M��qH>ӹ��R�=;m��/�m���>Y�U�=�:u���:�7�c� >��>��q�����>Cl���f�=���w֡��}=3g >-��<W� �ϓ�=�D�=G=�zO>?���1 ���=U���+sp��f���x�<�܄��~�=Nq���E%�pe��?��'=}��n��ܢ�51����<a@�=�5��8n��U��T�&��
��?<>�I�:��м=��=UٽPz���7N�a���{�Cc>�o;�oֽ"��=�z>��'���=?T{>kCս>�����=P�
>��>m����T>rQ�������ɼB�0�����L�Y���9O<#>���i&��ދ>f��<�5>��J>�ǒ����<p�_>���lL��/�=բȺؚt�X�T�Z��=�G1�����<��=t㼻�P=1ڃ<��/w��%���}�N��Ǎ�������&��I���J�����=d�
����=�"�|�6O=~�=��z�<pr�%%J=dD)>�h�����=���"��p�A>%L><�
=&����\=��p;� ��䦏<+!�=6o>cBڻ��F<'>�֭;�gh=! �=��s�����������=eap��0���3�����=��ĽG@�>t>kB\>��>'�M=l��=(A<�NJ=�N �aE&��Kf<R�k=U ��cԼ"�I>\� �)��=�罽���!�a�х#�`��=��"����<yX+='��=����|���T*�݌�;�~�=�N�c,>=�Ľ: .���;h���2�)�^��= )���Ƚoϣ=���=݌�{=���=l�D>{�㽎� >JK>�F=�_�݇>�uսA����彭��<g��<V�>�֘=h7�=�����x�;}�+>2�>'�<\�8>��J���ռh�5�u;o���~�woj��ov�ع˽�kJ�` ��p�=M�=�sp> *>�� �<��=�������>@�������k=�
D>ŭy��QO=i��=X��;
m��󚽄hɽ؀;��D>~ �[�R�tm>FØ��B�gPn<c�A�����俶=#���P˼��>��5�=�������=<`�=@BG�vO=O^C=��^�>o���Sʻ�*Ͻ�A���o��5�P=2�=Կ� N�=R䡼M��������r=m�$�B >x��>�^ͼ�> >[ڽ`^|;�����)�=p-�� �E���I�g��#<�@żÉ漌d�<<��>��5>�kJ��g�=}(o=����C�< �=$�\�c1=��J�@$=�Z>�ͽGc�=��\>ߙ��ԛ���ƽ��>�e'>�*��{%>�A���V�=��Ƚ��X���<DD�=%�K�W�L� B>1O9��j�'n>v����.���8<�">�=��D>P}�hD,=v���邽�W����I=�@�sE��� ׽n�h�SbֽAkb=|$���DH=�h��_,�n*d=�콆�+=?9y=5��"؏>&7#>���=��ﻒ�]>�� ��� >���=���=�K�=�&��օ>d�=eh<�F��������~�ɽ+/�<�kB��9><����\Ͻj/�D��=�Қ=h(�ѬH>!u�<_n���|���Ƚ����RP��Q�2#O�{_�=W�X>? >�o�>�c%>q��d!+��G��P��d ��ݰ�=fa1>�ֽ�d�(R=�����}4 ;B#:>�<�:�׽�z��WL��}=��>��G��$�����<� �S��=d�<YC>���=`|i>�����<�u׼t69>������ɚ=�r�=;.�=gϹ���=6>�yw>6�����>rB�K�>�dc=���Ʒ�\���I��!.�7�q��T�,����r�=��=�7�� �<�Eo�����r< n�=P���ϑ�=�$>�# �iI�=K����V�ᐶ���e=�耾��c=����w�=�BҼUL<B^Ƚ�*>,���J��_,���I���Z>6��;�)3�k�������ע��s<=CE&<�U���L�= T��d��=SN�>�^=� �=sZ��-A~�jd[�X�<>��ܼ��1�
�}=�6�[�Žg��=�".��:=\>]��-��t
������>���׽��"�P�<�3�=�����:3>����d��'l'>El�= ٓ��6���]����=0���o�<���<�������v���3l�=���=��8>�\�� >��(�� I������ƽ�KJ��ס=`�(=��g��vS>�nͼ'DýPٸ;h:���Z�+���u$9�x }��:=={��=Vȣ�y<~M�=�J>��=>y�=[
=
N��ތ>l"(��� >t�Խ�[�K�4���I�*�0��#<�%���$�=�*W>hY[=�^=�#�=4��=�
>,�m�f=��}�9J���3C�ۣ�>8��=�}�<pv;��=M�}K���)=����*=�U��]8�*=>��=�(�<��>>(����<=>1c>��>��ܽ@A���9)>R�<ȑ�=�n�=������->��=��D<�ur>����v=�����<�o�=�ˁ��!>�ȇ=���ä���<a�(ZH>��ӽ��>%=u>�v=���=�����F�=�R�=��`I;lZ=��� >���JK�y"»jG>�ʌ= ��=�c�8�<��������:=fb����&=uŽOu~=�ఽ��k�=��=��=U� � ���o��i���}����$<Ţ?>j5�=8<5��F=@Ah��O1>�c�=q2�=�#��f=�E̽xT�>z2��s�1=��<[� =}�=��M=�9��W>�ֳ>�c��㘁���x=�*`=Jݽ� >ʙ�>A���J�79�L�9p�����=��8�V��=�<&=�#���=+<��<�>=����dϒ��v2�7��<:]�=6k�=���=�dW��c���n>% ����=��=�;�����Y����u=����Ǜ/��'>�j<��<��!�]��=����������=�=��
D=g澽OJ'<+~��TfW���~�CR�=�t>�_�=���=�
;���=i�=� ���q]=�v �p�"�{�<�+>��;�����=1nH=}��/�ļ��G�?�齹�<��c� �<�ə<a���� S>l�ؽ��),�޽��׉�=��+���z=O�)����<��`�����=��>��� �*�w�=�O��=�¼�������M;A6��w�6X�W��3���X >�%���q=�b�=����ʁ> ������26>�L�(�н��ѽ�t��Z�=qɗ��ֻ��A=ǎĽ�Ӏ=�6 ���������XP>HQ-���>���n�;��=1��=n�<���=Fv==���<�G����= ��=�g��l��=��U��`=�8�=؛=�ʼM >ҕ(>O� �*�=��K>�9��n�<���0a"������>�Ѱ= /�=�� =��3�{x^=n�:>v��Fv5>�mT=^��=��=.�=v>ۼ(�~(�=�3>ޅt�+��j������=�2=K���V��<�K��N���}ͽ�|��z$>��ٽ�|��1�+�编����L�<�3m������"�>�O�=��L�^J=>�Z
>m^=�~� 0��̨v�muh>�ؽ���<��&=�kF>�p⽬���R���.O�o� �ħ�<ws�(�e�9/�<��r>� >�a-���Ǽ!�;>�M=M��~��>�j�=�$>0����{�񲩽� >�}�0������ɟ}���=�Da>4��Q������<JG,>����V�=-[۽�S;���[����<�I�=�S<W.Z�����?�<�wy�Ց��"̢�،��"�=�W4�Bj�>��R�x�=]�:=��Z���=�2����5�����>s >w�b����;� ��]]��3���樂�z��=��G��^C���~=^��s��% >֋�=�$�=2m���*�.�;�"3>����A2�"�佈'%�\��3��������<�2�<��)�[pI>���;P$��-���A��#�>�Ԕ�Գ�=��R=�ٮ;�=��R�W���X<>(M��0�����=X-=�Z#��i���l;���� ��=���>� :�Ö��{�=?���$��u�=�B>��W=W ����P���=R�H>gf�=cK��O�Լ=n@>{d>�� >c�0�ο�<�m�p��;U��������#�p=|F<��t=yw�<�.�=���=��=>f�T<���<�b��UDG�v=�ݕ=��;<��=޻��ɱ�=���=G�Q���W�b>{�=���=�+=q�J>*Y->��i>��ݾ9�A=�d+< 9罗B�=S�����`�U<<���K�a>R+���|�;R&>F�^=I4>>�J=3y/�D�>=�����k���x/=vʡ�� =|�;��:��3Ѻ=k X�#���uM�>46>5� �*������ه���=){���ﲽ�*d>���"�Z�^�_=��;>�59��-�,>n�>uȍ>x�?>+P>����w�=;|�=,3�=­��f�[=��M>L%ͽ��=K �=dz$�~SG<���p���n�N�>G��������>����0����0�9�D��"C>�`5�� ��l2�qQ�<�F���5��@����>C�s> ���u<h�'��_��u+�=_���Yľ:Cb=��,���=3J>M��<vЌ�k�����YzF=�O����<�UF�� ��a 8>w�8>�_K��D��dp�§�>�ν����ٴ>���=�u��f�@|�������>���w ӽ&#��9�=|J
�?�>ة�<MC�=Y�>������u<
��� �۽!�C> �����0>�#��8=����=�*w:��ֽ���=���[�>*Bռ�pc>��ϼ�(f����=-)�<OEջ��w�<R���L{=5�=��Z� Kǽ+ƽ�2I>5�_����=$��=�y>>��Y=��"��(=7�6���Z;���=~ڞ���=�t>`�z� e�=���=m�B=]=q!"�yi�����j���>��V9R=�
�<=C��37<z�Y>S��=�"�=��A�%9\=b��<�\�<�#��Y�q>� �=~^�<��*j�϶��X�ͼ-(<[Dv�) 1>�]�r��=m
!����=OZ�=����H
>]��=͊D>.pA��{���ƽO(>*g�=(�=6�%= Qɾ�Fx� ��=��=�~�:��U=e�>�?�;XkT<c�޽�]��r�<|hO�>b��?���~k=m�>�K0>J�Z�E���/>MK-���3�<�>�t0> T��E�����j��:ս9m>ڞC=�=�/N=1�<�Ob�K�=���=UH$>[
>��F�I_�=g�較'��]"z��Mڽ��/>k�=<2r�=��<�:>>��z�#��LDJ=Z!������߼1�(���3>è�;-Z�@+=��3>�~��$�=���<K!B<nIJ��86>f��=�!�=�|�=�<w;�����)=>�O������N�C �g�!>��.>�&(�|Z�͋�z�����=6[R<ȗ��s>��@�}Si�����d.��$;�!w=[hI> '�[��3ϼ�Q�=���;�����_����E�����<Ѡ>w����V����2 �;#�%= s4<J��w$>UV��䈨�F��D7!�@�=�=�=� c�
�=D! >��:�5�*����z�ܰ��"
J>ɹ7��E >H9=ҁ7=*$M��A��-;�^>�W��+��<����q� �X���82�|0Ľg�ǼQ}@>yj�=�፾t�=�g��[d(�u���.s��21�D��=EDK>�=�Q�׽�G>�V>aD��� A>_Aj�v���w�H� �}=��%=��>�T>b���������=����0��=O0o>��B>_�P=�N��*#�=��_> �Ѽh�v=G��=0�0�8�S�~��;v"��}�=8�>��>�6>���Lջ�ož���=�y>D���9_%=#�l=��v<཯=j���'�>�D5�Sz�w}C=�i�=��_<���=�E�;b�ֽN��,E��)z�[��;v�=D�� ��>�G�=X�𽡯ڼ<��=~7�=o�����=��N>�S=Č3��a����>
��=_@@�L�=����#�O<�����>������0�袥=2N�N�,> ��=��g> �4=�'��xA>y��7���T9>�U >q�����9���>'��������)ؽ���=Ŋ�<*�����6>��'��F��A�=�� >�g(���e��O�=���=AJ>��0�����%�b���Ǿ�=��׽$��=�Ϳ�`�f=P)�<>O>0ݷ���=፾=��,��C�>uջ<
�>$�<I!�����=N�b�֙���9�=��F���+���e��v%�� V�)ir�.!>/�=L�Ľ�1(>2��<ȥ�9��/��l<Rޭ=p>�vj�f?��K,�Y���O��;&Y�<QpC�a�>?Ľ��p>d5����<W���?>ޓɽ�y����Y�������_<�I�=y���Zg{>��=�2�������M�[s;WEz�����p�<��=���=�f���䧽��>f���h= �=e#�;�t�<��=�M������CҼ�\>��R>>�>^���Tp�xn[>{ ��Y�p�������F=@;=2��<ՄU<�ӷ� ������E���r�<���=��g���?�Q��=z�V��v�<�#=��(>8ի=��
�/e��v[�����V��Ɇ<�i5=�b˽���=�ػRފ=�]�:H�=BlV�?�ڽ��t=�׎�P[>7I>��N����� ,���f�<Z��]��=�h��V���ڄF����0>3"��s=�m>=D�y�㴈=�xS>��-�Hw >��<�pٽ�i�<�W�<ҙܻ��b�-?=`�7=�^m��_+�XT�������K�=�t��01�&�#>�x�����4��^8�f�= �0>AqU>�g�}:ټ�I��#��=�).>�y���(>f�ʽ��>eb˽<R�;�I�<�� ��:���z�>���;�F>�<\x2��/��2<��
>��=��w�o׌=��b;�p���$>��=��=U�;`����� �ͱ(;��+=�Qf>N�
=v���I��
��<0��>�K^=n~�=P���T�\�I\������G��P�=�シ�����_�_H��Go���:[���v�<��!>bS8��n�<E��>a �d ��;=�@�=�s߽� �����������1>��l>��-=<�|>4��ɕ�=�l>><-��kŽ�0>�"��E[�=S �>jR�> �"=ƣ�=6��Swb�Fo�K�>��!�M� >+sL<3��c��<��3��*/��{��,�=pUk=;����c=Y<0���<cHY�.h�<IX켍̃=s��=��������<�� >���^*.������n���,����7�"�[�׽���D�6��C���B<p�=���=}{*�cuf�~/Q<i߀�2��~�=컎���=��q�jY<kqd��fнF;�����<7i�M�<��1���‚=�|��˒���l���b�K+��:�x=F�=!˽sm��{P��^L>�`����>
��n.��:=b��k�����3n�=ϻU>���<+�+�ST=��7;F1���w>�V��ݭ�b���r=���=<)l>>b�$��=�H¼��T�\����3�7[=߼�=bly>w =V�2�6�Z�j���[�:�}�}��=��>� %>�v�V炽Ԁ����A����2�e B�|���v��<�����>�<�UuL<X��<�(=�V>Si!>��{=j/��/J �3$���I⼅u6��ā=�H�=���=��{�Q�<��u��2<2 `�WF� y����Tߑ=!�]>��*������j,>m���ɦ=k ���哻���爼iD���a��:F>��߽3�U�Z��(n>^<@���g�C�v�
��=ՇӽGͿ�����ˈ=�pH�����fɼ�)����Ժ��> x)>�����jY>���>�� �(�����(>�콏W���(>�D9>eI=?6}<}�o<q:�=B��=Ŀ�>�,;>-��Y��=h>���v�(�y=������=6HN>�Y:����= P�>��ǽܚ>�AQ<U���9=�^�A�s�>��`2N=��c>��=����L6>��B=`�B>S� > 0�>*�,<`��=y "��
V��ս>���=��>|�
�…$>��=���=�� >� �P�>�� ���}<����F=5Q�”��kU=A޽�dt�=�ă���~�܅��L�`<V��kq���A>E�>p� >$��=U����Z�_�= )�� ������w�=�$�=�{=M�,�gŰ�xc�=��>��:=ө�n�h�43�=6$׽�+���F��:j��Z���\> �=��g=�=�K!=�亽d� �Q~-�>h��d1��BB>��<�Q8�g½�Q �=j�H���z=�.���!>^��=���=��N��v]�q9ƽ�~>f�$;v�F��K��]��;�Þ�`
��gD=C��| ���X����-�U���$o����>6��;��Ѽ�뭽K>2�=5-=�_c>��<gM�<8���!�<�>g��<W���-*� ������V�=l �_Ws��)_��Y`��q���`6<��/>�#��z��~c>���=Q�S=�G�μ�=�Hǽk��;���-��=���=���=�Aֺ���<�E�M�h��M��H����I:�� �F��=�ff>�d"��l�t%ļ[s��`��=�!�=Y
�=�2�=�I=��6>�d���-7=�#v=�I�� �'<��>�罙����+> ��>�����o ���:����<�SA>*[==J~"��7�=`*>�G��Ǒ��>d�n>���=
M�<L��>��=K����5W>�[=ؘ�=0�-���I��.�=���=��<-��<'����x��V S>�:G�)��=��>�aa�c(�D��^ͽ�1'���\<L`:��j��ޥ��%%B�0�꽝EJ>�)�=T`ڼ��=I�H>�7��?O����9
���a����=9 �<�0�<�hG�P =X��u��=d 潦9�=$ �=}�-��Ɋ=G#�>�������W���.o�Y�Ѷ��߽.�ĽmPN=��H�;�D�=���S|e�:0i<��}>@�n>*K�=陫���f=e��=�����F>�9>v� �+��v���-��=.>��ý��6�N��=JvL=��<UVC<�,a=p�4=�G��>�0��Q޻о?=���=���=-݌=U�^�G;���������=;�">6�]<�!����=�S�Q什��9�h�G�[��>R��7l���� >�+���h�=�= p�����9F�=�)�>�>D~h>.N>�~>���=-P=:a�=w��4r�=�ְ<�Z�<����"}�>��<qZk�m��=2�C>�Ͻ�1�=���>������\>����֛�A&��x>L��=5L��٪0����<�<ak��a>j=�\@=��=��Z>K=<!oe��s��Θ=ĸS=k�O=��b=�ib>�é�%;��ߚ�$� ="�V==J�=ݿ��ZS����> ��<ݧk=Ur=^��ų"< ��NU>*����Tb(�X����)R>�@">��R��=<Y]�H�>�:J>z\<<���<!�(<.*>X\�=!�O���=��M����=1% ��%��)'=9�S�= %=���= �;���>[z�=��j�������:>+\>� ߼��<O&1=)�H>N�=,��='�&>m*>b� =�b$>���<ߐ缆��<�]�5�G>��g�=�C�=� ~�_g�����������N>�能���������]����=3n >&=Ľ!� >2>�ya��n9;��彖m���Խ�:���V<# �>l�%<�8��h��<Y*�L�G="sս
�^>Bۼ����1��G���=�WB>BW}>�l��)��)�=8� �|�#<o�*��9�=�o���=�=Z�X�C�����<Y#>�[�=q��*1+=���S����c=S3�*o�9�=���=����E�=��ս1J�=�Щ��*�<��󽈴�=�=hu��+��=�,=
�@�=�<�g��J����%�_=�H�*��=��<�5�����=�6>��=%.>b��>u�F����=�[E����:'�_�>"�ʽ����=A�e� u���%=��<H쨼�xp<?V�=�a�=\Ja=C�y=�|�^�@=�">:?>3�B�D���g$E<z���M4=~�=k�J��:��L�soͽ)=^�-�>n�i���B>����e��sN>嚽�Ec�p}#���s>��;=D_R�1�M��W�����<#h�k�Ἡb>7~��+s��Ft�~ɲ����� �x��p5��u����ļ�Y�=��$����<r���U��M���,:>�����R=��+>`�>��B>���\�==R=;=%��<=�
=󈆽�u= V�=rJ�=�KV>��<���;��a=� ���]�̂1�����eݳ<�>\=^��XX½��t=PO�$x�� �Խy��<SIþȾ�%�����;�H�97Q���<���J>��>#PW=��=u(>�L�=�h>=e�v=�~��R/���T5>
���/�=(ˊ�u�!>�׹<2��= �=ު���󐽑.0�O6d>*�=Q�=�c�����<��>:��$�ƽvD�����K>�?g<M���M��<�Y ���=���=WX�HG>h%�=\���k=��!>BIJ>�q�=m�Y<�>�+>-(�=d�r��MM�\��= �/�����jƽ�9d�˯����� =����h!�N��=b�S>�⣽@S�=��0��>��M
��Cw'=� >�O>:�S�$�M�l{ �(� =��i��L�=���=��9>�ͯ��m��J꼨���7ѽ��`�iZ�>��ɽpX=v�=~z>�B:9�#<��t�P�=f��<%���[�!>R=���;��><w?|=��=`̽�37��^��<G*4> ���}����S:���y�>�����[�z� >�4�=��$�=��&=���<�a��k���
q��T]=w><�!�a��<�����J�)7 >U��<�.���̊;8tp�9�'=;���{;+�>�~��b�>U&=o���_��=^�=���k2s��C�%sE>lY�=��@�1����/
>�wX�P�>]ϰ=QIC=��>�d�=Ʊ��D��i��=Da=��$=��"=�Ľ���=���=B���������;�e�V�����ӽaA�=[;%��m�;�[$>��4>i�p��6K�Cɽ��R=t��=�M�<w�߻����av;�>kI=O.��=D���9<~���?\�c�=U'f� w�+�ǽ=����u�ku影�3>����� ���-/=kQ=9N=�T&>���C�}���~=�4>K��=��C�Fq�OpQ>�X�¼���mR�=X���^����\ ��6F=�V����9o��Tʽj��²۽q�>ڋ=�����`<�a=�>NS"���=[�=j�b=P��&��=PÙ��+��Xw�=�䈾�Q�=�����4�=��p��
=����'�/�ZC�b^̽Z
Խȝ8=���<��C��Ty���=��y����=�i�>7H[= �&�w��]
��p�J�6@ ���<����F>kq�=954>�G~=�ד��Ȅ�-z=���> >B1㽎�����>��?���x=-Ƚ�Ѝ=E/�=���G�>��o�|Ê=Ѹ<�8P�y�=>g����>X�-���d=��9>8�����/���=���=7�~�,�s=�oŻ��=�-�������; ��=`��(~=�!��5lO>^ݽ=�0=Cu�Y9%��̗�2���DO�<�gM<�;>�r�:� )=�kZ<��g�`�|><��2�=,���y�D�=�k^<9d �W�=�~�<�au�T��=p@4��~=�]�<��:�W����� >��A������'�����6�ؽ�r���ˁ��m#�� �;��i�C�$�+Y�=��ź�=�n��<�ļ��`I�$�v��B:<q�D�i:'���� P��)�=�,6>�je�`���h@��b���a&�n<� ���x���VVʻMi��J��>�����;>�=�y=���g:�C(�w�>q�>�q=Ύ�5N��7u��W��3����9�=k�>r����>l��(2�"�>=Q9� ��Ia���i.='M�=8�P����BS>�>(�B�==�m<DĽ�f��=�nv���=�e����;=��>')Լ�$�=M1'>�q"ͽ�
>����$���=�bP�b���2;�<`��>�m>�s �Ϡ(���)�\����=E���H���ܧ����E�z_ ��$<������=��1=һ@=v_��L��a��T�L�-ߢ=��_���{=�v�=K��=�H�=�fj�d �o��<�� =>G��I >������>���zf�<�(>q���k��=\q�<�����D��В>��=&�-�'��=�����g>�'꽺z>�6��ͧ�{2��p��=u�F�[�����<�/w轓�h�����4��(ͽ� ��ݠ9���7�ŋ�=Z����+ͽ;Z̼'4�=����ҡ�e�����<-X���[
������_=��>�c�;�L�=�\�<�(��i!���+���F&�r�<~�c�����|>s��=��l�����/�ʽ`�p� �={쭽0oT>`v�R��e`=ը�=��v���B=.�S=���7`�=+R>#��m载��=ƛ�> 9=+�º�V;g����ͽ�[R�i����=������� >�=F�z�EY=�'
�v}_=#<�<6�������>�4=L���^�=��=�dV�g��<&f�<@���X��=d =�V���ӽ����U?������{� 󀽋�Ǽ�3;9_ནX���wV=�>/�</ ]=���������>:e>@o<#_�<�0�=��2>D'�&H|<�������=��o<&)�=� ���t�0Ϥ=���5�.���3='l;=#z=I�����+O�=�ѭ=��>>��;�m �wK�=��M��Ż^��dD���O>a�y>w� ���r�;e<�;�����FL���ս���=
�=�$�=��Q�3_� B�=����=9���P�=9V+>��h>|`K�K6�=�/�<�����j`�{�#;H#��­>X+�<�L>�a >��ȽL��=e�E��F>�e90=v�=����ʽ�K>l$I���>>r�½+Yͻ��ټ��B�qi�Vݒ������S����=�+�=�kG�B|i�:E⽮~��.�����<�G{�;�>��>Hcy����<^�R�8�=�s3��<H�=�Q=�v��G�Q��9z�=�m<�Ӽ�>�,;q<p�Z=��R�����9r=�v�=��>��}=�%�<� >0����mu�cxu���.��A���v>/p�=����.$���n���r�P�<q$�;���h�=&|]>��Q���J�r;���弩č�/u�<L�l}�=��'=�4�=fn��tC���9��_��_�+���">}|O��X�<��>у�=r� >i%��l����=E� >�c�eB�=zj�:���͚��T�����=�_-=��m�=>d9Z�naq= �����r>�ж=PS-�q�=$f6;�+����H�_P�<o�=���<e�3��=Cn�‘׽C\=6v�=�K}�����s>���= J�=�6��;
>c���i@B>��ټLM�Bw8<W�<�f����=��~=)���#�����=R�=�]$< ��;>�d��7�
<3�>C�/>}z���� >�cs>b��=�� =(̽i|���@�=��7>��=FOϽ^�۽�+E>C��>�H!<��)<.������=��;��x=�ZM����]���kWe<��%=��'��� ����=�����ý�,>��k=���<��u�w���^��j��=x>:��(Y=��e�=�X�<R���Ȥ�D�(�ɗ�4,�<.` ��㾼��">N�;�$>��&=+T>U .�2W>�^�;񻷽����]@[���>� ���p�<y3>|H=TC.<��x�x�=�=,;�>�Z��e>���=�\��Ş=�U�<�l��4 Z�
p\� �~=E�6>���='M�����z=l�=M�����=�t��1>#���yG2�-RC�� �����¨=d6>�D>��w�`>r�>u��p��=�x,=���=�z�iP�=t�����>{5G>����j�4=2��<��<���u���)[�2�I>`m��J>-�y���㽈C3����upN<޴ӽm*��}���Ž� �����ٖ)>M� ���=� ���=a=맾����=�W���������x��������?���>Y�.��m�>ԝ���1b=9�"=hʻ Aڽ�!�>bbԽ�q>�ս�`:$>��=CE�=�:��KՂ=I�>k�N��f-�*1Ͻ�꽩f����Z>�ۍ��Ǽ=�֠=ya
��<��T=l���v��=��=#���Z�_�̽��9>S-޽�����$���7=F�:��/����=�Ǻ����=��N�)Q��c =i\���cJ=M%� �">N������a~M�!y�^�*=$�>6t>`�K=�z����H=�F�%Z����>^2<���<�>FD ���K��I������r���vn���t�[ES��b�=q�6>��=�,V�� >�Ӵ=ۅ����6=gF2�tQb���4>e� > �>��d��8}=� >z�E<�`s��Y �
1p=��W>#K>j�=Uo�<Ԝ���b�=Վ�=��L;d+0�Ě̻C�6��U�=@c>��X>��>��セ���&E}>,��>��5��d��頽��>R���rTw��K�v����V=ό]����=;e�<�=�����F�<Ǧ=� �;$��=�ܒ=׬�=��-��CV>�/D���*�r��<H��=�!��s��wM�j����|(Ͻ_�[����<�����/��8�=�F���t<]AD�}��=���]H������=�C������<��"=�C=˖���-�����O�Խ���L�л�u0�a!�<��B=��|��%L=���=Q��=��>l� =j#6�����B ��7W=���=�
R=,kI=�g�=H]Q�E�=@�s��/ =S)��L:>/?]=�ӼX>��J�L�0�#>������R
{�`p}�֭Q�g��=��<G�=ݶ�=�₽��<`����Ŗ�ǶK�ȏ>U��=��)�m�ƽ�����g���sڽ5hD:}(�=�����ڙ���
���m>6u�=��>k->^����"�=+~3=�֩�$��;�;,>��L=n\�=?a=�8�<ݸ?�Y���v��3�;C�>"$�s�=v���k��΍�toR=���>N���m����νy}>�,��j=����M0K��">q�=v��=2؎<G��U�<0ܼ���Y�jE/=������e>�p�<;�K�*.��ug��cV��N>+��%��=�Y�=vi8��ᖽ�C��y? >⠅�X( =�2�<�;S;�s>`P�<��\>ʂ5=��>o>4&��]y>��F>��=�'>A��)���<�<�,>��˺���<O���ڣ=��>,���~�=,:=~�;�Jo�<��?=T�*=r�e�\��Zý� �=�=ң������������j$>1�2>�g���Gw�6>�(�<ʯ伩 �;k���T�a�ѽ,>+=?=%=�i/�%!�=��"�
_��A���g�ܽ_$�<n2ټ����0�� �=� =� >`�Ľ�ϟ;���<�d='���CS ����������],��X��;
�>{�5>u_=��ս�0t>������=!�׼G��=�\���<��ż�Z>] �w�>y�罌�ѽ5\��6���l5�U#v>��=
}�=;���F�=�e�=�J���G����B>�p�=Ga�<��=�E�=��6�m��=�c%=O_� V����X��t,=*Z���{�=K`>�3����b�=�vt��h=�>wϘ>-�}��<�<"��=Pn�<��ڽV00=��>q;)>�X>p<��=��J;���=`��^��4�ҽɀ�U�=;C��t}=E#9=�oV�P�ýԏ)>a7=�fM>�b���m��K��l =4j�=�Eӽ�'=��<֞#>ɟ�㶯=sG >E�;�{5���0����;���l��=��:=U�d�ysT:���=e:s�ݹ�'���-%�7��ҥ¼��R��s̽sF�=��o>@YI=��Ǽsǂ��1� +�m�K>;G�< ԽW��w.x<rnO>�^=M�U>-�><����@����=���<����d���+�����<�zZ>0Խ�=����>�q�<UQ;Q�%=���=��=YT��ˢ*�Lm\�E�>���<� ;L�
�����c������ѹh�����ֽ�ۇ=��Z=~a�������M&=G���؂ >�‡=^�R����<��>(ɸ<C]0��>E"?=|���K�>�꒽�*�>��-=���=�L��R5=6�>d �=��{�B�нk1�=��=k�=x�����]�!�DS*;���>�I�� }>�H�ŚG>?�����<'�J=���=*9���S�=��>而�.m���}%>M���]dg�imi�r�> �P>C������=4���S����v��-��/LK���ռ~"���>`2�<~A�:ue�=���=0Ł�v�U�7��<������ �(
S�_�>V����E
<�! >��>oL��㖽QL=TB�=�?K>���V{=�-�<נ2�HS=i���֫=�IT�I=��`�N��=����—�N��=[>*>�׈>�?>E�n=�h�<M�|;�:�= �>�&>�c˽Ht=��������<��==�O>yxH>��=p�+���I���i>,f���N�=�å=,]��n!=��-=�Б����<�^�͵��mP�oڴ�W��= Ҕ�TV>�0�<�`�=��#=5 =>�s�=�v\�Kh>��>:ڃ<�K���ĽI��> �=5���;?;��=���X�=u�<��Ĵ�)=��Ɂ�=M3�X�%<8� ==a�=���<�0.>�����=���<R#=*���3����5�<�] L���D:ˉ�žF�-�MC�<U��<wG���)]�u����>�" ���=ȩ�� �=�\���*�C�=/X>�Ǔ�⎸<��>EwU>D��2*��;�=�����|���=��=���=���݇=u�;��'l�t�~>�ō����o�>=$���U�<��5�_-˽���ʈ�L�t=���̼K=-�X��9�=���e5S����R�C?= (ʽ�V>~u���*��/��=��4= Ӽ������K��S��2|\����{�$��
�=k��=�Q�="'=�m��偾Z�>�˺���>�zI�)�"�Wmͽ�5���E�>����sľ��N���=b��<�/>�wk��pW��PC=7�-��6��2>勡���=�a�>��=�V*>gC���^C�{f=���=Z��
���[$>�<�`=�cؽs�>��/�=U +>K�P=Y}i>+�<R���3�+>�d�= g�� ���G� ��;��ٽ7�)=�&�=w�;>���= ��=��佅�)���?>�W�=L�<V�Ѽ��T���O�"=��n=��=~܂=��=��`=c��=�֑�+0H>�P>} 2�s]�=߆G�\�i� �ۄ� l��Q�v>o�X<.�y=��%=�Y����=��~=��=���=��Y��֐=�Լ�==�������=f�Z��GĽB�=��s�l`�⽆gI<�T��� <�ʏ=���+�=F���Ƹ��"���c�=��=f ���=/�b��A�=13�<WD���Ź�xG��f7>d� =�m��[�<��>��1>S�t>�y>���=nz����=�������r>zJֽ��1=�����j=л>���=]�up��YQ�= �(�.O���]�HG���O>�&C<S7�=�A=�[��. 5�*�������<O�f�q��>�ޗ>'/=���=���<�D�<�&��6ᔽ�5="���T&�>��A�d>�o�=��=��H��f>z�n��k��Ս�i�>�M�=V���]2�>X(�< �s=�}����v=���<q��=X
>�� >t �<�ٽ]��<w&����+��������=�,�=���=�� =�8=��Y�L�=>hm�=am";'��=�&��"B>)�:��k�;��4>�����sּ���,=@ӽH;9=5�o=�X;���� =����iM���t=���= ܻ= ��nb>��6>�{> T�=��s;2
=pv9<�8�=��������s=9m*;�m���9�Lk �.��f��<+&>9���n_�Y�V��$�����=�^_=,�=/�ѼN�m=p�ټ H�=b>Q>ڣ>>��6>�8�=l2�l�m�hh*��f�>H��3��{��fs��A�#>��,>n�7>Pk����=�M�=�n��W�>��U�y"�=&��=���=@q�=��׽ �:�/_��T�=ɂn>Z�˼*��=�[�=��.>�n����.�;����ꍽ�yD>(���sѽ�"���c2>(�:���=��'�e� <f؇<�>$=���=�>��=���]�ٽg�z����:��=c��<���{�'�p��=:1���>v8ɽ���<��2��[�<���=2@f=��ӽ��<g�/>�����u>—�<� S=��ݽJv=s�Utн=����y=��μ� ��m�����Cڽy�|�*k�=��T���5�L�=F�>,;�=��+;ݦ�=���/�½��Y��|+>������Ҽ(�6=KK����L�����S��Q ���:=��=���^F�׊Q<�x�� q��&>@�->�B ��K��[��� �)>�<(9�����=0�>͒Ľ��څ >:�B����>{�=�"= ����ݽ�b������@=�!�=�%��&�3��<g'=8�p=� �`u���l�T\F� �=���=�2>���<�=1��=U;S<�W>�'���q< m=_"�M7�窘�H_>��!뇽�ō��G���E='�h=��+>/�Ľ�Gڼ���<jaG����"�G ?�'q�9@�=1��<� ��_bL��>&�Y>L����<�>B�� >�/��᪽��g��?�=��ɽ:����Q����g=p��>W�t�^}�=��k����e��
����z����0=��i>������T��������p�K����=�~��P��઴=s"ɽił�h�;�Q潟o�=�˽O��=W�e>���<��H>r�<��>(�>>\<����,f��Y�=�G7=�!���ཕ��=��8�9#i����=.S!>b��=�P&���o�=>⨈<� >q��=2�5����=������=�Ȥ�'����F�=��}=�|��}h<�$��{֫<���N�B>\f>�/�=uH=ȱ���A㽌;�#-��\ݽx��=�����B>�]5>e�e>u(�,X�ރ�Ŷ7���=[k�!?Խ'�q<��8>d!=$�Z���]=k�F��� >*A>��9��w/�����혾;��=��[=�59��;u= ��>�ʕ>O�
����;!�T=b�7��"<��9:�Kn=�fǽ�X[>��ュ�<����=|å��Q ��Y���A <�<�=�i>Du9=R��=�7��cRջ��=ϴ����.�I�\>`4l��W��hI�;¼���= �?�<{���g�O=A�>�8��QE >���+W<���<u�N��ڽF�ǽ��>�=$��j�=Fn�<Y�̼3,�<�%>�͠:h̽�}��Z<T�+=˯�=�C=�Se�j��Q��>9﮽�eS�����-xa��.L>��=%5�=�����6C��1��b�f>2�P>��a��������R=E�=���=�?�=I�P�1����̽\>;�q=:[��2=�<���Ik�����1��<ڐ�<ɹ�<P{���#>�D=��<�ڱ��ڧ������8������[aƺ/ ��2+>���YJ�="��=��>��;%��E��+�����<�N�=��>>��~>��=�
�<���>�_.�c2��+���5�= G�<V0[��o�<�ĸ�e��{ꮼ���T��=�(>c=�]�;�a��V�=@�|=Zfw>2��=#Nܼ�P���V���F�0#�<m��=��@>��d=i�j��� =�l��j={[Y�����ѓ>� E>n�~=Ā>�O1��'>#8�=�PX����=&�%>q4���k�>+����*>�\;>��-=\w�=.�?&s�ѩ6>�d>��������<��>'ٻ�ɼ0��=�->i�����+�~Ix�+��=�c���V��: ��>�;�;�_�=�>�<' y�㲬�=�M>v�ۼܠ�=�����>��>�D;��&��j�>�Z�=��=�.��/r-����<P�b>*~�=( ��
���=�9>�*�h
�=6G�� l����=a�=��p�xc3�jL�=H��=�cWd>��V=?�h>�w�="�>^]�>J>����s��=���=^��> on=��F=�j<>� �q�=;D��ͅ>���<J��:����� ��o�D@_<Wn;+RN����=�ɼ��ݽ���-,^����=��x=�/�<�����S� �2^=�:����;)������!=<)C�=�>�D���=%D�g� ������r���EU=\�<-��=e�/>4G����=��U<�~c��V�������3=7���č��ry�Σw<���=BO���iû��E>�E�c�6�� �=@`E���>G�&>N>ļ:5=Q�*>�t����=Y-G��#"< m>�����=�b�=��>���=!ڽ��>5�o��ȭ=���~+~��_��j� z\�b,�=E�t=]˶���>�P�ƾ��Pc�D����<���>���=Ie2=-��=��<���=�8�K���\Q=b�D=�w�=��=�L8��5ý�.�=PxH>��=z[>�Z<�d:<Q,�=��|=����I^=2��tXC>5 ��O�>�����(��`�>��ཱི�'�.�x>��L>�O��X4����= �7�/U����ݽq4�>B��<���=�?Z�������<��+>ݔ�=-b<�K1�7[�=������c�M�7M=�3���㼑�1��7>R�l���p=��^��a�i9E=�]�=b�<��>�'�$�f(ؽ���=2?�=@�����2=CB>�>=��,��=�8���e>�ʥ��aĻ�e�<�Y>�9����������� �#4 �_|>P�7��4��S3��սh+p>��н=>]��΅=R�>g�����[�)U���N<�'��<~���"��=�
D�x���Dv<P!�U8R=�d$��=���=�E�@��<�+���s��|dX�+6�<f��>27=7�x���<�Z`>*e�=bO��?�>�UT���p=�?)=*�>��):<��=,�=��ȼEz>~�9�3���U�V<!��m�=�2�<��"<[w�֑��Y.��$�=R��=Q�g�fLG���q��H=�v{=�4
�ԍ)>��}��y>���=��>>f��_�&�� ��$ =�Z~>$���>��)>�Gk>Ur#���B>WG&��v�=?p�;�;���K>��q< ���f�<=�$、�>c�-�@[�>�k�=Kg"����=aN=h�-�zs2�2�8>�i�=��>B��=a�����<� �vL�=�-�=kȢ=�#ռU�=&J�>���x���ib=B�ݽ�]���+=PFM;鐽R>�X�=Éֽ<����6=�ظ;>�l@=O��;ѽ,b-=��B����?�V�8眾�M��Ѝ�� Q�u�l=��=���7=%;g=�|;��ܚ���)������gֽ����N��=��G����ΖG>�������w@���<nU��?�<�V>$b>���=fG�=n&.�";>գ>�G>���=ɱ�<?xS>L��=NOx�'��؉Ӻ~�Լ� �=\����k5������Z�X>��W���>L�>q�D�=I>a��<�^]���� U����)>�J�=2��=s��>�L��=�����>ν�=���(�輻�4���ƽ��q>��p))>ُ�=�O7�uz�;4(��Ef=g��<ڟ=�n=JF�>I�)=A��<ڂ=
�>���=��8��TɽRZ��b�>���=|D�D�r=�����&��:��H�=/��=��O���>�?�L�H�`5�=��;=qN�=��*A>Ą�<б�=y�Z��~�=�6�=�����(�=xq̽����=oh��G槾�Ӫ=�"�f��<}�)���;�q_���/=@� >�h>�󙾝��<�A>)�> ��=��x�Q��=�^��b����><��w�ڄ>/����=e ��kͼ�V��6X��C�=��t=/�޽ t
>q��=��x>W�����輳g`� �9�a� >�=�҂�;��=�T�=�o=���=�A�>믽���<fw�Ò$�и�>���<�&�<#c�<_���aD�=���!��<�$�=��<)U�=��+=�D��|�n=�!u�S ��U��=���>��|\�Vľ!p>���=GD=m$>�����0Y�?6��!��C����=-��<<��<I���4E�=���A�U>g� � ��=Vi �o� ����<�T��pv���|2��׊>��׽[<H"�<������_����>C���Z>�X�=?�!�ꃄ>��3=���nt=I��=��=��'��m =��>�����U��z=ޭ�=�'>�ra<1��=5�=4�<�����D�=���cr�v< �p����=�l��]�-����W��=]���>;`������儽A�H<ɝ�=&���#���|���5�q�=)��<����=6� >�n�=%�">6�<,��=8�����~> ;ý��Ľ6G��B=��������jH>�"3�c�d=)%�Ok�;�&=�p �ٟ�=��>T��p���9Y>�e��.nI=�+�>-�,<�a�=wz�=,H�=���S<��=��.>���<���g<�=���=�&�K��N������=���T.z>%�==�!��O)=��M��_�=u���z]>B������B%>'�)>�iZ���ν�*�=����$�=0qh>.Z@<u���"�ZM=%��Ѻ��q�=Jɲ<�-��{��8����� �OU�I�<>(��=��ҽPg9�Q��='9��!�>}�Ž��u=���=\����?�=���<LR<���=o�����=o�:>����DE<���=�v6�Eأ���>
d�<X��P:ƽ<y�<�<n�=2��=�k�=�Of=��^?���r��u��>E��;wx�=�l�<>#>z��C���ɽ������ƽS׽n���Fs>&6n�Z�`�)U�=�`��-��
�����F�<=���t�>�=u���*h�=�Z�<<��Y�g=DԚ>��[�3���w�B��oi>5�e��Γ;2�=M6��>R,���=:�'�<!�`���S�;��h>��eS��*�Ž�`���yc>�s
�5j=��u<]�!�,�<��)= �?<�]E��0<�^�<u�%>Yx� � y���l->B_~��ɱ�Y�I=wV>����uq>�3,�����1=_���dB2>��Q=&]�>�i�<�J�=��#>9�������'��<7w��l�=��$�:�1��D+>41�=`e�=K5��%��=�L�*}c>)=����ؼ�˽4>��J����ν��R��;��!��3P�:����ڗ�303>��=�f�=$IK=��=�*ؽ��>��
�E��;,�R>�}���|g=K��=�;>9��=�؜=~O&���>��ǽ���=%��=��P=k��&@�=,��=b�ʽܐ�=[)�=ȤE>�BC>�W�=/�q��^nA<&-�;��&��Y���+�=c�}��ʽ��d>� "��q�<[�f||�Q�E=���=�/m>�c�=!;>��x���
=���=L�=��[�2���|�ÏY���=�{>祪=--�=Vj��IO���r6>Z��_���*���t=FT����X�'���.Y���>��ļ�}ؽ%
=SĽ��5����=_6��[V>
�U�������<�V�=Ƶ�=�W���Jý�"�=2��>4ʯ= ��=�\��2n]<�
X=ae߽�ߺ���=���=� ��8B�9Q�A:�����R>u �;�Sr�0>C���*��,�=���=�߰=�EJ�T�>#l���o�=��b��
� ����Q�=��=o���=m�^�ڽ����Cv=� �<������`� �0�s�D���Ͻ��m���=�n���LJ���eн+�=tb:��j� ��<�ቾ�ż;��,�=F>��$��v7�8�;>�L;��f�<��
�w>��߻~�)�L�r� �$!�Md�=�.0=a��<v+��8Z>�P>+6�=�OM�D1�[��<=��6�6�a>҃,�y�����\>���< Ϩ<M1r��&�#ʼj�<�Ƚ:������=bB=8�[=�?�=I>��=8D=��%g���#>o h����Y��S9>t���3��=FqL<����l�=P��<�`�=����8Z!>����Z��<�D������R>�c/�s^��f4P>iU>$�u=� '<p@ݽ�6�=۟�UGn>��@>�)��[��>�1%>����3.�]Z���F>�d=-nC<��b;?h��F93<��L=k���R8 ���=��׽�^�>l�;��=���>U�D������M =P$A<Hb=r� ��P(=�ѐ=#2���<�A��b
��k>����oT�s/L>����?>~���K�=�yj�ԓ���I�Ġ=����i˷=j2��e><l.��Ɛ=�·�Kz὞�����p4E>0y�=\���}8=F��=�LK>�����C=������=������=�t������c�����7���Q���8>8�;ઌ=�8����&>e��_ܵ>q�&�Ђ���}���j<k7��]��=D)>he'=�~<=<����46�;�H=-� ��[�=R! ����=�Xx=U�s���#�����$Q��#��HΈ�\|��s;D>Ͽu�V �>��d>0����gv����=m��;�K�hs=�'0=�G��=��Լ==mC���6�a=��>p ��3>��6��t�P��Ah=����2G�A��>;��< ��<�O>���=����&W<AZ��/X�=�����$�;x`T;����=|�}�B6��6I�"?��"�D=�$�=v�=���=с=�Q
>f�3>X�O=j)�����<ϴT<*�6=�jq=lٯ�u�`�o�<�V=�\�=�[1�=�� �=ȕs;4=��:�^J>N��2n��{�=�a�FȽ�Nf>�"O>��=r���)���}<���<h��=Ck�=���=^��<�2<J^f��3 =�$=˪����ż"{�=�`>gR�:��>;>H�����=(ܽ`*��ڧ���>%yݽ�`*> V5=��$�{�4=f92>��Z>�[�<�n.����;]燽����M�,>NJ=���=�}x���h� ݵ;�Q~=���;�y��d�=V⩼֊���� �FP�=�U��Tf�=�f��&d�����0��<60��mS��>�㽂EO=��˾�g0�H�,�.��=?��=�2��s�=��q�m}�����=ʸ���:n>K >����Tg�=��;=l�O>6nD>���=3mM>���;k�=��1<`܎��>�d�h&.��ǖ�S���p�ݼҥ�=��=������&�&�'>�?�;����O�<��$=m��=ݽ�=��=���<�|���p�>$۠< m[���=_-8=��x��-�=����"�����*�9�1>�W�=�P>�];���f�ֽn�J�T�T��k[�͘�����`�����h����D��=Pѽ\Ѽs"�<b���-n�����>��@�yR'=?O���;��l�
X�=�u���(�� >s(����==̿��J�� �ս��=P�X>\Lk��{Լ�ƻ�!����1<������<��;ŝ��ߪ��D)<d�`������W>oL���5=��:g�=�k�=������=�3ӽ�0��%)>� 0>zT�=�BŽx�>`��c(c�[�k�����=��ݽP0�=!�=�ko��d�j:������>|}����� �9E)���!w�=#V=>����u��Q$� �q�2i��v���I�=�|[�����O�>a��<6>��n=xS���e����^��`(�H^��'۔��~�=C=M�=�qٻ+�%��,��L�׽�~�=�v>��ڽ�!=R|=>�\���=�yq=�>�<�&���>Su��ix>�W��)j����=��'���<��3���G����>�� ����=L&�<+j=��3�W���Ѣ=��<O�5
#=C>����K���b��� ������3=�؃<�KL���ڽ`f��R͏���L��cn>V�]���<Sa�=�R`>i�����>�����
�����)�;�w�=I�� ���`.����k��ý<�N�E-;�n�� �!>�49=���=6�3�]��=ʷ�>/�4�+�=�����m�� f�̪�=<�A>j~=������� �>��ý:4!�?��<�%��ىȽ�&�y'��� �<�j4>p�����R������;���<�z*>�Ǽ��L��0�=� B>��<���=��z>�q,>,D;>���Љ(�[N> �<���<% (<ڎ>��=޿�=KQY��֣�$�=b�=&�R=����.>9�;>녆�$%�>�/=���<+I��#n�<o;��>�IE=b��<���>,O��J��Iz��p��H�
>I`���p*���.��u�=t���I���Dy=u= �:��ƽW\��0��izJ�i�^=��üV����6>�q��^cr��sc�$B�<0�>��t�# �=�5� ���ͻ;>����=wu!>�#ໟ7+>��K�<Ȭ1������=�e��L����B����=0``>�\o=���=e�^���� P>/UZ�6��&��ѽFɽ����!��=��_�!�ͽ��<�#>>�����Q@��v=�ѽ�e�=X��;E��>}=��s<����;�=f�<�簼/��=�%���T�=����A�=�t=ݗ]���ҽ�ۑ�R����Ž.�����<�x���ἣό=�]�=|}>B�_=���;DQ<>���;�=�/>j6<�0��0�=���=�گ�!@ ���=�%½|�*��p�=VƑ<+u�s0�n��=nx���0s=��M��Fc��_��/�;l��<�<���� ��~�=�@6���b�����-�$�6(�=� ����=z�������d`>�����C#>����ۄ�=�f��P�<�0=�� ���^> #�=� >
\,=�M��J��i��f%< $ӽJK��������<U�ڽ����1��=g:1� v=�|���Ҋ��<LgD���A('=\��=Y,<((�'x�=c�7=z�(>n��H;�<G��?Y =��c���=}]=A�K��-��=�q�=5�<���/½��J>mR��� �\�!>bz�=�$~</�����_�<�ݯ<��o=��+<��w�͎<é���v��'� <Q�=��+=�>d���Q��=�������`1�<����k��w5�=�"�=c7�=�C�<�E�=��n>\�<�%��$ى>$9=�|��>����z�X=*�ʽ���=-����ǽ��=^m�����=��/>ۯ��6�>��%=�� >�-G�Z�F��>�V�=f�/>��q9]��=��>� >�5@=� ��` ��y��^��=�d�=!(f= �S=>����C>C�=o�����k=/E='���s>〞��N �yG�� "=�2�����=j��+��=ș�ټ�=�~>Z��< ��;eF�<U%���`ֽ���<��=߬<��L>�vҼ6�ս�yἧ��<��ν��=���=��8�ӿ����/�����i�T=�9��V\����$���>�a��sP�=�]���ͽ�}
> k�<@ٓ�W��<e�=��2>����S�B�Eb8��7��������0 ��T̙>�\_���e=�>��erE>�u�=��1>Z��=�$��"��M�V=��=�I�<˜����M�%ʡ�+�>�ߛ��?߽�M���.���9��\����F�>��ļz�]<=mȻao�=fp�=�=b�Z�y=T�����B� �м?z��ޟ=�G>9}e>U?>`�Ż$��"N�h譼5 ����=�w,��C)=���= ��=��>ɶ�=�Y�=��g���b���@����=镜���a=!��<�i���P =��|>�,��u����{>E4>��>T0�R��=��R�=
<Ҽ^,T>��<�� ��� �N�|�>�/�<ܵ*<��>r������; �=�W�=����נ�<���=N�8��3�=BTV�(���M��b������ŋ|��h���<�= ��Uȼu,۽�e�=0e*>�p=}�>���)�ݽD���v�*��«�T'M���A���0��� I�񇭻�"=��<�a�4�ս>�����=�u�<����+�=� > =��=�j��֚���'�=� ���>'O�<�̈́�T�>����ts=1P�� �=,��=,\��&: ��t>Ŵ*�~�<�X��x,<��m>� �=�� ��:u=��=�e�%�f�y�=�C1��i�=.�W�V��<{��� 1�%L�:i����̍��#�=�)���]0<��=�����@<U��>BxX��2>Q-N����=W�`>���;�D�=�E=
�>e8�=X�m;c#�=��'�9�s=�75�"y<$1 �,����}�<FbO>��T�D �<�#>7I�����=��]>@�=k�����>
"6=�Y����4;�y_�R�U=���=�)���;;3�=ό<���=�a��$>� � �X�g;5=1E�=:㲾�xo;��\��z�=��u�7��=�?W�O�ʽ䀾���=���:�=�&��=Q�c��T���&>��
��)�3�=-�н��M=0VD�CT�=S������j`E�\Aݼ�/���T½Z %>��=��>��=[ ��ݘ5>�jW�飵���:��v>[�C>��n�Ρ=�u?=�/�<�ܲ�q揽u�>B =��r<讀>L�:��w>]=
>f6a����=��G=ٛ)�٫f>�b �O��=֛�=�L3��d=��]�v;κ�����@-=M�=��=a̽+#=���=���<s�U�����;���|D��m� >G9༕�~�%�*�~h�=��>����7<�浽
�=m����#�) ��.�<%�L<|y1��D^���*>xk���5����=7�����^=����O����p5B��� =�����8>�Ľ�m���b!>�\Խx�R��Ϛ>/[V>��/�#���V=�� ��=N2I��@�= ��<�� >O����>GǪ��n齖�����=c�==l��V��>>Y��Xg9�2ʂ<�ӽ��H��҆;�o=�6�=�a=� ����=�u����
> �%�\C/>.'�=Y�Y=D��=���#Y�^����0<��� =�ɖ��y�;j�<�H�GͲ=�.��䉼6M��t���Ľ�n��=��
=�ۻ=TU*����>���#��<� r�ָ*>q�M>RΚ=�O> �I��@� ��=��s��L~�q <�m��<�)�vw=��;=��>��L>^j���n>˭�>�P��n2)��'3��$�>M�@���"<�θ� �=��<��B˽NU�<];�=�LQ��m�1(G�P��>�8�-�>f�?=���=ڷ >��^=q��=~p���8_��
>¦=YI�<8��=:�D���_�Eִ�T�J��s>���=��Ž�4=����I�z=׼�=B�H��L�<�X�=)��<�:�=�˽6�A��a>�:����>��=3�2��zW��X��jQ��g=z,�=t~��ь��R>�C�=��1>��[��P��8>!^>!�����˼յ����{@e>[q��ڋ�_j��{��}�<��e=�ܤ=�������=�$J����<�3�=����s�=�0ݽ"��ym��H�'���żk�j=9RW���=b�=2����R4��:�=v����L���'=�nq�D����h��W�>@��mK=笧����8 ��jE8��>j� �*�>I;&�b ��,�����t��]���%k��O������"6��������*�� �=@>�<��=+ #=�|�<y� =+���R��+F>zv�=L��= /��dF >Z����*2=���m6)>6�7> �ϼ�}y;fB꽚�.���A=�:�= ���B��;g�<�X��|c{=��x��Z>Xz�<��m�i[���H��h������ǜ ��X��4b_=P����(C��N��Aw=�:�=��2�7ǽ���7��iL���뽾�:>05�<l;j>��{��=D���o���s����L��k���Zͽִ��,Qg=x�8���f�rb=鄏�9}��������=slq=|o�=렽� �=�ۻ��!=��Y����7ýE��� ��S� >~簽$iὣ��<�5�<�Qɽ��"�"M9>ร=>�=�R3=�>龧=U�\=�yC��� �4�������Ӎ��Bs���m='=)��=h>�t�<|N}��1A�;�q>()�\��IE��˯^�Z.7=�4T��@�=������Ľ��㻅մ�%��=wn���>�1@�%;>��>�b�;5�>��=��<U$�=*跽�?������
�<*����D�<[�C=�>7F��V���y�=1`&>=w���>��a�չ���c��E�;+1���"�<�g9�{U)<�<���=m��<Bh#�O�ݽ2%>w�=��> �=�L >XB�=0E��E�=2�=�p��wt�"���Dz=���=���= >�R =7�<�� >�AX��(;W׽W<O�����q�&�R}V>5E�=bU�<�飼���=׾���7������ ��=�6�<��=m!����=�"%���w�;}>���=W�,�=[�<�7 =��I�k �<Н>��A�<��=�/0��5T������=�,]>� )�Mk]=t[�=�0l�����{��������I�,�L�GI�=~I>�ד�8�K>�7�=OH�����Y�����=U��<�d>t>�\���D,>J��C�&௻P?>Bx����{>ӆ<$U ='>����=z��<�V>0�<�(޽򌆽���{?�>lv>p���(ڴ�����N$f�
�P>���=/�� � �8�=b+C���=��=���W�򽠩�<S܂�[j<�'�h>:@�=���El��?>��>\�Y=2t�=զڽn� =g�>k.�=L�H>;r��)f��x��=���� A�5rλl��=S��<8�0�_��w|�=<ҥ=n�y=k=��n�Ʊ>�5�Ĥ=>���=�S>1�;{Q_>�`V>I�콺4\>�=f'�<x�=���<dǻ=~2���6�<�C �nFX�9��;ޘ=g�ڽ;)׽�F0;d��⦐<k�2�������齥4׽��<��f<��=�>7=��f��!�=��v= /����=��*�pX:>�$�=�/��p�)>��7��s����J>^�=�ׄ={^>�6�=H�ԽA�b=�v�=���=�*P��N���2�D��=X�>�,}=�aE���I>�E>�GN=�}�=�A���
>V����\�<�1E���T�_r��J->F�ݻq�ʽ�����Q�7�E>��J=+��:���=i9���-���f=;>�/<��)�=��V�ד�������; >�>���cӽ��������=\��=:$�<�̺���<k}>��Ƚ$?����>��=$v=���<{y���g =��=������k�]��em�7��<���
t+>�������> |�>#�_>�
|>P��O}=�Ϸ�-�`�=� �?�n�%���L^)��z�:3;���=�����=�o>=�t;JE�=��=RH�=��=���=I�g=&������c�F�m>��=��*���Q�& �T,+��0I�ޝ5����=c&�=l�=��ӽ��D>f+ ��Ƹ�&|c<�����`�D�ۼ�,>� t�J��<�*�����<� �<�����b=X��=�C��ڣ;G��=�u��GX<�-��=�/6=�)F��w>�M)>���=+m>f��;:C�Ԁc=��O���s����=>}+� ����o>-�K>]&���O�=�B�=ʸ�=$���R�L���D���=���.P=��2>\�t������3�'�=�w9�fM�;����F�=dk�;�=>��=�T������&�[�<� />�m�b�=�����.��b7�'z>/��<l==9FA�{0>,UA�����K��97=X/u���2�[σ�K:>KK�>��=��������+�=��b>����4�<��V=��>�i�� �����E�'>�^6>� �=V�!>9��=-�$����<AA=��P����={��=������=�b��:�]�=�<h<��O>�3��m=ܛ����Q>PF.=��Z>=�2����=�z<L2+����V2>���=q��=
C�>��j>��D>#��<h*=��ʽ��Y�н=8��W񻆂6��ǽ��]<Q�0>_\ü6���V�M>nx�=�u-> �:>n�.�������-����@�=㟂�6��=������>it>�f�="���ؗ�>�Y��hAF=��X=��]<^ì=e������^�p���<��U���T���=m��=�����*n��A>�B��'�SZ7=�m�<tcg�����;ѽ/Y��9� >ͨ����,>�nc>��*��"H��t��fk.<��h��� ��:n�ɍZ<����9��=�����X�=:O=��=�����O�:��
>�D >�3Z�)�߽�m�=�Wk��#���\��Z>=[ӕ<��>=�&��#�=�*�=*⽸*>�6�<��� �>�.G��E�<
=`�m;��4>�+����=�.���%�=/�����G�MB�=��J=
�����[=�&��^��=r3��h}F=�CT=�����
=�̡�s �=�ֆ�8�6=����L�>�TU=&��=Q���W�!�B|Ǽ5]=���@=%)�gɥ; ��=m��R<ܿq=^o����R�������<-�E�"������h>]���u��r����=����0�:�W��{�
>f��>�NS:��`�dc��L��=
mR>�7>�m�U/(=�?1�B�%=����y[; ��%>��4<��m>��ở'h�:�@=�{>*�0�
��\>�w�=c�1=�7ݽ_�ٽU��=AнɃ�?��=��D>k�&> 'ĻO����-={Hm��e%��g>����l3=�= �J=��ýٗB>�c>�]�ZHF�`�8>J�=���� ���w�=��U=eKH���>��D>������=\<_O���F��"���N��vB>�?$��M��'Ȼ,��� >�pB>��������r= �:\i�>���>��;���I=�Ĭ=��a��i�>��t��I}�R��=C�A�Wv?>�|׽v��;��>��d=lI���J��ƹ>"�%=�s6���h�D=�X��D�e>^I�=��=�����#t=d>���%�нE�=e�������?�<d�<���=̬
���=^㐽4� =���=���<E�A�j�C��)>��F>XR�= ���R׽���&�=ʾ߽M'>cQ\�Ha�^f�=+l����;z >�Nü�n�Ϳ���D�=�F�=�A;X����/ ��X;��=�즽�
��6���$��-N��OP>�:�� �M���k�C?����[N��
������<Ҷ�=(˸����=�T���p=_@����=�v!��4�<�=S�&���4�=󋸽縹=&C'>z��>�t=���=0�ӽ5yu��{���G=L�)�^7=<[`��)����i��`Z�=\xq;�g<���=�ѻk�=��7>�j����{>�I�=N ½�=tA��|4��Y����<�� ��b�<�
=lݦ�L�e=U�����н�>8%��q��=��>�I�<F�U>�6�A�j=��]��=����v���l����,����=���>v2)=Dw�<�1Ӿ�^->� =~�sD/��
�>^C���7=���=�_���=4>䮰=����g�(�0r�=�m<�B����<�����_�O�o=��=SuA�O�g�jk�}C���=��t=<6A�a�<}Q=:��y>�0��M��Z���:l����=d`7�f�v�l���������#3=�� :�;���=���<8��=A6��m�:
|�=\�X��
�>⪾=ٮ����+�>%V�=]�=Q�->�ؽċ=.��=Ҥ>�>��'[i>�!���c=�@>Pj�;XOl=*��� >~b�=�W2=5�>�����>3�C�\
�2�н�����-<>z(�|��>i��=\�H��yi=�{N�FwU=�M����轹���'Y7>U�>���=��> ��<���i^��v� >G����}��z��϶:L�^>��켣Y��7��O)��=���=�a8���
>�F�=**��o.���>�m=@�=���� >"4=�Ʉ=A,��,du�;�/=��u��3<�=o燾�'�b; =I<�=R��;�-�<Hv=���<���=�{+���T�)�b>�J��S>�C���j�K�=�NW�=n�� �=G�F���� Tk�ީ���L.>�s���[=�b�<=��=��=|��<�b����">{|���,><��=#xG��R�����=�('>���=���c`��t��=e9�;3��6�?�\��=��P<Ҡ>E�"�ӵ=��>��R=-mO=�c�t[=��Ͻh$>���=���=H�O>�Z�����=��a>Dx������ �b��(s>��m>uI߼邤���
����=����g�=���Z�(=V*�=<J >��.�&55�f(��`^>a���nI��bf>��>��U>�*��F>��&='P=F.Ƚ�f�����=�>εǽ�oR�'>��Kd��\~�=�};�/r=�vż�4>5߽�����`z>���=�+н��Ľʋ4>�/>cvY�ٓ>i��=��>�� ��q$<�3q>�?>q�ܽb�N����ȣr=|��=�������}�>���=`���F==O[�ˈ��J�n��M���c4�ߓQ��;�;�ሼK�%>�X�>����N=h��=��M;B,n=��8<�9��ܮv��p">�8���ν����m��=t>�={���ue=�%C=��=؛��p�=^.P�CO=�NJ=u^ �۽q<�� � pS�`#=���g�������T�<C��=�s>�c >r��Gf»��6�T9�=R�=����I�=�Dk�{�����b>OȺ=u��az��9ڽw���)]<��=�#>ĥc<����R,={�p>����}��( <8A��9�q>�>؄�>$�#��_M=A>�u&<ԛr��iZ��5���cN�6"i�Dv��Cd�=f����ۘ=�6�=ZC��UW��=ͽ���;���=������<����x0�<�(E� �i
l�P��=�Lӽ��^> ��=U�;he���"˽ts�=j�8����zV!=��#>�aB�"p>�e�;���v�=#;��Zu�=� >����J�=9P;�j��Z��<�;�<ξ�=ըA�DF�r��@^T�*��=W�ֽs�ý�J���̡�ֻ�<䭭��%��U�J>�;�<���=���=�Y1<-zR���z�S�6>K��=�h0=����ℽ��H�� 缪#?� d��tt���h<��=��=��Խ�������G"�N����Э�@O�:H��=�4D��N=#n��Дʻӛ���)=�>�)���������=l�=����qL>\=|=��� ���~�<���</婽��:��� ��M���j<�݉�\g6�}Ғ= ��=G�,�����T�=ޯ��W�=�pf���ͽlţ=I���q�&��:�uY��"��| ��s�=�l�����=w)���½���c�=��w�˅��{.'>]V�=5�c=>���F�<` �;��T������Ut�����+o �$Q>>�>!}>�� >[u<<�lb�x^��Ƚ��F��=_�A>�I�N� ��,�<�˽��=W�'>����q�=����2�>� �=%�����B<o>����<�7 ��2սU�콘>��b�=
�z� l�\Em> #0>���=Ǖ=�4�rGQ�:E�� �$<�?>h�b>�=\�ԋ�JK���7>�G��� >� >��> 40��&�=�R����4<���=��5��u�=���=��y=�>�����/=ز�%��=����V��g����v}<6��s'��� >%�m�g�����&֭=�̣�Q��<3�轳7����<$��=��>#֬�WD!=�"O>�$L�I#�=���<V`=<�[�3U;;����U����)>�&����"=�;�<�A>rv��3�*�������н�z���D>���=+����I0=�=[�@^<��Pw=+� ��AK�J/>�������= �*���v>\�y�x�۽E��=[�<��7=�k�=h� <ђ�ND�=U��P�C�a���=ͻκ�k>9*F��l~<Bަ���R��~�=
���q�=�Ǭ��L$��Z��р>��m�p�c<��=k��J���N��� k>$�^=ab����A�Ѽ̽
e�H>�?=-�(��m��a;�=v�Խ%b���E%���>8`�>��l=���=?i$�E���5>�{!�漲��<���D�;�U�`<�ꃽKѽ�=� �=�J�)���ʗ=
����޽� ��d#Q>���'|��J�������1����=Zi4���=�U>8��n��<�.��X���>>�<>c�\���΁�׳̽�r���@���=�頼C�O>����&�=L�{>֕�<X�D�z��<K�3��c�F;�-`Ľ�}�<uf�=� 4���2�^ǹ=h&>ȧ=�;^꽀qѻ^~��7�S<\:>럭�n����ɥ=a�[��-�#��=e�>��=m��>����G�=� �<��I�O2==�%>TUͽ=��I��=š�<�ь��$>}_���@#>��U<bϿ��nr��ש>���=sB>�νފ����n�"�Ľ���=5�=�$�����=KI�5l��]�J� ��d�=g���'c���+��t�=e�����='D~�?*>��2���] ��3�9���ӳf��W����w�2��<D�f���4=p�Q=0����A��$9<����H^�=p�+=�� =��������[\> &S��޽c�Խ7�l�Z<�Y��<�x:����92o�fp
>bF�=Ѿ�>o�h=��5�eI>C�=�T(>�YC��ࣼ�nX>t�;<y�s�A>�|r��9
Ǽ_�ݼ��>���=d��=F�۽�h�J�=� =���;�@L=R����%7=(g=v����=���}�ּ ��[��<� ��YR>�/��|�=��">��=����b��r���2��z�=�4�nq}���.��^]���k=v���t>͎��L7�>]��K�8��U��'z��-ѽh��=�}�{�CPa�%K)>�,�=�
�<�����!���__>]�>�=6ţ��M���R�=���>�QN�'A)�p
=�IB���(>>�4�Ho�>��s=��)����=���;� �=Fᆽ�&P<�J�<s�=�>����i.(�a�ý�P>�� ���=d�=\Jk=��=��<��3�����(��������=��f>�qq�Z6=YK!>��%�u�u�k^e> )o<^՚���֚ >��!>
Ѐ��=�=�򽱘 ��aa��۩=���<Y�>��Ʒ<$�"�^�>�m4�R���$�=��+=��l�HX7���A�E���+>A��<�H����=�����u3>up�;#� <^7�=�'>f��C� <,~>��1>��,=��=��=
=`8_>)\�������|�>[�;2u9<Jw��dDR�Ĩe��ԁ��l=!��<�G���O�=<Y���v!>k5j��G�=�`�=g���k�=o�
�xRA����=��6=H!���6j=^4 >�>_dW�i�"�ouq=DO��jP=&��=M+���'��.�m����@=��R�Ǔ��9��=��>i~�<@A�<�>EU >ؠ>���=`��<TG=���YW�<���!E���G>W��=��T�lV���g��d�Y˂=��=��=j�=@�+�<̗�94\��]a�=��=%�n���=�ŽH`���'��� ˁ�� ͽ��=��=�WE<�$=��=�A�=h�?= ͽ&e�4#ν펠=��<c�3>�0(�EW
=UQo��>�� =�O�<gc>�D>s��<�׽?6ȼ�7>�0�>��Խ�R�;�CL=̓�<k :=�s��tVr�v�8>�-��Ø���mg>�>G���.��Z^l��Ǥ;8�V>��>�Kj<t$<2�x�V9-��a�<{�=��]�ڜս��=����B !�ǐ�=���=�֞��߉=��=}���X�c�Hv��Ԍl=S����`���";�ߞ����"=d}J=��C�+I>�M�.�郯��G��GP�=ֈ��ͣ<=P�=��=us�=�a�<� O�.�'=��#������9�< �q�5�g<���=od<��=�'��0�$<��=�xc�RR˾�=C0��B>����t�6=.����l�����6�>��ս6>T�%�Pz�<i�=7ȩ�6+>^>���=�����K�>8&w<�V�:余�� �N� ���> n<L�&��4��g>��6�6@��7����9�� =X<u�2���û�dt��=jv>����yu�<��;�Ec�=�]I=�,�<}�Խ;^*���>�Υ�ٌC��jm�4/�堣�ɛa���=�G����9�3�r�� ���нK���%S�=Žݽ��=%�6>���������>��o�=�A����=��=�+=�~5���D>�/1�O@>�5=.H���< 4���K��+>�[Ľ �;>����@�>�� >��N<�g�<t_�<�Ac>�\=��ڽ�C���<^��= '3=�P� ��=�=�~�=̼">��!���ܽ=�^>'[P�k�<���=��A<�z@>Q/��D��=�@���.�X�����ԽιZ�3��=��+����<�� �tS�;~��P��ja-��ڴ<VBj����=@�*����<!���k���8ޑ<4̫=�<�WIf�=~��ݽ�(�=tӾ��=d���[�<� �=��c�Dʏ<o�J>�d�< ���z�k=�^�=b{>���� ,<.A=3 ;�i�=��<��z�<��g�2ӻ.��Q4T>�v�=|.�����`�2= MW=rỐ��=+�ѽҞ]�#��8 H��<S�����-��=����PA�< ���Q��=��=�C=#=σ3>h�A���m=��Ľ�6�����=f��=��:�!��Z��=�7ܼz;=Xd=ʪ��L�>��_��'ݽ�a�=����'��J;�<S!<��;j����B>=�=P�}��!k�TEԽ{C�6��</�.>�W��<�F>���� ��*�� K=�L�ͭe�9��<�Ht�v[ڼfG�>i>�<v�=v%J=�- >H�=�l�>-SC>W�<K=G�l�5>�J=�j���,�?=��=v_}2=���.C����h=`c$�RM��+>gXؽ$]�=Fط��#�<��T �=&p->���c��=� T<u�E��v��`��}�\�~��=��<���e��X1��폾*������,����/=�(=76 ��%��Xy6>�R�=;{��L������P>��>%����3񽨰g=�O&>���=_D|=�?>b�= ��>bX�=��@=:�����;�]��p��K�2=�!���;������⽳'����M>��>?�)�>����Z =`��Օ>Q���w7��2B��~���}�\`%<%n`>��&=ROX=�����<���p�u<%�=��޼�@�;��>A���ސ=��νsP>e�=k�s�UG(>�X=�/u����<��n>/��<����q��= ���f��樏>mѐ�8��f6(>ͼ�<�� ��[>�2Y=ɯ�t����%?=�pJ>��v���S�Yh��i'=�e�=U*����<L߶<4�`����>�����N=E�=�����>E�j< �MϚ��K�=N��:c':<�v8y�[�$<u����?���1=(︽��>�J$=��e<��)>D����Jѽs��=Cký�u���E���k�=!�->��`�4ꀽ�y=���ݼ#`>RM
�4`>+��<?�� ��������=��2=?��=�Q�C�ڼ��ҽ�*>���<��8=<���~9�=!K�O6L>�C���6��Ʀ=3-t=��*>��9�o� >�n�=�����s�=���P��=�@D<����;�=,�">>JE���P����=���<�A,��j�;}��n3<�߽y��=�fl>3�2>B�V�-�w<�`+=���Ɲ �(e��.�=~P�<�n�<z��=_�$>��>v=@�(32>0�7>�cI>,�߽�1���̽� >4c1��O������:��<�P>���=N�='�T9�X�=�s��N�S�� V�h[t�L�����Ƌ�?!�q�t�J��5�k�`���y��ew�<���=��>��=KO=������<
At�;��<�E�W�X<=�9��DA=�8ƻ���=[d�RY<[��=7�=�y:=� O=x�s>��ȼ��>�>���<��Z>4N�VV=z��=��伕�>?MK���q�0���I�� �V�W�0>\�9=U C� #�=��O�M��=�����3>0<>�=�2׽Il�<�an�L/� n�;��ƽ< u���������ǽ��O}��%D�=gk�՘�9���Tؽ��P<���=�ʽ�D5>/V|>���=��3���V>�jR>o��=�ⲽ��=�w�= Ґ��g>�:��1��r� =6ŋ=���:����}�>Y�W<���;�����]���Ѱ=�җ����<?�ػ72���L��xKӽ���=p�=���_��f��=>'�=E2�<P>���U���������;54>�kV��5(>0{]>������V���s��=`�#>̯h;���n_a=��Z=�[�=.Ͼ�.L�=�Ϻ=
� <y�=X��rNK�4=��q����M �^��;�g޼�;=�>�1�%�����+�}�;{d�>��+��=��="��Y���]���U�=Vr��=!�*7%���i>� ��uE��ť����l���=��&�^˸�������=�)�<C8�=묒�(h�<�K�=eз��$�=�ǰ���=�>���U�Z� ��$'=� �=J̘=�c$>�5�44��x8M�R��=Orn;N��=HM۽�=��� ���W=D׼��8=���� ����<K�ļ��=����:��=ˢ��-������=6׼=+��=�E�Yؕ=\���=
�<2���=���R�����n�� !A>���<��~��,���>}��&���'{:�� �1=5�=�0��P��1>ɀ�<��<�z3��t����>|Ͻ ��Y>Hٻ=�K>���>F��=�t <=st<h�=�f;+���ي���>pN)��H= �=Y�4��Z*>!�J��E_��э=�Nl>��H>Mm�<�����ؖ>QG=CЧ��3 >�g�������������M>���u0彃��=%v�A"+>BY=������݀+��q�=��B����:�L_���=��=����W<���=\�%=��3��k=�ŽM�P==�:����=����4��� (����>�Ԙ�*� � ]�>��;�^�;�s��~`Y�zJ �D�Y<��{�/�ZW>������>��ͻEQz��s�<M-<���;gg=��m<�i�=W=�.a=�a1>䟀=��= p{����<�����ft�z6F�1��h[*>t����[*>=���ȫ�<e6�=@�/�/&.=��>T�=7��� �)> \½ϟ�=�?�=Ł���|w�"Y)���<�٭�젹��4�=QyW� Ƚ�Ɇ�FJ��6l(�� �Lk>�=b>�8.����>��>�ۖ;�]T���ž଑>3����I1�s0f=ȭ ���O�L�F���=���m�J��0n>��G��Ò��5���S�<
�=Uﹾ�۵��+��˛�=�J9>���=x���������=X����b)>ZO�=n'5>Ǜ��dґ����;A���֜ �%oȽ4�;��=�����=3�S=��?� ��=ld��wV>��
��D�=�(�P�>��<���=t3>?��>�N�� "<>-����i=����>
>nS�=3�=�M�=`;>a���ๅ>������=��=��>�3U>�Jμ�=$���f=ԟ�=�T�= \9>����f��=!+�>��?<�ل=,ﺼ�-���M�=7��ԫ&�����D᯽C���� �=��<~�ý�t=(�$��.<ޮ�� ���Y=��ǽ�MW��Q\>K�=�Q�>��e�T�=��?=g ӽ�&����MA�+Ԯ�3>&��;�<o�x���g��J��l@1>�P�;/=�~�< ��=���=�;9=Y�ۼ�)�=k甽�� �9秽5�(�^��V�݉=���������0;�;��=��z����<�b��oJ�k�=H��=�a�>�t=���C�6��f�=2���|p�=���=V��fx� ��=�h����=�%"<P>�o��{ѕ='�>�v�=�h�>�r��7S�/-½�y<ґ6��辚Ƴ=
`3�W|��u>�j��Ά��.�=6Y>� `<�l�<�1=��:�������˔����>��=���a��<%�H��f���=�-�<�ҽ���<ҷ��c��=V�M=�j�>SjP�9���U���ֺ֨A1D>*��=�Fz=�e=߸���=bݽ��M>�yr=5½��=1v%>R�b�{�]��)� ����<F�z>��=je�=�H]=P�����=���= .��������U�>���j�=?}���RR���=���1=�}��v0Q>Ѡ���\A�5扽����G*/<>����W>�S|����<� ��f�=�r�<��-=i̇��"���:=�X=���)�f�f��<�.��f=���<�ꃽ'�I>! ����>W��=טźY�Z�W�1<Z��=�׽��U>k:=bb=(ڵ�����=O==�����!= �d�u2��mJx=�V ��W߼r�>ƽ��X�@��ν(C��� >%�N����;l���Gm�=웍=9�;FI޽`Q=�怽�f3>�Z�>�^�=U���N+�Z��=��W=7��=����IkD�oj�]}��Ѝ�p���)��=?�Q<�0>��=޴��i*/��l;:x �=D��=nCW��D>�<d�@�(=��[��HԽ��Ի�>��=2 ���^�� Y�=Q��<XIz�6�ǽkK�=񿸽)����(<.�;_��=�m(���� ,���=6�[>�,�=ʾ<��[�<>��R��Қ=s�U��5�;[�=`�>�T���g
�ϫ�>{ �;a���Ӫz=N�;�z�q��������=�/>�+�D�r=f�=�C�*��< ��;\�3=څX=��=rĄ=Y|�v��=�D�>M�1>�<���� ��<���=��(���=�N=��ǽ�vY>�-�=��&=[�>�畽��=�%�=���=�6<�-�f������Ž���ź��N>���¡=��=贱�f��<@C>ּ˽>%<�q�R=h�F����߽,A��l�H�R��<J����3x����%>t>h >v�S<��>H=���p<�i>�LG>�I�=� �<�1��g����#��(>���=�>�|l�`X�.����#��g=�H�=��\�i&���/�tʸ=�B=>pc<�8=Q2�=�� ��Z��'�����=��>!��UVq> o���=��i=���<6� �5��=
����II=V}���5
>��I�.�W=Q0�q7��;Ͻ��5�<����'/������a�<�@���ᘾ��#>������ �J;->�n� �.�OGG��v��刾�W꼼�����>�p����=l遽�؇�T8<�;>���=#,���=��==�}���C��6��o�p�M]m=��A>�B*>F��/~I=�$&>If����,���>B�=��=C~����>�vK���>#�|<k+b���>6�ݽ���L��慉���C�n��<Ļ]>8��<`c���_����=*o�X}�����>��s��9s>
[�<"�=nx>��=tR]>��q=���=����h�>��>E��6"Q� tټ������i>� 6>ԮN>��
=�&?��&8���b�Q�`�C&
>b8�=��'�M��=��= �'�r@u����=�K�>��]��$������Z��2�%�h@��@�y��mE��o��?��t�W��j>-�D�!聽g�@���=�+V���C�A�ý��m>��6��!V>�5��B��ͧ���MH<��0=:��%hٽ ��<ԗC��� <q=;�fWv�(�<���=d���ɂ�3�
>
�������:����>��s>k�B=w�t����N4�[[ >��|;�\�ͬ�ڥ��6=^c�=��2>�zO=8W�=o'��2��<�������*SH=\`��24>���=c�2�=vq�)�>��j����~�Ƽ�����!<���s�->Ϗ>���xHY=�H����>�@νX�&���r=�=>U��<Δ=��=u��<������2���;Bf��p���/�9=��<�Z�>�k�=�#�����<V2����I>-5 >���<5�(���X=<]h>����G��>"<��>?L_>$Jr=�B�=J�.����@�K��`��L�����f�<�����GU��Y)=���=g:����="ړ��L�<�44��m<���=\f���<4>���=��]�*����=y�)=#�*��S{>�N�=��F�p�ͽ��׽l�>W�<�%-���}X��M�=y#
=σ��]�<Ȉ�<ʺ�>6��=K@⽂�����==N�6}�>���=�Ҽ�[A����=���=��B���=�-�Q�J�4�E5��+����!�FPG� ���/�='q9�⣧���->��>�8��$�>s3=��`�<D>�QҼ��'>)�����d��/C�������˞�� =�ŕ<#�:>m�e=8��<F�!��>�~�Q>��W�E�b�Z�>t�=��L��������>J�^����3�%���U�a�=ND�=�<���Gg�7�,;->q"�=�o��s�k=��=����5Z���=��@"����={x��Z��l=��f���=����R�=�h;#6,=�5��v�P�)(��q����Խw�
�jf�<�/�>�_A>����2ؼm4�=�9>e@$��H$��?X=*Bversion_numberJ@Z)
vector_observation

batch
5Z#
action_masks

batch
b
action

batch
b$
continuous_actions


b"
discrete_actions


b
version_number

b
memory_size

b#
is_continuous_control

b!
action_output_shape

b,
continuous_action_output_shape

b*
discrete_action_output_shape

B

14
com.unity.ml-agents/Tests/Editor/TestModels/hybrid0vis53vec_3c_2daction.onnx.meta


fileFormatVersion: 2
guid: 9f774b4c578c3435da77d2831db84105
ScriptedImporter:
fileIDToRecycleName:
11400000: main obj
11400002: model data
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 683b6cb6d0a474744822c888b46772c9, type: 3}
optimizeModel: 1
forceArbitraryBatchSize: 1
treatErrorsAsWarnings: 0

70
ml-agents/mlagents/trainers/tests/torch/test_hybrid.py


import attr
import pytest
from mlagents.trainers.tests.simple_test_envs import (
SimpleEnvironment,
MemoryEnvironment,
)
from mlagents.trainers.settings import NetworkSettings, FrameworkType
from mlagents.trainers.tests.dummy_config import ppo_dummy_config, sac_dummy_config
from mlagents.trainers.tests.check_env_trains import check_environment_trains
BRAIN_NAME = "1D"
PPO_TORCH_CONFIG = attr.evolve(ppo_dummy_config(), framework=FrameworkType.PYTORCH)
SAC_TORCH_CONFIG = attr.evolve(sac_dummy_config(), framework=FrameworkType.PYTORCH)
def test_hybrid_ppo():
env = SimpleEnvironment([BRAIN_NAME], action_sizes=(1, 1))
config = attr.evolve(PPO_TORCH_CONFIG)
check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=1.0)
@pytest.mark.parametrize("num_visual", [1, 2])
def test_visual_ppo(num_visual):
env = SimpleEnvironment(
[BRAIN_NAME], num_visual=num_visual, num_vector=0, action_sizes=(1, 1)
)
new_hyperparams = attr.evolve(
PPO_TORCH_CONFIG.hyperparameters, learning_rate=3.0e-4
)
config = attr.evolve(PPO_TORCH_CONFIG, hyperparameters=new_hyperparams)
check_environment_trains(env, {BRAIN_NAME: config})
def test_recurrent_ppo():
env = MemoryEnvironment([BRAIN_NAME], action_sizes=(1, 1))
new_network_settings = attr.evolve(
PPO_TORCH_CONFIG.network_settings,
memory=NetworkSettings.MemorySettings(memory_size=16),
)
new_hyperparams = attr.evolve(
PPO_TORCH_CONFIG.hyperparameters,
learning_rate=1.0e-3,
batch_size=64,
buffer_size=128,
)
config = attr.evolve(
PPO_TORCH_CONFIG,
hyperparameters=new_hyperparams,
network_settings=new_network_settings,
max_steps=10000,
)
check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.9)
@pytest.mark.parametrize("action_size", [(1, 1), (2, 2)])
def test_hybrid_sac(action_size):
env = SimpleEnvironment([BRAIN_NAME], action_sizes=action_size)
new_hyperparams = attr.evolve(
SAC_TORCH_CONFIG.hyperparameters, buffer_size=50000, batch_size=128
)
config = attr.evolve(
SAC_TORCH_CONFIG, hyperparameters=new_hyperparams, max_steps=3000
)
check_environment_trains(env, {BRAIN_NAME: config}, success_threshold=0.9)

81
ml-agents/mlagents/trainers/tests/torch/test_action_model.py


import pytest
from mlagents.torch_utils import torch
from mlagents.trainers.torch.action_model import ActionModel, DistInstances
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.distributions import (
GaussianDistInstance,
CategoricalDistInstance,
)
from mlagents_envs.base_env import ActionSpec
def create_action_model(inp_size, act_size):
mask = torch.ones([1, act_size * 2])
action_spec = ActionSpec(act_size, tuple(act_size for _ in range(act_size)))
action_model = ActionModel(inp_size, action_spec)
return action_model, mask
def test_get_dists():
inp_size = 4
act_size = 2
action_model, masks = create_action_model(inp_size, act_size)
sample_inp = torch.ones((1, inp_size))
dists = action_model._get_dists(sample_inp, masks=masks)
assert isinstance(dists.continuous, GaussianDistInstance)
assert len(dists.discrete) == 2
for _dist in dists.discrete:
assert isinstance(_dist, CategoricalDistInstance)
def test_sample_action():
inp_size = 4
act_size = 2
action_model, masks = create_action_model(inp_size, act_size)
sample_inp = torch.ones((1, inp_size))
dists = action_model._get_dists(sample_inp, masks=masks)
agent_action = action_model._sample_action(dists)
assert agent_action.continuous_tensor.shape == (1, 2)
assert len(agent_action.discrete_list) == 2
for _disc in agent_action.discrete_list:
assert _disc.shape == (1, 1)
def test_get_probs_and_entropy():
inp_size = 4
act_size = 2
action_model, masks = create_action_model(inp_size, act_size)
_continuous_dist = GaussianDistInstance(torch.zeros((1, 2)), torch.ones((1, 2)))
act_size = 2
test_prob = torch.tensor([[1.0 - 0.1 * (act_size - 1)] + [0.1] * (act_size - 1)])
_discrete_dist_list = [
CategoricalDistInstance(test_prob),
CategoricalDistInstance(test_prob),
]
dist_tuple = DistInstances(_continuous_dist, _discrete_dist_list)
agent_action = AgentAction(
torch.zeros((1, 2)), [torch.tensor([0]), torch.tensor([1])]
)
log_probs, entropies = action_model._get_probs_and_entropy(agent_action, dist_tuple)
assert log_probs.continuous_tensor.shape == (1, 2)
assert len(log_probs.discrete_list) == 2
for _disc in log_probs.discrete_list:
assert _disc.shape == (1,)
assert len(log_probs.all_discrete_list) == 2
for _disc in log_probs.all_discrete_list:
assert _disc.shape == (1, 2)
for clp in log_probs.continuous_tensor[0]:
# Log prob of standard normal at 0
assert clp == pytest.approx(-0.919, abs=0.01)
assert log_probs.discrete_list[0] > log_probs.discrete_list[1]
for ent, val in zip(entropies[0], [1.4189, 1.4189, 0.6191, 0.6191]):
assert ent == pytest.approx(val, abs=0.01)

44
ml-agents/mlagents/trainers/torch/action_flattener.py


from typing import List
from mlagents.torch_utils import torch
from mlagents_envs.base_env import ActionSpec
from mlagents.trainers.torch.agent_action import AgentAction
from mlagents.trainers.torch.utils import ModelUtils
class ActionFlattener:
def __init__(self, action_spec: ActionSpec):
"""
A torch module that creates the flattened form of an AgentAction object.
The flattened form is the continuous action concatenated with the
concatenated one hot encodings of the discrete actions.
:param action_spec: An ActionSpec that describes the action space dimensions
"""
self._specs = action_spec
@property
def flattened_size(self) -> int:
"""
The flattened size is the continuous size plus the sum of the branch sizes
since discrete actions are encoded as one hots.
"""
return self._specs.continuous_size + sum(self._specs.discrete_branches)
def forward(self, action: AgentAction) -> torch.Tensor:
"""
Returns a tensor corresponding the flattened action
:param action: An AgentAction object
"""
action_list: List[torch.Tensor] = []
if self._specs.continuous_size > 0:
action_list.append(action.continuous_tensor)
if self._specs.discrete_size > 0:
flat_discrete = torch.cat(
ModelUtils.actions_to_onehot(
torch.as_tensor(action.discrete_tensor, dtype=torch.long),
self._specs.discrete_branches,
),
dim=1,
)
action_list.append(flat_discrete)
return torch.cat(action_list, dim=1)

107
ml-agents/mlagents/trainers/torch/action_log_probs.py


from typing import List, Optional, NamedTuple, Dict
from mlagents.torch_utils import torch
import numpy as np
from mlagents.trainers.torch.utils import ModelUtils
from mlagents_envs.base_env import _ActionTupleBase
class LogProbsTuple(_ActionTupleBase):
"""
An object whose fields correspond to the log probs of actions of different types.
Continuous and discrete are numpy arrays
Dimensions are of (n_agents, continuous_size) and (n_agents, discrete_size),
respectively. Note, this also holds when continuous or discrete size is
zero.
"""
def get_discrete_dtype(self) -> np.dtype:
"""
The dtype of a discrete log probability.
"""
return np.float32
class ActionLogProbs(NamedTuple):
"""
A NamedTuple containing the tensor for continuous log probs and list of tensors for
discrete log probs of individual actions as well as all the log probs for an entire branch.
Utility functions provide numpy <=> tensor conversions to be used by the optimizers.
:param continuous_tensor: Torch tensor corresponding to log probs of continuous actions
:param discrete_list: List of Torch tensors each corresponding to log probs of the discrete actions that were
sampled.
:param all_discrete_list: List of Torch tensors each corresponding to all log probs of
a discrete action branch, even the discrete actions that were not sampled. all_discrete_list is a list of Tensors,
each Tensor corresponds to one discrete branch log probabilities.
"""
continuous_tensor: torch.Tensor
discrete_list: Optional[List[torch.Tensor]]
all_discrete_list: Optional[List[torch.Tensor]]
@property
def discrete_tensor(self):
"""
Returns the discrete log probs list as a stacked tensor
"""
return torch.stack(self.discrete_list, dim=-1)
@property
def all_discrete_tensor(self):
"""
Returns the discrete log probs of each branch as a tensor
"""
return torch.cat(self.all_discrete_list, dim=1)
def to_log_probs_tuple(self) -> LogProbsTuple:
"""
Returns a LogProbsTuple. Only adds if tensor is not None. Otherwise,
LogProbsTuple uses a default.
"""
log_probs_tuple = LogProbsTuple()
if self.continuous_tensor is not None:
continuous = ModelUtils.to_numpy(self.continuous_tensor)
log_probs_tuple.add_continuous(continuous)
if self.discrete_list is not None:
discrete = ModelUtils.to_numpy(self.discrete_tensor)
log_probs_tuple.add_discrete(discrete)
return log_probs_tuple
def _to_tensor_list(self) -> List[torch.Tensor]:
"""
Returns the tensors in the ActionLogProbs as a flat List of torch Tensors. This
is private and serves as a utility for self.flatten()
"""
tensor_list: List[torch.Tensor] = []
if self.continuous_tensor is not None:
tensor_list.append(self.continuous_tensor)
if self.discrete_list is not None:
tensor_list.append(self.discrete_tensor)
return tensor_list
def flatten(self) -> torch.Tensor:
"""
A utility method that returns all log probs in ActionLogProbs as a flattened tensor.
This is useful for algorithms like PPO which can treat all log probs in the same way.
"""
return torch.cat(self._to_tensor_list(), dim=1)
@staticmethod
def from_dict(buff: Dict[str, np.ndarray]) -> "ActionLogProbs":
"""
A static method that accesses continuous and discrete log probs fields in an AgentBuffer
and constructs the corresponding ActionLogProbs from the retrieved np arrays.
"""
continuous: torch.Tensor = None
discrete: List[torch.Tensor] = None # type: ignore
if "continuous_log_probs" in buff:
continuous = ModelUtils.list_to_tensor(buff["continuous_log_probs"])
if "discrete_log_probs" in buff:
discrete_tensor = ModelUtils.list_to_tensor(buff["discrete_log_probs"])
# This will keep discrete_list = None which enables flatten()
if discrete_tensor.shape[1] > 0:
discrete = [
discrete_tensor[..., i] for i in range(discrete_tensor.shape[-1])
]
return ActionLogProbs(continuous, discrete, None)

部分文件因为文件数量过多而无法显示

正在加载...
取消
保存