From 9273bdece7a07b95332881d8ddc6bb3fbfcda6ef Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Thu, 25 Sep 2025 10:55:52 +0100 Subject: [PATCH 01/15] 93% policy --- .gitignore | 8 + docker/.env.ros2 | 5 +- docker/Dockerfile.base | 73 +- docker/Dockerfile.ros2 | 2 +- docker/docker-compose.yaml | 14 + docs/beaker.obj | 3 + docs/clean_urdf.py | 32 + docs/macros_private.py | 27 + .../bcq/20250721123120/config.json | 315 ++++++ .../bc_new_demos/20250924112632/config.json | 216 ++++ .../bc_new_demos/20250924123612/config.json | 216 ++++ .../bc_trans/20250715154020/config.json | 216 ++++ .../bc_trans/20250721074506/config.json | 216 ++++ .../bc_trans/20250721074750/config.json | 216 ++++ .../bc_trans/20250721085238/config.json | 216 ++++ .../bcq/20250721135829/config.json | 315 ++++++ .../franks_stack/20250715152538/config.json | 210 ++++ .../franks_stack/20250716100129/config.json | 210 ++++ .../isaaclab_mimic/generate_dataset.py | 3 +- .../robomimic/evaluation.py | 206 ++++ .../robomimic/play_ensemble.py | 968 ++++++++++++++++++ .../robomimic/train_ensemble.py | 532 ++++++++++ scripts/tools/convert_mesh.py | 2 +- source/isaaclab/isaaclab/envs/mdp/events.py | 3 +- .../isaaclab_mimic/envs/__init__.py | 24 +- .../envs/cube_blueprint_mimic_env_cfg.py | 150 +++ .../isaaclab_mimic/envs/cube_mimic_env.py | 165 +++ .../isaaclab_mimic/envs/cube_mimic_env_cfg.py | 132 +++ .../curobo/curobo_planner_cfg.py | 24 +- .../motion_planners/motion_planner_base.py | 2 +- .../manipulation/beaker_pour/__init__.py | 9 + .../beaker_pour/config/__init__.py | 9 + .../beaker_pour/config/franka/__init__.py | 74 ++ .../config/franka/agents/__init__.py | 4 + .../franka/agents/rl_games_ppo_cfg.yaml | 79 ++ .../config/franka/agents/robomimic/bc.json | 135 +++ .../agents/robomimic/bc_rnn_low_dim.json | 135 +++ .../agents/robomimic/bc_rnn_low_dim_not.json | 306 ++++++ .../franka/agents/robomimic/bc_trans.json | 133 +++ .../config/franka/agents/robomimic/bcq.json | 308 ++++++ .../config/franka/agents/robomimic/hbc.json | 306 ++++++ .../config/franka/agents/rsl_rl_ppo_cfg.py | 37 + .../config/franka/agents/sb3_ppo_cfg.yaml | 28 + .../config/franka/agents/skrl_ppo_cfg.yaml | 80 ++ .../beaker_pour/config/franka/dev_osc_cfg.py | 114 +++ .../config/franka/ik_abs_env_cfg.py | 128 +++ .../config/franka/ik_rel_env_cfg.py | 65 ++ .../config/franka/joint_pos_env_cfg.py | 102 ++ .../beaker_pour/config/franka/pour_env_cfg.py | 132 +++ .../config/franka/pour_ik_rel_env_cfg.py | 63 ++ .../config/franka/pour_ik_rel_env_obs.py | 49 + .../manipulation/beaker_pour/mdp/__init__.py | 12 + .../beaker_pour/mdp/observations.py | 289 ++++++ .../manipulation/beaker_pour/mdp/rewards.py | 73 ++ .../beaker_pour/mdp/terminations.py | 97 ++ .../manipulation/beaker_pour/pour_env_cfg.py | 361 +++++++ .../manipulation/cube_lift/__init__.py | 9 + .../manipulation/cube_lift/config/__init__.py | 9 + .../cube_lift/config/franka/__init__.py | 141 +++ .../config/franka/agents/__init__.py | 4 + .../franka/agents/rl_games_ppo_cfg.yaml | 79 ++ .../config/franka/agents/robomimic/bc.json | 135 +++ .../agents/robomimic/bc_rnn_low_dim.json | 135 +++ .../agents/robomimic/bc_rnn_low_dim_not.json | 306 ++++++ .../franka/agents/robomimic/bc_trans.json | 133 +++ .../config/franka/agents/robomimic/bcq.json | 308 ++++++ .../config/franka/agents/robomimic/hbc.json | 306 ++++++ .../config/franka/agents/rsl_rl_ppo_cfg.py | 37 + .../config/franka/agents/sb3_ppo_cfg.yaml | 28 + .../config/franka/agents/skrl_ppo_cfg.yaml | 80 ++ .../cube_lift/config/franka/dev_env_cfg.py | 132 +++ .../config/franka/dev_ik_rel_env_cfg.py | 63 ++ .../config/franka/dev_ik_rel_env_obs.py | 49 + .../cube_lift/config/franka/dev_osc_cfg.py | 114 +++ .../cube_lift/config/franka/ik_abs_env_cfg.py | 128 +++ .../cube_lift/config/franka/ik_rel_env_cfg.py | 65 ++ .../config/franka/joint_pos_env_cfg.py | 102 ++ .../manipulation/cube_lift/lift_env_cfg.py | 362 +++++++ .../manipulation/cube_lift/mdp/__init__.py | 12 + .../cube_lift/mdp/observations.py | 309 ++++++ .../manipulation/cube_lift/mdp/rewards.py | 73 ++ .../cube_lift/mdp/terminations.py | 97 ++ 82 files changed, 11051 insertions(+), 14 deletions(-) create mode 100644 docs/beaker.obj create mode 100644 docs/clean_urdf.py create mode 100644 docs/macros_private.py create mode 100755 docs/training_runs/bc_q/Dev-IK-Rel-v0/bcq/20250721123120/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924112632/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924123612/config.json create mode 100755 docs/training_runs/bc_trans/bc_trans/20250715154020/config.json create mode 100755 docs/training_runs/bc_trans/bc_trans/20250721074506/config.json create mode 100755 docs/training_runs/bc_trans/bc_trans/20250721074750/config.json create mode 100755 docs/training_runs/bc_trans/bc_trans/20250721085238/config.json create mode 100755 docs/training_runs/bcq/Dev-IK-Rel-v0/bcq/20250721135829/config.json create mode 100755 docs/training_runs/franks_stack/20250715152538/config.json create mode 100755 docs/training_runs/franks_stack/20250716100129/config.json create mode 100644 scripts/imitation_learning/robomimic/evaluation.py create mode 100644 scripts/imitation_learning/robomimic/play_ensemble.py create mode 100644 scripts/imitation_learning/robomimic/train_ensemble.py create mode 100755 source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py create mode 100755 source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py create mode 100755 source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/rl_games_ppo_cfg.yaml create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_rnn_low_dim.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_rnn_low_dim_not.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_trans.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bcq.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/hbc.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/rsl_rl_ppo_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/sb3_ppo_cfg.yaml create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/skrl_ppo_cfg.yaml create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/dev_osc_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/ik_abs_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/ik_rel_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/joint_pos_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_ik_rel_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_ik_rel_env_obs.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/observations.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/rewards.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/terminations.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/pour_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/rl_games_ppo_cfg.yaml create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim_not.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_trans.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bcq.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/hbc.json create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/rsl_rl_ppo_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/sb3_ppo_cfg.yaml create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/skrl_ppo_cfg.yaml create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_osc_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/ik_abs_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/ik_rel_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/joint_pos_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/__init__.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/rewards.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py diff --git a/.gitignore b/.gitignore index 08d2e8dee5a9..18d749f04b96 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,12 @@ **/*.usda **/*.usdc **/*.usdz +**/*.urdf + +#no path files +**/*.pth +**/*.hdf5 +**/*.txt # Python .DS_Store @@ -63,6 +69,8 @@ _build # Teleop Recorded Dataset /datasets/ +/franka_robotiq/ +/source/isaaclab_assets/ # Tests tests/ diff --git a/docker/.env.ros2 b/docker/.env.ros2 index 609704f45674..ebb840428a95 100644 --- a/docker/.env.ros2 +++ b/docker/.env.ros2 @@ -8,7 +8,4 @@ RMW_IMPLEMENTATION=rmw_fastrtps_cpp # Path to fastdds.xml file to use (only needed when using fastdds) FASTRTPS_DEFAULT_PROFILES_FILE=${DOCKER_USER_HOME}/.ros/fastdds.xml # Path to cyclonedds.xml file to use (only needed when using cyclonedds) -CYCLONEDDS_URI=${DOCKER_USER_HOME}/.ros/cyclonedds.xml -# Docker image and container name suffix (default "", set by the container_interface.py script) -# Example: "-custom" -DOCKER_NAME_SUFFIX="" +CYCLONEDDS_URI=${DOCKER_USER_HOME}/.ros/cyclonedds.xml \ No newline at end of file diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 9aff6b165c93..4ebf8291ca03 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -93,7 +93,35 @@ RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ # HACK: Remove install of quadprog dependency RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip uninstall -y quadprog - +RUN set -euo pipefail && \ + . /etc/os-release && \ + case "$ID" in \ + ubuntu) \ + case "$VERSION_ID" in \ + "20.04") cuda_repo="ubuntu2004";; \ + "22.04") cuda_repo="ubuntu2204";; \ + "24.04") cuda_repo="ubuntu2404";; \ + *) echo "Unsupported Ubuntu $VERSION_ID"; exit 1;; \ + esac ;; \ + *) echo "Unsupported base OS: $ID"; exit 1 ;; \ + esac && \ + apt-get update && apt-get install -y --no-install-recommends wget gnupg ca-certificates && \ + wget -q https://developer.download.nvidia.com/compute/cuda/repos/${cuda_repo}/x86_64/cuda-keyring_1.1-1_all.deb && \ + dpkg -i cuda-keyring_1.1-1_all.deb && \ + rm -f cuda-keyring_1.1-1_all.deb && \ + wget -q https://developer.download.nvidia.com/compute/cuda/repos/${cuda_repo}/x86_64/cuda-${cuda_repo}.pin && \ + mv cuda-${cuda_repo}.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \ + apt-get update && \ + apt-get install -y --no-install-recommends cuda-toolkit-12-8 && \ + apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* + + +ENV CUDA_HOME=/usr/local/cuda-12.8 +ENV PATH=${CUDA_HOME}/bin:${PATH} +ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH} +ENV TORCH_CUDA_ARCH_LIST=8.0+PTX +RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation \ + "nvidia-curobo @ git+https://github.com/NVlabs/curobo.git@ebb71702f3f70e767f40fd8e050674af0288abe8" # aliasing isaaclab.sh and python for convenience RUN echo "export ISAACLAB_PATH=${ISAACLAB_PATH}" >> ${HOME}/.bashrc && \ echo "alias isaaclab=${ISAACLAB_PATH}/isaaclab.sh" >> ${HOME}/.bashrc && \ @@ -106,6 +134,49 @@ RUN echo "export ISAACLAB_PATH=${ISAACLAB_PATH}" >> ${HOME}/.bashrc && \ echo "shopt -s histappend" >> /root/.bashrc && \ echo "PROMPT_COMMAND='history -a'" >> /root/.bashrc + # use pip caching to avoid reinstalling large packages +#RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ +# pip install --upgrade --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128 +# install TensorFlow and nightly PyTorch +RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ + ${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install --upgrade --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128 + +RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ + ${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install tensorflow scikit-learn + +RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ +${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install protobuf==3.20.2 +# Detect Ubuntu version and install CUDA 12.8 via NVIDIA network repo (cuda-keyring) +RUN set -euo pipefail && \ + . /etc/os-release && \ + case "$ID" in \ + ubuntu) \ + case "$VERSION_ID" in \ + "20.04") cuda_repo="ubuntu2004";; \ + "22.04") cuda_repo="ubuntu2204";; \ + "24.04") cuda_repo="ubuntu2404";; \ + *) echo "Unsupported Ubuntu $VERSION_ID"; exit 1;; \ + esac ;; \ + *) echo "Unsupported base OS: $ID"; exit 1 ;; \ + esac && \ + apt-get update && apt-get install -y --no-install-recommends wget gnupg ca-certificates && \ + wget -q https://developer.download.nvidia.com/compute/cuda/repos/${cuda_repo}/x86_64/cuda-keyring_1.1-1_all.deb && \ + dpkg -i cuda-keyring_1.1-1_all.deb && \ + rm -f cuda-keyring_1.1-1_all.deb && \ + wget -q https://developer.download.nvidia.com/compute/cuda/repos/${cuda_repo}/x86_64/cuda-${cuda_repo}.pin && \ + mv cuda-${cuda_repo}.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \ + apt-get update && \ + apt-get install -y --no-install-recommends cuda-toolkit-12-8 && \ + apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* + + +ENV CUDA_HOME=/usr/local/cuda-12.8 +ENV PATH=${CUDA_HOME}/bin:${PATH} +ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH} +ENV TORCH_CUDA_ARCH_LIST=8.0+PTX + +# Copy the Isaac Lab directory (files to exclude are defined in .dockerignore) +COPY ../ ${ISAACLAB_PATH} # make working directory as the Isaac Lab directory # this is the default directory when the container is run WORKDIR ${ISAACLAB_PATH} diff --git a/docker/Dockerfile.ros2 b/docker/Dockerfile.ros2 index 2e00fc7ec396..dfc555ce31c2 100644 --- a/docker/Dockerfile.ros2 +++ b/docker/Dockerfile.ros2 @@ -4,7 +4,7 @@ # What is the docker name suffix for the base image to load? (defaults to empty string) ARG DOCKER_NAME_SUFFIX="" -FROM isaac-lab-base${DOCKER_NAME_SUFFIX} AS ros2 +FROM isaac-lab-base AS ros2 # Which ROS2 apt package to install ARG ROS2_APT_PACKAGE diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index d7809109bdc1..cde0175a7996 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -69,6 +69,10 @@ x-default-isaac-lab-volumes: &default-isaac-lab-volumes - type: bind source: .isaac-lab-docker-history target: ${DOCKER_USER_HOME}/.bash_history + - type: bind + source: /usr/share/nvidia/nvoptix.bin + target: /usr/share/nvidia/nvoptix.bin + read_only: true x-default-isaac-lab-environment: &default-isaac-lab-environment - ISAACSIM_PATH=${DOCKER_ISAACLAB_PATH}/_isaac_sim @@ -106,6 +110,10 @@ services: entrypoint: bash stdin_open: true tty: true + devices: + - /dev/hidraw0:/dev/hidraw0 + - /dev/hidraw1:/dev/hidraw1 + # - /dev/hidraw2:/dev/hidraw2 # This service adds a ROS2 Humble # installation on top of the base image @@ -135,6 +143,10 @@ services: entrypoint: bash stdin_open: true tty: true + devices: + - /dev/hidraw0:/dev/hidraw0 + - /dev/hidraw1:/dev/hidraw1 + # - /dev/hidraw2:/dev/hidraw2 volumes: # isaac-sim @@ -151,3 +163,5 @@ volumes: isaac-lab-docs: isaac-lab-logs: isaac-lab-data: + isaac-lan-ros2: + diff --git a/docs/beaker.obj b/docs/beaker.obj new file mode 100644 index 000000000000..7411fe4f313c --- /dev/null +++ b/docs/beaker.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49897da923686f624068a3611160d539b951180282ffb449c94b36c215a4d667 +size 861347 diff --git a/docs/clean_urdf.py b/docs/clean_urdf.py new file mode 100644 index 000000000000..6ef51d77a3e2 --- /dev/null +++ b/docs/clean_urdf.py @@ -0,0 +1,32 @@ +import xml.etree.ElementTree as ET + +# Load the original URDF +input_urdf = "franka_robotiq/urdf/panda_robotiq.urdf" +output_urdf = "franka_robotiq/urdf/lula_franka_isaaclab.urdf" + +tree = ET.parse(input_urdf) +robot = tree.getroot() + +# Default inertial parameters +DEFAULT_MASS = 1.0 +DEFAULT_INERTIA = {"ixx": 0.01, "iyy": 0.01, "izz": 0.01, "ixy": 0.0, "ixz": 0.0, "iyz": 0.0} + +for link in robot.findall("link"): + # Add inertial if missing + if link.find("inertial") is None: + inertial = ET.SubElement(link, "inertial") + ET.SubElement(inertial, "origin", xyz="0 0 0", rpy="0 0 0") + ET.SubElement(inertial, "mass", value=str(DEFAULT_MASS)) + inertia_attrib = {k: str(v) for k, v in DEFAULT_INERTIA.items()} + ET.SubElement(inertial, "inertia", **inertia_attrib) + + # Add simple box collision if missing + if link.find("collision") is None: + collision = ET.SubElement(link, "collision") + geometry = ET.SubElement(collision, "geometry") + ET.SubElement(geometry, "box", size="0.05 0.05 0.05") + +# Write the cleaned URDF +tree.write(output_urdf, encoding="utf-8", xml_declaration=True) + +print(f"Cleaned URDF written to {output_urdf}") \ No newline at end of file diff --git a/docs/macros_private.py b/docs/macros_private.py new file mode 100644 index 000000000000..2760b28817b8 --- /dev/null +++ b/docs/macros_private.py @@ -0,0 +1,27 @@ +""" +Set of global variables shared across robomimic +""" +# Sets debugging mode. Should be set at top-level script so that internal +# debugging functionalities are made active +DEBUG = False + +# Whether to visualize the before & after of an observation randomizer +VISUALIZE_RANDOMIZER = False + +# wandb entity (eg. username or team name) +WANDB_ENTITY = "aarch-uol" + +# wandb api key (obtain from https://wandb.ai/authorize) +# alternatively, set up wandb from terminal with `wandb login` +WANDB_API_KEY = "f1bb6b7a94c7431472882c94835036d0156eb7b6" + +try: + from robomimic.macros_private import * +except ImportError: + from robomimic.utils.log_utils import log_warning + import robomimic + log_warning( + "No private macro file found!"\ + "\nIt is recommended to use a private macro file"\ + "\nTo setup, run: python {}/scripts/setup_macros.py".format(robomimic.__path__[0]) + ) diff --git a/docs/training_runs/bc_q/Dev-IK-Rel-v0/bcq/20250721123120/config.json b/docs/training_runs/bc_q/Dev-IK-Rel-v0/bcq/20250721123120/config.json new file mode 100755 index 000000000000..d5a1cf7e95f4 --- /dev/null +++ b/docs/training_runs/bc_q/Dev-IK-Rel-v0/bcq/20250721123120/config.json @@ -0,0 +1,315 @@ +{ + "algo_name": "bcq", + "experiment": { + "name": "bcq", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/varying_beaker_scale_generated2_split.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_q/Dev-IK-Rel-v0", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 1, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 1 + }, + "algo": { + "optim_params": { + "critic": { + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + }, + "action_sampler": { + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + }, + "actor": { + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + } + }, + "discount": 0.99, + "n_step": 1, + "target_tau": 0.005, + "infinite_horizon": false, + "critic": { + "use_huber": false, + "max_gradient_norm": null, + "value_bounds": null, + "num_action_samples": 10, + "num_action_samples_rollout": 100, + "ensemble": { + "n": 2, + "weight": 0.75 + }, + "distributional": { + "enabled": false, + "num_atoms": 51 + }, + "layer_dims": [ + 300, + 400 + ] + }, + "action_sampler": { + "actor_layer_dims": [ + 1024, + 1024 + ], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": true, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "freeze_encoder_epoch": -1 + }, + "actor": { + "enabled": false, + "perturbation_scale": 0.05, + "layer_dims": [ + 300, + 400 + ] + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + }, + "conv_activation": "relu", + "conv_kwargs": { + "out_channels": [ + 32, + 64, + 64 + ], + "kernel_size": [ + 8, + 4, + 2 + ], + "stride": [ + 4, + 2, + 1 + ] + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924112632/config.json b/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924112632/config.json new file mode 100644 index 000000000000..a6b76e34fba4 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924112632/config.json @@ -0,0 +1,216 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_new_demos", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_new_start_skillgen_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model14/", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924123612/config.json b/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924123612/config.json new file mode 100644 index 000000000000..a6b76e34fba4 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924123612/config.json @@ -0,0 +1,216 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_new_demos", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_new_start_skillgen_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model14/", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_trans/bc_trans/20250715154020/config.json b/docs/training_runs/bc_trans/bc_trans/20250715154020/config.json new file mode 100755 index 000000000000..2d7bc021db12 --- /dev/null +++ b/docs/training_runs/bc_trans/bc_trans/20250715154020/config.json @@ -0,0 +1,216 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_trans", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "bc-trans" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": true, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/varying_beaker_scale_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/docs/training_runs/bc-trans/202507151635/Dev-IK-Rel-v0", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": false, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": true, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_trans/bc_trans/20250721074506/config.json b/docs/training_runs/bc_trans/bc_trans/20250721074506/config.json new file mode 100755 index 000000000000..39c1fa2d1eb9 --- /dev/null +++ b/docs/training_runs/bc_trans/bc_trans/20250721074506/config.json @@ -0,0 +1,216 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_trans_20250721_1", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": false, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/varying_beaker_scale_generated2_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/docs/training_runs/bc_trans/202507210830/Dev-IK-Rel-v0", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": false, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": true, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_trans/bc_trans/20250721074750/config.json b/docs/training_runs/bc_trans/bc_trans/20250721074750/config.json new file mode 100755 index 000000000000..90570d60c2f4 --- /dev/null +++ b/docs/training_runs/bc_trans/bc_trans/20250721074750/config.json @@ -0,0 +1,216 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_trans_20250721_1", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/varying_beaker_scale_generated2_split.hdf5", + "output_dir": "/docs/docs/training_runs/bc_trans/202507210830/Dev-IK-Rel-v0", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": false, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": true, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_trans/bc_trans/20250721085238/config.json b/docs/training_runs/bc_trans/bc_trans/20250721085238/config.json new file mode 100755 index 000000000000..cc08f0289374 --- /dev/null +++ b/docs/training_runs/bc_trans/bc_trans/20250721085238/config.json @@ -0,0 +1,216 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_trans_20250721_1", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/varying_beaker_scale_generated2_split.hdf5", + "output_dir": "/docs/training_runs/bc_trans/202507210951/Dev-IK-Rel-v0", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": false, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": true, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bcq/Dev-IK-Rel-v0/bcq/20250721135829/config.json b/docs/training_runs/bcq/Dev-IK-Rel-v0/bcq/20250721135829/config.json new file mode 100755 index 000000000000..46ff43c296ec --- /dev/null +++ b/docs/training_runs/bcq/Dev-IK-Rel-v0/bcq/20250721135829/config.json @@ -0,0 +1,315 @@ +{ + "algo_name": "bcq", + "experiment": { + "name": "bcq", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/varying_beaker_scale_generated2_split_with_next_obs.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bcq/Dev-IK-Rel-v0", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 1, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 1 + }, + "algo": { + "optim_params": { + "critic": { + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + }, + "action_sampler": { + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + }, + "actor": { + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + } + }, + "discount": 0.99, + "n_step": 1, + "target_tau": 0.005, + "infinite_horizon": false, + "critic": { + "use_huber": false, + "max_gradient_norm": null, + "value_bounds": null, + "num_action_samples": 10, + "num_action_samples_rollout": 100, + "ensemble": { + "n": 2, + "weight": 0.75 + }, + "distributional": { + "enabled": false, + "num_atoms": 51 + }, + "layer_dims": [ + 300, + 400 + ] + }, + "action_sampler": { + "actor_layer_dims": [ + 1024, + 1024 + ], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": true, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "freeze_encoder_epoch": -1 + }, + "actor": { + "enabled": false, + "perturbation_scale": 0.05, + "layer_dims": [ + 300, + 400 + ] + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + }, + "conv_activation": "relu", + "conv_kwargs": { + "out_channels": [ + 32, + 64, + 64 + ], + "kernel_size": [ + 8, + 4, + 2 + ], + "stride": [ + 4, + 2, + 1 + ] + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/franks_stack/20250715152538/config.json b/docs/training_runs/franks_stack/20250715152538/config.json new file mode 100755 index 000000000000..bd1627e755cb --- /dev/null +++ b/docs/training_runs/franks_stack/20250715152538/config.json @@ -0,0 +1,210 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_rnn_low_dim_franka_stack", + "validate": false, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": false, + "wandb_proj_name": "debug" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": false, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": false, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "./docs/training_data/generated_dataset_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/docs/Models/bc/model2/Isaac-Stack-Cube-Franka-IK-Rel-v0", + "num_data_workers": 4, + "hdf5_cache_mode": "all", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": null, + "hdf5_validation_filter_key": null, + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 5, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/franks_stack/20250716100129/config.json b/docs/training_runs/franks_stack/20250716100129/config.json new file mode 100755 index 000000000000..5fa8cd807083 --- /dev/null +++ b/docs/training_runs/franks_stack/20250716100129/config.json @@ -0,0 +1,210 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_rnn_low_dim_franka_stack", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": false, + "wandb_proj_name": "debug" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": false, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "./docs/training_data/generated_dataset_split.hdf5", + "output_dir": "/logs/docs/Models/bc/model8/Isaac-Stack-Cube-Franka-IK-Rel-v0", + "num_data_workers": 4, + "hdf5_cache_mode": "all", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 4000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 5, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/scripts/imitation_learning/isaaclab_mimic/generate_dataset.py b/scripts/imitation_learning/isaaclab_mimic/generate_dataset.py index a260151f4b15..b3bdfe03d624 100644 --- a/scripts/imitation_learning/isaaclab_mimic/generate_dataset.py +++ b/scripts/imitation_learning/isaaclab_mimic/generate_dataset.py @@ -146,7 +146,8 @@ def main(): env=env, robot=env.scene["robot"], config=planner_config, # Pass the config object - env_id=env_id, # Pass environment ID + env_id=env_id, # Pass environment ID, + #debug=True ) env.cfg.datagen_config.use_skillgen = True diff --git a/scripts/imitation_learning/robomimic/evaluation.py b/scripts/imitation_learning/robomimic/evaluation.py new file mode 100644 index 000000000000..ec2ff30d7338 --- /dev/null +++ b/scripts/imitation_learning/robomimic/evaluation.py @@ -0,0 +1,206 @@ +# run this script: ./isaaclab.sh -p scripts/imitation_learning/robomimic//evaluation.py --checkpoint ./docs/Models/model_epoch_5000.pth + +import argparse +import copy +import gymnasium as gym +import numpy as np + +import torch +import torch.nn as nn +import torch.nn.functional as F + +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.torch_utils as TorchUtils + +import time + + +# add argparse arguments +# parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") +# parser.add_argument("--checkpoint", type=str, default=None, help="Pytorch model checkpoint to load.") +# parser.add_argument("--seed", type=int, default=101, help="Random seed.") + + + +# args_cli = parser.parse_args() + +def ensemble_uncertainty(ensemble, obs): + start_time = time.time() + outputs = [torch.from_numpy(policy(obs)) for policy in ensemble] + + outputs = torch.stack(outputs) + + mean_action = torch.mean(outputs, dim=0) + + end_time = time.time() + time_taken = end_time - start_time + + median_action = torch.median(outputs, dim=0).values + + + min_action = torch.min(outputs, dim=0) + max_action = torch.max(outputs, dim=0) + + std = torch.std(outputs, dim=0) + variance = std.pow(2) + + # std per policy (overall std across joints for each policy's action) + per_policy_std = torch.std(outputs, dim=1) + min_std_index = torch.argmin(per_policy_std) + min_std_action = outputs[min_std_index] + + return { + 'mean': mean_action, + 'median': median_action, + 'min': min_action, + 'max': max_action, + 'std': std, + 'variance': variance, + 'min_std_action': min_std_action, + 'time_taken': time_taken + } + +def MC_dropout_uncertainty(policy, obs, niters=50): + actions = [torch.from_numpy(policy(obs)) for i in range(niters)] + actions = torch.stack(actions) + + mean = torch.mean(actions, dim=0) + std = torch.std(actions, dim=0) + variance = torch.sqrt(std) + + return { + 'mean': mean, + 'std': std, + 'variance': variance + } + + +def mc_dropout_uncertainty_eval(policy, obs, niters=50): + policy.policy.nets['policy'].train() + + + actions = [] + with torch.no_grad(): + for _ in range(niters): + action = torch.from_numpy(policy(obs)) + actions.append(action) + + actions = torch.stack(actions) + + mean = torch.mean(actions, dim=0) + std = torch.std(actions, dim=0) + variance = torch.var(actions, dim=0) + + policy.policy.nets['policy'].eval() + + return { + 'mean': mean, + 'std': std, + 'variance': variance + } + + + + +def remove_dropout_layers(hooks): + for hook in hooks: + hook.remove() + +def inject_dropout_layers(policy, probability=0.5): + modules = list(policy.policy.nets['policy'].named_modules()) + #print(f"Total modules found: {len(modules)}") + + def dropout_hook(module, _, output): + #print("applying dropout") + return F.dropout(output, p=probability, training=True) # setting training=True forces dropout to happen regardless of whether the model is in train or evaluation mode + + hooks = [] + for name, module in modules: + if isinstance(module, nn.Linear): + hook = module.register_forward_hook(dropout_hook) + hooks.append(hook) + + return hooks + +def inject_dropout_layers_for_training(model, probability=0.5): + modules = list(model.nets['policy'].named_modules()) + #print(f"Total modules found: {len(modules)}") + + def dropout_hook(module, _, output): + #print("applying dropout") + return F.dropout(output, p=probability, training=True) # setting training=True forces dropout to happen regardless of whether the model is in train or evaluation mode + + hooks = [] + for name, module in modules: + if isinstance(module, nn.Linear): + hook = module.register_forward_hook(dropout_hook) + hooks.append(hook) + + return hooks + +def prepare_observations(obs_dict: dict): + # Prepare observations + obs = copy.deepcopy(obs_dict["policy"]) + sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) + + for ob in obs: + obs[ob] = torch.squeeze(obs[ob]) + + for subob in sub_obs: + sub_obs[subob] = torch.squeeze(sub_obs[subob]) + + return obs, sub_obs + + +# device = TorchUtils.get_torch_device(try_to_use_cuda=True) + +# policy, _ = FileUtils.policy_from_checkpoint(ckpt_path=args_cli.checkpoint, device=device, verbose=True) + + +# obs_dict = {'policy': { +# 'joint_pos': torch.tensor([[0., 0., 0., 0., 0., 0., 0., 0., 0.]], device=device), +# 'joint_vel': torch.tensor([[0., 0., 0., 0., 0., 0., 0., 0., 0.]], device=device), +# 'object_position': torch.tensor([[0.4975, 0.0483, 0.0203]], device=device), +# 'target_object_position': torch.tensor([[ 0.4000, -0.3000, 0.0800, 1.0000, 0.0000, 0.0000, 0.0000]], device=device), +# 'actions': torch.tensor([[0., 0., 0., 0., 0., 0., 0.]], device=device), +# 'object_to_target': torch.tensor([False], device=device), +# 'eef_pos': torch.tensor([[ 0.3764, -0.0050, 0.0891]], device=device), +# 'eef_quat': torch.tensor([[ 0.6433, 0.0366, 0.7636, -0.0415]], device=device), +# 'gripper_pos': torch.tensor([[ 0.0400, -0.0400]], device=device) +# }, +# 'subtask_terms': { +# 'appr': torch.tensor([False], device=device), +# 'grasp': torch.tensor([False], device=device), +# 'lift': torch.tensor([False], device=device), +# 'appr_goal': torch.tensor([False], device=device) +# } +# } + +# inject_dropout_layers(policy=policy, probability=0.7) + +# policy.start_episode() +# obs, sub_obs = prepare_observations(obs_dict=obs_dict) + + +# start_time = time.time() +# results_dict = MC_dropout_uncertainty(policy=policy, obs=obs, niters=100) +# end_time = time.time() + +# print(results_dict) +# print(f"time taken: {end_time - start_time}") + +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \ +# --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 \ +# --checkpoint /logs/docs/Models/bc/model1/Isaac-Stack-Cube-Franka-IK-Rel-v0/bc_rnn_low_dim_franka_stack/20250715152224/models/model_epoch_2000.pth + + +""" +train a model that: + +takes as input joint positions (so a combination of joint positions and their values). + +outputs whether that specific combination of joint positions is safe or not. + +for the training data use joint position input of the current policy and see if it resulted in task success or not. + +""" \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/play_ensemble.py b/scripts/imitation_learning/robomimic/play_ensemble.py new file mode 100644 index 000000000000..01b5d1f65f1d --- /dev/null +++ b/scripts/imitation_learning/robomimic/play_ensemble.py @@ -0,0 +1,968 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# run this script: +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play_ensemble.py --device cuda --task Dev-IK-Rel-v0 --num_rollouts 100 +# stack cube task: ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 +"""Script to play and evaluate a trained policy from robomimic. + +This script loads a robomimic policy and plays it in an Isaac Lab environment. + +Args: + task: Name of the environment. + checkpoint: Path to the robomimic policy checkpoint. + horizon: If provided, override the step horizon of each rollout. + num_rollouts: If provided, override the number of rollouts. + seed: If provided, overeride the default random seed. + norm_factor_min: If provided, minimum value of the action space normalization factor. + norm_factor_max: If provided, maximum value of the action space normalization factor. +""" + +"""Launch Isaac Sim Simulator first.""" + + +import argparse + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") +parser.add_argument( + "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." +) +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--checkpoint", type=str, default=None, help="Pytorch model checkpoint to load.") +parser.add_argument("--horizon", type=int, default=2000, help="Step horizon of each rollout.") +parser.add_argument("--num_rollouts", type=int, default=1, help="Number of rollouts.") +parser.add_argument("--seed", type=int, default=101, help="Random seed.") +parser.add_argument( + "--norm_factor_min", type=float, default=None, help="Optional: minimum value of the normalization factor." +) +parser.add_argument( + "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." +) +parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") + +parser.add_argument("--model_name", type=str, default=None) + +group = parser.add_mutually_exclusive_group() +group.add_argument("--use_recovery", type=bool ,default= False, help="Enable recovery mechanism. By default recovery is enabled.") + +parser.add_argument("--ensemble_size", type=int, default=10) + +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim + # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter + import pinocchio # noqa: F401 +import numpy as np +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import time +import copy +import random +import os +import gymnasium as gym +import torch +import math +from collections import deque + +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.torch_utils as TorchUtils +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp.observations import get_joint_pos, object_grasped +#from chills.tasks.mdp.observations import get_joint_pos, object_grasped +if args_cli.enable_pinocchio: + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from isaaclab_tasks.utils import parse_env_cfg +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType +from isaaclab.utils.math import matrix_from_quat, convert_quat +from evaluation import ensemble_uncertainty +#import chills.tasks +#from chills.tasks.mdp import upright_tilt_deg + +def rollout(policy, env, success_term, horizon, device): + """Perform a single rollout of the policy in the environment. + + Args: + policy: The robomimicpolicy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + + Returns: + terminated: Whether the rollout terminated. + traj: The trajectory of the rollout. + """ + policy.start_episode() + obs_dict, _ = env.reset() + + #print(f"obs_dict type: {type(obs_dict)},\nobs_dict contents:\n {obs_dict}") + + traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[]) + + for i in range(horizon): + # Prepare observations + obs = copy.deepcopy(obs_dict["policy"]) + sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) + + for ob in obs: + obs[ob] = torch.squeeze(obs[ob]) + #print(f"found observation : {obs[ob]}") + + for subob in sub_obs: + sub_obs[subob] = torch.squeeze(sub_obs[subob]) + + # Check if environment image observations + if hasattr(env.cfg, "image_obs_list"): + # Process image observations for robomimic inference + for image_name in env.cfg.image_obs_list: + if image_name in obs_dict["policy"].keys(): + # Convert from chw uint8 to hwc normalized float + image = torch.squeeze(obs_dict["policy"][image_name]) + image = image.permute(2, 0, 1).clone().float() + image = image / 255.0 + image = image.clip(0.0, 1.0) + obs[image_name] = image + + traj["obs"].append(obs) + traj["sub_obs"].append(sub_obs) + + # Add dropout layers to the model and calculate uncertainty and remove at the end to not effect final action + + #hooks = inject_dropout_layers(policy=policy, probability=0.1) + # uncertainty_dict = MC_dropout_uncertainty(policy=policy, obs=obs, niters=15) + # traj['uncertainties'].append(uncertainty_dict['variance']) + #remove_dropout_layers(hooks) + + # Compute actions + actions = policy(obs) + + # Unnormalize actions + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ( + (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) + ) / 2 + args_cli.norm_factor_min + + actions = torch.from_numpy(actions).to(device=device).view(1, env.action_space.shape[1]) + + # Apply actions + obs_dict, _, terminated, truncated, _ = env.step(actions) + obs = obs_dict["policy"] + sub_obs = obs_dict["subtask_terms"] + + # Record trajectory + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs) + + + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + return True, traj + elif terminated or truncated: + return False, traj + + return False, traj +# tip over detection +def has_fallen(asset, threshold: float = -0.7, debug: bool = True) -> bool: + """ + Detect if an IsaacLab asset has fallen over by checking its up vector. + + Args: + asset: IsaacLab asset (e.g. robot, object) with .get_world_pose() + threshold: minimum z-component of the up vector (1.0 = perfectly upright). + Typical cutoff ~0.7 (≈45° tilt). + debug: if True, prints internal values for inspection. + + Returns: + True if fallen, False otherwise. + """ + quat = asset.data.body_link_quat_w # (pos, quat), usually torch.Tensors + # print("Beaker quat : ", quat) + # Ensure torch tensor, shape (4,) + if isinstance(quat, (list, tuple)): + quat = torch.tensor(quat, dtype=torch.float32) + quat = quat.view(-1, 4) # shape (1,4) + + # Convert quaternion to wxyz ordering + quat_wxyz = convert_quat(quat, to="wxyz") + + # Rotation matrix (1,3,3) + R = matrix_from_quat(quat_wxyz) + + # World up vector is the third column of rotation matrix + up = R[0, :, 2] # shape (3,) + uprightness = float(up[2]) + + if debug: + print(f"[has_fallen] quat={quat_wxyz.cpu().numpy().round(4)}") + print(f"[has_fallen] up={up.cpu().numpy().round(4)} uprightness={uprightness:.3f}") + + return uprightness > threshold + +def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): + """Perform a single rollout of the policy in the environment. + + Args: + policy: The robomimicpolicy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + + Returns: + terminated: Whether the rollout terminated. + traj: The trajectory of the rollout. + """ + print("running rollout number : ", rollout_num) + for policy in ensemble: + policy.start_episode() + obs_dict, _ = env.reset() + + #print(f"obs_dict type: {type(obs_dict)},\nobs_dict contents:\n {obs_dict}") + + traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], + uncertainties=[], min_actions=[], max_actions=[], + time_taken=[], joint_pos=[], recovery=[]) + + joints_to_check = [0, 1, 2, 3, 4, 5, 6] + unsafe_windows_detected = {joint_num: 0 for joint_num in joints_to_check} + windows = {joint_num: deque(maxlen=parameters[joint_num]['window_size']) for joint_num in joints_to_check} + certain_timestep = 50 + certain_joint_positions = [] + + ### SET USE RECOVERY TO FALSE #### + use_recovery=False + recovery_activated_during_rollout = 0 +#########SET TO FALSE ####### + recovery_mode = False + print("rollout recovery enabled ? : ", use_recovery) + recovery_duration = 100 + recovery_cooldown_duration = 100 # timesteps + recovery_cooldown_timer = recovery_cooldown_duration + recovery_cooldown_active = False + recovery = [] + for i in range(horizon): + # Prepare observations + if bool(success_term.func(env, **success_term.params)[0]): + return True, traj, recovery_activated_during_rollout + obs = copy.deepcopy(obs_dict["policy"]) + sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) + object = env.unwrapped.scene["object"] + + # is_tipped = has_fallen(object, -0.95, True) + for ob in obs: + obs[ob] = torch.squeeze(obs[ob]) + #print(f"found observation : {obs[ob]}") + + for subob in sub_obs: + sub_obs[subob] = torch.squeeze(sub_obs[subob]) + + # Check if environment image observations + if hasattr(env.cfg, "image_obs_list"): + # Process image observations for robomimic inference + for image_name in env.cfg.image_obs_list: + if image_name in obs_dict["policy"].keys(): + # Convert from chw uint8 to hwc normalized float + image = torch.squeeze(obs_dict["policy"][image_name]) + image = image.permute(2, 0, 1).clone().float() + image = image / 255.0 + image = image.clip(0.0, 1.0) + obs[image_name] = image + + traj["obs"].append(obs) + traj["sub_obs"].append(sub_obs) + object=env.unwrapped.scene['object'] + #tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) + #print("Tilt deg : ", tilt_deg.item()) + if recovery_mode: + print(f"Recovery Mode Started at Timestep {i}") + robot = env.unwrapped.scene["robot"] + tmp_pos = get_joint_pos(env) + # print("Temp, gripper a pos : ", tmp_pos[0][7]) + #print("Temp, gripper b pos : ", tmp_pos[0][8]) + safe_pos = None + if object_grasped(env): + # mid safe place - should help with the task of moving the beaker to the target + safe_pos = torch.tensor([[0.2932, 0.2640, -0.3573, -2.6099, -2.8971, 2.0274, 0.8245, tmp_pos[0][7], tmp_pos[0][8]]]).to(device) + else: + # origin + safe_pos = torch.tensor([[ 0.405,0.35,-0.22,-3,-2.85,math.pi/2,0.9, tmp_pos[0][7],tmp_pos[0][8]]]).to(device)# safe_pos = certain_joint_positions[-certain_timestep] + position_errors = deque(maxlen=50) + rec_i = 0 + + current = get_joint_pos(env) + target = safe_pos + steps = 200 # increase for slower motion + + for alpha in np.linspace(0, 1, steps): + recovery.append(True) + intermediate = (1 - alpha) * current + alpha * target + robot.set_joint_position_target(intermediate) + env.scene.write_data_to_sim() + env.sim.step() + if bool(success_term.func(env, **success_term.params)[0]): + return True, traj, recovery_activated_during_rollout + + # while rec_i < recovery_duration: + # # print("In recovery") + # recovery.append(True) + # robot.set_joint_position_target(safe_pos) # expects an absolute joint position + # env.scene.write_data_to_sim() + # env.sim.step() + + # # Check if robot reached the safe position within a small tolerance + # new_joint_positions = get_joint_pos(env) + # target_joint_positions = safe_pos + + # position_error = torch.abs(new_joint_positions - target_joint_positions) + # position_errors.append(position_error) + # tolerance = 1e-2 + + # # check if the positon/position error has converged to the safe position (it wont reach it exactly). + # # it also jumps to it straight away but if you stop straight away you get weird jerky motion and it doesnt actually reach the safe position + # # check every 50 iterations + # if rec_i % 50 == 0: + # reached_safe_pos_early = False + # if position_errors.maxlen == len(position_errors): + # for pe in position_errors: + # if torch.all(torch.abs(pe - position_error) < tolerance): + # reached_safe_pos_early = True + # if reached_safe_pos_early: + # print(f"Reached safe position early.") + # break + # # else extend the recovery duration + # if rec_i == recovery_duration - 1: + # print("Extending Recovery Duration") + # recovery_duration += 50 + + # rec_i += 1 + + print(f"Recovery Mode Ended") + print("Recovery Cooldown Activated") + recovery_mode = False + recovery_cooldown_active = True + obs_dict, _, terminated, truncated, _ = env.step(torch.tensor([0 for _ in range(7)]).to(device).view(1, env.action_space.shape[1])) + obs = copy.deepcopy(obs_dict["policy"]) + for ob in obs: + obs[ob] = torch.squeeze(obs[ob]) + ensemble_uncertainty(ensemble, obs) + else: + # Calculate uncertainty using the ensemble + recovery.append(False) + if bool(success_term.func(env, **success_term.params)[0]): + return True, traj, recovery_activated_during_rollout + ## detect if we have tipped the object + + + metrics = ensemble_uncertainty(ensemble, obs) + # Get the std and mean action + uncertainty = metrics['variance'] + actions = metrics['mean'] + + # Add the uncertainty to all joint windows + for joint_num, unc in enumerate(uncertainty): + windows[joint_num].append(unc) + + for joint_num in joints_to_check: + unc_threshold = parameters[joint_num]['unc_threshold'] + peaks = sum(1 for curr_unc in windows[joint_num] if curr_unc > unc_threshold) + if peaks > parameters[joint_num]['max_peaks']: + unsafe_windows_detected[joint_num] += 1 + + + for joint_num in joints_to_check: + ## less worried after the object grasped + if unsafe_windows_detected[joint_num] > parameters[joint_num]['max_uncertain_windows'] and not recovery_cooldown_active: + print(f"Joint {joint_num} is uncertain at timestep {i}, uncertainty is {uncertainty[joint_num]}") + unsafe_windows_detected[joint_num] = 0 + if use_recovery: + recovery_mode = True + recovery_activated_during_rollout += 1 + # if object_grasped(env): + + # else : + # ## more strict when grasping + # if (unsafe_windows_detected[joint_num] > (parameters[joint_num]['max_uncertain_windows']-1)) and not recovery_cooldown_active: + # print(f"Object not grapsed, using more strict uncertainty Joint {joint_num} is uncertain at timestep {i}, uncertainty is {uncertainty[joint_num]}") + # unsafe_windows_detected[joint_num] = 0 + # if obs_dict['subtask_terms']['appr_goal'].item(): + # # then we are placing the object , do not recover + # print("not activating recovery, object at goal") + # elif use_recovery: + # recovery_mode = True + # recovery_activated_during_rollout += 1 + + if use_recovery and not recovery_cooldown_active: + # print("not holding object, check if not hit it") + # print("observed tilt " , obs_dict['policy']['object_tilt']) + # if obs_dict['policy']['object_tilt'].item() > 5.0: + # print("Ucertainties when tilt : ",uncertainty) + # print("Object tilted, activating no tilt recovery ") + # print("observed tilt " , obs_dict['policy']['object_tilt']) + recovery_mode =True + recovery_activated_during_rollout+=1 + + if recovery_cooldown_active: + if object_grasped(env): + # normal recovery if already holding + recovery_cooldown_timer-=1 + else: + # shorten the cooldown for grasping stage + + recovery_cooldown_timer -= 1 + + if recovery_cooldown_timer <= 0: + recovery_cooldown_active = False + recovery_cooldown_timer = recovery_cooldown_duration + print("Recovery Cooldown Ended") + + if not recovery_mode: + current_absolute_joints = get_joint_pos(env) + certain_joint_positions.append(current_absolute_joints) + + + # Unnormalize actions + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ( + (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) + ) / 2 + args_cli.norm_factor_min + + actions = actions.to(device=device).view(1, env.action_space.shape[1]) + # print(f"------------------------------") + # print(f"Policy action : {actions.tolist()}") + + # Apply actions + obs_dict, _, terminated, truncated, _ = env.step(actions) + obs = obs_dict["policy"] + sub_obs = obs_dict["subtask_terms"] + # print(f"Obs change : {obs}") + # Record trajectory + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs) + traj['uncertainties'].append(uncertainty) + traj['max_actions'].append(metrics['max']) + traj['min_actions'].append(metrics['min']) + traj['time_taken'].append(metrics['time_taken']) + traj['joint_pos'].append(obs['abs_joint_pos']) + traj['recovery'].append(recovery) + + + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + return True, traj, recovery_activated_during_rollout + elif terminated or truncated: + return False, traj, recovery_activated_during_rollout + #print("REcovery : ", traj["recovery"]) + return False, traj, recovery_activated_during_rollout + + +def safety(): + print(f"I'm Uncertain. {random.randint(0, 100)}") + return True + +def rollout_transformer(policy, env, success_term, horizon, device): + """Perform a single rollout of the policy in the environment, supporting sequence-based models.""" + policy.start_episode() + obs_dict, _ = env.reset() + traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[]) + + context_length = getattr(policy, "n_obs_steps", 1) # works for transformer or rnn models + # print(f"Policy's expected sequence length (policy.n_obs_steps): {getattr(policy, 'n_obs_steps', 1)}") + + obs_seq = [] # list of previous obs for context window + + # Initial obs_dict from env.reset() + # print("Initial obs_dict shapes from env.reset():") + # for k, v in obs_dict["policy"].items(): + # print(f" policy['{k}']: shape={v.shape}, ndim={v.ndim}") + + # try: + # if hasattr(policy.policy, 'encoder') and hasattr(policy.policy.encoder, 'input_obs_group_shapes'): + # print("Policy's internal expected input_obs_group_shapes:") + # for group, keys in policy.policy.encoder.input_obs_group_shapes.items(): + # print(f" Group '{group}':") + # for k, shape in keys.items(): + # print(f" Key '{k}': shape={shape}, len(shape)={len(shape)}") + # else: + # print("Could not find policy.policy.encoder.input_obs_group_shapes.") + # except Exception as e: + # print(f"Error accessing policy.policy.encoder.input_obs_group_shapes: {e}") + + + for i in range(horizon): + # Prepare current observations from env for policy input + current_policy_obs = {} + for k, v in obs_dict["policy"].items(): + # Ensure low-dim observations are 1D (D,) + # If env returns (1, D), squeeze the batch dimension + if v.ndim > 1 and v.shape[0] == 1: + processed_v = v.squeeze(0).to(device) # Apply squeeze + # print(f" DEBUG: Squeezed '{k}' from {v.shape} to {processed_v.shape}") # Add debug print + else: + processed_v = v.to(device) # No squeeze needed, assume (D,) + current_policy_obs[k] = processed_v + + # # AFTER processing, print the shapes in current_policy_obs + # if i == 0: # Only print for the first step to avoid spamming + # print("current_policy_obs shapes AFTER squeezing (if applicable):") + # for k, v in current_policy_obs.items(): + # print(f" '{k}': shape={v.shape}, ndim={v.ndim}") + + + # Handle image observations specifically (if any) + if hasattr(env.cfg, "image_obs_list"): + for image_name in env.cfg.image_obs_list: + if image_name in obs_dict["policy"].keys(): + image = obs_dict["policy"][image_name].to(device) + # Assuming image comes as (H, W, C) and needs to be (C, H, W) + # If it's already (1, H, W, C), squeeze the batch dim first. + if image.ndim == 4 and image.shape[0] == 1: + image = image.squeeze(0) # Remove initial batch if present + + # Permute and normalize after ensuring no batch dim + image = image.permute(2, 0, 1).clone().float() # (C, H, W) + image = image / 255.0 + image = image.clip(0.0, 1.0) + current_policy_obs[image_name] = image + + + # Add subtask terms for logging/analysis, but they are not fed to the policy + # as per your trace (only "policy" observations are listed in the policy's encoder). + # You had prints for these before, assuming they are okay. + + # Append to context buffer. obs_seq should hold items with shape (D,) or (C, H, W) + traj["obs"].append(current_policy_obs) # Store the current, processed observation + obs_seq.append(current_policy_obs) # This is what forms the sequence input + + if len(obs_seq) > context_length: + obs_seq = obs_seq[-context_length:] + + # Pad if not enough context + if len(obs_seq) < context_length: + padding_obs = {} + for k, v in obs_seq[0].items(): # Use shape of first element in obs_seq for padding + # If obs_seq[0][k] is (D,) then zeros_like creates (D,) + # If obs_seq[0][k] is (C,H,W) then zeros_like creates (C,H,W) + padding_obs[k] = torch.zeros_like(v) + obs_seq = [padding_obs] * (context_length - len(obs_seq)) + obs_seq + + # Convert context list to batched sequence dict + seq_input = {} + for key in obs_seq[0]: + # Each step[key] here should be (D,) or (C, H, W) + # torch.stack will create (context_length, D) or (context_length, C, H, W) + # unsqueeze(0) will add the batch dimension: (1, context_length, D) or (1, context_length, C, H, W) + seq_input[key] = torch.stack([step[key] for step in obs_seq], dim=0).to(device=device) + #seq_input[key] = torch.stack([step[key] for step in obs_seq], dim=0).unsqueeze(0).to(device=device) + + # Print the final seq_input shapes just before policy call + # if i == 0: # Only print for the first step + # print("seq_input shapes for policy just before call:") + # for k, v in seq_input.items(): + # print(f" '{k}': shape={v.shape}, ndim={v.ndim}") + + # if i == 0: # Only print for the first step + # print("seq_input shapes for policy just before policy(seq_input) call (LAST CHECK):") + # for k, v in seq_input.items(): + # print(f" '{k}': shape={v.shape}, ndim={v.ndim}") + + # calculate uncertainty + # uncertainty_dict = mc_dropout_uncertainty_eval(policy=policy, obs=seq_input, niters=15) + # traj['uncertainties'].append(uncertainty_dict['variance']) + + # Compute action from sequence + actions = policy(seq_input) + + #print(f"DEBUG (Pre-Unnorm): Policy output 'actions' shape: {actions.shape}, ndim: {actions.ndim}, type: {type(actions)}") + + # Unnormalize actions + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ( + (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) + ) / 2 + args_cli.norm_factor_min + #print(f"DEBUG (Post-Unnorm): Policy output 'actions' shape: {actions.shape}, ndim: {actions.ndim}, type: {type(actions)}") + # Convert policy output (torch.Tensor) to numpy array for env.step() + # Assume actions comes as (1, Action_Dim) from policy, squeeze to (Action_Dim,) + if isinstance(actions, torch.Tensor): + # If it's a tensor, convert it to numpy, ensuring it's 1D (7,) + # We already know policy returns (7,) so no squeeze is needed *here*. + actions = actions.cpu().numpy() + + actions_tensor = torch.from_numpy(actions).to(device=device).float() + actions_tensor = actions_tensor.unsqueeze(0) + # Apply actions + #obs_dict, _, terminated, truncated, _ = env.step(actions) + obs_dict, _, terminated, truncated, _ = env.step(actions_tensor) + # Record trajectory - traj["next_obs"] should append the raw observation dictionary from env.step(). + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs_dict["policy"]) + + + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + return True, traj + elif terminated or truncated: + return False, traj + + return False, traj + +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \ +# --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 \ +# --checkpoint /logs/docs/Models/bc/model1/Isaac-Stack-Cube-Franka-IK-Rel-v0/bc_rnn_low_dim_franka_stack/20250715152224/models/model_epoch_2000.pth + + +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 10 --checkpoint logs/docs/Models/bc/model2/Isaac-Stack-Cube-Franka-IK-Rel-v0/bc_rnn_low_dim_franka_stack/20250715152538/models/model_epoch_2000.pth --headless + + + +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \ +# --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --algo bc \ +# --dataset ./docs/training_data/generated_dataset_split.hdf5 --logdir ./logs/docs/Models/bc/model8/ + + + +def load_ensemble(device, ensemble_path): + with open(ensemble_path, 'r') as file: + ensemble_paths = [path.strip() for path in file.readlines()] + ensemble = [] + for path in ensemble_paths: + policy, _ = FileUtils.policy_from_checkpoint(ckpt_path=path, device=device, verbose=True) + ensemble.append(policy) + print(f"[DEBUG] loaded {len(ensemble)} policies") + return ensemble + +def clear_files(*paths : str): + if len(paths) < 1: + raise ValueError("At least one path is required.") + if os.path.exists(paths[0]): + #overwrite = input(f"You are about to overwrite rollout data at: {paths}\nContinue (y/n):") + overwrite = "y" + match overwrite.lower(): + case 'y' | 'Y': + for path in paths: + with open(path, 'w') as file: + pass + case _: + exit() + + + +def main(): + """Run a trained policy from robomimic with Isaac Lab environment.""" + # parse configuration + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + + # Set observations to dictionary mode for Robomimic + env_cfg.observations.policy.concatenate_terms = False + + #create a log handler + # loghelper = LoggingHelper() + + # Set termination conditions + env_cfg.terminations.time_out = None + + # Disable recorder + env_cfg.recorders = None + + # Extract success checking function + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + + # Create environment + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + + # Set seed + torch.manual_seed(args_cli.seed) + env.seed(args_cli.seed) + + # Acquire device + device = TorchUtils.get_torch_device(try_to_use_cuda=True) + + # load the stack cube ensemble + # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') + + pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') + # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') + + + parameters = { + 'stack_cube': { + 6: { + 'unc_threshold': 0.05, + 'max_peaks': 15, + 'window_size': 30, + 'max_uncertain_windows': 3 + }, + 5: { + 'unc_threshold': 0.06, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + + 4: { + 'unc_threshold': 0.04, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 3: { + 'unc_threshold': 0.04, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 2: { + 'unc_threshold': 0.04, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 1: { + 'unc_threshold': 0.04, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 0: { + 'unc_threshold': 0.04, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + } + }, + + 'pick_place': { + 6: { + 'unc_threshold': 0.05, + 'max_peaks': 15, + 'window_size': 30, + 'max_uncertain_windows': 3 + }, + 5: { + 'unc_threshold': 0.02, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 1 + }, + + 4: { + 'unc_threshold': 0.03, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 3: { + 'unc_threshold': 0.03, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 2: { + 'unc_threshold': 0.02, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 1: { + 'unc_threshold': 0.03, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 0: { + 'unc_threshold': 0.03, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + } + + }, + 'stack_beaker': { + 6: { + 'unc_threshold': 0.05, + 'max_peaks': 15, + 'window_size': 30, + 'max_uncertain_windows': 3 + }, + 5: { + 'unc_threshold': 0.02, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + + 4: { + 'unc_threshold': 0.03, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 3: { + 'unc_threshold': 0.03, + 'max_peaks': 5, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 2: { + 'unc_threshold': 0.02, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 1: { + 'unc_threshold': 0.03, + 'max_peaks': 5, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + 0: { + 'unc_threshold': 0.03, + 'max_peaks': 2, + 'window_size': 10, + 'max_uncertain_windows': 3 + }, + } + } + + model_arch = "BC_RNN_GMM" + task = "pick_place" # stack_cube or pick_place + model_name = f"ensemble" + number = 'no_recovery_video' + + results_path = f"docs/training_data/{task}/uncertainty_rollout_{task}/{model_name}/run_{number}" + + uncertainties_path = f"{results_path}/uncertainties{number}.txt" + actions_path = f"{results_path}/actions{number}.txt" + min_actions_path = f"{results_path}/min_actions{number}.txt" + max_actions_path = f"{results_path}/max_actions{number}.txt" + time_taken_path = f"{results_path}/time_taken{number}.txt" + recovery_activated_during_rollout_path = f"{results_path}/recovery_activated_during_rollout.txt" + rollout_uncert_path = f"{uncertainties_path}/rollout_uncerts" + rollout_log_path = f"{uncertainties_path[:len(uncertainties_path)-4]}_rollout_log.txt" + + rollout_log_path = f"{uncertainties_path[:len(uncertainties_path)-4]}_rollout_log.txt" # remove the '.txt' and add rollout_log.txt + + uncertainty_results_path = f"{results_path}/uncertainty_plots" + trajectory_results_path = f"{results_path}/trajectory_plots" + os.makedirs(uncertainty_results_path, exist_ok=True) + os.makedirs(trajectory_results_path, exist_ok=True) + + # try: + # os.remove(rollout_log_path) + # except FileNotFoundError as filenotfounderror: + # pass + + # clear files + clear_files( + uncertainties_path, actions_path, + min_actions_path, max_actions_path, + time_taken_path, recovery_activated_during_rollout_path + ) + + #clear uncertainties file + with open(uncertainties_path, 'w') as file: + pass + with open(actions_path, 'w') as file: + pass + with open(min_actions_path, 'w') as file: + pass + with open(max_actions_path, 'w') as file: + pass + with open(time_taken_path, 'w') as file: + pass + with open(recovery_activated_during_rollout_path, 'w') as file: + pass + # clear rollout logger file + #with open(loghelper.namefile, 'w') as file: + # pass + + # Run policy + results = [] + for trial in range(args_cli.num_rollouts): + print(f"[INFO] Starting trial {trial}") + + terminated, traj, recovery_activated_during_rollout = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['pick_place'], use_recovery=args_cli.use_recovery, rollout_num=trial) + # save the uncertainties + print("Finished rollout, recovery needed : ", recovery_activated_during_rollout) + #print("actions shape : ", traj['actions']) + for j in range(7): + with open(f"docs/rollouts/rollout_logging_no_recovery_joint{j}.txt", "a") as file: + #file.write(f"Logs for joint {j}\n") + for i, var in enumerate(traj['actions']): + # get all the info per joint + act = str(traj['actions'][i][0][j]) + max = str(traj['max_actions'][i].values.tolist()[j]) + min = str(traj['min_actions'][i].values.tolist()[j]) + uncert = str(traj['uncertainties'][i].tolist()[j]) + #print("joint pos : ", str(traj['joint_pos'][i][0].tolist()[j])) + joint_pos = str(traj['joint_pos'][i][0].tolist()[j]) + recovery = str(traj['recovery'][0][i]) + # print("writing recovery : ", recovery) + line = f"{i} : {act} : {max} : {min} : {uncert} : {joint_pos}: {recovery}: {terminated}\n" + file.write(line) + + + for j in range(7): + joint_uncert = [t[j].item() for t in traj['uncertainties']] + with open(f"docs/rollouts/rollout_uncerts_joint{j}.txt", "a") as f: + line = ",".join(["{:.10f}".format(v) for v in joint_uncert]) + f.write(line + f" : {terminated} \n") + + with open(uncertainties_path, 'a') as file: + for i, var in enumerate(traj['uncertainties']): + line = " ".join([str(v.item()) for v in var]) + f" {terminated}\n" + file.write(f"{str(i)} {line}") + # save the actions + with open(actions_path, 'a') as file: + for i, var in enumerate(traj['actions']): + line = " ".join([str(v) for v in var[0]]) + f" {terminated}\n" + file.write(f"{str(i)} {line}") + # save the max actions + with open(max_actions_path, 'a') as file: + for i, var in enumerate(traj['max_actions']): + line = " ".join([str(v.item()) for v in var[0]]) + f" {terminated}\n" + file.write(f"{str(i)} {line}") + # save the min actions + with open(min_actions_path, 'a') as file: + for i, var in enumerate(traj['min_actions']): + line = " ".join([str(v.item()) for v in var[0]]) + f" {terminated}\n" + file.write(f"{str(i)} {line}") + # save time taken + with open(time_taken_path, 'a') as file: + for i, time_taken in enumerate(traj['time_taken']): + line = f"{str(time_taken)} {terminated}\n" + file.write(f"{str(i)} {line}") + # save recovery activated + with open("recovery_actions.txt", 'a') as file: + file.write(f"{trial} {recovery_activated_during_rollout} {terminated}\n") + + + results.append(terminated) + print(f"[INFO] Trial {trial}: {terminated}\n") + #loghelper.stopEpoch(trial) + + print(f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials") + print(f"Success rate: {results.count(True) / len(results)}") + print(f"Trial Results: {results}\n") + + + env.close() + + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/train_ensemble.py b/scripts/imitation_learning/robomimic/train_ensemble.py new file mode 100644 index 000000000000..67f6ba3160fc --- /dev/null +++ b/scripts/imitation_learning/robomimic/train_ensemble.py @@ -0,0 +1,532 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# MIT License +# +# Copyright (c) 2021 Stanford Vision and Learning Lab +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +""" +The main entry point for training policies from pre-collected data. + +This script loads dataset(s), creates a model based on the algorithm specified, +and trains the model. It supports training on various environments with multiple +algorithms from robomimic. + +Args: + algo: Name of the algorithm to run. + task: Name of the environment. + name: If provided, override the experiment name defined in the config. + dataset: If provided, override the dataset path defined in the config. + log_dir: Directory to save logs. + normalize_training_actions: Whether to normalize actions in the training data. + +This file has been modified from the original robomimic version to integrate with IsaacLab. +""" + +"""Launch Isaac Sim Simulator first.""" + +from isaaclab.app import AppLauncher + +# launch omniverse app +app_launcher = AppLauncher(headless=True) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +# Standard library imports +import argparse + +# Third-party imports +import gymnasium as gym +import h5py +import json +import numpy as np +import os +import shutil +import sys +import time +import torch +import traceback +import subprocess +import wandb + +from collections import OrderedDict +from torch.utils.data import DataLoader +from torch.utils.data import Subset + +import psutil + +# Robomimic imports +import robomimic.utils.env_utils as EnvUtils +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.obs_utils as ObsUtils +import robomimic.utils.torch_utils as TorchUtils +import robomimic.utils.train_utils as TrainUtils +from robomimic.algo import algo_factory +from robomimic.config import Config, config_factory +from robomimic.utils.log_utils import DataLogger, PrintLogger + +# Isaac Lab imports (needed so that environment is registered) +import isaaclab_tasks # noqa: F401 +import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from evaluation import inject_dropout_layers_for_training, remove_dropout_layers + +def normalize_hdf5_actions(config: Config, log_dir: str) -> str: + """Normalizes actions in hdf5 dataset to [-1, 1] range. + + Args: + config: The configuration object containing dataset path. + log_dir: Directory to save normalization parameters. + + Returns: + Path to the normalized dataset. + """ + base, ext = os.path.splitext(config.train.data) + normalized_path = base + "_normalized" + ext + + # Copy the original dataset + print(f"Creating normalized dataset at {normalized_path}") + shutil.copyfile(config.train.data, normalized_path) + + # Open the new dataset and normalize the actions + with h5py.File(normalized_path, "r+") as f: + dataset_paths = [f"/data/demo_{str(i)}/actions" for i in range(len(f["data"].keys()))] + + # Compute the min and max of the dataset + dataset = np.array(f[dataset_paths[0]]).flatten() + for i, path in enumerate(dataset_paths): + if i != 0: + data = np.array(f[path]).flatten() + dataset = np.append(dataset, data) + + max = np.max(dataset) + min = np.min(dataset) + + # Normalize the actions + for i, path in enumerate(dataset_paths): + data = np.array(f[path]) + normalized_data = 2 * ((data - min) / (max - min)) - 1 # Scale to [-1, 1] range + del f[path] + f[path] = normalized_data + + # Save the min and max values to log directory + with open(os.path.join(log_dir, "normalization_params.txt"), "w") as f: + f.write(f"min: {min}\n") + f.write(f"max: {max}\n") + + return normalized_path + + +# + +def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str], video_dirs: list[str], use_config_seed: bool = True, ensemble_size: int = 1): + """Train an ensemble of models using the algorithm specified in config. If ensemble_size is not specified, a single model will be trained. + + Args: + config: Configuration object. + device: PyTorch device to use for training. + log_dirs: List of directories to save logs for each network in the ensemble. + ckpt_dirs: List of directories to save checkpoints for each network in the ensemble. + video_dirs: List of directories to save videos for each network in the ensemble. + """ + # first set seeds + if use_config_seed: + np.random.seed(config.train.seed) + torch.manual_seed(config.train.seed) + + + print("\n============= New Training Run with Config =============") + print(config) + print("") + + + # read config to set up metadata for observation modalities (e.g. detecting rgb observations) + ObsUtils.initialize_obs_utils_with_config(config) + + # make sure the dataset exists + dataset_path = os.path.expanduser(config.train.data) + if not os.path.exists(dataset_path): + raise FileNotFoundError(f"Dataset at provided path {dataset_path} not found!") + + # load basic metadata from training file + print("\n============= Loaded Environment Metadata =============") + env_meta = FileUtils.get_env_metadata_from_dataset(dataset_path=config.train.data) + shape_meta = FileUtils.get_shape_metadata_from_dataset( + dataset_path=config.train.data, all_obs_keys=config.all_obs_keys, verbose=True + ) + + if config.experiment.env is not None: + env_meta["env_name"] = config.experiment.env + print("=" * 30 + "\n" + "Replacing Env to {}\n".format(env_meta["env_name"]) + "=" * 30) + + # create environment + envs = OrderedDict() + if config.experiment.rollout.enabled: + # create environments for validation runs + env_names = [env_meta["env_name"]] + + if config.experiment.additional_envs is not None: + for name in config.experiment.additional_envs: + env_names.append(name) + + for env_name in env_names: + env = EnvUtils.create_env_from_metadata( + env_meta=env_meta, + env_name=env_name, + render=False, + render_offscreen=config.experiment.render_video, + use_image_obs=shape_meta["use_images"], + ) + envs[env.name] = env + print(envs[env.name]) + + print("") + + + # load training data + trainset, validset = TrainUtils.load_data_for_training(config, obs_keys=shape_meta["all_obs_keys"]) + + # reduce size of the dataset + trainset = keep_data_percentage(trainset, args.dataset_percentage) + + #train_sampler = trainset.get_dataset_sampler() + if isinstance(trainset, Subset): + train_sampler = trainset.dataset.get_dataset_sampler() + else: + train_sampler = trainset.get_dataset_sampler() + + + print("\n============= Training Dataset =============") + print(trainset) + print("") + + # maybe retrieve statistics for normalizing observations + obs_normalization_stats = None + if config.train.hdf5_normalize_obs: + obs_normalization_stats = trainset.get_obs_normalization_stats() + + # initialize data loaders + train_loader = DataLoader( + dataset=trainset, + sampler=train_sampler, + batch_size=config.train.batch_size, + shuffle=(train_sampler is None), + num_workers=config.train.num_data_workers, + drop_last=True, + ) + + if config.experiment.validate: + # cap num workers for validation dataset at 1 + num_workers = min(config.train.num_data_workers, 1) + valid_sampler = validset.get_dataset_sampler() + valid_loader = DataLoader( + dataset=validset, + sampler=valid_sampler, + batch_size=config.train.batch_size, + shuffle=(valid_sampler is None), + num_workers=num_workers, + drop_last=True, + ) + else: + valid_loader = None + + # main training loop + #best_valid_loss = None + last_ckpt_time = time.time() + + # number of learning steps per epoch (defaults to a full dataset pass) + train_num_steps = config.experiment.epoch_every_n_steps + valid_num_steps = config.experiment.validation_epoch_every_n_steps + + #config.algo.transformer.num_layers = 1 + #config.algo.transformer.num_heads = 1 + for model_num in range(ensemble_size): + # setup a wand run + wand_experiment_name = f"{config.experiment.name}-model{model_num}" + run=wandb.init( + project=config.experiment.logging.wandb_proj_name, + name=wand_experiment_name + ) + #run.define_metric("train reward", step_metric="episode") + # run.define_metric("episode error", step_metric="episode") + # reset best valid loss + best_valid_loss = None + + log_dir = log_dirs[model_num] + ckpt_dir = ckpt_dirs[model_num] + video_dir = video_dirs[model_num] + + # setup logger stuff + # logger = Logger(os.path.join(log_dir, "log.txt")) + # sys.stdout = logger + # sys.stderr = logger + data_logger = DataLogger(log_dir, config=config, log_tb=config.experiment.logging.log_tb, log_wandb=config.experiment.logging.log_wandb) + with open(os.path.join(log_dir, "..", "config.json"), "w") as outfile: + json.dump(config, outfile, indent=4) + + # initialise current network in the ensemble + model = algo_factory( + algo_name=config.algo_name, + config=config, + obs_key_shapes=shape_meta["all_shapes"], + ac_dim=shape_meta["ac_dim"], + device=device, + ) + print("\n============= Model Summary =============") + print(model) # print model summary + print("") + + for epoch in range(1, config.train.num_epochs + 1): # epoch numbers start at 1 + step_log = TrainUtils.run_epoch(model=model, data_loader=train_loader, epoch=epoch, num_steps=train_num_steps) + model.on_epoch_end(epoch) + + # setup checkpoint path + epoch_ckpt_name = f"model_epoch_{epoch}" + + # check for recurring checkpoint saving conditions + should_save_ckpt = False + if config.experiment.save.enabled: + time_check = (config.experiment.save.every_n_seconds is not None) and ( + time.time() - last_ckpt_time > config.experiment.save.every_n_seconds + ) + epoch_check = ( + (config.experiment.save.every_n_epochs is not None) + and (epoch > 0) + and (epoch % config.experiment.save.every_n_epochs == 0) + ) + epoch_list_check = epoch in config.experiment.save.epochs + should_save_ckpt = time_check or epoch_check or epoch_list_check + ckpt_reason = None + if should_save_ckpt: + last_ckpt_time = time.time() + ckpt_reason = "time" + + print(f"Train Epoch {epoch}") + print(json.dumps(step_log, sort_keys=True, indent=4)) + for k, v in step_log.items(): + if k.startswith("Time_"): + data_logger.record(f"Timing_Stats/Train_{k[5:]}", v, epoch) + else: + data_logger.record(f"Train/{k}", v, epoch) + + # Evaluate the model on validation set + if config.experiment.validate: + with torch.no_grad(): + step_log = TrainUtils.run_epoch( + model=model, data_loader=valid_loader, epoch=epoch, validate=True, num_steps=valid_num_steps + ) + for k, v in step_log.items(): + if k.startswith("Time_"): + data_logger.record(f"Timing_Stats/Valid_{k[5:]}", v, epoch) + else: + data_logger.record(f"Valid/{k}", v, epoch) + + print(f"Validation Epoch {epoch}") + print(json.dumps(step_log, sort_keys=True, indent=4)) + + # save checkpoint if achieve new best validation loss + valid_check = "Loss" in step_log + if valid_check and (best_valid_loss is None or (step_log["Loss"] <= best_valid_loss)): + best_valid_loss = step_log["Loss"] + if config.experiment.save.enabled and config.experiment.save.on_best_validation: + epoch_ckpt_name += f"_best_validation_{best_valid_loss}" + should_save_ckpt = True + ckpt_reason = "valid" if ckpt_reason is None else ckpt_reason + + # Save model checkpoints based on conditions (success rate, validation loss, etc) + + if should_save_ckpt: + TrainUtils.save_model( + model=model, + config=config, + env_meta=env_meta, + shape_meta=shape_meta, + ckpt_path=os.path.join(ckpt_dir, epoch_ckpt_name + ".pth"), + obs_normalization_stats=obs_normalization_stats, + ) + + # Finally, log memory usage in MB + process = psutil.Process(os.getpid()) + mem_usage = int(process.memory_info().rss / 1000000) + data_logger.record("System/RAM Usage (MB)", mem_usage, epoch) + print(f"\nEpoch {epoch} Memory Usage: {mem_usage} MB\n") + + #config.algo.transformer.num_layers = config.algo.transformer.num_layers + 1 + #config.algo.transformer.num_heads = config.algo.transformer.num_heads + 1 + # run.finish() + # terminate logging + data_logger.close() + +def keep_data_percentage(trainset, percentage): + og_len = len(trainset) + # keep only x% of the samples + total_size = len(trainset) + num_samples = int(total_size * (percentage)) + indices = np.random.choice(total_size, num_samples, replace=False) + + trainset = Subset(trainset, indices) + + print(f"size of trainset after reduction is {len(trainset)}") + + new_len = len(trainset) + retained_percent = (new_len / og_len) * 100 + + print(f"Retained: {retained_percent:.2f}% of original dataset") + + return trainset + + + +def main(args: argparse.Namespace): + """Train a model on a task using a specified algorithm. + + Args: + args: Command line arguments. + """ + # load config + if args.task is not None: + # obtain the configuration entry point + cfg_entry_point_key = f"robomimic_{args.algo}_cfg_entry_point" + + print(f"Loading configuration for task: {args.task}") + print(gym.envs.registry.keys()) + print(" ") + cfg_entry_point_file = gym.spec(args.task).kwargs.pop(cfg_entry_point_key) + # check if entry point exists + if cfg_entry_point_file is None: + raise ValueError( + f"Could not find configuration for the environment: '{args.task}'." + f" Please check that the gym registry has the entry point: '{cfg_entry_point_key}'." + ) + + with open(cfg_entry_point_file) as f: + ext_cfg = json.load(f) + config = config_factory(ext_cfg["algo_name"]) + # update config with external json - this will throw errors if + # the external config has keys not present in the base algo config + with config.values_unlocked(): + config.update(ext_cfg) + else: + raise ValueError("Please provide a task name through CLI arguments.") + + if args.dataset is not None: + config.train.data = args.dataset + + if args.name is not None: + config.experiment.name = args.name + # little fix for WANDB + for stream in (sys.stdout, sys.stderr): + if not hasattr(stream, "isatty"): + stream.isatty = lambda: False + os.environ["WANDB_MODE"] = "offline" + run=wandb.init( + project=config.experiment.logging.wandb_proj_name, + name=config.experiment.name + ) + # run.define_metric("train reward", step_metric="episode") + # run.define_metric("episode error", step_metric="episode") + + # change location of experiment directory + config.train.output_dir = os.path.abspath(os.path.join("./logs", args.log_dir, args.task)) + original_output_dir = config.train.output_dir + + log_dirs, ckpt_dirs, video_dirs = [], [], [] + + for i in range(args.ensemble_size): + new_output_dir = f"{original_output_dir}/model{i}/" + config.train.output_dir = new_output_dir + log_dir, ckpt_dir, video_dir = TrainUtils.get_exp_dir(config) + + log_dirs.append(log_dir) + ckpt_dirs.append(ckpt_dir) + video_dirs.append(video_dir) + + print("=============== Ensemble Paths =============== ") + print(f"log_dirs: {log_dirs}") + print(f"ckpt_dirs: {ckpt_dirs}") + print(f"video_dirs: {video_dirs}") + + if args.normalize_training_actions: + config.train.data = normalize_hdf5_actions(config, log_dir) + + # get torch device + device = TorchUtils.get_torch_device(try_to_use_cuda=config.train.cuda) + + config.lock() + + # catch error during training and print it + res_str = "finished run successfully!" + try: + #train(config, device, log_dir, ckpt_dir, video_dir) + train( + config=config, + device=device, + log_dirs=log_dirs, ckpt_dirs=ckpt_dirs, video_dirs=video_dirs, + use_config_seed=True, + ensemble_size=args.ensemble_size + ) + + except Exception as e: + res_str = f"run failed with error:\n{e}\n\n{traceback.format_exc()}" + print(res_str) + run.finish() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + # Experiment Name (for tensorboard, saving models, etc.) + parser.add_argument( + "--name", + type=str, + default=None, + help="(optional) if provided, override the experiment name defined in the config", + ) + + # Dataset path, to override the one in the config + parser.add_argument( + "--dataset", + type=str, + default=None, + help="(optional) if provided, override the dataset path defined in the config", + ) + + parser.add_argument("--task", type=str, default=None, help="Name of the task.") + parser.add_argument("--algo", type=str, default=None, help="Name of the algorithm.") + parser.add_argument("--log_dir", type=str, default="robomimic", help="Path to log directory") + parser.add_argument("--normalize_training_actions", action="store_true", default=False, help="Normalize actions") + + parser.add_argument("--dataset_percentage", type=float, default=1.0, help="Percentage of samples from the dataset to use") + parser.add_argument("--ensemble_size", type=int, default=15, help="Defines the number of networks in the ensemble.") + + args = parser.parse_args() + + # run training + main(args) + # close sim app + simulation_app.close() + + + + # ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --algo bc --dataset ./docs/training_data/generated_dataset_split.hdf5 --log_dir ./logs/docs/Models/bc/bcc_rnn_gmm_stack_cube_model1/ \ No newline at end of file diff --git a/scripts/tools/convert_mesh.py b/scripts/tools/convert_mesh.py index 50b295397d39..56331c90f7ed 100644 --- a/scripts/tools/convert_mesh.py +++ b/scripts/tools/convert_mesh.py @@ -127,7 +127,7 @@ def main(): usd_dir=os.path.dirname(dest_path), usd_file_name=os.path.basename(dest_path), make_instanceable=args_cli.make_instanceable, - collision_approximation=args_cli.collision_approximation, + # mesh_collision_props=args_cli.collision_approximation, ) # Print info diff --git a/source/isaaclab/isaaclab/envs/mdp/events.py b/source/isaaclab/isaaclab/envs/mdp/events.py index 5c0c967e840c..c0c3afd618bf 100644 --- a/source/isaaclab/isaaclab/envs/mdp/events.py +++ b/source/isaaclab/isaaclab/envs/mdp/events.py @@ -133,7 +133,7 @@ def randomize_rigid_body_scale( # set the new scale scale_spec.default = Gf.Vec3f(*rand_samples[i]) - + print(f"Set object scale : {rand_samples[i]}") # ensure the operation is done in the right ordering if we created the scale attribute. # otherwise, we assume the scale attribute is already in the right order. # note: by default isaac sim follows this ordering for the transform stack so any asset @@ -1300,6 +1300,7 @@ def reset_scene_to_default(env: ManagerBasedEnv, env_ids: torch.Tensor, reset_jo # obtain default and deal with the offset for env origins default_root_state = rigid_object.data.default_root_state[env_ids].clone() default_root_state[:, 0:3] += env.scene.env_origins[env_ids] + #print(f"[RESET] Scene RESET, obj {rigid_object} orientation {default_root_state}") # set into the physics simulation rigid_object.write_root_pose_to_sim(default_root_state[:, :7], env_ids=env_ids) rigid_object.write_root_velocity_to_sim(default_root_state[:, 7:], env_ids=env_ids) diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py b/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py index bc573b58d516..544d80075af4 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py @@ -16,7 +16,9 @@ from .franka_stack_ik_rel_skillgen_env_cfg import FrankaCubeStackIKRelSkillgenEnvCfg from .franka_stack_ik_rel_visuomotor_cosmos_mimic_env_cfg import FrankaCubeStackIKRelVisuomotorCosmosMimicEnvCfg from .franka_stack_ik_rel_visuomotor_mimic_env_cfg import FrankaCubeStackIKRelVisuomotorMimicEnvCfg - +from .cube_blueprint_mimic_env_cfg import CubeBlueprintMimicEnvCfg +from .cube_mimic_env_cfg import CubeMimicEnvCfg +from .cube_mimic_env import CubeMimicEnv ## # Inverse Kinematics - Relative Pose Control ## @@ -167,3 +169,23 @@ }, disable_env_checker=True, ) + +###### cube stuff + +gym.register( + id="Cube-Mimic-v0", + entry_point="isaaclab_mimic.envs:CubeMimicEnv", + kwargs={ + "env_cfg_entry_point": cube_mimic_env_cfg.CubeMimicEnvCfg, + }, + disable_env_checker=True, +) + +gym.register( + id="Cube-Blueprint-Mimic-v0", + entry_point="isaaclab_mimic.envs:CubeMimicEnv", + kwargs={ + "env_cfg_entry_point": cube_blueprint_mimic_env_cfg.CubeBlueprintMimicEnvCfg, + }, + disable_env_checker=True, +) \ No newline at end of file diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py new file mode 100755 index 000000000000..698abcab7c7a --- /dev/null +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py @@ -0,0 +1,150 @@ +# Copyright (c) 2024-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig +from isaaclab.utils import configclass + +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_cfg import FrankaDevEnvCfg + + +@configclass +class CubeBlueprintMimicEnvCfg(FrankaDevEnvCfg, MimicEnvCfg): + """ + Isaac Lab Mimic environment config class for Franka Cube Stack IK Rel env. + """ + + def __post_init__(self): + # post init of parents + super().__post_init__() + + # Override the existing values + self.datagen_config.name = "beaker_rand_scale_blueprint_D0" + self.datagen_config.generation_guarantee = True + self.datagen_config.generation_keep_failed = False + self.datagen_config.generation_num_trials = 10 + self.datagen_config.generation_select_src_per_subtask = True + self.datagen_config.generation_transform_first_robot_pose = False + self.datagen_config.generation_interpolate_from_last_target_pose = True + self.datagen_config.max_num_failures = 25 + self.datagen_config.seed = 1 + + # The following are the subtask configurations for the stack task. + subtask_configs = [] + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # This key corresponds to the binary indicator in "datagen_info" that signals + # when this subtask is finished (e.g., on a 0 to 1 edge). + subtask_term_signal="appr", + # Specifies time offsets for data generation when splitting a trajectory into + # subtask segments. Random offsets are added to the termination boundary. + subtask_term_offset_range=(0, 0), + # Selection strategy for the source subtask segment during data generation + selection_strategy="nearest_neighbor_object", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=5, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + ) + ) + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # Corresponding key for the binary indicator in "datagen_info" for completion + subtask_term_signal="grasp", + # Time offsets for data generation when splitting a trajectory + subtask_term_offset_range=(0, 10), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_object", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=5, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + ) + ) + #lift ? + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # End of final subtask does not need to be detected + subtask_term_signal="lift", + # No time offsets for the final subtask + subtask_term_offset_range=(5, 10), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_robot_distance", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=5, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + ) + ) + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # End of final subtask does not need to be detected + # LOL YOU DO + subtask_term_signal="appr_goal", + # No time offsets for the final subtask + subtask_term_offset_range=(0, 0), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_robot_distance", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=5, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + ) + ) + # subtask_configs.append( + # SubTaskConfig( + # # Each subtask involves manipulation with respect to a single object frame. + # object_ref="object", + # # End of final subtask does not need to be detected + # # LOL YOU DO + # subtask_term_signal="release_object", + # # No time offsets for the final subtask + # subtask_term_offset_range=(0, 0), + # # Selection strategy for source subtask segment + # selection_strategy="nearest_neighbor_object", + # # Optional parameters for the selection strategy function + # selection_strategy_kwargs={"nn_k": 3}, + # # Amount of action noise to apply during this subtask + # action_noise=0.03, + # # Number of interpolation steps to bridge to this subtask segment + # num_interpolation_steps=5, + # # Additional fixed steps for the robot to reach the necessary pose + # num_fixed_steps=0, + # # If True, apply action noise during the interpolation phase and execution + # apply_noise_during_interpolation=False, + # ) + # ) + self.subtask_configs["franka"] = subtask_configs \ No newline at end of file diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py new file mode 100755 index 000000000000..a295df1c7fce --- /dev/null +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py @@ -0,0 +1,165 @@ + +# Copyright (c) 2024-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +import torch +from collections.abc import Sequence + +import isaaclab.utils.math as PoseUtils +from isaaclab.envs import ManagerBasedRLMimicEnv + + +class CubeMimicEnv(ManagerBasedRLMimicEnv): + """ + Isaac Lab Mimic environment wrapper class for Franka Cube Stack IK Rel env. + """ + + def get_robot_eef_pose(self, eef_name: str, env_ids: Sequence[int] | None = None) -> torch.Tensor: + """ + Get current robot end effector pose. Should be the same frame as used by the robot end-effector controller. + + Args: + eef_name: Name of the end effector. + env_ids: Environment indices to get the pose for. If None, all envs are considered. + + Returns: + A torch.Tensor eef pose matrix. Shape is (len(env_ids), 4, 4) + """ + if env_ids is None: + env_ids = slice(None) + + # Retrieve end effector pose from the observation buffer + eef_pos = self.obs_buf["policy"]["eef_pos"][env_ids] + eef_quat = self.obs_buf["policy"]["eef_quat"][env_ids] + + # Quaternion format is w,x,y,z + return PoseUtils.make_pose(eef_pos, PoseUtils.matrix_from_quat(eef_quat)) + + def target_eef_pose_to_action( + self, target_eef_pose_dict: dict, gripper_action_dict: dict, noise: float | None = None, env_id: int = 0 + ) -> torch.Tensor: + """ + Takes a target pose and gripper action for the end effector controller and returns an action + (usually a normalized delta pose action) to try and achieve that target pose. + Noise is added to the target pose action if specified. + + Args: + target_eef_pose_dict: Dictionary of 4x4 target eef pose for each end-effector. + gripper_action_dict: Dictionary of gripper actions for each end-effector. + noise: Noise to add to the action. If None, no noise is added. + env_id: Environment index to get the action for. + + Returns: + An action torch.Tensor that's compatible with env.step(). + """ + eef_name = list(self.cfg.subtask_configs.keys())[0] + + # target position and rotation + (target_eef_pose,) = target_eef_pose_dict.values() + target_pos, target_rot = PoseUtils.unmake_pose(target_eef_pose) + + # current position and rotation + curr_pose = self.get_robot_eef_pose(eef_name, env_ids=[env_id])[0] + curr_pos, curr_rot = PoseUtils.unmake_pose(curr_pose) + + # normalized delta position action + delta_position = target_pos - curr_pos + + # normalized delta rotation action + delta_rot_mat = target_rot.matmul(curr_rot.transpose(-1, -2)) + delta_quat = PoseUtils.quat_from_matrix(delta_rot_mat) + delta_rotation = PoseUtils.axis_angle_from_quat(delta_quat) + + # get gripper action for single eef + (gripper_action,) = gripper_action_dict.values() + + # add noise to action + pose_action = torch.cat([delta_position, delta_rotation], dim=0) + if noise is not None: + noise = noise * torch.randn_like(pose_action) + pose_action += noise + pose_action = torch.clamp(pose_action, -1.0, 1.0) + + return torch.cat([pose_action, gripper_action], dim=0) + + def action_to_target_eef_pose(self, action: torch.Tensor) -> dict[str, torch.Tensor]: + """ + Converts action (compatible with env.step) to a target pose for the end effector controller. + Inverse of @target_eef_pose_to_action. Usually used to infer a sequence of target controller poses + from a demonstration trajectory using the recorded actions. + + Args: + action: Environment action. Shape is (num_envs, action_dim) + + Returns: + A dictionary of eef pose torch.Tensor that @action corresponds to + """ + eef_name = list(self.cfg.subtask_configs.keys())[0] + + delta_position = action[:, :3] + delta_rotation = action[:, 3:6] + + # current position and rotation + curr_pose = self.get_robot_eef_pose(eef_name, env_ids=None) + curr_pos, curr_rot = PoseUtils.unmake_pose(curr_pose) + + # get pose target + target_pos = curr_pos + delta_position + + # Convert delta_rotation to axis angle form + delta_rotation_angle = torch.linalg.norm(delta_rotation, dim=-1, keepdim=True) + delta_rotation_axis = delta_rotation / delta_rotation_angle + + # Handle invalid division for the case when delta_rotation_angle is close to zero + is_close_to_zero_angle = torch.isclose(delta_rotation_angle, torch.zeros_like(delta_rotation_angle)).squeeze(1) + delta_rotation_axis[is_close_to_zero_angle] = torch.zeros_like(delta_rotation_axis)[is_close_to_zero_angle] + + delta_quat = PoseUtils.quat_from_angle_axis(delta_rotation_angle.squeeze(1), delta_rotation_axis).squeeze(0) + delta_rot_mat = PoseUtils.matrix_from_quat(delta_quat) + target_rot = torch.matmul(delta_rot_mat, curr_rot) + + target_poses = PoseUtils.make_pose(target_pos, target_rot).clone() + + return {eef_name: target_poses} + + def actions_to_gripper_actions(self, actions: torch.Tensor) -> dict[str, torch.Tensor]: + """ + Extracts the gripper actuation part from a sequence of env actions (compatible with env.step). + + Args: + actions: environment actions. The shape is (num_envs, num steps in a demo, action_dim). + + Returns: + A dictionary of torch.Tensor gripper actions. Key to each dict is an eef_name. + """ + # last dimension is gripper action + return {list(self.cfg.subtask_configs.keys())[0]: actions[:, -1:]} + + def get_subtask_term_signals(self, env_ids: Sequence[int] | None = None) -> dict[str, torch.Tensor]: + """ + Gets a dictionary of termination signal flags for each subtask in a task. The flag is 1 + when the subtask has been completed and 0 otherwise. The implementation of this method is + required if intending to enable automatic subtask term signal annotation when running the + dataset annotation tool. This method can be kept unimplemented if intending to use manual + subtask term signal annotation. + + Args: + env_ids: Environment indices to get the termination signals for. If None, all envs are considered. + + Returns: + A dictionary termination signal flags (False or True) for each subtask. + """ + if env_ids is None: + env_ids = slice(None) + + signals = dict() + subtask_terms = self.obs_buf["subtask_terms"] + #signals["appr"] = subtask_terms["appr"][env_ids] + signals["grasp"] = subtask_terms["grasp"][env_ids] + #signals["lift"] = subtask_terms["lift"][env_ids] + signals["appr_goal"] = subtask_terms["appr_goal"][env_ids] + # signals["release_object"] = subtask_terms["release_object"][env_ids] + # final subtask is placing cubeC on cubeA (motion relative to cubeA) - but final subtask signal is not needed + return signals diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py new file mode 100755 index 000000000000..982b1320bac6 --- /dev/null +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py @@ -0,0 +1,132 @@ +# Copyright (c) 2024-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig +from isaaclab.utils import configclass + +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_cfg import FrankaDevEnvCfg + + +@configclass +class CubeMimicEnvCfg(FrankaDevEnvCfg, MimicEnvCfg): + """ + Isaac Lab Mimic environment config class for Franka Cube Stack IK Rel env. + """ + + def __post_init__(self): + # post init of parents + super().__post_init__() + # # TODO: Figure out how we can move this to the MimicEnvCfg class + # # The __post_init__() above only calls the init for FrankaCubeStackEnvCfg and not MimicEnvCfg + # # https://stackoverflow.com/questions/59986413/achieving-multiple-inheritance-using-python-dataclasses + + # Override the existing values + self.datagen_config.name = "beaker_rand_scale_D0" + self.datagen_config.generation_guarantee = True + self.datagen_config.generation_keep_failed = False + self.datagen_config.generation_num_trials = 100 + self.datagen_config.generation_select_src_per_subtask = True + self.datagen_config.generation_transform_first_robot_pose = False + self.datagen_config.generation_interpolate_from_last_target_pose = True + self.datagen_config.max_num_failures = 100 + self.datagen_config.seed = 101 + + # The following are the subtask configurations for the stack task. + # The following are the subtask configurations for the stack task. + subtask_configs = [] + # subtask_configs.append( + # SubTaskConfig( + # # Each subtask involves manipulation with respect to a single object frame. + # object_ref="object", + # # This key corresponds to the binary indicator in "datagen_info" that signals + # # when this subtask is finished (e.g., on a 0 to 1 edge). + # subtask_term_signal="appr", + # # Specifies time offsets for data generation when splitting a trajectory into + # # subtask segments. Random offsets are added to the termination boundary. + # subtask_term_offset_range=(0, 0), + # # Selection strategy for the source subtask segment during data generation + # selection_strategy="nearest_neighbor_object", + # # Optional parameters for the selection strategy function + # selection_strategy_kwargs={"nn_k": 3}, + # # Amount of action noise to apply during this subtask + # action_noise=0.03, + # # Number of interpolation steps to bridge to this subtask segment + # num_interpolation_steps=0, + # # Additional fixed steps for the robot to reach the necessary pose + # num_fixed_steps=0, + # # If True, apply action noise during the interpolation phase and execution + # apply_noise_during_interpolation=False, + # ) + # ) + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # Corresponding key for the binary indicator in "datagen_info" for completion + subtask_term_signal="grasp", + # Time offsets for data generation when splitting a trajectory + subtask_term_offset_range=(0, 0), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_object", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=0, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + ) + ) + #lift ? + # subtask_configs.append( + # SubTaskConfig( + # # Each subtask involves manipulation with respect to a single object frame. + # object_ref="object", + # # End of final subtask does not need to be detected + # subtask_term_signal="lift", + # # No time offsets for the final subtask + # subtask_term_offset_range=(0, 0), + # # Selection strategy for source subtask segment + # selection_strategy="nearest_neighbor_robot_distance", + # # Optional parameters for the selection strategy function + # selection_strategy_kwargs={"nn_k": 3}, + # # Amount of action noise to apply during this subtask + # action_noise=0.03, + # # Number of interpolation steps to bridge to this subtask segment + # num_interpolation_steps=0, + # # Additional fixed steps for the robot to reach the necessary pose + # num_fixed_steps=0, + # # If True, apply action noise during the interpolation phase and execution + # apply_noise_during_interpolation=False, + # ) + # ) + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # End of final subtask does not need to be detected + # LOL YOU DO + subtask_term_signal="appr_goal", + # No time offsets for the final subtask + subtask_term_offset_range=(0, 0), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_robot_distance", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=0, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + ) + ) + + self.subtask_configs["franka"] = subtask_configs \ No newline at end of file diff --git a/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner_cfg.py index 6755093f7046..eaf28e0ed153 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner_cfg.py @@ -117,7 +117,7 @@ class CuroboPlannerCfg: enable_graph_attempt: int = 5 """Number of graph planning attempts.""" - max_planning_attempts: int = 15 + max_planning_attempts: int = 100 """Maximum number of planning attempts.""" enable_finetune_trajopt: bool = True @@ -391,14 +391,14 @@ def franka_config(cls) -> "CuroboPlannerCfg": grasp_gripper_open_val=0.04, approach_distance=0.0, retreat_distance=0.0, - max_planning_attempts=1, + max_planning_attempts=100, time_dilation_factor=0.6, enable_finetune_trajopt=True, n_repeat=None, motion_step_size=None, visualize_spheres=False, visualize_plan=False, - debug_planner=False, + debug_planner=True, sphere_update_freq=5, motion_noise_scale=0.02, # World extraction tuning for Franka envs @@ -436,6 +436,22 @@ def franka_stack_cube_config(cls) -> "CuroboPlannerCfg": config.surface_sphere_radius = 0.01 config.get_world_config = lambda: config._get_world_config_with_table_adjustment() return config + + ### Add in Chem pickup style + @classmethod + def franka_beaker_config(cls) -> "CuroboPlannerCfg": + """Create configuration for Franka stacking a normal cube.""" + config = cls.franka_config() + config.static_objects = ["table"] + config.visualize_plan = True + config.debug_planner = True + config.motion_noise_scale = 0.02 + config.collision_activation_distance = 0.0 + config.approach_distance = 0.05 + config.retreat_distance = 0.05 + config.surface_sphere_radius = 0.005 + config.get_world_config = lambda: config._get_world_config_with_table_adjustment() + return config @classmethod def from_task_name(cls, task_name: str) -> "CuroboPlannerCfg": @@ -453,6 +469,8 @@ def from_task_name(cls, task_name: str) -> "CuroboPlannerCfg": return cls.franka_stack_cube_bin_config() elif "stack-cube" in task_lower: return cls.franka_stack_cube_config() + elif "Cube-Mimic" in task_lower: + return cls.franka_beaker_config() else: # Default to Franka configuration print(f"Warning: Unknown robot in task '{task_name}', using Franka configuration") diff --git a/source/isaaclab_mimic/isaaclab_mimic/motion_planners/motion_planner_base.py b/source/isaaclab_mimic/isaaclab_mimic/motion_planners/motion_planner_base.py index 783363b73300..31cae876ab32 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/motion_planners/motion_planner_base.py +++ b/source/isaaclab_mimic/isaaclab_mimic/motion_planners/motion_planner_base.py @@ -36,7 +36,7 @@ class MotionPlannerBase(ABC): """ def __init__( - self, env: ManagerBasedEnv, robot: Articulation, env_id: int = 0, debug: bool = False, **kwargs + self, env: ManagerBasedEnv, robot: Articulation, env_id: int = 0, debug: bool = True, **kwargs ) -> None: """Initialize the motion planner. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/__init__.py new file mode 100755 index 000000000000..fd33aacd3a5b --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Configurations for the object lift environments.""" + +# We leave this file empty since we don't want to expose any configs in this package directly. +# We still need this file to import the "config" module in the parent package. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/__init__.py new file mode 100755 index 000000000000..fd33aacd3a5b --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Configurations for the object lift environments.""" + +# We leave this file empty since we don't want to expose any configs in this package directly. +# We still need this file to import the "config" module in the parent package. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/__init__.py new file mode 100755 index 000000000000..14d95703522d --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/__init__.py @@ -0,0 +1,74 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +import gymnasium as gym +import os + +from . import agents + +## +# Register Gym environments. +## + +## +# Joint Position Control +## + + + +## +# Inverse Kinematics - Absolute Pose Control +## + +# gym.register( +# id="Isaac-Lift-Teddy-Bear-Franka-IK-Abs-v0", +# entry_point="isaaclab.envs:ManagerBasedRLEnv", +# kwargs={ +# "env_cfg_entry_point": f"{__name__}.ik_abs_env_cfg:FrankaTeddyBearLiftEnvCfg", +# }, +# disable_env_checker=True, +# ) + +## +# Inverse Kinematics - Relative Pose Control +## + + +# gym.register( +# id="Dev-IK-Abs-v0", +# entry_point="isaaclab.envs:ManagerBasedRLEnv", +# kwargs={ +# "env_cfg_entry_point": f"{__name__}.dev_env_cfg:FrankaDevEnvCfg", +# "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), +# }, +# disable_env_checker=True, +# ) + +gym.register( + id="Pour-IK-Rel-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.pour_ik_rel_env_cfg:FrankaPourEnvCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), + "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), + "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + #"robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc.json"), + }, + disable_env_checker=True, +) +# gym.register( +# id="Dev-IK-Rel-v1", +# entry_point="isaaclab.envs:ManagerBasedRLEnv", +# kwargs={ +# "env_cfg_entry_point": f"{__name__}.dev_ik_rel_env_obs:FrankaDevEnvCfg", +# "robomimic_bc_rnn_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), +# "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), +# "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), +# "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), +# "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc.json"), +# }, +# disable_env_checker=True, +# ) + diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/__init__.py new file mode 100755 index 000000000000..e75ca2bc3f90 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/rl_games_ppo_cfg.yaml b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/rl_games_ppo_cfg.yaml new file mode 100755 index 000000000000..6ed68d88912c --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/rl_games_ppo_cfg.yaml @@ -0,0 +1,79 @@ +params: + seed: 42 + + # environment wrapper clipping + env: + clip_observations: 100.0 + clip_actions: 100.0 + + algo: + name: a2c_continuous + + model: + name: continuous_a2c_logstd + + network: + name: actor_critic + separate: False + space: + continuous: + mu_activation: None + sigma_activation: None + + mu_init: + name: default + sigma_init: + name: const_initializer + val: 0 + fixed_sigma: True + mlp: + units: [256, 128, 64] + activation: elu + d2rl: False + + initializer: + name: default + regularizer: + name: None + + load_checkpoint: False # flag which sets whether to load the checkpoint + load_path: '' # path to the checkpoint to load + + config: + name: franka_lift + env_name: rlgpu + device: 'cuda:0' + device_name: 'cuda:0' + multi_gpu: False + ppo: True + mixed_precision: False + normalize_input: True + normalize_value: True + value_bootstrap: False + num_actors: -1 + reward_shaper: + scale_value: 0.01 + normalize_advantage: True + gamma: 0.99 + tau: 0.95 + learning_rate: 1e-4 + lr_schedule: adaptive + schedule_type: legacy + kl_threshold: 0.01 + score_to_win: 100000000 + max_epochs: 1500 + save_best_after: 100 + save_frequency: 50 + print_stats: True + grad_norm: 1.0 + entropy_coef: 0.001 + truncate_grads: True + e_clip: 0.2 + horizon_length: 24 + minibatch_size: 24576 + mini_epochs: 8 + critic_coef: 4 + clip_value: True + clip_actions: False + seq_len: 4 + bounds_loss_coef: 0.0001 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc.json new file mode 100755 index 000000000000..3108d71b52d3 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc.json @@ -0,0 +1,135 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_202507210930", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "terminate_on_success" : true, + "n": 50, + "horizon": 400, + "rate": 50 + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/bc", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false + }, + "rnn": { + "enabled": false, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + } + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_rnn_low_dim.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_rnn_low_dim.json new file mode 100755 index 000000000000..6b09227a280f --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_rnn_low_dim.json @@ -0,0 +1,135 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_new_demos", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "terminate_on_success" : true, + "n": 50, + "horizon": 400, + "rate": 50 + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/bc_rnn", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + } + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_rnn_low_dim_not.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_rnn_low_dim_not.json new file mode 100755 index 000000000000..00d956d4cf16 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_rnn_low_dim_not.json @@ -0,0 +1,306 @@ +{ + "algo_name": "hbc", + "experiment": { + "name": "hbc_202507211400", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 50, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": null, + "output_dir": "../hbc_trained_models", + "num_data_workers": 0, + "hdf5_cache_mode": "all", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 1 + }, + "algo": { + "mode": "separate", + "actor_use_random_subgoals": false, + "subgoal_update_interval": 10, + "latent_subgoal": { + "enabled": false, + "prior_correction": { + "enabled": false, + "num_samples": 100 + } + }, + "planner": { + "optim_params": { + "goal_network": { + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + } + } + }, + "subgoal_horizon": 10, + "ae": { + "planner_layer_dims": [ + 300, + 400 + ] + }, + "vae": { + "enabled": true, + "latent_dim": 16, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + } + }, + "actor": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + } + }, + "observation": { + "planner": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + }, + "subgoal": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "actor": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_trans.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_trans.json new file mode 100755 index 000000000000..3762c8ae0b0a --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bc_trans.json @@ -0,0 +1,133 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_trans_20250722_frame_20", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "terminate_on_success" : true, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0 + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/bc_trans", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 1, + "frame_stack" : 20, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false + }, + "rnn": { + "enabled": false + }, + "transformer": { + "enabled": true, + "context_length": 20, + + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + + "joint_pos", + "joint_vel", + "actions" + + ], + "rgb": [], + "depth": [], + "scan": [] + } + } + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bcq.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bcq.json new file mode 100755 index 000000000000..f152c8ba2247 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/bcq.json @@ -0,0 +1,308 @@ +{ + "algo_name": "bcq", + "experiment": { + "name": "bcq", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/bcq", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 1, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 1 + }, + "algo": { + "optim_params": { + "critic": { + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + }, + "action_sampler": { + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + }, + "actor": { + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + } + }, + "discount": 0.99, + "n_step": 1, + "target_tau": 0.005, + "infinite_horizon": false, + "critic": { + "use_huber": false, + "max_gradient_norm": null, + "value_bounds": null, + "num_action_samples": 10, + "num_action_samples_rollout": 100, + "ensemble": { + "n": 2, + "weight": 0.75 + }, + "distributional": { + "enabled": false, + "num_atoms": 51 + }, + "layer_dims": [ + 300, + 400 + ] + }, + "action_sampler": { + "actor_layer_dims": [ + 1024, + 1024 + ], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": true, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "freeze_encoder_epoch": -1 + }, + "actor": { + "enabled": false, + "perturbation_scale": 0.05, + "layer_dims": [ + 300, + 400 + ] + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + + "joint_pos", + "joint_vel", + "actions" + + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + }, + "conv_activation": "relu", + "conv_kwargs": { + "out_channels": [ + 32, + 64, + 64 + ], + "kernel_size": [ + 8, + 4, + 2 + ], + "stride": [ + 4, + 2, + 1 + ] + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + } + } + } +} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/hbc.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/hbc.json new file mode 100755 index 000000000000..e4be27fbc254 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/hbc.json @@ -0,0 +1,306 @@ +{ + "algo_name": "hbc", + "experiment": { + "name": "hbc_202507211400", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 50, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate"` : false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": null, + "output_dir": "../hbc_trained_models", + "num_data_workers": 0, + "hdf5_cache_mode": "all", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 1 + }, + "algo": { + "mode": "separate", + "actor_use_random_subgoals": false, + "subgoal_update_interval": 10, + "latent_subgoal": { + "enabled": false, + "prior_correction": { + "enabled": false, + "num_samples": 100 + } + }, + "planner": { + "optim_params": { + "goal_network": { + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + } + } + }, + "subgoal_horizon": 10, + "ae": { + "planner_layer_dims": [ + 300, + 400 + ] + }, + "vae": { + "enabled": true, + "latent_dim": 16, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + } + }, + "actor": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + } + }, + "observation": { + "planner": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + }, + "subgoal": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "actor": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/rsl_rl_ppo_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/rsl_rl_ppo_cfg.py new file mode 100755 index 000000000000..e3fb13e1d1f7 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/rsl_rl_ppo_cfg.py @@ -0,0 +1,37 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.utils import configclass + +from isaaclab_rl.rsl_rl import RslRlOnPolicyRunnerCfg, RslRlPpoActorCriticCfg, RslRlPpoAlgorithmCfg + + +@configclass +class LiftCubePPORunnerCfg(RslRlOnPolicyRunnerCfg): + num_steps_per_env = 24 + max_iterations = 1500 + save_interval = 50 + experiment_name = "franka_lift" + empirical_normalization = False + policy = RslRlPpoActorCriticCfg( + init_noise_std=1.0, + actor_hidden_dims=[256, 128, 64], + critic_hidden_dims=[256, 128, 64], + activation="elu", + ) + algorithm = RslRlPpoAlgorithmCfg( + value_loss_coef=1.0, + use_clipped_value_loss=True, + clip_param=0.2, + entropy_coef=0.006, + num_learning_epochs=5, + num_mini_batches=4, + learning_rate=1.0e-4, + schedule="adaptive", + gamma=0.98, + lam=0.95, + desired_kl=0.01, + max_grad_norm=1.0, + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/sb3_ppo_cfg.yaml b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/sb3_ppo_cfg.yaml new file mode 100755 index 000000000000..6d6f15781acc --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/sb3_ppo_cfg.yaml @@ -0,0 +1,28 @@ +# Reference: https://github.com/DLR-RM/rl-baselines3-zoo/blob/master/hyperparams/ppo.yml#L32 +seed: 42 + +# epoch * n_steps * nenvs: 500×512*8*8 +n_timesteps: 16384000 +policy: 'MlpPolicy' +n_steps: 64 +# mini batch size: num_envs * nsteps / nminibatches 2048×512÷2048 +batch_size: 192 +gae_lambda: 0.95 +gamma: 0.99 +n_epochs: 8 +ent_coef: 0.00 +vf_coef: 0.0001 +learning_rate: !!float 3e-4 +clip_range: 0.2 +policy_kwargs: "dict( + activation_fn=nn.ELU, + net_arch=dict(pi=[256, 128, 64], vf=[256, 128, 64]) + )" +target_kl: 0.01 +max_grad_norm: 1.0 + +# # Uses VecNormalize class to normalize obs +# normalize_input: True +# # Uses VecNormalize class to normalize rew +# normalize_value: True +# clip_obs: 5 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/skrl_ppo_cfg.yaml b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/skrl_ppo_cfg.yaml new file mode 100755 index 000000000000..94337d46bac6 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/skrl_ppo_cfg.yaml @@ -0,0 +1,80 @@ +seed: 42 + + +# Models are instantiated using skrl's model instantiator utility +# https://skrl.readthedocs.io/en/latest/api/utils/model_instantiators.html +models: + separate: False + policy: # see gaussian_model parameters + class: GaussianMixin + clip_actions: False + clip_log_std: True + min_log_std: -20.0 + max_log_std: 2.0 + initial_log_std: 0.0 + network: + - name: net + input: STATES + layers: [256, 128, 64] + activations: elu + output: ACTIONS + value: # see deterministic_model parameters + class: DeterministicMixin + clip_actions: False + network: + - name: net + input: STATES + layers: [256, 128, 64] + activations: elu + output: ONE + + +# Rollout memory +# https://skrl.readthedocs.io/en/latest/api/memories/random.html +memory: + class: RandomMemory + memory_size: -1 # automatically determined (same as agent:rollouts) + + +# PPO agent configuration (field names are from PPO_DEFAULT_CONFIG) +# https://skrl.readthedocs.io/en/latest/api/agents/ppo.html +agent: + class: PPO + rollouts: 24 + learning_epochs: 8 + mini_batches: 4 + discount_factor: 0.99 + lambda: 0.95 + learning_rate: 1.0e-04 + learning_rate_scheduler: KLAdaptiveLR + learning_rate_scheduler_kwargs: + kl_threshold: 0.01 + state_preprocessor: RunningStandardScaler + state_preprocessor_kwargs: null + value_preprocessor: RunningStandardScaler + value_preprocessor_kwargs: null + random_timesteps: 0 + learning_starts: 0 + grad_norm_clip: 1.0 + ratio_clip: 0.2 + value_clip: 0.2 + clip_predicted_values: True + entropy_loss_scale: 0.001 + value_loss_scale: 2.0 + kl_threshold: 0.0 + rewards_shaper_scale: 0.01 + time_limit_bootstrap: False + # logging and checkpoint + experiment: + directory: "franka_lift" + experiment_name: "" + write_interval: auto + checkpoint_interval: auto + + +# Sequential trainer +# https://skrl.readthedocs.io/en/latest/api/trainers/sequential.html +trainer: + class: SequentialTrainer + timesteps: 36000 + environment_info: log diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/dev_osc_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/dev_osc_cfg.py new file mode 100755 index 000000000000..bb1d4bd550e2 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/dev_osc_cfg.py @@ -0,0 +1,114 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab_tasks.manager_based.manipulation.cube_lift.lift_env_cfg import CubeEnvCfg +from isaaclab_assets.glassware.glassware_objects import Chem_Assets + + +import math +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + +@configclass +class FrankaDevEnvCfg(CubeEnvCfg): + def __post_init__(self): + # post init of parent + + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.405, + "panda_joint2": 0.35, + "panda_joint3": -0.22, + "panda_joint4": -3.0, + "panda_joint5": -2.85, + "panda_joint6": math.pi / 2, # +90° → keeps hand level + "panda_joint7": 0.9, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + # Set the body name for the end effector + self.commands.object_pose.body_name = "panda_hand" + self.commands.object_pose.body_name = "panda_hand" + + glassware = Chem_Assets() + # Set each stacking cube deterministically + self.scene.object = glassware.beaker(pos=[0.4, 0.0, 0.0203],name="Object") + #### everything else leave default + # self.scene.flask = glassware.flask() + # self.scene.vial = glassware.vial() + # self.scene.beaker = glassware.beaker() + self.scene.stirplate = glassware.stirplate() + #self.scene.random = glassware.random_object() + + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.1034], + + ), + ), + ], + ) + + +@configclass +class FrankaDevEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/ik_abs_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/ik_abs_env_cfg.py new file mode 100755 index 000000000000..255b5b55eb86 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/ik_abs_env_cfg.py @@ -0,0 +1,128 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import DeformableObjectCfg +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sim.spawners import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR + +import isaaclab_tasks.manager_based.manipulation.cube_lift.mdp as mdp + +from . import joint_pos_env_cfg +import math +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +## +# Rigid object lift environment. +## + + +@configclass +class FrankaCubeEnvCfg(joint_pos_env_cfg.FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.405, + "panda_joint2": 0.35, + "panda_joint3": -0.22, + "panda_joint4": -3.0, + "panda_joint5": -2.85, + "panda_joint6": math.pi / 2, # +90° → keeps hand level + "panda_joint7": 0.9, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + print("action shape: ", self.actions.arm_action.shape) + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False + + +## +# Deformable object lift environment. +## + + +@configclass +class FrankaTeddyBearLiftEnvCfg(FrankaCubeLiftEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + self.scene.object = DeformableObjectCfg( + prim_path="{ENV_REGEX_NS}/Object", + init_state=DeformableObjectCfg.InitialStateCfg(pos=(0.5, 0, 0.05), rot=(0.707, 0, 0, 0.707)), + spawn=UsdFileCfg( + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Objects/Teddy_Bear/teddy_bear.usd", + scale=(0.01, 0.01, 0.01), + ), + ) + + # Make the end effector less stiff to not hurt the poor teddy bear + self.scene.robot.actuators["panda_hand"].effort_limit = 50.0 + self.scene.robot.actuators["panda_hand"].stiffness = 40.0 + self.scene.robot.actuators["panda_hand"].damping = 10.0 + + # Disable replicate physics as it doesn't work for deformable objects + # FIXME: This should be fixed by the PhysX replication system. + self.scene.replicate_physics = False + + # Set events for the specific object type (deformable cube) + self.events.reset_object_position = EventTerm( + func=mdp.reset_nodal_state_uniform, + mode="reset", + params={ + "position_range": {"x": (-0.1, 0.1), "y": (-0.25, 0.25), "z": (0.0, 0.0)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object"), + }, + ) + + # Remove all the terms for the state machine demo + # TODO: Computing the root pose of deformable object from nodal positions is expensive. + # We need to fix that part before enabling these terms for the training. + self.terminations.object_dropping = None + self.rewards.reaching_object = None + self.rewards.lifting_object = None + self.rewards.object_goal_tracking = None + self.rewards.object_goal_tracking_fine_grained = None + self.observations.policy.object_position = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/ik_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/ik_rel_env_cfg.py new file mode 100755 index 000000000000..1335fa8cf984 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/ik_rel_env_cfg.py @@ -0,0 +1,65 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from . import joint_pos_env_cfg +import math +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +@configclass +class FrankaCubeEnvCfg(joint_pos_env_cfg.FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + print("This is the base environment") + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.405, + "panda_joint2": 0.35, + "panda_joint3": -0.22, + "panda_joint4": -3.0, + "panda_joint5": -2.85, + "panda_joint6": math.pi / 2, # +90° → keeps hand level + "panda_joint7": 0.9, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + print("This is the play environment") + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/joint_pos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/joint_pos_env_cfg.py new file mode 100755 index 000000000000..e0ee886bdda2 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/joint_pos_env_cfg.py @@ -0,0 +1,102 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import RigidObjectCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR + +from isaaclab_tasks.manager_based.manipulation.beaker_pour import mdp +from isaaclab_tasks.manager_based.manipulation.beaker_pour.pour_env_cfg import PourEnvCfg +from isaaclab_assets.glassware.glassware_objects import Chem_Assets +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_CFG # isort: skip + + +@configclass +class FrankaPourEnvCfg(PourEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + self.scene.robot = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set actions for the specific robot type (franka) + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + scale=0.5, + use_default_offset=True + ) + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + print("Action shape : ", self.actions.__dict__) + # Set the body name for the end effector + self.commands.object_pose.body_name = "panda_hand" + + # Set Cube as object + + #what if its now a vial rack ? + glassware = Chem_Assets() + # Set each stacking cube deterministically + self.scene.object = glassware.beaker(pos=[0.4, 0.0, 0.0203],name="Object") + + + + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.1034], + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_rightfinger", + name="tool_rightfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_leftfinger", + name="tool_leftfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + ], + ) + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_env_cfg.py new file mode 100755 index 000000000000..4001114fe828 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_env_cfg.py @@ -0,0 +1,132 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab_tasks.manager_based.manipulation.beaker_pour import mdp +from isaaclab_tasks.manager_based.manipulation.beaker_pour import PourEnvCfg +#from isaaclab_assets.glassware.glassware_objects import Chem_Assets + + +import math +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + +@configclass +class FrankaDevEnvCfg(PourEnvCfg): + def __post_init__(self): + # post init of parent + + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": 0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + # Set the body name for the end effector + self.commands.object_pose.body_name = "panda_hand" + self.commands.object_pose.body_name = "panda_hand" + + # glassware = Chem_Assets() + # Set each stacking cube deterministically + #self.scene.object = glassware.beaker(pos=[0.5, 0.0, 0.01],name="Object") + #### everything else leave default + # self.scene.flask = glassware.flask() + # self.scene.vial = glassware.vial() + # self.scene.beaker = glassware.beaker() + #self.scene.stirplate = glassware.stirplate() + #self.scene.random = glassware.random_object() + # self.scene.obstacle = glassware.cube_obs(pos= [0.8, -0.8, 0.0],rot=[0, 0, 1, 0], name="cube_obs") + #self.scene.obstacle = glassware.stirplate(pos= [0.5, -0.32, 0.0],rot=[0.707, 0, 0, -0.707], name="cube_obs") + # self.scene.obstacle = glassware.stirplate(pos= [0.8, -0.8, 0.0], rot=[0.707, 0, 0, -0.707], name="cube_obs") + self.scene.object = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Object", + init_state=RigidObjectCfg.InitialStateCfg( pos=[0.5, 0.0, 0.02],rot=[0, 0, 1, 0]), + spawn=UsdFileCfg( + usd_path=f"source/isaaclab_assets/isaaclab_assets/glassware/beaker/beaker.usd", + scale=(0.5, 0.5, 0.5), + rigid_props=RigidBodyPropertiesCfg( + solver_position_iteration_count=16, + solver_velocity_iteration_count=1, + max_angular_velocity=1000.0, + max_linear_velocity=1000.0, + max_depenetration_velocity=5.0, + disable_gravity=False, + ), + ), + ) + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.1034], + + ), + ), + ], + ) + + +@configclass +class FrankaDevEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_ik_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_ik_rel_env_cfg.py new file mode 100755 index 000000000000..d5a475362fd7 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_ik_rel_env_cfg.py @@ -0,0 +1,63 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg + +from . import pour_env_cfg +import math +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + + +@configclass +class FrankaDevEnvCfg(pour_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_ik_rel_env_obs.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_ik_rel_env_obs.py new file mode 100755 index 000000000000..5507c7fe2447 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/pour_ik_rel_env_obs.py @@ -0,0 +1,49 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg + +from . import pour_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip +#from isaaclab_assets.glassware.glassware_objects import Chem_Assets + +@configclass +class FrankaDevEnvCfg(pour_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + # glassware = Chem_Assets() + #self.scene.obstacle = glassware.cube_obs(pos= [0.5, -0.1, 0.0],rot=[0, 0, 1, 0], name="cube_obs") + + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/__init__.py new file mode 100755 index 000000000000..f53d3692aa6d --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""This sub-module contains the functions that are specific to the lift environments.""" + +from isaaclab.envs.mdp import * # noqa: F401, F403 + +from .observations import * # noqa: F401, F403 +from .rewards import * # noqa: F401, F403 +from .terminations import * # noqa: F401, F403 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/observations.py new file mode 100755 index 000000000000..32562680f03a --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/observations.py @@ -0,0 +1,289 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from __future__ import annotations + +import torch +from typing import TYPE_CHECKING + +from isaaclab.assets import RigidObject +from isaaclab.managers import SceneEntityCfg +from isaaclab.utils.math import subtract_frame_transforms, combine_frame_transforms +from isaaclab.assets import Articulation, RigidObject, RigidObjectCollection +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformer +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def object_position_in_robot_root_frame( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """The position of the object in the robot's root frame.""" + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + + return object_pos_b + +def obstacle_position_in_robot_root_frame( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("obstacle"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """The position of the object in the robot's root frame.""" + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + + return object_pos_b + + +def reach_object( + env: ManagerBasedRLEnv, + std: float = 0.05, + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Reward the agent for reaching the object using tanh-kernel.""" + # extract the used quantities (to enable type-hinting) + object: RigidObject = env.scene[object_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + # Target object position: (num_envs, 3) + cube_pos_w = object.data.root_pos_w + # End-effector position: (num_envs, 3) + ee_w = ee_frame.data.target_pos_w[..., 0, :] + # print("ee pos : ", ee_w) + # Distance of the end-effector to the object: (num_envs,) + object_ee_distance = torch.norm(cube_pos_w - ee_w, dim=1) + #if object_ee_distance.item() < std : + # print(f"Observed Object Reached : {object_ee_distance.item()}") + # loghelper.logsubtask(LogType.APPR) + # if object_ee_distance[0] < std: + # print(f"Reached object, dist :{object_ee_distance.item()}") + return object_ee_distance < std + +def object_grasped( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg= SceneEntityCfg("robot"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), + object_cfg: SceneEntityCfg= SceneEntityCfg("object"), + diff_threshold: float = 0.06, + gripper_open_val: torch.tensor = torch.tensor([0.04]), + gripper_threshold: float = 0.005, + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Check if an object is grasped by the specified robot.""" + + robot: Articulation = env.scene[robot_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + + object_pos = object.data.root_pos_w + end_effector_pos = ee_frame.data.target_pos_w[:, 0, :] + pose_diff = torch.linalg.vector_norm(object_pos - end_effector_pos, dim=1) + + grasped = torch.logical_and( + pose_diff < diff_threshold, + torch.abs(robot.data.joint_pos[:, -1] - gripper_open_val.to(env.device)) > gripper_threshold, + ) + grasped = torch.logical_and( + grasped, torch.abs(robot.data.joint_pos[:, -2] - gripper_open_val.to(env.device)) > gripper_threshold + ) + #if grasped[0]: + # print(f"Observed Object grasped : {grasped.item()}") + # loghelper.logsubtask(LogType.GRASP) + return grasped + +def object_released( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg, + ee_frame_cfg: SceneEntityCfg, + object_cfg: SceneEntityCfg, + diff_threshold: float = 0.06, + gripper_open_val: torch.tensor = torch.tensor([0.04]), + gripper_threshold: float = 0.035, + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Check if an object is grasped by the specified robot.""" + + robot: Articulation = env.scene[robot_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + + object_pos = object.data.root_pos_w + end_effector_pos = ee_frame.data.target_pos_w[:, 0, :] + pose_diff = torch.linalg.vector_norm(object_pos - end_effector_pos, dim=1) + + grasped = torch.logical_and( + pose_diff < diff_threshold, + torch.abs(robot.data.joint_pos[:, -1]) > gripper_threshold, + ) + grasped = torch.logical_and( + grasped, torch.abs(robot.data.joint_pos[:, -2] ) > gripper_threshold + ) + # if grasped[0]: + # print(f"Observed Object grasped : {grasped.item()}") + # loghelper.logsubtask(LogType.GRASP) + return grasped + +def is_object_lifted( + env: ManagerBasedRLEnv, + obj_cfg: SceneEntityCfg = SceneEntityCfg("object"), + threshold : float = 0.05, + #loghelper : LoggingHelper = LoggingHelper() +): + #return true when object z coord above a threshold value + object = env.scene[obj_cfg.name] + # if object.data.root_pos_w[:, 2].item() > threshold : + # print(f"Observed Object Lifted : {object.data.root_pos_w[:, 2].item()}") + # loghelper.logsubtask(LogType.LIFT) + + return object.data.root_pos_w[:, 2] > threshold + + +def ee_frame_pos(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + ee_frame_pos = ee_frame.data.target_pos_w[:, 0, :] - env.scene.env_origins[:, 0:3] + + return ee_frame_pos + + +def ee_frame_quat(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + ee_frame_quat = ee_frame.data.target_quat_w[:, 0, :] + + return ee_frame_quat + + +def gripper_pos(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor: + robot: Articulation = env.scene[robot_cfg.name] + finger_joint_1 = robot.data.joint_pos[:, -1].clone().unsqueeze(1) + finger_joint_2 = -1 * robot.data.joint_pos[:, -2].clone().unsqueeze(1) + + return torch.cat((finger_joint_1, finger_joint_2), dim=1) + +def object_near_goal( + env: ManagerBasedRLEnv, + command_name: str = "object_pose", + threshold: float = 0.05, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Termination condition for the object reaching the goal position. + + Args: + env: The environment. + command_name: The name of the command that is used to control the object. + threshold: The threshold for the object to reach the goal position. Defaults to 0.02. + robot_cfg: The robot configuration. Defaults to SceneEntityCfg("robot"). + object_cfg: The object configuration. Defaults to SceneEntityCfg("object"). + + """ + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + des_pos_b = command[:, :3] + # print(f"desired position : {des_pos_b}, actual position : {object_pos_b}") + error = torch.norm(des_pos_b - object_pos_b, dim=1) + #if error torch.Tensor: + """Termination condition for the object reaching the goal position. + + Args: + env: The environment. + command_name: The name of the command that is used to control the object. + threshold: The threshold for the object to reach the goal position. Defaults to 0.02. + robot_cfg: The robot configuration. Defaults to SceneEntityCfg("robot"). + object_cfg: The object configuration. Defaults to SceneEntityCfg("object"). + + """ + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + des_pos_b = command[:, :3] + # print(f"desired position : {des_pos_b}, actual position : {object_pos_b}") + error = torch.norm(des_pos_b - object_pos_b, dim=1) + #print("norm position error : ", error) + return error + +def robot_pose( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot") +): + robot: Articulation = env.scene[robot_cfg.name] + # print(robot.data.joint_pos) + return torch.tensor([0.04]) + +def position_command_error( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + command_name: str = "object_pose", + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """The position of the object in the robot's root frame.""" + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + des_pos_b = command[:, :3] + # print(f"desired position : {des_pos_b}, actual position : {object_pos_b}") + error = torch.sub(des_pos_b, object_pos_b) + #print("position error : ", error) + return error + +def get_joint_pos(env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor: + """The joint positions of the asset. + + Note: Only the joints configured in :attr:`asset_cfg.joint_ids` will have their positions returned. + """ + # extract the used quantities (to enable type-hinting) + asset: Articulation = env.scene[asset_cfg.name] + #print("Joint positions: : ", asset.data.joint_pos[:, asset_cfg.joint_ids]) + return asset.data.joint_pos[:, asset_cfg.joint_ids] + +# def logstep( +# env: ManagerBasedRLEnv, +# # loghelper : LoggingHelper +# ): +# loghelper.logstep() +# return torch.tensor([0]) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/rewards.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/rewards.py new file mode 100755 index 000000000000..4436f10c7e48 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/rewards.py @@ -0,0 +1,73 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from __future__ import annotations + +import torch +from typing import TYPE_CHECKING + +from isaaclab.assets import RigidObject +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformer +from isaaclab.utils.math import combine_frame_transforms +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def object_is_lifted( + env: ManagerBasedRLEnv, minimal_height: float, object_cfg: SceneEntityCfg = SceneEntityCfg("object") +) -> torch.Tensor: + """Reward the agent for lifting the object above the minimal height.""" + object: RigidObject = env.scene[object_cfg.name] + + return torch.where(object.data.root_pos_w[:, 2] > minimal_height, 1.0, 0.0) + + +def object_ee_distance( + env: ManagerBasedRLEnv, + std: float, + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), +) -> torch.Tensor: + """Reward the agent for reaching the object using tanh-kernel.""" + # extract the used quantities (to enable type-hinting) + object: RigidObject = env.scene[object_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + # Target object position: (num_envs, 3) + cube_pos_w = object.data.root_pos_w + # End-effector position: (num_envs, 3) + ee_w = ee_frame.data.target_pos_w[..., 0, :] + # Distance of the end-effector to the object: (num_envs,) + object_ee_distance = torch.norm(cube_pos_w - ee_w, dim=1) + + return 1 - torch.tanh(object_ee_distance / std) + + + +def object_goal_distance( + env: ManagerBasedRLEnv, + std: float, + minimal_height: float, + command_name: str, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), +) -> torch.Tensor: + """Reward the agent for tracking the goal pose using tanh-kernel.""" + # extract the used quantities (to enable type-hinting) + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + # compute the desired position in the world frame + des_pos_b = command[:, :3] + des_pos_w, _ = combine_frame_transforms(robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], des_pos_b) + # distance of the end-effector to the object: (num_envs,) + distance = torch.norm(des_pos_w - object.data.root_pos_w[:, :3], dim=1) + # rewarded if the object is lifted above the threshold + #if (object.data.root_pos_w[:, 2] > minimal_height) * (1 - torch.tanh(distance / std)): + # print(f"object goal distance : {distance} ") + #print(f" Goal position reward : {(object.data.root_pos_w[:, 2] > minimal_height) * (1 - torch.tanh(distance / std))}") + return (object.data.root_pos_w[:, 2] > minimal_height) * (1 - torch.tanh(distance / std)) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/terminations.py new file mode 100755 index 000000000000..007a82d6ca83 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/mdp/terminations.py @@ -0,0 +1,97 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Common functions that can be used to activate certain terminations for the lift task. + +The functions can be passed to the :class:`isaaclab.managers.TerminationTermCfg` object to enable +the termination introduced by the function. +""" + +from __future__ import annotations + +import torch +from typing import TYPE_CHECKING + +from isaaclab.assets import RigidObject, Articulation +from isaaclab.managers import SceneEntityCfg + +from isaaclab.sensors import FrameTransformer +from isaaclab.utils.math import combine_frame_transforms, subtract_frame_transforms +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def object_reached_goal( + env: ManagerBasedRLEnv, + command_name: str = "object_pose", + threshold: float = 0.02, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Termination condition for the object reaching the goal position. + + Args: + env: The environment. + command_name: The name of the command that is used to control the object. + threshold: The threshold for the object to reach the goal position. Defaults to 0.02. + robot_cfg: The robot configuration. Defaults to SceneEntityCfg("robot"). + object_cfg: The object configuration. Defaults to SceneEntityCfg("object"). + + """ + # extract the used quantities (to enable type-hinting) + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + # compute the desired position in the world frame + des_pos_b = command[:, :3] + des_pos_w, _ = combine_frame_transforms(robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], des_pos_b) + # distance of the end-effector to the object: (num_envs,) + distance = torch.norm(des_pos_w - object.data.root_pos_w[:, :3], dim=1) + # print(f"For DEBUG : DISTANCE TO GOAL : {distance}") + # if(distance.item() < threshold): + # loghelper.logsubtask(LogType.FINISH) + test = distance < threshold + if (torch.any(test)): + print("debug : terminations : ", torch.any(test)) + return distance < threshold + + +def placed( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + ee_frame_cfg: SceneEntityCfg=SceneEntityCfg("ee_frame"), + command_name: str = "object_pose", + threshold: torch.tensor = torch.tensor([0.05], device="cuda:0"), + gripper_open_val= torch.tensor([0.038], device="cuda:0"), #open + atol=0.0001, + rtol=0.0001, + gripper_threshold: float = 0.005, +): + robot: Articulation = env.scene[robot_cfg.name] + + command = env.command_manager.get_command(command_name) + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name], + object: RigidObject = env.scene[object_cfg.name] + + des_pos_b = command[:, :3] + des_pos_w, _ = combine_frame_transforms(robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], des_pos_b) + # distance of the end-effector to the object: (num_envs,) + + object_pos = object.data.root_pos_w + #end_effector_pos = ee_frame.data.target_pos_w[:, 0, :] + # pose_diff = torch.linalg.vector_norm(object_pos - end_effector_pos, dim=1) + distance = torch.norm(des_pos_w - object_pos[:, :3], dim=1) + object_position = distance gripper_open_val) + gripper_open = robot.data.joint_pos[:, -1] > gripper_open_val + state = torch.logical_and(object_position, gripper_open) + return state \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/pour_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/pour_env_cfg.py new file mode 100755 index 000000000000..c1a4dbfedb50 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/pour_env_cfg.py @@ -0,0 +1,361 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from dataclasses import MISSING +from enum import Enum +import isaaclab.sim as sim_utils +from isaaclab.assets import ArticulationCfg, AssetBaseCfg, DeformableObjectCfg, RigidObjectCfg, RigidObjectCollection, RigidObjectCollectionCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.envs import ManagerBasedRLEnvCfg +from isaaclab.managers import CurriculumTermCfg as CurrTerm +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import RewardTermCfg as RewTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.managers import TerminationTermCfg as DoneTerm +from isaaclab.scene import InteractiveSceneCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import FrameTransformerCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import GroundPlaneCfg, UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +import warp as wp +from . import mdp +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType + + + + + +## +# Scene definition +## + + +@configclass +class ObjectTableSceneCfg(InteractiveSceneCfg): + """Configuration for the lift scene with a robot and a object. + This is the abstract base implementation, the exact scene is defined in the derived classes + which need to set the target object, robot and end-effector frames + """ + + # robots: will be populated by agent env cfg + robot: ArticulationCfg = MISSING + # end-effector sensor: will be populated by agent env cfg + ee_frame: FrameTransformerCfg = MISSING + # target object: will be populated by agent env cfg + object: RigidObjectCfg | DeformableObjectCfg = MISSING + + #for collision + # obstacle: RigidObjectCfg =MISSING + + + # glassware = RigidObjectCollectionCfg(rigid_objects={"vial" : vial, "flask" : flask}) + + + # Table + table = AssetBaseCfg( + prim_path="{ENV_REGEX_NS}/Table", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0.5, 0, 0], rot=[0.707, 0, 0, 0.707]), + spawn=UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd"), + ) + + # plane + plane = AssetBaseCfg( + prim_path="/World/GroundPlane", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0, 0, -1.05]), + spawn=GroundPlaneCfg(), + ) + + # lights + light = AssetBaseCfg( + prim_path="/World/light", + spawn=sim_utils.DomeLightCfg(color=(0.75, 0.75, 0.75), intensity=3000.0), + ) + + + + + +## +# MDP settings +## + + +@configclass +class CommandsCfg: + """Command terms for the MDP.""" +#### Goal Positions + object_pose = mdp.UniformPoseCommandCfg( + asset_name="robot", + body_name=MISSING, # will be set by agent env cfg + resampling_time_range=(10.0, 10.0), + debug_vis=True, + ranges=mdp.UniformPoseCommandCfg.Ranges( + # pos_x=(0.3,0.3), pos_y=(-0.28, -0.28), pos_z=(0.1, 0.1), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + pos_x=(0.4,0.4), pos_y=(-0.3, -0.3), pos_z=(0.08, 0.08), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + ), + ) + + midpoint_pose = mdp.UniformPoseCommandCfg( + asset_name="robot", + body_name="panda_hand", + resampling_time_range=(10.0, 10.0), + debug_vis=True, + ranges=mdp.UniformPoseCommandCfg.Ranges( + # pos_x=(0.3,0.3), pos_y=(-0.28, -0.28), pos_z=(0.1, 0.1), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + pos_x=(0,0), pos_y=(-0.25, -0.25), pos_z=(0.4, 0.4), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + ), + ) + + +@configclass +class ActionsCfg: + """Action specifications for the MDP.""" + + # will be set by agent env cfg + arm_action: mdp.JointPositionActionCfg | mdp.DifferentialInverseKinematicsActionCfg = MISSING + gripper_action: mdp.BinaryJointPositionActionCfg = MISSING + + +@configclass +class ObservationsCfg(): + """Observation specifications for the MDP.""" + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group.""" + # def set_loghelper(self, loghelper: LoggingHelper): + # self.logstep.params["loghelper"] = loghelper + # logstep = ObsTerm(func = mdp.logstep) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + object_position = ObsTerm(func=mdp.object_position_in_robot_root_frame) + target_object_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object_pose"}) + actions = ObsTerm(func=mdp.last_action) + # object_to_target = ObsTerm(func=mdp.object_near_goal) + eef_pos = ObsTerm(func=mdp.ee_frame_pos) + eef_quat = ObsTerm(func=mdp.ee_frame_quat) + gripper_pos = ObsTerm(func=mdp.gripper_pos) + #obstacle_pos = ObsTerm(func=mdp.obstacle_position_in_robot_root_frame) + #robot_pose=ObsTerm(func=mdp.robot_pose) + #object_to_target = ObsTerm(func=mdp.position_command_error) + #norm_error = ObsTerm(func=mdp.object_goal_norm_error) + abs_joint_pos = ObsTerm(func=mdp.get_joint_pos) + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class SubtaskCfg(ObsGroup): + """Observations for subtask group.""" + # def set_loghelper(self, loghelper: LoggingHelper): + # # Inject the logger into any terms that need it + # self.appr.params["loghelper"] = loghelper + # self.grasp.params["loghelper"] = loghelper + # self.lift.params["loghelper"] = loghelper + # self.appr_goal.params["loghelper"] = loghelper + #self.loghelper = loghelper + + + # appr = ObsTerm( + # func=mdp.reach_object, + # params={ + # "ee_frame_cfg": SceneEntityCfg("ee_frame"), + # "object_cfg": SceneEntityCfg("object"), + # "std" : 0.05 + # } + # ) + + grasp = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("object"), + }, + ) + # lift = ObsTerm( + # func=mdp.is_object_lifted, + # params={ + # "obj_cfg": SceneEntityCfg("object"), + # "threshold" : 0.1 + # } + # ) + appr_goal = ObsTerm( + func=mdp.object_near_goal, + params={ + "threshold": 0.05, + "command_name": "object_pose", + }, + ) + # release_object = ObsTerm( + # func=mdp.object_released, + # params={ + # "robot_cfg": SceneEntityCfg("robot"), + # "ee_frame_cfg": SceneEntityCfg("ee_frame"), + # "object_cfg": SceneEntityCfg("object"), + # }, + # ) + + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + + + + # observation groups + policy: PolicyCfg = PolicyCfg() + subtask_terms : SubtaskCfg = SubtaskCfg() + +@configclass +class EventCfg: + """Configuration for events.""" + ## add in log helper funcs + # def set_loghelper(self, loghelper: LoggingHelper): + # self.reset_all.params["loghelper"] = loghelper + reset_all = EventTerm(func=mdp.reset_scene_to_default, mode="reset") + + reset_object_position = EventTerm( + func=mdp.reset_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.05, 0.1)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + }, + ) + #randomises the scale of the object + randomise_object_scale = EventTerm( + func=mdp.randomize_rigid_body_scale, + mode="prestartup", + params={ + "scale_range": {"x": (0.4, 0.7), "y": (0.4, 0.7), "z": (0.5, 0.7)}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + }, + # params={ + # "scale_range": {"x": (0.5, 0.5), "y": (0.5, 0.5), "z": (0.6, 0.7)}, + # "asset_cfg": SceneEntityCfg("object", body_names="Object"), + # }, + ) + + + +@configclass +class RewardsCfg: + """Reward terms for the MDP.""" + + reaching_object = RewTerm(func=mdp.object_ee_distance, params={"std": 0.1}, weight=1.0) + + lifting_object = RewTerm(func=mdp.object_is_lifted, params={"minimal_height": 0.14}, weight=30.0) + + reaching_target = RewTerm(func=mdp.object_goal_norm_error, weight = 20.0) + + object_goal_tracking = RewTerm( + func=mdp.object_goal_distance, + params={"std": 0.3, "minimal_height": 0.04, "command_name": "object_pose"}, + weight=16.0, + ) + + object_goal_tracking_fine_grained = RewTerm( + func=mdp.object_goal_distance, + params={"std": 0.05, "minimal_height": 0.04, "command_name": "object_pose"}, + weight=5.0, + ) + + # action penalty + action_rate = RewTerm(func=mdp.action_rate_l2, weight=-1e-4) + + joint_vel = RewTerm( + func=mdp.joint_vel_l2, + weight=-1e-4, + params={"asset_cfg": SceneEntityCfg("robot")}, + ) + + +@configclass +class TerminationsCfg: + """Termination terms for the MDP.""" + # def set_loghelper(self, loghelper: LoggingHelper): + # self.success.params["loghelper"] = loghelper + # self.time_out.params["loghelper"] = loghelper + # self.object_dropping.params["loghelper"] = loghelper + # # self.loghelper = loghelper + + time_out = DoneTerm(func=mdp.time_out, time_out=True) + + #joint_violation = DoneTerm(func=mdp.joint_pos_out_of_limit) + + #object_orientation = DoneTerm(func=mdp.bad_orientation) + + #joint_effort = DoneTerm(func=mdp.joint_effort_out_of_limit) + + object_dropping = DoneTerm( + func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("object")} + ) + #fix object dropping + success = DoneTerm(func=mdp.object_near_goal) + + +@configclass +class CurriculumCfg: + """Curriculum terms for the MDP.""" + + action_rate = CurrTerm( + func=mdp.modify_reward_weight, params={"term_name": "action_rate", "weight": -1e-1, "num_steps": 10000} + ) + + joint_vel = CurrTerm( + func=mdp.modify_reward_weight, params={"term_name": "joint_vel", "weight": -1e-1, "num_steps": 10000} + ) + + +## +# Environment configuration +## + + + +@configclass +class CubeEnvCfg(ManagerBasedRLEnvCfg): + """Configuration for the lifting environment.""" + # loghelper = LoggingHelper() + # Scene settings + scene: ObjectTableSceneCfg = ObjectTableSceneCfg(num_envs=4096, env_spacing=2.5, replicate_physics=False) + # Basic settings + observations: ObservationsCfg = ObservationsCfg() + actions: ActionsCfg = ActionsCfg() + commands: CommandsCfg = CommandsCfg() + # MDP settings + rewards: RewardsCfg = RewardsCfg() + terminations: TerminationsCfg = TerminationsCfg() + events: EventCfg = EventCfg() + curriculum: CurriculumCfg = CurriculumCfg() + + #subtask_statemachine: SubtaskStateMachine = SubtaskStateMachine() + + def __post_init__(self): + """Post initialization.""" + print("debug cfg : ", self.observations.policy.actions) + # general settings + + self.decimation = 2 + self.episode_length_s = 60 + # simulation settings + self.sim.dt = 0.01 # 100Hz + self.sim.render_interval = self.decimation + self.viewer.eye = (1.0, 1.0, 1.0) + self.viewer.lookat = (0.0, 0.0, -0.1) + # self.terminations.set_loghelper(self.loghelper) + #self.events.set_loghelper(self.loghelper) + # self.observations.policy.set_loghelper(self.loghelper) + # self.observations.subtask_terms.set_loghelper(self.loghelper) + self.sim.physx.bounce_threshold_velocity = 0.2 + self.sim.physx.bounce_threshold_velocity = 0.01 + # self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 + # self.sim.physx.gpu_total_aggregate_pairs_capacity = 16 * 1024 + self.sim.physx.friction_correlation_distance = 0.00625 \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/__init__.py new file mode 100755 index 000000000000..fd33aacd3a5b --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Configurations for the object lift environments.""" + +# We leave this file empty since we don't want to expose any configs in this package directly. +# We still need this file to import the "config" module in the parent package. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/__init__.py new file mode 100755 index 000000000000..fd33aacd3a5b --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Configurations for the object lift environments.""" + +# We leave this file empty since we don't want to expose any configs in this package directly. +# We still need this file to import the "config" module in the parent package. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py new file mode 100755 index 000000000000..f290d45c4b1a --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py @@ -0,0 +1,141 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +import gymnasium as gym +import os + +from . import agents + +## +# Register Gym environments. +## + +## +# Joint Position Control +## + +gym.register( + id="Isaac-Cube-Franka-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.joint_pos_env_cfg:FrankaCubeEnvCfg", + "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:LiftCubePPORunnerCfg", + "skrl_cfg_entry_point": f"{agents.__name__}:skrl_ppo_cfg.yaml", + "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_ppo_cfg.yaml", + "sb3_cfg_entry_point": f"{agents.__name__}:sb3_ppo_cfg.yaml", + }, + disable_env_checker=True, +) +gym.register( + id="Dev-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_env_cfg:FrankaDevEnvCfg", + "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:LiftCubePPORunnerCfg", + "skrl_cfg_entry_point": f"{agents.__name__}:skrl_ppo_cfg.yaml", + "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_ppo_cfg.yaml", + "sb3_cfg_entry_point": f"{agents.__name__}:sb3_ppo_cfg.yaml", + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Cube-Franka-Play-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.joint_pos_env_cfg:FrankaCubeEnvCfg_PLAY", + "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:LiftCubePPORunnerCfg", + "skrl_cfg_entry_point": f"{agents.__name__}:skrl_ppo_cfg.yaml", + "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_ppo_cfg.yaml", + "sb3_cfg_entry_point": f"{agents.__name__}:sb3_ppo_cfg.yaml", + }, + disable_env_checker=True, +) + +gym.register( + id="Dev-Play-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_env_cfg:FrankaDevEnvCfg_PLAY", + "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:LiftCubePPORunnerCfg", + "skrl_cfg_entry_point": f"{agents.__name__}:skrl_ppo_cfg.yaml", + "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_ppo_cfg.yaml", + "sb3_cfg_entry_point": f"{agents.__name__}:sb3_ppo_cfg.yaml", + }, + disable_env_checker=True, +) + +## +# Inverse Kinematics - Absolute Pose Control +## + +gym.register( + id="Isaac-Cube-Franka-IK-Abs-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.ik_abs_env_cfg:FrankaCubeEnvCfg", + }, + disable_env_checker=True, +) + +# gym.register( +# id="Isaac-Lift-Teddy-Bear-Franka-IK-Abs-v0", +# entry_point="isaaclab.envs:ManagerBasedRLEnv", +# kwargs={ +# "env_cfg_entry_point": f"{__name__}.ik_abs_env_cfg:FrankaTeddyBearLiftEnvCfg", +# }, +# disable_env_checker=True, +# ) + +## +# Inverse Kinematics - Relative Pose Control +## + +gym.register( + id="Isaac-Cube-Franka-IK-Rel-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.ik_rel_env_cfg:FrankaCubeEnvCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + }, + disable_env_checker=True, +) + +gym.register( + id="Dev-IK-Abs-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_env_cfg:FrankaDevEnvCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + }, + disable_env_checker=True, +) + +gym.register( + id="Dev-IK-Rel-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_ik_rel_env_cfg:FrankaDevEnvCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), + "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), + "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + #"robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc.json"), + }, + disable_env_checker=True, +) +gym.register( + id="Dev-IK-Rel-v1", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_ik_rel_env_obs:FrankaDevEnvCfg", + "robomimic_bc_rnn_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), + "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), + "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc.json"), + }, + disable_env_checker=True, +) + diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/__init__.py new file mode 100755 index 000000000000..e75ca2bc3f90 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/rl_games_ppo_cfg.yaml b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/rl_games_ppo_cfg.yaml new file mode 100755 index 000000000000..6ed68d88912c --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/rl_games_ppo_cfg.yaml @@ -0,0 +1,79 @@ +params: + seed: 42 + + # environment wrapper clipping + env: + clip_observations: 100.0 + clip_actions: 100.0 + + algo: + name: a2c_continuous + + model: + name: continuous_a2c_logstd + + network: + name: actor_critic + separate: False + space: + continuous: + mu_activation: None + sigma_activation: None + + mu_init: + name: default + sigma_init: + name: const_initializer + val: 0 + fixed_sigma: True + mlp: + units: [256, 128, 64] + activation: elu + d2rl: False + + initializer: + name: default + regularizer: + name: None + + load_checkpoint: False # flag which sets whether to load the checkpoint + load_path: '' # path to the checkpoint to load + + config: + name: franka_lift + env_name: rlgpu + device: 'cuda:0' + device_name: 'cuda:0' + multi_gpu: False + ppo: True + mixed_precision: False + normalize_input: True + normalize_value: True + value_bootstrap: False + num_actors: -1 + reward_shaper: + scale_value: 0.01 + normalize_advantage: True + gamma: 0.99 + tau: 0.95 + learning_rate: 1e-4 + lr_schedule: adaptive + schedule_type: legacy + kl_threshold: 0.01 + score_to_win: 100000000 + max_epochs: 1500 + save_best_after: 100 + save_frequency: 50 + print_stats: True + grad_norm: 1.0 + entropy_coef: 0.001 + truncate_grads: True + e_clip: 0.2 + horizon_length: 24 + minibatch_size: 24576 + mini_epochs: 8 + critic_coef: 4 + clip_value: True + clip_actions: False + seq_len: 4 + bounds_loss_coef: 0.0001 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc.json new file mode 100755 index 000000000000..3108d71b52d3 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc.json @@ -0,0 +1,135 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_202507210930", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "terminate_on_success" : true, + "n": 50, + "horizon": 400, + "rate": 50 + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/bc", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false + }, + "rnn": { + "enabled": false, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + } + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json new file mode 100755 index 000000000000..6b09227a280f --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json @@ -0,0 +1,135 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_new_demos", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "terminate_on_success" : true, + "n": 50, + "horizon": 400, + "rate": 50 + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/bc_rnn", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + } + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim_not.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim_not.json new file mode 100755 index 000000000000..00d956d4cf16 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim_not.json @@ -0,0 +1,306 @@ +{ + "algo_name": "hbc", + "experiment": { + "name": "hbc_202507211400", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 50, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": null, + "output_dir": "../hbc_trained_models", + "num_data_workers": 0, + "hdf5_cache_mode": "all", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 1 + }, + "algo": { + "mode": "separate", + "actor_use_random_subgoals": false, + "subgoal_update_interval": 10, + "latent_subgoal": { + "enabled": false, + "prior_correction": { + "enabled": false, + "num_samples": 100 + } + }, + "planner": { + "optim_params": { + "goal_network": { + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + } + } + }, + "subgoal_horizon": 10, + "ae": { + "planner_layer_dims": [ + 300, + 400 + ] + }, + "vae": { + "enabled": true, + "latent_dim": 16, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + } + }, + "actor": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + } + }, + "observation": { + "planner": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + }, + "subgoal": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "actor": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_trans.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_trans.json new file mode 100755 index 000000000000..3762c8ae0b0a --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_trans.json @@ -0,0 +1,133 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_trans_20250722_frame_20", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "terminate_on_success" : true, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0 + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/bc_trans", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 1, + "frame_stack" : 20, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false + }, + "rnn": { + "enabled": false + }, + "transformer": { + "enabled": true, + "context_length": 20, + + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + + "joint_pos", + "joint_vel", + "actions" + + ], + "rgb": [], + "depth": [], + "scan": [] + } + } + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bcq.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bcq.json new file mode 100755 index 000000000000..f152c8ba2247 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bcq.json @@ -0,0 +1,308 @@ +{ + "algo_name": "bcq", + "experiment": { + "name": "bcq", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/bcq", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 1, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 1 + }, + "algo": { + "optim_params": { + "critic": { + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + }, + "action_sampler": { + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + }, + "actor": { + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + }, + "start_epoch": -1, + "end_epoch": -1 + } + }, + "discount": 0.99, + "n_step": 1, + "target_tau": 0.005, + "infinite_horizon": false, + "critic": { + "use_huber": false, + "max_gradient_norm": null, + "value_bounds": null, + "num_action_samples": 10, + "num_action_samples_rollout": 100, + "ensemble": { + "n": 2, + "weight": 0.75 + }, + "distributional": { + "enabled": false, + "num_atoms": 51 + }, + "layer_dims": [ + 300, + 400 + ] + }, + "action_sampler": { + "actor_layer_dims": [ + 1024, + 1024 + ], + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": true, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "freeze_encoder_epoch": -1 + }, + "actor": { + "enabled": false, + "perturbation_scale": 0.05, + "layer_dims": [ + 300, + 400 + ] + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + + "joint_pos", + "joint_vel", + "actions" + + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + }, + "conv_activation": "relu", + "conv_kwargs": { + "out_channels": [ + 32, + 64, + 64 + ], + "kernel_size": [ + 8, + 4, + 2 + ], + "stride": [ + 4, + 2, + 1 + ] + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + } + } + } +} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/hbc.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/hbc.json new file mode 100755 index 000000000000..e4be27fbc254 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/hbc.json @@ -0,0 +1,306 @@ +{ + "algo_name": "hbc", + "experiment": { + "name": "hbc_202507211400", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick-place-tabletop" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 50, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate"` : false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": null, + "output_dir": "../hbc_trained_models", + "num_data_workers": 0, + "hdf5_cache_mode": "all", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 1 + }, + "algo": { + "mode": "separate", + "actor_use_random_subgoals": false, + "subgoal_update_interval": 10, + "latent_subgoal": { + "enabled": false, + "prior_correction": { + "enabled": false, + "num_samples": 100 + } + }, + "planner": { + "optim_params": { + "goal_network": { + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [] + }, + "regularization": { + "L2": 0.0 + } + } + }, + "subgoal_horizon": 10, + "ae": { + "planner_layer_dims": [ + 300, + 400 + ] + }, + "vae": { + "enabled": true, + "latent_dim": 16, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + } + }, + "actor": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + } + }, + "observation": { + "planner": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + }, + "subgoal": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "actor": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/rsl_rl_ppo_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/rsl_rl_ppo_cfg.py new file mode 100755 index 000000000000..e3fb13e1d1f7 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/rsl_rl_ppo_cfg.py @@ -0,0 +1,37 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.utils import configclass + +from isaaclab_rl.rsl_rl import RslRlOnPolicyRunnerCfg, RslRlPpoActorCriticCfg, RslRlPpoAlgorithmCfg + + +@configclass +class LiftCubePPORunnerCfg(RslRlOnPolicyRunnerCfg): + num_steps_per_env = 24 + max_iterations = 1500 + save_interval = 50 + experiment_name = "franka_lift" + empirical_normalization = False + policy = RslRlPpoActorCriticCfg( + init_noise_std=1.0, + actor_hidden_dims=[256, 128, 64], + critic_hidden_dims=[256, 128, 64], + activation="elu", + ) + algorithm = RslRlPpoAlgorithmCfg( + value_loss_coef=1.0, + use_clipped_value_loss=True, + clip_param=0.2, + entropy_coef=0.006, + num_learning_epochs=5, + num_mini_batches=4, + learning_rate=1.0e-4, + schedule="adaptive", + gamma=0.98, + lam=0.95, + desired_kl=0.01, + max_grad_norm=1.0, + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/sb3_ppo_cfg.yaml b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/sb3_ppo_cfg.yaml new file mode 100755 index 000000000000..6d6f15781acc --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/sb3_ppo_cfg.yaml @@ -0,0 +1,28 @@ +# Reference: https://github.com/DLR-RM/rl-baselines3-zoo/blob/master/hyperparams/ppo.yml#L32 +seed: 42 + +# epoch * n_steps * nenvs: 500×512*8*8 +n_timesteps: 16384000 +policy: 'MlpPolicy' +n_steps: 64 +# mini batch size: num_envs * nsteps / nminibatches 2048×512÷2048 +batch_size: 192 +gae_lambda: 0.95 +gamma: 0.99 +n_epochs: 8 +ent_coef: 0.00 +vf_coef: 0.0001 +learning_rate: !!float 3e-4 +clip_range: 0.2 +policy_kwargs: "dict( + activation_fn=nn.ELU, + net_arch=dict(pi=[256, 128, 64], vf=[256, 128, 64]) + )" +target_kl: 0.01 +max_grad_norm: 1.0 + +# # Uses VecNormalize class to normalize obs +# normalize_input: True +# # Uses VecNormalize class to normalize rew +# normalize_value: True +# clip_obs: 5 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/skrl_ppo_cfg.yaml b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/skrl_ppo_cfg.yaml new file mode 100755 index 000000000000..94337d46bac6 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/skrl_ppo_cfg.yaml @@ -0,0 +1,80 @@ +seed: 42 + + +# Models are instantiated using skrl's model instantiator utility +# https://skrl.readthedocs.io/en/latest/api/utils/model_instantiators.html +models: + separate: False + policy: # see gaussian_model parameters + class: GaussianMixin + clip_actions: False + clip_log_std: True + min_log_std: -20.0 + max_log_std: 2.0 + initial_log_std: 0.0 + network: + - name: net + input: STATES + layers: [256, 128, 64] + activations: elu + output: ACTIONS + value: # see deterministic_model parameters + class: DeterministicMixin + clip_actions: False + network: + - name: net + input: STATES + layers: [256, 128, 64] + activations: elu + output: ONE + + +# Rollout memory +# https://skrl.readthedocs.io/en/latest/api/memories/random.html +memory: + class: RandomMemory + memory_size: -1 # automatically determined (same as agent:rollouts) + + +# PPO agent configuration (field names are from PPO_DEFAULT_CONFIG) +# https://skrl.readthedocs.io/en/latest/api/agents/ppo.html +agent: + class: PPO + rollouts: 24 + learning_epochs: 8 + mini_batches: 4 + discount_factor: 0.99 + lambda: 0.95 + learning_rate: 1.0e-04 + learning_rate_scheduler: KLAdaptiveLR + learning_rate_scheduler_kwargs: + kl_threshold: 0.01 + state_preprocessor: RunningStandardScaler + state_preprocessor_kwargs: null + value_preprocessor: RunningStandardScaler + value_preprocessor_kwargs: null + random_timesteps: 0 + learning_starts: 0 + grad_norm_clip: 1.0 + ratio_clip: 0.2 + value_clip: 0.2 + clip_predicted_values: True + entropy_loss_scale: 0.001 + value_loss_scale: 2.0 + kl_threshold: 0.0 + rewards_shaper_scale: 0.01 + time_limit_bootstrap: False + # logging and checkpoint + experiment: + directory: "franka_lift" + experiment_name: "" + write_interval: auto + checkpoint_interval: auto + + +# Sequential trainer +# https://skrl.readthedocs.io/en/latest/api/trainers/sequential.html +trainer: + class: SequentialTrainer + timesteps: 36000 + environment_info: log diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py new file mode 100755 index 000000000000..bdf7eb7a81cc --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py @@ -0,0 +1,132 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab_tasks.manager_based.manipulation.cube_lift.lift_env_cfg import CubeEnvCfg +#from isaaclab_assets.glassware.glassware_objects import Chem_Assets + + +import math +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + +@configclass +class FrankaDevEnvCfg(CubeEnvCfg): + def __post_init__(self): + # post init of parent + + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": 0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + # Set the body name for the end effector + self.commands.object_pose.body_name = "panda_hand" + self.commands.object_pose.body_name = "panda_hand" + + # glassware = Chem_Assets() + # Set each stacking cube deterministically + #self.scene.object = glassware.beaker(pos=[0.5, 0.0, 0.01],name="Object") + #### everything else leave default + # self.scene.flask = glassware.flask() + # self.scene.vial = glassware.vial() + # self.scene.beaker = glassware.beaker() + #self.scene.stirplate = glassware.stirplate() + #self.scene.random = glassware.random_object() + # self.scene.obstacle = glassware.cube_obs(pos= [0.8, -0.8, 0.0],rot=[0, 0, 1, 0], name="cube_obs") + #self.scene.obstacle = glassware.stirplate(pos= [0.5, -0.32, 0.0],rot=[0.707, 0, 0, -0.707], name="cube_obs") + # self.scene.obstacle = glassware.stirplate(pos= [0.8, -0.8, 0.0], rot=[0.707, 0, 0, -0.707], name="cube_obs") + self.scene.object = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Object", + init_state=RigidObjectCfg.InitialStateCfg( pos=[0.5, 0.0, 0.02],rot=[0, 0, 1, 0]), + spawn=UsdFileCfg( + usd_path=f"source/isaaclab_assets/isaaclab_assets/glassware/beaker/beaker.usd", + scale=(0.5, 0.5, 0.5), + rigid_props=RigidBodyPropertiesCfg( + solver_position_iteration_count=16, + solver_velocity_iteration_count=1, + max_angular_velocity=1000.0, + max_linear_velocity=1000.0, + max_depenetration_velocity=5.0, + disable_gravity=False, + ), + ), + ) + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.1034], + + ), + ), + ], + ) + + +@configclass +class FrankaDevEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_cfg.py new file mode 100755 index 000000000000..929077ee9a67 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_cfg.py @@ -0,0 +1,63 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg + +from . import dev_env_cfg +import math +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + + +@configclass +class FrankaDevEnvCfg(dev_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py new file mode 100755 index 000000000000..4332e690b196 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py @@ -0,0 +1,49 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg + +from . import dev_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip +#from isaaclab_assets.glassware.glassware_objects import Chem_Assets + +@configclass +class FrankaDevEnvCfg(dev_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + # glassware = Chem_Assets() + #self.scene.obstacle = glassware.cube_obs(pos= [0.5, -0.1, 0.0],rot=[0, 0, 1, 0], name="cube_obs") + + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_osc_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_osc_cfg.py new file mode 100755 index 000000000000..bb1d4bd550e2 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_osc_cfg.py @@ -0,0 +1,114 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab_tasks.manager_based.manipulation.cube_lift.lift_env_cfg import CubeEnvCfg +from isaaclab_assets.glassware.glassware_objects import Chem_Assets + + +import math +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + +@configclass +class FrankaDevEnvCfg(CubeEnvCfg): + def __post_init__(self): + # post init of parent + + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.405, + "panda_joint2": 0.35, + "panda_joint3": -0.22, + "panda_joint4": -3.0, + "panda_joint5": -2.85, + "panda_joint6": math.pi / 2, # +90° → keeps hand level + "panda_joint7": 0.9, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + # Set the body name for the end effector + self.commands.object_pose.body_name = "panda_hand" + self.commands.object_pose.body_name = "panda_hand" + + glassware = Chem_Assets() + # Set each stacking cube deterministically + self.scene.object = glassware.beaker(pos=[0.4, 0.0, 0.0203],name="Object") + #### everything else leave default + # self.scene.flask = glassware.flask() + # self.scene.vial = glassware.vial() + # self.scene.beaker = glassware.beaker() + self.scene.stirplate = glassware.stirplate() + #self.scene.random = glassware.random_object() + + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.1034], + + ), + ), + ], + ) + + +@configclass +class FrankaDevEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/ik_abs_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/ik_abs_env_cfg.py new file mode 100755 index 000000000000..255b5b55eb86 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/ik_abs_env_cfg.py @@ -0,0 +1,128 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import DeformableObjectCfg +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sim.spawners import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR + +import isaaclab_tasks.manager_based.manipulation.cube_lift.mdp as mdp + +from . import joint_pos_env_cfg +import math +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +## +# Rigid object lift environment. +## + + +@configclass +class FrankaCubeEnvCfg(joint_pos_env_cfg.FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.405, + "panda_joint2": 0.35, + "panda_joint3": -0.22, + "panda_joint4": -3.0, + "panda_joint5": -2.85, + "panda_joint6": math.pi / 2, # +90° → keeps hand level + "panda_joint7": 0.9, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + print("action shape: ", self.actions.arm_action.shape) + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False + + +## +# Deformable object lift environment. +## + + +@configclass +class FrankaTeddyBearLiftEnvCfg(FrankaCubeLiftEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + self.scene.object = DeformableObjectCfg( + prim_path="{ENV_REGEX_NS}/Object", + init_state=DeformableObjectCfg.InitialStateCfg(pos=(0.5, 0, 0.05), rot=(0.707, 0, 0, 0.707)), + spawn=UsdFileCfg( + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Objects/Teddy_Bear/teddy_bear.usd", + scale=(0.01, 0.01, 0.01), + ), + ) + + # Make the end effector less stiff to not hurt the poor teddy bear + self.scene.robot.actuators["panda_hand"].effort_limit = 50.0 + self.scene.robot.actuators["panda_hand"].stiffness = 40.0 + self.scene.robot.actuators["panda_hand"].damping = 10.0 + + # Disable replicate physics as it doesn't work for deformable objects + # FIXME: This should be fixed by the PhysX replication system. + self.scene.replicate_physics = False + + # Set events for the specific object type (deformable cube) + self.events.reset_object_position = EventTerm( + func=mdp.reset_nodal_state_uniform, + mode="reset", + params={ + "position_range": {"x": (-0.1, 0.1), "y": (-0.25, 0.25), "z": (0.0, 0.0)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object"), + }, + ) + + # Remove all the terms for the state machine demo + # TODO: Computing the root pose of deformable object from nodal positions is expensive. + # We need to fix that part before enabling these terms for the training. + self.terminations.object_dropping = None + self.rewards.reaching_object = None + self.rewards.lifting_object = None + self.rewards.object_goal_tracking = None + self.rewards.object_goal_tracking_fine_grained = None + self.observations.policy.object_position = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/ik_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/ik_rel_env_cfg.py new file mode 100755 index 000000000000..1335fa8cf984 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/ik_rel_env_cfg.py @@ -0,0 +1,65 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from . import joint_pos_env_cfg +import math +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +@configclass +class FrankaCubeEnvCfg(joint_pos_env_cfg.FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + print("This is the base environment") + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.405, + "panda_joint2": 0.35, + "panda_joint3": -0.22, + "panda_joint4": -3.0, + "panda_joint5": -2.85, + "panda_joint6": math.pi / 2, # +90° → keeps hand level + "panda_joint7": 0.9, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + print("This is the play environment") + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/joint_pos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/joint_pos_env_cfg.py new file mode 100755 index 000000000000..f31e9d67339c --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/joint_pos_env_cfg.py @@ -0,0 +1,102 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import RigidObjectCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR + +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab_tasks.manager_based.manipulation.cube_lift.lift_env_cfg import CubeEnvCfg +from isaaclab_assets.glassware.glassware_objects import Chem_Assets +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_CFG # isort: skip + + +@configclass +class FrankaCubeEnvCfg(CubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + self.scene.robot = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set actions for the specific robot type (franka) + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + scale=0.5, + use_default_offset=True + ) + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + print("Action shape : ", self.actions.__dict__) + # Set the body name for the end effector + self.commands.object_pose.body_name = "panda_hand" + + # Set Cube as object + + #what if its now a vial rack ? + glassware = Chem_Assets() + # Set each stacking cube deterministically + self.scene.object = glassware.beaker(pos=[0.4, 0.0, 0.0203],name="Object") + + + + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.1034], + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_rightfinger", + name="tool_rightfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_leftfinger", + name="tool_leftfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + ], + ) + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaCubeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py new file mode 100755 index 000000000000..5fa05b6c8f4e --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -0,0 +1,362 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from dataclasses import MISSING +from enum import Enum +import isaaclab.sim as sim_utils +from isaaclab.assets import ArticulationCfg, AssetBaseCfg, DeformableObjectCfg, RigidObjectCfg, RigidObjectCollection, RigidObjectCollectionCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.envs import ManagerBasedRLEnvCfg +from isaaclab.managers import CurriculumTermCfg as CurrTerm +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import RewardTermCfg as RewTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.managers import TerminationTermCfg as DoneTerm +from isaaclab.scene import InteractiveSceneCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import FrameTransformerCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import GroundPlaneCfg, UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +import warp as wp +from . import mdp +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType + + + + + +## +# Scene definition +## + + +@configclass +class ObjectTableSceneCfg(InteractiveSceneCfg): + """Configuration for the lift scene with a robot and a object. + This is the abstract base implementation, the exact scene is defined in the derived classes + which need to set the target object, robot and end-effector frames + """ + + # robots: will be populated by agent env cfg + robot: ArticulationCfg = MISSING + # end-effector sensor: will be populated by agent env cfg + ee_frame: FrameTransformerCfg = MISSING + # target object: will be populated by agent env cfg + object: RigidObjectCfg | DeformableObjectCfg = MISSING + + #for collision + # obstacle: RigidObjectCfg =MISSING + + + # glassware = RigidObjectCollectionCfg(rigid_objects={"vial" : vial, "flask" : flask}) + + + # Table + table = AssetBaseCfg( + prim_path="{ENV_REGEX_NS}/Table", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0.5, 0, 0], rot=[0.707, 0, 0, 0.707]), + spawn=UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd"), + ) + + # plane + plane = AssetBaseCfg( + prim_path="/World/GroundPlane", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0, 0, -1.05]), + spawn=GroundPlaneCfg(), + ) + + # lights + light = AssetBaseCfg( + prim_path="/World/light", + spawn=sim_utils.DomeLightCfg(color=(0.75, 0.75, 0.75), intensity=3000.0), + ) + + + + + +## +# MDP settings +## + + +@configclass +class CommandsCfg: + """Command terms for the MDP.""" +#### Goal Positions + object_pose = mdp.UniformPoseCommandCfg( + asset_name="robot", + body_name=MISSING, # will be set by agent env cfg + resampling_time_range=(10.0, 10.0), + debug_vis=True, + ranges=mdp.UniformPoseCommandCfg.Ranges( + # pos_x=(0.3,0.3), pos_y=(-0.28, -0.28), pos_z=(0.1, 0.1), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + pos_x=(0.4,0.4), pos_y=(-0.3, -0.3), pos_z=(0.08, 0.08), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + ), + ) + + midpoint_pose = mdp.UniformPoseCommandCfg( + asset_name="robot", + body_name="panda_hand", + resampling_time_range=(10.0, 10.0), + debug_vis=True, + ranges=mdp.UniformPoseCommandCfg.Ranges( + # pos_x=(0.3,0.3), pos_y=(-0.28, -0.28), pos_z=(0.1, 0.1), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + pos_x=(0,0), pos_y=(-0.25, -0.25), pos_z=(0.4, 0.4), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + ), + ) + + +@configclass +class ActionsCfg: + """Action specifications for the MDP.""" + + # will be set by agent env cfg + arm_action: mdp.JointPositionActionCfg | mdp.DifferentialInverseKinematicsActionCfg = MISSING + gripper_action: mdp.BinaryJointPositionActionCfg = MISSING + + +@configclass +class ObservationsCfg(): + """Observation specifications for the MDP.""" + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group.""" + # def set_loghelper(self, loghelper: LoggingHelper): + # self.logstep.params["loghelper"] = loghelper + # logstep = ObsTerm(func = mdp.logstep) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + object_position = ObsTerm(func=mdp.object_position_in_robot_root_frame) + target_object_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object_pose"}) + actions = ObsTerm(func=mdp.last_action) + # object_to_target = ObsTerm(func=mdp.object_near_goal) + eef_pos = ObsTerm(func=mdp.ee_frame_pos) + eef_quat = ObsTerm(func=mdp.ee_frame_quat) + gripper_pos = ObsTerm(func=mdp.gripper_pos) + #obstacle_pos = ObsTerm(func=mdp.obstacle_position_in_robot_root_frame) + #robot_pose=ObsTerm(func=mdp.robot_pose) + #object_to_target = ObsTerm(func=mdp.position_command_error) + #norm_error = ObsTerm(func=mdp.object_goal_norm_error) + abs_joint_pos = ObsTerm(func=mdp.get_joint_pos) + object_knocked = ObsTerm(func=mdp.object_knocked) + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class SubtaskCfg(ObsGroup): + """Observations for subtask group.""" + # def set_loghelper(self, loghelper: LoggingHelper): + # # Inject the logger into any terms that need it + # self.appr.params["loghelper"] = loghelper + # self.grasp.params["loghelper"] = loghelper + # self.lift.params["loghelper"] = loghelper + # self.appr_goal.params["loghelper"] = loghelper + #self.loghelper = loghelper + + + # appr = ObsTerm( + # func=mdp.reach_object, + # params={ + # "ee_frame_cfg": SceneEntityCfg("ee_frame"), + # "object_cfg": SceneEntityCfg("object"), + # "std" : 0.05 + # } + # ) + + grasp = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("object"), + }, + ) + # lift = ObsTerm( + # func=mdp.is_object_lifted, + # params={ + # "obj_cfg": SceneEntityCfg("object"), + # "threshold" : 0.1 + # } + # ) + appr_goal = ObsTerm( + func=mdp.object_near_goal, + params={ + "threshold": 0.05, + "command_name": "object_pose", + }, + ) + # release_object = ObsTerm( + # func=mdp.object_released, + # params={ + # "robot_cfg": SceneEntityCfg("robot"), + # "ee_frame_cfg": SceneEntityCfg("ee_frame"), + # "object_cfg": SceneEntityCfg("object"), + # }, + # ) + + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + + + + # observation groups + policy: PolicyCfg = PolicyCfg() + subtask_terms : SubtaskCfg = SubtaskCfg() + +@configclass +class EventCfg: + """Configuration for events.""" + ## add in log helper funcs + # def set_loghelper(self, loghelper: LoggingHelper): + # self.reset_all.params["loghelper"] = loghelper + reset_all = EventTerm(func=mdp.reset_scene_to_default, mode="reset") + + reset_object_position = EventTerm( + func=mdp.reset_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.05, 0.1)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + }, + ) + #randomises the scale of the object + randomise_object_scale = EventTerm( + func=mdp.randomize_rigid_body_scale, + mode="prestartup", + # params={ + # "scale_range": {"x": (0.4, 0.7), "y": (0.4, 0.7), "z": (0.5, 0.7)}, + # "asset_cfg": SceneEntityCfg("object", body_names="Object"), + # }, + params={ + "scale_range": {"x": (0.5, 0.5), "y": (0.5, 0.5), "z": (0.6, 0.7)}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + }, + ) + + + +@configclass +class RewardsCfg: + """Reward terms for the MDP.""" + + reaching_object = RewTerm(func=mdp.object_ee_distance, params={"std": 0.1}, weight=1.0) + + lifting_object = RewTerm(func=mdp.object_is_lifted, params={"minimal_height": 0.14}, weight=30.0) + + reaching_target = RewTerm(func=mdp.object_goal_norm_error, weight = 20.0) + + object_goal_tracking = RewTerm( + func=mdp.object_goal_distance, + params={"std": 0.3, "minimal_height": 0.04, "command_name": "object_pose"}, + weight=16.0, + ) + + object_goal_tracking_fine_grained = RewTerm( + func=mdp.object_goal_distance, + params={"std": 0.05, "minimal_height": 0.04, "command_name": "object_pose"}, + weight=5.0, + ) + + # action penalty + action_rate = RewTerm(func=mdp.action_rate_l2, weight=-1e-4) + + joint_vel = RewTerm( + func=mdp.joint_vel_l2, + weight=-1e-4, + params={"asset_cfg": SceneEntityCfg("robot")}, + ) + + +@configclass +class TerminationsCfg: + """Termination terms for the MDP.""" + # def set_loghelper(self, loghelper: LoggingHelper): + # self.success.params["loghelper"] = loghelper + # self.time_out.params["loghelper"] = loghelper + # self.object_dropping.params["loghelper"] = loghelper + # # self.loghelper = loghelper + + time_out = DoneTerm(func=mdp.time_out, time_out=True) + + #joint_violation = DoneTerm(func=mdp.joint_pos_out_of_limit) + + #object_orientation = DoneTerm(func=mdp.bad_orientation) + + #joint_effort = DoneTerm(func=mdp.joint_effort_out_of_limit) + + object_dropping = DoneTerm( + func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("object")} + ) + #fix object dropping + success = DoneTerm(func=mdp.object_near_goal) + + +@configclass +class CurriculumCfg: + """Curriculum terms for the MDP.""" + + action_rate = CurrTerm( + func=mdp.modify_reward_weight, params={"term_name": "action_rate", "weight": -1e-1, "num_steps": 10000} + ) + + joint_vel = CurrTerm( + func=mdp.modify_reward_weight, params={"term_name": "joint_vel", "weight": -1e-1, "num_steps": 10000} + ) + + +## +# Environment configuration +## + + + +@configclass +class CubeEnvCfg(ManagerBasedRLEnvCfg): + """Configuration for the lifting environment.""" + # loghelper = LoggingHelper() + # Scene settings + scene: ObjectTableSceneCfg = ObjectTableSceneCfg(num_envs=4096, env_spacing=2.5, replicate_physics=False) + # Basic settings + observations: ObservationsCfg = ObservationsCfg() + actions: ActionsCfg = ActionsCfg() + commands: CommandsCfg = CommandsCfg() + # MDP settings + rewards: RewardsCfg = RewardsCfg() + terminations: TerminationsCfg = TerminationsCfg() + events: EventCfg = EventCfg() + curriculum: CurriculumCfg = CurriculumCfg() + + #subtask_statemachine: SubtaskStateMachine = SubtaskStateMachine() + + def __post_init__(self): + """Post initialization.""" + print("debug cfg : ", self.observations.policy.actions) + # general settings + + self.decimation = 2 + self.episode_length_s = 60 + # simulation settings + self.sim.dt = 0.01 # 100Hz + self.sim.render_interval = self.decimation + self.viewer.eye = (1.0, 1.0, 1.0) + self.viewer.lookat = (0.0, 0.0, -0.1) + # self.terminations.set_loghelper(self.loghelper) + #self.events.set_loghelper(self.loghelper) + # self.observations.policy.set_loghelper(self.loghelper) + # self.observations.subtask_terms.set_loghelper(self.loghelper) + self.sim.physx.bounce_threshold_velocity = 0.2 + self.sim.physx.bounce_threshold_velocity = 0.01 + # self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 + # self.sim.physx.gpu_total_aggregate_pairs_capacity = 16 * 1024 + self.sim.physx.friction_correlation_distance = 0.00625 \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/__init__.py new file mode 100755 index 000000000000..f53d3692aa6d --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""This sub-module contains the functions that are specific to the lift environments.""" + +from isaaclab.envs.mdp import * # noqa: F401, F403 + +from .observations import * # noqa: F401, F403 +from .rewards import * # noqa: F401, F403 +from .terminations import * # noqa: F401, F403 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py new file mode 100755 index 000000000000..162823fa1b64 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py @@ -0,0 +1,309 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from __future__ import annotations + +import torch +from typing import TYPE_CHECKING + +from isaaclab.assets import RigidObject +from isaaclab.managers import SceneEntityCfg +from isaaclab.utils.math import subtract_frame_transforms, combine_frame_transforms +from isaaclab.assets import Articulation, RigidObject, RigidObjectCollection +from isaaclab.managers import SceneEntityCfg +from isaaclab.utils.math import matrix_from_quat +from isaaclab.sensors import FrameTransformer +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def object_position_in_robot_root_frame( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """The position of the object in the robot's root frame.""" + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + + return object_pos_b + +def obstacle_position_in_robot_root_frame( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("obstacle"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """The position of the object in the robot's root frame.""" + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + + return object_pos_b + + +def reach_object( + env: ManagerBasedRLEnv, + std: float = 0.05, + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Reward the agent for reaching the object using tanh-kernel.""" + # extract the used quantities (to enable type-hinting) + object: RigidObject = env.scene[object_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + # Target object position: (num_envs, 3) + cube_pos_w = object.data.root_pos_w + # End-effector position: (num_envs, 3) + ee_w = ee_frame.data.target_pos_w[..., 0, :] + # print("ee pos : ", ee_w) + # Distance of the end-effector to the object: (num_envs,) + object_ee_distance = torch.norm(cube_pos_w - ee_w, dim=1) + #if object_ee_distance.item() < std : + # print(f"Observed Object Reached : {object_ee_distance.item()}") + # loghelper.logsubtask(LogType.APPR) + # if object_ee_distance[0] < std: + # print(f"Reached object, dist :{object_ee_distance.item()}") + return object_ee_distance < std + +def object_grasped( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg= SceneEntityCfg("robot"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), + object_cfg: SceneEntityCfg= SceneEntityCfg("object"), + diff_threshold: float = 0.06, + gripper_open_val: torch.tensor = torch.tensor([0.04]), + gripper_threshold: float = 0.005, + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Check if an object is grasped by the specified robot.""" + + robot: Articulation = env.scene[robot_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + + object_pos = object.data.root_pos_w + end_effector_pos = ee_frame.data.target_pos_w[:, 0, :] + pose_diff = torch.linalg.vector_norm(object_pos - end_effector_pos, dim=1) + + grasped = torch.logical_and( + pose_diff < diff_threshold, + torch.abs(robot.data.joint_pos[:, -1] - gripper_open_val.to(env.device)) > gripper_threshold, + ) + grasped = torch.logical_and( + grasped, torch.abs(robot.data.joint_pos[:, -2] - gripper_open_val.to(env.device)) > gripper_threshold + ) + #if grasped[0]: + # print(f"Observed Object grasped : {grasped.item()}") + # loghelper.logsubtask(LogType.GRASP) + return grasped + +def object_released( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg, + ee_frame_cfg: SceneEntityCfg, + object_cfg: SceneEntityCfg, + diff_threshold: float = 0.06, + gripper_open_val: torch.tensor = torch.tensor([0.04]), + gripper_threshold: float = 0.035, + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Check if an object is grasped by the specified robot.""" + + robot: Articulation = env.scene[robot_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + + object_pos = object.data.root_pos_w + end_effector_pos = ee_frame.data.target_pos_w[:, 0, :] + pose_diff = torch.linalg.vector_norm(object_pos - end_effector_pos, dim=1) + + grasped = torch.logical_and( + pose_diff < diff_threshold, + torch.abs(robot.data.joint_pos[:, -1]) > gripper_threshold, + ) + grasped = torch.logical_and( + grasped, torch.abs(robot.data.joint_pos[:, -2] ) > gripper_threshold + ) + # if grasped[0]: + # print(f"Observed Object grasped : {grasped.item()}") + # loghelper.logsubtask(LogType.GRASP) + return grasped + +def is_object_lifted( + env: ManagerBasedRLEnv, + obj_cfg: SceneEntityCfg = SceneEntityCfg("object"), + threshold : float = 0.05, + #loghelper : LoggingHelper = LoggingHelper() +): + #return true when object z coord above a threshold value + object = env.scene[obj_cfg.name] + # if object.data.root_pos_w[:, 2].item() > threshold : + # print(f"Observed Object Lifted : {object.data.root_pos_w[:, 2].item()}") + # loghelper.logsubtask(LogType.LIFT) + + return object.data.root_pos_w[:, 2] > threshold + + +def ee_frame_pos(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + ee_frame_pos = ee_frame.data.target_pos_w[:, 0, :] - env.scene.env_origins[:, 0:3] + + return ee_frame_pos + + +def ee_frame_quat(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + ee_frame_quat = ee_frame.data.target_quat_w[:, 0, :] + + return ee_frame_quat + + +def gripper_pos(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor: + robot: Articulation = env.scene[robot_cfg.name] + finger_joint_1 = robot.data.joint_pos[:, -1].clone().unsqueeze(1) + finger_joint_2 = -1 * robot.data.joint_pos[:, -2].clone().unsqueeze(1) + + return torch.cat((finger_joint_1, finger_joint_2), dim=1) + +def object_near_goal( + env: ManagerBasedRLEnv, + command_name: str = "object_pose", + threshold: float = 0.05, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Termination condition for the object reaching the goal position. + + Args: + env: The environment. + command_name: The name of the command that is used to control the object. + threshold: The threshold for the object to reach the goal position. Defaults to 0.02. + robot_cfg: The robot configuration. Defaults to SceneEntityCfg("robot"). + object_cfg: The object configuration. Defaults to SceneEntityCfg("object"). + + """ + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + des_pos_b = command[:, :3] + # print(f"desired position : {des_pos_b}, actual position : {object_pos_b}") + error = torch.norm(des_pos_b - object_pos_b, dim=1) + #if error torch.Tensor: + """Termination condition for the object reaching the goal position. + + Args: + env: The environment. + command_name: The name of the command that is used to control the object. + threshold: The threshold for the object to reach the goal position. Defaults to 0.02. + robot_cfg: The robot configuration. Defaults to SceneEntityCfg("robot"). + object_cfg: The object configuration. Defaults to SceneEntityCfg("object"). + + """ + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + des_pos_b = command[:, :3] + # print(f"desired position : {des_pos_b}, actual position : {object_pos_b}") + error = torch.norm(des_pos_b - object_pos_b, dim=1) + #print("norm position error : ", error) + return error + +def robot_pose( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot") +): + robot: Articulation = env.scene[robot_cfg.name] + # print(robot.data.joint_pos) + return torch.tensor([0.04]) + +def position_command_error( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + command_name: str = "object_pose", + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """The position of the object in the robot's root frame.""" + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + object_pos_w = object.data.root_pos_w[:, :3] + object_pos_b, _ = subtract_frame_transforms( + robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w + ) + des_pos_b = command[:, :3] + # print(f"desired position : {des_pos_b}, actual position : {object_pos_b}") + error = torch.sub(des_pos_b, object_pos_b) + #print("position error : ", error) + return error + +def get_joint_pos(env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor: + """The joint positions of the asset. + + Note: Only the joints configured in :attr:`asset_cfg.joint_ids` will have their positions returned. + """ + # extract the used quantities (to enable type-hinting) + asset: Articulation = env.scene[asset_cfg.name] + #print("Joint positions: : ", asset.data.joint_pos[:, asset_cfg.joint_ids]) + return asset.data.joint_pos[:, asset_cfg.joint_ids] + +# def logstep( +# env: ManagerBasedRLEnv, +# # loghelper : LoggingHelper +# ): +# loghelper.logstep() +# return torch.tensor([0]) +def upright_tilt_deg(q_cur, q_init) -> torch.Tensor: + u_cur, u_init = matrix_from_quat(q_cur)[:, :, 2], matrix_from_quat(q_init)[:, :, 2] + return torch.rad2deg(torch.acos((u_cur * u_init).sum(-1).clamp(-1.0, 1.0))) + + + +def object_tilt (env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object")): + object: RigidObject = env.scene[upper_object_cfg.name] + tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) + #print("obs term : tilt : ", tilt_deg) + return tilt_deg + +def object_knocked(env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"), max_tilt: float = 90): + object: RigidObject = env.scene[upper_object_cfg.name] + tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) + if tilt_deg.cpu().detach().numpy()[0] > max_tilt: + print("object knocked") + return torch.tensor([True], device='cuda:0') + else :return torch.tensor([False], device='cuda:0') \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/rewards.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/rewards.py new file mode 100755 index 000000000000..4436f10c7e48 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/rewards.py @@ -0,0 +1,73 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from __future__ import annotations + +import torch +from typing import TYPE_CHECKING + +from isaaclab.assets import RigidObject +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformer +from isaaclab.utils.math import combine_frame_transforms +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def object_is_lifted( + env: ManagerBasedRLEnv, minimal_height: float, object_cfg: SceneEntityCfg = SceneEntityCfg("object") +) -> torch.Tensor: + """Reward the agent for lifting the object above the minimal height.""" + object: RigidObject = env.scene[object_cfg.name] + + return torch.where(object.data.root_pos_w[:, 2] > minimal_height, 1.0, 0.0) + + +def object_ee_distance( + env: ManagerBasedRLEnv, + std: float, + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), +) -> torch.Tensor: + """Reward the agent for reaching the object using tanh-kernel.""" + # extract the used quantities (to enable type-hinting) + object: RigidObject = env.scene[object_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + # Target object position: (num_envs, 3) + cube_pos_w = object.data.root_pos_w + # End-effector position: (num_envs, 3) + ee_w = ee_frame.data.target_pos_w[..., 0, :] + # Distance of the end-effector to the object: (num_envs,) + object_ee_distance = torch.norm(cube_pos_w - ee_w, dim=1) + + return 1 - torch.tanh(object_ee_distance / std) + + + +def object_goal_distance( + env: ManagerBasedRLEnv, + std: float, + minimal_height: float, + command_name: str, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), +) -> torch.Tensor: + """Reward the agent for tracking the goal pose using tanh-kernel.""" + # extract the used quantities (to enable type-hinting) + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + # compute the desired position in the world frame + des_pos_b = command[:, :3] + des_pos_w, _ = combine_frame_transforms(robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], des_pos_b) + # distance of the end-effector to the object: (num_envs,) + distance = torch.norm(des_pos_w - object.data.root_pos_w[:, :3], dim=1) + # rewarded if the object is lifted above the threshold + #if (object.data.root_pos_w[:, 2] > minimal_height) * (1 - torch.tanh(distance / std)): + # print(f"object goal distance : {distance} ") + #print(f" Goal position reward : {(object.data.root_pos_w[:, 2] > minimal_height) * (1 - torch.tanh(distance / std))}") + return (object.data.root_pos_w[:, 2] > minimal_height) * (1 - torch.tanh(distance / std)) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py new file mode 100755 index 000000000000..007a82d6ca83 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py @@ -0,0 +1,97 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Common functions that can be used to activate certain terminations for the lift task. + +The functions can be passed to the :class:`isaaclab.managers.TerminationTermCfg` object to enable +the termination introduced by the function. +""" + +from __future__ import annotations + +import torch +from typing import TYPE_CHECKING + +from isaaclab.assets import RigidObject, Articulation +from isaaclab.managers import SceneEntityCfg + +from isaaclab.sensors import FrameTransformer +from isaaclab.utils.math import combine_frame_transforms, subtract_frame_transforms +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def object_reached_goal( + env: ManagerBasedRLEnv, + command_name: str = "object_pose", + threshold: float = 0.02, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """Termination condition for the object reaching the goal position. + + Args: + env: The environment. + command_name: The name of the command that is used to control the object. + threshold: The threshold for the object to reach the goal position. Defaults to 0.02. + robot_cfg: The robot configuration. Defaults to SceneEntityCfg("robot"). + object_cfg: The object configuration. Defaults to SceneEntityCfg("object"). + + """ + # extract the used quantities (to enable type-hinting) + robot: RigidObject = env.scene[robot_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + command = env.command_manager.get_command(command_name) + # compute the desired position in the world frame + des_pos_b = command[:, :3] + des_pos_w, _ = combine_frame_transforms(robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], des_pos_b) + # distance of the end-effector to the object: (num_envs,) + distance = torch.norm(des_pos_w - object.data.root_pos_w[:, :3], dim=1) + # print(f"For DEBUG : DISTANCE TO GOAL : {distance}") + # if(distance.item() < threshold): + # loghelper.logsubtask(LogType.FINISH) + test = distance < threshold + if (torch.any(test)): + print("debug : terminations : ", torch.any(test)) + return distance < threshold + + +def placed( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + + object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + ee_frame_cfg: SceneEntityCfg=SceneEntityCfg("ee_frame"), + command_name: str = "object_pose", + threshold: torch.tensor = torch.tensor([0.05], device="cuda:0"), + gripper_open_val= torch.tensor([0.038], device="cuda:0"), #open + atol=0.0001, + rtol=0.0001, + gripper_threshold: float = 0.005, +): + robot: Articulation = env.scene[robot_cfg.name] + + command = env.command_manager.get_command(command_name) + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name], + object: RigidObject = env.scene[object_cfg.name] + + des_pos_b = command[:, :3] + des_pos_w, _ = combine_frame_transforms(robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], des_pos_b) + # distance of the end-effector to the object: (num_envs,) + + object_pos = object.data.root_pos_w + #end_effector_pos = ee_frame.data.target_pos_w[:, 0, :] + # pose_diff = torch.linalg.vector_norm(object_pos - end_effector_pos, dim=1) + distance = torch.norm(des_pos_w - object_pos[:, :3], dim=1) + object_position = distance gripper_open_val) + gripper_open = robot.data.joint_pos[:, -1] > gripper_open_val + state = torch.logical_and(object_position, gripper_open) + return state \ No newline at end of file From 148f1e7a2155b827c20b6a8aa9d6a1b051a0b91e Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Wed, 15 Oct 2025 17:35:52 +0100 Subject: [PATCH 02/15] some additional updates --- docs/conical_flask.obj | 3 + docs/ika_plate.obj | 3 + docs/sample_vial.obj | 3 + docs/scripts/bc.py | 985 +++++++++++ docs/scripts/policy_nets.py | 1570 +++++++++++++++++ .../bc_new_demos/20250925163039}/config.json | 4 +- .../bc_new_demos/20250925163039}/config.json | 4 +- .../bc_new_demos/20250925163039}/config.json | 18 +- .../bc_new_demos/20250925163039}/config.json | 18 +- .../bc_new_demos/20250925163039/config.json | 216 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bc_high_data_/20251009101852/config.json | 219 +++ .../bcq/20250721123120/config.json | 315 ---- .../bc_med_data_/20251015094236/config.json | 219 +++ .../bc_med_data_/20251015094238/config.json | 219 +++ .../bc_med_data_/20251015094238/config.json | 219 +++ .../bc_med_data_/20251015094239/config.json | 219 +++ .../bc_med_data_/20251015094239/config.json | 219 +++ .../bc_trans/20250715154020/config.json | 216 --- .../bc_trans/20250721074506/config.json | 216 --- .../bcq/20250721135829/config.json | 315 ---- .../franks_stack/20250715152538/config.json | 210 --- .../franks_stack/20250716100129/config.json | 210 --- .../20251008103600/config.json | 219 +++ .../20251008103703/config.json | 219 +++ .../20251008113716/config.json | 219 +++ .../20251008113737/config.json | 219 +++ .../20251008124639/config.json | 219 +++ .../20251008131706/config.json | 219 +++ .../bc_low_demos/20251007171556/config.json | 219 +++ .../robomimic/play_ensemble.py | 37 +- .../robomimic/train_ensemble.py | 25 +- scripts/tools/copy_metadata_hdf5.py | 32 + scripts/tools/hdf5_splitter.py | 60 + source/isaaclab/isaaclab/envs/mdp/events.py | 152 +- .../datasets/hdf5_dataset_file_handler.py | 10 +- .../isaaclab_assets/__init__.py | 1 + .../envs/cube_blueprint_mimic_env_cfg.py | 2 +- .../isaaclab_mimic/envs/cube_mimic_env_cfg.py | 2 +- .../cube_lift/config/franka/__init__.py | 5 +- .../agents/robomimic/bc_rnn_low_dim.json | 31 +- .../robomimic/{bc.json => bc_temp.json} | 0 .../cube_lift/config/franka/dev_env_cfg.py | 42 +- .../config/franka/dev_ik_rel_env_obs.py | 48 +- .../manipulation/cube_lift/lift_env_cfg.py | 11 +- 53 files changed, 7899 insertions(+), 1683 deletions(-) create mode 100644 docs/conical_flask.obj create mode 100644 docs/ika_plate.obj create mode 100644 docs/sample_vial.obj create mode 100644 docs/scripts/bc.py create mode 100644 docs/scripts/policy_nets.py rename docs/training_runs/{bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924112632 => Dev-IK-Rel-v0/model0/bc_new_demos/20250925163039}/config.json (97%) rename docs/training_runs/{bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924123612 => Dev-IK-Rel-v0/model1/bc_new_demos/20250925163039}/config.json (97%) rename docs/training_runs/{bc_trans/bc_trans/20250721085238 => Dev-IK-Rel-v0/model2/bc_new_demos/20250925163039}/config.json (94%) mode change 100755 => 100644 rename docs/training_runs/{bc_trans/bc_trans/20250721074750 => Dev-IK-Rel-v0/model3/bc_new_demos/20250925163039}/config.json (94%) mode change 100755 => 100644 create mode 100644 docs/training_runs/Dev-IK-Rel-v0/model4/bc_new_demos/20250925163039/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model0/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model1/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model2/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model3/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model4/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model5/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model6/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model7/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model8/bc_high_data_/20251009101852/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model9/bc_high_data_/20251009101852/config.json delete mode 100755 docs/training_runs/bc_q/Dev-IK-Rel-v0/bcq/20250721123120/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model0/bc_med_data_/20251015094236/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model1/bc_med_data_/20251015094238/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model2/bc_med_data_/20251015094238/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model3/bc_med_data_/20251015094239/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model4/bc_med_data_/20251015094239/config.json delete mode 100755 docs/training_runs/bc_trans/bc_trans/20250715154020/config.json delete mode 100755 docs/training_runs/bc_trans/bc_trans/20250721074506/config.json delete mode 100755 docs/training_runs/bcq/Dev-IK-Rel-v0/bcq/20250721135829/config.json delete mode 100755 docs/training_runs/franks_stack/20250715152538/config.json delete mode 100755 docs/training_runs/franks_stack/20250716100129/config.json create mode 100644 docs/training_runs/good_data/bc_high_demos_0/20251008103600/config.json create mode 100644 docs/training_runs/good_data/bc_high_demos_1/20251008103703/config.json create mode 100644 docs/training_runs/good_data/bc_high_demos_2/20251008113716/config.json create mode 100644 docs/training_runs/good_data/bc_high_demos_3/20251008113737/config.json create mode 100644 docs/training_runs/good_data/bc_high_demos_4/20251008124639/config.json create mode 100644 docs/training_runs/good_data/bc_high_demos_5/20251008131706/config.json create mode 100644 docs/training_runs/good_data/bc_low_demos/20251007171556/config.json create mode 100644 scripts/tools/copy_metadata_hdf5.py create mode 100644 scripts/tools/hdf5_splitter.py rename source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/{bc.json => bc_temp.json} (100%) diff --git a/docs/conical_flask.obj b/docs/conical_flask.obj new file mode 100644 index 000000000000..1cf78fb5cfe5 --- /dev/null +++ b/docs/conical_flask.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42056c414f1fec1b69d48dcbf4e24e6b79200ab60e99775425505f320ce067c5 +size 868444 diff --git a/docs/ika_plate.obj b/docs/ika_plate.obj new file mode 100644 index 000000000000..1a0738e552fc --- /dev/null +++ b/docs/ika_plate.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0de6bafe0e4b876dfd3a9e5fad29f14c8b35af860386ef81c7e9e6312d44e7d +size 46251 diff --git a/docs/sample_vial.obj b/docs/sample_vial.obj new file mode 100644 index 000000000000..bb777506e473 --- /dev/null +++ b/docs/sample_vial.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecbe68889e998563caf5dfbf5be3e8e98bdbc13920c2d23313be92dde78426eb +size 3029229 diff --git a/docs/scripts/bc.py b/docs/scripts/bc.py new file mode 100644 index 000000000000..a31b5e816a70 --- /dev/null +++ b/docs/scripts/bc.py @@ -0,0 +1,985 @@ +""" +Implementation of Behavioral Cloning (BC). +""" +from collections import OrderedDict + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.distributions as D + +import robomimic.models.base_nets as BaseNets +import robomimic.models.obs_nets as ObsNets +import robomimic.models.policy_nets as PolicyNets +import robomimic.models.vae_nets as VAENets +import robomimic.utils.loss_utils as LossUtils +import robomimic.utils.tensor_utils as TensorUtils +import robomimic.utils.torch_utils as TorchUtils +import robomimic.utils.obs_utils as ObsUtils + +from robomimic.algo import register_algo_factory_func, PolicyAlgo + + +@register_algo_factory_func("bc") +def algo_config_to_class(algo_config): + """ + Maps algo config to the BC algo class to instantiate, along with additional algo kwargs. + + Args: + algo_config (Config instance): algo config + + Returns: + algo_class: subclass of Algo + algo_kwargs (dict): dictionary of additional kwargs to pass to algorithm + """ + + # note: we need the check below because some configs import BCConfig and exclude + # some of these options + gaussian_enabled = ("gaussian" in algo_config and algo_config.gaussian.enabled) + gmm_enabled = ("gmm" in algo_config and algo_config.gmm.enabled) + vae_enabled = ("vae" in algo_config and algo_config.vae.enabled) + + rnn_enabled = algo_config.rnn.enabled + # support legacy configs that do not have "transformer" item + transformer_enabled = ("transformer" in algo_config) and algo_config.transformer.enabled + + if gaussian_enabled: + if rnn_enabled: + algo_class, algo_kwargs = BC_RNN_GAUSSIAN, {} + elif transformer_enabled: + raise NotImplementedError + else: + algo_class, algo_kwargs = BC_Gaussian, {} + elif gmm_enabled: + if rnn_enabled: + algo_class, algo_kwargs = BC_RNN_GMM, {} + elif transformer_enabled: + algo_class, algo_kwargs = BC_Transformer_GMM, {} + else: + algo_class, algo_kwargs = BC_GMM, {} + elif vae_enabled: + if rnn_enabled: + raise NotImplementedError + elif transformer_enabled: + raise NotImplementedError + else: + algo_class, algo_kwargs = BC_VAE, {} + else: + if rnn_enabled: + algo_class, algo_kwargs = BC_RNN, {} + elif transformer_enabled: + algo_class, algo_kwargs = BC_Transformer, {} + else: + algo_class, algo_kwargs = BC, {} + + return algo_class, algo_kwargs + + +class BC(PolicyAlgo): + """ + Normal BC training. + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + self.nets = nn.ModuleDict() + self.nets["policy"] = PolicyNets.ActorNetwork( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + mlp_layer_dims=self.algo_config.actor_layer_dims, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + ) + self.nets = self.nets.float().to(self.device) + + def process_batch_for_training(self, batch): + """ + Processes input batch from a data loader to filter out + relevant information and prepare the batch for training. + + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader + + Returns: + input_batch (dict): processed and filtered batch that + will be used for training + """ + input_batch = dict() + input_batch["obs"] = {k: batch["obs"][k][:, 0, :] for k in batch["obs"]} + input_batch["goal_obs"] = batch.get("goal_obs", None) # goals may not be present + input_batch["actions"] = batch["actions"][:, 0, :] + # we move to device first before float conversion because image observation modalities will be uint8 - + # this minimizes the amount of data transferred to GPU + return TensorUtils.to_float(TensorUtils.to_device(input_batch, self.device)) + + + def train_on_batch(self, batch, epoch, validate=False): + """ + Training on a single batch of data. + + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + epoch (int): epoch number - required by some Algos that need + to perform staged training and early stopping + + validate (bool): if True, don't perform any learning updates. + + Returns: + info (dict): dictionary of relevant inputs, outputs, and losses + that might be relevant for logging + """ + with TorchUtils.maybe_no_grad(no_grad=validate): + info = super(BC, self).train_on_batch(batch, epoch, validate=validate) + predictions = self._forward_training(batch) + losses = self._compute_losses(predictions, batch) + + info["predictions"] = TensorUtils.detach(predictions) + info["losses"] = TensorUtils.detach(losses) + + if not validate: + step_info = self._train_step(losses) + info.update(step_info) + + return info + + def _forward_training(self, batch): + """ + Internal helper function for BC algo class. Compute forward pass + and return network outputs in @predictions dict. + + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + predictions (dict): dictionary containing network outputs + """ + predictions = OrderedDict() + actions = self.nets["policy"](obs_dict=batch["obs"], goal_dict=batch["goal_obs"]) + predictions["actions"] = actions + return predictions + + def _compute_losses(self, predictions, batch): + """ + Internal helper function for BC algo class. Compute losses based on + network outputs in @predictions dict, using reference labels in @batch. + + Args: + predictions (dict): dictionary containing network outputs, from @_forward_training + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + losses (dict): dictionary of losses computed over the batch + """ + losses = OrderedDict() + a_target = batch["actions"] + actions = predictions["actions"] + losses["l2_loss"] = nn.MSELoss()(actions, a_target) + losses["l1_loss"] = nn.SmoothL1Loss()(actions, a_target) + # cosine direction loss on eef delta position + losses["cos_loss"] = LossUtils.cosine_loss(actions[..., :3], a_target[..., :3]) + + action_losses = [ + self.algo_config.loss.l2_weight * losses["l2_loss"], + self.algo_config.loss.l1_weight * losses["l1_loss"], + self.algo_config.loss.cos_weight * losses["cos_loss"], + ] + action_loss = sum(action_losses) + losses["action_loss"] = action_loss + return losses + + def _train_step(self, losses): + """ + Internal helper function for BC algo class. Perform backpropagation on the + loss tensors in @losses to update networks. + + Args: + losses (dict): dictionary of losses computed over the batch, from @_compute_losses + """ + + # gradient step + info = OrderedDict() + policy_grad_norms = TorchUtils.backprop_for_loss( + net=self.nets["policy"], + optim=self.optimizers["policy"], + loss=losses["action_loss"], + ) + info["policy_grad_norms"] = policy_grad_norms + return info + + def log_info(self, info): + """ + Process info dictionary from @train_on_batch to summarize + information to pass to tensorboard for logging. + + Args: + info (dict): dictionary of info + + Returns: + loss_log (dict): name -> summary statistic + """ + log = super(BC, self).log_info(info) + log["Loss"] = info["losses"]["action_loss"].item() + if "l2_loss" in info["losses"]: + log["L2_Loss"] = info["losses"]["l2_loss"].item() + if "l1_loss" in info["losses"]: + log["L1_Loss"] = info["losses"]["l1_loss"].item() + if "cos_loss" in info["losses"]: + log["Cosine_Loss"] = info["losses"]["cos_loss"].item() + if "policy_grad_norms" in info: + log["Policy_Grad_Norms"] = info["policy_grad_norms"] + return log + + def get_action(self, obs_dict, goal_dict=None): + """ + Get policy action outputs. + + Args: + obs_dict (dict): current observation + goal_dict (dict): (optional) goal + + Returns: + action (torch.Tensor): action tensor + """ + assert not self.nets.training + return self.nets["policy"](obs_dict, goal_dict=goal_dict) + + +class BC_Gaussian(BC): + """ + BC training with a Gaussian policy. + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + assert self.algo_config.gaussian.enabled + + self.nets = nn.ModuleDict() + self.nets["policy"] = PolicyNets.GaussianActorNetwork( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + mlp_layer_dims=self.algo_config.actor_layer_dims, + fixed_std=self.algo_config.gaussian.fixed_std, + init_std=self.algo_config.gaussian.init_std, + std_limits=(self.algo_config.gaussian.min_std, 7.5), + std_activation=self.algo_config.gaussian.std_activation, + low_noise_eval=self.algo_config.gaussian.low_noise_eval, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + ) + + self.nets = self.nets.float().to(self.device) + + def _forward_training(self, batch): + """ + Internal helper function for BC algo class. Compute forward pass + and return network outputs in @predictions dict. + + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + predictions (dict): dictionary containing network outputs + """ + dists = self.nets["policy"].forward_train( + obs_dict=batch["obs"], + goal_dict=batch["goal_obs"], + ) + + # make sure that this is a batch of multivariate action distributions, so that + # the log probability computation will be correct + assert len(dists.batch_shape) == 1 + log_probs = dists.log_prob(batch["actions"]) + + predictions = OrderedDict( + log_probs=log_probs, + ) + return predictions + + def _compute_losses(self, predictions, batch): + """ + Internal helper function for BC algo class. Compute losses based on + network outputs in @predictions dict, using reference labels in @batch. + + Args: + predictions (dict): dictionary containing network outputs, from @_forward_training + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + losses (dict): dictionary of losses computed over the batch + """ + + # loss is just negative log-likelihood of action targets + action_loss = -predictions["log_probs"].mean() + return OrderedDict( + log_probs=-action_loss, + action_loss=action_loss, + ) + + def log_info(self, info): + """ + Process info dictionary from @train_on_batch to summarize + information to pass to tensorboard for logging. + + Args: + info (dict): dictionary of info + + Returns: + loss_log (dict): name -> summary statistic + """ + log = PolicyAlgo.log_info(self, info) + log["Loss"] = info["losses"]["action_loss"].item() + log["Log_Likelihood"] = info["losses"]["log_probs"].item() + if "policy_grad_norms" in info: + log["Policy_Grad_Norms"] = info["policy_grad_norms"] + return log + + +class BC_GMM(BC_Gaussian): + """ + BC training with a Gaussian Mixture Model policy. + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + assert self.algo_config.gmm.enabled + + self.nets = nn.ModuleDict() + self.nets["policy"] = PolicyNets.GMMActorNetwork( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + mlp_layer_dims=self.algo_config.actor_layer_dims, + num_modes=self.algo_config.gmm.num_modes, + min_std=self.algo_config.gmm.min_std, + std_activation=self.algo_config.gmm.std_activation, + low_noise_eval=self.algo_config.gmm.low_noise_eval, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + ) + + self.nets = self.nets.float().to(self.device) + + +class BC_VAE(BC): + """ + BC training with a VAE policy. + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + self.nets = nn.ModuleDict() + self.nets["policy"] = PolicyNets.VAEActor( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + device=self.device, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + **VAENets.vae_args_from_config(self.algo_config.vae), + ) + + self.nets = self.nets.float().to(self.device) + + def train_on_batch(self, batch, epoch, validate=False): + """ + Update from superclass to set categorical temperature, for categorical VAEs. + """ + if self.algo_config.vae.prior.use_categorical: + temperature = self.algo_config.vae.prior.categorical_init_temp - epoch * self.algo_config.vae.prior.categorical_temp_anneal_step + temperature = max(temperature, self.algo_config.vae.prior.categorical_min_temp) + self.nets["policy"].set_gumbel_temperature(temperature) + return super(BC_VAE, self).train_on_batch(batch, epoch, validate=validate) + + def _forward_training(self, batch): + """ + Internal helper function for BC algo class. Compute forward pass + and return network outputs in @predictions dict. + + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + predictions (dict): dictionary containing network outputs + """ + vae_inputs = dict( + actions=batch["actions"], + obs_dict=batch["obs"], + goal_dict=batch["goal_obs"], + freeze_encoder=batch.get("freeze_encoder", False), + ) + + vae_outputs = self.nets["policy"].forward_train(**vae_inputs) + predictions = OrderedDict( + actions=vae_outputs["decoder_outputs"], + kl_loss=vae_outputs["kl_loss"], + reconstruction_loss=vae_outputs["reconstruction_loss"], + encoder_z=vae_outputs["encoder_z"], + ) + if not self.algo_config.vae.prior.use_categorical: + with torch.no_grad(): + encoder_variance = torch.exp(vae_outputs["encoder_params"]["logvar"]) + predictions["encoder_variance"] = encoder_variance + return predictions + + def _compute_losses(self, predictions, batch): + """ + Internal helper function for BC algo class. Compute losses based on + network outputs in @predictions dict, using reference labels in @batch. + + Args: + predictions (dict): dictionary containing network outputs, from @_forward_training + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + losses (dict): dictionary of losses computed over the batch + """ + + # total loss is sum of reconstruction and KL, weighted by beta + kl_loss = predictions["kl_loss"] + recons_loss = predictions["reconstruction_loss"] + action_loss = recons_loss + self.algo_config.vae.kl_weight * kl_loss + return OrderedDict( + recons_loss=recons_loss, + kl_loss=kl_loss, + action_loss=action_loss, + ) + + def log_info(self, info): + """ + Process info dictionary from @train_on_batch to summarize + information to pass to tensorboard for logging. + + Args: + info (dict): dictionary of info + + Returns: + loss_log (dict): name -> summary statistic + """ + log = PolicyAlgo.log_info(self, info) + log["Loss"] = info["losses"]["action_loss"].item() + log["KL_Loss"] = info["losses"]["kl_loss"].item() + log["Reconstruction_Loss"] = info["losses"]["recons_loss"].item() + if self.algo_config.vae.prior.use_categorical: + log["Gumbel_Temperature"] = self.nets["policy"].get_gumbel_temperature() + else: + log["Encoder_Variance"] = info["predictions"]["encoder_variance"].mean().item() + if "policy_grad_norms" in info: + log["Policy_Grad_Norms"] = info["policy_grad_norms"] + return log + + +class BC_RNN(BC): + """ + BC training with an RNN policy. + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + self.nets = nn.ModuleDict() + self.nets["policy"] = PolicyNets.RNNActorNetwork( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + mlp_layer_dims=self.algo_config.actor_layer_dims, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + **BaseNets.rnn_args_from_config(self.algo_config.rnn), + ) + + self._rnn_hidden_state = None + self._rnn_horizon = self.algo_config.rnn.horizon + self._rnn_counter = 0 + self._rnn_is_open_loop = self.algo_config.rnn.get("open_loop", False) + + self.nets = self.nets.float().to(self.device) + + def process_batch_for_training(self, batch): + """ + Processes input batch from a data loader to filter out + relevant information and prepare the batch for training. + + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader + + Returns: + input_batch (dict): processed and filtered batch that + will be used for training + """ + input_batch = dict() + input_batch["obs"] = batch["obs"] + input_batch["goal_obs"] = batch.get("goal_obs", None) # goals may not be present + input_batch["actions"] = batch["actions"] + + if self._rnn_is_open_loop: + # replace the observation sequence with one that only consists of the first observation. + # This way, all actions are predicted "open-loop" after the first observation, based + # on the rnn hidden state. + n_steps = batch["actions"].shape[1] + obs_seq_start = TensorUtils.index_at_time(batch["obs"], ind=0) + input_batch["obs"] = TensorUtils.unsqueeze_expand_at(obs_seq_start, size=n_steps, dim=1) + + # we move to device first before float conversion because image observation modalities will be uint8 - + # this minimizes the amount of data transferred to GPU + return TensorUtils.to_float(TensorUtils.to_device(input_batch, self.device)) + + def get_action(self, obs_dict, goal_dict=None): + """ + Get policy action outputs. + + Args: + obs_dict (dict): current observation + goal_dict (dict): (optional) goal + + Returns: + action (torch.Tensor): action tensor + """ + assert not self.nets.training + + if self._rnn_hidden_state is None or self._rnn_counter % self._rnn_horizon == 0: + batch_size = list(obs_dict.values())[0].shape[0] + self._rnn_hidden_state = self.nets["policy"].get_rnn_init_state(batch_size=batch_size, device=self.device) + + if self._rnn_is_open_loop: + # remember the initial observation, and use it instead of the current observation + # for open-loop action sequence prediction + self._open_loop_obs = TensorUtils.clone(TensorUtils.detach(obs_dict)) + + obs_to_use = obs_dict + if self._rnn_is_open_loop: + # replace current obs with last recorded obs + obs_to_use = self._open_loop_obs + + self._rnn_counter += 1 + action, self._rnn_hidden_state = self.nets["policy"].forward_step( + obs_to_use, goal_dict=goal_dict, rnn_state=self._rnn_hidden_state) + return action + + def reset(self): + """ + Reset algo state to prepare for environment rollouts. + """ + self._rnn_hidden_state = None + self._rnn_counter = 0 + + +class BC_RNN_GMM(BC_RNN): + """ + BC training with an RNN GMM policy. + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + assert self.algo_config.gmm.enabled + assert self.algo_config.rnn.enabled + + self.nets = nn.ModuleDict() + self.nets["policy"] = PolicyNets.RNNGMMActorNetwork( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + mlp_layer_dims=self.algo_config.actor_layer_dims, + num_modes=self.algo_config.gmm.num_modes, + min_std=self.algo_config.gmm.min_std, + std_activation=self.algo_config.gmm.std_activation, + low_noise_eval=self.algo_config.gmm.low_noise_eval, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + **BaseNets.rnn_args_from_config(self.algo_config.rnn), + ) + + self._rnn_hidden_state = None + self._rnn_horizon = self.algo_config.rnn.horizon + self._rnn_counter = 0 + self._rnn_is_open_loop = self.algo_config.rnn.get("open_loop", False) + + self.nets = self.nets.float().to(self.device) + + def _forward_training(self, batch): + """ + Internal helper function for BC algo class. Compute forward pass + and return network outputs in @predictions dict. + + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + predictions (dict): dictionary containing network outputs + """ + dists = self.nets["policy"].forward_train( + obs_dict=batch["obs"], + goal_dict=batch["goal_obs"], + ) + + # make sure that this is a batch of multivariate action distributions, so that + # the log probability computation will be correct + assert len(dists.batch_shape) == 2 # [B, T] + log_probs = dists.log_prob(batch["actions"]) + + predictions = OrderedDict( + log_probs=log_probs, + ) + return predictions + + def _compute_losses(self, predictions, batch): + """ + Internal helper function for BC algo class. Compute losses based on + network outputs in @predictions dict, using reference labels in @batch. + + Args: + predictions (dict): dictionary containing network outputs, from @_forward_training + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + losses (dict): dictionary of losses computed over the batch + """ + + # loss is just negative log-likelihood of action targets + action_loss = -predictions["log_probs"].mean() + return OrderedDict( + log_probs=-action_loss, + action_loss=action_loss, + ) + + def log_info(self, info): + """ + Process info dictionary from @train_on_batch to summarize + information to pass to tensorboard for logging. + + Args: + info (dict): dictionary of info + + Returns: + loss_log (dict): name -> summary statistic + """ + log = PolicyAlgo.log_info(self, info) + log["Loss"] = info["losses"]["action_loss"].item() + log["Log_Likelihood"] = info["losses"]["log_probs"].item() + if "policy_grad_norms" in info: + log["Policy_Grad_Norms"] = info["policy_grad_norms"] + return log + + +class BC_Transformer(BC): + """ + BC training with a Transformer policy. + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + assert self.algo_config.transformer.enabled + + self.nets = nn.ModuleDict() + self.nets["policy"] = PolicyNets.TransformerActorNetwork( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + **BaseNets.transformer_args_from_config(self.algo_config.transformer), + ) + self._set_params_from_config() + self.nets = self.nets.float().to(self.device) + + def _set_params_from_config(self): + """ + Read specific config variables we need for training / eval. + Called by @_create_networks method + """ + self.context_length = self.algo_config.transformer.context_length + self.supervise_all_steps = self.algo_config.transformer.supervise_all_steps + + def process_batch_for_training(self, batch): + """ + Processes input batch from a data loader to filter out + relevant information and prepare the batch for training. + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader + Returns: + input_batch (dict): processed and filtered batch that + will be used for training + """ + input_batch = dict() + h = self.context_length + input_batch["obs"] = {k: batch["obs"][k][:, :h, :] for k in batch["obs"]} + input_batch["goal_obs"] = batch.get("goal_obs", None) # goals may not be present + + if self.supervise_all_steps: + # supervision on entire sequence (instead of just current timestep) + input_batch["actions"] = batch["actions"][:, :h, :] + else: + # just use current timestep + input_batch["actions"] = batch["actions"][:, h-1, :] + + input_batch = TensorUtils.to_device(TensorUtils.to_float(input_batch), self.device) + return input_batch + + def _forward_training(self, batch, epoch=None): + """ + Internal helper function for BC_Transformer algo class. Compute forward pass + and return network outputs in @predictions dict. + + Args: + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + + Returns: + predictions (dict): dictionary containing network outputs + """ + # ensure that transformer context length is consistent with temporal dimension of observations + TensorUtils.assert_size_at_dim( + batch["obs"], + size=(self.context_length), + dim=1, + msg="Error: expect temporal dimension of obs batch to match transformer context length {}".format(self.context_length), + ) + + predictions = OrderedDict() + predictions["actions"] = self.nets["policy"](obs_dict=batch["obs"], actions=None, goal_dict=batch["goal_obs"]) + if not self.supervise_all_steps: + # only supervise final timestep + predictions["actions"] = predictions["actions"][:, -1, :] + return predictions + + def get_action(self, obs_dict, goal_dict=None): + """ + Get policy action outputs. + Args: + obs_dict (dict): current observation + goal_dict (dict): (optional) goal + Returns: + action (torch.Tensor): action tensor + """ + assert not self.nets.training + + return self.nets["policy"](obs_dict, actions=None, goal_dict=goal_dict)[:, -1, :] + + +class BC_Transformer_GMM(BC_Transformer): + """ + BC training with a Transformer GMM policy. + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + assert self.algo_config.gmm.enabled + assert self.algo_config.transformer.enabled + + self.nets = nn.ModuleDict() + self.nets["policy"] = PolicyNets.TransformerGMMActorNetwork( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + num_modes=self.algo_config.gmm.num_modes, + min_std=self.algo_config.gmm.min_std, + std_activation=self.algo_config.gmm.std_activation, + low_noise_eval=self.algo_config.gmm.low_noise_eval, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + **BaseNets.transformer_args_from_config(self.algo_config.transformer), + ) + self._set_params_from_config() + self.nets = self.nets.float().to(self.device) + + def _forward_training(self, batch, epoch=None): + """ + Modify from super class to support GMM training. + """ + # ensure that transformer context length is consistent with temporal dimension of observations + TensorUtils.assert_size_at_dim( + batch["obs"], + size=(self.context_length), + dim=1, + msg="Error: expect temporal dimension of obs batch to match transformer context length {}".format(self.context_length), + ) + + dists = self.nets["policy"].forward_train( + obs_dict=batch["obs"], + actions=None, + goal_dict=batch["goal_obs"], + low_noise_eval=False, + ) + + # make sure that this is a batch of multivariate action distributions, so that + # the log probability computation will be correct + assert len(dists.batch_shape) == 2 # [B, T] + + if not self.supervise_all_steps: + # only use final timestep prediction by making a new distribution with only final timestep. + # This essentially does `dists = dists[:, -1]` + component_distribution = D.Normal( + loc=dists.component_distribution.base_dist.loc[:, -1], + scale=dists.component_distribution.base_dist.scale[:, -1], + ) + component_distribution = D.Independent(component_distribution, 1) + mixture_distribution = D.Categorical(logits=dists.mixture_distribution.logits[:, -1]) + dists = D.MixtureSameFamily( + mixture_distribution=mixture_distribution, + component_distribution=component_distribution, + ) + + log_probs = dists.log_prob(batch["actions"]) + + predictions = OrderedDict( + log_probs=log_probs, + ) + return predictions + + def _compute_losses(self, predictions, batch): + """ + Internal helper function for BC_Transformer_GMM algo class. Compute losses based on + network outputs in @predictions dict, using reference labels in @batch. + Args: + predictions (dict): dictionary containing network outputs, from @_forward_training + batch (dict): dictionary with torch.Tensors sampled + from a data loader and filtered by @process_batch_for_training + Returns: + losses (dict): dictionary of losses computed over the batch + """ + + # loss is just negative log-likelihood of action targets + action_loss = -predictions["log_probs"].mean() + return OrderedDict( + log_probs=-action_loss, + action_loss=action_loss, + ) + + def log_info(self, info): + """ + Process info dictionary from @train_on_batch to summarize + information to pass to tensorboard for logging. + Args: + info (dict): dictionary of info + Returns: + loss_log (dict): name -> summary statistic + """ + log = PolicyAlgo.log_info(self, info) + log["Loss"] = info["losses"]["action_loss"].item() + log["Log_Likelihood"] = info["losses"]["log_probs"].item() + if "policy_grad_norms" in info: + log["Policy_Grad_Norms"] = info["policy_grad_norms"] + return log + + +#### Laura Mods here +class BC_RNN_GAUSSIAN(BC_RNN): + """ + BC training with an RNN Gaussian policy (Heteroscedastic Uncertainty). + """ + def _create_networks(self): + """ + Creates networks and places them into @self.nets. + """ + assert self.algo_config.gaussian.enabled + assert self.algo_config.rnn.enabled + + self.nets = nn.ModuleDict() + + # NOTE: This requires a new network class in robomimic.models.policy_nets + # that implements an RNN-based policy which outputs the parameters + # (mean and log_std) of a Gaussian distribution for a sequence. + self.nets["policy"] = PolicyNets.GaussianRNNActorNetwork( + obs_shapes=self.obs_shapes, + goal_shapes=self.goal_shapes, + ac_dim=self.ac_dim, + mlp_layer_dims=self.algo_config.actor_layer_dims, + fixed_std=self.algo_config.gaussian.fixed_std, + init_std=self.algo_config.gaussian.init_std, + std_limits=(self.algo_config.gaussian.min_std, 7.5), + std_activation=self.algo_config.gaussian.std_activation, + low_noise_eval=self.algo_config.gaussian.low_noise_eval, + encoder_kwargs=ObsUtils.obs_encoder_kwargs_from_config(self.obs_config.encoder), + **BaseNets.rnn_args_from_config(self.algo_config.rnn), + ) + + self._rnn_hidden_state = None + self._rnn_horizon = self.algo_config.rnn.horizon + self._rnn_counter = 0 + self._rnn_is_open_loop = self.algo_config.rnn.get("open_loop", False) + + self.nets = self.nets.float().to(self.device) + + def _forward_training(self, batch): + """ + Internal helper function to compute forward pass and return log-probabilities. + """ + # Policy is a GaussianRNNActorNetwork that outputs a torch.Distribution object (sequence of distributions). + dists = self.nets["policy"].forward_train( + obs_dict=batch["obs"], + goal_dict=batch["goal_obs"], + ) + + # The distribution must be a batch of action sequence distributions: [B, T] + assert len(dists.batch_shape) == 2 + + # Calculate log probability for the entire sequence of ground truth actions + log_probs = dists.log_prob(batch["actions"]) + + predictions = OrderedDict( + log_probs=log_probs, + ) + return predictions + + def _compute_losses(self, predictions, batch): + """ + Loss is the Gaussian Negative Log-Likelihood (NLL). + """ + # Loss is the negative mean log-likelihood of action targets across B x T + action_loss = -predictions["log_probs"].mean() + return OrderedDict( + log_probs=-action_loss, + action_loss=action_loss, + ) + + def log_info(self, info): + """ + Update log information to include NLL loss. + """ + log = PolicyAlgo.log_info(self, info) + log["Loss"] = info["losses"]["action_loss"].item() + log["Log_Likelihood"] = info["losses"]["log_probs"].item() + if "policy_grad_norms" in info: + log["Policy_Grad_Norms"] = info["policy_grad_norms"] + return log + + def get_action(self, obs_dict, goal_dict=None): + """ + Overrides BC_RNN.get_action(). + Get action using the mean of the predicted Gaussian distribution. + """ + assert not self.nets.training + + if self._rnn_hidden_state is None or self._rnn_counter % self._rnn_horizon == 0: + batch_size = list(obs_dict.values())[0].shape[0] + self._rnn_hidden_state = self.nets["policy"].get_rnn_init_state(batch_size=batch_size, device=self.device) + + if self._rnn_is_open_loop: + # remember the initial observation, and use it instead of the current observation + self._open_loop_obs = TensorUtils.clone(TensorUtils.detach(obs_dict)) + + obs_to_use = obs_dict + if self._rnn_is_open_loop: + # replace current obs with last recorded obs + obs_to_use = self._open_loop_obs + + self._rnn_counter += 1 + + # Use forward_step which should return the mean action and the updated RNN state + action, self._rnn_hidden_state = self.nets["policy"].forward_step( + obs_to_use, goal_dict=goal_dict, rnn_state=self._rnn_hidden_state) + + return action \ No newline at end of file diff --git a/docs/scripts/policy_nets.py b/docs/scripts/policy_nets.py new file mode 100644 index 000000000000..8dba1d934cbb --- /dev/null +++ b/docs/scripts/policy_nets.py @@ -0,0 +1,1570 @@ +""" +Contains torch Modules for policy networks. These networks take an +observation dictionary as input (and possibly additional conditioning, +such as subgoal or goal dictionaries) and produce action predictions, +samples, or distributions as outputs. Note that actions +are assumed to lie in [-1, 1], and most networks will have a final +tanh activation to help ensure this range. +""" +import textwrap +import numpy as np +from collections import OrderedDict + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.distributions as D + +import robomimic.utils.tensor_utils as TensorUtils +from robomimic.models.base_nets import Module +from robomimic.models.transformers import GPT_Backbone +from robomimic.models.obs_nets import MIMO_MLP, RNN_MIMO_MLP, MIMO_Transformer, ObservationDecoder +from robomimic.models.vae_nets import VAE +from robomimic.models.distributions import TanhWrappedDistribution + + +class ActorNetwork(MIMO_MLP): + """ + A basic policy network that predicts actions from observations. + Can optionally be goal conditioned on future observations. + """ + def __init__( + self, + obs_shapes, + ac_dim, + mlp_layer_dims, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + obs_shapes (OrderedDict): a dictionary that maps observation keys to + expected shapes for observations. + + ac_dim (int): dimension of action space. + + mlp_layer_dims ([int]): sequence of integers for the MLP hidden layers sizes. + + goal_shapes (OrderedDict): a dictionary that maps observation keys to + expected shapes for goal observations. + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-observation key information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + assert isinstance(obs_shapes, OrderedDict) + self.obs_shapes = obs_shapes + self.ac_dim = ac_dim + + # set up different observation groups for @MIMO_MLP + observation_group_shapes = OrderedDict() + observation_group_shapes["obs"] = OrderedDict(self.obs_shapes) + + self._is_goal_conditioned = False + if goal_shapes is not None and len(goal_shapes) > 0: + assert isinstance(goal_shapes, OrderedDict) + self._is_goal_conditioned = True + self.goal_shapes = OrderedDict(goal_shapes) + observation_group_shapes["goal"] = OrderedDict(self.goal_shapes) + else: + self.goal_shapes = OrderedDict() + + output_shapes = self._get_output_shapes() + super(ActorNetwork, self).__init__( + input_obs_group_shapes=observation_group_shapes, + output_shapes=output_shapes, + layer_dims=mlp_layer_dims, + encoder_kwargs=encoder_kwargs, + ) + + def _get_output_shapes(self): + """ + Allow subclasses to re-define outputs from @MIMO_MLP, since we won't + always directly predict actions, but may instead predict the parameters + of a action distribution. + """ + return OrderedDict(action=(self.ac_dim,)) + + def output_shape(self, input_shape=None): + return [self.ac_dim] + + def forward(self, obs_dict, goal_dict=None): + actions = super(ActorNetwork, self).forward(obs=obs_dict, goal=goal_dict)["action"] + # apply tanh squashing to ensure actions are in [-1, 1] + return torch.tanh(actions) + + def _to_string(self): + """Info to pretty print.""" + return "action_dim={}".format(self.ac_dim) + + +class PerturbationActorNetwork(ActorNetwork): + """ + An action perturbation network - primarily used in BCQ. + It takes states and actions and returns action perturbations. + """ + def __init__( + self, + obs_shapes, + ac_dim, + mlp_layer_dims, + perturbation_scale=0.05, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + obs_shapes (OrderedDict): a dictionary that maps observation keys to + expected shapes for observations. + + ac_dim (int): dimension of action space. + + mlp_layer_dims ([int]): sequence of integers for the MLP hidden layers sizes. + + perturbation_scale (float): the perturbation network output is always squashed to + lie in +/- @perturbation_scale. The final action output is equal to the original + input action added to the output perturbation (and clipped to lie in [-1, 1]). + + goal_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for goal observations. + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-modality information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + self.perturbation_scale = perturbation_scale + + # add in action as a modality + new_obs_shapes = OrderedDict(obs_shapes) + new_obs_shapes["action"] = (ac_dim,) + + # pass to super class to instantiate network + super(PerturbationActorNetwork, self).__init__( + obs_shapes=new_obs_shapes, + ac_dim=ac_dim, + mlp_layer_dims=mlp_layer_dims, + goal_shapes=goal_shapes, + encoder_kwargs=encoder_kwargs, + ) + + def forward(self, obs_dict, acts, goal_dict=None): + """Forward pass through perturbation actor.""" + # add in actions + inputs = dict(obs_dict) + inputs["action"] = acts + perturbations = super(PerturbationActorNetwork, self).forward(inputs, goal_dict) + + # add perturbations from network to original actions, and ensure the new actions lie in [-1, 1] + output_actions = acts + self.perturbation_scale * perturbations + output_actions = output_actions.clamp(-1.0, 1.0) + return output_actions + + def _to_string(self): + """Info to pretty print.""" + return "action_dim={}, perturbation_scale={}".format(self.ac_dim, self.perturbation_scale) + + +class GaussianActorNetwork(ActorNetwork): + """ + Variant of actor network that learns a diagonal unimodal Gaussian distribution + over actions. + """ + def __init__( + self, + obs_shapes, + ac_dim, + mlp_layer_dims, + fixed_std=False, + std_activation="softplus", + init_last_fc_weight=None, + init_std=0.3, + mean_limits=(-9.0, 9.0), + std_limits=(0.007, 7.5), + low_noise_eval=True, + use_tanh=False, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + obs_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for observations. + + ac_dim (int): dimension of action space. + + mlp_layer_dims ([int]): sequence of integers for the MLP hidden layers sizes. + + fixed_std (bool): if True, std is not learned, but kept constant at @init_std + + std_activation (None or str): type of activation to use for std deviation. Options are: + + None: no activation applied (not recommended unless using fixed std) + + `'softplus'`: Only applicable if not using fixed std. Softplus activation applied, after which the + output is scaled by init_std / softplus(0) + + `'exp'`: Only applicable if not using fixed std. Exp applied; this corresponds to network output + as being interpreted as log_std instead of std + + NOTE: In all cases, the final result is clipped to be within @std_limits + + init_last_fc_weight (None or float): if specified, will intialize the final layer network weights to be + uniformly sampled from [-init_weight, init_weight] + + init_std (None or float): approximate initial scaling for standard deviation outputs + from network. If None + + mean_limits (2-array): (min, max) to clamp final mean output by + + std_limits (2-array): (min, max) to clamp final std output by + + low_noise_eval (float): if True, model will output means of Gaussian distribution + at eval time. + + use_tanh (bool): if True, use a tanh-Gaussian distribution + + goal_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for goal observations. + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-modality information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + + # parameters specific to Gaussian actor + self.fixed_std = fixed_std + self.init_std = init_std + self.mean_limits = np.array(mean_limits) + self.std_limits = np.array(std_limits) + + # Define activations to use + def softplus_scaled(x): + out = F.softplus(x) + out = out * (self.init_std / F.softplus(torch.zeros(1).to(x.device))) + return out + + self.activations = { + None: lambda x: x, + "softplus": softplus_scaled, + "exp": torch.exp, + } + assert std_activation in self.activations, \ + "std_activation must be one of: {}; instead got: {}".format(self.activations.keys(), std_activation) + self.std_activation = std_activation if not self.fixed_std else None + + self.low_noise_eval = low_noise_eval + self.use_tanh = use_tanh + + super(GaussianActorNetwork, self).__init__( + obs_shapes=obs_shapes, + ac_dim=ac_dim, + mlp_layer_dims=mlp_layer_dims, + goal_shapes=goal_shapes, + encoder_kwargs=encoder_kwargs, + ) + + # If initialization weight was specified, make sure all final layer network weights are specified correctly + if init_last_fc_weight is not None: + with torch.no_grad(): + for name, layer in self.nets["decoder"].nets.items(): + torch.nn.init.uniform_(layer.weight, -init_last_fc_weight, init_last_fc_weight) + torch.nn.init.uniform_(layer.bias, -init_last_fc_weight, init_last_fc_weight) + + def _get_output_shapes(self): + """ + Tells @MIMO_MLP superclass about the output dictionary that should be generated + at the last layer. Network outputs parameters of Gaussian distribution. + """ + return OrderedDict( + mean=(self.ac_dim,), + scale=(self.ac_dim,), + ) + + def forward_train(self, obs_dict, goal_dict=None): + """ + Return full Gaussian distribution, which is useful for computing + quantities necessary at train-time, like log-likelihood, KL + divergence, etc. + + Args: + obs_dict (dict): batch of observations + goal_dict (dict): if not None, batch of goal observations + + Returns: + dist (Distribution): Gaussian distribution + """ + out = MIMO_MLP.forward(self, obs=obs_dict, goal=goal_dict) + mean = out["mean"] + # Use either constant std or learned std depending on setting + scale = out["scale"] if not self.fixed_std else torch.ones_like(mean) * self.init_std + + # Clamp the mean + mean = torch.clamp(mean, min=self.mean_limits[0], max=self.mean_limits[1]) + + # apply tanh squashing to mean if not using tanh-Gaussian to ensure mean is in [-1, 1] + if not self.use_tanh: + mean = torch.tanh(mean) + + # Calculate scale + if self.low_noise_eval and (not self.training): + # override std value so that you always approximately sample the mean + scale = torch.ones_like(mean) * 1e-4 + else: + # Post-process the scale accordingly + scale = self.activations[self.std_activation](scale) + # Clamp the scale + scale = torch.clamp(scale, min=self.std_limits[0], max=self.std_limits[1]) + + + # the Independent call will make it so that `batch_shape` for dist will be equal to batch size + # while `event_shape` will be equal to action dimension - ensuring that log-probability + # computations are summed across the action dimension + dist = D.Normal(loc=mean, scale=scale) + dist = D.Independent(dist, 1) + + if self.use_tanh: + # Wrap distribution with Tanh + dist = TanhWrappedDistribution(base_dist=dist, scale=1.) + + return dist + + def forward(self, obs_dict, goal_dict=None): + """ + Samples actions from the policy distribution. + + Args: + obs_dict (dict): batch of observations + goal_dict (dict): if not None, batch of goal observations + + Returns: + action (torch.Tensor): batch of actions from policy distribution + """ + dist = self.forward_train(obs_dict, goal_dict) + if self.low_noise_eval and (not self.training): + if self.use_tanh: + # # scaling factor lets us output actions like [-1. 1.] and is consistent with the distribution transform + # return (1. + 1e-6) * torch.tanh(dist.base_dist.mean) + return torch.tanh(dist.mean) + return dist.mean + return dist.sample() + + def _to_string(self): + """Info to pretty print.""" + msg = "action_dim={}\nfixed_std={}\nstd_activation={}\ninit_std={}\nmean_limits={}\nstd_limits={}\nlow_noise_eval={}".format( + self.ac_dim, self.fixed_std, self.std_activation, self.init_std, self.mean_limits, self.std_limits, self.low_noise_eval) + return msg + + +class GMMActorNetwork(ActorNetwork): + """ + Variant of actor network that learns a multimodal Gaussian mixture distribution + over actions. + """ + def __init__( + self, + obs_shapes, + ac_dim, + mlp_layer_dims, + num_modes=5, + min_std=0.01, + std_activation="softplus", + low_noise_eval=True, + use_tanh=False, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + obs_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for observations. + + ac_dim (int): dimension of action space. + + mlp_layer_dims ([int]): sequence of integers for the MLP hidden layers sizes. + + num_modes (int): number of GMM modes + + min_std (float): minimum std output from network + + std_activation (None or str): type of activation to use for std deviation. Options are: + + `'softplus'`: Softplus activation applied + + `'exp'`: Exp applied; this corresponds to network output being interpreted as log_std instead of std + + low_noise_eval (float): if True, model will sample from GMM with low std, so that + one of the GMM modes will be sampled (approximately) + + use_tanh (bool): if True, use a tanh-Gaussian distribution + + goal_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for goal observations. + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-modality information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + + # parameters specific to GMM actor + self.num_modes = num_modes + self.min_std = min_std + self.low_noise_eval = low_noise_eval + self.use_tanh = use_tanh + + # Define activations to use + self.activations = { + "softplus": F.softplus, + "exp": torch.exp, + } + assert std_activation in self.activations, \ + "std_activation must be one of: {}; instead got: {}".format(self.activations.keys(), std_activation) + self.std_activation = std_activation + + super(GMMActorNetwork, self).__init__( + obs_shapes=obs_shapes, + ac_dim=ac_dim, + mlp_layer_dims=mlp_layer_dims, + goal_shapes=goal_shapes, + encoder_kwargs=encoder_kwargs, + ) + + def _get_output_shapes(self): + """ + Tells @MIMO_MLP superclass about the output dictionary that should be generated + at the last layer. Network outputs parameters of GMM distribution. + """ + return OrderedDict( + mean=(self.num_modes, self.ac_dim), + scale=(self.num_modes, self.ac_dim), + logits=(self.num_modes,), + ) + + def forward_train(self, obs_dict, goal_dict=None): + """ + Return full GMM distribution, which is useful for computing + quantities necessary at train-time, like log-likelihood, KL + divergence, etc. + + Args: + obs_dict (dict): batch of observations + goal_dict (dict): if not None, batch of goal observations + + Returns: + dist (Distribution): GMM distribution + """ + out = MIMO_MLP.forward(self, obs=obs_dict, goal=goal_dict) + means = out["mean"] + scales = out["scale"] + logits = out["logits"] + + # apply tanh squashing to means if not using tanh-GMM to ensure means are in [-1, 1] + if not self.use_tanh: + means = torch.tanh(means) + + # Calculate scale + if self.low_noise_eval and (not self.training): + # low-noise for all Gaussian dists + scales = torch.ones_like(means) * 1e-4 + else: + # post-process the scale accordingly + scales = self.activations[self.std_activation](scales) + self.min_std + + # mixture components - make sure that `batch_shape` for the distribution is equal + # to (batch_size, num_modes) since MixtureSameFamily expects this shape + component_distribution = D.Normal(loc=means, scale=scales) + component_distribution = D.Independent(component_distribution, 1) + + # unnormalized logits to categorical distribution for mixing the modes + mixture_distribution = D.Categorical(logits=logits) + + dist = D.MixtureSameFamily( + mixture_distribution=mixture_distribution, + component_distribution=component_distribution, + ) + + if self.use_tanh: + # Wrap distribution with Tanh + dist = TanhWrappedDistribution(base_dist=dist, scale=1.) + + return dist + + def forward(self, obs_dict, goal_dict=None): + """ + Samples actions from the policy distribution. + + Args: + obs_dict (dict): batch of observations + goal_dict (dict): if not None, batch of goal observations + + Returns: + action (torch.Tensor): batch of actions from policy distribution + """ + dist = self.forward_train(obs_dict, goal_dict) + return dist.sample() + + def _to_string(self): + """Info to pretty print.""" + return "action_dim={}\nnum_modes={}\nmin_std={}\nstd_activation={}\nlow_noise_eval={}".format( + self.ac_dim, self.num_modes, self.min_std, self.std_activation, self.low_noise_eval) + + +class RNNActorNetwork(RNN_MIMO_MLP): + """ + An RNN policy network that predicts actions from observations. + """ + def __init__( + self, + obs_shapes, + ac_dim, + mlp_layer_dims, + rnn_hidden_dim, + rnn_num_layers, + rnn_type="LSTM", # [LSTM, GRU] + rnn_kwargs=None, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + obs_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for observations. + + ac_dim (int): dimension of action space. + + mlp_layer_dims ([int]): sequence of integers for the MLP hidden layers sizes. + + rnn_hidden_dim (int): RNN hidden dimension + + rnn_num_layers (int): number of RNN layers + + rnn_type (str): [LSTM, GRU] + + rnn_kwargs (dict): kwargs for the torch.nn.LSTM / GRU + + goal_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for goal observations. + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-modality information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + self.ac_dim = ac_dim + + assert isinstance(obs_shapes, OrderedDict) + self.obs_shapes = obs_shapes + + # set up different observation groups for @RNN_MIMO_MLP + observation_group_shapes = OrderedDict() + observation_group_shapes["obs"] = OrderedDict(self.obs_shapes) + + self._is_goal_conditioned = False + if goal_shapes is not None and len(goal_shapes) > 0: + assert isinstance(goal_shapes, OrderedDict) + self._is_goal_conditioned = True + self.goal_shapes = OrderedDict(goal_shapes) + observation_group_shapes["goal"] = OrderedDict(self.goal_shapes) + else: + self.goal_shapes = OrderedDict() + + output_shapes = self._get_output_shapes() + super(RNNActorNetwork, self).__init__( + input_obs_group_shapes=observation_group_shapes, + output_shapes=output_shapes, + mlp_layer_dims=mlp_layer_dims, + mlp_activation=nn.ReLU, + mlp_layer_func=nn.Linear, + rnn_hidden_dim=rnn_hidden_dim, + rnn_num_layers=rnn_num_layers, + rnn_type=rnn_type, + rnn_kwargs=rnn_kwargs, + per_step=True, + encoder_kwargs=encoder_kwargs, + ) + + def _get_output_shapes(self): + """ + Allow subclasses to re-define outputs from @RNN_MIMO_MLP, since we won't + always directly predict actions, but may instead predict the parameters + of a action distribution. + """ + return OrderedDict(action=(self.ac_dim,)) + + def output_shape(self, input_shape): + # note: @input_shape should be dictionary (key: mod) + # infers temporal dimension from input shape + mod = list(self.obs_shapes.keys())[0] + T = input_shape[mod][0] + TensorUtils.assert_size_at_dim(input_shape, size=T, dim=0, + msg="RNNActorNetwork: input_shape inconsistent in temporal dimension") + return [T, self.ac_dim] + + def forward(self, obs_dict, goal_dict=None, rnn_init_state=None, return_state=False): + """ + Forward a sequence of inputs through the RNN and the per-step network. + + Args: + obs_dict (dict): batch of observations - each tensor in the dictionary + should have leading dimensions batch and time [B, T, ...] + goal_dict (dict): if not None, batch of goal observations + rnn_init_state: rnn hidden state, initialize to zero state if set to None + return_state (bool): whether to return hidden state + + Returns: + actions (torch.Tensor): predicted action sequence + rnn_state: return rnn state at the end if return_state is set to True + """ + if self._is_goal_conditioned: + assert goal_dict is not None + # repeat the goal observation in time to match dimension with obs_dict + mod = list(obs_dict.keys())[0] + goal_dict = TensorUtils.unsqueeze_expand_at(goal_dict, size=obs_dict[mod].shape[1], dim=1) + + outputs = super(RNNActorNetwork, self).forward( + obs=obs_dict, goal=goal_dict, rnn_init_state=rnn_init_state, return_state=return_state) + + if return_state: + actions, state = outputs + else: + actions = outputs + state = None + + # apply tanh squashing to ensure actions are in [-1, 1] + actions = torch.tanh(actions["action"]) + + if return_state: + return actions, state + else: + return actions + + def forward_step(self, obs_dict, goal_dict=None, rnn_state=None): + """ + Unroll RNN over single timestep to get actions. + + Args: + obs_dict (dict): batch of observations. Should not contain + time dimension. + goal_dict (dict): if not None, batch of goal observations + rnn_state: rnn hidden state, initialize to zero state if set to None + + Returns: + actions (torch.Tensor): batch of actions - does not contain time dimension + state: updated rnn state + """ + obs_dict = TensorUtils.to_sequence(obs_dict) + action, state = self.forward( + obs_dict, goal_dict, rnn_init_state=rnn_state, return_state=True) + return action[:, 0], state + + def _to_string(self): + """Info to pretty print.""" + return "action_dim={}".format(self.ac_dim) + + +class RNNGMMActorNetwork(RNNActorNetwork): + """ + An RNN GMM policy network that predicts sequences of action distributions from observation sequences. + """ + def __init__( + self, + obs_shapes, + ac_dim, + mlp_layer_dims, + rnn_hidden_dim, + rnn_num_layers, + rnn_type="LSTM", # [LSTM, GRU] + rnn_kwargs=None, + num_modes=5, + min_std=0.01, + std_activation="softplus", + low_noise_eval=True, + use_tanh=False, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + + rnn_hidden_dim (int): RNN hidden dimension + + rnn_num_layers (int): number of RNN layers + + rnn_type (str): [LSTM, GRU] + + rnn_kwargs (dict): kwargs for the torch.nn.LSTM / GRU + + num_modes (int): number of GMM modes + + min_std (float): minimum std output from network + + std_activation (None or str): type of activation to use for std deviation. Options are: + + `'softplus'`: Softplus activation applied + + `'exp'`: Exp applied; this corresponds to network output being interpreted as log_std instead of std + + low_noise_eval (float): if True, model will sample from GMM with low std, so that + one of the GMM modes will be sampled (approximately) + + use_tanh (bool): if True, use a tanh-Gaussian distribution + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-modality information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + + # parameters specific to GMM actor + self.num_modes = num_modes + self.min_std = min_std + self.low_noise_eval = low_noise_eval + self.use_tanh = use_tanh + + # Define activations to use + self.activations = { + "softplus": F.softplus, + "exp": torch.exp, + } + assert std_activation in self.activations, \ + "std_activation must be one of: {}; instead got: {}".format(self.activations.keys(), std_activation) + self.std_activation = std_activation + + super(RNNGMMActorNetwork, self).__init__( + obs_shapes=obs_shapes, + ac_dim=ac_dim, + mlp_layer_dims=mlp_layer_dims, + rnn_hidden_dim=rnn_hidden_dim, + rnn_num_layers=rnn_num_layers, + rnn_type=rnn_type, + rnn_kwargs=rnn_kwargs, + goal_shapes=goal_shapes, + encoder_kwargs=encoder_kwargs, + ) + + def _get_output_shapes(self): + """ + Tells @MIMO_MLP superclass about the output dictionary that should be generated + at the last layer. Network outputs parameters of GMM distribution. + """ + return OrderedDict( + mean=(self.num_modes, self.ac_dim), + scale=(self.num_modes, self.ac_dim), + logits=(self.num_modes,), + ) + + def forward_train(self, obs_dict, goal_dict=None, rnn_init_state=None, return_state=False): + """ + Return full GMM distribution, which is useful for computing + quantities necessary at train-time, like log-likelihood, KL + divergence, etc. + + Args: + obs_dict (dict): batch of observations + goal_dict (dict): if not None, batch of goal observations + rnn_init_state: rnn hidden state, initialize to zero state if set to None + return_state (bool): whether to return hidden state + + Returns: + dists (Distribution): sequence of GMM distributions over the timesteps + rnn_state: return rnn state at the end if return_state is set to True + """ + if self._is_goal_conditioned: + assert goal_dict is not None + # repeat the goal observation in time to match dimension with obs_dict + mod = list(obs_dict.keys())[0] + goal_dict = TensorUtils.unsqueeze_expand_at(goal_dict, size=obs_dict[mod].shape[1], dim=1) + + outputs = RNN_MIMO_MLP.forward( + self, obs=obs_dict, goal=goal_dict, rnn_init_state=rnn_init_state, return_state=return_state) + + if return_state: + outputs, state = outputs + else: + state = None + + means = outputs["mean"] + scales = outputs["scale"] + logits = outputs["logits"] + + # apply tanh squashing to mean if not using tanh-GMM to ensure means are in [-1, 1] + if not self.use_tanh: + means = torch.tanh(means) + + if self.low_noise_eval and (not self.training): + # low-noise for all Gaussian dists + scales = torch.ones_like(means) * 1e-4 + else: + # post-process the scale accordingly + scales = self.activations[self.std_activation](scales) + self.min_std + + # mixture components - make sure that `batch_shape` for the distribution is equal + # to (batch_size, timesteps, num_modes) since MixtureSameFamily expects this shape + component_distribution = D.Normal(loc=means, scale=scales) + component_distribution = D.Independent(component_distribution, 1) # shift action dim to event shape + + # unnormalized logits to categorical distribution for mixing the modes + mixture_distribution = D.Categorical(logits=logits) + + dists = D.MixtureSameFamily( + mixture_distribution=mixture_distribution, + component_distribution=component_distribution, + ) + + if self.use_tanh: + # Wrap distribution with Tanh + dists = TanhWrappedDistribution(base_dist=dists, scale=1.) + + if return_state: + return dists, state + else: + return dists + + def forward(self, obs_dict, goal_dict=None, rnn_init_state=None, return_state=False): + """ + Samples actions from the policy distribution. + + Args: + obs_dict (dict): batch of observations + goal_dict (dict): if not None, batch of goal observations + + Returns: + action (torch.Tensor): batch of actions from policy distribution + """ + out = self.forward_train(obs_dict=obs_dict, goal_dict=goal_dict, rnn_init_state=rnn_init_state, return_state=return_state) + if return_state: + ad, state = out + return ad.sample(), state + return out.sample() + + def forward_train_step(self, obs_dict, goal_dict=None, rnn_state=None): + """ + Unroll RNN over single timestep to get action GMM distribution, which + is useful for computing quantities necessary at train-time, like + log-likelihood, KL divergence, etc. + + Args: + obs_dict (dict): batch of observations. Should not contain + time dimension. + goal_dict (dict): if not None, batch of goal observations + rnn_state: rnn hidden state, initialize to zero state if set to None + + Returns: + ad (Distribution): GMM action distributions + state: updated rnn state + """ + obs_dict = TensorUtils.to_sequence(obs_dict) + ad, state = self.forward_train( + obs_dict, goal_dict, rnn_init_state=rnn_state, return_state=True) + + # to squeeze time dimension, make another action distribution + assert ad.component_distribution.base_dist.loc.shape[1] == 1 + assert ad.component_distribution.base_dist.scale.shape[1] == 1 + assert ad.mixture_distribution.logits.shape[1] == 1 + component_distribution = D.Normal( + loc=ad.component_distribution.base_dist.loc.squeeze(1), + scale=ad.component_distribution.base_dist.scale.squeeze(1), + ) + component_distribution = D.Independent(component_distribution, 1) + mixture_distribution = D.Categorical(logits=ad.mixture_distribution.logits.squeeze(1)) + ad = D.MixtureSameFamily( + mixture_distribution=mixture_distribution, + component_distribution=component_distribution, + ) + return ad, state + + def forward_step(self, obs_dict, goal_dict=None, rnn_state=None): + """ + Unroll RNN over single timestep to get sampled actions. + + Args: + obs_dict (dict): batch of observations. Should not contain + time dimension. + goal_dict (dict): if not None, batch of goal observations + rnn_state: rnn hidden state, initialize to zero state if set to None + + Returns: + acts (torch.Tensor): batch of actions - does not contain time dimension + state: updated rnn state + """ + obs_dict = TensorUtils.to_sequence(obs_dict) + acts, state = self.forward( + obs_dict, goal_dict, rnn_init_state=rnn_state, return_state=True) + assert acts.shape[1] == 1 + return acts[:, 0], state + + def _to_string(self): + """Info to pretty print.""" + msg = "action_dim={}, std_activation={}, low_noise_eval={}, num_nodes={}, min_std={}".format( + self.ac_dim, self.std_activation, self.low_noise_eval, self.num_modes, self.min_std) + return msg + + +class TransformerActorNetwork(MIMO_Transformer): + """ + An Transformer policy network that predicts actions from observation sequences (assumed to be frame stacked + from previous observations) and possible from previous actions as well (in an autoregressive manner). + """ + def __init__( + self, + obs_shapes, + ac_dim, + transformer_embed_dim, + transformer_num_layers, + transformer_num_heads, + transformer_context_length, + transformer_emb_dropout=0.1, + transformer_attn_dropout=0.1, + transformer_block_output_dropout=0.1, + transformer_sinusoidal_embedding=False, + transformer_activation="gelu", + transformer_nn_parameter_for_timesteps=False, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + + obs_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for observations. + + ac_dim (int): dimension of action space. + + transformer_embed_dim (int): dimension for embeddings used by transformer + + transformer_num_layers (int): number of transformer blocks to stack + + transformer_num_heads (int): number of attention heads for each + transformer block - must divide @transformer_embed_dim evenly. Self-attention is + computed over this many partitions of the embedding dimension separately. + + transformer_context_length (int): expected length of input sequences + + transformer_embedding_dropout (float): dropout probability for embedding inputs in transformer + + transformer_attn_dropout (float): dropout probability for attention outputs for each transformer block + + transformer_block_output_dropout (float): dropout probability for final outputs for each transformer block + + goal_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for goal observations. + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-modality information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + self.ac_dim = ac_dim + + assert isinstance(obs_shapes, OrderedDict) + self.obs_shapes = obs_shapes + + self.transformer_nn_parameter_for_timesteps = transformer_nn_parameter_for_timesteps + + # set up different observation groups for @RNN_MIMO_MLP + observation_group_shapes = OrderedDict() + observation_group_shapes["obs"] = OrderedDict(self.obs_shapes) + + self._is_goal_conditioned = False + if goal_shapes is not None and len(goal_shapes) > 0: + assert isinstance(goal_shapes, OrderedDict) + self._is_goal_conditioned = True + self.goal_shapes = OrderedDict(goal_shapes) + observation_group_shapes["goal"] = OrderedDict(self.goal_shapes) + else: + self.goal_shapes = OrderedDict() + + output_shapes = self._get_output_shapes() + super(TransformerActorNetwork, self).__init__( + input_obs_group_shapes=observation_group_shapes, + output_shapes=output_shapes, + transformer_embed_dim=transformer_embed_dim, + transformer_num_layers=transformer_num_layers, + transformer_num_heads=transformer_num_heads, + transformer_context_length=transformer_context_length, + transformer_emb_dropout=transformer_emb_dropout, + transformer_attn_dropout=transformer_attn_dropout, + transformer_block_output_dropout=transformer_block_output_dropout, + transformer_sinusoidal_embedding=transformer_sinusoidal_embedding, + transformer_activation=transformer_activation, + transformer_nn_parameter_for_timesteps=transformer_nn_parameter_for_timesteps, + + encoder_kwargs=encoder_kwargs, + ) + + def _get_output_shapes(self): + """ + Allow subclasses to re-define outputs from @MIMO_Transformer, since we won't + always directly predict actions, but may instead predict the parameters + of a action distribution. + """ + output_shapes = OrderedDict(action=(self.ac_dim,)) + return output_shapes + + def output_shape(self, input_shape): + # note: @input_shape should be dictionary (key: mod) + # infers temporal dimension from input shape + mod = list(self.obs_shapes.keys())[0] + T = input_shape[mod][0] + TensorUtils.assert_size_at_dim(input_shape, size=T, dim=0, + msg="TransformerActorNetwork: input_shape inconsistent in temporal dimension") + return [T, self.ac_dim] + + def forward(self, obs_dict, actions=None, goal_dict=None): + """ + Forward a sequence of inputs through the Transformer. + Args: + obs_dict (dict): batch of observations - each tensor in the dictionary + should have leading dimensions batch and time [B, T, ...] + actions (torch.Tensor): batch of actions of shape [B, T, D] + goal_dict (dict): if not None, batch of goal observations + Returns: + outputs (torch.Tensor or dict): contains predicted action sequence, or dictionary + with predicted action sequence and predicted observation sequences + """ + if self._is_goal_conditioned: + assert goal_dict is not None + # repeat the goal observation in time to match dimension with obs_dict + mod = list(obs_dict.keys())[0] + goal_dict = TensorUtils.unsqueeze_expand_at(goal_dict, size=obs_dict[mod].shape[1], dim=1) + + forward_kwargs = dict(obs=obs_dict, goal=goal_dict) + outputs = super(TransformerActorNetwork, self).forward(**forward_kwargs) + + # apply tanh squashing to ensure actions are in [-1, 1] + outputs["action"] = torch.tanh(outputs["action"]) + + return outputs["action"] # only action sequences + + def _to_string(self): + """Info to pretty print.""" + return "action_dim={}".format(self.ac_dim) + + +class TransformerGMMActorNetwork(TransformerActorNetwork): + """ + A Transformer GMM policy network that predicts sequences of action distributions from observation + sequences (assumed to be frame stacked from previous observations). + """ + def __init__( + self, + obs_shapes, + ac_dim, + transformer_embed_dim, + transformer_num_layers, + transformer_num_heads, + transformer_context_length, + transformer_emb_dropout=0.1, + transformer_attn_dropout=0.1, + transformer_block_output_dropout=0.1, + transformer_sinusoidal_embedding=False, + transformer_activation="gelu", + transformer_nn_parameter_for_timesteps=False, + num_modes=5, + min_std=0.01, + std_activation="softplus", + low_noise_eval=True, + use_tanh=False, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + + obs_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for observations. + + ac_dim (int): dimension of action space. + + transformer_embed_dim (int): dimension for embeddings used by transformer + + transformer_num_layers (int): number of transformer blocks to stack + + transformer_num_heads (int): number of attention heads for each + transformer block - must divide @transformer_embed_dim evenly. Self-attention is + computed over this many partitions of the embedding dimension separately. + + transformer_context_length (int): expected length of input sequences + + transformer_embedding_dropout (float): dropout probability for embedding inputs in transformer + + transformer_attn_dropout (float): dropout probability for attention outputs for each transformer block + + transformer_block_output_dropout (float): dropout probability for final outputs for each transformer block + + num_modes (int): number of GMM modes + + min_std (float): minimum std output from network + + std_activation (None or str): type of activation to use for std deviation. Options are: + + `'softplus'`: Softplus activation applied + + `'exp'`: Exp applied; this corresponds to network output being interpreted as log_std instead of std + + low_noise_eval (float): if True, model will sample from GMM with low std, so that + one of the GMM modes will be sampled (approximately) + + use_tanh (bool): if True, use a tanh-Gaussian distribution + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-modality information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + + # parameters specific to GMM actor + self.num_modes = num_modes + self.min_std = min_std + self.low_noise_eval = low_noise_eval + self.use_tanh = use_tanh + + # Define activations to use + self.activations = { + "softplus": F.softplus, + "exp": torch.exp, + } + assert std_activation in self.activations, \ + "std_activation must be one of: {}; instead got: {}".format(self.activations.keys(), std_activation) + self.std_activation = std_activation + + super(TransformerGMMActorNetwork, self).__init__( + obs_shapes=obs_shapes, + ac_dim=ac_dim, + transformer_embed_dim=transformer_embed_dim, + transformer_num_layers=transformer_num_layers, + transformer_num_heads=transformer_num_heads, + transformer_context_length=transformer_context_length, + transformer_emb_dropout=transformer_emb_dropout, + transformer_attn_dropout=transformer_attn_dropout, + transformer_block_output_dropout=transformer_block_output_dropout, + transformer_sinusoidal_embedding=transformer_sinusoidal_embedding, + transformer_activation=transformer_activation, + transformer_nn_parameter_for_timesteps=transformer_nn_parameter_for_timesteps, + encoder_kwargs=encoder_kwargs, + goal_shapes=goal_shapes, + ) + + def _get_output_shapes(self): + """ + Tells @MIMO_Transformer superclass about the output dictionary that should be generated + at the last layer. Network outputs parameters of GMM distribution. + """ + return OrderedDict( + mean=(self.num_modes, self.ac_dim), + scale=(self.num_modes, self.ac_dim), + logits=(self.num_modes,), + ) + + def forward_train(self, obs_dict, actions=None, goal_dict=None, low_noise_eval=None): + """ + Return full GMM distribution, which is useful for computing + quantities necessary at train-time, like log-likelihood, KL + divergence, etc. + Args: + obs_dict (dict): batch of observations + actions (torch.Tensor): batch of actions + goal_dict (dict): if not None, batch of goal observations + Returns: + dists (Distribution): sequence of GMM distributions over the timesteps + """ + if self._is_goal_conditioned: + assert goal_dict is not None + # repeat the goal observation in time to match dimension with obs_dict + mod = list(obs_dict.keys())[0] + goal_dict = TensorUtils.unsqueeze_expand_at(goal_dict, size=obs_dict[mod].shape[1], dim=1) + + forward_kwargs = dict(obs=obs_dict, goal=goal_dict) + + outputs = MIMO_Transformer.forward(self, **forward_kwargs) + + means = outputs["mean"] + scales = outputs["scale"] + logits = outputs["logits"] + + # apply tanh squashing to mean if not using tanh-GMM to ensure means are in [-1, 1] + if not self.use_tanh: + means = torch.tanh(means) + + if low_noise_eval is None: + low_noise_eval = self.low_noise_eval + if low_noise_eval and (not self.training): + # low-noise for all Gaussian dists + scales = torch.ones_like(means) * 1e-4 + else: + # post-process the scale accordingly + scales = self.activations[self.std_activation](scales) + self.min_std + + # mixture components - make sure that `batch_shape` for the distribution is equal + # to (batch_size, timesteps, num_modes) since MixtureSameFamily expects this shape + component_distribution = D.Normal(loc=means, scale=scales) + component_distribution = D.Independent(component_distribution, 1) # shift action dim to event shape + + # unnormalized logits to categorical distribution for mixing the modes + mixture_distribution = D.Categorical(logits=logits) + + dists = D.MixtureSameFamily( + mixture_distribution=mixture_distribution, + component_distribution=component_distribution, + ) + + if self.use_tanh: + # Wrap distribution with Tanh + dists = TanhWrappedDistribution(base_dist=dists, scale=1.) + + return dists + + def forward(self, obs_dict, actions=None, goal_dict=None): + """ + Samples actions from the policy distribution. + Args: + obs_dict (dict): batch of observations + actions (torch.Tensor): batch of actions + goal_dict (dict): if not None, batch of goal observations + Returns: + action (torch.Tensor): batch of actions from policy distribution + """ + out = self.forward_train(obs_dict=obs_dict, actions=actions, goal_dict=goal_dict) + return out.sample() + + def _to_string(self): + """Info to pretty print.""" + msg = "action_dim={}, std_activation={}, low_noise_eval={}, num_nodes={}, min_std={}".format( + self.ac_dim, self.std_activation, self.low_noise_eval, self.num_modes, self.min_std) + return msg + + +class VAEActor(Module): + """ + A VAE that models a distribution of actions conditioned on observations. + The VAE prior and decoder are used at test-time as the policy. + """ + def __init__( + self, + obs_shapes, + ac_dim, + encoder_layer_dims, + decoder_layer_dims, + latent_dim, + device, + decoder_is_conditioned=True, + decoder_reconstruction_sum_across_elements=False, + latent_clip=None, + prior_learn=False, + prior_is_conditioned=False, + prior_layer_dims=(), + prior_use_gmm=False, + prior_gmm_num_modes=10, + prior_gmm_learn_weights=False, + prior_use_categorical=False, + prior_categorical_dim=10, + prior_categorical_gumbel_softmax_hard=False, + goal_shapes=None, + encoder_kwargs=None, + ): + """ + Args: + obs_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for observations. + + ac_dim (int): dimension of action space. + + goal_shapes (OrderedDict): a dictionary that maps modality to + expected shapes for goal observations. + + encoder_kwargs (dict or None): If None, results in default encoder_kwargs being applied. Otherwise, should + be nested dictionary containing relevant per-modality information for encoder networks. + Should be of form: + + obs_modality1: dict + feature_dimension: int + core_class: str + core_kwargs: dict + ... + ... + obs_randomizer_class: str + obs_randomizer_kwargs: dict + ... + ... + obs_modality2: dict + ... + """ + super(VAEActor, self).__init__() + + self.obs_shapes = obs_shapes + self.ac_dim = ac_dim + action_shapes = OrderedDict(action=(self.ac_dim,)) + + # ensure VAE decoder will squash actions into [-1, 1] + output_squash = ['action'] + output_scales = OrderedDict(action=1.) + + self._vae = VAE( + input_shapes=action_shapes, + output_shapes=action_shapes, + encoder_layer_dims=encoder_layer_dims, + decoder_layer_dims=decoder_layer_dims, + latent_dim=latent_dim, + device=device, + condition_shapes=self.obs_shapes, + decoder_is_conditioned=decoder_is_conditioned, + decoder_reconstruction_sum_across_elements=decoder_reconstruction_sum_across_elements, + latent_clip=latent_clip, + output_squash=output_squash, + output_scales=output_scales, + prior_learn=prior_learn, + prior_is_conditioned=prior_is_conditioned, + prior_layer_dims=prior_layer_dims, + prior_use_gmm=prior_use_gmm, + prior_gmm_num_modes=prior_gmm_num_modes, + prior_gmm_learn_weights=prior_gmm_learn_weights, + prior_use_categorical=prior_use_categorical, + prior_categorical_dim=prior_categorical_dim, + prior_categorical_gumbel_softmax_hard=prior_categorical_gumbel_softmax_hard, + goal_shapes=goal_shapes, + encoder_kwargs=encoder_kwargs, + ) + + def encode(self, actions, obs_dict, goal_dict=None): + """ + Args: + actions (torch.Tensor): a batch of actions + + obs_dict (dict): a dictionary that maps modalities to torch.Tensor + batches. These should correspond to the observation modalities + used for conditioning in either the decoder or the prior (or both). + + goal_dict (dict): a dictionary that maps modalities to torch.Tensor + batches. These should correspond to goal modalities. + + Returns: + posterior params (dict): dictionary with the following keys: + + mean (torch.Tensor): posterior encoder means + + logvar (torch.Tensor): posterior encoder logvars + """ + inputs = OrderedDict(action=actions) + return self._vae.encode(inputs=inputs, conditions=obs_dict, goals=goal_dict) + + def decode(self, obs_dict=None, goal_dict=None, z=None, n=None): + """ + Thin wrapper around @VaeNets.VAE implementation. + + Args: + obs_dict (dict): a dictionary that maps modalities to torch.Tensor + batches. Only needs to be provided if @decoder_is_conditioned + or @z is None (since the prior will require it to generate z). + + goal_dict (dict): a dictionary that maps modalities to torch.Tensor + batches. These should correspond to goal modalities. + + z (torch.Tensor): if provided, these latents are used to generate + reconstructions from the VAE, and the prior is not sampled. + + n (int): this argument is used to specify the number of samples to + generate from the prior. Only required if @z is None - i.e. + sampling takes place + + Returns: + recons (dict): dictionary of reconstructed inputs (this will be a dictionary + with a single "action" key) + """ + return self._vae.decode(conditions=obs_dict, goals=goal_dict, z=z, n=n) + + def sample_prior(self, obs_dict=None, goal_dict=None, n=None): + """ + Thin wrapper around @VaeNets.VAE implementation. + + Args: + n (int): this argument is used to specify the number + of samples to generate from the prior. + + obs_dict (dict): a dictionary that maps modalities to torch.Tensor + batches. Only needs to be provided if @prior_is_conditioned. + + goal_dict (dict): a dictionary that maps modalities to torch.Tensor + batches. These should correspond to goal modalities. + + Returns: + z (torch.Tensor): latents sampled from the prior + """ + return self._vae.sample_prior(n=n, conditions=obs_dict, goals=goal_dict) + + def set_gumbel_temperature(self, temperature): + """ + Used by external algorithms to schedule Gumbel-Softmax temperature, + which is used during reparametrization at train-time. Should only be + used if @prior_use_categorical is True. + """ + self._vae.set_gumbel_temperature(temperature) + + def get_gumbel_temperature(self): + """ + Return current Gumbel-Softmax temperature. Should only be used if + @prior_use_categorical is True. + """ + return self._vae.get_gumbel_temperature() + + def output_shape(self, input_shape=None): + """ + This implementation is required by the Module superclass, but is unused since we + never chain this module to other ones. + """ + return [self.ac_dim] + + def forward_train(self, actions, obs_dict, goal_dict=None, freeze_encoder=False): + """ + A full pass through the VAE network used during training to construct KL + and reconstruction losses. See @VAE class for more info. + + Args: + actions (torch.Tensor): a batch of actions + + obs_dict (dict): a dictionary that maps modalities to torch.Tensor + batches. These should correspond to the observation modalities + used for conditioning in either the decoder or the prior (or both). + + goal_dict (dict): a dictionary that maps modalities to torch.Tensor + batches. These should correspond to goal modalities. + + Returns: + vae_outputs (dict): a dictionary that contains the following outputs. + + encoder_params (dict): parameters for the posterior distribution + from the encoder forward pass + + encoder_z (torch.Tensor): latents sampled from the encoder posterior + + decoder_outputs (dict): action reconstructions from the decoder + + kl_loss (torch.Tensor): KL loss over the batch of data + + reconstruction_loss (torch.Tensor): reconstruction loss over the batch of data + """ + action_inputs = OrderedDict(action=actions) + return self._vae.forward( + inputs=action_inputs, + outputs=action_inputs, + conditions=obs_dict, + goals=goal_dict, + freeze_encoder=freeze_encoder) + + def forward(self, obs_dict, goal_dict=None, z=None): + """ + Samples actions from the policy distribution. + + Args: + obs_dict (dict): batch of observations + goal_dict (dict): if not None, batch of goal observations + z (torch.Tensor): if not None, use the provided batch of latents instead + of sampling from the prior + + Returns: + action (torch.Tensor): batch of actions from policy distribution + """ + n = None + if z is None: + # prior will be sampled - so we must provide number of samples explicitly + mod = list(obs_dict.keys())[0] + n = obs_dict[mod].shape[0] + return self.decode(obs_dict=obs_dict, goal_dict=goal_dict, z=z, n=n)["action"] diff --git a/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924112632/config.json b/docs/training_runs/Dev-IK-Rel-v0/model0/bc_new_demos/20250925163039/config.json similarity index 97% rename from docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924112632/config.json rename to docs/training_runs/Dev-IK-Rel-v0/model0/bc_new_demos/20250925163039/config.json index a6b76e34fba4..6ec2c3912eed 100644 --- a/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924112632/config.json +++ b/docs/training_runs/Dev-IK-Rel-v0/model0/bc_new_demos/20250925163039/config.json @@ -36,8 +36,8 @@ } }, "train": { - "data": "docs/beaker_lift_new_start_skillgen_generated_split_normalized.hdf5", - "output_dir": "/workspace/isaaclab/logs/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model14/", + "data": "docs/beaker_lift_new_start_skillgen_generated_split.hdf5", + "output_dir": "/docs/robomimic/Dev-IK-Rel-v0/model14/", "num_data_workers": 1, "hdf5_cache_mode": "low_dim", "hdf5_use_swmr": true, diff --git a/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924123612/config.json b/docs/training_runs/Dev-IK-Rel-v0/model1/bc_new_demos/20250925163039/config.json similarity index 97% rename from docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924123612/config.json rename to docs/training_runs/Dev-IK-Rel-v0/model1/bc_new_demos/20250925163039/config.json index a6b76e34fba4..6ec2c3912eed 100644 --- a/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model0/bc_new_demos/20250924123612/config.json +++ b/docs/training_runs/Dev-IK-Rel-v0/model1/bc_new_demos/20250925163039/config.json @@ -36,8 +36,8 @@ } }, "train": { - "data": "docs/beaker_lift_new_start_skillgen_generated_split_normalized.hdf5", - "output_dir": "/workspace/isaaclab/logs/docs/training_runs/bc_rnn_ensemble_pick_place_new_start/Dev-IK-Rel-v0/model14/", + "data": "docs/beaker_lift_new_start_skillgen_generated_split.hdf5", + "output_dir": "/docs/robomimic/Dev-IK-Rel-v0/model14/", "num_data_workers": 1, "hdf5_cache_mode": "low_dim", "hdf5_use_swmr": true, diff --git a/docs/training_runs/bc_trans/bc_trans/20250721085238/config.json b/docs/training_runs/Dev-IK-Rel-v0/model2/bc_new_demos/20250925163039/config.json old mode 100755 new mode 100644 similarity index 94% rename from docs/training_runs/bc_trans/bc_trans/20250721085238/config.json rename to docs/training_runs/Dev-IK-Rel-v0/model2/bc_new_demos/20250925163039/config.json index cc08f0289374..6ec2c3912eed --- a/docs/training_runs/bc_trans/bc_trans/20250721085238/config.json +++ b/docs/training_runs/Dev-IK-Rel-v0/model2/bc_new_demos/20250925163039/config.json @@ -1,18 +1,18 @@ { "algo_name": "bc", "experiment": { - "name": "bc_trans_20250721_1", + "name": "bc_new_demos", "validate": true, "logging": { "terminal_output_to_txt": true, "log_tb": true, "log_wandb": true, - "wandb_proj_name": "pick-place-tabletop" + "wandb_proj_name": "Lift_beaker_new_demos" }, "save": { "enabled": true, "every_n_seconds": null, - "every_n_epochs": 100, + "every_n_epochs": null, "epochs": [], "on_best_validation": true, "on_best_rollout_return": true, @@ -20,7 +20,7 @@ }, "epoch_every_n_steps": 100, "validation_epoch_every_n_steps": 10, - "env": null, + "env": "Dev-IK-Rel-v0", "additional_envs": null, "render": false, "render_video": true, @@ -36,8 +36,8 @@ } }, "train": { - "data": "docs/varying_beaker_scale_generated2_split.hdf5", - "output_dir": "/docs/training_runs/bc_trans/202507210951/Dev-IK-Rel-v0", + "data": "docs/beaker_lift_new_start_skillgen_generated_split.hdf5", + "output_dir": "/docs/robomimic/Dev-IK-Rel-v0/model14/", "num_data_workers": 1, "hdf5_cache_mode": "low_dim", "hdf5_use_swmr": true, @@ -57,7 +57,7 @@ "goal_mode": null, "cuda": true, "batch_size": 100, - "num_epochs": 3000, + "num_epochs": 2000, "seed": 101 }, "algo": { @@ -132,7 +132,7 @@ ] }, "rnn": { - "enabled": false, + "enabled": true, "horizon": 10, "hidden_dim": 400, "rnn_type": "LSTM", @@ -143,7 +143,7 @@ } }, "transformer": { - "enabled": true, + "enabled": false, "context_length": 10, "embed_dim": 512, "num_layers": 6, diff --git a/docs/training_runs/bc_trans/bc_trans/20250721074750/config.json b/docs/training_runs/Dev-IK-Rel-v0/model3/bc_new_demos/20250925163039/config.json old mode 100755 new mode 100644 similarity index 94% rename from docs/training_runs/bc_trans/bc_trans/20250721074750/config.json rename to docs/training_runs/Dev-IK-Rel-v0/model3/bc_new_demos/20250925163039/config.json index 90570d60c2f4..6ec2c3912eed --- a/docs/training_runs/bc_trans/bc_trans/20250721074750/config.json +++ b/docs/training_runs/Dev-IK-Rel-v0/model3/bc_new_demos/20250925163039/config.json @@ -1,18 +1,18 @@ { "algo_name": "bc", "experiment": { - "name": "bc_trans_20250721_1", + "name": "bc_new_demos", "validate": true, "logging": { "terminal_output_to_txt": true, "log_tb": true, "log_wandb": true, - "wandb_proj_name": "pick-place-tabletop" + "wandb_proj_name": "Lift_beaker_new_demos" }, "save": { "enabled": true, "every_n_seconds": null, - "every_n_epochs": 100, + "every_n_epochs": null, "epochs": [], "on_best_validation": true, "on_best_rollout_return": true, @@ -20,7 +20,7 @@ }, "epoch_every_n_steps": 100, "validation_epoch_every_n_steps": 10, - "env": null, + "env": "Dev-IK-Rel-v0", "additional_envs": null, "render": false, "render_video": true, @@ -36,8 +36,8 @@ } }, "train": { - "data": "docs/varying_beaker_scale_generated2_split.hdf5", - "output_dir": "/docs/docs/training_runs/bc_trans/202507210830/Dev-IK-Rel-v0", + "data": "docs/beaker_lift_new_start_skillgen_generated_split.hdf5", + "output_dir": "/docs/robomimic/Dev-IK-Rel-v0/model14/", "num_data_workers": 1, "hdf5_cache_mode": "low_dim", "hdf5_use_swmr": true, @@ -57,7 +57,7 @@ "goal_mode": null, "cuda": true, "batch_size": 100, - "num_epochs": 3000, + "num_epochs": 2000, "seed": 101 }, "algo": { @@ -132,7 +132,7 @@ ] }, "rnn": { - "enabled": false, + "enabled": true, "horizon": 10, "hidden_dim": 400, "rnn_type": "LSTM", @@ -143,7 +143,7 @@ } }, "transformer": { - "enabled": true, + "enabled": false, "context_length": 10, "embed_dim": 512, "num_layers": 6, diff --git a/docs/training_runs/Dev-IK-Rel-v0/model4/bc_new_demos/20250925163039/config.json b/docs/training_runs/Dev-IK-Rel-v0/model4/bc_new_demos/20250925163039/config.json new file mode 100644 index 000000000000..6ec2c3912eed --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v0/model4/bc_new_demos/20250925163039/config.json @@ -0,0 +1,216 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_new_demos", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_new_start_skillgen_generated_split.hdf5", + "output_dir": "/docs/robomimic/Dev-IK-Rel-v0/model14/", + "num_data_workers": 1, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model0/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model0/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model0/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model1/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model1/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model1/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model2/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model2/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model2/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model3/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model3/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model3/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model4/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model4/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model4/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model5/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model5/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model5/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model6/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model6/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model6/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model7/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model7/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model7/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model8/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model8/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model8/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model9/bc_high_data_/20251009101852/config.json b/docs/training_runs/Dev-IK-Rel-v1/model9/bc_high_data_/20251009101852/config.json new file mode 100644 index 000000000000..f3cc5a6a7da1 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model9/bc_high_data_/20251009101852/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split_normalized.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_q/Dev-IK-Rel-v0/bcq/20250721123120/config.json b/docs/training_runs/bc_q/Dev-IK-Rel-v0/bcq/20250721123120/config.json deleted file mode 100755 index d5a1cf7e95f4..000000000000 --- a/docs/training_runs/bc_q/Dev-IK-Rel-v0/bcq/20250721123120/config.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "algo_name": "bcq", - "experiment": { - "name": "bcq", - "validate": true, - "logging": { - "terminal_output_to_txt": true, - "log_tb": true, - "log_wandb": true, - "wandb_proj_name": "pick-place-tabletop" - }, - "save": { - "enabled": true, - "every_n_seconds": null, - "every_n_epochs": 100, - "epochs": [], - "on_best_validation": true, - "on_best_rollout_return": false, - "on_best_rollout_success_rate": false - }, - "epoch_every_n_steps": 100, - "validation_epoch_every_n_steps": 10, - "env": null, - "additional_envs": null, - "render": false, - "render_video": true, - "keep_all_videos": false, - "video_skip": 5, - "rollout": { - "enabled": false, - "n": 50, - "horizon": 400, - "rate": 50, - "warmstart": 0, - "terminate_on_success": true - } - }, - "train": { - "data": "docs/varying_beaker_scale_generated2_split.hdf5", - "output_dir": "/workspace/isaaclab/docs/training_runs/bc_q/Dev-IK-Rel-v0", - "num_data_workers": 1, - "hdf5_cache_mode": "low_dim", - "hdf5_use_swmr": true, - "hdf5_load_next_obs": true, - "hdf5_normalize_obs": false, - "hdf5_filter_key": "train", - "hdf5_validation_filter_key": "valid", - "seq_length": 1, - "pad_seq_length": true, - "frame_stack": 1, - "pad_frame_stack": true, - "dataset_keys": [ - "actions", - "rewards", - "dones" - ], - "goal_mode": null, - "cuda": true, - "batch_size": 100, - "num_epochs": 2000, - "seed": 1 - }, - "algo": { - "optim_params": { - "critic": { - "learning_rate": { - "initial": 0.0001, - "decay_factor": 0.1, - "epoch_schedule": [] - }, - "regularization": { - "L2": 0.0 - }, - "start_epoch": -1, - "end_epoch": -1 - }, - "action_sampler": { - "learning_rate": { - "initial": 0.001, - "decay_factor": 0.1, - "epoch_schedule": [] - }, - "regularization": { - "L2": 0.0 - }, - "start_epoch": -1, - "end_epoch": -1 - }, - "actor": { - "learning_rate": { - "initial": 0.001, - "decay_factor": 0.1, - "epoch_schedule": [] - }, - "regularization": { - "L2": 0.0 - }, - "start_epoch": -1, - "end_epoch": -1 - } - }, - "discount": 0.99, - "n_step": 1, - "target_tau": 0.005, - "infinite_horizon": false, - "critic": { - "use_huber": false, - "max_gradient_norm": null, - "value_bounds": null, - "num_action_samples": 10, - "num_action_samples_rollout": 100, - "ensemble": { - "n": 2, - "weight": 0.75 - }, - "distributional": { - "enabled": false, - "num_atoms": 51 - }, - "layer_dims": [ - 300, - 400 - ] - }, - "action_sampler": { - "actor_layer_dims": [ - 1024, - 1024 - ], - "gmm": { - "enabled": true, - "num_modes": 10, - "min_std": 0.0001, - "std_activation": "softplus", - "low_noise_eval": true - }, - "vae": { - "enabled": true, - "latent_dim": 14, - "latent_clip": null, - "kl_weight": 1.0, - "decoder": { - "is_conditioned": true, - "reconstruction_sum_across_elements": false - }, - "prior": { - "learn": false, - "is_conditioned": false, - "use_gmm": false, - "gmm_num_modes": 10, - "gmm_learn_weights": false, - "use_categorical": false, - "categorical_dim": 10, - "categorical_gumbel_softmax_hard": false, - "categorical_init_temp": 1.0, - "categorical_temp_anneal_step": 0.001, - "categorical_min_temp": 0.3 - }, - "encoder_layer_dims": [ - 300, - 400 - ], - "decoder_layer_dims": [ - 300, - 400 - ], - "prior_layer_dims": [ - 300, - 400 - ] - }, - "freeze_encoder_epoch": -1 - }, - "actor": { - "enabled": false, - "perturbation_scale": 0.05, - "layer_dims": [ - 300, - 400 - ] - } - }, - "observation": { - "modalities": { - "obs": { - "low_dim": [ - "eef_pos", - "eef_quat", - "gripper_pos", - "object_position", - "target_object_position", - "joint_pos", - "joint_vel", - "actions" - ], - "rgb": [], - "depth": [], - "scan": [] - }, - "goal": { - "low_dim": [], - "rgb": [], - "depth": [], - "scan": [] - } - }, - "encoder": { - "low_dim": { - "core_class": null, - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "rgb": { - "core_class": "VisualCore", - "core_kwargs": { - "feature_dimension": 64, - "flatten": true, - "backbone_class": "ResNet18Conv", - "backbone_kwargs": { - "pretrained": false, - "input_coord_conv": false - }, - "pool_class": "SpatialSoftmax", - "pool_kwargs": { - "num_kp": 32, - "learnable_temperature": false, - "temperature": 1.0, - "noise_std": 0.0, - "output_variance": false - } - }, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": { - "crop_height": 76, - "crop_width": 76, - "num_crops": 1, - "pos_enc": false - } - }, - "depth": { - "core_class": "VisualCore", - "core_kwargs": { - "feature_dimension": 64, - "flatten": true, - "backbone_class": "ResNet18Conv", - "backbone_kwargs": { - "pretrained": false, - "input_coord_conv": false - }, - "pool_class": "SpatialSoftmax", - "pool_kwargs": { - "num_kp": 32, - "learnable_temperature": false, - "temperature": 1.0, - "noise_std": 0.0, - "output_variance": false - } - }, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": { - "crop_height": 76, - "crop_width": 76, - "num_crops": 1, - "pos_enc": false - } - }, - "scan": { - "core_class": "ScanCore", - "core_kwargs": { - "feature_dimension": 64, - "flatten": true, - "pool_class": "SpatialSoftmax", - "pool_kwargs": { - "num_kp": 32, - "learnable_temperature": false, - "temperature": 1.0, - "noise_std": 0.0, - "output_variance": false - }, - "conv_activation": "relu", - "conv_kwargs": { - "out_channels": [ - 32, - 64, - 64 - ], - "kernel_size": [ - 8, - 4, - 2 - ], - "stride": [ - 4, - 2, - 1 - ] - } - }, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": { - "crop_height": 76, - "crop_width": 76, - "num_crops": 1, - "pos_enc": false - } - } - } - }, - "meta": { - "hp_base_config_file": null, - "hp_keys": [], - "hp_values": [] - } -} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model0/bc_med_data_/20251015094236/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model0/bc_med_data_/20251015094236/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model0/bc_med_data_/20251015094236/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model1/bc_med_data_/20251015094238/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model1/bc_med_data_/20251015094238/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model1/bc_med_data_/20251015094238/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model2/bc_med_data_/20251015094238/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model2/bc_med_data_/20251015094238/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model2/bc_med_data_/20251015094238/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model3/bc_med_data_/20251015094239/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model3/bc_med_data_/20251015094239/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model3/bc_med_data_/20251015094239/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model4/bc_med_data_/20251015094239/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model4/bc_med_data_/20251015094239/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model4/bc_med_data_/20251015094239/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_trans/bc_trans/20250715154020/config.json b/docs/training_runs/bc_trans/bc_trans/20250715154020/config.json deleted file mode 100755 index 2d7bc021db12..000000000000 --- a/docs/training_runs/bc_trans/bc_trans/20250715154020/config.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "algo_name": "bc", - "experiment": { - "name": "bc_trans", - "validate": true, - "logging": { - "terminal_output_to_txt": true, - "log_tb": true, - "log_wandb": true, - "wandb_proj_name": "bc-trans" - }, - "save": { - "enabled": true, - "every_n_seconds": null, - "every_n_epochs": 100, - "epochs": [], - "on_best_validation": true, - "on_best_rollout_return": false, - "on_best_rollout_success_rate": true - }, - "epoch_every_n_steps": 100, - "validation_epoch_every_n_steps": 10, - "env": null, - "additional_envs": null, - "render": false, - "render_video": true, - "keep_all_videos": false, - "video_skip": 5, - "rollout": { - "enabled": true, - "n": 50, - "horizon": 400, - "rate": 50, - "warmstart": 0, - "terminate_on_success": true - } - }, - "train": { - "data": "docs/varying_beaker_scale_split.hdf5", - "output_dir": "/workspace/isaaclab/logs/docs/training_runs/bc-trans/202507151635/Dev-IK-Rel-v0", - "num_data_workers": 1, - "hdf5_cache_mode": "low_dim", - "hdf5_use_swmr": true, - "hdf5_load_next_obs": false, - "hdf5_normalize_obs": false, - "hdf5_filter_key": "train", - "hdf5_validation_filter_key": "valid", - "seq_length": 10, - "pad_seq_length": true, - "frame_stack": 1, - "pad_frame_stack": true, - "dataset_keys": [ - "actions", - "rewards", - "dones" - ], - "goal_mode": null, - "cuda": true, - "batch_size": 100, - "num_epochs": 3000, - "seed": 101 - }, - "algo": { - "optim_params": { - "policy": { - "optimizer_type": "adam", - "learning_rate": { - "initial": 0.0001, - "decay_factor": 0.1, - "epoch_schedule": [], - "scheduler_type": "multistep" - }, - "regularization": { - "L2": 0.0 - } - } - }, - "loss": { - "l2_weight": 1.0, - "l1_weight": 0.0, - "cos_weight": 0.0 - }, - "actor_layer_dims": [], - "gaussian": { - "enabled": false, - "fixed_std": false, - "init_std": 0.1, - "min_std": 0.01, - "std_activation": "softplus", - "low_noise_eval": true - }, - "gmm": { - "enabled": true, - "num_modes": 10, - "min_std": 0.0001, - "std_activation": "softplus", - "low_noise_eval": true - }, - "vae": { - "enabled": false, - "latent_dim": 14, - "latent_clip": null, - "kl_weight": 1.0, - "decoder": { - "is_conditioned": true, - "reconstruction_sum_across_elements": false - }, - "prior": { - "learn": false, - "is_conditioned": false, - "use_gmm": false, - "gmm_num_modes": 10, - "gmm_learn_weights": false, - "use_categorical": false, - "categorical_dim": 10, - "categorical_gumbel_softmax_hard": false, - "categorical_init_temp": 1.0, - "categorical_temp_anneal_step": 0.001, - "categorical_min_temp": 0.3 - }, - "encoder_layer_dims": [ - 300, - 400 - ], - "decoder_layer_dims": [ - 300, - 400 - ], - "prior_layer_dims": [ - 300, - 400 - ] - }, - "rnn": { - "enabled": false, - "horizon": 10, - "hidden_dim": 400, - "rnn_type": "LSTM", - "num_layers": 2, - "open_loop": false, - "kwargs": { - "bidirectional": false - } - }, - "transformer": { - "enabled": true, - "context_length": 10, - "embed_dim": 512, - "num_layers": 6, - "num_heads": 8, - "emb_dropout": 0.1, - "attn_dropout": 0.1, - "block_output_dropout": 0.1, - "sinusoidal_embedding": false, - "activation": "gelu", - "supervise_all_steps": false, - "nn_parameter_for_timesteps": true - } - }, - "observation": { - "modalities": { - "obs": { - "low_dim": [ - "eef_pos", - "eef_quat", - "gripper_pos", - "object_position", - "target_object_position", - "joint_pos", - "joint_vel", - "actions" - ], - "rgb": [], - "depth": [], - "scan": [] - }, - "goal": { - "low_dim": [], - "rgb": [], - "depth": [], - "scan": [] - } - }, - "encoder": { - "low_dim": { - "core_class": null, - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "rgb": { - "core_class": "VisualCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "depth": { - "core_class": "VisualCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "scan": { - "core_class": "ScanCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - } - } - }, - "meta": { - "hp_base_config_file": null, - "hp_keys": [], - "hp_values": [] - } -} \ No newline at end of file diff --git a/docs/training_runs/bc_trans/bc_trans/20250721074506/config.json b/docs/training_runs/bc_trans/bc_trans/20250721074506/config.json deleted file mode 100755 index 39c1fa2d1eb9..000000000000 --- a/docs/training_runs/bc_trans/bc_trans/20250721074506/config.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "algo_name": "bc", - "experiment": { - "name": "bc_trans_20250721_1", - "validate": true, - "logging": { - "terminal_output_to_txt": true, - "log_tb": true, - "log_wandb": true, - "wandb_proj_name": "pick-place-tabletop" - }, - "save": { - "enabled": true, - "every_n_seconds": null, - "every_n_epochs": false, - "epochs": [], - "on_best_validation": true, - "on_best_rollout_return": true, - "on_best_rollout_success_rate": true - }, - "epoch_every_n_steps": 100, - "validation_epoch_every_n_steps": 10, - "env": null, - "additional_envs": null, - "render": false, - "render_video": true, - "keep_all_videos": false, - "video_skip": 5, - "rollout": { - "enabled": false, - "n": 50, - "horizon": 400, - "rate": 50, - "warmstart": 0, - "terminate_on_success": true - } - }, - "train": { - "data": "docs/varying_beaker_scale_generated2_split.hdf5", - "output_dir": "/workspace/isaaclab/logs/docs/training_runs/bc_trans/202507210830/Dev-IK-Rel-v0", - "num_data_workers": 1, - "hdf5_cache_mode": "low_dim", - "hdf5_use_swmr": true, - "hdf5_load_next_obs": false, - "hdf5_normalize_obs": false, - "hdf5_filter_key": "train", - "hdf5_validation_filter_key": "valid", - "seq_length": 10, - "pad_seq_length": true, - "frame_stack": 1, - "pad_frame_stack": true, - "dataset_keys": [ - "actions", - "rewards", - "dones" - ], - "goal_mode": null, - "cuda": true, - "batch_size": 100, - "num_epochs": 3000, - "seed": 101 - }, - "algo": { - "optim_params": { - "policy": { - "optimizer_type": "adam", - "learning_rate": { - "initial": 0.0001, - "decay_factor": 0.1, - "epoch_schedule": [], - "scheduler_type": "multistep" - }, - "regularization": { - "L2": 0.0 - } - } - }, - "loss": { - "l2_weight": 1.0, - "l1_weight": 0.0, - "cos_weight": 0.0 - }, - "actor_layer_dims": [], - "gaussian": { - "enabled": false, - "fixed_std": false, - "init_std": 0.1, - "min_std": 0.01, - "std_activation": "softplus", - "low_noise_eval": true - }, - "gmm": { - "enabled": true, - "num_modes": 10, - "min_std": 0.0001, - "std_activation": "softplus", - "low_noise_eval": true - }, - "vae": { - "enabled": false, - "latent_dim": 14, - "latent_clip": null, - "kl_weight": 1.0, - "decoder": { - "is_conditioned": true, - "reconstruction_sum_across_elements": false - }, - "prior": { - "learn": false, - "is_conditioned": false, - "use_gmm": false, - "gmm_num_modes": 10, - "gmm_learn_weights": false, - "use_categorical": false, - "categorical_dim": 10, - "categorical_gumbel_softmax_hard": false, - "categorical_init_temp": 1.0, - "categorical_temp_anneal_step": 0.001, - "categorical_min_temp": 0.3 - }, - "encoder_layer_dims": [ - 300, - 400 - ], - "decoder_layer_dims": [ - 300, - 400 - ], - "prior_layer_dims": [ - 300, - 400 - ] - }, - "rnn": { - "enabled": false, - "horizon": 10, - "hidden_dim": 400, - "rnn_type": "LSTM", - "num_layers": 2, - "open_loop": false, - "kwargs": { - "bidirectional": false - } - }, - "transformer": { - "enabled": true, - "context_length": 10, - "embed_dim": 512, - "num_layers": 6, - "num_heads": 8, - "emb_dropout": 0.1, - "attn_dropout": 0.1, - "block_output_dropout": 0.1, - "sinusoidal_embedding": false, - "activation": "gelu", - "supervise_all_steps": false, - "nn_parameter_for_timesteps": true - } - }, - "observation": { - "modalities": { - "obs": { - "low_dim": [ - "eef_pos", - "eef_quat", - "gripper_pos", - "object_position", - "target_object_position", - "joint_pos", - "joint_vel", - "actions" - ], - "rgb": [], - "depth": [], - "scan": [] - }, - "goal": { - "low_dim": [], - "rgb": [], - "depth": [], - "scan": [] - } - }, - "encoder": { - "low_dim": { - "core_class": null, - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "rgb": { - "core_class": "VisualCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "depth": { - "core_class": "VisualCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "scan": { - "core_class": "ScanCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - } - } - }, - "meta": { - "hp_base_config_file": null, - "hp_keys": [], - "hp_values": [] - } -} \ No newline at end of file diff --git a/docs/training_runs/bcq/Dev-IK-Rel-v0/bcq/20250721135829/config.json b/docs/training_runs/bcq/Dev-IK-Rel-v0/bcq/20250721135829/config.json deleted file mode 100755 index 46ff43c296ec..000000000000 --- a/docs/training_runs/bcq/Dev-IK-Rel-v0/bcq/20250721135829/config.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "algo_name": "bcq", - "experiment": { - "name": "bcq", - "validate": true, - "logging": { - "terminal_output_to_txt": true, - "log_tb": true, - "log_wandb": true, - "wandb_proj_name": "pick-place-tabletop" - }, - "save": { - "enabled": true, - "every_n_seconds": null, - "every_n_epochs": 100, - "epochs": [], - "on_best_validation": true, - "on_best_rollout_return": false, - "on_best_rollout_success_rate": false - }, - "epoch_every_n_steps": 100, - "validation_epoch_every_n_steps": 10, - "env": null, - "additional_envs": null, - "render": false, - "render_video": true, - "keep_all_videos": false, - "video_skip": 5, - "rollout": { - "enabled": false, - "n": 50, - "horizon": 400, - "rate": 50, - "warmstart": 0, - "terminate_on_success": true - } - }, - "train": { - "data": "docs/varying_beaker_scale_generated2_split_with_next_obs.hdf5", - "output_dir": "/workspace/isaaclab/docs/training_runs/bcq/Dev-IK-Rel-v0", - "num_data_workers": 1, - "hdf5_cache_mode": "low_dim", - "hdf5_use_swmr": true, - "hdf5_load_next_obs": true, - "hdf5_normalize_obs": false, - "hdf5_filter_key": "train", - "hdf5_validation_filter_key": "valid", - "seq_length": 1, - "pad_seq_length": true, - "frame_stack": 1, - "pad_frame_stack": true, - "dataset_keys": [ - "actions", - "rewards", - "dones" - ], - "goal_mode": null, - "cuda": true, - "batch_size": 100, - "num_epochs": 2000, - "seed": 1 - }, - "algo": { - "optim_params": { - "critic": { - "learning_rate": { - "initial": 0.0001, - "decay_factor": 0.1, - "epoch_schedule": [] - }, - "regularization": { - "L2": 0.0 - }, - "start_epoch": -1, - "end_epoch": -1 - }, - "action_sampler": { - "learning_rate": { - "initial": 0.001, - "decay_factor": 0.1, - "epoch_schedule": [] - }, - "regularization": { - "L2": 0.0 - }, - "start_epoch": -1, - "end_epoch": -1 - }, - "actor": { - "learning_rate": { - "initial": 0.001, - "decay_factor": 0.1, - "epoch_schedule": [] - }, - "regularization": { - "L2": 0.0 - }, - "start_epoch": -1, - "end_epoch": -1 - } - }, - "discount": 0.99, - "n_step": 1, - "target_tau": 0.005, - "infinite_horizon": false, - "critic": { - "use_huber": false, - "max_gradient_norm": null, - "value_bounds": null, - "num_action_samples": 10, - "num_action_samples_rollout": 100, - "ensemble": { - "n": 2, - "weight": 0.75 - }, - "distributional": { - "enabled": false, - "num_atoms": 51 - }, - "layer_dims": [ - 300, - 400 - ] - }, - "action_sampler": { - "actor_layer_dims": [ - 1024, - 1024 - ], - "gmm": { - "enabled": true, - "num_modes": 10, - "min_std": 0.0001, - "std_activation": "softplus", - "low_noise_eval": true - }, - "vae": { - "enabled": true, - "latent_dim": 14, - "latent_clip": null, - "kl_weight": 1.0, - "decoder": { - "is_conditioned": true, - "reconstruction_sum_across_elements": false - }, - "prior": { - "learn": false, - "is_conditioned": false, - "use_gmm": false, - "gmm_num_modes": 10, - "gmm_learn_weights": false, - "use_categorical": false, - "categorical_dim": 10, - "categorical_gumbel_softmax_hard": false, - "categorical_init_temp": 1.0, - "categorical_temp_anneal_step": 0.001, - "categorical_min_temp": 0.3 - }, - "encoder_layer_dims": [ - 300, - 400 - ], - "decoder_layer_dims": [ - 300, - 400 - ], - "prior_layer_dims": [ - 300, - 400 - ] - }, - "freeze_encoder_epoch": -1 - }, - "actor": { - "enabled": false, - "perturbation_scale": 0.05, - "layer_dims": [ - 300, - 400 - ] - } - }, - "observation": { - "modalities": { - "obs": { - "low_dim": [ - "eef_pos", - "eef_quat", - "gripper_pos", - "object_position", - "target_object_position", - "joint_pos", - "joint_vel", - "actions" - ], - "rgb": [], - "depth": [], - "scan": [] - }, - "goal": { - "low_dim": [], - "rgb": [], - "depth": [], - "scan": [] - } - }, - "encoder": { - "low_dim": { - "core_class": null, - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "rgb": { - "core_class": "VisualCore", - "core_kwargs": { - "feature_dimension": 64, - "flatten": true, - "backbone_class": "ResNet18Conv", - "backbone_kwargs": { - "pretrained": false, - "input_coord_conv": false - }, - "pool_class": "SpatialSoftmax", - "pool_kwargs": { - "num_kp": 32, - "learnable_temperature": false, - "temperature": 1.0, - "noise_std": 0.0, - "output_variance": false - } - }, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": { - "crop_height": 76, - "crop_width": 76, - "num_crops": 1, - "pos_enc": false - } - }, - "depth": { - "core_class": "VisualCore", - "core_kwargs": { - "feature_dimension": 64, - "flatten": true, - "backbone_class": "ResNet18Conv", - "backbone_kwargs": { - "pretrained": false, - "input_coord_conv": false - }, - "pool_class": "SpatialSoftmax", - "pool_kwargs": { - "num_kp": 32, - "learnable_temperature": false, - "temperature": 1.0, - "noise_std": 0.0, - "output_variance": false - } - }, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": { - "crop_height": 76, - "crop_width": 76, - "num_crops": 1, - "pos_enc": false - } - }, - "scan": { - "core_class": "ScanCore", - "core_kwargs": { - "feature_dimension": 64, - "flatten": true, - "pool_class": "SpatialSoftmax", - "pool_kwargs": { - "num_kp": 32, - "learnable_temperature": false, - "temperature": 1.0, - "noise_std": 0.0, - "output_variance": false - }, - "conv_activation": "relu", - "conv_kwargs": { - "out_channels": [ - 32, - 64, - 64 - ], - "kernel_size": [ - 8, - 4, - 2 - ], - "stride": [ - 4, - 2, - 1 - ] - } - }, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": { - "crop_height": 76, - "crop_width": 76, - "num_crops": 1, - "pos_enc": false - } - } - } - }, - "meta": { - "hp_base_config_file": null, - "hp_keys": [], - "hp_values": [] - } -} \ No newline at end of file diff --git a/docs/training_runs/franks_stack/20250715152538/config.json b/docs/training_runs/franks_stack/20250715152538/config.json deleted file mode 100755 index bd1627e755cb..000000000000 --- a/docs/training_runs/franks_stack/20250715152538/config.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "algo_name": "bc", - "experiment": { - "name": "bc_rnn_low_dim_franka_stack", - "validate": false, - "logging": { - "terminal_output_to_txt": true, - "log_tb": true, - "log_wandb": false, - "wandb_proj_name": "debug" - }, - "save": { - "enabled": true, - "every_n_seconds": null, - "every_n_epochs": 100, - "epochs": [], - "on_best_validation": false, - "on_best_rollout_return": false, - "on_best_rollout_success_rate": true - }, - "epoch_every_n_steps": 100, - "validation_epoch_every_n_steps": 10, - "env": null, - "additional_envs": null, - "render": false, - "render_video": false, - "keep_all_videos": false, - "video_skip": 5, - "rollout": { - "enabled": false, - "n": 50, - "horizon": 400, - "rate": 50, - "warmstart": 0, - "terminate_on_success": true - } - }, - "train": { - "data": "./docs/training_data/generated_dataset_split.hdf5", - "output_dir": "/workspace/isaaclab/logs/docs/Models/bc/model2/Isaac-Stack-Cube-Franka-IK-Rel-v0", - "num_data_workers": 4, - "hdf5_cache_mode": "all", - "hdf5_use_swmr": true, - "hdf5_load_next_obs": false, - "hdf5_normalize_obs": false, - "hdf5_filter_key": null, - "hdf5_validation_filter_key": null, - "seq_length": 10, - "pad_seq_length": true, - "frame_stack": 1, - "pad_frame_stack": true, - "dataset_keys": [ - "actions" - ], - "goal_mode": null, - "cuda": true, - "batch_size": 100, - "num_epochs": 2000, - "seed": 101 - }, - "algo": { - "optim_params": { - "policy": { - "optimizer_type": "adam", - "learning_rate": { - "initial": 0.001, - "decay_factor": 0.1, - "epoch_schedule": [], - "scheduler_type": "multistep" - }, - "regularization": { - "L2": 0.0 - } - } - }, - "loss": { - "l2_weight": 1.0, - "l1_weight": 0.0, - "cos_weight": 0.0 - }, - "actor_layer_dims": [], - "gaussian": { - "enabled": false, - "fixed_std": false, - "init_std": 0.1, - "min_std": 0.01, - "std_activation": "softplus", - "low_noise_eval": true - }, - "gmm": { - "enabled": true, - "num_modes": 5, - "min_std": 0.0001, - "std_activation": "softplus", - "low_noise_eval": true - }, - "vae": { - "enabled": false, - "latent_dim": 14, - "latent_clip": null, - "kl_weight": 1.0, - "decoder": { - "is_conditioned": true, - "reconstruction_sum_across_elements": false - }, - "prior": { - "learn": false, - "is_conditioned": false, - "use_gmm": false, - "gmm_num_modes": 10, - "gmm_learn_weights": false, - "use_categorical": false, - "categorical_dim": 10, - "categorical_gumbel_softmax_hard": false, - "categorical_init_temp": 1.0, - "categorical_temp_anneal_step": 0.001, - "categorical_min_temp": 0.3 - }, - "encoder_layer_dims": [ - 300, - 400 - ], - "decoder_layer_dims": [ - 300, - 400 - ], - "prior_layer_dims": [ - 300, - 400 - ] - }, - "rnn": { - "enabled": true, - "horizon": 10, - "hidden_dim": 400, - "rnn_type": "LSTM", - "num_layers": 2, - "open_loop": false, - "kwargs": { - "bidirectional": false - } - }, - "transformer": { - "enabled": false, - "context_length": 10, - "embed_dim": 512, - "num_layers": 6, - "num_heads": 8, - "emb_dropout": 0.1, - "attn_dropout": 0.1, - "block_output_dropout": 0.1, - "sinusoidal_embedding": false, - "activation": "gelu", - "supervise_all_steps": false, - "nn_parameter_for_timesteps": true - } - }, - "observation": { - "modalities": { - "obs": { - "low_dim": [ - "eef_pos", - "eef_quat", - "gripper_pos", - "object" - ], - "rgb": [], - "depth": [], - "scan": [] - }, - "goal": { - "low_dim": [], - "rgb": [], - "depth": [], - "scan": [] - } - }, - "encoder": { - "low_dim": { - "core_class": null, - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "rgb": { - "core_class": "VisualCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "depth": { - "core_class": "VisualCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "scan": { - "core_class": "ScanCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - } - } - }, - "meta": { - "hp_base_config_file": null, - "hp_keys": [], - "hp_values": [] - } -} \ No newline at end of file diff --git a/docs/training_runs/franks_stack/20250716100129/config.json b/docs/training_runs/franks_stack/20250716100129/config.json deleted file mode 100755 index 5fa8cd807083..000000000000 --- a/docs/training_runs/franks_stack/20250716100129/config.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "algo_name": "bc", - "experiment": { - "name": "bc_rnn_low_dim_franka_stack", - "validate": true, - "logging": { - "terminal_output_to_txt": true, - "log_tb": true, - "log_wandb": false, - "wandb_proj_name": "debug" - }, - "save": { - "enabled": true, - "every_n_seconds": null, - "every_n_epochs": 100, - "epochs": [], - "on_best_validation": true, - "on_best_rollout_return": false, - "on_best_rollout_success_rate": true - }, - "epoch_every_n_steps": 100, - "validation_epoch_every_n_steps": 10, - "env": null, - "additional_envs": null, - "render": false, - "render_video": false, - "keep_all_videos": false, - "video_skip": 5, - "rollout": { - "enabled": false, - "n": 50, - "horizon": 400, - "rate": 50, - "warmstart": 0, - "terminate_on_success": true - } - }, - "train": { - "data": "./docs/training_data/generated_dataset_split.hdf5", - "output_dir": "/logs/docs/Models/bc/model8/Isaac-Stack-Cube-Franka-IK-Rel-v0", - "num_data_workers": 4, - "hdf5_cache_mode": "all", - "hdf5_use_swmr": true, - "hdf5_load_next_obs": false, - "hdf5_normalize_obs": false, - "hdf5_filter_key": "train", - "hdf5_validation_filter_key": "valid", - "seq_length": 10, - "pad_seq_length": true, - "frame_stack": 1, - "pad_frame_stack": true, - "dataset_keys": [ - "actions" - ], - "goal_mode": null, - "cuda": true, - "batch_size": 100, - "num_epochs": 4000, - "seed": 101 - }, - "algo": { - "optim_params": { - "policy": { - "optimizer_type": "adam", - "learning_rate": { - "initial": 0.001, - "decay_factor": 0.1, - "epoch_schedule": [], - "scheduler_type": "multistep" - }, - "regularization": { - "L2": 0.0 - } - } - }, - "loss": { - "l2_weight": 1.0, - "l1_weight": 0.0, - "cos_weight": 0.0 - }, - "actor_layer_dims": [], - "gaussian": { - "enabled": false, - "fixed_std": false, - "init_std": 0.1, - "min_std": 0.01, - "std_activation": "softplus", - "low_noise_eval": true - }, - "gmm": { - "enabled": true, - "num_modes": 5, - "min_std": 0.0001, - "std_activation": "softplus", - "low_noise_eval": true - }, - "vae": { - "enabled": false, - "latent_dim": 14, - "latent_clip": null, - "kl_weight": 1.0, - "decoder": { - "is_conditioned": true, - "reconstruction_sum_across_elements": false - }, - "prior": { - "learn": false, - "is_conditioned": false, - "use_gmm": false, - "gmm_num_modes": 10, - "gmm_learn_weights": false, - "use_categorical": false, - "categorical_dim": 10, - "categorical_gumbel_softmax_hard": false, - "categorical_init_temp": 1.0, - "categorical_temp_anneal_step": 0.001, - "categorical_min_temp": 0.3 - }, - "encoder_layer_dims": [ - 300, - 400 - ], - "decoder_layer_dims": [ - 300, - 400 - ], - "prior_layer_dims": [ - 300, - 400 - ] - }, - "rnn": { - "enabled": true, - "horizon": 10, - "hidden_dim": 400, - "rnn_type": "LSTM", - "num_layers": 2, - "open_loop": false, - "kwargs": { - "bidirectional": false - } - }, - "transformer": { - "enabled": false, - "context_length": 10, - "embed_dim": 512, - "num_layers": 6, - "num_heads": 8, - "emb_dropout": 0.1, - "attn_dropout": 0.1, - "block_output_dropout": 0.1, - "sinusoidal_embedding": false, - "activation": "gelu", - "supervise_all_steps": false, - "nn_parameter_for_timesteps": true - } - }, - "observation": { - "modalities": { - "obs": { - "low_dim": [ - "eef_pos", - "eef_quat", - "gripper_pos", - "object" - ], - "rgb": [], - "depth": [], - "scan": [] - }, - "goal": { - "low_dim": [], - "rgb": [], - "depth": [], - "scan": [] - } - }, - "encoder": { - "low_dim": { - "core_class": null, - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "rgb": { - "core_class": "VisualCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "depth": { - "core_class": "VisualCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - }, - "scan": { - "core_class": "ScanCore", - "core_kwargs": {}, - "obs_randomizer_class": null, - "obs_randomizer_kwargs": {} - } - } - }, - "meta": { - "hp_base_config_file": null, - "hp_keys": [], - "hp_values": [] - } -} \ No newline at end of file diff --git a/docs/training_runs/good_data/bc_high_demos_0/20251008103600/config.json b/docs/training_runs/good_data/bc_high_demos_0/20251008103600/config.json new file mode 100644 index 000000000000..56af64f08a8a --- /dev/null +++ b/docs/training_runs/good_data/bc_high_demos_0/20251008103600/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_demos_0", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/good_data/bc_high_demos_1/20251008103703/config.json b/docs/training_runs/good_data/bc_high_demos_1/20251008103703/config.json new file mode 100644 index 000000000000..43f5e96acd69 --- /dev/null +++ b/docs/training_runs/good_data/bc_high_demos_1/20251008103703/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_demos_1", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/good_data/bc_high_demos_2/20251008113716/config.json b/docs/training_runs/good_data/bc_high_demos_2/20251008113716/config.json new file mode 100644 index 000000000000..e65f2b8e9acf --- /dev/null +++ b/docs/training_runs/good_data/bc_high_demos_2/20251008113716/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_demos_2", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/good_data/bc_high_demos_3/20251008113737/config.json b/docs/training_runs/good_data/bc_high_demos_3/20251008113737/config.json new file mode 100644 index 000000000000..a5b31fd53204 --- /dev/null +++ b/docs/training_runs/good_data/bc_high_demos_3/20251008113737/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_demos_3", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/good_data/bc_high_demos_4/20251008124639/config.json b/docs/training_runs/good_data/bc_high_demos_4/20251008124639/config.json new file mode 100644 index 000000000000..3887d5ed63a6 --- /dev/null +++ b/docs/training_runs/good_data/bc_high_demos_4/20251008124639/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_demos_4", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/good_data/bc_high_demos_5/20251008131706/config.json b/docs/training_runs/good_data/bc_high_demos_5/20251008131706/config.json new file mode 100644 index 000000000000..9adcb6d9c51d --- /dev/null +++ b/docs/training_runs/good_data/bc_high_demos_5/20251008131706/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_high_demos_5", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_high_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/good_data/bc_low_demos/20251007171556/config.json b/docs/training_runs/good_data/bc_low_demos/20251007171556/config.json new file mode 100644 index 000000000000..cbeeec17626a --- /dev/null +++ b/docs/training_runs/good_data/bc_low_demos/20251007171556/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_low_demos", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_low_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_high_demo_generated_split.hdf5", + "output_dir": "/workspace/isaaclab/logs/robomimic/Dev-IK-Rel-v1", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/play_ensemble.py b/scripts/imitation_learning/robomimic/play_ensemble.py index 01b5d1f65f1d..2286052e3f11 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble.py +++ b/scripts/imitation_learning/robomimic/play_ensemble.py @@ -313,39 +313,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, u if bool(success_term.func(env, **success_term.params)[0]): return True, traj, recovery_activated_during_rollout - # while rec_i < recovery_duration: - # # print("In recovery") - # recovery.append(True) - # robot.set_joint_position_target(safe_pos) # expects an absolute joint position - # env.scene.write_data_to_sim() - # env.sim.step() - - # # Check if robot reached the safe position within a small tolerance - # new_joint_positions = get_joint_pos(env) - # target_joint_positions = safe_pos - - # position_error = torch.abs(new_joint_positions - target_joint_positions) - # position_errors.append(position_error) - # tolerance = 1e-2 - - # # check if the positon/position error has converged to the safe position (it wont reach it exactly). - # # it also jumps to it straight away but if you stop straight away you get weird jerky motion and it doesnt actually reach the safe position - # # check every 50 iterations - # if rec_i % 50 == 0: - # reached_safe_pos_early = False - # if position_errors.maxlen == len(position_errors): - # for pe in position_errors: - # if torch.all(torch.abs(pe - position_error) < tolerance): - # reached_safe_pos_early = True - # if reached_safe_pos_early: - # print(f"Reached safe position early.") - # break - # # else extend the recovery duration - # if rec_i == recovery_duration - 1: - # print("Extending Recovery Duration") - # recovery_duration += 50 - - # rec_i += 1 + print(f"Recovery Mode Ended") print("Recovery Cooldown Activated") @@ -691,7 +659,8 @@ def main(): # load the stack cube ensemble # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') - pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') + #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') + pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/high_qual_ensembles.txt') # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') diff --git a/scripts/imitation_learning/robomimic/train_ensemble.py b/scripts/imitation_learning/robomimic/train_ensemble.py index 67f6ba3160fc..744753d669b1 100644 --- a/scripts/imitation_learning/robomimic/train_ensemble.py +++ b/scripts/imitation_learning/robomimic/train_ensemble.py @@ -263,13 +263,13 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] #config.algo.transformer.num_heads = 1 for model_num in range(ensemble_size): # setup a wand run - wand_experiment_name = f"{config.experiment.name}-model{model_num}" + wand_experiment_name = f"{config.experiment.name}-model_{model_num}" run=wandb.init( project=config.experiment.logging.wandb_proj_name, name=wand_experiment_name ) - #run.define_metric("train reward", step_metric="episode") - # run.define_metric("episode error", step_metric="episode") + # run.define_metric("train reward", step_metric="episode") + # run.define_metric("episode error", step_metric="episode") # reset best valid loss best_valid_loss = None @@ -278,7 +278,7 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] video_dir = video_dirs[model_num] # setup logger stuff - # logger = Logger(os.path.join(log_dir, "log.txt")) + #logger = Logger(os.path.join(log_dir, "log.txt")) # sys.stdout = logger # sys.stderr = logger data_logger = DataLogger(log_dir, config=config, log_tb=config.experiment.logging.log_tb, log_wandb=config.experiment.logging.log_wandb) @@ -286,6 +286,7 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] json.dump(config, outfile, indent=4) # initialise current network in the ensemble + model = algo_factory( algo_name=config.algo_name, config=config, @@ -371,7 +372,7 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] mem_usage = int(process.memory_info().rss / 1000000) data_logger.record("System/RAM Usage (MB)", mem_usage, epoch) print(f"\nEpoch {epoch} Memory Usage: {mem_usage} MB\n") - + run.finish() #config.algo.transformer.num_layers = config.algo.transformer.num_layers + 1 #config.algo.transformer.num_heads = config.algo.transformer.num_heads + 1 # run.finish() @@ -439,16 +440,16 @@ def main(args: argparse.Namespace): for stream in (sys.stdout, sys.stderr): if not hasattr(stream, "isatty"): stream.isatty = lambda: False - os.environ["WANDB_MODE"] = "offline" - run=wandb.init( - project=config.experiment.logging.wandb_proj_name, - name=config.experiment.name - ) + #os.environ["WANDB_MODE"] = "offline" + # run=wandb.init( + # project=config.experiment.logging.wandb_proj_name, + # name=config.experiment.name + # ) # run.define_metric("train reward", step_metric="episode") # run.define_metric("episode error", step_metric="episode") # change location of experiment directory - config.train.output_dir = os.path.abspath(os.path.join("./logs", args.log_dir, args.task)) + config.train.output_dir = os.path.abspath(os.path.join("", args.log_dir, args.task)) original_output_dir = config.train.output_dir log_dirs, ckpt_dirs, video_dirs = [], [], [] @@ -490,7 +491,7 @@ def main(args: argparse.Namespace): except Exception as e: res_str = f"run failed with error:\n{e}\n\n{traceback.format_exc()}" print(res_str) - run.finish() + # run.finish() if __name__ == "__main__": diff --git a/scripts/tools/copy_metadata_hdf5.py b/scripts/tools/copy_metadata_hdf5.py new file mode 100644 index 000000000000..85fbcc84bf1b --- /dev/null +++ b/scripts/tools/copy_metadata_hdf5.py @@ -0,0 +1,32 @@ +import h5py +import json + +# File and group +HDF5_FILE = "docs/subset_first5.hdf5" +DATA_GROUP = "data" + +# Metadata to add +metadata = { + "env_name": "Cube-Mimic-v0", + "type": 2, + "sim_args": { + "dt": 0.01, + "decimation": 2, + "render_interval": 2, + "num_envs": 1 + } +} + +# Open file in append mode +with h5py.File(HDF5_FILE, "a") as f: + data_group = f[DATA_GROUP] + + # Store each top-level key as an attribute + for key, value in metadata.items(): + if isinstance(value, dict): + # Convert nested dicts to JSON string + data_group.attrs[key] = json.dumps(value) + else: + data_group.attrs[key] = value + +print(f"✅ Metadata added to /{DATA_GROUP}") diff --git a/scripts/tools/hdf5_splitter.py b/scripts/tools/hdf5_splitter.py new file mode 100644 index 000000000000..a16e9d07e1fe --- /dev/null +++ b/scripts/tools/hdf5_splitter.py @@ -0,0 +1,60 @@ +import h5py +import numpy as np + +# ----------------------------- +# CONFIG +# ----------------------------- +INPUT_FILE = "docs/beaker_lift_new_start_skillgen_annotated.hdf5" +OUTPUT_FILE = "docs/subset_first5_clean.hdf5" +DATA_GROUP = "data" +DEMO_PREFIX = "demo_" +NUM_DEMOS = 5 + +# Metadata groups to copy (common in IsaacLab) +METADATA_GROUPS = ["meta", "env", "info", "config", "episodes", "stats"] + +# ----------------------------- +# STEP 1: Create subset HDF5 +# ----------------------------- +with h5py.File(INPUT_FILE, "r") as src, h5py.File(OUTPUT_FILE, "w") as dst: + # 1. Copy root attributes + for k, v in src.attrs.items(): + dst.attrs[k] = v + + # 2. Copy metadata groups + for g in METADATA_GROUPS: + if g in src: + src.copy(src[g], dst, name=g) + print(f"✅ Copied metadata group: /{g}") + + # 3. Copy /data group and first N demos + src_data = src[DATA_GROUP] + dst_data = dst.create_group(DATA_GROUP) + + demo_keys = sorted([k for k in src_data.keys() if k.startswith(DEMO_PREFIX)])[:NUM_DEMOS] + + for key in demo_keys: + src.copy(src_data[key], dst_data, name=key) + print(f"✅ Copied demo: /{DATA_GROUP}/{key}") + + # ----------------------------- + # STEP 2: Trim metadata arrays to match only the first N demos + # ----------------------------- + # Example metadata: episodes/episode_lengths, episodes/episode_starts, etc. + if "episodes" in dst: + episodes_group = dst["episodes"] + for name, dataset in episodes_group.items(): + if isinstance(dataset, h5py.Dataset): + # Trim first NUM_DEMOS entries + new_data = dataset[0:NUM_DEMOS] + del episodes_group[name] + episodes_group.create_dataset(name, data=new_data) + print(f"✅ Trimmed episodes/{name} to first {NUM_DEMOS} entries") + + # Some attributes may reference total episodes/envs + for attr_key in ["num_episodes", "num_envs"]: + if attr_key in dst.attrs: + dst.attrs[attr_key] = NUM_DEMOS + print(f"✅ Updated root attribute: {attr_key}={NUM_DEMOS}") + +print(f"\n🎉 Subset with {NUM_DEMOS} demos created successfully: {OUTPUT_FILE}") diff --git a/source/isaaclab/isaaclab/envs/mdp/events.py b/source/isaaclab/isaaclab/envs/mdp/events.py index c0c3afd618bf..e0739f12e182 100644 --- a/source/isaaclab/isaaclab/envs/mdp/events.py +++ b/source/isaaclab/isaaclab/envs/mdp/events.py @@ -1045,6 +1045,62 @@ def reset_root_state_uniform( asset.write_root_pose_to_sim(torch.cat([positions, orientations], dim=-1), env_ids=env_ids) asset.write_root_velocity_to_sim(velocities, env_ids=env_ids) +def reset_multiple_root_state_uniform( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + pose_range: dict[str, tuple[float, float]], + velocity_range: dict[str, tuple[float, float]], + asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + asset2_cfg: SceneEntityCfg=SceneEntityCfg("stirplate") +): + """Reset the asset root state to a random position and velocity uniformly within the given ranges. + + This function randomizes the root position and velocity of the asset. + + * It samples the root position from the given ranges and adds them to the default root position, before setting + them into the physics simulation. + * It samples the root orientation from the given ranges and sets them into the physics simulation. + * It samples the root velocity from the given ranges and sets them into the physics simulation. + + The function takes a dictionary of pose and velocity ranges for each axis and rotation. The keys of the + dictionary are ``x``, ``y``, ``z``, ``roll``, ``pitch``, and ``yaw``. The values are tuples of the form + ``(min, max)``. If the dictionary does not contain a key, the position or velocity is set to zero for that axis. + """ + # extract the used quantities (to enable type-hinting) + asset: RigidObject | Articulation = env.scene[asset_cfg.name] + asset2: RigidObject | Articulation = env.scene[asset2_cfg.name] + # get default root state + root_states = asset.data.default_root_state[env_ids].clone() + root_states2 = asset2.data.default_root_state[env_ids].clone() + # poses + range_list = [pose_range.get(key, (0.0, 0.0)) for key in ["x", "y", "z", "roll", "pitch", "yaw"]] + ranges = torch.tensor(range_list, device=asset.device) + #print(f"ranges : {ranges}") + rand_samples = math_utils.sample_uniform(ranges[:, 0], ranges[:, 1], (len(env_ids), 6), device=asset.device) + + positions = root_states[:, 0:3] + env.scene.env_origins[env_ids] + rand_samples[:, 0:3] + #print(f"positions : ", positions) + + orientations_delta = math_utils.quat_from_euler_xyz(rand_samples[:, 3], rand_samples[:, 4], rand_samples[:, 5]) + orientations = math_utils.quat_mul(root_states[:, 3:7], orientations_delta) + orientations2_delta = math_utils.quat_from_euler_xyz(rand_samples[:, 3], rand_samples[:, 4], rand_samples[:, 5]) + orientations2 = math_utils.quat_mul(root_states2[:, 3:7], orientations_delta) + + # velocities + range_list = [velocity_range.get(key, (0.0, 0.0)) for key in ["x", "y", "z", "roll", "pitch", "yaw"]] + ranges = torch.tensor(range_list, device=asset.device) + rand_samples = math_utils.sample_uniform(ranges[:, 0], ranges[:, 1], (len(env_ids), 6), device=asset.device) + + velocities = root_states[:, 7:13] + rand_samples + positions[:,2] += 0.06 + # set into the physics simulation + asset.write_root_pose_to_sim(torch.cat([positions, orientations], dim=-1), env_ids=env_ids) + asset.write_root_velocity_to_sim(velocities, env_ids=env_ids) + # remote iks plate offset + positions[:,0] += 0.04 + positions[:,2] -= 0.06 + asset2.write_root_pose_to_sim(torch.cat([positions, orientations2], dim=-1), env_ids=env_ids) + asset2.write_root_velocity_to_sim(velocities, env_ids=env_ids) def reset_root_state_with_random_orientation( env: ManagerBasedEnv, @@ -1519,12 +1575,7 @@ class randomize_visual_color(ManagerTermBase): """ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): - """Initialize the randomization term. - - Args: - cfg: The configuration of the event term. - env: The environment instance. - """ + """Initialize the randomization term.""" super().__init__(cfg, env) # enable replicator extension if not already enabled @@ -1534,6 +1585,8 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): # read parameters from the configuration asset_cfg: SceneEntityCfg = cfg.params.get("asset_cfg") + colors = cfg.params.get("colors") + event_name = cfg.params.get("event_name") mesh_name: str = cfg.params.get("mesh_name", "") # type: ignore # check to make sure replicate_physics is set to False, else raise error @@ -1555,51 +1608,27 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv): mesh_prim_path = f"{asset.cfg.prim_path}{mesh_name}" # TODO: Need to make it work for multiple meshes. - # extract the replicator version - version = re.match(r"^(\d+\.\d+\.\d+)", rep.__file__.split("/")[-5][21:]).group(1) - - # use different path for different version of replicator - if compare_versions(version, "1.12.4") < 0: - colors = cfg.params.get("colors") - event_name = cfg.params.get("event_name") - - # parse the colors into replicator format - if isinstance(colors, dict): - # (r, g, b) - low, high --> (low_r, low_g, low_b) and (high_r, high_g, high_b) - color_low = [colors[key][0] for key in ["r", "g", "b"]] - color_high = [colors[key][1] for key in ["r", "g", "b"]] - colors = rep.distribution.uniform(color_low, color_high) - else: - colors = list(colors) - - # Create the omni-graph node for the randomization term - def rep_color_randomization(): - prims_group = rep.get.prims(path_pattern=mesh_prim_path) - with prims_group: - rep.randomizer.color(colors=colors) - - return prims_group.node - - # Register the event to the replicator - with rep.trigger.on_custom_event(event_name=event_name): - rep_color_randomization() + # parse the colors into replicator format + if isinstance(colors, dict): + # (r, g, b) - low, high --> (low_r, low_g, low_b) and (high_r, high_g, high_b) + color_low = [colors[key][0] for key in ["r", "g", "b"]] + color_high = [colors[key][1] for key in ["r", "g", "b"]] + colors = rep.distribution.uniform(color_low, color_high) else: - stage = get_current_stage() - prims_group = rep.functional.get.prims(path_pattern=mesh_prim_path, stage=stage) + colors = list(colors) - num_prims = len(prims_group) - self.color_rng = rep.rng.ReplicatorRNG() + # Create the omni-graph node for the randomization term + def rep_texture_randomization(): + prims_group = rep.get.prims(path_pattern=mesh_prim_path) - # Create the material first and bind it to the prims - for i, prim in enumerate(prims_group): - # Disable instancble - if prim.IsInstanceable(): - prim.SetInstanceable(False) + with prims_group: + rep.randomizer.color(colors=colors) - # TODO: Should we specify the value when creating the material? - self.material_prims = rep.functional.create_batch.material( - mdl="OmniPBR.mdl", bind_prims=prims_group, count=num_prims, project_uvw=True - ) + return prims_group.node + + # Register the event to the replicator + with rep.trigger.on_custom_event(event_name=event_name): + rep_texture_randomization() def __call__( self, @@ -1610,34 +1639,11 @@ def __call__( colors: list[tuple[float, float, float]] | dict[str, tuple[float, float]], mesh_name: str = "", ): - # note: This triggers the nodes for all the environments. - # We need to investigate how to make it happen only for a subset based on env_ids. - - # we import the module here since we may not always need the replicator + # import replicator import omni.replicator.core as rep - version = re.match(r"^(\d+\.\d+\.\d+)", rep.__file__.split("/")[-5][21:]).group(1) - - # use different path for different version of replicator - if compare_versions(version, "1.12.4") < 0: - rep.utils.send_og_event(event_name) - else: - colors = colors if colors else self._cfg.params.get("colors") - - # parse the colors into replicator format - if isinstance(colors, dict): - # (r, g, b) - low, high --> (low_r, low_g, low_b) and (high_r, high_g, high_b) - color_low = [colors[key][0] for key in ["r", "g", "b"]] - color_high = [colors[key][1] for key in ["r", "g", "b"]] - colors = [color_low, color_high] - else: - colors = list(colors) - - num_prims = len(self.material_prims) - random_colors = self.color_rng.generator.uniform(colors[0], colors[1], size=(num_prims, 3)) - - rep.functional.modify.attribute(self.material_prims, "diffuse_color_constant", random_colors) - + # only send the event to the replicator + rep.utils.send_og_event(event_name) """ Internal helper functions. diff --git a/source/isaaclab/isaaclab/utils/datasets/hdf5_dataset_file_handler.py b/source/isaaclab/isaaclab/utils/datasets/hdf5_dataset_file_handler.py index 2fa35ca1533a..13f07dddf378 100644 --- a/source/isaaclab/isaaclab/utils/datasets/hdf5_dataset_file_handler.py +++ b/source/isaaclab/isaaclab/utils/datasets/hdf5_dataset_file_handler.py @@ -81,9 +81,13 @@ def set_env_name(self, env_name: str): def get_env_name(self) -> str | None: """Get the environment name.""" self._raise_if_not_initialized() - env_args = json.loads(self._hdf5_data_group.attrs["env_args"]) - if "env_name" in env_args: - return env_args["env_name"] + try: + env_args = json.loads(self._hdf5_data_group.attrs["env_args"]) + if "env_name" in env_args: + return env_args["env_name"] + + except: + return "Cube-Mimic-v0" return None def get_episode_names(self) -> Iterable[str]: diff --git a/source/isaaclab_assets/isaaclab_assets/__init__.py b/source/isaaclab_assets/isaaclab_assets/__init__.py index 5b4a782caffa..4c0a0182484b 100644 --- a/source/isaaclab_assets/isaaclab_assets/__init__.py +++ b/source/isaaclab_assets/isaaclab_assets/__init__.py @@ -22,3 +22,4 @@ from .robots import * from .sensors import * +from .glassware import * \ No newline at end of file diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py index 698abcab7c7a..b73ed476a072 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py @@ -6,7 +6,7 @@ from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig from isaaclab.utils import configclass -from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_cfg import FrankaDevEnvCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_obs import FrankaDevEnvCfg @configclass diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py index 982b1320bac6..cf0eb52fdc4f 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py @@ -6,7 +6,7 @@ from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig from isaaclab.utils import configclass -from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_cfg import FrankaDevEnvCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_obs import FrankaDevEnvCfg @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py index f290d45c4b1a..4059bfcf8045 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py @@ -130,11 +130,12 @@ entry_point="isaaclab.envs:ManagerBasedRLEnv", kwargs={ "env_cfg_entry_point": f"{__name__}.dev_ik_rel_env_obs:FrankaDevEnvCfg", - "robomimic_bc_rnn_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), - "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc.json"), + }, disable_env_checker=True, ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json index 6b09227a280f..db8907778f4b 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json @@ -1,13 +1,13 @@ { "algo_name": "bc", "experiment": { - "name": "bc_new_demos", + "name": "bc_med_data_", "validate": true, "logging": { "terminal_output_to_txt": true, "log_tb": true, "log_wandb": true, - "wandb_proj_name": "Lift_beaker_new_demos" + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" }, "save": { "enabled": true, @@ -20,7 +20,7 @@ }, "epoch_every_n_steps": 100, "validation_epoch_every_n_steps": 10, - "env": "Dev-IK-Rel-v0", + "env": "Dev-IK-Rel-v1", "additional_envs": null, "render": false, "render_video": true, @@ -36,8 +36,8 @@ }, "train": { "data": null, - "output_dir": "/training_runs/bc_rnn", - "num_data_workers": 1, + "output_dir": "docs/training_runs/bc_rnn", + "num_data_workers": 4, "hdf5_cache_mode": "low_dim", "hdf5_use_swmr": true, "hdf5_normalize_obs": false, @@ -76,7 +76,7 @@ "l1_weight": 0.0, "cos_weight": 0.0 }, - "actor_layer_dims": [], + "gmm": { "enabled": true, "num_modes": 10, @@ -84,9 +84,7 @@ "std_activation": "softplus", "low_noise_eval": true }, - "vae": { - "enabled": false - }, + "rnn": { "enabled": true, "horizon": 10, @@ -97,21 +95,8 @@ "kwargs": { "bidirectional": false } - }, - "transformer": { - "enabled": false, - "context_length": 10, - "embed_dim": 512, - "num_layers": 6, - "num_heads": 8, - "emb_dropout": 0.1, - "attn_dropout": 0.1, - "block_output_dropout": 0.1, - "sinusoidal_embedding": false, - "activation": "gelu", - "supervise_all_steps": false, - "nn_parameter_for_timesteps": true } + }, "observation": { "modalities": { diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_temp.json similarity index 100% rename from source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc.json rename to source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_temp.json diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py index bdf7eb7a81cc..896391c9b6dd 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py @@ -14,7 +14,7 @@ from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp from isaaclab_tasks.manager_based.manipulation.cube_lift.lift_env_cfg import CubeEnvCfg -#from isaaclab_assets.glassware.glassware_objects import Chem_Assets +from isaaclab_assets.glassware.glassware import ChemistryGlassware import math @@ -71,9 +71,13 @@ def __post_init__(self): self.commands.object_pose.body_name = "panda_hand" self.commands.object_pose.body_name = "panda_hand" - # glassware = Chem_Assets() + glassware = ChemistryGlassware() # Set each stacking cube deterministically - #self.scene.object = glassware.beaker(pos=[0.5, 0.0, 0.01],name="Object") + self.scene.object = glassware.beaker(pos=[0.5, 0.0, 0.02], rot=[0, 0, 1, 0],name="Object") + #self.scene.object = glassware.flask(pos=[0.5, 0.0, 0.03], rot=[0, 0, 1, 0],name="Object", scale=(0.7,0.7,0.7)) + #self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + #self.scene.object = glassware.vial(pos=[0.5, 0.0, 0.02], rot=[0, 0, 1, 0],name="Object") + #### everything else leave default # self.scene.flask = glassware.flask() # self.scene.vial = glassware.vial() @@ -83,22 +87,22 @@ def __post_init__(self): # self.scene.obstacle = glassware.cube_obs(pos= [0.8, -0.8, 0.0],rot=[0, 0, 1, 0], name="cube_obs") #self.scene.obstacle = glassware.stirplate(pos= [0.5, -0.32, 0.0],rot=[0.707, 0, 0, -0.707], name="cube_obs") # self.scene.obstacle = glassware.stirplate(pos= [0.8, -0.8, 0.0], rot=[0.707, 0, 0, -0.707], name="cube_obs") - self.scene.object = RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Object", - init_state=RigidObjectCfg.InitialStateCfg( pos=[0.5, 0.0, 0.02],rot=[0, 0, 1, 0]), - spawn=UsdFileCfg( - usd_path=f"source/isaaclab_assets/isaaclab_assets/glassware/beaker/beaker.usd", - scale=(0.5, 0.5, 0.5), - rigid_props=RigidBodyPropertiesCfg( - solver_position_iteration_count=16, - solver_velocity_iteration_count=1, - max_angular_velocity=1000.0, - max_linear_velocity=1000.0, - max_depenetration_velocity=5.0, - disable_gravity=False, - ), - ), - ) + # self.scene.object = RigidObjectCfg( + # prim_path="{ENV_REGEX_NS}/Object", + # init_state=RigidObjectCfg.InitialStateCfg( pos=[0.5, 0.0, 0.02],rot=[0, 0, 1, 0]), + # spawn=UsdFileCfg( + # usd_path=f"source/isaaclab_assets/isaaclab_assets/glassware/beaker/beaker.usd", + # scale=(0.5, 0.5, 0.5), + # rigid_props=RigidBodyPropertiesCfg( + # solver_position_iteration_count=16, + # solver_velocity_iteration_count=1, + # max_angular_velocity=1000.0, + # max_linear_velocity=1000.0, + # max_depenetration_velocity=5.0, + # disable_gravity=False, + # ), + # ), + # ) # Listens to the required transforms marker_cfg = FRAME_MARKER_CFG.copy() marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py index 4332e690b196..9404c5d07aae 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py @@ -6,22 +6,55 @@ from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg from isaaclab.utils import configclass -from isaaclab.assets import RigidObjectCfg - +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.managers import EventTermCfg as EventTerm from . import dev_env_cfg - +import math +from isaaclab.managers import SceneEntityCfg +from isaaclab_assets.glassware.glassware import ChemistryGlassware +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp ## # Pre-defined configs ## from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip -#from isaaclab_assets.glassware.glassware_objects import Chem_Assets + + @configclass class FrankaDevEnvCfg(dev_env_cfg.FrankaDevEnvCfg): def __post_init__(self): # post init of parent super().__post_init__() - + # put the beaker on the stir plate + glassware = ChemistryGlassware() + self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + self.events.reset_object_position = EventTerm( + func=mdp.reset_multiple_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + "asset2_cfg" : SceneEntityCfg("stirplate") + }, + ) + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) # replace with relative position controller self.actions.arm_action = DifferentialInverseKinematicsActionCfg( asset_name="robot", @@ -29,10 +62,9 @@ def __post_init__(self): body_name="panda_hand", controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), scale=0.5, - body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), ) - # glassware = Chem_Assets() - #self.scene.obstacle = glassware.cube_obs(pos= [0.5, -0.1, 0.0],rot=[0, 0, 1, 0], name="cube_obs") + diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index 5fa05b6c8f4e..a2b7772d26c5 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -143,8 +143,8 @@ class PolicyCfg(ObsGroup): #robot_pose=ObsTerm(func=mdp.robot_pose) #object_to_target = ObsTerm(func=mdp.position_command_error) #norm_error = ObsTerm(func=mdp.object_goal_norm_error) - abs_joint_pos = ObsTerm(func=mdp.get_joint_pos) - object_knocked = ObsTerm(func=mdp.object_knocked) + # abs_joint_pos = ObsTerm(func=mdp.get_joint_pos) + #object_knocked = ObsTerm(func=mdp.object_knocked) def __post_init__(self): self.enable_corruption = False self.concatenate_terms = False @@ -225,7 +225,7 @@ class EventCfg: func=mdp.reset_root_state_uniform, mode="reset", params={ - "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.05, 0.1)}, + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.05)}, "velocity_range": {}, "asset_cfg": SceneEntityCfg("object", body_names="Object"), }, @@ -242,6 +242,10 @@ class EventCfg: "scale_range": {"x": (0.5, 0.5), "y": (0.5, 0.5), "z": (0.6, 0.7)}, "asset_cfg": SceneEntityCfg("object", body_names="Object"), }, + # params={ + # "scale_range": {"x": (1.0, 1.0), "y": (1.0, 1.0), "z": (1.0, 1.0)}, + # "asset_cfg": SceneEntityCfg("object", body_names="Object"), + # }, ) @@ -298,6 +302,7 @@ class TerminationsCfg: object_dropping = DoneTerm( func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("object")} ) + object_tipped = DoneTerm(func=mdp.object_knocked) #fix object dropping success = DoneTerm(func=mdp.object_near_goal) From cbd95bab30916c7440fd3ff0410290a37e43c85b Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Wed, 15 Oct 2025 17:37:25 +0100 Subject: [PATCH 03/15] added source docs to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 18d749f04b96..4cf7259980ca 100644 --- a/.gitignore +++ b/.gitignore @@ -71,7 +71,7 @@ _build /datasets/ /franka_robotiq/ /source/isaaclab_assets/ - +/docs/source # Tests tests/ From a804d8e91a525cda06f28fa6fcb258f7b67c0c1b Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Thu, 30 Oct 2025 16:05:51 +0000 Subject: [PATCH 04/15] backup controller borked --- docker/Dockerfile.base | 4 +- docker/docker-compose.yaml | 4 +- .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015111922/config.json | 219 +++++++ .../bc_med_data_/20251015094239/config.json | 219 +++++++ .../bc_med_data_/20251015094240/config.json | 219 +++++++ .../bc_med_data_/20251015094240/config.json | 219 +++++++ .../bc_med_data_/20251015094240/config.json | 219 +++++++ .../bc_med_data_/20251015094241/config.json | 219 +++++++ .../robomimic/play_controller.py | 287 ++++++++ .../robomimic/play_ensemble.py | 617 +++++++++--------- .../tutorials/05_controllers/run_diff_ik.py | 23 +- .../05_controllers/run_diff_ik_rel.py | 250 +++++++ .../isaaclab/controllers/differential_ik.py | 3 + .../isaaclab/envs/mdp/terminations.py | 2 + source/isaaclab/isaaclab/safety/__init__.py | 1 + .../isaaclab/safety/switchingLogic.py | 47 ++ .../config/franka/dev_ik_rel_env_place.py | 82 +++ .../manipulation/cube_lift/lift_env_cfg.py | 6 +- .../cube_lift/mdp/observations.py | 6 +- 28 files changed, 4281 insertions(+), 336 deletions(-) create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model0/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model1/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model2/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model3/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model4/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model5/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model6/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model7/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model8/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/Dev-IK-Rel-v1/model9/bc_med_data_/20251015111922/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model5/bc_med_data_/20251015094239/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model6/bc_med_data_/20251015094240/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model7/bc_med_data_/20251015094240/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model8/bc_med_data_/20251015094240/config.json create mode 100644 docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/bc_med_data_/20251015094241/config.json create mode 100644 scripts/imitation_learning/robomimic/play_controller.py create mode 100644 scripts/tutorials/05_controllers/run_diff_ik_rel.py create mode 100644 source/isaaclab/isaaclab/safety/__init__.py create mode 100644 source/isaaclab/isaaclab/safety/switchingLogic.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 4ebf8291ca03..53f528244e25 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -120,8 +120,8 @@ ENV CUDA_HOME=/usr/local/cuda-12.8 ENV PATH=${CUDA_HOME}/bin:${PATH} ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH} ENV TORCH_CUDA_ARCH_LIST=8.0+PTX -RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation \ - "nvidia-curobo @ git+https://github.com/NVlabs/curobo.git@ebb71702f3f70e767f40fd8e050674af0288abe8" +# RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation \ +# "nvidia-curobo @ git+https://github.com/NVlabs/curobo.git@ebb71702f3f70e767f40fd8e050674af0288abe8" # aliasing isaaclab.sh and python for convenience RUN echo "export ISAACLAB_PATH=${ISAACLAB_PATH}" >> ${HOME}/.bashrc && \ echo "alias isaaclab=${ISAACLAB_PATH}/isaaclab.sh" >> ${HOME}/.bashrc && \ diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index cde0175a7996..f1cf86c2daa9 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -113,7 +113,7 @@ services: devices: - /dev/hidraw0:/dev/hidraw0 - /dev/hidraw1:/dev/hidraw1 - # - /dev/hidraw2:/dev/hidraw2 + - /dev/hidraw2:/dev/hidraw2 # This service adds a ROS2 Humble # installation on top of the base image @@ -146,7 +146,7 @@ services: devices: - /dev/hidraw0:/dev/hidraw0 - /dev/hidraw1:/dev/hidraw1 - # - /dev/hidraw2:/dev/hidraw2 + - /dev/hidraw2:/dev/hidraw2 volumes: # isaac-sim diff --git a/docs/training_runs/Dev-IK-Rel-v1/model0/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model0/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model0/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model1/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model1/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model1/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model2/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model2/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model2/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model3/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model3/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model3/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model4/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model4/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model4/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model5/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model5/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model5/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model6/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model6/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model6/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model7/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model7/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model7/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model8/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model8/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model8/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/Dev-IK-Rel-v1/model9/bc_med_data_/20251015111922/config.json b/docs/training_runs/Dev-IK-Rel-v1/model9/bc_med_data_/20251015111922/config.json new file mode 100644 index 000000000000..619458cefb42 --- /dev/null +++ b/docs/training_runs/Dev-IK-Rel-v1/model9/bc_med_data_/20251015111922/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model5/bc_med_data_/20251015094239/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model5/bc_med_data_/20251015094239/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model5/bc_med_data_/20251015094239/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model6/bc_med_data_/20251015094240/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model6/bc_med_data_/20251015094240/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model6/bc_med_data_/20251015094240/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model7/bc_med_data_/20251015094240/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model7/bc_med_data_/20251015094240/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model7/bc_med_data_/20251015094240/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model8/bc_med_data_/20251015094240/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model8/bc_med_data_/20251015094240/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model8/bc_med_data_/20251015094240/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/bc_med_data_/20251015094241/config.json b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/bc_med_data_/20251015094241/config.json new file mode 100644 index 000000000000..36406eafde29 --- /dev/null +++ b/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/bc_med_data_/20251015094241/config.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-v1", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + } + }, + "train": { + "data": "docs/beaker_lift_subset_generated_normalized.hdf5", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn_ensemble_mid_data/Dev-IK-Rel-v1/model9/", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/play_controller.py b/scripts/imitation_learning/robomimic/play_controller.py new file mode 100644 index 000000000000..1246c87535ab --- /dev/null +++ b/scripts/imitation_learning/robomimic/play_controller.py @@ -0,0 +1,287 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# run this script: +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play_ensemble.py --device cuda --task Dev-IK-Rel-v0 --num_rollouts 100 +# stack cube task: ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 +"""Script to play and evaluate a trained policy from robomimic. + +This script loads a robomimic policy and plays it in an Isaac Lab environment. + +Args: + task: Name of the environment. + checkpoint: Path to the robomimic policy checkpoint. + horizon: If provided, override the step horizon of each rollout. + num_rollouts: If provided, override the number of rollouts. + seed: If provided, overeride the default random seed. + norm_factor_min: If provided, minimum value of the action space normalization factor. + norm_factor_max: If provided, maximum value of the action space normalization factor. +""" + +"""Launch Isaac Sim Simulator first.""" + + +import argparse + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") +parser.add_argument("--video", action="store_true", default=False, help="Record videos during training.") +parser.add_argument("--video_length", type=int, default=800, help="Length of the recorded video (in steps).") +parser.add_argument( + "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." +) +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--checkpoint", type=str, default=None, help="Pytorch model checkpoint to load.") +parser.add_argument("--horizon", type=int, default=2000, help="Step horizon of each rollout.") +parser.add_argument("--num_rollouts", type=int, default=1, help="Number of rollouts.") +parser.add_argument("--seed", type=int, default=101, help="Random seed.") +parser.add_argument( + "--norm_factor_min", type=float, default=None, help="Optional: minimum value of the normalization factor." +) +parser.add_argument( + "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." +) +parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") + +parser.add_argument("--model_name", type=str, default=None) + +group = parser.add_mutually_exclusive_group() +group.add_argument("--use_recovery", type=bool ,default= False, help="Enable recovery mechanism. By default recovery is enabled.") + +parser.add_argument("--ensemble_size", type=int, default=10) + +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim + # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter + import pinocchio # noqa: F401 +import numpy as np +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import time +import copy +import random +import os +import gymnasium as gym +import torch +import math +from collections import deque + +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.torch_utils as TorchUtils +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp.observations import get_joint_pos, object_grasped +#from chills.tasks.mdp.observations import get_joint_pos, object_grasped +if args_cli.enable_pinocchio: + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from isaaclab_tasks.utils import parse_env_cfg +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType +from isaaclab.utils.math import matrix_from_quat, convert_quat, quat_mul, euler_xyz_from_quat +from evaluation import ensemble_uncertainty +from isaaclab.safety.switchingLogic import SwitchingLogic +from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg +from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat +from isaaclab.managers import SceneEntityCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg + +#import chills.tasks +#from chills.tasks.mdp import upright_tilt_deg + +def rollout_ensemble(env, success_term, horizon, device): + """Perform a single rollout of the policy in the environment. + + Args: + policy: The robomimicpolicy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + + Returns: + terminated: Whether the rollout terminated. + traj: The trajectory of the rollout. + """ + + + obs_dict, _ = env.reset() + #print(f"obs_dict type: {type(obs_dict)},\nobs_dict contents:\n {obs_dict}") + + traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], + uncertainties=[], min_actions=[], max_actions=[], + time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[]) + + ###### SETUP SWITCHING LOGIC #### + + sim = env.unwrapped.sim + num_envs = env.num_envs + + + certain_joint_positions = [] + + ### SET USE RECOVERY TO FALSE #### + + + # Set up recovery controller + robot = env.unwrapped.scene["robot"] + print(f"Unwrapped sim : {sim}") + ee_recovery_pos = torch.tensor([[0.5206, 0.0096, 0.3751]], device=device) + + ee_recovery_rot = torch.tensor([[ 0.6664, 0.0360, 0.7414, -0.0705]], device=device) + # lets change this into the 6 element tensor they are expecting + roll,pitch,yaw = euler_xyz_from_quat(ee_recovery_rot) + ee_recovery_goal = torch.cat([ee_recovery_pos, ee_recovery_rot], dim =-1) + print(f"I got this roll {roll}, pitch {pitch}, yaw {yaw} and full tensor {torch.cat([roll, pitch, yaw], dim=-1)}\n i need to add with {ee_recovery_pos}") + ee_rpy = torch.cat([roll, pitch, yaw], dim=-1) + ee_rpy = ee_rpy.unsqueeze(0) + ee_goal = torch.cat([ee_recovery_pos, ee_rpy], dim=1) + # Create controller + diff_ik_cfg = DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls") + diff_ik_controller = DifferentialIKController(diff_ik_cfg, num_envs=env.unwrapped.scene.num_envs, device=sim.device) + + + robot_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_joint.*"], body_names=["panda_hand"]) + robot_entity_cfg.resolve(env.unwrapped.scene) + if robot.is_fixed_base: + ee_jacobi_idx = robot_entity_cfg.body_ids[0] - 1 + else: + ee_jacobi_idx = robot_entity_cfg.body_ids[0] + + print(f'Running for horizon {horizon}') + for i in range(horizon): + jacobian = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, robot_entity_cfg.joint_ids] + ee_pose_w = robot.data.body_pose_w[:, robot_entity_cfg.body_ids[0]] + root_pose_w = robot.data.root_pose_w + joint_pos = robot.data.joint_pos[:, robot_entity_cfg.joint_ids] + + # current EE pose in base frame + ee_pos_b, ee_quat_b = subtract_frame_transforms( + root_pose_w[:, 0:3], root_pose_w[:, 3:7], + ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] + ) + print(f"ee_pos_b {ee_pos_b}, ee_quat_b : {ee_quat_b}") + + # target EE pose (absolute, world frame → base frame) + target_pos_w = ee_recovery_pos # [1,3] + target_quat_w = ee_recovery_rot # [1,4] + target_pos_b, target_quat_b = subtract_frame_transforms( + root_pose_w[:, 0:3], root_pose_w[:, 3:7], + target_pos_w, target_quat_w + ) + print(f"target_pos_b {target_pos_b}, target_quat_b {target_quat_b}") + + # --- compute relative pose command (6D) --- + # translation delta + delta_pos = target_pos_b - ee_pos_b # [1,3] + print(f"Delta pos {delta_pos}") + # rotation delta (ΔR = R_target * R_currentᵀ) + delta_rot = target_quat_b - ee_quat_b + print(f"Delat Rot {delta_rot}") + # convert ΔR to euler angles (XYZ convention) + r,p,y = euler_xyz_from_quat(delta_rot, wrap_to_2pi=False) + print(f"[DEBUG] Delat R {r}, P {p}, Y {y}") + delta_rpy = torch.cat([r,p,y], dim=-1) + delta_rpy = torch.unsqueeze(delta_rpy,0) + print(f"[DEBUG] RPY {delta_rpy}") + # --- build relative command --- + ee_goal = torch.cat([delta_pos, delta_rpy], dim=-1) # [1,6] + + + # debug info + print(f"[DEBUG] ee_goal (Δx,Δy,Δz,Δr,Δp,Δy): {ee_goal}") + print(f"[DEBUG] Current pos_b: {ee_pos_b}") + print(f"[DEBUG] Target pos_b: {target_pos_b}") + + # --- send command to controller --- + diff_ik_controller.set_command(ee_goal, ee_pos_b, ee_quat_b) + + # compute joint targets + joint_pos_des = diff_ik_controller.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos) + + # (optional) denormalize actions if necessary + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ((actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min)) / 2 + args_cli.norm_factor_min + + # --- execute recovery movement --- + pos_err = torch.norm(target_pos_b - ee_pos_b) + actions=joint_pos_des + metrics = ensemble_uncertainty(ensemble, obs) + metrics['min']=actions + metrics['max']=actions + uncertainty = 0 + + if pos_err > 1e-3: + robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) + env.scene.write_data_to_sim() + obs_dict, _, terminated, truncated, _ = env.step(joint_pos_des) + else: + print(f"[Recovery] Target reached — ending recovery mode.") + recovery_mode = False + recovery_cooldown_active = True + print("[Recovery] Cooldown Activated.") + + + + + + + + +def main(): + """Run a trained policy from robomimic with Isaac Lab environment.""" + # parse configuration + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + + # Set observations to dictionary mode for Robomimic + env_cfg.observations.policy.concatenate_terms = False + + #create a log handler + # loghelper = LoggingHelper() + + + + # Disable recorder + env_cfg.recorders = None + + # Extract success checking function + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + arm_action = env_cfg.actions.arm_action + # Get timeout signal + timeout = env_cfg.terminations.time_out + #env_cfg.terminations.time_out = None + + # Create environment + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + + # Set seed9 + torch.manual_seed(args_cli.seed) + env.seed(args_cli.seed) + + # Acquire device + device = TorchUtils.get_torch_device(try_to_use_cuda=True) + + for trial in range(args_cli.num_rollouts): + print(f"[INFO] Starting trial {trial}") + + terminated, traj, recovery_activated_during_rollout = rollout_ensemble( env, success_term, args_cli.horizon, device) + # save the uncertainties + env.close() + + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/play_ensemble.py b/scripts/imitation_learning/robomimic/play_ensemble.py index 2286052e3f11..275f2199b98c 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble.py +++ b/scripts/imitation_learning/robomimic/play_ensemble.py @@ -29,6 +29,8 @@ # add argparse arguments parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") +parser.add_argument("--video", action="store_true", default=False, help="Record videos during training.") +parser.add_argument("--video_length", type=int, default=800, help="Length of the recorded video (in steps).") parser.add_argument( "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." ) @@ -86,8 +88,14 @@ from isaaclab_tasks.utils import parse_env_cfg #from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType -from isaaclab.utils.math import matrix_from_quat, convert_quat +from isaaclab.utils.math import matrix_from_quat, convert_quat, quat_mul, euler_xyz_from_quat from evaluation import ensemble_uncertainty +from isaaclab.safety.switchingLogic import SwitchingLogic +from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg +from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat +from isaaclab.managers import SceneEntityCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg + #import chills.tasks #from chills.tasks.mdp import upright_tilt_deg @@ -110,7 +118,7 @@ def rollout(policy, env, success_term, horizon, device): #print(f"obs_dict type: {type(obs_dict)},\nobs_dict contents:\n {obs_dict}") traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[]) - + for i in range(horizon): # Prepare observations obs = copy.deepcopy(obs_dict["policy"]) @@ -210,7 +218,21 @@ def has_fallen(asset, threshold: float = -0.7, debug: bool = True) -> bool: return uprightness > threshold -def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): +# this took me too long to work out i needed lol + +def quaternion_to_euler(q_w, q_x, q_y, q_z): + # Roll (x-axis rotation) + roll = math.atan2(2 * (q_w * q_x + q_y * q_z), 1 - 2 * (q_x**2 + q_y**2)) + + # Pitch (y-axis rotation) + pitch = math.asin(2 * (q_w * q_y - q_z * q_x)) + + # Yaw (z-axis rotation) + yaw = math.atan2(2 * (q_w * q_z + q_x * q_y), 1 - 2 * (q_y**2 + q_z**2)) + + return roll, pitch, yaw + +def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): """Perform a single rollout of the policy in the environment. Args: @@ -232,29 +254,65 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, u traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[], min_actions=[], max_actions=[], - time_taken=[], joint_pos=[], recovery=[]) + time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[]) - joints_to_check = [0, 1, 2, 3, 4, 5, 6] - unsafe_windows_detected = {joint_num: 0 for joint_num in joints_to_check} - windows = {joint_num: deque(maxlen=parameters[joint_num]['window_size']) for joint_num in joints_to_check} - certain_timestep = 50 + ###### SETUP SWITCHING LOGIC #### + switchingLogic = SwitchingLogic(parameters, horizon=horizon) + + sim = env.unwrapped.sim + num_envs = env.num_envs + + certain_joint_positions = [] ### SET USE RECOVERY TO FALSE #### - use_recovery=False + use_recovery=True recovery_activated_during_rollout = 0 + # Set up recovery controller + robot = env.unwrapped.scene["robot"] + print(f"Unwrapped sim : {sim}") + ee_recovery_pos = torch.tensor([[0.5206, 0.0096, 0.3751]], device=device) + + ee_recovery_rot = torch.tensor([[ 0.6664, 0.0360, 0.7414, -0.0705]], device=device) + # lets change this into the 6 element tensor they are expecting + roll,pitch,yaw = euler_xyz_from_quat(ee_recovery_rot) + ee_recovery_goal = torch.cat([ee_recovery_pos, ee_recovery_rot], dim =-1) + print(f"I got this roll {roll}, pitch {pitch}, yaw {yaw} and full tensor {torch.cat([roll, pitch, yaw], dim=-1)}\n i need to add with {ee_recovery_pos}") + ee_rpy = torch.cat([roll, pitch, yaw], dim=-1) + ee_rpy = ee_rpy.unsqueeze(0) + ee_goal = torch.cat([ee_recovery_pos, ee_rpy], dim=1) + # Create controller + diff_ik_cfg = DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls") + diff_ik_controller = DifferentialIKController(diff_ik_cfg, num_envs=env.unwrapped.scene.num_envs, device=sim.device) + + # diff_ik_action_controller = DifferentialInverseKinematicsActionCfg( + # asset_name="robot", + # joint_names=["panda_joint.*"], + # body_name="panda_hand", + # controller=diff_ik_controller, + # scale=0.5, + # body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + # ) + robot_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_joint.*"], body_names=["panda_hand"]) + robot_entity_cfg.resolve(env.unwrapped.scene) + if robot.is_fixed_base: + ee_jacobi_idx = robot_entity_cfg.body_ids[0] - 1 + else: + ee_jacobi_idx = robot_entity_cfg.body_ids[0] + #########SET TO FALSE ####### - recovery_mode = False + recovery_mode = True print("rollout recovery enabled ? : ", use_recovery) - recovery_duration = 100 - recovery_cooldown_duration = 100 # timesteps + + recovery_cooldown_duration = 300 # timesteps recovery_cooldown_timer = recovery_cooldown_duration recovery_cooldown_active = False recovery = [] + recovery_steps = 0 + print(f'Running for horizon {horizon}') for i in range(horizon): # Prepare observations - if bool(success_term.func(env, **success_term.params)[0]): - return True, traj, recovery_activated_during_rollout + obs = copy.deepcopy(obs_dict["policy"]) sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) object = env.unwrapped.scene["object"] @@ -266,7 +324,8 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, u for subob in sub_obs: sub_obs[subob] = torch.squeeze(sub_obs[subob]) - + if obs['object_knocked']: + print("object knocked over") # Check if environment image observations if hasattr(env.cfg, "image_obs_list"): # Process image observations for robomimic inference @@ -281,104 +340,119 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, u traj["obs"].append(obs) traj["sub_obs"].append(sub_obs) + object=env.unwrapped.scene['object'] #tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) #print("Tilt deg : ", tilt_deg.item()) - if recovery_mode: - print(f"Recovery Mode Started at Timestep {i}") - robot = env.unwrapped.scene["robot"] - tmp_pos = get_joint_pos(env) - # print("Temp, gripper a pos : ", tmp_pos[0][7]) - #print("Temp, gripper b pos : ", tmp_pos[0][8]) - safe_pos = None - if object_grasped(env): - # mid safe place - should help with the task of moving the beaker to the target - safe_pos = torch.tensor([[0.2932, 0.2640, -0.3573, -2.6099, -2.8971, 2.0274, 0.8245, tmp_pos[0][7], tmp_pos[0][8]]]).to(device) - else: - # origin - safe_pos = torch.tensor([[ 0.405,0.35,-0.22,-3,-2.85,math.pi/2,0.9, tmp_pos[0][7],tmp_pos[0][8]]]).to(device)# safe_pos = certain_joint_positions[-certain_timestep] - position_errors = deque(maxlen=50) - rec_i = 0 - - current = get_joint_pos(env) - target = safe_pos - steps = 200 # increase for slower motion - - for alpha in np.linspace(0, 1, steps): - recovery.append(True) - intermediate = (1 - alpha) * current + alpha * target - robot.set_joint_position_target(intermediate) + if recovery_mode and not recovery_cooldown_active: + print(f"[Recovery] Mode Timestep {i}") + + jacobian = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, robot_entity_cfg.joint_ids] + ee_pose_w = robot.data.body_pose_w[:, robot_entity_cfg.body_ids[0]] + root_pose_w = robot.data.root_pose_w + joint_pos = robot.data.joint_pos[:, robot_entity_cfg.joint_ids] + + # current EE pose in base frame + ee_pos_b, ee_quat_b = subtract_frame_transforms( + root_pose_w[:, 0:3], root_pose_w[:, 3:7], + ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] + ) + print(f"ee_pos_b {ee_pos_b}, ee_quat_b : {ee_quat_b}") + + # target EE pose (absolute, world frame → base frame) + target_pos_w = ee_recovery_pos # [1,3] + target_quat_w = ee_recovery_rot # [1,4] + target_pos_b, target_quat_b = subtract_frame_transforms( + root_pose_w[:, 0:3], root_pose_w[:, 3:7], + target_pos_w, target_quat_w + ) + print(f"target_pos_b {target_pos_b}, target_quat_b {target_quat_b}") + + # --- compute relative pose command (6D) --- + # translation delta + delta_pos = target_pos_b - ee_pos_b # [1,3] + print(f"Delta pos {delta_pos}") + # rotation delta (ΔR = R_target * R_currentᵀ) + delta_rot = target_quat_b - ee_quat_b + print(f"Delat Rot {delta_rot}") + # convert ΔR to euler angles (XYZ convention) + r,p,y = euler_xyz_from_quat(delta_rot, wrap_to_2pi=False) + print(f"[DEBUG] Delat R {r}, P {p}, Y {y}") + delta_rpy = torch.cat([r,p,y], dim=-1) + delta_rpy = torch.unsqueeze(delta_rpy,0) + print(f"[DEBUG] RPY {delta_rpy}") + # --- build relative command --- + ee_goal = torch.cat([delta_pos, delta_rpy], dim=-1) # [1,6] + + + # debug info + print(f"[DEBUG] ee_goal (Δx,Δy,Δz,Δr,Δp,Δy): {ee_goal}") + print(f"[DEBUG] Current pos_b: {ee_pos_b}") + print(f"[DEBUG] Target pos_b: {target_pos_b}") + + # --- send command to controller --- + diff_ik_controller.set_command(ee_goal, ee_pos_b, ee_quat_b) + + # compute joint targets + joint_pos_des = diff_ik_controller.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos) + + # (optional) denormalize actions if necessary + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ((actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min)) / 2 + args_cli.norm_factor_min + + # --- execute recovery movement --- + pos_err = torch.norm(target_pos_b - ee_pos_b) + actions=joint_pos_des + metrics = ensemble_uncertainty(ensemble, obs) + metrics['min']=actions + metrics['max']=actions + uncertainty = 0 + + if pos_err > 1e-3: + robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) env.scene.write_data_to_sim() - env.sim.step() - if bool(success_term.func(env, **success_term.params)[0]): - return True, traj, recovery_activated_during_rollout - - - - print(f"Recovery Mode Ended") - print("Recovery Cooldown Activated") - recovery_mode = False - recovery_cooldown_active = True - obs_dict, _, terminated, truncated, _ = env.step(torch.tensor([0 for _ in range(7)]).to(device).view(1, env.action_space.shape[1])) - obs = copy.deepcopy(obs_dict["policy"]) - for ob in obs: - obs[ob] = torch.squeeze(obs[ob]) - ensemble_uncertainty(ensemble, obs) + obs_dict, _, terminated, truncated, _ = env.step(joint_pos_des) + else: + print(f"[Recovery] Target reached — ending recovery mode.") + recovery_mode = False + recovery_cooldown_active = True + print("[Recovery] Cooldown Activated.") + + else: + env.unwrapped.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + recovery_steps=0 # Calculate uncertainty using the ensemble recovery.append(False) - if bool(success_term.func(env, **success_term.params)[0]): - return True, traj, recovery_activated_during_rollout - ## detect if we have tipped the object + ## detect if we have tipped the object metrics = ensemble_uncertainty(ensemble, obs) # Get the std and mean action uncertainty = metrics['variance'] actions = metrics['mean'] - # Add the uncertainty to all joint windows - for joint_num, unc in enumerate(uncertainty): - windows[joint_num].append(unc) - for joint_num in joints_to_check: - unc_threshold = parameters[joint_num]['unc_threshold'] - peaks = sum(1 for curr_unc in windows[joint_num] if curr_unc > unc_threshold) - if peaks > parameters[joint_num]['max_peaks']: - unsafe_windows_detected[joint_num] += 1 + # uncert went here - - for joint_num in joints_to_check: - ## less worried after the object grasped - if unsafe_windows_detected[joint_num] > parameters[joint_num]['max_uncertain_windows'] and not recovery_cooldown_active: - print(f"Joint {joint_num} is uncertain at timestep {i}, uncertainty is {uncertainty[joint_num]}") - unsafe_windows_detected[joint_num] = 0 - if use_recovery: - recovery_mode = True - recovery_activated_during_rollout += 1 - # if object_grasped(env): - - # else : - # ## more strict when grasping - # if (unsafe_windows_detected[joint_num] > (parameters[joint_num]['max_uncertain_windows']-1)) and not recovery_cooldown_active: - # print(f"Object not grapsed, using more strict uncertainty Joint {joint_num} is uncertain at timestep {i}, uncertainty is {uncertainty[joint_num]}") - # unsafe_windows_detected[joint_num] = 0 - # if obs_dict['subtask_terms']['appr_goal'].item(): - # # then we are placing the object , do not recover - # print("not activating recovery, object at goal") - # elif use_recovery: - # recovery_mode = True - # recovery_activated_during_rollout += 1 - - if use_recovery and not recovery_cooldown_active: - # print("not holding object, check if not hit it") - # print("observed tilt " , obs_dict['policy']['object_tilt']) - # if obs_dict['policy']['object_tilt'].item() > 5.0: - # print("Ucertainties when tilt : ",uncertainty) - # print("Object tilted, activating no tilt recovery ") - # print("observed tilt " , obs_dict['policy']['object_tilt']) - recovery_mode =True + + if switchingLogic.check(uncertainty, i) and not recovery_cooldown_active: + if use_recovery : + recovery_mode = True recovery_activated_during_rollout+=1 + + #check halfway thorough, if we havent managed grasp, lets reset and try again + if switchingLogic.halfway_check(i,sub_obs['grasp'].item()): + if use_recovery and not recovery_cooldown_active: + recovery_mode = True + if recovery_cooldown_active: if object_grasped(env): @@ -404,39 +478,62 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, u actions = ( (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) ) / 2 + args_cli.norm_factor_min - + # print(f"before shaping action : {actions}") actions = actions.to(device=device).view(1, env.action_space.shape[1]) # print(f"------------------------------") - # print(f"Policy action : {actions.tolist()}") + # print(f"Policy action {actions.shape} : {actions}") # Apply actions obs_dict, _, terminated, truncated, _ = env.step(actions) - obs = obs_dict["policy"] - sub_obs = obs_dict["subtask_terms"] - # print(f"Obs change : {obs}") - # Record trajectory - traj["actions"].append(actions.tolist()) - traj["next_obs"].append(obs) - traj['uncertainties'].append(uncertainty) - traj['max_actions'].append(metrics['max']) - traj['min_actions'].append(metrics['min']) - traj['time_taken'].append(metrics['time_taken']) - traj['joint_pos'].append(obs['abs_joint_pos']) - traj['recovery'].append(recovery) - + obs = obs_dict["policy"] + sub_obs = obs_dict["subtask_terms"] + # print(f"Obs change : {obs}") + # Record trajectory + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs) + traj['uncertainties'].append(uncertainty) + traj['max_actions'].append(metrics['max']) + traj['min_actions'].append(metrics['min']) + traj['time_taken'].append(metrics['time_taken']) + traj['joint_pos'].append(obs['abs_joint_pos']) + traj['recovery'].append(recovery) - # Check if rollout was successful - if bool(success_term.func(env, **success_term.params)[0]): - return True, traj, recovery_activated_during_rollout - elif terminated or truncated: - return False, traj, recovery_activated_during_rollout + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + traj['failure'].append(" ") + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) + print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + # print(f"grasp : {grasp.item()}, appr : {appr.item()}") + return True, traj, recovery_activated_during_rollout + + elif terminated or truncated: + + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) + #print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + if obs['object_knocked']: + + #if the failure was caused by object collision + traj['failure'].append("knocked") + else: + #if failure due to timeout, record timeout + traj['failure'].append("timeout") + return False, traj, recovery_activated_during_rollout #print("REcovery : ", traj["recovery"]) + traj['failure'].append("timeout") + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) return False, traj, recovery_activated_during_rollout -def safety(): - print(f"I'm Uncertain. {random.randint(0, 100)}") - return True + def rollout_transformer(policy, env, success_term, horizon, device): """Perform a single rollout of the policy in the environment, supporting sequence-based models.""" @@ -584,19 +681,6 @@ def rollout_transformer(policy, env, success_term, horizon, device): return False, traj -# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \ -# --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 \ -# --checkpoint /logs/docs/Models/bc/model1/Isaac-Stack-Cube-Franka-IK-Rel-v0/bc_rnn_low_dim_franka_stack/20250715152224/models/model_epoch_2000.pth - - -# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 10 --checkpoint logs/docs/Models/bc/model2/Isaac-Stack-Cube-Franka-IK-Rel-v0/bc_rnn_low_dim_franka_stack/20250715152538/models/model_epoch_2000.pth --headless - - - -# ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \ -# --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --algo bc \ -# --dataset ./docs/training_data/generated_dataset_split.hdf5 --logdir ./logs/docs/Models/bc/model8/ - def load_ensemble(device, ensemble_path): @@ -636,8 +720,7 @@ def main(): #create a log handler # loghelper = LoggingHelper() - # Set termination conditions - env_cfg.terminations.time_out = None + # Disable recorder env_cfg.recorders = None @@ -646,10 +729,14 @@ def main(): success_term = env_cfg.terminations.success env_cfg.terminations.success = None + # Get timeout signal + timeout = env_cfg.terminations.time_out + #env_cfg.terminations.time_out = None + # Create environment env = gym.make(args_cli.task, cfg=env_cfg).unwrapped - # Set seed + # Set seed9 torch.manual_seed(args_cli.seed) env.seed(args_cli.seed) @@ -657,151 +744,51 @@ def main(): device = TorchUtils.get_torch_device(try_to_use_cuda=True) # load the stack cube ensemble - # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') + # stack_cube_ensemble = load_ensembl*--------------e(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') - pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/high_qual_ensembles.txt') + pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/med_ensembles.txt') # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') - + # Lets set these to the 0.99 confidence parameters = { - 'stack_cube': { - 6: { - 'unc_threshold': 0.05, - 'max_peaks': 15, - 'window_size': 30, - 'max_uncertain_windows': 3 - }, - 5: { - 'unc_threshold': 0.06, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 - }, - - 4: { - 'unc_threshold': 0.04, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 - }, - 3: { - 'unc_threshold': 0.04, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 + 'beaker_lift' :{ + 0 : { + "confidence_level": 0.017165569182596162, + "window_size": 5, + "max_peaks": 5 }, - 2: { - 'unc_threshold': 0.04, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 + 1 : { + "confidence_level": 0.024839555704716736, + "window_size": 12, + "max_peaks": 4 }, - 1: { - 'unc_threshold': 0.04, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 + 2 : { + "confidence_level": 0.022856649849482057, + "window_size": 12, + "max_peaks": 5 }, - 0: { - 'unc_threshold': 0.04, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 - } - }, - - 'pick_place': { - 6: { - 'unc_threshold': 0.05, - 'max_peaks': 15, - 'window_size': 30, - 'max_uncertain_windows': 3 - }, - 5: { - 'unc_threshold': 0.02, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 1 - }, - - 4: { - 'unc_threshold': 0.03, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 + 3 : { + "confidence_level": 0.03564607457876469, + "window_size": 9, + "max_peaks": 5 }, - 3: { - 'unc_threshold': 0.03, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 + 4 : { + "confidence_level": 0.03087440802734071, + "window_size": 10, + "max_peaks": 3 }, - 2: { - 'unc_threshold': 0.02, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 + 5 : { + "confidence_level": 0.02323877457883784, + "window_size": 5, + "max_peaks": 4 }, - 1: { - 'unc_threshold': 0.03, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 + 6 : { + "confidence_level": 0.8432899916370529, + "window_size": 13, + "max_peaks": 4 }, - 0: { - 'unc_threshold': 0.03, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 - } - }, - 'stack_beaker': { - 6: { - 'unc_threshold': 0.05, - 'max_peaks': 15, - 'window_size': 30, - 'max_uncertain_windows': 3 - }, - 5: { - 'unc_threshold': 0.02, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 - }, - - 4: { - 'unc_threshold': 0.03, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 - }, - 3: { - 'unc_threshold': 0.03, - 'max_peaks': 5, - 'window_size': 10, - 'max_uncertain_windows': 3 - }, - 2: { - 'unc_threshold': 0.02, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 - }, - 1: { - 'unc_threshold': 0.03, - 'max_peaks': 5, - 'window_size': 10, - 'max_uncertain_windows': 3 - }, - 0: { - 'unc_threshold': 0.03, - 'max_peaks': 2, - 'window_size': 10, - 'max_uncertain_windows': 3 - }, - } } model_arch = "BC_RNN_GMM" @@ -827,11 +814,7 @@ def main(): os.makedirs(uncertainty_results_path, exist_ok=True) os.makedirs(trajectory_results_path, exist_ok=True) - # try: - # os.remove(rollout_log_path) - # except FileNotFoundError as filenotfounderror: - # pass - + # clear files clear_files( uncertainties_path, actions_path, @@ -839,32 +822,22 @@ def main(): time_taken_path, recovery_activated_during_rollout_path ) - #clear uncertainties file - with open(uncertainties_path, 'w') as file: - pass - with open(actions_path, 'w') as file: - pass - with open(min_actions_path, 'w') as file: - pass - with open(max_actions_path, 'w') as file: - pass - with open(time_taken_path, 'w') as file: - pass - with open(recovery_activated_during_rollout_path, 'w') as file: - pass - # clear rollout logger file - #with open(loghelper.namefile, 'w') as file: - # pass - # Run policy results = [] + failed_no_intervention =[] + intervention = [] + intervention_success = [] + intervention_failure = [] for trial in range(args_cli.num_rollouts): print(f"[INFO] Starting trial {trial}") - terminated, traj, recovery_activated_during_rollout = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['pick_place'], use_recovery=args_cli.use_recovery, rollout_num=trial) + terminated, traj, recovery_activated_during_rollout = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['beaker_lift'], use_recovery=args_cli.use_recovery, rollout_num=trial) # save the uncertainties print("Finished rollout, recovery needed : ", recovery_activated_during_rollout) #print("actions shape : ", traj['actions']) + + if not terminated: + print(f"failure : {traj['failure']}") for j in range(7): with open(f"docs/rollouts/rollout_logging_no_recovery_joint{j}.txt", "a") as file: #file.write(f"Logs for joint {j}\n") @@ -876,53 +849,53 @@ def main(): uncert = str(traj['uncertainties'][i].tolist()[j]) #print("joint pos : ", str(traj['joint_pos'][i][0].tolist()[j])) joint_pos = str(traj['joint_pos'][i][0].tolist()[j]) - recovery = str(traj['recovery'][0][i]) + recovery = "False"#str(traj['recovery'][0][i]) # print("writing recovery : ", recovery) line = f"{i} : {act} : {max} : {min} : {uncert} : {joint_pos}: {recovery}: {terminated}\n" file.write(line) - - + # this logs the outcome of the rollout - the failure methods for j in range(7): joint_uncert = [t[j].item() for t in traj['uncertainties']] with open(f"docs/rollouts/rollout_uncerts_joint{j}.txt", "a") as f: line = ",".join(["{:.10f}".format(v) for v in joint_uncert]) f.write(line + f" : {terminated} \n") + # for i in range(len(traj['failure'])): + with open(f"docs/rollouts/rollout_outcomes.txt", "a") as file: + if terminated: + # print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + #trialnum : outcome : recovery needed ? : failure mode : grasp subtask : appr subtask + line=f"{trial}: {terminated} : {recovery_activated_during_rollout} : : {True} : {True} \n" + else : + grasp = traj['grasp'][0] + appr = traj['appr'][0] + print(f"Subatask : {grasp} , {appr}") + line=f"{trial} : {terminated} : {recovery_activated_during_rollout} : {traj['failure'][0]} : {grasp} : {appr}\n" + # print(f"grasp : {traj['grasp'][0]}, appr : {traj['appr'][0]}") + file.write(line) - with open(uncertainties_path, 'a') as file: - for i, var in enumerate(traj['uncertainties']): - line = " ".join([str(v.item()) for v in var]) + f" {terminated}\n" - file.write(f"{str(i)} {line}") - # save the actions - with open(actions_path, 'a') as file: - for i, var in enumerate(traj['actions']): - line = " ".join([str(v) for v in var[0]]) + f" {terminated}\n" - file.write(f"{str(i)} {line}") - # save the max actions - with open(max_actions_path, 'a') as file: - for i, var in enumerate(traj['max_actions']): - line = " ".join([str(v.item()) for v in var[0]]) + f" {terminated}\n" - file.write(f"{str(i)} {line}") - # save the min actions - with open(min_actions_path, 'a') as file: - for i, var in enumerate(traj['min_actions']): - line = " ".join([str(v.item()) for v in var[0]]) + f" {terminated}\n" - file.write(f"{str(i)} {line}") - # save time taken - with open(time_taken_path, 'a') as file: - for i, time_taken in enumerate(traj['time_taken']): - line = f"{str(time_taken)} {terminated}\n" - file.write(f"{str(i)} {line}") - # save recovery activated - with open("recovery_actions.txt", 'a') as file: - file.write(f"{trial} {recovery_activated_during_rollout} {terminated}\n") - - + results.append(terminated) + if not terminated: + if recovery_activated_during_rollout <=0: + failed_no_intervention.append(1) + + if recovery_activated_during_rollout > 0: + intervention.append(1) + if terminated: + intervention_success.append(1) + else: + intervention_failure.append(1) + else: + intervention.append(0) + print(f'Current rate {results.count(True)/len(results)}') print(f"[INFO] Trial {trial}: {terminated}\n") #loghelper.stopEpoch(trial) print(f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials") print(f"Success rate: {results.count(True) / len(results)}") + print(f'Failed runs with no intervention : {sum(failed_no_intervention)}') + print(f"Intervention rate : {sum(intervention)/len(intervention)}. Of which success : {sum(intervention_success)}, of which failed {sum(intervention_failure)}") + print(f"Trial Results: {results}\n") diff --git a/scripts/tutorials/05_controllers/run_diff_ik.py b/scripts/tutorials/05_controllers/run_diff_ik.py index 606a2b8b1c0d..d0e76250f208 100644 --- a/scripts/tutorials/05_controllers/run_diff_ik.py +++ b/scripts/tutorials/05_controllers/run_diff_ik.py @@ -25,7 +25,7 @@ # add argparse arguments parser = argparse.ArgumentParser(description="Tutorial on using the differential IK controller.") parser.add_argument("--robot", type=str, default="franka_panda", help="Name of the robot.") -parser.add_argument("--num_envs", type=int, default=128, help="Number of environments to spawn.") +parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to spawn.") # append AppLauncher cli args AppLauncher.add_app_launcher_args(parser) # parse the arguments @@ -49,6 +49,7 @@ from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR from isaaclab.utils.math import subtract_frame_transforms +from isaaclab.assets import RigidObjectCfg, ArticulationCfg ## # Pre-defined configs @@ -82,7 +83,21 @@ class TableTopSceneCfg(InteractiveSceneCfg): # articulation if args_cli.robot == "franka_panda": - robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot", init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) elif args_cli.robot == "ur10": robot = UR10_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") else: @@ -108,7 +123,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # Define goals for the arm ee_goals = [ [0.5, 0.5, 0.7, 0.707, 0, 0.707, 0], - [0.5, -0.4, 0.6, 0.707, 0.707, 0.0, 0.0], + [0.5206, 0.0096, 0.3751, 0.6664, 0.0360, 0.7414, -0.0705], [0.5, 0, 0.5, 0.0, 1.0, 0.0, 0.0], ] ee_goals = torch.tensor(ee_goals, device=sim.device) @@ -141,7 +156,7 @@ def run_simulator(sim: sim_utils.SimulationContext, scene: InteractiveScene): # Simulation loop while simulation_app.is_running(): # reset - if count % 150 == 0: + if count % 300 == 0: # reset time count = 0 # reset joint state diff --git a/scripts/tutorials/05_controllers/run_diff_ik_rel.py b/scripts/tutorials/05_controllers/run_diff_ik_rel.py new file mode 100644 index 000000000000..3624bb2b3a64 --- /dev/null +++ b/scripts/tutorials/05_controllers/run_diff_ik_rel.py @@ -0,0 +1,250 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +""" +This script demonstrates how to use the differential inverse kinematics controller with the simulator. + +The differential IK controller can be configured in different modes. It uses the Jacobians computed by +PhysX. This helps perform parallelized computation of the inverse kinematics. + +.. code-block:: bash + + # Usage + ./isaaclab.sh -p scripts/tutorials/05_controllers/run_diff_ik.py + +""" + +"""Launch Isaac Sim Simulator first.""" + +import argparse + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Tutorial on using the differential IK controller.") +parser.add_argument("--robot", type=str, default="franka_panda", help="Name of the robot.") +parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to spawn.") +# append AppLauncher cli args + +parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") + +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import torch +import robomimic.utils.torch_utils as TorchUtils +import isaaclab.sim as sim_utils +from isaaclab.assets import AssetBaseCfg +from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg +from isaaclab.managers import SceneEntityCfg +from isaaclab.markers import VisualizationMarkers +from isaaclab.markers.config import FRAME_MARKER_CFG +from isaaclab.scene import InteractiveScene, InteractiveSceneCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from isaaclab.utils.math import subtract_frame_transforms +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +## +# Pre-defined configs +## +import gymnasium as gym +import torch +from isaaclab_assets import FRANKA_PANDA_HIGH_PD_CFG, UR10_CFG # isort:skip +from isaaclab_tasks.utils import parse_env_cfg +from isaaclab_tasks.manager_based.manipulation.lift.lift_env_cfg import LiftEnvCfg +# @configclass +# class TableTopSceneCfg(InteractiveSceneCfg): +# """Configuration for a cart-pole scene.""" + +# # ground plane +# ground = AssetBaseCfg( +# prim_path="/World/defaultGroundPlane", +# spawn=sim_utils.GroundPlaneCfg(), +# init_state=AssetBaseCfg.InitialStateCfg(pos=(0.0, 0.0, -1.05)), +# ) + +# # lights +# dome_light = AssetBaseCfg( +# prim_path="/World/Light", spawn=sim_utils.DomeLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75)) +# ) + +# # mount +# table = AssetBaseCfg( +# prim_path="{ENV_REGEX_NS}/Table", +# spawn=sim_utils.UsdFileCfg( +# usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/Stand/stand_instanceable.usd", scale=(2.0, 2.0, 2.0) +# ), +# ) + +# # articulation +# if args_cli.robot == "franka_panda": +# robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot", init_state=ArticulationCfg.InitialStateCfg( +# joint_pos={ + +# "panda_joint1": 0.3281, +# "panda_joint2": -0.3684, +# "panda_joint3": -0.2787, +# "panda_joint4": -2.6138, +# "panda_joint5": -2.7527, +# "panda_joint6": 2.4991, # +90° → keeps hand level +# "panda_joint7": 0.3331, +# "panda_finger_joint1": 0.04, # open gripper +# "panda_finger_joint2": 0.04, +# } +# ), +# ) +# elif args_cli.robot == "ur10": +# robot = UR10_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") +# else: +# raise ValueError(f"Robot {args_cli.robot} is not supported. Valid: franka_panda, ur10") + + +def run_simulator(env): + """Runs the simulation loop.""" + # Extract scene entities + # note: we only do this here for readability. + robot = scene["robot"] + diff_ik_cfg = DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls") + diff_ik_controller = DifferentialIKController(diff_ik_cfg, num_envs=env.unwrapped.scene.num_envs, device=sim.device) + + diff_ik_action_controller = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=diff_ik_controller, + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + # Create controller + # diff_ik_cfg = DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls") + #diff_ik_controller = DifferentialIKController(diff_ik_cfg, num_envs=scene.num_envs, device=sim.device) + + # Markers + frame_marker_cfg = FRAME_MARKER_CFG.copy() + frame_marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + ee_marker = VisualizationMarkers(frame_marker_cfg.replace(prim_path="/Visuals/ee_current")) + goal_marker = VisualizationMarkers(frame_marker_cfg.replace(prim_path="/Visuals/ee_goal")) + + # Define goals for the arm + ee_goals = [ + [0.5, 0.5, 0.7, 0.707, 0, 0.707, 0], + [0.5206, 0.0096, 0.3751, 0.6664, 0.0360, 0.7414, -0.0705], + [0.5, 0, 0.5, 0.0, 1.0, 0.0, 0.0], + ] + ee_goals = torch.tensor(ee_goals, device=sim.device) + # Track the given command + current_goal_idx = 0 + # Create buffers to store actions + ik_commands = torch.zeros(scene.num_envs, diff_ik_controller.action_dim, device=robot.device) + ik_commands[:] = ee_goals[current_goal_idx] + + # Specify robot-specific parameters + if args_cli.robot == "franka_panda": + robot_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_joint.*"], body_names=["panda_hand"]) + elif args_cli.robot == "ur10": + robot_entity_cfg = SceneEntityCfg("robot", joint_names=[".*"], body_names=["ee_link"]) + else: + raise ValueError(f"Robot {args_cli.robot} is not supported. Valid: franka_panda, ur10") + # Resolving the scene entities + robot_entity_cfg.resolve(scene) + # Obtain the frame index of the end-effector + # For a fixed base robot, the frame index is one less than the body index. This is because + # the root body is not included in the returned Jacobians. + if robot.is_fixed_base: + ee_jacobi_idx = robot_entity_cfg.body_ids[0] - 1 + else: + ee_jacobi_idx = robot_entity_cfg.body_ids[0] + + # Define simulation stepping + sim_dt = sim.get_physics_dt() + count = 0 + # Simulation loop + while simulation_app.is_running(): + # reset + if count % 300 == 0: + # reset time + count = 0 + # reset joint state + joint_pos = robot.data.default_joint_pos.clone() + joint_vel = robot.data.default_joint_vel.clone() + robot.write_joint_state_to_sim(joint_pos, joint_vel) + robot.reset() + # reset actions + ik_commands[:] = ee_goals[current_goal_idx] + joint_pos_des = joint_pos[:, robot_entity_cfg.joint_ids].clone() + # reset controller + diff_ik_controller.reset() + diff_ik_controller.set_command(ik_commands) + # change goal + current_goal_idx = (current_goal_idx + 1) % len(ee_goals) + else: + # obtain quantities from simulation + jacobian = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, robot_entity_cfg.joint_ids] + ee_pose_w = robot.data.body_pose_w[:, robot_entity_cfg.body_ids[0]] + root_pose_w = robot.data.root_pose_w + joint_pos = robot.data.joint_pos[:, robot_entity_cfg.joint_ids] + # compute frame in root frame + ee_pos_b, ee_quat_b = subtract_frame_transforms( + root_pose_w[:, 0:3], root_pose_w[:, 3:7], ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] + ) + # compute the joint commands + joint_pos_des = diff_ik_controller.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos) + + # apply actions + robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) + scene.write_data_to_sim() + # perform step + sim.step() + # update sim-time + count += 1 + # update buffers + scene.update(sim_dt) + + # obtain quantities from simulation + ee_pose_w = robot.data.body_state_w[:, robot_entity_cfg.body_ids[0], 0:7] + # update marker positions + ee_marker.visualize(ee_pose_w[:, 0:3], ee_pose_w[:, 3:7]) + goal_marker.visualize(ik_commands[:, 0:3] + scene.env_origins, ik_commands[:, 3:7]) + + +def main(): + """Main function.""" + # Load kit helper + + env_cfg: LiftEnvCfg = parse_env_cfg( + "Dev-IK-Rel-v1", + device=args_cli.device, + num_envs=args_cli.num_envs, + use_fabric=not args_cli.disable_fabric, + ) + # create environment + env = gym.make("Isaac-Lift-Cube-Franka-IK-Abs-v0", cfg=env_cfg) + # reset environment at start + env.reset() + # Set main camera + sim.set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0]) + # Design scene + + # Play the simulator + sim.reset() + # Now we are ready! + print("[INFO]: Setup complete...") + # Run the simulator + run_simulator(env) + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() diff --git a/source/isaaclab/isaaclab/controllers/differential_ik.py b/source/isaaclab/isaaclab/controllers/differential_ik.py index a9bbfdb160c7..0a9d77d4216b 100644 --- a/source/isaaclab/isaaclab/controllers/differential_ik.py +++ b/source/isaaclab/isaaclab/controllers/differential_ik.py @@ -117,6 +117,8 @@ def set_command( ValueError: If the command type is ``pose_rel`` and either :attr:`ee_pos` or :attr:`ee_quat` is None. """ # store command + print(f"[DEBUG] command : {command}") + self._command[:] = command # compute the desired end-effector pose if self.cfg.command_type == "position": @@ -141,6 +143,7 @@ def set_command( "Neither end-effector position nor orientation can be None for `pose_rel` command type!" ) self.ee_pos_des, self.ee_quat_des = apply_delta_pose(ee_pos, ee_quat, self._command) + print(f"Calculated pos and quat {self.ee_pos_des}, {self.ee_quat_des}") else: self.ee_pos_des = self._command[:, 0:3] self.ee_quat_des = self._command[:, 3:7] diff --git a/source/isaaclab/isaaclab/envs/mdp/terminations.py b/source/isaaclab/isaaclab/envs/mdp/terminations.py index a13ce9bb4a2d..ac472a923574 100644 --- a/source/isaaclab/isaaclab/envs/mdp/terminations.py +++ b/source/isaaclab/isaaclab/envs/mdp/terminations.py @@ -29,6 +29,8 @@ def time_out(env: ManagerBasedRLEnv) -> torch.Tensor: """Terminate the episode when the episode length exceeds the maximum episode length.""" + if env.episode_length_buf >= env.max_episode_length: + print("Timeout") return env.episode_length_buf >= env.max_episode_length diff --git a/source/isaaclab/isaaclab/safety/__init__.py b/source/isaaclab/isaaclab/safety/__init__.py new file mode 100644 index 000000000000..b02f195e7d31 --- /dev/null +++ b/source/isaaclab/isaaclab/safety/__init__.py @@ -0,0 +1 @@ +from .switchingLogic import SwitchingLogic \ No newline at end of file diff --git a/source/isaaclab/isaaclab/safety/switchingLogic.py b/source/isaaclab/isaaclab/safety/switchingLogic.py new file mode 100644 index 000000000000..f2aa069102c1 --- /dev/null +++ b/source/isaaclab/isaaclab/safety/switchingLogic.py @@ -0,0 +1,47 @@ +from collections import deque +import statistics +import numpy as np + +class SwitchingLogic: + def __init__(self, parameters, joints_to_check:list[int] =[0, 1, 2, 3, 4, 5, 6] , window_size: int = 10, peak_limit: int =2, horizon:int = 500): + self.params = parameters + self.joints = joints_to_check + self.window_size : int = window_size + self.horizon:int =horizon + self.traj = [[0.0]*horizon for _ in range(len(joints_to_check))] + self.windows= self._calc_windows() + self.unsafe_windows = {joint_num : 0 for joint_num in self.joints} + self.peak_limit = peak_limit + self.window_confidence_level = 0.669 + + + def _calc_windows(self)-> list[deque] : + # return a list of deque objects, one for each joint + return [deque(maxlen=self.window_size) for _ in range(len(self.joints))] + + def halfway_check(self, step:int=0, grasp_state:bool=True): + #check that the subtask has been comepleted + if (step==(round(self.horizon/2))) and not grasp_state: + print(f'I got halfway and hadnt done subtask, lets try again') + #then we are halfway through and lost, try again + return True + return False + + + def check(self, uncertainties, step) -> bool: + # 1. Update windows + for joint_num, unc in enumerate(uncertainties): + # Check for bounds if uncertainties is smaller than self.joints + self.traj[joint_num][step]=unc.item() + if step > self.params[joint_num]['window_size']: + + test_window = self.traj[joint_num][step-self.params[joint_num]['window_size']:step] + peaks = sum(1 for x in test_window if x>= self.params[joint_num]['confidence_level']) + # print(f'joint {joint_num}, window: {test_window}') + # print(f"manually found peaks : {peaks}") + if peaks>=self.params[joint_num]['max_peaks']: + print(f"Uncertaity in joint {joint_num} triggered") + return True + + + return False \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py new file mode 100755 index 000000000000..f63cbb50b0bd --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py @@ -0,0 +1,82 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.managers import EventTermCfg as EventTerm +from . import dev_env_cfg +import math +from isaaclab.managers import SceneEntityCfg +from isaaclab_assets.glassware.glassware import ChemistryGlassware +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + + +@configclass +class FrankaDevEnvCfg(dev_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # put the beaker on the stir plate + glassware = ChemistryGlassware() + self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + + self.events.reset_object_position = EventTerm( + func=mdp.reset_multiple_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + "asset2_cfg" : SceneEntityCfg("stirplate") + }, + ) + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + + + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index a2b7772d26c5..e17a95fa38d0 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -143,8 +143,8 @@ class PolicyCfg(ObsGroup): #robot_pose=ObsTerm(func=mdp.robot_pose) #object_to_target = ObsTerm(func=mdp.position_command_error) #norm_error = ObsTerm(func=mdp.object_goal_norm_error) - # abs_joint_pos = ObsTerm(func=mdp.get_joint_pos) - #object_knocked = ObsTerm(func=mdp.object_knocked) + abs_joint_pos = ObsTerm(func=mdp.get_joint_pos) + object_knocked = ObsTerm(func=mdp.object_knocked) def __post_init__(self): self.enable_corruption = False self.concatenate_terms = False @@ -300,7 +300,7 @@ class TerminationsCfg: #joint_effort = DoneTerm(func=mdp.joint_effort_out_of_limit) object_dropping = DoneTerm( - func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("object")} + func=mdp.root_height_below_minimum, params={"minimum_height": 0, "asset_cfg": SceneEntityCfg("object")} ) object_tipped = DoneTerm(func=mdp.object_knocked) #fix object dropping diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py index 162823fa1b64..7dce6fe950a8 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py @@ -161,14 +161,14 @@ def is_object_lifted( def ee_frame_pos(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] ee_frame_pos = ee_frame.data.target_pos_w[:, 0, :] - env.scene.env_origins[:, 0:3] - + #print(f"EE pos : {ee_frame_pos}") return ee_frame_pos def ee_frame_quat(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] ee_frame_quat = ee_frame.data.target_quat_w[:, 0, :] - + #print(f"EE pos : {ee_frame_quat}") return ee_frame_quat @@ -300,7 +300,7 @@ def object_tilt (env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = Scen #print("obs term : tilt : ", tilt_deg) return tilt_deg -def object_knocked(env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"), max_tilt: float = 90): +def object_knocked(env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"), max_tilt: float = 45): object: RigidObject = env.scene[upper_object_cfg.name] tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) if tilt_deg.cpu().detach().numpy()[0] > max_tilt: From 971732bb20fa0eac086060e9d8aa343e9907a6e7 Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Fri, 31 Oct 2025 12:25:10 +0000 Subject: [PATCH 05/15] fixed the DiffIK Rel Controller --- .../robomimic/play_controller.py | 166 ++++++++---------- .../isaaclab/controllers/differential_ik.py | 4 +- 2 files changed, 80 insertions(+), 90 deletions(-) diff --git a/scripts/imitation_learning/robomimic/play_controller.py b/scripts/imitation_learning/robomimic/play_controller.py index 1246c87535ab..3d12adf65a82 100644 --- a/scripts/imitation_learning/robomimic/play_controller.py +++ b/scripts/imitation_learning/robomimic/play_controller.py @@ -101,42 +101,26 @@ def rollout_ensemble(env, success_term, horizon, device): """Perform a single rollout of the policy in the environment. - Args: policy: The robomimicpolicy to play. env: The environment to play in. horizon: The step horizon of each rollout. device: The device to run the policy on. - Returns: terminated: Whether the rollout terminated. traj: The trajectory of the rollout. """ - - - obs_dict, _ = env.reset() - #print(f"obs_dict type: {type(obs_dict)},\nobs_dict contents:\n {obs_dict}") - - traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], - uncertainties=[], min_actions=[], max_actions=[], - time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[]) - + env.reset() ###### SETUP SWITCHING LOGIC #### sim = env.unwrapped.sim num_envs = env.num_envs - - certain_joint_positions = [] - ### SET USE RECOVERY TO FALSE #### - - # Set up recovery controller robot = env.unwrapped.scene["robot"] print(f"Unwrapped sim : {sim}") ee_recovery_pos = torch.tensor([[0.5206, 0.0096, 0.3751]], device=device) - ee_recovery_rot = torch.tensor([[ 0.6664, 0.0360, 0.7414, -0.0705]], device=device) # lets change this into the 6 element tensor they are expecting roll,pitch,yaw = euler_xyz_from_quat(ee_recovery_rot) @@ -146,97 +130,114 @@ def rollout_ensemble(env, success_term, horizon, device): ee_rpy = ee_rpy.unsqueeze(0) ee_goal = torch.cat([ee_recovery_pos, ee_rpy], dim=1) # Create controller - diff_ik_cfg = DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls") - diff_ik_controller = DifferentialIKController(diff_ik_cfg, num_envs=env.unwrapped.scene.num_envs, device=sim.device) - - + diff_ik_cfg = DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls") + #diff_ik_controller = DifferentialIKController(diff_ik_cfg, num_envs=env.unwrapped.scene.num_envs, device=sim.device) + diff_ik_controller = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKController(diff_ik_cfg, num_envs=env.unwrapped.scene.num_envs, device=sim.device), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) robot_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_joint.*"], body_names=["panda_hand"]) robot_entity_cfg.resolve(env.unwrapped.scene) if robot.is_fixed_base: ee_jacobi_idx = robot_entity_cfg.body_ids[0] - 1 else: ee_jacobi_idx = robot_entity_cfg.body_ids[0] - + recovery=[] print(f'Running for horizon {horizon}') for i in range(horizon): + # collect kinematic state jacobian = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, robot_entity_cfg.joint_ids] ee_pose_w = robot.data.body_pose_w[:, robot_entity_cfg.body_ids[0]] root_pose_w = robot.data.root_pose_w joint_pos = robot.data.joint_pos[:, robot_entity_cfg.joint_ids] - # current EE pose in base frame + # current EE pose in base/root frame ee_pos_b, ee_quat_b = subtract_frame_transforms( root_pose_w[:, 0:3], root_pose_w[:, 3:7], ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] ) - print(f"ee_pos_b {ee_pos_b}, ee_quat_b : {ee_quat_b}") - # target EE pose (absolute, world frame → base frame) - target_pos_w = ee_recovery_pos # [1,3] - target_quat_w = ee_recovery_rot # [1,4] + # target EE pose in world -> convert to base/root frame + target_pos_w = ee_recovery_pos.to(device) + target_quat_w = ee_recovery_rot.to(device) target_pos_b, target_quat_b = subtract_frame_transforms( root_pose_w[:, 0:3], root_pose_w[:, 3:7], target_pos_w, target_quat_w ) - print(f"target_pos_b {target_pos_b}, target_quat_b {target_quat_b}") - - # --- compute relative pose command (6D) --- - # translation delta - delta_pos = target_pos_b - ee_pos_b # [1,3] - print(f"Delta pos {delta_pos}") - # rotation delta (ΔR = R_target * R_currentᵀ) - delta_rot = target_quat_b - ee_quat_b - print(f"Delat Rot {delta_rot}") - # convert ΔR to euler angles (XYZ convention) - r,p,y = euler_xyz_from_quat(delta_rot, wrap_to_2pi=False) - print(f"[DEBUG] Delat R {r}, P {p}, Y {y}") - delta_rpy = torch.cat([r,p,y], dim=-1) - delta_rpy = torch.unsqueeze(delta_rpy,0) - print(f"[DEBUG] RPY {delta_rpy}") - # --- build relative command --- - ee_goal = torch.cat([delta_pos, delta_rpy], dim=-1) # [1,6] - - # debug info + # --- Translation delta (absolute -> small step) --- + delta_pos_abs = target_pos_b - ee_pos_b # full error [N,3] + # convert to small incremental command + pos_gain = 0.1 # tune: fraction of error to move per step + delta_pos = pos_gain * delta_pos_abs + # clamp translation step (meters per step) + clamp = 0.01 + delta_pos = torch.clamp(delta_pos, min=-clamp, max=clamp) + + # --- Rotation delta (correct quaternion math) --- + # compute conjugate of current quaternion (w, -x, -y, -z) + q_cur_conj = torch.cat([ee_quat_b[:, :1], -ee_quat_b[:, 1:]], dim=-1) + # compute relative quaternion q_rel = q_target * q_cur_conj + delta_q = quat_mul(target_quat_b, q_cur_conj) # uses imported quat_mul + # convert delta quaternion to RPY (XYZ extrinsic) + r, p, y = euler_xyz_from_quat(delta_q, wrap_to_2pi=False) # each shape (N,) + delta_rpy = torch.stack([r, p, y], dim=-1) # [N,3] + + # optionally scale rotation step (so rotations are not huge) + rot_gain = 1.0 # keep 1.0 if delta_q already represents relative rotation for controller + delta_rpy = rot_gain * delta_rpy + # clamp rotation step (radians per step) + delta_rpy = torch.clamp(delta_rpy, min=-0.5, max=0.5) + + # --- build controller command: [dx,dy,dz, droll,dpitch,dyaw] --- + ee_goal = torch.cat([delta_pos, delta_rpy], dim=-1) # [N,6] + + # Debug prints (inspect magnitudes) + print(f"[DEBUG] ee_pos_b: {ee_pos_b}") + print(f"[DEBUG] target_pos_b: {target_pos_b}") + print(f"[DEBUG] delta_pos_abs norm: {torch.norm(delta_pos_abs).item():.4f}") + print(f"[DEBUG] delta_pos (sent): {delta_pos}") + print(f"[DEBUG] delta_rpy (sent, rad): {delta_rpy}") print(f"[DEBUG] ee_goal (Δx,Δy,Δz,Δr,Δp,Δy): {ee_goal}") - print(f"[DEBUG] Current pos_b: {ee_pos_b}") - print(f"[DEBUG] Target pos_b: {target_pos_b}") - # --- send command to controller --- - diff_ik_controller.set_command(ee_goal, ee_pos_b, ee_quat_b) - - # compute joint targets - joint_pos_des = diff_ik_controller.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos) - - # (optional) denormalize actions if necessary - if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: - actions = ((actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min)) / 2 + args_cli.norm_factor_min - - # --- execute recovery movement --- - pos_err = torch.norm(target_pos_b - ee_pos_b) - actions=joint_pos_des - metrics = ensemble_uncertainty(ensemble, obs) - metrics['min']=actions - metrics['max']=actions - uncertainty = 0 - - if pos_err > 1e-3: - robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) - env.scene.write_data_to_sim() - obs_dict, _, terminated, truncated, _ = env.step(joint_pos_des) - else: - print(f"[Recovery] Target reached — ending recovery mode.") - recovery_mode = False - recovery_cooldown_active = True - print("[Recovery] Cooldown Activated.") + # --- set command on the existing controller (action cfg wraps controller) --- + # your diff_ik_action_cfg holds the controller at .controller + diff_ctrl = diff_ik_controller.controller if hasattr(diff_ik_controller, "controller") else diff_ik_controller + # ensure correct shape + assert ee_goal.dim() == 2 and ee_goal.shape[1] == diff_ctrl._command.shape[1], \ + f"Mismatch: ee_goal.shape={ee_goal.shape}, controller expects {diff_ctrl._command.shape}" + # set command and compute joint targets + diff_ctrl.set_command(ee_goal, ee_pos_b, ee_quat_b) + joint_pos_des = diff_ctrl.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos) + # --- apply joint targets via articulation API (do NOT call env.step(joint_pos_des)) --- + robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) + # advance the sim (two options - use direct sim step or call env.step with zero action) + env.scene.write_data_to_sim() + env.sim.step() + # If you need the gym env to also advance and return next obs, call env.step with a zero action: + zero_action = torch.zeros(1, env.action_space.shape[1], device=device) + obs_dict, _, terminated, truncated, _ = env.step(zero_action) - + # check if we reached target (use absolute pos error) + pos_err = torch.norm(target_pos_b - ee_pos_b) + print(f"[DEBUG] post-step pos_err (before update): {pos_err.item():.6f}") + if pos_err <= 1e-3: + print("[Recovery] Target reached — ending recovery mode.") + recovery_mode = False + recovery_cooldown_active = True + print("[Recovery] Cooldown Activated.") + + def main(): """Run a trained policy from robomimic with Isaac Lab environment.""" # parse configuration @@ -244,15 +245,10 @@ def main(): # Set observations to dictionary mode for Robomimic env_cfg.observations.policy.concatenate_terms = False - #create a log handler # loghelper = LoggingHelper() - - - # Disable recorder env_cfg.recorders = None - # Extract success checking function success_term = env_cfg.terminations.success env_cfg.terminations.success = None @@ -260,26 +256,20 @@ def main(): # Get timeout signal timeout = env_cfg.terminations.time_out #env_cfg.terminations.time_out = None - # Create environment env = gym.make(args_cli.task, cfg=env_cfg).unwrapped - # Set seed9 torch.manual_seed(args_cli.seed) env.seed(args_cli.seed) - # Acquire device device = TorchUtils.get_torch_device(try_to_use_cuda=True) - for trial in range(args_cli.num_rollouts): print(f"[INFO] Starting trial {trial}") - terminated, traj, recovery_activated_during_rollout = rollout_ensemble( env, success_term, args_cli.horizon, device) + rollout_ensemble( env, success_term, args_cli.horizon, device) # save the uncertainties env.close() - - if __name__ == "__main__": # run the main function main() diff --git a/source/isaaclab/isaaclab/controllers/differential_ik.py b/source/isaaclab/isaaclab/controllers/differential_ik.py index 0a9d77d4216b..e10ff6d9cbde 100644 --- a/source/isaaclab/isaaclab/controllers/differential_ik.py +++ b/source/isaaclab/isaaclab/controllers/differential_ik.py @@ -117,7 +117,7 @@ def set_command( ValueError: If the command type is ``pose_rel`` and either :attr:`ee_pos` or :attr:`ee_quat` is None. """ # store command - print(f"[DEBUG] command : {command}") + #print(f"[DEBUG] command : {command}") self._command[:] = command # compute the desired end-effector pose @@ -143,7 +143,7 @@ def set_command( "Neither end-effector position nor orientation can be None for `pose_rel` command type!" ) self.ee_pos_des, self.ee_quat_des = apply_delta_pose(ee_pos, ee_quat, self._command) - print(f"Calculated pos and quat {self.ee_pos_des}, {self.ee_quat_des}") + # print(f"Calculated pos and quat {self.ee_pos_des}, {self.ee_quat_des}") else: self.ee_pos_des = self._command[:, 0:3] self.ee_quat_des = self._command[:, 3:7] From 6d8cb1947e0968cf50376d731e3d7884705cd726 Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Mon, 10 Nov 2025 13:25:54 +0000 Subject: [PATCH 06/15] with backup controller! --- docker/docker-compose.yaml | 8 +- .../robomimic/backup_controller.py | 410 ++++++++++++++++++ .../robomimic/backup_controller_handler.py | 95 ++++ .../robomimic/play_controller.py | 122 ++++-- .../robomimic/play_ensemble.py | 314 ++++---------- .../robomimic/play_with_backup.py | 178 ++++++++ .../isaaclab/controllers/differential_ik.py | 2 +- .../envs/mdp/actions/binary_joint_actions.py | 1 + .../isaaclab/safety/switchingLogic.py | 9 +- .../manipulation/cube_lift/lift_env_cfg.py | 3 +- .../cube_lift/mdp/observations.py | 2 +- 11 files changed, 874 insertions(+), 270 deletions(-) create mode 100644 scripts/imitation_learning/robomimic/backup_controller.py create mode 100644 scripts/imitation_learning/robomimic/backup_controller_handler.py create mode 100644 scripts/imitation_learning/robomimic/play_with_backup.py diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index f1cf86c2daa9..1f14102eced6 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -112,8 +112,8 @@ services: tty: true devices: - /dev/hidraw0:/dev/hidraw0 - - /dev/hidraw1:/dev/hidraw1 - - /dev/hidraw2:/dev/hidraw2 + # - /dev/hidraw1:/dev/hidraw1 + # - /dev/hidraw2:/dev/hidraw2 # This service adds a ROS2 Humble # installation on top of the base image @@ -145,8 +145,8 @@ services: tty: true devices: - /dev/hidraw0:/dev/hidraw0 - - /dev/hidraw1:/dev/hidraw1 - - /dev/hidraw2:/dev/hidraw2 + # - /dev/hidraw1:/dev/hidraw1 + # - /dev/hidraw2:/dev/hidraw2 volumes: # isaac-sim diff --git a/scripts/imitation_learning/robomimic/backup_controller.py b/scripts/imitation_learning/robomimic/backup_controller.py new file mode 100644 index 000000000000..f7952aebe822 --- /dev/null +++ b/scripts/imitation_learning/robomimic/backup_controller.py @@ -0,0 +1,410 @@ +import warp as wp +import gymnasium as gym +import torch +from collections.abc import Sequence +import numpy as np + +# this is a backup state machine controller +# initialize warp +wp.init() + + +class GripperState: + """States for the gripper.""" + + OPEN = wp.constant(1.0) + CLOSE = wp.constant(-1.0) + +class BackupSMWaitTime: + """Additional wait times (in s) for states for before switching.""" + + REST = wp.constant(0.5) + APPROACH_ABOVE_OBJECT = wp.constant(0.1) + APPROACH_OBJECT = wp.constant(0.1) + GRASP_OBJECT = wp.constant(0.1) + LIFT_OBJECT = wp.constant(0.1) + MIDPOINT = wp.constant(0.1) + APPROACH_ABOVE_GOAL = wp.constant(0.1) + APPROACH_GOAL = wp.constant(6) + +class BackupSM: + """States for the pick state machine.""" + + REST = wp.constant(0) + APPROACH_ABOVE_OBJECT = wp.constant(1) + APPROACH_OBJECT = wp.constant(2) + GRASP_OBJECT = wp.constant(3) + LIFT_OBJECT = wp.constant(4) + MIDPOINT = wp.constant(5) + APPROACH_ABOVE_GOAL = wp.constant(6) + APPROACH_GOAL = wp.constant(7) + #UNGRASP_OBJECT = wp.constant(7) + +@wp.func +def distance_below_threshold(current_pos: wp.vec3, desired_pos: wp.vec3, threshold: float) -> bool: + return wp.length(current_pos - desired_pos) < threshold + + +@wp.kernel +def infer_state_machine( + dt: wp.array(dtype=float), + sm_state: wp.array(dtype=int), + sm_wait_time: wp.array(dtype=float), + ee_pose: wp.array(dtype=wp.transform), # current ee pose + object_pose: wp.array(dtype=wp.transform), # start object location + current_object_pose: wp.array(dtype=wp.transform), # current object pose + final_object_pose: wp.array(dtype=wp.transform), + rest_ee_pose : wp.array(dtype=wp.transform), # rest position + des_ee_pose: wp.array(dtype=wp.transform), # what we return + gripper_state: wp.array(dtype=float), + offset: wp.array(dtype=wp.transform), + position_threshold: float, + debug_des_pose: wp.array(dtype=wp.transform), # NEW + debug_cur_pose: wp.array(dtype=wp.transform), # NEW + debug_state: wp.array(dtype=int), # New +): + # retrieve thread id + tid = wp.tid() + # retrieve state machine state + state = sm_state[tid] + # decide next state + if state == BackupSM.REST: + # go back to reset position + des_ee_pose[tid] = rest_ee_pose[tid] + gripper_state[tid] = GripperState.CLOSE + # print("\n[SM] REST") + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.02, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.REST: + print("[SM_INFO] : Moving from REST to APPROACH_ABOVE_OBJECT") + # move to next state and reset wait time + sm_state[tid] = BackupSM.APPROACH_ABOVE_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_ABOVE_OBJECT: + # print("[SM] APPR above obj") + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + + des_ee_pose[tid] = wp.transform(pose_pos, pose_rot) + des_ee_pose[tid] = wp.transform_multiply(offset[tid], des_ee_pose[tid]) + gripper_state[tid] = GripperState.CLOSE + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + position_threshold, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_ABOVE_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from APPR_ABOVE to APPROACH_OBJECT") + sm_state[tid] = BackupSM.APPROACH_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_OBJECT: + # print("[SM] approach object") + + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.02) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + position_threshold, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from APPR_OBJ to GRASP_OBJECT") + sm_state[tid] = BackupSM.GRASP_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.GRASP_OBJECT: + # print("[SM] GRASP") + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3() #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.GRASP_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from GRSP to LIFT_OBJECT") + sm_state[tid] = BackupSM.LIFT_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.LIFT_OBJECT: + #print("[SM] LIFT") # uses starting position + pose_pos = wp.transform_get_translation(object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.03, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.LIFT_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from LIFT to MIDPOINT") + sm_state[tid] = BackupSM.MIDPOINT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.MIDPOINT: + #print("[SM] MIDPOINT") + pose_pos = wp.transform_get_translation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + #offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 + des_ee_pose[tid] = rest_ee_pose[tid] + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.03, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.LIFT_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from MID to APPR goal") + sm_state[tid] = BackupSM.APPROACH_ABOVE_GOAL + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_ABOVE_GOAL: + #print("[SM] Approach above goal") + offset_pos = wp.transform_get_translation(offset[tid]) + offset_rot = wp.transform_get_rotation(offset[tid]) + offset_pos = wp.vec3(offset_pos.x, offset_pos.y, offset_pos.z) # raise 25 cm + new_offset = wp.transform(offset_pos, offset_rot) + above_target_pose = wp.transform_multiply(new_offset, final_object_pose[tid]) + # Blend time for smooth approach + APPROACH_BLEND_TIME = 0.4 # seconds, tune as needed + alpha = wp.clamp(sm_wait_time[tid] / APPROACH_BLEND_TIME, 0.0, 1.0) + # Interpolate position and rotation + current_pos = wp.transform_get_translation(ee_pose[tid]) + current_rot = wp.transform_get_rotation(ee_pose[tid]) + + target_pos = wp.transform_get_translation(above_target_pose) + target_rot = wp.transform_get_rotation(above_target_pose) + + pos_interp = wp.lerp(current_pos, target_pos, alpha) + rot_interp = wp.quat_slerp(current_rot, target_rot, alpha) + # Set interpolated pose + des_ee_pose[tid] = wp.transform(pos_interp, rot_interp) + gripper_state[tid] = GripperState.CLOSE + # Evaluate readiness to transition + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.02): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_ABOVE_GOAL: + print("[SM_INFO] : Moving from APPR_ABOVE to APPROACH_GOAL") + sm_state[tid] = BackupSM.APPROACH_GOAL + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_GOAL: + #print("[SM] approach goal") + # print("[SM_INFO] : in state ungrasp") + pose_pos = wp.transform_get_translation(final_object_pose[tid]) + pose_rot = wp.transform_get_rotation(final_object_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z+0.02) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.01, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_GOAL: + # move to next state and reset wait time + print("[SM_INFO] : Moving from apprach goal to rest") + sm_state[tid] = BackupSM.REST + sm_wait_time[tid] = 0.0 + + + # increment wait time + sm_wait_time[tid] = sm_wait_time[tid] + dt[tid] + debug_des_pose[tid] = des_ee_pose[tid] + debug_cur_pose[tid] = ee_pose[tid] + debug_state[tid] = sm_state[tid] + + + +class BackupControllerSM: + def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", position_threshold=0.02, offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0')): + """Initialize the state machine. + + Args: + dt: The environment time step. + num_envs: The number of environments to simulate. + device: The device to run the state machine on. + """ + ## debug + + print(f'dt : {dt},num_envs {num_envs}, device {device}, pos_thresh {position_threshold} ') + # save parameters + self.dt = float(dt) + self.num_envs = num_envs + self.device = device + self.position_threshold = position_threshold + + # initialize state machine + self.sm_dt = torch.full((self.num_envs,), self.dt, device=self.device) + self.sm_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) + self.sm_wait_time = torch.zeros((self.num_envs,), device=self.device) + + # desired state + self.des_ee_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.des_gripper_state = torch.full((self.num_envs,), 0.0, device=self.device) + self.final_object_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.rest_pose = torch.zeros((self.num_envs, 7), device=self.device) + # approach above object offset + + self.offset = torch.zeros((self.num_envs, 7), device=self.device) + self.offset[:, 2] = 0.2 + self.offset[:,0] = -0.1 + self.offset[:, -1] = 1.0 # warp expects quaternion as (x, y, z, w) + + # convert to warp + self.sm_dt_wp = wp.from_torch(self.sm_dt, wp.float32) + self.sm_state_wp = wp.from_torch(self.sm_state, wp.int32) + self.sm_wait_time_wp = wp.from_torch(self.sm_wait_time, wp.float32) + self.des_ee_pose_wp = wp.from_torch(self.des_ee_pose, wp.transform) + self.des_gripper_state_wp = wp.from_torch(self.des_gripper_state, wp.float32) + self.final_object_pose_wp = wp.from_torch(self.final_object_pose, wp.transform) + self.rest_pose_wp = wp.from_torch(self.rest_pose, wp.transform) + self.offset_wp = wp.from_torch(self.offset, wp.transform) + ## For Debug + self.debug_des_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.debug_cur_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.debug_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) + + self.debug_des_pose_wp = wp.from_torch(self.debug_des_pose, wp.transform) + self.debug_cur_pose_wp = wp.from_torch(self.debug_cur_pose, wp.transform) + self.debug_state_wp = wp.from_torch(self.debug_state, wp.int32) + + def reset_idx(self, env_ids: Sequence[int] = None): + """Reset the state machine.""" + print(f'[SM RESET]') + if env_ids is None: + env_ids = slice(None) + self.sm_state[env_ids] = 0 + self.sm_wait_time[env_ids] = 0.0 + + def _ensure_7d(self,tensor: torch.Tensor, device): + # accepts (N,3) -> returns (N,7) with identity quaternion + if tensor.ndim != 2: + raise ValueError(f"expected 2D tensor, got shape {tensor.shape}") + if tensor.shape[1] == 7: + return tensor + if tensor.shape[1] == 3: + quat = torch.tensor([0.0,0.0,0.0,1.0], device=device, dtype=tensor.dtype) + quat = quat.unsqueeze(0).expand(tensor.shape[0], -1) + return torch.cat([tensor, quat], dim=-1) + raise ValueError(f"pose must have 3 or 7 elements, got {tensor.shape[1]}") + + + def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, current_object_pose: torch.Tensor, final_object_pose: torch.Tensor, rest_pose: torch.Tensor, sm_state: int =0, env_num = 0) -> torch.Tensor: + """Compute the desired state of the robot's end-effector and the gripper.""" + # convert all transformations from (w, x, y, z) to (x, y, z, w) + # print(f'[SM DEBUG] Doing State Comp') + # print(f'[SM DEBUG] ee_pose {ee_pose}') + # print(f'[SM DEBUG] object pose {object_pose}') + # print(f'[SM DEBUG] desired pose {des_object_pose}') + # print(f'[SM DEBUG] final pose {final_object_pose}') + # print(f'[SM DEBUG] rest pose {rest_pose}') + # before reordering + # print("\n[BackupControllerSM::compute] called with inputs:") + # print(f" sm_state: {sm_state}, env_num: {env_num}") + + # def short_tensor(t, name): + # if t is None: + # print(f" {name}: None") + # elif not isinstance(t, torch.Tensor): + # print(f" {name}: {t} (type={type(t)})") + # else: + # shape = tuple(t.shape) + # device = t.device + # dtype = t.dtype + # # show first few elements flattened + # vals = t.flatten()[:6].detach().cpu().numpy() + # print(f" {name}: shape={shape}, device={device}, dtype={dtype}, values={vals}") + + # short_tensor(ee_pose, "ee_pose") + # short_tensor(object_pose, "object_pose") + # short_tensor(des_object_pose, "des_object_pose") + # short_tensor(final_object_pose, "final_object_pose") + # short_tensor(rest_pose, "rest_pose") + # print("-" * 80) + # print(f"Got given state {sm_state}") + current_object_pose = self._ensure_7d(current_object_pose, self.device) + final_object_pose = self._ensure_7d(final_object_pose, self.device) + ee_pose = self._ensure_7d(ee_pose, self.device) + start_object_pose = self._ensure_7d(start_object_pose, self.device) + rest_pose = self._ensure_7d(rest_pose, self.device) + # now safe to reorder + ee_pose = ee_pose[:, [0, 1, 2, 4, 5, 6, 3]] + start_object_pose = start_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + current_object_pose = current_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + final_object_pose = final_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + rest_pose = rest_pose[:, [0, 1, 2, 4, 5, 6, 3]] + # convert to warp + ee_pose_wp = wp.from_torch(ee_pose.contiguous(), wp.transform) + start_object_pose_wp = wp.from_torch(start_object_pose.contiguous(), wp.transform) + current_object_pose_wp = wp.from_torch(current_object_pose.contiguous(), wp.transform) + final_object_pose_wp = wp.from_torch(final_object_pose.contiguous(), wp.transform) + rest_pose_wp = wp.from_torch(rest_pose.contiguous(), wp.transform) + # run state machine + # get state from env - convert to warp again + self.sm_state[env_num] = sm_state + self.sm_state_wp = wp.from_torch(self.sm_state, wp.int32) + # launch + wp.launch( + kernel=infer_state_machine, + dim=self.num_envs, + inputs=[ + self.sm_dt_wp, + self.sm_state_wp, + self.sm_wait_time_wp, + ee_pose_wp, + start_object_pose_wp, + current_object_pose_wp, + final_object_pose_wp, + rest_pose_wp, + self.des_ee_pose_wp, + self.des_gripper_state_wp, + self.offset_wp, + self.position_threshold, + self.debug_des_pose_wp, + self.debug_cur_pose_wp, + self.debug_state_wp, + ], + device=self.device, + ) + des_debug = self.debug_des_pose.detach().cpu().numpy() + cur_debug = self.debug_cur_pose.detach().cpu().numpy() + debug_state = self.debug_state.detach().cpu().numpy() + for i in range(self.num_envs): + des_pos, des_quat = des_debug[i][:3], des_debug[i][3:] + cur_pos, cur_quat = cur_debug[i][:3], cur_debug[i][3:] + # compute Euclidean distance with numpy + dist = np.linalg.norm(cur_pos - des_pos) + # print(f"StateMachine debug state {debug_state}") + # print(f"[Env {i}]") + # print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") + # print(f" Desired -> pos: {des_pos}, quat: {des_quat}") + #print(f" Euclidean distance: {dist:.4f}") + #print(f"returned state : {self.sm_state}") + # convert transformations back to (w, x, y, z) + des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] + # convert to torch + #print(f'[SM DEBUG] new desired poition : {des_ee_pose}, gripper state {self.des_gripper_state}') + return des_ee_pose , self.des_gripper_state, self.sm_state.clone().item() + #return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) diff --git a/scripts/imitation_learning/robomimic/backup_controller_handler.py b/scripts/imitation_learning/robomimic/backup_controller_handler.py new file mode 100644 index 000000000000..261fc906396a --- /dev/null +++ b/scripts/imitation_learning/robomimic/backup_controller_handler.py @@ -0,0 +1,95 @@ +from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg +from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat, quat_mul +from isaaclab.managers import SceneEntityCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg, BinaryJointPositionActionCfg +from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction +from backup_controller import BackupControllerSM +import torch + + +class BackupController: + def __init__(self,env, device): + self.env = env + self.sim = env.unwrapped.sim + self.num_envs = env.num_envs + self.device = device + self.rest_pos = self._get_rest_pos() + self.backup_controller = BackupControllerSM(0.01*2, self.num_envs,'cuda' , 0.02) + self.robot = env.unwrapped.scene["robot"] + self.robot_entity_cfg , self.ee_jacobi_idx = self._setup_robot() + self.state_guess = 0 + self.pos_gain = 0.5 + self.clamp = 0.05 + self.rot_gain = 1.0 + self.rot_clamp = 0.5 + self.object_start_pose = self._get_start_pos() + + self.reset() + + def reset(self): + self.backup_controller.reset_idx() + + def _get_start_pos(self): + object_pose_w = self.env.unwrapped.scene["object"].data.root_pose_w + return object_pose_w + + def _get_rest_pos(self): + rest_pos = torch.tensor([[0.5206, 0.0096, 0.3751]], device=self.device) + ee_recovery_rot = torch.tensor([[ 0.6664, 0.0360, 0.7414, -0.0705]], device=self.device) + print(f"recovery rot : {ee_recovery_rot}") + # lets change this into the 6 element tensor they are expecting + roll,pitch,yaw = euler_xyz_from_quat(ee_recovery_rot) + rest_pos = torch.cat([rest_pos, ee_recovery_rot], dim =-1) + return rest_pos + + def _setup_robot(self): + robot_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_joint.*"], body_names=["panda_hand"]) + robot_entity_cfg.resolve(self.env.unwrapped.scene) + if self.robot.is_fixed_base: + ee_jacobi_idx = robot_entity_cfg.body_ids[0] - 1 + else: + ee_jacobi_idx = robot_entity_cfg.body_ids[0] + return robot_entity_cfg, ee_jacobi_idx + + def get_controller_action(self, state_guess, env_num): + + current_object_pose = self.env.unwrapped.scene["object"].data.root_pose_w + root_pose_w = self.robot.data.root_pose_w + ee_pose_w = self.robot.data.body_pose_w[:, self.robot_entity_cfg.body_ids[0]] + # current EE pose in base/root frame + ee_pos_b, ee_quat_b = subtract_frame_transforms( + root_pose_w[:, 0:3], root_pose_w[:, 3:7], + ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] + ) + object_pose = self.env.unwrapped.command_manager.get_command("object_pose") + ee_recovery, gripper , state_guess= self.backup_controller.compute(ee_pose =ee_pose_w, start_object_pose = self.object_start_pose, current_object_pose=current_object_pose, final_object_pose=object_pose, rest_pose=self.rest_pos, sm_state=state_guess) + #print(f"[BAKCUP] state {state_guess}") + + #return ee_recovery , gripper , state_guess + ee_recovery_pos, ee_recovery_rot = ee_recovery[:,0:3], ee_recovery[:,3:7] + target_pos_w = ee_recovery_pos.to(self.device) + target_quat_w = ee_recovery_rot.to(self.device) + target_pos_b, target_quat_b = subtract_frame_transforms( + root_pose_w[:, 0:3], root_pose_w[:, 3:7], + target_pos_w, target_quat_w + ) + ## calc the delta pos action + delta_pos_abs = target_pos_b - ee_pos_b + delta_pos = self.pos_gain * delta_pos_abs + delta_pos = torch.clamp(delta_pos, min=-self.clamp, max=self.clamp) + + ## calc the delta rot action + # compute conjugate of current quaternion (w, -x, -y, -z) + q_cur_conj = torch.cat([ee_quat_b[:, :1], -ee_quat_b[:, 1:]], dim=-1) + # compute relative quaternion q_rel = q_target * q_cur_conj + delta_q = quat_mul(target_quat_b, q_cur_conj) # uses imported quat_mul + # convert delta quaternion to RPY (XYZ extrinsic) + r, p, y = euler_xyz_from_quat(delta_q, wrap_to_2pi=False) # each shape (N,) + delta_rpy = torch.stack([r, p, y], dim=-1) # [N,3] + delta_rpy = self.rot_gain * delta_rpy + delta_rpy = torch.clamp(delta_rpy, min=-self.rot_clamp, max=self.rot_clamp) + # --- build controller command: [dx,dy,dz, droll,dpitch,dyaw] --- + ee_goal = torch.cat([delta_pos, delta_rpy], dim=-1) # [N,6] + + action=torch.cat([ee_goal, gripper.unsqueeze(0)], dim=-1) + return action, state_guess \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/play_controller.py b/scripts/imitation_learning/robomimic/play_controller.py index 3d12adf65a82..166b1d518540 100644 --- a/scripts/imitation_learning/robomimic/play_controller.py +++ b/scripts/imitation_learning/robomimic/play_controller.py @@ -94,10 +94,10 @@ from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat from isaaclab.managers import SceneEntityCfg -from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg, BinaryJointPositionActionCfg +from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction +from backup_controller import * -#import chills.tasks -#from chills.tasks.mdp import upright_tilt_deg def rollout_ensemble(env, success_term, horizon, device): """Perform a single rollout of the policy in the environment. @@ -118,14 +118,27 @@ def rollout_ensemble(env, success_term, horizon, device): ### SET USE RECOVERY TO FALSE #### # Set up recovery controller + backup_controller = BackupControllerSM(0.01*2, num_envs,'cuda' , 0.01) + backup_controller.reset_idx() # none so reset all + robot = env.unwrapped.scene["robot"] - print(f"Unwrapped sim : {sim}") - ee_recovery_pos = torch.tensor([[0.5206, 0.0096, 0.3751]], device=device) + print(f"Robot : {robot}") + # print(f"Unwrapped sim : {sim}") + object_pose_w = env.unwrapped.scene["object"].data.root_pose_w + print(f"object pose : {object_pose_w}") + ee_recovery_pos = object_pose_w[:,0:3] + offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0') + ee_recovery_pos_offset = ee_recovery_pos + offset + + print(f"recovery pos : {ee_recovery_pos_offset}") + ee_recovery_pos = ee_recovery_pos_offset + rest_pos = torch.tensor([[0.5206, 0.0096, 0.3751]], device=device) ee_recovery_rot = torch.tensor([[ 0.6664, 0.0360, 0.7414, -0.0705]], device=device) + print(f"recovery rot : {ee_recovery_rot}") # lets change this into the 6 element tensor they are expecting roll,pitch,yaw = euler_xyz_from_quat(ee_recovery_rot) - ee_recovery_goal = torch.cat([ee_recovery_pos, ee_recovery_rot], dim =-1) - print(f"I got this roll {roll}, pitch {pitch}, yaw {yaw} and full tensor {torch.cat([roll, pitch, yaw], dim=-1)}\n i need to add with {ee_recovery_pos}") + rest_pos = torch.cat([rest_pos, ee_recovery_rot], dim =-1) + # print(f"I got this roll {roll}, pitch {pitch}, yaw {yaw} and full tensor {torch.cat([roll, pitch, yaw], dim=-1)}\n i need to add with {ee_recovery_pos}") ee_rpy = torch.cat([roll, pitch, yaw], dim=-1) ee_rpy = ee_rpy.unsqueeze(0) ee_goal = torch.cat([ee_recovery_pos, ee_rpy], dim=1) @@ -142,16 +155,34 @@ def rollout_ensemble(env, success_term, horizon, device): ) robot_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_joint.*"], body_names=["panda_hand"]) robot_entity_cfg.resolve(env.unwrapped.scene) + gripper_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_finger.*"], body_names=["panda_hand"]) + gripper_entity_cfg.resolve(env.unwrapped.scene) + print(f"Found this gripper : {gripper_entity_cfg}") if robot.is_fixed_base: ee_jacobi_idx = robot_entity_cfg.body_ids[0] - 1 else: ee_jacobi_idx = robot_entity_cfg.body_ids[0] recovery=[] - print(f'Running for horizon {horizon}') + + ## gripper control + gripper_control_cfg = BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + gripper_controller = BinaryJointPositionAction(cfg=gripper_control_cfg, env=env) + # print(f'Running for horizon {horizon}') + state_guess = 2 + for i in range(horizon): # collect kinematic state + + ## use the State Machine to get the goal position + jacobian = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, robot_entity_cfg.joint_ids] ee_pose_w = robot.data.body_pose_w[:, robot_entity_cfg.body_ids[0]] + #print(f"EE pos {ee_pose_w}") root_pose_w = robot.data.root_pose_w joint_pos = robot.data.joint_pos[:, robot_entity_cfg.joint_ids] @@ -160,8 +191,16 @@ def rollout_ensemble(env, success_term, horizon, device): root_pose_w[:, 0:3], root_pose_w[:, 3:7], ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] ) + desired_position = env.unwrapped.command_manager.get_command("object_pose") + + - # target EE pose in world -> convert to base/root frame + ## backup controller + #ee_recovery, gripper , state_guess= backup_controller.compute(ee_pose_w, object_pose_w, desired_position, desired_position, rest_pos, state_guess, 0) + ##ee_recovery, gripper , state_guess= backup_controller.compute(ee_pose=ee_pose_w, object_pose=object_pose_w) + print(f"state : {state_guess}") + #print(f"State machine returned :{ee_recovery}, {gripper}") + ee_recovery_pos, ee_recovery_rot = ee_recovery[:,0:3], ee_recovery[:,3:7] target_pos_w = ee_recovery_pos.to(device) target_quat_w = ee_recovery_rot.to(device) target_pos_b, target_quat_b = subtract_frame_transforms( @@ -172,10 +211,10 @@ def rollout_ensemble(env, success_term, horizon, device): # --- Translation delta (absolute -> small step) --- delta_pos_abs = target_pos_b - ee_pos_b # full error [N,3] # convert to small incremental command - pos_gain = 0.1 # tune: fraction of error to move per step + pos_gain = 0.2 # tune: fraction of error to move per step delta_pos = pos_gain * delta_pos_abs # clamp translation step (meters per step) - clamp = 0.01 + clamp = 0.02 delta_pos = torch.clamp(delta_pos, min=-clamp, max=clamp) # --- Rotation delta (correct quaternion math) --- @@ -195,48 +234,61 @@ def rollout_ensemble(env, success_term, horizon, device): # --- build controller command: [dx,dy,dz, droll,dpitch,dyaw] --- ee_goal = torch.cat([delta_pos, delta_rpy], dim=-1) # [N,6] - - # Debug prints (inspect magnitudes) - print(f"[DEBUG] ee_pos_b: {ee_pos_b}") - print(f"[DEBUG] target_pos_b: {target_pos_b}") - print(f"[DEBUG] delta_pos_abs norm: {torch.norm(delta_pos_abs).item():.4f}") - print(f"[DEBUG] delta_pos (sent): {delta_pos}") - print(f"[DEBUG] delta_rpy (sent, rad): {delta_rpy}") - print(f"[DEBUG] ee_goal (Δx,Δy,Δz,Δr,Δp,Δy): {ee_goal}") - - # --- set command on the existing controller (action cfg wraps controller) --- - # your diff_ik_action_cfg holds the controller at .controller diff_ctrl = diff_ik_controller.controller if hasattr(diff_ik_controller, "controller") else diff_ik_controller - + # ensure correct shape - assert ee_goal.dim() == 2 and ee_goal.shape[1] == diff_ctrl._command.shape[1], \ - f"Mismatch: ee_goal.shape={ee_goal.shape}, controller expects {diff_ctrl._command.shape}" - + #assert ee_goal.dim() == 2 and ee_goal.shape[1] == diff_ctrl._command.shape[1], \ + # f"Mismatch: ee_goal.shape={ee_goal.shape}, controller expects {diff_ctrl._command.shape}" + # print(f"\n[DEBUG] ee_pos_b: {ee_pos_b}") + # print(f"\n[DEBUG] target_pos_b: {target_pos_b}") + # print(f"\n[DEBUG] delta_pos_abs norm: {torch.norm(delta_pos_abs).item():.4f}") + # print(f"\n[DEBUG] delta_pos (sent): {delta_pos}") + # print(f"\n[DEBUG] delta_rpy (sent, rad): {delta_rpy}") + # print(f"\n[DEBUG] ee_goal (Δx,Δy,Δz,Δr,Δp,Δy): {ee_goal}") # set command and compute joint targets diff_ctrl.set_command(ee_goal, ee_pos_b, ee_quat_b) joint_pos_des = diff_ctrl.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos) - + gripper_cmd = gripper.unsqueeze(0) + gripper_cmd = torch.cat([gripper_cmd, gripper_cmd], dim =-1) + #robot_action= torch.cat([joint_pos_des, gripper_cmd], dim=-1) + # print(f"\nSet this action for robot 0-8 {robot_action}") # --- apply joint targets via articulation API (do NOT call env.step(joint_pos_des)) --- - robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) - + joint_ids=[0,1,2,3,4,5,6,7,8] + #robot.set_joint_position_target(robot_action, joint_ids=joint_ids) + + + # gripper + #robot.set_joint_position_target(gripper_cmd, joint_ids=gripper_entity_cfg.joint_ids) # advance the sim (two options - use direct sim step or call env.step with zero action) - env.scene.write_data_to_sim() - env.sim.step() + #env.scene.write_data_to_sim() + + # sim.read_data_from_sim() + #env.update_internal_state(env.dt) # update internal counters/variables + #obs_dict = env.get_observations() + # print(f"Obs {obs_dict}") + + # merges dict into one tensor - # If you need the gym env to also advance and return next obs, call env.step with a zero action: + print(f"ee_goal : {ee_goal}") + #print(f"joint_pos_des {joint_pos_des}") + + action=torch.cat([ee_goal, gripper.unsqueeze(0)], dim=-1) zero_action = torch.zeros(1, env.action_space.shape[1], device=device) - obs_dict, _, terminated, truncated, _ = env.step(zero_action) + #print(f"\npassed this action {action}") + obs_dict, _, terminated, truncated, _ = env.step(action) + #sim.step() + #obs_dict, _, terminated, truncated, _ = env.step(ee_goal) # check if we reached target (use absolute pos error) pos_err = torch.norm(target_pos_b - ee_pos_b) - print(f"[DEBUG] post-step pos_err (before update): {pos_err.item():.6f}") + # print(f"[DEBUG] post-step pos_err (before update): {pos_err.item():.6f}") if pos_err <= 1e-3: print("[Recovery] Target reached — ending recovery mode.") recovery_mode = False recovery_cooldown_active = True print("[Recovery] Cooldown Activated.") - + backup_controller.reset_idx() def main(): """Run a trained policy from robomimic with Isaac Lab environment.""" diff --git a/scripts/imitation_learning/robomimic/play_ensemble.py b/scripts/imitation_learning/robomimic/play_ensemble.py index 275f2199b98c..f9c8549b01de 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble.py +++ b/scripts/imitation_learning/robomimic/play_ensemble.py @@ -94,10 +94,9 @@ from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat from isaaclab.managers import SceneEntityCfg -from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg - -#import chills.tasks -#from chills.tasks.mdp import upright_tilt_deg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg, BinaryJointPositionActionCfg +from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction +from backup_controller_handler import BackupController def rollout(policy, env, success_term, horizon, device): """Perform a single rollout of the policy in the environment. @@ -218,19 +217,7 @@ def has_fallen(asset, threshold: float = -0.7, debug: bool = True) -> bool: return uprightness > threshold -# this took me too long to work out i needed lol -def quaternion_to_euler(q_w, q_x, q_y, q_z): - # Roll (x-axis rotation) - roll = math.atan2(2 * (q_w * q_x + q_y * q_z), 1 - 2 * (q_x**2 + q_y**2)) - - # Pitch (y-axis rotation) - pitch = math.asin(2 * (q_w * q_y - q_z * q_x)) - - # Yaw (z-axis rotation) - yaw = math.atan2(2 * (q_w * q_z + q_x * q_y), 1 - 2 * (q_y**2 + q_z**2)) - - return roll, pitch, yaw def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): """Perform a single rollout of the policy in the environment. @@ -245,87 +232,55 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, terminated: Whether the rollout terminated. traj: The trajectory of the rollout. """ + ## do setup print("running rollout number : ", rollout_num) for policy in ensemble: policy.start_episode() obs_dict, _ = env.reset() - - #print(f"obs_dict type: {type(obs_dict)},\nobs_dict contents:\n {obs_dict}") - traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[], min_actions=[], max_actions=[], time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[]) ###### SETUP SWITCHING LOGIC #### switchingLogic = SwitchingLogic(parameters, horizon=horizon) - - sim = env.unwrapped.sim - num_envs = env.num_envs - - certain_joint_positions = [] - ### SET USE RECOVERY TO FALSE #### + ###### SET UP RECOVERY #### use_recovery=True recovery_activated_during_rollout = 0 - # Set up recovery controller - robot = env.unwrapped.scene["robot"] - print(f"Unwrapped sim : {sim}") - ee_recovery_pos = torch.tensor([[0.5206, 0.0096, 0.3751]], device=device) - - ee_recovery_rot = torch.tensor([[ 0.6664, 0.0360, 0.7414, -0.0705]], device=device) - # lets change this into the 6 element tensor they are expecting - roll,pitch,yaw = euler_xyz_from_quat(ee_recovery_rot) - ee_recovery_goal = torch.cat([ee_recovery_pos, ee_recovery_rot], dim =-1) - print(f"I got this roll {roll}, pitch {pitch}, yaw {yaw} and full tensor {torch.cat([roll, pitch, yaw], dim=-1)}\n i need to add with {ee_recovery_pos}") - ee_rpy = torch.cat([roll, pitch, yaw], dim=-1) - ee_rpy = ee_rpy.unsqueeze(0) - ee_goal = torch.cat([ee_recovery_pos, ee_rpy], dim=1) - # Create controller - diff_ik_cfg = DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls") - diff_ik_controller = DifferentialIKController(diff_ik_cfg, num_envs=env.unwrapped.scene.num_envs, device=sim.device) - - # diff_ik_action_controller = DifferentialInverseKinematicsActionCfg( - # asset_name="robot", - # joint_names=["panda_joint.*"], - # body_name="panda_hand", - # controller=diff_ik_controller, - # scale=0.5, - # body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), - # ) - robot_entity_cfg = SceneEntityCfg("robot", joint_names=["panda_joint.*"], body_names=["panda_hand"]) - robot_entity_cfg.resolve(env.unwrapped.scene) - if robot.is_fixed_base: - ee_jacobi_idx = robot_entity_cfg.body_ids[0] - 1 - else: - ee_jacobi_idx = robot_entity_cfg.body_ids[0] - -#########SET TO FALSE ####### - recovery_mode = True print("rollout recovery enabled ? : ", use_recovery) + ##### RECOVERY CONFIG #### recovery_cooldown_duration = 300 # timesteps recovery_cooldown_timer = recovery_cooldown_duration recovery_cooldown_active = False recovery = [] recovery_steps = 0 + + ##### CONFIG RECOVERY CONTROLLER #### + backup_controller = BackupController(env, device) + state_guess = 0 + last_state =0 + recovery_mode= False + state_guessed = False + recovery_triggered = False + object_knocked = False + print(f'Running for horizon {horizon}') for i in range(horizon): # Prepare observations obs = copy.deepcopy(obs_dict["policy"]) sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) - object = env.unwrapped.scene["object"] - - # is_tipped = has_fallen(object, -0.95, True) + for ob in obs: obs[ob] = torch.squeeze(obs[ob]) - #print(f"found observation : {obs[ob]}") - + for subob in sub_obs: sub_obs[subob] = torch.squeeze(sub_obs[subob]) - if obs['object_knocked']: - print("object knocked over") + traj["obs"].append(obs) + traj["sub_obs"].append(sub_obs) + # Check if environment image observations if hasattr(env.cfg, "image_obs_list"): # Process image observations for robomimic inference @@ -338,156 +293,59 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, image = image.clip(0.0, 1.0) obs[image_name] = image - traj["obs"].append(obs) - traj["sub_obs"].append(sub_obs) - - object=env.unwrapped.scene['object'] - #tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) - #print("Tilt deg : ", tilt_deg.item()) - if recovery_mode and not recovery_cooldown_active: - print(f"[Recovery] Mode Timestep {i}") - - jacobian = robot.root_physx_view.get_jacobians()[:, ee_jacobi_idx, :, robot_entity_cfg.joint_ids] - ee_pose_w = robot.data.body_pose_w[:, robot_entity_cfg.body_ids[0]] - root_pose_w = robot.data.root_pose_w - joint_pos = robot.data.joint_pos[:, robot_entity_cfg.joint_ids] - - # current EE pose in base frame - ee_pos_b, ee_quat_b = subtract_frame_transforms( - root_pose_w[:, 0:3], root_pose_w[:, 3:7], - ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] - ) - print(f"ee_pos_b {ee_pos_b}, ee_quat_b : {ee_quat_b}") - - # target EE pose (absolute, world frame → base frame) - target_pos_w = ee_recovery_pos # [1,3] - target_quat_w = ee_recovery_rot # [1,4] - target_pos_b, target_quat_b = subtract_frame_transforms( - root_pose_w[:, 0:3], root_pose_w[:, 3:7], - target_pos_w, target_quat_w - ) - print(f"target_pos_b {target_pos_b}, target_quat_b {target_quat_b}") - - # --- compute relative pose command (6D) --- - # translation delta - delta_pos = target_pos_b - ee_pos_b # [1,3] - print(f"Delta pos {delta_pos}") - # rotation delta (ΔR = R_target * R_currentᵀ) - delta_rot = target_quat_b - ee_quat_b - print(f"Delat Rot {delta_rot}") - # convert ΔR to euler angles (XYZ convention) - r,p,y = euler_xyz_from_quat(delta_rot, wrap_to_2pi=False) - print(f"[DEBUG] Delat R {r}, P {p}, Y {y}") - delta_rpy = torch.cat([r,p,y], dim=-1) - delta_rpy = torch.unsqueeze(delta_rpy,0) - print(f"[DEBUG] RPY {delta_rpy}") - # --- build relative command --- - ee_goal = torch.cat([delta_pos, delta_rpy], dim=-1) # [1,6] - - - # debug info - print(f"[DEBUG] ee_goal (Δx,Δy,Δz,Δr,Δp,Δy): {ee_goal}") - print(f"[DEBUG] Current pos_b: {ee_pos_b}") - print(f"[DEBUG] Target pos_b: {target_pos_b}") - - # --- send command to controller --- - diff_ik_controller.set_command(ee_goal, ee_pos_b, ee_quat_b) - - # compute joint targets - joint_pos_des = diff_ik_controller.compute(ee_pos_b, ee_quat_b, jacobian, joint_pos) - - # (optional) denormalize actions if necessary - if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: - actions = ((actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min)) / 2 + args_cli.norm_factor_min - - # --- execute recovery movement --- - pos_err = torch.norm(target_pos_b - ee_pos_b) - actions=joint_pos_des - metrics = ensemble_uncertainty(ensemble, obs) - metrics['min']=actions - metrics['max']=actions - uncertainty = 0 - - if pos_err > 1e-3: - robot.set_joint_position_target(joint_pos_des, joint_ids=robot_entity_cfg.joint_ids) - env.scene.write_data_to_sim() - obs_dict, _, terminated, truncated, _ = env.step(joint_pos_des) - else: - print(f"[Recovery] Target reached — ending recovery mode.") - recovery_mode = False - recovery_cooldown_active = True - print("[Recovery] Cooldown Activated.") - - - else: - env.unwrapped.actions.arm_action = DifferentialInverseKinematicsActionCfg( - asset_name="robot", - joint_names=["panda_joint.*"], - body_name="panda_hand", - controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), - scale=0.5, - body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), - ) - recovery_steps=0 - # Calculate uncertainty using the ensemble - recovery.append(False) + #### get policy action #### + metrics = ensemble_uncertainty(ensemble, obs) + uncertainty = metrics['variance'] + policy_actions = metrics['mean'] + # fix state guess + if sub_obs['grasp']: + if state_guess <4 : + state_guess = 4 + + sm_actions , state_guess = backup_controller.get_controller_action(state_guess, 0) + if last_state != state_guess: + #print(f"State {state_guess.item()}") + last_state = state_guess - ## detect if we have tipped the object - - metrics = ensemble_uncertainty(ensemble, obs) - # Get the std and mean action - uncertainty = metrics['variance'] - actions = metrics['mean'] - # uncert went here - - - if switchingLogic.check(uncertainty, i) and not recovery_cooldown_active: - if use_recovery : - recovery_mode = True - recovery_activated_during_rollout+=1 - - #check halfway thorough, if we havent managed grasp, lets reset and try again - if switchingLogic.halfway_check(i,sub_obs['grasp'].item()): + # this is the switching logic + if switchingLogic.check(uncertainty, i): + # uncertainty triggered if use_recovery and not recovery_cooldown_active: + # if we have switched to recovery recovery_mode = True - - - if recovery_cooldown_active: - if object_grasped(env): - # normal recovery if already holding - recovery_cooldown_timer-=1 - else: - # shorten the cooldown for grasping stage - - recovery_cooldown_timer -= 1 + recovery_activated_during_rollout+=1 + if not recovery_triggered : + print(f"[RECOVERY] Step {i}") + recovery_triggered = True + if recovery_mode: + # if holding the object, start with lifting + actions = sm_actions + + else: + actions = policy_actions if recovery_cooldown_timer <= 0: recovery_cooldown_active = False recovery_cooldown_timer = recovery_cooldown_duration print("Recovery Cooldown Ended") - - if not recovery_mode: - current_absolute_joints = get_joint_pos(env) - certain_joint_positions.append(current_absolute_joints) - # Unnormalize actions if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: actions = ( (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) ) / 2 + args_cli.norm_factor_min - # print(f"before shaping action : {actions}") actions = actions.to(device=device).view(1, env.action_space.shape[1]) - # print(f"------------------------------") - # print(f"Policy action {actions.shape} : {actions}") - - # Apply actions - obs_dict, _, terminated, truncated, _ = env.step(actions) + + + # Apply actions + obs_dict, _, terminated, truncated, _ = env.step(actions) + recovery.append(recovery_mode) + # update obs from taking action obs = obs_dict["policy"] sub_obs = obs_dict["subtask_terms"] - # print(f"Obs change : {obs}") + # Record trajectory traj["actions"].append(actions.tolist()) traj["next_obs"].append(obs) @@ -497,6 +355,9 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, traj['time_taken'].append(metrics['time_taken']) traj['joint_pos'].append(obs['abs_joint_pos']) traj['recovery'].append(recovery) + if torch.any(obs['object_knocked']): + print("[MONITOR] object knocked over") + object_knocked = True # Check if rollout was successful if bool(success_term.func(env, **success_term.params)[0]): @@ -507,30 +368,30 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, traj['appr'].append(appr.item()) print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") # print(f"grasp : {grasp.item()}, appr : {appr.item()}") - return True, traj, recovery_activated_during_rollout + return True, traj, recovery_activated_during_rollout, "" elif terminated or truncated: - grasp = torch.any(sub_obs['grasp']) traj['grasp'].append(grasp.item()) appr = torch.any(sub_obs['appr_goal']) traj['appr'].append(appr.item()) #print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") - if obs['object_knocked']: - + if i==horizon: #if the failure was caused by object collision - traj['failure'].append("knocked") + traj['failure'].append("timeout") + failure_reason = "timeout" else: #if failure due to timeout, record timeout - traj['failure'].append("timeout") - return False, traj, recovery_activated_during_rollout + traj['failure'].append("knocked") + failure_reason = "object_knocked" + return False, traj, recovery_activated_during_rollout, failure_reason #print("REcovery : ", traj["recovery"]) traj['failure'].append("timeout") grasp = torch.any(sub_obs['grasp']) traj['grasp'].append(grasp.item()) appr = torch.any(sub_obs['appr_goal']) traj['appr'].append(appr.item()) - return False, traj, recovery_activated_during_rollout + return False, traj, recovery_activated_during_rollout, "" @@ -754,40 +615,41 @@ def main(): parameters = { 'beaker_lift' :{ 0 : { - "confidence_level": 0.017165569182596162, - "window_size": 5, - "max_peaks": 5 + "confidence_level": 0.010360572377319478, + "window_size": 9, + "max_peaks": 9 }, 1 : { - "confidence_level": 0.024839555704716736, - "window_size": 12, - "max_peaks": 4 + "confidence_level": 0.012117819935441015, + "window_size": 9, + "max_peaks": 9 }, 2 : { - "confidence_level": 0.022856649849482057, - "window_size": 12, - "max_peaks": 5 + "confidence_level": 0.0114854090040122, + "window_size": 9, + "max_peaks": 9 }, 3 : { - "confidence_level": 0.03564607457876469, + "confidence_level": 0.01721086513038985, "window_size": 9, - "max_peaks": 5 + "max_peaks": 9 }, 4 : { - "confidence_level": 0.03087440802734071, - "window_size": 10, - "max_peaks": 3 + "confidence_level": 0.01516669949421836, + "window_size": 9, + "max_peaks": 9 }, 5 : { - "confidence_level": 0.02323877457883784, - "window_size": 5, - "max_peaks": 4 + "confidence_level": 0.011445348395548671, + "window_size": 9, + "max_peaks": 9 }, 6 : { - "confidence_level": 0.8432899916370529, - "window_size": 13, - "max_peaks": 4 + "confidence_level": 0.0001330413469565007, + "window_size": 15, + "max_peaks": 9 }, + }, } @@ -831,7 +693,7 @@ def main(): for trial in range(args_cli.num_rollouts): print(f"[INFO] Starting trial {trial}") - terminated, traj, recovery_activated_during_rollout = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['beaker_lift'], use_recovery=args_cli.use_recovery, rollout_num=trial) + terminated, traj, recovery_activated_during_rollout, failure = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['beaker_lift'], use_recovery=args_cli.use_recovery, rollout_num=trial) # save the uncertainties print("Finished rollout, recovery needed : ", recovery_activated_during_rollout) #print("actions shape : ", traj['actions']) diff --git a/scripts/imitation_learning/robomimic/play_with_backup.py b/scripts/imitation_learning/robomimic/play_with_backup.py new file mode 100644 index 000000000000..2dda0f20fe31 --- /dev/null +++ b/scripts/imitation_learning/robomimic/play_with_backup.py @@ -0,0 +1,178 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# run this script: +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play_ensemble.py --device cuda --task Dev-IK-Rel-v0 --num_rollouts 100 +# stack cube task: ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 +"""Script to play and evaluate a trained policy from robomimic. + +This script loads a robomimic policy and plays it in an Isaac Lab environment. + +Args: + task: Name of the environment. + checkpoint: Path to the robomimic policy checkpoint. + horizon: If provided, override the step horizon of each rollout. + num_rollouts: If provided, override the number of rollouts. + seed: If provided, overeride the default random seed. + norm_factor_min: If provided, minimum value of the action space normalization factor. + norm_factor_max: If provided, maximum value of the action space normalization factor. +""" + +"""Launch Isaac Sim Simulator first.""" + + +import argparse + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") +parser.add_argument("--video", action="store_true", default=False, help="Record videos during training.") +parser.add_argument("--video_length", type=int, default=800, help="Length of the recorded video (in steps).") +parser.add_argument( + "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." +) +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--checkpoint", type=str, default=None, help="Pytorch model checkpoint to load.") +parser.add_argument("--horizon", type=int, default=2000, help="Step horizon of each rollout.") +parser.add_argument("--num_rollouts", type=int, default=1, help="Number of rollouts.") +parser.add_argument("--seed", type=int, default=101, help="Random seed.") +parser.add_argument( + "--norm_factor_min", type=float, default=None, help="Optional: minimum value of the normalization factor." +) +parser.add_argument( + "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." +) +parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") + +parser.add_argument("--model_name", type=str, default=None) + +group = parser.add_mutually_exclusive_group() +group.add_argument("--use_recovery", type=bool ,default= False, help="Enable recovery mechanism. By default recovery is enabled.") + +parser.add_argument("--ensemble_size", type=int, default=10) + +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim + # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter + import pinocchio # noqa: F401 +import numpy as np +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import time +import copy +import random +import os +import gymnasium as gym +import torch +import math +from collections import deque + +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.torch_utils as TorchUtils +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp.observations import get_joint_pos, object_grasped +#from chills.tasks.mdp.observations import get_joint_pos, object_grasped +if args_cli.enable_pinocchio: + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from isaaclab_tasks.utils import parse_env_cfg +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType +from isaaclab.utils.math import matrix_from_quat, convert_quat, quat_mul, euler_xyz_from_quat +from evaluation import ensemble_uncertainty +from isaaclab.safety.switchingLogic import SwitchingLogic +from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg +from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat +from isaaclab.managers import SceneEntityCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg, BinaryJointPositionActionCfg +from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction +from backup_controller_handler import BackupController + + +def rollout_ensemble(env, success_term, horizon, device): + """Perform a single rollout of the policy in the environment. + Args: + policy: The robomimicpolicy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + Returns: + terminated: Whether the rollout terminated. + traj: The trajectory of the rollout. + """ + env.reset() + ###### SETUP SWITCHING LOGIC #### + + + ### SET USE RECOVERY TO FALSE #### + # Set up recovery controller + + + backup_controller = BackupController(env, device) + state_guess = 0 + for i in range(horizon): + + + action, state_guess = backup_controller.get_controller_action(state_guess, 0) + print(f"state guess : {state_guess}") + + zero_action = torch.zeros(1, env.action_space.shape[1], device=device) + #print(f"\npassed this action {action}") + obs_dict, _, terminated, truncated, _ = env.step(action) + #sim.step() + #obs_dict, _, terminated, truncated, _ = env.step(ee_goal) + + # check if we reached target (use absolute pos error) + + # print(f"[DEBUG] post-step pos_err (before update): {pos_err.item():.6f}") + + + backup_controller.reset() + +def main(): + """Run a trained policy from robomimic with Isaac Lab environment.""" + # parse configuration + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + + # Set observations to dictionary mode for Robomimic + env_cfg.observations.policy.concatenate_terms = False + #create a log handler + # loghelper = LoggingHelper() + # Disable recorder + env_cfg.recorders = None + # Extract success checking function + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + arm_action = env_cfg.actions.arm_action + # Get timeout signal + timeout = env_cfg.terminations.time_out + #env_cfg.terminations.time_out = None + # Create environment + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + # Set seed9 + torch.manual_seed(args_cli.seed) + env.seed(args_cli.seed) + # Acquire device + device = TorchUtils.get_torch_device(try_to_use_cuda=True) + for trial in range(args_cli.num_rollouts): + print(f"[INFO] Starting trial {trial}") + + rollout_ensemble( env, success_term, args_cli.horizon, device) + # save the uncertainties + env.close() + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() \ No newline at end of file diff --git a/source/isaaclab/isaaclab/controllers/differential_ik.py b/source/isaaclab/isaaclab/controllers/differential_ik.py index e10ff6d9cbde..e6e623a5cb37 100644 --- a/source/isaaclab/isaaclab/controllers/differential_ik.py +++ b/source/isaaclab/isaaclab/controllers/differential_ik.py @@ -117,7 +117,7 @@ def set_command( ValueError: If the command type is ``pose_rel`` and either :attr:`ee_pos` or :attr:`ee_quat` is None. """ # store command - #print(f"[DEBUG] command : {command}") + # print(f"\n[DEBUG IK] command : {command}") self._command[:] = command # compute the desired end-effector pose diff --git a/source/isaaclab/isaaclab/envs/mdp/actions/binary_joint_actions.py b/source/isaaclab/isaaclab/envs/mdp/actions/binary_joint_actions.py index 501c221dec6a..5d76ecc85a9b 100644 --- a/source/isaaclab/isaaclab/envs/mdp/actions/binary_joint_actions.py +++ b/source/isaaclab/isaaclab/envs/mdp/actions/binary_joint_actions.py @@ -126,6 +126,7 @@ def IO_descriptor(self) -> GenericActionIODescriptor: """ def process_actions(self, actions: torch.Tensor): + #print(f"recieved gripper actions { actions}") # store the raw actions self._raw_actions[:] = actions # compute the binary mask diff --git a/source/isaaclab/isaaclab/safety/switchingLogic.py b/source/isaaclab/isaaclab/safety/switchingLogic.py index f2aa069102c1..86dcc7e5030a 100644 --- a/source/isaaclab/isaaclab/safety/switchingLogic.py +++ b/source/isaaclab/isaaclab/safety/switchingLogic.py @@ -13,6 +13,7 @@ def __init__(self, parameters, joints_to_check:list[int] =[0, 1, 2, 3, 4, 5, 6] self.unsafe_windows = {joint_num : 0 for joint_num in self.joints} self.peak_limit = peak_limit self.window_confidence_level = 0.669 + self.triggered = False def _calc_windows(self)-> list[deque] : @@ -22,7 +23,9 @@ def _calc_windows(self)-> list[deque] : def halfway_check(self, step:int=0, grasp_state:bool=True): #check that the subtask has been comepleted if (step==(round(self.horizon/2))) and not grasp_state: - print(f'I got halfway and hadnt done subtask, lets try again') + if not self.triggered: + print(f'I got halfway and hadnt done subtask, lets try again') + self.triggered =True #then we are halfway through and lost, try again return True return False @@ -40,7 +43,9 @@ def check(self, uncertainties, step) -> bool: # print(f'joint {joint_num}, window: {test_window}') # print(f"manually found peaks : {peaks}") if peaks>=self.params[joint_num]['max_peaks']: - print(f"Uncertaity in joint {joint_num} triggered") + if not self.triggered: + print(f"Uncertaity in joint {joint_num} triggered") + self.triggered =True return True diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index e17a95fa38d0..236c61480980 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -22,6 +22,7 @@ from isaaclab.utils import configclass from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR import warp as wp +import math from . import mdp #from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType @@ -95,7 +96,7 @@ class CommandsCfg: debug_vis=True, ranges=mdp.UniformPoseCommandCfg.Ranges( # pos_x=(0.3,0.3), pos_y=(-0.28, -0.28), pos_z=(0.1, 0.1), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) - pos_x=(0.4,0.4), pos_y=(-0.3, -0.3), pos_z=(0.08, 0.08), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) + pos_x=(0.4,0.4), pos_y=(-0.3, -0.3), pos_z=(0.08, 0.08), roll=(math.pi/2, math.pi/2), pitch=(math.pi/2,math.pi/2), yaw=(0.0, 0.0) ), ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py index 7dce6fe950a8..6e12df6cf39c 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py @@ -304,6 +304,6 @@ def object_knocked(env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = Sc object: RigidObject = env.scene[upper_object_cfg.name] tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) if tilt_deg.cpu().detach().numpy()[0] > max_tilt: - print("object knocked") + # print("object knocked") return torch.tensor([True], device='cuda:0') else :return torch.tensor([False], device='cuda:0') \ No newline at end of file From 4051543dffbd905dbc4b64d1b68dba92ba57ee97 Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Mon, 24 Nov 2025 11:59:38 +0000 Subject: [PATCH 07/15] backup controller update --- .../robomimic/backup_controller_handler.py | 3 +++ .../imitation_learning/robomimic/play_ensemble.py | 2 +- .../cube_lift/config/franka/__init__.py | 14 ++++++++++++++ .../config/franka/dev_ik_rel_env_place.py | 3 ++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/scripts/imitation_learning/robomimic/backup_controller_handler.py b/scripts/imitation_learning/robomimic/backup_controller_handler.py index 261fc906396a..e3b336e1bfd3 100644 --- a/scripts/imitation_learning/robomimic/backup_controller_handler.py +++ b/scripts/imitation_learning/robomimic/backup_controller_handler.py @@ -40,6 +40,9 @@ def _get_rest_pos(self): # lets change this into the 6 element tensor they are expecting roll,pitch,yaw = euler_xyz_from_quat(ee_recovery_rot) rest_pos = torch.cat([rest_pos, ee_recovery_rot], dim =-1) + print(f"Rest pos {rest_pos}") + print(f"rpy : {roll}, {pitch}, {yaw}") + #print(f"rpy version :{torch.cat([rest_pos,roll.unsqueeze(0), pitch.unsqueeze(0), yaw.unsqueeze(0)], dim =-1)}") return rest_pos def _setup_robot(self): diff --git a/scripts/imitation_learning/robomimic/play_ensemble.py b/scripts/imitation_learning/robomimic/play_ensemble.py index f9c8549b01de..fea3fdc51d5c 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble.py +++ b/scripts/imitation_learning/robomimic/play_ensemble.py @@ -597,7 +597,7 @@ def main(): # Create environment env = gym.make(args_cli.task, cfg=env_cfg).unwrapped - # Set seed9 + # Set seed torch.manual_seed(args_cli.seed) env.seed(args_cli.seed) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py index 4059bfcf8045..16d4e657c655 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py @@ -140,3 +140,17 @@ disable_env_checker=True, ) +gym.register( + id="Dev-IK-Rel-Place-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_ik_rel_env_place:FrankaDevEnvCfg", + + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), + "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), + "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + + }, + disable_env_checker=True, +) \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py index f63cbb50b0bd..2555e6d49938 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py @@ -28,7 +28,8 @@ def __post_init__(self): # put the beaker on the stir plate glassware = ChemistryGlassware() self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) - + self.scene.scale = glassware.scale(pos=[0.3, -0.3, 0.01]) + self.events.reset_object_position = EventTerm( func=mdp.reset_multiple_root_state_uniform, mode="reset", From 24a4ed22fd3e841dc19358d7e15ff333161d2801 Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Thu, 4 Dec 2025 08:43:39 +0000 Subject: [PATCH 08/15] addec copilot instructions --- .github/copilot-instructions.md | 205 ++++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000000..16a5d0b2481c --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,205 @@ +# AI Coding Agent Instructions for IsaacLab-Laura + +## Project Overview + +**IsaacLab-Laura** is a robotics manipulation research framework built on [IsaacLab](https://github.com/isaac-sim/IsaacLab), focused on **Chemistry Inspired Manipulation Learning Lab Skills (ChILLS)** — a sim-to-real imitation learning benchmark for lab object manipulation (lift, place, pour tasks). + +- **Base:** NVIDIA Isaac Sim + IsaacLab 2.0 (GPU-accelerated physics simulation) +- **Frontend:** Python 3.11, manager-based environments, HDF5 datasets, RoboMimic training +- **Entry point:** `isaaclab.sh` launcher script; ChILLS in `source/chills/` +- **Current branch:** `skillgen_demo` + +--- + +## Critical Architecture Patterns + +### 1. **Configuration-Driven Design via `@configclass`** +- All tasks, environments, and agents use `isaaclab.utils.configclass` decorator +- No `__init__` in config classes; prefer dataclass field defaults +- Example: `FrankaIkEnvCfg` extends `ManagerBasedRLEnvCfg`, sets `sim.dt=0.01`, `decimation=2` +- **Location:** `source/chills/chills/envs/franka_env.py`, `source/isaaclab_tasks/` +- **Key convention:** Use `__post_init__()` to override parent configs cleanly + +### 2. **Manager-Based Environment Workflow** (not DirectRL) +- ChILLS uses **manager-based** environments with modular MDP components: + - **Observations:** `observations_cfg()` → stacked obs terms (e.g., ee_pos, object_pos) + - **Actions:** `FrankaActionsCfg` → maps deltas to joint commands + - **Rewards:** `rewards_cfg()` → scalar reward per step + - **Terminations:** `terminations_cfg()` → episode end conditions (success, failure, time) +- Each task inherits from `ManagerBasedRLEnvCfg` and composes scene + MDP configs +- **Location:** `source/chills/chills/envs/`, `source/chills/chills/tasks/` + +### 3. **Data Pipeline: 1_recorded → 2_annotated → 3_collected → Gen** +- **1_recorded:** Raw human demos (HDF5) from teleop (`scr/1_record.py`) +- **2_annotated:** Trimmed, labeled with key events (`scr/2_annotate.py`) +- **3_collected:** Consolidated canonical dataset (`scr/3_consolidate.py`) +- **Generated:** Mimic-augmented demos (×10–100×) in `datasets/chills_lfs/` (`scr/4_generate.py`) +- **Training:** Uses any collected/generated HDF5; outputs to `models/runs////` +- **File naming convention:** `_dataset24x.hdf5`, `_collected.hdf5`, `0tokGen.hdf5` + +### 4. **Mimic Augmentation (Data Generation)** +- Uses `isaaclab_mimic` extension (separate from core ChILLS tasks) +- Converts **BC (behavioral cloning) dataset** → **large synthetic episodes** via in-sim randomization +- Special env variants: `LiftLabwareMimic-v0`, `PlaceLabwareMimic-v0` (mimic-only) +- Key config: `env_cfg.datagen_config` with `generation_num_trials`, `generation_keep_failed`, `generation_relative` +- **Location:** `source/isaaclab_mimic/isaaclab_mimic/datagen/`, `source/chills/chills/envs/` + +### 5. **Quaternion Convention: wxyz (Always)** +- Isaac Lab uses **wxyz** (w=scalar, xyz=vector) +- Never mix with xyzw or Euler angles without explicit conversion +- Use `isaaclab.utils.math` for transforms; do not roll custom conversions +- Example: `rot=[0.707, 0, 0, 0.707]` is 90° around z-axis + +--- + +## Build & Execution Workflows + +### Environment Setup +```bash +# Create conda/uv environment (Isaac Sim 4.5 or 5.0) +./isaaclab.sh -c env_isaaclab # conda (auto-selects Python 3.10 for sim 4.5) +# OR +./isaaclab.sh -u env_isaaclab # uv + +# Activate, then install ChILLS +conda activate env_isaaclab +cd source/chills +pip install -e . +``` + +### Core Scripts (Numbered Pipeline) +All scripts in `source/chills/chills/scr/` follow a consistent CLI pattern (via `mods/app_parser.py`): + +| Script | Purpose | Example | +|--------|---------|---------| +| `0_teleop.py` | Device setup & sanity checks | `python scr/0_teleop.py --task LiftLabware-v0 --teleop_device gamepad` | +| `1_record.py` | Record human demos | `python scr/1_record.py --task LiftLabware-v0 --dataset_file datasets/LiftLabware/1_recorded/10x.hdf5 --num_demos 10` | +| `2_annotate.py` | Label key events, filter | `python scr/2_annotate.py --input_file ... --output_file ... --auto --num_success_steps 30` | +| `3_consolidate.py` | Merge multiple HDF5s | `python scr/3_consolidate.py --inputs "datasets/*/2_annotated/*.hdf5" --output_file ... ` | +| `4_generate.py` | Mimic augmentation | `python scr/4_generate.py --task LiftLabwareMimic-v0 --num_envs 128 --generation_num_trials 4000 --input_file ... --output_file ...` | +| `5_replay.py` | Visualize dataset episodes | `python scr/5_replay.py --task LiftLabware-v0 --input_file ... --sample 5` | +| `6_add_key_obs.py` | Inject observation keys | `python scr/6_add_key_obs.py --input_file ... --output_file ... --keys ...` | +| `7_train.py` | Train RoboMimic models | `python scr/7_train.py --task PlaceLabware-v0 --dataset ... --algo bc_rnn --seed 0 --device cuda` | +| `8_play.py` | Run trained checkpoint | `python scr/8_play.py --task PlaceLabware-v0 --checkpoint models/runs/.../best_val.pth --episodes 10` | +| `9_gather_best_val.py` | Harvest best checkpoints | `python scr/9_gather_best_val.py --runs_root runs/ --dest_root best_runs/` | + +### High-Level Orchestrators +- **`run.py`** (authoritative): `python run.py pipeline -E PlaceLabware -A bc_rnn bc_trans --runner auto` +- **`go.sh`** (bash): `ENV_NAME=PlaceLabware ./go.sh 4 6` (steps 4=generate, 6=train) +- **`auto.ps1`** (PowerShell): `./auto.ps1 -EnvName PlaceLabware -Algos bc_rnn -Script 4,6` + +**Always use `isaaclab.sh -p` (via `--runner auto`) to execute Python scripts** so Isaac Sim environment is properly loaded. + +--- + +## Project-Specific Conventions + +### 1. **Naming & File Organization** +- **Tasks:** `Labware`, e.g., `LiftLabware-v0`, `PlaceLabware-v0` (gym registry) +- **Task classes:** `source/chills/chills/tasks/lift_labware.py` +- **Task configs:** `source/chills/chills/tasks/_env_cfg.py` +- **Datasets root:** `datasets//[1_recorded|2_annotated|3_collected]/` +- **Generated datasets:** `datasets/chills_lfs//toGen.hdf5` +- **Model checkpoints:** `models/runs/////best_val_model.pth` + +### 2. **Asset & Labware Factory** +- USD labware stored in `source/chills/chills/assets/` (e.g., `beaker/beaker.usd`) +- Factory functions: `source/chills/chills/envs/labware_cfg.py` → `beaker()`, `conical_flask()`, `hotplate()`, `scale()` +- All assets use semantic tags: `[("class", "beaker")]` +- Frame transforms: Use `FrameTransformerCfg` with `OffsetCfg` for EE-relative observations + +### 3. **Environment Control: Absolute Targets ↔ Delta Actions** +- **ChillsMimicEnv** wraps base env to convert: + - Absolute EE target pose → delta joint commands (IK-resolved) + - Subtask logic: phases, success checks, object reference tracking +- EE frame always in **world coordinates**; observations translated to EE-relative +- **Location:** `source/isaaclab_mimic/isaaclab_mimic/envs/ChillsMimicEnv.py` + +### 4. **RoboMimic Training Algorithms** +Supported configs in `source/chills/chills/tasks/agents/robomimic/`: +- **BC-RNN:** `bc_rnn.json` (recurrent policy, good for long horizons) +- **BC-Transformer:** `bc_trans.json` (transformer-based, preferred for longer sequences) +- **HBC:** `hbc.json` (hierarchical behavior cloning) +- Upcoming: Diffusion models (RoboMimic ≥0.5.0) + +### 5. **Logging & Reproducibility** +- TensorBoard logs: `datasets//logs/` or `models/runs////` +- Script execution logs: `logs/script_logger.md` (managed by `run.py`) +- **Always fix seed** for reproducible runs: `--seed ` +- Build version tracking: `isaaclab.sh` detects Isaac Sim 4.5 vs 5.0; logs printed at startup + +### 6. **Headless vs Viewer Rendering** +- `--headless` for large-scale data generation (faster, no GPU overhead for display) +- Viewer mode for debugging / sanity checks; default eye: `(1.0, 1.0, 1.0)`, lookat: `(0.0, 0.0, -0.1)` +- Translucent rendering enabled by default in base Franka config for glass/fluid assets + +--- + +## Key Files & Where to Look + +| Purpose | Location | +|---------|----------| +| Base Franka scene & env config | `source/chills/chills/envs/franka_env.py` | +| Task definitions (lift, place, pour) | `source/chills/chills/tasks/lift_labware.py`, `place_labware.py` | +| MDP module examples | `source/chills/chills/envs/mdp/` (observations, rewards, terminations) | +| Labware factory & presets | `source/chills/chills/envs/labware_cfg.py` | +| Common CLI argument parser | `source/chills/chills/scr/mods/app_parser.py` | +| Mimic env wrapper | `source/isaaclab_mimic/isaaclab_mimic/envs/ChillsMimicEnv.py` | +| Data generation orchestrator | `source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py` | +| Task registration & gym entry points | `source/isaaclab_tasks/isaaclab_tasks/` | +| Isaac Lab core docs & reference arch | `docs/source/refs/reference_architecture/index.rst` | + +--- + +## Common Debugging Patterns + +1. **"No success termination term found"** → Ensure task config has `terminations_cfg()` with `success` term +2. **Quaternion rotation looks wrong** → Verify wxyz ordering; check frame transform direction +3. **Viewer hangs or TLAS warnings** → Use `--headless` or reduce scene complexity; verify GPU driver +4. **USD asset missing** → Confirm file exists at `source/chills/chills/assets//.usd` +5. **Dataset file mismatch** → Filename must match pipeline expectation (`_recorded`, `_annotated`, `_collected`, `Gen`) +6. **Training converges poorly** → Check observation scaling, action ranges, reward shaping; verify dataset quality with `5_replay.py` + +--- + +## Testing & Validation + +- **Unit tests:** `source/chills/chills/test.py` or pytest in `tools/` +- **Data sanity checks:** Always replay a random sample before training: `python scr/5_replay.py --sample 5` +- **Pre-commit hooks:** `./isaaclab.sh -f` runs formatters/linters (isort, black, flake8) +- **Pytest:** `./isaaclab.sh -t` runs all tests with timeout guards + +--- + +## External Dependencies & Integration Points + +- **IsaacLab core:** `isaaclab.*` (assets, envs, sensors, sim utils) +- **Isaac Sim binary:** Loaded via `_isaac_sim/` symlink or pip (`isaacsim-rl`) +- **RoboMimic:** Dataset loading, policy training, inference in `isaaclab_mimic` +- **HDF5 I/O:** `h5py` for demo storage & augmentation +- **Hydra:** Config management in IsaacLab tasks (not used in ChILLS scripts directly) +- **Gym registry:** Standard `gymnasium` for environment registration + +--- + +## Writing New Code + +When adding features (e.g., new task, MDP module): + +1. **Define config class** with `@configclass` decorator (no `__init__`) +2. **Inherit from appropriate base** (`ManagerBasedRLEnvCfg`, `SubTaskConfig`, etc.) +3. **Use official Isaac Lab utilities** (`isaaclab.utils.math`, `isaaclab.sim.*`) — don't roll custom transforms +4. **Maintain naming conventions** (`Labware-v0`, `_env_cfg.py`, `_collected.hdf5`) +5. **Add docstrings** to modules & classes (author, purpose, high-level design) +6. **Log execution** via existing patterns (`scr/mods/logger.py` or native Python logging) +7. **Test locally** with `--headless` before submitting; commit with passing unit tests + +--- + +## References + +- **ChILLS README:** `source/chills/README.md` (quick-start, pipeline overview) +- **ChILLS scripts README:** `source/chills/chills/scr/README.md` (detailed per-script guide) +- **IsaacLab docs:** `docs/source/refs/reference_architecture/index.rst` (architecture walkthrough) +- **PyProject config:** `pyproject.toml` (import sections, tool configs, version constraints) +- **Launcher script:** `isaaclab.sh` (env detection, Isaac Sim path resolution, Python exe extraction) From e85da645b0be2fd77a9d126cf587ce7a2ab521af Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Fri, 5 Dec 2025 17:01:10 +0000 Subject: [PATCH 09/15] idk how i messed that up, teleop fixed now --- docker/docker-compose.yaml | 8 +- .../teleoperation/teleop_isaaclab_env.py | 263 ++++++++++++++++++ .../teleoperation/teleop_se3_agent.py | 2 +- .../robomimic/play_ensemble.py | 2 +- .../config/franka/dev_ik_rel_env_place.py | 31 ++- .../manipulation/cube_lift/lift_env_cfg.py | 2 + .../cube_lift/mdp/observations.py | 4 +- 7 files changed, 290 insertions(+), 22 deletions(-) create mode 100644 scripts/environments/teleoperation/teleop_isaaclab_env.py diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 1f14102eced6..f1cf86c2daa9 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -112,8 +112,8 @@ services: tty: true devices: - /dev/hidraw0:/dev/hidraw0 - # - /dev/hidraw1:/dev/hidraw1 - # - /dev/hidraw2:/dev/hidraw2 + - /dev/hidraw1:/dev/hidraw1 + - /dev/hidraw2:/dev/hidraw2 # This service adds a ROS2 Humble # installation on top of the base image @@ -145,8 +145,8 @@ services: tty: true devices: - /dev/hidraw0:/dev/hidraw0 - # - /dev/hidraw1:/dev/hidraw1 - # - /dev/hidraw2:/dev/hidraw2 + - /dev/hidraw1:/dev/hidraw1 + - /dev/hidraw2:/dev/hidraw2 volumes: # isaac-sim diff --git a/scripts/environments/teleoperation/teleop_isaaclab_env.py b/scripts/environments/teleoperation/teleop_isaaclab_env.py new file mode 100644 index 000000000000..021ee5ff80ff --- /dev/null +++ b/scripts/environments/teleoperation/teleop_isaaclab_env.py @@ -0,0 +1,263 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Script to run a keyboard teleoperation with Isaac Lab manipulation environments.""" + +"""Launch Isaac Sim Simulator first.""" + +import argparse +from collections.abc import Callable + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Keyboard teleoperation for Isaac Lab environments.") +parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") +parser.add_argument( + "--teleop_device", + type=str, + default="keyboard", + help="Device for interacting with environment. Examples: keyboard, spacemouse, gamepad, handtracking, manusvive", +) +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--sensitivity", type=float, default=1.0, help="Sensitivity factor.") +parser.add_argument( + "--enable_pinocchio", + action="store_true", + default=False, + help="Enable Pinocchio.", +) +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +app_launcher_args = vars(args_cli) + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and + # not the one installed by Isaac Sim pinocchio is required by the Pink IK controllers and the + # GR1T2 retargeter + import pinocchio # noqa: F401 +if "handtracking" in args_cli.teleop_device.lower(): + app_launcher_args["xr"] = True + +# launch omniverse app +app_launcher = AppLauncher(app_launcher_args) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + + +import gymnasium as gym +import torch + +import omni.log + +from isaaclab.devices import Se3Gamepad, Se3GamepadCfg, Se3Keyboard, Se3KeyboardCfg, Se3SpaceMouse, Se3SpaceMouseCfg +from isaaclab.devices.openxr import remove_camera_configs +from isaaclab.devices.teleop_device_factory import create_teleop_device +from isaaclab.managers import TerminationTermCfg as DoneTerm + +import isaaclab_tasks # noqa: F401 +from isaaclab_tasks.manager_based.manipulation.lift import mdp +from isaaclab_tasks.utils import parse_env_cfg + +if args_cli.enable_pinocchio: + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + + +def main() -> None: + """ + Run keyboard teleoperation with Isaac Lab manipulation environment. + + Creates the environment, sets up teleoperation interfaces and callbacks, + and runs the main simulation loop until the application is closed. + + Returns: + None + """ + # parse configuration + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=args_cli.num_envs) + env_cfg.env_name = args_cli.task + # modify configuration + env_cfg.terminations.time_out = None + if "Lift" in args_cli.task: + # set the resampling time range to large number to avoid resampling + env_cfg.commands.object_pose.resampling_time_range = (1.0e9, 1.0e9) + # add termination condition for reaching the goal otherwise the environment won't reset + env_cfg.terminations.object_reached_goal = DoneTerm(func=mdp.object_reached_goal) + + if args_cli.xr: + # External cameras are not supported with XR teleop + # Check for any camera configs and disable them + env_cfg = remove_camera_configs(env_cfg) + env_cfg.sim.render.antialiasing_mode = "DLSS" + + try: + # create environment + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + # check environment name (for reach , we don't allow the gripper) + if "Reach" in args_cli.task: + omni.log.warn( + f"The environment '{args_cli.task}' does not support gripper control. The device command will be" + " ignored." + ) + except Exception as e: + omni.log.error(f"Failed to create environment: {e}") + simulation_app.close() + return + + # Flags for controlling teleoperation flow + should_reset_recording_instance = False + teleoperation_active = True + + # Callback handlers + def reset_recording_instance() -> None: + """ + Reset the environment to its initial state. + + Sets a flag to reset the environment on the next simulation step. + + Returns: + None + """ + nonlocal should_reset_recording_instance + should_reset_recording_instance = True + print("Reset triggered - Environment will reset on next step") + + def start_teleoperation() -> None: + """ + Activate teleoperation control of the robot. + + Enables the application of teleoperation commands to the environment. + + Returns: + None + """ + nonlocal teleoperation_active + teleoperation_active = True + print("Teleoperation activated") + + def stop_teleoperation() -> None: + """ + Deactivate teleoperation control of the robot. + + Disables the application of teleoperation commands to the environment. + + Returns: + None + """ + nonlocal teleoperation_active + teleoperation_active = False + print("Teleoperation deactivated") + + # Create device config if not already in env_cfg + teleoperation_callbacks: dict[str, Callable[[], None]] = { + "R": reset_recording_instance, + "START": start_teleoperation, + "STOP": stop_teleoperation, + "RESET": reset_recording_instance, + } + + # For hand tracking devices, add additional callbacks + if args_cli.xr: + # Default to inactive for hand tracking + teleoperation_active = False + else: + # Always active for other devices + teleoperation_active = True + + # Create teleop device from config if present, otherwise create manually + teleop_interface = None + try: + if hasattr(env_cfg, "teleop_devices") and args_cli.teleop_device in env_cfg.teleop_devices.devices: + teleop_interface = create_teleop_device( + args_cli.teleop_device, env_cfg.teleop_devices.devices, teleoperation_callbacks + ) + else: + omni.log.warn(f"No teleop device '{args_cli.teleop_device}' found in environment config. Creating default.") + # Create fallback teleop device + sensitivity = args_cli.sensitivity + if args_cli.teleop_device.lower() == "keyboard": + teleop_interface = Se3Keyboard( + Se3KeyboardCfg(pos_sensitivity=0.05 * sensitivity, rot_sensitivity=0.05 * sensitivity) + ) + elif args_cli.teleop_device.lower() == "spacemouse": + teleop_interface = Se3SpaceMouse( + Se3SpaceMouseCfg(pos_sensitivity=0.05 * sensitivity, rot_sensitivity=0.05 * sensitivity) + ) + elif args_cli.teleop_device.lower() == "gamepad": + teleop_interface = Se3Gamepad( + Se3GamepadCfg(pos_sensitivity=0.1 * sensitivity, rot_sensitivity=0.1 * sensitivity) + ) + else: + omni.log.error(f"Unsupported teleop device: {args_cli.teleop_device}") + omni.log.error("Supported devices: keyboard, spacemouse, gamepad, handtracking") + env.close() + simulation_app.close() + return + + # Add callbacks to fallback device + for key, callback in teleoperation_callbacks.items(): + try: + teleop_interface.add_callback(key, callback) + except (ValueError, TypeError) as e: + omni.log.warn(f"Failed to add callback for key {key}: {e}") + except Exception as e: + omni.log.error(f"Failed to create teleop device: {e}") + env.close() + simulation_app.close() + return + + if teleop_interface is None: + omni.log.error("Failed to create teleop interface") + env.close() + simulation_app.close() + return + + print(f"Using teleop device: {teleop_interface}") + + # reset environment + env.reset() + teleop_interface.reset() + + print("Teleoperation started. Press 'R' to reset the environment.") + + # simulate environment + while simulation_app.is_running(): + try: + # run everything in inference mode + with torch.inference_mode(): + # get device command + action = teleop_interface.advance() + + # Only apply teleop commands when active + if teleoperation_active: + # process actions + actions = action.repeat(env.num_envs, 1) + # apply actions + env.step(actions) + else: + env.sim.render() + + if should_reset_recording_instance: + env.reset() + should_reset_recording_instance = False + print("Environment reset complete") + except Exception as e: + omni.log.error(f"Error during simulation step: {e}") + break + + # close the simulator + env.close() + print("Environment closed") + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() diff --git a/scripts/environments/teleoperation/teleop_se3_agent.py b/scripts/environments/teleoperation/teleop_se3_agent.py index 021ee5ff80ff..993a0e61c992 100644 --- a/scripts/environments/teleoperation/teleop_se3_agent.py +++ b/scripts/environments/teleoperation/teleop_se3_agent.py @@ -21,7 +21,7 @@ default="keyboard", help="Device for interacting with environment. Examples: keyboard, spacemouse, gamepad, handtracking, manusvive", ) -parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--task", type=str, default="Dev-IK-Rel-Place-v0", help="Name of the task.") parser.add_argument("--sensitivity", type=float, default=1.0, help="Sensitivity factor.") parser.add_argument( "--enable_pinocchio", diff --git a/scripts/imitation_learning/robomimic/play_ensemble.py b/scripts/imitation_learning/robomimic/play_ensemble.py index fea3fdc51d5c..a0099677db37 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble.py +++ b/scripts/imitation_learning/robomimic/play_ensemble.py @@ -261,7 +261,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, backup_controller = BackupController(env, device) state_guess = 0 last_state =0 - recovery_mode= False + recovery_mode= True state_guessed = False recovery_triggered = False object_knocked = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py index 2555e6d49938..7c168a609057 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py @@ -8,6 +8,9 @@ from isaaclab.utils import configclass from isaaclab.assets import RigidObjectCfg, ArticulationCfg from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.assets import AssetBaseCfg +from isaaclab.sim.spawners.from_files import UsdFileCfg +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR from . import dev_env_cfg import math from isaaclab.managers import SceneEntityCfg @@ -29,7 +32,7 @@ def __post_init__(self): glassware = ChemistryGlassware() self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) self.scene.scale = glassware.scale(pos=[0.3, -0.3, 0.01]) - + self.events.reset_object_position = EventTerm( func=mdp.reset_multiple_root_state_uniform, mode="reset", @@ -42,20 +45,20 @@ def __post_init__(self): ) self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( prim_path="{ENV_REGEX_NS}/Robot", - init_state=ArticulationCfg.InitialStateCfg( - joint_pos={ + # init_state=ArticulationCfg.InitialStateCfg( + # joint_pos={ - "panda_joint1": 0.3281, - "panda_joint2": -0.3684, - "panda_joint3": -0.2787, - "panda_joint4": -2.6138, - "panda_joint5": -2.7527, - "panda_joint6": 2.4991, # +90° → keeps hand level - "panda_joint7": 0.3331, - "panda_finger_joint1": 0.04, # open gripper - "panda_finger_joint2": 0.04, - } - ), + # "panda_joint1": 0.3281, + # "panda_joint2": -0.3684, + # "panda_joint3": -0.2787, + # "panda_joint4": -2.6138, + # "panda_joint5": -2.7527, + # "panda_joint6": 2.4991, # +90° → keeps hand level + # "panda_joint7": 0.3331, + # "panda_finger_joint1": 0.04, # open gripper + # "panda_finger_joint2": 0.04, + # } + # ), ) # replace with relative position controller self.actions.arm_action = DifferentialInverseKinematicsActionCfg( diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index 236c61480980..09c318a5104a 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -59,7 +59,9 @@ class ObjectTableSceneCfg(InteractiveSceneCfg): # Table table = AssetBaseCfg( prim_path="{ENV_REGEX_NS}/Table", + #init_state=AssetBaseCfg.InitialStateCfg(pos=[0, 0, 0], rot=[1.0, 0, 0, 0]), init_state=AssetBaseCfg.InitialStateCfg(pos=[0.5, 0, 0], rot=[0.707, 0, 0, 0.707]), + #spawn=UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/ThorlabsTable/table_instanceable.usd"), spawn=UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd"), ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py index 6e12df6cf39c..bd827fcac247 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py @@ -161,14 +161,14 @@ def is_object_lifted( def ee_frame_pos(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] ee_frame_pos = ee_frame.data.target_pos_w[:, 0, :] - env.scene.env_origins[:, 0:3] - #print(f"EE pos : {ee_frame_pos}") + print(f"EE pos : {ee_frame_pos}") return ee_frame_pos def ee_frame_quat(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] ee_frame_quat = ee_frame.data.target_quat_w[:, 0, :] - #print(f"EE pos : {ee_frame_quat}") + print(f"EE quat : {ee_frame_quat}") return ee_frame_quat From e0315169752b472e014eb716b1e2afeb882f0a3d Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Fri, 9 Jan 2026 15:44:52 +0000 Subject: [PATCH 10/15] upgraded for difusion --- ...ng for Chemistry Laboratory Automation.pdf | Bin 0 -> 60316 bytes docker/.env.base | 2 +- .../bc_med_data_/20251217113929/config.json | 219 +++++++ .../bc_med_data_/20251217113936/config.json | 219 +++++++ .../bc_med_data_/20251217113940/config.json | 219 +++++++ .../bc_med_data_/20251217113940/config.json | 219 +++++++ .../bc_med_data_/20251217113940/config.json | 219 +++++++ .../bc_med_data_/20251217113941/config.json | 219 +++++++ .../bc_med_data_/20251217113941/config.json | 219 +++++++ .../bc_med_data_/20251217113937/config.json | 219 +++++++ .../bc_med_data_/20251217113937/config.json | 219 +++++++ .../bc_med_data_/20251217113937/config.json | 219 +++++++ .../bc_med_data_/20251217113938/config.json | 219 +++++++ .../bc_med_data_/20251217113938/config.json | 219 +++++++ .../bc_med_data_/20251217113939/config.json | 219 +++++++ .../bc_med_data_/20251217113939/config.json | 219 +++++++ .../bc_med_data_/20251217113939/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123102/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123103/config.json | 219 +++++++ .../bc_med_data_/20251211123106/config.json | 219 +++++++ .../bc_med_data_/20251211123106/config.json | 219 +++++++ .../bc_med_data_/20251211123106/config.json | 219 +++++++ .../bc_med_data_/20251211123106/config.json | 219 +++++++ .../bc_med_data_/20251211123107/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123103/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123103/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123104/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123104/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123104/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123105/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123105/config.json | 219 +++++++ .../bc_high_data_/20251009101852/config.json | 0 .../bc_med_data_/20251015111922/config.json | 0 .../bc_med_data_/20251211123105/config.json | 219 +++++++ .../robomimic/backup_controller.py | 43 +- .../robomimic/play_ensemble.py | 268 +++------ .../robomimic/train_ensemble.py | 67 ++- source/isaaclab/isaaclab/envs/mdp/events.py | 76 ++- .../isaaclab/safety/switchingLogic.py | 7 +- .../isaaclab_assets/robots/franka.py | 2 +- .../envs/cube_blueprint_mimic_env_cfg.py | 2 +- .../isaaclab_mimic/envs/cube_mimic_env_cfg.py | 37 +- .../beaker_pour/config/franka/__init__.py | 1 + .../agents/robomimic/diffusion_policy.json | 162 ++++++ .../cube_lift/config/franka/__init__.py | 3 + .../agents/robomimic/bc_rnn_low_dim.json | 10 +- .../agents/robomimic/diffusion_policy.json | 162 ++++++ .../config/franka/dev_ik_rel_env_place.py | 41 +- .../manipulation/cube_lift/lift_env_cfg.py | 7 +- .../cube_lift/mdp/observations.py | 18 +- .../cube_lift/mdp/terminations.py | 51 +- .../manipulation/stack_glassware/__init__.py | 9 + .../stack_glassware/config/__init__.py | 9 + .../stack_glassware/config/franka/__init__.py | 129 +++++ .../config/franka/agents/__init__.py | 4 + .../agents/robomimic/bc_rnn_image_84.json | 219 +++++++ .../agents/robomimic/bc_rnn_image_cosmos.json | 218 +++++++ .../agents/robomimic/bc_rnn_low_dim.json | 101 ++++ .../config/franka/bin_stack_ik_rel_env_cfg.py | 35 ++ .../franka/bin_stack_joint_pos_env_cfg.py | 207 +++++++ .../config/franka/stack_ik_abs_env_cfg.py | 59 ++ .../franka/stack_ik_rel_blueprint_env_cfg.py | 273 +++++++++ .../config/franka/stack_ik_rel_env_cfg.py | 69 +++ .../franka/stack_ik_rel_env_cfg_skillgen.py | 167 ++++++ ...stack_ik_rel_instance_randomize_env_cfg.py | 41 ++ .../stack_ik_rel_visuomotor_cosmos_env_cfg.py | 163 ++++++ .../franka/stack_ik_rel_visuomotor_env_cfg.py | 238 ++++++++ .../config/franka/stack_joint_pos_env_cfg.py | 168 ++++++ ...ck_joint_pos_instance_randomize_env_cfg.py | 204 +++++++ .../stack_glassware/config/galbot/__init__.py | 73 +++ .../config/galbot/stack_joint_pos_env_cfg.py | 278 +++++++++ .../config/galbot/stack_rmp_rel_env_cfg.py | 282 ++++++++++ .../config/ur10_gripper/__init__.py | 33 ++ .../ur10_gripper/stack_ik_rel_env_cfg.py | 80 +++ .../ur10_gripper/stack_joint_pos_env_cfg.py | 212 +++++++ .../stack_glassware/mdp/__init__.py | 11 + .../mdp/franka_stack_events.py | 314 +++++++++++ .../stack_glassware/mdp/observations.py | 532 ++++++++++++++++++ .../stack_glassware/mdp/terminations.py | 92 +++ .../stack_glassware/stack_env_cfg.py | 199 +++++++ .../stack_instance_randomize_env_cfg.py | 135 +++++ 99 files changed, 11830 insertions(+), 253 deletions(-) create mode 100644 Uncertainty Aware Imitation Learning for Chemistry Laboratory Automation.pdf create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model0/bc_med_data_/20251217113929/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model1/bc_med_data_/20251217113936/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model10/bc_med_data_/20251217113940/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model11/bc_med_data_/20251217113940/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model12/bc_med_data_/20251217113940/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model13/bc_med_data_/20251217113941/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model14/bc_med_data_/20251217113941/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model2/bc_med_data_/20251217113937/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model3/bc_med_data_/20251217113937/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model4/bc_med_data_/20251217113937/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model5/bc_med_data_/20251217113938/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model6/bc_med_data_/20251217113938/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model7/bc_med_data_/20251217113939/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model8/bc_med_data_/20251217113939/config.json create mode 100644 docs/place/policies/Dev-IK-Rel-Place-v0/model9/bc_med_data_/20251217113939/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model0/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model0/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model0/bc_med_data_/20251211123102/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model1/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model1/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model1/bc_med_data_/20251211123103/config.json create mode 100644 docs/training_runs/Lift_med/model10/bc_med_data_/20251211123106/config.json create mode 100644 docs/training_runs/Lift_med/model11/bc_med_data_/20251211123106/config.json create mode 100644 docs/training_runs/Lift_med/model12/bc_med_data_/20251211123106/config.json create mode 100644 docs/training_runs/Lift_med/model13/bc_med_data_/20251211123106/config.json create mode 100644 docs/training_runs/Lift_med/model14/bc_med_data_/20251211123107/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model2/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model2/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model2/bc_med_data_/20251211123103/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model3/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model3/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model3/bc_med_data_/20251211123103/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model4/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model4/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model4/bc_med_data_/20251211123104/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model5/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model5/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model5/bc_med_data_/20251211123104/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model6/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model6/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model6/bc_med_data_/20251211123104/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model7/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model7/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model7/bc_med_data_/20251211123105/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model8/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model8/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model8/bc_med_data_/20251211123105/config.json rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model9/bc_high_data_/20251009101852/config.json (100%) rename docs/training_runs/{Dev-IK-Rel-v1 => Lift_med}/model9/bc_med_data_/20251015111922/config.json (100%) create mode 100644 docs/training_runs/Lift_med/model9/bc_med_data_/20251211123105/config.json create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/diffusion_policy.json create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/diffusion_policy.json create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_image_84.json create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_image_cosmos.json create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_low_dim.json create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/bin_stack_ik_rel_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/bin_stack_joint_pos_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_abs_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_blueprint_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg_skillgen.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_instance_randomize_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_visuomotor_cosmos_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_visuomotor_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_instance_randomize_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/stack_joint_pos_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/stack_rmp_rel_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/stack_ik_rel_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/stack_joint_pos_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/franka_stack_events.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/observations.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/terminations.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_instance_randomize_env_cfg.py diff --git a/Uncertainty Aware Imitation Learning for Chemistry Laboratory Automation.pdf b/Uncertainty Aware Imitation Learning for Chemistry Laboratory Automation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1473e51baea3dd99b6c2dc7e580f9c410122b350 GIT binary patch literal 60316 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 BackupSMWaitTime.REST: @@ -88,10 +100,10 @@ def infer_state_machine( # print("[SM] APPR above obj") pose_pos = wp.transform_get_translation(current_object_pose[tid]) pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) - - des_ee_pose[tid] = wp.transform(pose_pos, pose_rot) - des_ee_pose[tid] = wp.transform_multiply(offset[tid], des_ee_pose[tid]) - gripper_state[tid] = GripperState.CLOSE + # Go to a safe height ABOVE the object (z + 0.15m) with x offset + safe_above_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y, pose_pos.z + 0.15) + des_ee_pose[tid] = wp.transform(safe_above_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN # Open gripper in preparation if distance_below_threshold( wp.transform_get_translation(ee_pose[tid]), wp.transform_get_translation(des_ee_pose[tid]), @@ -126,8 +138,8 @@ def infer_state_machine( # print("[SM] GRASP") pose_pos = wp.transform_get_translation(current_object_pose[tid]) pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) - # Apply offset in x-direction (5 cm = 0.05 m) - offset_pos = wp.vec3() #sample vial + 0.04 + # Stay at the approach position while closing gripper + offset_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y + 0.02, pose_pos.z + 0.02) des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) gripper_state[tid] = GripperState.CLOSE # wait for a while @@ -136,6 +148,7 @@ def infer_state_machine( print("[SM_INFO] : Moving from GRSP to LIFT_OBJECT") sm_state[tid] = BackupSM.LIFT_OBJECT sm_wait_time[tid] = 0.0 + elif state == BackupSM.LIFT_OBJECT: #print("[SM] LIFT") # uses starting position pose_pos = wp.transform_get_translation(object_pose[tid]) @@ -407,4 +420,4 @@ def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, curren # convert to torch #print(f'[SM DEBUG] new desired poition : {des_ee_pose}, gripper state {self.des_gripper_state}') return des_ee_pose , self.des_gripper_state, self.sm_state.clone().item() - #return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) + #return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/play_ensemble.py b/scripts/imitation_learning/robomimic/play_ensemble.py index a0099677db37..a7ea7565e273 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble.py +++ b/scripts/imitation_learning/robomimic/play_ensemble.py @@ -256,14 +256,13 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, recovery_cooldown_active = False recovery = [] recovery_steps = 0 + max_recovery_steps = 500 # Safety limit for recovery mode ##### CONFIG RECOVERY CONTROLLER #### backup_controller = BackupController(env, device) state_guess = 0 - last_state =0 - recovery_mode= True - state_guessed = False - recovery_triggered = False + last_state = 0 + recovery_mode = False object_knocked = False print(f'Running for horizon {horizon}') @@ -297,39 +296,62 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, metrics = ensemble_uncertainty(ensemble, obs) uncertainty = metrics['variance'] policy_actions = metrics['mean'] - # fix state guess - if sub_obs['grasp']: - if state_guess <4 : - state_guess = 4 + + # Robust state estimation based on actual observations + is_grasping = bool(sub_obs['grasp'].item()) if sub_obs['grasp'].numel() == 1 else bool(torch.any(sub_obs['grasp'])) + + # Update state guess based on actual gripper/object state + if is_grasping: + # Object is grasped - should be in LIFT or later states + if state_guess < 4: # LIFT_OBJECT = 4 + state_guess = 4 + print(f"[STATE] Updated to LIFT_OBJECT (grasp detected)") + else: + # Not grasping - if we thought we were lifting, we dropped it + if state_guess >= 4 and state_guess < 7: # Was in lift/move states + # Object dropped - need to re-approach + state_guess = 0 # Go back to REST to safely re-approach + print(f"[STATE] Reset to REST (grasp lost)") - sm_actions , state_guess = backup_controller.get_controller_action(state_guess, 0) + sm_actions, state_guess = backup_controller.get_controller_action(state_guess, 0) if last_state != state_guess: - #print(f"State {state_guess.item()}") + print(f"[STATE] Transition: {last_state} -> {state_guess}") last_state = state_guess - # this is the switching logic - if switchingLogic.check(uncertainty, i): + uncertainty_triggered = switchingLogic.check(uncertainty, i) + if uncertainty_triggered: # uncertainty triggered if use_recovery and not recovery_cooldown_active: # if we have switched to recovery - recovery_mode = True - recovery_activated_during_rollout+=1 - if not recovery_triggered : - print(f"[RECOVERY] Step {i}") - recovery_triggered = True + if not recovery_mode: + recovery_mode = True + recovery_activated_during_rollout+=1 + recovery_steps = 0 + print(f"[RECOVERY] Step {i} - Starting recovery from state {state_guess}") if recovery_mode: - # if holding the object, start with lifting actions = sm_actions - + recovery_steps += 1 + + # Exit recovery when task completes or after max steps + max_recovery_steps = 500 + if state_guess == 7 or recovery_steps > max_recovery_steps: # APPROACH_GOAL = 7 + print(f"[RECOVERY] Completed after {recovery_steps} steps, state={state_guess}") + recovery_mode = False + recovery_cooldown_active = True + recovery_cooldown_timer = recovery_cooldown_duration else: + # Decrement cooldown when not in recovery + if recovery_cooldown_active: + recovery_cooldown_timer -= 1 + if recovery_cooldown_timer <= 0: + recovery_cooldown_active = False + recovery_cooldown_timer = recovery_cooldown_duration + print("Recovery Cooldown Ended") + actions = policy_actions - if recovery_cooldown_timer <= 0: - recovery_cooldown_active = False - recovery_cooldown_timer = recovery_cooldown_duration - print("Recovery Cooldown Ended") # Unnormalize actions if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: @@ -396,153 +418,6 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, -def rollout_transformer(policy, env, success_term, horizon, device): - """Perform a single rollout of the policy in the environment, supporting sequence-based models.""" - policy.start_episode() - obs_dict, _ = env.reset() - traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[]) - - context_length = getattr(policy, "n_obs_steps", 1) # works for transformer or rnn models - # print(f"Policy's expected sequence length (policy.n_obs_steps): {getattr(policy, 'n_obs_steps', 1)}") - - obs_seq = [] # list of previous obs for context window - - # Initial obs_dict from env.reset() - # print("Initial obs_dict shapes from env.reset():") - # for k, v in obs_dict["policy"].items(): - # print(f" policy['{k}']: shape={v.shape}, ndim={v.ndim}") - - # try: - # if hasattr(policy.policy, 'encoder') and hasattr(policy.policy.encoder, 'input_obs_group_shapes'): - # print("Policy's internal expected input_obs_group_shapes:") - # for group, keys in policy.policy.encoder.input_obs_group_shapes.items(): - # print(f" Group '{group}':") - # for k, shape in keys.items(): - # print(f" Key '{k}': shape={shape}, len(shape)={len(shape)}") - # else: - # print("Could not find policy.policy.encoder.input_obs_group_shapes.") - # except Exception as e: - # print(f"Error accessing policy.policy.encoder.input_obs_group_shapes: {e}") - - - for i in range(horizon): - # Prepare current observations from env for policy input - current_policy_obs = {} - for k, v in obs_dict["policy"].items(): - # Ensure low-dim observations are 1D (D,) - # If env returns (1, D), squeeze the batch dimension - if v.ndim > 1 and v.shape[0] == 1: - processed_v = v.squeeze(0).to(device) # Apply squeeze - # print(f" DEBUG: Squeezed '{k}' from {v.shape} to {processed_v.shape}") # Add debug print - else: - processed_v = v.to(device) # No squeeze needed, assume (D,) - current_policy_obs[k] = processed_v - - # # AFTER processing, print the shapes in current_policy_obs - # if i == 0: # Only print for the first step to avoid spamming - # print("current_policy_obs shapes AFTER squeezing (if applicable):") - # for k, v in current_policy_obs.items(): - # print(f" '{k}': shape={v.shape}, ndim={v.ndim}") - - - # Handle image observations specifically (if any) - if hasattr(env.cfg, "image_obs_list"): - for image_name in env.cfg.image_obs_list: - if image_name in obs_dict["policy"].keys(): - image = obs_dict["policy"][image_name].to(device) - # Assuming image comes as (H, W, C) and needs to be (C, H, W) - # If it's already (1, H, W, C), squeeze the batch dim first. - if image.ndim == 4 and image.shape[0] == 1: - image = image.squeeze(0) # Remove initial batch if present - - # Permute and normalize after ensuring no batch dim - image = image.permute(2, 0, 1).clone().float() # (C, H, W) - image = image / 255.0 - image = image.clip(0.0, 1.0) - current_policy_obs[image_name] = image - - - # Add subtask terms for logging/analysis, but they are not fed to the policy - # as per your trace (only "policy" observations are listed in the policy's encoder). - # You had prints for these before, assuming they are okay. - - # Append to context buffer. obs_seq should hold items with shape (D,) or (C, H, W) - traj["obs"].append(current_policy_obs) # Store the current, processed observation - obs_seq.append(current_policy_obs) # This is what forms the sequence input - - if len(obs_seq) > context_length: - obs_seq = obs_seq[-context_length:] - - # Pad if not enough context - if len(obs_seq) < context_length: - padding_obs = {} - for k, v in obs_seq[0].items(): # Use shape of first element in obs_seq for padding - # If obs_seq[0][k] is (D,) then zeros_like creates (D,) - # If obs_seq[0][k] is (C,H,W) then zeros_like creates (C,H,W) - padding_obs[k] = torch.zeros_like(v) - obs_seq = [padding_obs] * (context_length - len(obs_seq)) + obs_seq - - # Convert context list to batched sequence dict - seq_input = {} - for key in obs_seq[0]: - # Each step[key] here should be (D,) or (C, H, W) - # torch.stack will create (context_length, D) or (context_length, C, H, W) - # unsqueeze(0) will add the batch dimension: (1, context_length, D) or (1, context_length, C, H, W) - seq_input[key] = torch.stack([step[key] for step in obs_seq], dim=0).to(device=device) - #seq_input[key] = torch.stack([step[key] for step in obs_seq], dim=0).unsqueeze(0).to(device=device) - - # Print the final seq_input shapes just before policy call - # if i == 0: # Only print for the first step - # print("seq_input shapes for policy just before call:") - # for k, v in seq_input.items(): - # print(f" '{k}': shape={v.shape}, ndim={v.ndim}") - - # if i == 0: # Only print for the first step - # print("seq_input shapes for policy just before policy(seq_input) call (LAST CHECK):") - # for k, v in seq_input.items(): - # print(f" '{k}': shape={v.shape}, ndim={v.ndim}") - - # calculate uncertainty - # uncertainty_dict = mc_dropout_uncertainty_eval(policy=policy, obs=seq_input, niters=15) - # traj['uncertainties'].append(uncertainty_dict['variance']) - - # Compute action from sequence - actions = policy(seq_input) - - #print(f"DEBUG (Pre-Unnorm): Policy output 'actions' shape: {actions.shape}, ndim: {actions.ndim}, type: {type(actions)}") - - # Unnormalize actions - if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: - actions = ( - (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) - ) / 2 + args_cli.norm_factor_min - #print(f"DEBUG (Post-Unnorm): Policy output 'actions' shape: {actions.shape}, ndim: {actions.ndim}, type: {type(actions)}") - # Convert policy output (torch.Tensor) to numpy array for env.step() - # Assume actions comes as (1, Action_Dim) from policy, squeeze to (Action_Dim,) - if isinstance(actions, torch.Tensor): - # If it's a tensor, convert it to numpy, ensuring it's 1D (7,) - # We already know policy returns (7,) so no squeeze is needed *here*. - actions = actions.cpu().numpy() - - actions_tensor = torch.from_numpy(actions).to(device=device).float() - actions_tensor = actions_tensor.unsqueeze(0) - # Apply actions - #obs_dict, _, terminated, truncated, _ = env.step(actions) - obs_dict, _, terminated, truncated, _ = env.step(actions_tensor) - # Record trajectory - traj["next_obs"] should append the raw observation dictionary from env.step(). - traj["actions"].append(actions.tolist()) - traj["next_obs"].append(obs_dict["policy"]) - - - # Check if rollout was successful - if bool(success_term.func(env, **success_term.params)[0]): - return True, traj - elif terminated or truncated: - return False, traj - - return False, traj - - def load_ensemble(device, ensemble_path): with open(ensemble_path, 'r') as file: @@ -614,40 +489,40 @@ def main(): # Lets set these to the 0.99 confidence parameters = { 'beaker_lift' :{ - 0 : { - "confidence_level": 0.010360572377319478, - "window_size": 9, - "max_peaks": 9 + 0 : { + "confidence_level": 0.018646507043923632, + "window_size": 15, + "max_peaks": 10 }, 1 : { - "confidence_level": 0.012117819935441015, - "window_size": 9, + "confidence_level": 0.018898154803458085, + "window_size": 10, "max_peaks": 9 }, 2 : { - "confidence_level": 0.0114854090040122, - "window_size": 9, - "max_peaks": 9 + "confidence_level": 0.017589774107725654, + "window_size": 15, + "max_peaks": 7 }, 3 : { - "confidence_level": 0.01721086513038985, - "window_size": 9, - "max_peaks": 9 + "confidence_level": 0.02829341592326851, + "window_size": 12, + "max_peaks": 8 }, 4 : { - "confidence_level": 0.01516669949421836, - "window_size": 9, - "max_peaks": 9 + "confidence_level": 0.029170220902127186, + "window_size": 15, + "max_peaks": 11 }, 5 : { - "confidence_level": 0.011445348395548671, - "window_size": 9, - "max_peaks": 9 + "confidence_level": 0.017449474558650185, + "window_size": 12, + "max_peaks": 7 }, 6 : { - "confidence_level": 0.0001330413469565007, - "window_size": 15, - "max_peaks": 9 + "confidence_level": 0.6324478323150455, + "window_size": 14, + "max_peaks": 14 }, }, @@ -689,6 +564,7 @@ def main(): failed_no_intervention =[] intervention = [] intervention_success = [] + knocked=0 intervention_failure = [] for trial in range(args_cli.num_rollouts): print(f"[INFO] Starting trial {trial}") @@ -749,15 +625,19 @@ def main(): intervention_failure.append(1) else: intervention.append(0) - print(f'Current rate {results.count(True)/len(results)}') - print(f"[INFO] Trial {trial}: {terminated}\n") + if "knocked" in traj['failure'] or (len(traj['failure']) > 0 and traj['failure'][-1] == "knocked"): + knocked+=1 + + print(f'Current success rate: {results.count(True)/len(results):.2%}') + print(f'Current intervention rate: {sum(intervention)/len(intervention):.2%} ({sum(intervention)}/{len(intervention)})') + print(f"[INFO] Trial {trial}: {'SUCCESS' if terminated else 'FAILED'}\n") #loghelper.stopEpoch(trial) print(f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials") print(f"Success rate: {results.count(True) / len(results)}") print(f'Failed runs with no intervention : {sum(failed_no_intervention)}') print(f"Intervention rate : {sum(intervention)/len(intervention)}. Of which success : {sum(intervention_success)}, of which failed {sum(intervention_failure)}") - + print(f"Number of times object knocked over : {knocked}") print(f"Trial Results: {results}\n") diff --git a/scripts/imitation_learning/robomimic/train_ensemble.py b/scripts/imitation_learning/robomimic/train_ensemble.py index 744753d669b1..047c62daece7 100644 --- a/scripts/imitation_learning/robomimic/train_ensemble.py +++ b/scripts/imitation_learning/robomimic/train_ensemble.py @@ -140,7 +140,7 @@ def normalize_hdf5_actions(config: Config, log_dir: str) -> str: # -def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str], video_dirs: list[str], use_config_seed: bool = True, ensemble_size: int = 1): +def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str], video_dirs: list[str], use_config_seed: bool = True, ensemble_size: int = 1, use_bootstrap: bool = False): """Train an ensemble of models using the algorithm specified in config. If ensemble_size is not specified, a single model will be trained. Args: @@ -149,6 +149,9 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] log_dirs: List of directories to save logs for each network in the ensemble. ckpt_dirs: List of directories to save checkpoints for each network in the ensemble. video_dirs: List of directories to save videos for each network in the ensemble. + use_config_seed: Whether to use config seed. + ensemble_size: Number of models in the ensemble. + use_bootstrap: If True, each model trains on a bootstrap sample (with replacement). """ # first set seeds if use_config_seed: @@ -262,6 +265,32 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] #config.algo.transformer.num_layers = 1 #config.algo.transformer.num_heads = 1 for model_num in range(ensemble_size): + # Set different seed for each model to ensure diversity + model_seed = config.train.seed + model_num + np.random.seed(model_seed) + torch.manual_seed(model_seed) + if torch.cuda.is_available(): + torch.cuda.manual_seed_all(model_seed) + print(f"\n============= Training Model {model_num} with Seed {model_seed} =============") + + # Create bootstrap sample if enabled (each model sees different data) + if use_bootstrap: + print(f"Creating bootstrap sample for model {model_num}...") + bootstrap_trainset = create_bootstrap_sample(trainset, seed=model_seed) + if isinstance(bootstrap_trainset, Subset): + bootstrap_sampler = bootstrap_trainset.dataset.get_dataset_sampler() if hasattr(bootstrap_trainset.dataset, 'get_dataset_sampler') else None + else: + bootstrap_sampler = bootstrap_trainset.get_dataset_sampler() if hasattr(bootstrap_trainset, 'get_dataset_sampler') else None + + train_loader = DataLoader( + dataset=bootstrap_trainset, + sampler=bootstrap_sampler, + batch_size=config.train.batch_size, + shuffle=(bootstrap_sampler is None), + num_workers=config.train.num_data_workers, + drop_last=True, + ) + # setup a wand run wand_experiment_name = f"{config.experiment.name}-model_{model_num}" run=wandb.init( @@ -375,7 +404,7 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] run.finish() #config.algo.transformer.num_layers = config.algo.transformer.num_layers + 1 #config.algo.transformer.num_heads = config.algo.transformer.num_heads + 1 - # run.finish() + #run.finish() # terminate logging data_logger.close() @@ -398,6 +427,34 @@ def keep_data_percentage(trainset, percentage): return trainset +def create_bootstrap_sample(trainset, seed: int): + """Create a bootstrap sample (sampling with replacement) from the training set. + + Each bootstrap sample contains N samples drawn with replacement from the original + dataset of size N. On average, ~63.2% of samples will be unique, with ~36.8% duplicates. + This creates diversity across ensemble members. + + Args: + trainset: The original training dataset. + seed: Random seed for reproducibility. + + Returns: + A Subset of the training data with bootstrap sampling. + """ + np.random.seed(seed) + total_size = len(trainset) + # Sample WITH replacement - same sample can appear multiple times + indices = np.random.choice(total_size, size=total_size, replace=True) + + # Count unique samples + unique_count = len(np.unique(indices)) + unique_percent = (unique_count / total_size) * 100 + + print(f"Bootstrap sample created: {unique_count}/{total_size} unique samples ({unique_percent:.1f}%)") + + return Subset(trainset, indices) + + def main(args: argparse.Namespace): """Train a model on a task using a specified algorithm. @@ -455,6 +512,7 @@ def main(args: argparse.Namespace): log_dirs, ckpt_dirs, video_dirs = [], [], [] for i in range(args.ensemble_size): + new_output_dir = f"{original_output_dir}/model{i}/" config.train.output_dir = new_output_dir log_dir, ckpt_dir, video_dir = TrainUtils.get_exp_dir(config) @@ -485,7 +543,8 @@ def main(args: argparse.Namespace): device=device, log_dirs=log_dirs, ckpt_dirs=ckpt_dirs, video_dirs=video_dirs, use_config_seed=True, - ensemble_size=args.ensemble_size + ensemble_size=args.ensemble_size, + use_bootstrap=args.use_bootstrap ) except Exception as e: @@ -520,6 +579,8 @@ def main(args: argparse.Namespace): parser.add_argument("--dataset_percentage", type=float, default=1.0, help="Percentage of samples from the dataset to use") parser.add_argument("--ensemble_size", type=int, default=15, help="Defines the number of networks in the ensemble.") + parser.add_argument("--use_bootstrap", action="store_true", default=False, + help="Use bootstrap sampling (with replacement) for each ensemble member. Creates more diversity.") args = parser.parse_args() diff --git a/source/isaaclab/isaaclab/envs/mdp/events.py b/source/isaaclab/isaaclab/envs/mdp/events.py index 5146e94daa8c..f9ffd47ba874 100644 --- a/source/isaaclab/isaaclab/envs/mdp/events.py +++ b/source/isaaclab/isaaclab/envs/mdp/events.py @@ -1099,7 +1099,8 @@ def reset_multiple_root_state_uniform( pose_range: dict[str, tuple[float, float]], velocity_range: dict[str, tuple[float, float]], asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), - asset2_cfg: SceneEntityCfg=SceneEntityCfg("stirplate") + asset2_cfg: SceneEntityCfg=SceneEntityCfg("stirplate"), + # asset3_cfg: SceneEntityCfg=SceneEntityCfg("scale") ): """Reset the asset root state to a random position and velocity uniformly within the given ranges. @@ -1117,9 +1118,12 @@ def reset_multiple_root_state_uniform( # extract the used quantities (to enable type-hinting) asset: RigidObject | Articulation = env.scene[asset_cfg.name] asset2: RigidObject | Articulation = env.scene[asset2_cfg.name] + # asset3: RigidObject | Articulation = env.scene[asset3_cfg.name] + # get default root state root_states = asset.data.default_root_state[env_ids].clone() root_states2 = asset2.data.default_root_state[env_ids].clone() + #root_states3 = asset3.data.default_root_state[env_ids].clone() # poses range_list = [pose_range.get(key, (0.0, 0.0)) for key in ["x", "y", "z", "roll", "pitch", "yaw"]] ranges = torch.tensor(range_list, device=asset.device) @@ -1128,12 +1132,78 @@ def reset_multiple_root_state_uniform( positions = root_states[:, 0:3] + env.scene.env_origins[env_ids] + rand_samples[:, 0:3] #print(f"positions : ", positions) - + # goal_pose = root_states3[:, 0:3] + env.scene.env_origins[env_ids] + rand_samples[:, 0:3] + orientations_delta = math_utils.quat_from_euler_xyz(rand_samples[:, 3], rand_samples[:, 4], rand_samples[:, 5]) orientations = math_utils.quat_mul(root_states[:, 3:7], orientations_delta) orientations2_delta = math_utils.quat_from_euler_xyz(rand_samples[:, 3], rand_samples[:, 4], rand_samples[:, 5]) orientations2 = math_utils.quat_mul(root_states2[:, 3:7], orientations_delta) + # orientations3_delta = math_utils.quat_from_euler_xyz(rand_samples[:, 3], rand_samples[:, 4], rand_samples[:, 5]) + #orientations3 = math_utils.quat_mul(root_states3[:, 3:7], orientations_delta) + # velocities + range_list = [velocity_range.get(key, (0.0, 0.0)) for key in ["x", "y", "z", "roll", "pitch", "yaw"]] + ranges = torch.tensor(range_list, device=asset.device) + rand_samples = math_utils.sample_uniform(ranges[:, 0], ranges[:, 1], (len(env_ids), 6), device=asset.device) + + velocities = root_states[:, 7:13] + rand_samples + positions[:,2] += 0.06 + # set into the physics simulation + asset.write_root_pose_to_sim(torch.cat([positions, orientations], dim=-1), env_ids=env_ids) + asset.write_root_velocity_to_sim(velocities, env_ids=env_ids) + # remote iks plate offset + positions[:,0] += 0.04 + positions[:,2] -= 0.06 + asset2.write_root_pose_to_sim(torch.cat([positions, orientations2], dim=-1), env_ids=env_ids) + asset2.write_root_velocity_to_sim(velocities, env_ids=env_ids) + # asset3.write_root_pose_to_sim(torch.cat([goal_pose, orientations3], dim=-1), env_ids=env_ids) + +def reset_place_root_state_uniform( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + pose_range: dict[str, tuple[float, float]], + velocity_range: dict[str, tuple[float, float]], + asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + asset2_cfg: SceneEntityCfg=SceneEntityCfg("stirplate"), + asset3_cfg: SceneEntityCfg=SceneEntityCfg("scale") +): + """Reset the asset root state to a random position and velocity uniformly within the given ranges. + + This function randomizes the root position and velocity of the asset. + + * It samples the root position from the given ranges and adds them to the default root position, before setting + them into the physics simulation. + * It samples the root orientation from the given ranges and sets them into the physics simulation. + * It samples the root velocity from the given ranges and sets them into the physics simulation. + + The function takes a dictionary of pose and velocity ranges for each axis and rotation. The keys of the + dictionary are ``x``, ``y``, ``z``, ``roll``, ``pitch``, and ``yaw``. The values are tuples of the form + ``(min, max)``. If the dictionary does not contain a key, the position or velocity is set to zero for that axis. + """ + # extract the used quantities (to enable type-hinting) + asset: RigidObject | Articulation = env.scene[asset_cfg.name] + asset2: RigidObject | Articulation = env.scene[asset2_cfg.name] + asset3: RigidObject | Articulation = env.scene[asset3_cfg.name] + # get default root state + root_states = asset.data.default_root_state[env_ids].clone() + root_states2 = asset2.data.default_root_state[env_ids].clone() + root_states3 = asset3.data.default_root_state[env_ids].clone() + # poses + range_list = [pose_range.get(key, (0.0, 0.0)) for key in ["x", "y", "z", "roll", "pitch", "yaw"]] + ranges = torch.tensor(range_list, device=asset.device) + #print(f"ranges : {ranges}") + rand_samples = math_utils.sample_uniform(ranges[:, 0], ranges[:, 1], (len(env_ids), 6), device=asset.device) + + positions = root_states[:, 0:3] + env.scene.env_origins[env_ids] + rand_samples[:, 0:3] + #print(f"positions : ", positions) + goal_pose = root_states3[:, 0:3] + env.scene.env_origins[env_ids] + rand_samples[:, 0:3] + + orientations_delta = math_utils.quat_from_euler_xyz(rand_samples[:, 3], rand_samples[:, 4], rand_samples[:, 5]) + orientations = math_utils.quat_mul(root_states[:, 3:7], orientations_delta) + orientations2_delta = math_utils.quat_from_euler_xyz(rand_samples[:, 3], rand_samples[:, 4], rand_samples[:, 5]) + orientations2 = math_utils.quat_mul(root_states2[:, 3:7], orientations_delta) + orientations3_delta = math_utils.quat_from_euler_xyz(rand_samples[:, 3], rand_samples[:, 4], rand_samples[:, 5]) + orientations3 = math_utils.quat_mul(root_states3[:, 3:7], orientations_delta) # velocities range_list = [velocity_range.get(key, (0.0, 0.0)) for key in ["x", "y", "z", "roll", "pitch", "yaw"]] ranges = torch.tensor(range_list, device=asset.device) @@ -1149,6 +1219,8 @@ def reset_multiple_root_state_uniform( positions[:,2] -= 0.06 asset2.write_root_pose_to_sim(torch.cat([positions, orientations2], dim=-1), env_ids=env_ids) asset2.write_root_velocity_to_sim(velocities, env_ids=env_ids) + asset3.write_root_pose_to_sim(torch.cat([goal_pose, orientations3], dim=-1), env_ids=env_ids) + def reset_root_state_with_random_orientation( env: ManagerBasedEnv, diff --git a/source/isaaclab/isaaclab/safety/switchingLogic.py b/source/isaaclab/isaaclab/safety/switchingLogic.py index 86dcc7e5030a..bfcd265adbdf 100644 --- a/source/isaaclab/isaaclab/safety/switchingLogic.py +++ b/source/isaaclab/isaaclab/safety/switchingLogic.py @@ -30,18 +30,19 @@ def halfway_check(self, step:int=0, grasp_state:bool=True): return True return False - +s def check(self, uncertainties, step) -> bool: # 1. Update windows for joint_num, unc in enumerate(uncertainties): # Check for bounds if uncertainties is smaller than self.joints self.traj[joint_num][step]=unc.item() + #print(f'Action comp {joint_num} uncertainty at step {step}: {unc.item()}') if step > self.params[joint_num]['window_size']: test_window = self.traj[joint_num][step-self.params[joint_num]['window_size']:step] peaks = sum(1 for x in test_window if x>= self.params[joint_num]['confidence_level']) - # print(f'joint {joint_num}, window: {test_window}') - # print(f"manually found peaks : {peaks}") + #print(f'action {joint_num}, window: {test_window}') + # print(f"Action comp {joint_num}, {unc.item()} limit {self.params[joint_num]['confidence_level']} manually found peaks : {peaks}") if peaks>=self.params[joint_num]['max_peaks']: if not self.triggered: print(f"Uncertaity in joint {joint_num} triggered") diff --git a/source/isaaclab_assets/isaaclab_assets/robots/franka.py b/source/isaaclab_assets/isaaclab_assets/robots/franka.py index 36d07253425b..1a8396520ca5 100644 --- a/source/isaaclab_assets/isaaclab_assets/robots/franka.py +++ b/source/isaaclab_assets/isaaclab_assets/robots/franka.py @@ -69,7 +69,7 @@ damping=1e2, ), }, - soft_joint_pos_limit_factor=1.0, + soft_joint_pos_limit_factor=0.9, ) """Configuration of Franka Emika Panda robot.""" diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py index b73ed476a072..0d3e07572fd7 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py @@ -6,7 +6,7 @@ from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig from isaaclab.utils import configclass -from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_obs import FrankaDevEnvCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_place import FrankaDevEnvCfg @configclass diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py index cf0eb52fdc4f..20181d3aa4a2 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py @@ -6,7 +6,7 @@ from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig from isaaclab.utils import configclass -from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_obs import FrankaDevEnvCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_place import FrankaDevEnvCfg @configclass @@ -30,6 +30,7 @@ def __post_init__(self): self.datagen_config.generation_select_src_per_subtask = True self.datagen_config.generation_transform_first_robot_pose = False self.datagen_config.generation_interpolate_from_last_target_pose = True + self.datagen_config.generation_relative = True self.datagen_config.max_num_failures = 100 self.datagen_config.seed = 101 @@ -67,7 +68,7 @@ def __post_init__(self): # Corresponding key for the binary indicator in "datagen_info" for completion subtask_term_signal="grasp", # Time offsets for data generation when splitting a trajectory - subtask_term_offset_range=(0, 0), + subtask_term_offset_range=(10, 20), # Selection strategy for source subtask segment selection_strategy="nearest_neighbor_object", # Optional parameters for the selection strategy function @@ -75,7 +76,7 @@ def __post_init__(self): # Amount of action noise to apply during this subtask action_noise=0.03, # Number of interpolation steps to bridge to this subtask segment - num_interpolation_steps=0, + num_interpolation_steps=5, # Additional fixed steps for the robot to reach the necessary pose num_fixed_steps=0, # If True, apply action noise during the interpolation phase and execution @@ -110,9 +111,33 @@ def __post_init__(self): # Each subtask involves manipulation with respect to a single object frame. object_ref="object", # End of final subtask does not need to be detected - # LOL YOU DO + # This is actually the lift subtask_term_signal="appr_goal", # No time offsets for the final subtask + subtask_term_offset_range=(10, 20), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_robot_distance", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=5, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + ) + ) + + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # End of final subtask - when using --annotate_subtask_start_signals, + # the last subtask must also have a signal name + subtask_term_signal="success", + # No time offsets for the final subtask subtask_term_offset_range=(0, 0), # Selection strategy for source subtask segment selection_strategy="nearest_neighbor_robot_distance", @@ -121,12 +146,14 @@ def __post_init__(self): # Amount of action noise to apply during this subtask action_noise=0.03, # Number of interpolation steps to bridge to this subtask segment - num_interpolation_steps=0, + num_interpolation_steps=5, # Additional fixed steps for the robot to reach the necessary pose num_fixed_steps=0, # If True, apply action noise during the interpolation phase and execution apply_noise_during_interpolation=False, ) ) + + self.subtask_configs["franka"] = subtask_configs \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/__init__.py index 14d95703522d..39a8d4c281c6 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/__init__.py @@ -54,6 +54,7 @@ "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), #"robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc.json"), }, disable_env_checker=True, diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/diffusion_policy.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/diffusion_policy.json new file mode 100644 index 000000000000..47fafeea8cb1 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/diffusion_policy.json @@ -0,0 +1,162 @@ +{ + "algo_name": "diffusion_policy", + "experiment": { + "name": "diffusion_policy", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "Lift_beaker_diffusion" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 50, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": null, + "additional_envs": null, + "render": false, + "render_video": false, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "terminate_on_success": true, + "n": 50, + "horizon": 400, + "rate": 50 + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/diffusion_policy", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "frame_stack": 1, + "pad_frame_stack": true, + "pad_seq_length": true, + "get_pad_mask": false, + "goal_mode": null, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "action_keys": [ + "actions" + ], + "cuda": true, + "batch_size": 256, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adamw", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 1.0, + "epoch_schedule": [], + "scheduler_type": "constant_with_warmup" + }, + "regularization": { + "L2": 0.0001 + } + } + }, + "horizon": { + "observation_horizon": 2, + "action_horizon": 8, + "prediction_horizon": 16 + }, + "unet": { + "enabled": true, + "diffusion_step_embed_dim": 256, + "down_dims": [256, 512, 1024], + "kernel_size": 5, + "n_groups": 8 + }, + "ema": { + "enabled": true, + "power": 0.75 + }, + "ddpm": { + "enabled": true, + "num_train_timesteps": 100, + "num_inference_timesteps": 100, + "beta_schedule": "squaredcos_cap_v2", + "clip_sample": true, + "prediction_type": "epsilon" + }, + "ddim": { + "enabled": false, + "num_train_timesteps": 100, + "num_inference_timesteps": 10, + "beta_schedule": "squaredcos_cap_v2", + "clip_sample": true, + "set_alpha_to_one": true, + "steps_offset": 0, + "prediction_type": "epsilon" + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0 + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + } +} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py index 16d4e657c655..7f7b0e7bae8d 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py @@ -121,6 +121,7 @@ "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), #"robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc.json"), }, disable_env_checker=True, @@ -135,6 +136,7 @@ "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), }, disable_env_checker=True, @@ -150,6 +152,7 @@ "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), }, disable_env_checker=True, diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json index db8907778f4b..d5071d660c5d 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json @@ -7,7 +7,7 @@ "terminal_output_to_txt": true, "log_tb": true, "log_wandb": true, - "wandb_proj_name": "Lift_beaker_new_demos_med_qual" + "wandb_proj_name": "pick_place_new_demos_med_qual" }, "save": { "enabled": true, @@ -36,14 +36,14 @@ }, "train": { "data": null, - "output_dir": "docs/training_runs/bc_rnn", + "output_dir": "/workspace/isaaclab/docs/training_runs/bc_rnn", "num_data_workers": 4, "hdf5_cache_mode": "low_dim", "hdf5_use_swmr": true, "hdf5_normalize_obs": false, "hdf5_filter_key": "train", "hdf5_validation_filter_key": "valid", - "seq_length": 10, + "seq_length": 100, "dataset_keys": [ "actions", "rewards", @@ -53,7 +53,7 @@ "goal_mode": null, "cuda": true, "batch_size": 100, - "num_epochs": 2000, + "num_epochs": 1500, "seed": 101 }, "algo": { @@ -87,7 +87,7 @@ "rnn": { "enabled": true, - "horizon": 10, + "horizon": 100, "hidden_dim": 400, "rnn_type": "LSTM", "num_layers": 2, diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/diffusion_policy.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/diffusion_policy.json new file mode 100644 index 000000000000..ae7cffd9ea58 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/diffusion_policy.json @@ -0,0 +1,162 @@ +{ + "algo_name": "diffusion_policy", + "experiment": { + "name": "diffusion_policy_place", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick_place_diffusion" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 50, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": false + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-Place-v0", + "additional_envs": null, + "render": false, + "render_video": false, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "terminate_on_success": true, + "n": 50, + "horizon": 400, + "rate": 50 + } + }, + "train": { + "data": null, + "output_dir": "/training_runs/diffusion_policy", + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 10, + "frame_stack": 1, + "pad_frame_stack": true, + "pad_seq_length": true, + "get_pad_mask": false, + "goal_mode": null, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "action_keys": [ + "actions" + ], + "cuda": true, + "batch_size": 256, + "num_epochs": 3000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adamw", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 1.0, + "epoch_schedule": [], + "scheduler_type": "constant_with_warmup" + }, + "regularization": { + "L2": 0.0001 + } + } + }, + "horizon": { + "observation_horizon": 2, + "action_horizon": 8, + "prediction_horizon": 16 + }, + "unet": { + "enabled": true, + "diffusion_step_embed_dim": 256, + "down_dims": [256, 512, 1024], + "kernel_size": 5, + "n_groups": 8 + }, + "ema": { + "enabled": true, + "power": 0.75 + }, + "ddpm": { + "enabled": true, + "num_train_timesteps": 100, + "num_inference_timesteps": 100, + "beta_schedule": "squaredcos_cap_v2", + "clip_sample": true, + "prediction_type": "epsilon" + }, + "ddim": { + "enabled": false, + "num_train_timesteps": 100, + "num_inference_timesteps": 10, + "beta_schedule": "squaredcos_cap_v2", + "clip_sample": true, + "set_alpha_to_one": true, + "steps_offset": 0, + "prediction_type": "epsilon" + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0 + } + }, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + } +} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py index 7c168a609057..fd754ccfbc58 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py @@ -7,19 +7,23 @@ from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg from isaaclab.utils import configclass from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.managers import ObservationTermCfg as ObsTerm from isaaclab.managers import EventTermCfg as EventTerm from isaaclab.assets import AssetBaseCfg from isaaclab.sim.spawners.from_files import UsdFileCfg from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG from . import dev_env_cfg import math from isaaclab.managers import SceneEntityCfg from isaaclab_assets.glassware.glassware import ChemistryGlassware from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab.managers import TerminationTermCfg as DoneTerm ## # Pre-defined configs ## from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip +from isaaclab_assets.robots.universal_robots import UR10e_ROBOTIQ_GRIPPER_CFG @@ -34,31 +38,34 @@ def __post_init__(self): self.scene.scale = glassware.scale(pos=[0.3, -0.3, 0.01]) self.events.reset_object_position = EventTerm( - func=mdp.reset_multiple_root_state_uniform, + func=mdp.reset_place_root_state_uniform, mode="reset", params={ "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, "velocity_range": {}, "asset_cfg": SceneEntityCfg("object", body_names="Object"), - "asset2_cfg" : SceneEntityCfg("stirplate") + "asset2_cfg" : SceneEntityCfg("stirplate"), + "asset3_cfg" : SceneEntityCfg("scale") + }, ) + #self.scene.robot = UR10e_ROBOTIQ_GRIPPER_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( prim_path="{ENV_REGEX_NS}/Robot", - # init_state=ArticulationCfg.InitialStateCfg( - # joint_pos={ + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ - # "panda_joint1": 0.3281, - # "panda_joint2": -0.3684, - # "panda_joint3": -0.2787, - # "panda_joint4": -2.6138, - # "panda_joint5": -2.7527, - # "panda_joint6": 2.4991, # +90° → keeps hand level - # "panda_joint7": 0.3331, - # "panda_finger_joint1": 0.04, # open gripper - # "panda_finger_joint2": 0.04, - # } - # ), + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), ) # replace with relative position controller self.actions.arm_action = DifferentialInverseKinematicsActionCfg( @@ -69,8 +76,10 @@ def __post_init__(self): scale=0.5, body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), ) + self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) - + self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index 09c318a5104a..eb2138fa5ddf 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -136,7 +136,8 @@ class PolicyCfg(ObsGroup): joint_pos = ObsTerm(func=mdp.joint_pos_rel) joint_vel = ObsTerm(func=mdp.joint_vel_rel) object_position = ObsTerm(func=mdp.object_position_in_robot_root_frame) - target_object_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object_pose"}) + #target_object_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object_pose"}) + target_object_position = ObsTerm(func=mdp.target_position, params={"object_cfg": SceneEntityCfg("scale")}) actions = ObsTerm(func=mdp.last_action) # object_to_target = ObsTerm(func=mdp.object_near_goal) eef_pos = ObsTerm(func=mdp.ee_frame_pos) @@ -242,7 +243,7 @@ class EventCfg: # "asset_cfg": SceneEntityCfg("object", body_names="Object"), # }, params={ - "scale_range": {"x": (0.5, 0.5), "y": (0.5, 0.5), "z": (0.6, 0.7)}, + "scale_range": {"x": (0.5, 0.5), "y": (0.5, 0.5), "z": (0.6, 0.6)}, "asset_cfg": SceneEntityCfg("object", body_names="Object"), }, # params={ @@ -353,7 +354,7 @@ def __post_init__(self): # general settings self.decimation = 2 - self.episode_length_s = 60 + self.episode_length_s = 500 # simulation settings self.sim.dt = 0.01 # 100Hz self.sim.render_interval = self.decimation diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py index bd827fcac247..75355c70d87a 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py @@ -151,6 +151,7 @@ def is_object_lifted( ): #return true when object z coord above a threshold value object = env.scene[obj_cfg.name] + print(f"Object z pos : {object.data.root_pos_w[:, 2]}") # if object.data.root_pos_w[:, 2].item() > threshold : # print(f"Observed Object Lifted : {object.data.root_pos_w[:, 2].item()}") # loghelper.logsubtask(LogType.LIFT) @@ -161,14 +162,14 @@ def is_object_lifted( def ee_frame_pos(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] ee_frame_pos = ee_frame.data.target_pos_w[:, 0, :] - env.scene.env_origins[:, 0:3] - print(f"EE pos : {ee_frame_pos}") + #print(f"EE pos : {ee_frame_pos}") return ee_frame_pos def ee_frame_quat(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] ee_frame_quat = ee_frame.data.target_quat_w[:, 0, :] - print(f"EE quat : {ee_frame_quat}") + #print(f"EE quat : {ee_frame_quat}") return ee_frame_quat @@ -306,4 +307,15 @@ def object_knocked(env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = Sc if tilt_deg.cpu().detach().numpy()[0] > max_tilt: # print("object knocked") return torch.tensor([True], device='cuda:0') - else :return torch.tensor([False], device='cuda:0') \ No newline at end of file + else :return torch.tensor([False], device='cuda:0') + +def target_position( + env: ManagerBasedRLEnv, + object_cfg: SceneEntityCfg = SceneEntityCfg("scale"), + # loghelper : LoggingHelper = LoggingHelper() +) -> torch.Tensor: + """The position of the object in the robot's root frame.""" + object: RigidObject = env.scene[object_cfg.name] + object_pos_w = object.data.root_pos_w[:, :3] + #print(f"target position : {object_pos_w}") + return object_pos_w \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py index 007a82d6ca83..6065810915a6 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py @@ -16,6 +16,7 @@ from isaaclab.assets import RigidObject, Articulation from isaaclab.managers import SceneEntityCfg +from isaaclab.utils.math import combine_frame_transforms, matrix_from_quat from isaaclab.sensors import FrameTransformer from isaaclab.utils.math import combine_frame_transforms, subtract_frame_transforms @@ -94,4 +95,52 @@ def placed( #print("Gripper state : ",robot.data.joint_pos[:, -1] > gripper_open_val) gripper_open = robot.data.joint_pos[:, -1] > gripper_open_val state = torch.logical_and(object_position, gripper_open) - return state \ No newline at end of file + return state + +def object_stacked_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"),lower_object_cfg: SceneEntityCfg = SceneEntityCfg("goal"), + xy_threshold: float = 0.1, height_threshold: float = 0.1, height_diff: float = 0.05, + upright_good_deg: float = 30.0, gripper_open_val: torch.Tensor = torch.tensor([0.04]), logging=False) -> torch.Tensor: + """Stacked AND sufficiently upright (≤ upright_good_deg).""" + + upper: RigidObject = env.scene[upper_object_cfg.name] + tilt_deg = upright_tilt_deg(upper.data.root_quat_w, upper.data.default_root_state[:, 3:7]) + upright_good = tilt_deg <= upright_good_deg + stacked = object_stacked(env, robot_cfg, upper_object_cfg, lower_object_cfg, + xy_threshold, height_threshold, height_diff, gripper_open_val) + stacked_upright = stacked & upright_good + + #if logging: + #rising = log(env, "object_stacked_upright", stacked_upright, f"Stacked (upright ≤ {upright_good_deg}°)") + # idx = torch.nonzero(rising, as_tuple=False).squeeze(-1) + #if idx.numel() > 0: + # print(f"[stacked-upright tilt] n={int(idx.numel())} sample={tilt_deg[idx][:5].tolist()}") + + return stacked_upright + + +def upright_tilt_deg(q_cur, q_init) -> torch.Tensor: + u_cur, u_init = matrix_from_quat(q_cur)[:, :, 2], matrix_from_quat(q_init)[:, :, 2] + return torch.rad2deg(torch.acos((u_cur * u_init).sum(-1).clamp(-1.0, 1.0))) + + +def object_stacked(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"), + lower_object_cfg: SceneEntityCfg = SceneEntityCfg("goal"), + xy_threshold: float = 0.1, height_threshold: float = 0.1, height_diff: float = 0.05, + gripper_open_val: torch.Tensor = torch.tensor([0.04]),logging=False) -> torch.Tensor: + """Check if an object is stacked by the specified robot.""" + + robot: Articulation = env.scene[robot_cfg.name] + upper_object: RigidObject = env.scene[upper_object_cfg.name] + lower_object: RigidObject = env.scene[lower_object_cfg.name] + pos_diff = upper_object.data.root_pos_w - lower_object.data.root_pos_w + height_dist = torch.linalg.vector_norm(pos_diff[:, 2:], dim=1) + xy_dist = torch.linalg.vector_norm(pos_diff[:, :2], dim=1) + stacked = torch.logical_and(xy_dist < xy_threshold, (height_dist - height_diff) < height_threshold) + # stacked = torch.logical_and(torch.isclose(robot.data.joint_pos[:, -1], + # gripper_open_val.to(env.device), atol=1e-4, rtol=1e-4), stacked) + # stacked = torch.logical_and(torch.isclose(robot.data.joint_pos[:, -2], + # gripper_open_val.to(env.device), atol=1e-4, rtol=1e-4), stacked) + print(f"For DEBUG : STACKED STATUS : {stacked}") + return stacked \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/__init__.py new file mode 100644 index 000000000000..236b2daab6e4 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Configurations for the object stack environments.""" + +# We leave this file empty since we don't want to expose any configs in this package directly. +# We still need this file to import the "config" module in the parent package. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/__init__.py new file mode 100644 index 000000000000..236b2daab6e4 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Configurations for the object stack environments.""" + +# We leave this file empty since we don't want to expose any configs in this package directly. +# We still need this file to import the "config" module in the parent package. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/__init__.py new file mode 100644 index 000000000000..23bcce5f86b4 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/__init__.py @@ -0,0 +1,129 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +import gymnasium as gym +import os + +from . import ( + agents, + bin_stack_ik_rel_env_cfg, + stack_ik_abs_env_cfg, + stack_ik_rel_blueprint_env_cfg, + stack_ik_rel_env_cfg, + stack_ik_rel_env_cfg_skillgen, + stack_ik_rel_instance_randomize_env_cfg, + stack_ik_rel_visuomotor_cosmos_env_cfg, + stack_ik_rel_visuomotor_env_cfg, + stack_joint_pos_env_cfg, + stack_joint_pos_instance_randomize_env_cfg, +) + +## +# Register Gym environments. +## + +## +# Joint Position Control +## + +gym.register( + id="Isaac-Stack-Glassware-Franka-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_joint_pos_env_cfg.FrankaCubeStackEnvCfg, + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Glassware-Instance-Randomize-Franka-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_joint_pos_instance_randomize_env_cfg.FrankaCubeStackInstanceRandomizeEnvCfg, + }, + disable_env_checker=True, +) + + +## +# Inverse Kinematics - Relative Pose Control +## + +gym.register( + id="Isaac-Stack-Glassware-Franka-IK-Rel-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_ik_rel_env_cfg.FrankaCubeStackEnvCfg, + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Glassware-Franka-IK-Rel-Visuomotor-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_ik_rel_visuomotor_env_cfg.FrankaCubeStackVisuomotorEnvCfg, + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_image_84.json"), + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Glassware-Franka-IK-Rel-Visuomotor-Cosmos-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_ik_rel_visuomotor_cosmos_env_cfg.FrankaCubeStackVisuomotorCosmosEnvCfg, + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_image_cosmos.json"), + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Glassware-Franka-IK-Abs-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_ik_abs_env_cfg.FrankaCubeStackEnvCfg, + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Glassware-Instance-Randomize-Franka-IK-Rel-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_ik_rel_instance_randomize_env_cfg.FrankaCubeStackInstanceRandomizeEnvCfg, + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Glassware-Franka-IK-Rel-Blueprint-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_ik_rel_blueprint_env_cfg.FrankaCubeStackBlueprintEnvCfg, + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Glassware-Franka-IK-Rel-Skillgen-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": stack_ik_rel_env_cfg_skillgen.FrankaCubeStackSkillgenEnvCfg, + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Glassware-Bin-Franka-IK-Rel-Mimic-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": bin_stack_ik_rel_env_cfg.FrankaBinStackEnvCfg, + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + }, + disable_env_checker=True, +) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/__init__.py new file mode 100644 index 000000000000..2e924fbf1b13 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_image_84.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_image_84.json new file mode 100644 index 000000000000..94e722fd0b11 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_image_84.json @@ -0,0 +1,219 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_rnn_image_franka_stack", + "validate": false, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 20, + "epochs": [], + "on_best_validation": false, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 500, + "env": null, + "additional_envs": null, + "render": false, + "render_video": false, + "rollout": { + "enabled": false + } + }, + "train": { + "data": null, + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": null, + "hdf5_validation_filter_key": null, + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 16, + "num_epochs": 600, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 5, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 1000, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos" + ], + "rgb": [ + "table_cam", + "wrist_cam" + ], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": "CropRandomizer", + "obs_randomizer_kwargs": { + "crop_height": 76, + "crop_width": 76, + "num_crops": 1, + "pos_enc": false + } + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + } +} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_image_cosmos.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_image_cosmos.json new file mode 100644 index 000000000000..5f68551765b9 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_image_cosmos.json @@ -0,0 +1,218 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_rnn_image_franka_stack_cosmos", + "validate": false, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 20, + "epochs": [], + "on_best_validation": false, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 500, + "env": null, + "additional_envs": null, + "render": false, + "render_video": false, + "rollout": { + "enabled": false + } + }, + "train": { + "data": null, + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": null, + "hdf5_validation_filter_key": null, + "seq_length": 10, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 16, + "num_epochs": 600, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 5, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 1000, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos" + ], + "rgb": [ + "table_cam" + ], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": { + "feature_dimension": 64, + "flatten": true, + "backbone_class": "ResNet18Conv", + "backbone_kwargs": { + "pretrained": false, + "input_coord_conv": false + }, + "pool_class": "SpatialSoftmax", + "pool_kwargs": { + "num_kp": 32, + "learnable_temperature": false, + "temperature": 1.0, + "noise_std": 0.0, + "output_variance": false + } + }, + "obs_randomizer_class": "CropRandomizer", + "obs_randomizer_kwargs": { + "crop_height": 180, + "crop_width": 180, + "num_crops": 1, + "pos_enc": false + } + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + } +} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_low_dim.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_low_dim.json new file mode 100644 index 000000000000..23e490971f39 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/agents/robomimic/bc_rnn_low_dim.json @@ -0,0 +1,101 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_rnn_low_dim_franka_stack", + "validate": false, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": 100, + "epochs": [], + "on_best_validation": false, + "on_best_rollout_return": false, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "env": null, + "additional_envs": null, + "render": false, + "render_video": false, + "rollout": { + "enabled": false + } + }, + "train": { + "data": null, + "num_data_workers": 4, + "hdf5_cache_mode": "all", + "hdf5_use_swmr": true, + "hdf5_normalize_obs": false, + "hdf5_filter_key": null, + "hdf5_validation_filter_key": null, + "seq_length": 10, + "dataset_keys": [ + "actions" + ], + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 2000, + "seed": 101 + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.001, + "decay_factor": 0.1, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [], + "gmm": { + "enabled": true, + "num_modes": 5, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "rnn": { + "enabled": true, + "horizon": 10, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object" + ], + "rgb": [], + "depth": [], + "scan": [] + } + } + } +} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/bin_stack_ik_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/bin_stack_ik_rel_env_cfg.py new file mode 100644 index 000000000000..fd4b386249e6 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/bin_stack_ik_rel_env_cfg.py @@ -0,0 +1,35 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass + +from . import bin_stack_joint_pos_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +@configclass +class FrankaBinStackEnvCfg(bin_stack_joint_pos_env_cfg.FrankaBinStackEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/bin_stack_joint_pos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/bin_stack_joint_pos_env_cfg.py new file mode 100644 index 000000000000..c59153600af5 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/bin_stack_joint_pos_env_cfg.py @@ -0,0 +1,207 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + + +import isaaclab.sim as sim_utils +from isaaclab.assets import RigidObjectCfg +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, ISAACLAB_NUCLEUS_DIR + +from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp +from isaaclab_tasks.manager_based.manipulation.stack_glassware.mdp import franka_stack_events +from isaaclab_tasks.manager_based.manipulation.stack_glassware.stack_env_cfg import StackEnvCfg + +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_CFG # isort: skip + + +@configclass +class EventCfg: + """Configuration for events.""" + + init_franka_arm_pose = EventTerm( + func=franka_stack_events.set_default_joint_pose, + # mode="startup", + mode="reset", + params={ + "default_pose": [0.0444, -0.1894, -0.1107, -2.5148, 0.0044, 2.3775, 0.6952, 0.0400, 0.0400], + }, + ) + + randomize_franka_joint_state = EventTerm( + func=franka_stack_events.randomize_joint_by_gaussian_offset, + mode="reset", + params={ + "mean": 0.0, + "std": 0.02, + "asset_cfg": SceneEntityCfg("robot"), + }, + ) + + # Reset blue bin position + reset_blue_bin_pose = EventTerm( + func=franka_stack_events.randomize_object_pose, + mode="reset", + params={ + # Keep bin at fixed position - no randomization + "pose_range": {"x": (0.4, 0.4), "y": (0.0, 0.0), "z": (0.0203, 0.0203), "yaw": (0.0, 0.0)}, + "min_separation": 0.0, + "asset_cfgs": [SceneEntityCfg("blue_sorting_bin")], + }, + ) + + # Reset cube 1 to initial position (inside the bin) + reset_cube_1_pose = EventTerm( + func=franka_stack_events.randomize_object_pose, + mode="reset", + params={ + "pose_range": {"x": (0.4, 0.4), "y": (0.0, 0.0), "z": (0.0203, 0.0203), "yaw": (0.0, 0.0)}, + "min_separation": 0.0, + "asset_cfgs": [SceneEntityCfg("cube_1")], + }, + ) + + # Reset cube 2 and 3 to initial position (outside the bin, to the left and right) + reset_cube_pose = EventTerm( + func=franka_stack_events.randomize_object_pose, + mode="reset", + params={ + "pose_range": {"x": (0.65, 0.70), "y": (-0.18, 0.18), "z": (0.0203, 0.0203), "yaw": (-1.0, 1.0, 0)}, + "min_separation": 0.1, + "asset_cfgs": [SceneEntityCfg("cube_2"), SceneEntityCfg("cube_3")], + }, + ) + + +@configclass +class FrankaBinStackEnvCfg(StackEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set events + self.events = EventCfg() + + # Set Franka as robot + self.scene.robot = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + self.scene.robot.spawn.semantic_tags = [("class", "robot")] + + # Add semantics to table + self.scene.table.spawn.semantic_tags = [("class", "table")] + + # Add semantics to ground + self.scene.plane.semantic_tags = [("class", "ground")] + + # Set actions for the specific robot type (franka) + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", joint_names=["panda_joint.*"], scale=0.5, use_default_offset=True + ) + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + # utilities for gripper status check + self.gripper_joint_names = ["panda_finger_.*"] + self.gripper_open_val = 0.04 + self.gripper_threshold = 0.005 + + # Rigid body properties of each cube + cube_properties = RigidBodyPropertiesCfg( + solver_position_iteration_count=40, + solver_velocity_iteration_count=1, + max_angular_velocity=1000.0, + max_linear_velocity=1000.0, + max_depenetration_velocity=5.0, + disable_gravity=False, + ) + + # Blue sorting bin positioned at table center + self.scene.blue_sorting_bin = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/BlueSortingBin", + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.0, 0.0203), rot=(1.0, 0.0, 0.0, 0.0)), + spawn=UsdFileCfg( + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Mimic/nut_pour_task/nut_pour_assets/sorting_bin_blue.usd", + scale=(1.1, 1.6, 3.3), + rigid_props=sim_utils.RigidBodyPropertiesCfg(), + ), + ) + + # Cube 1 positioned at the bottom center of the blue bin + # The bin is at (0.4, 0.0, 0.0203), so cube_1 should be slightly above it + self.scene.cube_1 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_1", + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.0, 0.025), rot=(1.0, 0.0, 0.0, 0.0)), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/blue_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ) + + # Cube 2 positioned outside the bin (to the right) + self.scene.cube_2 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_2", + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.85, 0.25, 0.0203), rot=(1.0, 0.0, 0.0, 0.0)), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ) + + # Cube 3 positioned outside the bin (to the left) + self.scene.cube_3 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_3", + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.85, -0.25, 0.0203), rot=(1.0, 0.0, 0.0, 0.0)), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/green_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ) + + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.0), + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_rightfinger", + name="tool_rightfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_leftfinger", + name="tool_leftfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + ], + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_abs_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_abs_env_cfg.py new file mode 100644 index 000000000000..17dbe0ce2a72 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_abs_env_cfg.py @@ -0,0 +1,59 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.devices.device_base import DevicesCfg +from isaaclab.devices.openxr.openxr_device import OpenXRDevice, OpenXRDeviceCfg +from isaaclab.devices.openxr.retargeters.manipulator.gripper_retargeter import GripperRetargeterCfg +from isaaclab.devices.openxr.retargeters.manipulator.se3_abs_retargeter import Se3AbsRetargeterCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass + +from . import stack_joint_pos_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +@configclass +class FrankaCubeStackEnvCfg(stack_joint_pos_env_cfg.FrankaCubeStackEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=False, ik_method="dls"), + ) + + self.teleop_devices = DevicesCfg( + devices={ + "handtracking": OpenXRDeviceCfg( + retargeters=[ + Se3AbsRetargeterCfg( + bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT, + zero_out_xy_rotation=True, + use_wrist_rotation=False, + use_wrist_position=True, + sim_device=self.sim.device, + ), + GripperRetargeterCfg( + bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT, sim_device=self.sim.device + ), + ], + sim_device=self.sim.device, + xr_cfg=self.xr, + ), + } + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_blueprint_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_blueprint_env_cfg.py new file mode 100644 index 000000000000..72ffa93a5ab4 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_blueprint_env_cfg.py @@ -0,0 +1,273 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import os +import torch +from torchvision.utils import save_image + +import isaaclab.sim as sim_utils +import isaaclab.utils.math as math_utils +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs import ManagerBasedEnv +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import Camera, CameraCfg, RayCasterCamera, TiledCamera +from isaaclab.utils import configclass + +from ... import mdp +from . import stack_joint_pos_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +def image( + env: ManagerBasedEnv, + sensor_cfg: SceneEntityCfg = SceneEntityCfg("tiled_camera"), + data_type: str = "rgb", + convert_perspective_to_orthogonal: bool = False, + normalize: bool = True, + save_image_to_file: bool = False, + image_path: str = "image", +) -> torch.Tensor: + """Images of a specific datatype from the camera sensor. + + If the flag :attr:`normalize` is True, post-processing of the images are performed based on their + data-types: + + - "rgb": Scales the image to (0, 1) and subtracts with the mean of the current image batch. + - "depth" or "distance_to_camera" or "distance_to_plane": Replaces infinity values with zero. + + Args: + env: The environment the cameras are placed within. + sensor_cfg: The desired sensor to read from. Defaults to SceneEntityCfg("tiled_camera"). + data_type: The data type to pull from the desired camera. Defaults to "rgb". + convert_perspective_to_orthogonal: Whether to orthogonalize perspective depth images. + This is used only when the data type is "distance_to_camera". Defaults to False. + normalize: Whether to normalize the images. This depends on the selected data type. + Defaults to True. + + Returns: + The images produced at the last time-step + """ + # extract the used quantities (to enable type-hinting) + sensor: TiledCamera | Camera | RayCasterCamera = env.scene.sensors[sensor_cfg.name] + + # obtain the input image + images = sensor.data.output[data_type] + + # depth image conversion + if (data_type == "distance_to_camera") and convert_perspective_to_orthogonal: + images = math_utils.orthogonalize_perspective_depth(images, sensor.data.intrinsic_matrices) + + # rgb/depth image normalization + if normalize: + if data_type == "rgb": + images = images.float() / 255.0 + mean_tensor = torch.mean(images, dim=(1, 2), keepdim=True) + images -= mean_tensor + elif "distance_to" in data_type or "depth" in data_type: + images[images == float("inf")] = 0 + elif data_type == "normals": + images = (images + 1.0) * 0.5 + + if save_image_to_file: + dir_path, _ = os.path.split(image_path) + if dir_path: + os.makedirs(dir_path, exist_ok=True) + if images.dtype == torch.uint8: + images = images.float() / 255.0 + # Get total successful episodes + total_successes = 0 + if hasattr(env, "recorder_manager") and env.recorder_manager is not None: + total_successes = env.recorder_manager.exported_successful_episode_count + + for tile in range(images.shape[0]): + tile_chw = torch.swapaxes(images[tile : tile + 1].unsqueeze(1), 1, -1).squeeze(-1) + filename = ( + f"{image_path}_{data_type}_trial_{total_successes}_tile_{tile}_step_{env.common_step_counter}.png" + ) + save_image(tile_chw, filename) + + return images.clone() + + +@configclass +class ObservationsCfg: + """Observation specifications for the MDP.""" + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group with state values.""" + + actions = ObsTerm(func=mdp.last_action) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + object = ObsTerm(func=mdp.object_obs) + cube_positions = ObsTerm(func=mdp.cube_positions_in_world_frame) + cube_orientations = ObsTerm(func=mdp.cube_orientations_in_world_frame) + eef_pos = ObsTerm(func=mdp.ee_frame_pos) + eef_quat = ObsTerm(func=mdp.ee_frame_quat) + gripper_pos = ObsTerm(func=mdp.gripper_pos) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class RGBCameraPolicyCfg(ObsGroup): + """Observations for policy group with RGB images.""" + + table_cam_normals = ObsTerm( + func=image, + params={ + "sensor_cfg": SceneEntityCfg("table_cam"), + "data_type": "normals", + "normalize": True, + "save_image_to_file": True, + "image_path": "table_cam", + }, + ) + table_cam_segmentation = ObsTerm( + func=image, + params={ + "sensor_cfg": SceneEntityCfg("table_cam"), + "data_type": "semantic_segmentation", + "normalize": False, + "save_image_to_file": True, + "image_path": "table_cam", + }, + ) + table_high_cam_normals = ObsTerm( + func=image, + params={ + "sensor_cfg": SceneEntityCfg("table_high_cam"), + "data_type": "normals", + "normalize": True, + "save_image_to_file": True, + "image_path": "table_high_cam", + }, + ) + table_high_cam_segmentation = ObsTerm( + func=image, + params={ + "sensor_cfg": SceneEntityCfg("table_high_cam"), + "data_type": "semantic_segmentation", + "normalize": False, + "save_image_to_file": True, + "image_path": "table_high_cam", + }, + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class SubtaskCfg(ObsGroup): + """Observations for subtask group.""" + + grasp_1 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_2"), + }, + ) + stack_1 = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("cube_2"), + "lower_object_cfg": SceneEntityCfg("cube_1"), + }, + ) + grasp_2 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_3"), + }, + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + # observation groups + policy: PolicyCfg = PolicyCfg() + rgb_camera: RGBCameraPolicyCfg = RGBCameraPolicyCfg() + subtask_terms: SubtaskCfg = SubtaskCfg() + + +@configclass +class FrankaCubeStackBlueprintEnvCfg(stack_joint_pos_env_cfg.FrankaCubeStackEnvCfg): + observations: ObservationsCfg = ObservationsCfg() + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + self.scene.robot.spawn.semantic_tags = [("class", "robot")] + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + MAPPING = { + "class:cube_1": (255, 36, 66, 255), + "class:cube_2": (255, 184, 48, 255), + "class:cube_3": (55, 255, 139, 255), + "class:table": (255, 237, 218, 255), + "class:ground": (100, 100, 100, 255), + "class:robot": (125, 125, 125, 255), + "class:UNLABELLED": (125, 125, 125, 255), + "class:BACKGROUND": (10, 10, 10, 255), + } + + # Set table view camera + self.scene.table_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/table_cam", + update_period=0.0333, + height=704, + width=1280, + data_types=["rgb", "semantic_segmentation", "normals"], + colorize_semantic_segmentation=True, + semantic_segmentation_mapping=MAPPING, + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5) + ), + offset=CameraCfg.OffsetCfg(pos=(1.0, 0.0, 0.33), rot=(-0.3799, 0.5963, 0.5963, -0.3799), convention="ros"), + ) + + # Set table view camera + self.scene.table_high_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/table_high_cam", + update_period=0.0333, + height=704, + width=1280, + data_types=["rgb", "semantic_segmentation", "normals"], + colorize_semantic_segmentation=True, + semantic_segmentation_mapping=MAPPING, + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(1.5, 1.0e5) + ), + offset=CameraCfg.OffsetCfg(pos=(1.4, 1.8, 1.2), rot=(-0.1393, 0.2025, 0.8185, -0.5192), convention="ros"), + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg.py new file mode 100644 index 000000000000..f173ee644cef --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg.py @@ -0,0 +1,69 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.devices.device_base import DevicesCfg +from isaaclab.devices.keyboard import Se3KeyboardCfg +from isaaclab.devices.openxr.openxr_device import OpenXRDevice, OpenXRDeviceCfg +from isaaclab.devices.openxr.retargeters.manipulator.gripper_retargeter import GripperRetargeterCfg +from isaaclab.devices.openxr.retargeters.manipulator.se3_rel_retargeter import Se3RelRetargeterCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass + +from . import stack_joint_pos_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +@configclass +class FrankaCubeStackEnvCfg(stack_joint_pos_env_cfg.FrankaCubeStackEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + self.teleop_devices = DevicesCfg( + devices={ + "handtracking": OpenXRDeviceCfg( + retargeters=[ + Se3RelRetargeterCfg( + bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT, + zero_out_xy_rotation=True, + use_wrist_rotation=False, + use_wrist_position=True, + delta_pos_scale_factor=10.0, + delta_rot_scale_factor=10.0, + sim_device=self.sim.device, + ), + GripperRetargeterCfg( + bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT, sim_device=self.sim.device + ), + ], + sim_device=self.sim.device, + xr_cfg=self.xr, + ), + "keyboard": Se3KeyboardCfg( + pos_sensitivity=0.05, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + } + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg_skillgen.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg_skillgen.py new file mode 100644 index 000000000000..b95640be8a7b --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg_skillgen.py @@ -0,0 +1,167 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.devices.device_base import DevicesCfg +from isaaclab.devices.keyboard import Se3KeyboardCfg +from isaaclab.devices.openxr.openxr_device import OpenXRDevice, OpenXRDeviceCfg +from isaaclab.devices.openxr.retargeters.manipulator.gripper_retargeter import GripperRetargeterCfg +from isaaclab.devices.openxr.retargeters.manipulator.se3_rel_retargeter import Se3RelRetargeterCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.utils import configclass + +from ... import mdp +from . import stack_joint_pos_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +@configclass +class ObservationsCfg: + """Observation specifications for the MDP.""" + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group.""" + + actions = ObsTerm(func=mdp.last_action) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + object = ObsTerm(func=mdp.object_obs) + cube_positions = ObsTerm(func=mdp.cube_positions_in_world_frame) + cube_orientations = ObsTerm(func=mdp.cube_orientations_in_world_frame) + eef_pos = ObsTerm(func=mdp.ee_frame_pos) + eef_quat = ObsTerm(func=mdp.ee_frame_quat) + gripper_pos = ObsTerm(func=mdp.gripper_pos) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class RGBCameraPolicyCfg(ObsGroup): + """Observations for policy group with RGB images.""" + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class SubtaskCfg(ObsGroup): + """Observations for subtask group.""" + + grasp_1 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_2"), + }, + ) + stack_1 = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("cube_2"), + "lower_object_cfg": SceneEntityCfg("cube_1"), + }, + ) + grasp_2 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_3"), + }, + ) + stack_2 = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("cube_3"), + "lower_object_cfg": SceneEntityCfg("cube_2"), + }, + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + # observation groups + policy: PolicyCfg = PolicyCfg() + rgb_camera: RGBCameraPolicyCfg = RGBCameraPolicyCfg() + subtask_terms: SubtaskCfg = SubtaskCfg() + + +@configclass +class FrankaCubeStackSkillgenEnvCfg(stack_joint_pos_env_cfg.FrankaCubeStackEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Override observations with SkillGen-specific config + self.observations = ObservationsCfg() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + + self.teleop_devices = DevicesCfg( + devices={ + "handtracking": OpenXRDeviceCfg( + retargeters=[ + Se3RelRetargeterCfg( + bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT, + zero_out_xy_rotation=True, + use_wrist_rotation=False, + use_wrist_position=True, + delta_pos_scale_factor=10.0, + delta_rot_scale_factor=10.0, + sim_device=self.sim.device, + ), + GripperRetargeterCfg( + bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT, sim_device=self.sim.device + ), + ], + sim_device=self.sim.device, + xr_cfg=self.xr, + ), + "keyboard": Se3KeyboardCfg( + pos_sensitivity=0.05, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + } + ) + + # Apply skillgen-specific cube position randomization + self.events.randomize_cube_positions.params["pose_range"] = { + "x": (0.45, 0.6), + "y": (-0.23, 0.23), + "z": (0.0203, 0.0203), + "yaw": (-1.0, 1, 0), + } + + # Set the offset for the end effector to be 0.0 + for f in self.scene.ee_frame.target_frames: + if f.name == "end_effector": + f.offset.pos = [0.0, 0.0, 0.0] + break diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_instance_randomize_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_instance_randomize_env_cfg.py new file mode 100644 index 000000000000..cee2530ee4f7 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_instance_randomize_env_cfg.py @@ -0,0 +1,41 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass + +from . import stack_joint_pos_instance_randomize_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +@configclass +class FrankaCubeStackInstanceRandomizeEnvCfg( + stack_joint_pos_instance_randomize_env_cfg.FrankaCubeStackInstanceRandomizeEnvCfg +): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Reduce the number of environments due to camera resources + self.scene.num_envs = 2 + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_visuomotor_cosmos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_visuomotor_cosmos_env_cfg.py new file mode 100644 index 000000000000..024dcd3795fa --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_visuomotor_cosmos_env_cfg.py @@ -0,0 +1,163 @@ +# Copyright (c) 2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import isaaclab.sim as sim_utils +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import CameraCfg +from isaaclab.utils import configclass + +from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp + +from . import stack_ik_rel_visuomotor_env_cfg + + +@configclass +class ObservationsCfg: + """Observation specifications for the MDP.""" + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group with state values.""" + + actions = ObsTerm(func=mdp.last_action) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + object = ObsTerm(func=mdp.object_obs) + cube_positions = ObsTerm(func=mdp.cube_positions_in_world_frame) + cube_orientations = ObsTerm(func=mdp.cube_orientations_in_world_frame) + eef_pos = ObsTerm(func=mdp.ee_frame_pos) + eef_quat = ObsTerm(func=mdp.ee_frame_quat) + gripper_pos = ObsTerm(func=mdp.gripper_pos) + table_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("table_cam"), "data_type": "rgb", "normalize": False} + ) + wrist_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("wrist_cam"), "data_type": "rgb", "normalize": False} + ) + table_cam_segmentation = ObsTerm( + func=mdp.image, + params={"sensor_cfg": SceneEntityCfg("table_cam"), "data_type": "semantic_segmentation", "normalize": True}, + ) + table_cam_normals = ObsTerm( + func=mdp.image, + params={"sensor_cfg": SceneEntityCfg("table_cam"), "data_type": "normals", "normalize": True}, + ) + table_cam_depth = ObsTerm( + func=mdp.image, + params={ + "sensor_cfg": SceneEntityCfg("table_cam"), + "data_type": "distance_to_image_plane", + "normalize": True, + }, + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class SubtaskCfg(ObsGroup): + """Observations for subtask group.""" + + grasp_1 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_2"), + }, + ) + stack_1 = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("cube_2"), + "lower_object_cfg": SceneEntityCfg("cube_1"), + }, + ) + grasp_2 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_3"), + }, + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + # observation groups + policy: PolicyCfg = PolicyCfg() + subtask_terms: SubtaskCfg = SubtaskCfg() + + +@configclass +class FrankaCubeStackVisuomotorCosmosEnvCfg(stack_ik_rel_visuomotor_env_cfg.FrankaCubeStackVisuomotorEnvCfg): + observations: ObservationsCfg = ObservationsCfg() + + def __post_init__(self): + # post init of parent + super().__post_init__() + + import carb + from isaacsim.core.utils.carb import set_carb_setting + + carb_setting = carb.settings.get_settings() + set_carb_setting(carb_setting, "/rtx/domeLight/upperLowerStrategy", 4) + + SEMANTIC_MAPPING = { + "class:cube_1": (120, 230, 255, 255), + "class:cube_2": (255, 36, 66, 255), + "class:cube_3": (55, 255, 139, 255), + "class:table": (255, 237, 218, 255), + "class:ground": (100, 100, 100, 255), + "class:robot": (204, 110, 248, 255), + "class:UNLABELLED": (150, 150, 150, 255), + "class:BACKGROUND": (200, 200, 200, 255), + } + + # Set cameras + # Set wrist camera + self.scene.wrist_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand/wrist_cam", + update_period=0.0, + height=200, + width=200, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) + ), + offset=CameraCfg.OffsetCfg( + pos=(0.13, 0.0, -0.15), rot=(-0.70614, 0.03701, 0.03701, -0.70614), convention="ros" + ), + ) + + # Set table view camera + self.scene.table_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/table_cam", + update_period=0.0, + height=200, + width=200, + data_types=["rgb", "semantic_segmentation", "normals", "distance_to_image_plane"], + colorize_semantic_segmentation=True, + semantic_segmentation_mapping=SEMANTIC_MAPPING, + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) + ), + offset=CameraCfg.OffsetCfg( + pos=(1.0, 0.0, 0.4), rot=(0.35355, -0.61237, -0.61237, 0.35355), convention="ros" + ), + ) + + # Set settings for camera rendering + self.rerender_on_reset = True + self.sim.render.antialiasing_mode = "OFF" # disable dlss + + # List of image observations in policy observations + self.image_obs_list = ["table_cam", "wrist_cam"] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_visuomotor_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_visuomotor_env_cfg.py new file mode 100644 index 000000000000..96604b2a1af0 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_visuomotor_env_cfg.py @@ -0,0 +1,238 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import isaaclab.sim as sim_utils +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import CameraCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, NVIDIA_NUCLEUS_DIR + +from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp +from isaaclab_tasks.manager_based.manipulation.stack_glassware.mdp import franka_stack_events + +from . import stack_joint_pos_env_cfg + +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip + + +@configclass +class EventCfg(stack_joint_pos_env_cfg.EventCfg): + """Configuration for events.""" + + randomize_light = EventTerm( + func=franka_stack_events.randomize_scene_lighting_domelight, + mode="reset", + params={ + "intensity_range": (1500.0, 10000.0), + "color_variation": 0.4, + "textures": [ + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Cloudy/abandoned_parking_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Cloudy/evening_road_01_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Cloudy/lakeside_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/autoshop_01_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/carpentry_shop_01_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/hospital_room_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/hotel_room_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/old_bus_depot_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/small_empty_house_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/surgery_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Studio/photo_studio_01_4k.hdr", + ], + "default_intensity": 3000.0, + "default_color": (0.75, 0.75, 0.75), + "default_texture": "", + }, + ) + + randomize_table_visual_material = EventTerm( + func=franka_stack_events.randomize_visual_texture_material, + mode="reset", + params={ + "asset_cfg": SceneEntityCfg("table"), + "textures": [ + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Ash/Ash_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Bamboo_Planks/Bamboo_Planks_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Birch/Birch_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Cherry/Cherry_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Mahogany_Planks/Mahogany_Planks_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Oak/Oak_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Plywood/Plywood_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Timber/Timber_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Timber_Cladding/Timber_Cladding_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Wood/Walnut_Planks/Walnut_Planks_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Stone/Marble/Marble_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Stainless/Steel_Stainless_BaseColor.png", + ], + "default_texture": ( + f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/Materials/Textures/DemoTable_TableBase_BaseColor.png" + ), + }, + ) + + randomize_robot_arm_visual_texture = EventTerm( + func=franka_stack_events.randomize_visual_texture_material, + mode="reset", + params={ + "asset_cfg": SceneEntityCfg("robot"), + "textures": [ + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Aluminum_Cast/Aluminum_Cast_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Aluminum_Polished/Aluminum_Polished_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Brass/Brass_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Bronze/Bronze_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Brushed_Antique_Copper/Brushed_Antique_Copper_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Cast_Metal_Silver_Vein/Cast_Metal_Silver_Vein_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Copper/Copper_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Gold/Gold_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Iron/Iron_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/RustedMetal/RustedMetal_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Silver/Silver_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Carbon/Steel_Carbon_BaseColor.png", + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Stainless/Steel_Stainless_BaseColor.png", + ], + }, + ) + + +@configclass +class ObservationsCfg: + """Observation specifications for the MDP.""" + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group with state values.""" + + actions = ObsTerm(func=mdp.last_action) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + object = ObsTerm(func=mdp.object_obs) + cube_positions = ObsTerm(func=mdp.cube_positions_in_world_frame) + cube_orientations = ObsTerm(func=mdp.cube_orientations_in_world_frame) + eef_pos = ObsTerm(func=mdp.ee_frame_pos) + eef_quat = ObsTerm(func=mdp.ee_frame_quat) + gripper_pos = ObsTerm(func=mdp.gripper_pos) + table_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("table_cam"), "data_type": "rgb", "normalize": False} + ) + wrist_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("wrist_cam"), "data_type": "rgb", "normalize": False} + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class SubtaskCfg(ObsGroup): + """Observations for subtask group.""" + + grasp_1 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_2"), + }, + ) + stack_1 = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("cube_2"), + "lower_object_cfg": SceneEntityCfg("cube_1"), + }, + ) + grasp_2 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_3"), + }, + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + # observation groups + policy: PolicyCfg = PolicyCfg() + subtask_terms: SubtaskCfg = SubtaskCfg() + + +@configclass +class FrankaCubeStackVisuomotorEnvCfg(stack_joint_pos_env_cfg.FrankaCubeStackEnvCfg): + observations: ObservationsCfg = ObservationsCfg() + + # Evaluation settings + eval_mode = False + eval_type = None + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set events + self.events = EventCfg() + + # Set Franka as robot + # We switch here to a stiffer PD controller for IK tracking to be better. + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + self.scene.robot.spawn.semantic_tags = [("class", "robot")] + + # Set actions for the specific robot type (franka) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + ) + + # Set cameras + # Set wrist camera + self.scene.wrist_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand/wrist_cam", + update_period=0.0, + height=84, + width=84, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) + ), + offset=CameraCfg.OffsetCfg( + pos=(0.13, 0.0, -0.15), rot=(-0.70614, 0.03701, 0.03701, -0.70614), convention="ros" + ), + ) + + # Set table view camera + self.scene.table_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/table_cam", + update_period=0.0, + height=84, + width=84, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) + ), + offset=CameraCfg.OffsetCfg( + pos=(1.0, 0.0, 0.4), rot=(0.35355, -0.61237, -0.61237, 0.35355), convention="ros" + ), + ) + + # Set settings for camera rendering + self.rerender_on_reset = True + self.sim.render.antialiasing_mode = "OFF" # disable dlss + + # List of image observations in policy observations + self.image_obs_list = ["table_cam", "wrist_cam"] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_env_cfg.py new file mode 100644 index 000000000000..6b8561684fe0 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_env_cfg.py @@ -0,0 +1,168 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import RigidObjectCfg +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR + +from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp +from isaaclab_tasks.manager_based.manipulation.stack_glassware.mdp import franka_stack_events +from isaaclab_tasks.manager_based.manipulation.stack_glassware.stack_env_cfg import StackEnvCfg + +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_CFG # isort: skip + + +@configclass +class EventCfg: + """Configuration for events.""" + + init_franka_arm_pose = EventTerm( + func=franka_stack_events.set_default_joint_pose, + mode="reset", + params={ + "default_pose": [0.0444, -0.1894, -0.1107, -2.5148, 0.0044, 2.3775, 0.6952, 0.0400, 0.0400], + }, + ) + + randomize_franka_joint_state = EventTerm( + func=franka_stack_events.randomize_joint_by_gaussian_offset, + mode="reset", + params={ + "mean": 0.0, + "std": 0.02, + "asset_cfg": SceneEntityCfg("robot"), + }, + ) + + randomize_cube_positions = EventTerm( + func=franka_stack_events.randomize_object_pose, + mode="reset", + params={ + "pose_range": {"x": (0.4, 0.6), "y": (-0.10, 0.10), "z": (0.0203, 0.0203), "yaw": (-1.0, 1, 0)}, + "min_separation": 0.1, + "asset_cfgs": [SceneEntityCfg("cube_1"), SceneEntityCfg("cube_2"), SceneEntityCfg("cube_3")], + }, + ) + + +@configclass +class FrankaCubeStackEnvCfg(StackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set events + self.events = EventCfg() + + # Set Franka as robot + self.scene.robot = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + self.scene.robot.spawn.semantic_tags = [("class", "robot")] + + # Add semantics to table + self.scene.table.spawn.semantic_tags = [("class", "table")] + + # Add semantics to ground + self.scene.plane.semantic_tags = [("class", "ground")] + + # Set actions for the specific robot type (franka) + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", joint_names=["panda_joint.*"], scale=0.5, use_default_offset=True + ) + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + # utilities for gripper status check + self.gripper_joint_names = ["panda_finger_.*"] + self.gripper_open_val = 0.04 + self.gripper_threshold = 0.005 + + # Rigid body properties of each cube + cube_properties = RigidBodyPropertiesCfg( + solver_position_iteration_count=16, + solver_velocity_iteration_count=1, + max_angular_velocity=1000.0, + max_linear_velocity=1000.0, + max_depenetration_velocity=5.0, + disable_gravity=False, + ) + + # Set each stacking cube deterministically + self.scene.cube_1 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_1", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.4, 0.0, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/blue_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + semantic_tags=[("class", "cube_1")], + ), + ) + self.scene.cube_2 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_2", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.55, 0.05, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + semantic_tags=[("class", "cube_2")], + ), + ) + self.scene.cube_3 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_3", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.60, -0.1, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/green_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + semantic_tags=[("class", "cube_3")], + ), + ) + + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.1034], + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_rightfinger", + name="tool_rightfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_leftfinger", + name="tool_leftfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + ], + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_instance_randomize_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_instance_randomize_env_cfg.py new file mode 100644 index 000000000000..360f1f6482e1 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_instance_randomize_env_cfg.py @@ -0,0 +1,204 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import torch + +from isaaclab.assets import RigidObjectCfg, RigidObjectCollectionCfg +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR + +from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp +from isaaclab_tasks.manager_based.manipulation.stack_glassware.mdp import franka_stack_events +from isaaclab_tasks.manager_based.manipulation.stack_glassware.stack_instance_randomize_env_cfg import ( + StackInstanceRandomizeEnvCfg, +) + +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_CFG # isort: skip + + +@configclass +class EventCfg: + """Configuration for events.""" + + init_franka_arm_pose = EventTerm( + func=franka_stack_events.set_default_joint_pose, + mode="startup", + params={ + "default_pose": [0.0444, -0.1894, -0.1107, -2.5148, 0.0044, 2.3775, 0.6952, 0.0400, 0.0400], + }, + ) + + randomize_franka_joint_state = EventTerm( + func=franka_stack_events.randomize_joint_by_gaussian_offset, + mode="reset", + params={ + "mean": 0.0, + "std": 0.02, + "asset_cfg": SceneEntityCfg("robot"), + }, + ) + + randomize_cubes_in_focus = EventTerm( + func=franka_stack_events.randomize_rigid_objects_in_focus, + mode="reset", + params={ + "asset_cfgs": [SceneEntityCfg("cube_1"), SceneEntityCfg("cube_2"), SceneEntityCfg("cube_3")], + "out_focus_state": torch.tensor([10.0, 10.0, 10.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + "pose_range": {"x": (0.4, 0.6), "y": (-0.10, 0.10), "z": (0.0203, 0.0203), "yaw": (-1.0, 1, 0)}, + "min_separation": 0.1, + }, + ) + + +@configclass +class FrankaCubeStackInstanceRandomizeEnvCfg(StackInstanceRandomizeEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set events + self.events = EventCfg() + + # Set Franka as robot + self.scene.robot = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Reduce the number of environments due to camera resources + self.scene.num_envs = 2 + + # Set actions for the specific robot type (franka) + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", joint_names=["panda_joint.*"], scale=0.5, use_default_offset=True + ) + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["panda_finger.*"], + open_command_expr={"panda_finger_.*": 0.04}, + close_command_expr={"panda_finger_.*": 0.0}, + ) + # utilities for gripper status check + self.gripper_joint_names = ["panda_finger_.*"] + self.gripper_open_val = 0.04 + self.gripper_threshold = 0.005 + + # Rigid body properties of each cube + cube_properties = RigidBodyPropertiesCfg( + solver_position_iteration_count=16, + solver_velocity_iteration_count=1, + max_angular_velocity=1000.0, + max_linear_velocity=1000.0, + max_depenetration_velocity=5.0, + disable_gravity=False, + ) + + # Set each stacking cube to be a collection of rigid objects + cube_1_config_dict = { + "blue_cube": RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_1_Blue", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.4, 0.0, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/blue_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ), + "red_cube": RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_1_Red", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.4, 0.0, 0.0403], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ), + } + + cube_2_config_dict = { + "red_cube": RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_2_Red", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.55, 0.05, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ), + "yellow_cube": RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_2_Yellow", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.55, 0.05, 0.0403], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/yellow_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ), + } + + cube_3_config_dict = { + "yellow_cube": RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_3_Yellow", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.60, -0.1, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/yellow_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ), + "green_cube": RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_2_Green", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.60, -0.1, 0.0403], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/green_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ), + } + + self.scene.cube_1 = RigidObjectCollectionCfg(rigid_objects=cube_1_config_dict) + self.scene.cube_2 = RigidObjectCollectionCfg(rigid_objects=cube_2_config_dict) + self.scene.cube_3 = RigidObjectCollectionCfg(rigid_objects=cube_3_config_dict) + + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_link0", + debug_vis=False, + visualizer_cfg=marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.1034], + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_rightfinger", + name="tool_rightfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_leftfinger", + name="tool_leftfinger", + offset=OffsetCfg( + pos=(0.0, 0.0, 0.046), + ), + ), + ], + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/__init__.py new file mode 100644 index 000000000000..7aa2ebad0fce --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/__init__.py @@ -0,0 +1,73 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + + +import gymnasium as gym + +## +# Register Gym environments. +## + +## +# RMPFlow (with Joint Limit Constraint and Obstacle Avoidance) for Galbot Single Arm Cube Stack Task +# you can use for both absolute and relative mode, by given the USE_RELATIVE_MODE environment variable +## +gym.register( + id="Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-RmpFlow-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.stack_rmp_rel_env_cfg:RmpFlowGalbotLeftArmCubeStackEnvCfg", + }, + disable_env_checker=True, +) + + +gym.register( + id="Isaac-Stack-Cube-Galbot-Right-Arm-Suction-RmpFlow-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.stack_rmp_rel_env_cfg:RmpFlowGalbotRightArmCubeStackEnvCfg", + }, + disable_env_checker=True, +) + + +## +# Visuomotor Task for Galbot Left ArmCube Stack Task +## +gym.register( + id="Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.stack_rmp_rel_env_cfg:RmpFlowGalbotLeftArmCubeStackVisuomotorEnvCfg", + }, + disable_env_checker=True, +) + +## +# Policy Close-loop Evaluation Task for Galbot Left Arm Cube Stack Task (in Joint Space) +## +gym.register( + id="Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-Joint-Position-Play-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": ( + f"{__name__}.stack_rmp_rel_env_cfg:GalbotLeftArmJointPositionCubeStackVisuomotorEnvCfg_PLAY" + ), + }, + disable_env_checker=True, +) + +## +# Policy Close-loop Evaluation Task for Galbot Left Arm Cube Stack Task (in Task Space) +## +gym.register( + id="Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-RmpFlow-Play-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.stack_rmp_rel_env_cfg:GalbotLeftArmRmpFlowCubeStackVisuomotorEnvCfg_PLAY", + }, + disable_env_checker=True, +) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/stack_joint_pos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/stack_joint_pos_env_cfg.py new file mode 100644 index 000000000000..66c4bc0c9a2e --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/stack_joint_pos_env_cfg.py @@ -0,0 +1,278 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + + +from isaaclab.assets import RigidObjectCfg, SurfaceGripperCfg +from isaaclab.envs.mdp.actions.actions_cfg import SurfaceGripperBinaryActionCfg +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR + +from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp +from isaaclab_tasks.manager_based.manipulation.stack_glassware.mdp import franka_stack_events +from isaaclab_tasks.manager_based.manipulation.stack_glassware.stack_env_cfg import ObservationsCfg, StackEnvCfg + +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip +from isaaclab_assets.robots.galbot import GALBOT_ONE_CHARLIE_CFG # isort: skip + + +@configclass +class EventCfg: + """Configuration for events.""" + + reset_all = EventTerm(func=mdp.reset_scene_to_default, mode="reset", params={"reset_joint_targets": True}) + + randomize_cube_positions = EventTerm( + func=franka_stack_events.randomize_object_pose, + mode="reset", + params={ + "pose_range": { + "x": (-0.2, 0.0), + "y": (0.20, 0.40), + "z": (0.0203, 0.0203), + "yaw": (-1.0, 1.0, 0.0), + }, + "min_separation": 0.1, + "asset_cfgs": [SceneEntityCfg("cube_1"), SceneEntityCfg("cube_2"), SceneEntityCfg("cube_3")], + }, + ) + + +@configclass +class ObservationGalbotLeftArmGripperCfg: + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group with state values.""" + + actions = ObsTerm(func=mdp.last_action) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + + object = ObsTerm( + func=mdp.object_abs_obs_in_base_frame, + params={ + "robot_cfg": SceneEntityCfg("robot"), + }, + ) + cube_positions = ObsTerm( + func=mdp.cube_poses_in_base_frame, params={"robot_cfg": SceneEntityCfg("robot"), "return_key": "pos"} + ) + cube_orientations = ObsTerm( + func=mdp.cube_poses_in_base_frame, params={"robot_cfg": SceneEntityCfg("robot"), "return_key": "quat"} + ) + + eef_pos = ObsTerm( + func=mdp.ee_frame_pose_in_base_frame, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "return_key": "pos", + }, + ) + eef_quat = ObsTerm( + func=mdp.ee_frame_pose_in_base_frame, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "return_key": "quat", + }, + ) + gripper_pos = ObsTerm( + func=mdp.gripper_pos, + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class SubtaskCfg(ObservationsCfg.SubtaskCfg): + """Observations for subtask group.""" + + grasp_1 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_2"), + }, + ) + stack_1 = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("cube_2"), + "lower_object_cfg": SceneEntityCfg("cube_1"), + }, + ) + grasp_2 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_3"), + }, + ) + + def __post_init__(self): + super().__post_init__() + + @configclass + class RGBCameraPolicyCfg(ObsGroup): + """Observations for policy group with RGB images.""" + + table_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("table_cam"), "data_type": "rgb", "normalize": False} + ) + wrist_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("wrist_cam"), "data_type": "rgb", "normalize": False} + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + subtask_terms: SubtaskCfg = SubtaskCfg() + policy: PolicyCfg = PolicyCfg() + rgb_camera: RGBCameraPolicyCfg = RGBCameraPolicyCfg() + + +@configclass +class GalbotLeftArmCubeStackEnvCfg(StackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + # MDP settings + + # Set events + self.events = EventCfg() + self.observations.policy = ObservationGalbotLeftArmGripperCfg().PolicyCfg() + self.observations.subtask_terms = ObservationGalbotLeftArmGripperCfg().SubtaskCfg() + + # Set galbot as robot + self.scene.robot = GALBOT_ONE_CHARLIE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set actions for the specific robot type (galbot) + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", joint_names=["left_arm_joint.*"], scale=0.5, use_default_offset=True + ) + # Enable Parallel Gripper + self.actions.gripper_action = mdp.BinaryJointPositionActionCfg( + asset_name="robot", + joint_names=["left_gripper_.*_joint"], + open_command_expr={"left_gripper_.*_joint": 0.035}, + close_command_expr={"left_gripper_.*_joint": 0.0}, + ) + self.gripper_joint_names = ["left_gripper_.*_joint"] + self.gripper_open_val = 0.035 + self.gripper_threshold = 0.010 + + # Rigid body properties of each cube + cube_properties = RigidBodyPropertiesCfg( + solver_position_iteration_count=16, + solver_velocity_iteration_count=1, + max_angular_velocity=1000.0, + max_linear_velocity=1000.0, + max_depenetration_velocity=5.0, + disable_gravity=False, + ) + + # Set each stacking cube deterministically + self.scene.cube_1 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_1", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.4, 0.0, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/blue_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ) + self.scene.cube_2 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_2", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.55, 0.05, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ) + self.scene.cube_3 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_3", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.60, -0.1, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/green_block.usd", + scale=(1.0, 1.0, 1.0), + rigid_props=cube_properties, + ), + ) + + # Listens to the required transforms + self.marker_cfg = FRAME_MARKER_CFG.copy() + self.marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + self.marker_cfg.prim_path = "/Visuals/FrameTransformer" + + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/base_link", + debug_vis=False, + visualizer_cfg=self.marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/left_gripper_tcp_link", + name="end_effector", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.0], + ), + ), + ], + ) + + +@configclass +class GalbotRightArmCubeStackEnvCfg(GalbotLeftArmCubeStackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + l, r = self.events.randomize_cube_positions.params["pose_range"]["y"] + self.events.randomize_cube_positions.params["pose_range"]["y"] = ( + -r, + -l, + ) # move to area below right hand + + # Set actions for the specific robot type (galbot) + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", joint_names=["right_arm_joint.*"], scale=0.5, use_default_offset=True + ) + + # Set surface gripper: Ensure the SurfaceGripper prim has the required attributes + self.scene.surface_gripper = SurfaceGripperCfg( + prim_path="{ENV_REGEX_NS}/Robot/right_suction_cup_tcp_link/SurfaceGripper", + max_grip_distance=0.02, + shear_force_limit=5000.0, + coaxial_force_limit=5000.0, + retry_interval=0.05, + ) + + # Set surface gripper action + self.actions.gripper_action = SurfaceGripperBinaryActionCfg( + asset_name="surface_gripper", + open_command=-1.0, + close_command=1.0, + ) + + self.scene.ee_frame.target_frames[0].prim_path = "{ENV_REGEX_NS}/Robot/right_suction_cup_tcp_link" diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/stack_rmp_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/stack_rmp_rel_env_cfg.py new file mode 100644 index 000000000000..f6e70e9038a2 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/galbot/stack_rmp_rel_env_cfg.py @@ -0,0 +1,282 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + + +import os + +import isaaclab.sim as sim_utils +from isaaclab.devices.device_base import DevicesCfg +from isaaclab.devices.keyboard import Se3KeyboardCfg +from isaaclab.devices.spacemouse import Se3SpaceMouseCfg +from isaaclab.envs.mdp.actions.rmpflow_actions_cfg import RMPFlowActionCfg +from isaaclab.sensors import CameraCfg, FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.utils import configclass + +from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp + +from . import stack_joint_pos_env_cfg + +## +# Pre-defined configs +## +from isaaclab.controllers.config.rmp_flow import ( # isort: skip + GALBOT_LEFT_ARM_RMPFLOW_CFG, + GALBOT_RIGHT_ARM_RMPFLOW_CFG, +) +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip + + +## +# RmpFlow Controller for Galbot Left Arm Cube Stack Task (with Parallel Gripper) +## +@configclass +class RmpFlowGalbotLeftArmCubeStackEnvCfg(stack_joint_pos_env_cfg.GalbotLeftArmCubeStackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # read use_relative_mode from environment variable + # True for record_demos, and False for replay_demos, annotate_demos and generate_demos + use_relative_mode_env = os.getenv("USE_RELATIVE_MODE", "True") + self.use_relative_mode = use_relative_mode_env.lower() in ["true", "1", "t"] + + # Set actions for the specific robot type (Galbot) + self.actions.arm_action = RMPFlowActionCfg( + asset_name="robot", + joint_names=["left_arm_joint.*"], + body_name="left_gripper_tcp_link", + controller=GALBOT_LEFT_ARM_RMPFLOW_CFG, + scale=1.0, + body_offset=RMPFlowActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + articulation_prim_expr="/World/envs/env_.*/Robot", + use_relative_mode=self.use_relative_mode, + ) + + # Set the simulation parameters + self.sim.dt = 1 / 60 + self.sim.render_interval = 6 + + self.decimation = 3 + self.episode_length_s = 30.0 + + self.teleop_devices = DevicesCfg( + devices={ + "keyboard": Se3KeyboardCfg( + pos_sensitivity=0.05, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + "spacemouse": Se3SpaceMouseCfg( + pos_sensitivity=0.05, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + } + ) + + +## +# RmpFlow Controller for Galbot Right Arm Cube Stack Task (with Surface Gripper) +## +@configclass +class RmpFlowGalbotRightArmCubeStackEnvCfg(stack_joint_pos_env_cfg.GalbotRightArmCubeStackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # read use_relative_mode from environment variable + # True for record_demos, and False for replay_demos, annotate_demos and generate_demos + use_relative_mode_env = os.getenv("USE_RELATIVE_MODE", "True") + self.use_relative_mode = use_relative_mode_env.lower() in ["true", "1", "t"] + + # Set actions for the specific robot type (Galbot) + self.actions.arm_action = RMPFlowActionCfg( + asset_name="robot", + joint_names=["right_arm_joint.*"], + body_name="right_suction_cup_tcp_link", + controller=GALBOT_RIGHT_ARM_RMPFLOW_CFG, + scale=1.0, + body_offset=RMPFlowActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + articulation_prim_expr="/World/envs/env_.*/Robot", + use_relative_mode=self.use_relative_mode, + ) + # Set the simulation parameters + self.sim.dt = 1 / 60 + self.sim.render_interval = 1 + + self.decimation = 3 + self.episode_length_s = 30.0 + + self.teleop_devices = DevicesCfg( + devices={ + "keyboard": Se3KeyboardCfg( + pos_sensitivity=0.05, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + "spacemouse": Se3SpaceMouseCfg( + pos_sensitivity=0.05, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + } + ) + + +## +# Visuomotor Env for Record, Generate and Replay (in Task Space) +## +@configclass +class RmpFlowGalbotLeftArmCubeStackVisuomotorEnvCfg(RmpFlowGalbotLeftArmCubeStackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set left and right wrist cameras for VLA policy training + self.scene.right_wrist_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/Robot/right_arm_camera_sim_view_frame/right_camera", + update_period=0.0333, + height=256, + width=256, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=18.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5) + ), + offset=CameraCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(0.5, -0.5, 0.5, -0.5), convention="ros"), + ) + + self.scene.left_wrist_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/Robot/left_arm_camera_sim_view_frame/left_camera", + update_period=0.0333, + height=256, + width=256, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=18.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5) + ), + offset=CameraCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(0.5, -0.5, 0.5, -0.5), convention="ros"), + ) + + # Set ego view camera + self.scene.ego_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/Robot/head_camera_sim_view_frame/head_camera", + update_period=0.0333, + height=256, + width=256, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=18.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5) + ), + offset=CameraCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(0.5, -0.5, 0.5, -0.5), convention="ros"), + ) + + # Set front view camera + self.scene.front_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/front_camera", + update_period=0.0333, + height=256, + width=256, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5) + ), + offset=CameraCfg.OffsetCfg(pos=(1.0, 0.0, 0.6), rot=(-0.3799, 0.5963, 0.5963, -0.3799), convention="ros"), + ) + + marker_right_camera_cfg = FRAME_MARKER_CFG.copy() + marker_right_camera_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_right_camera_cfg.prim_path = "/Visuals/FrameTransformerRightCamera" + + self.scene.right_arm_camera_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/base_link", + debug_vis=False, + visualizer_cfg=marker_right_camera_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/right_arm_camera_sim_view_frame", + name="right_camera", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.0], + rot=(0.5, -0.5, 0.5, -0.5), + ), + ), + ], + ) + + marker_left_camera_cfg = FRAME_MARKER_CFG.copy() + marker_left_camera_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_left_camera_cfg.prim_path = "/Visuals/FrameTransformerLeftCamera" + + self.scene.left_arm_camera_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/base_link", + debug_vis=False, + visualizer_cfg=marker_left_camera_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/left_arm_camera_sim_view_frame", + name="left_camera", + offset=OffsetCfg( + pos=[0.0, 0.0, 0.0], + rot=(0.5, -0.5, 0.5, -0.5), + ), + ), + ], + ) + + # Set settings for camera rendering + self.rerender_on_reset = True + self.sim.render.antialiasing_mode = "OFF" # disable dlss + + # List of image observations in policy observations + self.image_obs_list = ["ego_cam", "left_wrist_cam", "right_wrist_cam"] + + +## +# Task Env for VLA Policy Close-loop Evaluation (in Joint Space) +## + + +@configclass +class GalbotLeftArmJointPositionCubeStackVisuomotorEnvCfg_PLAY(RmpFlowGalbotLeftArmCubeStackVisuomotorEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", joint_names=["left_arm_joint.*"], scale=1.0, use_default_offset=False + ) + # Enable Parallel Gripper with AbsBinaryJointPosition Control + self.actions.gripper_action = mdp.AbsBinaryJointPositionActionCfg( + asset_name="robot", + threshold=0.030, + joint_names=["left_gripper_.*_joint"], + open_command_expr={"left_gripper_.*_joint": 0.035}, + close_command_expr={"left_gripper_.*_joint": 0.023}, + # real gripper close data is 0.0235, close to it to meet data distribution, but smaller to ensure robust grasping. + # during VLA inference, we set the close command to '0.023' since the VLA has never seen the gripper fully closed. + ) + + +## +# Task Envs for VLA Policy Close-loop Evaluation (in Task Space) +## +@configclass +class GalbotLeftArmRmpFlowCubeStackVisuomotorEnvCfg_PLAY(RmpFlowGalbotLeftArmCubeStackVisuomotorEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Enable Parallel Gripper with AbsBinaryJointPosition Control + self.actions.gripper_action = mdp.AbsBinaryJointPositionActionCfg( + asset_name="robot", + threshold=0.030, + joint_names=["left_gripper_.*_joint"], + open_command_expr={"left_gripper_.*_joint": 0.035}, + close_command_expr={"left_gripper_.*_joint": 0.023}, + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/__init__.py new file mode 100644 index 000000000000..41887a8df8b2 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/__init__.py @@ -0,0 +1,33 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +import gymnasium as gym + +## +# Register Gym environments. +## + + +## +# Inverse Kinematics - Relative Pose Control +## + +gym.register( + id="Isaac-Stack-Cube-UR10-Long-Suction-IK-Rel-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.stack_ik_rel_env_cfg:UR10LongSuctionCubeStackEnvCfg", + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Stack-Cube-UR10-Short-Suction-IK-Rel-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.stack_ik_rel_env_cfg:UR10ShortSuctionCubeStackEnvCfg", + }, + disable_env_checker=True, +) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/stack_ik_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/stack_ik_rel_env_cfg.py new file mode 100644 index 000000000000..00c379ef19fa --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/stack_ik_rel_env_cfg.py @@ -0,0 +1,80 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.devices.device_base import DevicesCfg +from isaaclab.devices.keyboard import Se3KeyboardCfg +from isaaclab.devices.spacemouse import Se3SpaceMouseCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass + +from . import stack_joint_pos_env_cfg + + +@configclass +class UR10LongSuctionCubeStackEnvCfg(stack_joint_pos_env_cfg.UR10LongSuctionCubeStackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set actions for the specific robot type (UR10 LONG SUCTION) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=[".*_joint"], + body_name="ee_link", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=1.0, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, -0.22]), + ) + + self.teleop_devices = DevicesCfg( + devices={ + "keyboard": Se3KeyboardCfg( + pos_sensitivity=0.02, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + "spacemouse": Se3SpaceMouseCfg( + pos_sensitivity=0.05, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + } + ) + + +@configclass +class UR10ShortSuctionCubeStackEnvCfg(stack_joint_pos_env_cfg.UR10ShortSuctionCubeStackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set actions for the specific robot type (UR10 SHORT SUCTION) + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=[".*_joint"], + body_name="ee_link", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=1.0, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, -0.159]), + ) + + self.teleop_devices = DevicesCfg( + devices={ + "keyboard": Se3KeyboardCfg( + pos_sensitivity=0.02, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + "spacemouse": Se3SpaceMouseCfg( + pos_sensitivity=0.05, + rot_sensitivity=0.05, + sim_device=self.sim.device, + ), + } + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/stack_joint_pos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/stack_joint_pos_env_cfg.py new file mode 100644 index 000000000000..7c27001b380f --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/ur10_gripper/stack_joint_pos_env_cfg.py @@ -0,0 +1,212 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.assets import RigidObjectCfg, SurfaceGripperCfg +from isaaclab.envs.mdp.actions.actions_cfg import SurfaceGripperBinaryActionCfg +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformerCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg +from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR + +from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp +from isaaclab_tasks.manager_based.manipulation.stack_glassware.mdp import franka_stack_events +from isaaclab_tasks.manager_based.manipulation.stack_glassware.stack_env_cfg import StackEnvCfg + +from isaaclab_assets.robots.universal_robots import ( # isort: skip + UR10_LONG_SUCTION_CFG, + UR10_SHORT_SUCTION_CFG, +) + +## +# Pre-defined configs +## +from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip + + +@configclass +class EventCfgLongSuction: + """Configuration for events.""" + + init_franka_arm_pose = EventTerm( + func=franka_stack_events.set_default_joint_pose, + mode="reset", + params={ + "default_pose": [0.0, -1.5707, 1.5707, -1.5707, -1.5707, 0.0], + }, + ) + + randomize_franka_joint_state = EventTerm( + func=franka_stack_events.randomize_joint_by_gaussian_offset, + mode="reset", + params={ + "mean": 0.0, + "std": 0.02, + "asset_cfg": SceneEntityCfg("robot"), + }, + ) + + randomize_cube_positions = EventTerm( + func=franka_stack_events.randomize_object_pose, + mode="reset", + params={ + "pose_range": {"x": (0.4, 0.6), "y": (-0.10, 0.10), "z": (0.0203, 0.0203), "yaw": (-1.0, 1.0, 0)}, + "min_separation": 0.1, + "asset_cfgs": [SceneEntityCfg("cube_1"), SceneEntityCfg("cube_2"), SceneEntityCfg("cube_3")], + }, + ) + + +@configclass +class UR10CubeStackEnvCfg(StackEnvCfg): + # Rigid body properties of each cube + cube_properties = RigidBodyPropertiesCfg( + solver_position_iteration_count=16, + solver_velocity_iteration_count=1, + max_angular_velocity=1000.0, + max_linear_velocity=1000.0, + max_depenetration_velocity=5.0, + disable_gravity=False, + ) + cube_scale = (1.0, 1.0, 1.0) + # Listens to the required transforms + marker_cfg = FRAME_MARKER_CFG.copy() + marker_cfg.markers["frame"].scale = (0.1, 0.1, 0.1) + marker_cfg.prim_path = "/Visuals/FrameTransformer" + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Set events + self.events = EventCfgLongSuction() + + # Set actions for the specific robot type (ur10) + self.actions.arm_action = mdp.JointPositionActionCfg( + asset_name="robot", joint_names=[".*_joint"], scale=0.5, use_default_offset=True + ) + # Set surface gripper action + self.actions.gripper_action = SurfaceGripperBinaryActionCfg( + asset_name="surface_gripper", + open_command=-1.0, + close_command=1.0, + ) + + # Set each stacking cube deterministically + self.scene.cube_1 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_1", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.4, 0.0, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/blue_block.usd", + scale=self.cube_scale, + rigid_props=self.cube_properties, + ), + ) + self.scene.cube_2 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_2", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.55, 0.05, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", + scale=self.cube_scale, + rigid_props=self.cube_properties, + ), + ) + self.scene.cube_3 = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/Cube_3", + init_state=RigidObjectCfg.InitialStateCfg(pos=[0.60, -0.1, 0.0203], rot=[1, 0, 0, 0]), + spawn=UsdFileCfg( + usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/green_block.usd", + scale=self.cube_scale, + rigid_props=self.cube_properties, + ), + ) + + self.decimation = 5 + self.episode_length_s = 30.0 + # simulation settings + self.sim.dt = 0.01 # 100Hz + self.sim.render_interval = 5 + + +@configclass +class UR10LongSuctionCubeStackEnvCfg(UR10CubeStackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Suction grippers currently require CPU simulation + self.device = "cpu" + + # Set events + self.events = EventCfgLongSuction() + + # Set UR10 as robot + self.scene.robot = UR10_LONG_SUCTION_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set surface gripper: Ensure the SurfaceGripper prim has the required attributes + self.scene.surface_gripper = SurfaceGripperCfg( + prim_path="{ENV_REGEX_NS}/Robot/ee_link/SurfaceGripper", + max_grip_distance=0.05, + shear_force_limit=5000.0, + coaxial_force_limit=5000.0, + retry_interval=0.05, + ) + + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/base_link", + debug_vis=True, + visualizer_cfg=self.marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/ee_link", + name="end_effector", + offset=OffsetCfg( + pos=[0.22, 0.0, 0.0], + ), + ), + ], + ) + + +@configclass +class UR10ShortSuctionCubeStackEnvCfg(UR10CubeStackEnvCfg): + + def __post_init__(self): + # post init of parent + super().__post_init__() + + # Suction grippers currently require CPU simulation + self.device = "cpu" + + # Set UR10 as robot + self.scene.robot = UR10_SHORT_SUCTION_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + + # Set surface gripper: Ensure the SurfaceGripper prim has the required attributes + self.scene.surface_gripper = SurfaceGripperCfg( + prim_path="{ENV_REGEX_NS}/Robot/ee_link/SurfaceGripper", + max_grip_distance=0.05, + shear_force_limit=5000.0, + coaxial_force_limit=5000.0, + retry_interval=0.05, + ) + + self.scene.ee_frame = FrameTransformerCfg( + prim_path="{ENV_REGEX_NS}/Robot/base_link", + debug_vis=True, + visualizer_cfg=self.marker_cfg, + target_frames=[ + FrameTransformerCfg.FrameCfg( + prim_path="{ENV_REGEX_NS}/Robot/ee_link", + name="end_effector", + offset=OffsetCfg( + pos=[0.1585, 0.0, 0.0], + ), + ), + ], + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/__init__.py new file mode 100644 index 000000000000..8298b94d9b91 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""This sub-module contains the functions that are specific to the lift environments.""" + +from isaaclab.envs.mdp import * # noqa: F401, F403 + +from .observations import * # noqa: F401, F403 +from .terminations import * # noqa: F401, F403 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/franka_stack_events.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/franka_stack_events.py new file mode 100644 index 000000000000..009a44b1b372 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/franka_stack_events.py @@ -0,0 +1,314 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + + +from __future__ import annotations + +import math +import random +import torch +from typing import TYPE_CHECKING + +from isaacsim.core.utils.extensions import enable_extension + +import isaaclab.utils.math as math_utils +from isaaclab.assets import Articulation, AssetBase +from isaaclab.managers import SceneEntityCfg + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedEnv + + +def set_default_joint_pose( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + default_pose: torch.Tensor, + asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), +): + # Set the default pose for robots in all envs + asset = env.scene[asset_cfg.name] + asset.data.default_joint_pos = torch.tensor(default_pose, device=env.device).repeat(env.num_envs, 1) + + +def randomize_joint_by_gaussian_offset( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + mean: float, + std: float, + asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), +): + asset: Articulation = env.scene[asset_cfg.name] + + # Add gaussian noise to joint states + joint_pos = asset.data.default_joint_pos[env_ids].clone() + joint_vel = asset.data.default_joint_vel[env_ids].clone() + joint_pos += math_utils.sample_gaussian(mean, std, joint_pos.shape, joint_pos.device) + + # Clamp joint pos to limits + joint_pos_limits = asset.data.soft_joint_pos_limits[env_ids] + joint_pos = joint_pos.clamp_(joint_pos_limits[..., 0], joint_pos_limits[..., 1]) + + # Don't noise the gripper poses + joint_pos[:, -2:] = asset.data.default_joint_pos[env_ids, -2:] + + # Set into the physics simulation + asset.set_joint_position_target(joint_pos, env_ids=env_ids) + asset.set_joint_velocity_target(joint_vel, env_ids=env_ids) + asset.write_joint_state_to_sim(joint_pos, joint_vel, env_ids=env_ids) + + +def sample_random_color(base=(0.75, 0.75, 0.75), variation=0.1): + """ + Generates a randomized color that stays close to the base color while preserving overall brightness. + The relative balance between the R, G, and B components is maintained by ensuring that + the sum of random offsets is zero. + + Parameters: + base (tuple): The base RGB color with each component between 0 and 1. + variation (float): Maximum deviation to sample for each channel before balancing. + + Returns: + tuple: A new RGB color with balanced random variation. + """ + # Generate random offsets for each channel in the range [-variation, variation] + offsets = [random.uniform(-variation, variation) for _ in range(3)] + # Compute the average offset + avg_offset = sum(offsets) / 3 + # Adjust offsets so their sum is zero (maintaining brightness) + balanced_offsets = [offset - avg_offset for offset in offsets] + + # Apply the balanced offsets to the base color and clamp each channel between 0 and 1 + new_color = tuple(max(0, min(1, base_component + offset)) for base_component, offset in zip(base, balanced_offsets)) + + return new_color + + +def randomize_scene_lighting_domelight( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + intensity_range: tuple[float, float], + color_variation: float, + textures: list[str], + default_intensity: float = 3000.0, + default_color: tuple[float, float, float] = (0.75, 0.75, 0.75), + default_texture: str = "", + asset_cfg: SceneEntityCfg = SceneEntityCfg("light"), +): + asset: AssetBase = env.scene[asset_cfg.name] + light_prim = asset.prims[0] + + intensity_attr = light_prim.GetAttribute("inputs:intensity") + intensity_attr.Set(default_intensity) + + color_attr = light_prim.GetAttribute("inputs:color") + color_attr.Set(default_color) + + texture_file_attr = light_prim.GetAttribute("inputs:texture:file") + texture_file_attr.Set(default_texture) + + if not hasattr(env.cfg, "eval_mode") or not env.cfg.eval_mode: + return + + if env.cfg.eval_type in ["light_intensity", "all"]: + # Sample new light intensity + new_intensity = random.uniform(intensity_range[0], intensity_range[1]) + # Set light intensity to light prim + intensity_attr.Set(new_intensity) + + if env.cfg.eval_type in ["light_color", "all"]: + # Sample new light color + new_color = sample_random_color(base=default_color, variation=color_variation) + # Set light color to light prim + color_attr.Set(new_color) + + if env.cfg.eval_type in ["light_texture", "all"]: + # Sample new light texture (background) + new_texture = random.sample(textures, 1)[0] + # Set light texture to light prim + texture_file_attr.Set(new_texture) + + +def sample_object_poses( + num_objects: int, + min_separation: float = 0.0, + pose_range: dict[str, tuple[float, float]] = {}, + max_sample_tries: int = 5000, +): + range_list = [pose_range.get(key, (0.0, 0.0)) for key in ["x", "y", "z", "roll", "pitch", "yaw"]] + pose_list = [] + + for i in range(num_objects): + for j in range(max_sample_tries): + sample = [random.uniform(range[0], range[1]) for range in range_list] + + # Accept pose if it is the first one, or if reached max num tries + if len(pose_list) == 0 or j == max_sample_tries - 1: + pose_list.append(sample) + break + + # Check if pose of object is sufficiently far away from all other objects + separation_check = [math.dist(sample[:3], pose[:3]) > min_separation for pose in pose_list] + if False not in separation_check: + pose_list.append(sample) + break + + return pose_list + + +def randomize_object_pose( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + asset_cfgs: list[SceneEntityCfg], + min_separation: float = 0.0, + pose_range: dict[str, tuple[float, float]] = {}, + max_sample_tries: int = 5000, +): + if env_ids is None: + return + + # Randomize poses in each environment independently + for cur_env in env_ids.tolist(): + pose_list = sample_object_poses( + num_objects=len(asset_cfgs), + min_separation=min_separation, + pose_range=pose_range, + max_sample_tries=max_sample_tries, + ) + + # Randomize pose for each object + for i in range(len(asset_cfgs)): + asset_cfg = asset_cfgs[i] + asset = env.scene[asset_cfg.name] + + # Write pose to simulation + pose_tensor = torch.tensor([pose_list[i]], device=env.device) + positions = pose_tensor[:, 0:3] + env.scene.env_origins[cur_env, 0:3] + orientations = math_utils.quat_from_euler_xyz(pose_tensor[:, 3], pose_tensor[:, 4], pose_tensor[:, 5]) + asset.write_root_pose_to_sim( + torch.cat([positions, orientations], dim=-1), env_ids=torch.tensor([cur_env], device=env.device) + ) + asset.write_root_velocity_to_sim( + torch.zeros(1, 6, device=env.device), env_ids=torch.tensor([cur_env], device=env.device) + ) + + +def randomize_rigid_objects_in_focus( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + asset_cfgs: list[SceneEntityCfg], + out_focus_state: torch.Tensor, + min_separation: float = 0.0, + pose_range: dict[str, tuple[float, float]] = {}, + max_sample_tries: int = 5000, +): + if env_ids is None: + return + + # List of rigid objects in focus for each env (dim = [num_envs, num_rigid_objects]) + env.rigid_objects_in_focus = [] + + for cur_env in env_ids.tolist(): + # Sample in focus object poses + pose_list = sample_object_poses( + num_objects=len(asset_cfgs), + min_separation=min_separation, + pose_range=pose_range, + max_sample_tries=max_sample_tries, + ) + + selected_ids = [] + for asset_idx in range(len(asset_cfgs)): + asset_cfg = asset_cfgs[asset_idx] + asset = env.scene[asset_cfg.name] + + # Randomly select an object to bring into focus + object_id = random.randint(0, asset.num_objects - 1) + selected_ids.append(object_id) + + # Create object state tensor + object_states = torch.stack([out_focus_state] * asset.num_objects).to(device=env.device) + pose_tensor = torch.tensor([pose_list[asset_idx]], device=env.device) + positions = pose_tensor[:, 0:3] + env.scene.env_origins[cur_env, 0:3] + orientations = math_utils.quat_from_euler_xyz(pose_tensor[:, 3], pose_tensor[:, 4], pose_tensor[:, 5]) + object_states[object_id, 0:3] = positions + object_states[object_id, 3:7] = orientations + + asset.write_object_state_to_sim( + object_state=object_states, env_ids=torch.tensor([cur_env], device=env.device) + ) + + env.rigid_objects_in_focus.append(selected_ids) + + +def randomize_visual_texture_material( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + asset_cfg: SceneEntityCfg, + textures: list[str], + default_texture: str = "", + texture_rotation: tuple[float, float] = (0.0, 0.0), +): + """Randomize the visual texture of bodies on an asset using Replicator API. + + This function randomizes the visual texture of the bodies of the asset using the Replicator API. + The function samples random textures from the given texture paths and applies them to the bodies + of the asset. The textures are projected onto the bodies and rotated by the given angles. + + .. note:: + The function assumes that the asset follows the prim naming convention as: + "{asset_prim_path}/{body_name}/visuals" where the body name is the name of the body to + which the texture is applied. This is the default prim ordering when importing assets + from the asset converters in Isaac Lab. + + .. note:: + When randomizing the texture of individual assets, please make sure to set + :attr:`isaaclab.scene.InteractiveSceneCfg.replicate_physics` to False. This ensures that physics + parser will parse the individual asset properties separately. + """ + if hasattr(env.cfg, "eval_mode") and ( + not env.cfg.eval_mode or env.cfg.eval_type not in [f"{asset_cfg.name}_texture", "all"] + ): + return + # textures = [default_texture] + + # enable replicator extension if not already enabled + enable_extension("omni.replicator.core") + # we import the module here since we may not always need the replicator + import omni.replicator.core as rep + + # check to make sure replicate_physics is set to False, else raise error + # note: We add an explicit check here since texture randomization can happen outside of 'prestartup' mode + # and the event manager doesn't check in that case. + if env.cfg.scene.replicate_physics: + raise RuntimeError( + "Unable to randomize visual texture material with scene replication enabled." + " For stable USD-level randomization, please disable scene replication" + " by setting 'replicate_physics' to False in 'InteractiveSceneCfg'." + ) + + # convert from radians to degrees + texture_rotation = tuple(math.degrees(angle) for angle in texture_rotation) + + # obtain the asset entity + asset = env.scene[asset_cfg.name] + + # join all bodies in the asset + body_names = asset_cfg.body_names + if isinstance(body_names, str): + body_names_regex = body_names + elif isinstance(body_names, list): + body_names_regex = "|".join(body_names) + else: + body_names_regex = ".*" + + if not hasattr(asset, "cfg"): + prims_group = rep.get.prims(path_pattern=f"{asset.prim_paths[0]}/visuals") + else: + prims_group = rep.get.prims(path_pattern=f"{asset.cfg.prim_path}/{body_names_regex}/visuals") + + with prims_group: + rep.randomizer.texture( + textures=textures, project_uvw=True, texture_rotate=rep.distribution.uniform(*texture_rotation) + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/observations.py new file mode 100644 index 000000000000..2f65cd916ee9 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/observations.py @@ -0,0 +1,532 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from __future__ import annotations + +import torch +from typing import TYPE_CHECKING, Literal + +import isaaclab.utils.math as math_utils +from isaaclab.assets import Articulation, RigidObject, RigidObjectCollection +from isaaclab.managers import SceneEntityCfg +from isaaclab.sensors import FrameTransformer + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def cube_positions_in_world_frame( + env: ManagerBasedRLEnv, + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), +) -> torch.Tensor: + """The position of the cubes in the world frame.""" + cube_1: RigidObject = env.scene[cube_1_cfg.name] + cube_2: RigidObject = env.scene[cube_2_cfg.name] + cube_3: RigidObject = env.scene[cube_3_cfg.name] + + return torch.cat((cube_1.data.root_pos_w, cube_2.data.root_pos_w, cube_3.data.root_pos_w), dim=1) + + +def instance_randomize_cube_positions_in_world_frame( + env: ManagerBasedRLEnv, + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), +) -> torch.Tensor: + """The position of the cubes in the world frame.""" + if not hasattr(env, "rigid_objects_in_focus"): + return torch.full((env.num_envs, 9), fill_value=-1) + + cube_1: RigidObjectCollection = env.scene[cube_1_cfg.name] + cube_2: RigidObjectCollection = env.scene[cube_2_cfg.name] + cube_3: RigidObjectCollection = env.scene[cube_3_cfg.name] + + cube_1_pos_w = [] + cube_2_pos_w = [] + cube_3_pos_w = [] + for env_id in range(env.num_envs): + cube_1_pos_w.append(cube_1.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][0], :3]) + cube_2_pos_w.append(cube_2.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][1], :3]) + cube_3_pos_w.append(cube_3.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][2], :3]) + cube_1_pos_w = torch.stack(cube_1_pos_w) + cube_2_pos_w = torch.stack(cube_2_pos_w) + cube_3_pos_w = torch.stack(cube_3_pos_w) + + return torch.cat((cube_1_pos_w, cube_2_pos_w, cube_3_pos_w), dim=1) + + +def cube_orientations_in_world_frame( + env: ManagerBasedRLEnv, + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), +): + """The orientation of the cubes in the world frame.""" + cube_1: RigidObject = env.scene[cube_1_cfg.name] + cube_2: RigidObject = env.scene[cube_2_cfg.name] + cube_3: RigidObject = env.scene[cube_3_cfg.name] + + return torch.cat((cube_1.data.root_quat_w, cube_2.data.root_quat_w, cube_3.data.root_quat_w), dim=1) + + +def instance_randomize_cube_orientations_in_world_frame( + env: ManagerBasedRLEnv, + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), +) -> torch.Tensor: + """The orientation of the cubes in the world frame.""" + if not hasattr(env, "rigid_objects_in_focus"): + return torch.full((env.num_envs, 9), fill_value=-1) + + cube_1: RigidObjectCollection = env.scene[cube_1_cfg.name] + cube_2: RigidObjectCollection = env.scene[cube_2_cfg.name] + cube_3: RigidObjectCollection = env.scene[cube_3_cfg.name] + + cube_1_quat_w = [] + cube_2_quat_w = [] + cube_3_quat_w = [] + for env_id in range(env.num_envs): + cube_1_quat_w.append(cube_1.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][0], :4]) + cube_2_quat_w.append(cube_2.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][1], :4]) + cube_3_quat_w.append(cube_3.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][2], :4]) + cube_1_quat_w = torch.stack(cube_1_quat_w) + cube_2_quat_w = torch.stack(cube_2_quat_w) + cube_3_quat_w = torch.stack(cube_3_quat_w) + + return torch.cat((cube_1_quat_w, cube_2_quat_w, cube_3_quat_w), dim=1) + + +def object_obs( + env: ManagerBasedRLEnv, + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), +): + """ + Object observations (in world frame): + cube_1 pos, + cube_1 quat, + cube_2 pos, + cube_2 quat, + cube_3 pos, + cube_3 quat, + gripper to cube_1, + gripper to cube_2, + gripper to cube_3, + cube_1 to cube_2, + cube_2 to cube_3, + cube_1 to cube_3, + """ + cube_1: RigidObject = env.scene[cube_1_cfg.name] + cube_2: RigidObject = env.scene[cube_2_cfg.name] + cube_3: RigidObject = env.scene[cube_3_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + + cube_1_pos_w = cube_1.data.root_pos_w + cube_1_quat_w = cube_1.data.root_quat_w + + cube_2_pos_w = cube_2.data.root_pos_w + cube_2_quat_w = cube_2.data.root_quat_w + + cube_3_pos_w = cube_3.data.root_pos_w + cube_3_quat_w = cube_3.data.root_quat_w + + ee_pos_w = ee_frame.data.target_pos_w[:, 0, :] + gripper_to_cube_1 = cube_1_pos_w - ee_pos_w + gripper_to_cube_2 = cube_2_pos_w - ee_pos_w + gripper_to_cube_3 = cube_3_pos_w - ee_pos_w + + cube_1_to_2 = cube_1_pos_w - cube_2_pos_w + cube_2_to_3 = cube_2_pos_w - cube_3_pos_w + cube_1_to_3 = cube_1_pos_w - cube_3_pos_w + + return torch.cat( + ( + cube_1_pos_w - env.scene.env_origins, + cube_1_quat_w, + cube_2_pos_w - env.scene.env_origins, + cube_2_quat_w, + cube_3_pos_w - env.scene.env_origins, + cube_3_quat_w, + gripper_to_cube_1, + gripper_to_cube_2, + gripper_to_cube_3, + cube_1_to_2, + cube_2_to_3, + cube_1_to_3, + ), + dim=1, + ) + + +def instance_randomize_object_obs( + env: ManagerBasedRLEnv, + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), +): + """ + Object observations (in world frame): + cube_1 pos, + cube_1 quat, + cube_2 pos, + cube_2 quat, + cube_3 pos, + cube_3 quat, + gripper to cube_1, + gripper to cube_2, + gripper to cube_3, + cube_1 to cube_2, + cube_2 to cube_3, + cube_1 to cube_3, + """ + if not hasattr(env, "rigid_objects_in_focus"): + return torch.full((env.num_envs, 9), fill_value=-1) + + cube_1: RigidObjectCollection = env.scene[cube_1_cfg.name] + cube_2: RigidObjectCollection = env.scene[cube_2_cfg.name] + cube_3: RigidObjectCollection = env.scene[cube_3_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + + cube_1_pos_w = [] + cube_2_pos_w = [] + cube_3_pos_w = [] + cube_1_quat_w = [] + cube_2_quat_w = [] + cube_3_quat_w = [] + for env_id in range(env.num_envs): + cube_1_pos_w.append(cube_1.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][0], :3]) + cube_2_pos_w.append(cube_2.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][1], :3]) + cube_3_pos_w.append(cube_3.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][2], :3]) + cube_1_quat_w.append(cube_1.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][0], :4]) + cube_2_quat_w.append(cube_2.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][1], :4]) + cube_3_quat_w.append(cube_3.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][2], :4]) + cube_1_pos_w = torch.stack(cube_1_pos_w) + cube_2_pos_w = torch.stack(cube_2_pos_w) + cube_3_pos_w = torch.stack(cube_3_pos_w) + cube_1_quat_w = torch.stack(cube_1_quat_w) + cube_2_quat_w = torch.stack(cube_2_quat_w) + cube_3_quat_w = torch.stack(cube_3_quat_w) + + ee_pos_w = ee_frame.data.target_pos_w[:, 0, :] + gripper_to_cube_1 = cube_1_pos_w - ee_pos_w + gripper_to_cube_2 = cube_2_pos_w - ee_pos_w + gripper_to_cube_3 = cube_3_pos_w - ee_pos_w + + cube_1_to_2 = cube_1_pos_w - cube_2_pos_w + cube_2_to_3 = cube_2_pos_w - cube_3_pos_w + cube_1_to_3 = cube_1_pos_w - cube_3_pos_w + + return torch.cat( + ( + cube_1_pos_w - env.scene.env_origins, + cube_1_quat_w, + cube_2_pos_w - env.scene.env_origins, + cube_2_quat_w, + cube_3_pos_w - env.scene.env_origins, + cube_3_quat_w, + gripper_to_cube_1, + gripper_to_cube_2, + gripper_to_cube_3, + cube_1_to_2, + cube_2_to_3, + cube_1_to_3, + ), + dim=1, + ) + + +def ee_frame_pos(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + ee_frame_pos = ee_frame.data.target_pos_w[:, 0, :] - env.scene.env_origins[:, 0:3] + + return ee_frame_pos + + +def ee_frame_quat(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + ee_frame_quat = ee_frame.data.target_quat_w[:, 0, :] + + return ee_frame_quat + + +def gripper_pos( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), +) -> torch.Tensor: + """ + Obtain the versatile gripper position of both Gripper and Suction Cup. + """ + robot: Articulation = env.scene[robot_cfg.name] + + if hasattr(env.scene, "surface_grippers") and len(env.scene.surface_grippers) > 0: + # Handle multiple surface grippers by concatenating their states + gripper_states = [] + for gripper_name, surface_gripper in env.scene.surface_grippers.items(): + gripper_states.append(surface_gripper.state.view(-1, 1)) + + if len(gripper_states) == 1: + return gripper_states[0] + else: + return torch.cat(gripper_states, dim=1) + + else: + if hasattr(env.cfg, "gripper_joint_names"): + gripper_joint_ids, _ = robot.find_joints(env.cfg.gripper_joint_names) + assert len(gripper_joint_ids) == 2, "Observation gripper_pos only support parallel gripper for now" + finger_joint_1 = robot.data.joint_pos[:, gripper_joint_ids[0]].clone().unsqueeze(1) + finger_joint_2 = -1 * robot.data.joint_pos[:, gripper_joint_ids[1]].clone().unsqueeze(1) + return torch.cat((finger_joint_1, finger_joint_2), dim=1) + else: + raise NotImplementedError("[Error] Cannot find gripper_joint_names in the environment config") + + +def object_grasped( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg, + ee_frame_cfg: SceneEntityCfg, + object_cfg: SceneEntityCfg, + diff_threshold: float = 0.06, +) -> torch.Tensor: + """Check if an object is grasped by the specified robot.""" + + robot: Articulation = env.scene[robot_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + object: RigidObject = env.scene[object_cfg.name] + + object_pos = object.data.root_pos_w + end_effector_pos = ee_frame.data.target_pos_w[:, 0, :] + pose_diff = torch.linalg.vector_norm(object_pos - end_effector_pos, dim=1) + + if hasattr(env.scene, "surface_grippers") and len(env.scene.surface_grippers) > 0: + surface_gripper = env.scene.surface_grippers["surface_gripper"] + suction_cup_status = surface_gripper.state.view(-1, 1) # 1: closed, 0: closing, -1: open + suction_cup_is_closed = (suction_cup_status == 1).to(torch.float32) + grasped = torch.logical_and(suction_cup_is_closed, pose_diff < diff_threshold) + + else: + if hasattr(env.cfg, "gripper_joint_names"): + gripper_joint_ids, _ = robot.find_joints(env.cfg.gripper_joint_names) + assert len(gripper_joint_ids) == 2, "Observations only support parallel gripper for now" + + grasped = torch.logical_and( + pose_diff < diff_threshold, + torch.abs( + robot.data.joint_pos[:, gripper_joint_ids[0]] + - torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device) + ) + > env.cfg.gripper_threshold, + ) + grasped = torch.logical_and( + grasped, + torch.abs( + robot.data.joint_pos[:, gripper_joint_ids[1]] + - torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device) + ) + > env.cfg.gripper_threshold, + ) + + return grasped + + +def object_stacked( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg, + upper_object_cfg: SceneEntityCfg, + lower_object_cfg: SceneEntityCfg, + xy_threshold: float = 0.05, + height_threshold: float = 0.005, + height_diff: float = 0.0468, +) -> torch.Tensor: + """Check if an object is stacked by the specified robot.""" + + robot: Articulation = env.scene[robot_cfg.name] + upper_object: RigidObject = env.scene[upper_object_cfg.name] + lower_object: RigidObject = env.scene[lower_object_cfg.name] + + pos_diff = upper_object.data.root_pos_w - lower_object.data.root_pos_w + height_dist = torch.linalg.vector_norm(pos_diff[:, 2:], dim=1) + xy_dist = torch.linalg.vector_norm(pos_diff[:, :2], dim=1) + + stacked = torch.logical_and(xy_dist < xy_threshold, (height_dist - height_diff) < height_threshold) + + if hasattr(env.scene, "surface_grippers") and len(env.scene.surface_grippers) > 0: + surface_gripper = env.scene.surface_grippers["surface_gripper"] + suction_cup_status = surface_gripper.state.view(-1, 1) # 1: closed, 0: closing, -1: open + suction_cup_is_open = (suction_cup_status == -1).to(torch.float32) + stacked = torch.logical_and(suction_cup_is_open, stacked) + + else: + if hasattr(env.cfg, "gripper_joint_names"): + gripper_joint_ids, _ = robot.find_joints(env.cfg.gripper_joint_names) + assert len(gripper_joint_ids) == 2, "Observations only support parallel gripper for now" + stacked = torch.logical_and( + torch.isclose( + robot.data.joint_pos[:, gripper_joint_ids[0]], + torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device), + atol=1e-4, + rtol=1e-4, + ), + stacked, + ) + stacked = torch.logical_and( + torch.isclose( + robot.data.joint_pos[:, gripper_joint_ids[1]], + torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device), + atol=1e-4, + rtol=1e-4, + ), + stacked, + ) + else: + raise ValueError("No gripper_joint_names found in environment config") + + return stacked + + +def cube_poses_in_base_frame( + env: ManagerBasedRLEnv, + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + return_key: Literal["pos", "quat", None] = None, +) -> torch.Tensor: + """The position and orientation of the cubes in the robot base frame.""" + + cube_1: RigidObject = env.scene[cube_1_cfg.name] + cube_2: RigidObject = env.scene[cube_2_cfg.name] + cube_3: RigidObject = env.scene[cube_3_cfg.name] + + pos_cube_1_world = cube_1.data.root_pos_w + pos_cube_2_world = cube_2.data.root_pos_w + pos_cube_3_world = cube_3.data.root_pos_w + + quat_cube_1_world = cube_1.data.root_quat_w + quat_cube_2_world = cube_2.data.root_quat_w + quat_cube_3_world = cube_3.data.root_quat_w + + robot: Articulation = env.scene[robot_cfg.name] + root_pos_w = robot.data.root_pos_w + root_quat_w = robot.data.root_quat_w + + pos_cube_1_base, quat_cube_1_base = math_utils.subtract_frame_transforms( + root_pos_w, root_quat_w, pos_cube_1_world, quat_cube_1_world + ) + pos_cube_2_base, quat_cube_2_base = math_utils.subtract_frame_transforms( + root_pos_w, root_quat_w, pos_cube_2_world, quat_cube_2_world + ) + pos_cube_3_base, quat_cube_3_base = math_utils.subtract_frame_transforms( + root_pos_w, root_quat_w, pos_cube_3_world, quat_cube_3_world + ) + + pos_cubes_base = torch.cat((pos_cube_1_base, pos_cube_2_base, pos_cube_3_base), dim=1) + quat_cubes_base = torch.cat((quat_cube_1_base, quat_cube_2_base, quat_cube_3_base), dim=1) + + if return_key == "pos": + return pos_cubes_base + elif return_key == "quat": + return quat_cubes_base + elif return_key is None: + return torch.cat((pos_cubes_base, quat_cubes_base), dim=1) + + +def object_abs_obs_in_base_frame( + env: ManagerBasedRLEnv, + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), +): + """ + Object Abs observations (in base frame): remove the relative observations, and add abs gripper pos and quat in robot base frame + cube_1 pos, + cube_1 quat, + cube_2 pos, + cube_2 quat, + cube_3 pos, + cube_3 quat, + gripper pos, + gripper quat, + """ + cube_1: RigidObject = env.scene[cube_1_cfg.name] + cube_2: RigidObject = env.scene[cube_2_cfg.name] + cube_3: RigidObject = env.scene[cube_3_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + robot: Articulation = env.scene[robot_cfg.name] + + root_pos_w = robot.data.root_pos_w + root_quat_w = robot.data.root_quat_w + + cube_1_pos_w = cube_1.data.root_pos_w + cube_1_quat_w = cube_1.data.root_quat_w + + cube_2_pos_w = cube_2.data.root_pos_w + cube_2_quat_w = cube_2.data.root_quat_w + + cube_3_pos_w = cube_3.data.root_pos_w + cube_3_quat_w = cube_3.data.root_quat_w + + pos_cube_1_base, quat_cube_1_base = math_utils.subtract_frame_transforms( + root_pos_w, root_quat_w, cube_1_pos_w, cube_1_quat_w + ) + pos_cube_2_base, quat_cube_2_base = math_utils.subtract_frame_transforms( + root_pos_w, root_quat_w, cube_2_pos_w, cube_2_quat_w + ) + pos_cube_3_base, quat_cube_3_base = math_utils.subtract_frame_transforms( + root_pos_w, root_quat_w, cube_3_pos_w, cube_3_quat_w + ) + + ee_pos_w = ee_frame.data.target_pos_w[:, 0, :] + ee_quat_w = ee_frame.data.target_quat_w[:, 0, :] + ee_pos_base, ee_quat_base = math_utils.subtract_frame_transforms(root_pos_w, root_quat_w, ee_pos_w, ee_quat_w) + + return torch.cat( + ( + pos_cube_1_base, + quat_cube_1_base, + pos_cube_2_base, + quat_cube_2_base, + pos_cube_3_base, + quat_cube_3_base, + ee_pos_base, + ee_quat_base, + ), + dim=1, + ) + + +def ee_frame_pose_in_base_frame( + env: ManagerBasedRLEnv, + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + return_key: Literal["pos", "quat", None] = None, +) -> torch.Tensor: + """ + The end effector pose in the robot base frame. + """ + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + ee_frame_pos_w = ee_frame.data.target_pos_w[:, 0, :] + ee_frame_quat_w = ee_frame.data.target_quat_w[:, 0, :] + + robot: Articulation = env.scene[robot_cfg.name] + root_pos_w = robot.data.root_pos_w + root_quat_w = robot.data.root_quat_w + ee_pos_in_base, ee_quat_in_base = math_utils.subtract_frame_transforms( + root_pos_w, root_quat_w, ee_frame_pos_w, ee_frame_quat_w + ) + + if return_key == "pos": + return ee_pos_in_base + elif return_key == "quat": + return ee_quat_in_base + elif return_key is None: + return torch.cat((ee_pos_in_base, ee_quat_in_base), dim=1) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/terminations.py new file mode 100644 index 000000000000..e306f9eb4a0a --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/terminations.py @@ -0,0 +1,92 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Common functions that can be used to activate certain terminations for the lift task. + +The functions can be passed to the :class:`isaaclab.managers.TerminationTermCfg` object to enable +the termination introduced by the function. +""" + +from __future__ import annotations + +import torch +from typing import TYPE_CHECKING + +from isaaclab.assets import Articulation, RigidObject +from isaaclab.managers import SceneEntityCfg + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def cubes_stacked( + env: ManagerBasedRLEnv, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), + cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), + cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), + xy_threshold: float = 0.04, + height_threshold: float = 0.005, + height_diff: float = 0.0468, + atol=0.0001, + rtol=0.0001, +): + robot: Articulation = env.scene[robot_cfg.name] + cube_1: RigidObject = env.scene[cube_1_cfg.name] + cube_2: RigidObject = env.scene[cube_2_cfg.name] + cube_3: RigidObject = env.scene[cube_3_cfg.name] + + pos_diff_c12 = cube_1.data.root_pos_w - cube_2.data.root_pos_w + pos_diff_c23 = cube_2.data.root_pos_w - cube_3.data.root_pos_w + + # Compute cube position difference in x-y plane + xy_dist_c12 = torch.norm(pos_diff_c12[:, :2], dim=1) + xy_dist_c23 = torch.norm(pos_diff_c23[:, :2], dim=1) + + # Compute cube height difference + h_dist_c12 = torch.norm(pos_diff_c12[:, 2:], dim=1) + h_dist_c23 = torch.norm(pos_diff_c23[:, 2:], dim=1) + + # Check cube positions + stacked = torch.logical_and(xy_dist_c12 < xy_threshold, xy_dist_c23 < xy_threshold) + stacked = torch.logical_and(h_dist_c12 - height_diff < height_threshold, stacked) + stacked = torch.logical_and(pos_diff_c12[:, 2] < 0.0, stacked) + stacked = torch.logical_and(h_dist_c23 - height_diff < height_threshold, stacked) + stacked = torch.logical_and(pos_diff_c23[:, 2] < 0.0, stacked) + + # Check gripper positions + if hasattr(env.scene, "surface_grippers") and len(env.scene.surface_grippers) > 0: + surface_gripper = env.scene.surface_grippers["surface_gripper"] + suction_cup_status = surface_gripper.state.view(-1, 1) # 1: closed, 0: closing, -1: open + suction_cup_is_open = (suction_cup_status == -1).to(torch.float32) + stacked = torch.logical_and(suction_cup_is_open, stacked) + + else: + if hasattr(env.cfg, "gripper_joint_names"): + gripper_joint_ids, _ = robot.find_joints(env.cfg.gripper_joint_names) + assert len(gripper_joint_ids) == 2, "Terminations only support parallel gripper for now" + + stacked = torch.logical_and( + torch.isclose( + robot.data.joint_pos[:, gripper_joint_ids[0]], + torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device), + atol=atol, + rtol=rtol, + ), + stacked, + ) + stacked = torch.logical_and( + torch.isclose( + robot.data.joint_pos[:, gripper_joint_ids[1]], + torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device), + atol=atol, + rtol=rtol, + ), + stacked, + ) + else: + raise ValueError("No gripper_joint_names found in environment config") + + return stacked diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_env_cfg.py new file mode 100644 index 000000000000..3af83de3a19a --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_env_cfg.py @@ -0,0 +1,199 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from dataclasses import MISSING + +import isaaclab.sim as sim_utils +from isaaclab.assets import ArticulationCfg, AssetBaseCfg +from isaaclab.devices.openxr import XrCfg +from isaaclab.envs import ManagerBasedRLEnvCfg +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import SceneEntityCfg +from isaaclab.managers import TerminationTermCfg as DoneTerm +from isaaclab.scene import InteractiveSceneCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import FrameTransformerCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import GroundPlaneCfg, UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR + +from . import mdp + + +## +# Scene definition +## +@configclass +class ObjectTableSceneCfg(InteractiveSceneCfg): + """Configuration for the lift scene with a robot and a object. + This is the abstract base implementation, the exact scene is defined in the derived classes + which need to set the target object, robot and end-effector frames + """ + + # robots: will be populated by agent env cfg + robot: ArticulationCfg = MISSING + # end-effector sensor: will be populated by agent env cfg + ee_frame: FrameTransformerCfg = MISSING + + # Table + table = AssetBaseCfg( + prim_path="{ENV_REGEX_NS}/Table", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0.5, 0, 0], rot=[0.707, 0, 0, 0.707]), + spawn=UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd"), + ) + + # plane + plane = AssetBaseCfg( + prim_path="/World/GroundPlane", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0, 0, -1.05]), + spawn=GroundPlaneCfg(), + ) + + # lights + light = AssetBaseCfg( + prim_path="/World/light", + spawn=sim_utils.DomeLightCfg(color=(0.75, 0.75, 0.75), intensity=3000.0), + ) + + +## +# MDP settings +## +@configclass +class ActionsCfg: + """Action specifications for the MDP.""" + + # will be set by agent env cfg + arm_action: mdp.JointPositionActionCfg = MISSING + gripper_action: mdp.BinaryJointPositionActionCfg = MISSING + + +@configclass +class ObservationsCfg: + """Observation specifications for the MDP.""" + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group with state values.""" + + actions = ObsTerm(func=mdp.last_action) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + object = ObsTerm(func=mdp.object_obs) + cube_positions = ObsTerm(func=mdp.cube_positions_in_world_frame) + cube_orientations = ObsTerm(func=mdp.cube_orientations_in_world_frame) + eef_pos = ObsTerm(func=mdp.ee_frame_pos) + eef_quat = ObsTerm(func=mdp.ee_frame_quat) + gripper_pos = ObsTerm(func=mdp.gripper_pos) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class RGBCameraPolicyCfg(ObsGroup): + """Observations for policy group with RGB images.""" + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + @configclass + class SubtaskCfg(ObsGroup): + """Observations for subtask group.""" + + grasp_1 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_2"), + }, + ) + stack_1 = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("cube_2"), + "lower_object_cfg": SceneEntityCfg("cube_1"), + }, + ) + grasp_2 = ObsTerm( + func=mdp.object_grasped, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "ee_frame_cfg": SceneEntityCfg("ee_frame"), + "object_cfg": SceneEntityCfg("cube_3"), + }, + ) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + # observation groups + policy: PolicyCfg = PolicyCfg() + rgb_camera: RGBCameraPolicyCfg = RGBCameraPolicyCfg() + subtask_terms: SubtaskCfg = SubtaskCfg() + + +@configclass +class TerminationsCfg: + """Termination terms for the MDP.""" + + time_out = DoneTerm(func=mdp.time_out, time_out=True) + + cube_1_dropping = DoneTerm( + func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("cube_1")} + ) + + cube_2_dropping = DoneTerm( + func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("cube_2")} + ) + + cube_3_dropping = DoneTerm( + func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("cube_3")} + ) + + success = DoneTerm(func=mdp.cubes_stacked) + + +@configclass +class StackEnvCfg(ManagerBasedRLEnvCfg): + """Configuration for the stacking environment.""" + + # Scene settings + scene: ObjectTableSceneCfg = ObjectTableSceneCfg(num_envs=4096, env_spacing=2.5, replicate_physics=False) + # Basic settings + observations: ObservationsCfg = ObservationsCfg() + actions: ActionsCfg = ActionsCfg() + # MDP settings + terminations: TerminationsCfg = TerminationsCfg() + + # Unused managers + commands = None + rewards = None + events = None + curriculum = None + + xr: XrCfg = XrCfg( + anchor_pos=(-0.1, -0.5, -1.05), + anchor_rot=(0.866, 0, 0, -0.5), + ) + + def __post_init__(self): + """Post initialization.""" + # general settings + self.decimation = 5 + self.episode_length_s = 60.0 + # simulation settings + self.sim.dt = 0.01 # 100Hz + self.sim.render_interval = 2 + + self.sim.physx.bounce_threshold_velocity = 0.2 + self.sim.physx.bounce_threshold_velocity = 0.01 + #self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 + #self.sim.physx.gpu_total_aggregate_pairs_capacity = 16 * 1024 + self.sim.physx.friction_correlation_distance = 0.00625 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_instance_randomize_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_instance_randomize_env_cfg.py new file mode 100644 index 000000000000..8ef135c4a082 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_instance_randomize_env_cfg.py @@ -0,0 +1,135 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from dataclasses import MISSING + +import isaaclab.sim as sim_utils +from isaaclab.assets import ArticulationCfg, AssetBaseCfg +from isaaclab.envs import ManagerBasedRLEnvCfg +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import TerminationTermCfg as DoneTerm +from isaaclab.scene import InteractiveSceneCfg +from isaaclab.sensors.frame_transformer.frame_transformer_cfg import FrameTransformerCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import GroundPlaneCfg, UsdFileCfg +from isaaclab.utils import configclass +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR + +from . import mdp + + +## +# Scene definition +## +@configclass +class ObjectTableSceneCfg(InteractiveSceneCfg): + """Configuration for the lift scene with a robot and a object. + This is the abstract base implementation, the exact scene is defined in the derived classes + which need to set the target object, robot and end-effector frames + """ + + # robots: will be populated by agent env cfg + robot: ArticulationCfg = MISSING + # end-effector sensor: will be populated by agent env cfg + ee_frame: FrameTransformerCfg = MISSING + + # Table + table = AssetBaseCfg( + prim_path="{ENV_REGEX_NS}/Table", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0.5, 0, 0], rot=[0.707, 0, 0, 0.707]), + spawn=UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd"), + ) + + # plane + plane = AssetBaseCfg( + prim_path="/World/GroundPlane", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0, 0, -1.05]), + spawn=GroundPlaneCfg(), + ) + + # lights + light = AssetBaseCfg( + prim_path="/World/light", + spawn=sim_utils.DomeLightCfg(color=(0.75, 0.75, 0.75), intensity=3000.0), + ) + + +## +# MDP settings +## +@configclass +class ActionsCfg: + """Action specifications for the MDP.""" + + # will be set by agent env cfg + arm_action: mdp.JointPositionActionCfg = MISSING + gripper_action: mdp.BinaryJointPositionActionCfg = MISSING + + +@configclass +class ObservationsCfg: + """Observation specifications for the MDP.""" + + @configclass + class PolicyCfg(ObsGroup): + """Observations for policy group with state values.""" + + actions = ObsTerm(func=mdp.last_action) + joint_pos = ObsTerm(func=mdp.joint_pos_rel) + joint_vel = ObsTerm(func=mdp.joint_vel_rel) + object = ObsTerm(func=mdp.instance_randomize_object_obs) + cube_positions = ObsTerm(func=mdp.instance_randomize_cube_positions_in_world_frame) + cube_orientations = ObsTerm(func=mdp.instance_randomize_cube_orientations_in_world_frame) + eef_pos = ObsTerm(func=mdp.ee_frame_pos) + eef_quat = ObsTerm(func=mdp.ee_frame_quat) + gripper_pos = ObsTerm(func=mdp.gripper_pos) + + def __post_init__(self): + self.enable_corruption = False + self.concatenate_terms = False + + # observation groups + policy: PolicyCfg = PolicyCfg() + + +@configclass +class TerminationsCfg: + """Termination terms for the MDP.""" + + time_out = DoneTerm(func=mdp.time_out, time_out=True) + + +@configclass +class StackInstanceRandomizeEnvCfg(ManagerBasedRLEnvCfg): + """Configuration for the stacking environment.""" + + # Scene settings + scene: ObjectTableSceneCfg = ObjectTableSceneCfg(num_envs=4096, env_spacing=2.5, replicate_physics=False) + # Basic settings + observations: ObservationsCfg = ObservationsCfg() + actions: ActionsCfg = ActionsCfg() + # MDP settings + terminations: TerminationsCfg = TerminationsCfg() + + # Unused managers + commands = None + rewards = None + events = None + curriculum = None + + def __post_init__(self): + """Post initialization.""" + # general settings + self.decimation = 5 + self.episode_length_s = 30.0 + # simulation settings + self.sim.dt = 0.01 # 100Hz + self.sim.render_interval = self.decimation + + self.sim.physx.bounce_threshold_velocity = 0.2 + self.sim.physx.bounce_threshold_velocity = 0.01 + self.sim.physx.gpu_found_lost_aggregate_pairs_capacity = 1024 * 1024 * 4 + self.sim.physx.gpu_total_aggregate_pairs_capacity = 16 * 1024 + self.sim.physx.friction_correlation_distance = 0.00625 From 03791a6e868ae0cdeea2aeab0f6858a5e42eed93 Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Wed, 14 Jan 2026 16:40:17 +0000 Subject: [PATCH 11/15] now with automated experiment running --- .vscode/browse.vc.db | Bin 0 -> 688128 bytes .vscode/browse.vc.db-shm | Bin 0 -> 32768 bytes .vscode/browse.vc.db-wal | 0 docker/Dockerfile.base | 18 +- docs/find_best_checkpoints.py | 160 ++++ docs/run_experiments.sh | 66 ++ .../isaaclab_mimic/annotate_demos.py | 4 + scripts/imitation_learning/robomimic/play.py | 2 + .../robomimic/play_diffusion.py | 297 +++++++ .../robomimic/play_ensemble_v05.py | 781 ++++++++++++++++++ scripts/imitation_learning/robomimic/train.py | 88 +- .../robomimic/train_ensemble.py | 55 +- scripts/tools/check_demos.py | 38 + scripts/tools/copy_metadata_hdf5.py | 3 +- .../isaaclab/managers/recorder_manager.py | 3 +- .../isaaclab/safety/switchingLogic.py | 2 +- .../datasets/hdf5_dataset_file_handler.py | 13 +- .../isaaclab_mimic/envs/__init__.py | 10 + .../envs/cube_blueprint_mimic_env_cfg.py | 94 +-- .../isaaclab_mimic/envs/cube_mimic_env.py | 34 +- .../isaaclab_mimic/envs/cube_mimic_env_cfg.py | 55 +- .../envs/cube_mimic_env_skillgen_cfg.py | 90 ++ .../motion_planners/curobo/curobo_planner.py | 2 +- .../curobo/curobo_planner_cfg.py | 12 +- source/isaaclab_mimic/setup.py | 2 +- .../agents/robomimic/diffusion_policy.json | 6 +- .../cube_lift/config/franka/__init__.py | 13 +- .../agents/robomimic/bc_rnn_low_dim.json | 19 +- .../agents/robomimic/diffusion_policy.json | 22 +- .../cube_lift/config/franka/dev_env_cfg.py | 3 + .../config/franka/dev_ik_rel_env_place.py | 6 +- .../config/franka/dev_ik_rel_skillgen.py | 87 ++ .../config/franka/dev_ik_rel_vial_insert.py | 97 +++ .../manipulation/cube_lift/lift_env_cfg.py | 25 +- .../cube_lift/mdp/observations.py | 34 +- .../cube_lift/mdp/terminations.py | 79 +- .../config/franka/stack_ik_rel_env_cfg.py | 27 - ...stack_ik_rel_instance_randomize_env_cfg.py | 4 +- .../config/franka/stack_joint_pos_env_cfg.py | 46 +- ...ck_joint_pos_instance_randomize_env_cfg.py | 93 +-- .../mdp/franka_stack_events.py | 8 +- .../stack_glassware/mdp/observations.py | 101 +-- .../stack_glassware/mdp/terminations.py | 20 +- .../stack_glassware/stack_env_cfg.py | 18 +- 44 files changed, 2099 insertions(+), 438 deletions(-) create mode 100644 .vscode/browse.vc.db create mode 100644 .vscode/browse.vc.db-shm create mode 100644 .vscode/browse.vc.db-wal create mode 100644 docs/find_best_checkpoints.py create mode 100644 docs/run_experiments.sh create mode 100644 scripts/imitation_learning/robomimic/play_diffusion.py create mode 100644 scripts/imitation_learning/robomimic/play_ensemble_v05.py create mode 100644 scripts/tools/check_demos.py create mode 100755 source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_skillgen_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_skillgen.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py diff --git a/.vscode/browse.vc.db b/.vscode/browse.vc.db new file mode 100644 index 0000000000000000000000000000000000000000..5b28fda5fa585718589316f44e843e97bc677c91 GIT binary patch literal 688128 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 Optional[float]: + """ + Extract validation loss from checkpoint filename. + + Expected format: model_epoch_XXX_best_validation_YYY.YYY.pth + + Args: + filename: The checkpoint filename + + Returns: + The validation loss as a float, or None if parsing fails + """ + pattern = r'model_epoch_\d+_best_validation_([\d.]+)\.pth' + match = re.search(pattern, filename) + if match: + return float(match.group(1)) + return None + + +def find_best_checkpoint(model_dir: Path) -> Optional[Tuple[Path, float]]: + """ + Find the checkpoint with the lowest validation loss in a model directory. + + Args: + model_dir: Path to the model directory (e.g., model0, model1, etc.) + + Returns: + Tuple of (checkpoint_path, validation_loss) or None if no checkpoints found + """ + # Search for all checkpoint files in the models subdirectory + checkpoint_pattern = "model_epoch_*_best_validation_*.pth" + checkpoints = list(model_dir.rglob(checkpoint_pattern)) + + if not checkpoints: + print(f" ⚠️ No checkpoints found in {model_dir.name}") + return None + + best_checkpoint = None + best_loss = float('inf') + + for checkpoint in checkpoints: + loss = parse_validation_loss(checkpoint.name) + if loss is not None and loss < best_loss: + best_loss = loss + best_checkpoint = checkpoint + + if best_checkpoint: + return (best_checkpoint, best_loss) + + print(f" ⚠️ Could not parse validation loss from checkpoints in {model_dir.name}") + return None + + +def main(): + """Main function to process all model directories.""" + # Define paths - handle both host and Docker container paths + script_dir = Path(__file__).parent.resolve() + base_dir = script_dir / "place/Dev-IK-Rel-Place-v0" + output_dir = base_dir / "best_models" + + # Create output directory (including parent directories if needed) + output_dir.mkdir(parents=True, exist_ok=True) + print(f"📁 Output directory: {output_dir}\n") + + # Find all model directories (model0, model1, ..., modelN) + model_dirs = sorted([d for d in base_dir.iterdir() + if d.is_dir() and d.name.startswith("model") + and d.name != "best_models"]) + + if not model_dirs: + print("❌ No model directories found!") + return + + print(f"Found {len(model_dirs)} model directories\n") + print("=" * 80) + + # Process each model directory + results = [] + for model_dir in model_dirs: + print(f"\n🔍 Processing {model_dir.name}...") + + result = find_best_checkpoint(model_dir) + if result: + checkpoint_path, validation_loss = result + print(f" ✅ Best checkpoint: {checkpoint_path.name}") + print(f" 📊 Validation loss: {validation_loss}") + + # Copy to output directory with model name prefix + output_filename = f"{model_dir.name}_{checkpoint_path.name}" + output_path = output_dir / output_filename + + shutil.copy2(checkpoint_path, output_path) + print(f" 📋 Copied to: {output_filename}") + + results.append({ + 'model': model_dir.name, + 'checkpoint': checkpoint_path.name, + 'loss': validation_loss, + 'output': output_filename + }) + + # Print summary + print("\n" + "=" * 80) + print("\nSUMMARY") + print("=" * 80) + print(f"\nProcessed {len(model_dirs)} models") + print(f"Successfully copied {len(results)} best checkpoints\n") + + if results: + print("Best checkpoints by validation loss:") + print("-" * 80) + sorted_results = sorted(results, key=lambda x: x['loss']) + for i, r in enumerate(sorted_results, 1): + print(f"{i:2d}. {r['model']:8s} | Loss: {r['loss']:12.2f} | {r['checkpoint']}") + + # Save file paths to text file + save_paths_to_file(output_dir, results) + + print(f"\nAll best models saved to: {output_dir}") + else: + print("No checkpoints were copied") + + +def save_paths_to_file(output_dir: Path, results: list) -> None: + """ + Save all copied checkpoint file paths to a text file. + + Args: + output_dir: Directory where the checkpoints were copied + results: List of dictionaries containing model information + """ + txt_file = output_dir / "best_model_paths.txt" + + with open(txt_file, 'w') as f: + for result in sorted(results, key=lambda x: x['model']): + file_path = output_dir / result['output'] + f.write(f"{file_path}\n") + + print(f"📝 File paths saved to: {txt_file}") + + +if __name__ == "__main__": + main() diff --git a/docs/run_experiments.sh b/docs/run_experiments.sh new file mode 100644 index 000000000000..9f7da360e12a --- /dev/null +++ b/docs/run_experiments.sh @@ -0,0 +1,66 @@ + + +## script to run experiments in the background + +task="Dev-IK-Rel-Place-v0" +horizon=5000 +num_rollouts=100 +run_file="scripts/imitation_learning/robomimic/play_ensemble_v05.py" +ensemble_size=15 + +##### this now runs the experiments + +## ensemble 15 +seed=101 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +seed=107 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +seed=115 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +## ensemble 10 +ensemble_size=10 +seed=101 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +seed=107 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +seed=115 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +## ensemble 5 +ensemble_size=5 +seed=101 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +seed=107 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +seed=115 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +## ensemble 1 +ensemble_size=1 +seed=101 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +seed=107 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +seed=115 +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless diff --git a/scripts/imitation_learning/isaaclab_mimic/annotate_demos.py b/scripts/imitation_learning/isaaclab_mimic/annotate_demos.py index 17322c6e93ce..489a52bbc976 100644 --- a/scripts/imitation_learning/isaaclab_mimic/annotate_demos.py +++ b/scripts/imitation_learning/isaaclab_mimic/annotate_demos.py @@ -210,6 +210,10 @@ def main(): # Disable all termination terms env_cfg.terminations = None + # Note: We keep events enabled as the reset_to() function applies state AFTER events run, + # so the recorded state should override any randomization. If object placement is still + # inaccurate, try using --device cuda:0 instead of --device cpu. + # Set up recorder terms for mimic annotations env_cfg.recorders = MimicRecorderManagerCfg() if not args_cli.auto: diff --git a/scripts/imitation_learning/robomimic/play.py b/scripts/imitation_learning/robomimic/play.py index 4b1476f6bea1..02d293b21eba 100644 --- a/scripts/imitation_learning/robomimic/play.py +++ b/scripts/imitation_learning/robomimic/play.py @@ -178,6 +178,8 @@ def main(): results.append(terminated) print(f"[INFO] Trial {trial}: {terminated}\n") + print(f"\n Environment summary : {env}") + # Print results print(f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials") print(f"Success rate: {results.count(True) / len(results)}") print(f"Trial Results: {results}\n") diff --git a/scripts/imitation_learning/robomimic/play_diffusion.py b/scripts/imitation_learning/robomimic/play_diffusion.py new file mode 100644 index 000000000000..15d78ca345f7 --- /dev/null +++ b/scripts/imitation_learning/robomimic/play_diffusion.py @@ -0,0 +1,297 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Script to play and evaluate a trained Diffusion Policy from robomimic. + +This script loads a robomimic diffusion policy and plays it in an Isaac Lab environment. +It handles the temporal observation stacking required by diffusion policy. + +Args: + task: Name of the environment. + checkpoint: Path to the robomimic policy checkpoint. + horizon: If provided, override the step horizon of each rollout. + num_rollouts: If provided, override the number of rollouts. + seed: If provided, override the default random seed. + norm_factor_min: If provided, minimum value of the action space normalization factor. + norm_factor_max: If provided, maximum value of the action space normalization factor. +""" + +"""Launch Isaac Sim Simulator first.""" + + +import argparse + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Evaluate robomimic diffusion policy for Isaac Lab environment.") +parser.add_argument( + "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." +) +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--checkpoint", type=str, default=None, help="Pytorch model checkpoint to load.") +parser.add_argument("--horizon", type=int, default=800, help="Step horizon of each rollout.") +parser.add_argument("--num_rollouts", type=int, default=1, help="Number of rollouts.") +parser.add_argument("--seed", type=int, default=101, help="Random seed.") +parser.add_argument( + "--norm_factor_min", type=float, default=None, help="Optional: minimum value of the normalization factor." +) +parser.add_argument( + "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." +) +parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") + + +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim + # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter + import pinocchio # noqa: F401 + +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import copy +from collections import deque +import gymnasium as gym +import numpy as np +import random +import torch + +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.torch_utils as TorchUtils + +if args_cli.enable_pinocchio: + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from isaaclab_tasks.utils import parse_env_cfg + + +def get_observation_horizon(policy): + """Get the observation horizon from diffusion policy config. + + Args: + policy: The loaded robomimic policy wrapper. + + Returns: + int: The observation horizon (default 2 for diffusion policy). + """ + if hasattr(policy.policy, 'algo_config') and hasattr(policy.policy.algo_config, 'horizon'): + return policy.policy.algo_config.horizon.observation_horizon + # Default for diffusion policy if not found + return 2 + + +def prepare_obs_for_diffusion(obs_dict, obs_history): + """Prepare observations for diffusion policy inference. + + Diffusion policy expects observations with shape [B, T, D] where: + - B = batch size (1 for single env inference) + - T = observation_horizon (temporal dimension) + - D = observation feature dimension + + Args: + obs_dict: Current observation dictionary from environment + obs_history: Deque of past observations + + Returns: + Stacked observation dictionary with temporal dimension + """ + # Store current observation (without batch dimension) + current_obs = {} + for k in obs_dict: + if obs_dict[k].dim() > 1: + current_obs[k] = obs_dict[k].squeeze(0) + else: + current_obs[k] = obs_dict[k] + + obs_history.append(current_obs) + + # Stack observations along temporal dimension: [T, D] -> [1, T, D] + stacked_obs = {} + for k in obs_dict: + obs_list = [obs_history[i][k] for i in range(len(obs_history))] + stacked = torch.stack(obs_list, dim=0).unsqueeze(0) # [1, T, D] + stacked_obs[k] = stacked + + # Debug: print shapes on first call + if not hasattr(prepare_obs_for_diffusion, '_printed'): + print("\n[DEBUG] Observation shapes after stacking:") + for k, v in stacked_obs.items(): + print(f" {k}: {v.shape} (ndim={v.ndim})") + prepare_obs_for_diffusion._printed = True + + return stacked_obs + + +def rollout(policy, env, success_term, horizon, device): + """Perform a single rollout of the diffusion policy in the environment. + + Args: + policy: The robomimic diffusion policy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + + Returns: + terminated: Whether the rollout terminated successfully. + traj: The trajectory of the rollout. + """ + policy.start_episode() + obs_dict, _ = env.reset() + traj = dict(actions=[], obs=[], next_obs=[]) + + # Setup temporal observation history for diffusion policy + observation_horizon = get_observation_horizon(policy) + obs_history = deque(maxlen=observation_horizon) + + # Initialize history with first observation (repeated to fill the queue) + first_obs = {} + for k in obs_dict["policy"]: + if obs_dict["policy"][k].dim() > 1: + first_obs[k] = obs_dict["policy"][k].squeeze(0) + else: + first_obs[k] = obs_dict["policy"][k] + + # Fill history with copies of first observation + for _ in range(observation_horizon): + obs_history.append(copy.deepcopy(first_obs)) + + for i in range(horizon): + # Prepare observations with temporal stacking for diffusion policy + obs = prepare_obs_for_diffusion(obs_dict["policy"], obs_history) + + # Debug: print gripper observation at key steps + # if i == 0 or i == 5: + # print(f"\n[DEBUG] Step {i} - Observations:") + # print(f" gripper_pos: {obs['gripper_pos'][0, -1, :].cpu().numpy()}") # Last timestep + # print(f" eef_pos: {obs['eef_pos'][0, -1, :].cpu().numpy()}") + # print(f" object_position: {obs['object_position'][0, -1, :].cpu().numpy()}") + + # Check if environment has image observations + if hasattr(env.cfg, "image_obs_list"): + # Process image observations for robomimic inference + for image_name in env.cfg.image_obs_list: + if image_name in obs_dict["policy"].keys(): + # Convert from chw uint8 to hwc normalized float + image = torch.squeeze(obs_dict["policy"][image_name]) + image = image.permute(2, 0, 1).clone().float() + image = image / 255.0 + image = image.clip(0.0, 1.0) + # Stack image observations temporally as well + obs[image_name] = image.unsqueeze(0).unsqueeze(0).expand(1, observation_horizon, -1, -1, -1) + + traj["obs"].append(obs) + + # Compute actions from diffusion policy + # Use batched_ob=True because we already have batch dimension [1, T, D] + actions = policy(obs, batched_ob=True) + + # Debug: print action stats periodically + # if i == 0 or i == 10 or i == 50: + # print(f"\n[DEBUG] Step {i} - Raw policy actions:") + # print(f" Shape: {actions.shape}") + # print(f" Min: {actions.min():.4f}, Max: {actions.max():.4f}") + # print(f" Values: {actions}") + # # Check if policy has normalization stats + # if hasattr(policy, 'action_normalization_stats') and policy.action_normalization_stats is not None: + # print(f" Action norm stats available: {policy.action_normalization_stats.keys()}") + # else: + # print(f" WARNING: No action normalization stats in policy!") + + # Unnormalize actions if normalization factors provided + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ( + (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) + ) / 2 + args_cli.norm_factor_min + + actions = torch.from_numpy(actions).to(device=device).view(1, env.action_space.shape[1]) + + # Apply actions to environment + obs_dict, _, terminated, truncated, _ = env.step(actions) + + # Record trajectory + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs_dict["policy"]) + + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + return True, traj + elif terminated or truncated: + return False, traj + + return False, traj + + +def main(): + """Run a trained diffusion policy from robomimic with Isaac Lab environment.""" + # parse configuration + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + + # Set observations to dictionary mode for Robomimic + env_cfg.observations.policy.concatenate_terms = False + + # Set termination conditions + env_cfg.terminations.time_out = None + + # Disable recorder + env_cfg.recorders = None + + # Extract success checking function + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + + # Create environment + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + + # Set seed for reproducibility + torch.manual_seed(args_cli.seed) + np.random.seed(args_cli.seed) + random.seed(args_cli.seed) + env.seed(args_cli.seed) + + # Acquire device + device = TorchUtils.get_torch_device(try_to_use_cuda=True) + + # Load policy once (diffusion policy maintains internal action queue) + policy, _ = FileUtils.policy_from_checkpoint(ckpt_path=args_cli.checkpoint, device=device) + print(f"[INFO] Loaded diffusion policy from {args_cli.checkpoint}") + + # Debug: print expected observation shapes from policy + print("\n[DEBUG] Policy expected obs_shapes:") + for k, v in policy.policy.obs_shapes.items(): + print(f" {k}: {v} (len={len(v)})") + + # Get and print observation horizon + obs_horizon = get_observation_horizon(policy) + print(f"[INFO] Diffusion policy observation_horizon: {obs_horizon}") + + # Run policy rollouts + results = [] + for trial in range(args_cli.num_rollouts): + print(f"[INFO] Starting trial {trial}") + terminated, traj = rollout(policy, env, success_term, args_cli.horizon, device) + results.append(terminated) + print(f"[INFO] Trial {trial}: {'Success' if terminated else 'Failed'}\n") + + print(f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials") + print(f"Success rate: {results.count(True) / len(results):.2%}") + print(f"Trial Results: {results}\n") + + env.close() + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() diff --git a/scripts/imitation_learning/robomimic/play_ensemble_v05.py b/scripts/imitation_learning/robomimic/play_ensemble_v05.py new file mode 100644 index 000000000000..43771bc8d2ac --- /dev/null +++ b/scripts/imitation_learning/robomimic/play_ensemble_v05.py @@ -0,0 +1,781 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# run this script: +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play_ensemble_v05.py --device cuda --task Dev-IK-Rel-v0 --num_rollouts 100 +# stack cube task: ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 +"""Script to play and evaluate a trained policy from robomimic. + +This script loads a robomimic policy and plays it in an Isaac Lab environment. +Updated for robomimic v0.5 compatibility. + +Args: + task: Name of the environment. + checkpoint: Path to the robomimic policy checkpoint. + horizon: If provided, override the step horizon of each rollout. + num_rollouts: If provided, override the number of rollouts. + seed: If provided, overeride the default random seed. + norm_factor_min: If provided, minimum value of the action space normalization factor. + norm_factor_max: If provided, maximum value of the action space normalization factor. +""" + +"""Launch Isaac Sim Simulator first.""" + + +import argparse + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") +parser.add_argument("--video", action="store_true", default=False, help="Record videos during training.") +parser.add_argument("--video_length", type=int, default=800, help="Length of the recorded video (in steps).") +parser.add_argument( + "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." +) +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--checkpoint", type=str, default=None, help="Pytorch model checkpoint to load.") +parser.add_argument("--horizon", type=int, default=2000, help="Step horizon of each rollout.") +parser.add_argument("--num_rollouts", type=int, default=1, help="Number of rollouts.") +parser.add_argument("--seed", type=int, default=101, help="Random seed.") +parser.add_argument( + "--norm_factor_min", type=float, default=None, help="Optional: minimum value of the normalization factor." +) +parser.add_argument( + "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." +) +parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") + +parser.add_argument("--model_name", type=str, default=None) +parser.add_argument("--exp_name", type=str, default=None) + +group = parser.add_mutually_exclusive_group() +group.add_argument("--use_recovery", type=bool ,default= False, help="Enable recovery mechanism. By default recovery is enabled.") + +parser.add_argument("--ensemble_size", type=int, default=10) + +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim + # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter + import pinocchio # noqa: F401 +import numpy as np +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import time +import copy +import random +import os +import gymnasium as gym +import torch +import math +from collections import deque + +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.torch_utils as TorchUtils +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp.observations import get_joint_pos, object_grasped +#from chills.tasks.mdp.observations import get_joint_pos, object_grasped +if args_cli.enable_pinocchio: + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from isaaclab_tasks.utils import parse_env_cfg +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType +from isaaclab.utils.math import matrix_from_quat, convert_quat, quat_mul, euler_xyz_from_quat +from evaluation import ensemble_uncertainty +from isaaclab.safety.switchingLogic import SwitchingLogic +from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg +from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat +from isaaclab.managers import SceneEntityCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg, BinaryJointPositionActionCfg +from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction +from backup_controller_handler import BackupController + + +def policy_from_checkpoint_v05(ckpt_path, device, verbose=True): + """ + Load a policy from a checkpoint file - compatible with robomimic v0.5. + + This is a wrapper that handles API differences between robomimic versions. + + Args: + ckpt_path: Path to the checkpoint file. + device: Device to load the policy on. + verbose: Whether to print verbose output. + + Returns: + policy: The loaded policy. + ckpt_dict: The checkpoint dictionary. + """ + import robomimic + from packaging import version + + # Check robomimic version + robomimic_version = getattr(robomimic, '__version__', '0.3.0') + + if verbose: + print(f"[INFO] Loading checkpoint with robomimic version {robomimic_version}") + + # robomimic v0.5+ may have different API + if version.parse(robomimic_version) >= version.parse('0.5.0'): + # v0.5 API - policy_from_checkpoint returns (policy, ckpt_dict) + try: + result = FileUtils.policy_from_checkpoint(ckpt_path=ckpt_path, device=device, verbose=verbose) + if isinstance(result, tuple): + return result + else: + return result, None + except TypeError as e: + if verbose: + print(f"[WARN] policy_from_checkpoint failed with: {e}") + print("[INFO] Trying alternative loading method...") + + # Alternative: manual loading + import torch + import json + from robomimic.algo import algo_factory + from robomimic.config import config_factory + + ckpt_dict = torch.load(ckpt_path, map_location=device) + + # Get config from checkpoint + config = ckpt_dict.get('config', {}) + if isinstance(config, dict): + algo_name = config.get('algo_name', 'bc') + config_obj = config_factory(algo_name) + with config_obj.values_unlocked(): + config_obj.update(config) + config = config_obj + + # Create policy + policy = algo_factory( + algo_name=config.algo_name, + config=config, + obs_key_shapes=ckpt_dict.get('shape_metadata', {}).get('all_shapes', {}), + ac_dim=ckpt_dict.get('shape_metadata', {}).get('ac_dim', 7), + device=device, + ) + + # Load weights + policy.deserialize(ckpt_dict['model']) + policy.set_eval() + + return policy, ckpt_dict + else: + # Older API + return FileUtils.policy_from_checkpoint(ckpt_path=ckpt_path, device=device, verbose=verbose) + + +def rollout(policy, env, success_term, horizon, device): + """Perform a single rollout of the policy in the environment. + + Args: + policy: The robomimicpolicy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + + Returns: + terminated: Whether the rollout terminated. + traj: The trajectory of the rollout. + """ + policy.start_episode() + obs_dict, _ = env.reset() + + #print(f"obs_dict type: {type(obs_dict)},\nobs_dict contents:\n {obs_dict}") + + traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[]) + + # Define the observation keys the trained model expects + TRAINED_OBS_KEYS = ['eef_pos', 'eef_quat', 'gripper_pos', 'joint_pos', 'joint_vel', + 'object_position', 'target_object_position', 'actions'] + + for i in range(horizon): + # Prepare observations + obs = copy.deepcopy(obs_dict["policy"]) + sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) + + for ob in obs: + obs[ob] = torch.squeeze(obs[ob]) + #print(f"found observation : {obs[ob]}") + + for subob in sub_obs: + sub_obs[subob] = torch.squeeze(sub_obs[subob]) + + # Check if environment image observations + if hasattr(env.cfg, "image_obs_list"): + # Process image observations for robomimic inference + for image_name in env.cfg.image_obs_list: + if image_name in obs_dict["policy"].keys(): + # Convert from chw uint8 to hwc normalized float + image = torch.squeeze(obs_dict["policy"][image_name]) + image = image.permute(2, 0, 1).clone().float() + image = image / 255.0 + image = image.clip(0.0, 1.0) + obs[image_name] = image + + traj["obs"].append(obs) + traj["sub_obs"].append(sub_obs) + + # Filter observations to only include keys the model was trained with + policy_obs = {k: obs[k] for k in TRAINED_OBS_KEYS if k in obs} + + # Add dropout layers to the model and calculate uncertainty and remove at the end to not effect final action + + #hooks = inject_dropout_layers(policy=policy, probability=0.1) + # uncertainty_dict = MC_dropout_uncertainty(policy=policy, obs=obs, niters=15) + # traj['uncertainties'].append(uncertainty_dict['variance']) + #remove_dropout_layers(hooks) + + # Compute actions + actions = policy(policy_obs) + + # Unnormalize actions + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ( + (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) + ) / 2 + args_cli.norm_factor_min + + actions = torch.from_numpy(actions).to(device=device).view(1, env.action_space.shape[1]) + + # Apply actions + obs_dict, _, terminated, truncated, _ = env.step(actions) + obs = obs_dict["policy"] + sub_obs = obs_dict["subtask_terms"] + + # Record trajectory + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs) + + + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + return True, traj + elif terminated or truncated: + return False, traj + + return False, traj + + +# tip over detection +def has_fallen(asset, threshold: float = -0.7, debug: bool = True) -> bool: + """ + Detect if an IsaacLab asset has fallen over by checking its up vector. + + Args: + asset: IsaacLab asset (e.g. robot, object) with .get_world_pose() + threshold: minimum z-component of the up vector (1.0 = perfectly upright). + Typical cutoff ~0.7 (≈45° tilt). + debug: if True, prints internal values for inspection. + + Returns: + True if fallen, False otherwise. + """ + quat = asset.data.body_link_quat_w # (pos, quat), usually torch.Tensors + # print("Beaker quat : ", quat) + # Ensure torch tensor, shape (4,) + if isinstance(quat, (list, tuple)): + quat = torch.tensor(quat, dtype=torch.float32) + quat = quat.view(-1, 4) # shape (1,4) + + # Convert quaternion to wxyz ordering + quat_wxyz = convert_quat(quat, to="wxyz") + + # Rotation matrix (1,3,3) + R = matrix_from_quat(quat_wxyz) + + # World up vector is the third column of rotation matrix + up = R[0, :, 2] # shape (3,) + uprightness = float(up[2]) + + if debug: + print(f"[has_fallen] quat={quat_wxyz.cpu().numpy().round(4)}") + print(f"[has_fallen] up={up.cpu().numpy().round(4)} uprightness={uprightness:.3f}") + + return uprightness > threshold + + +def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): + """Perform a single rollout of the policy in the environment. + + Args: + policy: The robomimicpolicy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + + Returns: + terminated: Whether the rollout terminated. + traj: The trajectory of the rollout. + """ + ## do setup + print("running rollout number : ", rollout_num) + for policy in ensemble: + policy.start_episode() + obs_dict, _ = env.reset() + traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], + uncertainties=[], min_actions=[], max_actions=[], + time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[]) + + ###### SETUP SWITCHING LOGIC #### + switchingLogic = SwitchingLogic(parameters, horizon=horizon) + certain_joint_positions = [] + + ###### SET UP RECOVERY #### + use_recovery=False + recovery_activated_during_rollout = 0 + print("rollout recovery enabled ? : ", use_recovery) + + ##### RECOVERY CONFIG #### + recovery_cooldown_duration = 300 # timesteps + recovery_cooldown_timer = recovery_cooldown_duration + recovery_cooldown_active = False + recovery = [] + recovery_steps = 0 + max_recovery_steps = 500 # Safety limit for recovery mode + + ##### CONFIG RECOVERY CONTROLLER #### + backup_controller = BackupController(env, device) + state_guess = 0 + last_state = 0 + recovery_mode = False + object_knocked = False + + # Define the observation keys the trained model expects + # These must match the keys used during training (from shape_metadata) + TRAINED_OBS_KEYS = ['eef_pos', 'eef_quat', 'gripper_pos', 'joint_pos', 'joint_vel', + 'object_position', 'target_object_position', 'actions'] + + print(f'Running for horizon {horizon}') + for i in range(horizon): + # Prepare observations + + obs = copy.deepcopy(obs_dict["policy"]) + sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) + + for ob in obs: + obs[ob] = torch.squeeze(obs[ob]) + + for subob in sub_obs: + sub_obs[subob] = torch.squeeze(sub_obs[subob]) + traj["obs"].append(obs) + traj["sub_obs"].append(sub_obs) + + # Check if environment image observations + if hasattr(env.cfg, "image_obs_list"): + # Process image observations for robomimic inference + for image_name in env.cfg.image_obs_list: + if image_name in obs_dict["policy"].keys(): + # Convert from chw uint8 to hwc normalized float + image = torch.squeeze(obs_dict["policy"][image_name]) + image = image.permute(2, 0, 1).clone().float() + image = image / 255.0 + image = image.clip(0.0, 1.0) + obs[image_name] = image + + # Filter observations to only include keys the model was trained with + # This prevents dimension mismatch errors when env has extra observations + policy_obs = {k: obs[k] for k in TRAINED_OBS_KEYS if k in obs} + + # Debug: print observation shapes on first iteration + if i == 0: + print(f"[DEBUG] Available obs keys: {list(obs.keys())}") + print(f"[DEBUG] Filtered policy_obs keys: {list(policy_obs.keys())}") + total_dim = 0 + for k, v in policy_obs.items(): + dim = v.shape[-1] if len(v.shape) > 0 else 1 + print(f"[DEBUG] {k}: shape={v.shape}, dim={dim}") + total_dim += dim + print(f"[DEBUG] Total dimension: {total_dim} (expected 44)") + missing = [k for k in TRAINED_OBS_KEYS if k not in obs] + if missing: + print(f"[DEBUG] MISSING keys: {missing}") + + #### get policy action #### + metrics = ensemble_uncertainty(ensemble, policy_obs) + uncertainty = metrics['variance'] + policy_actions = metrics['mean'] + + # Robust state estimation based on actual observations + is_grasping = bool(sub_obs['grasp'].item()) if sub_obs['grasp'].numel() == 1 else bool(torch.any(sub_obs['grasp'])) + + # Update state guess based on actual gripper/object state + if is_grasping: + # Object is grasped - should be in LIFT or later states + if state_guess < 4: # LIFT_OBJECT = 4 + state_guess = 4 + print(f"[STATE] Updated to LIFT_OBJECT (grasp detected)") + else: + # Not grasping - if we thought we were lifting, we dropped it + if state_guess >= 4 and state_guess < 7: # Was in lift/move states + # Object dropped - need to re-approach + state_guess = 0 # Go back to REST to safely re-approach + print(f"[STATE] Reset to REST (grasp lost)") + + sm_actions, state_guess = backup_controller.get_controller_action(state_guess, 0) + if last_state != state_guess: + print(f"[STATE] Transition: {last_state} -> {state_guess}") + last_state = state_guess + + + # this is the switching logic + uncertainty_triggered = switchingLogic.check(uncertainty, i) + if uncertainty_triggered: + # uncertainty triggered + if use_recovery and not recovery_cooldown_active: + # if we have switched to recovery + if not recovery_mode: + recovery_mode = True + recovery_activated_during_rollout+=1 + recovery_steps = 0 + print(f"[RECOVERY] Step {i} - Starting recovery from state {state_guess}") + + if recovery_mode: + actions = sm_actions + recovery_steps += 1 + + # Exit recovery when task completes or after max steps + max_recovery_steps = 500 + if state_guess == 7 or recovery_steps > max_recovery_steps: # APPROACH_GOAL = 7 + print(f"[RECOVERY] Completed after {recovery_steps} steps, state={state_guess}") + recovery_mode = False + recovery_cooldown_active = True + recovery_cooldown_timer = recovery_cooldown_duration + else: + # Decrement cooldown when not in recovery + if recovery_cooldown_active: + recovery_cooldown_timer -= 1 + if recovery_cooldown_timer <= 0: + recovery_cooldown_active = False + recovery_cooldown_timer = recovery_cooldown_duration + print("Recovery Cooldown Ended") + + actions = policy_actions + + # Unnormalize actions + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ( + (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) + ) / 2 + args_cli.norm_factor_min + actions = actions.to(device=device).view(1, env.action_space.shape[1]) + + + # Apply actions + obs_dict, _, terminated, truncated, _ = env.step(actions) + recovery.append(recovery_mode) + # update obs from taking action + obs = obs_dict["policy"] + sub_obs = obs_dict["subtask_terms"] + + # Record trajectory + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs) + traj['uncertainties'].append(uncertainty) + traj['max_actions'].append(metrics['max']) + traj['min_actions'].append(metrics['min']) + traj['time_taken'].append(metrics['time_taken']) + traj['joint_pos'].append(obs['abs_joint_pos']) + traj['recovery'].append(recovery) + if torch.any(obs['object_knocked']): + print("[MONITOR] object knocked over") + object_knocked = True + + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + traj['failure'].append(" ") + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + appr = torch.any(sub_obs['stacked']) + traj['appr'].append(appr.item()) + print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + # print(f"grasp : {grasp.item()}, appr : {appr.item()}") + return True, traj, recovery_activated_during_rollout, "" + + elif terminated or truncated: + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + appr = torch.any(sub_obs['stacked']) + traj['appr'].append(appr.item()) + #print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + if i==horizon: + #if the failure was caused by object collision + traj['failure'].append("timeout") + failure_reason = "timeout" + else: + #if failure due to timeout, record timeout + traj['failure'].append("knocked") + failure_reason = "object_knocked" + return False, traj, recovery_activated_during_rollout, failure_reason + #print("REcovery : ", traj["recovery"]) + traj['failure'].append("timeout") + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + appr = torch.any(sub_obs['stacked']) + traj['appr'].append(appr.item()) + return False, traj, recovery_activated_during_rollout, "" + + +def load_ensemble(device, ensemble_path): + """Load an ensemble of policies from checkpoint paths. + + Updated for robomimic v0.5 compatibility. + """ + with open(ensemble_path, 'r') as file: + ensemble_paths = [path.strip() for path in file.readlines()] + ensemble = [] + for path in ensemble_paths: + if not path: # Skip empty lines + continue + policy, _ = policy_from_checkpoint_v05(ckpt_path=path, device=device, verbose=True) + ensemble.append(policy) + print(f"[DEBUG] loaded {len(ensemble)} policies") + return ensemble + + +def clear_files(*paths : str): + if len(paths) < 1: + raise ValueError("At least one path is required.") + if os.path.exists(paths[0]): + #overwrite = input(f"You are about to overwrite rollout data at: {paths}\nContinue (y/n):") + overwrite = "y" + match overwrite.lower(): + case 'y' | 'Y': + for path in paths: + with open(path, 'w') as file: + pass + case _: + exit() + + + +def main(): + """Run a trained policy from robomimic with Isaac Lab environment.""" + # parse configuration + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + + # Set observations to dictionary mode for Robomimic + env_cfg.observations.policy.concatenate_terms = False + + #create a log handler + # loghelper = LoggingHelper() + + + + # Disable recorder + env_cfg.recorders = None + + # Extract success checking function + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + + # Get timeout signal + timeout = env_cfg.terminations.time_out + #env_cfg.terminations.time_out = None + + # Create environment + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + + # Set seed + torch.manual_seed(args_cli.seed) + ##### unset these two lines for deterministic randomness + # np.random.seed(args_cli.seed) + # random.seed(args_cli.seed) + + env.seed(args_cli.seed) + + # Acquire device + device = TorchUtils.get_torch_device(try_to_use_cuda=True) + + # load the stack cube ensemble + # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') + + #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') + pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') + # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') + + # Lets set these to the 0.99 confidence + parameters = { + 'beaker_lift' :{ + 0 : { + "confidence_level": 0.018646507043923632, + "window_size": 15, + "max_peaks": 10 + }, + 1 : { + "confidence_level": 0.018898154803458085, + "window_size": 10, + "max_peaks": 9 + }, + 2 : { + "confidence_level": 0.017589774107725654, + "window_size": 15, + "max_peaks": 7 + }, + 3 : { + "confidence_level": 0.02829341592326851, + "window_size": 12, + "max_peaks": 8 + }, + 4 : { + "confidence_level": 0.029170220902127186, + "window_size": 15, + "max_peaks": 11 + }, + 5 : { + "confidence_level": 0.017449474558650185, + "window_size": 12, + "max_peaks": 7 + }, + 6 : { + "confidence_level": 0.6324478323150455, + "window_size": 14, + "max_peaks": 14 + }, + + }, + } + + model_arch = "BC_RNN_GMM" + task = "pick_place" # stack_cube or pick_place + model_name = f"ensemble" + number = 'no_recovery_video' + + results_path = f"docs/training_data/{task}/uncertainty_rollout_{task}/{model_name}/run_{number}" + + uncertainties_path = f"{results_path}/uncertainties{number}.txt" + actions_path = f"{results_path}/actions{number}.txt" + min_actions_path = f"{results_path}/min_actions{number}.txt" + max_actions_path = f"{results_path}/max_actions{number}.txt" + time_taken_path = f"{results_path}/time_taken{number}.txt" + recovery_activated_during_rollout_path = f"{results_path}/recovery_activated_during_rollout.txt" + rollout_uncert_path = f"{uncertainties_path}/rollout_uncerts" + rollout_log_path = f"{uncertainties_path[:len(uncertainties_path)-4]}_rollout_log.txt" + + rollout_log_path = f"{uncertainties_path[:len(uncertainties_path)-4]}_rollout_log.txt" # remove the '.txt' and add rollout_log.txt + + uncertainty_results_path = f"{results_path}/uncertainty_plots" + trajectory_results_path = f"{results_path}/trajectory_plots" + os.makedirs(uncertainty_results_path, exist_ok=True) + os.makedirs(trajectory_results_path, exist_ok=True) + + + # clear files + clear_files( + uncertainties_path, actions_path, + min_actions_path, max_actions_path, + time_taken_path, recovery_activated_during_rollout_path + ) + + # Run policy + results = [] + failed_no_intervention =[] + intervention = [] + intervention_success = [] + knocked=0 + intervention_failure = [] + for trial in range(args_cli.num_rollouts): + print(f"[INFO] Starting trial {trial}") + + terminated, traj, recovery_activated_during_rollout, failure = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['beaker_lift'], use_recovery=args_cli.use_recovery, rollout_num=trial) + # save the uncertainties + print("Finished rollout, recovery needed : ", recovery_activated_during_rollout) + #print("actions shape : ", traj['actions']) + + if not terminated: + print(f"failure : {traj['failure']}") + for j in range(7): + with open(f"docs/rollouts/rollout_logging_no_recovery_joint{j}.txt", "a") as file: + #file.write(f"Logs for joint {j}\n") + for i, var in enumerate(traj['actions']): + # get all the info per joint + act = str(traj['actions'][i][0][j]) + max = str(traj['max_actions'][i].values.tolist()[j]) + min = str(traj['min_actions'][i].values.tolist()[j]) + uncert = str(traj['uncertainties'][i].tolist()[j]) + #print("joint pos : ", str(traj['joint_pos'][i][0].tolist()[j])) + joint_pos = str(traj['joint_pos'][i][0].tolist()[j]) + recovery = "False"#str(traj['recovery'][0][i]) + # print("writing recovery : ", recovery) + line = f"{i} : {act} : {max} : {min} : {uncert} : {joint_pos}: {recovery}: {terminated}\n" + file.write(line) + # this logs the outcome of the rollout - the failure methods + for j in range(7): + joint_uncert = [t[j].item() for t in traj['uncertainties']] + with open(f"docs/rollouts/rollout_uncerts_joint{j}.txt", "a") as f: + line = ",".join(["{:.10f}".format(v) for v in joint_uncert]) + f.write(line + f" : {terminated} \n") + # for i in range(len(traj['failure'])): + with open(f"docs/rollouts/rollout_outcomes.txt", "a") as file: + if terminated: + # print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + #trialnum : outcome : recovery needed ? : failure mode : grasp subtask : appr subtask + line=f"{trial}: {terminated} : {recovery_activated_during_rollout} : : {True} : {True} \n" + else : + grasp = traj['grasp'][0] + appr = traj['appr'][0] + print(f"Subatask : {grasp} , {appr}") + line=f"{trial} : {terminated} : {recovery_activated_during_rollout} : {traj['failure'][0]} : {grasp} : {appr}\n" + # print(f"grasp : {traj['grasp'][0]}, appr : {traj['appr'][0]}") + file.write(line) + + + results.append(terminated) + if not terminated: + if recovery_activated_during_rollout <=0: + failed_no_intervention.append(1) + + if recovery_activated_during_rollout > 0: + intervention.append(1) + if terminated: + intervention_success.append(1) + else: + intervention_failure.append(1) + else: + intervention.append(0) + if "knocked" in traj['failure'] or (len(traj['failure']) > 0 and traj['failure'][-1] == "knocked"): + knocked+=1 + + print(f'Current success rate: {results.count(True)/len(results):.2%}') + print(f'Current intervention rate: {sum(intervention)/len(intervention):.2%} ({sum(intervention)}/{len(intervention)})') + print(f"[INFO] Trial {trial}: {'SUCCESS' if terminated else 'FAILED'}\n") + #loghelper.stopEpoch(trial) + + # Prepare summary text + exp_name = args_cli.exp_name if args_cli.exp_name else "unnamed" + summary_text = f"\nSummary for experiment {exp_name}\n" + summary_text += f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials\n" + summary_text += f"Success rate: {results.count(True) / len(results)}\n" + summary_text += f'Failed runs with no intervention : {sum(failed_no_intervention)}\n' + summary_text += f"Intervention rate : {sum(intervention)/len(intervention)}. Of which success : {sum(intervention_success)}, of which failed {sum(intervention_failure)}\n" + summary_text += f"Number of times object knocked over : {knocked}\n" + summary_text += f"Trial Results: {results}\n\n" + summary_text += f"Environment random seed: {args_cli.seed}\n" + + # Print to console + print(summary_text) + + # Write to file + results_file = "docs/ensemble_run_results.txt" + with open(results_file, 'a') as f: + f.write(summary_text) + f.write("\n" + "="*80 + "\n\n") + print(f"Results appended to: {results_file}") + + env.close() + + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() diff --git a/scripts/imitation_learning/robomimic/train.py b/scripts/imitation_learning/robomimic/train.py index 945c1f40f980..9203665a3ac9 100644 --- a/scripts/imitation_learning/robomimic/train.py +++ b/scripts/imitation_learning/robomimic/train.py @@ -87,7 +87,7 @@ import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 -def normalize_hdf5_actions(config: Config, log_dir: str) -> str: +def normalize_hdf5_actions(config: Config, log_dir: str) -> list: """Normalizes actions in hdf5 dataset to [-1, 1] range. Args: @@ -95,14 +95,22 @@ def normalize_hdf5_actions(config: Config, log_dir: str) -> str: log_dir: Directory to save normalization parameters. Returns: - Path to the normalized dataset. + List of dataset configs with normalized paths (robomimic v0.5 format). """ - base, ext = os.path.splitext(config.train.data) + # Handle both string path and list format (robomimic v0.5) + if isinstance(config.train.data, str): + original_path = config.train.data + elif isinstance(config.train.data, list): + original_path = config.train.data[0]["path"] + else: + raise ValueError(f"Unexpected config.train.data type: {type(config.train.data)}") + + base, ext = os.path.splitext(original_path) normalized_path = base + "_normalized" + ext # Copy the original dataset print(f"Creating normalized dataset at {normalized_path}") - shutil.copyfile(config.train.data, normalized_path) + shutil.copyfile(original_path, normalized_path) # Open the new dataset and normalize the actions with h5py.File(normalized_path, "r+") as f: @@ -126,11 +134,12 @@ def normalize_hdf5_actions(config: Config, log_dir: str) -> str: f[path] = normalized_data # Save the min and max values to log directory - with open(os.path.join(log_dir, "normalization_params.txt"), "w") as f: - f.write(f"min: {min}\n") - f.write(f"max: {max}\n") + with open(os.path.join(log_dir, "normalization_params.txt"), "w") as norm_f: + norm_f.write(f"min: {min}\n") + norm_f.write(f"max: {max}\n") - return normalized_path + # Return in robomimic v0.5 list format + return [{"path": normalized_path}] def train(config: Config, device: str, log_dir: str, ckpt_dir: str, video_dir: str): @@ -164,17 +173,29 @@ def train(config: Config, device: str, log_dir: str, ckpt_dir: str, video_dir: s # read config to set up metadata for observation modalities (e.g. detecting rgb observations) ObsUtils.initialize_obs_utils_with_config(config) - # make sure the dataset exists - dataset_path = os.path.expanduser(config.train.data) + # robomimic v0.5: config.train.data is a list of dataset configs + # Verify dataset exists (conversion already done in main() before lock) + dataset_path = os.path.expanduser(config.train.data[0]["path"]) if not os.path.exists(dataset_path): raise FileNotFoundError(f"Dataset at provided path {dataset_path} not found!") - - # load basic metadata from training file + + # load basic metadata from training file (use first dataset) print("\n============= Loaded Environment Metadata =============") - env_meta = FileUtils.get_env_metadata_from_dataset(dataset_path=config.train.data) + + env_meta = FileUtils.get_env_metadata_from_dataset(dataset_path=dataset_path) + # robomimic v0.5 changed API: now expects dataset_config dict with "path" key + print(f"config.train.data: {config.train.data}") + dataset_config = config.train.data[0] + + print(f"Dataset Config: {dataset_config}") + shape_meta = FileUtils.get_shape_metadata_from_dataset( - dataset_path=config.train.data, all_obs_keys=config.all_obs_keys, verbose=True + dataset_config=dataset_config, + action_keys=config.train.action_keys, + all_obs_keys=config.all_obs_keys, + verbose=True ) + print(f"shape_meta: {shape_meta}\n") if config.experiment.env is not None: env_meta["env_name"] = config.experiment.env @@ -202,9 +223,29 @@ def train(config: Config, device: str, log_dir: str, ckpt_dir: str, video_dir: s print(envs[env.name]) print("") + print(f"obs keys : {shape_meta['all_obs_keys']}") + + + # load training data BEFORE model creation (robomimic v0.5 requirement) + trainset, validset = TrainUtils.load_data_for_training(config, obs_keys=shape_meta["all_obs_keys"]) + train_sampler = trainset.get_dataset_sampler() + print("\n============= Training Dataset =============") + print(trainset) + print("") + + # robomimic v0.5: set num_train_batches and num_epochs in optim_params before model creation + train_num_steps = config.experiment.epoch_every_n_steps + for k in config.algo.optim_params: + config.algo.optim_params[k]["num_train_batches"] = len(trainset) if train_num_steps is None else train_num_steps + config.algo.optim_params[k]["num_epochs"] = config.train.num_epochs # setup for a new training run - data_logger = DataLogger(log_dir, config=config, log_tb=config.experiment.logging.log_tb) + data_logger = DataLogger( + log_dir, + config=config, + log_tb=config.experiment.logging.log_tb, + log_wandb=config.experiment.logging.log_wandb, + ) model = algo_factory( algo_name=config.algo_name, config=config, @@ -221,13 +262,6 @@ def train(config: Config, device: str, log_dir: str, ckpt_dir: str, video_dir: s print(model) # print model summary print("") - # load training data - trainset, validset = TrainUtils.load_data_for_training(config, obs_keys=shape_meta["all_obs_keys"]) - train_sampler = trainset.get_dataset_sampler() - print("\n============= Training Dataset =============") - print(trainset) - print("") - # maybe retrieve statistics for normalizing observations obs_normalization_stats = None if config.train.hdf5_normalize_obs: @@ -390,11 +424,17 @@ def main(args: argparse.Namespace): # change location of experiment directory config.train.output_dir = os.path.abspath(os.path.join("./logs", args.log_dir, args.task)) - log_dir, ckpt_dir, video_dir = TrainUtils.get_exp_dir(config) + # robomimic v0.5+ returns 4 values: log_dir, output_dir, video_dir, time_dir + log_dir, ckpt_dir, video_dir, _ = TrainUtils.get_exp_dir(config) if args.normalize_training_actions: config.train.data = normalize_hdf5_actions(config, log_dir) + # robomimic v0.5: config.train.data must be a list of dataset configs + # Convert single path string to list format if needed (must be done before lock) + if isinstance(config.train.data, str): + config.train.data = [{"path": os.path.expanduser(config.train.data)}] + # get torch device device = TorchUtils.get_torch_device(try_to_use_cuda=config.train.cuda) @@ -430,7 +470,7 @@ def main(args: argparse.Namespace): parser.add_argument("--task", type=str, default=None, help="Name of the task.") parser.add_argument("--algo", type=str, default=None, help="Name of the algorithm.") - parser.add_argument("--log_dir", type=str, default="robomimic", help="Path to log directory") + parser.add_argument("--log_dir", type=str, default="docs/place/model", help="Path to log directory") parser.add_argument("--normalize_training_actions", action="store_true", default=False, help="Normalize actions") parser.add_argument( "--epochs", diff --git a/scripts/imitation_learning/robomimic/train_ensemble.py b/scripts/imitation_learning/robomimic/train_ensemble.py index 047c62daece7..b2510eed8edb 100644 --- a/scripts/imitation_learning/robomimic/train_ensemble.py +++ b/scripts/imitation_learning/robomimic/train_ensemble.py @@ -175,10 +175,32 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] # load basic metadata from training file print("\n============= Loaded Environment Metadata =============") env_meta = FileUtils.get_env_metadata_from_dataset(dataset_path=config.train.data) + print(f"config.train.data: {config.train.data}") + with config.values_unlocked(): + config.train.data = [{'path': 'docs/place/glassware_stack_demos_split_normalized.hdf5'}] + ####### HARD CODED MAKE SURE THIS GETS UPDATED ######### + config_list= [{'path': 'docs/place/glassware_stack_demos_split_normalized.hdf5'}] + print(f"config.train.data: {config.train.data}") + # print(f"config_list: {config_list}") + # if isinstance(config.train.data, str): + # datasets = [] + # datasets.append(config.train.data) + # dataset_config = {"path": datasets} + # elif isinstance(config.train.data, dict): + # datasets = [] + # dataset_config= (config.train.data) + # dataset_config= {'path': 'docs/place/glassware_stack_demos_split_normalized.hdf5',} + # print(f"Dataset Config: {dataset_config}") + + dataset_config = config.train.data[0] shape_meta = FileUtils.get_shape_metadata_from_dataset( - dataset_path=config.train.data, all_obs_keys=config.all_obs_keys, verbose=True + dataset_config=dataset_config, + action_keys=config.train.action_keys, + all_obs_keys=config.all_obs_keys, + verbose=True ) - + print(f"shape_meta: {shape_meta}\n") + if config.experiment.env is not None: env_meta["env_name"] = config.experiment.env print("=" * 30 + "\n" + "Replacing Env to {}\n".format(env_meta["env_name"]) + "=" * 30) @@ -205,7 +227,7 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] print(envs[env.name]) print("") - + print(f"obs keys : {shape_meta['all_obs_keys']}") # load training data trainset, validset = TrainUtils.load_data_for_training(config, obs_keys=shape_meta["all_obs_keys"]) @@ -427,31 +449,22 @@ def keep_data_percentage(trainset, percentage): return trainset -def create_bootstrap_sample(trainset, seed: int): - """Create a bootstrap sample (sampling with replacement) from the training set. - - Each bootstrap sample contains N samples drawn with replacement from the original - dataset of size N. On average, ~63.2% of samples will be unique, with ~36.8% duplicates. - This creates diversity across ensemble members. +def create_bootstrap_sample(trainset, seed: int, percent: float = 0.5): + """Create a random sample (without replacement) of a percentage of the training set. Args: trainset: The original training dataset. seed: Random seed for reproducibility. - + percent: Fraction of the dataset to sample (default 0.75 for 75%). Returns: - A Subset of the training data with bootstrap sampling. + A Subset of the training data with random sampling (no replacement). """ np.random.seed(seed) total_size = len(trainset) - # Sample WITH replacement - same sample can appear multiple times - indices = np.random.choice(total_size, size=total_size, replace=True) - - # Count unique samples - unique_count = len(np.unique(indices)) - unique_percent = (unique_count / total_size) * 100 - - print(f"Bootstrap sample created: {unique_count}/{total_size} unique samples ({unique_percent:.1f}%)") - + sample_size = int(total_size * percent) + indices = np.random.choice(total_size, size=sample_size, replace=False) + indices = np.sort(indices) + print(f"Random sample created: {sample_size}/{total_size} samples ({percent*100:.1f}%)") return Subset(trainset, indices) @@ -515,7 +528,7 @@ def main(args: argparse.Namespace): new_output_dir = f"{original_output_dir}/model{i}/" config.train.output_dir = new_output_dir - log_dir, ckpt_dir, video_dir = TrainUtils.get_exp_dir(config) + log_dir, ckpt_dir, video_dir, _ = TrainUtils.get_exp_dir(config) log_dirs.append(log_dir) ckpt_dirs.append(ckpt_dir) diff --git a/scripts/tools/check_demos.py b/scripts/tools/check_demos.py new file mode 100644 index 000000000000..5ef552833b5a --- /dev/null +++ b/scripts/tools/check_demos.py @@ -0,0 +1,38 @@ +import h5py +import numpy as np + +f = h5py.File('/workspace/isaaclab/docs/place/glassware_stack_demos_split.hdf5', 'r') + +# Analyze gripper action (dim 6) over normalized time +demos = list(f['data'].keys()) +print(f"Number of demos: {len(demos)}") + +# Get a few demo lengths +lengths = [f['data'][d]['actions'].shape[0] for d in demos[:10]] +print(f"Demo lengths (first 10): {lengths}") + +# Analyze gripper at different phases +early_gripper = [] # First 10% of each demo +mid_gripper = [] # 30-50% of each demo +late_gripper = [] # Last 20% of each demo + +for demo in demos: + actions = f['data'][demo]['actions'][:] + n = len(actions) + gripper = actions[:, 6] # Gripper is dim 6 + + early_gripper.extend(gripper[:int(n*0.1)]) + mid_gripper.extend(gripper[int(n*0.3):int(n*0.5)]) + late_gripper.extend(gripper[int(n*0.8):]) + +print(f"\nGripper action analysis by phase:") +print(f"Early (0-10%): mean={np.mean(early_gripper):.3f}, std={np.std(early_gripper):.3f}") +print(f"Mid (30-50%): mean={np.mean(mid_gripper):.3f}, std={np.std(mid_gripper):.3f}") +print(f"Late (80-100%): mean={np.mean(late_gripper):.3f}, std={np.std(late_gripper):.3f}") + +# Check first few steps of first demo +first_demo = f['data'][demos[0]]['actions'][:] +print(f"\nFirst demo - first 20 gripper actions:") +print(first_demo[:20, 6]) + +f.close() \ No newline at end of file diff --git a/scripts/tools/copy_metadata_hdf5.py b/scripts/tools/copy_metadata_hdf5.py index 85fbcc84bf1b..3b57e1804b70 100644 --- a/scripts/tools/copy_metadata_hdf5.py +++ b/scripts/tools/copy_metadata_hdf5.py @@ -6,10 +6,11 @@ DATA_GROUP = "data" # Metadata to add +# robomimic v0.5 requires 'env_kwargs' key (not 'sim_args') metadata = { "env_name": "Cube-Mimic-v0", "type": 2, - "sim_args": { + "env_kwargs": { "dt": 0.01, "decimation": 2, "render_interval": 2, diff --git a/source/isaaclab/isaaclab/managers/recorder_manager.py b/source/isaaclab/isaaclab/managers/recorder_manager.py index 855c975f2a91..2f8829880807 100644 --- a/source/isaaclab/isaaclab/managers/recorder_manager.py +++ b/source/isaaclab/isaaclab/managers/recorder_manager.py @@ -429,8 +429,9 @@ def get_ep_meta(self) -> dict: """Get the episode metadata.""" if not hasattr(self._env.cfg, "get_ep_meta"): # Add basic episode metadata + # robomimic v0.5 requires 'env_kwargs' key (not 'sim_args') ep_meta = dict() - ep_meta["sim_args"] = { + ep_meta["env_kwargs"] = { "dt": self._env.cfg.sim.dt, "decimation": self._env.cfg.decimation, "render_interval": self._env.cfg.sim.render_interval, diff --git a/source/isaaclab/isaaclab/safety/switchingLogic.py b/source/isaaclab/isaaclab/safety/switchingLogic.py index bfcd265adbdf..92c188d98426 100644 --- a/source/isaaclab/isaaclab/safety/switchingLogic.py +++ b/source/isaaclab/isaaclab/safety/switchingLogic.py @@ -30,7 +30,7 @@ def halfway_check(self, step:int=0, grasp_state:bool=True): return True return False -s + def check(self, uncertainties, step) -> bool: # 1. Update windows for joint_num, unc in enumerate(uncertainties): diff --git a/source/isaaclab/isaaclab/utils/datasets/hdf5_dataset_file_handler.py b/source/isaaclab/isaaclab/utils/datasets/hdf5_dataset_file_handler.py index 13f07dddf378..882eac423d05 100644 --- a/source/isaaclab/isaaclab/utils/datasets/hdf5_dataset_file_handler.py +++ b/source/isaaclab/isaaclab/utils/datasets/hdf5_dataset_file_handler.py @@ -56,8 +56,9 @@ def create(self, file_path: str, env_name: str = None): # set environment arguments # the environment type (we use gym environment type) is set to be compatible with robomimic # Ref: https://github.com/ARISE-Initiative/robomimic/blob/master/robomimic/envs/env_base.py#L15 + # robomimic v0.5 requires 'env_kwargs' key (not 'sim_args') env_name = env_name if env_name is not None else "" - self.add_env_args({"env_name": env_name, "type": 2}) + self.add_env_args({"env_name": env_name, "type": 2, "env_kwargs": {}}) def __del__(self): """Destructor for the file handler.""" @@ -177,6 +178,16 @@ def create_dataset_helper(group, key, value): for key, value in episode.data.items(): create_dataset_helper(h5_episode_group, key, value) + # robomimic v0.5: generate next_obs by shifting obs by 1 timestep + if "obs" in episode.data and isinstance(episode.data["obs"], dict): + next_obs_group = h5_episode_group.create_group("next_obs") + for obs_key, obs_value in episode.data["obs"].items(): + if isinstance(obs_value, torch.Tensor): + obs_np = obs_value.cpu().numpy() + # next_obs[t] = obs[t+1], last timestep duplicated + next_obs_np = np.concatenate([obs_np[1:], obs_np[-1:]], axis=0) + next_obs_group.create_dataset(obs_key, data=next_obs_np, compression="gzip") + # increment total step counts self._hdf5_data_group.attrs["total"] += h5_episode_group.attrs["num_samples"] diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py b/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py index 544d80075af4..c612ed504c9b 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py @@ -19,6 +19,7 @@ from .cube_blueprint_mimic_env_cfg import CubeBlueprintMimicEnvCfg from .cube_mimic_env_cfg import CubeMimicEnvCfg from .cube_mimic_env import CubeMimicEnv +from .cube_mimic_env_skillgen_cfg import CubeMimicEnvSkillgenCfg ## # Inverse Kinematics - Relative Pose Control ## @@ -84,6 +85,15 @@ disable_env_checker=True, ) +gym.register( + id="Cube-IK-Rel-Skillgen-v0", + entry_point="isaaclab_mimic.envs:CubeMimicEnv", + kwargs={ + "env_cfg_entry_point": cube_mimic_env_skillgen_cfg.CubeMimicEnvSkillgenCfg, + }, + disable_env_checker=True, +) + gym.register( id="Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0", entry_point="isaaclab_mimic.envs:FrankaCubeStackIKRelMimicEnv", diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py index 0d3e07572fd7..d85e778b4889 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_blueprint_mimic_env_cfg.py @@ -79,62 +79,39 @@ def __post_init__(self): ) ) #lift ? - subtask_configs.append( - SubTaskConfig( - # Each subtask involves manipulation with respect to a single object frame. - object_ref="object", - # End of final subtask does not need to be detected - subtask_term_signal="lift", - # No time offsets for the final subtask - subtask_term_offset_range=(5, 10), - # Selection strategy for source subtask segment - selection_strategy="nearest_neighbor_robot_distance", - # Optional parameters for the selection strategy function - selection_strategy_kwargs={"nn_k": 3}, - # Amount of action noise to apply during this subtask - action_noise=0.03, - # Number of interpolation steps to bridge to this subtask segment - num_interpolation_steps=5, - # Additional fixed steps for the robot to reach the necessary pose - num_fixed_steps=0, - # If True, apply action noise during the interpolation phase and execution - apply_noise_during_interpolation=False, - ) - ) - subtask_configs.append( - SubTaskConfig( - # Each subtask involves manipulation with respect to a single object frame. - object_ref="object", - # End of final subtask does not need to be detected - # LOL YOU DO - subtask_term_signal="appr_goal", - # No time offsets for the final subtask - subtask_term_offset_range=(0, 0), - # Selection strategy for source subtask segment - selection_strategy="nearest_neighbor_robot_distance", - # Optional parameters for the selection strategy function - selection_strategy_kwargs={"nn_k": 3}, - # Amount of action noise to apply during this subtask - action_noise=0.03, - # Number of interpolation steps to bridge to this subtask segment - num_interpolation_steps=5, - # Additional fixed steps for the robot to reach the necessary pose - num_fixed_steps=0, - # If True, apply action noise during the interpolation phase and execution - apply_noise_during_interpolation=False, - ) - ) + # subtask_configs.append( + # SubTaskConfig( + # # Each subtask involves manipulation with respect to a single object frame. + # object_ref="object", + # # End of final subtask does not need to be detected + # subtask_term_signal="lift", + # # No time offsets for the final subtask + # subtask_term_offset_range=(5, 10), + # # Selection strategy for source subtask segment + # selection_strategy="nearest_neighbor_robot_distance", + # # Optional parameters for the selection strategy function + # selection_strategy_kwargs={"nn_k": 3}, + # # Amount of action noise to apply during this subtask + # action_noise=0.03, + # # Number of interpolation steps to bridge to this subtask segment + # num_interpolation_steps=5, + # # Additional fixed steps for the robot to reach the necessary pose + # num_fixed_steps=0, + # # If True, apply action noise during the interpolation phase and execution + # apply_noise_during_interpolation=False, + # ) + # ) # subtask_configs.append( # SubTaskConfig( # # Each subtask involves manipulation with respect to a single object frame. # object_ref="object", # # End of final subtask does not need to be detected # # LOL YOU DO - # subtask_term_signal="release_object", + # subtask_term_signal="appr_goal", # # No time offsets for the final subtask # subtask_term_offset_range=(0, 0), # # Selection strategy for source subtask segment - # selection_strategy="nearest_neighbor_object", + # selection_strategy="nearest_neighbor_robot_distance", # # Optional parameters for the selection strategy function # selection_strategy_kwargs={"nn_k": 3}, # # Amount of action noise to apply during this subtask @@ -147,4 +124,27 @@ def __post_init__(self): # apply_noise_during_interpolation=False, # ) # ) + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # End of final subtask does not need to be detected + # LOL YOU DO + subtask_term_signal=None, + # No time offsets for the final subtask + subtask_term_offset_range=(0, 0), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_object", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=5, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + ) + ) self.subtask_configs["franka"] = subtask_configs \ No newline at end of file diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py index a295df1c7fce..195e1abf19ab 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py @@ -113,10 +113,10 @@ def action_to_target_eef_pose(self, action: torch.Tensor) -> dict[str, torch.Ten delta_rotation_axis = delta_rotation / delta_rotation_angle # Handle invalid division for the case when delta_rotation_angle is close to zero - is_close_to_zero_angle = torch.isclose(delta_rotation_angle, torch.zeros_like(delta_rotation_angle)).squeeze(1) + is_close_to_zero_angle = torch.isclose(delta_rotation_angle, torch.zeros_like(delta_rotation_angle)).squeeze(-1) delta_rotation_axis[is_close_to_zero_angle] = torch.zeros_like(delta_rotation_axis)[is_close_to_zero_angle] - delta_quat = PoseUtils.quat_from_angle_axis(delta_rotation_angle.squeeze(1), delta_rotation_axis).squeeze(0) + delta_quat = PoseUtils.quat_from_angle_axis(delta_rotation_angle.squeeze(-1), delta_rotation_axis) delta_rot_mat = PoseUtils.matrix_from_quat(delta_quat) target_rot = torch.matmul(delta_rot_mat, curr_rot) @@ -158,8 +158,32 @@ def get_subtask_term_signals(self, env_ids: Sequence[int] | None = None) -> dict subtask_terms = self.obs_buf["subtask_terms"] #signals["appr"] = subtask_terms["appr"][env_ids] signals["grasp"] = subtask_terms["grasp"][env_ids] + signals["stacked"] = subtask_terms["stacked"][env_ids] #signals["lift"] = subtask_terms["lift"][env_ids] - signals["appr_goal"] = subtask_terms["appr_goal"][env_ids] - # signals["release_object"] = subtask_terms["release_object"][env_ids] - # final subtask is placing cubeC on cubeA (motion relative to cubeA) - but final subtask signal is not needed + #signals["appr_goal"] = subtask_terms["appr_goal"][env_ids] + #signals["release_object"] = subtask_terms["release_object"][env_ids] + # final subtask is placing cube on goal - signal needed when using --annotate_subtask_start_signals return signals + + def get_expected_attached_object(self, eef_name: str, subtask_index: int, env_cfg) -> str | None: + """ + (SkillGen) Return the expected attached object for the given EEF/subtask. + + Assumes 'stack' subtasks place the object grasped in the preceding 'grasp' subtask. + Returns None for 'grasp' (or others) at subtask start. + """ + if eef_name not in env_cfg.subtask_configs: + return None + + subtask_configs = env_cfg.subtask_configs[eef_name] + if not (0 <= subtask_index < len(subtask_configs)): + return None + + current_cfg = subtask_configs[subtask_index] + # If stacking, expect we are holding the object grasped in the prior subtask + if "stack" in str(current_cfg.subtask_term_signal).lower(): + if subtask_index > 0: + prev_cfg = subtask_configs[subtask_index - 1] + if "grasp" in str(prev_cfg.subtask_term_signal).lower(): + return prev_cfg.object_ref + return None diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py index 20181d3aa4a2..71ce2096b510 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py @@ -26,7 +26,7 @@ def __post_init__(self): self.datagen_config.name = "beaker_rand_scale_D0" self.datagen_config.generation_guarantee = True self.datagen_config.generation_keep_failed = False - self.datagen_config.generation_num_trials = 100 + self.datagen_config.generation_num_trials = 10 self.datagen_config.generation_select_src_per_subtask = True self.datagen_config.generation_transform_first_robot_pose = False self.datagen_config.generation_interpolate_from_last_target_pose = True @@ -81,6 +81,8 @@ def __post_init__(self): num_fixed_steps=0, # If True, apply action noise during the interpolation phase and execution apply_noise_during_interpolation=False, + description="Grasp Glassware", + next_subtask_description="Stack glassware on scale", ) ) #lift ? @@ -106,29 +108,29 @@ def __post_init__(self): # apply_noise_during_interpolation=False, # ) # ) - subtask_configs.append( - SubTaskConfig( - # Each subtask involves manipulation with respect to a single object frame. - object_ref="object", - # End of final subtask does not need to be detected - # This is actually the lift - subtask_term_signal="appr_goal", - # No time offsets for the final subtask - subtask_term_offset_range=(10, 20), - # Selection strategy for source subtask segment - selection_strategy="nearest_neighbor_robot_distance", - # Optional parameters for the selection strategy function - selection_strategy_kwargs={"nn_k": 3}, - # Amount of action noise to apply during this subtask - action_noise=0.03, - # Number of interpolation steps to bridge to this subtask segment - num_interpolation_steps=5, - # Additional fixed steps for the robot to reach the necessary pose - num_fixed_steps=0, - # If True, apply action noise during the interpolation phase and execution - apply_noise_during_interpolation=False, - ) - ) + # subtask_configs.append( + # SubTaskConfig( + # # Each subtask involves manipulation with respect to a single object frame. + # object_ref="object", + # # End of final subtask does not need to be detected + # # This is actually the lift + # subtask_term_signal="appr_goal", + # # No time offsets for the final subtask + # subtask_term_offset_range=(10, 20), + # # Selection strategy for source subtask segment + # selection_strategy="nearest_neighbor_robot_distance", + # # Optional parameters for the selection strategy function + # selection_strategy_kwargs={"nn_k": 3}, + # # Amount of action noise to apply during this subtask + # action_noise=0.03, + # # Number of interpolation steps to bridge to this subtask segment + # num_interpolation_steps=5, + # # Additional fixed steps for the robot to reach the necessary pose + # num_fixed_steps=0, + # # If True, apply action noise during the interpolation phase and execution + # apply_noise_during_interpolation=False, + # ) + # ) subtask_configs.append( SubTaskConfig( @@ -136,11 +138,11 @@ def __post_init__(self): object_ref="object", # End of final subtask - when using --annotate_subtask_start_signals, # the last subtask must also have a signal name - subtask_term_signal="success", + subtask_term_signal="stacked", # No time offsets for the final subtask subtask_term_offset_range=(0, 0), # Selection strategy for source subtask segment - selection_strategy="nearest_neighbor_robot_distance", + selection_strategy="nearest_neighbor_object_distance", # Optional parameters for the selection strategy function selection_strategy_kwargs={"nn_k": 3}, # Amount of action noise to apply during this subtask @@ -151,6 +153,7 @@ def __post_init__(self): num_fixed_steps=0, # If True, apply action noise during the interpolation phase and execution apply_noise_during_interpolation=False, + description="Stack glassware on scale", ) ) diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_skillgen_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_skillgen_cfg.py new file mode 100755 index 000000000000..196a87c6e47e --- /dev/null +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_skillgen_cfg.py @@ -0,0 +1,90 @@ +# Copyright (c) 2024-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig +from isaaclab.utils import configclass + +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_skillgen import FrankaDevEnvSkillgenCfg + + +@configclass +class CubeMimicEnvSkillgenCfg(FrankaDevEnvSkillgenCfg, MimicEnvCfg): + """ + Isaac Lab Mimic environment config class for Franka Cube Stack IK Rel env. + """ + + def __post_init__(self): + # post init of parents + super().__post_init__() + # # TODO: Figure out how we can move this to the MimicEnvCfg class + # # The __post_init__() above only calls the init for FrankaCubeStackEnvCfg and not MimicEnvCfg + # # https://stackoverflow.com/questions/59986413/achieving-multiple-inheritance-using-python-dataclasses + + # Override the existing values + self.datagen_config.name = "beaker_rand_scale_D0" + self.datagen_config.generation_guarantee = True + self.datagen_config.generation_keep_failed = False + self.datagen_config.generation_num_trials = 10 + self.datagen_config.generation_select_src_per_subtask = True + self.datagen_config.generation_transform_first_robot_pose = False + self.datagen_config.generation_interpolate_from_last_target_pose = True + self.datagen_config.generation_relative = True + self.datagen_config.max_num_failures = 100 + self.datagen_config.seed = 101 + + # The following are the subtask configurations for the stack task. + # The following are the subtask configurations for the stack task. + subtask_configs = [] + + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # Corresponding key for the binary indicator in "datagen_info" for completion + subtask_term_signal="grasp", + # Time offsets for data generation when splitting a trajectory + subtask_term_offset_range=(0, 0), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_object", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=0, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + description="Grasp Glassware", + next_subtask_description="Stack glassware on scale", + ) + ) + + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # End of final subtask - when using --annotate_subtask_start_signals, + # the last subtask must also have a signal name + subtask_term_signal="stacked", + # No time offsets for the final subtask + subtask_term_offset_range=(0, 0), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_object_distance", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=0, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + description="Stack glassware on scale", + ) + ) + self.subtask_configs["franka"] = subtask_configs \ No newline at end of file diff --git a/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner.py b/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner.py index f9c6cf69cbdb..70b7272540aa 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner.py +++ b/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner.py @@ -181,7 +181,7 @@ def __init__( self.n_repeat: int | None = self.config.n_repeat self.step_size: float | None = self.config.motion_step_size self.visualize_plan: bool = self.config.visualize_plan - self.visualize_spheres: bool = self.config.visualize_spheres + self.visualize_spheres: bool = False # Log the config parameter values self.logger.info(f"Config parameter values: {self.config}") diff --git a/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner_cfg.py index eaf28e0ed153..3290a42f693d 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/motion_planners/curobo/curobo_planner_cfg.py @@ -126,7 +126,7 @@ class CuroboPlannerCfg: time_dilation_factor: float = 1.0 """Time dilation factor for planning.""" - surface_sphere_radius: float = 0.005 + surface_sphere_radius: float = 0.001 """Radius of surface spheres for collision checking.""" # Debug and visualization @@ -136,13 +136,13 @@ class CuroboPlannerCfg: motion_step_size: float | None = None """Step size (in radians) for retiming motion plans. If None, no retiming.""" - visualize_spheres: bool = False + visualize_spheres: bool = True """Visualize robot collision spheres. Note: only works for env 0.""" visualize_plan: bool = False """Visualize motion plan in Rerun. Note: only works for env 0.""" - debug_planner: bool = False + debug_planner: bool = True """Enable detailed motion planning debug information.""" sphere_update_freq: int = 5 @@ -442,14 +442,14 @@ def franka_stack_cube_config(cls) -> "CuroboPlannerCfg": def franka_beaker_config(cls) -> "CuroboPlannerCfg": """Create configuration for Franka stacking a normal cube.""" config = cls.franka_config() - config.static_objects = ["table"] + config.static_objects = ["table", "scale"] config.visualize_plan = True config.debug_planner = True config.motion_noise_scale = 0.02 config.collision_activation_distance = 0.0 config.approach_distance = 0.05 config.retreat_distance = 0.05 - config.surface_sphere_radius = 0.005 + config.surface_sphere_radius = 0.001 config.get_world_config = lambda: config._get_world_config_with_table_adjustment() return config @@ -469,7 +469,7 @@ def from_task_name(cls, task_name: str) -> "CuroboPlannerCfg": return cls.franka_stack_cube_bin_config() elif "stack-cube" in task_lower: return cls.franka_stack_cube_config() - elif "Cube-Mimic" in task_lower: + elif "cube-ik-rel" in task_lower: return cls.franka_beaker_config() else: # Default to Franka configuration diff --git a/source/isaaclab_mimic/setup.py b/source/isaaclab_mimic/setup.py index 658aed9ee807..84f14e1f2cb1 100644 --- a/source/isaaclab_mimic/setup.py +++ b/source/isaaclab_mimic/setup.py @@ -29,7 +29,7 @@ # Check if the platform is Linux and add the dependency if platform.system() == "Linux": - EXTRAS_REQUIRE["robomimic"].append("robomimic@git+https://github.com/ARISE-Initiative/robomimic.git@v0.4.0") + EXTRAS_REQUIRE["robomimic"].append("robomimic@git+https://github.com/ARISE-Initiative/robomimic.git@v0.5.0") # Cumulation of all extra-requires EXTRAS_REQUIRE["all"] = list(itertools.chain.from_iterable(EXTRAS_REQUIRE.values())) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/diffusion_policy.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/diffusion_policy.json index 47fafeea8cb1..27353a78c1ea 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/diffusion_policy.json +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/beaker_pour/config/franka/agents/robomimic/diffusion_policy.json @@ -40,6 +40,7 @@ "num_data_workers": 4, "hdf5_cache_mode": "low_dim", "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, "hdf5_normalize_obs": false, "hdf5_filter_key": "train", "hdf5_validation_filter_key": "valid", @@ -70,7 +71,10 @@ "initial": 0.0001, "decay_factor": 1.0, "epoch_schedule": [], - "scheduler_type": "constant_with_warmup" + "scheduler_type": "cosine", + "step_every_batch": true, + "warmup_steps": 500, + "num_cycles": 0.5 }, "regularization": { "L2": 0.0001 diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py index 7f7b0e7bae8d..0c07f8dcb01b 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py @@ -147,13 +147,22 @@ entry_point="isaaclab.envs:ManagerBasedRLEnv", kwargs={ "env_cfg_entry_point": f"{__name__}.dev_ik_rel_env_place:FrankaDevEnvCfg", - "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), - + + }, + disable_env_checker=True, +) + +gym.register( + id="Dev-IK-Rel-Place-Skillgen-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_ik_rel_skillgen:FrankaDevEnvSkillgenCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), }, disable_env_checker=True, ) \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json index d5071d660c5d..8125682666ea 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json @@ -7,7 +7,7 @@ "terminal_output_to_txt": true, "log_tb": true, "log_wandb": true, - "wandb_proj_name": "pick_place_new_demos_med_qual" + "wandb_proj_name": "pick_place_bc_rnn_0.5_mix" }, "save": { "enabled": true, @@ -20,7 +20,7 @@ }, "epoch_every_n_steps": 100, "validation_epoch_every_n_steps": 10, - "env": "Dev-IK-Rel-v1", + "env": "Dev-IK-Rel-place-v0", "additional_envs": null, "render": false, "render_video": true, @@ -28,9 +28,9 @@ "video_skip": 5, "rollout": { "enabled": false, - "terminate_on_success" : true, - "n": 50, - "horizon": 400, + "terminate_on_success": true, + "n": 50, + "horizon": 400, "rate": 50 } }, @@ -43,13 +43,15 @@ "hdf5_normalize_obs": false, "hdf5_filter_key": "train", "hdf5_validation_filter_key": "valid", - "seq_length": 100, + "seq_length": 16, "dataset_keys": [ "actions", "rewards", "dones" ], - + "action_keys": [ + "actions" + ], "goal_mode": null, "cuda": true, "batch_size": 100, @@ -76,7 +78,6 @@ "l1_weight": 0.0, "cos_weight": 0.0 }, - "gmm": { "enabled": true, "num_modes": 10, @@ -84,7 +85,6 @@ "std_activation": "softplus", "low_noise_eval": true }, - "rnn": { "enabled": true, "horizon": 100, @@ -96,7 +96,6 @@ "bidirectional": false } } - }, "observation": { "modalities": { diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/diffusion_policy.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/diffusion_policy.json index ae7cffd9ea58..9d6e437ec9b7 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/diffusion_policy.json +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/diffusion_policy.json @@ -12,7 +12,7 @@ "save": { "enabled": true, "every_n_seconds": null, - "every_n_epochs": 50, + "every_n_epochs": null, "epochs": [], "on_best_validation": true, "on_best_rollout_return": false, @@ -43,11 +43,10 @@ "hdf5_normalize_obs": false, "hdf5_filter_key": "train", "hdf5_validation_filter_key": "valid", - "seq_length": 10, - "frame_stack": 1, - "pad_frame_stack": true, + "seq_length": 16, "pad_seq_length": true, - "get_pad_mask": false, + "frame_stack": 2, + "pad_frame_stack": true, "goal_mode": null, "dataset_keys": [ "actions", @@ -58,8 +57,8 @@ "actions" ], "cuda": true, - "batch_size": 256, - "num_epochs": 3000, + "batch_size": 128, + "num_epochs": 1000, "seed": 101 }, "algo": { @@ -68,9 +67,12 @@ "optimizer_type": "adamw", "learning_rate": { "initial": 0.0001, - "decay_factor": 1.0, + "decay_factor": 0.1, "epoch_schedule": [], - "scheduler_type": "constant_with_warmup" + "scheduler_type": "cosine", + "step_every_batch": true, + "warmup_steps": 500, + "num_cycles": 0.5 }, "regularization": { "L2": 0.0001 @@ -79,7 +81,7 @@ }, "horizon": { "observation_horizon": 2, - "action_horizon": 8, + "action_horizon": 4, "prediction_horizon": 16 }, "unet": { diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py index 896391c9b6dd..2c2eba3b3b98 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_env_cfg.py @@ -67,6 +67,9 @@ def __post_init__(self): open_command_expr={"panda_finger_.*": 0.04}, close_command_expr={"panda_finger_.*": 0.0}, ) + self.gripper_joint_names = ["panda_finger_.*"] + self.gripper_open_val = 0.04 + self.gripper_threshold = 0.005 # Set the body name for the end effector self.commands.object_pose.body_name = "panda_hand" self.commands.object_pose.body_name = "panda_hand" diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py index fd754ccfbc58..223211fd0669 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py @@ -76,10 +76,10 @@ def __post_init__(self): scale=0.5, body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), ) - self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) + #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) - self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} - ) + #self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} + #) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_skillgen.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_skillgen.py new file mode 100755 index 000000000000..0872b185059a --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_skillgen.py @@ -0,0 +1,87 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.assets import AssetBaseCfg +from isaaclab.sim.spawners.from_files import UsdFileCfg +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG +from . import dev_env_cfg +import math +from isaaclab.managers import SceneEntityCfg +from isaaclab_assets.glassware.glassware import ChemistryGlassware +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab.managers import TerminationTermCfg as DoneTerm +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip +from isaaclab_assets.robots.universal_robots import UR10e_ROBOTIQ_GRIPPER_CFG + + + +@configclass +class FrankaDevEnvSkillgenCfg(dev_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # put the beaker on the stir plate + glassware = ChemistryGlassware() + self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + self.scene.scale = glassware.scale(pos=[0.3, -0.3, 0.01]) + + self.events.reset_object_position = EventTerm( + func=mdp.reset_place_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + "asset2_cfg" : SceneEntityCfg("stirplate"), + "asset3_cfg" : SceneEntityCfg("scale") + + }, + ) + #self.scene.robot = UR10e_ROBOTIQ_GRIPPER_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) + + #self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} + #) + # for f in self.scene.ee_frame.target_frames: + # if f.name == "end_effector": + # f.offset.pos = [0.0, 0.0, 0.0] + # break + diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py new file mode 100644 index 000000000000..40a0566b68d5 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py @@ -0,0 +1,97 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.assets import AssetBaseCfg +from isaaclab.sim.spawners.from_files import UsdFileCfg +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR +from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG +from . import dev_env_cfg +import math +from isaaclab.managers import SceneEntityCfg +from isaaclab_assets.glassware.glassware import ChemistryGlassware +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab.managers import TerminationTermCfg as DoneTerm +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip +from isaaclab_assets.robots.universal_robots import UR10e_ROBOTIQ_GRIPPER_CFG + + + +@configclass +class FrankaDevEnvCfg(dev_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # get the vial from the stirplate and place in vial rack + glassware = ChemistryGlassware() + self.scene.object=glassware.vial(pos=[0.5, 0.0, 0.02],name="Object") + self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + + self.scene.vialrack = glassware.vialrack(pos=[0.3, -0.3, 0.01]) + + self.events.reset_object_position = EventTerm( + func=mdp.reset_place_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + "asset2_cfg" : SceneEntityCfg("stirplate"), + "asset3_cfg" : SceneEntityCfg("scale") + + }, + ) + #self.scene.robot = UR10e_ROBOTIQ_GRIPPER_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + self.terminations.success=DoneTerm(func=mdp.object_inserted_upright, params={"lower_object_cfg": SceneEntityCfg("vialrack")}) + + #self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} + #) + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index eb2138fa5ddf..9b74ea1e1364 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -182,6 +182,14 @@ class SubtaskCfg(ObsGroup): "object_cfg": SceneEntityCfg("object"), }, ) + stacked = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("object"), + "lower_object_cfg": SceneEntityCfg("scale"), + }, + ) # lift = ObsTerm( # func=mdp.is_object_lifted, # params={ @@ -189,13 +197,13 @@ class SubtaskCfg(ObsGroup): # "threshold" : 0.1 # } # ) - appr_goal = ObsTerm( - func=mdp.object_near_goal, - params={ - "threshold": 0.05, - "command_name": "object_pose", - }, - ) + # appr_goal = ObsTerm( + # func=mdp.object_near_goal, + # params={ + # "threshold": 0.05, + # "command_name": "object_pose", + # }, + # ) # release_object = ObsTerm( # func=mdp.object_released, # params={ @@ -308,7 +316,8 @@ class TerminationsCfg: ) object_tipped = DoneTerm(func=mdp.object_knocked) #fix object dropping - success = DoneTerm(func=mdp.object_near_goal) + #success = DoneTerm(func=mdp.object_near_goal) + success= DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py index 75355c70d87a..119f5ef00407 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py @@ -151,7 +151,7 @@ def is_object_lifted( ): #return true when object z coord above a threshold value object = env.scene[obj_cfg.name] - print(f"Object z pos : {object.data.root_pos_w[:, 2]}") + # print(f"Object z pos : {object.data.root_pos_w[:, 2]}") # if object.data.root_pos_w[:, 2].item() > threshold : # print(f"Observed Object Lifted : {object.data.root_pos_w[:, 2].item()}") # loghelper.logsubtask(LogType.LIFT) @@ -304,10 +304,8 @@ def object_tilt (env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = Scen def object_knocked(env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"), max_tilt: float = 45): object: RigidObject = env.scene[upper_object_cfg.name] tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) - if tilt_deg.cpu().detach().numpy()[0] > max_tilt: - # print("object knocked") - return torch.tensor([True], device='cuda:0') - else :return torch.tensor([False], device='cuda:0') + # Return a bool tensor with shape (num_envs,) for proper batching + return tilt_deg > max_tilt def target_position( env: ManagerBasedRLEnv, @@ -318,4 +316,28 @@ def target_position( object: RigidObject = env.scene[object_cfg.name] object_pos_w = object.data.root_pos_w[:, :3] #print(f"target position : {object_pos_w}") - return object_pos_w \ No newline at end of file + return object_pos_w + + +def target_pose( + env: ManagerBasedRLEnv, + object_cfg: SceneEntityCfg = SceneEntityCfg("scale"), +) -> torch.Tensor: + """The pose (position + quaternion) of the target object in world frame. + + Returns: + Tensor of shape (num_envs, 7) containing [x, y, z, qw, qx, qy, qz]. + """ + object: RigidObject = env.scene[object_cfg.name] + object_pos_w = object.data.root_pos_w[:, :3] # (num_envs, 3) + object_quat_w = object.data.root_quat_w # (num_envs, 4) - already wxyz format + return torch.cat([object_pos_w, object_quat_w], dim=-1) # (num_envs, 7) + +# def object_distance_to_goal( +# env: ManagerBasedRLEnv, +# object_cfg: SceneEntityCfg = SceneEntityCfg("object"), +# goal_object_location: SceneEntityCfg = SceneEntityCfg("vialrack"), +# ) -> torch.Tensor: + + + diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py index 6065810915a6..fa2ab92788f9 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py @@ -99,16 +99,39 @@ def placed( def object_stacked_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"),lower_object_cfg: SceneEntityCfg = SceneEntityCfg("goal"), - xy_threshold: float = 0.1, height_threshold: float = 0.1, height_diff: float = 0.05, + xy_threshold: float = 0.05, height_threshold: float = 0.1, height_diff: float = 0.05, + atol=0.0001, + rtol=0.0001, upright_good_deg: float = 30.0, gripper_open_val: torch.Tensor = torch.tensor([0.04]), logging=False) -> torch.Tensor: - """Stacked AND sufficiently upright (≤ upright_good_deg).""" + + """Stacked AND sufficiently upright (≤ upright_good_deg).""" + robot: Articulation = env.scene[robot_cfg.name] upper: RigidObject = env.scene[upper_object_cfg.name] tilt_deg = upright_tilt_deg(upper.data.root_quat_w, upper.data.default_root_state[:, 3:7]) upright_good = tilt_deg <= upright_good_deg stacked = object_stacked(env, robot_cfg, upper_object_cfg, lower_object_cfg, xy_threshold, height_threshold, height_diff, gripper_open_val) stacked_upright = stacked & upright_good + gripper_joint_ids, _ = robot.find_joints(env.cfg.gripper_joint_names) + stacked = torch.logical_and( + torch.isclose( + robot.data.joint_pos[:, gripper_joint_ids[0]], + torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device), + atol=atol, + rtol=rtol, + ), + stacked_upright, + ) + stacked = torch.logical_and( + torch.isclose( + robot.data.joint_pos[:, gripper_joint_ids[1]], + torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device), + atol=atol, + rtol=rtol, + ), + stacked, + ) #if logging: #rising = log(env, "object_stacked_upright", stacked_upright, f"Stacked (upright ≤ {upright_good_deg}°)") @@ -116,7 +139,7 @@ def object_stacked_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = S #if idx.numel() > 0: # print(f"[stacked-upright tilt] n={int(idx.numel())} sample={tilt_deg[idx][:5].tolist()}") - return stacked_upright + return stacked def upright_tilt_deg(q_cur, q_init) -> torch.Tensor: @@ -127,7 +150,7 @@ def upright_tilt_deg(q_cur, q_init) -> torch.Tensor: def object_stacked(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"), lower_object_cfg: SceneEntityCfg = SceneEntityCfg("goal"), - xy_threshold: float = 0.1, height_threshold: float = 0.1, height_diff: float = 0.05, + xy_threshold: float = 0.05, height_threshold: float = 0.1, height_diff: float = 0.05, gripper_open_val: torch.Tensor = torch.tensor([0.04]),logging=False) -> torch.Tensor: """Check if an object is stacked by the specified robot.""" @@ -142,5 +165,49 @@ def object_stacked(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEnti # gripper_open_val.to(env.device), atol=1e-4, rtol=1e-4), stacked) # stacked = torch.logical_and(torch.isclose(robot.data.joint_pos[:, -2], # gripper_open_val.to(env.device), atol=1e-4, rtol=1e-4), stacked) - print(f"For DEBUG : STACKED STATUS : {stacked}") - return stacked \ No newline at end of file + #print(f"For DEBUG : STACKED STATUS : {stacked}") + return stacked + +def object_inserted_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"),lower_object_cfg: SceneEntityCfg = SceneEntityCfg("vialrack"), + xy_threshold: float = 0.01, height_threshold: float = 0.01, height_diff: float = 0.05, + atol=0.0001, + rtol=0.0001, + upright_good_deg: float = 30.0, gripper_open_val: torch.Tensor = torch.tensor([0.04]), logging=False) -> torch.Tensor: + + + """Stacked AND sufficiently upright (≤ upright_good_deg).""" + robot: Articulation = env.scene[robot_cfg.name] + upper: RigidObject = env.scene[upper_object_cfg.name] + tilt_deg = upright_tilt_deg(upper.data.root_quat_w, upper.data.default_root_state[:, 3:7]) + upright_good = tilt_deg <= upright_good_deg + stacked = object_stacked(env, robot_cfg, upper_object_cfg, lower_object_cfg, + xy_threshold, height_threshold, height_diff, gripper_open_val) + stacked_upright = stacked & upright_good + gripper_joint_ids, _ = robot.find_joints(env.cfg.gripper_joint_names) + stacked = torch.logical_and( + torch.isclose( + robot.data.joint_pos[:, gripper_joint_ids[0]], + torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device), + atol=atol, + rtol=rtol, + ), + stacked_upright, + ) + stacked = torch.logical_and( + torch.isclose( + robot.data.joint_pos[:, gripper_joint_ids[1]], + torch.tensor(env.cfg.gripper_open_val, dtype=torch.float32).to(env.device), + atol=atol, + rtol=rtol, + ), + stacked, + ) + + #if logging: + #rising = log(env, "object_stacked_upright", stacked_upright, f"Stacked (upright ≤ {upright_good_deg}°)") + # idx = torch.nonzero(rising, as_tuple=False).squeeze(-1) + #if idx.numel() > 0: + # print(f"[stacked-upright tilt] n={int(idx.numel())} sample={tilt_deg[idx][:5].tolist()}") + + return inserted \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg.py index f173ee644cef..ad944c137153 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_env_cfg.py @@ -40,30 +40,3 @@ def __post_init__(self): body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), ) - self.teleop_devices = DevicesCfg( - devices={ - "handtracking": OpenXRDeviceCfg( - retargeters=[ - Se3RelRetargeterCfg( - bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT, - zero_out_xy_rotation=True, - use_wrist_rotation=False, - use_wrist_position=True, - delta_pos_scale_factor=10.0, - delta_rot_scale_factor=10.0, - sim_device=self.sim.device, - ), - GripperRetargeterCfg( - bound_hand=OpenXRDevice.TrackingTarget.HAND_RIGHT, sim_device=self.sim.device - ), - ], - sim_device=self.sim.device, - xr_cfg=self.xr, - ), - "keyboard": Se3KeyboardCfg( - pos_sensitivity=0.05, - rot_sensitivity=0.05, - sim_device=self.sim.device, - ), - } - ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_instance_randomize_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_instance_randomize_env_cfg.py index cee2530ee4f7..d647f76f3d94 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_instance_randomize_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_ik_rel_instance_randomize_env_cfg.py @@ -6,7 +6,7 @@ from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg from isaaclab.utils import configclass - +from isaaclab_assets.glassware.glassware import ChemistryGlassware from . import stack_joint_pos_instance_randomize_env_cfg ## @@ -28,7 +28,7 @@ def __post_init__(self): self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") # Reduce the number of environments due to camera resources - self.scene.num_envs = 2 + self.scene.num_envs = 1 # Set actions for the specific robot type (franka) self.actions.arm_action = DifferentialInverseKinematicsActionCfg( diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_env_cfg.py index 6b8561684fe0..a73d35ee5f61 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_env_cfg.py @@ -21,8 +21,8 @@ # Pre-defined configs ## from isaaclab.markers.config import FRAME_MARKER_CFG # isort: skip -from isaaclab_assets.robots.franka import FRANKA_PANDA_CFG # isort: skip - +from isaaclab_assets.robots.franka import FRANKA_PANDA_CFG +from isaaclab_assets.glassware.glassware import ChemistryGlassware @configclass class EventCfg: @@ -32,7 +32,8 @@ class EventCfg: func=franka_stack_events.set_default_joint_pose, mode="reset", params={ - "default_pose": [0.0444, -0.1894, -0.1107, -2.5148, 0.0044, 2.3775, 0.6952, 0.0400, 0.0400], + "default_pose": [0.3281, -0.3684, -0.2787, -2.6138, -2.7527, 2.4999, 0.3331, 0.0400, 0.0400], + #"default_pose": [0.0444, -0.1894, -0.1107, -2.5148, 0.0044, 2.3775, 0.6952, 0.0400, 0.0400], }, ) @@ -50,8 +51,8 @@ class EventCfg: func=franka_stack_events.randomize_object_pose, mode="reset", params={ - "pose_range": {"x": (0.4, 0.6), "y": (-0.10, 0.10), "z": (0.0203, 0.0203), "yaw": (-1.0, 1, 0)}, - "min_separation": 0.1, + "pose_range": {"x": (0.4, 0.6), "y": (-0.10, 0.10), "z": (0.0203, 0.0203)}, + "min_separation": 0.4, "asset_cfgs": [SceneEntityCfg("cube_1"), SceneEntityCfg("cube_2"), SceneEntityCfg("cube_3")], }, ) @@ -101,38 +102,11 @@ def __post_init__(self): max_depenetration_velocity=5.0, disable_gravity=False, ) - + glassware = ChemistryGlassware() # Set each stacking cube deterministically - self.scene.cube_1 = RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_1", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.4, 0.0, 0.0203], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/blue_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - semantic_tags=[("class", "cube_1")], - ), - ) - self.scene.cube_2 = RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_2", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.55, 0.05, 0.0203], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - semantic_tags=[("class", "cube_2")], - ), - ) - self.scene.cube_3 = RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_3", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.60, -0.1, 0.0203], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/green_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - semantic_tags=[("class", "cube_3")], - ), - ) + self.scene.cube_1 = glassware.scale(pos=[0.4, -0.35, 0.01], name="cube_1"), + self.scene.cube_2 = glassware.beaker(pos=[0.45, 0.25, 0.02], name="cube_2"), + # Listens to the required transforms marker_cfg = FRAME_MARKER_CFG.copy() diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_instance_randomize_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_instance_randomize_env_cfg.py index 360f1f6482e1..dc105e2d59bf 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_instance_randomize_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/config/franka/stack_joint_pos_instance_randomize_env_cfg.py @@ -5,15 +5,12 @@ import torch -from isaaclab.assets import RigidObjectCfg, RigidObjectCollectionCfg +from isaaclab.assets import RigidObjectCollectionCfg from isaaclab.managers import EventTermCfg as EventTerm from isaaclab.managers import SceneEntityCfg from isaaclab.sensors import FrameTransformerCfg from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg -from isaaclab.sim.schemas.schemas_cfg import RigidBodyPropertiesCfg -from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg from isaaclab.utils import configclass -from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR from isaaclab_tasks.manager_based.manipulation.stack_glassware import mdp from isaaclab_tasks.manager_based.manipulation.stack_glassware.mdp import franka_stack_events @@ -21,6 +18,8 @@ StackInstanceRandomizeEnvCfg, ) +from isaaclab_assets.glassware.glassware import ChemistryGlassware + ## # Pre-defined configs ## @@ -36,7 +35,7 @@ class EventCfg: func=franka_stack_events.set_default_joint_pose, mode="startup", params={ - "default_pose": [0.0444, -0.1894, -0.1107, -2.5148, 0.0044, 2.3775, 0.6952, 0.0400, 0.0400], + "default_pose": [0.3281, -0.3684, -0.2787, -2.6138, -2.7527, 2.4999, 0.3331, 0.0400, 0.0400], }, ) @@ -54,10 +53,10 @@ class EventCfg: func=franka_stack_events.randomize_rigid_objects_in_focus, mode="reset", params={ - "asset_cfgs": [SceneEntityCfg("cube_1"), SceneEntityCfg("cube_2"), SceneEntityCfg("cube_3")], + "asset_cfgs": [SceneEntityCfg("cube_1"), SceneEntityCfg("cube_2")], "out_focus_state": torch.tensor([10.0, 10.0, 10.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), - "pose_range": {"x": (0.4, 0.6), "y": (-0.10, 0.10), "z": (0.0203, 0.0203), "yaw": (-1.0, 1, 0)}, - "min_separation": 0.1, + "pose_range": {"x": (0.3, 0.65), "y": (-0.35, 0.30), "z": (0.02, 0.02)}, + "min_separation": 0.15, }, ) @@ -75,7 +74,7 @@ def __post_init__(self): self.scene.robot = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") # Reduce the number of environments due to camera resources - self.scene.num_envs = 2 + self.scene.num_envs = 1 # Set actions for the specific robot type (franka) self.actions.arm_action = mdp.JointPositionActionCfg( @@ -92,83 +91,23 @@ def __post_init__(self): self.gripper_open_val = 0.04 self.gripper_threshold = 0.005 - # Rigid body properties of each cube - cube_properties = RigidBodyPropertiesCfg( - solver_position_iteration_count=16, - solver_velocity_iteration_count=1, - max_angular_velocity=1000.0, - max_linear_velocity=1000.0, - max_depenetration_velocity=5.0, - disable_gravity=False, - ) + # Initialize ChemistryGlassware for creating glassware objects + glassware = ChemistryGlassware() - # Set each stacking cube to be a collection of rigid objects + # cube_1: Scale (target placement surface) - two variants at different positions cube_1_config_dict = { - "blue_cube": RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_1_Blue", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.4, 0.0, 0.0203], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/blue_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - ), - ), - "red_cube": RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_1_Red", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.4, 0.0, 0.0403], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - ), - ), + "scale_1": glassware.scale(pos=[0.4, -0.35, 0.01], name="Scale_1"), + "scale_2": glassware.scale(pos=[10.0, 10.0, 0.01], name="Scale_2"), # Out of focus position } + # cube_2: Beaker and Conical Flask - positioned far right (positive y) cube_2_config_dict = { - "red_cube": RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_2_Red", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.55, 0.05, 0.0203], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/red_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - ), - ), - "yellow_cube": RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_2_Yellow", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.55, 0.05, 0.0403], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/yellow_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - ), - ), - } - - cube_3_config_dict = { - "yellow_cube": RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_3_Yellow", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.60, -0.1, 0.0203], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/yellow_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - ), - ), - "green_cube": RigidObjectCfg( - prim_path="{ENV_REGEX_NS}/Cube_2_Green", - init_state=RigidObjectCfg.InitialStateCfg(pos=[0.60, -0.1, 0.0403], rot=[1, 0, 0, 0]), - spawn=UsdFileCfg( - usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Blocks/green_block.usd", - scale=(1.0, 1.0, 1.0), - rigid_props=cube_properties, - ), - ), + "beaker": glassware.beaker(pos=[0.45, 0.25, 0.02], name="Beaker_1"), + "flask": glassware.flask(pos=[10.0, 10.0, 0.02], name="Flask_1", scale=(0.7, 0.7, 0.7)), # Out of focus position } self.scene.cube_1 = RigidObjectCollectionCfg(rigid_objects=cube_1_config_dict) self.scene.cube_2 = RigidObjectCollectionCfg(rigid_objects=cube_2_config_dict) - self.scene.cube_3 = RigidObjectCollectionCfg(rigid_objects=cube_3_config_dict) # Listens to the required transforms marker_cfg = FRAME_MARKER_CFG.copy() diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/franka_stack_events.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/franka_stack_events.py index 009a44b1b372..5dc97b3e05b2 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/franka_stack_events.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/franka_stack_events.py @@ -231,9 +231,13 @@ def randomize_rigid_objects_in_focus( object_states = torch.stack([out_focus_state] * asset.num_objects).to(device=env.device) pose_tensor = torch.tensor([pose_list[asset_idx]], device=env.device) positions = pose_tensor[:, 0:3] + env.scene.env_origins[cur_env, 0:3] - orientations = math_utils.quat_from_euler_xyz(pose_tensor[:, 3], pose_tensor[:, 4], pose_tensor[:, 5]) + + # Keep the current/default orientation instead of randomizing + # default_object_state shape is [num_envs, num_objects, 13] - get orientation (indices 3:7) + current_orientation = asset.data.default_object_state[cur_env, object_id, 3:7] + object_states[object_id, 0:3] = positions - object_states[object_id, 3:7] = orientations + object_states[object_id, 3:7] = current_orientation asset.write_object_state_to_sim( object_state=object_states, env_ids=torch.tensor([cur_env], device=env.device) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/observations.py index 2f65cd916ee9..d1e127d4a4c6 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/observations.py @@ -21,91 +21,76 @@ def cube_positions_in_world_frame( env: ManagerBasedRLEnv, cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), ) -> torch.Tensor: """The position of the cubes in the world frame.""" cube_1: RigidObject = env.scene[cube_1_cfg.name] cube_2: RigidObject = env.scene[cube_2_cfg.name] - cube_3: RigidObject = env.scene[cube_3_cfg.name] - return torch.cat((cube_1.data.root_pos_w, cube_2.data.root_pos_w, cube_3.data.root_pos_w), dim=1) + return torch.cat((cube_1.data.root_pos_w, cube_2.data.root_pos_w), dim=1) def instance_randomize_cube_positions_in_world_frame( env: ManagerBasedRLEnv, cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), ) -> torch.Tensor: """The position of the cubes in the world frame.""" if not hasattr(env, "rigid_objects_in_focus"): - return torch.full((env.num_envs, 9), fill_value=-1) + return torch.full((env.num_envs, 6), fill_value=-1) cube_1: RigidObjectCollection = env.scene[cube_1_cfg.name] cube_2: RigidObjectCollection = env.scene[cube_2_cfg.name] - cube_3: RigidObjectCollection = env.scene[cube_3_cfg.name] cube_1_pos_w = [] cube_2_pos_w = [] - cube_3_pos_w = [] for env_id in range(env.num_envs): cube_1_pos_w.append(cube_1.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][0], :3]) cube_2_pos_w.append(cube_2.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][1], :3]) - cube_3_pos_w.append(cube_3.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][2], :3]) cube_1_pos_w = torch.stack(cube_1_pos_w) cube_2_pos_w = torch.stack(cube_2_pos_w) - cube_3_pos_w = torch.stack(cube_3_pos_w) - return torch.cat((cube_1_pos_w, cube_2_pos_w, cube_3_pos_w), dim=1) + return torch.cat((cube_1_pos_w, cube_2_pos_w), dim=1) def cube_orientations_in_world_frame( env: ManagerBasedRLEnv, cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), ): """The orientation of the cubes in the world frame.""" cube_1: RigidObject = env.scene[cube_1_cfg.name] cube_2: RigidObject = env.scene[cube_2_cfg.name] - cube_3: RigidObject = env.scene[cube_3_cfg.name] - return torch.cat((cube_1.data.root_quat_w, cube_2.data.root_quat_w, cube_3.data.root_quat_w), dim=1) + return torch.cat((cube_1.data.root_quat_w, cube_2.data.root_quat_w), dim=1) def instance_randomize_cube_orientations_in_world_frame( env: ManagerBasedRLEnv, cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), ) -> torch.Tensor: """The orientation of the cubes in the world frame.""" if not hasattr(env, "rigid_objects_in_focus"): - return torch.full((env.num_envs, 9), fill_value=-1) + return torch.full((env.num_envs, 8), fill_value=-1) cube_1: RigidObjectCollection = env.scene[cube_1_cfg.name] cube_2: RigidObjectCollection = env.scene[cube_2_cfg.name] - cube_3: RigidObjectCollection = env.scene[cube_3_cfg.name] cube_1_quat_w = [] cube_2_quat_w = [] - cube_3_quat_w = [] for env_id in range(env.num_envs): cube_1_quat_w.append(cube_1.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][0], :4]) cube_2_quat_w.append(cube_2.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][1], :4]) - cube_3_quat_w.append(cube_3.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][2], :4]) cube_1_quat_w = torch.stack(cube_1_quat_w) cube_2_quat_w = torch.stack(cube_2_quat_w) - cube_3_quat_w = torch.stack(cube_3_quat_w) - return torch.cat((cube_1_quat_w, cube_2_quat_w, cube_3_quat_w), dim=1) + return torch.cat((cube_1_quat_w, cube_2_quat_w), dim=1) def object_obs( env: ManagerBasedRLEnv, cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), ): """ @@ -114,18 +99,12 @@ def object_obs( cube_1 quat, cube_2 pos, cube_2 quat, - cube_3 pos, - cube_3 quat, gripper to cube_1, gripper to cube_2, - gripper to cube_3, cube_1 to cube_2, - cube_2 to cube_3, - cube_1 to cube_3, """ cube_1: RigidObject = env.scene[cube_1_cfg.name] cube_2: RigidObject = env.scene[cube_2_cfg.name] - cube_3: RigidObject = env.scene[cube_3_cfg.name] ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] cube_1_pos_w = cube_1.data.root_pos_w @@ -134,17 +113,17 @@ def object_obs( cube_2_pos_w = cube_2.data.root_pos_w cube_2_quat_w = cube_2.data.root_quat_w - cube_3_pos_w = cube_3.data.root_pos_w - cube_3_quat_w = cube_3.data.root_quat_w - ee_pos_w = ee_frame.data.target_pos_w[:, 0, :] gripper_to_cube_1 = cube_1_pos_w - ee_pos_w gripper_to_cube_2 = cube_2_pos_w - ee_pos_w - gripper_to_cube_3 = cube_3_pos_w - ee_pos_w cube_1_to_2 = cube_1_pos_w - cube_2_pos_w - cube_2_to_3 = cube_2_pos_w - cube_3_pos_w - cube_1_to_3 = cube_1_pos_w - cube_3_pos_w + + # Debug print: distance between cube_1 and cube_2 + xy_dist = torch.linalg.vector_norm(cube_1_to_2[:, :2], dim=1) + h_dist = torch.abs(cube_1_to_2[:, 2]) + print(f"[object_obs] cube_1_to_2 xy_dist: {xy_dist[0].item():.4f}, h_dist: {h_dist[0].item():.4f}, " + f"z_diff: {cube_1_to_2[0, 2].item():.4f}", flush=True) return torch.cat( ( @@ -152,14 +131,9 @@ def object_obs( cube_1_quat_w, cube_2_pos_w - env.scene.env_origins, cube_2_quat_w, - cube_3_pos_w - env.scene.env_origins, - cube_3_quat_w, gripper_to_cube_1, gripper_to_cube_2, - gripper_to_cube_3, cube_1_to_2, - cube_2_to_3, - cube_1_to_3, ), dim=1, ) @@ -169,7 +143,6 @@ def instance_randomize_object_obs( env: ManagerBasedRLEnv, cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), ): """ @@ -178,51 +151,36 @@ def instance_randomize_object_obs( cube_1 quat, cube_2 pos, cube_2 quat, - cube_3 pos, - cube_3 quat, gripper to cube_1, gripper to cube_2, - gripper to cube_3, cube_1 to cube_2, - cube_2 to cube_3, - cube_1 to cube_3, """ if not hasattr(env, "rigid_objects_in_focus"): - return torch.full((env.num_envs, 9), fill_value=-1) + return torch.full((env.num_envs, 23), fill_value=-1) cube_1: RigidObjectCollection = env.scene[cube_1_cfg.name] cube_2: RigidObjectCollection = env.scene[cube_2_cfg.name] - cube_3: RigidObjectCollection = env.scene[cube_3_cfg.name] ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] cube_1_pos_w = [] cube_2_pos_w = [] - cube_3_pos_w = [] cube_1_quat_w = [] cube_2_quat_w = [] - cube_3_quat_w = [] for env_id in range(env.num_envs): cube_1_pos_w.append(cube_1.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][0], :3]) cube_2_pos_w.append(cube_2.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][1], :3]) - cube_3_pos_w.append(cube_3.data.object_pos_w[env_id, env.rigid_objects_in_focus[env_id][2], :3]) cube_1_quat_w.append(cube_1.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][0], :4]) cube_2_quat_w.append(cube_2.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][1], :4]) - cube_3_quat_w.append(cube_3.data.object_quat_w[env_id, env.rigid_objects_in_focus[env_id][2], :4]) cube_1_pos_w = torch.stack(cube_1_pos_w) cube_2_pos_w = torch.stack(cube_2_pos_w) - cube_3_pos_w = torch.stack(cube_3_pos_w) cube_1_quat_w = torch.stack(cube_1_quat_w) cube_2_quat_w = torch.stack(cube_2_quat_w) - cube_3_quat_w = torch.stack(cube_3_quat_w) ee_pos_w = ee_frame.data.target_pos_w[:, 0, :] gripper_to_cube_1 = cube_1_pos_w - ee_pos_w gripper_to_cube_2 = cube_2_pos_w - ee_pos_w - gripper_to_cube_3 = cube_3_pos_w - ee_pos_w cube_1_to_2 = cube_1_pos_w - cube_2_pos_w - cube_2_to_3 = cube_2_pos_w - cube_3_pos_w - cube_1_to_3 = cube_1_pos_w - cube_3_pos_w return torch.cat( ( @@ -230,14 +188,9 @@ def instance_randomize_object_obs( cube_1_quat_w, cube_2_pos_w - env.scene.env_origins, cube_2_quat_w, - cube_3_pos_w - env.scene.env_origins, - cube_3_quat_w, gripper_to_cube_1, gripper_to_cube_2, - gripper_to_cube_3, cube_1_to_2, - cube_2_to_3, - cube_1_to_3, ), dim=1, ) @@ -355,6 +308,11 @@ def object_stacked( height_dist = torch.linalg.vector_norm(pos_diff[:, 2:], dim=1) xy_dist = torch.linalg.vector_norm(pos_diff[:, :2], dim=1) + # Debug print: distance between upper and lower objects + print(f"[object_stacked] xy_dist: {xy_dist[0].item():.4f} (thresh: {xy_threshold}), " + f"h_dist: {height_dist[0].item():.4f} (expected: {height_diff}, thresh: {height_threshold}), " + f"z_diff: {pos_diff[0, 2].item():.4f}", flush=True) + stacked = torch.logical_and(xy_dist < xy_threshold, (height_dist - height_diff) < height_threshold) if hasattr(env.scene, "surface_grippers") and len(env.scene.surface_grippers) > 0: @@ -395,7 +353,6 @@ def cube_poses_in_base_frame( env: ManagerBasedRLEnv, cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), return_key: Literal["pos", "quat", None] = None, ) -> torch.Tensor: @@ -403,15 +360,12 @@ def cube_poses_in_base_frame( cube_1: RigidObject = env.scene[cube_1_cfg.name] cube_2: RigidObject = env.scene[cube_2_cfg.name] - cube_3: RigidObject = env.scene[cube_3_cfg.name] pos_cube_1_world = cube_1.data.root_pos_w pos_cube_2_world = cube_2.data.root_pos_w - pos_cube_3_world = cube_3.data.root_pos_w quat_cube_1_world = cube_1.data.root_quat_w quat_cube_2_world = cube_2.data.root_quat_w - quat_cube_3_world = cube_3.data.root_quat_w robot: Articulation = env.scene[robot_cfg.name] root_pos_w = robot.data.root_pos_w @@ -423,12 +377,9 @@ def cube_poses_in_base_frame( pos_cube_2_base, quat_cube_2_base = math_utils.subtract_frame_transforms( root_pos_w, root_quat_w, pos_cube_2_world, quat_cube_2_world ) - pos_cube_3_base, quat_cube_3_base = math_utils.subtract_frame_transforms( - root_pos_w, root_quat_w, pos_cube_3_world, quat_cube_3_world - ) - pos_cubes_base = torch.cat((pos_cube_1_base, pos_cube_2_base, pos_cube_3_base), dim=1) - quat_cubes_base = torch.cat((quat_cube_1_base, quat_cube_2_base, quat_cube_3_base), dim=1) + pos_cubes_base = torch.cat((pos_cube_1_base, pos_cube_2_base), dim=1) + quat_cubes_base = torch.cat((quat_cube_1_base, quat_cube_2_base), dim=1) if return_key == "pos": return pos_cubes_base @@ -442,7 +393,6 @@ def object_abs_obs_in_base_frame( env: ManagerBasedRLEnv, cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), ): @@ -452,14 +402,11 @@ def object_abs_obs_in_base_frame( cube_1 quat, cube_2 pos, cube_2 quat, - cube_3 pos, - cube_3 quat, gripper pos, gripper quat, """ cube_1: RigidObject = env.scene[cube_1_cfg.name] cube_2: RigidObject = env.scene[cube_2_cfg.name] - cube_3: RigidObject = env.scene[cube_3_cfg.name] ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] robot: Articulation = env.scene[robot_cfg.name] @@ -472,18 +419,12 @@ def object_abs_obs_in_base_frame( cube_2_pos_w = cube_2.data.root_pos_w cube_2_quat_w = cube_2.data.root_quat_w - cube_3_pos_w = cube_3.data.root_pos_w - cube_3_quat_w = cube_3.data.root_quat_w - pos_cube_1_base, quat_cube_1_base = math_utils.subtract_frame_transforms( root_pos_w, root_quat_w, cube_1_pos_w, cube_1_quat_w ) pos_cube_2_base, quat_cube_2_base = math_utils.subtract_frame_transforms( root_pos_w, root_quat_w, cube_2_pos_w, cube_2_quat_w ) - pos_cube_3_base, quat_cube_3_base = math_utils.subtract_frame_transforms( - root_pos_w, root_quat_w, cube_3_pos_w, cube_3_quat_w - ) ee_pos_w = ee_frame.data.target_pos_w[:, 0, :] ee_quat_w = ee_frame.data.target_quat_w[:, 0, :] @@ -495,8 +436,6 @@ def object_abs_obs_in_base_frame( quat_cube_1_base, pos_cube_2_base, quat_cube_2_base, - pos_cube_3_base, - quat_cube_3_base, ee_pos_base, ee_quat_base, ), diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/terminations.py index e306f9eb4a0a..f988a1f14dfe 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/mdp/terminations.py @@ -26,35 +26,35 @@ def cubes_stacked( robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), cube_1_cfg: SceneEntityCfg = SceneEntityCfg("cube_1"), cube_2_cfg: SceneEntityCfg = SceneEntityCfg("cube_2"), - cube_3_cfg: SceneEntityCfg = SceneEntityCfg("cube_3"), xy_threshold: float = 0.04, height_threshold: float = 0.005, height_diff: float = 0.0468, atol=0.0001, rtol=0.0001, ): + """Check if cube_2 is stacked on cube_1.""" robot: Articulation = env.scene[robot_cfg.name] cube_1: RigidObject = env.scene[cube_1_cfg.name] cube_2: RigidObject = env.scene[cube_2_cfg.name] - cube_3: RigidObject = env.scene[cube_3_cfg.name] + # Position difference: cube_1 (lower) - cube_2 (upper) pos_diff_c12 = cube_1.data.root_pos_w - cube_2.data.root_pos_w - pos_diff_c23 = cube_2.data.root_pos_w - cube_3.data.root_pos_w # Compute cube position difference in x-y plane xy_dist_c12 = torch.norm(pos_diff_c12[:, :2], dim=1) - xy_dist_c23 = torch.norm(pos_diff_c23[:, :2], dim=1) # Compute cube height difference h_dist_c12 = torch.norm(pos_diff_c12[:, 2:], dim=1) - h_dist_c23 = torch.norm(pos_diff_c23[:, 2:], dim=1) - # Check cube positions - stacked = torch.logical_and(xy_dist_c12 < xy_threshold, xy_dist_c23 < xy_threshold) + # Debug print: distance between cube_2 and cube_1 + print(f"[cubes_stacked] xy_dist: {xy_dist_c12[0].item():.4f} (thresh: {xy_threshold}), " + f"h_dist: {h_dist_c12[0].item():.4f} (expected: {height_diff}, thresh: {height_threshold}), " + f"z_diff: {pos_diff_c12[0, 2].item():.4f}") + + # Check cube positions: cube_2 should be on top of cube_1 + stacked = xy_dist_c12 < xy_threshold stacked = torch.logical_and(h_dist_c12 - height_diff < height_threshold, stacked) - stacked = torch.logical_and(pos_diff_c12[:, 2] < 0.0, stacked) - stacked = torch.logical_and(h_dist_c23 - height_diff < height_threshold, stacked) - stacked = torch.logical_and(pos_diff_c23[:, 2] < 0.0, stacked) + stacked = torch.logical_and(pos_diff_c12[:, 2] < 0.0, stacked) # cube_1.z < cube_2.z means cube_2 is on top # Check gripper positions if hasattr(env.scene, "surface_grippers") and len(env.scene.surface_grippers) > 0: diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_env_cfg.py index 3af83de3a19a..8a6e27071031 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack_glassware/stack_env_cfg.py @@ -104,7 +104,7 @@ def __post_init__(self): class SubtaskCfg(ObsGroup): """Observations for subtask group.""" - grasp_1 = ObsTerm( + grasp = ObsTerm( func=mdp.object_grasped, params={ "robot_cfg": SceneEntityCfg("robot"), @@ -112,7 +112,7 @@ class SubtaskCfg(ObsGroup): "object_cfg": SceneEntityCfg("cube_2"), }, ) - stack_1 = ObsTerm( + stacked = ObsTerm( func=mdp.object_stacked, params={ "robot_cfg": SceneEntityCfg("robot"), @@ -120,14 +120,6 @@ class SubtaskCfg(ObsGroup): "lower_object_cfg": SceneEntityCfg("cube_1"), }, ) - grasp_2 = ObsTerm( - func=mdp.object_grasped, - params={ - "robot_cfg": SceneEntityCfg("robot"), - "ee_frame_cfg": SceneEntityCfg("ee_frame"), - "object_cfg": SceneEntityCfg("cube_3"), - }, - ) def __post_init__(self): self.enable_corruption = False @@ -153,12 +145,10 @@ class TerminationsCfg: func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("cube_2")} ) - cube_3_dropping = DoneTerm( - func=mdp.root_height_below_minimum, params={"minimum_height": -0.05, "asset_cfg": SceneEntityCfg("cube_3")} + success = DoneTerm( + func=mdp.cubes_stacked ) - success = DoneTerm(func=mdp.cubes_stacked) - @configclass class StackEnvCfg(ManagerBasedRLEnvCfg): From 750b20f7fd627be314803ad1d79e41f73db660a2 Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Wed, 25 Feb 2026 13:32:29 +0000 Subject: [PATCH 12/15] minor changes --- docker/.env.base | 3 +- docker/Dockerfile.base | 60 +- docs/find_best_checkpoints.py | 2 +- docs/run_experiments.sh | 57 +- .../bc_med_data_/20260122101438/config.json | 236 + .../bc_med_data_/20260122101438/config.json | 236 + .../bc_med_data_/20260122101438/config.json | 236 + .../bc_med_data_/20260122101438/config.json | 236 + .../bc_med_data_/20260122101438/config.json | 236 + get-pip.py | 27368 ++++++++++++++++ pyproject copy.toml | 100 + pyproject.toml | 164 +- regenerate_vial_collision.py | 85 + ros2/src | 1 + .../robomimic/backup_controller.py | 5 +- .../robomimic/backup_controller_handler.py | 62 +- .../robomimic/backup_controller_insert.py | 423 + .../robomimic/backup_controller_place.py | 456 + .../robomimic/evaluation.py | 6 +- scripts/imitation_learning/robomimic/play.py | 2 + .../robomimic/play_ensemble.py | 4 +- .../robomimic/play_ensemble_v05.py | 110 +- .../robomimic/play_with_backup.py | 4 +- .../robomimic/train_ensemble.py | 6 +- scripts/tools/regen_usd_file.py | 85 + scripts/tutorials/00_sim/create_empty.py | 2 +- source/chills | 1 + source/isaaclab/isaaclab/__init__.py | 2 +- source/isaaclab/isaaclab/envs/mdp/events.py | 1 + .../isaaclab/safety/switchingLogic.py | 17 +- source/isaaclab/pyproject.toml | 2 +- source/isaaclab/setup.py | 14 +- .../isaaclab_mimic/datagen/generation.py | 23 +- .../isaaclab_mimic/envs/__init__.py | 12 + .../isaaclab_mimic/envs/cube_mimic_env.py | 4 +- .../isaaclab_mimic/envs/cube_mimic_env_cfg.py | 7 +- .../isaaclab_mimic/envs/cube_mimic_vm_env.py | 189 + .../envs/cube_mimic_vm_env_cfg.py | 162 + .../cube_lift/config/franka/__init__.py | 47 + .../agents/robomimic/bc_rnn_low_dim.json | 8 +- .../franka/dev_ik_rel_env_insert_vismot.py | 218 + .../config/franka/dev_ik_rel_env_obs.py | 12 +- .../config/franka/dev_ik_rel_env_place.py | 19 +- .../franka/dev_ik_rel_env_place_vismot.py | 206 + .../config/franka/dev_ik_rel_vial_insert.py | 54 +- .../manipulation/cube_lift/lift_env_cfg.py | 43 +- .../cube_lift/mdp/franka_stack_events.py | 314 + .../cube_lift/mdp/observations.py | 10 +- .../cube_lift/mdp/terminations.py | 10 +- 49 files changed, 31281 insertions(+), 279 deletions(-) create mode 100644 docs/vision/model0/bc_med_data_/20260122101438/config.json create mode 100644 docs/vision/model1/bc_med_data_/20260122101438/config.json create mode 100644 docs/vision/model2/bc_med_data_/20260122101438/config.json create mode 100644 docs/vision/model3/bc_med_data_/20260122101438/config.json create mode 100644 docs/vision/model4/bc_med_data_/20260122101438/config.json create mode 100644 get-pip.py create mode 100644 pyproject copy.toml create mode 100644 regenerate_vial_collision.py create mode 160000 ros2/src create mode 100644 scripts/imitation_learning/robomimic/backup_controller_insert.py create mode 100644 scripts/imitation_learning/robomimic/backup_controller_place.py create mode 100644 scripts/tools/regen_usd_file.py create mode 160000 source/chills create mode 100755 source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_vm_env.py create mode 100644 source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_vm_env_cfg.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_insert_vismot.py create mode 100755 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place_vismot.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/franka_stack_events.py diff --git a/docker/.env.base b/docker/.env.base index eceaf13699ad..a32eb7ef3c26 100644 --- a/docker/.env.base +++ b/docker/.env.base @@ -7,7 +7,7 @@ ACCEPT_EULA=Y # NVIDIA Isaac Sim base image ISAACSIM_BASE_IMAGE=nvcr.io/nvidia/isaac-sim # NVIDIA Isaac Sim version to use (e.g. 5.0.0) -ISAACSIM_VERSION=5.1.0 +ISAACSIM_VERSION=5.0.0 # Derived from the default path in the NVIDIA provided Isaac Sim container DOCKER_ISAACSIM_ROOT_PATH=/isaac-sim # The Isaac Lab path in the container @@ -17,3 +17,4 @@ DOCKER_USER_HOME=/root # Docker image and container name suffix (default "", set by the container_interface.py script) # Example: "-custom" DOCKER_NAME_SUFFIX="" + \ No newline at end of file diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index b87557035f3f..ccc6ab8ee10a 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -2,23 +2,23 @@ # All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause - + # Nvidia Dockerfiles: https://github.com/NVIDIA-Omniverse/IsaacSim-dockerfiles # Please check above link for license information. - + # Base image ARG ISAACSIM_BASE_IMAGE_ARG ARG ISAACSIM_VERSION_ARG FROM ${ISAACSIM_BASE_IMAGE_ARG}:${ISAACSIM_VERSION_ARG} AS base ENV ISAACSIM_VERSION=${ISAACSIM_VERSION_ARG} - + # Set default RUN shell to bash SHELL ["/bin/bash", "-c"] - + # Adds labels to the Dockerfile LABEL version="2.1.1" LABEL description="Dockerfile for building and running the Isaac Lab framework inside Isaac Sim container image." - + # Arguments # Path to Isaac Sim root folder ARG ISAACSIM_ROOT_PATH_ARG @@ -29,13 +29,13 @@ ENV ISAACLAB_PATH=${ISAACLAB_PATH_ARG} # Home dir of docker user, typically '/root' ARG DOCKER_USER_HOME_ARG ENV DOCKER_USER_HOME=${DOCKER_USER_HOME_ARG} - + # Set environment variables ENV LANG=C.UTF-8 ENV DEBIAN_FRONTEND=noninteractive - + USER root - + # Install dependencies and remove cache RUN --mount=type=cache,target=/var/cache/apt \ apt-get update && apt-get install -y --no-install-recommends \ @@ -47,25 +47,25 @@ RUN --mount=type=cache,target=/var/cache/apt \ wget && \ apt -y autoremove && apt clean autoclean && \ rm -rf /var/lib/apt/lists/* - + # Copy the Isaac Lab directory (files to exclude are defined in .dockerignore) COPY ../ ${ISAACLAB_PATH} - + # Ensure isaaclab.sh has execute permissions RUN chmod +x ${ISAACLAB_PATH}/isaaclab.sh - + # Set up a symbolic link between the installed Isaac Sim root folder and _isaac_sim in the Isaac Lab directory RUN ln -sf ${ISAACSIM_ROOT_PATH} ${ISAACLAB_PATH}/_isaac_sim - + # Install toml dependency RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install toml - + # Install apt dependencies for extensions that declare them in their extension.toml RUN --mount=type=cache,target=/var/cache/apt \ ${ISAACLAB_PATH}/isaaclab.sh -p ${ISAACLAB_PATH}/tools/install_deps.py apt ${ISAACLAB_PATH}/source && \ apt -y autoremove && apt clean autoclean && \ rm -rf /var/lib/apt/lists/* - + # for singularity usage, have to create the directories that will binded RUN mkdir -p ${ISAACSIM_ROOT_PATH}/kit/cache && \ mkdir -p ${DOCKER_USER_HOME}/.cache/ov && \ @@ -75,7 +75,7 @@ RUN mkdir -p ${ISAACSIM_ROOT_PATH}/kit/cache && \ mkdir -p ${DOCKER_USER_HOME}/.nvidia-omniverse/logs && \ mkdir -p ${DOCKER_USER_HOME}/.local/share/ov/data && \ mkdir -p ${DOCKER_USER_HOME}/Documents - + # for singularity usage, create NVIDIA binary placeholders # NOTE: These are only needed for Singularity, not Docker # For Docker, comment these out as they override the real nvidia binaries @@ -87,12 +87,12 @@ RUN mkdir -p ${ISAACSIM_ROOT_PATH}/kit/cache && \ # touch /etc/localtime && \ # mkdir -p /var/run/nvidia-persistenced && \ # touch /var/run/nvidia-persistenced/socket - + # installing Isaac Lab dependencies # use pip caching to avoid reinstalling large packages RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ ${ISAACLAB_PATH}/isaaclab.sh --install - + # HACK: Remove install of quadprog dependency RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip uninstall -y quadprog RUN set -euo pipefail && \ @@ -116,8 +116,8 @@ RUN set -euo pipefail && \ apt-get update && \ apt-get install -y --no-install-recommends cuda-toolkit-12-8 && \ apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* - - + + ENV CUDA_HOME=/usr/local/cuda-12.8 ENV PATH=${CUDA_HOME}/bin:${PATH} ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH} @@ -135,19 +135,19 @@ RUN echo "export ISAACLAB_PATH=${ISAACLAB_PATH}" >> ${HOME}/.bashrc && \ echo "export TZ=$(date +%Z)" >> ${HOME}/.bashrc && \ echo "shopt -s histappend" >> /root/.bashrc && \ echo "PROMPT_COMMAND='history -a'" >> /root/.bashrc - + # use pip caching to avoid reinstalling large packages #RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ # pip install --upgrade --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128 # install TensorFlow and nightly PyTorch RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ - ${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install --upgrade --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128 - + ${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install --upgrade --pre torch torchvision torchaudio + RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ - ${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install tensorflow scikit-learn - -RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ -${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install protobuf==3.20.2 + ${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install tensorflow scikit-learn protobuf + +# RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ +# ${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip install protobuf # Detect Ubuntu version and install CUDA 12.8 via NVIDIA network repo (cuda-keyring) RUN set -euo pipefail && \ . /etc/os-release && \ @@ -170,15 +170,15 @@ RUN set -euo pipefail && \ apt-get update && \ apt-get install -y --no-install-recommends cuda-toolkit-12-8 && \ apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* - - + + ENV CUDA_HOME=/usr/local/cuda-12.8 ENV PATH=${CUDA_HOME}/bin:${PATH} ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH} ENV TORCH_CUDA_ARCH_LIST=8.0+PTX - + # Copy the Isaac Lab directory (files to exclude are defined in .dockerignore) COPY ../ ${ISAACLAB_PATH} # make working directory as the Isaac Lab directory # this is the default directory when the container is run -WORKDIR ${ISAACLAB_PATH} +WORKDIR ${ISAACLAB_PATH} \ No newline at end of file diff --git a/docs/find_best_checkpoints.py b/docs/find_best_checkpoints.py index bdda475fba0a..13b927f7e306 100644 --- a/docs/find_best_checkpoints.py +++ b/docs/find_best_checkpoints.py @@ -72,7 +72,7 @@ def main(): """Main function to process all model directories.""" # Define paths - handle both host and Docker container paths script_dir = Path(__file__).parent.resolve() - base_dir = script_dir / "place/Dev-IK-Rel-Place-v0" + base_dir = script_dir / "insert/Dev-IK-Rel-Insert-v0" output_dir = base_dir / "best_models" # Create output directory (including parent directories if needed) diff --git a/docs/run_experiments.sh b/docs/run_experiments.sh index 9f7da360e12a..9a526d7a878f 100644 --- a/docs/run_experiments.sh +++ b/docs/run_experiments.sh @@ -2,65 +2,52 @@ ## script to run experiments in the background -task="Dev-IK-Rel-Place-v0" -horizon=5000 +task="Dev-IK-Rel-v1" +horizon=500 num_rollouts=100 run_file="scripts/imitation_learning/robomimic/play_ensemble_v05.py" -ensemble_size=15 +exp_type="lift_none" ##### this now runs the experiments -## ensemble 15 -seed=101 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# ## ensemble 15 +# ensemble_size=15 +# seed=101 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -seed=107 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# seed=107 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -seed=115 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# seed=115 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -## ensemble 10 +## ensemble 10 ensemble_size=10 seed=101 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless seed=107 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless seed=115 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -## ensemble 5 +## ensemble 5 ensemble_size=5 seed=101 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless - -seed=107 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless - -seed=115 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless - -## ensemble 1 -ensemble_size=1 -seed=101 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless seed=107 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless seed=115 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_highdem" +exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless diff --git a/docs/vision/model0/bc_med_data_/20260122101438/config.json b/docs/vision/model0/bc_med_data_/20260122101438/config.json new file mode 100644 index 000000000000..e25d634e013c --- /dev/null +++ b/docs/vision/model0/bc_med_data_/20260122101438/config.json @@ -0,0 +1,236 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick_place_visuomotor" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-place-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + }, + "env_meta_update_dict": {}, + "ckpt_path": null + }, + "train": { + "data": [ + { + "path": "docs/place/glassware_stack_demos_split_normalized.hdf5" + } + ], + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-Place-vision-v0/model4/", + "normalize_weights_by_ds_size": false, + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 16, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "action_keys": [ + "actions" + ], + "action_config": { + "actions": { + "normalization": null + } + }, + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 1000, + "seed": 101, + "max_grad_norm": null + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 100, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true, + "pred_future_acs": false + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/vision/model1/bc_med_data_/20260122101438/config.json b/docs/vision/model1/bc_med_data_/20260122101438/config.json new file mode 100644 index 000000000000..e25d634e013c --- /dev/null +++ b/docs/vision/model1/bc_med_data_/20260122101438/config.json @@ -0,0 +1,236 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick_place_visuomotor" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-place-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + }, + "env_meta_update_dict": {}, + "ckpt_path": null + }, + "train": { + "data": [ + { + "path": "docs/place/glassware_stack_demos_split_normalized.hdf5" + } + ], + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-Place-vision-v0/model4/", + "normalize_weights_by_ds_size": false, + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 16, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "action_keys": [ + "actions" + ], + "action_config": { + "actions": { + "normalization": null + } + }, + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 1000, + "seed": 101, + "max_grad_norm": null + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 100, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true, + "pred_future_acs": false + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/vision/model2/bc_med_data_/20260122101438/config.json b/docs/vision/model2/bc_med_data_/20260122101438/config.json new file mode 100644 index 000000000000..e25d634e013c --- /dev/null +++ b/docs/vision/model2/bc_med_data_/20260122101438/config.json @@ -0,0 +1,236 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick_place_visuomotor" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-place-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + }, + "env_meta_update_dict": {}, + "ckpt_path": null + }, + "train": { + "data": [ + { + "path": "docs/place/glassware_stack_demos_split_normalized.hdf5" + } + ], + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-Place-vision-v0/model4/", + "normalize_weights_by_ds_size": false, + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 16, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "action_keys": [ + "actions" + ], + "action_config": { + "actions": { + "normalization": null + } + }, + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 1000, + "seed": 101, + "max_grad_norm": null + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 100, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true, + "pred_future_acs": false + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/vision/model3/bc_med_data_/20260122101438/config.json b/docs/vision/model3/bc_med_data_/20260122101438/config.json new file mode 100644 index 000000000000..e25d634e013c --- /dev/null +++ b/docs/vision/model3/bc_med_data_/20260122101438/config.json @@ -0,0 +1,236 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick_place_visuomotor" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-place-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + }, + "env_meta_update_dict": {}, + "ckpt_path": null + }, + "train": { + "data": [ + { + "path": "docs/place/glassware_stack_demos_split_normalized.hdf5" + } + ], + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-Place-vision-v0/model4/", + "normalize_weights_by_ds_size": false, + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 16, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "action_keys": [ + "actions" + ], + "action_config": { + "actions": { + "normalization": null + } + }, + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 1000, + "seed": 101, + "max_grad_norm": null + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 100, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true, + "pred_future_acs": false + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/docs/vision/model4/bc_med_data_/20260122101438/config.json b/docs/vision/model4/bc_med_data_/20260122101438/config.json new file mode 100644 index 000000000000..e25d634e013c --- /dev/null +++ b/docs/vision/model4/bc_med_data_/20260122101438/config.json @@ -0,0 +1,236 @@ +{ + "algo_name": "bc", + "experiment": { + "name": "bc_med_data_", + "validate": true, + "logging": { + "terminal_output_to_txt": true, + "log_tb": true, + "log_wandb": true, + "wandb_proj_name": "pick_place_visuomotor" + }, + "save": { + "enabled": true, + "every_n_seconds": null, + "every_n_epochs": null, + "epochs": [], + "on_best_validation": true, + "on_best_rollout_return": true, + "on_best_rollout_success_rate": true + }, + "epoch_every_n_steps": 100, + "validation_epoch_every_n_steps": 10, + "env": "Dev-IK-Rel-place-v0", + "additional_envs": null, + "render": false, + "render_video": true, + "keep_all_videos": false, + "video_skip": 5, + "rollout": { + "enabled": false, + "n": 50, + "horizon": 400, + "rate": 50, + "warmstart": 0, + "terminate_on_success": true + }, + "env_meta_update_dict": {}, + "ckpt_path": null + }, + "train": { + "data": [ + { + "path": "docs/place/glassware_stack_demos_split_normalized.hdf5" + } + ], + "output_dir": "/workspace/isaaclab/robomimic/Dev-IK-Rel-Place-vision-v0/model4/", + "normalize_weights_by_ds_size": false, + "num_data_workers": 4, + "hdf5_cache_mode": "low_dim", + "hdf5_use_swmr": true, + "hdf5_load_next_obs": false, + "hdf5_normalize_obs": false, + "hdf5_filter_key": "train", + "hdf5_validation_filter_key": "valid", + "seq_length": 16, + "pad_seq_length": true, + "frame_stack": 1, + "pad_frame_stack": true, + "dataset_keys": [ + "actions", + "rewards", + "dones" + ], + "action_keys": [ + "actions" + ], + "action_config": { + "actions": { + "normalization": null + } + }, + "goal_mode": null, + "cuda": true, + "batch_size": 100, + "num_epochs": 1000, + "seed": 101, + "max_grad_norm": null + }, + "algo": { + "optim_params": { + "policy": { + "optimizer_type": "adam", + "learning_rate": { + "initial": 0.0001, + "decay_factor": 0.01, + "epoch_schedule": [], + "scheduler_type": "multistep" + }, + "regularization": { + "L2": 0.0 + } + } + }, + "loss": { + "l2_weight": 1.0, + "l1_weight": 0.0, + "cos_weight": 0.0 + }, + "actor_layer_dims": [ + 1024, + 1024 + ], + "gaussian": { + "enabled": false, + "fixed_std": false, + "init_std": 0.1, + "min_std": 0.01, + "std_activation": "softplus", + "low_noise_eval": true + }, + "gmm": { + "enabled": true, + "num_modes": 10, + "min_std": 0.0001, + "std_activation": "softplus", + "low_noise_eval": true + }, + "vae": { + "enabled": false, + "latent_dim": 14, + "latent_clip": null, + "kl_weight": 1.0, + "decoder": { + "is_conditioned": true, + "reconstruction_sum_across_elements": false + }, + "prior": { + "learn": false, + "is_conditioned": false, + "use_gmm": false, + "gmm_num_modes": 10, + "gmm_learn_weights": false, + "use_categorical": false, + "categorical_dim": 10, + "categorical_gumbel_softmax_hard": false, + "categorical_init_temp": 1.0, + "categorical_temp_anneal_step": 0.001, + "categorical_min_temp": 0.3 + }, + "encoder_layer_dims": [ + 300, + 400 + ], + "decoder_layer_dims": [ + 300, + 400 + ], + "prior_layer_dims": [ + 300, + 400 + ] + }, + "rnn": { + "enabled": true, + "horizon": 100, + "hidden_dim": 400, + "rnn_type": "LSTM", + "num_layers": 2, + "open_loop": false, + "kwargs": { + "bidirectional": false + } + }, + "transformer": { + "enabled": false, + "context_length": 10, + "embed_dim": 512, + "num_layers": 6, + "num_heads": 8, + "emb_dropout": 0.1, + "attn_dropout": 0.1, + "block_output_dropout": 0.1, + "sinusoidal_embedding": false, + "activation": "gelu", + "supervise_all_steps": false, + "nn_parameter_for_timesteps": true, + "pred_future_acs": false + } + }, + "observation": { + "modalities": { + "obs": { + "low_dim": [ + "eef_pos", + "eef_quat", + "gripper_pos", + "object_position", + "target_object_position", + "joint_pos", + "joint_vel", + "actions" + ], + "rgb": [], + "depth": [], + "scan": [] + }, + "goal": { + "low_dim": [], + "rgb": [], + "depth": [], + "scan": [] + } + }, + "encoder": { + "low_dim": { + "core_class": null, + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "rgb": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "depth": { + "core_class": "VisualCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + }, + "scan": { + "core_class": "ScanCore", + "core_kwargs": {}, + "obs_randomizer_class": null, + "obs_randomizer_kwargs": {} + } + } + }, + "meta": { + "hp_base_config_file": null, + "hp_keys": [], + "hp_values": [] + } +} \ No newline at end of file diff --git a/get-pip.py b/get-pip.py new file mode 100644 index 000000000000..22f29f881487 --- /dev/null +++ b/get-pip.py @@ -0,0 +1,27368 @@ +#!/usr/bin/env python +# +# Hi There! +# +# You may be wondering what this giant blob of binary data here is, you might +# even be worried that we're up to something nefarious (good for you for being +# paranoid!). This is a base85 encoding of a zip file, this zip file contains +# an entire copy of pip (version 25.3). +# +# Pip is a thing that installs packages, pip itself is a package that someone +# might want to install, especially if they're looking to run this get-pip.py +# script. Pip has a lot of code to deal with the security of installing +# packages, various edge cases on various platforms, and other such sort of +# "tribal knowledge" that has been encoded in its code base. Because of this +# we basically include an entire copy of pip inside this blob. We do this +# because the alternatives are attempt to implement a "minipip" that probably +# doesn't do things correctly and has weird edge cases, or compress pip itself +# down into a single file. +# +# If you're wondering how this is created, it is generated using +# `scripts/generate.py` in https://github.com/pypa/get-pip. + +import sys + +this_python = sys.version_info[:2] +min_version = (3, 9) +if this_python < min_version: + message_parts = [ + "This script does not work on Python {}.{}.".format(*this_python), + "The minimum supported Python version is {}.{}.".format(*min_version), + "Please use https://bootstrap.pypa.io/pip/{}.{}/get-pip.py instead.".format(*this_python), + ] + print("ERROR: " + " ".join(message_parts)) + sys.exit(1) + + +import os.path +import pkgutil +import shutil +import tempfile +import argparse +import importlib +from base64 import b85decode + + +def include_setuptools(args): + """ + Install setuptools only if absent, not excluded and when using Python <3.12. + """ + cli = not args.no_setuptools + env = not os.environ.get("PIP_NO_SETUPTOOLS") + absent = not importlib.util.find_spec("setuptools") + python_lt_3_12 = this_python < (3, 12) + return cli and env and absent and python_lt_3_12 + + +def include_wheel(args): + """ + Install wheel only if absent, not excluded and when using Python <3.12. + """ + cli = not args.no_wheel + env = not os.environ.get("PIP_NO_WHEEL") + absent = not importlib.util.find_spec("wheel") + python_lt_3_12 = this_python < (3, 12) + return cli and env and absent and python_lt_3_12 + + +def determine_pip_install_arguments(): + pre_parser = argparse.ArgumentParser() + pre_parser.add_argument("--no-setuptools", action="store_true") + pre_parser.add_argument("--no-wheel", action="store_true") + pre, args = pre_parser.parse_known_args() + + args.append("pip") + + if include_setuptools(pre): + args.append("setuptools") + + if include_wheel(pre): + args.append("wheel") + + return ["install", "--upgrade", "--force-reinstall"] + args + + +def monkeypatch_for_cert(tmpdir): + """Patches `pip install` to provide default certificate with the lowest priority. + + This ensures that the bundled certificates are used unless the user specifies a + custom cert via any of pip's option passing mechanisms (config, env-var, CLI). + + A monkeypatch is the easiest way to achieve this, without messing too much with + the rest of pip's internals. + """ + from pip._internal.commands.install import InstallCommand + + # We want to be using the internal certificates. + cert_path = os.path.join(tmpdir, "cacert.pem") + with open(cert_path, "wb") as cert: + cert.write(pkgutil.get_data("pip._vendor.certifi", "cacert.pem")) + + install_parse_args = InstallCommand.parse_args + + def cert_parse_args(self, args): + if not self.parser.get_default_values().cert: + # There are no user provided cert -- force use of bundled cert + self.parser.defaults["cert"] = cert_path # calculated above + return install_parse_args(self, args) + + InstallCommand.parse_args = cert_parse_args + + +def bootstrap(tmpdir): + monkeypatch_for_cert(tmpdir) + + # Execute the included pip and use it to install the latest pip and + # any user-requested packages from PyPI. + from pip._internal.cli.main import main as pip_entry_point + args = determine_pip_install_arguments() + sys.exit(pip_entry_point(args)) + + +def main(): + tmpdir = None + try: + # Create a temporary working directory + tmpdir = tempfile.mkdtemp() + + # Unpack the zipfile into the temporary directory + pip_zip = os.path.join(tmpdir, "pip.zip") + with open(pip_zip, "wb") as fp: + fp.write(b85decode(DATA.replace(b"\n", b""))) + + # Add the zipfile to sys.path so that we can import it + sys.path.insert(0, pip_zip) + + # Run the bootstrap + bootstrap(tmpdir=tmpdir) + finally: + # Clean up our temporary working directory + if tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +DATA = b""" +P)h>@6aWAK2ms3fSz9=Nlw0@!003bD000jF003}la4%n9X>MtBUtcb8c|DL%OT<77#qaYeLNB_YQ}7R +JLBWgQMLc*D8D`sbJJ4o^By}nH;Y}-R7|8JQc>H)h=LtgSXPp^CfHalN3Xv#l)Rak_3*j4C>~Hr+sIG +4Pb>*Dvu!kuoI*)vi2F4`%Dav2)18n<}T4!jWSs$bTq|)*=0iTP-{H3s6e~1QY-O00;of09jja_pjHy0RRA2 +0{{RI0001RX>c!JUu|J&ZeL$6aCu!)OK;mS48HqU5b43r;JP^vOMxACEp{6QLy+m1h%E`C9MAjpBNe- +8r;{H19{ebpf{zJ27j)n8%0=-6Z#elILRo@w9oRWWbO{z8ujDS!QAC@3T%nJCf;1rX6ghzu#Z}R@K&*?Hgj1WFD91+adaM4G`4Xs@*hA^t@nbDYdL)-aOjsW~3}QVVby(8=@7U$ +Fzj5Y{w!2hUUH`?e9j7WDA;>-1aos>7j{2$~BfyL8p@__Y98dsP#Bs7^lWF +=e_gr;(4^?am?Cp93+7b-!?~nb}-$cPSR1zckA*zNp!)$;YjlZrfn&RWNM}=QA7*cb8A{(9@{5!vBfq +rEMoeu5FvJZngI@N#4#(2v$WnMGCAVD?b9t8W^qDfcFBe5ZZF%dPAPaq#>ikclG~yPvCg`JUGb_W2#PdCXxx}7!|T*xc9qdnTILbO-nAJaF2 +~0snMFDU<%E01X4*yW9@|}F2;vY~;0|XQR000O8%K%whB^=tD)dBzjss#W56#xJLaA|NaUte%(a4 +m9mZf<3AUtcb8d3{vDPTN2bz56Q$bEqvD7eOzLnyL~CDi@L_;ZRYu+Sp^V)ZR6_YZ?pj@13#Z1R`1=l +J)M)n>TOXIt;_f2D8Q^;6`S?Y{9RUgUr+|m;!25C-6tno(2iIDhjlyJ)nM4*651XX%H+qrBEdT{cBla +4$^`0^qPP-6zv*|ge-jzUzxn2=uGMl9#)iA)y8^Cdr~rxdixH}OOJhxFbsp>7(O2Tg09*VTBnRAqE#) +uTB%a`7P2*FzrkVV`K)SOhdyilnqJR#!6l}Q6a+(^)-m{nsTFZ3tf`=GYik||DD|c)gW1pJ_vy8mPk! +87%_j>OLv)_N=Qs$09E*XCaNb7Sbvyz%2H(~=0(GyA#Q^BB=o_mcOvCiSC>?bfF%-ta6OhP5HUX=GiK +PR!(uKJlo!!9~IAAmCk)?77i`J23la2CGx64oXMzMaXkQ<~~8EU?%I}z$$rRNujEIu~M()ri%^Gi%ri +C!gNA@cLO=l6KV$(xV^&hZYbU&TCtOIChO4g;gfcAY_>ak~kgLxGa?L$cMXVJ{&`q`lnqv$j}Cr3vW0 +iSMRu8%^e>;b`+HM=<$xdKPpu@6SuMN-LR>$cFaIP$0f`iClb~O`=>COC +NvJms>bV(-KMn=QG5PXY-h9vs;@fOIZ_lmTi^Fg`mulO!YZVO^KOIvSWtj)HD-~+vPht4%90 +Btz&yv-M$^(udyl?*`G;BgAr}tWa5RRHyc3Sz7-4H^#tC)@T$~!*>z3|0?b+NOYH~Nw+WUjLL%ySwnL +u=yutnX)PsolsJX_Jx&=d9p7_`6i5S +Mvz$qHBvD4Gc2vqMK2J#u@ySRoi8HJ74pBUZpQaDYr)B{xbde@6aWAK2ms3fSz8Tl@oYE&00931000>P003}la4%nJZggdGZ +eeUMUtei%X>?y-E^v8uQNc>YKn%UlSA_Ml1)W|5bwQ7w#FICXGTWwYU^+7-sY}6+H?6MX!CdkPkC&I1 +p7R7v)6Y6HHVx2JGAo3XvIeD`#JPUu6e_-52zR!@h!P7KI~18)C%HP@fr +1dD$kQ8NRuGKz%ZZysu2=G*Ual7)rq;5cIqz_b_FXoN_lu6z|qu{_j%fT!+RBl=guKIY1=QS5bb04|v +WA;eKlsTs@d!Jvgx1?RGCC*+Bw@QIOxwu-SziJ7_J091)~tDk`9(d78okVj;x!LdG5$Q)?DBIa2R7@M +sdD>u3!!MCee1<#q{z2%~C|LtPJ~<9zgOp6arcP+QP7iOeYV&Gp@_KO5Zof3NVEl$Vli`umm>uNm@}6 +-N7T`WbHNRPGZ{O9KQH000080LuVbTZC7+>nRWb0C_h602%-Q0B~t=FJEbHbY*gGVQepAb!lv5UuAA~ +E^v9>8(nkUw((uR0-+yFrX-X2q0_m^wd0Sot*I+%BspzHqhW9)PGZd?Spt-FQT5-uiw_b2d1s}4N^i! +#Be+;B_Inpl5Cm`fvMR``zAL+?-m+Sdp0k2%nvRsbsi-KMniPFk);EL~B^P9kGvF}@f}^8N*KA3aZF< +pnEXzo_ZJSOITGx$`bNSJc9;=$08<=Ju8*YBJRNPkO+C1`7u;KS^fD-IM+;_B9OXf{gv0N@-);#SB*0 +JJUnTrWbO4qr8I~J^?>xwBLv1{3Y;Zw_TGnJ}@t*Rh5my`=<)FZL^~625o}pcd%eCnr;^pd<} +22FJ)bz*=$^OTO1Mi%peDF_MmsfKy%=6SmI2LzL$gh5Wv3i9}I8-dl?KxJ)T=!kr?ud!sb^GqNCbxgo +FCSF2L}s<$GFj7AcbP!w}kNz=9M2dc{Q-6Zr4?=;#RL2UIVOmq0cx(1t+%uVZ;W$zvt^(sYKMB~${b-kW +x-&tzv2jRGzH^>eNbWH%qa&}-UAD1jVzMy!IIE_RJ(M5)H)8L3KfOXk*)g;PdB_^c~da`o_t4w3}q}u +!n!O=+g&i2n^edh2k(?&Xx4s)YlUFaj;|f9P|z}v69cYj_{@6{+fMBo-=m$|SYrvc?giNZAckTBy7Y? +`lEUaaD_VuoFUZ=yrgyZgWLQT8As|kHt-w-{zJNtR4M^TGj3Q*cvqpb>^}S}$xnvLr*>+o6mA?WcY>z +Y>pzlfc_cV5x+~Ks3dP6*Q%$OBoOmrOe-uwRv1qb?qHR73dDXhX-l$ClBLUT`s_xY9I7AQej%Cbo?)z8!yJ@}VN@Fa*2 +8)Mzo25I~&8(5GO>NJ!E&9r$@M`0l-&_4%pNkQw%Y<>s2XGF?UkA7jG|+lHvUhi@udTDW=A_*#;X<&Y +^u`cg{XR!{?(90NBCS~;>{ZcerVuY=VQlfe|YyKb7wBmh3^+~}>7xuvGleVI+D1HkDR=;YP)S7!P&&L +HwZEFN1qyFCH&iu{XAmu9wSgpHrK2q=xm&i?Odhxq}>=J+godwOzldH(wNKwu;!=&kIY+^mzy1#E~7HFB$=oWFm8rU+}WGY$DiI=`%B4X19=)p!K=`!ReK2BGl* +zCM-Ap9Ndn1VqV;L{Ji1;YU7s&j+56S&%g^VlW#G>XULNA$4cIPt(q-`KkLjzxeFv#Q&z7zajDDwq%X +5{?LOZ0nIOd;w96{(xPP~7&$) +u2qN<}jf~C#nEVO!+j$tc@VST0{5363I*t^aXj%$1=|L@aThCiv?>(tC*DHC0Y}tahtw^MAgFrM1zWN +TdYwTEVz>?Y)qK6cUg&0?bGqCE?qq&+otGYzI0M+CX3VWG|~dS(6-@1rN8M6V>IMsgO{*7#Z&EkO00S +B8&H%Q5*@mRXaR)F4EXrB$|@P9t4s%al+FPEslWv!NZ#BkQD|QlAQ#e-4B!FApK`k) +=CU!fESO!qDGe%JVi5;U9v4#CYy;_-&K6bI@58?R*P|TMnswiS3y$321d}U@2{^TpYOUmD4|ej +7WfZ~>&1k4Z-qooPvoowX2F6M!fRXU?9zI`G^i8WtDNJh6`14~q{}D-d}TOxc;gAeB@zxO!tZOF&l`g +dikFAoVN4PPkk~V>T^euE3yn02t_P=BWH|g4GBs#|ps)shT}Lx?<^a}gvz&F}FhYbFiM6K9qpeDYG4< +!<<1(@KEe$9)8dkY +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 +G4q-;Y+62e)63j~dQWiNL0hl>3 +ok1@JceOb0wXQ+%$fi%N2g)yZowX-$#!09XrTnF?v8kYmYk;YEAjFK&U5VpzIHiK}hV5>pnb&iCC(g!zM1rh_T30JLpa +(y`BD(_8T!iw0s9=?MHt>i}1WfzUA#J@uOVE6vyr<6_KT=t9bc^sL_QJ9^ZizjdpN}8;pwn5-373=d +L5B(m8f;ysRAVUZ>*ohz~gz%9QrOfh-EB^+V$7A=1Q3q?y1A>i(akaN6_?p1Tn2-VF+H4;*coe*o2(s +4iaxbJCzCsrX=)@h>5LC%=CrSV4C*7I~PbY_E%0bz8B@LI!XFPhVSEicMlqpin9w+px@x(u;dsetD;b +7(1fi@XZ4|mTENa?8;%AEn_dL`O&i)9Utp?-y%5F5mMDrHvNOqWu^mQvIPLDs%0vwa6xa8V#;FW1E4p +h+)cE_q`eE{OT5%3s&^HD@BrVuQpa33XNMLG2ZUo}icohr;*D#RsAJ!79XK;Ao&apn+4ZXfu-Wu;YEt +*4$|1P&(!5;|ml|tBGk?t>c}H8dv2eKZCxkdAlOGQ&HO9)>EFyOQ_5a$0v5ZJFD;1*8Ib==_rNa60yd +>w~6Jj8!@;L2Bsaij#Xriw!Pi~voVX~BJ%n@JJn5Wy;a=DnkWr0345zwUYpTR@D|lbhFnVD1 +(?8flP2@;7oqroAPHc|ZupLZqTKEFE)060dOqxqIdB3AeYhC7fZqq*+-_tH~x!buLB1vg{VfPqX +il|IWn?TwWq~`8LZIgYH(VX}=kJ{Ut4V7J|q>a3>&=En7n0rUR!z1@GCpl!iSJ#1=Ilz)%rBDF3NJqv +=d(KG;TxPj3^KXgRMNN}tYF`l_EsV64GgZKLcSd;iv$>ECqMU3htQ3ybUW2G!j3bPIy7`pMX!r}7%_7 +LPy7J1d6+i0_9Qd9wR@{hfL(#!dhAJ2kN}c5095x5ep)E_2g-D@VPzokD_{My0Fw&w@E?$wp+Gp;HyQQ;>oraOMI_obBCxwHG +P`>eY~HN`&<`Udl?uyOHT?No^fcZY`^e+E%P?<(D$eD&RVvbwzo)(ngh-zt_}B))fn2{kka1cQ!Z`vt +{XdO*bbT4vS51W=1F)bYdwpC)X}~jzeV7GNrv3iWpPtsSs3%qiG%6zr#!`5c_Qimf!axP;aW?fw?#3zKq|LY54|O{#L3tfBxaW{_`d2^w1RFaCQy4RFThDffAuF?TX+XGh-pg|6-QyJKvg9}H%IGz* +^SP5OIp%!bAr4!F;*Yi!Qo*VLRd*qd9w_Fy;0b)k6JO>NXLjd*stv%}Y1ytz|n&STnTOB%L?W`j0$U_s7A>L*I1UGo6NZ*HYR={>`7KDNkN!I+m0g?XIvgtmVo8;<1<=7EJcW}^`#_xnl+cF@v9~?jEO-*&}s-2 +&yIWR4Bp>8Et3B0fc!nR0*os{#$s}&R)1{(9wH~=6UuF?d7pZ3xOI{V+cqRIOc*iu +O?a48iTV*NZJYIBNFkim5WgUVF0k22PTyGK=>*r=fK;_ZNb*uX!Zx7VO<4QBpO6++C3u8}4ti_$% +SR&~Hd`sk>2V$=`)8XdG9XrAh}%E6Ym2&rxzZ_cY6LG6q)6NQq+U@1Mu +j@!n^D0vhU!fmkXbV`ENQ~o!biJ_Rnoz_<>1}T12UxsTiunpG!DsTEz^2m`*0oV!9GII5N|zQJutT@b +;$<-O +|G}1dyj1I_o)7bLC%90h5zx=i^7R(2cOKJb@V3Ey2YzkI;fkY?-$`zd +(jWR`i38V%5JrEwcRBv_1={c$+Y{@7b}NR6E(FYIvHy234qsQngFYhS0q`ga?VsX2jvu-+SbwMc!JX>N37a&BR4FJ*XRWpH$9Z*FrgaCzN5+j8 +T`b?^F$HYTYdZ4$G)zLblJwyf1?cBXbNilkZFrBx^pXp*o%07iq-a2Zym@(oVqH}Vhp6Msq0rMuC%QP +g;=QjThOL;~HXPoF-0?%nb{@9a}3^D@p-CDuwtqFff)da=ybrO1QuE?7wa=;&%0E3wL=bt1*PkC#{C{ +f8@278_A!B3|WLQHptytwfM+%4M7`#6yg~#cdwv{xnWYS)@U73(b$RToyqoeL*ncKlv$_VTmJWVkR}X +U`8bN3ijo{f@jf4WslSrglDI%H6G!hv#U-?I#=N%mp%;|K#F4u*eP7U@ +!3OxcM!_kp`7G~)@UgSZcWZ^t3<)<=*fg?Q +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 +1Gq +SppIK-sG(5wM$!kQ}m6P|gjma211lG4tIz?sgsgDjP2;$;>Ak;1qD0~!oGz6GGluXbDW+sBKyZOH}pv$3J5T%E&K2{vv(Q&Og;KB-+t +0p9qMEU+N0#Q~~xj{_-lOXGE67KSWKUP!5q}7V(Nwh? +vLU93*e~P~G-7UysFwhdud$032>HqXk;eQSp&!Qs*r69U-WPRR%HA6355rq@i%b&<5i*bd?}E +!!9bL7TknQ`Qf1Gz%ro>bAT~25#rI(#ZMZ6%`E>k`&cL5tot=nxOvd_BOfJwah93wL+tcs~2l^jZLr8 +EZMJmmh9^F+2xryKRNyGh!gMcLJFbp1->I@Q%J;oc+tkHy3B`&fZ^Lx{LPe&D%3 +yXx&Ncy3QkVtXvwIr5y?I9B|ijBNtF*4*22&iob^#i$3J1V1?d-3r*MSV*ag=l+pMn7m|@ESjfwqMq1 +vvn_}fZrex`Q5gAQDl7^Hf8&wIj8`8nbeMgt@+#IHfE$9;hK-Fx?0)%S0ToHr820+u2tlNx+RosaB)u +Ybx698G@9X}lkUmZGz-m(o%Zw;L^t2|`q1{Xb*8IcL|r}?h^Z)>=yybn<4KArZ>8yS_WVJ`Zr+lhmkz= +pO&6;e?Uxp`PDCf_3K0b=>+yIaDo280q2MQQ+M#4py8Y-GzF$gr&%$eFI5c^t^%DWqdnKO#$LgcK%cU +L;S&)dD?Q?5+V;O0L;r%=ox-XQlI$Z;{tajWI>#g&FbWF}D#a%i$Q!I_rAuE_-I6dDAt8c;Ym54gxdd +(CG2OkPlT2)7-fQ^+2BWVcacsr$yR*_aPc0U%8%#X?nIroS>-5-iU1kmEfM#N--gTFplrmyeR`}xeG{ +f;McR`u9>?h}a=u8RU8*G5qeDGYTUDLy?I4vYh9-%wLI;Ugq@-?!A?nsV*v_cHbH>89MEG>X#G45~tg*o~cGgw6tV`pz-yZ;96h~2}ILaqB9tj)d4#V0Pjr9uw*0T9z1l#D)EP!f)@>iVfx12*+PZ`8%&GSN9hnY|%}J%itYj-`i +nUR4F`@>5ntH$>L4~I5LmzwV +az6fTqX^m*0v+qV*Bz?byJ@k2zP0URZB +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 +$qE`NkmOAf4ZrtCI?^Dxu8s7=HKJ171?dsNj9 +wfHY&{CJXpFR^he!ys6^yw~gTLKhzxLTmU1!5S)m>f! +6Qyi8vw5)FZ-}{}pkQ|EMY*Ia}#o;+;&i$q>TDfOwT6DT=MVhj5-^f-oUe{7{UCLT57Va$PTIg~w{Bz +OOnU=Cr{$R(|t}5^R<9j7*|GkpiZCP*qqil4;Th)`2DsH&m`A2nBi-H)#l{~AsQbMtT3wvZC^sxb5|M +KhlxMnYSRq?w@EG$G*HgWnO>Rh(CB)jLtNc*U>N=xSN2Q#@En1*%yw}GJ<3XW+<&&RY +n}n!^Y*@LJfu(=Z^Sd8T0CkG_!i&C0++QGZOyB=taI@Q2C7QHTCInFRo3?}{NeL>R(z2b^w=Z6v8Ugf +!#U)=(3}kA5w=37xhQy7=~UDYWh?8wsP!zW%tfVQC5Sa>G;LZ@^wz)j$8T^dT2W_0%~7d^KFIbSWYpM +bZ_4J{p3EV2y2Q-A#w{Pjgy351Il`|x(2zvmfvOZC1<3CLcT?L>B;Qmm!&P>a@`%I28nWow+_m^Px_mqtsbs^hri0W};F_`aAH^%j>^bu9nN?3yX(j&0b!=W^kK +592a<$5w&F8;KmCB{~fP$xC+xd;UOgwG7cXj7aH{WgRC7qeF!YJez0MAnduwAt*MaQ!mJ;j<^YYuPz(Wrs4aS+GxoMUl +IknTbE9hUSSn50G?+bLS&UfgPd{>xtB~<~WSS^IFoEQ0L03e;1QrxG=j7%BIOr;%5A09LUCO{QZw$OJnGmdpAx%?`ZQFy#y_LANm3X)+@j*{GipyA&tLp*iUX!3WsB+Zp9noDCUrLU%Q +G78^3)chB$P7U)voA1J7h3tg4*m7e~T>1hWR&G5APxD;p5>A~Ol85C$cr98ZtQW4!?N;S2UtW#+C2&J +mnR*uN=9YPvyL_QS=O&RiB+Y>F(KybXwkOPn#28#^6+N?Yi3s7YZB!pMgS=Hsjh=5$klw_s;OfkWgDX +3b272ArS`(%e!Y6CnWL-&S>cL{3C4f9oR9ljg|=O*yxcxXvh6PzGYHbGbnkWYiiW=wO%E${Y?vMNHsK +_``hCzZTyJ9-wFB{>wPl4!Z6zGq`v9#6;=;FHFF-d(Bo7NHvz@u4k|ors^li4E)P^Mk;gS=X!>ad*-) +oUvLP}9e@K&xe+s*M@rN#xirvWO|L*RvU +8(17bMTyrrM<{#+cnJC~CI=sY|^~G1iX2Q0pKQ-GHCG!pX+eTYz=$K9Bw4;MK*oRT`N^`wyUQO~en}W +?ahq!?>8HQHnf;@D!$81CS`No&r@MP_RDomP(PWM!Bho2;IC?2-Ks={+`c0T6Dg +ppcl2b5*oXLXEs3u)ZGfit*e;bBcRx+4g~|OhnfY&+gQ_v^u4HyyI-COXk7sfhrWWYM5<)9(QvTsV+i$0RI!i&CTt46mz +$08-+pT58^Q-loD!Uxu-M}jhS6}<<8*DD0qhMDd*A9?0h0&s~y^)#<{rbw$btj=@5ftQOK^&mti+Kwt +DZKMphasPj3(B$<<;;V~{HNy=8{VYH`Z*kCtIi#FqUH`=dgW9a5OXensAKf^4w^&v7hMBA-@IFg{yUZ +CK4*`i_2DqN+D3qJOvd&fU>_3>Bg|fZ2egB=x#Bd$DmEHH(nG?1ntJm2x0^icZijgcCN(Sz{3Pw~4Zc +B#MF=fW~)xFf#i?GC>Spj}jVKo@eSr@*qSbz$BE5LTj$6S4`$SY%$THOID=w(|i^EraC^^ne+=fwA-} +kx1FGQ8VvEO+?TeD7p?erhw61CH_dEYhLR&`4#PBunknvMX3`@WR-tmhs-iS~TWM8EbkJm#7}?MU>5f +5H#le0P<8^YTX;+CfPcb|dOGl|)Xu6S$Jf+OpAR+Y|O+gQNcTZfq1m&h +Bhp3{hW1jhk15^gt}|$K=NzFtj~{0SjeJ&z3-c-xIY;+@8jf|oc_*I%R?0Wc +J?1QS={MtL?ZD2B-Ep?%megkeM$QN6A;6vb;+x6viX&^cinf7K0JoWWF3b2M7N{vdoz;8B-8_MYcz$? +(j?9haSiM0mM0&UGY-D9}E^v9>SzC|W#ua|ouNcz^N+DV{HsW3cC_rnk3j;|U*iQ1WFo;=dB(Y18G-t +T$jhp}8@64SSX%_+dQUZJ7%$)mm4wEE#+Z6{PRmWA+u^oP{`?A`W^`6}wgs3Fjb`OjDw?Vig@(-db>R@cQ +KIA5l|7`yvE7xGaJwG_{pH>LD{xmpl6%WpTeew#E9!02fm(6HiG!?HB?Pmu1+SaBEO=G^Ci0pe#cH^8 +D>?~o&f&91Jg@aFK)1h`)fKb<#4MFH;>HiOOAf +*GlI5@!?TcrBeLRj_Y)eJXG>6RX&7teWC;GvHj)q`{ad6B5Yp2U>5IE4X-r{(U)zcuyQu;6uur1dP-&W$Pg7;lb75s6< +PVIbLEEZd_V|mfkio;Z%$5gHve0j+(zGK%-Q>_;a57O8x0VN#ET2RhY2Z)Vdbd)SrHO-9#wHtw~#vHC +}p@G*e@A#1c@rMAR8YsJyB4d}?K0{J%E}m!495Ma36Udjf<|2)Cm`TBrkW;x_Ix*y->EWF^QKT05(|X +3~Rtql~`w#oEsl|Fg^PQpTMC97-=e(ElAG;=Tnoextqgov;Wiez3csF4)(WtpvF)n3))S@3myu(V#_$ +@Chil}VBO}QgEG9QYlJSZ7@O*Va3XeT!U(DRhl0%_Kw^-x_@ko;Mz+}FI4Vi6P5If~a?|B{t5hquRMe +tG$xfkbiB^eSVo8qJla8Xf9uq)WsLqN+gzNisR7{D15XUx0hkcbZipbrcKv5qRbjZU +NpAC)#BhrvaGpjWa(U7)Q2H1Vh0`!c0U +|Pi#|n}$HBzfCN#waiz`K?qk48Z}4vT2v=4WwPvw9@Xv`8rB?mkDROi!8AQX}l4c!b>QJ4Ia*!Q7;q) +U4=D7&b`^Lw7i-T_d$!a7K=+j|X~7@91|1!IRC1UgYQ;9zEL+rh}N=C3=$*6Ox$t+`_NmH@cVB7@1%D +GNkpS`+dcd5wbnP=ZoPE`^n008`i0HgrxJmWIF0OW64(|K?6G7jw^Bl{7z}bb>GY2q0{a?jbN7pMaGB +jJg)z(W+P_Ksns$wr&-s(JJxfs*OUKgjf{7lW==q%NC%G&GLP>OY4SrUB~|$!ES?K{v$0;Sy8D1*Obf +i()9E}LHth8!XLN;%u*y9U?Gn2`;bhIe%wzvOc}O~-UY=4E`z~;wJjAk2tf_5Z==x@pl1V7;UlZKJwz3%&$zagKzl?D|Iobv7a%dP`Ii0~*_%ta}?<6Vu|7+TXvPa*S_)Wa3}qj_KB-zchM0fwutd<<8`I3bv +$y3CQfT(@J5Y}K|EEt=LET|($ELT{0hkG**IH(R1gbN0`Gn`>C(nAbx=0l1eOL{ZqW +_ori(`H`ODd)U=N_SLMo?92lQ{;?$bDn1=K^} +Nwx}n&{p@3Fu0>~1V>x(LNI;#yA}oSr5I^q-}8>w%3K0x(BWEW=Qxt|vh%$ ++g?5lILqP_%yAm}6cT(g$9H?jTan&5l0-TwIcXucYV-ZmZDXFl~NaVIbkA_=%(RVmm+~b7og`B|$X=> +IsZC`Qa21(JyJbqvttB^>At6;yWHf>JV6N1SmJ;}>XaB9uXUD~AjwQo!|$omo(h0Rx6CJ+4ii@$6p)! +RL%gNvTvKlA&>P0qpUk?9#bjk8c9(E(9>R!4J6f;ba +!=@(VpE)MngW04)IPI(qHWT3SZ7jScm05I?Y~0JPNdIIe`s^qMeBkb&Adk~v-$is*DurLn|kG$$*nqY +#bjR;NCb8sq>=Hco~lQnF#7iJlhLi6VFuNVwR!b%g&)_38j1XHSQ>n@VL5UD(|6gAg5bz}bQ5yq3h>^ +sSHzIIZ(*NuUn3S4#vMXG6h6wN(e2HYSFKyLEOKQRNK?2sNThZvvjaH6z%VXOHBa +=!L$A>oGHQVJ;xJ&%h8{g^CYQhXAvBXkPi4Ag9C*4unB=x7t59)8MpG|*$elns6LaQM0T2n2qHFs7! +Hk7b=y)eO?7*9ZzV)BLS_$c&(Sy!bwj&JnghLb1$UPWE$*0RoYyq@^ecg3Y%8y8}0WBUBr|D +{|#oNKM|+VC&@GzemPft0NBtpkPf&m&3_v3ixa@n5Su=1XhPG@cNpCnZ(DS|dX_ybb(0=EK)X~h0Ja$ +ro`%R_mcXCwQI}3f)F;D*Y3Gu>H-~q9Ro&Z($)q?YE-7BkWyKNEk0&xCJbYEXCaCs$+F%APE32D +@HWGjLU%^u!RzkgMlSf}&AV?Q?!R4AolHwi=L*~k~%|<45B(=K+?vKA2en_MwZ<6{UYm=PsncobVEX& +@@Bd>`$QA1k!#FQqqGqRTFwqb@#LAcO{HVxa8hYQ*5THcajceg9EEL$uNN}fqo9Xit~R#k+bTd548LP +$gLpk6Henrux=m1g~K9lq&{c8qEX@@h*~(uX>5duN!U4-IpNIQ%kFHacwAC(4D}GnbZ&W7v2jE?z@Wz +O1+aNVX!mRO$8RO|=o{&%(KwOIxxeszw)nHjpLh6V;lW~x0q(5^8R6OUX; +ac06S77JL7gTnHH-2O^_mx8Sp1U?XfJ7Ls?+)Ln24pK!CBJx1c6o|#1=g-&*R||ajY&ZDsfySic*9D|0SL1DclXtsKR$n`-hTM^{rkJmcNu{UfE!L#wj#BL{TVU9 +8cC8P4`Az;iITyFkSSwET-(GLip(=;Sy%`O*v(bUr&^Q83J*C2c%#a1B^+*wrXX<$T{D88}i2-mr@bvl9o3bPa_zQSne +<3EMbktZ;x{U-GZ?iN?EV(`ZRM(fcOl8;P`s8C6WaEi61YYn9fy|WW+T#X|S`z1md`P;gm?#fS +p+~0q^`}C>$=iU4JsZF7U{5V&K_{rf!1+}!a>;+XvT?938-Od!SQ#Dc?EBFSy+yaC}8M`uJyj?_~3X= +=eE|Hxb8y>mrG~lU)+5=~Ohah%#qmPu^=uWU5X`Os9<=OZBY@HRGpSM=w=eQ=xiVPimsK}_J=Fdy==u +Gurouzgky!{-?ycfKkG0LBZkv)t7T(q5;75JqWh~GxyzQo1ic@?olK<0SdgwdOkBY$MUW?Ni?`>wQL{ +0v+w%f+ES=6yBVN-NvRSx(o|rLQLTa;D5D_Tjv%JpwDZq)5e?b<}P*QgXM0DI#LD+x>#XzwUNR{0`*s +6(>;mfkwiw7+pr((h{=J0S6YZ@BEc%lY&%8>cOwkct1-(8g3KDS_6MK@MoovdEd$@ +(tZ#;V*C&{-|J!lfkB)i>nv%}=L +qm;W0%kHV&b|+nh~^ddF9{fao%Hl86T&nozFVeJW+U)d+9Q7AyV#HGZ*O*Kj9i?)4Wwb*yWZ#U^BoB7 +LD>WG$WO(%yk7*nu`~R|^t-SxDsPwD8Oh2&B^UYTdFaxy6l}G#y|3_B<#_tCZ!|A=D}TMUx^G~B*?Ql +s@JYZMdF^ek(THifJOn1HJG=D)GO$bpX~cUYFVhuuzp$E^Zu1j>Jo+eEDF +%agR>Y2aSL8o?kKl?(8OO_cj8TCyJZkDO%$c;~h1;EW71Ambt|BkJX2N&A%Ma7$KxO@I58)039z*e`o2BB%kEp+aMBD}+Bq|pcmB!jU7ctzWx)nXh9qbeo1P>-7_zfo7PMdn^F +cdyIzd{~!PDxnA*-*r{v_5`ma@h&gy>j^%-Qng%55rA)j#FHwDWB0z&R^aj|I^!^lQS!3I`ZIjXz|ir +aJ@6aWAK2ms3fSzFom@aG2$000ak001E +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 +)eKxo+xgO5sEBFJXt)>l^TNKp|=0f+3BmQ_v7I +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 +rW2J-+U>n2)Rq?+?I00CZoONLR +{NJCpyIvhXRgQ`buJd98yNc0@&j>x-_^CfN%7b+XiCM?zm5QrI+885)=t@2Wyd!(YYkDeZEF}@&P) +h>@6aWAK2ms3fSzFfEZ*Hsy0031M001HY003}la4%nJZggdGZeeUMV{BMd?cwb|0ZEaz0WG--dt +ypVs<2Dxku3tfTK8%gEm1&D@vB7%LB9l&oO=kv^Y=L4h5EzNJxsgRJNyTv=|Gnq(p_k?9VzEMi$l`tR +^4u3^vsrSbD$8YMSg!VaUKK1axiP}9!%pTqw&zDCD=Re5EjviNW4ywLLOinzW_N;B!XA`7!ft3S?iOkBq2wG*eW$$HuCybG*V&saAmI5ZE$qbH4Hd^gjmT +el_Xpv=s4TP1l+=9m>N%&T(?H2OlPi5kpIT|l#(^R=tsx(ndshce4`A+zCRoj|t6OCg(@v;$t*B)y!H +muzL{Qf$-`r-QOpEqyc1S@MK{G(*l+Bus)XMLHiv^vpM)j@VCzP)zq9#QOZLU9g(soM+m#mLq1n +!7uchG+B^_j^kv)i +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 +TWJF4f58`faPaL;a(-jOc=&m{Xta*%_#%y +tARg<02KkE?V8)H_sLynxgJ6vsc;RBz0~Lr-*fRpFS0J&2>zIoYa3kc1aL;* +*8bw6^w0|yzNjPFOLJ?}N+C27j)q#oXAMZZ1K1r84_suUjc5=J!>&aVyg<@?d3w}r?NAmQ(5QPJz +CXm-L_S?6?Hv41q<4!pQqdJGYRb4aC3~De0rMov&7gH%xYB^V2*fa}EO-_=k_H71XQ3r +;E#rFH+WezVo|1Njt~JhQQJ;J|?#)0G0n^{KRq^EI^7JyY>0DvBv*~EUi`!Rt~o(wlY_*7^x(`y12?e +-&|f^T>gO)boSx;IrX#`Wa2-!MyHm +5kM25Lij}Co9t{F54Qq}a}OR%_wDV~&)X)!lYkUn|bXjWIyV5v=EWP{?>D=bKcEv60h8vwC=4L>_I0x}ox0h3mxYku_~fV4LhgL82Dpadr7^MaW^z +1=FmZ@NMu2ul4n-{bPqnXd$hF3)=DB4P4+S7ERzMVA;j+wtWjQ036_k#8OVpL=Z1g_%7-BZ*jt9L6ll5_HQQhxIIve|PQo}u(CYLN+^ +%<{WvH`8-m}vnxS7PSri1?MUrc!JX>N37a&BR4F +Jo+JFK}UUb7gWaaCyyIZExJT5&pivf{;;Ix?3yp9r|T)IW*17UCw2qU0sSr3TX*e9t8=n~}Ns_-($%tqb7Y%7?Cs{`%Q+=Bx$zrkX#DNsWwpV?}ih}S%D>_AJ(+EX +zh+Hh}vs&zSyxF;1;HbH|d%5owul?Oox}S=DR<|8(&0M9ZYgTH`IlU^~guk$cbySJYQ8hTM=2wnD_HE +lSDb0IzY(W(F?s;=ul6T@Gtg375np)oG1qUu&L+iY(c`ji=y(~&mG3iErdiS??@BjI(c=hq)`;W5&MY +H9*zSFvJqh5p$m+|eZu5*isIiYrBe&EutxnmVARY7~TFK|H7clDA;)hTf$M7>y`#=%<8oa*x(Q*ZUNv +?v;S0E1h`th4phOksk2f3rl}YRQbn(`)q=nUe(;>MIGVHWNewzCH>|r7;5B<7 +CtF94zr5LV?LIiZVq5Sa-f&eEsbuwbNxq}qPOgkyzWeU_*5792;%Bf_!_3rpotar$A-UG^p_htWF+yv +;Ygk2Yx!QaFxt<$jkU3bf?6`Jo&&$lTP7d^Qfm{p6HQ9g`e|$P2&RK6mTP3oS32Mh*&dqjK7|tf|r|Ex2Je#|@YKNM@dN%&TS +%63LAGOfF~m@CG&)m0mgz$mZ6i=rxnY4Xt|!nwSZsF=kAJgb?70a7kb%(kUY%b!K?xsNDmTqTKkr7Pl +CMC)aH4nj3SbmWvyf1uL-el_dG^f?GXILU_+;1^!@T*WT$sm^weG#1fEa5G5w4WD={y&pMXF4gH=ZtK +XVrB1tdlj#)YM?-Npl{`jhqfC7lxGx!Ud7fpSHKa4c&w&w8v6;rp2HHM*%K%gaC-hrj8K;iN{qehS*U +FWltALI^`#c$0gBkkQiEX&zNXEmFwQ4*OtQ~_qjr>PbR;yD4XSvJ-dFrR2BkjUyOcw&;*f3)LGm39W9 +KyP5>eO+s;(utY~*fm2IL~yO^bG&Q-)9T>i7j<~1^GQ?PH6J!;M^?yY`C?QF88kp| +p`*>uT+4viyi`7zReR03EXj%LM7I|5aRPd2uQ +P08WB$HS|cTPufW}SQ$q*-)PR|f7n(YNCwkXN5qK&Kuk?uR08G~X}CFoK+K^n_qJ5>OC|Hs0|Y*o|G` +o`(=o3+AGNR#hzUe0}X!kcYG~Z$$_PW(aI81Iu2Td8ew^kImD+w4H!>Q%A2-%MJahfaI(5gw_o{S&tO +7iInpTbH0vsD-3qo6?eR{?rmBZW}C2Ou@yUsDg~cH0%_K(VT(hr<;Y~JfbrHWA(JSqn0Ux+suZ9cJaL +j()2VY#cEq?&U=zm7atNAu-_jOA?!W;5i(i;!!mFtFn7XM0v)J9ov-_6*l-Ba&w +(upnW=9LpAYlznKlp!Goa&CV(9do=WR1=A^ +>;d&ur0TKgh#d#2PvCGr0`KyOK>$GU$FPNltw7OLQ0Z1h#H8Sg9mdVH!Q8&%z1A(NwN@EuX|vRxVE%4 +GEFRff=Shj$mKea0N&Ci%L7*Z8-Z^=X_ZsaDB{!n?j#tdcj5}GftHl+qljYzfP`a!jVpd78%bk%A=+3 +yg+H{250TlLpyMG+Oiqo2z$`x=m=UH#$q{NWg3tiSOy}7g0_tw9E9&r# +54l+*l-A;c6Q32VId5uRgxMeELH)F>-LiJNH9Qnx*G4+1Jkq-!&S0A6j)Z)N(>)Aqd9CT8}j^Jxdq~o%PCup +>PvIpGB)_U&LU4++q;cx@eL^?3%&VYoB@Jl6m}PbD@^UfJ3l3feJpT`F9~+kymf^%FI$j5<_e0X-{iu +$!8p;WBYqTNhfhIGXpofOF7-i*1+eB24QT8};y216MZ-(GY3Agmz_$>%O4R_qTUKH>XbWIppC(kGmE&{vjuPb`ldjuw!|YKXVVjefrml-_~K%0t^`!34=3t5F2wD#LVOPFlW{{zr-83=bL3p-L|)mick?;u$9tG`8`o4=FJ3#Ysd&-6%c1> +0u@p7YX?uMa(8elu1l(jhKM&Fcp)w_IgMVw#X!}@?8!D&4t+&;6<-S++fJsyxkxMgLQQ1aDd)#X`_61 +0m2Vffjlq$gnY%3_xVb*;1jx9 +{dYn7UO(O*3E{kLa=yEE(fuS{OIlUollRKE=-Yu4*0KBsKA3gUD{NmoO*B!{sT?vFBelVbee0u~=C_k +fi`-2>C&B&3-CyjWJ4Jz=7)*BwlTt0b0sL+&s$9A!T0C@_I(DIKer> +lO098{2quslljh}yWnMEPVFt3-Cyjd0VlQK#1YL6Hj+%~X2*@nH+P+p*BXS-YgU-0PuB`%Xu#aAwa|} +2r8Cl)(sgExeSv{+Key_T*xN5$z>)-?wuDu3Y|goJH-|pH;3uf0xo)sr2PWGXr;N)TMA+b6-p;FeHb9 +2M!KA}Uqw9NW)Zj+MNGtLwe-dSQ4mcJaCGLC%yi0pwz6X;A3=;AZscqFv`(W8lj#mJ_;SU4T{&t{>b9Eu*5oL2sVX#jOf=^nfLDP3z5W{Dzfem91QY +-O00;of09jk>>>*=*1poj%5&!@q0001RX>c!JX>N37a&BR4FJo+JFK}{iXL4n8b6;X%a&suZ` +?KzzUx;I>P71)LK+}F7*G#&n>0Wg6!xN*%|f81k(UjZR7lF(jpP5`p-AevuAKlu*YH{zlEZm?-*D(!$ +vr8Gx;3qWq9APFNM#5WLK`uShR+J%;cTz;Wthj4b@zH346)}#$hs`sL(a2s|J +P@t8pBdz!(Y2vy!t+I}7?iTv7w?*xrWm)Di`s>@Nzm!Jvm#Z{6!9d}^73JqUAZacdaY8J9OVqukwqDM +|!@wCS@iOjNkO!%!5hNgh&}#Ort!g(zNPGC_gD@sRz^CZJ`r-fjoP*tZB%YxUrC50OnQMVyjY*0uek= +po)lQB*-q3JZ~<^4Tu}R*GvhqKh%}`<(aq+*}_G=&eh^nfrs&3&bhT@|!!cM)aH$3<~)|-b>-7m`B4X +?>8IIK%?En6?y*izz(-(>c+b7?Rlq*Y7H3Kus_Lj;+o)#X%Sht88JH`=sj(@A$wU +t7Dvvqnjoj0*`2_C46>Y~T{T9?Bry{;<|Yi59qP~p(;_D}GvJdf%eJ^Q>E};jpTwIGgscKxD%MymZ0` +)!AIFmWc$H3cOxTpfoC!duwIxFSWAIPb=HE_& +&1E*-je2hP5B$?HrWJR8lm#freFz>$cW#(!ggQ0OWWFMI`r!_(TSvFa=4#4OQYMTn{ +Z{kf&39W9aC?TJ#arzI;?E1BXwpuDu?ppEDvbrx-lN=mvvfQMJ{82+Vh@@M#T0L(4GC)`)#wFIDB2TN +Z%QFUR{F%>5S1w(B?92X%1uhDwDEAOV!?mA9`u4$;2R;h1>%V~C!N{GZaGEAN +k3W690XB}cDL=MUs}R@pPzo&h~n?M~DL2(!-}6)d_+(1eElNO>&LRwIcl%T{@Pt-!OsQ`c!}8lVboq_ +@&-bPMWe4*vUN15o^N;(J2`tS +=I4}&7JLr1l_~^HXe2z!a8LePG0EuwCXk(s6h|k+;e>Y=E9nIP-soBEy1)ajDM$f%*RgSw9;YgpJ`Lc +)?}TMq>clW$(`48Ph?H*IyLtn#HgI|;sKCTl8J;AW>nQfrKB*TR9ao|8`S+#6{m2bKe54j +U9?gD`UUrzy{!{EHd_c(X1$8r1y>^+mn>%Z~th&2XlREh7QmBmWr>~tNicValDTuv_mFRsGYv9iBBcB +%~hXv^D>MXNAADB8qXuppf7^A3B+j_TA8SKq9m%6dQT@&4nYk^IUV}aNQTaT}WZ@6a<=>0#z +`*7DbIiVlPPxLQPO9KQH000080LuVbTbOBx{`3t10OvIT03ZMW0B~t=FJEbHbY*gGVQepBY-ulYWpQ6 +)Z*6U1Ze%WSdBt1ZkK?uxfA?QO=pJG(Y@vNMpf;C1C%5Q*Z1>y*!C@iL5^Xapiz+Ft&rS2ccZQ@sC{b +Sfk|KUtiJTdc!{2;x$PI$vR^%n+xgzDBkq7qgic5B2d3h@i2b!m3Llq-QMwJRDll7h}^FrW(=Y$f)3M +y&I$U&r4#)uMHQexOqEGw9|E45Wp0k80MJ3Npg +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 +_}EEBLHy +Whmc5@YeOKYl`8T>rkL+Gd`0FmGXD;jEnqA|<;q;Mrg-=;s%tr2Z +JNQ&tEV60b4RffQlp_q#~Z8yI#%1am@s4ao}qtQK7bci?iv&vE9AM +XOAq1-g{ObFL*7D`O|elY8K>Z}=u%#Iv3hWYMCdx)QTrAr^`Zsbsqp{cWRpsm4hA@L^hfj18>JTe;?0 +=%z*4$iF_{LlsSp-1fx3kT?;ha!Rz8|ZH@3Nm#58nvQd*m~9C5qqVJ$FTbvAgsxqU~_Wv&sqvsfLBOt +p{%x{GBB^VOf#!LZ@&Q!^ybmQo4XP?Na|h%p2$@@8o*Bi`3y%b0q53f30ruecYZLZY)(E8pS_#z71P6 +uJX|1qvfo!EomSc+*JFL8SRP|JESN|5?G?^rJlf*<=JM4=`trlg{QAa?)xJDieEQ2D{-ok){^t7Qk(G +7)u1uunGv~rKAQkAXV0V(!FH +qX>4NurygB$s^TZ8FaSQvg!IXmLdZZhMyZ8-`Q@OGwZLbHC9=_e)5Gf68(qpYtv0XRU277+(lVMOYti +f)uWqiB#Ge$c!JX>N37a&BR4FJo_QZDDR?b1z?CX>MtBUtcb8d7W2Fk +K;BBzWY}Y?xD#dllB~73T&s_c7Q$>=(ar!79Pc>V_{^;mE_F2kN;j$vJ*S;Z0pU%5ucw(ilWjqP2P(9 +NgNPzqrH$?>H`R+ppgxc>RRZ+B`L`zr8PBVS=sv5VwQod8)H2Pt&JC68tsy#r^Szw`>2!~r7#a7gO(O +G7QSs1MiJjN?78Q@)?M$9U~Ds~Jz6c)Hdk`H7Y?%?*&u%xmr2t9x!0wE+mVx1I^v`oNNZEH3bRJ|Y6H +0v&SfmU0oRh8?b3CUd7bASIuW5T=s>`})p-S`gbKy610_q(;7enPq8c!*Z(6@212^zSi@jp4qm +e}jZc)f!Pr)iT&Z}rZU{}x5N1mf?LwXVCKJh8pB0Q!1unDqd%ay@aYVkyy^5_Ck6i%Xrm1{7UrOc^-I(V)K1bLQa +M>1sTaWI>4NFPD!U;rFaj^GPg2wRwEz1}7h$z4dngY$L+qcpy!4F8n?{ZgrES4yS3F@F_!fj_^y?Vz? +fOWsFPZ)S!=+Yjf(ZF}ZAeo|%fr=&OkZwUc^#b#6NKDxe=f$(!U=+NW9b5yvtE&kC;i!~kQa8BvSUIHXVIx ++qe>NcoNtCLCdb<3P^ew&V(f(Fz_X^m!NS5++CVmLu(T*b7W0m9^&P+cN$m3dx@An1%-{X***1WYCbF +&ET=LF~dlja42NS%TAI!t^tZw +*s$>!@jPxetW1(W@~5_wC{)5tYVM02BUCgC%4%GX`wI$blxot3=Xf7AKN*#)+i$OL)R~Jc`aZdH*CyQ +eX+WMVhaMXT^%20y_u;=c`vw&%z$ujvpm!xcO=Tx{K)PWyIgRV1Q11Y~wmdE*rjc?}nW4BjY@FA0*G{ +>}WeN^j{AX8hR(g@dI<;k5ozE^!(b!e_7 +w_XO9KQH000080LuVbTYDi$q9_Rf045*+03QGV0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WV_{=xWiD`e% +^7QN<2Lepeg&b$B2r^3+3ghv81)_wd%0eLMH(dOeQ^y%mS|h8EUF@9Z!XAxznLK=k&>Lp^+PW}Y>S*3 +&ig@SyHZq&33-y~Uy6TKhbk^l)|J>XQK~YoBxh##-*H}ZsrS@FnH8I6=X0Fr@hayhdb7;RFv<$Wt0K< +BB+tTCEP0fO-7YTD7D+!ILy;<0wFIP;%Le80=H{oH3A_FI^XJRk+c8Z3HQ}YoL?L^}TvnB+ChR&Z>DL +%;t+KpDTW2|!4^r{nQP40Kn~kM~4Od@ag&!v#?lPIQCx~hnt4L=50lnpf$mSgpKZ=TY$D=4XIXOx4SV +~ZHvgJk|-+TwN69#{t=h63%g)DiZ80s0e;|)hXP9-~RInP;w6v7h%y{%WqB66lzrYy~>8N1zz15;bBp +>Yi;is~UWKv}UC1`2sM1z@B6hXmjw2Vu)Muo!IjkyP?_xEh{c1$_FRM?Xf6E*lM1 +BWSasQiz@zm4H}E~yx4<1@2Z;9b}bQa-dYO(-j|iwpn`iVsMg*Rs*x>PMwe_cooe0B7uy=FH~|Al*xo +LeJyfkl*5dZINms5YDPOZVO(UU0$(KA|2WY4kXxRYbMKbt7&7P<;K60xgeHr3qS(wBQDMG0GayGW^ +g43EiK`aMoK=_=@TrVmqD>|0(!ZFvnhQFmZy_3UUPZgO?3A8niCRbn*{jL3i-pd`6LJgOTP`PLoaM4J +PsLST73|Tq26&q{(+ohai6{^vSadbxp$iV-aJ2`B95jGrFawG4)&td!*Z}LNXTZrZ8)$maz#Z6Ar@5* +wNMjRboOZ?<9mUlKo?18$ +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 +9~+;TYFdyG0051zdB9pc +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 +=5V1?dD*+BKvgjHr>O>-c!gMahAg`4k~Ng9 +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 +HK@g|FC{DG*P0vJZey7>37MU!mpAI$4 +EshMjzk5PK%I&$Hs!9jvX{M|JluhxieHVi?qnUE6L@?E?sGpC1-R$fB-S?{&&mDq(X5cU+pR-{!p*Z; +$0~H0m91<9`2_oskp%OnquYLke1M4c4PHiYm97S*hrU2ssF|n10xq|)3GPC=EK7%lVmIPst*|XJCEDK +kp5gTQ-1EB{eOquvP{@RSbTfQh3V2loz7Kn_R!QhOQu9{LFaMK;MD3oKy0mXD14J0K0zstWQ4&f2P^r +x08X3k^*@cN!M3$ti&lRA!*QbW9?SwEV1!MCygA5cpJ1QY-O00;of09jkAW6N7N1^@ti6aWAp0001RX +>c!JX>N37a&BR4FJo_QZDDR?b1!LbWMz0RaCwzjZHwDD5dNNDp>rwN;F|VpI2X#cJql%S+3g)1AsDT# +B&1@)o+85P5VGS2WkLx +?EPA~3>kZ`IOXM1lUFi>QEMS<$sRC4Dl|l=!vx +`bOm(gyqpATNX~z&*cz*qZ?iq(d0U0tI6wQ=iwp;Cp0qRiZ!b0q9jPE8XG9B=rqe-Bn9H|r7WtvzLbaY>XtGrj +xS~8tUU&-o>x0vGlCNX`VQX_E2i43@Jc<)iC2sSO_N77S}olI#I$kh9J3EX;CqMh^oW=6mAWzhYb|JsReB|rdQ>tg{r9bw%c5X<#sy-rXbKk8G4LtPF&O{Yomn@D8aaI+_~FfKrS*p*Gbt5V2>#R>ghmJGzd|1gRHu$Ig0L={Q%vj-3c$ZtY1QpW+op&z<$}CMx16_2JUR=a +$zj4RY)cn{-~l}78=jp#z}14oNToI*AeEPO-9dInD;A|enA}y<^i#%zPf_c`Qj3jG<XSRk|PTWS%yC>n&y#Th8h#`#J4!ajT}nF7RNu%ZkaT};00u5x*Ku@Tttj9lmdj58 +p@yo_IG%_jt=Jb90aqaZD#x0%8!Z=Nsezfrv5#Ei5+ry$Ds*T(yWSvzb^%+ +~>-Y`<$fIynooEN_kq8UgUT0oaH!wevCYAQqijmn60|qTkm>804zJKP>G(ZCL2Z~3`O$yLihw}t@9*?%;W(OlbPeLtKze% +YsXxTQdo+=CmkTe$`rLj^TsLuZh;X)~_Tj8Z9MicnPTK(D7*y}FHew-nYs9P=!&06%rC>YGubM+VKjj +=#&e#8_{vtZCRQ>lX@uE}T3*d!A=R*^*It#XqR=aTfqx8cP*!9pfPUVNUGy+X}eO}Biv5|$+M +`Q0(mSpGYlMntMfT;#OJ|%^LHk}6VIo4Sg3x4jusMLb5;mub615ir?1QY-O00;of09jk3koovT1ONbO +3;+Nj0001RX>c!JX>N37a&BR4FJo_QZDDR?b1!Lbb8uy2bS`jtrB>f>+cpq>_g`^PF-!s+VS6>;6^+7_C}V?$X+b>KF|=Ba~xbtX5N)sA +FVctk8m`>5WWDlI@W>%}BP{__?EjeI!6hS^OPj +Ib({q$XK!2Y%0mEg%8ShSh=w=`S@AvHb8$_mW9s|1n!7XX-Y#m&`0M`eBOJ78xhs?N@I^FA8)OE*_JTf%GB1?;C(~n4_m($Ef|v}zPvpOWhjIRo$q`WzcwMtmkz1690&a +eTk6PhwGzReElKA6swww&|gb3-~+(=z0M%P1kzhl6hr2W +q10x%BnBBeCJgEi_U;aYLtrnhJ=>b7p5t +tkF?$Fe&mPoR6(^)8hIQ-#z!ANIxyhh_Fdbxm8O^etun9p%NDVc46dq=0DLXvrF*`!4@wyYyX5L^Qn$ +1l+X2cnbF7{%E4v( +W;6BsT`F-k;7cJ-G`@RHu$r59qMYp%;^4V5fW#2gAJ$zfzZ9ECt4zgd*sFTrRWRre&KF)BdWnSwSQz|s{@yyMvv*c*y^yS6U;thPddv^zpH})-98fJ@c6X1LLHr>SBAC&#jim5dQU2 +jynMTum~A_ls7(eC0F1(JD`r`*;b`N!SNJ@Ij=yc|QkcD`_OoUUJpyBJkt8 +M-z8l$Er&9S*zj6>0aWpZ!vN@n2t+)VyZiALQJxgK(Y3IS2PMpTij{zzRiYNzj08*rOCln|jzG(?W^a +m$TOubE3Y4LMBN9iNhQ>Mp&MnvDpvV1k4_T%T#k5<}`eywYWQD)%&)mB5@wjlUHKHs}o=?9DkCj9kyJ +UM>V56`o){afyCmj0v2wl-s_&OmVd1U-!4#rNnX91|9_KTjd}L;k_!qHctU>Gg9KD`ODO-Z$GWfYm*P +2fBZbVwi71J!U4b0VG%IvTy3ndiAD-b~>9#nmullXotDr81jp5s|5+*qrNlDh1e#c!z2Alr?P)h>@6a +WAK2ms3fSzA?UNT#bE000Pg001EX003}la4%nJZggdGZeeUMV{dJ3VQyq|FKKRbbYX04E^v9xJ!_NOx +RKxIS0Hq`hDs#PI(563nu@m0Yflp2Irfwv*-On%aVZiSaZQn0f}F9=@%{Ge2S5TOsCn3xi)w2P94GSv5(MSEV{S($8dFmzDYQi>gZVceRss(o}W#U75esrfu?~`<6H +IXpI9_yJnZvN}A!`zCS;IbN2Ra{Fk$r=X3G5q-dq$rn{us6#2@uJcqAG`c1xz;%ixERUPe;^h0u$msb +%Es7&iLDXTJ1lOq2g8JEdcj(gVfR~V~Nk^Gp-9nIMEeoNN*2UhuRI*sdRoi4qBeOW&$n=9~Dv?}Qc_z|2Q5&fu@w(Z_`X*O$4iK76uEe&=+Cqw(sx30HGUSq(_ +-(RoWc^#jM%*My)N)rOsm$i^muia!C;>3?(f}9v8X!th${Q~-W*`8Smua;Hs^_ah0*sry*-%#i46I$# +kj*A(j+ID?S|-`PLu)Ro8Xgwa4U8`m?7fk)z^TfQGHn|vl6sXlbyDv|T4hpHC5)#U=p$BpJqyO&gJom +{iFg3ymUWpFk#9cYktnNQlT-1hfBWW%#kj6hnm|Lto*xm*XZXb1w8%So+GZ8Y$V9`aZ(;gulMga(lKM +(E@owL2KtLw?f+)s7`)yKYrgL~C;PVD#G_U1Wmd!JMKd0x&n>a0GQntJK(QFDX(6?z-j0EqnI(zfx^_ +w{?yl2l~-T8Ws*8?M?F*vL1s%A7^Fb7Fpj2{zme`xc+ZN +~Dsv3rxRIQEnj{gTP_$ZoT)f-q0H#9M*P-YP7;x@&98G>hy!GZG@Z`w}4`?)t#SJ<+{kz<~hs~wAozH ++gPIxjO5o|Ap{{ZU`+d~9P|~;_1CEmBza~XI?UE2u>^2}f24LJ)*RikdhzP{>mR+s#m(1wA=O?ra%;L +Ypk(5kI&TutK5>?N$;O?F>IxOUMevvK#7}7MvCUQLPLJs-KXS8TAA@9r=GMzgmI^mTz=FTi3eI<+{c8 +nGx3uG=zBR9sh8qhG+BC2FxI +G!CH9i>I0lo2(pUc#}?o1GF)K@ixYDR}D#&4x&w9?`pnINzVY5Fu*P3U^gl3mI%dY9?BRLR0t9h1$s! +I0j6ObmzZ4dy9Pi1&Auzy6B$21SM5;Z!%5wTn-w*CJ3NGEQG4sI>k*d-M|`zW-KzWgC>Qlglcz4CS_J +CVn(D5Ec{?%xJ-gMY^G>$!0^|3CJ9nf3Yn-qh}9l9S)R#WB+#^i?cCCc_!ukRh +%Rk71lEaiKS}OYui9$-WmCn*Ix-@SC#X!P=24NrVCWp@8EgK&UT%BAsq{>lmpR6m~5fQ8pnjYsp_`-`tySu6r@QPsk5i +koqM$QL~c#b}vHc{@xJZpU+=NwnX(Q6%t@3Lx#dS%S5u({wT&0V$`Woz7qf+$o%Z>JY38H8}d$Gh9G49r1O>=Z +2C1Gu`u7*X5&f>LXG0QO^Le?-?euzLXVo~r#(}b;ZoqzOBlwW<_sZOsa7EvA(V>`7JMZTH~*mOj1Yd6 +(yQ2?0=zvQwyOrS5vtRk?L8c8uF6KLWHmau(wu>~8~0}l)rSOKL_X`KTZEi`aPL-Si{!x^v!gv*o{p9 +hp)kL1$89O3^u-ZdwvsN)Gqc=+?rhATh+?A;}BjgyU!V^M1Y{`1d*d29l5I9SOK6pE1tRPNoNl9Fc`? +kc776{saZbg{0bocVxQuE3!^;a=95s?)n!a07XMKeht&&ga)S-ggh)8s6(o7D;OSn5-wR-Z5Yk#ds&I +pu9kf(??Ui$->qE9X22$EiXpRKnO7^9$enhP{swg%}XHRrn>2A3gjU?k=ANsBI87Uzjb?|5kD1=^wTvJM1Rr)>@Trs=JG0H9??C{Su@jqoRg!tszRRu&x^T3 +SOj^Uq{JdYFsr{xj +IQ1j4NcCY-7T7GfjI|vbHDc#UyQZk&}Z|`nj6JajUH|~6I{JH8L>6=0E-tS7=x9#{GiR&yZgOEV<<)6 +6o~bKjcXI=Wx*NxHQtSn#4G_bYE3(L)2$w`emPZjz^Nr)$nI=L;uvrJo3FJEYDVbgp|t1pfG7$_Vsh} +q$>O;$1hmX|a`)|%f4_J1h{E7J{6j)HC=+!KJI6SZe(w+uCO7h{Sjh&(Lp{jASYRFkobQK)dijY0L5PSjl=}pm+1=h%H`qKHiPar+ksxo%cS1lT +d9DJ^1!Y;a`hhAS?lq5LxmIfAG*4NO+dw~q`vpa7_^|+3UlAleUufU-ePHo?5MnezrK~oSwiGugD +utZqw$WnhX@oG>p!&G)?DXSI9(3Ju}(YBP|wylx$2q#Xk?Ou-fJy$K3ceL!?OuRieMz~&ylnc^AQ;591=qz^Ig+K{^r;XeGOBAgzlfhY$$?IGc +}_^;q4#v6-Z2N_j|up($-W#1*4ld{o>47|?aA7SiOBZ`0l$u +MB*(ctq~Fjbmzk0h4FO@mI=ARB2pNWVc(gIS5PInj_lR)7%7Co*_OTeAh9Y`@65=n6fho +m3gT|HB!K%uoXh5<4xm}shn4w5X;VhOzKn)|r}dVmeucdvR3CY&}qd#~Sn^LyL}mQNF7IcJ@-ouOZwI +y2@k*^AcXxriqM%C2Btgu#0%qfI%dy+E +TM5h2+Hf1Pt1dIF`I22@=c(7A(gT}Pu2Z*&OZ^a8zPGK +l_(5QS;DAPytQ7tmjvKl9X0*`p^GK|>&8eu?>(MI%pQ1&|2OgLHs2iyQ-8EOx>{i5VJWAIDI2|?gY_y +{`_zB+8XjEdv0WT$1V07pmJn8d;^S+7z^I3V>%4lrRSQ5neKC30$oII^TN}DU)I(tdCVM_RxMps$5bm +cMp0M@;!#t3GIy0W5Q4j&UI#x94%L>ua^2Gnji=;L?;ilTl??nVq`3q97adZjm9E*y-5uH!Q7v8G(38 +&jKcv~Ja5!Tk3zk>WDE}I^PC5#v5H+4wmlVwa;01%aoTs7L1CP9S^jZuAzVooToxI +a%peJWyKb=J2Mt5f6$&wP5WJV5WKMYT<-^Fu>4ioqT-a*p*7wa>2uBSxnb2{fpJMIpA=YHhXgupLazq +Gil0Z~b(dhV4P}MS&FZ3%x94M4mobsjs->$KehloE5T^G6cEfKXCXNO*E(Edg()N=7%_*T`iloF1tg4LxW_^;WY|>m3y(pG6CK> +IN%KSOjha8nbaljP7U82-VcB(Og`OU2~|!Y72Pf6*!XFs6VE| +1Bt{I0b#ec~?xu|34bWjcBt{A(4F=%1CAiO$>B!Q#Aec3x5_$~Vr!F}aOz8j0*BddRh28eKUE0UTdk* +S}`;?>?8g}m#zywDk8>3kdSh@>vaS_E7!#$s@9or4;Ms2JsnH%bTSrHes4*M{pl$qP`)s6pw0e=F{g{ +Q|oTbSx0WlRO@80WNA&aTEWs;LzqTBea1K{gHSCbCHvac=&v;o_O6nvLea(#DCL5LM$_r0F7Xsn1QAm9l!du$#5=&WJgajcl@_`J5q1@0 +(3UaAppG~!uOJC&9<8sg}Z;!4|O?v5j_?4W$-CkEJbsh9~-!%HF3~Ms|!-J}=$X9VMo^*;iwx +7jUu)Qnk;TB?l*Xi7YD|cn|eYj_`7PqA_m_GJ5JX5|L-oOw#L>p^^T!GbqCzVyZ-Qsm1)!JKbO3sh`2 +res_dsvn_G$6AMl2P7Nb&yc3jju+b3tj-~itCt>2a$gfM(B=&ALM>%?zD-Lra_i~t_#@*8Tf7ne=r9w +{XmUlj-vDF^C-54*|<7iwVYWlk(^PEQCU<4_DirJ$C_q5%7xu0>TbZH^Y)jRd9z>ZP9vlYE%UM;VLZ5 +|J%L8sj5|ei(ax}~DcxOqP{y4+9NpCu+Tg(@#qHGVk!dh~FAM|QFz7n?WP|&>_@sM%9_Lx6U2zS}hBO +WqvOq-14tMGhyNpdG%kr2i=O9?L)B1L3zeCx*_IrHBa*D5$I#0m2C;0tFK78M0NXFoXQ|fq%MNgO)H? +FEC$H@9{dw90cTfOJtZJVZ`c<~&h?Qu-H(C(1FIhnt-@AUdD*`}yW1?<3>X6kpCMc1?^42pq45R4hSmkZC1p#lcj0N00~gc{S1Z +Oe{9e!C%a%VlU|G(F}ttUrPcV0OSN#I{M`;kh4E}dqOn}8elq_jvrHY)7L9J?yo9j?7FH`PuZ{o%DIz+a(d=w4n9de9jnLBfCkf +z{oKdTB+Kw)Q9V}}tiB`F@$;1_O4L6}qaFU3e}TfPGy`HI!3-Zr(Aqki6Q)BX*9Dm(&%)Eoozn4vT{wRSXy)=FAk%!dS=SvHU_jy +SY}x}cY?q#s{Pc-h-J{&;LZVNb;nnP(H1EQY@Puyzp6OiB1)Z_>uJdFwea!j8qw1{2AtF>IWebR^DMw +kg@1VAZ*5<;3MOu%3>UZlTLqPQ|8acIx!xc`1 +QD3#t$QuPbxauZ2M`zf*!WRzKPg^wLm21cegZpNxm;*Im!hBp;-{RV7WU7Do2WovxGWb3}^of=O!oQp +JA~B`tU6)$4a>r+5Jg=j9bRB_eBgg-&z|e4(SL`f6cy!j~!UdKZTxetaJy$MV3g)Jw%>R3F5%*5ifU_ +448yHw;Q4&VEuoWVf3qJ>3OM{Km;T_+&%)EV_uE$-OG^sUP{`$>rzyggFrK1wlF#*R#`Cf<1iV$f3r0 +;C~EBJE?UZPF{LBr@u@Ym?_${M*C8d2cM=XZDn0Q&#BD))4pmyb0x+E**_V~KNF|o4s6E{`!aGLJFw0 +UOh-Su2zhBw*>AV$QJ3EOIrFimw}ij_jm&hG9Y-dcnL%xic^d-}mtg?^4<@%6OGT1$71;c^C<1TXcKG +BL0oJxmiU%{nKo5hTN*&pyj#wamgjT`fq!@mN~euD{vYMs{ib=wIm^9sk3RnMd08x^Tlr^Ff5@Qj;I!yXL5Z>Tb{uh +a{X2=tktgKThp2ox@n8E4jmL=BPJ1&IyVtoD_kcB4bMEbea*P$#Y>&BwI86AC^4W`S>ZB8AMa3WbQB! +Coejbz5zXhpufhdKTu0$a*2Bz(t}x2ysHO00RrrSu*S^`%wll$DI!jQI;5tcvXtR0%q^+CIW)Km%}N(DX*;#woqyLUTRsQ@+-td_&Jd +UWrK1vL_|REh5%Lu>e3N!leFXQ@#WLkH^H}6V7wOR@d{=sck3^m5bI(}MM$9x=&C)dGBQzy;{#bVaEraJ< +#t7)o1VKQZEt9@IOZ-#=Wac;&d`rBEl1aK<=b81b$$A~pPZW{yRw8S4+V3|o}2H7`FE$Dt^f6l12fvm +8Vwd8csD1F8C?O)H@_}A55wn$=&H%<94~#8T(|~;)#E$qcRdo%P&(;;Gq7Zm90PxP&9HoLsuGtet~k1 +a_UzTuA6}ltbQA5{7w^t2P*l?jn^B7Z6;@vqcnfEDg{DRBP)1jH>d3-z7TL7M`FO|s*C4mPZ6MQ?%|L +9P!JeGGP!%s`oGC5ne%KKyy +Pl?Fb$s}h_4E*Ltf;3z#9Vi-%x_4IZH!KDAFvgdeKpzGR3nS$9y^q#gi8df>%j32QbB{J(@DK4{+ule +eL;*p7;73cVu?;+F}b<}y%G1QjLmLdgJhB(tkvMU5K}2K9~5SsYV&~(Aq>q|HWtCk>}OtX +QXOEZYJ2OGK(xk}Tvre6=pDe_aBlM?)cTS%44+%(K=(P1Fhh9Y0i%D6ugf7RC#6D-0e?^F>I@2W +EQ^x*BRiRk9s!!u50@QjYQSh1Bph^7~PKRYcJW-YqpbmOrd{8M2Glk*Cw8xr=~&2VFnE|kdJg7Zkc-Q +`7NPrb}cK#i=*gf4=TJ%>Wh)Xw_JUo4(nir;~E4*qfnwgstHq=46Lq3?L>t{f&GS+^A76Z2Cw9z_Beg +} +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 +T=%unR+iEq8%M}i^afT8 +DfNE-3D?5P-bt~QEg^gPoLbX~z)>xy2da4wR+A^P!y?QLU}s4m0>d0@J8jexdk9~6ZEq>c~Tv@`^bE& +M>OS)+m>gSzayX&{|2Fs9B?si7&h|XXi%r5r5IL$PM*s(cMmI}FdRAJ5hnF4tmTDiVol7uAr? +`_qj$$3KlMjlm6KB{63Wy(Aua0Vhp1?#};gdYGgzO98;j^v?*5$ZX4Sy@uzJ99S^+YjHvSH3RW=H6P` +J{-~SP&Qy`h{t==i|gXUpRTU16EAJ(jQR +?we{SWgwl_`eQIp#PVWTnqK60ArhlL0ZR@f@f+Be4 +cX&f^-?ugrqnAyiI{)MV8Ttfu(X2upQ9%7wdNdZcE`Z}`7^J2#B=OOJRyACxPI+2f8CrR}bOdZ&aVd$ +V|Y{!f{k_pB^azO$(J9@X%Faj#`ZJ7V`c~(RbZW5O^ZmqbXYebefa}R6WP)vk)#G37c7*!0N>PPWAzu +E?^cZP6cFy3rbnT4|i{=sI6Vkev>R?0|XQR000O8%K%whn7mPi; +syW!r4|4H9smFUaA|NaUukZ1WpZv|Y%gPPZEaz0WOFZUZ)0mNaCxOzZExE)5dQ98L1-u-1G3tEST_V! +u_4QV0NENeX*VD!2u3=|Tqsc`DX04PJ5rP^I&x5F0uoE&-SJ)?-ivtMN@a-d^{P~|CbBgxQyK^#7Ctl +4fnRHx*$RF?E?wi}%CGP?rMxkq8Ya@5<=aWX-&+82Zr?1D3O*9%b%C36+2|vLse-RGmvzmWVq}U}1h0 +?qwc`qEXw3Prp1Ajq+-zwsfHhs4tk%cmYQs#YQFH-%6nyjP{QTnPW{IUnI-%3H7czgCoZ+4l!ZqD7!3 +#Pp(~=9I4XYQemn|sfOiu4RE{fqlHHzgAphnRZ7#b`riRuhTorJ6^-c&QrD}3`DN6mE}I@4~4lynD5q +iRR|HgFrLTUzi*)mwc29V3w&sruDQxXnqnS0tv+8I-P9t5q(T*5nG^Kd=fzXK`V+fa(;`LQ_DKb9`;JKU+EW4aVvElEju$A}K14WZyuqNvEyj)LsFiTgZ9 +I(G96*{(OEzS|$HQ`$(t6^d8k8+r#*o +4CA;C4f76WNHKR2@?cfq;vH0Ec)|qJ8L7l6Oj>@WG_sY-K|{mRy8d!3>ht=@eLZ(`k$$LS>9JA+OM=i +ro36@P*uM;0t*t0$q-B~4+WHj6$SP5 +u?A7D$>u%zOEz%kWfEdvrYGf@I$hIKbEV`NyYI6&TN9GytIwha5sBIibwJA{b^g!Nv_4MwjmuH +ThgCbs^#+&0mOzQjvtV2ck9|9UlF-@M#)+(?pC-FeR4Z9boGisHe%)_fjDxf|rnhq)G1>PAv%(WD*Mx +QF7(?DBjfBNy~lTon+>>P&e#}J(gtCCk#gE3e=PUpAA^MX~s~q2k>%erDWG0&ANjGM-yfnr)-uUtEF0B($$jL+h7f;lGy};^>oWuU^@X<)Fa~Jnq>ZnQD+ebZcb +$qoL>4W0Qg1h;4bkVI$3L2FBLFPY5ZALhegLYV3%xU9nBr4vN?LmNgYNF&rBcQg)_Ob`70?mEwTe`Uh +(U_8lAxh*vL-mLhlLAkQK#e?pAK#DAVKMZe7m@kjLqxiLGXEPcE+ +^GYKAUsrz#i|y3CF7rcB-%*GVsmBPv)HfA!B#lBXclrgr?$%1_rW58Zygj4&k9?*k2b}y9 +^dv90fjy-vRl=`;&DaG^*ne%Q(zCvbcPZiwq$hpOvMr1a~dUXGAZO^BP1)<8i +)c?v0M5X@uQU%OtgV1~H?z{%8m4N5l`eYMBXy74Rs0lrBGBj_lO4gzfaF&ukGU%r-qk-Ri*IW^i!u>z<~-Ug~Zi;Uc8>o5i-v03=&hq3rj@;cnuUeC1!;}yNqHtE^DnExUng2C``;5%m7Q>yhb&mFS +b)@%IqVJ~m1oj|R>hI!O}%o$M|7K+2nH-|@6aWAK2ms3fSzC4K2GVK=005R2001BW00 +3}la4%nJZggdGZeeUMV{dJ3VQyq|FLPyKa${&NaCxm*TW{Mo6n@XIAXF5PR$J(>?Zul5bZLqfNYbEAw +gRr9vKDP~l_`~^l6aZ_`_AD-5+$YG!xSKq$aCj+F3d)jdy-|FTGx_g8R7e?l$uZ>N=-E{g*rKLYel); +aU}sEl)pFAX=CEJr%hZacV +ywW0CA@pJTxkYH^Gg{GN-)xD|xIRv;i}O^hzzWfw26Pv4v^ve)l!E?-T^;^y@9Y_S*x)E;^g^%hxb=pX~{p=Xviod_*bZui=5qizN^F4+c8?f^ +j#^xq!v&OHLpIHg= +n9NQHJc91oj6e{~m#X0iHtUv%9p?RJ;{#dbMlaT2Pa#;#Cb2=c9u$->RytLs +^lc}+7v7aDFeT?b35D0vaaIilQ1wz8&g>e6Uzy4k)64UIw4eUyZAHFhAe1<%{K(vfu#%FlazyJ-MSJ- +7aVX0Ip$6{N46U41_AvBbp{Yg8YPV^vjQ+c4b7s7=#Faz8^$Zk9vkAujaG;w)jl5$Z`?@fgb@;a&mqO +LJD%$u@F2Fj-a?!^?i<9N^Rjav@5Lf`ef-_bznl-lFLRz2$z>Xd&U^X;ERK+CjkpCk7T~JBR9qG!v|1t5pXl2xd$I2#DjhmA#8#QlbExKTUt;*$VGz!l6O>4Hh9yH~QjKXjQJHAzSFA&j*H8H)9Ie2B1IMl<4o8M&(ISB|h$$ +`0CXXYSeb+T=gXBPJNLUJX*N%!cI+pH1}P;{5&9smV8}V!+P}$hsv?4m0v##HHr +`#eq<}1x46*-IV;v$Q^~+)a)5CZ9C+U-P#N7aDr7O7B?;mE?5eRK@YS^*av_Bhmq4aMd*@1sUdfatf_ +$J$V2s)#3Y=et^9AXCwNLU_BBcJ2q(xP_clV~j|YgB?tK-K9osZ46#JHq%U0SdrBwwNirB4mY7;(BF +cKOOz|Gl1z_vTgMMpjX1XcxIvnJ?xCs1oZP#}kI+Mv(95Pvm^AGfX->M>WEnZWClRTQhV<4{ +{5VNmn%cIN15IWUyeQ1w5I#0#4DVp38EGd3X=a1TpZsH5Y;TSOcaa=}h6oA=Jd=6tfZm6b<4rs9a&`< +t(Vg1k= +xoZT41jpkKA%yWp(KR8+KOds|qv34|ayN)69A`eA3(u;eKD#dtqn288!%Kp&LpqWjGR!k_}S}Qz~o*) +|Y0#uO9O-%)uc^e*)Rl`ym>aqvu;N5qJ7fLY}#$u*v}mMmlcG+k`BmDKI2MG~v_heFK_RuoB96Mt<&J +v;NOkidX2U%{Pl-GOX<1@VVP-dzX&UvWbs|YZPGBpIDD=I&!R2@=L$E20~ttAD<7i_6fm%^O;^|3w09 ++7;`pUH<|~WjxNL5$=uo8zYJ6S75nxc*f2c&HtKQoQABW<5&Zl>;-P=f$WKX<{#9}j2dX=L+%PpKw22 +;Y;Yi{KyLL=E=g3XsIU2__dl;xa9wD#~PGM)n9$YGd(udMRXHAowf3N6;JpZ9%+a@)*mfQ%ASBEoUe& +e{`ACi=x-upNn`Dd1?OYk!5R#U7Ro_0cDTAT;nFgf`bP)h>@6aWAK2ms3fSzAyCrI@@4004p?0015U0 +03}la4%nJZggdGZeeUMV{dJ3VQyq|FLP*bcP?;wof&Iy+c@&Oe+8jp5eX;jcK2R@aVpTurhCQq(jsYh +KLmk5OSGenENLk!iMMzE{bq(DMM|=JIHR>Ca$cPGFgw{CSeEU2)k~3OtUR=hRE*bkqqr)Yx?8P=wW`_ +g%X)8KJ0?45$AZ6$^$SkstIt6DBQVNibNRWCZdr;aUfFgw@$Ac{ +|YTZxt4Zp${wo-d8FU^;0REdU9w>j1HR|%FY_?S(ZvLzy0M;Ec``O)%vk+o@@3|lVqQ +7-h--Y_OC$+Q9^X`2XLZHH5r(s~(4iM4Rr3tGLLKE5?>ct-&^!-r5e~nR)(DtscDpo=Gv1aGkg}9= +Qnc(?@F;n8OiB|r(DGka5NC>HhgJ*l$^lkWU?5idkwJQ6Xv>CHOx0@k_#*E87yrF1!;M4b{Z;1O*-6h +7X(s14pbsov_Qp`)H-j*AFu+nv`uKJ^QGoe +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 +=Xkn71k3C*R))zG#f4+Wp^7#uN{}IMmLW(}_}2 +f*#K&cKro#3&PT*3L|OE8yujT|v+zGAdN{IxN*qG<*hs~_hbK7|^HMW~e>yh;qdrlmu~^F?=jPKlQKXxO+H^^DR_WAhY>|Cno1?!>p0JcyuwWw;pst1!% +IR-Vaa@I+iK8MxUgS2k=%G5F-qYOS1a9vR< +x{zP39R176P>nq6$hgtsZ@2))AuQ%?Bldgp(vcccrrH@=U*b<*MqV) +JX06Mq(PMiRKX&A*FaCN*iM;l-NkkfPtI8B`xUYv}?85U)0&w>j_LX*Ut3-(>cUdPkLW(k|<@wIO<|L +EpG@$nh28eshmp3nYyR2FQfo8g-IA5cpJ1QY-O00;of09jkpbqy{%0RRA60{{Rg0001RX>c!JX>N37a +&BR4FJx(RbaH88b#!TOZgVeRUukY>bYEXCaCwzd&1%Ci48Hp*M0Z#VT^^u^!C*V|H0TC91}9NkQO9m& +XQ6LDC22N~7)lK}$ny82PpR28aH3O|lMTpLo2()qn2I)#vpy@dN1*29IKWFG9bJak=!L3pG5EfmC_Y@ +vCEiES9T3e#@YNT$@QmmFlM5fT`NeL>a);-Z7#p-fDOF(&jXq)?i{`cC37zxb`=tUoQDc)JU8@y5Jtx +!J4EV)jvBS`^^`IecgUCWSAnfTIZGu{m1H%KnRTOk#5F&RTI+AI%>GZ`zf#8R<;eVX)dB6*_vQ|;LvK +id#@&d-~sf5-BGSDHEj5?rrY+NP5g1E7j=4!IpWMdq4oJfXOXXC8>;bGXs?w1j6rLJDKLKhzUXokhFr +)s|WggE(pK+VKw=%n_$OvN2}T#I1hU%g|RA5cpJ1QY-O00;of09jk6tDgJS0ssIe2LJ#g0001RX>c!J +X>N37a&BR4FJx(RbaH88b#!TOZgVeUVRL0JaCxm&O>f&U488kT5WOr068``L9oBZi77Qzfp_iQ;*`gC +IvgAr~vjF??qom0BsN2&51c)v2y~jsVX^rlns@lN~2CE80*K6Z|DWx5ALMxkP>0RAqtq*sHUZ_n9efs +rdSv`DRK73m}e#v4)FZ!Yq%ArwA79BdqnPWxGET*)3`u$m0XGA@Co~cBG&nbMRtYcFC#OFa6>`*z<)n +1a98PI0}ryhjl6{?q!+`m|=7h$yWSVwd;S(Y`DSqpbHNn?#WmpJoVtzu8-tCLhbTK{DyIoFFp{CHNuRp_xzV*q}lal?+Ne4WbNQyM5Q6R^bHeV>=s%mCYwsVhAPOMrEi;wWA6_!Z>*r7)=%Zm{pKOGTNSlwHX7r8$9g<;2?>W!vkc +NkT~{XD9y1P^KgDJ8()E9$Um$$~9&M{{U!k8V(Z=|I>EL&&TNLq^b58(8K(NX2YU-KSl!v;?tnv4_*` +qm>!4*6X4-*weaJ{A_}%G$6Bly{6%ol8{5g8-Mrk!gnTN7$)c{dDL#z^)gg|d})j(&nFxuA2Zqv#Vkd?Y=!fpP1

i!2%O9K +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 +Ya991wI#~w%GO<;K6_xdzUtKRUQV*>nf9I +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 +dv9Y;=F>o~4h+1!=a1w-Ue!kPjY0F9j^(m +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 +s{f#8_w|(X- +EJV^s3Yh5;AN5q$=n-&#N!lV`k*Mn!ps9Fexg1g>CP%5AEyVrI&>(6f)UEyJyUM_)m!7=M!mPj=uHJ# +1XW)8H{uD}o&d2c15*a3tNT0pz38_F1lv5MMGp3SXn4F&l!sjENg#%vEbpb#?l&Y@{CGH_ONGpmS577 +UphhY-^zu5m{UGvW;rU@4Ou5V0 +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 +t2{GKI9h_;;0~D>pv#QP?%r +l|O^BMb|Tc}C(R3~ss#+C`O5VIoYg{a|8H(6-15M^i1@Scg)E#L8Qw2xq2;5T1AVYT58AQY2%f-uWrM +?J_i5Xk3fyvRIY+^_Q=51%rl<8XoVLSW@ayre(C1*+Z)E(=Dx+~Gi@LPI^`J!bWH2p4Np!@ym|q;941 +Rq{+hWMk7jQX!*-Q0X~PfX-t__Nig~(*k>%~{GuU{U*;kc>ay!FJpaJO$$0Jw +E7C;-|5{Kck!lN*&h#ZzRRpBa1L;wP6@D0Qjfz+(lLK~a7V*Or47`8UQr5&rd=UW`r%6ShuzH5B2dWn +v4LVvWXNRJ^);`H?V^(3E?#r0qj&hnmgG92q2`}XKzx$G&vM=}p~jmOK^HCB_hulY_{{>Z$2XTAn``k +ze}(%`0fr&_S!+3J(#R4558LEVFYO$Nra>88y;orH(;=oEwhAzQ++4(E0PN1~TM@XuCc*jwc+l{$A5wMszwdmksQ&~JTg%%%v0m+k +EK;|nI`>H!+;HmY>_RWv-&P*s#s^eGepdl9F60Y(%Wc@?Tc=A}zioGKBkLL|YxkApxLVdOnst5#sE_K +=wcP>hV+aBo`|+-MUXENrNm7O${SvoYO&Uv07r3LH;)@v`N#c;SCLg{Zwur%AN}#pPA=~BQ +~YdyjZYt2m$1amo))sG61t4dN0xO9KQH000080LuVbTb}pZ$L< +gS0BJV>03!eZ0B~t=FJEbHbY*gGVQepKZ)0I}X>V?GFJE72ZfSI1UoLQY&07C++qM<|U4I2ew>N2%sW +{2f##d!?61VZqNqup$w3qoPN`xfV6rmBM9j)vCzV`(HL5h-{uDdO_)iww`y!Y^VUx9g{Rw9b#Raq4>i +bT3vtD+Qfo~tr0QdEGSi`+E#*qu$(Ju)oxVPe{(Ac3?bCnZnYUS^-aX>4&p7FTekAxqEs +d*M*#s_;!sQlF9C6H)&B;aVGN{yQ--290ZK2Jds6Ie>Y-=c3#xdOE`_SleFIx@bCTQ>D%bV2}m8iJbO +E&v4t$7Rs54GqE(v1e{W==f#>?8E@lz%Jx@RJSgIqXKSlE*UddZkT=S?-OBt=>*>${-nujV4{NnhqH| +X`ED9$nf$5?!%uR)WUfY$`L<2239j_pw->5p|V?tflqaS0e|3;{%2LyU>Wh!fe4HpH`oPCyvA>h*evW +m$lP2Gk+YI;XLI6y>0gOAnKaZ=d93rgo>~(FZ0?1u#$|d}G6dpbJW5{c&(vBu6=pmg}r7E +0G^aD^dx&7^014aj0Y18MF(9C|b+H2o;GO3Je07T!tN1{i8Se#WL_SJn@jugS +BT6OW8Q&;XZdjQ_RZOw?|Kl^Wg3p>(Ku79Sh$guL9fjuD?NOh-xqNqWejafMzvKsTD +tB=<223JHwewxX3DgG)qr$wQPny@j`+M}3(jt$2m_yR{LNOT-QA(IHq03u5XK`5~cZItSBXgUUU%*v1 +8B8M0+u3E=ci^tR3f&lh{(HC`483kx?=I>gpnv6ZgLc(t|*>9~Lig_^l*^6Soj37X{onYFN$FK*2x@( +^;^;NkMzjJFtZpf7FPEO@!X}y40#ngw^e8ImB@F<*iObUP@`!6mb4QDZY-+4lK8rx>_7MOk&Q?d$+wb +Nm0(7;Iqy9WGwsaBHR2x`YL5;lVi23wVbZ@G;(;*6r9215c9EG6JS7G~2!t2K_HznKvk)xxyCJF{z)s +6E?$MCm>U)NLcYz8W}M7*1)ke&8t(PtxhnAYgEx(@W$ujdPRXb)4Tz`Yz%m0lnWU{3Ye=z@SBkznw+{ +;0D8PDOW*x{e^lUl!T2 +DA+oR1OOVdi+LUvY2m<%Rma#za^QB%{OFr?i=X2{`vBRCJJir5B4%#mRZM!{cWf4(MKEATfv?WN6*VO +Ktd*(y24QWrd?q0#pz^#=nxEu5zya{5mhVX6YzXush=YZJ%0p32c-&V!$o#v@#YP+(#1wCuNVG5E!tM +Z+5)t-Hx|QMi{?Yw+~fkZ8)?7{9br9Lnor1l{jE#`FwMkUo1E8?ukl+NLm$jzzGe1DHk38%Ke(;7>#+ +MJxa(*9HK1Y-3P_1-x07Yl~kE*VhWQ+J}I}}XLCCU)pw{ba{9mNs3bld+U~}|(?>^74gbtGeFwO+t +x##7fndcfc7R8?n_>rh1h`qHD+r?%IBlB91tF>rpu2+XpX4AJG28+fJU_<;I`;o!ojDx?k;WHyy7d=U828pf_|b1wxj +?kT-TPRz{MX6nHmk#r!&ZP~v$EI;gpDA{Z#g~OYh^%f6B8yvtHod5auX=X^1ppR=KY<7B6TgEY>1-&t +EW>?K=y^E(>T97Wf!5)a`dt4 +uw{KfU4jy|B2-Lu)T3=Bg?%ZC1#m)85@Kjbyd(dpQcgGL+E%Uh^xe}M@MM?^svQ&=+kadO11zRAQR$Y +}~zdX!C~_FcZic`*@AlvCQLW6l3##S}icM^ +2ph+k4I@(^j@IgPW3QY1fq(ljW3ptQ?C?3^!1 +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 +Z~naF6;wEU|u!c|THbFypZ>{dzo$NtKM$O +~`#7N4!osg>%4>`Dwhet}THp=~EIsgWfZ70OA)sbh`5`1QIHon^n@0JdjP(o<4n=_sL5i=;3SS4Dp}_ +5fR*sj+%2KCiOGQ*kmU-)b@=t0=+~17x+w39)2zAt`sM|BQesRu2qSjGM~=OYU%vj$%%dh7?y*_qt~g +tN7()P9$mx +biKl@LI$3FoZs5TRCN`fNQT9{TfWw;Uh+i2Tact^uL;E2iG{k(71-hNedbg^}96T09oTM82k--<`u-$ +3~Tmo?wup6R8AF)dzX!3m*pX_qOzUH)bn>IUDXc+7ToUtjRrT|}(79=B^Bu9eet91)UAPc#eAa|>AFT +Q^W4wps$9{n+5Uc14#?1g{+O*1uT@`4j0VU&a!ByrHEmpqYs;6r6);FBwnd;f&9Pm(S2%JQJGw$gL9u +!90VBLg{1gWy7a}d|tWgbAX2nzASc3Q5WiuOYr8J-mhE}`*O@+$UUIFd?2WFy<#%6QzJqns|*Ge>iFN6&o&#?Tn7Reb^?Nah8^n|Yv5&n`rWf0?YX;A@Mk<4t0(YTKfi?zDCm +-6;ljLN9%iB=7jZ}%gUsy+Q(RU1Hnxrs7TenWfUltk4kV!`jz~h{uAc$nV&qb~j145=_m~7dm-qYhBW +}(|ptzAu?(Iq)>;R5dVQTpN`SXgsZJ5GvGP_< +q=8|V;Bbjai+w_Zssm-G`s27cQqe@_;t@$?QZIBqZIi#C3ARUCgv|11g71D(x){ClTy{n;YXu)JLFO_ +ZsM?fVmu%0A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 +gu-UO0FS*67UBMorR)~eO8Du;s +ce7#Nl}54;4M)@^*%c=*bmoPq5h9iQtF+RZ1N`TMUE!1&Vont}921Y +1ajo)Q{7Xm>#^UXpFg~%PYdhiNQ~dZ8#$aK?Z1fWxiW^%9TdrCs(iM|So@k|PB>B!SJPBiRUQ4#&e*4 +U+#-CyPYDha_S2S#u45`$-*cvW_%##DJ+!{`>>|HxkkI_xDkde +Ow>_weAml`f8()};f3ML38U(I;IEzeF7f*-yYHVW^cuXczIsv@R2fbbL*4aFErbpuF!%&Aa_xP}FYATV**8U;=GFDyFsqO!b~1)a85ga4|yy}Fyh!{55EtJr@|`05fSQD&dy8cE=?q^_?8UQPSlxr6BR>! +4mHTZV6v&wt*1oPYXob8$WUGQasf9F2m108mQ<1QY-O00;of09jk1nmd{v2LJ%T761Su0001RX>c!JX +>N37a&BR4FKuOXVPs)+VJ}}_X>MtBUtcb8d9_$=Z`(Ey{;pp^cpvI?ssJxtHyBN^q;Zs`pWWN~^FmqKo6!T)CYCEc(nN>f@C5SHSr`PatoJ=O)#!xM}Q8F|l5aE_9mXHq>B5gMw$K-0w6(oE~mdxxIcT7s2=L{q}LZR +a7s$fK{$d>NZ)FORM&Q~O$o!n8$>9RoY)A{*4{qXB7J-?X0|K;l4`B{1~yE=V!dUXn5z?fp-AJ;|^Av +w>W$idOAqw;{muo3vkW3mD!od?gsg{O%_^uEJLjQ_twR-B*iU6T$%TDL2zv$ex=z%)=s^BlOiDa4W%* +o2g(rEYfJ<1&=XYg#C_SR|I}4ZQ_tU3eP}{g{pG5~@X+go1SvNi$z4xX+MsNN1LZF>tz?NC4``SF&c0 +k6e0n2zm-BW3%-@P9izbe<3Xl?}^WN^9h{=N;!d4QGf#)-Aa%bCu9sfPo5r49TY;o35>otL9=8Fxl|T +AqUy@DnIYpzvt2Sc5lVty7}=KVb#MeEr~{y@@msc=NhxGZexpUr%<};lCTC*w0Nvl4!#+n5>XPjsGb! +MNrVRx!0Eg{h+_dwtP>IudJ-R0?Mjwxk4l?=N5;?iYgNZ>$3#>`gc{)*yNsvCn6hU>3vs-Gs9r$IkHt +O5nTUvl5TeIxeliDj2$EUU64wqrnZH|VdLJy}}%kgk+Oz!12HW>p1yQa=IT&Ep^(%=YB`6?|L%UN#w` +y~|C^z&kKS`?Pz+9u%8H+|q!gJGNdcAOs+T +Ga2ac*hu@`6xE)j_ktE=vh%TG~3zO>8xF|oprun9+HxrO^bjAU~hA%XDt*?sBV5Xh3-uEv!UH>V~7*YvgX)EQQKmHJszgOHOxNPc{g-t3J?< +nipZ#gnpA5lS)dDtRzfo=6wZ-Fp}G^2qr0D5NdPQyfX5;6A>jy0O-TW{ehumVk^Ey0r%%R#_SqN1VMk +Ta4Obl6A#@BF0?`!As9zrof;ZV5?J-SAcun8fhG9BC+<|gHvW%QG +mJdmS?UKXdav}^=|IzHcI_L_90ol`LxJGVkpkX5MU=R#ei>JyeiNia%is!57}Wz{HnE&}<%W_eCO%q-SbRFq>E +AT32f5cgvmj^YDrn%=!ZRtf=p#dGYWH`(&t_;RtOLkLtgOu{~z<_Pv?A&45vo#ej%KH@JID~wR>ugb;GP_xWmS!lCREDRR5(Z+VF<(8} +izjd%$Zu-Fk;xNf*5zdH)4aO9KQH000080LuVbTk>*lf%*dg0GA2?03QGV0B~t=FJEbHbY*gGVQepLW +prU=VRT_HUutu2ZZ2?njaE@_+c*q<_pcD#huMJb;@*k?Js?<8Yc^CaF&(#gEhtS-u%XGXps(l&DE*jMTH++Z{7yvrRHl-^!vELcy)v@6s9!&8eZDGfvZ@F^z& +WC9IZ08A3T1h8iZg_BtD=DXWqaXbx(y`sBVMl0znPNX!1Sru*UJbZ-q>(;W<(SKVi4VOq)fZcxp68TUs+>;lN;JP7SXbllrHI-qqg7{g3Qw091k1hTSl*S1Bh&<3rLm2f2cIQNR&3 +MsrTC)u0YtMQoia2)nI#I4D;|Bj=y6>pEviFf?!1dJ0ULG&sq{6znl%v7qfmJZh`NxXl +rh++_&NScQ?}i~{ykOc~ReozR-szF=dL$nxPOC|kDDeX_)2DWMv>VU!awy0 +TEqIDm3js!4^^ix0V;cC50jYutOfWK!0a~)*PGV_ +ACktOY>L-&0ji}V1tj||2{Y;7h8-oHTUA5UMu#MqQ1_Lyx24hAn3d6D35&%xNUHRa4OJ+zacob^qI{5 +y@xE>;kx8P|q#45f^E^YCb4S5`KBuWd8goXL@|WZPn9BLWQa1@ba!%AN?e~?L|{~%Rn0P%$bEWcAr)X7NB{W;LkeX4FS*ripZe8ZTSBD-o(I9`ro!`>`x?jU2u=o4&|#d|p4gS4*V9A +eSV2$z`OkgZvT$6%*=FaBt%=cKI;%iuYcpXDEoIJ&4;wh+4ZI8Y(BfGm)`q8m?$mRX1Fafx)J7^)*as +{NH}CWDbd5=L2wg;n-n(Q6CZ$!?pKI?C$1!5F9mn^=8QhUBfQ|5iN9e%#xc-P9{^$4@tIGx!!G0KJ(} +KGp^UPJ}R+tj=i32s(AgQAE{X=<9w8Tz!lwCluqZy0GF&+%IZ!)waRx#6(S9~}Tf!AoC63HdP`;l)m* +j>cMx*js}a!BxUm<&!5?{tZlcvyf);bwv`&F~oa6yvm@ZS}rj{x*Y6SJslYcF?2HzO4e+wTJufbwN)I +46m2W#<+fd@=&oS^o9d<9Gf~@?|)EB0|XQR000O8%K%whwVq`iB^m$#Ok)559smFUaA|NaUukZ1WpZv +|Y%gtPbYWy+bYU-IVRL0JaCy}{YjfL1lHdI+rr=AN^pS9~x5?$0(%oreIj23pPL`9@s&wFx7*dEp0E+ +=la~@61=R;a +MJUgp_rl^IR+miUu31d&tgTJ$*G}FUogvCIt3b+T@J6V +(lcp#3YKM@6{-bvs|qCa?k8=QyMOA-YfkLFP +f5}6xIa;S$lQ%l%B_G`sY`|Kv*H~p@fvRkkm$k%FjW}Kso?M15FVf0B#cRGXG$dArC!ovAmBz432WlMq-4&U;y+M?x;T!|ZeXKRST7XS1&7SQt7+vl+s5(H4Hdh(UwuC8zQAeH1=5xM~#5UvkoPlmeVDmX*4Q5Q +1`8$DcCTy{7SW{=v6>!{@^|gXs+3C#`B45SqCt9%iobUsvKrEa-wV%)97{P%hM1@H7`0JMEjBm +A_j5v_8na`16^Z9oyTiG9=(!l+w8ekC`f$^#W!-W=JjY8`rc&e!QhnW2tGzSgY>yPq3gUyEA(_LcL~44!1bC!q2>>Y18t +L~~W9Rtb_7vqCUh=D?x$C&4F`)Q0Wo1&j8)a|cz!`ViA9UTGpq|_UbL>0KZucOuS +JV{!*`Fh~qDE~#_W@(sF>BMTZyWPjMkrrnG!_KombAQUu%L`(M=tkEy%D79YQi`b3QOoRu@FlWZqA}l +<*pQ8?f|3LesNbSr}iM>8~&A$2iTbKn~ivk^Ylx5B$c?H_G+(k4lD;J18j0pN4yjTl(Arwq74UANmLJ +!qW3Cb%icSQ~pK$xg3w^>f#5p%w5PzMqCy=b~z(nIU>n`Ybs;TGc=su=uAs2X}I{YVt{h6QF +)I3v*6;|f78OtdvHR?7y1No0SMo|_|*M@;&Wx!*d7{K!V?nF; +wmjw62<0Q)&ciH2NnGi)#f`<24ffJ1-65UtCiKzC#WR5ZY>9`_t0Amk5<6|f!p2ZdN-a-`03a41L#K- +|`d4S7!Bxn#vM96&m4&kN)aZ!}f{IyIB!wq9aXOg4$viwq1jI0wK7@N0Pm(j(DU;gsfc&tPzfulpthV +#Lv-%!=s-9J9bqJ}qe;e!f6y88uDPTG}@H9*FNf#=yB2UZeFtN56DY=Gl^=cM7TmfN?Mb=mVqXsu{cJjs>Ng<6_3yEjYEmXz*b!q^dkr& +g%1w?YO@ee(akW=0y2KTAvq!AZXYE^l<;Uun28n19!)U9Yf+nv)%V~&(z|3+1zb{J(4mK_*MkU)uOc= +5kau6)re^^*v;^v5vB)ccRzwMs3d}jYuY%(2*nZ;-vHup4%m)971AmHC2AN?VFBT&w05kW{XTQj9>4Y +DEnFFT%JqbdMdkCmWviF4j@*@Befx-0}hqK>#U3CzIZ9tRzQJP<|$!+D`mpd-g^iUmEp1TyQp7EKTHq +ArpG3~-9VO9s_utSD>S1*iT-S4~sN*^?)0&>PzYX3m}fC-Wy&Rz1n2+zR>Rt1tiX$A1|QEm>eY+Li&i +d`N&@vgA&Z>kG>x$s!9Tvh-+6tOSQMPqh;ZW*45ZG- +WCw%q2to`eYtoh3-epG}El+;;ore{OKr9$$O`^ZgYmc-hY2z+$xGoHyAfgDENfH=p|}$Zz%(f*8*87@ +S%EM01XbB5ty1E|@jaq32s5%xj%6((JrIF2QgBcW(^1JiA6l_+Xv6Cm*a=HvM3nu`p=<2Xify&-L3o7 +*0Pe_6d$aX?Vw^i?Yny4l1E$V?Lh;oGu_T8ckuq>I7=wzJ?&e{t>Kd^3pLoDziFyKcORY48x0d9?UW +w(kGM3xbDtnL0fTIe@$W`8PFTCz!2geDzKV^ymy}?k`F$BtB;)D#jBSH51OxnS-<~q0DQ4gQSHp-lLl +>O2P|? +D1;>AX^OLtY5+w~R7m10e^(>0zjidXmK!htaB^tXf5fWO1*lst1vkh28@60q7Thq&SpB8)Ii|Mge@I^ +dN5{W;PS_4i^)>%S&p%|TdlbHDNfr3M{rU4nBjpkBK4^Hnx@M#}7X3;+)*3`~lF((}mjjr2fG&91igB +e7Lanv6sITJ14fgMi_BouDnJOljPd4x6zuZ{be)fEVwj986dP(MOeoAdI4EG+|K^4U)nolpFU6qh&mGgTWfoZmx_r+^65OK)MB&fMxHmm|P!>{U-oQhK!2&`%~TlL#bD?~57n2hTl +C8ZhCbp;9a_+orM`xK#pt_pIC&isO1knbJLjSm;KUm@%cta7rVMU}xA-0N^c1HR$)J0{^e8!2I_JD*p +4ES1$)!3|Etx7GrcITKPp)7ZvY#4YAES#EEE6FfeaID*OwI=HO!n|Ds8!`QiFE|BqHHRA=2rtw-a*g} +K3k*8_T?vyQd{@lcnkqSKde&X1ozKRJuK3;ODfA~^dIa|-%fFKsM2PU(#umngY2 +G9hcO=VfpR%Ksnm2v1iB{6L-KS#IkZb=bSCrs4omz_+q +MBj{&Ma)|pRJFmB-eRtv!1R2Ub!R=Yq7rG8OODp3awNulGQfMDM()4;TX4_*l0P%oFonUn>CZ~r;b~B +!6J8X^a-H{)F9;?zZa_qvg)sY=+d}v}p74iLM7l8UbW*7`O_O{}UupvlQS36^-=C+^Tzo*p2PRBu*5~ +5-<&FQUFc4h+G_|8QFfN|}D)y<;yFk8r`GP!Wp)~1#bJ%XVAqU(z~dg +B9|Tq3rVRG?KnYGBr4uxF_F!CTX-#S9g7-*BPg;TH%h0325`Wdei}a#uO}5&jkmcFjLJn=SAKbi;D_o +}Y-JeMu{rR;xtREc`n*eEWzW!nKZaTMq@&)<$hRI8$Y+)aW2C?WqAzKROelL{i`js$U;pjAHvge_2-&va?*LJxeoygLKPUA9vS3t34tX}% +1@ZmZzyr#3s6OR*p=caoYlz7enUC4wh!i#w{xTQf2zb#Xi)Rl!^J~8;WG}3^%wi7@2})%+QWdTH2NY+ +MUdMtSsX4kGHIb{_c#5@{!z1-LxWoS(3g0o?;B7u@$tbNz`D9Fcdi(e4x$Tc8+TSAx|6ru)A&Y +7Qhc)G?hB1v>1wcW1U2)9IlOIpcP;+lGY4VFys5)cULaBP3Zr0FV@>RL>;Ne0~*b0mCH}P|B#s!AZ-HI^Z}YmuJ-Dn#=a72<4x4xsX +UmjisbCSz&8MIR+WQ?RZ_S?4D$-Gz#|fb__&iKXdkicNy!+ScEqCB`hdNSOvfBb>}a5qF +u^!sqBo~9KvN?C@V4!U3p@`aie;wV?}<9fA!pvfS@ObRTBC937J27YL!Z*%NgIX0MCB4Ii#-=PEb=Gf1?hREQBdALywk%Pw( +stNH?7``S$CH+wrqiYHEaqK+AQ-ieQZ-o9>TSHuJ5u(kCxR%F(9o7SuW@-5g;YtW3Rnk1=# +C@O(Xs<+Q*~0an=}1{-1|f2HWE+LIjSit^Cbrfub&%Bpew@k2w*_TbIcRz +Kpms3-YOF?|w6F2EtYmtju{>RM!TsO5}V-yP>KpL1Q;I0q@l8Tq&ygJPZ +|M8b%j3dPNXD!&q1lDZ@DSOmRnSF;A$2luoA*7kdx!ARZ=0nL#v9YlVxUw~ +3@V)SY1*1doRHbi-tsi4qEtQF_;-7hpd$&x4_I$i*t#akF^}S(Of?+|W_0<8dD&t9~{j1Edddb8xJ=l +_bH;7M0%{Sc(9&LsRse#_uaEDA?)C(`hEJ%o?k5dcVKEiokaVVs`AMjFhuN1rFc}EnzW*v6!mF*xO;! +hpeT!{eUvdl*n|ti_mh1zjR6YNEM?&L^)N?OvST$?9xE$NUg=v!J~RM@BFt1&|otT-7-^72OJ1(x64N +5+|`vJsMw6S0^%1yd??7waw>% +;8S>zK4huQy3`{bTiLiG@2)!%QF6kPiKC@Azvu!Wk+G!1zoTdtb +q^2qBD>E-p0=(;@Fd^}2hlO}k;XwGaHKvu+RA2w2ZOUt*!Y8JbX4vR()Z{jpPwlqriTDhe2Ait0khc6 +Jx~Ak>d_YK7>4a!4K-3XjnMnNq1?EQ?+(s=#B|W-hcV6XL{SJH)hY(>6$}Jh#pI0bTL*TdG7s?GN#JoVSP(AqcFSo9IH +kxydC!1se>7Q={5Ar_miQqY+BQLQi`<1HDnCc;YSzrY#TCCS)(YW;`26b$S{IU)W`3&ULdEe&ZOre0f +ZG6@GJy1wZ4>ESZ!9)(xGS1;wk$g$x>u~ZFuh4Ae*;mx-8aI%!29WIo>=0J~U3>udVGjQ-3efwb$Il` +ev7o>{_k6dNlgrH~pv-yB-}Z+z0ylF?tkYmz%*3!oD4t+hOWAYXNDW<_-EqQJY9ZLn*zqiZnqy7X8S+ +V;?kuqFW5EHC!8vr|tT88dXZy$l9!b`&U;Yx1zk`G +sIJ{qv_ng``qg}K{!2~w+y&1VM5!r{GHD`VJX|sM1v(^xZnl@g+MRwNJx7V#57eNG|<2qD@K}4$#1T= +Mt8UKdXgdp@@*8>0eHgE8*7JDU2XKeht$89i_icq(~(AOD-vVMZ$o$88q`BzHp{5zwrZIEf +YpMYS%@_zQF}=2X1E2SIKPnp6Oy0mn(?ry}j8;Nz-O4!?UiAUG-`1vb^3__fH}FDEGw5Z7N+J%>Uem6 +n-+^?LB4=Q#vBLT@VXtAA@exQBk1_0nL?c?5(!c)pmiWc<1xZ%&3fCU+|`#0Y^_WGPq%BN>KsNaq|s8 +;YEe~8qe_cTr+@i!`f +r!NnlJh@PNtWS&9m`8^_26|4GuRI>92CWmPdfX=?^boot=Dt{O06P*}gWI-Fb8^-A#uR@Gm;Wqyc&Hd +TTsjoi8LCeIds^bG!BYY(sllMW@M~k^l&+CBZId9}0<=(gPD@f2liX$|B#-r~nr@0IR}X19_cQGj~n3 +*?9ME3wCX@VwrDKVXuLa12FCTaA4XCa;>OVdZ@u&RMMHQ2O|rQ8?m>v4)EWCV^+K@j4to$M^xzQT(Hy +GR+m|LrMg@?_Ky5&h(qgT;F5l<*IP0Sej4>Lu>NCx4JqB#F^r(OunUWq^sOM?jzF=>*4tVi(-iM%3GG +!Zbi0po$GUgg`OI^=QpX8Kx-}l#gcr8X-#-i*a-VV7TSphbtE3vU!6OM83B{mhUjk#=auql%p@LMNC} +jt~3nWV8Efq06{`Pkr>?OG!Mu+(;_S9L?TBsYaO^XhUwh(9nTC&~H-II>qp5f_RUBZl=oMhvfho0K#A +YQWR<{|F#qZf}KLOqR8M(U1B+9=DYoGv9bmyRQZ^taojPU`to*x)oRuD6~X7Tx3xrrTCn#| +9#K%kd#PCc6;4|qLC=_d4FeiS{+zX?E0?Pq9~X=v`Tl3H;w9eCskusE4L;NT-NzP7{m7>UTnEGLi@E^ +?f0_T`&VWB)3a=MvKFfyA}v*2i;_^}d|P_VKMl)kcHIfhx3zFjoziP|!`l{t6O8VJ&;Dq-V({~hA4K( +`Z{gS~TiJcBZ1dttG?mhRbNje2v@ojIr7*Kyz)|_gk&9f5fA><0gJ?SA5C3gkyL7bgWIddDr}Tl>@>x +_!;hL4aQH?BVsc2y75~L@g4T!|U`iFh}6(>kTj2rtlmh<8QP^rTo1yeT!R#-LwRjgprH=zNlsM=t2AUqUGH~fyatkm1KG6fgGe6?4^>Xt@(-0uUX@TO +z-C*9FfXMHpS6$rvT$H?G*gq7FQbXsnEvfE+xP1EVqdj+_|wI``ngQjB_ubZ8E +kHpiPl`$G_QSiD3kGx{H$-7rKZ;~}jLNxdu088#xD|9@e;e_+Rd@s7c&{|rMi4_F^Mqscfi98@#tyX2 +tjbS6v>F7$?hNwdr8wNDc8yH0&yzaH?Tl?x^T{k!4p!CU`i-nRT$+cg3uho;RfavalcO-nnyxbYe-7u +0n2Srm<;QExW2+W5EX&A4KVh7#^rz%mZ3d2HR$em)qC-YV?e!>tUa!-~8T!|foMA^u$C{iQp-Fg7N@$ +u&t*j%&isT1aI&8)o)(#hD%KaiVPe(?vvi1~gU>^c0<$Vo7gLWTf +_dv@^OR#pPcJziulgHF?2|hcGQE9XXe|Cu_V=$o65MlMxR6(CN?34J6QvF1)ggJ?zX3G-Bh$qaVoPEk +e`?{N{F>=}bBt=~Xu<}TY2saA|7?4X-N&WSv^A=o8EP$yY7M%lx-kOr|-@X3>@?Z4pQ+NMaXc+kYWQRQr +Ngvx5fh@}f+To1T?q5*t(I)_q9cB%h5hU_43#cmQ(lg{Bs9K03~+YS(|C`^}1Bh!)3I(~wj>}<)y%c0 +6O828fzE6JA%6I%c$nnC2&zBmuUNMxx4Ye}6aTF^G#XYOoSvOVSy&xaP?HdTOyW{6A6cRG +Yj^h=<4uT?j)m0v$p`KxGhws{z?q3SIe!Z0bn}2M=Ula-XQcE=mQ}88lgAVn(N$+2F8mW6Q5`2SOQh$ +Cx4lMuJaYaL)l9)}6Cxl-#`e@apxe53iEVoUjq~=c$~(tmC*W@x9QM=WQK*9&|A+w9|OZWyLPEkvVoBvH?Fyv)C%WSFe@{u;v-l&RKaeVkY-pnKJVhK_=E0dZ5g|$pvz02UB!~k&RkaeAh$7 +CCf`FN_Ct32@`t<4+2)ZD;-NW0{K33M(Hqj%^Dalqu!2gLcSAh1_&csU8(((GC(rEX@00nl(GFel?PQ +n#$g6+K_ANXv6yLUP4x9hf3g26$6QWH&Vv1v0aG%96tIUBNTTw%^!*~N?ArhEt(V^-Nc>G^IYr@jE`B +x0&l9&BT@0!(R9>-Xb0f(-nn^oIE4Kz$u&cKxo*i&7Ls`xq#!yxDC(hSG;C7K_L*xkT}{i)5OS^}^^! +u4gP-*xtEwCh5~c5PJTl)Zs{xrbl(}4XdpB<=wZM-Sg^5~(6-#Dg3U1cJU@I0AjX5QPN +$^CV88*DuO5A)2!;uPqxg%2$#jB7DK?Jd!~!)*fR=JT72Ri9i)7_W_JM;iCZZpmW0{O#DSe{nf +|tEjeN&O~rg5xwWvP#f7W8~n6w=|3EVk+BXF7zE9;nuRyfmB2}J(c-9isv(?!#S`>ESr`gv*t}*4 +LJBkK_mMdZ9Qyb)%K_WLq!ZyG6x-1RbRZxHbNQ6lAk>s=I{KAJ$3A1Ig7wIcBXb7_<+SL2mp +1%)!2*|Hnn*`ilM!EO4wf<)N)dNk$iT`HlTOvV-$(|GXiknz>dtXbv=c4RePUSgsj%A6aO2A94CYgK# +jU-$%xl-8-wW*z!esBnAvhTum8<#PwIyc@vEd!f}o_wr&^dg4v<>fBw_U>vwPeIv$$konS~}tDYe+M9 +^lLXXd{#*vmB!*?_$QgH%bSif!kIOR+RM9UJ4E@nv|RZ+!`ly?DxxTsJr@Ox~$*vnZH)o +CE_~*a;|m>plhk3mnCT@a@YRV-*TAIZH +EVw0(N23nJq{gVl6K^^@fHY)8owNLCCYiC{(x-Xr3bAfhPI!7_K~Jo}W4v8JcS~<~@oaTM?A=tbK`eI +H=O*=Z!~*susDreS2I2y0extBJbN(n!26Z`HX%5$<>EsUf{H?&zOz#9fD*Xu1e-_=@8-XK=@n|lLM%* +11&P9gtM?lZKK!h?sCgW(yD8LB5ID@$s$xu7h!sO6Hr!h*6kyZ2&m_T9TR +)`r((GIy_HQxSJ1(>1MkWQ+nxw^e~&=#?~!7B7o#xqao9>XL +zXUoul*f#X5UTjc=!{9IJEr*Xn2V<&M1)t+OZW6{7Hh?)DCEgRfX9%l0tTWznpdB9tJFV-kro5Y^EsE +JpSE6to>}3(kM1e@m)&Rp&r}YJ~OcH +$0Ws?Vx$jT3L|Ik4r-$MShxg+1_I3{b@N%el70X}8_VhIo*WeM3zLA@7JWgH=Wo3|&>?31WfOGFXg=> +`WE#|}rr7QoVdgVhO582ZLj;P4__o)oYh0|Gy&C*gX+cz_Ye$9w2bYS8fjbk3es4rGtT{FTwrIuCMFUNSd%vjDVi3qEQMEs4k3CUa*g- +@v8YD ++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 +tsS;PW{l!3=<7cbH_KIjb+=%^&%5)=WOx +PB8Av%3N+)RUD4(!hJziw%69ooX%YYx7)d;hHZCSEXbm#3yW8Q0^w#18bUG~LgF6@3-b+O6(s1?`DE%Esr8v48bmU>!0UeK_Aq*L|LCA4-QSw;0IfQ +lZT-k}CAKXf76AFiM6wZG-4?dOmA~XCdt0UNKkY5@G^rMP;4fi=NEB^RwEakYcwG9IlY`AJ) +(wV5C@MJ*o5Y%+mMNKAfPmAgsBP@!a;h>9+z?Q^tnv$|`u-n)nH0J7H$CcuD=(|B)HjXj))*?u!U2hC>QK! +=-AVZV9C|z04$&vj((l9`0o~8Nz+h|q_6pHzRAR%e@iDx_i}44Vqn2cKvS$krcotN!Q3;P8I@w6P`&s +<{1RGys&#|yz^$8aK1HdU3>uBZltMqr2IE3KyZ&D1ceQFM9^NDy8ZMZT$ne%!z0JCcvhZSF;kFE)v{9 +Jb9XK<6Bv-AGWSRb38GAH7(rUIdJ#&H+Anox4tA5 +P>btk&M&j&n9IyDtV4)@_$fE0|XQR000O8%K%wh|0GbUQUd@0rwIT6CIA2caA|NaUukZ1WpZv|Y%gtZ +WMyn~FJ^CYZDDj@V{dMBa&K%daCxm&OK;RL5WeSE4Cay*yFpwd6(J!IT)1+mD$7k~yQYqv+D^Bn^uII +q=3$4W2ZRs1@jSkHkN4Je!1;dggGJ6kcD=D4gx1CjFO7CZu@5r6>??kcx;3`yMRO}|q`s*JFO{2=8lj +DrjZpF@axFScRi*Z5wNMp4G}uSvN$;cSI-%Q7)*4$BMWcjs@Y&c-_>V?=YgAnT9md!fR6SbQ8w;coeF +ztlbP#PF53)IcfRl?De1dBPsht-}VOtSM5z#nz%6LaHU%(~PhF?o9>?7L(Gg>`P*Q=9si+j?LT6)gQN +D0TG+HdFEj8PNAUpjBE;1_%|8p%ZXTSOBJFAHyA_dZ_hSy%2COCa5fn>j*I1YT}Z-Nf{H?NngW&myi; +{P{Z<$w87^nohiHMS>foX4i&e3OS_k=j~QjQ(raE9{V +(uq{&1QGIHKR~IKw7SdV3&q6s|a7HRMSb2jqHr|d=-EQFG0w&t%F%d)m-cnPp%x}`x9w%cj58@uc+>~2BhZp-kNk(xQWRK)w#41uB*yE +z_a#NXp;jR=P&m7VsYJqd$c0DI7#BXbcf)C;JSJipA=HLlMUTJQH;+S8T| +c92z_{;#v7H%YjFuF=77+_(H@6aWAK2ms3fS +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 +=G#i)wW0>)n(Vp6orK3>Ov^ex7q~k7PF +_pLMU_{Fn1-9&4f|>!v&*on-Bsv~>$SS7YKE&rSNwv8B!%Nj9KDDds$I&U%QV7ZJP`*_F7IoOAz7aq^G&&_;x5s +>-@mX^K{$kCjt~hNx-P!_C9r$TVI9M-pxmcnDI_k%Zfd-ckX`r|S)&xn{mcz`b*yU#P@cm6vYgu69=j@f0P&@Ju%W|Epeg<{b6CM!wHZ3u*CWHuo@2T +kd)b6-!+1UCZDg1Rd2*M}d_5A1Oz!%0S)cFMU-t*Xg#0`T)Uy5GTT>UZveck(r|%z=7qnH +BJzyemBYc=W|%oh`?sA8-Qt9@v+xSA1!K*9XF50M%{AQ-C{E0ylX<37^;zroOFT&CH~|N6YF4vHNHpOgVNVM}M=MGA +UJVGT6(X3$S`}c?Ha*c25d%~x5j~?t>Of+&M5CggnuH|^h +CLi5-_%hO8rE!1XwAp2*$7yXWA=d}?7Y6I%39=pM%@YD-clCEDCF5tZ}O&&nbWclg|`koN^#J> +Tx+T5+5;AqElEE31Px<5!_EKkYd#%;ktf;_&axJD7`H9rP*4e%mZJqYVSM8QG$~HW}`zrFJBy_hIqg@m8cm@ivB@m#kW7h_y}%C%Gx7J_9z +Z5rjx0S&vY>E@42kJH_;81t+e6e@dQt~{b7Ic#yhFuZ$4I;eo6;Z7Z2S7*!o}b-_WTw~SNcsv5ATeWV0lggK=OY3T_>b}KA{qZD;lY9T-m76ALKgx(48sjHb(K56LC8H +M(X|u`1cV39(>y$j%n==nx0mhv%bq3BCpgB9PDxV)KR(p{)~%mFaxmOtcw8A0PUNRk~E>+*mJ@8IIkm +Uj_H$6ljsDJ*fn6$RTN@q=drf!dhe0B8z*6EWt>NwNC6o7%4;gVVP&yCPNM; +#w#Z)sJHCy7)?UrEPB$92&?AW>$r +yz=HsS*$h}rpa!PlLp@m&u)=kPT?y%rPo6+4y7e9Ww`PbQE#w5__ex`c2o6d2zn&f*7GUd4DgLP^<1d +n{xO(h-B`VTh6eHI#lZ!yDD7)~Xkb{OQXAgpQrW!9F){&psJ>vI0F#&_#9lV-SI`#n~e5=pFw!?x-09 +Ehy3ZmSm#C^8UOs!hHTRXXAqfER9G+MC^%4e_Axri`uz!HmSM|g3A`WK}}r&9B%3uJ_;?BBu>NDxmW^26*Ud| +0qZDy;FuM1m*)L#&;%VvUFT>jW1OuZQ!y}!eaRGEa>Bzti2AOm)X_WZD%`@L0g$4~$}X4aw}C&{*t;W +Z2r+KzW?($@MM&zJVi#QJgnx_PJw5oJhX=nq``LWa +|0e0d+2^J${?}m*H0K)}o8}!uxO5)nBFtsC@$rRo(aq|Skp`yWACWBB2b&rI^nM4+y1v45>?=&yYI+5 +lQd*0Nvc{XVg)W$8I3Ta)$R0Vg0q5QnvNQ==ZmzGVqa-ZlU>Cg?Wp^|DYj@G%XnC5+{QXO4Oysr>tbc +#se;h|>&se*EcYZylOCVijSk={mArDTKOvDnp>Jo>|L%wdVOKIK*Pbg8NHZaRA$A?_B&!r;HgcEQtVG +kiTnTJPTCJ!f`7fN+U~(}Q7u`5l_9ia$MS!mWH#Z3uleHP)-+;NA5ZW&W=8Wjpr(-dwr6+se>3tlG-I)_(*`j8`ZkZvuX+Llno +ez)28H&y$Xv_+K{JeRHT~eRF>dvdw*A2aqgzxDR&lFn;&&%ryMbG;E!`P_(oC+&7|QfoRLEb5vLHy +^0I(74YqWl&;Xdp^F_+|Hh=)-Y78VU3`lGkGtM?1*j)kWgC7~fcvf(Q#V=I>uz;<&2RbO_lDTltlZRC +>v+)DH0vB5)%_7bbT#o(8RjTdqhYfG+0z_84(p7rElo9XjKn@=J` +5sP1xR-iW~P+q$N+kc>|P_!?R$=7*nN%#Xt0S_L6|`4k$$n6nQY!P8r0$^s9NyNZvJb;TVfAe5%xGk$ +deUE-u$w)6_0MoPYb3dV}M9VWq_L0X6!plNXtoxWw;zgwl1*|I7!svV`wdY}p{gvTn|2KOWD-?c(5K- +0xS(yJ59`-V`B=Xh@s;q!?MmS406Gttg8%VT+=frffUsY1Wc=du%x0C3Xmx3ZVj2x~mt>9=aeSQ=1N* +{B#gH`cgDf?JkS&wzHaI``Jo@uTsqW +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 +Z($p8Oym5SOng>ZvY@wY^5}5iv+9QNXp{hF@ZC +K>vN$&W!N+*6Hx(z3L*-KU^>)u;uZv9SwZo1RzxMVxvEa-XZeJ!QSb>eCmUVF2c7-oj)-A9=^CiZ|#hYqCNC+0(M><7N6^9lQ@QAIZJinBL+ +CMqV(p($nMn03N9%kGuS*_RFKl$GMdc5;wbjcz%2-~+ke6(RC0iX<_)a`o=?Y#&Ok*Dk8=u5O73wbojdw +(8RjENzp)%8psinZk=z(aK7R>OjFdRpaYsgcaoWiIL(bb7ve5L4jk9vINo1(6*x@$Tw|$x7@BnQbVw7 +5n|w+h55#1iLOoDskY#5V7dHF+uKIQK}2I!s1o~p|^iJRKc##R=4Pu(c;K8>&h_#Bmd=+QXa+c6dZK1dlK>=O-6*S^9b8Z5ZQFi +=QZyqyCbtCX$D;W^IcR>7#HaU#awK|Qz66Lw9Q_CWdV?bWdZ(s2Cf=o*b`dd&XihFUgfgd{eU<(zsp{@z9edn^dZqTTWP*yJJkq@b?L(LN +k&tXToV6!9_}Wt(fIt<-!=VE+3N;)KPoXL% +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 +cWNM=^5*uFcf`uy+6rUDMR7Y+r +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 +}ibEpBS%MOu9NZi($aLNY +R8AxT*$f3nMlu~*MX5{zHi14^rfHFj%J&4Ikg&f)(x(U)NV_kXlQNGV*E2^@cj*3t^|X$XIx?xa9Xy) +sF+8lOp0L#=JD1?D74}fDJ^iw)-D&clxz=eUop#(8QAlEcTk5!P9(aNXdv|tSSPuHtPPfJ>Ya-d0I@$ +vTijSFq|RwV22PRYr+KA%c`y>yO~)ai)C=}uuWU0bU0TN7C=M1$RpW639Ugs0#bEjMKGrv6jsyr*0hveyZ#Regh5a%#bI{M)V;*l^|op?+IcH+SOax*ufc8pxY$hA` +(qTem>qK=Kw>(W$Yai)1zQK0c6DG5<{g&pyvwk4@g1&bIAlWH+%Bx9h~+o~ZfJLkkSN(yTLs-pSeLf% +!X?g?J7G!!uaY0(l@sRVpua=$I-hkA->>fHmYS@!c!~P*<9;*t2O-2(r-d#>iprEg{Zt$2K{h5D*=1e +7PYccRV(_lbrAtvgzJuzaLnU-8g&$WKx!t`)58{evFjM%9pM#gS@4Z?5Xo2YE`3rf~poPei>AmA!`^q +)QI4fNr)Smz{o+KWm`Uw8mcG6`3fr=9Z1NhBMt8nBd=_R+BH@w74xYea@M=2DIdvk|l +oWG9M}PIW5Z?7O4mGLFHb{Q7q~KI9ce2-m +qS$uljIApTMi*dphRQubY9q#WFetSymWswkEerwGcTNh&ZfJY2}HXDuhJHq7VTjJUx#IIg-L7!;`)Tt +p=;T<@^G74nchdrvAJ853sSE-jw#Y+p$e8ddSpp#w^u?sQVe1Am`^We_WG;>AC^OqqADXY2G=boPkWM+yDYagxqWbGkh +tW{qHeAG$sh&?mQ3<=Tb%D_@{>X44AJiMkI#rA=RyHC^J9w{4q8vJ8Kfb+Ue`cZ;(Mi~_S5?;^rxdny4jINn6kd^|AUw8N@{{llOU=T*g$S_Ug>AYY#Qs5Olo+L8dEcE^wr)d59I+=hW|~&swq6B$kXa4T{f1L-YPe +gD?f7TxA!hRwSSbN9=O_1==`xZV<4~+DOLP<1yA>Mwdo||AY`j`gv};gz2s)en9br!pt$W+LIcWEJXW +JjWoyJUXEnoU1B-M+WH~5E0>-KddI=N0;iR)dn^mZFRC)L|u#?xy3(HJlN--~fSo{&K5Du$i~W8UMEUqeu`GtR^h+2W!z_J^8mdbY`W+mn-G`1ym(x1)MIK#3 +m0lqbgZ}|3xbI6r^hGHB1|_!cVn!1FP>%J?k=N_uR11EmA?gVUbCMQ)>HYMLi2wGD6e#yw*j7BbLDL9 +3OP|X(nIj?tTl{}eO9KQH000080LuVbTY+Npkb(vP0R9pH03HAU0B~t=FJEbHbY*gGVQepMWpsCMa%( +SRVPj}zE^vA6SWS=HHW0o0R}jvja;wz>{kXVD(I#lx1&TIkQuMG`2$VEhF_A=-q}MUfAKy15^|kh*pU +3*Jw#DIa=FOWo^lrD?@87tJR#oA^xI@ +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 +){G82yN;^yPs<;T0^;{BJ8|4u$%f4z*@t9#E%A +OcTP#kFQH1Ydahl!^+io-Ixod@5i7#!TdFA}B+mDc}qiqce#ZEH4;%A!2ru3x9hvHvj#=okk@j)UAL# +Di~+JA6dEnhLLZAY%ADC!f`V)hJCsH5T6kH-BxPWf==2exCJ)Kx`1F!$;v|QSuUD%OHy#-Bt55}B#s1 +O4scmuEO&7bv2U$zm?+A2vt{6GVzG9C=(RvDFu6^^nK6mE&Y5mOS8oEZ1p`=Mz0;$YPK0E@j_7!;NQ4 +~xew59YAtFHn-2fh;m=OHlyL`sDX3x3tD}H`rS73B4cs3_DAd+EL>OKjLdkP^kjoaRq@Qw75CqoPI5Y +b=01`b|i01gV&;YP$N&um_=QhW+^b;q1&f|h&<~g6Cd_WKgD7h)hT6k*Db4Y{^nwZ5VC +Y~ffABiO?9s{_ILv9t{Auco8CtL3s=2L-3?u@EUyiMnC_-L{lh0ppV8o9j>UG(8x$%j5HcD$-YhS9-$ +cf0EG)}U4VSq{P$#r&*|H;Trb&f`|XDoCQ}(MBu8WNx193CG7{lBD#Zht5J(TGU{!MVMD(HEU~v|3Wq +r@qjy5Q>i2xfRiLak|YWHQ_w=?ui!?+2+I-;IJ3Z$gh)C>b&^O3^RX<1i~cRdF)&!UG5$2^f={B>OAD +qm7Z@W@4Uy6*?uWV{xLpEtsD+Pw~<1$yrB^@V7gXrbMxU>|df2$g0?GVi +jDNn3#VclHh(eVxBu8mv&Vu#65jr6JkOlL%6 +GKvl!Fh^hX-;vcu|q20V1t=E+WxR!tZu;|u`p8xKpc$smTpD*kU-}Go}s0G0H9THA3d%)Fo+(EgALP5O_j%h;-IRt8m>!!ZFib_isOTfghOx}CHG-#g{00_1X=4VDP#{I~#fKhFQ$4G!c6t3s7MFmT))eUcVwu<2A9HI-W0<=a_6e +&a<Zo!DxYPGj=5&$s@dQ9(N}0_#SIbM~`YzhNSiZ5 +-E%QZT8Pu`BA)UgYiJHoh(8U%KkPq +s8cf1ZS6dbjNti@X^bM>VrcEQJZG~P!pMXT2^)mckENv_y&d-tCnTbQjo>oRwP+}YspW$B>H_+d41(u +jvTg}*0jLCrai-LgdhKEOLbv(I_*$2$ZA4Gx#q?*efI4?l51a~`itmmT)MgS36}2qZuAciBcDi7n>DZ +vhx2A-s7k0;6)yyEaK@`*5vQ-%d@$ayozk34C7VM&}YbdHt=bU(K)E8nyCizUiF4!gP)9ExEt!^RL_C +3pVS{z0M9fR>e=X)-wp5up&R|qw( +8N3Z>uLC^t+aA_S3Uckw>l0(sf(W*Xt6LxGf(C1Ff=KHP}^IN$~kG6z>l?T-j={u9AIhcXlTK2q6OX# +Ko{MMoE%K>;~D7KCNXFr|B0G(bKJj(r*wf=IuoUNDBf@(eOH4=S4zDG0L8ttzQ37Tq4bEkzxPvq;s@j +4gAjE6WJdb~C^eH_@^?ul!?xj#!|0YM_YD7YED9b +^v7d2iN`a)NPG=!^NwXt>FF9DpHNf^e^L2RKnmczLM%9FDeS_M<~AU$gVfrY&jwbEDufqSA@&n7l^Pz +ix`HXx%L4LdGjT#Tely0-iL(A~xn34>>p8s#x^6q*g_NHrUxS?wCw?v=z +$M+q-*~hpuiNSkuD4HX4kNCewiXNuX|popcT?k}W@lnIQ+GF}Q~79aFD!w%^B9g?)X17(f>khL5Qx?a +(CQl%r)9PGlB*wdY0L}I$lOej%Rfo{i><-LfYSUIqtcVcj@HfEgrsG +Apq?>4f5Z&J^HKwt5@LF&5DDmm6LtveGT^Qyd&InfEfCJIU(%b&&C2HJzM}7@6?-MfQvW8g0OE$$TDh +D0%fEc{U9o`$D&xSHMT{SBHMk#&_E3G7sT{V4sxSBUBIw(?iANhA9{(`#~LEdiKfB|JiKki{fF)CJzG +w*80U^q@CD|kdIW58;Dw(!Uh%fChJ0ihf#%Fx;o+`^pnjX@)K2tHKKn2ccEuN0lx51`(?1u>HSwxobP +EQ%-vRwizh-sCR4OEQj$8139kAy;mWCeL&=eb?1cZ~FE@3pi8NYUo?legI&v)GrFwrT54^JEGF=omRzRTz>|dKGCx$g +h~!d6qg0gJtaxCB_(vsFiDQ>?RTaFn;1*)dA7xeqBhT|jqh*n8SQsv=vMNLvGP%LUU}Tz=G)av{rcG? +POoFPEiLy=0Dvio4YZ_!$f6I9s7qAc8@Vm-V`#s54E5P4AZsbOkyIj;`v-(?}@N$_I8~d!*h(P^RE%G +9ZoK@7W{#q4DA{Rl<3ngsZmKR7krS~0WNg^WJWxyAa-TZ5j3ZPh4OxPQq=P-W4Zjhj9B=kf;7RhhM`y +&Q_xBq>85uX3;;{2ES+t(9nI!kx@%Tk-OAetGfg?EU3!cztzs`Saz~`7aZOK))T(-)?WOyQn#B +pMkUi=1*!k*M)$C74bXWJz?*J%HbTvXCSDus3PQZ)euaHIZR5GEajtkDWkGK-yA^z#7;H0AWXiHM*};cEO%aJ;Xnj&yfq`cLthoxyMC~8Gf>WzC0)EF+*gt$DRXuu9$s`Wp; +6of9!uFFanlMsC=4n45m{xNLf+({P&|ZTUUba=tlynKfL7G{z-dv)Pi>Gqb^bheP^6-YId?jkFgADve +H+^Alkv;9Yld;Xt9*t1LL+8w@`T*GSlG^+*O!)?E4d}lc5`e2h!Vnl+R(T@sKujl$KCIfjBaL|nl%kI +N`}+}b%qqfo;c7o}B(QIL7~uejMtaP +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 +3NASIx-DTfB8BsDhV9b<1t>)PBXg*y< +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 +e{r~=m!0Q(-f +?zE|q8a?VNPpsy&`Pc&3E9xXRZ}u`AWL+4_AQdu*$dBZ^V@00h);%|VBPZEL=bmuHX|u;vGya_yRVcZ +DR3XF;fT1`VaV}3o#_pi9ydWRoM9QJ;=1+LG_oS#51t%GhyFFlc)OHltLDzut&CIkBG$lRjiyvv(Fc9 +&Qd}4=9N%z}~lIJyf*7g*`-b{pkri>jB4?{eDnCMnukIiv^^1Q}0Mw1-7?F#$0x&v$b=ejAjK5As^wj +%sATPbnq_QVBlH5{Dy(>3E=LzC6RhP>bID%k@~55!-CLojT1kvw?OC2rssEIJzCm1f4ZMQno)`N+n?QYFAE3GHHJz6^99RD5L +?buCKo(d)b^m4q<5o#Js+Xc5Mxr{Nu#T6J$3gQUe1l>yf8%|=1tjmquE1|d8oTR74o3Il=g3vU(N3|co{M1(CFZPV3X2YCRt#e2qFm-GM#=lr8Pd2Ia4*tQu&zsn +m=K3@F>Dh7tMqT8;rUo-@e-h=uf%@>#baAis9PdawG*=T6*{ri*NYH#DsF(w?&G&gs7a6ud<7l=$BvE +t5Gbt)!!Nx~OP?Q0a=`?R&1vT3zC)GYKg5XJ5SXmK1_O!?_SYYj`0CLSZLhL@!0=8+$KM$GF!*ZKcY& +M!_>uSX&mnuTdek8#`i4K{k&^ZyIa$DQUALh!gY0+Z^UJq!w?Nl}pMn|z=fg5Vyz2+o&y-bDz>8%^4<4TU@F$nbs?uOb +DebczYsan^KsJ#SK5Y+*-Ep#XKKf@cDF9cN=s>uk%^>lLR7v?hWVGD&yQat_iPX&@^~KFx#n?A?XAA+ +*R$Oh8ji4TW?1ZXZ;lJS3j}z7{hs{r-M6Is>_w7VFbP{PO&+U`7Mer+tPe%P4r=r;pXT3Ch>)9&i>G4 +bQoK*p{Ly!0T%`SADQW8({5?eQmq9*WU0y2oD#z4!xAO9KQH000080LuVbTa4r$p_Lr~0P=7E03!eZ0B~t=FJEbHbY +*gGVQepNaAk5~bZKvHb1!gmWpH6~WiD`e-CcQe8%K8kpP!-wmP$YZj@ElsmRrb1*0EAWl2tObPRiwi8 +$g2?YcMmO9*}|+fA_qj@96<4dpDH|t1J_kzTfqGM-L~H$=gn~vQt_}u_<-mm8(NvHnrF`ohWPF%c_$2 +#bh!$J3ALwI|Yxbs<|!eYq4(jdsX*B@0vrk5i2D+wQp|JMo9Rw*(=dDB|I-{(PPI$f9O;J!|adk@lxP +)>;9r?aRON_p36$Bvu)Sx#d67wmrGIZ+otPq=@3XJHz+uee1k`(0J8?9;dKksrVk@HEW#SO4|)+49MYXHWj)<(t2rnXYA9EN +@i3X}Y47>ksl8Iuy7YK7_YNW+WrkUz;y ++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 +h_IA=nxfNqI(O$mWCc=>hJI$8qR +Q#G~G@cW4c|xiK4L>?13&Rlo_pUJubqg04aXG+r~Bt<{ +XOF^2Ft?>wfm0gM~9I%MMV6MI46f{+!hpK{JzzenDSVeBMAkVNE9N72L8o>JYvezDRdUtH)YD5m)AC3 +7L)+h=dZAOG;L!rfOO%P?n#++rwcMG4D>VmQJS?PG0%a~lV2#y&{GE)X-zNwOcH*%Nvf`<6T +tLY==Oh92XEAD%~;yJ|hAnp1eR5a^V`_if}mevbLgaKnC$-W1nIA#Y|wS6frD9CzCo3 +Xjhp5j2Xl#8A>jj>QpzFI~p1%fXmT?*apUZvc;h}J_|ephG%i{Y#Ro_aV$}XDw_7q{4V>*XTAoSqPrB7)hN@?qM!8H|cQOls3Q&g72@dji$h5Vh!{Gva@d +H-rn1gDxsnfH=WDd)e;g6S#pI+FIBcdommSKwcNwlNi&xG;*k0xV3E&*w#nzyd%&zxJ@~YC|}qaDMmJI98xh0(Q|hPhenx#rxQF66Mk}>A@a)^vB5?!Mt$x +ySKh>pn5wj1=9gM0PLz22e#!=2paXZYRT3S6#a4nPqr4Xt-mO&L0dt;hoEW;>b|gh&2ntTrDAAdm23f +BH5EBEd2OU?q5VzB%XDZ^x`_R4OE}1%wp>iGvUS8jttQg&{oF)-X+la(z!EK9(wZbUr=bB2kkwY^%)P +p>+aW->`5HF#cdSdvs&}~)r)5$pq$`{d1i$N)mtvVUr<(#r;;l;f;zdkJM8NVrdf*&Riv?sFZ0QvxiA +*Bf8V3-;2=bR=YSFxc-t9lGBc6}+MdtiD@WKG*DD%*yR`qJHI|8@vIzl#PKhN*!L +FoQHGqkhtR^7b840HtZq2xd6Ti(88~~6jS(ecwX6S*$O4$U_zuFnohE2xMr}21xH<|b^+rm*j}qX818 +$59T>}Ax`_1maNb-B+Jf3_JFKjTrZ6FANgjC^sDV?pPJqT&H8hw^pepMx5o-8S6MsC^cG)+}?IC18lY +{1a9U0E!oU|PT=|mvDKEcV6>;&i^R}jl)eo5cj#^14H;;FL2&4o2JF%mB5`E+F1;)6OO0CtQri?+oj# +#GzNxOX|jZN^ic(k)MYMIZCb17ZWpT=C#`>{Pq_X!L0AEa)7f_UGcAS~negC26T4m5gGzoJuEVI$;gTSoUUeke_gA@nnr +@d4=O6v`^oK%T4B>3jmy}fU}}>4~6=Zv{`8dGN|2jaqncvFd22*m`jeB+B>u`Twhl9LJREqGq!jx9&Z +MOPYTI%FyC*2c94wesyz78CKm?a{j;cD9Er_9FUu!*Y07!4V?`he#**>`2;LGXQ&^=T`I +0GTu}I;0e9D2^mdiO*m}t<4HGW4jWMdz{$e4V-qH~G&F;bE*k(lowW_6-xj3quZg>A9HxQCF`>)5OE3 +ID7xxQ*~q88_ESSBMS9)IFb0rliPSn8%+xN(9aY*XWm9V~i_xBWqt|ZwpmiWOAtBLecSXC2AKcxX2kX +LNKgv3_@D2*yV(afX>^IfTi^#<8r>Jiz?OC#LaLvv}ANoR^Xc_>Y*|TrN@Y}fxV8%cVP#SVCJ2v4V4jGJeFAOm(C&`zV# +mmCw2TPJY;!skpL_7Aqtiv@JD~*L_b0d_J%W915doOp%(a}s_bAUPd^xHe3N#`ahFB*ok)4j8jiw3AD1GHcFLc}c%aaq*c)> +L7Nr#LGVjZu_@z|>-*|_To_=-dGqL2;^w=keA +JNWbz_s1v1wH&c);2NHZno;2^PfZ*YWo?VJyYgq>X*f{>ZQb{-gIax3w*B8Ealw^9Ys%h(YjZ^?o$x +_^BdfAE-|Wt13GLW^a)_%6fpJ;=!^n--~8QUsIGji+t25c9l*9r$&mMqBia-=szULl^__-Lg!yIjUfh +TkO_`c<;mb>*7;N0PM%Pq3=?S>(*Fb>es*FHa)v4K5h2)4xZM5|EbC_ifA8PD5}%MTKcA9YL!}hi{8Q#c6FJ{TwUdsw&bgAls(4Te7CTF9EHhoa!8Z@!+q}VOer2!gz{6xjuC7-RO_Mlknpb=N@;_fc +yQJ4g>B~otuFHORSm9mJNA0ndkJ_?*RBC-t`q39({OR|<``>|Hmav}(zr2v#1+0j43;*)$sqgCEm|E= +A$4z;yFejWrB;Vklh-eQLI$UmHq++lT5pcqWr~%q;RaT&!hY-Z1|A_i{5e`e080-!QR(ja~!~tOhU;+ +^Ew}1HK;uC)H^CVOWc(n_aConHg)7g|F=5>Q+RQuT7D4)wF1!!tFvbCD!HlRXU{glh3CkO9WX~MmCy` +(!BJyRf@yp?FqeM~mI#~8Xw3l2<2>Xt_^i^(|u;@rF=pC< +gvlAqQ3y+K-hrxIdmDCTs +eWMlR1H<5zKFd=)(b^Et3Q(c$=-UHguM0Jh#y5OJSdXLM4Z=Xjw1o;wobbC_+fT&WR9A?h&?oJX*CN- +-K11S>j|8x?4ED`Q_lg^Y~F?}5IQ08&I&02NS%LeZ#?LLG9pAuaH2x5-C3(>%Sxs{ ++SrSEM=%a@4^B}n-h2-X*q%kT&r&eX9UZ&?J{T)le+YNxiT^U$lhwr1$0TU2b+??Rpv@(FVQ_agKp=jse`u&FM +}ymtjJ?5e;bG6hMo|yq3QUY+sWvu6*6(*eEt{g>RfzE#OM7wD7OAoCmLx!z%w#?M^St7SOLhNWd*O_t +4HHuGzmVM`@pve-`F{08mQ<1QY-O00;of09jiA00002000000000g0001RX>c!JX>N37a&BR4FK=*Va +$$67Z*FrhVs&Y3WG`P|X>MtBUtcb8c>@4YO9KQH000080LuVbTdQvEu#N@*0HYEB051Rl0B~t=FJEbH +bY*gGVQepNaAk5~bZKvHb1!0bX>4RKVs&Y3WM6c0VPk7$axQRrtytS`+c*$?_g4@uij@mj55+z#3}ms +rq>G?Mu}D+wLr^HRMB8j+QYEP*-fsVW&kS{ql{OD+AW1FG^>F6Qs2gYZBFi>)sGZ6(q4$+_K}ch4kU? +AHXS3#6ZcR{kq15a4$xiy+;A?5OTWz-OSLWJ-cu+S8JJHU* +PF13RJpEGmQ|Ok!9-CSNg#NA7oj!if8fbx%ygbr}oN(Ddjro(x*Y~tE|wjbBgb8pp_%0!)!*`C?`(Zw +9>5#@A+AhWk&9S)?zlB{n5jcHvim9BOx{`)JD`*A%n`4xyhQ-tT|4eJ`LgHTv{4{AWIeX@v|a5nDHf4T4Pk}Q$&m_z +*9NvpeDRYAN{hg0XQdxV*Zbo)RCE=aVEK4Lox^Pp8(#B4QcsT>?V5$DR|@|3VnZ|StX4}j3$M%pR#c( +n>WXu}+ik)w~^9I5%KEXP{(DO5R)DkEEZb*v)2SLhM#x#3K%lCke)tYKh4N$n5S;mE{2kjMHz? +spsZ7Qhb3E4kM)ujue1o=volvv%A#)X>TNud~0hSD((_zsWAnU%q~KdOnY(f2+f8KzZruoem!ZjKi(; +A`f>xNVo~M4*bdC7`?_X6yO*H)bcCBtrH?%2)`DCQ`+6N+ZB7+H)&mlkS +WZPyKw!87*d=4Mu7Re!>ETQj^FS5bmJ%2=|_sC@#_Ho)rldQq-8w=bw +!JTC4IPbb+k(=0Jf!g8o#_-rzB8S#GaExX1^}o$+CGo#|8KG4r4)i6Dh9&^03G$tN&c(091e;8nSyRH +X1K)D@pJqa}?P{Jm4AH-H+boT{W##S-dm+?rS*_+uk2Ik2hb{)F9#tE*wqDQA@|uC7vXhIob+gx}d)F +W78eJFjnm*Ah0hkA*L_hj&C6NfU#(iTna00Mk~Uy7pSE?SAcr+OJhXup+QMDk0alMpE!EiNzV$$RZnT +4jT26WeLF)E2E!g<6a<%G;6wn{@go3CQf%_rYnc##7rNIoZ|w1?G)Of7+1q8R&F1|Vwgkhr%zz|A|uMB~%imzP +SKx=M!V(Y+lq;;E(xuGL}Hw=W5EM@C(l +1tsB-Nt4lz6Gy$jEDCC$V|8MlF-i9AL7yiWPl35#3qjc +a3YowsDvu=hMPumzn4`;K2;l^23n=x??oncXdWH-1UF0QE?S&I2BIE-5n+9&fmY@Yu%pS&pC3|BM_?F +1eMtHmg|OGHhq4UyRceEO1S&QpJ{r|?qp)Xf>N2lyK~*&FqL^!YhkdZ5+0n||EvZ&axQzha5JnL^z6) +NK6FI&@EE4PP)L-d_b+tu|DF$z+rFz|!`94DLg)#+(?~`x*Qk+LrIT!8nGDR(<%6)r@*9K`qHBwD!&A +-m44CH222d$22yb!Tmw&rUv>CULxA0;wtr+a(VP?c~d{bjq(Z>uG)37`(KJjtdsOvH9OmYR93_w(de! +08LHcX0lyTqb{cYbWAiv&?B%{{T=+0|XQR000O8%K%wh)&*O!T>=0AjRgPzDgXcgaA|NaUukZ1WpZv|Y%gzcWpZJ3X> +V?GFJg6RY-BHOWprU=VRT_GaCwE4O>f&U42JLi6@+(~4Y&q&7zPB$4&Azs!-it(-B2thW@}4=B&W^4A +0@?3+%}yqwm$fhdPpkI^IzzN6kfm%6W39GTJTNi%J|p-hs7G04Ef)n!AO*KKxA5`9r#g!Qf6$MX)8IRtgO?{MIo+?G+{N#--}u1T;JId%WSEc1fRL6jqqJM7_xRoG_Hm54t{IK;5%`tfJ5eb4AdP6*z#In +AKK?k#8@=Ko-)|*c9Yyac8Gn&tp<zG|;1jo +OJqx7LWB_l}Xp!H>AXA!;sVe4PuDu@mGB0P%L@d!b>xL$|DAK1qkqpDz!*U^v@Vb!N>SK;3$^RiM&U0 +HXRMSiFR^x+kfZ^w5I98Cui*G_4RKZDn*}WMOn+U +u9%zbYWs_WiD`eeN;_v+b|5h`&SU&VK(4;JM|DCJ9O(l4jYPXcSE+ASgkAxlAJdGev}ls@!HfETNe39 +zDKew%b(~OXP&_x6`|3!6dy() +o+9M4q?Wp&biVy-XRM1gW&->#L~EEIlVOnWjM4ZnJn!I_CK~+6E_HH{P-0-+0fQa=3*3h}Is-8 +l4YSV*c68mPaE~LR{E#(nX!zifW>2g49!7Sc*!m1;pgtGGK;+hF=R_~0@W+&)ABBT3edLcWAm9@Xak~ +JdW+f)x=-O(rj_TaS)Pwjr$7dz0W#(J2Cs~(^YrT9WW)o{?RzC +mqHxH@lxdIg-e$6Lz+m;($SFEg@CIJ~$=Dnl6(pWSKHwx@RuaV4RKcW7m0Y%XwleNx+w(=ZTy_g9P}t&~W`5)TNeQh8W*5l9GD`vaESOj7SUcCg2k3ix+ +?X|ibx_{Fz5Gv}O{&e;Kk=mG_YLVy}Z>j +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 +IxrsLK{CA=%{8`GQ4;Mk9;?;EX7TU&tJ> +>Dd=3sR&Qg9zE3^9l~|Ia>Kn&vgI=N;7ts^e$r}LmAB9xhRq0i2WiMF5i2$a&D5PC*#UJzGA0jl9X7` +iaEHIL6ESlIzh@0zqmKOt_$AIK)&PNbAhqF?UB^6lt`30I-99O}1BiKsNF) +5evM_{baFX2iiqANwG;W)6EU95aH!jdz?uK^+4`>EYkK$?)#P-WyvU{F8c1G-H{?d4>RZSFm;~XbaF^gj%#O=w0l=3a|q9bR2dkEqyms +B4lf&7_b6}tB6~wtFYs%JFl<7>5M#m)#@AIL}qPQ*SM9Vgr#{L^uP~pvE*0KP`#PHnjPE)J@T1~NEx6 +7)@uOo185>;0{jm+pGXnCfW30%=6f9oX?5$$5$gID7*P4*4A$;zk;EZFh6RVWqcPLf8WG@zj2^;{&6n +VZf>^|z3Mc{5M|ut;c0j0YwE_1;ub_Tw +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 +k8;o9CWoF0%q8nAcT4imgo5V9x) +Qp0txe~w^DFi@-j_t4Ri#0$XRoGf%#Q1H26@&EiA^oH5rP0ueBV3kYBH62VaEsa$M4xck!n&mU>Lk7~ +eA?e9!*F>Xw0RJ>bWwgl*bc?`)3LfaB3BESn_YBbf^Pe8e8`k6N&8E5d|k8#J{uvs=x$NaV@H$Vp}OH +k+x3f4p;ds-FGu{LUZmerfApI3R@FQ=ZbONH$5=;!i$c0h-PF4*qlJV+hCL;l!C7Qsig#R*oz42{*tL +9^VikSaBw7Y6|>Dnz`eZGk1J4#Qap;thXDG_U1I5Q81Et4vO_f*qe~E)GbNknQ`z0lSb9b7>s1uy4ac +D-a`_33W6yTmK^t;YdZHB1R|xgK^mSL;WM^!{FADytcPISa<8_~hXPAaIbl#U7EieFWz({6%V)1-HKH +ppnmffwT6Qxh!#%(r{lFWdfB~i{z+gO(7hV=cg7$R&C_vCCp*?u8;>EcnsJx>MA;L&zlvLK^Dkr68l} +Dp3)`GVnfp5K}lf7;e-nOQ%2jUE@e5&-~6RLVCL?fw;xezR}&gY)Fq!htD_?wsW>w%~9)(2$R;~@o<= +A@4(5Yh`ZxT=Iz#Z@*oC3NJUJ&i4+O_g`_Ab;OEC{L71Zkdj6A(ti6mi26qWFIyKHG)k=L2<;v6x|u# +BHDwZy0GDPFF7q{C*~e%47%`1=%MSn2Xv +QaCp{n>pfp?n*PQUz&6h+=EjFr(YQlfyDDkOa_+>e9V@8uQp9}TmTd7}-499OX2D)SKP1FYNq2!Jr?6 +KjD0hX0fIolC>aoh3c1P(Azf2;pmI6?`yXwJAZ>0FauJDyC3^5_Ve2c>_DX;^~iBUYXBb_|$4|@fV7k +DLW4rjeHgZL3`%+9~DR;Y5zLgd4xX;~4_6x=>eCejM+U_yls%opuN>PAp6r!_`S#D@?AU_H~xoFVI%Z +4+r<*xh&aNpnp>ql{w<^cxHmsh>3A_8|z2inS&S%G20&-UH`rI8|AOskL_&NU(N^ej2vgHu4G6GZ*0AP~l+`E?>PD4!{?`sJ~(57w +zWZa5o7h{H&svCHVRpqh`t+1HE#a{(7dayaj@gNxqK|$q?8uoVZJr$yz-g-$@0J%dFwWJom~`=k*w}|Ejk;P|eP!>yGT(KbaQ$LrsQD`w()Sm(^vd +9P+I5(IcCi$+a4%(JG3mdXm&oNae|Z%#NPBfH^v2_1b3cpT}j&lc}F66OyA9?1F|Xi?0Sqy`KE+hWh5>wUZp|S5VtR +XbhsB=#$o2W+75Hk49#2(&kuAG+d}&fVf`zF!tSn$uB~mr>s4e4pi-A>5F3-$ftM=+UF{&}8Jvzj6xS +-I8HWj=dN5h)VJRS{*cyAE@D(Fg)29Nk+nKsq>;m=WGd#~^EAxU$;1kahO9(vRnE+C|jv&Y94J3?JQ& +N#XQFk3!u!gyrkmy_YN*=zMk)`vA6S*AyQ+y!_QUQEBHBfuxFh@um(9MjRuVO@xSPnrbjhZm?h4EAna +^Xzypb2+$QE~a?Lbk9juDYc-RJxp$(cOi?th9zKD*D4iXKJI1BLN?u3$IqtlA4a8#w~n7lIs|K=Gw(J +I7eDZWYWqIQpfhG_UE!*?8%WIWNSy7uxng)c1D=|rO8(w}$@i}qqEM6o#y?>co$hSe0nM%d17P00^I< +>%TK2J1>>mp0xA%zf__U;(Q!M5W9J%_}HCWYUpn3I7m;m#i1N-@9{lO;MA!PU5bVs-Dh&1vTe`K7YS{ +gEWAFS;1-4Jo6F5`Sd_fd&5+M1(`QY@45MFedS`LbqTE@5PUA9^Mq7ClJ%qR4*R(!R`AfC28!*f61N? +oCzqSOM)$u-aNTI>?I`W&Fwej#B6r*3NoBHf67bnYZo@m(he9I@qgTKdC_M<0j;8clV-y<44aK2mw&w +Ypn5DCVdc79LxMqdm>7HOQ6jYwe@z9w$-Lth;}1Bj!D4UYhF2%Mj0IX_q9)Myii9UEH`}MUx#rPG+e&&@_2R*l3yRcS%@JG-WZRpjEYWS#C?|Cu4LxjoLnvlF$3@V +1F>K572=FpvAZgsZYChTE~!Dew@yie^Na>xoy`FjhI@{3p7M>irja-Y|Cq3Ny +$6&8r%`@e&7jjg*7UF&yTwJJtRB_tn3v--GMTO-=WIcv@G!uCo%>&{&hi;>M{S$r|6j&6h^cumY`TPT +T)8!MIJ$VebBg@S@iY+_8ddv7ziUkoSu-SZchYVCi%W3%*~$TEa9Avhd(Wn7Wr63{Y<1-P}dBCv>Q{4 +a^?Kp#8No?U}k_o9OYAlNS$u_~H0@4!6f9T9-?|<@c97uEJRgrQXanC(*y*?uPvT*vo}) +n{o`JmYJkuFEJhIe{P;g#9-q88e&k)0zVd1aJ@%DHAH+-+Y}CUO9cl<+$q|YWA9TI{&V_{l?D;ajQiZ +Rl^h2L?JvY5D_s-aRhNuf&`XP#D(OytAm +B-Qlo+f$xluN?0@MZ$*1FpCAmM>oO;YGBwnuv;g{JKU2t5sx_NAxFUGw)IQ6L)gFOux}-0CwRYG2cNX +vx=tvg1k-2jinFXjyQH>BK|{l_BZHAu77)*(h5^~84pTejsNb{qf?53Y78>*r0OJ4Ns0AAvKG98()3|s$yE4FEGNg+>A`9& +uo;Kltf*b7J6{MIvg-peXI0i2GY+5aHQkI0f4hAT|&?&!B&FLB;S-Vz4Qm|91zM=bwi$#Z1CjSMwHr= +zil!>*2YNAByenWfy3{T4Qw?EN=TO9KQH000080LuVbThGT>edq%K0O1P&0384T0B~t=FJEbHbY*gGV +QepQWpOWGUukY>bYEXCaCxm(ZL8Zh6#njCAyNi5)xLfl|V+gVL5TDV1fGD`|=%*jgn7w398EggT$OJQuz5lC9V5)J9j +ofdtL0(i5si_sX=z2L2t +PnEf=N^5V!xsKaZlbV3Dfs+ +;?yhcVqwOYA^oEJxa!2*;9~9g?@5p1dE&&XhZ8&mDWS_99LV4J_U|saxpNR*<^`XE3hPw-KLtEiDeIL +b|4c{p){6>yFRX)xo_}83pO}`^w3-jD@LQj~134)rru7j^3I8-T+(N!E+*@@Wus0UQtV<86J*RZ#XUU +2rWMsFSR0{wCH_&%`@!ctjy#Vn_c`tS0p`}&i1f-qPzzd({6}#zw*|WUn$-ErK%=!yw67G^uD8JUP*RB=xe3RI1k>uef_TTQVPfeR^%o5F@&&ib#Cxi=af*g +5ge%~%OdWqOq|x};@N4wlnv{QTCA}que?1xMrfnr${#juo&clM +78}zR4eSie^qhNuXhs^}%hTz@nn{sZd)wcWDBE!MD0vl!A;_E6!u2vqN(IEdMhtS +c1*^9g0mWNJ=l8u;?R>_|0Yq&siS0D_mgKP)z3N5f!-`AUS9+Ac7G2B3H+}D0{*-h5QeQhsKBet1-wj +o>7w%IanZ(j`KX7TnFN^wXx>1hr8LjTV#43@m|KkhPE;a|8yjKi|S8_^Z38QT`1!&<`Ob;7abpApigXaA|NaUukZ1WpZv|Y%g+UaW7+UZgX^Ubz^j +Ia&s9h?v{Z_NTQb_7=qljvfcmv-g^K@fTX +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 +mtr2gd3r(eMVI1Ovb4@Zt7m2 +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 +MH-}^fonDf&@i!F(rc=?tU5_acp)pl$kIL#? +zpUdN<0IT-0em_rsiOyZ2o;X=N)&PXh+!{J>o~TE;rYg>*BY*SBB8NSLExa<7^Qk(qUM9WJsArRAMDhfiUP<@kQ +fJU#@>QdOl*a+r1X`n5O#q%HadMsCNwJFK-||f=`=vqqfLlKM{)>ECiKSV9!tOLEhEX=$oj%QYuy2$( +DLJ>X*(L@Y$n4$S^^@)OGW1h|aS))I4O3li1`t^j!n+K+*}gMn#Cjar@AmJCo=_#|OP5WC$<3=yq#6Z +TgWDik%pg`T!FRL!>haipuqHBrl8OneLY;*j8`B_V{?AfxWHVmO3V3IAL^WH$AESt-8w?E_GETpxD)zA@N98mMm +%RbqcR1Zrf>+>ClPWVWuI4r4Wp~%uDZSKdZj9-mcLag#T~du>x+ZgM&9K_lRj;@~pz>F1^EEdhC!9za5WMrJ~99ckK_zNH7%*}BKjhkgOm~_%)wNY^uX2-^=G?uyGf#%M+(Zt_n0 +%vGmN11*>vRYBzn?6+Y$}JChqJy~M3*uAp=szQm7>DiG)o1H*6zhoNDzyWLVRI*1)wNK`xFm%Op +uWnv?Z2WoA`YX0fQ`yx#}i +j{2V*7rgQ?8IUaGz;mLl{l$KWtB8I0j6s_7Opt7N{yn2TK2gbs(r!lx!;yVAK{*|*3h?n%UjQ5if>v^K2 +YqiDCJ=Fw+YS7ynawxRw@CQkTb5NN<|)5$pS2r +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 +Q~mH_#nhozQ +J7xjEMPSbNxl(NnBXS3y8zhU6qnNJ`>tYAcMBC9}sQ$N=9S7x_~^0rj`&x(r +i=SlCXDgB^D?6{euZXro9=a&{PLo+i@RcA?p3IP`VC0&h6qk;jwUyTCrQt#LLI?I#ai@sTVfOJusl^X +y4Br#2Cqy&VXyT(slP0egr~@Vu%~L*pwkpq+%OJ&N#0js<}F{OPNg0B1LG(75aE0a(9-LW3RO9giI=q +Ll?rWV;MwGy=TpwyLqMln?;PG88;cb=(YCvh)4IV-M+qK{NHyZJ=YbS3y*km?sR&E*vZB1x%I9kSD)c +MXl5up-@Y&Rm@C><_xHvK(8LUq80vEK{huN9=PO)(E-$VG+$E6;NY`(GC+i0ws^kh6yO +<3gcb)M8_i+gJ6#VSEAf`DO8|M-3&{Q2093-mmAY=j_}pSh91@tSaP18@a=WHBXf3+kTGPy>KCX@=%Y +7BCwP3XSoY>R;Q3J{1)amy3y%3X&WC4Fns}$|3I45i!{^8SAsmdYBOqQ45*e^peWZO`UIS4=ztZknj9 +oz;?4k4I-Fttfl6w^w;b>Ctz{b)nXEU$w%pRe8A-iAA9E_a9wnua1`yn}?`m&{<(r9!}gmxd9&F);NY +k^%0yQ>n5_m9dJrE&+uG3P9RqU@`EeJ!M+e8t9NWX&A*0%8=!0((-B1HKwdN11}5)kTKSe5iM!x-Fe< +wrLr0DwEIiWSg>|avO^iFN{%%zSCXm8izBmqmvDxowFDLLi%m!W__0isIu)Z6+LhRM{}+95!ie;{L`& ++CrH1Thv(8DT%89s{q`V$ZBN$XZ0dk}bE{h4h3mJ%p#F-j*qGOp;)Ba@R$)w4GO^eH0Sk0OYF_t@ID) +Vk@ax=qY?QDVzBNtnmIg7s7^l8X27Aw;Dw*AMvctj|Zkv94%e%Xv=zLLRDq?>pJ%+0!^}5^wTpr|3NB +{C$Cm!^x{?4NF(oB*a=VBw)({5&>X_|iDf`Gal*;w0)<|xB4J2o*%b%_-{B1m-Tpbil5uN+wk3fyAXW +k2v(`aLd@ytJ-|Ar_{&W%SLl&0s2>f#C;~tQWZwzK{Z*OUoyE{Nv +#<+0_gzfVg3a#9Ygn;sNm8992EeIhz;LVMiSw7;jW|E^*bnwmH +dhl+A5MMb^xd|if@sBwH4#oMxDMu`$U1)bxff;YjO&`bs@4AzmX;z~1BbfAKmdqmgkCU~^xo73((=m- +#1!u(m_BG~HbQ?y?w0=<=1h%!>tI;1_U*5GbNSFV^zx~s5GEDN6Ag8zxgM#ZY$sKne6$c3CHP+}`e%u +yPY_Yks+PNFe{u(N351d*JhG}kPXXy9|B*Ml_W=hy%Qh>2HtwiAZ$)Ce2&_ev{}?1&zFUO@m_uVQ|V# +4?*Rb9}=C+{meddy40?*oi}V;9+9aQD*yOMxdc12k#EYMy%*;^->1)^888m6;6-A{LXp#oqPvV&+KXZ +B4SzTQ+bSJ9`YIi@=JGFCV8Gbp@3Nn-t(d!k%P?ZrOfmor#`t&bCQBN{Bvg%4|#=!jF}O3l`CH8xWJX +pVT-si5n{le#gztNoK5v8dCjK_Od4p4WE#q?XikX$;X9QhyQV6j=k~@;jUi@Q0G~^p7>;Y6c#}ZIm8L +5v1nC42XRSd=0~jWhS2l!9O@48k(&*_G&*E-L+Jx6yx53nABv@!*$(dmIXl}#o0k9pjdicIUG=6NmoA +z?ob(=&c$)G}X_PK;>Z6oj~F{`c`>uaRk<)xGpml6c#PyJ58b6|nDHlk`Zl*414O~-pHy166@a50M@e +rMTLJe=g~v7d%frfUdu;*EGD)Nl$=3^^qMx&)Jx4lmhAz&I7~FYwIaB=K=cyAfu8i79D@qH@*jV;byQ +i~EC2MryJ5aCr&rHzeY)78^Wys9Tww;lAyF5KZEDs9^+AUftzeQBY*hTQS%Lx|C6Nu+)MJ($Hed5W$iDpQt6vlAK^r +4io2I*AoX`~I>6Z#!w9{rMU}YVMb3ph_*>4i!Zpk6>kamSsyhmb0mSy7AEfgQZ9+IJok#oloQJXr#S0aIuA4OdbZe!4W&2+#?uo4 +bHUeBU0z!+JpeK0b!1>+k7GHQ&*(UQBm%@8=de0OG?QdCfKRN4*!s+L7XGKSvRh +9U*I7gL-=RLCjPbJ5$WZ3Y4Uk2YbcCFa9myCB|R(H@=rsA0?YJFA~-_nMcE|5(kNkx*JsCt6)^*Z=I)7TXh&j{A$Kxdvp3KGv-sid% +U91<$*$?vm_P#NdJ7)NCMOHf?r*7t2ccfKmSJ(3eA2aaEO;pEmU0}LvJ&P{3r3%C8hAp4S!*qu=?-=t +sWc(V*X5&QlUfD-1SMkOFq~h;ma+7z2Oi4;R*!0GXj==FN^*HQ^p!NdGJ7$UtfTgcqBb3Swm85Bw$%n +Kg5>Snm(Nr}4Tl-@BrRy9Hij-afIg_vtdIbu@j{AoOUOY>N|eA;9U1|KBaoa3g=JzM*1Kp)OFf2p$ixo>5{_od|WwsZe?o#LM^5uX1@j1A4gj2K!!7d%~9GXcD7@>4OVGx5n^ZR76-* +Fnz&-O{7KCX1;O_r(5O5@!3g@)t_cuthgIQp4BRhfq7K=rdBwIrh}rC|&#HGt>#07e2glQE +{o&%*;$l@4eC|xjgPn^clj`n*~#}iSbc0)H8)(vklGd!g%hY77_C(&KzBWWK%)%I+{!~xfka*Ej&&UD +|UvPdp{zg($;Id2bkM?8$mbNi6bx1>~?+!7{MVzpN(;<8vOV9osh1luxwzlt{Pj`8PnC< +t4>p9#HKMmzYCZPB&Gp&nGksc^&m(R}r@(LbF^Atm^XR`9XlNZI=|3C0MWaeR~NIdII0t4V4MDzw5iW +LS7OX`X-$@ffrQs*V+FkjH3&Dcoeqt8Rx0v4As*%uz0AZN*8Yz?Tg?M){9$!;*O*1FxVAyrZ}D*ms+$ +vJ*_Gy-c_v?0yEW|BL!la)OQNcYh>yyZkeBp2{7?Rk4qor=v3$suaX?z^NBJB@y_Hp +DGN1(pZo#g0t=xmSWPDL$1y5_$2!$Cq>M&d7U~QYa8cmFXY#TrRzmhJ$l6v-OeCK6o25E-iMfcsYuR* +vqr+5tgfzGQHXyV*R&JW7xYEi)?Qb|M#2WJd0j%8bbqf^k&qy#P~SUA>P4HCxoGgV9Fa=$Z>DqMDX>( +~pd(kj8b@pY#^?QkxU++2rhdDLHb87+{XlwWMmyKbp@ytNrPOgs%d8o~*sBF_}!EtbTC!T30KAw|Xzp +G05QU@HY>)S-$}f7|r0n2p6oKTlaY50n>)LxLe)m6$$-0a0w6o`D9&_D6JQ$>c%0f(#Qa8{oI@iu&?~ +P5ZL|@tnu)7s(y5{~nU8@*rA;UC-CTJQ%S0d&E|;mDa4?MT&xx1_KnD)O;Bb7T4B6nt>)m+B1{7XG@$ +zl-t#zhL>t!G7Mz37ru=ie$xB7GaR|sXVS5x@gMaFoKgcW_r7NioXtf!26NMq-Zx1m+yw_wwu6=AIaf +Zz)oh%rif0@0(8Gf37t%Q8Gg)+TbEPbyRUVz;_tt{{t +Ch*gM6N`*XK|JZ7`bHOj4%8OE50Z!=hjMc<(+Q%J-Nu0Qz!z)I(PvqIuuhiTPAM|Ob_x#K}E^@VGT^? +(jX*`{&~qF6tG%Q-md~S05BWbrO1Tjn#$D-?4cpQ4s2rJxMNH1@Ua6d<6`SY!yQ;}L2V_2 +L8y!LX_hM#oYIrV&qK{rvClv{r-FHz%h|7pGGr#|wwhAS&hlH2h{t~3&(J_gtfgZ}X9#4#wGptUzVlr +>9)xF(HuB|23(K;hS3Qz%F{h)4kcA7|Em +vN~CURl?Kd?qavQ#In}=Q_y~?%97qN*kJ;6ynG)RdtNK@4jAizJUtx+9?UPpAfY~ +30#8LHPij8W9%!+KFlRXtQ+gA#sp?py4A2{5L+1c3e(hHOG{!kiJ7Ub!W{jA*`3a#(kQ{exBVnQ=bh6 +Ynj(KN>5`mNgEDjv32YDS6J(soZHTvZjG9Qu6mT}0?ITqh!#J5bC}J9{Vs<--qi>|MzB<#&c%Eb{AQ( +Xa?I25bJdyTuHcWn?hF*k8*x<&@7SXUv^EcykPI+zZ8kcdyO+xlHoRXW5VKa|ia_@U|15h~~ +)pqLuge#M-J5XsQQ1%JsOH5|Nlj4ABK$xRlyY!5}befpg-k%7)qwZULK42 +TC#F`xIoZ8b*j?(Vz4+9dD~Wb7=>=aHcAV5+z&RsbfS?I~0$|E}xZ8)iD0*M!0gWlk$^G%R +U#z!&(Dqsf1H`Xko&Na2JbN=q6^^jhmf8~<&qD}z;cE0~5iV_4??zTRv^OE;9~`bOxvdo-+pGQNb+m$ +a({I^+iE3T5RQdGVBgY3ks+<7FeRMT3DCck`%g$o!fGRQd(wzV-*t2$Vy3CZsV9{ae0cWiVDyRHt3+T +}wErrXKB+M%SvvFFw?oZcP!Ls51CdByRgT34jA8_yDVYdbRjo{h? +ynT^HmxC2rD +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 +*7b$4QWQ8Ye%Q4X0=6M +Vk7KTY(eO2ynV(URN>EZT3$R~aiCA%K62}^gdP(>HmKb5&)MJ#9bw#Rfs6KQnZAHiU^*+dG+-VZ(c4AWxs9q{Q@NBa@Aa&Sp +a!v-x$cO&8423M&AHb0S+>P*{qP}$9V)qBVafaeqVuSFYrr)gYcn5H7&G>OnGVJ{(gkj--@1SKa2YO1 +`SEx8Pk$w0F#_^7AfQvh}Ua{11K0Vcin(31;d_~5`g4&B)Sg#KMltHM{NVHc1h^3(Jc_+*w4dCufKo$ +(^ubq`|1sCQ7y9V`&M3@pSStyCP%*nH~=NZhRQvkcjUrh%tGx=6bqgwsJf6R +DolsJTVM0P9C14xuD-$d(;&3WF;Gjll5JOXrSqNodrEKFiFd7gq70BT)Z%gDAW`vkwbnv6;T!`AiX#p +3T*&QBpk5iU*nB*JA^u?sDL?js>J(~#JhQ{1)UEr0>l0W8{wD>4~q74eV3QS*!_=k?)t)M)U)eXi7SS +Jov&LQ%cnEg`ySn6m6uYq1hi=DwO;PL4^K*QDj+#!>^@F~FZ=^i^9iReAyleoOVfs9( +M1BjpT|+1V&uF&XLO28%5xG!9_^D`Zj*4~|n<=trA~>!A<&j8$rXB$oOvQP0BaSa1z_Nq~pzW(7lQ$) +WF*mz`z}tskDt@(`MkzRuQxb)?Q +rgux68y9n?ZOF&q3KejNxz2B>5lF#iEj)KOecQmCW}BYG491|%^(PBRgLaUruRe*0SLb7jSFT^_| +tMfdk(4V=~cYb^ujdtqTtmpa6GVxu*(UaNKg)M-nIwNQ}WoGNoVMd@12*+&2v*k~i`zBn7wmC>r1(`* +01W5tDZ$ZZ@lofj#N?BQBC}uRVsxk^>ChUYBBlk;K?9?cZsXCNUNGo{wdGj565e6$#l^Qdi}r$xD5iw^BUrf6m6yEHXYNS2Xg{ +1ap-8fPcaM~MK<*>cDVqJw+_DuTH~W+Ol +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 +{cD|g9!-!D6xaR-R;A$+ +kR;cT#oDIMiKxb@l!rMP*<0(<@Q8;#8kRt;9+8`>sFAN)$@$yQb+L)#mC7o{6D5-8S+;HZb$|vF_zjw +gbEr@GCOWwapp+BZWH2QWQ87pa48^>bu`$IjmvcebHBqR7!MvQFiUVsmlTW=tbKN89{+RU$ozb4W0ku?SGmCxQs{sfww$)lZ)~#B +IjzP^u*U+iR##X0S<~I$*X_OeQ=J +vhE`jhsF&t~AS8`vB%}@csqA^*qE6upqgX{~S7!Ru9uc7Oj2~2q?>XzRP=M$`LUi?S|EgFqKh(ne?0A +0F1I~C=};@%mH9Ip4Z?A3+AnM-Xm^PPR>E>yRGCoGQ7m+^X?} +c**MRc{p^fMrwVvN^PeG5&Wd7C-Xi2*_(~M<)^RcVQTVGFK;INy-?EKW^ztf$wp;O-F`IFzK4Hb82X6 +(@R*Yt+=0rom}jS6o{C;3nE#gFBsT+cga3mEL~ftEng_U|L}FAn8L6QZ8pmZWd +BS8^xX)T@?QRH;AA +Bl}2YvPVK%16E4_R8642Z87TuV{8)ppD+qam@(ugUg{FeKWdI8SnmEerir#KO*^6Vav6tenx3oD725N +K?U=#oX&=FaSC^0M(7l>o=Ti4$n>z4jo_T7Z$(6J0;?s9YV`NeFy(?e*jXb01>v=dS9FHxzz85}~HZB +uNbW?ccH(mnxpLc;~`a`IZdKLDHRs_xXeEz$UvAeLtgumBR!6&Lu)_-wFixO3njgd~+{l?dlTa +9H$c>L7@@2cwG2>O6p%`1=S@0SyhS=0zI__)Me;s0h`G*EdJ;+o(|K!Ay0;=?+AeIMRd0l|$E~t`el7 +KW`=igs5$C6H64vEO@n|IUFH~S9K$epC|u}p{;blB9me-PJq|6gj}s+Y-*J|nz2ojZ#fN5Y+&uZbd_W +4{$YoC+pC)M71|;Kd_Z&^0a;Ajn +&V=(lAx0L}4;wMmXLLcbM@Y?1v2lCeA%rzOyT?a@Z_0)eLWJKS|8cVoEc*EkhrZ(o3PL_1|>3d|5r6L +oO=B(ZE)RyNKu!t7NBsxuVxsh~$9DQRzSAkG_y_CYfs;Xq^5OLqY?5p0 +zzAVR_R;tcF9iWFQ?zHZwzZ-3k6b6LImV5Hyypnu^FqQ<;I&v_dV5>%ZxLfz;gg}eRj{_&pKtNy;tN9 +}_Yaa<4|#4GqhzzUOxA%hh*Tmbw!=6J*!c0keNFLrPASvINtVR_k}Si5qG{BY&4u{X&Ki}>;eU +OuAc^Fl!oJk1=cdjxLnc!>8EQptgc_ +WC~a+OVNwMq)I4=y&s1GNTOo+ae!%93CoVu+5@Upui4bbM!(xsN_<{(3h}fn4oL0O^o>84O%qc>v$`{ZI%Oi5{z}l5%P$xT9d1pT-p+&YIsuj!X=brGJ0I#v28jKP?$ +ZoI2S9fFi~qsMX^Wi6r3`O@&gZ2m?9`5EOuw{>#vwE$0e9wf6eTEer!ujt=_(-cu!$bvUCf>Q#Gl0fa +nN|iEE7gAG@)sfI1e3PALk0foMk%0j7h47!ecVJ}l&dyFLM%=^btla{CETvM8OoJPUIGFO#3`0shsdmaVek^g8T>Q(X#lBTvJ_~Gn1ddtS?`OE&H<<0L>ZqmFk=IcHa&dn&?YNRsDw+Hu< +{}lXN(V?a}wwEm7}GYx`fK=#K$v2KNBtoa5jO?J2BCLw6C%BQ4bGo7(eF +>p497bYJM+VZLnT3Z-tl|)YnHwE`$D)nD{o*r&HCy{K83QXYnk>X4>^ +T9bSmDbS5lAoMrDKj3luztxG7w;=F#rb0MGG`?kAU!}YcoEgp=NW6Y%Dbud_9+GDl)b}yA}&J_MU+ki +X0RX?hbxVxJAkb(ayFQYt#9P&LBN|_(;ZK=f>S+0y!RVGN`c~>PBlBft?Ohw3LJtpuk|x +4s-Ym(VF(?Zq(+=bJ~))20t_^QH(4hwauQ3O~I(Glhl=BlSK6kWHsn;;U^q+rG5Q7GxrGL{4 +QU&#+kg#kWy=86U-N#AgS)FCsQg`^C~kig-lg?)1x=V%hEIQ0~6!zpNI4@Hq-ir@?JEQO!e(9%61^#l +`_`fCI;|2E-(=9(B`TKpWT@G!l_*@bvIWyYL6B0&Gy;fblOlX@L{~YXM;#Ca{vwKf|0PiJbkxSk4~x_z~%a^ +$tf#|Z8|o=#h0_T>p~0z;l=?iLo}S;q?Pglet%jizoD3sVoU}qEKp|0O{7|1ZZ-)eUAQGw!3{;YNdPh +SjZ^GOOr6$b=_$-XZm7Ukav(|up#pc_LX4_cMl~)R{MQuMa&W52>_F&t*eR+*H*mmN15KH@mpM0@ufy_{E8K%#GDlb4)`kecTQ2w{_8^5z) +x}*ICC=@_|S1v#Ow~|-)J0CC;!*t9h(J@^sbFW0V#CaZfYnTSDjNNfDO4=YQ*Fkb)4 +%GB{=2D;7q(e2Tf8l}5#ubp6v$}13l%BMazHH0pB1As7Pr~tKEIKRIS;IW&pc5dqL^81mqBKig#o;R! +L8k-AXVBL_Cw2=U*y0t{2;CNoxw^@>lw?f(7bI3D;$ma(7!NZ@XDbdEJH@1a?t~~oqtK7o50uJxXEV) +F!h?>ytgowH!l6PW=iq%(L}okA>Wo$*H^pMkk +jP!NH;@he*f?KaPA%!{?(kFtv8~g$HWEfSdfCVajOU2Koj +zl7j!r2JEw$G%p`N=lLY(f7P}=O#T~Vvz1dNNX)9zd-wK;CmyQ#jO_5jK!hcXi{TN~tYw;}g+n$VcrS +^;p`^_6KLD#yO((m0b~YDDh||P;?Q@PnhiP-V(c`fzjo9{(?=1 +(owJCk&@2Y5-aurdFd73wJRZ)Jo)pRmHdTt>cvW%NMj4|Ybr+?~u%Dy*BBP6A^*-msY8hLWRcL$y2(G +L?V|{~q*wW;OGISc4^a%dy$%0F?;AApWE<6Aj9d|$51tw~SjL*Vk$P=m7R;o4Rqyvp7dUdpKruIw9!Q4_=*a6{{;2tGgA5UF+DP1KX4Y2a>fWpzHd-ZyaP0sZIndbrKp&~sNXMz(Y+ +JQJBn$I{!cG{-s|GeDW2e~$c*rI<+o*-YiEfp_~C0O0BzJq!0C4od}F~`#JbPMrb1=6%gVU)U_l|toB +=iNgvclCh!XcT`R3w7Z5nT{lcc+FLi1SBy2e2Gw7LORNPL`!}P9MBJe@fF9}Q5a(({c83eO*cLcG +VNVrdnZm{tZNz7vcVGU|re?jfA;?Z55j88Z)g9k_nJe<(FStzsd|O4WFC;QnC;bkoKatyg*Q&AC5hO@ +p!IFygQ?OoS`m{T&)mo3DV2)lTSh1gv8$+7uJQu_ruxV5&u*p6aPtEpi)Zd;?r`Xmyo>J7MQC3a)o;I(YJK(*$ez@9Mc<$ +!#xm+?~9ozv6Fg+}%jmHY(K-Q(>i4)#X`(07kwkM#_{6Yp3nI{ud`6R*Y|vy>xPsID90EAi +zTSpv2L+?W3S_&PEveRjTGA;p5oZShU!vxXx2xmW+UxMM3P9%%j=&0^q(|Ew< +ln1bYomzrH+0+o$Vv)uT2q!;rV$+;8M4&RxS@?pI!<7DPcIqHcXOGSh-+bdDTZ58c3N$yp>7Xdx!eI~ +Y@nn7*9R8;Yhd^ByU55tA4i&C(E`G)~2v5Waaedv(0Z7|ObsbD3$A5QyeP6dllTQZ?E(pA23{o1M*%^ +sqG`LkESKWxYl9n>FP>6sFo)@3rxmm_2tGUJy!|-F%s7#1I2srqHBg-)pos27o#}fe4FNB1S?ESCle8hk>eauu<52Wc +(7;q#_-a#=O^D6AL)i$qJ01*k#(H=`Kk5iQUT4h0akbuz|`E5wMzGlhtgH*f}H$6rYp~?(s~tIT4D-+*(D?krIAM +nLH_}2O;F>!!okNsWd}{g(*bOq*I}8i!J+trT$CIkK?;vecniM7ya4KeGS_Z0yD4C* +*M#@j>n&5!TDbN2} +mj|k!2oYfP}6mpZabG@_WW_P>8aT1-jJnM6Gv%KZ-Nm^UmDO>MoE;oay$7Ze-#+GPKX1-+k{)I(@vS? +*_=id<9~v=pnMxQN}G~C1IueS}d>s`Cp>E^I7%9-=9@Ke7=zDGYJaL&dD?|U5)!Hae5X_HG$RKCAV@78C;M5wRfDlJXWkHNDFC|VG{JHy_DQ?XcL4pca(kEYRzQy0d^9f;@Q7kcgxHYmuGNkJhiIZOQiw=7 +Iy=x1G*1&Ol?v)SEr2L7C4^N*uITsV=t|WMlRNqFnp3*Cra+7ST!jHhI3TvCnl6}5$BTte& +=pCoR>uqmbBD=%+3wB??InH=p=i +jB6wlUyHH8qN~KSAB=H8+V91P;F{6(|Ic@0%n#@m+;dJ}fX2^^XdqV!Yc{7Hv+ +Xp#Du9uDf*%LQh?YGrzzi#9k-ZaXcW{z&7|ho)C)JHhggDP6>YEAfOn^kw=8NFkt4&`G)}Dow>T`0rk +{j%jMRGwexR#@17pidNPthG6)(s7hNkPqNs=@!IRe}-z{dOA8yJfn9&`0{LXu~ +6iaO*5JU`moXK-92ayrcVwDWa2K!wYbq20d9g5RCEp)@$;nw%pjjX8EHWwKiw6l;we|rrn>v`m;41pGgS%_IzSRaZ4}h%Sd>gGB-k$^MK_lUOj$-ai_)!liCQqi}X% +@g3BY?3x)lqQvp$-PRjhC3ixGc_TbCFj{^OV9%uRrU&WhI+^c845KVc|+H|&{i+6x| +pA(|`E4e>e^i9oSK~WxRNo`4%+L}iO46oyT@PZyqAISh|naMR!tyX@zfwi1!Z0Hjd&peyPU!uAt>?bu +md=ddIo#Q3IUHZ~WVwSrM-b{)MMqDL5*>7{r1(@bI?k*9T8VbRLRlL3lMg2mq^DUoT6Gbbs_mS+3&cs +z1b52VpFIH)bLaSf>A5cpJ1QY-O00;of09jiA00002000000000l0001RX>c!JX>N37a&BR4FLGsbZ) +|mRX>V>Xa%FRGY<6XAX<{#5UukY>bYEXCaCrj&P)h>@6aWAK2ms3fSz8}v(j6oP006fW001ih003}la +4%nJZggdGZeeUMa%FRGY;|;LZ*DJgWpi(Ac4cg7VlQH0b7d}YdDU2LZ`(Ey{_bBvsK6ito_>IV3fl1l1!{qMUYDT=m}ELj~43li8O@AbKdcT^g!Hmoe0-u4>Gl8H^Hv}L?)mE~5 +b)=VZ1$y7>8sN71yuc|@tqXo^cBzU2kTV6?S446S6E_n&N?L>P$Y<}v=y-L*uTi +!z9aN$bprg%;VdVnsQ<}XMGAf-Zz2Q=Ph5C$d;3>5`bcJCJihuaWG)B>4+8B4SQ8h?YNYUO5;-~n1#% +RTqaNCPJE}^v#DQmc;KU^@DOBo^ckLRSUVe^Qx%dJ>*vmUYj)jdrn?|54a1RhS6y6HQ1!ffA3SPXD4v +M7-)XR!*4L(j|QWHPCtVGW^Y%NC)_JFPw=73O=8&KP{LnwvSpaKA!pz%F(rmQ(igFU(jypD_Fp4MUa< +T5gGcG$0pS7QDD+FH*vnPGd6JEGs@M(dGt|hC27V)9ED9ZnAH|!1u+sME(0R!;IcWR^~p|lS|#hbmEr +SJLEVjAk;pnNWl3n^Jvc(U_L-kORn@O2*e1)k@ns?4;!#+Rl5bk7B-#T=9M%Ko_+60QsY*h29i%_!9R +VAese_Rai>J7603Ymj%SR%%^#rNqanF0u^6Mf1=(;%0qcyljgJhE2&8d6k(X17fcv-t%X6!HW5Wpmd- +8#!*=aaxAyvw(EU%Q3Wtkh0jfJ45;B3Z}T@y`SfMYlW!niKbR**Xzv +xjVqT1g&f%6{D7=_U!NqeM&!YqXms`^kqnu0*BKPJ%{w8pNNf!T~KttkO)qAzI!|Wzce;Mc-mO$`_;X +@+rn7WbqLmGD4Wr;4m{NRhL)WP^)U_fpZqy;RAGe!_I;F2*pnk0ps-7ZrMf{?1|MHYWDm2DNe{CCc|) +g*tIas4;3g<5JqUwO6{tTbN1MYypQZVRjz0-KKRIR|)VDZ3I?#3-Srq1ppMkNr>`u6`A +X%1OVj5Y{Vx*NZ)i926M_+aUal!pWn+>^!0XZ9K*0TGxsMZK9q8n}a +nglHe^J=vyieia-9oKe7S`wV21m=eBURF5;vP5b4!n@pxH0e=|3v|8Po!)D$be>)GR~~hJa+>v{}6j$S}J{EW_*gvkv;pTw#X{u +j2Sp`Pj?D5uHITEdB4~)qN$MWb{QHjs1n@Tlis@E+M?)l{IvLm&Udd_@>||%)PMdGE7W-Ev6Km|KUGJ +i{$DR;#nRgAev60o@FwzM+6Svu#SnxtB$F^0Z>Z=1QY-O00;of09jkf?KIa@6953_PXGWh0001RX>c! +JX>N37a&BR4FLGsbZ)|mRX>V>Xa%FRGY<6XAX<{#9VQyq;WMOn=b1ras?L2F5+enh%^(%U43@jZq+?i +P%aPXZLo1J)ejGIe*8Rr&@AYf>*WpP508a8D|>&t(?di0~3q!cG{4ttB!2iszIS65fpyNX`5%|>O}YS +-;ron@-rY@4=Id0jVM-jz*lCKLOtYHn`I`o?`Vdox+#>Sa?^dP#HB{Cep?Ty(n4uPe=yy8RZ`y0NRjU +Y=(^{B-`qzh6B2^ISct_jC2K1_*Pt%uP4pHQREVX1BU7nl|0$%eOghpSJq9UD@i5t~=xRs&DhEEMA16 +V-R*-S^1^Unsx(g|E7y)`9|aZbyJs1dX&}h=oqA1-5S8!!TK-$D$y@%AVZy3seZTATOyL1J)J1{{Fs- +OF0Pu(R&VoG|B%;3S>&Cb)96pRS)aFU)AHAg+H`qU(Z&3-yWY0VQX3OZAVS!Ay0|1%EwKO4T@Il0i+T +xYl%@kZ^+#y=d@>t5!p6>W2l!KN^iu%Sme)JPXmm|e=*py3S-*A5euls23ZIw^FATPfFRZ`#Zmo6YR{ +sURj7-Z(leqH16$=t;k|?RBY&Mt +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 +>G?#s4XKSG=ck>^jJpQ&H4kp~keIoMumj +x7}S5;w>&t#&=;=(_B-H*H>MEW!d|Z^Wt0+j5&(5DS&q?vj95(&vMrGseuVP(k}ZQQK}LiqRb4Na!x({JEu +8d8o0%=YdWBLCc#%?1Xa?FpSx5Kti|RQ%j~ti=Q(bT7K9jle=?yz8g= +Y*QOF1?Lo+S;PUT!BmF&SK9AP6W1J9z2%%3wRy)avDu1aA5l(lqOo#5EXajs$7<^u197Izs2X|(GrTs2kI+|e6O`5t7ApnR8tywauRYFC%P?X+TpU>jmkyF^62;x5P?c74j +$PRB@CaRZCkp>IV{4d?i=<)-kscv9^Zcr4pBJ1XC&n9Zw!wx_K|t|rEbdT~xo%mZ%Qe1-%^NiA1Oe?w1wovD(J-okvNp-J=Ylq-Z-76v&2s#n7(xh{uW^cc>4-L@hwHiC^lblh+lbf1a1^6GKoX=k<35>cTkzyM}Vjx$J6v +)LdTo|C?N?Nf~3rQZ_Xe(d|#1j~(opMIOFpIC6Zbt4gT%)tI|vk;&bux!GL4Y{H#Z#6j4oERLV_o}W@!JEF0BuC1_$7ggNHwMBchTy`^6FKe +_OhiJgv{yo$j`^_02i35D4RtI1%%W(JxK+}>c+wNNGm+z%lM6MNr(!AdLhWm8%2FX1j5nV)zfd~AHJD +$0wgE!WvdPb-biFrXk3=jN)spaqmv(@68XmJW1a)^|xG6s1$76!7>X*IW~xL^?B%u)j?tD7b&nXB&xH +S*;C{j2-;uhsqgBxP54%CM4olK$G1?EG7z%y^4OjV}?$#l1%tg3P(4sC~*`KCbt87^WfYxxC=0FX+p6 +1q+^Yu_t}=p{Zj#H`)`zhx7=4dU#0;_mGJ2NO1XRoxzT2!n^X*aU|pW{PZApK#9-ns|A@-C{$jehQTm +xGk`inu~Sa&s2gM&v#bMh@U${P`jDuY5Rr=>DcW{$ltc1`BGCK#7R&xQ%bG8MUd@iaTDz7l5AeM%(Y#2?tDD@QFe|+avdj2O +a0~0qNa!8Sj;>cLK%JnaD`{ILZaO{#0^&e7%V|BdUNB=_yLMRBV^(%b$S*2L1Q+oe@KTN3 +H1#xTj0f5iKPi1aF-HLse*#^r5>(G;$8@?Y|c&Q=JkMuJL_lo}OB0^e*wPth#St8JB+22q*u{q6X2Ks +{r1K6jS=qFF@K3+xv*dkNxtage}64NAkN5{~M%FFYJ6g%#U-9Klg>R-o=gF+m~_Q-1}}{rYD#b-Twek +O9KQH000080LuVbTiBJewG|-%09=Cr04@Lk0B~t=FJEbHbY*gGVQepQWpi(Ab#!TOZZC3Wb8l>RWo&6 +;FJ@t5bZ>HbE^vA6J!^C0#*yFkD-dk?L^>4Kb|rN=Uh#69%{tzSv)QsYaa@WDhRC4=3j}BkC@rJtzo) +zB)$;(!wUd0fI#$^$0y8~5J>5P1n&GX-52CNG8!=OV4P8IW{!neV&~KJ~Eq>UEb}1BuVUJHu$ +H`d+pLgHBeO12v;?>LFzkc((89jPgH4QQ=@I` +ZBgEfcGdO8wp!j*IF+IYjOt!&L_0`3h4#K`>eW~7)gcISE0*=T7QOBNwR!TjIM{PH)Q#=*rt3E_>fgi +)XE+1o+pevb^r&p%(IH6pFgh$mFo8d-r?X7|5ku&O?3#N4Yi_!Jg->?4s;}XJlr<2Z6R-v*>D#I)meu +lBm|idO%d2+i_p|JqTOk^Hkm@GhFU6La#$Wf})^h0UYa01YH+>Duqw79f>7zV&5alI!q*0SfLj*4?S>o)(q3AYfaXhRpzVc8{xYA +Q(WV6tSAgCnascq=6@W8{lf5HWUv(WPxSTkXL{Eb+*gR`Mk6*G5SBe^z>!Asa2w%A{sAfQ?u?a36X^P-fHC#x;p_UQ?RtwFQZD&kuaqpe#9(2o?Y`8e6+l{d^K8IXz +9dyu6vdTB8FPtUEQq8byYXu6Un(UUN0jv^9leyJ_UWr>ae6WJggv +idq%Ri&^yo=glLCKLa{s@gK^qnbbCxAMp}LZo^6XCCIG+-LTwTq=P1S-(j&6+_GIuPCd-l +#`>Xs4q7jR!=5%&;9yJRtDHBY8q+mNm+(AW|&^;+Qv-xSt0qrGHK52KdA!t?_4G~!YK+xNi`#<-W0rb +B35+w2#gSB(@tdX8RTtBd(*s6Q!s{qMF%vwhgxogt8|2|^&9g{qHl!^5s`(-L~-wiy(ovR*5}s3q8bZ +Z%0q5&T((@8@JzCG?|SP;65G4C?1kQ(@!pATUeXJSNm{U4y9!%Q59psa@fih%4e^sCr}%r6kZqK;#`C +PNvg?IBet%YO4Iv8~!P)B~7Nv?64YLP*KAzyxoG50fKId+!4E~!88sX%?S)KWwa)h8;a`K29M_GJY@z +G9}$o_6Jg-SEBF3m_b2!xph;2lr#AP|4KPpuj*=wZ<(=3=pGm!%Af8jEOeRs_V|em2(s`7-|_QQ7xM8MZh8s9BtUB62`a$-_ +7G_!^w;?hz+u{Nbv^ah6Eo(>qg$;;@BQ{nb5!|uAd%YbZ49(=$V}o@T4-T7o;H%YTZ+igrO0GQ0Zw3C +p3-U+|$QtO)$!YW=fGV2{;8c*%+rd1^&UpbN{RH4&bjG(>;pCXAN +1m}{L!nGPd+j5#-=M40i3WLZ1$$#s*AD`**#s9Z1Zffxy?Ve@t{`lKJf)$OSyR1?Io>}p9nsS!GU+9Z +u^?(aAfT2lYQh3au89O~&H`NVzI>Yj|@XSvYT5Zz~g}0>7vTuaN2ox+}Lq>qxOs)lNZW=SdYSjs4KoH +a-0QTFiJ%?8vAl{=2#lT&4Q`K#eVkD%Jhqqa?!pzV|*368o>-Lz_5}CY_O6SZp4(JlcMD-ZCKa(Uh{4 +^dbMu-^U9Bsi>`*6j|z1a=)R9rD~HW}S@kRAm +dopACo&4r0uja4NAmLd)jYf0i>B!w@GJ1J7_Rd1IUgqe0b-GgT0G{Ps=wQ9^Lh5J--)MFX@;Maz*+tg +$u3D*U@uN#&I1luQf882f)ACK6c9UCFWB&ZUQSYC^8Z3%K0i??63>q@AhRbZt`X)q#_R~p)q%Ze$^b5 +7%Yj*sHnBeUGU~2@%5=?jj>`*PuYt`D1bLwCWk3xxOAbjC}N@JlcFGxSAlr~c1F +T^u0j0hFN!*vw1ETzB^$czroJaTrDA|`BeHpseIa_0J&5f4ogA{|ZP$TWg9gpI?%@H;K_IYRY>|ao;^ +bL|vDS`^piRLZf6;Blde=02g7&uWz8A|Oqf9ZHEnr~wJw72jW>ZVDk5Ko~;8bbiz!`ioI*Y`*{KP5KN +=nfW&M3h|ZkD^0SVnAxaTCg|XB(X8HK6qBZT8Dge&xa^sCtyA97GN{=t4z@jyNwE(y^fkCvF&jK>Tr< +iAC2lsdd8n$IZgy`RqRy7Mv?F@!IM{uW6{hPKF-f>s+lEQsG4HiTs_v%heLy51cM=olEjuh-ed1%)9mT%rK@50Ias5Ij_^8pxEws0t%2Q9-H)&=3 +GvvlXdKFk+v&l~y^Jd +`uENb-?iweTI+1|?l-B~(ZXzmgK3lbqmIrKQ%j*mKSKLUc`NeHu^Tg`}8)1u?Acb>LZLw6ucX8xdu(G +r#{nuyn?Axln18Fz%lu@l0<=a+ZCO1M#66f^B^bGh-)un(9u?5})1~F=Ra$i^3`C@U7kudmoaXtk|)j +*cTwFuzIt`Pu3*P6iC*L#4q_mK1X3bWDr{Q|#CkPL;%Ea^A2o8y4UbV#N^9*JpW38=T2G)mi{iJY1FA +bhzcchL4t>LT1mwz{qk`YaY%4kXFbjq#%y9o5?@0DndR55PmETDJ#*nLQcwwS1_D+eu!0oR8?%qaY9A +uiufy;;)BV2s9z%MVUrC%qvJLPE~L +(=EO7=M=6K}*=V4ey6j?G^+R1XX(xAlCmHuu@y)^_nr?GsGr`Z14aIzp#0^Z$fbba&9K=5Hz7~xpw>1 +usW{y(~tNA5(J{iY%4IhVb1KDpEd8PjAaPxC-r=hoPv@28OYF#m`e<&Z!3p>H{u^w*P|2~x6@%PP?hY +Th>xQ?scQrO+V?a$Jg=adaWR~Kw8o!-3w;n8)}EbKl9X0JA>dGKO9ZHa)#i@!2qV~Y7K~MCLt0VZb~}*Ps(Gm +PG5`hG!*=iIe$YXiF&m^8=V)JC?`|kK`+!e;Ty3%oErPI4cf#iG(?$FAuD34ipv+X3x1E_9j_A9qN&y +{9+3BV7ylyAtp=`5y(b4FdCG8yP&uchL-#M?gj)F8tviLt)-q{?OV85e$STCquz6N^bsbE=mjlw0BwT +Kc6G{j&J*oVso*2FPShlM}TC|A6dW3&ZX&*f~vf6dUA0VA}&soScdEfIqWD8{r$k4mG-{kh4|UKvQEb +`XwMN8y`kS|j|J3qfBM2u4x}TZ4cO`CmtH{s +}>NhHEZB;ubqm!S6wW8wfUP-DSZq<1Ls+>>c2%!Dtl_!*Xi{uzwy5$bMc%^qKockfWWVi{$44Rl~QLR +*%BLb(w$%nuZ70_`9*NY;wUQXfl+KZ^U*=8nEW=lc<2bWyHSr|kaxKLLEw7#}q$Sk8R*Nx+rm{h4dKS +~9cFqE9cCn*Eh39Kpbs<>67i+0%)u3ADO#{DVGkB%>s_LCNBw;fNV>M-mF7~kQ?lMR^QWCZhBHkl?As +QI{veWJg%Bt}w)r+7{yqI4MH%d3%SK>49UWVTyD3Zc(EO9|h$i=}*iUJcSP+e+x6ka6RtfJ=Pz$D$GG +{ujiVi91u)hr&21Qu!FT#zNX1$Rk}``M*@ +^;9d6@T5HJtbuLJiiZ-Jgm%)8Ezj~JIf)BqPlS7-v0DvsT_WWxGuK!TFX>M#bP=VkHaEDZMBm06Ni;O +{Ir{H9uo4A^#ghv@7x>fIxIlh`TWa56DcCq$to>A}Z +(n99jYx5bP&{Ue8kiBf^CeiH=Ta!8rKx3(G`E9-kOZr}I8s(&VUx~Cx#q?tK3ni2*{jyqyzI)G8dE$^b#9rMEihlN% +(>5FIfBxq?OP}X|K;9SC2=XSH_t=qr9(joFb;cQn@cFVe=Lo8Yo>0n)q9qeuFbWDduDU>^+-IO#DXn` +t|Ao8Ht)ClB>lMHoOX@%N=7`AG3XYn3SD0mBXK^+ni0$}0{tEliQ4vG@2R3HyiUwb5qPTv7Kp#AlcsF +R>#!7ZTfm?@j+NWfIv)3_LsXm~?P;A-O6;h{^>dY++DvQ&0sMPU80y!$l~h4hLZx1wNyx|3FqV0sfG>ZIiAY50BOsbt@bi!4IV?El +n^i&5zT5Q~JM)*Q-K$Mm(8wzddn{rh8a_d)kxw~!+Adc)AYIbKO;!fJsR6xpTo!mi#vE(fAKKv1+sed-|qSlt6MRGtq_z6)YM->IWw(e`Zu7x=bn_W?)@{DCcc+8^$0B^Th|azi9D$HXhPL``Qy +uB+u8tn>0NoA9$O4&tWTUn|oUrU9#{j+A%;2wNx+oG5}QPO)S|RX$Y-fT^3K(D!KZ78syI%+gGG(lMc +=2c`y0mN;9PxEfKFW4Dwf&X_vp4*a`FA*$JGLOIoCqo9b;2tG86&>YmxuT2fb!9qqDt86@5*Yo~FY=%$U}f&Xs-Fc`?E;=ATi6BVlA`Esx&q!p<$5CZNH`uY$R}nq +`kq_+L;vJhSD)qTOxKHWw3z<1}qJu=GHJ1z*7)tSZ3Cfv%Pmi6AeZN463^T?gW@!Gh^SS6wB{2#uQta +7bRG+cYM+Qxf2akvI}o94(LGRoE&tnY*Nl)#0Ro^QiM^4Y|_{Nz}0$Wdk)!utggY(_~Xs(`$;k<1kxN +4IP8FU`eGyIi2Wj#tWMUkDQ5@C?)Go@x#RYME^FTVA23#2zXw?BCM$~pLl6T`7DlWn$IX-u`>*PaD;& +YCq7YE+-L)V410S7fjC8nEZm|6_d6X~V!!pJ2OF2WPQ-XjUoW5!^u%yE=^hr%dbDyh9gG1(@(K5QPHF0a)DytIP2oD~bp77!#}cX_#%d-6Q4F4&=M4Nx1%uQ9 +s`jVfNU#k9Fj?}x-CTT01WQkipUJ`MpP8KVYoJpDqRY^b;9z#mUyCwycG1^`MDo;I~1%93Ven)p-|Xj +P`A0_Ksbe7AjJWE*V6@;GP}cV2RAtrG(vI(AySFVe;xJvnrd^ssj9m~@wGjg>F3I^>|b=Y$(t{9=a#Aw;~EWtuAb`Bw +!J-3brCp2ZC<*nds@(4DmUCxi`sU~#n2#RwBI!9+y;gJXnIBrvuhPK^wXL;@4m!B2?{s=V;Ad*)o3H^ +0{+68w|x5HdF+2^bMebAOyyi*Q^vn1YLjP*v +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 +@enwfja6sFbBwt-#JD`V@AAK&-AphpS_@18 +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 +?>DDgnr}jUrcz +S===k`YHw7o16{^>rr3;KtODr2w9g3c-$aBObgvuUC=AKc|NcGlsVz(W(v-ebP$(8L$pN9sCevz6Zga +Oc+#N-(O9q7op_7>yBdXD_RdC}BLS@{qBsk67Kd|L +~=(*t`2v-az6D60|~B9u(>e&EG)E+A!^)aqhW&qIx+7z;&ET21Rn`&t#sg3hDY-LT7*}jpzW8_410F-!HrDKsmvwo^E^$v63g$MM^vIM!Ep)T>0DyR0(O +O8NO&+Ig>*de2*eSxAEJ!6%`O1$>>ckrx9Z+kKl^15+H_6Bduk_UnPMk%)XoXqw}ZoIx`X@gB*dZwY$ +B&?qwpImwA1}o?H6=>CI$n;XtWB~;W<{KAu3saen_09?_+8c_KD~{&V>%wJ&xxL6ZE_*m#g-O!jbi2w +=={G-D7yZ7i;?gdyn`4cFMnJ{@HB%O|0001RX>c! +JX>N37a&BR4FLGsbZ)|mRX>V>Xa%FRGY<6XAX<{#OWpQhBvKWrq;8u3zH>-jNZE4Y#u>N|7o0V!-|?m&dBgO+ovr5Ou +<5mIDq8X{EPqWa7L$w$DR^dvQUOD*5L{^12wEl$`;=rLxo+A_%TWXlL$oYYm{0RY)+zg}8>;3Ya9Ovd +M|fp_{>eVIykQj+x)UH-QN{XI&#B0HPBjQTeEmbpi?)u5vo$6KUQc%yS!5+uioEz-mptRzSr|Isqve9 +YU(O1!8W&urX{cCP7~R;TmgA`rIr$lsD45-af4Ddq){@h4-@-u#-F3hQ0)CDN4Fg{hI2QU~k&Do<`c{ +Y{xHbrBYVMw<@C}ubrZ?fWkNv2*i2@gYP1V}P2h(lgslDwp)Vp|%VnBvq*kxVS|OAWrt8oe1Lhk=hQvyL-rzz>#DjK?rT1YMD#`TjDK`_Mmg~0E~wxmWlbZSTfEqZ+S=^+%Q@5Oure)8K#$;)NWbNv*hJ-s%~h&^ +ZWRz@o~|~xg|zRU-3gv2`Ns|HGO+N$^a2Y$Eq4&$4vK+;7}710XvxI|+|I0sN$?h|i9ad9iP(e{B}29 +de40uT0w@YUCNm%aEx{bw8k7TuC11@Eu-GWpUyMAkM26VA%4P$Y14jSCgkn0}$~PhCADn{#*9%9+#O{ +seqQQzgBM|PTk4fv6xp7TxlR{BW|?QIk(Xc&jnT+=7^)_f^Gb*gs@HKa)mT?2%ql?kK +Kg+TIyF-U78gv-=oiw*6r^*=di&oaMd0C0hdl4!E8Tua-o%D#s@}(`=*_a1$?ss1q?bqSwYbUS-=E2a +zc4UH;SCSI3qtk`6<{zZzOVmdutBRf|R?`NEIVWzV +EFd8U&tmdxOp+vt$xEoibMjl@z!(Cp=mk?IR}Q;@MOR#tN;ZrH>$ai-?nQIDDp?SdE3VhF)ecU>)dkk +`lw@lv&JCYcj0!BlN%%WxuV~A1^9UWCU+>FMfQ@5oHY&-Ez#jO*o0YHwh=O-kW!xWEH)Os +l5LqAMDAYJnCC8^f3~_Qg0U8_ZEgFXj?0z+cTCn55&Jt&2;FC1gk$f(6nw*KrA +IokP*AaGsBtt+_C@>mW@T$DcR;-d*NXm+a(mWbIE=T-ERMF^Y}h(J +DD~@SGs0obqNn7ey)@3C-s`=vZ(Z))2K4Sdm}9KkrUK8`ZhJyu`qnsEWDA)izC!MAJSOUg5(*p3j);a +ix6}RCb_TAMb{PMllKn5y84Mf!12d~$Q)4a^bOk!>Ex$LJqVblKFrLessr3Nj$J-rq)b$8)L&8?jOUg +^UW%NL4$_zcsv*MhUzP%>wW2@uksfG{x&#`px%h^4M{1~+TeUSA-k*1f{{{~P?0|XQR000O8%K%wh!o +psF$`AkmeKY_7F8}}laA|NaUukZ1WpZv|Y%g+Ub8l>QbZKvHFLGsbZ)|pDY-wUIa%FRGY<6XGE^v9ZT +ldKaIWG68+{ +>VKmVG<*zTErBD9+?8y($fBJqYGHIJDH?PuFlD<`CZtA3x*@GlvN!#echQ*mIO{p_k=zplRlm~UbvR2 +jv|2_@x`Eg|y=3kKxy2D-+w)ZPs+>d8%ubH7 +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 +0y>EuU%S_Kz!roF~Zn%#BjOM^}{AqU0& +QEZyg$7oi^)suW}Cdad_y6TvDBei&v{0VlJ@7?)pJN)&dQ8Db{Vfh2$z3eiON9n)>wQM81e+jnaku1l +UJ=RNv9~T58zGpvLiYH%7NZIDfal+;771NvjIv=03u*BLe?=;ZUZk1uIke{Es%^IRx)3yT59=FR1Dch~8?s_@g8^`U?t2kF?Bx2H +e@6aWAK2ms3fSzAhYIX~6`00 +8#`000{R003}la4%nJZggdGZeeUMb#!TLb1z?PZ)YxWd2N!xPUA2ThVOogQTCElsU;3vD(y-O6oiC|1 +X`|X+Dubx9XqleP23;XaZ+@pcLtgVHEHsFp3 ++jz_0(d@LvoO51mp+k4n4QEU!;i^$EFQ6kO*dgp|DY2m)$sp9~1e(MQbh;TNWpu~dg+~d7x9FZ?CYEI +x33t6VZel$c0(7UI_AvhXtxhFrSjX6pvl2k!JIcVnT`ouLE$G4ZgQJ%_bRUQc?$$Sd9tf?0$IbmSdt1 +NUJio5tCtO`K#-a&tF*<_f2{j&z6$4sXau(us35|EvbJj3s_gKq-#X?NVCG14w83Ihe;z>HbC&eU{Ta +0-tjK$*b$8;=U`3p8$VdV77pc{+=FTn{ZA31{DsPrXLkPANX)R|{Ly_mhMo94+AZm9aNW@h6qE7(6 +!O9KQH000080LuVbTT_zpU629*0Fed&03HAU0B~t=FJEbHbY*gGVQepTbZKmJFJW+SWNC79E^v9BR84 +Q&FbuuxR}k){!BQJr4+Dawz%D!Ww(e9E24mB)R@o9nxk)bj?W6pW=4)NIT)VLxvSHrAkr~= +r+iawk=3{;q|ofI=o^!#R0QjHKwB-cr#)I`T?_4T4`WNyH8C=ek@;A9@`^~NDkcs0na^QUp+Bu|uTPHW6TwU!4tj#n) +`?l8Qm4S#k%j($rqY5qIGv0NOKG!2ztL@Srsmr=+Gjg%<;1fWV1J*uQdj#cqSRb;%+Y(E*67Q);Vc)y +0XG;s*pmgwMDV2!!SN!?);iSPN~YLkZs#ygKGV!{C1oE!-`?K!nx3%n`C=Ne^`rcG`Ueq(NiM&`4e0Z +{V*?uTq>e*h_VYU(%Rrp6EM>SJox|kDG5jIzy9RM7@ugm+(c4ewet8^nKkYZL)!Un0ga>L;xVQFMZgt +2g6!CK0kTI!xM`Q2-9+QYlp44wpO9KQH000080LuVbTk(Rx3eN-p0MZEn0384T0B~t=FJEbHbY*gGVQ +epTbZKmJFJo_QaA9;VaCv=JZExE)5dN-TaZo;31{^tQ)^+oi0v(bL9t=B(19(LcD7194iBO_SQg(%|| +9wYNlI<**znE|L_S|!K3d3+|>O2RtWd<^y=cqLBvRz_n;I1)SS;CGkxGXiWGJ{GmlS@?u8P`Vfb#3fb +9EM>K@S>8+fd3PG9V^tbRw?T4O32NImz!=Y`wQLZAXl;g(^T}J)dAB*5F`l`B1zyH9>Wcqq+({9)I1A +E5NeZ=ouqo%XuCDC5VW_;)pUNdSS`b+APB5gRHUFaACsDyJByN}WCbS4ke+3j!Y~SJncRI@+}+NX%b6Ezjh$Y&@Q(3|>|z3xMHehDjd#JO(*ECjE%wzw0|~@l` +;A0RK^w@W5OPncD+DiJ^dW$)F_oT-#~W_8^*T;vF|L}5jVY3GRSPlx_3Hf@@h7ddC03%|UtN5-xVZBA +?*vORBU*9|d0nQKV3wDprm{?}5sd6vO5_5%|1|yE($gvU%h7h^iLJM?78xJ`Xlf!-0~-l!&zd%xiDF! +nj>Xbv0ajb|K?B)mU34H7q^ukmSR>)f2#jN_xML18MnzH+`xeQ3@p&ec2c?c>g{4D(WOs +|?{$??seSv@cu9F-dW#m +RcJl6hPpBdhsQPA1w-|D1`k_&t9d%UBnH2kLp|)7h72o(DKk_oR32CH<)sfp*VNiH9g|9hl`W^jwsXo +JH6_X^I!j> +7eYPTh;VQupBU#PL8#a{Qvb_S)!7olro)5Rm5JxyMB-smmAE&4iY9T~#7_hRU4^d$SC3J-o=cZ<%WYy +a0v*n#pE#2>FuF>af9JGp`bX?G0X-r_^wPAXvP_yx_+8EQEH1B8dL=@NodVz`cYpdRrWg}7Bcl_qpErLVe(9{ +kcphTQS2rXjoin9cYE;kJhCx0?|z<~KJ?3E$CQo+v*{lcw5_J$WWchc^VoJWWwfo}C?uWX(9WFb_z7GS<5R&yr;)mq{dRGOrJ=U+FHlPZ1QY-O00;of09jiI95 +r?I1^@u&82|t&0001RX>c!JX>N37a&BR4FLiWjY;!MTZ*6d4bZKH~Y-x0PUvyz-b1ras%~?%z+cprr> +sO%gq2xrSEhljj%_yC=)9K{WX4*_Iu7-h0NJ2~!90HWAasA)B3xXdYDcMf?5glX-1RmZl-Yym}rSxZ> +@q%eiSQe9=EN;k7=nZ-Q(|hvb;wAY}ra9B%S|md6$p^Mp0i|>@SrsxRVYn)FS@19$#)_!ZA~Ma3yx{O1W-R5y)@_%Ekg7j*%A#(QKbeFq&w&UlqD=^_$O2ptAVZOGub^J=%n +!XksDrh-;We?SR9dDX4ahqUF5 +HuAPS#S!D4v3+a@%JE5Q;EGN(kksOgThLOu)351HlNBiO|T$D9>bwz(JsQ_u<_=4bX2)d)0E|Vq7IW^ +DL{7`eeTJoq^~-qW}PRmDpK%M=S04rFr6s;;qn5Dl}LHi1duaBF?_mR=D1G-;5~*pO)R=sb1Cb;UtLv +AwJSF(c*ZJAjPjRNPyN?7$LywYYPutzXxK&RbgkrhdTMM17xs)KQ2hXN2@YPs@N!KjndgbD;FIK8J3G +M;ai?Sw`*}YI4oym;SH%`d^AYDfwGbEnQpVwS*KYSS;3_&+b1F`Zy)Qcu{Ef&iV2F!L80P#{Zy_nRu< ++LRAhw~Sh;x=cG2BCV@%bC-DEG) +-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 +U`Ip2ylRNkie +_@!km?zKML1TVLlDODfb0bPWWzB)B9VQJGY(Xc@Wte9$*2sN1okw^)ft<$z-hv|FbAu|qw%}FQl +sS9|x>0P`rQfK2ii@A9|vzGN}B^{}d4d8r!%t_D(#Azas&i99DDE^-a)BBE>(wKP0s<;y~^dB=^e8Wb +8-O(Vz9;Cz25o2FnA8}D&DPMvsh2~b8Uc!qUsB}?ae$xMjYkPa7UQ$b4#ZaM^#itLi-?I;IKE7U%GkV +^gqv5l>+f^tBii^yJmxi{Q*Oa@=mlrQ13?zzAa4aa_%7jxOca(`=y0b +e;6ceBY4EPSQCN6gUoquCkeIQ*9s>rN+6bnB`HGaT3q#WJW$>I%1*R2^x=h0LPCm@X)qIG(#G>|JRPr +bt9tv`9}1^K6JJX{R2=-0|XQR000O8%K%whw$^TKNCf}@{0sm9A^-pYaA|NaUukZ1WpZv|Y%g_mX>4; +ZWo~qGd2nxOZgg`laCx0qO>f*b5WVlO7$^s80YyIL5CaL|q(&2qVOX-Z! +MQAKq=6Hb7umntAhP=FO0cJ0I76qxUH`bHT+IZoW(QY;y-zhJxH>P#d3$uB0&EQqL`E3oSnt +^-O=Y`U6)S}JHR^^>gdJ4kN$Ltu(<)!I*;V0YoZ!drN<^A<+R$P3zc>V6?{MAnv#pU_W7uWQHZfAsl2 +~d(OJl6dD1w8Vlv<_JSyfz5_$=I*oW0N2GpmcP;o2h!@a~7Zq(Y9tKt3p0_soBMW)t4m6D9Po6Ouk05 +f21DhC;2C%blMB+-F)-9HkQIG;=)ZW$a`z5q4eniW_FBCgu9!~W|gd|SXt5c(x$@RyEAH)^S931JNk< +*jh0}=Kj!rGC1U!RVv;1UrS?{|G6I+S;3S!vlyif00ZUlrl)k5+m8fC +qHgbfB|jSP}Rs?L5fJDkCtkj@(e!NR#QV$*WERWQR4~OCRZVW(n>w?Hj{2kxM1KL=ffBJf&lN^lYgrz +)&a4Mrh@_P{ft6nt8;qunb6*vJ&j^K5+Gh!=v)n^fsXPtte#xXk^=Gw34LFYOH1KOdZo5?Bga8nlbj# +1qj5TaGx~H;h-rA9~05s+9staZ*y_eecdrPw$m)h6Qhq(|+BHQ}~=l8J#|R_WXHNY_( +J<8$fphtB0}BG-%}6u0s~=x*wF=yELjATWigtMQ_$-pc0A3v_~N#JKxaB)3Du6g1jW;k5qQ>?4U#Ixq +7kT?Rpb2POX(Fg$~Oy4D5WIV#u#pNaqWVT83R+Ai;u}6~Ifw0AsE<1AN0eHdL#7uB{n-NSHAo!SHEJA +dbVHCZt{}YjlU_e3HdNX<^qzD+MW?95tyk(6 +;p(`Q86fZ{b9IZ(chT#Jsna^|Ax5}rZi<5oqEC?3hfCd&J<`K}nTFtpBTM_{S**=0f+dDe=BWJ*_2WQ +3BG@3*E#kOkT6VLU0)u^&bC#d=@*`o1;#?e0x`fb(PM)Q +ruO^cP*IF>3{E--Q^M&=4P*;3amYBf=9jIhzBaYk?}^@UDzL@gwX?z>poS6tRSly!Zf@e-3IXTE<*8GVbd +g9>{ZaQf`FBrGB&FQvQYSM@w8LsyQFYgUdEVPzk<9PFc8oS~mw3dOT0KMulD1hKI-I^Ncp%xMw@V@Gn +D954bJt#EmUoj5kK`F3r$Zfw}@EXF3U~;&65N8=}RfW40e;_BT*V0|XQR000O8%K%wh&)r~7RR{n8c@ ++QvApigXaA|NaUukZ1WpZv|Y%g_mX>4;ZW@&6?b9r-gWo<5Sd5u_YkK4Er{_bDFIzVIJc@<}`*}E>_q +IYT11}(COydVLBgFs7^%`7ddB(+{0?#K6;q2Bzmo9>6il4pj)d3l~07tZcPnih4aok~-oca?QP$g;FS +25n0}nY8bUawkK!?H;WkJ|&e5{TEJ_x!rY7zVVZS4#})BDr1w0TxZ=$|5T-NGFaD1l|kJHqt~54`(`I +gxlyfDP`j$oMs+f8Pkt@DR_n=;O8U!Og|R-^AKlb3 +GCGdm`QxVy{GQ%cntX<((2z>}4Z@jYdS+Dxr#kVvjH3zpw>fYA-5hGv)n)M9S9MUOhENe62l-!25cq@ +Fl{46W|Bi%C&zagBbU`^zDkB43S*%uKy4U3oms4S#KpDX)FGFxMi<71Zq=FCAd32xtaPQic;)AQz +gkR!dHPlt2yB`z_T235h?gdWqo>xY^k=>R$WMS{x+e{axKh^%%_l|j_-FF8<*=G)87<`jkHq3LM;eWfxj4PsK}hH4Wr6VBRbQ|J;w%kcr(V-ZD3s+2R$8Dp +qm1qZjvDOUINukdwl#a@T4t%JDumne+fBq!P^wNw8%xNVgqxZ|R4<9{rz?lV;dar6F_bJm@=*yi`OG+ +vzuv|kRVB5(&n3RmxM-h!S#r8oZ`{5;j}N@Ec-yb`@87YC}l1e%PlJ9eL<-nK>Gb6sCB2 +2Lh_KLRZ3W|@DL844#2yDBB%8rpdwzWeTWFWtsp6F_ly_n7!)Kr1Tr`0sD=KGW&+UGz)}GI?S2Et+)w +70oFs3!tI$LLEtgQ&~im@QYsYO=B;8faeiPy~v!BLFK|L6uL4EXdtKes`PlyNpr2ZA%ZIDDcAlsc5D% +-Xkn|pJ)$N7KVIlS`gwa=yeX;^7_+93q0`xJhv>;ElrxgSsEDo2z1 +05qL}r?kt>7tU2&cl!&~iEXKP~+K}8k%zL#2~E6<7fx*)M>f^or$6k}}kwF#(FVyoFu4# +iO7C!O4AW%5?D|Du4ZF-MY7CMitqx3k0M#%&7Ul-aD4L99wUn*)L;P66#R1+SR0WYwv>K%R1WEHD?O-)UP`S?1lh-L|L`X+9RcVw7v*>H1!vaP)om2v{2GY5wUdWA8YDe%) +MQ=RHoV|q5PSho#DkvC&Mxz(KO1L#oPJNJRQAj;G$bkjN9MM+!M}p-6n&!fm;@6w^Z$5)*omOq5G5RB +_p1%I1F*NP{VaYPLA5bnJM|lDrrmzKNHIHp)EDlBEOC~7hY?4hzvR>a$PiBY*`C +yFX=PRunFt{on5jj7E^#}JE+FN%!%Ivk+hEQEUd$z7Oh;Dkag)CL$ESDVkNElJyH`Jd=pJ5ue)*r#3=wA>VvAQiIi8tyh{=u>epL<&fyc +&kM&SvVmnfH81eCQ_ndEF!lMtGXn!d+6Pcfv+CP%h@p`Hp*+v?30#9fy(4VdPvxeP==tP6}-9N7VA#s +#1qa@gj`wXX3AwBbD=%7A?jUJsPESCN??w*}Bl1^KGIq_K$Ah4e!;`>tVo4G-_Z()rOKK*#KG0mo5)6M%ua;Av9%n{f*zZrX%@pA#nS-lkhTw +*24)cL<^BFT8}gX`(B#cW5(ih6)l48uM; +$<;3Q6*?*lU*@dQsZm{2j4&JLg?9$G{QD(KMG`oS8|j#XVYKn}FwA29=lZ$L?5tPGo|haJp*eZLwduQzj$Y5wKrAe4{Z|FL+UQS5_?;kFrBu6ok&gIe3>plVvl<1o~_h4J*A%_-``T7$TNgtMtU(t_q48YF_et-&tBZLjTdT;m-(q1m3Hm|`zzVim ++YSVVY%Plecq5Tq6rHjZ`kqm^xZpolzjj?-z#=dpN4U=tgm9~m}UC|F|J}vU=@%>q5Hi}-q%`7-x(KB +Tpv°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 +10g4R#eGg%kRK-v~{PF0DM4`sTOOnnK{t#*_i3 +FtqosDIHLwvu$YMr{85U7<9F*msAe!TY9Jlxms)Ud29%zF{TF`rr +!7fsF*v?f*`uyVU<;1mJZVI958^|KJ>_57k0Nvi)_5jX)ukA6fJ#5snZ9`z1`7 +Io`6pBI$w$lzebuTH>558SP3EB73>(@*>jhZlOrbe!Gr8K8%Fi3d^$Bgw3WI0qQz)0O67$ag@rJvA?; +H(te%IXuAvs=ze4xt;IYXx&+r%EiKo|M!(`ou=gME7&dA=##d=ZdFu+&HZ`TL^GPz(l!77o}9S$QX44 +kYDgq1%5iVUl1V?QugvtbJ=k{u_mo^~tqupdr(EaJ(Pagu)_M_XJQ|%F9CJR|jgNo-tv^Sj>4{p+1yF9qfju +(a822pe7t#$;hL$z5XvWDD;s`fAl1e7_@m<9sev*O@PStZvdZ0TL6^sjfMl$x3A()DbpQ?AaX_GDe;@ +n3#<00K0R)dYmJEmmQ!hppJABvXOFf>nc(D{gA^m^zal`?`fl9Y?gRor-Z#lyezIH(jBbD^;X>Rzj5Z~h}qWID +aZC_B;Lhjl&8@My2_wK$>Ia&2#&W4(GoS7znn9f)ATP4^ls?wRBv<3z4`*#P3!wN)cWbGr~q6(gF6;d +_~`G?tEMsp3c5+7OH4RMQ6PfB|HKW`G;fU$1ST=|9E6n-0Ine +fe=(|a;~pM`UGnF(AN0%Yuy^;dbu)tDGmBl1F2XDzJSF>29BOX(2Trmj{jRqY9cW_Ld%jC +DaDAcAa)eHhuQKdbr|%Ni0RI?IW(({Q6v8f=B*RMa0tm@CY7jnbl_uHo=~RIbA-9*$KqKf}}!ftUeHoS8r2kb2eAy- +%y(UJkA{*O>$Bj)oU@aKR9P$N +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 +H?0v>WQ2`gXY7t|SeMHjbtSkk%_>}Ne$ +Oj-I`6k(FEjw#3SbHH+mpBA+2L2hG;34!Vl72pmSjX&VTxQ{#mR<;;k|hXg3zmE1m@ +gu}apoeQgHijq$@OcHPQ8K?0GnvE~p*BhfO(vaf;2^4$;D~SHjHpMDH0~TfG5#<&@QsoMY4pc#VV5th%4wGtPSA|66de>D8E(CkR+ +l34$8&J*>_>r(ZzYRlOv=7DeNBNG<-z02^8*dnp3&jX|x0+*D2)h8^=Rs{P2{0 +03g-ZBAjtj`iAiQV=d%4U!hzLc4~#prNPhoNaZqYL;}bi5*PhLiY{C3{wX&zM9WPSjU(bC=Fq7dxz2x +nASH%Q(#pmYrbnj_L@mpl9oKf|KU*@Uir9!T^#K&g +xrq6^Y&Y5DxplI7SsUS2Isl3TRtgNs+5~paum)57AmEgQVNX-K00%m=;0O0{+06NuKW=)fB8GnT05Z^W9GP~!vHU9M(H#`p)%`>+)f#N9Q_3GQ)AakURk +tQ9hb9YI3w#6IID$}Tp4|rcb}e_oHtC8Y^c`Z+78Hfna&t2sT)RyIOq9?V8~}kwpuqT|f%6F6&|@I4; +)XLBWbJLn7v|S2bsm$5S!#?I5PyR=SF~!7)0LE!=&Ht1bGfZZ%Kx-s>gO?ginyiV#Hba@u1DY`P{gXP +Xrn0*kGE|)am7(cg&@#ew?t@EsffjgGG6{z#j6#l22+ZtF~_udq^QMIm-R7;Ur^_z1b2mLMNtrzOmS; +J$-yp;bSLaOV|Hi+5&%7YH#t*>4j7b>_O4G|_}S440juP|OajM*`jY(43CNvH6|i&)Bm_N}l$2csBSk +42DjT798V+s~>Rm$QY~!)L!{{Q-lG=wD!fzpfFMw4l7;iXFCzFYVYHTA~a +WoTm6m3k!wcL=~3crC4pfg5Qg+Q+*toMC8`h}+kCPI7Umqwk!LouQGH~7t&**xdDZA%aINK8Y%8B&qSaX;PPH%$yJsmgqWgk7Ic^IYKY-{q)9B^%Y@wui_GO +Nd_C1Iwu^6%ol4n!2U&A>7b~4;LNxmYau&2g-L~9w1Jxlj{`BZXtkES=ycMTZBmaW4Oe6{~srhAO#vN +Oy{8W?oHnz7MMLfAgBQh3k`lo5LXMY4echzw7kbTGd_qZ=;cLi4Fhid?r`IXJTWsG*0Sm(mGJ>@8l|v6 +BbN`+q|@~PZhf9^ +TVRZLw|nS4LK)Qognm%N*|nlY-Ddl_tzA~TDb;VTIfE(aBqMZtcr%uCALFM!H}&C6+aX%xhRyHqOtbq +JeG?be-~cMr$Y^AIV|lcv(7rV6)K>Fz`kt*IxuIBfe!0`nhd5TEwTkBkuC@@&iJIex`v3>cV0|1o)7z +H(aB&J%Vzhn*6M(V{3hi`4V3@E5qdLT@?6OP3I6R2zLgui`6Q3LZ#}&_2)V@ +W`u_|h6enw3bs;l*#Yg3^_m2ep*N-{V@@&kq;(*A&M_a?O>M6)FUK4=58+2*^-8w*bA8{p*VlJ3Ko#CoT*Ls*!gknWJ1Tf*&FAo(m~V(XFrjvjGAUOZ?U*q=cFp +XjW^ylfHSp9)Zkks6*h|3qQ)Tw>d@d*^a +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 +#OjK1v~#|e0?!v@X4}_zTX+a +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 +Ci3Q*ctlkx#CjF-+Y^BRV@cA5you;D +sYhA#w48=M^D_u4DTf{;TwNTpVB{l$mq5#Q3X`I(Xi#GlnlfRQ855{;N?_Lxbb)Wzh1XmCu7?=$P^hG +&71uxy<0DM$#kh@~`Lx|x*Pa7@|6%B}E3k!=fPP0Nm_8xsLcV_bu8)$j_cr0YCV!$tj!E}L@E}Dn%MwgivNKOi!sS4DTV|osxayzR1h!U1ys538dKw-& +cF=%45~wT-WBfKDfo@1QA)FS4{k-uYXyx`y1pGxuq$4T?#fPggRJQ-UGXXhE%{k3ctQ3re56p9Fz;u8ksm`a+w# +#s=OGx9Uq-(ry-0)o6z?Ng@6g{V;ZjtqjOW2;jvdK6PrF`*4m^*c3X?N%Y^O76uSADov_F6?hJd5N4pzaisntto5W~d3D?n8S4yxUncOIwoI4r=$modaicmOP$ +u7;YwgJH;atYw~*9Ve3z)yuvQWl=%&w-s>SNMJ1Ps36q8uyt_T5-1?&19FTV0-LURd0Hf0_3Nah_2IT +Wx7b;(M@Mt7LxEE*y08xAiRtkd?M385P56{tt-|tjP_;AYpFl7giqM_gQ#~s{MCmR<4;iW`}i&A7XD^ukqLm+EkTe+jXL%XOaPb-^r0DJ7IwkR!ZLsY?!oazuHWXKX4+(P7 +8!E!-p0f7si<)PNbM{jEz?1&~_KVheQhp2Gu0-Ch0pR8`y +vm%2WK_F2oH#8W4X{%rdhY3?y6-kTWv7qRJ~2k(H?9N&$W8%E`B6G(5tJASd{=1{qMuqhHqnbXOzZv=c~Sbw=6fEY%`swk^Jh{4 +ZKj}O76(S@6wzAIuW&!NnNEv_L7V8bO9h$i8|kB!7~?}=IA=fD4xJ&X??#6SP-ABLV^iH(?wwxI(a +__{zd?a#<^MYHQ0?@|Jlo9c5g?=7+-uroD +DUR#!RO3g+R9;fC;BN#>3FAyOYjj_Q)mog839NY{AJm>NTyV5hx?Ui5#xy4Qb9uQay{o_+jA{^yecv@ +EI`HEllkY(JB;S9gABJ`B9+1o0zI4!0Z(?y=V;U=3YE)DnVM&DSLzF#%p66p(6!fM*7<##|dsFFb+aH +aL4n{MoaLrDLicU-xYJuE$EcP(Py-}tsXADv5^V_H$Qv)I7xlvlPUMCz6H_;UDS&6i +MGVx_Imj=CWx%BGd9F)ELr`kCVg8)3tFag}EUpW6!Hj+$CI-_urmM@4_^VW}YPju6w@7PU-coEuLJU0 +?B^x(XgUVcdqi7Q-`5pC>%+es9c!JX +>N37a&BR4FLiWjY;!Mla%^)haCwbXO>f&U488kTaOx#SQ>W{8=nSO5kZwSMq64~i#jq8D>d3P;MRX;( +K``vUkCf$nbUn<6grdYp^6^P}*`f=8KGVJBgVXlMuwkTD1Xl2vP?O1QngEC6mA)$gpdG4P;ZDHj +UlgGbW^GVB5x`J^J&V~0U4`s36=@Wo!L=$}&S1zUwh#~n1I!9k#L%|Ce_L#P3Y*d?W)#ZT0BBx045i5 +Nd4D1uqJR3}6G3CyX`Im@RLO=K}kF)7*q#nOhGo~l^*-cjkj>W5bNz$C0R!N;w5ECTdL^D)%oD|S#x3 +uw(6Vu5`M0`Q7u)FvdHLO%r6A^o +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 +%j(yx_d_D<(->+)|diZsp8|w)I| +^+>v1)q~rrs(>D(c@B`l^}+^x={aZk3qvsScP12ol+h_z +IjBY$c-mIfbbn)#g>*q06n#}p1rO}7_7#pZ#fqiquQ-keZMhfVTN0c-Sxw0UqpUhdHD*+=i?e^IuJFl +Gn3yG|nG$xRUT=!P)lwUYN!Bk{Sw@t{(%^^O_CQaJVkQ$vd;Jw@#R3F4U6tVtb~-Q}=j&?L(uf`4RH> +xumXoDN%K6fiKlb28Sg@2rvYX|1Pw-~b~km*3@FI~m;JfU(kTI54>?6f7KOZlw+0Ku;!Y@R9^#V>V8E +HD5um5v$-9jKm7I==cgSi`j>;DnloI#_fvZ=Hbk+4T`oxUNfjVo*FrJ(WIQN$rJh*cOQD5{pQ9F#*L( +s-M-=cV)R!Lz^v9~Nx?7VR +b?zOp)iJQ;e~A#ABy>;2EQug#PxbC>4#Yl8e=V{1n(IP?^*!58HC%@)4@$!&6ffC^23*dH@6aWAK2ms3fSz9ly-o-Bg002}10012T003}la4%nJZggdGZeeUMc4KodUtei% +X>?y-E^v8uQO!;QK@7g{Q#9cqB)HMUlUD2*F3 +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 +9!#)Gxsg5x5HqX2LnPh6bzs7K<&i%u +v!%xdqIVp;rTIt*N33eRxez8jrzX&;)bzz9D*M917+)&&Uz{YNrqXOAX7zYI*%GHh#6W9M!h-O{;hiiK_+z!JilVQ+A}&F_NEE0)5w-UG-r=4g|Hg8+o@YrM0=!;;{f-e=qw^Q*O|jFPj +l(LJjOxuR>J}-QRSu93FrqdshB9z_;WLOY8IPhESu&zEj(=yQ#S(v6q_mu(0^@wtbPxoT65au%J%%lk +h2Rm(7VP-Ne<{U=nYFBhCIWs30trdOfK8N=F9kg>B9Z4cZ_ojO%-%RQOAxb+f5-pR`tPdNz?Mykp&D% +VuriW+>+!(Z$3V#-E=bPYUAEYwgxLU&T1DlOIMnQo@=DQC3mXj55Tu# +~`MynFExJg9XYRaZ}2W_Q8IetK$8Wxw7sq*n;dux?a*0NTt5!vp$z50c)A5C&f?ZHGV4Fb)-2kC|Ase +Y}*z0Z*WlgRh!nNo~^ZF9;jXr)B81^W-`i+XV%gUP~4`ZZ5Z5KLP9RO?ifA?S^ZEZi?6SlT^{n);M!Ox8#Wa7G-qM~*b^3c>tAXuRfNL*lH +I$qol3TNJA#8{-{vHK;QiT5rk%WIGR5SRwmvtuA7YyOFT&0e$v8B9vDUwBdqO2l=^KLOu?X(2)KngO3uN)gc#(U8Y$pu +E_@&>~MEa3luNan7<3oUQb`i{hxS^}O7LQ>Nn622>ID(#XH!9s2|S`Ah!UvFxbkj +Jz>ixudiYv8ryREJdJ9@bDFqB +O}?_1BZeyJ4U*S$@;cUDbtZM+2cm!{sB^(W6b3&Hnfzve*N2~Arpk$JmHkF$!EW2OT&cN +WjU_(&jVb&=46|oN=5c*P*>B9$_o_a#;W8*PS_QQt(+^1O6_3v#9@`RnJSt_d9v(c9Ki3tiw14NKzX= +Um9g4`dgi7UIi0G{Y%;(U(AkfXw>jq4v;MXC1K=)GV-9d_4ITW9c>Bmio7=m#P}!ax{YiAp6G4-eeoM +1O`!$Sm243gy(UwJrCQG(chG*BRcS#x?AFOb%a3B_+oTXTdA1RGu{)&7QX(+lNpP5aDN3A3Wtmg +#!HZS^f&}zdZqfXcHY!yBP&if)&NRoO9F^m?wjpg8N(*FaU^SdpXyWh(%(I=?vUx*QG}ux~aPRFyHAL +5XIx-Fk9oEdHWi71vQz8ZD;&nWojsq%E2Np|TD%^!$6EncsZqb?hYyN7EM$nXdi(R +t8Ol2UJG}3usSHLXO46Kxc +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 +nxr1XRwT)UjzE;`%$`NK +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 +qQjbC5%<#L?b5!OVWL0;|wqo}*aCEMF~uw$=# +RyI$D}`O1axO9QUOQ#D~;*=RK=j6TS2#HbZ*w5P(ho}tf5|OL$oPuMxpSqdmTGt_N$BDFh%2d(;KXJD +DuUq^QjmLH#00S>i&TDH86QzNo^8R{WbjFY42o7V_3Iu>a$s1sfX`V7n>*+h((=%cAO#v^@6pp!iHz4jp9Tw22# +>efaRVkew^dD09RMWN+%Qg518i5|W+&{KK?+!J+)3{Z7jdrfR{qmX$u+*$l=Riw-L|Z;?~m!y!cGOE* +V!RjMMVYHpZ*1aG<-Q(c_?TBoHO9SH}4ImQ!eVN~i)cDS$h9#Rg?g|dvi4jB=yL-zi=*Y6&^f{Ffk&Y +n)`sznu)18I7$~m4NpAg1LcT%->-3mx;@KkHVd{5DQ1VC5Unv|Uvl79o16s1s0IvS>ORq~ZUz +@>{#lFmwE5-Er{X+Ybm553j-RbE`@LD)$hjdi7*M27ycS?A5 +DeQb@NKFA7To>;5b|lp$H6(8r4YDQ)7x6R2x<@r&QPBzGr+Bm$Ej(W~gtB9jh8MO1DyQjFVbk)4 +MG6%Z@+HBG(F_C+VT8mSab!%Kpj73wT8jEwq8hS=rQ?1Yj+Y&%k@5?q6Y>O;Pe#K +mMWQ1lsocb5UK0-46Hy^J`@foFUS_=sMBGKp;6~wyR|sPUPFVs(AaBf9TZ|3i&SI7yUNpA8Of4^>AI3 +?}mL|)t$PpYPoNU12t4nwspmG;Ei{8TQmb#_q7B>6q3LZ2dCTh9p^}`S&Zed-glzpQigcz*+1`YG>#= +e&s}Tva3i{1(dVUVoENtBu6W1IW8zkxWB;73*ky8C%H-jaI>8$>0XKR`)dMB2$eNdo~P~rtYQ?AnvHaUlxs2?eqf;zHWh3+rHl?O +GdvEFE(|<=@*_~u_p{@nGt8Glho5E^24jVO;5mT-HkuYkAzfTf;WvMoXJtU;XU +hW(Sh7A?*je@=*`@HkFUpd`=@1q3LFI?cl*J5g&Kq{UFfp@co5ndmunLz!oHb-xAuc3>^%6|d;UzT=z +v150^!ld7Mh&zq2VU^XeR +OL8C>3edIaEBAIC61B}OJRX+3#(&z>Nl|59(Dhv*KgkLnKk`9cDXHLo`{tUOXFy|5#7Li9N<`kau$Tg +CfEl%&Wk@AX@{w>;IX4q5vW1|nkOzaI|$77Uag?+eKg2wNYR&zE7l1sgSgU+?|`z#rVV@ZaRtpPJJv{fhpkBFQB4Anq%^-XTDCY7Zw +>E+!P=16ONs)6#{o-s@eUGe}Ryp +ji!zAzq(9&8T{ryYJSntG-KYK|OaweIsgmAu(3nXw2S{@`|kFV>rg_6v|bYZRb^Vvl;ygc>AbWf+*t +oRB%kfs~Vdp?qvq$Mh=mxOaQ*d;+~TA{e--ya8E`+B0DW3p~?5;d6RtQxXV70V3?U@WcAK*8Y}e%uKv +({`dU-q8LW1Yvi@Mlg!#azx51EsMbeAW07ESwzVuKFaWMqZL!68!Vn8|qfKf&II%GULy8(?Xi?v5 +Hlk<#wXVFj>^T +z1BbAlHTC}nL{;{jQi9G+BkX%aKt(^qCQ?xai)nP-?VZ;)-64)uo`jA8I_+)`9|dw6siE_29!g0I0yS +#_Lt-xj6#?+lo-qv77WP-PjH;g4qD3{%lM_gd)<3uA~txxi +i~+F{chOI{>J8DhSp1*i=l$!A9w5Fv=OobTK=Y_AIcx>=cyJ$#;<7O5UrU&7;r`tL$oLak-&5ZGmNVe8`+d>w7-=)wMRtM59S%f%_T<7FM1ubT1ihv(u +LI6NyE?MG(Q0V(ZV_RYrMJi)S91$sacWJsJ(cwB>#IUXSdH`I_;?;q=rti7Kml7n7o$z5r>M=!@ZL^IXVt>k3PUJDA^FPhPY#2dg32vSqf$@YEuauS{-MII+kqbur*Ak&#; +$I;q7+1dsJ2nGv`D$&$;VO&nGe>d(51!cDxBTPc&+-qqF##gm+|iryVwdLxpDuH+IUGx=+m8$y~jxQr +UrL{!dXX94-}GC%LLoPf?{_RFt0h|Us0LTu)u*0*f+jLf9*=dSjQ%XeIYkSak8$a1e?!EjHne=!v7`$>7*+qTN`nQKG!|&6Cj>ydvXG^h0e +~iO+9xvz(pah2h+nFC&oS?p$Z>8V&CbIUhl_&i8Icr^5bhe6ua@9Sm}=vn)g1qi6WYZm3blpu +Md-(PETHJ}x~c$BfdWI3xHSZONoM|2?!4xT!%L8FCa0&!z#M5eav^--^l#j8YzXQB}0h0B&`zGV;o)Q +5k%@$uQb}nGu=0Ehnvpsswo%OYs}61v(JM2KoaX3QtCi*1?Rl+C{(w6+mv$Y|xS`!o7$XLR!|8@iH?p +5}831*!2>lk#v)MG#<^T^JH;^V7S8kyuPB-)YpjRI%cv9CS5+tnyPH1pEg$k=U#aEY!B42r8Y?SQ^qz=3oaM+(g{Vf(;B_x=yV9RsWKxm+wFk`8Lbg*CI6X +$$kV@ROjVLOYy|+Mg@}fC}-lXS)dXD964&xy^YPQ>3LR=Xlv}+jm04s3Qn8|uqH$`Wpb0Zp9T`;Zl6K +_<;K6;L(-B}~X=zf{*Kh`6%wJXm`D)>b+ZPP-Sz2&?tRic};b(d(C +F1o9w92%-+Mb-<5jMyzElQ!Bnl0d!`dLg;aMdrp7dpZE +kW^d|&F3?AVK)iqot3VrCBE-p?ZCn!GF)x8IJXM719!Wjr_Del0QdprJ2CX5Ete&O-2b~8);Ce@>!1^8@JB<+NO;C<#+B}jqcf~;l#R*F@62>!?;3~hYT_9#Bs1dP{5FsuDeE=3kiH8 +G280!Hb!hvXojA8?BjDm+wR=F)OaPcAuHML@c$q+--B?JAkulJtLLyglaMOhX)X^1xBs0~mR8T0CXl6 +7^;Rw@0MFSVTAteI}>d{&~``q|#ji%B5=)&=18`0OpM8Dcu@j7bbL)b0{PgUhR9b~cCgM8e_aADp56o +aKYPKCogfMKkougOZH=Ih9?u`@4MaLSL{;|MMkA*Fn>&L+>i3BBAp9?|%mqR&h`7`omIN2*HcG@wW7- +T!>zg7M_GU_|SJYJ>(WhESzRa{qJ*5RE|5R8m$2!g#xSInt~q}8ar9^VhDSw<#y?b`qhjU|A7+r#*x% ++$4@_g2Tr;g8&)pm6Rfhw-4OLk`#CNr=57AMR6t}^5gJI?5xF;0MA%pWP`5=hLPodoW#7;uin)%+b%D +evXc=ogRD4C8(H70Dt=Pf +syeyc1nz7OMwM_8eSBN& +DRti{)r|Z0Ai62}U0T9Xu_=2$@b0i=o36N-EpQBqK)`Y*PZGPOFsgAR29cliGe!Wa7G;vH+9Yp8hr@m +Z(0}MY;c_Wp!89mAdK&?~lvvTvTZ$e~(6HB6umrz;@)azLUX-Hw`uyzdE9m+4GS-#y3i7sng4LDKa(6 +&>oxzi{?+?%Sdx|jVD(vhg|A=aBbpF&|{UMQY!=5gb%1?n{OZIee`P6M+87?6Ia!T+x2Y;-+O;lPc*cn-#0y>e5idYYGZm#&`Sv;GB_ExpvPM5 +ylbo?zS~3ojUMEd6fYkWiwRVcWgAMIY^-DI>p6jOckVS1vPE&h+@m0g7q=9iiGLW#g!zBiLG}_*h;{$ +sLHya6j7N)e;z0)qX5pmB6R)o!G$cIkC`an&jw(L$wYvVi8Z)5ZF*c&Uyic$MhzQp+6#>w;+{74O6on +l?hhbQ=uo9j{N>05JSB{(hz53g)}T74S$Wy1d5u|WDtDsR2Q{4P>WP_E=NhOr=POT8OzR^Yk0^#Q#M! +zbZ%lXcARTpgIC~zwo^D)PJrm`tFhkr)=eZh}puA-yYv$ZU>UgpUSa@uawP;qF`WFQu@C#;hcCSqzb# +Q>(J={(!x>|xNS|1>;eLo1=GOK&-2!QgTYTDLq{=t;$1|LdrUbaWqQ>cUpIwuiz0GD5WPGEJRfUy2fsBAGzUgc(h18raTp!ez9jFFo-VN9 +Ir{2LufSl#dn|S2cd55TQODS%%S7D-GIH*zj3w3@t|f&ezCj`@RLM;%d +u4-!Pv~PF+nV;xW`V2pJ3N=a0+J;qDv4&~1|d@2;;AvFmHvtP=ASyka()l=47DQCNO`!HJuCF~b{{0kuOw*s +&l_Ip!7&I+KHK02l0I%*HR%}m`x{lX6jdnp?0qB*S(<--6J}$Oxb^@uWFT(-ieCq&C>E+al>8F +3dEIQjZw{7P|=D7kBsMF;)>lp)WhLbaN-iG4!LX$%sccJqzWkSSKCxqG`iFv9;$Z7ZfwjeHO>~r`o7n +QE}}_9sxz!9(qpt2M(~{7#TLuSxE`Zd_9|M$80a5eSPocwurjaWJV;IuCbje{*4%Dc1aqTz^iG~7jJI +bCw{GeL{BQ=@Og;`5T-=(2!#o;IGu=AWKD4G0J$DZEE1e;`?*uazmSCU?K~lkH=2^jg +4d?{S1%a+4m{gaMbg>sus@vDQVv|6J$?Fr|2s?Cdk7lR634 +`P>2noOdd0WLNJ)7|kc*arDrcF|^gfop^_|G$44nee@lzOb4{H@OE~Ae=IbPQ?>Dl@^(v8zBbjNYS0_fT^sAk@LJeQgdoO_xYOJdv_0zBUDaW^bv +~xh|zEKsJ>g7E>twNPjvL6&?Uxxc!uXu5&fmA%YQk&jMV+0>7FY-+XlmdXz^IRb$u#0s1Rls;c36dzc+Se@g3o@(r!I4q!y`O#xC+ +<-~+2SryH5(KZL$LX{a(lY7K)X!ZAmur5Urz`itk--?2l5`rHPMq)%f7Iqnm85SQqBXZj3}5q?|3j#V0`;A`CC=VaIq&)spb$c>UKGuixSkFQKZ&&}K0IGe4tluUcJ)hWo_&6eF%Z{(+ae?6{Wg7ky+UMyEO<@n_Aw66_!b +Wv{1IAzrmV6)&mC5?uv##t*u7M7BT8)e&hT{(uKvr8E^ZGbDU|aq;2}kkGXT!`Rlm8Z{?%$jJv0B^Yh +|>LU6h_A3^2D#}!l>qLS@egsUI+Qp(({J>rOjJ*-dz$d_`KrLhl5^Drx?=aTK*Hl5K1?WonAIiknVgy +|Y2%k!^3j4uvi7}F@i(!GWn?|hh3S4ga4vfUEZWrqFVN|bfSsJTJ+azx|$5LZiqkK}WG3D8d_@E|%g5 +PJ{ANEC7i!gS>;b*vXsA6vaAt3gcz**cMXM|_s +fBONy1mVyZZ}z7YbS*qm>TjJiW*>_R5Iyg-W7jyywFyAH4Jv8MHH+3S8hAw|lsgDgDMz*DrXacE>U4n +d(wW>r1c@u1_v+KI7RHX_S&drm6l?6qkMKK{qnces46Bkom02Jc!Jc4cm4Z*nhEML|SOMJ{r4bgf!la~n6ZeV<=}+80YKir#fL_rbeKmDkq2QI-5rwz8@FB!V*_i +D+gpJD8Eg{Q7%NH!vJZ_9nM#Q+7orfkvbI^yv@ihaXP=EB@))D)heHnNOki<)QfD>55`ubdjq}?Ki#c +y^ChCc>nX4o5jMkVK5tKno#+z#}fBgx^6Hwn%@0u^xQRs!k9RgrHgSp*7d>Mi$F8%U9FN)NJnkCX%Js%#UFq8Bpp%96bsZie#8E@&&n>-Ew+?0va6J|6W{nb>RIU)^NMe?+UY3{7WS+VQ~;dvksD_VUA*OSAR0ixhAJnfI=bKD1BlaGyo{)< +Cf*2He)JRLyZI(fsAD?s%#HTMduHdi{GkZpXG9aJFa{Mi{C+n9bxqsg?!z}0PNQd@%i%2yZ4u?KEe<@iVpNtzVBV^LR&FPIy;p6Q;87d+p-=jh+VIT5bBtWiVZK*hHu( +7!j3TC-rl<>N3GY{r)THT$hCuP_=@JYx4!km?d_^N@SNha7{b=Bn1%6AJ`PYx%}s>t;U`A#-d5tr%5@ +Ou+LEWFFy6v@>veR)*vZA92R!8J?XoEMA<#`w2)?%rbK{$?b`3NYff+5f_QL`DOzT`Fd;r(GdoJTAkW +tv<>4%m1DLmloehE<7e&87r4OIFstM3tU4rbrkmXdnc)wXm3DGlBS8;eO1adq_g4#1-Tk<_~}O7tK7u +A +W3#ct0EGq@2Vpt}NJ*b#-EULqY{nhP;L*k6tfOhlv9>+@8C^N{lovrYe(?9CLl@7Na=^w7gX>?)Ia_B +31W**$f>ok<2>l&EGZ`HUW1Yp{$PaLDALED}Vmbhow>kj}D2KO%u9a7Z7Z3Je&hEVhdT1Ab?l$EEVCY +;9hc{?z2hvRk;LO*^H;e!7?atFYiv_T5e%U+aG(8mNZ*i?aJ(KwlM8ZT)1K0bl9P$7}@D^~1jglc0Bz +d3nBF4w|#bA=Aus?PJUI=UQ@!$!SM7t#VX`PBo+La{#IM*aW$qQgga2fMUKRVG20uqZ+itV~O6WG%1) +fcjkKOE-Yn}r7FB3n@*27@2MNOVvhqKzOv;NBPg*tWu5H2BBOy$@ro4@_KHbIaRf*-}L4KSwAl!kN7( +mj6OX2CjJlbkuG;WH{i`jcrHa7PvUn0N@Ekl)AI!Qd~4taF4H6^!j^y$Is_}<<7B9n;5VPh>vX!=NHi +c_&urQ6p>MkvR)H(2q_X*a``ghf=L?^C@&)uWx&?@Uhcryn|w~58R1TIwVeTxIB8GM@Cjij!9dfrDYB +3{-HR&2PFP=Thmrz+O~#v`UjmNu6aps)O_~wRWOBiad-OsdXN-FJywTsy;Zmel51qwYVH$-XKRd#qrmNdvj*RsULWvVym%TR;iXgUeI%##y4@4)R!w+o4sMPfD +;Z101wo*pT{6OyTs23jlW!N((ggehUovX$ofm608Dh4a$6E@ewSt)g~c>2N-B8+voD>0Hh%I-x0E3zFbq%J+ft$(4`@cum)DNE{>=#ku +RA=r=)ez|0@*184R)!1l&AqG^fP2Fz +fxV?In>uVd?k|$h@5hKeGux@EA4=YLCi?YAniOs!vbn86c3;TZls;J7SsWN0Zrb`AS&esPl^f}In0u?7U9)mWfOVl`9b*~?dsHH2mMC~(-jLT5dY}Yi^8zG9?t*P +wDQcty)s0FV3Bp=rNCB&6*|2MAD-Cmv+U}523SzO65JC!-HZLCH3Z%Tx#3C&29$}wU-@(|k{i}&o@TU +rbr>QWUB0^3!e`-*;PvqAB$(%{xRAVXeT8$G~o+}mF8osR#=B`D5$}(YoWt-!qLr~bAOFW1`x8kK)oq +3V!Oeo(9JwMZ=l(s~2NEc#62?U#=i7nnsuYh2NPn~V3E{LG_n-OdfHKlc&B}m%eS<2M*4(YwpB34Z=` +W2IPIHYU5b<*5M2Mr4q=dG2{JF?Dkua#k2FZ7h%_m}W>}IQ~?rOZMI8y>?Z2BT| +SZ)C&m1#TUhx3*B#le01R5Zad=fE0mh+b!lFkwZOS`g6O0`==+x<;jJB>9k~0z5C*q&T|)nM@=`3Yurf_%J5H5zM+Qbsab6#_f(k*QClw6{#9^NdL!l}?o#`Z#insg&pC~nK-#ucNFDFFhcl!J041>7>lOPMxkW@NMO +XzBt*??!sXU)9){H>v)I~@$UQ%0I_K+h5yJDz7i#6I|s=uI#d+e|{=RRmOM&*BLu^Z;C!HIFPRI)J2L +exsO^|2}P*yQ7v3_nt5@qRwmD4vbwo;K!Diw`$22pBD0r|=9dK41c2k#x7aWrfbcN}5VM`%s*}aj@|; +*3;%5V3064Eojg==aIxJjU*V&3uqYG<2+gQ#0S +5tY#cZEW~}qXGGzCHfT=^e>t3qs}kO!lY=|Ltt=+JZOsBv>7K9QBQdwlphqaZlS%o +#t%Ck3al*^=kEMy@p3_s5Erl`rX(o!{jPL<>JzM+Z9Yyi;ZtWY9mg=EKfLc{*$qpBr=QYDN6T6z*iV_dKeqFGj0JlAwi#ThEE-vsVZMh&AFD~L8I5Abu`JYGL0z|aw79e +GBTgOm5J9tjI%jxh3r!<=@kY}W-)eh?5QpOy)r$3=^=7XK|W+Tb~zL(I0tj<}*b6Bc*!L~w#<~ndJ`A +K2;wZM|tx{*o9e*4IeGVHz5-2*NU!b6mR(xkZup1;FkvEAyGQ(-E^y=$P`7?WVp?2FwYS2m}P@l5hqKvQgle +i?JYGkSco|Hg^FP)2eudlg8)5QW=@UONOF0*FjqFzSd|u2@Re!j}G(qB;mHTjr)<2_gyMT1fR5wN>c| +=WBEd7M$iCa0RlKGy^`SK2YQbkPC5`g45|qIL5$|zgKU&3(e#)xtI_j=%QB6nL4yY~`CBGiAwMR`=V$ +<@V4KQoN?37HMwQp=otNs4sM{aClqM2Kv+~hq8b8j@PPcn_edIkJh`aa0AjMJ%o|CX;6j8Ygs8-_t1^&dzun-zE?+t +d`6t>4B*8#N)? +!mr8izm7bLgdrpZo^*qR~B#}chGeaxP1B_#UJ32V;Ndi%sS2-!sr2YGDJvDi0X9@ +CWU+mFj&)c?r=Dnmw{K|0jn$9euqAuNMz61}pE7Zv6!&W#Sr#1@*C=D#N}$mD05qUBMLbb9h~YvlE?l +1%m>4_|3|AW!ZGWSvIyS9&Mm8$BP*&Q9(r-B+Ic=kc_Sacl&4=fdspmDB#60VT+EDuH$HF8}fKhj-VP +?>O&={?hvDIqUUJKf1(ZKXVQ~_LNnvZ&UlRbT4Q?I1~9jS0}mSgmMk&?#?&KJ}@(^y*ayOjz>-$W;Mo`a +LB$)uq9e_37y{qoc0<@N2mtIu=eOJxxA1Y}a;nXb*M_^&5d`uSL*iypVU`E5#`w}5SV$2Y35L$7q~n$ +y!@A5aW)yME80p@Dl2?a~u-ZIyhdUu>D>Wtkl6C>o-gP637^`ibxJxMQkw8y25ClEsHGq+yvnIiujHC +MsvCx>$Vp$lrvRC~jr`7o^B)H9hrr9N?(?iv0BX{7q!~1)-VzRq=mNO9KQH000080LuVbTLO|0dT9m# +04oy!02crN0B~t=FJE?LZe(wAFJE72ZfSI1UoLQYtyoQu+cprr>sJuYp?2zMlLl>ppgAM<+QPKLnTCALBD(WrTdC6|d95_OsMe{1250-7U2S?@hz*I{1O-clP)*Z&xz +Qvf+zu+H)jQ}VeOE{iC4_TJ)+v~Y(wau}o%5DtlO_usFDzwQ+56s7mceIdtQT_QjP5;U@i|F`^-7z~_ +}jR&lfE7w-OeS+BXMcAZQMX0Muneh(|co`*w!kqMJ;a$xNZ8j&v#KhxPy`l5p*)T&b+iV`a0I(t_Krk=-3hI3NGzPXTMRDctyDUK=>qi0<<+adf4_W +tbtzto*NBJsc&~N{x0Jp1YoU#~LB3*mg|d|6oV!2~DR4kUjx?s*T8lE|HX^X45Hy@2RNkGV-cY65mKg +yPKpCLLDx4uA@2TlLOQAldsNIFLL>%CagD`D?$n{;&DW=JIaxWVJfJ@pa*#`Q&Ch$xmM23BEbF-5OqG>j__pivVP04l@MUX_;tk!X!a9Ri$zQYbIUX$X1UVgoO4 +s14NvFSYlbdvS45DPQ-SG&ju!q%G>%lJfsvSo)_Y=iNouYkl#8EF(7b$RVqz5i6$+ESW*e1c&+g)_RpKK`CESqey4n+(8E>}$1eEfwLrC&Z>1!KC)sq^AZu)e +a^*n`tY;vKpUSn{!VsB$Ez^=L83h}n)@EKxh?9|84FI)_|Y6zH20WS=;y0CdO;aP5pjhg4oPB+;6DEx +owD9{f#OAIb+5L<_sVo_OL7k-^aS3~H}9*dFv#@uzBYR2zMVB8uWrLtHNhUwwznax7d3W33(7746(Q( +uA>LAAG=A#s^0MAU+P4ctt2t(68#Xv?ETz91&8>5r(<&SmwS5n7hXlPbkv}=Gbamii9L|unEJtp(%8t +*jPqSQ^eIRG<(MliEuJIgwT+4vf|2)(QZT24ZYc57mEh)MdCcQ>3)TC9EpRrc%TaRts%Pi_elK#tey% +F?EJ7d-be?o)+7rk-?L7w>$LLAMY>pvXRE_@0me9@c&GUnm%g70CtjxNii1UgajFVtG?BX2bjy +U$H+!W(vl%VMogX_kwQ+Xf*I+oc6x)obvLEohm&NJ0OYgPrnKOK&^uPTsWLQrz>?Dm=|Bt&^b>&Dx+f!D9Fvs$7qMj9`aena~_q< +L#-ie@(G}7K`VE+8uHPb9NT2uawA?(e-mo{2G$fz?Xxb{^;F8TQuDJFjNu+7qLhyL0+H^+8PI`>B4t1 +jjlXzGmfGfd`l=&)dHcx%fFl|N+5l;2ezV&-(#@Ou!7%XyxE|Bsh+v7f`?v*5d@rUnB;&LlK5tC20%> +8u#@>b@w0hEJS#lIvB^FC8;X~Zv +L`5c$%XRE`l{ouu$Mju~Nyv2Ks!#(jhpu?d24^T@31QY-O00;of09jjp|AEHb000120RR9N0001RX>c +!Jc4cm4Z*nhoWo~3|axQdubTyDca>F1DMfaSd7cgV6(@qwwauSLan+78yq!_ +0)qxlx;0Pil#kQ~Yc^>#-xDb4Fi<_PQ1y9u1AQs@?q>^XiA|JfXc#FPgY;lo16f|@g7AR#m|iYa$K@^ZW5v6K}iBm-RWIh@rq#+n!9nUDCfFE{xdgM2})2geM6tC +{cltSJ_;iyDf$@oB%O?ViapN@hM!klrbEIq67)sMZqxz=@&Y-W!%BFRKAMD7zfem91QY-O00;of09jk +c+(2Dr0RR9l0ssIc0001RX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eOi4pUPE$oLba-@SkwH(xFbsw7`4v +w)fi$|&Bb>?@qGIZ#b$~c#t=n1Zl8~g7{d?RoBoMhomY?kJJuj>~dT#d->HIpqO6Tb{u=HGErG2nQsT +Egb0@dhEO&)Pi$ega^J9nmdAs^Tpq{$o?qhNAwO)hWM(e^m#BaDsc1IYjmXt*QLXGJc84JvzZ9cxn&2 +9EpFlJkf}y`2ZxUDTr0qIOa>zg5stDahN$=x%1SVHgs9qD-uBXWh3d%vSkgS(M8wAyw+xbQA(Sz4z?J +;O+?Rgrm|sq3iSj>!Dju(u;QF96U!h?G(W_anPPr%^`Z;_3=+YKUCuMw?HD&29vBrUQTeAm3cW;ule? +I{k+9%w%KIGHeZ%lZ?ISw_xUzo7g9YSE8g&w7xz<;#3M`S)A^BI0C|j#>O_@9f0j4)8zwlaxRHx?+O) +lH39bDgZ^Q^3`2&aXctOx=)$xI&j;H#cokV>BP)h>@6aWAK2ms3fSz8Nt7P&wH005-|001Na003}la4 +%nWWo~3|axY_HV`yb#Z*FvQZ)`7LUukY>bYEXCaCwDMO-lnY5WVMD4C$o{HndeQ1;J7k3snR?2qGb5r +`ynM5@u6t|GnAnuI*u=xn%O*e7t!X!28?7=jh2;T=;MxQ*7b~{>B+h$CF!lB%@)asPc{t*q}*X8I7*O +(K1ID&DtQ%U>=m-;AkqwjB(Bv^=si>ByYi#!Bd2#i%4swQ84zRwg@Hys_FpIcPVS~CFr_Vx3zl{H+~n +vdRKr`C01z=R-zuln3QUlc#;zCfS-xwiNaDD+c21zd*dB>y%nB{n*Kqm64WG&#pFg@r;bMj!32?bmwO +WDYJ|#FNK15b&$pa6)P)A^ZToxJi}ia_A@mm?-LTEVUkuXWCwur+hqSJofPWu4sAsD_%J#zv`(~`wXM +Ir^S1{HFqQJOHA<|IF`ZuM_lBxN#a(U`E?9yI$)^=Eyu|H5t0|XQR000O8%K%wh`EO56xdH$H$p!!bA +OHXWaA|NaUv_0~WN&gWV_{=xWn*t{baHQOFJEJAWG--dl~rA9+b|S;_pi{L7aJ0{E9}MKL6>H2Sr*Eg +!p0av*f)-tEoqY6uKo4XXX2!RGQT+1Jv#T?d#;oTy1%>nKKo2Nm~-(gX}i^H_^V5FasK`TT1Z->C6S7 +=WRgrgcu8wu3TC$rFikfUWQi^Xskbn@D9)3OQ%MrmI^MRFwSEhctuU +D&Zn%`~(3=c*c2RnaeijBF5$hj!3p~GB%)i{Ot`m(&{y$sIBUnGc9>nkcJ2iyK +QqDoBPg`i=07ryOYLmxq=5}mpa+42M +_G<$AJK|4@G`u}!eEy02wfIn#ns}|!*%W;Tf!Qfq>4Tl_gVt!Z~S_ekBLar#PzT*4>DTNSb +XL0XWy`bn`b;`KRLF}`$CCjJCwFQGFt*X{?fT^ijQqs{Ekd>`%mm`zLP{|zUsJCX8RB$&=k?* +LRFq`b~B!&uo)cR%_Ts%t$*`>B;ov6~aISUWpmPm7?<+C~ejqi7wkHrKU_X<*iww_RSJarae1np&ytv +DDI-@Xa@N`3<((IzX#z}$io<|=}qMF~UTnr*_Fvg#M}*p1O-S2&N}CqAnqBPJ# +`5^w843GAJ?;G4Cg&$}1*TYaW`7i+DO2RX$kVQf6@PMtgmzKw*3E@VP*dcf|-v?RdC)n|EOX +pi}S)vf|n&X;7J^b{0%ljF}lt^IuX`D8<-L2F9u1>&GPd2T)4`1QY-O00;of09jjg1FwCy2LJ%a82|t +y0001RX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eVPs)&bY*fbaCx;@ZExc?68`RAK_n0bSj+sZ#KWQ3!g +H}?KVH50C)+3yu}@rSnawU|msa?bh#=Fj_!vW0h(v%|vg@2j2Uz?VT+I?Ck1Pz6vM3dVArr@3s)F$>l +Laq?%=BzljU{Ck6;h_U9w^Q^xF09rj|!6d=kKZ5TjMAtvWMF6_CGh9aQ$Jk{@2IP?|pWioqe{JX$lcd +=CfaUPU17Gn~OXMpCF5+3Kaae1YPKW$2>1U>DuIn?e^x{j*X~AwA4sug_5cLQR}@EQL(0h*Ocu46jZH +wv$_5C`t#=VHoV=u`*^!qZ^OIo_4do%<_=dwx@)KNitz-oJSkjsV|~rjbkCzlg84W52{A~zpg80^s`|K8Uj-bN0dZ|*x?QJ`5D;}U!LKh;^ZS4>B=r>rgnBV1fA$a_p*YA`vlaW};^xct!erG8thP4*~I}396Gt#wclPkiVnx5V&2934W`q4HU??Jk!aPKbbC0HYM)@b4m4!78Zp^qX4h +rEopYzp@1JU%A@A&r +bI3-F5LSa;>36jNx;5fwilTG)c_J;BGu7s{;ZG)Bv6Tn!Wn>PVYZmesM*@#Xw$w~Q`P}eJORr9Vlrig +vS8FLx8A9e880xWk5ko4vY*I7C%)_?exc6Y0p~y*I^S3QiVB>BnZ~RB&pVdjIfC5wKLIEu)wfJU_;ti +;PHLovW)xu0mRTqFrAQmu+B3gz#5cQWXhv6*?JfSH=aSKu`p7T=m??h)8INP+J06>!D`A+xO6JG}Mc3 +y#`ju!<=D3N1HwdE4VnNBp)36eCk!-m`E)xV5w;OVC%d%wQ*RW=H-=t-9j|s=89skSp|{iRt!$8|F!*D +I-EDa}>bt5rwrO82qzQwqy%%*x> +Bs~LrKxH7#F_DyYAlp(R>9rVR<=*8bCmLWurf0AIJ}7DP**Fi+xloqan|1X4sOK{X +YF4=FujwNQvfjV>bcZfQ0X=#BN0+Bk_e4dgCl~%NJ7W)Uv|s74e)H?uA>6VTz2lJ|hiA!#Z6 +*#?lT~qj=tJ5b6HIrWR-QJ&3J$+F0D0M{KpCcshXXMQvYze4s6v-~x1cg!lz`!-U$5kvo@RKY-^id^= +(S>?Z2BvFQ)B)x&}Y#&zB0T7aDdZIj~^@j5hqLnGCd9A;zUjpI~5bANVtTf)W< +HV(Q^+0=<5eq0_COnk!IEF;p>v7!)!6tJa>#w{eEAd6s2Hzw`AY&VR8iNx^6VX$JH0T<_H^ +TxwmMbSuCmkrZ4>9O259t<<@RHRMU{i+i|t&$Y9&0oFjjM2c<4iGu1>E@)L;$?>1y5I$NrQ<#~=#OW| +unGoq*p6*sYjM1m=oy>fPgO+sB(ikfbn8qqb?6%D#4hpFU7v>a!SqA!o)OyJbqk?kk7^JYy`Qu_teghwK0t5j*-9t_T$mPbfp;^a%;yq2YIfSf-PIHdQLmM+1U^&PfcZZ +T%nxX?o(CJ=UKL(_W<`zgBB7=DM%5l(UwJDsDJH}>pRrU|AAE&A!lZ!H=k$6ETq}}ZQP)h>@6aWAK2m +s3fSzC@Wmhh!jhM<7tMa6}dni!%4-{6^@UiBgPI64%lpkkh(2Ui(i; +pIJucZt~7|El32LJav35_1TH$moY&HVFu=jCH1doYo+F5ITwtMe1DQyzP$kz*@xb$BY5Dl#yG%_03R!%(ZnROrD7fbP!~S*bLY1nVY{Sktw^(sa98Xo&bk=!gA~$ +{9ds@4(F$QfscwwX5TXW@#taJaNWVnNQ+GiHTJ9K-y=ph~SZm=BH{fmz`imJ$ao>*7p* +!QmKaivWDkWG2^Eusf;tCIj^LZ2`ovpY-4y5REDc^%z)Z7nJs%L3YQcxVTP9;B;BhwnnAoV82AIy@L^ +ze0TC?2GA2e+aSl55#)X<}BYmKiJ%q~aNIY5R~3JP1x*EPGwFN^hGv9KSTO+g$s2-`TRco9x=9E6nMCb^HFJor!Pp`v*`<0|XQR000O8%K%wh!`*UJdK3Tvok{=zCIA2caA|NaUv_0 +~WN&gWV_{=xWn*t{baHQOFJo_RbaHQOY-MsTaCy}{YjYb%a^LYQCd*P0uoo+e(lHKFv?Ebej&+o*BI& +!N7#cO$9RO=Cc9DIM#5w-&>F$}?nb{X1`O2xFN+z(F>FMeB3qD}ipWpw-^h2D8vuwM|BmWOLGJr0gWBhT|jH*3MxWw}k_#WCZ_D$C%S#clWtOw55bP12vRwRkC5o~LXy<5|XB#%3FRQZ3#eB}<4Q^sQO|z1hah4XNk$M*LM5GbV_2(p8 +t>Sd0KjuQeE8|W5{!#GzTrA}|V#DJksLD7g^g&y=u84Rk=H=hzqH?zdsQUYx|NMMDKl}6f*K+m*@%lJXOkHfM9K#24Wv$V{!M1Iiwal; +ut@Y%Hh-`9VYbPQ^;{gA90Ppkp)yKD=&OhDEug>3JT%DiY%&%|W +-u!fZehuf0Umv~l+3Tb4VC5(hODTi%Dv!tTZ^l4qCT#jWE30iHZsC*9+W)ze%mE$xjJpfQ8Q!8QkWD4 +fA{Q(1#8x0g{ftPO}1ugWzl@6HFL%C*mcV>x_S=6tmQ{ht +8(4z?4G1^wOdGF-zFz$BpeW(hAq^h&iNE*Pjc`;?`EzFg&5wJl&HeI3Y;W4SRGpg$=a%ZInG?tHcU_O +*HY#=Jc-Z@;@k3Wo`t%}5^3q_iYp!!+J+kvbsFOCAbVW~>k(MoVp_Sh3EkBw{395d%90cn4&-a6d9{K +9AG5oX^Mf1Ydyx|8TnScLAAr#2hDs1z*nE+QxqU|jV1EP +<)4((6k|yyOn05XXiY*Gl*!wX}c8o8IEU8Mozy(;59B@yP>` +_Dk-X2bVQF!bHqf-qZb+C>$gz*g_2XBHoT5ThfO)KGC+)#pl7#pJF-pX|AH3j~ +EKbL_7U%9J$O(KPzEGeDjSILb0VyO!m6N_dc$Vpm?S{ +uX~$&U7${&Qaxg3^2&&!G9i0<_&5)14+9+dlXHLFPv&VEE#W|Awfpqs*hyMo@P8L9(5-ed6#G+gVS-y +I?E;q@`d>Q`p@#{ASh2+}wPrQ~IPj+XBKa&qMYX90kj1p-e*>Ct3?ur&n?R1hdn^$+0$BKAQA2xG~US2a)CH&Ud$NF(voLrjHH|DE*9p?dEse0d+^f|3frx)M^}9i +Dj1Yp`VyUcI(|S?|^ViYN?ReZO0I7bzK{-WwTJfxEo`ABu((!inL_?Qt>SbD-1C?p2eP&zJIIvot@_5*Q|0|~8?Qo +}Y0WPr>s#)=`nMK0e!a|o&+4H5H^=P8JiiXId#A=Ol;%KT#qq!p2`zKzkHL0mRzYc(Ecv|4K1Tp|1wI +;~1_w-iv_b!+#PJiDdeQlG)d##FUSjh=w!!~6UZ636BZ=%8+$S2Ay@!+_LF)v<~On7LS64e1=2KD^Ab +dkPe`Xrny`?L(h+2v!*CgSzsXhU!o3#Pc06m1R}gG)Vj$zf0VO?D%+*G1%?oS +0x)59Jwn*LRuv2r1CywgYsgOLMa@H`stsg`5amtRq6fM|2C!p}*=&MkJWPUBed-k{%C}3#4L!L^TEh( +%-)3w`n@>*;)J6kSM@uyWL!A+euy@lPy5>Z<72VvA@EAkCbL9t<%boRd9584xNHt-b8VX_Or=UK3%TS +^6h0Jl^kF|#VSt_a?h)J*3nZ1FNAkc9;WQji?wE#yhEV_sbZBPP&d_E{rn)bhZBa4jtQ9l*cmbL>}jj +(rlmv9fF%>{${cO^|(P^5BZOklKK3lQGs}2M@P`m!>*xdI1s)HHVZWLAZqrH96pdRZ&5dFpdS&Dlu_< +I8bMd1Px>jaDw7KP=$AeU{kEHEZ+*qJZUfym0l4rZ1mdu$FWXlA}R`k@?jAaki*oT9LB`mHtE+yz_L@ +b5CJ2)bz!EX(S*4yrW+k!N#fPE&!Q~qjb;Q0sz>=dJp~eX#z|;)@S4M`B-j52Tt~x7^a1d=&o}yR`6! +gHR6Kx|Kp;?=eVGr^Gx2iT&>;{qIrS>cs=sm_s +fKO)7u9MvF%<5*k13)N({k?%}>|D#q2`W3MUFCFp!|$s +cQ{wquVNVUm7bT<($R^$)=(7qA8(R!)cW#>1=Lo +V6tNLvEC=1V!TTP!He_;SS>Pb?h;gpYW(D)ng3ySNeID1GMF=S?^bK& +B2veLf!!icC*`xTYJ&n7g>le9~T_97H{z`1vJCo^+L+3DN&~()_QpOs*!&0VPYCI^Sg;OX;y&M +Ij2pUk6U?^9dL9@`2p4+^tq&&3n6Jo8i+-BR4vr83Ph3$S!kUE-%vo~Rz(d|tZYSbB!@--g-TBQg-M3 +kfE42bG=QjrSb&xHmDN~9^Q%^#V&Gq-tf;~@VduAdsWOZ2PIe3-(LD~Ra6hH(pz8z1;rhn}GxnbFkmn +yCog5Z*#RXG3{BD&|?IdfJPU@G8*+~9bPK{$t6W2TMGgCS+f!YkSh)i;Uj&Hj+4ureyT<%%|#EtAl4V +b238i)El#|?NE#lyB0`r06|Qvh_-I5J2$DS<38$7%a`2V8%dv$?Nb@5I-BHBWqfVcoMW`U=2NtHpHqf +OSOh+;UK#ld1OI{t&j@I6IRQ64OhOu5i*63z~Kv&iNW|B4=FmYy_GjS&K45?sZf}cv!$JjA$ZX$fy7u +AXs8FSl~yc$&tBllnJVP0h}bExXc1p+{at&3`s53^W&w{zH#NG8BDlb!>L;}E;3E%wwmd#e7@Fn|gBr&9(W#%?sz@;I)Ng(3F+zo<8DwhnJ|5w_Iq4{6c=q~cA*bM^BtyRnO%d$( +Edl<+V&NBMG_z^bCBLS7Ilsx-hdnyrmwCDvra*_@uk4P=sTiJck9?P||kJ8=MYpe9krDvjQ~gnc*}Iu +m*S_2+hu40Ih^1En5W--yvr;YIh!XiUU#Ro1|e3t5W&!LIZ1wO6mqLUdSXzHC7JP4LR@e7|LX<$$xI8 +l?G2G?jho4EXbn$9VF{cLmMz6nHiHvm^@w=E6tI6X24&E9JQqw~gkf<_EK%jMYUu~tWQG<2z +XBY@gw><&kgNS_FxMn2vl-!m&-lSfW-S~{$-D1d)Nv+nBR +PFjI}x7lI>tGQK+UUC&qw}(h;-9c-MX9n9s@fqHC6ytn2=aO=Dnh!H_0U4yM*qHHruOM6;;Xx_ +Naj*M|Gqi#*Dq~2iAI-G!=Va{#;{{1rfq6k-O4U0?KFD>MLm4w&7zt6WwTChzsOoVYiipo8rD&F{>`v +@-R1YuA#Vgv3zT~Mcf{~T14vz$#@UcfqqfqX4j7hte0BIV%NGs$nBV2o)Y*IcwI;#8a_~TsshM;S9O6 +!q+pj%;LSpMjwrmV`1cm@9`_;I^Ku-M)|K7&Nw0B`Q<-4EmrD^zjM%(Z;sBv<^kk;X=U-R%atbO>hYV +AGU2~*P^?6?{)=oZ&ab=!XGRJnh|O3mw|H>lY(NCx&8o}}UtXG~Baw3nnn0awXFY7Io9E+-vi7$p-B% +#nRr4oC6QGsqyW&62sYC{$L~`2o%b1E@#oYBAU@XuKh1*h59*UBg&qWhwMEc+pea{R5`@8{B)o&Fv$kYpoOoIxc20&QO=j;6rW9T)gmsY+c#5 +dm|%K*Vkfl*ss$e#5R@q9Y8s7xc2&qs667Ij2q%frhTq%an>Bzdi*fQ7a{+r-l|c~5)~jk}_^RxO`Dx +_@fp{MNn2~-u0Wwn52g{ix# +}9mUt7lKe#RbJ4>9?<_t}H(mTS0iDK^EpGxNLG|1$(#z;9l~+4NgirTn0_E1Vr49g!>2_CnEsJ;dDbv +X>63M{$Z^Z1_zh@6aWAK2ms3fSz9cDx5@4X006@f001Wd003}la4%nW +Wo~3|axY_HV`yb#Z*FvQZ)`7SX>4V8a$#_AWpXZXdA(OnZ{s);z57=X$ssnzRiYn-chH~; +vjy7wkmpR^CojxI-+$@r7W$p)HzEXYPv8uD{>*XVphvv=9esPwK@%VpWd*3)vSOx-vimA2MJ9gVYLH0 +qw!wQiDqq`E0VVsHIf*HkyrKmRmUcXl^b3td%u1^baHhX(VJ! +be~>F*aFV891=V`uXYU;R}TZ{IGVES2_d%Tj~6n3H<7H)4*3jxwyEH@5dSzYMWju?OkgNrB&G|xB8Rv +sJ0uEZ`9VnDiSGrA-{_o_Q8`bl(Eq%El{hrEXhw1r~<3Vs<_cnrJw|rS1u6jW5S|W%G*fTD(@)bdE8( +P30UrIgmXc;GT|ijY$R{*fS_aaW(AA@+N2uqUJW(?9bhQ9LB85CPhpU}>6Sljgb)X)4Om}Oy&@kH1FZ +_zBK`>?FusNwhN6kSA5$GI5>>BrCNr +YQSv*K{UjE_jaXd}AF;C@h*vulCVLHr%A4yrI7{yO|N{3ATiR+{5K4z8wXYM7XK6}qEC0AM=fW1wR8{ +dx*7%Z%9%R|E=_zke*cqeW4g4{@ +R9=qeosQ^guX2bhXtx2%aLu@Z%1r%&Bx>BME|9%e8~gxAEphN9u!s=GU8VtOK`Y{kvyIXdAIVV1RAal +Hho4WD{+BFn4>yd+#AhsZ&U@!ck!T(W?nyC4wpQgnML#+IxTf^Ly!t(Sc`*nu;m^J%Zu9Eryp +`Mx{HP;GQb$_En;&(Wx7&YpA45A*Bm!sQ`rP=uY$oL^tRyGB6*I)r^quabM*q_Rz{t4keSJu`KSrphnQQR?3O?<6kOucZEL1Ivw%TuK(J4=S-)KkI&Z{|iQvqEK9|q4o8e1; +!G}vh4H>KIke?FYdzg81G@(L7_e=6GO(w_oz%66kd%d>h@OM49ybH`?`s#;k)9jWk7&p>%fogdZdLGlERF3k_>?%|^p2cF!W^Y#Z4kZvhk8h^xX7cwzPf$#I{Kkks>~&9sIK*uzLLUJpHcZ13D+T&S~;IZI(=S89)%Hqks_E{E0;g_JJf#HRIa=B$-|4QL~>dkN- +Xo08A@hgnT~rvDCRI;F44Bp&DhEnnR=uc*?Qpb3iO}TAe8U&s^1(~pk1Hi*C$OEZHvb)mj<}R!}4Tt?>b{H6z&`Y&Iok*-s$45>e(%odtl4L@qCrYEF3Yea#U$8#P6-3*Z8Y<@iBd<)FzQY?@EVoprdL4r= +6x~pwYuw;)Y~2vmu}}Sjhpb}(;aV|I4+nKzzyLGpmp(Bb=vCxc>m3h@kVYkk%GZF^)fH%{PNzEVCjq` +|xEJ!LFmf1N?=ihnw$79;S#DdpdV$_6rnB2$f_gzXmpuG@>oH!8neXIG?H+X2$@~n+Ah`VLngt{FdPU +GBEziXLzln4YgyYS@z%3UuB|?Ym%~u`}X4uVGD!%odfi<_5cOoyT`M2CI{_ua;i_`G7zN*Y>e{BpYmE +;D>wb+G}DT^Zgg^QY%geKb#iHQbZKLAE^v9RSZ#0HHW2>qU%@#rYJ0Z)5~sz4 +Wk8lDO|Ycx8V6kw1OhElF&9eINGgug^}p{(k$Q1ni`8E&N_WTSUU<(*Tj=cL+rNf~l#zX&tp&YWsyVq +;KAMgvJLo{r5S?HldD_})Z56^NG$g4c!{dmgipG=(AMIs0T$16`8@FP?6BGn-u5v+w0MR7lLLr={Twz +6dDqAgkFT{+b5f*N(XhI782rHsjPTQ>qMkXRm;o|a+r&fg|m@+R{lu4%*bCF=Bbq6Q|FUZDapzaD?wa +#dI<<#b1J{|=7M+f_V9KU}zKzr$WfKG9yMF4u-eD1dp{EU^1W?pau9&zF2f-$<-b|#PJ^N*j1%)oonY +R!*N4}!zfIod_-4mi?@P-lTUUr^`B@0|LbGxY9s-fp#85s4AG%_syC$BKxq@!YQmLHprX@%k6Nhlqe- +{ntao-^xb?P`!eu=8uc=p_lSi*ToZp81{^`Adtkgkp3B&9W5%S7$_br363;2RpBr@OC|ienJOJ!mw8V +MUnQVxu2h~e((UznuuI6Wl<0RX$q~r~m5PSe1=xOtMGEQYO2Xm+*e@dMH{$Ft*q9W``qyr^%j-`CG>m +RAqY;|i-a6Z;a7#bP32Z7uK^OYIS`w&SDEHC`j{eT2O5iw1uT|cigPcQ#s6?6IH#8yd#A}B#W5%I6zs=z}3Ve9APS-(+5v&c&1(gF=Y8}c@i<;? +b~K+G|j>NS*X)!TXr6>_*tu}!WEp2b=zWUo +9NQ?UMQQvw%k(EYj;!pqOEVYFPlkqj_)?9?p_{C((6KiY|Z_Vv|;|N0U}g*%$Ye7C`H +1BA9T^FyfMpmRYkXd02*K|*DC*)ZM2TRP*Sb7={6gAeWFN0d$b7=}Dmf-_^Ho#hMY)c3l8RVi!kps>4 +VqV#;x_4~jz{XSUxCnr)#O~b%g*3L_pD&RdkLz(nBTJCVDbQ3t +%q8xSP%ylbu=)%4#{mQl0Wh&*{;V)pBeIO4w%Vs?3oiW&$o?5RL&RTHx>+@zfX}I_t(tF5QTp=Rbyy{S=x5e7mN=1g}N3=U&>8^H@kipk8f{vm*k`7Pj-97P;}Yl>G(jm8XDN)H22=OqvcNFs7W +7>B!F!tW?!*Z?Bw@ce8P@lcLFlf_8qbfnLcCWynmKkKfr+or0$9ty$$CmBhYtU@wMiCPhHJ%Wa>c*xm +EtB+E71b;5YM-X2x%(AWRU*4E4&Qk;2n$)8mqX|`oClHnCY`7E~XV#RD4oy|^Vpi9gjdyB`$+*6#iS0N8-(JujzMsx~_s&+yKmfEYuk5H!rNMQyY` +L4WPGcx@dd+T8(*{zH9`E-*RSo|o+ZfzMA{`lA5j@EP`JWX}LbAQHszK0zcwoeb#<5D!F{yEPc+cGiu1YJ0I$5Sf%7D?h_##m5lF+pHet<>@4yAta>!a=0<8iO +y@dGA)-L2z(*87T^?T3T=CZ8f_6E--mu?d~~R#JTK@vahc*Rgf)NltztA6pEj%KigTO9KQH000080Lu +VbTL1t600IC20000003iSX0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%g$mE_8WtWn=>YP)h>@6aWAK2m +s3fSzE2?V88DM001i#001Qb003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7fWpZg@Y-xIBE^v9xSZ#0HH +W2>qUvX1D#0nIlufQO{1G+Tbf^}`s2JHqTaA}E(*~pYeQg*#A|9y9)UMS1yioF2K7u)3V?s)gyJ;xlu ++so&_oW2kRKP#)95;rSz#Xp$@9zA&Y6wZ}M;U!bLl#`>$krRF?QZ6+=y~wyUA{SgG@T_9#il07;A53y +pu3@prYf~$}Sb$hpr82;zEDbZFlzK90)k2Q#@kaU3=VSu-cdrkvl1s%arg-+otxqPCv|w7pTdo8v#P1ket4MQ|aa5u-1`uWtJP9UtBjY(_^ +}5ni`_su5dDQ)CEGGM=dVVHRaLPoIV$3=lwSO#Xrdvoxf@2O#hE}^b +6X81r9w!*AXzvNrUv6f)PWL9tmriA6b5{<|MffbP=4wyzoWqq@vl`Z~~9J6eli3jJb>$BcDl9*;ZEfE +)KDGk=*>;?MA!^5##f-g36o%vvRv+eG+{jY#IYtG)tx?J`Z#Rt&$+w+p)W(0(a;mBEQbpmDxFD8D;xJpJQ#%*$knMkj7*byRo_kEMyDMPjABn=yMZ7j +?LmWf(<5rgsoT@zSh(5E*fjp*uQF0*d1~!2Sl4n^<|r-1Hza}ZDq+nKf$;f9*`eq-M2B^86Lfx^xwL# +M{tG*Z9jyvRr(<*)5k +iTO)NVyBNym=5NKpheVqq!dg8I?yN?{Z{+eOK;f536hRcCxaYzu1F3C2B?fC_M6@dv8cyb_!XCHsKWy +OX>z@fB5Pn_;jq{|nKr3+V2t{ddeEsHC>CwQ`THnJX~@lzb`tGT|6gD#2!eN*vwSyd%zz0?aoms@q+R +!BG&2;?45^)#fr)bYk*6m1P52P5c#06AI(5^{@yRi~BfG9m;c$Y`UUPbi?mm_mTuY9S6u$=BIMhfx{+SiC)#l>c=GDbw +950t|gn_5130Jq$(__@+>t09O8E5D)Uhgl755Ac>sezsbmpgn#Nq7{)v+lc{swg_(-VY(Z(k!V#EuF3md)odBuRZ>lPQkR6!giKM1 +wIy60&CG~N?F}>O14CbM0fX;lm_>YVBZ4_Q$BvWYkSl&Xd7B^(R +nE0|XQR000O8%K%wh*gSt_sX*jo^)N>u^&IhvgMC>Tl`|_-gA!by*l=cZ +XR!*R$sY*Sd|}|?+V<)JBIY~;?rlk);y*6OdBQ1jLaPPo~IxUtnM<9$a4-lq}L@&3s_wS7bMqePm?6C +u+oqul1+vo`j1~g}a|MD$t+JGj6WRMT4n%9a3j0ydaf{oqUyIt0~T0HCqL4VT+C4olutA|Md+0M$mDk +W@otE(pKE3#JXikZ^!-G{@rC(ra_O;W)Q^;^rr%V^|3rl^f6|H^BeImxYCWv>E~Jz$|S%kRF17lX&F1 +zlYo%{J`BEYSOUzM$6FjRTF-0b#&}j*GY4;oe$)>Kp43#}wxPU(Is3b(b3T)*Ya`*Qi@|X@8lKU-iUC +w-=2AqdNK%kB%Y^yzpKQ_NtONKPwQ+@cjI2*|t0lF(XV3(qMm)vc{4>P)h>@6aWAK2ms3fSz9I0PW-a +~001um001ih003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1z?CX>MtBUtcb8d5wb}e}FnYyAa9cQNVjI)tl(=Q>bo{8!;1GV09gja`77 +{DIAW*u?v%KKaXkIPt6_y+GfsYeKtSq?z{jO>ihw>*mnP)h>@6aWAK2ms3fSzEyRfRL#L +000#b001oj003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1!CTY-L|#VPj}zE^v9RSKn{kHVl5 +hze2mb*xSX)vb6&a$gnj_yI^TrG#R!c2n?M~pS9SQA<4-d&_8~pB>%iinuq$umMBu>N9q%Oz^*_3@$c +bVQNWq3w@R#Ya|0W*WGBZzzGCM}B{&*gr{ +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 +bm>tdT&U*#fK3IqgwNGHX-Ih@EQZh0xF@ +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 +bVrNko5-9?Ji&vfhIjk-_a-e5q+eu{@nK* +6~M56kfv<(iTG5n!T75P8q=m4teO#C-#YI^;6wJk~KhtR`d^B)OJ_14FK_rWS4g2C77v8UfuGyz; +aXSjL$v@)Lz5v&x^A2~9uVI=9T1DhY;MiQ;Yg1?;7+tIc=D7`tyOEVqrl1R_G`KXbarUQXH|4st +iBEG0i88xw?C+0ke_G&>KNKk6Hp|NRM7uKQt7v)$Ayz5hQ3_=pO)zu>0i2?)S6=7s+O&7+<|Lkf>eE? +v6=lncOI)TXuXc`|{{q2m>!pyW&>&YGxB>z=o(HY4F@yQnP(bC3Z!0fw}47Fz%K}bpj@ny!o1{_x((a +cbf%I&W%VI_0g%2zDI#P@rcUJ_YZUIEUPSIt$Q&Vf(%78+jOrpc=fO&=h89Ze#-X>2W2G=Tdx)Ttmnd=sJ`1F+jyI`6P7o_s*a71wM~SZIgM%8s5wNOFr%%5a0 +5YHJt72p4(7*spW1q{5?P1ffeu{&*UQQN1KtL>hu)hIBo6r%C5i|U8?xV7K<~>*Fab63s>GIG9G)q-@ +|7Yqmvu}aed#qgF+^rjzVX!x}Nbfo<$Ea%KU5OfgZ+GnY?0Ik68U~?Iqv6n4#qz_&Can0G!*#smst`D +W81fvXRsR%x9wXuIKvV;e*M<=m~5?)Nyvldks4zi92+JoSqf$g3SQ<7Vkrb^+>sC&^zYd@1CPz+C40{ +%+oFgv=@eQr0VA-Zrp{V#o4ORWa$wwAs>-Z1MK=W5iCrx1SO0Ri`}yG{YvxJJuc-}pMw_^Jf794hXT) +y67=5yN~z3?563QSYI3`0;51PL64z||3@Ac}xd0s#pGMFBi*oLSpKCWIV8GZ_+Shi)iq$|R$-W{?*FGg)h7A9Nr&5D9lxaGC3qp +m(Aw1O?PL0S^8Q1`o3+7)D>4URK(OY@DP%|%A>%_Sv>4Kr7Fc^xGMH#kP$`8i0m(Sa3vS4T4ew+)nvExz4n{rGd|2Q!+#f$4%6{lL}gZfgf@Bo ++{wJK#E3il>wrLDF@jtE08@WtzrMbCoT{*8zpAfa+NOy6C1(H547O?eduA~IBPKRafB8WJeW}I@s|aw +qzB^T0r_)s%Bb&dg>~|5g{OK8NpTB#fA1X9py8d@!VEmAv`j`2sYNTS9^A*@p7J*sdL%l^A=JWeG1{* +61UdQ3=Hk{dZt7A6^RNvR^>vc-!ieml#*f5@bw-LqmfV1`h^`m)Qc(BRGn>(^L +iomx;PhSzY%vk^)kRqX`xfpunMmNFScOZY&>~g?PjgiX%VHxc}88sASD!)33jJ1a=h99_zJVhtEO^J{li!H_A!I+V`F`atZiiPnQ +-7z2RYBom!)BUof3xQPN)$KSXC^>Y;8&}@htIdvZkTkx{be5AA5Ewf2kOTbiVxBO1a_kbd$ZrX%TD7v +TiOWASNj?B|%O(-UZ)qprvQB_+X(vC)@+W>b!8Nx#Q4*b4zEX5D{iLdZ9XXZx7(kv3Uu8lX_@|veNgM +sh8l__~4=;$8#z4Ewa*+G7J4=!5Wa#ml-o{rxCpB%jqa0Vpg=SI=RtntnCwSs9rAG +81Gd;xx5W`?OrdlTVk*$(Y28a713``gqlN_kxku*iJCuFC}Fj%{|8YcXqHYp@H<3exi9HMQ6#kYWFf* +V(X7=$9faRLoEG*_ZA+rK~jrs3XJ@4VXYlFzc4OTYe^v`>vGO+a@2HuKauTem+oaIzQSjX;M1F8C2hx +L3oR>@tED}#)9WXXYY5Iz$G?rT)>ICIRp#v%v1^hI0RPVyaZ3aJ;{YxGf}(%-oNp-kdHd&okiI6K$ZitA0TM@|mZ$ +qDT_%{k}X`a~I|*9mdIP=jl*~H!ulKAl +wX|OAQwlsbk*%MbjaYX9lsq(rWHSa144y9J!pwPLzj9tefIi&k};skzqn;~0yj$xX)8dW +E9s7ZsB~C8u0}(`i?%p$(*jYsdWrC>erF4?U~Vq*ABrj`Ln@aqDyKppis~+@mdKY7z%eZTze`?0{=`OA6wzO$cMH`H9AJZ~=j5Nd +;{dnKOlMN%jV%g;A5a8uUcu#2KXMmamT2fQZ%0$=R{L#~L@*-b}Q{Lb$@nypMS7JJmFj>MB{%E#V~=h +NiI8Fy70jshvS>lgTj?SLq{F_MI_6-z^~qiMzY#>0?2kQ3S_)8jtA_%UwF?DWWYSdk-M+0VPAFKgxK& +c!YU@JJ<(Sg| +NY3x08fhFkIz5i7i^p@q+}u?7A>XrO^&D?2dfqy{Pe{SJC+=%j5Mx!k2P{sFN)${aT#^U^e%bj{Ifz?l^s+1%V?*d-Jm +r2YPeZTcy1Mji>1qpq7=O@eD)R7-oY!n8etVFR?y1I_d^-BeEnL<*S4W-8pChI)q?!E4cu#f6uDc%&s +QTM!$od)xDUB9^Cz6|{Lf|NVQGQjO$D@ggtv-W0}0GgZGI2Rn%vooEFL5g$tmekQddDdI!&-wyeXEXn +rCBc!?*`^65Z}Q?|FrLA0D$Dxa(F2p`Th_$tb;m4i`gtgsV9a$Ra6*(O7O5q?nCqIapYg~0zijXSo2F +Xi@6$=y6bDeuB*~DVks`ZdN##2C6)P$scJyYuxcS;$QYz1fCu+3NpzS+6Vd9x}FoE@jkXHq2A{ii2cs9K2I +r{k7YN06`q5v$B&SM!p9Z+I1>ER8(qIEzOY7*SVU{T*3>LBzT>mfjd+XjAhS9s^IJOeZ7SuDYp;pZpNA3hlOjPfr#KSMO!iuaC#=aSUe|D=VpuUo_;rK#>#pnATI3;+KYOx4kZ>hClh+fjRoJ+9j|Sq+f)h}U<~99v6x?j|5md8U1~$4z +cx(%b>u*^?##CEgfb{^TaWtg4-DLezvAoF=e@OM6EkJ*|zzD=GGsf4CJT%peC*d2nn=m`@-obC@YaQ{ +YDg*Fanc?_cA=Go1>;eli!P?~ALEF;xlox{g%K5%nF!IwFip}%J8OPPDwPf=yP +ACJu2dTU5V`rrp6BM4I4)r9qh%2r2}BDCiISaa9$j{R4m@(yG&)Meuw?WqAibw;ObdK9Lw)bbIhH~`6 +OR*F^Do)UgWR?CXaj>*Ozs^RwwdRg9!1IL?NV=!8Q<;84(K4r=IsZ(J(F0BBe2Ech_?o++J`mi4{O_p +%Y3y(x0T3D|bx#JVJ37jotNmBI$huLiK*NWTeSjF^cF5g;SRkC|}#K0iQWz0c1UD4)T)NB^0=8*t1IP +X{(6}#*{{P(B!JAjk0JbxL4_U|Dz1HwOQs`(Khfs3(}VnftJ_rALVIYr49R+1i;_u{J^htWTnlpFn0V +t!x9U*bNeh&4F(DgoSZcJJwV2=;Iv{w-?3>9D865PV-Y77ycZtVTXFM*`kU5>$B=OB2Lj*$asx3cMtQeMC*?q +z7)&mDTxn4>+1^eK)DFA7G{Vv_t2jvkI!yPX8+DK+D*o>W2R_j0Th#hrM#8^&;?G$4$4Nh;Aw_JlaC} +Q6Lm&`?Fbste7=kF2gis8p2oj?{74=ul%Fs<$*w6;ucF9=b5yv*+0Hro~+@K~rMA=)J_&hp}gd4eLOgn@4TVsgW`6$Ybd+g4+R)U6u!T~dL8n +|1KC9^n^<2%YDL3d#T@_D83Dge>F>;F%LMzT^8kO52{vj +L;orrV8ydk2Gqr9t3TIfI3Ugn*e6Cc0(m3~H+NWltDu}Q^-m^kXt7Gv+D4@AsY?Y8Qx5>ATQa +gchg0%aq{d+*U}>ZJA(OB3K@P6Oaeprlx&|7VTxQ>y=Z6W;mMXf2r{NyPEuw;u%$8vbyA85XI={G8EG +Nx(wG^<&5_L(qwF#uuQ-)q}z`5L>c~`tiJ)?Gyb~bzHUD9k*E)8(z=kIKB5fjHeG8FS5{>(c@?|s->n +Fh{=JaTRAOGxS!kxt1R=0=drA{{0vyxlh*v?*x;}I2bSmduWJam#YOE}A6XLq#l*6m~|(x~J4DAYR&Z`R&B$u#;`tgEBM6mmWjQ3gd}(%uulOK$G4dEim5AxW$ +z&M`XRzMFK^of3g2SkQFy?^t!!}xxwTKUx~18H_#I%bC&2NRh_=FY_7TR;4k5B-Wv`H)zCBwA+UgNEU +oqOk0R;8lGU6Su-|8Ky?JP3hARELsw-Z{&iQdJRf4PqYFKr&t^u1uwuseQz`bvY+!%C@8h_0jN{3&3v +43Pg)#b|=^4+VDDf5SJ^04dD|&GS1 +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 +Q|xZ9o2RGDsWYj@7hme_(q5x>>TUt>U>*RR?P +Z%SvK;9~F|O9$b9}l*^-YB-3r_SCF|KWdug!>k +Mb48bb|-#w?t%_dK$B%QL!HP0zwgZm={ARQR6Ip6G++yX1M=MV +BqH!hGg29{D?w$koZr!eiGKJ0zF_HYOsZ3M+5)soh=Ft~h`_nGdLOKG +9}f5a5~jUQluw~ZRDeX-AVDz81&O&fDTp>*?I9V?YQ2iN5nIzQYSo2+>G@1mf3U7Tb2(&h1R+Ij8Q;$k?{EC0N?c8gtAw<`}2_At5KZLha}MU1le-QT!`{zb^j1KI~2 +B{Z1xQmn>N^MEV*#H_L%`l}+Vwb=T7wdnCmK^QXBmFPU{K5%ne|C1G^3A{+Ll-jg_a38*VkosRcAwum +PfTOj$4Ui%IcsJoNl{>`2!JSA>;Wu|9^K2-1FNI6P*(dE|?GP|N3hXz*S(-3O>j$PRv6tD^2-_!#h*- +?zI^v3jp_$g75Kof_avF_qqJK)#WZ4M$Y?A4IK-^H!9gB><6HY`G=Wy7j^#+?f3+avN2irS(&h1iGFZ +&!R^F4<9K3zTHv{(d?f+G^krBXr$8eX+srre81yLC%dABbkmTmzs5IZsSm^{@a;=ltUmeqC5s($HS4jv +kFh)e60E}{ADw`3YDnvgtSLAk(oNi$PDQMx6>pk#o#_VH0ng&;(C~!3*0}T`c`*$4wZP(%eO0es_voYI4h{Ug#m@k@XoJs$!Y8kWz8Avyz|PLV<%7#` +i**(={0a|b3Z2pmvA6*?42s>VlKyx)Z_c063WdYjkjJ$aEGd#xi%wij-4e;Wu%fuvIT;$G)Xjzt91T~ +<95+b(u=8LN6jwylVj0`zoLal2v?Nh%J+gCrPCwj<_e2av)ufd=KBaPcL0YHU#M7#4uG>!%ji3D&u|F +90v%MQIOW@oJ%)z^=ko&wGD_v=HMf0598GlU6fH2>%TQFBL|BDXBpZmPYABLUK2J{EPY}lc8;^UmFaW +LF;MPT{9v)bEVO#8w}`PLw#Iy10xPRW+7ugBBdHE#pDXa|Nx!pzIqsv6_l#M+KyyU}dR$&=9#N-haR* +uS&n0-3GNI5Kf;k(bBLw0k4Mo3Eu+Qj5Ny>?l<;h3@_mRnj_0wU2cQPsRySDh%^7;wgj(qL^Xn78UC^ +v8F;~#>9QV%;&1t(A{YegmesJTz8{9ne8-E4+g9ZJrZPj^B@gMg|rkcwYQm!?q1==2$Ams+bO5nQ|s} +?yOl^pPbM1Rnc}oXw^Sq(9h#UAvZ8lly2Xr$JNqw!2T$eSa|XCJs^jURPyyrme;83O{ +72EG_w~YLI>u`XVRR7Q{ZODY%i^NjhE5h%WwiKikSiqf2i8;`*q4|Lgw|>S!3Yq1^xRFX{h05tKy7sQ +o{49u5Cz&eHL+Ej^8!IjXcMS^MZG}%TTl34=*s>plvk+eBNvDwLmCCT|9g-~oTpLF->Mzj +p8kxA75IW~=DU^S~}6bGXjN<}$&}FC)sg;xq&&DE-r2za5ay=4P?wO$Sk(KNQB`F))hr<*`cOq5JaVL +4zZC-?e@dQ`l>0C`(g#wvg{0qI8X_*01%a@FoF{vBAR(Va>omRjD-q;-lpfd)pLY~`+g*hSMVEf}xa5NDR98Io`x8OyGWRUs=kD=f^ +0_(5kZPn;zATwzJp+$U$P~6CVn~8giO#_rrsY#0!Ez(9VbeZx6}eLlb}x=hOk7xBnK6jh#vbo`KP=EF-ze=YPieEA*>!{x66mJU$&)AJy8f> +7BU`X;7|B|@~bX&{BkE}&-|b<3noENq +l#aBKiKM7smL>|#)uX!%&qQ;LFY;)^w*fNt&*RFD4P!# +>lWM3Gz>T|xErP(O_zu4GU4m845un}+3-aFgV7uFn)Ka}CI8C)m$O`pw)-Ou4nf!zoxeQ+oD=*6`TzL +EUlIDRU-)C*34#(diqSNMvLwwA#OHG2oB?w-IRVfzP5>DN0VOyP{sIeSb{lqKfiK63%JDCTQCWc6E99 +-pL$IQ-kg4bT}rsswIdL5x +#N;TT+8r}nI>ci*rU0GZnU_t!YA5I6l+>@AR*Lw6i2U04$JF&#vvAp8d`uAlwCQuT$5q+e)yxZN38GA +pJK*5ZxB;D7s@$NFBnqi&@<-UCTvDYJ*nbodqK1;Xe(lg;fxym_>Br0~05uM7Hz8(&4xhqcMAd|KZt+owD(L|4>M|JJLn@BnK@=(&Dn%NK@>lCkny6 +_iaYD5PA6L37@ZB@Xt@*k&oPq56!V_h)kT@x1)JXo~R=nO1XVBdOskM__H_kAJ2t8d2;*#+WWmEa!zs +L?{O2p?DZ!v`SOcpG$s0{Q8Ms*{z2kJ4YA407|-T_Pw;y;vAYTB>d@T3ja{^y8^R{V>2A<3=E;;$V=N +vjAu{_U1zO~Rk=gzIl3&+Xw-a#daeQ`9TOsm(Ej6=jcnV^ER(A)prHORNQ +qtMFejyT&MQ*;hK=2gcKqvEb*H=~@`0vFXngNa%leh}TcO=+Y9=oZuRO3s9?bpmfC!iLl +JPGqKXmz9-$_yldu(qhicdIfM9~R^9UDx>v`JVH?ClwEb4;mA7CYF2AK!YbHS7`xd-ohK*H?~LZbuo{=CIA)JYZIHKI6(mi#=SRLGMne +vFnvUwX0U6SnfLMjC)iSNxsPBrxgnDs$d1-07<^gK+!en=DxXfr#%uY5wrZ^>bhN>1{HXJ@M7<`O5_C +_89c-!HPG(GnY2@bNXd)b^dVk`VQs{hj-Q&yFhsaeG%vCKfHzNJGl!=GOGR;uOYbq5g_lmTh2D_tg&MkfEGop*De8>U7q2 +XN^0^EyR4AD#93%~C?pI@GGx#2MIB{!h_nPx#0>6`?32b!1dr_sF%b}RhGL1eBq&OAtThl=LF}xpkvG +EqJCo;tJi=W`VVtcsa7KbPKHr`YMvjY9vc`SEWK?A-DIz_tostXcgNg>-Nio+nROi#HFH`re3XhHe8@ +w6Q$lB@b4ghd+bdAfs7(gA*|`Z@zay}tP1@yhicf?i}UmzesjxNGdFOhU&6Qas9=ilf^@2(F8D14VMh@|0-l3{8$y0JTkVbuu^`6 +<^Ouri@!l`m)bZlc;%C(3N3dN1>dC-SX~zn>gOi>&D7hXD6mhY$pD!%Lml2{r@V=W!}~2~W?dSyL(${t$1J?33r}-nq{9^BfMA-v(!u_A&qOnAmNB_2 +P$07TZ^M(iWbHizKFKS(sNvo^?*HZd2lq1({EMf3g_=K}@`K+3N|O|hP$a=3IKyHDO0p!01KS}Mr1-3 +0^J#)lL;(Z=CwrT$YUN|(HYx%P{BdBZ%p%|bafKd={x|)(G7RXOw_tGK{Im6JSH4AT!2}@TeDgk7x!T +IoKpG{viOq6w2#T`502<&jiGaaXCIhFYpb<=h+{_jDQg(BnjDc1f;9$JFhfEBB$4>~!oO99F@P(u%^x1hhJXiUsGjLv`Q8NvI=4;!CuP_maUw_jtPGR9W$&51`c)ZbIR0I7Y +hF?%bKP@(z!X!s)f5y4b@8 +uZuG^+=;l88vg+ei5j0=ZLZT6-b*jDhqF4f<>NIu>P+p=ES|wB=`P8`9!}OZyWI!x@K9P!<8+~p4$zz +yO?^;8=dd4-W2Yx0RyC({R7ASMD&tdYGcC~ZfSTTK`+Q&G29LA0m(I{LI_Qmg91e>s)t+?E+p};KMClUWPbZ2iZr +Y)|?O%)AzNM4zM2PJ*b}XRo30Yo)EkbX>XQs0lA9l88_;%~)(~C%);W$*r?KZmyH>qgLvyr!EZ*>?PC4NGfA4GesVT5yONY+*ndF>Tjxkoeo}XC%dwI8UhTdB~O?Ru;p?g1nB8GUn^d8C|u5B~tN*z^IF7!11~*<{h@fTKFoG=~ +1*y3uf~ZdDh^SXq5O4eMTakJ$Wy#nWzZpeRh++&9f?)sVa-9%F|aGSVYBCL;){i^%DvkmW$5!I&MLTy +Y-4AhrhYPN}wgh+W_#iJFS8Lh^Kg@}P~I1z><{W5twXs+){6n(^g4d?61d={sc&Jhmb|XLu3)V<*PBD8zz3U +cWV1q?mzH1ADV>r>lF+6)=IYavMIUF52N4zsOh5JW6-R*}6#u` +5ZdS)Ipl{M5J@@6falGXph{>zbfQPeJPZFDiwEak^x5&yNp$3cr{2vmdnk)3fYMkh61f8$Pmv#zg&>f +L}*ylI~ul#YyPxO&Jwjo3ETW!k_&acU1x(CaH=sb_ucOJ&Zt{%JOmf=->(UzG^X3LVjN|G#1Do;2voGR~m6S^78PEvN0Z;(+QVv8f23~BmM%k9%(k?mQtFI031rigW9{BpQh6D6 +J}K9wJ@!!dqy#v?ys0ybzd|RRm%EeUvYI`|b1S?r@K!fjFTs{q +odeyyVOdvRhNC_eZ~~<^$(;;r+zQZkyZZEa26vtnAhYO6%(OY1rAw^^L*fq8+kRjykuo<6x+bOvY7=b +!&AB)SL*7p?&^NT^*~vw+tmDV&pc}E3dCg6~u{&-S;?iM8lvzgm1YXAp3pct-vb$%Ubuf=gaffhyHQ* +#5?g~q}zDD#S&{dZ+q;tI7@#rO$Huu~b!- +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 +|RPuCI&M>pu4(RY_25j!<#cjH* +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 +cic&#D)H%@7QcGp$CskqdTI?Rj2 +2%I;I?Yx%V;D&#oF!ig`V~*6(V}blQ*?QK~4D+jmRj@OL;w=$%X5Si9w0xbBkdD4(%zF4nKw#fC`Kh9 +BY`)Alg0Cg)0=4B|$f6xDdaC`Y@I(WbNV*cVUB^_4co$i-obEH?UxIX*E7iZiC(=lWT`X(fw1&XoF`_ +gqee7x}#c_K{tdoqT-BjQ=o#Oci?N=^%T;bJ1F2i#daI37#mCl@|mn#ehNp6kf0Z3$}Mw6m(0%5Ig!Ql!%rp8iuis-;qe-3=tyWmF_E_7Pl!kMhy>H +uoE%|;7~&Sn*V4>m0?v}SE;w?Ir|i$B(KnfVU|2&RoA-0&f_t)(C`xz>9^O91=W$p09ft3-8x2)QeV% ++Qy>p|fv&~yR255_Xt1T*XErx%nEhOV|6??VC%Z6TQHk2*pRGT+}t77|?cE2C$*A=XbN$NPy8?WkNxa +OH0kI*%@=)?a@-g`AYif!A1@BE7Mt~f2c*>89wyoWbDNJv5$VSass(o|*c%w1LYp4$=K9Z^-EgfI&gT +4T()<{U#}z15OgeWZV_k^k$)zMW^%Do`L7X%^YLRy*(^}>*kzb4Fj5R@@`Qda5T^s(g%I5mqVbt`?b8SrT8TaKGLRwR;f0cM99Ggm!Z6%Hj>YQCFawTb8w5lD<6HYUefTz|gQQ5RTE|^uW3JS} +{sngLB4g@*Q^D62!`Mc%kQnMb|Y1LJ-|!Z5KZ`>lK!wWa8n~;7{qPhU7@P-O;y6y>d3eCDwGpKEP7&! +i~d7qVO5tDH%{^Z>bHXC;ZaMB~#H{k$Dl_gMU_WEj1a=w*}tLlcxIt5nxV(-f9f~qQE0~a); +I`}G272glR0!nGUwM99NWY&^2qtU8z8mmc_Oq2E$w4DlCMy~PwycI2&jvf%Ro1zfDdV65)nbJlyZH>2 +dx>=5BSz&QE?DOj}86_yjZ>CsZ`2#;EOH$#)PP-Mw1Jre}mDNKEezB9D+cu%j1yguAOn9EF0v;mJyta +#F_Zsz{#mFU;*ypp8F74Oy6Bke)<|}S$bhAP4jkBh@;;8y0RzdDHJoU*Fyyn~`tlR1ztYI_L+8qvcUw +rD|KasL;pU}>KQzQc62m=31?Edk=-?-dw4*X%g`IlWS_-9EL{y4~C2kY6n&rZ5_9)x{lm#OqfCZOo?0 +{(SE9i@&sW#S`Wkbg4k`&*Rw&_42LZQR*j_NgE)(j#lI(<}%+7JaGTDKAsW$1VUo3TbwxM`TAveCKOe +ei+;p-VgfM< +eLKyDG=YYlx-%`|`_3*Jw6t;t+cq@n*oVM(f^rl_2Mds+@o9?jyDo_zJ9}7C*n-`t-Cl2$y2HB-o{ZL +uns#$}+)gb?{Z3f)yj}*+kk&EPhF&H@te+2%It69D_8g8{|ZnSBej2uNkz@Mss*gS0K!wF9Q>If%u^7 +m%`!#$R6{ynza=r53z~k +gW1@z2GyVBso6l)$N(E7s<%{Dm^=}J9F$4ani8e=7l8Q!ev6VIWA2fP*DReC-XtYcpsS$myBU2m;0Nf +Btw95-B?;njqCPV%TLeXWOzvFwWQ!{n0yjh3Id=DEIQfb_mCx~dL{BGl%7xgUGyKcqQ00cyj!-wJQc+ +*Csngar)8oLErLAcdI +GFiUI4MH{qkKo^3dcW7`Rohxed6Izv!k((_RoJ_O;tsuX3J%zes%uY72*nY;O#Z^qD^G4_WyfP; +tB7*|vzy0VlAcJoW3XDbd|&a)lO1HCZg7{fo_(YKcFQ +h`BM>S1sMngN8h6+X2k8+ia#%-zbTS;dki0b`ZFXw1qRF?&~Nim}un5Qmmz6ijA5;w#`Ql3&Skp?zJdo0=C*WM>`1Y;x!=N2N-j5wK1EMcsGs&*3e1Wx79WO+*s8zjC7 +hwm{u<51E`UgtMaV|ZUFm!{78{EZL3e7mVUc^>=A!+oyLTU-*rC5wrWg|QV*;1RD=z7>VhYERLlp3kr +L6{%6qJ#N}L>tBk@tTUFK$w$#!t9)5b6AW;&!>TgVThUXVjj2tjQ_K(31@iIzE0rpxs$fS8af9KZ^BQ +n!so-y_r><|jT|sXEB+`*R97DMAp5#Mds0@6a#&FPH1pRt#2pH}U8D&Z6?TW}xeC`zLwLS55xO3ohRV +_e1Ob7iEuk0^sI}n4h|z#JT`d7qR?SDcOJ3|>bui_s!!e0yM3=NkOjN%R05(!&+KB8NRG6DOQ +6R?6#=op^FmYvemcsVId$yi>hbxpjo#9YycQ5mWU9@v|rfL8&g~Sc!RR+zezg#Ec_He6q#!{JKZgk5@|C3 +_Q_nGWs&SIkq$?WCXF$G$OO4# +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 +cb0@vgsrA>c0~X%k5V%_%h< +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 +5R7pZ^f~-7 +1S=lb;-LpEz(CfbF(f%+xp6*3d-)w4k$2^KJ+IO5h`QFkG`xkzXA~%`v8oT69cYxN;{3X=(AOIId7te +|Mei5l)CL)x2uszM?6%|h!$)$+j3R{D|GDw^)nz~ZSwdgqD?Vl7Wc`(CH!_gZ^vtzF)(EGt-Ooo}>_H +6wTF=)kgPK(kGkKCe_MO2WBRhN(UJ^pI8L_=xp_*QJ@fhcoA!-JQUNch*8o(h2p$dNz8Ki`<()6is;v3*YfXV%TV)h87wgR^NoeO3w+7g+O}En`06B7s6zsW%PJgWpLb!|3yKU(GS9IkRs+dnD5tk +WaJy22=gxY?rCw1Pc5t$kjdcqRWnSNj`NvxXA&F?L65_x3Jl&E5+s>LNTh>(siQ=0=vU+1G&gGR(ZlZ +*XQko%{Os=q4``*#ogK@#@IgZ>Z>w-L*p!U~?O$2xtPL$ZEpS=7Rj{Qz)h&uFQzg)fih?^h2ULTi53_J>+_MnC; +k38*R5s4ka6P6w$M6n}aB0tNd_($0YhmIzCiu@P;IqEQG{7W-N;nQKX-oFJOET{gPRn|vg$ool<&KI% +;;6D}$UlW_Yy$2vU<2Ddy{h9tRn)F9I6Q60!^NSkK9%TT&kRSQjuNAKIpZcD@1|nA))~?yCUu9I=^gj +n8i|%?Dpu2mpA@Dzmx7+)CCC~gf?e@9#_MjxRJan``emQ3EZ<2Tb1AWzX-9L~xI{BW9h3s(OR@w0Kj_ +$(nUH=v2e+W*1zlcs|CV$H~y7B4rSraIxKP3JlLCQ=7F#AwS0f4~8u)T+B@fV1{+Jl%WV8;n%ZCyg*C +`D^c=OM4gNYog-zWwBVG2+3UE;BFPMrQ*+S}i>@_Io%o))ON|EZJ+<8{}P|&+1$g!VpE1s0Q{L*xQ?q +`5Qb&=g>6~zr2)e4QR~#dMeFbNRjDm-(b?X*cN)m*DN9_i4XLGXTXe&s*>;=S~nBVQc +Sdy>zx0ui*mm*)r!mIo=o8woNFwT)5MO#;?`vG8VdK%WZ^#^)fVYsF_`9C-n1nb}_W6CcMc7?PdDfBe +9|3dXZTbFydvkSy-pKxAHs&XEa&@ +H-{e((DY?82wZ5J;af9}Iyj>Ql#t;?7E3A_Z<~kaNd63X%% +h`lTW8W%ENZdZ)}8G!JOb#CWsFTTqHfKQ~+8lstKj|b=4WXw$hZ{xtF-GVu+WCKUCIuYQVAQOC?vYDf +ir;^QjAN{M~vv-D`LNYTfBodg398E_$y#oxNACow#+%Y=LF@3w&?843YKs)jhTHG|meOLHLCuP9D18f +dEMO+tiKud@)gt^b64)TAx}r55D*m^XT4CPFe^m7;+FS>Oju)6Of +Qty*(I?=nf=AZfG|T0&s^s%WE;SwRgzn3Xh~y2uZ!>0iMeW|Ynq*(*JvJ)zszTQwH%hJq8^fR%nVX{x +%AduVR=AQnwQ0N|T_<@aZ)Eya;IowG`)W!#%k{2mN=xzb}A%654l=J*^>Mb|Vk!IR#^@h{}wpl$#>2D +Pu2rcC-FRYZErv~Aew_7>_bRu-o{R3;Re)NVu_ID-q@?wW}2Al?+le03M>3d{*a)wD+PQX`7UiQ&hxHH?2{Fd2Mwfq!kD!v2N+x=$TN4$h +Mv?CD5}9xd+pQU9GmN4pjNahpDLeLhnB2>PixCyrDv^1IaRp%nb_zb=a-NnDagEjU3OXM~X>XPkUggO +9iHzhLxWQ1FL-9kRm3!S@p4xQoN12KiK}!^b-M;evzwi=_UN9T`VTVP(IuBb!!&lknmY^_DKhc4xEqO +WopMx>?MCzVV*M$lsEk>e14Z1cIBwdz^ab|I{C(X+mqaso2&YOzn}RQXg~!_{uk`{QAxEC0lm(gC6!S +M|$>4E0g@=wkwT%v&jO!`eb==uym2Hztg+FMlN4|&EFh~h`~>z`h$Ww3=C+$=|BHv`?+>G;cGd|iMb_ +C?3W!P0KT2rp^3cZlyWQSIf9+2MVmAetUJ$m=wy%CN=pkFPvO0k9Z53jzO8|sN +bcRYl?kd=vUJl>4Xw#iONyiqWKWI3dmC?mJ@KkhBe_c#LH!MG1rvqy?%r#Nw!PvPHWpNSyyC(B(15gSAY&tu90}T +-GO|ZpUy&8lCGbHM>Z0{iKf6ivH#yD!r&@FS`7);lM+1Nhya$JYf4TN-cGIyM=wz-0HY?HlYnxlCMlA +GvFQH_UvF?v#!XcwF +2mjAOlnILzUyeMYTnN3lmT+a?P1Roq5_uF8qZi(p1h^TG|K)|rXnqJ?_lZxUf=L2*v-nrRE9w@U1^jq +DRK5LUfI6LulW0T^1|X(6o(MtA0GE_3G#!FTdI8m)8U=_Hq@WFUD=qd<{xdl%DAQ|(z)n0pV0#Ki)VU +SqrJBEJb;Dw{rr%I;ZkzW%L!%iL({ccpj7!U=G+Z~eM;%bl;#4W(5Rx?-<@)5HGsm|nuEa```XZUH~I +1ni9HJ=xg~VK-`@UCw9D<;3gl2HqMIv>qujj>uELZ?CJyl^b-g(iX@U$Hp;;DX{&FMtDB65)+o(O@ay +}PwsU%%l9)?N)$*G?)i#Hd`cJl=~Y&SNanr(pg2BMm3^Z7ZRuMG*TRyaIK>tw{#Y%@!Yi21-?2@gy1P +93GuOt7`lN8E+U^SEUIEwYs_d@nH>(V~^eo?l_qZ^R`wKksbN*W^l*!4ebN;07^cr<2m%>!TxagA4I# +c981Xo3J+Bi2#P=2G|p%>}<_v(vy7ju1^U9DK|Lq`h9lGOHyl0T`EY~cmUpgNi{1Yn_owM1RC+`UU7l +w@KT+jY@{91zy3k;DYo3t5+3P(4+qDF +cJNd^ +Rx=Sglzn!JN06VcypMN7kshQeO^&z3#~Gr4j_O4+`FOM^M`{X$j{Fn#SzSM*89%B(Ao?MXpB_CJ`xgf +P|F`vA{<-!1@HYkjKht_H|D)FPS4ch6@KkTNB1}TlX|P+_l5p)uw3h?)%h~SGW0Rh*w|+rLE>mNNc}z +)kR%COoUsVDczZ-v0n`*jF5KsJY!`S(GLuX=8!Z7<{h7_QeQI# +d!Or<0sADh^vYY8)|11Zo8bBgVFf}T-AObny%3|3e~zK_Kh=7E1_FnMY3aUGd8NPV;Tq)^RMjTd`46q +`IQ*(Kukq~SoOgv7n{$}6M9`8uOL$>i{=v}#!@0-(gr>brf@I;Gp(3ms}Oz) ++ZPtkVY7(ChHrocg7M(rpr)bxV(55?DzsMX82{$!%&-gHgAVAp3;4#HcC{TYz?=RuHP=Ov)Av=581PV +;aUil&vy8~fC39oamZ7zIHp8q`L?%tkus4$5!e7gHRlpzu{{a@W}JE+tF@tpa{^$WtNvO**vY9M;!dx +E^N6+TDHhoi-<9*d|vy$Y93O0qXITd@^gQ*&9t|Xq77%4S36y+EsqRj>)}@^MjdkO@AjKbDLh*Z8>cQ +olmab+pP&OPGRu4FwOr&JeVGz!#CU54<^AN^eN%mxBpz>^`CeBUgGtu-F_(d!cl}I2$Uj72tgnm1%J8 +Xk`y23AoM_`J?c)f!vg`!k5s~rcstzf*p#Nn>dXEb`}K;;ppZ?p`&B$5S$~9%mR +uZS2%XSkJh*SQt)r}R*)mRkrtm^0D2ssd`jL^H-cjTwl4*4v@9BGJ;#>#=!*sq6ds0wncyKy!Vq^ksNZS8Z}EfZ2uN#e^y>hjxRK3{$B3oTj5c{@pU2>{o9v_{phUWm!HeLa*^8pE +TRYSv$7BBdzlw<

zyL$!_h^Xkg}uZMjWSGakRu5|XjH(c-pFh#UKOkBS%jA+*b=zc2iI!5}lx5Ex@ +f7>K)M-P9Gvcq(J66*DBc5kf%^!>*vUgpzle4uVZpTt{%y_LQs--Kq~%4gA~tRkZjb-8J0S*6lUSfi$ +(@cX;R&|U+44!1n*L_qM>h*V6=Luc9+6)ciJ`s0Mqp4<+v +XBP&$Tb>+c~(kv=L7sD~v@f<4?#s>yKg+Nr@Xl705bxpWY*>b;&2UNBy}+xzNK&M%J3H)y3YBRJbpgp +DPP0r_!vJy!s$jzpbm16s!g)p7VG3C|!p52@xKhl`QHdQX+$}+fzID{Y;3#mdfsLjq`pg>A4gw)AK`D +wG}anAs({Rn;YU(A8L)MzBHH1v}NzObv*a#r}T*yXVud9{n`HoZi(W5a4Vwk`R1lA--wr+n5!Hr-b9Y +SUS`!-t8xn8F0(yurz=JbSI8h@@(R4;a!a7?O}rtx8&CBO=P&hZd&@e5(J6#d%Og^D-nNhGKGi`ouVn +`Fq`5Km^^Dz2fa`=lx6@iKw@4XsX~a`Akd&qD``V3t$sq6VG!enMSQV}gHugT$b^@n4$lQA#L0I;AM*Xo2A(%||2>kURg{XPCOY3Wq|59P`F&x%?_ZrV4Q9-SDjn{md&{r*qi +Q#b*3!9Vg#dML_2T$QAJLz;aT{1*O?#y{Ab<m|5=8V;|c*G#%#5#vb(T;BEFY#-Sh<4~GlA~XX!jCfHBi^GviX_ +S5mIo%sBL2RS__!El;E}1`<3Rj(Iq@S7!~cbsN11U7AJqdXb_9Uf7grQa4ygXq1l`kX;Jqdmts_2T&73Zgz@2(!ceh +zQmV{8Jm$)8z#LN};%p4`UyG>C&JD`_hH|=K|nlSWYvZ%`z;ZXo +c26iJL>wql}R;b`x!w2@UZDJhP^|Q6aB@kLqz@^ +=El?mc>Q_jD{IhOwB6Ay%xJJNkpGtVF!5i=!~(9WtFBxJ-lN_Jar@3&Xs;gN{t6Su5q7}NQvjR!s$mX +p!{40*4w42#W+2IB%RSa?%di@XyE&UrsHHzPxoOZiK@#_Ijw^t!Uw&^~7;-$pbSDXF +c%)MEcqh_-;c+ao!W%r`b5%b_X5FiEtVjk`o1qcvg5W}zkKxO;2%T*rF>F!#&vNDl)ct}YRJ0f=M0MN +n5ALrd^^X`I%moOGz`OQXxTp*Em5k8*+F`d^N<=w%T)CS`k@rIb$wt3c#Qa)V(Wr}?|d~F_!y;bQUU0 +|ym!+S+C1uDvJ8tj;(443@*c$v*a6|cv`J1Zp}SodZ1tq~~lI9%e(70Mh#eZYCSGQ^F48GAe +V5wXCC(v1)a$`Eu6VzB`?K%oVSm3 +%Ho^(Lb3VMF!~5==jz=#`R2@jy@Tu5q)OoH4z4GjdlXERyngA;kfH>{pvb#0x9T?spK-va^2Anzhx*j +5?L{BW#dSR0d`h(zo=ss+c}M?6XzTiDy!11m+L5$nEx9n3XGsIQU=X{(!^U>|YuX +yA4WjJWHxTEEYJigdwawJJm|qf7^o5%uK*Fi^X%cQ-siBwKGph8G4wLqFJK3^8Z~a1U412~#v!uIlP~ ++-E4!7~9)K?lgmyQO!{NXGrt)auzb(VPI=Gn!YNJhJdwMDykODP4A>J7%9Atjc=d}Vddj7S0K6&OADpTbGh(v>t5zJ5F)Nojs|ibZv+?ewv+5RXNq&B00?#2yhOwc(yw8q5%JHnv5W!<1WnwQf9&@9%bYJ11Q7p}WsOWEGnx24f@jg1 +#~h-7o`G?u-WRsrE%Vcv#A=unoB4Aa;*PjX`LDWO!rlFXG1hUV$ncHs2AFQ2l3pj(DibJT;=$SXSF1! +Dv$E_;NLkcC5JLfk-tbK+{h3t*}q2yexywXXc$7^pKulWtdIN*x=jEH!~J0&PKElxns{X}C3n^q`bTg +WLXYk>R6mbhl7tWi#hVmXa;deeR#5D&(J`s_&onT~vj9g{n{*f^h;OX$+@md`DFzh7q3>0KLPk{rC>I +AcUY0j70G7G=W7QMbiVqWC!jza@gsS7}zn?9^-$RUK~fq4+pUNc2)qQ5Ar7QAwN>_@s%b=rW(hOn4H9 +q<|_#KNh~gdk92g7|CmreqQv)5RsNBXiw`_@=b8vN&e~YSqKK +Q?ks-(Y-s*1k!R>rIn7rUR#>5cc`wUYNzyD;V!x>d57=DTInaQ!15*X6M{)R6tkiM1a$I+!5G7 +Wgx`DQP4FA$rAFts2Hx*_2R_wu-e1K>3gLwA$BWwNq;P2pk`(lYFbx=Z(kJaM@2>MUB=qfavigdEgJr +RXB=2*aZF-&abA@*&uy&!Fu0)9Xg1ysn8)GJgDnN>ku9qEbUY<5--YUMF81#}ib$r#tQl6A|!NRwzA~ +2a&){eC_Ej&r#^9pO(peZjvN-hCjaa9QWVuKLFB`VzR;as4zN+94^@95FwbB463ZlpPzPcr+&2tDE}S +QSX_22hz{43;;+p+fQ$uVP#qjk^^eqhSxCr9#J47~jM^D}`y|Bq=wc^mi=xOBSa#l??I_`>Y!(y&p|lb_#2YW?=_Z|=jk3-1?{Y84Ul2E)!q(aPY;;ZKxy$9_%X0lWG+Q +*#s)!S*M7rzo_A|cV6YylRxb`bs+zS2bG-n`8Do2UcH#diR7Ga#JFQ=*Kwo5!it3acSE0Sc3kUrHs*= +V0&e7c2$Cvq?_XAemF!!>)IT!}5B3-X**q~$jn)biF(WAumYPU4psy;ygOw@~exI#WOL-MckJ?gl5-C +v8~-CW6hoRo3C*!J9U*uyL9LbaIFv$%+_o2WD?Xr6)oSyl#I;Q5PGI#<hb!yvGRUOWc`;(v8*zmf +*D4}418af$4L2G$7CV$%gnAL#+LRfw3;3Q2DS5 +OY9%0Dv3>f4uTQ~ST*S!1n4t)XUNgB^s_EC_625biR_6YgpK!ImDxwP{L$u_Vnw(D#VkS!w*SK1%Zq` +qC-G5FennLenv_s|XHo0sCawPfApJs1>+T3Vk3Z${5c}6A(mWsn~F@IUX4SrPOKm;XitH&Tyu|+51!n +*Gh9XO$+$Vw23<;&oiDM_~DRZw4@e6$i+^fjiGgUUv2m?H;N6ZZh%QN~c +vP(uvjuiF6psA0PfC-`@l7L|n+TqlZnj%no$5%K +4<0Oh4BeY?ZgeV$8X`K2d!Qg;B=}~Tp(xX^Ue5p*p2OOe4%C`{uBTXLSLoxJYN`9NaNgb#wPLCwg4zD +8WQ@f#$no36gh(aF~-%lDV`}Dpf`G!}&)L@FPcb^!lS8ogw-t`=r#7Gb8AO!ioL)9PO`B)%ESgOj))F+MnP^@5mnFo+@QU#qSN_{|l&U{ +T-@0L{5>fQPnR8|Cdpf`nOTlw$7LlV&qGZvsNviid%)Jh~LBkp$KWQOyIQCr!IL7WUnEu-*@FQ_0cBA +;C-}hG2=j3 +T?1DF7P1T(4l=$VRwPN(NR@==>?M0o0Nt*SAogoSJ1IGrWb<^`>+=G#5d7{bk~dA=1O$<}R127cQr +Zm$`JS;yNPy2I$QL4(`UJkK*S3rZencIYYkK*mZba*`NQr73v`5DbExv^?i6fj7nC@(ccc~bh9m3$9a +=+GYMSA6x;ye|}qkOR1kuiA!%1OK~aeCfnAX}$pe*<(g#Fkfkl%jO5ZhX~ebB(_|G>ddG`7!fFDt~D@NuTo9%hP~xXsuv4-=*A?gCl|`K2wng38vE23`J2ftpmGbLQ%!P<8c1v +hxZ6Er+(~n@N<=A6O;;7Ne3zoTyGg8QMmqc?FwQv#IZ)CE7+)@fG~oU%C1v#j832R%8kK{p(EIFA5mJ +0%PY)h+=~FQF29L9|O{4)!zoFV7vy;4tb3$M&h>)>?nl}(wQ$2x6#ee+`wV^*mRZEc@Z>4%MkK1~gqt +Le|L%Oy{%Hj`D6=xQR8^QcDb?p?XG+Ve#gdryVk_X=P+2zAk+kxxY-v}jyPt4nUtWjx?Xtw~$rMV@bU +_G?neOG-wqT$PZG6f2w4Pn1B+$ND{(~8RdHDCBVkwlhuUMlGM8#@iH1PBgWtnJlHl+7AXOoB^6N2%mH +y4;M>IxB*AiSlO@jB0yM-*0uQ7;jUwVrdN<_ug;dx%e;UgxMuxKOjo92+1a`ls9a@ZU~~MX$e}ymT~% +Y%fdz5Es9&buX*_J)8!HfcVIfP!EPm!^C`PYwbRc0z{d6za;cFvh}K?dZsL-zdCTUld!ge=$E#jQPNC +)BhG%pGAf`G^V&KFhSk4varldkOQc~*^?W!7= +9mfOixj4?psdL)y|$7doGoZ=H`;*8tx(L;+yjC?0J7jta96M#VxJ@N)=3gV6Nibs5rr@?K3SePH&D4e +&@V56=9PgUo5mVh+cNm_@>gJ6{8|y^cUovf&f<}5(Je#Bwj3vq3~O^+awVUs8X3Gq=i({YAnGwxg$fZ +ugG~t+QRm=liNxyEo#86es^zQCT#7v0 +659+leU;9So0{NL$*EZL9!ck*n$7F+(ei~S=wuKdR0h3WKI0yd +qcn)opD+AqDULpaA&)6Z`;Fj#%5;3Ii6p}m|>9 +N@xczI^3YcW7ez>X2SB8o>(SOJ-9{7^R3r_0EtVwquyLv1t4a6UQt`fVh-h) +${y!s`^lYmlXYe#ll&=VTM`{AiB=C``RFdz|V1+q9b!TZl=+)RkSxBftvFVw%i_jqGZ9QcQ0co(l~GgZ+q?0kI>?x^_yOnMh$iqo|?^-% +y8MGVY#6VN^bv$E07@I5%vkjJ*9Vo++y(sxM^I%4Lnwt`Er5wD4(InEk$TWc +W)zF#^UHBZw0#U0mikm%Hh1g>=nDTB~UlBZe9Yzl)#bA-dGl`%>}%pnhe{kcX>T)*Z2W>RK;%hmL4>qZ{%}&IW>-mIB%lU3q$0E2V^dcl-QV;W_ZlFzdNyI>ZS##gzX4s +N-)}_+6^m(KsD0vB8AH3&a!rC8UE|Jx#5D7?hgP{dqu`4@XC#DXSTGKLF3(RuDzq(DsfG@o9sak51AW +*1p#PIj@h>j+=T7mrlk{*5KU5WI3WgvG$59f6X@o*4jK+7|iDL*se$+C4=M>2g-*fkZDEz7Td`U*6M{ +x(uex&JxL9>VbQF>H@@^8~;a{Op0h(5y%4jpCc5d2F%es(_yK}U1v?$pxclMtW|hr2r|6grwazvC3YR +B%2;BP=PJnA_;j)2N5v|JKm8lXT%$8}Rf``jU#Z(R3Stj(CZM{4V-S9YP4kM{Cb15Rhs+)X?1?2%;-lLlZ~%+2!y1Kwjt>WpUETO +Jg<`O8iM_?DO0ox~NoA{`dq1t$_TjZnBOAvDqIAH`R1D1e!@c86IHref+&5(K6hEDLoZo4QvR%B`t?& +2p)oH(XeQ5YKp74&A=tmW69|y$%4m3TZeqprU%5RdGg~6EowUT|yFH8ky5$ +m{<7i6ycD(0ip}5sBwiy=ddI5Pps*$C4l}_c=1mb`kfX1?IORnpcq1yDDCdp?ATz*6g5%wJex|_~@#r^xiyoV0sp5aGe0;5N8v!9=$AMF72xMZ3g7BNUt6QEm +5szBr~4)0yD`{@v0pK}vHU{5|6)*`UyiAlua%8l`!~~S_<8yD)#SKQf0dpdY+n56>^+X>eAMsGcm>1= +v`8G2{gR%B%q~P~?ijiu@#zpFauJ_@P7EjOA)zS!zLA;#31(6s@x}99`9RKT%Qa0~$cSpzNIs8N>z~a +2S)A{sMw_*>=92^3_rPDf14Mc>}8j +=3yf<=0v5LJvOmz7*im%d^ +z+cT<7GI?;?NW9mwsZk}(kA?VBEbG(kw)NG+vA&g%g+d)3)?EP`Q{!)MQmb9G)VyL-jKej-qmVP-FqB +*fd*$E)lj99Y&{TK<7rgX!)>)}mENcFHe7gBQ>;ni*WGEqF+j@%1WCch=-;Brl$U%9AzA37n1LM6_Gs +$SrekrEhZz=?3JI^|m`tSaNctu8VeJA4>G*6;+@@*{sAh^*$YfQHeNXSNXk&$_%rLmC)F`C|8CywSAje0Vc$yluH6M&!GKp_O8<%G?Ue;EduO$#5D{XV$8XPdwtvsjqr*G;^t&A+UeKd>dN9VKqvpA982V_NAJGo|;~pI$pH6@*KS*Z#%ITl7#Ll;)cP#OK@q +Mi8dheT@b({mwgmHtTQAn!a1rNplR`BrG{oYaM1pbZRJKP@dZ~Wfj_JF_P_cm1w4h=!^u!ma(9kOQvp +kO@DoFy)}GdvpQ;e@@g^J%!|t7uVI0!&Wo=9@1{)B9}cCJK^$gi<%-Om>9_3l|{ou(1URJ(y>oWYU>V +K>qqT@38uQGCYXvQ~e5eWUqPOY2W|3i}sU^B=ABJG1%KD!;Lt7!KnQgyR%Vk|+t0BuS&Y-8`l%KrlhT7=nH~=|X+_e +3D~Q)1g6{AL;rSJCgiI*U=YY2lPYQIOa8eJ7!1^dwYy!Opo0EZkqN}_c-CmxO@a5j!Xyj6GwLc_2}OH +Qfl~K%z%H&2jqvQn}0?uMEPMWiR7@v=Um<2Pb5|{2r$K#0>ewMKt{ +*Mg1ucY7htdYmLeXq?&n96;3PbeP-||KwgT}M@;CBt#=8~lpjSFYFE0j9GohQ^L +k{NO1X>G?8BT(6f$y&>jWu;%XKdyR(anaaa0z+o;8Lh;z7x~e920Eh}K$TXGMi>+8BN81*ATJB^3--> +2ef5#q+?0ke8GkNp&7%5Z;8GXH!tp_Y(3N +5oq!k?cj*Jvo<41lcQTn+A_+o6D)>hERkl{04^;7JSxMJxYMxzY(FfC6WyNF0R{!Q#Muj_%Zgm|n4_zlLm@;zTci+Kp-`2;xn?e%HLf^=jfPKvD$dIi)FEbWQ;{7d~a&9dCRO(R3-H +(;0rad24ah(VJqN*Reo+q>HbZzsP(%6PJ>a&?>y#Z|*>&eaqpeuv412l`~;C4Z`Vx7e?pa2L!NOm=D17*vdf=7DL +6^Fiv=I57#yZRU2zS=Sg%q*mc1V;_Q7*P`v(4)8!g8}|4M@)V +h2#6=o?cb8vv|(9%k{F{W*zS((U_r$!8P_QNT$P{^}!RMCXP39 +v8EL>PfjvA-g0+Ed=+^b=%jnFfxGbW~imgs5%9@rk0GnW?Bo^Bi-O +?q6CchjQI0be3mfTXbuh#QCI%L@SbNVKDl?q2}R4y3Bj%DULV2P9-9KSD>vwtM6P9%F^er|xf!g*q^Q +`}73snxuQLPK$lQ18}dWEWQCBSgFzxtYe>jY2~3uTS{YRh`p+FfHbX11ptznM7mxY=2;;v3U07xbC3q +rzf46?~rx>@gl#>1pU(memf-;rXhL{SLOl@d2~qPeEyiJ?KX +v<&f1P4ys4=Wx{uM)lsm|cY&)v!E2(y(;?X5n%`$dJQ=~I+QDZ0#T*`(V7jJw-0&tSKQy9mAj6i+_v=4Zni`3hJm#lh`$@ZnnAMv +|Bg$RO?~qjqjHyukDp*3b3i&AIPlz8I1f97!+zEc`?FgF{_GzA>=uDPyT?DfMc`Za_&0`onE)YJ7Ig2 +tA(}N=Lxl}8+f;t^8llk=$}ma1*eGQaN}=2=lrr2N$rDjQ1OFsjGvx!_hE@Y(7UY{UYbu9|3RA!ePr& +fjXks4S(=MEatahn5c~10~waMxf;R4A86zf-%W=C4I~B`ZVTCyN9ea$8cVmjr~=-jTL@R1Z +4#AOq)(x`NU=EfjqQ6=nEG(Wj*`8tVnrM^(yQi4YG7iUSJl-3UGuLoV^IaZC>k|Z{L@kTT23o!0xh8$ +^Cidb0AD{>3n@X>{q+qp#UxP_jB7nEe4Y6N%@NXE397DQt{6+IV$_BoE>7TH}33&dTbLR0CtX#wDaad +JXN{kcqYT7Uzh4K(*DYU6yc(LL(oE#DV0}R(DbUkTSC8IZ(8=QHwI(XTKn0PDJ&LIQ+2OIBz0!jeKj(xYBt^@I+0qjWltc_8hxdMq +^+^4!&DA!d4A!^P<$S2_a|o#)P_bIl&SKi8tj_qWYVD6i}J@-ivx*)pM!_Tc$)&LB7m!BqkL`S! +8l!6)yVu&wBbyVkz~7qo0Gm;6ZH76n&E$edccA8CV~c;3MINXPZbg|l2sXy+GABmRSGTQOr#w<>4+e$s=-8Y^YjFe_Ho3T&OChrUxRmeoZqlToDeIey +3FX1w-mcdqj|`|D4|)O}dCJ(E6-u=5l$lLk!et5w(v+siUWPgr=~n@hITnH99b3)!o8&PX&Y|@RSWsA +bQ`N3dCH^(~XG7wv@QE84 +Frx#al>J+4qLPbxD++yh5QQ>5su_J$TYEeNDMu(bvt^^AxyM%bNI!U#T`DMiU|&pSog4?KaimpYk`UZ +9F>g@xT0aL;SIC8TtXLNi}Q7SLQ>U>{xD5(s(OVbfm*hK{vA{!wWCV_0Vw*$>pp@! ++*Qh&oJ>Xt@GQCFAU$|AxU5)1w%MRQY22p6bbLg2?8gn{m1X_CtpLTS&1H+g+Fdm8?a`q(hfnE7W +t`$GRumn +4fb1hignrcdsgKO<{siiSO9||#xRBV7baIqusLzoYK8_IS0Vfmm;07e|4ru=rC!z->fch0BAcsfwwpM +F>d0xon!Bq}-{T@y%ziRPvUG-Pv-0$}Jf!FEEDxoiLq5oI}?ofdIY1BK^9V}g~&McOTd=vjwqm{xht` +l9HyX$I#Q=8WQza#PcVq*GEnqj$C%K +f2Gqf)|0G03*XUj<4NG4w=ghQWl@{<8iZc+g4!Xj)>)}WVN#eKhEi6eN8soxV;csLO9ipFK%tkDh&racT{nBRC7{ux^@5A++YbFjp*a+#P(WCmf9B?F0xN6ujMwu0>HB4#gVMLlO3()1Y^5f3p&Vy3Ocy&FmZTX2S +p$;WQdgCmpmA^m>gEz|~L*UnIhgaJB5yr0FeG;!q`DC8%#PGP(q;sVA)c2<>Lm?lf+J&XySoblcQHvj +LKxUZ>X7qa^LC%h^T;TjaD;p}t7K-=F=uyVXq=68b5LZ*jK9aJ5h%{-{qXb2 +e2nE49Y%WW4@UB0HF}tfn%ySGwf?43oqB`!wUCBYYiPTF}y_(0tsUvYHZy9?7ET_|C&Q( +gmt*p@+_o;3Wq`xdzN_59lW$g6QZPcJZ9HC@jHOe@8&jKbORy|q!#hB*>N7ix1ejfODqQ?xbu%6i?{o +!Ebvcb;?pox_SA*yN)~xmTt}8^l+H#Vx8>KmKe +1bQ-{cQ|4=)OvlQZazo(0+n>zWg90^oF~E2x4Y+fp&|P~8^Cc7u_5!cDMl=S-~6)hKRHRwHEOBxuGgS +@F`0`t+O&`%sp0J;kJuhl^ZS38Spn`Gme-dVO`R=S8}}ZgzfzWKGRJKRkGM57p#u^2=vW?yqHwo=||X +OGl919pAKMptO^y3|6I_Bmb2JQC*MaMoA!5nPx-04^2n?U +C5%8I|%B{p^q$eqjP4K14q9$JGp=*V5Nh{-yN-E_gCQuq{!b8idX&?prV*YBy6pQPj;%3YD{OIi_*0_ +gwC(zGqFEE`wqU@*HA9uX@2(}Ecax&HYODR~HBdT}><1bnepf-_+m3a)DFb6AtKTp2v2w=iC({k?5mAk=({t(Y)3noHnprs3O*yiuzFH}na3S!g~P` +-dycqS5xF8Oi1XdUcA7Rn?nLWaM28{ApuBjJb|xSWu&7g#L@>bDwNX7I6Jl^9;pBJtdv{cJj&sDikjs +aZcozJg0*Pl5$s1Q7`kryzec)aiSJe7}CHd6tTdSP|hz}t4xvOtDG8D@-3d`iIWJ7V&5dvL4Q57lc3D%q +03y;*moF`Os|6KeL(QgS~>K2j0w~gUETTnj9o~a=#Ar9mI&`2g9C#jq8*+dJ^YH1HbcMv&M`lg{ +AQ`qq)E;70z9Vq?*-c`6HR+w?LD;qjCaM>ixha~D#~yT_Dap3&>4a**Uj- +yVYlomGSDltvIMK~^jX3zA#x0j3sCbf6QlThg*tdzRk67e&6@gW{z>V)GS_+UkiBnB?7%!XJhpoE@?9(QQN?(J)FK5%bZYgnXv0e7p8@@O-eNI)g$-T_?g0#$lEpqAOo!8b=?anWl +%t${t-Gl*IUWD2l#gq2W)xDE?HT_WhvgkspBaPkkvnnuJm8(74A@Y%G7lnT~h2M!V(?{KwYHeny`d&!=esew{ci +~9P%CS)|)8;bI;){hPI)IXrB_>ygd^ywIlOwgbtQdj|?dEx7j`#tH3Rh<6eT*M0x8rwjHJg`wW$z0-n +ER-hM-zxMe|S$?q3SJqwe6HfTd;(DP=r@ZAOQ*E-tUS-UJS|SE1IxTp9U^p8o +{*T;UqS1=g&l+bWjiRPS^LvOs%O(=eNz5vR{Al#(q_Be&NPJ{P4>g7Cqbijg=ybPw$ae>^rw5aKzb+jgN}%Znd{Xfta#nFUD0Fgxod#bzv4oFgv@^ekj8-(5!JpgY9(!7@S`yUzd2a3% +HQ1)@b#Ad%8vdH!?1POHoM^u8s@YM< +DQvY6!Jb0q{Ox`=df@8`9vf^7VhgI+RTf(ty<>FmQg8yJ3MG`rh+^e$l1J|?cgNaGlmi-Sa40B2PJvcjL^)iO_J>j0v}Ub +x@!VWs-_2_0;J;RdO?1^L73_bSLl|f*8MHMp2TjRZ6i`{+8*9KZE~uz6aGkjvcD26xlS&7pE=P663~C +YU)-q9BlIqr`*KMKin()H?J+qN>h&v!#ELBF@h)Sw_E3Y_ZTTt48p*~T1AC3SEuT?u1b&Fqk{>2_jMPC5vupK#6bsE)UlpLfOwWf6 +O2Z!W#_v_7iZ&a_s0H_7)X|?GAFyTd3)8%ge-4tsA5|Hfy1>TXBAwiX&!;A`Bq8g6%9mpzZb)(Q#yZh +Go>zwB#kRuRpI+t(hUg19m;{5S%4u1I#=Y=1?PfBftHD%bCd+WtGHy+rgDgn;Hw><+Y^F>nnWhppf>M +BW`kqfq8QxlhzhaL)q#e=}TX%nv@20O!8oO6b)3`yk)o#EbFl?Mprwi^Uq$4 +4xzzj?U@DTr98e1wT$$eeQT8<43G{pHiULi&;pz6iHED5iX<;G*Bx! +iuDwF|Nh>bOn?-y24x}-fySwIQ1KXKb#CHCE6d@rg~&kh(lL3Ncy4B-S2-hU=q0CKZ_3DhwghKJgCQA +r2nHZeuf^x?m(Cm&ES<5dy(O;&G%lm7v^r@fmrW(#rVp|uQCtY|9{{V{6xU_4Bb#J=_J0#w{k3y{53j +y+-k&2Zm?numq@*yEM$tXM{LV0Uh&Y0;7&>xkd%#71WH*kKTYND7;Li}7Jy1;d=X|?)ZhtyLAMI_#XW +}|deOl$PqseWLD|6(d>VY2s2>HynIjXklp%ayVPYiSiLzbv%jHiIR(M2|5b;ffwLu~E2MA01n+WSUD?h7kuEK8- +mLs}le5tErY-fO)@1*=Al$F5hrmhFd0uGq- +`h(iuXHn-LKdb7d6;II7fOx&gbjRz|RKE;$SkWwFSiKAg)gk_D*Mxf==Q!@})kRTu +Ct&MMwj0va}2S>f1Y{QupVk@AmoJB@+c}=;W9Ja0=|JR-ReULZTRfCF>$8wnp1fL|bp(%3mwp-_h$k4 +Y-J{b_AAGQLx99TeLK4f|>wY5hBmU#T1zYiLk~nyp^tw?-~L28mr=RcE`iX3bNPJYUCvhp8?qCmwC6> +7Y=>T0PhUwlQ+kVnx2&?LU8Pv+OW++67*=z`$L$j4u>qYTT`qLjZ*3`?^$S{HBNT*wgU8eT^W+5mpu9LFS#_Rg2NwUENDKI0N&-X0dpnk`F}86M3Vki#`kAvwC!=LBlJWit#aT> +_DrlqDON19L*t?<&a3(kA&XuV^l4QarWy;oe#fVKaCY|v!Er;@$ESX5Y(|{ +duigEF+1l{10ekiql3T~@5UPk^Uvu#+!s!yWD^l~dxqHiJ(!mI4l>ELTKBvKcko*P~X*h0*^?1bvWQ` +hB*T^1pUGu5XoR2RmEIJJaK!x_K!W;I1yPYD+R)&zU@fTpMoR(`EbL)RrN=QrWbD`%ex8-B_64{;hlq +L(CkNs(=fp)Q&!V3~5g6ZTonF)jx@jiRP9^ROoa#hD&Jh|%_Z0V-meETvn>c`0xgpIA8Q-Gz4nzum9l +5_ro~!PKI~0Whv{ls#$0{_*8TC`KUvkxj`N>)iBoX=i5-TWjCN&oJ)d)jg?|I#h8|N_-Q~;foB6dq6p +HoD@|R7k6Z#E%A%>WYt?_k&H5EfD3Pd+AUw?=h+q(>VjhSBPZdfKP_&-0GG%}yHkBNwmgZ1?zVyNb12 +%`$oe5In9il75*SYxS3c{AbxxgiJiV|}NmOUb;qo^?IT@V$^T6uMvyDyJWH~5#3`wZx6y8h*>eY0VLy +Y_K(Eb{YBlQHC3{3tq(&F3k3pwtCa=ueF{jV?5J3l@5|2g_-|NF?(TUqwQ(M+3tdEmd>Y&_N3J*xj}% +=%_H{a?xd{R09)^bfy1^S^$`cU%>HS$@mXAEqJu;n~*fS4i&vZ+rV0DgNbs{kBYu?TC;@@o$df#o~jI +m(U;aP~s3~gOUS4LD>h9p@-~y1bw81vL9pQo2ZcboPm%Z^`Vb$8X6sljUYay#$ErJ +|BX?Byy&e+`J!IkVPpxBzt4C%qKTgI!19_nISmKzD_$dJA@MmCfcEDH+ITDEbhOq1apF0fP!Rn3~4+) +3pQ;s7YEY+IbvS`0)!AqAm%&fK@0*h2>tp4RF~~;SHEt*@$IuuL|0j+7#~TQD>GN +F1T@q7HralgYQJwp_HE_g7woI`0{+c{eYIY|zge)a)(iMI3-;A|0sm>ier47%@NL*JnVZ~i5?VtI;5u6}lc4?g&skS{0{BAnpsQ*z}f2mvevjINXJ +o-h8R7x2ZDP8ivzEfGH9iL1~3<7E(33=a0?r7q_xjF|b#^(6innxVbIKp8lbcYkTPSUml$wg(kx=^N! +qF92iH>eY7{cN8oOCkbKeJ^eAC +>C>!m9rQl@X5BL(HVLTp{?dPxQ +0GB&MJMea9k3d!1n1;--&0kV#v7pdcaGZh{&2d$fAYG&;&g%kHg^2e+8wy*MmQuZU_7) +ulrM{YpJhKUIy?nlu$s_(t2xEyKYpm&uuG8*|yDDNPi(W<;^0yaS(Ri1tNycM;h(?AvZOuw`@LTpOPt +z={r^yuQ=sg|FO7ZSg+vXjJ_%#6`yC +iW^laU!k|kygkN1st^7>@VDfd6F{wI}W6SxW-|KXwH`d?<0g+ERPCmYQ~un(%qp^Y+=W +ZjnI?V!LQJLjr-CSax3@wqu>$grKcIszxaJm{{;Z#SQD)}@$F6`4u+p8ZU-cyo1|7yLs0pJ$BX@difS +ds5pFJ^hD4cX`_g@O*B5+!xyVy#1(n50gP`?8HgS9pk!GKp3oN_7OdH>Jvo#;dEd{--v{zp~zs`o8Z4 +;5bhZ&v8k-`nXK)@}qJNj|;UG>7=r)#Pc7|zAof}MI%;~bY7K20=?KgU@&ylR~KKT{ONea^64d +6uzr!_pG0U?vkuBs(9<;`an?phOF&gCNQ +-Wxx64RSL-=J>K>9VEmhs;HE9OYwT_z^*%;p4M~w`r&TAL +`{wIqHe6V-_(3?FR*w?|hZ&CoZBa5f2iF^uE$(t}0t{&7aFnsOtV0nK5YPs6t&yD5ZZ}Fe*5csEC{HH +qvwp;vl!GVM8I+G?G=#;Y?o3mgHc+Hd{fG5u2kB7WAb!#E-ra$2mtagc +U$IEYcOuzLYy$-pp7C3UKui9?r?_iZkzL!IZ%>(gdh@q@G0Nj2i*i;w2?gkD);^K!8l1>CLv@Y!Qc)Ob7dZ&404Yn@8|JFO3JAR9;3&RNmBp +lwH5!(s=?Vl4h8)rxzs56*U*NiO4P2)g9kHc3>4rSRh9(@=zh|>_$Y@Qw5AgD8le-4qop;v`K%me{=2 +&E;N?~sygRQpR*&0QOy0ApUi3ev$w3LG`R1p!ZF&Bnh-I-RYZ>KD%wG1#DPpSoy$w)YMsY6SF0pC`?ZMw}?Z8CzhYmz^FQ}=q265*qbUy2iD0rvxEwaQ8e} +p3}J`1&l|*b?HZ0>sq_2SRjarkr6X|&U*C*U=P8FAy0b9NLC1NE2`+zYHv6N{0kFI)jrG*$^ps>}?Oa +n%c%Y*Y&DW&44cD>Ypy^mFZz7o`;{8Uj`^Z=Y3QteBxP&HYT@pQ6c`55-xxyi@7UsskYK +LI(>FY(;1NoJvBg%C+k`0h`1~^>Gi#T5RFtb9FIOFf!Mm61aaU&t#G`z;`&ydAMq2^Ex?sH +X73CR={FnnAziq}WKN4Enu&Ci8qjavFX2x2mM&D!Oio?y&>z%FMh;boKVpOdUh-2D48~ku{8 +s6jb=LDO#FaKFh5;RxM3Zuw~(JTfT)-FEa%Jhz;oO~D9EZF(EL8iPeogS{t=e~I$E?;c8oF;N~Ar^-q +kndn;^vc`H=w7L^zk=D8CUhksL!3wAQ_ck(epVx%N*CL7qKsexfHZmJ^3pW+pP-Yrg0jqbxM&11#IJ{ +7bUY$`@HYQyMhY5x0JIGQx&B#wYg!xrUy1gE*fps-~QXxI!^&Tl3Mwz{v-QCY)gYLS4v;crq5RMChp{ +yz8xW8}oi<;|M;!LGMXo&+(Vx*G0aW!f%dzOO#~!UKW|#_#K!3{rR^wX8+h(Y{w@4fKoyexBc^PDpvn +vC;fzH|8TaIaE^7TwKINi|H8qIGCp!7x(UXd6X>@8#T7GMYTb|xm-ao0YbHrPQ|@-q?&xi_1^^j4@K_l +P{Dwje&*TO>$gBgJfYNdAr@TLvQ8^ALEj?UU|^a>aj}kSVe!29TY5LhVCo*Ny);k@hfbc<%A%_?NgBG +OID?+>50rl$FvH^7EJFhc%4)5k1`wf66%Vxq7tW%Ji+FTEpl<<=M|h1K(V?+k%w=M$I5$ZG84kiR(ufOLaXxLXWX5B9`MHrZy$=zz+WYu^@2O-=EpPx?XYFbg_pK9n0<_|eP7JaZ7armi-9V^FW~#}wVJF +N-vYWl%#PigtyMSFCe)ie%j{=(U0v7hmT}`GAjIs^mp%j8?KQJRsD1xSJicC&`8?o{6MiZ@1Amf;V}7 +Hz{5am=KTS74xda1_LVH(+z=P3v +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 +Z3RP|V)*^V}&w90c&Ww0^t8Vz1y9k +N$Rnh#ATApQp1RMYxKd9l9rK ++!2lc6HeY9#rm-gg5l{Fbl4U>RP{gz2;8)RX>I1ox2$wJkShe-ZXO{)^ohnPEouU?F%e`FXgi@MDCqK +0p!9rXO<2Js-9h<$?041qSb1%wHzosFUW- +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 +NN~FRZ*lc$|Bu0|8jBVYn2X>kEq +bl2??Vzr)PNNnOL#7~Am$vPoVcdqHOfAX|V*Z7sUn_@S>`QdWpV?CmQXdk5Wu&UN=S7$wnN?tLG^xnd +n+7pP*GO|x{3S=Zm_&t@TQ!T3(DU6I|2vf!Nryy7^L+M?QRk|w&vvm0v(-3N2-bsrMhC{Wvc4r*(x*= +8s0C)wms_ZXkq)wj}roP{K28+1a)Pv~@Y{fnkb5xTHjPfBd%(*5{jcAuXuRy{m_?C02Y6NHaIWaG24x +n$lE>ujG6rYZO;_YJtrv#wieX5GaT;1t|ncG}sr^JNP(%ljI9Sv$LDBh#vfZN{bWF=6At1>4ns2tfb+ +)whcSf9~`z5YYMY%8m~;uL%fPIBl3!pEWYI?YgIkX1o-Ha(OIv>=?&TD@e> +TqO{Yq6yUh%?kFvG%gdB78_R|;cfKtK>mS!IqJEggl8)i@S-uHar@E&mBiiNYH)Vg2!#Dc|oTC^GSGx +}fowLrFnbt3*g&RZWnsHLuha@=-Hc=C%ce(Ub +Q-~h7p;3LVCZk{;pg6d55oAJ5RT6X~Xxe2+0ug +K_09#P>0j~eLF}s+)9_wZXsSFsmf6mnCfWiSVHH(uLqk48&Ts`@OZ2ruQYAU;Zj$TCsM$CCyrI;qH*h +#iVQt6iR3KO9$YGy!RSnAoj2Z65U-w!%2AiFSl<=$^^C9rnej(*15`yi;nd6S_|&<9sNQ=M=`FT@4l) +FbI#;FM)jLXJIC)QQMksgIt347WP}3SX>VX3OZF$-_!!T@OA-KR-6lPn|RG?SU^EzRk002)!OYGN+h693LvX~8F*xE3LXHLfI +edK9D=fh8809PVICG&6B@SVyGP|keyG}|?k= +L_sleIRU>mg(Bs|A5E>I80D^F;2DnSwJ?pMvX1(~u%4;sBqm-v_~x=p(Q^|+At3vHwTMal0f7rcS4R# +Z{uEonwzUJ@`hoAtXQwR3Ok=|rk++YQSo@o0UxoGGm+@N=Y~8gP1?$Kzyi%G~?NBMHNiZzW?UW$&pT@ +BF}mY3w%?GTvB?1q%oCP9kz>vXm!z +ZN6S3CtN}>_9*#PJ^-?%4ATlU+MMpevm?Rfg4Iyxv$ra6#CE`;#tL=3?jv#3&hrAYvk2BsiN2p$wwxa +TGQ1WQLSnk$nYf%wv?#IlJJ36hX=5U@q{V@Ldo^;GV$Ew>$n4;FH8x-}>8&_09KhU*^=YE3<_`W{XIywTu_>9bQv_= +i8AExG`-aXuw9crqJK}wuO&v~UA&Xo68jt2O7`UcF0%!vTk@YwHu3<(H!U%GhgK_`T47qS>x)L%cA0e}wkxwBge4*QEkn=O}ZkS_a8-?^?k*D@;8r5BYG(^ffkocBZcNEjP7TcvG{Z`1VzR +xsb9zp;ks8iLKb9A>wJn3|vUYS{K!Ci#S8w49FrYg~wjc&Poji(9?L +;SL=`+F-19E>=GXb=K)%Iqn^UCI_61;*QFJ)b6y9z;RGaLU&eAKj>JuSLvWJKXBQsg^|O!Q*_|OM!Es +0`!XuY1Pm*%Z4`3g~-Lr$~2Yo*j$QfWTF>>n$A|DpNybGnTSUhAV>g>qjD~b~PB4W6d$_HXO%8Uo;JO +{0xJs}fj@UrMNP-d&CIQ4Ru!TjpxSvL44r}c|v17K^z{SE`jy7!hXm^#mDb<#&(tfLnt>t@!J)kkZ87jP0WCD9`pF(t+obj3dNgvn?Bo0OcH{%pwectx7yWG@VHNvxc8X3l`*< +&^FSewtldc62>Qe?6)zHEGptz@^4XW79O6#tWII7~-Ja9JMhUn|09b(ka=X2BQapEQtdkF831?W51NW +)fdTK_5G9pRYQHSWFX(5Od^3}Txv +5~W)b01sEU@Uz*N;XYgi-HX=I=BRLZuV0|sS=Io4^>^uB{azi|>NrSr^LlGYPh;DIMEF)h-{dHn&F^e +_6niiq;2Tpj{O3-f-JvYsI~4fgA^C$=4xl3?*L?k^kBas;%sl_kJCx<;4rMDFf4A*_+M$&Hre=XU&4N +a^`%3{bw=(KvQ5JN_EaO6(4lF@uRxV@M7o`4p%4P&rxk;ASaP%yNxqdx3%%G5JiQkW*4>&MXnwLz{?w +Gn_O6G84`}?4;aW?W;8MgN#%HEbhL=)K2| +Os_GEXx|0;N+~3d`%Dj@mTQg>m*yZ$pAWT!mQX?+Pd16wt4W*U^vsh-m7=jbjl@s-3LdjGD1E~y;@ko +21b9PyVY>)@@*dNfGQ~Hpj|v29mcczigbpWe0AB%4)vWNkPxRS_Zo#v!Tr!xZgBuzEeWBoY8#K5?JqD +@HF|ZU!TM+m)a7MW9!02u?Enwyo_JWQVCtUBRWJ +3mhA$E1BMVaxdt5|IGtT1yKPDRqHcZ>Y2gI;)uxXHosPi(qL3Rc(P()9m^E;FQlDRYJsFZXiluY%Jt`OmjSRpg#8^IMUE9LqQ**M8Q0d$V0bk|{pvIS~HVNFk` +o|4{vsc_RM>%p{_iKxspLKn=XSchbHRM_t&9i|LPNLfydkYG>ELjbNLtQOqFYAVuF$k}U0l9=mYfDv( +6A!sV9Y@bf=E-*8D3onem7ajS&?1vAj~Y5wz}OqKc;+rkD5SAS<4kqzYN&m-`O)fba3kHFS5KWTk&dy +B5ITV#o-KMCHaT!_O9X+`ny=~cL?l(Cx%c+cpT4R-CNb90r;dn +TMBF*!VKW8IHwNHV#KHy^yPUZ#de0Ah +ufa9UtU)%t{+VE~FG(NUgj{^XFe|1=sST*a^v>2JHXO8t+It-${TRRf^~~Ij<%e%g(JN%ZqHkm1)_(- +OwTY1UcIZcs3z}?a-Fj89tt3MJOeZ6GS7HwH(t$Ng*Qj3HaM^QHtA?sG +$ejoOD0`-pO4t83sNrHy#IaPW^fh#NNlZ;#*MAjG}7TJ1rXc?{5`NaF0e+{zzGeJt_SM7LkYKpO-C{( +^zt{}u!NO`rSUVxSEI0XqhIbL&p(cLcRh!qytf9a&grIlguuw9ln9tJPq}Nk}Nsm9ko$0$qf$yq$-XT +q4)&YB-JX_1jG3{l%T%kI25{?P|BtyfEyTF~lr>zSGK|%ibTz68JZg7GHR!9vFtn +MoI8A-2#JA}S?JU}u*d_0&Euh+%vwJI8ysHtf``|l$H~PBlnUb4k0*!BF&zRhzoAoUIt~G4Y4oyCSZxdu7WI6b+R;^ho}~i5tW^D&rP8j?*ZWb0&v%YCL10f~MC1NogAN +D$UG+Uh~m%!`!B4KX>qd2D!(Z~J +^pr6f4kkzzbWl~vm%?E%RP7&zx_X}UFyerFASJte=nBgH?F9P`k7R}P04R&a^F;8%HsYT+Xv5~=t-vlxevf{Zv%+^_{Rr +Ej*oP2)ymwIGyKvl!w^s9x2fGwaypP-6^ICMc<ezNqXB=@r0>@g +5Svjqo$abN8SFDPhI~7b1;ek6)C+tPZ_l=2>-Wmit>=3C;t=0B(_DWnc-|hT|KY@s?J+IPUVu$dM*Sw +Ys=kGnT3YkvAS0S-Zv+`w-8we@vQ3qbx4*h6VD(d$RSKTUeF(jBFZF7mc9GQk^PWRg%l&n+R7;+9_M0 +T@yRz0b=>xZ_09iOaLa7=e)PBlGzmi3x3ea6As0*BDrn{$n>tcy&BwwE&i5h!-Ja$w1*&i8LpZRq*+5 +S^Q==8ZrTU&=z)qyjtC)lNFHGjRT?>-(MZ}Z1G0p>RU_@I9}wZRr`{$?B8ZQ(xO6>a@7O@4cv=l3T@? +-{T@r@6n!TOsUU2*382HLGMt0ReOI&zy|qo6abaurNwB5HaYLN$QpD^T?~BPwh>+Pya7(@73idwss5O +^DFi}-*-d~J;r-M5+D&Il7KsM5J@0J`1J>5m)mxix4YlH$LZm=T?j2Ll~vE0^9ggdtYozptiEDTY@rC +b#EWGEyvpMOYoNiDc~&K!221Pf5T489T!q+EN6yAs??Yjwq?nILq@Y*Oe5^0lp$Qp+WvvG^bc&`I0W; +w2uKfZ%BlpQLw6z^98ZA(2b{NH#dV!@t(D|Wmisk4wQlBzNa#Bu+3wS|v9gnwbI$_V#nnNg<(#Rb%F$ +i+xOp!62r+5N6!&GJ4>O}HXyB%lN)pkO@to#E|nDVNC!IA5c>cI{O`n*Jn2$A!w(>GHc@bPx1=}aM$$ +Mq_hZ556d9CM7O_+r9fDZrdG5lhGpOy{nO5732>#gUsvWthfW+OLcpKigPCnapIux>eMEaOAiZYYFto}^jxGlz(@&bsu}!{#S~YvVR0#a&`yd +5qmMDR6}L2LT2i|SgzBR|gWOR+-(>V^E@e7}mlTjM7aRlC4ZSZ>rRBOsY5kE*(P%85eyPJJNAIyqu0D +K}rZR-+`^J9^eh>OO**``MsMd)W`;MQx05@D28;B&YO2kM|l93%v%|UeGVAHYviz7d5t$2wRU*b03^W +I{U5kQr~;*8xLOdfD!`1Q3>)|A#~)xJ=jjJebeDj&E}gJ+cFr+hpW@ZmT`r=eX*Tjf%qYSGK{1u>1&+ +I3HH#>Hi)jw;-Td})(^(BB~P8|Qh;$uYJi{mZ~VtY<`<(Zql8`u5v*OZ;oUOE+Z8`xmGGpZ`y>_@7l@ +|0@fApo7mB`yK|+5VX-Vn!q6vgJ1-LKXMI~S<;(9BMm&>bhB@AM1x9-K_*{S^peUvGQO-COln2CQMaXL>d;u`#gSZU=qOPsTetq=KD_LGM +Hn@=-9O)17i{>~F&}yB7|!XN +W~E5VjkSP9FlVXFGPTHZIA6ak1`Ec7+_%5h~HNHFg&@zdDX>3beT$9R7BuX&0rKRY$mPWbLbA)Gn#Y` +jW9rTzpljdq0U|P0jow{`!@(L4axrJ3)h0OPw|6D`~Ujb-TVD!*^JB+8?(3^NxXky5*mD4E*ga%QE-b +dG|#rGQw@EF~eis+vCepp!1JC(}rtpSaZV>q}d3qz9SUWx(-ZrG^V+sZ;mM +}>9HT6W!j>W=vt-NKB7@@5+ciQMI+PC;Z&Wum(mw5TLMCgJ^2m`6Oii&Pj_jDD`c(h<={Wxbx>Zf&adQ6seJ<;5P-)iqMuu0hDIMUc%4XC!1U +JkD#J5u4Z!2+WUQD0O^Y`uFj7&ozDIkA(N8i{~GKGgO_Mow99on40YMHm76Q8W+)lO|DQlwKYcY@Rw= +ATNq;;39#{{Bxq}#jK`AGf>EzE;`v{hg(5l(z9wWz?u!JL8R5CFX%K%LM>qPYVFwANYyj$qvuY}rDyH +L1=|EFrM=?AO`57lJt}I1ig!RkAv05AOBMXYgiW7E(o+|ei>!(qd4dd-k~wg0NhpD`dZa7=Bwu;6FVK +dcMKR%kQk0TWSq%kWNuFkU(s&|ca>bpr#99Nv9xcOIveFCnmY%4-`Mg)7C=`{+drJPjz!SA>xD1rY +Bp;*$SdP}&;a~4f%!>e%Pw=XJ#3gxngJa(w>PC_`DO4|51BmsHV6q^+G2xACOY>so{2gs*h0M$+c(LWSvIN50l5P<(!F2v#b(H4?n(1^3JLIjAelgEpvBFW#D{8ge +^EVi(<}Y8eB#yeLu(UZ&->CL*qkdd)x)YeQ76GI5(Bd}8AGP1@b_tN={^Z +GeDPBaI`>EV2po_>Imv3Sq}5gc9_u(1nbe1r<^u8H@!%>_s%Ssk3MvYn(AWEKKy#%xYtnwy=WL!PQ%B0&_y<4BfsAO3Ofas?} +3fz?%;L)K^1>el>ofMleLgI`Z9yoYIboA);DQXzu9NZJ!I^GVJajoF6e_R3Az=U;8Q|Xb{gSXbQ*uM@ +!uE(dG>zC@K)V&0vsNt7FvC1Bk)&b883iPr}bDH}HU{M_y-618Cm)caux;3m_m`|t;b9`i@6$DIovLD +s5yyBwvq+^pg4l0D?#gX!ho@^&mOu#O6?-P?cq^KIUmzF;l==C;9Xb4ex7rmf=;-71p%KwSl`rkXj8s +_duvu9Aaw(r{h{rJzK{Qt>9-_-g4<|5w%HHso}0)r5G?`}n52*N(i;84V#xPg(q&1kpjgZFGm@ctFOR +WHJ5Pekv{qwofdJ_TwaxqA<8Xles>@!NKG16L%u>tVpy9~AWNJ`HyG7sh`CZykN?Z66qhziMN}cR;tn +GMw0JXbJR3nCu8Ld5a`R@Lm$!fEV;$bi--^wP$L!>%070yhA!XeGAP6J09G7kJ3HmzU>1IxA*&7poZ> +UN7OefLOEHM5Sjx%HXi}d#r_h(?&xZiUmSA< +?7kzT&)@Xo5mygn5A&u{9Fmmvau>rnd8CI&utKV?lD`k2Y~CUv7ksuiuerQ%-%-Gpz~fcM3cr9R31>n +bySNj@>t(GeZYbJbbkzhtLbCQ?}_e*rrv+qe8@HmluD1@>$OAEKve`~QnGPbthQM}5h1Y^S6RYpPOfF +CaAkrVH-zWL-a*W&(cM9Cf*0&_M0e=yg56wt$G;YJ9=Mu}O36aC>$7N|+U50P``Hf;mS6G+Yk;_N?oH +J9e1j58ACdVQz-Gx-%Y@<3;<-nn$sz ++&f%Z3}B6BO30#OtRSym0M2 +Q?*^wNf4p(G&|}+acXgmm5*DEz#OHtsakrK{5l43cyKQm~(q%L;ngcI)BQx&q-4ehm^AA`Yd~jaAJl- +_0qXmv05Iwct;77bBf4U{pmUpV4GNUMyVhw%7#%~BUVEfKY>qn16uZK!v{XSPX|9f_E;X#gvq^%%tIb +j)tw%fS3v>3a|_Xztreyx95_4Z3a4AB({pLo;^u&EufJZ(P*Cvv^e@~?rSe9;BSYiO&E=rqYXDTcxkf +?jP#R4x5I%8O)`YpQkpE%PsWYAV?!tq^C1EwE_@V#3L?@+bCkDk;pK32)HmywL*8FtpgdhYl?|Aq25skmQqXQk+m&kGJ9pG&rs4zN->1icpU21Z&um%0H +d4v#20gfjJatec<@n^Kq60*oHlNOLdxr~MeNf?mGW_<<>|^jK5c1hg3@@(@151-^qNDs*QBq-0L{zOk6gx#$w#f8VAbc^{p0*x{a?eXOV8TWG6G>6mn%Hc(nk5OG +xSm=M~S|ZuoIQ8t9baV#+<^j^!xJDi9%jUE1_+zFdQeld- +4=Byu|v*5unbGL)HnfE*zcTe;+ErLDWfbu5d!C-VMZhK9Rh*?$EZ{%WCr1P!-Eet?D;jgtsU!6-tL2u +xterxQ*a@Y=l}u)QgPO!wYxD&41(Hi);k9i)4?3?_HeCN%hi`i1%qx}z^L+Sfqd4$?UG9`6qK9ip*>9g01J0i2>d6oa7Tr}e*z1 +4R0wB?Ho +|5;&i{zGg0QK$|-sgnI=)*Yn)}DQdJeb;=3|H`k1UmSwmp8YQtskwLM53hfA;?O%D>tB0>jJ2{bWQA( +mdqIr9(G{pOJB^YGv<8Nekq3%)c7BD7N7zJ))|8YxEZsuRB20)%1Q{q?FkO%mj!)IRbzz|U15=}XVZ# +^<*WOv~8WQ#?j1-)L9MDzmc*g10*qU2{T(-XApJugRWYiJu)B0=^ra$X~pWyCooW1Wn2U?(zD>)A<_A +N73ljNWQYgNRm7bmKuvUIDdV{QArAqOr9iiAvjQ;PM0SYdaT2BcM!-JXvJ?qIS@M8#W$s#?n76>AogM +;PRyTBGk0NiNby@&{o~*)IKOAy2J*K<^nbA2&w={yE%kl4CJ>B55E7#?6i2q-Q2f)r+2lP~gTi~0D;( +^NX38yv6bq+O^W@a4(af$gUcaVtee|>n-u#oVyYGjmB>)ZGjzm5B +bo)3fIU-yDafeC~Ri{^%h0j0(kOesEF9(Hu)AAA>h5zvh93VxlDGhj-)&1kKdJ@o!cjSOYn9C(C}W3! +K2?Yd1CLypudTw$xiQet7THj9*I{>(By6mxQ3siGTqbmJ +}-Bz?YYZ(xg0IspTKs7k(+pZ2^gyMeSD+=$xL7Oak#$VSFaO?OQxYL)Oo@U?ZEDQr*tW}do7Xa4*7^F +I%bab#V;n1CC(*ldIk{q=_3!LOO-v9Mc{K=X~$xCp*-FeI0^>Ze9@>oWCe?4OzKonkE2L$VZTwkT)Rd +L5Ym3mvC?DgON0ou47U-SJW;kkRPIfCX*tqhMeCUilpOqALwYHuHO@R{6zV>@P +dvHW)nPam~a!x+ZoXqCV}zd$uzgTR&}7uZjKqYZGjcmP+lYCY&c;bMUY1L&US_7lngYh`ZP|NEv2EEj +hEMGbDqSq?$aCro4*%FE>wo{xyDCFV$qt_gKQEYt77HHSmkPU%|P6y%s_6A3MwE?_bsQW +#+lQ#5*{iJT#{x;SDfn&xR#L8aDjNH?mNH1oJP;#Ua~vynfuOl;U%dbmGr6(H${*x-#zkjX31W&G5cM +4%*xjJ`aQI-$COsfok_ic^;JU<{pjIWv)^`NH# +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 +GILKCj!M~8F?#%(r +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 +wH|+91l1EMAKI3}cCiyOyYtSwwo +l=c)tr-@9b9{bb7*GiU6P;Uj~HYum>EQYUYA|Hg5<90Yp4_ZwxHZw5>UJ+LUx|uDZG|M=@H7@n13yng<-pN_PaIk1{JV7G;5%@-jkSEM!{7 +-+)@^i?yGTFg6u+~vT&^Lm#O@IRiAQcbEI2@f5guE-^wk33iFqs9!ouV1Ptl#|BlodF#h2)Iv7=zedvt~WQ+Y}z9B5|?)FY*ST+ +zWiWS-5^UxY8;=O#1bkgX?<)^#=#nLVG*7Mr->56m&OnjYjX!s5APF{PJ7}de1P4&Z?~J^Gn+aCHN(K +S2-|K0;bQ4ss%p0U_JCSe6fQ45)+i#UlioeucJMbiQ0BuTf%Ku?Y@ZT^*|sQP{g;d?dB!q@cVa>={;@ +rZx(rTU*I$OhDs?C>%f=QH7jrmZm($+Ik7`Ay8P7JDh~MUWt*~Mwx|LS;WNJU&*%~g?O`-5$GBWtp9z +^9PW`)gQkOF4P1D`j?NtK1yMqU$8~4pD&lgKHL_l&D34@#D`V_;5MASu$TqN~AWg|p3D#{Q>lLgO=i> +;)m*K2z|Nejz#7cJ4UQzj7r#EL3t93SL^q9=Ic$1t@f)*?P6?Rb}`?Ae^wl3JqB}#go4B1T4+qUfG_iDMUvEQ9y~hR6B9SJZqzEMZ +p0@KmS~S1R&dp1(9<)%$lw)|{je8+^aaWf7h)R#Fko}liU(I2;!$5YK?^oQav3Y*I9*};nb^lCNV4nI +jv7J0sN+u2$U(t7=xaJf +U}>~=ccsnQI*XEma$N}zx?rS$1pd%0;HZl=oDBN8`3d3VcFhhbR@Y55R_!ZCmvz37f&bg&TRz_k$?>3 +*=}z=ko+z{R(Z_9{tb)MUg>ohRjfRN)g7vg>d_#XH}=S25B_B(QNGKr +XGJpnODXE&nZ!E`{rarSS^f#X{uh?}0JEPg^#h(oaTdgh3O3rZ>Si;J{<+7qrE$LZyF)@bY1l +Jj0nhmR+oPF+lIuRH{272yVBR^y~DvirLjvVqi1v(J^q#vQ@f}SDZ!5s`ozRQYeLiG+h)VvTqF> +3fLwmDIkiOk-h`o$U2k(aDcvn!x@g1LTuR*^x;5U>VeX+)U-weGm@3sO#>@GUgyT3T1_FwV4-IySM>r +ML}>1dV@0DD$b_wHr$aMRHn@_9P2`N+QkUlVXA>$^rz|d^^~YiWXMgfck#A-Bn|n#BWU}+Mf&lY54J +!h3K35IPiDm$M4Wc61U(?c5nz=rUkJ>GJ#1liq{oL5e*9zOH-O74C6yK-=XfM_^l`RsO)z)&FR;;-$0 +h%AMUWPbk1FDeHA*#&`pyZ9iUnfnsHz6jk{ytd+;K$aHJxyGch=IsZx(#R~`e*A5!-bT@KH67RXA)bu +|wy8DbtlOzN)-BMhOA_=^1Ut-AJxS8}sdO%!@NO;N-0u)CHRL4&TK#yq-lQlNhz;cbwq9^1nhTIj0 +;S^l*JNXLZR(X}(+~QV6MEf|VBDvp|`+~oK&r)F^NNIUTOc;%HV=8Q?6a^kGEP9^Xzs!#S|3rTLoBH^ +%IZ*8i=O{b_mq1TN_+=ok(rUy3dHG}KC9mXI%+SRr>p1S+@sUv1JZ&z%)Z;E1U%GW(@$(Q0r3y@ida +yAE{8$cXwImNOzBtqaRQuv!)u=%>efp#XnK%#)<4FLKKFd4CGSA2#xKe1>Y)MyAEj5p2%iAhw=*TJqK;DgLxIJ)#zM0EkNI4@K2ZN58LBCA}kI2V^=KqOF?Lr&+H==Q>1 +?xL&h%rj7E1hKLpliu5ZeEjVbhuk?Fg0@@>F`zfX;X+RI!awVQts@ANe@;+3fcl!{!i(78z(sr)m)LU$l+70 +2*bQd}b!|k~IRSzbyAAHHXqY0w+BX5`2h8G;KcuzrR-gxczSXAMPI+mGRtOmpIxtvoM{Ea +T+8mdV2Yu@=ZiiMPqbk2Gt-n+YT8J;m^K95Tx%F7FTyEy>A_-Dz$5F(k^K-J3n48WUOgYrcv<6!P}nC +Y$|Nnq9(K7*76i|W38b%}@+bv%F>JI5!4t1?uVxRG(x +`J{5fa;1;2lPz<_U`uu1DSuvPD^k*}AQuakV0Zl=SMnHRRjku^b{W0UKWgJ(<6G!cEweSBj9&Q4!Cv3 +-W6IjTeHX-uiPFVcjab2wLLLPwu?Fq84 +#K=3w1$&1sd_~DWLU>PAZ;WIMfm=9*eib2i$zWn%B?$I +R{1yPWfEyrt&t&*+>!jXhdD}w7J3?+dC(^g+=UcmY3-#NhIJUnY_HG^60(bJ}3k0-Ln%|OzXdg7Jz6} +~G%$d9}N-wOdf?dhK_;A0o+)nw4Vcnmzf`i4?&hzWQ;njrh^O0xFZ$pNNqs2F)jcOqS%o|?*J#?+kU* +&%=m6tdCzx}!H>GCh0dh7QWcTYX%XUnNy>=5|f7Js)x;D;^#1N)&B95)0i`T!fP-kCd|DO81Q&$tPfT +V^eji5*(2F4F6IsBp0{QpvsJhvN&2WHP%~3W{?s?#LG(km8GcYwd$OBnS&);G_~kPt3P#(c&kUzr9F@ +)E>w{HDaI}H%(Ej +#>ybL2yL& +_o+doXKd-tK46J&DI8FCKsu+W#f{A@y{2Uacd$L)(r`C8aM+iLQ8cKdSl?4YN3TM~@f#Grh%rs^&ly8 +FY#S4tL!(t+OxWPKeGzcOae?sJz&O0f*+OzZ?>7OCIjj16Q`3R_ch+$anJzyOQD*9R}PV+C?Y@L>qUF +7hY%)=5ivCY>*$Y)^uhYLJiF^jW_06#a%6&X$8VsdS%FY&hACPyIPfL86ZSiGJQQTkFh44Be{CZ^J2l +gedsH){=d|{*OsHm)-`(1Q|x=4?-$;DWBeC*BaE;T+~I{02!Vuo`U6yDbyarN?&{wAT%6I>IWkcYBGR +mwGuB#j`Xe>6I7t_8XX3f4$m2 +v0suz;*8eK?udbpLSTSh!{h52W4cpbWXP%EwnWU{BMG6JJ`B!K*S#Yv2_pnxqAJ6CWY?qs?_c@v`$GR ++ga6S>l*C>BiZ(E%dTQu_x*MhwQeN%uWW|m?R;!&zK^yWAaYN{l3U7lePC#JrOtL;5@HiN-RuR|U2-J +^_>S&FY}-kZ{V;7Eyxs+-+qMSoc7)Mi+6=L$ZSRW2Z|FWnL^!WQlyBy^`!l)^Kco9i$CoFb0qzgb*P-Uw9@|6Et_&6E{DMHhZDAsb!ZNctjC&orD? +Pz_7@=)vQM4tjk?cA33D};K-3}wp5RdIzE$l1hoXo2%KRccXV0WrMwtryL@uZzft@vwM|~F|NraU_QM +Y@_dmSyDd_$FT_1t&7kB*7Sc*dgxYhfTBt<|7iD4uOlh9VQg2NO+At*r-2tq(G34`QM;~xZVaGTnVH3 +(z_${@T+A7{yS2(gt0lN(%)cb({<$m@WJNXC1kEWG$YqljzE-dpUpn)rcx8+}2|C$)|6R4p`kUzGc7RXoyJ(F05%2YVdGLNy?uyjbxAnux$M!n#!vOZXbwiGImYpueEg#WCs3q-18DpP+Ddsq15ObM{UNC?py+e<~vBsTCf +N5ilfkRe0+6sYn2M$95a!{vyRoM-^4=xLt^Q}10UQzG}dwHRE8Sq*rKB!=SHU!N>3j!qW9znh(YG|i~ +E$&!tE0oJm^UJ-9JrAzb}-n2lOU^)Wd-DO-jDnFjooD5BYy*1clj4N?|dAN1IKE@$1&6Q&f2WJ2xJv}NpZ?!l7Vc +&a@d2l^Xo!|rffWdMZNZlWhl=p~}5vlW{oQroAI`3m#TqeB@B49$OX92m9-MhK(z^@tNZY3n}5j#q{+3@K~nxM{)^wBDuU^-j+A&>{T7bh21DAq&$c +vAT=%Jo`#Zn#okIhV9QBeoe&OWRdN~WLB~g`TRs^+rpJ6@9`rYs1#9E_XLklZ%Z_~6P=C7neo`1QuT2 +c5KtcJ~3E`ZpZs#xNFw*BmSZDr$zX=$kOYQq&*uw}yi`%Ms*3%q0UHB3BWqGm?c_~cXaS +aMRMvr(tVXBP>_F&_x2oQ`yCb}nsb>-e;?)gfjC&lOE1&13CF@i2R*8|1BF1F<(V*XO^svo|rk)6TZW +!VbQ9#@N2)<2>nf@p6=dG-O0^64S!3AIIJT)ouEOqQ+XH145N8Qz_cYoHS0oANE=`ULU-f49ngcy|>O +^gSv$OJ+_-(7E8?>z0T|388MNfQ31@aL4w2U~DW`^~4FgE1ESGAZk|>atci;7m6&(f~X%#!7f?qz((_ ++$+s(G-*IDt(%Y*UIfb +5+{b+Q}p=#Dh+o{SOFqZNN2j)mMC;q*a%F#zLp2tfVXwva12t@QMyh}I2Pwzw*ZgWdgWIzL6XzM;_`} +J=DzsJxO^BgToEsKuvS4A|V?hr2wr%m~i>P|a8F)?X#=RBVXn~@VYXF<9_Z{iJ)0VQ*mvxlbOZNd5(h +S%5}Pkn!Lo*Z&_WB(TO&sTkUF|Vh|5Ng~}EL%5M1FX5jJ0!@D?fgEZ0VAvXAj(o^Y3- +VDPr7US(h*oB~82t+#hf7x3Qj9#Lu>Gv*A0w`As@A{Z2R&1|ed_a(|5fwWjBPYt9dx__yZ!p=%7mNrV +Ddj*KD%1>!J)g9J|DI0B+~1&$=WVdrntU^MRN==TevPomwI|0ROC%?vMJ{>SB(cAw9h4^9ualL1XS*^yg~n?vLu1oV>DTC;pl +ftEN5wRcfPNn$VY=m^|vser;>q2QTH9$Nv7Qfq(MY-#<0*Pab=F>W@?y@bg@l+CYA#+Dw(*gxB|Z=YnvfIl3zez540XRMxMLDmjNc<6KMda|Eq^TrLjv +#q^)GC98@a~S~yliz2iKmVqUdP{RmO_z*MR!GO4>+Jf%@>AU7|tr?t=#RF9GG%bqpa@AhZ`bZ?M +grYx88xsqG>EsAp`TEM+1KbKh?)|vfx?O2ZXr=n#mZHl5#Vav`UY>^Kj=z|;U_gQlA@d@i$>)$J8pp$ +T2l*S8=YNE_-P_{79ESh1IsY7ne`CHMNIXap7)lT;g@vb?&qv_B6I*{$O@Jkp+qTSpa+4M!WiTBXA*=9i7iNH#~*I>9Z_%PiaGJ +j=}z9}>BqRZQxMqAcz4azG`U-yR1$^+Vt1=ayDym4_1**>ldNu#|UBKvrnJubt0b>PbBNo+frSf4co| +B}0RTah02%_7~D2IITgGn}J#o^WYI4wh4sUfSTR}csiPK&HYtFxMT@}2uMiPQ$Q8w(b9HW&FNyUPTr`+5t-JZ#-aCxf=Q +1W*|5C(ldQ;p+}cHJS+u_@Xb&8|le&2xRe*|SPO@_l&qm{fy_m!gy~i*b8X+!zQs?oEJAu3v`=!-}!i +ANtMd4_<7xPbgcO+c~m|G?O|dwPd4u#7~bWboER+<@gFkzz;23Q)^u2sW-RWoO#hSetw;yM@OCdeCVx +-vLWeYQG%=>N^(2AJu405Ab{WQgT;XhF8hHO+YMY`5aT^-&3ed>64VadaPUOK^f*Q5DY!ZhJ(Rwb<_KLQEgP +?H6+c|lT+xMrS889ym(?YM$kb)BB|hw!Z{UOuP(!2~W?j!kqfj^T9VN|1hhE +rI-*q}aD!-tQ__fL}?9vGEXOXgJ3*8IDU+j(YQW6NBCt+7F6i!1t13KhY)rLc>q<`&=U|AB0NTottV1 +uR@eNZ5ObBy0Tay_X34%b6o9EoO$+6SX{jht4%^Y)5>5k-c@&(dhn}R<-CDZEBlyF?3siN7RWXIZ1l; +CcaC>-3a#6D7;X{?CMQ^VkT?cWX?7EBdxZkGr&&81g}m6;cvk4vqqG2bue^Ka9}iwwbO%9nb7xM2<%KQ*4zNQan}Igo-sX&>7x*c#!V_B<$8J8aF^uQ)08OKHB +v_}42&{e->K@WKy=WA(%L0~0Vfo*g9xTla>j}C8?@FRPZS@KOX?O1B0q0${rXzCLE(`&^FpE}&ZsWkl +`-XJ`Ys{B<2{~V(|BcZjDfE+rQl~uEuU6}*;71$Re@8Hy#6H)aI*4T7oWQDq8%}(>ThCii54(D>SIYZ +m!RZx(_$snTrOisf_Lpv<;ULfD2XAt2`^7q<`}rQR+5+sPA2}%?kqIAoofYAo0)_JLD`?qpxINmh!Qglz0P+yyTL3~GYyKemY*jwS +%UirFFa%wAh#dctr?lSV5d*)xNue0U`&eCtT=o;-=GBHb34OKd2ny1gM0-D5sGE=K=-gg3U5=YE?VwLRt2aff7KXwAK;s#;Z=fb3+}LDDahbV&~V~OD(U#6&sMm&gNr=2_P6(jf` +D&{l# +_7cp8s5NEqz6l3rylZGz=3g!1co=EdHHZLPc<%qj3-N7VLl_sX@_TOJlMN0P_6d7h-Pw-fXh4)Q-+c0 +(0x_g{zW0s&x(dtRt$Wnwk`3ND}&*aN$Gidl7u)1-21)I>v#4~YTMt&0zVo2BUR3IWu*fmUGVhaWeJ2 +nJa&n0x5~jGy>5XrDq|V#PF!NXv-GhLDy2uKoRv*ZeMF{xc%=}oQHScdEV@sSXlqY3}MF01j +yuYrma!HvaGSsx6E9zgBK(xc@g^ndSbaWf;yDtVH8D)* +b(+r-EBi3bgfhZJl4cc;?FID0Dl2Tj?OaTl$d17H+8Z<1bVXb{$L#*+OOdMXZ3_4(Fm>X8_%s&{AqIi +b?jGon))cNjGz#Uxd8%eK+T!bjv8OH*apfE7c{po-lY99nO&5qY~co$4Izc&*I%8Xs3pY +lFs*cM<7tAfSRk4MZbhBFyp>Y +C`Sa&OPEijR@16RH-h@LYmgMay$)Ufc;FviD2Y!(*94{X^+*K12%aZ0;gG7!^2c?8}y*A4mMQRw+gy; +L`h;t`R@s48(US9pkMO~%X-gm2ynb7A)^xoTaKqyQd>m}8y+@RA2qzGqb!G413mRU|w_j6|fv>&O%Qi +wZltKgMJ0rU!dq@6T?zgpT3xtmfaB^X&mN2RkO&#<`vwQ7A5{OltY)famjaqx&C1; +4Jg6f=^U4xff%7KtwMFG-wUWwR`Fa2} +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 +Vn&o`R6^;z_+Gp@f~tk7h*XY%+Mdu&N!%U5 +1MxXwa!nVB5w-vDG=eJd=(P@R~ec3b-&Q^ae;BIJ+spyhM06I8bElWAHXYKH`Dm)$#&{Z^!e_}jXQOr +Z0OcfXjcj4DbA$&VQRp4fxP_Gx+aAJ +W4L2o$~PTGajbc--`0MO>yB+DG-M3C`Ixt76lT{?U3fk +OFCTL9uJun>;{8M@4-iaMLpE|K2c~VNc`Z&UrT#WH5&zAW$NP@LtdHVVkjAnY42sn_Uf2o(IUz#J2+S +fX1j;#&T3k0|L!`Jsind1A92K?J2TPGh4&P8=@Ke1iDUYoVW#dN0*HL?0^emU5h?XRTztNA4ZeLMy0d +Aj0Mp5xAp>F|PURg~@63GHreD`ks}XKWBaFC7QbE={Ahot5@*UV5TssgOQ)#_|jv| +G=!G|0YiL3rZpKBn#XQ}O-WAJjgAMxVO@Pp-4LAU^w_e_otW;vbv(RyA_ES*X5RaJsP1M6d`QOxaxCN +y=aE^rvekHdU63O%yx_M&Y{8ym`BWHPF2V7 +V1Z&5e;nzyjfCX5%Jzn{;@G4Y*8pjPi3w>(f*rwPw%&LDdku<-?8}0gn=+^w_Di-I7Xr=N*T}u$l^(n +;Vv!ncqj}(+hsYz1!OiSsDFiIN^#eieLh_2d=>OD*6#A7K->@(7MI=1!A&d^N%@Jki}%71h6Yb~tv|9 +Z;!X<>o(M2`&@)*aj(od3sl*j8Z6(4>qSEq&&n*C^{h>KeiP&nd6ZwKj&`yjlzWPB}#ECxEH%}kHX(4 +WPJbC@W%Mhj_a% +nDc^%S$?y@=m<}t-$b6Ga43QJg~adIB6$aYlqKl`O&r5RE>p4(4&$Y1Ssu8HsYaV?0_T(&{p?M3s0i> +e;NwZW0|(Weu(t)xQSIEXo+Q_;E5r#Z5@CXy3o0Vfbn~6GOs~Ru&YTE_<`$M1&go6>4(QONGU9Yq6!c)FkM7lBkHewA0+^g4al+mpB=#U +)y^?Qjx_fYhSix{Uw4!{xiEXj|;EqvpfBD^w5Pk2=7Zf}Q=;34l$qf$6*c3}AM1-@Ec;X!?%f)+$u#- +pWKs})Nl?s@fCbX^Xu>inqO0683AuNt7P*R;rz`L{73&Hl@x<=|g}t~vi>vD&|Ee%*vP!{Y7rQ_ +-~ydqrvAUNzj!+bQioA-;b;%Ll&ujTwGylZG%9UfKGJ=nxEnHccG@CO2zxf`mW}gVz7RpEu}H+hHmd? +B51F#+|_{BCy9vtVz!;!Lc5SY7;a#WOtw$Ly%BGPbQrl6Q{uapX0!_kM|B#&qvv+Fx_Jz+XTUhE7x%Q)mMpe^*X+Li)Q +5`Anf&v){R?t>lNb(?hIL4na_H;@+-cbRF3XG3a4dI*!qwe+iUZW$yfTi(kalhy{hI{e7H`)IF_4uZb +doY)W{rp16-K4#ES-f6(jq44fuL-Ou0{vR+}1`^My3-j#hkNIG#DUm9A?hI&xoNp9*lax1r2BUU*+){ +Es^D^HvAGPBOTTjB2GnYMgb_>~TEhAE;GlHYs7ibn8(5ZgyGF1-A|qi>K^$f^B({=P76R7pi4{Fz|DT +d(c^)yLYBn4_i*{E7tQka{g`CJF(hFpM%V9OGA%gOG0CYgq4os0_mx$HxKZF=O|Ji@4G{1xkxGl0dRRe=ALL|pG|dbCjHh +D*-ZACRs$~_eiT>98yz<|d_B1seyh0p$>` +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 +E_LOFcsgEKVV-`MC +I92zm~rfl0iO*q{&s^cM$<+HoY~DEeOr;5=Zn7V_=aatOkcc$?37a-z`0$xN##GU@n*Pdg8{+XvJ|49 +779;m(3`_bK=_Rs7_Bp!M#h~0;@u&9a#&`?CO5?9gPIL{AY(_dYZzojmdAsFp!2raO_X(I3 +mwWs#VX +%8#0(fDvjL<$#MODr6eckExp$!8DOO~dD-L2(%}^7k?#&Edq>l5dfNk#m(fO7Jc7V}D +HJ#>lvFEPAkqYW((lMp1hsuBZdRaQxS62__*uTTYP-sMnT#9B0VYY!DCgWy@8P-yh3SB9O^gRk6D(ahfs6vxVR;4=*gZ#Myl>DFPJa`8lZ-A%782zyA +<v0iY)lHs-@-M8&4Fv92|H*t0P_b08V?gOyC2X9r;WyL>?4>C)d;)jmR2d +(kVjsRbe?$%Gm&*Rnq3)lNLQ~lGmexT*heh0xI{E!45K##;w3V~<>MhFbw56}cg!TT3S!YPE1zij$Yp +N>gNA7jfqYC?&_4PqzlJJ3q0qZ3q8hsYWIK&kZC<`!9bc+Qd^lQO70p1w2a{R{e&@qA3Wm4|c>OAljM +1o}+sVTbPftET%;AP^}IObJ7Wbn&n^%RY<2KG9kDVeNJ#H`AXkRd$SU6U6ZXJ9bS!aV+~Q5y`>ocYFv +Xhaz(4>WAhLIr{Jz{FfkbIGR5AH-7H%i{@i@R=?j9QE2mg)FyIhhZD%^zYaK!ej2OudF&W!gTIQGwY$ +*80ba)rdx=8(nIiZ#6}?Zd2lxdt5>nBxb7==WZL{XV_kC+!=Y<^@HDBhBzxUz(*3>b$gL_x7v3bZBpl +AJftlro7Q%H*E);y|n-dFkfWCeMXwniiK_?K0+!muy@=ibd{P8pDSf7nqWl(qDfgaRD9e5|wC*AY9*m +;C9=1hn<9%p~BqSJLl=1A;4svOO`CT*?W-Z-nQ +Qjg@^`1)Gm04rq5&|+BC)uCNd0=f@ozvcjmg>q*ztnD;!RO3+i0K6$-T4 +Ft(^@uD8=oJR{5n80DpPPp7|s!`gtOSDdAcL0jEBfBL7XYB54#=sgOHn$O_V7)7&3R-R-&Slx!&+=`k +QaLc3AQ@ZB5D8Pu_prA}xWcN=vF>F6=oYageJXMj1ASG7c`*}?=$vA>@gM&d34(A+@H%2bV)UGD5Sib +Q%Qk~gTm-ke5cvlYK{rb(hrlGC0lGE3ibFaH+!j+9=T&I4XlLZOi`vGiC)Gdb`gnIwz^RqOOLdnJ|W{ +JxH0_UO>aA^S7bNLc)$M0>Jv^%fyO5mBZ4yywG%(z)vfzI~JdW5#;Ec$A_bLJ +r;XK#X`N`uB=s&`u)KVu)xCertNxSN=4PkpE6k8?fFuguNHb^{F?9{ +`}1_U<3M&f?d~l=+XrByd&^DOASKIwDcmI^*LQrnIc;g+M)@t_`AgUU2$8_i(~CP2IoPCEOX{TVwH2v +He(%MFy(a;92E?TR7{H#77?m;i;X)z0EA)m`NdcR?Lz=!b4#8W9b=Yl4zC!7Y=?5$7#q7M7#na<7fT8TH4kH@@?CIVkqcI$v#Xd-fXD;qYHd8{WpMt +23g95UH +wYD!DWjbyV}U4#R1-mMUG-QZnM{GsN4#ExD;!ao{2_9jd}J2I3RZ1SuY#{Aly>f<-1;)lV)0!HkF_&y +xj-U)Q{g)`bAxO5&fynv;Z` +9*I2C{V2RZf3PP&+XxSI1_BHa;dg1|@We9<&Tcgz04WJzAM`xi-<|HCeZB6(%kf5_c1-p1(wZo_`o&t +dleyO;i!c>nv$evb-Cf`UovGmA&TC{Cj!L|{8iM2H4hzbd30JN&#McnH{j09B6Y4?DEm8JND`1&nJf`s49+6yV4HRs&>+f6ZFsA@j +|Yq4qPE{13v)-Undf@A_H(3aV0v7aYesL_oIgy;;YDj_tUw=*l?~4CM8TV)EGElh=#OFNW)FmoJJ*`1 +APo<(L6KmXzD!><@Y+SpEsdUYk^0cU;)iGB4CoU^i*7e=Q1Ad}f_EG#VfZl{z`IO4=Dv658+wJa+nlP +*;UxZeL-n2whq4-W(|io-63z!u7t7m3iy`iH=8}&p1IhK)d)|Gu#bD>nyHyscn+);`z;&Xl}ok9mBn@ +1sUx3ES$V6RvX5YAT7hm7V7wBx)l##zIX-a`U;JAIw++`PNaQuw30YobLeY=Ybh(H1Q^@d2A{y$PjhGHR(@X +j4@AX)8!1)Ybd-Ys~euTNY +WVM62Bj};tVm0<(etpTnR8C;%r9~938pWj-T_kqwWTp0$M=Y)N_W#b}G^}(2JSXRF%11Wagf7$^8P#% +e^!(o&s5O3tp5B*)r*K@)Kk4uPg$X$+MwIO9hM5Be!JL?ww%ynHb<53_sMNb0zHbHgC+r%9*MwN_Y1? +gxlYp@9}c!S%49BZ*q+SwdVA}dy-h|%85sy=c2Yr>7D~CkmJY?UiVqU42&urD0yExQX-72Ge$kY6ENz +skEq3YGcYRA*Msn+K0sOS+iMb|be~evMVr#6wW$xox-zfE#Zt`UeTSdVc3~>Cv~#^T| +C0k-vfTx;A5V$OvKewkyZWFy8-2g#LYKmTbq7{eZU`L-{0as^U3Z%4g4lJep@V?U(1uy<>lyB<=h#J2 +ZS(g&A~0WtCq(n&qr$A;fu#8$ZRPZ=QIV}@{ZGnxn4=q{)VLnEc4E3-PJJTZ6FGic#QD6FFtdoa$pWJ ++##X`zqjmBV%v(Emb)B{P3e1T{}L|3OYsAvNnSV;=xb6Z!2bJu&c1H0CYZe^<3!!x^7WpJ;;b`tbhaP +k%2`h*l}*mxQthP)=GjB9s=GLz7565fY#NJu_jm@S_wtw?=lZ^?noUP_G`Pi5>STP%5%}bp=aL&UyQZ +jUE%Xk&r866&Ca`U#07-LlA(`OHEX18oP69ocW`)HC(@DLhyyg3h8fZe~nIkapvxZXvW-}F^V`l_vc4 +y1DLDNIH^_^?7a^STL2VrxkDq;X)qB_6zkQj!x@b7g}lt_?YgVO`UgH_WZ0Mu}a-b-e0ZoV#GALKAi@ +4)2q7cpGe`WiNy`Kli`ubAx{X>RJKOTJtZqb9or`E&tRl-aJ7823b8FQcQ$EJrX+*^(5mjW{cI?EP6A +>-^xK&m?xxeN`1mEZ|m2r0kG1keIiW>O)g^ubGg%+GgQ)SlTzwt?h}(22DYHT*lT5us7%~*A>sFozb| +?bH2Nd@8`?@Xv9F`FiulAj!_VV!xV{;7(`+ifj}^Z<2Z?;G(r3d_$9@$L55|Ac! +nU3T;%){3%^4_>f;SdqyHqa!=n~U|CvI+cDT(Bad`Hb+}&~Aj=yN+53kvyjr)nEqVhjd{tnG|aqI>{@ +INu?cX{>Y0oAhX0HxT+?J@gAE0@K`50N}z9`V_!+@G*t8vejn5Cg9mWphW&Jkxq;{c^#I~1$m|N?1Dj|g4@qhiH#k87U}%QpzpwZz<&w)zE~!HQ$7D0^c~IJRsRw +69mkf7{{{3Nm=E}$fW8Cs0sjr?`##$q_!sE=wb8;ip9QXx!IxMyqe8q?TDgoIgXua6sOoFYTDW2OLcW +^sL}{nqA)f=w^m2GD-+ok5y2e0QZAbpv^WN#cAW8RbI+yeI`vKs%lHT%o#YZ^|p{jT1Pbq))`d+HW`N +^_@!uVNVT*u$|EC9a>w|(3D-PG1jtli_8iiD+7dwB@dyP5)#=hFvhE$5hk +<#%NO-RdBwaJjim{4C4oaL=ON@xqqWG8c27!{48)`Tcy0aC^1M^Yti;;nN`b$5|Hs!4L?s6W5Qh@P|2 +?|G{;>&CUF`*Z862(&S!LNfeyMd?Gdn5Rd@#-r +3=HfA{o6rZ;D2(7@Lk=L7wfAZBG-Hy>G?X*1N>>E=f;XjsEkp_zEdRL?*d$4rn>%ZR>Ni&0n +qS&n?uP8VXXNh*;2+gq<_D!YpyC!jJKc9z%S;}Vb8ccnD|Ji&+6i6pl9 +Qv7U~_3A(o{BSu)UGh?y)+*Q~!iXWX6_r#&y4n|LY5n%XoTBPs7$(2NSZ_aw+&rIPLi4jPJ51T?WZpR2~66MSyhyl_)M6`0>=iwA}w+?=&iP_y=J00TFA=KhF=ij +zSQ{fF!PM4A@%v^+%VY)V-DUgvXluHbuy=gQ@vng( +ycNz#w*3#_`biOoh&v*@_2sB41yXnHR->ZlHRXu@Ssd)8PPlbKOD#R|DS +>5fwW?;jEFJm!XjTDU?7IeK2P{upknLe#FSy@<9U(AR1CLM_kHyM!|{yq8&9WS6x2UFDI7^<rbUO;8k+BU?pZJ@Ve90 +AwQeyI>-${&Btz=W8Tmke1UI`jNvBWml$$6G5Sb7dY$L1QRa--ydrUTdAwTkS{e_IP^=2SsWrr&tk7X +y;T(rZ-0>45M(t+LCjzg+l!0ZN+V^=|*+Y4KVC9F +OG8e(=oQkyZRhCM*i~L{>#QMQfCl9WBU#^FoX90?)}K@t5?>E^Hp#f)E_r6HfwfK5Q0Wn8sDPOEeEiP +LnOE}Ju|2L>@{Ebgr?wHYwEBM=a?Xc%<_Fq*`M+<+vGeuTCI2`-{;&VzkD&YS0p{O7>noi6(;45xL;{ +5l^J@~uAcV#V2qF-S#&;}<;qWmxa|~tED21RDzCVe^euW`-sCGDV!N;%(jvOFwM_d^CnV=~Sl{NkefP +p_un8JTONAodTJnSYuJ)J|FgM8FK#Bs?Z_3?3iLk4Yc;0@&M6b`TKuol(}q<&oy2HMWrJGi~|GLa0gOS13MXt5`G9zh+3n`13@ +W_qoGBFhywS7{>l)cgSU%?lS0(Eg?hr!|rfD27GsL`EOPOe7~H(T#XbhJQGQO{0xrUf&i!(&ogJ4iz< +eXeO7%vR=m0Iz=^532ca2Y(*#yn(#q35Pb+Gijd2^A5vHiq&N?*+n8E8+dH4hT@YAg0955emqd~hj5? +O8Gdb6rdI(2l)U&@nZq70(zFMZ0F=c{Ptx_B4y=$|0_a|{wRGKVRDU~Sd! +?uCHYisz^@1INdduD9O3*h5u?$45hom$NC*;k8nTzcBL(h2WA?zxsSI?y(67TZ$Fkd5ql}qAS&+VKP+kgc{%& +fO4%>U7)p`&k(YJUESf?wbT4A$Ue{<6qo_|nD@MWuMnfNyLh6@t!<0Hk>rnDD#P_im+-n2%;g|d8zW8 +_pe(@?ieDSkiyZB>=|0+QrrDv~(JMBDjQ1L@kckCKzn547Kc +-*yYD9ee`-$w6^MxNfm=tte2+EI^b^?F4GC!^p34OH1_v1Ss-+42QeT;%WWo&;{Vy}pQnc5=whehE=d +@Ezt$yj;%wgtAGj})PUZb+x(BGjJuYq_EIKPY8@P&3}w;=z3_9={kDF*beuGQr2dU&lp`W5BnAHOu|f +@aEk5yWIP$?k4_6r^qE@GetW=Pv6)8xRQO>YCh0e>#L)Kk$(h@`Y+XiKR14XKXraJ*e^xNomhyEs-Sw +cZ#2_vmbedGcxAx5@W^i4w8W2baMUOR +&c>Or7&K@soGIG*Tgim1Ra(xX#P`g;QhNcHCgLnLwGCv=?ntH3nh5TAhZ)G(erp0zAbh9jd$Yibs%>y +}Shvoi+@2M#)6xs?VJ7GC?0^4|S$&cp;PxCSmfN>bV4zP48Wu*tn3dmwUM_=S*pqCz7Az@iNAl@G?E| +VP*&$lF(gKUaRKf@#XattC!3r^#~|b=i%f9?=ksyKWDT$U8(!!M7bb(JKvlRZN2+bK>KCC6G3QhofwF +3aSLHWQ)Qc53+z=kJ5{#G!-4wtY-tjBT)dGFAnfRLfLjQWvF)l}EWqpgjd}Xj$y)WDUr(@|87 +D~y$NgTQ7I+gTpiS0Gc!r10T2SBm`O+@Bf1yh!&s(!)h +Un%{qHn_NT@&19oEb{Z=#MxM_}2OTk@9*`$JSIB@D_Z#Kz39OSu%*P4Y~a!4g|ib1OG$8pPKfLlN2LB +nZmN1oRCsZPbK$XUG1LmomrNBcc8{?ut|d%niYrP>~EYLJv}<)jO;xs75Ol@g9?dvO`@J(fAIIew&(6(bb-%A$(sj +f>7E#bXm(RqeSUl?1ntG7nD6#QqJ{c|KUBVew(m?PiY{f;nHh-IGWGlL)yZN2{k*(sM?h?Z)Amq4JnL +jbT)dv2-nTTo=Lv{+~`)t9jr81z?-M1)~P}FF6+KC=o9;><8B~(Bv|xH*x$Jr{kT)Qx&^m&Y&yR7mMx +4X;dP0-J8S~(4I&NRytWl)JjEoOMmclt%b-3ct@7wq?7KXaM)ItC4Cm$yhOVS9Q1jK_LB(8jz`(AdKL +~F^MQ$$)+MM)J-o~xXrM0@YC#gY)zu)+k9b5bYYeHlPL2@@1udW!sxMv*^NZ(qqJ2Rc0KVhi<{OqrI> +iaXlhf@@Z(T6OLrYVYqC>n;L!#N+?u@y}0e-J1E!@uT&=*R6IJH&W9yUnYlym%Oic+6s((Ds$x}S=FB8zsiNbd*9k0;p26+ii1An6XsNaWKpE{<+SLLJS79fa+ +abSHv1`5Dh3kH5m7;QJl&B_9{*qs3evT@mUtH@wrt{aZjk!T0D#r?;<$g#MBXiU$`=zL^wSR<7nysP$ +xDFpIMegmaR-KeubmU!~hW^>g+WvK;AcP#h{#99oBUR-K2R`P3bm_*)zZ?+B?Xz($oh51CbP8TT8Q;v +3hyXI~*qq}QLG!WZj%&iZ0j$bE?p1wIGeY(0$jkApf-{n%4zd{^H;J<3<>#P`u$wVSNPoBiT0@WtJ$f +ePneE!gDDN?A+88OQrag6ALLN_Tw2vA=Rdp?V+O5cruKe$NfJc=kK&%$=u2ab`VmYCPM}VnBB^!r72C +j!OWX;9e7q`IZG7KivbLkJ<}Sr6v7-1d{6DYv#Q%#;l}=99`r&wDU?$TC!!Nl4Kfz2IR3))8{kIX>d8 ++rQwpV@Vl)fjs^SQTJ~E1@*e_z<=Oj{NS3@ByhdDexS6=mx1!eR@kTUn1NXjhL*Qp}SfI_tZqEF2cO? +5d3YkeqZB9a9;yQj3Ra)o5XCP9HZgK%+=@N +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 +kh~9Y0+o +C8Ue?LHOg=y!8iVo1wnf8B&@UwfXmRY?> +|g|^j&TwTsCcrFPa+dIgPu|D1wDSfz*Q6K$P{u!SksAH}L`UnXU +=zwJy@w>qp?AXjoKFJ1$UYt5MqSDWB4wN5~D*`{9a_P_B)sCBXxU>Vkea$<{!|4MY?F&9)6VYQehg3c +Nq`M{`<@(=9bUoD65%B|7nq=)In^mJA5FP(nDD@4P0RI!5bO00J*T_WwTR7>1mHsC<=~xZ$*EmW4w-G +P^!&s%eT_pY8s*lJm-c)uCcu^smBv+wHSg)|IkSnM(!aF^wCET0p{(7GMm_`yMM4-OB*YXB}eJJLlYz +r(e_~~u#mF`5|8L4*GmcRuku&s85gSTy~2+w0gQZop{aT)?(=iCF$>wSlOr3;b^3w@KV-0;W +Tc#J{?YIc2i@A!1Rgi53)J`CIOc*<-|-cdqe*fv_m{$cHzRX6cIO}0iX$@mGp&Ohd+RXr*= +MJZj@nUZ@lSBeC*2E1kAJgIRotr=RUY;1$m;q?P7CT-ADkXfCjZig@s|~A5$icx`z(91)-R-;|F2gp> +;G33%lfN|!11u>b`z*n1 +y6SOUwUf?#4xx;9@3wqAYd3`P=-PVbBeENIl(HMuNf~w1cP!Ve>TCm2)c;Q_mczJ4`pQjOF?!QS%r|T +feorY@UjLhlMerP0(HIBN%4w3qzSCaq?1BlmL;dk;@i~+?{SGV7FDftm2G3x7jpSRU(c2l(Na3U6q(q +(qo}g1zlYWIGE6=bb(-KfMlzHvQdu>cR|6(qArCkz#sIS;-@QUnZ$hqT$UJc6RRCExn_^Rd13<< +S0tY!1_~%e($La^UZs@-0>1r>FnmAB#}b4qYJ}p-B=VU8G1l9?}Gg{tP5zN6|t)nN^2J&*wRNG2B-J!-tj5p?p9;%7OA2Pu#DTQvXE$TB(^ +IngRHm$BoGZd8yFpshG_BOT(0435uV$Vh$aZ&RZ++qoYi$==Ng~nXh_C;gCQ+BZn1}03SZqVLXi|^}l +@ffsfI?=nqN2f2V*a6(tM9Asda&WzA07I~3G9z!z;W3-h +*)UqyQ)xSZFy6~fQ9L%Y(zUJ!4Vg7&mDaIc`IhKFFb1`81nv?(*VUI-IGpV~QKyQ+E3!m8fs +XXpfA58}6^r-8=KJw&?ll(nKltW_@JH9pV`e2q5Oa4#Itp~2O +=<=2ZT#AbwBm#G5_UJwhp7rvRN3y`9@wIQk}wkj^ya$#ZuylR +{64MTcw)5}vZn@0-r$kGM)qX|^1u1kZgL9APzEpYL?*pclWYc33__w8E|>C$+$!xYa=Y4-cZZY^y`$Xe_g=}2Y^ +66Nt*b_kDLOdG=`Ts-Qn{By?uFInLJjJ}%K1cM;yrY#sqVKt*l|V=!f#{z8@MEXTcBNO@bFMwk7_M?! +DG-^d4B~4dLL+7UTw$*11Mc|6Hjzl&t36~nI9pG|gGj^(scXZRW<`pI^Z_|2 +t5I=XFMkt1_(DW38<v|Zm!U$vCPL)M+h46y!l6FK)Yi^`O~~Rpu9=^BmkVDmu@b3+)CGd!n +`;%N4j*l_LrOP{LiY0pS|dQsQ_$*K5EDH4qn9~{J;l2_WgR_Sg&Gw(3q$|^y{Qt51II)9s?C6-Q(aSY +Q+r^@$8CvH$O)aEt(@q$W{(NM-)Hw6+r@HUxhQm+2+`CG))h$!%5X8h|JIZq17+g?Hx9ax#NPAt1 +FD^dDeIwWj?>k0}|_`8k-hn9#uOp0sQ7}gh6}8OdC<|@3ZDLrl4@CGVSJ(la)hm(Gd$eoX +1lJ3m`N`0cRd(H!95>tH~2@jhnyJ`j{*gE%kCwaICXFjr&g5$@g7Z%(Kl|-x}qae%o%;WM?umkG!Q21sVzrVIA{6CK6+Rn +c?>l^h!fQ>4=vZeKNTXA=|C&!<-)gK)8!LNRK$d9SY1Q7nABty{{gJKj(;xtJyG)>STU>U`6kni-VjR +FC97M^T%R0hmj^R2Q%Hx@>rpb=DHz(Zl>DIY1wKe4Tq%B(DBo@Qk>AUZh%^;!ahAtJRo> +Zh9vAk2UOWb#)fVom^I4j_OC$a)5iFck2wVtXZ&07fxuRl1&Wy*8KxFN|;gFl!mQUd?(`wna{XO-}|~ +0kI7q*RKd(pNaotiHL#$;GO@biz(E*al)Md+cn1Q`!NjnTK)GjQT}-VxSsnjx!hWqsTPlXNuA`mW8y2 +aYRjYi)!R>;YVqt@HspDlD~pQ#y$(kG;=ek6^`7TscNG&D74m7xoQVCexEn<~7vt`j9=EX;cmlf +@pG(uQyC)8fO?Xy%UkVgSYuyZ%HORUM`~YTN%ek-4aj39`X_`F4$X*Bqx$Taj)mZ^q(u?d2ae5Ybe%= +dZ)?=eyZwU%un-H(_E0S12TRsn^mRHz=k{oK# +@^@##UG{^jsh0&56tZOPX!x^>O^zK!_t}?fYZznq6i5kjyMsO-*dsl%sm9oBZ%v!G3JMH$P-2M%V>%Z +9ve7yZg`N=TcFYgOzy-e`r?X7wiRc3ty?ZY23#k@HRqTwU0D>>9l_Fef5{aioS3fqhO*EQTujuf +f&5MKgX|F1y3+7@J(=n3w8w#;M6@Bp(`2uaL4Tu{%+)F*Msr=(#GVzI)w^H|8dnTSMAzer@(dm6R-!u +6KOleCY~b;*K7a`C1|=etH~_2C8{;JAT-x`~l93-hYJizj4^lIRCdpe!zK@TuW+W#kST8d|+X)3_|9gZ{j0hssPS}Y@-7PwB49(nRdn +9wWJ1Xt0bs<(=DjX2Vl}4j||z65yt?R_Zl0U}zU{p8+dmamM6dH2&t76#0KevPamvP?n{~71SFADF!;k_)l@3Hd!mgApL1Jge2gtQFQTgLig|c +FS6|aS8?7$|L@|w<%R!0;{04KhtnhAgNIk@PRNGR^E^g+v}ljSbUNxv+yb2mREKU#hU8gj-rwQQ>U}0 +S+k5U|fs@>dbi6IJX_fudYAj_b1A8)Msk=#-TWEyelDc%_bhB3y=u)U~d@&w!bv6AR967M+|31!_ml9 +Zae~U&iFdF{?#0LU^_Set +yq|@IfIUxSouG_5j)D!Z8WpJO7YI02$Ucll~RGrvS^&a*&U(-a6n-E(J0eaxes1={E3dB*7#Zg+Y@Q$ +fa^{C&_c3vrDAU +%YNn%WwNQlCo16F#ISYb{Yy1cBrpRA03qaYQVceo&fzaK0%elCZ(+!;bW}SdCe>|Sna|`cAg3>MVw{G>Z +4*qR4P+DeIawS4`qFhUfqL^&l>X1I)zd%4&zb>{)*gHai)%NdNK~8X_htJnin1C&n*NmUbD1)^}uc9? +jm6$Q;4VM-uzXm`~%dhl4W^Z^jxUNS$dH&FWV4@^K!vS&p#R=eV3j9eTh%FuhXWxRJs%V9IXpoZ+02)!C}yd)OJiN)^VyI +mRAM0^U!@{eX7}1B`A-l%j +BgW+)g;jc|CyIRax)f?gRfL44ZI03ps>1PvH6Zv27e0B>-F?LmYrVRoAy?A=f}Ao@?ko3*rR +3j)|d`3gz`H@8s0AJpwxMPakyB*k22oiVsN?at>{4b%ja~DpT^t`mtcq#sPlk9dGc2R@QRZa~TsZe`B9nzsms%q(#)n$xG8hfFu< +^zi3mmpsBp&OSYjF4&T$%0`?y_zh1PSZ69ezBkCmGK~aVPI?dsJZ#P3)1io@6_G*M1NnRQbj8 +?{eWp_QJ1h<269UfDL)#n3cS3$X_tjpPqu38QSjb|+Vbu5pA&L+NJGlf8DS!;a@R+B9!oB%S%}TS6dwBh&zA6XIm;^%!DP@2|7)`~ia-Bx#5XgB$-;ev}`s=HNfpZ5gp_M|Gt&iLVIT!p;1T3(0WskQOdBdTK$;NsUF}l>)bZ(qVST2rnC +!g*_=+~8*xqS4mQshp=Qv|wY=agK|20cc7oZrTv1EAI4T@omYqUVxs-VuC;EBxFD5hYO80HP?y!J!bJ +ZxJ^2X4rpBodh#Qwl7Rz*1ng444@@Kzl=b5NvK>b{OFylI)(k +BSu3z3opU*%lP(|?5wI9Jb5xZc<)h^@vvoeqGkDtQ}GUJ$$p@Sec`Ay_dY03dBGmMi?Ro-8(Y=LIE;p +er+M#&h$GoshR=NXtTJQ2f+JqmBc!_NKGRrN8k%c)IeX>h?q)MJ`*wLQB;Mxl5w6P`GM&Bn$sG?wddQ ++WFkIRm5X_gLrz<<&d%R}&!SOH4v+iqUeu^^Prc@Gj;(@os>M?S3Kh~&39_}xZK=;0--d|Sx;7?F96n +QK9lJdOdl?1mweLbT}`(zPfq}N}xMC_Y0-MUP(#Ogo^F|O`)HQN0)$pU02E+6&$ofiJvV?U9qe|qi*i +Tc~~eqc^CO=B2_kO;7RLAt3oJ1Vw)9rEf{|OXhJXEM +zS0@=bLs?xT^o?bx3U%*aH3-4TPsCc=@+>9)mp~F8v|O +o9EluY0ea6IDaq9#BHH1cF7$vR=LZ^MxF&~F(^AoZE~N8zscp-zcpcf+IKVwu% +sUzt61hU@@9hy?ki1FzC=fTd6DmSan_1Z+L#d(`t>_Geseyv|0p$CV^Ij<_D?JxZg7&^ck`LWELDpiT +`5j;U>vShRGm_m^0ihz2%J=T}+UbO9I?(X68b@pRn2X@ybejYAVp(c3-#nNoILr~LW1NQ|(HE;Xar12n)!oU*8{%K8m>R@(>&I)rZ55&Dy8kI! +g7yr8N6Bt5xs!E3&I=wrupM6yy##%_!GMy!O7N33?ossj{g>7N?_?zGcQzCY4tX5Xat7nIRUf3nB&L+ +AN$0HXACLN7l=%KHS1ir=4enT_qEj_Cf1uzt1I?$2vJO{j1gT~!ivGVxJv;OhAZ`Ex;-+#!D +m2G{Rg#2dZ6LgRrfkLlhxQfMW%c8(!DZa*A)HKhekCqFPX1N(MiRW`ASJ=PZ+)GN13beMs +Av-I9UWAARd-cR!^j|J5CUzVp8R#|=}Cb1u({uB(Vy3lotfdGZZq>)XY+rz-QArQ+AsnYWh@Z|)p>xN +gL3w;WB)@e12Zb@K%o2}_XsrxFe;#$PYuc@|-;kQ!R^eZQyp%gNxXG5RXOg72Xob!ba~hLg}-w21A81>A#|{Ccd15ge{zN0ql; +13%|q=aR>Oln(KQ9tsr%fMPX)u}Nx;r~fiD97O8BhA=7J({^(zP^*{9kO_Q&FKRJb>Jjm4NV@9ewvDr +k0Iof0woNAkQ`lb={eVTx~quS)Suw%O79~VcaQY}=?-^apTyypG5XXhE3`Ej`s@;Jey8ab*NaRsArxetdJuiu*& +Iq7H1kgqh{#66Z3$PSg;M_P_jadyTywsekLMHp`+cXM=!^IVl<05I{RJfwf1pHbQAHCNg2N<*QV7PZ%m~E^j3O +x*1zy<%Owgb9l7Po*4rK6Y1~?HA!^413tZb;*)KoDB_FH0V6VEfB2PJKN_Lca6&JO|xlR%kH0D=Yh3I +ez@px+0wdmN%r}f7DG-k2QPY+a%Pbn8(ZA&?}>Eo#eMfg0(jv2aKXJS2z*>iF{_&iHGYe~o5P{` +E6_B!6^Tkt{$POUJn);WnXW>!uQlEJB270Y@pR=I_Krd)=8wbuEWX&F6V!Wp#?s=PhP9r~7$3l3fLL6 +$G+uY!;!_I%L&QV_apT{;;#It=rM*Mf_Vm|ff~cj(=dLY%g3N8Y49ifsumc=-J?bD9cGucu!Zd9-@!I +U{IH31>dC;?WVfR5gs)dFTg->npu9Em>O%9CI}55%5Ef1R-k^%!*0+^;KHG4N2de_xa|2e?Q7J2HEM~ +tPpt?;EpZwy85Bpn!7%~cmLw`|M&l#9pUHp`2WWFKA`QN&-J53497{5!f*zKDG&lj63A!JM&+Q40-lP +S)->PR((5B@dBxCRxnji*Y+C}P0IYnjv7muBBDyu%laJJ2ECKr?c>y$FDYKP$6aXABD9pg32ac?Nezo +;S0WZcR1MPHT+eidqPB;)ufaQ>63k!|`-~w?64d$5i=FUjrUpwe)%?U&p1pvXE0N00ap>ipRgZjs@pb +l!69nxz2R6#JR)?6kQV5HHfQ5GABM8WI4+E=BQ2e_Xb_*oV|C6% +JzO_EH{satRaE>rM<>?8xke41XhL^n&RNoU9Te&qP_t1^jLaEb@JImsZe>{q;hBA)n#Phi!^v95d?tF +LcDHt#{y9%LCq2)9@eDiGuSwEX&<+nC|p~YL)2L_`!Q+tBk^Jk$s_Ti`(yOorm%CXv=xFb0{wfpYCMd +#(u!1ZTkS;MY`ldV`UaAjtHPTml+yeI8l=1gZDPU3BWrK@ndtL-A9Q-6GxZxhB_50Os;cJ3Zp*5DU;8 +b@AT&-a{R9ZGUIZ2I0I?I7{Y>f)+PVI4&O^6ZuFeB!91e$3C7+TGm#xxyIanpT=9lh!{bl6kvE1g3}nYq9Fs*D-)y<9K$FYLunH +JRDya0TKO4_6FK2;g5!6@X(ho6?QiVmpxnJQ +;w03L0xGsIJ!<=YJ|eGd-WFamtBqhbG}OsWUpRlRpm&aDQ$@fi$eF +p78h7yTA4}8ujQZ5@frr;@r~p?4Iq3^}%*E&J*2>>3Oa#GPdnmk!r!?Vf>oa&RM*D(>PiDaNgy=%h3F +jKAIuj`7;(lljU7!+!W2&Yc(v*#)PAGorc*8>!f$bdLL&~i{LO1tEwJF+QN^s@H~Y=gzvQ-8$n$w%+_ +_bJEy%a!xOVwT)6h>lDsj@3MW)!h+eqJ?-$ihKQX?b@u5{jZvSo1#`2MeRt^6(!_|j+JlmvpA8d%eXGjf_4{5{zIw*) +2L|?DxbuV_YH?yr>Pgpdd&QYHUGBScX$_Wr=%&nS6*CrIK`UQZgcQsePmZ;}KWPuOIU*hzoFETYTGAV +DVZJX_?y6hL)l0A!e`79D-xKS1y|J8IeMINdWiM~nE*C=VIfE3WU2=Txp|;v3x&!mlQw=*b@BD@CE_4 +6TLn(a+q>K1Y_Gp;*>wTqt$_e6ICLJR6tWa@2BC95CZg05aB`snR+$lwc78_MByN4!^!mc; +tQdy~xFAm0>4yrCT`pnLCeI9~!5U++rh?cR0FaNB!%N9q#Ymt*$Gj~9a6!}>v!PITzdG! +#%nl)WrxQ1WHpw5nL*FPbTIJU;KSpdWY3`|8A2#SSoD6Yic1_)E+%<;B&{y>!zcyP4dF>Qk3!uN84H@ +UxrirH~wrvA7>np6{*2;*7)%SI99nA7{B;#wL4RwdP}{H;{o|reOV@pJr0^QR6~tV-CNk>v1^eM7~Gw +L3BA=WIQpv;~F2C)>c3U%d}DRvr|7Ar +NPY?z`wv8qS2>SF~$eS4S#my1N>5mpm(vHXju`i|!<y0dQ__?5rF-tqLw7OSS5pw5%_+#pz&E2Ag%?seHuGIHjvUoPJKw4?)pul46% +#%(eQ(GUs}AZFG0u5 +UU)(@9$I~?lGeL5N2Xieb4#KetZ~N#xMDJrY?rWsh{pYgCrq*5=M6a0f54KqC70b#?^DpC_)MdIED&? +<#vG4wxKl+bm*_WXJPJ*u6*XN(hd)a^4cmJ_*_g|jvySCl$pXrBb1HVFW_qD881j6wr8)6w +DxNIZHC1?{BOif^Ko;3A$~lreLaokejCx@Q(v49Kbgh2Fs`L=c})vVvRRU1IY+rJs-`1%4#i$DFW<@N8j!@ +e=>;gda+d6FVQ+fUEYN0>5+|RBS`rXU@RbLMRjXjpN&|Q0PlTzq+S%%?bN{#c8@I&`cfgMij^N766a;&4V6utoJJN9HgZyWtxJv__THDC-P@dS< +c1wYP7mEA_0I|sOYU3MFQjuYhxoI_eCpk4LiN7+u*Xjxp +%^H;qy7r}lXmx^?9kF!}|{`^1)ryltR?AW;I0IuZn6EQ9?j9XZan-Wvl(#yJkAyep8dkW6lHN^jx>Kt +R#WAAO^$1p%Ik{VKg`<(kRHj8|HW#$eelPQNB=pCqGEq#hGrqglq5lOqd-1w|AD7@Fa50zxQPjhpWA?cjH=MDaOyW;$_6k6eN!3y +ho}nu=}qA0tA+mLazArehkl_xaE9JR-3J(g>X)OK@pevB{VTohQ`mtOY9Yk9U~U$M7(Rg64mOdeJqeIaMxWU(Z^>h+x@sZO=EEor|DVw>Z` +cENufWXK#GN!;#E!D$`w=$l +HV#$6_-g>Cux5_6R-!*xqCWd=u7pkHS470^S!?#+3oJqc7fkwUm(nQ2}hE}bk>HvkiY9_4C`Uq&xT;a +meUd}q6tHkdDvOfr|IamScw#GE(}4dnKw1*jUkhTVA@55Y-P`mb}9GzEuEkFM0+uo!?o(??nR1Aku4v +ju2}8;b~{uwT;!G+h?iN&d%WnP;tlPh3_qP5*;3AJVTV#%U*|h^b5KqyUY(1FmDO}jI95Yxh7mp|hI` +aHv~&(sS5`?6(eF4~%e-;KX8IvK*j|@jE5EO0q=>{usO^G7gxyXfr#bQX5|*8XF4)(e!unTM?9R|JW+ +N^h$Q}RY%=ZOf??=>gfEnB{P8duE_5A4R>FSfQ@4wENa8t?|H|`~JijF2W_0aM^s1Lk{7Dh@y+^)}2E +E_R=+^;6*%d&g>R@Xp(sy_HZe84j)bYH(Ft|rx*Cq}YgF(E`@S~_|I`&uG}J_dcjrRepRKTm}4u81IX +`=^je&$5E+i)TXNsaA@1U*4Ut71#TB+#;SVEa81G3hL_>n=|B;eL=E>(j&39sy>wt&2sNE#Tbu&%jooo+5c?9` +iVw&lSBi>(qii-WRL;k+t{`ao#6bbmWPjsts6{b@3UTg5?2sHc3j%R5tD#B1|-8EKjDj>Wo1+-HrQ;$ +O;@d&I_Z>K+eIrt#wx-LtnNpIPeF29R*AhI9ME#PuE>?`~2XAJ=D>v?I{=@fI|0$5+E7Kl0?Es?H)XR +Z~hA{W6Ely_Mc25_#x$$;Q?oNJM|&j=f}Ri8=B!0q^eu#3k%1IB%t$fvMlLndNizRnkUQ +2J`wlQU2!!Vez4{Gi&IS8gvckPO7H4H81cu_D^DSr5#4&V5FA7#>@7C}u9dUrVzI%-dVASTQ`&~ +hJC7;>B*zfjD*q!i?raE|&u%#-FZPt&oHEnpvZ^_qelYDDE|>#XVT{~+=Hd4p)@}Rz|A +L(LuWHM0#v&+;f3{Lfs|DZGl|B7T-Tw68Z%plfIPeEz20W<Yf27zvJTnsTACSYjO*VmBC;jg%{#B{FK84=$V<;d%07dFblt74R0X9cgLIh)g +USS9jMyzycJsFezJN;FuOK-_DE5k##8aBZLwHwzXF}%MWHNVbcYz(`p)`vKC6Ew6!?pnT}H!2G!?9Oqz`UL?_a +i2zFT(@Ac3147areRl=@$K%I_o7fx*Ss-XP#!msta=D~ma+b+cl~mg;_)^p6LBp=>`0tpCv)6cEjE){ +`fgGD7SBt}Blkl1i*qUj48OO~Iv~?_2i#rfhd>jr+lJ1-N0Xq!#*pT?2pP17)ppFLvnQh)hs#=HVF78 +S6tM#c9D}n;X9i7<`h^lMpJ2q;{O7N|N<{KeT;}HNPN)`@A)a@KUCdd@V8p$=@}& +BqaeT_j$z9(_XNIAOYuKHOc~2QSynEpx)AkCY<5JS!V47GaianfRTQ~?Lj|^O<+sED-houb;Hw?1Sc! +`aRcQSYaCQWaVTH{?SV>2ldmd2zr3_NV)jaz1Y^0*_FF;SH&`i@Sr1x1Ze_98fUl9yNA;O27(goWU$A +UvwQ|0;_}kC^*pKHMr949$Fy%QXpoO$|wxM0f-)OxWb-crulXJKoY2#s_XE-(tw9y}NTANz$ +rCcVT%)m*)NyNt3ztp!buei{LGLm$)W0x1Sa%Xk>dD%Trw-csoH%o)PV>@vBCB6jAcr**es#({ko|jr +;G2%_|d~<-<-mQ+D;gi{rOfQa{vF>r-4;RD@Z-Rwhu<&g8GyHP7jcw+3U0=Ii!jciQOQ+K#HO$L +4YF;0V$ZaVdp@1yB +oL>%gQSkh1hhy<{voI%;x#ZyR^)jsX@^p9o;1JH`6k|7A-S;QoNqv(gDQxf+NHC-h-e*>f;0TiqtnzN +`6einS#NQ=a>&{E%HrUBE=c&Y9B2_DtagK0gk!Qiqb00GBT?{Y7P0Y$O%PeSr=e)xy=G?-#J~{76?$| +TUnG^E5tCsU@M6DX%cJX59o}@-^hU!-!Rz$Q+`qfW~nT|cF8g%Ay6xBGu(&#u<_>p(poqLZ?No*VONz +f?qa*NAE)$1peoXzTny5e&>F2WUY6tQ-WvABP@r7h+Pvwl|*ghI=;IKm$mUYz#$^*uFC{}P+XKu3tZ2 +**U`%fX6FnPujSw^wUpN8R(7ys5);mxk*2q@+WNFOA=)Z;YTdDGgo)yMJ}q6M7Mk?krimO2yw|9m&-C +t7^b)9%|<_6Jok`wQ3%jq!|^TkMP@BKO8RMvU^Txx9h4BQm+lU$6a|2^@6^&vM5=YwnNK7!>$MaRYX@(0iv_3WgDbA0zdbQ{EB@TT4u=M++-h0h6quRn>clHmOY~N9&?*r +HWn3(<6!JiScpAY<=n4u&I69~e91VIMI8H6HH0;UL*q!0#&ag4-K^wYgL;K@#X?b#EX3?WT7tDYQqwI +j^7P)q??D6xL(^M)ByfRS&u1+o)3n4J~`X!ipx=_W0uw*2Ik72%r`2fghF=jgvN=2s&K44BCk+2(skf +?nKuVHpBCdBBwv1B-s3$;WIP&+ckydj{6@_YuUWZbN^>$p9sTe&S?b+=l*CsSdtEB7ay3{W!YcR1N!Tf*OSvVU? +L65Un{403#3s^w}i&$Fa8QioDy)48;E;T?Zg4&fb&Q+}zlD7)R*Na*5P!~~d{6ze2mkL8RJh8%DUVVk +o(=(n2^`hLOGd}>DWWN_WKlE{<4VmuboQOXKlMJ!kRF=d<<)SOo9{Irdh<~cEtm5{V}Iei@QazQ6jXAZv=BnbH(#XlT96Ham +C#!d ++Wi*9h_zH*!Ou{6AqA*S&D1k8uz1FpBJqr~0p9Zdy+YB`WII@<9z`ut9aFb_XJ7ldHS6~8eY@35+{CT +I6Q$@<8z(k<4{6){juU^!T|SwFDncKm@iZTjx)*0BpL +!_$O_z0c9HroZ>uQYT@;QzZ05O@~As9s#e;U +l#BH-NOjV$4=S-Lj?=kfyN^8?#g*U$Q!iiqH?2DQkn;Z(ULipMls$2BWZ?W+iId>4=MOyP#O(w>MQ2# +j_u@0?Gxb^BMBzzDPZ7gku+oeU`SHe?X;JU6^^g<6bk^jmUbvLl`LniPMn-Nx!n1hyCJfP*d`9KmGYn?(@u8#V9N0K-nz42ySl$2mbOsn#0P$nbNBnBQM +!9WRh1EFy=FAk=fRsli_f61>a)=&ZY@oWQ{U9DM2nehC(#5V?cTymYnG@ejFiq6>gJx%hG3LP;A34C` +ZvV$FTO=yGVq?f=c-DOhVWuE<$Q~I8I7{pWL|fL;n%(zCY|oDFw2!KA2$$3SN03LSi(AQaFR*2#T%PN0B5&Q=j793PKqMXjei5VwG;H18Pf +@USSN20X}_6>%owJXP>)@AT*edVq2i$ibWU&=A$cSu19ADSbACi`9u*BvVm?A{F +ju%Wdeh^-W`75y*TR}j^(p#KcAth5CFYD!Mrd1uD>u30-*OFVBVxUU&OW0_TU%Hn^d9xW6XnA(A%1We +~fwSy+W>74f^pLBYy21(Cn7)b~$ZbguY?*>3C0Fg(S~PWu`bHQwe`Db$^XVQO7 +h_FqBjhI_MCR`AMM5If%@<0BKv-lpUgwT@NExIE_pk&4?3}4QGdIV^eYM<(?OJ$Jag*@^thdg{l +jk?65D5&_F?LV#NgQR8nw~mev0EaB3+5=qwBqsq2;hXvf3!q1?~#s>por~OsscB_na#qMF&D18gJZH^ +sB$fM2Kg7u;4DLpOvX)@9M3&$)#9L=0Od+`mOqJLxA8Ze?F&sb>@Z}k|t&Jcm*^4FB(Vh@|<3Xn~)m%km=Y#sFKH!FC3JTx$A +dtd%dIHSydVvAMZ}N6neWUE|mJE#I~t70xT5OO*2|@&(fIwHB^rs2v&g5FJe>p-ucK@@wtDvR +_?He@CGWW#T=8iyfTbuTqw3yIxz=rCRSym&-3og`f5b1oq250c*0AiKw@*p8CB*@eAUziR$^~`KDves +{|5#yDd%^`SCt=NWIfKA7}42gmcv~S4xWBO}sn2+g3gYPF9}wx~1>qw>b${L~ZP1PwC@nlozdI&D(*_ +9;f{^j*Jd!V0Vy|J>u|fZDO*@&<0+IYY~ULm#{}%mw`KsE4|p=2^O|O406T9%UqI(JRNU~0zFkqqG-c +<<=l%MSy*{luI%^$n@z=G5AOc~dG@bZ&S>qTsd`McT6S~%@#@FQdmf>w@F_TG;qks`Q{v^!ZMpk1%Au +5w>201h +lrxZhc&&6K6Q{E*=PRIj#gMNOi-NE2W#`^qyIA@KO!gZ^%-5>P#OSCl`LSFZQhM*a!c(U|8bYlm!hSpFe2XtuXFHRDl9F|{d>`OuWStA47ZH*ZF5)SPC%L9jp(a!JJYYOG1=?2xtnP{lSCp{6R)DiKC)zsPbx@4MMdjBtH55gnxq>K{Y3usS{&Ts< +Oa+dp?iF`Iu-TW+j}?aKHk;ljTTAWr(P&pLT}eKd7*Df8}A3*7(eMBl;_e|?f4gcQ_DxJV4a2^hvvn! +qT8WEhfwHxUJmVE9^(BINo2O01uvKHX*8N<}33ce1UStpo_{p>3OHD`Ub7uuhw8q1IWxa-GlfA28rvl +8`{+u-1WS0@`@%3FwVSAt|6@E5}=(0MdgHP&A@AAb9C7bADjJ4p9{7R`UdqC-54ZvB_Gx77Q4HuDp+c +L1mn7Vq9d4*G{(l#jg%WBpD2dHW1^yCCv9hs$tUIL^)SdV@GZQy5LOlwyYy9k}UVlp0^Lr|j>vS9 +czC{87i#NaeM7;2qrd~aMJ-C_G!VS|3$VG~$2RIazT?H|dw6WasYGn+G}Iy7)O5hEEKWS==N3xXkDFQ4`l2i$ITA7>wQfY)w0(>H@cVh289$BF%a5CNu);Jfo%u`|uJ)b-2d8@E#-Xmoq&aA4ml{O6j%FNgE57Ou4Exa?Dbq=eThWt{jgPx2h*yS(oPeR&X2|^ch#NoSz}Su4! +R!q)BfBq|$)hGvct*rX$u`v+noS7W9xf+z3lYj6<{gSM>9`FL~>1;JbbXt_R90e;b#Xf@uUD +otnEon`x=EsJK%yAs_Mn8#{`pBdOKsE#F;J*Bs&Tq90OAM60#JPbGP9?MVnXtu+Pf3G+#VT=|zPADh7 +{2d=Z$_vF;&FM%VIKrmJ_EooSSh~c$bD)BeZpMP9shHGF<59kBJ}}j0je8#7yF6A+e5CX+FqI&(a+s^ +1&;9?$+F8sCfg;!*XzzAH88LI}CoKP-(f_}N*c1BETaarRJfksQX?^_i;5UwKdbvf=GQx|yJ#4 +Q)B8HWbW49gMc?(DwZj85r=?sFg9*?n$&T2cBFWO;J6>Ca)Iwcot9Ut=Jyq!)Q@RV6i!h@#_%_UX*t4 +nnmalAP{uHgF69c{7_x6(#!BN(n05h-tK&7o*2>9lh*0f;T1(wkg4!pY!9n_MdEmZZ5WW12V|mUY(E` +7rqRY|E(ax-)kx%TSAxSvM=#S^)31TdOSKD%;@W{~;SqvL^d(UOl2gH{)HKm3;fH%^Y>05j>Cgw4v#r +*Q+Q+V_fhHCZ+lOJC>O_p&W9u{adZ9Hi^8inDYouQ{IVabIr^0~&VYMmuk;4fh(*-Pn-MZt7zuXf#pO +@T$3g%$)yq7HFVH3o_OY}XqXF=!!-O>2mb)q7Ib)z=-4iYBF?|i8v*4{^@`5p;(hd?vyoR`5uH%0)r_ +l*g{X~fpIeUXt?)5Rk3xTeTuh?KA*5O={1gfALz>L0Bl=X9K%tz}HLNR+Qu>}0724nKcMRb@xmn|pvBT; +5&ARogV9BOT9CU +aHQ*Uw{P733$1%#77%FhY9Jrwc3!0xdB7Q6ck2l_p`!@gyA7!H&B${GwoBn*=fOzaj;G=$LTM)Wo%ia +{ts@8K`>UUK*_<^_MpZ0#%j@0IwJ+86S(cXq)>v7mS-WXY#A#*IG3AF?}~d>bv{|0dv_Oi}M(gN)co7 +P`-;?hz~mwHu(I@V@br!w9{P4g9LA@U~ytOTBLjx4(e)DYT93;cqwK9NTNDdpdWz58tB1UO?Cmy3tYW +i@V)Enn3P@4*9#EZl9r`_vs1jx0%^TZ)bPu*Ht#xS@dd_h~R>gCl?dhv?5jIZhG+ala<*M_$SP6Cw9P +p%ItLR)5;t09kVOtpPAiWZTJPV+ld|UPng}l5Af&A&iqp^Cx&rez(_$De)Kpz#lmAevsom0!OJU|lsx +t{vUb<$ZevGo!0+n7=COjuN-oGAb{(#U7e4{@b&(ENpK8cS#7l7Q&w^GOfulbvEQqFOQzbgq3M@NM@* +!qA)GtOkzfRzBLMf)lg89XI&*Ww0$ +)P&cCt3zakOAdY=wYeo`jC@t8n+smZl>iub9`Ve1ml)AL!>;2^h%XXFYY)+raL4!mPHxQZLuV&#mwg$ +<`eb4ErJ>}1ptniqmpA=r==pbd{_61g+a14!RFvAZF^r)QMxrE6q69)xC{B?uf*~XdL)501i49qaea! +Y3!MJF&cLwjSO3AJ#sdvEP21XnDAo*T;h>*R5Bz|{_z#m)WL2m9Va`ir_pXYu$zHqyQkjXo07lViQm$9yUy+C#Jgg$KLFDG1Ss~l%S+xnL +c8_Awik--7qmSgHWf|%J}^;ydk~zzLaK=#k10j#f#bZE9$VBkM`@9UTN(QqQa|b(`Nj@iJGyWCIOl@U +&(Prq?O1(j7`d4UJpr+&moduL-wb|z@z(pMuLXL3=L}jFFMZWuozo-Wt2OA?jeEfs`yN7na0ca=`t8H +#BKiYJPVTq%cbZgvbICSqroKEz{+G&!`E6gzwEK|)e-4?Js?W{r!9<(rxmlvtEv57<>xX*k)mLUfM;gb^o=UOO0BsBtdXJ +=TN21Xk8tM1gM*ems$lpyc8$xXdgZDMVuOqcTq2S)m7w^t?)H@6?j(6Bg-Ua6PlTi$@yBY6Eg~U#Y;r +FUwM7`r}lXnX4dzq0y_Bt+%?Umr&-vHkGaj@w3D9C+}f{KBJd!lGp@WgVpNbvyT5p&~$0Q$d)g5{4WX +hOPU{fL75M*V*i1*PAjAf`!TdwG#HfeID}CL&9tpP(638GAL0`_aRkIt7H*~;DK4(sL#AzXywUI`Zpl%s|Bag5P1%6%|^W17`2WhI>RA&nlw$M!?g;!1Yta&sn#c6W3_bkre~XmkgA-cztgGr3q +1NV_4OZd!C&wE8x;Iz$M3ixzUgO(L{Ws?ppV+H1f@4gjnEX0Y~&B8Hd&1m2!z7eo|yBY9~G3n0|fEC? +QWw@1p2Nvq&xU+K$2qn=-5WNHg&xJ@#ChwP3~?)aU*G)n%xeDyuH`A7t|-K6Y}3Qxp$y!Z1a<)d;ZP| +%#nY;f%(G}Rb+33&gpmZYP6HTjbqaB+b|`6z}CPC<+i57_e`p~rZdL5 ++)6LkHZ|=9O_RzkVRGa(iuoQoWv;RqPk$x6Ng^N#7;D`iB*IdMI5aV{diby?u?#G +z`yYb0p-Mr&BM8gj}>7Xpnz0E{xYM^A0J0^gI$&G2sL0(C+(K_z9zTI3Oeq +>In&)fP^EJ_xd$S+6U}nL&7d^FB)oN$TMO`lH)n!_lLwBGfFdCqfFHU$s@~M&yrQQlV0g~#1pC~;Flj +lL2ENN2L4gcWpvihwo7}nOtev&>N_K#ogd=Nj&x-==PA7DHgwGSKq%tj-LWDe@R5o&O*3!{EJ}$4ewO +tqt&m5u9-CAHG2vp{ouGPoBHkD|Nq2I}=E#edJ6BP15^LcxcpmsRfq%NcW9kK2%dOX``HMc4jgYp>=3 +;K+gblBNOVqCIT5sDVd`B*i~KEP_0>$()FXfXb8tZaSJ3G@_m~!Uc}(Qy#pyMut#ss-eHUuFn1VoS)y%_y5w`6Zko +8{rfH#9Y&hwZZ6MJ#b3n5f*&wX5KU9+Vcca +}ADIRxDev|0StQV5&ccz5xz@=?qIF(31Ds$@KDa?S*B8T317^K(V_h7yDi_+eL9^tZ +AI7?CdwM=X2ru_9pGP7f;_1RW2Z(h&pKr=SNv>oMNvPZcBz~sFM1&WPR%D1%pNtrTzP@<(NmSGU^J(J +NazII~q`{k2F-vS`PT^GAx>k%fmyP%517=}}p_1ydNwKw`3-HBu+Dzk1OP`oS3-TBcw3zdZx7!L!z-s +KU-dY}z%Ea=OI3(v6K|ALQQLmu#9C@cQ(hG{6I|#=Z+&#b>)C0A}o63;@TShv7Fdjlr_gs6lV`cPkr9 +El2qNZ+*D@tl7isD^_$VX9{(n@CZq!#bMC9mA2KX4^^c#LKj2I(t-54JyeQz54PT$2)xm@%9djB_|$H +7RD`m;Um`@y?oFn{2%7sKuyVM60e(Cf|Y)GTp3%?7E(RoM(*~t(UCa2qmwi@s|3!Bj-eUC$(_!PRaWG +@6oUSK!pB!=f6z9z7wGs1wq87F=-0Lw%>7tB)9)zf+T1dB1sJ0v+Z$;+}l|wjQ(&bZsRcs{U$od+i8> +7$GzycuV((HU+G&|M%mli{1@Z?(XKJK{qT1e3`Oq>6iePMCvWqk^erDZ?u8)x_KhY{(XLpdUxnD``99 +jVdqI)!W4+_0v3y^g+ep=(MW5^;guBUSx_8%XtnpK95QXe%KzqL8+i#T4_lwvW+uI2sdwZPbf1iGNYy +_TB46lQe4n-}~T`szU(FE&a|F`MaPePPOfPFpgdm+jre`h)Fzd^sGzd^sa>!BdYh+*u7N4?>w@_=sg< +jZqvKM2b%0EcH{^^FQGrIj%RywMt8qGekPb<62;tht{MiGpkHuFEc`4JQbw7K!c-%8SfG(zy|0^Muya +9J0O)?)mH@jiStQNOq_u6^ +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 +BQXGm#14+Y#_cIBM +hcQqew6vp9V_5Hnqr|hzfTu)K$f9^BFYz!yVQjOL)Z+U|u1&-$)Ep9ZxM!l}i^2Uc;Q$IQ5w5!q%tY5 +ErgI4|dhh>cdwFT885biRv#OGFO1=x`i0n%xH+ttsi4@Lf|V#p+UK5ca5wl4bwtM)YeDD^bn~zLJU8B +A*@LA&`muC=r1K#O0~R^#dXu#LujrKX(A-WnKT$24%0ypAKmj{v$BdEM0=+0SXazUjyKk+1%3 +~hPh=Uw0=&B7-P%X7q3)b+#|7;uF{=@Oj`8U9@Z39MQFT7X|o&6up~o#(iw1Vhyrh-6ey$lfr%J~!jklzqyW;FdcwT(0FcE47)FZ2 +dmo;=5~d66W3JUcEgFN3<%nJG2`g!X?xX53relj+7>N`HZ3SVvUo{?1+ecju3ljUq+eaINjrG3dpdAjzoKT)>T6aV-C$>ou3cRBfVY%=D}c +y_t=<~;%CMot`B2Dl5}8uXXRFra4`>nu*z6><_|R=9WD(KqgB+7R(!wuBy{9ifsc-v$J;zjZ{NtnGcE +c#YVu=#8om!bFd4XRDC|eLF|?S~h>!IMEB)mb^-_8`%Z`rMuTU;?_W-+DuCIcup_1U33*ueYmxmn`;7 +XsSm&I@2+;RG{xcB*?#>~xx+%*3DA +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 +7NH*`%5(MEs)n&1j +aqT98;KU|lXHFbpXS1y#}{DKq(CID|DYyOz?1RD7;_FkXD1F*gn}@J#WSqxV6K3*lPXt?jE30NxSx9& +Li#)h0_HtmrKlRgg`KQx%Kn|uBWEeb@k`3)oWJ(9zHurDLH_k$|2lGue!J)_{-~q-2lIc`(f#S%?_)4 +2h@^HVP9pnqOX2X5gGmwy3Q;IbK-6JGh*1Pepa{N?;6GK>5y$z1J9e-!k~jj_j=-Y$*iWNB`&2s@g7H +HUMwMi#9`WO{KZ?PmKO#QtpoaU4J9OAO9C +8)x;BWAU>>Y>mkWbd|(OCEdT~Z&5{x7)| +e^eeWG>`X@ER6k{D7<|QejEF}vd)lo+gteM7iHb@c7YVBw*)r&2*LJ6D*1O0epjx)yY5f+9%ZOp8yRDt +_mFp+@9x>|jG1lw&R8AN^`y>6{1cC`K@QZqmtoC#Q01qUp*w+bJn3 +7abUPJD+*PvY4q_4Ra)M#^VQMJ}nFdT%3;}8A&-MiEisRS0^c5=yEZf=F|0V^ik-T`nD;**_XdzB8Gs +!?a6$BX5H8_dKk7glHD$<=uLwGBMvIg0!Ozy@hgays0DAfI#g{p|Ad)pvu9axV?!Y^GROr7YPpN<2+> +Avv5@@0g~>2&l>>_68u0yQul<6df3f(ObefOrH|Xm@8gCskX$VGb3zg%xv0ZON?Fyk(gUFlNSeboeLa +LV;w2Ncw#BW3du^m9!kbh=*MN)QWTroaNQKVbea&V`}av4iO5U1lFEFvb1_{9pvbEE$@Y+vTnBf!Tjg +7z*oVaoZI0k6*?8AGni2l>a+y;Xbce2q^5^2c)Pg^ac?y{CS6ESePz!;~o=o;0IvKUFykU}wo?b0#?y +b67#AjQQXyX(z1!dNF)n_jCxZxE8Ngd3qFu}>3W9XJVT;XmfxUvmQj$SbN5#P6dU~3V-yv!4qZbcNUl +8EdKoD5&Hs{)G!OO%RfSC$i22117ZzE@p(qp&U7x}(KhzOz&KTc;X+uv4(-vQf1PG8b$wS$fK%smloi +xVMM(?)Sv;hT%nl8{B9LXZo3OV8&b1net85`za#*l9#lMswdE=dV|H@3+Hw1i)U5&QUFgpJFLW`@|-c +W5VPM|)ph3+CM4Of-3mw)o>dxf3%- +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 +B}vc(e5Gs%w6MV}7jZNveJW$O>q +#C~wq|3rKTCd4qve +&<&l@zhEgtExRs(=?NqVl5<*W6F38i9%Vdt7hr9Y7 +9v>dRd>SY1^x&cNdhGN7(qakUoSEpy!;j;sGX0{qr|+{_p{J8^&e#ErgHBKS@B+uF8oX{IXeX_~worG +~bkq@e3)S!fqn;cd*n_XkV1^@9P@@dm^c})D+xkm2Xj*B!clPW7-TBGXgc0FV-JcuM@H+0z$=n#|JY?et^z6_9>5SlH8`ILa4z|Ygp*OCJpf +Ln}ID2e5YKD*_^6}YD;B?;;fzlf;Lo6c&>TeMR-b-gsADv)C?RgrIQiq$yVq}5wx2`>PXuY+4Z +!cu6wnJmck^4HEDI8S?`$q>a*QXz>N2yl{^Z?`AtKLSgt5Ewv-vUEkjJJAcXCiv%@!<_-KiVnq{cm%D +{A&(nzEV3TIfxPpnLmq!CopFv*7FE4h|5Zp{mXJ#jn<5n)dm@X|Z6dN +KSmIrl~gky8bQ5jpN{7QwU;*^O^1PR-)CmybHM3G_brf#?9p@ +n=5Kd};dMmFL+QxeMvT}t)ubSFw40h6MnKvptGc#0D*@&JN&8NZ@X)bQa&aE0n^$=|djoTZ3W(((J{# +q2LoO9KQH000080LuVbTY4cwo_YWP0Qvv`04V?f0B~t=FJE?LZe(wAFJxtKWo~3;Zew|0XL4_KaC0wT +UukY>bYEXCaCvo&K?=e!5JmSn#gLUk@djO~h+8i(lyro^WG0NM(A!(v6gTnj{(pSl(=@>eW6Dg4qzom +hz*5x;92_h;&w*pOP$n5k!hAJT>sIs|Z>CeeOWImCe(5&G)$O`+e8zODR2cj= +C+)_=VpP)h>@6aWAK2ms3fSzApcg9o4j006B9001cf003}la4%nWWo~3|axY|MaAj^}Wo~16UuSY}b# +QYpUteuuX>MO%E^v93m0xeuFc84s^C?b#N=FlE>;+8Vs|X@%cugexT3`;N +;*1g{n_Emm)`HC%%4AxR%L80c(S7h}dTsg)zobuJFOoqxq{~9FPhGyUn=YhjJxC7d6}r +;OHYBf@1++RJMGor_y#v!xX?CfuV9;2C#%CopW)&*gNRL&{X5@<&tezyEWm(&|);wbAvrvJFj2cCB$`@>}k%u}?G!AsfDnl)Ec +t08lWnonG}K}w`!A>J*r}3k>Qakl=by`z*1Qfb}S~_wKKY`4pvFV?s--00vX}HbzCEy|6B{2KI79bqd?PQR5N@O@ +rd#;SA(z=aS4@`Vy;#NEdjD3YS=u>twD%7mM|3n+KN(Q8mr1=uLIO`z)fjtE_8FloX)jMn2_|f8FPUd +!Ld=J8~!Q%3%2yC`m{;^Q5Vg#kpJ~U_n?7L?9qoI8nM=d=Yz!ENIfQwl&Vl&3w8kXVox*$&(n+Fv!Mq +pHKvXW=jAI(tJpDA8qGZl?n!8%`OZ%*6b#6!%{&;B!2-=O9KQH000080 +LuVbThD+9Wo>0{bYXO9 +Z*DGddF@$SZ`(E$e)q57yoXwwqHPZYh5#8>ti@1ZD~c`HOJLZHMAvL(Q6r_KS(pF5b9fUe(oWNL*vkw +gwnd&RzjLE^QXI%;vm1v|vdxC@Loeh&XxE8>4qS9_)fta@6%rLSSFlI)L>OLk!0pd8(=)3e25(XbuabV43z%l~AXjvm+w|D6*x$by`GkM +HLT0x!wHj1Jx^HD0ge^6G3;t-oBBWO)Yvkf^9yam(bYNEyGDV(c}0wbI-g)`PaJtMAO3I(HUbfy5HUl +E0Ei>vg%%T7A%7qqmS8oIzV7{hTzs9?YheEB$G`CKu%Wz25CrZmeErNw4jMB$FW}xuNaI2=7v3Dn77- +S`|hE$Jg=H;S*v8V_n7=Fb)NC<(Scn?tiLlC!>|Gd!u$ulqNC*1#{tJ|?*Mo(_O7*0CafSV!v@va74Ct +_p6WR7*}a=Fy+PdnoPP_vgzL0Cf&kYSIe4km99u_Kh!z?W5?)4tZF*lbpcwY!pF&R}YAR%+c!5 +`Io~*CF{*bZj~VWLC|10gh%*;_YrzW+{>hTcYoa5M{HSmRpQA$*2OiTo3@7UcPr^faL)NF8zMiDt4SY +l6H@7unbH0K|hPPP0ZEUW4^5X8AO7X1_~)=Ejx0%=Pd($lxT18)Rz%Cs5f)>J>cAEALvkc-T@x!iL_4C_7ZnijlU(|Qk@n#AElN*BY@AasIl36-)T0-!84yPisgR)$rr0wG +K?Lg7zz?Hw6z1?k6YblZUqd(kMZCVSVnkfK~(Xusch`moh8%IlA)TSg^ +}OomF;;sARgXP7`Ab?1rdg{EWcq-JW^z}aX{sqlb2Qo^I&MxrT0v*Pkt=T8`Qc?(}ZYYAZNoi|bxDjgg4 +wWw&WTE7am}!U<4saFB1lJJ;H3B{j)nNhh10;1V@_t=IuTCZMN)c=O-VwOpHiw9omM_LY0VO3_pIhS4 +rRxxqxWTxIn8ETBb@{vk-cIwya$53<+_nX)xDxU$G=scmp<`Y9oGtvbCVw8YerVQj>qW{}A6s{%o5`JA06iR1=ZE*iju1~Y=bae4#?7 +RL$E}}-@-m&O$D!qUnA?yC@O4s0k1}Kw>d9IY9p~o4?m(Rc0%Ud=`KqGGHrKJE +aL4s*I;v&@eO8K3`xDKddu$Aswl{37i6`xJ&l=LmSu)`LQHh`Vy(+eu^K3Gk_mJ)U5|VsjSGno|u$HaY2xe5|L)-}F4b)3|g&LH4Ze?X7?w0m1< +SYqaSekGC0@540K8oGvlo(o@~;dA%pMFqG>V3i1YWbeEKRvXW;zT8Hhd@vLT9Wlc>BNIdc!FCfvrq=4 +9&NOi&8v +{w?R65Jw$Yu$Q*CJTjpespgMwUft+etgFB953f@|u0|7;ltW7G^zJN)?{r2J$xIChj03wUcC&%fDDL$ +4)YcA-qsJl8#@B;RRk`Af#Dy;;0@-)`ae$)R;i>i92KasY{S~CXfAcy2YO5ibXgd+U)+3mw@D}l6>Jv +upJMQzP}-gFMS^xCpGbWp44}uane72lN#K;)B;Wpf3dW6;K;qHxmKLAAN~xw-TG_SY7mEZyA8#LvXVl +xQbjV-{_}D6Q;xFJ`1Yf*1P18}l}?!*7Yiuv1K1LHHPTYt;2il$IV6@L +RzO9KQH000080LuVbTQ8A0QPlzf0ImiA05|{u0B~t=FJE?LZe(wAFJxtKWo~3;Zew|0XL4_KaC0wTY- +w(EUu0!)Wo~3;Zew|0XL4_KaC0tjd6iXNZ__Xoeb2AB@>2q>Md7VdkPu80(u5`$yiAkjB{!{E5*yoD7 +nS~ZuJh5P-H;$JNqs+j&bh~KVRZ#U6pe2z3IVDz+Io<6t-bV0*Di|2HM=p=IvjtymSRPy=Yp0>tg!BD +#x9@GV4Y)~wU<^m<|{f~KB66qysk=->B>kyR)nQe-A7TBV*!;^b^K}(c79w#shq!c-rm7)_@Zlsw0kA +6eBXVnBcMkWV-rwrwjLg1Rqf;B&+xGCPHqs;T5Z>m9|12n0kMORSD(S+uSQvPU1J5>!gcGnMDrbAtzN +UmNy9>wn36Qy`JB2=!Q}X5rE&=0TIaF4cv3!on?zl(lh+cjQEL9dZkizLbr+eS=jbx4Ob|OgBXmU^XU +fB6PoyB&kFr#`@+}8;T641{t#+y`0Z9#8woq!BlM8alwwOJDq>wJ4)s21Lo3k^L$&3w`c`oEYV}i<-# +Y{N1T$Eun&(rkiac{o4VZmEMt9(qO~zL*#a~z8eO+Q+^AYWDBK^A7P4sZ~@HTvjij!$;`| +;CJ}_e(L78gE=&(^GOOs#Dy-ZEyhjl>=wtTG(`*6z!vL)Fy_=t{6mIXj5J@$GvBS}&@Lvvf{34tlDL! +RrJj6d_+2BRkasfB3=|4N-vqRcL;?jh6al!VUGGk1*5Vfr6jykMij|VoiCdH@PVDfJBkQt^t;^xoLtx +rzC3E6YfeE5iut&@}7k=~Wo4~-f4{S(*!=RDqV!{E-YHr6i#@zhQ2(P9p}EqRPE%1YJ2`;!tdD8Z5w0 +V~%Xknw)QFqj_0UAB5@E(1FK@KVJaViggkkt?JrFd@R_F9hqGbpHfN^aoH&0|XQR000O8 +%K%wh)d5NWBm)2dNe2J`EdT%jaA|NaUv_0~WN&gWWMyz=Ze(R{V|ia^a&L8Tb1z?TX>eb6a$#_AWpXZ +Xd6iY)Yuhjoe$QWV=*jLHL$|j;2BQsQP`c7}gHei5?Q^2lwlqm@8@m4QyOZtM$$qf;AyTB%-FM%2Cza +0BAZ6Kx)}fT3YinEp)ifrkpiSdvvtiAxt#TfR|GvGm&gAI*Ze>f>C40;yEmc@!(|H;Eo}tC2z$V|mcc +!&h=uP#2Za5T7UCG?kR)ygNFID<(Hk%b#g4E4}xkqWWO$xMr0hRXQ#s_zs!u%~TF;nm`2?;-9Kv>4%0DvwB?4bQ*oj>bz +6O!Fu{={dm)(GgFaSJGRJk8fkl!w#v58&{7s~!62Sc7qJxeXg)_f2+k@=6@2Bt +f_6VQ0K486i(jj?G2}gXav!lEQ&9irI-LjgOafi6~xzm=VU5XDKYZGxHs_Qe6PTXaxD5UEBjLD0$)#d +8qY;|$^RldLa`1z99Z^+Cq1*HTVtn5-;Z*am1^qd3(y<(Y|jj8=T+`OC+CFXOxr8@bBd6+X}lRXk%wN ++S(okhmHPb@}k`zDe5jQEHSBF^Bpx>*xk2xOkO&JijoNX_jvk>BSL2hPMNTz_0x-ROauw +5vd@NJti&cWzD=x4n>$I&8oYZ+z5eJD8FYQo*}Bk%ID2+DUN^Mg*a+;H)yLNJ`tm8-}{L%x9bv|uhI)8H;w_JBA6u;dh9!I3TB^T-+E|%oCSi3avDMuS1`J$>8SB&QvuD7c!Jc4cm4Z*nhWWpHI~WMyt+d0%I8Z*_2UFJE+TZERm-Z*6d4bS`jtWsc1X +!Y~ko?|q7;UKCm%px{x#gM9&!5SwiYB-yY@ihX?v9xKqDBgUtrl2Kt>KyoRdDi{AXlh^78sbsLGc%$UhGGPLFmYt +OqID&?H;g48+;z$j#>=9MyVgtyX^ar#>oH$3d2!0VP)h>@6aWAK2ms3fSz7=A000620000000 +1Tc003}la4%nWWo~3|axY|MaAj^}Wo~16UuSY}b#QYpaCt6td2nT90{~D<0|XQR000O8%K%whtq;_lt +PlVI!#Dr{9{>OVaA|NaUv_0~WN&gWWNCABY-wUIOi4pUPE$oLba-^#TU&GD$dZ1qUs1tJ+i_&t#&*wm +PHb$bLADjg23Eq|r}s@j+32*8I4WU=`Str{mTt&kpl4?$c6q?oC9hSL`DIpNx8=R-j|Sd1Ik=Uhdq?_ +%+tF9sbHsn_{0K2zXR{=ht3b<1s)9^SWf;qBrlbneXe}>pZqBtFujSn`oF?)$h^3cky`0M+lYSOXW?2 +}&h{pgV^B@cLWG1^R&QiQ_(*5dMQY$5AS+@A)Q*%S|_PYo^ +gpMFU#OX$w?4JP|p6`ZOdGl6cWQ&OJl3PhFV&^suZ&Dt=Sy74oV4 +~JZGyQRmP;pU@bf6=jVl4@HwlV8!}12bqY>VvY2B8Wu}6;oF}gkkR{@?8Z1=Yp1@C8LMG0c*xb%}JOp +FSWEdg{989ugtkPT?se`!^YdFKIi7iP=NwOEdgc+>q(tKodPU2)G|2tVIQFHSf_x*+!NWW7f9j0E?B} +qT`hPX|Z@ze~}${l!%k~Y>_6sRo-|B^9I&KEWG2s8Vpu2XsppWUY!Z`0??cSO)EH%9taN5cEFKvr85UV&#^3u!>c2L6U +{s^5HeV=ToWtpYr75)M#|^q9=$JC)WO#D|a;& +Vtwm?Zw{;e*0-RN43uD5V@V*w4Hslmkrv^!L*%*y_FV+&~ED7IYQ@7L+4Ii=gaqL>y&S3J7+nA9kdO5 +D_)1tZrXdfVedZL%LeT+I$t$tFDu&e(JtES2JKZvd;LCbUFsWO?U8%c@bgujcAwmapRekE-b;Jgpso4 +&(>~g(2JPj+v~@4Pv3DPB!&ldJ+Mo8(Zu;uF?yH~o(Ox!aI|tKlCY6TH`)C{XemaVF)80>YdvEs9UN& +euN6=n1XfKbTy>8G}Yw+UyJ=)7g20q4DmyJAF=e1Ag%SQUG^E!aGA-B3ZgtoJjcAu{{^Y5XwK=w%nM5 +^>JLIAEcP^X+GO2;2Epy+_APn2#e^?|A$fLl`w0%GS-8YO~CSsTKmU<43cL)uX|0fJWA!i!P(T@`OxG +E$jbC(DYdVlDwd^Au$P&}v?$$yG?jDbxwRlVA{~axz1~3-m+)UFHZ~%F)a)Y1mUJK^zp7xC@l#{3N5Q +bv_Q`vic!m%!8|3S(Jvx4WX`zNjAJN#{hLx7{h&V9*{VYowO&Y7pJ5)M0p|9PN&jG*%qO?wsO!2wp1T +%YHhI=V>Jnunv~Xs87LX3+L_D}TvO2)1uHp;=r!_vO(1hHCG;#=QSob)vOj2|Tf+ommnG4Z->h!4!K@ +#%fsQRwGK?z~TkNfJ;Ds1rRK628zQ_Fo44e+9s8o_@iE57gvzjHQ?4cGx=}9iOKWH%xQxtqO?qI_M23 +}fKHCr)wkS9L3<;d|KeQEc5vODPa+>txz`|@_+NxR#1eBbTgNn8v@_m20~^&R=dw}#(F_k;dBEuVuvL +Kr?}4+(;w`aPSJkPmLx=|kWb$MfmBBhHTa2yp@1sF70evF|*`d35?C8jG>YR#Y!;soP~$w~Lb&)_&{M +Dw`N?JPlvNDb>?SDhKtt{G|0@CYWlS%7D8|G>t$hcw(^p7){SsG*62~mQmkqktWmS1WPf9gJ}I5-bBoVpoK~ct3JX|gs +?>vtmR@k200b}3(yAKCqm)P%`Bem+7eZ`GlNohZ8?-d1ZByE@Fy*z8k;;QS^~OZAgR?-u5DhjaKeWz- +eFz}IX`$L +M049OeO1#Iw_;M21&GDmTWz>P>~uxp>?yThivh=cx@=Q>i(9m>6I{&1{bX&NO!w1*tfx+i*c!xXk&OdG3bu9V$X#{Q~guh4Eu(CGgAmodl> +vtb)mlMFZhUA)H=KSb*-FsZvpWO$SZh7+79rdA$;B)~7L)#m<-KPiJlfx%(I6&0JlhM6B;+=vgy1vbG +hy3b3JdlRM?caLHDGsw3-Me0o89^WS?tbLM$JfTk{=IET|qOe6=%GS|X +RlHgIaG>wz-p=2JGd>l0?M;YUg%NK_B(y`4_l1!HkVZ0u#| +6zjOj6tmgGh{16=2RIicwzKmMS3Yr?%{4jnTB`jg+lo^$enrQL$8UgL~_yM@=hBa4(wJ&B6umwY;c!L +LnY&KgQz4ZHwZ;zmgEVDAFubRpw_JcFKKaT#~ztC(z9>kW&|>n0csmj)OQi__rcUv3#+t0kR;HuVfs| +O&E~nQ>lv_rs8RmYR)ByFmqsjVUk+L94Pog6V9rIidGTb;4XkwvU3er{@j+I*PJonO$!1wAxZKq?Ljp +Ff{7tk$x~E;3w|C`E}&?AXp$GDn;7&tgQ3%JcL$GKun{eje1Ue_=f^;yw7lg}zgAK?M$@4R1Wdhxw&ZQq9-y|=Av@xTW7!x0pB9Pq(_bu7A<<0f^^+k#6#1G-R=CFxPT= +yQBlbc{pY=Ak4q>(Lhf9v#kbhoiz_I4Ur#S3{}+zR*3D!eC-!+UZ&-V?{;J=wr}ViWJx-SoRq-)g60DrqtQQWHF?eASyHmH{i^N05%FkdFKzq$4&H9GiSB*b#5RPR?x?-q8)fBi;c#@=( +Ad>VQW|o5r7fuNLMU1&vQ@BgnR7l)NOm7VCmcyg4C(Cz=xfM}E0I%jOZL-I~T>No8hG?-5dbuH2!GgS +ZwgI}0I +ng3HU2~MvK~vhN_z?R-; +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 +*@Pu$J6)75dO_;gg8*^50IW`HI+&G$ +kE-`&t|PC%5A{z#*RJM@cl286Mg?r)i1-43*`cMG}e&1c}`XbhBCko&i04eXqdF#Ply5oNrHtq;BZ`uVa3qQM&my^%fm*T1^)uZKAud=)C60A6I>eXg++ixX1r8(3&Umg)pm?~V%<)tW6JY9BfAdz|EUIa>EDD*KrCsn&E2 +_-n1J1r}HT6f8#3D<$&6sjJv~LsiZaHHYI^5Bsv2n9m)68!H3{bSA4nz2d_c~H7n3{F0MM0jKw-aa{t +ZQ2b(LfC1UOej3kDQKwsOrz-rX5FEQ32SoOwkcfrgaCLWG)1f +^DC72WJpx4qWHCz&vEU1gHQx3jFqF +fJ3NA6A4aWN{eK67>nCYX7hjQAYRd6Zu1E#*>Y!PR)LTny2oZSL{bg{h7vzRhQv60Qug{6Qk51a@-dr +RkKn>?BXn>{95vwYhAZlal(}M3=iqH*ssIn%l6 +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 +CS0G*JlQSE;@&*>C(}9Q5JL(gtw7hr7K +G~^~NmVW1i|o5vJ8>Ug2l%)yvb!8&#U&clb7>Wo5bMR;P*bVEs?+(r{;JbvP(95=Kbqjp0n6`|GW$tJ +6mQzGVR)veoF+au%%d?{X~pwOL0 +F_C#D>w!ZR}?Oi(-8jLgD3rOanl8(MC+Vi{U)XduQ_m~|Gmo+!%sybq(TlI>S!3LR8zu%*@Z|9Q6pS9K{1MT%5WV3dcZ8E_v;^T6@h +^nl{j7$kcU|06+IlV80$_Z+`Ke%zv-pQP{-COS?>%#yF2yO#QFq{2^uD@(7wf;M@b9u`ndFlAYt2CKH +yqja_HSELQul&JFdEVOU(A#B5k*;Nkx*b+3cRlo0i8QM7z!Nic-%n-~7Jb%9p5bAnzI4t2Gh6DpTHtB +3PxZL$w8}~q-gU*cn74yP&jlR=-<(thk2lK(zxStj6h3CQ4eJ^RZU7I_3ABFDbJ`Ix$ORY1N06yPZBid3AC6;`HQ=`(EP9X#X$MEByD#{u +k4$z2C@peHnL`8G~AH9G?TM7O;H(S8Wv@(k&pqgGa^-sD`iTEeCv6in_r;zk}{bJgU%3G2lv?(lr4)y +lSw>=U5*y$JYj_AP$#}JZY%kRE;_&!PnQx(e#ynOv11%12b+B#EZ(;i0?ABl(VI7RUCmp|~ycL~W!;aRX+woqpRMZ~LtIXm^Wa=)5dO^3YeiHy8 +|_nRf}8CSIOy^}PLM^D#DS2gKjOS=2_z8k$oKC3fzcnwS{!(k{)3_FmE?o6$|Acy|I4nl@W;(+G?9Tr +;VAaWxj=vOf3W35_Kvx^IymkLVgcn*n2kAuq9BW@8=^|JptmDAK(zKEqK%J{Tftxvn9HaPY5Bzq;qbK +kPW2#eaXd{}q6L906F9XLFd}zxC;1{D(7r8&>@-c(9rNThYFk?jD-E>KhRa(6+5n-?X#&S5e$lM*P2u +`yYJW;-9^Cv*g`m|6m={t+sy+W^c=;zjGdJu|x@e&^V*Gi^r8T8-e=2PC&la=TJ@LXvsd5ZyLw+gySO-c^UAp^d-&(zUtj+oZ{E+|eTi +Y`)hDB)$B*$xKK1owxHtNZd8YEavp3Isf#H4IKRkRgg8z*z1OIzFGY0l!ctroHW%m?ASUm^b2igVkSO|IT;m9r~Jh8LLKWQ3(J=GtudVFn79$2?9tc3QU+@ESQx;PDD(SNBH&iSn8J^L +Z@9G%r12G$v|ws^wT?~|$dn9SBRqrLX^O?FW)kd}Zq8ETD;{CutLE)FSe~OUqW8Gff(Nc}g9pDfRTQWARu#HVf>7zsj* +@TAp#VeA$YtZZ{{Uq9x!g?Gx=X!<4MBhs$INI`#$_J5f^Y5+sTJxwXJRO{k3|JQY(S-Myt^!OwTMiEB +eR;=spD@G +V|L|>(S+U`kVe=0V+^Q{I4h3l7xzl2aN37+I4*?Y@;*Lt*bK9f)$CN47(*^&elGa6s+mT=c;n&N{cI% +RmTg$lazDQSPY_8+ff5S(ZpO>2_fjp^6>!SOrzS_KPpAK&Lly~A54{V{Pt?$y+Q@bX#?QFg79>cP*cV +h%1CI>BgQ4O8s;~f(tY>jd{VL(?pgyLMfceD?JZ}X%#rZ`TfdW+Y}*z0ijQPBG{_fmA1q+IX$NeyA_a +7&ih{x9!O8?C$yH_qL9)QSqX9nachXmo3@TWz+|rM~MXfT8jSO~AfP +V&&JP+r@#y6nZC^8`thR +N@4mHRcpC6?AnH}_7RaKgw|6;arg3wNWdo-AV=_+JZ)*H_{!dd|Yqdogq+I<@RCMaREd3KkDMHX(RL# +g`k8>M1Fr^=9{NljT{nYOhz9uhvlo2y9!i(tu2BM?$>HXM?tG`m~-U`2QDBO9KQH000080LuVbTb;et +fUpYy07NPP03ZMW0B~t=FJE?LZe(wAFJx(RbZlv2FLGsbZ*_8GWpgfYd97M|kK4Er|KFd2jd8Gi^{Ts +<>$NbtZ7*q31W1!ZHYv~=hC*Ak&8#d5qP)A#;l6ukh7XZ?c)fQuf~+mh3}=S(_>t6@U3`1N)_6Z^N!`H|i5FS3k*?5$jjT#1y`1*><0{dBB%Mb2)DO? +}TR!Cn`KJms~7XYfT-jKh3+UCGsGnI +H&P!<;eLFTrT#Y3D#ccle@Inla`ozAElM=q45Lg-vgYfZNRzTEN>SCv8QY3Fp@+$eD=}j)@%w0mI)c} +(t+FxDy`^VSlH`03_D@Hn5pe?5yCN41K4Z471g~LT?sp<*xe%#HkuKv(u@6EOhiWZoj)?xB&PT|XiVb +*H=CV$bNQrDSW2nwG$~7eTksErpgWnZ01rBu(ia|Jh7eCCI5-w!M5M +JM3#(^lBn4iQYEV9nJ_M}v +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 +)0d|EC;(MeJ=p9J?MeJc4)?L7f0vkXce}lE +77$Va40ycA(T@0CR3km)KRTVxf-k}E{H;hNx4fQTebw{?P#*jP7*wwg%Y{&;t~txWHz2PG99XhQ8GcK +_VE#PJIjSCbQENVKkl%)z6b228JR8nLJcJ>vJ6woN*}xnK4%&rpK9h0lS^!XEIEWZP?m7S-I6nbQv#k +K!w(BI~HVrHM!GwpIRFw3bRgB!34?OELi=x0~8;p_&MiSx7tLSV`MnR7gX+LvN>DHGg6zs*l{hXnv_S +io2>&R6oaBy~qb%b!`?_b!gT0Nx+8HY&1mZlC`>c4QFmWGkkI?OQaWj+c>oNRl2ZKE=>PGE^59)hQY7 +ztyQ&k&%nA}0eQA9bcp(MCoz9>Uu52z)iWB#-kJggNt*8A8+h>vol}95FQzOu-z&dNfS)jE5lZ%30;g +@u}Ffe1@aIoR^!=Q$80<9Snh^u~$%YrjlO_2N&RUrdXGf>FeXT|Ln$N;`m8)T>-_xmxg`7_PoJY& +P#%&5}0e%5|D8#q)9UR;=3c+^*ar4ntR)9rZWOvi7h)2g51@#%m@ku(uU(Cvd}LL_P(#HTrwJYYk-;k +$`+bus)&~%zk8vAaXj4z)8iS>uHos+6h;Zl2%v(h5>29H$l^2$SDWwh$e365r(H9jXI_SMSO=oTBOw~LfCNvC6Qi8a0 +UO_p$p;y?{B1yR(XaLr;HyJJ3Ys?cXirdS&*i05oa4z^dDDrdHj(KX}&__?C6_6%DO~u^dL*!WkGvXZ<~)_mKf4@f8P)Ga*J-|7(u*JhcN1I^2-MH>3`ms8JKxhb#Z%m%rM!FjSBnu!zC~^n7A0Ho&%G+D^%OlZwrvYY_Sn0; +O738gO%nL`HwdbeZN7_%JFwDk-8c{g!;N(+6F4hGw3ur5++z2@DM&Dzpna*e2U}lWAq3Pr1%tE;vO!f +b$OQ$@6khw)rut~z-63QdTgU^{9NvOB1Z;N=(>xRkDm>Us*rL46eoR`3d;j2DJ~Sh0ijK8&v^nE +NHnLZIzwk}Xz{+>wA#?jNUx3@X{j!Yb%=a!7T6!{Knd-3B5a6wxMF@Zo=M!klV5L-giJkq`AIhIUIm-v3uNSBkYuZ&{yvyvl`@Qm=MgIT-G&qzp +^T8(cSr?0K`BasbfMi|cc3rT0D1^X596TroV-h5?B*x-i-JhBf914C;EGhpTz4`?Ymh_YY6I@Si_- +?}dj)5Ff4bhjwLZOf71!Ijr(H##(wb!(2s&==JPSXWMmKV*;ACauQ9mqv+bmTBXInCsjg?fdsvv0xOs +gQ{t46?P2jL!{U=`@lb-wgQoxjEEU%)hwax3J2qbKS&`p!;p(#@e@D2!6RMLlREW_*REW`zE-QGwG6z +v%hdWk%oq{9sz4808oko&Keif-^9kwmBLc^rJE)mSFfY^ZuETRWi+s()I6Sxqwqio>0S0k5=B;Rb?{-SWzl!>=9(h;gf3ET^-Py@O{z1nek+jTWmlLmV*REzw7 +fTk#kch#*cw%m$DX@HiKE8q&AmLGW~k!||LYjJ6^0gdJBE{XS?jLN|E@A|A5;`=9?}ewl)V7Pyn6tH~ +*QeRMv#Iyzw|Q_gn_JScax{kOo5ZZx>Py@mZG*Mch*G)ST;1JE<>WOaLXYXqL)QxROHmraPk>= +?;8vjJ=~Atjhdb=FP?)UtKmO8PLQu^`aaDlu%-FijPN0JO-VE=0bI1-^enqbQgBI-fE7-OpkTtzY_g?>7NouWME+msAa4nX8f#nUg +AD8Z}#pD_@43K)!{<}Hyy!1xM^&%Sh`M^SJGeg5)g&DCV_i4UGL^LB@lToipzQ149oHW&_mqVSN>JdP63o+2A@`TgaX7?1dcF1Kb1-W_)K+O_a7$ +9gZkx!f#-<}r&{^}s}t|cd|Z-vCoJoG(TKQC)dfxZHye(07jEac7r1cSIQ% +NC=dPp~N+Nt5|n368F4s$-x;d$xp>}2 +@L+an4sjV@&ChMgHJ+Z{z04pa_UkR2tAmSqBbTNnINfkh91q8R7L1})YlgClZ2l){QMeVi7Mxue%Xtc +_g+mVCRY&imR_YybWSMR)iDvhIa(GMGgTiq;iz-muWoSx1^3|S04GrRbz{3u^MrvE`|+rHKw(`T}{4r +P>fE(LiVCR5aPPe%vHjOO_!es&-A(hgjpuyqxgJj8v21IJJaB9DlJ=foz+m6*3!3H&UU76Z(T`?!D~R +iYzV;kP1}xv#+NkO2I^_>6Br`pi&O#E|NMO>GfjfZXSqb*-faaZ5^W +r>R>}YAm1!^>=+JRNG$n?u-ee639T`2C2DpHS37m;T6=jd(v%Jz5hQ-0ODEK*vD13u2WwIyE}HWC`^c +)Hz3Ci#fZ@!YQw5skf6&W)sx>E>kTSsDhImmq3L2(c%BDGoj2&CUkWB;6jhi+8B`7PFb&>&nW`(_JP9 +4dkc2%c^t?jrABU;~O15SSb4YR$nQmrXp??J=c05$NzU%z#MN{sDQ>Xd9>z3u72r)EmlIBCOXL^qevm +y@idVaEZRUHQSnk7pC0wEz!s3kFC|Pn`mgVe{7%--FtG_|%AK@J&;KH9Svuzj$CuDN4fUO^tBz#W6eU +b@h6ceIBU?JEf|MM&(&S2}&i<4kRlBR=MwPL})1S!GLI09hJZ~q+Da8S}J#SGS&;Rh%6*n+xt$E%TZR +1kM`##rxo^%9uZLL-=L@ZFeHum+&;gmfAct3~%K24M^s^w`w1De2% +ffF~=4&vt46VUE;eTh&nMyDLmZInO~#>nG7(u>XqqDuV#4A7T6~RM|5_gS`5{dok(3vF&-ZSvm)bkOt +Z-D2H3em{m6rXQ%ei+Ce9t+Hu4~D0P?VKJ})w?+$=d?%tCehY)b`FRlRkKtP0sNyx76H|xkbSx>hMCAFm3Jxx@pB!T +?2>~vS-{UGlvHUKwWQ`ap +8vC+TUQe~kSFK^`Wwjz=ZqJXQejCJ^53A29x5X+2c%A6JpbpO6*i~`yjMH+1)20y9r)NHI~%~}Q2*~L +ypsk(GfLeOQ^Zd3b}A~a<*Y6?Oey)4A42aj#C$t3Ri@ow{_(n(O5Jc2w(Y0-_=5Unu-i6SfYogzuZ%U2gIUb<#mO>= +ep*-Oy6VUDw8h@diq2*u!fyfrSeQ4c$vQ1nUJ$$e$6Gd)!yJAT?lggqYFdb?`Pl+YmNF&#aU73TEvT% +&V2eK2*Esz=DGL+;p4e#d4EZpd-1~nP-yU(t{DLlUi?tIq|hqAX7uxC?r3ueJ=I-OnBRrj#$&3JxBSZ +mzUsl>iWpzRnyMMrbD>q4Jf%Up4Cv#o`-DQjzF^ZxAqahfZLYYsbbRL2!RftIC+%2rf;E`=qYh{tsh> +jK&ZV?sSB*qxY4sbiEiSfxMh8f=1!N`KAIKXhq1a>R#VitYc62^r%Y=H-t4JBMHxnV-SNnG6YZC@Id(`+VB)-FeTAvP10rsK{)lT=wI6G;YD;iavc2BgTpx70N-L;2CUTtn(nW3& +yOgBX&MH;ng$L^AbO~@-HIfflB1oA2B?zw&a7Sv$VzgLlRo5gL{alcm@`rjfAbYIs|JuFqZcv8^VmJrzN+9uME +QiBbd#_sUExl6et=9HiY~^JICk*DHqKL1wphin|k3(xHAsI->`K`6inMne+x4+--^Zow*`SBs=vCrCT +@4fcgYp=EUUTZ3Df1I;$9A||;P2;$Ioc_;3lx5MQ#c9yiA=F{N?l?7!WeOzY&#rV*wrj_ZJzpX+HcCt +U3C*JV%vpUoVX#+m4Q^3EMK5z%JuGy(lwjRc6Wse9^1|5oRkxViXnr-|$KegiQhCT?FQ$31(R<0k$Sn +m;X=hW8EB^A6KLhQCI>$*k<<5t~(8BIFQ +EYrnsk!$MK*4+co)K+LScNhIOGfCe%mfPCX&e}$ndAI{Z3cmi{?7I3U&6r@F59=0t9KiYyOEsyJRacV +`s;|QCZ&2jBfy(H^DE2(dINuO6IOX|atHegBbj5JF6_xx`t>6pzZNv+`h4lP{P?-35BMXp)Ed6uzdqb +WxyB2L(kNouB(m&|G+Ty9d`d{J|FQE`9#9ksQl3Ngs1X88Ppr=iTSyWgP&I-P(-sqa_nyVx9PkfYt%D +m>8~cora*u_>CS1SybLK6rm|630EGxLI2NfTqcZ3zg-k6nDbeT5nP669Ab&pzr9w0V{BP(Bx(R +HJ0PNY8NZfFi(NARUE5!6-6!XL@@1{%5eSrXPyI;>fhs=4#H5e`dAT+7scJJLOC#Q`zkLj;>*ja2p>> +N>SpuC;#)Tq@gY=8?Q%q%y~2}`z^l*t0POoL)80r;80a@h^pNW>Xx#Ysy=XOO$Hf@u +=`@0UN}SiN4-YuFe+w&vY2M5ne1k%OIpzqiBZVP`LBTCF-_Uq2)ORcfIR(v+&M_-(2|s)x*uNRabj)o +17k30DYksR^iV>x2j)`t=1OYk1KVEuK@W+V>;ITIWbHqud!?`?t77ad#n-=U@&{-CdP6)$Mw}+I+!lG +>LcgC{lvGJc8pYD}g5_`2va31v=~b;ImK5i&z$a&>!GNASZNtfEzsQSC{KlBm&=0e3k1QkZuaQ +6Q0-X0EwIsFBpQ-GZdwii-3L~%Ns{5>1>hSk6Ro)Wr*$rtWk~HVpO-DH;Xp7TGw3(*Yx$5?+5@VLbb* +>PHTWC?Ni{qHGwto7|ir&c{V7)5pfX@Lz!CM61^4U<%C&E?{V`MNeG&d8Q@zke5;BQIKnTh#e(X-58& +Sw_AclB>Kyf*@3yDO%~t2Tb$+iekeTb^!eWM%9RofJ&pjBfwgJn*px~XKt}RmgiUw2*A$*Z +24G&M8-(9`}}NAHj0ej!?=O0FCdpj3OsBlzIQ3W_)ldUg5z--S~lPgS<^(jb3kaq`OBFQn#^#Q2QaZ$ +XgUkh(b*+5{T1%m96OBnrcO+35t?uoRcE_^eBNM>_F?d>+5y*YAcgiJ3_&)XYI7B^37eFx%f!nuPdVh +NtaSE?X(d(NQikI=AyD1@&IBa6yQQok7d)$dDBs%;Y?~OG+Ks6RWM*enGCPht-Tjgk;hgRSKES8a71- +Oy#T>a$6EnTqN01HBJC2uB^^117zF!lwfb`l&UM!=eDuIa!N=#rP6tU76D2=C9WepY9AS1m#5UPH^5@ +Kh8h7e$+I9?+fCrlVCpVPos7VQ1jKe@m3~DDX@JsAj +$I}@n_huwZ#eSVr}**EGZ9p&L7l_g7fmJe$@NPq(bU9%6hh!vhF@bEQC|{TPS&ewbarjr(N71)&Q6nr +PD`hSExsv7cS$0`-Ht*EpW{gIWbinALKpkXCrm#Albac&*qe?Y&fAR-P$6?|NxJl<@!>P$gUCA~wMsgC^|L#HgS@>Rf!yo`+ypJit!VrbXAhX1JuK2gU0W+Vr%G +2q7J1%Oukb`9P@avo`Z;{n@j%sD%yQHW6$}c2$Fs53-_1y>JyUAshbK=J^OFc*+TTS8?jrOys2sNG3a +sJ$WDWBPbDSD_RWfk|6r)2+U#f1KQVd#C^-4o*6lV+-8_=;@o)x;eR-Q9ev<3^}X~C&-#9Fz`!)~x9` +>-|iKCo0S@Nv8_yv7_KiN*av_=e(?-3Y1c7zaB^v;c!mrvggxeX7VSyH5a2Ji9f7_s=0wW@hzCd~vjg +w|Bz5R8 +=9?X_c*~VhFN`E-ijRUA9ohv%y^9K1q>;jIlVpLQ?f^uK +bFEJM6BS^AQ?@$$eLKmxqrVgK2Uxr62!y|e0*8L}+BNIaM`7-hLE@N6Ea78g%9A1+8XwlYgJy3m}^7r(%GUz +?hc9;eatyvSznf4(M-wP8PkiH7wM`{%C5-v><+zT~(q;)`&Y(FgUdQ{`BCK?ZvE~XS|Nf5 +C2jqu9$Hg5Ab7}`&BjnpFs!(EJD57PB~Gb;nN +sM217UZUCxDeZKiOtn(X&V!nyw!{kq4IC?!2GGuan_V=)|%dq71WMh}1rsq +TR14>7%9oHc=iuN8Uzr@`yj%Ldt3yxs61Tj_gD?Hf|Nn-ib(=BB-EbJZ@D}~yZ@oM>MB}Xj}C`+wsjx +#$@w15*wso4crf{jtWM#^AMI{_|TEweh)rcZ~DV^qkL`p&an2ja0pYL9D;S<02m*O;LYQ#?!M0kg}BA +3;+;WaV@MoU+4w>MwEIg{HUk2^xmac=nTmRA+n*7SKK*zx4^q{+M$mOI3 +MV|_Ltxh?ype|cZ+`b-$cY(0C3&e64&ghUl0+Z7zIRcZSR$&(x)q;{Rzt-6$M&omkp@qE`P$%YtmbkY +|f6wr+$L141>vJh&gZyF^=1jw!ZNgso-%`}vP~Xp0iy3M~LcVLwg_@NHt>x0&pldmw^bqh9wzLr&LOe +f~?V6HmXvdF&QoRlpHOEH>jX{K*BGU?lJ; +_O4)R6i**MHyVmrIccIVqoASO_C=GFyBj#|1R3n}0sd2ggOL8U^DNOs7GXU4s)@BBV)I1Z~wNX|K)!# +>n +(vOk+Et4%%!ii;YGVdr;6(`1?&EfBx)k-$};GgU%TW-EvEkRv>ZGqnSxayGM0NDkHbqtvWr +SWUmSCYPnIu?>z-Zg1%6DB^XjkS$PV?lpRI +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 dUY +NB%UtR&{@(!zXGv4-LEua=wCnQ{uG=O}D^sUh5RaIn!y#t>Ixp9XE?^GYi#nsfanAqv*hywqSg8Lb=QPvtqb4rd%HRUYAio&<)pU)CTzt*p51 +yc$L+^H#+Oy_65qAzhp6@9E+`N)3TUmp3#_1Jar+QXbU=ALG|17$p7^5%+!M&x*4VT)cHHBgXY8*M3^ +YSA@55dE=yE{At5<3dPShUE*B+eC@(jR3R&Ke^?^VCTLynGPjvj}my}OcZkgwF!YBLPU->yRA6u!2@c +TM{O52X0~LGISTQ;S^OGPddG97lHda&>hff9o<$EX-xQ2Mqi?mr~h%?CZavjnS~mIJmfxz4S4FMGBl< +WO@p02fe%C{Z2>3rOQ@hw^dr|^@AQf5wtFOKKBQlfTRL1d+~CVqZu%+M~BODgJz|SSJGD~W%){(HJ+` +`S2pp=Jf%8cskSyQwV6lK4zX(`>g>toRkB{ch57^(g?PnrK2`vI+gNMU{)T2xJ||zn$+bLJnal%n)g` +9O8zAR+bQNJHYSez(JaaZnX>yKM71h#Hds!Q-mz>Rq0v*TwYCWz|gu~DG(TQ`s9_YmD_E+hepzBe(cG +I +L*?)q%xF$nZ&yOkLLN}6eoz3pw8Bv3GIW2D!`L*a|I^e8YFmif9HQ2ShzcQWZS2cT)V`WQ`6>UEEmBJgwAGA?#q67dzo5qBGiM-pP9LM)9?c3*@N-(z3#dg +Bu}iGDc|5Xa*BRKG_U=?8m9+f|yF^L8x9YO{tYPn +P*A)a*Nf--jK?^3bP~}I?PNR<~fAH6G#S(i(pm>O*hcP{X)|<^zeP5X&OC9ph(lh2BB#*J**I#vhd+K +U$J`Y$MnevClFLI;;|Ycr9r1LQ@1c!%-ujfJZYn$!vjW2d1cmKfWj`ggynSDmNF +j5{n@sowN0pyJYGJF1#IG7inKg+1^DwheJUK|2w3#QWu~kj-7(nUSi5(q*$np8>AsB^Ml`{3?p5o(JS +|9QW~Cu*$iyZLr?`nxB-h4ntH8x)bUHCtZ99dm_s`?C +jl!cr}%kX;l3Z8qXV##*X8$ZU$sN3-t%0km^_j7ETX{Yb4SuRwQc%)XmXTmaN|H_XmYi=octLZrl=T> +%-l3EY+jZttEsTJe;=c*Ql}3caPx-%4Xh`TvZa3-8i`88MO+1(;@UWD!Z|ovFok44VoGy(2#GdY1WLgUk^-jfXUzd!L5fmw0?&kc1vq0ET~M>?ndH)(AgDYe{J8M4K;hudwYPrQat +!7QJ6zXv!BrlsnB#!S~6RKXscC2$jP{<$Lo +(udMk-Ks(H6H$wDr@h%D3!D519*$DYviOMQdbZAnPMtXCBn6DG0rx_Fn;kCv6ajUR*asM;%(LhT~v^)dT<*`Aa387<~$8H1#dF{ +yF4*3|@`=`Oy86)9w=$Z3shh%nW2KDM~L-=64OhUO=-)A4j6KZrstCW5j&933yeRyJl(lwfbLXpks2q +9jrQsbYw)#LZF)3|WoT&!&0M*N|km(P`KO1FfO2wQTN#t(!;h^VNg%%~npQ4&B3i7l}Pm@GqWX_!+i- +loy;Rf*$tDb>Oi$4g1J#> +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 +T#68!Iva<@P8O%+z1 +)agItL$=2sg1|JI->yqv$)vy83JF`QiyP +_&{)+MKEc`lWWGsZgEN_5;&H7Ohy#AEjf%2;dk2K;AD7t*9IbhhEwRhzft5dSool5OfmKM_n`nUk +z*^O>m8o*FsP#;XHWagVdP2G4J`gj!{wAn#31K_;P=MOx$9a7My-FF9kJ9sBtD%FIuWv!rQ02(uh@m8 +yIpzgF>It$CGsTL;$@QHQkVFE;3kR$(}JWQo%9R-2sQ5b#n2`KtJJC|jM1K@;`v@NKBQ{c6oP4KwYZT +~s?-plni(954CHlL2iMQC9eG@%Zq>S*Y=7|>=H;#rmtQ6GO_sXBq45no&3+1XcjGn;u%(@HYLzrxEr? +FP)ora+RCp}nW$!=xmNlByF@T8Xh64;06L#A06GT&Itf6RM+Lb1Q*Y;_D_g16DAj-*xTS~8!VaKj0N+JCa@dD6dX&XJhIz+uj@F%Qe>*V +LHyTng4%_b6?cd{-$^k2s>Fg7lR^!mLu+w*ttE)+9%Fq)!@6gw*vJD3$q3Lg^jSckE68 +iOMN%d>MqPZ4O{~n)-q0l}%W*pEGLa2>WprM0@;FHf=yYr1%3yg?Sf9NyQ5uPc5w*Z0H$6iS06KzS4M +0+caw|Ftfxu8~a*IngfpTJAl>P88swiUe{w7h#Ra2OC2{n6`T_pUUKbV&ySuR`KMtd`HuI&L=(sY%ai +yRpfTb~u&xqkz4@#0Azs20vS%d-lbvz4$No5S~Wr*797WMLExiWf-Gyfg`fjws_07G=2bsMNM2R@~%= +mb5qB>;Sd(!35W2TXG>KdlW=e+6MR}8(?h1}M(j`bk`ZfR>sIQd7xUod{*^k}rzHKp#srY!Y}x=uX~m +}rq<#!K+wPl_a<CeHtViU0=$PG$9=k;>yzt-W53q{-!dT5YRK$4fJNq_1<~XjNK@>zbJPW0XBe3lBhNa +eq_=7EF*2d6rDJ|HuBAyjqsG&!z969STSTlj~G;ajmYo0$2i*_AxEiHAEgcMmz-xj4S#Vjm*MM`(tc*!AYrTCLacq*B`&KC?KEH=Hv|t`~6qPb^W(c)vQY2$b +$kGyEPO>w1k`p~luE-Dm{J*A#h3kUKA+CshUpl#t)lY9OOrYlY!ZtwvW4ao7T52<#<1hgTWD*2gw#qz +j7VO*{n;Z@Hk@Tp#Jw=^tw3lX()|GEMA8vu-jDJBo|TIjN(#bHr+uB +ZB&%8M*sVj5?0ps4VYK(o!wA^)$=kwI$1WX{3jJM>B{%8HgSqS5nVQxws1e{c)}FNwQ?RLAU8=xGh~4 +Z*qV#+&OrRcM=s6O?JR2QZaZFbb@G6-6z-!ALu=SdwrGofR10f#p>vJtqpido_qGyBJ%$YThH!88+Z< +lV69kg%})(s8%$1x8{Y#dUsD~G3keYSmrkpiSDl2+;X8xXjuD_R-Ka;rFp?7GsdS<0X@DTTIGlqcC*rWO +heyaw1zzVGw~K!n3HtC6h&~+8X~}FrWP=8j7IS_DKTkeQ$8@E$#_su@#)*Dm+;#B3k%UzOiHd%=SApC +=aDF!C;GzQ0B$K{5<{A5c4xR7_N99yC92QsSR@#59=+H=h6DqK1#A|)e}jwZ!8gH{IWXvAx|oeXO>oXssgjxCNtq +M(kc%k+KA{7)ESjfrLmf;%dRNagjU9m}B|knf6nSVuOFE~!m+pHP>q73O*$4hd_tJC2+)IH{p~$8Y7; +KS^=V+CbTH#4$(DD+4alFv^)3$CDDCiiELd1DVCg#8+@L!-l@A&p!ffKYkP&M{Z##bb+_7g?@hCC1$h8(PX>hfA%_#KW`GpDAm^I +?YjN0F6HIU0VM|nHXuV^*)}sg0|X4L7wDw!4ED#DjB~xBjU9O@d8RiTqeMM2M^{rbeC&+?3g|K$&K7> +5se#t9cy(U5+@$2FOY@5oHz`Z4&c02P{1jm7lNHGb8u1FbtpG|zW`9Vnu*v5z(#|=Iw9_niPEp@&KA% +Pbbe6B4fV-RVp +%Ubxz+()Dg3~~pCZQ~~LW|s1>8N;2NF-AjDxF&+2tufwqd_66qlx9BvNRa|DtFZTbC +4DK>?R?8K-Cd;z%-cJkW?o0yeK-s#JA5-_uV~!VE2hE?6-@giV~iby0DlIdU|y#XTS#jFbnhmEyQ^DM +vljdlZL+{P}>g+^$yH@W&ATO;44^v8RquNgI!(7~x%@bNqVs(7Q~jusfUUEQ%WgsIk-N?%M&=Q5Ois$ +?Q8vlJgF`l^%J67!O!+1uVHr@U2zQSV38oGacpjZ8#0N%1O%-J*u#ENzOC`b`$XYExanY^c)Ck)|S7Zgba0Oc +i&GM)j+N^Xfuivm*Hdt`CnT6VgE#E^mx56&`U=^lim@2x%i_)zPp#_0$S+Z)3Z|-VXNMra%aN1IR@2<^Lep>IWp1`;+hSR`0B9Wh5lztD<<7RX`QZg7j7o!{e& +AD!B`Yog{o~)$-1Z>tw_^k=ZFsGduE6jF)L}p!bgfOdmW#O!^;(v=zr~WRW^Ap{wk%0ci%)Y_b%CvfA +D)GN()0*poA0JmSCni8_=Qj*j4b*{86K<3Q#16oyRebwc-mGIR9=l1xx26fppio8D5sx_!Htlcw~lCP +-;lmA_9!VcE@4l5T#ysi&7-04x}2MZJtJHV`#Wdg@*vwfTG;c3a8SY5P`i}PzJ3Gw34;;F|80S@O|n` +#;x1L_S#%vVY1+aqw_TS8_TI+Kt)o?8%WXN+7NW_Qe7j;{QAd1KZ^tu1)2-y`@SJ{_7c`)vs;+k#ib} +60bp^R0L9;QWTtu3cjEwsPo&}LBPN6RjOl!D>@L$iPp5{IU(n$!ZWZ8GeWc{v=b+kL9!jsLG2q03Hj4 +6({08fmlmH#9ulwB1`;TFndL?674jdxZ +89)Lrx|0a3r)TO&p#Dh)8jlP#4#u>YW9>;t2FfwVGiy~&2ZK%lkrw-RR8^^d!L({;3(WYjwv^;N-G<( +6u^_4}iSG%a+wtMvQ(Wwh0oobCi46?TV${g{05;{#zOPLe*W25Mit9bxMc(W`GQidi7WwAy{}pd`J;b +5gJ|W_Q+4MUGnrquqrv>(US;yXs{M`*D%*+1$Tr&1Wd@MWPnkw6@NHvxv5$ceiB7ttL5U +l6us(=1$(yj5j;n-jF}HG{?+h`k5C2ah4AE6~aLQHBq=)jSy}<3vDi++NEZI+9PJm4@2w09I%6p;;SQf`Ebo40OG2&p!ZUhvzJ%p}SH+IfNN2`N}E^)MKPB~gt +DxqzV!`Ym2wED%PE=~?3*?_iNh{8m--9*pbM9JMm;oV5dSPb2)4j#J5&8ocIaI<=Y{FM-%j~z@sTVua +VJ)2_xO>S2BjNBXhaq5#frowZ>`J|f_MMy;d7p#kOKnSlM#Mny#7-P4SPZU0)Pt?ITbe|~tG(Qs^ldx +s6Sq9oGhNEQ$+B`x_G>ByqLUs{C!tysBvD_psZ#W+i7d4z;E#^0zUoV6{;_e|zlN)N?`X33%RWnR~r7x#3|GI#)%_M&5>0-ZcO-*Fg|7b%^H>LPOUo9bzd$tP+~a@P5D0G +!O6J7n-ieyQDi>&D|h0U4i!%Lepei?B0$1a2fS&ID{k2BkVckVXfDYIkq)~d{-$>Rl_*$!o+WEd<9l_ +pzOMnm<2nAUMow4?iQ_YH`GuA86@!}G4#sbzUEXQDY66|{!7T+k2R>wF* +ckzW-ySNE&>88?jLKjemfma+yvsnn}r21;rB4eu%)(2i{%b<$BS!lx6Vg2LiqeNK0p&+ps9Xs?h!p0AaghM#QJ!i>tPo7b$jh;czs5|8lezmG}Q`hvf%~$D~?cI1>nlR|@QOHq- +dlbpV^g$ZM=B1@5PN-daX}XgXCM2DtI)^$*(XWsU%@w8}X)zr9C>U($S(2~FKIlAycRV~64@x5&&fh2 +9qbE^6`Ag^-eQ5CBNOFbzs!CNtko2n>^Cd`k;%Jb=`z|ECtEjx)Sf1`(mCQcOyQ<-W;a$}hcym}gbP0jy`ru__60iDMP@r|wvV?eNB$smqzsP-bN}4fngrtLp8Bl48-Xkpxib+F~kp#pmBt3+d!8)h?YWA{Kl%5uZN9y>w9 +e#WQYdm;=hCi+*uOXICmoK7iv82#z5L^x=jyoDKbe8$FqNUtJv^kK3KbTT$GGJ02tTw*tKf>AV-s+C_ +x8$k5=PC5$#{nwp4D8al!3D!7F`Q3m8WfNvVP41KB*Y1IR$;i=mRm5_wODI*mM +%(@P#WkfoR85t9p%52WStR^K9$K*;iZQ@@b@%)lc)8g6*IVY>SI57!PphEvjwjVu`S~jen_KzUXPZ?oi?_uarqo=Thx1T6U)P{dj%0dh6$ +GjZ3|=U;(`mQ4OI`?wU@s##IEh!uUne0?;mQ{K5?;KyWar&SqhAu`Nh8$rETg9|Hx|X85m-wNhk4?9QNz-jMm~O&ewB0;vl+8QvHhhHX_Px2byj(&Se=+}LNK^*je4&))Mhr1xhJUwIrGXn>)`TLTgEXaN<-j}l9LOYQS +BT0|GSNjI-x4&j#AUfxO_>Qo5tU~UFx+k+jeuc_z3b64cx((JkKNOmNLD4KKE$5U2=ulWfIfQK+bPFp +P%;J!+r(suS%EnR&*LNeC!k(t$qmUlto0+v*ccI4L8O5kFaw0?cLAGvnO?=`T!dvVbLWdJWC__ObIw` +yb*8Tf8+qw +8a4mZ83kfG}3ZzFtkPNzlQ|1_{or<7LW0IP=mzv(zsfAvw4;@3Y3Pypcb+38R0DG>rDM?Dx5{^mSiA{ +vSc8O(qtfuS;;^aMae)GQ?fbQ)@q}^aFt!{ +hd&;SkkDrs$>Pw^NEXD^Dv{U-ArL+=7|7zlU?7W7yP!NaJe0*J7lpED=LRWvfcxf97UXM=VmR +$JGPa_rP!`nn>dJoI`(9`|hnCjye-g?<6CN9x3T2T&p)62*=%FmGD!3$+#Q`If#fhYO_9=$40MqPAtT +)RLnz}KTMRPKi1v2E&SQbZzNTuPiEMC@KsPXpCVp-Hq9ums}NAmv|%VKa${7bPclKf%BvN+oJjj=3ln +=~wz#b3zmK5|Jci!U$eu`C`yyRGozSQel`V!3w@iDThQRTg@YeK1kC)HaZ%c5xsJODd3srImylRl9d+ +APdBwmEt1ZLVE_iSU*u0CRA^K>;v5N90k(jKFL2MbivKewoSYds-Ug$oF2R){E}{7?foPA#3E`iub%J +whTs*6VZkdbhItiD2CrC{3SL2-o(x`b$Ov3P%^w!H!avl!+MWzt@#my@l?q%z==>K2uE2_-eRX^Q +*x{;7oa&c(|Wfyy>S&`|54-8%C&Mfh(|N-Ll$vQQ!&$9TK=AjMGrekE +T^9DNltEz7LLVaiad<(&>X{)kH^s6TB8V@JWf9B&2eB-udU`C2JAU_nCzgf +YF3Pyau&^$TWkC(Pgk)!4x-^yrN+U9{@PWOe;&ex8l`5&3Dvb)zMjSm#NY_PMfQ^pE9z2UWDC!HKx>H +Du3?XDX`;F@EMFA|r3R+#^o4DVrF7Ee=i~9@wxwg8vZSeOr{Cxs{AHcViZ@pS&2j0wZL}KYCI#3)r$KkXnLYLehcUwOr+Wb6mxB=fKTbkm2wOj?0nSg?rUPJT$=3KK&?{6u7^4eK*2Comjt^+1JdY1N;8IC{FMArMF +{)2RSeFlB~TjO>)GJszOe+jhu;-3N)LU@e8pv`YyOts3KYIzgwB;&7uetHlSN+kQbT=vKy=tob{R$&c +TNB>)XCUnN|p9!U3*B$)DWHy_RH7Vf7$4YP*g~hVu?>l|r4O$obnf(}@lBrZC(T@!rm*}wXy*jS=Y#%d0J`5UM8Qx$Lr +v}Y__VK$^dGwrK;PZP})3eFwzc;~b7M`^Ue>qBeT_Y514Af7ahL48JZ>^5}au +oQLoR>o|&R=BY!dchbqL$&-3DVZ5_|Y1{#?3w95$4o%FZ&v9pJDPgJ34CQe36?|`wZHv3ELAgUs^@P +0g%>TIq1y0Mv_n%7$OpL3=e(!+<2k*GO~!|8mQWW!%~aYS6Playf6eZ*iOdDZGWm8Exrf-Ilo!PJG+U +}2@Y=?-~S2@jLCt??Y<-}qORQ#Y+DeT?HGQfBM_#ooIBL{)A7<9lF$QPIKFLem@-6~h$67mnm0i~@n8 +C}=(qWe^a7h8Z8-6m*~%M@(1Htr +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 +UJ1o{B{a50LW3_$=$uJgVw)pmQ(dkf+DWoBW0< +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 +=#dU$Hnf#kScB0yQO +Zt^i0xJEy!c+E`8=-%6`77E2U6)cSddequeI4KTuKM18P2%VfpM3|;~*5y|h9;2Yi21^6qTTYkE=I=VC`|4K_V4O29Q4OS_6MA*s@ulk&wCr4K+~>&C3zA1BICMNlo=?X{=TYYmoFb4;5x&*4ab(QeNcNok3t*I*aAlj)bypvK0@Idc;PWoBqB2Pvt@ +%(DCQvjUH$xUZpCyGiWLy4v{GNTkYwbV4z8^sB5=w1_Sg+yEE~;i-PR-zFP~mlp7gV0-e +?BxXLZT$TlL$klBEwMna#$yDv)Q``@Ts*G>S6r)!+4$*icbX7JCvJDWoZqs93Rg;LlpdVz@xWeSNMbM +GllK-Q*Ppnhr76%k`^Bsw3f8QGqa1lKEDUrNow(Q048&QBaM@Dg?F3sld@y2BKVyicVIVj}mW>Q+Oh> +s{-8OTjeYR??i4zME%-xI4$=M=*Jm4=9MP4)ifo#+g#VNS;8-ghzP0CuYD0~hGj^fi_~kdQ)jHkrXA~ +J@1x%q5wXv4iAuT(s^|nVKF+P6&sl+-m4H*ZaFgEZO${f@C<;km7LR;HqCN_qwn4caXCym?zqGDd;GP +1H(E<-(Lv!#*k)M9``HO^>4%!zxt?43%DW9ev?&{=>)sL<@P23c*53D&Fthte1OWpy`FlU9FG*;(iPK +!(;-ns}*em~+|m|%p8vN-xRCIuA@SkomY+W8nNt>l;XB;o`fyIDumgz_NMgjJV#7n&mf!&NIs39ChUh +st#*Tw1Tj7-T2HX$0!V-TJjgxK)Pw{I +2>_RICUKPT;$U3i(Wpw>TF#EP^G=l4WKLlx=WTM(6XA225Yh}c_)YRsl^k}s>I^b*IIK +l-np?Q>VMF>88v?tkaa+x}wiWN*O;x#%r +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 +h2R-7CJ;$`t6;P#=B+9=d|^Xq +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 +GT=2#2z7hCdeo{XC1Ww9>K${P1M<+G{ +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 +~qcXR=I_1A(gYHDg&-RU3Lx92<*v +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 +SHrF*SvqOPASWByA7XG!KBCb{`062> +=Ed~d{eE_`3XnmE>C|53;J!Jn?`TW@d3>D8-OXWVz+eg9v3R~{clk?$J;Ib>ISin?!c$wO3Fu0E!Z>a +Ol48ii=YEP)slgd`*+kc&*<0TMt#33u>99`}ua5I~My0l|mBD!N>C8_S&gSr7kWiC#&&;Xg_}LL-jcipb6~P@&DT&SvVqHLj6Zx}^ab|k^(loS2Znqwa`H +j@IG#8b#XW(y34Z(_inRgb0Y3tx0@ewfuDr$zzeHPG8&y@MC&4e)MCQs +TSkMYB-%}pW>vx$T)Td;u~6d<0nG@SLRcG(d^h(ZFuw`5&@1c<|sN(*Jz|d;oC)Vmr_Tx(Bp4d-NZXx1 +UcHI05q0Rk8f~yf~Qv&NMcLlMRdY0Y&g5wcCx317BY(|3Q2PIfTz2kF&&Mcc9aiFrz(hE*BUJu)2}dh +oLd7F|PbX|DpY{W5;IBm@y+A*bw}2^dpF?gL#AK2WSC(gx^qr-!2<`K_)K6k8!+qN&OEWd&rO>MWaTI +Dg+%SPMj$89`r73AM`(X0rUVbqV0Ih>BQl^k>iK=kxW$M$AZN3SlQ3D51WEK2XeZgG2$zd#q+uJ>R4D +XHW-VyCZ$GB9oZW>`SHFB{8)B@AEyrOismnA|Ed1#g7(wX(?9ZkU*uhZP3Pz5N5+g9BjP*sDbNLhuEh +9&HfN6RkGwa#Z{*J-62)AAfFI`!dLXj$#gfQpM-D_Hm+^l*&(qqqYc~kbF?8tA;;gK!ZL%y!`u6QB^1 +u@&Oc1$?Aoc;xaR&W^xs9Mlb(@TWI_bLI#9Ke>|Fv%2x(ms@hy!8kfy)3}B0nqg_~Va@=e}I7x%$`yc +08C{N!4TC^UuHFPxMFIE1@JYp%jfX|&^_S8V2(&|CR_C#(ep{FYbM3#$ED~i8&@h#f*e2 +UfNuwSBbN&vL@ph;2IM0iN5B|BFW^4(1+;+PhR#Gk-+1GViPF_!6hi*TjT@Iad-m+~Am+w6qYu4%_l~ +q|*)r0xV@J`qAnzC8L%0rn6X*-fOI*2fC6?A~bQNuj_R%Kv&xjEt`k+4Kizj_WUJ|_WtR9adpbOYw926;t{7if*=hECqIXU~FP*tTdN?U1e!`u|e>2 +z=lbD^^6NPoFMw#n6q&IR%*FuWVbik9Gq43tqzW20l1sFTf?y2k;m$4&)8 +K=)ystE#HNf5(Xyqorv69@<4b4`Z(hiY8(?k$chy|Wwt?(X^fr07w7{gq$v-fqH +W`$_h&$>n|{e!Oqy%$cvvnKS1r(orYo&!7L?f&~jM(mP9+EIvo^l^>Z@ +Wr0~>~MCYjzBe?RcF&6_tP&-y*paftZuEaVWeG5B>E#UN?_jLw7d$-ka@SX8w(xF6Sor{Ti|{!AcK&} +BXT9gUgbpYA5NCbaD$|5$r9q5 +I-V*MXZ2WMW$G33iS(ED`Il=9sG}WUm2P#e4H~BgH1gftpl+*VlTvgi2D$CS`>G}hk;LpenW4eAcldz +xa!4zqK^3T+4s?$4)O?y*+4&x6Kqg02le%5?-%|S{5|-3@HOGuhOq>{RQJVqZmtr3e|h$KpBoRm8uT +N(AoLb6Im{mjY$?i$pxKa3O!F(L(ZTMUm59rhQzTh)#c|8B)`e6KnIZ3Dsb`tHw9wAOZ-O$Tq`-jEf4?T^3q +aM%#SP`BHHXHdQ+>1CHwtLH#Ef?L3GPKUp#D;W8HDibLGe>Yuo!D_BzONzGkrEObiq)R50$UBNY%Ko5 +`fJxoSg#l>2VnKJni5tw#$Q-_t(GLqQSF44*J{VEOc3j?T_3wLL9Dt~N2*&B?q0f-CiS5IvCC(glq~k +$>_O*_(gXAvWkao#KStNVt05G4aQ0)*TZ{fxPq^laUZ+WAQfX|b#|P+)9U_zIuUx5^uDMrSBTE(?jE< +0$B@(9(l4-0V-AC6HN+nVzT|bC=6Wv`NB~9!iUlQAIGNsxch6z#^DJ(vrJR$v_>I&LU5<5_4i$0Zz-R +O(y&a0{OezB8eHho)mey>XuRjLz*Y^9Q7Igk4^s+?X9*NbHAM0E2d_|Y-V>|3xEv1TmK6_F9*>uI# +j~N1=dOx|pIyEmv%Ot^%=~Q3oB{&R8c(@y#=~wVkSnPNiKkoHvRn_8|;c!l2R>7czfrSM{VYg}j(jq& +YotIOX8E##epIurUF3v4$on2gLXNC*g3{aXT6lNCX=jMdV(sN3~`Nc(UQ>BgE)cZ~Sgalqz+CMDz=ef +$-wCH_wXE-Oje`$W%pxEE^O=(WQ{?tlNuhi1~0r>?vy>r6ne~kb6ezEB!btENcKu$qI0seQJW`>iC1{ +C+rDQ%k2KR+=WTd25Ab2AIVIZZv@_A)nLXuR#^Tjy;r>ML)1{-Nn_-Zr48mztQGn3R;Z?w1B@7W*QKidD{Bs+ypx$~y;rQ`69Jd>C5=lNRxA@A +#sb{Dv7T+KV|mHQ+77k#*e!|54sly8$;$)=p4)KF#BQ14eqs$MC`Ux{;1xdwbc@}N3 +>pAk@kYNP1~m()M|#*P$PYz)roCo@3NEZEB2H<#Xe}Cws$%IbdEZ=^2Yog-iklWJ5x`3^KaY&uYo_*p +XAT+xA{<@cq!{TxslvjepsF*ZSpz?Y8`EEXh&$Lo@!(m +`9^50r{8?Vfr|@~aim&Ex@wfR-zK?&-&+zNqH@wqcL%*&6oWI)tyMNdhN=5 +9Ge7oFS?j&c+CGvmEqvR>_4EYQBw~C@9DgBfQ%3)=_x`inEwc1hZuRW!W3!Ml_`UZW0vD(;a9A~mKm~ +ZCC`Hk)oPZFDHG$3QuRq3u|DmhBNQb@J*S4I+T_9+LHPn0Lsb?V<#Ka?686Pg^F9a@F=K9Nu6)A=iWIbYAW@*PB>Z}@Lq%?-PQ+_~;6?sE4n_d~a +)SMJU778B{%)e~C;mCmx2IS)mw2 +VV41R4aHSA@Zx2+@6hhi9@aV&Klj&WY4?V@gnEaTg|>!vhCU0O34I%?qdR&By}Ld^U!s4l-({p2U5y^bXk$5z)q&CIFmJUUurjP?tyiq&)<3Mn)(Pt_)`rxtjq!O|`QdzKYbxnJ!@l6j}LDD;G$r#CiQ8gr; +`Bh3kB8>_&YVQsY}d%NA&8SN~0ZsdO;9`EQw;IW5plKg@4d$m33v6Rp}(n(8=D&sX{ow457WNbBlFzT +CsG?UB$<_xpK3bV0nIa|lixu!qZU*K=YcvMQ#5IU_;8ix`>%|gvXtwJ(6@m45X=SD|kgYlhF&rC5NH8 +V-Wm77z{_f6=rKeO#jvg_Lq5e0hM{p=w&C!XrUAE#%}<-7R@{48(m=DB6=2)BaxXPLX#{o1YNHS})x6 +1-Mk7q7b~&5G_HQ(qnnYNs +wOJF^oaM7|YysOwe6HG0+N~Vbv78Q0n)3|F_;0;Oy;I&MA8U-(BEGZb?($diN5mJk_1p9o`XhR#9@d} +HC+n~1uj}vX2ldl>O{0-#X^`S<|X(HLx05%<4h1HPWiE##xot3)ailG;5Z1%sOSAwZ5^=Sy` +-*_+uh_fxXP8u?_4~_B%VlZe};PTiLQ5vMrn2&)VbcO8W)UYMRr>DRKHcBb*9nyz`thha~gwf`eL;RQ +BQh_yCg2r%7|2=HGFNXgJwjNK{*7h6vxB7ScEq(4M`45szKIZrG`}k#kx +nJRr_h0g7`AbOtu#k0za0dTVo}tWFmXMvOqu#7OsAj3B)l}__c5|qv-ioMk#(3A9ZoOw6A>L17AF-Ql +$6ihLAY$u|@4W34^09mcZ{)Ui(_E@=XLP-rzH*jwMm4l7ZG@Jq?>6_59sHMh*!;viMtZ8)8e+X@t+Gy +9w~ms2s?1c5D{I +uZ$x5f`|D(^+m(kem*Q<;*#_PsrW4CduiAB00A9+fFQlgY814-LfDC?C?$`)^jx7R!19q~T*&U)v(T7 +Con7QeCI%x~p~1O-!sR_o;#h+w0Jn1sF8|G<|T))4f|lPly!WaEw!&o);=N-DKbsZ=RDl%2{cr6JkgR +JBAMqP|SFcawTZm9z$0bFG7xr&Vb4v_;w$@-L2RbxGDbg!1rU2{k0Kb*x-hZcbi7D<-oLvlwUXi25B^ +3QJ|3SqAIIda_IR>lUBJ{rzO63>lel`*cH#pba^Y$>Z^ud#J(J=?^#keu!yYkG(sVMp2L>=Zj +omh~LTZY{g6-N0^W-(ufxH~tBywj=Ge*xINOYAbb3cUDvtYY3` +&r8BRB+r_;;HbIP1U?h*H>`?)K5wY<7s1Csh%XiOWEy$r9Lm**7_FPC`(y& +>LkZ=_e@RgZ74m22f%xmK=~Yvq@e{|8V@0|XQR000O8%K%whoCtaWPCfwu0LlUY9{>OVaA|NaUv_0~W +N&gWWNCABY-wUIbT%|CVRCIQWq4)my$yU+SD8P4?wy(B&P)P%nY{4UnFMGj1JnXZNNQ_tLSGW7?UJO` +t-DJCRVRSj6j0JyGXY)ZztcU&uXP1u{Jl~jp8uJ@uWnfDrE=oy@ +^?2gc26jY9iREe8vWgAme1_+v^nfqRMai;cO`}RFHMk$zoC1Xu_XGB#jea{5=6zHiPg2}ne@x#=Lxs0 +@*iY&1KsSES#B+^yKzl5BuF!{o03q>3Ypbjf=51lFOdu{UX)m`JazhOH+_7|CR`W(L=p&5-OUrzxEQO +u_P%@SH`O!toks;s_6=O0lP087@$XuZjFrsCfA^x`6kMz2_;kJ3-YXLFI-;&@8m|8|DV=)leH-svi+f +HJ(1zWG>xM+>KEB~INJumyS}_IJ1C!EKOihXZH~y}Z*o$d03#7?v#L3b|${DNeHLZSm?17&L$4o4se_ +xF2;(U>AF@C3Sm4a0YYiI03FA<#RHg?$bUEh(lOCEpggoywidk@hC!S&qCFfKeViTk~&S1p99R +Q^(iDr2b|mj~ukI+Jh47&SSpFY8N|$I)?J0dTUr(vC9=rt#j>5UBi@O7sEZHdsdv!)KXkajqu|CDtzp +W$--*sy4K8U^IX121(VJkG_l&U6!k5rL~S#!brP#}xsKg755GLs7s;#hMe1Cgx7~wZ1(VO@N29fCE1N=M%@9=Xmykjm=& +U>p%*1YE|nW`M3>j{m%MCZKIyGDt=Ci6u4_JY27OhS3;ZFHSS*V8*k^G>&ouElemi`_=odvGOsJqCJB +2d#nsVWKh78nir2bSL`jd5OkEYoa;PUZ?eApf#1VRx6X>KL(oT`A|pvT)XjZH@$Ne=c#yypX*+{yO-Y +O7U#L}&c)w>7cAv3rCIc#ba?Cm334w({!P#WGxWg%y+{h?F*P!1Vv)0u^>ZdEblxO~-Zq&+$MG{qqdN +yonV~_G1J7BZ6Q=A?4Rq~J=-Nl1Ykv=2`xtcXAE9dux<)WAUexkTS0UrRBWJbecQ@XGGH*uNHvxy`z@ +-BETOI^%fy>E{Y*x3dNnwSr0lsQx%l2rx^4LOk$Lij)Gyeg3+Pz7=P3mg=bUwTKs(gtRKB2O}6Q@4E! +|5{pdiSPdNxkk|v~%aIbhL%InjGyhi +*vF3H);zNE0~Ctx=SPb&8bv!MAnk5J#o9BN5LG&;_sVcu1tEM^l5Cj83ONqpdVZZPt}f +bUk~12YLes5&2RYBSfMyZf7*Sop~4_fhfPHyY!?ALDosUCs{kwi|8s +nYD}i&m^;mkw5h9bh6f_uf49{DW{LXS*=Aru6v{-1E#bPJSPXGCtERwZ*Pr7cao0A>*p#P;B5TB$myk +zbP%lNnm>{Dt4%u=C#i?aP)?bgHnIn}()*L3yDLSyU7Ef7b{Rhteyd@te~`p#CH9H$_~E@-8`hL4R%< +JhoG*K_GiJ}oN>81ach#(1M_Nk3)p37u_CamzOi}aprK))>mC74`mRu8_%O%lPiD%ESbCO1*G +lk3k!-E3k==%Ow +zm7R${*ilsmwVp+E~jJ~k!G{n6{)?yE5J{ctRn--oio`y-`xb;^hI^ljUS~O0RC%JdVi-NT^;B#A>B> +tvu^yx(D +W|tHtMtgSC4dm{*{iOZ`$w=E53aEyM3p0yCShi*nY>jzje0eXTkG!7CAm$4!)XW3jWDSG1WdE6P|<3K +1=@KL9_$#17T$&Cdl1!%^!Rf{@@WOYae@Hf7f}t8aZ3@i>?^lpL4i6tn=KrGy$GDbWDTwC%~})-m8Fh +qS<#u_W6zs0_GwYYgd>r!^vP}pYqL&!9UP70dI;0Gg%}a@3%ES_ALC^^C-l0N4bO +WXQ>`(3Cg^XsYXPs_=~PTmtNnSf?nRgfL?8vq1V@)m#5d*1J4DIPnUqR44h58jI(IlqbAqk0f`m8y3G +|h0o(`hK7jI6=Br+u0=V!SBq<|s9Pc;deIH||l@F^C7rry8>}BK+409jhU%Nzq!sK#(%gagA%1Ik9=b +%+kjmnvAsE&L!~D{n*$l_a3&)<<#+~6wvg;)?Zl^c#Q0nJd +q;?6x&ta=l!ua7pi8#(Tczw)qGf(MJKQF>b)12(Mez%liShn}gA?({B;GyG@u0fMEt!ER_*sDayp{qk +lLPRla!}?6QD1`3>%1p3Fp$$Z^J$8+>^xqomhk&DscR$tFouIxeQFa!}+jGDX0A0@v?ChNRPbkZQcP&e@0u@@ie +~0|kF;;W|_gA654WK2#r+Vh0epFss0{BY-pJ0#I1@Ld7y2#nBnHF|98L+4fDvRXgNt6TMt#D%!JKQX1 +k5Hct`PCQjjmnGI!CTm&u?G$sY|Pa1wBO>Zj!tJ0;)Me^{?@|Ui&3}T;49aYbTvYD;a}w?0h7;HEi+* +k$VVXE={2*$LgXVJbJ;A<3Jh*z0g}h7^T0RYfVz1Iw`cKOV`4>gpNX{fTeAYk!LMx4MU`3iZ&2P)h8l +sMhKywz%R_rxM0qGLy-P;kx{J{sqCug?(;uUpPMJ0KAwNs+>_|ilVYh^CI~CUGBY)VzRyi%mhxXGgvD +0jOMWhaNpnDm1suJ>T%J5a^Nxo`pQ$_}-k5!FSrLi#KM)rjCc--zzcaG|1@U(YwT7)RA4{<7$%lnR!) +VCy*$R$$03>=D8FchJelMwfjOI!|c`CT!P^ +0obTNa+wh}=xmJv{{(grG_O7Y7$+d3Br}B9&+$y{E|o<#_osONJ)ZX^v8SjkqU}D}G4kDvns0PIsHS$Hg8?X}%#Jgs^yCBlZqqtv!`+a +gQ%KYd%gG_^8u0~)JkLYFO;(ni;gESwRltwQzho{L#n!6^Y(Q(MeeKX1$FnzP58Su`Tc6N}yDrR>0tm +zva&Q$i4Tj%+Wu*G^^;_&f9&na!CAuaJNKD~~cH(~nBN$GVw6SX^J8_w29cqa>r)pvHoCtbkQ@TLdVHvcq7t2G_|D16Bi@KN2p3tFv^K^J5&6Yp;U-9L*oo7RYSv=ek#1N<^gz9arG +tD_3+oHLz09Ftj4sbVtoKWB7*#^1h*rAo0l!|%-m^F$+SaTb?N!shTiE! +lxE@(eu=TlOFe4)CiKbUrBKXTr~npC#yA%pyF$B;;-AlWN#$$+@q^JhiT!PoQh(47zq!YnOjeb)1`n$Z`z{7+ya5#T7Ie7L~7Ez?!B}1QNVXDW_$5@b;w@Qs9gZ@eQS$I3+ +t0uo!v_m=L?SfBcMLd0xL6;Wuw#38pq8)j4xy;)W!PBkPEJNQA +!)o;|M67oT~jm-!gLOQoajpS**q^R4>z@0h_=wEM=0jE+t1Ewr|u^3(dUc9Haa~#f|nSteFF@JRcGQ( +*;p&d80FMnSiAs;mdc?T_dL11Gqm5o!>31O}&tLD(g)v+H2gC?2G#0?FVfT@4Sjn_D+_*A(?-A~Io&s=%js3z +7VU%2#qos>55dm)k=MDMHMW2@R2F@sXCWt7aew-cNT7g%4e+aceL+%eUHj4LUo%MS0=D?Xvd?bIk0mqCNndHY${CPNn^Jx4fX@~E6lJt_?1 +iBXTooT|G;_(@9aQUzy{uBD}WJ)+vhag`ZV0gW;zg~@UrG}-?y5_MVj6cy{(^Dk5YNaS9<~9On|);^) +9fo!-@_5>HP&;Jczq0)7_;5kEaEG`kuza{dp5&fGv2xF2fvXmTek5aGh5SH?J)8=8w$3Z#dT=uM4EZx_(}Y>Qf#+pZov6fz=O<{1D*xA>Uri&m8X7Q!1*PSr!X#0T3nt +%v~?6ml3gCr?Q;42alN2=%ms{5_|!sYt`0a&;{6UHKweMdOFRppV#lB}(RfH`o`!Qr0AwM +*`88m8C}^>i=l-79Z%KuS8619V>71SXx`lA +zv#k54Ucze6`gF+xUSb4R`692{L)~T~4RHron3h{|$K5NAw!-p#GYz$k&q3cwD#kUC}=N9`*^k)lPbw +!N+05_zV1*2>I4^>_ac<<0|7mxkPQE==L3QSSFEg;j6w;5@}x7(*AZX@k;RTS19ArDD}ThDzBpg#27lgD8t}~*X{fAJluz#!q$|L+0N-th=WPWn=)uosWf3qf!sS=KzI43*K#T8pzB}v +P*rO+?A%_oBLTMre?YRWmn^Jy;f-q8vwvZ$J>;*hln^sW_Vwk687dbe%_5}{u~@C0S^Eo+#$BK`DU!9 +-R*&{O755h3k%a}yt`PKawUjbKK4(>`8g4Ex7ZPS=nV4o6G0F(qn<4n2wifFP!^l%9Szk~j`wQ0R)g5KP%`dT!D$@22Km68VlRHGTwpz$e9~_rY8h2j +u*s(?5TEN&+?Mgh>byv{9&#yvXuIIMbEtvxX7pHjNa(y7azwfR{bmw-n?+AQe_%&AQFN>V#F&*kBH9r +ko7ctVA%R&~(z3{6H?_XqlV&h%>xh3{YZ7NBkT67VWzjX~0-2)@z8; +ZenEUWd$e-)zklVBJSa167IKpulN;jmq8nJv>lRkjHw`}1sn737lX`DVDQ5v&3d=}^9Z&11yFJ}jcl& +}5<=!5WbC(r-NV#1}nN!m>zpuk1DJLmbs!H$u9r+esT&bV*+x!}EM?IP-Hd{AxkrTY08lUu9P3e>4mn*LCgH0>eC(jlqrRMWWVb8h=+XeXEC5~Bq0L+^rLM1&Iy=O8%g-jxDV`e}ce!9Pg@! +(%21jU2_bSn+JpwywlVdk?pxc<1hu(dBq4XNn(QHJG +roH+y0gwQx{TVWPodpc5LXmTW4UA-_LFURx;#R%Rkt-Y@R`+U6UmRkJKcYMQ|o^gV;Z?3@?WW38s|8R +_QA!=$_)8X4!u8)G$s>`;bn$i%U2_>W~-4rr13^YJM|#aQN2cxm+IV}#L}tWTS13kh`DRrC#SKbAK-f +?Xxb^Ktlyf1RwNA$n$;to~&Nb+J$`06`& +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 +1~P;jw%Z{1 +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 +`qOvse64@-QN%m6*ODyyCqc7i&85$w@cu? +dXUtAqFLPP>fXtpGJA66$K)NfHk5gy=FOd&hOg@%hMn1|(K6F}LMn2O1R`T&>*7Ux}N8GrS(Z(J=OM8 +>65pK8mp0;!r)I>h4ZCSmA_|RgYx6TI{G`@%EP$32UPS);{HQOgkrL=b2$nS;VcOv-SmSZJ;iIobQ8I +uvJmr+h8jkhJ}Z=n5*H^Y{W%T!!hM!UTU^?Drjr}B85PkY>=+;fP}Db`(!dPQ$#rG$fvaA0agw)(RX +Z_6Wlzl*=~-`)G&_<31Vwac)ZqYvc62Ex{pe34v%4z&%YiE_2h;|o6|qy3|{0)ekcL%t-#%HyS2c|_GWBE9a_)^`eeTE#^N +H$KeG)qO?^xFGH8!zU+$hD?SZ#{UcirUOK~MU_k00-2XA@b+CX$C)o(m4{CS=hS4u}|T!Yb_@HssGD~ +v;~7=N^5@%X=aM&RFdh4_C1_@4r9*;CYk=ELoiS>rGHIWgcB;M(E8_|Y~#47rQVXIa0cSxUdpo7C2k3 +BRXP%39xgFn){rT+cgIo&{Q-e?cDad9`$iv0{IEOy){YPo7_+<86ZH(h!_VE3M&TfhsGD@Mq9cLfc?x;v7(~B)&IDvGscY1LZeODBn +7<{P_Oq?+noT94+psE-!Ukgbkzle!n!c+Rd}!eX +&jwuhd=14y}7!gt`;W2j;3xmz&2|?_%xFxs&G?lAeB!=J09 +t?>SK1N;Htb`z-C-`^EQH$M+DPyr0#0Tw+)UWZ-vEB7RRrqnBpIXhiEA2SFcwjv(!)5ntCU<#&kzf8& +~*<&0!4-q}HGG++Hgbm +t4QurXFCtF;O?g+E)hXRG!MnEtV75uJBQ{SUl8@Ev#`G|CCeioJoaX}a?DqwiNe9($+x=+nk}SpJsvN +W9Ng#AFUFHPN~tbUf24x^~41x +)=lRNzU>rqX7|9ibD6|iw0+aLtrlz1f~;{r&EZL~Ho4ERHkn`zB>Sq5I}@*^Cf)7OaLjvGoP9>mlh?2 +%-tQ{$KCpsTwBJsqNt_oM0j(|=X!Wp0t4!2~_J;keMyqAXN^6-ZXQWr7*SoM|wAR{njk;y3HP}@qu?D +-;8Jh!5bYmLb8c`ODquUj&=?2~A0cLZ8HQhR$2v;cq-R=Us&uVm=Y7bV?oxt?Bs0W#~9!pkqfI9lv3qW7}ou_*rKE?*5=C0l=)#Yd8(742@MAw!&P?3Nr +Wy%}uc-g*=EADcWbNOjivq3@+fW5(~M#`r=!p>q$`RU@7nTkS7snw?QKrue(Gv)+vScswfNbT9np&Lq +a?xYGN5!_l4O6K1ijR(gIQOYCt#d&2WNXtbv>Yw}sg%i4U^gtBOFJDpDjeBU;!&1uob7vlE*roA$~`7 +EsSPRH|>X<|QdZSSq|^ONG^_&o6X4!+NqwofQyXXfRq@6h_)XAJbY2XaUI9XiM_h5jR56U|c?27OmB) +?eAsu*E%}ZK1gXd1iLFB^vF4Zt-+`QiXmIoNB;P&6CfP0**Z@ot?$hCR$J9!Sxh)MrW$n@H~R+u*vRe +hTM=0ZC|8r88KNs4YWrB&1+bwZt-8FbNke$lfbDGv1ow?gZ5!40E|>TQ=TCXCzZqTb2wsO1{y;mI9|X +Z{G9XH7ALdO85{DE?k5Eioj<$~c2E^-;p^MS(Lxyt*FR?#f_^DxP7wGI<_zB +<(>7K5Kq=Te?q=yC2LE6{-A;yZY*Y@$CIOo>X*uJZ@pO_E6#PQ*&_SX|wCj4N)`LJ78&4Bzb +-S4F5`G;d&6#(#on+}*$5rK6%s2Rs-gJTR6uR{5PbR*@Bxma?H}C80?&&xuN~91a&rvj_KoOv^59hcY +@Vug!6R?ciNjL3-}Mqtefg~(qxT0YuDPpFUimM=BF`4Wy|I*& +hx^4i+ztAv_}^|gSFvn>gXGE&V?-EM3J2=~(BztY4VEix_QZ3K +Chxb{^ZV$|(YXCc&(T?=2DtB?6!v+87?kLLnli+3tt*Edd-yMc@=HAUQePK) +%Dsr{9OA&I&=2M? +o^z$|sZ9G4lU*%?PkDT;@U01-&%mw@Judo{PueH$Yh*l+ir`b9W;ELAABrCHQy(INHGXcx>onIuJ1dp +qx6pib%Yu38mP(7X$_W{%f_!*!e_PA;nGLw7cV684BxNPq)gs7YVFmnvii^=6W4p=QjF$4S7q)_QgZ8 +V@Wq9RD(v7_tdK-EyD#qEsgCk}Ze-5*;pXm8<8%g{1P`gUDahm~lp$3~|>@L9G$YSx!AlhJ}1>d!&~w1W&1h{D+nclh>cH-+Rrm(xMmozeWwv^B$i@QJrVU%R)11rgYQ)j7p@jPI9 +PkrKE(XD$gR@yX!FSxiYI-k|->T)e8uCA*<)?j;eX^C)c@yZ2`0H@nyV0IY@jSkd>Qd(jMl?G!3Oc?E ++MGoUI0`xbJ$_->jYXjA%b+X8Q-2&5e$S=OgnNe0EMvYMiuIL_W|K0qU5nFpYj#)6)0`1{{CClvOUI% +U(ssQUofOBwKJ)WJNtdl`Yqh<3)~=JtKb*L4|*dUu9X=$HHWA|0szL!I`Lo=;^u+F*wU +K3u+&0-xo#TI%@@d?R`tp2$_fyo3 +zO_S!?oMWh=?o=RVx>f1qNh!=wVs>~AL4wpXTUTo^kv##Jpu0uL5J_#VmAGL+M_~`Z=~5v^!O&p7-LC +umKft6I^S18JI=uS4O)ErD&+43-v!An#o{|r$IbX<%B%-|;Zr`2yMy +DN1iYJUF+1TIm*)eMbcU}hfg>y#YpeY6G>?-5&3fAo=|6xN+(Q6oLL?#pIps4v`U5qpWz+E#ZtJA6U#> +x_1;RK~|>JOwiJ*(4TmSP*CDv&I(4d)0mxSWqtWxnX61QNY_^`^X+D3-L&mjpcqeL!7DD2f3yFj}KYJ +d7VDQ1KYKG+WWRjyQjU*tlIrKQ?@71g1V&nstfU>c_e+fzLX~XRWGia@S}L664zS%NKgE@wx@~xfe$4 +a%1bhomt-g}DOMis>D-m>tL{!0`}FtW`ck@>qtFGI-D#rFrxNdK@uPkP|M>Z$;=CU4*Tdi=?3T-3{%i +(~$09BSed5zmTTW>{2fBVwJ1;cR*g$}>-ml{KHT=Gg-y`_#z^@IzZkhG=;79U;c5*MpfqHuwD1aZ6w({f84pN#(nLL{sh6a(Vq5-ueu8G8 +YJsVW#OR?MY6ph%F*|IO+4>ul=nB9Lhy^|ocSYeT+bQW_0PfvABEkcGc|H(Z9;Z$3GX|Ed`D&0cp;~A +=ACBVHaQfN7$3I+MjM@9_13Wx*vwKoujo}>Mf;rr0;~YS;T^k=Rp@bcXq{tQjG_A0mdruxBGKi{fu=df8 +U34T_&1O#fqFh)@aVH;(JN2lvyFww+{Iz4du-<(2vTTiiXBADBU4Cn@7Z`lfLi8x4ZD|80g~G-V;5hn +hQ1Y{Lc4w(Ake`WIk@Uqe9!$Sg{`HD8qX?+os_2@~)xjt`N<`D8RETm9^$U-mXp+wwT(0J5t5j8pgOU +c8-T0pO5>Vp3Qbv*p(#q{T>GWPbjf=rTxD}Y+gh21f7V(p$jdDN4C1e9_6nfuJGe|nC9>V`JOR*mxfh +3ucVvi?o@&gZTSA`Hiqz03Q|9c9y=3`)c(BvmGWS|7PmjAwMP#4Yx|W6d#xXtfqGH=PJ1P8otE87Fi- +IK!NJ?F8OVz^gYPLYG+o$-O;0g?h7Ro$eG<==e=mh;O_aX(CE0_Ii9IqsXQ`h9K4>(B$2cMS{$2|2*L +RR_YNfLW$?l+i^Hcr4s*VK^x +7)&cD4wshuAxCzfMnZ-H2XxF+Y#Oh&`(|0=vbHxxKO1L%T>WD9n`8(u`2K79K2v`O*=lp +e&efx{U{W-{?*rmY;2!;a7~VE~i$#22V|*?HmA4~B$owNImpUiLQ2vfs`NZF!Pf_;WiOPNyW$%cUy-_ +Q>F+tf=_)j6SFDD@rBvaI7OUg0u9a4_)b2h=>N(I{mzW~nOM=UWg)L*%gd1Noa|^F()y9kp)AB_h$WOziN=5UzCBduL +XF=`glzNvun(jd&LWKSBNFwWH65e=v#IDrec_G}t$Xj%=(OI_+Cls8PwYoa;eCJ})cawJt<^8_bC@{o +>hSK5cC9bYB4|f&hd?{!MwV&2k<}#Xmm_$~kax94$8wF1{r1Up{9`1#GoFsGBVBt^PU~w4=t%u7Mmiq +13px(iV|4t3{m-N0HOD6RLvlM3P$QYNpDx)D$WAiv@An;<%4TeXE@r`IY=+GcvXd41nqBn4!uRN2!)- +>EM~Cw&XkfG*8=Xem;RxmBi@F5?!;3mAupNwv^_}$nal3v#Q=L`qR_s|;h{T09+9Gn_vTM +@PAbLbbUrG{#Ww(ZGhoAK?e1F>i=!xpqJAw(N3h4oM-uLTt?$(>&L4V48%N8r3%?_o@xA-QrJUyR=Tu +D|XE=}8r7QpD(xD_)M0+z)EF;c!@AOmu1o;Svm%>4r74uR&=l0lm-Ku!})Zam|lA +m+}aTC=|voXA_qu7byv+^Xq_KnVEru7B<-JYbtLo(z>EAJ5KL2#tOl)!deUG*t}hogLaYOj=+D&9${f +v?cJq*xxBFW!}JDfQb_zSophVx{r6;VKi^48{N}m&W$!EE;;hcH^f8VtV-8_&J%!zakf`F$sK>a&hK8 +)6T4uJBO%EfAvbCJUL=c@dY8g`b7b44m6eEt(3CtFJ +AxUc2wB1?yI;1kzCXW?%S&ou=rQ6JhjYxr?f!HJD5aQt!jukd3BZe@Wc(%~GwCa{qD(sesPFl8p{8@H +~`^DCD)w{w7eUQmQ(b9 +OYX3)1vQHpgljR?N>nG@7Mb0bUio)IQ~7cxPLw3e$oeud94fkJ3NU0AJWQck;U2P1lOyr@^vl(SGPM~6p!r)6m +>#c_`;l9B^-?(8%=|FvnuXtLFJu~bm8h&fkV^u`&8<$W95x4{Cw~kOXz +%B(#arTyf8m`SLJK0G?mX)72imvsZXGC2Fsx5B*Qm7&uZlP4BuDw5kCI9p5OcVm{&7w$ac27+Krz}^3 +OEVh0DO6m<({fhnbM6{cPg<=S3f)alD1UueSsyJh#N2C&$C4P*0|?$In<<`##cP+V8pL8t9uNgiNRDJ +WhW;wIjk;IJDKq&;6j7ocfpdAL(dcx}opO1^>zCX&ji;pFsBE?&+*u=~^CMfwTpDZL9OXDrx)7<|MY5c)n2krmMu>v66F%(q-avifMlF3!q8m8EbgJWc9@RFPz?ADi6o%qs`Ybi@t_FLs?B)S&F7Jw)C +Vx<=AS!I%f4B()!xrn|LPi7xpYs`x-w_rOYb)=~-<29LI2-RUhZS;`1QGi!?Y*1~|7*31{*;+Y7LNLo +%IpsYVdfb-x1orI^%6kgsb>c_C;~BdxGScP%3OgJ-K6xm~;eFs{d>)R8?FR@)_I_h*hRZ-X43v8ui!? +v}O=tCaaKHnZ=@oznJ>eRAf=T<}#!3?#;UvqLZC2|u3NzF#P;ozAx1oI!mkh~XvCKhSST^BmGRl3DlH +re(IK@cG}4&{wBrwNgCxrfFKJOPV(BhY?;w@WWtRyVoObI`t(s+AJx&FP`!ap^e{;df8xWSHR9P-nOI +8i(cqhiMsVmEJEq%JEf~anv>MOaqXcFJHGeju>jg){(XU#meLU{D_~IC1xQz^rLkK?8b8uhN(zS+T-4 +X0r?FdEMC-Sh^8E8l&GV*l8ya(`b4%B2XEW2eoxcM=Z$r5a8b2Gr&#wW8I~V;*@H2@WE=y%k)#AA_iP +c6B%U%HeM?u?Nuxsu4>@dwqrExYtw<|M7;49Z!k@s7$C*HN?k)_D1x0}>v(%J$lbAcqvqBT@Dq^JJz4 +l{$-L$_(pZUZZ^^C=z}|8{NV9E2G{+i#6ZuJ%nvI*yZCs2mbsD|-zMTr6f5+`FwcFIT)45B +Eiv<-$;AWhsGG1=796Ww-V!8b6&TC?R8kIeAk;)eRwH$VfEx>)}GiKi2#LW}nb$ms{W85eHbyV!nGjY +C*NdM4#6TcblH9`hU{`-izk(ws)#{nBdo)yeaa1j_~IjWu}^Lydh>GwXsrnG@%*ikO4zDoyI7l)q>UHp +aLy!vW311%RMwuEq7t6n@i7zWB+Y-x*ZlTG^Hk|vV!iGA>ENV!s-+X>sScO8vsj6D@;uej3vz7yx@$1 +;Jk{~@*YkLPW;d1f!90Er`)Q@1JY30?;yU)Bm+FwG2(r}6(w4a-R@{sC3fo&b>&RY^P8P$zZ9@KRl=H@Pw3 +o>&P-yBc{S@rrDcG()=*RY}SdHzs4O?Ddxy3&~yVEW8mc9;~x&dj3hMhlVjYG0?$%PF6OuDDOLmJ!a{ +Go_l7a~s~@=*FAd?Va81D|~rtg#;U`IJcs`75+Dg64~PX8r?g75TvaFUaD(Hvi23Ptqzr?szfw-v39o +s!CsrMg6prIG5?GD6iXtDbmwoR++{RxsEO#7VD3-@e2oSs`n6!Ycp +I>o&zZ{h&>5SR+FbY{6Dz#Npg*5uY#C%NgZM-6cS=g}mBHW3$NH}@Z3gXA^AYIQ+otT5Q_X*h&j;U(j +~gW%N1Q_csPBq=2s-a`v!;I|5^Mjp%*S2A-v%u|BQeJ}$R;Mxzq{a*e+&6(%zCLwZF1WgpKC!dGv}*Y +$mjKg2ee1v2LVe(d(j15gS~Ei7Bc7kAzKxswP})dU5i*t#`960WB1RxkML-5Aoe)G8V^px^(1RtL+b? +~hxbz3e!R1~S+=e}o`P>%XEZ*Zifd?wNV9dus!vk$cDw;>q+%dm#F1`vr|B{ttWa9v@Y8u8*%hlgnI^K<*)^L*SsvAbNlV5_ +`!Gs13x{5~9`id`pmHog{kBiJ&DaCO|I$cz +yaQUgJm=O4g{MWp)7Ol1?#JVtb1lXh(LCmyW9*+C_xFdx=iD74e9o=HIhP%A&i!bdb8c+=jF#>a_0wqocOBO18pXeC)l` +lL+xwQq)Y&`mdq4KO?ro7d>|4-|CslZ-)OdEs(xZLg5Sy_!yY@+cqBv=fZ`&Yqrn%EK;s0|;`sBC+k> +wsY$~6fu%f!l;^w)^;!e|##qc@swKNMNcXje3a%SE66=Uk(FJKa0eh2QYOa5p-X-xTfC>A&bo +6FJe&bXm@QZCqgji38$D(!dg*EeMkU%P2P-WO|$-btDI#>w>Sy7!wy1=A)=o$`Q1%q2W#{#E)DZXERu +`1WE%KRrg@3DPDx%k)unXBfUdd|vifWsgdIV7F2JHxX^z@pq{&+(@0XFb9Iv^qCE1}UzHy +g?N1+yXqRnXqGZ7hw!KRCeB7ET?>J~{B=1br-PVRkpQ;sT;{;l$zUF%&ojpA6X-=7uSjF!2USzf@#hzpUKpN#|#@cSAmj&@-YURcF +An+1wPlh=)dW3{Lo@)r5?Y-k~Me=bEgjc7Mwv{s9Rbi>U(gGbS4OIX_1g|J8LYW!%aJYK?-wh7eJ@Ggh;TD0RPoN52WdommCH;lP)UN(DEC2?)3W~=2L +#=wG}lBESox7{h_4N;)%_9Oir|9M`y=92dzgm1YuT&LQSQ6cen9KG3pcfFHF);lR;y>Z5T+%P +{>_0}7>-o4-_Ag4#JcLUe$no;W=?uYB$Y^-;Ac)c4+F0kJ7qt?4RUadD{JehOjydu{-FpcpwA%CJ@+F +5s@-@s*}fqk(~Ki1EUIt%+14)kB&Q!)d;Yu+(&B54cPKL3O$N#k6`!HGNrC#a8PpGi?Tkrc*>h7}Hl6 +Vpyd;zZJga6;DcSd{J2lm^$53*pAc>8I)2HUu1?UGiCLobQCPy^ua}%Z2i71Ma+31l-90?quES6kOUH<<5;sQ++)!=`*^9^ggqU`bm@{ZP;RKeK7Q>D#Pw)CrkR%6?vlkYCizK^%7_``*Ml&IqEejx>oWnub +fYu*LlCT#Fff>^`^?gS$G-K +YF=v)s2Ce!^vvU(!n$cvpM&|shQD^YdA{D!UdGtWX2ak!-yuqR<-oUQeT +Wc9#7Uc(V#+0JYI`Giao`g7tF)svO<>TBe$GPdzvgJ8hh;uSm$-HvBJAtFj?-vbISB4tT!ykqB_)iTu +Gj||=XBhSeu5J~3KEv=|x$h%I+gO(OZKs8@^>!HdEUeS|k=mb|BHF+DFD9+}-N&5c(fV5zr%KL2Q+6) +Y$I7++h2GFfp6E(Fh%>S~gK;;+w<2nKWp!%+#|qKlisua>}? +h=Y0o6!MbmfmA<8ba4RP7Tlv!a(l@&ECT(e1yL4z_rU +-VTJlBW&Y8U>FU~kOu_&BkeV~?PATiS&{hj^ +*?4c>wQZ%o@gk9SSC$C6>XG5e`6NPS3t!`(xvCOv_jfJO+2w66sn4O{~KkmO1r**m44Da?Ji9lTnCzAyHDFvfVN*jKU-6-k#X(k$k_M5{k +%kp`}Aq&9fOnyEMgbGW#C)jw2a?DyG!4;NjTH+%r;oQ8Mw+iT%(@zp>FE(9yu32<6_0ch=kuUtoKxl= +$1N{aO#f)Oje)#aUaVt>K4jDj(OB +pIWD-+>bq#+ISVtIq=3^7Mp*^c?I`40|zI{`{uE>$C3`9AI86NppPlo8?_ks!n}BIK5bz&*SK*k@!_S +z==-oH@6F|SIp@qZ@!o8-g)uGe0<5bmv$t^m`%o6+Tf86Rn-dBZnRpQ^-sHIBDvKW1_ +Ft*IK-jz|%3-2>FsB$Ud}Rcp3Yu)uIP$m2cmp2+f!>&~lkH+ZNPJ(D0C+3@qu1a$z^`_%w~Y0nT{vM5F +U0pl>+d>b^7|7#-b!dPC$QotHHHRtm)jCvmzuOZr=g)p?tN|yh%vSev1zhI*9HbK_DUFmCmb2MW<5q8 +Mb@oh!_wBaB;L9=oq=^FE#OgH?UBk6_gZ=0R}H)wn9UiQVkxY+1R##D*&M>hM2wr#o4dC1r&koTnS#G +*M&9|gDUH_rk2#_C=$1-t^P)^CGlnM1*IjYF*;=0zKokIpNY +rfXwiYWjG~yBis|B{9N=e0)D3+23BHzdi|93CAYR^ZbZkYD9k-Mt|vU`j#Y^{q-e|vY{W(Z$_=3Q}vh +U9O)0ZSNXe7)8DoW^*8$bRWNmq=)o0ionH3agMJ@EzvOd@M)f-qQ$Wh<^mR!z``(*q_!6jZX8#`-7mW +813f|7q_}iz(qC>u2XN={B7-La)1_~cXjc3`&c-$skitUH<3HR5sq|xJBlQgownk-}Y*Nx}@_xD%2xx +dQ(H}+QyeAuhzcxq$~k`z8LCYynWg)#7uc|9>+hMn2Mzwg-fQkN#;(9h{F1nsY{7+Q$4m-1-W1QE>Sg%sdVS7Nce*b5LFT;Y_#Pcrdb8*l>mO +s!9^7>#)K*JBJ;TnoAWn1_m@%R;ZsrWgj~8i_X($ty#^>J2T$y&uO>;dCS*N6*x=_ZZ(<0(a$7{@Q#r +Woo4av9)GJX$r0_T}$L}W8dGLtxYZxO>$n|;3@YgWr;!?Kx*A7dWcSAa4sQt9j? +fZfM?i5?=PRP{s``gO9OtjsJweium9C&Sym}|KdD>ma>9d${u;wTw>ob<0Bi3w}BNSoYn4BOFhWkoExGAh5^CL`tx=R3imMT}p{*p4Ip%y +i0JOVWNCWA1ewQ&u@Ub02>S|ia^^RsDL6PCk@IT2U +vv?Mqxe4APdFws<6v@cZ$Mkb8PFBRhYre^T%>WS!tcryl$n{6N9~_Uie7bnq-?|G9x~dOb}#pdE?bW9 ++rBKku8FAMqYb$-P(Q-&D2AN6!Dj5K0_>^GWy<$7KUo}n0{e^iT#Q}66SQ{;&%Oxw9cEw9nC%i7X9-)?iQ<<$8v2bN4Y?ALLQ`_3FPRlpxxyEb1Fv`ufSoFEv}NcnMHO+S77T +_fWnFg|dK`)%t4+Mg7}$>N0m<2^|+`P{GY1T^N!qAqRG2U*Fvp+nL||l$s&qY +ST35)JJ1!DNwcM0m?ihlZ3*-h%bh(Nzc1sR0{(v^K@?p|yU+yNyjq)>!|`s46LWZ%{{z8xCeOaom`ev +}4|7zz7Hjp4-{xw;e~#~ani`j1lRm7jgPPPsyZW^HKH893vhU;>xx$h)o9*-`cI5JGZA?hJQq^h>EJ95c4t`OC8?S>9zg(X9NBaBN?uXAEYd$N|?+W +%pwsM8MKP>A|&t+}0d>0IyTEA&+^W4(Vte_OmSw~4~EGvPa$=YVT{pu4mSiMH=h{8qB}7AePP_#R0Uo +2Q%)6}99FFKxo4oy5#=AB=yIHyo-ew9EW?W5yuc(^9&auOYtgyuMFQ8 +M#@Z>ZMQTXvYTbrq!{{#4BzKbraBlxnTfOaqh0_oYObx3{nF=Vy~W;I9x+baP^jqCa#8Z^h~0|0kHWD +)dyRWb`oLcbTHQBI_ygv`gN1k=QJ-pP$D#%THYIA9NXK^N9 +)m@VL#x0U@K{wb=Tpgs}4&%*r8 +h%WsACGOK?k@+-UjY6!E)qfVB$Ga-|LA$Wb#}y$KS(`Lp2ipudhjPkJcIa8+1}x^VK_|zoSHBn+egYb +$@Wp$HwkkqlJhB3en~p!^L^B1pMkTZ`y9UaX+_8B^94K$xP-j>2@v=24*!Gnt?iON`f&vkZfh=+c|HQ +*AsN%G|1$c&H&r_Gh5tBx#;z3f{eQ_`Hr>m(Q^$^j|JtN{%D~G88K=@5UqzSI-;dw<*Qob3)Ri@84Xk +JXwpIQI4GjJV_QUZV)In?BzMZPAZPEvBte)TCf4UQu9^ZHUSrxZ^w4ap0N21N%9hR<6 +5>b8=_QVPq8ztTM`_x$RWJb%U9_hC}I^H@M)c3b;obRU$#4~R7IVD>&P6^|CGOq~a%|o3GpNe*`(a~FmByU@6W`M0-E +O+?i^iOcb`C8(r}$enr*xm)n9~nXXQ#1Nk?U0Y!PxjnpJbiVKfyX(8nsUIW31D~#++`8Sf`w*b;^iZr +~O(v745Xkn34 +?@A{^WMG?lJ9wu!QU5*ZmuRi4kg+Fa?y?hafG1~cVa7ts1FRP(iOsA-yv|3xJ +M3Ciw<&nn%NU{)7;h_FpKugt(`<)v=(e5>6_tKC+BWbY^8sM~uD&?K?|dx(#@OrIq+hBD +|KE)G!yTU{8X)tX;2QkQp`YcN&^ExxJ0at<%#(6~jQ=h3=LPQ7f6Y7qj9D@H!!U3E!Xf3iJ43EnoUa$ +>QOhgp{3^hjaX$1-*k-LTkH2*WDb +H8Kg-q6c8!W-4SN4vsO{9rFr0M!4;(lAEz+aos{d{jyjEficga|iqJ*-$%8M-g)T1!Y8*RGY!WnGFdg +D6L7M^`G|3I%W?6E%z6`AuP411Lg&M5lo3TX9v&xXdG$CojW=Qt0;Pi5sH<RJnR~Fomd8X8`uK=+?wk +SSw)b#gg2}i(x&yeHOB`z#;;<6r^}oHzfv(T3pt*jqOEO7>K@|c49KSGqI=&ZA{~5frMqVGl8Q1d)hR +@YD@l}WWWQqQiOzUs-_9}6256r}ROVhR(igfWFPVF>NF8cyI@EyoOAD_1U~&RzC+2Z4%2S8BAKzRr>K +_!RcC=HL&reWoeG}zr8@-abjxc^1ixYdywpz&t`C3m&zE!nhe^KAKFhO)%*tXVth`P!<%-n~Xwtfb_d +!|3zPG7MZdqrw3{x5w)`FxdYSx&}-ET1SA(?-zpIgu`71%Gt)VcH089}dmE#X2W$GT*W+B8?|hSLmlXE-+)M^tkTS!)__lqrfk7ICyo|F#!2;@a20d +xFUmcV;not=I(+xpP}_?6g{=Xc8;{1*7FyJo*G*nhm-gd!JJy5k5cap*g_k&B*K!WnthNKCnmFO!*4) +nj9@Oi6ygAnsFG`kfn{Z+a>I_!VpiHBdG|2fZ^=cI~s8Qzp2Qn}yGV810!hHRg%```E)^Y{t(aeQBk@2*{DXJCkL$UDLGqr +Aw*dO#K4p!UG=#ZmZvP-mFD^c)=!NvPi;*X=&zdNCkXH_e+U8nho=`vM-jBJvwT#wABS&yK@SQRLJ@j +KVV$kMmjsuo>`b#-{I{sUFz<;9tAZYwk#Mxcyex)6-X_YY*q!wM&Gsbcqw%&1Pg+ljO-puq(nLwAQ^?$SHqle!+N-}uHiM#rBD^Ps)bmn~lU12X1W8}Q?6SZ5z#k^?&PP4H>ufQ?Jbs$;CfQER`~-C7 +PDUs^M#I0rP!{KoN{w4XGS@Fi`!+$#CiA`|}PFSrJ}^0BRKW6o{-twbGpFJvJ;rAOgY`T>3?PW2jjH1 +7b6R*^=d&dO)=Tj|Hm-0#h@enwRN3zbwD(Rj>N{Kh;z_)nOd*_ZP3$ngCOWKBs6@%_>fS~v-`FvlHP?sw;v95tT3u*s +tpV2=5z!aIO@H458cFW|CWNcpm)Nej!c{iFkmH!gu3^SJ9GQB3?>9w!bqqYd&iGaFn>zJ$5`JLpNjcB +S`WdrIr&4Ru3|w=!VFn-0g=PCCH;0^bGQ#eSZFvH{eg+-5EYyTPwiOnfh9bYtFn!u)muPepuRFV&2OP*w8NW1@NtQ@QREf#`jGIkJ&uD;_!eq-wk;;ty +*)3{GXA!));jYRo!>6mnffZ +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 +ss2Z4rnYKfI@ChQvtn1rZ +=5&tqQ7roYn_=H9#YboQ-az}5U-*1%K*krAI=FRjj^(-kJYe$N3(s)mC9dxv%4!zDbq)E}r@QL+p*0Q% +L`_4om`FYLbcD*rn-y{u$W1_|Kaf!8 +OZg|G<6OXWe;8}H8*-{;fzN7b8WZbet11bk>clr19A;z-XCv&s{|M2|Ves$hg#ffg-i|q%F{g8LB(ze +__%C`Il&3<5Of}%l>p)Bz&S +O3NOFg2y3g6}8U2gbYCEs0wcbA0UeUa~`;@#B +nyK=s}6z?t#zgxg}bMbC&_}%CE?kc>yD*Ud5?>>)rpAWw)Fa_&D(1}&$oL2hG*`R> +SyCy6idOS;*d+3$>^-Z0SN9<)n#=e=drlWl;Xpu`yJVBY<_F3k%5QEpzhW6-vzn +(CB_2CCO&J|Z4z`A-N3v@UC_{Z{GDt%AMI@I5FKD|Zy)~}c^yk@NKlW3Q+j~Vav2WUt6VWj)aapuWy8 +Sb;^RQwBhh8ppyj?rJkI@$2wp5!*i9ozx +YJZkwk2sh_RBN7|Nm+l20Kradp@(rVPblexO?9{ufgtejmnv&sr7Bl1Sa%xS!A8SI>W7UDWv<|3glk4L+M=%?9l5-X7;&2|Dx&b-xzEPx-7jSw@d%*ITq>(}O$lzj^J~h +xU;Mu3b9RWRwAp7CnM*N2Utz=Cv{x$l?cwRV>Jd-cqzAS|_nplRAv|ZEI%BdjZDZar{TT*SJeajl4_f +wc6Y&Zs%iZwu1*1k2GwtdVv7JuA0dJ{nh!+T=!1@^?^3+#!-7uXY +vFR&*T|2Ox<;!m(A7GG#j{2F{%G~ZM5j^YVT +KM-EYN?>Gb^3vGJ&QzrZ{Nq}LgO@?`p;X;YpmX|9kq<%hBMD?=d}=V~*~KKeiL?z7p514cQNI#Pa52& +tG&CSN=%zIv3Mw2^03#w}O5PF`teZp3FXh6j#~jz^SX_+_w<|Cg!eYn}_c?$6qye4R6WwV6t0W89Q~O +S|DL?{2q)ujZN2WJzze{95tB(L8&EUT=e~FRa(&97S?GZIVv(CU)eS_cna*!h7<$W8*1|o+Irl8QY6G +%&(yRyXm(||B_o6BRosS2=B3!9-%)G+AZXnN4{t;V9Nirv1dGP>V{WL6$d?_9mKc0(9SC(?WlO~)+Oy${|F}McpMEh|?)06S+*ohPLpS%&{z6<@bzkTEM$1(PukBAu_0bdEn)cD|dapxu)IJ`vBlMS +)*6i}}_MU2EC9(B(aNzeF=dZcE?8pOVxktx#FqyO^MYl3dg_WY8W2ijTY;Wy2=ztMheX57edjKzCmwR +f>U(H6k|XM6uBgwdJgcrMA^mV&H>uymar#NgJ+&?0EAoWb5&3(WkoF`Jj +(z#koY3OcnK) +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 +IIDBa3@lxeoAIz?5$HFxt)r05j*0ki-;F +<3{cy7{c6-|K0?ci7D$BBdU&xdwJ>Qf~>iHKvA6|t}W>*?|182vT$$>JEDGUCKj7Cwdc&;K>t{;!Po8 +IQ3lDt3_>?J>A{@d_>iZM^x(}J%#m>vr4`gHMmM(4*mX^r#koFJr5 +|6s(J*FLRc9z^Fqf*hE3mqqxuo)2~3N{#<9?ZG82Yd2OYrGL($>Kh4)yUV&drsy;`?<22ba$g +%C;3a@-)81Wwlw(-9l=Y{Is!M&;f27r{7J4f=BTHB^9%k^TNV1g%kY7DRr-a*wwF7D{`&9NN7|;If_* +VQX5_hlTCJU1$?`oV18GBZ@5&H4jh4(>(ipA_<>2>^V85nGpBTSg%d9Oka$40`G99ICG+ +s$HPzw-~a&icgyDZc}Gqef9HY_nfqD%B4(4{~5x9`eojix{^Roz>~YQNp-Yy=lm#}hR>R8xBsuwzO36 +4@vi%?Qbv57bH4Jg%3qf;{k!gWE%_ULZa*i|_J=y;eK>VCmqy?!?fLqTs&8B?wp(Vj`%|Oc>fw-tC3( +!qet&3w|0qmG}@yz_9n>59jodTS;JzLm%3-~d%{q(RQ_X +a~%86v|;JzP>q-GO`>`?jC#1U&Ra@!r#WM67t(C#^Og_Z8zhHYbQXnHQFP)~kSz)b+=!bBgmIt$y_{p +|)(mt>r0|2gEM#v~uQl0KclG&-rdSKO1n%BL6>D+2Y7aqhC&`Hc{%8OB*sJUYBZd5=Nz(t)940swLGk +cLMbm)Fm)K5%a;+81%eU%aFSHQY}Z0rBu5}{{OWxrhmnlJiu$ap{wjN?pX>9Uzt7gF&E(Kp0z4J-kxV +we!M*v6<>3Y#UlM-e`>V%Wn+#>(%U2x^;@@_%aSvE=5$wyOuMXF{3sMkF00c5@nsu;Oo@y_}QG(W--P19VfrXi +dP;B=fqAGmzsDNz9$Rw^EDAPmGpE(rwf`&8fvpQRnF*>epI!~z`s|-6`TC#M*m;b{W4>elJ_Y13)cv6 +OSZ_hz49+=|7R&ZQe|kGXizjL-F-LCZJA#KbV%60dJp}Q&0N;kr>MA@0_Rb9kEgqT@)xzo_2KZ|3*QI +F@;}&Z-n%hQt320(IM;h++_`x0UvX~oY8Qhy7{LEirC6uwdKYEDMRuL{E3-V)MOUp|1UbJGe^xk1o~R +jT)|o%6`F%v6#3yBpNST|5wCl~NvTyUZ!B>4C`PZh(fiLL(5M+pb_|9*Ao31SgR4^ad3b$PoX@Ld0zy +E8LZ6Fg)(KThG9cMyGy$Mb|5#{=~7G{&*pB4%?eL(4@;9@Im}t`J#-ykctEJ +mC>j3M8Mlh?nXr=$Yo>BP61H^z?ja(rt!1-O&b;8MMF&y!2>}Ma`!~iOXuQCGWFB%b82qu$^eUm +;rdy^eI1W58$y6e2rc5FgX9gUu=q(`1q2|ST7SFYRUn9ed57~@H%51aXnN5^US+S5EMRSbcB#K94 +N#}%ulXsKzY+;t)OV7xrWZ2z`o(9?L9Gjk+yf}Dl87p1Ld|J +$xGuI}%KeT4~9*h^=4OpXg#uq^QJUcy*b9j#+&*}vAoA(Yf=ZXWerzYyBTHD*16GzI^81q%h#=Qv65z +vNic^+$%>$=DrB#09WvE~l&?fAc-QO@-pvl)$)~rn{ +0-+qyFSFaG+VL`oMh~*;j&G3!~O?6dINLD@csR-kII3yQR;}sS$p~d-bKGD`p102d2hG;aAe**uRlss +^VY$~_A<{j){Q=*n-kR7`M=-DQAd8-l#9Wq>{=>#Z`*X}3ferNFUI2MJ$`BRB$q;+n +_VaQSbtEHcvcqh*|!ZV+~rNgfJe!zGU%Uq;lwv^^O@1&d*7~X^PM5|+Nv08q=q^a_4tHYO{f%61>QcK +O0;=KD3mOKzI4&DyA)}v|Ey_GN@3CBoYjsGtj1KaWKzm5EDZtB){$eg)=-z(tjpX|uJlrbd|#Ae1DG~ +YiW?*v6v4d8VHZKAavDSy%5j5$AyoV`V!50(~#r%uZ>Y?*kU$2j|hg=}lDVT1Ancy4^Bt%F^biIcK~S +%!R~Sw=VPBVzkWj`jPXEX#QN$6pJ_!P)$zlH0H5T56&j@T#X=P~Ov#%b3=sJq3dpf7KDxSrVuCUdC@a +6w$`IC)M5g9DK{do@h$YgLk8iyAou6LK#Pmejy@G*+kn=rZYvMji*xbPP1 +@$3|@Ka=^6dzG)aIYH$MZUHY$UcMG%xlkUPWeF-i%$FYu+gy +x^(+PMozJauTy+jmV#+v#kNuDB*dL3Xk +EU$F8GSf;O>!&i(YDSrTz%NNRTM~{7RNj~zzm4GSnzKaJ_cUikhn8G7U`=ul$~Y@wYwF9nA@E%?_H~kKYX;i#Oh1yFsb#uJcYls?Oivz~_Z; +BykVteM6-jlS%#CrMf?*uS&M`9A!Lu0K!Z-!jeHhz-RRq~)GTQt{qVT^g{iOAvZ~Bq;M=^$@;P3MDUT +(i$v-zyd<7kY*X^bIROP038@1f2DV~yUmKi59csQ-H3GuACfHOHVGu7aoWO^G7Vk`wcy#;j_oQt@a$UKWTv0c@wcWPr^4%dVv2GgeJInrQkY^+BoZkWr(C(p5)b*iV)@N* +DJKC7B%ClSAX`o(y*^E|)HlfvlcCJTXykp`R-v+JShkEI2(p!HHc>e)^x1J2m;}GPJPGdaXq@I*IQAXwe#XCtIr9+xRW3g$?|l-*@M(D$WA +&YW)!N0_;OD@rJmD0Z1Cyzf!nujUvqZlVaBa%{GbuWP#y1!HO%mqz*%<{PK9tFLl-nf)`P{8+k{;2Yx$h}1SuBbdH&4zEK +=X^L1ibr$JelBBMa2-aC2#WyhBEwNJ}5 +!Y(DQ5BlTvXp57$$!B>7@MZL57M%o`RzlqRp`>A7i<>7wtT-50-Ezm#cw~CS^OYb4V-u9xtvETYYJLH +^J&ha|>G-%DaiwZT{qY6ZpI&Z-!e0{4 +PaPCUf}tOi(BxQygGi#WxxxrcY>B!fj$rA=l!8Q9=O|&Hav_ecC%+UZF=5@%>EDSbhjOJusm~NMT=&y +aDWyrWy}m~%U8QJr?d1$tv+duNVO#Z$3V|`elTy*TzotFN39|5YnV8!&&`1&=wKd{{Hf5EQs^&NbF7wzr`u67#u+GiV$uPuNb_mvIsBRr#FXb0>{QFh?6j@%m!n +6+RI=6Dzrct2oQN?wKXGjoeYz-^HMACAX_Ct>0-;K})yH#DcKcLlrYpTf3GIK6GaiE!BW9q^;z30B@8 +zhv$G_bY$9ofEt}e-61fO{B?qOL_Zpn?YL!@cs45#6BttR{I0^X>Sq+3l^mJ)`w5z_ovHfuFEyW^AqZr2kM+w!GW7_#dMDgKte4qUxLA6 +YcU0ii8rKAKT8 +ya-?-`Db|*jvISSrsFYvtoWR`ay<-MD)*d0LovoIg>itkuc7`LeM)_7642XK^kDXc^KhB~gBXYLM&6e +ne^e$>0}rrUP+;r)!8?%4fSoJb9c_`2rR4{foRUD?|FxrE7X@PKygiGj%?Sa8$K-S5rQ{p1e=PhaELh +C@|XT2w#1NvfZ15&d+^a`FBF{4T%wj@@i?A>Lm}z7_S^&XwmwMY2BVAMGZOYH@YjhC)@`>*hWmvxaEz +(Du=5_|VTnZIdF_@cEtLH6$JBr+ueWXZ+IlORTnv;G3bMQ;CoZv2W~mU9!ZT{8i_}366>bR+;;9gN<> +@v2PsM+l~ZLNEwlP|5ZyQUOPS!UKeO#yxwjdjn_OM0+{EKsS)jhPJB^oI@B!NO_uGhA89u$+-@G)1^t +lw#ieMGY!~ljyPzjR!`?vqke##7S~Dxk8#}k;pnf*y{mlq^5o#yBX!}(3V&Ts&OfPD-$EFu1UH!R1FB +r4t#%Owhxx|KRc>XnM5%U+L=bweLq^GUC$Gx6+O{!1sDU2Zle779aY0wLnn`6+6W14|$Xv?G*^P+Igi +Fx1uav0aH1g@RFZDGNZ2wHI@l2(k&C7M=*=klVY6HPlpcPkwR!kT}D^44<;(CKtFn%QaiA5_ +0@w*1Jg7Pk5Rf}(wJx?3-VuC?0rr5&tVh!j8*YMfxcNS@L +Aa|g|Huw0XO(=4d%)D?+{{h-*TI`cbew??72|ehoE<^d{Ms*cwdl!ae@BSKsKYz`-(*2eIai2`SvByA +T{Qcs4*vnX^?gNGuxzX6Qjq7cXEsBF)Id}SZ@TBjxb0NZm-7bgm^j`@3=+taml36s7vA?BSdq28GE<78q-Ze +X3RatJIJ-o``~&p5R1a_?i?FKo{j%eJ837itsFw||CunHOJp;f2_7Tcka#%%x)5$jQ8on%H&O;jpgyw +Z~06wb43r#ye|DTXGgSUS;OPdvPmZ3p#4X_}_-HKgf87Mtkwn&MJLyE#Q-KSn0>v$DYTPKK!kSdlQFE +Y)-VrvIqR_h);X3%mI|{Yx@J_m66(ckg-kvKc=ZZg8DQ-_5ug=lP8A9A?47Z__K{`&k%QyjmjGvsdVMHRJ2qD7!p|kngk +1_xQnYXg$Q9$r)megzuS*a}r%+_*p?Hv-8`}_ucjn((cVm$C0C^iRe_WtnDMc_FuS3JD%XiW+GMgh7-l06)4l@Utycd+VbE4Cr!7mJ2jy0Z``xxM?nr^Y=&@#O@IAUVImR~JZez|qFP4h$PQ +5*-kE4CxW4a34Wd5yY5I@^|&P3=3<6wM_>m1ME8q+Z2(DB1?y_gM};AI@@2Xv3lI5bYd{lfJ*5uGQ@_ +X&V-eT-3hD0|!+;1QJVZ}RHt;m&JwDm)JOSqc$FhhHjR3F^K8qd=Ws!(NOLZUhKNsT#k79A6Lwhj(B^)_^+;%ozd*aY4DIe`Xm`h9T>2e9(>aKr=?r~Dgg65*ID((!2+w!i2kA!kUyXgUr +rnooHl2z7Gv61bq#ED%@qBYUAKh^T_jDBd^sYa`ZMU!R{$HWJt&|YAz8%lLMLQVb*Vg?ET{;sT`!9Yz +F7V=gz7F-`zK`LJ`mcL8VE@$$_aEf@I$Z(X{SNO9yFjMkgU;^;_Por)t-R+i%4zPkhOM{4Z={}G!Zq% +2PbgogV}F2tgDq{J{H3dY=A +-{vZsnYlf*ZhaxZm*$H>pozS;5q>UD>8fjm5(18^SN=sAzziVc9#p8p|T@Lsfmf%nlvODyN2N-Ysl@o +gCHTd*zIqwQWyv-D4lXS}in?cA@%91dLA_DPwh17vZg8=|I*->hGNv~b_}nI1trt=UT8Ua?0) +q5BE!JcYYJZ`wh}=fVATkdPbVG>9^zQS6*uvgl8jhnR%QLekSSl@`~^^5FXR<@d(^|ewuM}oi1cAzK8 +6EI5R!k@oy{VL3_Y`G46ur@mmkDdTbBp`M4qYJj$wreEtqP8wxU`8^$SeiSxQk9OQ{-UDreUy>U+@h> +yD1)`cB9KaFjM@Q40@cgkL0H@x{4j2Vices^t<`vi+V3*P&;!8^^i7_oO#GUgZUB6qQIuo`??4{C^8HZZ%JTVB@2kjuP#vTs$VF4CPZd66*s*pIvC!%LZV^p@KcT`X4i+w13FFrTPR$| +zm5N9@o4Tm^*o)g-E`am2E&uwn*1>R3P&l4(rR_ya9=6!JAO?+=r_wV9+x}n|S)&owxn_m)VNQ6T8l! +k__d@cs$KaJmBz;iHcOT(HAfyOJPKE@q5&WGpDAuQJ%pjbaP=={#3-B-4P`&%^U=fT87^~u)x?e$TNk +IvTl>@`BT8`?vw=Os1$d^x{foQovK$79^a$NXE72yQ<_72-PXjk6nf +L@0RXBhE#Mu@}z2#k5`$BF1QFU(+rE_x;B)V-cNWb1%*n{0n2p&(=3ScD(1y8;>22_-V(EZPc+?G{{! +z>;C@YzK1W4!`ernozSu)Vk|brhYcF4OByl+=zF@hIs5c1b#xESvIrWXPHzR`YH>oPvY`mc^r?`?XFI^Y!;f8J}{p&h5zd9WRBW7TKa%B~IK{ +ND0L&gT{HvQ3XyWxrTaE8g|7-H5q2?Y^JeRQqW>e;IB48t(Dg%+DfDVORKfzR&1};(5ea*BkC>#^)m& +hOsLRXOyAWUKZbGUw7te6Mc$2bM@+};=uIUmZ;s= +n@ffkyTlT@CzE-@}hKtigRFS8*Ivk$H%J108hFV)kmB2S1)<-_R#k$TbE&@2X?lF +kBl57hct{2Ipas_vv$DzdnqIamugZ-ryo0j=}I7d+d+S?{nXSR%^>H^djbxac&(tDm=qx(AO#ATtKYT +TfhzX)2r!fEXIBe=l$HzvAlj>>$2ECs2b}6_DvJ^i@h+xA!@UD>Z=s-yA3-+UZwtR)?D(C)MHHW1EOwoB8_jMZMyoen)1w)-ZUXOL{(Zezfa1iaGnl{)KjuMWoS=r*UzgY +y(Zr--$A+dQyx1l$)e(r_q?adh9xf5W<2P!ZrVGCn1^vQ$w +!r1A67w$V9b@L>6)|^+^j(e~#_1>^WK +(1GhRR#x*c5n-C7;NVK=?rTF=N@6kL0?U)l<8;7>M{Ue&|#r|gNC`MbT)9-w*7Votr!pEW +$Z?qfySi)*SM!8_@9o}dTM5RgkZ2fsD03St3%?foJen9q3+7(b%zJic#~D?KMnfczx*uwvvN-+~oa;< +t_rp7DzKcFBVEDQ5JXEbhtA@dxHx+|o)LKl_`2$8rh*a_@f(s^CZt`aa(87q=P(>_mKwPe-5sLXCz|5pIr%W%?9A!3`fx)#>M9pk!R;#)9(CRvaF +|luKieD)idEye3!**SkMnG>fh*&-$+3l#&tAZLql~OK36ujUa8cwem8-e$)hBB7= +%4_#rPBEZw!RL58Puh{I!N^+?(Qus|{~f`LXHv?Z+OVm|hh;JN*5vp{@PXLLGi=M#rdv&;p?A;kOfhk +M^1qTIvBZE=+rLRR>$>FlE-$D~H_`S{z{yo$tFK^sq0R5#?7L+GbK}*jBiIBYApQ8^B+TnjThvt}rYF +;wSqp3@x5;N7${i?hH$VAD)w;*VR;?g7GohkLc&uRQvm|86a0hYvBKgcS&;pTM9z^>aw2JkquDQe(T` +@dN#vP2^rAZKR2{$Ti)S?&De}wMelbv&{ax$=$?B@s_Q^!;e8Tb_Xj?Et~d_&Qd&*0Tx~TOzhjDmFfA +12P#o{0l$C|Pw$Om$yg%dU?82a13PY2;fY;Q?VN-z4f!`A$_D~1V4ii$tZiamQI%-N-8;Emw?6k07J= +qM0@4V18S+|D$7Eu@)GIMI!bj)kU9bw6s*9muq@jb6`{{pzCUTj^7baB0oU2M3cYEa4Wk>93Hfot2y! +H>-ezj +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 +W6)Kcc}aG?EW=I$ma2Y3Aq_?!HYhmE_=a*H4N +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 ++DS+|3c0Q<*U{@J{1U?TgynmKTvwN02ADy#F2j +<;pv3$B`nv`M-a{?{|5-mb@*X~i^%^z!qTol+L4x$|9Z)vu-ve#oNyuG?S$p~gS11Db}Cim|G3l_VL5 +KCBfN&Nv|EvOE%oI8Fkxw@Anhvj0|mZY>PKS-6HNYc94YNyq+Lun`O9%{6ydcpKZGBW{0VO$oK3h~Vv +U_m5&6sab!k`Aj&LdY%W<)^lb~sIwwCpwx)DK~~AD6VF87TEb{_`b&jU7%s`7b3b?PjE%kAASgC4{9NjkNm-CjUh;KN>r$aPq&Ca1>!HVQE( +-?Xcp=eFRjML|?$pcf +)4&`5>@Gecu##wwhmobJYG<;9RvlBrbNtc^dih)#r!6b2R?;>##dNhg!b`E_TW9e4c;&Kf`6d#nnC6W +qwD@->0km#rjLSst++=Y*Et_^HJ%1?#7jmSf??o<3_PglcDNa%V1TJ +vNpTK4fwrOy&8@8*@U4aWV{&QXUIk@~zTp$|u%oob6JqTRQFD#rl)0zm3|hE6!Ha7weqaYWiZG&7{^}u?}ca$01@J)S}8G);XN{6 +WF5G2VsXkTkW^S`q?a1Ut+y0M{OTDntn&F`$!jIx1OWQFV@F$)P5_Mc7$-KcrM4Xeu#A+XL}UugL!Iy +B-XK<>5JLoJQr-!_>1=Dj`P&|mq)t^NO{D%uvM);VqM5te+0Iwm#oIvo-!!7m4J0f)mf-^*>ilPqrWT=c=o_>+{e~&+URn!wYx!@N+f#nXA#qJYK(@xY%uE;LzyXLH +&UfXY=Pvwu;@KCk`4{*i`IrD^IcRU#Nx`b^--z`H0$4c-^?e)!j9}VqJf(DxX+?cgiEy3$Q=2Yp}x&T +iwEEtMUk(r`9il?P~uppY$aGs+i06&**dK$2l|)Z9MnAW9-4FdT-$KOr~FUyzt($Gj?C< +nIXpcncJ=o^7^3q!K_EGv>BF5bLakFt}w6eJu3YRWlWcK?QZHZ3Ex?by2reCEt%S_<3E1?a8_QG{Y2h +N=WRH^WxEb!_Sls1N$|5jcE9V;{(>J*<%C6_TR&3_v}>)`cJH6v{GF@;VMF_R=*HaEy}o+R)ba1{KIR +PxJ<_*aANyLxf{@P3jR%(g?04XU`+E4DU$A?1_m|>vBET5()v?qK``$C%dg6r_W_;XywAU}Q+P-rr`I +R^S==ty?X{*I#W9Q~e-){Hp@>iyA-Y~A&kk=;MQ8V*IiEqWVi^eaPmme$%$>|DRLuORMfX6?ccJF7S# +@Cvj_xFe1ZklAZMBEkJ@#`edUW2~s_d}1Qj3?&odA{x0 +@yo;e>f7a8<3p_NQQO7=HyK~@OtOVu`Rvf@o^S8JJ?rtl!!{jX_`CVVl#}zG++^62a^<~`Ug*Ah!o)M +4Y*C-xe_TG;B{?a))tf*66gVv~Xw->?cMSdfiT1bFcZ_3f|pmo@+S&!A(!Dubb7z>eFU@ub&3Y37j0a^T4KW#w6c^Z^Qm?7p?wHSLx{R5WC~zmc +oyYZw}h=<=3Zdt;`7%!soTE`8DtTm9djQ-Sb$FDKC8ed5>?)pL+gPJ_}?VfAGTPi=|!f`7qCSdcNm-v +Agf+Qy-^q{X@rF%YF~PczOTG=lZrUoAdcQ5017hRIFG0*G~;8E`0V8#!kPsV|Zcd;#F-&?$5bp>yncX +KCK@+W@2{p=Z{}qxvJZ#zzf-tJw|VR;)j?;Z|wd=H~rG&>@PQUpS$qkIf+n%GXMDY-rIg^_0qJ}t+$o +1tZh9FpH_eP#lpOi&vl&m=Khlf>yM3yY5Qj4CkN-O4XpiQ#Vy83Uypp@O8&fwH+}nxFW)An|CASes;4 +)9e(z1DsSn=UarUmu4;Id?8{PZUab+=2d+GN?H+!qBuIkh8rd0lZ`nA!@k6Z3GbhCH29a?l{d+p0!ZM +==?!{$%A)Biw}LdPuMs^)Ju;aI`I3_$6=IGwr-&=X|#rFEl%SRGt +HweJhSAFR}M}2zT7bW$@*z)Uhuv4vU1n+y~kS~doQ$ +S#}7WPsQ&Ee+>eJGYCh%Isuk-$URS<%Ligag7hCw0mjCAP54+{h)^Xpwv^?Wh|L^v$sk3}>Q?#vi>jM +=lZtpU5;8TU(^Czr4JFd^XE7o=28U5ORQ2%Ii|BEw!YMr~g`>17C_N-s&XMbfugV+6iVz*cdd-dsk-? +Zobe+)awjPpPKCVhL|?9!wD->ltV_2HBy{!`w#_27}6e@yScc)LgYF$o?+_e^a6BKt7x>&k@UjU{`A9 +qRMy+4?SdcdlC!b=T4M#RqJ2KPuX=5{LUMHuY +9RBI_hOu4RESOe)YvFe{rOcYwF5}H_&(HL|dd4!eZs6cDukr_X^#3)sRaocav9}$4{Fe?dY-&F;8`tY +HuPxl!&vVa&E#Log`dH$|N9@OaYM=UH(ySI6+HC%O+qPd@J|1OX`F{NQeQSEnd~9S?t6yJVX$ZQx=+L +QAhjyLp65VFnsaKZH{N|T=%Rc$;ncI{5d5oC!-6*~;;s4d;WS=p2oF29H<-UVnedRlAHEhpIuTQPY^;^IGF}5r2_7O{Wj=wzQ%jAi5$LD<5x#Ja|MPtU#K3eg`f`rrhr=EMVk +d+Rv6?1yVN00bl^4w|53~s(_$b)~pP!!bjmC1h&U30#Bo5)@Xel0yV4jXqH{<*qDS6qf`5XzHJC0%;y#K*l~8WDB##EL*mOF%?3S+nUu?GDKl-gN13vW#ez4%lTTUd`CBODf;ven2`#nE#=jktA@SXI1`a^ +eJ*m0n&|Bv-@a*IKb!yHdq%I{xjpdx^27lNdtMs&^gC}|dvWf7 +&Ix@7><^6Iy7F4VkS}MvegB%EQCCCujjjJG>f7oEy)Eqy=|Zku+7|ut3p;k_|Df-&%u?} +lf-UjLfu>k}Cf?|9y{`pM4&JB6jq4&1(JSoIS7!b@qVzWC&$UZ*V0Zhmlkx9^*+$ +~te2Z=Zks;Z=o;9d`~{XZ^7Mn=6KVI4ZnqdGX8LPV$AB%$Qy4Nf?S +JpS9OUDg$RUi0IppLl)o?8EQovdlBDpGbVpsxRO8^q5B+RjJGWoc57p-;v$hM_DtzoVM@wZG+EV3(Pf +5{vhP|TaRs9pLl6w(sx%*%(*ASyVr((C)bOKVgDuX-Z^~g&GXJgJ+pVjq^GMF^?v%dXB{73*}dkwjftv{UCr>=SM!gl$qEq9*oy*x8+=*Gud*R&cmeR#XAtACB_@$ +R&n7W6%~tgviF$*{mTj`vv+_i5hUp0(Yckc&;?(m_#rz&Oa$hbf*dnBo<{lxD$9*DRFjyt^}*8~g{O{jz +Q2t=&hf)!a{5TXDIR|ME1Z@kcdy~@(Kb$NY&$tE`Pt_*=eIkR)3R@$ +=F~W|PPj+*|C;l^vzXJGvz440zVJT7sj>c9PTA4#I5qT%_=fvm$>G# +!e2LRC-4C4BjOzQXT#i()<3ATKC%&h9=jdei**JKkA(d-RFtZhgG#p#120%Hg=H-qz?}FF!Hv)PS7m`i?(cuI-r{eQSqPaa +9laM@PoY-8%JhLiE~!Z~WP>EF*fZPfqFc-&Ubs`H`O- +uW&sIjHoM+7SI~w;o$--W(qN@!0ThJYUR@-Z|=nmxG?XGy0}Ei5_)# +=Ga%qeVZ5E>4D$w>hO; +{qSMxFc_4dsbadvATh0}-{OBjw{;@c~dth|+&P%&v&!BoF4RvV))oVogVLLY1Nphq^J{p@mj^v)Uktb1l9m!wBW{bFm^X~}KTE4PL1^q-Uwz3P11!>6ChiyrmC=JpX&GolmpalgFub!zndJykQlc_@kW5E=bm5 +8d0*Tk@jUZh30U?Qfc*yPVqbLficK==6>;PyGD4IeJRUueV0$OpgwD@$|XgammrciwFNW^ml7?ZvL$P +*ngk}A=*OXK8Lu5JeI%H;yi(Y;eHP`zALDKzj+(@8*d@)kBYvxfLnKX3srY5U}H@VQ?9{mv*D2?Rzt3 +-(3+8Lw%uarZs&n)G{ZdBWXUyW8XWnC`~tJpU@kIe6!If&h|d%&Ki>xYvnDrlb3sL+!U<{ki*M#Ld_4xdBLk2{_T_6ovTo~2eV$I68yy~PSyw}_K^D1g&HztGWG0J@yvK$kZNHw8+=1UkiCcny3<4+Ed|HZ!pYtU|E=`6olW`}_vnUj&9X*T3%84Bdy<9PLDxbvuU +zmk4DeH+kpE=4~+^FLShA5&Cd&Tt6MqU3>ZULHtcfYL_^K(9UeLVf9hclK;^x(OU}Emkwsv0QtTeCB0 +a9OC#GgDJ}aIqK1`&~EFOZn5?=Tj%zWku~+sSuZg)2xzh8Tk$j`8Qz(W+*K6MzRE9z7=7jx<~z*%_#k +&SjR`&cy0$fwuld+mw7OP}SE@@gg8w{=BOB|I-C?r1IRCw5UCNQ?m%=onKbb$#u3dRur|(QNuL`bV42 +5(&6s`~7xd-GiH#dJCGRD}AiFJLvrghRp{j<#~!~(Y)!p(D`r?O-j% +y|Wl;+}t^TT;O +v{9J>els+FXxsHHI2C|jL6rOXy-^DL_gn>Hom+cVRyV%?zk2<<mFuKTUWIC9v7RMfW~urc<<}$Fc;x$v_2Gm&nW_T%i~kh{<{^v*M@K_!VTV7B~+chmP~l!cj +M+BP?p>-xNl@+Mi%rTRT9T0r*@kj8-rmEYTVHAsJk1l(lu^w@jPyw#tj`WYTVH7ydKpV7@NmGg^pcjMubz-*S{Q2`U({Wxu +c#=-UwK+1niR?0io7-)iU%0DVst6Z3Nhk8b-9$JehJ(i6w@9QLH$%tmIH?S|31R`b1v}liSyCyuxs)| +Gy}@(pr#4gFgt=S+qzR+EzLYKh`M|#ep3zRDfimEY=@(FdEjpHjd~J4HMz=_Af|>N1j#W)o-K1IM-@e ++gv@WL?ojG&n;NpndMfl&DGo4sj1iBsatU^aYAV>(?(*88i2Wu-!lm~0i6uhIb?F|hLF78HG_n|D(|8 +&)TRl56yTNSvy48`=dZdBzGnePFgHdZ?J2zaI$GwQvVk=536n`8ayduv%AX7mpSx6_M`C@4oZO +Y)zA_}+tyyMaUS2+_A!4nTW3(e{uUK=YA`Qk@rEVL_t`jelB4D|s$3GPVMKnZOh2CsWta_bp3f4dtJUG0t-h9*g)y=vGkSd +OJN^^>o(E7Ry=z@=|H>bEdXk(0#B(UoK%#L(dop7b$nWt<^F2%V=&K&6@*L$|>ju!)Co=f-p3*(dund +=oGAxHO41>J-as4~<8Z{d73BTMAMDMQW`4jq^3gy*}hZm(R%d6W&&^i1bqBzgO{q#g92A%r1Xe3_h1k +mdQXSg!B-|m9@sqvikgWCiq1Aq9vNZ}xi-j`(T)JUGHQW!gu;>=SosE5H^ze1i;h(C~RpgYI>GS +R-y|14vppJUAPL*X9{dxcft4 +a`g*-SyqH0c9Y+N4<>hzpA+HXz%Gc;WlFKCGCIcSlf;-|-(bPW;2ER +!3dr;t5NH>~?b=S-4O33prNEhVK-i0>&?s_qTe;ockRQ2Y6`u-|69tS^Utm8*eZWKmao@F0HegD|WL+ +f7$ewSVRTQGk$A8PsRhs+%i_eh&#zYLXUEGq~;eQ&k*A+Dovm1pzgzz=>~iDzOH;XKbk9?v+#1z`R(X +|Fv8kG*rwwmlfb-0QA`nqL?z`W4zL@#(M0<96_i`^{OWharz;?mX@T|3USj3*r&X({Yz&#_#ZK|J|9+ +At>k7F7+My0{gHcZaTTclW3~y3}U#@P|Aw^@o99375 +s$zB0j0JWCI$X&i$-4!&c^U_~OwTqU(*S6TeHv+tmj^2>bqMJEBcU%CU- +QHLpV!GLscn0>9}LW*z9eyXg1a+A8+FFQzJN#uSAWQP>M`&!#$Ykf#1^1-=K9 +oqFh_@t;0TVMpL6`~0T*k`pEEK=_pJ`uv>dfVv}J}#~MjM~22V|{U{&q +v>e_i6BB9}9}(b3N&|8I7eCcxeE4|7Q69pj^OL2nO#G{_v`(z&l6ns9N#tLiY@!mxiF&3B8bGuQ(Y{276CF=9m1r)}`-pBL`WDfBM2`}!C0b9 +kd4`}NL?elgBAQAxo9KL^ONl;CbQ94}h<;AAmgrAJ|0LQnQ&0oZNTQ>NCK632Y9o3d(d9(f5q+NMJ48 +PxdXcCvl}|^akwnLuopl$lP%4kUL`R$4{SWHKnH?!OnOs;9Z_Ub|#?E@Cm>seCR(pP~Io4szjT0*ytg +jci$2*sF#^@cV1PqSp2W3x>*wpkg=#h3_8 +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 +s|Je$Ij}P`c`O5Fr +3lHp+(rf#T(+^*~qHWu@-64nNv@`ma`uL!(UrE2%|9sAIfq3*Yu4&Y9*eH4UQp#ZPFc3Txosrj*zDIu +bO7#Eq(@zrP%w?H87}?;XKAF_V$1lJ9BKL1zBQxfP$XBQN%9p45DIy;KTFQ~fq#RZuWhi<0+-c9ynZA +ZS@7C>^KB?U{-JUyd)omIcch8mRhn$yn>(;Fm{P_~nPd%y22lbwMU6&7o7wS6o=)5QLOt`q=og-->OxsTK&fu&vE{D@}T{4J +TPQId*HRf1L=p~lO?Z=m$`HL%FNmQWGZ-A10I;7;6I-L58f0AN}z6O8;SN%NY;R<_tazUdRK-gDdG4>8GFEu+U!?Jkv+!fQJn5kTOH3KmM$gk>7xaN+}; +Zq1!WkQpgvV?3p|m_DmiOd!|qF+M=qtSeJg<8OImIS+$uw7`ZMV_1TEQ3)7|rz2xh2d&`2S`^fAB@Gz +^NJYRKMe)hA@Lj-sja}qqb*mH=}p8XH#KFMdVK0X^hsXcgTy`^5ir07R{zpQ)r?yV4`EFt~$i-gn}^1 +ztK;Dz@%)*5jcpK-ip%)s=ft(V+5zn5GG9`eD113YY9IaQuJd+NHJ%_;CX88Y!P?AaM(wBJ@g{qz@x{ +`c@Sy193T_p +0_5Te0dm3kK>5PV$K_X_l_?%vV~j4&7~@Lx!{00Y2R+M4H|ZiIO{AOlK)MZ?(8s&R#~gpjBlZ97#QyR +v@K6jM*3SbEum##Pc}R8gu+qsx5_x!PfP5|%Jj4Xb`QryF9+>Epdb`9J-QTHS|LHS0hB1y{b~qd|H#b +)@E;6#KOs-}pzyA8GEPE|V?pWMYZe0i-U<+@6heD@4(@U|$?=O?BzVf9he)7dh{_+Lz@GN*(1R +myr2d26)#@`Oq?|(=?bV2Dq^m++-dG^_7WnNyM;^%t!FnA$u<^DJ1&Lur%33%879+W+U2l^z#p6&2St +EcWU*KUmcz7N>{2h9}(Z#F_u}nbg7 +&*YgR1}SL5SqGGU@mT0j3f>=``N<7cjv?qNSAB_-{E@09J^x0ewS5i%nqLvmb>kB^r#X3UVwmMv3u{p +FWmD!;>6s6JjuH^&D0D#k*LM>!v0qCM}+oGEL5#(X1fR;@i7F~&-#Jtx5yu0{XWty`NS)_K&RzjNo#J +z`>Fri>py{u}sFC5P11R5^6$P&s162>FkH{6oI{^2_q2mtIozaDGpE$pgm%juQqSoWqa@`cvv5$3nKT +>xDr1Q5NaHAm2})bt%S}rNsRgCb?JMSocAnl};GBWhakO%pr?s1;OxQ?=*JoEq$=iGS#a? +`&i$S*$FC@-8pe*p5n?)8V{F1(k1dhyC9#WjeOMQg=-KTh +pG1*qiHK#kKjC#_ZTBlcI2g=1onUWihXpW>pw(>?b@wY>)~gfdFD6L`PgHRsZ5(Tc<9)%qntf^wvq$K +3}bD_;Dhv%eq+s-a|1%!18s!%P}kl$X1mTkIDZy5xc)}lqW(jdQWh>;_%ZD?BqT)6ojX^_fjp4@0Rsl +e@bGYTpE4j1MkWu&yq9w^#@Ez)(n&}iB5$s`#h8la;Y({S;k#mSYLO*qrnYzUFX5J%RTyv +f|bEdN2fPet$=jSK8bm^kxz~{uN%SU~>W!Q!RsYmn&)GPX9%FbBd5bDU?>)yXm^n>qZJ$m$Lg+5$Ddw +%P!w-gWTAFdn1J`@j8QBiWpkReL9($muw{p@S@IsYczv;+Dd-e+t|{b8(4JD?5FCRi_hFlhe`^(^u9^ +z?(=Q+Ms!RVnm6pGMb9KihSUe~f-*=6sR#K(-RG1>Y)G_5gWH=$q03j#2Dm1IJiTq#tFU(*M8y`s=cw +pg@g*g@uI*kA01Ps)TQQ5@Y0C(7qG*o)h}M$Mx>tsQ8WX5B)#vaXGJPZ-k_U@}|u~PgN{2dGciCTVd; +Je50?Sej9p7JD^=sCe#zkfIitZ9^&7umolO}IG%%Fo;*Rn+3;FK*QMW8S6y}3RkukS`JxWd7M^?VISH +So#%b3?+Kfyb`WgBnCh8C8M9id}e63x(mTQc5lgV_WwAa#a#Q*5;CFH^Ii}mrr{-zJY*sbOX)G3a&^{ +nYD`Y9VDhTy&q^`5%KKBo;O^JV@U@Au2-ch!ITh`M8JU0w*e#{R?;PsmqZc}3~BYrh+r<)};4bzXA}A +nnHf2;$l`{{iiae%JXg#-8QWOO8S0!&vX9|Ddnqc;w0l`*!2Tjq=r3Usd{S*f2BsHrD1DH}RS}W9%Qm +XJ)y%x&0@!*V6AgF1p4ruCdM4WWsE>+Z8_fVtMjLdZ}CVo#e%!9r0=AAJq5X(N9`nUrPTmelIcRUsvP +BSo1XY?^FyMeqlY2h4}{O>YuJ44j4?MqD^RP +atozGqDQ6v(GU!u%kBw`=+*5e)Z7HAlP|8n#P_$f)2J(7e!-freVs1ALHeF4BhM4m_{Ou|DrElSv4kA +8JMQr;NVqpG;f!`l%g?QuagyZ@?8P`I&&)3JfmizIKQtta+O5a_o{qL^Q{{8UbX=to%pNsn|TodP7>?h}>Ec@ZQ_Ig{;PcK@uDC(t`UK&Lj7&~$P!10lOonsMwH +Dg)EDSXDinZ{IJ+AriD5BEE{rp^5wuE}$c?ON?~4uCo66wDW%GUoT3=dxYK(d-jr&cnFLHF3Y}@ss*~ +ANR`ESJk(4aalTBM;}!CuJ1n7edmFF!tv|OiGwn0@hG*9x!k!1IQEQ`5vTQi(-BAYeP84K0atzG{t)* +W`vQJ)xlXp=n1cCh6yn@buJ2(`{)~Z13&)==D<`WpFs=u4P2Omq`ERH7eNXPUDSa&0_u9C}Lw)2P756 +&1PdNGmg<5K~&v6{{{VDV2&3npqzuSms2^m`#%nwj&iCoX+I-+a)+oxZbPya0CbkNdozrNQ-o8W$@Yx|5V=FFKhWx;|4Pr2^Bk_N7uurHXnzRta- +eCK{2_nEjJN`2%W6ZbY2JNK97j??qYi{cawN*~KE?S0p6zwTae-92E+f5&saYQKwnMO@S5+PI;QTo>p +53il?|9+$KIdE*DEwg$WCW4}F@%bzjX(xpqIRzcD|f9Wv&3-Dh##yJJ6HYtQJw&O)`v!o9jBpkcmquhAv_&i}Ff7 +hZTF>b2Ki8^ygL#^a>Jm{%L`4U!J_1^p49F>(L4;OR>?QJ+4#=vux0pE35_xpSvH_uO-n*$*$i_@eTA +^t&AU=>Mq;><{W9+jiY^`tIn*^32gsVH0)qagu-SUfI>!=a|BE4zB64k2$}BE!M83*WC*S^W41G+UGf2MvZ>#*~_#r8;5dZY=-~S;$KfgKTWB&a4Q^$@S`<}&OkrO9QRO`UYmoHaq7s +lL&eNM>!H{NYzf7Bh5nOG;veFWXQYW&x^bLWw;do>T_SkHYK?kyqCl4HhUa7BV~@np0b>o>&%tw_67YmeJ1JLzJ2?P;`;U|l>IMTwk#?oC1sQ`=cb%V!-NSFWT#G@Ay~KCa1g%%{)c-olelKB@MYX%{TZ#6B?Aco +{EqPla(icvyV{ZP&J6cMZ#RO@iam^y$-;Z{WMC#=0Wq#l9xr^vMSf9LT)EwpIIV2fjx6|N7`KV&HY_* +2y(%)~K~&`bMrf8GDLJs@iVsP4?u`fv)sAJsY;QG_1O`DAO1pjE;wftYt8Yuk?eIMmq +R8&O$JA=MhD)jY}KbrVk6OTWbX`HFO6JZy2 +LXVAxhwQJX|Pfbm|03Y>TMn=XzGcz+U^E-KYd1q0_)SR3gbsuFKq@|?=+wJyk`T6-up2iqPIm4zub;a +j?+KwGNxX$_u>ZpMJoueIcZcKeGz#L@67y5fpzKE|^9aU9rGVocJI?Wi)h-VC&qA!a$rO%ldpMHd}rr +Ud$#m9nUFx#T78FM1nSTO30J_p|P!|#US^T-?Nn`lR*)%bl!+17NqVyYe+j&shPIDh2)m2(BoRVP2c>Y +ujz0dfpa$YALYa`$an{J%d-Pjyv2Bru^wYh#=4wufoFs2y{?>qeqWc``q+l?1ze7DRQH&pPEl +Hc4yqqc?0K8^P&fPy{Nylh92iu>n{tBtwI><0E9#s%fKxF^T=2aK +_lY2Ez(@^r-k)t{V0{XI^#f6kCUb&tNDdP-RiA3j|5Dg88M`PI%;`TC;4>iy3(2@lKn-^?QZ1_OWFwr +wg_Gv3Fc-)783dC;G_(!#$vmb>ad%Nz1H-brFz94Fa6$0N=YSU3GL#{LDa`1I4HoAt0SxK~7;IA(J_i +MX6+bL`%=Yu9DCO!FJ%`FkJ>H)j@C$wrw*&fJvuHPJ|z%^vEsC!WBj@yiwJis!GH1iweYlLL7Anw#L) +D|p4T*BS_mMfXlTd99(dq*bi7NwT}2m_Eedv1_bh@Z;j$lQsPa=#<0KajXN!kWZx{TXpst@1txkuN`p1ES>z5fPK8=5e +U$-~w>&rl;kE2lE^m;Umi|`CL9>r7YQ9PbUT_*R&4T>7{^-Y*O$vi81dVJi}DgD}a?P6(fj-E1Z>iD= +R6Z*9u`RJg|KJCr%Goq%9kD4@fN_4;WbE4zh`}V)}=Dtz!@zImVPMTvz1ykbtwVyeCO7Hk_vC)&G;yX +`{8#jGw{M48koySd`+&e0Ma+g_M+nXmxO^J(%j-N5gwKY^_Hus$|eP+D+Sf{hLR@bQQp;ihHnDNo$W= +@ZrF~@n0JJX}5%|t8F2_Mz+JfeAq6=lzC6&x)R8p2UCqwU3Gqo-%9d#OUem%`@Zt$ +MGw5{o2PwO^T0hZ}z^_i1(FS>Fa$NO?|yHlsj!w80fq9nB}wKBCTwK`R#xu==a +ywWUbVQJxMk!jX6TUt_@J*_CMB&{s1BCRS-q0#-S>DF{xdQ!SQy(qmTy)3;Vy((Q~cx0F +}EE#?oVHuGb)(l%lQieUFD5E5!ETbZ$Dnn#?WSTQAnSPmJnUR^+Oj~ABraiMLvm~=Dvm&!9Q)GE$nX@ +ceepz8zky+L(TUJt*J*z0IB&#f|BC9G31E<66usHl2VU9?L)nRiaIqZ%iM~S1%QQ@d^h-{B+bG9YhFF +PzdGTWMM%TCI+XBTCcWS3=EWLIU29FH7xjwQ!0CoCs2N2r5d#{=-nnv;-Y%Sp^h%1O?#=QwhTb4qebb +INkcb1HHwbERgfMp68M0nP<-P%CqG8vAgmy~AhIB~z*>+{U@J&0NGeD!uop +NAiVBJgN(xE~$_mO0DhetKstT$LM4@}3N1sgoJ3Jj;4j)I5Bis?|NN^-Nk`X)?J4zkpj!H+h!#&$G+bi2AJ19FmJ2pEZJ25*s+mT(IU7B5 +0@PQVD=f>tHVSywmR1xQuTsFgYv +@jV)GL667!NF+hWMI95SuWbB8p&Aju#|F%}X`g!CMcTq&ehnO~jn4taS&RzZ+cEM$}j`8Xh(QplweGI +57IydaAp$RV~cp)j#9xzJHqTv%FIURYUJP1$&uL?VE@-P7)6_pt}r!|k#51bd=A+3v6x+e_``_DXxT- +95!K#Vf@pB`764B{n4?B{3yA#gS41{i#s8;{m;~Kxe|BFIMPE67-}9I#LGxsDf^IKrbxNiLk=RLTjO| +Fsaa9SX5Y2SXNk3SVcO_phJDE(8F%FTkL-JFngrkYPZ>wFnunvm)Ohf74|B-NbyK9r&v<_Qo>RqQ>-b +rl%y1UN>NHlN?A%pN>z$T^++|RT2lQ|!%`ztt*N%uq*QxqQ7U~`1$>uC^ML2Fr1`;f{onUnR`{tT_^2 +Xys4{q`svME)k!yx;^2-g&jm)*?+H#X}?YTv{CGa>E@HRX^nrkKHC|i_^KddGZ1dxbctW0%>&kstAg% +uaUic4U@B0UVY5ee(C!ai)UkR)XzMX-_**hv{Ir6T+P%c%9=^e3hN2T)4`1QY-O00;of09jjHWdj+L% +m4rYrU3vO0001RX>c!Jc4cm4Z*nhWX>)XJX<{#QHZ(3}cxB|hd3Y36);L_fB~2EpSsKD7tpo%j8YV7@ +4Vog|QY{@p0c8{v4MtSdOsHlV5fdvtljhnE&Ww(;>bSh4vv02iP{;yVSOY2sP>iBbO#uePECf>DIp@=#^Vup04*U>$zXg|-Ch@0lT46r(%j1>eUzfgL@F;wFtworE53gB-Gqd4) +twqRB?F+G0SONfK+bqJ!|GF}L|5=1;>v!i~t313yf$u9%ngHS0?H88u2*Sc^OBX$;JSYghT;8T|Gkl% +7uv|X;zm^vhe3HOtY%q3Wxwu^QwI#eDjSXp!1o=OEBEk{r=Z{*L}r +1nh4A_%<)(f2O#J`zU$`msM38+Fh|G2sMhY?tBQrd5`El7P2r_g0A;%)fIa}mNMP@dn1lhI?IIn?dL5 +43n&5)zP%xpR0%k*gbCklclyP-_f2We4xp&WI$rdb3{93TkmaUBfz+OGv+N8OGc-_fU?`poImr~NCG}zGIM2CC$ss`zq-ZqKwWP?8FFM*rf04+N17|$E!`utI-hx9N4Un{AFM}~-ER +a9B$OvSemu=m#AH!5`1oB{K+qFLpnRskZr#%UPY!=VY_bAgd41Ahn#~ +G?CCzI`0U3`4RLYiR=7AvDYyWl0%L{_LW|Ytwn!9^S2kq@gcOVeK!8$7C#>rZ*gNvU(hE*qjyB-XBma +wPfLf3>l{^(T`c9Y28-H4%3qTISX-herA4vZ3(dZvIA@>JU%T4*kS1b>3(T}G=Bl0D#x +L@cO#-^=fEVKir#ZAV$(wH^>mn*=%nP?1cNe3T911JK$h9QoF*(YUXCou^ce2zkHg-s7Aq=XIyd81(4 +PUsy8?la&dFSi+i0G4-2_}4d}Z*;TC|g}gTn_ychS3^$(s+dOPl{l$L2%Bb8s(Y;>P=+A8fpnu<-z}P +`&P;PN^O3HG~@W$gGaf@18h<};)WX{@SF~? +m%_KSel4`Rp&xDS?*j}~)Qh@hJhqiT8@IO1_8ac^2|i_v+G!0r+UsngVZ0>U?qk)g88_>FvN3jCpC&x +_VH>qTE@=MmG24=(>6&2}+Mp3sU1puy^TV+56=|$do8ZCJ7TqqZ+hL`4YsU%QFCYm!WCrAH9#DnFE;& +*Hgkgn;lLhQT8|cCsjoOb4+>4!>72l(Bwicp<7VVTs2@ADFl%UC~VJHJ-Z?{-69blKeonpl;_@H)E`e +$Orb(G#BR*a+cPD*bOD~3{fomkNy9@e)*dxram$Kdf>cnUJja4*5PGxXMKxbHuPu(fGViX6scurag;M +H9eJ#v|^v2fXJMN5K1O$d$9#Z1YB_SIABVyyr0I6UzCPaz;|l5!u_LIArf3$~i+h)?-MPptTc)q7SMb +hc76163A|QVfchHGN7I}lp(Mi4R?D?5E7j=!AoKIODu4X3hV&<C501DZ{Ldh~JwLzX9XRAl1jVvyX#-kg)0A)(ELn^PphJ5uMqoTdCO<(5 +&_c-qJNtr#$_xAc~6Ah&SGd;U2Hy!nq%X;;@#>phC`GBm@hAu`bqrT8z2yX1HfU!4Cg#gd{--J!8)DY +|TUyzz4(a*Gx14j5XXhX(o+t(N>&8TJ9dp`xr<-?baURsn_w;a~+tvT?_J5iKiZcRB^)-zkz)c`nw!? +rb>=108Z$5Xodx_tO6e +OY(NTf_WB}0q-w!T&w7-94fn*OIB!%8fZO4)0KRU?Y0~z#Bh>B>Zbx|_eG7a69v%^dV)dEV?WKy$=Ds +b5_bQLeMK=SNc^#(Gu*=?>(tCk|{7*NIR2gd5b_~I0@6QNEGkaje!RA;xS!UhH=2WksWWXnGRu%R~8q +Azr(`D0M8HeE4Ic2rM2^C5|LXMOXjJJA8V=Tnm$m@Tc(u9>mOYIpeH!45W0v6_$m?hE`q@w)h&-hK^D7{oartLSri+B2dtjg3 +%_-?IsC0z`C$GzJkJXTLd?{^m5>+M%#3!zs;VcHKpH-}OU8Rhb*gkFjAX>v=Q1=Tvf-u8rxV5A4I-wn +M_@I&+upN?FM{Ku1kTpR;sVa>c-mMk&i*xQhkRGlMvIdl^R^Y~sF3%9x^~Wv;U}wQWrq~D#+jyO?pbp +f~0$5zFx0=P%u=pqrn5Eo^KGZRBT*kJt#1ETb2$j%S%_pvb+=}MK)?=Z)536-3I#r>W +7g6Znkl5aQL)gCe)9{Eg?Evv@DBu_s1qA_9U3T(D63}4A +otHI&V%Jp0L5VuKh&Od(RB1fTq(}GDWm~zjiC{|X5+fXBB+fEPP2EbE56_ju;9tG;85dAs_{Fs#`pTx +NWV-Cq#5~0$AB2*YoB$SbM~^$#PwE^|4*T~u_`m4?JA`C_=7ngA3(-NLgi?BsulSdXcZr7YaO(~RsnZ +A;YXqnT?iAi0cS^BI9iA&814pG+UV>-Adk<zSU|K4kgYIk_ZjYI4y@3PSpwAI8@dM +-+V*Fbc>Ga0$z1}jl7-D;v!XTJDSJy3{UZ7@4PP;-MYhuOhsy2XYx33k^9FtI@t%7c+bpbzJz@I8MgF +jA7MwWoo>?zr5);$m@h1?m5?H@#*IC_@9}ni^MeM~z{Gtl!khHBGMA53Vw0;a*Zc7gZ7&d-Jnau08v6 +PDpGk26qKwlfNt4M~{4fx0EKo_biqfW_0Kzeh;hFr@IeJ5)JpazR;5qiI3Z>=&wR%>7%Sa2VF4G +AH;%xda#s_VEuFbif?b_OH)8NrC`nSHmZZ*+l}6Q4`Bwqbl?E|&rvYNMggzyjt(eg-l{<}9rh@Nq4!{ +Lc`ImLS_j8sQwI$-A|2pmj1(nm>lQxNV|Y(hpk*=rt-R_mkd(+SW}p7eQ7741dl|7LboYPCi6?ZK!q~ +UnIkQ7o-3Q{`hK`9$P|h;`0bHRz8_y^0n?85=?qT9waDk?fBKC9V)5X7w`njmmhJWu5@7=unP531{B; +IdR7Y;AjKORvOY{j?wCQrk|xg-2FzZX=-Bi(y{!K|A7ld=6})y+O7=&vDBQFvH7X4wN67;~(2Q{xoy^q_)%egINa +(#C2(dK<=Yab{Od^=#BK4`K~jtnyRXS}9K9K^us +;%;D{m(rn6Cdx>&e6+Bc;;5Nj!p(qz}}(1CV$qk%*fW%>`smjN1&Njt7TZggU+_nB(X7S%i&)xonzTg +$8cj0g8OEPA+QPfI@V{@dGHLjW0x`cKBxy7YSuXX90e1kBpjwnW;Q;yqTF?H5@7IGEySH83u`w!4_Gq +%?8Tll#T5mD=RC| +o3t=B8HCSOijDS&%tp|*z(EHFHZ7JeYkIWK;vZ?cOU`-T<)>TNe{TwPTob!B8XVx#GVX$Hu;K9x(d;@pBRg&g`gA|=x_BQ4)U +LtL3{q=c+L1dis&RXw#-FeTu9JIx27<7y^acQDDuL6ue1f>)2T&_(TOXJ@Viy4v`|&K?hc(&I+#+ZWy +G<82lxB#~ckD6D#14(I(|KRGpVD#%D6lp)umwVA0v#=6P^+oikw4coDCNu1C1@dE0Dqxe(4+H%k%xg1 +I1Y?JA$zMF@uShE5NXwElj9B1?!2m(d`{Xl^E1tt%MeK$t};Rj@p4R{j +dgWWYAg%gjqYc>c-MXi8aw`x6CLX#7Dlc%pl_85c75m0$R;+0OsD;bGbG4c`8m2yI@ATN9?pe1NWzAV?0KwWZq7i#s(C(BVu1kD>%;Hox*{=xdSwrSM>ot +)K*vT-&D-pYiA +7S#3HCqc3X;&s4eAI;iEXa%{ihs%cA(es8;wkk7MxEvt|$_<1DHg@dKWbXTf&SBK!xq)cG_&}tfEua= +@g7!C&tfRT+8H#7_-S;H)IFc4(L3Rr5CyN2I3t3ko3WlfU$ehd)#Mj}4fG+OBaC_)#?fB>f6L>2rPWD +!izG#}i(I_ml_cBS;f)(ly>kL9qpyN!?+qi53+3#FIR-dyMO(3nax!DN{zR{;(=kk{V?2~}_x6eAJXQ +YuLrYlK4HZxOClE}z|HlKxZ_@G!Z53(|QU%dXM?V>8GK2#OSARRntKg^_$%V*glZOyz_gF{b=lc9H?@Z7F%X;>)V^ +NdGb603njg)rAnF*VEzH49yAh~5!}OzaVeq9iP&evLSe$w6BGUvAhtH{3S33njW<9Mb!LV~&iWMQAC$ +9>GqLeJ&7~g;u!h+19@IrHv;zbq3q4$u2(VK`ht3As=ZGu|5n1j-tiaU?T_qzQNeQyroW0sNccSbtDu +F>ou+{bJaC3d$Wf*G-H$n0(1U&~|$_=mGE`T#42-P(d9@P^f)c?z5q>*vfE +h#SMZ2C?F=cMot~DrB$~}xn;^A?XF%}QxVo(25i`g2uc1Zq+Eq;hpAG`!^Ah{_o@`%j51Y<(@4Tlr5K +O<7=`6xm`f+|)GBl>5!W3k_BMu4Ve(fY$%MD1AlW;FOi=gNHHqu&vObOsa6zDG`6#Yt`&fuSVx+sD+zg>ssIQry;zNQ|Sv%Jn51lSY~cL~94&OA#aMldK7I@bnKS +Q~T$3t_|H}8nGE#O3?m}J20CL=(2#tnnedqO#cjW62WpVfeDQ$~o=F0Dc$!J>1@{|hJVBa(3*<4+A +n-&-Ti#0)a18#OgN3X)2<(qEWyi1t5^jQmz+hiA6}>MJOK%7;Cw@=TKLVAn*q=8{$?&6{z~`+7B?8nN +pSaFi?1#3FgGe+S4QdHP!cN%2de+7DESIYnqI&Q&EVNrkoAWSy2QCtbqy$7?9p4oH@odr*4>PpyWh92 +ABYg*2b}tHu&z*ypr=2MCJ!4mkoC53!w!;^lX3@46A&m%Euh`3GXLQsej)qdQmO5E|Y&4$Zdx1}!;srXoo>G>Z60#awWzZwMw$f8Tqeif;F<5A!V(*Gm+Vex>P{ +!_siEpp9h!uZBmIx4rl5gr(r7{FJxzIPdfuOJq}6zYV-_dZ!3KK#5}3p=YZZ;#YbV)954!Re +P|4s4|dD8#yAiS1Vl~gsg8mSbdb^u&;eo})YJAnMBKP?AIubKY9NseXfMccDydi)b`|SXZ0zYw&=(eX +EyC^4JN0Z=pxvyFsPBgVb{e@OZkG%89#mgoI4U2KSg@PV(}L;4wW`y|C}D#q17w^tPW=X+$Tntbo|oB +Qs1b#mRy^WO{~74HOCOMny5#7jH*UuL+@T&FEyFCzj~l=leBXkoI3?K#dDW>8i59^U8Vd}4h|#2^g3d +RL4h;1)Iz`kS=DA|(4kQ&=Gcqz6Si=x)s~cg*Gf?dSJgOd~d!--iR +=$Z>6WO+@>;2vgC~GGgzTvxYAxZG8&%{x1oz-%!LEEbR!C9p*CJW!nJd8~WHd(AJNVm&{R`){#bhNAB +fD49&P)zyk8OAt#C3b5PgHNYE<4h+T${9r5R!h~A$Dm|Y-oTM5vccah#~*M{LJatzpYM{lwSP&-pK^2 +I2#pw8NHI~&LOPSOkcAi{@Fgcf0W!~H-LZyHEFz25`xx{M>jLbujKmK@0ef_W_fJ|hbNt$Kr9yFq)MT`PC! +LG}eKqn&7{c5Beq${K1~9X?wts-zx$FzD9vuq_z)$r~*~Y&0OU&wE4+BU>^WVo1?9%!B9X?TwmtGe2U +=Mt-?eF8UaHt%6#Ch`m{Lya-RAX{I&He2$95E +3+{oyMp=uI7L|RJh7&nlL6}!0fB35igyNtJa*(~iU7s|W0Szyb~1O=F7pxm?~2vQa-{CIpR!Gjo*qwY +e1p|dAcq8-O0jNGfl@bft7heWi3#8B1O_L56cx@`eU$~%3`W42d!nfB0>2-3`w2YRs8;i#g*YOdvNhp +yLtB%*@v(IlDOe;N@;RKK_-e9Sg8wGyN@-HHQ>&B32pMlm$pXz-^Dn4b)a4$LSiil@P$WEHzfeq+RkuEVp8~ +^lA?B76o=Yv4SlLDJO*-wkJX`^y<0np!bJ-{wI1U}t@)SfyN^v?oqG56WThE(($}bkPOd6mj|O5x7A@$*f +Y%97+LDe8XHW)%(1tV8;2vcsRgH1PCPWmV}#av4KZZnB#C->*<4YDSj+Wx59^g}8#3ijIo&E996@0}( +bAWc1x)hLPU1R!H}OF*r*7NbTl8{0xLJnVB7`=M@Qs%h%gYeBSX=%Zh%yA4wx8LYjYnn23?po7!~{kC +=~Lsf3p7T-u4f^}-8i}}_#1nMhH!fXrSj02j{fgsO7i-D4&*$?A3E*dYWMHvYp<-$GEN5+QAeKyBnZF +nyn=&Jy9dK|!!uOz7tW(azlcH2=?;=aL%OWfNbN#EB;;@;6$hc4=Zee)qX8v)_}zRVon>ny^0Tyxa`N +|9etg{PmP6mM5(RD1qHi!xMu3yQDj-mNX#D_GZCr(6N;Jde+;(Qr3ZbB`p${Zcg~{ +H#1O#Kmd%ow_l5UFl}2Q$b!@AeZ!mrY$_C}o=oAiE3qpQ`a%Xyk!c7+xl--!0g8M@3YSdV`^64rKiETUv+_+Hd=D078iZ+O=(ch&{@l^B=gM+c1a}Wmgs6i_SofBcQk|_MC%yu3Y4BZ$_7%^u3TK+i +J>lF?1+&czvoBi^>_HmYjoX6`EfAFYA~03I;`qFV#Vl`P!>PXx^_m*7|2s(#)?@sRHX|#3y +7=PN@Ns5rylB8Ix(174M2_Z36fMT0u_ZuSG<_1`bISS=bXGYLMa~~@CK{O!D5LFuoSu&lfamRxnPu^y +PGN7Q`jF{CFifdZeEifaauUH<4YgWuS#*(|L +3nIR_;}bT5Cjii@nUqClzyMUoqQnG~jkj#M(2X3-~sv+txjRPY^v9gTUG6q4jMc5Wk_&mVTAYDl +!Rxh+`4<88u(kY9RcMQ&^ojZYO9Q8(sKTk-3(ae-APn96yD`es-a{!SOsi@xAHzzQDT$S=KSvd@eEEY +u?Ah+jCHkufXX$xnJ62@6!zYX)~_uTzFBZ?sJh9g_qlQCuUTafZR@=^iE25rY8%Y +|{Dw4E&>8f$iO-?QkrkZ7XZ1Iv9N7i2;-~oJwJ5`op9V8QLj5RUYcQJ8HWGon)k^s@LebJET060x^r_sJkr=@#r7oD%w0&uiaO-Vpju!gp}4M5?VA1UO64&rYqwaj2fK=;D$|W7G!!RH{W^1Nsi`3X0Wu_YIuS|h1Ct}}2)vhElJRESOqd@@H8M+aA>96PcVYRdTtWn(1-e1qcw^8(VvcEpc +ESUx+MO_p(98Fv5kk~%m4henSXT`7`n)Rc_VH1iw_THI>J+O5n=)YAq!u=1lU;ltCis2VY=cr5STew* +DP8Gw;c}}7M_w&?%L*O#d{hy$cO{$!3uZDk6qccxU~gnCk +*ie0e!ym`8I3@u+hLs3fpc(IvkO&Bd>l@Nw*iB8Edsg$)hlFcQj$_(%F8A!jfWf{wPrmka*Jo7(>pRQ +?n?D9*kdew%tkcFw`*42zbNO;#Q>C3vUapKB4s=y8OS{ +u1C9yHi+V^8Y!a9@keYblGcgx=UnvuFzrRP>qr8)LT2edrry%JwBi=(YdQ9%W_AmDCN%IU&+WvzhI`C +9m9PgJD*YV%r6Z>21|@@+%Va)!0q`e(MN2<_h%##{2PEj_B1cZkxpX(S +7na#`6bLzUlk4U+W&;Tjm#uGN4_2F&xRD``NSnD9s*>&T=6x14vTDnsD0tPyVmv$6L_9H>bJ~Biul>4 +LMV&;8?@KQ323o9hm)2eM+-d +ULm9DEp&}6}$cz*?^)b`DJlP@$o~iC=PL29!!IpOIl5Uv3x`Q>)OJQ;4baR-+Dh!88}$lNkHS_mpib0Is0J_NG>I}{&lg|GP}BqO?z#D@Z`HsB+}&_02-L5r3n +{wg$fT%&D=1e23i9LBtZzT5?GE2%Q`zox!MzB_29M9nJ5{AK7evE47O8!xfbK0wKQKRYY2y}`)bzZZj +WAy$0R520RAMN~*ykH#Wj^!tsddj})_vT(atiLqudom-2gth!=v&2l%!J8t1=pn^GD)z3xUCb4aDQLS +9mBuCNZz)=q+#7%>(HD~S6?-I5RdH4umB}S82F{U5?-etZ&ZGIP<-^0!C&LsK{PcT7PzX+i8)`&lG0- +Rz+CORT?N@7JlIYShP6*4{e#fpE^!*sFYPxLTbtf(ZpWS&^@Bp&;B-V2<&^FguVWy&uSD~7=X9TWywQ +b4VDqN@w~nk!zJ&2u8b{NCnCI7#A$FH@Ihh?@mqTId`k{4%R{Pp6M{#&C=J#Lc-l)AM2x;tQiDVITug +oNu4Rc&5EU&`6(A>g^PhbaHdc@GGb36oEg5+5=FSPXc&2%uDMsw9=gzt&edC-c!@Q5jO6ARxOLNL<*gef+oy;mZEdMhVdkdvV0yEJ +qhKOVn{}Hq1bSzY?E|{Wg95BRJdYj(jS@PK6CIau=+fv^fa}1aSIdFVR{)EIvOJIq4&W9jmvmf0Uz1g +^d>XNwJ~^64pOurv8pFp+vb~?OZBWtO8MGeaOt(hvioAmv9~AM5Vv!eprC`z;P9dEaa!4ry09Jo^dHo +pug6z5o(jO>ST@yl~5H!8*qw`izFW5ZkI?~m)^&1=CAm2@#WaY`T3izHIRvBVu +_;nc76K!DwnKo0H6$IJ;8D~@&pA&B1V!KH8%M{d%sk(=U^99v`KlPJ-#5^oLt{;QDn`@*eCze0}hdLE +)fT4@`;U{k}WBg7UZxlr7ETcn)=rqtS@>W}I^ +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 +>IRWqrg9Q%CjJ#V_6AGi(ohra?MoZh2h5Q*V +F^lO@S)Q9A#Y}wF={9YCMWe-7NS8DEL=YAy>Ed9auMGg+AABe@(h{3t>JI;_}eP}wwS*?$=^!&+d}@fg1 +_BGZ;W;#B}hEsHNJy>{cpbE9NGj(-<-~w@2G*aN{ma-C>}%Ak;pHHLY?V{`UuTQTH6L#45*~J;;VRQ0 +9B8#qLPI=X9S~4y;C299j*+ARxG%8y`4&b^;RL&4@;!>uIg`G{0#l)8w{hbP;JgD?hkE=NIowMffD|M +mgnkUp=;29qudQ#rsd^Fw^C|ijVH78uaB5(yziIP!W9^eyIo5|*5y9%%fuS<6TM_QXG-i~)6bEDHRCS +y6t7wAZ4@j1NV8hlsy#q}FKAVt9xQ~e7T3)M-Dq<$YDRP|N7*w#o6rc+W=i_vx>~(NTvzDYz(YN^Ege +hRqIP5}IT|F1>-;W#DwcrVgTz&Q*Y4D>VKWAU*65LFoOC%~5MwGy!+eTvR>O*l9X>DZ6lWIiB$>6K_d +XfAGUD6cp{jB86;9^yI=K&iM>3Y--exA+(TsZ0T{LXJwhlcvw;S#cUM3nsw)@yF5nuRoZGU_=*YRPxN +T3ltG5aU+75~vze%s+O(;xMK`Tb-ueN&GysTl8Cf=QZm36WxS&5#vgt8>cU&q_~Ra^El&N7SFlP`(JJV>Qsi^;ibdr&tcnJ{nVL=PRLDCbe7d{KL+U+xSICy_rSx{j0=3({H&E7@Ub +rL;&^R;jL4bV|7#R*D^Ln;aGX8KNxH9c?AIspnp-jaAyMFT&4Esa6JI8&Js$ibR=mM;YbiI4ayw18!F +HMMykHtvG}W)^c;6#?drC{R2k~yZyyTEo$7@bY9{^5nxOcon8&>mSW+d7809r1gmjB6f;C&vwzy1<(+ +iyaSpjT7g3$kx;*yCmXot@~@ghl@qEXmAY(2`{T0%Og|{l*>SNmDWDO-Nen4}YnMe0E%E7=83*Xk3FM +c7jg|&*(@++v#qt?i^l92z=ns&k!xy{9X^7{5~EyvlZz`hq7CBpK-C!aCig>W_NFNP>G~L#+Bu~3R1UhC$TrCFRXY>^(`x%~ +Jnvcx+M?GxgcisxgWUD|7C7-;7tRIE6Ow(C1=+K|VP)LOWLh6xVxoDHR`Q-8XTaA`i-0M4NfSy4qI-l +X-%0qpk%+vvL0`EOx|JMqH3kD8&2Ce+jh(~0S%S}aKS4i-mlc>g4MF#`ShDUNzo=27TpBD8SqO;oe+x +`m%N4`x`hOmj@3_cWOU;7>MCpw3HV%>&9j;P89kk@}v` +>tnDywyryn64QHJu@!+btQsZ&dUoLE3%MC +8zxz@Fni+Yg;LucE^H2mTi{oVwn-j9B`cZOEAZ`Xc8+E;`FY|Lb1on@jy>dgC6;kFVv6jKlgRJo7ld# +~NWhuCUSV%pez#w1!rj$E{@4*Fde|fsJfuBz+UUd7GE|VRQA9)!RFa;)ZF4km8G!+TiIrA*FuWWPF?M +t1K;m&GZgdP;2MO(c3%X@sW+CTUol&gXffaO6Egi1&`=K&jH+DXjBUpc{U38D+1BQ_CniNc^P6b!@FI +K{+LEE^}Zexdc>uNtb9HeGxuohEm}$4M3QYEMcnBGaLrOlj?Ur$mpyb{*#$snr}P0h`BGq;n7iRTnYx +|c4^~y`No>@*^GN%8!UtEc3aC>u4P`NY^(YTY?S8?c+>2k%Q2zi+%QW2g|AcmsUoQF@i0ms+m7Mrwwp +IPg3|&1jPqtlC6JYjCym3id<3};dRq1yc?v|f$>)@j(B~eP5NCNuOBKc?k7!bBz6Fvl`aqz0=LLjBqis`&vnZ3C^T!tmX0P}z?1O8( +cr$u3Hkq%dsGYWu1D`?b4|?MPtdmVJYtK`_Xqui*#pMROw}&o3sGBDlTjcU?jO`bnmr+nkFFA)*U-$` +5RcQWm|9I*CX_>{abAGu#BISgy5+F>>b94YPUv?ET$$z|n0KCcp81)$vdD +aa;oRhrgLe>8Ti0_7>oy55qpMZ}MfU2T|ws#$BAppe>I25}KcNRhMI}?iU6BOS76lWyw88i(1=c)Kkz +dUph2c~fh4Vys>4?w3n3_mk21?EdV4$SYOeSz7b$AS4)@_rlI*!Nxo)B7~xg?F(}uMwST(H_7HE~5|F +@Ce8|Dw1Xqo_Sa<`UYsxf^&lD&0Epo9rdODI#UyqV3PLO|gb +aq6S{}S_0;DUvKV!T0Q5CtI_J5p$_N#lD%jII~Y4&|AmeUSPaEC?v#7gmu5+1$ND%eudwHmeXV9{Zi+ +z-wQ!tLsmRzX>OI~&~EJ`Gmle(3cNf2R;Q$GKp=UqG|X(5z7xD>2O2H_c1l5a%tTuZOSIES$J`i0%tb&vB$WR5+Hx?{>L(+;pK +?bZkZo-Y%VUFu=~K&pIukadJ^Tr-}7)G_4F&{Uo&DMAI7O2#EIm)(~MGXVl@PacXzwswVTtCN8+}z}# +ziwJ^x7YUUO^^*(sHv*^v4#1coX{TT4BLuOfW_=GY-ecEZkg#^NP(;Chur~eVjFgn=QxzPUiAyg{*81 +rV3dwHtrwS6E1@9P!_S4?F?Rt73GXK1wCu!r~A=FFP_R%>bRMOSUEy{w6VlelEI5HSD2HQcPEuW#y_S+s(be&O +o0Nt4aGxS;ShJ?BL&5tjctN-(z1Q`x)8+2>iniCGd>N*~5y)1Dd!RPUd2G*l9Y0&#QU6AmxIK2j)FfY +2TAmVRHTttu)u3m8^UM}F|7ZD^b7%;587Yy{zThKDCa{f5u|8T#+ckrz2OKumy$cu|^7uZh=9Q%r!@5 +G8Gde|#gR15refkJJ|Zj{IAc7eP{;w#{( +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 +J!>@ZRu1>Pgzs@5I7ruzv+d@V|tx&Q(zS|&)Rt +jOi52`a5d`97=U47&yUw2R9UVohi%qDxUJw>Nq1LWT`UD@feIOcJ$*`E734a9)$ety+Q-Z~WVSLuoP8 +mC`rkm5C=`nCC#eixrl>389L>Y=NhPhA;@s^>QHci>Rj84eYjy9j*ll8^HkxpD)@Wa?`jaHtYra|`LE +N4v+NTG$zf>O_)sAxS!njVewB7!1`AdeQmz>e8c1)y=nlWI1dCOn}|6NYMVjW0jS?8b1)*O%Y!uVOfj^>br5wQ +vllh3>w;DZ;NamenM6juGpHWz`4f8|JFQ4*|+;lsMdwEDQ|`?mIhs^C;6x~WLfX=qB+ki`iw +7|&Mmscaqasj?|P)eS>be5xRHo9_XqN|G)&t!?X!OhqvVRCp?>8M~*2?a--&rr)bGnD{miI#sP3ohne +nXEHGD@}N^a!)G&@bT;#{H#!wAmb%fYe(^ytl|Q-!$WoSa%+=bR7zNQeh5a%_Ry?3~lc@V1RP}}C9zqqXJ0IH4*c29AN{V8CI(F>$10A@M?FcQzFGo4NCK& +q&Rrnh6;PkR1)kg9qhQdL5mes&we8`--8s%kg+F?2ck@inQlpARS)kO!(tP@$^K<$nSBr%+X54|9Bsz +RcGRQ)RA*Y5L`&8>i|fj#Kprlwm?EgQ?QbZbjcZpj5s6p?mtHFU$2tsS>I$ujPG&x +qr?t{qkO!@5q1P-Z?UnA(s<>-yt3n^==?Fyl79YLV?+ +WVp+`T~2h>qgZ_SN{beT{gKK8so%Q{$RpmX5+iVy`BYKI<7xUu}^ew9gfzyy&x^jfqXBTl?utQeqxOq}Y;Ts?kt5|-FaEBx}ZshsF(45=lhc)H| +$eXrT=VS+VPWC<@i&E#6?Dy1UbC~D@(M@K0#H>cYD^#E_$DDBfEP(m(Rzaz2fB%m?2}+TrU|9PhUI%A +4P@Sbm6wr<)?4+exIs$z--bhm-=HG^0YAaY;B}m8U6Fc%3N3eUvXCn}W!YVIu&1z#IE#H%%-Y^i5z6!`E}I{&0Y%eo>eCYA7L*dSNa`&o!zf`3w%BC3ca;841t>7mmkG8t +TbV2m0cr_5wgzEyuh>O$Li_DRdhuk=8`_bF5~PY^j!2Dyh$Zw9TchtCZb=?9pEv=rvxvbz8h*p`ay|45|Nbbr+oqE5Iz9FqCiKh=@#FVaz)H;VtM#EHu7Z)R@4nfj$>QE#BQ;G30jniNLZU +iCq9E^tFQAF$jdV@0N7B@~!*Kd0MRXQ&}^ES4XhtzAZ8|i>$(-vCfhbK)ELxrk)s!>&16N>ldeo)m3b +wye*_qEU$pjc;Vl}x&13V*4=A!n$oxZ#UxV^D7 +^imp$(tV-UN~=$+P;vo-UGrVZr27b|mfpneA*a5!lx`Cde(|(q(k3uewM$U@KC1lyY6mlIJXY$ut7Ot +|z4Y)-ohzqgQk9q9J*YRgWYYa!dU%%2bz{k-2fg(0eF@jdl1Xp)c=YhhimOk_q#d9KZ8k!OU@`b*d4Zda7&hNY%iSO#vM&hwQvPJ?TG3XEATX6!tW%a(S3rB^giO}#SVq2ZNi74_k5i5q$K +5CZQMEITrkDR-})07uk15vyZS2l+mU!+Aog4Fs=JJ?+l!CKIc4>G@2&RU1Ryo%>sn0KGPirGkLKX`>V +ju8?zBUw6Yky=fqHk9J8pyrxtH5%T>2Ush8@OEb0kHrZ?ondj+;Pote42WKe6g_Fs+7RV-j+1CW~+93KBC-i +Xofm7F6s*htsycwdiR8EP)=$RCMe$U>8)|8s!goR=YM)~@(!_GnFEn-ihDp6A$Kh#NIs0hNWD{p~xNX +^HaTw%%~4B!7?z(R;3Mj3j07m9~CyS&Azn_>`WOz9yeLWbO+e+T9Y0==^Wsi+ovZomV3G;QdRC({)~x +8;=ms7Lca+23>v76%K5aO+Ls3IY#(Bl=lNqoTm3|F1oMOxH)*HGd}hV-7IUPuzjM-_%FnQ197e)Aq?h +zYRMHPDSI>=)U?8+z79ndTJY8u)>@rPG3PfO<#+mb0>BwU7cgSjZ^C^tbMrEj=#Y|!r7vQLY5T|uAf( +m<_J~cXN8304grCbhQG&Z5F|g|TBU9F_$zqL+?G%vH%w^d)WO@ZF?c_&+FUtE54_9Q^CG3ly2M3SxOZ +bzBGOXn(0~Q2FQYX{Itg8|K@8^)vF%P23@TH8z@dx=KXPRBRMr(k +jlu3O?(AyLU8EAEoe~MBl9o-pk&tn-d8&|8M*2ty!iibew;}>Wf +o)V>ryv(*0*vSxICP)Q)SUIlsDhMqe}i~-Pu +OiDT_`X&WlmX0#~48)77HVr#uLZ(=}O*tf*;ER`ykKysk(jZ0d^O)!8-_iB##nUIEaApM)RXXqXny8w +kW>-IB%R!x}gCGe6`J)LBP#RsnNm8?voMEnXR-4|Y?>#n!ilgzrVfbG^{7+wc-smh#N@$io(Qn@83Nu +N^UBM>lBUgY)`q1SgeIgy)L+~O;+JRv;5M{i7Jl&K~El!$>tFGe6sRWThubGN>E5uP#@f@ibJ(c()Mj +On#1~o+?B7yX+tGDSbJY(t#GQEZO4ls6K?!m-VCfA$Fo5emG{1(4JNK3=eq};8=Ri+ZXxekmVWk#`&e +s5EMlYZ}+(9*+NhzjUqs`PvR5?thO3gY&l+XH(8T!FxciUGh61Os_s8RV-kZeI?OKYv8cIJW(9Wz=M-zlk~BfwPg9TvC&Uzq!*UTB^-j$qLmH~t4XMFCejn +y#C2x*d(HrTceClD$h2%yh;u~BE_{{mD{F{d{tMC-J>j_iBdrp5-@iC*T2SPk(fr +WW#TB8&shZkd~h9RBWtA@mnsY7^4fvp%E25YWZql0ld}`Sflsg_4o3>IzyzSlf(8owLxcHK0(b;==(t26Q|-RQ@jq +QQ$U7-%7<15Bak7W(h@q=(h}z&b460RtM49s(~e6_pt)jsx=V}A4XerevTgM6PA$mf+Um-+b^7wBP(! +Mvk~XYnDoPkTCODP0CU)HE!9_`Wx50r-!nZ3zO{JH#D@Mcre)@7;>({@NoNkuB!|llk4cnfa4zxC@PH +BS?Zcn@ohB*y+f%rezvev7abLe{Yj@|=m7T2+N<>apzNP@l$-;M)G5eJ}*WR|S0`{~Vhi8I7pWo*M_Q +~Y23uB5uDZO}P6`$HMbg2}ji&1QGICtYm%5L1QmaSo_=frbew7Gj&ZxWU5t= +a{ax%aKjN&um4ROjV()*A4`~Bnyx^AAx66Ui1Qo;}GPr0;MPU_W+AoB)WImN>=Vl%JFJ$%ZaClYga%gp9fX*BiZ;W5t;55 +)izJJ#h$EwpAc=J<>!lW;M2>Xe$W{4pjxnYg&Wufhv+7`K+A!wA&4aT+zpVjlF>&2fa5gTXn{FtajY! +_%N^Y(*^V$B+0k@nN4eIWvP4-X?StvEYU*9Hao&KjtE4#cd(lpUriJFlkfs8Fd5lxmwspQnoiZuq7(F +nTqu!U>l;#xl||5{~26MA>nfn?8>mDPMfR(>1=n3cE&nAf#09^@_6iY3Z7%RRpF<=W5nN0b@r?U~B>= +@6v0;c-Y!tmJY+H0>{rd+LBMZ9%@UN^2@6bG70*3wTr`e^k&u3u2A42<H4~!|!w@QBl!j@ra8cUC{43t1mC7>oAAqH$|K`jjrBIk)#jpU@h!Ky +xX}&WEVZ7QSn=mUG(HPJj=v(H$0Pl2Y&AIwMu_BZAgrdT0g~ywRPz5R*|*Q)XQXVFOBWJ9Cu|eHTtr> +gn1djy&Q*%3q{OJd{;>Rv8bJwUw~4Q5tnJ%kLecQQJ=RY;k`Y2C%Y;&DvF|Knf1Glvgb18krU~CmTED +OqF~aOz9ubEQh_Yv5ROtBS1+5hnc +&)S+QfkQ+;3UC=RJRXn2>h^X@&(U5vC**VqZGzQI0uX?ccO3!Q7#hMb%u8F}VHAn!|_=l=-_XMj8#ah7 +K6D49%B6A4!x0jGrLicMEnjP1g3x`1FuFtPjL|rH5Ee>)9%d$`BXOB)d6|k`I#V9z_^7>)9=#WG8`u|?x +zww?=7&066!m@-LUB&_NmkTeBs=u!i#vuMAYYO+7Jr0q3ndXXlsD;ZHe# +{}<^0=js2g`;BQ{*Vsq`xb8LI +44B2F3+L`mjbkNB*UWp^`M4bYcYue*ain`1fm3v}>4j@h%StfNDPlJhu;TRBpwGUnP6m<%t}wIImr;*e +1!iDCVVLR2uL#>f9x>fD5@E4;<+}Md}?uA+bZ55CEIa_0P9l1S^fQ5c6BrtyLPvG@QW`S<(u#(I<462 +mZa +pRU%FqaUBudOp%i8cuJBk;2fn0GEhBmjfvb9&`eg%YA%_CVLJWf`!le=o$b ++B2O4dUP<0W(jaB46BWy>gy5sa1zeU2+!txIEtt@IcmAWUQstH?mN- +={wBZ9|*;da&%#^TfUxZhx9>ypu++(O;eN*~j8O2mSN<{+0h2N}FMKzty(MY=82A{9kiq_64wFy3{{h +;=NsLmiu6qSi4YIdkKbB&jJG&k$cIZ*lrVb&>4abGO?e`=N#mI6);4Dhk$-9aFK6H1axf7^1LliM#OE +TN4^rrbE4ma@UJ--HFJXd)y)ti^cvYw|E@Sbc=`HOFZb(Fj%ZemJZNW;bh-x+4d%`lN?d&jC7Q)nsSN +JO=bA1R$R}4T8S@r98)4Hr{c-%c7kv(lr)|WhH(RwyM5u`Q|=k=ayOdrR%)yK)*U!_dV-cGl;fkk+>K +c7u}m<_C?F%$b}JSzTZv9;qa~cqOE|^rSb!V$H>3SBqo@71LYESATz}7#Y=ckd$ZV+z5U)r0o1hKaKp +6ef2e4Xde4uxbK%-Rl;V-YW)M&*JrlqAiT7+wzHaf18Ao3y4bM +c!Qoa(?@Cp^^xX4qfkY;Dp>Nld +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 +U3*NR}d($`3 +K0J+us4qKA-?sOg_z=E)p=|`~0l0hpI?ge3H`2DeDm7{$j0)K@zhBTpIQ|L8m{_D>y?*n4Xh);j9?n` +ssQparVJvIWm*JFHiO2^d$boc=^k=+En^X=a$v$`#u0>y726DF{D6YEre4u`FH3COK055H(k8m`aO4s +yFA)>*w!Q9tcVU5aUsGb$(s0>qSHW*>VGF%n}BV6}270C$}D888e7GD@Kw`%nFy`teO)XXVJfvo+SpB +Z`$&6NGFf&7FHNC?`Lzy69_ctFDr=f?9Ry3i;t#G}^iQZ3tcjXQy-H*i}YuNt!*rpY5Xw5q=BW)0g>P +hl4dAaO_NU^BQ5k87vX1Yjm6Ne7_6zLsSoZf{8!O)-~!5!q!@c2v54qaR-OUlU~|xV@di-+fp8Tn&C6 +gm{He>1gLMOPdlgpZk4~P=C@j`i-xlfjP>o)Vl6MnW2*7?7Dic{&Qr-683oFdO+WZ>T^Ez&We>7TPksQt% +1tmAYT|T&I`fY>}H|r4FdvjAHv;q7M&5M4caJ+a$riJGpM2u!;e58Ak+K2I46e|`4PV&WPlbAVo +7_bJp|MGF5sjHNKSt@{*?)O1c^0;Vub!_#G_JH8=&zsVkV!jq!0?NbyC(xy?5M&ZZzf`pO_TOnM>LGK +!kwb>q1hxOTx^*9YekZLGQ@?$ak;!YsgMV%UBR=IBF@Ey2@~dVxuP$}prM^zS +bEXVIZOU!sr#f>;4;LYZQ6YvXXrhscdkQNDgv~@1{#GVI@VJn5{I&qdHoVcT>H%R9P|r#oW5z*d3JaM +OL+iIgtmtE3`Q}?RJ@k-*O!e4EArhmncN6;eL{!B9+%P$S-KO` +U_3p5rtX|kpvCMy2x3mlFr`zu9g#DC#U-#HgLRu&6Ckw@X>fOq*pPtEcXX&myFYKqCX&n3MX{IZ$_E; +RB(jE2_Ju|1KkD+eSRE5fu-OlOFdIUMfyMhT*E2|(yYjI~-Iww$oJ1k40Mcp~IK=TflZow;tXFPg>^sWgqf<=?vvui)Pr5&t%~BmV6Y5B}}V-Q(YWM)7Zty76xZwZp%)Dir@VAMtMww#UC6^y~PygS_x>4_+<)ttZ-= +ZlVoix27nDe@o%-aJ*Y<-Y~Qs{%sOOLB+rQrXBvR3YCZWw{LdFzumb}w|$^D{w)W+suq0frt5c>^=JT +7Q;n>}LV%H0t4?1wot`wSOTzXdiv!(m|3PwgbeS-5wBE7t|#n?u`F!fVlR2^6v)3y$Q2Ye(EEJ>WRJbKL?0Q#R +ma#YdZqs&R~GJGrRzCXHZ1H6ZT! +8`=TlGH6#E8oLp3k3}d7baWIEcOu>j!Id@Wf&!q`Y5g^T+y^JJLFSbJa;H*&+%aANxtkb3Ze{W0d}j! +BofIFpX(hcVbR@K?fH8(98!#JuRFK^8;=2$d7bh4DBX>H($VL6}Zv9{MO=CDj?zJ2u_Zkk7+lNEs_T& +(`{v09~?gApveMZ+$PrCZbCGKG +4hZoY21vY!wEYK|`*Fbq4)0gLatm+dnBd>sutN3lSq2PW>A7+yi%CNsl483s-O1t&$A--1J}Bl@cerQi4mxK10Ids+%_Oop0aL9tww=S`i^{zR +j~?V4X&1N7;guX2c67@(Xe7c8RIr%C!&g}s2#|l^JMTT79VoGPS${nszpN~LT{Q-gx9v}%WNI)kicA3sqm-wU21)? +55pkzWf9bx`zA?~ACB;B(ZnRpf-Fs<_zLlCfy7#s6t6CHGFU1R7eUf{G2oHXwb78`IC|UuGx6z4U)S% +Ih~I|dIPorh`2eclDecmIkoIY}^34xOzy%{qyuR$Yw)QdGOs~NG5YJyO9j)Go>;8S%EPOpj`ra&kiO+ +}j6!2C>o!lx>vBec9dPyjwyqZ5PdQARY!V7z%0n#%Nk1*4t%Lk>8Oj13+ps+6t1g>w)NqVcbN@&vyHG +6#M0u0Onu7EJbahCCYK<_y+K05xRbipc}mHy1$_L+E#yFEH{6U;m=;9j6KBpEO5B0S69seBVz8;hbQ( +>+o=p>9oRWGKKnlX86oX<~XVE>2xG={MI32@~gn%2|jAC1<1>0Wnrwx5D^9r&J4*dOCkms@;%0sU?^{ +t?IFdDxrtG=Pp_lbcb+&5c3oE-{m^2XaN*wN79Z(yK>x*LgiRU^eUlp;-^cn^0cVaYd=Kngrc{gA7=S +Y#7?R7JCF&FgzJFLS?831g +j!DJ&vR1D!6&zpSU0CUZ+qGD|V2l+K`pZWJW{sm*fyGCq)IPtN)gttP#LS)YtJT@6?OGyVkK@F +57iAKsvwHfchxzU*nt|7nwgbJ=AOmOF@15 +c$*?9PlV&j&)N0FGL&!NkpQc)PdS6N)vVT3?F&Ka(4%%F!$UeVKq +YGwYbOGO7-;uTBTvLWUo*A?kE~)GE=5nfK&&MR|ud)>Xm&(#P@_>zLF*4Aanj9hfKMi_^!1s&Ie#oP{ +I5;pmcS&VaUjq~QB8MA)KF`bdc=3}(-|LDwVyl%_VPSgor@v&;-apNl~OQIhsIJ#*Rnsxf^FPyRRox_ +-2F3$xbr_+@o0;NE*Q;>IJr3jzJ^dFXoO?W5TeX*Aw%GnK9J9poGgq7*^zym{Yu8+MQboED^ylJv>7p#3u2V}opXl*MG-0M}=7awSX{WcZYz(R3qU1)Ty`&z%$oD8jkZ0#1|^#W`HwJ5LQrJ~oeUM4y163JxI@g$>Waa| +`wS&%daipQG4mO-QJmSaA_;(AkyPR?sCw3tuvvDFwejZG%}8KV83bp+@IZZ7TU1TQ;-)od(nK3ndp2K +0-_f3c4cREI`1BXrw+wG$7Ryr!cM9s?inCl(g?pE6yhIC7>qp8dq!w{d=gsk1G;X8r^zVsA?XJ=9>88 +r1H<40d&>Fr8k{BHK2MpsV2k^BY_2~t><<3zV! +&Klr&aL-2>NY-$8Qlf$PHth(gm8rOOAdUCyo_xZ +a=E>4EF0pH+eSfsT91xpsuRiy0$S&DT)Sz&iPfL@Ee=f>i5@?1c4q5Hg|O4Gif0mOKO|uz@ +j!d1W{!P_)8OY^x6;a)8my_Xz{&iLvL?=_p1}@i#*rN@oej7eLOpiT+B2R7a;6-X2`Um +BZF_5gqXcXyjS>NL44r=@RW+YNIxHmm_(+W4ThZ; +dC3PJ2~CQ>4%(t#c4CA7dQ>Po>2p*qd2{h)4819!Kt0o3Qjk1x`oqioW8^9NlyRDsgCFGHJrwCDsXxS +r>i)Dyu06);RxzRNO&fr87CO6e}U1CKix&9Uwm!X=H5R +|$eG1RaVV1vU*k{>Y3#$xXP$<--;~N|7W@?fO(UsfIvGvkxgV-}9J!uYNs`;|G;%YskVG<@n5nJ+f0M +~__?ry=6uIqX^S@EV0C8Y{2Di>?{zs_(SgJpk>kyJcV-0gkPVr|ZHi)SW!dVReJKXv=lR~nh3;o$(TL +d#zcOFnX=ybGcB2Kadz9KNg-%Q~1c|25g0oW&Q`*v`fNAkHknPh@Gi{x_kbg;V^bevS*+n-GE$D_;Aq +sCv2uNqG^UTS>Qc(CwRyW^pTuZF9JgZ^ZKe@-yV<}TFuVeCD6sStCtRn)=W0`M=Jro6pLD%kecONRIt +c-fdo%yhUjY-VNwRYJ +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 +8MxDBnLLH!_xt=(GED+LSA>;Q6$&01^si9y +&g_TGPXa^ce3Ks|nY!JO?=m2Q$p~eq(!(Ys5FmHQ77JH4|PZ*J!qrP%ejdki#&V)&MGpY8+m@jSxTRb +mppYz%p|9#P%DkgD_zZ?(ozn^e0}GuPfB6@C+DZXL$S!LqEs+xZ8yFFs672$4{!cSN%|BU^=w1DezTr +J2v3){^nNic#a2I>aB&gB7pQBuXnrsAqUECiN`Ho$6CC^%WW?$=`|sQ^m;HTMMGtY*Rz3vtPG)S2Rc0 +Er^frUrGzvsBV>R3IK=iF9Rzh{4jGV|0`+A!8K9X-m`j%T2n4Sg7(@n&ksu#^!T&yFpr#jLwNh;pAs? +YU`=z?;cXfAi^O8u&HBOJ*u=)=5Je#+tb0eC)>w69ixn6?rJ8pk8@cZHG%j+S8zR#|Lb`!qws(Ttfgq;mE)h!Rznhx=&?Q1Wv-&Y51d=Jt$6)2Ql-|@Za42sJ8z#e4aGZ6pAu +m*i~h&?zXC^iseI1Jk)XnO`gzcgTc-)5F~dUu{|hndh<@afukoM>AGAH*jT!jBx!>msHL{DAZ{vfj

Y)s&9a=ARv|jYUyqo6fixzArWCMIDml@SW1(K)<{Ycbb`!`26_Gt*O?qv +_l2u%s|>Mz~t+zs^;J_j$qenWJmSE?TBL{HMoL3^(ZcYlld&imy7(4P!|^gw@*qLvr*+ew4PUSJjmWf +@9(C-!_WuvypW-=M8l`)z^nJ`L>X!H)h!ke&ATypQP%;r5Q}>FDS#*6mIY?s^jaYe614>FGmyjt`7g) +g5Wa{CfKsAvMPsk2I`rAjlw$HJ}~nJGXbUDh;arwBv+)4d0uWz3Z4)dpF+Gr=tCXC!l@$fRInsJiP{F +{=uNe9t{E2es*n!Z;DTB`@Hb<@BOY1BEu)#={sDL?0v*qM()7@f9*g<7?H)+aC?C>aQ^{mUtE#~gs&&|p`; +%Y@Gk7jbrDkw287zj8!P%jZ4?W3XPn)08Mf=f+?MF9pZN#|tiwhz{MVn@5cD82dge=Wa%^e!%8_UneK +#0=~A>>-|61g_}BDr?L1#+$CXW|K!+1nJr(**Ks80%Sr-Wtb71=Zs`dNSy3@oBeA?f(7ed^`{5Kj-6F +JpPxRj~}e@J`P%?nPC$X*_7G}GwKB-Mmx`j3xp||V(tR64piQ&wKEGBvlU#jl_cWopG{rtC1fqy73gx +8mka1M{1#;9iPH-m^YRLosaV~SBvEX=mKPqX&-0o~ +-nY-hf0dS1Tm=FH`2_XXcMxa!ztyz_jMo%v$kwAG?5wQxaRwk;d8p_&-uVN?R@+~2oF-N@2FJKxlo~f(tHj;p*iG>A4h55Eb(UH$=Imm5P-|2AJ3 +Pf|B1A;1atX_a89TM{ki)`GpSxIwmPO`?0ACsM*Pl!Y?nsaT-3s=yLm}j?TEg(snd7=aUS-|yVY6FUT +F)d~?Pp~d9rC6x*PkaPhrhU2t=K~*5-h|6799dIi?&rFIRh!ewY8MOJWLsRAJ30_sgG*a^+At}9i(-Hm4 +~Y7^05>^;xqH}?&_Egrh@Ew_Pm0`LMOy{V~6@>BEvCOEb>qXKBKwazK+4X0`qac%~3>EA5l9@`kZE5qh{A(Z%efWaNV(=jKDqvT03$+Cy&DOwTVuFEjI_#Ih7&m-DvGx`;)1C4&6iU=V}fUw@ofx5TtIwMJlBB;5qPdc$7v5v1G!m{msua~7O9^58_M< +Y9Ca`Lq5crAKas0VT%E|(DcsFmu0M~{1>FBzc-Z+|e>uUEg@oSa#52?m9#?;EznI6lgwuPtc_}w9W9Ei#fB*KV{g?c@KU~MmyFdK(-y83L5qqZQ*;CINy79k+uPYlle +d8+an>gJG_K!XD%`^SUx6jDW+}6GS>z=0E9OzKyoVw$bfh;<;^wjvy_CGlJMdNuw#;s#6+Z07f^fDLt +y%RI1Moy=28qetjPGdQZ=G4GxB&Rw~Tm2dRfzw7#Kj-u$ryp|Kz-c|Fb(|jHw3^emINi6{9j#&a6W=_pPOoa#7j_2c)TwC%^|&0JsRw2{-3oHlS;$7waE+d19B=_X +EBahkzt3a9a$#&R0Xse#i-PD44>aY{IC)iT=5smy63rzbhB<8(WxTR7dMZSQ|ESKB$w;8fr=o>K#-I! +-V7GWs*8jhyc0bPK0{&m8EV`IXIVKX3b=X8vn=(LA?n_Zi{5yd!xz_2=ct!%Io#_tX?N#?9{2-XD&Js +uXv=TKX^jb&UJ3mHWTi{@?5V-|he3>;6B#|DC^IyFcX9;pfYLs{7VnydCFMt?!F@J+_}G|57@Je`Zcry;0Z5+IYK0X8HO5OA1o`!K}dnpJ9xKh(P}WUnuZ0(AhBI-91V}Qh+| +t8^&UwzZvM-aOls0F9v!DzR!WL2O1Iq{cE&_gacg+-_|G%$p#wT7sfSU2kGqo(3S(A0(2ov+!q3m^yF +X|I{}aMtHI1qVjyHNd?~{;FsmWtGJL7P<6^?RAuKErsNYcV6ZCb6^9f%ugo~J;l|z}GjX*~aV|*;o=} +{0C*cX5{MzOGvK0KVIcgt{!14iv5ec@VWXDiU45llZA=v2>zy`zDw6?NHx%<6QOKCKObo0M4neb%ddwz4Eo! +F?v96X+;9!0CniDsf&UQbkOZiQz()a{mcZg*2HKLq{BH&7m;z}5J0j4rQ(6AU0v&%N@Sr~d=uu67mi3@jwgV` +x$sU(73@7hbda<2o0qp7eYM+eiYER;7bJ_>9|Eu +?|`2Gv{xpK-GL7WIwh0&pTC%pZ?jlg$Utw(W@$76eFMI&VE+Knrfg>a2cS>eUb_Gu_&}R5_*MXm?w-RIpc%%WVSUDPi`mcsE0(~7&>uQ!Rq~q^m^=ksqHFrZ=zz)*K?`HMu3 +82c|Tqf5LGH4A;qXFnz__l!k?Lgb$+YUTgOGwo^h$rw{fNoe1G7S7ipkEZT_%{Oet$?{P=xc!vu7r6s +@CKkSR5CkTfu5;k;Wh&`ZGgTV^27}E(+wcA&@hu(&lK|0X^a0X$Iux0wG1pbxzb^C8gR0`%LrS$&s*j(vym#&-~^8PX1RkiJ#}^ +Elvl0G+uH@(p+^(3kc@dV${tbmRd@Kk!DNVlA|{z$0D!KI9MZ*+3iKXZ;k?Q}s;$bD&d?uzXGdiVNpD +DCKGKAfOb(|2-N*R@K%*M*ev5`u-!GxOfY$>348BN^;m?7-`~#EcZ9q +*wva&D(9dQQA0`#MS-hGCJy9TJS8QKfbN1EEq$`|Q{W+tnbfbRMkred|2aNBRrrTY=8O7i@q}1$yWLYZK~$23&+P0(~9Okr$bLyr+ZrjxK@xA +Qd@}6z|Gxhqegmi(DV+0nX!Hm~S|bRN?lK;=K^mM|uP2kWk|hjycH=te)b3w>O_#XB%5&p_J^^cxNm5dQ~gV>BLh#`91wbRM;I$d$6zdsH1<8pv1Y+%tWYGCHX3Q8eW5x`!V +8H^CmzPJJPA4nS;$rw$OdfsoQS!nIFOWTZ_K@o8YVye^pOCh;Ho}+wim7E#G@~k*++SZDO!T!YS01Cv +W6DpLii0n$T)AcqTKGw+zjREgKL^IOpw@xnCvXeul`By#AFHpgr)oOQ*1>;2DVK7n`N}oTx*x!?a*(T +69@Dj=`<$FhOuZiM*B{HtIabTnmza4z=wCuL_O={KaJrtHH5Dy(y@ +As8t7sCE*(368dNQ4PUC;ir499$>RZqcRJYAtXaNhC^1**l`@MB2{JJOVk3kZ0Fn@F>Un%MR6I)YgMf +K(K@nP2bV_;(=W|!{Li;s_sXBMcs^~ka3hHk5;cJTxKA52q}R&Y-Dz9IfcpG~cAy>zU&n%Y06D3{aTZ +M{T|(LUsF(-W-3m*WclW5(pt;Og~_zQs3z2n_c6eBsj+6V_05^J%y} +Z+AC!^R0(ZDJB~DeBld#PY>T<1?4=H%lfa$`Gg4*NOE#AnKy49x$CaG+R6B)O`FI|FTF%|?ASqN{Ns; +5Cf|Phty|9Rc+3FCi1zKf0@ZrNrOiT=kjg2K!r%oj%lZjX?7Mgc+=FB1U=g%j%+;R)K{ +r20*y6ov>$&w{x>C&ZS`SRt&;c(FQW9{0t36|(S%LJ~hz$gEQenR8kpMewD4rI6dcQ%F{ +$LKgp^kdl%TQdwC^9(dpZ^2j6que~dQuj$(QJBAwC8mfIFrHPnAN@5No(@l^|2wqdAeQ6LxlZeC+Eit +~LH00GYtK*QbK9br-mr0noAp06SLN^zV+Yt?CazTGlHLtbzI_G4bSg +>G$SiE?#NKH)@%a<>g^3Bf97VFoqm%eQ4)~zD502DGDy+iQH=>&YnFh_2S~ii{eJXCGpemBnk@)#qHa-rLLfr@!)t7%4-5vnu;8>E3@7_&&FPb4cLWV +5*?|z=tn)p7#c3-Q;JwmtHlvIr2MIPnc-a--jm@wGJH3Ne~aMkKy|={0N3mX82VMzmwq)F?=4wpJMo*82%!|7cl%S9lS?Fj&J_fJq)a+vy*wP!|Sg?UWd@(>Voo`3p& +|T(D~tlE~N-6TrKF94*q3^cV&1^U}pO;dP|T87`o@ZT^z&zW+9;V&?Jp$-0Z9-%9b5XB=*3=d90{jE~1Lfy#P23vPcXe +&p*>=`Hz!)4H7-%&3`uYckH+5^&s6qYCo$IL)0)zQ9{~ydB0t3U{8{>k`on5r^#t=i0(U*r0GWh!j_= +mra3mP8iRd};dN@%a +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 +$CMSokoosWuu`aI!clW8hp~aq*B;3(@>0`c~q ++fKFyvzdk6bYYSgF^g@=dJ^5x43aXBF&fkuoNK{IF0ly-gcgnSh10W{e2ff +Xa^-XFZ)NFQahXO&|t(Cm3O+rs1U-@0{cRnB$(uJCW#v}v0`g9gP8960bY`%x(elgUIqdi0>)y?fKgA +Ad}9=gy@$bLL2Vu)YVrpaHP}aYE67H4JEgKZPD57GjQFGXm-GXTbj!?OQhLVU97%nq$D8;gc37h5-G? +uD`s!y{CtSgiM6~u&$@@y1(`M_3JHc!^Gz(F)@+YCJ5iVcI_&2gx$M$OML+Dz!fr5dZpw6`k;GQ=OC| +xEMO0?X=%?a2faP7va{#^Y+Q;wa8YTLr(L^ta~3REAooEqw`R*UVZsCo3k#!q_3BaM#*K+{Yl#c+fNk +hIXi(jr7If&88XLZK|C0W+^`CwmpRG9t;iviL^XJo)DO0Yeq@>WKNt +15&?c0~4qoXC?d0i=W2{gbiKqqhm9rmRHuRXAS7EieU +2HS%Evo57goH+3a?9^y9(%7+Mr5r#5@DB(Gpgw*2$loCY(4abKQ0rc-#gJb^?|~_&K*Dd5!xSoB +^I{#;DtTskt0V+`!yI0}O*way*ZYkSPN9Ym!0rU +#~7_w9Q8;ldmZKbVWNc@@ZnQhv%ab+G(fjxiu<(HBM@CW;bY#)+_h=>U4)~%b=t!2xWN&LZU@Eo6kH| +zlZ2frgXh5jJdh8@5LU=tV@KA3TTz~fADbaeD%xtn(F+LbS?HJ=Kl#UJzP^B=`mbgUPF56hM~x4>P+( +jHje#QG+605J+YRxoNm5q=arh5ui(W({R!Wyu)$`RAWYIPjYJl+V8H9gdM>8TXz1+f-q#dz7|*Bl9=p +Kk)x-kIDEBd&3d9K;E!f)>D~F#Kgo%-^#Ww;~RVp^jqm6>;QHNnLtk<1NdZpK7`L07czo85YL%jyh#U +svwSIWx8bkXRlN@DbsM;WF6aaK +s+_+i$;3^XAQy`mN`?>bMTN1YO5>!~o!~>LZ-jF8OcZF7el|e>wIfLoX47K!@7zhyQ@DLp;*c0p4!du +z?mXTqyNf*)TfjR(tcvoA4bvqv{9jGe0X^w(NfgcN_ltxTw!z^tnw*GC@yGO_lJV3)h1-;0xV??*uIh +cg{~&Jf*(>34h?i_9gY7>#x6-eiuA|y+YrCKkR_@aoID(UE;6b|71U5+y4O#h@Hq^;Qycph)0N>;4#*m;63 +D^_IDu%e2346uZ17uHHEBeFwM^zcZolAwXb$Z6Qqv182fB +PTqm;?7cJd@Y@(gY4J+eeSSCo0eb-_fJb2;p03J@Th#d@QRS9kio(Mn?y`@pbb~(2hCJ0{`*ak*r4t? +O0YjR?v=BwWG6k^wo~zwIf-N4mcKlZpTGDMZ^6)6|`Pnl#nZ8zmNM~?zimLi};R;iv51zqZ;ONiqPpP#y)w6Xw*5PE=R33HtYqXrqJRmqPM>zI(kjwQW6fJwRZXP<=gV +wZaCZY9r!cOId8JRy~uv)SN2QCIX^dXZab87U_8UnoVzRM8wG>UTkB-l3q_r;gSMA@&fzm!zx;>wLezLr@5G)q>O0tzM~&@q^J5LbYtUF;FAP=dd#rOYF +Y;*cM6G#{H|ZPdWqp6K*85N^TUS`z)TdJ@JrUZ +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�@V7`gc5fa +DXE2(J=*DM8@-+j*5dI#|zq}z5hbm6`14?SB{&nuJOLGh8N +(4m6!V)4C({Pen2%4wFE5E(4{e+%4L3z!>?3jX6VT64h8rdZ^7sSziqgvr3!h4Vg16^pal8za`WVLJ# +TTPt*n~&A@pnE8Jxbv75k=%)sa$qB?}&ti$e8}oV_XtrqGJ;}x{i#GZJ#h;NMuYzLerS20rA5Uh7B6g +bilBf_7Mp&%|N7v@fJY9WWtnA|AJtBT&g8ZAir5vrL6^y0ULGib3yG4$QjCP5}za3p85`tq#4SO##-qmGfl>Y$yfz^(#gCe +36B3*sFJstu4aB`1F&+hF}1Xphl8`1pT+e7iwC)7XGKQJ)3d*?oVLh&vo2l-HTp6QG!-&AO-m|iVCG` +&x{sOBK0xhFL*H9z%EYQ;3iG`BRbv@U6V(uSlZrcFzmpSCh>Q`(-iytMqZJ82b7jwbxYg(DDPYPHk}t +7d1+&q&Q!nUS5bDI+IiPsYKFyo@s$`5A>7cQS;zqPd#c(d=S&Gkco7%zoxB=1_AV^SkCD<~Vbrd4hSG +dA51JIn}(d6{=I9kaZ$60>G!&Cg2BTA7 +udm6Ijp%SyZPA09lUc)cS(0k_e}Rn?;`p5Zu*e)xb +(#I3F-C`>96)z`@e7h1yD-^1QY-O00;of09jkAOc!Jc4cm4Z*nhWX>)XJX +<{#RbZKlZaCyajZF}1`vgr5x3f4Y3q*9r7lBVr?t9HGv+xRqzeQl@h9@$lCiMF|>NQI>AxG($L@4Nv7 +Ku~tt-RJ0OV~GR?gTY`hGZ+lkAFT(w<>Ic&F0Yy(+8qSXww^xQc((QId2n)-28VaeRapebH8+n&h?Y}hO1uY<+-Yp(T}7K>Si{fAF6m(s&D_S%R+t6%gf8GxKuyOT76sGO{ +V31k>whLN`I@%>2=yXYO1^KM*)1)<2rwozMrOxCfKJZdsS6d+d;4%EUM&ko@@t22_3mfE2;+NgHiCNE +Lyuo(^{iZ-|4SSQe7D6H0gX{|9;=xR>|T~2e0O;N|PD(@>?P3gAqdyG2?LsSEUd7}QtGCd-FGmE2CUVzF$7!7-KHKNtqnWO|iO5a6U +Pm(>)?FRQ#HXXPLp5tEO210z>Ld=ktD^SBojW4_=;}9KHlj&C_Za{5`4D-LkmIE|*o(lB{Pp(e7147T{BO4S28N}l-HRGn9@ribE#585hEXRdgGY~$8`BDyLfA6COq +*BqESgM;WS&kYP--1!+7Zl+tV-vARe-f|Xb>)r&jLUk?i~g%wmyflkM_Ubdvmh?&HmmI0It$l*gC4hp +Q7>U?P$+dv2lV^jLN +77-ZL*ZzsDi-@f^-Q*3-%BQbvcJsLduczye?!_BWg`q$5Y`>)48{rBj%FTOk-pPnI^0L-IDv-E-nDxJ +)e>KX==|4euW40yt>t*z1DLo6610hbB53`x@}ZI)F5uVxtu%cQy^(FjaQMO2ma{h|UfLUNfvqVP8A+- +7;MDhAi-T^+2Ii?v~}mS5Ft)Y4jo-!94u#6q#rq}4ntk{pC{LGT)Y*ESMdR>>Ti9tNdCw~m7yg}F48& +Y*TcY!7fikd(oB%EAVOdj-H6C;}Xu1bGGzl3V}`38O@T10LuDnGm>}q{@=>JOu%>oL(WsvZnbnh&7$* +3yz8m1k{OOLNOs_Jn*v~q#1O!3P=QG7g@@^v@z7h=fEZH^oi$5Grcn4>T(%0ylu${AmuV|p!z(%tjgu +0jt1kcGpC5aAy$;{<9VDGvuLp0mQ8a2k5tlyoTict`0Mx%Ncf(_RunD^7)@A!fuH~_C@%sMyWzk9TBk +OccNQ8Bu7JTi!U4u7JPp^v?T$qBppg|MZw=Pk4j$KG@Hp_$5I-d%LGa@$UF69$jouA|FdRI9a8I{wlw +p20HIx{?v!CBy!G!OlC4MxIXcnDbEsJa7lky$?d57FCv#3cs5P(`HC4 +$Y)^~qplKB>)nRDvsAOtOnRz%=m4;K^v<0PB5772&^!Ebj_od@0kVC4oh_iL8su?ak`h9q_)!ammMd; +>*aGTEU!3n=@oTcRtbjI?hf(O0qeH6)vgZ0bGH~UV)x<~8#Nc7V%NiY^DXbS)X`R*gFyZ~AULk{Fz4m +q0Se>BscJ+Mq%d2v+a-r)di+_$$`46Xr5D?1#8kUQ28_8in_dg^=7PoJ;QyqP0CX4=44(3SIC2g +3>+x=n}fD{v4g +QEm`U@6o6{40O$YPqgTpJISgtrgs;&3lh%z(P$cJh +2IfSyoTV{sD4Z`!+<*A&>5#uZf3fu;-~ +4pFah{svuFZiTmh&govd0O6p9h#bMuQV`sIA{C%pdhZ@^t<94X_*o%xgldYHAK2{8hY*QIM +XhKN8g4g(6`=nlRfQrp7!V6KoD~b6`SF{?4@0$g6)`{S!Ep(4Xpu~>lS`O~SIG_P*0A(tIs4;rsRhQJ +UIn)#0SP4(%f)5A3T!GOK3ISH$>$$Ltv^GOKQiSVT>dyOgBejH<%;G5*tw+u@o9hK_emzP8&t8O-MB5 +?eXc9lJ7%_N8;;hx(9=D?FVm;M4{QbAK+&Vf>(2h$d}{bvq29OD{U9}8eb$2=GDvX^OL8!;)VfET+_L +vN1T`ctZ=sxeTP)}2VyxQGlK4EHqQF4XJ*wNMF2l7-%MP7@jza^Ezr9}c_0a%AHFHjKZSc*dDsf%7)h(;F2-^7-A*fLclTF+a{}~!=RFB#T%rqStbO-x +x1UARe9Nke>D<2-t_A2FYn|d+>(+w91^}8xd^ms2p>2Ljd-@rl;U`dqT+K|$f0*qd&t*v-&B%dsj225 +ariC?YV_yVjj;KE-}Lh67B3K<}-TBNg$&5b$*){!NnxoQUjKq5E7AH7>#)-jfep$ZJfrm=C1kBJH4?f +s?ESBY_B^tSZ^Vq4~%ps~Y3<2)_+Z95|fpisjg+bH;zU9m{N^Q6Z3sO7~)_I^m^kV%O2EtwWo3a_D}! +k2i=9WMmc;)cMJ^Lm0$5hO*=MGVPV5U>~p+BprV>Iy$wUa1C%uDSsQ%V#JHz7ymWS#etSa5|$PdzUyS +Q%x!sg}ecOmp3U#u@p^pM~X=k+`^)Zz6`INHOC}gl#9s1Z%DvDWEoUlaeLNMvA<8MK6PwFsP*$`Tp8? +jU(d!?ug*w#OFJJUH27CxYKkKhgouo+0R5o2iDYDf!dFR+{`siBqkV=n0XW28p*6*CvZ`4oFh6br1Yq +v4$+jC>+a5u?PP*48TQB7;L2axlXZGlgZ&fzTbQE{p +8io+c&!}_l_nLSX_!}O4`|i6}|ipV=nWuz^K0>O=sv1NooNzy-EtS-Y{?kAlA+DJjjz}F~vxed79wPM +nWN?af^laeU&Kj1(FE?7L|kJ;757G<3gRylLkFpWnpsjKjqJu0r}SeYDntg2!5RVF5UJf +_9s6qS83`m6H7ce1Ig+A>(-}zZa=vJW$_$tQD^GW65u-y+jWh2} +;JW6iYd8hz&FTAH&3BB@XO!mQ<}%~R64w_ve^E>(`U4aLcTvO4_0jS7=0-6{*x-KMA%o))6OO>I&RrO +Vd1Ol3$&51TfV^SjA)dKbY2$8gJ5CK|keFNT2`6Kya91!<1xPh2nZtce_UGjs$f6i8gBrS!}5nJ-{w3 +@=gI&*)1phhgY9YK$c)I2gX2CiAv0$nm0M0&859sEB_#3Z7f~8}O%uexgeX$P+M_mbvIBpu*<^FbEo3 +O;KfUE;c?72dZHuZ(;pzP>v=PJ^DY#2XBVK1+W5Y^ykU+8iih-UMAB!BoEk`tYd+$k32=NVr)W4su55 +j=Mfg=cRIKpKmQaEc%mT2<}Jjm(V?Q_5W1Tdq=ScN<8VQn7_pEOpXjfaT1E!xkTjJH-Rf#g;;c#Mb>y +f{!~tLflJU<~`~|76Vw#MUae_5HS_~;kBU$ng#|b_1nd_nni(XaJ?DzV%1iA4w@*Nd-6=g$O%h?5epk +UkK7f^T7>u75jYzx^<&$CKh03tjdRKPI+rPY%R<* +npxRluWZ&tfvPiNi2A;Vf6x@J?67CFKOQJNe`D^7_pZcVpMopog;}s8NpDEmi61Z{;9DF-TOop(5sf? +KT&4|RH8}ozXqUyu;F`?hm?8)Gh!M7E +3PYYrB>oE6!QW{hHJ<|9=9BxS{M!zeeK&~HreE?c;3Id!;V>Q`d!trYLdl>L!27JdH6kXd!tqe^O+{9 +eZm4m1Q(D1O;strZ2u;h|#8rWmlALskH-WGNK6NBfz!kOfsrEdtx-t8W +i$ehS|SXV;9rVwleF{-`aC`v3#8;MFRE;aUvcrPpL{h(g-0s(xmSJND%86U5kp>DeX$#xf&=l_I>HP~*K)d|RxteH$A6l9=kflX> +mDSQ~?Gqhabk1?ak1q6#N&PKE=`Ai!!?qo7AXUkmwnw3-dYKa4eEhalPj9-V^jK{XrGcsoeCdMeo6~f +S?VKB{W)9R5~2e16|Uj(rwx_QMJwLL~!wIjiVizgGo8rr9pb@5nHptAz4V`X@aN46%DakmDp68AK(wh +pnBtQ^29up%_24f1V?SRVkhOvp( +0hbNAlQtomNzAg3Z0v|#6Zm@oghH4(`AMJ5gxt_BX&v<;o{XTt2hYWkhdgIJ7I_bqDjgz`8uF0i=duX +8E8l<07ZNw^>P6y@$T5$0t9~D+@S*xaigtrUJr#>xIMuBlf0ZJInQ5wRp4R+1%av4;1Bz@=r~A*3$*$bQ&5)SpnrRy5T3({X&)@9VV5KgrbVkypF{}i7$<4sDEUQ^$N?G$cmUJ8CR{)eya#jqS +Arn+Uz(n@93#6(iQ_xKs12e8>xPOH9Z(Eh9YBZa2(rv*2Ik& +L3eqy;SaW_)1_IVbaVmm}0L1NH=#lJbH5FPjF!#9x%>4IYJ+K=Mz|2wVKp)tR42vg4(-B+^D&$r}I)T +^&N|jNelpahjaImocc?r{q>e^K?m=n8#>jdaP*xFsWM6b4nMg3Ln$1DMZLkds=p^tpcLeRt#F_K7LXw +pFJP1(qTqytHn=>-z|4y5oDkMF13EOrCMGHPv5!i$F-^(S80Soo`+tU*`SVsk)E9>T`dTxD`bjJIQ4u +!M5cAw+AmrxiY~+-{9WI}y%K`yC#n_F1gZj)_MA!8+0?`0!&gN0l)6QojY}lR_m|q0esS7?)gF!S6ZM|1_8z_*FvtUV`!kUQ&jDG+O88tz*Tu}nPqY#e +-34>&uTOme6I0_L3Z1XYMzOYzy(C^UN6q-& +US*gnsY%8N%LN8+19Fp~ZKlSekztOq~|f5_6xprh~YFY`PL>dhz-5tSf#Qi-R3(KY)kH-@rZVcYgp_? +G3_gE0Ly3czf;)kKY?&LJ)tF3n(;btiITwExWjf9Y8mVEPA*uTl{qF;|`h~C+UNkiG6hE8D`rsr6dmZ +kbJGKZnT0WNdNe-(R3!iqXX%VYQ41^W=}eil+6Q}(P;L;{Kkq#mC9cwDam%| +0mh6Kjr$e57Aouxf!%exLTe)1;z4JDO4<@%w56zC%IY8FlEdlGeF+JhRxq@F;_;-?AP`h +h59z@SD{$k-g9iL*$*(9Ut?3=`n@)sM%J_zeP-PG9Y_zA&dHQIC8+50?3a`c=OJsO>IeJoC3@m2snJy +`fw2_*)Umc_GTfc4Wg@L;Af?5gHUIB`=>}u!XssgfI;?Z=`oJ1CW^2MyY|)y)yyAjf8PtFO3B*Nt!T$>%NS3tZ^4*xwhyIeo`Dp1Aa4%0=>TCNJiMFk8wFp3IB=!BK`_fQolt?(KfJ_x0rE&hg6*RGUcS&;(5qFGQEKr(Fw@fq|M?23HOBpbg0&9R^RH* +zHnQ88!|m!sb3*!r^=sj7ZUmt~_Q4vTt?$tJXP8M}6sg{vK?gn4y=+6f>iWJb~XoOb)*560I +BJ$Fa7Cies5oE?%lMuPP4-A=HbI-m+rMt-uXMPds{=HLi2qbZzZY3GrrwvL|7{!+>3O7s}C1XX&{WU0 +2HbeP*)88Z6Zv#4cY9yR+C9%FbrMJ^ioBJjcC1mjd@r8g0$ssq?6dr+)!Nu~A|!P?6z;V~Nm +6~vqbGQ;v2ful=exWiIT&dUzs8N8i-I^j{&-uEUd$0s;6ok;5kPio +NP6n3;L;Z5bN$YqpFOn>0wktMhL|3x4ihixj9JoYc6*zikRs#RcCWZtOII_=P{joi{=EC}M1ng7NO%1LYx70axnS6o*DR?j*^ORM@*i@Is%aa-zQIrNoSl1h)N>+QBdw{ +L480%?Yp3h*O+~D;8S{5Z@W-49(`PNS7*IRMP)Je|~QRdiaGw(md4@qB21BF67B=a- +HtYr?7rHXvFp#Lk&>Z2;ZkAWu=<0X6U}TK#h*98QsI^eUEx&4!x=*gz1i}UL7Y +BG_EFiv|0xa@e|dR>S)9Lu^^!Q0{E{xOq$q4?(8dF%$P_g?mI=% +gP5RJD_<1_sBWJTTRbS$;0M_-OlZ#T|9jz(DTt7r)C;G6seK=}J?@Kp~yz#NyS`1`%1zaJd$4XkrjX2 +>l&IHzQ93P<1;f}%=X!%B%~$E|WoAi6o!6lYj23fy-dha{>^Am||p&$`baw#Tc|`q&`5DQ!HTH4I_Fy +mXVx)V%uvBZpv}gVB+giDMPr2*iUo|9(=z8nrzHKS<+1?jza3icB~@nRW^%9vtpFL?r0!1E +7UD;v;A!7(;lGu>_tAJ|ht!&AQbmb+AS!(|C`uXOAJG#2ig-WDoY)#M>zmRh +n4$ivM)LiaYt>#{hL5UMqIM3}E8w}?la5| +)8h)0Vv9flGIZ)*uNVWt9A;3h*;58>l;YE?tzt0aumbLjmIV?iX8qstiv?`TjGEOSr +!)*>k;fF0JdS@x8vcV0UbI`*mDvNemIg%EHwcg3&=Rg0<9P;zeop{c^qY7G1wRov2=8k32@P1`z5<9e +y>Ux&U)|^J--Xv8Wh5toiv0$y@wrl8Hp)g$za!)`TqMQ{U3@{n;`&!XM_=sWM5(5Mwd0<0|dPozxu^? +nCA9M;877S%?lL9Ao8Q5z3dgbhG+pT3yd$*=uDES>L7K;bZIX9lByck=xlYm0w@wjvI-`%)6Hs<ZftCXO5gyT9jIGQIUs*Z+w4F8%)#Uc%v;~A4i93&I^^Pz}3o2fH6YleQWc9epTq3Fkf>Wn(v%{xmJavvFoy2+J^`Jp5g^r +j~jbj|rR%vNeEVKz)7x^f0)MPwxtMTsc7J*LRM<&bJKqiy&%lI2{>aPNrX#Lv;!L0{rZ6tKT_vMvL;R +0M)=)fXwZsGI$5d&BKloy0 +xIu|uBoP?;dD_gi=!ekq>O=s`a0g8a}-D<24Qw#(V0|NjQ7w@244mo|Irp2P!>ns%$&zrrPq$rdYUZK +PK_!&Jr9S0-Is2E@KaEKC<&l{;6TN#TkM!mt$hx8F%V +}`c8=~VXd9=0XrH4rDKCeAh|VWq^{=KbsDUl+`Jm*dmhK;K8WdYZ#PMdF +DB#J?Q>bXpIv;^4oW`}XL(BruFhRv9gv8M+f-j6~Ml1@jap<&1SH(8ch;j%GJ!rpjd$JTt$+XK8#H!; +3?XULoDi4rK;xoio06RRhe7~5w5HAT?rZsJ0CO2TW +QHmvJIcyJ!>C*DF{SC5lEZc?}judKt8--Bqc@lD#6@g(YZ}LcO7>7@~8)LtX+LrYCT=hW2xlcCvhW8> +Xid?MBTq9V)x@cs>jXqlzX!Q~)s?L>ds9CA^qS|R>d!v=KIkg1keVQkgd*Orv*@>snZRxBveNi5YqFq +p4k8$;H#J=)LaFg;KnFvyG57%dO+kx0fD0>Q?!KNEFQJUc0tHjb1;c3(^^9dG=mR0U@vcx1>hWom@*E +X2beay;xf#D%byePQDcO333I@e1@|y*9#71ZQo9@(^3ReAmGUs810yxiCx^}KJ?G$WvDd1*w;Nn~<8ggYPg*E{uuFt(Ux!qr#V-0f+87J0*(yz3B%6a4f;$ExFtCP`=a>DeDYI2hZ +l^XUf@C>hZbc2Mz9R7q+DMg9>M~G)aPNd#!~Coi#LH@!(MCymTeZ;3I1q2D&JmJIcYep4@e-Va2@$bH +MCJA>O>=qfxg*#KDxt)={^-4ZD3^i!$E(PSK$+Uc*=5lJ5d>>@_GS-a!r@**ONmxGmu)EXkdN8!pYn? +{fQS3W@#7ppW*<2dW@XF?eoSYyorD;m>Z3vQMxPG)Z#rr-z#ZZ(uc-Gp&{;`UzKKPZ-2eeYH}NrrYtS +fk&*YdHKj{HgH3D4NfrUa>R+> +$EjbgkDH?K)wsDKgpqor0Vh;6Nn7GQK}7_!;Cerv-d#19*Iu56Kay^!D4w1<8rlGFV8WF&bboQ_X$Tg +sBWSGRC4l0*F*K1Cro-nTh49Kq3jc^nl?K#x)NU3;p9>U1M3Q0dTiL!<%Ln$Dcb_&3PvNc|2;#!KSG- +vBWQ5<1GmdzI;?V9P-7^Kgt%bhbeiUVZwEhIab_fx0Q3mi73ME}Z8|t5MPI`t`{}@VTY-XcRj`3W0xQ +b`R8c|U=0KX_nmeUVDMA_N03tjYQyEGwi>h`sZb6-`Qnu@N6jrGLxE7$$s?+oOotheLLk~G^qU+`9MP +t>~JS$S5hi!W}^@x+r|6ehy5*PoeA@1aI2;YtnC4!C +6JW}7R*5s?Jb{VhDyGyV5q!I14DjTl81unC5q!8rQ-RcV++$OT)d*bJbMcsklhX_ngd4g}?`W6rkG0a +%jybmCKCfu9M +BscE$+LkS{?FC?H7>tRc4ayAGFm;zkR4%uJ~x-Pn7R%T>F6)#L%7j5WR_E_&tqt;PqU=f}l<*epAY-Z|`RIrZ-;3n0!lq0IAjxpFrfepCir7YSk2JI^4)(1MyF4MYmK%FePS*n?r; +W|sP(Vz(H!pg6J%LGF29@<(kU^%nJ_dAel8!}PwgCKLc+I79jdX0yIvb63r +t1=h22hpTclES$EDELj!vH3JNd24)q_K-HYyMMk-f`e^(6m!G}6`ZM=-&LK}M>ow!BYNwbB1W3o2+It +a{|B6kp)&pZW`~Sg(t2Bq5b06IJ{Z-G{8ba%915&qkA|A%Ch@SW5dqD@_`CFuqvq~)hjbOF$Go|bP-| +&jqp3=F>Cz3IbQc_vVs&5i1ghM9878&Xx=c|2G3;3h6jmUV>|@4YT`p8oMflncn2PXmE2Vh2Pz+d)d3 +-vLNp!hdC6rM5B;|tYIghH4bIbU9|F*a;%G*L|yo)nl^Oxyf6R6cEu1st)BG#GJBK +A7j)P%V{w$Hmvl%;G}mdrflOUAUvtLr-avn^~hZF1$XdF6m}148E2lt#Tu!r#@NHa$c3f!g=TiK^(^v +2a97Oy1b`4QH8L@Ym_8qv2vecQhMIka!=`UWeor7Du;?hAB`BgUz*w*n8d!T$|>u#Q?AD@O(hShAMkx +Z@#B$gv{EvyBF||t;u#7-VrlI=yvF0CBipFJ-#P~y>!vD;%L&lGP**%Siq(36`$F5Bo6yhO>^fVdvn+ +|r>T(l*ZJs36Ka=9|v(G3(4q)YX3L0MZQ_dHlje^2I(c!S|G%jZ8`w1OlqHR0#O3%8%9Msml%gbAI4? +0>L0kI#M(^x;etdhl*y)?8hTS^G(QPEBBvW`<;4xlV3s{^*o3{PI{S*kDdnxo?htU8Qmrj1-EYR_(bG +R8XSda)?s-fXJ+{jk#R%i!Zt@YInzKw8C-hH~2Wa~Iek!>v@kM%Z)DpX5)M#WTZ5ZASP5Z6OQHxT|cn +%NF@NRAH}*)s_|ih$5w5P=HCID_kYKFL9S*5^NBBHyN19ssB`|%{sbOznJL^=R7MS`{A%Hq=9+P){|@ +7rUwpfU+37xqD!~g*lDU!LM4hKS9=&nn)fa+HP-_@*8@G*gXnm7_fK@5=Z4vHhd=i(f}gQ02d(qXp=> +U|I_mW4GA$_J7QIP;mb=8d2#w5{*`=gMvN>`_eS9~wnV)tfMlvH&2k=wP(`xHPUCC?~gFxr7TYh}-?y^yMIL;*%_EPLmAW**xGc*2*vq2<&2r)>3z(!zC)SAG-aElP;=Pk{**x*xT`Ff~CpApF(uA{&S +D0^uUqjagHJv(|@gK2mE_jb&CgJ`rkS;aD0Mi9*dF<>KJ?v;D;b{?? +XLbhS3VK^$ka9*ToUAx4LhqMsK{?#vpUYq1pL6)<_A191uAQUZm;2xEP4<2~*?WUgmB*M>AdI1OeEAD +qx`SWOe|e_9(_etdzg3xY{tHlbfa+3kN+bC@Y2(WALRH+f9mAotc?2SBTByeCW% +qnjC#ERO6E}=ccYxswP@V^nQIqjD3>Zs8?uWrO#Xtd@8+{O_gPznFXrn7Wx~9KR+(Q5<3eR@#e=#=fC +^&!Pza;R?H4jc&Pf{{oNm}Q+D*=ww&#JOmOY3ax)=B%%ux_xsn#;j?*nSGB>e4%i*K!0lI%3Bw#_#WY +f*Fl`N}5Gdz(Z64{ehtSbr<<(%*{NLY@8*w}u$@sx=CSBOY_HWqz?V*p^d9GOTtFTITxSY=O5Scq9V! +p<}-HWSHlxa7GF&o% +gc+!3!bOu=VRzP!NOyD!tKT-E{k+ +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 +?JNtDWkHdlgmwzGiJJOAZl+d6 +iPq*S^E8xpfhfM7nW8&r+7}Ef^xlNPnTE`oC;A)zx+u_i2#LiYc9ji7|YAZdRsvfteb|_i~{S*0}x;} +TtH!LpkQY%$sL!6USj{4S#)-rMS`pY#Mp0a#vY#K&jN@sSmVwx{!g5<%mxFZ0Z%EOrO?T`e9Qo=RRDh +6do!XkOb91?XBZHO=~#oZ5H$W8q?a-Ne3cbT2`sw?K1g$oS +B7Vg2n9bmjcjBuKL6BylH`l4B#6G!ld>+Mk*wZ$7Js@? +FN;r>+{O>UnV6oDZX{7bSD5*yovpW7v60MYpMDZVpMG+lHM$P;WastQ_&m8zg7=?)I{EaIVX$8`X^vm +^UVr+@$uLNpc6$#%J%0wpp)HCM!*rW!$Z<%Ab@E5eJoQjq6sZ8MMzy|O{I;UP~Iok;^!DDHP|2TPh@MiMz;P_;6_-g0mn}eg*YmyltEpD>PymUfwn +0__x0U!zfjln^a92JW9l==hLM0F~=hs-|@NkznI(`TVPuSu&1>z0NK}?!@kta7GzG-T|Ei%b-20h{Bf@8g_G*5Y7kB1kN5nw8 +mbifWWkyxrZxjEaChIq$3^2C(j@Qpk{xEUH5Z~1T|h2R4IsQ{}N3Em_hAq%V>A_$}g23^-zYdoJBSwe +*}$O`kpvI&F$H3^!5aS_EsFb_uRTU#u^Vw2FVxS`B{;sI=7y#0bMj0j1@h2~K2P|jXHi9>RClSY-C=h +PhCdrs*Oc#i_QwXtDpd(S`r)EU_h12KOD$A>#d%mrV$T(I`I-gsQEVR9oilxoPhFLF7y)f-bRbZuAJ)VtV3m|Ue=%p&}_P*(6HJ +*N(w7g!CRQWK70DfXP_ +CWz{fc4=gIpz`^C6-XFa&U6|T9eScxbxvtuz!s+o+?hR}CIL9XyrL5&FwwSr-B%5&zFBs005bixTdo2 +ZO1VzS^PEsGouHQ$M0Vzu-sw=})Ggyq6$tYs~EWdP16Rocn2bvol68+b~IuvPl9SCjXE@YXMwI-E**Ewcu@64#WFwSga=(2LAcAwsJA_CiY-d9lx1})uN(P&~Ao5lgY +h%_jA#a}0|pwyUnp%1Faoi>%-2K^VBBFa`?C?riT9Lh7$DYi|uN1lV +Wp`ViyGko;BVUxJ#h_l#RnwWIJW6Dqw(o!bOel&+Byz9#grRW;Gx$yn*?(457(7VaWwylOeJ2n??YPk0 +&4Y%K2_~YB}x#wQK@Lx6-HVF3=-f>T1#m%0=yYJnw@yhJ%%px7fakgpE6L)-lck(aovMqN%4(~?>Tz9 +`j-<$6KHGNmy{TaNU8rOLDFDUFccb}p0P92`t-<#?CmOFmzM|}UN?rs;uEH_w~tn9DB%?qf`Jn8jzS|OJDVvW!lvG-7yb9t0Mvn^G%y36AE@9n2Ij5|s +LFAMDfsU?q5q=3f_gR?{xSHK{KjoOynl39uMoD?d?8FB!`yad!-m`W+Zkrf6?)sRgumA>goAROS88C) +y6Z5;pyB-c_u#@;Hf(PAF?`duLYtXY@HQI0kFR0lUH1au6i%Z7#pnGV+>(FX!vFu@|C4{K +A&0E#!WaR$c@!5-+U|5(O9OSR{`ys`v<}HV$Jz4@k#eXo1VFHZb2HousV^)C;Flwig0gyI;w1?|zqu) +oI7>juO7{rMmLj2f&gSffR%reaG7UN>Z{%6UR5F1%Wm>+W4+^S#=1rtN6>Q_Ok`H{2T<{i +3}sYZiSXleHo+V3^CA~hzY#(wf!D8}C5 +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 +CZHuZI-}6`IrDH3zTc%M8R`HVGvj4zw%V` +b`kFgp00WDY0f5dOY4im-o^Gwp94QAb90n9hmcs`huVA3tFXhGxE7zA*vNv#wG2$&p?gd|KhtsI;#SE +m7A-LrX^1|2?l%}vU^h0t{iJ0femrW=Qsn3+qo%8WoT&{!}QKGP(kk{ +j_Z;C94@vYU9-mC2P(>p?92rveXiUF<^VqxR3Gsij^A@Qej|nT64iFg@`bOF!Jm(NW +OE`q*p2i-)fjyv82v9Wy$j+)DHXx=vkm8{`-mvAqKWhQe5_dq_UxOzXff9Y8J&X> +X-LGHWaZnH7Oa}k(`-z+4ibBcES$1@=;6)xue3b!b&Syn<@(Mg9NmCeR87>h%415V1Ah*Hs&&XF6gF{ +$oR=A0ln6YLWl{_^KMc>?{E!(O%=S9& +egfSui^aDXjOUa6HU*WR7sJO-%dhWgXYTgK8jE)tc7x{7^L@*VC!wsVr)tum{iQSpyP%op}j8&J!OK8 +zp6~gEw~vp2^T0(<{Z$=511D#(@>)e7(y=AjT>{%YRaJL5?o +TlziR8ONXHnlCFGHYiK%A2iYw#oDwOK9jmrN$`7kNz!REd>rVG}4VDk4NDOkg>fG$xtuM?k#j^Xmi!%xKNE7V6{Pq))o@OAonE +=*s4cnw}pJxUifWtTZrZI(i~s1l>)8GvR|kYL&k2`SWrAJtYVg!PiEZ4g82(wD%6$`^1!6m$|b@Aq_h +6RQoA)n1L9Hc(ZpdZQ;*;Fd*oV!i#XwPZs614i= +in$i#R^=qBfTs?@>w$2-4P{H^y)vDbWGa5As>|rYC#-Z0wVD +M{HBDxzz`A`D@INVF?;{MVv*UcI8D7a9SOnSXLCTGnWA%=sW7q5Y>%~P3L_{EB94?`}UoVz1Qgwn~2* +RE_umH?=%$dg>xEeFJ0qjwLHR_pv#0Z!fGYRi0bh*?3VQ2yfepjM6GSoFSJj<0>Uzd{gRu4#CP!t@)F +ra=rAyxHnkf7~q??&Khua9J4fA_-}jhC%AH=3mN=77QDCGRhxV;eZx5#=5p#=+?WeS?Ke0$aSy+&de- +I&cXV#H$^A_~$`lMsmpD!~oP|6n)P$* +Wv=zTuaA$^=S<%}?abgZC`rlow%jNqmKrUqgRhB`tY_-WZTL +&X7&kjX!uIEkivV2-FmTKk^B?yPPxMeh8awY1}Tmivah=TPe<54~W7Ve2K6*AeW1{3dj+A+!;~x-8Wx`8kx5KAch_Z2g-KcWwv7hq#9B*!4>&T{ +c@W`kV%iq#EXa+#K-b)7lT5(~C%9rR>5vCQt$=hz=*&F^rEktV?j65ZeylYF<;uL&J`Lq&i$13zA!1+ +gPw1(u_6gU;+Kp|G6P{S1RZ#qoVD9R2{)j+?bw6jvOiQO|I-B4#1>im{$W^1uio!F_ru%Y?P;#RLk9@ +6;UG@rIJ=IX%(68ovLI#wtRWRjVAxY|&g!0=@MGaSqSl~#~yVSPf9YJ1d5Hrdf7sCw4+@Y5*nq|HPzh +bk6Wb&CX9!2@-O+D}0>ppc#ksTD?`1E{x9^;A2c5upl$HDzK1^8L4AD~{ntZFP@|OR1*=S!DkN&B|m^ +Slo_YAX#KXF4i7hO}a$Y$%Py!1m+(?w825H1q>oa61rtGjj=E+-9i?Bi6gnvY!KFpJ6J|o05zP7i0r4 +90wrkN)bEqRBGsN&Oh61A1!N9gb~?=nlR|Y?kJfI)$xroY4H4U%iYPaB$wD{a{}gwYqBO(jZ2%_bsKr +`6BO_@*%x;URAJiMMu}2l|U)DPhon)MWLUQm5G%+MsH%uqDhpaRQNLtD$h4Q%OqqI#&H&1GFni-K*+n +kn6@irE>)*+Mf*T@$Zsj)}ngm=VGW<)+o_E#G+j*sB{j8ruvsV^SSkK{ln0-1}(r}|IqEA;s6rvhN{) +Px#)q}uK?&zIHa0%O0Most{{=QNT28ePY+;q2uY<_o}>$|t`c1v?wpz#fM{%+DDZ9E`^Hpg1IDm9}$QfKcr5fu@Oi!oj$;6Y +XL<^{^iVXx|ZBM;av15dLIxG@n-RQy&SP38;`>mFT8Cjq;$1%L+a(Tg0kJrD72j2g==CXwn;|B6mv}6{{6l%#P_>vYVtK@v24(K1jy) +)b-m6q=qLHNmHBj_5FH2Vi~T}FO{x$>3iFmp_^chpNc2xcR*tVtD|+%-fSGb*j1QWu$1XSEvDj;?RWm +Dar?;5n6*Y!^-zKM}jXff^X3N~@6LB@B?s;IfJvZA^`qG|U5jsI=C!gzsm??gYRn6ZabU@q1Z5=XW@F +3F)!Qe4N*`g1uxIcf#D{gCF4*G47+rRqlyMXt7#H#a$~3ial8u&0#lWjq3k{+8lPhjGe=0iX#TzB90h +^zhI->U+a^aS8wHvq%+F*rZzE4pV}V%IyJS4lPOh6>x>iI%yJr_I) +RodbPR~mZAN7P$g&s7@^B`I$aJz8_Ycu_O4!37jU6Mn!PEw7=B&)*s>a>u4I%U>ymTEXf1v9br4k^hV +56Y?`^ddnxSJt&IX>dw_mG>R5}{3ofYD3V^lB7Kx2ujAu-#i3$z=m_Gy|6_fR@TskJn8cjHdL&giElL +7?uLEDM{!FI-#dPwW2=!M?~m+XaV{Vj#*dpjSi|jQkRiz#9jcF+bAKZ9&Nz|nUCd@#htkMgbRUmkC8X +sEPRbyrNVo-crqRH&!npr%4?%Vi0`P-kGVu;Q=C)<__Jb4#bBjXL!CsR>k7Q&Qv7ynUM5iEOl|uDnAd1mz2s+u*c+n@teO&1(*_zA17?NQN8Z3)M{Jf+W8Z+yPmmt( +r_;>=ad@e|EwPJzOLRX92rSV6+C8swCcQiPde@+)v_K^I5b8o6yY|MU?Ha_X*)ti6O)VUC7&Syp|NZH?BA +iW1ki_EztSC~?1N>cb1nl(lH~=96D-Vjh&)(*D=r~e(7Bwq;4r;*_d@t?K8P`RSU~vlPI(;E4ziD&Ap8=9{}*`Zy#!M|c?-x +EC4Q)KFYeuqSsB?=VgpSodmcXX=HPQ$5k5-`@mXE~&-#b+s^}|wA$?8Dr!Pw`ea*Jf*A-THJ@u%?2`| +~j?3qvB<~dHUuhU9-^^V0O3C&(o=;jy>A|2* +`S)9cX}?!MN(-H=n?5bX@Zg%Mk!9Vt~06Vf={uf~AVlwb$JXrY>geCp@U0q0{K<0cmwyT8&rPDJ7UnzoCl`x5Iq>ssW;vZ2Kv(I$=;UUd=#BSe-CxD-QOK#lCvSQLg1A +M2GI*`3fGC2zGES1qNKN2#awK_vpXk*1=AZ6ml(tINnGWe@hj=R3!QQ6(Y&xFA<5E3+^_c(HrN2$Eea +6M~aDW+Ipk#&ia^YoP$v(7yJW_charIn5!SbdY`0;MlSdm9lr_jvk}lj#5avuF=&5p6IJQsjKHVx7Ap +6MWEFp_NOE{r70>}Hl_!!kE;tzghN5^zMQ~;PMOlXHu7aa^V?sTG95{gam8)s&?2OfkWXudb&$#9{aW +6;V4$|e|F5YbKP>fk!sTCS7c$%)B_A^`y?$-wj*K7S!wup}hOkTegI-M+8scQpVuoWxZmNp6mJyN7fF!?@29+cKdVpm!;Y1FXN0CeI(6Y{O(Dqs$DX`{&c-yj1d3u`LIa4a^vRv8!0vcoH+D +n8fxKjNk%)6Wuhige_-!*w3#4tVw5>p@veBh@m?Gw&)cg~ +Af1RQ(Ho)h%rD+x{>NwpFx--ay-oSx`yK*7(3uXEITHKXEb+zhuNOoaysPeoRw{0CCs>E$E3$-k{mdB +I1)cG%X$z~K-H8d=nUl?@4yl-`T$s07fQu#T0GxR7w4lE#V%|N{^o9;N8|H~2OS5WgYnN{0B)67U3Cr +p3>$Y&n|B5j+p;00xB3J^_6E$hM;paf|>8c!3Oe?oWvr1fTLJuA(S))$C3+fp-97IJiq{FT88iIQcLd +92NC?{JvkdJLoqKVh+W?uv$QLsegi=f-W#31qJUjmiAh<3?OMwp5_unNx!Y5oSfiFk2fXIT>`8NIMue +EoPz+7bU~29+l9dbQcIO`BbI*I4dQV{ERA${p2-xOC>PD`%5aE%m%fT!Kzji*`&LQY$5n7?)G?nROns +pO4$GGmNpVqh{N#I+a|fB&S_ih5a9DRq)a({D}M(!>$3Xby3_fL +c!4iWNj|{@#ed`g}GvR;bpk{TNU1KQri>rzD#yFr?*b47`~h6U((_Q~=lt2i>kI{?Rg@w*Y;?D+eZD?{_Qgx0-ile3`4;sa(zIOa +ECE0(h47u5{&GWIbBo`rz&!iGmt1IArIAZ8TMnuivfL0T{e5stS*c`P)@-cGLRQh|H?`RXRCy2*xnoQ +w4RMG6DWkc%4 +OK|(fOJ*;9DOppz5sKJf3On0o)6vbUd>@6!*z9^UM(|wSRvW%?a8I>dM@zA*o&zjA2c`{@^ +%fOekfQlToM2zJpWesnw6i14-ziSUW*VjeGA_|Cphu_MoN1oORK;FX`=aUzKQa(Z40s3#YPkq-%mYsr +9F9ij?jcpz&v@B+}pQe!O(cWEYZuB_Fj7MEX@$$C^JY1w+#Sd#8>dkF*fA_{WCI{edXp&bKqgtk=qs7igQNr7}siJxZ3eNJ;mRwU~6Vz5lNO83n9!)eBa#Lt4wkMIgi7WR|Kep0R;(WavXwl&?*>alnk~$ +3|NK5m|~Jr_OEkC=RZncPi=7DX7CH%RLLqG?|Wt`j1qhI!E`Qo|&+i8QtD{7D9XW;^X)DcwxfgG0q=y +_5gwYEOVPd419a%pw%R>AekL)4SjcZSWVSzog=c@g2~hYQ!Pat+Ex|161HMpYra$Ia%+#&*hOuyterR +Ud2%#htSOH0GvSYgKlm1wk|Ff`g&D95OzB*-%2vUkI*e7^jSpqDx^dgZFm^v1;osgvk8zBEDkxl4 +?avZSXOh2;vJqNn22d$KBilBE3usaNsy~u +hW;mO#F6G?wy82+)!b!&j;Vm-^C(AbeH?by`zU^@_ZY1@N00T(QdRr=k4D3DFoC6c>STl{Js0R+j;z( +eu@D{&xz)R@3i5tVo0kll?wkMON-xr=;*Yh+`)k30_5i9)eZ4?tgpelj4&$kbs?8sOmxT<%ayv4wJ+y +pCBrDY;hobB%aJl_c`eQM0BdILQCVt3j%z$HveHk8uP*sg94(vp0GDNShUARZ3GbyyW%wk#z^5q&|qp +<8{=*c_%$W2j!sI{cOb}>MNkNggRK;>a-J5tLkrEFSg`8U +GdM#9;g|5~@Ra$747Ft)1-GmY2F#^c-_IJrOl^uTcv4JKGXo8q)Rlp!%)Q#=9=?t#Kg%B^nV_wM4wEH%mqrC>-R(ehid(bzQ+0dmigU +mmV=Ir{YS1v^tbbr$cJivL<&*OW~>)3H8{eBu~*8;cE0PWI~VmU%Eaw!grJva6O)nre0ZE2KhZOIdtWZ<#Oal{}t89&@}4@YUiHhsIExz^SlWuelEF?pFg0yJQaC)UgBb2#oAI68c2)aM#4pQX9lBqOq?fPj+1uQH}1<{Db-gOA8lRxtx;k13dF(_NpK3p_Os5+TtYL1@Z>Wfk +HBe;z1!enx6v0fV2ei*MORJDP9JEI!_!2WZD_v%$4teHl^>KC;q|S`Ah(el9G3lvL0a%0025t40Y91Q +9qP}FZ4T^!}#$1;OT+&R7M;;h)@Ur36u|1&;xU*B*&&m58*dJi0Yh%&)3(bHqZ41NCO(`P>ID0O_AmW +blveA`w4yJu_~W?{HT2NLjTaDVp6rx)Xp7Poa^y&2kuL=pYVk$SoEozDmPl?Dy!pMLk4L5rVky%4Vg> +C@Epg<213bx0Xhv|V8ow)26&a)lDkp6cZ+@Or~w%V12SbTN>shVFKvDCa;mDMp|lF>bp>5N)l%Fv1-( +OmBs+^DWX4dZ*lkEIB#yB;HKUBKN7_#` +?vA+(Pkpfg>tiuYZ{yrM91{kq()m7{@Tzau;rbo5-u^E5XNMjEJDi!jnDKh*_l%#oSU=16>adYo{xkdqfWYG=^~rp^HR;s! +)?e@}>bxs~uu!XoTQ2vK84w7WU5}%nYA=2}U^;%zp9=_zKlHeXvr=CP5)S#T5P2A@<@J#lUHaOV@SM6 +2n+$RPk&64d-&Tm1e4N6QwgsBYqEhFzOYO7cN7UYhh5|rSP? +yVEN0d}mXK2+rzu^gTB8Qie>;;d$@oS^$-d|JwQ%9g8bP*_^bfDvH2T=6XQ06$YCW`2@LvUzJ2Z?cD@ +2k{1y=)v*yiPxM&4~{d_gEV02_ftb0FA^#6xk*U@V&)FC%ModZS=zx$JFJmUY*~@e4%_q3KmRf+0eH5 +svY`0wBbaeluA$ZDyjd6uJva?nkD+la#H|p9lESFDufTG_(C~$V%(bCFeSb9Df)qJJ)+#AkuetR0W|-CLaAde{g$7=XQ(9ylTDqWTMNbE +$y+m?z0H+{;>dYn{8 +$h(fGDTLk%TZF*TJ0T(M08S%$qK|;^J+a&dY5nuaUmO3mkB*RFsnqnj{~@TRKLB963r}NzjcH+}nVL* +~4WAn=lyz2 +-DFIqPklpYyOVCD>a@bxPvFJ_d}nP`_Mt!#X6RnxfUOGMIj7&@=M$T$Kw`UOC?0Uj9WM`B;?^U&xy0> +Weembdi0$7e{n(VAXzv~ZCrhnjFT(<<=QxLlV8M8wXE}dG1jua}NeXi0`o2vE%I+{}z|F8`!J`LkM>IcaYZN#Bf0+oG^Ixi@*!5R??n}@Yr9k#%1r7m +*aRxUrkTZQqj+7ZuCh=$#{s51c1noOojvjG*q1Vf{oLSRqI$bW8?IPksokDsJ(JD4UukN`ywD4YyOZE7_u0D|`b-trP%$T~Udb%oWylOZA`VATewf%N}TwLo#j +`@NEM0vqW;++4*oQBnTh@&)MNmXHUQYp +xqX6oDYS(s*#vgv2t_D9C)-qN=MyLEBUiWte4rMoa8UW-6aX0t~Zr~Qj++-Jx>eNHqDKgAY?t7gch?F +11hL&$bvP>=e71jxBGsy|kc0VSODq3o2M~a9$H6o6a)1eYsPzhZBK%lbq34Xl1%sd)x#b_}`X&UpA^B +^W_F6d)C*Xq#DqRscpC5|C}j!#-Z0@M=|%px!O8a=NUF*P^|()A9Q1UJ*8RIxg0lF~KxZ76qsi(U^sU +*VdNHUU>|0?lm)Ouz-?EsWlDmp%)7quMO|au3eJRx+nIxn@?1Yb#>gU0zb7YT~Bnf-!g)pf4eqTjV}u(wuSC6`i{rm +!>Q9&T= ++R=dfk#u2a9q#z~U_RTGftqIZV1yO2+^HMN%Bkx(bsZk{AE%k6G})Ed#k5wMzvm^*wcw~lCuvvQyi9c +^9K+imv7eI9APP!0+-Ow!EG#>%X@$8-xv#C#+#Eb5SOSA*&$@L3E{^wtErBt!$d{^{eKy +)t(jt0^8enlM8DiWdnBkNCUY+=PP#+}|!D4u)p1M>VHgOO8(aD(hxteD?j#t60Ut8A^MVGWeZ9Cg%A4 +J|faujFunxHCNR%V$4li-#apnK-xB_6qTZr +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 +L8%~p;(aFpBM)YM7?3}ft|QCCWf%N(5 +7FFX>ZpU3dB1Cp!l#0t$mvKZ&?=3^%=df8!?-fbB +voF9qpySPK{bpzK@Nk8u3TFU +9iy+I@C|Q1IGfW)6yeGbZtOb+?(nB2 +!cbD0ZWih!477Wa)+3)X+pXlFCU^Mf#9|rK_Wq)4^pT?t?T8r3F&DplxsO>MxiTY?S3W)&thVv_*@^Q +%03JPRql~-(4JjsEugZd!l`DMo*l-u@z!AbFy7XM#kyts0<96NsJ`%f2JiH0*Y4leeh=uJD|t$tllI +|AR?_Pwnx;W$jnqU>@3nYxVRTGT54kEc=%jXytjNyX5k?AO9)A3j#Yac^qxV}AvQQ@-Vqf5OWTP~6lh +gPcBE6jm65qr<`ZsiAXn70Ijm9@}4?^OhB +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 +F&GAYFcMH_g~8Gd*fzmwVlVg@V)MPQ0W!b$L +4a%GB%v=I$`GE;pLLmrgHnHWoD%HnmotZ`ydisD+09^DDnF)U0bFY +E(NZ~-bnyc-g41%snkrJJ%{3_2)uVeE^illt$Jdas+Hv;AGe7Suw$qQEgL987>e}8+f{I>DEvNFTI1~;TY9cBZ0R;j@QP9)~1q4DsxYwanP$0! +Crp;DXrk0JbnM0EbYR)-igW2Ga)*&h>P0`5xuV7fiB40WDPy)M`3KKYeyro!@d2!w)QJvhpAu*2Gm^muIhfu$ +S*annF^-!+_r7P) +K2{w&ZKsq9p>~$Jb5nVyGo}RxU8Nse8}c{mHI#w8x3wyy$W~bvPlOEuk+!yRY0l&)>a+vr?bKW{`v-F +>e(IOhp +mmIbNk@UL~j8^G@eB+Lt%y53$h0)`4sDwg^?nq35o79_AV~$y}~UW;%+kUYDe~peiBJ>5LkNZ-Q%ys) +}k9$5NA7>$%+4oetFu{gj{3ku6(^k(YkVF-bs>KKPc2&FtSQ)Mmd;71}N8Icgzqdnn;Tv&8eV6QHe~W}qFU=2wzv=l6NDT!Dkl%RbW6K +FZU7q=(IoN!t-K@_jFA$;%sS7CX|q+oLGhwdj7&F(aeLj+;1cJayLP;T=l$MxOrgNV{3Fl6BlgH#3EB +wl+(1N+AKTq`4?}Ea&n}wuwtfCLR2a!@wSuJY05AYCqz#E8yyMkAOo4_A;*=X{WCoX&x7w|Gg> +yJ5#{bd*f|xWwZMTacMVSP1d5c%sKzG3w7GFZ$H0AdOyDOaSUg?hmZMXuGyZX&$;Z8-i50lqkQ!)et| +wOCDR+`268(|;7Tu@j!-YnebG>-g~OZ{4Rxky7Y=jI-{q3Onxhp(lopZ +s0$gM};fb)hki1!PzW(g_j?CJ>A!h$ILB4IxX;6oou|hD?P_h0Gtx{E^HGGAqcuK;{K9E6J=Rvx>~BV +pj|i2$u?%N}U@LM6V^-K(Gfc)R&6iyJIOZG}=|_H5bCM21ke;y5C}J@2cY2{#9BYcvt5^lRwU{siJhd +KZ$fNeLItS-&y&k)p7I4A@a1eFAWoIMD<2s%B9;+Z_4yp2blWBh# +FsiDl*NL+a1W{JjOc9*XmqSa*=cSVFOmq<)7HM=l@Ph +gZ)=be*l@L8Zuo8nevYIUwnQwZT4)SUFwKaR7O}`?zWX+j-U_W=^EIt(o5qa68Jkz3+i$WrgHBn!b__dB=x%N@5Sk@SUQH6a>EAa#A)w+c;zDU-(g%VdKx)e>k;6L$#_4PRJK|^nY3 +g@jJe|C}!9rh8$#Hb!vm;8)pfYjsCczC0bw7A>tp=LO~F4UvLA6}&*-p&}1S3le5R0jM$cZdP`en38; +bjHofoc)A(Rlx7ol-=&YJb$-Gd7EhE#f7zzSFb=IkAc!wNl8=~QbBo(iSeIkwz5StB&BA##Z_xC>)TGx#*e=$sIJ5#WY4KJoyV1&7zRJ(L#+>2aI_^ +D%ps*CQGfF|bYAG;73Ru}EYg`(eckBTygHcmZ2_3&&CIIBrgENoA)URY$ht>*i2DIvYD=gvzes +?v1wKO*_^5LW^=Z3yN1FhXxK_yxNgE6mEy%#oMWQ6u@&d3Dpzn8_$JJJDd*UVh0Mwswmt>x7i@hN)`M +()0oEOCT@C9yY+VcM8}l7!L%cZOak9gcY{jt<%3`)+?}##wtvE|SnLb}b8Pgg{3V%SqTbamK3~DH&*! +mT$!`O;iMj6OfO!X9Emq){tyl8r94=1M6mKBTgSqBimel1{fw>m!MZ<>`{no6*img +AXKxVT#;1uWGQZpe_0nW>@5A_ +Ui3(>+2P-F56a0}C1x~VQL0^A}smz!0WRsn9&nv1LI(k{SlwC3__F1wfm+{S7yCsh~k0JjO6%R$wpe} +G$-=JJ8+GBCi+s=2(Xx>y3-W@;`^sV*S_ZnHI)hg6ra0Jl8N#mX+zBLn&tXw*;2RjGIMr(?BgOM2{MJ +keipZiLgmw>z0$bM-F&g&0H%1G$qnzo-F!+T~N}3pHVFrzB^YgmKOeU#;TpQf~>WxnIN;hp}tdix0Fr4{);eB&50wNN}=sZgj? +aYpLQjAjsL)njD)ANN}-vQLiF@yKAE}wvX+kk?mO8w&cjk{1T@fm$vhWOshrCL@Pz}JrPKOzPhv>Qy< +pV$#x9=(1(NMx(o4tNbzqWU9fziVf^O?_-B{QI8U8%zZ4IZ2F`JJt1(8W!XZ8rwVPkDf!IS?KZg&qE{ +}>U_vLf{Vrz847V1aY-s|s%Q~#`%SmoC>>e&Og=3hNIeSfTS8t+QC=c-Q<1XqK9ab51!nmgl +%H1Q3ZwhKRCoLC@_m|)iiy*J{nM+@DfG%QDf?C!PG%1>{VU2VHqQQw|3nXKV^Fc?7s%l;zOmUus?+wQ +?zaf|CdbR?d~BL;U|j<`<%u4!2bN}OTYeeyjUT9vjNt +2*xDaH0V^>)iek^Q}$_a44nw8ER>Tv!}Pzj>FPt!{ajoor +pHvvBDMCctl1zJFHTi*w-F>iw@2ec7!P_r;L@u4bzV*T3S7+>cuDAb6}Y`)2Lpk>xl{-Q{A4yKA1QU@ +^`HYxWXx#**&0*FUU9aUpJDGCfurZFiA<-0i=}mU(<`B+i(*k9-IGV)g9LsF@0)ahzbw0?5J&W(f!OD +=8}M4yJ^9nI7uohLxZedRrg@sYS +<=@v|U|-;c=<>TwTT7#rrmfXE_yP7}r0KKYCCbaM#1gQ_^w1ifk0>q-A@`VQ<&jp^L+_7}UKlJHk@B` +_PBE&dXeGnoCxdTdkB&}rD~`HAo!a7J_!${3H-aoJw5mC)3w#D))37LJYNKO;qrDJB*#)sqJ;xIqZ-j +O29N1nAX>lnnDunF#Z$v=T;)_^+z6JDSRk|?5iCL-YNOy%^Xi_8Mw>ThtI++%)gQ{4F_$9|)hKa6$PF +B}}&bAJw&3=A+^RE)8OR-6lk#R2C2>ObOk+SA-lw>#MpqZGQ9KcL66^0`nj?`Jh(|UVald;i7{9RdD! +*e^vqd(&TY^e72=k!eTFH^su%me$9n=Wdu`dK*I)W_bmD8$si>>Tb--wV;~57AsnuX$S_Goq+ijT%as +Drx>vBwK$#lK1;v^kG3LE)1jJfGDq=E{mE62NkVArsZ8}L{%K)u}d_u3|;7D89MK(Y%WChr}hdph))I +h-A&CycBwlXgOMEjb7Is3c9|9jz-@;QR|o;vH=0glmvwfa?rbXjs3y{3*srn%{2<&_%ptN!_Ff<#Y}( +x1gC2`m%stHi*tr!z%Yaaor7~qcm@KRb!nu@5VNW{;ROQ4Wb#9h7F=$KkkV6?Bn%r5Dk4o-ynLakPia#O1Td-DU +Um7YOXx;xRI8XHEFp?$*E511JaGkkJn2>1E%3%j8a};prHZL(3`M_TeNIBTU|`iSj&1M#x+0bjNm&uS +}U!ASk##!52flc2Uc|umj1X-*lkSM#US4FI?F>?y=A!T%*OU+3!SMY*i=&PY1)b%VF~Z@8ht)lslg7} +;7@nI4%T(x`+^=hAkye%$ +%9jBCTJdEEhXYgCNmVYbwcMtz6{Cj|ZSM%>q`c;t8S&I8n}3F&(Uwe$EJeyjYu^qT2b-`Gy-@wEiO{`) +egk2+O4&B)fOWXbyuy2aaS#zv8(nR7F)QFBZX~&S>0EA@B8Y$S}>Hjw%EYYJq8|EICxz4J@(aZt+lT< +EKJ*1yO;OX!h6|P-mVI(YuS2--Kp#)-d77d#%;=;bbN9yvy(mV${n`u`MX`!%(v%O6>R|~h0;`%ULE7 +56>u!OhquA*`9s|XyH(o;%bx;yV=d?sWqw+`U24XwXz{k-c$o!d9vq`mD@MGR{p5jI!mVTSuB2E)@~) +&?TjgDuVJiI8LnnxL)$W3~fOOlA9STWv_YY1bCG_@35Q89wqxCmx29kx8*(P)W_C}6frGqo+ +E4~`5EZPKJHX~tbq@ii;Z^dBMLqeO$DJawe7V7Gff43VcJXuJz&l>6?BF<)>LpSZ>@!FV23S?;zAU@X +w#mIoe9gZsZEm=`AeSUS_2`8 +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 +mo2jt(C(wj8|)L{*?`K(k|C{dxqn3jZ>5{n +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 +0St(0Xt>(#@iAmRkOW|9P?N<8e^ljN +o=Y&j`OlM=`=JvAd~fVp#ePMvYgNJ+IO%$8b7H(Td#e~H4bn%}a)^%3c!^cd|CwzKWTPVW8116w7&6yBOnL29%wYg +|mb0*}ZPR&YBici<->j{aeIo1g?sI|ySoMcSHH-zfap+X#fq;4Fri3jEVmo5M6(I&y2E&H%DEc-o9gNem_v_ +yZeOehquRHpWl|m>&L$@N&SxJi6l$C@gz>Wemd)NuAj~=k6b_ekvFdY{na+^gA|d7^)iP +k?=DumeMWAHM~Ei|w-%SF?K&dreExT>(|>lYQ)?&Va-;=L)OQM2o32P|x#GmFt}#hayrUDWDRE*Ny%~ +F8r1h%3GBL>sONt^>CuL&(I>X7;4hflhoKkXNsFeP)<(jln +gC~(V5jriF=)fas*mmg1qbY_kr7bXHf$LmWXBq@jb470 +Re_?Vc`QF?lI0mh9YwP-qLO$;ehaU#?y#+pt4;S|>Z_CcaJiN#RFghj>$MTc|nR@M2cQbXVOVb%wkpP +8CL>Z&;89F~-j#mn5pezvPi+I|+H_#R9>r_{*_=`q9}mP3D+$fShnN!Pfis=1g=(h06pN=IGCWT?HM# +L$_Old|BCXh5Q34R~MwXP5AtkfcerDN~ZNqbbWNgTxPnj}h+@S6$1mmg5pGm1>Uaj^8?mXAr6h>8TIY +Mmi`XF(xZDBRJDW@jq0nLSROR79t0HGn9=F4HS<~K`%d?`k3X$(3IVJ=+16&geeP>_=u@frI~ +6wjwc$FiWJy`f}@4F3wb&sGz#`clqZB`Y9iMhB)B58x~5WDDAv2iq$ee1i5@PI!BNCImIk7~#AOs=#> +t9ggo0JiNRhxbVrX@jQ4L3x;c>35>i8gU9rcrVS*^#Sld?G*GbXF(Qqqrd?UXwCe +hvT9YvqU7Ig2HGR*p4kDu#N3a=2z8n|N5O4d4(bK2ha`s&Ge^L*-~pD;^pgxcOruP$2kp6 +x8qH#au*l3FnuNL6B)v2w3KG?LzV08dO9;>N=yKnxi`5iR(mrkhW$~CGv@A;Eh@+&NJ^VnQV{!3RKUuCW*-g#G +5)1sLhZ_s~`W^N+?hh9AMVjFSxMdiiu^~XPVCEG?)gFN#1y~oWW{&?E)JFoSB^w>8iFALFot{M{KduT +%soUn*J1Um^z2tFWqhhPK2>jbL_o+VgHP(U!7Ad4WKAcY{2;68#01Y-$C6GRh45`+g95~LGMAc!OwNYIU-1%WH#| +JouHf|CTt2o4kMAt)huhhQDST7nk{o+4OEkVlYCa38^F&3_odK!WZBtq42_E__At5*#BqOz;80V+45w +c>Y~&skKqiKl<(@uEiDi5b00!DWdT#<@NU#F_XfcY#by;e{13PIj@oU|MvN_^=;0z9vAJ=!-KD*h>!Y +Xc6+q7G5*^9xt<#MQr<+j{d36Go<8J%blds?dF`adZIpw8GAdtX)%fZ21CHlzw+8UWP3P9nvv`aNqjeeYcT-s%B*_o{v`Sw#L_tKYjl?8JLl^!KIoj(cqM_op6l689L=?!8~#Kpyl)YMdAv)R-P&C8?zJn__1Pl=abep$Tx?z^I-q(prF`RC&5)vH3Q0`k~ +1z2GK5>d-!XAkR~ncF&k`h+hxMb5(hsRWoMHo(&J@aNq#Hqe& +6CGwYnJO6Kn~W>Xke^&Ne)T>568 +k@J;LtAB;S$Gx0_m&ol)jYqLzpCm8}O?-bom6mUBq|Be}2`X162nuA`ZM?9W^1GJXEDq{Pgbj!QK|PK +YQR1k&q1jcpQ6UUh{Km-xkwz9)A?x*(~zFA@Z>p?DD93<>}u2RS*1L`O%@(9bZ4degWkEW6(fZNx^w6 +f$%@LYV?81szZ4t?EjFIe~j5yS;e2>pZHt$Y^CJS%zs3osGs4V&m%dee&+ZYH&0ED7iy3CSyZ(z$vx? +k7f2$|-T*EHPI*GDsOkYH&7Uz`U_FpaAoGM1feV2b|&p!K1oIQKiA?H~bwpmBzcHL%od&lI_oMakQw%-vQVPm +*wd?$5u)Zz4C#1 ++B7;{>R@!v}^`J@z+ew1R~ym_Lis7NeZwoE+v$XP*@>yzqipvt|wF@49vC#Kw&qxi0(QgA +c^f9qYvWU!>SrA;pIuekk_t-77x&=p%9D$Pw|$C!dJp$B&Dzzy4aBJ9|tV{Z)!nr%th4l$Di<3+H|i- +(HrYqM|}vx^#(U1&?ztYA>RNXh1^aL5+4JlAFd<*qc%THp`pDAlX}tmm|e2IZZqzmx+z?E%AvwqSvRQ +1%>ZO;e9FmAPOHz;m1+Tx2UGY76#fAU|0IRqMBzU%gcnUkw77-JYzNYre5ly=6NgChD@3@E&F&Ghcb1SN9};rfvqCOgFXUT$g +gkP>5Z+AT`%(Bv3O|X$&!q56DEw*)|2Bo+O5t}?cuI5GR}}s%g|Bdg?@lq?O);cW3=1fRH59{6is2N+ +P|-|^Uwcb&VWbonr%7>XnG~1blH&Ix(h+X4dH7(@#yYs9klP^QI?>Hpx}^T3J<(`cK7ia9AAxOL{x-f%m^PGg0DgN-lF-fcWbCc +-hmV-e0*R~)bNOi(1`dph@f?=TW-18)6=tEBvQclD1IpZHZ?rNgAMo|92ylK5fK#{)xL%Y`rh>pj(

;QQ^}dPE8}{$Nf*=UV(gc+mLA@%IjhA{Ix5Mno|YoPy4O!aqKww*@FfP#kTB4sG +7NIeBn=kMGwY-qI_S5*SY3ZyP$4QE2D*9&B6AM8W9pjTprq~SW=%)L2S)`4kgN$| +j9-1iyqft(1rZ;^4WAKz2!AH`yZnL!!fSq3<%i-AAwdie?K_~>XG8qNn(&|jwLXi8nom@%&r+7;R+{n +xPm&^0^3UjVxphFDx?G+JtfkLgUr*8XxlyA=u|6_4X_!OzczNbvu`o4MJe3_RHp~wd>zQu|lj|xl*iNy_$7}x8Hu7^}+YvdyjR6PfK1F&yc>cj&y~cJ9mnM2M +@AtaOU(0ar*RWapue!QC?mye*E!A@#`<=SU33Xx8KAcfBYeqU6SH0dOz~Jp`Pu9jVpIiLr3Lu>11l?W +>G`;Fg0{9iDq(x=quH?6wSNmQ*y?jKwj(2qHb!($u&B#O3CQWW@*P(N_UX2@dyG?U2o4ei7%fr +L78-=<3rlw8Ww7TVvUX49G8Z~rt^Ss?;YUA3V%^kNk_Gko$US926x;wdd?1ksnhHi-e=2p(l>8)|6Mh +zSKQ2FZ6xvfh(`bt4=rFTl-r(KJ#oqT%r^1&5Vl>Qw)KHfe)9ekL+cJyHGutNuRhAP)2#6S$VL=cccxc>FP37oY~Q{;mE}h5(ubSRq*jD4mj}Poe582y({`uz*Q$J +d6+qO-9|NZxp+Ee-2XP;q!N}f1zLQ?-*;yckGsh#~=QIs;G_0-27fBal&X=(0|Aw&Fxnon5DbBj=y+5 +i{iYasy +;#X8ubkCi4-U;5d3JD46hIs!f{^!r1m!!)q>(r@JU*h4CAAa~jmXwq@_~O4;i}+_^4g&k`v|?UVA=vr_(c@#0Y`EA9RY{#&!bC1q7r)w6 +#Ef2!*p0Q_~(^FoKeQ%+D0ATM#>NIC47l);}8|3L%gLBIV{-bplMd@kk1Dk+nXNa?%PF*R{R_+Pqo39 +`J{&(E(T$wC2WpnSN77T^Lo0*-aj0ltIh$Ro%NH6@$eEG7ZcBTe^1|4)d>dKS4==lBj-{p~aSI9N9BjnT50_78#7DnQp@1z{_t&}5AN*M +(jzR=1u$;?2#JnvP@GwP%+Th;R1;{&x!Q;mC|KKv=47x(GYrz6$p1;8J2QkxFQJ>3o{42rj?-v}J|Sf!;S~0Tp*({ItvvTcokVqNXR4Dr5Do3$QR`NE=GBFN$BrEx@ +=t9%+WBkp1LYU(fu0vA4|vyU0RB|($&x1%2~>YhAR5LJ9-~jIH0b3SH0b3S +byDx$#P=Oi-VPdw|K@k8{O{pt4%US~)%Ps_RMwV2A3~Ya>CkBb4QLPQlP%zndUE5uAo=El0rFL%VGYr ++(yHQ*YccLCCmIwf!nv{=s%*-L& +Z(3q{q^#!=@?zN){Q^v3tj#P3>eS_d7%T!EAR$xz+I;WbwBER^lMOWqOC&PhG*;i{_cgMvdzOE~X9@5IUNC_Z@J4w +6-g=&(jyLMZXn#Q?aS`bz_^ +0wSwaF;A08r~-wxI7aLsFU>a`~uZU&t?b8C$lW_QKDf9(XfbUC?q+Wm&Es;ah()o&@tXFue<&S{<{1J +1O#*e4#02W!i5eRYSVE&TK@Q>N}eixT7I}VSZ>SjFW=Y7^Lj&hUaisaj7GyFBu7i`50XWxDh+s8$DsB +(l3>O6-2Uzt*FLS0=hXf#8#!`hL`Fu&KH!S-h%zvD?p&t9C|`e;CooZ_YWK0~dOqLzrbEX-c`nwo3)Mvn@J8E!x(d1w^ilK&@Sr>&ddViMu26qt)pSRB) +^&{KT6tbdW#P~8|KNiUOr-0K*75Jrqes8w!u}eDOs&V#Ej;6B8qgi;LwGPdp(Xd+agB +2mO2C3mVWCpqR|I_~0z<~pcqN1Y +aL4HWqmr=jJ@5YTAU#BuG>6@H6bEc#+A@P3q-FLH&@ZpCavOEBH;EFubgp@&e@nWtz +(~<%6+2zf!9_AK3gn^uT9sM0ouD{U2Mtd^wMUAZ@KI%e=fi+`}n5b?PK>%jEp|^MAYNo +_l0^dOGu+`jsq8paJCqbOJZfQJWTwL7*Lm+@p;~S;2S&`jK#hj)c4eEpX7IZ53r@G +`3Z*T8@8#Zis7=4JpgFj>w09nF#Gu(g|#++?78<*eU;9zO7SY*$hJvkrn9bszIQI~A#WkWY1N2m`VSE +!GXcl!7S;e_e78=b#k{E6tp_@W}plhQXpbVf)AYRnLg!@&Br=V4$Nfg}N4iG+N9QX5{YBtIc`He`z^Y;{ +50u}Mj`9W*xFEk#W=T$2mzX+rD%Y)4*13H{T?6^nv- +4lY-GRTZ{}aCpK!aW{)QrqI^bF{aP>BX4va0`oeMd&m-ajxzKV7W4mgzSqFtDF3JJeiy)SjWJb``>{Ri)umjghyVD8$ri|bwR0Ob|(4*XFLNFG=JgSa#P#_><8CmiEHpaE?s^cU2BkO +QU`9-sK=;J!SfnK^FNI{;}6-ro}AYw@5Z_a-}P||@EJ5h)=7@8l8&HIU +ZGuW^AF>W2gjP+{BH)Nfpri6$Pqv?j~bV4GiFo?cX>5%#*C9f1Xidf+5TbEMKhf=Q~X1wQ?2+7>E>x> +$v=UAu4YQrbka;0&2-mHlV-Np%s|b|)l8|HPB3fk+cAs3@nC(Ay9RFJI=Ujp`v~?DT&&e!#5-nGYL5r +j_aLoSr2G0(n;(&slr)m`{Sd12u?!o_&Y*L*6b3m(++SBpIsLShVV|jUY#0m1oWh+uq?~Y2%FljfT&{ +-$Xl>`_=5`nL?WR$gu0(xCI_Gax-#VJsB$d;!{6?k +DG^JoJl{fjc?G|{LCp`ApW3j*ix)b^jXdh9pqb)*R4P6#`3ckUPXS`B9Ux+y#%y(i;8}mCDlgAv}pQVpJ +0QEsLsK1b=_wUiqMY_$?gF0^-b6TDE)z=Rgc1wCo*Qdihk^Wu4h&q-{=C0@Dvy +C-JQ!p0disESe^BQ=G2h1WcubvZ!yFIf5pz_S>%=_axcwY-kDfl-aq919%$YMM%{bq!>$5PSTfaFsn8 +y+^o{MorWBQnT#r$zxEqSzPb2OOi!yFUj(PxWVKj`U0|1r*$)}DU{E_l{y^AoG4tK+d3&ix?g{ZbPL$ +YX3Rc?{I%O#L)@tTj)^=~F)`Vfpgqu|_(1Duy51p*2s3_stXP=ElSww +#y`Z?$ZF5m&ok5{GgydmbRFs}NVHn#n|Hot%}f%y^473L*{ICy}^SVv>-)+qldTMs<&KnB(SY5M#C`U +U9QfhVYYz>5pY7joaD(L7Ip@#%Hi`1)!?nZP`gU7IJ%)o{SW@<{1UAo%K1&GN7J&rlAb^Bd<`jB|J3) +1S>59o_yfo@2pWT>;@RSDR}zJlE8JNZ)R^Cp`DubFr8kf<6vB^nSIzZV-5Y7pRZ$4G-pT-+Z9DOw=Wh +23f1K{)dh|d-m*%1q&8T1s@)M_+hU1Q17DcL;Vj~06!p$NZUB)^z-RYe)(>G5U&N$Feao{COmhjkx-uD5|VS@kq+D7oBcAJa`agx7}Nw%)5|Mlq6V+@sh?gyf+$Gi;Ym +PpT%NK0gG1kQ=?ez`Dfs>(}FG&6YQiHm8p?QUB!U=cge)jL +Df!49hqsf%YgnJDckUtX0*=6_H=yHRwj2e +Dvtim;PefoIcW_x`yljy716-;J4m-ORiY4g2#$cH)705pHuvsX>2OQ2WR!BO_~c}d^^8N(b0 +#-BEC-mI?^{JUv8=)aLMP}DQ1`;gD;)~$p5{Y1Pd66*NL-+i#x#OrSY%GaOOZ}mP^?ehXpI@Q>F3;44 +=yT-k{j&MSS+UKwQg?+o`dhw+8uzh{sNFIZqfByLmFTVKVMXIBIUbAM+BQL%5QjL1&_19lNM{#7n`s% +CfPJUchty&fS!V52KedCQcI6w6^4EaoD`ZHsA%%_!>mSUXscZ%aA$=?N(L-dUyuWwQxB<4$X9aJFc*U +y~hs5a~2;TJLu9ZuJ0^fHCIEWS+bGeJN7nADm+yKCsj0&OtTLRr)ML`GdO;U~2Zy!qE_n&ICFHlc1pI +RdWw{*J>Rtd`3%Ro!s1)^|ex5&c*670_4lrM}W~!V7b)=#v9?$UoA3Wo|g@IOnMk_RIw}4)n#*_d?$f +{XXp3SVEfcEZVPZkkUspS#vT^J(T&*W87N3)H< +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 +t>uVli9Hg(y}jszt4+7i%Gk8UAM78Bj^c`g(jv +g3_u_gFqjA^OaUB90Etq-Vm_cz0eDmaA~k?X9iY+xxU2_c8X>}O6Wc|T*eUi1CR1dFoG43VHH<^OY>; +c^dbvp&I#M&p&j~tNr|49jrbp=veV3l7^C4pw>k^3hrH~uvLtd=amwqR`TrQW(<#M@PE|>pT`43P_0| +XQR000O8%K%whEkq02^(_Ga0FnX#9{>OVaA|NaUv_0~WN&gWWNCABY-wUIcQ!OFVRCIQWq4)my$gJl) +tNtj-gjn_nMnfV%AHAqw39)sKmtjt&70sQ0jo=r+OFOH2%y^upfy}tqSYk0?GC2xGLV)QcQ>H5n@n{V +YiOO`2+-XP(u;uF%eFNEZ4+V@1SEro`G3FXypwq|nW)=sfB(<_^WS_J-rG6PdCv1Z=eeBgNAB1mY(fY +-e$l89&j|Hri1+ZP2{Fm@y-A|m_0xi9v|D~!Q0H&hlz;EWPk(CT>bvvTuD<7? +L9ZMFG#fBMe5uF1%7UuA+geanCB`(eAioo|E4I?$Tz&#g-GFlB7PNTbwy11xxO`)DRvqEJmyyPzF!xA#hVsgOsm87UR?~NSrYW=!blNf +f1WPt-hnk!rs|?pv%J`=iD7->^w(^@YwKoQH+)`G2(j+=v1#&!sJ~|8ovSym7UIRAf+=?5`mi=8oq>P +XsAQsQ9$%o~bX;fYiRpT-xmP8Wb-dS1=N*^MxMt&~jcai)X#(1a+i@*UmhP?%pGHE`h_n(;;x{f`<;0 +Zu|JUCXO`M&gi{KR9helet3OTa!n+`0@fR!aeC_wTE`CDmy0ljBimbPFy|u~SHFCeBYh;-g-1JvQ*Orf0bbYqIv +a89ztn2=JZ|GX>H6n&62R=6K3}2hjjx`H?=!jd?9nnO0foO@W$`|KQ +$50`f;2JSyNq&Abqdxy&#v0*Vk}q&CcrTU|3Zo3yGAq2qzseSI&gKwxysov2x`Oy7uTRTf9`5m|1iC?AA&lN_ab!+r%m!Rq9k7X+LL$Y=uiIbEZdW7@s0V{TtR+u?GlzjxNC%WN&a5k@8x~|lKgvde=qN+@je~*>HpKZ^A +EVS6`buDCQWU)-v*jK3b+MR#PPNG<>%J}etyQIfM4LmJN)tm-idrw&fBX>*Szg1ov0kr^|VP}(z)R5B +g3Sx%|4dCJ)m!a&`_Rn3$Iu4dUp44!P#BIYw=v4FK*%WPFzW^M?tU2pf&J6P8yTepyhGWo%E08C5=gI +(wwx9(fU!)n&qrD%Ow0qLGywZ)Dge@y?D2m@A8)v7T_QKxHFO7bCG#V|zx8sL&@ +sHwb^|y*y1-FXMd+*WltuZ&xJfbX3Aj<_b=id`F`4FJ7%qe{#F#_J#_4GVQXXFWvJuax0mg**5z; +{S`2-1ZZ&W!aGLTBdFi)l#~!z9$E<1B3`dJ$E_3z?(M{YdFGpp4I+53kzr-c=AzA0bh)N?O(K?p10cn +4Wy2Ci1u<{K2DczQ)_(R?ps(x>m__A8^CEw)BwTdt4qULev4dTgiAG +a%-kMaoheKf}?t&B!Tc{B(-Cr`>qPjkDRsVNS-4Fwawa$_7HB%T|re6ZlVjeHO`#RntChZ}ZTaVITD` +4H1HCSH%jwpi1ivho2qKN=a!hfy8?5BYsqeQz0#^Wb+0Jcuq6$EEFt%|5qw;jwe6B4Xtaznx7rZTi}4 +k9qXWAvmpd$S2z#+en{nN(dfQ4%1UtjNscFBhlS#qlxWvr5kWIePHP9;vIVkYnka!O!?X7oeNWpo(2MuEs+d85x-{+QC{bK7wAz`Nd7LL48kIgeEe=P{!(a7*>uH|-*?5 +`VIc0<(-9V`t@C(QeXr{>5k=%cfmCbV2bVS$V4<*BhpZx@B|36u*B>=~}1rSiSJX{Uh(8PVZHRIz5_g +NSh_}<9z8^GeB +ykygYzZ@-dsx0#~%07j1`{8%Kj575kWnRiQA}Xf)_s;iHuY>PWuiZ1=OTEUzcWPpX&}_k@LhSdJ84=b +?Xyq@KfZm;7u9UvDQx^xGMr_HnT7{YRBk-G%ZUEmqzpO_Fgg7AIf6|E1XXZDw^%@uKvJ3eN57~o`&$i +as@ougrrqM5_E?~MuJZTrE2-Rnki0=TqzZAYZ67b#8xpOSOOsnlP(^~P}Ig0O&WcUsuU!nG=;X88w54 +uiG*1BGvszYXM66gPfFA}xoABW#x^72FZ!PCIG5ASaSKl}L|*IwY_{HPJhM|ms*>4S%)5A)+r)!#85? +o$%(6cg^0QMjKr;eI|T+$q6tS>T?p{o!cegjMF=1gvSAcy4O;K-n3{*5NF1JX=uCruzD9?$AA-5bYO` +t{rsVCf|cT+1}tR#7qyTh+wDgKIYQ$+9->Knd0~^eb=6I@cl?@Df^@S8ArzAkxgFzaFo}2fg>0N{~<$ +X3tEe0+v|gWHx*?D(?vVsOFmaPf_+mvW_*WnUz&{HYBc=b%na)WF8_nZF4Xhbx=ayXtckX(=! +b6Gd*UACb#2>Qvt4(sU^%2I%Pp4W<@kup&&@J*q*rC;hOQkgGdJ{glqu_W$PuJmH|ydY_2vV3?|+}dV +_lXJW?JGBkhtWUxMa6ogw7fGmm7*$7R&Z(&a_RH-eauq{v`FyMA;Wn-o7;{LD2PF-|mhXYf#n&ylXv? +609`SJqG!y7oy}6?&qMs4WK3Avz`U0AItk%68Mo>qMfiu>jL=8SrN6E}>Rhb|g>kzZtX>`6uorI%FO_Bcgj3;pvPvC`u}K +G<_FZNT=*2=qud?{zIJSOxjEWwq24XwZpGSy_@kE+bMsMTChP^$FYYs9l-t8K#b68SHD7=^HB|HsDP< +vMt8yCBJQv-$-M&(-VD1M3CQLW6p|_n<7#-H&jIMEsO7~M9a=-v(`1xEV?A^D^i0J&RrD|>g$4islim +hO2H5GlzQ8y%B&eJ^X>|1A7bBFc0XmwESoYX)2*(Mwu1e`)RX5^D~89`Q_)hTl{}aBqeT0QF9h0L{x;iV5jw=oT2LPziHgD$?D#< +rn!?fF^@pOWZ%(&%@9aT;xrZG(9I8qY7W?X%ws&oAQnzwmr8MLfl_C_@MJoS|=I)n0B%7j+$Y&vzYq? +$F=iU0)h$px!m(-JMx=myI-&9Qj;CW8>1q%A6|GR704exZx^GDx;@372y+U6m;suksp~_aY +XUFO2Z!2aH{TNjYtn2%B<`*MSO^HqBVO;>s{?2Vlym9gky&qjxcs$l0Bw?&nGDTX&bP@GU-oAy>*UQP +P&b|e52zmrhjwaUt`VkOdMflrLvZ-BrAGNC&fpHf@@FZXN*J-cE=SIym~L&zQo2>yd}r_>quDI@H0Ox@UOpSZ1EOw!gaSlZfo)BpJQE2jTZ;R@D|urE9()Dw +Gm$QAs=i0U8ze(c?9ckp)N3>+?=Ozk>a#mnO4(W=IOxyn<$ki{5rc%hE) +UgG*Dqe6Hkpk0psJf*GJ+i)ep&PH5u+R>BQY^S#k7vL(ZCaeZcd7UE6-MFprw7wU;{JIbWJl6|jNf9h +Gk;wXp-+AZdHc6z1TUC2hrHSZf8qtCsn0T+_R +zMew%N^lP+38NqEDeYTv?gVW(dN*S0$pRkcJE&c4@ydB;B6}0`my3y1F*=JcUlm)-AIA7XU_Q#s?zj| +_z`F@T(PrDHtTw`qQHS_e@oW8eQ@QI?)5U}Z%$fiwzNqLp+Md +CU|>ZF74F(tle%llDw0C_#zMPn;y!?O5|&q`i0W&H3>q>I69$M1k!#UWZjR`8TblQPf*zEW}E!wQ~A2 +JcW-kmc?Kym||bdJ^zvK5KoSF~7&^dr}t>)@^KmK@xojdmgpThQ1SVnVGI+( +SD|g6akq_rgg8LF^A@HC-QZoG6EG5R3!1p~nz&JS<{&1MWzCbmevLIwCcRysGfuKRP9^B>%IzsFFA^Ldr$? +YG9}@g?Nxhs|T$O#M8h^z(CC>(tS9!Fmh<#xP% +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 +l+O2iWj$ +deg|#2uLtR4?`8i{ig=1`{3~{GK&I1Dg0VD+C3i9%`)t`yH&KQ1U%aJ}$uAEzt9r|9j345RNNx%T1K7I;1K4Qt6gM9R3DaTBEtIU(*`=jYkCyuk9M;zK_$zQ0--gygPF#l(=L_5dv2(JqEwK+ +>j8zkp20Pfq!`v<`J)RpLW{dq>1ai_;IVlVJ!Q+Au?Jl0^sDtCyD@bl|d*_9v7^i1o!Xq1J7b4kA~Rn83n(u^~6M!)y>lsyc5S +L;UC>r%%}Zu=DI+-I8{%B3%6!gsp#TKFs_%PlnM0j*-+5o|0ug*>rx5U;nhADZ}ZeBt$xij#d>YTNjE +2g&@HINv#sFJjX}b3orqpzVO1%Ov)H2(+02+PFX)|NZw3yFnYqpz{mdkD$GssK#$AXyi#1jZ5Iukj8! +)yXS<+GZ*|c($Pm6g5G}6;iHBT)CR&$R`K2G&LEaUVXIWM+8g=3D>e45DRI*x +YIA{F1!1sf?^V|mdLN +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 +$D;LTI$Hal-0fTc3gwe! +#Qa)T?1z}Py3n6v>jYv9n7d0Iah)Bi(QnXgB8M~`G3f78^P7ic$aw$QN6A?;k5rJUzfIa%c>2TbiQL0SFKubf{p6Y=aX^yW9By +R>J%;WjQuPik8SrgqGTHjA=>wW4g0YX=w)*NQIK=itD{^a$s+4o2-=(e)x6J(4mUU6wi=wP{V!U3jk5 +%c8d-O|2ezbFPS-Kkev>K5Y;Gr>^Ebeg%3Qe(Dn7abS~OlyI&K`vf>&^=WN*X~*HkaxKd&;QBF}=*~e +rwF!2X^Mq+@{J_ +nsPb7;mbqqfHC>G;gr=HX1Ip-<;y_EOyeE7H5-kA@-m=@>5JtiNFBzy>Ke=a_N{;BWGiwpmAUNnv4#e +Lqb9v**58lXv4r*X;_Ob3rVY`TpdYgpv=3;by1Hh%9FMJxEFNw?$+)ChpK@+H+ +p}I7K^!`ScXG^ivN_)HHTX6hbK9bDlJntOkpD-h<5yDj$Sz%vEH>wghG)g*X1<4Y|6+Iyp0`ef=YfMYwBLd`7m~Keqc;5Tj3bGfBdIeP%ywh4+xiOq(sTn_m%)U!vX2%} +8_27Mb($&Uuv)Nz+7`3)do)8^Lix9`2+d +%dV7zFii4eZY4G-V;|p?!B65BK|Iy!ut>G@6lXx&OLEAzXe?;?(atD43o|oNIyy9oe{bXF|-Bu%RLs{ +Z!^a{<~x7Br{VLHAK@GbFYs~$|66eFFzFr0oh0$U+N5`S0=)--ch~=b-o!D(H6C{>-oo}Sc!RDIZ(KV +}y2tP)-ET4J9!NrW>aEUqpnJ0ZGWwrfV@~_B6nJyb6SncY(U!P|L+uHX7uw_$?VL-)xdrr5*bmpN=d2 +&PqUN@}3i6#IBCZ>ZNP`>x)?ChGHzKPmMQ|nVIp*kv?dcTGrB2PW$j4X!HfY@%xjrD2IIi#Iy +wnHiPxh4g5ZB$J^_0=)9)zz)f3RFjm;Rq~R!`}m>HnqKVVB`I`pvX|oC!TX8#0iqtt{6v)^Sdpe|AqP +(>6ekeMqz@xNy1?xH(0T&uLQvdpc3ayB+L@7@tm_G{NVhdo&n0UhZp~>;x_+IcuoBc@wzIXn`@EseE`~k6 +pw%3sZqT@9vM%s|vCGvej?bU|z{!WRM9|-`?itp>$$2Xo&NTluMz~0Grup!FMZ@N2)&q8P0d(eD(Yof +@qS23QLztkHpeiG)`N5PT|AVPT&AL|BT%( +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 +b6ly*?W5%?M_mKXGs&k7;c +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 +R@Zh=tCCLOmVq2t~^Mt3LDaW~Snr%Y{oB?%pO +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 +Q-jA>Y5hacvskzu$cS{*@nI +{AK~`F`Qb>*f2!jj(lizu0`gc;!<0zNGPV3g4HQ?@LxvR+}r!8hP$>^SUzizOroPeEI%EjcXlz{~`1J +hgNd_MDw=m8XvQhKG&J_xo)LL`bXO&4UfQ|ta9<*xqchlE#CWe=L(LEyWUo59%C#%qS6qC6Yn`^#Chc +(nO4mSrLN%oOZ}l5p0`nbTJcDx2fv1x-qZ=4bKy@>a|9c{psl10q3&of^@d!xzfG)^dS)AR)NjQ~wgs +*OqMm#aGBnGSH|`+=U%Sce5<#vl^qc$6sIzlhYM6)Vt6btZAZjledrR$rqs~^Jf09eEzR|#^jUvCS~4!-zklAOq89ACb4su3iG6$qwJPy(|j?#c +egx?PVJe!9na_G9#53hY-#5n5=u^ILQa2a+PSY!VCS}*HX<<2&T-B0G~bs;;&$$C5w~+&Vdth=?A+HT +uyf<#Pi*Isq?LB=*+IbF3hR}qH!+ +gsoerz-KhMRy_(u<&v{l~$-Zf)B8+Y!Id#? +JjH4*-GRIX9+4Or7XWu|M9XK{yTJw>)F^#_&CzEyCtn0Uu&3xs +HhQskxr#51h+v&Ih>~aG$mhFYOiab21CfvkRw=+_VdE@BUIPH8?%j*g2EyobLbZaM9eEvak1y&NCQ6k +JIwJpPggALEe69DW}IQJ4Mc&&5NBO*Ur>WC$}V!;nDZjFJb +AW?^x@5Nsx{fCBhQ!Se7;;Qw~cu?_lWuY<~hrwXDru>AjeoZuZZ)FNoUT};rNx4^9;v4u0sddgN6slM$_8E=R(C6j57_y$E8_mCJ^rf{p*>n_W6Xh@eX<90dzva`=N!?%y)Wk|(45HwnLDO#7tHXkcTuK&AsX_e-Y;}oQCl`Wp9Ue8(aPUm9(sr*hK<#)P;->@<7#_trx?-;M +i_ibt9x6wp?_rae)oNncJ6Zv-I7=FjgA-@AAzpLW>ZYp~Repe>&yWXMr?R6-Ar%QgPkKs4Z=HvN(ESK +|vyHM`H`$ZGWVxB?p&xbtKgGvSlZ|f5%S)9PLyS_E)&Q^fhiO0k7SwY2{Mr$mx-oLZY +2|Q-?Yj^`a8*l%;VS99GUzkPwhL&#=G@Ta}Cz8Jonxfx@@z{^YiNEcvwr#TA|ipQFao~qn#9= +-lGGYcU62h=YS$j7xJYc58#yC1l(flq}Z>^{h9ro*Q%w6!``>Y#Z_JV?{f~1c|a0icx0j(NE(HS(VGMasFg$F1A?tLfL3eo4Kd +d`fbFlCs6kDDq_&fwZN{XflG~C;A24dGm1w5g2DDltY7J=Az5PA(m@f+5&Qmgdipf9J8Foe5F1 +h1&T6Ycc!ZxnKD(r4kC6>QRFXKVI4BkefML(5wf@q1eR>&>yoR44BzD}xeB;mfhu{?La+YUMEr>3AS^ +Q$6`a^LZE7I>L{!~gM4D%Y?Jz7=`{{eB_17vgTv`44(tqW9H2J8@g)bQVD0(Qm9vl2Ux9l@u@5Dc0zA +nqwtHVvqfMBOft85;rWfcpc&6kYaZA +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 +^M2|0pB&5a1�jyLH@$t!Jq2NPpE(e)BB+GIjc3o&4qu;sZ1$yB?FrFUjP=xeD&?#_#)B*nQt--1i;%BzWI<|FkIgeJuRG@97g4zV9>ko`HC&qnO4wld-^T-Tn~iUpp +4WRuFW(aQdHp7M?y*?lEwF__>9db-rU3cDQbu1J9Z{_F;V)3t~{;{dcVe`-SuOZROdC(BUl{9|rtOku +LQZIQ5{%#TjfXbRyV&WIof#W!vnZssYkRcdrumpTJ(M&*VH`Ei8$fXp27&>y*-g*B(n3alTOhY%|GDF +|6)U?w6?4mT`egj7M4(^v~(Er78f4IZ5Sv~1|$1nyzx2R_@Ca?|A<0Ej +~lto-G;5gMhj*b68^|!#Q2WG{L6G7Sjx9lT53&+W0#X?aF}Ktqgi3 +HI4g8yvq>*L_Btv>z{0KVC*ZbU&4^zc2im-!SxuFu6za@;#gOam0FnjH2)3Pn(XF`poT1eDtgayzbXi +1QyGLIHJ+Y8~gn7XrV3v~&JI4r*_<-ndsxZvlHTGISk);U%l< +b4i!m4N`5Be9BSG9dti6PE(G=F%Gn1u|99!5U&EG1bPD|95V!pBfA8+{J(;$hQ=Ho)emM`q>ri& +;vkV@5^(#Vl#Gp|P)?o-fb2@v|9m#4D*E4^n!ZneL-^jyKfL3Xq^|8`8)+wWGX`l~hli#AX!rw{Krn&UqHRq*P_=e5xW=S>lz5GMr<5eQ1S%Fhn +GL0>RO`!Z`mV!QHox8RlHi0|GwER1i(M5-eo}kq<()W10SmKMdacuw58I9$4Q(N5d-JTBL?Lm#0<`@Nz9wvXEP9e}dbE~Ri*uX(v`;)0%j4 +qKmDJ9ts7-#n)lB1oazOjL&CG*2V3sm^O^T@(7<$ef?pA!eC|~>YI8xus@&~&IDHq}Ubt$FDgE5~@7JY7l1{|0Igc*SJAO +5ABpe&-(z_x*$t>vUUK(g>|F3)NR8sbkBfn30oQzm#a7QoKv%f43ETc4Hh%!g@PR>+NCU$2cSS@OH$d +V$Q?#em%W+>}GW%>20kTo8focTH9sBIJNecNY-ZHr7$U_d565QbxwM49lR&6+>kBPs4y&@qQ(! +pwMyhee;jZ!?co^}8%xg>%=& +rrf=@%u4gU+$1GfAKh)9;j&Qr9LCeP$AqMxg7h*^kF>5Stk7*vus#)QDsv@w6`G_(t1Fom7Fk7na1-k +)baV^*K%DzYG0bzxtCPoQ!TQ)jyd)Yn=>uw@u|36@ywb1-{=Pz +1|muQkfeCB?V%Swng4k@h`n1f+s-|cKJp*g<1dSO8Z@hIaR+HdfF@J!Gbyy-H9WANk|^oKlwF;In1ZF +vjh_D#8~DG$E~k};oBBIZ*{FWzHL4d`*<{{D*AvIabwA@*-}GyJyShykVm^4lWv+w}Qp^U@mkyh(W>Z +*Bpuc*s24B<6|FEsy5=6;l~7<1NxH54^q8ZC}mrE~B@t>ZROfQGSZ|c`AGTI(3V|ubcmL;j!fLS0b>c +Cffh%_YJVuC;oMc$FPXyHXGnyxC1;)vO>{X)**bQQl0Pd^&ju7NZ0w;${-(uuLZ^oavH{TA+6_w#Jkd +I%zI>WZ?`Pg(g|@VmP@>@@FKD2a$CNlBsTv`J8pj9HSY6luH6LN)-*wnhC_~m4;QI{FHzr&x`bbc&HD +|~Ejcfw_m_jkLQKnG?{&{A*1C`AG4E~XPElcz)T|pM3yw3zQc!0_9O!l-3m1~!@{ +HpmR)G1pGKTGUQyGwF=G8kYzDj-jU&K#_q)g8f<|)mW)z^*!Uu9UwK@MU+C-kB||M!XS(t4gtY5kN3d +YVjmOdkh*s}4@GR)6?sasF^>xfFIb<>vStlJ{#@L(WRuKQDOooyCs_;j586w@XRRl>Y?Jx-qKq<$CF +ANu;O>W{Ap0X`uYK(UlCuoRcc!2T>8Y&XK#$SPiwbH%WzMPeU@~MO3bkvl#E4B()xDm@-XZy-PG?DI& +EMF`8vt1W|9?w8HVSLx{T=_Th%|TWIIW}O|Ft03*2K3{SwjT18Uo0nx{Bt_z#-X!0q=>yS6`p()dYU( +Aa~Yr6sl5_kLHZyBo4+47ID?eh=EX*G6rPr|%4@4my>8F6@93oTo?*hkkV!*lRkEgDud2lIZ>ToYrzB +rQN$#s>8kN-k(Ty!221`t3=5gFY+FxwFG^1JMj%*nt@L^h)*1%wEVo3@-0mx9x^VRI8i#Llg0bqqd-Y1K-&XsVy;B^BascFU}#BQ~lO2*w4*lJnpe4(q^Sy$8h8K%^zMHut@ +4}izLg4fxjDeFTJ+d*Q3V|%MF=3z3+$^U%1ag{4nV7%dv*fYn88m5R4_Jgv1hyc29Luk2PY%KfyXgyu +Ilmbv>=uH5-0idR@Q=MP0^OPT)PU2eHTb*~sqDm~rjY9$+O1e?x`G4dCY>Y<>CtcD5B~DPx}m>qA}KX +2HakT`11iMEjGwr{b=Gaic?a&BMHE-l5W +$ANT0XPR@$7~_c;i^jQ(>1tLnq_yE5rrwB)H$eY^8#1txdAvls0i1&n&sooXxY%aXzI2cEBDLRKU%Q6 +pNj{GkwUOvsU0ZLF9-v6>r*QpcFPom +v3==Q|Bw}gz7^POOqf!!ZspkJ2F3^0@(WF|6`>J+-1TxCYl}1FtAPda~AeIGCmroCC#;Tnny;wFx +ZdWepqX{W0vZJ?anukX)Pui)2d|VL%fo9iSMa(z{G)#(cC1reX@I1+^PNvzASpZj#$S%O);X*#fNn}H +(C6@=CFtnjJtjwSK_enEyM3chxOR3G`VvmJwB^VeJn?h&ss7kVH?(L2akzj_Lv6M!qRDIpV{It%Ure& +wsA%{O=dwhHPzwlG}KlHv>pGSWvX!T^M>{1u35~7*ljgD-X~jzcx@yfdsK;^p#~n&&!ZakZwHe`?ht3 +{+y(*v2U-NLie~?6#B78-o=bDawNu3za4zr7umNz*8ih3HEy=v)BKV`Vkq+6KAmSr+X%rZB2bh-I7P`EQ#=`dy +eFucRv=2L{hu{0 +&E}P$0Y|bNhidEA^v`PYB;w2aS8ASci3|@L0orJ+yAM2Du{@`xEI?B?{}TAbsFuytu15z6AX?c~9QJ3bis;m~RIbC-Fuq8}dvrmXZ +lEV7Bs@o7`r_8q;2HuyM~-gT*g +BocOrXzGv=`Mptd350mSU2oH$OsUOs7v9@SaJIKrE+09xvVIE%{Ju0X?46W9Vd3`%pi=|1!najF=q25 +I(Kgy#qAvf2DRICQ%7PeR4#7axaaGr&LMr_0zgIOnuCv`Vo_5&vYIaDGzeX{k6HHTW3*wsN8fZy}4;j +t4vdZ@p|TehBl>m+vT(%CN!lzxnWaly72Go?E0QMdMTwlO?tRS?-08XynohbhVAm?ezMVYsw-bN?xUl +}j}sWp=yRGkpz9j2F$wQ~8jtJaS8}}?$!w$>RvNlwG=0=B+nO`@xkQE+F@XMbO!z5~OxP)Ogy|&vWbm +_f7twDZj^#;;tyjdjPxEf4{CCjvOnP3uQ|-V#gA^-bP?Li{2XGfm66>|md^598A8VsEZbIx3;<3=HVc+F7albLht$q8BfySv`v={Nd`2GJe5qJI-tjz>lbJZ-?V +NOVE#=C0b123Xpk`IW_1Ry(@v#9Pk5zqV6N%Y)zdZEj|5Ei#OfOSmcanZ{p3%+dKZ`gm~T;tj4>{gDC +LUYsfd$x?@i|!V`X{dufg%4gCG1rql1^qrHQD>)^{0KMOlL#%;O-u|m(UGsa*b#ofyHf+k_Nc4&j_G49YuiGDao#o +1mYedg=fW&cTa_gtcO1$Y=^dx1+-mK;h)|K-fxEWf08qNqyKs6|KX7SN2Uwye +@c}8E7bpmif1bPg66_*ht&)fiyQuw49K!7&883L)d6&thHLyeEb4m~$cR;r?C4g)VLr +p6Zoou8X}?&~K3Fhc(V)x184UUYn(Mn29&fCE94RmCrTUS14IY9yKw&d4-hTi#2y=y70N?cUB?g4}Ge +azrw8BaEP+~D;JA2G^PWeiuFiq#Bah*V=zq0tpIaTGPj<VTR#`I!-U_M;m&Es)>Y9;!+XfCxaW}|J%QXq%k +x4pzhEmBHvTN>%u)vF4K*2`RJtN`P<@tZLo7tIx`WbU<4T32;7;@vI-7CwAOBJD8w`nC#LL*ncEqWw6 +Rsfts5*|fe8!>h}}$Ai|qMezA00#}7uSgwiN{gUiX<(oMESWMk6ns-*>fBxIm!jWC9aOigCfsfA-O6Q +DK3&H1+4)+kvrP+EuOKmmf%buqe_|I#3cT)X0qyAu5f=8i#z(*@fmz%f5u&sCDJw0EMTpajtSBytfm@ +kI@!v03OLj3 +$jT*3SFm)l1y4JE~HH)*GzfH1N +=?dWYT(qEMg^2Csij{e~?2vRK&5Q-rl9GgUms38}J%!sPB{WaDGX{19Nss9DKXp#aqjB~;+C@Ch8fk} +b@VSr}ZBylr{EJuxKbIxGSE1vd%z>|53gQ_ur|CMJ`=~yWscQ{eN%$hL>l*udPYQYeIPK{tiGLxFd>z +em%G3D=tp#Vgdu8|**qo2)dSY7~n~%86j|>O(R_JY5BZof@>OP^o1Q^s0d??yvxh^`7Bl_myJ)`#<;q +Ms2-`=2dd5k;QucZk5hScj=U?@fBg~v*LPFmBzPwb}sHZ=Z8yKV!I_$QI}*L5U6-Eu~Q&6lwCr?N^VI +q*i9z1`lh^Ye|~B|f80*ihkK#JyC+irsR(8n~F_EHsuMpf=+_YK#xM|}y!l7pnc^`$x`|Kn>>rQsz+zS&Mu6^$}#Ht_6csMyIC5%)bo@k?D&my@^O7?hTw +1e_VROeZc}!jj?raH<}vX;O>4^H7|GVS#=e`^s{QTjtlP}h_w6Z?Y_+OI$4O4ragvEIw#lYi)vWWyZm +~Z!Uc)ND7aL8aE9+_a`Dq;UH4yJ^u+#UIte*BCUjy;*hBV<%(?)Iij@ZY7JXYcN_}pfBdo0Vnm+ud$< +NL!Os4sqn>}(wc%=_=ZR`7ql;R +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 +P$GPaz^DtS5l{DOJ*9 +u>Y74I3nA~FV9nsabh +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 +WWW}S(6yRx;-x(;Z{V%!gTYFGuDLuaeax +3LWIai$5@_2sYf3WL2D8Bm29-~`bNU%2wXCF}eOm_ +QPp5w0FZjh<;1^me_(jXV#4oOTYMfuZ6^&oq{zPQ#!A>N#_;7HA6koc*O|)uO?mreHXNK31ladA;)>eY1vek{*jhv8s`(YTFc@sWzC1 +Q34CIcBKXAiL9Oz~gIYMB_yY5}R0_`LSyJ@*eCoWGj<%klZ!w=mY#fc&;~|;8N<^Czf;>o>e9ty`+qB3w(lg#hO8 +Wq{5q)SRzJNHM@R8uQ30*A7MQua7{0=oR3|q`t=Idmmi=Z3g3}N$QZFY-nvHEB8*dP0gik%}kZ^)VNZ +q1cuaJ$?*`rb}+heZ#_Tjm~GM1p6pY&Swlhd!cbC4jG5PoY7j)mPDzsd_-Z+AId3Z +2Wbs|l-_3li2CbV``k8-^o0bfd(&E_qJ-w0Iq^noZLGPhrkf=pCTBA}hm48y<&RjK9WthC>AV8?SnMU +aa*)~42!ij=}>GI(06^ebv1&W*u8j>osz{Toz)ZM~9tnqvgcrnccS&(0?lg2Ho1Fk ++_P}3R#O<+%#qB{X9^8M3cWL1&Ka67-PE +SccY^j}&;O36^BnhHc<$bJUhBM#K1C*W3}>6!F>F6*f0oujMs?b@le0~plb^5-oWm}HZ>nPNHJcB#0^ +@CY7CTl#eAJ=XM~0@e%6{2SYb#^qgklFqT&3{k7PjODwp*rBbO3fOt6$pM+ApW@^uQ$?p)np-GQ4f{A +9h@i$Qix3`yf8Fe`EDk$F$L2P5D8K-Lu&Kk*~21O27Xs?GbYiY0v*oRs(Bje$Unn{4&9_h~MwtPM>1oQ(lh#;y#>Y*3Omm +9CzEeqbK=^|F*v!V*l?8?j>0Nh&w$*`_M4)ksBH7Mf_3R-MXts3S2ZU?Zl6P-?Wj&hx_mw&zX2$O?58 +CoejNTN_972?VQziqnsVw&QfZ2&{|@a#`42F4ks%-)gP2QAN7ei&wmTqcmB{Ju%Do(!2aC4R^3w6#Ev +Z{UISU9h~|u=N%(l?FtxB6_~w*u9?rkVmh@+vS#ovt-38vP9(##ocII597PzV}E65>UY}V7yj>`qToU~55;#6>DNP@jZ0$8m>SHysxmTrh7qo*J +$8Vl|e_7rkaGK97;db-R>-aopb?DbwVI#<6GM`f7oQOjnjJKHT{k4L4H^F#|_XG2q=5TtV>ML2L`kWG +CP(TI|cwCUXijy|lMGQvVtE4-Nhqabbk_Fc2xVjr42RAfq3B}~v`1s@HpNGp;+9CY3PEbEq1BX%;emd +XR?K0oiak*fBxK+pHf{n`CR^YKBHl)pKv`gS{r917^wk}J!d=ic=2HckEPTUV|d0*JB-E3yLh4R1W=h +OFIIj#0}lEbg1H61SFq&Xw=Z_xAK8_)89-`u_~oCcrQf3x2I<4eME$!_?^g>lLH71kNvw$ubqJCe8Ulw${q2(k=|ebuCV)CPV*9S-5=U7EYpC# +pegVgLhFP6jrtZ)c^^jlQ_KirgJAv#xUCxVBA(DF&H2-O&Wm{UClLFW=Kj+pGn3BX`-tYrKS@3%T6sx +Ub@~rUju-VL7|%;P)z!ZDR1ZC^t1J_lyAd +Ya%{N&d(^R3Y%~!E>LMMU3F_II3D(d3ZdAiTch7;Sbvfn{CYLSNa6j3+AWc|ItOyU>CeaX1!fzl81$t!1J*Wl#PxmubwKbU&~?7vAM6hj+gy(F`d-&s8sgMrX3{I*-#2T=7P~HMInN%`{Vr(zXVCj +qFJ<=PIqLWpFqSAE(#pHG*gw_N0?#P1Pq#x)6*j#oeZuw^bez@)EDZR{+Pu}&Hu#Uj-uda*1r`w6i~D +Ze1@&v%b0W@_XwQZ|-Ts`%PEB=YJ;%?RJ~gcf;zMMf*YZy957sBwI4+ +H>EG1&&(5qML|EjY!PbfHfH3*18Pm4(1uj4oTs*61dBUoa9QpDA~~@p51NOD5)>iywFyakiy|+V%W9eq<=~(bhjnQZLS +6UL{@TqZsDtiLq0=2D$i!y5q~DfZD#w2AWPM|_8`{5VJbJ2PRk`=uRYqzZ5!$Lefz_08^Qlde-)IkBJ +unN6vK(>tQ#+QRp-CyX|UGkfgk8LbB69caPHG{( +eMOGRuK6l`i|pm4$Bv5R}BBXB%W6Fk-oB(`_++5KTLaoDzQBHue)RsV+-fZL+Ju<7(PLG7K%9>dM*%I +56VQ@Z)==?=J`qH!+%je3uGs;1@Ps15AR8y8kR(#gV<@|QNFT5(5Yv8z(pY{Kr9Bu>KSTenqx9dU=Sz_Oyw(R_wvWfO=X< +Q|R@jQ|qi@vLLwm=xY2TiiG_7jpYAgH3MFroP`5pTHDSiGxpU39b&2%f&#pt)H2CQ|13=?_B_*D&GF_ISa@Fnus^@#%f*=Me!PWSr_mEiim)UX~_Z$tiZDFM +ZmPsZm6YLW@MIRR^%-*E$oVEg?%XzEzwL-F|n+$tgux6&&)h?cJ~O@`+MK_|9$`e-+OTV>}Q^tXP$Xx +&YW{*X6FR#f$wj}B?fc`emp!epy_*iKsQJq=d-L={S91pLtLS*MdP!Z4uNRp +Qc5Ukb`qz3E#0?u`?lnY}_M!^s3@X1c9UZPF^L?al!#nt9^{U*PeRNqHGCxaF`#cEvw3OWI&_e|^4dA +oD;OMt}LC>LUwxffj_S1|v+Rvox9z!8cJ4xd2a|;{3&hBmL<(Hp*o$=*k)^!?V?-lC-x@OM|m<6~9KF +@Wt_ObzXpOz4CHZ`}E!Co_lWP1omSo +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 +R`=|U**OQ8#OV*y)`jWT6GLO3w%$>Q +MxD4&F9Xt +eFLR4$`+TDfgTRJ`5LOr#w3>vGBeOv^vaJ;33FT@e73002jL=S>qIx^78EK;WEbti&>1R+KlK9we5{M3GjHqMaRuZou1uJU2eiUl=~wP(NE*qaHTX!smfkv)afMzD$2{W +kcXNq-LyNYAGRT4sX`pMRXF=RR$!8iJBaM`#nSs44QSKwxt8>1GAYWRib&xk3=g0GO +freb6>m@#>bMz88L*`J*`7pUlSyW^*NybY45g +$tG$S7HTdHP-7q$m+-a%?bcB&BK5#ClxRZp@P?rlN>53aXSD7d2b{hASbr!FR@t56vwq-+`F)b(SI9LbeX1lKNdWYR&%R#o#1!=^j~NzF7Bd{$6|LVuH?o)Nq-(lpUU$*G)S&H6h4#~d>JshG1L +A?aPcy{pO|Beh1M#Gm%T(gQ%aqivaP=r!{;_4I44N0z#~#pE2;bp3bx#@89lbtZc5An-5xrXrCa$ +S;Ghiy+*M#qrwa>!XQLV_Gjf|I|+BAI-A>@}&FaiF3s{ZlEHr5#nl~oYaP?&_`tUChO=sQ8GF^>XWWd +SVezp54b=gSL)mfH#+(qKF=3O_+I0m?B{y|i9SY8$T1NQ`Z?A=fqwr9bpJ7@IXD^*&f^Nl7=g5{q$|1 +h=EG#2=H}+g(g@u>l^$dy<$*WPRMK}Zyb1T$13^YH2*NITz`dlz$AIaWJq>4Z?}R?I1Ai75VXwOre|2 +vjmtKqIxK81;U5ap{n&v1Zq4Jf6O@H+=fQNA>~SpNuSP-KTYQe5|^4d1-t0zJk3}&(fnj9{nD08=a*-ye`k}YCTSpR1nwpc +KM|G>j{kcwd+#4(5oh-SnG5jP-~B9o +BjpAN(Lh^2^|5Z55)A*Le6A%-IMLUczw7|iiB;#EZNAsqW6jzLUB%tBm(xC(It;#S1ni0>mFL%fXWJr +w9U2q6P6W#7&50h#w=?Af8729?>rZ{eU%M*Vv!vBqy#O>B_|sI)aBcB38`g*kqR&7TzVbn66|8kJqrA%bVg_ +)~`H#r>a=IGDP2S*K}puxIQ)V3gn*1D;4rufc9@yCW}B=r2Yt(riL5YQIFmw<_Y7D&#v9yiCE%x4ZiLph8}$&|jsHS1b52Mf_ +R?Kc(Px$Z_J7)GOo-3VvC^8x{FqRmhtZ^6LsY+2Ja8-{C4(D|lN4_f@3tq~QJv-b2AP3f@=20~LJm4p +)DLDELT4{7?lSr{KCBiuSJHNjqHIXT}cK_L7IZ6Y?U3yac%)@^a)okk=ybiM&Z6_uuI%58df1Pegtf@ +&e@DME=M%$SaWtAa6k4AGz-?*YqLC+Y5i~a`pE_gmuvr1w9D1sCCKkUUZ$|8dY5bY +8}-TwqO`><-=uewpm7x1hg2eHj6RECc +^C|eU>rZWJqOPNNGVdCPS{UTa#+YGT01cJbc$`p}!eNNN@N)9s+v9XWo50UXIyd(SyD8d$5+bpFz+lg +M;Bic>CS3BAW61-vmqx<1e2t!91v)%HoeW5qDi;wEvZbFMBQRacf?yv>l?fR;dWX +<14KBhF77T!pp21}YDm-Dvuv7_9Fq`eQnGTab_=sDiM9p(ZPKHD=j28k_xS*q{96>ua&CTWT4+3@#by +Ujq#CW}EPaY0+hDS3vh`+BPD6&~Z%k3fYtbYp`E5-~O35+jx8^jOk3H3~KBau#eJ(MQvh^l?x*_%NoT`l1YCSvGkHT{<` +fm0AZDP~*n{U!*!>M638Er=BIhGhKnly+e$|>Y}n<39=bGFYZmUBD4ZFaY`*W1T#$&Y`d-{pL_WmpXQ +RHxHk?$0!R`eYm}Xa2fcR@*EeTWhC5#em51 +{+*sYcHf~%auou8dNoY1`$RJVf8>75TZ1*#Qso$XVW&6x|EDSA4U(K&C=7IYBexYrhTi1f~ODa+t&k8 +^rwdz|f3mP1*etsQNgP~8e|sV<$-lQ_!m>GUD3aH2@xnvKfxE93oL`2QY%e*_W}v6C$L8_2oIo|QGwA +*b^_K2GuBxvj$8iEmKwCxJWH#~KA+tKdZnzD~iPQt+o0e2>bN?^ST|oFdLM@m!WotR#ix5DPKD-w=|@ +d_YJet-X#$NOYE@JM<~G2ZuZ{!yiUHk6 +?Oer|gV*5&27K$5zbeH4J|T?fMes$5B4loj)V_dpg=EJxccR`m96Lyvs2Ou?*4oJq$-IL99d6ypM9k6 +2wNt*bguqu@O=IA*M$RLCizcgU5{UL`Tn`V3G^pO@QJ|3WoDYPi*kb29j(Rl0}BW|NQg!>C+%28NOMV ++%+xvhv~DN@*U1Tj^pprXTi4=h?NDBC9Et)2r;?n8}?tKF9*tLh5xgdw_Gg_`N#UrfHVgK$gQ9!gN5s +%9$fu5{2%J0IxH+S-6eg&pF@ +WUm>uM_6^l5jAkA&Trk3^5v?-v2)`Sf_BK$(F$_CHanU6(VvbIuIdKjQYwp;YOT9^u +l8i0EQZO(EJK*tXbp>rk7CzBDx;5OdW#{RjUG+PW7km{J~_)8mIcqAqC8IFlPv~=GoNCx&DLkx4a#`& +&f%UI9wk4PM_Aw+Jln>@)1WcO1bNfL4dX>eOxK%btDM5=z~>1Z1 +Hm&pWpPtiTkdQ(RA(4zpmf7*-Rvro4ZFF +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 +1t6z8;H7xfK*Uv}ok$LypzgNUg1Zr%1rv +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 +wE<69ESIP$+79bdto +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 +zuF^A;2X_4BI`&RIG1J +ZxCn^n560FKtDY2?S{jRQvbHL(EodSLvD?`((8+9O3zF+)$Nm2z%h`nx@Bh +D7XkHiXw^#?%a1<{4DmW)QFoniq0T0*y)Gg$}DnJ(yGQ$0vT3WG2sWS;I?=k^oj;8=NY>Sj~)ka6W;sCp4bUBg7*O5$$&|HxC&Y99b*iFlFe +fyk&JUWqThxIZF4=cJ?mUrT3-)z6%32`t=D(3>R1dLi(JU^wNz#C$6@6Hn +}tX^o02M(tAVMec`KTZ3LVM)`Yr8nt91t#p%EH4PYyH#C%W5ZpkXh!^=`dlYDaxtj95s~+(KHm;>aJq +H^{KtvMmLKy_+ADuj4COxTnaq@}NheY7#M8#H+iFw)|rF)WQ0cO-qk?Y8Gz|N36Bz2xlmKpA9THRh6% +UF&K^D#-ftHVqOHggyS2I;uCCq+nI#j99AI3#5bgxN&s#jaQ%mj3URQ*t|{Jz +xa5Jyo*U&pHk3WXZKj}lcR_9ucw?EzR%YQ)WWuov8}@6`3BtZ>)2BT9+O;E7#5>WQ9%7a`cl!ErJj(y +Yod%K@9X5~y2z7-zwlxwk-K$P;_EeY!?@IOwP3r0gXQ!X7USQzAeit>j*53dK*OWZD5MQk#jgra#<1; +(>gGR(Pa(@}~>bhy#||R<#WPme&p*@qC8YdXm>ujI#x7Sm;KKDrEJT8p=v`GB_YH_y0215p(jfoxi2Hz +4T1lZl{|LOKcfV3w~;PfNInxvSqp%H$R}P$C`e!UxXenvQ>MC89JJkNOYH}PNND8+8IGeq`9e|xwuR& +ADImCZ({1O(-Eu~xWH6N2tK)7T>ky<$tB>Ki~^|jV_^?thAp0xeOrK4F&8NX8RT~~&eu+{*JX?&tn{* +))&;G6Jgl*{7D_no`OvE1La*1O0bAmbM$5*LWYoTC+Ea@EFcX&Nnnjj%%niebz;w_J#jWHg~x|&WvKEGNY9 +ObU3j&gb4lM}M>YKHKHjBI)>er%U>)Jvd2x?yLV`HNkGRIESZzrRqQoI!jvf9VmK#Yg-XekMb68btNa +HLkB4ysxmOY-wYnnmeF^NANv2H7Ian*VmLUUYWDET88cV9`A3VM>v`|Ub|DheX +TL(p)+RK7b?=MLMQ_%Q`f*5xM0BOx>F}y9__O;1b0MAyYM{%hPS`a;O9I>{OSAd|BP^yUctN$2xXd4Z6Da#NU5<7Klk8CLlIfXU*`n;5kRC +Ek43`$@+d;2 +srn|F3Av>LI85p>HZ*YU0u_Yzn?d9D-a9Gcbj>{Ps1r$5c){1o1FhQ8%J3-IH5AqT`S|PIv!?1acp!N +uZWJcT`?nk%PyfIC~1jg0ipYx#BvYT93Q6N!k;me=*_Np)s+WU(1ERK}X9Yj0*@tP_SGWBPP^G`W@cb +Coh$~t3WE?U%h9n{^TqZ|m|S+r@{*Y1+oiccC!I11&2Q%Q~Y*Vf{rS8V`{H%XE!@hjh9BaaV{h(p0#L_OgH@8CIJ +8G*-?8~dkxG2;rh59i{Y40!fs_)yEdR|uK`6&MyDWuYdL17|Tya@V8k(mv`3G8e>foFX)%y`qG*$PYrCF!tM2`l@kfeE{Sz^DfW +1yuXbbiL;gUIe1ssQ5xsN3XTuhAs^LW=)@!u*n+j9@KCCkcN;vz|IY7%1q@ +0s&QHu$TPg^5zrd(BPtO&Hd87R4gjsv?s`#bx05(yMdCqtxQIjJkM6*dGX@;?ThC>is#>6J%4re{IBB +Audb7eG0pbnf1-JRF!Vz$+7b^&+pgm6;*b#=T+m-4|FO2ftfRSE4X2=sS(E;a<}UqY_F(IQ%j4wQuC( +gE8WO$czkYzSbh9qSR~_8|CFd5PF@<0dOnDu9Lv)7g$Q9bf*ki{7(Bvj?jO-VOgczS5^MU<*$Oeif7V +SY`;n?JGx3TI5i&YL+)>>WXe}j?Q9Kmvmh2K|x0{3w6e&i8L%QZ$2Z`E(y!K%+^OiLMk?U$wx?hpIoH +>iRguf!kxO_4A8LJ~Lz$c@lxkdyG)@E8caj1_cNzVgoz48DaLzU$RB5e!FN1moq7W0y%kuqNOZ{-{@C +503m15!b@?)2Mj*doU&gT +%wU3fVTU5meOq?kDW2rE4ok&K5{muKg%c-E{6WW7Rd+FZMa-$Ydkj;Ko6oIY;%#SY<5Wr&Y1;IcwgM$ +?l^&ZzrerycGUZ+=+knG#fPt-D!gFnO>@nP;D$3!+C_ZG>IO;7)?5xV9<%otc|;uUkWqh66?SWfHsyo +b`EcM6dAE{d!+2&7Y6pC@&cFnFEhM9`|tFfI5Bip=u1@1{}%Z(NYTk@Yzvnz)iPZ3f};Ic@(xP)h>@6 +aWAK2ms3fSzEw8U^;;X006KM001HY003}la4%nWWo~3|axZdaadl;LbaO9dcw=R7bZKvHb1rasrB_RH ++cprs>sRc!hsYTXd+04QJtR&tNheM+w%Z*X@OqAfRxQHNX5##3Tjhl_fKfG^I7A|(ky +@5Q3Urk*LH^r2->9Q$^ +V5;9GF^Ka;KheMJ$AzR9DYPiu_oJ}R3dtc<5X3k_9S_P2!tKxJg1;UvcwLC%2e%SXsM%~qMTH@#HJQvkWY3`hHSq-f6D8|NKn~<2I~3c2=+n&Zi3>mXN +H-*osMF-w${)!TMR`Y(+>C|OkW)IOHBky`lRrvl;$Wnv09CV72+PDFu0e^;p_I>;oJYyYuYp=`iTrc$ +m9jyP@ww)f!((dd5l@cqD|le +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 +fljmLqV>as +3+r;BWMBXvy@evY-HshOkd*Y-LCje~a8?A0K@f(1#g6z0Ipv9rWwxd9-gbs!Im{Va6Slmg^PM@Eg&;g +cgNg6S0W5Dz3o0fue94&D3V+qaLdlDtXeZ%EWGibmJA}B`P +%E-^K+0*=FkRA%S8jMDV5N0;*?lLwQTnn1n5EWP{o;Vi~;5X!9G0}&Y4Dj~bl9dX-I +*n({Y51>rk!Wf+jQWfd3KRjvji(@tU%_IZ_rKDCkFp!OnL0CAv6L%iJMJF4xP;$5-b=fW2Mr3l +o(*(W{78mKRymRYJkMu}mT=wf*E$6m6Q=NYrAT&oY^~1J_QW^)&FyP0WdRR?9(bv!a{;3D@*=L2rX+H +)+-z+@h;hY0X`jc(Rdn2EC>5Nn&(?66=AEtrz+Y8c2*)*0oE1bq2zn8LU?5)^g&>Ln0r?3)l5lk+Chb +hWHVV4=Ep-4XxLyD0Kx)yC%tHPk}Xtt@qp+Iz;#W{HJOWYE1mLaDe6DS)^iYmDncpp(Nf|!25v^Rtju +LpTEcrhZM2041}w>D&#(s>qdb$~x4Lvw@?fY6*!8yjT)Z&O3v2O1}YFG8FLlKUnmEo)#HPfz@_ +B{{3KLBuLqctC+_UI)8rcHLu@JvJO%m6aq=_g^^N5}%T#C~f;3=f(c3wndqja)mcBasK2|fv4iUwXXvLOgupC-Sj20&ZGqFKv1J;Mjp;ldoF|Vbat#0QN2)zRN$lKRkT8%i?R!X*^TD2BE(EOXp^ +2>%Ig>^i=O4&Dwny5p!6T0i$VQ +tEz&G>D;kt{)_Q-W*7wAdwt7 +3yHxSGVY&b;sTubDeaM3?~Od#94K^%fc+eOuaP6pV=Xqo0qe7bi6QM(`J2+H>_{0o>X9a9DRBjyEy4; +8_0fPvCDVY=<&_EWI>tpv4;CPlbPgK{?^GzdRK3RA3vPe~lDlRlf${+mz?36KaioMv#3JhN;#}nMNMb +S-Bno*Xli$5OLnp`&FQ2^#PKP0$y}%l%1W7oIsYw~^6{C>9odTMI6$V5+A}fzaBVmbUR&i(|iv`v`>E +Ahd!evtcY3NiXMGF7pbYLdPL2xG1c;374IC&H&%WD<9s?Xc +^R~~q>REZX1O|Xypjh@ujjGGAy^D^L2h>5tbxD=XBp#1vqX5S(x?8IY9mv~8JaWl^<+HEeZSYPoA}rR +lR;3n4AAuhP$+D7e8=BA4ErCcHTM~7GYV>*o`hKu`?k##OpPmkJXwI!*0ymNEd(k#m4sXjK_144zSt; +L&XPk5O&|F?fy3}G}n7pBI3x_*0vG{Gvj(WL2DpfDG6p6GYV98@r-US%Lxz!-(cssGnL+1kyY%Z2Uwhu1wWVC9?SrKOSg!)llkIo$y7b7Zb3$!xA>sqv&y}P0%pEg1WO3Gq +-hf81l|Iy0}wCCiFipED1E$!6Gnb7HI0uA&pObRJz|+*cyILZytB7WrmC|*HXUv#pf`^boz3%DK^t!2 +UE0-W201Pz=LRp~eqNcM%P~{Dzn%H{5O!xeI6{Rm`@xRW+#wb_Tqy@f+^v*}bJwQh40TO`%b90YT;COO&Sz>!=Gbw&rr=)@xX04XGO4G3WCw8fhZZ!!3VArL+wf&LN)lzWDNyitd}1UI +=b{1-NidxZfW!RDT2uJ=16An22$dsF9#9jB*yNz8qIu;i}VELJB&m=D3(yCON~pED*8aEnM&48;j6^o +|HwNk5;X3DeH!c;usBT*ICxy-R80+-v3*3thQIAcwsg1tyW+x6QV5Lry5P>tAv^#=DHj;$CT@)OIbXGd49R36mz3??U*YN@1%@=V-meNwUq{YL +wV{cWxLaW@RTqge7ELFUFMv5Prud}{0GpuX3@ejiORVA8|`q-0Y#|2FyFdsmrs5MVt9q=OB0Hmzy8A{ +Ty};th+Xd(=yP)n)F#RESroM71DLy267LQjxqLBO!x;H|Y_Z1dQ{uO<1-cuJSNsCXO;U#7%Y~4M6E|y +`0!w1cufdkJHXeEZP*yE3!C++2^&~s|6|w%C@~ +>aFYmOlbQ1G#|s(&EEDGYvO}omOxUMT&GOF&%;)EIUB;k5c@8i6IHCnxIH2ej0WoJm1^*hgJKq7(6CG +uCw0*{(z4A8VpG9j}o`nUFiJN^3f9V93NgZr3)e!gXvMi8tHO1BGPCk(uRDyRU^hUei|IFzS6;$d7I- +EJ#(#~}woPF5uhE_dz089Vi0Spv_O!zR7MInw&dU8$AzJwPb^^-e|a$6-C`MwcZ;VT~bR%@+M+U5s2HYObX=7ULw0v-XiQ*V_P<{5#Wk;3&S*{NC6?51^2~g@Re*EgkJ3gGy +3j{xNg%LyXS#@BJjo+wiu7k!#y+tx^7hzM&l)CJWCQTJJnLm5f$R*M3_9T3%*&4T9bIfK7}nj`2eBPm +PT)+hFf7Cu7(TtsB~MQqP`KnArdzT0f*5Ut;2KH|Jc-;%|K8k-S$!-Ub6^Xd1ZZO@&d%wai88rSQ*?m +rsTn8&)a_~JC<%yOuP$W2&2y&>5oTyMmGBE +Ccmz&HUM+uB((5y5~DPBA8Qk&i{wrSdl*S2X#7aM13$(p)%K4ZU2@Ag9aG1Uiw_%-#v*;K@P&GKT?|v +W52XuTD8auP8!Kepq?2kyp>T +jnepFXBhH8EDa@fjizMY;zgqDZ8U&V29xx3Ww*8B%4kz2~qwkhk`znY!#Hmj=mzW8OD>yt5=6%OKInZ^zJu!^tA0n +5dYU9~}=Kw3t-og*lAvGUJ033>M^}4Y1KT;F5D<`n-)xylVx*R;BHt_d+XW`8E&RNA?J73>vI~OBsJgmG5Ea23}-7l+cjzs!iGiJHEusUUX9oB% +%#$?`y!?gy)M}VqM~o#Gs8fr@dZk5XXDFEDO4V0k2rkR@8jS0wfntLj8mJ}5Nfb)r&e7miwcn9xrIHg +DR>XkunvW#WwAzp$2K4EixjIF*)BL3RERjDAN^~{iVp6M{`)>Qt*5ECQ<77`dZhJr+fF*D +M5_^nm8`hDcb001W3fujIam68qd+xx?>KF}|ohF4C{js+_Ih&%2VjasFfdJ|m?KQ!R6#m0}L(GXCN4c +xgT+*+!QnWC-{6kYnrK{Vf&gj}Buhv=4cKfA*u_=H*^>LxBPj*l?hCy0X|(KEIc@&I{J%9&#@u~lCxd~M&H*`AkI?$CNdlvn`-d4W(OH8X=R}-l=jL^0@ivcNM>nN25$DkX+fh}cUkpx_Hg^X! +y40wv%j$?m_#HXV4kY--mwJ%@LDYFq1|zS$!9%u}*%t3yCs>>WYM0G*lX!8sm^`~-PtGpd6lUg|OEy= +-nmMw9Gv!?{joJvkmcp1!7RX`|yIK|tL_9yqb%$P6TmS6Rv8h5Yv$IFg8PcrjElg~AwRNe%V68cM%)& +EwlmbkFZfXEMG0*1c9BDgAqZv59E4lTwKft-Qz2funxAHlQ!d}(ZtuLIBu;$H +<&-DSLTvKx!>cE9a^ZlNe^kn7DKx8y9q}cIS9RremHx`nEr$o&H;_PkBsFWRjo0&t%lpLFvTs}<4L2* +LlfUXG;ko?U+8~X7oe13F%rE +mRQ97`*&&JUT(5c=Vh$0;xm +WL2`mBo7>{((ep%df$BA1kkMe7S9!Ow&IxcOfG_Osd8`t`|6MQJ~>=Kii0hc5i#GvYVnDgbG^(cu@z +M_oFuLG2sk_z*Vb#$05E!`o*teT{A%o_CpS>d@2J@k0Mx%cIWjMaL2qxp^qEx+ixX|=tXhguBi +`y|DDOVpm~iI1fs6kohjG(YE8tkYXAJl@WYgEPWXHGW0Ay%ET(Pu`+}oi9!XpnBqU$zuBHlTW2A-fDJ0j*}VGm +yo0}K)UefXyL&dH$Xu&?AA3qK?_$E+#5v}bu)*L*YwGZ;#V*cFXQB$o^KQX>rccc_BW>3izgp5(S-ux +RVUr%%86)!|p1C<>2=Ee0@*%z&!SMDJr +c?d;IQFspT7C2AQE>NeNI*mJggBK{J?DHZQTsmeAU>NAB$Swg8lOimrlhFIH={%S_8&FWQ|Ry#paGTyEJL~eheK7HU$ZBVVhPc}Km7QGaCLOdf1+f{tVGz@ +aPHEce$GX@XBj#Qn#7WDt$P)h>@6aWAK2ms3fSzDMNRt32M001Eb001BW003}la4%nWWo~3|axZdaad +l;LbaO9oVPk7yXJvCPaCxnh&u-%&5XSF*iV=IT-LAOoEm9s}_pqnlq6!f+Zcs2#z)7vD@4iD!BBxd_) +pBG0d^6t%xEzGDoH%S++J&?|Y0DStvCyzF7^C;U*iT?uS;^W>1$0h +ml?$lEwRj86YtO};;0zwGI+uFmI%#6l?n>~P8ibh53ekL)YcEa3dkXS|AxZ;uk>1OIHkk=5b{L}!6U4 +DQkQ>66Eonu0oitK)z@p>>MhquZ&;)!PkwEe?Eb?NKKjaCw%e+J;GB}lK7{cGslX1F_24i87kM1u;+w +Gdn+|Of@A;mL2!pbeNs(HOo%V)H-aXYb +If?GOYqlOoVO)YFBIQiE4UC=4k*O8*cG)kv7Wupxev}hahkuO8>Q9yU%~0wn#emPKUk))RK1h9y#)dF +Mt0cDi_!m45U}=t%=`yXO9KQH000080LuVbTf8{G|9Bw)04H|<03ZMW0B~t=FJE?LZe(wAFLGsZb!Bs +Ob1!pcb8~5LZgVbhdF?%GbK5wQ-~B7F$_Gm+nNB9T-K=VqD#!8cp{XLy&f~Q`z +5s{Q?Mpl;h0avu;#V6PW}WK)=x4=!OP^!Cs|*ZnUXQVzes=W9~FKShnYMmD8rB-RNR2yBH%+$*0y3UGAXuqgRW88phxG2l(Oq;PvoBC>ufIq{ZqhxOY^UBtnv +Z_^S>^HM@U+ZkG_f}Q8R*N#vVQ8GUl9%tQrLOeyWwxlf%`&Yu_E28$rOxYgkKZS=tf+NWr1`9=v)loy +%UO}u*^Qo=x`Gu*>vWlJpt)=IAAy-xYjd0DKL+RodkBj2@2FGBbe2#TEU%xA#D;$_nP6Z?R!k=%u;>Rv4>F>(86g$lusXU8IZa+q7CLCPj9U< +ypOzF@e){%LhZH9;l-HIi083nAfNxWE3D_%8$JBbA>}4zbnr +!m4MwU|3sT#oCo_sf$(C8aG&Wy%UQ&K7ksJsqlKJyxQc+XpDh0 +1U7)_0-*nhXd{TQo{_^AOWCtH-NWImElUIKM8b$X5OKo^#X8(alr`bvYs*yPzFbIKfXR$qYz +bG=dHV@um0E96g_d7@seRLV594R8a&b-?Si+K#dLR^4WKt}Zkq1R$2cO(3(XG1zC`u6u5mx<_A-U?Gx +lfVV(z#tE|*h>lyZZRh$&&v*8Z#^L@C)C*!#1XPrDurxK)$z`H$bd{~PBRd?n8amh+tPiBWSm$gXEqx3KuDSm?zf%3(csWm@OG-#<&9R**f2|hnnWf+YXb3~s1 +x3;xXCK3482Ql%516992gxJ!@!W`Jj5@XiYN(fQhb(BvjU*b2-sA8ye457f~vR~A=5^yfv#&a93jDOE +Ju7IDA)~vU>^stMLFyr5vY&Q;M3loN00D*pb2Pyb2yXT&Z6IKes}AD_aOGP7ZOOLE=sUUobiRcBmflw +On7c&>A`=6Ucg&K;)PzMjnSY%TW!H}K(+YGKB)2ym<4)&qCS55LUP>lg}SJ83N6q4p%j<}u+8V�ha +E!?Ni!z7=3Pc#(io7!K^XgAvZ-`eX$6$2GN`Bb5>03CQW +;6C9h_6TH$Ps&R1yan2jg;fZJ1`Bxrh6x2Lk61is-c@tFmqKAgTnG|cCSkonwFg$3(nqfzKkzQ8613q ++MGAm(k$P_WA&$G|uiBFZyvwxGewC24jKAn5o-3bs3laIJEkf>4*B)Ks%6dFLpr>@owJTv;Lz%euz(Z +MM)JJm{rU*x^lcVQ@-C-LA|*7y|vl${ZzLN8FgyqA@iXO>4w5@?00N^vod57lI>AU}X26u}{9`br7)cZ2h>Nl!vJ!)kL9}9c8XX~+t|P&YS)G@PEMVfTvARWmI +N;7i0@pw5pO8ml`!(V2!vVJ+jDilLmtv=OXnT*To +{t<~?Q9su`v(uddcs_~`vYy&F>u3v!vF##(j2USU;bnu-1ZM7t?lI>fvn8CPPf@A6dLl@2@c55#7!3; +<6s|;3ku~nx(9IHQk_vD{g;-JknchR+_2i9JW1)*jg+$fgV0YwSQjeflJZJ?bU=4 +=MP0dmd_jlUOXUQQu;-gMayVxGohQ0ZrXRos7FC!0w +-~bsz9e{$K7)u=@qoWf}?>@BkCv+cz^|rq!#m+?JL|Ut|WNT;*Rsn4G_2Meli2M0_>eab%O6qQl?aG|TXorF@Nr`t>eA*{5=BR+g6k|$^IV2 +*&o3vKe2PTGRG^i$ +-t(Z^dsKPE(1_fcv>dYGI+Hmve@FBI?Un0d=wo4 +|o(o^C)6cCW_Y9V1V9m#o>|v)JepZ7MSgl4&@s}>_FCG&N#?Dii;+GD%4u_pGa)~Wqtp%Tt(5BDPJ$$ +h#%RK2)evy|T0UeOCr#V{;1FB#vfC7>|Oo15)suN9-$Il);1NW6%Jsrj91?j;!H&`?XVK_KE9P|*5wf +n4MsrEz@<``IR_QMSalR<*VCc}>%JJ*9K8`y{rS3Y$X`?jpsX`cO!B%SsIaXo8vFsLpmzfX~xnowW;VFoZw>j@snuLJw`1X$MF+0iAcJ&@)Vr_KZ3OeV8`V +;u3d*yvt%gqzg1cQ8$8iAkwLQ>zwRcH)>37ve=!i?c4FzIOMv22*&NzVO<{LM%+{jy{|BQ3b0Vq?xQ_ +8IXqmJ>ohBpI$w6%k0QXwU@+$y`2B1w!}w4B`0V%Oz-=^ifES(@hs+jJ80{g!MWJh0VHd%U>xq{w(~t +dQ6k?v3ct-Dn755CWA8%j@ck0Mcw0Z&jB&vJCE&5Sz$4MajaeO9^W!ix2E +H6Ve)Q~Vj6%YQcUVR^MXSBDdOAHzYK_NWX|;7KcD$n{&~Tj=K*b#`dsNlESMucPA0KsPsi7dSus53C1 +KH^gUhCqrz5@O4o}6zt8vj18(!#8Cbzt|%L02JSd|Etfz)UzycM-i@U_%$1ax>)beePCoS3JXm#k8>l +`)L=tYq-AVG=%{lZx8GwB7U;R1n7<0Q*wjyC=RKMx5*CZPRF|uEDCdK7u-zL3mXI1`=FNA4XPri{_6jB?M{UJMC`56yX@W|CWuW5%Sr^Q9Q&S6jYBU^IC+Ow?mH_)j9>b +c+$8g^f;Dk1#~*VV6Vj1J9}`u%08dLWg&D}qce$j;Bi;kvfl@bG5d25N;~dH=!AEtNAD5XJ@$U&V=FE +O{k>kjA4D7ck3=5$pZ+E`3?cvaHvyBFmoyW&iW7@-cFZx_}9eMnGQ`EzLEDM1%=|!qMjmRPW{-xj+8U}s-4FlL08a0a@AA +|Rr&dF}kRK`#z9vG0S$HQMayP!-ZdtQtm8@zDm`?*A{7XTSM0!c-w%CRD*?&W!Q$%j{ba?mOcR7$|S8 +!*{1C>4%=OUYoM%uI&r&W+iQ1voce7{)(;_y#*h+@BsByX6R=_#ikH2{a`i)}s)2PG34MJjL9+G04f? +6%nQ5PoNYYhk3L^RFDCL@q6-ZBT32@S_&u +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 +P^^}1ynUN1gWYxnfsc3L^nKP-)YE)USRyX1 +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 +D>SwQG{bQ(1h`W%_2;y!>ZvKm|@HQ +EAcBc`s!h0v>oo@CQZr;WNsMsheUa*=bDOTW1p_N%5xi~(GRn)OO6s}{Q_$65?#!#e8DI*0mPYg%?JWo2RIsX+3$VIpIu8qJ +R~I#GLEz0reF@D`A<+8?FR1aNKywgmlCgSdu^>rw>~&I*S(W8go#0rDA!;oLvrQ#+)n0V_6=*D-)VPe +ztaeLq_dDHwq7VoeUQSccHDF9-`Sz{~v#QvB^5pApws!}h@nI1_voV^?GQhQAjRLSOBC^at*a&Vg=+L +l0D;9?y$1W9H6k%d|^_os}stO1&iIRw3!Y4uzS&xzxGkoE9|H +X%lENo86&uL(2lzSz?-0SCcYZ)Id#IM5-DLdYU0*<2D>w)kvVzBHyaj6&l7jEWJkFp+CT@Kx+p!hR7( +t=@Pl6ts!R`J*mP7lgnj(h4p3G>&UsMt6)ed^SDTN#l46AZsRrjur<@5@vp!#rA<$(_x_$Y)iJH&hi| +CS59kww-f3E8n-MHAf&{ +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 +OH}oxrW2nSLn^nP!qSyQ55AWg*Mq& +C&w60~*VA|3LkU2&rwY3``u>?_%A0XV81V&z#PX`G^HnpRb(I*q{u)L^#2A(`Io2bz{rM`q-_t}811YUG}1v&KCqfQchULREe@jv5!Y5B)X0`|5&x449iGdx_S0EO*3122xQ{CAI=%4A +0PJi*PVBufPP~u>Dn5v9r3SZ6BQo!B!Yzg_TSRCaB?=09h{0-4qfm81uiTQ+Lg!0)I($HqFv-*gY2ov +#xLBVj6?)0At&Bf$V_Wj!x=Qy8*1{uLGly6P%b)~V)%u>AXlOT~{TCvO!W-KG^V>XCqI*2ld@ +%YrNho#AA)RaNjju2BOb`KHj%MeSCdptD30~w%!E}_5sF)3C`Lv1c%3OMgl`!^j)S3=g9b&fh|jS}njc%1lxBt9Jax<3L*&_uvdK}bRa4Gptj$CtJf>n`vki*3iwzh +Tn%Qt|&Ii@wH5X*Mn#9ifspI*Ot``4r6lhdDn`Om-oJvpC%ez>^IK3>h{d9nD +ltm@_U&F$T90jQba;qKo4qpu(T$CGciqxc`ehS`u92Xcd6xGb|qm7M0=x|$@kC%8lZGiDK(SH{Cek=c +aC)!eaV0owf~k5^6sg2Y^FKDKNs4iyNWzDQ=0sG4s-JAQt6$UA)r#%SbubGCGeKhbEZ6POkOEQ1ov@+I-sruLd*>uvtMxSa +{U`JIxlw4{cI(?18%|PcdHRHzQOOfCmzmGSN1AgBoZNq4RvU%KL&Fj?qcaA&@+-nqSu8Km$!i2=hv7} +`CX@y#IoIn+7N7rgz#H*>yErTF@qlYgsXOfHa-ZX@RZZZw=b2lp2RC^wf~XJ? +_xTQ`3#KxC8!0ZYM%_yg>J7olc<6biGv}txRAFW|l%f4kQjDV>-yWHlR`*i^*6aX2TB6Sp>RrN0>$5Z +Iy2LVo??_2+JiLR?>G$XgNtR%0@OtMZ!aAI?)QMm06oY4toq5A9snTX|f!TFJWjR%ocPW&dJ5|ge1X> +aVm9JEa@<(xzz^5{xU=` +j*E0qT1v$SI&clZc$&*1$E%SshTOe_u9bfSl;gxigt1uY93WjoVW0V2p7&cQmP;Fpud4iYN6nG`01qq +&=taVd`uFCmB=xI@761TLXMFe3F241H`?JtBVI8uA{2ZN8RWEu^(CH2pNMO}xm*k%}x2J?8|HiZ +2KvyL0FER~ed18#({AxCKuzU_)TUy+;i%n%Up``s>L2_i(*xl_`06`%?bYf2nX+J$(q|;2HuugQD!yXn?vCY +O55#Ypo+bW%f*5#NqgYtE3Frl%4{rrb8YIfl*37cD|)dJKh8tPJ1JnCH^2yzN@cuzH16<9-witA+hQQ +BgCp&}jtEW6i!?3}I>gF4+YrxcX-whLQ@oJK9FxH7SGcmtXaW=VmB6~uV6Y;pYz|XCi`cmqBxd{Zu*| +DCDbbl^9*x+zNVM*WFePJ$EP;6|CKSa-(#}-`209npdkDInY~r{oIh!h1fKtY}X(C5L_%@}TogM6`>R +8*XMq5K_Z8nVU?@xlg2$HOLx1JnvF%|s%hPl1P+#o2Y&wkW)BlN>ryqn}9y +5ct&m}O}QYck$)!x!{9N~LY`w5Z?mkWiSGI3ruQ{dUz!);3a1vz|*bq<+tqriIN=-2i(TWm+2Q2r4s3*nB5EyM!+r#)E6JLm&=TBw#m%01%Fu40kMm?FaVHn2}ON-Tl5XGtJiUevc<+ +rMaJ!+w^tY`#>!nvw19nuo}SSsr^)AFqr)t12JK~(7FM7b(+WG{>qC@)Y5HzeST$)UtN}UIl?4`aG5I +zD2Pg6w*u(C4LU;v0+#D|!;%c$07T=kLJw^9U6;&W%cg?d#K@L6D>m7V` +NXq1Egcq$^tz0??P>>fVM3gS{J(Ao?axG?ztDm!gq{om~VdFSt%O|`6juOdqDK+w>rjj+ee@2VG`zxs +b?ezl$O2GNt4gM$mSWhj2~wdlK#?b+c$T%hGq|1Y5WL;ES=Pc)Nrl#8J(?^>t&~MLo8KBJ<4%>XA8$+ +LMR_`Sfj*nnMvMu0*-EN>2;)@`B_D(0!1}vbItrDuX;guR2700F3}zxjl7IqdrxS?hJeHX+Se1oh)nq +!qrkbB7AF;LD%**!ngZ%6Oe6b{7l;DE*uJUXhws+eiOevdh?%uB +fE}L))+mn|Ed*H7y6PYEdCGR3L-X5gsjpeqrnaK4`+`%iti;co&OJNCPZ`1h~ReEa$vVrz +>>yic2SVv}Ht%fu}qpbSMJf-D|xi8laO(I}zkkVv1Yak0YjyyXJj8B-`#CTs$oLpc!IGsrf`0(JiNzD +jWt+FK|xT9dHy$s +>Po3S--ThGPpxeUxn7brd|~52+lO52=jQiZ8eHwu9=ygPjMh4}75GKIh}0SONVV+prnC)=oVZP-A$=w +}tq?*euJhs`j~5JGtfp2HDADWs_XlGOOtR;a5;TQcuyDGTMovXa}@9%=^cMzWDB2AnRp?Z_8?VXOi$5Y+`gKmOGq0m&~mx-Vr@D2RGNi==>9T8^m*}qb=m9* +`okbgmLMK?*iIr8~WXIZpv(ln!?tmnR|d%u2SJ(AcwC46XK8$t8Cv8i4!F=Yw!UcPnjuq(Bk6bAK&33 +|EG30N3(sfW4mFvfh_cv(+3;vAu1a{TSXhk?DqKdB~J#$U^@SzgeXb8T=Q-twXDeFm_HdB_Cmf!gC&` +_8LtjaR61^be06Rsu#R6<%JcD0XBP2}F}E +9&@NVE1O#k*$7<9Hhr^o1HBeIcYc(!yuTM9l2Fs!x{>;woQ?MBB&!edNk6nF+f{ba0XS4Y9m6Et0mdQbF&1E*Ug& +ht?r86Q&xm#(_lyW$t{ly +@c3ru-zZ6#A<(U<#@le{n}9_&ZzeH`bXs|P(Dz>CJ5+Y(6TXGs&O`rQHfI85L(n=rE*E5r2a&SKMDEy +DC~h5JrwJ`Bb?;+!^ZTb4xF4JE@5r(!kme>+08~XK|pcIpfIj4#-G<#<+TAMfrS#CF0je4wXV94GmO}RdJ=d~H9d~rbFQQQRM8zy +{97Y*aVkJMgqOdsvIrsSsy;ElC723+0Xnwi>z-kYW`J`aaqgm}T%0f0f7NL~V^dlwv-D$48vgQPO3p* +gcI(C|W0`DzN^vta1C?%Sgh-(p0pKb)UkTaMp2fh~IGd7yT5Q7tz!?QqsQ9$P}loFF$JKBP5{ap1_$v +UX!dpOZAj$R4QkO3$v{&x_d+1b;O5lrqzBL36vNFmA_RW;fuCRGB9I7mCZsTPKa1FMfu0f9cW+ +t;-JI4&1}Xh&E@a8&T*8H~q9yaOfgKl2|$N0PnAy#7QQqa=50VGR706Irjf7T^_a7> +hg+|e +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 +&Y~Hr-DZ*XuzM@NJn-10ST1<-lS +GOv(=a&XCYFaDY;PSB%MN2>O9JHU4t=Dl+Jo9<47rJAqt3kR2uTX@|?al1NOtPT?luY;pc~yW**V)7J +?UTH4^EH~B2|e`8{r+rB&-0icpT(01PRObK}$oE}J$xReNf&{VXNFmPhq&Jcr0E{+Hn}wrP +6fr)N(&beTp^OX8V>gn;iO5n7C*&%T614`8%g=Z#(N!FI8IIi1y%)%yt_q+zC$2 +)A$7)kAsk>j?(wVkho#C?{qJ`gu6~vd#-kXp)i3ee@GFl84{`Dhp`HmuMpm1*hJ3Moy(ed)AWUM(ZDewO1% +nMBX^M=_D2MO?z7659d*%G{w@mSP5_v7g81E9*8TTBRD$)BsrS=%=0RKzY@6aWAK2ms3fSz7=A00062000000018V003}la4%nWWo~3|axZdab8l>R +Wo&6;FK~G-ba`-PWCH+DO9KQH000080LuVbTOD4#64L?z0QCm|03!eZ0B~t=FJE?LZe(wAFLGsbZ)|p +DY-wUIa%FIDa&%>Kb1rasrB%yr+b|Hk>nj#HIe_91(4mLAK^g=|i_|?7L159;Dq%~LDoG`E(2wsfsi& +JXZDZJ$Es`_C*;%S~b_bhH-G*1SQkJTV}l6F8lPn~&k6fRncIGR{pI87X7&Dbb#Z=qmczuP=Y{2r9tql8JLJn1s^%^1~WrLZAd4_{(cR1iDQ#Bj^ +%7dxSD=pd8R>>E5>RAWYyur20dxjL_;a=5+aA7Io&l#*nABd%?Z$;EM5K9jICgR3pAskNeGcQMRNMVF%W=!?mLef{()+=cSyCIY;ig#K*e!iW% +X*MwR1dPS4u{vL&1U23dB3%M7alO$Ss75`D4;_NDpY=!(59DR|3XU+M_8)kF*a(9g&`$tDHK1KTN=VL +gyF<$mzprNK1b5*sDZ_Q-R)X}rmjHkmtat>WM33BSb#s)H9Q6~+iGwm->O9KQH000080LuVbTku8q;a +LX&02CPj03iSX0B~t=FJE?LZe(wAFLGsbZ)|pDY-wUIb98cbV{~&aaCxm*TW{Mo6n@vQ;Jg`!tpu`hT$mEQLIK5J(6-_WclwqhZl*I<L(UIAZu&{PpqediML<+2zI6`>}pCORFl +qt-w6JhZ;ngnTHFM*)8cO#f5qLknV`RdAK6c3leRfui@_o>dZbZ4mn%ygb|JGUBNRU%jl~OH-0qeF$P)RV_50j$DyOfAKGl!{1W40W5IOFrkz&kRkCML2qECJ_ +{ey8_aSZJ@qfPVKa9IY_?BjcstP+q1We=pMACUzd`JcF?R!tQ7hT_T!{Dg}Ee)dsOOI~nA6AUpr$P+( +0d>r$=Pv4pBf*sC`>Iyzs|>&Y6!SCttdE`i*%Lc{P^ob>1rq=!`G((|X?Ks%nEDdm2?hr=5Zbd4+eVb +$Y8DEucjzEy~+Zm!CpK +uHzy>{w=ecjz<KMR+QkKV +?_LK{yiXXuW%pyY@9cDR6ZFVd#>sP^Q5zax;?xozv$6ndjvb(Bo)5StOa@A^JVzjFcwl5KJTk=*Mi@X +5d%~a(J9b)`w3NU;rBwrOh2YqlEMIuU+9pT+40Bv2q%ZP6m4QoKJC&s^HX%_91=cmbhjY-FYf1#fDs9 +FI2gexGS7PMXG=JcLfx%}=kf!?)ktIz?te0xm;pE*sDxYpgg0#5;F{66TM8y7DvrL|gT<0w#v#mTf585XF^ +u1S#)@_3DCWrt-dl0Lv^!8#5jtVV*){XCONm2R8}_<4ds3J8-K-3c8SGSBB75cYC{e9`$RQa@XMJNZ$ +u@{i9J&tYt8r-K1PzOE+=`PV`TCiA%LQdld~c?@b`(b`Z8vlY?CvhVHiJoHKXb#xwRyXs9K}CO0lMbI5IwNZjijvG3I2F+=T0wQy9A)zL#ln +5gS1J9xL~|c$pe8<;=C@|%}@=x`EuqsLDTm7*0Z+5y4B}(yW@Y0`B1`F#r^T<;Mknk%;ql-#2&MVI8m +9(4Yxf7h;=j#bNUC30G$9k(6xc{EA0*^)r^yxa%e=?l{)vz5*%ksKK^*p(c$W1~Bu#4$>xXs +BBrx6$CS-L`k?x=IC{oXEjEYAK`0e~*mZWArajO9KQH000080LuVbTd`2$d+`7O0DuAj04x9i0B~t=F +JE?LZe(wAFLGsbZ)|pDY-wUIa%FRGY<6XGb1z?CX>MtBUtcb8d2LcbZiFxlyyq1Wr&dDygB~in2d=B$ +stRR;ks^hJI;QIL>!mTIKyH~C+v765(tqX*W(0N#EdWb_gQ`YQqq5G~{AX!y-0!RvSwqe$Dq +Ar0Bl^Yc5Z-r!2SV2$0J~-w2Qe@MB?m^k2t6Db1%1mNA!zT{I^2t~UhrLKXf}6T{%0CFq4?8}p;z6*1 +x-YN?|n*XbAiv9zrAK~;aFsx=S+PB$0w{B2IyBA +Ja9qeo;(>j-ao9l4y?Kcd*{kYPda|KQuF`UOx+0|XQR000O8%K%whXZ0Csr~&{02L=EDEC2uiaA|NaU +v_0~WN&gWa%FRGY<6XAX<{#OWpi(Ac4cyNFJWSHbaG*1bS`jtbyU%6<1i3>_g5@_N{i1QVCX@w7jmUg +O3BMnf}_~$M8uYSD=EFeef+H~%W+z2Fj&&=?9A@S4e1WbvT@cCmLtFYJ +jG<)u)+Q*dj@0Vry@N4<-^!U8W;9i|GSfN6aRR)h1N$gt8;8}E7uU+3_5>WEoSaOv$5$Iu^!4to){Qi +{0C9z(S=nu@Kxh_*Az|RQNlRn8BX#%?6F|w%a%XlykCiEe*;2*-^>$o`!tVr?(Yo6G}jbw@6aWAK2ms3fSzEFR#o@yO008I)001oj003}la4%nWWo~3 +|axZdab8l>RWo&6;FLGsbZ)|pDa&s?Za%psBa%pdFE^v8$R7;PWFc7};E2f;1h~)<$Z7*q6?WKoRZmS +h>VAxD!Y-*d$M%(`Pj*SE4p+<@XX6Ad$!;R4`lx5Sq-e6e*wVgH&gi_iGM_Sn=X?%=3b)??T-`847to +-*3exO1_RR&KEjo3+yPfnYdo9EVLY|M-C55%HHpD=DvWOfnK54yqT +^0%OFHO^D>JIOs +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 +E=X?hK(p64!`%!4Xa-4%vI90AfpjO{n|A7|K&& +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 +?fLbD^f}TLVkD}(9Tg`N8->2r +5%6cN7Y$9y#7cM{~7od!a@Wdc)l-bg(${VazebOgBa4%PY+(WZ{^ACU=S{4a-&=js9Pee^c)A +kzNGd#?N=^&WmeDn~hk2`N4}7a$A)6x1AS0>n1>$FS1U)h=V!yP|q|2CrG$SrJU+d +3z2?FQmNCXx`8LHGSI^MybVjh#JqztPAsIJG4qOqZ4_uG~LL#u_eXVU4@-7_bsGj@XRfnqjKk{u2$NituPMQVhY9gdSYeWw)i+QbZy`FnvH +g>IgHSGvruuI9_xe*sWS0|XQR000O8%K%wh(rsf?i3k;@uHKV!b3m;3x +?flL!-D3=znLNCC+~PJRp%EXdm8FXXGLzRqQBC$T&`T~+6tK6NhNIaR~GFo+Uj2W}9>qqxDz5mx>r!j(Hzo5ST3jB6oYw$Y_Cvr6VHuC!**#LD_=ex?5#Bj{yD5qEK6`$nIkP +rmn-65%-p^~vW2zMw}Eo%+JuuOUz42pY0ax^g}6Q<3U>BMMEwENmkhGfELU@iy^CMJu5N64HL=b9O%xRAhhLzke0|)t?Mt*foZyD3!1Kk=zF^}#rD`9bB +*)(!=DOV<*lBj9gb1WegVsl_4$&e=4lm~f9M8S(?KlOSnB0-<@8HEBYHo+=IsGRO7spcT!jvi9S;r^f +l#qek`XTUm}QOcSngPHI|vT2tEpyyI6B25TER=cU^>)Nww9ai%LYd4~ylxL7DX`Jx>sH5311dFgPVXL +F{0(dK8j@Fzb@m#S%7*5MvDIIUsc2s&2)u!|Fz-LA=!}dbzJDq2#8&_uIVX$ir8HGJ(E=hAtEEHy{%r +_@hlKMx%ZmE)93sLRco9~h>x${B9nBP5lqQ|qMyS3Qe_O*HBJvU|D(~nB+(E+SYyTS!3L-p1v;DN_o7 +shNJ%{^kS8|-$^A)*Le=5ZfeKAOcIQNMdOO#%bqo#YYWzLS1fm)z{WyHpD_IGEe|Zw|G(ex)MJT)EoLVIatL*J$YU +FMO_<9Qll&s(@hd44^$x^o45)KROhb-$qi_NcIj}>tCmfyeb3|fkPNW0i +YQ7Qb0_psdY5Wz1#bof +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 +fxY`<;&lW~pQU!Mc@B +{)FOUgaNGoEhV3{GRq_X?M{#M1b{VXjK^?hi=zv>25jl(EG~Bow&!<-JO3+75X}A0eWV*T^VUI@`sNz +gL4Gku5ozJ?)tdDm`_#LQQMxk!FD|#@b-*c!Jc4cm4Z*nhkX=7+FUuA7?YH43%Z)9b2E^v +9Az1wmeIg%*&zF#qC#%ye6Y}HoXJ=5K@X8X7gyJli1#P8i2MFPn_nzm{0Hmo-*4 +^3q@smF+82-EJqo^;RSG2SYy!(#)6i3y1vA3k?oC9O@&`I{*z>qCrRe&tElY#35Zj@=|{kW8xEy5%uC +E!Js1m4dM_(J|ajSga+(2z%oDSX8fxN`UydULGFA1>~;L4llL&vOO5nn?k7Q>3fTG1x^7MejFU&0<}& +~TCJF99+lZMmdk>(zg8`=+kak&=27IuBG~~iTIL|aro@R+38l1lxKm+tegXUS%@q^382?&+teINHVDi<~5$N9HYyU(mdRQ#xe6|S<+*O={E%BrZY~Wk_vtq7h|U*1}$P4S0Vh(DK>Roe=_o`!} +S)=6K-jQ9r65rX`~Z2&O2eyMcsJ;xLnn_(vJ890?Yf{5W~<{y7&dp;_fgA@lSk*01+1G2LL2|A>!7=) +Np}wR>#Q_CfP6F1jPu(W0qu9J1STlgOYUP)ccni#(z^Z_}7Z4o*4rehw-Qr;NE@&*eFh7EMd@@n6F{p +B~MJpd4HBm4h!OC6^&1Wbm*t}D@RD9XNVrY1vp>2y#&_1XL#0kli1I6_g@(xSc#tDg`}G&{%=!1Mlfx +Ex|1>3-e-nR%`-l%n4z|?-QPZD%gYqaXs&9N{riu$ulK;X!8Hf5VI8t_E~-zCNBw>DwSRN_} +~BEAAb0O{qVz|{;dD@2mQDI(0^lfyg&CfOYYKe`yTMw&RwU7DM`G<7K8h0d@kX+t(AnOd@2PPq?c4~g +@Sl&!1OZ6@+2M$Ta`zFwyMvumi77MH4XKK2KnKPkV8f5Utp!^`$^0Q1U+v3;BtW4-#~kW%)$$-gZ)HU +YXtd>IvaI|LV~a^zr$C& +Fef{sx8SJa-dkso4~UjWFZpRx&py#!cgj(jj7mpVb3`Z+>41%!zyGHn`%exR+>E8LSI^ZE9VudUr)9Q +k2Y;a}mg9mY|Q8)gjqfM5e}M*J)F6A!Phukf51<`K7|69m!%3wq{U+|+=KWxkVv)#452cG(}R&uo1+ +8d=IbzuRTw%g$+(W^rcTQ@kd>1s}+b5IbY7MRHrhRv;E1?O4~XB0=-Fr0Y)sNTEJHS8$%W_{ +s%PfW~X0yA^=_EU|5uWOOlj}wlUa+8pzCc)Pl!PrkZ;=tph(5rC&SV!jG9Pdj%P-b-HX&onthe0REm^ +o?hysu#<{9nmz6|b%%DeERIGgM=TKuTtLw@5KvuVYX6ZYwMW#rXCyVsgdUd|SgM$4Z-%%PawF{RSI=% +W=}vbN>xq{b&4ne`bhcT5qvKI>Vv~-Ue!hGXdXY`Px{&#cSJ4oW`@tDL%t?bta$V79P>)HDP9w3?}oH +Zs^4(^!4W99bVx1Oob4_JM18atm8-8D-fV5fZ}rDUxb!4&W15U)+QzlIw*4Y4%^{StnVeKWz;so$ln3 +Lo&JnPX~qKFtJi>#4RaJfe21-Vm|tOBN%CZXpnCp{xKiY`1?@c^Wsbsn$US|JM`gr4ih-YYwWsnP%U( +DKa{+>!V#p*lcz#E)UNEcuwfA^zI1KZ9huSmD>6-%hY( +j$^Ge**##95}eemDBXt_0l}5$Ub>DB#;kyt2Q*E958+d+{vp$`ODf-(dL+K?ZSX{D2P##&wGg5={9VL +%B)fOB;fo05pla#wQN}G%q}8Q>NNBjFR+sUN`iW*!DlwAzqJfRlSt&+C6Tsm_p>nnqcFF!C;t?*xv~3 +5$gr{=#upd-|aN^51m?xNOTx*?$UA<^!}xj^PR%KB6;aikJy~)I^NfifeCn^0sbg}9n1$jHWAm^905M +VXU6JuqyQWPpc)MOfM=iRUe^x|Gw}f{pg@>sKJqa?V091yg2dj4dYj#rWY2^WBf +)(R&Yf%V!q=35bUw6+0_S=SGeYIyq?uN&hSO`&6K4aR(qKgso1gAOdT2Bn>F`Sk^HvmcC@o&!HZ4}5U`<)0CWy9Z&LN-zscxsF +hN8uyPA}o$q7&^m^M9P0^#AXA0qV)kIg?ZQ5$vwlsa;t*8jTaa?7FxtatW!ANVT_lt_ZV?Dh{W+E$1J +15Xm$8ze$vnKB5YG^W;6M_w?MTjQa%CzH*Nk1>njYQ2>Zb>f;P5XeUT^o70 +<(bzQc@J@fBhPZ}?Y=A(Rfsl +4_gt^%CFUZ9rSM?ty@}!5M~uP|beMwI2JD+V;-4c& +etHjGHuaMccf8|naTDZx1#YQw*QQh6&^X`Sg4RIk&f1yLC=QH-=1CxkY}Cm^IOgAlu~au!`*ECgxM +ItR0>5rF9>z+ASK!)Z)E$<$InH-CpmD$wc?41ttpAE&$;9jXstemc*C8JF6NVn=t4!G1UlCFsq(g4O5 +DU2R8%ZTyeTbS^6#2qMl*~5Jt=KC;%r`mkP42s>fa*2~pL=#)ae&Cb8peq_Lf+lO2;v$vA0-`BUWRL{ +#T}ArpW#X@cWjWX&Jo+Z+>pao6w31^fU;_=?1QuE&X65&2uzKH)Y`44@p +jwbMF;4tJg6IggO(aMUTD_z2q-^g6|}zfNQS5cL}@p|4YH2MY8~oaqDRC6iNk7Ot<`-4LiYbtO+s +{+KhUgGM(_o_OYnEv2p)5>ccxMBhz-f0Q +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 +=bFg=*^;XpPji!u0?1I1MXl?Jh6&O=Vx~pp +yJuWNEkD`5JDnK?n;M2H}i(z9IYVgl&J-0<)PVXWPMn9gn%>R?Vj?wq}e?Hc*gi*ua1cBAJ+h+QM!MO +jS}FJwxK}&R!4RiqJreRmBjv;QyUG5t&LAF@JBKC55Pk|tb&Sp?0Y>G8e9JvFh-`ca0?&_6N9NzJ1s+ +2(IDm9M{$qP^j9AP!fbIi<0}t(AH*F@eB{YI-vq$?ywdI$MkD?N46(WlHwFERReb&vYQif&YUf+DM7) +OLKA(zWtRExrc&Ii|tLOtNZ|UxHXv>P{bitKNN+PMwl(2~svF0K5I7g2p%w&82XE9|6b0CKtI$O5o8628Q}5dkW1eefoi32YcES9^Qtw(HPFH4|M3VH>*My+Rn2} +B7z`W^@o^0P%hlzEof9*x9g~h-l|>4HcVjA`=jgFdI>bwR_r>qTL{_C`m~Ns;+b(38d))P6_;KQ?!gSgM(jYD;$xVeac;~~6b+eYntA8PjH&;-^x1Ie1hzOnV~oSC<0F4bAJjd$_ +T5Pn{%DH=|Co#9L>TWH^!v&4X{w?WMP# +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 +r`7-RNu<3Ds&@k?p0WIAJ4TFw3 +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 +4TkFN0qR$u)^HTvDn8cOD0kuLb| +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 ++fA`Cuz{~aF3YbCNLTE+^!fM(>Ovf<^< +^1k5Qkk~Wu08Shnj`4hqH3MO3dbhz)SrwSKoN>fCSRzAdPHJCO%!C(a7Rt5;*3-10#DANoN1tsf&)J& +;vK;ivu$`Qx>4LII&O>6I_FAyMi+imxb~aqdWkVL_O3$hkAZ<;`T+yPqk~dwFV#+>40)(Wg?GG-tX%} +fz=x(kgqa&kG=cdgw6T0YUh5}fZ!6wKLKRceDt+;j{womvvIQ&W7B@EakUhqyBuiaZYe=z|J13Sio{1 +6GCScvxO98|cJ(c^U$N=PdIg8j5xoqH*MyVGi=CaTCKRpEM*!);YyEZjA{BEil2R8jzM-Ftq(gCHK#L +le#;r^k%AvSY0@p9kcb}UecBLEoBfs)M;J%53ugF&+5RO`ZZNkv?O_R!Xfs@9huW(lSg5vc1OEnNzgz +k`aXW&;pyk#Pl0Y13VdH(XDi6Hf~jNT!Va`*?f%6#z&rj7CwG0;+Inm05m9VbLb> +=~&V!GO(9iY0JUBgDR`9T#% +2w5X;3FQ7oL}fXlNq;W;X`G?F@swlvbZo&_y53A<$}mzFF@VuygK0x#{b9kpIsGH{fAY01HLXYj-=_z +M<;xez0gg=-KhC1RQ}9o1r55IYLTw4ipyy0#jG-oBhnYbGSQOW1K#T%{j! +H4!9J~xa8!N}#%d~O&RJ3D*#Tw`SAM{;rwmntCw&g9aEI!+5ek|b;4LXvc?y+;>y3&+tx?)Dk0ggqbC +2U@>D0_jv@Mp{V|pU&iEWR)}tT?0={d1=-I+Eh7N?}u<3LeXt&OPw=C-;w?ZlT5|`QJZwTMM8 +je|SOeun|D+kb1$yVHs*n>|Jr#gDMx2-eCn;s2(akaw5^|;v=`11s%N-J#q_J5V}^wM{dy~a{K2ULIr +w~(jiWw&{`{GN6oc%^p5gt?HIT`zC*XTFIJT8B78^=Zt)lAPlorQSGSc{F6eV^hVLJ+Swq)R_+1ZkVYm9EW$LNBUJTJtEWZ@j +EdVSA!*p5=4Eg3kfezxS`8idu;Jr76S(DqDRL4k(&`NgY=UX&NfrNy +vRYK*ofaFiQu&%;r9v^^8our$t-i`FB(C@+$WYgo)GrOv2LbIsCbT1WZPW@6V<;l&2Yw=QbhmIq1gl6 +0;!9;{z)K%W}V}CjC4OrDeKA_QBSVkL +V3yWwYZEXn~7__i}ZVqnCN70(Kk6nY%SO&QTv7;h#3u@PaLBmC;3)D$&&4eU(=&_|dveSKSUo5#j4@c +eP_Do!E?LGHcT)dj{MR}22oFikM`X=H??*gYgc6KA%)^EDw9;uOazgJK?hG*2U$t&m`V=`*m*%b^N12 +M91=L%AX^hb=Z%Tds+F3g)#8m~nh+)COa2yUfq9RY9R&?5ZZz``B-t`j$OoJ4o@lESCERKcWcnLAXYb +y@TFJm?$94fiiDT3RPH2b#=9Gw0wMO!IkFC8_p-7qj0Et_~jRwNVWfE0NP<=NtLBO-lLyWBJcB`tj>y4)oDlGt@VyWAvngN +3~tPHAHvB(+1#xPp(QxYrJw7I?!x-C#if+=flM!NDc^h8;S^$KD}_{0T-R3)di&PohxL(xAk|!h +9N-ov_t;1VFVBZ*B;?%!vNIT*t_GBe~k~x!6p8(NQaE0+-O9kBUCpU#4c&+5YUYVkxOD%MCwL^xJ?%J +Zn#8k@F1xjVotjOi>OEJn=dVhZK5Dn+BRVjD{=ccNE3@Tfsh6s4Uv#4^)Sf?0|(=lj49H#XWWz(S8WVe09C}^lLejf5JBSALsKW9-h1DiE15MZ_Hv>)CTASVUZE`cX7`XMgMw;b4nIP +4W>IR9{MywXfHgdI)wim3MK^w_BIW&m2N}DI>a?wqPVwZ^Yf_JmQJV;u4rMcN)93-)8!MoXD8cY`UZn +zAC!GolBnT5Gv1aFpB?lxo6g1*}zXhlr_#JdfWR@5$0-)#_eg@?T(E?JvQNOFg;MVjd$@jB@RiPq*>l +7+I(dn5~K`-ezw25nv-IXSq^MV+=gjN&jJ5Wd^`H#=^d$hnKWP2k)`-#%{Mf=ipQc{7`asCkt^P!{fj +&H4H@#|%K&^hL#MZbM=)pf3wva~l(bgX`MjHMc>b_}Dw-Fe(Hil7+*tRPwVnB04g*Hq$zCxHc2J&c^r +L0&kz^wJi^l+9BpSKSbxHpBfSA*vBWgm=!G@X!zt7vm$oIJU+R_Tw!7FhC|FI50cs?X66^qII=wH=u~ +qb+Tzm|{X>J$O%}8v{m>wLlZVT)e`pv2l9Rntu92WvkxX0zB1@w6aCy`FE*#px-2Zzm_d|t@p45Wwo0 +HCERs{9;Hq`cypSB<;3C{?^aS|7~cDg>SuxfQZd}9*K$D@vZ!uP~FLPaI;POOiwf2~8iqVAt6RkOBRN +6-ZU*4FDlQEpciZd&^V!I}I~oji&r9#=N?g*TSY3Ib7{99?&`sV^(PjS88gB$V+yPV;*35gqC<-Z0n7O6VJ=tfTxWZ3OFf4D?}$dukj(F_Bd%(HEj%`nidT3-@NBG?%$t0`K1EHW#INIFv!Eo37-Kl^0=j&5jD>wq1KH_d}$ +&Nx1a0uj}!ijCcaEMy{+fpydPl&+t(?4=UGRkEI-sSi+S$DvEH1@@C`lfq#beQbJHPR?0`3KaAoGgrm;&Q3HjKW^yYnAbgg7sDtp9F9h-8ta| +Fj`Ub@{ywUQ|dH7=N~61Vw3-KiS|#!5@L~M=Qo$G4Ow|!RKXZtsm+LQ9kPMU8yRz_D=|d4kGBuDklw% +by~ry!p|yjGU%bFI0@B8CSijhj{MLIqF&JTvsh)W_Ck?KKkbm3WR3b~=fjB*kfK3R(9Gmb +gX=nPq6u9>JGq0s(pu6sE)5{L~ZUsTW=IZSy9! +p`(w_sqJ(QY%(Esl%-S0y&rwZzA&W)yGK(|N*Fp~8>Qg`}eg{|>aOG2GKWC)9 +{s)$^)wbvZz}yBmP4m@esQ8^vBnSMA-r52%qY45y8BCs5VDci%%>chU`YtbAAhhQEMPFCz}|(4QA?td +$dVzWo${NjB`MDx%A}>{ch_qa?k1?nEY{#ARH*Vn1KeKcpMxowCr@j^-!}$jjzKQ(=2?-r)?jLa)3u1 +Sp9PK&?dmgc9?)*|nm+mN$-NAz{h5EFu@m+6cP(Q%4q!Sb1%BN2ubQe4Ky2b=CZW^6YB0E3_F=H7APZ +M|#Nne5whVY0fK0Cg-yL*M&R(%IrM;!h=ulFPN<5_v&AGV}2n~`;YU-P$OB?7MJ7nv-we3KSOAXsAF8 +RMCELwXi{pQ7Bp2=l`Gmrm0sETMyiiAcW{c-$y4=3J{@!vqUY;6Q@U`8D9objq-sRI +kQX)NJqi~{bf13;U#?vN|6lJ8tp7Gx8vfHXcEKM|O!a2v+EW8g`9qQ5_4166YCDIl`$3`@!~&gw8&hd +}&pmyIQ#pLFddQHyJk_~W7H_h$Vl({J*A(!1Vn%vU}?%fq79O(C?u-PN`|W!{x$W$TvF`upE&^ur23Ht!nE|Dn-; +Hrr+ErqTNE8vBXaE?YN@*8kMl`)0dr-8MU@u^*c4vUSyH{jghfC=5_QHQA|>>D`) +ZylWXXv9*dD5h_bL{y)respI4x=`2}K}_f%;gvZAYShcZqqCxmv1Iy%z24kHtf#tBQI(DWAQPaO4yYo +z_b2N;s;9&hXMPXZMgTY`BK&ne5Po!4$s6yoK}O6kTSPg_svE9IKG2sFyY29?dBpuHaTo<9)Ry=J1IF +Z;6f3&0}%vI6pXm$8*fwfFm<0IVv!u4`9WBx;u)=dS*xd>g^SpqqKamW}4e +>+=O6<699?!&83hXVg38slNdhDL0K`>E;?HKFVhGU>s0L5~e3uFZQD1ty-pYW9|a?c%Vj1k8D2-z!tA ++TO7u66@RSvT^;U5bX2_c>M1a_cofKC7jIpVi^T$6x +9KhrJ}`-dtIE4(j6S8O1zrq$kt{7@k;##257^xR)w^1xy9VN-7*!KG-A1fxgtU#pMb#4dm**xKe@i1( +}5D(}*Gh>?vK4Zk8&6_VA;LmX6~Yj)g$50% +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 +an^shgaT;D*~RCJtEJV<Bc +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 +~(__;Jq{fZJSX=%(9v6xvxV?2s;%Hl$p +XBTkw{-0jKUjP6K4egjJwpFJv+xjy9I485!#wsS44Lk})U^gG}5lGXQu%Q@4l*W-pKE#t}J9;n70a9+ +xj%R|hU?b|Zg`4dq;>P(p$yYtfoqW@-`muLQkzw%gNP?Am~#!25+!66)fR_N?u5>%=Z1RZx +q!etw8#AQEAwj3s`9_S8f}>Pgzbb=CrLBkRwOg5`UL||p1$A!tn>4hudFMItHZ|EE_?^TpRt9Op4E^8tCVtQZ(SD6V +4o2Fumm8(Wv5>%HwZV?pSNqaPv#xQ_L6tqjX5VXSkSSVoU^#FmC`~Q_c +jbi$05}9_K$JEoHo}p~%I%4vHc3tqf5UJ8Z_$MgmNeu> +M1wsaM0`A1rl&c|c62PKD3Z%p(%hL#L_w{=BbXOXpP+K+M!#bDM()7&e8Ynr#l35-r|$6(`<2cJ(x~? +xWR)ZO>e-zmDjATfJPbg8rl`-nNt +*I6`5r{Mus7z+I{CJ-xTPOrl5%5O?;pWB9S&Gle^4~Ulr++C}s&=yx)p&^o5+Ure2fv>}f$~~Z4FvQ1 +;TB%!&@j}NRpfV&H(TivnU5|1L3p_&I8 +A{5;opd!yYn{*%eK+;Z64j_1avKpx%+87Id7i3nYWPUnj5{{%7q8sx;QmeOoz1ew*f2XrFcexjr!U@T +xjW!2(m0&_ZQFBN@R(5cOL>@2bZ*e(13xs_ZIP552(WMPtwxSq2M27xE7n?reqONm*-sgJ +!jm$E7UL>V*x7n5&{ +a3O1{H-CU$S1`3aoG3*3ima{Tt`!~0(ZI%< +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 +a#>OoV}E-><)dG73?N`mlfQnGOo)CcB{V2f5 +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 +eIE7&*yC +*8ruRH+64n&E=&fm3mtoDonuR?9dlL2(>`SnxVPA$l1ACSZQCRb^7GN#HT7tC? +PRCwTat0Y=d4O^df_G1=dwqYp~W~U4uoJ-7BzHVPAoL74{nJb=cR~a@;au5m**18`cJ_8?bJ|x&_;WO +<-HFZP**IZ@|6@`xdO*u)ctG2i9F!_h5Yq>pm>HroRpQ3)pvH--Ue-_Ls2lv$ejp3F`r@Em#j>ZNqv5 +>oKe+b%}4negJz5_Cwg)uphyGO!o+|cFOCYuh|mF`WDu6wvS+Ip{KB)v2BI@4c}kTUB-8g^;JquE3Q? +|!Mat=C!u|G`y2Z7Q}%wAy}cFstk&PPy>Ty##`Yn35GrL(k+t3|!D-_eYAYEC8X?WI5M>0`kfRoBkFmCcwWnBn#^0+OMCKi|%lxlDzFDy!NU0;9EjuK>%bq%QYTs{v`>XG__t7KAFdCAF`$jW^i +mM5({#<#0l`X7nS5g_wXs16?GC4KL9mFZUeZb?+uNR=7gMJ?R1?c0@FY@;bTyoBlB#YFgWz;`u>0C>( +W}(kOzYKjE`X%U7&?ou(B`%@z8ArrEIhE41w5urZ)E7l+*J8hUQwllU+}G8CdOzy+{bo#SuQ;YPH5+_ +M>5I@8pwCz1X`|_++wXwa=EfYWasA_w#=LbM`U>=Q=!V-n_!hz{oQFO~d$!`9%cydCFy)H&Cwy-xoyDrb}qEyF$~cey)vq{b$UhcLEaJa +9z*KZ?nT5UvciVLXBH7{((9qDxMFuDAfM(#^qGgfS0ep|%lfb||oV%XhJSr`lKAprEG?IO9z{#?%vsQ +{cyE`d#SGNC$%lB!O-^yxs{OhbDKtLxVbe-wpP?5B)2L*LzN{gAT7B^6Nho@(!;_0>)P`zKHSFdP>tD0flgH{GU6sd`UscmBVYKDqX1@-n&?pu2!WNs#2XFI@T +aOHSf=vJtjt)oBp)+#UtoDZqd_PX+>0(){06}hloj?S@YS8uGEec7f`K#u=WXi|IE2*{p7G%dRQzyER +af6ERafKsU(()xE{7bt}utgUed-}?8wZsb5h@H +_!Hz6m=Tsc41geDQ8^MsdLNo)Ag0}{EDXs>opslVJ-c8xBEf2`|3o=y?QWNKA5Tj4k>g&;$DupfeTkl +?hC8sgSGO(mEz55eWQ4Ds;pO1TJrbacO{Q~Sba@@y1vW;yM%Kh;k-z=AQCQ$gi9jfvPh_lgoa4CA`-5 +OgjXc*QNudPy>NTq)k)KrOIqqqiH4dEJR1>;^CD*)Fl%MaHA%ahnLOMv_LvI;HZeo?FzabB!ea6YWYaX%+(;zhHX!~J4eP2gTMt5 +MubU^Rq$IjmsZOJfD#UM9H)7p{&Mn4Y3*}{ +zvRPUR72Av9-OztI84+U)%jqp&4RBtj38igVhMG305HSrLux?FO3y|Yhj)9s23+02w^1)L1V7Yvtmk*5c!HVmFlFTU +kIe5V1k1X_+$0f+@xti}8M>L=3ZyWoqls*S@taJu_+FgJ4^DJMzQ~`MEO<%nPlK0n_0ABiX20r=;Uws +MSr#F4|#U}Xa8Nf%+Gw|0>`05!TKyUi%N!~xcxtsiX5BTcGc2oc22=eKFQ}WmQj-T=s;H@9?(+7?J^6 +>Y({z~o+z4L*WAvxpo5QxX4X|8BzKmGJn%|CHUr|PXdjOwktjOwgBjcTpDjcTlXjH*_CMinbxqq3F1Q +OPR6sAv^r#H|92m{qXRTW14p-Z~o?jG6@5Fp~fqZsKoKH1V}5nfTe1O?+%BCf+tx6Hl8O6EB-u6Azm@ +lT*I8fc`&>^aVYB%WcXIrxiIjqFPjdqt~&?Sd5YBo142mQQ^Mcw-8`po&7A2umzxnJ4c0`~9I?A@7keoG*gzTbAskbmwLO4x +B-icC1=7M>N@6=p=jWtZ?DPXq~3%SE?PU>6{Abkm4NE9?FVz`OMu4NR;SU;H^!W47jm9`Ws3i}RYl2m``q~zq2^5?r84Sy^Ab*uW{S)jje)#}~aTD?eH)r+-dy_dGA_trAKcMr-+m +foy$YI3(bzD?*495460v+1_;GTLm=XtP11%?6D&8#LM!8u^r0`4>=20|XQR000O8%K%wh=1~*U ++yDRoUjYCB8UO$QaA|NaUv_0~WN&gWa%p2|FJE(XVPk79aCudbO-lnY5Qgvh6)$^Ape^)TQ1s+QL}>6 +*dWh|;8_XBUtg!#yBx{A{Hkl{SJCiX-4_=ZDU$8#K%y_khH_%I>50iz^c(@gE(1Q{}T%0KdM>dyl+31 +r#tAjv2!!SIfc;g((WIf^!Wqi)ou?=t)-Bm(#^eN?-DD%>*D~;foWFa>yY#*Ul;h*${xU~^Slos1Hw| +*v`b3l7~+V0QdUzp}Hb>jw>$seG*`Yi^!v%gmkCUgif)FkjkYZ9bMiNY0if%PIpPoaK64JCCqNQ>I7x +NI&ZegRNR0|XQR000O8%K%whVA>K~$Subb8T*&5p6c7HU0;e@agD--g45z;89SSIQ#EdI9}Ldr7si&E!h2zyNIqD-qr(b%PFwO +V1^Kly*bPwfJ}GGFje*LA{EqM{eKT?I`nt#LKzzUt@1>b8l>AE^v9>JpFUqxQ@U3ui&~f@5ytHYG>QGy-dAx +`D*KVY0`<)&F%Cu8bzXG-O7@WlH+>c$KQScNJ*qbDNfqm?rdh-L?j4+AOM0Oq<+7D7Tqm!wh{hn#Rc< +4x=uotFF3o7lJED~ahhal%-P|GDcghgC}YbsTtiE?NY`=5(j?xpTh5~8Dit}$1{@luo2=KnTF8<4!q1 +JtNH1gX9Hzl~$rBt1Ad5U-We3lnLu=+Pqd=rtI?vr8T|Vc@-a31}k(i$clC9$R-h7<|c?1u=e!t)ANo +H7(Z&y4kp0aJ$n~QYGpfyVF6vyl^+4g#fH;xbRflb(Xn($sU#}V!-_ValvmTWR%{SC^bf6!y_BZmOAq +~e}Mx55|Ov(yi{a8x5m;^gdX(BpB&R20LH@nN> +ja=vT<&+=`|E8gIt*PC6PTztF&(d~`Lz0>oh$vc^c?>9aCvcjI-5<;-vZ!^Uhn +wg;_?LkEN0_+)Y9wqg4oY8cE<1gV5{ULC42fg;44&%ft39U;7WJ}d7P#qj1oWRnNtZu4FF}*`dO3|mV +qM;+wcWv&UVN?4~8sBbLM;=vhBbnELW)bl4yiTau5%!YM!!{;2^79+6UN=i@FW3>Y4@bErkev~m>z%+`9M$qMHH7jU!);5 +gnUkHc`IM|ODBl4A-nhEH9uhermXt|w)Z0=ZltJ7aVPg&AXk6w_g9I$5FeZi%WAie#~nyh!{ +QtSf;3K}NUR!gz2oxFAEvB@T!UxfmtRLvfc?%;FEtk2y_F2L}v&UzDuYxUkg>fR4nSYlts7FrUA83G@y(mlOK*Dq=E5nRiZTpu9` +QKLJg~=4B`K#LZf4Q1yg!uW21BFkcrCJ2d`PnhP0|XqIm~kr-L6qVD!=7k*WofDMXm$Q-XETwd6%chS +2eot{m;>Iy_6#?{M|GJaQyLdcA;jj9C?=jw0W1@oJgL5f!m*=EV_-2-lL0)vjNie-tv5whws1!!I4bV +rsDnrddlPP_g%f)1a=FPEtkNgJ?!1o1_+*EzwScc9iE?@odO?dygIP6pkHL~FhDwNGTGYL(ocd8iwL| +KTCN<7x{kJ#t#}ZDxI)lV=$}>L*`i|JQye~P@Bp7G;GlW4W +K^2(1ixsvf=ClX~s=sxJ5HiLo2<|fKgIjp&d0^q#)2_Q3`UZYawvAlU{L&Gljj$XDW#MYo>Z`*Yi0Sg +hMS`F;c2Ub12IK!Fi%aT2-WCo7GnaROYazvjtwAp^}*nnwJ>eX;hm*38*J94q+y#GfM-QTgEnv2r%NV +gt3_(WCT@^(WaazarP5!MS?>}k)hfvG=<~}G$cB|7Iz!_&ZA@SJD#gQ5&1LP{yFTlnHftc7;jl>xaO^ +#0l{SJAmACQ@ok#Mj@PPsLj&DFj)sUGLobD-l8+3zE%9OhW8&Y+MTbeSm>?SA9g^-34D;4#yR?y_5x< +GzSdFqj{!g?c-V7~K*TBH|;bM9YF}hRV>2 +SO0V!PYNw2yRpru8QLxsQ>U?t7j4SNl*buFTt_OYN~qV5(9(+9w6i%ZtaT +XYq3I-fxZe9P~mBtdheBe1?5Y9ZXWaajc+oF{I9LWQlyyf-Kfm%U$SIi4+i6f#Z+rYNP%#uX;jqBdg0 +RTD^wQSwy~a$RMvL(l&Awy#^39f1~nH!q2t{y2};Aq?_%Qt+V*4^Ry$~b-(&sPF>A==UJ8E1xX=JzVDAL; +hWfjhcAzdSE#zV3^h-;C#(X`31milgoBt^yBu94jT;&G}I};*Su*6@;`2*NznT_9zR)!tZ426tgL}e( +;NW#B3P`c15t24-%ryaN@b^IdF+P=;ZlK$6z +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 +d$^sfJqTVtO=PVPa|jwiwU5_!Gl(q +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 +Voi5n=DN=$XOq*PghM0KG`P5f{NTEsX8k +XB%9^kY5&#^IV^RBA%b`JT=EhX&N1zo89t1ws22|f_5DSJ7Y!Cn*ybV)$}-|1!fN96}lO9KQH000080 +LuVbTT1)I;(!PM08}Ud02u%P0B~t=FJE?LZe(wAFLG&PXfI)GX=iROaCz+-Ymd`L@Oys6*8OlcG6D5N +KSVVux>8D89s){LQRLf;H^~;iWN(g35&yk2`(E401@2HEY9vVPotd52&TDVgH5K84b)sp?p75$|Izg5 +j%Inz**Tk;n_1Y}F{O#F;{Pc$hr$0S<@-QWj0Fj=TEG17{!JC?vDftBH=gX$ziBt1J1N^ +aVcYtA*e^if;`K5)Z811(mGZ2r}W5sHr0eZH^Cj;<8J(@+aD=qE|e0aHQ*=)vFp)`vbfsbRlaagD7F* +QGwuzgCNv${|kK$_Wp=@#g}XJ>MkvopebQa8d_1$D?STecLeAQyW4?-W&Q7ha|O(CiV;)2dns5o$wlr$h9fS3LHtFLTlthL50M +~(|d{XMfV{&33f<)5$q|~{v`dC)`eTJ;_VC2HzJu|{`Dzid_02ui)bkXp&iej1a&~Qn|luSFOe}FsIc5r|ZO!_2*JU@SlZC8_(%7*d#f#{&6l)QJMqS +kbD_*Q1vN**t}8+w?t-m>gJHd6c-gMiX)IE)HK|GUh!Tt+GJdQM||^L$1p +KEB-Kx&s?ku%#l*Li`Bm~7I_(U;dlB +nV#k_AzXglOmY@|+-P^BrcRgXbiGm-Zj+Ok-pjyJLNL%=ko=UrN5eq)N9TDo3QkTZ2|$l$;jQs$ +ZNhN4=yRR$O4EpJG(3fncltz+Ll=H +RVsXI3ZAm=&Nc)YsIMSkAbvxHH*D(&ERC2^V`Lw+p%u&vva{3yhI6nkK%pu;rBY46xDOcfdRldt=a(Fp(SCAcYOBovf0*95<(?-WSo}>SfB21_r~IOwEhNa;k}uP +3gleZj*rolagSD$6KR#A~C0dCH?J^WPCQqZ0q^fm~)WFvK{Z^JDCpGS4!=Of20N`9m&^#r97x4&1Xu5 +R}u}>ItCvqx`$Q(g4~3*^#Jj(wy)_Vd$chnxmS83)3ZawC(uX7Np-^G9`33V_29;)Se6$~8aIF$MMy7 +x2Y{oFPPb1t*3o&_r%nr%dkNBbAgGIYY3@H8bMZOotDIQ6r}pUC%SkgiI8`&S>03$zRPI!c?t@-lUjh +9}yV~*oasxq7Z2>G;Dzi +4L)0wA(X>nH*rqIo02uu&N3w0h^ObR%;FhMZh5WPv(4wJY6`C +N@b~z53U%#p<4FHYIRhpP6Ld)0q`;>_NZR=^3-(Fw$N9!HHR9O0c##-fuW9NE+~cmiwTvZFg2|}2wAe +_c?DHfo=38#YdgBG=mMezhy>|N(vnJQc{|T9V3($wqb~OTq0>W1DD45f4V;$}&y4%St>+Mxe{io4Ah) +z;r9pd!56VV9(QHUhhX})PW_XRYffdnA(Q}rSf`su;ruwa*9j0Vd@uc3a9V;R;H +_i-Ee~g^W{sK@-0|XQR000O8%K%wh9WLn?vj+eG2^#O}mg8LPt~<@N)5QSWnPL(YXdOdPEZQSPmIR7U>fN@_vd^+l)^m<{wG~g%A4Rb +!5yaxr;o)~KBtP2uwyuO^g7@=~uhD7Q9jK<-X3#jehr9a*^H_e8AqMTb| +wSYJ7fM%e*SnqSp?IR#j06J>)Cws27dg7hJ!%!H#-?5VZUjo_jsPleBDdHV4pPa9igE4|)um==b}*;K +l6jr}%y`8opSDKkM$@GKfBT5z^zG6$gvp%i)iAcf(})^WB2Re6nD}&*1-;!(W$S*aMS;);N#8fA#L=+ +nZN|UfApPRz=!0EV%|Kx77nL1M7Dgm1Mk +$S|_f>rfH2}GqbV)XPvQYNGw^y$^uLHcx2;;oEMp6#lXYyC5D(uj4{SEAV32Q)BqzAY6nzIt0u<)L1a +eH1oW9$l6Vc3x=rQkJ$kQ-E?VbhmP71pOhb#ck*Saa#vwNIc4*YpX&H<{qXKggUZb!P)vj&=tC6o;JM +0VNfSm!`9wX!yo`JG31IWVCHww;sc3K&mL)`>@|J6bC(4kLRe58VT%*!3`FdM;`<|&u&gZ{Q39$PVk6hg^XKGP2@np(Im~-~xW +oD&yFlN}C!ZzOs@GFf#mfp`WRD9^&ytNe^L<&(#YT`}o2YnprQE)c0b1rNq7~dzog3MOkzE+srIB448KQ;_IfX+&CmSI{?H!<=#ID!?pNw6x!9F>2#R +mRl;);z2lXF*WoS0m=V&li;(iIz5Cev2zdvlJk*8;X>EkMA$T;*a_7#X2`^y^z!5DliPI~=7;>0sp4= +KM;7o7$XDjm+jeHesIHq{k-6Q=9eJgm`Mx9-9D9ZQf%O-lDT061WlDv=>7C +{h<#XK>-}p>G*m?*wq3I9vc< +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 +kbNo*Gf>3K`uj=hBi{qOkIMUWK6B`MQVne +!`U6}8gXzw)LW%fdT|kvrd#Vd07Syw~B;0w(tH!tlRs8o77)lOFCpB}r&5&rPr9`?}h+1O}Q+}o`r4^ +OpN4EYVQkVX_ImLqTAN` +=?L8V$Li^waK^$WbBTRK7A?2nimIuu{OX=}rj{a77IDX^HNlU;-ss!WXCBv|eYq(KSh`IX5p7p%zMMB +%kBv6e9~X*XJo}77&0_dPd3{NhOPi%R^NmLhtN(p=wg7Y*ew-AENChm?3Z?|Guj9Li8VUwQU}|p*mk?Y(P)Q~$NT2(?f)@-ynNLjX29elHjU<;LE4pD80+{M +0=Avo2p%5TB-I!)>n)ItA4khf`B712nbY-6j^?DW1oW-RG6AtfH2BvU>bj(@{_6nqR!4o}YiI(J@HzQ +HK?RL6JPqMME2R$obN0#ENt(8{vc~L}i%eRFriBVOgqB@l*N3C?U*7f1c`}b>(ebO +bjw*DvDI-$c~B~)1yKo)e7t(eWiqrt7=(8+Y2nK+M-q;M)qK6w;v?_G_?O*avjT3WhAMfP&IrF09g4T*D=6My0 +&%{3~(e>mE**cdO=9DAf^-?!c`44Nyx11QY-O00;of09jjBE8c6z5&!@rM*sjB0001RX>c!Jc4cm4Z* +nhkX=7+FV{dG4axQRrLm8Dy;NaHkvC!q$i^-WNu!6sJY +GTCqS*vq82ghw7&?UO~3rm>kBXZv6gE;f?Ki^DET)_U;zUw^v{p8b6J?4Mu0deITD!mV6h?{~56h}XL +!N|P||2m-WtdN{ns}dplFehL6J +p3ztHraA@G`E3NMqpOb=hld>^Bt!U+nelEl}VwZ*MZFnw{6x9DgW-S4qQ`D~&^csN<_Q#^c`B=1CEu{c4M-z8BBh +p6eE1?VH7Z%;D@(ZVdH+y(h9uQI|B&D}Cxu4NV&!jn3DfbcWh)T|iU2+*3y$sKqm_a#*)20z(XV$PdP8pq9PE6bkZElPfaAZ_ +f4G|dIg5p}ENyAz+pxJ|z8SS@$J&waOixnh2?pXjNFm^P>J7?<144L|NL>ob~wcBTq7ZEmgK`88aVtH +clAxa^GB3LUW&BA0&lV_t+%){^uk!A)GRv=2ga_Nb&J)|*doM)n)Crb~IDYdaC+60SDm=&4avlC86w) +Dm$aOg}c21|{=aovfrMj>Ua_vGZP1|^2HG8bufVhVZ2S*OePp*X%42y(mPVENtWoT6XwYd=@pQ}45``VZ +RCSjn%eB$Zo=D$5H$l(DuutNTx7AU+F4~XBhc99!38PNoRHlgO^%Gxpf(HdbDA)1&LgB?llfv(C91-S2#UTKvW}ZwQEjBO^E8xIdo`g5~jog!w#?8x<3J0 +#JwjWtl^>2}O(nKDXQq39F{Fbq`Xb`3tFsXVE&p)ez8GGhB6+ +1-Vafm>X9+)&(Mn;B@Do#j1CxA00f}4Cz0gMT_RRGjxVT|y;lN`#R&PS?}OLS$jrKxx<_cjMZ=7C|R^ +a_(@88Qd`N+2p(?7KloD{x@)T?v_59?1|Bb;0onVzQncFnPpe4deU_H)j)eeg=*m=VF-4sPT0k)ZEhE +V31~)iXsM?N*IddJc?N^b40}5(C_sKR+dj;158q-Fc{huRTUx+X9O8qI8_L&$1IHO<*FdS8WYG)Ff|Z +h%?M1>R0xQNjPgOyHMXZi`HdYk`Sj6hcR(uU44%Im8EbhA4y03u%i&!1oy0 +3vCQxL0TTlX~(V3BFZw(e^nz#`L*ZQa*E@-QRE9NW4tL7&|o>2G0{%gZcFGyn4ALQ+TH>XmM!>XRiwt5=k`DRdy7cE^9lU^Q@=C( ++{9=TW|k!$VF=2p7fP7zk)z!F+-3vO@Wpp2*iHkPBmT$MOarDhT!a6+NyR>j>6~H{_e$~@4tb;Bj*IBwxmggh`3|s?IB3JsQ3Vk)lgvciU*he4Wn2{)vOf;-GX +Bk*7vUToyAKwJ~4v!F)74z*<4s#pJQ%vZ_)UwZ|R&G~3=Px-9P;7Stml0a{D73Q{icidkHeQ)3{v5_R +Biw|GTOM{7L<*L?S7g_U$c|dYMMZau6wZ{8dy}=w96FzLZ40#Q-L7uaa}u{nz4K!?_!f~PzGt?COBb^ +OzGz{^JY)d(niC~!&aK`^&|@+_zO>n-$Cu{FeBa8ocPrjnlixpx7abA5lohf^H-sZ%!0)C!o)vXd{-v +B$-X%H4M=t55j>jaFW?oKfq}*L{{Y4Drm@XS3b8)>za< +~Q8vkXr3P->|+9TfXiFGa<-xtKn=i7@u%ks3Q0+|+c;m2KSV>iI?%cTy&z_XJKGz|JDx=aAqZ6gP;By +i@!|2^O>q>BfeNhCz6@c*9C)zVbMGd}5|*6&f0Q?$>t!T1Lt7gXmA#G!2`!QpoX?xhkcq72R?3ser*2 +G}XCh$58KnYno(PR^x2c(5~Pim+fVKI$bGj-)5kFGKyz%*%8#M1iyjW1=et)`Xh|aYos^7%SCao$;rx +!pYBF}?6652Lc39{M!(l8a0q3KfN>Dp?Vyx)2ZNwba;ophc)NYd@V +f4W6^FoC_m<<8cqQqzc=U$}x)vD(KHe +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 +g@Nu~u&$8o=%RwQ6GA?%r7r*UcqCqj-+!A +;0-33?NV+9_!qzDvX~3YU1Im|0@dt`7ta8pc#$?U8`l`7h>7$n`tD+(u5>gf%TACA2acJ_0}Q_DQ_Ol +&{Q~GbXtTlQ|#7WLr)$Yvd78=X_>N9FwB-<UHw23k@i>)2AK4W7|j(3>Q&y2x+w1c9#HyPET9)$RI +)U;e$Zp0$$Q~*~#E}RoU^-&;fd`aSw{*fGCj;0B5er~oR_I +z|>kaJt;TxP+H!3QBBQaIq`JjWiZBrA%DalQ*N{NkZTlzMA-Lk`H8fKqQSDm4`Ps)ltQrvG*JtGium) +6!#o8egu2M)vmc&7&(TS0?i8wVecYcur#^9BlC@;a<8iH~ZSw)4tQqQD!>r5m8m_}NG|_4Wvh9!3!uW +@mzGimI=k@$R#Z^(Aa6IRkOg4--PNC$C2qaujbTOg(&)2`Y}H(Sf1Kx9A|>DRh<%ZC1ag7&i_@aNK(L +u`)P8Eju&fJWeZjjOF8VrUiWy?bHmR-((UPWu!U?cG7W*FJ`XE?*iH1yos!Yb`RGRTnqRj0?w& +4fO{3~PNr&3W!o9JJ-N!r%~X-D`8t?6Jn1S#>z~Mf>S;kV0V2p)>Lbjd!>eRll`1bruD+#x3e +Y^;GD-f3oV%hCEEe+9?gMH(g-g!-=18f?dF&v_-6R$g>b4}ErDSdSl){ESlsHcpEa1iirC;ALN082Qf +-|D%VFcvd$WvO-z-b_&~f&8mii=kSxob9r(t8~&l|u1=$D!oBx|(&Cv0A%fr*Egxf#aIbQgh#tnX8V?sS^dYEjA0=aH_ARSSz{fz}bD*LmPrs&WjVz^wgik +xPC?sCgu@~8$|t7>V6Kg@$qgYN5 +DlsuOE9hr%J6MmaR$yrB}X*o0iP|BCGavaL3(QwjrUr_XoEW6>%y`8}(&(q1NQ^~aj8^y|DQj>jUp*H +$HK++@``wJ>QU91n-!tIEG&19BuUJwYgP?mRog1lHO$HU-rhvR3th&@}H2TxPKxWcCS>T=Iq1~$S(V{ +0%dX2H!dz44aIFTI?^7&Q1klWXx*dO0Tl+n{<;M*Qd^IDQC#p-6I`OTS4C_t4Rs)}(Rl-tMO%Hyz0Hx +ruyUS@WhJF`2uyETG4>xV7}#Dd{CJNDp#W0fVGb4k +ZL0G&6eLM6&A$denlTLI)k6#S_!<#s9DAH9EYi +Oo>vf|dA{D_oYHpeRIx4eP!RG9HQ(sE-FBQD*EBx +7sQweyyppD$%%TFPoZzXmDcNgs0@N0;MP2K%kX0JQ#jhY!LQgeqE&KK_Dr0s-$Bi2|ksq3}u!KveWHy +mG{M>AW;VK~_v9XAX2FHlPZ1QY-O00;of09jiH|6Dt1R{#Lc!Jc4cm4Z*nhkX=7+FV +{dMAZ){~QaCz;$Yj+zrvMBmpzoLg(_n35O+E$X8EbTCR6kAC&+m?JKd9vqtyjm@?DRoS-Io(Z58ZGU0 +f5iQT=a(GR13=-?O-gx8&OYHxBA9>Z7!-jn-+_6{otS +T;%sYHm6u6&Hc9y5?l&)n>UZ5#*`&G5n~QQvWu{q^P3Bo$=d~_t9u1ROk-D!1_1Qlh;@^|Mz1d4&e82bNKlTs4q +er`o8~XAho6obec}~Ax7L$g)?W;lA=dX&o(cj?3oPNB{me4BwI8a@ko~)L-&f&5t%7rfarc#5Pl>F-? +ziv$LY!w_GetWx6b?NIQ(`{F)1t2b+T;!7v)VaYH4S!iIN9o6WF)gc6RZK2M>0&jXr?X;i@O<$0)vNT +|{a1TjWn|{Ls>(_cS96hH<~*mPG`}o=EYd1p&K0h8QTM4SdJQkrSy`#s)X3fEmA^mwRmfT29OK +HHqfFH*r0{+mYs=R4#Ofmd5 +RLdPGAX`iUpeae@Zu+cfG6hQJ_f>wb2wcBC!e9KVo|Mbn9czlu%=;?OP1R%krC;UeFi`W3e(IOaja>} +K@MB1SEEAzJQ>Tz75;Yr_g<8%jE)!kk<=(fuZ(p6HCwoV)_YZbor6=F-z1~xR6@l;l=bOW$6aD0b>z_ +b%1M}K+7Ffa%{}=sn+QOPc`g5$dgb!O=#mr@HJIE(^$y^nR9b6e+`UCw`G+USR{M$Th6e-lA!o2us+I +pqFi&u4{O4k-I@M~-9FK^%cO$|KNNO*Dh>h0@;<7AvXfBr@A_SOEu9=?0_Z0m>pgO`Utz%R9PjubO#f +O#b2ane)0{%pIqwIx;oAVd|_%lzFtXEL+W+o+>)e +XZUxb$Rn@dTLn$Qmzi3U3d-Tfyqe9+s}RhroKLZCRW9LgKA#uMx~Sp1;w)vAtLj@@xIrcd<%^4Kah}t +};6A&xb#SOAZ1>>1Jq1=5=qpa%R5w&EJwAE4e}K&T;E<7&rgfvliZmS&W9$!-sAQTZByii|)M~I +hA!2-7FaR@-d48TvZZx0WNzRlItn2viX7lVEJ3}uLeqmrK1g9ZZUl)twa&>7jYjQmR+gRZ-{3x7ob5AoInfgu~BHqPVjLx5p20Y9%e{?nemXdqWH$b7 +hJGs-&;Bp{l7t^3h-h8qANx^>>We{m$73-Xp7BL4cI6)CamAn}U=t2FJqj|V;=Rc@+I#foc=sa5@Zgh&|pc;sppSF0tcCi +X{Od?V3!o#ni5&!J1wFzx +-_Ej6zg8jxb(wL**5b?J8j4)A&DPfX)0KQ-R68M&@C0H8X@@YeJl +`8_1SpI1uXae%B#+-tjG-Yyn3XAgebe(wms}ZWhJ~k!9sa0_J+~MJbX_xcENc7=MW3&;e|7ND_VZ0@n +@J%)vpANSE99)#KuIQ+kT)fEYrmt_~tiEek0XX{+t~i^EtWn*&NzU@*5nNe3f;EvDEP3a5Lw2lXN@FJ +-q%o3sHKiRHFrYZrJyYM+dHMYgs5_Tcc7B=dsBKuatppnbcQhJxjWTFp{c!8m5;Xg@qj}SJIMHDmWtu +l!U3CiRz@knE|uM|lk@`c20FNwSL?VQ0ckQK6g&yiofDzv1CXtT=%md|;Z72p=M|`2 +H5K|+qpu#&*6qY6D#m8K&)!9t#5dK1RFotz@&{E+Y{%7c8m|XL&cVjoa2sTq{c1)n$ch~CiwfhK8aW_ +8`(p{Wel*<)idwZ?-9^0c!#UN5eXJdUQKjJ5*1n4&jjf5+p?tHPjM6&D)1Ppn2-pPojn4$KshYV~GDT +H^X0Lx!;X2xH*O9@uUgjZSPaE+znJq@r8RYLG)+L@2@JlO%}v2*%gX!N1qYR<V&MItm>SF1 +XnuITwm)0l~}PWE@4O_kR2^o&2rU@^pHB1vOn>y1gM)E>q_2x!i!KH1DAGG$J9RF>T(BIyrWL{T3Q^P +<>yLZ;h}{}O(^U%aE$|O(P`$_la%f%O-F%czxyVubHi`dx^yahgi9Dx-Yx2ZK9hi@Db#x*ZN%_f>8-^ +bJlMF{p_^fz=i-2&Fzv|1-{p-*sz{y$#nHAEGq-g<^Si67%HS@^*_i^RgPz310s;+1_Ax8aE+7GUXzp +)Q3CvYJ>N((|6Rdk^RxMgu@KO~!o8JH}D!d*8`-rT%AycZ+`UR@$kv$15(N(Pgc5?X`7exR&+B~FKT; +x^J(1o6wYPid5-#sR8#Dx1wJ1x9;U9G3l>Cjg#f7z93}uZR`I{SE3nnx#S^R5djUZHlR9?K +p%nKR{e-xE}9J}4h_B5Q(Fr@Bjjh^A!LCM9Eax4wiudN)rLIrg44cLyXJ@J%ZKh6WY{*A#%%oo@Fcc) +lL|{KJ?n~?}$x9#V?gbzxwRIEXdS|QI3!VJy;s!ggFRASw`Afs>?5;zbkeI3D(bD2`5zJ5OlYUgv=1}&ZYHGy?HT42 +5sB9<)$m{j8c?D`wkO8D$Eut6*J13eq!cTY?k^22;VxBl58$>wUR7Fh#Ejbt*q0e7T=_hpaKUHPJz=I +LZr)n!HeY)Cw0#~Pg~wDx+P+-(hW6K&vqlKJH^F|wE)GcNnsk1_rqOa@*GO^xM=r&RR^{#ck=>?FR1g +2!vvgc-PFKN1r$%9{W{4HXBNj(gHnC$<|qJSE(Y%^GkTgKHPXR8nfGk8*W*$kCNSdGD{$$XE +?<#UQyj!^v7)_COJ_h@@JW9+NH|p+ +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 +5WSf=s2YMh9@oKb;=faR5=!pII?I*>}lHF6Edr +_{ZSm{m*@pG!+mj@_NOT9*N`j^yQ9&xH>zd@>$f68a4w4n%fg~7$w3HlGz73IRz#bEdBj9a)1#>9?{t +nWpd2G2wCz$GIow#*(MTI@iX!fP)Sy)Yk=vWSaIWH8UbG4Sc)~_n-C@1t5d7o$x_T|c<93~*Kh4C=Yb +{?2;)#=5}@&bHBv4b$*@N!fwv#KdzCH8wyJS~HF){|L0up0zv7&SJJ(u)Kr*n|`K +!SIJ*>)KnO%9y=SsJOP+CL<1hCd`n+jm=@DpF%bk(GlT;-`)?h6pFRa=T;pz0Ns(vC}mwooi1ou#o?@Z(~xccjXfY*y>27oR96$;-vvL#rf;l(jN_G1b36^~iu!jNXFMlfmSH-k?5X-uHh2Z) +0mx4mRlV-PQ}=r&;qP2H%Sw6VE>yJm%=VxmsGwa&^h=c5GfT;=kztc^hz?OFmlgjVu^Q_8my^pSjJz? +wq#F1f&qcLzIs&pp3M=zJ3QKo>DQ!q6SQY(C1COGPn#coJPN;BoF(8o;?v5bZ?asj>tSC)pQJ2=UWG2 +U8b!Y7q+!hP6Fj8R3Nw3jIS=VtxJ5vyeU +cSNeCO-Se%hVYsmCnarnl_OK!3s)xxU}wc9#T +z@Wx%`mu^uv%bUwh_fe+(dslF(GvY)m#k*4 +*Qb!_C3cRj`;(v0=G!;8Hu7vwIEswx0IPoP%%KMZT=^k43qvecSWzFv{#)?NIeH&px0_z)iW*=HAjKc +5OU93|iYz+-JF_hituW8bvF19o@GPK3jU9=;XfA93KtWS(z4aUHIszd!hB-KEF|ujCKu-vM%$>aJh&h +tc=FjIDrMn{MTdOmPq2Wf0RS$R305oBu%=R@VY6HEqIf=rkgT=p6-vC#d{NN81a$2{}uy0P77E)XzNG +gC`qK4t`tqMXFR(ZIFXX?K>#Pt^mA;<>cM1S93EQ9p__9#2ua>e^LnBVTNn|hg@KVaTo27en2mX`6A=E4{$2qAdY +gDLn_+^{^a2*OLG=fZ`Xzm6ixT)fE6O5V5u_gjN$qEAr0Vbgmhsi!*yFy{nWWFhyki0jwE^ySNZ8im;B;T&4=fphsr*lV7sJck=Pqz=nLd|)aUSjI^H0_b +$jd?k;uVk`5r%Sy;H8C&F#C@vU=TCSJIoN>iRdRKq1O#=q%!*6omS^bP)7&UA86;6KiB}sxl*|@2Iiu +7uWQgk|iPJV6?I&*R1LzKWFAlj&kage!^e^8Y9=+HjW&)GBLF3kP(b1^c0&u}PDKD35H>1#S!G-aQ!` +E+iPxilgwMW`FF|E&pnu2MYDFx7G!Ae~C4My&YgXkU9+Vf~@_iD+%IuS +)D&MMTpY1t$>3vF-N_~MSfr|5bcmGOSS=`ce{|30=-=**XUI2@WM01whb%nrp-7P4Tj%~OFqeoscK*+ +;KXe4XAH(l_1p_$dM3?nD16IbVGv&Y78)pcR+MlnQ#31*w)&agz^1TwWeKbk&n}bm%Bw{$sul^1GZgHsNkiHnY(fs&eWh&zeiUz_;#W_mXTJxj1vno19GJ=fj{6^a8s;0 +o9xmS_q>?^e?xJn251IGt#K6Wn!S|U{-80?x^Tmi!9}n&GhOaUvKE9N1X)n>=G{E(&Lkt>fh1ct~v- +EzCC&K_C#D4(@r7F$SoHca;i_Hl&**&dnasve=?&PT4P`exMh%p2Jd~Z1^0%6H?01y+9nGn6w>}N6nn +`qIXuQM1H8a~QIaL|dzyeh-26Lc`fUo_!;1T17TlfI+n*%C9C +G9&jDMpj`WaqHf_wlfsAZk6rsb1hCLH5#IBb6TY%A!14x>=1Wzxd%#d39qA6;n5sU +RAyc*)cMH&v3_ZWU{Ryf4>u8l9V(X7WX6p=Y(#tMQv^y;=i1%} +#wqf3lcXD6U+ej+Jm>!6BhlZGNJ;Zlr&W)lz$oaW0C+{&uBElziuG?-n+9Ba +@;9|DG~Vn_X_o8@Py|qysBjiq$#Ry_7fhw%vV5;y +bFpd*MuGOoKuP0#Vyn;Z@&CRly&}}I#P{=qr&%v?+gIQ6w(hoUCZ&EUFIq%-MsW1IEbW7?)IiaINF(@AQl}PR^s*DyFTen7g*3fXN7FRbH7>Icpk +l9^bdm`lTwU?roP(A`ix;xXEZnBouY6}2BmwPrZlkhpU#!#dl4yukPJc3IVjA +JCOTq^s?ueab}J5id*w^6p@twk#aXA2x +@fZAlu%8wZ=)En?NNQY$Ji_kpvvREu&zfsZ#LeEs9INFR1f8;n43-n4@y3ffw})CnDNlx4=xurlrAe7HdI1%=V3U}pZ%e5Ufug +&a@8SZ +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 +vLQm_gtIRSGnv{7OLs`WEH97b0!>LgGzH +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 +S<^1iaw^=v&T@MV8n*Whl^{{TZ +?2uKZ~}ci58j&%(*2Oow(A1i@&rG9G{J9j1QC!C$>a9|7R;7fC=4=yn470T1AUdRRxmi~`7ZV;4JD~4dR@wPwwgcBk6 +Y$fDON@9`#MSgg5ns1$MQiX&r~gCuv?Zogjxa8MuA@`<#2qep>_6-uygdBjIQ||!>iC_~!cHk`du?+c +#{EJBbnKd2yS*j&5F1sXL3(7Kia_9dyMGZk$F)08UH2JZx0{sLXSMmI$0skXp9~}eIlCC5eQzHze3(y-*V46zDlEPzLE%tVA}%QYPHW +tU*OP;39rJ`~X|u{9wibcvQxX64<$t0h@9PyGAYD*-JDInyWc~Rh*()%=Vut<}N;m=aeV$#yp6>3?sA +vN-q{{5}qfXcy+;kIWwWg0+=sR1TJ3?Pk*Q@-qKYjV9(CaP^;9L!MbvBxmmrn`I(+U4YQ1#O8a9w*PAZGWCTeVTmUO$ENB6Z?R +!CgwH|5GXRVE5V=+EPS@OT|9)y)xpj$Ldm5A@jk8dmmG=jAssCo~`J=Qza1 +Y`&^5TBtO3l(EO%aHfVVs|izCtxUzEuwwDCl-5)UlpGwm2t)b6>fu)-sUpzswJn>5*%J81+1nGO=qWG +6%tKFgqNPP$)_rOUtHX^6*$Vn$VJ)s72RaT%Fm4x#jriLo`I;KARZ&n;4zDYsz4GJ)=kj>IVdl?q^1& +dZU3V7niKkPG&BR##Xs_ZTf9(E@SKBDeJ4{#KnL?Tp3Xa=~8e$<$Hr|Q8TV{0)cB`#M@OWYohC0xf{lkd=oxjFkl6nQq+G!k!+p7$cZvnC5$ +l31r0&Tae5h}#FG%!fEJ|vP!o(3^)_Zu+3{ZQ+K?=_mssfvnOzrn-DqgqjaF;{1ZWCwKqJEz$0sl5Pz +Ua2NO77*h(pR2P&rG0Xed|H?|yBCV>luF8<<(Znx995oS8|o0ZbE;4_h5Dy#at-H!WtD#{%2hqTN#t$Xa1DIU%6=9NvKd|i;gEwco~NhK3Eu#Yh8=;wKQlEz4y%hKr+6V0{9cEM;jH)5kqu3V++4AGeMS! +EuqB}328-o5h$!QuzQuW%ZIt`r${`Gz=YwI=J1H55;lzSHn4D7WB4B4T!L5wqF2t{H)?Kk^Ni3p{=L3 +?KDx!i;-;v2k&0~z7OybnIoF52{DU2}E?X|*GZ0&B+dl@0DwTmKZ*d~30kMZ0j@GR1;83qIaLsk)#vj +-xlX{iclhU8{HturOC3uXisF_aMT-h3&zPV8VzsBzCek|i#C5rd@?3Oqj}vqIA`&WrH|z8f=R>Qe#6R +KHR7rqiVU(%en5C8_X`I~8JOjQ?v2pxFDuXo(Z&Es4nOYK=P&QXh6Q_5o(@0 +st|wg1nZ6sJb8UT+!H=Roxt-*K=zQ<#o2tS`h|X6>l}NF1qUSzS4qcN#4MHXPhP+J<@a!QTXitvB`p$ +f*y1+6%gw>1{MTGTVlF~!{BP-bZF~y&5CUi&CHo7|WTE9KynA%3z~tvuxmrx`9)+j$N4Ma_W8NdvdUO +lz!>{@Rjhyre@X;+z`9+>LcaPAxMp6Qtup+UN1B&V944Qpdb^ukUI=I(T@r@zJqQ1;NsDjAgf`QEy(V +%v#N%E{N$k1c5q66>}9K2X!A5r7n?V;a%etDKpr@6M}BG-!Syqg8_$>(Pgu7H`~)c&SqEDd%BW+B3Sv +qL3liuzhXN=>aw&|lTg%e`-R-@ZCYPxg*p?;q^GN>9Gud%Y+0A({$NvI&g#GfQOU|!eS-aAG1K-lPS+yJx47DzH$*yWbg1U +rwUq|{l!}amVX#<%ZHy!0(k!aH^ +f&EsQ`wfOlUbr^BHcNj?hJQB2AgEfHRM`?PMq9EamJw2S|pVj>?bm9pzI!vJ52hOK!qdEF3iD_M?9K2 +4tg>=cN`z2jbWEBkZTdoX3Lzrgosx1|Ff5#Ntw4Stc$rhv(I79Xi#xV{gh%}fA~nAm@sHD_{*g`Qn@J +!v)Hvmn}07<98g>y13@CAYV?7S`R}UBrFG-G;zhlT(7ZBaV8dx}46xQ?OBSfAw0b{cUd +v0WJ3uVFDO8jfkLjqDS;;Tm1!*I_*?GU|HvNn5?2|B&w>(mU;U9iQy+|JOWGk<)lY7P;@Ss$B)qajwE +!AJPecG6FU1zlsV1CW4Hre?Of4emK*g-_+qu9;c98UEPq&N(}MFq7X?9QX9#P#rI+RG>n~Ju^>agfGP +@x8mgk|kL}Sj1mC2L*c=-J;Km%L6cN9$B{$S^wIt-$*{F2{yCyr+XL{`tcbT2%_hiZ!5Cgz@uUG;zXA?(Bu +R{@d(ywwe-mGs(+mXyO9&p`&t0 +2Sg>_F6Yn}>>LIfyvRG7g#J+sQS3E`yPv_H0S`Iij*cC5dTNp+2dhTSrEbXOpur+a`nZS!;-GMcYP1} +lmI^Zo0u&n^ko#gLD-u+Ku;@o0Rg0E)n4)G!x|T-2Eh_MPQ&M)n5h#X!48ko!Z8YH4nW+u?ks=W_San +K9yOU&Epo!dq>H=~YrpDSJV|(IB&$Ell!RagB#1n5 +uFG)-pMTU+lj)KIRQ_m@Ggh4v1x14{%4NTe)V)i9G~<)p54GR8$FGgXr~tmeu3{3C+{u%%_@@xjIRq6 +pZ=AO!E1>)_ySXBULAJTZv9vlWcO4vrgogR2|HPZ|`hb*qt!f(#La|Z)u0(;e=e8d-#I#N~l2|>kv7B +Gd!gsPGRv&j*dt(u`3o%9|P?2u|$-4hu__E@&tV2R~(YSdxZv8F)yo@(^)vdGkp_Hu(V!NpRMUJrn#p +%4-d7d;*x~{&uS~m$>K4llkuF{&)1H_KP`5QLqiKj!Y?)*i!OfO(HNaj1@0v=#SB6kiedA&VG@qbK${ +j38yy2ct&3?|ouBnx*h9trJ|D!XX=F4RN}ikVB)8@m?rSbgAI{48G|~wlVh?!UldD{(a+*)u02WO)FD +4s<VJiIf3eSGgf-y9yD@NJ1WDNHfAj1Bi-rRj^TN=+>J?Pu-_T~U^L97+SG5}sHLG`H6C +(e}3Ok~-a;7mKvP)S%D(#}z{eUYwOpQ(ng2KxneWi3hoallJ1A+xYxh@ItrpW$?x{6Taehz6{&Z$Z|@ +4>b4eCGRTs>{nYD-KUUq69QvmY?))028G-jtU8D-veMRS~Wzp?wUn~fPmaRolHNEbVgB7o(JAZfr#R~ +>9&w&5%#MipLqyCEx=1@fr;&YWNd3uuTykmH3UYym-V4vqzChs&xT)7W1Ad}wz_~iK?pE(O1`UrZCw8 +_rh-EM(_d2zrjE47>}lgE#+;VdWyvXMFp+?b6%W{vgt +gpKHF|F=hT-hihwGekYNy-LGlI6U_^=K+MRJ&9oOz$qf=*Z>PG{gPf5k28`o_ZSnIrR>@PPh4h-{VXn +bz-#p)9EBmK@;Q#P!W5?{}CkawRqTnE0Y;nlWqnu-g4bROfoMU;K;3>e`ne9(%V6~n@O$xpE|iiO#`q +PXXm@36*u-50fqMN69OW0b+bk#Y? +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 +cL5&y2I*fJkXIxOeTX~wNGPO8(g=|fu} +uJr-!Aqq7LHaa7ZPN&Vx5KHE0EhXN|q3r`Pol5KIvci{kMbB8yEUCj_EvRE?h=|bYUQwFympA;rKR*c +;dqAD4}u3;CUHau2>=q#6C}?;BlXaxGNvbwkZy#hOpC#7InVe4&cwA1w6@k%qnPV=oTO2RH6i#3lo-v +OiWm|juCM>n+$G9e>|E^#zXw~(w}yXl<*4fH2g~!;48Rbajb`bG(#Hvnx!;gdhYyOPyWb+i~`&$>D0h%OljCf6eA+;>Vbj8L;lZ!{hDX8ul~j~ajksG^idiR{9NCkz%`R3;%xpy6 +1ZPn}LN;ZOU$n*-dJU9jH2r$u);;NC9lVm>)x!Z{o)SA+xg0!=X +owHW{Z=0B14KDrTJDPYH +Vsd*^&_hZEU3Fn$wtdvYPrc(?FURjj?VB%-Z$`&?*PC3n@9!Vqf6?o|Jq>Vq9N>EVqfcgI^yA^}b^AH +KKL7Nl$u%ausZRzYG8~Njb~)ajl%w3gabdgLzD3^Oeca&RO>R8(XXM>rgoYrq!ECq_LPj!X11W^)6LhOvi3pYPg*Hpo~ +T5YRTy?Y0K|Gm!WJ8k4DB{_g9rgzmXWtA#^wxV<$z)~4yXc|eAfSJkaK^s>g3i*opM(_7pUI`Y +~+Ng;I9~~i;PLHw!AHte=3*D^@%?59^P+7Mk~Sr`1}_ZRQHu}Ug%)Sr1243pSHN%)*`XarAURZszFzy +zyRIU_vqt9EDpgwn6F^&)kh5k-@{oE(KVu?2)d1kbe`E8=Wxy0mvsAINvf^^8s(^%w>QTH+%^ihpCM7 +x%CnzWOywN7z9Bu~>_l=zh}Wy6>h_=G^626!5iHT&6;lP}0#8jHi?=|-Fn3l(D){3mpDkkm^?`7bsTl ++8G)F_h4QFyrHu7=4I5sLr?Ch(x?gPpS2lld$Uu*K~73#Uc&du(1KrQ3X7#@&>@)9P#g2Nx^8D>bV{sjj{fJ8fzVVn)S@TH04MI&!l>F!rSCsoTUh# +@PdZB*qfPhH9btl;`AMjUO?aC|beCk5k#|t4PiZlv%JFDFyfLiwW6NWdglG}Hxh)7 +aLD2=x5FufYM^HW|aQ6Gb{1`>-nBE1M=BXM?Rbp`MZ1t-$A*q!-axdorcvq<)L)1tNk6+ZKfasu7HhAHY1^sJd-{#YwuYSl3N+7_I{9(DVDYs$$a; +UX48T`=5P6w1rjc +38vV0jiihiF%a)c>D&SC!HMABwfb26Pu7*~2gl0xi=r +7m8F#Dv3MnzweOLjUpvGX&>5}=lc$ME<8M>_EMBcA1lfWM9WG@jXuy^FBW?vNR>V^(h6?PkHzA{$4~G +7_^nJu|qd*9U@3s9k8Nb$sDM2d5~gs1BChV{S4W; +_P%>hf*fHJS$~@<^8oq^_Gpy8$*+fbqpJ^}oQbSSbNMrGVuxd6XI;%xKS&3TA17t{8i4(Qa&s45|uCxzNLNZR|TAyd +&GXIN>^vK>1#TB`9KrgFj-)DGz3tHNelhfr}$2fzQk()fD#W337sB^%qn*HSuo2h&3&PYGso*tQrPh5 +~ZLbPV1|%K1>Eml1hdt8+V|^QmAoU$AcLz(5Ziht1Ur=MYx^7YiA +gY<%*DiPDhmX>#5?_Ar?0NM>f@b-4|Xk7ipBqIE(6c(AM(d3vrQguX)xTr}JyLaAmOqFqnV-y8 +K43fvB#q7QFOlYR_Xwd~{Mx6$K7x5veq^`fq6(9kw&x*VFIntpBCjCd+}1$m;WwZJ`P+bhn+5S1B~aT`7U)}{ZpRlV>Ms9PVl{+VrqF}zaL(>o;!_kZzeG>rk2TW%ENsi&46Tr&t|k +ICKD@RVT8hZa6HIfwyz*eK2MSjti|y+2%@4`dyX4~H&D!JaDW~cXdA9-%fRl^wuam0_pHtP5LuqOfD0 +r|`rJ$rLxFLF5DX7^FX^waA^)Pxf4&bR4IxJEXq@8%=OyI!o2{>W6QlXbd7r_o*5t*AP7L%=9K#`=xG +ytV~tH+o_}%d;HsjWpL(W&%Z{$k#F`hD;F-xjyLgRO|70oejmx3Olemz$I!r@`MJbe$a;{W`8|mxl?8kx=^~MjOyb^<*7IH4(L6mhd0i)i72|0diaLyX@PECgj@ei1(ut +AsUtONoP`~SQ5A1`0wmRgNJORS7It@7n*EzY)Pa^AZ$-~wAErnl@?uzrcz6B!!qm#J4;e0|1;$<&$6 +IBH{TjKe_qq1pVzHoml-W0!EJK?OT4tH4@>vEfC_@$0!V=#gE}%9%5NT&~||!tp~6a?{*n( +q>F4D%LHO;|OURZ9o%=*_LJ5|9;V$ +yV~7eK4sp#d1T&9c+*OyL3W5=Zf#966df +Fvbfp4PvLWO=&G7pq%*5*J%jyvi0u^c07;nJ6**MNmYWNounW(&vzD!u%;+ha^sy%P3in4A;77{QKyQ +oSP5fnRyt<>0=knl%c +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 +Wsd^e5a)(tYPm@qR!A-c$>efPu+h2P)h +>@6aWAK2ms3fSzFV)i%mld0043&0018V003}la4%nWWo~3|axZdeV`wjEX=i9`X=iA3WpXZXdA%BIcb +i7`yMM)mbZf8#LJvQ}#;9(#J?Wk{=}EjNdm^+LiIGHtfHEkuYP-LE@15Z>l8|IK+m&quGxzCq&O=foS0Ng#%Ex>*bSk@%}ih?*g67xnzZ?j_hed0w;at$L# +M@K%L5O*BUM?pm0luqfbdcwabvj{NKh;HMzbwuE!D9S4VOFR-S<|CStctUan5=116VTOS)Ar-^M5yyN +-vqc&)K?Xlalf0oz0Y#QUHX~jbmbBi!qdriZf|fKj3hw+n<+O-$uNa@=AX0M_4b&Nj9%JNnFr9_)m(f +%On`x!+SGn!T$YYcU;7Od4S%tt1WWy1-ZQL`P;iO5>j+QX(07wZl4!M!=u2K((lv1EYGB8xiVZ +cf(^P(}$ErXw{bSjw!Kipxe#OM#f$r3cc%%#i{op)Zq=mw?hRYHGA(-_SC(}YBEMo=R#E;l*n1Cjv`n +a-xSI3ce46`-(62|=Zl1*6bQk}#mYA={$74<;mF1+t3Vn>@_cS(Wr$F5e~R&7rjtj)rx#5bzK&{4&OI +vQlMgjIN`lXv@la>O`q?A_U`aiy)u1iyaklSrL_klUo1 +-@=YAkwSc?=$E?V(-Cktmn?)GPSt;F1*(v8?K{%Uv8S! +JvqT_5U=6~^4WJJk=@mfLrfO#V*JZmb_C +sDhy!WDw(2SOwQ{tj;Tvq_MvkLs;|hxVdpbrX+RUn;RmkfD{##9O!X`Gn9>R!5FDZjiUB{eVKVvK=RV +eeyJ7DkvFIIKzEjgbw4~QhsSZ0K^if8;4GaF(gcls+t!q3Mfw=0yevzDQBKWSy2HD6^VEFME~UvYUbv +vP(&zIHrLXmmn;R02pymOA;o$B;)rK;gjgDo#Zgboq`O>oorv3tXcOM+%@V(4njnJ8`4zBbcJ$;hH_8 +u&&uffgv!{$Ui5xNM@dbZlPkek3j@Xmv--2sh_!TTCO>oI^m&_}!LKCF-J6sdQyL!{HkigXxIh}3zMN +Q*__+XDarKyJ{B2VH*bJ>{|8*}(<#3!~B)p7b?G-GXsOJoe%^bh8vf^cpUjGrE_?CmwVQ_K$e2W+JGc +HWpDBs<(I;1_=w8?HKq|FP&(rF}{;%ntN6Z*g4M9Ew6M&BV)Qw)4H(;#I|M3>(^s)8YkW5`?rWI52gh^=oLnd^T_#XF23Ju&U +Xk{_*j#ank2<@)f?_ix`kd3`{nvf4iIcBSQ;5 +tEMlh{4Z*wmj&#-GtsWAy6kQmgeu+U^eo{bG3Pl+ZG!f+y78fmwOpYbAPG4{x^fVq%hhkW`afg+{Wap +5#(9#Y`b1A#Hz1`?DSm!!Ql2U}P{15(3Mwi#4*Rq@zHtyF8~xdh%(G;Ir!?~XZXuwP~NdJfp%1<`_TO +^#CPeJ*R)Pw(GeoSE%E)!yc~#P>4jb%QxAN|ccw4`D+Oy){iK?5ZuoD=!q=<#K7nDGi_}hAsQN6$X&~ +>8kZ5pvzXi^U$T8hdz$u&yd`oTQANp+P&V3Zs)vr+HH+zW{;WY#w?qM>-)g<`V_Dj<=kJQo=chZ53eY +vn=`LG2pu0hFbDI_h)RvAK{}>+p_><)L9W3nvsE&q5eZm%j3BkZ|G{FjqF$Q!vCuZ@IK;`>Z5Zqf@6A +CQ=Cp65nj&%L)?T*aoDq|RFfY2Mw#g0Q?QOQZxC)e&-5r?iV(@;@?hHAmwjtHq)DN)WaG@k?bb8$_bH +s_LPLC8&@0X&S!Qk2O9z@blg&dVc(1+$yiU~8J9rkhH}aKnK_gs$gM(|_PNz*=X#9e +Fy3obtT0@O8IZF(xx5giA~G#5r(j@Lk+Nw}E=#izq{*dX6so1qcvf*SBmq0^(-&JgbwHGQL3j(sIqeY +-jYxinr5{=Z7EB{Ai_19t*dz_}9FHsE%Q8*baKgM8xrK@M#RJNZOl-0sTjoizGAy=l*P0~duU1*7~CuX#s4Prqb82{ObdXgL0%=%QT?n)_Kh`3ELEcP!*Vp-q^_j +`OI7ZLdFnxzvktco?H2>UgU5YgjF>lzu+3~Gn)fM1AOxMQO_!AzYq<?qLssPgTgDWa|R45ko +tes)G4soc`NM`x>FF%v_VDGuNY4Dvv*%YBxxKYZ#?Fh>QOFY%&`fF(cD?-Z*HtVuZIXJ^xo2V2kK->iQEV5BxyxcWKUT=cjRbbJnW_v%ap;q23QOK_Mq%;5bC%G5HfTu`N-gT~qi~NE?Whi$v?g&} +PZ(!fd!|NST0fgl!r$*ZxV9vaKHOizeS=P?-@@OeKs$hSKrjvh#2yD_B&$aQqH+CtX!1000RB1*!)-J +;R%1U}aX3P6J$y}I#Obs!`tup}e45s~3Cc_F^z7W|_Ug#CNsDyqCUl$u-14`Ucv*y$cIVtMjkeJyAP{ +N4=osy@3wZ8f&1+kxKf16kPQ5NHM5ZY&7hZ>2X7}8*&b!?n!4T&3ggAK~;(1pMXBWp+ei-I2<_S~d(W +lEh1rr}KUBQ1xp?D-cju%k|Bkc#R33~ybM%g8QUvu@6aWAK2ms3fSzF*uyoM?T005^G000;O0 +03}la4%nWWo~3|axZdeV`wjGb8l`gaCz-mOK;;g5Wf3YOm&h0SwM4ip`u1M#kL1;&}2`+LZBte=0+w3 +l8)mp_P=+A)Qf&(i%r_o<`B!A;cz(f%{L=gT5X|Wc2kQLh;5^^g=dJEGMws)%9p$GMN +-LGsY>-CxCxZ6fHn=S#nKIz( +WB(ZuPKK67PzJ6TqFH5>V~6(a3VQUEy_91;vJGR-n%Ytm-VR4k^6j72DO;Enf|1^wEHLrBoeQy^-!}y +$WU^v~#a_d@yAmMUy}BgE?dB4rSnEQd#no!HOACP-1y#^mkU9kyS3uPV=0ZLWpxdnu0YP5DREo&b-ID*3iGvt_l7*DDCK!PoWtuX2`Xw%b&(uZ&m7KH4`gtaoEE_x$Y&H%?=s#W0UHCLB=e(Q3>{q8hFcc9HDmfyKDY(;+yfRPDaR49MlpFzya*+9tP +((2$hq6Anp?nrw$suY}danSMm*w}pd6ml}xCEous~v*M_H%MK&zZ|R=SI#aa&?bs2Z;Ps +=&C{-8QW0$|7OZtgzFK}|en9wqYgnGS?*w8WChH1DKtQLR2-2MXizUd%zjQckphE7Z7EeE2Y*4}a``g +Z2uVleV$@%rH?poZ5BNWI0sxZP=aL;>zK1(tk&N+fo}VJ)7xJbKrlX{&pt{(|$Cu?*8XZ4uTF@@Zwmi=v +%OJ}0EfX@&+wR!Dq%*y4m^OU8W)8-m>?9Q4PAkR6xZ5JcZk;5?zFKJEDlLm{N3ZGb9?^7UC1quqvv&I +c=ZJo~h=v3s53nc1S9H6$e?MB^@Vd#IGSzD(935$xIodR~6tY$RH)qbo$Z|BB`La3Z#og`V`sQvVp@x +!)agBM;hNf*AhO|w@hAehsxr6@I*jsebV3b>@-3PgC5TZ`*IHnOznj^)ON~Z*d6e-sz3$aB0q%Qshrdbqnql0bxdV}yuT}D#PSve{*s=~|L=trx#KV|AR= +Y-|X_2+^&7H-@J0uGq**BML(w@V!m<0|^-ryhh2nS?L>89(W-zrYu_>1#9^{n3B^ENndcc^X8swMbkO +_ns#m_d2uwd5Tk=s;r}gHm3goP)h>@6aWAK2ms3fSz9>4SjdY6006WM000{R003}la4%nWWo~3|axZd +eV`wjGb#QrfWpXZXdEHiDPvbZcf6u3|a?&o7g$Wp;U+}uAfEr8`OSqO`rGC8uOT@R+mM{`M2F;3gJO?4gyf1>c)o+bY7 +hx{9?ynqu}AQi8RI1{Bl-j)l`2v^Sw)EymCT`aciJ3pQKGT#c~&oK1(u+x({Y>%mIVmi3fwhE$HW*5E +?7?W3X0Cl+3ft}>(zoTX1DXp>ys +71wZBl`Mf6$w%@DRF=!l;d9JtEst_8;BWaC8RW*&j8zW1=E+DdZ? +@0%TP&&0NBr=89S0`-=Ow66kuP<*#mx1WX%c}VC!|_&#E2vtg<+GGE^> +2n8bnA9k5aB9YtAU8kP%9`;F{8)f;+i|3zRJ +7m)Jk}!3fd&JmkZ_UYbqaBZ)_e5*5E6LaPd_+VZ^f9U^t#YX=N-_3e{L=u4iT|!q{jg8cespyF4^Yz +a2WScZ87}P%ne2`=yiOmoon;jY`Ln2h6O2(t7+~fT2>eezru`Eu$| +HZ=Q;#h**8}3z5|@VPx$VZ<*v%fdh{lxNKUgj+OS~#=g^u#|dQ(A{5U)v +H3id@3eV1GWU1gi=y6Lg!6%%FV8Dhp!3KR3k*>l*mySizVlvjwm?T`B7<2L}pzM0bf9PD2jT~qwrko( +?f(VdMmdH>7_jIk!5Mop`2Ulscfyu8`!l@yV?S^NBJkE|lRv=Y>jydHc*M({qS#wiXUC^f#~QUuPm)a +Mdc*-R<9Ga-H<7tHK8(|IIeh^@^ERC9D2j;t^ktW*Njd73O#4dITB$6B`+BD`_~u+l8gA&ok@64$w_X +Q?@6aWAK2ms3fSzCG%*B|Z;006W$ +000^Q003}la4%nWWo~3|axZdeV`wjIVR>(LbS`jt)f?@O+s5&~o`U6{k_kij(tiR}#Bq!yh~pY(r$8Y +H1dm)vj46^ODc>oFdxQ2(`c!?A&dl!Y7b)F2P2E;M?nLhF?9A+Z?`qq(hakTxg6hz<{TMv|`b7fI!`S +D=co5^hEf-sasYcO{ZCeivSq*hn2szkxqR+>+*JGnN?8FFD16l%-@`>6q_W +DzeUIcWx*R4vm(4_PmUw*H`)P4l|iHCkZ!pazPz0XV@!FXUswUnD_85?qU>lsvpUb%LL-#c-@gg=$~z +_JDa0ylR<=uK&)wR)AgJh?+s(-~$izumLAMLQiU_7ds%t;Ke6B)L9E6K}pb8#XiFU1v7}UideX&>+bv_KitNhd+M=7qz>~}1Yg<<#{xN6 +GkLscI0I;aUe=m|cB;RV4-_Lt1Ke1#xO(xx^2QCw{{u($;LG4FyE>ESw*goKI0u~|r(WSao-G3-KhmhB(Ir3^hH>!4 +A3+9p@HJ9(c@&YoxL&b#l5basxZ4I-vi`Oi3B2G4`$c(?(N)oy* +1HV#EZBuS-ty(q@K*&XY==i#wc0!wX9w1!-_w^~W~i_sK%1N`a`CL=as?c3YIRT$J2cpEN0N;SZ`j(r +n^YfA@GK(qPhKmKN+`Y-MJT@suU=`s`J7kh(HvVeY8I?(}#?Q|_tlbKZGe%kGJ5Qy%Xew9fIC{{U3pr +H~5g-9-jTk%WPMT|RfNr_#hlkQGoQ7c7v!RLw);?zRU{KgIvMfB$@8&s>)i?%)2yMa?>Pvg5!QzFd*l(81MWfOTEWhT1FVxKet7T5f5pU8kyVRdMK+h0=Y8CM~zIL|9_F+axPXUy;wz#j^}mw8=Vs@av)>h?I)OoER~RITF +{hD9}+GqnbxR9cUpqVC&8b3uf9iG2+eCL@HZda^tCL1}M4;Vbj#Kypgv#R@ujVh)3fGmVE)9o6mDY!W}5Kq97AA3e6`**IBpCQ?ve#N=4LDapSTD?S +Zm(%dyKWL8wNpy_yaIdvL7Zgka~r-k8&*MGMcZ+&dQxHRQ?GbBV^dgZ7^4cYcO1?rH1(I=q;=T0w@e4 +{ek@=$*GtW}s;Na(I{ohQktrjs$?fgj4sTCwhci6#JRA>)yyq^NX`GS>2)(-j)CJ=HsE(MaTiC@5XU? +dS2SS(b`l^h&yu<^YRrCzPL=wQ?XR$v^+>J{wEKK^4_;LGuR-2I%0g3@qxRa(}SXPJ7HJx}$dOfHEZ$JZ&ME_gd$Yt~f}XRs^tqqekY0Z&*@6r6Oh7v-kqH2+#w)srDhs>T;EI0n0GVplfe8-Bn=hW +yUuF6OZmTYXH|M@wm|`daoJC +m>kmwAIHsUl$aVK4qd|^oCriij3z*-EnZQer +Jkt#l7LrAS^VW6wF#4)P`m7$i9Dvy(Wlnub32$qyakpbrY-ioA%*7OWE0Q$u^d~ELBygNutRxsqW|$H +_Gk898Iy~6p+wuriaKBuQAub1AC{I}#1hz;7w^Gd>0FEIQIQw>poOXZ|F8g6;Im|SY>da4m&vujJ~%; +9pAy@N6_5&ajBZI#ihAm)tfjgVW~hy_+m7zm%v13bO}1MmmxO%2XO7i2cr?51ck{C-#(8m431*sFGZE +=rH_@=&i)}B4eKr)3^{}4mI~1Y1GNF^s%q=))wu8{&VYyC0E}!tKTUe1=Dc09COmc7wYAdvg(Kc(ZE6 +Q}nZDyDH7auK3r*2qVD{Q=N#iN`ATzb`rfopE7!=t9Uv!a>vt$2FCMRX{u( +K9H-L^I%<=)y5(d{(DyhJYsLvKLE&D2wOzo2ig$r&yrB2_5*^ec40)UStww#(g*?FlxCo<@BH$bm|J2 +qnj^!fkv7KWmTXX%}4Ck4ZOYb5`diQI1cirssSyJD@~>#4=XVlRb;92yk}HoyMm3)#&^eIPgk1&bDDP +@h|P?(ogRYkUiGR3F+56-Sxn;3ocX$^!1#PBZox+i#k#YBbJ!xFGm7IGqu~?a$$INAu3S6NJz3rD;5T +kV#I%j4C9JM^vm8h?hvt4ou1>P;1KXXs(C2?}vmzg@Q&O^O;&H=_5SDYsY*I5VBWy{w{V2-Fl~oeF7p +IlErW;*ZvVO4Wpz_s_V|)3A&x}6ehTMf_w|q;v2snC96#rdM@49kDm7c&a +)Y%`;+VRF04ISEf7jZ*7qJ$gwB+rg~X9A*zoy0q93npVmlja%sobYUTeo9zQO)i#9DO3S8)!Rx>kH_a +<9htT3m>x!b!uz%tQn0gDW}A;|cKG>tn{&m;cBlMj;j#E=E_FG5GP;5ipDKw|q1k)xXvFIcDQQLqnKw +JW<`lbuHIu*nfEnsXAod_4aCAaiHxre9$m=6$@l0gQWZue&fZ|&{ox7&xEZg47HTnM3Z17doN47+0VZ +1KotQPyunm=d4I;_u)4xHy5hcx1r76TrX&{KSj&Ur`diC7Lo?%ZTud3sL=M`qd?D5hXRKgYiU{B-9tWn8TuIE)#fS +E8{2L|tG+z%voMY=AEo)rAKK)+ +pfIXlt-j#$)bhj92^`h>XI>1T+mfV*;=YsD!(R@za&XsE475Ll7lAHH3M!1Mmizzs-ri3UBdP?u(!8m +&2qpx5a>&~0vo8BiWf!7fRT*gh98jxH#x~Pp<+wBf>Dt6@`%7bmwZB=|47c-hDtv0gZM&TWGblm17k` +6Hh$?NEnxxx6K0l9>{t&7=_EI-FH5>? +ko;9$eB|56OnUF?-ZN0(IxXoVDcTof7*UgMG_ct%)DuCBHnXw}sf*?B~yJ`u$>Cl7HD$IfxcBh`j4Mo7qj?<-YKt +7C(Skfd=+)6G&!e)Fd9;tgWt#|nL3xV(w9-3zRSmVer9UJa|&4K5h4lH#jB&Uv>IwhQSy9U;$lTNZRE +7Lf0Lt|+`tLV}~h<(k=4?GZ*5n%tg%uoQ-J4+lfCrUKNt6jXr1jHI57CmQIxm$M +I;i7Y|p9}&V{Tp2NDM^jmaj|dp(b$eGV`i`|-Dy1LT8!A#<8+ocW-9vKQgL9KQQmmn_l{++Cq*lGr`g +ph7Q&`)YdN@q)7j(GACl~v6$atGOS36Vh*lkHa3E`B<{W4VlkS%fU8GU5RQ*c&L*; +w#5KBigg{Z}m=_3n)a@2xzE8Hx(E|9wC~xU51+_llUcdyGj?;VhumH*fC{tZoPD+DpCM8~4BDE7HPF9AfA4l08aFdwEqF*S{-+9( +n~Az*)ylvToGtoj-(Tjf%%w3WJq;)G&b4wf>?iOgJ~JTJMeSOq(kc;HrtbOHNtx9O>v6E<)|M^OzjFL +eqKCT4h#`{5OOiF%(8FH~o2PeAeDjY_p!FRp}9_N{lgR_)Zju~>~!SIy9Vf^cq79mijX(IJx$WEwyjB4GJ{S4Vs(5tqMkiOw+3}2QG__&sVc*3VQh#(tG6r0NGfJJzAJn|VF +MaWp7bbLB$D>xjF5^n_drn}$Q&w`L$;NhfGS7MPd`>ABqWHR%)k8leLYvFy+0qJX(uzT(~k2Yi6NN(2 +=NCD%aao7@t$Y|QIcsL__qi&GYY7wwatY04Fql`TbJ1Sb`!LzFKgH+{nqAhHWL8Do`-$KEJ+n|pz%n< +gLAP}U9JRMG)nNoK_nS(QlMCW1CC%z<1Q6IM?*+jDFu_Z~k$1MqPCaxNVJbzq|P9*eyqe#QH*Fj)GK^ +cXxLp9MzC%il%#0Iv}LTm*0HH7^QHY6R}lNkm;OIO#5R8dw*?3l3TUgE`2FD +K6Y&OJ`>DTLc(UO%2Q3!VU#GGDm|sUBNgsb-2ML+1InfxzGO-aWJ~7IwtQsIOmXfs;81aNcg&)D6n+R +Bw&3OeKuiH;%-O!Y$i^OhaDqvf>X;G9R}xC6R<5b?6)}7gDt#a$dY$4QYTFhSSG2G30QG_tCd>%A=tVEeqAd`qU<3{*Z0C~2 +t7+FN`+?6^eny1znqt~zL~(68d|-4U>Jr@2XTR#vR>gG5U}~IOc#JP!1QKd)ZSy?JI}_8B +j3W9ny@}hT<;Nsk|bUYZ<7UQ0g&`2dTHryv^mQk3HW8QXkB{Xc&%Mr(q;mq=Y*R`ZGkBs@;gxi}+DHoDNVYk%b%GcaG5>Q5<0dsFf_? +HK}R5Fg5srUe2K83)>Q{_vQ1k#>2ATT<@vKAJ7AdFs|-F4ogzOWjZ1<>c{yE+k-+EX(9{}UAj<}Rn=5 +%ji{nigjX*a)-kxm=X!}EKrl*W#{>+YLDcyFEZaC`NC_8|F~=*iL22rQ0CprUy6P(uHgwKy?HB>@{QS +9`)TJzM9f{PH$cBN~W$l81%^MhIp7S5;U#Ni=?yT)AG{r5m5~_<^I!yb-VK!dcVx(OBtFJ_pw`7Z{1(&h_FVExyP#L_iU4WvsFIQNqsG?IzZu3gmP_IOn9%-Ry14D +olJ#gJ*;s3T9T~Q!*1vfHcr~osDOjJIU?HLLY6NG0Rla;%jYx(l?6O;n}NkNi33*iKTsWO~a(yfjmUH4Sf3aDSFYmZMOwB`P197?$J-4aw*H%GQ^aZ83`6(+vJWmi)8Hb2sE#&OLCq5}&q!D@<-?pQ-RogQO58w^G=cz+M;;1wY&$T3X-XW@U28Aq1Q +dQ$JVu5!Rt(WQ^+hF=QS9VyUi<@f$Fc5(4a3))kxH{Lh)oX!5!FV< ++YvrP#K%gec7lg(bt^W2?7yms);L38-d@C=n|zYu5EKHBdI_QAp5CG@`BfED15<3EPrE1yR4hs%~QQJ +NSGXM1U#Ni?N^~;6(_~x_s`1z9u{Q9%^_ +{;eh_wo4bo%{Iiy$5{!+Iu`b^CmiZ|K5Fk`_sAmc=7os_wno>{u2Iv=21TJC|~}~1HOFck^1dSkIHy1 +e46U)ApB|@dp9P32%HW%m{izP&+BN3mJPX$F1t&({rZ`I-ryx;$@aTdK)1){r0FV!KT^yT5 +?Zqf;PMt=AnSp +AN?d_azg9bHF4mZb^#aUeVLJhu2THl8-8H6%g-%K2BiV^CMk4(DTj{3ydK4yvBK(SpAK8Y~Hv_%`Y++ +PdE~Y4WMfNyaCcziY1cJ6i?$!G^{DSIQ5y +@n(daHr_}9cH*NLIpeg&+LGTr&X4j}t3Q%BMZpu_ph$HP(jDWHJ2T)4`1QY-O00;of09jiBjB{=30{{TQ4FCWi0001RX>c!Jc4cm4Z*nhkX=7+FY-x +67Uvgz`WMy(LaCzNVOK;;g5WeeI5IRYLRzQ0cpal%Cy9lsN3OVT|2naR=Z->xz7Yw$q(KlgnmfgmvCeVpcT7tmdt${}!6-QL) +-DtGVwH;o70}j7>kEa4YX@#!fH+f6mE??is`Roa3OJmgl{2E%wYN0KDX*hHd%e(HJyF6xgN_IF9t3{_ +m!vA`{RMbK*^fU#9$AfYmxiaX;;ai36auBB6GZ6u3lT)c5XloA9g5g(# +Q@>oiADzE4T(7CG>L!AajV#5!@%Ie1xiKfYmGqh>1J_CFC4wXy?S(}1r2tGlqFS3yxRz0I+sO&m=)i3 +f0p5_#Nfu>X?5}Fo3{L$V%(w3miz>YR_1Ms5+#*SuX_z$TM$eS#b8yW-vioA2^~Tx0|m!T^N#c&>e0j}HsA6##uH}LchZeoQ7>+LUB9b-LTt99QTyO>V)f_dH$h!l=YNz`cp5DzayM>S`+6@jO5+is6MRgN +p%B(nK0CvyApb&Ycc(COa9p`-)kSZ{vTOkr7q|I;%GRtrFNEF=&1VMswqwHt^1gG?ig%`EEnRdbuo+= +R$=a8kvs}O`hXi_gO8wgp3t*4h +8=KP)h>@6aWAK2ms3fSzD%nIWB4r006Ww000{R003}la4%nWWo~3|axZdeV`wjIZ)ay|Zf7oVd9_+?b +K5o&{_bCavXd#*Q7FrCdamYpGd{;j+)Lt&t={!U^~kgcNsRfTfTR^qr}x`$7w;fQH#gIB5{Cp9y9;3V +*~Nlcv8z}^@@lim%FV%=RRu|thBjG2NhUhgyXcjqs`G79ra5I}@~+xk(N)D#LAFbpZJymJvXAg8I-18 +FtyS~;Ds6K*hbG-=@jlCwy8dSZ%r6?slDnLOn5=HbO +s)rP)WbdHn3WoZDYi|HBDo3MR&|b+7wW!@a3RXk8~8N`L|3E1xh*(yZR)$s7n{XbB6Bvr?N +=B<#N3p)N3AB>+rwO&+Tj=KesDbe(Nl1}dvHS%Yq1*eqcg5SLY>1-9HuU@R(MHmu4caM_Ez65?R?Gw^VL~ock%;)MoBtEko`W3m7mab; +EAPq>_F!nxV-GvWUE*>!i(_nlzP~X7u55etkZVG)J{);f!0*?Djw0w`6l94g1y+p}bTN&dRz;N}NX}R +szML#slEfkk}TkV(JCd0d`${n??p%1tU1LXVJNCS44V$ND> +I95g0021sdpkc~c*FC&1fr=nilVKaF)|`2r6n`v%>nwNfE0ylqz#g86#X~HS3-5=a_*}6J_8(RoePRU +w_Y`;TQgjJkbw4EJoRbg$twOK`T3i)QE@uOL5hI?GWCLXAK%*tgY8N)~m{Z5MftmqIl-vN(wmP`#YJh +}B1Bn)cGkh9VT+XkPytY`QCoMH<_nDQHfrP{&yyF_yX8JhaSxT-B5=5v@u4m5U~ +OUhR@(%|H5d^xA$G7!0Y+!VA#CY+G32AHDe(7*4HwJrB7dBVDpgdhpe&tQUig}`e}kPvpu%dOeU>1dC^1$g^K=NMIDdr +;q4kU?h0LS@`K1wBj-eB4DENp65d}NwN3#*2?Uof1LmOUzb;}u5WK6mD`JCQFYAp5o@7AUyHxFAu(BK +1%o%|^I&XVKVDut?{CjfUpf6hJKe9&-<{9T?Uu`r^NY(5*LKtV>h#Q^`FJ`%dn+4m`0uwDZ{EIxfAjO +J<=MN_YkLmp#|tZ*^BHuHPMk|h*JQbbyt`R0Lz67gd~JmD+-gQTIW%x|Q)DwhW&p;m7cwixL1@8-^n3 +HDGu0VECZaOzWX60hmTFwk{LuB1d#S)I0iYK%;m+ +%Ljob(Q{LjDZTTtNAvmykzVi>p>m +q>u6B06!19H3Ty##QwzEU2+UO$#3sXj-dp;LF*A5qbVM{%X$1uw0adqe$Zbcb%C39yyqx%Q>;m@&WO! +Vo}(kw@)jvb9TX~ffOE$by?Vjr`Xh&3|MhWg&nbe8v6udUgoif1id}hPcDJAOL1q{T*4ltihJ7JL0lu +@nz8FLodxmEnz4sh?f`iZizWEDo!ui>+yx<*+&d)29vTe}u+I+h0KyCo7HNF!;mxpmI+u@oL1%EFos` +D|AT&H!W!Z5bAPo+)a^tukg$9ROr^C1(>D{4zrX2fdHaJ8keX);i?hu{D#TuJT!hwJx%pD82AW})#H;^B2Fec`=QEuc~1&(U?Eet+ABzY?z?MXbTL0wbUXg+x8!kV`;?+zW8GDv6()^{Hf`U_z0it< +#!T}5Xey**-H{ezSUzgxt$-Vovw8|d;zn65q*bQtl*S$+OM9!R_)ytQX0DuDR2Q9b@3D|C3ntUiCBhs +<$5h(9?}0JJw!H1{Ygqm{3z?C^(}IOPp8UGA`v^JdUMItavw_o6LyDZ%kAz`&!Ir;TLs^*r%M^K%giP +s&|VP+^L;E*gI>X69W^YW@mm +yKpQsZC=2U>mXW|g)?%j1{mQcPxnW=AR}1Bijy{$*Z@e6KC$1_6T)C`vRcLQ&_1+8c(pRtSKghy_*P! +v*JStDY^!oV#>-Mh<%QY={-ccX+grRv7x%GyszRo|NOyVa8#@ +4vP5TyxSOK{Co#2s?3!p{K1KE-q{(y_>atVG+;4C_@qM+v;o4gx1-5$)Q2#AgNkT8`&m|7&8YZpyD@U +TV`T8F+(%SCAsFwr;_#OS3;pN4;6ihtUT2a +grNcqbWuwVni(h71ZK8w`M}f1>Q+iwO%5j5rMkX-P+D7bq1|OEr2>#X;(!mk$*;Cz>lDP_Rk?YX*|2h +EYCO@XLuVYUhDx$!Q(&nqLCR*=^`@cXuT`M+J?xoA9tXiu +@C;@`X+jz&rR^cUR)*=VyM(^8|*teJVNf>a4&`eaFY)iI?Ju`)iJ9#Sh)y6Myo<=k{xa=36gShTc?zHSFEiTc%0JWDOhDpvIicr7cBMAReWj$P=j^lF)W +?nC8IRi1FRWH +}pXr!X3w!_8>68ik==t4s&Q@pqi@MNtjyMo^X;x`p?wgQnnx%Qi!NR=>kY6 +g+@xuPJu~Qd``9;e>ZIgG7q=k)?;?{K^crHNa2G|D3R|Ogb2rOxY!8K(M{DL@P{HvQN3Pv3gyq%yNw5 +pP9n`SqgOr}SFi4Nh+Yj5p_VGReRQzC_!m$jQ;+A(hk?I)cYu>V3j+CUU?!dC0)|Blty*50A;w@zLN^QhL`~CJ_8|efi<);~5zG +=N3Te*YY_;z-R2&@~_XqoS3!Ezd4Q;z;f3Rn84tJX*3O7Hw+32=Y$kH`DdK0c+J|Z`Pi}*9AjyhdY8a +yy$0&VB1m>S496s>SW<5IQvnYZt?_YJ6*RAcn=t{QM=v^{6l7fF^vC0uN7LhzA1yh*TNCkgCjp~%n>W +Es+y|0?;xPbTMGem5`+LV!y=8q@C8^A=`A4k$3l8x$?j%W*I-S5j{O>dUyr+}TdnW!)>U1OiPWF_Ezm +s$gmQPtTfq&vJf8r0CD(Gm$XAlNImny2R!F0)YVgbLyGY0r`0=PiG@yrmvFCddobyc$6YQin>hnFv39 +1RdAX_1u^Fuf@`K011F+-In}q^`w>ObLEj^NFq?;PG6Ak0y22&?vA@Txs@@r8Mj*^vVx)Vlp+*1jKcP +ZHE?$RhR`Y0(b~+$oF`gYR6Z(X92DRmlfDG;LfpA%A6=k=E%xVl`b(~eqHPgPD{c!gMVoQ%TMlcC#uz +|WsIiZ=t;{7yN;{)t?-NuSQ!SFE&mv$phd+V{k@Y&NWWyb!2ByktYF5^ryl9zuFBJ!^ItCJ7a!gLWG* +JWAsCCgW}Id#I3n>glR)Uv!G8fzO9KQH000080LuVbTi#N$M^6d>00SWa02%-Q0B~t=FJE?LZe(wAFL +G&PXfJJHa%**PE^v9h8QXH(Huha#figQ2GNtLJkJ?oeC-EeiHkYy8?gOoIAQ6&TQzT1JmQ|1cea{6X0 +ZEk8ncd}sEdu8pocjgLR#jOyqE@3tU9N=GjmUT@&l*+BJW+Qt=gqQ$g{G`q2-!6CQZ)d^`^~n>iehr%rUTEP2==|+iKm49SOt*TtkReONDYCvh +Ng*eBT-(;Q1qG|W*x~z2z@JZIU>*^fW%)V~6d3VAkzL+2W6b?nFTd+?$Y3h^?fl}+m&@~T6cD`+XP@8wa(>~Gti9j;_< +9o|wtwwMFJ4^-!K;6GfHIorQfqM~mwvC)U`*8Em^0Bxuu383WuZ%uZbec@ur(r>0+7Z+H+73~b)yIeH +zJ{;Wh9=@$~=8eI0#h98uq}hdfeGA1`5;e&|)iOnr6IZ!3(*7f1-gShO8^9D!y#Jr0Vs@M4SGspo7COX`3bsck}&J+Y^b+@s_|T@v>cq~L<|pG+&nGvI +Zp?m-W@SI+)W^M)|ivo_iRqx~7jF0pASS~4AUR@{}hDiyOW`nq1vM#;IJ%L++;Qq4`7?h)+IVtPGQ*b +*y70$odCLMO%SHX5M;713r*voXo=x9g71jIDtqp?O(@kOhZTqC;>#V;~QXVrU#bC9HL8b0|~jL5 +u37j-iR5h0c-)z(g3qkw*ks-cvdfU?`6Ctd>|i;#oH1P3vjxUsc3LlAOW!sD-M+lax#k$@@Mj&*ksL( +(0{IFt;DRB^IO$uqpLJ(h3KP{caj+ZYREh{O8evyW6N0%#s?bCHnwOpI-x7=goQ;uWX(+&E?U;*y3&5 +I8$l4@7Sf~ha((@PG#-r@Mvar!=>EP;p#kD!vNrl7Riqjf=6l!IULa(VilS@|?c)Ak_A)1bFA#k++S@ +Unnm~wZfM0XK +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 +nqkIQRYuK-c7(N^WM+=_GR

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 +zG&@QuC42Q)fKJtDYa`LC2Tg3NZ +G4aOPP3czgqKeEstP)ZoPU($w(|qWveUDiIM3ra{F)%mSb)c!)fN@mzGa4Iq!;i?2tCE_KexOg@v)L= +Je+bX_kp^P)h>@6aWAK2ms3fSz9;&K3}^8002Y{000{R003}la4%nWWo~3|axZdeV`wjMVQgh|bY(7Z +d6ib%ZsRr(efL)k)E6pIl-S+u76ue_H`t~@fp)Q*mm&xV*`_SEx_C)Cv0L=5-_Q^2mvlI!Znl!31`ZR(s0hSD6+_l%v%fZ$-sMAnFyMH4-cU`$^NWb% +$*t}UcV2&7DgITwkK5Eav{{*0)=pPHE>7=tAyFAYOu*p`e)rcoQJS~mi3cAh_C~4Q_#VVdzKIf0eVG2 +n|&9GFZSaV1tWHC2HfHMYvLoJZZzCp;+9#vOp%w>O6-DYxcK?z!{HLyc(903Dnt_aR65vPrW+&cD#?O +B3sJFtAi}?V&<|8{xy}pxGs&IWicvWJ+g2Ny?UO)R!5%=^ImkxFn&op7KR{sYg-VSW5}6O}vHpqE)rz +b7Y3L{W(?&7E4WpwyB{qr?=*XrG9}6IW6PUh@fKnl$9AJwzDJA6I*oKy?^@5!^sPF(RJWO`e1^OGf%O +&R3gjdQi{qzTCJcGVx_^hC~Qom^nKg2Sefp${6i$ui`kp7Ef8#d%e-Ica~LacDjj_3{ +D~do2Xq#sJ_eMvY1?Fs~cDD1c`HqHELPW{} +8UO;Jffh>lEIgfTQQ1BQl8n?(I8gSc^@3-D3;hcMij#BEJbY)Az3ix!h7tTO_Q`Q79QBG8a6*>|& +a1Q(oI{d8z9+IHIZQcS@(FElqb4a_`(B7$jr@r=IhVYYwGUeLESJ4H603^uFq1xP=+5$|Ajt0@*ZP8 +iF$d0Y6maj55jW-U!GvX+JY^ +?0Lj_^_r-7-IhiP)h>@6aWAK2ms3fSzF6kp*Keg005OM000>P003}la4%nWWo~3|axZdeV`wjMVQyt? +E^vA6T3?gfwh@2Vr$E_D}Bj?aWX +?=q+4E-0`)XbD!Hnvv?bcK82mP4an==6n22jz`5Bv&QTKXULqwSQp^(erP_>k+ri`$MH8p&_Q(HC%^t +6xR15Ibt$)q=rgi~};Xj{95vnA;n@5JS#Bjw&Kg`}~m)$678Hi%ne(18CRqI`xg1>A8|5dClxp&RR_F +E6KKfbv>|(t=k^jS=G14X3K;eaD)Ui49kV$a(+`Cx|(a2c)fb{%5q(Hy=Y{rB}l%5Rc>?kx3;ghze}= +AkAK}?4Q{X}MoP8IRxB!QyZ(i5Te+o$aua2^Pw&jvUl06q!dwJ +3vhV&7W*geV3GTDtT{h2Ji3CJ!G(mB8O)Bw?Ht;qy^=Z*3Nl{b;^YQM?$Fh_UZUP9vhTl8aj~4$Ys(V&}?FT7b|7k$e)NP +U1|%*$K=|gz}i<`b-(?*s)^R3!Uh@IrZI@%RF!@58wR*G0#S`(QDmAWmSmx*`BeKy0_JV#Ej +~Fq=tXkP(blk+jgj2#w)|;ez0T66%myXgts^6X^;A1KMeWQ(>1s7&}Iy!Y#Ru7~iN|^`OrW*nlAf_An +PcHudoT;PLR_@jntD5_QH%T!_HKO~a}h%+|op_Nz{xWPjYqw%57dz+nf|E>!4U3^y7zhth*94Ei&`nKb}ymg6)vP_B*NI`{oQUw@x0;Z1P|}lYxoNxGl#*pLvM#yWBs@$9{cy$+&A6|*CfHixAEZnE(Ih!bSTZ| +B)0WqL)tR(pRuHvfrL5LNI?D>ckUq}>UsFElh(hngm@>QW)+tV3`Y~k3eeHn&u;Wg`!06`p!C*W9--` +qycN`3q#Nr{+dLJa{kULNj2sI0gK!#at5W0DI=o3jVHv7^XqbDa5d%lK@!qnLkdsZ4;o2k7e-qzz+-M +k&BblH&El +RYWTJ0iRC18!380sRa;*;mLgLu>!=eEBwOR@Nb?B?nMw|5fweh4h#sa?jZ<1vDZ~)z)di5>@jfO^r&~D#O!*s&(lz5+VMmLQKR6%BJi+*iV=LO_&d@JXuxTh|xfixUSkEcWpKm;3q&bUi@amho +KxGyl{JNW6#F-Dya+PS?E`)OCuz@o~lp$#?z^jyP;XO2>JRVO*spLa8|&cRP&u5IQ`26a<#$20g)ddi +cR-lU*3GSH+86ZLc}v3lFbh_8(KkYFX07own&nAe{4%9MleUbxEatw>b&nQ^H*Q77hk|;#40$?{nmJZ +nNuS2Gc`f>-?H}*0U}=ifx#XIqq`0FrIohXGbTns3B$x2wL6uxUL|%u4QzBxD}(YI>iTn5%i-)9_*$IL1P>%}hq0j8qPM8YTNSYjC}*P~EhL<_SH-wL&WYBoleiY +i`E>|M75BH|K3dne&K3bPA=~J4c?^b4xM|svgHaX4P9w9#w{b3Fm)~4*YYhSE3<$W3Fm!`(Im5~In%$ +d;v?##jCqymk!;(@9l`x==jd#4GZdU_9qHrjKXbQ8dM}D +{CA~GUKc~L8b)LRMcKiC+}Ka&x;u}PeYBhle4F{Zt57}At^QKm?=c4ZyC$7sSW^Kb(Ss5LnWHBOjeBj +o^^e7b*NSlpTU;D@?LSi>qAGq!W$6BG^ECZCLflbefa6kU(a*BT6z|;qG;?YE}+&PttDRl- +ROLQYv+|*`hf!oLx#Bazb*nnr!WVzwXAX@!&ipS(VC}F0VL1184w^exU)D>rK=4V!kb_zO1`ZDSt1Ts +wx(J+1R9I-sg)d@4CVyL4gfG>7R|sXp2o-m2>^G+jXN=+pI<2w)sw|RQe&)S#vt~Nwcl{qMeApbw&GK +x#;EF4`l~$%VL#ptA0tz%i^EgLe|4@6h7J$u_}vd3ICQ|W>RH2)e&8$?06nv(Kk)i+1#pJs0RDp#y0h +1zS)%Z<%_m?zk3ZC1_Tl{Oga+qy#C)8PqQa~e){CE&z^rjp`^$4PQE?sX^N`T&~SCj +Y*aI|G;jOgvB4UTDE$zQLqXuT-(F9q~^yU`{8Rs;BCG#*LRH|1uUy({Wv(@xuRaW%zx)jfF$2`}OI%c +27WN29*oolzxvdi%Z=c_%V_$=1zsTNNV$$gc8^Qadpd@Q$x32b+kboG0T^@qSTkdhv`ZeA>26dnUvkv +1#+mb$%x51_IZ*#P@6tRG>2R`NAEC +dMRf>gGnL1z`|7?>L;G6Ac$AJDKfBsm$FYAf^6|}rA@^0G}h9>3Dby4e +n^~HNb=&#{@G%8mvLCR@V9gzd(k}r{|%$WEIlH@v@&iaLm!e;zs+x6vY_hZptHA|cP6U^wUYOeis*;7 +evG8M>l1e`!*rJVV!nZJQmoWeh6xSq!1?l%G_O?D_rk|$RM&gn|zwUEH#8c1}}7I|MR#dXY*0g@BPhvyT-@}6JWrgO9>aS%-}c2h0A3^)2L11gUNJGTYFg}s# +6@-`K$h33nzsnzD6sAnuwcab1shSrA~Rg|5^>qk{&59f+UL+I(ZEm3eqpKBeGZwTzbZ5XCqXflT;Xwh +*`1l$hL%LCnu7sj_2~Llv6s|YR+11CuiI^b2>Fcx_ZHi(SWYC5P$0NoU`oXTND`=CVx{^<|K0&+dwEH +GycT@}pjFdj4@(qMz+pRqwJ6vpdB3_E!-SSQ`LsYvT24vnr1XdSq3kQW?8_?q5+Bno|CT&Y}T$@e3+Po5(t-N69+;G@JQ~M-V|qks{0n@%l +T#DBdZwmC|hpV>s^NEEqjzdz_ghXFtr(J62K-Cpj5NMkcQO^GnkJcT87jh%^pLtww_N)sbB6TRA`^34 +94?$Qx_rCFaV|XOo2yXO3Eq8ndbDTS0sHW0y#Lnj%|&1gvth4UN0-qhlt3pX;~>Q3w?pUl{GL~pvEj) +!>DGN=oSq~1W`;cr{d+)7e9!*NIZsc^LKeky3mw0W>A2Bfx-nfLd`|pmG6pbH!*7rCQ@^F;Ofn`x7C9 +Fw!tZFo9*S5t$KqhA1x0>O*9e%V-*mkH*$7ysv2ftwT9VlcGYJo#@_{8-cnpsFyWBpcB^5#17Ea#kgop#bjkRRO|Qv!9f*Bg)+vE1*nVN?21M +2WYu-N+Fgi-=Hwle$%mpBXvimO&9qFs)0Pz+0_re#us1(!J>6K)xo-|mI81`>yPADaV@H{wtRn2CxfA +7JcV^*iuI-Ak)ON)y6RoI=KeB^C`jFdl&j5;gQBD-y?`O_cVTO$#Yr?vFU*;KiGw+dZ|3}p7qE+QW?z +Rv<%*oy*I`gvmNWAf2eeCbW?zTuY(a^d-G2~fyF)#80gzA4@Q<4e)RrN2WJG~8l%y^IOyn#{eC6eiz< +zH~ev}oeUQiEKGXde#gUsCm{yPu{Z7+3LvY1Hf%hJ!jToa_UvrsITW-ZJM&18TPgo2&tYoZAKF4OmRWf@h8%%SMSs5^x|R^YCyJfK&KWf7!H)5ZQd3n +MA2sgtfP3JqbjPL9mF+2N`tCN&1YKmh$*KGeL&jBctDpNQW|kosJg03e-(*`M4}ZEFhS4cu!(#NY9rV +a3#3xuVS>1*wrfBGRkjBzV^OkthlV2d0rVVt{q$*<|C +xl$MmFu`l-jjoxBUDah)gDlp6%EKwjlTVGu3XxIS}~Sc_twFWyeXy}j7qzjx2I3#0zrm}m4@4HCi7gFu@FYT0)r7Of( +R4BIhmtWD#wD23|F0$>;9^uSGnsVa&N~ +gu=1idyK?{Nq?pu~=csZA2_esT*{FVJjfv{=gx33D*%{3_6G;Zm$p!k$Bh+-Nb?`Rj1zENNL72+I~AR +`X0M5@1e)jtiU$l#U*Sk>WVtf_C{QojS5YnLNBm%O*2*K*wi6U)E)}a97=imYY$E&@31^0Hj`L3z*I< +OS__4O@zmp;NP=g0%7?f@Kn_wr3CGJkNb3D&w&M}Sjf!bzQ3+d@saD(C0YKc86^KP&CS>n&mBxg2_@h +!YRqUE8tRskhy<%iv$hN*XBKqkQTdoHU%lKcI9oyI2{!s$YM-new_-4p+plx5;#uDrrW8ba>g=pOUubbn|`OPH8_0Dk +98ektyd>+PYceq)kZtGIBWjxqrauM$FshvVnbWGIxC*19{N%<}QO_^pI@zXy2Q}=r2 +|_Vj7d$sU_}AlZl(n#p}!wwxN7v>IRkNGI7Rf#RWTxOcan?@ +giGQY?DLC?^Dx%ynjI#sy)Fa>mHTuZMWsOi_#9Gs~!EoNPEpA^lHT1_5WWE^^};*UYZ7X)0zbvE-NVX +sg5$qSWkgL;xZ6gEVDFP;zp06>=OZV&OA|#MGpSyL?34VvHhZKEZ|!DEq{l@eocKCf=lnaMB`ir`_9U +vZjbP_5R)y8$>c5W)y=rMcJ0+byvCrX@}cwPpz>TUzNDb^`NRGw~#RnofXN8#cf8l=w>DcGUcn%kdsd +EjMJ{)f%Tfmo&;NQ;c!GKiSe?O0lP*W2x*q*&JOy$aF|0Qe3jf#NF1lw@vVvFP{trAPQ`iy7LBBkBs4 +NrFPA083+Gk2@L8K|iD()x2AjW!BV{=a6tmjs2RU6`DDfhW!o}k?sLS6v>Qapa&Lj%b +gHw+`L44iQ(d+yu%no!F;qbflr&y*Hkp?r{ilZ9`^IFwf|&BhEt}Px4&?q{#3_3r${1WGBKn+U9$n7c +AKi~Nrz5lR4SVcTDkWkEh{Gto6XcBGhv81fw*%tC^~eO=!ii)L691)n+4lr=H2s-wSF`J!*y-52fcMBLmkHj&(p*{_poxiv+HyZg^=!8-~+&yVOG?l`EXVMbvt2g8r +jM7D7b3o*GE<6oIDPR8+pvISVLFD61ZG`n#d4n_yd9snI04LW&ZMdQBTRMSnfr}ewC#W>t5U(c7hwItJ|kXh*sVs%S1W0 +DXFIaY+{S$wD_nk{RB4B_~R9D-KocVY;sERK*)GU(9!#+oswUnCx3?Xp(M_X +aSSSJ75z{7pk(0mY39lf6gyBfAk|#lwYJ- +@FCZK{f~xsXonjZsm@eo$pnQv5-YbrK0FVoHRfDffP71B@s>B0oa#sIuTUQrgo?T3u1j|l`gLbdN@kM +hYUCESX-8$0w`m(D5@~aL#MK1ADD%DtJClpWBBjK_Y5Tp*{)qw5lkF>m*Vvz)%^^UAtc`50Km9T^r9oFQ9>23>re3 +cs3}bF?Xe2ksvS{2M;g0Tnrc#a^Nf7m$V--dz9IV%&9_WkL>GvE_LtSmw$z+bleh +wy1~tOe2(3qq>%jh#@+sPgaauaOZ7-?6sTS{ZFyNjLnd&74YzqGUk6OjdG-UIY{9Xg$>|0u)HaPg$S} +Te3S@PIn@A?@`U+2#>6||b?Plq`HKg_qDC=B-U-&Br)2CKtHlmTG7t3fo6dP;WKvrcOUTjEZ92Xo8Zs +N>z>ML>oLZPmZNEwZcgKkn85YZ!dc`CK*AGKbepjU?uDLHo0g$e~?YBS9q)0=foL>6+d*lNZg2MY{Iv +%6nZJaIHhHT{wGi!{OtqZaCvBwwqm6iW%>B?8s-1x2>_YPFu^uxo%;+-gazM70 +O!#>=m!rn2dEmPaOD9y9Xw~FcWo@rsaFP-LjS-rz4scn%10iOkwdukK2X#jW@ZFGX+BPDJk?TE9LtkMuKl8k+!*2)CR>_T1)vf($^k$W2&6?ZD-jnUa%) +Sn7KZRQL0Mdk`*ZL&h7CW1XXrBnkj|H1-X?n%THrI +(&xvi^u;I`LN5{ARZmqq@h25obz!%!N&QQFZr0Gzlds|dHjEJ+h9RQQZ{7ut!C7z0>Id82z+`jQSiI_`+bYdVan?4G}JPH3n*eCU)0_w&m1MBZU==y2>E@oj+}e^<0Sdj*ELi)dbxR +ga4sS|Ft9HZFJp!@HM~kt6SG2UhzVIL9lG@2Yt;S^9!Cb+}iOVBh9|VyE~+7~%L?&&{gXI_B_xtyi8P2gpe3e`{{sow2Gu!4b=8+X^bb4|TJHge0uO3+zS}>D!_d<_bik2rGK+3srSn~nBMc +Rc$3YoX#&Azb`P#fFN#BTv>=Vuo3;*0k7s~c0{UYYB#-AL_vHr(F%Oc +$?2Dcn$bv_c# +Xy1X=y4bcI&d0Lop{ZgS)2|T0)NVS>lIe7sj9oM^%mTNf^=){r0Ye*qwBJXL7B+J^s4vSb8v7eKC1mP +1JUrOcWVZfjV>buElA1Tm7>pe)@AaTrVxb@y8**{s4ifQ-mTq&f6~-KQ!GZ@!Ex6-uI`k95!UZ@ox*i +Vi0)Yvu3@~$3D~uEr94rBK8^DI3Ll{BCi!)&F-8X}YJOc@HRXeckFx9K>dkfars(kp{13mI@=do~t=IMYP5J2e4 +~F7LhgI4*O3deokBxu1{lJk0I)*8S=Uyy0lM^le%;W-Y_}K+>_m +CzeZV}aV^g9mQz2MtVmqg8f+?4Mln(d#K0iGRHHJyw3R2*7g?Z5+}N()f&lv_8NSlt1FGk>r%?SkQvG +n%r}k_wC%4{3zuO|>>*Nn}EX|T{4gsr)o#~hT;N)0Bjc7lZ@w3g6eb|2N+#NrF&cvQFe&f$Re(^!E9$ +clySpO|9>;bNd&j%?r`Z-#<<0IX$YJ#jPZ8RPXvX|Q5SK|I~T#Z{5xge2C;tk|S7SUS=Pz+vADdqUPX +JOzGepq&tpTOS_@b+= +2G~r`RUb=5SB?EW3ib%4%0Ro-yeNCRPPE!Do%ADZ*3=+8k&W{Wk- +gX-6hB@=N5SG_F*>@)fqR{zEy#P{S7M=vJ2k0eDL|d`64DQ>QL<6Vvz?P(9QD9IbqusCdNHH5~h6iyW(~eFpVrPz2%WAFi}mA@Q;LiHlWmZpQOfNVO%t +n}OcmIJ~Fk1TgW>p|B9FUtTeC2H_|@=9B0!A4oJGrMDcVvmB|f9MDzh2*Clmju3E=WVtHIewTg5`7pu +_a%fY_kgBU6AO!-Ek^^bgaa78@xac3?5Vh7qs;pDs+g`egMmiu*=geCpWf68cv74NOL +l`IKm0a;g4evcf>P{6Z!I8p`mFL4^Mr_djT+rr0dJ7lJ^f|rVMYT!acVBC)xsuvwgjAAn6n{T+Q~(Cx8z%nDN=O35vrcy@PDZKkZc8>e*b&#FHl59E +R{_SyuH~r}-D0tHDv0cD~^O`;P{*#zK(-Vnlp(!`X?g3a?!uu1BXgPc@^ZI!AwpJSivHC&4M750p{v8 +5|}Laq`^QaSiHx)H7lvnF1$;^I%k)2D**QhjkhkjCcwYRG4Sn;*f%z;BU^D-dFoxC5hup(Ur=GMytG$cI@ +en|w~I!<)iL5t`seM5sk84U4f6A&KLQxPQ`~+u^52ciJ0I|SjQs>YUE=rR#R^t6Q6ere?@NBC@$mSkI +!^k^pTl_Y6Msj1ZQ?(I2X~+G6Ask1BfjCVt?726LY+T2;zKAO`)v+fK)=Y>A#}`zzT8}fHQ0|J(MGxb +c-wPxPFsJfk1-wb)gyD!xBF#NeAwmOU9;-t#om?$;+ahpU}{? +db^JtstUaMmZ*AKAa-E;yGFxCf>U)8-G4O4R7aqNIB3jg4&N8k&eg+$#`{K9kavOY0( +y6nPKRqB?}A;0JtfceNcZR7EQiMUA?EvWn;++i3J{3aCM{GGH{TWD*Juk$T_2aE1N-Coj>gal@5+a?# +cv1O1fS<7u(<~81;0Tb%xUqt&T@9l&xrs` +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 +UG*rK969gA$6&gZ< +dxd;wMdLuJOPw1?}DIUFj$H8}Y+{#GrtK#*z4C+3-2x|iGLTEaJ`ldC^mYJu(;~oRgvrV5=ImrQNPzp +6%20$S>F&VwXlSBNkrx^_^St%Gj%Meh+b8McDex9nhT^fghQ0urx5#MmC5V-V|%Jw(aXyz)6w`7G2J5 +fBYsLC;GJ)@PM*OMINi|ahfct|cf(31V0ztdi4z?h>kcgM2_H2d)1WavZNfHAPUq +Mokiz}$*lFukiX5{Rs~x7w~+wab-fmBRv)g``-`B=us1``R_mS4?6$MG~!qSsu$3p*6;LC24Uvy(`KZ +{-p4cM&&ODu1G*w*>X82>%3V1apj1)l2S_QZ`$rCP}`pw?fk0AH$nc00Ce$b7iLtSBt|3OvL8xEVYw) +6ActDezjrC!oy3@F@(yymM*v3MBk8eu7JEjb72W(+AaJTmM&dcTzlU3|mPFNGH<2e~#DCl*F&!iE>}K +lZ3!P0J|9nH6MfA9i2P2)#n}Jr6dT06Zotn3Pj=;!^ue9cn(jah;6K>kg^pW3|v+FaX!H*n^>jQ9ZT3 +l6$Y$7*&D+>_W`z^AG?SBRM16fzIS@Dj<0KQ~mxGW~OV@w=pC2(kz?qV781+ln@=U8{||NPJ6qyPNh` +sx4vkAJt1|6$Vq<3Imb@4_v8d~|dqaX~-f6)tu~(BCK2_$Wg%>%F%HPKL*`5AV4PA7H|tG}{K}qgcT} +S}^tj-ja^anmAKb=@Cv_>eCn`%{WwDyh$LhY_uichKmnjChXN1OG6ioNdFJJ^H^#`W6VM4AarH^gaceXu_N6eH#t5Rqj>W^r% +Gpo=xj09-|xD6K%wp>kqq}~$GXdry+dBeIgQm)>n4KY!^h{b>ByD}OupWM>~2VlciH3V-+ll{DH*n_3 +rJaDL$@h(qD>&sCHQrHk)RRk6n#K$+IHETJb7|mv^T3Og!82RWvc$Unpam(7Fh$!jz2W*bhxyqRg0or +wK=&Uk@^8fYg)WrR8w>WN=9%|z~g5nMk?_zwN3~&<)-pSFI(+?- +_RTJrL6N-31xEcho30$0^(UAOUP@Bi^fp2>QeA|xuhCQq>4BscKz>wjxfSq;BycpCXIm~H3fxT;PrdQ +}m<60&ICFI^TP^o3YMYQLz@WT5W8WL7SZ`DMH%I;kUj3J6)ds)qXc&1vsH!@ACRoOmK;WzT(^)Pva9Q +_ky>K`ed< +lisf8_r95z>BGo^{q?tdGdzqZ&Z3Zactyy9<&|hqMV{RbYgT&+lm4iX=x@A}$)L#74a|fz^HT#sU~9Yy#272o2e5p* +ZRtp}|4l5vmf;0I$$_$X6Haxun9||3Y!unM|j$k5@kJ(znp%@4QD&`TjW5$x> +gAjAaq;?f%3V}k;X63C<(p)ZmG8n!$b$^(B*d$A7y!C{*_)Ze$G0o)?UQ=y0(^OF^Y-TrxNGP~pS%y( +ja=ezaT{ZrAK#31e-kZ`N60Pv;g%G4F%mW*8ie_I5c0~uC<-5_zbe7j-l)K}8b+cMzrMWtQJyvI^jVD +$3{jlK?pgNycD{s}fI;3q!Mf^WUl+D;6hS=-Sa7RS~*80Y|6G!9yA*$kbYW2NK-(-kMsl8}h9K=(S^q +p6hHp(Rsq;fk)#*a)Hu4^D?#=i^=vOD;KjmBXjk(udSQeOOpGN%*h2@ZNH$1y3j2~pfo +?TZtxl|W`ZTXaN^RPnQVzp}VqrTYdglayy{5L(2m+X)0`|INk%IvmkMg*mi)8`1D%}jRwHjhJNzy)z+Z +QJ=?%xlGihehwLHfVWp$`>-79}TZlFCJlthM2W?=!1#&KfGSOuP3IyFUlAM-!4L5}@nTctIzpAXh53b +uudxila8s+v(q9=yvCjtQp>6CfwG5bEOM^K+SWdI2HasoWP_8nwck;Y|Ugq);V5I^< +=|_hC)R^9?}%sg9MO|ujD4#m?&_6}s>5i)!Iu0dnjO4W~7(wro(zvoMExGtM@ +5L8Dw&9L)5*$D!1w|QfgXngK@Rm#0xt86y9}RA7obgvzr|HUsw{GSY+< +3->xvppLR9H92nTf_?RQx6=0PfCZBp6xC3l|2JI*h3A>rmCB)C$=&{W9a|(m!e&4z1p=-H3?drQajrq +u)pUK0;roj7^qXg&j5}SK@>CEFzMi+y|=28!XJCD1Kg)OV-ShtAcqKwXd=+_+`W{csG0v&^`Da{6?57 +GU`-y&nJ@r+-$*Q-F;RGfveBtI8XiS8GpUQ+AT(M){p2x<) +Ey-kMVV6SfNa0%VZ-sr)&;~CC7(t(tgV4Do?;3j?56H(c@QJaM4C1jr+|o^#94wndBoI(_l$0;7k?~6 +tAkx#{QU6vVrXMz9NL5<@!fBL1T{*Ic5egSxG4IG?KVjI));1 +9#2sU8%#iYjsb!~YuPc4WiiDyWrit7?WQ4ffaw_TUMkt(MV^w(9dIE!>R!T6E>O;7IDFmgNKd5 +fq4=Z(WtW2AprE!Tj&FN=3Y%zv?@P-=%H?8vyb=th)+TphQY+7P)?V__JS(m4QuiaWzsQpigcVX$eZ) +vDb&3aGNE$6VUziMBWuehv7Vb+rO&ItQse=U`MAJu10WnbW=q?-~o9=`Auh)fU+rHCNcpO%4{a(!8$ssuc2X0&TT6sn*Z9@rMWlS#5*o_Sfjo7s_uQcBnOD7}`x3vOO +GVpl=B$$WqUDOFV;%3=k)Xux=E2w`gOI%OC5-p+iABQR-cF`o+MfRNDfs`-G*#zhaj#>Kj(1&id7n3} +>@3*n4z6bhOPw;ApN$@OV#^7!FKFtaTS1c60|pOCBBFYB*VtNjO?NpJf4}(s2VHyyg(0QLHO9{t2@M#o4n4MgVlVEr9giH=5~TS{ +T!Get~kje&00|lCO}%Ng{j~whdHun3e@Qd&NW5K7Y%9#s6^6dT=_eakxvesCABe{v;Mi!0sEna#ba|8 +6Q$WOp+kJ%x85+Xbox2L%QFz86gP&WshB=7q>5o02+uV;f+qN&y4wStIR~-H9jHs2VGGX +Z6&)t?jHLYy<%={kOcbl&_wQe6JI1 +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 +vctkd4T!0Ur2E_1v +vyGa-GftZ9@bJP&lgs_6`>aAmo8+roNRo1fdUW0?(-r)Q!!AKw&{QSED#bZxEE8LD0e;gNSqq5eplnk +JB?gUb3dOM6&Tbk;&N2r6c?$8!frDzfU3)RxTajFUcg4%cJ;966v`#`m)SI)A%oZ;vhEjz|;%+7)s~K +Ckx^w4~)C=sSCwNmRRnX9-EANReB$^3*5MX%E=%ukWE4^-+(cgbq%BA#5z((zl6d`e)Qe(Gxm2Z20vQ +=!J9WK=zax-a-eKH8By?5ffD7O7KVit8(_t%0Ac)9*;Z3qj@02{9Fk$2YhtJc4w@P+PHTBNM-pZT!wC +@<2bjBZI40ymCWOVE$EJ&6HN`3zW7e>%NfMgW0$G~Nw39LH=FQ(|e*KHYx@k|xz{lq@88%2>#M&iHB4 +?IlM=5jY1~Fily1o#rGG#f@&a0+b%45Qx9_~DE{ubJslC-ccS`u}fS*JtYKF92TC#=VPm-@2Emow&2E +TB;6eiT4td&4UE_i|N33me#K*GRl?>7?iDvzPci>ljqq)M4Vd-mPZ%7ErKL(j~D(p!Y-c +?oh*f=*2j9h90q^|W@)vQ$u~aWrJ{MDku`-JnKBF`W8T=;08Sjzd+Wjq?vNF~zPU-E{1fx3_R0VS_aN@SmH~Q_+n3shD1T5*{%`T||cI%ZcobAk9noFfJ_vOlU8^pnme! +^&AWw)meToNDbL(dyA=H+V3l>;>2{C37H$P^3-hUCi0gykY4+V5obCGlqu#65oVU +y>7iuZlJz+#%S2tlZ0zNW8WO~Cy--7K3Dq}6%VkvGSKvH(zFsalPu>Z|N}s956No2~`XMLAzBW!Zn +HWP_HKX`ynrqNFF^zdJ)~F8MiLGGFIjbJG!;^k-AwU{Syk7a|NT3`z{YPKdTvRCBaOs@_I{cf2eC}^w +lCJ-~SIjn=>nj;Dwgo&Pl0|J?NbN9zHPxX|UYgxdEF=(_Hu)yF#s`;w!^t0Y3aVKPC(V|`bX~a6O={YwI_R~LqD~XRh%`P8p2-jSU=@v?E`P_}geqyQ+GCU66pZ}`{07dEuCK1=_fXl9TCHh +!dhW(6C4&}YH#nISrCZXJujMC9yp>@#n8jiANOo0;?#Dvg84+ydvQKX-^^y4dt}M=)l%rOs38~^Kt@{=y)<^xvYQwWQ_%5tQs^#S02FtB!}c&6lk@gh&F +_L27_CML1$$*d6z_4l!WR*Cm47L$tPjd +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 +nuSf`Q?F<@uCdb +WJBUdhq{e>}xs4nxm9oRjK9GxB0Vp6R<_`TJk+`{^_ftf7Lr8I@63{73T!NW1IMD?ZX}P;Me|;l7b#6poc84zUaSeRQ-0>|V+Q2!28JG)NZ{=S +Nqas>ODa*}^d-*k@S@7+)WJe4Y{Ra;9f9f}kA;ic}eEU6#&(Uy~uijm}dUtts`Tk;Tj)Bh~Whnz07YZ +FXP=U>JUR9-J_;njH3B7v(zoL&qmB(6zJp#&$F63ViYM%LQ$?y|eK(cgDgvMk9qg;p3FOYgm%_hv?gQ9E$87IF<@ +rtg<6`ST?xJV8jSF>@V5*sS8#27xHX=ve@CH54s$!VV~NWfCK@GRc& +*s=`iVMUT+%w8D>CV-T>H<@57mwS0etM+n1^i}Hv@Z0@ID@23yd#^zE_AGTKIh0sTZbdx@t%5FD#LHH +mDaxADcX3ok{R${hgD&0`=GjBA8FW(?ls%k4G-rPfgjBp7p5O%zV6rt6@9MT$A-hn^Gvkbbukq|Y1{3 +R>}P9aOgFB3 +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 +03af-S +v{Z}1>h6Tm570gCU3**1Ctfg-uz-wu^P1BC`_qZmiXg-xdGCHwl!9JTy`Y&@^8aG%dJ4Q0jup0)eds_ +q9hAi27MQQv6I=rUMYdHN8R-@j-I704jr#plz*hc^a>4qDFl-Tdz|>;(#~BtEsPOEeM@Tz-~9;W0s#` +>B7}rJXixU2Bs@{go!nrAK;gijm<*_73xDE9A51tq;sr?$*Kz|l7?NLOJ4#Erbj!ggNZO!fDl6O)9W& +Wz$Ri4g$6NJ@EMrbVp21J7rk$_`tn&Fq10&dwI51~c?xgqbR9rZ!25wnn=H^^&qPbap-ZmN3sN061J2 +&bJ8m-2nLV{JAS^P|2c+)k|%Q46vL8cAtS*uSjdz(69dgl#cRqCQ6oJ#9WPwz%6;8mF%E-m9(^~ +FzP&cm%?h90((Kys&Zeei=!DT7f7vLBa^S4vAjOzL_0@h84_|#;=9kEO5E=zkY}V1KZRj0v=T~o5duu +>cSlsFWhKXMk5gE4ZLlo%h+{}ad!&12c}ayhWdj!O!NyOaz%-rraaVh&A(6^Djm%i8t$F75n2@3%n7Z +2)>e*q|XXBGVLoOp$C1LbKWfbOA+=+R5}~jMF_!v0u+V2 +QwnVT9I)yQ@+H=O1Mm&BnjRXuanx9*>R)4V(m-w7=yZNnJ&Wipv?%ZyEGr8ZC +tMR6qeRQGE?+>YU5OABsnq3XgOF>W_b+f@qd6t2>6EyHyhJ_hK1{aDMw`^6zgd +#hvMz&gC?amBw?{f9w`u%!!{lkZepMPUXJ-)LKFrkpwJj;YmAzQu+d+2jynVzQm%J{0R-(^?VYlQYHT +V1ceU(O2nA5cpJ1QY-O00;of09jic!Jc4cm4Z*nhkX=7+Fb7OL4Wo|BT +d2LkNj+-zLedjAiJduj>0goOVzEA0|u-*wq-lrreEK|HW-uTA%VG^Idf+0UduDst72j +Rc2-hb_@*qAg76ZKKfd2LhtKziuU{S?vaFwCD?^7f6?Tq(_MfxUUO8P{)5r0uXmB=MN;NyD_l6T=vn* +qMT56vGK0c|H!pMkOIM?(XyrbM2Jbe@GPgHbNKT&hxc55Xk&oJ5_w7e+)xkG9#QZ(?~YD$HtmFM{#=p +`HMNG$Y>bAzw=N%fhbdSF}*5Ya)ar7}SOw$zv^b0~LuF#DzG3a&_r?e=gO8Shph)sp7bE*70jkYRS1H +jfcbr2Rc$S4hMqRPd4Z1jRtY5+0=ph}f9t7EA3RPw9k+j`q+rOfcItaUzEDJ_`9R!kAl}GHoK#{ke4W +3u?zMh7zSXYsnPYoMneuCn-6GeIne1xE;Lz;L@VHZjlsIRr3c)NL^{xj@!j@bI+1qs?}I(A5g5j+NIH +c8ntgIb!~}b)Yh~XcH-9rem4R`aG<7PW#S4QzJaR*{@Cq5(~q;+sq?8l@0HR&q(&+j7Y)2qcCQydZ! +8;A)lB-EY5s%o7-p)FUq2399TBF+DT=?w+2(EUID|hmMo$MAD!fenjQK5vR5t5s`Ot)h +86zZ2Y^HllLc7ik8s7I9Wfh^)B1P4ipTek+<&cq1xqElN?vO;M@lxM?Z?X;gdjP+FbCodBMzAHF}1j= +noS`s>NrwHk~*8*9mluXPMw%r)e$UpT$d&T&+sga$YuRk;fVTx)gs~iF_{GEU>GGQvUTm2l&y>a +EB2a&qZdaX2hbjj%q+R6A`vX_i57H)!dzUmhk&bl%AERgob>L#bjzo^>!7oE73jZde4({(@AX0>RoMjI|Q^k3m#f=D>A~-y|JYl +#o46{SyeSLg-3aISUkE6qji<84|kE4s@tM?aY@cs?G|L*+VG5q)=1DzfpUcj$Eu`+yj{vkSge{p$^@B +Yl-CvT6+E55TQlnT5W*q!A5MZ69b*l|W*tt56_ +cC)L-w$(kIBeyM&Mo9$>A`${v~??B5_%wK`D&v(UlE`j$lymQ)k?BJ*ae{h^S-0ibC-0>1@>qi%#YLZ +b395NE*hw0!;9AAYUWdcc~WjSc#VhMVu$d=pD@wgVHszVG4>0?nUfaRM{{RZHGeLhdO-)a)&V0JkYO1 +ENr~PT4al1u=gcus-X-pL`uNP%|LNTb}a9J<3w`D%kaUOKrhV +TH0Icz+)<@b5D{xeS}+GRnFgw8mf&@e8rcbm;F{17hZ*i@21JoI#wao@;898YOBr$ur1vY-;hhBk`jAu*A+`H-8HL06}7C7zSFMa?(@PEZ9xA2FNt%ZuB~rXw+pq*Pag_*T3VVa1SMkzs$jcTgt{7D*DI>9W;idwAV(Y`wL80#fkhf!)W&U27?gGSc&ggFze1;f{ +*}X3d%*7Q9H3m|LL;;5LO7X85J@%<_ +*Ztt1j%NT_pb__$IDFOfhhamxCaVeU7ABAazHNc~b59dkvHIa9vFDbn +05OYsfJBHrD5KLQ~k($%LW-DqqFIGM2W*^+7@c +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 +8`$eMO!@6aWAK2ms3fSz8y+oGB&+0 +04Fn000{R003}la4%nWWo~3|axZdeV`wjPaA|ICWpXZXdCgZ*Z{s!$e$TJqJPfls*O%_mfCm&^aVzfD +9opW*5Cn#r$cb={Y)DFb!La{6O0s3iNrr8A56ep|Q>3Vm97vMn8hRLj3cjP}tbAsL*K(uWHuDp7#~@W&k^=6{b6b1ORPF_I2fb|tT<$>f)i&>CB=;69D +(UnVZ66{udkxYHLAS8xs%z*0s0O`dXm+#J=2)}vN25p3N(-~ih!t&`1IgiMR#OB<8AC}jdg0(nJus06 +_AS(C?--QG;(aSvV6$Uv4Qbu9RLAzLpr$L0CXLxM=C1O25BdY;iUqL0V~1NQTUo$e?P9={_#R;p%tNv +7Osw&sBd1k9gxOhNvl^<33$Cjw9o=V5okf8z5GI*Lkt-mHLzh5_hR018S&VVvt8bBbw38)j8St_gyaF +tEC`2fnjKJkjcIya+mWOfSblrtZU%LzA{?cz^pI5BYBZ`r>G+29CS|_6Q7EKxUwbvZvs2eNd1*EPt--VI4+C$8z`%SHtE?FibTQ;RjjT2X^ +L|e6Wt(YG3W}eUEoz=cuQ_ZTunAs2%fg!1?r{1GtfL?$h?pZh)>ROHOdS*_>bWK7|PR49IaMrAyTaMz +={(yYL9A+sYN8a@f=&N}bbg&|-Z3A`S+kA|yWO^?}sA)VNy!WSO)=Y4N-jZ|I<%A7Xh>|Cg(HSHvCyO +}V5+`i<3lr8>PnG5u_b7WGZu*ovtbix8;sURSF0WOf`CxB0QH~v(bR@K(DRL*y9G+mo=3^dSz&~SQPY +MGIeZpubst1E%{zgxSlsANu+8viu9Re3Y;j%|DC~q~$0iFrARR0a_ +zoH-(m+lO0hwYigZjtN29S~25qeP>p8#&+GCDcD`6nPBZyBiP=t7IEuwb!A;0n^hC{ +0C)LQYz;%?0N>w!>6)QOFrRRaHyRdKQ8{|*zsRxjnnPv?AU=t{n7fYa1_;&Kkv;WPG5AKxN58|;2O46!81dmvbo0Af6rC_i;3 +8y_?4$(5BQf%#<9r>y&l(gWrfN +!CbbhD!cQVF)77beH=Jl9X$SDtDZ>t^RaDc{O=-v#0ZTj?NskIzmO(`5W4E}ha?r5B6nPW@+O+AG)_x +GA8tO+vCR7LtMdla0jsNJvZ-L3UN{GY3n^e$}MIXrFbBhTZgTB=#w*ubdzm!6M}`GdOQyC}hlbr0 +Q2sb4fMse>7z6dXqUqNUeDix}bw&)iD8kVNpkYUY$CHoW@0xeNCJ6RM&DzX +3lj_;x@JLxt7Z7lKbxx43HNHzo8BXR5rM|9t_L7;~LS7d{$zaQZ1sxj-d+ggD?dO=x-+Y~7YEs|BN2U9+S+WSzcquC^P&6;*BM}1LUqENH8>VDKnru))Caek8R5~xV1nT`a&8!wt`D +xDdcTgcBNB+ojbfIh&4{Y5dfluARu%Hzu)cAK&zciQWBbqY9@GeVyx6zi(S3~!|LnA@(fb*X$=P8gw! +Z*T82dks1_Pr$;3)_PC^Pzyw9#Y>Oh)-@LkzUw+RrsXyR_%ZvYUSHuBJ0pnW3JDo +ff?QI@d}h_p>QE3tgmTz>s+IcA< +%!GIZ0~UbD^Qgk4uHsi;wv;ck0z)0 +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 +RI#OSvmTkH1L7}5iKqC}dXOR$-4uSyy256M;h +zgjlAd9-3I>h*Hl!q1VLNZkiO>|-evF@qTQ`QAggx<>+yctXtR3hmi=?|65PUb2ALfn+KQkA<20o@}Q +@dOCF4H2lTUt?5j=g4afoggsQtsJld)*DV;Roa@@XDemcyG>)RDJkB9#7 +eVAxFB&x@o%S1U{pgVN`sk#0OVIF_`g+A3F%M^qlGG2b_SMPIFJ*Us%mOU(5JTchl^uRdfaOk>w`#h% +K94CE-zb#k&%}Mkf{=srfIi2LJoS}j*>t(egIbha02cosn0#HqN*azwGq`mwAdF{ +c~|~9G{pE8sasq*!}*(`IIc$Im^w4gd3EsjAv58Kro +XE%$5~cAsC;sf_p|StTl}np+Jr4<*BHhr7P`t9_J4E4x_rHW~GE4OXl1CGb%?=oUDG(+==H9ikauU`s +LnYl^0X7I#pLF9E*jAva&x${LXT9E$=b01j7kxio{l>YNSYoQdHCkA^a+FDK;{!fVh=Xk~q4{Hrh~a(lvG{#P2x+yF#@=P&S(pV +%WKP$Qe%~l+l>JGh~dVb(=IVCyVn*0R4zBPNp^VSlu&kj!EWHxi>wip=1QKy9pgGlN5HAXnp +No(={b0gBg+#|&dGNx%;_kXDMB9(fyJPkn0B}8*NcCSJ&~;EwYC1%g}dhnM>myxLoDJ{ONR

Tk!R7n@?)#Ws$g)ThTh4~OtSqg!v!;!o(>Ys6jmo@L3;=FopC=NqqI-T^0 +$|7lJ*UiWpxRln?7{t8YxUZ2=8$LnWx&UH&~$eDA*vI;RH_c@_e3?FTZJ+k|@#rQm}cyV-|_Bfad!j7 +$GB;sc%JLhRDidBx=3T8^6XX?hVz|a>4R%NRsAlNgscv55A4%MDedl~*?)Fs_kC@}LTOybv__!2#1(H +#(@8UIN}MPOz=1i(n(WW#MTBJ8r^HklG3ne&{C$cSvXO@b3TQ#VO?vS#`&nVg57wV#a7pUiqnLbD>1e +}|7#ma@qp6e1c-V;PqS*-~Wqz_T49!m5bhi>fR-CF`{&ugsMIy0OEyXrP`g5|YR8eREaTv`Z#tp2>tHJt)VM1+;tf +4oQG486>{xa9nOXw5Xph4neN6Jx0;W~N@}}vaGkTCU${^KPQm1z?eoyQD85y#;>uD=(V3)Ea>eUeMn; +qcL5#YNT^vZx5SUSEnFrfnNjkJFdMu@hS{h_xmav}PMula4xdNaNr%BMK1Dj!Y`Vj +<|MH^vfH$!eKS@(4I%83UWPLGX2$5x1lJ*5xrxT<7nz5k{7n93}w|R{WP|v)KF9(ldZXhuXjfk=D$Zwd%X*^G><`x95U!O%EcNgwV*Z4{35}=8Co00?<-N@i +6F0f$VKC+WW!fA?u@)Z4dZIJ=ah@*44cZy47kC17)c%U1(P?;&1U_NCv6y#IG|E1asvF@CHK!dud11>>7=+V7FI#CZFeJnooWCct9nmss!McA +B@^cl+H#$J(7}ZkjdPAd>ouKLgiW*7(+I70mQsyUF2IQ13OV`irZ?H0nT& +vGE0W?zem>zLAxa%ZQEc|Xw0O<5Eg94ZOM^jOYBB0)(P6TD&qptu*k>?!OI6zT<3%Y|QQAX4yKT{;e` +*AfIPJd@Yr|MHVh=srTi9c}8Hr6M|GJD0EoMXGBOdyMjHnxS(rHFo%YG*3tGisUZjIUuj!qhSsO&jj| +D*?6zNCd$L$dhB8A=R4+ZQR87Tc|;S2Np4_D!yGZO%VWmOhAHHZ3w1xQUb+wbFi8Q&;;)F501!-n6bm +9jNV`6yjEhRfp;6>s<@LEoNA?^4y4mT$5H%o@|8y17Mk&^dWAih8Moch#jEdPQv#XGqx6wy&|O5@jDF +#^k7EvLmkW`#Sb3c!z*`T1D?`D!Te{7sAH;tCn`8*Zpm!(LWSL`00K~@6@S{5E$i@2@lHf9_pkTS4Gi +HvT12;kT~$5eD#tr2dbTjO4G0*&lX#I8qKzMEP-1=zo7URu?3h!+{lsfBS=}2Af=i-W+;Y6lP9O)*37 +7@Pdlvt(j>BG#y7r~0R#qQ|7QpCMO@zmo`v$-{aZzxT$-^JkDtQCr_=rDg>i0N$!aU16nX~UiM&6b9iw)juB72f2aF6OwI49b$5N0v-EG<5Fh}2EiU8@3v*_{ +2$k2XrkhfC$8RG&C-EXEd`NlD_yXz`4({=i#$zas3<$5941F_)enSMXr5?(y!zPB(aOCIs?y{xBI>2o`m=Qm3jc>-EkDNgQdBs{$2QprgqGx7z!^5{uSfNCoEE-7Su +e{->wCoiaJRNNxh?KK7Bl_F+vMWZ8rn2wl^)R#11nTGJGptf0=x{D +!Xk}>~TjCa7X`-om{#WtHA|$VJ?WHrS*70vG_y^cXPXtJV5LbLrgkKG8aQrSBB>KwOVftBqMm~0=l3< +0AAcv8T+)Q@bay({+?J^UtGGmFRQUu@Y5%0!(;wZhiF7NhTFE%;Q0*DX}2vK*HgJw9%NYvml3~q#%f~x5`Nj3vjue^b(`|XaXdR4;z$IwT6T2odX(P +;CTM=5dv|7Jv5Jf5QFkdNR2Nw@G__P604*S^F&Hb}SH;Kd{DP$TP +n%_trc*W<Hh6nAAM^+T7$N7Z@{rSoLfWG3+A +FmQEvci#Xt#%uKd+vMtYoG#qpt7nX#(2z% +?wCRF6rnH5&LFXjoUBysfhFlJmXi|XM`)0Th6g}TaPbo*GI;9}XBjWS|~45Dj`Im6AC1|nBd4DYX+zH +c`CeoCedcpLk`bfM#+USlkb-FCJt@RjdOj!z2HTozhPiMU1dIGAna&1?^d1cTSwgf+1U^gS3#v*o#!9 +H$$000ZL5A{z?5M~U&yh=O6PHE-&?t`fC2CeX=R87I;4YkE1;O&jND@Zzeysd8plmbe=;{UmdLA1LRU +x+|yl>#>DLS?SQdkuW5P;pRQefZcjseh922J&4Xq%*TzEnB)b%8?F=^`(`M7Xch?XyreJFj)A(44_b) +wbm&mgDVxivd^9wIS2)CL@32r~pr%04Ez2^;<=ilxan%mVjbZ)Vs%mC0pDPW3|N7`t9k|xCu9{oS5Cv +C%8+-WP*{Q;d6$Pb^DKCkKHynCL6tvFERR4F|Rnd!?o6~>j~U~Uk>02MzX+JoA +LfTl@-AW6#?IYupCtNVW$T#)ZXE2E4?K`ON0Ov;50H@`3V1Z$5W+n +q!_Mlh0o5Bamjj#%*M7$Y$6IYhhp)k>cA3$yjk<#`i>U~|8C2Lnt5bolYmQbJ6Us!=h4^i +vOz+Q7`I{JYNGggq^#*Kuv#a{>Gn@;^Y7joRh=mMUib??A18qRzlmc-I=?@Z+!RiQNWX7NH9-Eyd&y+ +oDS3h^yX1jd$N0@BgkcHk{vL&{*YuIj8bc>mS@SZG)ePZ?Xt=9!6KIS``{=IU6Jw(PfC +>Eb(3h%T0kjEMqoBfywg06O_4J9S66IRhdO4&PN9>8go +yQ&PGy=-T(Ox_}W^o*t$p%NtbjGk|bw}W>YSusEIgDnok{}dbYEq@e3I~A$pP+}X&GR@ymku^eLOElv +UA*a1_Zew*-FL**70&OtI10|3@h}x$Ce_ImM-SB$T*0Pd_}{O>BKsIWCZ0UHqftkPmnIfg6r9t)7B{o +lWF$ifmq8JDJgbMgE7#)jFd>;)S2y#tMV^|C1Pwl$a|cH&F4vAy(G^dp7_o7xsc!0r#9IB}-=exp&ZA +u!cVsLiK9L2Hy)tRJ+kwQ*)S={35gAUAnaT;Qv;RGqUU5 +vH`(E8JXj3Y`)QI&Ao3+1vF_LhP{gzY-Dk(M`*sbev$4br^Mp>x6Y2@AcE1T?+r3>%+O2Ttq_8e^4(d +M86*bpYD!!U}5WNtXGF7ZrQL{ti?h0jKL3^@_J`%<9ChEY@RvAO6mF+$}N}L*BrC+3y +erQETl-^!;(PjsAt?5S=F|VtZFdNYqMwUT`P(>HT{}rR38vpS>W4pay`HGe{`LcyZIW>NIC2}x9A?vm +x#l2>fpv+c3$Nkn-aouI`_2suO&Y!<{{_2@MbDbY7Ku?mwi`e4u>B2TIZO$dn{|>ooY0gF +6284K9TtUO=gxr3fKIHZ26vtyc3;Qi-m+fC>7BY4zxEA3w%i!+(1S+4zF8cB+yF({SXDFJ7pO3Z9BUz +U%{aVvTBaK(en^TOE4u#wD29^s>7aKpy9)WdoF9;S1%>r~KO9R>qp@Rnr<@2(s?wHkl<6lOa9-f$mv4 +gOnHx5d7rD0PHxIF#qjTof}&yj`CP^P4ACM(2f_j=c)P +uaCyw7v-~mFhPXWTi<+@v25)=3P5VVEK5Stg9UbXa(YwecR~DVe$M> +MnhtWFhCpK+g$z#lK+gF?)14`|yYq6!X>gLZGpbaFa9j1CWTb%0McFj0)eHaewzN0gAqui++dv}26le +xTHG2heKh7I4EOHhM6!mQ}IYLKU4nFTHDId0ap%^a&zH>NI6!SX{v)NO^~p2~*G9VU=Rg@NiXvHS;n~ +8}k<>RPb8%`g5xZ3|)oVh<+E%%u-;S7`~jby&G+{O9S#UNG$?T*qQY%q?u(zGiV2sjm}%6JYaGG#U?; +5bgd8Yyq!yvI39W@(0?3rZxFe+4q-PktSnKr3C{zmPT!uw@7O8_A_;$vhIXUpIsIyRo^QYc&-3^s_)~ +^7to-ZfMSHz1+D@47x_zh4d4(?+YE@7vNQ@o&nXl=~AktUzw?lwwviOblV;1&tYpmVgl*=2L`eihff& +-8jvW21U7|UX`^3zDt{nrBQRdSU??1vEYnP^Gw*T& +tm$PyWff>Q={v_q@(0(t03ioXU>t@)B~zco+QGjanuX-+wa|dx=`9(;3bO%FIjk}n3wSica3GGdDI@`>%vVj#H~6O69mr|WY0_ +j^PVK*xYzl85N{pC!5H(XsuvJG2}9`PFr%uG$9Ue0)SZoS*Q|RN?E}bRpRkzQr%AMhJYW{e4TpJdz^b +?p?mZ@rFBY^a8YdE!;fb5qKV_3BVP^eC?A;~i;>sq~5Lg}&Vea;lJ96eXpiNo~%(!Qh-iI_FoN105D- +X6WXT3g<%A3}F){F7!PPlA&m}J5kJm~qW@pz<0Zvf&JWp?I0Mrok~z9ifZh>dYF*uis;6zBGDnW^J+! +F2eCxpe}HMJYhIqijR!0{y{Gbn1+EK3KZkra9QiE3nTo*)~;bUYZgz@AF6+L;NjMuV<_|m2%6l`qa>- +GNqT_o6FFcFpKX<*`vX;FyeD68E=oj{|X~QXSbTaO2BqWrhcx=ivwgMN31d)1J6wypURNNo3Z0axohD +wN%;_0f(V@C>YZ3hfcH7JlnUJ8>{3Z;=KxdUFXt539|+Wb`=h&^%#Kw#qmc%FB>*oy+Bsre{{c`-0|XQR000O8%K%whJO8{DwI2Wgahw1E82|tPaA|NaUv_0~WN&gWa%p2|FL +YsIY-KKRdF?%GliS9T-}NhSbgm3a5NlVClXx#kMUj-)x!6ugI;T>5TUaa!?!p2I1^~6%OC`Vk`Z1552 +SD!HPUVA8r4@F(*7>FMt28Lqo_ldQ_2TsCFjSA9}%c5OG7xXmw}1WftK!9%uU`E3SKs_0qgOBM<-ni58mg|mYAXKrr@B|~zbQA>>g|4~OTOI=b-OJa{`RK&+rHW +^Rha<$pDjRTkLHhxTl`He~z)KWgY*y?m#k@pEz2wv8_AN?= +Zx(wAZdE$Qm3{ZM7-s~zRS=u1?D +t)zA-?9Xn`)~$-<7MC=#oG4*GzwSSp#ejLep~Db?wkD+eTNYd*FP#;$BiPeRYi#G{_tNstbp^#_;n7z +hwO1+q<1cFjOB*?YHnbqrU|3s9w7x=8QU)>n(xL)?(-Jh0hBv$ov;PY1 +TmSuQ({yCcfB(Ab_l+8`FytQn*36Da^cT2j_M0uYU^bh*tk(4w=2Dp~sUW$nhnso}-~ag*X)GQQgl{8{`Cb&w$U?bdV`j_aY^LUj-T!tU;peGd`^Y^$!kC +7^0`4Pz(mt13C`s`c4rx!Zx{>kpudK3vYD{2}oM$DGR{lKAq~^Y8vzz~7ga*S=g=1u<--gnG^u)62T2 +?ngM$S;GyCvQ@kN6#mvdtO<8Xiz9ryYH$0bsjkcAT>_9Gva+F(pFHkB!&cp6;1=5MviP>!3n6MPmIi9 +eVNI1%>z7s2fVg1Hg9fgzZ(zt>wF8V9(C*cGn7icClPo!%i@DG?O}Xo2V?&LF>C*BWQK^bOhH`z&IU81T@=%zM5I=z*Rw&fH$-T&)K2_M4d}PD=27 +HKVTc7CX)k|0E2hab~swgEoh-i@lp55b^RXN4$ROWRe?uw*}y2-!swmS<~%Hmql7@O^x)u%UgKFHTqK +0R1NH$#xMGwD7tQ3l)IF>vTyaWBWQsfhGu1o7LU{mcRr4^{-?M=T>nx%b=#=G{Y{*39F&*+dTY@F*$X +WAzAH-2^L)160tTni_MbyccrVQ5$v@nJW4U81#25>MRRViSnvKh+5@+_ITM(`}j0Y-zmWoN=*HnU!9d +h`w1SSyhOP+4 +f`nkefc}J$pob~BXv#ma$di<7W@a?PC$g?)WPi@q`=*&$S-)4VE$|TWa)}c#(4vg!s@R9*Evq36EMOI +&yQx>Jrc#92wiBdV<5rc&$w>W81d4?aJL*f{GY8B8941!gt`DbYRcH_(iy#GU(&8%$309B_X@KwA75^pQ87Cw}ZK3K +tU~<1{@?%fZJAmI0JWd0OThc@mKiP_M(6%r{s(Rc;~(n#~z|!p_XZ}2A{F*?sBx<=8OS~0PF4!{M%+d +PoDlJnQ`=FWI?h7u7(xG&A>jpcImY3-sXo-ehGmkvTe9=wrow2Y5{??P@JUyV35q +DIKxR)o)1-<7wO)fxwF3g?E=FM}40K&~?EI3?;xA}sVwyF~pSoO3~j3t6chHBp{3ecynt>-rYpao0mp*pvqHSOfd{ED7!B%$GSi27 +uqop=ZkRssQ{%sT{gO{*+0t(;n5S_PQZa(@=)wg4!bDcPu*;(C->U}czcT$nP?Vi>C|*6We_Vi}%9GQ +omfe8w=Sb!;rcmG{Qo<$Y;fx1dRXHoq;6?VvCYWKJbjyk;$j +j5Qtj;N0*z~d^7#0FKC62^;=uQNx_ETS3LW +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 +IH#tWG6-ZH%P<|m@bYlgi +-#!6f0{m0IAxGGT&Y~`%ek1m3Lqky5xH{`}EHjAThpWxGJ7|?#OA#tm)2dJfLPzxAMTmAJ;_7zbxHu% +#CkbBA4U2T&b^|W@c)zw$MR?azbLT6dqeO^L^#!GDWzWv&1G_Ad3l>7+DJB?-NBRFC6 +w>(AolW;Mm;}wP!-a238&%skkV_j!=B^1>4%m<0Gnhmv!urI`|!bB@o`07$YsHCI%6YPbT8L=g6O$lR +WujbX6@IEHU>F-O)u5$Eg~ZZzz!L{uUQAF2KOz;*ZBgWp=_|{ +_7pTTXeT#N6rR)&n=^B0OLLjG_pO?sYETnI75rY6TXo?~tuD(VyG+mBO?j8}H(kAbH@eG=>C^s>GDQQ +a=|g+yn1+>H@|h-$n@Wf)`u<|r)Wf +)&E?n~S>Kc%HZ4I2kL3cxmFt{OgWmj8g3hlaQc$O?xkq4bO)lu6t+z3Qs+U37q|nF*tZ>lr;EunMH@8;cgwQ`T9e5054_kXzIZsCik+>8#Ba2X-7YrY?wPfp#0EaKTQmuWmrlUh2Kg13K(ekf +sx?B1#9G8Mbd)5x`Ld|`pjT9-upGsR=-NcM1C?I=pP(wr!|Pnnx&xE+xi@y7KSHNm2U<^e{2I}cid_{ +`Dg7{Q}k5Uy~T6;K|i+^IwO(b{%kMeAbArsy6Pky}^H*YUgjqBVGwo<~RMg&56loRCLk5e%}fymhVz= +D8!bilW&Y;$D%0H+*T0xplHdoZzUrqrpG27KAzFwLDH6yvr%Pb9rGJo(|(N(1`is)SGa*R5R05!e=fL +p&%%EBji+pOD3&?R!PG)M6=+IiSuD8WK?Y)?x4u)iyS20y&aw;!>q#NBq{41BS{ILxk%=2Y)!0ho;3b +kdM9kWc6L0kd5UC7s)&h%2o$&X3v;O%$&nBw??CbO!_f)PB%(!{U6GKHg{vDg>*o&X2f)i==o}O?oud +gh5SR>YG~0qV +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 +%$p!!`$` +Ll5lO!G4zz`}23cL@B~e{|F$NF)EvBiF(-^ItXsYHn7?e~i+DGzkB;6%=#3CILE +R2^{8e*2M83I?e*L2oI3*0PWyv?4xm_*#aKxgA=@yJ~s)}J0H66=2%1UdIx$qbS|WK=|Fz>6Xh2~NAD +d7I5^5B8pFVt8c$_6!IqOrsD!kr63A(7Rqt-clS +G3VY-Okw61=bh&63-NbAMTP&o^*pMRQQG)>A5e2xnBEe_yP+#1g`kwsn`77ELIrR0aL^u4Oi#bN6zIO +1@eb_n5Es1jIVm-enr`6kuV}Goa^WXK{pQniN$MRzEuQ6w@H3;nz8+sd|=|MThoXJIS^xS9T);E|oir +BrPHc06^Tn%)4=Pjtko3Z%HRnKCXKYL>7~V>^;Dro6#9}vY5tga0TaQ(S6(N_|Y_b94YSlhYDPLI4~F +$8cDqf>%|ryWga23PuMUqZg_F7H+lReSr9RFuZP@dm8OLGB!%c@qP9aP7ePVW)jRxefjbSoG%L4j_@^ +C{w6|+A@rMf|W>yhkJf7mtXcj;~|ZyMi0&!!1F^B)T~g9N8=J4Bpk1Js53KVriga|673J;{ppjS4Nr +`(4k5C}T1fd~O?#0vY_!!5*RFxt=ZKySjtrDf6nj%~nm3cX-nP&oA5b(O+B}+)SJaMZ3y($|70syWPG +MjR#HWs0=RLbJ;^u0+j)qZ6x!>4oVslwNs@+PJ9->KPGGCOi14}=UdpErIA>7l>q92Ljvox*?$xeVrX +7@3nVr0MRNYL7LYrBTini_uaJbT5)8)L2)KG=Z?e{bdM+)5Xd!M1>&6-pR}}!j!?u;ldITq-05Wpe_8 +ZFxQF)jqc=Bhqwd^vJSQx2^aHClE;aRS)yNl7;@846C4~r4mr+8u{$Uv7ovkxZ$uIVf|`@TjCAE7Il-Nhdm|{HcWK%zO8zx7^v4Nf^DJR;`ub+y)QSJ}g}01T?eG2~(Z?DG;R +{s9h!L#Urx#;IVT=4F>IXia>s5)1#)VpUwOzbodjP2!}V>Q)2a}0sWG?A_9jOy;vW=!SWmTlwe{A#?r +#qWQ!3=K4l7+(|@Nv+04DGNgAp#!Xzv$emlEx3A2jdGB%*tL$GRgNY28xRQ{Y&_E%s5{QM{Zn=^^>!P +~gFV~P3nA>QYB+DM{qZvL3YOfzSRZyz{`zUG<2%+$QcTH=ctlQF8h2&(WwHLn_2P-F4n-NjRBrJPGsIuLSUye*>{2 +x0uf8A+Z81$DOVbzYg7jmQK42ix_(G8si=jyh2ALs1q>OvQxm?QuwuU>!1~#4^#=egM((Oqct2vdZJV +#F)SNXp|Ut`za=k5{UG*^Hzn44$(bbFif(;g5+KGB`u0(WoDna_dviXZj`-pB2ih)s;ChBX-RN;^9R> +NMsVc$_zvdo=O3S$ky+!E(M7cvFtL?QnrzH`xO(^ag*iocc`*{7nn|DYQVtRoU2QCNHq&1vXgc@E>mn +BblmEwyhZ!Hnp9aK9Af8FtE|%%e07Bvi-24r%3znua3I?!9U1n=1c*JslU}nhw)JhzX~&i{zwft)en~P%n$(PlWr+{R_@8L+RGVhx>mif)u&c-Fd3lQx8+f>~nn4 +hUX&p=)9Flz!c?aFovlH^f7<0FJZ4pjDz4T~dW`YBswVbmQ&t{4=zO-FrA>xeNZa5$Wqfr +e9Zo}yrG$Al;uK$Bs#^hGP-4eV@qHz? +kJ+O9G3f{Xh0a5_jtbnDBF0ITv+tUgg`jONzze +-k4r&SYV&##9~`0F>!_ih^VF`pVMA3KHqobZKmLDn`OlQKX1f1mL-lQXwzti0_kk*C2bvtU?((wtys467rtOgmWrzBUk`H#^!V +)XDNMI8>1*hO4h};7!KrE1e@a@IIU*~2f}APPh=*QcA`7uJe9U>m+Ab`wQ;ZVcp$KdCMH{s+w1=RoB3 +kTgx-gkA+u}0s%Ikvj@hG3Sbx|o3Ut@ig(6~K(dAj#AO5ixE8(({s%#Zk#)NeOUyW9PZ4LLa6&KNUaW +RDWt7d@IAAP*9OToUaCQ}M|{BggiFq1zE~1Nn@7Op{mgxkx2+cZB(G*1Wfq$ptRibo`Lf`17juo497R91Ik6vSc+T$Mzsk4ks%YB&3<^sk#WlwNnisM$IJ2Fjmp!?{msHz&HlB@M-l59Ey9IUEx^>#kGE{mI4S +6^OM#rRWt=hKM^AifjnzF>RnVcOOB{FmYu`dp(~y`?~A*xWA4ccv)A=no^L5|j34-aF3!^cs&wWh-)s +eNAkB&Nlfi?zXEdES1s|ibRu`XYW54OPG<+994;TytcFb4rD_yet$9g!~3_z?T68cTR~g7CB +x!PwSzJo(T=&`H{leO2C(rYW%Kz_Q(603wa)fi4CtQ{U1{sJu{1GCFn{@O9e_hrCF8ajw4RD~irWfc@ +L7J)PnSu*Jn5GpI?zey5WAX%FUxils3VftY`pcT1K~CK;U#=O@`nYQ2o&(g3ghJztq2Sq1?`=dOeT77 +D;j^-M|s^wn3dP +B;ysMB{8#b{)ND6CS4Gn6I}W42|$ZFH#gpr>lkp3XI%W8kep7VB6UxM~8uUN9?_56R}UmDg-@DU5hex +KrdOQ(sd#OeKJocr3@mh2i|aOA5-I;nvX_lcXU{9LCt6?ZX`$45sRy$3uNaDt1XBhO30E+GvJM@{93N +_jp2yAr8`*t$}z^UoM2#m-Y-|G!Hln8bnqLXrv_9L=$qD7N(=7UgU}`}VCLBf{&!!X2K|I9jW~~Kvro +en%X&-&lvyDaGpO5%>5ohN%ymb!*|cF|8~(g3j3|q2kr^xyD!Z}m5RBdloU#aBe}3SorolJ$=;oj#c=_0MLo&Jj#Lh0A@Fg +Ub63&*?1|kQ1J|Z0h|k+X5Gns$)TQ4Xj;7m8hsH562%2@RCN9Ipa6Q%v7->G|^ci9*YThtxdSXK(Nyg +CUvyEwRc!2^34@TQ+2B=IUcP9MnuFnSD@c!`D#_{Iuu{!IllEe4&(?(16>XYr=b? +p&)%?=;o~lTII21m%~WQ&0Sjk|v6xM>m;WU@| +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 +W~yXRi0nZ`MWf?j4AlJ3R)xUaK2`79&mor +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 +RA6@4jwExLuUo*ro +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 +c3S#(L%-FKOstCJHPM)SJPd<|tYT;~bwS +71y4a7Nvm5rycg>KTt~p1QY-O00;of09jjISapJT0ssIo1ONaT0001RX>c!Jc4cm4Z*nhmZ*6R8FHA{ +8MNU&iT~f(z+b|Hl^D729C4i8&Irc_NbVO7eC_1i>vP4^KWzi6+8u|Oq$WGD}Fd%T2w~ceDA+xO+yg$%uS>aT9nm3=9!0>R!Bls9R=8`k4X^w}?DdF1c +p-Pl=jxW2ldohZ^)6y-sSCnfmkKykTxl6^GOnQ7sH&_5(kBR8$YQOKMdYH;k +I0HO5HI+EI^|hLRE%#>y&`=Om(@kN#;)pMn+hrs +AID#;Wm%AoxGc27XM`@5eqY_nT13E=tSOMSD)Wd@oVZagAh=hED+)yopDuzU^xo9s9S{=1GsLQCnJm5 +yKeE42O9KQH000080LuVbThBUA@azBp06GBx0384T0B~t=FJE?LZe(wAFLZBhY-ulFUukY>bYEXCaCu +#iL2H9R5QXpliiciWNF=qlKo1fPSy(mT2AY$YI7yf2u8eDG|9v&dsh637dEdM@0m^;yxs>`$W}u~L$T +)q`#A{?idBJ17)h%so|I7ONN`Q`ZPMrh_6i4O +-7;TRaM=#RfP|{_^qv*!C&A$%v}|kOz3PIN|`PDuao?nc+l3|5kCsw!<7#NNDAbILYfE#wG$X4e6zVvG)1TgjZHKVxYaXV&y6Y`F{PSO64)&;n_Xki*0|XQR000O8%K%whUyVp +UWEubfvSa`N8~^|SaA|NaUv_0~WN&gWbZ>2JX)j-JVRCb2axQRr%{^;Z+s3xv{VS&8gYDKRK$6qe>(a +FxAgynJaDkk*hp-e`9%B_*awR$7a{2Ff?>!IA=wTa@c3rR40@lo){eI18vc)dW4u9J|4g(%%e0wI=*tx1~9nCDFv`6A_>$HLh>Npt4MagzIan8aDDCBMs-nHZig=R8v*PyG2jjBn1; +_@F)nCn^GddFeRnV)9-ZIt*q{GI@Vx7aX_K!7aAHL@3en)=I(`GSQJ$qGce$Z*A!2a +7ZV1YH1>Pm?IQ34ssM62Qbf!-3-@Sm2zD1^y!AY!0$zXG<6yqh6$b2w$EnI7ev;O3}HShQXAD8GHY(+ +XGmjD{Qu$F9S9Ln$jh^n{pmy>@JKV7NmYQ1?2){lF!7NCF_97;AEE#f*?u9h-{t!Bmo7G%2+-PC4>=Y +lkgsp4FRVq{6QMnhvCyapJ)9SFKC*Za(@iZakd*KFL?YS0&U3h7vpd;;VF*;o_WY>Z%zcd(|i_fWw{^ +RZX;@wD7ni3>Ki^ufC~h)o#EO@YZ&(mh64NeI71Era#1)7k(Z;TKspLXDR99BPzTc_AyIq+lW=c%t|8 +E*PWKb@Gf>C-aJHDi5`}1mWJydgA3#O?Gmm;WJOrbQ5LY%sJmnBr+mB88^++!83|N?f6@!+riJu~<

p`qlnYc2-k+QtonCH=M(gtZ$+7 +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 +z=p+(d?u- +Bup)Q8n2~@=8*Cq$Wb@EN@GsjnWXFjYjPCV?GV@fypNU|>GKqWX{!7=)B5~g^{dWxsctBtXjx+P|gqk +eoCPp}Uk`&JvioV1$vYZ)NA#@dr)QP-1uRa%;c(aPI$>F?yvZNvfpUWLo6I$RK@WX>8}tM=$b{@2uO! +*A%Qe%(v?60yz>`!9TTRF1?yUccV^@io09(|P^<%U7=|19o?JU%`KB`L!3BnHi=y$*unsxZr)hsQgLl +rBOboeYDj{VhIPCo#+(Y;m7*MV|D(1y>xUp17#?Tb{*0>j>EO7ci<|~x4lANJjD8Pv4_M +U!eX4CGaF?Ho0rm&xayB)`*Y_*@6aWAK2ms3fSzCE`)!`2X005&5000;O0 +03}la4%nWWo~3|axZjmZER^TUvgzGaCxOxZExE)5dN-Tad5s!sU*m5mlt7fmZr`cEJ=gJE4F!tqR5oZ +RVEFJDq_d^?>mxub+Qh_48sCKdZtl*ZU^5~hhBMBjpbv%Q0#4_GkR=B4Eh`m#2~m_5vJfPSfG$ +^DNQfEZGM1FHywsV+l1REFm4;fowbX^?cSbT9o5u}jO1Pmc<;G1~utaj6<&~dI6j2f<3u2W5K`d+h`^ +_ji`!qWH<>LBh7{Ym+<*1NCXCt%#KiaKauPB>WK2O=&g>%Z{%xYBp2$e`3_a+uOInQ`3Erf04&wc#!A +PB;@gD?pEWBuvKtZ003HHvOW(cSnqGyyOcJ@(W4;JK6t8Vr0gG#p +4>>HKtXAd4IYZ-9#cv$;Bd}*==Jdv3F)|$NWrYEQwY$tuJs?G;(oR<2GBrZ@U$s8HFiiN~#ZhlNvOVs +MU4y%FE#vL~&?XWAwQ$#5haZ)~NccuM=jHWuJSKYMi$>R$7%A~P&EQHuK{K?{ZKExJ$8Qp&Pd^d7&6M +J;|`Rw#kQR3A$waKE@Kc0?9|EO)6nyRjrw0L^={OovkpfTL`Q8<`3>q&o5a_y~dpaxVQNrF^{{_)X~* +GH4Xnj(|2gsFadYNz&G!DLVV*i4AAquG$#n#$@g)ytQkpR8Ovl5Ngh=L#MY8fL2{*@ +Cb<+?mG{0GJX`%}iop;#(Y_His^Go_?!9rX#@~Hq=~oZ;fYYxlzW2?DxQ%I!!{JMu6=Wm?>fyAJ3sSn +9aoog_2niR0;Gb) +IF?EGH%#ZU)Q<>(=`vZ_x+ty($Op7Xlu3)&<^Qd%zjO$?+^cmo(Z=1QY-O +00;of09jkJ?-FOl0002~0000R0001RX>c!Jc4cm4Z*nhmZ*6R8FJE+daAk8YaCtqA!D_=m3`Fny6@pw +H)8-iHA-I@?HeiSkh2X=cR$P&_v}k3>{(U!X>2==Bn-!e8*N^o(eIh4ZA4X)OE1_=Tc<9~g7q=9!k(i +aHFYEDcTi85po}u@QfndMfZp6r?{wEs21iDiT3y-Map%FHv%VMIin-p;_N40ZTl^HBY;t6Puq6Rz86* +N8se+gJYzr=v9sQVldJhPZL5>Br3ny?Mx4PO2S=W{Y0s)uE8Zbf3WC#j^w=DqvP4^KWzi6+8u|Oq$WGD}Fd%T2w~ceDA+x +O+yg$%uS>aT9nm3=9!0>R!Bls9R=8`k4X^w}?DdF1cp-Pl=jxW2ldohZ^)6y-sSCnfmkKykTxl6^GOnQ7sH&_5(kBR8$YQOKM +dYH;kI0HO5HI+EI^|hLRE%#>y&`=Om(@kN#;)pM +n+hrsAID#;Wm%AoxGc27XM`@5eqY_nT13E=tSOMSD)Wd@oVZagAh=hED+)yopDuzU^xo9s9S{=1GsLQ +CnJm5yKeE42O9KQH000080LuVbTWdJ7;*J0S0I2`~03QGV0B~t=FJE?LZe(wAFLZBhY-wM2FJE72ZfS +I1UoLQYEsn7YgD@C`_dLasE-grC-8%>h4Wv5scX0Y?(Lx|GA=>)-Rq1jZ9N*nBKb>R76-U{Be4J#4-N +=(*{tjufVcc_hQMo!x;DEA0-4Lo$6X>QNFuJaAFY2~1rc*E#;k9<;e;zGqqp90KO+vg=@Q605bztm6Q +giUm@}hW2b{-O}k0H(2eq_5&;s;Pm0|XQR000O8%K%whn^YOTGYJ3yF&h8?9smFUaA|NaUv_0~WN&gW +bZ>2JXU?q?dgO$H&-m(8k!rmPrW +ZzjsEmY|A#;w)sGUW;B}XGb1HP;uUe6Amdp=9fz>hI!-uoqbTMsXK|EvIsx){aTrohtn}Q4rx?%O^_o +R@lE-&B|Ebmfl;HYYfWg^xV`P7fXbmq6}oZD4Xg8JbTx54 +Og^;;5Jnl`4xa{hOZNFbTt)HvAxU|*d3@SF8^jpB8NZ#pJAFU><-^(e#pTCeudZ)?`~8nUKm8ww{o|8 +wUVr=D_domyUydB3V|7MXSEEl3Mgfm9LzZ#~Yqk!l)j1#i>6}e3CeGR9;`HV{(2x85PG@|1{&6(EaVF +Q}k=#~~w^Vc|K84D+S-;=^!5F|_w+q82Ziq{N~o6I2%et639=aUoPWM;NJXOqZX(V<~fQYcvW9uvl?DR_G{@?xKwmR0dc`l3s~cCh=4HrMTy=3+qpy|uDNi +DC3U$1F1cfxXI{2CI-KRt|<61PzpCT9{Gz08LNy>_V9RLeLj|bzhif4O +CV_9TIGdNMf^QLuX99@}b!~B~NdMU!i*fifnVI(#2pfa}yP}~rFVf~7$e1-kat{t%rDhFcQrO7d$fM@ +QR$j7nxRHAGfCiOpnkdwkhFE18(@;o515z_S4I@o(U(bJ%w{_jwx7?TpVbaREs-VX0ER*xb? +g_XN#>51b{L +-T^mXX!e0w~mO|5X}_M?CliuUU*%Qg}>E$JyO`M8o;rsB24wDYMBkCUljV({3!rcwn1A*83fdbroc)! +G*p<`*CA7{Oo4d_0F?w(ILX0z!d76CrWyg3rg2D)DVk{z#xA#OW4+as4;tY%>yR|DP0I*a?(t_91@V` +LmYd7-GvdcEJz$BY*;>r$aS*`7D+H&NspTK)1N5d5d2D3Ak$kl=X9yvx&qN2$s7%fW&&qKQCQo-;?O8 +?O4@z%haI0jAph|L%XkU>t_j#*sJTQB~UrD^7WEJ~aSX}1B_Pl}c|{^MzZ7_whEVV-k$aGHG%>Z|M{$8Xqh}!UsucibgK8_{0QKb+@b?Yf +8TEWAW+5GybpOD#zog!MKJy0*E}CjibQoeb^R+U}*Fi5Vq?T#E?y+{ZnUpgxk`H5!I#;&mmkF5hcYEn +ny|+|2ObvjH9Wk^8@Rm*TIa4FZ|BFIuR>I<#{jg-aJ6e`x*a-l$_fxP +gOzlgm4>y4_`r5Y8~5*%3#vw2=SV6c;4Vu!gM>aGUYGxHb>t|Ous#sD~X&LV+pHsvpDFLzcAFC%Hpss +jiH8@{(hyQ<}@dLKt(1G|UipRnUtkD+)uf?avkYr&MN1gOid-PHZO71N3=#1C;Z(c{6BZ5fC-3b)R}O +{m!BE!_mK8T$JYz!bDxn&9&i%9Q%iCy%aqiPn|i9)fXUv@wm~A_5Sg-T~lXz;iK*b?X2xj;kSjPp=l6t$QWdEg~^i53ols(T8Oz3=l2%-8(CURgRMgXQkzqPy!7aS$v33(wusYR>oboYEk7>l%|{n +ugCTAXF!3nss(Y%|q_7Awx`qK;y5-vlHkn>RVR(hsZQLf}WeufTt*BXu=}LdDVOphal$j*&dVGn9mEUm!Sx58cK@r^N^ +I>JwP`@jLXi&AqeBtE<_=vE?dDZDzi|U=ZmelG!$Wm5+ND&FzRe8q=#oB}apIdO!Lnv2gLyCcoTc1+4 +LR61bjYkG8KxazYC#v@hp-@vE`MPVy=xS0MO9&WNu40jIPUrQ4~YQWrXC^}bm?wj(M@qtv_FAK`P(Jy +(H?Q}y_Bxjd@Guv9CsiP%;Txm1Ibmez#~fpeCdKvFbQ0$^aK1ZUq{+rU_={HlY^x-goDp1Ul{H*H~j` +!zNA?KmNGBJtAZ~ahkoNQ@=3u*Dc^?p=DUUnLvIrQMnXV#$z2@Ffx}zI%%ehISY;cko|{US$x$R%R$k +ZjZoc2Wc)8izn)5>%nKhvn`DsY%|FtMkG?LF3wLP7`0Z>Z=1QY-O00;of09jirDFFB!0000Q0000S00 +01RX>c!Jc4cm4Z*nhmZ*6R8Uw1EXc`kH$aAjmuR`5+M%1$j(NXyJgRY=P(QV4JjP%t$!Eu{Mb#$CTw55<|QSF^bKizWvSw+Nzb1(2VE%n~CWy6w*NMS~~^{4_G`hmiqJCXYR)@ND +8~;!L9oNXkintvIqRppd4{Z?X`%7HqClN%?@wQoxWEpVX+%joV>*v3n-%}sHd2Si4}KW@m7=wN>>MQu +zZf(4)a?B~J7>Awc=Qpi-Yn1o&YxGkKZU*-2H4yC!cfk5AT`*&VHKpzQ=q*{k4Evt<08 +d0kVclt5=zc3>Lh`dXd0Znzh;(zzNMuvjepPUhd$xEVBf}pGu3m2Bn!Ss$2@}$uiA1nJiymiMUeX=Pd +C%MpC1I1n*Q*)I?SYovyLuOPNcvOV~=9k~mjN1BZ%hBhyXJHB=j2sal|XhP0(DR~l7BAxiUvs@MbZiU +rhbp64XR_y*l;@&~D^c3Qry4Xjn332ZI}I^)Y++@vs6nsZqsknw`Qh#94jMKc<^xr6OmP>b|9{!$}VN +ikAY8jWRwDYf~4Ze=YJ;9AzSkd;5T6_>fCU}lqc%Jgh`JUK+P)h>@ +6aWAK2ms3fSz8Y^bEsJY001Zj001HY003}la4%nWWo~3|axZjpb#rucbZ>HHFJE72ZfSI1UoLQYjZ?u +++%OQm=PO3$Kq76Uh2>DK+5@FjLTU>VRWArdPBKf396Q*Ph5UWT-pyuN5Na;5?3p)j-kT9Z{6(i$161 +fptyComJ@j6g2QZS<8o>{qumy6xC-7t)dLcxTsJ63?!ZSz@1^@YO6%Y9uombWr%B(DWfpjs0lX!O1 +h=<8uggb{&mWMA-mF8r3hSb3q%vs+=Qmf3`KM7n9KjkrK#7%X5xTzAssd&9$Sk1j37)xQxt2=HQez0X +*hWZGbMVaotYC$aeg2^;i!A2E_Z@2%-kRJ54#rZzPes+m3StJL8@fSk)g(7;4&fUu@p@y4*YOEoD(q- +q@+sv%-Jk~HnDLIGwRNwNoruWVr#j4_BR<~6Jf5|LCa%34Xt>En8C`~7JgfU$?l;>9b25iPNdOc?$p>Px +r85|PfwC0Cg+9h)Hs5?b{88nXWTG3Sy2(9Hh9W}jpRKb8!jfe%d`1ulElIcHj8WVM%J(wJ6R8y6ou5f +DA=4kF>we>b5Ju}9TF4woIfsUz!3AWzh@%(2T)4`1QY-O00;of09jioVaNzW3jhF>EC2u=0001RX>c! +Jc4cm4Z*nhma&>cbb98TVWiMZ0aA_`ZdCgi|Z`(K)e)q2+l83dit}-(Lx_}ohrcKkCVACc@G94^}K%p +ht=0+B^B-O;g{`ftIq$E-o$LR*e<{_4-bK`d|JR-$6g^-#gBG>FmXM8c@c0{P^s>rBb3c0E7l}H|#uJ +2SsW +vR5%LNf1JoR)bC)JaB_+DT}oI=TrMzN~?WV4|9B#uGB1lY>8bo{C3xFf-EJlpgJ1H5r`VlCMfo;gFt^ +_#2aaxs40PWWuCYF%V}XmJMq9NF~S(6>VrDzE6!}fgn+^931f-q7WME-st9^m#6W`@24mKIQ#OOC*D4 +eK?*40;Oa`vhjO`Oax^+5pBx=iYnC13v$skw~u&S1Wpm_qKN~if%OjE7p7 +>K6ipdmY$lICV&NDoOVGw{MOS&J-HMC1f4;b66R%t0?Wj^zm>Vo5@kj#~-x$VkpuihR~i1~Z}BW7a}g +1GU^*bnvgLJiLe?=pdD3|8ycges +>;B+cAg8s<$n*0(S{}TN~Xqv)YDJdk&1jTF6QW+QYm(5MEEu8R1V_CP7X{VH8ZE@o>9+`NuXTbe>iDzFK+R22PMD*j8T +eE&M%G#vYIbzA0tw|JO2p=zP=W +L-JWci6!Hal_!&8y5?hmy;&)mOYZeAGy$82Dd{k7{tG>1s#$>i#n7|v|`#umsb}z7bh3z@y+>ld~$wv +`sHR4GVL4GrdWYkNugSyV+N|#6*FNGmaA5oA!fL)5N>hCMA2-I;?uX#PhPn&c!Qqh5I23w_l3|-+jG( +L{lsKuQqC+ne3b*??S`x5u7caM?fvDMt(c_(_-!{paP8$wo={wrpen;^RCf#tu{MH!g<1nD^>&9c^nY +xPisP|j+0r=QP}dVZBp*47S<~bJ{R>$}s1(phL1I)D0-^>gM)IIMHn69)GSmeHvK{Q^0t?BJ0c^uO&c +`*&Vaiy(a*@9|x!meCOcdJXz#i$r8ITz(-!Op&Pbq +Jt<1hAXt}&Rd4EWfUj+X&}JHm5xc5CC;G72EMwDj?Q6VJZWOtPUfbbFUY-EU{5i2h}*kKSg#Jr4K6Oi +JcH=wSa%mJp%7l=QPLt_Z~?AN1ylK7bc>g7HZ0|KMM`Z?vZi^e*7Sk3R{K=6c)gex>OMZ5xp%Y3{&)|qwF;Vp8CeLCfx=I)nzM$)2PYOeE=M`oP?Ljw9yLG;s~1!aNm +naaz?fL7A<_`3nQNHQVJ@+JT7|96tSTGV_P&qYc)cPs)18gH3i4+Yizb&`!NQo0;usPYOp3iAI3$ZwV ++5xH0zc%%J_*Vd@OtD`Zvd?uT`_3H!USMX1-1G-9<_zim1v#-ek&@mb2g1VD!8{xCDxFpu9@z#c{h(v +pSZpT5l{+nl~Z^bM!n$(>qs{(3}0kHNUCM4^TIc-#Y|dhh^wr!6{-p8-Wc_xv)kBsVLA7%2MN6t4DP! +O1JOJm81K>86X5f{!9HV6(9Yd&Uu%YcL0^M^J@v=o+*gAJ%8%<2NV@sgJ)qb?#z-d)==ZSITB#kMy(r86l;JRfufP*_*Aw%Zz#2e$2{7(%UZ+iSq!@3al3 +-ab(EO~f~UUR_KpbLZ}NTH7)8ttP@6a*Liaf4fAF4Jr9IPYt3>JB_SBW9Nj}<)%!rPWHd5zNXY&vzJ-@M6tmWkT%kGkC`_m0( +|ml^9=ur)kyFRJ}0c1mEY|9m0Liz;sh%V{HFCktt8KEimu~dbiVNpWhQ~62-m@?<*TS0KiC}RWI5sHM +<_;7SvUcRvinJ05$Y37NXnB>7@VaU=;8Wb0Nf>_UGaPUaRFc#=Va^(9StVT6Sxi2CT?Y6g63h4!vzWb +~iJRUtq!Wit!D|>1|Zn1?Dxhxt^$!?nPfC`~`9hOuf)Rq4rJRKTzt;rzRS4cc|`7nqWa2c0_l`=7fiX +7*_!ME=^PNjb^3mCU?eY$PC~Z#-T}7bg|w0f}U`*fmD3a40p(IYIjhy=l+~Q`vb8<(sQW5a+`@&j7x5 +a1eBZ|K(yGL^wwy5!hO2xN%mL$L5RM(DAsty{WZ)1E%ntrOgIsfTc62-B0y^$n*ad#85&7VmR6Xu}AIefY{ReLqHUTeM<g#;U3;fP4`I~vmwR%m)jl*&y}O94-TUM!T-$kT +BN%s>sW_GD?DW88eT}*H|8mTc5!DX>T?arcAeicqpMZ`e>G1&;e#Doe150HA8Na%qb`VPPvy(vI#BsT +g4=1_h?Mog_8G>XM-90{&~Rh`vszUTWT@`D5HtE-8L-hIaVLbw(a*QwN-8BLt5{8BOs(faZj43cWRrxBXh8eTlkxGC{Cqr_d1sq_0-TNZAZ +iwFdUoDfYOvcpbBurb<>cby*_Yp9a9g;Wj +nG@kdB^IS@NVQjg!})&YR{CYklY8Comf=gtaVQxj4s^!hop{MbGIjM@Ol_v(K)B^_vJ_3?@G+?S8I;_ +xCFI_-#3^HfTU=Y3h%VoNT4f +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 +DdO)_2H_y| +tL{ANRZiq^EW}Krv-O1P;I$IQ$-jSflF8;R#6-Eb^9YB`G%Lsr*PAM@(bzTVwo+&73M}mh_a2>0I%kP7|xu{@0nwv12jS0hw*k +ads(-4u<{_M13(dmy1Fl=rU&;t+AgnBv_`PiZBZH2A}`X(}4z>DyanMrXU?9N)22)5vwLYuj!Q2Na+r +fHAU~4R}=AZ)W;5XeLvMHty$Wjf^hk$9e%uKBH!RQM-|`d$52I7k +hW5qj?_rgL0nJe6J_D?f4Q?1rR1)geg~#+uHe&@S!C9?ELmFxW2hQA5<%Wn}nuueNJAxcFiuj5#kKk0 +9KE!C}qmjClEKNgW=#Rb6>v~frM)KwU|Yv4fj=dO$K>RqLMx*l5gt~*>TiLzq%fJ3gFJv&+1X)|1 +1Qc|LFq#S3z7xE}cdV@g)Et0MIb<)<}*T?SqVVMdaU#&IM>?;9Q=isN!y45dReKp~Q8!DC79Zf6{d1~ +N@S)Zx7Y*+q`JUYLe-(Ft)Jvh6)3eJ8$Kl=;(dwO~8Q@Be`W5^4hSGbfg+R9`fn5xvPRxlVcxxKOl+( +YA#`l9%xf!VEbiusJIL$8fn%;%*p)ogp{2xtoq>(m+m3O;YwoTA=R@$$&pFN&PlKOoD5_^|ON5jUbkO5x7mz=x4E+h5 +O9Q&TAs@f<{=L%?W2d=aZ^WPtR^*X +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 +{vDY`}&#e~7Te6>#<(@7;&>*546m;t&+{SJk +Ao$n^{OKkQ6a4yW(#RxS0%Z16ip*y3xl +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 +Ybu25JZK;PbFC>+=Wl-b^>sqwPZOYD2r0 +;N-7W7Fs&058a;Vz4*M~3Ec;8(g2lhQ#lO$M+oS}P*eEQR4byh=feS$y0ELy@6EE#Scnu7EXVbCIuiP +Bd_9nZ}=&G5Y20+p-(=HFwANRM^3i%2MuO#2lG5j{HsU*uV0S)o8{k=?PvSwSZUrbiJ~?;~XH~a4J|cLO8b1efoG7gmBU)CPF+Kw +C<5LXy742?9j+_ofe7ER*__7nQKFhs&YFOd!Q%gP&}e0U~7SStgFa>b|6K8*tC%z&WXr7okPT>iwg5P +BmIxg$x)uytfKsnGYTNg?$Kb5kH(~y&?bRL0gikbM9hoJ-@m*c`$n<5%KpDX(YW2B;A_jNa5@WP`=7z +Bq19Mj^*hPz5Ik}QUo>u7VHF)tiR;!|NgPcV(W+WImAJsz#@N3eo}28%kr%MC-BKZyX$duAsjbO%-$; +4RYi{y9YdU*E8FJ_`KeSF1HH8Ui6gh3KzB>tkI3;yv=@!3j=2{Yfq8U=$QDJ$1e0)^F|8o;gFhF>=Nb5w;|lYe8Kj>iKZhxHK5oE($Mj~2(HogBH_8m05Hv +{Mg!(LD7E@$yr6Nkt2%@hf-3Q8=;NDa$f=OLMV?w#ld@#p!#4B<3_+LoeBv6@{+hRn=&yw2=}(+=J-Rr>X&tu+dYK4?VK4)>2 +jf~l~eIJmCdxu(}gUD&0GmEU-@Gq~x(s3l+~4y@C#l{Ei1u_`UHg@}6wKHm*ZWaQoA +k-`urf!MztAF+n)t`ySzo00b=*&3z4^T@31QY-O00;of09jkX!apXo4FCXaEC2u_0001RX>c!Jc4cm4 +Z*nhna%^mAVlyvaV{dG1Wn*+{Z*FrgaCxm-ZExE~68`RAv5*mnY9%60?@*ip2barB8#HNyBt>!X8T5) +=*;`X2LoRKphx_mM%)XGjBrQ9=(}zSBXJ_YaXP%kmrY^TENj9x&Ymp>OZmY6ZjIWzAZQ-$zHP-k% +;Zd^WToE%RKYN|r?v^L6T0z2{XWi>oDj-zvV&h5h?T>{3xF_EuB9uIsX%=JgPtPzZHh3!dS3x9sD)GQ +FAFjIm?(A?IpS*4tH6iBxW6ddhw-EsuurTP}0j>PYiXbKW$DpV^Q;nb^QmqEMnvlBf~+X3;;SPlZKCL +-L(emU_t`TB7!qFyC%@-r}pOc`DXCy_w{8bf1lWsWVZF?3GNFC5nyaKGE9(o5<`(=qPGSRbeZBB|4f$ +?gmd{{N$cWXnP~}%~F5UB15Vq;dzc|Ib-Luk0OOl^8K%k$X=F(;<6C+Y{_One*XNy>`X$=E}%^EbDQT +_Rjz-BI?)0@SyN9ji9+{V`^;uD{r`u$yp^3vxRY +5y)@3oK9JVv)s+y~G!aPiw|I2^U@oWeGZ;=r5h`Ugiz_90X~9C}iOs3TvFRlc&o-y|bUoLU?C_sN=*^ +gSY(_KKB`b#{ctZz^M<9GxLitJ3=#{&XEZ~r!xYDZLbR~K?d*CK~Q)?A0x6?2sweHL@ppwsEo*^w57< ++^s^{33IhF=yoNK(a)=UljP9hm?nMbRg?9MaP_4KstB9ltXa_{+Ah^I!@d=E +{nQ6BkOjB$BPXx>oF(-wN_^r_6wz&MM4h6{fR__GWix*WyYR1@X4=(d!h(zy{2UXrRl2JrB=KXm0u>+ +AI&*53xjYMM&1_>U9mqm$snFiAY4uu7yKKD68? +T2?>2_5NMi~2@Bq{@=x#6>+M85!*05s!`FU*&ONM;k +%1uwsl4)5BpwnBmXFgj2U$A1do`REW6_11JkAt~I%*%nP0NYg$N2XCp1ZGkdw^hbfk +HKEp-+^idu#jBZsIsQ)N`_;`a*bX1rq_i*bWI8cD6t*ThGe0~x#UGEv~M-Hk8fVG@1K45G-mw?tQ>@; +aNj^7Wf*qsC|nR3uph}PcxreJch%OgQvceJI+vGTt%l~!9!l@@k-w|)Yh#Q_J9FjKVd6{6^T{2IUM0a +fvb2NJooVMVQ6*#c24Z@g4KJTN`iP=Yuro`MTND5*E5sf6gpmu8$<8QIrV#92lRnP_OrtuU~7ZCK@HqpX0>pFeje3| +VV%JQqU}(lnZX5^D9bEN`TkFWG!kmS<~T&+j3Imse>=yykzLeQ9^QG4=VJ0v}~zh5B-(uIGet=HJi9b +e~>-b{sGCQzycbb?nEhURv(&EO)cg^6&bC3H)z4Xt=**-+W^dfDioJ3cX-xx~0ySi@4)8!0Q3J_qq^| +4k_O`#v&7vV1TSQct!zBXF0Ou%Yhpg_tXK%Q0)^!a&Bc%MAkQ#A4%b-oJqEOonyUZ +fJ*=!W-fBuw1Li +(I@ulNbBCFIMFF2Q?&M%yS%?CQO_X;{cSi<8@^#zfD46cauLv?5MAO0&KA +%q|Vn)qLTUp%F+>sUmr;EHN>xS*_cNYW2{%*frDXH-M2gUM|6)EV8z)lXY>Dvwzf{g$KR>9Tq#n +#aN$=ui-%O-p&5O{Vpc?$gW<>fPT4&~Aj)?ybIv9ke+#$&Tp6xrv&F^@z(-G&FANz`ORA?L{{3dHuw2Q8dq0d1SO6YFhBg_H4L78vL(!$GWs&m4K^WHLZ2N&m)2Lv`qbe4xSUhV9jqa{dmrkR8u$FR7 +l>?z-FahNDuF@A$yqBQff3K36n&C%%4hz?1z8h8`FuG>0+_;n7fz3(B+cBk9l09c91I(glSf8QK#NLd#BdH+fzDXgMrc*WgYArG}5uL9-Ju;F8X>2R}HkF*}tZhFsQ5%7&@Ms<%;$e+?pvoQxVo^-|iyy&2#^U>4 +0M+2UZx?E8;pmlV#Xhz!Q{6Q&15*hx}^s1> +WjKHCs|*{o(az8ZrI&`o$~8(^LbxD|$df!oQu+P3R|c-Oo<`8vkV)WLk+5CsEQD`18OZGdG%fU8E)LG ++RzTe+S`PekJaGUZ#3(dEawN-1n~4W1->GSMmxL8vgo@uG-&2RKoV&!;9d2S_kNH>$D}NuWU5vGZdpH +mS{}C9J7D$lnyIRk>ViN}TWB^7gR12ROJWFzGdnK20O(BEA3Vkz2=RJoh`V-A43 +2#*mL`{t)w1w?%e}@}!BLG>aK~!lJ&z$JwORk|ayhpO0I2zrF0IT+=Q0;o@Q@Kc*14OgXx=4olfBO_7 +OkqGlYkS0yF4LYUz$LgQB7y|-2Fb+X~^defkKcJXp}BzD2RB^KU=7;G^#b()uj2q!3u@L@c#;V3LMRl +iG*3C4NLTrLQ6xko`^j|sg^KritWY2NB=lffb~)ueb5)B(?9w85XR367aXG%h8N-4@IVmZ43(z6lUQBsMKYX|4^>G)U%)=_!`R8367s +E$J5yct__loa5peig3zNY3gV3_Zn2_7RU}EIL(zR_~gZhx909@N6ia4MBmrgZ9QIMgUl`Udk``EOt;c +qqf?8Oc}uV6cP5bg_am%)9wQ^EdH-NXFV`t^zvl02rK7t?x3F9{00w!ceJqPsWJ%to>}aMv`7br=&!$ +&yFGA!& +w#IZfu2us{3TU9$`6m~lGK`HxETF9eZxZ^uemtuW+OVaA|NaUv_0~WN&gWb#iQMX<{=kUv_13b7^mGE^v8MRtU++ELK +R%%t=)M(gj8NC8^0JsVNF&nTZO{{w}Wm;eM_`!Cdk2WvNBQnfZC~@d~yIN``tyW_m^jN?ZU?O9KQH00 +0080LuVbTUT?1zE2kb09sD~03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RZe?S1X>V>WaCz-K{de0ol +E3S(K$XjxYGvkg_fqZY?W(rY_|>(uw$i-4Y?h`-NMcQqEJ0e)_PT%j&I|w&04XQw>w9-URPBo?5SSSZ +<{N-kWxi!Wu&S%Nxu{R`(U8jYUu*_h +97_1Pne5aA}vdl{s3U*D+bNt%Z4++TYs_nUu4FlQPFT&_HTyvrOi{yjz#)l?aZl^ACGHCMr2FI-s^dh%|`utl}SFhE +=(rAdr)MTO=uu*)FLz?E3or&jSV@J!6p$==(RJ;P8@I$)?!u>#qY&L^1D-#!%as&8n(Qmay{leMGokr +(w0q%k8l!c$BP?Xu>XX#OV_b01BWl@{CKIQ5p(iVfOG#!-LU;y5XmQo&z~4Y6D#RY6EO~HUT!l3d6t0 +c`;@?epGT6#xckat2T*XRSthS%fc-eun-(%geAbaFk?%u_`qXHVY_mg5l)Nd#RWj428W!d#>AYV-bdz +TO-ez%`0b|lO_|^F>~&IbJvFDLJ2i7&6Kl!rk@w9^3NDCcno3>>Q`}$iFy`fH5>;B>nFkZA@-m6SbPU +D;wIyar#_pbuG_X5f3RDpVD9{Z-pn7mkPlL=emseQ^@<(W#r4@4Jtu#sM)m~J5i= +dk3k)fs<@%49SuY*_f+3EahOkZBlzB!+(mg_N#Tw6gpj+$(f4&3Br6|4XeFN-qCDoKVi0CkzB$?}<2f +B7yEK~jLclw1he0#A8*$AbuAmHa2C8PO_Ujx3j%x}1f#(KAq7h?Yte=S=qdYoh*onrVJ{w!89fX5^8ER;Uj~B*?CpkUB>g# +P1DSr*kGeolB-Q0EOlyu-It1xNC$xf@uj@1{fjrGLsr0{_FDgOkgP#q8|jnjWq$&x +4a!v#a0=hn3uqq%rr(;k$nvfAQcy9{%UimtXn+2yXuOUyqN!4v+siJN}>dLx3}oifVf!&+$%UmXmlZt +sM@BjVp*5=+}gROm2|VzVubT4dI4?2VmfR?vfao4t58GuMAPDMOD@jC^CUuf&&DH9*bj~L0BbAU}Uvt +X}ISlu&vs0SiC$1V*o&6mhl}tN!ufQX?kX0_z-89vRl62MO2%MBvYx;ooGNI@p7-M69QyKJ_4!Mpg?Wn8#132(X@-*V;%{uc$avDK1c=sybaey_p*-Z5Vn@?coz+z*nhImddu4N`s +BYA&QUk8A?7l0!g6VH#QynuP%q=z`V=!fPSPmXOW4d5O=#ztY +M`{vlV@%rH(76-G;f=Fk8RqYC7bq8Gz&gi)Cbq2euBJXjM*fFn52iTVv({;3A2V&wN~XvwR(%%l|w;! +IEq=a*>g!GQSM9RG!y1*vma`^Pf%I$#8@r4i7@UTc8tNY6d|jBvJT`_KMd2=^zh7x16j2-E426H+4h(K^DLugA=Nd(zbYZjmbbr)JfqjFha?Iy7q2pz{x9RRmJ|8cds~W~z(i(}!X-?0|TvCT+}D^&gEtX=Za>s^@)^>(<>4%# +96ShE&D2Y+#6m0%H*;FvlU#%ny;KtQn3lv=GAM8greXssU2!D&qt8ZJtAp!e&Lm<{8*~Ojoo?iF2?7= +x_lPykQCmNr;OV;#o9G$|erYu6FoEWECYZAW&@$gsc`Clr=K1M7g6)ovDrNRd~P_m#3E#_A>dvWDiwB +##vzu6Y~N+MV=YBfc-kXun1{zI4Hgk%iB)Q6iTL*yrwL$3oWdx92A+Onm%s1qCmK7r1V+R(O6X{3br{ +)ylep%b){UP;BckQ*9Z~2W(F1a-2u#B*EP-c@*lT0z%8SXtZJ{vcx6Bi2SeK^QHq +VYLnoYC`ONd)AWPMmNZ$*(4IN21OZUs&K#z-#;(d4fo-YUG&=p*XxCNiJ5)Ru^BXv0DclV6}Kx%K;mL +gmkp)_94)XdesB-W^!fsvMCszhl#>xmiHr&>d}jxWMt#Go^b;YmIY?wgK{Zo(bH@1p++T*@svL#*aos +Dj@FcR(!S$=vpZ47MPQxz)REx`cA=)9*U#h)gB&=+0oGd5u#Ra8x|fA3+|`F`kkPyEw4l4Xfzu4$^$O +oJ*&RV2yg!~w7mxalEKKDuShk{@H)$2X +m#(*%I& +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 +&g>n(^yRakO+i2Rx>(l#$C(qg2qx +C5Zni8+HQUr}fnE4*{Rw7ms{k`^2#aPLMkD_L*m}EW@WZ{^w&iS{b&H$X4d7dqtqtIp02Yn|pp23jau%}HTeO%P*LZ}slJrzOM86qlNVjr6xY2h(r0>nM$iMC +zlJY3gf@-3^~Ywe@9lkRkTAfo%z;Vy(%v301-LG(A%&%R4PR9=p3QJ~XS2!P-t3iHW_{T~yZZXifW~9 +ExCa9V$|P6Xy+sMAl~^i)H^+Q)azgVMjYfuEC)|9A9HcCr;{k-TF579+_KO?XPjUnJ{7|AKst08sPm+0b?%Oq; +J)-2W(p=+q!RbQ#f~bsv+pr0sQPYv{^pfTmy69r)Kr&3v(3Mi??;9=n4^tmt_mrEWMyRxmtp-P*g=Xn +~hslE~kkgK6HJG048QVaJ)EcY+x_qr^yP~v6x+qM{jFto(SfuJRME;%(K{GO7~C0vpVKs@LW!*A%CCv +PtS;o&IAblNz3{k&@*U9OL>~G>|DXWcI<$CFRqmYKmJVZHwApnDgSk=EBpn2^fdflK+49`1=uZx}$Hh>^l4A*|EA_JUx0{TpzK>3GMgGXTN#2H@hz30uZzr3BY(V{zl)@vllG}mSb<~+FfwPxt1@I)RbJc`d7rsVSbB#QGoWDIvSeA-S%-@Qi=aSAm{KS +EmLRGJTMvD_GuY0nBx2))AO+SzJG7iA}`BxpcBBP|gRAnyg_N3@{LK)Zq%Yy<%F_H7JxIr`2Mz4603& +7fW1992hhNr0N$PjO8Y4ooNCQVg#8ovcvybd7o_&OLmNpr5t}R*4d{Pn4R5=xBdDWI)}-+1QU?9&F+v +`!otFO6ACLlZfWucrinMI$$o@SsXqf2vGMUeb2F~aBY^&%*60M*5>*tQyWO&o6yL~KDMetU4I{MDnuduu@hu`2q8}XVs`uWwb4tVP#s*YYUJE) +p7}sAmTeL4m6@gUuMnDodVQWFg_%oM(VuJn0x|sf2U}DWOckLf(XfC7(BIU)E&}aII4Ay61~r4NbPGK +KEoIA$)Z}6JKK +FQr+MB31hdl%=Zn|^Xf@d7nY;NfPPW@(tT$M#C`y8t|{s6?z#D)&rz}RtORmhX7?eIywx93;uNcIv7B +BxA8?ZIS5a4HNTeRcNzix01_W>@EL&fa~vvJK_%o*vsvM1ewpf+Ioaa*TqjjDLd{XTxyhCLh1xoQik_n)phq7DZ0={Sm+%JKG6xI55TQAhjUKqC5yP}G7eE~P+uw +(tU~I7u@Ne7ke)2ssRAjGg!0b0kTeDn~*T9I->NcJvXh7{8=8IGj_*ZF%iL&Di$vs=B%>4cRFzc0W`i +>Nki94998--eGgDkWKipmlxpd*fiv{ZH7lgTUD^vwoT+BWs4UG?jk%VbZJr*Q+roua#PjNpboP%f(3h +4p8(pPW^sJipCWr8+>-b5%FMJk~S;d;+j$inKbrt3hKyt02fy%O+c`f$bA3O#_f0N%z6ib6eH-S~UWi +Poi&<}*~5=uabBrqR# +(T=+P>qq(4G@YDd(zN(3=pl+8OV9Nv42T?#oGb^t1fwrO^q&|LCw2byPC~?ToZy1ulJ{{u4yZqDlRx(@kAbigmU#(MAqm*EF{7YJR^PLlwaS`nVET!8&K#L@A0HtZ7`tJrd0pq*M4 +^3%w%Z3^INRouAN=kvlr{Tkz3!!RIEu=S^I9!gnpe)_u}wv^CZx8(bWnZJPll#!;T|(GQ_ZkH_mEC$1 +g=%CQuoy0A&Zun(6T`8iS+oPX9r2ezn><@rbSt=QX)2E4{1l29jXVg-!MehlO45V{3M^8Bv0CtCvZSw +WDhzVXyHpT<}#T{fsl;8ed@qPTAfz0t_&di +<^`T3kg#rd2xS?JfYO+sF``&I^L)N%amG8N(HQj9}D7Vfj6(ucmwlBTfuzCDHNSUzf(ykK~K&fmJHF +uBm5FJMj#@<20-d&y#3V}=8gPn8f#zpVb^n`>y@=;jtRY*Fqxxem?D@24EZU0{MO@j!@;R&#G5`$qVb +GY;;YfzVg@|l^8!E78gb3Qv#cNo?H?Phdi$J#~w$ah%Sur3-YepvaHZN9BC#@xYT& +IXvhF0)xWQ(w3LN1OYvpVs&FAsm%DKU@_NOuBJ(5Tv9q}veoXFhaBf-R2$IA;UuzEW_VQlfMblcuo`(y#3@iX9 +OFj-A1RKALcXl*Py0tzZfG9BUc_C-=LY%EgWf%NZYUgTUuB!oVhBv% +M$I`qbRW=oA`aocWp8G8M7BliAi{MnfM*MgaXaHUSaJUTwHVhYy2@} +tUrZU3TG`c*&Wl6@3zJMb9la}Inya@-C#5p9Fiepx?YuE$aE;Oj&FPI)jjd-5--@#WItNA5k;$vSo(tRDgDObgn=%V&8l;ChrMwi|EEWyH(nx9k|F67LwN +F%<&1ysixDYYxUKw%Eg_PeDxKsIgoq}bil9ViQ}rlI9P{G)@WHFCv(Eg!xaQY)^-BN>fZ6bKT>%2T$AfkD%EOabA7-K6kL^{Hzl^o(O5?p<1D*J4@nP_mnt(s(i=%O7u#n{hFYej +h}p4;KFito9-NL~a`91c(mwQONI5@$ccydU2F{a+h)8tT+2Y;h(d(k>KLyQbL +8;Bz<&Ph(UcLMHmbM~X|Jn+jQ*M6o{@vBPt3O?w9i6>=_xA1kv&*w9dbDEmO&^DHgX~ +3OjYvU#CTV1Onyi=-JcbuaAz8kB)zLl;s#t*2A(M7S*9~n;&L}Cc6BvZa*E~s-{xqA>2L+4}lVSl>#` +b%?5#qLk3n7-J(K;HSjDb60K +jv}MOK7>*Xg1=5$s2Hq*!Z-aGW{&Te*7bc_pT=?w$G+) +5U7aTa4GWcW*D@~N9lKO~@kxj5~g1{YSuSh9r?GRV{AGRXG~`5_-h9_qn1lx`X++62z +aQB#?1+pxc!F{X#lB#UUPAwm_|L&WOpDI2k8V5=1LI#7A=$fzE9qTuXB*#f&r8Z_L!W6>s%q8U3Xa^F}Ckvr&)Ae0KM3x7+CZtSDK9r8F9oE-*&?1RnH|J7{LgSU_WZU=lZk(GCc +BpBA&CTGm7(LvN8Ijge3juA5^4^ZIAjy2-kmIGytY-j9-3r(s}J7z{y;ih$ghN*b(wK)_psM%%Yv4VT==vjexXkVRd{61y+)&ag +Js#PMpesIOx1BV{p^O22c<6>_v{LaOd&^Xtp`Em=rP|9gT+FQRJ<44M*=@y*t4i4vEdpN|Qp4?9Pf-I +J)aCm1ZDum6Cuo92ZX+JDGCxTHz|WW2K1}oR$=0%A+#7C8^t)$cI*$Od%6?Z0133vZiR!8pbJI975-3 +8d)@MI*CN;g1lAyI9cJg77N9Fg~{fslmr7GECYB5!eEDkkt^eP?J0<7>=BU9q?zj~1)goxNiYdGna9O +24me2n_>x4EMsa#lKx2hBnFANxj+_MM4xMB-@Y3yylI`f62e*6|gEu#zX_0ae?D7+ptYm9l*hF@mBTO^Kl5m8~u?g0Zj;I8dpO0kQFZ# +XD#y{;?DaO*IWV1q%GO@V=Rl50m3hGSJwFt`{-q19cH`xbl9-%W`PKdonODs|`}C7IfA-m?pI?(XuO? +GQL#w(Kbqem`v}P7ltz_v8j1twF3sM}n#(A8YPLFX<#oG~GVtQCwk7i;QIvb_aCnYzu!W?g(b=>&(|6 +T+@#3aP!ChCthTqXt>yoX>#%I694@G|EO+}P9m^y&V86yFrN?aUy~RncM2>&#c+ei7D|XbSk-v50c+OEqEq-1~J}t|DmB}~PS!b9ugm!&xtddCX!0)Jc;lBrhxxLC@bH^s<=kHu#e +CK?Q%LGys6(vDqA*WZPdr*w^LyyTF;J6<2 +zUt*PlW|xDhc0mJ(;7DsnOdO!VJ3Z5O9r*+SqD8(XKYWbC60|}xfh^g6#uXHR)R6{TyaPw`xmth1#a4)!XWb__Is*J7-(O_etgGK%aWUi446SzYpw%1O)txd7_$AvXAB%q$M$L?+LS6FON> +MuChiO1ZnAA+C0wdyH_c8Da!`Ks(oVD5tSsaRDs)&cT27Tbz+0%%cJ{)C{B;pY@F`y~tSNKOR@ZSm3MsHNZlK~Gk1BX#>AShIsE(eufC;5-cmT^I%+h +f)Vp$tJak4iKhrlYjj?J +o)=OCl%-sC%cWf$IhuwgN0e*D0OAU(O6oA|n7L7kCSzflL}c!3bPs5B!m2>3Gy0di9KQ4qy!UWZZ~Bt +7P_z4N>7jUqc&b>-#K8uCw!3SZNOX4RlPytFZNQI+pKiSnj;cGi~7)FV38#(t4pn$tsR3xhBmd?e)c?Aehi6XO?=vcrKTO=ixv8$7zLF2E;+vP8>t +9%Zfp3vwi?#ZiN`sav9^A2vDD1X!uNtSLyCK#W%CbpSnn>SYOIbQv0n0wWTNtR0ztZkoDZp}mHqQu@j +iw#%@@7FxxY4m7t>!o#9E8&0UX;Z%c`t7~_rLVI$IZ#PU(CVR*A$2fYc=vqwzjh57If*J_>4rEMHpos +Nk|F^$6PJTN6nIt-67#w;A8~ull_mV)bMZG=}B53{+-1Z3IeivC{abN6#wX?UV;Z(EMC9ZRc9C)Dcwe +LW*r8=h0cPZO39U!RYY41?JQE(n?f~hg1aIMAM#55skVE)V%E#JL;d-n1QQwkhlWQ#LBxi>)zh&X +$EAV%1;zR#RM^B1&A0|tmjr+ewhQ@hr|jXy7z|V!BOmfU8^5vwJ(rYT^PwV0SYenI4kuKzX$Gj!f6`c +p6v27a)ChM1P!l&9%j>G#87`|oEMhx=m=d=5XkH76W+45B#ij~{9y=boN7Z{_SWfL+2KQdw7qB8EV(D +t^Qzm01++YY&-Q*@O*i>w{Ajp(OZ+8IPKxpltu*MAeNX$g~aV-*(j1W|XAG66;H+d-DU|$#S+Tj!7Y* +b$j`O+ACT1=-TgDuISeL}918dL}hg7Y5;zW1L4B8G|8hOF3v5L~R^x;l;Qpu<``IC>0z#HH6H3Z;wt# +x6d8p7En=VY|7W9Pl6P+Z(j^_?CVqS}e`R=`;Q=4upPj*Tbnn-cm$Yhr(*`6NT2`Cn&ptTNyVZ4DvQB5u;gFa|S!wlf*0&0| +^fLfa~JjpQRIvNtbmDfEGzLlc +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 +Ud6Tl8?yig45@+Vj%z3|#}Q_$~~ +x>%S%;XP9|G~o#nwA3;xFsAKv{ai;Zl*Q)Rah?`0|Lt~&mr<>p0GcZI5DYu1-dUGwq->=HtF;YQxU$b +z0-qz`d+zCPx<+{wK(Fy(D257CKc69GT3o3g;ie<`Y7zHHm3UC{G4#qE39wa4JmySBMKUJ%e<>Z`iBs +Yjmc{(#WshR1$+|2kPQHwQWtn;GTGZtTK($imyRJLrT@M3QxUNNPc<}Hg9EHQ!F*;-p4tYX_JD*H0E?(z9z5Lr>e}4bn1i*UXu+RJ_qQlUk+E08#SwGnG605{iaBR8UJU=ZDZ7QJR@FsQq>FG2hnDjX%7X_(H%sKY(`|d5rwPk5%3I$DP{CruQRw +>TT5&^x*>!`q{{MO6q7f^PfK#%qR`KHC)4wtgEKH8XM3}-M59BV$b;d4-Nwh5^M+% +N2?s+FKb~61tU0>YaVg_acST)F(QE|_W*|f_cpOp7s^%GsHLeZDJAUTUi@c|utMJwoc1SF+0+*7!W7QlK8;%Ckyd%Sz1P)N>G+0|}-5dW~j)z923DkM +p_c`a>lH-~?UAz~ckLS&$xH;w}FfplB=8$y<0R+XIY^Nzy=v*cqrw&OxrFz~>t}D`R6s$N`cTTcabqV +j$7a5Dx03vezBxb(kwy-nGy>QbnpRt9~PCwNVeMhHs!yaCU)OWUp$q@AugR_5DxqbQyXOnLp%gYG%M) +0)+$jiO3u1p;+IFDcmoI%iI+025^TT$#&`Kd_vac1p&D00Dcx8Vq{x5&156DB8Oi^Uv+fQx@q@C1>E1 +xNcs@j3tdMDi8r0n-xsYcIvHqL0Xh!3v9Jq;SxBq|M=e^=#I*K#SvGVxMgN}9p0X_n_4+T2(kf`m6fMk;Fd!R +#$E@oFoMO)qYg-VyWd3gBzrZY_7kwF1SvuqKUQ6;&tO8qrgNyHKn_*l^`)MO;yPS8la37&!;+Q4otV_ +8HgahKBnA0x*cU*~xl%4>WUZ3=M0qkv5(;9K0K4ki1&iGZ3OzD?~MXA(4tXpHA2v4^jjtOo5v#BwXV! +@;u;!$CbJQZN2^#nAo}o+@Y$WlXg)nY=QLPcSq5 +rZ+?c%a&o0sVZ?^s)VB(!tfkC8O8$#E&81eOc=VAlwz-6bDudU`sBwb+b_*jD?G=>tohtxIYB3S_2b9 +^aea`p!um9h3Kpkp!S@_1mCMAJw&SIEI-Rq-av#}l4Ph~fEXh;MBOqK|1AtP?SeydK(plT_8nU;)~JX +qP+Dd)4LVC}JPSo~fiiJNqC?}MoF>bRX^dEsry)5!V~+D4&BXKKQTU9kg8UA%M~|!#osf4E>O$5{`{I +Ba$yh#QFK0W9@*;byqp*hjB&8$8hD*`>(B*G{rR{XhX4D!Ei0AR18>t~i-Vm&pMY$6}R7-kHTSW$@ow +y`8xhA$c+Wpzl=m8u;yR4cu+~6qCL{l86>Wu;$+0)a8xzM`q*(9}%fYE=l-bEj1dhU}nm^J8BQO!;`F +$=4<=L-)&|4|6PPbP>$rli#I0qxnwQaNthk(>?yov>98@I8xj9ErmPo@{f&&Ti4J73d?NfUzVRyaH7j +B?Wh*L=+HR9>_mvi}DKSM_{~!C)STagQpX_Bz3>fY1niB+kU?W?f`}ufI$BUxJX)mYol~o7*`LTREX3V(kvWHt6^Wit1jvRj +c^EHZQCp5@oIUa9o>jh}tT3uwaE^S&&8Rf;b;v@1LT9lFxQWb50I7kny;U4Eo7f;a*{Gr%ABY!^7=ZM +V^^^nZ0S07iupAJ>m|%Pw&AtstB5%ta{e1p(T~y}LI)KAe0=;G3ZAQX-2LF9gX|mR>eB2fa-Rc@GZU? +6V^CEnXK0O$%3{F@?{_`nx +WD|trX@+rBI%#=IJ4FJ>qVT+etM-?>D0JTeQmJ1ra5{D~5(f3ofk(908)eZ*c3dWE9Uix#7)VKcki`pUpzyfAlC#1$xEBsxeW%A?Lo_A3DqpVw +xB|Lhu?{#E@Vch&?C+B=_XRA$L@bmVwqFX}(b~h{0H~-QogOKi*dAau?S7!1G)89S0(wf=8#_GE{$9}~reH7IOE`hcT3WyOOaqjmep;;@r0b$ +pB+YpJ#5Je<2bji0?^8q!R0$7+IiOJHottT-6uAtMorpO(1H)4MZ2Gq0oVGs5Qf(E0o9s3ZfX9m-|9<&QY9xVRj`>LY9y5|1$Inr&JdjALSOKrAz(?ZhA1$ZUrm{HWP)*iU{$Y1<%K4j4$oH4medsGJSEFc@1Brs2K&wadSLCx%kq0jzswsgRlFHeK~kD3wZ +iTk8uz^L|6z&ztsCr(|G+h&*+yMwT5vJOg8Tn7Tj?0HaiLj6yCOR46V)fcW>6-Ok_pm9QXoPWub1m+$ +4DPku20&UdL!vvlsjkswf*~@*=l{*OWz(YkJw>bpKB?c2YCpc~*vKZxAqI3b#%kY3G5Ej$(Xs%*kYRu +_#-rOWP(;Kc$QF1Cd2&Z_Z%?S&Pjic4~i+(hn?A*v?R_kM?=7ga*iJ%~Cen7xH5WeVc4&fgyvOgL1Fz +O|rmRyiCBed}8!7ks0+N-K)(MdVS2^jYoqF+xk|R? +oyOL_aQoP)90z5G5^q;fnlnEHb=`P3kdz+Hl5KqY8ze=MHX=od37cjXP0o}x=0L{EMona;f#YR+Mm})&SM(q$Q>y-DHjZkW7KSY2{ELoiS&KoW5STIlVu +DuXgfoE-k(TutnCpv66d4c=M%%t>^xi79;$x;W@e8id+blw9>)imKdQlPsG2^yg7ci>C&}H#r@kh}7zIC#wg%5{MaQ>?rIDpEqYHRhwEmz?Xut|YYW`WEoI +0h5|qDN|&GL3dJ0VKk@V|8>@cygFH@Z@$M)-dR0nD!*`;^((-U%vR@H7&I_k8>sFlE}Joqx5(JFwIH_ +PjUBq`l@41<#$^IpG^fOM01wZ0Yc>jG*%nHwILqQB+>y$K8iQ9X7~iz{$fCxHe?7+BxjR4kf1|n8qqe +5`0)Ay$%KCb-wo*DK)pM5yQY4M&LC-$-uK62A`V-|D~WmPg1hq`P7u?oYKtHLwR8pK5lT(QVP$_{vAW +IP{p~6Dy8uoG^vX_kC5}a2<8Kbk2Esk1dKI^?al2h0El8%8Qp!Apr@`i==@87>wJNME7#YxK*5UD#0h +%)5#M2l^z;J+jbkPk@aRT4CaNrD6qH_76?WqnJ)%_wb4m)oPZ7T-W=NYyKWM(_>+z>mNR@Jg?w0=zfv +)vnC8&D;YiPVFZ^+tyd%j3RPL4ezm-Z36MrRP?w$nKhYxE=GwY@aSLDiVaaFLx|Epnr-35aiG*5GV)k +GhaA_Jx}PKPYXJo-;FN!EfRWWWj=@ +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 +=k+r@x>+lP=bF*>Kq50Bsy0YrzJ2UwuN +vhzRt@j`A<%qtXp@$J%8W&%_-rhOW%8N!GFwfm-9`e@ +(lkavBUqsV|M5|XXBuANKi(TF;B#i3b7z9u)Z|GG5C^`IX`$R5e_y-+BWVlLv(y4?&S93rvf8C2M?l- +k$|dZu)+zqzPEvJf`J0=UKwitr-|niI06=YJs}qP(mf=8;XtWrVG=ou;=38m|4EDvVJUc)&Z(g(KZ6k +q9K+A<`&r#jPMa5)B(iT>z+$@rE4hk&3N}A);*sEt^2w${)M=A(T6g5YcL_S1_0{_(>%Wi5?+G}gG7!&3njQG +sDHulX~t~%hp9Zvyh9V08*c%`J8+XzUe%$f?+pzd7Unhh;=uiY@h;tUVm(seaaeCd5Vay?siQFJ&xex +jLQaiD_CXRH1fm%en=(9(I~=cz(inpA+e*mw)6og1Uhi+j&zE+XBL_O4H^Yeq22SUVWON1Eyb!k&gPs +$J*$C5I;t@rb+c(eA|U5zJ6n6@g!+ipsi=U@;zF|uu}b(^SItm12tUN)@J|ja=_xNj5IVjwNSrE_f(UKxYh< +FOFs1-+Pj%b5D6)71uQGYuNV%(Q@;EA41tlg$RY9B>QS=q9O4`zsJ*}P$?GQnj4Fp}2IMtGy&2Us69RD +DBrIsRoh?5lkU*WkLJ-yA7wS$M7*qj-_s(wM^+oo`(fwUtL`{WU9rc6$#CCrr%V4Qi0KV-aB=;s49Y! +-@;g5Z+L1H1jyun`Z!7zOBQS{mM^9bULEc5I*l=rGrrTw(+Rofo9)Wx}L8MXkPRzKT?e*s%4Iw%}S%w +rCIl%cf|Y=T1SsGYCVu)#|H`Z~)RPwP^THekMXqcSs$xWU&C9v;z{Hnd{f*;@gwwM*w3ko=4B4lZd0v +2>0o8Qg|gLKNl*T)hrV>r#0)-E?9aS+phzWUp{q>=+&QKIDg++E(tnXvM4ulo-EPQU1LB2=+E<&l}Lj +Dcrz)qCpg9^=?Z!V9b@Czc3o7lmv_Fgjs8Y +*Zb@dt6--eMvO@-;eXf#Cy*pMkesI?A$WNFhw8)Va>cJBoC#kTv{WIU0!H3D4zWf7(kk3|TEM+T@#IF +uCMEaFmO1a*2V`O8W{&q#KU@gE$JK(gkU0QRnDfFO1DV4)%(6lr*X$vAt4Y4}xUO*Kn#pu`9>oje4?MUIb-#1GoZ2beyA?=*rf_$j#f)5VKd19zSV|3@toNfDT*T<8#LpFu0D!+Jx9*Lc^^!;{ +SFN|HGxk$cC*F04K512I(cRC7qxULPGYpNl(g|q$aJ{3QHc@WBWqTmolk_ooXr*>81>cgxDKwPDeS;lgk_K`oV +p=^vb@6etjzGrBe*>WeL(O7xaeaMtJvo2#;)cUK!^^zaO+q_4lyvBw~L)H7O9jAE)G)mHdjQ(V4x8i(}szyRK(Ae+9;r7sI{RB9xmwmK18w +|pUZ_w?T*Ud?kvfJv|^^abekHH+Vg~=Rs!+y-2V-wKMw_tHU$W&}N4W_B884C;xp)Fjo|Y2_CT;gJse3jnJ?#yeR7a(S6z8}AS +_upv;b(1k$`Rmyu&B-1vNm +{;Q=vbk+G6^q23!8I1rk*maz3M@l7k**rURnBgu)<0*&+A$5jtmzpa&tPR3MlM=4k=#fBE*sIpLL4hS ++;vNJ8F1;2L^tLOt)H^icLcf&Zc7w{|?-qt5+cFAh^=>3PGtNXDsl8=^sLPG*tc%M2t^fkFnR?ys97b +wIU-NgyRxcSXL132%)uA3x;Df=Qd$&&C5%XWC{+(w#d^=h!>tXTf3}nh*@UNXXpccqNh^!AW;Ct4uOU +&_qRyq?*@-2geSK*l&~`)XXcq4VD*h4e+rG3NdnrlXM3jqS)ywSAMS=>;FPbBF=V{3XQpsl<|-tuh?Q +AcJ46K_V{WN^7A|)9AmAtBk7?}<8C#MXv)LDi2;ilUNxy{9=^0-CofsOTqbj!jK`TCZE%=g3<3}pAjB +1iNhxbQ7I!%+6H6aSj87+Tu7OwOc@J8;LW3?oEIJAzLQ^cw&&e)q+{ksMQWBYbVC${Zl7R3jta^%`oM|v) +VhUp~k~y+2_Q9f8e3r^J9*;)nLK$X9Zjtd=leG8c3-LVq4qZv-Dp&dkc<_DnEzEEpBkKX2f%vZ7s0O; +)%F{2uTmk0mSp@RrOQk)Uf0MGTW%=dF*T>KI>33+fMw90F`0JCezyALFqoc@~hYpY?8K&C;LDRNwc2} +?#!1^H)D?G(tOD;Kb``ZgRK4J@ja>^N}i(IlTj(gl}Z&7BOz{OE?^qnFN= +>zcu8r5W_=YeWIzRaD9~y{l_XtqIFq}7Ij$i9dCqVa`PKTjf;me!J&Bgi8*B7_fFW%j}zq-C{wH@k)@ +Be!B{^A`T0+?O7D|JdC47$t#^~2|5aeQRu7>!zX)RG)8Ngln#qj-7c8O{6Rr7RQFQ>L(p3Fl(b4zdLo +1F3&b*7cerbD~WCDaXEm1mOtd%qtAofsEYIQM@Asa%mWY#X)8}QlmW>%8LreUC~zLHJBP?Plfykh$TG +QC*n`ZOQZ_oHLUtbCARe3eXYW*gpakM)s%F?05ci442OMj^7S|3Eews;FNc=%HE43~q#c}UDn9wnX~W +g5_+Gg*akKI3znz6#`WPDKw&4J-{@BBU{)Go&?9M0bBE%ktXHECE7b6&mXbowP)bCwdZdA%d_r!WjJn +=IF2=}cwO#jigNGcg9_NAGCsZ6sWRRa^L>NzF}#`l_->k`Xefo8oE;_h_gg1`~MxFJuvoiEcu8(2w{N +_KfgB#62)*|PxrtgGtZ#Teo$KoB&R*VK~yuGHsTY(L|iAG%2_Wbk(dB$9Ok;vG?_QaHLQJve!Ty=$yW +Y~jQ$776M|ag*KJRPUT(jgm9H>6G~7bm~lSI<>~rN+wAbcZ{%OiZa*)D*4hPeNrlfN(r6ySx_LII +C3sTjUqO;l9BFldJ}9H!tq}EE6u{$7(Vd7y9!7n@&|_zcr8H708i-6F5-cB;{!8FBNk?M!{ocCG0jHU +$dsAM;76jSgTqfP(u*Ra0`R;lP(l*UD{|CwEy>%KE&l2p?+1Ru($G02o%g)7^jH1S(%)!~tve6!Gde{X@;;5LWnQcg71x@dikJ0jwbMl +>6p#-oRQkgnfR;y?l=&=I386iq&ipGoRg(Wya|PUs_^9OxT#7bO4J}+}#~;+KBi#dK$ +*gGL`4O@vl(sR|mLPaxTeEJ^p$uPL7UG#1JO~b{5!QWyG+eyjZbub^OiA_uq|R@D6ZXREit~ETMS_qi +E^^V%1zvzwR6-Ckm-+G9 +%g?!9M1S@s10-c7AsC(P<{ZFtkT5p=9Ia*=vXzwV>vLF1yh&KI5xG9oGlEgg|09#;DKo2-SJFq~cp;ISJTKLhKS@xU_OSe*H$6>l +~vr*d$eW+aP86{PPZ`=wKU$1o(?s8}k(k)|DYQR&H0`~m5_UKN{(p6QA8^907c6s+LO`fdF<8Ok>e23 +otLf2}8&8Z8xmwBNSH&knsT^>PGBra9Rjui)>ec=U#8kAOUI2F6OCxo_8#m*dl2*VHrM;=gQgoYp +C_;l(UwKi%>|#JSvx|6Clpm!0>jZf?#a3pl95qZ#87U!ZWqdWVC6Z}Xw67V54tO1YPL%$RSN4nqv$q%Rj_EvaIwFT86=h|>;>s}8OSSqVZ1y=kTDZX0+U3f9(PrC-jblR +?^FQ(HlAvdMr1=b65`Eix*;S+-IosZ7#ML$UK +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 +g5z(wBW?12O0=+P!zn;B{2Yf%=gY> +3l4jwVoHB9)7iWZgDk(j>77m#(D9+lD3jdlZ>*F6>h-HXDpI^YxzAC47~JV;r-Gl$o$JBvWN+wCH7Bi ++b+9{-WpVfsgdzGi&O-M{`|^Mx-M5hHh>?c;A-1U|d`9FTY-oma&Z2uu=|gE@i`LM# +S1A29w(fD_YQ#WvWO60Oz{&Nl0X?-(W80GRHQ^&5}URmqJqnlL4d13}x`-haA#kXzQ@Q#nPzAzOB(i4 +nIRaUZGkL-aOAqO*s~$a#$||FWy26)@9Z2{GzGKJl#>AV-AWvBAZj2h82~vhfaVn2ecZ=uXD7`x&^Ux +VerzpY%86t1yO%FW!8UZYZV~f|aM)rAC9)&2fJ!Wf?zPv8L%WWku*6|G*7_Yt76GMF_8`)T>a$?fD~0hSU@ ++_Y16#{td}CAwk +MYA<&DM}2pfx?~Z@aclk;jvH!1qvs@2EV(g$X%!cvCR5@R|kai^qTj#b<0doY;pKOzICs;f#*ZK0!fH +H93BJ`R?M&hov7Y01;Lj;XS;<)V3}a!+`q1(-bOg((EgypFkBevW*V-&3}CvOg=uT7m6PSw$IDM&mL1`D-`TvH+}+ +y@(O(n%rrel7Lt;HVHGk($1P_j`N3tKiMMx~EMuL7eyCB6Zc7uOdkQc$521;TcrYKtwI{3xv|6zU#EN +(v)-RFX43-rM7t#;a?@4LQ_%wNRwKmRo(qe^Yqz?2w9*+KzlNY*#cVm!{!9(~dwvkXLnohVy$K69H2g +Nv#8I~&d(EiVW2ML54pFs9>metBzTx`c6-u}swwthj8f?D)G18`vJY`pmCNB^u=DLu{ecO&TFcPU{Vu +U`>K;@s!QZ2kJkq?%}7aeYUA^E6x2H1qEd?&cL)K(lUSoS7BOu`Jz}US)t+SR|jW{;qYw4qQORPdd!$ +_#eIokamI21m@ror~ocopLkm{2Lo1^YI+?H&+h`+&ATj#MMEyVLSe&3&-P1+pYUiJDOn9oy7mzh?!uzKeQVKonFt$b3o8@TPO)Tq&>D;iI?|vhV$~IDP@gF0@ +6?>J34nY)zz|LIqXUBjQj{$7+OsW{XY*%agqzYne7+3K%`jL(%zJ57X%P!gV&)Ko{=|Omfoq|wOh#Y? ++5MSisEW7IyDiclj_Nlta5BGF@#Ya9?N^;g|?Bfr*5H1SdiB*UJvQv2nmKJjn2t6kWUJt2SIm%}?409cOfj!5CR$zFvo1CiO>MqY_*!Bkc4oz+)lsRKn0;p6 +l+fRdO!v%7&i8HopH`B>yBL{Bpo=bB2JthWc^AkT7c<@Q%$7=xkA$vazX$$WLH +LAViH$`tSt2@s`t$;+C$nCnG?8prPHnu7rImSq>0ZlnEI~Xm4}=&CfR6dep?fwafR3YM(eo(49s=tqK +Gkk?9H6}&&ye7&0DS~FzY5I5pqvHU)&uEE9T_~LUvOEnBkVN?{x(@(d{?!|x(kEptY565m(5yzF8==F +5nQ;!>VQ2_N#x2Kufu1^&{oB5Gf_2fPWm`ZNu-Hf(!`9);X2#;lXTi;&W0z)@R;_!PwM@v!4s9IX`45 +3nDz0F0Do;_Pt@jiz1iT{#8AWuUJ%%e615@(hI^Un+f)DjFrgl~C$XO+o9+z+eVbFaC^Qfaw%pJe9XO +$?*$xjGblj?wSfYYiS)@A#u}T~`tNQwlM(6qw=UDFHNpSeG2N`=-t&uW3u^wE8c@A~ds#iPMBkEfW{4 +GGjp+Ow1(KS2PUJL(9WEON0w)3+fP#b%DGLAP<{`axn-&cS!89%WyF7*!u9B4*Qvr@4s@fOy|sm}1AD +-O>gu>Y@UO`!qB8a)Dv#{puP2i+x8^o(5O915^*a;5%F#_(4g2-|{!f8Zaf+Eva|^@~4_H%)7r!nP#x +f4T^M9Wsf1ifHVYj$fbVelQ7xxDm}Cv1X4h8nl`RXNF|MiAk|5 +PH&O-w0I(4N04D$d0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FK%>fZE$aIY%Xwl%~#)V+cpq>_g` +^S5!CKf#YtCSFklQp>LtO_v}j!PAqfOpI$LZcQ6s6i+0g%eM^Zm6Ck6H}EH9zRB7?h-sd0pb#SUAriTkd{t_UVf6?o`F(^jN~I;sN23d+N`x0jQy&!K3=*x2+2LU%VhlDyY*Gv&k +sTI?rA$-4dUMFl26Y&tW<33k$Md7<$Rh-6DKZGdb*W2i@qAjU!>MS&=1c??^grm#YgXwHwpbMAN!l{0ua4yLr6B2( +x$v*alkhC=eH1*o#HSh9z_XEA}}ZwN)T(%3E`^lT3E!CV_9a&%xM+DjEO{pz&H&&-@1EOu|i8<9J~H#G8$3rVcv#(9ELf|D +1&He6s1flFv;By?s!kYCo>1ybKoyB0%wpYiUADjL*(#4MPUBZomd-+sBvlwsPSnBDoV&F!SyVo)ohGw +%6y)49fo6t>Dsqs`A}?qdnoz#;T4k`MgLyiZ_TKJ+l6fYDsvNi22`OjCGqD^mmnOqda%sz|vWd$+fq4@Wy^5XX$Tn0L0_Oz +#3JH@d-&ZRfPg^60K_L2S*5vQBE`xD8EO+1%*F{RMnPX~=fu+8j+N88=fl-q)HaFv4xI ++oJ3iP%Z*Eh+FwNPzS0KgXhlPW044@_e|Ht)vQcL%`ib`+8hPrZ?8>3ZwB5Uh{fxZls};Ny)h?}Lbt_ +~_X#-`lK*9u!s{5RqGPq)ZeMpq1- +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 +o{o9KHp1E23 +ri>_41e}1F1eAV%A*fCpoCg%)r<=*$IQ;Sb)!AQeCx08m%qQQ!{oy;$lX<)hF|xxti%_7OuMPq5IfFC +}naR?iSV8?5RuT3acxiT>U@40C@KNM`7^a8{LlE18%9?dzaP3dM4>G+M+apL(P%YX7Mm1ZN!j1^qLIUsI-RMHB*->95U5m`q~^jKDgI#2Pj(xx`5K?2^(q>ZNx)fV@%o87 +~v-jLu>~XD+sa58(u2ge>kF@p1FLmVS%MGRC~ZNAU=1iTy7MbI$&{%jVq|+wp9M5vZ$%;?69>9K#mdi +mcaiZQ#6`8qtQulGW|V`}41LN*H +t=L4ESNZUswhaYNOpYs?nnqvUJdZp2!D_sQ$*MPuu_s7)C=*qgy2GwG~43?|7+~r$VX22w(>RGY}YI| +WjBNZEw2Q|G(5HDEORAa}%$#=9R@)>|ls`(pr4JK_%JB!nZ5H2jPU?J6Unjab~oLA^N58qzMuUy&^lQSCOO2d07HEDgSdMIkBvg(avg@of7)X?`+kxAk=_MyaCRqS`Ng{Mw2`$ +R}X3LcuNYcWyWqTZ&qPN0GpHQN7%!w`Y?Hhy`VBz&?qplT6f*NRSh;u56;Zk%CPNmg>d#l|T$iY&vqHXVMn5OlcXPBU%gmYAjwA>pk-k^p{$x)%oT!LRE)_PVy%||bfT49q7xvBd&%dlN${e +(Uc+<Kacc93?oU_3y4_Y9 +29%Jb7V#tQAD_$Ks{qnS*$aAKnuI3rplksI5`-jTHD8bI@6zHQE#HX#`J9N<60_l#PIBWBn#!2W?{PJ +cV<=d@WsW8F@_HSk_Y;}64H3*`E`rJVoB4QjY;h164zE?<85;N@I7wJ*jOcakjrwZ&l!*((^K +bxP1L<%4=szLIQdvlfe-Z*#!@>DY`M_;-L&pVN*X3Ws-5u<Mr6X;m>du6dW`k +|+1Y{*C18h3pKi8tg)K_K7Hgn+Fd5=<*&|Cz#-r*0>rJ`ow97eB<9Jj_82Q#zl+_bQ>A5NKhdYiuXth +`C8?UFS~NCSRBEVI~UT$4;*&io6{AK-H?)%C}Mi_E6Y|T!uZzUNqr|Rn$R?)*dVX(yRv|6dSd6_aG|Q +S?JiqZ@s^mydU5Fd_4|NZ!b><^^ETWIc@(9whBK}^!D_URj@8 +#r|Q0$1c5e@bfyI<%#Vwg$}n4Sg?5Gvl>&v#Fo{>E4gK9S9$hq$6>AV0>_L@;Z-VX}zaLOD%RSN|>I$ +u1%Hl$nc-&{_egUxp{s!Jr%{8#jjz$pctk?oPP({!Vvd>@KiE8{rQ=XUlNK9074=RGL{`a6c+#&h1NJ +Y*Q)bDPa36~A+%#^S6(>|gP;VO4(w+M;?Dnu4&fchx(?G9H6VuFAD=*rk%ZLIW#EJ_gLzr +b*;7F#X;ZpsXc9AcPsMgt{;njwtRisoCD3qDqUZ)mt&M%>mlt78-qPpFMyCorBL7JFbt+-1$veNS=?N +UY{(W=-;T`pfTK8l75Ge>_(V*S0P3`B)mS=8;BOQi38^lPkKAKwjqY`i?1{y#Fd?MEK!hZjpcp_wM9W +m-J*1wUg?8yZuyw;f%$sNqlC~gJHNcuDYufspf+Yv8`o(9!o`7{0}cKRJA-tM;kCaM;A@KcK4MUr_-13tk54nqbi$Wi>;$?!`WRS`+a?O1VVu?Fjy%vOv?SdeFWKiYhMrFNkG|{TnJE +(SNY>^tpS>r*5u5 +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 +5lWUyPaB@Ang+Kc+WjhccnT= +iWhzn=YE;oC+Rlv!@v)~uqsr85IY4~7VLZ+(BFW8sNMhxVJX8U%EIK18>x438Z7)UjzE|*1ke&uqFxp +f5d+og-^-nP0lK`%c4tDo5;xk~&o?rRmQi@7jhc7VpXSZ$tf%Osu1HB5cI4MkZVEA`HzS%r=!_vY{m0?s{jO|Xx~LBH|!i%!P}O2)wb=i--civa`Tt_xhB1@N3`tDpbc>AVut>oEvgu< +pSxNVEIA^Kmfs@!`3cWhFpQL5};#cz*qc_)z_6Gyp$i$XiUeL0usEo7O0=9n>63zl4 +Fgte9OFb$=dg+gGiwDpg#9qoT(77RY1<5}GXTJAW%yfQY0IJj^EpBz8X9G35Q16-g-TWv@F5tLuj3ei +Em9D&;FSSC$I-on-)o~uyMOt*yt|8~i;9B)0s~7qEYOHmb^{S0ku>L9xwKIrwWzUU+aFg#i~-VJDRb~ +rU%{_mDid9x)ddzbnU!qmkkmnc5`jhuZo!;K0b6^KCa(+B<`E4Fu#m|4pSG~cQOq!sn&vq>eQZS{eaU +3MOQ9tg(X9PJ;Uh}$a{^>5v_G^-L9r`hAvko9QX4qX6Hs9P!eRmj2S1y1Q^o<=emSgu5=s|Cc1{-T=* +_FwH8_ufDfhJ=n+dTl!6tJtKyz8{*wrN#q#YR*WJFcCPnr) +5V#Hmbf6Rpk79o`tbfWn5Y@}6j8|D9}pZ+-zET!{AZb=gb9!`+SEmB-0S#Z#brKdnH+YZQaIih`1fx? +T*`}T%HY^I9el#*yjEM@6+A!(=#{uaTUIER0pw4VjYkd`D>N;ef5GpRZS3D{_u>p&&2(4vcF)Zp34yXSCy> +%_d%|#39XPQ%qq`F6IWg&DAR{`r>KL$m`qS#lLZ$DG(plO>Qg)z;DDOIlLyqK)nUOUzyg;r1BV9&4{K2A>a&%Tx84umbbK(5i!@AQAKaRClz{W|6;$N^CSs5xHyz^UvMA!`J8`xwlkn`fmSy?vFjK6=x>_V9a#&mArLVi6R9KQEU{JiVtsz(c(&Rz98S%F +I~?*M+p=Wwk?&PdKPHo#`WOnHQ{saTEeJ$2bqFdZ_{)bS}(sG;359;__8I)QDVSIJMfvjb?5{!n>1&O +@O1SGsZ^j{xA<5r-qL|jIbjxWR?L-j1$T_h^zMVAeS{VHgr#g>pC@HA`vv;1%Mtc%kj(GU+XSKw3Zkj +XuyVPs&~D5f)o%pX~&}?Z=_{{P~IA#O}Y|oR~Q90n*Z3q*zTZcs&Q1r#G^F*=+7`>vybYBQ7&TgZ4iN +ENHb#NoPd3RDaJ&A9=yZK +)|RS+zL0vNhNPYqx)=4dXPIiw~eQ3zN5+6Kmhj#9DjTwHouhf{q87x1;H3hI`35qc)D+|ZL4tCYv>3%Ta@~;0trNR2S2C=l=`Kh^}kC067Ux*U@*Ek#S1i +XPJwAY4oGByXF&h|DdG99kU2USOxL|C*xU}#O38SAL|pW&RkeX0{ZsWft=dyGH#Pjx!R249v1yEdt;% ++LEB(V%F|{5%TF|mI`%vpzyGc`o=^u5Jv%*9^%z?!Nml)JGr5fpDNdH?f|rjd4L*+HrD@pip|OgxR-K+j +E?7xTg;e1S3CzuApK+#;>mp+JxDr!rekgpZ{ox7^@2qcoo%W_T$wa9Tu6BkL4o-+MRl|v2=x0ov03E= +0}#yC#N+a{T&I}Ris{y3s}d3?9FScOBbd*6XiBDL@nq3*17ROF*G +#w?67P`hHLMFW89t+wC#V6vhEamM^?sQ(CSbQ`NBs1~=nl%n=WYXdcA?S}k(Madpc4d0ickJDDPCp;X +f1bqZW7sPK`}QVz9J%c|%ifdMGXp-2r-|BzW)+l31h<2pNF%QX#v7UqK?lw}6E +Ehxi6CmF4z0Zfgkl6yFvB$k27*w^?V8p@KyqJ~T}9O7sIQ<-U$a@57N{dm{q-K{Xvn_G1c?vPkI;e7C +rMhg=)Yzg)*yboE8)(F9Lhz!n3)b^LbZtcdG*&weQyj9lRU+dgX&6w*Tfen$>98W672ZNW58iZ&tyx! +8Zt#zuXP(XNcSX?oeoUVph)Ucb0T&jFyk&5x3CKO1kAh~rcV!Sl7g|K~{`m>6V2}H&IoWozia&e+{3) +4&`n{7Z+zzV6lfEs;Dk2hs1AJXy{-h3m+tyc($fGgEq1$5@F2Iv^0kFc#64V;tk9?=~<~>M@ +PLk_5;Hd%#qBt;R1^@N-!mLF;pwr!WAqj`WmHv%dl0i`ZqUuyT=F|IUE$ko1{7n%#{IA{rv=<8eH96* +B!K`Qb@PcR=KxTr#Ab(dQ`Q-WN`|BwB?ZZYLxf;?)#Pir*LDDpeDLCyuCH|Qdl=wMhV7)Y$WVdeQ$Vq +D{=G4o-FG;N7jZpaP88ps3bak0?jC=pf| +MSfOQ<<|vaW<)fVV`oGZ*&n4CuakpBckb@p*G-x8?;(g6CwE+cSq$%&(LY21{@s(c7NIMQ-TA0sw4L&9oUba5gVLqJ-dc(dD=UrZ=C7KQ6lBkD_OS? +it;&ynkW*ac1P*m-& +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 ++g9VHjVJz-r?Qe*RTPiy +SqrXc;c*NY&vP`RyXW4R>BsjLu{rKjanvA!)lw!0MEYyidrxuuj!`Z73Q}j)!olL!)jtJK?P7l^fpcJ +|01e5fAW{7&lx5En$KY#$6`lODc?!a(@(wPLBUh{hn3mWDrgFuO0LQcNCtssS!Jmb$_*h`a~V(Dx7$yZn +W@Oc)V*pSLmu6TD!jk^2s5{C%*^s0l?1%Yu*;x4wi2*eL2`Y1m+7|4|p?e9Pyb8Jj^5&U20M@Z?)A_@ +xQav+PtK1EH8;~5O~^&V7sgTdwey#Uex&J$)jIhsnFKIlxMe27gC?=$@Alrr;xx|Bm<2$pnZ<1oO4EY +hbH;h7hMivd*02u`tS<0!8vDhz6r9s9R7K8zs29&Vi8qsR(ET?wzQ6**B_$b&pH~=sGzw5qe~h{>O|@ +u5wN)cVW~bU`0C{3yHj!{(c3zz)p!lXjKL|YHoiyW(w4h6XAZn!U9eGq>E>M2-?mX#akSr|+I}a;SOj +aZ!t_NP3_xF#;Zjn4eXq|h8$69wQWAk8LM;RRp$*u;1z2NPN224pN{!<}%ea%UrpDQ6}@Fo%&KE$}EL +x3w@A?TN`C>X@)h5EG_5wk<(F*Cjt@4RwJY(lX8tA6uM8L`fB0yN>9QKt?`F+*?rWZlu~_+Q$?0Ya4+ +>KJdBE;UfR_{%vJ^KKITAfR}yms-4k_Hh{oTcahS~#6KW~cUoN|u3)18>y)K_Ol=lg1A4iE)-%rAiM! +H$RwP-R_@2v+tx5tghkccIMxX{`=?g?dYO5f0U4;y1S~`_2hb_Ml*oBvvtR9&e)NoxNULd% +F1lwMR=&IqxCqL46QEQP_TR~5N+Z6X{tW@if8%lan!Ah@Rlt*Z)K}uZfF~rp*nI;R(nI`{N-#JDDLeW +AGfM+OQJt1&r{(Zry*yB7?Aj`Ooe>q7nO-hC2oFTDX>f+Tx1g*e~CEYumpahRc|;QWTXvFx91qQno&K +jT|T1kIZ;bUWLI^VKw_>=!ps>A^m8N-P;p~@fwotM#c)pxe5#BA +KB=Gx$nrQ~NLxLFHJafb?vX<~mtpms15{VaoW~ER7pv+IjJ`Cp0w+HaG4!|P;yQq=x{z3BxHc^a` +hjHiC(YanGLSvS-zNkHl6luU_NUu3cx1A~tM2k^lsjqT++zP_hgEetw`@skuK5*zS`AAz3SI#b*r}PE +J6f!CZ^zwUjS}xJy(-)L!sQfd&P`GH^ty96 +#7o}j<))>##&_t7q>dF)XA6d+^@2V6P8`obE(ZQ2Gg+<)Ea=LE%4zXMd63y(L26tD-FoZ1augLgt(8; +@R>;ysQhKQ!$@Jk+j^}v$CuL<*!PH%HWz9Uxr)ztpAUPyE^Rp#~HGGHqMR8?c)XW03Sx_-4t{pwf%Q$ +*B}Foh%x05EI3u-?ytyF0n?WxCAWCU(UaZvuMTFc`M#<~ly@=JXJ%q9w~f>JU6-Xe!$)lDToufB_FBD +V6e4s!6_z)_p!2mi%>b0-~=C4fwiDohfL2enp`N7VgdHMtt|}Y30A8{G@NP*9{eheDO*}Tle)I+Pcl! +h}%r`dreJ>0|X +QR000O8%K%wh%TmZcSqK0Cxf=igBme*aaA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~Ob8lm7b1rastr +=@?+eY#`f5n19P|1+!w&xTFA}U(sfd+?5jg!+{Q3Ujg99cvtF3Vk75sLozo7o4seEFO<{9uv0^Pbsxt +e>#;#hRre%gei%HEO^9C#?iw7zQ_oT(YCcngS4_R6H*wt7>td%UqPaV6v$yQ7g6=HQWCD;$K_Z{gi`b +`&t~?DOZQQ44S$q^4&io=F_vN(%@aK?C+0k!Al086qLk+iM`!et{5+~Kz}?#Qi4IrcStBl8vCY9l@=* +i=M@9w3pGP&6)y^Qecp=nqhz96Lb+sMB_Szs0od)WB)HpK;$QP9Km&l)D?e5R906@Wd^+g~Z{HxrnwN +J#;#zIl9=K|1kP&;M7%!v<`beTE#0iaV894Ab2-ck~Zg0t;=LCsvzS7cN@%ZvGilW=wWeYe7Hv)TRG_ +Bz%6tI_Xw^L}(4s&>gNYUeSXg=0E33bVj7zOAtR&gm$qRym_64hE%lL&$+VkOEG#{pwxDU6UBQgK9EX +OJ-^SR-54Xz9>DNXV{ebKr_h4?r9-+>p*$Gz8H~i2#ZMMxupL1g^9mXl+q6+MmcZ6D63iB^iyCh!!ey +Z-WVVMjlR!90Or3^9+OM041G`5- +2yVZygGJHQJla)f7#728#{e;#by7su4JK}NYxunZsbcM5%r3CrVE} +!MV^*EjL6iZRmUUqicHVq$D1ZNh-d!JrRN+HPJ)2XCOoN)(`0KO`rnF>JS~_Bvj)-R4;8v;flw*LjZq +uYbQ(Ya-&mEKR@F-%yrF5=uyvdHGJqFeK(X2vmL6N67(bMge?Ep;GLPUVBy7qV55mc +wM4Vr4duJiXwx9_L2_lB~)}O%k=!-AQ*Uu9ns4|FVWMz(G!}ua1{f?)g?*_l^oBaHlt0@+(neAOkQVU +pIYWb!D16LSwWib(IZ8H>EGu2h_Tn0D2}2gvY331n(7KY3`24Ur7DTeaHXooqmJTaB9&1tE}^{qCi?c +f=+h;Y!8+eX2X!o-XxpxB$?GUCSMBS_VrFZp|JFR05E#!ADNxSPKpvtX-0EfRuqil|A3-##gS;^dmS_ +~Y14Aj!p!{@mbN!-SUFq*_w=hPmgeazwuW@HYfEI(<2(oZiOs&_7y@gYU@97#v#QVrgen$z|P$2sMHc +Ji)Q+N@f=Nw4IYYBABCQgGaX3qldu?>5RWgrNGw7{ci@=GV%qObqb;L+)%-yd03U>aU4%-q^4%(K2OI +`&(#`<%P%Ws*YFQqnIO?D4GUWv-HBA)(l>*affeB>r4{Jkguwt>wo3DABQ)2y5;QGhk@JY7zD~!)1rs +R8TJlTCOz3Wz-5VWbMgV!YLuGw2+=m&L;G{!V|qKa(O_N5#F~7*-0{ucJ3!VgGm0y~(XPAAJ*Z=Sjj;cc$tmQ+l+?BdQ +R_VG)J1mwMb|ijF#0u$hPyBe+bk#i3p!{4hs=%ri~E?CVlBi%qgUgiZVN*selOQ*gTvaJOZ3MgqG#k6 +&k{oW`Y{DLk8)4U+vBLtR|B_~~se1267%uIeTCe%RJ&YKf*-VusQZ+<92t4`V4lV-4BZW(-cCCB9fQ#M +pXji*uIW}G);UUGx?ZE%hn}x4AhJ|j-iXj#I`Ga51@%kV)4X_(U+% +&~9z;`Q3$_%Xj6yeP +vlLaS${?O^qN@vEBP+CrDJC_4&rkkaD_6AZmk-)l7c8pq?M0`8`2HiS$xY*9e2jL}JfP8k>tHUnIJV@ +T8(KgYC|y-!m6X=H3g*9f6m!>vyKbXq2EiMUOHrpIJE=74gV#O$Q{#o!kJxCLF4G{T_GR*e}LQ7Q0(~ +QBbEjU^*teouIsZJn7+t(xa~{hn)u&-fS@H&259@ZYkXG>Ej!x)tJk080}(6x;E9dy?Kd_o^Rf1Xi2n +)Ad}rWF;`R6xpu8B&6{C7XZuwjQ2LPDDbPPB#)jT}&{1sfAiAZty`tI2gLGX}f4OXq38^SI-+bMz9`N +v>g$J+~7o8b3l52Im%BQEb49(MyZHrdMWv?4|a#AZme0tZ5gGHhl(M=7lmqO{iema+!VU*)*fFr%O2; +;C{3y^sMIONdol5IBZ+i_)Z(ycm?Hin01E!9K@67)xsHlO0`iSYnW)H_--(#4H +ITiY5x^o*8vF_c28I1pb^n@A=d2wI=e&goPbFnk1Zuh3Z^x)Ql(boX1ozCL!gbWC|`73Tu&HzGBS+RC +Nx6@q%jC0Iy!z+&u&d1|H+`9wui^1p?q$g6F1XnKet>%**JtKF{6^W4`GoZo$08mQ<1QY-O00;of09j +iA00002000000000u0001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#5b7f<7a%FUKVQzD9Z*p`mUt +ei%X>?y-E^v7R08mQ<1QY-O00;of09jiu&n->v5C8z+L;wId0001RX>c!Jc4cm4Z*nhna%^mAVlyveZ +*FvQX<{#5b7f<7a%FUKVQzD9Z*p`mVrgzMn8E^v9p8*6XkNb)4-5Cv;+_) +lO3&A$e1ShVr-uudF-#hs&2R4?FTrsySmY626xxHtE#JC&1SQ)+}R=7dz;vyBo1jvtmw^$|00j9ZFfU +V^0M=wZymeVj(A(Lg&&daxgjy3+kzjF=|&;h2Hw75P%94TGBDlH_kyTPmODxwJ<}mO8cym*>sOtrLF +Am9ut|KJwy#P(%zO(m0CLn9a{M~jRfi{{ZFl~o5$6=R@ya0qZBN9+E^xO`IVFH9ZFLpL$O_{P_%79a4 +4bSXr?L|AXej{<~hYlg{hww|ILEw+(`EP;!xQj^3YLnAm|KcP3bD1eg{`mqw|NXL +t-(8nR|KfOa8tmw~b +zK+)-jP3_Z&>fhO5_R=fvCFmcSu)^@;KTR1pPBf)64JB%DK+feX57%J=+-E7#s7%dw{fz5oU13;D&Z% +`J|?bv&pbK%s01TzrxABdF>ledG>V{h?)%2f2@wPT074gn7W^6NN)#t<9X0C3SjrxO_Hkb-f6iVZp>E ++(X8?#sdj4ICvVwsGJBYwisj4@}57|A$%;wjlYf=RnM%n&3Mdo5fAy0T`?18XSn} +#eKo`A`qL4f`j5`qn&hxI|xX0J#IjXk-=4zR0~iH7M2jc1OuDJYfj~EBFC*xjM-@UFj(khY>@e4_H8` +Whom_$;Jeu&598(S?0!iAVlkL5zmwUB45r`7&*SN^L-b$f3*9itY{AHl@8*-S4(;QqHn|^;r(ekp;7( +^tG8x~Emq2(qV@wlrW8FZ4cltuRh0npwcrspo=i@dSFQ-U*G+U4XnGY7rv35ThEXe$RF`pSah%p4x)A +4k)08aXyK3#T!Gqe%?8+;Jsb}*SBJ4SDC51K4cR-(=3-xuSrw@Y$6n+$bmywO3z!OcYH>_91+3;toP)}H62zuzJ%eq)we`QpoVqq9@-;dt(&_#N86(^V +wCVg)Xi0iQj4gY??6$lW-CG@r=5g*kSWOc@Oh)$MkD(|R%=0W`E<1td%kAziUqwqb8mV|2r}FrxcboB +ZvXG>2vYvEBT__%jSLX6SklctNWo7T+0bP>ir_R&qV-DrrJ?m8n4fGcQjwSVpXCi=lDTMvMu* +mr1aZ~84zza!?!Zs4!(sXhq-hO1BMy)$@N}bf|vwM3F7xJ|AC&)=8xd*ODgE!$&LL;j5uI55w&)%ZLz|p--l8wA}_ +2O;}pmyrXqbOSQ4Ezji6+qD1~FLsY7wHXCziekR;U6aYb>0jq2z5eQiXi(jGi6)mjU +$DCDylO6sETIBIOpJi2bA?PT|P)I{2`?P^&HH0Y&=>>yMqQ>(I9ZW>tzrp0?=2B`jKFg@z0{Er347hf +r%R6TQI)1!)H@;lqUEW)2&0Mo=ee(Sh;FLVRJq +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 +jB;HV3Lo719`4V`T+#|{S3N?K%!^nb;#gBF@ei +VtCPKIU<6M}re8F-_!wkj}DO~~;N?3|S!OijG!S>9h#V$}OnmlLJpJ=$!SXQLu1#Mq&NsVI40djAI|6 +9p#qm4;Xgar}?AAU9p=hHDW@v~tXK5QIZt92LU0%GsKEFyj|IKSA +F6cTM4|?ujRO4LsJ1~GwPy-C6U-rd;D+Ud5TLN+DqR&hn4Ta<6nX*1W}jcWoH=D?@15(K%CWOZ#r$TFECsHh6A+`A66(9G#QkG-b_@9-T_{rhaoa +2(Js(FF!!x|aKnR2KEUR=z`kc`JQ)m9b-7GI*$_ef^G@+FO*G)mp+alT#X0y%8=nciO4h|9kQ=w)p_y +h5#(SZR)&|x}HIXMwW$AJ#uP9q=wXiC-*?`ysk9?pR6B!D+qyx%CN8IC@phoC^pUAGOp{XNcOunDjEl +8cLHds^Hs&I|+wb+_+{XvgE8zz&^ud^wvnvT3bzee7>K=EMTpHL&4?lgQJ$B%JhhFf(Bk`rH)tgPbrI +ShZRw@Gs-C_)rN-A2EZ%<|_dcS;nNDh>yKjqdr +JF|M{6SK%h2Xr8h>mb@F&Jp};|7$dRa_kS?*a(SX+rm`i{^d6`r5%I_Q4#GW|%RtuvsSAnU;vdAge*; +?iBq86TrUbNquC4NhW7-Wavn;A|*7W7zunFn7?zIM}P6b*8hnhhwPJ*@UjqbAYG-tJ5XVt?-F79YwUz +kz}wPDB6KOTI72upyJ|Y<-`Wj7L0L93yeqE4sA@Ir6RCn72i_V4^uc>m+&*m)+F4(;_DB8)%6#z3c6%%|F5Up+ra@^Lz_Kg +d0^bm$^pGXTlrn<`DSOnw>1X+PQCPAXuAk!QaHZJsUz=7D1>%O{Mc+5V&fd50FF`aNnWE3D3Ml{-IS-T^}p7V!9QZX$}v_hrx|1}&MXJJZ3;5=Ss+9zb{rmVzo8>4W5cD<(4T +yeiy~vtuN@S^1-tj%rRU=yVFtYdHJSRRe1+HtPpT&ie{nNz+y!u5vpKcVdSRltbNVh~s`g+3|@*<3O# +Ige_R8=#){e>syPM;VOIu{Z^GSMLv*HDlVXUQgShMur}%;i0ekXBdD%L*)Qu!WU(Wd3ftXoE2l!=^--cKmq`6lm +jR2E#(c*jv}C`%dT<6vLvC$b)bKb*q-#Ev`UFgSNv7=TPIc*+NSGv0;L0^4gak3|heK~BU^qKtjeCl8AtDA!y;)j{jWxT +({XMATQO4;b8pu1PmgOU7nCo?t(88P*^h;;btUmQX;-MY6Zl=x5#Q%oKm_lca|juqKBieHu6HsePpe> +6j%ba$e6TF#jol9w^d0QV$TglTV;bl#h@d^!D+9i|+pz^(h&Sm?lLBDi4#Bt +}89+Xwp~W>|=#oOYP6*5ujo3Xpu;Z$DaZph`5T{*(#|J!sj!*-YC3u0S4 +!8XHXEO+cjOHpguQ7y5Q@*igSbkAeTT@gSv`>J&Vj2UbjlsVx^(r0j0px;N#9|FsP2HvP4VWLN3WYsU +L>sk%LL>Z9Ef8u8!UF>w8s3)a5 +AFwLbg{pl3xD?1kC?FTIX)vL4P0?5sT|)kQ+wR);p(VfI-OKd!BK{D)99pyZ6muI8VYz +7qV;;MfAKZU>Y}Qxw7jW$4?lihWB4y!>TwM(!Ddeoh!ay;!eM+c0GqG3hV~)gDUPg2Bp?py{Q +x->!0gISG2db@rZS?2kTeGy +?O%5gn97pO%N#mTXo9upCjcw&emIT#0TCrf|ziR{?OP+zc`qG9t_z_Gyu8f52`JZE(@Xf!pEY2g +Vg0i*urTJyKt|5EjS6-<)|c#3AxikFT=LWQLo8Cf*??9u%&rX0xsblsBi^34pdDZa7`J +2QSRb*hY7bH0L%^EaaTQUVeQHs57e*a*XPssQCGyfg6|Qb%pU`*t>4b!|X2u +_c919`hG>0TMDUuqv#A&%poLEta68O_=r~vslR|U(gTu1Umz?~xq9FL2R%g=t%w76r8Zd@T=Cr><9)4 +6?qCmctUjxN6c)3Jc$3|enl1qf<`WW8%8jwgy9I^mHaThTY5vhF>u!!5q;KKg$1U%@W~(7?w>eFe +JjjE;~(er(!2 +7w&5lF$bR9vJ>}OgrSy>{m@BU=bzVKQI4In&_H}s!8K7(0#h^%rtGhmkbMvf{|oLNRAK;&h0pctS@!P +g^7``Z@^$w2^Q+m#<=Yvk+rK!;hxm2(WPB`=qp5h}Bus-(aq#I>9Qi>2bobZ|K8^-cKl~&fe&U9o!tl +R+4MxV2HKonk3TuTb%Vj1@td+rC;~$s|%C8r=0JQ;t3YrMq&9Qrr%)|7N;fS--!4*JdvbFqu$`52?dz +tak?fc2KM&T7aQnrKwvxGHApO2oKutW5t +W=fz!w7iuhnYxohDOWmqKzN_Irz9|?-#$)AIJ=rPIq`S_1jLwpYSoPt9kk8KTt~p1QY-O00;of09jiA +00002000000000e0001RX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQUtei%X>?y-E^v7R08mQ<1QY- +O00;of09jjHlo_lhApihrhX4R00001RX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQb7^=kaCyZ&`*Y +hilfUb)z$w$Ilq$T$PJ4Hmx>Lt-8r|pD$xhQ=z6?!?kj0uJRX%L1-+cf3?E?V8r(`*I=gCAQu)A0+b{ +C5WfoI|6aB+Wc +<+zIr}5Q?^N&{oASQ=rSHFw%_u}yEck#FJ*}IWA{_SFNe0eF(CqQg`dT}y7hSc%d(aFbmBOvvDe07F&-=9y!p}07lT#b)Do*YiZ#mC9T`Q{42bO%MXVqCs-IzJNyWBm>`$p==|dM$@rHKSK`C@$-84ne0vPs9lk +v|=E9(AM<<8l(~)?0czXEDF=3qp9jqY&GLPcZhht2{G7sV3(bf3;3@dYVes(p1*Adipa%GS|jW3T!;& +3v)M6tY|oS$MfQLun>PGkV{?3n4G(93NDAo%|A^4O3R?~V^ofZ8P@b44|{)9dy7{f}7?g2sVP%t0yc6 +L=;)^d)G52bP$lT7XwsgXu+LkMwRI5PQ9O0t)ZC^E}HF>AE6Vq8@?1rf~?yROm#v4 +eyWrZgDQJjoapy-ZL+fUN~XP@>v}oxkw9q&qF-});>W2<`gukCI&pIIQy2VxJh_uI4gG5d96{+qoo;-> +>K*dK}4LlD_q0O*^ZfIoCr(Tz(I0Neq*kA{>JfET}!Ns$E!Dr**kS1vN}LFHufA)^fBBTFc48bn^Q)~ +VBVhO)+t)5G5`$Nzn-SYCP$Y4Dfq$uO18yiL7Sa#|OQB8;P(c0ReWog>V;g2y`Fc@&_AHt>!$;)3VI@ ++$N)XxpU&zAnj9>_7(nKfF7yKja$V-!t)_tleIC@2ykpLsGH72c)yqF;ImppbmqJPjrK`h^FM93>df2P6XVF9-VlV(q5*=w`#BNRp2DZ4gs;VR4LqzMO;gg%Xr{0Dac +Hl8t|f1k;R!Vzp=Tvt(Tc1}cN!2E(CAln*nx%EUQn=^Xl|<0OfbGRiZM&T+UQKfK^H(->g3?zv~NmRa^_;b8^)e56I+!lSy1j-97%8zBxuj~U5IW5=*31D=O}T5Cp +`44fe*$}?C;QLptB^tAi;5w3b`Tp)x?=Q7Xp?%l!M4y%7XfsIp@5QYEtyk*imz;@aEwEC;=2E1In2x) +YZgYrrWdhf^3>7q@OYK3-H4#=bm_ft>4LXmXvjmbq<2UOex(+Slp5rA<@A!s3HFJEW8_8paEGh^p%AP +F<%~LXv0Xth1WQ|lY^l}8pN9sN28*gkwP4j$whbZEf}xsrdXEKuJIUKLGT3sJhXF>--HkA6-VYKC{1sSvfn@>YOtNsXG4WnkLx6hc +P-l+~$d%kD;mHVI)&5Xt)kRD8QlbLf}{7ER`S=ol*HI@rCJl?Iei-blResxVV&jGasp0v*LXdEeneEI +_D+rFB}5DlSsVtzvqb%CMrg*my=*_+n8~xE+dn=Y=`uD?$TT8#7U=>331eh*5`Ct|_%_tg5lO>*N>eJ +GZu5YGaGkhBoH98fT_nm1gS=)H^DyBzF9t`w9aF6Yz*d!Sk02+;;$oPwZbXWWzTc+;H(r)KJ&c +rjvfD%8ke{QxFH|Q(_m~MGB+J&=-K7BmqUf0b5v&B=Y*DY-Yw(A7^Q(1Y~XefGJoE*&e5x*Je{Rg%YdV5$;r=$}qQ4d>^T7^dkTGr&SsTmsYdU)YV8lhk +frs6v#-*M#PaXI@Hk)*e(0$u!p08rVFtlBM99oxO@}Ea4Y5vh*QHg9v9-XL3O1YsJfzp*fR<|C@rvdc +Q+}N@Gm0Rd|=Cx+;UNh^1uXLF%r&*{yfe(E{4ZlVWCjgUD%~eBRv +509V9Ha@ZJ4tXF9L+*-_mYwWH^|D7?>nyra4E4*c>TRK{I?lYm0WnKiK1Itjbco+Ziq20r9@DiR_c_; +q-vQgn?Lg)!4;Lj7A%UybZOGJneE^X^<3ToMh^YfnyoIi&92=`Ah|TolbITAP<4=AihjyVOUzhiebwK@Nm_xtZV^fVZEMfqJ@LzctZ~ZtgwVkYMjYsYL8T`kOULSxnNHZPJ+UBty- +ps*NsoXJc?)OCATOZ)o#dLQ{Yd?m6*RjyQKNf@i`7%N-sf-|C^NIs1bi2giu?8*Yn}{GR+|!913L=Fz +Tt9R-va1Huu1n)F_uot6(KrRG5wroYjJDTV=&UTQEMRGIGb5nguW}u6IZlM29!3K-#Z0y;3t?C9d +pxH^I*0Xdc|GaEXuH=@GqO@OuM7Q3p%>t~Z_aM~zu6$qr)ZB`JI1Pp|py50x#|X*E}4wN9i`i`Cl2=O +#FRx^!J*Oa=gZ~V%@z<$__hq%(#r^qlKGJY^B-C;Wg<=7FS2X}!A*P{$ +UnSog#Y!g_N}eA1lad3+gg-ahW(%xR^liYY2->ieo@pi4@BD;p+6{!n_gss#Q}J^I-rb +XpT!Y=bR=?x%7h2T?PxK0SV0Na0~j6h|#(Kxo}oObMw~DXmg)0lQ57s+2-h38;w>w!??3tBXsS+_6H`Q>dX+er=+0^vk%6P)pcE;gW +_kWt^t8O>|}#!R(f!4C`^lPfZAa<}xRk|DuN`kVLK$rSbUK2$ROMTbZQ=@AQ7z&Zu!aqF+4e#3qF7mV +#LXyHbxGV6Go{VN8zvoq1Auj>_vo#~pSBiTChUCu6~MkxFL?_C3B<(@XWPl~j`}!F3WOy(qY2J*o3og +6krf1r+IB@sCEw)K0AImcZ4I#)8)_EC>{6cU;O1S$fqpip0(qj(nz}9!%>-oeBgTgmE%k#If@K+3gXg +9N8(F4-2xJxqLg}@lps5$ds|k)?Dk1YIFBQxZ12sJA`rLqUK(`?!zJiUrm@nFQ+|INm$b! +#>aJE*d$Ze}^*2vK@JrmW1EQYSpviGs8*wTS3WIz5E|L&)xmGKr^gR)jT`SH+ +l}+C=MN878Zl72t4!a`^nx733)Vw9;+;c6u_oI4U|WMX2byzTnnS-xv2mGkaO?ix+Che>ZRC??8yBZ1l}Q|vb=&sXzagXRfqGf(H(% +T$cfXBEInepAY@hkLSk?b70-zB-Tde$}*Ij~5FM%5!}+t?Lha&3sX=W~@K7R_bY8j+f{l%e75zm&rt0 +_0fx)Wdp`(#$Ks_?Pn7y-k;EB9%USxoq|2l0Wp8JJ32G_XZjS}a2I5NfnieO-Ry|`M;t^uqT29}#Z6J +%JL2ZiQ%cUGoy#_pXvV8=kLIqzJbgTF9_?7DLfoy`VyvghWU)(|n>$F2M2XufV%O{@(2)_Yt~|b;)R- +{FN!B~!X2x_Li7<@Zyz>nl(=s(YhoIW0Np+k$`Mb-VG#hDad~c0o)~k4Y~*5je5T +UAE5R$ja~3>WVTA;hoB{3*?>J!*}K&IoP_o+!0kD0u44lUbUg3m+=HPAIgSrrju~l>!&b6bN5fI$OSlr`#AAWZ@vnRPeHa&?KP2JxZH{6;WW(>Z# +I=G^?MiKn)KJG;Mbu^|D(A$ilMONEd0i*9|28_JH4q6!8(Gau-c347LVr}m0*@Ly-S2l?vV|% +NZAQA=+#eS)+mKj?#t%HRvm93z#o4ytJjVi~gvkkx4yt`&xw!~ADM}((3u`Mx8U +#W1}=(k4J?uD_7w%V3}tsWb{1y`S$eD0g+aI<;A^xXKU9aq`Jzw~y|^LE|t<5xnZ1X54rpK0ImVsrTz +5HG@0jh6U1Q?HfGwU0fP +A<1BOC&yW6uuw2-nAAz*;*@Ebf#5YM_d?TpVqan(}{(#-ZFUVZ{TmTPpa_Px+`&J%m73bj-=5Z!LV)& +CMlJnJzL1zg3Vv4ijshsEY^hnD2`mGFe6UI|7R3PdFA&SrX%2f!K^w?Ab$im0A3fS*WH83x2RVXF2)W +LqoUfSq`=ilMh5f}IGAYo46xzx0q9ooY&K?I7GbjSEq|#V(J56#2lAIm%pa<0T{R`5bIhY@oJYQ^PXrpMggOT* +gVEKed5o*RoIFs6W1Z3~c7e4|`E+TFp$;sXg=xJs%wqI$(TW_jDSdrfH5{efH5MBfY;2HfT?<(HuQ+g +I_yj4m6vF3lAckrUYIiND`jK2%Hfe6dSzK001ASHp!s<@2*Q(3r+$n-+YK0MY3ctvVPm)xL0#C`LkEG +T4V{6?e1_V0`)L81hsq%&-YJob6j}C?a5c(j~IIf|MrQB6J23HX=bODwdYechMTNRVNTL&5dRB$Y(*N +&%wD!7F&Y)4fvjrNaD>sGGQ0Uqe^{Pw=d;{hSxAs~Vnma%D<#b$g3)+w9;0zKQp&qTFLhs{m*pJ(B-8LZ&VxfaUW9j;*~u-%NsE`9}nJKV3Yv=a~;$%KUtDP(7; +JiwuhVL_%u#Pb}s2>(EsUef9T-gS(O!PJbXozJ;1fK1|_dN?Mr>0s4pLAE1nGpFbHa-ssZrXW;2MHMg +0vhg2aw~qpY`xs&mwfVHfc6(Zy54lI#fj)9m=q+zT;MuBLH7-SB1O=T~3Ej|bwFwZ)ooCv?)oMBd1Uf +}oYS>enzTumpALWwV9es%Qb9#Z`EnQbs8sK(ZxoTe0>CmikqX-K@v@EVoZ_a_c1=-{9HSnHTw92oao^ +g1V&;x-B*+xH?jHkUEK6h2BgKlK$WS-X974frlaO1|=9*rZaCPwaplt;D@RWU{X;FrR0NY0}FBDL;B~ +JUu<`8^nEbR=OYocpyl(=fyT2fztI>M;}m +{tWq*XC8&5o?_!;XaLUO$!yjq?*r+oYfu9UB4f+{suN1i~e)wPsW0ObkFC^uQvfr7DKg@@1c-5!`_-=&f|Qq{p +l)CD>l0z7#5@MeZf%3bhW(dRALsFV)1UO +`uwbvhV===03d5T&G0j7As+IHTs#O7??SgGBQFMVhTc$r#1-4+cTz5X{$f2^2FbY<3;hX^zh#kBzqhu9+sk0qF73E-I+^HFrj +J)ZrBLns>D;2i|~Bz17dhl2*0Q)OyUE7W3f4t9XlhczHN(zIF^RaP_feC257v|q3J*#;5NLRf0)7V^Z +)W2sT7S{3FRuk(0aL%Yvc?)2Ll0Dttj(W=KtQ7AJ20G1XM>T&NyIE5LgX}tG%(3r_gWmP93rB*+5FLG +szucl;HqX1~pCUpr^__<2*a$}I^uIMb0OiO2g>pyl0IE$>7wvf|ho@RJbEwYL??|ACkjJ|c~W8_zAF6 +p#@TFoV?+*UOQ(63!{BDrPFk<%?|4ux>Fn-&T!azO-+Ht=!w2RAGWK*{-}V7!b8z29J1CX2k=m8^sf$ +WC%Ykw>lcx-bEzOPJdTRR2vA>D}6lwlfL-Jq#l2#*;z+?@_;OX}q(+f)M?#!$b>`NUD(%P-rl=y1KEs +5>|tX*5O&n6$3>-1Pu|4bX&*>S~c-9l6YG0K7s~CCO-qrl;y(7K&43LBw(W}O8HS8$fXu*xnn(0UGgK +kXuE#}x82#l&ci%iRJ&tL19)FAAM98%Vrtyov^xv%&;&>;t!B8Z0>u&UG+-;l9+j3<)nz8bX5q +aor1x6ML0z&zCj-j|Za6KF(tF&DgKuvzYqP3` +0};uYZ$EtH}D43k?i#~SCHNlDd+|_+&dR3YMLG2u;UorbIZaRSPD)Fqe_BbBxp7c3Q2#O99~=;Pu#=H +%keK~cuCr20k61h0RMRL?(phZfmRME*Bk0|X=Tl;jhXSUdPj!lymChd{%vtZ3jWPvXn?5Jt2JE~kd_K +fS}xzPYo_E{LQ~fY9%&1>OPz9${_eQCea(dQA9?GbLs`)LNkHNbUXyd>DpTJ+!NT=A$Wi +~Bhy4qqugA`8~R5NN*-ZbIEruD@|G0wlNLNB7Lr{0hon&P)kBJib${vQIQrFV;^(5Z`xmZ492jR9IH? +_@~VfvPPo>V8Od&n9i1q^a=~FLJu1X)vOMqM4QIjjX +AMCzOUDNc=+I{Dq_N}7#5Dw$LHKE1}FT?Jir^Yqdjp89ylPMiccjDgqdK%w-!g@>$hTSwG~%tJ#D%*9 ++561HP85d4`W!^^@IU08vddAKjHSs$AB)?l%Yjmv0CfISNmO +NAJE+i^4kw+;Suxu5CbODUh$F7xfWkkDH`QFPxIx^E;2mL&ozxemQo{>4 +wGdh-r#u6_Fc>X+n{#wUTi`F +eIYWz<0tSsFlR#bFkUk2K=THJ_ZE*9u#r@2@_is2XHzH1I?$ +(0ob0hozpH{07C>jd=U#*ZLhB=3E+Lnsyfi45$@SwGAj0X7P%Q^zhd5F^K~|XwOPfhJxHW@rd0VY$dMPMXE@qcf3`Z;#0B2 +FO0lfEBL47vO>h}Mp8R}ngihvuf7SZ&7?r0ovZxKc8k{Ay_Q|l`)ePI8a6kujvo=STzO36ksJQzBt8k +*fo41#|}%%g#dc0Mp^M63qM!aoq9x19PO-2?PSUtnaY01J9gA$yRL*CA4L-}+IE$F62lU0;lceVQwh) +D`P$ti~GyU?|43ggAQ~&($?jeB%_lpB3IMm9KP?`UaJVP_S=-!=Nv=uc)eh-={`@yoU_Og?RrUsun)K +{{9tV5HcZ|Z^!V0CBB?W?EmnC_<17f{8;~xCLge7IAN-G9Dty7P>#33L6}(&!F8TvE=zP%=_RuTZ8xC +XAq>-sH}Nx?Au5IctCs}y@xU{oJ{AK@1PcXM-EdhW2K7NiA4kfyU`1OcG2ky#N410(0j&iFp%D!nfDl +bY@MpgK61)T`XZ?~aDAt)}aI?rPf?%$5s1uLqXu~1O2ucA4!DZc(U4wm+x +fWf*5OsC7kh5E?iAB#8S8ErmS*-Tc6v1nTAzdhM5ra$#sQekCmK3>HKbX&f$tbfuq4IiV$3@+XMjjex +LZ=!xUDH)|S`;Pek1+XK%)(BJDYyD3g{3C^9F&KU#flki!Y$MQwCFu=@fhLgoMdHRLP|cSB3Xf_A2_{ +Ifexv*KQJGV4txItP)h>@6aWAK2ms3fSz7=A0006200000001%o003}la4%nWWo~3|axZmqY;0*_GcR +yqV{2h&WpgiLVPk7>Z*p{VFJE72ZfSI1UoLQY0{~D<0|XQR000O8%K%wh-ne74NCE%=i3I=vG5`PoaA +|NaUv_0~WN&gWb#iQMX<{=kaA9L>VP|D?FJfV1YjAIJbaO9lVQXb(X>4UKaCvorV1tSo`RSW7<^*iE9u$E#Lb3X(i8ltAR+&lmiHp5o8+02l +R2?vs}Q^*Vg16tX93IPUk`xAF2_x4z1;yTOVqJSsg9_ +`$pE&UU!xkoW>o&3h?7U!gxjk|`zRRJ!1z +K__OC}TwR5wLgYx{PUF$h1a#=A^fZVRXv{QwK-cKI5~_6K$k7AToyM45Bx_izJKuaal(b-lEeyOv05% +UDi)Q-cQC_VWl15U8>Sg1#k`Sx{vjap#o+j2^a8oT+C(udA|5`|K)CddB0f9Z`QZV@AFeYQ49%jG=i1 +K?eRfqMZjPQ+E_yy4Na?UHbwx=j=rI3m2kE^y8-)tmZvrca5%meI)wtL)NF~amoiTmapPsVP|D?FJfV1Y +jAIJbaO9vWnpV_WoBPyX>MU`X?kTYaCy~OTW{Mo6n@vQARGjf14qEHmmyt-w!;b(D28Du(1##UXo<2} +OQb>&8gh$^q +7;&8QN%A_9Gq)A&&(3YNVn4Bmhrpdh?uQ4~2-qz%Qd1e-usp9?*BX)MOg1Qm@wL@;>qPGVPm- +`MoiI-8+QtRjSuZ2#i2~p?N%EZ6H3+?BcZ*{y7WYY#6g9V&9dD(2{ZSNdd6O{s0m|QqtkQ-B67D3Jr> +n@y*R^1t%M#OA)QVNDDpu@@n~jCX)$V|AOTY+5E6X@504K?ae1@cWiR`eI#g-jpU9+_yT2aEHP)NX}W +gBkRd;?n=whAZ8jJ@BA0K{0woNNRIrk9UwL6US#Jo38bPFRAPBGM6162w*614cQ8ug`6Y-)j^`6zK^YSy|h2H5*bl^K$}p?-sp|t4HHiiGK#AXh#M{yviBN%M7(ocFc)k97I-)#*N{J +m!kJd|-ZQOYQh~Tf5CAbVB|wEh7DiA|J&@NOV6QkB7$pWdSxkw9UM|?1-rf*?R%-QwV_W_x2)K110W| +fxDi1JxudlZ3vSs?bf8PKTI*fAXZc%I>0Y>0!TB3$o#{xFv_Xte7K#Ytz#Wox;Buw3L% +a7JiULq@tc>fTD{8QX`10J=+F2@-)Wed40bNe^;t>Nh@YnZDBtD`-KtO +_z=>~=dHt;ds@KJ-U@B;k;yUh{zS7!bfv7 +qMwfD3lo5Wt{2h#B<>oN57#i +qJG}*Cmrf->)pCyBe%|dI=FN%#O{j@{U7=7yE*42%prR?)4JYO9kwj*5znOgd>3ty>D=Sz`BO>oC +$sHDYf<3;hPY|26N<=G@|!OB;uH2*u^a(+g@yzb@D%OI^1Qsg&ip;tgDXAQel$H0Tj95q-6EoQN+?_} +8nMu;TBO-WgHEG2bC}Q2PaLq?m5RqN2gh-vNh^fikco2mCa9q(wa*wl3IT-e&4YqZ`w0D_#W74Ts +e*JWYpvD0>VNc4t!)vxCUsJLY=e?Iznj{bMzSzA$ynpdxWlQeF%}j1+D51+6aV1s%M2rJKW2BZ8dVUg +^QMvn+;S<{9^Eo5W1-;aX9*{bJBTd+$Ek0v3KludVsd`zO$XpJoQ%VU3wM%&n4ZrPD=;R!mPo3=#SfB +&q3(x?)W;p$B!t=(N_+-xQ-hVev%VUqG%oZzHALXVh8)erE>JCVOGA7rlSI%djrba?}9)71yD-^1QY- +O00;of09jk+ikX_&0RRAl1ONae0001RX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlaUtei%X>?y-E^v8mlfi +D=Fbsz8ehMMGY=F@>=poBIG-!|*c6!)}P;9ypVp|#|C+pi!jzvdl>XZ2W6eazn8`7NsXa+YB0tnR^O- +{&z)$QOArZ`EyiQk&UK~|@Wq}qx~cSbsOP_1$wsW7C^s>ZP03U`!F3>ItQv^bzRBH>fgjE6l{y6>@aO +80!4vT%b?lQstHkWKh^KvxT*z- +(>E7W#H^tIgBnOS^-;oTdK5+je-JTJuQS}bldpzFy><#d4PQnN-Bn?rjWZ{dZM!z2NaZR=<7Ias|2zA +mOmEMjLP_Q_jTZeB8p{bqLGPNvrp;2@a7p?^FtAKSx9>>sl)r#uqpp=8Dmb3FUZARcyR52Nu}h=zlus +B1I2pBTn>9ejY-KFhh +K2*A-pM^HM8k#4_C~SY30q7K#^K?S#=P9pqn1UOSezBCy+Sy{`T%DIv +aOLt}=JThIo%99hiIbu`(66t5g^>-x^eev0OyMSCG7Fu7-~1>^09#o`l_mM<3Iv==7 +1^S&feutEFfz&FFo7VT1NaE2+1KA?%R1w0Oo%?Dv3bifB#bH|)BKDtvF)9QE%UiHME!wCALXr*60pMh +ELQWvi1h`)6#>Ord@sgE7{PZ(%pA|SI(xdCQj*#bpeisd9f7EVd_YtFQNqApHAK$6)~V!Zbofnqn@aM +*H27e-pwKistJ`|3AYv8ePDg5VC4ihu>1y0t4jhEEIWOw;+^<$ +5ZPzc +CSj{9@`5G9+=e;WfSW`k(9*Y|8pLRE3x!G}JQA{Olsqt@Ak5>Qm@SN(@w$|}2RGM3L=@8*N9_}X +hnG~+gJxi3B4kW!E{+SOUnrFDR(}0SYrWmE-=g*Hn-hM8Ay8Cqd@_Am&?|;2}e3?&UK{Tf1MZEuk5IX +HDrH@10n9Nc&MFf+ZSMlI~E%-(X=%Y5k4IXHtRI`)|> +?p1b`Yy@^QSQF)?R+RHIL#@W4an{52Yc+yj&SN17)VjmhZ_!sXUbr!TtsFkMPWuwT3VlN5d`whn{hP>Tt^9p1wRr`C-2-wTCsq8e=fAWp!S64h6i%PNapbfkzL0f_OkC`23q}(uJc +|qaKx^4P7owTxMeEE&NoPuOaE`ds{r6@R!Vby9qhHtzzlWE9Yk`%2b@EV%W6!aC7@^S$6X$-+M9eaNK +_|M{b{@dN{uLtm9t8l=zHTKflXs4%8GKC>W_P{-cF+_dcg*avmOdCY<;84^YKC&~aqEG4Pf{GhAcA_F +Kp^}a@D)|m$6&X8KWx|D8=L0bXUMz+rAG`c;@kl$htVmPHCrT&fU+XeMmy_GMr#LSri=UHYHADLPiX7 +skY{A^GigaG=)&Fl()B|FYBQ8#p)% +!C!E2`Bvv&RhsKjt-z34y7D!m@P!TyYURyhwa?kFwUGvVzIBQ=s+l +<{OG~dFK^=fh}I$?c)Sm_$fb4$W7n146gu{df)X{y;Su}A7vch3*m-dg +Tw9HJ@si{= +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 +K63Rof6VS{LnC$Vt8@9i;Eb1uMF +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 +2w+s5EA~TL9=Gvy}(7u$0ABqO)s|Tu +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 +q*G|Q&4->L7aQJ!lr|fv-Z?z< +H##A;_(v_Y=%$$R!%=y|*duu=3YE`v>9ozr$Q*cR1+Bhn7z{5X{bgM?wYf)Jl^zG19Aed)%2>9{7-Do +H7rtOJJmTn1aC$!hdrBFUsP9Qk5b){U|>}I>;7C_?>3|mQ-gsn~pcKxZ3&jQL=V%RvGehS!npJJ=Kp5 +fESVCKXl{|EG~WPF87juoAV&uY4k-lg% +U&PV09`iXW{GNp1UMzTLQZX1ov1X+l9_dRLOK3y!EIyD)3c2G{0>h%Pr$Sfe2o +wP;}gHXFh!I4>U%y5IL40j1y`y@~vVtjmW>KB1Y>Q%dM5^wkZBKJKNAJI2^r0_3XZng~-U7tp>wFoWc +ne~*Ntr6E{?Y9Skx^OKW4pSrb9+aIJ0{#?x!svI3=?MZGFd8Ob^y8h+z{hL>Garusf!=c)H)F&?qs!= +F#ialL$rzjO731_SqDqoDca7U5O7oril!zq|tH}Ez}9aUm3t56sNJNOP0b>9=+Z)cq=2L7WM?Ikfc|H +fTvcW;-Ax#$_iTvX1=s+=$(Ja(^EBlp=NF2b(jqBw}^>DaGvO~^!DOI@VN$A4s>p0=4Is|ZyFz9RS5$ +}Q65PVet0sQAqglZV@}0pASKaTcBapTZQ$L33~9AH@l-l*_sFy^LWax(LweejBq`&iih$D81V6u`_O7&92vC>2B=69&bLISW +C#~Ma>>x{}nHCuAZcKwbT6#wCu;?$RUBVw?Y&)WTN-kH962GUxj3?1$!8R`1KJ~VQIeccj3BglY +fyeyO9oExZ%sd)t3@Z@V!pqUKXNz^y2V^r+gRcV8*KA+Jmew4NvW|n9v--iz(u_xrt+d#n>IN#R>w2? +oS?Eef>=0pCly$yh2XXrAAyK$fDpd(5;jSrdrnK9~4`}X-5gRHku;*)H6)&_vW3@A^}F5c*>dF3lexI +3vR2)_H|~d^}c2q{1?AlR&nk4@UD +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 +mC9_x09X39}cX!Q-St~7h` +%X?g`YINU9L4XDhq1q9L5Lr>xA%+EVs<8&Ns$*~AM;8R4m>Nq%lK7NOa>%Bv`)aW9R&KWJ`MVDc^ahc +Ve(F7MZO{Z4{LO!3djSzswBcZ8=#4C+cFx`k!k +>nJHa)S)BE9`7LZf9(?9L7XWci(f^=_Ze65B#{?z +p6qUzEJpB4TVX54XtBHe~`YvIB~%gF#c;9igD6qSoepX}9ru&kuTt&!`BlAh((Y)iP-s`n-ai$4$Rvq8lA^9_(5c +KIy(1FgXQ_6i2EbkSisU2FhUPEN!9FuL46eMKWf*YTs+ap+2eo^bfg$27mJw|^*Xb7c6F$)N_~6fDpU +V+UPRWY*ZIO%2Dk1v@Fgo~>wNj?%Uo!!+_&@j5ed@T$^G~iHsgQCJFOp{+)1xtEB!w@RU6)!i2WfGSP +h{CoQ5KyolBoz>QKL5c1}n5#j5hMo1e2wHVfMbN05XpxqPu`AR#XnS+XEe=+rAx#rV0EGdy>_%>~E+P +P7LoP8b954ra*E+NzW5ta|39~td +nJC=B{`?ryqShfKeukw9@F6qgDj7qSM+|}gJ>QD*qs@nW=nxDO>1;0_+h_(->MkGR*PHavCAS~u7q#rQC3mmjSF4P(tdp#6Lh1I$})>E~~6e2u+g@CHD?se>JBnD +%WC8mNINV8w@G0k)e46>5U#aYwuL?=t9ff|@Vl{T2=A>LueRtf+A5S^mhi{!`3%;zC2;EbT8kXC4UY_ +;$maAVJe{XRYw$x#k;6OcNaq(TKHoEaWW?3_HoM&p>K)UtsP)0AT7@VByaj$}6~HqvVvFi74oSmF)p2 +zybYB)GQ|du`aRhm3YU-i^zfsOAj{P1g>w(R7EDMcQUX7*^S_ADi8Q^@#B-65{J+v}(W9Gy=Q?&s||i +aMD>(CS;tF4udbcnREX6k+i494QTk`mfaMi!yXofSbAo=Nav?eV1P_fbLB-t2N(-P6wJu%ZluCvKRdP +g$o<&O0~)bf@!yy?PFLPTB6UrT?<8FMD2ZW=)CCD$EFIU&p+vVuCuPELJ`U)iZs +_Bl%S{HBOZQ~Cj0#cwv~Ylhy}`5BeN#r0aQyf=q$OZe)3n~g4m(rx8;)~CD4l(YY^536`#>jTL$6d?7 +`?}XiqmR}laGVcT~wv|LHbZc4f!s45j;;HWrod=5Br&!Mn`#@0wQF3vKcy$9Xn03K)R +0+tBhfLR5%@HPmj~5j772#Y96rHSNWWi2bF+j(ZP{9+u75a8w)aI+D3)Q1WL*`6`uPu)kqv+FTj +*8zP@qLbPnNwI`Ud82Y%7 +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 +GXe908`507c(LpGQ<67&{Q2!~+Tx4?!KCKx& +wp|nbk{1&G$p3xmw4rh45iK`+M&zT$74Ta<+#Ur#RI||cc9$`&WsZD2N6X$9Xrz|wc9qn7`3(oz77WQ +pa4J*Us7Z*yNd^P!(8;cbMAL3wkG~0YN@c4D&tRwHv#Z4s41It^F!4o4qrMV@I8c!$6klvB?XgWy8oP +Nn8-{$`duE!;5xsQt(7hcSE#g-pGXsRjCLdoh}8g$&tm38UqL{FDC*HxaIsSIVl2+szv^{KFyj-F@ab +p=krB2Z)bio05>`DXA=iL%2pJm(b04wsz`SMy%+V+XkZ#H&ZqBrD{6LJBe_86aQyb)(H1UGT(Gxd=TU +()>DM;s$c2OeaqP4GXJ;lV`cFOyh^?S0T?2K?nD~dVLy8w`&^M2SDZhJpVKh +o@}BDJndUQ{PPw|o?#-m3!yD|Whhh>RXKd61?y-E^v8JO928D0~7!N00;of09jja_pjHy0RRA20{{RI000000 +00000001_fh7R|0B~t=FJE76VQFq(UoLQYP)h*<6ay3h000O8%K%whB^=tD)dBzjss#W56#xJL00000 +00000q=60t003}la4%n9aA|NYa&>NQWpZC%E^v8JO928D0~7!N00;of09jkj$G|nf0000U0RR9D0000 +0000000001_fffb;0B~t=FK~G-ba`-PWKc^10u%!j000080LuVbTMcdTY&Zb`0RI6102u%P00000000 +000PTSQ2LJ$YX>c!JX>N37a&BR4FJE72ZfSI1UoLQYP)h*<6ay3h000O8%K%whgjc!iDG&evc{cz68U +O$Q0000000000q=9b;003}la4%nJZggdGZeeUMVs&Y3WM5@&b}n#vP)h*<6ay3h000O8%K%wh#Uk5%2 +MhoJX(#{y761SM0000000000q=C>F003}la4%nJZggdGZeeUMV_{=xWiD`eP)h*<6ay3h000O8%K%wh +@S@g#N)Z46=r{lX9smFU0000000000q=5@1003}la4%nJZggdGZeeUMV{dL|X=inEVRUJ4ZZ2?nP)h* +<6ay3h000O8%K%whP|GebiXi|1m~#LC8vpc!JX>N37a& +BR4FKuCIZZ2?nP)h*<6ay3h000O8%K%whkG}tUb_M_d%Mkzo8UO$Q0000000000q=9f*003}la4%nJZ +ggdGZeeUMaCvZYZ)#;@bS`jtP)h*<6ay3h000O8%K%whyO09K8w&sc7a;%uBme*a0000000000q=6n_ +003}la4%nJZggdGZeeUMb7gF1UvG7EWMOn=WM5-wWn*hDaCuNm0Rj{Q6aWAK2ms3fSzEm6vGX7b001& +00015U0000000000005+cduspyaA|NaUukZ1WpZv|Y%h0cWo2w%Vs&Y3WMy(LaCuNm0Rj{Q6aWAK2ms +3fSzD|mDhX%+004sk0012T0000000000005+c*L45@aA|NaUukZ1WpZv|Y%gPMX)j-2X>MtBUtcb8c~ +DCM0u%!j000080LuVbTgO#3@r?)o02v$r03!eZ00000000000HlF>b^riyX>c!JX>N37a&BR4FJo+JF +JX0bZ)0z5aBO9CX>V>WaCuNm0Rj{Q6aWAK2ms3fSzFom@aG2$000ak001EX0000000000005+cNPhqT +aA|NaUukZ1WpZv|Y%gPMX)j`7b7fy+Z*6U1Ze%WSc~DCM0u%!j000080LuVbTMa&|9YP@h05N$003QG +V00000000000HlGAiU0s`X>c!JX>N37a&BR4FJo+JFJoMd?cwb|0ZEaz0WG--dP)h*<6ay3h000O8%K%wh-O;>)6a@eP{|W#A82|tP0000000000q=9&~ +003}la4%nJZggdGZeeUMV{Bc!JX>N37a&BR4FJo+JFK}UUb7gWaaCuNm0Rj{Q6aWAK2m +s3fSzGJuA!B|8002A^001HY0000000000005+coz4INaA|NaUukZ1WpZv|Y%gPMX)kbcZ)b94b8}x}V +RCaWaCuNm0Rj{Q6aWAK2ms3fSzDNCi2n2q008GT001BW0000000000005+cThssmaA|NaUukZ1WpZv| +Y%gPMX)khRabII^ZEaz0WG--dP)h*<6ay3h000O8%K%whvI1y49ti*d!W;kq9RL6T0000000000q=Aj +%003}la4%nJZggdGZeeUMV{BbYEXCa +CuNm0Rj{Q6aWAK2ms3fSzCJ{NTMhS001T+0018V0000000000005+cbMXKGaA|NaUukZ1WpZv|Y%gPP +ZEaz0WOFZLVPj}zE^v8JO928D0~7!N00;of09jl7duma@0ssKS2mk;d00000000000001_f!O*00B~t +=FJEbHbY*gGVQepBZ*6U1Ze(*WV`yb#Yc6nkP)h*<6ay3h000O8%K%wh2-05in*{&>vJn6PBme*a000 +0000000q=D7_003}la4%nJZggdGZeeUMV{dJ3VQyq|FJo_QaBO9CX>V>WaCuNm0Rj{Q6aWAK2ms3fSz +Bi86XIeE004O>001Wd0000000000005+cvI7ACaA|NaUukZ1WpZv|Y%gPPZEaz0WOFZLZ*FF3XLWL6b +ZKvHE^v8JO928D0~7!N00;of09jikZx9Ik2mk<;8UO$v00000000000001_fmsg$0B~t=FJEbHbY*gG +VQepBZ*6U1Ze(*WWMyJ?XD)DgP)h*<6ay3h000O8%K%whWDMTSumu1B(-QyyA^-pY0000000000q=At +b0RV7ma4%nJZggdGZeeUMV{dJ3VQyq|FJy0bZftL1WG--dP)h*<6ay3h000O8%K%wh{#IW~@B;t<8w> +ydAOHXW0000000000q=A7R0RV7ma4%nJZggdGZeeUMV{dJ3VQyq|FJ^LOWqM^UaCuNm0Rj{Q6aWAK2m +s3fSz9b^5>VO#0055$0015U0000000000005+cuOa~eaA|NaUukZ1WpZv|Y%gPPZEaz0WOFZQVRL9Ma +CuNm0Rj{Q6aWAK2ms3fSzEL~pz+`V002}30015U0000000000005+c#U%j%aA|NaUukZ1WpZv|Y%gPP +ZEaz0WOFZQWo&RRaCuNm0Rj{Q6aWAK2ms3fSzD@O%Ud@F004Uw0018V0000000000005+c;U@tAaA|N +aUukZ1WpZv|Y%gPPZEaz0WOFZRZe(S6E^v8JO928D0~7!N00;of09jk3koovT1ONbO3;+Nj00000000 +000001_fmJR60B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WX>N0HWn*+MaCuNm0Rj{Q6aWAK2ms3fSzA?UNT +#bE000Pg001EX0000000000005+c*fIeCaA|NaUukZ1WpZv|Y%gPPZEaz0WOFZRZgX^DY-}!Yc~DCM0 +u%!j000080LuVbTWK>c!JX>N37a&BR4FJo_QZDDR? +b1!UZb963nc~DCM0u%!j000080LuVbTbR62h2jPP0HqcH03HAU00000000000HlF>UjYDcX>c!JX>N3 +7a&BR4FJo_QZDDR?b1!UfV{0yOc~DCM0u%!j000080LuVbTXpFM(rO0)0G1X203ZMW00000000000Hl +GKW&r?jX>c!JX>N37a&BR4FJo_QZDDR?b1!pcVRB<=E^v8JO928D0~7!N00;of09jj52c?+22><|s9{ +>Oz00000000000001_fk18n0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*Wb7*gOE^v8JO928D0~7!N00;of0 +9jiw&KKa_1ONaW4*&oo00000000000001_fjD>p0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*Wb#7^Hb97;B +Y%XwlP)h*<6ay3h000O8%K%whIZn|;+6DjseHQ=#9{>OV0000000000q=8m_0RV7ma4%nJZggdGZeeU +MV{dJ3VQyq|FL!8VWo#~Rc~DCM0u%!j000080LuVbThnz7E;|7L09pe804D$d00000000000HlF!gaH +6>X>c!JX>N37a&BR4FJx(RbaH88b#!TOZgVeRUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzD&7p8M4T00 +1Tj001KZ0000000000005+c?S%mVaA|NaUukZ1WpZv|Y%gSKb98cPVs&(BZ*FrhVqtS-E^v8JO928D0 +~7!N00;of09jl1K{v9T0RRA@0{{Rh00000000000001_fdh#F0B~t=FJEbHbY*gGVQepCX>)XPX<~JB +X>V?GFKKRbbYX04Wn?aJc~DCM0u%!j000080LuVbTV1H44yOhH0OJ_|03-ka00000000000HlHCiU9y +{X>c!JX>N37a&BR4FJx(RbaH88b#!TOZgVelWNCABE^v8JO928D0~7!N00;of09jjltDV9+0ssJ11po +jf00000000000001_fzFWu0B~t=FJEbHbY*gGVQepCX>)XPX<~JBX>V?GFL!8VWo#~Rc~DCM0u%!j00 +0080LuVbTX2Jdbsqo#0384T03QGV00000000000HlFRlmP&6X>c!JX>N37a&BR4FKKRMWq2=NUukY>b +YEXCaCuNm0Rj{Q6aWAK2ms3fSz8-dbR&5a0022Z001BW0000000000005+crj!8yaA|NaUukZ1WpZv| +Y%ghUWMz0SV{dG1Wn*-2axQRrP)h*<6ay3h000O8%K%whJUcH~wIl!lvzGt>B>(^b0000000000q=8+ +i0RV7ma4%nJZggdGZeeUMX>Md?crS2aV{2h&WnX4#Ze(S0E^v8JO928D0~7!N00;of09jk#z}3a-2LJ +%SApig#00000000000001_fmO``0B~t=FJEbHbY*gGVQepHZe(S6FLQ5oa${w4E^v8JO928D0~7!N00 +;of09jj}_uI$r5C8yaHvj-500000000000001_fqT^f0B~t=FJEbHbY*gGVQepKZ)0I}X>V?GFJE72Z +fSI1UoLQYP)h*<6ay3h000O8%K%wh@MJ@%-3R~xR~G;PB>(^b0000000000q=BmD0RV7ma4%nJZggdG +ZeeUMY;R*>bZKvHb1z?HX>)XSbZKmJE^v8JO928D0~7!N00;of09jjtrH&%w2><{j9smF(000000000 +00001_fy(az0B~t=FJEbHbY*gGVQepKZ)0I}X>V?GFJE(cb7OCAW@%?GaCuNm0Rj{Q6aWAK2ms3fSz8 +W~Ai#J8008z00018V0000000000005+c@c97%aA|NaUukZ1WpZv|Y%gqYV_|e@Z*FrhVqtS-E^v8JO9 +28D0~7!N00;of09jk1nmd{v2LJ%T761Su00000000000001_fu;Td0B~t=FJEbHbY*gGVQepLWprU=V +RT_HUtei%X>?y-E^v8JO928D0~7!N00;of09jk|a&Ce80{{S*3IG5f00000000000001_fdd8t0B~t= +FJEbHbY*gGVQepLWprU=VRT_HUutu2ZZ2?nP)h*<6ay3h000O8%K%whwVq`iB^m$#Ok)559smFU0000 +000000q=7mL0swGna4%nJZggdGZeeUMZDn*}WMOn+FJfVHWiD`eP)h*<6ay3h000O8%K%whnQSPd&kF +zmFev~4CjbBd0000000000q=B0x0swGna4%nJZggdGZeeUMZDn*}WMOn+FK}yTUvg!0Z*_8GWpgfYc~ +DCM0u%!j000080LuVbTX{ifu3-QG0EYko04x9i00000000000HlGhFaiK@X>c!JX>N37a&BR4FKuOXV +Ps)+VJ~TIaBp&SY-wUIUtei%X>?y-E^v8JO928D0~7!N00;of09jjpU#A6o1ONc^3IG5r0000000000 +0001_fm$&F0B~t=FJEbHbY*gGVQepLWprU=VRT_HX>D+Ca&&BIVlQ7~Z*6d4bS`jtP)h*<6ay3h000O +8%K%who`0Lp5DEYQ<{{{d6)f4~#DF6Tf0000000000q=9xo0swGna4 +%nJZggdGZeeUMZDn*}WMOn+FKKOXZ*p{OX<{#5Wo~wJE^v8JO928D0~7!N00;of09jj~Qj4QH0000!0 +000W00000000000001_fxJfo0B~t=FJEbHbY*gGVQepLZ)9a`b1z?CX>MtBUtcb8c~DCM0u%!j00008 +0LuVbTg%^TJ4XQk0Pz9<03iSX00000000000HlF5NCE(GX>c!JX>N37a&BR4FKusRWo&aVV_|M&X=Gt +^WiD`eP)h*<6ay3h000O8%K%whn~;%qlm`F+n;8HAA^-pY0000000000q=C9g0swGna4%nJZggdGZee +UMZEs{{Y;!MUX>w&_bYFFHY%XwlP)h*<6ay3h000O8%K%wh|0GbUQUd@0rwIT6CIA2c0000000000q= +Al60swGna4%nJZggdGZeeUMZEs{{Y;!MWZ*py6bYEj{Zgg^QY%XwlP)h*<6ay3h000O8%K%wh-MySaCuNm0Rj{Q6aWAK2ms3fSzFdSe=5`k002W60015U0000000 +000005+c$8`b#aA|NaUukZ1WpZv|Y%gtZWMyn~FK~HmZ)0mNaCuNm0Rj{Q6aWAK2ms3fSzF)amiI~l0 +02J%0015U0000000000005+c*Lwm0aA|NaUukZ1WpZv|Y%gtZWMyn~FLPsPWo>0HaCuNm0Rj{Q6aWAK +2ms3fSz8L>y3AMx005g2001Na0000000000005+cU3~%oaA|NaUukZ1WpZv|Y%gtZWMyn~FLPyKa${& +;b7OCCWiD`eP)h*<6ay3h000O8%K%wh=H8j>3j+WE;0FKzCjbBd0000000000q=EN?0swGna4%nJZgg +dGZeeUMZEs{{Y;!MjWo%_*bZKvHUvP3|W^*oZc~DCM0u%!j000080LuVbTPB)h_Z|fR0Fw{^03`qb00 +000000000HlFOhXMd_X>c!JX>N37a&BR4FKusRWo&aVbYXI5WprO~d30!RZZ2?nP)h*<6ay3h000O8% +K%whly^$V+5-RpXbS)U9RL6T0000000000q=Bf60swGna4%nJZggdGZeeUMZEs{{Y;!MnXk}$=E^v8J +O928D0~7!N00;of09jjO5aR(c0000n0000X00000000000001_fxVCd0B~t=FJEbHbY*gGVQepMWpsC +Ma%(SNUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzDdJmTb!v007BQ0012T0000000000005+cEs+8MaA| +NaUukZ1WpZv|Y%gwQba!uZYcFASbZ9Pcc~DCM0u%!j000080LuVbTY+Npkb(vP0R9pH03HAU0000000 +0000HlF4rvdc!JX>N37a&BR4FK%UYcW-iQFJob2Xk{*Nc~DCM0u%!j000080LuVbTX&CK@Iem%0 +E#gH03iSX00000000000HlHOtpWgWX>c!JX>N37a&BR4FK%UYcW-iQFJy0bZftL1WG--dP)h*<6ay3h +000O8%K%whQy)_w-3b5y-W>n{BLDyZ0000000000q=9k00swGna4%nJZggdGZeeUMZe?_LZ*prdY+-t +NUw3F_Wo#~Rc~DCM0u%!j000080LuVbTl=Ch;~N+N0Q5=#03ZMW00000000000HlGB#{vLwX>c!JX>N +37a&BR4FK%UYcW-iQFLPycb7^mGE^v8JO928D0~7!N00;of09jjVsPjnB1pom14*&oj000000000000 +01_f#}}?0B~t=FJEbHbY*gGVQepMWpsCMa%(SjbZKmJE^v8JO928D0~7!N00;of09jkpymbr70ssIe2 +LJ#c00000000000001_f%N490B~t=FJEbHbY*gGVQepMWpsCMa%(SmZESLIV=i!cP)h*<6ay3h000O8 +%K%wh000000ssI200000Bme*a0000000000q=EYA0swGna4%nJZggdGZeeUMZ*XODVRUJ4ZgVeRUukY +>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzC(}invJ!000IT001EX0000000000005+cKIsAgaA|NaUukZ1WpZ +v|Y%gzcWpZJ3X>V?GFJowBV{0yOc~DCM0u%!j000080LuVbTjw_%Eolk>0DdL_03rYY00000000000H +lG&@B#pEX>c!JX>N37a&BR4FK=*Va$$67Z*FrhW^!d^dSxzfc~DCM0u%!j000080LuVbTa4r$p_Lr~0 +P=7E03!eZ00000000000HlF$`vL%PX>c!JX>N37a&BR4FK=*Va$$67Z*FrhaB^jEVRB_IaCuNm0Rj{Q +6aWAK2ms3fSz7=A0006200000001fg0000000000005+cMHvGCaA|NaUukZ1WpZv|Y%gzcWpZJ3X>V? +GFJg6RY-BHAUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzD`a?XZpp005&B001ul0000000000005+cj~N +31aA|NaUukZ1WpZv|Y%gzcWpZJ3X>V?GFJg6RY-BHDb!lv5UvzR|V{2t{E^v8JO928D0~7!N00;of09 +jks1zWLQ0ssJw1pojl00000000000001_fodQF0B~t=FJEbHbY*gGVQepNaAk5~bZKvHb1!0bX>4RKZ +Dn*}WMOn+E^v8JO928D0~7!N00;of09jj`2F-DM0ssKz1poju00000000000001_fe#}C0B~t=FJEbH +bY*gGVQepNaAk5~bZKvHb1!0bX>4RKZDn*}WMOn+Uu9%zbYWs_WiD`eP)h*<6ay3h000O8%K%wh@IZ? +F@c{q;a0CDVCjbBd0000000000q=DNd0|0Poa4%nJZggdGZeeUMZ*XODVRUJ4ZgVeUb!lv5FL!8VWo# +~Rc~DCM0u%!j000080LuVbTb_oUv_t{`0LBFX05AXm00000000000HlEtC<6d+X>c!JX>N37a&BR4FK +=*Va$$67Z*FrhVs&Y3WG{DUWo2w%Wn^h|VPb4$E^v8JO928D0~7!N00;of09jkj5U=_)0000o0000i0 +0000000000001_fukw|0B~t=FJEbHbY*gGVQepNaAk5~bZKvHb1!Lbb97;BY%gD5X>MtBUtcb8c~DCM +0u%!j000080LuVbTb8bJ0=ppq05oj?04V?f00000000000HlE-D+2&c!JX>N37a&BR4FK=*Va$$6 +7Z*FrhX>N0LVQg$KcW7m0Y%XwlP)h*<6ay3h000O8%K%wh&&ODO=mP)%;R^r&9RL6T0000000000q=6 +$%0|0Poa4%nJZggdGZeeUMa%FKZUtei%X>?y-E^v8JO928D0~7!N00;of09jjo(zp0=6aWB~NB{sK00 +000000000001_fksgS0B~t=FJEbHbY*gGVQepQWpOWKZ*FsRa&=>LZ*p@kaCuNm0Rj{Q6aWAK2ms3fS +z9jkM;K`X0024)001cf0000000000005+c_GJSAaA|NaUukZ1WpZv|Y%g+UaW8UZabIL*aAj^}Wo~16 +UuSY}b#N|lc~DCM0u%!j000080LuVbTSjL|2AvlG0HRI+0384T00000000000HlGYX#)UoX>c!JX>N3 +7a&BR4FLGsZFLGsZUuJ1+WiD`eP)h*<6ay3h000O8%K%whCl=OM&maH*DS7|^AOHXW0000000000q=9 +~c0|0Poa4%nJZggdGZeeUMa%FKZa%FK}X>N0LVQg$JaCuNm0Rj{Q6aWAK2ms3fSzDA^6;L<>000aN00 +0~S0000000000005+ci=qPnaA|NaUukZ1WpZv|Y%g+UaW8UZabI&~bS`jtP)h*<6ay3h000O8%K%wh* +mO`p@EQOBBVGUiA^-pY0000000000q=EgV0|0Poa4%nJZggdGZeeUMa%FKZa%FK}b#7^Hb97;BY%Xwl +P)h*<6ay3h000O8%K%wh000000ssI200000Bme*a0000000000q=7BL0|0Poa4%nJZggdGZeeUMa%FR +GY;|;LZ*DJNUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzCD#z6ksP002P(001BW0000000000005+calr +!saA|NaUukZ1WpZv|Y%g+Ub8l>QbZKvHFJfVHWiD`eP)h*<6ay3h000O8%K%wh000000ssI200000D* +ylh0000000000q=Bo#0|0Poa4%nJZggdGZeeUMa%FRGY;|;LZ*DJaWoKbyc`sjIX>MtBUtcb8c~DCM0 +u%!j000080LuVbTaCNOGYT320Q_A504o3h00000000000HlHT!UF(sX>c!JX>N37a&BR4FLGsbZ)|mR +X>V>XY-ML*V|g!fWpi(Ac4cxdaCuNm0Rj{Q6aWAK2ms3fSz7=A0006200000001ul0000000000005+ +cN!QbZKvHFLGsbZ)|pDY-wUIUtei%X>?y-E^v8JO928D0~7!N00; +of09jifWzroa1polI6951!00000000000001_ftcL`0B~t=FJEbHbY*gGVQepQWpi(Ab#!TOZZC3Wb8 +l>RWo&6;FJfVHWiD`eP)h*<6ay3h000O8%K%wh$?Y`PQxgCH=1%|sF#rGn0000000000q=5zF0|0Poa +4%nJZggdGZeeUMa%FRGY;|;LZ*DJgWpi(Ac4cg7VlQK1Ze(d>VRU74E^v8JO928D0~7!N00;of09jku +m9w=KApiheg8%?700000000000001_fv5HZ0B~t=FJEbHbY*gGVQepQWpi(Ab#!TOZZC3Wb8l>RWo&6 +;FJ@t5bZ>HbE^v8JO928D0~7!N00;of09ji;=(m661^@tp7XSb^00000000000001_fe07`0B~t=FJE +bHbY*gGVQepQWpi(Ab#!TOZZC3Wb8l>RWo&6;FJ^CbZe(9$VQyq;WMOn=b1rasP)h*<6ay3h000O8%K +%wh1+IQqp$-55u`B=pF8}}l0000000000q=7;o1ORYpa4%nJZggdGZeeUMa%FRGY;|;LZ*DJgWpi(Ac +4cg7VlQxVZ+2;9WpXZXc~DCM0u%!j000080LuVbTlH+=S;PbY07VY~051Rl00000000000HlF1E(8E@ +X>c!JX>N37a&BR4FLGsbZ)|mRX>V>Xa%FRGY<6XAX<{#OWpHnDbY*fbaCuNm0Rj{Q6aWAK2ms3fSzC9 +QbZKvHFLGsbZ)|pDY-w +UIa%FLKX>w(4Wo~qHE^v8JO928D0~7!N00;of09jkY!d`&N5C8yuGyniE00000000000001_f&MuJ0B +~t=FJEbHbY*gGVQepQWpi(Ab#!TOZZC3Wb8l>RWo&6;FLGsbZ)|pDaxQRrP)h*<6ay3h000O8%K%wh0 +00000ssI2000009{>OV0000000000q=6Mn1ORYpa4%nJZggdGZeeUMb#!TLb1z?CX>MtBUtcb8c~DCM +0u%!j000080LuVbTZCzO(bok402U1Z03!eZ00000000000HlFbO9TLLX>c!JX>N37a&BR4FLiWjY;!M +PYGHC=V{cz{Wq5QhaCuNm0Rj{Q6aWAK2ms3fSzAhYIX~6`008#`000{R0000000000005+cY*7RNaA| +NaUukZ1WpZv|Y%g_mX>4;ZUu<{c00000000000001_fk##Z0B~t=FJEbHbY*gGVQepTbZKmJFJo_QaA9;VaCuNm0Rj{Q6aWAK2ms3f +Sz8DkHFfm{008D0001cf0000000000005+cQCkE6aA|NaUukZ1WpZv|Y%g_mX>4;ZV{dJ6VRUI?X>4h +9d0%v4XLBxac~DCM0u%!j000080LuVbTlvktub2P;0Pz3-03QGV00000000000HlG9VgvwiX>c!JX>N +37a&BR4FLiWjY;!MUVRU75X>DaLaCuNm0Rj{Q6aWAK2ms3fSzEup%C}Ml003|f001HY000000000000 +5+cVq*jVaA|NaUukZ1WpZv|Y%g_mX>4;ZWMy!2Wn*DV>WaCuNm0Rj{Q6aWAK2ms3fSz9J3(lhD<0 +04jt001cf0000000000005+c^k@VCaA|NaUukZ1WpZv|Y%g_mX>4;ZWNC6`V{~72a%^8{Wo&R|a&sZ3F;tX>c!JX>N37a&BR4FLiW +jY;!MVXJ=n*X>MySaCuNm0Rj{Q6aWAK2ms3fSzET&Zf!^f008_9001HY0000000000005+c>Tm=AaA| +NaUukZ1WpZv|Y%g_mX>4;ZWo~qGd2nxOZgg`laCuNm0Rj{Q6aWAK2ms3fSzFKDU`|yC004Ov001EX00 +00000000005+ca&`m&aA|NaUukZ1WpZv|Y%g_mX>4;ZW@&6?b9r-gWo<5Sc~DCM0u%!j000080LuVbT +O)$gb4~#O0I>o903ZMW00000000000HlEie*^$c!JX>N37a&BR4FLiWjY;!MWX>4V5d2nTOE^v8J +O928D0~7!N00;of09jl2Qmf$z1^@t#4gdfg00000000000001_fs%j(0B~t=FJEbHbY*gGVQepTbZKm +JFK29NVq-3Fc~DCM0u%!j000080LuVbTTK&QBIO1E0EQC)0384T00000000000HlG`h6Dg`X>c!JX>N +37a&BR4FLiWjY;!MYVRL9@b1rasP)h*<6ay3h000O8%K%whPt9!i1`YrKOfLWc9smFU0000000000q= +EE}1ORYpa4%nJZggdGZeeUMb#!TLb1!UfXJ=_{XD)DgP)h*<6ay3h000O8%K%whU<2TMR2={SPFnx~8 +vpc!JX>N37a&BR4FLiWjY;!MgVPk7yXK8L{E^v8JO928 +D0~7!N00;of09ji`nsm^00ssKD1pojX00000000000001_fyulC0B~t=FJEbHbY*gGVQepTbZKmJFLG +sca(OOrc~DCM0u%!j000080LuVbTaiEhCU6S?02dc!JX>N37a& +BR4FLiWjY;!Mjbz*RGZ)0V1b1rasP)h*<6ay3h000O8%K%whQoPCGtqTAETOOV0000000000q +=6^P1ORYpa4%nJZggdGZeeUMb#!TLb1!sdZE#;?X>u-bc~DCM0u%!j000080LuVbTUDbTByJ7>0Io6s +03ZMW00000000000HlEt*8~7?X>c!JX>N37a&BR4FLiWjY;!MlZg62^YiVw0E^v8JO928D0~7!N00;o +f09jjbkyNwv0ssI(1^@sX00000000000001_fxYDf0B~t=FJEbHbY*gGVQepTbZKmJFLiQkb1rasP)h +*<6ay3h000O8%K%whchf_09R&aYe+>WtApigX0000000000q=D+_1ORYpa4%nJZggdGZeeUMb#!TLb1 +!yja&&cJY-MhCE^v8JO928D0~7!N00;of09jjR$D#y01^@tb5dZ)j00000000000001_fky5G0B~t=F +JEbHbY*gGVQepTbZKmJFL!8VWo#~Rc~DCM0u%!j000080LuVbTQ9BN#V-K>08|110384T0000000000 +0HlGu^aKEKX>c!JX>N37a&BR4FLq;dFJE72ZfSI1UoLQYP)h*<6ay3h000O8%K%whcdOf9%me@cmJR> +_8vp(1ORYpa4%nJZggdGZeeUMc4KodVqtn=VR9~Tc~DCM0u%!j000080LuVbTbu +u)p28LY0LV%J02lxO00000000000HlE{`vd@RX>c!JX>N37a&BR4FLq;dFK20VE^v8JO928D0~7!N00 +;of09jirK51Vp1^@uZ6#xJp00000000000001_fg=(H0B~t=FJEbHbY*gGVQepUV{V?0Z*FvQZ)`4bc~DCM0u%!j000080LuVbTQ5`lfFch70J0c!Jc4cm4Z*nhEML|SOMJ{r4bWlqH0u%!j000080LuVbTLO|0dT9m#04 +oy!02crN00000000000HlHUP6YsPX>c!Jc4cm4Z*nhRUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzCVpf +yUeb00373000&M0000000000005+cl~n}*aA|NaUv_0~WN&gWc4cm4Z*nelcyv%p0Rj{Q6aWAK2ms3f +SzE^3KwV`4001rm001Na0000000000005+crB($1aA|NaUv_0~WN&gWV_{=xWn*t{baHQOFHA{8MNU& +iE_8TwP)h*<6ay3h000O8%K%wh3wIW|Kmh;%r2+r|Bme*a0000000000q=8IW1pshqa4%nWWo~3|axY +_HV`yb#Z*FvQZ)`7LUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzGyUPffW3007Ab001BW000000000000 +5+c&RGQjaA|NaUv_0~WN&gWV_{=xWn*t{baHQOFJEJAWG--dP)h*<6ay3h000O8%K%whbpx+`wg&(J# +~Ac!Jc4cm4Z*nhVVPj}zV{dMBa&K% +eV_{=xWiD`eP)h*<6ay3h000O8%K%wh!`*UJdK3Tvok{=zCIA2c0000000000q=D9F1pshqa4%nWWo~ +3|axY_HV`yb#Z*FvQZ)`7PZ*FvQZ)|L3axQRrP)h*<6ay3h000O8%K%whEP=Pl?gjt=!w>)fCjbBd00 +00000000q=A%t1pshqa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7SX>4V8a$#_AWpXZXc~DCM0u%!j000080 +LuVbTPyCQ&a?&q01*=a044wc00000000000HlG(g9QL^X>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eXk~SB +X>)XGV{c!Jc4cm +4Z*nhVVPj}zV{dMBa&K%eaCt6td2nT9P)h*<6ay3h000O8%K%wht?6LD?*;$>D--|#B>(^b00000000 +00q=5j71pshqa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7fWpZg@Y-xIBE^v8JO928D0~7!N00;of09jkuJb +z{70RRAr1poje00000000000001_fijW>0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%h0mVQ_F|axQRrP +)h*<6ay3h000O8%K%whCD2a%vj6}9F984mD*ylh0000000000q=8tJ1pshqa4%nWWo~3|axY_HV`yb# +Z*FvQZ)`7PVPj}zb1z?CX>MtBUtcb8c~DCM0u%!j000080LuVbTfq8&kf{X#02L4b04)Fj000000000 +00HlFbl?4EBX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eV_{=xWpgiPX>4U*V_{=xWiD`eP)h*<6ay3h000 +O8%K%why!H3DMgjl;Y6SoQE&u=k0000000000q=87A1pshqa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVP +j}zb1!mbWNC9>V_{=xWiD`eP)h*<6ay3h000O8%K%wh6ND==J^}y$-2(ss8vpc!Jc4cm4Z*nhVWpZ?BW@#^9UukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSz9k4t>K; +k009300018V0000000000005+c-=GBmaA|NaUv_0~WN&gWV`Xx5X=Z6JUteuuX>MO%E^v8JO928D0~7 +!N00;of09jk)QUn6dYXSf!as&V#00000000000001_fx4ju0B~t=FJE?LZe(wAFJonLbZKU3FJob2Wp +Z>baAj>!O928D0~7!N00;of09jj|`~%mK0{{SW4FCWe00000000000001_fy5060B~t=FJE?LZe(wAF +JonLbZKU3FJo_VWiD`eP)h*<6ay3h000O8%K%wh000000ssI2000008~^|S0000000000q=AkR2mo+t +a4%nWWo~3|axY_La&&2CX)kbjE_8WtWn@rG0Rj{Q6aWAK2ms3fSzC!J>(+t-002t_001cf000000000 +0005+c$`J?vaA|NaUv_0~WN&gWWMyz=Ze(R{V|ia^a&L8Tb1zIuLq$$gMJ{xBbWlqH0u%!j000080Lu +VbTY4cwo_YWP0Qvv`04V?f00000000000HlGF6bJxtX>c!Jc4cm4Z*nhWWpHI~WMyt+d0%I8Z*_2UFJ +E72ZfSI1UoLQYP)h*<6ay3h000O8%K%whO(cT{paK8@tp)%9DF6Tf0000000000q=8fw2mo+ta4%nWW +o~3|axY|MaAj^}Wo~16UuSY}b#QYpUteuuX>MO%E^v8JO928D0~7!N00;of09jks5C0D02LJ$R9{>O_ +00000000000001_fjbxo0B~t=FJE?LZe(wAFJxtKWo~3;Zew|0XL4_KaC0wTX>D+9Wo>0{bYXO9Z*DG +dc~DCM0u%!j000080LuVbTQ8A0QPlzf0ImiA05|{u00000000000HlFyAP4|(X>c!Jc4cm4Z*nhWWpH +I~WMyt+d0%I8Z*_2UFJEkFZggK{WpHI~WMyt+d0%I8Z*_2UE^v8JO928D0~7!N00;of09jkr0ZIQP0{ +{R?2LJ#q00000000000001_ftDi(0B~t=FJE?LZe(wAFJxtKWo~3;Zew|0XL4_KaC0wTaA|N~cXDBHa +Ak5XaCuNm0Rj{Q6aWAK2ms3fSz8B4&nTz>0012U001oj0000000000005+c1t$mqaA|NaUv_0~WN&gW +WMyz=Ze(R{V|ia^a&L8Tb1z?XZ*6Q}V{dJ6VRSBVc~DCM0u%!j000080LuVbTL1t600IC200000044w +c00000000000HlHVCkOy=X>c!Jc4cm4Z*nhWWpHI~WMyt+d0%I8Z*_2UFK~G-ba`-PWKc^10u%!j000 +080LuVbTdfb&ovaW50K+%{03QGV00000000000HlFFCX>c!Jc4cm4Z*nhWX>)XJX<{!-Nkc_WQ$ +;Rxcyv%p0Rj{Q6aWAK2ms3fSzB?y-E^v8JO928D0~7!N00;of09jjIN#!pyD*yodp#T6K00000000000001_fyp`u +0B~t=FJE?LZe(wAFJx(RbZlv2FJo_QaA9;VaCuNm0Rj{Q6aWAK2ms3fSzDdG)qt=I002ZP001BW0000 +000000005+cH)aR`aA|NaUv_0~WN&gWWNCABY-wUIa%FRGb#h~6b1rasP)h*<6ay3h000O8%K%whA>6 +p<1{VMTv`7E|9smFU0000000000q=6-J2mo+ta4%nWWo~3|axY|Qb98KJVlQ)Ja%pgMb1rasP)h*<6a +y3h000O8%K%whgi3i5>bw8|0Db`g8vpc!Jc4cm4Z*nhW +X>)XJX<{#QHZ(0^a&0bUcx6ya0Rj{Q6aWAK2ms3fSzBCX0~wRd0001{0RS5S0000000000005+c6@>} +_aA|NaUv_0~WN&gWWNCABY-wUIbT%|DWq4&!O928D0~7!N00;of09jkAOLI8vpy3jlCwa4%nWWo~3|axY|Qb98KJVlQ_yGA?C!Wl&220u%!j000080LuVbT +P;Kj+Vw2~005E#03QGV00000000000HlH1P7DBWX>c!Jc4cm4Z*nhWX>)XJX<{#THZ(0^a&0bUcx6ya +0Rj{Q6aWAK2ms3fSzG?_qApIw0001v0RS5S0000000000005+c41Em%aA|NaUv_0~WN&gWWNCABY-wU +IcQ!OGWq4&!O928D0~7!N00;of09jiO<6DGi4*&o?EC2u+00000000000001_fs;ZG0B~t=FJE?LZe( +wAFJx(RbaHPmOi4pUPE$otO928D0~7!N00;of09jl6U~t?c0RRBi0{{RX00000000000001_fiqGL0B +~t=FJE?LZe(wAFJx(RbaHPmUtei%X>?y-E^v8JO928D0~7!N00;of09jidRJ>_C0000$0000U000000 +00000001_fs#`W0B~t=FJE?LZe(wAFJx(RbaHPmUteuuX>MO%E^v8JO928D0~7!N00;of09ji~I&Et% +EdT%(!2kdp00000000000001_feKU(0B~t=FJE?LZe(wAFJx(RbaHPmWNCABa&Inhc~DCM0u%!j0000 +80LuVbTL1t600IC20000002=@R00000000000HlF(ferw0X>c!Jc4cm4Z*nhWX>)XPZ!d6pE_8WtWn@ +rG0Rj{Q6aWAK2ms3fSzE*6oA4?F000FB000{R0000000000005+ct$_{zaA|NaUv_0~WN&gWX=H9;FH +A{8MNU&iE^TB`O928D0~7!N00;of09jiD7xB9v0RRAG0{{RV00000000000001_fe?ib0B~t=FJE?LZ +e(wAFKJ|MVJ}}_X>MtBUtcb8c~DCM0u%!j000080LuVbTOgZYPdWnt0A39M02u%P00000000000HlFw +h7JI5X>c!Jc4cm4Z*nhbWNu+EV{c?-V=i!cP)h*<6ay3h000O8%K%why<-UJ#{d8TJOKaz8UO$Q0000 +000000q=DLr4ghdza4%nWWo~3|axZCQZecHDZ*6d4bS`jtP)h*<6ay3h000O8%K%whzBs-g_6q<2w=) +0$7ytkO0000000000q=DIr4ghdza4%nWWo~3|axZCQZecHDZ*pZWaCuNm0Rj{Q6aWAK2ms3fSz89D06 +Yvj0081K0RS8T0000000000005+c1(yy0aA|NaUv_0~WN&gWX=H9;FKJ|MVPs)+VJ>iaP)h*<6ay3h0 +00O8%K%whI$=a+B?ABeY6k!S9RL6T0000000000q=8G(4ghdza4%nWWo~3|axZCQZecHJZgg^CZf9k4 +E^v8JO928D0~7!N00;of09jlAIQrrj0000L0000W00000000000001_fveOG0B~t=FJE?LZe(wAFKJ| +MVJ~oDV{2h&WnW}rbYU)Vc~DCM0u%!j000080LuVbTL1t600IC20000002u%P00000000000HlEc)eZ +n~X>c!Jc4cm4Z*nhbWNu+EaCt6td2nT9P)h*<6ay3h000O8%K%whWnju4#Hj!PxuydE9RL6T0000000 +000q=7lr4ghdza4%nWWo~3|axZCQZecHVbaON|WMOn+E^v8JO928D0~7!N00;of09jjDwJ17>0RRAI0 +ssIT00000000000001_fjEB;0B~t=FJE?LZe(wAFKu&YaA9L>FGEjISxHVuP)h*<6ay3h000O8%K%wh +DhN0*;sF2vRRjP49{>OV0000000000q=ET>4*+m!a4%nWWo~3|axZOjXK-O-YcF44X>MtBUtcb8c~DC +M0u%!j000080LuVbTRS_Q)2#sj067Ez03iSX00000000000HlE!gAV|3X>c!Jc4cm4Z*nhfb7yd2V{0 +#Ecw=R7bZKvHb1rasP)h*<6ay3h000O8%K%whCE!Q*c?JLgUKRiV8UO$Q0000000000q=5v54*+m!a4 +%nWWo~3|axZOjXK-O-YcFMZbS`jtP)h*<6ay3h000O8%K%whBpktIHX8r{hJFA59{>OV0000000000q +=B`I4*+m!a4%nWWo~3|axZOjXK-O-YcFPDY;0m-V{0yOc~DCM0u%!j000080LuVbTi@=|yng@y0L1_R +0384T00000000000HlE^rw;&dX>c!Jc4cm4Z*nhiVPk7yXK8L{FHA{8MNU&iP)h*<6ay3h000O8%K%w +hu(zWg=?wq?z9#?xBme*a0000000000q=Dk64*+m!a4%nWWo~3|axZXUV{2h&X>MmPOi4pUPE$oLK~O +VP|P>XD>`iLq$$gMJ_^9L{Lis0u%!j000080LuVbTYvn?TrmLv0PX<*03iSX00000000000HlEjx +eowvX>c!Jc4cm4Z*nhiVPk7yXK8L{FJE72ZfSI1UoLQYP)h*<6ay3h000O8%K%wh4)5auMmPUuA4&W@&6?E^v8JO928D0~7!N00;o +f09jj@VL-t*4FCXqB>(^;00000000000001_fttS$0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rFZDDSCY-w +(FcrI{xP)h*<6ay3h000O8%K%wh>DV)-!2|#Rh6(@xBLDyZ0000000000q=6F64*+m!a4%nWWo~3|ax +ZXUV{2h&X>MmPUu|`BY;0+6b$Bjtc~DCM0u%!j000080LuVbTg-yz;4ujR0PQCL03ZMW00000000000 +HlEw(hmS|X>c!Jc4cm4Z*nhiVPk7yXK8L{FJEwBa&u*JE^v8JO928D0~7!N00;of09jiwqw-46h8X>c!Jc4cm4Z*nhiVPk7yXK8L{FJE ++TYh`X}dS!AhaCuNm0Rj{Q6aWAK2ms3fSzC&M1n>e6000p$001BW0000000000005+co8%7waA|NaUv +_0~WN&gWaA9L>VP|P>XD@AGa%*LBb1rasP)h*<6ay3h000O8%K%whp_MniS0w-dvxfixApigX000000 +0000q=DP>4*+m!a4%nWWo~3|axZXUV{2h&X>MmPZDn*}WMOn+E^v8JO928D0~7!N00;of09jiA00002 +000000000U00000000000001_fpHlS0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rWc`kH$aAjmrO928D0~7! +N00;of09jk=jVik>1ONbo3jhEm00000000000001_fv*`50B~t=FJE?LZe(wAFK}UFYhh<;Zf7rYWpQ +~Uox0057i001KZ0000000000005+cA07|@aA|NaUv +_0~WN&gWaA9L>VP|P>XD@SbWn*b(X=QSAE^v8JO928D0~7!N00;of09jkTktBWy8UO&VP|P>XD@YhX>4;YaCuNm0Rj{Q6aWA +K2ms3fSzCV>$`Wf4001yS001BW0000000000005+c)?p9;aA|NaUv_0~WN&gWaA9L>VP|P>XD@bTa&u +{KZZ2?nP)h*<6ay3h000O8%K%wh9o!vi{RaR5UlsrWDgXcg0000000000q=A2P5CCv#a4%nWWo~3|ax +ZXUV{2h&X>MmPY-wXMmPY-wXc!Jc4cm4Z*nhiYiD0_Wpi(Ja${w4FHA{ +8MNU&iP)h*<6ay3h000O8%K%whc~f!DR)PQkBjy1BB>(^b0000000000q=9Um5CCv#a4%nWWo~3|axZ +XeXJ2w?y-E^v8JO928D0~7!N00;of09jkC)*D@e0ssI(1ONaa000000000000 +01_fdwED0B~t=FJE?LZe(wAFK}#ObY^dIZDeV3b1zIuLq$$gMNmrt0u%!j000080LuVbTUKc!Jc4cm4Z*nhiY+-a}Z*py9X>xNfUtei%X>?y-E^v8JO928D +0~7!N00;of09jj;(H^6_0RRBu1pojf00000000000001_fvPDH0B~t=FJE?LZe(wAFK}#ObY^dIZDeV +3b1z?CZDDC{Utcb8c~DCM0u%!j000080LuVbTbgeR6F3I|05u~303!eZ00000000000HlGZD-i&2X>c +!Jc4cm4Z*nhiY+-a}Z*py9X>xNfVQyq{Z)s#MaCuNm0Rj{Q6aWAK2ms3fSzBUzjPzy)002QG0018V00 +00000000005+cATtpFaA|NaUv_0~WN&gWaBN|8W^ZzBWNC79FJW+LE^v8JO928D0~7!N00;of09jkHl +^i0`1ONcC7ytkv00000000000001_fx|ix0B~t=FJE?LZe(wAFK}#ObY^dIZDeV3b1!XSV{daVaCuNm +0Rj{Q6aWAK2ms3fSz7=A0006200000001EX0000000000005+c(?1aaaA|NaUv_0~WN&gWaBN|8W^Zz +BWNC79FK~G-ba`-PWKc^10u%!j000080LuVbTSm-MMR^GT0NN-303ZMW00000000000HlEwKoJ0NX>c +!Jc4cm4Z*nhiY+-a}Z*py9X>xNfb#7^RE^v8JO928D0~7!N00;of09jiL?Cz940RRBN0ssIb0000000 +0000001_fy+q|0B~t=FJE?LZe(wAFK}#ObY^dIZDeV3b1!yfa&u{KZZ2?nP)h*<6ay3h000O8%K%wht +(cJU%?SVijVAyABLDyZ0000000000q=8CH5dd&$a4%nWWo~3|axZXfVRUA1a&2U3a&s?tX>Me1cXKXq +c~DCM0u%!j000080LuVbTMGam%fSKw05b&u02}}S00000000000HlFfRS^JiX>c!Jc4cm4Z*nhid1q~ +9Zgg`mOi4pUPE$otO928D0~7!N00;of09jj&l9e3u1ONc13jhEh00000000000001_fm2u!0B~t=FJE +?LZe(wAFK~HhZDnqBb1z?CX>MtBUtcb8c~DCM0u%!j000080LuVbTW+1i5b6K`0AT?D03ZMW0000000 +0000HlG0T@e6qX>c!Jc4cm4Z*nhid1q~9Zgg`mUteuuX>MO%E^v8JO928D0~7!N00;of09jkdV|*r+0 +ssKE1^@sb00000000000001_fvjE;0B~t=FJE?LZe(wAFK~HhZDnqBb1!3WZgX#JWiD`eP)h*<6ay3h +000O8%K%whcJWzR`~m;~b_W0e9smFU0000000000q=9~65dd&$a4%nWWo~3|axZXsXKiI}baO9eX>4? +5axQRrP)h*<6ay3h000O8%K%whWi@i;;|2f#CJ_JtApigX0000000000q=B|%5dd&$a4%nWWo~3|axZ +XsXKiI}baO9eZ*py6baZ8ME^v8JO928D0~7!N00;of09jjC3Wi*XB>(^wiU0r|00000000000001_f! +J#i0B~t=FJE?LZe(wAFK~HhZDnqBb1!UVcx7@faCuNm0Rj{Q6aWAK2ms3fSzG0}oo(;|008X+001BW0 +000000000005+coRJX#aA|NaUv_0~WN&gWaCv8KWo~qHFKusRWo&6~WiD`eP)h*<6ay3h000O8%K%wh +e-4dud;$OfV+Q~L9smFU0000000000q=Cwl5dd&$a4%nWWo~3|axZXsXKiI}baO9oY;|X8ZZ2?nP)h* +<6ay3h000O8%K%whjivwtO#}b{01N;CAOHXW0000000000q=AB#5dd&$a4%nWWo~3|axZXsXKiI}baO +9qWoKo0Z*X)jaCuNm0Rj{Q6aWAK2ms3fSzC+35Vn8>000yW0018V0000000000005+c4Vw`FaA|NaUv +_0~WN&gWaCv8KWo~qHFLPsIZf<3AE^v8JO928D0~7!N00;of09jkkOAWKl2mk;r9{>O$00000000000 +001_fy$o|0B~t=FJE?LZe(wAFK~HhZDnqBb1!pnXlZVEWq5QhaCuNm0Rj{Q6aWAK2ms3fSzGOAcZ2!{ +000yj0012T0000000000005+c)~FExaA|NaUv_0~WN&gWaCv8KWo~qHFLQKxY-KKRc~DCM0u%!j0000 +80LuVbTU8^;g@FeE08$tL0384T00000000000HlEnun_=oX>c!Jc4cm4Z*nhid1q~9Zgg`mbZ={AZZ2 +?nP)h*<6ay3h000O8%K%wh4;A&2ZVc~DCM0u%!j000080LuVbTQuD)n71DQ0LYyH04M+e00000 +000000HlF$5)uG#X>c!Jc4cm4Z*nhid1q~9Zgg`mW@&76WpZ;bUtei%X>?y-E^v8JO928D0~7!N00;o +f09ji#+CPxa1^@sF6#xJ$00000000000001_fow7o0B~t=FJE?LZe(wAFK~HhZDnqBb1!CZa&2LBbY* +gLFJE72ZfSI1UoLQYP)h*<6ay3h000O8%K%whj*9)vAO!#bP!IqBD*ylh0000000000q=ADu5&&>%a4 +%nWWo~3|axZXsXKiI}baO9eZ*py6baZ8Mb1z?QVQ_G1Zf7oVc~DCM0u%!j000080LuVbTL6MwEk_Li0 +8=jj04D$d00000000000HlHJJ`wc!Jc4cm4Z*nhid1q~9Zgg`mY-M<5a&s?VUukY>bYEXCaCuNm +0Rj{Q6aWAK2ms3fSzCw9=Kmr;001H{0RSfe0000000000005+ccuW!iaA|NaUv_0~WN&gWaCv8KWo~q +HFKlIaWpZ;bUu|J?y-E^v8JO +928D0~7!N00;of09jjm{_Gta0{{T<3;+Np00000000000001_fjzqt0B~t=FJE?LZe(wAFK~HhZDnqB +b1!prd2D5KFJEn8aByjEXD)DgP)h*<6ay3h000O8%K%whM~lQneF6XgIRpRzBLDyZ0000000000q=B8 +j5&&>%a4%nWWo~3|axZXsaB^>IWn*+-Xm4+8b1zIuLq$$gMNmrt0u%!j000080LuVbTbLREok0Nr0J8 +!B04D$d00000000000HlFi!4d#)X>c!Jc4cm4Z*nhid2n)XYGq?|UubV{YjZDOUukY>bYEXCaCuNm0R +j{Q6aWAK2ms3fSz8}vF|INU003Az001Na0000000000005+c;ldICaA|NaUv_0~WN&gWaCvZYZ)#;@b +YEz1Z)5&&>% +a4%nWWo~3|axZXsaB^>IWn*+-Xm4+8b1!gtE_8WtWn@rG0Rj{Q6aWAK2ms3fSzEGZzdsiN001ol001) +p0000000000005+cna>gcaA|NaUv_0~WN&gWaCvZYZ)#;@bYEz1Z)BWpi^cUtei%X>? +y-E^v8JO928D0~7!N00;of09jiwC3Alr4FCYRF8}~G00000000000001_fdSDH0B~t=FJE?LZe(wAFK +~Hqa&Ky7V{~6=Z*OaJFJEbHUvP47V`X!5FJEbHUvP47V`X!5E^v8JO928D0~7!N00;of09jj-=AX;p4 +FCY1CjbB(00000000000001_fpXpw0B~t=FJE?LZe(wAFLGsZb!BsOb1zIuLq$$gMNmrt0u%!j00008 +0LuVbTM8r8<7Wo|0KpRg03ZMW00000000000HlG8>=FQQX>c!Jc4cm4Z*nhkWpQ<7b98erUtei%X>?y +-E^v8JO928D0~7!N00;of09jjpxozqM0RRBA0RR9a00000000000001_fid(F0B~t=FJE?LZe(wAFLG +sZb!BsOb1z?Cc4cyNX>V>{UoLQYP)h*<6ay3h000O8%K%wh$SBO|hXMcq*98CoCjbBd0000000000q= +9zz5&&>%a4%nWWo~3|axZdaadl;LbaO9XX>N37a&BR4Uv+e8Y;!Jfc~DCM0u%!j000080LuVbTLRuU^ +j8@G06k{_03ZMW00000000000HlFJ_!0ncX>c!Jc4cm4Z*nhkWpQ<7b98erVPs)&bY*gLE^v8JO928D +0~7!N00;of09jje{x$+p1^@st82|tq00000000000001_f!7fe0B~t=FJE?LZe(wAFLGsZb!BsOb1z| +VX)bViP)h*<6ay3h000O8%K%whvfhoGdJ6ym$|nE-8~^|S0000000000q=8`=698~&a4%nWWo~3|axZ +daadl;LbaO9Zb#!PhaCuNm0Rj{Q6aWAK2ms3fSzCvi9~~P3006lG0012T0000000000005+c6(kb?aA +|NaUv_0~WN&gWa%FLKWpi|MFJonLbaO6nc~DCM0u%!j000080LuVbTO!V%e>?*K03HVb03HAU000000 +00000HlFyB@+N}X>c!Jc4cm4Z*nhkWpQ<7b98erV{dJ6VRSBVc~DCM0u%!j000080LuVbTh`v<*u)b6 +0G>zy03QGV00000000000HlHAC=&p1X>c!Jc4cm4Z*nhkWpQ<7b98erV{dP3X=QURaCuNm0Rj{Q6aWA +K2ms3fSzEw8U^;;X006KM001HY0000000000005+cE7}CjbEViU0r}00000 +000000001_fd@$w0B~t=FJE?LZe(wAFLGsZb!BsOb1!XgWMyn~E^v8JO928D0~7!N00;of09jj@A65m +q0RR9Y1ONaa00000000000001_fmCo40B~t=FJE?LZe(wAFLGsZb!BsOb1!gVV{2h&WpgfYc~DCM0u% +!j000080LuVbTf8{G|9Bw)04H|<03ZMW00000000000HlFSauWb>X>c!Jc4cm4Z*nhkWpQ<7b98erb7 +gaLX>V?GE^v8JO928D0~7!N00;of09jkCNtR`s1^@u!5C8xq00000000000001_fdP~g0B~t=FJE?LZ +e(wAFLGsZb!BsOb1!prVRUtKUt@1%WpgfYc~DCM0u%!j000080LuVbTTv2BxmyGP0ALFM03rYY00000 +000000HlH5niBwUX>c!Jc4cm4Z*nhkWpQ<7b98erb98cbV{~0384T00000000000HlF=pA!IZX>c!Jc4cm4Z*nhkWpQ<7b98erb#!TLb1rasP)h*<6ay +3h000O8%K%wh!Ktmw+W`Oo?*ae-9smFU0000000000q=C4|698~&a4%nWWo~3|axZdab8l>RWo&6;FH +A{8MNU&iP)h*<6ay3h000O8%K%whHq^9X)Bpeg9RdIVA^-pY0000000000q=C=M698~&a4%nWWo~3|a +xZdab8l>RWo&6;FJE72ZfSI1UoLQYP)h*<6ay3h000O8%K%whd5_9tRWo&6;FK}{ic4=f~a&sc!Jc4cm4Z*nhkWpi(Ac4cg7VlQxcE_8WtWn@rG0Rj{Q6aW +AK2ms3fSz8@my%N&`008v|001KZ0000000000005+cN7fSnaA|NaUv_0~WN&gWa%FRGY<6XAX<{#OWp +HnDbY*gLE^v8JO928D0~7!N00;of09jk`Mfc%Z2LJ#R82|tw00000000000001_fm_)V0B~t=FJE?LZ +e(wAFLGsbZ)|pDY-wUIb98cbV{~&aaCuNm0Rj{Q6aWAK2ms3fSzEDC;(PG`004jj001li0000000000 +005+c^WYNzaA|NaUv_0~WN&gWa%FRGY<6XAX<{#OWpi(Ac4cyNFJE72ZfSI1UoLQYP)h*<6ay3h000O +8%K%whXZ0Csr~&{02L=EDEC2ui0000000000q=7Et698~&a4%nWWo~3|axZdab8l>RWo&6;FLGsbZ)| +pDa&s?XVsmtIVPkYIaCuNm0Rj{Q6aWAK2ms3fSzEFR#o@yO008I)001oj0000000000005+cAmtMPaA +|NaUv_0~WN&gWa%FRGY<6XAX<{#OWpi(Ac4cyNFJp3PbY*gBZ*DGdc~DCM0u%!j000080LuVbTkdJj@ +J<2%0O$q)04@Lk00000000000HlE~=o0{NX>c!Jc4cm4Z*nhkWpi(Ac4cg7VlQ%Kb8l>RWpZ;bWq4y{ +aCB*JZgVbhc~DCM0u%!j000080LuVbTQ8?^u;Uj10F+(;04@Lk00000000000HlG)>JtEPX>c!Jc4cm +4Z*nhkWpi(Ac4cg7VlQ%Kb8l>RWpZ;ba%FRGY;|;LZ*DGdc~DCM0u%!j000080LuVbTmP2wN^1fD03Z +Ya02lxO00000000000HlHU0u%snX>c!Jc4cm4Z*nhkX=7+FOi4pUPE$otO928D0~7!N00;of09jjMgQ +>*;2mk=e7XSbp00000000000001_ftUpp0B~t=FJE?LZe(wAFLG&PXfI!1X>MtBUtcb8c~DCM0u%!j0 +00080LuVbTheV~Q;7=z0N5S?02}}S00000000000HlG^4HN)yX>c!Jc4cm4Z*nhkX=7+FUteuuX>MO% +E^v8JO928D0~7!N00;of09jjww)mB53IG7%CjbB-00000000000001_ft48)0B~t=FJE?LZe(wAFLG& +PXfI!5Wo&F;cWGpFXmc)bc~DCM0u%!j000080LuVbTYoO@fGlwU0Lvo+03ZMW00000000000HlFEBoq +K}X>c!Jc4cm4Z*nhkX=7+FUuA7?YH43%Z)9b2E^v8JO928D0~7!N00;of09jk(dGEQ_0RR9f1ONac00 +000000000001_fv1%e0B~t=FJE?LZe(wAFLG&PXfI!7ZEtF6Uvgz|Y+++%E^v8JO928D0~7!N00;of0 +9jieTGfm<0{{R}2mk;g00000000000001_fxVX$0B~t=FJE?LZe(wAFLG&PXfI!7cyMoWbYEs~a&2LB +E^v8JO928D0~7!N00;of09ji})VJH4000090RR9V00000000000001_fi#;G0B~t=FJE?LZe(wAFLG& +PXfI!7cywiMb7^mGE^v8JO928D0~7!N00;of09jk@!NV4Z0RR9W0{{RU00000000000001_feV}z0B~ +t=FJE?LZe(wAFLG&PXfI!8X>4U~Z!U0oP)h*<6ay3h000O8%K%wh-=?)RT?+sJxFrAp8~^|S0000000 +000q=Czw6aa8(a4%nWWo~3|axZdeV`wj5X>N0HWn*+MaCuNm0Rj{Q6aWAK2ms3fSz8vX<{P&I005Z`0 +018V0000000000005+cVyP4WaA|NaUv_0~WN&gWa%p2|FJEkLXJ2w)0B~t=FJE?LZe(wAFLG&PXfI!EZ*OoeaCuNm0Rj{ +Q6aWAK2ms3fSzEm*)3c)i0043Y0015U0000000000005+cvaS>WaA|NaUv_0~WN&gWa%p2|FJEqTY;0 +d4UKaCuNm0Rj{Q6aWAK2ms3fSz8yOS1pAE005U80012T0000000000005+ck+2j1aA|NaUv_0~WN +&gWa%p2|FJEwBY-MzGWpgfYc~DCM0u%!j000080LuVbTj}ubOyK|k0H*-}02u%P00000000000HlFYw +G;qwX>c!Jc4cm4Z*nhkX=7+FUvOz-Yc6nkP)h*<6ay3h000O8%K%wh(ips8j|Kn$%@hCt8UO$Q00000 +00000q=9L+6aa8(a4%nWWo~3|axZdeV`wj5a$$67Z!U0oP)h*<6ay3h000O8%K%wh#xbo_Uk(5O&rJX +T9RL6T0000000000q=7KK6aa8(a4%nWWo~3|axZdeV`wj5b8u;HZe?Db4E +^v8JO928D0~7!N00;of09jiOAN76G6953?SO5Sb00000000000001_f&0xA0B~t=FJE?LZe(wAFLG&P +XfI!PX>KzzUt@1>b8l>AE^v8JO928D0~7!N00;of09jj17JZz&0ssJo2LJ#Z00000000000001_feqp +m0B~t=FJE?LZe(wAFLG&PXfI!PX>Me1cXKXqc~DCM0u%!j000080LuVbTcif2J>3ET0N)A#03`qb000 +00000000HlEfc!Jc4cm4Z*nhkX=7+FUw3J4WN&wKUvgz`WMy(?axQRrP)h*<6ay3h000O8%K +%wh=jik%Lj?c;Obq}482|tP0000000000q=6&o6aa8(a4%nWWo~3|axZdeV`wj5cXDBHE^v8JO928D0 +~7!N00;of09jiOYei9w0RRAc0{{RQ00000000000001_ft~FX0B~t=FJE?LZe(wAFLG&PXfI)6V=i!c +P)h*<6ay3h000O8%K%whO8dp)fCvBpR44!d82|tP0000000000q=8@W6aa8(a4%nWWo~3|axZdeV`wj +7Y-wk1E^v8JO928D0~7!N00;of09jidF6kGu2LJ#G8vp +c!Jc4cm4Z*nhkX=7+FVqtPFaCuNm0Rj{Q6aWAK2ms3fSzGR`YG7On006!z000*N0000000000005+cj +|3F}aA|NaUv_0~WN&gWa%p2|FJf +P0000000000005+cfff}2aA|NaUv_0~WN&gWa%p2|FJo_PZ*nehc~DCM0u%!j000080LuVbTWLfMPLc +rt03HMY03iSX00000000000HlF`DHQ;4X>c!Jc4cm4Z*nhkX=7+FV{dG4a$j_EX>e?1bS`jtP)h*<6a +y3h000O8%K%who=j5llm`F++ZzA?8vpc!Jc4cm4Z*nhk +X=7+FV{dMAZ){~QaCuNm0Rj{Q6aWAK2ms3fSzC)t(n;O{000OD0012T0000000000005+czls$AaA|N +aUv_0~WN&gWa%p2|FJo_Rb98cHX>KlXc~DCM0u%!j000080LuVbTMW`;cf|z&0Dct!03HAU00000000 +000HlG~j1>TIX>c!Jc4cm4Z*nhkX=7+FV{dMBVQFqc!Jc4cm4Z*nhkX=7+FV{dMBa&K%daCuNm0Rj{Q6aWAK2ms3fS +zAOlSyLwm002QC001HY0000000000005+c*P0aoaA|NaUv_0~WN&gWa%p2|FJxtAVRdYDUvqSMY-MvU +aCuNm0Rj{Q6aWAK2ms3fSzAALI+oV~00035000~S0000000000005+cKB5%>aA|NaUv_0~WN&gWa%p2 +|FJx(9XKrtEWiD`eP)h*<6ay3h000O8%K%wh;RV|O%>w`cKM4Q;82|tP0000000000q=8SQ6##H)a4% +nWWo~3|axZdeV`wjBZEtF6E^v8JO928D0~7!N00;of09jiiNFmeh0001j0ssIS00000000000001_fm +5gz0B~t=FJE?LZe(wAFLG&PXfI`Qa&K~TE^v8JO928D0~7!N00;of09jjV-ft9*0ssJ$1^@sa000000 +00000001_fq1DE0B~t=FJE?LZe(wAFLG&PXfI}IY-L|?a&LHfE^v8JO928D0~7!N00;of09jk6yFJ%A +1ONcE2><{b00000000000001_fkCVl0B~t=FJE?LZe(wAFLG&PXfI}IY-Mw4dSxzfc~DCM0u%!j0000 +80LuVbThqIXO+yO+0CFV&03QGV00000000000HlGmuoVDsX>c!Jc4cm4Z*nhkX=7+FXlZ9?Y-wj`bY* +fbaCuNm0Rj{Q6aWAK2ms3fSzF*uyoM?T005^G000;O0000000000005+cG`tl6aA|NaUv_0~WN&gWa% +p2|FKTmdZZ2?nP)h*<6ay3h000O8%K%whIKf!Riv$1wvc!Jc4cm4Z*nhkX=7+FY+-qCb#yLpc~DCM0u%!j000080LuVbTiGDR&Z!Ro08Bdo02lxO0000 +0000000HlF_)D-}5X>c!Jc4cm4Z*nhkX=7+FY-x67E^v8JO928D0~7!N00;of09jiBjB{=30{{TQ4FC +Wi00000000000001_fnDSk0B~t=FJE?LZe(wAFLG&PXfJGOc4c33Wo~3;axQRrP)h*<6ay3h000O8%K +%whrhqvvY7PJZv@iew8vp00SWa02%-Q00000000000HlE@_Z0weX>c!Jc4cm4Z*nhkX=7+FZDDe2 +b#N|lc~DCM0u%!j000080LuVbTmP&W1Z)KW0J#(Z02=@R00000000000HlGg0TuvoX>c!Jc4cm4Z*nh +kX=7+FZDnC|b#i4caCuNm0Rj{Q6aWAK2ms3fSzG^SPo&lb001l#000{R0000000000005+cQwJ6RaA| +NaUv_0~WN&gWa%p2|FK}UGWNB_^E^v8JO928D0~7!N00;of09jiO#ub8d0RR9z0{{RS000000000000 +01_fnp670B~t=FJE?LZe(wAFLG&PXfJSKXJv9OaCuNm0Rj{Q6aWAK2ms3fSz9;&K3}^8002Y{000{R0 +000000000005+c3=b9naA|NaUv_0~WN&gWa%p2|FK}UOWps39E^v8JO928D0~7!N00;of09jkhSfMvZ +3IG6=D*yl)00000000000001_fdCX10B~t=FJE?LZe(wAFLG&PXfJSKZe?sPaCuNm0Rj{Q6aWAK2ms3 +fSz9pk4CHMe001YB000^Q0000000000005+cejXM8aA|NaUv_0~WN&gWa%p2|FK}{YbaZ(xaCuNm0Rj +{Q6aWAK2ms3fSzAbM;c!Jc4cm4Z*nhkX=7+ +Fa&>HFE^v8JO928D0~7!N00;of09jiPh4m|R1ONaV3jhEa00000000000001_f$oqN0B~t=FJE?LZe( +wAFLG&PXfJbPZ*XNUaCuNm0Rj{Q6aWAK2ms3fSzA9f{;pC2001`z000^Q0000000000005+cnUxj*aA +|NaUv_0~WN&gWa%p2|FLPsZWo2$IaCuNm0Rj{Q6aWAK2ms3fSzA^q8>EyJ005_8000{R00000000000 +05+cBbXKdaA|NaUv_0~WN&gWa%p2|FLPyQZDnqBE^v8JO928D0~7!N00;of09jiX&zvbH1pokc5C8xh +00000000000001_f$*#r0B~t=FJE?LZe(wAFLG&PXfJbcX>M+1axQRrP)h*<6ay3h000O8%K%wh0$S! +e_yhm|ND%-48UO$Q0000000000q=8Se765Q*a4%nWWo~3|axZdeV`wjPbYXOLb1rasP)h*<6ay3h000 +O8%K%whp~5SCy%qofZfO7j82|tP0000000000q=A38765Q*a4%nWWo~3|axZdeV`wjPba`xLE^v8JO9 +28D0~7!N00;of09jk{3Z_ui0RRB%1ONaU00000000000001_fpg9l0B~t=FJE?LZe(wAFLG&PXfJbgd +2D55E^v8JO928D0~7!N00;of09jk&MA_5+AOHXpjsO4}00000000000001_fq>8!0B~t=FJE?LZe(wA +FLG&PXfJblZggRIE^v8JO928D0~7!N00;of09ji*|GX8o9{>PxoB#kB00000000000001_fwu7$0B~t +=FJE?LZe(wAFLG&PXfJeOVr*qDaCuNm0Rj{Q6aWAK2ms3fSz9_I)4%=$001ft001HY0000000000005 ++cq7fGWaA|NaUv_0~WN&gWa%p2|FLY&cZE0>{Y+rO}Wo>0HaCuNm0Rj{Q6aWAK2ms3fSzA+?Q=FeD00 +6+b000;O0000000000005+c;1w4DaA|NaUv_0~WN&gWa%p2|FLY&ibS`jtP)h*<6ay3h000O8%K%whq +u(SR$^-xayAA*V82|tP0000000000q=B_Q7XWZ+a4%nWWo~3|axZdeV`wjQXk~3>E^v8JO928D0~7!N +00;of09jj6b@ot40001H0000Q00000000000001_fwn^z0B~t=FJE?LZe(wAFLG&PXfJeVWo>11E^v8 +JO928D0~7!N00;of09jirWX9x|9smFpi~s-~00000000000001_fi*-I0B~t=FJE?LZe(wAFLG&PXfJ +efVPj=tVPk79aCuNm0Rj{Q6aWAK2ms3fSzDI}FBhZ=008SG000;O0000000000005+c2V)liaA|NaUv +_0~WN&gWa%p2|FLZKcWiD`eP)h*<6ay3h000O8%K%whU08L3cLD$aFa!Vq82|tP0000000000q=DgW7 +XWZ+a4%nWWo~3|axZjmZER^TOi4pUPE$otO928D0~7!N00;of09jklI#2NI0000w0RR9U0000000000 +0001_fsb$(0B~t=FJE?LZe(wAFLZBhY-ulFUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzBL?NIqm5006R +N000~S0000000000005+cws98#aA|NaUv_0~WN&gWbZ>2JX)j-JVRCb2axQRrP)h*<6ay3h000O8%K% +whd3V*}4+Q`KqYMB57ytkO0000000000q=8h77XWZ+a4%nWWo~3|axZjmZER^TUvgzGaCuNm0Rj{Q6a +WAK2ms3fSzEL35@*E#008~~000{R0000000000005+cnUNO&aA|NaUv_0~WN&gWbZ>2JX)j-Nd2nTOE +^v8JO928D0~7!N00;of09jirDFFB!0000Q0000Q00000000000001_ftQjO0B~t=FJE?LZe(wAFLZBh +Y-ulWc`kH$aAjmrO928D0~7!N00;of09jjISapJT0ssIo1ONaV00000000000001_f$NeN0B~t=FJE? +LZe(wAFLZBhY-wM2FHA{8MNU&iP)h*<6ay3h000O8%K%whYdEsvjsO4vsQ>@~9{>OV0000000000q=B +227XWZ+a4%nWWo~3|axZjmZER^@cQ0RGX>MtBUtcb8c~DCM0u%!j000080LuVbTbooFzB35`05KZ?03 +HAU00000000000HlFtmKOkUX>c!Jc4cm4Z*nhmZ*6R8Uw1EGcXDZTWpXZXc~DCM0u%!j000080LuVbT +PrC5_#6NL02%-Q02}}S00000000000HlG{pBDgdX>c!Jc4cm4Z*nhmZ*6R8Uw1EXc`kH$aAjmrO928D +0~7!N00;of09jkb4+^k-0ssI$1ONaY00000000000001_fh(XF0B~t=FJE?LZe(wAFLZKsb98fbZ*pZ +XOi4pUPE$otO928D0~7!N00;of09jiPHFKz00ssIg1pojd00000000000001_f#jkW0B~t=FJE?LZe( +wAFLZKsb98fbZ*pZXUtei%X>?y-E^v8JO928D0~7!N00;of09jioVaNzW3jhF>EC2u=000000000000 +01_fqkVH0B~t=FJE?LZe(wAFLZKsb98fbZ*pZXUtw@*E^v8JO928D0~7!N00;of09jk!H@8li6951gP +yhfR00000000000001_f&8!+0B~t=FJE?LZe(wAFLZKsb98fbZ*pZXUu|JyZ*wkic~DCM0u%!j00008 +0LuVbTb)jZkQf920Bi{W03rYY00000000000HlG_#1{Z?X>c!Jc4cm4Z*nhma&>cbb98TVWiMZEaAj_ +Db8Iefc~DCM0u%!j000080LuVbTWP>t&&2@%0BQsP04M+e00000000000HlE{$rk`{X>c!Jc4cm4Z*n +hma&>cbb98TVWiMZIb8KH@Z*FsRVQzGDE^v8JO928D0~7!N00;of09jj6{tboz5C8y4MgRaJ0000000 +0000001_fi}w*0B~t=FJE?LZe(wAFLZKsb98fbZ*pZXUw3J4WN&wKE^v8JO928D0~7!N00;of09jiA0 +0002000000000V00000000000001_fp*&$0B~t=FJE?LZe(wAFLZKsb98fbZ*pZXaCt6td2nT9P)h*< +6ay3h000O8%K%whni!`vlmY+%TLb_A9{>OV0000000000q=B{D7XWZ+a4%nWWo~3|axZmqY;0*_GcQa +@Lq$$gMJ{xBbWlqH0u%!j000080LuVbTTg=^C~5@&00j*I03QGV00000000000HlG2-WLFHX>c!Jc4c +m4Z*nhna%^mAVlyvaUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzE!vKPI#d003+(001KZ000000000000 +5+cE#wyfaA|NaUv_0~WN&gWb#iQMX<{=kUt@1V?GE^v8JO928D0~7!N00;of09jkux;?u<0 +000$0000V00000000000001_fgV?DZ*OcaaCuNm0Rj{Q6aWAK2ms3fSzBJrNww<<000>v001EX0000000 +000005+c2sRi1aA|NaUv_0~WN&gWb#iQMX<{=kWq4y{aCB*JZgVbhc~DCM0u%!j000080LuVbTgNC%E +FcO10D~a_0384T00000000000HlF3Ko|gUX>c!Jc4cm4Z*nhna%^mAVlyvhX=Q9=b1rasP)h*<6ay3h +000O8%K%whhpWG%eggmihzS4y9{>OV0000000000q=Ah}7yxi-a4%nWWo~3|axZmqY;0*_GcRUoY-Mn +7b963nc~DCM0u%!j000080LuVbTRUdkn4cB^02WRF03rYY00000000000HlFPP8a}iX>c!Jc4cm4Z*n +hna%^mAVlyvrZ*OdEVQyh(WpXZXc~DCM0u%!j000080LuVbTL4*}jI#&;03#Xz03HAU00000000000H +lE@Wf%Z(X>c!Jc4cm4Z*nhna%^mAVlyvtWpQ<7b963nc~DCM0u%!j000080LuVbTTmdlI%6OJ0I_!f0 +3QGV00000000000HlEyZWsV?X>c!Jc4cm4Z*nhna%^mAVlyvtWpi+EZgXWWaCuNm0Rj{Q6aWAK2ms3f +Sz7=A0006200000001Wd0000000000005+cwvHG8aA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~OUtei +%X>?y-E^v8JO928D0~7!N00;of09jiqgXtBu0RRBK0{{Rq00000000000001_f&Gpc0B~t=FJE?LZe( +wAFLiQkY-wUMFJo_RbaH88FJEDBaAj_1X>Mg-Wo~w9a&K-faCuNm0Rj{Q6aWAK2ms3fSz8M3lZj*u00 +0~-001Ze0000000000005+c0g)I0aA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~OVQ_F|Zf9w3WiD`eP +)h*<6ay3h000O8%K%wh6=~@=QU(A3un_c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#Md2euKZgX>NE^v8JO928D0~7!N00;of09ji%{d6 +_GB>(`9h5!IA00000000000001_fmyj20B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FLPyMb#i5Na$ +#c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#5b7f<7a%FUKVQzD9Z*p`mUtei%X>?y +-E^v8JO928D0~7!N00;of09jiu&n->v5C8z+L;wId00000000000001_fmP@j0B~t=FJE?LZe(wAFLi +QkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT49QZe(e0XLBxac~DCM0u%!j000080LuVbTdpdnyj +c+d0Ae-(0672v00000000000HlGL`4|9jX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#5b7f<7a%FUKV +QzD9Z*p`mY;Sj8Y-M(3Y%XwlP)h*<6ay3h000O8%K%wh000000ssI200000C;$Ke0000000000q=88b +831r;a4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgiIUukY>bYEXCaCuNm0Rj{Q6aWAK2ms3fSzBC`8LTE +D003!+001KZ0000000000005+ckqa3BaA|NaUv_0~WN&gWb#iQMX<{=kaA9L>VP|D?FLP;lE^v8JO92 +8D0~7!N00;of09jiA00002000000000o00000000000001_f%q&L0B~t=FJE?LZe(wAFLiQkY-wUMFK +}UFYhh<)b1!0HV{344a&&VqUtei%X>?y-E^v8JO928D0~7!N00;of09jk!xMQD1^@ux6aWA^00000000000001_f#NS20B~t=FJE?LZe(wAFLiQkY-wU +MFK}UFYhh<)b1!0HV{344a&&VqcV%H~a%E;;W@&C=Y-xIBE^v8JO928D0~7!N00;of09jk+ikX_&0RR +Al1ONae00000000000001_fyFi%0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%gD5X>MtBUtcb8c~DCM0u +%!j000080LuVbTkNXj51I!603{Ou044wc00000000000HlH6I2izNX>c!Jc4cm4Z*nhna%^mAVlyvwb +ZKlaV{dM5Wn*+{Z*DGdc~DCM0u%!j000080LuVbTMExy2VMdI07V7>03iSX00000000000HlGvKp6mV +X>c!Jc4cm4Z*nhna%^mAVlyvwbZKlaaB^>Wc`k5yP)h*<6ay3h000O8%K%whP6PIz`~Uy|@&Nz?X>2cXb!ByBE^v8JO928D0~7!N00;of09j +i%j&1R)1pok@4*&oo00000000000001_ft5rV0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g+Uadl;LbS +`jtP)h*<6ay3h000O8%K%whHYnA!U?X>2cYWpi+EZgXWWaCuNm0Rj{Q6aWAK2ms3fSzBKfFZT);001IZ001EX0000000000005+c +BTyLtaA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLGsca(OOrc~DCM0u%!j000080LuVbTR1R}=I#~%05n7 +Z03ZMW00000000000HlFzXBhx+X>c!Jc4cm4Z*nhna%^mAVlyvwbZKlab8~E8E^v8JO928D0~7!N00; +of09jic!Jc4cm4Z*nhna%^mAVlyvwbZKlabZKp6Z*_DoaCuNm0Rj{ +Q6aWAK2ms3fSz9aB=w25S007uG0018V0000000000005+cIh+{)aA|NaUv_0~WN&gWb#iQMX<{=kb#! +TLFLiQkE^v8JO928D0~7!N00;of09jjB)K=BM2LJ#Y6#xJr00000000000001_fsL;j0B~t=FJE?LZe +(wAFLiQkY-wUMFLiWjY%h0VX>=}dc~DCQ1^@s60J;IX0sn^p0E)L60000 +""" + + +if __name__ == "__main__": + main() diff --git a/pyproject copy.toml b/pyproject copy.toml new file mode 100644 index 000000000000..aa5574018eb0 --- /dev/null +++ b/pyproject copy.toml @@ -0,0 +1,100 @@ +[tool.isort] + +py_version = 310 +line_length = 120 +group_by_package = true + +# Files to skip +skip_glob = ["docs/*", "logs/*", "_isaac_sim/*", ".vscode/*"] + +# Order of imports +sections = [ + "FUTURE", + "STDLIB", + "THIRDPARTY", + "ASSETS_FIRSTPARTY", + "FIRSTPARTY", + "EXTRA_FIRSTPARTY", + "TASK_FIRSTPARTY", + "LOCALFOLDER", +] + +# Extra standard libraries considered as part of python (permissive licenses +extra_standard_library = [ + "numpy", + "h5py", + "open3d", + "torch", + "tensordict", + "bpy", + "matplotlib", + "gymnasium", + "gym", + "scipy", + "hid", + "yaml", + "prettytable", + "toml", + "trimesh", + "tqdm", + "torchvision", + "transformers", + "einops" # Needed for transformers, doesn't always auto-install +] +# Imports from Isaac Sim and Omniverse +known_third_party = [ + "isaacsim.core.api", + "isaacsim.replicator.common", + "omni.replicator.core", + "pxr", + "omni.kit.*", + "warp", + "carb", + "Semantics", +] +# Imports from this repository +known_first_party = "isaaclab" +known_assets_firstparty = "isaaclab_assets" +known_extra_firstparty = [ + "isaaclab_rl", + "isaaclab_mimic", +] +known_task_firstparty = "isaaclab_tasks" +# Imports from the local folder +known_local_folder = "config" + +[tool.pyright] + +include = ["source", "scripts"] +exclude = [ + "**/__pycache__", + "**/_isaac_sim", + "**/docs", + "**/logs", + ".git", + ".vscode", +] + +typeCheckingMode = "basic" +pythonVersion = "3.11" +pythonPlatform = "Linux" +enableTypeIgnoreComments = true + +# This is required as the CI pre-commit does not download the module (i.e. numpy, torch, prettytable) +# Therefore, we have to ignore missing imports +reportMissingImports = "none" +# This is required to ignore for type checks of modules with stubs missing. +reportMissingModuleSource = "none" # -> most common: prettytable in mdp managers + +reportGeneralTypeIssues = "none" # -> raises 218 errors (usage of literal MISSING in dataclasses) +reportOptionalMemberAccess = "warning" # -> raises 8 errors +reportPrivateUsage = "warning" + + +[tool.codespell] +skip = '*.usd,*.svg,*.png,_isaac_sim*,*.bib,*.css,*/_build' +quiet-level = 0 +# the world list should always have words in lower case +ignore-words-list = "haa,slq,collapsable,buss,reacher" +# todo: this is hack to deal with incorrect spelling of "Environment" in the Isaac Sim grid world asset +exclude-file = "source/isaaclab/isaaclab/sim/spawners/from_files/from_files.py" diff --git a/pyproject.toml b/pyproject.toml index aa5574018eb0..01661906b2e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,67 +1,104 @@ -[tool.isort] - -py_version = 310 -line_length = 120 -group_by_package = true - -# Files to skip -skip_glob = ["docs/*", "logs/*", "_isaac_sim/*", ".vscode/*"] - -# Order of imports -sections = [ - "FUTURE", - "STDLIB", - "THIRDPARTY", - "ASSETS_FIRSTPARTY", - "FIRSTPARTY", - "EXTRA_FIRSTPARTY", - "TASK_FIRSTPARTY", - "LOCALFOLDER", +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +[tool.ruff] +line-length = 120 +target-version = "py310" + +# Exclude directories +extend-exclude = [ + "logs", + "_isaac_sim", + ".vscode", + "_*", + ".git", +] + +[tool.ruff.lint] +# Enable flake8 rules and other useful ones +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "I", # isort + "UP", # pyupgrade + "C90", # mccabe complexity + # "D", # pydocstyle + "SIM", # flake8-simplify + "RET", # flake8-return ] -# Extra standard libraries considered as part of python (permissive licenses -extra_standard_library = [ - "numpy", - "h5py", - "open3d", - "torch", - "tensordict", - "bpy", - "matplotlib", - "gymnasium", - "gym", - "scipy", - "hid", - "yaml", - "prettytable", - "toml", - "trimesh", - "tqdm", - "torchvision", - "transformers", - "einops" # Needed for transformers, doesn't always auto-install +# Ignore specific rules (matching your flake8 config) +ignore = [ + "E402", # Module level import not at top of file + "D401", # First line should be in imperative mood + "RET504", # Unnecessary variable assignment before return statement + "RET505", # Unnecessary elif after return statement + "SIM102", # Use a single if-statement instead of nested if-statements + "SIM103", # Return the negated condition directly + "SIM108", # Use ternary operator instead of if-else statement + "SIM117", # Merge with statements for context managers + "SIM118", # Use {key} in {dict} instead of {key} in {dict}.keys() + "UP006", # Use 'dict' instead of 'Dict' type annotation + "UP018", # Unnecessary `float` call (rewrite as a literal) ] -# Imports from Isaac Sim and Omniverse -known_third_party = [ - "isaacsim.core.api", - "isaacsim.replicator.common", - "omni.replicator.core", + +[tool.ruff.lint.per-file-ignores] +"__init__.py" = ["F401"] # Allow unused imports in __init__.py files + +[tool.ruff.lint.mccabe] +max-complexity = 30 + +[tool.ruff.lint.pydocstyle] +convention = "google" + +[tool.ruff.lint.isort] + +# Custom import sections with separate sections for each Isaac Lab extension +section-order = [ + "future", + "standard-library", + "third-party", + # Group omniverse extensions separately since they are run-time dependencies + # which are pulled in by Isaac Lab extensions + "omniverse-extensions", + # Group Isaac Lab extensions together since they are all part of the Isaac Lab project + "isaaclab", + "isaaclab-contrib", + "isaaclab-rl", + "isaaclab-mimic", + "isaaclab-tasks", + "isaaclab-assets", + # First-party is reserved for project templates + "first-party", + "local-folder", +] + +[tool.ruff.lint.isort.sections] +# Define what belongs in each custom section + +"omniverse-extensions" = [ + "isaacsim", + "omni", "pxr", - "omni.kit.*", - "warp", "carb", + "usdrt", "Semantics", + "curobo", ] -# Imports from this repository -known_first_party = "isaaclab" -known_assets_firstparty = "isaaclab_assets" -known_extra_firstparty = [ - "isaaclab_rl", - "isaaclab_mimic", -] -known_task_firstparty = "isaaclab_tasks" -# Imports from the local folder -known_local_folder = "config" + +"isaaclab" = ["isaaclab"] +"isaaclab-assets" = ["isaaclab_assets"] +"isaaclab-contrib" = ["isaaclab_contrib"] +"isaaclab-rl" = ["isaaclab_rl"] +"isaaclab-mimic" = ["isaaclab_mimic"] +"isaaclab-tasks" = ["isaaclab_tasks"] + +[tool.ruff.format] + +docstring-code-format = true [tool.pyright] @@ -92,9 +129,14 @@ reportPrivateUsage = "warning" [tool.codespell] -skip = '*.usd,*.svg,*.png,_isaac_sim*,*.bib,*.css,*/_build' +skip = '*.usd,*.usda,*.usdz,*.svg,*.png,_isaac_sim*,*.bib,*.css,*/_build' quiet-level = 0 # the world list should always have words in lower case -ignore-words-list = "haa,slq,collapsable,buss,reacher" -# todo: this is hack to deal with incorrect spelling of "Environment" in the Isaac Sim grid world asset -exclude-file = "source/isaaclab/isaaclab/sim/spawners/from_files/from_files.py" +ignore-words-list = "haa,slq,collapsable,buss,reacher,thirdparty" + + +[tool.pytest.ini_options] + +markers = [ + "isaacsim_ci: mark test to run in isaacsim ci", +] \ No newline at end of file diff --git a/regenerate_vial_collision.py b/regenerate_vial_collision.py new file mode 100644 index 000000000000..d9058e6a0564 --- /dev/null +++ b/regenerate_vial_collision.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +"""Script to regenerate USD files for vial rack and capped vial with proper collision meshes.""" + +from isaaclab.app import AppLauncher + +# Launch Isaac Sim +app_launcher = AppLauncher(headless=True) +simulation_app = app_launcher.app + +import os +from isaaclab.sim.converters import MeshConverter, MeshConverterCfg +from isaaclab.sim.schemas import schemas_cfg +from isaaclab.utils.dict import print_dict + +def regenerate_vial_rack(): + """Regenerate vial rack USD with convex decomposition.""" + print("=" * 80) + print("Regenerating Vial Rack USD with Convex Decomposition") + print("=" * 80) + + mesh_converter_cfg = MeshConverterCfg( + asset_path="/workspace/isaaclab/source/isaaclab_assets/isaaclab_assets/glassware/vial_rack/vial_rack.obj", + usd_dir="/workspace/isaaclab/source/isaaclab_assets/isaaclab_assets/glassware/vial_rack", + usd_file_name="vial_rack.usd", + force_usd_conversion=True, + make_instanceable=True, + mass_props=schemas_cfg.MassPropertiesCfg(mass=0.1), + rigid_props=schemas_cfg.RigidBodyPropertiesCfg(), + collision_props=schemas_cfg.CollisionPropertiesCfg(collision_enabled=True), + mesh_collision_props=schemas_cfg.ConvexDecompositionPropertiesCfg( + max_convex_hulls=64, + voxel_resolution=1000000, + hull_vertex_limit=64, + min_thickness=0.0005 + ), + translation=(0.0, 0.0, 0.0), + rotation=(1.0, 0.0, 0.0, 0.0), + scale=(1.0, 1.0, 1.0), + ) + + print("Config:") + print_dict(mesh_converter_cfg.to_dict(), nesting=0) + + mesh_converter = MeshConverter(mesh_converter_cfg) + print(f"✓ Generated: {mesh_converter.usd_path}") + print() + +def regenerate_capped_vial(): + """Regenerate capped vial USD with convex hull.""" + print("=" * 80) + print("Regenerating Capped Vial USD with Convex Hull") + print("=" * 80) + + mesh_converter_cfg = MeshConverterCfg( + asset_path="/workspace/isaaclab/source/isaaclab_assets/isaaclab_assets/glassware/vial_with_cap/vial_with_cap.obj", + usd_dir="/workspace/isaaclab/source/isaaclab_assets/isaaclab_assets/glassware/vial_with_cap", + usd_file_name="vial_with_cap.usd", + force_usd_conversion=True, + make_instanceable=True, + mass_props=schemas_cfg.MassPropertiesCfg(mass=0.01), + rigid_props=schemas_cfg.RigidBodyPropertiesCfg(), + collision_props=schemas_cfg.CollisionPropertiesCfg(collision_enabled=True), + mesh_collision_props=schemas_cfg.ConvexHullPropertiesCfg( + hull_vertex_limit=32, + min_thickness=0.0005 + ), + translation=(0.0, 0.0, 0.0), + rotation=(1.0, 0.0, 0.0, 0.0), + scale=(1.0, 1.0, 1.0), + ) + + print("Config:") + print_dict(mesh_converter_cfg.to_dict(), nesting=0) + + mesh_converter = MeshConverter(mesh_converter_cfg) + print(f"✓ Generated: {mesh_converter.usd_path}") + print() + +if __name__ == "__main__": + regenerate_vial_rack() + regenerate_capped_vial() + print("=" * 80) + print("✓ All USD files regenerated successfully!") + print("=" * 80) + simulation_app.close() diff --git a/ros2/src b/ros2/src new file mode 160000 index 000000000000..a739caa35161 --- /dev/null +++ b/ros2/src @@ -0,0 +1 @@ +Subproject commit a739caa35161035f3a4505fb077068e9adf51172 diff --git a/scripts/imitation_learning/robomimic/backup_controller.py b/scripts/imitation_learning/robomimic/backup_controller.py index 6d63069dd340..f529e417e227 100644 --- a/scripts/imitation_learning/robomimic/backup_controller.py +++ b/scripts/imitation_learning/robomimic/backup_controller.py @@ -226,7 +226,7 @@ def infer_state_machine( pose_pos = wp.transform_get_translation(final_object_pose[tid]) pose_rot = wp.transform_get_rotation(final_object_pose[tid]) # Apply offset in x-direction (5 cm = 0.05 m) - offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z+0.02) + offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z+0.01) des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) gripper_state[tid] = GripperState.CLOSE # wait for a while @@ -411,9 +411,10 @@ def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, curren dist = np.linalg.norm(cur_pos - des_pos) # print(f"StateMachine debug state {debug_state}") # print(f"[Env {i}]") + # print(f" Goal pose : {final_object_pose}") # print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") # print(f" Desired -> pos: {des_pos}, quat: {des_quat}") - #print(f" Euclidean distance: {dist:.4f}") + # print(f" Euclidean distance: {dist:.4f}") #print(f"returned state : {self.sm_state}") # convert transformations back to (w, x, y, z) des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] diff --git a/scripts/imitation_learning/robomimic/backup_controller_handler.py b/scripts/imitation_learning/robomimic/backup_controller_handler.py index e3b336e1bfd3..f6e63d51df63 100644 --- a/scripts/imitation_learning/robomimic/backup_controller_handler.py +++ b/scripts/imitation_learning/robomimic/backup_controller_handler.py @@ -4,17 +4,24 @@ from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg, BinaryJointPositionActionCfg from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction from backup_controller import BackupControllerSM +from backup_controller_place import BackupControllerPlaceSM +from backup_controller_insert import BackupControllerInsertSM import torch class BackupController: - def __init__(self,env, device): + def __init__(self,env, device, tasktype="lift"): self.env = env self.sim = env.unwrapped.sim self.num_envs = env.num_envs self.device = device + self.tasktype = tasktype self.rest_pos = self._get_rest_pos() - self.backup_controller = BackupControllerSM(0.01*2, self.num_envs,'cuda' , 0.02) + self.goal_quat = self._get_goal_pos() + self.object_goal_pos = self._get_goal_pos() + self.object_goal_rot = self._get_goal_rot() + self.object_start_pose = self._get_start_pos() + self.backup_controller = self._get_controller()#BackupControllerSM(0.01*2, self.num_envs,'cuda' , 0.02) self.robot = env.unwrapped.scene["robot"] self.robot_entity_cfg , self.ee_jacobi_idx = self._setup_robot() self.state_guess = 0 @@ -22,10 +29,50 @@ def __init__(self,env, device): self.clamp = 0.05 self.rot_gain = 1.0 self.rot_clamp = 0.5 - self.object_start_pose = self._get_start_pos() - + + self.reset() + def _get_controller(self): + match self.tasktype: + case "lift": + return BackupControllerSM(0.01*2, self.num_envs,'cuda' , 0.02) + case "place": + print(f"[DEBUG] Using Place Backup Controller") + return BackupControllerPlaceSM(dt=0.01*2, num_envs=self.num_envs, position_threshold=0.02, device='cuda', offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0'), goal_quat = self.object_goal_rot, goal_pos= self.object_goal_pos) + case "insert": + return BackupControllerInsertSM(0.01*2, self.num_envs,'cuda' , 0.02) + case _: + raise ValueError(f"Unknown task type {self.tasktype} for backup controller") + + def _get_goal_pos(self): + match self.tasktype: + case "lift": + goal_rot = self.env.unwrapped.command_manager.get_command("object_pose") + # print(f"[DEBUG] Getting goal quat for lift task {goal_rot}") + return self.env.unwrapped.command_manager.get_command("object_pose") + case "place": + goal_pos = self.env.unwrapped.scene["scale"].data.root_pose_w + # print(f"[DEBUG] Getting goal pos for place task {goal_pos}") + return self.env.unwrapped.scene["scale"].data.root_pose_w + + case "insert": + return self.env.unwrapped.scene["vialrack"].data.root_pose_w + + def _get_goal_rot(self): + match self.tasktype: + case "lift": + goal_rot = self.env.unwrapped.command_manager.get_command("object_pose") + print(f"[DEBUG] Getting goal quat for lift task {goal_rot}") + return self.env.unwrapped.command_manager.get_command("object_pose") + case "place": + goal_rot = self.env.unwrapped.command_manager.get_command("object_pose") + print(f"[DEBUG] Getting goal quat for place task {goal_rot}") + return self.env.unwrapped.command_manager.get_command("object_pose") + + case "insert": + return self.env.unwrapped.scene["vialrack"].data.root_pose_w + def reset(self): self.backup_controller.reset_idx() @@ -33,6 +80,8 @@ def _get_start_pos(self): object_pose_w = self.env.unwrapped.scene["object"].data.root_pose_w return object_pose_w + + def _get_rest_pos(self): rest_pos = torch.tensor([[0.5206, 0.0096, 0.3751]], device=self.device) ee_recovery_rot = torch.tensor([[ 0.6664, 0.0360, 0.7414, -0.0705]], device=self.device) @@ -64,8 +113,9 @@ def get_controller_action(self, state_guess, env_num): root_pose_w[:, 0:3], root_pose_w[:, 3:7], ee_pose_w[:, 0:3], ee_pose_w[:, 3:7] ) - object_pose = self.env.unwrapped.command_manager.get_command("object_pose") - ee_recovery, gripper , state_guess= self.backup_controller.compute(ee_pose =ee_pose_w, start_object_pose = self.object_start_pose, current_object_pose=current_object_pose, final_object_pose=object_pose, rest_pose=self.rest_pos, sm_state=state_guess) + + #object_pose = self.env.unwrapped.command_manager.get_command("object_pose") + ee_recovery, gripper , state_guess= self.backup_controller.compute(ee_pose =ee_pose_w, start_object_pose = self.object_start_pose, current_object_pose=current_object_pose, final_object_pose=self.object_goal_pos, rest_pose=self.rest_pos, sm_state=state_guess) #print(f"[BAKCUP] state {state_guess}") #return ee_recovery , gripper , state_guess diff --git a/scripts/imitation_learning/robomimic/backup_controller_insert.py b/scripts/imitation_learning/robomimic/backup_controller_insert.py new file mode 100644 index 000000000000..5c12bdd60aea --- /dev/null +++ b/scripts/imitation_learning/robomimic/backup_controller_insert.py @@ -0,0 +1,423 @@ +import warp as wp +import gymnasium as gym +import torch +from collections.abc import Sequence +import numpy as np + +# this is a backup state machine controller +# initialize warp +wp.init() + + +class GripperState: + """States for the gripper.""" + + OPEN = wp.constant(1.0) + CLOSE = wp.constant(-1.0) + +class BackupSMWaitTime: + """Additional wait times (in s) for states for before switching.""" + + REST = wp.constant(0.5) + APPROACH_ABOVE_OBJECT = wp.constant(0.3) + APPROACH_OBJECT = wp.constant(0.3) + GRASP_OBJECT = wp.constant(0.1) # 1 second wait + 0.3 for gripper to close + LIFT_OBJECT = wp.constant(0.3) + MIDPOINT = wp.constant(0.1) + APPROACH_ABOVE_GOAL = wp.constant(0.1) + APPROACH_GOAL = wp.constant(6) + +class BackupSM: + """States for the pick state machine.""" + + REST = wp.constant(0) + APPROACH_ABOVE_OBJECT = wp.constant(1) + APPROACH_OBJECT = wp.constant(2) + GRASP_OBJECT = wp.constant(3) + LIFT_OBJECT = wp.constant(4) + MIDPOINT = wp.constant(5) + APPROACH_ABOVE_GOAL = wp.constant(6) + APPROACH_GOAL = wp.constant(7) + #UNGRASP_OBJECT = wp.constant(7) + +@wp.func +def distance_below_threshold(current_pos: wp.vec3, desired_pos: wp.vec3, threshold: float) -> bool: + return wp.length(current_pos - desired_pos) < threshold + + +@wp.kernel +def infer_state_machine( + dt: wp.array(dtype=float), + sm_state: wp.array(dtype=int), + sm_wait_time: wp.array(dtype=float), + ee_pose: wp.array(dtype=wp.transform), # current ee pose + object_pose: wp.array(dtype=wp.transform), # start object location + current_object_pose: wp.array(dtype=wp.transform), # current object pose + final_object_pose: wp.array(dtype=wp.transform), + rest_ee_pose : wp.array(dtype=wp.transform), # rest position + des_ee_pose: wp.array(dtype=wp.transform), # what we return + gripper_state: wp.array(dtype=float), + offset: wp.array(dtype=wp.transform), + position_threshold: float, + debug_des_pose: wp.array(dtype=wp.transform), # NEW + debug_cur_pose: wp.array(dtype=wp.transform), # NEW + debug_state: wp.array(dtype=int), # New +): + # retrieve thread id + tid = wp.tid() + # retrieve state machine state + state = sm_state[tid] + # decide next state + if state == BackupSM.REST: + # First lift up to a safe height, then go to rest position + current_ee_pos = wp.transform_get_translation(ee_pose[tid]) + rest_pos = wp.transform_get_translation(rest_ee_pose[tid]) + rest_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + + # If we're below safe height, first move up + safe_height = 0.35 # Safe z-height to avoid collisions + if current_ee_pos.z < safe_height: + # Lift straight up first + lift_pos = wp.vec3(current_ee_pos.x, current_ee_pos.y, safe_height) + des_ee_pose[tid] = wp.transform(lift_pos, rest_rot) + else: + # Already at safe height, move to rest position + des_ee_pose[tid] = rest_ee_pose[tid] + + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(rest_ee_pose[tid]), + 0.02, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.REST: + print("[SM_INFO] : Moving from REST to APPROACH_ABOVE_OBJECT") + # move to next state and reset wait time + sm_state[tid] = BackupSM.APPROACH_ABOVE_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_ABOVE_OBJECT: + # print("[SM] APPR above obj") + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Go to a safe height ABOVE the object (z + 0.15m) with x offset + safe_above_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y, pose_pos.z + 0.15) + des_ee_pose[tid] = wp.transform(safe_above_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN # Open gripper in preparation + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + position_threshold, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_ABOVE_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from APPR_ABOVE to APPROACH_OBJECT") + sm_state[tid] = BackupSM.APPROACH_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_OBJECT: + # print("[SM] approach object") + + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.02) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + position_threshold, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from APPR_OBJ to GRASP_OBJECT") + sm_state[tid] = BackupSM.GRASP_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.GRASP_OBJECT: + # print("[SM] GRASP") + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Stay at the approach position while closing gripper + offset_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y + 0.02, pose_pos.z + 0.02) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.GRASP_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from GRSP to LIFT_OBJECT") + sm_state[tid] = BackupSM.LIFT_OBJECT + sm_wait_time[tid] = 0.0 + + elif state == BackupSM.LIFT_OBJECT: + #print("[SM] LIFT") # uses starting position + pose_pos = wp.transform_get_translation(object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.03, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.LIFT_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from LIFT to MIDPOINT") + sm_state[tid] = BackupSM.MIDPOINT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.MIDPOINT: + #print("[SM] MIDPOINT") + pose_pos = wp.transform_get_translation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + #offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 + des_ee_pose[tid] = rest_ee_pose[tid] + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.03, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.LIFT_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from MID to APPR goal") + sm_state[tid] = BackupSM.APPROACH_ABOVE_GOAL + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_ABOVE_GOAL: + #print("[SM] Approach above goal") + offset_pos = wp.transform_get_translation(offset[tid]) + offset_rot = wp.transform_get_rotation(offset[tid]) + offset_pos = wp.vec3(offset_pos.x, offset_pos.y, offset_pos.z) # raise 25 cm + new_offset = wp.transform(offset_pos, offset_rot) + above_target_pose = wp.transform_multiply(new_offset, final_object_pose[tid]) + # Blend time for smooth approach + APPROACH_BLEND_TIME = 0.4 # seconds, tune as needed + alpha = wp.clamp(sm_wait_time[tid] / APPROACH_BLEND_TIME, 0.0, 1.0) + # Interpolate position and rotation + current_pos = wp.transform_get_translation(ee_pose[tid]) + current_rot = wp.transform_get_rotation(ee_pose[tid]) + + target_pos = wp.transform_get_translation(above_target_pose) + target_rot = wp.transform_get_rotation(above_target_pose) + + pos_interp = wp.lerp(current_pos, target_pos, alpha) + rot_interp = wp.quat_slerp(current_rot, target_rot, alpha) + # Set interpolated pose + des_ee_pose[tid] = wp.transform(pos_interp, rot_interp) + gripper_state[tid] = GripperState.CLOSE + # Evaluate readiness to transition + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.02): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_ABOVE_GOAL: + print("[SM_INFO] : Moving from APPR_ABOVE to APPROACH_GOAL") + sm_state[tid] = BackupSM.APPROACH_GOAL + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_GOAL: + #print("[SM] approach goal") + # print("[SM_INFO] : in state ungrasp") + pose_pos = wp.transform_get_translation(final_object_pose[tid]) + pose_rot = wp.transform_get_rotation(final_object_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z+0.02) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.01, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_GOAL: + # move to next state and reset wait time + print("[SM_INFO] : Moving from apprach goal to rest") + sm_state[tid] = BackupSM.REST + sm_wait_time[tid] = 0.0 + + + # increment wait time + sm_wait_time[tid] = sm_wait_time[tid] + dt[tid] + debug_des_pose[tid] = des_ee_pose[tid] + debug_cur_pose[tid] = ee_pose[tid] + debug_state[tid] = sm_state[tid] + + + +class BackupControllerInsertSM: + def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", position_threshold=0.02, offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0')): + """Initialize the state machine. + + Args: + dt: The environment time step. + num_envs: The number of environments to simulate. + device: The device to run the state machine on. + """ + ## debug + + print(f'dt : {dt},num_envs {num_envs}, device {device}, pos_thresh {position_threshold} ') + # save parameters + self.dt = float(dt) + self.num_envs = num_envs + self.device = device + self.position_threshold = position_threshold + + # initialize state machine + self.sm_dt = torch.full((self.num_envs,), self.dt, device=self.device) + self.sm_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) + self.sm_wait_time = torch.zeros((self.num_envs,), device=self.device) + + # desired state + self.des_ee_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.des_gripper_state = torch.full((self.num_envs,), 0.0, device=self.device) + self.final_object_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.rest_pose = torch.zeros((self.num_envs, 7), device=self.device) + # approach above object offset + + self.offset = torch.zeros((self.num_envs, 7), device=self.device) + self.offset[:, 2] = 0.2 + self.offset[:,0] = -0.1 + self.offset[:, -1] = 1.0 # warp expects quaternion as (x, y, z, w) + + # convert to warp + self.sm_dt_wp = wp.from_torch(self.sm_dt, wp.float32) + self.sm_state_wp = wp.from_torch(self.sm_state, wp.int32) + self.sm_wait_time_wp = wp.from_torch(self.sm_wait_time, wp.float32) + self.des_ee_pose_wp = wp.from_torch(self.des_ee_pose, wp.transform) + self.des_gripper_state_wp = wp.from_torch(self.des_gripper_state, wp.float32) + self.final_object_pose_wp = wp.from_torch(self.final_object_pose, wp.transform) + self.rest_pose_wp = wp.from_torch(self.rest_pose, wp.transform) + self.offset_wp = wp.from_torch(self.offset, wp.transform) + ## For Debug + self.debug_des_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.debug_cur_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.debug_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) + + self.debug_des_pose_wp = wp.from_torch(self.debug_des_pose, wp.transform) + self.debug_cur_pose_wp = wp.from_torch(self.debug_cur_pose, wp.transform) + self.debug_state_wp = wp.from_torch(self.debug_state, wp.int32) + + def reset_idx(self, env_ids: Sequence[int] = None): + """Reset the state machine.""" + print(f'[SM RESET]') + if env_ids is None: + env_ids = slice(None) + self.sm_state[env_ids] = 0 + self.sm_wait_time[env_ids] = 0.0 + + def _ensure_7d(self,tensor: torch.Tensor, device): + # accepts (N,3) -> returns (N,7) with identity quaternion + if tensor.ndim != 2: + raise ValueError(f"expected 2D tensor, got shape {tensor.shape}") + if tensor.shape[1] == 7: + return tensor + if tensor.shape[1] == 3: + quat = torch.tensor([0.0,0.0,0.0,1.0], device=device, dtype=tensor.dtype) + quat = quat.unsqueeze(0).expand(tensor.shape[0], -1) + return torch.cat([tensor, quat], dim=-1) + raise ValueError(f"pose must have 3 or 7 elements, got {tensor.shape[1]}") + + + def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, current_object_pose: torch.Tensor, final_object_pose: torch.Tensor, rest_pose: torch.Tensor, sm_state: int =0, env_num = 0) -> torch.Tensor: + """Compute the desired state of the robot's end-effector and the gripper.""" + # convert all transformations from (w, x, y, z) to (x, y, z, w) + # print(f'[SM DEBUG] Doing State Comp') + # print(f'[SM DEBUG] ee_pose {ee_pose}') + # print(f'[SM DEBUG] object pose {object_pose}') + # print(f'[SM DEBUG] desired pose {des_object_pose}') + # print(f'[SM DEBUG] final pose {final_object_pose}') + # print(f'[SM DEBUG] rest pose {rest_pose}') + # before reordering + # print("\n[BackupControllerSM::compute] called with inputs:") + # print(f" sm_state: {sm_state}, env_num: {env_num}") + + # def short_tensor(t, name): + # if t is None: + # print(f" {name}: None") + # elif not isinstance(t, torch.Tensor): + # print(f" {name}: {t} (type={type(t)})") + # else: + # shape = tuple(t.shape) + # device = t.device + # dtype = t.dtype + # # show first few elements flattened + # vals = t.flatten()[:6].detach().cpu().numpy() + # print(f" {name}: shape={shape}, device={device}, dtype={dtype}, values={vals}") + + # short_tensor(ee_pose, "ee_pose") + # short_tensor(object_pose, "object_pose") + # short_tensor(des_object_pose, "des_object_pose") + # short_tensor(final_object_pose, "final_object_pose") + # short_tensor(rest_pose, "rest_pose") + # print("-" * 80) + # print(f"Got given state {sm_state}") + current_object_pose = self._ensure_7d(current_object_pose, self.device) + final_object_pose = self._ensure_7d(final_object_pose, self.device) + ee_pose = self._ensure_7d(ee_pose, self.device) + start_object_pose = self._ensure_7d(start_object_pose, self.device) + rest_pose = self._ensure_7d(rest_pose, self.device) + # now safe to reorder + ee_pose = ee_pose[:, [0, 1, 2, 4, 5, 6, 3]] + start_object_pose = start_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + current_object_pose = current_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + final_object_pose = final_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + rest_pose = rest_pose[:, [0, 1, 2, 4, 5, 6, 3]] + # convert to warp + ee_pose_wp = wp.from_torch(ee_pose.contiguous(), wp.transform) + start_object_pose_wp = wp.from_torch(start_object_pose.contiguous(), wp.transform) + current_object_pose_wp = wp.from_torch(current_object_pose.contiguous(), wp.transform) + final_object_pose_wp = wp.from_torch(final_object_pose.contiguous(), wp.transform) + rest_pose_wp = wp.from_torch(rest_pose.contiguous(), wp.transform) + # run state machine + # get state from env - convert to warp again + self.sm_state[env_num] = sm_state + self.sm_state_wp = wp.from_torch(self.sm_state, wp.int32) + # launch + wp.launch( + kernel=infer_state_machine, + dim=self.num_envs, + inputs=[ + self.sm_dt_wp, + self.sm_state_wp, + self.sm_wait_time_wp, + ee_pose_wp, + start_object_pose_wp, + current_object_pose_wp, + final_object_pose_wp, + rest_pose_wp, + self.des_ee_pose_wp, + self.des_gripper_state_wp, + self.offset_wp, + self.position_threshold, + self.debug_des_pose_wp, + self.debug_cur_pose_wp, + self.debug_state_wp, + ], + device=self.device, + ) + des_debug = self.debug_des_pose.detach().cpu().numpy() + cur_debug = self.debug_cur_pose.detach().cpu().numpy() + debug_state = self.debug_state.detach().cpu().numpy() + for i in range(self.num_envs): + des_pos, des_quat = des_debug[i][:3], des_debug[i][3:] + cur_pos, cur_quat = cur_debug[i][:3], cur_debug[i][3:] + # compute Euclidean distance with numpy + dist = np.linalg.norm(cur_pos - des_pos) + # print(f"StateMachine debug state {debug_state}") + # print(f"[Env {i}]") + # print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") + # print(f" Desired -> pos: {des_pos}, quat: {des_quat}") + #print(f" Euclidean distance: {dist:.4f}") + #print(f"returned state : {self.sm_state}") + # convert transformations back to (w, x, y, z) + des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] + # convert to torch + #print(f'[SM DEBUG] new desired poition : {des_ee_pose}, gripper state {self.des_gripper_state}') + return des_ee_pose , self.des_gripper_state, self.sm_state.clone().item() + #return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/backup_controller_place.py b/scripts/imitation_learning/robomimic/backup_controller_place.py new file mode 100644 index 000000000000..e68256b52eff --- /dev/null +++ b/scripts/imitation_learning/robomimic/backup_controller_place.py @@ -0,0 +1,456 @@ +import warp as wp +import gymnasium as gym +import torch +from collections.abc import Sequence +import numpy as np + +# this is a backup state machine controller +# initialize warp +wp.init() + + +class GripperState: + """States for the gripper.""" + + OPEN = wp.constant(1.0) + CLOSE = wp.constant(-1.0) + +class BackupSMWaitTime: + """Additional wait times (in s) for states for before switching.""" + + REST = wp.constant(0.5) + APPROACH_ABOVE_OBJECT = wp.constant(0.3) + APPROACH_OBJECT = wp.constant(0.3) + GRASP_OBJECT = wp.constant(0.1) # 1 second wait + 0.3 for gripper to close + LIFT_OBJECT = wp.constant(0.3) + MIDPOINT = wp.constant(0.1) + APPROACH_ABOVE_GOAL = wp.constant(0.1) + APPROACH_GOAL = wp.constant(0.1) + UNGRASP_OBJECT = wp.constant(1.0) + +class BackupSM: + """States for the pick state machine.""" + + REST = wp.constant(0) + APPROACH_ABOVE_OBJECT = wp.constant(1) + APPROACH_OBJECT = wp.constant(2) + GRASP_OBJECT = wp.constant(3) + LIFT_OBJECT = wp.constant(4) + MIDPOINT = wp.constant(5) + APPROACH_ABOVE_GOAL = wp.constant(6) + APPROACH_GOAL = wp.constant(7) + UNGRASP_OBJECT = wp.constant(8) + +@wp.func +def distance_below_threshold(current_pos: wp.vec3, desired_pos: wp.vec3, threshold: float) -> bool: + return wp.length(current_pos - desired_pos) < threshold + + +@wp.kernel +def infer_state_machine( + dt: wp.array(dtype=float), + sm_state: wp.array(dtype=int), + sm_wait_time: wp.array(dtype=float), + ee_pose: wp.array(dtype=wp.transform), # current ee pose + object_pose: wp.array(dtype=wp.transform), # start object location + current_object_pose: wp.array(dtype=wp.transform), # current object pose + final_object_pose: wp.array(dtype=wp.transform), + rest_ee_pose : wp.array(dtype=wp.transform), # rest position + goal_quat : wp.array(dtype=wp.transform), # goal rotation + des_ee_pose: wp.array(dtype=wp.transform), # what we return + gripper_state: wp.array(dtype=float), + offset: wp.array(dtype=wp.transform), + position_threshold: float, + debug_des_pose: wp.array(dtype=wp.transform), # NEW + debug_cur_pose: wp.array(dtype=wp.transform), # NEW + debug_state: wp.array(dtype=int), # New +): + # retrieve thread id + tid = wp.tid() + # retrieve state machine state + state = sm_state[tid] + # decide next state + if state == BackupSM.REST: + # print("[SM State REST]") + # First lift up to a safe height, then go to rest position + current_ee_pos = wp.transform_get_translation(ee_pose[tid]) + rest_pos = wp.transform_get_translation(rest_ee_pose[tid]) + rest_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + + # If we're below safe height, first move up + safe_height = 0.15 # Safe z-height to avoid collisions + if current_ee_pos.z < safe_height: + # Lift straight up first + lift_pos = wp.vec3(current_ee_pos.x, current_ee_pos.y, safe_height) + des_ee_pose[tid] = wp.transform(lift_pos, rest_rot) + #print("[SM REST doing safe ee lift]") + else: + # Already at safe height, move to rest position + des_ee_pose[tid] = rest_ee_pose[tid] + + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(rest_ee_pose[tid]), + 0.02, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.REST: + print("[SM_INFO] : Moving from REST to APPROACH_ABOVE_OBJECT") + # move to next state and reset wait time + sm_state[tid] = BackupSM.APPROACH_ABOVE_OBJECT + sm_wait_time[tid] = 0.0 + else: + print("[SM REST] wait timer ") + elif state == BackupSM.APPROACH_ABOVE_OBJECT: + # print("[SM] APPR above obj") + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Go to a safe height ABOVE the object (z + 0.15m) with x offset + safe_above_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y, pose_pos.z + 0.15) + des_ee_pose[tid] = wp.transform(safe_above_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN # Open gripper in preparation + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + position_threshold, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_ABOVE_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from APPR_ABOVE to APPROACH_OBJECT") + sm_state[tid] = BackupSM.APPROACH_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_OBJECT: + # print("[SM] approach object") + + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.02) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + position_threshold, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from APPR_OBJ to GRASP_OBJECT") + sm_state[tid] = BackupSM.GRASP_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.GRASP_OBJECT: + # print("[SM] GRASP") + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Stay at the approach position while closing gripper + offset_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y + 0.02, pose_pos.z + 0.02) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.GRASP_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from GRSP to LIFT_OBJECT") + sm_state[tid] = BackupSM.LIFT_OBJECT + sm_wait_time[tid] = 0.0 + + elif state == BackupSM.LIFT_OBJECT: + #print("[SM] LIFT") # uses starting position + pose_pos = wp.transform_get_translation(object_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.03, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.LIFT_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from LIFT to MIDPOINT") + sm_state[tid] = BackupSM.MIDPOINT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.MIDPOINT: + #print("[SM] MIDPOINT") + pose_pos = wp.transform_get_translation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + #offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 + des_ee_pose[tid] = rest_ee_pose[tid] + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.03, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.LIFT_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from MID to APPR goal") + sm_state[tid] = BackupSM.APPROACH_ABOVE_GOAL + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_ABOVE_GOAL: + #print("[SM] Approach above goal") + offset_pos = wp.transform_get_translation(final_object_pose[tid]) + offset_rot = wp.transform_get_rotation(goal_quat[tid]) + safe_above_pos = wp.vec3(offset_pos.x, offset_pos.y + 0.1, offset_pos.z + 0.25) + #offset_pos = wp.vec3(offset_pos.x, offset_pos.y, offset_pos.z) # raise 25 cm + above_target_pose = wp.transform(safe_above_pos, offset_rot) + #above_target_pose = wp.transform_multiply(new_offset, final_object_pose[tid]) + # Blend time for smooth approach + # APPROACH_BLEND_TIME = 0.4 # seconds, tune as needed + # alpha = wp.clamp(sm_wait_time[tid] / APPROACH_BLEND_TIME, 0.0, 1.0) + # # Interpolate position and rotation + # current_pos = wp.transform_get_translation(ee_pose[tid]) + # current_rot = wp.transform_get_rotation(ee_pose[tid]) + + # target_pos = wp.transform_get_translation(above_target_pose) + # target_rot = wp.transform_get_rotation(above_target_pose) + + # pos_interp = wp.lerp(current_pos, target_pos, alpha) + # rot_interp = wp.quat_slerp(current_rot, target_rot, alpha) + # # Set interpolated pose + # des_ee_pose[tid] = wp.transform(pos_interp, rot_interp) + #safe_above_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y, pose_pos.z + 0.15) + des_ee_pose[tid] = above_target_pose + gripper_state[tid] = GripperState.CLOSE + # Evaluate readiness to transition + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.02): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_ABOVE_GOAL: + print("[SM_INFO] : Moving from APPR_ABOVE to APPROACH_GOAL") + sm_state[tid] = BackupSM.APPROACH_GOAL + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_GOAL: + #print("[SM] approach goal") + # print("[SM_INFO] : in state ungrasp") + pose_pos = wp.transform_get_translation(final_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z+0.1) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.02, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_GOAL: + # move to next state and reset wait time + print("[SM_INFO] : Moving from approach goal to ungrasp") + sm_state[tid] = BackupSM.UNGRASP_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.UNGRASP_OBJECT: + # print("[SM] GRASP") + pose_pos = wp.transform_get_translation(ee_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Stay at the approach position while closing gripper + offset_pos = wp.vec3(pose_pos.x , pose_pos.y + 0.15, pose_pos.z) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.UNGRASP_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from UNGRASP_OBJECT to REST") + sm_state[tid] = BackupSM.REST + sm_wait_time[tid] = 0.0 + + # increment wait time + sm_wait_time[tid] = sm_wait_time[tid] + dt[tid] + debug_des_pose[tid] = des_ee_pose[tid] + debug_cur_pose[tid] = ee_pose[tid] + debug_state[tid] = sm_state[tid] + + + +class BackupControllerPlaceSM: + def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", position_threshold=0.02, offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0'), goal_quat = torch.tensor([[0, 0, 0, 0,0,0,0]], device='cuda:0'), goal_pos = torch.tensor([[0, 0, 0, 0,0,0,0]], device='cuda:0')): + """Initialize the state machine. + + Args: + dt: The environment time step. + num_envs: The number of environments to simulate. + device: The device to run the state machine on. + """ + ## debug + + print(f'dt : {dt},num_envs {num_envs}, \n device {device}, pos_thresh {position_threshold} \n goal_quat {goal_quat} \n goal_pos {goal_pos}') + # save parameters + self.dt = float(dt) + self.num_envs = num_envs + self.device = device + self.position_threshold = position_threshold + self.goal_quat = goal_quat + self.goal_pos = goal_pos + # initialize state machine + self.sm_dt = torch.full((self.num_envs,), self.dt, device=self.device) + self.sm_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) + self.sm_wait_time = torch.zeros((self.num_envs,), device=self.device) + + # desired state + self.des_ee_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.des_gripper_state = torch.full((self.num_envs,), 0.0, device=self.device) + self.final_object_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.rest_pose = torch.zeros((self.num_envs, 7), device=self.device) + + # approach above object offset + + self.offset = torch.zeros((self.num_envs, 7), device=self.device) + self.offset[:, 2] = 0.2 + self.offset[:,0] = -0.1 + self.offset[:, -1] = 1.0 # warp expects quaternion as (x, y, z, w) + + # convert to warp + self.sm_dt_wp = wp.from_torch(self.sm_dt, wp.float32) + self.sm_state_wp = wp.from_torch(self.sm_state, wp.int32) + self.sm_wait_time_wp = wp.from_torch(self.sm_wait_time, wp.float32) + self.des_ee_pose_wp = wp.from_torch(self.des_ee_pose, wp.transform) + self.des_gripper_state_wp = wp.from_torch(self.des_gripper_state, wp.float32) + self.final_object_pose_wp = wp.from_torch(self.final_object_pose, wp.transform) + self.rest_pose_wp = wp.from_torch(self.rest_pose, wp.transform) + self.offset_wp = wp.from_torch(self.offset, wp.transform) + self.goal_quat_wp = wp.from_torch(self.goal_quat, wp.transform) + ## For Debug + self.debug_des_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.debug_cur_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.debug_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) + + self.debug_des_pose_wp = wp.from_torch(self.debug_des_pose, wp.transform) + self.debug_cur_pose_wp = wp.from_torch(self.debug_cur_pose, wp.transform) + self.debug_state_wp = wp.from_torch(self.debug_state, wp.int32) + + def reset_idx(self, env_ids: Sequence[int] = None): + """Reset the state machine.""" + print(f'[SM RESET]') + if env_ids is None: + env_ids = slice(None) + self.sm_state[env_ids] = 0 + self.sm_wait_time[env_ids] = 0.0 + + def _ensure_7d(self,tensor: torch.Tensor, device): + # accepts (N,3) -> returns (N,7) with identity quaternion + if tensor.ndim != 2: + raise ValueError(f"expected 2D tensor, got shape {tensor.shape}") + if tensor.shape[1] == 7: + return tensor + if tensor.shape[1] == 3: + quat = torch.tensor([0.0,0.0,0.0,1.0], device=device, dtype=tensor.dtype) + quat = quat.unsqueeze(0).expand(tensor.shape[0], -1) + return torch.cat([tensor, quat], dim=-1) + raise ValueError(f"pose must have 3 or 7 elements, got {tensor.shape[1]}") + + + def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, current_object_pose: torch.Tensor, final_object_pose: torch.Tensor, rest_pose: torch.Tensor, sm_state: int =0, env_num = 0) -> torch.Tensor: + """Compute the desired state of the robot's end-effector and the gripper.""" + # convert all transformations from (w, x, y, z) to (x, y, z, w) + # print(f'[SM DEBUG] Doing State Comp') + # print(f'[SM DEBUG] ee_pose {ee_pose}') + # print(f'[SM DEBUG] object pose {object_pose}') + # print(f'[SM DEBUG] desired pose {des_object_pose}') + # print(f'[SM DEBUG] final pose {final_object_pose}') + # print(f'[SM DEBUG] rest pose {rest_pose}') + # before reordering + # print("\n[BackupControllerSM::compute] called with inputs:") + # print(f" sm_state: {sm_state}, env_num: {env_num}") + + # def short_tensor(t, name): + # if t is None: + # print(f" {name}: None") + # elif not isinstance(t, torch.Tensor): + # print(f" {name}: {t} (type={type(t)})") + # else: + # shape = tuple(t.shape) + # device = t.device + # dtype = t.dtype + # # show first few elements flattened + # vals = t.flatten()[:6].detach().cpu().numpy() + # print(f" {name}: shape={shape}, device={device}, dtype={dtype}, values={vals}") + + # short_tensor(ee_pose, "ee_pose") + # short_tensor(object_pose, "object_pose") + # short_tensor(des_object_pose, "des_object_pose") + # short_tensor(final_object_pose, "final_object_pose") + # short_tensor(rest_pose, "rest_pose") + # print("-" * 80) + # print(f"Got given state {sm_state}") + current_object_pose = self._ensure_7d(current_object_pose, self.device) + final_object_pose = self._ensure_7d(self.goal_pos, self.device) + ee_pose = self._ensure_7d(ee_pose, self.device) + start_object_pose = self._ensure_7d(start_object_pose, self.device) + rest_pose = self._ensure_7d(rest_pose, self.device) + goal_quat = self._ensure_7d(self.goal_quat, self.device) + # now safe to reorder + ee_pose = ee_pose[:, [0, 1, 2, 4, 5, 6, 3]] + start_object_pose = start_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + current_object_pose = current_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + final_object_pose = final_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + rest_pose = rest_pose[:, [0, 1, 2, 4, 5, 6, 3]] + goal_quat = goal_quat[:, [0, 1, 2, 4, 5, 6, 3]] + # convert to warp + ee_pose_wp = wp.from_torch(ee_pose.contiguous(), wp.transform) + start_object_pose_wp = wp.from_torch(start_object_pose.contiguous(), wp.transform) + current_object_pose_wp = wp.from_torch(current_object_pose.contiguous(), wp.transform) + final_object_pose_wp = wp.from_torch(final_object_pose.contiguous(), wp.transform) + rest_pose_wp = wp.from_torch(rest_pose.contiguous(), wp.transform) + goal_quat_wp = wp.from_torch(goal_quat.contiguous(), wp.transform) + # run state machine + # get state from env - convert to warp again + self.sm_state[env_num] = sm_state + self.sm_state_wp = wp.from_torch(self.sm_state, wp.int32) + # launch + wp.launch( + kernel=infer_state_machine, + dim=self.num_envs, + inputs=[ + self.sm_dt_wp, + self.sm_state_wp, + self.sm_wait_time_wp, + ee_pose_wp, + start_object_pose_wp, + current_object_pose_wp, + final_object_pose_wp, + rest_pose_wp, + goal_quat_wp, + self.des_ee_pose_wp, + self.des_gripper_state_wp, + self.offset_wp, + self.position_threshold, + self.debug_des_pose_wp, + self.debug_cur_pose_wp, + self.debug_state_wp, + ], + device=self.device, + ) + des_debug = self.debug_des_pose.detach().cpu().numpy() + cur_debug = self.debug_cur_pose.detach().cpu().numpy() + debug_state = self.debug_state.detach().cpu().numpy() + goal_quat_debug = self.goal_quat.detach().cpu().numpy() + for i in range(self.num_envs): + des_pos, des_quat = des_debug[i][:3], des_debug[i][3:] + cur_pos, cur_quat = cur_debug[i][:3], cur_debug[i][3:] + goal_quat = goal_quat_debug[i][3:] + # compute Euclidean distance with numpy + dist = np.linalg.norm(cur_pos - des_pos) + # print(f"StateMachine debug state {debug_state}") + # print(f"[Env {i}]") + # print(f" Goal pose : {final_object_pose}") + # print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") + # print(f" Desired -> pos: {des_pos}, quat: {des_quat}") + # print(f" Goal quat -> : {goal_quat}") + # print(f" Euclidean distance: {dist:.4f}") + #print(f"returned state : {self.sm_state}") + # convert transformations back to (w, x, y, z) + des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] + # convert to torch + #print(f'[SM DEBUG] new desired poition : {des_ee_pose}, gripper state {self.des_gripper_state}') + return des_ee_pose , self.des_gripper_state, self.sm_state.clone().item() + #return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/evaluation.py b/scripts/imitation_learning/robomimic/evaluation.py index ec2ff30d7338..25eaf82d4d88 100644 --- a/scripts/imitation_learning/robomimic/evaluation.py +++ b/scripts/imitation_learning/robomimic/evaluation.py @@ -42,7 +42,10 @@ def ensemble_uncertainty(ensemble, obs): max_action = torch.max(outputs, dim=0) std = torch.std(outputs, dim=0) + variance = std.pow(2) + #print(f"ens variance : {variance}") + diff = 0 # std per policy (overall std across joints for each policy's action) per_policy_std = torch.std(outputs, dim=1) @@ -57,7 +60,8 @@ def ensemble_uncertainty(ensemble, obs): 'std': std, 'variance': variance, 'min_std_action': min_std_action, - 'time_taken': time_taken + 'time_taken': time_taken, + 'diff': diff } def MC_dropout_uncertainty(policy, obs, niters=50): diff --git a/scripts/imitation_learning/robomimic/play.py b/scripts/imitation_learning/robomimic/play.py index 02d293b21eba..18a973d3f866 100644 --- a/scripts/imitation_learning/robomimic/play.py +++ b/scripts/imitation_learning/robomimic/play.py @@ -89,6 +89,8 @@ def rollout(policy, env, success_term, horizon, device): """ policy.start_episode() obs_dict, _ = env.reset() + print("[INFO] Policy expected obs keys:", policy) + traj = dict(actions=[], obs=[], next_obs=[]) for i in range(horizon): diff --git a/scripts/imitation_learning/robomimic/play_ensemble.py b/scripts/imitation_learning/robomimic/play_ensemble.py index a7ea7565e273..b2062ac57c87 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble.py +++ b/scripts/imitation_learning/robomimic/play_ensemble.py @@ -246,7 +246,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, certain_joint_positions = [] ###### SET UP RECOVERY #### - use_recovery=True + use_recovery=False recovery_activated_during_rollout = 0 print("rollout recovery enabled ? : ", use_recovery) @@ -259,7 +259,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, max_recovery_steps = 500 # Safety limit for recovery mode ##### CONFIG RECOVERY CONTROLLER #### - backup_controller = BackupController(env, device) + backup_controller = BackupController(env, device, ) state_guess = 0 last_state = 0 recovery_mode = False diff --git a/scripts/imitation_learning/robomimic/play_ensemble_v05.py b/scripts/imitation_learning/robomimic/play_ensemble_v05.py index 43771bc8d2ac..c10cfccf1be6 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble_v05.py +++ b/scripts/imitation_learning/robomimic/play_ensemble_v05.py @@ -120,7 +120,7 @@ def policy_from_checkpoint_v05(ckpt_path, device, verbose=True): from packaging import version # Check robomimic version - robomimic_version = getattr(robomimic, '__version__', '0.3.0') + robomimic_version = getattr(robomimic, '__version__', '0.5.0') if verbose: print(f"[INFO] Loading checkpoint with robomimic version {robomimic_version}") @@ -324,7 +324,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, obs_dict, _ = env.reset() traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[], min_actions=[], max_actions=[], - time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[]) + time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[], diff=[]) ###### SETUP SWITCHING LOGIC #### switchingLogic = SwitchingLogic(parameters, horizon=horizon) @@ -344,7 +344,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, max_recovery_steps = 500 # Safety limit for recovery mode ##### CONFIG RECOVERY CONTROLLER #### - backup_controller = BackupController(env, device) + backup_controller = BackupController(env, device, tasktype="lift") state_guess = 0 last_state = 0 recovery_mode = False @@ -386,24 +386,12 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, # This prevents dimension mismatch errors when env has extra observations policy_obs = {k: obs[k] for k in TRAINED_OBS_KEYS if k in obs} - # Debug: print observation shapes on first iteration - if i == 0: - print(f"[DEBUG] Available obs keys: {list(obs.keys())}") - print(f"[DEBUG] Filtered policy_obs keys: {list(policy_obs.keys())}") - total_dim = 0 - for k, v in policy_obs.items(): - dim = v.shape[-1] if len(v.shape) > 0 else 1 - print(f"[DEBUG] {k}: shape={v.shape}, dim={dim}") - total_dim += dim - print(f"[DEBUG] Total dimension: {total_dim} (expected 44)") - missing = [k for k in TRAINED_OBS_KEYS if k not in obs] - if missing: - print(f"[DEBUG] MISSING keys: {missing}") - #### get policy action #### metrics = ensemble_uncertainty(ensemble, policy_obs) uncertainty = metrics['variance'] + #print(f"Uncdertainty : {uncertainty}") policy_actions = metrics['mean'] + diff=metrics['diff'] # Robust state estimation based on actual observations is_grasping = bool(sub_obs['grasp'].item()) if sub_obs['grasp'].numel() == 1 else bool(torch.any(sub_obs['grasp'])) @@ -419,7 +407,8 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, if state_guess >= 4 and state_guess < 7: # Was in lift/move states # Object dropped - need to re-approach state_guess = 0 # Go back to REST to safely re-approach - print(f"[STATE] Reset to REST (grasp lost)") + #print(f"[STATE] Reset to REST (grasp lost), activating recovery") + # recovery_mode= True sm_actions, state_guess = backup_controller.get_controller_action(state_guess, 0) if last_state != state_guess: @@ -440,24 +429,25 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, print(f"[RECOVERY] Step {i} - Starting recovery from state {state_guess}") if recovery_mode: + #print(f"Recovery Actions") actions = sm_actions recovery_steps += 1 # Exit recovery when task completes or after max steps - max_recovery_steps = 500 - if state_guess == 7 or recovery_steps > max_recovery_steps: # APPROACH_GOAL = 7 - print(f"[RECOVERY] Completed after {recovery_steps} steps, state={state_guess}") - recovery_mode = False - recovery_cooldown_active = True - recovery_cooldown_timer = recovery_cooldown_duration + # max_recovery_steps = 500 + # if recovery_steps > max_recovery_steps: # APPROACH_GOAL = 7 + # print(f"[RECOVERY] Completed after {recovery_steps} steps, state={state_guess}") + # recovery_mode = False + # recovery_cooldown_active = True + # recovery_cooldown_timer = recovery_cooldown_duration else: # Decrement cooldown when not in recovery - if recovery_cooldown_active: - recovery_cooldown_timer -= 1 - if recovery_cooldown_timer <= 0: - recovery_cooldown_active = False - recovery_cooldown_timer = recovery_cooldown_duration - print("Recovery Cooldown Ended") + # if recovery_cooldown_active: + # recovery_cooldown_timer -= 1 + # if recovery_cooldown_timer <= 0: + # recovery_cooldown_active = False + # recovery_cooldown_timer = recovery_cooldown_duration + # print("Recovery Cooldown Ended") actions = policy_actions @@ -485,6 +475,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, traj['time_taken'].append(metrics['time_taken']) traj['joint_pos'].append(obs['abs_joint_pos']) traj['recovery'].append(recovery) + traj['diff'].append(diff) if torch.any(obs['object_knocked']): print("[MONITOR] object knocked over") object_knocked = True @@ -494,7 +485,8 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, traj['failure'].append(" ") grasp = torch.any(sub_obs['grasp']) traj['grasp'].append(grasp.item()) - appr = torch.any(sub_obs['stacked']) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) traj['appr'].append(appr.item()) print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") # print(f"grasp : {grasp.item()}, appr : {appr.item()}") @@ -503,7 +495,8 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, elif terminated or truncated: grasp = torch.any(sub_obs['grasp']) traj['grasp'].append(grasp.item()) - appr = torch.any(sub_obs['stacked']) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) traj['appr'].append(appr.item()) #print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") if i==horizon: @@ -519,7 +512,8 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, traj['failure'].append("timeout") grasp = torch.any(sub_obs['grasp']) traj['grasp'].append(grasp.item()) - appr = torch.any(sub_obs['stacked']) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) traj['appr'].append(appr.item()) return False, traj, recovery_activated_during_rollout, "" @@ -599,51 +593,56 @@ def main(): # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') - pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') + #pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/low/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') - + # pick_place_ensemble = load_ensemble(device, ensemble_path='docs/lift/Dev-IK-Rel-v1/best_models/best_model_paths.txt') + + pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/insert_paths.txt') + # Lets set these to the 0.99 confidence parameters = { 'beaker_lift' :{ - 0 : { - "confidence_level": 0.018646507043923632, - "window_size": 15, - "max_peaks": 10 + 0 : { + "confidence_level": 0.0002104382060000009, + "window_size": 10, + "max_peaks": 8 }, 1 : { - "confidence_level": 0.018898154803458085, + "confidence_level": 0.00020459246700000051, "window_size": 10, - "max_peaks": 9 + "max_peaks": 8 }, 2 : { - "confidence_level": 0.017589774107725654, - "window_size": 15, - "max_peaks": 7 + "confidence_level": 0.00023551160300000013, + "window_size": 10, + "max_peaks": 8 }, 3 : { - "confidence_level": 0.02829341592326851, - "window_size": 12, + "confidence_level": 0.0003701742110000007, + "window_size": 10, "max_peaks": 8 }, 4 : { - "confidence_level": 0.029170220902127186, - "window_size": 15, - "max_peaks": 11 + "confidence_level": 0.0002939644620000011, + "window_size": 10, + "max_peaks": 8 }, 5 : { - "confidence_level": 0.017449474558650185, - "window_size": 12, - "max_peaks": 7 + "confidence_level": 0.0006407762280000002, + "window_size": 10, + "max_peaks": 8 }, 6 : { - "confidence_level": 0.6324478323150455, - "window_size": 14, - "max_peaks": 14 + "confidence_level": 0.49527883679, + "window_size": 10, + "max_peaks": 8 }, }, } + + model_arch = "BC_RNN_GMM" task = "pick_place" # stack_cube or pick_place model_name = f"ensemble" @@ -756,6 +755,7 @@ def main(): summary_text += f"Success rate: {results.count(True) / len(results)}\n" summary_text += f'Failed runs with no intervention : {sum(failed_no_intervention)}\n' summary_text += f"Intervention rate : {sum(intervention)/len(intervention)}. Of which success : {sum(intervention_success)}, of which failed {sum(intervention_failure)}\n" + summary_text += f"Intervention Results: {intervention}\n" summary_text += f"Number of times object knocked over : {knocked}\n" summary_text += f"Trial Results: {results}\n\n" summary_text += f"Environment random seed: {args_cli.seed}\n" diff --git a/scripts/imitation_learning/robomimic/play_with_backup.py b/scripts/imitation_learning/robomimic/play_with_backup.py index 2dda0f20fe31..ef7c15bbaf15 100644 --- a/scripts/imitation_learning/robomimic/play_with_backup.py +++ b/scripts/imitation_learning/robomimic/play_with_backup.py @@ -118,13 +118,13 @@ def rollout_ensemble(env, success_term, horizon, device): # Set up recovery controller - backup_controller = BackupController(env, device) + backup_controller = BackupController(env, device, tasktype="lift") state_guess = 0 for i in range(horizon): action, state_guess = backup_controller.get_controller_action(state_guess, 0) - print(f"state guess : {state_guess}") + # print(f"state guess : {state_guess}") zero_action = torch.zeros(1, env.action_space.shape[1], device=device) #print(f"\npassed this action {action}") diff --git a/scripts/imitation_learning/robomimic/train_ensemble.py b/scripts/imitation_learning/robomimic/train_ensemble.py index b2510eed8edb..9a9f6bb5d954 100644 --- a/scripts/imitation_learning/robomimic/train_ensemble.py +++ b/scripts/imitation_learning/robomimic/train_ensemble.py @@ -177,9 +177,9 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] env_meta = FileUtils.get_env_metadata_from_dataset(dataset_path=config.train.data) print(f"config.train.data: {config.train.data}") with config.values_unlocked(): - config.train.data = [{'path': 'docs/place/glassware_stack_demos_split_normalized.hdf5'}] + config.train.data = [{'path': 'docs/place/glassware_insert_demos_generated_split.hdf5'}] ####### HARD CODED MAKE SURE THIS GETS UPDATED ######### - config_list= [{'path': 'docs/place/glassware_stack_demos_split_normalized.hdf5'}] + config_list= [{'path': 'docs/place/glassware_insert_demos_generated_split.hdf5'}] print(f"config.train.data: {config.train.data}") # print(f"config_list: {config_list}") # if isinstance(config.train.data, str): @@ -449,7 +449,7 @@ def keep_data_percentage(trainset, percentage): return trainset -def create_bootstrap_sample(trainset, seed: int, percent: float = 0.5): +def create_bootstrap_sample(trainset, seed: int, percent: float = 0.25): """Create a random sample (without replacement) of a percentage of the training set. Args: diff --git a/scripts/tools/regen_usd_file.py b/scripts/tools/regen_usd_file.py new file mode 100644 index 000000000000..d9058e6a0564 --- /dev/null +++ b/scripts/tools/regen_usd_file.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +"""Script to regenerate USD files for vial rack and capped vial with proper collision meshes.""" + +from isaaclab.app import AppLauncher + +# Launch Isaac Sim +app_launcher = AppLauncher(headless=True) +simulation_app = app_launcher.app + +import os +from isaaclab.sim.converters import MeshConverter, MeshConverterCfg +from isaaclab.sim.schemas import schemas_cfg +from isaaclab.utils.dict import print_dict + +def regenerate_vial_rack(): + """Regenerate vial rack USD with convex decomposition.""" + print("=" * 80) + print("Regenerating Vial Rack USD with Convex Decomposition") + print("=" * 80) + + mesh_converter_cfg = MeshConverterCfg( + asset_path="/workspace/isaaclab/source/isaaclab_assets/isaaclab_assets/glassware/vial_rack/vial_rack.obj", + usd_dir="/workspace/isaaclab/source/isaaclab_assets/isaaclab_assets/glassware/vial_rack", + usd_file_name="vial_rack.usd", + force_usd_conversion=True, + make_instanceable=True, + mass_props=schemas_cfg.MassPropertiesCfg(mass=0.1), + rigid_props=schemas_cfg.RigidBodyPropertiesCfg(), + collision_props=schemas_cfg.CollisionPropertiesCfg(collision_enabled=True), + mesh_collision_props=schemas_cfg.ConvexDecompositionPropertiesCfg( + max_convex_hulls=64, + voxel_resolution=1000000, + hull_vertex_limit=64, + min_thickness=0.0005 + ), + translation=(0.0, 0.0, 0.0), + rotation=(1.0, 0.0, 0.0, 0.0), + scale=(1.0, 1.0, 1.0), + ) + + print("Config:") + print_dict(mesh_converter_cfg.to_dict(), nesting=0) + + mesh_converter = MeshConverter(mesh_converter_cfg) + print(f"✓ Generated: {mesh_converter.usd_path}") + print() + +def regenerate_capped_vial(): + """Regenerate capped vial USD with convex hull.""" + print("=" * 80) + print("Regenerating Capped Vial USD with Convex Hull") + print("=" * 80) + + mesh_converter_cfg = MeshConverterCfg( + asset_path="/workspace/isaaclab/source/isaaclab_assets/isaaclab_assets/glassware/vial_with_cap/vial_with_cap.obj", + usd_dir="/workspace/isaaclab/source/isaaclab_assets/isaaclab_assets/glassware/vial_with_cap", + usd_file_name="vial_with_cap.usd", + force_usd_conversion=True, + make_instanceable=True, + mass_props=schemas_cfg.MassPropertiesCfg(mass=0.01), + rigid_props=schemas_cfg.RigidBodyPropertiesCfg(), + collision_props=schemas_cfg.CollisionPropertiesCfg(collision_enabled=True), + mesh_collision_props=schemas_cfg.ConvexHullPropertiesCfg( + hull_vertex_limit=32, + min_thickness=0.0005 + ), + translation=(0.0, 0.0, 0.0), + rotation=(1.0, 0.0, 0.0, 0.0), + scale=(1.0, 1.0, 1.0), + ) + + print("Config:") + print_dict(mesh_converter_cfg.to_dict(), nesting=0) + + mesh_converter = MeshConverter(mesh_converter_cfg) + print(f"✓ Generated: {mesh_converter.usd_path}") + print() + +if __name__ == "__main__": + regenerate_vial_rack() + regenerate_capped_vial() + print("=" * 80) + print("✓ All USD files regenerated successfully!") + print("=" * 80) + simulation_app.close() diff --git a/scripts/tutorials/00_sim/create_empty.py b/scripts/tutorials/00_sim/create_empty.py index f35a0d5487f0..383e26a15aaf 100644 --- a/scripts/tutorials/00_sim/create_empty.py +++ b/scripts/tutorials/00_sim/create_empty.py @@ -17,7 +17,7 @@ import argparse -from isaaclab.app import AppLauncher +from source.isaaclab.isaaclab.app import AppLauncher # create argparser parser = argparse.ArgumentParser(description="Tutorial on creating an empty stage.") diff --git a/source/chills b/source/chills new file mode 160000 index 000000000000..5aea8c2b4b8d --- /dev/null +++ b/source/chills @@ -0,0 +1 @@ +Subproject commit 5aea8c2b4b8db01a2c015f6e673e5465a4a85a3a diff --git a/source/isaaclab/isaaclab/__init__.py b/source/isaaclab/isaaclab/__init__.py index 7bb50a0eab23..b7026ff693e5 100644 --- a/source/isaaclab/isaaclab/__init__.py +++ b/source/isaaclab/isaaclab/__init__.py @@ -16,4 +16,4 @@ """Extension metadata dictionary parsed from the extension.toml file.""" # Configure the module-level variables -__version__ = ISAACLAB_METADATA["package"]["version"] +__version__ = ISAACLAB_METADATA["package"]["version"] \ No newline at end of file diff --git a/source/isaaclab/isaaclab/envs/mdp/events.py b/source/isaaclab/isaaclab/envs/mdp/events.py index f9ffd47ba874..3d5cec572085 100644 --- a/source/isaaclab/isaaclab/envs/mdp/events.py +++ b/source/isaaclab/isaaclab/envs/mdp/events.py @@ -1217,6 +1217,7 @@ def reset_place_root_state_uniform( # remote iks plate offset positions[:,0] += 0.04 positions[:,2] -= 0.06 + goal_pose[:,2]=0.0 asset2.write_root_pose_to_sim(torch.cat([positions, orientations2], dim=-1), env_ids=env_ids) asset2.write_root_velocity_to_sim(velocities, env_ids=env_ids) asset3.write_root_pose_to_sim(torch.cat([goal_pose, orientations3], dim=-1), env_ids=env_ids) diff --git a/source/isaaclab/isaaclab/safety/switchingLogic.py b/source/isaaclab/isaaclab/safety/switchingLogic.py index 92c188d98426..ceeb131727bc 100644 --- a/source/isaaclab/isaaclab/safety/switchingLogic.py +++ b/source/isaaclab/isaaclab/safety/switchingLogic.py @@ -32,10 +32,12 @@ def halfway_check(self, step:int=0, grasp_state:bool=True): def check(self, uncertainties, step) -> bool: + counts = 0 # 1. Update windows for joint_num, unc in enumerate(uncertainties): # Check for bounds if uncertainties is smaller than self.joints self.traj[joint_num][step]=unc.item() + #print(f'Action comp {joint_num} uncertainty at step {step}: {unc.item()}') if step > self.params[joint_num]['window_size']: @@ -44,10 +46,13 @@ def check(self, uncertainties, step) -> bool: #print(f'action {joint_num}, window: {test_window}') # print(f"Action comp {joint_num}, {unc.item()} limit {self.params[joint_num]['confidence_level']} manually found peaks : {peaks}") if peaks>=self.params[joint_num]['max_peaks']: - if not self.triggered: - print(f"Uncertaity in joint {joint_num} triggered") - self.triggered =True - return True - - + counts+=1 + + + if counts >2: + if not self.triggered: + self.triggered = True + print(f"Uncertaity in joint {joint_num} triggered") + print("triggered safety condition") + return True return False \ No newline at end of file diff --git a/source/isaaclab/pyproject.toml b/source/isaaclab/pyproject.toml index d90ac3536f16..e749d7a59aa1 100644 --- a/source/isaaclab/pyproject.toml +++ b/source/isaaclab/pyproject.toml @@ -1,3 +1,3 @@ [build-system] requires = ["setuptools", "wheel", "toml"] -build-backend = "setuptools.build_meta" +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/source/isaaclab/setup.py b/source/isaaclab/setup.py index c78f98172455..9bb944e342a8 100644 --- a/source/isaaclab/setup.py +++ b/source/isaaclab/setup.py @@ -42,21 +42,24 @@ "pytest", "pytest-mock", "junitparser", - "flatdict==4.0.1", + "flatdict==4.0.0", "flaky", + "packaging", ] -# Append Linux x86_64–only deps via PEP 508 markers -X64 = "platform_machine in 'x86_64,AMD64'" +SUPPORTED_ARCHS_ARM = "platform_machine in 'x86_64,AMD64,aarch64,arm64'" +SUPPORTED_ARCHS = "platform_machine in 'x86_64,AMD64'" INSTALL_REQUIRES += [ # required by isaaclab.isaaclab.controllers.pink_ik - f"pin-pink==3.1.0 ; platform_system == 'Linux' and ({X64})", + f"pin-pink==3.1.0 ; platform_system == 'Linux' and ({SUPPORTED_ARCHS_ARM})", + f"daqp==0.7.2 ; platform_system == 'Linux' and ({SUPPORTED_ARCHS_ARM})", # required by isaaclab.devices.openxr.retargeters.humanoid.fourier.gr1_t2_dex_retargeting_utils - f"dex-retargeting==0.4.6 ; platform_system == 'Linux' and ({X64})", + f"dex-retargeting==0.4.6 ; platform_system == 'Linux' and ({SUPPORTED_ARCHS})", ] PYTORCH_INDEX_URL = ["https://download.pytorch.org/whl/cu128"] +# Installation operation # Installation operation setup( name="isaaclab", @@ -78,6 +81,7 @@ "Programming Language :: Python :: 3.11", "Isaac Sim :: 4.5.0", "Isaac Sim :: 5.0.0", + "Isaac Sim :: 5.1.0", ], zip_safe=False, ) diff --git a/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py b/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py index 6abdc088170d..1390fdf48eaf 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py +++ b/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py @@ -111,13 +111,22 @@ def env_loop( if prev_num_attempts != num_attempts: prev_num_attempts = num_attempts generated_sucess_rate = 100 * num_success / num_attempts if num_attempts > 0 else 0.0 - print("") - print("*" * 50, "\033[K") - print( - f"{num_success}/{num_attempts} ({generated_sucess_rate:.1f}%) successful demos generated by" - " mimic\033[K" - ) - print("*" * 50, "\033[K") + summary_text=f"\n" + summary_text+=f"Success Rate: {generated_sucess_rate:.1f}% ({num_success} successes, {num_failures} failures, {num_attempts} attempts)\n" + summary_text+= "*" * 50 + "\n" + summary_text+=f"{num_success}/{num_attempts} ({generated_sucess_rate:.1f}%) successful demos generated by mimic\n" + # print( + # f"{num_success}/{num_attempts} ({generated_sucess_rate:.1f}%) successful demos generated by" + # " mimic\033[K" + # ) + summary_text+="*" * 50 + "\n" + # print("*" * 50, "\033[K") + print(summary_text) + log_file = "docs/generation_log.txt" + # with open(log_file, 'a') as f: + # f.write(summary_text) + # f.write("\n" + "="*80 + "\n\n") + # termination condition is on enough successes if @guarantee_success or enough attempts otherwise generation_guarantee = env.cfg.datagen_config.generation_guarantee diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py b/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py index c612ed504c9b..1afb3b2a6374 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/__init__.py @@ -5,6 +5,7 @@ """Sub-package with environment wrappers for Isaac Lab Mimic.""" +import isaaclab_mimic.envs.cube_mimic_vm_env_cfg import gymnasium as gym from .franka_bin_stack_ik_rel_mimic_env_cfg import FrankaBinStackIKRelMimicEnvCfg @@ -19,6 +20,8 @@ from .cube_blueprint_mimic_env_cfg import CubeBlueprintMimicEnvCfg from .cube_mimic_env_cfg import CubeMimicEnvCfg from .cube_mimic_env import CubeMimicEnv +from .cube_mimic_vm_env_cfg import CubeMimicVMEnvCfg +from .cube_mimic_vm_env import CubeMimicVMEnv from .cube_mimic_env_skillgen_cfg import CubeMimicEnvSkillgenCfg ## # Inverse Kinematics - Relative Pose Control @@ -198,4 +201,13 @@ "env_cfg_entry_point": cube_blueprint_mimic_env_cfg.CubeBlueprintMimicEnvCfg, }, disable_env_checker=True, +) + +gym.register( + id="Cube-Mimic-VM-v0", + entry_point="isaaclab_mimic.envs:CubeMimicVMEnv", + kwargs={ + "env_cfg_entry_point": cube_mimic_vm_env_cfg.CubeMimicVMEnvCfg, + }, + disable_env_checker=True, ) \ No newline at end of file diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py index 195e1abf19ab..7324eccbb68b 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env.py @@ -158,9 +158,9 @@ def get_subtask_term_signals(self, env_ids: Sequence[int] | None = None) -> dict subtask_terms = self.obs_buf["subtask_terms"] #signals["appr"] = subtask_terms["appr"][env_ids] signals["grasp"] = subtask_terms["grasp"][env_ids] - signals["stacked"] = subtask_terms["stacked"][env_ids] + #signals["stacked"] = subtask_terms["stacked"][env_ids] #signals["lift"] = subtask_terms["lift"][env_ids] - #signals["appr_goal"] = subtask_terms["appr_goal"][env_ids] + signals["appr_goal"] = subtask_terms["appr_goal"][env_ids] #signals["release_object"] = subtask_terms["release_object"][env_ids] # final subtask is placing cube on goal - signal needed when using --annotate_subtask_start_signals return signals diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py index 71ce2096b510..972daecbb642 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py @@ -6,8 +6,9 @@ from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig from isaaclab.utils import configclass -from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_place import FrankaDevEnvCfg - +#from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_place import FrankaDevEnvCfg +#from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_obs import FrankaDevEnvCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_vial_insert import FrankaDevEnvCfg @configclass class CubeMimicEnvCfg(FrankaDevEnvCfg, MimicEnvCfg): @@ -116,7 +117,7 @@ def __post_init__(self): # # This is actually the lift # subtask_term_signal="appr_goal", # # No time offsets for the final subtask - # subtask_term_offset_range=(10, 20), + # subtask_term_offset_range=(0,0), # # Selection strategy for source subtask segment # selection_strategy="nearest_neighbor_robot_distance", # # Optional parameters for the selection strategy function diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_vm_env.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_vm_env.py new file mode 100755 index 000000000000..78cdef0dde36 --- /dev/null +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_vm_env.py @@ -0,0 +1,189 @@ + +# Copyright (c) 2024-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +import torch +from collections.abc import Sequence + +import isaaclab.utils.math as PoseUtils +from isaaclab.envs import ManagerBasedRLMimicEnv + + +class CubeMimicVMEnv(ManagerBasedRLMimicEnv): + """ + Isaac Lab Mimic environment wrapper class for Franka Cube Stack IK Rel env. + """ + + def get_robot_eef_pose(self, eef_name: str, env_ids: Sequence[int] | None = None) -> torch.Tensor: + """ + Get current robot end effector pose. Should be the same frame as used by the robot end-effector controller. + + Args: + eef_name: Name of the end effector. + env_ids: Environment indices to get the pose for. If None, all envs are considered. + + Returns: + A torch.Tensor eef pose matrix. Shape is (len(env_ids), 4, 4) + """ + if env_ids is None: + env_ids = slice(None) + + # Retrieve end effector pose from the observation buffer + eef_pos = self.obs_buf["policy"]["eef_pos"][env_ids] + eef_quat = self.obs_buf["policy"]["eef_quat"][env_ids] + + # Quaternion format is w,x,y,z + return PoseUtils.make_pose(eef_pos, PoseUtils.matrix_from_quat(eef_quat)) + + def target_eef_pose_to_action( + self, target_eef_pose_dict: dict, gripper_action_dict: dict, noise: float | None = None, env_id: int = 0 + ) -> torch.Tensor: + """ + Takes a target pose and gripper action for the end effector controller and returns an action + (usually a normalized delta pose action) to try and achieve that target pose. + Noise is added to the target pose action if specified. + + Args: + target_eef_pose_dict: Dictionary of 4x4 target eef pose for each end-effector. + gripper_action_dict: Dictionary of gripper actions for each end-effector. + noise: Noise to add to the action. If None, no noise is added. + env_id: Environment index to get the action for. + + Returns: + An action torch.Tensor that's compatible with env.step(). + """ + eef_name = list(self.cfg.subtask_configs.keys())[0] + + # target position and rotation + (target_eef_pose,) = target_eef_pose_dict.values() + target_pos, target_rot = PoseUtils.unmake_pose(target_eef_pose) + + # current position and rotation + curr_pose = self.get_robot_eef_pose(eef_name, env_ids=[env_id])[0] + curr_pos, curr_rot = PoseUtils.unmake_pose(curr_pose) + + # normalized delta position action + delta_position = target_pos - curr_pos + + # normalized delta rotation action + delta_rot_mat = target_rot.matmul(curr_rot.transpose(-1, -2)) + delta_quat = PoseUtils.quat_from_matrix(delta_rot_mat) + delta_rotation = PoseUtils.axis_angle_from_quat(delta_quat) + + # get gripper action for single eef + (gripper_action,) = gripper_action_dict.values() + + # add noise to action + pose_action = torch.cat([delta_position, delta_rotation], dim=0) + if noise is not None: + noise = noise * torch.randn_like(pose_action) + pose_action += noise + pose_action = torch.clamp(pose_action, -1.0, 1.0) + + return torch.cat([pose_action, gripper_action], dim=0) + + def action_to_target_eef_pose(self, action: torch.Tensor) -> dict[str, torch.Tensor]: + """ + Converts action (compatible with env.step) to a target pose for the end effector controller. + Inverse of @target_eef_pose_to_action. Usually used to infer a sequence of target controller poses + from a demonstration trajectory using the recorded actions. + + Args: + action: Environment action. Shape is (num_envs, action_dim) + + Returns: + A dictionary of eef pose torch.Tensor that @action corresponds to + """ + eef_name = list(self.cfg.subtask_configs.keys())[0] + + delta_position = action[:, :3] + delta_rotation = action[:, 3:6] + + # current position and rotation + curr_pose = self.get_robot_eef_pose(eef_name, env_ids=None) + curr_pos, curr_rot = PoseUtils.unmake_pose(curr_pose) + + # get pose target + target_pos = curr_pos + delta_position + + # Convert delta_rotation to axis angle form + delta_rotation_angle = torch.linalg.norm(delta_rotation, dim=-1, keepdim=True) + delta_rotation_axis = delta_rotation / delta_rotation_angle + + # Handle invalid division for the case when delta_rotation_angle is close to zero + is_close_to_zero_angle = torch.isclose(delta_rotation_angle, torch.zeros_like(delta_rotation_angle)).squeeze(-1) + delta_rotation_axis[is_close_to_zero_angle] = torch.zeros_like(delta_rotation_axis)[is_close_to_zero_angle] + + delta_quat = PoseUtils.quat_from_angle_axis(delta_rotation_angle.squeeze(-1), delta_rotation_axis) + delta_rot_mat = PoseUtils.matrix_from_quat(delta_quat) + target_rot = torch.matmul(delta_rot_mat, curr_rot) + + target_poses = PoseUtils.make_pose(target_pos, target_rot).clone() + + return {eef_name: target_poses} + + def actions_to_gripper_actions(self, actions: torch.Tensor) -> dict[str, torch.Tensor]: + """ + Extracts the gripper actuation part from a sequence of env actions (compatible with env.step). + + Args: + actions: environment actions. The shape is (num_envs, num steps in a demo, action_dim). + + Returns: + A dictionary of torch.Tensor gripper actions. Key to each dict is an eef_name. + """ + # last dimension is gripper action + return {list(self.cfg.subtask_configs.keys())[0]: actions[:, -1:]} + + def get_subtask_term_signals(self, env_ids: Sequence[int] | None = None) -> dict[str, torch.Tensor]: + """ + Gets a dictionary of termination signal flags for each subtask in a task. The flag is 1 + when the subtask has been completed and 0 otherwise. The implementation of this method is + required if intending to enable automatic subtask term signal annotation when running the + dataset annotation tool. This method can be kept unimplemented if intending to use manual + subtask term signal annotation. + + Args: + env_ids: Environment indices to get the termination signals for. If None, all envs are considered. + + Returns: + A dictionary termination signal flags (False or True) for each subtask. + """ + if env_ids is None: + env_ids = slice(None) + + signals = dict() + subtask_terms = self.obs_buf["subtask_terms"] + #signals["appr"] = subtask_terms["appr"][env_ids] + signals["grasp"] = subtask_terms["grasp"][env_ids] + signals["stacked"] = subtask_terms["stacked"][env_ids] + #signals["lift"] = subtask_terms["lift"][env_ids] + #signals["appr_goal"] = subtask_terms["appr_goal"][env_ids] + #signals["release_object"] = subtask_terms["release_object"][env_ids] + # final subtask is placing cube on goal - signal needed when using --annotate_subtask_start_signals + return signals + + def get_expected_attached_object(self, eef_name: str, subtask_index: int, env_cfg) -> str | None: + """ + (SkillGen) Return the expected attached object for the given EEF/subtask. + + Assumes 'stack' subtasks place the object grasped in the preceding 'grasp' subtask. + Returns None for 'grasp' (or others) at subtask start. + """ + if eef_name not in env_cfg.subtask_configs: + return None + + subtask_configs = env_cfg.subtask_configs[eef_name] + if not (0 <= subtask_index < len(subtask_configs)): + return None + + current_cfg = subtask_configs[subtask_index] + # If stacking, expect we are holding the object grasped in the prior subtask + if "stack" in str(current_cfg.subtask_term_signal).lower(): + if subtask_index > 0: + prev_cfg = subtask_configs[subtask_index - 1] + if "grasp" in str(prev_cfg.subtask_term_signal).lower(): + return prev_cfg.object_ref + return None diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_vm_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_vm_env_cfg.py new file mode 100644 index 000000000000..2aa9b7d15590 --- /dev/null +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_vm_env_cfg.py @@ -0,0 +1,162 @@ +# Copyright (c) 2024-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +from isaaclab.envs.mimic_env_cfg import MimicEnvCfg, SubTaskConfig +from isaaclab.utils import configclass + +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_place_vismot import FrankaDevEnvVMCfg + + +@configclass +class CubeMimicVMEnvCfg(FrankaDevEnvVMCfg, MimicEnvCfg): + """ + Isaac Lab Mimic environment config class for Franka Cube Stack IK Rel env. + """ + + def __post_init__(self): + # post init of parents + super().__post_init__() + # # TODO: Figure out how we can move this to the MimicEnvCfg class + # # The __post_init__() above only calls the init for FrankaCubeStackEnvCfg and not MimicEnvCfg + # # https://stackoverflow.com/questions/59986413/achieving-multiple-inheritance-using-python-dataclasses + + # Override the existing values + self.datagen_config.name = "beaker_rand_scale_D0" + self.datagen_config.generation_guarantee = True + self.datagen_config.generation_keep_failed = False + self.datagen_config.generation_num_trials = 10 + self.datagen_config.generation_select_src_per_subtask = True + self.datagen_config.generation_transform_first_robot_pose = False + self.datagen_config.generation_interpolate_from_last_target_pose = True + self.datagen_config.generation_relative = True + self.datagen_config.max_num_failures = 100 + self.datagen_config.seed = 101 + + # The following are the subtask configurations for the stack task. + # The following are the subtask configurations for the stack task. + subtask_configs = [] + # subtask_configs.append( + # SubTaskConfig( + # # Each subtask involves manipulation with respect to a single object frame. + # object_ref="object", + # # This key corresponds to the binary indicator in "datagen_info" that signals + # # when this subtask is finished (e.g., on a 0 to 1 edge). + # subtask_term_signal="appr", + # # Specifies time offsets for data generation when splitting a trajectory into + # # subtask segments. Random offsets are added to the termination boundary. + # subtask_term_offset_range=(0, 0), + # # Selection strategy for the source subtask segment during data generation + # selection_strategy="nearest_neighbor_object", + # # Optional parameters for the selection strategy function + # selection_strategy_kwargs={"nn_k": 3}, + # # Amount of action noise to apply during this subtask + # action_noise=0.03, + # # Number of interpolation steps to bridge to this subtask segment + # num_interpolation_steps=0, + # # Additional fixed steps for the robot to reach the necessary pose + # num_fixed_steps=0, + # # If True, apply action noise during the interpolation phase and execution + # apply_noise_during_interpolation=False, + # ) + # ) + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # Corresponding key for the binary indicator in "datagen_info" for completion + subtask_term_signal="grasp", + # Time offsets for data generation when splitting a trajectory + subtask_term_offset_range=(10, 20), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_object", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=5, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + description="Grasp Glassware", + next_subtask_description="Stack glassware on scale", + ) + ) + #lift ? + # subtask_configs.append( + # SubTaskConfig( + # # Each subtask involves manipulation with respect to a single object frame. + # object_ref="object", + # # End of final subtask does not need to be detected + # subtask_term_signal="lift", + # # No time offsets for the final subtask + # subtask_term_offset_range=(0, 0), + # # Selection strategy for source subtask segment + # selection_strategy="nearest_neighbor_robot_distance", + # # Optional parameters for the selection strategy function + # selection_strategy_kwargs={"nn_k": 3}, + # # Amount of action noise to apply during this subtask + # action_noise=0.03, + # # Number of interpolation steps to bridge to this subtask segment + # num_interpolation_steps=0, + # # Additional fixed steps for the robot to reach the necessary pose + # num_fixed_steps=0, + # # If True, apply action noise during the interpolation phase and execution + # apply_noise_during_interpolation=False, + # ) + # ) + # subtask_configs.append( + # SubTaskConfig( + # # Each subtask involves manipulation with respect to a single object frame. + # object_ref="object", + # # End of final subtask does not need to be detected + # # This is actually the lift + # subtask_term_signal="appr_goal", + # # No time offsets for the final subtask + # subtask_term_offset_range=(10, 20), + # # Selection strategy for source subtask segment + # selection_strategy="nearest_neighbor_robot_distance", + # # Optional parameters for the selection strategy function + # selection_strategy_kwargs={"nn_k": 3}, + # # Amount of action noise to apply during this subtask + # action_noise=0.03, + # # Number of interpolation steps to bridge to this subtask segment + # num_interpolation_steps=5, + # # Additional fixed steps for the robot to reach the necessary pose + # num_fixed_steps=0, + # # If True, apply action noise during the interpolation phase and execution + # apply_noise_during_interpolation=False, + # ) + # ) + + subtask_configs.append( + SubTaskConfig( + # Each subtask involves manipulation with respect to a single object frame. + object_ref="object", + # End of final subtask - when using --annotate_subtask_start_signals, + # the last subtask must also have a signal name + subtask_term_signal="stacked", + # No time offsets for the final subtask + subtask_term_offset_range=(0, 0), + # Selection strategy for source subtask segment + selection_strategy="nearest_neighbor_object_distance", + # Optional parameters for the selection strategy function + selection_strategy_kwargs={"nn_k": 3}, + # Amount of action noise to apply during this subtask + action_noise=0.03, + # Number of interpolation steps to bridge to this subtask segment + num_interpolation_steps=5, + # Additional fixed steps for the robot to reach the necessary pose + num_fixed_steps=0, + # If True, apply action noise during the interpolation phase and execution + apply_noise_during_interpolation=False, + description="Stack glassware on scale", + ) + ) + + + + self.subtask_configs["franka"] = subtask_configs \ No newline at end of file diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py index 0c07f8dcb01b..d02f0da3a92a 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py @@ -157,6 +157,53 @@ disable_env_checker=True, ) +gym.register( + id="Dev-IK-Rel-Place-vision-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_ik_rel_env_place_vismot:FrankaDevEnvVMCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), + "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), + "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), + + }, + disable_env_checker=True, +) + +gym.register( + id="Dev-IK-Rel-Insert-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_ik_rel_vial_insert:FrankaDevEnvCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), + "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), + "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), + + }, + disable_env_checker=True, +) + + +gym.register( + id="Dev-IK-Rel-Insert-vision-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_ik_rel_env_insert_vismot:FrankaDevEnvVMCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), + "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), + "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), + + }, + disable_env_checker=True, +) + + gym.register( id="Dev-IK-Rel-Place-Skillgen-v0", entry_point="isaaclab.envs:ManagerBasedRLEnv", diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json index 8125682666ea..6bde3e9661aa 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json @@ -1,13 +1,13 @@ { "algo_name": "bc", "experiment": { - "name": "bc_med_data_", + "name": "vial_insert", "validate": true, "logging": { "terminal_output_to_txt": true, "log_tb": true, "log_wandb": true, - "wandb_proj_name": "pick_place_bc_rnn_0.5_mix" + "wandb_proj_name": "vial_insert" }, "save": { "enabled": true, @@ -20,7 +20,7 @@ }, "epoch_every_n_steps": 100, "validation_epoch_every_n_steps": 10, - "env": "Dev-IK-Rel-place-v0", + "env": "Dev-IK-Rel-Insert-v0", "additional_envs": null, "render": false, "render_video": true, @@ -55,7 +55,7 @@ "goal_mode": null, "cuda": true, "batch_size": 100, - "num_epochs": 1500, + "num_epochs": 1000, "seed": 101 }, "algo": { diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_insert_vismot.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_insert_vismot.py new file mode 100755 index 000000000000..3c9ab028214c --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_insert_vismot.py @@ -0,0 +1,218 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.assets import AssetBaseCfg +from isaaclab.sim.spawners.from_files import UsdFileCfg +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, NVIDIA_NUCLEUS_DIR +from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG +from . import dev_env_cfg +import isaaclab.sim as sim_utils +from isaaclab.sensors import CameraCfg +import math +from isaaclab.managers import SceneEntityCfg +from isaaclab_assets.glassware.glassware import ChemistryGlassware +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp import franka_stack_events + +from isaaclab.managers import TerminationTermCfg as DoneTerm +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip +from isaaclab_assets.robots.universal_robots import UR10e_ROBOTIQ_GRIPPER_CFG + +## add some cameras in + + + +@configclass +class FrankaDevEnvVMCfg(dev_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # put the beaker on the stir plate + glassware = ChemistryGlassware() + self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + #self.scene.scale = glassware.scale(pos=[0.3, -0.3, 0.01]) + self.scene.vialrack = glassware.line_vial_rack(pos=[0.3, -0.3, 0.01]) + self.scene.object = glassware.capped_vial(pos=[0.3, -0.3, 0.01], scale =1.0) + self.observations.policy.target_object_position = ObsTerm(func=mdp.target_position, params={"object_cfg": SceneEntityCfg("vialrack")}) + + ### subtask + self.observations.subtask_terms.stacked = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("object"), + "lower_object_cfg": SceneEntityCfg("vialrack"), + }, + ) + + + + #### Vision scene + self.scene.wrist_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand/wrist_cam", + update_period=0.0, + height=84, + width=84, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) + ), + offset=CameraCfg.OffsetCfg( + pos=(0.13, 0.0, -0.15), rot=(-0.70614, 0.03701, 0.03701, -0.70614), convention="ros" + ), + ) + self.rerender_on_reset = True + self.sim.render.antialiasing_mode = "OFF" # disable dlss + + # List of image observations in policy observations + self.image_obs_list = ["table_cam", "wrist_cam"] + + + # Set table view camera + self.scene.table_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/table_cam", + update_period=0.0, + height=84, + width=84, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) + ), + offset=CameraCfg.OffsetCfg( + pos=(1.0, 0.0, 0.4), rot=(0.35355, -0.61237, -0.61237, 0.35355), convention="ros" + ), + ) + + + self.events.reset_object_position = EventTerm( + func=mdp.reset_place_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object"), + "asset2_cfg" : SceneEntityCfg("vialrack"), + "asset3_cfg" : SceneEntityCfg("stirplate") + }, + ) + + #### VISION BASED EVENTS + self.events.randomize_light = EventTerm( + func=franka_stack_events.randomize_scene_lighting_domelight, + mode="reset", + params={ + "intensity_range": (1500.0, 10000.0), + "color_variation": 0.4, + "textures": [ + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/hospital_room_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/surgery_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Studio/photo_studio_01_4k.hdr", + ], + "default_intensity": 3000.0, + "default_color": (0.75, 0.75, 0.75), + "default_texture": "", + }, + ) + + self.events.randomize_table_visual_material = EventTerm( + func=franka_stack_events.randomize_visual_texture_material, + mode="reset", + params={ + "asset_cfg": SceneEntityCfg("table"), + "textures": [ + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Stainless/Steel_Stainless_BaseColor.png", + ], + "default_texture": ( + f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/Materials/Textures/DemoTable_TableBase_BaseColor.png" + ), + }, + ) + + # self.events.randomize_robot_arm_visual_texture = EventTerm( + # func=franka_stack_events.randomize_visual_texture_material, + # mode="reset", + # params={ + # "asset_cfg": SceneEntityCfg("robot"), + # "textures": [ + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Aluminum_Cast/Aluminum_Cast_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Aluminum_Polished/Aluminum_Polished_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Brass/Brass_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Bronze/Bronze_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Brushed_Antique_Copper/Brushed_Antique_Copper_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Cast_Metal_Silver_Vein/Cast_Metal_Silver_Vein_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Copper/Copper_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Gold/Gold_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Iron/Iron_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/RustedMetal/RustedMetal_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Silver/Silver_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Carbon/Steel_Carbon_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Stainless/Steel_Stainless_BaseColor.png", + # ], + # }, + # ) + + #### VISION BASED OBS + self.observations.policy.table_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("table_cam"), "data_type": "rgb", "normalize": False} + ) + self.observations.policy.wrist_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("wrist_cam"), "data_type": "rgb", "normalize": False} + ) + + + + #self.scene.robot = UR10e_ROBOTIQ_GRIPPER_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) + + #self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} + #) + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvVMCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py index 9404c5d07aae..c3fea274b1a4 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py @@ -8,9 +8,11 @@ from isaaclab.utils import configclass from isaaclab.assets import RigidObjectCfg, ArticulationCfg from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import TerminationTermCfg as DoneTerm from . import dev_env_cfg import math from isaaclab.managers import SceneEntityCfg +from isaaclab.managers import ObservationTermCfg as ObsTerm from isaaclab_assets.glassware.glassware import ChemistryGlassware from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp ## @@ -64,7 +66,15 @@ def __post_init__(self): scale=0.5, body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), ) - + self.observations.subtask_terms.appr_goal = ObsTerm( + func=mdp.object_near_goal, + params={ + "threshold": 0.05, + "command_name": "object_pose", + }, + ) + #self.observations.policy.target_object_position = ObsTerm(func=mdp.generated_command_position, params={"command_name": "object_pose"}) + self.terminations.success = DoneTerm(func=mdp.object_near_goal, params={"threshold": 0.05 }) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py index 223211fd0669..2884f74bd029 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py @@ -76,11 +76,20 @@ def __post_init__(self): scale=0.5, body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), ) - #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) - - #self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} - #) - + self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) + self.observations.policy.abs_joint_pos = ObsTerm(func=mdp.get_joint_pos) + self.observations.policy.object_knocked = ObsTerm(func=mdp.object_knocked) + self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15}) + + self.observations.policy.target_object_position = ObsTerm(func=mdp.target_position, params={"object_cfg": SceneEntityCfg("scale")}) + self.observations.subtask_terms.stacked = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("object"), + "lower_object_cfg": SceneEntityCfg("scale"), + }, + ) @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place_vismot.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place_vismot.py new file mode 100755 index 000000000000..fabf3a6cfc84 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place_vismot.py @@ -0,0 +1,206 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.assets import AssetBaseCfg +from isaaclab.sim.spawners.from_files import UsdFileCfg +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, NVIDIA_NUCLEUS_DIR +from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG +from . import dev_env_cfg +import isaaclab.sim as sim_utils +from isaaclab.sensors import CameraCfg +import math +from isaaclab.managers import SceneEntityCfg +from isaaclab_assets.glassware.glassware import ChemistryGlassware +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp import franka_stack_events + +from isaaclab.managers import TerminationTermCfg as DoneTerm +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip +from isaaclab_assets.robots.universal_robots import UR10e_ROBOTIQ_GRIPPER_CFG + +## add some cameras in + + + +@configclass +class FrankaDevEnvVMCfg(dev_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + + + # put the beaker on the stir plate + glassware = ChemistryGlassware() + self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + self.scene.scale = glassware.scale(pos=[0.3, -0.3, 0.01]) + + #### Vision scene + self.scene.wrist_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/Robot/panda_hand/wrist_cam", + update_period=0.0, + height=84, + width=84, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) + ), + offset=CameraCfg.OffsetCfg( + pos=(0.13, 0.0, -0.15), rot=(-0.70614, 0.03701, 0.03701, -0.70614), convention="ros" + ), + ) + self.rerender_on_reset = True + self.sim.render.antialiasing_mode = "OFF" # disable dlss + + # List of image observations in policy observations + self.image_obs_list = ["table_cam", "wrist_cam"] + + + # Set table view camera + self.scene.table_cam = CameraCfg( + prim_path="{ENV_REGEX_NS}/table_cam", + update_period=0.0, + height=84, + width=84, + data_types=["rgb", "distance_to_image_plane"], + spawn=sim_utils.PinholeCameraCfg( + focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) + ), + offset=CameraCfg.OffsetCfg( + pos=(1.0, 0.0, 0.4), rot=(0.35355, -0.61237, -0.61237, 0.35355), convention="ros" + ), + ) + + + self.events.reset_object_position = EventTerm( + func=mdp.reset_place_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object", body_names="Object"), + "asset2_cfg" : SceneEntityCfg("stirplate"), + "asset3_cfg" : SceneEntityCfg("scale") + + }, + ) + + #### VISION BASED EVENTS + self.events.randomize_light = EventTerm( + func=franka_stack_events.randomize_scene_lighting_domelight, + mode="reset", + params={ + "intensity_range": (1500.0, 10000.0), + "color_variation": 0.4, + "textures": [ + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/hospital_room_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Indoor/surgery_4k.hdr", + f"{NVIDIA_NUCLEUS_DIR}/Assets/Skies/Studio/photo_studio_01_4k.hdr", + ], + "default_intensity": 3000.0, + "default_color": (0.75, 0.75, 0.75), + "default_texture": "", + }, + ) + + self.events.randomize_table_visual_material = EventTerm( + func=franka_stack_events.randomize_visual_texture_material, + mode="reset", + params={ + "asset_cfg": SceneEntityCfg("table"), + "textures": [ + f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Stainless/Steel_Stainless_BaseColor.png", + ], + "default_texture": ( + f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/Materials/Textures/DemoTable_TableBase_BaseColor.png" + ), + }, + ) + + # self.events.randomize_robot_arm_visual_texture = EventTerm( + # func=franka_stack_events.randomize_visual_texture_material, + # mode="reset", + # params={ + # "asset_cfg": SceneEntityCfg("robot"), + # "textures": [ + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Aluminum_Cast/Aluminum_Cast_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Aluminum_Polished/Aluminum_Polished_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Brass/Brass_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Bronze/Bronze_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Brushed_Antique_Copper/Brushed_Antique_Copper_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Cast_Metal_Silver_Vein/Cast_Metal_Silver_Vein_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Copper/Copper_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Gold/Gold_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Iron/Iron_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/RustedMetal/RustedMetal_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Silver/Silver_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Carbon/Steel_Carbon_BaseColor.png", + # f"{NVIDIA_NUCLEUS_DIR}/Materials/Base/Metals/Steel_Stainless/Steel_Stainless_BaseColor.png", + # ], + # }, + # ) + + #### VISION BASED OBS + self.observations.policy.table_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("table_cam"), "data_type": "rgb", "normalize": False} + ) + self.observations.policy.wrist_cam = ObsTerm( + func=mdp.image, params={"sensor_cfg": SceneEntityCfg("wrist_cam"), "data_type": "rgb", "normalize": False} + ) + + + + #self.scene.robot = UR10e_ROBOTIQ_GRIPPER_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + prim_path="{ENV_REGEX_NS}/Robot", + init_state=ArticulationCfg.InitialStateCfg( + joint_pos={ + + "panda_joint1": 0.3281, + "panda_joint2": -0.3684, + "panda_joint3": -0.2787, + "panda_joint4": -2.6138, + "panda_joint5": -2.7527, + "panda_joint6": 2.4991, # +90° → keeps hand level + "panda_joint7": 0.3331, + "panda_finger_joint1": 0.04, # open gripper + "panda_finger_joint2": 0.04, + } + ), + ) + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) + + #self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} + #) + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvVMCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py index 40a0566b68d5..35707cb590d8 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py @@ -11,13 +11,18 @@ from isaaclab.managers import EventTermCfg as EventTerm from isaaclab.assets import AssetBaseCfg from isaaclab.sim.spawners.from_files import UsdFileCfg -from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR -from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, NVIDIA_NUCLEUS_DIR +#from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG +from isaaclab_assets.robots.universal_robots import UR10_CFG from . import dev_env_cfg +import isaaclab.sim as sim_utils +from isaaclab.sensors import CameraCfg import math from isaaclab.managers import SceneEntityCfg from isaaclab_assets.glassware.glassware import ChemistryGlassware from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp import franka_stack_events + from isaaclab.managers import TerminationTermCfg as DoneTerm ## # Pre-defined configs @@ -25,6 +30,8 @@ from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip from isaaclab_assets.robots.universal_robots import UR10e_ROBOTIQ_GRIPPER_CFG +## add some cameras in + @configclass @@ -32,25 +39,44 @@ class FrankaDevEnvCfg(dev_env_cfg.FrankaDevEnvCfg): def __post_init__(self): # post init of parent super().__post_init__() - # get the vial from the stirplate and place in vial rack + # put the beaker on the stir plate glassware = ChemistryGlassware() - self.scene.object=glassware.vial(pos=[0.5, 0.0, 0.02],name="Object") self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + #self.scene.scale = glassware.scale(pos=[0.3, -0.3, 0.01]) + self.scene.vialrack = glassware.line_vial_rack(pos=[0.3, -0.3, 0.0], scale=1.5) + self.scene.object = glassware.capped_vial(pos=[0.5, 0.0, 0.01], scale =1.0, name="object") + self.observations.policy.target_object_position = ObsTerm(func=mdp.target_position, params={"object_cfg": SceneEntityCfg("vialrack")}) + + ### subtask + self.observations.subtask_terms.stacked = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("object"), + "lower_object_cfg": SceneEntityCfg("vialrack"), + }, + ) - self.scene.vialrack = glassware.vialrack(pos=[0.3, -0.3, 0.01]) - + self.events.randomise_object_scale= EventTerm( + func=mdp.randomize_rigid_body_scale, + mode="prestartup", + params={ + "scale_range": {"x": (1.0, 1.0), "y": (1.0, 1.0), "z": (1.0, 1.0)}, + "asset_cfg": SceneEntityCfg("object"), + }, + ) self.events.reset_object_position = EventTerm( func=mdp.reset_place_root_state_uniform, mode="reset", params={ "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, "velocity_range": {}, - "asset_cfg": SceneEntityCfg("object", body_names="Object"), + "asset_cfg": SceneEntityCfg("object"), "asset2_cfg" : SceneEntityCfg("stirplate"), - "asset3_cfg" : SceneEntityCfg("scale") - + "asset3_cfg" : SceneEntityCfg("vialrack") }, ) + #self.scene.robot = UR10e_ROBOTIQ_GRIPPER_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( prim_path="{ENV_REGEX_NS}/Robot", @@ -78,10 +104,14 @@ def __post_init__(self): scale=0.5, body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), ) - self.terminations.success=DoneTerm(func=mdp.object_inserted_upright, params={"lower_object_cfg": SceneEntityCfg("vialrack")}) - #self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} - #) + self.terminations.success= DoneTerm(func=mdp.object_inserted_upright, params={"lower_object_cfg": SceneEntityCfg("vialrack")}) + + #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) + + self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} + + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index 9b74ea1e1364..07ff54a32231 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -136,8 +136,8 @@ class PolicyCfg(ObsGroup): joint_pos = ObsTerm(func=mdp.joint_pos_rel) joint_vel = ObsTerm(func=mdp.joint_vel_rel) object_position = ObsTerm(func=mdp.object_position_in_robot_root_frame) - #target_object_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object_pose"}) - target_object_position = ObsTerm(func=mdp.target_position, params={"object_cfg": SceneEntityCfg("scale")}) + target_object_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object_pose"}) + #target_object_position = ObsTerm(func=mdp.target_position, params={"object_cfg": SceneEntityCfg("scale")}) actions = ObsTerm(func=mdp.last_action) # object_to_target = ObsTerm(func=mdp.object_near_goal) eef_pos = ObsTerm(func=mdp.ee_frame_pos) @@ -182,14 +182,7 @@ class SubtaskCfg(ObsGroup): "object_cfg": SceneEntityCfg("object"), }, ) - stacked = ObsTerm( - func=mdp.object_stacked, - params={ - "robot_cfg": SceneEntityCfg("robot"), - "upper_object_cfg": SceneEntityCfg("object"), - "lower_object_cfg": SceneEntityCfg("scale"), - }, - ) + # lift = ObsTerm( # func=mdp.is_object_lifted, # params={ @@ -197,13 +190,7 @@ class SubtaskCfg(ObsGroup): # "threshold" : 0.1 # } # ) - # appr_goal = ObsTerm( - # func=mdp.object_near_goal, - # params={ - # "threshold": 0.05, - # "command_name": "object_pose", - # }, - # ) + # release_object = ObsTerm( # func=mdp.object_released, # params={ @@ -233,16 +220,18 @@ class EventCfg: # self.reset_all.params["loghelper"] = loghelper reset_all = EventTerm(func=mdp.reset_scene_to_default, mode="reset") - reset_object_position = EventTerm( - func=mdp.reset_root_state_uniform, - mode="reset", - params={ - "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.05)}, - "velocity_range": {}, - "asset_cfg": SceneEntityCfg("object", body_names="Object"), - }, - ) + # reset_object_position = EventTerm( + # func=mdp.reset_root_state_uniform, + # mode="reset", + # params={ + # "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.05)}, + # "velocity_range": {}, + # "asset_cfg": SceneEntityCfg("object", body_names="Object"), + # }, + # ) #randomises the scale of the object + + #set this to 1.0 for the vial! randomise_object_scale = EventTerm( func=mdp.randomize_rigid_body_scale, mode="prestartup", @@ -363,7 +352,7 @@ def __post_init__(self): # general settings self.decimation = 2 - self.episode_length_s = 500 + self.episode_length_s = 5000 # simulation settings self.sim.dt = 0.01 # 100Hz self.sim.render_interval = self.decimation diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/franka_stack_events.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/franka_stack_events.py new file mode 100644 index 000000000000..009a44b1b372 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/franka_stack_events.py @@ -0,0 +1,314 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + + +from __future__ import annotations + +import math +import random +import torch +from typing import TYPE_CHECKING + +from isaacsim.core.utils.extensions import enable_extension + +import isaaclab.utils.math as math_utils +from isaaclab.assets import Articulation, AssetBase +from isaaclab.managers import SceneEntityCfg + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedEnv + + +def set_default_joint_pose( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + default_pose: torch.Tensor, + asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), +): + # Set the default pose for robots in all envs + asset = env.scene[asset_cfg.name] + asset.data.default_joint_pos = torch.tensor(default_pose, device=env.device).repeat(env.num_envs, 1) + + +def randomize_joint_by_gaussian_offset( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + mean: float, + std: float, + asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), +): + asset: Articulation = env.scene[asset_cfg.name] + + # Add gaussian noise to joint states + joint_pos = asset.data.default_joint_pos[env_ids].clone() + joint_vel = asset.data.default_joint_vel[env_ids].clone() + joint_pos += math_utils.sample_gaussian(mean, std, joint_pos.shape, joint_pos.device) + + # Clamp joint pos to limits + joint_pos_limits = asset.data.soft_joint_pos_limits[env_ids] + joint_pos = joint_pos.clamp_(joint_pos_limits[..., 0], joint_pos_limits[..., 1]) + + # Don't noise the gripper poses + joint_pos[:, -2:] = asset.data.default_joint_pos[env_ids, -2:] + + # Set into the physics simulation + asset.set_joint_position_target(joint_pos, env_ids=env_ids) + asset.set_joint_velocity_target(joint_vel, env_ids=env_ids) + asset.write_joint_state_to_sim(joint_pos, joint_vel, env_ids=env_ids) + + +def sample_random_color(base=(0.75, 0.75, 0.75), variation=0.1): + """ + Generates a randomized color that stays close to the base color while preserving overall brightness. + The relative balance between the R, G, and B components is maintained by ensuring that + the sum of random offsets is zero. + + Parameters: + base (tuple): The base RGB color with each component between 0 and 1. + variation (float): Maximum deviation to sample for each channel before balancing. + + Returns: + tuple: A new RGB color with balanced random variation. + """ + # Generate random offsets for each channel in the range [-variation, variation] + offsets = [random.uniform(-variation, variation) for _ in range(3)] + # Compute the average offset + avg_offset = sum(offsets) / 3 + # Adjust offsets so their sum is zero (maintaining brightness) + balanced_offsets = [offset - avg_offset for offset in offsets] + + # Apply the balanced offsets to the base color and clamp each channel between 0 and 1 + new_color = tuple(max(0, min(1, base_component + offset)) for base_component, offset in zip(base, balanced_offsets)) + + return new_color + + +def randomize_scene_lighting_domelight( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + intensity_range: tuple[float, float], + color_variation: float, + textures: list[str], + default_intensity: float = 3000.0, + default_color: tuple[float, float, float] = (0.75, 0.75, 0.75), + default_texture: str = "", + asset_cfg: SceneEntityCfg = SceneEntityCfg("light"), +): + asset: AssetBase = env.scene[asset_cfg.name] + light_prim = asset.prims[0] + + intensity_attr = light_prim.GetAttribute("inputs:intensity") + intensity_attr.Set(default_intensity) + + color_attr = light_prim.GetAttribute("inputs:color") + color_attr.Set(default_color) + + texture_file_attr = light_prim.GetAttribute("inputs:texture:file") + texture_file_attr.Set(default_texture) + + if not hasattr(env.cfg, "eval_mode") or not env.cfg.eval_mode: + return + + if env.cfg.eval_type in ["light_intensity", "all"]: + # Sample new light intensity + new_intensity = random.uniform(intensity_range[0], intensity_range[1]) + # Set light intensity to light prim + intensity_attr.Set(new_intensity) + + if env.cfg.eval_type in ["light_color", "all"]: + # Sample new light color + new_color = sample_random_color(base=default_color, variation=color_variation) + # Set light color to light prim + color_attr.Set(new_color) + + if env.cfg.eval_type in ["light_texture", "all"]: + # Sample new light texture (background) + new_texture = random.sample(textures, 1)[0] + # Set light texture to light prim + texture_file_attr.Set(new_texture) + + +def sample_object_poses( + num_objects: int, + min_separation: float = 0.0, + pose_range: dict[str, tuple[float, float]] = {}, + max_sample_tries: int = 5000, +): + range_list = [pose_range.get(key, (0.0, 0.0)) for key in ["x", "y", "z", "roll", "pitch", "yaw"]] + pose_list = [] + + for i in range(num_objects): + for j in range(max_sample_tries): + sample = [random.uniform(range[0], range[1]) for range in range_list] + + # Accept pose if it is the first one, or if reached max num tries + if len(pose_list) == 0 or j == max_sample_tries - 1: + pose_list.append(sample) + break + + # Check if pose of object is sufficiently far away from all other objects + separation_check = [math.dist(sample[:3], pose[:3]) > min_separation for pose in pose_list] + if False not in separation_check: + pose_list.append(sample) + break + + return pose_list + + +def randomize_object_pose( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + asset_cfgs: list[SceneEntityCfg], + min_separation: float = 0.0, + pose_range: dict[str, tuple[float, float]] = {}, + max_sample_tries: int = 5000, +): + if env_ids is None: + return + + # Randomize poses in each environment independently + for cur_env in env_ids.tolist(): + pose_list = sample_object_poses( + num_objects=len(asset_cfgs), + min_separation=min_separation, + pose_range=pose_range, + max_sample_tries=max_sample_tries, + ) + + # Randomize pose for each object + for i in range(len(asset_cfgs)): + asset_cfg = asset_cfgs[i] + asset = env.scene[asset_cfg.name] + + # Write pose to simulation + pose_tensor = torch.tensor([pose_list[i]], device=env.device) + positions = pose_tensor[:, 0:3] + env.scene.env_origins[cur_env, 0:3] + orientations = math_utils.quat_from_euler_xyz(pose_tensor[:, 3], pose_tensor[:, 4], pose_tensor[:, 5]) + asset.write_root_pose_to_sim( + torch.cat([positions, orientations], dim=-1), env_ids=torch.tensor([cur_env], device=env.device) + ) + asset.write_root_velocity_to_sim( + torch.zeros(1, 6, device=env.device), env_ids=torch.tensor([cur_env], device=env.device) + ) + + +def randomize_rigid_objects_in_focus( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + asset_cfgs: list[SceneEntityCfg], + out_focus_state: torch.Tensor, + min_separation: float = 0.0, + pose_range: dict[str, tuple[float, float]] = {}, + max_sample_tries: int = 5000, +): + if env_ids is None: + return + + # List of rigid objects in focus for each env (dim = [num_envs, num_rigid_objects]) + env.rigid_objects_in_focus = [] + + for cur_env in env_ids.tolist(): + # Sample in focus object poses + pose_list = sample_object_poses( + num_objects=len(asset_cfgs), + min_separation=min_separation, + pose_range=pose_range, + max_sample_tries=max_sample_tries, + ) + + selected_ids = [] + for asset_idx in range(len(asset_cfgs)): + asset_cfg = asset_cfgs[asset_idx] + asset = env.scene[asset_cfg.name] + + # Randomly select an object to bring into focus + object_id = random.randint(0, asset.num_objects - 1) + selected_ids.append(object_id) + + # Create object state tensor + object_states = torch.stack([out_focus_state] * asset.num_objects).to(device=env.device) + pose_tensor = torch.tensor([pose_list[asset_idx]], device=env.device) + positions = pose_tensor[:, 0:3] + env.scene.env_origins[cur_env, 0:3] + orientations = math_utils.quat_from_euler_xyz(pose_tensor[:, 3], pose_tensor[:, 4], pose_tensor[:, 5]) + object_states[object_id, 0:3] = positions + object_states[object_id, 3:7] = orientations + + asset.write_object_state_to_sim( + object_state=object_states, env_ids=torch.tensor([cur_env], device=env.device) + ) + + env.rigid_objects_in_focus.append(selected_ids) + + +def randomize_visual_texture_material( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + asset_cfg: SceneEntityCfg, + textures: list[str], + default_texture: str = "", + texture_rotation: tuple[float, float] = (0.0, 0.0), +): + """Randomize the visual texture of bodies on an asset using Replicator API. + + This function randomizes the visual texture of the bodies of the asset using the Replicator API. + The function samples random textures from the given texture paths and applies them to the bodies + of the asset. The textures are projected onto the bodies and rotated by the given angles. + + .. note:: + The function assumes that the asset follows the prim naming convention as: + "{asset_prim_path}/{body_name}/visuals" where the body name is the name of the body to + which the texture is applied. This is the default prim ordering when importing assets + from the asset converters in Isaac Lab. + + .. note:: + When randomizing the texture of individual assets, please make sure to set + :attr:`isaaclab.scene.InteractiveSceneCfg.replicate_physics` to False. This ensures that physics + parser will parse the individual asset properties separately. + """ + if hasattr(env.cfg, "eval_mode") and ( + not env.cfg.eval_mode or env.cfg.eval_type not in [f"{asset_cfg.name}_texture", "all"] + ): + return + # textures = [default_texture] + + # enable replicator extension if not already enabled + enable_extension("omni.replicator.core") + # we import the module here since we may not always need the replicator + import omni.replicator.core as rep + + # check to make sure replicate_physics is set to False, else raise error + # note: We add an explicit check here since texture randomization can happen outside of 'prestartup' mode + # and the event manager doesn't check in that case. + if env.cfg.scene.replicate_physics: + raise RuntimeError( + "Unable to randomize visual texture material with scene replication enabled." + " For stable USD-level randomization, please disable scene replication" + " by setting 'replicate_physics' to False in 'InteractiveSceneCfg'." + ) + + # convert from radians to degrees + texture_rotation = tuple(math.degrees(angle) for angle in texture_rotation) + + # obtain the asset entity + asset = env.scene[asset_cfg.name] + + # join all bodies in the asset + body_names = asset_cfg.body_names + if isinstance(body_names, str): + body_names_regex = body_names + elif isinstance(body_names, list): + body_names_regex = "|".join(body_names) + else: + body_names_regex = ".*" + + if not hasattr(asset, "cfg"): + prims_group = rep.get.prims(path_pattern=f"{asset.prim_paths[0]}/visuals") + else: + prims_group = rep.get.prims(path_pattern=f"{asset.cfg.prim_path}/{body_names_regex}/visuals") + + with prims_group: + rep.randomizer.texture( + textures=textures, project_uvw=True, texture_rotate=rep.distribution.uniform(*texture_rotation) + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py index 119f5ef00407..a74a3b97cd11 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py @@ -183,7 +183,7 @@ def gripper_pos(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityC def object_near_goal( env: ManagerBasedRLEnv, command_name: str = "object_pose", - threshold: float = 0.05, + threshold: float = 0.1, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), object_cfg: SceneEntityCfg = SceneEntityCfg("object"), # loghelper : LoggingHelper = LoggingHelper() @@ -333,6 +333,14 @@ def target_pose( object_quat_w = object.data.root_quat_w # (num_envs, 4) - already wxyz format return torch.cat([object_pos_w, object_quat_w], dim=-1) # (num_envs, 7) +def generated_command_position( + env: ManagerBasedRLEnv, + command_name: str +) -> torch.Tensor: + """The generated command position (first 3 elements).""" + command = env.command_manager.get_command(command_name) + return command[:, :3] + # def object_distance_to_goal( # env: ManagerBasedRLEnv, # object_cfg: SceneEntityCfg = SceneEntityCfg("object"), diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py index fa2ab92788f9..399ab972ffeb 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py @@ -52,7 +52,7 @@ def object_reached_goal( des_pos_w, _ = combine_frame_transforms(robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], des_pos_b) # distance of the end-effector to the object: (num_envs,) distance = torch.norm(des_pos_w - object.data.root_pos_w[:, :3], dim=1) - # print(f"For DEBUG : DISTANCE TO GOAL : {distance}") + print(f"For DEBUG : DISTANCE TO GOAL : {distance}") # if(distance.item() < threshold): # loghelper.logsubtask(LogType.FINISH) test = distance < threshold @@ -160,6 +160,7 @@ def object_stacked(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEnti pos_diff = upper_object.data.root_pos_w - lower_object.data.root_pos_w height_dist = torch.linalg.vector_norm(pos_diff[:, 2:], dim=1) xy_dist = torch.linalg.vector_norm(pos_diff[:, :2], dim=1) + #print(f"For DEBUG : xy_dist : {xy_dist}, height_dist : {height_dist}") stacked = torch.logical_and(xy_dist < xy_threshold, (height_dist - height_diff) < height_threshold) # stacked = torch.logical_and(torch.isclose(robot.data.joint_pos[:, -1], # gripper_open_val.to(env.device), atol=1e-4, rtol=1e-4), stacked) @@ -170,7 +171,7 @@ def object_stacked(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEnti def object_inserted_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"),lower_object_cfg: SceneEntityCfg = SceneEntityCfg("vialrack"), - xy_threshold: float = 0.01, height_threshold: float = 0.01, height_diff: float = 0.05, + xy_threshold: float = 0.01, height_threshold: float = 0.03, height_diff: float = 0.0, atol=0.0001, rtol=0.0001, upright_good_deg: float = 30.0, gripper_open_val: torch.Tensor = torch.tensor([0.04]), logging=False) -> torch.Tensor: @@ -183,6 +184,7 @@ def object_inserted_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = upright_good = tilt_deg <= upright_good_deg stacked = object_stacked(env, robot_cfg, upper_object_cfg, lower_object_cfg, xy_threshold, height_threshold, height_diff, gripper_open_val) + #print(f"For DEBUG : STACKED STATUS : {stacked}") stacked_upright = stacked & upright_good gripper_joint_ids, _ = robot.find_joints(env.cfg.gripper_joint_names) stacked = torch.logical_and( @@ -201,7 +203,7 @@ def object_inserted_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = atol=atol, rtol=rtol, ), - stacked, + stacked_upright, ) #if logging: @@ -210,4 +212,4 @@ def object_inserted_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = #if idx.numel() > 0: # print(f"[stacked-upright tilt] n={int(idx.numel())} sample={tilt_deg[idx][:5].tolist()}") - return inserted \ No newline at end of file + return stacked \ No newline at end of file From a8a7c5dbde098fc0af78971fdd9265c3eaafd6c1 Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Fri, 6 Mar 2026 14:25:45 +0000 Subject: [PATCH 13/15] fixed comms --- .vscode/browse.vc.db | Bin 688128 -> 0 bytes docs/find_best_checkpoints.py | 2 +- .../vial_insert/20260216134807/config.json | 236 +++++++++ docs/run_experiments.sh | 30 +- .../teleoperation/teleop_se3_agent.py | 12 + .../robomimic/backup_controller_handler.py | 33 +- .../robomimic/backup_controller_insert.py | 163 ++++-- .../robomimic/backup_controller_insert_top.py | 478 ++++++++++++++++++ .../robomimic/play_controller.py | 2 +- .../robomimic/play_ensemble_v05.py | 62 ++- .../robomimic/play_with_backup.py | 2 +- .../robomimic/switching_logic_algorithm.tex | 62 +++ .../robomimic/train_ensemble.py | 4 +- scripts/tools/record_SM_demos.py | 364 +++++++++++++ scripts/tools/start_discovery_server.sh | 32 ++ .../isaaclab/envs/mdp/observations.py | 1 + .../isaaclab_mimic/datagen/generation.py | 6 +- .../isaaclab_mimic/envs/cube_mimic_env_cfg.py | 2 +- .../cube_lift/config/franka/__init__.py | 14 + .../agents/robomimic/bc_rnn_low_dim.json | 4 +- .../config/franka/dev_ik_rel_env_place.py | 2 +- .../config/franka/dev_ik_rel_vial_insert.py | 4 +- .../franka/dev_ik_rel_vial_insert_top_down.py | 127 +++++ .../manipulation/cube_lift/lift_env_cfg.py | 2 +- .../cube_lift/mdp/observations.py | 12 +- .../cube_lift/mdp/terminations.py | 9 +- 26 files changed, 1558 insertions(+), 107 deletions(-) delete mode 100644 .vscode/browse.vc.db create mode 100644 docs/insert/Dev-IK-Rel-Insert-v0_old/model5/vial_insert/20260216134807/config.json create mode 100644 scripts/imitation_learning/robomimic/backup_controller_insert_top.py create mode 100644 scripts/imitation_learning/robomimic/switching_logic_algorithm.tex create mode 100644 scripts/tools/record_SM_demos.py create mode 100644 scripts/tools/start_discovery_server.sh create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert_top_down.py diff --git a/.vscode/browse.vc.db b/.vscode/browse.vc.db deleted file mode 100644 index 5b28fda5fa585718589316f44e843e97bc677c91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688128 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 None: if teleoperation_active: # process actions actions = action.repeat(env.num_envs, 1) + # process_action(actions) # apply actions env.step(actions) else: @@ -255,6 +262,11 @@ def stop_teleoperation() -> None: env.close() print("Environment closed") +def process_action(action): + ## handler that will spit out ROS2 commands + + print(f"Teleop Actions : {action}") + if __name__ == "__main__": # run the main function diff --git a/scripts/imitation_learning/robomimic/backup_controller_handler.py b/scripts/imitation_learning/robomimic/backup_controller_handler.py index f6e63d51df63..7edbdf5847f6 100644 --- a/scripts/imitation_learning/robomimic/backup_controller_handler.py +++ b/scripts/imitation_learning/robomimic/backup_controller_handler.py @@ -6,6 +6,7 @@ from backup_controller import BackupControllerSM from backup_controller_place import BackupControllerPlaceSM from backup_controller_insert import BackupControllerInsertSM +from backup_controller_insert_top import BackupControllerInsertTopSM import torch @@ -41,7 +42,10 @@ def _get_controller(self): print(f"[DEBUG] Using Place Backup Controller") return BackupControllerPlaceSM(dt=0.01*2, num_envs=self.num_envs, position_threshold=0.02, device='cuda', offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0'), goal_quat = self.object_goal_rot, goal_pos= self.object_goal_pos) case "insert": - return BackupControllerInsertSM(0.01*2, self.num_envs,'cuda' , 0.02) + return BackupControllerInsertSM(dt=0.01*2, num_envs=self.num_envs, position_threshold=0.02, device='cuda', offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0'), goal_quat = self.object_goal_rot, goal_pos= self.object_goal_pos) + case "insert_top": + ### check this quat + return BackupControllerInsertTopSM(dt=0.01*2, num_envs=self.num_envs, position_threshold=0.02, device='cuda', offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0'), goal_quat = self.object_goal_rot, goal_pos= self.object_goal_pos) case _: raise ValueError(f"Unknown task type {self.tasktype} for backup controller") @@ -55,7 +59,9 @@ def _get_goal_pos(self): goal_pos = self.env.unwrapped.scene["scale"].data.root_pose_w # print(f"[DEBUG] Getting goal pos for place task {goal_pos}") return self.env.unwrapped.scene["scale"].data.root_pose_w - + case "insert_top": + # still vial rack + return self.env.unwrapped.scene["vialrack"].data.root_pose_w case "insert": return self.env.unwrapped.scene["vialrack"].data.root_pose_w @@ -69,9 +75,20 @@ def _get_goal_rot(self): goal_rot = self.env.unwrapped.command_manager.get_command("object_pose") print(f"[DEBUG] Getting goal quat for place task {goal_rot}") return self.env.unwrapped.command_manager.get_command("object_pose") - + case "insert_top": + object_pos = self.env.unwrapped.scene["object"].data.root_pose_w + rest_rot = torch.tensor([[ 0, 1, 0, 0]], device=self.device) + + goal_rot = torch.cat([object_pos[:, :3],rest_rot], dim =-1) + example = self.env.unwrapped.command_manager.get_command("object_pose") + print(f"example {example}") + #goal_rot= self.env.unwrapped.scene["object"].data.root_com_pose_w + print(f"Goal rot : {goal_rot}") + #goal_rot = torch.tensor([[0,1,0,0]], device=self.device)#self.env.unwrapped.command_manager.get_command("object_pose") + return goal_rot #self.env.unwrapped.command_manager.get_command("object_pose") case "insert": - return self.env.unwrapped.scene["vialrack"].data.root_pose_w + goal_rot = self.env.unwrapped.command_manager.get_command("object_pose") + return self.env.unwrapped.command_manager.get_command("object_pose") def reset(self): self.backup_controller.reset_idx() @@ -89,9 +106,15 @@ def _get_rest_pos(self): # lets change this into the 6 element tensor they are expecting roll,pitch,yaw = euler_xyz_from_quat(ee_recovery_rot) rest_pos = torch.cat([rest_pos, ee_recovery_rot], dim =-1) + + #print(f"rpy version :{torch.cat([rest_pos,roll.unsqueeze(0), pitch.unsqueeze(0), yaw.unsqueeze(0)], dim =-1)}") + if self.tasktype == "insert_top": + rest_pos = torch.tensor([[ 0.6226, -0.0621, 0.3555]], device=self.device) + rest_rot = torch.tensor([[ 0, 1, 0, 0]], device=self.device) + roll,pitch,yaw = euler_xyz_from_quat(rest_rot) + rest_pos = torch.cat([rest_pos,rest_rot], dim =-1) print(f"Rest pos {rest_pos}") print(f"rpy : {roll}, {pitch}, {yaw}") - #print(f"rpy version :{torch.cat([rest_pos,roll.unsqueeze(0), pitch.unsqueeze(0), yaw.unsqueeze(0)], dim =-1)}") return rest_pos def _setup_robot(self): diff --git a/scripts/imitation_learning/robomimic/backup_controller_insert.py b/scripts/imitation_learning/robomimic/backup_controller_insert.py index 5c12bdd60aea..51dfa4f2ca4c 100644 --- a/scripts/imitation_learning/robomimic/backup_controller_insert.py +++ b/scripts/imitation_learning/robomimic/backup_controller_insert.py @@ -25,7 +25,8 @@ class BackupSMWaitTime: LIFT_OBJECT = wp.constant(0.3) MIDPOINT = wp.constant(0.1) APPROACH_ABOVE_GOAL = wp.constant(0.1) - APPROACH_GOAL = wp.constant(6) + APPROACH_GOAL = wp.constant(0.1) + UNGRASP_OBJECT = wp.constant(1.0) class BackupSM: """States for the pick state machine.""" @@ -38,12 +39,27 @@ class BackupSM: MIDPOINT = wp.constant(5) APPROACH_ABOVE_GOAL = wp.constant(6) APPROACH_GOAL = wp.constant(7) - #UNGRASP_OBJECT = wp.constant(7) + UNGRASP_OBJECT = wp.constant(8) @wp.func def distance_below_threshold(current_pos: wp.vec3, desired_pos: wp.vec3, threshold: float) -> bool: return wp.length(current_pos - desired_pos) < threshold +@wp.func +def rotation_within_threshold(current_rot: wp.quat, desired_rot: wp.quat, threshold_rad: float) -> bool: + # Quaternion angular distance: angle = 2 * acos(|q1 · q2|) + # |dot| clamped to [0,1] to guard against floating point > 1 + dot = wp.abs( + current_rot[0] * desired_rot[0] + + current_rot[1] * desired_rot[1] + + current_rot[2] * desired_rot[2] + + current_rot[3] * desired_rot[3] + ) + dot = wp.min(dot, float(1.0)) + angle = float(2.0) * wp.acos(dot) + # print(f"angle : {angle}, threshold : {threshold_rad}") + return angle < threshold_rad + @wp.kernel def infer_state_machine( @@ -55,6 +71,7 @@ def infer_state_machine( current_object_pose: wp.array(dtype=wp.transform), # current object pose final_object_pose: wp.array(dtype=wp.transform), rest_ee_pose : wp.array(dtype=wp.transform), # rest position + goal_quat : wp.array(dtype=wp.transform), # goal rotation des_ee_pose: wp.array(dtype=wp.transform), # what we return gripper_state: wp.array(dtype=float), offset: wp.array(dtype=wp.transform), @@ -69,22 +86,26 @@ def infer_state_machine( state = sm_state[tid] # decide next state if state == BackupSM.REST: + # print("[SM State REST]") # First lift up to a safe height, then go to rest position current_ee_pos = wp.transform_get_translation(ee_pose[tid]) rest_pos = wp.transform_get_translation(rest_ee_pose[tid]) - rest_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + rest_rot = wp.transform_get_rotation(goal_quat[tid]) # If we're below safe height, first move up - safe_height = 0.35 # Safe z-height to avoid collisions + safe_height = 0.15 # Safe z-height to avoid collisions if current_ee_pos.z < safe_height: # Lift straight up first - lift_pos = wp.vec3(current_ee_pos.x, current_ee_pos.y, safe_height) + lift_pos = wp.vec3(current_ee_pos.x, current_ee_pos.y, 0.2) des_ee_pose[tid] = wp.transform(lift_pos, rest_rot) + #print("[SM REST doing safe ee lift]") else: # Already at safe height, move to rest position - des_ee_pose[tid] = rest_ee_pose[tid] + pose_pos = wp.transform_get_translation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + des_ee_pose[tid] = wp.transform(pose_pos, pose_rot) - gripper_state[tid] = GripperState.CLOSE + gripper_state[tid] = GripperState.OPEN # wait for a while if distance_below_threshold( wp.transform_get_translation(ee_pose[tid]), @@ -96,12 +117,14 @@ def infer_state_machine( # move to next state and reset wait time sm_state[tid] = BackupSM.APPROACH_ABOVE_OBJECT sm_wait_time[tid] = 0.0 + else: + print("[SM REST] wait timer ") elif state == BackupSM.APPROACH_ABOVE_OBJECT: # print("[SM] APPR above obj") pose_pos = wp.transform_get_translation(current_object_pose[tid]) - pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) # Go to a safe height ABOVE the object (z + 0.15m) with x offset - safe_above_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y, pose_pos.z + 0.15) + safe_above_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z + 0.20) des_ee_pose[tid] = wp.transform(safe_above_pos, pose_rot) gripper_state[tid] = GripperState.OPEN # Open gripper in preparation if distance_below_threshold( @@ -119,16 +142,22 @@ def infer_state_machine( # print("[SM] approach object") pose_pos = wp.transform_get_translation(current_object_pose[tid]) - pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) # Apply offset in x-direction (5 cm = 0.05 m) - offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.02) #sample vial + 0.04 + offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z) #sample vial + 0.04 des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) gripper_state[tid] = GripperState.OPEN - if distance_below_threshold( + pos_ok = distance_below_threshold( wp.transform_get_translation(ee_pose[tid]), wp.transform_get_translation(des_ee_pose[tid]), - position_threshold, - ): + 0.02, + ) + rot_ok = rotation_within_threshold( + wp.transform_get_rotation(ee_pose[tid]), + wp.transform_get_rotation(goal_quat[tid]), + float(0.05), # ~8.6 degrees tolerance + ) + if pos_ok and rot_ok: if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_OBJECT: # move to next state and reset wait time print("[SM_INFO] : Moving from APPR_OBJ to GRASP_OBJECT") @@ -137,9 +166,9 @@ def infer_state_machine( elif state == BackupSM.GRASP_OBJECT: # print("[SM] GRASP") pose_pos = wp.transform_get_translation(current_object_pose[tid]) - pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) # Stay at the approach position while closing gripper - offset_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y + 0.02, pose_pos.z + 0.02) + offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z) des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) gripper_state[tid] = GripperState.CLOSE # wait for a while @@ -150,11 +179,12 @@ def infer_state_machine( sm_wait_time[tid] = 0.0 elif state == BackupSM.LIFT_OBJECT: - #print("[SM] LIFT") # uses starting position - pose_pos = wp.transform_get_translation(object_pose[tid]) - pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + #print("[SM] LIFT") # uses current object position (not start pose) + # pose_pos = wp.transform_get_translation(object_pose[tid]) + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) # Apply offset in x-direction (5 cm = 0.05 m) - offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 + offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, 0.25) #sample vial + 0.04 des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) gripper_state[tid] = GripperState.CLOSE # wait for a while @@ -172,10 +202,10 @@ def infer_state_machine( elif state == BackupSM.MIDPOINT: #print("[SM] MIDPOINT") pose_pos = wp.transform_get_translation(rest_ee_pose[tid]) - pose_rot = wp.transform_get_rotation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) # Apply offset in x-direction (5 cm = 0.05 m) #offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 - des_ee_pose[tid] = rest_ee_pose[tid] + des_ee_pose[tid] = wp.transform(pose_pos, pose_rot) gripper_state[tid] = GripperState.CLOSE # wait for a while if distance_below_threshold( @@ -191,25 +221,28 @@ def infer_state_machine( sm_wait_time[tid] = 0.0 elif state == BackupSM.APPROACH_ABOVE_GOAL: #print("[SM] Approach above goal") - offset_pos = wp.transform_get_translation(offset[tid]) - offset_rot = wp.transform_get_rotation(offset[tid]) - offset_pos = wp.vec3(offset_pos.x, offset_pos.y, offset_pos.z) # raise 25 cm - new_offset = wp.transform(offset_pos, offset_rot) - above_target_pose = wp.transform_multiply(new_offset, final_object_pose[tid]) + offset_pos = wp.transform_get_translation(final_object_pose[tid]) + offset_rot = wp.transform_get_rotation(goal_quat[tid]) + safe_above_pos = wp.vec3(offset_pos.x, offset_pos.y + 0.1, offset_pos.z + 0.25) + #offset_pos = wp.vec3(offset_pos.x, offset_pos.y, offset_pos.z) # raise 25 cm + above_target_pose = wp.transform(safe_above_pos, offset_rot) + #above_target_pose = wp.transform_multiply(new_offset, final_object_pose[tid]) # Blend time for smooth approach - APPROACH_BLEND_TIME = 0.4 # seconds, tune as needed - alpha = wp.clamp(sm_wait_time[tid] / APPROACH_BLEND_TIME, 0.0, 1.0) - # Interpolate position and rotation - current_pos = wp.transform_get_translation(ee_pose[tid]) - current_rot = wp.transform_get_rotation(ee_pose[tid]) + # APPROACH_BLEND_TIME = 0.4 # seconds, tune as needed + # alpha = wp.clamp(sm_wait_time[tid] / APPROACH_BLEND_TIME, 0.0, 1.0) + # # Interpolate position and rotation + # current_pos = wp.transform_get_translation(ee_pose[tid]) + # current_rot = wp.transform_get_rotation(ee_pose[tid]) - target_pos = wp.transform_get_translation(above_target_pose) - target_rot = wp.transform_get_rotation(above_target_pose) + # target_pos = wp.transform_get_translation(above_target_pose) + # target_rot = wp.transform_get_rotation(above_target_pose) - pos_interp = wp.lerp(current_pos, target_pos, alpha) - rot_interp = wp.quat_slerp(current_rot, target_rot, alpha) - # Set interpolated pose - des_ee_pose[tid] = wp.transform(pos_interp, rot_interp) + # pos_interp = wp.lerp(current_pos, target_pos, alpha) + # rot_interp = wp.quat_slerp(current_rot, target_rot, alpha) + # # Set interpolated pose + # des_ee_pose[tid] = wp.transform(pos_interp, rot_interp) + #safe_above_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y, pose_pos.z + 0.15) + des_ee_pose[tid] = above_target_pose gripper_state[tid] = GripperState.CLOSE # Evaluate readiness to transition if distance_below_threshold( @@ -224,23 +257,36 @@ def infer_state_machine( #print("[SM] approach goal") # print("[SM_INFO] : in state ungrasp") pose_pos = wp.transform_get_translation(final_object_pose[tid]) - pose_rot = wp.transform_get_rotation(final_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) # Apply offset in x-direction (5 cm = 0.05 m) - offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z+0.02) + offset_pos = wp.vec3(pose_pos.x, pose_pos.y+0.1, pose_pos.z+0.07) des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) gripper_state[tid] = GripperState.CLOSE # wait for a while if distance_below_threshold( wp.transform_get_translation(ee_pose[tid]), wp.transform_get_translation(des_ee_pose[tid]), - 0.01, + 0.02, ): if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_GOAL: # move to next state and reset wait time - print("[SM_INFO] : Moving from apprach goal to rest") - sm_state[tid] = BackupSM.REST + print("[SM_INFO] : Moving from approach goal to ungrasp") + sm_state[tid] = BackupSM.UNGRASP_OBJECT sm_wait_time[tid] = 0.0 - + elif state == BackupSM.UNGRASP_OBJECT: + # print("[SM] GRASP") + pose_pos = wp.transform_get_translation(final_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Stay at the approach position while closing gripper + offset_pos = wp.vec3(pose_pos.x , pose_pos.y + 0.1, pose_pos.z+0.01) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.UNGRASP_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from UNGRASP_OBJECT to REST") + sm_state[tid] = BackupSM.REST + sm_wait_time[tid] = 0.0 # increment wait time sm_wait_time[tid] = sm_wait_time[tid] + dt[tid] @@ -251,7 +297,7 @@ def infer_state_machine( class BackupControllerInsertSM: - def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", position_threshold=0.02, offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0')): + def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", position_threshold=0.02, offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0'), goal_quat = torch.tensor([[0, 0, 0, 0,0,0,0]], device='cuda:0'), goal_pos = torch.tensor([[0, 0, 0, 0,0,0,0]], device='cuda:0')): """Initialize the state machine. Args: @@ -261,13 +307,14 @@ def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", """ ## debug - print(f'dt : {dt},num_envs {num_envs}, device {device}, pos_thresh {position_threshold} ') + print(f'dt : {dt},num_envs {num_envs}, \n device {device}, pos_thresh {position_threshold} \n goal_quat {goal_quat} \n goal_pos {goal_pos}') # save parameters self.dt = float(dt) self.num_envs = num_envs self.device = device self.position_threshold = position_threshold - + self.goal_quat = goal_quat + self.goal_pos = goal_pos # initialize state machine self.sm_dt = torch.full((self.num_envs,), self.dt, device=self.device) self.sm_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) @@ -278,6 +325,7 @@ def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", self.des_gripper_state = torch.full((self.num_envs,), 0.0, device=self.device) self.final_object_pose = torch.zeros((self.num_envs, 7), device=self.device) self.rest_pose = torch.zeros((self.num_envs, 7), device=self.device) + # approach above object offset self.offset = torch.zeros((self.num_envs, 7), device=self.device) @@ -294,6 +342,7 @@ def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", self.final_object_pose_wp = wp.from_torch(self.final_object_pose, wp.transform) self.rest_pose_wp = wp.from_torch(self.rest_pose, wp.transform) self.offset_wp = wp.from_torch(self.offset, wp.transform) + self.goal_quat_wp = wp.from_torch(self.goal_quat, wp.transform) ## For Debug self.debug_des_pose = torch.zeros((self.num_envs, 7), device=self.device) self.debug_cur_pose = torch.zeros((self.num_envs, 7), device=self.device) @@ -358,22 +407,25 @@ def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, curren # print("-" * 80) # print(f"Got given state {sm_state}") current_object_pose = self._ensure_7d(current_object_pose, self.device) - final_object_pose = self._ensure_7d(final_object_pose, self.device) + final_object_pose = self._ensure_7d(self.goal_pos, self.device) ee_pose = self._ensure_7d(ee_pose, self.device) start_object_pose = self._ensure_7d(start_object_pose, self.device) rest_pose = self._ensure_7d(rest_pose, self.device) + goal_quat = self._ensure_7d(self.goal_quat, self.device) # now safe to reorder ee_pose = ee_pose[:, [0, 1, 2, 4, 5, 6, 3]] start_object_pose = start_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] current_object_pose = current_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] final_object_pose = final_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] rest_pose = rest_pose[:, [0, 1, 2, 4, 5, 6, 3]] + goal_quat = goal_quat[:, [0, 1, 2, 4, 5, 6, 3]] # convert to warp ee_pose_wp = wp.from_torch(ee_pose.contiguous(), wp.transform) start_object_pose_wp = wp.from_torch(start_object_pose.contiguous(), wp.transform) current_object_pose_wp = wp.from_torch(current_object_pose.contiguous(), wp.transform) final_object_pose_wp = wp.from_torch(final_object_pose.contiguous(), wp.transform) rest_pose_wp = wp.from_torch(rest_pose.contiguous(), wp.transform) + goal_quat_wp = wp.from_torch(goal_quat.contiguous(), wp.transform) # run state machine # get state from env - convert to warp again self.sm_state[env_num] = sm_state @@ -391,6 +443,7 @@ def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, curren current_object_pose_wp, final_object_pose_wp, rest_pose_wp, + goal_quat_wp, self.des_ee_pose_wp, self.des_gripper_state_wp, self.offset_wp, @@ -404,17 +457,21 @@ def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, curren des_debug = self.debug_des_pose.detach().cpu().numpy() cur_debug = self.debug_cur_pose.detach().cpu().numpy() debug_state = self.debug_state.detach().cpu().numpy() + goal_quat_debug = self.goal_quat.detach().cpu().numpy() for i in range(self.num_envs): des_pos, des_quat = des_debug[i][:3], des_debug[i][3:] cur_pos, cur_quat = cur_debug[i][:3], cur_debug[i][3:] + goal_quat = goal_quat_debug[i][3:] # compute Euclidean distance with numpy dist = np.linalg.norm(cur_pos - des_pos) # print(f"StateMachine debug state {debug_state}") - # print(f"[Env {i}]") - # print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") - # print(f" Desired -> pos: {des_pos}, quat: {des_quat}") - #print(f" Euclidean distance: {dist:.4f}") - #print(f"returned state : {self.sm_state}") + # # print(f"[Env {i}]") + # print(f" Goal pose : {final_object_pose}") + # print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") + # print(f" Desired -> pos: {des_pos}, quat: {des_quat}") + # print(f" Goal quat -> : {goal_quat}") + # print(f" Euclidean distance: {dist:.4f}") + # #print(f"returned state : {self.sm_state}") # convert transformations back to (w, x, y, z) des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] # convert to torch diff --git a/scripts/imitation_learning/robomimic/backup_controller_insert_top.py b/scripts/imitation_learning/robomimic/backup_controller_insert_top.py new file mode 100644 index 000000000000..5a893b089255 --- /dev/null +++ b/scripts/imitation_learning/robomimic/backup_controller_insert_top.py @@ -0,0 +1,478 @@ +import warp as wp +import gymnasium as gym +import torch +from collections.abc import Sequence +import numpy as np + +# this is a backup state machine controller +# initialize warp +wp.init() + + +class GripperState: + """States for the gripper.""" + + OPEN = wp.constant(1.0) + CLOSE = wp.constant(-1.0) + +class BackupSMWaitTime: + """Additional wait times (in s) for states for before switching.""" + + REST = wp.constant(0.5) + APPROACH_ABOVE_OBJECT = wp.constant(0.3) + APPROACH_OBJECT = wp.constant(0.3) + GRASP_OBJECT = wp.constant(0.1) # 1 second wait + 0.3 for gripper to close + LIFT_OBJECT = wp.constant(0.3) + MIDPOINT = wp.constant(0.1) + APPROACH_ABOVE_GOAL = wp.constant(0.1) + APPROACH_GOAL = wp.constant(0.1) + UNGRASP_OBJECT = wp.constant(1.0) + +class BackupSM: + """States for the pick state machine.""" + + REST = wp.constant(0) + APPROACH_ABOVE_OBJECT = wp.constant(1) + APPROACH_OBJECT = wp.constant(2) + GRASP_OBJECT = wp.constant(3) + LIFT_OBJECT = wp.constant(4) + MIDPOINT = wp.constant(5) + APPROACH_ABOVE_GOAL = wp.constant(6) + APPROACH_GOAL = wp.constant(7) + UNGRASP_OBJECT = wp.constant(8) + +@wp.func +def distance_below_threshold(current_pos: wp.vec3, desired_pos: wp.vec3, threshold: float) -> bool: + return wp.length(current_pos - desired_pos) < threshold + +@wp.func +def rotation_within_threshold(current_rot: wp.quat, desired_rot: wp.quat, threshold_rad: float) -> bool: + # Quaternion angular distance: angle = 2 * acos(|q1 · q2|) + # |dot| clamped to [0,1] to guard against floating point > 1 + dot = wp.abs( + current_rot[0] * desired_rot[0] + + current_rot[1] * desired_rot[1] + + current_rot[2] * desired_rot[2] + + current_rot[3] * desired_rot[3] + ) + dot = wp.min(dot, float(1.0)) + angle = float(2.0) * wp.acos(dot) + # print(f"angle : {angle}, threshold : {threshold_rad}") + return angle < threshold_rad + + +@wp.kernel +def infer_state_machine( + dt: wp.array(dtype=float), + sm_state: wp.array(dtype=int), + sm_wait_time: wp.array(dtype=float), + ee_pose: wp.array(dtype=wp.transform), # current ee pose + object_pose: wp.array(dtype=wp.transform), # start object location + current_object_pose: wp.array(dtype=wp.transform), # current object pose + final_object_pose: wp.array(dtype=wp.transform), + rest_ee_pose : wp.array(dtype=wp.transform), # rest position + goal_quat : wp.array(dtype=wp.transform), # goal rotation + des_ee_pose: wp.array(dtype=wp.transform), # what we return + gripper_state: wp.array(dtype=float), + offset: wp.array(dtype=wp.transform), + position_threshold: float, + debug_des_pose: wp.array(dtype=wp.transform), # NEW + debug_cur_pose: wp.array(dtype=wp.transform), # NEW + debug_state: wp.array(dtype=int), # New +): + # retrieve thread id + tid = wp.tid() + # retrieve state machine state + state = sm_state[tid] + # decide next state + if state == BackupSM.REST: + # print("[SM State REST]") + # First lift up to a safe height, then go to rest position + current_ee_pos = wp.transform_get_translation(ee_pose[tid]) + rest_pos = wp.transform_get_translation(rest_ee_pose[tid]) + rest_rot = wp.transform_get_rotation(goal_quat[tid]) + + # If we're below safe height, first move up + safe_height = 0.15 # Safe z-height to avoid collisions + if current_ee_pos.z < safe_height: + # Lift straight up first + lift_pos = wp.vec3(current_ee_pos.x, current_ee_pos.y, 0.2) + des_ee_pose[tid] = wp.transform(lift_pos, rest_rot) + #print("[SM REST doing safe ee lift]") + else: + # Already at safe height, move to rest position + pose_pos = wp.transform_get_translation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + des_ee_pose[tid] = wp.transform(pose_pos, pose_rot) + + gripper_state[tid] = GripperState.OPEN + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(rest_ee_pose[tid]), + 0.02, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.REST: + print("[SM_INFO] : Moving from REST to APPROACH_ABOVE_OBJECT") + # move to next state and reset wait time + sm_state[tid] = BackupSM.APPROACH_ABOVE_OBJECT + sm_wait_time[tid] = 0.0 + else: + print("[SM REST] wait timer ") + elif state == BackupSM.APPROACH_ABOVE_OBJECT: + # print("[SM] APPR above obj") + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Go to a safe height ABOVE the object (z + 0.15m) with x offset + # left this in, but no offset due to new orientation + safe_above_pos = wp.vec3(pose_pos.x, pose_pos.y, pose_pos.z+0.15) + des_ee_pose[tid] = wp.transform(safe_above_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN # Open gripper in preparation + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + position_threshold, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_ABOVE_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from APPR_ABOVE to APPROACH_OBJECT") + sm_state[tid] = BackupSM.APPROACH_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_OBJECT: + # print("[SM] approach object") + + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x, pose_pos.y, pose_pos.z+0.12) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN + pos_ok = distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.01, + ) + + if pos_ok: + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from APPR_OBJ to GRASP_OBJECT") + sm_state[tid] = BackupSM.GRASP_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.GRASP_OBJECT: + # print("[SM] GRASP") + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Stay at the approach position while closing gripper + offset_pos = wp.vec3(pose_pos.x, pose_pos.y, pose_pos.z+0.12) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.GRASP_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from GRSP to LIFT_OBJECT") + sm_state[tid] = BackupSM.LIFT_OBJECT + sm_wait_time[tid] = 0.0 + + elif state == BackupSM.LIFT_OBJECT: + #print("[SM] LIFT") # uses current object position (not start pose) + # pose_pos = wp.transform_get_translation(object_pose[tid]) + pose_pos = wp.transform_get_translation(current_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + offset_pos = wp.vec3(pose_pos.x, pose_pos.y, 0.25) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.03, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.LIFT_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from LIFT to MIDPOINT") + sm_state[tid] = BackupSM.MIDPOINT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.MIDPOINT: + #print("[SM] MIDPOINT") + pose_pos = wp.transform_get_translation(rest_ee_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + #offset_pos = wp.vec3(pose_pos.x -0.1, pose_pos.y+0.02, pose_pos.z+0.2) #sample vial + 0.04 + des_ee_pose[tid] = wp.transform(pose_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.03, + ): + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.LIFT_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from MID to APPR goal") + sm_state[tid] = BackupSM.APPROACH_ABOVE_GOAL + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_ABOVE_GOAL: + #print("[SM] Approach above goal") + offset_pos = wp.transform_get_translation(final_object_pose[tid]) + offset_rot = wp.transform_get_rotation(goal_quat[tid]) + safe_above_pos = wp.vec3(offset_pos.x, offset_pos.y, offset_pos.z+0.25) + #offset_pos = wp.vec3(offset_pos.x, offset_pos.y, offset_pos.z) # raise 25 cm + above_target_pose = wp.transform(safe_above_pos, offset_rot) + #above_target_pose = wp.transform_multiply(new_offset, final_object_pose[tid]) + # Blend time for smooth approach + # APPROACH_BLEND_TIME = 0.4 # seconds, tune as needed + # alpha = wp.clamp(sm_wait_time[tid] / APPROACH_BLEND_TIME, 0.0, 1.0) + # # Interpolate position and rotation + # current_pos = wp.transform_get_translation(ee_pose[tid]) + # current_rot = wp.transform_get_rotation(ee_pose[tid]) + + # target_pos = wp.transform_get_translation(above_target_pose) + # target_rot = wp.transform_get_rotation(above_target_pose) + + # pos_interp = wp.lerp(current_pos, target_pos, alpha) + # rot_interp = wp.quat_slerp(current_rot, target_rot, alpha) + # # Set interpolated pose + # des_ee_pose[tid] = wp.transform(pos_interp, rot_interp) + #safe_above_pos = wp.vec3(pose_pos.x - 0.1, pose_pos.y, pose_pos.z + 0.15) + des_ee_pose[tid] = above_target_pose + gripper_state[tid] = GripperState.CLOSE + # Evaluate readiness to transition + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.01): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_ABOVE_GOAL: + print("[SM_INFO] : Moving from APPR_ABOVE to APPROACH_GOAL") + sm_state[tid] = BackupSM.APPROACH_GOAL + sm_wait_time[tid] = 0.0 + elif state == BackupSM.APPROACH_GOAL: + #print("[SM] approach goal") + # print("[SM_INFO] : in state ungrasp") + pose_pos = wp.transform_get_translation(final_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Apply offset in x-direction (5 cm = 0.05 m) + # tune the z offset here ? + offset_pos = wp.vec3(pose_pos.x, pose_pos.y, pose_pos.z+0.15) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.CLOSE + # wait for a while + if distance_below_threshold( + wp.transform_get_translation(ee_pose[tid]), + wp.transform_get_translation(des_ee_pose[tid]), + 0.01, + ): + if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_GOAL: + # move to next state and reset wait time + print("[SM_INFO] : Moving from approach goal to ungrasp") + sm_state[tid] = BackupSM.UNGRASP_OBJECT + sm_wait_time[tid] = 0.0 + elif state == BackupSM.UNGRASP_OBJECT: + # print("[SM] GRASP") + pose_pos = wp.transform_get_translation(final_object_pose[tid]) + pose_rot = wp.transform_get_rotation(goal_quat[tid]) + # Stay at the approach position while closing gripper + offset_pos = wp.vec3(pose_pos.x , pose_pos.y, pose_pos.z+0.15) + des_ee_pose[tid] = wp.transform(offset_pos, pose_rot) + gripper_state[tid] = GripperState.OPEN + # wait for a while + if sm_wait_time[tid] >= BackupSMWaitTime.UNGRASP_OBJECT: + # move to next state and reset wait time + print("[SM_INFO] : Moving from UNGRASP_OBJECT to REST") + sm_state[tid] = BackupSM.REST + sm_wait_time[tid] = 0.0 + + # increment wait time + sm_wait_time[tid] = sm_wait_time[tid] + dt[tid] + debug_des_pose[tid] = des_ee_pose[tid] + debug_cur_pose[tid] = ee_pose[tid] + debug_state[tid] = sm_state[tid] + + + +class BackupControllerInsertTopSM: + def __init__(self, dt: float, num_envs: int, device: torch.device | str = "cpu", position_threshold=0.02, offset = torch.tensor([[-0.1, 0, 0.1]], device='cuda:0'), goal_quat = torch.tensor([[0, 0, 0, 0,0,0,0]], device='cuda:0'), goal_pos = torch.tensor([[0, 0, 0, 0,0,0,0]], device='cuda:0')): + """Initialize the state machine. + + Args: + dt: The environment time step. + num_envs: The number of environments to simulate. + device: The device to run the state machine on. + """ + ## debug + + print(f'dt : {dt},num_envs {num_envs}, \n device {device}, pos_thresh {position_threshold} \n goal_quat {goal_quat} \n goal_pos {goal_pos}') + # save parameters + self.dt = float(dt) + self.num_envs = num_envs + self.device = device + self.position_threshold = position_threshold + self.goal_quat = goal_quat + self.goal_pos = goal_pos + # initialize state machine + self.sm_dt = torch.full((self.num_envs,), self.dt, device=self.device) + self.sm_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) + self.sm_wait_time = torch.zeros((self.num_envs,), device=self.device) + + # desired state + self.des_ee_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.des_gripper_state = torch.full((self.num_envs,), 0.0, device=self.device) + self.final_object_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.rest_pose = torch.zeros((self.num_envs, 7), device=self.device) + + # approach above object offset + + self.offset = torch.zeros((self.num_envs, 7), device=self.device) + self.offset[:, 2] = 0.2 + self.offset[:,0] = -0.1 + self.offset[:, -1] = 1.0 # warp expects quaternion as (x, y, z, w) + + # convert to warp + self.sm_dt_wp = wp.from_torch(self.sm_dt, wp.float32) + self.sm_state_wp = wp.from_torch(self.sm_state, wp.int32) + self.sm_wait_time_wp = wp.from_torch(self.sm_wait_time, wp.float32) + self.des_ee_pose_wp = wp.from_torch(self.des_ee_pose, wp.transform) + self.des_gripper_state_wp = wp.from_torch(self.des_gripper_state, wp.float32) + self.final_object_pose_wp = wp.from_torch(self.final_object_pose, wp.transform) + self.rest_pose_wp = wp.from_torch(self.rest_pose, wp.transform) + self.offset_wp = wp.from_torch(self.offset, wp.transform) + self.goal_quat_wp = wp.from_torch(self.goal_quat, wp.transform) + ## For Debug + self.debug_des_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.debug_cur_pose = torch.zeros((self.num_envs, 7), device=self.device) + self.debug_state = torch.full((self.num_envs,), 0, dtype=torch.int32, device=self.device) + + self.debug_des_pose_wp = wp.from_torch(self.debug_des_pose, wp.transform) + self.debug_cur_pose_wp = wp.from_torch(self.debug_cur_pose, wp.transform) + self.debug_state_wp = wp.from_torch(self.debug_state, wp.int32) + + def reset_idx(self, env_ids: Sequence[int] = None): + """Reset the state machine.""" + print(f'[SM RESET]') + if env_ids is None: + env_ids = slice(None) + self.sm_state[env_ids] = 0 + self.sm_wait_time[env_ids] = 0.0 + + def _ensure_7d(self,tensor: torch.Tensor, device): + # accepts (N,3) -> returns (N,7) with identity quaternion + if tensor.ndim != 2: + raise ValueError(f"expected 2D tensor, got shape {tensor.shape}") + if tensor.shape[1] == 7: + return tensor + if tensor.shape[1] == 3: + quat = torch.tensor([0.0,0.0,0.0,1.0], device=device, dtype=tensor.dtype) + quat = quat.unsqueeze(0).expand(tensor.shape[0], -1) + return torch.cat([tensor, quat], dim=-1) + raise ValueError(f"pose must have 3 or 7 elements, got {tensor.shape[1]}") + + + def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, current_object_pose: torch.Tensor, final_object_pose: torch.Tensor, rest_pose: torch.Tensor, sm_state: int =0, env_num = 0) -> torch.Tensor: + """Compute the desired state of the robot's end-effector and the gripper.""" + # convert all transformations from (w, x, y, z) to (x, y, z, w) + # print(f'[SM DEBUG] Doing State Comp') + # print(f'[SM DEBUG] ee_pose {ee_pose}') + # print(f'[SM DEBUG] object pose {object_pose}') + # print(f'[SM DEBUG] desired pose {des_object_pose}') + # print(f'[SM DEBUG] final pose {final_object_pose}') + # print(f'[SM DEBUG] rest pose {rest_pose}') + # before reordering + # print("\n[BackupControllerSM::compute] called with inputs:") + # print(f" sm_state: {sm_state}, env_num: {env_num}") + + # def short_tensor(t, name): + # if t is None: + # print(f" {name}: None") + # elif not isinstance(t, torch.Tensor): + # print(f" {name}: {t} (type={type(t)})") + # else: + # shape = tuple(t.shape) + # device = t.device + # dtype = t.dtype + # # show first few elements flattened + # vals = t.flatten()[:6].detach().cpu().numpy() + # print(f" {name}: shape={shape}, device={device}, dtype={dtype}, values={vals}") + + # short_tensor(ee_pose, "ee_pose") + # short_tensor(object_pose, "object_pose") + # short_tensor(des_object_pose, "des_object_pose") + # short_tensor(final_object_pose, "final_object_pose") + # short_tensor(rest_pose, "rest_pose") + # print("-" * 80) + # print(f"Got given state {sm_state}") + current_object_pose = self._ensure_7d(current_object_pose, self.device) + final_object_pose = self._ensure_7d(self.goal_pos, self.device) + ee_pose = self._ensure_7d(ee_pose, self.device) + start_object_pose = self._ensure_7d(start_object_pose, self.device) + rest_pose = self._ensure_7d(rest_pose, self.device) + goal_quat = self._ensure_7d(self.goal_quat, self.device) + # now safe to reorder + ee_pose = ee_pose[:, [0, 1, 2, 4, 5, 6, 3]] + start_object_pose = start_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + current_object_pose = current_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + final_object_pose = final_object_pose[:, [0, 1, 2, 4, 5, 6, 3]] + rest_pose = rest_pose[:, [0, 1, 2, 4, 5, 6, 3]] + goal_quat = goal_quat[:, [0, 1, 2, 4, 5, 6, 3]] + # convert to warp + ee_pose_wp = wp.from_torch(ee_pose.contiguous(), wp.transform) + start_object_pose_wp = wp.from_torch(start_object_pose.contiguous(), wp.transform) + current_object_pose_wp = wp.from_torch(current_object_pose.contiguous(), wp.transform) + final_object_pose_wp = wp.from_torch(final_object_pose.contiguous(), wp.transform) + rest_pose_wp = wp.from_torch(rest_pose.contiguous(), wp.transform) + goal_quat_wp = wp.from_torch(goal_quat.contiguous(), wp.transform) + # run state machine + # get state from env - convert to warp again + self.sm_state[env_num] = sm_state + self.sm_state_wp = wp.from_torch(self.sm_state, wp.int32) + # launch + wp.launch( + kernel=infer_state_machine, + dim=self.num_envs, + inputs=[ + self.sm_dt_wp, + self.sm_state_wp, + self.sm_wait_time_wp, + ee_pose_wp, + start_object_pose_wp, + current_object_pose_wp, + final_object_pose_wp, + rest_pose_wp, + goal_quat_wp, + self.des_ee_pose_wp, + self.des_gripper_state_wp, + self.offset_wp, + self.position_threshold, + self.debug_des_pose_wp, + self.debug_cur_pose_wp, + self.debug_state_wp, + ], + device=self.device, + ) + des_debug = self.debug_des_pose.detach().cpu().numpy() + cur_debug = self.debug_cur_pose.detach().cpu().numpy() + debug_state = self.debug_state.detach().cpu().numpy() + goal_quat_debug = self.goal_quat.detach().cpu().numpy() + for i in range(self.num_envs): + des_pos, des_quat = des_debug[i][:3], des_debug[i][3:] + cur_pos, cur_quat = cur_debug[i][:3], cur_debug[i][3:] + goal_quat = goal_quat_debug[i][3:] + # compute Euclidean distance with numpy + dist = np.linalg.norm(cur_pos - des_pos) + print(f"StateMachine debug state {debug_state}") + # print(f"[Env {i}]") + print(f" Goal pose : {final_object_pose}") + print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") + print(f" Desired -> pos: {des_pos}, quat: {des_quat}") + print(f" Goal quat -> : {goal_quat}") + print(f" Euclidean distance: {dist:.4f}") + # #print(f"returned state : {self.sm_state}") + # convert transformations back to (w, x, y, z) + des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] + # convert to torch + #print(f'[SM DEBUG] new desired poition : {des_ee_pose}, gripper state {self.des_gripper_state}') + return des_ee_pose , self.des_gripper_state, self.sm_state.clone().item() + #return torch.cat([des_ee_pose, self.des_gripper_state.unsqueeze(-1)], dim=-1) \ No newline at end of file diff --git a/scripts/imitation_learning/robomimic/play_controller.py b/scripts/imitation_learning/robomimic/play_controller.py index 166b1d518540..88454818a962 100644 --- a/scripts/imitation_learning/robomimic/play_controller.py +++ b/scripts/imitation_learning/robomimic/play_controller.py @@ -118,7 +118,7 @@ def rollout_ensemble(env, success_term, horizon, device): ### SET USE RECOVERY TO FALSE #### # Set up recovery controller - backup_controller = BackupControllerSM(0.01*2, num_envs,'cuda' , 0.01) + backup_controller = BackupControllerInsertSM(0.01*2, num_envs,'cuda' , 0.01) backup_controller.reset_idx() # none so reset all robot = env.unwrapped.scene["robot"] diff --git a/scripts/imitation_learning/robomimic/play_ensemble_v05.py b/scripts/imitation_learning/robomimic/play_ensemble_v05.py index c10cfccf1be6..e3897f85f443 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble_v05.py +++ b/scripts/imitation_learning/robomimic/play_ensemble_v05.py @@ -344,7 +344,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, max_recovery_steps = 500 # Safety limit for recovery mode ##### CONFIG RECOVERY CONTROLLER #### - backup_controller = BackupController(env, device, tasktype="lift") + backup_controller = BackupController(env, device, tasktype="place") state_guess = 0 last_state = 0 recovery_mode = False @@ -593,52 +593,94 @@ def main(): # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') - #pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/low/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') + pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/low/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') # pick_place_ensemble = load_ensemble(device, ensemble_path='docs/lift/Dev-IK-Rel-v1/best_models/best_model_paths.txt') - pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/insert_paths.txt') + # pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/insert_paths.txt') + #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/inser_top_paths.txt') # Lets set these to the 0.99 confidence parameters = { 'beaker_lift' :{ 0 : { - "confidence_level": 0.0002104382060000009, + "confidence_level": 5.373953000000001e-05, "window_size": 10, "max_peaks": 8 }, 1 : { - "confidence_level": 0.00020459246700000051, + "confidence_level": 5.378578e-05, "window_size": 10, "max_peaks": 8 }, 2 : { - "confidence_level": 0.00023551160300000013, + "confidence_level": 6.186318e-05, "window_size": 10, "max_peaks": 8 }, 3 : { - "confidence_level": 0.0003701742110000007, + "confidence_level": 7.819939000000004e-05, "window_size": 10, "max_peaks": 8 }, 4 : { - "confidence_level": 0.0002939644620000011, + "confidence_level": 0.00012073204000000005, "window_size": 10, "max_peaks": 8 }, 5 : { - "confidence_level": 0.0006407762280000002, + "confidence_level": 8.867226000000004e-05, "window_size": 10, "max_peaks": 8 }, 6 : { - "confidence_level": 0.49527883679, + "confidence_level": 1.57e-08, "window_size": 10, "max_peaks": 8 }, + + }, + 'vial_insert': { + 0 : { + "confidence_level": 0.00016269120400000059, + "window_size": 9, + "max_peaks": 8 + }, + 1 : { + "confidence_level": 0.000173801014, + "window_size": 9, + "max_peaks": 8 + }, + 2 : { + "confidence_level": 0.00018948240900000074, + "window_size": 9, + "max_peaks": 8 + }, + 3 : { + "confidence_level": 0.0007136359360000004, + "window_size": 9, + "max_peaks": 8 + }, + 4 : { + "confidence_level": 0.00015286798600000018, + "window_size": 9, + "max_peaks": 8 + }, + 5 : { + "confidence_level": 0.00047967177600000013, + "window_size": 9, + "max_peaks": 8 + }, + 6 : { + "confidence_level": 0.26672138987099997, + "window_size": 9, + "max_peaks": 8 + }, + + + } } diff --git a/scripts/imitation_learning/robomimic/play_with_backup.py b/scripts/imitation_learning/robomimic/play_with_backup.py index ef7c15bbaf15..db88bb2cf943 100644 --- a/scripts/imitation_learning/robomimic/play_with_backup.py +++ b/scripts/imitation_learning/robomimic/play_with_backup.py @@ -118,7 +118,7 @@ def rollout_ensemble(env, success_term, horizon, device): # Set up recovery controller - backup_controller = BackupController(env, device, tasktype="lift") + backup_controller = BackupController(env, device, tasktype="insert_top") state_guess = 0 for i in range(horizon): diff --git a/scripts/imitation_learning/robomimic/switching_logic_algorithm.tex b/scripts/imitation_learning/robomimic/switching_logic_algorithm.tex new file mode 100644 index 000000000000..198c0267ee15 --- /dev/null +++ b/scripts/imitation_learning/robomimic/switching_logic_algorithm.tex @@ -0,0 +1,62 @@ +\begin{algorithm}[t] +\caption{Uncertainty-Based Switching Logic for Safe Robot Manipulation} +\label{alg:switching_logic} +\begin{algorithmic}[1] +\Procedure{SwitchingLogic}{$\text{uncertainties}, \text{step}, \text{parameters}$} + \State \textit{// Initialization} + \State $\text{counts} \gets 0$ + \State $\text{triggered} \gets \text{False}$ + + \State \textit{// Iterate over each joint/action dimension} + \For{$j = 0$ \textbf{to} $|\text{uncertainties}| - 1$} + \State $\text{unc} \gets \text{uncertainties}[j]$ + \State $\text{traj}[j][\text{step}] \gets \text{unc}$ + + \State \textit{// Check if sufficient history exists} + \If{$\text{step} > \text{parameters}[j][\text{window\_size}]$} + \State \textit{// Extract sliding window of recent uncertainties} + \State $\text{window\_start} \gets \text{step} - \text{parameters}[j][\text{window\_size}]$ + \State $\text{test\_window} \gets \text{traj}[j][\text{window\_start} : \text{step}]$ + + \State \textit{// Count peaks exceeding confidence threshold} + \State $\text{peaks} \gets 0$ + \For{$x \in \text{test\_window}$} + \If{$x \geq \text{parameters}[j][\text{confidence\_level}]$} + \State $\text{peaks} \gets \text{peaks} + 1$ + \EndIf + \EndFor + + \State \textit{// Check if peaks exceed maximum allowed} + \If{$\text{peaks} \geq \text{parameters}[j][\text{max\_peaks}]$} + \State $\text{counts} \gets \text{counts} + 1$ + \EndIf + \EndIf + \EndFor + + \State \textit{// Trigger safety mechanism if multiple joints show high uncertainty} + \If{$\text{counts} > 2$} + \If{\textbf{not} $\text{triggered}$} + \State $\text{triggered} \gets \text{True}$ + \State \textbf{print} ``Uncertainty triggered safety condition'' + \EndIf + \State \Return \textbf{True} \Comment{Switch to backup controller} + \EndIf + + \State \Return \textbf{False} \Comment{Continue with learned policy} +\EndProcedure + +\State + +\Procedure{HalfwayCheck}{$\text{step}, \text{grasp\_state}, \text{horizon}$} + \State \textit{// Verify subtask completion at midpoint} + \If{$\text{step} = \lfloor \text{horizon} / 2 \rfloor$ \textbf{and not} $\text{grasp\_state}$} + \If{\textbf{not} $\text{triggered}$} + \State \textbf{print} ``Halfway point reached without subtask completion'' + \State $\text{triggered} \gets \text{True}$ + \EndIf + \State \Return \textbf{True} \Comment{Activate recovery} + \EndIf + \State \Return \textbf{False} +\EndProcedure +\end{algorithmic} +\end{algorithm} diff --git a/scripts/imitation_learning/robomimic/train_ensemble.py b/scripts/imitation_learning/robomimic/train_ensemble.py index 9a9f6bb5d954..9e1e5893059a 100644 --- a/scripts/imitation_learning/robomimic/train_ensemble.py +++ b/scripts/imitation_learning/robomimic/train_ensemble.py @@ -177,9 +177,9 @@ def train(config: Config, device: str, log_dirs: list[str], ckpt_dirs: list[str] env_meta = FileUtils.get_env_metadata_from_dataset(dataset_path=config.train.data) print(f"config.train.data: {config.train.data}") with config.values_unlocked(): - config.train.data = [{'path': 'docs/place/glassware_insert_demos_generated_split.hdf5'}] + config.train.data = [{'path': 'docs/insert/glassware_insert_demos_top_generated_split.hdf5'}] ####### HARD CODED MAKE SURE THIS GETS UPDATED ######### - config_list= [{'path': 'docs/place/glassware_insert_demos_generated_split.hdf5'}] + config_list= [{'path': 'docs/insert/glassware_insert_demos_top_generated_split.hdf5'}] print(f"config.train.data: {config.train.data}") # print(f"config_list: {config_list}") # if isinstance(config.train.data, str): diff --git a/scripts/tools/record_SM_demos.py b/scripts/tools/record_SM_demos.py new file mode 100644 index 000000000000..b6de2f4fe953 --- /dev/null +++ b/scripts/tools/record_SM_demos.py @@ -0,0 +1,364 @@ +# Copyright (c) 2024-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +""" +Script to record demonstrations with Isaac Lab environments using human teleoperation. + +This script allows users to record demonstrations operated by human teleoperation for a specified task. +The recorded demonstrations are stored as episodes in a hdf5 file. Users can specify the task, teleoperation +device, dataset directory, and environment stepping rate through command-line arguments. + +required arguments: + --task Name of the task. + +optional arguments: + -h, --help Show this help message and exit + --teleop_device Device for interacting with environment. (default: keyboard) + --dataset_file File path to export recorded demos. (default: "./datasets/dataset.hdf5") + --step_hz Environment stepping rate in Hz. (default: 30) + --num_demos Number of demonstrations to record. (default: 0) + --num_success_steps Number of continuous steps with task success for concluding a demo as successful. (default: 10) +""" + +"""Launch Isaac Sim Simulator first.""" + +# Standard library imports +import argparse +import contextlib + +# Third-party imports +import gymnasium as gym +import numpy as np +import os +import time +import torch + +# Isaac Lab AppLauncher +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Record demonstrations for Isaac Lab environments.") +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--teleop_device", type=str, default="keyboard", help="Device for interacting with environment.") +parser.add_argument( + "--dataset_file", type=str, default="./datasets/dataset.hdf5", help="File path to export recorded demos." +) +parser.add_argument("--step_hz", type=int, default=30, help="Environment stepping rate in Hz.") +parser.add_argument( + "--num_demos", type=int, default=0, help="Number of demonstrations to record. Set to 0 for infinite." +) +parser.add_argument( + "--num_success_steps", + type=int, + default=10, + help="Number of continuous steps with task success for concluding a demo as successful. Default is 10.", +) +parser.add_argument("--seed", type=int, default=101, help="Random seed.") +parser.add_argument( + "--enable_pinocchio", + action="store_true", + default=False, + help="Enable Pinocchio.", +) +parser.add_argument( + "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." +) +parser.add_argument("--num_envs", type=int, default=None, help="Number of environments to simulate.") + +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +app_launcher_args = vars(args_cli) + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim + # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter + import pinocchio # noqa: F401 + +# launch the simulator +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +# Omniverse logger +import omni.log + +if not args_cli.headless: + import omni.ui as ui + from isaaclab_mimic.ui.instruction_display import InstructionDisplay, show_subtask_instructions + from isaaclab.envs.ui import EmptyWindow + + +import isaaclab_mimic.envs # noqa: F401 +from isaaclab_mimic.ui.instruction_display import InstructionDisplay, show_subtask_instructions + +if args_cli.enable_pinocchio: + from isaaclab.devices.openxr.retargeters.humanoid.fourier.gr1t2_retargeter import GR1T2Retargeter + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from isaaclab.devices.openxr.retargeters.manipulator import GripperRetargeter, Se3AbsRetargeter, Se3RelRetargeter +from isaaclab.envs.mdp.recorders.recorders_cfg import ActionStateRecorderManagerCfg +from isaaclab.envs.ui import EmptyWindow +from isaaclab.managers import DatasetExportMode + +import isaaclab_tasks # noqa: F401 +from isaaclab_tasks.utils.parse_cfg import parse_env_cfg +from scripts.imitation_learning.robomimic.backup_controller_handler import BackupController + + +#rom isaaclab_tasks.manager_based.manipulation.lift.lift_env_cfg import LiftEnvCfg +#from scripts.environments.state_machine.stack_lab_sm import PickAndLiftSm +#from scripts.environments.state_machine.weigh_lab_sm import PickAndLiftSm +#from scripts.environments.state_machine.pour_lab_sm import PickAndLiftSm +#from scripts.environments.state_machine.stack_weigh_lab_sm import PickAndLiftSm + + +class RateLimiter: + """Convenience class for enforcing rates in loops.""" + + def __init__(self, hz: int): + """Initialize a RateLimiter with specified frequency. + + Args: + hz: Frequency to enforce in Hertz. + """ + self.hz = hz + self.last_time = time.time() + self.sleep_duration = 1.0 / hz + self.render_period = min(0.033, self.sleep_duration) + + def sleep(self, env: gym.Env): + """Attempt to sleep at the specified rate in hz. + + Args: + env: Environment to render during sleep periods. + """ + next_wakeup_time = self.last_time + self.sleep_duration + while time.time() < next_wakeup_time: + time.sleep(self.render_period) + if not args_cli.headless: + env.sim.render() + + self.last_time = self.last_time + self.sleep_duration + + # detect time jumping forwards (e.g. loop is too slow) + if self.last_time < time.time(): + while self.last_time < time.time(): + self.last_time += self.sleep_duration + +def init_state_machine(env, device): + """Create PickAndLiftSm once and capture initial TCP orientation.""" + + backup_controller = BackupController(env, device, tasktype="insert_top") + state_guess = 0 + + # Read current ee frame and capture a fixed orientation (per env) + + + return backup_controller + +def state_machine_step(env, backup_controller, fixed_tcp_rot): + + action, state_guess = backup_controller.get_controller_action(state_guess, 0) + """Compute a single-step action from the persistent state machine (does NOT call env.step).""" + + return action + +def reset_env_and_sm(env, backup_controller, reset_indices=None): + """Reset specified environments (or all if None) along with the state machine. + + Args: + env: The environment instance + pick_sm: The state machine + reset_indices: Optional list/1D tensor of env indices to reset. If None, resets all. + Returns: + fixed_tcp_rot: (num_envs, 4) tensor of fixed TCP rotations + actions: action buffer tensor + """ + if reset_indices is None: + # full reset + env.sim.reset() + env.reset() + reset_indices = torch.arange(env.unwrapped.num_envs, device=env.unwrapped.device) + else: + # partial reset + env.reset(reset_indices) + + # reset state machine for these envs + backup_controller.reset() + + # get new tcp rotation for *all* envs (keep shape consistent) + # ee_frame = env.unwrapped.scene["ee_frame"] + # fixed_tcp_rot = ee_frame.data.target_quat_w[..., 0, :].clone() + + # reset action buffer (neutral gripper open) + actions = torch.zeros(env.unwrapped.action_space.shape, device=env.unwrapped.device) + + return actions + +def main(): + """Collect demonstrations from the environment using teleop interfaces.""" + + if args_cli.headless: + rate_limiter = None + else: + rate_limiter = RateLimiter(args_cli.step_hz) + + # prepare dataset directory + output_dir = os.path.dirname(args_cli.dataset_file) + output_file_name = os.path.splitext(os.path.basename(args_cli.dataset_file))[0] + os.makedirs(output_dir, exist_ok=True) + + num_envs = 1 + success_step_counts = [0 for _ in range(num_envs)] + + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + # success_term = None + # if hasattr(env_cfg.terminations, "success_term"): + # success_term = env_cfg.terminations.success_term + # env_cfg.terminations.success_term = None + # else: + # omni.log.warn("No success termination term found — cannot mark demos as successful.") + + env_cfg.recorders: ActionStateRecorderManagerCfg = ActionStateRecorderManagerCfg() + env_cfg.recorders.dataset_export_dir_path = output_dir + env_cfg.recorders.dataset_filename = output_file_name + env_cfg.recorders.dataset_export_mode = DatasetExportMode.EXPORT_SUCCEEDED_ONLY + + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + # Set seed9 + torch.manual_seed(args_cli.seed) + env.seed(args_cli.seed) + # control flags + should_reset_recording_instance = False + running_recording_instance = True + + def reset_recording_instance(): + nonlocal should_reset_recording_instance + should_reset_recording_instance = True + + def start_recording_instance(): + nonlocal running_recording_instance + running_recording_instance = True + + def stop_recording_instance(): + nonlocal running_recording_instance + running_recording_instance = False + + # reset everything at start + env.sim.reset() + env.reset() + + current_recorded_demo_count = 0 + label_text = f"Recorded {current_recorded_demo_count} successful demonstrations." + + if not args_cli.headless: + instruction_display = InstructionDisplay(args_cli.teleop_device) + window = EmptyWindow(env, "Instruction") + with window.ui_window_elements["main_vstack"]: + demo_label = ui.Label(label_text) + subtask_label = ui.Label("") + instruction_display.set_labels(subtask_label, demo_label) + else: + demo_label = None + subtask_label = None + print(label_text) + + # init state machine + reset all envs + pick_sm= init_state_machine(env, args_cli.device) + actions = reset_env_and_sm(env, pick_sm) + state_guess=0 + while simulation_app.is_running(): + if running_recording_instance: + # standard Gymnasium step return + actions, state_guess = pick_sm.get_controller_action(state_guess, 0) + obs, rewards, dones, infos, _ = env.step(actions) + + # compute next actions + #action, state_guess = pick_sm.get_controller_action(state_guess, 0) + if dones.any(): + done_mask = dones.detach().cpu().numpy().astype(bool) if isinstance(dones, torch.Tensor) else np.asarray(dones, dtype=bool) + + # success mask from env infos (matches training!) + if "success_term" in infos: + success_mask = infos["success_term"].detach().cpu().numpy().astype(bool) + else: + success_mask = np.zeros(env.unwrapped.num_envs, dtype=bool) + + exported_indices = [] + for idx in range(env.unwrapped.num_envs): + if not done_mask[idx]: + continue # only process finished envs + + if success_mask[idx]: + success_step_counts[idx] += 1 + print(f"[INFO] Env {idx} success streak: {success_step_counts[idx]}") + else: + if success_step_counts[idx] != 0: + print(f"[INFO] Env {idx} failed, resetting streak") + success_step_counts[idx] = 0 + + # reached threshold → export demo + if success_step_counts[idx] >= args_cli.num_success_steps: + print(f"[INFO] Exporting successful demo for env {idx}") + env.recorder_manager.record_pre_reset([idx], force_export_or_skip=False) + env.recorder_manager.set_success_to_episodes( + [idx], + torch.tensor([[True]], dtype=torch.bool, device=env.device), + ) + env.recorder_manager.export_episodes([idx]) + exported_indices.append(idx) + success_step_counts[idx] = 0 + + if exported_indices: + print(f"[INFO] Exported env indices: {exported_indices}") + pick_sm.reset() + fixed_tcp_rot, actions = reset_env_and_sm( + env, pick_sm, torch.tensor(exported_indices, device=env.device) + ) + else: + pick_sm.reset() + reset_indices = [idx for idx in range(env.unwrapped.num_envs) if done_mask[idx]] + if reset_indices: + print(f"[INFO] Resetting env indices: {reset_indices}") + fixed_tcp_rot, actions = reset_env_and_sm( + env, pick_sm, torch.tensor(reset_indices, device=env.device) + ) + for idx in reset_indices: + success_step_counts[idx] = 0 + + else: + if not args_cli.headless: + env.sim.render() + + # update demo count label + if env.recorder_manager.exported_successful_episode_count > current_recorded_demo_count: + current_recorded_demo_count = env.recorder_manager.exported_successful_episode_count + label_text = f"Recorded {current_recorded_demo_count} successful demonstrations." + print(label_text) + + # stop when enough demos are recorded + if args_cli.num_demos > 0 and env.recorder_manager.exported_successful_episode_count >= args_cli.num_demos: + print(f"All {args_cli.num_demos} demonstrations recorded. Exiting the app.") + break + + if env.sim.is_stopped(): + break + + if rate_limiter: + rate_limiter.sleep(env) + + + env.close() + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() \ No newline at end of file diff --git a/scripts/tools/start_discovery_server.sh b/scripts/tools/start_discovery_server.sh new file mode 100644 index 000000000000..d6d74339f624 --- /dev/null +++ b/scripts/tools/start_discovery_server.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# This script starts a ROS 2 Discovery Server. +# Use this when communicating over a VPN where multicast is blocked. + +# Get the IP address of the machine on the VPN (e.g., tailscale0, tun0) +# You can also manually set this if the auto-detection fails. +VPN_INTERFACE=$(ip addr | grep -e "tailscale" -e "tun" | awk '{print $NF}' | head -n 1) + +if [ -z "$VPN_INTERFACE" ]; then + echo "[WARNING] No VPN interface (tailscale, tun) detected. Falling back to eth0." + VPN_INTERFACE="eth0" +fi + +IP_ADDR=$(ip addr show $VPN_INTERFACE | grep "inet " | awk '{print $2}' | cut -d/ -f1) + +if [ -z "$IP_ADDR" ]; then + echo "[ERROR] Could not detect IP address for interface $VPN_INTERFACE." + exit 1 +fi + +PORT=11811 + +echo "[INFO] Starting ROS 2 Discovery Server on $IP_ADDR:$PORT (Interface: $VPN_INTERFACE)" +echo "[INFO] To connect other machines, run: export ROS_DISCOVERY_SERVER=$IP_ADDR:$PORT" + +# Source ROS 2 if not already sourced +if [ -f "/opt/ros/humble/setup.bash" ]; then + source /opt/ros/humble/setup.bash +fi + +fastdds discovery --server-id 0 --ip-address $IP_ADDR --port $PORT diff --git a/source/isaaclab/isaaclab/envs/mdp/observations.py b/source/isaaclab/isaaclab/envs/mdp/observations.py index ac502521aae0..f3daee777aa5 100644 --- a/source/isaaclab/isaaclab/envs/mdp/observations.py +++ b/source/isaaclab/isaaclab/envs/mdp/observations.py @@ -198,6 +198,7 @@ def joint_pos(env: ManagerBasedEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg(" """ # extract the used quantities (to enable type-hinting) asset: Articulation = env.scene[asset_cfg.name] + print(f"joint pos {asset.data.joint_pos[:, asset_cfg.joint_ids]}") return asset.data.joint_pos[:, asset_cfg.joint_ids] diff --git a/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py b/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py index 1390fdf48eaf..cfdb3ec5e079 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py +++ b/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py @@ -123,9 +123,9 @@ def env_loop( # print("*" * 50, "\033[K") print(summary_text) log_file = "docs/generation_log.txt" - # with open(log_file, 'a') as f: - # f.write(summary_text) - # f.write("\n" + "="*80 + "\n\n") + with open(log_file, 'w') as f: + f.write(summary_text) + f.write("\n" + "="*80 + "\n\n") # termination condition is on enough successes if @guarantee_success or enough attempts otherwise diff --git a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py index 972daecbb642..efd1cee39abd 100755 --- a/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py +++ b/source/isaaclab_mimic/isaaclab_mimic/envs/cube_mimic_env_cfg.py @@ -8,7 +8,7 @@ #from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_place import FrankaDevEnvCfg #from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_env_obs import FrankaDevEnvCfg -from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_vial_insert import FrankaDevEnvCfg +from isaaclab_tasks.manager_based.manipulation.cube_lift.config.franka.dev_ik_rel_vial_insert_top_down import FrankaDevEnvCfg @configclass class CubeMimicEnvCfg(FrankaDevEnvCfg, MimicEnvCfg): diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py index d02f0da3a92a..4e043f645a0c 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/__init__.py @@ -187,6 +187,20 @@ disable_env_checker=True, ) +gym.register( + id="Dev-IK-Rel-Insert-v1", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": f"{__name__}.dev_ik_rel_vial_insert_top_down:FrankaDevEnvCfg", + "robomimic_bc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_rnn_low_dim.json"), + "robomimic_bc_trans_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bc_trans.json"), + "robomimic_hbc_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/hbc.json"), + "robomimic_bcq_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/bcq.json"), + "robomimic_diffusion_policy_cfg_entry_point": os.path.join(agents.__path__[0], "robomimic/diffusion_policy.json"), + + }, + disable_env_checker=True, +) gym.register( id="Dev-IK-Rel-Insert-vision-v0", diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json index 6bde3e9661aa..5286c063f046 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/agents/robomimic/bc_rnn_low_dim.json @@ -7,7 +7,7 @@ "terminal_output_to_txt": true, "log_tb": true, "log_wandb": true, - "wandb_proj_name": "vial_insert" + "wandb_proj_name": "vial_insert_1.0_mix" }, "save": { "enabled": true, @@ -55,7 +55,7 @@ "goal_mode": null, "cuda": true, "batch_size": 100, - "num_epochs": 1000, + "num_epochs": 1500, "seed": 101 }, "algo": { diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py index 2884f74bd029..b68bac84e865 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_place.py @@ -12,7 +12,7 @@ from isaaclab.assets import AssetBaseCfg from isaaclab.sim.spawners.from_files import UsdFileCfg from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR -from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG +#from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG from . import dev_env_cfg import math from isaaclab.managers import SceneEntityCfg diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py index 35707cb590d8..2f6c9ff9edac 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert.py @@ -105,8 +105,8 @@ def __post_init__(self): body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), ) - self.terminations.success= DoneTerm(func=mdp.object_inserted_upright, params={"lower_object_cfg": SceneEntityCfg("vialrack")}) - + self.terminations.success= DoneTerm(func=mdp.object_inserted_upright, params={"lower_object_cfg": SceneEntityCfg("vialrack"), "upright_good_deg": 22.5}) + self.terminations.object_tipped = DoneTerm(func=mdp.object_knocked, params={"max_tilt": 65}) #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert_top_down.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert_top_down.py new file mode 100644 index 000000000000..6b1ba76ef207 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert_top_down.py @@ -0,0 +1,127 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.utils import configclass +from isaaclab.assets import RigidObjectCfg, ArticulationCfg +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.assets import AssetBaseCfg +from isaaclab.sim.spawners.from_files import UsdFileCfg +from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, NVIDIA_NUCLEUS_DIR +#from source.isaaclab_assets.isaaclab_assets.robots.universal_robots import UR10_CFG +from isaaclab_assets.robots.universal_robots import UR10_CFG +from . import dev_env_cfg +import isaaclab.sim as sim_utils +from isaaclab.sensors import CameraCfg +import math +from isaaclab.managers import SceneEntityCfg +from isaaclab_assets.glassware.glassware import ChemistryGlassware +from isaaclab_tasks.manager_based.manipulation.cube_lift import mdp +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp import franka_stack_events + +from isaaclab.managers import TerminationTermCfg as DoneTerm +## +# Pre-defined configs +## +from isaaclab_assets.robots.franka import FRANKA_PANDA_HIGH_PD_CFG # isort: skip +from isaaclab_assets.robots.universal_robots import UR10e_ROBOTIQ_GRIPPER_CFG + +## add some cameras in + + + +@configclass +class FrankaDevEnvCfg(dev_env_cfg.FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # put the beaker on the stir plate + glassware = ChemistryGlassware() + self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + #self.scene.scale = glassware.scale(pos=[0.3, -0.3, 0.01]) + self.scene.vialrack = glassware.line_vial_rack(pos=[0.3, -0.3, 0.0], scale=1.5) + self.scene.object = glassware.capped_vial(pos=[0.5, 0.0, 0.01], scale =1.0, name="object") + self.observations.policy.target_object_position = ObsTerm(func=mdp.target_position, params={"object_cfg": SceneEntityCfg("vialrack")}) + + ### subtask + self.observations.subtask_terms.stacked = ObsTerm( + func=mdp.object_stacked, + params={ + "robot_cfg": SceneEntityCfg("robot"), + "upper_object_cfg": SceneEntityCfg("object"), + "lower_object_cfg": SceneEntityCfg("vialrack"), + }, + ) + + self.events.randomise_object_scale= EventTerm( + func=mdp.randomize_rigid_body_scale, + mode="prestartup", + params={ + "scale_range": {"x": (1.0, 1.0), "y": (1.0, 1.0), "z": (1.0, 1.0)}, + "asset_cfg": SceneEntityCfg("object"), + }, + ) + self.events.reset_object_position = EventTerm( + func=mdp.reset_place_root_state_uniform, + mode="reset", + params={ + "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, + "velocity_range": {}, + "asset_cfg": SceneEntityCfg("object"), + "asset2_cfg" : SceneEntityCfg("stirplate"), + "asset3_cfg" : SceneEntityCfg("vialrack") + }, + ) + self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + #self.scene.robot = UR10e_ROBOTIQ_GRIPPER_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + # self.scene.robot = FRANKA_PANDA_HIGH_PD_CFG.replace( + # prim_path="{ENV_REGEX_NS}/Robot", + # init_state=ArticulationCfg.InitialStateCfg( + # joint_pos={ + + # "panda_joint1": 0.3281, + # "panda_joint2": -0.3684, + # "panda_joint3": -0.2787, + # "panda_joint4": -2.6138, + # "panda_joint5": -2.7527, + # "panda_joint6": 2.4991, # +90° → keeps hand level + # "panda_joint7": 0.3331, + # "panda_finger_joint1": 0.04, # open gripper + # "panda_finger_joint2": 0.04, + # } + # ), + # ) + # replace with relative position controller + self.actions.arm_action = DifferentialInverseKinematicsActionCfg( + asset_name="robot", + joint_names=["panda_joint.*"], + body_name="panda_hand", + controller=DifferentialIKControllerCfg(command_type="pose", use_relative_mode=True, ik_method="dls"), + scale=0.5, + body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.0]), + ) + + self.terminations.success= DoneTerm(func=mdp.object_inserted_upright, params={"lower_object_cfg": SceneEntityCfg("vialrack"), "upright_good_deg": 22.5}) + + #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) + + self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} + + ) + + + +@configclass +class FrankaCubeEnvCfg_PLAY(FrankaDevEnvCfg): + def __post_init__(self): + # post init of parent + super().__post_init__() + # make a smaller scene for play + self.scene.num_envs = 50 + self.scene.env_spacing = 2.5 + # disable randomization for play + self.observations.policy.enable_corruption = False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index 07ff54a32231..13295c35c41b 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -352,7 +352,7 @@ def __post_init__(self): # general settings self.decimation = 2 - self.episode_length_s = 5000 + self.episode_length_s = 50 # simulation settings self.sim.dt = 0.01 # 100Hz self.sim.render_interval = self.decimation diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py index a74a3b97cd11..5754c9983564 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/observations.py @@ -34,7 +34,7 @@ def object_position_in_robot_root_frame( object_pos_b, _ = subtract_frame_transforms( robot.data.root_state_w[:, :3], robot.data.root_state_w[:, 3:7], object_pos_w ) - + #print(f"object position : {object_pos_b}") return object_pos_b def obstacle_position_in_robot_root_frame( @@ -162,14 +162,14 @@ def is_object_lifted( def ee_frame_pos(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] ee_frame_pos = ee_frame.data.target_pos_w[:, 0, :] - env.scene.env_origins[:, 0:3] - #print(f"EE pos : {ee_frame_pos}") + # print(f"EE pos : {ee_frame_pos}") return ee_frame_pos - +## def ee_frame_quat(env: ManagerBasedRLEnv, ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame")) -> torch.Tensor: ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] ee_frame_quat = ee_frame.data.target_quat_w[:, 0, :] - #print(f"EE quat : {ee_frame_quat}") + # print(f"EE quat : {ee_frame_quat}") return ee_frame_quat @@ -249,7 +249,7 @@ def robot_pose( robot_cfg: SceneEntityCfg = SceneEntityCfg("robot") ): robot: Articulation = env.scene[robot_cfg.name] - # print(robot.data.joint_pos) + print(f"robot data : {robot.data.joint_pos}") return torch.tensor([0.04]) def position_command_error( @@ -301,7 +301,7 @@ def object_tilt (env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = Scen #print("obs term : tilt : ", tilt_deg) return tilt_deg -def object_knocked(env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"), max_tilt: float = 45): +def object_knocked(env: ManagerBasedRLEnv, upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"), max_tilt: float = 90): object: RigidObject = env.scene[upper_object_cfg.name] tilt_deg = upright_tilt_deg(object.data.root_quat_w, object.data.default_root_state[:, 3:7]) # Return a bool tensor with shape (num_envs,) for proper batching diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py index 399ab972ffeb..88d25088b996 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/mdp/terminations.py @@ -144,6 +144,7 @@ def object_stacked_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = S def upright_tilt_deg(q_cur, q_init) -> torch.Tensor: u_cur, u_init = matrix_from_quat(q_cur)[:, :, 2], matrix_from_quat(q_init)[:, :, 2] + # print(f"upright good {torch.rad2deg(torch.acos((u_cur * u_init).sum(-1).clamp(-1.0, 1.0)))}") return torch.rad2deg(torch.acos((u_cur * u_init).sum(-1).clamp(-1.0, 1.0))) @@ -160,7 +161,7 @@ def object_stacked(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEnti pos_diff = upper_object.data.root_pos_w - lower_object.data.root_pos_w height_dist = torch.linalg.vector_norm(pos_diff[:, 2:], dim=1) xy_dist = torch.linalg.vector_norm(pos_diff[:, :2], dim=1) - #print(f"For DEBUG : xy_dist : {xy_dist}, height_dist : {height_dist}") + # print(f"For DEBUG : xy_dist : {xy_dist}, height_dist : {height_dist}") stacked = torch.logical_and(xy_dist < xy_threshold, (height_dist - height_diff) < height_threshold) # stacked = torch.logical_and(torch.isclose(robot.data.joint_pos[:, -1], # gripper_open_val.to(env.device), atol=1e-4, rtol=1e-4), stacked) @@ -171,21 +172,23 @@ def object_stacked(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEnti def object_inserted_upright(env: ManagerBasedRLEnv, robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), upper_object_cfg: SceneEntityCfg = SceneEntityCfg("object"),lower_object_cfg: SceneEntityCfg = SceneEntityCfg("vialrack"), - xy_threshold: float = 0.01, height_threshold: float = 0.03, height_diff: float = 0.0, + xy_threshold: float = 0.01, height_threshold: float = 0.01, height_diff: float = 0.03, atol=0.0001, rtol=0.0001, - upright_good_deg: float = 30.0, gripper_open_val: torch.Tensor = torch.tensor([0.04]), logging=False) -> torch.Tensor: + upright_good_deg: float = 35, gripper_open_val: torch.Tensor = torch.tensor([0.04]), logging=False) -> torch.Tensor: """Stacked AND sufficiently upright (≤ upright_good_deg).""" robot: Articulation = env.scene[robot_cfg.name] upper: RigidObject = env.scene[upper_object_cfg.name] tilt_deg = upright_tilt_deg(upper.data.root_quat_w, upper.data.default_root_state[:, 3:7]) + #print(f"Tilt deg: {tilt_deg}") upright_good = tilt_deg <= upright_good_deg stacked = object_stacked(env, robot_cfg, upper_object_cfg, lower_object_cfg, xy_threshold, height_threshold, height_diff, gripper_open_val) #print(f"For DEBUG : STACKED STATUS : {stacked}") stacked_upright = stacked & upright_good + #print(f"For DEBUG : STACKED STATUS : {stacked_upright}, {stacked}, {upright_good} ") gripper_joint_ids, _ = robot.find_joints(env.cfg.gripper_joint_names) stacked = torch.logical_and( torch.isclose( From ceaa45bc034966f8865d8c8eff241e124b849dbe Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Fri, 13 Mar 2026 17:52:19 +0000 Subject: [PATCH 14/15] ready for case! --- .gitignore | 60 ++ .vscode/browse.vc.db-shm | Bin 32768 -> 0 bytes .vscode/browse.vc.db-wal | 0 debug_ci.py | 26 + docker/.env.ros2 | 10 +- docker/.ros/cyclonedds.xml | 15 - docker/.ros/fastdds.xml | 46 +- docker/Dockerfile.ros2 | 19 +- docs/find_best_checkpoints.py | 2 +- docs/run_experiments.sh | 64 +- ros2/src | 2 +- .../environments/teleoperation/ros2_bridge.py | 130 +++ .../teleoperation/teleop_se3_agent.py | 168 +++- .../robomimic/backup_controller.py | 2 +- .../robomimic/backup_controller_insert_top.py | 16 +- .../robomimic/play_ensemble_ros2.py | 921 +++++++++++++++++ .../robomimic/play_ensemble_ros2_backup.py | 924 ++++++++++++++++++ .../robomimic/play_ensemble_v05.py | 163 ++- .../config/franka/dev_ik_rel_env_obs.py | 2 + .../franka/dev_ik_rel_vial_insert_top_down.py | 2 +- .../manipulation/cube_lift/lift_env_cfg.py | 6 +- 21 files changed, 2393 insertions(+), 185 deletions(-) delete mode 100644 .vscode/browse.vc.db-shm delete mode 100644 .vscode/browse.vc.db-wal create mode 100644 debug_ci.py delete mode 100644 docker/.ros/cyclonedds.xml create mode 100644 scripts/environments/teleoperation/ros2_bridge.py create mode 100644 scripts/imitation_learning/robomimic/play_ensemble_ros2.py create mode 100644 scripts/imitation_learning/robomimic/play_ensemble_ros2_backup.py diff --git a/.gitignore b/.gitignore index 4cf7259980ca..149e1747f357 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ docker/.container.cfg # Don't ignore the top-level .vscode directory as it is # used to configure VS Code settings !.vscode +**/.vscode/*.db* # Outputs **/output/* @@ -77,3 +78,62 @@ tests/ # Docker history .isaac-lab-docker-history +docs/insert/2k/Dev-IK-Rel-Insert-v0/model0/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model1/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model10/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model11/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model12/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model13/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model14/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model2/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model3/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model4/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model5/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model6/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model7/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model8/vial_insert/20260218174413/config.json +docs/insert/2k/Dev-IK-Rel-Insert-v0/model9/vial_insert/20260218174413/config.json +docs/insert/4k/model0/config.json +docs/insert/4k/model1/config.json +docs/insert/4k/model10/config.json +docs/insert/4k/model11/config.json +docs/insert/4k/model12/config.json +docs/insert/4k/model13/config.json +docs/insert/4k/model14/config.json +docs/insert/4k/model2/config.json +docs/insert/4k/model3/config.json +docs/insert/4k/model4/config.json +docs/insert/4k/model5/config.json +docs/insert/4k/model6/config.json +docs/insert/4k/model7/config.json +docs/insert/4k/model8/config.json +docs/insert/4k/model9/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model0/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model1/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model10/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model11/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model12/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model13/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model14/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model2/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model3/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model4/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model5/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model6/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model7/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model8/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0/model9/vial_insert/20260217091333/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model0/vial_insert/20260216134802/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model1/vial_insert/20260216134805/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model10/vial_insert/20260216134809/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model11/vial_insert/20260216134809/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model12/vial_insert/20260216134810/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model13/vial_insert/20260216134810/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model14/vial_insert/20260216134810/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model2/vial_insert/20260216134806/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model3/vial_insert/20260216134806/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model4/vial_insert/20260216134806/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model6/vial_insert/20260216134807/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model7/vial_insert/20260216134808/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model8/vial_insert/20260216134808/config.json +docs/insert/Dev-IK-Rel-Insert-v0_old/model9/vial_insert/20260216134808/config.json diff --git a/.vscode/browse.vc.db-shm b/.vscode/browse.vc.db-shm deleted file mode 100644 index 25a1415fef5f27b23b8308c46d49d3b9353ec0cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI*xlIF65C-698_a3$!=Vuo0YYv88sJKi=ztC=fD95yD1np$98(2!K>*AKD{X48 zWxYk;lSh7g%+t5|<^K8U;p~0%);sC; z$GpFoSFYd6D$kYw?bvjpR-y(`2T_+%S5c8GEk{+aoyYM-RC!PJT5-PUD`&>mB0zuu z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&U$WmZ2%Tz)Un1w(q?aksbo - - - - - - - true - - - auto - 120 - - - diff --git a/docker/.ros/fastdds.xml b/docker/.ros/fastdds.xml index 93ca9c403dad..7cb87abfc031 100644 --- a/docker/.ros/fastdds.xml +++ b/docker/.ros/fastdds.xml @@ -1,27 +1,49 @@ + + - UdpTransport + TailscaleUDP UDPv4 + + +
    100.107.19.48
    +
    - + - UdpTransport + TailscaleUDP false + + + + + +
    100.71.76.112
    +
    +
    +
    + + + +
    100.71.76.112
    +
    +
    +
    + true +
    diff --git a/docker/Dockerfile.ros2 b/docker/Dockerfile.ros2 index dfc555ce31c2..4291c15ffae0 100644 --- a/docker/Dockerfile.ros2 +++ b/docker/Dockerfile.ros2 @@ -25,7 +25,24 @@ RUN --mount=type=cache,target=/var/cache/apt \ ros-humble-rmw-cyclonedds-cpp \ ros-humble-rmw-fastrtps-cpp \ # This includes various dev tools including colcon - ros-dev-tools && \ + ros-dev-tools \ + # Networking tools + iproute2 \ + net-tools \ + # libfranka build dependencies (required for v0.15+ / v0.19) + libpoco-dev \ + libeigen3-dev \ + libssl-dev \ + libspdlog-dev \ + # franka_ros2 / franka_gripper dependencies (minimal, no MoveIt) + ros-humble-control-msgs \ + ros-humble-controller-manager \ + ros-humble-hardware-interface \ + ros-humble-realtime-tools \ + ros-humble-ros2-control \ + ros-humble-ros2-controllers \ + ros-humble-rclcpp-action \ + python3-vcstool && \ # Install rosdeps for extensions that declare a ros_ws in # their extension.toml ${ISAACLAB_PATH}/isaaclab.sh -p ${ISAACLAB_PATH}/tools/install_deps.py rosdep ${ISAACLAB_PATH}/source && \ diff --git a/docs/find_best_checkpoints.py b/docs/find_best_checkpoints.py index 4c35e1afe447..bbb7fe12b9cd 100644 --- a/docs/find_best_checkpoints.py +++ b/docs/find_best_checkpoints.py @@ -72,7 +72,7 @@ def main(): """Main function to process all model directories.""" # Define paths - handle both host and Docker container paths script_dir = Path(__file__).parent.resolve() - base_dir = script_dir / "/workspace/isaaclab/robomimic/Dev-IK-Rel-Insert-v0" + base_dir = script_dir / "/workspace/isaaclab/robomimic/Dev-IK-Rel-Insert-v1" output_dir = base_dir / "best_models" # Create output directory (including parent directories if needed) diff --git a/docs/run_experiments.sh b/docs/run_experiments.sh index 586f3e9950fe..c88d7116dc09 100644 --- a/docs/run_experiments.sh +++ b/docs/run_experiments.sh @@ -2,11 +2,11 @@ ## script to run experiments in the background -task="Dev-IK-Rel-Insert-v0" -horizon=2000 +task="Dev-IK-Rel-Insert-v1" +horizon=1000 num_rollouts=100 run_file="scripts/imitation_learning/robomimic/play_ensemble_v05.py" -exp_type="insert_recal_2k_0.9" +exp_type="insert_top_none" ##### this now runs the experiments @@ -24,30 +24,44 @@ seed=115 exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -# ## ensemble 10 -ensemble_size=10 -seed=101 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# # ## ensemble 10 +# ensemble_size=10 +# seed=101 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -seed=107 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# seed=107 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -seed=115 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# seed=115 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -## ensemble 5 -ensemble_size=5 -seed=101 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# ## ensemble 5 +# ensemble_size=5 +# seed=101 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -seed=107 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# seed=107 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless -seed=115 -exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" -./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless +# seed=115 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + + +# ensemble_size=1 +# seed=101 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +# seed=107 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless + +# seed=115 +# exp_name="${task}_ensemble_${ensemble_size}_seed_${seed}_${exp_type}" +# ./isaaclab.sh -p $run_file --task $task --horizon $horizon --num_rollouts $num_rollouts --ensemble_size $ensemble_size --seed $seed --exp_name $exp_name --headless diff --git a/ros2/src b/ros2/src index a739caa35161..7ef0ab00964a 160000 --- a/ros2/src +++ b/ros2/src @@ -1 +1 @@ -Subproject commit a739caa35161035f3a4505fb077068e9adf51172 +Subproject commit 7ef0ab00964a0d2b5e19e9292bbcef9f32dda811 diff --git a/scripts/environments/teleoperation/ros2_bridge.py b/scripts/environments/teleoperation/ros2_bridge.py new file mode 100644 index 000000000000..8705e2b2808e --- /dev/null +++ b/scripts/environments/teleoperation/ros2_bridge.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python3 +import rclpy +from rclpy.node import Node +from rclpy.action import ActionClient +from geometry_msgs.msg import PoseStamped +from sensor_msgs.msg import JointState +from franka_msgs.action import Move +import socket +import json +import threading +import time + +class ROS2Bridge(Node): + def __init__(self, port=5005): + super().__init__('isaaclab_ros2_bridge') + self.get_logger().info(f'Starting ROS2 Bridge on port {port}...') + + # ROS2 Communication + self._target_pub = self.create_publisher(PoseStamped, '/cartesian_target', 10) + self._joint_target_pub = self.create_publisher(JointState, '/action_desired_joint', 10) + self._action_client = ActionClient(self, Move, 'fr3_gripper/franka_gripper/move') + self._real_pose_sub = self.create_subscription(PoseStamped, '/franka_robot_state_broadcaster/current_pose', self._real_pose_callback, 10) + self._joint_sub = self.create_subscription(JointState, '/joint_states', self._joint_callback, 10) + + self.latest_real_pose = None + self.latest_joints = None + self.lock = threading.Lock() + + # UDP Communication + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.sock.bind(('127.0.0.1', port)) + self.sock.settimeout(0.1) + + self.get_logger().info('Bridge is ready. Waiting for simulation data...') + + def _real_pose_callback(self, msg): + with self.lock: + self.latest_real_pose = { + 'pos': [msg.pose.position.x, msg.pose.position.y, msg.pose.position.z], + 'quat': [msg.pose.orientation.x, msg.pose.orientation.y, msg.pose.orientation.z, msg.pose.orientation.w] + } + + def _joint_callback(self, msg): + arm_joints = [f'fr3_joint{i}' for i in range(1, 8)] + pos, vel = [], [] + try: + for name in arm_joints: + idx = msg.name.index(name) + pos.append(msg.position[idx]) + vel.append(msg.velocity[idx]) + with self.lock: + self.latest_joints = {'pos': pos, 'vel': vel} + except (ValueError, IndexError): + pass + + def publish_cartesian(self, data): + if len(data) < 7: return + msg = PoseStamped() + msg.header.stamp = self.get_clock().now().to_msg() + msg.header.frame_id = 'fr3_link0' + msg.pose.position.x, msg.pose.position.y, msg.pose.position.z = data[0:3] + msg.pose.orientation.x, msg.pose.orientation.y, msg.pose.orientation.z, msg.pose.orientation.w = data[3:7] + self._target_pub.publish(msg) + self.get_logger().info(f"Published Cartesian Target: {data[0:3]}", throttle_duration_sec=0.5) + + def publish_joints(self, positions): + if len(positions) < 7: return + msg = JointState() + msg.header.stamp = self.get_clock().now().to_msg() + msg.header.frame_id = 'base' + msg.name = [f'fr3_joint{i}' for i in range(1, 8)] + msg.position = [float(p) for p in positions[:7]] + msg.velocity = [0.0] * 7 + msg.effort = [0.0] * 7 + self._joint_target_pub.publish(msg) + # Throttled debug log (every 1s) + self.get_logger().info(f"Published Joint Target: {[round(p, 3) for p in msg.position]}", throttle_duration_sec=0.2) + + def send_gripper(self, width): + self.get_logger().info(f"Sending Gripper Goal: width={width}") + goal_msg = Move.Goal() + goal_msg.width = width + goal_msg.speed = 0.2 + self._action_client.wait_for_server(timeout_sec=1.0) + self._action_client.send_goal_async(goal_msg) + + def run(self): + while rclpy.ok(): + try: + data, addr = self.sock.recvfrom(1024) + msg = json.loads(data.decode()) + + if msg['type'] == 'cartesian': + # print(f"DEBUG: Received cartesian from {addr}") + self.publish_cartesian(msg['data']) + elif msg['type'] == 'joint': + # print(f"DEBUG: Received joint from {addr}") + self.publish_joints(msg['data']) + elif msg['type'] == 'gripper': + print(f"DEBUG: Received gripper command: {msg['width']}") + self.send_gripper(msg['width']) + elif msg['type'] == 'query': + # print(f"DEBUG: Received query from {addr}") + # Send back latest state + with self.lock: + resp = { + 'real_pose': self.latest_real_pose, + 'joints': self.latest_joints + } + self.sock.sendto(json.dumps(resp).encode(), addr) + except socket.timeout: + pass + except Exception as e: + self.get_logger().error(f'Bridge error: {e}') + + rclpy.spin_once(self, timeout_sec=0.01) + +def main(): + rclpy.init() + bridge = ROS2Bridge() + try: + bridge.run() + except KeyboardInterrupt: + pass + finally: + bridge.destroy_node() + rclpy.shutdown() + +if __name__ == '__main__': + main() diff --git a/scripts/environments/teleoperation/teleop_se3_agent.py b/scripts/environments/teleoperation/teleop_se3_agent.py index 77399998e8d8..39c39db27b62 100644 --- a/scripts/environments/teleoperation/teleop_se3_agent.py +++ b/scripts/environments/teleoperation/teleop_se3_agent.py @@ -65,14 +65,91 @@ from isaaclab_tasks.manager_based.manipulation.lift import mdp from isaaclab_tasks.utils import parse_env_cfg -# # import rclpy -# # from rclpy.node import Node -# from std_msgs.msg import Float32MultiArray -# from sensor_msgs.msg import JointState - - -if args_cli.enable_pinocchio: - import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 +# --- UDP Bridge imports --- +import socket +import json +import time +import numpy as np + +class BridgeClient: + def __init__(self, port=5005): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.addr = ('127.0.0.1', port) + self.sock.settimeout(0.5) + self._last_print_time = 0 + + def publish_command(self, actions): + """Publish 7-DOF Cartesian target: [x, y, z, qx, qy, qz, qw]""" + if hasattr(actions, 'cpu'): + act_list = actions.cpu().numpy().flatten().tolist() + else: + act_list = np.array(actions).flatten().tolist() + + if len(act_list) < 7: return + + payload = {'type': 'cartesian', 'data': act_list[:7]} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + # Throttled debug print (every 1 second) + curr_time = time.time() + if curr_time - self._last_print_time > 1.0: + print(f"DEBUG: Sent Cartesian to Bridge: {act_list}") + self._last_print_time = curr_time + + def publish_joints(self, positions): + """Publish 7-DOF Joint positions""" + if hasattr(positions, 'cpu'): + pos_list = positions.cpu().numpy().flatten().tolist() + else: + pos_list = np.array(positions).flatten().tolist() + + if len(pos_list) < 7: return + + payload = {'type': 'joint', 'data': pos_list[:7]} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + # Throttled debug print (every 1s) + curr_time = time.time() + if curr_time - self._last_print_time > 1.0: + print(f"DEBUG: Sent Joint Target to Bridge: {[round(p, 3) for p in pos_list[:7]]}") + self._last_print_time = curr_time + + def open_gripper(self): + print("DEBUG: Sending Open Gripper to Bridge") + payload = {'type': 'gripper', 'width': 0.08} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + def close_gripper(self): + print("DEBUG: Sending Close Gripper to Bridge") + payload = {'type': 'gripper', 'width': 0.0} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + def get_robot_state(self): + payload = {'type': 'query'} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + try: + data, _ = self.sock.recvfrom(2048) + return json.loads(data.decode()) + except socket.timeout: + return None + + def init_real(self, sim_pose): + print("[INFO] Initializing real robot synchronization via bridge...") + self.publish_command(sim_pose) + target_pos = np.array(sim_pose[:3]) + + while True: + state = self.get_robot_state() + if state and state.get('real_pose'): + real_pos = np.array(state['real_pose']['pos']) + dist = np.linalg.norm(target_pos - real_pos) + print(f"[INFO] Distance to target: {dist:.4f}m") + if dist < 0.05: + print("[INFO] Real robot synchronized with simulation!") + break + else: + print("[INFO] Waiting for bridge on 127.0.0.1:5005...") + time.sleep(0.5) def main() -> None: @@ -85,6 +162,9 @@ def main() -> None: Returns: None """ + # Initialize UDP Bridge Client + bridge = BridgeClient() + # parse configuration env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=args_cli.num_envs) env_cfg.env_name = args_cli.task @@ -229,6 +309,31 @@ def stop_teleoperation() -> None: # reset environment env.reset() teleop_interface.reset() + prev_gripper_action = None + + # Sync real robot with simulation initial pose + if bridge is not None: + # Get simulated robot initial EE pose + try: + # We use the observation manager to get the tracked end-effector pose + # Based on your environment info, these keys are available in the 'policy' group + obs_dict = env.observation_manager.compute_group("policy") + + # eef_pos is (num_envs, 3), eef_quat is (num_envs, 4) + eef_pos = obs_dict["eef_pos"][0].cpu().numpy() + eef_quat = obs_dict["eef_quat"][0].cpu().numpy() # [qw, qx, qy, qz] + + # ROS expects [qx, qy, qz, qw], Isaac uses [qw, qx, qy, qz] + sim_init_pose = [ + float(eef_pos[0]), float(eef_pos[1]), float(eef_pos[2]), + float(eef_quat[1]), float(eef_quat[2]), float(eef_quat[3]), float(eef_quat[0]) + ] + sim_pose = [0.5208, 0.0096, 0.3751, 0.0360, 0.7414, -0.0706, 0.6663] + print(f"Simulated robot initial pose: {sim_init_pose}") + # bridge.init_real(sim_init_pose) + except Exception as e: + print(f"[WARN] Could not retrieve sim initial pose from observations: {e}") + print("[INFO] Skipping real robot synchronization.") print("Teleoperation started. Press 'R' to reset the environment.") @@ -243,9 +348,48 @@ def stop_teleoperation() -> None: # Only apply teleop commands when active if teleoperation_active: # process actions - actions = action.repeat(env.num_envs, 1) - # process_action(actions) - # apply actions + actions = action.repeat(env.num_envs, 1).to(env.device) + + # Compute absolute pose for the ROS bridge + with torch.no_grad(): + # Get latest observations from the 'policy' group + obs_dict = env.observation_manager.compute_group("policy") + eef_pos = obs_dict["eef_pos"] # (num_envs, 3) + eef_quat = obs_dict["eef_quat"] # (num_envs, 4) -> [qw, qx, qy, qz] + + # Calculate absolute target for bridge (current + delta) + # actions[:, 0:3] is the position delta + abs_pos = eef_pos + actions[:, 0:3] + + # For orientation, we map Isaac [qw, qx, qy, qz] to ROS [qx, qy, qz, qw] + # and keep the current orientation (or integrate if needed, but simple is better) + abs_quat_ros = torch.cat([eef_quat[:, 1:], eef_quat[:, 0:1]], dim=-1) + + # Construct a 7-DOF absolute pose [x, y, z, qx, qy, qz, qw] + abs_pose_bridge = torch.cat([abs_pos, abs_quat_ros], dim=-1) + print(f"absolute pose: {eef_pos}, {eef_quat}") + print(f"absolute pose action: {abs_pose_bridge}") + # ROS 2 Synchronization via Bridge + if bridge is not None: + # Send absolute pose to bridge + bridge.publish_command(abs_pose_bridge[0]) + + # Send joint positions for MoveIt 2 + obs_dict_full = env.observation_manager.compute_group("policy") + if "joint_pos" in obs_dict_full: + bridge.publish_joints(obs_dict_full["joint_pos"][0]) + + # Handle gripper toggling + curr_gripper = float(actions[0, -1]) + if prev_gripper_action is not None: + if curr_gripper != prev_gripper_action: + if curr_gripper > 0: + bridge.open_gripper() + else: + bridge.close_gripper() + prev_gripper_action = curr_gripper + + # apply actions (relative as intended by the environment) env.step(actions) else: env.sim.render() @@ -259,6 +403,8 @@ def stop_teleoperation() -> None: break # close the simulator + env.close() + env.close() print("Environment closed") diff --git a/scripts/imitation_learning/robomimic/backup_controller.py b/scripts/imitation_learning/robomimic/backup_controller.py index f529e417e227..f6a3fbd778dd 100644 --- a/scripts/imitation_learning/robomimic/backup_controller.py +++ b/scripts/imitation_learning/robomimic/backup_controller.py @@ -75,7 +75,7 @@ def infer_state_machine( rest_rot = wp.transform_get_rotation(rest_ee_pose[tid]) # If we're below safe height, first move up - safe_height = 0.35 # Safe z-height to avoid collisions + safe_height = 0.15 # Safe z-height to avoid collisions if current_ee_pos.z < safe_height: # Lift straight up first lift_pos = wp.vec3(current_ee_pos.x, current_ee_pos.y, safe_height) diff --git a/scripts/imitation_learning/robomimic/backup_controller_insert_top.py b/scripts/imitation_learning/robomimic/backup_controller_insert_top.py index 5a893b089255..3dcd3c68eda1 100644 --- a/scripts/imitation_learning/robomimic/backup_controller_insert_top.py +++ b/scripts/imitation_learning/robomimic/backup_controller_insert_top.py @@ -264,7 +264,7 @@ def infer_state_machine( if distance_below_threshold( wp.transform_get_translation(ee_pose[tid]), wp.transform_get_translation(des_ee_pose[tid]), - 0.01, + 0.014, ): if sm_wait_time[tid] >= BackupSMWaitTime.APPROACH_GOAL: # move to next state and reset wait time @@ -462,13 +462,13 @@ def compute(self, ee_pose: torch.Tensor, start_object_pose: torch.Tensor, curren goal_quat = goal_quat_debug[i][3:] # compute Euclidean distance with numpy dist = np.linalg.norm(cur_pos - des_pos) - print(f"StateMachine debug state {debug_state}") - # print(f"[Env {i}]") - print(f" Goal pose : {final_object_pose}") - print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") - print(f" Desired -> pos: {des_pos}, quat: {des_quat}") - print(f" Goal quat -> : {goal_quat}") - print(f" Euclidean distance: {dist:.4f}") + # print(f"StateMachine debug state {debug_state}") + # # print(f"[Env {i}]") + # print(f" Goal pose : {final_object_pose}") + # print(f" Current -> pos: {cur_pos}, quat: {cur_quat}") + # print(f" Desired -> pos: {des_pos}, quat: {des_quat}") + # print(f" Goal quat -> : {goal_quat}") + # print(f" Euclidean distance: {dist:.4f}") # #print(f"returned state : {self.sm_state}") # convert transformations back to (w, x, y, z) des_ee_pose = self.des_ee_pose[:, [0, 1, 2, 6, 3, 4, 5]] diff --git a/scripts/imitation_learning/robomimic/play_ensemble_ros2.py b/scripts/imitation_learning/robomimic/play_ensemble_ros2.py new file mode 100644 index 000000000000..de3145a96921 --- /dev/null +++ b/scripts/imitation_learning/robomimic/play_ensemble_ros2.py @@ -0,0 +1,921 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# run this script: +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play_ensemble_v05.py --device cuda --task Dev-IK-Rel-v0 --num_rollouts 100 +# stack cube task: ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 +"""Script to play and evaluate a trained policy from robomimic. + +This script loads a robomimic policy and plays it in an Isaac Lab environment. +Updated for robomimic v0.5 compatibility. + +Args: + task: Name of the environment. + checkpoint: Path to the robomimic policy checkpoint. + horizon: If provided, override the step horizon of each rollout. + num_rollouts: If provided, override the number of rollouts. + seed: If provided, overeride the default random seed. + norm_factor_min: If provided, minimum value of the action space normalization factor. + norm_factor_max: If provided, maximum value of the action space normalization factor. +""" + +"""Launch Isaac Sim Simulator first.""" + + +import argparse + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") +parser.add_argument("--video", action="store_true", default=False, help="Record videos during training.") +parser.add_argument("--video_length", type=int, default=800, help="Length of the recorded video (in steps).") +parser.add_argument( + "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." +) +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--checkpoint", type=str, default=None, help="Pytorch model checkpoint to load.") +parser.add_argument("--horizon", type=int, default=2000, help="Step horizon of each rollout.") +parser.add_argument("--num_rollouts", type=int, default=1, help="Number of rollouts.") +parser.add_argument("--seed", type=int, default=101, help="Random seed.") +parser.add_argument( + "--norm_factor_min", type=float, default=None, help="Optional: minimum value of the normalization factor." +) +parser.add_argument( + "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." +) +parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") + +parser.add_argument("--model_name", type=str, default=None) +parser.add_argument("--exp_name", type=str, default=None) + +group = parser.add_mutually_exclusive_group() +group.add_argument("--use_recovery", type=bool ,default= False, help="Enable recovery mechanism. By default recovery is enabled.") + +parser.add_argument("--ensemble_size", type=int, default=10) + +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim + # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter + import pinocchio # noqa: F401 +import numpy as np +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import time +import copy +import random +import os +import gymnasium as gym +import torch +import math +from collections import deque + +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.torch_utils as TorchUtils +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp.observations import get_joint_pos, object_grasped +#from chills.tasks.mdp.observations import get_joint_pos, object_grasped +if args_cli.enable_pinocchio: + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from isaaclab_tasks.utils import parse_env_cfg +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType +from isaaclab.utils.math import matrix_from_quat, convert_quat, quat_mul, euler_xyz_from_quat +from evaluation import ensemble_uncertainty +from isaaclab.safety.switchingLogic import SwitchingLogic +from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg +from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat +from isaaclab.managers import SceneEntityCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg, BinaryJointPositionActionCfg +from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction +from backup_controller_handler import BackupController + +# --- ROS2 imports --- +# --- UDP Bridge imports --- +import socket +import json +import time +import numpy as np + +def policy_from_checkpoint_v05(ckpt_path, device, verbose=True): + """ + Load a policy from a checkpoint file - compatible with robomimic v0.5. + + This is a wrapper that handles API differences between robomimic versions. + + Args: + ckpt_path: Path to the checkpoint file. + device: Device to load the policy on. + verbose: Whether to print verbose output. + + Returns: + policy: The loaded policy. + ckpt_dict: The checkpoint dictionary. + """ + import robomimic + from packaging import version + + # Check robomimic version + robomimic_version = getattr(robomimic, '__version__', '0.5.0') + + if verbose: + print(f"[INFO] Loading checkpoint with robomimic version {robomimic_version}") + + # robomimic v0.5+ may have different API + if version.parse(robomimic_version) >= version.parse('0.5.0'): + # v0.5 API - policy_from_checkpoint returns (policy, ckpt_dict) + try: + result = FileUtils.policy_from_checkpoint(ckpt_path=ckpt_path, device=device, verbose=verbose) + if isinstance(result, tuple): + return result + else: + return result, None + except TypeError as e: + if verbose: + print(f"[WARN] policy_from_checkpoint failed with: {e}") + print("[INFO] Trying alternative loading method...") + + # Alternative: manual loading + import torch + import json + from robomimic.algo import algo_factory + from robomimic.config import config_factory + + ckpt_dict = torch.load(ckpt_path, map_location=device) + + # Get config from checkpoint + config = ckpt_dict.get('config', {}) + if isinstance(config, dict): + algo_name = config.get('algo_name', 'bc') + config_obj = config_factory(algo_name) + with config_obj.values_unlocked(): + config_obj.update(config) + config = config_obj + + # Create policy + policy = algo_factory( + algo_name=config.algo_name, + config=config, + obs_key_shapes=ckpt_dict.get('shape_metadata', {}).get('all_shapes', {}), + ac_dim=ckpt_dict.get('shape_metadata', {}).get('ac_dim', 7), + device=device, + ) + + # Load weights + policy.deserialize(ckpt_dict['model']) + policy.set_eval() + + return policy, ckpt_dict + else: + # Older API + return FileUtils.policy_from_checkpoint(ckpt_path=ckpt_path, device=device, verbose=verbose) + + + +# tip over detection +def has_fallen(asset, threshold: float = -0.7, debug: bool = True) -> bool: + """ + Detect if an IsaacLab asset has fallen over by checking its up vector. + + Args: + asset: IsaacLab asset (e.g. robot, object) with .get_world_pose() + threshold: minimum z-component of the up vector (1.0 = perfectly upright). + Typical cutoff ~0.7 (≈45° tilt). + debug: if True, prints internal values for inspection. + + Returns: + True if fallen, False otherwise. + """ + quat = asset.data.body_link_quat_w # (pos, quat), usually torch.Tensors + # print("Beaker quat : ", quat) + # Ensure torch tensor, shape (4,) + if isinstance(quat, (list, tuple)): + quat = torch.tensor(quat, dtype=torch.float32) + quat = quat.view(-1, 4) # shape (1,4) + + # Convert quaternion to wxyz ordering + quat_wxyz = convert_quat(quat, to="wxyz") + + # Rotation matrix (1,3,3) + R = matrix_from_quat(quat_wxyz) + + # World up vector is the third column of rotation matrix + up = R[0, :, 2] # shape (3,) + uprightness = float(up[2]) + + if debug: + print(f"[has_fallen] quat={quat_wxyz.cpu().numpy().round(4)}") + print(f"[has_fallen] up={up.cpu().numpy().round(4)} uprightness={uprightness:.3f}") + + return uprightness > threshold + +def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): + """Perform a single rollout of the policy in the environment. + + Args: + policy: The robomimicpolicy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + + Returns: + terminated: Whether the rollout terminated. + traj: The trajectory of the rollout. + """ + ## do setup + print("running rollout number : ", rollout_num) + # Initialize UDP Bridge Client + bridge = BridgeClient() + + + for policy in ensemble: + policy.start_episode() + obs_dict, _ = env.reset() + print("obs_dict keys : ", obs_dict.keys()) + traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], + uncertainties=[], min_actions=[], max_actions=[], + time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[], diff=[]) + + ###### SETUP SWITCHING LOGIC #### + switchingLogic = SwitchingLogic(parameters, horizon=horizon) + certain_joint_positions = [] + + ###### SET UP RECOVERY #### + use_recovery=False + recovery_activated_during_rollout = 0 + print("rollout recovery enabled ? : ", use_recovery) + + ##### RECOVERY CONFIG #### + recovery_cooldown_duration = 300 # timesteps + recovery_cooldown_timer = recovery_cooldown_duration + recovery_cooldown_active = False + recovery = [] + recovery_steps = 0 + max_recovery_steps = 500 # Safety limit for recovery mode + + ##### CONFIG RECOVERY CONTROLLER #### + backup_controller = BackupController(env, device, tasktype="lift") + state_guess = 0 + last_state = 0 + recovery_mode = False + object_knocked = False + + prev_actions = None # hold previous action + prev_gripper_action = None + + default_quat = torch.tensor([[0.65538, -0.32298, 0.6574, -0.18433]], device=device) #xyzw + # Define the observation keys the trained model expects + # These must match the keys used during training (from shape_metadata) + TRAINED_OBS_KEYS = ['eef_pos', 'eef_quat', 'gripper_pos', 'joint_pos', 'joint_vel', + 'object_position', 'target_object_position', 'actions'] + + print(f'Running for horizon {horizon}') + # print(f"Syncing robot to simulation...") + # if bridge is not None: + # # Get simulated robot initial EE pose + # try: + # # We use the observation manager to get the tracked end-effector pose + # # Based on your environment info, these keys are available in the 'policy' group + # init_obs = obs_dict["policy"] + # + # # eef_pos is (num_envs, 3), eef_quat is (num_envs, 4) + # eef_pos = init_obs["eef_pos"][0].cpu().numpy() + # eef_quat = init_obs["eef_quat"][0].cpu().numpy() # [qw, qx, qy, qz] + # + # # ROS expects [qx, qy, qz, qw], Isaac uses [qw, qx, qy, qz] + # sim_init_pose = [ + # float(eef_pos[0]), float(eef_pos[1]), float(eef_pos[2]), + # float(eef_quat[1]), float(eef_quat[2]), float(eef_quat[3]), float(eef_quat[0]) + # ] + # print(f"Simulated robot initial pose: {sim_init_pose}") + # # bridge.init_real(sim_init_pose) + # except Exception as e: + # print(f"[WARN] Could not retrieve sim initial pose from observations: {e}") + # print("[INFO] Skipping real robot synchronization.") + for i in range(horizon): + # Prepare observations + # print("obs_dict keys : ", obs_dict.keys()) + obs = copy.deepcopy(obs_dict["policy"]) + sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) + + for ob in obs: + obs[ob] = torch.squeeze(obs[ob]) + + for subob in sub_obs: + sub_obs[subob] = torch.squeeze(sub_obs[subob]) + traj["obs"].append(obs) + traj["sub_obs"].append(sub_obs) + + # Check if environment image observations + if hasattr(env.cfg, "image_obs_list"): + # Process image observations for robomimic inference + for image_name in env.cfg.image_obs_list: + if image_name in obs_dict["policy"].keys(): + # Convert from chw uint8 to hwc normalized float + image = torch.squeeze(obs_dict["policy"][image_name]) + image = image.permute(2, 0, 1).clone().float() + image = image / 255.0 + image = image.clip(0.0, 1.0) + obs[image_name] = image + # eef_pos is (num_envs, 3), eef_quat is (num_envs, 4) + eef_pos = obs["eef_pos"].cpu().numpy() + eef_quat = obs["eef_quat"].cpu().numpy() # [qw, qx, qy, qz] + + # ROS expects [qx, qy, qz, qw], Isaac uses [qw, qx, qy, qz] + sim_init_pose = [ + float(eef_pos[0]), float(eef_pos[1]), float(eef_pos[2]), + float(eef_quat[1]), float(eef_quat[2]), float(eef_quat[3]), float(eef_quat[0]) + ] + # print(f"Simulated robot pose: {sim_init_pose}") + + # Filter observations to only include keys the model was trained with + # This prevents dimension mismatch errors when env has extra observations + policy_obs = {k: obs[k] for k in TRAINED_OBS_KEYS if k in obs} + + #### get policy action #### + metrics = ensemble_uncertainty(ensemble, policy_obs) + uncertainty = metrics['variance'] + #print(f"Uncdertainty : {uncertainty}") + policy_actions = metrics['mean'] + diff=metrics['diff'] + + # Robust state estimation based on actual observations + is_grasping = bool(sub_obs['grasp'].item()) if sub_obs['grasp'].numel() == 1 else bool(torch.any(sub_obs['grasp'])) + + # Update state guess based on actual gripper/object state + if is_grasping: + # Object is grasped - should be in LIFT or later states + if state_guess < 4: # LIFT_OBJECT = 4 + state_guess = 4 + print(f"[STATE] Updated to LIFT_OBJECT (grasp detected)") + else: + # Not grasping - if we thought we were lifting, we dropped it + if state_guess >= 4 and state_guess < 7: # Was in lift/move states + # Object dropped - need to re-approach + state_guess = 0 # Go back to REST to safely re-approach + #print(f"[STATE] Reset to REST (grasp lost), activating recovery") + # recovery_mode= True + + sm_actions, state_guess = backup_controller.get_controller_action(state_guess, 0) + if last_state != state_guess: + print(f"[STATE] Transition: {last_state} -> {state_guess}") + last_state = state_guess + + + # this is the switching logic + uncertainty_triggered = switchingLogic.check(uncertainty, i) + if uncertainty_triggered: + # uncertainty triggered + if use_recovery and not recovery_cooldown_active: + # if we have switched to recovery + if not recovery_mode: + recovery_mode = True + recovery_activated_during_rollout+=1 + recovery_steps = 0 + print(f"[RECOVERY] Step {i} - Starting recovery from state {state_guess}") + + if recovery_mode: + #print(f"Recovery Actions") + actions = sm_actions + recovery_steps += 1 + + # Exit recovery when task completes or after max steps + # max_recovery_steps = 500 + # if recovery_steps > max_recovery_steps: # APPROACH_GOAL = 7 + # print(f"[RECOVERY] Completed after {recovery_steps} steps, state={state_guess}") + # recovery_mode = False + # recovery_cooldown_active = True + # recovery_cooldown_timer = recovery_cooldown_duration + else: + # Decrement cooldown when not in recovery + # if recovery_cooldown_active: + # recovery_cooldown_timer -= 1 + # if recovery_cooldown_timer <= 0: + # recovery_cooldown_active = False + # recovery_cooldown_timer = recovery_cooldown_duration + # print("Recovery Cooldown Ended") + + actions = policy_actions + + # Unnormalize actions + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ( + (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) + ) / 2 + args_cli.norm_factor_min + actions = actions.to(device=device).view(1, env.action_space.shape[1]) + + # print(f"absolute pose: {sim_init_pose}") + # Apply actions + obs_dict, _, terminated, truncated, _ = env.step(actions) + recovery.append(recovery_mode) + # update obs from taking action + obs = obs_dict["policy"] + sub_obs = obs_dict["subtask_terms"] + + # Compute absolute pose for the ROS bridge + with torch.no_grad(): + # Get latest observations from the 'policy' group + #obs_dct = env.observation_manager.compute_group("policy") + eef_pos = obs["eef_pos"] # (num_envs, 3) + eef_quat = obs["eef_quat"] # (num_envs, 4) -> [qw, qx, qy, qz] + + # Calculate absolute target for bridge (current + delta) + # actions[:, 0:3] is the position delta + abs_pos = eef_pos + actions[:, 0:3] + + # For orientation, we map Isaac [qw, qx, qy, qz] to ROS [qx, qy, qz, qw] + # and keep the current orientation (or integrate if needed, but simple is better) + abs_quat_ros = torch.cat([eef_quat[:, 1:], eef_quat[:, 0:1]], dim=-1) + #abs_quat_ros = default_quat + # Construct a 7-DOF absolute pose [x, y, z, qx, qy, qz, qw] + abs_pose_bridge = torch.cat([abs_pos, abs_quat_ros], dim=-1) + + # print(f"absolute pose action: {abs_pose_bridge}") + # ROS 2 Synchronization via Bridge + if bridge is not None: + # only send new pose every 5 + + # print(f"Trying to publish...") + # Send absolute pose to bridge + bridge.publish_command(abs_pose_bridge[0]) + # Publish Joint States for MoveIt 2 + bridge.publish_joints(obs['abs_joint_pos'][0]) + # print(f"Published joint states: {obs['abs_joint_pos'][0]}") + + # Handle gripper toggling + curr_gripper = obs['gripper_pos'] + # print(f"Grippper pos : {curr_gripper}, left {curr_gripper[0,0]}") + if curr_gripper[0,0] > 0.039: + gripper_action = 1 + if gripper_action != prev_gripper_action: + print(f"DEBUG: Triggering Open Gripper (act={curr_gripper})") + bridge.open_gripper() + else: + gripper_action=0 + if gripper_action!=prev_gripper_action: + print(f"DEBUG: Triggering Close Gripper (act={curr_gripper})") + bridge.close_gripper() + prev_gripper_action = gripper_action + + + + # Slow down the loop to ~1Hz + time.sleep(0.2) + + # Record trajectory + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs) + traj['uncertainties'].append(uncertainty) + traj['max_actions'].append(metrics['max']) + traj['min_actions'].append(metrics['min']) + traj['time_taken'].append(metrics['time_taken']) + traj['joint_pos'].append(obs['abs_joint_pos']) + traj['recovery'].append(recovery) + traj['diff'].append(diff) + if torch.any(obs['object_knocked']): + print("[MONITOR] object knocked over") + object_knocked = True + + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + print(f"DEBUG: Triggering Open Gripper (act={curr_gripper})") + bridge.open_gripper() + traj['failure'].append(" ") + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) + print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + # print(f"grasp : {grasp.item()}, appr : {appr.item()}") + return True, traj, recovery_activated_during_rollout, "" + + elif terminated or truncated: + print(f"DEBUG: Triggering Open Gripper (act={curr_gripper})") + bridge.open_gripper() + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) + #print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + if i==horizon: + #if the failure was caused by object collision + traj['failure'].append("timeout") + failure_reason = "timeout" + else: + #if failure due to timeout, record timeout + traj['failure'].append("knocked") + failure_reason = "object_knocked" + return False, traj, recovery_activated_during_rollout, failure_reason + prev_actions = actions + + print(f"DEBUG: Triggering Open Gripper (act={curr_gripper})") + bridge.open_gripper() + #print("REcovery : ", traj["recovery"]) + traj['failure'].append("timeout") + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) + return False, traj, recovery_activated_during_rollout, "" + + +def load_ensemble(device, ensemble_path): + """Load an ensemble of policies from checkpoint paths. + + Updated for robomimic v0.5 compatibility. + """ + with open(ensemble_path, 'r') as file: + ensemble_paths = [path.strip() for path in file.readlines()] + ensemble = [] + for path in ensemble_paths: + if not path: # Skip empty lines + continue + policy, _ = policy_from_checkpoint_v05(ckpt_path=path, device=device, verbose=True) + ensemble.append(policy) + print(f"[DEBUG] loaded {len(ensemble)} policies") + return ensemble + + +def clear_files(*paths : str): + if len(paths) < 1: + raise ValueError("At least one path is required.") + if os.path.exists(paths[0]): + #overwrite = input(f"You are about to overwrite rollout data at: {paths}\nContinue (y/n):") + overwrite = "y" + match overwrite.lower(): + case 'y' | 'Y': + for path in paths: + with open(path, 'w') as file: + pass + case _: + exit() + + +class BridgeClient: + def __init__(self, port=5005): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.addr = ('127.0.0.1', port) + self.sock.settimeout(0.5) + self._last_print_time = 0 + + def publish_command(self, actions): + """Publish 7-DOF Cartesian target: [x, y, z, qx, qy, qz, qw]""" + if hasattr(actions, 'cpu'): + act_list = actions.cpu().numpy().flatten().tolist() + else: + act_list = np.array(actions).flatten().tolist() + + if len(act_list) < 7: return + + payload = {'type': 'cartesian', 'data': act_list[:7]} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + # Throttled debug print (every 1 second) + curr_time = time.time() + if curr_time - self._last_print_time > 1.0: + # print(f"DEBUG: Sent Cartesian to Bridge: {act_list}") + self._last_print_time = curr_time + + def publish_joints(self, positions): + """Publish 7-DOF Joint positions""" + if hasattr(positions, 'cpu'): + pos_list = positions.cpu().numpy().flatten().tolist() + else: + pos_list = np.array(positions).flatten().tolist() + + if len(pos_list) < 7: return + + payload = {'type': 'joint', 'data': pos_list[:7]} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + # Throttled debug print (every 1s) + curr_time = time.time() + if curr_time - self._last_print_time > 1.0: + # print(f"DEBUG: Sent Joint Target to Bridge: {[round(p, 3) for p in pos_list[:7]]}") + self._last_print_time = curr_time + + def open_gripper(self): + print("DEBUG: Sending Open Gripper to Bridge") + payload = {'type': 'gripper', 'width': 0.08} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + def close_gripper(self): + print("DEBUG: Sending Close Gripper to Bridge") + payload = {'type': 'gripper', 'width': 0.061} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + def get_robot_state(self): + payload = {'type': 'query'} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + try: + data, _ = self.sock.recvfrom(2048) + return json.loads(data.decode()) + except socket.timeout: + return None + + def init_real(self, sim_pose): + print("[INFO] Initializing real robot synchronization via bridge...") + self.publish_command(sim_pose) + target_pos = np.array(sim_pose[:3]) + + while True: + state = self.get_robot_state() + if state and state.get('real_pose'): + real_pos = np.array(state['real_pose']['pos']) + dist = np.linalg.norm(target_pos - real_pos) + print(f"[INFO] Distance to target: {dist:.4f}m") + if dist < 0.05: + print("[INFO] Real robot synchronized with simulation!") + break + else: + print("[INFO] Waiting for bridge on 127.0.0.1:5005...") + time.sleep(0.5) + + +def main(): + """Run a trained policy from robomimic with Isaac Lab environment.""" + # parse configuration + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + + # Set observations to dictionary mode for Robomimic + env_cfg.observations.policy.concatenate_terms = False + + #create a log handler + # loghelper = LoggingHelper() + + + + # Disable recorder + env_cfg.recorders = None + + # Extract success checking function + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + + # Get timeout signal + timeout = env_cfg.terminations.time_out + #env_cfg.terminations.time_out = None + + # Create environment + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + + # Set seed + torch.manual_seed(args_cli.seed) + ##### unset these two lines for deterministic randomness + # np.random.seed(args_cli.seed) + # random.seed(args_cli.seed) + + env.seed(args_cli.seed) + + # Acquire device + device = TorchUtils.get_torch_device(try_to_use_cuda=True) + + # load the stack cube ensemble + # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') + + #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') + #pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/low/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') + # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') + pick_place_ensemble = load_ensemble(device, ensemble_path='docs/lift/Dev-IK-Rel-v1/best_models/best_model_paths.txt') + + # pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/insert_paths.txt') + #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/inser_top_paths.txt') + + # Lets set these to the 0.99 confidence + parameters = { + 'beaker_lift':{ + 0 : { + "confidence_level": 7.716635000000001e-05, + "window_size": 10, + "max_peaks": 8 + }, + 1 : { + "confidence_level": 7.712965000000002e-05, + "window_size": 10, + "max_peaks": 8 + }, + 2 : { + "confidence_level": 7.057612000000003e-05, + "window_size": 10, + "max_peaks": 8 + }, + 3 : { + "confidence_level": 0.00010471817000000003, + "window_size": 10, + "max_peaks": 8 + }, + 4 : { + "confidence_level": 0.00010728666000000004, + "window_size": 10, + "max_peaks": 8 + }, + 5 : { + "confidence_level": 0.00011272453000000001, + "window_size": 10, + "max_peaks": 8 + }, + 6 : { + "confidence_level": 1.6e-08, + "window_size": 10, + "max_peaks": 8 + }, + }, + + 'vial_insert': { + 0 : { + "confidence_level": 0.00016269120400000059, + "window_size": 9, + "max_peaks": 8 + }, + 1 : { + "confidence_level": 0.000173801014, + "window_size": 9, + "max_peaks": 8 + }, + 2 : { + "confidence_level": 0.00018948240900000074, + "window_size": 9, + "max_peaks": 8 + }, + 3 : { + "confidence_level": 0.0007136359360000004, + "window_size": 9, + "max_peaks": 8 + }, + 4 : { + "confidence_level": 0.00015286798600000018, + "window_size": 9, + "max_peaks": 8 + }, + 5 : { + "confidence_level": 0.00047967177600000013, + "window_size": 9, + "max_peaks": 8 + }, + 6 : { + "confidence_level": 0.26672138987099997, + "window_size": 9, + "max_peaks": 8 + }, + + }, + 'force_backup': { + 0 : { + "confidence_level": 0.0, + "window_size": 9, + "max_peaks": 8 + }, + 1 : { + "confidence_level": 0.00, + "window_size": 9, + "max_peaks": 8 + }, + 2 : { + "confidence_level": 0.000, + "window_size": 9, + "max_peaks": 8 + }, + 3 : { + "confidence_level": 0.00, + "window_size": 9, + "max_peaks": 8 + }, + 4 : { + "confidence_level": 0.000, + "window_size": 9, + "max_peaks": 8 + }, + 5 : { + "confidence_level": 0.00, + "window_size": 9, + "max_peaks": 8 + }, + 6 : { + "confidence_level": 0.0, + "window_size": 9, + "max_peaks": 8 + }, + } + } + + + + model_arch = "BC_RNN_GMM" + task = "pick_place" # stack_cube or pick_place + model_name = f"ensemble" + number = 'no_recovery_video' + + results_path = f"docs/training_data/{task}/uncertainty_rollout_{task}/{model_name}/run_{number}" + + uncertainties_path = f"{results_path}/uncertainties{number}.txt" + actions_path = f"{results_path}/actions{number}.txt" + min_actions_path = f"{results_path}/min_actions{number}.txt" + max_actions_path = f"{results_path}/max_actions{number}.txt" + time_taken_path = f"{results_path}/time_taken{number}.txt" + recovery_activated_during_rollout_path = f"{results_path}/recovery_activated_during_rollout.txt" + rollout_uncert_path = f"{uncertainties_path}/rollout_uncerts" + rollout_log_path = f"{uncertainties_path[:len(uncertainties_path)-4]}_rollout_log.txt" + + rollout_log_path = f"{uncertainties_path[:len(uncertainties_path)-4]}_rollout_log.txt" # remove the '.txt' and add rollout_log.txt + + uncertainty_results_path = f"{results_path}/uncertainty_plots" + trajectory_results_path = f"{results_path}/trajectory_plots" + os.makedirs(uncertainty_results_path, exist_ok=True) + os.makedirs(trajectory_results_path, exist_ok=True) + + + # clear files + clear_files( + uncertainties_path, actions_path, + min_actions_path, max_actions_path, + time_taken_path, recovery_activated_during_rollout_path + ) + + # Run policy + results = [] + failed_no_intervention =[] + intervention = [] + intervention_success = [] + knocked=0 + intervention_failure = [] + for trial in range(args_cli.num_rollouts): + print(f"[INFO] Starting trial {trial}") + + terminated, traj, recovery_activated_during_rollout, failure = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['beaker_lift'], use_recovery=args_cli.use_recovery, rollout_num=trial) + # save the uncertainties + print("Finished rollout, recovery needed : ", recovery_activated_during_rollout) + #print("actions shape : ", traj['actions']) + + + + results.append(terminated) + if not terminated: + if recovery_activated_during_rollout <=0: + failed_no_intervention.append(1) + + if recovery_activated_during_rollout > 0: + intervention.append(1) + if terminated: + intervention_success.append(1) + else: + intervention_failure.append(1) + else: + intervention.append(0) + if "knocked" in traj['failure'] or (len(traj['failure']) > 0 and traj['failure'][-1] == "knocked"): + knocked+=1 + + print(f'Current success rate: {results.count(True)/len(results):.2%}') + print(f'Current intervention rate: {sum(intervention)/len(intervention):.2%} ({sum(intervention)}/{len(intervention)})') + print(f"[INFO] Trial {trial}: {'SUCCESS' if terminated else 'FAILED'}\n") + #loghelper.stopEpoch(trial) + + # Prepare summary text + exp_name = args_cli.exp_name if args_cli.exp_name else "unnamed" + summary_text = f"\nSummary for experiment {exp_name}\n" + summary_text += f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials\n" + summary_text += f"Success rate: {results.count(True) / len(results)}\n" + summary_text += f'Failed runs with no intervention : {sum(failed_no_intervention)}\n' + summary_text += f"Intervention rate : {sum(intervention)/len(intervention)}. Of which success : {sum(intervention_success)}, of which failed {sum(intervention_failure)}\n" + summary_text += f"Intervention Results: {intervention}\n" + summary_text += f"Number of times object knocked over : {knocked}\n" + summary_text += f"Trial Results: {results}\n\n" + summary_text += f"Environment random seed: {args_cli.seed}\n" + + # Print to console + print(summary_text) + + # Write to file + # results_file = "docs/ensemble_run_results.txt" + # with open(results_file, 'a') as f: + # f.write(summary_text) + # f.write("\n" + "="*80 + "\n\n") + # print(f"Results appended to: {results_file}") + + # if franka_gripper is not None: + # franka_gripper.destroy_node() + # if franka_arm is not None: + # franka_arm.destroy_node() + if rclpy.ok(): + rclpy.shutdown() + env.close() + + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() diff --git a/scripts/imitation_learning/robomimic/play_ensemble_ros2_backup.py b/scripts/imitation_learning/robomimic/play_ensemble_ros2_backup.py new file mode 100644 index 000000000000..ec19d1582e9b --- /dev/null +++ b/scripts/imitation_learning/robomimic/play_ensemble_ros2_backup.py @@ -0,0 +1,924 @@ +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# run this script: +# ./isaaclab.sh -p scripts/imitation_learning/robomimic/play_ensemble_v05.py --device cuda --task Dev-IK-Rel-v0 --num_rollouts 100 +# stack cube task: ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --device cuda --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 +"""Script to play and evaluate a trained policy from robomimic. + +This script loads a robomimic policy and plays it in an Isaac Lab environment. +Updated for robomimic v0.5 compatibility. + +Args: + task: Name of the environment. + checkpoint: Path to the robomimic policy checkpoint. + horizon: If provided, override the step horizon of each rollout. + num_rollouts: If provided, override the number of rollouts. + seed: If provided, overeride the default random seed. + norm_factor_min: If provided, minimum value of the action space normalization factor. + norm_factor_max: If provided, maximum value of the action space normalization factor. +""" + +"""Launch Isaac Sim Simulator first.""" + + +import argparse + +from isaaclab.app import AppLauncher + +# add argparse arguments +parser = argparse.ArgumentParser(description="Evaluate robomimic policy for Isaac Lab environment.") +parser.add_argument("--video", action="store_true", default=False, help="Record videos during training.") +parser.add_argument("--video_length", type=int, default=800, help="Length of the recorded video (in steps).") +parser.add_argument( + "--disable_fabric", action="store_true", default=False, help="Disable fabric and use USD I/O operations." +) +parser.add_argument("--task", type=str, default=None, help="Name of the task.") +parser.add_argument("--checkpoint", type=str, default=None, help="Pytorch model checkpoint to load.") +parser.add_argument("--horizon", type=int, default=2000, help="Step horizon of each rollout.") +parser.add_argument("--num_rollouts", type=int, default=1, help="Number of rollouts.") +parser.add_argument("--seed", type=int, default=101, help="Random seed.") +parser.add_argument( + "--norm_factor_min", type=float, default=None, help="Optional: minimum value of the normalization factor." +) +parser.add_argument( + "--norm_factor_max", type=float, default=None, help="Optional: maximum value of the normalization factor." +) +parser.add_argument("--enable_pinocchio", default=False, action="store_true", help="Enable Pinocchio.") + +parser.add_argument("--model_name", type=str, default=None) +parser.add_argument("--exp_name", type=str, default=None) + +group = parser.add_mutually_exclusive_group() +group.add_argument("--use_recovery", type=bool ,default= False, help="Enable recovery mechanism. By default recovery is enabled.") + +parser.add_argument("--ensemble_size", type=int, default=10) + +# append AppLauncher cli args +AppLauncher.add_app_launcher_args(parser) +# parse the arguments +args_cli = parser.parse_args() + +if args_cli.enable_pinocchio: + # Import pinocchio before AppLauncher to force the use of the version installed by IsaacLab and not the one installed by Isaac Sim + # pinocchio is required by the Pink IK controllers and the GR1T2 retargeter + import pinocchio # noqa: F401 +import numpy as np +# launch omniverse app +app_launcher = AppLauncher(args_cli) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import time +import copy +import random +import os +import gymnasium as gym +import torch +import math +from collections import deque + +import robomimic.utils.file_utils as FileUtils +import robomimic.utils.torch_utils as TorchUtils +from isaaclab_tasks.manager_based.manipulation.cube_lift.mdp.observations import get_joint_pos, object_grasped +#from chills.tasks.mdp.observations import get_joint_pos, object_grasped +if args_cli.enable_pinocchio: + import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401 + +from isaaclab_tasks.utils import parse_env_cfg +#from isaaclab.utils.logging_helper import LoggingHelper, ErrorType, LogType +from isaaclab.utils.math import matrix_from_quat, convert_quat, quat_mul, euler_xyz_from_quat +from evaluation import ensemble_uncertainty +from isaaclab.safety.switchingLogic import SwitchingLogic +from isaaclab.controllers import DifferentialIKController, DifferentialIKControllerCfg +from isaaclab.utils.math import subtract_frame_transforms, euler_xyz_from_quat +from isaaclab.managers import SceneEntityCfg +from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg, BinaryJointPositionActionCfg +from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction +from backup_controller_handler import BackupController + +# --- ROS2 imports --- +# --- UDP Bridge imports --- +import socket +import json +import time +import numpy as np + +def policy_from_checkpoint_v05(ckpt_path, device, verbose=True): + """ + Load a policy from a checkpoint file - compatible with robomimic v0.5. + + This is a wrapper that handles API differences between robomimic versions. + + Args: + ckpt_path: Path to the checkpoint file. + device: Device to load the policy on. + verbose: Whether to print verbose output. + + Returns: + policy: The loaded policy. + ckpt_dict: The checkpoint dictionary. + """ + import robomimic + from packaging import version + + # Check robomimic version + robomimic_version = getattr(robomimic, '__version__', '0.5.0') + + if verbose: + print(f"[INFO] Loading checkpoint with robomimic version {robomimic_version}") + + # robomimic v0.5+ may have different API + if version.parse(robomimic_version) >= version.parse('0.5.0'): + # v0.5 API - policy_from_checkpoint returns (policy, ckpt_dict) + try: + result = FileUtils.policy_from_checkpoint(ckpt_path=ckpt_path, device=device, verbose=verbose) + if isinstance(result, tuple): + return result + else: + return result, None + except TypeError as e: + if verbose: + print(f"[WARN] policy_from_checkpoint failed with: {e}") + print("[INFO] Trying alternative loading method...") + + # Alternative: manual loading + import torch + import json + from robomimic.algo import algo_factory + from robomimic.config import config_factory + + ckpt_dict = torch.load(ckpt_path, map_location=device) + + # Get config from checkpoint + config = ckpt_dict.get('config', {}) + if isinstance(config, dict): + algo_name = config.get('algo_name', 'bc') + config_obj = config_factory(algo_name) + with config_obj.values_unlocked(): + config_obj.update(config) + config = config_obj + + # Create policy + policy = algo_factory( + algo_name=config.algo_name, + config=config, + obs_key_shapes=ckpt_dict.get('shape_metadata', {}).get('all_shapes', {}), + ac_dim=ckpt_dict.get('shape_metadata', {}).get('ac_dim', 7), + device=device, + ) + + # Load weights + policy.deserialize(ckpt_dict['model']) + policy.set_eval() + + return policy, ckpt_dict + else: + # Older API + return FileUtils.policy_from_checkpoint(ckpt_path=ckpt_path, device=device, verbose=verbose) + + + +# tip over detection +def has_fallen(asset, threshold: float = -0.7, debug: bool = True) -> bool: + """ + Detect if an IsaacLab asset has fallen over by checking its up vector. + + Args: + asset: IsaacLab asset (e.g. robot, object) with .get_world_pose() + threshold: minimum z-component of the up vector (1.0 = perfectly upright). + Typical cutoff ~0.7 (≈45° tilt). + debug: if True, prints internal values for inspection. + + Returns: + True if fallen, False otherwise. + """ + quat = asset.data.body_link_quat_w # (pos, quat), usually torch.Tensors + # print("Beaker quat : ", quat) + # Ensure torch tensor, shape (4,) + if isinstance(quat, (list, tuple)): + quat = torch.tensor(quat, dtype=torch.float32) + quat = quat.view(-1, 4) # shape (1,4) + + # Convert quaternion to wxyz ordering + quat_wxyz = convert_quat(quat, to="wxyz") + + # Rotation matrix (1,3,3) + R = matrix_from_quat(quat_wxyz) + + # World up vector is the third column of rotation matrix + up = R[0, :, 2] # shape (3,) + uprightness = float(up[2]) + + if debug: + print(f"[has_fallen] quat={quat_wxyz.cpu().numpy().round(4)}") + print(f"[has_fallen] up={up.cpu().numpy().round(4)} uprightness={uprightness:.3f}") + + return uprightness > threshold + +def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): + """Perform a single rollout of the policy in the environment. + + Args: + policy: The robomimicpolicy to play. + env: The environment to play in. + horizon: The step horizon of each rollout. + device: The device to run the policy on. + + Returns: + terminated: Whether the rollout terminated. + traj: The trajectory of the rollout. + """ + ## do setup + print("running rollout number : ", rollout_num) + # Initialize UDP Bridge Client + bridge = BridgeClient() + + + for policy in ensemble: + policy.start_episode() + obs_dict, _ = env.reset() + print("obs_dict keys : ", obs_dict.keys()) + traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], + uncertainties=[], min_actions=[], max_actions=[], + time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[], diff=[]) + + ###### SETUP SWITCHING LOGIC #### + switchingLogic = SwitchingLogic(parameters, horizon=horizon) + certain_joint_positions = [] + + ###### SET UP RECOVERY #### + use_recovery=True + recovery_activated_during_rollout = 0 + print("rollout recovery enabled ? : ", use_recovery) + + ##### RECOVERY CONFIG #### + recovery_cooldown_duration = 300 # timesteps + recovery_cooldown_timer = recovery_cooldown_duration + recovery_cooldown_active = False + recovery = [] + recovery_steps = 0 + max_recovery_steps = 500 # Safety limit for recovery mode + + ##### CONFIG RECOVERY CONTROLLER #### + backup_controller = BackupController(env, device, tasktype="insert_top") + state_guess = 0 + last_state = 0 + recovery_mode = False + object_knocked = False + + prev_actions = None # hold previous action + prev_gripper_action = None + + default_quat = torch.tensor([[0.65538, -0.32298, 0.6574, -0.18433]], device=device) #xyzw + # Define the observation keys the trained model expects + # These must match the keys used during training (from shape_metadata) + TRAINED_OBS_KEYS = ['eef_pos', 'eef_quat', 'gripper_pos', 'joint_pos', 'joint_vel', + 'object_position', 'target_object_position', 'actions'] + + print(f'Running for horizon {horizon}') + # print(f"Syncing robot to simulation...") + # if bridge is not None: + # # Get simulated robot initial EE pose + # try: + # # We use the observation manager to get the tracked end-effector pose + # # Based on your environment info, these keys are available in the 'policy' group + # init_obs = obs_dict["policy"] + # + # # eef_pos is (num_envs, 3), eef_quat is (num_envs, 4) + # eef_pos = init_obs["eef_pos"][0].cpu().numpy() + # eef_quat = init_obs["eef_quat"][0].cpu().numpy() # [qw, qx, qy, qz] + # + # # ROS expects [qx, qy, qz, qw], Isaac uses [qw, qx, qy, qz] + # sim_init_pose = [ + # float(eef_pos[0]), float(eef_pos[1]), float(eef_pos[2]), + # float(eef_quat[1]), float(eef_quat[2]), float(eef_quat[3]), float(eef_quat[0]) + # ] + # print(f"Simulated robot initial pose: {sim_init_pose}") + # # bridge.init_real(sim_init_pose) + # except Exception as e: + # print(f"[WARN] Could not retrieve sim initial pose from observations: {e}") + # print("[INFO] Skipping real robot synchronization.") + for i in range(horizon): + # Prepare observations + print("obs_dict keys : ", obs_dict.keys()) + obs = copy.deepcopy(obs_dict["policy"]) + sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) + + for ob in obs: + obs[ob] = torch.squeeze(obs[ob]) + + for subob in sub_obs: + sub_obs[subob] = torch.squeeze(sub_obs[subob]) + traj["obs"].append(obs) + traj["sub_obs"].append(sub_obs) + + # Check if environment image observations + if hasattr(env.cfg, "image_obs_list"): + # Process image observations for robomimic inference + for image_name in env.cfg.image_obs_list: + if image_name in obs_dict["policy"].keys(): + # Convert from chw uint8 to hwc normalized float + image = torch.squeeze(obs_dict["policy"][image_name]) + image = image.permute(2, 0, 1).clone().float() + image = image / 255.0 + image = image.clip(0.0, 1.0) + obs[image_name] = image + # eef_pos is (num_envs, 3), eef_quat is (num_envs, 4) + eef_pos = obs["eef_pos"].cpu().numpy() + eef_quat = obs["eef_quat"].cpu().numpy() # [qw, qx, qy, qz] + + # ROS expects [qx, qy, qz, qw], Isaac uses [qw, qx, qy, qz] + sim_init_pose = [ + float(eef_pos[0]), float(eef_pos[1]), float(eef_pos[2]), + float(eef_quat[1]), float(eef_quat[2]), float(eef_quat[3]), float(eef_quat[0]) + ] + print(f"Simulated robot pose: {sim_init_pose}") + + # Filter observations to only include keys the model was trained with + # This prevents dimension mismatch errors when env has extra observations + policy_obs = {k: obs[k] for k in TRAINED_OBS_KEYS if k in obs} + + #### get policy action #### + metrics = ensemble_uncertainty(ensemble, policy_obs) + uncertainty = metrics['variance'] + #print(f"Uncdertainty : {uncertainty}") + policy_actions = metrics['mean'] + diff=metrics['diff'] + + # Robust state estimation based on actual observations + is_grasping = bool(sub_obs['grasp'].item()) if sub_obs['grasp'].numel() == 1 else bool(torch.any(sub_obs['grasp'])) + + # Update state guess based on actual gripper/object state + if is_grasping: + # Object is grasped - should be in LIFT or later states + if state_guess < 4: # LIFT_OBJECT = 4 + state_guess = 4 + print(f"[STATE] Updated to LIFT_OBJECT (grasp detected)") + else: + # Not grasping - if we thought we were lifting, we dropped it + if state_guess >= 4 and state_guess < 7: # Was in lift/move states + # Object dropped - need to re-approach + state_guess = 0 # Go back to REST to safely re-approach + #print(f"[STATE] Reset to REST (grasp lost), activating recovery") + # recovery_mode= True + + sm_actions, state_guess = backup_controller.get_controller_action(state_guess, 0) + if last_state != state_guess: + print(f"[STATE] Transition: {last_state} -> {state_guess}") + last_state = state_guess + + + # this is the switching logic + uncertainty_triggered = switchingLogic.check(uncertainty, i) + if uncertainty_triggered: + # uncertainty triggered + if use_recovery and not recovery_cooldown_active: + # if we have switched to recovery + if not recovery_mode: + recovery_mode = True + recovery_activated_during_rollout+=1 + recovery_steps = 0 + print(f"[RECOVERY] Step {i} - Starting recovery from state {state_guess}") + + if recovery_mode: + #print(f"Recovery Actions") + actions = sm_actions + recovery_steps += 1 + + # Exit recovery when task completes or after max steps + # max_recovery_steps = 500 + # if recovery_steps > max_recovery_steps: # APPROACH_GOAL = 7 + # print(f"[RECOVERY] Completed after {recovery_steps} steps, state={state_guess}") + # recovery_mode = False + # recovery_cooldown_active = True + # recovery_cooldown_timer = recovery_cooldown_duration + else: + # Decrement cooldown when not in recovery + # if recovery_cooldown_active: + # recovery_cooldown_timer -= 1 + # if recovery_cooldown_timer <= 0: + # recovery_cooldown_active = False + # recovery_cooldown_timer = recovery_cooldown_duration + # print("Recovery Cooldown Ended") + + actions = policy_actions + + # Unnormalize actions + if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: + actions = ( + (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) + ) / 2 + args_cli.norm_factor_min + actions = actions.to(device=device).view(1, env.action_space.shape[1]) + + print(f"absolute pose: {sim_init_pose}") + # Apply actions + obs_dict, _, terminated, truncated, _ = env.step(actions) + recovery.append(recovery_mode) + # update obs from taking action + obs = obs_dict["policy"] + sub_obs = obs_dict["subtask_terms"] + + # Compute absolute pose for the ROS bridge + with torch.no_grad(): + # Get latest observations from the 'policy' group + #obs_dct = env.observation_manager.compute_group("policy") + eef_pos = obs["eef_pos"] # (num_envs, 3) + eef_quat = obs["eef_quat"] # (num_envs, 4) -> [qw, qx, qy, qz] + + # Calculate absolute target for bridge (current + delta) + # actions[:, 0:3] is the position delta + abs_pos = eef_pos + actions[:, 0:3] + + # For orientation, we map Isaac [qw, qx, qy, qz] to ROS [qx, qy, qz, qw] + # and keep the current orientation (or integrate if needed, but simple is better) + abs_quat_ros = torch.cat([eef_quat[:, 1:], eef_quat[:, 0:1]], dim=-1) + #abs_quat_ros = default_quat + # Construct a 7-DOF absolute pose [x, y, z, qx, qy, qz, qw] + abs_pose_bridge = torch.cat([abs_pos, abs_quat_ros], dim=-1) + + print(f"absolute pose action: {abs_pose_bridge}") + # ROS 2 Synchronization via Bridge + if bridge is not None: + + print(f"Trying to publish...") + # Send absolute pose to bridge + bridge.publish_command(abs_pose_bridge[0]) + + # Handle gripper toggling + curr_gripper = float(actions[0, -1]) + if prev_gripper_action is not None: + if curr_gripper != prev_gripper_action: + if curr_gripper > 0: + bridge.open_gripper() + else: + bridge.close_gripper() + prev_gripper_action = curr_gripper + # Slow down the loop to ~1Hz + time.sleep(10.0) + + # Record trajectory + traj["actions"].append(actions.tolist()) + traj["next_obs"].append(obs) + traj['uncertainties'].append(uncertainty) + traj['max_actions'].append(metrics['max']) + traj['min_actions'].append(metrics['min']) + traj['time_taken'].append(metrics['time_taken']) + traj['joint_pos'].append(obs['abs_joint_pos']) + traj['recovery'].append(recovery) + traj['diff'].append(diff) + if torch.any(obs['object_knocked']): + print("[MONITOR] object knocked over") + object_knocked = True + + # Check if rollout was successful + if bool(success_term.func(env, **success_term.params)[0]): + traj['failure'].append(" ") + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) + print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + # print(f"grasp : {grasp.item()}, appr : {appr.item()}") + return True, traj, recovery_activated_during_rollout, "" + + elif terminated or truncated: + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) + #print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + if i==horizon: + #if the failure was caused by object collision + traj['failure'].append("timeout") + failure_reason = "timeout" + else: + #if failure due to timeout, record timeout + traj['failure'].append("knocked") + failure_reason = "object_knocked" + return False, traj, recovery_activated_during_rollout, failure_reason + prev_actions = actions + + + #print("REcovery : ", traj["recovery"]) + traj['failure'].append("timeout") + grasp = torch.any(sub_obs['grasp']) + traj['grasp'].append(grasp.item()) + #appr = torch.any(sub_obs['stacked']) + appr = torch.any(sub_obs['appr_goal']) + traj['appr'].append(appr.item()) + return False, traj, recovery_activated_during_rollout, "" + + +def load_ensemble(device, ensemble_path): + """Load an ensemble of policies from checkpoint paths. + + Updated for robomimic v0.5 compatibility. + """ + with open(ensemble_path, 'r') as file: + ensemble_paths = [path.strip() for path in file.readlines()] + ensemble = [] + for path in ensemble_paths: + if not path: # Skip empty lines + continue + policy, _ = policy_from_checkpoint_v05(ckpt_path=path, device=device, verbose=True) + ensemble.append(policy) + print(f"[DEBUG] loaded {len(ensemble)} policies") + return ensemble + + +def clear_files(*paths : str): + if len(paths) < 1: + raise ValueError("At least one path is required.") + if os.path.exists(paths[0]): + #overwrite = input(f"You are about to overwrite rollout data at: {paths}\nContinue (y/n):") + overwrite = "y" + match overwrite.lower(): + case 'y' | 'Y': + for path in paths: + with open(path, 'w') as file: + pass + case _: + exit() + + +class BridgeClient: + def __init__(self, port=5005): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.addr = ('127.0.0.1', port) + self.sock.settimeout(0.5) + self._last_print_time = 0 + + def publish_command(self, actions): + """Publish 7-DOF Cartesian target: [x, y, z, qx, qy, qz, qw]""" + if hasattr(actions, 'cpu'): + act_list = actions.cpu().numpy().flatten().tolist() + else: + act_list = np.array(actions).flatten().tolist() + + if len(act_list) < 7: return + + payload = {'type': 'cartesian', 'data': act_list[:7]} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + # Throttled debug print (every 1 second) + curr_time = time.time() + if curr_time - self._last_print_time > 1.0: + print(f"DEBUG: Sent Cartesian to Bridge: {act_list}") + self._last_print_time = curr_time + + def open_gripper(self): + print("DEBUG: Sending Open Gripper to Bridge") + payload = {'type': 'gripper', 'width': 0.08} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + def close_gripper(self): + print("DEBUG: Sending Close Gripper to Bridge") + payload = {'type': 'gripper', 'width': 0.0} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + + def get_robot_state(self): + payload = {'type': 'query'} + self.sock.sendto(json.dumps(payload).encode(), self.addr) + try: + data, _ = self.sock.recvfrom(2048) + return json.loads(data.decode()) + except socket.timeout: + return None + + def init_real(self, sim_pose): + print("[INFO] Initializing real robot synchronization via bridge...") + self.publish_command(sim_pose) + target_pos = np.array(sim_pose[:3]) + + while True: + state = self.get_robot_state() + if state and state.get('real_pose'): + real_pos = np.array(state['real_pose']['pos']) + dist = np.linalg.norm(target_pos - real_pos) + print(f"[INFO] Distance to target: {dist:.4f}m") + if dist < 0.05: + print("[INFO] Real robot synchronized with simulation!") + break + else: + print("[INFO] Waiting for bridge on 127.0.0.1:5005...") + time.sleep(0.5) + + +def main(): + """Run a trained policy from robomimic with Isaac Lab environment.""" + # parse configuration + env_cfg = parse_env_cfg(args_cli.task, device=args_cli.device, num_envs=1, use_fabric=not args_cli.disable_fabric) + + # Set observations to dictionary mode for Robomimic + env_cfg.observations.policy.concatenate_terms = False + + #create a log handler + # loghelper = LoggingHelper() + + + + # Disable recorder + env_cfg.recorders = None + + # Extract success checking function + success_term = env_cfg.terminations.success + env_cfg.terminations.success = None + + # Get timeout signal + timeout = env_cfg.terminations.time_out + #env_cfg.terminations.time_out = None + + # Create environment + env = gym.make(args_cli.task, cfg=env_cfg).unwrapped + + # Set seed + torch.manual_seed(args_cli.seed) + ##### unset these two lines for deterministic randomness + # np.random.seed(args_cli.seed) + # random.seed(args_cli.seed) + + env.seed(args_cli.seed) + + # Acquire device + device = TorchUtils.get_torch_device(try_to_use_cuda=True) + + # load the stack cube ensemble + # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') + + #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') + #pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/low/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') + # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') + # pick_place_ensemble = load_ensemble(device, ensemble_path='docs/lift/Dev-IK-Rel-v1/best_models/best_model_paths.txt') + + # pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/insert_paths.txt') + pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/inser_top_paths.txt') + + # Lets set these to the 0.99 confidence + parameters = { + 'beaker_lift' :{ + 0 : { + "confidence_level": 5.373953000000001e-05, + "window_size": 10, + "max_peaks": 8 + }, + 1 : { + "confidence_level": 5.378578e-05, + "window_size": 10, + "max_peaks": 8 + }, + 2 : { + "confidence_level": 6.186318e-05, + "window_size": 10, + "max_peaks": 8 + }, + 3 : { + "confidence_level": 7.819939000000004e-05, + "window_size": 10, + "max_peaks": 8 + }, + 4 : { + "confidence_level": 0.00012073204000000005, + "window_size": 10, + "max_peaks": 8 + }, + 5 : { + "confidence_level": 8.867226000000004e-05, + "window_size": 10, + "max_peaks": 8 + }, + 6 : { + "confidence_level": 1.57e-08, + "window_size": 10, + "max_peaks": 8 + }, + + + + }, + 'vial_insert': { + 0 : { + "confidence_level": 0.00016269120400000059, + "window_size": 9, + "max_peaks": 8 + }, + 1 : { + "confidence_level": 0.000173801014, + "window_size": 9, + "max_peaks": 8 + }, + 2 : { + "confidence_level": 0.00018948240900000074, + "window_size": 9, + "max_peaks": 8 + }, + 3 : { + "confidence_level": 0.0007136359360000004, + "window_size": 9, + "max_peaks": 8 + }, + 4 : { + "confidence_level": 0.00015286798600000018, + "window_size": 9, + "max_peaks": 8 + }, + 5 : { + "confidence_level": 0.00047967177600000013, + "window_size": 9, + "max_peaks": 8 + }, + 6 : { + "confidence_level": 0.26672138987099997, + "window_size": 9, + "max_peaks": 8 + }, + + }, + 'force_backup': { + 0 : { + "confidence_level": 0.0, + "window_size": 9, + "max_peaks": 8 + }, + 1 : { + "confidence_level": 0.00, + "window_size": 9, + "max_peaks": 8 + }, + 2 : { + "confidence_level": 0.000, + "window_size": 9, + "max_peaks": 8 + }, + 3 : { + "confidence_level": 0.00, + "window_size": 9, + "max_peaks": 8 + }, + 4 : { + "confidence_level": 0.000, + "window_size": 9, + "max_peaks": 8 + }, + 5 : { + "confidence_level": 0.00, + "window_size": 9, + "max_peaks": 8 + }, + 6 : { + "confidence_level": 0.0, + "window_size": 9, + "max_peaks": 8 + }, + } + } + + + + model_arch = "BC_RNN_GMM" + task = "pick_place" # stack_cube or pick_place + model_name = f"ensemble" + number = 'no_recovery_video' + + results_path = f"docs/training_data/{task}/uncertainty_rollout_{task}/{model_name}/run_{number}" + + uncertainties_path = f"{results_path}/uncertainties{number}.txt" + actions_path = f"{results_path}/actions{number}.txt" + min_actions_path = f"{results_path}/min_actions{number}.txt" + max_actions_path = f"{results_path}/max_actions{number}.txt" + time_taken_path = f"{results_path}/time_taken{number}.txt" + recovery_activated_during_rollout_path = f"{results_path}/recovery_activated_during_rollout.txt" + rollout_uncert_path = f"{uncertainties_path}/rollout_uncerts" + rollout_log_path = f"{uncertainties_path[:len(uncertainties_path)-4]}_rollout_log.txt" + + rollout_log_path = f"{uncertainties_path[:len(uncertainties_path)-4]}_rollout_log.txt" # remove the '.txt' and add rollout_log.txt + + uncertainty_results_path = f"{results_path}/uncertainty_plots" + trajectory_results_path = f"{results_path}/trajectory_plots" + os.makedirs(uncertainty_results_path, exist_ok=True) + os.makedirs(trajectory_results_path, exist_ok=True) + + + # clear files + clear_files( + uncertainties_path, actions_path, + min_actions_path, max_actions_path, + time_taken_path, recovery_activated_during_rollout_path + ) + + # Run policy + results = [] + failed_no_intervention =[] + intervention = [] + intervention_success = [] + knocked=0 + intervention_failure = [] + for trial in range(args_cli.num_rollouts): + print(f"[INFO] Starting trial {trial}") + + terminated, traj, recovery_activated_during_rollout, failure = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['force_backup'], use_recovery=args_cli.use_recovery, rollout_num=trial) + # save the uncertainties + print("Finished rollout, recovery needed : ", recovery_activated_during_rollout) + #print("actions shape : ", traj['actions']) + + if not terminated: + print(f"failure : {traj['failure']}") + for j in range(7): + with open(f"docs/rollouts/rollout_logging_no_recovery_joint{j}.txt", "a") as file: + #file.write(f"Logs for joint {j}\n") + for i, var in enumerate(traj['actions']): + # get all the info per joint + act = str(traj['actions'][i][0][j]) + max = str(traj['max_actions'][i].values.tolist()[j]) + min = str(traj['min_actions'][i].values.tolist()[j]) + uncert = str(traj['uncertainties'][i].tolist()[j]) + #print("joint pos : ", str(traj['joint_pos'][i][0].tolist()[j])) + joint_pos = str(traj['joint_pos'][i][0].tolist()[j]) + recovery = "False"#str(traj['recovery'][0][i]) + # print("writing recovery : ", recovery) + line = f"{i} : {act} : {max} : {min} : {uncert} : {joint_pos}: {recovery}: {terminated}\n" + file.write(line) + # this logs the outcome of the rollout - the failure methods + for j in range(7): + joint_uncert = [t[j].item() for t in traj['uncertainties']] + with open(f"docs/rollouts/rollout_uncerts_joint{j}.txt", "a") as f: + line = ",".join(["{:.10f}".format(v) for v in joint_uncert]) + f.write(line + f" : {terminated} \n") + # for i in range(len(traj['failure'])): + with open(f"docs/rollouts/rollout_outcomes.txt", "a") as file: + if terminated: + # print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") + #trialnum : outcome : recovery needed ? : failure mode : grasp subtask : appr subtask + line=f"{trial}: {terminated} : {recovery_activated_during_rollout} : : {True} : {True} \n" + else : + grasp = traj['grasp'][0] + appr = traj['appr'][0] + print(f"Subatask : {grasp} , {appr}") + line=f"{trial} : {terminated} : {recovery_activated_during_rollout} : {traj['failure'][0]} : {grasp} : {appr}\n" + # print(f"grasp : {traj['grasp'][0]}, appr : {traj['appr'][0]}") + file.write(line) + + + results.append(terminated) + if not terminated: + if recovery_activated_during_rollout <=0: + failed_no_intervention.append(1) + + if recovery_activated_during_rollout > 0: + intervention.append(1) + if terminated: + intervention_success.append(1) + else: + intervention_failure.append(1) + else: + intervention.append(0) + if "knocked" in traj['failure'] or (len(traj['failure']) > 0 and traj['failure'][-1] == "knocked"): + knocked+=1 + + print(f'Current success rate: {results.count(True)/len(results):.2%}') + print(f'Current intervention rate: {sum(intervention)/len(intervention):.2%} ({sum(intervention)}/{len(intervention)})') + print(f"[INFO] Trial {trial}: {'SUCCESS' if terminated else 'FAILED'}\n") + #loghelper.stopEpoch(trial) + + # Prepare summary text + exp_name = args_cli.exp_name if args_cli.exp_name else "unnamed" + summary_text = f"\nSummary for experiment {exp_name}\n" + summary_text += f"\nSuccessful trials: {results.count(True)}, out of {len(results)} trials\n" + summary_text += f"Success rate: {results.count(True) / len(results)}\n" + summary_text += f'Failed runs with no intervention : {sum(failed_no_intervention)}\n' + summary_text += f"Intervention rate : {sum(intervention)/len(intervention)}. Of which success : {sum(intervention_success)}, of which failed {sum(intervention_failure)}\n" + summary_text += f"Intervention Results: {intervention}\n" + summary_text += f"Number of times object knocked over : {knocked}\n" + summary_text += f"Trial Results: {results}\n\n" + summary_text += f"Environment random seed: {args_cli.seed}\n" + + # Print to console + print(summary_text) + + # Write to file + results_file = "docs/ensemble_run_results.txt" + with open(results_file, 'a') as f: + f.write(summary_text) + f.write("\n" + "="*80 + "\n\n") + print(f"Results appended to: {results_file}") + + if franka_gripper is not None: + franka_gripper.destroy_node() + if franka_arm is not None: + franka_arm.destroy_node() + if rclpy.ok(): + rclpy.shutdown() + env.close() + + + +if __name__ == "__main__": + # run the main function + main() + # close sim app + simulation_app.close() diff --git a/scripts/imitation_learning/robomimic/play_ensemble_v05.py b/scripts/imitation_learning/robomimic/play_ensemble_v05.py index e3897f85f443..8193f526fc12 100644 --- a/scripts/imitation_learning/robomimic/play_ensemble_v05.py +++ b/scripts/imitation_learning/robomimic/play_ensemble_v05.py @@ -100,6 +100,12 @@ from isaaclab.envs.mdp.actions.binary_joint_actions import BinaryJointPositionAction from backup_controller_handler import BackupController +# --- ROS2 imports --- +# --- UDP Bridge imports --- +import socket +import json +import time +import numpy as np def policy_from_checkpoint_v05(ckpt_path, device, verbose=True): """ @@ -175,96 +181,6 @@ def policy_from_checkpoint_v05(ckpt_path, device, verbose=True): return FileUtils.policy_from_checkpoint(ckpt_path=ckpt_path, device=device, verbose=verbose) -def rollout(policy, env, success_term, horizon, device): - """Perform a single rollout of the policy in the environment. - - Args: - policy: The robomimicpolicy to play. - env: The environment to play in. - horizon: The step horizon of each rollout. - device: The device to run the policy on. - - Returns: - terminated: Whether the rollout terminated. - traj: The trajectory of the rollout. - """ - policy.start_episode() - obs_dict, _ = env.reset() - - #print(f"obs_dict type: {type(obs_dict)},\nobs_dict contents:\n {obs_dict}") - - traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[]) - - # Define the observation keys the trained model expects - TRAINED_OBS_KEYS = ['eef_pos', 'eef_quat', 'gripper_pos', 'joint_pos', 'joint_vel', - 'object_position', 'target_object_position', 'actions'] - - for i in range(horizon): - # Prepare observations - obs = copy.deepcopy(obs_dict["policy"]) - sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) - - for ob in obs: - obs[ob] = torch.squeeze(obs[ob]) - #print(f"found observation : {obs[ob]}") - - for subob in sub_obs: - sub_obs[subob] = torch.squeeze(sub_obs[subob]) - - # Check if environment image observations - if hasattr(env.cfg, "image_obs_list"): - # Process image observations for robomimic inference - for image_name in env.cfg.image_obs_list: - if image_name in obs_dict["policy"].keys(): - # Convert from chw uint8 to hwc normalized float - image = torch.squeeze(obs_dict["policy"][image_name]) - image = image.permute(2, 0, 1).clone().float() - image = image / 255.0 - image = image.clip(0.0, 1.0) - obs[image_name] = image - - traj["obs"].append(obs) - traj["sub_obs"].append(sub_obs) - - # Filter observations to only include keys the model was trained with - policy_obs = {k: obs[k] for k in TRAINED_OBS_KEYS if k in obs} - - # Add dropout layers to the model and calculate uncertainty and remove at the end to not effect final action - - #hooks = inject_dropout_layers(policy=policy, probability=0.1) - # uncertainty_dict = MC_dropout_uncertainty(policy=policy, obs=obs, niters=15) - # traj['uncertainties'].append(uncertainty_dict['variance']) - #remove_dropout_layers(hooks) - - # Compute actions - actions = policy(policy_obs) - - # Unnormalize actions - if args_cli.norm_factor_min is not None and args_cli.norm_factor_max is not None: - actions = ( - (actions + 1) * (args_cli.norm_factor_max - args_cli.norm_factor_min) - ) / 2 + args_cli.norm_factor_min - - actions = torch.from_numpy(actions).to(device=device).view(1, env.action_space.shape[1]) - - # Apply actions - obs_dict, _, terminated, truncated, _ = env.step(actions) - obs = obs_dict["policy"] - sub_obs = obs_dict["subtask_terms"] - - # Record trajectory - traj["actions"].append(actions.tolist()) - traj["next_obs"].append(obs) - - - # Check if rollout was successful - if bool(success_term.func(env, **success_term.params)[0]): - return True, traj - elif terminated or truncated: - return False, traj - - return False, traj - # tip over detection def has_fallen(asset, threshold: float = -0.7, debug: bool = True) -> bool: @@ -303,8 +219,7 @@ def has_fallen(asset, threshold: float = -0.7, debug: bool = True) -> bool: return uprightness > threshold - -def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): +def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, use_recovery=True, rollout_num=0): """Perform a single rollout of the policy in the environment. Args: @@ -319,9 +234,13 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, """ ## do setup print("running rollout number : ", rollout_num) + # Initialize UDP Bridge Client + + for policy in ensemble: policy.start_episode() obs_dict, _ = env.reset() + #print("obs_dict keys : ", obs_dict.keys()) traj = dict(actions=[], obs=[], next_obs=[], sub_obs=[], uncertainties=[], min_actions=[], max_actions=[], time_taken=[], joint_pos=[], recovery=[], failure=[], grasp=[], appr=[], diff=[]) @@ -332,6 +251,7 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, ###### SET UP RECOVERY #### use_recovery=False + recovery_activated_during_rollout = 0 print("rollout recovery enabled ? : ", use_recovery) @@ -344,21 +264,29 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, max_recovery_steps = 500 # Safety limit for recovery mode ##### CONFIG RECOVERY CONTROLLER #### - backup_controller = BackupController(env, device, tasktype="place") + backup_controller = BackupController(env, device, tasktype="lift") state_guess = 0 last_state = 0 recovery_mode = False object_knocked = False + prev_actions = None # hold previous action + prev_gripper_action = None # Define the observation keys the trained model expects # These must match the keys used during training (from shape_metadata) TRAINED_OBS_KEYS = ['eef_pos', 'eef_quat', 'gripper_pos', 'joint_pos', 'joint_vel', 'object_position', 'target_object_position', 'actions'] print(f'Running for horizon {horizon}') + summary_text = f"\nSetting for {rollout_num} \n" + summary_text += f"Stirplate : {env.unwrapped.scene['stirplate'].data.root_pose_w} \ngoal : {env.unwrapped.command_manager.get_command('object_pose')}" + # Write to file + + + for i in range(horizon): # Prepare observations - + #print("obs_dict keys : ", obs_dict.keys()) obs = copy.deepcopy(obs_dict["policy"]) sub_obs = copy.deepcopy(obs_dict["subtask_terms"]) @@ -381,7 +309,9 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, image = image / 255.0 image = image.clip(0.0, 1.0) obs[image_name] = image - + # eef_pos is (num_envs, 3), eef_quat is (num_envs, 4) + + # Filter observations to only include keys the model was trained with # This prevents dimension mismatch errors when env has extra observations policy_obs = {k: obs[k] for k in TRAINED_OBS_KEYS if k in obs} @@ -458,14 +388,17 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, ) / 2 + args_cli.norm_factor_min actions = actions.to(device=device).view(1, env.action_space.shape[1]) - + # Apply actions obs_dict, _, terminated, truncated, _ = env.step(actions) recovery.append(recovery_mode) # update obs from taking action obs = obs_dict["policy"] sub_obs = obs_dict["subtask_terms"] + + # Compute absolute pose for the ROS bridge + # Record trajectory traj["actions"].append(actions.tolist()) traj["next_obs"].append(obs) @@ -490,6 +423,13 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, traj['appr'].append(appr.item()) print(f"grasp : {traj['grasp']}, appr : {traj['appr']}") # print(f"grasp : {grasp.item()}, appr : {appr.item()}") + summary_text += f"\nRecovery : {recovery_activated_during_rollout}" + summary_text += f"Result : success \n \n " + setting_file = "docs/ensemble_run_setup.txt" + with open(setting_file, 'a') as f: + f.write(summary_text) + f.write("\n" + "="*80 + "\n\n") + print(f"Results appended to: {setting_file}") return True, traj, recovery_activated_during_rollout, "" elif terminated or truncated: @@ -503,12 +443,31 @@ def rollout_ensemble(ensemble, env, success_term, horizon, device, parameters, #if the failure was caused by object collision traj['failure'].append("timeout") failure_reason = "timeout" + summary_text += f"\nRecovery : {recovery_activated_during_rollout}" + summary_text += f"Result : timeout \n \n " else: #if failure due to timeout, record timeout traj['failure'].append("knocked") failure_reason = "object_knocked" + summary_text += f"\nRecovery : {recovery_activated_during_rollout}" + summary_text += f"Result : hit\n \n " + + setting_file = "docs/ensemble_run_setup.txt" + with open(setting_file, 'a') as f: + f.write(summary_text) + f.write("\n" + "="*80 + "\n\n") + print(f"Results appended to: {setting_file}") return False, traj, recovery_activated_during_rollout, failure_reason + prev_actions = actions #print("REcovery : ", traj["recovery"]) + + summary_text += f"\nRecovery : {recovery_activated_during_rollout}" + summary_text += f"Result : failed, timeout \n \n " + setting_file = "docs/ensemble_run_setup.txt" + with open(setting_file, 'a') as f: + f.write(summary_text) + f.write("\n" + "="*80 + "\n\n") + print(f"Results appended to: {setting_file}") traj['failure'].append("timeout") grasp = torch.any(sub_obs['grasp']) traj['grasp'].append(grasp.item()) @@ -549,7 +508,7 @@ def clear_files(*paths : str): case _: exit() - + def main(): """Run a trained policy from robomimic with Isaac Lab environment.""" @@ -593,12 +552,12 @@ def main(): # stack_cube_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/stack_cube_ensemble.txt') #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/ensembles.txt') - pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/low/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') + #pick_place_ensemble = load_ensemble(device, ensemble_path='docs/place/low/Dev-IK-Rel-Place-v0/best_models/best_model_paths.txt') # pick_place_ensemble_30 = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/pick_place_ensemble_30_paths.txt') - # pick_place_ensemble = load_ensemble(device, ensemble_path='docs/lift/Dev-IK-Rel-v1/best_models/best_model_paths.txt') + pick_place_ensemble = load_ensemble(device, ensemble_path='docs/lift/Dev-IK-Rel-v1/best_models/best_model_paths.txt') # pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/insert_paths.txt') - #pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/inser_top_paths.txt') + # pick_place_ensemble = load_ensemble(device, ensemble_path='scripts/imitation_learning/robomimic/inser_top_paths.txt') # Lets set these to the 0.99 confidence parameters = { @@ -678,8 +637,6 @@ def main(): "window_size": 9, "max_peaks": 8 }, - - } } @@ -726,7 +683,7 @@ def main(): for trial in range(args_cli.num_rollouts): print(f"[INFO] Starting trial {trial}") - terminated, traj, recovery_activated_during_rollout, failure = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['beaker_lift'], use_recovery=args_cli.use_recovery, rollout_num=trial) + terminated, traj, recovery_activated_during_rollout, failure = rollout_ensemble(pick_place_ensemble[:args_cli.ensemble_size], env, success_term, args_cli.horizon, device, parameters['vial_insert'], use_recovery=args_cli.use_recovery, rollout_num=trial) # save the uncertainties print("Finished rollout, recovery needed : ", recovery_activated_during_rollout) #print("actions shape : ", traj['actions']) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py index c3fea274b1a4..3ec3160a7915 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_env_obs.py @@ -30,9 +30,11 @@ def __post_init__(self): # put the beaker on the stir plate glassware = ChemistryGlassware() self.scene.stirplate = glassware.stirplate(pos=[0.5, 0.0, 0.01]) + self.scene.goal_plate_pos = glassware.scale(pos=[0.4, -0.3, 0.01]) self.events.reset_object_position = EventTerm( func=mdp.reset_multiple_root_state_uniform, mode="reset", + #[0.54, -0.3, 0.0] params={ "pose_range": {"x": (0, 0.2), "y": (0, 0.25), "z": (0.02, 0.02)}, "velocity_range": {}, diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert_top_down.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert_top_down.py index 6b1ba76ef207..a58caa636834 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert_top_down.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/config/franka/dev_ik_rel_vial_insert_top_down.py @@ -106,7 +106,7 @@ def __post_init__(self): ) self.terminations.success= DoneTerm(func=mdp.object_inserted_upright, params={"lower_object_cfg": SceneEntityCfg("vialrack"), "upright_good_deg": 22.5}) - + self.terminations.object_tipped = DoneTerm(func=mdp.object_knocked, params={"max_tilt": 65}) #self.terminations.success=DoneTerm(func=mdp.object_stacked_upright, params={"lower_object_cfg": SceneEntityCfg("scale")}) self.observations.subtask_terms.appr_goal=ObsTerm(func=mdp.is_object_lifted, params={"threshold":0.15} diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index 13295c35c41b..5bb1883807ee 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -98,7 +98,7 @@ class CommandsCfg: debug_vis=True, ranges=mdp.UniformPoseCommandCfg.Ranges( # pos_x=(0.3,0.3), pos_y=(-0.28, -0.28), pos_z=(0.1, 0.1), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0) - pos_x=(0.4,0.4), pos_y=(-0.3, -0.3), pos_z=(0.08, 0.08), roll=(math.pi/2, math.pi/2), pitch=(math.pi/2,math.pi/2), yaw=(0.0, 0.0) + pos_x=(0.4,0.4), pos_y=(-0.3, -0.3), pos_z=(0.11, 0.11), roll=(math.pi/2, math.pi/2), pitch=(math.pi/2,math.pi/2), yaw=(0.0, 0.0) ), ) @@ -356,8 +356,8 @@ def __post_init__(self): # simulation settings self.sim.dt = 0.01 # 100Hz self.sim.render_interval = self.decimation - self.viewer.eye = (1.0, 1.0, 1.0) - self.viewer.lookat = (0.0, 0.0, -0.1) + self.viewer.eye = (2.5, 0.5, 0.5) + self.viewer.lookat = (0.0, 0.0, 0.0) # self.terminations.set_loghelper(self.loghelper) #self.events.set_loghelper(self.loghelper) # self.observations.policy.set_loghelper(self.loghelper) From 526d0e761e2ec597139b73403032d0ce5e518f6a Mon Sep 17 00:00:00 2001 From: LJones-alt Date: Tue, 17 Mar 2026 16:43:05 +0000 Subject: [PATCH 15/15] case ready --- ...itching_for_Robust_Robotic_Chemistry-1.pdf | Bin 0 -> 1267794 bytes .../teleoperation/teleop_se3_agent.py | 80 +++++++++--------- .../manipulation/cube_lift/lift_env_cfg.py | 6 +- 3 files changed, 43 insertions(+), 43 deletions(-) create mode 100644 docs/_CASE2026__SAFE_CHEM__Uncertainty_Aware_Policy_Switching_for_Robust_Robotic_Chemistry-1.pdf diff --git a/docs/_CASE2026__SAFE_CHEM__Uncertainty_Aware_Policy_Switching_for_Robust_Robotic_Chemistry-1.pdf b/docs/_CASE2026__SAFE_CHEM__Uncertainty_Aware_Policy_Switching_for_Robust_Robotic_Chemistry-1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..31b1f7a610e83b1afc91dfb55b3bd99f2663128e GIT binary patch literal 1267794 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 z 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%0D2iAjSHeI$N&m7 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�=UPU4 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�FqwEj*`c$Dbp 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

    j)q%}1EU--foueGi;c6O49tc5m}Xu?!^{ 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≈{jcm5)BEf!K$5 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 Bc$C}{1th=abdy_LX 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 None: teleop_interface.reset() prev_gripper_action = None - # Sync real robot with simulation initial pose - if bridge is not None: - # Get simulated robot initial EE pose - try: - # We use the observation manager to get the tracked end-effector pose - # Based on your environment info, these keys are available in the 'policy' group - obs_dict = env.observation_manager.compute_group("policy") + # # Sync real robot with simulation initial pose + # if bridge is not None: + # # Get simulated robot initial EE pose + # try: + # # We use the observation manager to get the tracked end-effector pose + # # Based on your environment info, these keys are available in the 'policy' group + # obs_dict = env.observation_manager.compute_group("policy") - # eef_pos is (num_envs, 3), eef_quat is (num_envs, 4) - eef_pos = obs_dict["eef_pos"][0].cpu().numpy() - eef_quat = obs_dict["eef_quat"][0].cpu().numpy() # [qw, qx, qy, qz] + # # eef_pos is (num_envs, 3), eef_quat is (num_envs, 4) + # eef_pos = obs_dict["eef_pos"][0].cpu().numpy() + # eef_quat = obs_dict["eef_quat"][0].cpu().numpy() # [qw, qx, qy, qz] - # ROS expects [qx, qy, qz, qw], Isaac uses [qw, qx, qy, qz] - sim_init_pose = [ - float(eef_pos[0]), float(eef_pos[1]), float(eef_pos[2]), - float(eef_quat[1]), float(eef_quat[2]), float(eef_quat[3]), float(eef_quat[0]) - ] - sim_pose = [0.5208, 0.0096, 0.3751, 0.0360, 0.7414, -0.0706, 0.6663] - print(f"Simulated robot initial pose: {sim_init_pose}") - # bridge.init_real(sim_init_pose) - except Exception as e: - print(f"[WARN] Could not retrieve sim initial pose from observations: {e}") - print("[INFO] Skipping real robot synchronization.") + # # ROS expects [qx, qy, qz, qw], Isaac uses [qw, qx, qy, qz] + # sim_init_pose = [ + # float(eef_pos[0]), float(eef_pos[1]), float(eef_pos[2]), + # float(eef_quat[1]), float(eef_quat[2]), float(eef_quat[3]), float(eef_quat[0]) + # ] + # sim_pose = [0.5208, 0.0096, 0.3751, 0.0360, 0.7414, -0.0706, 0.6663] + # print(f"Simulated robot initial pose: {sim_init_pose}") + # # bridge.init_real(sim_init_pose) + # except Exception as e: + # print(f"[WARN] Could not retrieve sim initial pose from observations: {e}") + # print("[INFO] Skipping real robot synchronization.") print("Teleoperation started. Press 'R' to reset the environment.") @@ -351,7 +351,7 @@ def stop_teleoperation() -> None: actions = action.repeat(env.num_envs, 1).to(env.device) # Compute absolute pose for the ROS bridge - with torch.no_grad(): + """ with torch.no_grad(): # Get latest observations from the 'policy' group obs_dict = env.observation_manager.compute_group("policy") eef_pos = obs_dict["eef_pos"] # (num_envs, 3) @@ -369,25 +369,25 @@ def stop_teleoperation() -> None: abs_pose_bridge = torch.cat([abs_pos, abs_quat_ros], dim=-1) print(f"absolute pose: {eef_pos}, {eef_quat}") print(f"absolute pose action: {abs_pose_bridge}") - # ROS 2 Synchronization via Bridge - if bridge is not None: - # Send absolute pose to bridge - bridge.publish_command(abs_pose_bridge[0]) + # # ROS 2 Synchronization via Bridge """ + # if bridge is not None: + # # Send absolute pose to bridge + # bridge.publish_command(abs_pose_bridge[0]) - # Send joint positions for MoveIt 2 - obs_dict_full = env.observation_manager.compute_group("policy") - if "joint_pos" in obs_dict_full: - bridge.publish_joints(obs_dict_full["joint_pos"][0]) - - # Handle gripper toggling - curr_gripper = float(actions[0, -1]) - if prev_gripper_action is not None: - if curr_gripper != prev_gripper_action: - if curr_gripper > 0: - bridge.open_gripper() - else: - bridge.close_gripper() - prev_gripper_action = curr_gripper + # # Send joint positions for MoveIt 2 + # obs_dict_full = env.observation_manager.compute_group("policy") + # if "joint_pos" in obs_dict_full: + # bridge.publish_joints(obs_dict_full["joint_pos"][0]) + + # # Handle gripper toggling + # curr_gripper = float(actions[0, -1]) + # if prev_gripper_action is not None: + # if curr_gripper != prev_gripper_action: + # if curr_gripper > 0: + # bridge.open_gripper() + # else: + # bridge.close_gripper() + # prev_gripper_action = curr_gripper # apply actions (relative as intended by the environment) env.step(actions) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py index 5bb1883807ee..afdc2d1174fa 100755 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cube_lift/lift_env_cfg.py @@ -294,7 +294,7 @@ class TerminationsCfg: time_out = DoneTerm(func=mdp.time_out, time_out=True) - #joint_violation = DoneTerm(func=mdp.joint_pos_out_of_limit) + joint_violation = DoneTerm(func=mdp.joint_pos_out_of_limit) #object_orientation = DoneTerm(func=mdp.bad_orientation) @@ -356,8 +356,8 @@ def __post_init__(self): # simulation settings self.sim.dt = 0.01 # 100Hz self.sim.render_interval = self.decimation - self.viewer.eye = (2.5, 0.5, 0.5) - self.viewer.lookat = (0.0, 0.0, 0.0) + self.viewer.eye = (2.5, 0.5, 0.9) + self.viewer.lookat = (0.0, 0.0, 0.2) # self.terminations.set_loghelper(self.loghelper) #self.events.set_loghelper(self.loghelper) # self.observations.policy.set_loghelper(self.loghelper)

    5DMI&a{i%i9(x<7 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

KpkKQQyd;M13QlD(V~gG*REkqeXoqj +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 +j#h9(_a&EN?*c +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 +TQ23j}ZS{8(=U3BZDMW(@{Gs)=q;J! +bC6NcNpMi`?IO>BCH^@n)lmwHorGM}k}rCG@*o4=+(B*TZJYnCcIldjw|ri>~iugploSPH#d4ew_Dbl ++m*iLUN_a&@fn^L6))alZ_TDD?ih@hK0o#@>tLu@~B&s6)Z8Pvhx^DDYA$9CM+VBkY}m(8Iz{d?+2L2 +Vrl|p&!OQKG+Zkz(D(kF*u_#M{qP{=4PMBQ~n#_~rxLAB_ib-<-<7nLlpjC<*8KebKInzf16+K73m}x +Lnif@!xLR|0_r9FXrU()?Xa?@3s5C`}n`TT_}$Kk2e!Z_H|x$Zhe +-Gc=TOCkRLmruT|X+{6?n;dnBd;eklFvPbZ{^2e4Te^`8TN<{^Yc;;^!I#*#nI7;tdH+cbS#WaU$y=x +AmmjS?U3ZO;VGr_@4cKqDz4yNcAHw4@>h-<%{|txV=O$iXZ{qdXPB-?M=Fx`y@9}@<0lnZqymNlngMly2LY1+H5~|f0uEJ52Eu@UN63`rxAH<0NwlUyhJn{%K&TXx*zCp8Ud4f) +4j~nR1JVLRR*`vzJ#=s3~rJAX!<%*3V4B>RTcH8TrV~Cr)!FnrPu*f&GAug9!;% +8C05~;3wd<&?Stc;lt^kQUydkf?^%fjNm*JFp-76Hz3D`)>F^=xFQ7;uE(m9 +HkR7UsGFgglVM;gND-feZnH=K~`5WhN{+t+}ofg8mFs9zmmXQ^IFoJjY6(@WJ8xn2H~sQ>DSc@o`o!J +w)GY=HPllOaDTS*n}@{k3$-tuTs^Y6vfzM)%%KQx!yWdl~>^dqKX_X}v(b#Xu7QPS=?H2>L>1(!E6MN +CjYTsX^5gM}Om9FO|d-QV8*q66jt#dZ{9T?!lKVCDQdERNpLW=UFLnHrz7LP(!Fu@Qu#8v=V* +$m;6a*CnyR7z>Qi-5rGA*^pDa~8O!x3SFBLpO$ZzyKdJOyw`gM=fy>e4kO^?&`2318N$HJ9RpWxr>RU +G}FAY>^m{}XgC-#RJwNm?K0CEXfY@6f&gOR0P<-8=NWlu^XnVF_RzgqJ_X&MTGg(}Xku&wHBgNm)lK0 +mI;YR6j#Vpa#wdy73)g9$c5a;5?%n>D~wS7d}tV-;1i+7wBFXdMWZnLY|ZARdt)`UZC|-MG0-^$&&6R +TF>BLz;U3bZVMsNfPq{2d0l{5x0SY|WGU|zx|d$Eq<)p^HK_7lrTNuMwSXm%&i^$+@&I+EaK2LhIwA7 +`3ty*usGXBaxAAt;u#N8VSjRSwtpIt+4!Y(dNvhsK_3I_`PF~(>z|g?uvh@OIq*7z +sRbFL1YuZk6SPTxxUC&A)=5H+dCwof*^{VkKZK#IM^=+fRzB>|;W%!1-Hp5b{@Da;x~1z8cTyR#FLmf +_SxupuM?YaxeUnkQ*euP2pi)uIg&=C&=ldhDp@kBeWfzmwan@zUCTQZ}pPzQGOnk0``M`sroD0FF?J1 +P5U#wRQxq)64M=uot4u*LCX9@9u{!eob`~y7W0zJ>ps{+5H^_3(g0xpH{GQd +-SAs6BL23P?2K49ZTx~FiRs=R^5hkm?)o=-`t+Dp7#k>A7h7UG5e0MGn1{tvW2JTKK==Ito(M}9p>`j +PJC2G_rzc)lTsNq~0gysGYJ=*OuYS9rUjljjs;0T;O$-79{h{l^7W@$YcGhwE~66YYo6+zS7M`jyh%O +8!Xgo&mOKj=T(h>>u5hNN#p}4hfXDtL>k{+A}hg9jUEz71zzMS5i?+= +mqZ=`O!SdRG39qiq!O^Py+rl^Hu*{s5}eoPrSg +6>9bD)7OQZne7Y>AQ(C0r$V%Oo4!4la7;l9BV>wgLXUxM}*I7EVeppIk!?uT|AI8=i61=ru9R4-h204 +pF}NC@1*^n>;oBC&oWWSB(iA)Ky7q1SK!krMRNX{u^K9mFdfMfKN7fukj|6?oGa(9@4z-{F)1Od1b<0 +j$$XB#Fu=NTd)jFhU~g{&3$lQ6kZR4U;7@4lpT7A}63f3!Mt}<$kG6T@1BTuhPw+ewhZ)KVSO?e$SiDGrej!; +EX_1IKy&tqoaGkyA)@0}P>c3cG?LT8N)d%_JO3+^>NoK&Ev>(lf_5tY{mPqWrB;x_aEV&}E*3JLlLxXwHxkxQVr@ezq#XNw<|$VjT^F|gnLJC*-xiQONCJRy+;2&Zd3?g38MDVM-~5? +zB_1xVKoYv8_yuA6KN_ZL-&bp2`>AYB)<39f&1eI^Z0MP7)w1F;(Ajfixe9t|IfNY`r7@I1s~M7nN?+ +C$gtgn&QkniJcAe>(c@&i0WEfm=NKvwFDID4>HdMTFgs(>+}aT;qGPG1v;WvYovHpn#@t1f=^_sNqzh +>xngh^Z_#zkgm^;m6UoU_6xa;7Q*Sizy&RY(|n6t2&YHcEd!!FprV!V>Q=(*S_yA#CH&S&1|II)O1P$ +#@Q@b5>3ei_D*k(c1}Aywqi{|;*^~5`ij+Eyz^K>4Iq2cw=JhJ}%p(r}cY*slc*W5k%hd)Dpoy)Tz{5s{J +|2oL&0dXGU`Z>?~gT=3^I{YaQ_=D*`L-Xex@^5ZleYlF624U2`>xZwM0roqUGy7LuUsZLz>UXMx@|$t +S21|LuOw1-bXGi~R-*w+89o +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 +z#H}eyroRw!P6mG&~kcD^r+;8R3*OJwnic2A?! +im17Kjt9kv0&p-@A9)WJPTFGX!5%MD0)iPuBB&Zh0rrh!&6MdGNxfM(}3olWBlbn^Zp0;vn~kzXT4qlTAq69DYDz`f}YmUA!z|@-M&|7_l +n_E$uw+Z8iYMF4e&|Qo^|Y#Udjxn7c#W;52hiXX?U7x_$%wt(&TV~D11_gD#v)`Wb^(X_)GmCHEL8}- +~jyc^70yKaHpdsT7LcYB7M2*MS5#>80}mhMB7~Uyh&xxCKnCsTr~Wh^(g=G5L%V$qybIj7#yD`a9{t8 +h`;YCzi+og<{W?5Oqw()Iz2u8UEm6Pgbn26PjBMmLl(UMHi;FC7zw8Ea5hGzWC<=XAwQ$az&F7}<|>+4Gi2?=C2n+b +6_D=UlU&YerESFaX!{rTsg3%`S0s5x4IH(~>P6>=fuqgW51!JhY8=F!Dpc)ekq-)PS=$5`vK=K{8cE8 +)L=`}R(p>-<^bKVZOsVKZjTNS{7^`bqYqLJkIlfhJCzNK>Xvp}+m@Z}j~0&(m|yJty$N`X2a#2E+oy2 +}uXmFrWec6ncnQh&lE=6Hfb!fd6@V*EIi9jxpbvW5Ax_lU~e@0s2>5e~lhJdR0tJ%u?tN>-rjA_YZyb +)mQCo!^Gz(J3E`$CJ5i}z4u;`BfRz2TS6azJ8*@Jq+UsRfIjFR);Y-QAPd+7Y+Bee%Rz0=#cuZe{?-l +11J|`ic}9#F@!Zuy6TwEOW>eY+-_3KBRTMJx(2W&&#L4)k>w4g($Fnl)=^*|KHl9(w2@nl)>d;5)A?g)V^x*a +heWZlJ@R7VJSF4nyw|qhTx9kH9(-zadA0>_AI1jmiJ{3-IV__kRG)wyVp?$T;%klTZEzJRf-A0nuU8l +7{~M`_qC23xpgHGvwZmqyzW@f4S$2wE>Q>2iOSg!QI{wv(;-4te=&u+<${@LH}8o^h=j6{Rnm%9UV=J +7A+ET01d!DG&GdrlXrlrhE +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 +5Hs`2B*)mf@>2Pp$Z4;05C;L7=Vo)f3>W$s$ +Kz!-qhZ*DN4oK6J_|j{;`2#O}grB6?qH9I|djPJtaEZ^X +Or;SX?N*g$Tkgp~!DLr*Ya@O29^=v$pMl*VD=DaNNl1JBQK35oRu#bRa$gJdP^DGcPq{8s088#&<^2tgK{TO~ +9o|0xmzx=zu0TjSgre4r~jMeB&?f&htO*|8LWA1mi%_VDL0*jDE&IV~|m6j5j74Q;Y@1LZi-DZmcv`8 +*7dAM#bc1(wG8GT2rhk(Uf7zH5Hh2rgBrIsoGR)sy8WSFSEuRXx5rz&57m=bFR6-tTUIJE6vsBT64Ww +v3OZDmOzWv5^G7cWLR=71s0v9+)`<&w$xhcElQDBk)|lHNLv(JlvtEelv`9#q$?^fsw}E5sx7K7;(%$ +@SOcwEYpgZVnqkeg7Fc!Ga%-iv+FEO^w<^V6#hT*4Vr_A3abj^sac*%zv97qhxU#sqxVE^ySSj%;(Ub +(1XiH*C5=$~la!U$IbR~*-VC-~0II*cz&9 +nOPyg@v3B+nhsv#0R<*^EIR<4{KZ7H@4TedCNmS-!l71}Dws>*80>dG3*@DSZ9)+0}yx6V%&q>I$W>r!; +tx;$N>&Z?`>Rq1MUb-D(fr`}udrw`Ic>f`k(`fPokzEE$~SLmzsHTpVzgWl8NZSXS$86pkwh7?1#A0lw!&@<(UdiR#Szk%2 +Z>jGc}kz&E94|bC5aG9B)oBXPfiPg=VX{!dzvpG1r+J%$^o+i=QRP5^0IIq*$^od6q(pm35+u^#R)8$ +(rC-6y(x_Y}SFoB5P4aQB_e*QC(3(ktfU6kL4Q4GEHH5=2;6lWv{SSS!-Cb4OUNJ+jA4?>XrIEst$YUv3Z56gETaB&G)?o9rd)xi +&LH0;{ygkL9ZO^k8+O75qdzHP$UT1Hxdpf)wevTkVq$A#u;>dR7ISL(CM}?!xQRAp{DB_{VqNvfVt(3 +E-RI`@Uvxa!Fb_B9!#IjaoutpTvbhdI^rLEdlYpb^@b}zfe9%$FvW9^Cd412D$-r))DJSbYwVk9R&`Zquf#HsCLvk>K#g{SE;5nuvA+bTbfv!QJPy?P^v2}FRd)CF0C!CFICFC$ +~0wxW!kdXvc$5CvfQ$QGF@4DS!G#uS#4Q;86MK?g#=jVrPJsFby{7lE>V}E%heU|lD%A4sjJr2>gsih +-b=612kN!@Sbd^CL!YZJ(ChT&`bvGZzE)qaR}5YTjUmvWHN+Yc4H<@9LxDkOC^u9ZstvVBG!M}b!` +6yP)h>@6aWAK2ms3fSzG?_qApIw0001v0RS5S003}la4%nWWo~3|axY|Qb98KJVlQ_#G%jU$W#qkid= +yo-0NkDKPC6UaEDd1^L}?I-Xqbp5HfRdErCK_I0-8|}G#YV0WkNOJ2%1=lljhnZjylhoaW-dj)Ok9Nk +1QxA1hTM(uoyrg3Su<{61FTrQr|h}R(HbUy!UtZA +{a+jW^&3^y&-6+B_UkIl{_WSzS@hJhw55g5K3Vwa(`osSKJ(18a@u20q!k99Nqg#q%YUBh`nV_Z_hk9_p7ZcL_4v@9z4T1!`8hpr>gk4Ocky*SXDRQ$dwxmrBaHmxjOQ)%y#J +~EMOfdJeV*ktnI3;R))b%o{bRl3xZac)lVCEnK;UB@mvlG$IQUeUO~!kS$z;PHQ}2@^Ve;PDWrnw$;z +*&$EkB%mv;4$L8J?A27#+f~T +QAR(W-=|jx$yBv(-W(&=6Wr&pyli8HnSnqL-s{qg`2( +EIa=}ncm(7N+>$iJ<2+kYI3mBzC7`rffv|Ch1cm``K*$t7%J)#1okewKU1SbluT7>jh6#`5FbzGGQ`$ +Qa8nFa4j!viJ~(I1+6N!ZZjV~uL@FdRq&G%2St+mVTw +Z-?kM`vlK^pI+ljhs>VrOInk}WLK8NY9%($l_4pc(iZe-Cq=?;%oXQ|bHxY52PJj_+RgE^Fm(OYMeMq +B=~SpXl$+(vJn9cVk)>t;-VoWg(rQTC16hPOYSfiIx-K!u6Y{uXGMiP?1e~1QEVbOlU;O!PVrau9$X2 +S0f^^B7Svu>$d&dN*$#%cb`~4^-bklZl4Gylpfcnbj8W2`Rl3+B})g+w`+K9}Q9+HIgP08rpk-8p2j? +hE_zO+-oXu+YUf#qrTD~-{!eyb +sUz4S4*Qe!(Pc)@CYBPa$=m)6(c7oUDo9jm9E$oH%Tn{Z+GGV8|5^iYEmP-Cqv&qhNoD$7HX}Er=9(e +1HfKUE6S#ESXa($Kunmyo7o6+lG&Wus5{+X;gJ2Vg^@_WD;UL+eNdsYMc18a7*-y4<&4+8L&w!33wqJMt^Z? +GOJX-0D3E0|eErFqYbZo1KRkJ2UFb_-mm@WHzhn!Tilyj8w-z|trp|+E`f(MG8fCuFJ9!N!dZs|#Rgiq<#<-veKbmx1JH`-VLt1L +Z=87@(VZMrkaGw?R&wBSx^mq$oS4`cvLs5=+&47};g7QU%+B(}sQAt{h|OlLM_B$G_ay9!B +#8B}t?Uaw03;v^{}%+*iP?}bU<=Lc)MBXGPoP@$x4fo`JItoy?=UKXeY1~t*+D6xx3niaQ6PJv(CtP1RpB$zp=rpu!KaU6EP)-Eaab|_G|7pW+tic*`h%&_)U{oJNXn;Azi8G5BR +OtC;^w*@&Z2WP`SZ{7C9z!~D0(RiN9Wl~xc%uYocn4*?|<4uQ4eLAiT2I +Xoqyj$_2lt-oKO$YDTu!d;v@7I37vx&xd&n2JisyQaVT}qIjpWrcQ)=rRB}|@U^j7I7U0|?l+Umi0Od ++AP`a*{$B1m7`Y$J~=};)!56gyT*mdVC`yyom+mP{1^jQu`tRuYBL|r=%;;C4XL>2E;SyF`i=st^e`B +^>khV#zh6s|}S%KKrH{jo6*G)9~+RBYj8`k%vnU9V2S>`GmXkv$2sJ9*z!i5)8NWRI1H3gw9y-#v)p6 +JQBrAYpXiJ0syJCCK&yPjECQB8%tmi12lX&JwbK)?mjWuBbe#>jlbP*9UGaP~6w^OyRS{+G3Y}gUOMa +l=>L#9^??t;phcp^r1v*GOa*)apd*#(B6t1kPRBaitdAopocgvn)4~Vn?td3O@J7oyg?nuBa^T-q1;j +c1N;^?>}6=Qj$=}eMCUE2jncuT01PWrdinX#yIEa?NBAb8ah;UyVfB;`0vYiOwjdDGyn57gO`#+XgB)R{1AfC7OZKiik7wVpw^Qm}G~^ +&kV`Zdo>@C_7mein0^r1WB)v+zo}_YZllCP`(r~qIQNBL#;op>p5k&BNCjIe$mfrVI-B|Zp2(WQ9`3y +Q6AKtSPbQ1b1kaT-7}+M`z3X@ji-YWLKwh?qhPVPdLqcGSG<^u79E3{D<2^qV&72OxZ)YuKW<4JYt+DZf?^0Z8eg&x?RkNH$QP2ZFop%6|m~!l)9`w@B{f`v#azf&NlWjiaEWM%M! +|XKSUJMo0KHm%$hJqVc&XQc2j7m$h=~-&`XX +d88Gjo~Ed*5-F>e10#m=(AI54b1RXEhBr*W0Du4ZCVc1l)vq$BR^--xMXy`ct%*7kp;ehOc9hv<7D~*}R +K0Bg1|ZQ>HYN^UOAiXAdkE5!O@8FaVz!YyhPxvJRWT)h=BWo}VCvDW9MF*>_*pylVjS?87|xQEQ+Cp# +f#g-VRNapYn;jR3(NGjCTp%$)cm9RSx2T_DVlYkze3D#7HLuxfXc&{1Qut>O_PfspY<{;Yf9hvvaoFP +|{>+HBY4k<=4J^s4+i6Lb!b2@5C6)6P9<>^y{sK{Jy&%O2e0EGITb3RTjIFnsNAgMG3E$m_2xO;PdkG +n(ow{>hBZ4I?!BX7OD`6dSA{roA4^mTv3wjXo!8Q(xP@ra5Op+RpBCM@p^-S`tz!X|SgzQ^Ae-cvQ +2UdkzJ6PjnH`=D5wcTl9m{urqPh>>0M+FL?Wkk8ybjn_bz%x+Y!1ArK1EA7%^|V1)d(U%*lA@I^fm+F ++j)AZ*(48UMGeT^+WrmvR=}>}Nd#gtW_xE4kkRaEc6qqOra4#{WlMeqv&F0N*;Kb3liI02fylC#*$7||9Xj5b!^#QyP{SeuvT!iW^*ipc~!_;rbL#UVbtBJ|#EHU!%AR_vB8B{oP7a5jqwO +6S#bon0mnoMu1UpKV)nBh2s$m;?D|#`s;m<4-ikPbxYZzd!xJG@(3cAjn5FsxBH;O&V~w0}7N26nBB* +Hm3QMjWIsG0sGvDecmE(63RCU<&EhL0JvBs$k*yzBxY3qbukEeB`;?`1 +yz{Gz;K+YcO>sCNiEl&q$1`7>3-)a#FrL2(3xML1szW2sEI^F6mo=r)IWWP-r-YD$9^_CgkykB#VzV_ +(M(`@TkCKNHv`{NeRsFX +R5azw6eLqN^*ImGf_0P3q{R(CdNGQ}xE}KZ;D{yn{=z$9k}~Z0-m>CH$Tn8I{~rAtFQxC2I*v;<7XS% +tk!r$sh5Y>;stlV@s9KyN7)^&}WJDCG!OehtBW)Z|x(2NtsMI*rsaKY`CtBjc&0H@Ka;8#uwiHf+?)) +hZ-y2rkC{+CvN~Le<)2EK`6&(s68IAj}CIhN-Ky}z`vQSl+B0$^WI!wd{^)Y8RQCqm5lCt{Cur@WY1p +?=M9WA6huL1sRuAzv{kwQxVmV)!)FOVe#SLgVHPk<0>yA!*XxmgN&QQ4V`xay3-9S&B#*Y$FT`$2dOK +Z`=gs}eHPb%n7YGG}TBe9UWN(jeG(b3_mlfLE_Vg61Lm3_odV&vc-t`KV@ +Ikczud8@6Ji6cPo=U9%!Vs%X>cAFN+%n|cmS&NpWel;pODN<-=TX8nF6| +kwRJAv~B(I*#{XuIk@i`{`0WUzt^R*=C8hMsUBH!!~s9|{sEAg==k`DjwtLoG;s)3^+!eh17*(JEJ#= +~{>!FgNEb!XJ>D{7XE?g-Wx0p=slM!D($iC0{kEFZQETg{)f6!=}xBpf4|&hKHBzH0m7}0c7X0u3QwN +&Pc&IuB8aC!*T&!oVlg#fg9A;kx?QLutm_`O46%D7@bGv!z6s_BC!Nks2{Ae(xCe~&iUO9%WovTx5Ll +sGMiC#I7s5^TFCh4J{db#yy;_K`h*V;cT7)7B87z}$9mXImli9Mauju?3nk!6OY$Ju$R$=GQIa3==dZ +APOWWmHLK!MxeeUl)!qoF#w!`mk6n=i3&b~pg-Gwu{NOjx~)!n$lF0wj5;O|9Jx+1VVAe03l93e(R(^$5|=;;McHz +498(`Pe?-#h#tjd$5OxB#Qwnr>o)RI@emaOy|*g)Gg%nZV=08LV)=D^g58-X-04lFT$mSJSW44iG;$0 +Cr2mz&j8r!uvA<{+KrPSi!w7MO-la?=AYHV^oPgsIEQxJ$Lhnwkh{D>U*-=kOyg3wkDVqwbivQQMqpW +p!16Fc1+GrudI{-Bf}d^7Y*uf;wtqh&3PG6`*txgh=K30_^IC#UKiiQDGC3a4Zd32==6f1)JV@H$dM$ +>7TnC2>#m&Ak9uRq5{phgz^Ig?uGyg%ian^0T +5aSoT_b)!wiXyLb+Aa#**UI4?8r63==%8Mt7!vjyyUH*d~-if>2%~ly4nf6JauuCUT+uzlTT1I}J!aK +)7aM;t1n#QwkBL0NY!)lt +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 +vdvX};eq9+ +-G*JNdcT|7EMET}&A{s);0z=~K$-HZZo&^d-*`7B-1;8+dvI-vO3xv{>NQ?4+D*1vl8ghfvfc>p=-!3S{NX{)V|MTjT*tA +Z+yG?ir)sk%5C45)jCIQN75=wrFZ*H?Z6lpGOJRjTZv()QNs6Pop+6!{=YE%BQr&|NScTL$yC!Ql=#F +g--p6kyIJFEEQZP%UeKs1|ScTi?hR5)rD)%>jW8L^ +U+)0g70Z^?CutTB@Zm6T5NowPh1Q{*!GUce*?gU)+l?$>S8a2^e* +N#g)K-|H~{w-z5*sY_6qV)SDt*FZ`bhu1F_WDfE+C49{hK{iH6}pQIo|mezOeGuWhr1T%Shu&_7u0=M +@&0FsrL?eMaFUb1(-BWmF6mfMAL3!i(X^HDiN=`2J~oE1Q$oYp9zeD65TChF%uH{+p1vdDVG#5T?Tc{ +~(VcEn(PB5UI2#X?CfQf?4G&LJi(Z&12szxbT|6ES_KP_he~3Mb0b^+x$lC7dGPpoA0Tp-PuE@QN2@8 +I%s}SDlIrBlP98*XIbOK_VJC;Wd=2MOy{YF@fdEcRk9nOUlj|q3ZiMZ7Ea~cnm5L6Ll?L +3D1#dD&c8B +c(lVRK_Gwm#=wn(flv<%$FKQ(=AWLNJooU2-@1ljbgMydx}uHf~Q0)aLQ +DH&BXbnpL|93a=4la(2W7wz39(DS?orZ>AhJTkfpzt4p|IV0eU%1RBA#?)!pWgv!_ZhT-QYN>VsCssVp!dbiT)Sm6lG +bf`-#{21{g8oP567G#6Y00sQ!5OP+jqX(hIhxIJhfk(zPjOu|X)dVXA3U`a%j(X9e@3}F^$pCzMqE +Tz7e%Gi;(QtvD(-;?cEHbQ6K95Jj4+7*QW7w0`^W=yPO{A(N}hC#%%9mVPbkOkPLR{}YM-S^>6}n_CM +2FzI{UAPtw=^HQ(WVLVOEgv+Xcew-PN_yTO#w+Sos-{dP^J~g$3e)@J|1Z1A4WC>n|}~=#!ovNgqV%Q +F}ctwl_~)G!IB1&9R6Eou`f&rnLUhEC&Fp8@eP0W1@y?|H(eO_(TiZerHzaqAL=J|9+$)>YcwLN{VSl +4NwG)afm+&&T*xnEvUm+Uz28geW+$P@~rL6%#84HBQ +|~bO{L2aOHX6!kt8NJN`tpSJn36hDZ3Rbx8V-z#b^XzQwc|1jdO#<^!?1vmWzPo}Gas*H%tQ`He8HyR +opP5umt1(#NFz>1y5YTtnX2z&$yq43EJ>rXlJFAb*DLO;tS!5hi&{GfF}iC5!G4O*nZJ7y@M#@JX_j) +oIUFj>9aYQls{lf?5E`Ct_=+<#C;D0sNpW$BPCg7+do2AGyINBERqU0-rm+w`{wX>bo?Px^Irj@b;y1^HB0GI)~B!K)mU~3z1YhFaI$HgUJu^$HV+F?}7odEZK)K`k2T5fQPeJ_z6 +VWi2a0W7iPAzUCQwou1ACy`7!*-#h*OoxJ90=9Jk6hE5~Ey!TJ_?lKS;UoJissmVX0CGY7WAt}e25+X +9d9E5zT7*}GiMa1qCW!utLm5w7Y}y3K(&V0JE%mi1&HK@817(a@_2*Yq;JHNaF+ZwWYTu4pCQj2w7Q^YanQ5nmvsGer2Ou~fn@e8Y>V +v_^}U*nZH0&Xu-p&391mRk7zDoFix9~MgE@rWTvy$pBL{Rs0=q>)L5e;I)Wa7qOlUwh@V*M5;DCw +1bU>3N$Ya0j}8H=#gEn2q!i9Ek&R*2mobJ8mZcu+5UE9zl|$%gMU)S%_DXGa!Nv#=^oyZpVG4OGC)Ee +H}u1G0v0nsKZn*q8Xm4z8G!6@U5;`hR3wJ;tqU3fyqax0E(`aNbpqmCEDx?#UYy&}eEZQ(zPb^GpfRuBZ9q+qc98OAA>iqM(eix$8&m~6)yj{C +BwAk1s(m#$y2cY(^7K|?ji31qu>>PgH?vhuLblpj_?ze&^Gy_|ZoPzJ*%iJ8WGNlGCq*qDY%+X@bm!h +*6Qw8^iae_A!J(vg57A-d +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 +*H{l4SiAp2#e9Fu1zn(Yi78<1Ozd1mu&Nx!5Y- +WS)~0+xje^feR8axNjb1m^|?OrPt&^+8ToWnI&ByH7)7#_$5);VM498+qH)B5K#ZKf9*i3t$l= +ms6J`H)#4Rqn;WtN9w_8I9bqdwQTQX-b0>}UN!dX{gIg0R81&>gM0kT}W*fq&wKt;!vEw-4<1eRz9E6 +YRY^NGDs{M|W!IoNhcpy1WQ4^UK{Px|`16W%{Y{l>Qb5wREn!{Bbj3l@YM4*hZ@Fy-cOsN +;)Rqe6xsEFCX1Hb97~*i%pVX6h5i68?9oiJk0YHNQA*{37wVT+CLBQ#ziKI`X3j+P<&qrMG>;z&3prC +Ap->VztI&NjttofJORa~a~;#aE@-=#ZCOM&qwyZfIsfQ&oRLbqy4tSNd}u{ef=w{3W{7&#)a?ZM=CFy +wAp=9QF<@se^+hh9)WRW~Jgf`t}%yTz1HH+3S0rhCc?rvds6VF6`ho)o&LBjV4{P`H^T=Rrb&CtG$sC +Y0PtI~Wa*kbaFNpNO>eCcIlaw8)xk`8GR6@Ta)93Zb9V2&UY1*62OT=a0qkeYc1?E!bM9jG76?S@s5< +r_T^JSSCuLS-itVkKIyqS*J4+`gAz%>drPY=lf?!q_MkquPW1GS?X`kpoc(D>A@FP`IN~nU0#Hb9{Ew +R-D@(-58=Ze=;vceF5UT1327y~QvNAGPphCPo!&`ov+}LsYH~79vfNbTV^$Y>{EKV62zrh(uU&UuD&b +tcLTCh7G)eX~#5WOrX&RpMpGd<=-(lpCmjlifOA`ZU?yBPSI3-S(nzDdKWq4D~vX+g{w!Qh|O%!y +A>F^WM^80 +SGg$L@XBfRll9RC}tg8@+h#2=?ME^x~Z8K8FP0KTpLE`FNzEu~w(Vjw1u>M^inJX!oL~JOAp=jE +Huo>ZQJ&u|_*{UUZ)itncfGXehbqsG9C}yu!Xl56v{I?yrF)gcev()OV*&0Pb=16H@+Jz(xH}n+)R`s +4J>&@sQqRX**J-KCF9JFd8WIl?w@p#BA!ZZ_M2juj1R!W@&yT^|tGw3L$S=LDs +-J2)*xi&JK#q@i;ao8dq^8h-g@mK039Tz%eqo>|(622^;l+O62xC%Nj{hNjhN=pUK`op2)4JEn#V*9+ +&6lU;Q$vA)*13eCQUg)`e>3GOwk6)*>DGY^W&PMxp9-_ZjGE^RparwxWIF|dk5d7>zIbULzT&e2rIpl_hsS +$JDSZFs33u__*N2sx8(v*79BYc&feE)T(dp>arzScfu)6Syz-|3{y%5jIjr2At|I4n|E1MsMWKEX$(~ +UtdQYxhm1U%kTc09MHZHrq`fn*A?DiL2pac(JQmGdgXQKyk+N(UQq`wi>23rt6%o~mZ@d)#_InE|E(X +uF&S5RZ=u!N72aF>Nv;Wh%a1~Zl16%I7D}p3+%xAjH;}2e?MJJDH0{RH>gUGQ#hJL{)` +9)FW`^U|_WjWXe5^WZ%YO||=?pY)x|ZM8AA0?^3_lhe{{cU16qO^LV!O%eXS?KqBFnMo=FhTrwD>K%r +2Gc|=v}`2S^#DTxq?e}$uh&j%dDo4HJcer&-D%YtYK*GIj6 +rG26=A6SqUc7dJtmNveSh|C~tp4*WfWprf>-e16KjmxW1OZA0^H6RMtSD8##qddC%j#ZOlb0))#0>YX4Fuo)>*ep`FZOMxNk@h@opSQQyIE0cQv7*x)%GW(o&=Q=H0(ctIl-5&9LkwW*f8d=pfm_tw|Hk#N& +XC+KAkS>(p@k3%Bm&#=ulaQ1LQ04G;2jV$aZ4p3)T^W;HAr6!+k2`R8e!91dP8uUz4YV@Lp^LW6hDTS +9&~CCDvfE-gYaGW<%1qw94k~DN4b60o7MP~PJ7{OVO_ +JY(roo_^qpI##c9g?LXmo@m5*1LQ);n+Yn55z&hBKI#SC|J7|1yQBOj`xLkVwTf)9kL7CchN0302 +RgBp1I(&Z2?g(3)L#La#ce(`6KN!;|2t31UA5eWqPlM@L;jK^ug8htld$svYsuQ)fW-ijpy4 +?pYlhmwz!>bkE+w<*U)&0w!|wLW4tNsHU_)_5k`-!%&*OCWFYMI_$Khp4qsGc@q_?#Q}^7sMhK{SK|^ +?~KKz6iRO+qv2+GmuJnAiCJO=D!RQfC&i|2QP{BEQ}*;iy-^+naGc0$JDT1#%kL^jdi?B+w$KQ_wM!G +-Eut{B1rWxUXOJT$Tf^b%=-rV+Q8kNR=|bLCU`2q-$ZV!NQkFf4;&pOTDVA%Q!AfXIfOa!-A^{)UCsv +?|M!P2i;JpNmVb=IF;>9}}gpyyNk_LwJGRl}`{UT*VWs5Fa4){V3n7yHe9iB2zM!dJ=r2JSU15}U=70 +CCM9+Y#-5~AfS2PAzX6zRkw*5ezu`Q&mgo +tEM0TK?QGfh8$hg?FLUO714%=RdWQb%D7A0NU~m)ZU5J;Gm0yl1X?CQ&D$}Q1VI)`hv*GV$q!mC=O@X +t(vXq@eKP#U;ZW##PQ=JmO7B&RdO^Mj)y>>qD~wI`pLtD67*^p@7N?K(?Kr?^5JcS0lliEH~8J^vLU{ +Z*Nk_(#NvJN+6#WBhH6?u)DuIZfW#ck>E685`rTi$2>qbS_`wmKyhZU{POOQ +u-%0@?OUgOOx^GuA_+&=fAKq4jwY;~3dEgb+xG?<1hx_akalL-@{*4;1Zx-8(1w>7{k)CFVmyPsBtmy ++<(l2Lt|%;EDDqs8M~(C|I%h&TOM(dva}p>$UaUA!xlph20WZ*8{}0T~3A{a+^Id{`5d3)UBhK<^3%K +n8uIu+B0y>r+#;Xg0}5g>{Kjg$*TU43W3<^-T!%cz2(&RSyTCR=wK25$ep}C|O#x`Ik?J8=5KuxK=L2 +tm?nU5}6Z>^-RoGE?5Fr#omE6rMGAUVSYLe7&DaLtfnGQ>pkjcPtOw55A9MtY-=v7Ll!WznQqbd^Y1T +p{}k~7UcTtmohgNMOYc8-0?vi*Zh^|&wQPQ?6tX>Ctn2p}oy`&6toK@u23KWB;lGhzQWb7aIk`a09{e +8xav=fa6TJXQUm{RC0VZ!oC8g-zBs+|o9TD=v{3bpx2t(C92$;hFFk=d`9f5dAwub*{A`|2AS69Pk3x +`c|6o;A&;5=4HAlXlM-t<%MV)H9J5M2EwXKnz7N{X%oQa6pRAbW0$oP(c%SmSMpw1uF$#=E~yFgsGVY +)-}=9$u$B~wJM&`iw=Dp!7YZ*SbE92ZB3_=<`Ev`@gwRqHN0Ry`%AA!zE?tuNZyW1`CW>Rv@u~j9(4y()UU +TiX(M`nWgbM@_&a!WPx<{}0|;knUK;02E6&0y9J*pU7-a-x2U)r!TPNE(G-ao +6=fZ$kl2U9~NGsP-VR8QaT2`lq7po;15z?(f0Rx9x=#yd#CRXioK>Xt&e_R0r%ANOxDDqd!c_J-p)4z +1b>0j!J6L+cnbq7=d5GllkxxH;{5KfQU=C1wO!8v|U?uJ#wwU6CYD+laaj~Ah~xJCexP?_NlX6Fp{nO +3PczBzk__fS#n=omZZLh+5x*jO)%jNbetrkwR`rf`+%rGmP^WE;iYX1ccE5-1qzk} +Eb*ns!yg25w>&^{Nb0c;9<_18}3@E2{1TbE_AK-sDFnrH1%R +*QX*&awZNLPGlgVj5ut*Enk!yFiHUPsF_T%BTc$Jv|ly^s1pL)1hT{qVUw-aa)Y2V`Kp_U>m6Q@|$bC +TMBpEcE4}lcAb`O-a +729)Ca>(frYWJ|wKBlrWeioLKe9B7duDQQ9O&JZ8;e~8KNVz7ig4K7Zsdy1C;A3bz;8fh>1A{8>q8*I +ss*YYg?JsUa_g)L4ysNG!OzZWT=(U&O-_iNNm3E1Y&06^9T_) +jTN#+FKWl`0j^w!XKp-yb{gTo8qc-H(`!6$h@)reETdDEk0U;=5nde-gIa<~r0^4kl5Ob8+&N7sxsP7 +FLP-_9OczT2MK803k{Xf$^MsP;@v73!hvb<`=c7W&+mxO!lw5B{{$z>E^Z5kS|76c`EfGrRgTx}XZ^{ +u$Zn0q(s*c(PrQOQE*g7xbg5(c7$!HCD*g892Q;XkJk+UV1XGbfu45|?eCoUT-d~WiDp560nyrayMzH +wKlhjnVNd4$iiyzICKR>^~&YN>Ibl0l{V;`Mk;*$e_%cmXPWJ2v45cmo!1;*o6GCHdG$x~yLCbVl3um +K+gEX4BF9L0ErD@T69*$J)-8>cTHjZS2V!ER;C#;^}q$fPq=7UN?(cK?@5>uM_dQ#X65$U$rlMyyx;p +VHIeUA}K@)0BRS~NFpuEx0ZQaj{{_`^_0zVJ>kzUN+OHt+_k7Yc^p-{YUaI0YtJQO*(I8_An0w9Li3x +vtUJ6KZAQFhRK3@tRX%CLPm;$Vsoj=?nOGZ)BRCIZK98l7<5eyx{5x9JCxlnBpga|F*St_)`4k73k_1 +}jXM~bX5K;N85&I6o#8UZDrE{53@;;Uf7)i+JRj%ZL((_PxNc>QfU`qMOaaI>sVdF4(JljvwcNTcE9k +LzG%u4k@o0MKF(dvfZ2L=ZHP!I%82;{ph(!C;x3^w4KB6ra> +DCZTzmIZz5|07D$L@@-xZ3D9W>hFCiX|8B9B=5MG+Ym01mm=rU|c<3A%gU2t%Xk|ze$8D6hF&AecK$D +zXBbUJ*BO3d@hG(EgRuBsjv+LSl>`;5%+`~mn(dJcc(T2a1A`16c?MD5ARklySuYDV=|zm=j^_Y7MuV +(R3Av-wOYKax>SEIj(_eo9+;^PcaJc$2mR}oqB~&dcRLY~J6eV}j@|+|#m{!?J4+j1v>}qi3#u6)phl +_Vw4YUnre-Le*)Lc`OC5?^TeaPOLgk@StOJ1rRs^N6PEYAEfd5N$5)|*rN*78jh|l${0QsJ>^ziwMx* +q6X;BkiocZt-u@PEM?x;w?sQ8pE3c4BR!TYuq(;`;g6!Tg>i +6t-i0Hp+D-9%wSx0K%wrK)vj=m|2vSWCW9EVm3;9OE+LYCj%x?e_4GM2qZF@ppKzBoFrjoDGIbucr%1 +{8Yi*wdAlzJAg(o%*b^9eav)2-%Ny;aFVx!N}NCGCrOE!)R5i5q#DGpZCEDIIs#@3$~zQ7} +6?jQ|Uz=I$hof6i$EPQHfm?(RKDe)n4|5$I9R%IKefMDMcvjW&_mgR27Ec%=x9f&`7e;Yq<&87AkvL@OP4mUT!5XGf6P0Z*4x?j?Wll4e +3{uSu217z510=Fc4m{KOM`0vHE?wRJ=jwq;6Sc18!r%^6vJ<9pT)x(I{Iu@I(_mirE`%yt#S!rE;)s6 +J5V}T2&MgFI08xx$HmYGpY4=P3 ++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 +hqpy{`j#Da>VdQ>}f=o5o`nY}K4{E-X +^)4JVc(>`3&#ph=^ucnHw`2wB>MTomH7Gy5{t7wQDdE?UGobs;PeviQNdOOFN$Youp^a_+N?llzCTZ; +vhnhC>SM^?TOiHDiH$TlNOseYpv7e~wfE3b^2iE9iCfc6KZIP=Pf=21WFl>uZ9kDlEYyDV?xMb%1xK@ +hjxSqB$)z3(hDJR+}?4{QxKmu_8Ehb=Ad2XcgG8E*pKSSlSp$-_#*}F7n7v-ECGSvD63eD}~F476MOM +MYuhkNF3oG`fVtfgZL9EacqNH8y>S5HKWd$+l}#>Mww*GM;dRH{5~sIY%hxhAHJz%c*9?)CIGIuy5!= +<*IdLV)^d)jHu_dWZeTbaWz~xPY5Gz#$O=$3s_!7bhBWRQw7jLw&@wU2Ok4?p+sr_Rxk?P>EAELYs0D +DjTjOs-*T?CCPQuf`;FJmZTMS(|ca^cwyoRU~?>$5!6) +-9$;Xrf{w4iMYSU^Za3E@y!>xW@mJt3x(1mK#!lbWo1y)&hx5xOBcQF&)*HOU9|TEanwCCUPgjY0*Z* +r0J~6}{Rc&~bEmA0L*`2%n?bqS)gP=N}Ku85u4%E5Z%dW~3z@k$0;#w&>cl+2wn3WH;@xkr#yW4#o^B +Lj|V_PK|c4xMLsf+t6M_dzLV%1#LS_bl3i~#tIQ*FjjQY4eFJcNVb!I*JYaA9{Gp +2!RX!6vw#fJ0lAE50U0XWy*vtu77*C^xC%)wpj3AORkkaUr<8FDcLDjc0wNw!{K4|k1$JSMJAg74P^1 +ZuK7cJSE}TW9RhnwU93Rr+DV2KUmzGb5B&}lQ17%U}Sxl^ac6*eMiN}Zh?Lz)`pq+?zSO`WD?b^_;74 +42dx@ZYu@y!oKdzvyLSzg0f3)9TCa#--H4_1@H+R9}f5+h6Yx3I(ETiSt0Gk-^=v(SNeO2{{BLLf2O||>2KFw&BAn#oqDO +L*S&_wYK;t90r-zw$3)#TxZ~3>Wylja?H9UK)l4lZ0aMH`haf6_l9jqM5E{KgP40qmh65Vbyv&o7xdJ9yUTqjbtkg>$9fc~R&a>e#s)+qzCJn8@4l?AE$*)Tu0Of&%gWPD39|> +#&Q5yQaUL(p^21BAobUgUo3tL^B5!xymeA;Y-u3N)URI1-Yx^14&oPG@JWRlp4Wb7H(a|@rHp(et8V3 +U=rh6o@{Z4lhp=&e=dyJJACC6ZM+zBn-K%7$RGr$PFGbU;R_F3)DSX1256x9x&tMat9-l(h%-LS>9`( +l@On(p)kw`lx6P+d$nN&?BCyxNTUm$mhpRA&RG;_zR2mf9T>KU-OSpiEtP(Q92uf=>c(}qFcpl(3qQfY)XO&S`g+s2Py=)@FymbX6-2 +8tB=273jXRbq+d9N+nm{Py+E96*2A4RWYxX~Qkg_KDcGrSnU^DsbGaTtQhoYYvmO8p{i`OBu^)q^uV6 +TRqA1OY7LNWq&?oL?)b7O8>8rc!lLfOCzY5_7nB?=SdwkeYhkP88y +25L*^pLo@V4SG`$ARm^^V}AH0Snw_WmXyz-WQixsR|ru%Ro2<5YBo_sJ!^K^a|YuR#b;^6x+#Eqky~D#Un +_qie9g!6E?>*61KdUs)KME)UpST_^F9rgatU&JkQpHW5KwEhHDl+qU*zZFG*7QnwWgTHVS0%jRJV4-D +(tW4mAp;kw)PkRM((q9n)YPi|T{9 +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 +YJ378ekWhES9EEURtp1TT6F9<11v@XihGS&H +x*vmcD+ya9PBo+*RcVINI$3F8=+I&YfL_65I)qa%*|lk{5c!{1RFN7l&p((o) +lN(N0KC8N02zLL_Ys*s5~s8F6=|%pJ`H~`eWM&^|2-4m=tj{n4IaWm(sfkKLk&8Kd?+Py=!1`{zm?#L +kz>)-3-x^;le2cPV6PgF-rWZSdK{irI>FvSqVOI$SX-~Itj#$l=wIo@e5QZP&)!DCnj9<9a6s@+X}kG +ZRAVbbA{mdX4UBwNwZb2Whj(hjoONTV9Tacy?sP`^yiA7=`D0i0D`R@Pn+Rk?pTCg#I8o@LmY-#ol~W~a3Z>K6lo;H7ZZU6s^o +V$W4AO&e7DHeEoA~XsVaA8py2yLDey-jkJ;&!vg`t|kc=EGFqj|&i^Hi#fRMS&MuJ#zJn9_9zJ~Jez^ +K%cZ$b#`Pv>=?sCMY+hnghUcbYsrK#MzU*oZHSUc2}`8}2#Sa1Td%UcZ{tGx1uNGeq-*G%x5H+$k)IYXy;W7?)(6!NebO$8P#x$i=VA}h9}jAT(CtrDm&pS#@_M#VZg9lE +0*d$43O#SCb@gLe^jjuSipLA`t`>_RM1AH6NRanJoHDP4@tvi|_%0pHHGXs~+U!l+4v0ck6+ykZMtSY +NxT0){C0gNnn8N9)?v*6=5!+O+Pm(vIFm-u$9MKepGNnY7YhxkD2~-`=N&929-p)s)h*kY?26eltI-1 +&Fk@v~>L*8Fl!S^&m24*c_nO9Y9z1%%z8`=59Bz_~@IQg`(>-$@z{LvEzZ2Xq8P4l397SdbF_H1xOiM +kb@x0JD24SwF}+=KU&jb7opr>reO>fFQcDccjOs-mKRQ`j%*J!K2~x~D8|j^uGq*$`%O-BT8Dp7uiYp +0Z~;B*}G88Fu2H_mp|Dd&(+BuWlEWP5%P2gBO*(tA-@BPwV}nvW0i_eo@&QORu=7O!J-G2%V+eP6^G! +tNaGP<;CZO26{~y-B@D~-)_U`@v^eFafwK^W1p+x_V`xY<8C~5d8XYYhQ9!vJ)>)Y>0*cY_gStkd%U5 +3k%B7tY7x_xQYQHtgl1>t6?(bW&11^(uDml3A~P^SrRpG=P6x>L=~(Rh4&ZEAqhot3z6hbG9Dlxr)+U +3jr!S=a7S_Pv7v_tX?S4|kcR_?*`X`NA109w$Y90OE4!@do-dUn90`bIbynqv!uypT1mrLbaSYe?Wv! +UaOTYLD4XQ8vi%{+9xXK4B*M0~PmAh%PUhZB9=?m_5&Yj5%G!cRHkyjy#T5RwuvhV_;a-1{mV6_nzi{ +@$x=$anLw-JJ;0Ude>DS;Ve{qQmdGSLTFvmyHE|=7bItw)7TMJT%QSlxJcS4pb!h64I#JxLbg~-Xp!f +*Ywc%;(K+%rcaFM&B>5sR^$0*A>u3gl`{NYF+$%XOWkrsNxhrj3n>()Cl~ZmaFuK0i9G>&8f)d+M1sm +40=aSrQ@wBIDwlExqu|rXlsg2984G$TX2GlxQ#@iI|C*-(w-dtiD2LlQe4E2o4!`2Ci^I^7490S(<8T +p&g&c0+@KFw5;joFrk2w5>!=E_}jA3vvhhsUM#^GEJmvMMIhgnxMn9AXG9L8`M%Hic$2EXO7jYHii2A +6P{&!L^eat=3fxShj29DdH>B@RPJ^Y}TO!Qlc9mvOj~!#WOM;&2~_$2k0k!=E`+j$v>hhiVSvIh@Vm0 +uFEC(9Yoo4jVY!%;8fUzQo}^4nN}Xa}K}d@MjK#IUh%JsNrxChlL#8$>9SWKF47bhsQaz@$!E8 +*K0rarCFYh=V$+uu*i&sKIhIlwbr+FRl0!;}jacAsJjo@61l7H3bP5_@8;3dY2i{3KNh7n#IFiKUlFb +vzb;N{<23+gV +1K8rM`OevjEZ=PZHn{ZN`BgEu_j0K8uJIpc>v1_;o;TF`Z@_qX{tNQZBX2qcn@C-+ahXDPY;~TS}=c1 +OBZBn_Qq_1J`1*98AUF19QKUQgG8k_X6sY4dDvN?c84p*arePWcuhY7k+c7yM@Q8hS(gGKDw(R-Vz!s +x>@0`&=rDF91ku=noCBt2y9EK8GWt*x-9LOFHD_{#^eB7^iu*kS5tb0)IZBvHjP>4(>R(pkLXIm+82wOn&*|WSSxyrj3LfENn6jN?3hrF +sG1}lWk;pNMy7XoCtl}n1b6nSveQ}#ULoA^8Ob!E9*JoughbkcbF*jz4*(Q{5m6j`H +$&-F}dBRj7#T=T#To2jltDopeZ}RWZE8?wS0j-HPNBR}0^%BB3z?vV?bzPp|xuS=+ +$#M1UQpY~1I5?EY3XHwF4eU0}hzdxQ{^uc5l%e07^?Y*Wq-lP2fIQ?w+T@F5E%B8)Os7&A8-sjOWVzr +I+SXM9>Pzq|=yIHA?jhf}uurRq-@W_k9@=I(yrsQTdHwSQY<1frChqQ8YC^v_4a~L;o|CyQlb8{9q50 +E3~=16XAxX8>=+^pf|tGM|{7c)o8^tgGj96vV?<>rRKNx>QStIr3 +)MpVNZ!ii-Zv~ZrRq#85hU*!N-c`$oQ~Ighs7-b8%K(2ByNqx%_V|9W${%waaET|0C3X0=1v +OZD0;cNAmM1ipITZI9kdU_XD)63R=eoTfLrYvO-^_J^U@EEkZFJVR^cwfp1ScGi?LiJ{Hn+dYZFozF53+d@_BRo=is$4{~LgT2wT()Fn{4@ +QhWP;ZY;98Xm@f^Mu^o3CxfR;-cjuqqF2#ik4Yi0&zph%5LU)Irb7XF0@$fvV+#K+))aNo$Dy1^yWH> +X~Ao)wgM~zbG9wVRnC@WHb=J2#jv^A#ncG#Vq8ccX(LUfhqNI4YNUm9Fg%7K3$yJGTW&U`Guu|cG2lz +S!&d4t0lzG{#TE~XGzT-8ONy!GLI;Q0cBF&hF%0@cKj=<8ABC5o2}IDSh=cf_3d}8S-WmM`M>_CulS2~{axvH<(~n1* +x&lA>gBJyj|z`J#UK3h48OtS&+8BV$zj$1)9n9W@LXA@`TyM#pm6{F(WjdPDBOQufAG&O0spUmzn6df +3x_{Xlc(Ds&N9z;ck>_3uRGs8ZRiC#uBW_WLuFO{d&T-B_GgVk@E!i#Z)|H)WUFwK?{Jm6p^JtHbKD +XLgJnF$3l7<(63`Wh`VmjGXl_i^CP*@i4nE!5==cbk>2ZAXhVUv7@jMP(S=v;5^;ikNA0o`snp~Uwp2 +Ohxr$JR41h_@mG?`@$rjO{h_;3)9fm<^0VN939+>d9wqo7{zR!%;u3+9_{%);D=)vZyrLW;@V>MB&JE +?^zP=Dcb#*lqbbNeyYIzO#jvbSfy0{#|LnNuGsBKIgTV7KRp$J5ipP#Q(`j=U)tE|>5=;Ifc8{oz7GB +IFw08d1f)dj` +NWj{ULOD%T0hchY4UV+9^doFONpcq(FK(jA>`=@Fc6Clku0>svr?$%99`PAZ*IM1{2o +q@hHh{}$Dkkt%MfuT}S)qYol$nG8-J&8$g&L#;QviG&Galq>3}U7EmSx#sSy)hPnW`RDSlTC@Rrv*WO +Q|(G$D+>8vqO%?OmLLiCM+u`o?t0nIYtiLLq6T|i?M;n0$WLOk)_x!`*+7e7e +P+m||x|8WG(bItU-K92@ep|4S86<rsw0zuZqR{FC#?>b)neEBKv +jp`zgFN9`!Zq@}0L9+%X6`HUGkMxD)bfl|~XhAaIK9|L(TEG$`tgfVn)$+|LJ-#qC<{%p$~Sm34VSj$ +Ri(F*d^mLjWt_0_*0-!c$2E=<{w(41^27Fn1nQ;IA_C44Dm1h0J~T=h`hiya{g7U~x6uSoyOYxEu3=R +V)i>icPJ2@a@JrePSdqkhO3QTPyEBf{<(B?KsW+PX+u253@q$LsW@=L^UbM8a6nP49-=N!HNCIU|VFzz_#!s +{To9mEsWF!EB3Yj2ahm?XZ0+5^e8C2IYo8x`K%+A<*X6=5xd +gI`M;c=xZ^2pbrUzFyLZU1Sv=mZ2JyJtd@&v+3D1SN(gGkpz!!vC!zeHODKBKYOD7Yu9N +t}Wo>joBG=DeGXu2Rhc1TaIKcvf#L`{lllfyqSg^(Ta8hCi>ANUdle2D_S0KeJ>90_Zb%j?ytgnSBb4 +)>n{_^;4;R?6{52LfM1Ni>vGG?Y{HeYA{H6_J4?63QVG${`YX8o7X#U0Apu#6cu +P5l;MIoGJU8tOwq}`@tCo6~SI4SP@1P>R_VI4I}C_n7;#0)V9GLSG7eR8Q2(ZRSXVhGMxr84g4Owz%A +EdSeB4i735X5z@6?q7^2>3CZzQ%k9y|sMf?>HQ+L-Jp(GJd?h#P#5m4?ClfoLAT)_)65)O9A^RO%Zx# +ad?kjYQrJc=C1GP=llXf)-NPP#nT=}>zE%2o +aE3EuLr7>pVh1ad#0M5m>K?9U_7in)Z9B&*k`BsywB02yk3l?=^&g$zx +6nG98IC!xIFTYY7I_`CRl@qC#@$dqhC9{0?P%_}}?n39AhhLTX5yB$J0NxxHHkfs6pn;$K1nqiDT@v{ +5N1yHBpeM^qBzYpmTW!nF~pj5@+ATrn<2{JnfWOg7Ktmsb|7v(k=;sY6rN^`Y0jeW^-Qwg;BR<|s(@_ +}|Im$%moB04=Pf;{*0BK;->#w!B7FyHZt-qL+t5E+$toA)S1o_B9$p^gUG_>HoS+ +E2*!``u;RSAXIJKNFhV{fQz{34J5HP+uZJh9W0Hzd-v-c%dvKp{&4;wj@kmazS2h>Q!D^ynZ{4MIR9I +*asf+H(W{jr>UTB_apsnbQF^1;vv=pK2C~;@jx`l9`xs_td2wdg!DzFx!RUSnr0{`=-WH`w}l>I)B;n +x$)BxHS?!>*>gz>(6BR@epdbNQk0YQz0-6yo^|OX#1*ay&${I;!Gal+0vkOqT?37qGSCm5=mV;tgFd1eKBg1k-p*;GLVeav0YE(iH8D +Y05M&#xyMkMAaMksDkFc&_)3xv2Phmg_sOJsEJFJyG$&t$aXN8+Zy{5AOVb`1KQnqlr`?;6}o+(F2a5 +pKJm!S2ZS(Dr-SC5=*$?cbALpa1N`XYfD!@EQESx(|Pt!gITOy<(2Vp2DWsCYWI_CUHIsEx53lnr+Wt +OxA(PbM<*{$uhPgP4X49Z5E5EV3`efGi)O%xHf2!m$G5*hanAgG0Y=8jHi7UXBXIKm)I5-6fZBdFlzc +TGLUFXOAD44a|&rC?x;wvVm2kf*JOeESD0?hNJ>er#kF_;Dlf1#m*hGMEwc*>EjMHrq2H&y=i{1Wuem +7jHaiOK1+!M$Eomi-3vw+f`PnvdE7Dnr3o8yQ23t(-LYp*8k(IH9+|TptqNF8c1q+qSG7S>z#n=1|+v>%*Q!Aygq}0NRU$0+qgWe>sd>8ZdvyTM&vc+VwSE|Lb!p-6F-n^WQ#a4&iNYgjfE48H5qZBeR +eJd_`>$tX+(ODxpXW5D@Bi~S1LX+5PE_;!wzM&u+d>F#Y5A#igQ?UA?m--_NyRg1y6tTmGS{>E~m1;y3 +}qd!jE3sQrh+aM(*M51zId7pE9n491(JY;tMRSaJDenVQm!f@+A*5WCHvzg_3lX<|Cn5j=Vf5B-{fE; +%3dZSzLUyAn!c*u_)VCfJ?)RNj7uIotMYBJm1Ux1r<|5NCJ}&9_wQAKm25~^I|>C-F9_^lHYxBEkN5I6~fEsy>!?T#~ox(>ghjxa*rYhqwm?&nBSCKs;BEx^8jb2kIH +XeIH5=12_!iZb2Sy19@14Do!_)+u=Eh{`^Jz;oSaOZq{;h3OA?nFblZ-LJk*m`Zw~p3%Pv}!JUVM?lH +$R5;mSzKkmPrr@4Z|4cxtwyH{~K_ri-iN*?9r$9Q_S^7x+S_B(j`4srL7xqGBP`BKD0A<7^Wy((y8o5W|8*JY@%;Z>B +swPZ`GA)X?cTP+03vI{>J7uW`%|YFeC$aEEB@L>j|^(ol~cG4{O^9^#1ra1=vQ23P{ZM?f6%{{!`Hz7 +;m1!ueib?MxcKKc3@o8;4s +t+`{2z4mWYwz+nxCu1+z4c>|YtEI*uT*95pNEj&J-y`BE&|#sz~cd~hBtngf~)~J9wyd>XbdjL%0W6@V$Dp|1r$YXCkznuXm8@C$g$F)o0k#xVO>fCo5!5a5@wz +y}D6IxN>*&G`dx(lv~q)2^ZV!KidR4KOW$sNi5zhfPYH>o<}Iia{#|iV0;h(MkO*og8>Tg#)6-_06v? +@Xg&vU#kI^&A;1xnS^35QTm$bk@Q?87B#3vAf{X?D5xiMo-MzGHZSUsPmVJEyzcmu$588AKtyaQmuQbs2cU>( +Qr0yz2>7B&{(E4MKIAl#Y->4{QMcuO{nn*h%O*a5E&aD;eH#sqjio|nl3o&#Jc71FxVkppo1{a&gxM;Sggd07B7I$&-B?Q=Q6L-6K<|04jG +u7dmnZUuN#8T1{1X8?R*HA~NSfFG1YyN_uD_+16?8t@K)t2Qt{Ke}RQXI +O#=b|G_>H;Jfg~qYMDN=4Hq;;9~(k3vWK)&jI|)4oDN=n*l0!vOWc2|6R;J9H3(tZ^r;?UI*F0z8K)3 +Hz2=QrU1{ty9sa+;2Uo;8F&-mthX4h1Gse`w7uB>0<7E*?G?5m0B>#rz5|{C@bMJ>P|t~wA22=UCxHjo*FIouxMI*#L+l1Dj?a2NNF@B?m-@ +I1#6;<*CE5su?HLIcO~JU~9j5w7Dn?%{u&;|Sm4IKozrBm9Bm2&2DdIPN{4!EuC(IgSwb_+pw7?&9|U +dD!3(R36mE0Y1JFh(-Dc%qp722Zgb-a@bBX`$DUG9onW%L0nAEow|Uc-3U +ZT2{IQrXg6m$GYEMlES3cv%k0*2H%pr>xFD3;A1;pWSumUYFhyQZ2Y11b1^wUq1UAuOX#>PhS@y8#N% +a<<`{)w!ddIm!Wnu5ta2g`$rs(IC_!_;_K`tDMB@TFC&)~rDf-$@5A9hMGW0Ow{fE5Yy`gaz}eRcICu +A3S)Fn(6df2|wRSm-49lsx=+Tvk+Kn;^tL{m0cJ&_AZ$5Y!vXF=TQMNu`G2lD4me7UfU#lmDnGPNXA9o?Ul$W0Q%fuw+fttJCKfHCsa|fwke8K*#cA +C@$!RfbeNdKWH(hhcAI$YjJ{U4U3U(?^|xpwqP#DHT+@D< +kGOl^=;neGeHD~dA#26D#{6KsQP#n+@EK-nSH$L;g!mX0$y);{oz%?J4`}359PA{dvczbm`KcKGg-KB +A-Vnb+q=nlLqh|3_St92E3dplW&ER$J|bt%oN>vy6}K5|hkCnxhd-9Y9o9Rf*Ye&W>)-kAoxBw#WIYs +7-aC@C{vBr~NWzNs-~N>O8X)T*J#(`p{gSu#z?t;)^mp=1iGKr_xnk~Z^CaojOle*1n0IbY&m`-mC*F +BA9qH}58|kl?q;nT8Y$sHT?|}Yz*f1&7f0#tP`AdG|mHqhhSH<{*Jkn4;Df?y;JflX9B5`qXBtAZ#Or +JiTXti2mG#V-I=Fgu`7A;ytZoKhEvUKTEvMzTvS-yNZx%JjtNl{S|vDs|2{aCwpEqTl_ll<-W>Ez{g$ +)s|*p4_z}g={R*l80>?@?vu#1?@DCaA&F$X +FOihv61o0_MCPB8NGZJOUrOZWuO*VxCXr=lB~npQL27Gj$-Vd9OCEgiLGsW;50TBAHEe3F* +$_U+rrtFOLF+p;%dfcwGT?PSAwiM-k&k^TGklLH41koVtzpBz1UlpH^PoSZmuf_(PbXXLvxt>lC6CGy +1=Ur@PdZ*M0*e)kRe$3=;Bbaapl7cNj)!N+R?^cOJC$1|`>=(GbtZi1k)_v^s#0R72yX(G82IidG?MEYz# +kxt)6q;KveQpbx#>huU74&g^Yco@Lo`p|YWga=w3c$4{R2ww-`AA#_Hhw!^0{4ofB#v?rRYpGC`tuR< +=2!QZ`5FXl}4j2qc>i$HU0pT+s{Ou6_K?wgEgg@>Pp7bNBWDwNZ;V@>3gKB#nISi8DL5xHSyNO5>twf +rCCy{R3Or(2XBGQX3L^^uPBfJ{IUkBk$5PlhiFN5%RL-?%_{$&XNHiU16@DS&{pF;RE5Wd3|ek@S99w +-z5g+Bp>CxOB~pzsAy=m?X@_Y)=Z<9vy9-X@U?_e$jAixTZmshg<5 +B+LaGSIwS1V88(I;BwEr&M#9lK@Sn!0PaI)&!$Nj>~c?0`Kpro#p~zl%)sT@!)PXk%;w@TbE;N5$y?< +cKQq&uX*TM4DqWg;jVXzvGSWG9fg;PoW4iKngL5=D9OLklgOt$=Ajw1b8d^8^J +MU7RYj9VoHkJJu`Ebc3yHnf8Xl>P02*+Mx8tU%oOx8FFC}^UxV%`GeKPE61O|@2LwzL6xMHEW{P=cGR +PVsp7hyc2o0NJ)&d`m9?nQ#N1efbazaY7vAZ*qAE2)TK{V>Go!Z0MgFdjvsGZuwnau6}n0q)&QseqAR +r$;|7)Uh!YsPcydwF{u%axOvJ;rmtJx-Cwa|;$MpyQEsmN~Am$J1pqNKJvBY_g@0S2pO$_P?wnlUra+ +0qvaOV~H&Kl8qV406y@*1LWa{A104H@(6kCvB${Pty}3>;pLZKrsKiaUw@sB6+Ucynmi2SjqNa2*tc& +VIdtd{9UGkf@)Y^<%m1&vGl7n(N)zylNCS4O*fTvwT00@^q#;pu2qZvMKva}AqG)S?0Kp`LgjFG|Eg~ +48r4>XZ3lLON1&AzyY@#AA1fqZ|h@cTfP!^HxpZ~j6H#~|Y1e%#MbB>pDdG)H^yZ7JMSC!q)o;`b<{r +mSjKm726^Yc#!O>A)V=uzkN>C?{CU&L9Y=UYy?>}*7Jb#%?t(Wzce>FJmv?dHkq=;k@s$r9&gS?$~-8 +=V1C=uDL_oJF!%{r4f){pt|A1UshrHs!B+e^b3bM(^*W_jlL(2k8Cd_5N9U|6;xWJ-z>|pZhIN`7KWQ +{~D**-|Medty*=CH<%yvuNGV@A|isn16nP#TD9P6)$4~;z2=&~sGQvpR<~BII<+FMt9os{tM$BE^%`~ +R=(X2X4T%Vk2zPD_t6w+brmG^Z(+jS-`s%;jSiM%=h~HmT_b>i8LPP7;kEmSv4|VmPdVjp;>T1E)*N^ +yp<;qu8saWw3^{&0P+LgbnR{y5oSH6ljBC3Y`sZvm-un5LYRVuRne+6IhAA0ut8dp`R60Z7Hz1E*A+^ +C=GEjQ`8?jL^Rf7YoH9uX04TG-WV)ejG^86I9e+~9Yk4xY`dUfrBJBd>LwD2jL${Ij(3X^`t0uICE^A +-?($zh&^Kxg@kqJ6n!nzsm4C*R1H@^?zerO7R$Y`Rc%*LPA0yDwCgntX-u_6`nNUX$JnR1AhuaErt2| +fu;E68WsHO{-K=LLs#4*;vYJD_U!xB@2os{@Zh&U{`li}>U(w{IB;OE9(Nu&a^#@qrF*{k;)_M^zWeU +PprD}esHmt2KTg5^b@(aY8%i8{EBn_vofN^!1;&Z{I#y^JrPKW{rIJ-FK +q?RJLu~MuAFp?%XMwe+!>04x)bc%c7#9?-kdtw{G3~(zf +`S6svSo|8j(apl;Qc*%&+J8u7L8c8Y}p76*=`*>cI@4$sj0D0I +vC-B<|4tB +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 +Qy&j;Pn|~IxnS~S0gxkoj6I&&FG2o< +5!Emb2{2XU`zFXRizw`N>##5cmU_@MEesmHDAhhx2rJyEPSyMxv1%^=LaS5`nJEY!n6$Z^;htN+dW1v +%$d3>!HJY`V4*3;Q)c6zotapw_YzH!S)@iLs{xvi3^Inx#Z7UC1c*93Q>Wch+L^2MyNGhIgwuInO**q8E4`GYw2Hhc3FBI|B+1|bu* +GIE6Vr?0@M?<)s7T_-dpV)2Rz4_PXcz!NvPdpw;Cyk^x7Ur+Rmz0S&QZTYs(h@KwE50qj5CJSrr|u`? +?$16i7nRn?ZDXt7&)m(V2GGQ+PSv5Kd`e{g`_!D2VY7R5AZsy&f(94!3lwfREeNzYq$is>}Z1zk@r*j +`O3nW{V%|jqIUyOb|px@90Sx1B$=t!pBxf;myP1s_6lPjH6>BZFZUx%CK_bm}^7=&Va8c2QJYICw=tj +?MRN#-K}c06vJUx9{atqA5K7Fk1ttc#vzKdoC3O!$4Cj_O&5-}l?{O8QR+^vx|sh3E>(o46o9o1p(GP +7M0A50@Nj}RZz(*i*{pIHsJ5_$qP9WA1rDH|PJ}dQ3* +1Ln;l00?Qz});q*b0w?R~VB^^1h=TvNH4~l+7kH;$7irq!Iu;1u`IDam?q?jP_ +VGE@e@P@H<#HIgi)1K4w1svm)Oj7oD^85*Sg0pr#?T$gLKY`$PUiss-u79XmHRa>c3eyW|c9 +4TZMKE_sA)g6!r{RcMO3eiGw(#x&7j84}8BHPNEi$qn_$Yj(LrN}zUwAt&g2+Bi^KkM=197ri!?3WA} +5-!%#qz4I`_=ID)2}~qPGTt`43co+6d{rdHK&Wr9br)gVjVoYB0FTH!IJ#JKRxhLiZ^Sr$LMx(|x!ir +UT9ibEP?@)?@Pv0iRX)#F64xq?UK +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 +8oW-6Rh6wRo>b7x%n!xik=AF_75= +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 +PtkN*&%Jto@>l9-KwCVZd?XOUs&VotA +%8^;$_0_)faYJ}i!!lnxDx8wmzbW?-Ss=~c&V&I#$vgtsGqgiH7zHCr|FW;d``H3h@EPUq}5JKL9985 +7v|J5*gzr@ytuasxP?(Y0JXU3Rhlz|VV;A@QO&3#_4D_&L9r-roRwfD|XuT}P3mFs3n+vz>qN*~^X?i#HfJZjQ})&n2h2{3`zD!ig +azJ9eMgnN`$rRkwUoorN~S9!2;-2Dh4h$D<>+;TeQ5bhVGO_$LQiD% +u{S_DL+iMDQaL#|$$?I%5n=gD!UzdpmrFKRl75>#74Ges@RTo}8XFy*>}Zq0of8_OrpnFr;cD^{Vyep +7;rKd6zZy6g&u-)CuR`q4O&V9+%<7)iwPeBexXBUS@5I-P2rZvaS%D{$0rUDi)7n;+~!l#A%sKaq;OG +?~|odDJY2oz${U93A_tDr$d96s37ZNsT|m}#H8|VXUYtIj9v89*Cvaf+b12rNY_Xuz5wsIr*}Cp3NdxVkc$^ih8C&;Xh|h+2`!nb0lzE9)gwV*6Psj!$nCY>N +Of*FRlxrmNNX{oxb&SIb+iXSG2HFaqhX)U>#c@~JTEUI36Pw6(SKvPa5ztVpXl2w%b?AY$q8`p+&fX^q89x%^mUa!ir7Q5Q7P@IDF$`g$@cWUZVOQ+n6aS5)<_f^h|(F+$zb<)0jX{rp>}NHUx8d9~6MI__A +kZp*W26{>g$(1-$7@tz|GA#9*wq*fcTa=-}X&s>o^e;}`h%!v-{C%j4R5G7wT@9^Zd$^K^*Wu%|^38I_0oRurOr>a8#4| +$4XQJDR+~P|jux$*Pt;^{q%GXgWA#1MlCFyqDaDkdEMX|HJ|3fd8jn?MorTrje*sWS0|XQR000O8%K% +wh000000ssI2000008vpc!Jc4cm4Z*nhbWNu+EOi4pUPE$oLZDh4l&2rl|5WeFnc5;em7$vcLYEKXeN +tjZk0)SR@q)8~o3`uwh$R59acOkh}>T@qP#NGY=c9*(3uB +#B=wxO>WzQ^JWV;k-4+9A9Lowh@$*9Oqk-2y7>(iByvcC;ji-v5e*M +?dt~F!}eUl)sCClw2Paa=*fZrE5VK9_-ZPS4)S1T1Fo&oa4cJLrjO~21hIqP6{OWV|<}&x!e(iC)?2> +;hdxMn(2h5^D%{Rc40PBgRWO*&y@gt?^Jy+3sJ!G0A?c~uXhI}*Bb+yx-5j!z^ekkRz}HXV``<@C$4e +wQ!4Q40OIFP39X@4Ah)|xA{e48UKuHL2C~Y_rjXS-0|bDoHmsCeX|T=ISt9*72K5TILggF$$(OQ}=8* +VS(p1E?sukm~F?$j3DksWk7FuS^n;lon4alYmcxLP)fcm1u-R;g; +XLpWas^rV{)jk%$VMZT;c=65NL+0Lw3Q`;zxr`ScHOa`5L`_{ul{dB4HE>?j&!N*pg<@6aWAK2ms3fSz7}a@w*=Z003kI000~S003}la4% +nWWo~3|axZCQZecH9UukY>bYEXCaCvo+u};J=42JhUMbrr-#Dv%w;9y|k1rV~*)NRA1c9o_lczdFx=_ +PliQ~dp@WBKbWkK$gjMWM%utrItu@ZbCE$McJB^_#V9?>3Z|bdpB52X1jUnam>mABp)|5V6VGZub +%e%0k=MiTG#~*VbEru>Ee$9h8%=2Q?5ZPmDwZuOKSVquozF}5%i`vTN3b}`DS|M(e<%$7y~8+Xp%WOS +-VHgQoz>KD!EM!rE&Fv?Nj=VK)f))irKa`bB-K&&2(5H7-32(Ioi!6cRRKt20K}8{4A0hCTE|K1!e9< +daN+AezIse?G?}Wi%aUw1OML0GOm{karwK%>sfu1xb+yhEEJe>udP1f4UCJfR)t5;j-$!57A5cpJ1QY +-O00;of09jign_y2m0{{SC4FCWc0001RX>c!Jc4cm4Z*nhbWNu+EV{c?-V=i!cFFk?wQMOFIxcir%@CYoN7(p+Rzi9K<*CdVMOpLp$ZNY4ZOlAsG)~ +M8w?C=eA*q*XN(_Km^dZ-uYF###f<@-5hl!~w`Lz!1x50#RchJxQIu(DOOWiI3*FSVE>L=9vZSKqwyy +DypYd*9NwuOT@rF~(tK&^b5T0MjTz7IB=BNh=@7A!VzUW`u+Ae@2^{_-6EK60*IsDz0`dw`nM(qQ8m<@|;;0%e(AVs)KS +BpAktSppI84RI8u{v?E3^1m&~&VcKNTk@>6tJ!x8q>~K+TOOiiV$_wllGC~dQ6?U=6ZcNjVNa~}?LeK ++y(u|}#;Eqjd2?;#JLH|jaITqIlJh;p_me?Vb9W~~#`#wiPCO$ed%dDWWA3^F=@1XP4l<`U1_j4(7Ze +1E5hxhJSoiaJ4=8x@7@IgC*j8Yg32mq-Jkn-1$+U05(y^n+2qH1n1!HmgK(O){sPaF6%A;dS^H(q>-0 +QHuJTz(~t$7a`?E>-1D4?q^iW$TUw}WP3rOvyoa2sk=8K`~)TK-1Wv-+wQYBW$)Eaz1t3cHdgg08>;i +^G!jo<8d?#;2l^Vc_kMqJjeyRtoxjGI`a3l#ue76cBaJLu1KC!5W*|SGFPfb!h7M^E3~;|Ay@$a>EY) +BDD9ng;}qurrS%{sJOS(6AwV$ifdQeYuA-&w?#t{<*GmJw!(|J=KFFexMJFNe$bLM`UOx+0|XQR000O +8%K%why<-UJ#{d8TJOKaz8UO$QaA|NaUv_0~WN&gWX=H9;FJo_QaA9;VaCudaJ&VII42F0A3ehQnTq& +K73+l#}{RxUTaqB +pWdarXtt#XBMtw!aHbv#_6qXOaUX3qC1MP6r1+YHL&09KEW|&AXd1l5A*!P2}xMF=ddZw4Nyx11QY-O +00;of09jkUIKChD3jhGOGXMY>0001RX>c!Jc4cm4Z*nhbWNu+EV{dY0E^v9(8flN)Huk%J1*?9s5Zmx +v?q-lFkj$}7cQPrGNl>g~7_>~=%E*#dl;+r=|9#&hDT$;gAK9ea6_9vDk?%f9hU+xRaxx1!3-V4V-!f +MIRm5SC%-Njgw6n;PHOZgSFkTY%`E8nqNlc?2`4Gb&9XV%Eeh%j`t(OkMIL~OjWW4%b4orh2&S?k$ru +Sh+*AxcUvoHo!(;%XplQZ(XGo=xov1poRY!N=f(9C;``+cu7Rb)=*NzSJkgHIV70EjewEgsn +8p*@D<+)D6;8v^t;kf5u;l{~qi`GxR~Vs2i*@SmOI)TDZWOXJjZ>sUf6HUmVjltJc*s@yRH78Tm+~LK +;`s`w-v7$wN$n70qanvkckOpm`E=#_}SI$$iOH$frEW!Za8B@I31g`7T}rbF(CgPW8nNU+X5>9Et2zZ +aR=a_*ni<{1RVU#7{_4mum=~a>fk|d?5S)9Il-2RS*gg6Rs|04^WJ?-iK#jPKU?8|KSb5v(^+QmurRE +r_%Ey7BBNvSG=6cm@^iH^bq32;vBRC3*>B{{7gniwLTQyD;ja86LOms%s>oq(R{XG?h%k~7~xEaL8pR +@l{Jkg*RxG%iVwfli6gDA;BM`M91FT#CvFQ4dU@Rh85kX+)tE7m)-{a_s%ow +3*8bMG&GNl}dG9FIe-Coyb%LODPKq{(4C5ACnhVw_DCq?sSaj|9@#1Tnrj~r;sR)NlPNh1WJ)#@&&Ej +oi>VmjTAP}#zW +#zK}GbhD_T%4^S_U0W4;iuTo|qpL9Ext>Qf<*W<%1Qu@T@483cVYUNG9r^-Q$%G*y1B*q@*NFntp0R8 +SMG`x$ilZ?G2$*)0#NX2)bSna3*(Xk}731QK1rR(=vS>Wk^XDE?0R!Px=vCDl~( +vu_XlCaBZvw~XlO#*dMo^1D2PqPAaCh0uVS)_AFXOOD>p5~7HA)kWbz07^I#bU184d(lrxSmh-30v~c +wMa5Bm6L}sUy(41*b=OwmY +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 +*1Wfxw|qaKcWIO^f3h +oc^jdU)#LsfVW?o_cud;i-qG9-ex5>fxz}ryibqcH%dIahbs7Ih4fqDe$5vWI?9)WrU>Jg|% +pdNvG1nLo}N1z^odPM3GsYj$9k$PZ2v+*;qZ-C7f1~eOA)p!GqKqsKT1@}T=^p1;O1irb#69@z%fkYq +^CP>(=80`&;gBT$b(Jp%Oz)FV)jKs_S$h}0uek4Q +Zt^@!9XQjbVIBK3&WBT|oVoIg^JNIfF;h}0udk3>BZ^+?nsQIAAD67@*bBT^~lsCQ;$qNGWE#RBU6t|Ju>yk)FV@mOg%F7$kd}yk3u~P^(fS%P>(`A3iT+|qfn1RJqqEa~Q4dEw9QAP2!%+`MJskCL +)WcB^M?D<%aMZ(555^yk@rPsl;TV57#vhLHhhzNV7=Jj%ACB>dWBlP5e>lb;j`4?M{NWgXIL052@rPs +l;TV57#vhLHhhzNV7=Jj%ACB>dWBlP5e>lb;j`4?M{NWgXIL052@rPsl;TV57#vhLHhhzNV7=Jj%ACB +>dWBlP5e>lb;j`4?M{NWgXIL052@rPsl;TV57#vhLHhhzNV7=Jj%ACB>dWBlP5e>lb;j`4?M{NWgXIL +052@rPsl;TV57#vhLHhhzNV7=Jj%ACB>dWBlP5e>lb;j`4?M{NWgXIL052@rPsl;TV57#vhLHhhzNV7 +=Jj%ACB>dWBlP5e>lb;j`4?M{NcWdKPvU8)T2_5Nk3l^K^%&G+P>(@92K5-!V^EJlJtp;-)MHYQNj)a@nABrZk4Zfy^_b +LSQjbYJCiR%qV^WVvJr?y?)MHVPMLibvSkz-tk3~He^;pznQIADE7WG)vV^NPqJvQ~&)MHbRO+7aC*w +kZFk4-%`_1M&7Q;$tOHuc!lV^fdMHNJoP)o*_PH$VRU?|=H;&%gf7Z-4mXAAkJgcYpESKYm>J{eS*1{ +XhP@_5GiJ_a`6a=a2n*ef;zLPrpLL1HMB48qMxO%lH~y=Rr^T8a?#`ynpdE>R!%ZuW&FpDx3_?3KxT` +!p-2W@Gy8PybRt7KWv;+yPetX)NW^XJGI-H-A?UxX17zjo!RZwZfABowcDB9PVIJPw^zHp+3nSCZ+3g +N+ne29?e=E3SG&F0?bU8?c6+tk9L=et-I4bL2emtx-9haRW?)bQgBci_!rkDZ@HBWSybV4ANB_VvC># +w=3TK0h!uB>qH87e~QKgC|RaB{>NtINpWKt!SDp?gLt>R<~CRH$*f=R15SrsR(;$(IwwL6*JN$pN%cU +HTtHMs*rh0X4)c4xCYtKHe`&T4lyyR+Jz&F-vrXR|x2-P!CeYIiZai`rex?xJ=Vv%9F>#q2I>cQKFE7 +WR(73|5aV=CMUR_VKm%5KCb*u&RO846JHkHIJ?8vDGZ8Dpj+Wr0Gl2?A}f9-K=(+Rzov7P3d&gyQ|*a +=yavi?U7v{*^N$DI^Fc{YDqVT=*n`KutS9%))WkF3WhZWLz{wO1D8p)RH|iCEp^Rh4zW}!3kq&rCh)ep+*+60>T)ajZFRY|F1NiqTi=~+!ft)%x4rXQ_1> +oUR=c;^eN@uMYwY8rv5d+x8q27Uv>?Z8kmD`L@fzfK3v#YB0$Z!;r?Q++6Xut~+gNU8xwpa6n0^`SM0sQ +|@v%gSPg;TKk}_eX!O(Xloy=wGZ0b2W#zvw)VkV`=G6Tu+~0kYagt&58B!XYwfT13w+GLqXycLHk +_ugJ@SaNMRTjDQE#-UH)_-yE$WRL^+t<&qei{aqTZ-cZ?vd4YSbGo>Wv!pMvHo*M!nIZ-l&co&5@%za +x_Pd>d4We-l$P;H2;q3-?5n8MeR1Xk45b+X1Bf#v6$Ue?XG5bRl6-1j#VwG_Qc(Avqv_S%3|cGF>-7sRZ{~kbdF7>YG$`a)Ulb}P3>-GcUQYD(2g2tM+>y02HMdA?Wlov>}GdYySv% +l)$VR~Yy2H8{*D@d$8L6O-w=n{J=E@Db`Q0CnB7C|9%lDYyRF}eL+u`Bw+8Xig7`Sp?qPOMwR?JlgTm +3^q;NL4C|nJ03U`Bt!qZ@Ft8A2UyJUfv39G$pTqf*NVV4QJR9NeGqV_w{`kko#PPBd}YQGb$--+7qMC +*5=_B+w~ov8gzw0vy8|JJI@`sQpf~ekW?b6RqEg+V4c`ccS(?@tEC5?Y8bHYIhWEO +cHfW5|7z^)NUK9L>;O`>%5{4RiX`5q7GG}4ONm3Rgw)=k`7gp4ONm3Rgw)=k`7gp4ONm3Rgw)=k`7gp +4ONm3Rgw)=k`7gp4ONm3Rgw)=k`7gp4ONm3Rgw)=k`7gp4ONm3Rgw)=k`7gp4ONm3Rgw)=k`7gp4ONm +3Rgw)=k`7gp4ONm3Rgw)=k`7gp4ONm3Rgw)=k`7gp4ONm3Rgw)=k`7gp4ONm3Rg%pnCY?=8Ps8>~Ra& +-WGf+uqppx~jN!!?DZEVsuHch))+t_4nY?`XcG)<;zVzVu2OJkbsElx-7{kcezom`#0!8*#w@wq%}n3 +(g^BIhEVK(CI~?{1}+GD46%tH)L&n@_FE*FL(J|^NB*I*zm1rr)v|HucD1ovG$~Bdtwunu +d41-qrp18T+L5v7E5X|SVOs5o53;+s_l7b)xM!x-_UgayV)a~hUG0kc+(iUnO03_SewnTwz?F4YNzS& +ty!4Zbf&V|Ol8x#$2PpdL18mc!S-EUG;{l=F+`igU{SDHhu*Y9x5?XA)84ghvqbx}cFYnTG_|u +0mPdB$V7m4s-FlM#8VWzcb|+GGYu39Lmfb(X_Mle>Z*Wl99;pjZJye6c!qecT@WZm}%tE(mm9C3K-R4 +iaPLy<8_UXFp(~~_i=_Ac!yAH^@jgGo{Y&VbXI^OB#v0Vo?-8{Cd$9D7Bt{&UXW4ngs-NN#&9^1`hyE +fF_Jho50+B~*TwcFb7uCwLcJhrRHcJtV-&11I!YH0H~%r%F)<}lYBuch##;852b=9)uYbC_!mbQMNpwV|!% +umz~0qv&D7<9p^iL;!5WAR8`TYMdWQ|)hB~qhFJD6)d02} +)v_&4~$U`03dg#|w*PO4%z^Se|-6QN&*PP~>Q=M&^vrTojX>+DioozarH#_EMrmoyF +RS^bHNR}ded)B}vW{`7Lo9QM)kN6U>?RrvFPni{I!mz^xErrNw(IGrPbY#!6`fp7Oy&%_HlH=!K( +6gbUc47SU4KT9!sP;p(@-A#!Vi(kH)dbQlpM84<1_{JaH*(H_Hk2FU<>c}?ueCh~e_037o{%{`q*W}JW8e23-XUosTcFK)RSj{79L4|3AH +<-U02H~DJUBf;rQt|M}P{4<=nN2E*+vu9}Hj<<9fKXIRF_nElQwEG}Q$3HE)3)->XvNs$VlFqJA$c22 +~92bzBX9HRn8t~7QN@T*sr*m*wU$t9453c>|E!*`PnLB%9UEaWtU9XF;Hu?JAUWNR+XX@0IpgB+Wj=O +@i$YTCbV1Icg;#?`Jb1B|%+{bh)1Nbu|a>6=RI!Vc7G)NeMvpk-qYDA;vV(6<5~1~1O7Qo&!MrM +v+(Bq!#j%G`!dn~&u9MEOpd-4r2tjOoxR;+x5( +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 +>m#@R;7`~5{O3o_CG8?=pXLB-# +zo;M;`je@1N`&uC@N-KmOCY{lf9?Fmnja=V{PVxCZINh;MOz};Qqh))w +ytQ)MO#m_^+j7D+Dg$@iMCp_HKMImeI+|k^c~j-WTd(>Qhgbz&Wu!V +Myfj_)t|BI&sdH~)t|BI&sg)t^a6T$x0wF;{I&w#dbgv_KhDd%Lxhq6^*O8xwNdG!=cZd|%k$(!2@;Y))h*Z~+dqbqYj@%a_&2{Ad5NWR?4}@l>a~ +*jwM7(_dIYhjC9tsgJpNB)l%jc00@$&guh8cshRT`(OG){L)Vt+D$~$arlH%4#$1_( +TnQ>yg36U?$W?#lsy}nppSkMKT=i$J`ZHJknX7@HtAU@ZfuE~^pR0l2Tk6mMH*AblW2_nz)tIWrOf_~ +@W3C!|sD5woap}E}I7GbnL5tcHPkuDSy#H}(E`(Iim#XJW)AMhIn0Gv)5b@m~x@D#6{?hw|( +fp(9(-5sKN`2#f!$jSyOkL$&!%todA@3W0@_Gn)@qF?|2zmK@@@5Em_wbV)A>`%r$<7e+4&o=fLdbiF +pLlsp`9<*`-!H1X@A=8w;p_M@@X4=3$Pa=~-U%VUJosdH2>G$_$(|7M1L2dsA>>EFC+~)kUm|?+UI5h +?2>U_^17Uv%VIUj`Aq<3rA%ubOeh6V8d=Nqy2p@)!nyxh@btr@&sly=zNgW9xNa|<^K~kZ9sUfLjAp} +Vs51}PV)ys>laFx|4E!rq8+9*TSC_~jKL)9ol)hKn@sQz!1ciJcm)hO?@QQEOl#;H->exr<2qf}t4`m +wGt?JKK^=GU4vsL}ss{U+Mf3~VWTh*Vf>d#j7XVmek3i))FFxAgd$E%M|Hxj1$JL-4^^66uQseX?-UU_`_1YxTGqmEY`pFTyHl0($-O5@Wlgh_cskjFEG +NqIz&$FB&J@`xah=LnPXh#-#_2$S-NAdi;_lk$ilkCzFP@`xah?Sx5rM3Bd;gh_eCkVoiPMX{7e40(i +3RTN8k#E?hmP(`tnM+|v{&TSM+dBl)M=Y(4hkr$;d(!L(rk~6va +}|i5K+UzagC?Lk&^lC4G0uBS#5j8u~_&3^GIsWcm?dQl^Rbj6MzBpD0mgB}%+k^l9k&M2RvlQQ|$KPe +ZpSN|c$267RR(`)~9ih%tP&jxc4hBSaWJ3zw)-sw{Ve_`+u!2vZh3LUiG?aFrgV%92NjEqpl_a{Cd&3 +!jl?Nu?%3aN#quEU6se2rYa@mL-(~9D#+;$g*T|d?T#z8CjN0YBB^BJ|oML$x)Ax!e?YzGCArIQ22~2 +OC~iL!U>;|Wyz#GGRT80OD5%!K^|mTGAWNP5fJjk- +hctO;KJjk-hxIxr~JjejZ_(9Z#JjejZI6{;|9^uM4lJSHnhdjbnb0p&mQ4V>KRgm$8D2F^qnaVgrlw& +FVF=1Y9eMS~Th8?2ZTa3@hV&u|dR)N0>PjgzE6`(75G| +B^6i(fi(_pY$~5lna@zf(zOALOw~lvoD3*hmc9H^}Uc!hQwmj_w(;_?ntQ*`(C@9Bwf|_v*~0=+C_ai +oB9wW>6pR`@^i8|GJFyhm`>DhGK>-xm`-GKWH==%d{2M5mM}~w>ghsGrvk1SDS$%ixWf1U=VV<9X*za +Yy|OL5k|$G&)xFgcw-zkjinFgcw-y??QdFlm>-t$#tzb1j{<#w)TfNRdf;J!G-IDJjftPT0Uz1Xumy7*@{~9BN-$~ +vq!D($IodQ*}@=@d)uNnNg+w{J!;XLVVEeABz)AOH%Wy_GCpe2oBYPAH)D|UCqhy_mZW?PQvO6}^kPZ +M#~|fTgkEnfN%J_Q&@oW6Ac%VEa#moJ= +g){upfkiI9_tCEFi^?LQGNePYS>$6)(Ugp(4|3tXxh$Y(}gY7>N`n<7Z`(v>EC&DE~EZP1TZ2 +yUH@e)h6KL*=>A~Y+pWcy>V{hz-=n3MNnw40x{V~}76QNm&CEFi^?LQHkl~}UvVsR@+U&G5=&A(1}T3cBbJ1D +48r{L&|iv^29FB!W8y^i00{GwAz>a%!aN3H{&~2XijkE6B`IXk=3j<%LX5=xlcf4nIRcTEf0CahM<7` +9lcf43YaW9&KN+&-v1H9-u;wR8Lrc~?F8v4$w->}%ww)wlV%ZihK4Pre!esrp1W6J4FEN&GCqqvqF0p +_nf1$i#W`2zITbO_!%jH{Ko20rhv=Y~SfHX+z0${ktjh7b;--F>IKdvi)lWDGf%E9dZ@g2-0SJ~J}j#wzEAvj|NJL{Jg0G*x>W80NO~(|?Iyhppcqi#%uj{+kqJ0+iWnz7ucS_eZbky;{8X4dnSePz6*?P +8D7JpuJCp6k*cG6c5+s3CQ +nLAyJrs{60m}0{ML^%;QY@kQNQzKBN@}rjow*!A^yiF9CHCieSa_d5}oUC5!9;u|72Qzy*T&yO@ljd0iewIfnGNrkH!P4@aN3Jw~FSuHk3$mqoRLOMd +1o_gZ!v%Lz%l*d4l|CIVxRY9%4&+In4j0@>t=#JbJnrdm!JSARH-R^HI^=N^$>Sz)#7>9)TOxVf1Wwr +LaDA6(Ck#C9>2SfFNFFxk9(SIpyY9r7BhzQaJzzjYat +byw=(HE0V~Y&uU)}1$sFtitng|6HMuFj?XU30kPTTJ$qFZ}w>7`zJG>NrOE#+Y+UvKWjY`1+p9y15X~ +)arOh_E2;DXQi$kUX=n*Z?~*0kf*;+b%zk%DSI69%@@ju-WraD|kDa6S`;x6+Om_?b}cr=XqBgh8&f< +Hdd^RGcZu=QAO7lXko*I}@tU6cqHCFyNJT{J=O9D$x{t@tKfqOgnyHoC#HF3fB0mFv6TheqekRI*}>3 + +Qy(A7!7JD&+%mNdrv3th<+?DLt>l}uyIztELT!9kx1UCA`Y{0m*H6ioD)aN(B5n17+WmV%Ey6E4xx81 +pY=3R78)CPhBynb4IOLM*_zXKG`S(@!V`5mBe&eA;Z$?rf +iwZl0ug?C{i#xXGx*UA`~e&owKCSWg +UtXDU@ePq01D?6e*NvNud`~9tg#qC50{vQ>2K(oh5}{N_ijxca{`-DdmCK+gVcRvNA=Au-jQu=rZn>q +AbN(Qs}ZUMT$hrv!u{vqGgJD6lY1H%W4#9rD6mrDp8yxC$&;RsuWcy&XIdssl3M&6)4V;V_GSGAVsF= +IdVxW#Sf$?5OI#2(Msh#rYH_^j@-~nv7IUMP|uMAD)UfNFq-Gc_|$R^fXh5b#;2BZ04(M?GCsAO1K=; +uk@1oIWeWcC92paxcvS#2g&xcNbCNo(xu +$SjOkul{Q_W$_KVJ1^#Gw_z@LvAFKDY6+D%kv>ClF1a=3|!^;kPpdZifjg!@_e`|%4CXc27dBDoLx!i +)D$%ME}GNzdE>sxs&(7#$l}(KDni?hZp=PLt8hR`H}{gi^w#BYUUv}{xV +%ZAUZUS_6sVuSmme3Xtk_+vbjGesn9e(@G;bcsvfHVWVJ>s=^HQb6<(2&1R{pMBr1WB0npwu|dWotq+ +)L%PnJf;SsXpsv@^`!Pcf0D_da|r}Pga=j_0^p2HL^Unq!{|BsdHt=b60kRdby8M{a1E8ukZr+3kolR +Z&P>${B?!bz~4}K1AMo_Tj1{rTuP=d%a-?LNszuw5bnzeQeRj9mXV--p(}7J0neEWVSzpYX}dcTsj)g`&uuVpE7(1BNWy?$jEjRDkty|U{Kh07AOB7aw&;ZtDEbLH&=SKbbLx=7@=%U +XK{);d?-KBRt2`CElN-KR*@>?q{sz#>svqL6j;id4a7CtUNMWqO+s}*MG +uGhk7ZeU_@b)%^%f8E|`fl1|TZJ=K3S(2=-mTtJ&P#c~N|DR)B(ok0X>|%|bqaY5MIo(DA&-|Rq}3^; +)hVRaDWugYq}3@(`E4?=T1cx?NUKv+>X?f{TAiYjzbmayQOW+5>zAUI{UG&!A@zSD^?%Vyxyc|v*->k +=Qre1A+KN)zin62hRw->oDQ!h5ZAB?>*n@1~SGxs*D&lsdVTI=P +e;Gs{eQH>L5Q_q={(4;`FgJm@`dC|tjRlyFz}uGD;`+{jq=q|~J5E2ZWuC1X+clqD^tzg^1Wbfr8nr< +D0nr9AVd?8}iOPrWH+1-G)0vsfk&m4zIUvNBp($oG{e!<16{mZiM5Ql3gF6ERBZ^OrKAqLkXVl-jqH+ +P9SJgHo;!N~wKI$vjjY^$wNPl2u3bStYe(6{#^yA +>d8v#$x3pjRim&H75_1Xq%6sHFC*r1q<%_N%1dS4qFGlD=FeeYr| +%lS=w>m1GbqsZA=WO)9BPDydB>nb1_#a_q>Yp{iEvfJ*v(mGt{6sd=hajt7~oq&bM05w_27ssO6fhmYzv1J(F6Vu2=Wvw@D7XmZ_*6T{Xube}5rSxQ7DKD|E<#>=~DQh|3YFUu7Zlv7g9IE9Us^!r@wTvk>a_!U@F6!`8R}O{o- +A0}*-6X2_8d>+LkYKAm2g}o`1kKM@R^#;|Ft{i>p$`R`6 +={mR5UeGEWMbgNb)ySFENK4j8OV-F)*vQo6Msnee^oyHXS>DEQ;YW5~ITB_%HHHgc!o%E@Mn(!7IWt> +ng<9mKU6~8h*jkyC)*@-*%CU7GFqINedX +Bm>MnVLm|5l@ds*Ejd#($@_So7h$HUZ-R-WM8c9o;h%B^#4Ze+9n%CT^ow(>;f7D4glyTaggi?H~W;| +H!B57ReV1jd(e_Y>k0L^h8fRCwRw`X^-X;0ywNm!vpa)ato%{Fg$0ec4a)Y~EIq5-qCUTsgi?Jwc9P> +|DBX{B?1cBp=$s^#3k(mmI^`D|F@fZgrO&!=(|_(_##l`W!tuh9!;BR`Oc852LM>X^c8j*F_yk=tLcC +N|}G3>P2^C?u=`$aTAqu?#M+>)X^o%JIDYZ%uuQBj;>}L$+$;!gClEV>FGzYboHZHuJ5B*7Ljw!%4WJ +|S;sui^qXY*P2?&+isdptisiZEu37)KjM_x8tO^#zGQJYUGQbjDD+MX8)_qb+S;o?xan1ToYAtCWZD^AjYCC}NPc4y>9>|FlWUgqEXkERiV}SyP9hIwkFM1#|A*g +|Jln2I@rEp$SXshKm_LMN46tD5sYN@pb{Mh|VFlPpYaoxv79ORtraDb<>|D;NE)S)aEhN&Bd)JGI+NC +6Mbk$@S35^(mCOOh|}wnW+}#nOclRxmI4e^z&S^KC3C0Q!me@63BD?CVCL(l2UZd@+ga3Cgeo9WZqn} +oFKV8P}nugt9x3Oy^fS+PoGrVTTZ+Q3#Gbd`8mCgDytgxWd5aV*6$tbt8+PGdp9_AONNi4o<7s2r&UZ +}_h3JghN!RKyB{lZB2e^dX3^>A70v~ua$62W9 +UnTgtHKrxD(vJy?__=V5*_JP>6Ju0{#o$Xqo{LEm6j-sl-NDOA^FvSXmXa+NMC{=|D +!h;z)sHZ|nn!(KTjOIY;Xu}G{X$CVdG73+0hR)clP^M-uLq}Fss3ts^p~DQT{z@z23f#(Ih7M4yP+?{ +;6V~%{XbY4MxvB~y-`5y5@}=Xhs=~-O+$rc#BVQhjg^_Q#ThO6KzH|guRT%k(I|dzUv#7hC2uyYUE3YW>uw;FRiSq(#V%qR#j=_ODn6YH1 +egDRaF}KvTiJmd}(D>l}5fFGHT>YC(~A?k?$c!jeO~#uBtThrBiCFQhF{`X+%foa#f`f9b19Yh>lL^s +x%o=X?m{G{#GT^h$0=Kk7{g4zLhcmp`XyCtFbTnCyYsts>TsJw=?F)X_$r)P64luGJb0fRz8ZU<2k(=^S7Y}x&j +5rRF +wZmx7f61I&SQNh5@xO$Hu(^Z|3>cia?Nno4v{`>b +XcQ7C9}aH8V!xCW#*bOJr9wn8(GfGHNyZO3JaP!R3B-Ll4gTLVNElK>QlxeBPSXbjjU_tnvI-@QETKz +IM;0CL>8iv)y-V9krTO8jVy5HnvI;uF>YjyGuLe7L=JN!%bdApBPUYZjjVL$nvI-DCpS7g+Qddqd>*{ +4cjlUnocKui>5^yD-t#IPpyD2AMgX5TFYBqfW-|i#$az^(%{7}5z^Bg3s%oy;i~v4(UKUn!&1MAf+4H +itnrk*AfRCToG)9w{5kS_uk!J +Wm-;|krP`!SxwC~8#%G%%e0&fMR1rcpHBE{G9xFpd~z#x)O3xU*z)P5%%*GP#FkGUJ>!~krUe|c>s-THgaP7B+sC6%|=dapEL*1bd8+YKFO14T(glA+b4M#P1NK@PHdlKQoU<7a$@@=kEC(UMow +&>7uzl*?_>k&o70y&~55x#K!j`Y6M*xoX8608DClB_C8l3DiIKq}sR;qN(7 +y(Dv^2steQDagqjz5SDY)p28FbA?Ug=+@?$aY7bjT1E{ +VS%=XIaK$O$y7MPc1P|pi5iolaD?rS++i3sCO6>-+a0;p&^4RU%yvf}mE)StXlA=3Ps?%5W;CmbW?xn{`eC|ie0%c+8#juW?!ZREuENuJ9SHI0!I+b4N6k83t^V*4aZ=elMi +C$>-WfF9RuzRam_|fY@cKy@2F{woV2B8Ov+>|$%eM{^X|Y;k7yV2;eAsX#E83k&r}Eza#8%#oFBO)zPWvJqOG-94BiW7+DRJF +VUi)|zO|97QeL$n*|bqt*m%<|uC2My7YjD77YbGe?QvZDe|fY*QP_jTEik%+s1^#2lqQx3T#`(&McOO +3YE}a~qp4Bz4}J*u)&AKDV*?LelE32~o^Z7G@h8`IB;Q^)98>ko|L%QP3u)8_11s4d*{c2?uRrx`A|B +YpDM@N;zl~(+#BBS`z`7`;bx74W!{(z5S|9^)xUP`!QA$NCO-kV6*=_@eI%8_MA2|-^5c}mKKWI%zO;bX}ur5Mb6sb82Ov6-tyHNe)ky9_^$b4p7D +m}J;pP>Yd)N3ykUEf@r>`9@8=nBNZ(^TXwu +NgYR>VEX(<4{zT1^#k4>I&9F-I3sam`*}r)k~R=8~>zb1$gV;i;(()Z^69x^rt!k?Ultxi~jN;qVLR) ++rpjFy>|y4i|B5y~2?kJ2$Ivc#Crz6pr+{xsAZ59O-x!&b4t*?%kwk`#0&?;wC*?-lS)%oAhjblb&sE +(zC7XS&tjKcFlB<3EI-`~5*_xE +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 +9R-qO#f3M$wy%<%FDRg) +HGcxj9(_9AgHMjiWw8Mf=FWWO-OmK(L~7iM_1fNJ&&Gwczfp8diMFPu@)eqn|e&Zud>FvE*ql!IEBp| +qH|fqZA!BSclGg&AJMG?4EM1)<{x@||J7yfyOWwO(uF%N}rR( +Gasb}+eydh@EvXYSvLOcDtpb0`@k6~#Cq +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 +2Zr|Sw<)THQLPHCbHy4&xO3BL!lX-WGjhex +zU>;)8s9E$n-oVXYAJrb^ +`9SYBFmd6IT|KUdNNpSy*Z?F`={f`dvJOcMWevGwfZssq~GI0NsjjS1Rq3~4Eg?&*#L0=BdR>v_QCy+ +-{koV?qBJ4bAZ-SmJzuB;m52u!2K^i#r7B6|Khvc&*1(?`*`ky`yUC80^I-Aqr9Rw2WY*_o{Tv_OL#K +o0Id(%(t-P5T+2Qoxc?ENpwlaYRX9`DJr|tJGijMXa;_c`eT9)TBl;Pd;XU!r&mJiB +&2aJzRI3VWjHtX+)(&w@d(d-RDK#gE#3;6;W?HdYCnx$XKu4HD{HpwNG6?#6#>dW4QJU$Lj9-3P2A6@ +|1^1tX9@~H4cGEJqXN|Meg0nLn=XFD_6QZA#&ZINXD&1YDnTvIGLM8xP>Zjzbw(*DwMs=TsL58I`zQu +A+{79f)u4t?vuBQ4P{aMaPC+H8#TS{eK_RHc?L50tt!eR%FwW^vc;*MibK$u?&EJbsO`{jsQ$?kw(J{ +8aDAY85lY0Yon#OOk21c2tiC}C{q-pZ9cq{1VCt1g$K-1z8w)-g0G<-UY>N^zkcO%bGlx7B$jhT#-7xNV|p{3jO>M&$8CUM0i}G6w_$8xYx^fw1?O1NU4F +pZwzRSZfnjn=WwK>?=mULgg!YGK;9t#>1PjE +hhc5_J<#4wJ!qLOm$)PJ`BC>0S%wF<+H@yZ}g_C97bJa!=*K8+3^5jES5(pzt=;SwtBFwmzXs`ldsLcJMpAigP7p8SO6id=s@mxbjl3Q9JjJ&v!!sZ3S$cxYM>_-@RksZ$hVdOPJT10ItIBQG9eTYxa~;+%LZXv$gcXM~YQn`j|bAlN&4TKqCJ?=Po`z_vlLyGzS|ZE)m}ZsOA3T)ha32Pa$`MNt0Po<^*GNFgldPgJXR5^9c~c!!g@ZzizI|42An;DM=_UyLYyM +sn1m44A!v=xbNk$NOc$E7YLEzyrBF_p0frrOg%OME7NGG2=6n1%*?FE9si|bjRAPB5{7zBYAXNkrrOb +}RjI3@_pL6rhQ;6>Ul}>oECmw;evb9F2?D>wZ)JkOoUB?P2)wwBLgEF2z>8wVh9L0bU +bYAb0*l0x0zqIw*cS)_FCGe;}8TMy~r9ELEzDgL_-!P2rM`T69j&lC5RyKh_`eU2m+6`i(iJ{wVmw +|g21CUnZ!a6c=V3wNyt}tk|tEUU-Ts8`vHG1Lbb{ZMW}W($KF0dwaSx3sCN7m>kWiz$F#Y~q43JK^ZZ +4qcD$2kC_=U4T|DX#s#Sg_Lbc;}*egS*R`D+g)sC5>E)c3!9&EW%5@mrN_+1{c2- +Pa@*Mw^4_eltGz5`!1_lL~F0EWk(3n+N*1M;2~Q3hn`!Q#UJR_l!JDlvsnV9%?snn*3p8m!g2NExw)HEU>T{RMXuS;x{EJ;O~$ +Q^WQ3-~cC(8Iz9!PH1ap6pe7F+Z%`VcIEeP$QQ?<<$LnI%i$e`L&S(Tl&nNT#ktc)-Dw9#kSeaPik)&#C+CsSCs}G?0OkUu$5pY9-@U{3``R%+D$qf__fH5cTs4*0UOMf{QPzySyrOQ%Jy&^;QK#)-NjqZ>&m9WR^p8T0yVPBnv~MXG@_bvtkms)z40*nzV94{iugT< +>hz+>OK@L=j;D8$q0&Yxi3E0eAq394FxJ=8Z5&?kANSW^+}8}bBA*{W~IWiqv;zM(afDFF2i5vit1(>D}bF=d#(p(U@Wv-AylX{M0UH? +%M@m6E<8x73tE`i8<+rqcj;~Q=6wT;H!ln<-rP^fOYf*RuM8~Syf(0Sa}30H)SI^k<~K*WorC$!QU +2x9Zt>>GySuboJR2)w2a9K?1{TkTy!VK1!HW3O9`$UFuKIDv`=I*q+ +Q8z+8w2xj!0PbvNXFMBNQ}A5nLEd0&21-Q5^ie0OVL?o=$-FFz`tjpe$7d4^)S?qHswSgv1QCteN9^~>w +jvoiyWXLk)Op6%s*d4{cbg=M>gxl^%hcd&T#!oZ?aOTd?DAyHx3?qKoVwSmQVHwG5p4SBB@ABJVTgZa +a-jCU}97!v(1uNQBQ<-CLW&9R(!Fuyr+{Vva{H}4u)ym@Y5@#c{Cta|glfyJ8_1{QA)d2di}UKv=td2 +L|v=8*RW_2#XC`OVF;euH>(=k8f6Z +1bmCaW8hCKJOTcUc>k{P|1S|uP$3i1!4y!fx@J)%Mg(#Z9ZV~(3dx9aY0|YzDjw=x&&&Zzw$*aGBDxLB^r8-PS)4&xXC&AjTRp4;{>7t!MlL_2b4r5M!-p{R8pc)<59yM*5*N8OT3$R+c{ugs+47! +;pa}jWALW9n2rrH~xY6u)gsR)Q1^;F1(Ar(dWXu=o@`5yoKlEoUd`xp^=d|+t5>u7 +oL>!exr6!D3aiig)e57}#j6!YpNm&3tUed7X7#yvHKWhf-H^9pgOHXe*&yU4N;U}50Lca+Gf}cZNKKS +kUKd=7tDY4{xV?5=^uvmtNA1|dyRvO&mGlyp +yN_#E}-khh|HO2g-&UxidiNd;AgDN=VE&p`AjvL +Pi~gLFvA)>MWm5c6KRo>P(fa#BvgBFK!Cln7EIrNe~ONC$JbAaE)<52Qv)&I6HE2eZRe8|Fa$cxhnq-IamGcSGLFpF(Wb!Q#7N +DU{RFn8=>E8%1rTUxDbZ^eY;>(i3-E&p_M_OQB4EV?6_LH!OuRfru_USlkUu@xHpdFtE5A@>aT~S(yo +L?EDt+%FJM6J%4^RM4;thYK`Zw?#BFHE6E@fx^WjMHV83ncY&gVQ10f^N5cO%LGF))|Br$<&PI#7dj= +MFL+VG=-Gzb0-S7_%s=G~mPu&gw;C*#>V_JS@%#6Aja_%F|1V(3`vU=+`2B|phP=fbt +4;h~%(2?U@5LOeP5fTWvD(D%#T=_m{9eqlI-W%`p?dS98q7@6{YL@q0DL +O#EKWF%!R6b8ISpFYY$$y&J_nR^jMi_h6G5px(=@B-K}8B&peJG6U4?HJJfw_L|H9HG5;LIe3DZ%m6i +eO=f_ay(Tk2&EB|P`MaByzq?)WyO9|nzZ;nW%5AEV8KC^48kqqq8>2>MfTBcdWCkcoq()|dqD1N>U$N +Jc-ip1J^jGe+V&xBmyan%2BQxOATbC)nvQFfNn>w>G8o_SWnPv3^zg1_JxDyOlof!vRkyv$R$vd&ytP +###zJNOx0o~;bxNEa13QzsQ6iX-cgo&>1RdN10vzb@2qo%kz^$ylrEA^gDIVecm5o#0dTY5 +E~(|wx{q*PbmW(28WVq$(9WdE6{-v&7f5cgXm9@Q`Or!Ek`V1l`FJ|Vofe1Z4{L*wbsoQmP8N0_W^sb +7m}o6qks70FYNn2P18r9?5s*{NTcisz|cFd5qV7fg<}l%|d9=|`A#p8g7`&ky8;E2h@=H(K?q!U53k( +NN4E>UT5zza9ot457NfaKic#t+_xwqMYIh)df?L0Cj#aN74I&YQ5lG}A>)_*mP@ +pMvuE!3dqFK=?cA|fBPq31tP*&!I&Qj3w)k#6UhzsP2^K*f5cdN9s5s=W!JGkV +XS){`&-6xyd+f*YCy^^tfhK&%`zv;pAf6l>Dwle6RH6%HNTeXfHYvG=GW5Z+$Qmz^<&0-hup%L?~p%d +EWeKZ55{`evH!_fA6+HBqX0@7Dt}%xWQ9VR~o2TUafCo>Ma~^Bu$UC-cgh=TGL9G0&f6w(bV=Co|(%yp0*hJb +$nc;!g>~9*F;qF~9%eKgdNywi+i-H`rA{rGy$3cK%Do{P_6a8S~@gKQrdX$KNm}YveRtKV$yee`C;(j +Q@o(KQjJT#{9_mKNzdzd*o&V3#%{Cg_qYV*z8_m4VBBoBbq$LO{}x|8k6u$I}RF?&rC&T8k2BLg-sfh5lkh18u`DAO`j<-nU^|T%D6aE=v-WZYB +*LJ+!C$F#VcsukT81r_Y{GGPrO%OTJEz+#W7iy7X^;e8}Z}6`PLv~e%F+VyZ#{7CFX3Q)3gfYLCNg4A +4K4Z)iGhN2~OvoAYK7EfdKSlbCdHK=$qK&-#XkF4qUVh}0wvk^vk>A-y-h1%=>a^#*8YeurkslefQfg +!GYLa)_A_?nO#{9_m31fa_+{Tz68Mia$N5&nD`H?|Ids`$%-Nl$689!yrj|?i<+ae$8pBVF6^&ZANYe +8jxTcknV$C#hl_cP{=%L9ZV`{_Z(y!`%|F)zP|81wRbm@zNEM;P<+`x#?ien0>JYx}kyIgTv7_x%+E_ +(cmZ7L}P5k(mbkkXe}t_($0AdUx&hW$dwMc4u~B7!q$oT_~zWin>u6N)$;^qsvGwjYgNz0J96M$z4$7 +>4EuWS7qh7#EI{VIH9r0em~aOWWS$iY_i{9YizRL-)L-#Y(<( +3#T40k3OE!~Xe&l#D5lWg$Pbn5;z+$}RDMf<}rLeD}I)+l%SJ4?mDeS8 +#i=h1u$P9`a9>4`IPwRYz)*{Q(I$wb*T%J~J?tt}#%hQUk9k +7^id0MfeLnShU5;=xSWCqm(dZJAO(t3VX* +oKelT2dp;SIinK>mKyGy)2|Tg40p~bLURBIy>m{#LaZ>{Ij3JCmKW}v(L)^87Vex;bm#zjd*_TUez2- +==bR$A2e98e=k#!aRew9@bQuD2eCM1tEY|z&oKqzC0PcK8A2d2(rQgmOZT42!S0~q2*jI790~Yx0=tC +WcR@heuJy`plGl~Nqu&!_Cj85CFu&++rt+207+pVy#PTN?^w{u3PZ7k&5Iiu4yR`KneQ8L;9tzqYk(# +Zy_-`hE(Q+`X&?ijG(Zs)9i!B}m#b5>_nEVbJ?tLsb18#`xp&c!0TowK_7#0tBevpOU5<#hx4Y3!WUB +`ex#?C7I%2XxceIjhq+^p>5oItQVb#?D!t#?eY+=d8{_eC^-R39IPT)CsF7ZEfg;Rdnv}gjIC%>4a5u +^67+Cbn@xARXSl6os&9Y6`hkhVHKT|Ix3|MXjbuC?XnQ6eycqejVgYtE!Cp~fUdjDk;{JiZ&ph!y^ThMyiRZ~X{yce~x +PRdOTqNvO*q&pj7c3?rTiJkH!B +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 +*qk=Q0Uf^eO33hjbd((Qt)0dWK +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 +ENu1cMNfNiYZznFK>?8d!+PBp8HkTc +eH`G~gsJGtGV7wtH$>a?|NG5LxIx=}fkdet7f{IMu5JY71hM*ynHv|cpydfyayqYOOc4u- +;H-y`kQELqqxvB~GL7nu=%k=CGb8_a{yaX&QcJaMSYp6K8dIL&lq24mm%=c{o&V)ct+p?Co%!wwVmqD +}H}Q&j1eB>HFzthq@ZM|4>n5_tRdP;kr-UpZLAditeiuwF5c@?0r?*2XuM1L=oGT|RcRm4DQ54h +(mtS5(B4;-P(Y`sy+4)q$4l&!I5ahU@01Ykt4TvZr;Ko4)n@^nQo?;zp9OTv3HMd;9?&T%+*ieWK&Py +5UzO(pozlX6Rh|cQ$_o!vZ5PlfF+5OpVLyWi^+46K0i8VOfhyhuI(g0mRlEmu@|*{%cn|30IS*7V8_> +yf9;o6ypp)l3P{n&dC;L8lnxK7-IvM!E6@pF%e((}OCjAvCw0*U}8;SC{)g*SvG7Tyq&S +a>@#fSnn@5RzDkLP%mk2qB3DA%r9rgbDc{U;(q>qj^=6P{(; +}0m%~u@A&Vnv266<^|#(6cqZ`c1kVNj7QqXF-yry0;5P~G1b&O)Uf^#NycD<|ifb$*4f +s0*uLZ7?OpT?a0e_d^t-#+S_(I_C6TB1nR4g2?x=-Q+)bP!{_-0*d)L6_KaGgQxOnR0sH|k7!mM%EzO +nR0sIqFP$mM%K#OnR0sJL*h&mM%Q%OnR0sJ?cz)mJ%caEyd +LG>bUEXalg@pXpemRjrN%y+4dV5&H?>MYhH3x +1YLUHizqzO~27oygtEB_PH64hwJp&Uzw4Zn~|8Ck(is2 +n46K9n~|8Ckyx0KSeTJmn2}f{>{XaCSeP+bm@!zGF<2yQTA0ztkIxF%&A2Q0h}_Rj51%LA*xdBhdE$4 +?OiIAS +DCY|%A9RgW`tH|gjQyRR*C$H)!}U1tjq|l%m}T_2(8Qrt<4Cn%?Pc{2(8U|R&B;HE4 +YBO4EGg@miTIjG@JMXwK02cWA*-_Z>QCsQ +(Ui3@yJyJwvPS(2}9`cWA}X<~y`zXiML1cF2Vu{?%iD@`nVTUh!l9fx*)|e(X;fJiX+{{*1xXTYl`%8 +9cq_$NnROr}zBWe`4_Tq96MU22XGLvH#5A=~X}WUl=^S>&N~pgWC!IZwy{c@b?+qP4Itba6iHSgTccD +|A4?b?EOC(4151C2E*PzWH9XgBL>6Xf5~9j`>z-bd;gfhu=h_G4151IgJJK#Vem8>EFZu8!{y^@WlXq +b8WL11-T+RuglhUaWT037R5j`iC=NqWjZ_0lmun0eh*i~6IDqN)+yP9t=MG@HJ$C@p?YRS(ZqFUSbbI +aqrrUD|Fx{Rzfa&(!0Zg~&4&Y==)lxWs>Gs?KOt8_K;y|>0huXnhg4VhNA5<@oUh_KV+|Pvgr?gz&?7i>W@i0a +gBV)z{Gu@{1ukjeV;ro__*&Ackpz5)R1AW{%0gu>SLAJ@#_2}j!qr2hO)Oq*3)(ULk_im`NS8?C)A?I +aK{uS%TwFoKXONoJJjSVz?2poa>&W+C&~9hPhP$EB7vtbU0r;Jz*B@SPb-=#z*CIwe$M`Siqh3vuMl{ +O)6FflmMp*}{#q^73UGz*Rx8Z{JVopJrE3J9Tzv10VhaO2`S|*ZS_>ZF$;nqws#WL#ot{%ep_bZwL +f$#5sr8eW2n>7QRD4c=CwuSRR#ZZOVejV@qZZ)F-s{iFJ4ao$zDnLXDy#KX_TiJg_b!vShU#kdq@wcz +JlT77Me!>EhP}^{5abf}kfRO?h4}jFyQ~z?Q4fWig17OTa(UC|&+wZHantJk#3#+gO?#(4<2O0^;7?x +SH+lIii`^&`h95r3)|^8{3=V_&sTg5Ri +c)yxaL1p34f@n#OL#!4?~rx6stCIf6M)|PQ0JSarU%HJb%M?stiq;xSy-3LsKR0uZ~6S@ml;O4n`fC# +G7y0#4l|*DbXx=q&Ew?@^@%D?wL&@QktIUvnCNK&A{((6Q0o4d;-uO^6TXO!(%7N{pby#cH0MV%C2g+ +eE_FHOYOD~;51mN-Sz>T1}U}MK7iBUq;}f}a2k}8AHZo4QoHQ~IF%1-w|xLv&IofnYMHz +_I)_2s-|(EBwV0M5T1K#yvz=U*o<_H|r)i9H)8C#n)2;Q??wXUo4GrN4#aN%#n(Ry!N(<|B+fJ +=ZQ@B{=He=i~Y02xE3~mb^E?KB#H-2xCLfwHIRIWW-_eb8#6u!Z7(c_RBFH{UW9SMi?eP7cYMpVVL|} +Oa+ZF_VV2RX*`P`aqtg6Wq%HnpO07Cjqqgh4trmSw>FP3?0q4o;YJ +uCej%P{2N?Xr>Hu3_b(7@g5y|Si5FCjFnmQ(y7{;B%5P!f3lM)+S4faR{#m_9>I3LMtE+L-gAsMde$>@3i_$q2*XYLEU1!{9 +dvjD8~rZ@fZs2euj}G^q3Ou#?N7~JHm#92L~cE +;<7?RQD8g&MkgH{Lis!YIbxxW)b)#{7U(TiAoJ`hfjn81n=2zOV~n^#MssrLg6@oDRkhy!9T!t!-8&%Pzxou@zx?ofHPxi*RuLDN?{>ZX5 +WrL{WXaN>_}K%C#4`7)~~)|-wmt%hGYS>tY7_x)LZCTzxoYfCD62feTuww?21^bHXtJmUGOc!h+tpD` +V^sK(768K%~u%?!B#Ej7-0yuXURy0EfVXqgwwztiS^m37Cb)bIDz9?$1kq!=V}16H$J)2`Wz`?u@7T? +jud*>h_Plg5O!j$&ylo>tr+W{k~t#wVyu5kz8jk{);}f52fH!W=gDLX+cDPXNuh@Q80#nFWhNsGPkM@ +^9_+|iKTZ4)TQb%c*rOqLy!kG%DE3aQpCRK3HczadCK(^QC)O9pV1)zM*UysS1P$-k7m2~q@&4e=57> +)=#h)W-4^8ja7YU1muJ`L_$w-N|_sh3QeSyCB>n--zu=o}kZP56B{XB69biQA2kr@wK-!E^ISp$0CuU +{Y>H=5tCUtoWY-bmLUC*v#*U|+vTMhl$4zJ8UAWH^F-{W2ln&_sXvF5wl>Mt}VZnVqAN{*ui-&`N*#b +K-4iroTEz>IbybU!5a#DH`gpuaa6BE%n#0kf8`o^*5*DMNcC<8GQF5c`azHzh;~UTI;W`lH`Qu`s=Ht +)UhR*3KG_l +edsh&jMJq>zRJfAGe~gu#Ode{lWh?CW84`qNwd`A1}+N2C7rM}*x#tN!&idw7&?A2O@K=pSoJS2WUGf +2;>n(MNOri5@LQ8_o46dJZAFXs$oe1G#9Tx&B0tXQGGZ`jh$_UpXukW4LBbjKExp!Vm`?Xl!|D>K+)s +WW@-g-%wn>F$R`Uu=^6T+b0|DC~RB5 +@SPQUw%$ld0t +s3E}bT_)pLAx!#_u2*ZZi2nu6uGWR*ZgqK5LxJCWiMTTq_=C5;(v?>Y2|nP&s?gvMZakqS;~FCT@;AD +^s3F4dK2CxOBK+Q~WT1ppesJS78S9{x2V7TnHN^6R8)x(ktA<)0aQ68K=Bp&HV>7_sRbm;)<$JFYr-W +R-%f=MQ<$FZgts$51K0yX7$mP4I$e1!0R((!SL~7{edvB1@5_a?=PswNu&3x}y#HP^9_dX* +r0?mB)8IraknIGI_1sXK-gPTwCNl0}9N6(Jm3~#zX#sjGG2REN)IK1iCr22v^e{k~|QVBqp-}{QxhS2 +5re#1U}a;MGX%qDQBo0mx5gD!t?^D^-#2=kjKNGL#;Ke%~?*>u34lPabX^Ro+Ntb{VZdy%{vDD#_BWS +oaGzd57X$QsK0?sH@)g)+Z6L#!s0`FBXgUJ0YWPBK&_MBdlg-wT50SxvRpl_2h)C51D@d8T035a&1NN +%;nGe)AQna3Id_Zjsauaeng@nbJd>-#kU$JGA-DQ=|q#f5FvLq&5@EJyF+cDEAxs*Rc6hWY!E}fAcgc +L4>e>^IbC1LfGFtO(s&%^*7J3AC5r3KmrxI{^nUSWrwc6d4~Np4E`+p;gi8P7l|`N*WYYuNuq|Xzqvq +M8M^+4tW>U{>u*$_g%O6qFOoPAy8cZzOKU`KCrgKF2>S;&w@C_uvcG$o{W(m2iMS*5_su2Zj?mvXmq| +?v{r%t;eRHt+3uFQd0si3Tmt@`#1%CGh;*U_^cV8egNGR|JH@_l39TNP(t<$6ig9g9*0(r5};5RRm`7 +Jc~&CA3qpuulmCjJZ!e)BS6iJ`%7USTk7{tB7gLW191C6g#f@S9h)%w0o*-@HbqhmhbmSIKY;34Ze$d +#MQX*GcKwCT0SV-ZwuZo&f26bBzo|kluG+B)HXl=n}pkj_I_~d1{sYYzVE(5>KBObyRVX&0L1srJLI)PeBb<>j5ZM +8H}8|g1o3_IA<3x_-w$qmM7$X4`{pC!#Zccj+r;05`u;It{h+>Ypf4Stgq*qu1!aHpOH!La+24Fh3U#6EUt^H~WqrEt348?eD)zrhd@&SHC0^M`-)|SIM9P +ZU5jl)3=1UfBQU{b3@$Uy-gen+WzisQn5nX-~SoO%tG3~{T#`?koI@qVLu&4zx_O^Iic)BfajeU2UJsT>4ZJk^jNbLKckk=+8_IFN`Plv?5yRGwIBQ +~Ii5 +ZU*?WRC`$f60Cr;`p7Hh|AE%7)7E{N0AkW!jif_D`@keA}?Cj*rT5v9pn6O^!4G`{bRlLmp}U9-2d61 +{OC`<_piVAqp_TN><~IE!Df&B;o(32<J +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 +5tLON&eRjBIrCz*%X8(?MErrt8ul9}VF21lz +fQ(dpqd(*{HqCaUi#ZcW84PW4FCY2SK`?BMga1UyYMVGE?D*^J!2-PO@swg*hXoCZS$uijsE_7w!$OJ +3OOg{se-AlyFiXs7~+K|?$Sc+!*|A@?a6s@;64nVjK5D5lceV!RPU}}*g`Pkg?3Fib3#TXhS$NlBp{?E3JUVTqyrtDN +=VlECUh-RQLW&+edrFbr1@t39H5=oEX;|;>VR{!w-0aTrKNEFv+J}qLJV)$nY=RwfjhLYgSBkC<*fr) +;C-&EjhFhCZ;Mp@6u2bT(C~aKt{1!LDft^|Z57(GnwyEYvyt2?mVjVeN8(0+)vc};`QjE7ms~rq7-pq +H47PhCRYfO9EZe`3AAMJ&dgv6@M3H6`R;@zsdu8P(`CuCYzayJ#br-fEY4`$izQqJmt1{MSDs#bCDU0 +M>MS382;R^1JeR)m&7iQ};M4^T@31QY-O00;of09jik9KmHa8vp=?egFU;0001RX>c!Jc4cm4Z*nh +fb7yd2V{0#FVQg$-VPk79aCzlD{d3z!uD|=Q*s9Z4DUnslPE*HI<;J$`tLKt9XFIR$^!3q{MA@umQb$ +s;eVzXA55RtZkdpFo*SV+3#3C1q1+Z8wu!~)_TCJ0KJ|D-ETeesh348lk-Q*cd?-ujqF3GC6O5rh|vA +gnm0Z^@0YikQi^P*y9RV*i!dU`CkW<`F-rg4>2>0QD^fqITh7LDNH5*`4_jNQa#TvbIIs&-jx@wj-5- +X}!~Ek3j;fB>3TDm6V74u(&AV#~M@|jl*t@L@bW3lj?muUvj1#ZmH1eS)=yAU@C?BAQ7gLw#)RNi9 +v`U;+J2yw)nW|B@dHif#XeU?Q%9tij(Dh-et!RRT0DRiM#A1FYe;%xG3_X%g&b7*^Ixxs9=QBYlX3rs +G$1g<09!Y9DN}FyT#Vl@lVmk-%j5G-F^IiboK`Ld3SUPF9!JH{PA~eOA*EM@fKbvSR3kL>aDMP3Ri=l-(>L(&j6WRzgk*fXwKY0EIe7Q#652d^cYbj +ky*hn;N=1VKNRCG1N{&k`cckl-C-!@&9DnWlx^m-p9qYv;=7M@$Wm1JkA6@-pm!Rb=Bi~e +~zS;?CMG>?9~;!zezIogabZdlN=@%umUVW5I)9xc4f_)R~rPJW|JIes48))86zW94A6$aDKO +TWppgW@17k_gqM5xa%#Lh3NozAN19Fj@>nycU!F+xf7dTZeU830Hr@>+ +${XY5jzpOnFLx!%e;6;HNtA;!#QR8g%y=hUE_-JDEL{GbXmq?6F2}wZJSPI4hap}xDG^MV8uGwXBCGh +&QzEPQ$g52=wFVe@^&Nm?4+Bi@y77n8x?n6-WgX=gFYI^ +USmQovV)3#_!OX}i0@aE0YC<7 +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 +NMSTA`;F0bF}n4L`4h6|hgi$`9qR*Y +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 +AhyCMF1=oluw-C1QlNbII0P(xbv-cl +2az<9K*4KKU!j{Acm>fG!g@43eBj`l+b9T9P=eFuqv(&n4;*t5G&FJ!dAh<5PZ?PAPxJ(ilN}Uxmc@w +GBl^HTX{^#c8WrPgF0}V2_C(`^2jAf8)35%K#t-F84dj3#ELv^o4JHPgJeZ&g~%W&v|6Ru%e85sC*t} +Zu<;ng?4XkB!)Yh+6P3}h=Qi7u2RDgIV;_b6I}dd%h7h +z5y2Ci(?$Kr2BgDm!Mw!^U@5mU6Pj)jlz0%5UI$e +W6cOi+jpDc$_pcm#1lpHoQ1pTyi4J%bEVt};Yup~~Pf(VU!dc1VSbPjX(Wr$(!;5wxQJedC9&o~`cgm ++x+8kbF-A*&EZ&?}3y%+b7Si3<54>%9&-!Uzw=TdP?x2tfO>5oB88FWmxP8OO(m3vW#pK>st1X-Tf(*cywb;21enY&a0&*d9 +ioLgB2u9r=@d~a~UO7%&m5P^UWkevkrZS@)td5pg4a6ShOGZG6Wp$Wa;a~FpAb#CU&-$Wj`m5xI`=pj +<`iVS6{j?XPZtm9-hAIpZUD*WAIzmrE~CMBruE%Y^+P_XqKI3hn2^;04TAt}>3~G_uwS%e}zh(`fI)l +@W`{?utx(L7O6_O-;?>@tIa6pU%ZpB6+xVHqA>4oZVJUs&Hi8I7=ofjd3&?%fwFQq!XAp(hxy!hN!2UV6^90=Eo%NYjxQ(9y~eo~ +K>lp85zEa?{JhvKH^I1{miNEjJ=}{=i}iZ3x?kRI#N9f-mcM&17OOwRKbNZ;pgWpxfS+(W>e5Lx;YyW +_NmB;VoKyy!Izp36rlN+(ox*`|bMOub}1P=jDgx{T~!U@0a +(h+YNtxVBuwaT&%%i4<8n5@$q5(@osa=)s}Ay8@yQn{d?F{)2##D%y3sY4Hxj7HNDkH&*{K5L>In7@s +|)co0sym(K+Bmc-#Qj+7YrlQ|j0zGpPG}R+`4<7p>>bEXUqI=I}X~6c>Haa;qD?Z=`TG`6obcTZ*ZFI?+W5k$|pXkmzGsD$EpQ&p7vEp$fS|F#_|+V+6XI4f8jS3j2~OvuZ?tqxb{i5o +x4#ylA+CRnK$>8b^d+W~Zc!4Vr%6#327V@tJ(I2(pE2P%-^n(0v`wXIXjgazFyrdN=v>;CkSLJrXvLJ +yqqXU_%ukL1lc6ieW|fDi#rfQLd-P-@9q5P_NH&dR{*XmuMjN9p9Kg4$8?39Bz6ST|zfem91QY-O00; +of09jj)Pzy)90ssI&1pojc0001RX>c!Jc4cm4Z*nhiVPk7yXK8L{FHA{8MNU&iE<#g8ol;M4n=ll=`% +^sa)JiDRcHB;mae^g+nQfBhNP#q#2(G}i>bKvslc?!dY0@|(5Bt5}zXx;AZ=-!Wdbn%uA$3FDx1jxeI +C!Xs7VOa47u(Kt4~-lAXdh?q#%V!l-$NXnVC<%DeCgT+A*yTbbndclhzRr4Aqq@x9-A(nJldfi-{9cJ +)0Dug^+#}H{CBe_C)e78ZR!A!Ks|Qw+>Iyeeb>VC=uiw6{#bkb=@6vv-K!m*g1pv-p(zfXI{$+Zz~|c +nKFXTF9jc+)c%lE&vAm> +dWS1stYol)N>a;`Eis{Tt3oSj~wTGz~{Zt(SWYhQ684jV=|)xH~T-B0h~$BhN#TO(-DWI}_ME3>1D1J +)7;G~#iKLe?@;(M~1skqdhOcxfa$)vS$V!+ZaIKJxLP?botjei^vQnkg9MBd? +g=RSw8=fwZ9T|add0{|jG|xYE8MJ@!xa263E^|&I6S_==;>-j)?-j%3P+y*aE;$pS;13+lP_<7kn415 +pun8|oN;hUk(g<1Hqw^icq6ninn#Ocx5v^iEQtbn1$RLKFz%Ju>u0o(ODH4rRZ3Ou+Ky%{}3ck+8ni +q@*H8P;=gy#3SE1^S!IMePZa#qoD*b%BCvAp?WlekF`E1>CC1lgBn+`Sf;?<7XXGC0S*Ain`nO9KQH0 +00080LuVbTYvn?TrmLv0PX<*03iSX0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rFUukY>bYEXCaCuEpOH0Hs +5We?U4BhK)yB56&g1Wm0VG*I?wPc%VJD4URnJg6Xzne`~^fctl_n5~D-Y4=fkV1%62BAPvkJ_Vzpd~u +s34zhg9?Xy)PgeA?95ZbVALu+8U96y~wrdbtCfakm|K(KBA|~+ovOB!Chijltm@|g6ckIBSHJ;eGCHf +7E}FbmNa+OHlZR!UzfqX(LzaRISd1*ZIG69rnKAMXm)f8aln+0bDSybWYRtQq +^rmz#w)(viJc|O9KQH000080LuVbTMqBz +0ptV#0M-lu03iSX0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rFWo%|4UKaCxm(+iu%95PjEIu#S +(#OMawvqfk(2ac`CwDh%;Dki%nV)Eb&k(Y2;(u3j7kMEaGc +u(S0t0^4<3Ocl!P%=irn9$5|SYSeDexzfR$>qR~b!Zc~eOQoVTYO_ISuy;UVKRW1z` +@_K=9Snwj3M}k0HVdiU>;jhqxdD^FR0g36VlMIrmgXX&nx`U2<-83sYtQM7_dm45ML&STIauf6GOZ#Ni6_IKSqa3Gv2O>{a^Hi;7O3OUd1&&^3T+CM(<4ebJir^#fvG_q_9(jM!IEP~ +?Q|XT!f+ItNjp6vS`S;9P!C2^H{4ec3_qybF(kbS{KF+%pw=Y!FZC+<;w)Q%=^NQCw4HsO%HotLie~8 +9C`*71c*fpMA`}9dB_|V_A4}b3uEtg^W?UM}cb7#L--MtY_0c@gf{=Y&dL7_%$lu62(N(|Nxb`k-@lj +4Hw>C{trvMs_!80EX!QiGcKWap4vq@rBM3}X~b8PZ|S`lXi3jfEMQCPJf4VQtjxxt-yW>#wcgA%tvo) +B%{oBUBNn<4DRCRFB%tg-s~T9Gh&#N}Tb~?%DN;RSm3B5<2H0GO-)-to7ZfKiLrBth9NDM(($VJ%-D< +Z_r>aFJ^`Bh&u*ed0e)gKTXL-JU&H^b|+NXH)$&;59MIyU3<^wez;_v5%6_~7lLQH%6_zh$WQx; +q$sa&~hRY{lzZyu&));hT8pTk*P8e%II66@J%tlz3=2DDj5{dZ{juhJ>7XV@wVy`^e4~r_ +)l0K|7s35m@~|331K=H{3o`xb;fv)H4;xg!38z~f2?tO^4%Knx)QuB{U(!XtMSS%k`z_l#th5xf@>(! +%}BU;6kA|kLY~4jTVMiM=u4Xjrf|QOfv>@_n9h~Ox{_&#xu41%)5=YSB=+O4V_9lgXcV4`g}lLuAy=k +*6KUgyUC+8)j*a0zZJ9=k_LQdGO4pK +Rg|iLsR)lRS_Qn6PXnQg2!4RO<(cPx+pXNNN+_cf=RZ(O0|XQR000O8%K%whm|;M{Hw^#)d?f$?BLDy +ZaA|NaUv_0~WN&gWaA9L>VP|P>XD?rEVQzVBX>N6RE^v9>TIqA!HWvS`zXGGov{F~5CHY9=soT1)oqA +TWJ#pG@$LpaX5|U8!Pzf-$HkpT;_&t$w#GtGFCq?&7)Ca +TwSYe5=CBCu=aQliC^j^w;pS>#Ee(=;lNq~%j4iYK)x7aw_+$YiN{3nD~s*7#8n@k%5j<2ubo>_Qh$m +pm5X+k72~5xWt8<{}A1&q8~?h!zVOi2}jd#c9Nq8sXt5t~vhB&d()5p1tP5N+y6jJNHlCy!KCiym)yC2E?v +ld7@>+t~Yv>CT!1pIbtehO3UDZMDZx~irp)n-2)d_Os|9mTcjDgUjy;I!+@Q{>-|uv#B+}^Pxw+~y-+ +Nezvh_|B&Pwv9^s;F$acP~WPR&o#Qw`J(*&ZbzVD8D3?H3s>;ruaed$^x2H%MFvw43=gf6Nx^w~%eg@ +ybFi=o*RPk~r#Hn_Su%Q8~#TX5zcf8|kbpNADDi-l-`Yz;qB`H@WWC!c5WYB3N`BFHtLN1|eF4s*09p +0O3r!ktBwa?PMP7Vw141q+3SVT+JiBZP=SC|e00ij1WTvy$Zr8LGpx&eA|ARbbV6t&Vng6}e2{g=wHX +&;td;yK*IA4EwvwUCtr)y{Wej7rjz+HHB2Pw*{C9cxS=}4T&z8RK}i+IO;n*0ViI-*F2DV!;X&&NAOP +frX45YLTO0GW=@i)cr!KcI2c=}G3T5Ec_&%iadHvyrD9*Pws#$~mQQ^VY{S8hyEjTi!!6U0hc6C4V;T +P+y13YTakwpq6@Mpum?9ihf+3&JWm_5}#?F7i^aQ^jO2p#Vb$-RM|~y}2ho7xjJ1B`h4zJ%{Ty*Ts__xq!2h103#(s~_qEJUKdr1oBppXv)ynkLI_T$xnCyK?D6uf_#WH +Uk1Md^Sj?$X)Kx%FrZ=iv?REY6ncbL(~aYJXs3Gq*g5Ee*grl3b}X09tBGTf|X9$Ly|tS#}%R(g(#Sn +2BKId)o~M<9=M5RhLoppx^`UoBgMs@!mC$S +C885Zj+51pCvun^B_g#Nxw`z%bk|S>SPCTnY~^yIPd}e&77P&SVT$sd|Y-ED~FQk!redvRu(O$_t0wY +an}8+o9<6XD%UB&gRg|0)_$`)37lXP&J{vpJp=;Ro2%~NCaz%NaGPomT2R!!P=n5d6qs1kd%ROrHm@y +k`{3Zbhg~kO}T<`!nR3O$cRaZoC{p@jMQk6ts|~s4>60=Fpq@S%A-qYI-i^Lxi)ptZs7jTqjbKz2o{r +YJl>lx_7~&HcpU6PW4i@TZ@qaon>;_*nN42oZ5J%h*v%@<;RAD$h7%=m%KFy*rrzXv-z(2Ig??019_* +?T@t}WtB~{%{V4l!y2P3v_eaB@)ahMG#g0VRdtq%@8&ua(qk|p=sG4g3AF{b!wA2~;?nDgM_uQ`b`@&=}cR +TTYlP`an&4weB#a%sbHyk2V>uZ$jOz{n3 +VINt6I+}!2L{*G{N2b)bMX4bK?gmc|BXh!p*_9}vXuw#z6N`nB@J(7^D`f+_^$R0UNBqZ^~$%GK~5}S#X1P|JzSf{F?$zV)a_leLC5H?7L7u +s^ZMM$7+o86)fw5#bjn09f{@CX|vN{s$8$DPB2D-v{lP)BM3O2ltTQiN3$!HQ?goDAOvT2KS;#a15ZC +Q+2(Q9+oV#^?;S1ZrDjc~V&-AP8Y(Ojd4Wt_zZ=RRW3-2_FZIm{8LgPDaQeG9ufc+o^6S1r`gQz{Cps +BXt-v5n)k<%mGSVk_BDw)={nz<209a-w2&s +88L(r!oUp>v-~KOfCIZ=48ic~IDj1sYMpG{t~p#0DIzxFXXOea&YoLty%JUM#4$ZEEA_psf_cjHbG^D +uhdpt_eYtAJ2*mu^LeY){=>(cv>^k3c?f2)24UxqJb9op +Q@i$nA`;^ZTYQRE2eGqbZlyl7SpF$@pUFeZ8iS%2{T^|z)Y`0jSR^YZQ=!+(2bi5M%E`lGrD4(n +zg*9K{B5bDuGYr4=sds^E8RnrDdM>I8V1rtn)R?#!pqi;*~5qn>|`$MgFrOz9h9LC}|dv$XU-WWVY=t +ZOBX|*$K2cw;d19F{hSy=9i>>p|bp(;p5;tz{w*%dqGl%89WTWw{@4=-D|b0!q`!KW@~`$nX*WE ++k(+Of^;M>@_Y1ma$>Ofj{GTwvRuje0zO%%?>7eBlB=L9+wlTY7S$j18(}_kQ_Ce&({1!ZIr#+aJVg; +g1ze8wdnlt-k)uyn0`)YNL~8_on*Na6_$Wj-W(?D4(z>eV>gbnN&Tq3^6y&bBLK%<^Dl8~_%jcT +F`olUNg&v*+QJ(a=U<&ozj_*n--%jrAysI*1kl`@aIf+fh#H7}&F0zEJ0?EGdp#1BK~`9n={4tN< +n-kwBZKEr~}i_2gBg{ +SLsC<)&}RKB`l&)MTHtHuj#VB*8emlkEgSc~%hsEOpTfn@5CJfGB%OxsAtZ6pVEBnJ-1WUs<;&_FQ({ +0CQe6ayAt^Q9VmbYNV(sxvEP$>H8F308#_Lc=QYQW;@dr98{1yD8^6wlX7~dZ>lWXv~R9O|7VCp4)CSh*CwvOn12(E!Odve#xB%4KymPx|Cv$1zu`(&HcTNL-+R-QWp|NY08u +Pdpn`Nzi-mEb>6hpW{hfv1e}&Lu#7TUi=xHfl2pBUnAaq|Q%R^0rfUn1*a;H0Q&>xuO+_`UAXmP0zFI +)~@v64my;&HxQ$W$GMj=Vx8l)XDs(ej}1DvAjd&~UgOeIn)+!J+PpVqU6JFkN{~WZ^B +uCU*!%LWfqOCWq29w?B@ElUv|;BL>8A*GR2>W}^?shPeM^^9W|iR^=f3Gm_!iJE#{9`QgZyK5+dy?!O +<|}RcfGdxwoN(2wTL +1211UfMOZvakHdVG$b$$gPl+nqwHL-bL}Q6Nt)0QsPW#yA~BT^B#rg7Icxa{mbMokhsSfG#nU +oIB?_n-ln65xk^hkAal2D=gBcCe`u2wb62lQe(s*YZn?=%xsviq3MYn{G>lZzb0WciTXJ*NNrtNUkBh +ikwP_{{v7<0|XQR000O8%K%wh>DV)-!2|#Rh6(@xBLDyZaA|NaUv_0~WN&gWaA9L>VP|P>XD?rEb#rW +NX>N6RE^v8`R&8(FHW2=jZuinbYwBJh$hK41qV^7y*~tpLff_wl9%KW4k5Kj2(z-f;?X +{MA2R8@5HyWf%l+^cFgV+hForkt}Y6e2r@VFOo2oGqT47;IsSQkl}rb*IR(?VG`z3(lSC5J(=k*PLbc +-rrhWSDDuU3p`a8z(G|Z?4~V)>P=GHFt2)w?A|o>M;G*qZQuR8N3%Q*0()fdIlfx?;dr9LpVi=s%c~d +g{`jNy?H~!BuOeIoP+WYy3ogXpX}%;UnD@kR{Uk`0;KkFDD^l@k{TN*J7FD`3`#kGl9}FjyTy;{ +6l!#7JvIm9%c%Rh^hBprf@H={T#7On8rKC|f`gs`p~6@PD9BlzkmFF^OS5iXo7k241!}lASchW +y9)O~$?%9TAXQ1wOpcThHConfAQ(uJa->0^ +g&2bhu9z@-SHRom)RxOZkS@;+wvVP)HEbzR)1u$=X-eMXVv$TK3|CijTS4~p(^Yx(Dxa1{6fcU);&Pg +OJzVa_nw=FbybH&V5QnF?ha*QGrQd_;@HAaBNbNSwK{#lRJA+1QBIcmktjP-^2-=Q#H5`FY6?Pu7KR; +Ys%eCP4(Bbgh+9rLLk`X$=c1^n`=r2KK +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 +r+;WzyMKldiYy%ovd?lBl4EWQ> +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 +*q0RU1Wx-7v#Xxha!2^!RO3OE}!JnmQY +01)WB&Dcz+fumZGB85Q68Wz5=D*-GH3OgMT0c#k+rJx}Sw*2;`$3H-9!vJI0nnk;s!%!%a$}+D(=%s* +4f;4dr(2Gr-&+vIWKpQ}5={lr64+E=G}+}9%!XGD7F(tPEC75}0VMc;xo(nqmS@eTk5rE}UXT9Gl +{`QP?R|Bm(sY^S!8YHUzB@a8@%oqP^A{&CpS=SM?<0$C7H@;G`;9lXe&(!A&m(WS%$$S`Pit$hpn~5`6lp(G%u +@Y=H2)-^<%2;gmZhaJzN{sijOucL`aZy?ELsiz{!r-5&WR6j_;SMLfi1vYv?HRAUamTjwbMumu@6OBB +AV4rmJ)Y +jM4au1Ij900XHEW;hz=;0mB>NlOO^IX)oDi^~Th+DSu^iM&d3TzDlOr|sqRNB03YW<)U9yoE8z+J-S< +O>k87_{NAPi8pGLmSRpboC1`lnCJ)Ng9v@QJVyw$PNZ>(pxWzF5&7Zdzf{Trl-0#SBPMK{CskA-VPN7 +l2xub9n5ck+$zX^jNRo*BYW5o~B;b40rA0K%*e3_|m!tTuP5a_EOT*fQWg%dEmfVp)~>Ag0= +x*wNPw7WHqA5W;aZoT(~)UUJ;re8!vpbPbinL;KJ72OS}%tj6mZh&I}}rc2FD`^PZ8%?C-+=HV5J)8I +R!LKsyD-FJnL$aJ#KCa5EJ8r6u&P*l|b}ix&D5X$ZINT*JNACF&9Mn{t>=&66Sq$(jS}`y+9fr>@+^t +}$Z5d=a=%#F5rY8#6~2z)vNHPzJ;m1CPMOAk^#@$A=NqlHricRs*v=fsNKKt^k@k0NzR2+bxUSB{S~? +jv$P!ch&%BG)`;>R=h1phmh{cDHxpV|bZgCis1p=A8>R_Ieq= +Y1^IU^{478ZLi^_j!8iP_puanFxw38`bgHA9=i#U#1`r&pX{uN*yNOLyO4$;C;)eRw1Fx11WFmQQ;rl +l5R9XPjyY6+eocc*MVB6#TG)L~Zj^CTaxNkz5%s* +vb2d8|aX-`T)E_?2n97E9M*MO13=N?0%Gw0c9RD8VQMk3bJ*PGjY*wuS(ovR}uz;F#rI +(Fk5BmOPmw7Vxi1GFah%sttuzhXX@Ao*Yd_)H2OwFf!fo>p8W$0P4ZFJy-kVuUflbss=Rt1})U#s=l1 +~38DBE|BGa5s|ENV^9@*M(f=50#l)IHQ~x6JbzY_$9kJDbv?AZfTmUTs0i*y8hh$0O;xD35Q24Ks0y= +}2RxHYttOVS^Z9NuPvLI=Ro2pRknWms?SYm040>flA#^@5zGeaJkRD+ZI5F%hWzP^lIvRJZ$k*li4g( +Ynmm}w_;mLIpzn}|8qvDE_%jNycNuPHNYJx!dT_NDr!NogR1#C-dVQU!q3@mbZXyCyd`vm-=pQ?QwO6 +AZdT%mWMuZL|CtgzEss@1k)Sl+y~)`y#`J&!{=EIVu255cTW?n_?Ia^xROr7A6It2{st9K?HzIRQ@KZ +va+osHfNu|IeqoyELyh3g2V4@8Nz?)hEixj438SceTFgHqy|t%^|C6>Dgp>&l1|GpCW!VE6NJ_dL%J3 +0QIy9R_XZ$NEIi)ZM+CuW&r*h&)u>28bb(~L#C#};a&4}Haz&J~rXlqYYFAtWGy(QSxL6B8XQxCOH)f +jBV8i~pj$}~q6YUtBDrtC1SJ(tgl-yq5CRHj{EC+LV4!_a#NtP0GQ`{VgcY|V_oO`gDbrg0*NPN!C@|>{4;-@3J?Re@ShpBk^f}2+JYjNQc;QgO3x^b5nCu>UIKli8a}dp#Yzu50I)RPJUEvPh9-{_sOD~Gx#6%`{M@Z~y-4``E)IpEQJ&}}&A5pOpjmcf +%jYEnyOzsPKV2i%s2daF%s6mWDH{tlmWP7Z{pm1mKF-UvL+rc!zl{5i+o6BO%xlE{zhAO^{S)GEM7Fjx*jU+yMMz*u4QBiv+{hQnJ5 +GTcmQeqU)t2wi}%qp;+DQA~qs!)v6MR{3ZO^ue+CaB>jMI}MFpvXiVJ@2FtIY`bvA(~FWuSK0xXo=!u +TvY;-$8*6k*g)z28UVgIN-{+ERm4Np*K#6W6X +b#6=GeP)eCtrsg3D5iz7P8FF5ktXSl2DlsMSIKdO?&^eA?G;D6@*3?qR`pHvA96>yTps}+7>qv+!QAd +xQjH>B}kp=kQg2%u{m4Y7#xDssXP-Et0m@rZNXCKoDs57ibbpLrKYn2t$q*kH$J6!Xe52&BL$- +loR%@$HIWN*^`ai`y?FvZSLLcCy%QxQ?P%g} +u`goTb{2b5k#k~g>Lh@oX(7KmS~OGrpbfXt6xBVG($$4eYo94z8IVTOe;u#vON0>yjQz=kA|Mt%WDoJ +<&A2g#feiB?d@n*a1Dx#y#xsb7JIUGDFSm%b68k#pJ4n=*+%OYL;REsKy5cq7S|EZeTXquN?xGPZ&!BY +E*4NRFUxE4a%!b?R1swx##2zh8eAeqM%D>MRVV)dPjH9V_<{Dd@O(L^sFPFnWF1}^56fSBqufEX7}1r +w9IPtx1`yPi*#}A)J0TGZnq&UQxY%}#=Xr7|L4RV;sx3rG6&nty*KXtuAqzX9&}m%~)WDxWXd^waEia +71B0Jjo2U;N13c=;Wwb<=h0wm+m5)TlHh)%JtOz7L5T*vEqN(p+7jt-=&ejB!+6$bD +0V45L0wrdi{tYTU$Rj=pOei=(*w%qdr6maLf+(%NXjD{${0Ohq=14mBHdLW#i(b9Zi2^cDD5?`@r*{J +QAe~$ELXBkyfQL3$l-y3mnC}k_!OYpDbx|?B0R8 +Uy5@+c^CJ>zxAWK%Ipc5c3qUWTnGSQS1KuLk*@ylifbPl3NR%_M~ +!o8#Z+%&;`&Y{_l^ogIQ4qaL|jc0H3~VUV6z_G$AWy6v1{aj0d=EX3!VX*l5O#cP*q=E(WC$tAt%+|6 +vX0|+7m(o9fZ2`R%c7t6BaL?9TEi +5VIY}E|Gyr=T}r%7l2L!g%L9j_|z7ZmLGhOf`SLyJ)sCzM%4`tEUIv#%K9#AIJPBN^&Aen&I&n&f!kd +lT0v2Od_!d>82MK)#f3{{SwCnirWCCSl^q*D)&xBq(dX8pIKbShl)7n`%ea5@7Ew@(iX&lp39ZK{IzE +n$!c^$(x$bY6<^0EsdpW}qm^~cg)HKxS@dQgCMNwR*#k~9gqi_$%t7MQuCmhQp)MdL1UV4?XI{|+|!P$M^TY}vGQQ>1d{35zWp3&LB*Ov*#G__lRIS-p+!z<@Tr_xaozR=R3# +9c^8mx02m@fBG_5Ah*Y4*A6#Ka*^e}#gR)3VI(fD +xDR;$35S)mUWWG%qm>i_D;H0lUaFnoe8%sGQiq%DxtX4MW9SWNotf#$r>AIexNdwhQ**>JzHd;0TVK1H#I@d5N{A2}baJa~-tQy5-+BG&l4n+9@gs4JrpDz6SUX(|00C9?fuZF+< +ncvToIjgcOhIK8PX3IH6CxF4z77jJn~E9T!cifO~@o=Ur6Bn!w!%P#~G|z6qPe;&wsh^|{bYC8LI8^m +*baN_`-dLg7-yt`I@Wa+MZzobicjTR*N{qQqX%!Rc97wP9k8uJRytO8GK3JBMkmmP88%>o9bp^~GtS=KM*xQ@Fego#{oAd>EvxhH|OP`Pq +d%;V-``hnaN1g_>Zc#Z*E<(+A*4U>>jp>zs-y>ot}{5G(c`q(5U@5IX1>H`NrU9NjmE4Zw56q8tuQvD +>8V6LX?P{9fh^2@z#U?1=a8DQyGpZwgu{Q41t;z^J2$mlDEX!Sb1Tj1y@asy%3nB#L +X^4#&AOvoC~*SLa5D~GuT~HX_#7anbbKMt&}(_Yd?NP-W-;NG!^-egb5x8HwLsWIjh8kCfcJ3Z4%B7K +-0K}^}L~D5^Px6;{XT~Ck4tXb3F+(*$mrbKqZj(Wo3ziq3&*6xz{x_7){J&Ugzgeip|A1Iz!U}77yvA +FX0)OW%_8a`84Qt+n#7LZ*kt%plEhYJ)n)K5!Ife&zI*0ovt6)nRrU4j~pI#dxsYKDytXP9=y{hr779 +mfMblDjUyLr5<8+Grdt06(m0|6J!BP=Vwl)Fz$9A<6E*Bl!YI%&6Blb}9Nzlm;qHk}8a(EB$8?pfhaU +&Dn+6k#uMEA$qfd7Iy)zSm9x-4AaOQ)DLfgFw +(%=V9aZ{dvJqoG4=WmxA4VWodsPEJ`%{kRG;*=OvEZNMvu0>I_HmwZ^B9Tu#u)3E=513yc@-ACahJTF +_pnbVt`K^4mGlrxxx(y8r!hZw|_|rAytQJxm51)+0MqK+xgrzPP#Iieh%eUd%NorTF? +%g9?!BW;;wNBRUSs0&ii9{ea2`81FXdW_ucc6QD&8B{wm&OQ9xv#NJ)0spqcxU&(y?^{@ +dlO+q9%G&8Y`sZ1`?z+gSgdH{ax}+u)(k!M(P|l!OBkWkpYX&yGQp(E8C|WxTwurxAPSGU>0}$$G;Y&X)Y>N6exOJ#T!j4I*5NAg?V +4R5}=WxhNle3*JH|dhDWCA)}t*4!f4b8S#2DwghBWofy)OtefjF&(i2=RM8o4o=blq@mnK^5(2Vz;HW +_{D!IE^kee8q;$315%KlKHrKW8bJY9GDfT?<)GU6I)+jl}lYB`WXFO55^%wOQYL9{S+*u2T^H5a#Py! +9J_sKiIh~pcitJ6SkvgY&zR}vC(>Vn9Lk}Nv9m#_ljgYcA$F{r^kHhgQznh+Z+IPN`3qPk8%KT?C);> +hXmfosC7DLS3l^(y-AK$5FvVFA#fh`@k817DMp||Pur#9QYL(E^gTin~}<5T;^*)h;$mt6wQ?${& +=J^1wR8(VG130^a8v|C*~UypG;(91r+nujc9->170U7iId4Is6;ot=|P6aL0RJ%4&n>Qt-TbS#c`BF; +eccNN{Ek{`iUU5@v9#mhhXYJ^;Clg7b>FD@exhM87@X?j +OY_zd_ri+s1prT-8}{`*^-k5sOb)y8SlZClhf8gtr!KnQP>tnW +L@cAHwpTwuGll5kTS+mLPfB&AKnvuMXO^D2#r0w0w{wZB_;E;tM{|8ZpGo?m;qeRE{!v)@r$5)SdWiS +t{4LynGWtq##R+8o2v=N3b@rFmm*K~2hjP*v}dik%6d7wvnz&Ax=06(GJs4No^c&-daDPPgyyeY*pAK +(Acl+LZDrvD`!JeS)-WHsotv_Ud>U5)>e8MCSBJuN^vM;O5~$`8U1#J7uby%|!}<5er~ZHmgpq6HtkR +a|ey$$ni~A_YVaWjM{mOW=F2+h0V}J(Sp+%MJ5poQaRa$J_gHxOH3NE5`GgABG{g-sEqvS8zSTe$$Ti +<5NM)p}u}yZPPP%%8dpQ-B^*UwOX3xMqrW#IsRbqQ$=N&F5Z0Gu+)9dl`43SVSG9q{}3aBof5H6KJnVX9%> +HXoYC8mr}&f(jLBUXREID^R^rNvD!aVIxV_F)putgR0o!YmW#bl7>u1=(h`Xe^Y|&}jep +2?%Q@unwq*o`c&Co~eM2~DDp@EZm&`%fGDIJi5scSE{=<^znRVK7EM*A?SfC=gvAJ3Jfl8P9b)UuOXvCE +Zv6gOrqkji!y~Y;DqT?96qec5qfEbKZo84lm(w|BqH{ytmzar +sKb^I}DYW39n!V39^p1f2$!tT=$F_Q0-&y3`@HhI__8nadAmdF%>ux_@kS#lncg%R;pG~yGrgq_=qlq +V_+-q36l41LW4ldwceG?4U1G}@MLec1gFfRrS?|}HCO{XDm+icq+gs9VvBSws4(iZwdCoCAeB9w*9^b +)`H1qcIFI}Jki3y!Y@2bPVYV +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 +;W%e1GnHjOZE{wizj5RkgIAb!?^Nwv7*YE +-Ypi_k83TGlTgiB~m2?2{Dg;F1y>;;N?zof|MG6Vz_=cB3an}{5PWxI^lvrUeGb_1}IuDUN#2iVd{T1 +H&4VO#!RN&{5ksr{}mDmZ4%bE;jwx2mTvX^c?=XO3+1zc7zFQsuZ^P=9gEMx(DvE5Vv^ +3`>lLh&)@{)Uo0jibqrh(D65k<+U3%98>NMIw~VW0UaYeaYZaPX{dcYJ`Be2*O_PSWL)m6_e+*~ao&E +{>60F|EA?*xpQ;&Sb<-S)euBeW9vdlUf#G!&~#bEWKJq{PA;Jq_Je(H*PxdR|bM67m(J6I2LU +#-&W>#KyLf%Lj{j4QMEETqISQqwLv6G~XG$`i4(bpIqK`2Uix7-9;MHuQ +P>TbJDOGol|j1G|WXw1{6Lj5S}-e3EosYbv5tJl+;en!a($`>MiT +zMe^33;D+`6H;or-YJ8Mb|D`S`+s1l;4zbr#1@NGJ9nc5bK>_@z{XQ1I^3RC3*lPN%jF8MTnlL#JM2N +zP0-!Rc$*@=4|&}fj2g*LMAhOQYfWu4CkqP?bUJmoT~7-ln=V4??th4gTfyjQ(mq8KF-tq;J#V6JP(~S*??G6%-0?gn|ckUFP${uz~IZ7b%^nR|2o_VAYUxAkkD+y~dIUjwVoK7aF#JrZ>h^f2?Y53}`_#X +UwM(>i-#cVf0sRK^iZmZFg?GV&|scB@uS2+k3nJ#%(DD}<`Ct<9;gnRagf{oeHCQ2;PbI$G6ED9rOTW +ReRqqD)(uBKA>^QUyf)4!+8?V3L^z9`1yd?7}~Z#Vy=0!za!CUU1byc7u>x{BY1fGs>wt{qPRW3% +h1+I&#-Xk^O{`b6hUy?2BUBN34D12{@9hndd5)su&n!mc_uMMKBqNH-$X3M#GEqAZ*uy=FC%BGBnJxI +o7enXCVW@veO^-~fQVR?Xrlu=i08y-s(wrNGw-Tp66_9#dLuhpksU(58e?mOl^kQH!d0ZkdVO^Mg#9S +H5i}daQH3F1F>@?b0uK2Jxq-RmJ<7}Bpr9HS;OhC?@G{uiOYMe>JxsS+->_lSw)~pM)QX&CrcQ9yx!- +z>sr~+7bhsOrYu;giclgA^L^z?jlgEi*8Nk*o&_v7&RqfSG%x`hA|F`IfBrWY%5t12h`xPy!Ol*>NZW +*xf6qS{3aC4f=Mx}-%e&m*4&qXj4Tcax9hbiL1FJg{B_MBnq8SY$c0CT#S=|X(iJefT!AiXK8wF*fZz +A2L!=GPGgBH_B8hB&aJ2S8~BOJCyUX^lY!WC=SsC@rSgvPVE@=%&PTxISFTJQ*riwjb+cQ=RbCln^eFfX-ur>dZDB+cHJRADjZr$< +m$4dG@i&=Kg0qgToXXhsxC)IUlBtR7 +QHnV#ku{Qt~M20Iqd;@$14f}nPEuIhvy>R=W3xZA41V%&_n(lmpx3bk^85A5k=Dq#))&PKPFlXdO5RX +#HFaVQVdxfrTE_SEf^(uxL9u*=P1O`Zr2BTm_-`ut6g{v$emB2)lZ1!u?Is)FyE7#BY|Ks^R$w!yp0* +rKxbUdJ7JB*}J2)||W%l3{6gHZL+?JFIn)RwmBm1Aj=+FgFbLTiNNz+jcy|s~l~${r?> +oM*xl|dTcE%Oh)2uEwXe|f6qg;8O^>zo*ajar)RPJEEIC{f2BP!;VFJG9wcEv!jJK~Ps!Iwdl1vwGjP +I`8fvW32O{?}r*eTvx*)#h94+71QQ<0B4%v2VrNrv&rqYv3%WmG(M@i{eZd#O}Bq!QtOw%d#Eey^kV7 +CN2LRis=x|Uw%DZSU&DlTDJ?-U8?N%Sl%vyJ_ObQwRih!ggchu?Y-DLDIvQp0Y;~!-1<#Gy!eA*%JI; +pJZ+t(0leN#?)t7ew_{ih##pEZ#JaheC2Yqc+ABsH;81bN@0N)uVQ{u8(pnVmL|9*CWmjX!4Zo)lb84 +MRf6Fa}KE^kV_||Ak(sY7xprGzk)i3@KXdTGOGOt8YlBy-rk)-J+Dyr%YA7DW9LqUc)$qS+cZVk`OM} +<}*sdezj0GCp`PNUw={WcYzK5X^C$WefPhYR3idlhb%8tAbQ#h%?^5=qy^RW+PK(pGQrFh +Lp`e{D*GkTuuTA@LMk<83S;8)Q_(ZY6%|VvmsG^H*w!N{T4j9-U@L7!w#xOIbii%7 +veOL3glV_+D>vYrD(Mef3V1}$S*5vb&>f(aU<8U>NZL`_R*DPDx7R~%uE8jHk$Q`ELueF@N)^dJuEhm +~pNs|1_RCFp6@1qxW?ge>!Ip?8OoI9uVu(%tvPf^5a&GwP%IMpYh=X!Kp^_*}g3i6eybuD4!VfC5pP4 +D)G)Y+RV0KS{ox+!@$ciFJ+Ql-nmeB`p(gE7Aw57~FAUvDz{XaAdwkwfU_-?es6?r2@7OLM>%JE1 +DYU?I8hKsN=`*T7AGV(1!tm9B^A-7MfCK=H&ME%z{W7M-RRYTEuaFVf#f@~_u#Q(^7(a&3J2bWTQa6L +vrL9W+pcdOp>{Q_=_;211|E&YeQPVJ7L=p{-vGF@s9B +nAIMSGvX;reI!Js{ilEB=^L?|})o|L0@H{DY(a15ir?1QY-O00;of09jkTk +tBWy8UO&c!Jc4cm4Z*nhiVPk7yXK8L{FLYsNb1ras?L2F9+eVV#`77q2x)PX>uqb*R +M`w9gwv|M+j;)H6*XdLsNDQg5K>)!3vKXE2w_kV91A_-8Ih(z!t2&h};W5+G)6?(i!45mW5|S-N!WsO +Ht0-ZKSnyQxm{n=a3szonR`OykS+=B`qdZ!`pSP;ni2cM1DYA61!}f!{5sT88n!P%EW7-7ljB|SU_T= +^PyR&0GU`o%5EGrdkz@XrHCPkSQ8-TaW3bx4BdBRK1VqQifk-=cFEV4BV!(~-g1rI|e)_GQxFmRfcQ3 +rqrL<2r?&Ts&mtv(5QBM;w57s~zk@8|=FgpI_9 +A%qy +p^Wz^*e>jHU;n{cZe>e}{9esa%cEDn>C@+A_Bc$~ubiJi1csUK{9pIHWVr++f%Yleu5vcczy1^p%My3 +-q#xC}WD6+I}DeUtP_SpvjKe!tV2H|u+e06djI;a9ViUWd0lq{t9o%`OYH)My0>?!nEB$1TtJX#$npq +@v6kC0spE_tf>&PYfZtyozIpbW8a#6Dedo&e|4(x$SEfSi&=1qb#{r2sJlaTDuxRU!*$5vo*+t4Lnq( +|{fS2I48o4FmC8d_=ZJcpx-UA~WFG92cL*fyI$7!cZnzDM3yS*@YKIa{*NLLIg_}uxz}5S-@|)H!|W~ +s{S!w0t}IgG7NpmlO?UR>2knmNdc<9GTrHR$i^?(yDa63Zuo-`0(VeA%ef1Z>=Ur#u+<*mLp%7r<-Hj +d8kx&Z%N@{l9HxRZ2Wr4t@oN-T36un)^MtQqAyF$u!1Lt=EcYe*B$9;9;q7&lR1r{@agcIWiZyotmsb +(!AHbyqkxUZFL@C)Uh=u%+!Q}kmjIBBFVLSp>5YT@eZ4fFp29Q^vX@LV!!@59W42i6hGPwZdhAJasd9 +>n)JBaj0N$dsc_#-@orlPz;-je{nL{+pR#2k=jS^+yP_!w1dRjOv3;RJ!(fE5|&zPLgTm132OrGU{v? +d6=uRZe3%Ami*4Fm%DAHSuz_2GtO>RtG5#D}#T0zrz5ddW}b|%6U<4EJr&12_kVC;88Og +ysL_|%WvBt!tjrQ1kJWVFjzkZjI~6LjPc*Bgk`WIAY0k|17DN`YMy0D4NEK;7(0-Cp|y!mJw~XbhIKP +%*mqfZf|e9{oX3MUR(_+8@2=aS!baT=iH)v6(To?OSX829M`uT;iV=CS1bC4IJ_s7{P@(y4Nwsk8YH# +a9(r=r?-PV>3y<&SfPwSpTm-I>})C&hawk#aBbbG=QyB+&heCgeGu)7=I+PT?lLx?-i9RY33!$Z6v7< +cS%>{i68@!d;+Ga$~43duuI4L43v`vh#CrDGQ*xy8^0e2U8Tve8F_raRRZl_4C)7<(1@9oVlK$ok#03s6^)(pd_Z@B<&_#MfE6^* +CpCD8&$R_`XfMfL$=X(7OXv{D97goLv8TEqPrD2SmcfN$ng^aEab)j-UD1lb7`<&wJ2QNUtt~EFyO?P +OQ5^d~T)&}1Nqbs|Lp1}#9cEc@`Q=bEMF`$ss65&5Ix2j00JRbS6cywCs9SOUa#uqv`D_a_Yw&@(da%(B4!G>jk$5?uOfS;A +`-4;`>Z>@?DJBTm6pdhBv(zSU5TXD<0d)dCOkmgqS>)nU={gJ1Kmy$mXQc!B;$UAhp`9Q!C+&sN$!3jXF5t3S$fxi}6BeEK +(6nl+X76+pzBzvN!C7EF +Z9{lgjMwdhu!wF!|2{{TH1OzQsPD`*XNRl372LR~_#PQ +LST;xxLlogjxrqk!s9lD0M$jsx(SJVAxUp@PJ-%c5ZM6!i(kZ)oV(VjeuRss%HVKTmR>)IQ?K}l$+hZ +#B+*es0~TXp7enC9-uRIzv8`h9!yHhgn(cJ%7)@f)*@HF%d-K=Jep@q$Kp?)0JAI1JSp_2-lG@50kxz +dw5W_WkPy>$v2x5MbiX2bxArH^dpxTYE0F4zkmh2UDeDk;Py{!IEy_@*m%wyng@YI6OP~_u~%6dYmSh +L-v%`w&N=`nz_pj0s6s*pV&*AF!t07 +n-~jlU*WDtCAvNer_T%fbG0oI2fcBhGOzQ6Bb%J@~Y3wh-K;G&lxx2M2cBgd#H3bhHf>?iV#J07*r5W +DcnsM)LkqiciHV6ny>v5yT(bx2~D!#``*6t$y8ClE@Y)X`rdS5f^Ge4s37wS*fc8msOJxs>6ClvZsa9 +m0qgGimzd#x?3o4j&7CTvK_Jye5B1#k?sdC?@s%kc}CEc`ZedAYqMTH{AGq`<7NAut-w1DNXp*vN+O6 +HNa%eGy6d9`qm4vCs+4WeXb1(qx1AqJ>xr%yWY0{lPJ@C8o40V7sx6EWtsQD4W`Df+vr2*v04QxtlB; +bc*XycM<7b6baoL-BL3wIYHP0A_5u^er+tE4K69P(b+M0Ckm#7lhFnQ;%OWe9e>XGN>CQA|e7qQLkLB3)+aFAUltDzqbU?06Y2F!D4^u0Sl6tJ2Zg+VAf1)|&cFJ34JI%;O5h#f&=?b=z>X+Y*b9Zuv-`~=^_T9);hc9z6-{g%* +}%5CHo2EzT=|Eik8^}O+0979W%B1fg9A5`Wx1n1Sc!dOc(U00h*%|zp{sd{z1p>+!{nGyg;5Pp23#)# +5GPJW5X-cwZ>E7NIOy8^n_Wd8rgg1t_Hau9*^!o5!8EnL)Hn>s^8J8?)dzc0ozI#8wcY^niO_B_JeTt?2hcFUW3Q*Fm +AGmO9}AxJ79!YG!unrC&#nTa64Gx~&k5nz8la-OSPVT7Tv+Ezgr1y3j|p;L*74=NfZ`}j!1dZ3@($I{ +Kmj5bjZ;AS__k~E%9_Qp5QpM}q!j_K`ql~#ewcG=-eN?PpM&g*D#Kx@$K97hFAp1RaOozBpt?u^~wK^ +U#$XHPK%a=YH&xzo7)qdI@Z{0eiwO;a!&T9CN=dSF22o9Xj$o_{snN(t2_#5NYhs)(Wlq3j0watvV7s +1(=S0Mf*XH;I_<>YktX1A}YmAt0cjD_sB%cqpsoQrz?fA~oyj807H0sCXl_12Ja* +0x?72ImxInIWN_MGW%jnwW?JKu_j51rAR?6I45qlQBW%cgFmqFvZ&@D+&&j|x! +!1*66HRCEmjtP=)xh@oBnCVTX`H3|ipsoh(`0ko*Wi=GESLwJmFr*F6Vhc1$!=#k$M1vkjSFl>=~>`M +d3=I+f96rJ@A(uCg+y90FZUZ7Nu;DFT#j=cakfc*|MOPnq6G}nF>$Y}?pJIx%J4J~LABsH +jz|sY~s?qjtl4^mHjkJFzAs}H=!HWZj0MiKlMpTw(?62*TmC&d*O^bYQe6P_x+)a2~iquNe`#?#~pvb +ZwE~DQYbREymvR(qC=4XS$AJ~X<*&lB{9zHmV8T--MhY=X7_g756H$`E?}zYtYt-P`Tb~F>M}uepn%_ +Q;NF!QSQFtQXNZ@$=)B5UerQ{RB*GYA4)@tM%KvVC}n9)6$>M^utg{Uozip7fmD0EJ@0Rf5=6V&{>GcKqx<97%Ok3;2n+Ldw;;FFB33IT +xquvmj?2Xvd{^B(4Q#zvsv_lg67ap!_f-AF(N`S5|ru*Kd&gzi6+rWbe@lV7823HsN-~h|hAjJ+lfB) +wF0ei<)ieZ6jEt+Rl$)@{b;0ktn`dWz^_QZr+R;{ksWG~qNYu{8}s;T^iqRl@%KjXY8+TJ&teu8Q&o_ +#(+d+F$o3u1liMa5dJx#q3AgRN7jQh``S$-cJ@ng%k`EHX07q%P<=E%ReWF@u;AE7eYmA4;FqlFA78N +?*%ZGAoD87lTLoY;NAlja2}h_h)EPO1^f?<4of;!_XYuajJ2{?V9paHWtuUl}%_{yD^2r3Yy)_$p{{~ +4h4^rrW@XxHckZH7<-Z?D5 +|u(Nq^CKf2=s5@z+r)YcX_dttOv+t_Yu|0P=c`gj;Gg$x8B*WX +XnS?hd&+vKt(FA-+zC4bdE<-_Po1pA6dp=77iWCot~T?ciWYqOM8YL1`0smqWo#R*o?Pp==#caW_rSS +B~rC_W#p_kmRF4%J`(Z$-jKbp15ya-TEPi6aLw;&Ay5Nk?E7fJkjJ3~9p%_y+H-^He;!GSJ#>qCwa$5 +LcMKF5k0LJ5j+IvHIYh!rp*FXlv=R6YLOvlmszjay(cC#0w7`p&Z<1d%!tDSjYU3WEf#2SNQVV5?neRme-`)*7O;zsI~vLlM8(ujE +D&(4S)pxbn}*W7(WufoLf6#RN20KU?o|L7SIkrGYI215P&&DIc>hnKH;G?m0ELM +UQK50hf@96RdmhuX$jT2>A0EQ9x4YyWYtkK1gzjR3wL?-`G1h$4iLi}^WFd%h13Ok@E#=-1?&`U +G|FB>G)S;TIz^hO0o(nLol{&7GBE-nrM&U@msFR8vGyC*(lV~dVopDV@6Jv=BfL)YFORiIPTL1@REsR +JJtz>MPmP~;G&@J!Ay*DW{S69($aFhLDFQDIs!Ss +4!x@rmWgp+jq_XO*!h>>Ys%UbrdH}otgdipue +AQ|75F;{iLFpS0$$I->v|eIr$B7-m*6=bA}bL|)Lk-LV{unmL>eIYC$S)>SWQez!!;!+N?1j6ItB9#S +P)tjrP?P1(UCB72^xhcY%o*w;5t|_)z?BBjXz2x_Y>^8T;T)?B`JCKI+ +i#?SyfNV}rlGpidW{wz2G)+1K}OD?ffh^`z+cXUs>>i99h7+9DHi+Z&5=5hlO_i8(pkOoZ$2iTrT~>; +UcA!R)`zqg7yrp4Cpuk-{oa5{sWes?tTNWmKfs*+;5gC8$_|rrXzhpDF~K&Fnm8Gty7+WG?W!SXF4Pq +%JO1huoWfA5Pq%gGwRYfJd`tv!l}!M$au#UzqcAF+Rp`PXwB_bd;{lvP3>HLF5yQ=*w9cqRc3DQ9DT% +Zp$%L4(hJ0y@17#y0doSW>&V$+CtOWtl>uD+R-9X^50MooyP~Jk;WgNtSV3t@(I??AojKAq`p0%y~69 +~5e&N3!L{?iLEDq4Jlu%LqtsHQt;arB8#Q1UD2LJOlboPjlP%#;0oS7{A`J)5Cabkt3o +wpJarDyGJ`#@W-5u)t-B9QC8X!z!Knh$hU|H0nYMFnJq(VD@cX&dYbz*>*xM*JlC0*?@nlN2rgmkVs7 +3FXb?I^F(8KkX2}wK**9%U$tgMeG{h@O%&f@pKHvD#J#W)nqt^NIf&DPd&@I>;PwXif%rf-WQ +5vH;d1gFA(7vP~tbVxPBkb`7HArM!+Y{Ffp=_rVMJ&xEK?oIgy(u|E3Ef6K!7(hUL?(m~PJf^QUt?yD>I1Of0lP4lSi%EWUnSn<9j*zL?u^(4m9 +2CR7S&(M3u>PTE2n6Pp62FbdfS^*u1A*~(Bm%KsyW}9n6i1+rsmjf+^E2O4lnAj05xmF9`L13Rb|_@b +QU>HbOa(vqWYBoy#^1N;td_@@Y-Qat7O8dWbX$9VO$qRGwJsr3}b7$1z8=J^+8x~aY?(7I$Ef2i_^62 +;Q*7(>{Mqr3e1|vu+)lCUANh+uhiG$y0z+O7??LRD^hP9VED_6Ys^+)QZnHsmTg4yIqqDj&mF3)6uLw +NjNBsaV$oiLQ;E^!4qbHKlh&~xi71agvb)et3tqypaNbvss_g1;^_Cq=5D@QtGuXRwfw@piT>&M&QJ2KV%nEIpY8H26iV8BGFo$ +ZTpPm!>@EUhYG{h>{13w*XSJBA`Qfztrh`Zf~f8SvXrU#3)+0`gG?BIdDC}>~y;bDy +KtEL1!@++8P)h>@6aWAK2ms3fSzEf@a+;C`006oZ0015U003}la4%nWWo~3|axZXUV{2h&X>MmPb#!T +Lb1rastypby(?$^fu3xbz%tQ*Z#z~WQ>P}KZ2%XF@fgu5AYE*HS&bC0-sduLsr|{pq_ae!16fg`OitW +?x-o8Bh?1~+@o@WB4Sxx~z(~9JfX9+C?O`$4M%0bR4NXi!i*i`>GElGkO&y83BZzvZTE1VrT2!{cXBG +qC~uAbI1AzV?a51(J0onKy^+Y1YQ#u<~wHhREm$wVd@U!lDzH3*dEuRsu+fkoLMzl9{N*ugNTc +l5jy|JhlQiCJnXBMR7y&EVapLvJ^mk&9lXVrmtvDiJ*@2q{{LXO~SFccdVTldwyj78E1tIKu8`%&L!g +uw0ld_OR}J-VqN##?h{ul_>SWwIT50EM?Lc1ki4SjoHOo^9Kiov*VUh==)IAHG(+`lQmJ%8fm(k+B`^ +dKb5`Xk=5ea9!E^-?5Fg1*f%mLWKUdt7>X{t^xke! +JI$D;3;#c_5U=cX+T(Qg+~saS98BbxI@wQPM;s{=F*FdneXc6G>xEXY>=6n$u8q1A5_UJKX)p8=nsT9 +u9twKG$FDXBZEnz52|5h;Tsdi@z>kygENSy*hV%Cr(JgiY(EX>AQow<3Suok6e^38gTVXq9bH*YaFp( +>XSj_{rO-p@cq5|3A*EB__jQQ +W74lO$g-(#V-s-QBYK{Q*0;rQbf(gp@|L|2Q~^7E{II#`Wg!;T`Q6a+Ud +fntFeTfXHhnS|J2C?{sp~PIy;7(@sA`QX#tvNRMw7$zZfLlDD0xsJ+%x)HSyd57G8T2=4?s1XAE@}~bqrFC{ZmYjC&Xe|1)rku=l}LRZVAB(QK{3N2q|{DMPWs*4-4BQ1{;tWk +{b5vIBD_@ze?2$~YRdu^WCe3_gKSXcGDFJWa6|;y0aGLwyjz=LMZSW`3hGEfMJl#(YuLE8yOnfrQjbl +WwDApXd=}wtXaqUVU_);dB*$HXrr-2*${0)t$Nz6@f7g#X)w9q;H@%JF>Zvnp)Av>P_QV1dL#Z8B$ba +1DQiy2AAwanXXY4f~+!lIWMduJiJFb6UXTLCfVXO)lw;7!ys*M^0?%zVR8#a|4KBy;7O9&=o`_WezLCvS_{NEB1S(nQ12ZLEmsI!69<6 +}5#{V|(c2LK1r##3D}wa#p;dA5|T3BOUq>(+Jel<|8~(M`wtMv9@gmw!=U>raL0jZRRy`nYGcB!-EV- +kQ_ljI*lr_I*EqyT=E2do`Y5_B-5o0M{!>-vo>~(?G?lQN2;c1z>L)zb_?3S4O +NE!F~aCW=S%StN7*}CY^BMk7{ntWu_aF5yBtlZwF7LI!I+QCZqMe&}t*?2eX9T6skT}4d0>TaAD?uNO +qGwlw%rFND2x60HSh`Xrf%)?<@&gDGA9VP|P>XD@bTa&u{KZZ2?n-5XtV+qm&vzXG8!UF;VYyTEdXUCd*}W^p1Id`2st +up|yeszk(AX(S}e=Yr)zE)>gV^yBT4hw$-1gZb=}kSfm7-VQqmhCbtIL|{Lhzqc>}I~Rf;emHq|e0qL +tCQRv>%(7h51`ecHW-87zxdwW(OtLUrEEACn7Kxn4i3)n2=k^|=>2z}T_Tu9BwU;Vo*+FSLwsKn ++m|s40z6;&EC>Pse79JhNpY5`{Jpp{2pV)V_xh1ZbqnpZ;FqQa@;)y(ZF +?5z6loAAc9?LU@`70V@*{o`%PV4MjZjaUnjkVNCN5)&`fc%F=&`e4a(Xm-V;HOUmL2T5G`ekL<$M;=t-YLokXpH(>0P*>C{x7#(!@I668q^ma$VFaXI$y8{||ZBd|Mt0wOPtutY`AH-Yz5$#T0@t>o360z$femIRi_=Cc{;3rpG^UDD4mRkR8+&Wqy|`-!+r +&7CI?h{0Hz`#}_8IVr|`x!m|!m+LLDx{^wlHCzHMs$&5S++_7ZR=ow)MB0zEjjlRRqXqm8EA(mvw2xf +^xo`YJiV-=?==V>Ue8SI_mt-&!npo$-8pVMnuvAK|fHeUm_N)rL{tg{ttoUpxecF))7So|&nRq!Z6Gi +9KXx!@6-t`m>RK!m$ +X;t+=ttESiTEQjd)UFP_;;P#Z2F4`^WTZj!!AB={)k#V>g4v1=&(l}%%%<1{;n?Y!c{8d)9*zRPlbe- +l&p0~Ps4d8Awoecp+J;#%6TIO8MMv!^)BEe%!1!S+MWX`h;=a(2biJ1lo9T5`5IzaBoGXumlC~6Ez5- +LMA|Lu?hSqP-;^T4_x_u+*OYx6T@LsEabE)S( +5*%h87E8?*p^-_Uamcey|L99+F|o*DX+bqqr;qUPE*AIr`4~RRaIiJ0)M~99u6!jZ*o +C*3Xos>h)+Q0?b>9-4q$4}A%j;tu#rfSOO_f*B4t_j>N*?9l>(SGLrb_T{(4`>A?Y_$50N<*gE;9i<$ +OQjyXH^96w(7txq0f5=Oquf0CEx$my1ph`Jb@KZETST3^Bh_txfxVU|Kko>G#Fb-cJ) +C0sJ`0N$u5fm|saTNXSI=Pd~&rprs7Lp_}qS*8t1JZB=t_=T}ZA1eR|BxLXthB5Mp#Z>6r2NEfm`UWz +la(2b~1oXfcRA3Vm2wWz(=?W-F#uWuH40v20O{7p14FXK(do5zAdA3R-HWie$0X$^Rz$$6s`dW$r)b_ +(q=f~IA#5O%T`SJ9pkH_!c;?v$N;Wr9mP7XR4FJR%bc^rxTJIu_-y=o3?Q|p#}0l?_+Mg#IGScQiU`LA%NdtxV$nmW>H>d~L{HGrJj~qRV`g@p~=>NfPqZO3leeX+*SCCNa-lDeDVJC*rU%o +UNfSP04I>2IYXNlnr+yaIvCxfZB?GZz=~GJ*bUV$41SSbfBjF(=NsPc?==qK8D(GDs;t6{sl +onE{K81Av+bYxCKU-pk$-HxOVVPW@ee1iD8XKnb5HZ0vZrqV8l8*K4Y(54Kc9rbgk}!p(QYXgNpoxkJuDBNTs2}QcLEMHFhA)*hWH1UK(>#j?$2jvWtQ!{%EI3Lk_m%Za<2Y$`yzcSkb +sKf|3g~EABoJUTPjkRWO@`izR$>_3F4}K(6F(05DFn2?XrCaTv_7X&jWeX_&OsP?3)37*ne!RuF2P0R +FZm>f$oBu{@tcq6G=fJ){tzSK6pk$P8fz&qXD~SI_zA9CWx_I@Rm?$dMEM>~~Y5&b$)-3o`y2Ab3@wK +#0vUb#5rtph}{dlm*-^jrIX+xy0D)hy}#@^)#fE&EyuX0%6vu@J8jT>b1vCRSJ=dtVwQ$MfuQ;$wVXI +z*ibUEdEjg|MtQSz8^bkRfhsZu;7<0PWvd;gN}O-825;-api$S_pGIEwOoUKZD#J~2F-~#%?o5|bHa+ +~o)qiO?Pi^M1pTGJt8G~C#hpm9CF-kDsoCkUiracN0RCdJYIA+4mQ)QZ+1YgAwe5U+UrHorIA8iT|EfKm)He=ONy4pQeLsCq$LG +5W?q%1`mV2!q=9!9}I@Dc>8J63<>vjd;K9Bfu!0}XJ7@UH{SD3ZKzYGob4SeWTp29asWeDW|$rzCkz6+2B*E!K-ME^BlzhTB}}gJA6_tv>`beT9;yywq5aAx*< +wiYiEy7LyJ@~!HnFK$zb!p^kvJ +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 +LFyX$z-0TnU<3Yg-cF$m; +(7+9%EVa!DCirrQ!<+_&hiH$Y7!wIPK#g(96SDpXfv>X2sjgLPz{^2%mfB36Yt5jalj?;yUsxKQ!=(> +Qa1Q9L_dX8`Pt%x$|X{~gvmGg3(p$HA^TrDK}7!?#6TWSn#LuSzFEN;afJv}|8FL{=!7k_5?}z3&TCzAt&hTQfQTA_Xh1#p=jji(ON%)TnVvF +GMFN70zujKZCU4y~KjJmk9jad5O-a<3NAWpPdbs=Ey#u427y%9!@lQG0P_uTuw1=D)<^#DsEEDRpG~c +B7nE}?i0Zxl#j?73_O?sWV9xeL}8k8qNun4TrI*>8bna$u{<=FtK%pSSIZ>A!Kzb5aywKdr?y?I*|i! +KX;mEOs>Att_yMraPCIn=v_rx`;M3Mka_(}i>T0dEe~w=9=1nBy>Vb|LwQe^MbKLn@Rp!?lt&NRd(xlqID(rYS!JGRb>#j=`4(bWLH?P$2I##v~Yo79UBTcR8m@D`&gK)YxJ;D~E>06^Xu}BF<%wfSu4V!Y`LXQiN7bgm}V>z$Yv98YW>RS&T0bdQf;M6rrbzDNc3w;U%gbn?o2KL$G1nXHu8Qn_5zgUyXU^+K}W|L +AeCEc?P(JfM*9&C64C!Xpm)Ua*juB)D|4_#sxS_*k>c%P!vB&i`ZSeQVhrDBQ~sH^a-OtCtVHPtohjz +!d5aE$0$CShZ!uRmYz$PfGV`|JV-A`*KgCeYNjZ+Bg-#wtxp!^(~e4b?(~QdSf?kZyZdMw=WfDN!P{s +{8n{dIkiKoHkl?xzsir?wBW`AL6gmknc~$x-9z2a;JyIqRGu2YbAER;aJI8S;~1S{zC7{?;x75mVbvY +nBggr9q0|9~sP8}=jXgi#+F8rz*%a8F+irF&xW#mq`?2;FQQ3EFSqkMh@6aWAK2ms3fSzF+NmX +FmQ000iX001Wd003}la4%nWWo~3|axZXUV{2h&X>MmPY-wX2j}|$VmSm3fWue&JdI!f +`RBeY${hds=W7yYX|a|Iaz`e}8- +Rn*B$@-(J%qul^n4EXRRgU?$t8X(Zw&&jHSOo>wxw`aIcqv(@tTKVJVdc+>y+&CO4*Ud?Bt$J=GGhk^!L|4UGiblsUK1NpTF0DL5OI?XmZqJSzVBWG4 +d{QD~0bz0&qB-1L`|kyhNCam{w#5hJKLd7=>vdVnct_N&$Gf!>E6A^NWN&3mw2Ap;_d=pe&^Y4RVqd8 +r8T_Su+){R&gLcL@(J<w{gg +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 +Un6Q1dXYyZ6Q`NV42oN}saDETNA^ +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 +ek}!m)3(cJD;{ +6F0v_*?!4YG2Fdsh3gI^Auh4l@8K3OHp)<{vxVexb0HVWgKHne}Od8mq=hZuybB0+p2Hcu3ICuzi3ceS&#sy7FO4FROZHI=G!B+Mh&ne(E&-l38|ygq(=G=B5l$;qqNZ>Utzo|ysy9lOb#)Fn31@W)G%@-5*-;ekS3q`ip+3uEnF1k!sVlR2iqqPp< +G;bFGp)wB$o@Xv6#0BMh8`oO#|N{zT8^jHVv(1!RsU8M1R&_yJ?aW=4Qk8NNPXFM?!!@>?Zf2n7frLyoBgLBfBfkuFsL!@G$!AJ-uNvXZ{rt09qZzJj +WGS!-kaViIj>-=9rpBN0I*9nfV(L&=;_Y*We%tQ45l4m(TQ^k#YgrCIgLH*xmvw5`0R|2fp>r-D6bJX +cFP<{r>DKw4##_Eqa^HTSbJ+_?u|dD5gegqj=ea!zJ&4uM0MPUvNJw9K>%L45Tt?y6}}bL$**$!TF?j +1;+q1fn(4~U7~jlq^4U=dwDttZ&I+mlCxNu_IWU*!c;ne5*^1lDk;g>Fka<6@kC0)8^K9Yj;_WHfPmW +7K8(gP;EmkGx%~$3KXd1;!VeOQ2>Su(X^N$X&u!O0En^Qz0*kyMVxCh8 +Z1Hgv78e8@NNjz8^Dh3ydLb4qy|Z +BBSrWn+{|GfEP@Wsi$HQ7b}`QVF#(JbV1R;TQY`p8S;Z*WsgK54o@OcxXGwuz%naW+0a#`6+$G> +l)n`@cs;Yqht{Q2^>n^GrWB=%LBlkMV`30DDs-_?L4ka-oD*=y)G(sR|J6jXXM;<4JknHs^2zuJt`R%>JF +v87S4lZ|0NZ4_84PXV#uUEJHzPQ>Mhr~qRX{!FIS{y^`MF-s5No)Q*Cd}h@kaf{_8OOJUCpYgoa`J;sLF9=I*dLIK#yu#L@YILQ{-yJE3k(1r!>7U`?mdVEov +0ioxs68@WFI}W-?$KVjJb8Na{rUNzv!ZddQ8tVl#HGTDlWmmW6fHr~_P;e7;B}u- +-)0{v7F+%w(5vnOlfspE$;S_K`-5})x_$a}}{t+xox%__RBoTX5uS+C|k5DLD0dG5pn(GFIhEU$f|EL +N917?Rr#WW8zAfSz9ehb7fY-faREY{76<$+$Grt2E6$}3$5r}NbtS&HKeUOu>S&I-DTR8y$a(7r?VuR +=m?S2rZmuqlfbi^6OX`8Y!_$M0&xWI9kzUr-dO7%HIJD428u2|+btQ~2pIz!IEvnxEIA%40zz*S_9s?QydwZCiicI6 +ntSP2W3JnvSH!S;|DGqNxN0vWX63-7WrYLda{m>U=>yPB;x*Rvtx>&Bv6WXo9lj&!=0rQ;rA8Kq&jp_ +3Ic#$pJ4^c2{o}xfggJ^8eWRPRVx7cI2mb4z@EdbBm)(aHr&5FA9Jbwo-+O3kbN}lc}N99dXS0!HFvN +T1q44DUdS1lZ@cWxVSkTLPrmJj!OXF|fJC4G9IPOQ?V{uP=Z(_U74k3&}Zbt2(2-Hb$|Ud4;D@x +n4Rsg12b-MYf)=SUO@yb5a+J3=jm>RdgX`83l2BIU{0Ujo1MEfd}-)jmO+izRgOYZgw0mBB-LSzvhv< +n7Vnkq6*i*oZ!%IGBt%PJg>?NAfl^SyDzKNS15ci??fASgp+7HU}scA-%Wln!W1gyvA=E(fdL_bj?h2 +eg^a5tBLiw{=8}0J!duwZ83*hbZk)hrrF%p(+k&o!#=CVGLB9!l5p8EQ3pxFvxVDpv-3zy5ms;` +q&51Mkb@m(O1R=skM#>buv^kGw}DFnsmhTkqkEqwkNtd3B1FRl{fLU1F}uUE3RlY(hF;IEihz-(Ofg=>9o0a+}q +&fMcx6xjAFuP+eq&-K)=x9O6Yl+t2JBJ0NreO9&k|{_MOVa+RECO-}sVEMFp{RZcg=5^(*5gvAZrma! +(^*nror@w$-DFVxM-T$bP|Tq~$2<1u{02?f66F|z12RZ8*p;6wre0UiY152OOmP?L=k!p&YGVpgkX#h +ptq8sSBHp5nPusu3~d(eYQu+({^#0&UkjLN(@U$T4eY4CU^e?U&tHG!f*ehF|tc +nV+!^Y5^umN{Jf?J6J?UIDxw>psR;1gHG;$ypaTXwN}Y!`TAt>Di8|j@x1@Mwp36@g&JsgGZ0Z_ySnq +p@W0dPYNwKGeihxW@3E4IRH?rQ*S-~i{vk=O@k)*Ilj=fnYl0bh(wJ{=Q4fU!4~-8G!S8UNh5M2x25$*VRQutL4agQ6%`9 +@Dh$Gq;ut0Kclq-nR6jFV6;qKgITeeU*|L)!6qz~70w~NfoedupNc~i)tJ|Y-m)E2z|*b&+okJwGVo+ +(?49^OBAfo8Qu^3(jO&qq4%K;e|xex#-VIKaiuA@@AVy}8z((t>S>)aV2X)zPcHHd +%{qEU9&}mUrK`wx9PE1@aYaK~` +vQ23J_#gfDCk9QP54!@u7c+5CFd9tH9ad@!zROFa329bB4dT@|LMi$HhoK~^1?r4c9HAQ($-8St*ggmLSv!RK>FexJP~v{Rf9xi2|EdE_wU9K%u1t8p#eAYss?&RiWj0Zt!}X%?Y>|X?Q1h&1 +nJIh0F4Wwv^oW4+N_-uro#lctMKHqjqJ?myWyESi_KI6H7puBgyG(+J2>*X)}lB{8kOP=OjjMMwgyOn +^}8V+2MEX$n@S%KN!-dmnp0JctB5%CFZm`AhK}V{1_V;K^+529Vk}5TGX{YLMBeR`K5MBxikV!-xP4Em3P92rBtV{Pgk+iOIZ>+paMhxfTcSYTK +4fHkpgNv)7R|9&`KOwcvO8VGGy@Lm&-G-i2Rq!+fb*2~ITqjBLh +0=Yic;i*e>gm-$tSNn!-TVGYb(_~G&-({Sf4Q6@CqYlfuvBO;-dveCA5h_Cpo|g&PAT0&oyT1YH<2nL +Vwk6UqC1~@ykx@%%wPZd*W@`XhUOcFCZ|jT1O``aGTEx5L(_Y_;1;Z_D)W5SkX;V&8PjV%*uE*s^*cI +%NT1;!2xR64dlxVF#ih1Hwbr*gj44(T6sUm2mOG}&p+=D<#Fr^hLf9yXpaY}8=_~AQDSMRZfZnQJ8Cf +$Z1AAkQR2g>ar)S8q%`+goy`+amWIex@pi0lEk!I;fv%Qa+9%_>3Ucp57Z!&$%71N +2fj-LSr>M8hiw>oQRz3Ab;+@Pwy6VJWVt{%(u;oXA!HYjssu>&vS|yeLEm5eP@UIvx72whAz`YmuoQ{ +4{$!{3)eBdxP}R5LSkJytOtL@oEP^c4;pK0>2%Nu2D6n?Dd#DejumK%rF#qbU2ZTe(LA~n(Lt}kYyAM +&o`Smy(}zRQn3l&#DH_Jzt|D67xQ_mdY$8<=Y_BTEs!=~<46LeG23@ibOYpUo;pJFl8A#Z3MHL-NG4d +*ye^A(o8;9Sw0D)!nf-3Ygq4iEDH4)BNTC9 +yfllk^X1@(lKPP%pb!kuMe=Qlw%=LJ)vKCoJM<^IMr}c9qJUv`A0a3nnjzNo3cyrc75BwBh<~E@9@VJ +{xw=cPFB~I&!I0*pQNAkqQy}ipkRLX +Aef)FVGi4qi66a_^mEvCmvGLLEP~e?eWUWrY`T#(jUAQZY2kom?258+%*rDBTjfk*WB_zHa6fomPEmzxwmW)hLcO=(~v75UtWI=MtUfed`{0p%(_pHB2*3ubVz +}nYS<@##)9XvO3-$5r`=HGs;#-t0sc5heA{}qkMtgOUE5=@oC*9LclJo-KI$;+K5144SbFsmy@CyG8#$ZURl^(XT5Hx{PZKeX2Z(h +bb-VuBRyMxF;x~KGQKoqBbD(aI%~NR|ns)wKFpwJi%IH(#>ee1vy{hdWq-d5jhCtGd9IlgCSNW@Sbqf +D1*TV!kC42O9tDVQ^qKvttVE$)&Q8Xx$RjI;?D$YOcHH}Rb3<#g2}Qpx`0iH#i3y;2R4I4((fpC57X8 +d2srn37~QMZB8!it?lHe)!%;F74NQ66H#hjRv#uTOTHHFpK^qFPzsK(hPS|G|LF9IwdkX{bctv=1EZd +8w{8A8#+;36*UJ^ik@ptBL_s6(c_mxYJB1tlU$BcY54#UeowD;7-0HIhi-LhAS`9%N~85>t`(Fyxo2p +v>B1@Mb1=hIYp&3@xkUWrqnrKAG?3(wL4hp@F}`0F+Nwgpg`S0XR&=z6pfHmQm>WxTQj?IeKu5sk67H +A`~6>VmG{=ku(*rf=d%noyJO-2W!eW^`LeLkFNHbMm3MDpqV1gM11OV!4FYNHCKF2Sq^GK#9Q_XcB&5 +cQV0_&_*a~=#A^j^a}l7@eY9OTD2%v7#+ZyAv-%{MtMIJIBp`V3kzV4!@fw80l9=tCPrk*;D?jRFy6c +veMUQg@7hcAjm*6500)Q=)N>&)R8LGJt!_BuTIm4)7%P7gYq}J5q3{)|0Q=}&K1EkOH&G1I^bgJX=S4 +nqa0x8B&D9%L{mC{Cbr6Hr#vUcX&PIK><$*{SBNDn4#bx*9*WD@j-iE4agY@7Vsj4SZNjE}L?{qi3_Q1l7=O$K_79 +@nwqA!3VopERSvaF9$Lz-SL91mRZ>505Sb- +0rS#}IY&~>e=Dw0K6`ir>1gBmI*kmBG@I%wTp*BJzqY&EzJH6=san>%h8DHm{#yJAom*?~*^1>Qb&&I +22Jk8)l$Iwn)aHgV=Y`6nja$&|JLRnupVO}2ERd98Y8Zk=^2w{fm)n;>{nOtoK^sljPBDCN@MQ#CE^1 +jH>EMqX8HywtBCp89(;**mL>otp81>WKyrgNX3kv +d$J{-9uMq!X|Xr@`82f+D6UaXbBaY*J~-21OS1DFpu4%x^0Yc)Ig7=tx)of`=U~+DTYkpRl>>g{2&78 +p(x9YX4}fQVM2o>njNEfs{*g` +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 +{qhP(hD +OfL3oUuQ@54(EZ)7uER^jYDb{gi5Ra4P2J8xE*Cdl7e0#1POHE8MHJ+@#T$7k061FiuF%sEIOk~lJhc +QpxqdSBDHSvr@*r|0{{JhQs`$AzuI?R@Jm&0Io_CiI5Kf~6+K*vV=$iNTBro%{0dPo>++sFlIDO!pC6 +at182YV6#Yc?xZ!d?Z-MnNv4!ZJS_A2r>Xx(+{9yg^0P`969w(+UvPQEE#j`5~ +nU1KXFCwR=m!LG>g<XZlSB)seiZbe3x_jngk3V$l0L2icXD?H3N1`Pv7jW^-Z;1Mru +Q{*H`uZg^hL?fcjSHJsh;H$;Pb=5hN6%}NtwtNVp>5=jL2t59ZZPPq0|glXV@tEusZ^-HG4Pp0;p;0u +Mu3)A972#IrX{I#^h45EvAsKbTMGa+184x%<%WM_5)1sCQ)Jo-SOvvLn9-~1ay^^mlA|8=cYf*<4h8Kli-dOeEF3|(oRGergNknOQlkUl|>dlVAm1DQoM0wtHGm37`_?v%?-V3so| +1?P&)X^!|@20jAeXw6Uqq!IFdkDJb3G;`E=lfc%k|qc5W+yt+D}mv#L*^0*bX@7|~PioE*H+vy@|1<3 +);Bk5urw5taR-@iaOZhmj1>lr!>$68Mvu7fy-|5iXw697G*4&s_$Ua+&xpG_3P`;fzF9=GI|&32E0&c +sZR{ocIiO(ST)Bs09)~;LxDZmH&IOM4-PLYOy5xoltl?Ao9HwK=u*}BPP)#WopPZU8uS5nyyY{XWK$E +L!E$GM8NA3PJtfx=kl`O=*xszrVhttX^UL&Z76n*P9~?2Ic1c)jy8RfNS4I(wi;zM4*|cBq#+Ia-e9E +1(gP&bN0LPee_S(veVLai_%eBs`Jky}H)BGMa=lF8=AYMF%%G>MUviWf5UZ@F6PF>FM67=U0yEIi{XL +dEPWpR5A^M}_5%qjaBFgdk294Oqobz#P_r*Z9+)^?fxx2cC6%LS(bagJW#@VzW +)1ruFmWH&kIZ?iWsY_}OEx%0W9~KFu^F%Nd|6@aK@^2lYWyZ(zv&eQQz(pWE2)gLHB3T{ei_i+4T|Q| +Wn!fOi#!5?kgqC6*KqJ=xlGin)q?Wo!@G?m{K9MliT0U+z@KYT&2rxNh`Nl8DOz{Hb3JcV?tftnj8*z(eEh?!w| +`D(&i%(=iR~E!FLDEP`i? +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 +Zhv7ytT=c?Bo +!a6c2hNoAkiq;IaT}5R=&CzXRulg1JhqJyAQ>@fF98zp0~^17HTj{6o(CkLU>=~>gj{8~$w-balUhMMWa1O +20hqHr_Zk+ZwZ#q%Od~4l`w2$z +(`$Eb$nM=X%Q5X~Y>5-RB6f6X+tG8>1eHUlvg^S8d4w)Ua9-TzoMaD!Khee4LNEwt?V)V{Ru#^Em(HH +g7te;49_e5OdIo`=WEm8f=M8AL9+E_JWO+l?%wp_4ei)(&x@HZwtuea1r{2k+;s$_s0kYlQYDyro?0g +Jo^0!gU4DUuUtW +ajRxJIe}GIB1a{~~DJYYPzoc@INGwhgw-jlK4pl!CVnxFb;&sG5_YDn_T}s{X4rQA8fqC>f|tWWNT$% +u4Cdcc#7@i9dHO#O3Lx(ce{9WL<*3Z7|A4xo9Y$wu2PUne)pr#C&#LsGakCiX_#;RgVrUpNhvrht7uxd`pl2MGjj=h)=NKZ|MFau>^(I=2k{JcTKD$THgiKBImM(WK@h={v^0%R$Z@~^ +cY3QbzQ9PQxi@M0m8PGC6bqszCQg4fv8z&EX0;UU#s5UN)hA|j`-<3nZUf@$1UQdE+r*$vli%rz%+Fp82&;0Hx9&ykwNhUC!7 +v~LG8KP@|-!>Z`MyYb!0Vv`z;`b+|py;!<)0;TMMc7F_(nA3gy$#7LwP}g@4d$-P1CqB9oY+(=BtL;+ +pwEw#GfuA*PP50c%T8=h4u^I>)RuywfWv%@Jx?7=UoNmXf(b(~mK0E)?8@R)nS{|)ub|Ke-RAU6Y*XiO~uQ?eWk&)NuLR}PB8-`EP{V}~5henVuWZNrO}yulN&O10QFk1c +${;_vu1uEQXtvuB~)snx4(E%>_PmV{Vflak8=kviY>Sd*h<;5lykQjCXsZMJ0DzV{nS>$W+jhmxV+u= +(wtqj4+1s0LxA)f7&pj;hjc4MFwv?oPR4-X~XZ++#4|3qDZGSvE(-$;n^XYKpCwcwW9kr|Sci3&t9<9 +r|td_Hk_ct7_kXF>y5Mx@fHe>YQ}XWP8D$nL1*JG2t*26nkjkF{jKaH&CV`IX}pmob#!TocXKd;s{eH +i61vXlGN*zRYT>$kjd)Q)Uc{jYzRU#Hrez^fM_#D4j@1{Lo`Iql$`%@9OeyrE{(t`O|I1T5waO^BW`A&!&#L#{PSXcJvMVbn(0ZPNF_4G!cW +=Mi`^=ZVv*mtA?jo;bDS*;+* +`z9B$QGh#LV-un9u{!3jV7*RHuegoKL*+`MtQxF8X%*jT?Ye_hIX~YEuu|t%h1-=AD%ur^I$-AovxPJ +q$VYn8ntm~TXV>M==P49#qUbAoXuz9vRQFF2M$7lfU$jx`Lph& +jF*F~(X^p2;zy>{s*xy{JzyatGdt#z6h&a6=+}nq*7uV?ByP7y}D0;G$|AP%N*?Z|zKs*)9wJJsrP28 +zm7?2d!Q~Np1ck!L%olx)U}pDg7|ZWO9#LBKeAhc5{q06R%%3TL=Ci$8Xvh6mi=GhU*<0#7hPqM1m(w +^H5TGL_5glX29BVaQ>@oH6r6!WK-RqMUXZ!rnMw8$*D(t=rze?qG=8W2e#R`S-&D797&pG`zi?=CKKP +i8hbdF0QMM=oFi}N?=nNq`Swcp|RK777jq6K?e(f +iWFQ;HFO>|!5Q@DLCYixXo_agz;~-5>roqlAYz*#SCjA7T`OX3;`}$Zc3=L=%yojtp +#1h9p#~gUE!d<u>49cU^#i1pTZis^26T{9`5?(P-$rTw4OndaheV4K`9VUY=a +Bx7(XY3k6Ux_ipFy-2PkY`|MOsE>n^K9=LNa^kV#p=GR3*FP9AC#c2p`&FW{Zey^*2s74a{{7#=Q6f1 +V#a1HKU)>d5g#E~riy9XAntwODdtyv4RkH*X~Wr=sG?=ph#2C9kDi)n=!Aew^M%^b8+~*;8fi*Xn_a~ +nfgJ`CL|j%oA@`VW+n$hA-A@dCtvcdS4DU8>_wSfCixt9|GRU`Z3*Hqh!kl`NOjK*5nJSLZJ2V4yAy| +0q&Tn!mgk}$&kfL*sHTnU>m(`2Hc_TQfmOS^lI~xnd*5Yc)F%XN8I>r_m^i8rxBi|4$Z*aXwz-=eLc0 +61zjn^G346qxZRjz^DnhMHcsA +461bto_jCeH+1?2H6TZLy4+8`r+{1@V;lM^d7AHbeN_M+2Tld~Rh|KG}{9?Q1$|Gwaa=9Ev5{BLg96p +Cd?l#2$hp=3V5N1~2D$DPbZI^OBAjbVJ6s%R&3h +90mRH1SAwIL_s0-KFqy}2eiDt1VD3OKaUqnBXR578-jl;kiw}dI`Xaq!}d)g63-yToybDRR`s!sQaTn +9Um!+(`R333`~gzbHcTT!Rj(v^NaI{+?Onz?H9n*%1Fu6|+v<~l%WH{mTjdYJxqxCjG2v~iCW&rk6b` +NlpYq=$u#I%e7uTXiJ4vau#*fHhYvKZtov`yP(0`dpE@R(&6F=6+Ayf5mYS4Ab-JASrd1nPMR7oKpE>jNv211BM`Fmo+(3p}e@juy&<@6nZ5|8tp8OjF8&q^TtN?c6UB<(ghwiaD_C!vEyZoC +ytTcNuEsSJ8K}Nz{GmOX@xH`0chpU>_}V6JUK2Vw#bd$tIEX +;cm)EtFhN+r@$Y?zF&sN5v8~q~+FmZb1qGuMNxG=@HE*Son`9CBP75`{b&eRcf2SwXlxCJx@A3lq!nItmh^Orz?2lMB>Hb$~7DY;{8_**AN(jwG3MR>qMF4Xguo*U~kkxUEGYeA{% +!dN>9C}Z&<5ez~E3b^an46ubklnR*>v}7Ea$%q{3w5w+riku)!s~RZ&vMN>l>7sVBTPo|d39pQr{WK! +HW$t*X70D{-5vQ6I2x8UB5}~-~#t&6}oz?6B2Vi%9|M3%|sk^^_`bj)WNT+eRG@9y0-Bpi?s0z>sM0c!x3TTZtvAnh*skD_;ojFSZKI4E0s{J~QL3yMg6`*eKE6d@p(?S}mX+MQ8>} +5U_*o9==yi{;vKooTNXM4kLRux&dX1U2vZF$b}^tV9-DglEr3}#6EreWSA&uWcG}g?V7_E+||2Ds%xV +a$Gzg{+xvX8uc`yi-NIg#!20rQ&$hK^hSF2l|CTxDC>9bJO~$9!b2NlJ{CH?$)-9H4HU(}T283Z61`! +UCTt@8llN2a&8IB3)JeqNke7mMtOmEOw9LCMje-7K!hItUU!gDNI)p%Ot_N5I;)FTM8gw_0x#E`wV`F +vZIjmY)R0n+3NPd^?F%|fUvfP14+D`gCI4SG9T&iO +ZHqBXdI)6j +|KbNK??V_PyIqM-y_%i32p;`4d_uY8JKD@Ge%^HEUGmvpl{TRSOKQJL;ZXbN+HW7e=46+D%@Slq=ja) +kcI?AVtvPGR$4n%7g8$Xb%>vw?&y95_S)jw2-|Gq0`PNfUyO{-6H$2Kdh%(&*u-vcqM0#BE9!A5(tg~&D#>6S;Hjd`sF^nb3f<*sjP>n8T#u~_Zo!Qtwm}=ynb)9D2g$JhkceNN*%D*%fWMA*27YjL +>*Z{C~fk{-C>l&^;>_VVsONYe7(9BkOg>e*E&=3aA98Wiww*~2Krml;_p|vT97if=x^yYPTxyTM+;8U +DFPh9Z4Dmh~~@a!kA-W>lm`S{6`&(K^ac}^{iP!K!4oh5@$hDM^@h@@eGYC@U-z=v|xq{(-flAYd~A! +X;}{5lvWz?5I(!B66X701W;&`&T +wp#NIrITE)a1x>zz~76I!Bi<3`1>F*L19w>A0PII_i+^mJmhcZph2fH%2#-Jd&u@+aFJk#?SwJ^!zW! +FTXwzNwm4;To$XV^*P+>7yHZ2>Z&UD7n|i~pHiPR`%nMy@gJVvS%c0fpw6b&A3pi?U#XJYCHRZbrA5* +2*k}(2)4AvF*$0ib(iNaS3JxDE+_Q^yIpsUzyk0Z7!6JKykuwfm;)d<5w(WL0D1+T|+E6N@On-qH^%k +V`zYrTXI_!`U&uW8z9Bnd+de{KE{TLHUO577QuGC%fYWT*dzO1!nPfP|{$~G(FG3!fZv49Cv%q<6nbi +dl2{)N+J0CmpW*3rdAWe2o1p~gsg`Ub=6miiyaIqM1V0`83&H}+IiK^u&qD+pg5x}oe#>mN0>)ubdj|V@c@bB=^zx0MF2aSQL8NYn?ZBUq(!mP>Qi<5uDMn6CO +&%Lw9LxqHU_zFl$`whKaZty+1ImSy^7)XIXPag*X#=qDJzRDly*hsJ?{r>3nm#^L&0bzk3$6vpE_4?@ +fvo}Y;-^d898zBmyPhhfF7HMCxrn%0=_yy%=fSuV4W6KsO6=rsf6zt6Z#C-|X!p$$-b+`0yBKQ$8ZsZ +LvIM7A%j)C@!SZJV(n<aeSTe$iVvYjsjr0fu?{wK8be +?)IR28dT8n=tl455+_gSijrSC}D(Cdd}ypFtV%h{Zp8C1JkWR-*_CgX$id5W038qgK!T08qBS!G%0|4 +7>gSvy9ul@5;78$cjf`B&Q!WXMN~Xf284rLpGN#JygW^P7B$d+b5XP4|v;;>LHH3k!)xtx@wD+pyl}s!>g(dD%T7RML%_M3BNQ +Bz)>g4tbtI%@!X=YH2^yj2_*cf@?HXS@&^m>BCnkY%!?Bt%sRBTqSv5@xS1Xi%rlwyM0<{e&H64<~Bl +&z2W-7$b$@Qg)j@xX@TxeHbsV%x9YErxnMhUOPZt_Deu{6-UJDI>fo3LG(-ANO%(VlNYaV?srU+4J}P +sa%%mDDxJ!VbA;a05SQjh{fpCtXOQq>BRrHL@tz%5vDEVO*IeUk7(GkBB%u5E*$TDQGWQvn{bOD+W*- +EGHX|mI!nl5v^g0QiX)4!-#;QQuFY%Kc+|HaUZxjUeYI9;^7)yxV<3N`D{JS2a*A6qz)V3CIUa*nv-| +a*!j*PhEC?4V5l7((7+TI_)y!~w+aOP;Xr%ImVaEsyYA431U4;`>t*nGy?aAel +4G*oQVjX66}G_jpOXm?2;1E3s3gx(o9Du(VGjAK8T=p(!Yk6m>LH(cN}^>Igp;DeiA_K&GsIw8N<)Y} +9!L+xFJgz+K!_9yAFjiP9W;3th!IYgiE`UAWCD>sXq+LaFX;f%(WTJZBE;XO#pN*CB8Uah0j`l2Aawi +A<5{29f0Dy2jYe6*^3I0y>8!EQzlYezCWhf!$c +zl3J!8eBG;jkq0Sd;zo)j-4`c1EUf2e`+4})lYjHOCNtR4Bj0^$}&ax{Pd^W6fR(4fdhDerI37>GQ%$ +-V0dt!|8$x@`ss{H{7c{5pz%*MhZr-EltZkkr=n=P>xSZ6@thzCG&qF`oJYvCtQO`d$g)KA`V7Gs!6p|Ea9^$7inUTYGj80E!3a?n9y#C7hd$BuyK}w>ThrJ( ++l0dotm6nlpI80tYf56HJdEKG5gsoP-{TMSSTUz-+Xl-Ub;WCBwBlBa_9tp+H+jne-_ll1u~NyG+;m3 +5V6{MM$Ne|CttDUq#3*BPHJo$`huKDY>}eP{xEd9GAbr1Q(}${@zy+H_c^`UgMAcnUcpaD`ej=rEkZl +MWRl{aJYCH(+?gt{**(NTW8GOnnly=IH5g%Crje?@uglyk9@DgKf_>OJJKkZv;I50OX^kvZZO4%pxi>tlHbT~NrH|RvZw0jws7K<31)5Xv=a>>G!f^#f%8NulByjY_>7>2J>Q)PxUG7tmX9e +{l*Z*W{HK9yDf7I)(a9)WQTVRuE=3;05<|5DQ$d4Kkspbh$np($t!c^Zv9WA3GGpJYp(zf-J(XBzvIp +(96y!NCQqKNh!3ii<)Ff~JqHAY7(6(LCTRrW~)x5A+D*^AI#Z)d;Q%Imaw2gY3n+_2jZ%uys<|VvQ}(mBR6!y_Jn-zU4Ov%va7`?Y3?4U>m3M%sHAS&|zZsIiOwo|}Y{K(R)o!C(pb$QYz0mAM +8)V$K$g?KJj)`WuV3T;^8Cqq3*eNeI!p%j9Er9so>@ZugD*vz^+LzkEHW=u$dh?ftb8# +``*A;@0-LZab0t<#goCtpLqpZY#6gjN`>lejI=M?0>&{t%{1OemgwtCVqhV05SN{*I#Q-@i6YO8Vr(D +TxRw`)-PbS`XWu}dt8?EJ?=7N8!^-l2DXHOx%zsz(ljf{CqR=WS%6Ufy)WWJ6Y +CAIYXVmlOz!9a~e9c3SAHL!N;fLDzhqTi41%PZz>ZPuVUMYjH@ +o-lDQ!mc2H!!c54D8Sh(1&3MeyHZaFCz1CXukNb5r0*rEX*Z|dJap8{A2>&tL_}2UD-pgvgT^KSa#I( +r&5v)RP|+n@=3l%&*EbY$X4X#b-sx_jW1V7YmvtHV?_+61qJk!VS0_LPQ5C=9GL7eI5S?=xr<0ljFo? +(>4>r~fRcaXI_9?rH~%$o54!G0=UI-LI;0%n7bwp2!4)~KY(&^IRfJ|4HiA{<-0XRo +v5D#DHq5>qt)d99>)Y7~B=r`XUAw+yXp%~@+`)*Oy?CKjA=r+<3|?7c+TU!mKo(I((sEBpI~hmx&O4W +QzkT1{!W5kQtdSOZr(-(Qz=3}{7`;mq{THxeQsO_D*8=IMyTU9}_90I+OBT}GZu{A3L$W;U$Rz+gA<= +rw$CXI5jN4i8I@1Qpyh{O-(1wh|ml{BMiJ^kUrwZDMO3J@=_%BtMpRN@sNF1*EhW;BM48OL#u7BAc}} +xz~EyVqMi7iE9Xwb19aJNX=X>NeLMd9&i}Hi=HvUJ4oKQrtrhCt$A1O1o=A{dp4s`oOw8C*U{7z8BpE +;L^0=X?>#G2haZyn*xrYpC{|ra1%(K)Rp`Qu&ZF}|m>#tCTde23P)YSZid{ +kKOk6Lr%lfJ8vEh>_!g>y*d)Jzi2M?g(M2robktR{kldv +5bk`7F(wDEq<;}*O*n;xXRUv)Bn=4>7AN{Ejq_y++iJyM&+k$WM{qKz|GP%kr)(zbC_hCryKX{P>;fw +-uZW0bfPYs +rH>na2;aGc3zga&jbN;13Ke!rZtF;o-cQscA8W<;g~E%g;D&jG3lkOB@h%g6A0{+!fPMDeQxvExH2cD +dq0jS;wN7=#J1P$)?QmG#sK1-NWHlT#%nSN~WQ}g_|K|kG06^YYN6z&P1M`kRemK@xa)+WI%v27PEQ+ +Aii`I>zXaDB&(vx?0LAeMd+xE!8xcxAlId50TPf!&ul>+7W94?2St*7?xukhlkM9+XT`i3+w$@S=cm1 +&3+8;J^nm}64uGzCs2ae$#Qtj!N{h(p<|E1|9(9n{)(+Lkl8a#V4W9 +||2(C|0(H$p~VYg;$I7YD?%LgaAfe85lvH#gIpjpmx?A*6}$8#>dXE)|ZkWhXiE(hQxSuB^!?eZf+Ot_@;Th7e&KV7kz_^8z7)Q1MYEormGQtZy+9?u1${msv@c5Dx> +qZ#4vY^3XGr?m4DYw4n_q<37BLEijKwgT+sT+v>jz>`ll|_rrkGPxk?4m%2 +KIwln0G>To{a&K0=v0m~Z1N+hyqB+RcFKBVu^j2W_HRCLq|>oG!Yax#W<l}WgzG_xQFJVUg2;Xx{wEE!n-^MO|w>YA0use5Dz +|ThU&oWz_+%Io4ITGo`+lfHCrd3lQS40A$P&p81+Yq3obyN*dCYC!LzY#{l{v_dZ%k{WznLfVF +W%&y+amFL5!@LrqtL?yUZYc!O83cNzpMsu8j~TJsT*W5`!6a)w)_;%3BOpP=9mdn*{D-ugCB-lu-oRP +oe9gcd1*!L_&?ORrL{z8@z`PXgP$!CJVx!jBI=z>tBBnV*MT^MM&IDNkBBUpOw^TVGGX;5i8yd$gog* +lb4TVk*c?h%9MPeSVpRIQ}>ggu}ybiV$gIYocBS^r2A0C2hMNu(yGod9oKF+r=>%>k5HVP5? +pf^t;?N)#ZrNA51(uZMZy72=)YNZOeI4uTySCeaO9V7f}Ic3~}4GQ609;Z5K&xoeZ~1q8XIlmgd@PVA +K{Q`kw0Bp=|TO7-h6bkYt_7_L#i4) +)HTPgGC~a9-$JPr6Qpom}$S21&47De76O^lFtPzq!<2|_f&_#PutJOIdxCQ%pD}LjG)u|4;|uYEsXY8 +gwTE4hU{7o +bT{3w3iHi&6?okM-tbT^W^Z6g2xVYNBIdpJ&^ej;i{X;f-k&OA3$aS)HA*=N59Y4nx_L@h)?Bz1R(LF +4wA(_yMg$b=xZf-HkB5Zrgl!o&8GyrkbIv4~no8?gSDmvyV06NDeQaRmh_uD}Uc*>K%p;tzR3Nja19i +gPHMyV?pC)bF&@^WT!h@`RE!H^dBoRTV-l4L-__{+;C6z>7LUKN)p!&=rwRij>-gjs6*gIK+P!YOW7f +HS(f;Ydas&fmCaM=41OwyjICGD`yt9G|oP;#hYC{J=V}Z8^@VhxQ>&hUYON=RlPVtIZq2bGH!Z7^$(H +hOhJrl_ntlV9EI~V{z$GvZ12WtH|{Dq30tTTQx7&3(Q&$Ed_}NWQd$x_mD;rm3|l+5*2y4SgZQeX6Ve +vq~Bgtv*KdIXg{E+iFWm8##yPs%S;CpVpV90IFbr=F=LD%8fYf$;>?J8(Xh|nh}mTM+k~}3=qia^587KHj$YUkf +HD{UY{lqkaT)&1)|fcyqNnA)8@l5@Q6kX(5Fmq1M?|^LS?j+kArR8yVn5j-}!A@LihJcWKi*q!7)BLM +0%@ANNskLrAg7&EMcYj#JJ66OJG=KYCp#uxYIu+Xn{(5D_1+qLc6^}Tafly71fHB$ZeW6!Au>v9wX?_ +LyDJfZI4@k +8-xU9EbywTmwsC~N`&S^;WCSWCV%d{6bw_O#iPLE6SV|;MCPQ;T@J(h!5ez^|QCI8yx3cBc +N2h``<9UibF)o_&^W@l^&YsH-0;qv%b%bGVn~ia6iKYqCo~4T4w4TMgQV)Pr`Z8n5UUizaR&Afol+JM +_VIzDkJ#C}cQCG1M3fEl^@K7;}0fssDNCgJ)6%E(iQGOmkiZ9eFv3mzEkIdYDAK@i!xnzhDyy-5CVSo +_WSxLxL$^98e%GqTEg!)?KOGY`F#3QKyStdXA|mRItZpOZ#-k?aAK#g>1hX{4Kyu#_ZkEmu2*rnIiyG +h0D#|mn9qaz9a}Kp+R};3s98V-H;3w(svzbTHQQf=NfZs9&Z)*#SGfJj%th9E#3T1X}w<};Dq#fT30O +)mv}9~-wtBw{k>g2cTE)jf$tqeH<#y^Z&b=NFB9h(FEWJC5{r^BHIMoK2gfg8|Kas3?DEl`{>kWqmTGF|I0kM-vBI^)yo;|sfAV +5E3&jVI3H_X+PbBuB)vPy9~^aP=r+^J}xYN;)dyGM)AVRAG7-iDu1+p8h>vmL5%J?zxX`&AB57ng`eS +v(09F&^on?~Gj>2cbr5_q-w846pAp6k~A}!5!~zedzQq#qHb%(=>?0rj5NnnX-8d|L=Ae#WrFj_9^V| +j{Wxb_F_59tz9J!cvkJ<`)8-gRTbuh8L=ir#t!9TRE84HB#5(sv(xH{4v6FV>d8nHP@Bdd5zj>We~$M +S#xt4&xEii9_5jkE2c?b>!HD5?V3I`l84^TIXqCDwAZ{O6i=$AWe32ma>O{xM@p1ApnM@yEe)a10t3O +RMbZK&#&FfTNw-a%d^4ygeWse*3s9NW2P#2#n6X#}@$nCy8F{DQ1Xg$p +%Wz)n_annTGUxCEEU5Ky_?hX)0R`X+F +E2a#m3Z-+8?qG372sqz;n(azY>L%$Df!A@9+)p1E06}HZr6S3aF|I<9<)VRsvzM2LWi5zduo=WdCqnY +ZPl-?Je_xNh!3~_(Qb_bIu#!nGq5Vx9k$OH#|gT2=vbQex>8tu{QgXou*u)^B5jd=twojmF!k}_U4v) +Wege@=kC{Eo0g;^Knp(xkPRt?%mrWCIrYmT7Tj-bybXcaJ7=`zDw2qKNB4SEg5d6#=%scg;ah8sC*AoQ`As@+ +azsnnJn4*luFE&EEFw&NIzRJyDgcrJK`id)KxjysXJm9A;CC|>0tKSztF?vg6et{B58URyp3Mr6TV)YPgIq3dlb<_yO8V3G-J! +MJ5{8q0Wym6C8*tj(FyX!B=8g+a{Nj#Fo2lS#Yo%yTe(EYJkZ%ea}R75e(tZ#F;X@oe#t)Z|FHqXReU +=a5C%%d_`C^xoa{&LhwuzrQ^HGfnm;&Zhl^w-Y;@o7AHD{hFBGEFGbh>Lp% +mjjilgE@_>cs)-(ArUU=QPRawyMbxBpPltacsJvzC90@n@r$UivC<)4>+lR(3F097j#xU77hH}y*a2y +9tRDx|H(B2Rw}>aWQn^40MYw8OZkNS6iKY91-NeMI0er(``x}o4&q#B9X@#GJAx`aKaomn_>}o>U +zU}2V40+r%QrHno892D;85d*wjQXN(j;B`dEmD4uI`|M)>?TXElDCJ=j-7&NSIq>?*9T7+v>SVwAJp# +3*|cqHuPNjpqvC2#htVQPzUpT<9PsYQPcG^4!p9`Dj571-gaXMw3GtT3KJ5xLFZ$4KzkZzX-aU^=m3~T~|SAbe;j+cvfhKjL +|N|;=0ajj%hZgsvl#ZmOXY&_l+HCKGARk@j;=uk<&nnn?VWPh3_GpY9vnbVZnTVmz}9fSo<8RWq=A45 +UkX*>1|U#n;U!btUJ{!kv(lown~yI+GnRDeqY@zQv062$qw$SEWvr9{D*FD6~GibPVHuQ9;Xm4Z}H=2 +QWgFg*wTNu!H;ber;8+kq-(noY75IudiBQqVyoImqV +?+*t-15LeKse%cUA>gM+t!zb7v*5vwh6)_>Qn +ou`Ep3)i7JD6xkH~oqE*v8K`yY5l3eWH$q6hpiTZv)&G=_KDSiop3+QC9aJP{oZq%cur{Q3g{m^xEW{ +bJ{}(ZzxLXoI9tE&SRqRA~bD!No*A`_gZ#!H}n%}8l;>kUF!ox-ytbJA6YiRB$|GmqpaWI^}NucFzvm +mh_fBxy>rk7s7zq-2o$$)XV>o2dl;}2U{>pLi=#k(VWIqJxPB-bk+4SVQXW;~|&dZ+3MypE6#6UKq5` +@x)R@LK!G2)(WSqDi-#^r#J0x4+E)_{}#BKOYR!+@o;~*!1Z5$KzA?I`@unC|pQtL(Ky0;0|J{rZ^l( +EYF?HB97wi9m4SHFGslkm~ZiLha(MWmBDo4{iKIy!QoKSz(JA7gUAN5f&nvggK#dKOo>e5R$rbBggqM +vW6DL!*R)7w{cuIIlP7ed80kifYTIQc7t)@lGau>$Zf3srH^JIx@ZFhX!YwDb4}zzn6?HXIxtRmPpaW33Cj +;AesAfojC4sZBZ0h<=+Eh!u_mn^jLuaGGVGv@^y193Mb@dIaKlDpRUBn41WsVj=QN6_<7429JV)rV)< +e2ILB_S+d-(J=7%8c~qAuZBJ;4S^=Z293gW%N5jY~?8cw>P-7$m|FAhKAmteP +ELumz6A-{*F|H|g0F+m@Q#uESV40UvD#;8!lFF+&6yjvSMG9S3i5;_WGOR)fDosZ$LKA96nZEFNO#yi +eB@{?jr9KiN7OQGr+J@uuW%u +++;VD}&AC{Ir66>t&G-M%`tD8Xd2oTI%tB{V{^?VC=iw{n2Ou;Ch +unSP^Hv@rUYRHOx^biZx2aWrN@tsFxYW*YHcw2k*%o%1RFmlY0XmdI}Jvp2|9GR7J2imNyZKe%WAF&e +r$8{M$pxFK^AaZh~0UihN;+`(R=fLkv4r^Yxzx}o9rqsgv`D#agXK8WrTp*b)^kB+KXn@2~iCbIoN=2 +U474rV5QU86iy)>y|2ND)L`&MUGD@K8=&ySSCoa$Fg#acUKa>_~7Pu=>V6c_Aq^1OZ!238J^6<-}+hy +XFLN0a6MoK~e*@H6{d1Onwi%{Hq^Mxd}E +eWF_uG|q*{8>0L|8|iTMB(~gS4O_#|#Fv@heuS;r1<{0LAd5`=z5m*5wI*>z?ww917>N;<9jXz3HShT +!3I|b2*_6CZPP_*Z(UZCSj!2m*vCt%Ad?u2s7rC{)r+jHFseL33ihGjtzh*@?&J!0gG&)XRv(&|-eVX +Bti)Y@I6-8j>;%AM>tkx)lXq>;9a=2W)iOOd1(UZx-?znlG-XR4A3 +E3Ycel)7LlmN4O?wh)U;n^QM8e+o4^v5VI3W5q`kUV+G}Db2e#~b=wa-Xman$wk+lpew!=$8ZMAoAlj +v7k!JrG(@$h!q5)!Jg +|eL+L4-K8XC$xCqzMHr{h&K%~fp!2fDw~nIur0I&IZs$Ik7|f)wR8w6ScB-a2UWu8rp$rH>*d`f<9D+ +q46&Y276>wmzuB=*72u6iL=`QF$%o+e%D;RW*aq-ZiY1WLjkRqe&(~?ZV%o>X=Z=Ldbk#y^`xwJ`vB) +>WF_JS37jmLr=DatL4erapNii(n)!hu5=P8X=S_s!Fcn_RWCjJzIXNyP}JY(41$qhb5zMDARN=t6OE} +AlyZ|);;HI^$2oOkC*83b5DN+&Y^h&RDij!sK<>L;5p2vwNzf=ZsU`9=lBM#Qe3Zt|W^ALoays%QFSE +dfcW329jf}V+p3SI+4fhP^!t?EvRAN?J^QAX!E2((k266`yvJnnd;?2syfP&c@$zBA+dnLBx_W!Mz4o +l*H15ir?1QY-O00;of09jkC)*D@e0ssI(1ONaa0001RX>c!Jc4cm4Z*nhiY+-a}Z*py9X>xNfOi4pUP +E$o)QcG{!FbuxyR}eY1fY)_B?xxsEBg`+zPO}^xTaGn2Rv;b^_yJ&`$4P;ozDn=q`fZX$`i +Ac4*u|M-VJD(<=}Z0d^l6GnwfC4YVlEa54-?<82=XLF2t`O@n;U+4g+YQ)mL|^=8x_?gH9dR5! +%peirF;Gcq#)y}dob#e~70132x2Gc9pMV5W9FcjV#ic{E3JQy}=f5zmnH>@flPjNoWH)6-Yau}xa8}hOD1xq2ab7Po2wPkDrqm&-$~QP*TsB&f>~u#b3G&) +S>a-j-$O$wAN0Yp+x>WV|31DZ-47K%k|)s4QTahfevu`xa#f656w8jUf&jmy13rvpE!=>eZa$;W`vV< +v)=zPA5ecSpek1NmMa0Wf>ISPG7$+Zc!l*Mf~~CA#ij3H*;wpuq;*`rQf`n)MSo&>@qRo>JgL{~c^^5BFvp02385fF9MKpjIJp5ZO(PsYj!E*Ir6|A?9Dop0*7v +**2!U5q&QmrV3~n%=X4n0I#Dg?~T*!$fn|1P9i-$O3045>G7`#D3R8JV;O(=hHe*FcK1-#+ihT9=#fg9P?&Ro?_h-K=(S4X=-F~6WIu>S)-yA81TSS@AqnUhP5qy6U1 +JBY(+6!^uxCd!}HV_Jtuy +NNC@jgTCMl$sN;DKdDn`_$6Xl#61+XX$T<|U6)c3!+?|u{)EB#2U|Qt%Sg!*{9OzADE}KWJTF8O;4{R +1-NzT5{2+pi?d^l-uchOX^~Pt%m*?+~{p0b~xVN8=br3=hdwGPmFkYUYUuj +0+CXQm|m8R?u?@mrn1+NHugL-j!^7j2-z5S|}{81$0KB-8lw@K$<5@ZrqhuKxg0`h=#-}71NUlN7#Re}9fBW@iF3AigFlveCI>X%X1kZ-xD5Df5JemO*aD0n^ +=JdvCsw7wfWv4eV_;v?r$bhg`tR47TF5EM4Cx#%`YB?JU92rB@mvJmL@8$Lhh6Ki9Be7~_|=E^4WpE0Pi@GRe&lToV$BmR!<76&Y{eTpb?1I4F*Vn^D5#`j5V2#@VtRbI1 +!DiiwcvL>`AJq%f|=Ei=|vbp~G9A)MlVZMEnt&evc2HEG&QT3&I!oWz2+CbM*7E>UNh#qtzqO2WWV*!Z66ebJtWu{&XvfoM1EvLdVK7A +-MJY*flD8|UUD3=z^nZqE>GOL6RQ1~cJY|?}WA;=Y8L8t6*;511N}djtJC90r=1}>_sI&oS=1RsP-z+ +NKy{5a@Tnx)RPPY-3Yu{>?2sB|CkUL8RM~+GSP`V#h{&}sUlsVQO-vGGF-kbgQP~Jv<6*UC{D +EhF +uE3bSh0ZEH%`)pkx;O$83&av(*&9&9LMgqZntw)2X5;Zp$A3+Rt2?(5z~5 +YI$(BTpT7 +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�(o6GLZME|Y*w_RYt +$f5l8F;w1yWhk2Q3?9X9<-uCk-CB(#pfWhd)W0{jq1){P>}kMrysbR~h7nprjeojH1txf+8Q2S0_Yi= +?+I@K9zt+zM2vP?GDJAXbu_C!U|+uO$bEuh$P9M@rPy;&F=Hm?fTWSHfJ+FY7~l(8p27^oPP^SC+oJ4BDB#LymwgRb +6p`ijrT_i#-a&iyfN~5_cMn-09y+HFjUZF=UR#P1|W^yh{xRY?dsW@{LsRf?&iQTs@)vW;cyeP;W`mZ +u@4WRQ=OUU^{N8@PGEKs))TfQCyl5$ySZnn?kTzA-$gm6WmVs`~(6YRWMqXe(I6enAOOzIL;jjb7sB_ +r0=D;pR0()Kc_8MZYiSU3$Gw=F0BET=Z~@?@1VoTF15B;n48J-W$0zI*Xn3&}svU6lS7FJ +vZZQ_sjRd{j9InMY{Cy{jKb%V8_~}qLw~s?bF2d+=xbQ%kZ^X=9Bk7LNbZck3 +Uek0EJPOgTf>)z1qw#K6>Q+#~!@a|xH_c<#3;(FExQ&n5J_Vju-*B)xWs4QK8Z>k16Y(k$J6ZJwv*##RqhdmT{JcxItI5>%)7vldid{<1ymiAXafcG$+dT +i*|J$E~C{^{A#9h)QEKkV?%{^AgXONelNQGHcKSc(f)1X{>k# +!k2^t`%$hDiT|Ne&+IMMGkF6YlDokVtp!k@wWxh7!J$3tz=4NUfwLG$K`txJOW)zqp#Rp +h#Wk3h(s<(n2j9y+YV5=w`sDGY8a;aG=ug-!_xp$J7BC0`N?B1*YW^X*H@x<3b~p)cgTDY!O9KQH000 +080LuVbTL1t600IC20000003iSX0B~t=FJE?LZe(wAFK}#ObY^dIZDeV3b1!gtE_8WtWn=>YP)h>@6a +WAK2ms3fSzAWTQblvP+<5 +&y2g0>gMF(u_?yy?$ujOQw$PB%X^ck0oE*@p&j%1SQlI!2*yUle_!dZx;Zc)`N1Crc-^vUo%W+V*bxt>cFhJ?>DAvK|CDm2wxq^i?#zX_FpQcubtNk*k&GG{$9zg?K$ELBG +JG~u^7!3BJ^f9R)-r<45m;lD0U!lO?oM?amOf7~VK;*x<vUM6SVeE4a#iixola+*P^FBxZo>k-143SrRQ!h?k +c-ck`+wd4vyp@@#`nI}BKXYH`Qt8mU?c{!hzFvljEw$y{E@t;pe>hVkg+lOajJEu4uU|zHy-n`jRZfI +j73b{X_5ItPJ&y@w1;H1FMDQH(2*(aPxUN$Hwt}g%^|FaB!r>@iimqAC66!;fEzp|Bxi~|a6Kg~z2{P +-GnQ&{PbH_f2~)li!5-->gKq?k{*V$XnZW|SqVoi)lQ~nnW<{EabfS1s71$$JTD4ra#`A9Eyl!d@e)xMPMaHClDpCuKD#M6s8iLHOVo7YWOlesrSRTjtI*>N|2=Wv$^F%a{8eyhX6JM-byRUyP6v0z{iXDK +R3f#W9;CQyG+hhD0<`qD}#Jp|F)&oq@buu|KF$2-z!gvgyPnS(#HVrCDg)R|I#od@Deg?$qG^&2G^#7 +)uj8?chFM5G;+ +Jl1vrxhOC3|SZEGN2DbrgWaY|FYal{#>&CVpq(RPy^3=fCfi@H+UH#wCcux}oF##M<}v%?hr0m_x$Q8 +*l+ij3+ZFv?Bh4#%dbq>~7%Ig;mXL{&qrFn%I;{`~;qY6`$GlFEwUsRFUD-h9=2VI +F`(`EY={9fop6(wZcX +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 +mG{40?B|iaBO9KQH000080LuVbTaA*H9PM +tBUtcb8dA(NKZrer>eb-k^od-z;O{WH0paT4mxK3@rxgb`H0!1ON$f2|qxn%ZYS$*iY_v|i7UE-uKMF +j|;w7X}{%$zyPv$L}i;qzg)s##eRe*E2iMn_8|4GA(kWyKS%ST9mK8~bLw4P$G +$P#Dcy`5#wah=mU`=JCmE2d`-gmL#_szv0R&kwsM0o0BY!|1GF*Wx=F{LY82YH+9`8s_@$(acouv)k1G +v>q*rjR?E1yZM5a0gE1}V5(x@lCC|%mYK07>3bsO4NJFYzvoOA}pPZO8{RnDd(AcHEL5zC5wH$^Bbwx3s0F-p=@;c!^0}^Lg#Dw$QKbJ{Y$nlc(uCfq0bRB2At(hyVE|=8C~~}bouh-59gOJFTeK^f$I0 +eYFX3?YR>fPm-+4cj}K{t!AP(&JfqhSKgIR?yX%{G4>v(Yoe0y>8GNDCO--^vql3yGtcE7<-Y4{WXW8 +7nAB`4^N7e>HUM%Q}#+T`LKc<&s{9QD8ltf&BoUC@ab(#yyPj>8&qPSu8_i@EfP23nfm&VJ{>Yg43`ZOeES6w1Ba&% +?7nf>Dp->#vuW+w-|-V$iY8KIYvrXY!~swWSXT%{H)#$vgl)dcF6OOjQA<%*3x{}@{QJw-k*Izx9qeu +7A^|UfV+7o?ER?5g4l36Y!4l5Wt*Z;s%UiD>n;t^`_6vk6+eaA3@2rY+34#u3A>Rz2uwn5{wvL%M=exr7fD=SwFmTysYaeG{Ny6%jjw%%0WGbg#!DI!+DGSr*_X(B_-rzr8;D`? +JKEjxs_)fh*~~F1RB-;*NmZOCNXnC+9YB=^jIP5oMbB``H83jLW&0CV>}b(^Y;Wyl%O_!=Wx|lX#VGe +FtT{br3uXm^)`S!4|%vcSy;%s^fnm4i;6n04KmOpaObw(5NwPjHW;U*g|MlNV+p1$OxX*`_g231U-PH +Co(vQIXxj02J>Luk0;9O_yC(LbCSdtBOOKgABK7_v2L&jO?_dm4+{P4Y#*!-Q2#dGT@9X{@B@PX-INc +P#o-0fHOeG+`3z#>DrD^9rvL)$u!S=~V7t*;4;Di`FdR4JKHB=BpMbEXMQ$j5~t&XO2R4GVA +Jeda*r6d^-9EP)h>@6aWAK2ms3fSzB(M#1QHL003bD001BW003}la4%nWWo~3|axZXsXKiI}baO9XUu +|J&ZeL$6aCu!%yKciU4BYhWzk_y1G>rpA|)8Y;dycsesLY3wf43Eb}bCheH7B +5k4+DAgt9Lctm*o{(64@Ect9R$Og5?0@mfzynoqkwr}NjdZ9(C<={C>Vk#z;HIBds&yLQ-r=;cLgt|4 +3U*k5a9i&FMkjLzd#bCvBFKRiSB`rpLF;2DXPHD>U+@K}cV>p=FwL4Ad+>fOj*(zm!P)h>@6aWAK2ms +3fSzE_rd?u9w006cI0018V003}la4%nWWo~3|axZXsXKiI}baO9bZ*FsMY-KKRd8Jg_Zqq;zefL+4R; +uhYX|U5aQeE`{N)eS1APP?*N;dW+Sz_--_L{~;@a^oycI*&TB=*H~IcH{eX4Zrd2h`b?s}#A+hmqj9N +YEI69URA4--s-w5+ad^3}dJWAPTuH1M0ok- +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 +Q>g1p^C^+33V%D>4t%%+~OgRTZ(wJ^L( +1p@{bi>EK&@M!TbP)h>@6aWAK2ms3fSzA{MhFpmy000$=0012T003}la4%nWWo~3|axZXsXKiI}baO9 +kWq4(BE^vA6J!x+nN0#6HD=HQYHXVwVoC5>yCigOr +?Pcd^(8;!y0WSFc{ZdUqA?-@kuP!L!|6ZggH((@fv!lD_)S;JHWNeIHj^Q4_Vw;;PcslwZtN#dcSwms +j;nJvATITp1r8b|cU1dJj=|yUliU{;ry+ +AL+xv-j(ToscY#xU+(643_}n1t&0yjH$9(~Wl>JlTYXbc)N7y+{PFjzwAR%&Ug?RNzs1&XciVjsn>x* +WRF*}N&5JES#J|$Kc7J4PC4apqdT-(ndLHL-wyWYAG5N8nn-T`TY;;x46TK>ueM6V}Qr`ePW!D1!#sT +i#o6qAco6psmIv>42ju}nV=x2Oy|9W;)13aCC-~OO8eHqtjekorOrt&bTr$t@^$*^^rud*i5{1NDv(z +naqWmz=a3O_d$fWi;;Ra&*6C3+n<8FjfX%7ofyX|Cs`9$nnKCm&%BrJk;e%{I++G@3sA%lmvZhAHYC= +mXH_n|O;8jh3VLH+ud4X1Rp_)--y(KK|2a91P13HC{vGwSIr{{=_u?>hWM}Xhp4|mutP$hoGCbr{C^r +89+V#7NG(G=0YIh5u`*_!`iGiy1pusD2q4CBvv;wbuv8xirgcqplFd^!e)(XVBPVI2E8w$<}ECPg8nh +LjhnjI#Fyy`*kz|yMgCEjARrbC8FG#*y;vw75%yeO7X*h9vEN@`rK>9yXV>wrg5?4>&eb|A;#z%-vjz +o~L4rQO#MFGA>+AVE+N@yH=3gVk^$1zCLyVqAgfxPTU`}Rmhghq*M*9c1Xi#Bp7hpdHb~T_%x;erY~l()&tVLm^mIFj>?Ym`>)Z{?xxR +@v+pKT->8pP)8nudZwZ&}&iV7fC$j!)vAbhI2Y*w&ary!;@vL5Ug)2ak*c$ugFlnH@J10qXUU&VO>OH +r&qZNf~%+(Fh=3!3IaiMT5bCW{3OmTvQGv9N;R4SoY4W7H}Hvo68n!9PGMpgO7)X=8+*=G&%Lk%;J-d +RsPnJoRA%ejVV9bI$POTByhlJPsSk9*~MN%;^3jn;jib2EF02)yRu)O>DTMH*kmt|b;yeXuxJ%N37V#o_C-6imAAW8{3sv@ZV8 +XzR1eajX&0)}pY#z=fstf?RI*92Gis@cT(F%m9b!bE`sH`I$-pQ%?xt}U1+3N37e0m8NfGrP&te>AW> +2?#Y%zK&&qB5p}lRumr$jArW);GGx~RA9a7u +6P!pnPEdISB`xu8w8q1`0BV0t>C&8PSV1B9pTyFc7|b^ysZx|hq70Y^aJqS6#{|%zmp`V)4l(u; +z&^2{-~If;ZhT7~v6o|9#z!C+(>!H)_O9YJ@*^4s64=lUei3uiH@Zd!KoP&$!k|tjlNrbfi0imgq|_KtV0X1aK4a5}c8O@3pEdAA`cWGb2-Kmj>gthLQP{EqMo3cRzoOht4J_ +It;r0mUt}b=1OZ0pYHmuk+QGwwy7-Opic(P-Lv<4@r(%E{V9zGNk%=5~Ohl3B{;u&wCoIjwdDwk=ED# +TiFK&uaWhn_yXylgmzVZl73%~Lf?w$w;HuhSC#6~hkH5ZH{@xr2v>0Pb9LUM(D=qcQp%R=~Ef)imldV +<=X}N=#R_w}G9dU_n_E(KBYASSpg*ke0ZIW`V_16-~LK01kQyJMfZo_x|>TmIoV92&6Y+>Or`dX{PaZ3l410>iUtr2>%(HaTvA~b&l$b92;UpR_w+A^d$dtYfYPQEUFJ2jWm% +gV=Q4$F;GgdXPjsxe`2vXnVzuowOE|u$0_-xX)Q1+(`4c-4GV(YQKUTzWu1Xt0C>lh3*&)yTaxeuoo> +80fop-txD$M5{96kw-E4G%QNU~`u>jA~a3DPM+t-h8t@_1)=%N#9t|iobUB=sr`OIhl(3zeVM;ZclMQ +L)05M_V7K>F@d7kJtE`hs{7mcN0)`%ifIH?dN@#sT0e?iL$OZ0r*4+89w<$s`iz$jM=B +{}#9YC%%p;gi-QUZx6NS6H&N3$Y@LQkFm5dQOyWQIwGhBi;{%A7uA;x&H~K*Ocpo0=#O_RIe1Jn2eu8 +U?zai1`Kxi?)%p-#hfoU;CcMhkAqDuO8w%Xrkoncm6jkd^46)6Gox%eMvr13BsIK*7;o^PvCewonn*_ +vj5}zZ?v?)%s(R_aS6b2mx1vOJ$e#51dM1&dx{ct;7tflxcf0hfjqtfcJbt_|CD +hGa^^Yprfg+oCS@>TRM`svM7s7Ln5!$jt$iT4^16TiJp;Zi6u6r>S2MIFvXPRYoqM5mpAi_&7?zb_k{ +^09A*b8JB5`_E*W1~nM*?KJ);fWmUxDT-%F9P!kWee#fq4Yu>eUC5`N-+yYjj#M%UNHp{Te$ji_OH51 +mu2@nCvGrZhhclup;BKuFz(P08H2J@4*B6oo71d4i{6|6lP3V3fSpcywW|aV4fxL?}r|WfJ7xy6iuGM +?&auUJ2L3a!C(cvh~()>I;2KH_G1ajhPv)kD +zN4TrhKTfEl;Z7ReDh~@hn9S_RwA86TWXQaPzxxyLvP^d*T_9zqd%@20%AJ{l!->H*f0GzwPrjg&N3( +dNQtbJ?go+oCZ^7bOpFkhY#S=@@4#5TNi<^vkwR0UIc76XRL*{s&d8GEaHf<0n@rCtC93j=hy#`F~^x +!A;VpVyvs?OBf$q`|ayhLuWw#FqL{04hakhx!_wEVd`cu!|bJn64`*$M7b0q%^PHKk&h=X=Cw< +8mQ)0VSF`10xMiL0?mq^CD5h&7r)@ryeZvm$fWgalpzVUp&5kU%!fpQ(bOAV+z~>)PLlf8m3bhPq^A +NoWfb&h+Yd-TvZCk{Sf~|ms=^E6&Mf~+7@Ot^LPPGa*?c3JDY=)eI-VH78?f#ADZ#d7PjEI#cs&D_*4 +eSm~3SkV;F`dW{QbE3c*cKIq`b|!NYxa<9gN!c;#lSr`DP7sO3G`aJkTN(eB9Cw*f|HBIZ@#N%H!&LJ +7}yVk=$rT^-Jp;M&4;;FU}>OIKl`#7{i>*+8<;vFbK2Grwd(95`nRuEi{lX-Q^&dy{u|M=F?97rl?8B +{yvo@$iCr>9r16hrSW%V=X?aPTdKKre3&r&EQ!oTX60z|b7X2D5IF>kz1yxH@5Cd6`_A{rH92`W+!H| +`Ddu8)Qw#)&u9-JKmfINq7y!wEMb9Ne?YFql+TS*oKx92$WTri)T>DVt&x@Y=K>OK2{WVHPp5ZI<3$Y +>}^6%K@*!fysUGD6saKiRjp3fKz174M#gb5W!5c-!v*ICvH%A=@}m7DH3}%qfYqPKvn$5V?;B +{Gk^A53Qs{0xKhr)ba2706L^W)ZE>Ozvd{Abv&>p +5892(=PS2~d$xQKA42m5@2e+FBu+ZAED9xoJdNw$m?v6%1cpOZ3R?SwI1TGwCUrIyP-WFuvyJx_jS)8 +KrK^mE9fT~=gofeT6|7_x#nHq3BM_WTcFZWdmuQITN9)ixRx>F_0ra?<;IGoaM!8x)ZxEX95U7;tCVD +SJeOE0eMFY-^7Zj$09);@#_{X}i)mDEK@kl1FV4FzKHjt{FfvXeUEoGoO}&1}7)UR*d{dR`#?DS&|(X +BfWe64nFZx}p%eLr3+cLW$+@^z{}V6Bq^tauL35Wy?4~i6*4PCtnpD&L&`^uAyuPZjD3o179<$BI%;hQLw#vE6yC!spEPg6xG05G&;y9L`xyJXqcmM8NnFQNv5(VZmPmnXPJ5$c*tlQ&vxm +k|n7tW_nec@A-a=>J86OjiAC7@SLs*aD@GiWZg4<(9_3`iRL`w-~Gp-^}PnLhbW_OP-xS~Fy;l#$oMt +j22lwQ=E;Rg8d!eBdpXLsn)rUA+sp1kZZ!{|=~}_Gc5MG%ybRRYfn6+tcz?_9|oo5p +agHKcT!BXSdbHA5^yAw$q6~*5u>r}bZQpO3*$+AxIVb!!^jY;2C2tRQZlFVy5lf)s;0=_f;pi_#-S>& +Xjbw)3sR{I&T$i{6pw@C35Mb-joDF3@k$}Kw3a#_ZC&%)t0Biy0jYb#q%n*4H0P+)N@8-Rq?#lPh6zl +rF&d#s$w$R7hd7cN8565Fwao-YD)nrF9u^4z(p1sG2Z2~@O?-fSU$Mrh^D9c){YZ7CF~zJfjXY5cUaA +EL3M7e+ncA*txd`R#Wj*J`1s(uFFDyKwLFq&izxC8IH01Aqr?-)`3`~A6TM7nC#6`wzWVLpj9sL~PtU +k~ICl_VwO0nJ!mj1>t0vwni9EnLi^zWuu@Hs+o{fx@h{ASP54i0D{kt`z&Ml?~}SCcTXDYWg?Si@2}obcyx&~29N*2_hdX8!h8=>HtmhjgPkN^-y*E5wgArd~va>_;H +8##A|t;b|6yC{9h~s{oHi*l-C`7q- +q0J)WNQxWa8usn%^Di3j8pw9dPwbH@>%yB-e{%T(596#UM(o2~e%%Q&y_WC|6gbHO?Cqm$X*Q3 +(W^?~DQ?XuoB`1Ym+SKI`=63~66AYyQ|K17m*1UBXw~9p3SW7WoJu(vLm_vBv?A$R0vS?5X&yRj`_k5#;l6d9CZbKmpkdceg4X8XB6;HX>{R7-kxPmTgXXM%>XZ)_^!Vx~K}D117zBNU +|E;t5vg&dr^#92wwxkm5vdLoHW>n9O`w?rqK~&~7r&T!>;+=+Q6=ixhg^V7swp$=%$20yv)lGEVX79* +-Fpu$+7`SKVgd5MCKJJ|=PvkDM!we1{w?oI0;fH=DiZYafXmd&fbI*c#)*~JPVc2Am9H^^XASPrVexe +Rvl)sMJ^r06$RKOS%tu#}@{)riOt1>3;uF!WF|7Lb^8=Fr!m&z(8z +=TcyA;)tpTzQSt_+()QtVT%oFQW;gcGgl}*uw5u#G6}T*l<>H)aM)fE5q&-2sc +zraLDxZ{~OoB#*(?_ZaN5!ZYe`jf%B1B +9j3$pvnu(a{KdOUC9v|8%YF>J12OSpdi6%;2_-6$b4Vp?qND0_#L!f6{0Bip~e)5`;V_U^+2tzX%8KLRdp62f|%~N28Y(-Juts8wPbl%=*_!*-yH6ytO^uvF-YjYpCt)!2&5{vY5KD*FL*G$~lH7 +}c4D1*o43I=^uPC&lIDq|({zq1CrF7X-^TD~mzhRjf=K|OFo1Do*k!N;uKFOGXI+d!h#bq`q+R~o@QT +RAhpJ13@@0%k7W!ai38QiUDvDZUGoL;ozOIX(-FUM$JKHkqYof8KA=Hx9I?fmh@=U6j?jM*iH&y}X~u +b&HjpQ&;>HJ~AUAubc$x@Eqr+M&X>GR2fEMoUT#r?i}+Dp0CUN(t%kl03%h9EZJd;e9(x!~s+5_A@$( +ncO5O-2z=@H6{j)BHOPeGI|8RZQ5f@v`J|j^b~<12qfh|#pg?1UTUM4iPK$`iKbf)UjFEI`%t +K2qF^T0s;FN^G#XI=d-qeAZrfZB74l|d^(3m0SolguPupUc +g}<|#e9to0GZNX?Rsw7K~2dm&x|;tP-Iu1&{Wp0{od0`N9xsdIR%m$^7HXmpnZBNd}hr&30$sHFiEoA +0Juc!t-4Be8JDZ8RC7wq2_jgql1~oc5mXMpuLsbIhLX5)ZU`d1j6G+7^O`n~sZ=P&|TE=dQZXro(+A_tZ2k&phxGF#)^LuBTC{_=Eqq4yl6rJ +ZDU5Et&l`XX=fMvO!?Oj=TI032R&Jf>rb#d?j0QS7~R*LWhPs`<$7QfI|=KkK4x0@Jz+&)t&WwtZ;#+ +i&^(aZp2zYMO7#d|a*Y&r~hU50%Z$@G1gP2Vt<47&a`%xv405}V>2E6t7FPy5)NO +4R@r#mT}!@pc6b4MGGURVw%ir8VV10w8>4%}Nx^cigE(&8WIYL|W4`azzZC8bc5*dA@Cv!aP_Zhcl(A +^|++2~1DwKP_yzD6#`O0yk_Q>txU%VEOVnTd{89H_LWXVux=<@>`dQ?a9^4*KK&tE)$^-ONJlMoa5(D +seHJ&mtA!kf$GvZ7QXL#q!C_o;f08-foEibVzQubv3X|ky$_l1Q3jHU}%b8@RHFbRTElRqIpr7!^mQW5ncwIkDk3UBt*r +SSbR`&Ly{fO5y6zTETUF1?c*@0a@agf0)@p3m%3lXc>R`EDk?%HmiB{E9Q%^gDjw>Ki*M* +&4$>Fdd5oD45u_=-5v4!bygC($LVPkFnCE@4May^ +0ag1Sn((1h`2V`E9YAyh(;!If58i!bdfx_Z>e@?D=YxSwZ;FyXcSNU#Yuc&_A{6b`ouEVmyDH<;=QVw +1_7k`IL$&2c#=_a<4=aug8qV>+_DBIMh%_+8h6*ND?{Ozr51BE7On}udbx;d>!1491I;FoAA<{nG(YB +Kxp9&D2kfS^UYj12wYjJq-pNVh6?i`)k +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 +DODFhv*%MoXtJdsLu1c+0ROo6;RkLEnD&uAr +6yL{mkWl1xKI%l_nhH$H{B~@^eTawlnUGFJ$8Q92uz2(rm)Sc7T?ozB`0vxS6!oPlE+dSQXP&AY!)um +2*Ol)=MBCREVp+lzPC>l?DGFfBec!g~WQ8R8WFN~`T<8~|PrO~+|jrPl;`3{*s;?CYdK9)5m2;IVhs} +#B}HG%Xg@CI{kPpDMXx#I=J?&h&&h%2vMXqqT`un;`v^_MnmAi~3GFY$JLbh-NGs*e$#Im_KMOf?%Ds +@uJ4E*HIfJE#cgs-vN4COUoxO;TQ0-g-P-qS=aPtZpHG_BZ=1QY-O00;of09jj$!VtEA1ONaO3;+Nh0001RX>c!Jc4c +m4Z*nhid1q~9Zgg`mb7Ns{Ze?;VaCy~MOK;pZ5WerPm>Mv47uYI>f%dSd130mZ6bO>Q>zs;0;!3j;V~ +P|=D)ypie|u+0z4noyJys`aUi{{p2X%3AF#~#M+1y3_``_N)f7sl^&RC+-3#nW(yP!5;uB +;~>X0utYgmZAOi;ufUVt4V-YA&NX+4>o6vYYX_2#A3Rk1AOhKLGJzDKTd!4DQBM`cDu+SzpRc`7=D#A4y +xgVAzme_bZNK>h$Pt%1%wOfT`SFlr}bT?NWF;keK2GrJ~4yNlkKNv}Rt|TSyD$}Y0wtX_iv15q7j^~S +3`E&UMo3p1g&ZH1tz)d*yRFNvwrLRa&FAKI=9vV3>tWRl>$mHr!bygU_koXW(P*FiWX+9W@hl*l|bV{5e`|;9&L*mw-EhEMZp$B%8fM*TEAb==Za-Xni +eKc)8&Yej?ACBM(G;z8!d9%G-?l7XOs=Qt+ke>8wif%*$A@~aSpC*7s)f*FPPIJT-+ISdQO|jv?M0yW +dffa#x+A@Klt*>5*3OfIg5%&3=B|qBkVv`82NEKET=AA55P2{4Jt|q;; +JX^HWK(VV9Lm5{?bthHw==}GJ6l)`fyuMePQ1K}l(z73lT>>X%InVkurPx6|EZ(ZjYM7A$Klk{*YBJu +V0eVZ`0>ti9q%2@3Q5BRFFS8EuSD{*Di~_dCC=92Gap6c^$ef&AKb` +%d;S?-lumZwQDY?iX; +@m+L>(R^@JvxV+$#z?4L7*++UZ08Z^v!A!^gEfsOw(*-$rqgP0h4%e;+XrJM34X+|lhYy_@RzwK&4tE +2#pqaqrbQ`uY^5w?}XvP7m<5f7K9(zE;+e~!?4bi`EvS4VX?8@AH^hShhYB8 +rGv}j)n)N|4wtYvQ_(d1C#5O9X;EXEu1<}Jgfr6PyN#da>>p4|0|XQR000O8%K%wh&Pxrm%?JPhEgt{ +?ApigXaA|NaUv_0~WN&gWaCv8KWo~qHFLQ8cX>NFBcyumsdEHrUZ{s!+{_bBv7+6qBz1lSQg2Ff-u(x +q~3naV6CcPfu7+OZ6V|8UoC(?O2!~N|y!xxF75={nMC@+<)l`IP+a +`drUnzJE9Wa6L!!B;}H2IoKRS7)IHqDr-r^vlxw5b-7XQOPD8SrYKV`x>J#W&G8LOARgSx{UhU#mzj{ +BXvJ!QJFJDYlIK~?6PZ15Evkbbp?IW>HI})MJdKrx_%V~~SY|Q@XGWu|kLN#L&d)!-BQruN9Yqn@l<7 +9-(#){H6u)8v|YiWSa*{3+95h*=Q3Ad +Vtj!1`#wu+SHtyCIdfn|wU3py%!eo$! +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 +ltSx@2#%5ma}D^ +y<0y%gu+q4^1q{{8c`cuwL&uZlBT=t2akoH2-}*UOnG%b7OlDV_kWcrr2h5D)KUK2|(Ig)}S7!5FBAM +hWW7!IHCJd(MLEISY%0!n^EHG8UEy?Nt#x84rGgp5h5m>LRRsadqN3puD+Cj<%k?u+!GzfSHO5)L5XZ +0#y~Lst}2lIttWLpmGAW5|VtDUJKiPTDz`iRs +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 +TR8` +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 +&5ORM$UQJ;cMfu*BOdUUZ?#6b&xCNCA +orE78A>sRM_p1Bc1D{t(?&vWD)XdFd)?x{9iPp6|(WU?JF+`#^6tBUc0{&juyCiTY==4(eUJQIrxHQS{1{K((S%$nw4@ +RH}}NcM%On7D_JaHkZb83o{PI+tjIQd{oQNy6GxaZGWGt?&q9W08{mjqC!m2wckA8GGX8~y24Fe5Nbm +4oPny>rK&|iQ*|?GCOAkn9d*m%8WFJ>yrIZ)zxQbe!M~(-V^UCS`uE(Ql(ryc*KW&pb}TG_c5HNo?oif~n5H<%!-;8%6VntYoA49U6ep%B&Md1?R;^W +5NvxreG(w8cA;srd47NF5j!sZRXjs4-egdp4={*#^g%(Z=CwkxV!eu5Z^f9VaF{)Gfk*RDADn@l`5l( +czVN|DLPN#BISy`pjB8yFfR0HoKwpFX>#@;$M>qGWC|3h2T^)nV!uC7QFqrb4NqKYi0ID!={@mU2o6j +?2S%VDi0c7Api>LQNm%ys;5piz#WfQ`j)Uw>9HgVG*M#6>3caZB1ZX?-pF;Xlik>i_Ik1P5poTU!MH +0|KERWm6KY3fy7cybKHAm>-?5)SdOF+&xEkg4+s=83v^)D|=h=@lWxJ7%Yq(XhmAP5V$)^CcFW3|r# +*Tqo9t9Yx#*r`l3)S37v_p8F)+*dw*v#w#yaarL=>DT6L)m+M#(=oG$)2J9H=uVat97kgBl$JZ)0gAi +wY!UTVIz2NRrhE&C2eu%I>hsyfu1C?;jUJTT+>ltfm^OnoUrf)BB>X@f(?Uwd1g>yvZKsQL*Y&(WOUo +_KoC+L%IFd{?7JST7MGhdO(RJ)6-$Xw(Yt^<5BdExI4qO|!!krFyB1<0GYem`kMTE>F5lM7Zv(3t +=*pTI(VY%1#S3+0Waser`a#qWRu%cq5qGF_Cw6lu9M`d29f-^*&N~2c{FN!2aMHJVZf+#~B%ObZf%PB +WChI3!yPxe4@v$8t^62*GlMmnu%b#_=eb!e9B4@Lu$w+=g}4z(+dilHWUM^<(kST1!~E_GNgbyzNSs8 +(@S4vEmA;?R%MsF;58V){uAoQ3O<5i2M9SXdI>BJBYi8gm_5MH=GPW@ywIC4K#yg7u@O2LJkZrj0j^{_#%WUK+wU>fmRnV>S(G?NaRrCyV +tBAR +ZwJnw@MJ@~q4O3*Y!$6v=^3jTcsVZ|8a?!1JW%#JN1vctQvqMYPUzygZ0I6N#}~KDRfEJwVk8;I&!4pavh>RHg0J&H;({k10i%=Q5DmHqs* +n%z9u7=89hh_qyWqt7Y|wsjS;rJvGq9TB=eIqWL90xyiukh2&FzL>P0dROJ7z_(csrcqINd5>0gJbnY +ZyZ}^X?G^HP;q!pSKr!cM^0l01Wq6t^@@bD`)y4Pt0WcFgV8(hr&&_F8Rh7-9lACrY^J=aMQc#q^ +)K!_S!VG2|WUD_Cb_#ylp(ry?WtG{DJH6%_nVU$fybN4So_gA{-nQhh%#FpsmgF!c55le(2!-rrRa}_ +EL}i3Smy1K%qt2SEX5fUXS!UolmQyCoz@gi*{amZHa-&AZO`3sfWZdK#IGU(h)#zI7Fx*t9TD)pCpSD +cn@Z+SRy7{^rJGScl3>>#p)vYsdwZpZ|z;UEeXT#KGh?UlP*;@M{>g6gka4bdYR%hV2SFclXW!(o3u< +pkU%p;$(2h?Mza<0cL<}r{$^_V3(##u(4I(_SLDCao?2Lz{1`PSxCJM!~G=h)KMbJk}+03NPsM}BB`Z +LXlMY2!Yq5&Jk38sblN-a0m?a^@L0#zCF;`&|`yTY&xQx}b0U;ppBk)Z4G`f5lGwuC2@Zf&^6rqM))r +*kto7Ww;G)5$%;X&+^CV#q-zCo_|>`{LSA!`PIi5Xvc)ndL812w>8TRtL@*?^wlNdb6LRJ#KTtPp1tU +y+Df)xUsY;#Pmk4Q;F)FIu(Nz4JLC_!ZxD05H%fsn<6E~DdcTXH(H}76bWa57vg#zDrpu7iu-zn{dy+ +`E!bkT_IQ5`Q_~Y{>mk82j!bxO{h6yKRi@uo&rw2ulM3U$p1WSZJE}8G|%Z8KKZMwvh9u +ghr(gtzthmAaun+qLwW8~>A!6rnC{)~2?L}qG8wSOa-sRv9&UAVUU0#tnYd$t=zMZP77bx-2{0mD)xa +|^Z$qV!Egw4OXw@%-=E@|4(|x@5f`lJ>vkzwn6A|ATg_NctW`@G@E@pZ-hOuDX;H`~iIglz^rXtpxXB +jWYPZt<@_$qRHSJ%Dp{kBMTw8d%#MO3A^+n{ONYHE;%|;sUY9EuTnt_Yu%_+c+1KbY2Kne-!i!+2r$v +V@JH=$U9x!(X=V^`*=3Cj1r5U*7fIiPnBF(db*snWJKO2HqyvW@h$$U-UmL_Nxb>cD2(|Mi;)A4oi4W +ex!2TudeBF~+{Hld7u~T*{#CQ*>`;Y~&dqR#kNZyAe9xt644_FJkWFhZ~KYp#m<7G`uAi|d&F(eYdR& +$}qpjiwWSuw5oZ`xYet>mTREBi6~Jv(Ce^ffLbt+!wp{ySM18$j1y_=hcwA?`UWjNus;#*pCrdJALsq +(U!qW0%zD4owmShT|R%{GL4MEhv1LD7$Bs?2nls8`7iqRHNXzAm-o3IGG~R(V#Lcl_6z1ER|jIrFe!I +DW0za*2OmMg94^v*6bdj{ULEu(SLH8H4~xFdrdFFL`c0F};Gv&38q6(#0Us3-{__gbs4ae? +_&XyezL1pZ@^u=h1J%DJ=USol)TD5u_kL^&fM8Y>_g)yIg(6XQAj9zb<;2;S4tDAzJ+y%aX$DX1L;N# +)R^pNt-Q->bNzFf% +zMj9UdJ7+!%7~y5-%%xVi-?s#62V@O_N-r(f3V8bGI;TMju#w8}{tQTApY~x^Ey)JR&@OD;T4a)L*fd +cS%xT2J%Fm(tQJY;z4)P$zp7X)Lho`?%Bk<kZH7&}VFnM+eWP}wcS+bTjY}eJEuzzZvTZv +lXx*a##1%RRTi?H6TGCk%ytae{bga9uzgYk^29}*7|Pr1N>3DeJZ|mYo +bpB|1=YQ4~azG(>Vi8!a7E_r`-#v3^2yr;@{4^Mw=4 +J9Qw==xM3&AuS#EWNyEMCBuhQcl=;B4OJb;gF?dhbcCob#=o%j!y8qO-$m);G?}RCA8(B(>c_vis*@W +ti_@awgW}aw!O4xm#RqIFJ}8HMYjE*Km&sHQd84-E#tNgV8@aKQxJ&x#ywUNx|2TePwj*&mrwBv(%Nv4&@heX{UH2wHBdP{W5xzR@Q-H +b$j7riB_t>i)B{O@LCa%$|Huit1uxl!Y(uRov#;J#tXt88CmnDU+g{c!zY)+!&;R`8$+%ZHV^+}O2Lr +7m*?(VWY0J)i;MTUfxn)xAH&aK6?orUnja>-&0U^z|}1%hkmHR%~g0osygz?XU_9yQdviUEjavoLf@} +s|HS`_kV6%2Wov`=pt?|ExPL6YA#Lv`?GprH6MQts|Tt9piNb3q2NJd1Zi@P^|}F56hUzepdv3KjA?dJ(sYYj9C*ckLD(ok*n2#HD +k*{y&o@Ibo}!T91hR21q8=T{p}>~T4Pf8^FcR~90T}t%g;IP7pD2(-a(;_X{Bwd4A3zq0daOV{{=UJ4 +4`2mJOcZl{&rm?Y^F0La1Ic&c`ThbxzATF61&a19;doEK4q%6V`9oBa{K;TC!OGo($C3VhMBE<(!2uE +DR_txq8+fw;djqw0AL;g8!EFjoGf=Q+1ENO!UjmgzUYHNQ9+dU~^i1;o5S&bYHmcZ5y5M3?)Zn8t<^q +jj)yN3K%K$4e7&kJa=G|bH)d*4vHFf=-1`n#)QTz1Y59sVK3N7pPt!D>Ank?Q!lRf=9d> +EcTh7ywo`&L*mg@2(PXu!X)ohA0Jm?|u@v=!ONf$I`OU=cwTnI&!4Y}eJ5UUsoCb#>vo93Za?%7ucYB +%SHo;kuBaZjS^N#YAF3pswQS1sNc(VfMLu{#}B+z7Em#Zv?SbM7@)k-Tn6PEfKE$LE&3pgV;L14PxtG +KS&F})kZIP8?jYxKw2k=tspUc=UXDSj2OTWGj|4%mbqe3Z-s1mI53|37O;z?53E`of`@tl%XI+7I*pj +VbL$PT3sbpo0lO}9c}{>`H;69mU5WfrKs$9ftE71k>xD^Q#d-naLM>Z+#0RimP*K1Yz;#8;V?;5yfw| +fc#V$t#1SaPC{s1~G+@iz$4}=bLe|8KQ6mZnPG9=iyMs?i-ay#7{1V^xOh76_%*j +&6WZHzr^;dg>FrK}UTT^poO3emKli9{7X5G?M8dP|^()N$tzt0E`sq<|pLo26c1;E7CsU^~&!-tkEs3 +Xz2R5k04UhMK=f{HQ9QDAi4ny1%&`TgbTVw`%HsHH)tQ#gn19`qplk(L{435xkxJ$t*w{yK?Kn8eIbC +<`t1$u=OKj8cf{?CG_!&iza#KQQ&(WkJq*oNng1#=G!MaLZjmu=>I|BJ6B+a80l^HHLYDrWAYc9pGZE +)sVJ6=r%;aGJ#yzaXL{MnpUttx0g;o5Zu!=|TypzJ~u2JfvM?XuCescHdXBGM!`U3i@)1Q9^{Txd8&t +F5o?DQXa_a6$BcYl$gy!8wCKY-^0!asoX1HSdaGpO+Jtq!~Xc_{a+K>lW0sM31Pi +qfA3}a{KdbN$1U>RZ +iNmwYIG*^P~SG_#p{s`}>4>9czGS$Y0Ay?gi5pWfLSe#P~4+Nb;TqbK&)AK71bzVzwK$1h&y_SO^o?) +`VJk9X#lfyd)L^Xs47rFZXfmd{?52j6`!eDOtjo*zF>{hj&JS6}!VW}4+Ecd-|_vD_#wMf8ayHQ6K#-{Qk-B;_ustdZ(rJ@yE}@=jG#%dye`tefhd +RIUc=x7hc`fFJ^IiLgjgfQq?b7{|x!@yOP?c&0Svh9xfaoy?;60tIt{mx2faqr;pwpJ?h2ld%X8pe{? +$_fAnq}EVCQ7g7;>58J>Sq9-B8vSDBkW)RmO??$sG*)Av#F)7y%B@2a!kKECNytx2R;_69L;a$859~-G97GH{ES!yj4xB6_Wh+|h0kug^OvvsoZZ^}^YA)-+G^z{wP(3?m}m7_dHJdr`-9)U{`AH3yXC#x=1lKBdo}qUzg7 +DAp^t6`&95KGdrRu^qd*0``>m4HVRxJA*ABi%zj^cxMqnFvzj^uWb$Ki!?n;lC`2+B(%@id+p80tzqy +G|6AbI_e-2Z);W#~UE@7|ww_3LdmYtg^&Q%+0lZ^G}NK7acB(M@iyAH1*TSLpPjXyC(SE?Idvpe%vPDSI=HN{{sm!pS}Ce{|``00|XQR000O8%K%wh+ljQdZw&wd +FDC#18~^|SaA|NaUv_0~WN&gWaCv8KWo~qHFLiWjY%Xwly&7qA8b|g!zoH|jc4lN4kaBF6SW?+KV$~{ +=%a)Sem1Jm!1|}M&ad(e^wY|T6-+SG20aEP56_PSTAMd_LTU%QV2A|n-JQb3*OBIhNrppfVN4DGPeBavb?0&}vOJ*j5y>d915q#QYS_t<1>hk5q>o=hVlf;oowd +k@JZ;tH#+3Df&`I}=ll8Oz5;c)^uw}9qGJe^5pm=cYVl2aB-=2kAn!kk|Gs`zXsRHM<*GoZOQ<7U!Rg +6+YLFp|?*oCsfe*X^4dcIyR=p^VIOCVGjKciC*iNzWr1pM7<7ad`RfSI0N{sZT5Hnz#P@y!D^nt$XOS +{&Bl)xBP=HgM;+Uo-jE>squuxDSLVO^VxTg0DxG`q!`OER^7Z-1igNEVb4SYTG!>0#GpTB +VkHsTH%i)qpuiYVED^G0t!yE%XZ#KjFFBftTuD@wT5>=6Gwm*zxf>Cpd$Cz&`_N~)ksRDlJ&=CKw-7L +S-r1(PGPFsr@NKG`rHrk-J=I2|(1rrbo6I2|)W5|SM`gcqb5!r>n;B0)b(Z1jCOi8T}XCY#4e!UlpVO +9>b`hXt!+Hd8VZS|hTOns`KTkWw@@21b34tmWi$HO|mO7~n~zVUbiyL?$e#Xbi=OjfLq&6A8Z317yBM +sGEp6~AW9002-DFsXR!rx?^`cpph0d1j<06q=tLL>o8Ql +r%AK+5C+jaC)8s<_l-v5D_RvTTA%Kt1q(|4}J|eg+waP9z~RV7o>VtQSCm0Hu*phG6d^U(zgsbu@M{g +L`13aEoilL=%N7)leva#CU`rvJS8`Cx`@74j!4rX=(I2+-!ugwh79j%?+<&kvX${hA^Fdf=|mR=1Ar| +HWP4uM~e+>g?;ubO79Z|F}WWfAhss!JE0*RPIDM_QVlt5=+Ym`2{??0xtS5WnvAF4zf_s%18oon`~96 +h2*2N73T+>Z+f0YngZeVX4df71or55UEnsx))l}N=QN9Vx!~M~y-zQi;MLQrC9i;^nLuz$~68st8i#2 +l3!Rh^6`)IjA#hYpdjw>SBd@)YV`aOi^P6Xv`a@}v7$D#}e&KEWmZ`Tc1vHz-L3QwMD)C<;fj}VzY +p}?E9I$H8d`w){W&a9!l@Sok;j;qZbIrP#UAz5i{B+?BfC&Xr!;m*wb|7Mb&*RQmsPGTizfsFI=>oXA +xl)C|F2UYNs9(}Nmoj@?+?1lm;N=xYE%RQDy0WDDqUP}D=qn5%iS_4M!spd6WyZirpC>VE3)n4S4&a8 +(C$SNF#v?(&wX9q!X(CaO2cYs}NHReHxo~E(Spvk`Lq*y^^P_|H_zUd+f#3_b*215q5OzZ1!w)t_U%K +fd9ZgGUunq%v@nG;mg5qjs=$~U?J@F;AF42#+vKopq>D!U* +FOXq?D==EM&^NAtIXjffXkn(0)Z$fDG62Q{5U<06)YY6#ADfw#A;-jt0fix@hq;0F%0_R*IghC;?&+C +JurV#+2WQ9*3TCskuQ-R5~Pk8||B$ID)Qw0cK4{!RPX>1bl-VhY9M9L~1 +bl-zyNA_6Bs0}R_QXEW$<28Y7Kc ++D!I)d>-lrN-bXD=g_+2qU%i;CQcuKygH_wQP170di^pQ&s8FDh!-#+Hq*vAi!AS-#RB{+ALrm_e}CVG&e~uopRufvTD!H%hWF&FcBWN(5T|XC-UC38K#Co|XC +M9DoA72B9C)QlisI)}fLbWK;kRELW=my*<>OGx((2Q}w!bu3FfC=YMB9R}Nc~POvkKz$HZax=H^wd!Td1(y`mxe59U&*6ys%Qpy9NH9RypRHgS=P8i`N4-@W!OlX08)<(0gWGSIv?{;t3^J +VP=)GVkr!$h&Dk<;>m+w0cO?P{1mMgCU`U-E_3R>>}oN#xb(<;Z*cp4LD5H=z%P`XQPQKMc6}0InDW2 +Vc8kW-%o#X$NxYW@rt?Cz%BK$O0?cjWiXJt43o{4AI>B;iR#eGu(|LMet4b=)++*aS6i596+XE_bxOb +bW&fDZ8&q&a$E3%6EJULrU`p>_2TUGkZrZv?O(q+Y`2dtkJ!I(B+ejTvo|!CYPXNix4fDQOhFfGllok +mWw`;wPf@CMiLPllm&6{MhGQkOnZHw;&{egL0(C>`kR<23+l7Tz)##LitoAl(=mFJG^hCZi6pMEP+lL +AD3?#E0VJ-|uT0F87~ex#H@dXhBsg`ZV99HLQE>YnCd=>+Vjc)48o%NPg#GM +lkN&uksBmu3F51u`xGd#$)A2rNVxqnvkkBgl`8eo}Rih;$5JW9T$+1H3wAJKwWGY;?0~ +TlA)4F5O;UJKFsL0zlVoO^lg!+wJ*$9y+o@smARAu-=X)oo~X~a8$+XcNW9 +HM;&OI{0IsMw$llkv>0{V;@?sqUNvUP29+U~NAWQB0*ckoy{Q_8Amt>Stki6L0Hm=Kg8`>pEAP1M%>b*=Y#3Lp +)o?fFaf;>E@HZ7RhMswF4ALrx^RD^mdH$PCnbtpsd0~2!U@Uy&lmb+s4&xtA08S%s>#5L!A0s9#4oQ$ +c60c@}%{{kG2eRPCeq#oTDaF=vryNxbA!zVn9l_(TXqt2!-8HBB6B=65I$=14_CekPYd6GI4%r&i35j5GWz>@g-^g(RnZBo73XLxm2l^7>$-Ic-n@0ts^vYvaSmjF +qeq0$6!xZRlImWDQd_QmzLQr|ew*y~331+I6#FnJLKsI9*3Tm}Cpbz~E7i6rHO7h$stAR(V+W&^-P>> +XCV7xJsi$Vogx{124b!E65AZBZ+_ZgBPHjfIO~}B{Dh4MwmVz&JRTq^TQ&v)A`lljz7aul0i!nH2x1z +O9KQH000080LuVbTQuD)n71DQ0LYyH04M+e0B~t=FJE?LZe(wAFK~HhZDnqBb1!CTY;Mt +BUtcb8dBt6AciXtJ{+?gKrXM74U0vIG*~EwLIoZ6eyH1?iPB(3mS`YmTQ^U)nt)owJa-r@qftYmcII;m^Yb>k|M7~ny2|PGM +FeUiVw{uS~Pi5r$t^xBA-Wdxe!fOYh+vZ#ME<`6q}neU9RfG=yCToI@sI0|NDczgL~2JCaPC5dew3k) +l#f?qe{x?(d&!vPtVRLrkX5GWM0X`=)3bL=Kjg?XD +(#_=Zlg#HuIoYb9E?)+30htim_%o?Zp +u7*S>!TG7g1gSEyd>Kc5AljBI+xQfTL%}Cl^o8&P~u>wg?~O@Kc!sCYlvg!rnzU?7cw+mkBYZPnOM)}BDy||u3Ormyc!y5Z_Dyp)X +7RQtSL+s+YqzLv8Ia{1_LW0E`Y}aT!SY1(s*aL{Ry|mJJ==k{pdGGnyBp!Mtm&dTU|&)-V-fZLSy+1l +W#TX5Xisp$+vRC#m?mP6~&CqnQ%kwyobioHVlD&E-%E=gy6CH(_7H@&`D*wqiT7DesC_MS}b++NK7x$ +c6~)+I)RG1Xp+bcINzbUJXKYw8m7@y?R=vYiWgl +~tE~vr>6q({N}||^Yy#e&!@81yK+#{cV_d2bb$L0iWVYaOP<>2uOa@DC3+e_rviinxTWB{LbqXI1cvky)I| +BWTpuEzK`m4oIUqCbJk5bAA*`i`+0u_Uc1MyN$z#cYfCdcLI-E92#pLgEPMicNwaHH|)zekgwiZma;C +B4T)R*BfiG1Rl89T&bR+cGw`P=B|G_d7c~y#h`2X_b=6YYB-7m~w;_{aT)2_yIQ)tJk(e8R|8o0J?ggC! +h&x&jyKs+vTaE)3;%9VtF(gb2er4dzBH4uTpPv5;%L}q*D^=Z-?t_(diPFbo0S+*n>d79ulLmF&TJpW4gky` +p0M&3;J^kf#d__haK{GBW#%A(0e5Y{C+HkDRSGsV8UWn00iT01+_wSF@)qD*#uAtkMPa}L8;}+umLA% +G4`8-_EeRW75+{nlfSC^|-DbY!IgKE!UEl!u+mVOT!dMAGa2p +svZva2m92#l?)t&DUd#{l-W#_!xZlAk(NFS0qzmNswh7AOkbsDT;hvTy@a{0cbz +1Yi9@qpuH%f&}>{X(9{7_=n0W^19OTbC)sTB{m?=!X4EFIAFr!F=D0 +O^6Q%q87l&xycCF9tEQv^*noZ3v3my`2M6~ +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 +A*mK>XuE`KsEj_lwAHUb`L-od2wgfLXq +Mzk`m9?lcS7w&(=#$Ms>j1B-kPyKO}wwwW_UNEri4F) +bnl}Y)8DX>24##x-|qF$YG=!FPOV_{>*p`6BMnJw>&KP2cwF?)X_d}0`Qs`Dr`d=kG-{~D4B~J*KcT# +A{$HvGQ%LO)pG3aoTvaul{_;;q>c@>ayuGdM#qpCTCr_g%rx!aDTz9k(5G-BQDl0-&o9?%*%^ +DXxQ#Ev>f~nH`ppx`K>^kIE+PpfY?nbkwwsNJGtaid)lbYTy|C&zQ`Z^(_v*YLAU;O^n>G8{p8~NgRUv)yURVJ)+d3N@4(-;WnEF7neP+9iuz +Dx==5*Dp40OHj46QJp&x%mc3(`q)jNAD9!A-Er$A)>4U9VbdLBdo5nx5X}mf +TmSy?dg^HTYWO0(4@LmQ4v*1C~N3R;}@VQPwV?{=smG8lVy>Q~bNUDn$LB~+SYz<UEPsJ0Wk*Me{W?Uq-y$P=l?0J<~X(RpnKDJ5LliH?q< +ecmxv-6Vt7kfET8e?dCyf+|v)Y^P4p?`VWaASRr&(<=~B$grio4?1~ZjYLe&4L4om2NjBbcNC4_zi*; +(N8c?~5?IZ-*%u8wcH!u$Bq#_LjD5+Y%Y}RH>S2E2B+W0IWhY$zQD}mOL+J&|wdZMa)e|?2D#^u3V=hrYXl#)M|1oRc{)hRBH!6e`s^Kd0A{sie?6 +<(`gR*Jxb4t#Uhf>b>Ha9b?yd~+GImlw-z_(Nyc_60`s-dnH-v-P-7X$@ABGYl`v9BujSm#dafa_FcX +t)>Z2$1@=*=Js7gyfq=o_{DVwGaO?TSatxi+id1w(WwMqvwmi@`WHe*qLf1T;S!R}L;(H`o047Y7{Z3 +t2C?b;oWx)Q}YRWM^>GUzu!PTzW~${xN4DxUDs0!AZ440__e>aXk;^KD19y`-x=f;$jfzAvu8w(=X?N +cui%sSfw0f#$c-nOql;TTiE|s%e`*S0+BUPw~LccUwo$mm#B$^eDNSSe2=F`KqnISDP%YwYS?oKGwzF +?!9kYrxUtuK600Z&s2$`b_bB-{avkVjo5K?!EIfsmy)`h+hn@9rFftGRHPjVyU*J`+x-ocbabhnIHsr +1UdVDe6wCCzN=@!pGHGfx_-WfkKkccz;TxLpw_<><$F#TdYGF+7Kkmq1Xa43zt@^T?9WQdp?sZLL-TZ +gv&M-0Fb~d@+9ewe%H;}NzXeS62yY4>HSP91L+SCVmYt^JB3J5^?|6(q~+}*nM?D*v3>Dl@AIH!^7;c +Br=7dN9rUCU#*a3Pk)Tucr(Y9FEN$IH4DdqtrwxP4gFR_1zQ*%s9kpCE&p7S*K(o*=Zv`*D9;^}wuWT +iisAjtltUY@{ut{c)|Fw=G9Ky)D@6aWAK2ms3fSz9&QKakD_000RU001ih +003}la4%nWWo~3|axZXsXKiI}baO9eZ*py6baZ8Mb1z?CX>MtBUtcb8dBs>uZ`?KzzUx=8o5O0;t>7A +H4-5FH~*z1^_0?v))M9sT;#@zL=wY`bUnUJL@P;JY<5La@`1*S~+byh +@yyO6Ectv0-nneslY8|2R8;e|3&WvO-ucD>!ojH;Ck}){SM2=-$lUbgy<_i~dKcK-v60DjU6H+9Wl%_ +ss8Yxe +oX>2?gVFfA;q&d&Q=O^s(iLqBKN7aQvD3HO^ny6Gj7DZ7ZN|u%?C65Ucmuk)KD!pB8NL6tBrLb+I*yn +ozh-wH{rmgErih`kDBprOtya?vcVco5hg~z`vNip-pd^j{jsraf8gau-u3w*Si|T#~x~lZM +ZTOw<0FxSG};tY3~IkL=9Yyz;DhS6Ht01js0Tcoi5r+kkgj) +td*_@Xo1&UYdp{tl4|5`u}g19*E0ZcM%NM0SDv|I0*O?PdHdNuMC_5&;!~Ak62GQ2ir}dbpyN!lAsgd +-CO1m#_<7qI8Z6kaO)H$iws8cQ0*=8ioJic0Xs?KU1Sc4*B(ZthM@Q)dMzsPg)~Td!w?OaV+fn%fmf~ +Q)%4gzx|^SGdw5Q6zX@aa5DvtBbURpYFGW=x+R&eJ+pCub4#0Eg^Hr#;licrlHxOTN8k#BQmE16bZkKpP4CrRiVxK#QQn-c>Pdd{(t@qEPci##&xl`u$0)LrOL-9 +zvWeS`7xBCmwE!9bb4kw11EJO@=IPKkNVUcc70m0ATZ47|iR6gg!qSGiysj)%4Yy}rqki%w()$$Cqx5 +Kr8)dr&YV=@}|2t!qKNvQ%FZb`2RSz@%Y!5{e`xuFNZxF%SmaUI8mPE_)FDB_X^UE{$Lt@g?76quQE` +ifZOi7M%B4Lc4&<4w|73GbnVqY!>*=f~&6XkQW`Q2ZuNfN7}^YVx$WlN>CsmK02{KG*63B1p)E#;4AO +i=L&h;6~-X&@#o3ntTk5edfzR+4FHzSdAbJ$s(@u0dmZ#%-RK8d_`ea%_i4gCG4ZYT50Ze3yE$k*n +?>HEa#0V+p5C{mbkhF_N~ZyYy2g!X6&F-fm(`+{@qH*J9r;ZwP}^YUNXxBEXJ!WV_FT8=z53XC%NAl0 +53tkari3`p4b}*#_^xpGto2}u8+jS~7Kz9I +qBgKPo7$tm7fYqTK+|o-3lkC)s)~K`bFb0DNS@9!Dadyjm`0fb7T408h)|CX+mcjnqVin~~ +Jpzy_z7ill-rXCI&r&})a7@aUZOzti*>BrE5LT-26*xH?DZp{D?Y-$<0poGY{pKm7Iua?+8@%FWr_hV2ugScKFrwhtOrON*Ag6o2v+ +g?>yHD^n1iE~*u#P@@gZwJFx5ZhWW&b*`F8U_2x|HLr!eao|f_FPjm%>R$2a$Qjrxll-X3vo#8cT8W0l6Umu8s3N4Iz=Kta_*9v|6(( +I|Dg|0NJ}Gl>c>`?jg6>E2eq&T$4T!b#2GNeW8e8f?|Y{?d|bQv^@*-~j32NEJ<08}LkLa-{Suk~6j< +f9wSw}ozd;n~s&F3(%-$rg!ap;XjV8#b^MS-EB +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 +|gS!9vL=98i!?lw)r(L@BZ)Qu!>gI@ +=$u2L$!c-@ilR<=0<-$NFYVY=)U4BJtlslYvm9j8vmbH+lcu=2n>td{Hv-qGa@`n)UbyKKb(4k*HNAqP>G&2t~!JRs3N*u{RsA*e@KL|8T`akA-?G{xxzM4b5P +UP9RW?udMa+HIL1(uG1tSk!CKoTaBU*2}4@U%!^cJ&d713;>CysSMLpXinfzyXGl +&=%$kbBoGGBQdG9?X;h|u=pu`h*tC#8QU-vSn&KfuH>x|8MuI39k}b|JFDFS?HC>(o5Ja?j<%aAy6Ei +$b6xpwtN|4Iafc{n8Q!sn^-FM&o-4D6wPT@FO&IHt%1yiU94wzqnYB2}@j6J165C^D~RY2 +Nk4%5d^ox=D&!OdC}FO>B+T-$0e!oP2{-WjI_*6cBm0x)=W;F8l4Htz4AB{0+Tz5Zj;;bG$=*uG(IYx +TB}U?WRbfw;@r4b|DjRZQ(i8ffG6{hIO8(!}~ic2JlD{>aY&0cIcbS*x4!?f^f=jB@v}>3eh7C-v(u) +c!|1cdfh;eK~7kj(K)DRME6|Bn|qw(ZSKoys1S)brJf>ZEhdvZD`494gwqxKJ6+>%g}=4=C3OsI-<17 +H&Qs3L&d(B6MD{*QlhgodvB?<*{xn@KQ;b1u%?KX67HG1_=3OP-{m>$emLd#G((sMymidenIf6^db-w +IuA9!{S5TXDh{eQZNtfB|oXmonW^T7>yn0C1??jmz7mb$z)&!&0v +++$>Fp~(u?)(Y10rjcUnlpuF|EcvT=?u8$q9)fmdYV^G(^{lH<9C+4Vp-d2xV)CDg3>MpO3`D)J>b$T +}o95kzbzN6G3@=d6F-OqRfy^%S54xC*N)IE?2X!DOeV0fI=vnM`vFiM_J~tUlJ3jj~wf$d!m?_|M=$Y +=gX^$@wa$41H_Q0i#jsYNv>Dh3q2YwVkZJ#rB6`QR=)mBsK!2DsOy=+NUmw-*vi_IXiqVuOc?EiU2*# +K@YbVcM9b76cu2PLvPLoMsi=YGm!yZHq*b=B09tm2!cN01i+n#b+w{&d81va6;;wQWMtPm1O~5euYN* +$d@2NBZq99-rP385%epy|dQ=#i3Kf+6s6wrY%*vMMuT-{-bDM_e_VLLU7a;I7w7fhNq<6zgJMc~ +2Qk<#5ZQ|9I5*mIVRc1UYi~t!)*{wj9`uwZz^h)18!>`X9_tq3dLKj5=D(DN`j-8|If(sCGehRDN9yd +D|6rGUjbHKdV4W3Q7UQ9u%*>2k$w64zmt`?_W +!;}ja!ku#!74?{~dq@4ZyW&vspFh??92_(%>!_uVEXp(e(THU`|99{z;2jAVKx(Dlfk(GZTD98Qsg!v +9O)^cMF#X3D8@zX?W!-n$5@a|vB_TQD)1*My;6N8Xc!H}k?l69`byJgW=uzJp{w%8e#Q`QU}4;yh>5z +yHUGwp|3Cb%k;7VUSvuQ5t6{JZ5g8>&bne4?z4AT>5%BLzyh5GfLH2wSijf4(@4!!8R2PfJSxZmV2>; +sP$~#p36yzrm7NFV4(e7{tt`eqFrZ!Af +MD4Qa9>oq->imybbXv(t|7id6JDvtBnUvDuCf|Q|SXfjgxY?o=* +uyMV~Qy@=do;&oX@3;|k+un(Y~cTFE_U)IT6lU!&1A6j-=PptHRAXY72I~NjY-7jpv%e*@!m(Svhr~3{Oo#icDlGcpS*`v)^u4dg&mG*2bIM(hctuz4Cfd0pfc|{aezt%90tmt%h +-xUQ!0o67LtS}gM>#sMqK6fx~TKW4L-t=$KZrai*HX6lgnXXDBcbd4BAQU4kpa~`1XmY;E^FG;p#x95#n1#i& +TOd+qKv=a!zbe2aW*8Lj+aNB@ +Sxj*WYc}uOvnU7-k#f5c!L=DSo64=AGXlcV1K6`+R+YFlv +vwMb`~+nm*;rs(__PD+RR*6u;aqM4cP57_dwt?M9+M(K3K$2?BEg!UB$i%9Genzex&EKo~4b(E@ggEh +J0JV5C_#+acC2PhUomK^&qrx#iASlVE);x2Zpaap{9biV>k^hwLKo^^@N-;D}FJxm7~ha9kWF->d5A! +`3XD@^zQztEQ`xSbLJ#!F~Sj?A?{g0CYClt!#)CUE)(bKf4N^qDgxspaXM24VvwA0(_3`Gjitt@Si6N +I!&_tr^pewSuuNnue+5(O^Erx-}VPA_d^-B-e$GR4{IXaRRgY*M|8sw?Zk#>A%mL^ghb=c&Hp!@3{7o60tJ5>G1vv}oix;RMG#MS_XMqo6 +LquxR8V(UD8BEb)n(ojlwISjhe%?|6=u3cQ>)W6mzIYKBR$sg@rd3(OqwJP#>sv0puqieM?Z-IOt?0oO#X*JS|Jq=?jrFNF(G*)+#mz6H>8+sB +S4#BmUmLr|g(>B<+5c`2C$*S&nKeE|jN6;YPpj9)}*+r8M1|(7gD`OR~)P%%A5zCupjz +_FiWzH&_g&%L5=AE&Cs=kX{t{Z8>@G#&NRpLFpI?t5dP|iqTW(9s27=Kf(q)z*2cMIf|Kn_>>+ +=wwu-sCtZnvEzlNK()E#6fDs@FGp54e7?xugd5ArsCrl4NU*Kxn0Ou6bfm`~3t$f({pSr<2t9Sm~Zt} +?EE_Oe#g|$Kej3l8x)0Yy&Ip$|O9K~e}t%=UQ)Kb_l=h&)Z~G9n7U>?|KlWq{9$UL5clzOb6P4N +?f5`N*071->|De3W^kqinRU8*&JG&&cK?=~6Y1->{YyE4!n?%1!3DDNQTU;ubU1pr!3d{}EGK2OYcY46Dc&xY5Z58F3eUF)#9E +k<{l+-FLA=IOB;RDN8)T1Q|>)hY9aK%<^RlJeU~+`320ukiSQhMKg419{CN}s|n`dX`=Zj3ixiVS%!r +cWgGi3bkkXoLNp|&tvy~ab*UPA&JM%W%Otq7C2KqH`HyD37rDCco7l;oTOUL@Ss#|+8if}Q_I+}kQ{% +Bn^S;X?M|c^h2W3Ras3Ie?o{g-Aglg$k(CJED)`#}~*&1-yuJr5RgJC5nz4+ua9js{0Acnz)*mZHSm}P_j +5s2v)k7R6BQ&;5+6Cyn@#g`{r=29JC6fJhzc-HH=v|kjng+8(|7zwMLAtp*}#kWy2u^}HAUGA3hgCw4 +wL6oQBF}gXO+~cAImIR{EAGqmAk&yyLWNYztxVpR$RZ|vrh-iLLA>@2{vdP-95+J~eygHBF{{;3+o!) +}mpfqjn=|X@nkPe)VbdWV{4w(V@b=y~VN}TlNrjJin4?Pk)l@GnD--S0NSs@LMLWrJxs^O0?Iq9s&E&82H!il*%57Q;M +wEs_k^loVie3QvlB=k-WMPGe|^Y}4YwBuX5paU4Dro5(2~-^h17Qp$0bnlrJ( +p;MXDWY$yC)2oV9s;oex3e|B7dyZz5%7bWQefQ{;0MZtS(iQ@yEkc}D8jfD+#;y)uPh&BFG$CG0%b75 +2uJAI{15*W^A1t^D^@`YrZ<1QwW=L7ZfR|VN-7_R;Qt1|FcAR&s^lvX;%1SxPs`%>m3_!c3Xz70Oj2Y +1z912X+fDdl$L>X8hshAypR5wJ>VF2DzA)f{b`|2#ri+P+*6XTggb^y{RiKgwj#XyBmb_9>j!;pW@?m +x)E>R~tQE;CFN47gupj>Ty<$R(-M*5C`@hBt?DUAFh@GMEsmdJ1p!^)*{x=UdQ +@r}PiGJ5jQd`AHXat}z`(WQNMH1BOqjvtkhMoT_-ub^`?@cRww^phk!vBb@!b1SB7kv`>ZG$Fe`z8`|Wz$+*qBJm)ge-%ENjwKyr;$TQT7|J92nf`4#fzIO+#+S8+9bXAi)^^Ql~?E +1H<2Igl}(E}0A-aBMXvY0wIt|J&8Q&~)Fic-NN7l6tx7hm8xl%h?)-5)rWV+B9Xnj4uQ13UIFi#<&0k +GJ`mgKjVijpZUg?w;1Aa9EGW0L!UxYjDUl(d~!1ssy9V3S*u*z?KA(pXd`M+$Ez2~+eg;Pa$sPR1@?L +r_aP=*8H7+AzOyylSIcB`^+GcT4!SP`WIt}%scz^|LGk6edXnWPpA35^33<=%0Zw6}IKv4rlD`gO6(B +WLz2kRTmMm{rk?6);F6(C77ZROT+$qA|vlaJGK`&U@HaUw?}=@ON|)@tQcVDHT0`%0Q^Ko5%X0S~WY| +4FyuD6EPoGxWBDvTQJ@2jOPtfbAF2s(b_I>iDov)zRqL2O|u;rHjKSyQma8Uee<(mQOqS^*rATxeY4U +jE#Odty@MDl-f*!(vxklGOE>iTa~yf@cm;_8j7WorG@%W_8kkE!uy0Q12TiJl*BUMAji%R0E6sZ*D2; +pl$S=&BSZ~)pD1mV?aSPrWjb&>b@0cV$-o+tZ*gA9F6iEWKh*-0&Zk_p6EmQe@4aYdeuJqt9J7~2Xy> +Dqru;Q&t<%XJ%Irny5Lba1O-aBpt{87o9MeP3VwStY=Mgq_+gKB~UF6&sgUbxcw=5&Ei89cfvb}EO1+ +J#@1M6N2lNuxbItxZx(+lM(z$=lP~IeRiC60V;Z<=DM8Z*ZfGK_PN_50+jt*>Ox0x_8!Kn`Y0q%L({= +E9$FjHuoH@vfCOYw*`H|ssKr5v~`Fc6z(2!TJ`+_D((7J)uTpMaB`mX3GBhuvWL+tzJuOSa +lJ)c8ir|%~3?u+Ox?20VCC2XAPA^L)3Yi0;gr7J$E9QiA_pF@7WxJT91vJH)&xX_4SbBOo1h15%19_YaAX7!t#rOjTtMX9WE +Z-v#;(!G!#X58!v&kQ4reAT7H-yA8Wv3^5^CtDyLgD5z+g8IQa>@g4q?>Cyib%nuj9pu;0dR3>gkvnr +W`S6$*>b|U85q;`tf5?1L~><@m)f#)Q$+;llExFL_xzCylPX!9d?KZD>5NT{8IKpp?=gJ2QtOV$=4h6 +Qbm89O=5g-AP2z2CU6<{ksgbW2SDl6j0H4;VMNyOI`sMx>YG_qZjs!w9_!3yE|hCxH*q)@j#dbj0%}? +lQ6=mM?qA=`{{HVNuC?JJ@Hf~zzHO_0-;bWMu_{AI>e@WUu2W)Tu_C0ZCHYxl3_Q1t_Be3$VQK<@t4D +>$jws*Kh;k!Gln|I8<=gZyA%ovtUmfbe#TvxPgNrqJOBXJNG4|o|Hi@-A(-sXQ0SHMYisk}TAmBKlTG +#k8>D1?#`&}-skQ>2cZA3B?UdqE%BdLkgnV7Bv*;9gJv=0;ybPk?L>~Vn&dis2u;30vH^z^w&!Y9(@- +V?D$PhyeyoXT4!4IZ;Mydtde?JaPW^c5!-%y@X_YkcTL2bkW4F(sWxaY;pZCsPESMQ~(AsN_||(X&}w5n@Vf0o;t#25Al(s5U +w=65qXYk4^`afg$RZYf4lRlFFNKP=xnwxBBhO0=?AjxYH)KhUmD7&6v-dnAwle+#g=pRN}^#UBDI1-t#Vgltb^ME83X^-rn6&9rt^Cv0ZfQqMm!l}7-H^Qat+vjChM1J4BU1%VPdH~5PEJGbI=|~UDXI(C1U9lD5+v^ft +dlka7mt8Gz;DzVa>oSc!E;Q6d3LC~RQ`+{G3YT6K`{l{y`MVq6UVNEF*QodiSt%?I)|Mvdu^Q5=Q%vM +Q*Rkv2#Tr(_FW0yhP7L#Fs*fOBZz~@J8Ll=?OCry~6m|dWsz}MPD#%XYL`(r0S^V!Ax(=665$~|s^e1 +p9y_{JW-@BPL(*f>ZKL_uxqMU!V<@_s^v&JQd;;+H&dY5&q7c#fK{qp7#k!-H%Y7Nt9Wf)wsh={RR)s +yLoxv8P)a6h}(&_D#*KrN=KmyrXYqM=^u5{zDjxF{#EtQCP}?XrpWmWq>MBY+^Vg}C6e^2L3Kb)N@lU +3%5T`puQ!kjvZiN!hIN_3hkt<)=JPH%V_z%^r4_0*|3pveX?x?A|Qr)`A29ngg_W7Jd#y3WAQkFvg(4 +MKSJ*m?HFqByWfL;ri8Lp2RN2Z>!uK@3X7%BnfCDV#~f6wxR3G9~M`Umr`uaNbb)d0SJ~s8M^?L2{;U +t9OGK~hf{Q|yiL~bQ@N#OHsej%FHTbDk+yRh6<86(uoQ#ft}jhywfAy!ROs2xu!SzFie0_H_Yg!-86= +U~v0ZN)KEmiL`WWRgK@4#Xp9pX<9~18h(gy#dCvw7>;b=N1y!(lxR?-cCNWt^GZQxm8>l_PgeZK;q^g +`$WKAD8!M9qw($8o;cr-eo$d+PkSEy<$7+24UcqYZak=K(>)+I`G6(sPOM$y%Z;#ueekg#0~)J$iyH$ +{Q}DZbJtPTP3E>La88C7!gqsF57Wc1aW(^A6G}@+wC2|aWxSb1DqwHP +_Y`?wS&y6ci|0<0e^IkIgWrOeiQj*In11~5WJJK;Qef)Nh_xK;u*!5F6&;9|IZ?|IE*3ndcZ@Kmdwf>ANLVj4hd5uL{uS9`3;JrqcJ$iwV3s1 +lVgldtu_d#~W+KkQy*NgM&8$sQ~q$O^rs+IwSU6&;N@uKPem9r|vg{u^SYLF=`<$<4|N|Rkiu3{ +K0QS(WB!nB(~MSB-DgANOsB00oo-7gNJ`?k3L!C-DBQO<_TU$wN-lB;K}BxD-@-nH9~K`F +$p*VTkbg0_VY3i^!D{ZzxGybmR^lM`P9byK=4)rJ87$d?W95R@`D57j-3s{Ixt8;h}! +ct{I1GmkRd+%b5L(o4+6VufP5M-&0@h|EfDOToJ?+hBew!rTzY7iDkxfB|mBu;TPTIY#3S%5X}icxCS?Zq!ChUP&L`0E51q~0dE+u^Oq8u0n>UpG1OtwZl> +NZ@^}|^REsMxGpwsd4H7ZoNd7lU{Sm6QXNga7-5#2g*MVC$x!~F6^MdBg~Ld0Yu`0dnFAaeRH75EEl; +AZXnq5tBQR;fchl%fpc2{)x8z;H^ +a6^jxR;IDjy@yFX4XDtE>0dfL=bjvrA<-;)O_wa$R(1O%`eK7GSgM%iD>OWYk$zbhD-9jO-eSbQFpQz +(r%)VKnO|vVnoEuCQ*!Kn_5FLIgA%?QkE-jy6hG{-lqDgc^NPMjlgk7i6Fq=>ar7#x+^%Fe1Rm#H_&( +*|qvprUARu!A*26ZGfK)<)IFHtVlMI&?53oQmDp2dJIyLA$Z)^=jPmbAAMg=Rn&RfCE&!u30tfxUAdq +M(W@#WT=6}w(`S)x@+z|G18qPQbx{~#9XtkVz&yskynYpnUD<|jBmmMfcv?^mWnZ*Or(w`RgJ5;J`Sb +_Oq_mbH`$h?c=8;!qS4FEpq4@$8YL$4?TU_3>@qQzC_wGFUEVI|nP!iyp2G2DclAnEe;W{UC@QaIgiv +^tUkJN!Yo>A&Ide#)}F0UWtw<2P^Mt&NefmeSP=T;_;RihTe@ITxe$*0k`q*TTAam%WqpNR$2J +M(+YXU$XWcbyNik{oKrfoa8S&lP$=;aI +NpM== +I*)!qsvNgnT<8395X%y}M=NMoieymyuT5(nuYT2b{$YH~#wk_Q#Uc0J*z`Egt=U2*0Sw#Uuy14zu~7J +9T^43k*Hu+))u{rbj!E~4eS;zkr=r~h9@`zr9pfa4gK-M*I6NGNa{>XahqbZeV@Qm^nw-5PVB%LVsZO +#SyBr-m4YYvNLW!dOrMQpW0xLdSTF(6c>aI)DiOFHYks3}jXHS|5vlCommzszaLYHmi_^Hwymz%s3HZ0j1Z~>Bx@srtOoJ~X6)gq$|Oa|o@RuWBEayh) +OFL;$G?p%Oq0)Ayp2s$iwS5QmQtn-tDNJ6o+{R-Xl0UudJ27tB8#;N&xc<(ALm`(c1;>R$#SjU%&@BF +V+$F$d6r-yu(@oo2sa}*?6*nmO`{H6qinR81P@u`&mAKkI@NNxVmED2_U--{tb*-t*1$aP(meK7POlP +LkPPY}CSz7sGz|`6?{@ZYcMaTC?{QJ9fU}?$)@b$qLLts)xV8&v)=sVzB&`%ymnf0+@;X(Br&;#xz{G +q0iljwy(x_85cwI6tPBhxb9FW2VNgD6&3H1AXpk4s2XpuB}6$Jrm#kRs9*3BB#-A-%}o0i$Vo%VtwS* +aF5Xqo~x+Exr*99S5bSXDsC2+k(PV^Rzf2OND7u?Yw)aJs|`=($=5#fuvLJFQz21@Er8yfE?@z)whV+ +z=!g`=8r<;mNlY(+kGWzLZwkfiw2aR{eTZ4;;bmYeGwJr+H+qv-c^7@T7+-sUVo)PQ(=!NwIoe^WgD< +eEwG5)ER5Y^?O9eNoYpg!c%!$89M7QO~i4w35(iy;-m)q-b^nQ~+9e#NZ3L(-Huz5ir%~5oi6Z_ejaigb!~nl|FT+Q{DHwcR)Vrg0Us=gdZM~{ZB!XLd&t5Cb4>wxf6jj$mZ +c3_cTB{3D8jYEna;_+_Prz7Djl$~-ipWM;7x2;**b)nO+JG-RVsbMquHVPLI@Z; +um4I9a%fgCfTI5~LBL^Vv4pu9K*;nnpoiRGaGP%5sY!N0gT#jbte#PA}mj5e6P#S6>9OXS6As|^sjx_ +s>ub}(@hTlG4k?{xb9qrAD`~-P>d02RMPC8&XMfD&^A!fUI7xWGO;Ka*jkEU&8EqzMY7cW9>El23fVG +(60(wfx%q~1nqta+?Q6t7!wivJL(z4er)5VN;|JB+cK(y7Y3G}?bDtZuzKC-l{ +rXCM$ENSnK8d}!(ygU{6e8K2Sn0(E6W0(6!`Ei$>LJzGs@jp_QQ!mV4Hv};3DQ8tBm0XlgS@! +in3L#*|_&C>#oZJNo(q_MJ~1(KuB`aDT1do%RmV`(R9AzB+0BW7TTF|+_Z&*f9 +o)7$HMz7UNd%z?LLys0t9;-0BBj$Ic0Wj)z^0FR@UU^u+4jPzpI;yt8R1aW|xw(!#>_XBrG)VtHP>VYcxd-(mHQ+!W +E$x#(W5m8|jZh5vyOjS+h0_OS<7s{I8Ns`Ke(^$*)YUS`s;W~jT`BY8N{T(J@sM>zbgkqc6X=1y9dE$ +J76GdR4PWkRBXcZf8iWu#?2mR=fs~!xJH(m0a3tn=uIyTf0HtoN@{mXa%{=_S{k;DIa?AdobF+ImK?` +`Vsz)8db)tDWHy2DDw9YcW` +l?;iQcGL5>%EIDE`qU|qVCO6zQ{I2$t|V`XfYR}g7sy%;yiEa*eSS92_W?|=3hJ0zYB=0yM9>5p8RU{ +bO=TSB!?grAp3KP4hc9W09E}#H?E0mD4Z-ptKLn~FvM>n-6GxY@ed{?JTgt=r^{oPM7~g7(|h;+Hlf$*QM^@;pXlK&jtBgdcgNfl>jV*92RX8Rf-7QmS>acG13%R_?n +U^9hMdG?9bHy?^gQm6hm-eCdKg7#&W>snO&hnd%fWX^64^7fCaHx)LMI1`N=^x^z6Stxqz4$y`;mK(|_J1E3~O%Z;;Z$xS0f`NSjLRhL=GP +BrhWk5@PfLVhm$x!l_)TX$;*}jsSqG~&A8MoXnyjH;h?;G6hJ0D@WP6hR>HV1u=X~? +dg7jMJ$o5`x_COnuoS?{xA^s#f09;P67;EBx!c^DTgQ2~P?hR7a(&M;^Jz_7p5ZQ?9G$TEJBGyiZH#& +GM(gf(nFv~8@5J#J4{2K4}vbO^n5&!6Yd(H^hFNXW=duBfMbZlAGBGb9(7*n4blF3xFUmZc(hNxL;H5 +SzR_!PzC`0;;?m4>VkKs1HPh>X=>6`7%jkPfYL8Yr=V;hA(?}XhMd39qrC(6brOE>@^Ej+P75NKBN0T +Nd4*YEktKc3g(SKvEwun4-Ql?e-$2O0Y1#)pY6{w`3QS~RiAVvUZdSU7p~dim*n}02(;vFF^2LsHevI +-FcsQ&131XEA)c#zd9wUy(awH8{}FyKtq)NkPFR~?-rfGVn4g}%LhDKrj54`=`x>5j{Y8QIrTjK*qMz +GB!`9g^v99~2tI>W*Rmp6>MTo{4mPEt_svqj^7o^zLZ~N@I`fZ=bu6}7z2M?;98^k^lzl^_tw(wi0gjFnKq-c{4#_fUV7?=oFrIH8hu*OPGEhb$r`B1=(V8!m(*o!uwkMP>|cMv0Y?(f692+^|N!Fp9K^DN6F*L +MXZ2~KP_0x_?C2QvOblYJ$$j-!J@dKaDS2R#nZVeFal*c69uLE2X&&STs-?RKNzE}6Ob<9KW%9fHzz9 +vI@0#~%EryXHRjIEz>t*MgJYNKVihJNuL$4YMGRnN2Mx_qUNv7J7f!*2En +68Q1!YycvF=1RoDZkPMMp`3)!VHvx~(3zxGi&tmwNQI?XT|k3Q_bs6>1N3F%L&sJx1Ls)B;P6NPe5Ia +MpI5Hn)b;0?3cxclP}QLsNeXq+Xx}}#YWln@@H?EPv<;*q8Wl>P!seW>&4q6VTe7-*jR5OH&s^NvQ5P +<=KNUK!Cp8l(1$g9;QVTawwsk|ejl>KNK_kZjsb=WX*ufK~20)f3x5X(IB@z# +1{cvcxp81Q&P5Ui*o_Uy+V$VkhlMx0~ZmVBPXfxgA-W>`5!UP|4D8^%3eQuBCP7vY?lB$`rBfyDMN5( +``WwyAZ8f1gO-7=ZNaI=p#SBT>%$m+`_K`>cw}~1uPJT8Kzk_<{f!s7K0-3P{d*)J+bnDj;z@lSg3~x +jleI>z_?ChtXK3dcr80*gom6@UGCXyGmm2w*Qu_sWwWVI?%XAZjqhFIDkCFy#eej74qnYs%)Y$}Z-Lpy3LI^PLQw?wmLA+ +M98+Rzd+yV&Wx#7H#`#|KOrs@k46lbtRa$-3nej5wW>IJ*f9sdZlAJ@+;(emXMD_Dx=q(ECJpG<84nB +}WB;Rz52%{%83JwB&~rPv&FjaaYh+a|W|SiYWwp)Rc!yYmzV(s +{Oy&`^EAMsWN->Ni7I;(21cw+(oK8?=KvM;-Uabb-FB#plvd@wx;+%3fXOZ{AdR|D47-&~7-FlV?KwE +$?VCD3bl{_ON&vFI2FMT$L;;s|n#8XBQ( +YMe$QvliT!g3?$P!?&!(bZjE>b!^qrBrYGUU*_N$n!dVh?htG=tqIMEq$gSyKkZi6uk^6}ic)$d4OYG +eHL7kknM=@Nmn73c5i~9K3hH7djP3xOxLA)T)rK-gJ=4j~}((8;Wppr@)~v$oT?$;#9sM>F5RVFKJlB +8WD`RnR#0*v?C}m3as&0nO_1XOTxd_>fg*K9ddbeWU+a*i?qyj;4#ojfCig<2W?FgjBRMy$3fWP#ahF +-wQbO~i?W1+33dtsXVkU~*P$1A>=86&l3IKuv;shp2E`+NYYf|etBUe5kMz*46Ba8}81RfN0s_g1_;q +`1yAZEl4`rffn33Z|VVn`N2r9yejGo(MQXjvJb{wTlQkxkP8WAWeC3VLl_af4Ng;-@XLYR9|iOh>CXf +~yHOnp%fU3C^;8rq#`TJLW=Z)7iu3%_naXtL +;!#}N<9qVC1L7je5wy>*a=8=y8exxVZUy=Dt2EcUJo0{f>PqnS*CroV;tUy+lT3bUJ3WEtA-7$7HV{DT2iS0WU|dNmCYCbibx +BwMBBYM&bY=HDjcvj@(+NOj5uALN|jt>zX11XS(ngQdzuHh&@?`JK7dayNSJ}RN1rui>Du9E{+t}nF~u@@&@ybw;ItoztE(b*X78`jU*yXosV9(&9tyx~p5;pbgV`>S7)!wu8~y_7MsR{!X_ +M$(s5J1IpOQgOS!rR@!;t{6N8JMOXS%QSRx}oE5xdHuOj4@^5=IAPS)xp8zPb}*yhnsAhJGl2DC%uw! +}I&ZpRQh5Sc_nmF0M6tqe9G8i}<{zfIA6he3&J +!tTUPphFPp^cjldu4Q9MR7Z!%7;gh7UIR`0^c +fBetEv_xb2jY$dyQBWg@?+vThp}>?CQ +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 +JuJ130JF~QtXL+W` +xCl0FBZUni7NmnoW!1 +NTN)RTlz18kvJ>aQoF&j7k~R|HOZP7Ka}x1#pvHT1j4H^5ocHUp-dCifM%B<8kD=y3ya(>#K}(W2Frc +9#^U2QXM~J$Y!FY%?n0y-KFMJ-sJdm|Z+OF$%9K{@A5(74mbC1)OL-_*6)fkEdesaH4fY**&-?sbh{&KJ1>GV$b?;bdNgWdM&! +Tz5Id#lskL8sU5yJo!8YZcMjI-P|t2ffpi{r~!>zdsFlEWGsc+d)fD3+{_3Vex{8ovx)V5nJlEeEigM +W#wzyQ?7ddW2r82tBq~xz+V@it9JkN^nHIY*y}^hccJcB>?B}-KQO$k +ac6+A}9zE>8A0RgOoI&qy?*LFZ-s|+bh)N0(u15RQhzmeeuYyu&*(WRdO8CR+NWhE&GkVwgIpr{u(#S +R_Km^lBIP+8_&WJe+FGg;_BVg)@<2gxC!T}%^@YV0PcE0`Cj|O{C3rUyVN-{{(?+P=p``=j=q`4ip4pW1eY{kG9EmM%rT`(m7T)nGv#Dp +ISIOBGLLGM^Vigp-|v>6X+n-K1VE=9{`2LZVB95Zya7p5zd)2FA@^&l7W~PwGxy&nGgA|qQtwDZF7NJ +!;GA?LaAxY6eB$+Gct40 +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 +f7{18?Y+m#7`uR#}%a0JKuQ& +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 +Va~(Xx@hcJ9B%!+3W7~?@C +rceHjS4H@A!0vLswwjnR*ty8(x(07Rkks_Qrpm-)^2k_wyoq+vvQz?^PN@YjAd0gJ6P?MR@OWDQGnU{ +YCUWfp^b=6Tk1=!l#av-#^frPtR(Y6HNX`a?kxksR;0#It%M#nE25eesxGWZouN=C%XVkER;RRmv{yi +Id0*E^I-q&iR)%%wZHJQQ5GxaHyR%ls5;yONF8-}HQtI|mzQ!GS|9;yiRax-n_B%dv=i&4B06u>qU%w +iM^~~!lxga;qGK(wn$J!uEx@3r%&!_O;RT#*4`bp=k}>h#?Y+( +T{BeV1<7j05y}1S)Oq6AQ(izW&`xuz~*vKR~l|r7xA{cJY^Xt|9to6@$l~_|MTOkH_zS{SLIrS9 +0?w#QlRmCKb@zc5^tc=QpS{miIz3P5FG@Y@*ciJ56JQ}jN&nuI(|yv@sz~lkw3MrsRPCeGKtg*8+zo) ++q(>eN(Ju_SMW-%OT0|-_hR4YA`i_9&|+Vxk|{J(L6GqB&`};#->16T5Gvdugl|w8uxdm@ekV#}T;)xmMu^GEm(GX^mxmO^Eky@;bV(yK7wHUy~^N%MUbsH3IReE-ui~L^6I{sE65-JuNV7x+*|^g1}H?7vgHu0IDS0jWbwIkQmcSyaqIQn<>3wS +nZ_ixL$)}cyWbabxd>G9M)7C8DawTF(vumGL{1n-xw;~7=>wDrpex$u;}~Zs+@_IK}nwgPHr!DmiyfGjB#QQFstN&9(RmQhE|73yP> +Hl|XcuaO79&V=mFEh}wVjqWpFKj;3G(+PGl80E2d}o;a8(NM6{aj1aM<7TY0MW$^eCRvv9eg#BOcR4@+ZKb+cRC28RtMEq`GPMM$e0(amkUaZga(P)w1&sr6U38aIvc?2fwC)Lq +cNWkmG8^~?$jsY&DD_yyqKt`1O@^*RY|ied=7)ju(JF^2~DpIARM4EkV4m8>hP6*z +f(CSjDd0(Oz#=6Di-7sbCMi5{V +>O;HBx$eFR9&h#@Zo@U_&{VnUo<4QijN-i~^iY+Q4w=O?B +~e^gSJCFoCD4u`$@qTF^ytw98zGriNGSs^}$#u +P67Clugm=|%jkvH+in)d6wJ*av-9NNV~ptHg6jz9K0MK^U!>jIOP7E+jf&VW&4I@?(=oJ!m-u!Zg&B2 +-w&dV{+M-D4{pulPsjqNE4oKBamkw70?R+0~$!TALQ3SJwo-I50TFb6-(taWro0xl>96xk}19;)zdE7 +7~vMD3i3$O0R(?eSsv1FiFpjw9FYS|BQ1enc$yhp$iZ`=#`Xma6&@=J(C5Jy9A+p{Wd0Xfw_appcFBT +KDk(kNomtLke#zQT0Xb{v{Y8ABZY7HJQh{ZdM##lL&|zccKD6YzA9a4HeO;;Z(seG-NCAE4^ee|=#&) +HbY91 +OB=>KcUhx_c1X_tixRcol+Ex?F{bLLO5&Ekq5K*eUe}`JmFt@6 +aWAK2ms3fSzCf`CZc2m008<2001Wd003}la4%nWWo~3|axZXsXKiI}baO9rba`xLb1z?CX>MtBUtcb8 +d7V^EZ{s!)z57>8wFk>sN5}?f4+3&*w+LUm-+@K8pMpVz+0)~n58oC^C?j}|(qIa|FFuF;FSj@I`^6kerJ+E=An2bF!5@`c?V;v%k{wVMN+ +&}zwP-3r$oI9<7D_IQEPTqkHs4NdEEj#^jbO&yEBl9PWbsZ;$3(Vgb{ZbSOw-&!a@*tenu0au5FHfuxa9@}Hx}q#V68D{7K;R)48r;x +YJj!|5|orEM*cm!n|+0Acs?vYtx`BFFIS1F1-J1y8BdlMpH}b@#%VgH+s@0eo5F!gbd4t5;@-rQAHL& +TX;DiiK;r>5Vdy)wiXL}_sX`m%$Tn@}T3W+iX#^}wo^wJw$^xwW+1)&Qe8}z|K0lqKj2+A=>?ZF68Wm +W=s~^VhGD*GjqHZ9*p>4DT)+yoncJAe5TC;Vsx}=2o?qwo5owdEBgQC6`qi&oeSU6B=!7NLEE`@7q-H +p;;To7xF6K5%Y&yO;kHaB*9o +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 +-rAv8bzW7xR&PIdt7w@J +F&7QIc4@^)e26+Y&6)(r;adMSR887E@A*uYUZVPWkwc>XXwvdcnQwAYU@DD|Kg@Zhg)HrK0JxJ}D9mzj28YBh(aR1ynBhhVB9lg-=fm5CfrNCMHmzfj&A +fVPpoX~QG+{6iE`~#muHo*gQz!JC)C)(!$&u2F-+)H+r?th21`Og+88L@0;BQXwZ!ki=HG4g#rMvGC> +e$6N+XPBMb&}@3i^*Gr}kcqLASFM3(1A}5NPR?l*&_`xqoJ|>|fwO>Dzz?++7@=`;2y>7)#3nX1c<~< +W3#x(Wi1I+!+=G$FsD59x=1l9@+i>FUjRR} +$fw*nurtpcoSGd2~a;$>Ju55}d<0gs$am}qm_QJ+*)tM3u4`F`(Q9=Hqn +F8}RuW%31%IkPCV@9F9flYJlthV~E@i#Wbq3RpCm~EOmSJv?Bl65JuvjuU5$nbzO`^02YXt=6TGxSnN +r73b#(3v6N%b7Vu#imoJtgt^@hYekvg8hh1ZZuR5QH;O~;JARTG&m=?1;@^M;he;dAw_^EG +?(UfquFdW6tk}9j^=Y&FKFMC1Y=Yof=$=^3cAYTZLu(}^89{;-hn)QlBd +hE@cv9ogryH&1e>$RfL*R-dIH*BXM#SRM8_C(_i+X-8z0t;s~|91nmn#v%Tt%XpP@d5*}6qlLe8f!BZ +oc)YWAIv66PR@(Hny6}SJNfJ!mq{g|E%*`YU=r}f;!gf+6=|f*Z&c|%qvDe7NE`g|PSs|eX5+#O#e2_ +i#-6A4d)Gzgi#XUR`(N|1v+ECVGZt8|>1B@cdO$V}k9+DGlPz&`tPm;_C=KOR=K9J}FC;!3H%)3n5f# +3Tabsq(%L)RYu8Wr62=9s4k*Pjc`VZiH7WF<-$x4Bw)Dn~rg)zy4wozj5ie2stbl!P +r?(dwVq7c6@d)xd9-zh_O*|F9ZYXp_r;)aFoWRb*JL+VchH;~2iTUX^u4hABxyqYy!L5NAVo>gjFrgGSyW>pa2z!HMTN +=eD^AWvHXi9a-p_8p_1a%EFO{^dFLmcj4d9NyeUuv?Ma2W9)!kx3Fz^?r^9#TTq%wPJGDa@z9~>+T-NWRijs +B#c_)^p%uZ4KfV!upEX;`yaje_>{wb;_peJ=1(W-{s>6J+?nkPl~VUa$L%HTB&sd>82^?Wt1le2$4{O +z~%KOfk?zXc;6CZ^+V_1EhT;zBtcLSH-pl +miV9?-zU^krpY`x^7<2g!iCu`2PqL{&8jLMMh@nlY1D0Ka}YKPjLbPm93GHg@}LdaM6%612Co%ZBG3L +}z9%P_Aa0xozGg7$>C!uZSO@yeBO@q*|wYHQ#{s8!=gWhQB7~p;>0n%~3Y>>CF+U!FmKAvkg +;CMeGM-kRN(Xhn%Z0Qr?3SXADl0uaJ&A?4I6(+ +^x;c_AU$AdA#WHc%?_4P=->GbUj;FrqiUR_))VepC9_5ictanYly#6KP+NW03HLBbDaPr!K%X`n^_zg7FOXD1~k?ZWUbSg`?YbIvWzi^1crIfQpDgYKMm!7%Bv*RH7Uys1sz)WQ-=dA)|Z@y-4~hm}#)on^j0Bso~Dv! +lIK8e7vE#wcmmWjP+(rMyt%$(djHc@W6xGA|wJ_?wv2Q$>-0Obu6l6L$p)zhsieUMEe+$K=o)(!!|L< +z6h_KK9wgsX2?K&+QGs@q-7!$TN4%_`F3c{p$vJHo%8wD5c{$n&Gr=_<)qB5fb8os|RG=t9ZI)Vddj{ +o7To1jJ4Cy*qxtjshvAM9p5z{IoaL>-8Z2X$vl$m#33tT7mcoN;^^plu~Rfrt^~gi{hY%JD8V_T5naYtcB(D*P1 +N;8MkOnrQv9jvMM-OcV#n@DIf_&X9m&eR^#sAM`!BcfZ^q6LvTt3)(^Qyg1i`hp$Pe3>)mMS@8Fh3W$ +gfgU@K +jsc10nPxACkM{a3r_mT=;TSOi*mV9_t*ih@9;I&N +wh8&4;ZlKUiUC+kA4)RfLO?e#1H2sJjV%Q)Yci`G2COY)p`fi7aRmoZPqOV{XIKc(4q?s<@y$iwE7tux+W%VOi@lgphh?|{80Pb2=C@Ro4hcra>_xZko6^OW*SNgSf+QngI&&jevZchr|L=i7vj`>-g ++3#-ghM4R}HILsbhYsURsJ2v ++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