From e910802bd5bde8a758b1f6949010ed5b0bb66d99 Mon Sep 17 00:00:00 2001 From: minhanghuang Date: Sat, 23 Dec 2023 18:42:53 +0800 Subject: [PATCH] chore: add v9 diff file --- diffs/v9/common_msgs.patch | 4585 +++++++++ diffs/v9/cyber.patch | 18183 +++++++++++++++++++++++++++++++++++ 2 files changed, 22768 insertions(+) create mode 100644 diffs/v9/common_msgs.patch create mode 100644 diffs/v9/cyber.patch diff --git a/diffs/v9/common_msgs.patch b/diffs/v9/common_msgs.patch new file mode 100644 index 0000000..d17c220 --- /dev/null +++ b/diffs/v9/common_msgs.patch @@ -0,0 +1,4585 @@ +diff --color -Naur common_msgs/BUILD /opt/apollo/modules/common_msgs/BUILD +--- common_msgs/BUILD 2023-12-23 18:21:36.391614905 +0800 ++++ /opt/apollo/modules/common_msgs/BUILD 2023-12-23 18:05:58.947028975 +0800 +@@ -1,211 +1,7 @@ +-load("//tools/install:install.bzl", "install", "install_files", "install_src_files") ++load("//tools:apollo_package.bzl", "apollo_package") + + package( + default_visibility = ["//visibility:public"], + ) + +-install( +- name = "install", +- data_dest = "common-msgs", +- data = [ +- ":cyberfile.xml", +- ":common-msgs.BUILD", +- ], +- deps = [ +- ":pb_hdrs", +- ], +-) +- +-install( +- name = "pb_hdrs", +- data_dest = "common-msgs/include", +- data = [ +- "//modules/common_msgs/audio_msgs:audio_common_cc_proto", +- "//modules/common_msgs/audio_msgs:audio_event_cc_proto", +- "//modules/common_msgs/audio_msgs:audio_cc_proto", +- "//modules/common_msgs/basic_msgs:direction_cc_proto", +- "//modules/common_msgs/basic_msgs:drive_event_cc_proto", +- "//modules/common_msgs/basic_msgs:drive_state_cc_proto", +- "//modules/common_msgs/basic_msgs:error_code_cc_proto", +- "//modules/common_msgs/basic_msgs:geometry_cc_proto", +- "//modules/common_msgs/basic_msgs:header_cc_proto", +- "//modules/common_msgs/basic_msgs:pnc_point_cc_proto", +- "//modules/common_msgs/basic_msgs:vehicle_id_cc_proto", +- "//modules/common_msgs/basic_msgs:vehicle_signal_cc_proto", +- "//modules/common_msgs/chassis_msgs:chassis_cc_proto", +- "//modules/common_msgs/chassis_msgs:chassis_detail_cc_proto", +- "//modules/common_msgs/control_msgs:control_cmd_cc_proto", +- "//modules/common_msgs/control_msgs:input_debug_cc_proto", +- "//modules/common_msgs/control_msgs:pad_msg_cc_proto", +- "//modules/common_msgs/dreamview_msgs:chart_cc_proto", +- "//modules/common_msgs/dreamview_msgs:hmi_status_cc_proto", +- "//modules/common_msgs/guardian_msgs:guardian_cc_proto", +- "//modules/common_msgs/localization_msgs:gps_cc_proto", +- "//modules/common_msgs/localization_msgs:imu_cc_proto", +- "//modules/common_msgs/localization_msgs:localization_status_cc_proto", +- "//modules/common_msgs/localization_msgs:localization_cc_proto", +- "//modules/common_msgs/localization_msgs:pose_cc_proto", +- "//modules/common_msgs/map_msgs:map_clear_area_cc_proto", +- "//modules/common_msgs/map_msgs:map_crosswalk_cc_proto", +- "//modules/common_msgs/map_msgs:map_geometry_cc_proto", +- "//modules/common_msgs/map_msgs:map_id_cc_proto", +- "//modules/common_msgs/map_msgs:map_junction_cc_proto", +- "//modules/common_msgs/map_msgs:map_lane_cc_proto", +- "//modules/common_msgs/map_msgs:map_overlap_cc_proto", +- "//modules/common_msgs/map_msgs:map_parking_space_cc_proto", +- "//modules/common_msgs/map_msgs:map_pnc_junction_cc_proto", +- "//modules/common_msgs/map_msgs:map_road_cc_proto", +- "//modules/common_msgs/map_msgs:map_rsu_cc_proto", +- "//modules/common_msgs/map_msgs:map_signal_cc_proto", +- "//modules/common_msgs/map_msgs:map_speed_bump_cc_proto", +- "//modules/common_msgs/map_msgs:map_speed_control_cc_proto", +- "//modules/common_msgs/drivers_msgs:can_card_parameter_cc_proto", +- "//modules/common_msgs/map_msgs:map_stop_sign_cc_proto", +- "//modules/common_msgs/map_msgs:map_yield_sign_cc_proto", +- "//modules/common_msgs/map_msgs:map_cc_proto", +- "//modules/common_msgs/monitor_msgs:smart_recorder_status_cc_proto", +- "//modules/common_msgs/monitor_msgs:system_status_cc_proto", +- "//modules/common_msgs/perception_msgs:perception_camera_cc_proto", +- "//modules/common_msgs/perception_msgs:perception_lane_cc_proto", +- "//modules/common_msgs/perception_msgs:perception_obstacle_cc_proto", +- "//modules/common_msgs/perception_msgs:traffic_light_detection_cc_proto", +- "//modules/common_msgs/planning_msgs:decision_cc_proto", +- "//modules/common_msgs/planning_msgs:navigation_cc_proto", +- "//modules/common_msgs/planning_msgs:pad_msg_cc_proto", +- "//modules/common_msgs/planning_msgs:planning_internal_cc_proto", +- "//modules/common_msgs/planning_msgs:planning_cc_proto", +- "//modules/common_msgs/planning_msgs:scenario_type_cc_proto", +- "//modules/common_msgs/planning_msgs:sl_boundary_cc_proto", +- "//modules/common_msgs/prediction_msgs:feature_cc_proto", +- "//modules/common_msgs/prediction_msgs:lane_graph_cc_proto", +- "//modules/common_msgs/prediction_msgs:prediction_obstacle_cc_proto", +- "//modules/common_msgs/prediction_msgs:prediction_point_cc_proto", +- "//modules/common_msgs/prediction_msgs:scenario_cc_proto", +- "//modules/common_msgs/routing_msgs:poi_cc_proto", +- "//modules/common_msgs/routing_msgs:routing_cc_proto", +- "//modules/common_msgs/sensor_msgs:conti_radar_cc_proto", +- "//modules/common_msgs/sensor_msgs:delphi_esr_cc_proto", +- "//modules/common_msgs/sensor_msgs:gnss_best_pose_cc_proto", +- "//modules/common_msgs/sensor_msgs:gnss_raw_observation_cc_proto", +- "//modules/common_msgs/sensor_msgs:gnss_cc_proto", +- "//modules/common_msgs/sensor_msgs:heading_cc_proto", +- "//modules/common_msgs/sensor_msgs:imu_cc_proto", +- "//modules/common_msgs/sensor_msgs:ins_cc_proto", +- "//modules/common_msgs/sensor_msgs:mobileye_cc_proto", +- "//modules/common_msgs/sensor_msgs:pointcloud_cc_proto", +- "//modules/common_msgs/sensor_msgs:racobit_radar_cc_proto", +- "//modules/common_msgs/sensor_msgs:radar_cc_proto", +- "//modules/common_msgs/sensor_msgs:sensor_image_cc_proto", +- "//modules/common_msgs/sensor_msgs:smartereye_cc_proto", +- "//modules/common_msgs/sensor_msgs:ultrasonic_radar_cc_proto", +- "//modules/common_msgs/storytelling_msgs:story_cc_proto", +- "//modules/common_msgs/task_manager_msgs:task_manager_cc_proto", +- "//modules/common_msgs/transform_msgs:transform_cc_proto", +- "//modules/common_msgs/v2x_msgs:v2x_traffic_light_cc_proto", +- "//modules/common_msgs/monitor_msgs:monitor_log_cc_proto", +- "//modules/common_msgs/config_msgs:vehicle_config_cc_proto", +- ], +- deps = [":pb_py"] +-) +- +-install_src_files( +- name = "install_src", +- src_dir = ["."], +- dest = "common-msgs/src", +- filter = "*", +-) +- +-install_files( +- name = "pb_py", +- dest = "common-msgs/python/modules/common_msgs", +- files = [ +- "//modules/common_msgs/audio_msgs:audio_common_py_pb2", +- "//modules/common_msgs/audio_msgs:audio_event_py_pb2", +- "//modules/common_msgs/audio_msgs:audio_py_pb2", +- "//modules/common_msgs/chassis_msgs:chassis_detail_py_pb2", +- "//modules/common_msgs/chassis_msgs:chassis_py_pb2", +- "//modules/common_msgs/config_msgs:vehicle_config_py_pb2", +- "//modules/common_msgs/control_msgs:control_cmd_py_pb2", +- "//modules/common_msgs/control_msgs:input_debug_py_pb2", +- "//modules/common_msgs/control_msgs:pad_msg_py_pb2", +- "//modules/common_msgs/dreamview_msgs:chart_py_pb2", +- "//modules/common_msgs/dreamview_msgs:hmi_status_py_pb2", +- "//modules/common_msgs/drivers_msgs:can_card_parameter_py_pb2", +- "//modules/common_msgs/guardian_msgs:guardian_py_pb2", +- "//modules/common_msgs/localization_msgs:gps_py_pb2", +- "//modules/common_msgs/localization_msgs:imu_py_pb2", +- "//modules/common_msgs/localization_msgs:localization_status_py_pb2", +- "//modules/common_msgs/localization_msgs:localization_py_pb2", +- "//modules/common_msgs/localization_msgs:pose_py_pb2", +- "//modules/common_msgs/map_msgs:map_clear_area_py_pb2", +- "//modules/common_msgs/map_msgs:map_crosswalk_py_pb2", +- "//modules/common_msgs/map_msgs:map_geometry_py_pb2", +- "//modules/common_msgs/map_msgs:map_id_py_pb2", +- "//modules/common_msgs/map_msgs:map_junction_py_pb2", +- "//modules/common_msgs/map_msgs:map_lane_py_pb2", +- "//modules/common_msgs/map_msgs:map_overlap_py_pb2", +- "//modules/common_msgs/map_msgs:map_parking_space_py_pb2", +- "//modules/common_msgs/map_msgs:map_pnc_junction_py_pb2", +- "//modules/common_msgs/map_msgs:map_road_py_pb2", +- "//modules/common_msgs/map_msgs:map_rsu_py_pb2", +- "//modules/common_msgs/map_msgs:map_signal_py_pb2", +- "//modules/common_msgs/map_msgs:map_speed_bump_py_pb2", +- "//modules/common_msgs/map_msgs:map_speed_control_py_pb2", +- "//modules/common_msgs/map_msgs:map_stop_sign_py_pb2", +- "//modules/common_msgs/map_msgs:map_yield_sign_py_pb2", +- "//modules/common_msgs/map_msgs:map_py_pb2", +- "//modules/common_msgs/monitor_msgs:monitor_log_py_pb2", +- "//modules/common_msgs/monitor_msgs:smart_recorder_status_py_pb2", +- "//modules/common_msgs/monitor_msgs:system_status_py_pb2", +- "//modules/common_msgs/perception_msgs:perception_camera_py_pb2", +- "//modules/common_msgs/perception_msgs:perception_lane_py_pb2", +- "//modules/common_msgs/perception_msgs:perception_obstacle_py_pb2", +- "//modules/common_msgs/perception_msgs:traffic_light_detection_py_pb2", +- "//modules/common_msgs/planning_msgs:decision_py_pb2", +- "//modules/common_msgs/planning_msgs:navigation_py_pb2", +- "//modules/common_msgs/planning_msgs:pad_msg_py_pb2", +- "//modules/common_msgs/planning_msgs:planning_internal_py_pb2", +- "//modules/common_msgs/planning_msgs:planning_py_pb2", +- "//modules/common_msgs/planning_msgs:scenario_type_py_pb2", +- "//modules/common_msgs/planning_msgs:sl_boundary_py_pb2", +- "//modules/common_msgs/prediction_msgs:feature_py_pb2", +- "//modules/common_msgs/prediction_msgs:lane_graph_py_pb2", +- "//modules/common_msgs/prediction_msgs:prediction_obstacle_py_pb2", +- "//modules/common_msgs/prediction_msgs:prediction_point_py_pb2", +- "//modules/common_msgs/prediction_msgs:scenario_py_pb2", +- "//modules/common_msgs/routing_msgs:poi_py_pb2", +- "//modules/common_msgs/routing_msgs:routing_py_pb2", +- "//modules/common_msgs/sensor_msgs:conti_radar_py_pb2", +- "//modules/common_msgs/sensor_msgs:delphi_esr_py_pb2", +- "//modules/common_msgs/sensor_msgs:gnss_best_pose_py_pb2", +- "//modules/common_msgs/sensor_msgs:gnss_raw_observation_py_pb2", +- "//modules/common_msgs/sensor_msgs:gnss_py_pb2", +- "//modules/common_msgs/sensor_msgs:heading_py_pb2", +- "//modules/common_msgs/sensor_msgs:imu_py_pb2", +- "//modules/common_msgs/sensor_msgs:ins_py_pb2", +- "//modules/common_msgs/sensor_msgs:mobileye_py_pb2", +- "//modules/common_msgs/sensor_msgs:pointcloud_py_pb2", +- "//modules/common_msgs/sensor_msgs:racobit_radar_py_pb2", +- "//modules/common_msgs/sensor_msgs:radar_py_pb2", +- "//modules/common_msgs/sensor_msgs:sensor_image_py_pb2", +- "//modules/common_msgs/sensor_msgs:smartereye_py_pb2", +- "//modules/common_msgs/sensor_msgs:ultrasonic_radar_py_pb2", +- "//modules/common_msgs/simulation_msgs:agent_py_pb2", +- "//modules/common_msgs/simulation_msgs:grading_condition_py_pb2", +- "//modules/common_msgs/simulation_msgs:grading_metric_py_pb2", +- "//modules/common_msgs/simulation_msgs:scenario_py_pb2", +- "//modules/common_msgs/storytelling_msgs:story_py_pb2", +- "//modules/common_msgs/task_manager_msgs:task_manager_py_pb2", +- "//modules/common_msgs/transform_msgs:transform_py_pb2", +- "//modules/common_msgs/v2x_msgs:v2x_traffic_light_py_pb2", +- "//modules/common_msgs/basic_msgs:direction_py_pb2", +- "//modules/common_msgs/basic_msgs:drive_state_py_pb2", +- "//modules/common_msgs/basic_msgs:error_code_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- "//modules/common_msgs/basic_msgs:vehicle_signal_py_pb2", +- "//modules/common_msgs/basic_msgs:drive_event_py_pb2", +- "//modules/common_msgs/basic_msgs:vehicle_id_py_pb2", +- ], +-) ++apollo_package() +diff --color -Naur common_msgs/README.md /opt/apollo/modules/common_msgs/README.md +--- common_msgs/README.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/README.md 2023-12-23 18:05:58.947028975 +0800 +@@ -0,0 +1,36 @@ ++# common-msgs ++ ++## Introduction ++This package includes all the message definitions that need to be transmitted in the channel. ++ ++## Directory Structure ++```shell ++modules/common_msgs/ ++├── audio_msgs // Message definitions of audio ++├── basic_msgs // Common message definitions ++├── BUILD ++├── chassis_msgs // Message definitions of chassis ++├── config_msgs // Message definitions of config in multiple modules ++├── control_msgs // Message definitions of control ++├── cyberfile.xml ++├── dreamview_msgs // Message definitions of dreamview ++├── drivers_msgs // Message definitions of drivers component ++├── external_command_msgs // Message definitions of external_command ++├── guardian_msgs // Message definitions of guardian_msgs ++├── localization_msgs // Message definitions of localization ++├── map_msgs // Message definitions of map ++├── monitor_msgs // Message definitions of monitor ++├── perception_msgs // Message definitions of perception ++├── planning_msgs // Message definitions of planning ++├── prediction_msgs // Message definitions of prediction ++├── README.md ++├── routing_msgs // Message definitions of routing ++├── sensor_msgs // Message definitions of multiple sensors ++├── simulation_msgs // Message definitions for simulation ++├── storytelling_msgs // Message definitions of storytelling ++├── task_manager_msgs // Message definitions of task-manager ++├── transform_msgs // Message definitions of transform ++└── v2x_msgs // Message definitions of v2x ++``` ++ ++ +diff --color -Naur common_msgs/audio_msgs/BUILD /opt/apollo/modules/common_msgs/audio_msgs/BUILD +--- common_msgs/audio_msgs/BUILD 2023-12-23 18:21:36.391614905 +0800 ++++ /opt/apollo/modules/common_msgs/audio_msgs/BUILD 2023-12-23 18:05:58.947028975 +0800 +@@ -1,42 +1,12 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "audio_cc_proto", +- deps = [ +- ":audio_proto", +- ], +-) +- + proto_library( +- name = "audio_proto", +- srcs = ["audio.proto"], +- deps = [ +- ":audio_common_proto", +- "//modules/common_msgs/basic_msgs:geometry_proto", +- "//modules/common_msgs/basic_msgs:header_proto", +- ], +-) +- +-py_proto_library( +- name = "audio_py_pb2", +- deps = [ +- ":audio_proto", +- ":audio_common_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "audio_event_cc_proto", +- deps = [ +- ":audio_event_proto", +- ], ++ name = "audio_common_proto", ++ srcs = ["audio_common.proto"], + ) + + proto_library( +@@ -49,31 +19,14 @@ + ], + ) + +-py_proto_library( +- name = "audio_event_py_pb2", +- deps = [ +- ":audio_event_proto", +- ":audio_common_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/localization_msgs:pose_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "audio_common_cc_proto", +- deps = [ +- ":audio_common_proto", +- ], +-) +- + proto_library( +- name = "audio_common_proto", +- srcs = ["audio_common.proto"], +-) +- +-py_proto_library( +- name = "audio_common_py_pb2", ++ name = "audio_proto", ++ srcs = ["audio.proto"], + deps = [ + ":audio_common_proto", ++ "//modules/common_msgs/basic_msgs:geometry_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) ++ ++apollo_package() +diff --color -Naur common_msgs/basic_msgs/BUILD /opt/apollo/modules/common_msgs/basic_msgs/BUILD +--- common_msgs/basic_msgs/BUILD 2023-12-23 18:21:36.391614905 +0800 ++++ /opt/apollo/modules/common_msgs/basic_msgs/BUILD 2023-12-23 18:05:58.947028975 +0800 +@@ -1,76 +1,9 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "header_cc_proto", +- deps = [ +- ":header_proto", +- ], +-) +- +-proto_library( +- name = "header_proto", +- srcs = ["header.proto"], +- deps = [ +- ":error_code_proto", +- ], +-) +- +-py_proto_library( +- name = "header_py_pb2", +- deps = [ +- ":header_proto", +- ":error_code_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "vehicle_id_cc_proto", +- deps = [ +- ":vehicle_id_proto", +- ], +-) +- +-proto_library( +- name = "vehicle_id_proto", +- srcs = ["vehicle_id.proto"], +-) +- +-py_proto_library( +- name = "vehicle_id_py_pb2", +- deps = [ +- ":vehicle_id_proto", +- ], +-) +-cc_proto_library( +- name = "direction_cc_proto", +- deps = [ +- ":direction_proto", +- ], +-) +- +-proto_library( +- name = "direction_proto", +- srcs = ["direction.proto"], +-) +- +-py_proto_library( +- name = "direction_py_pb2", +- deps = [ +- ":direction_proto", +- ], +-) +-cc_proto_library( +- name = "drive_event_cc_proto", +- deps = [ +- ":drive_event_proto", +- ], +-) +- + proto_library( + name = "drive_event_proto", + srcs = ["drive_event.proto"], +@@ -80,56 +13,32 @@ + ], + ) + +-py_proto_library( +- name = "drive_event_py_pb2", +- deps = [ +- ":drive_event_proto", +- ":header_py_pb2", +- "//modules/common_msgs/localization_msgs:pose_py_pb2", +- ], ++proto_library( ++ name = "vehicle_signal_proto", ++ srcs = ["vehicle_signal.proto"], + ) + +-cc_proto_library( +- name = "geometry_cc_proto", +- deps = [ +- ":geometry_proto", +- ], ++proto_library( ++ name = "error_code_proto", ++ srcs = ["error_code.proto"], + ) + + proto_library( +- name = "geometry_proto", +- srcs = ["geometry.proto"], ++ name = "drive_state_proto", ++ srcs = ["drive_state.proto"], + ) + +-py_proto_library( +- name = "geometry_py_pb2", +- deps = [ +- ":geometry_proto", +- ], +-) +-cc_proto_library( +- name = "vehicle_signal_cc_proto", ++proto_library( ++ name = "header_proto", ++ srcs = ["header.proto"], + deps = [ +- ":vehicle_signal_proto", ++ ":error_code_proto", + ], + ) + + proto_library( +- name = "vehicle_signal_proto", +- srcs = ["vehicle_signal.proto"], +-) +- +-py_proto_library( +- name = "vehicle_signal_py_pb2", +- deps = [ +- ":vehicle_signal_proto", +- ], +-) +-cc_proto_library( +- name = "pnc_point_cc_proto", +- deps = [ +- ":pnc_point_proto", +- ], ++ name = "direction_proto", ++ srcs = ["direction.proto"], + ) + + proto_library( +@@ -137,45 +46,14 @@ + srcs = ["pnc_point.proto"], + ) + +-py_proto_library( +- name = "pnc_point_py_pb2", +- deps = [ +- ":pnc_point_proto", +- ], +-) +-cc_proto_library( +- name = "drive_state_cc_proto", +- deps = [ +- ":drive_state_proto", +- ], +-) +- + proto_library( +- name = "drive_state_proto", +- srcs = ["drive_state.proto"], +-) +- +-py_proto_library( +- name = "drive_state_py_pb2", +- deps = [ +- ":drive_state_proto", +- ], +-) +-cc_proto_library( +- name = "error_code_cc_proto", +- deps = [ +- ":error_code_proto", +- ], ++ name = "geometry_proto", ++ srcs = ["geometry.proto"], + ) + + proto_library( +- name = "error_code_proto", +- srcs = ["error_code.proto"], ++ name = "vehicle_id_proto", ++ srcs = ["vehicle_id.proto"], + ) + +-py_proto_library( +- name = "error_code_py_pb2", +- deps = [ +- ":error_code_proto", +- ], +-) ++apollo_package() +diff --color -Naur common_msgs/chassis_msgs/BUILD /opt/apollo/modules/common_msgs/chassis_msgs/BUILD +--- common_msgs/chassis_msgs/BUILD 2023-12-23 18:21:36.394614905 +0800 ++++ /opt/apollo/modules/common_msgs/chassis_msgs/BUILD 2023-12-23 18:05:58.947028975 +0800 +@@ -1,14 +1,15 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "chassis_cc_proto", ++proto_library( ++ name = "chassis_detail_proto", ++ srcs = ["chassis_detail.proto"], + deps = [ + ":chassis_proto", ++ "//modules/common_msgs/basic_msgs:vehicle_id_proto", + ], + ) + +@@ -21,42 +22,8 @@ + "//modules/common_msgs/basic_msgs:header_proto", + "//modules/common_msgs/basic_msgs:vehicle_id_proto", + "//modules/common_msgs/basic_msgs:vehicle_signal_proto", ++ "@com_google_protobuf//:any_proto", + ], + ) + +-py_proto_library( +- name = "chassis_py_pb2", +- deps = [ +- ":chassis_proto", +- "//modules/common_msgs/basic_msgs:drive_state_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:vehicle_id_py_pb2", +- "//modules/common_msgs/basic_msgs:vehicle_signal_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "chassis_detail_cc_proto", +- deps = [ +- ":chassis_detail_proto", +- ], +-) +- +-proto_library( +- name = "chassis_detail_proto", +- srcs = ["chassis_detail.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:vehicle_id_proto", +- ":chassis_proto", +- ], +-) +- +-py_proto_library( +- name = "chassis_detail_py_pb2", +- deps = [ +- ":chassis_detail_proto", +- "//modules/common_msgs/basic_msgs:vehicle_id_py_pb2", +- ":chassis_py_pb2", +- ], +-) +\ No newline at end of file ++apollo_package() +diff --color -Naur common_msgs/chassis_msgs/chassis.proto /opt/apollo/modules/common_msgs/chassis_msgs/chassis.proto +--- common_msgs/chassis_msgs/chassis.proto 2023-12-23 18:21:36.394614905 +0800 ++++ /opt/apollo/modules/common_msgs/chassis_msgs/chassis.proto 2023-12-23 18:05:58.947028975 +0800 +@@ -2,6 +2,7 @@ + + package apollo.canbus; + ++import "google/protobuf/any.proto"; + import "modules/common_msgs/basic_msgs/drive_state.proto"; + import "modules/common_msgs/basic_msgs/geometry.proto"; + import "modules/common_msgs/basic_msgs/header.proto"; +@@ -151,6 +152,9 @@ + optional BumperEvent back_bumper_event = 39; + + optional CheckResponse check_response = 40; ++ ++ // Custom chassis operation command defined by user for extensibility. ++ optional google.protobuf.Any custom_status = 41; + } + + message ChassisGPS { +diff --color -Naur common_msgs/config_msgs/BUILD /opt/apollo/modules/common_msgs/config_msgs/BUILD +--- common_msgs/config_msgs/BUILD 2023-12-23 18:21:36.396614904 +0800 ++++ /opt/apollo/modules/common_msgs/config_msgs/BUILD 2023-12-23 18:05:58.947028975 +0800 +@@ -1,34 +1,17 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "vehicle_config_cc_proto", +- deps = [ +- ":vehicle_config_proto", +- ], +-) +- + proto_library( + name = "vehicle_config_proto", + srcs = ["vehicle_config.proto"], + deps = [ +- "//modules/common_msgs/basic_msgs:header_proto", + "//modules/common_msgs/basic_msgs:geometry_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", + "//modules/common_msgs/basic_msgs:vehicle_id_proto", + ], + ) + +-py_proto_library( +- name = "vehicle_config_py_pb2", +- deps = [ +- ":vehicle_config_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:vehicle_id_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/control_msgs/BUILD /opt/apollo/modules/common_msgs/control_msgs/BUILD +--- common_msgs/control_msgs/BUILD 2023-12-23 18:21:36.396614904 +0800 ++++ /opt/apollo/modules/common_msgs/control_msgs/BUILD 2023-12-23 18:05:58.948028975 +0800 +@@ -1,74 +1,29 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "control_cmd_cc_proto", +- deps = [ +- ":control_cmd_proto", +- ], +-) +- + proto_library( + name = "control_cmd_proto", + srcs = ["control_cmd.proto"], + deps = [ ++ ":input_debug_proto", ++ ":control_pad_msg_proto", + "//modules/common_msgs/basic_msgs:drive_state_proto", + "//modules/common_msgs/basic_msgs:header_proto", + "//modules/common_msgs/basic_msgs:pnc_point_proto", + "//modules/common_msgs/basic_msgs:vehicle_signal_proto", + "//modules/common_msgs/chassis_msgs:chassis_proto", +- ":input_debug_proto", +- ":pad_msg_proto", +- ], +-) +- +-py_proto_library( +- name = "control_cmd_py_pb2", +- deps = [ +- ":control_cmd_proto", +- "//modules/common_msgs/basic_msgs:drive_state_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- "//modules/common_msgs/basic_msgs:vehicle_signal_py_pb2", +- "//modules/common_msgs/chassis_msgs:chassis_py_pb2", +- ":input_debug_py_pb2", +- ":pad_msg_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "pad_msg_cc_proto", +- deps = [ +- ":pad_msg_proto", ++ "@com_google_protobuf//:any_proto" + ], + ) + + proto_library( +- name = "pad_msg_proto", ++ name = "control_pad_msg_proto", + srcs = ["pad_msg.proto"], + deps = [ + "//modules/common_msgs/basic_msgs:header_proto", +- "//modules/common_msgs/chassis_msgs:chassis_proto", +- ], +-) +- +-py_proto_library( +- name = "pad_msg_py_pb2", +- deps = [ +- ":pad_msg_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/chassis_msgs:chassis_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "input_debug_cc_proto", +- deps = [ +- ":input_debug_proto", + ], + ) + +@@ -80,11 +35,4 @@ + ], + ) + +-py_proto_library( +- name = "input_debug_py_pb2", +- deps = [ +- ":input_debug_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/control_msgs/control_cmd.proto /opt/apollo/modules/common_msgs/control_msgs/control_cmd.proto +--- common_msgs/control_msgs/control_cmd.proto 2023-12-23 18:21:36.396614904 +0800 ++++ /opt/apollo/modules/common_msgs/control_msgs/control_cmd.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -1,6 +1,7 @@ + syntax = "proto2"; + package apollo.control; + ++import "google/protobuf/any.proto"; + import "modules/common_msgs/basic_msgs/drive_state.proto"; + import "modules/common_msgs/basic_msgs/header.proto"; + import "modules/common_msgs/basic_msgs/pnc_point.proto"; +@@ -108,6 +109,13 @@ + optional apollo.common.TrajectoryPoint current_reference_point = 33; + optional apollo.common.TrajectoryPoint preview_reference_point = 34; + optional double acceleration_lookup_limit = 35; ++ optional double vehicle_pitch = 36; ++ optional bool is_epb_brake = 37; ++ optional double current_steer_interval = 38; ++ optional bool is_wait_steer = 39; ++ optional bool is_stop_reason_by_destination = 40; ++ optional bool is_stop_reason_by_prdestrian = 41; ++ optional bool is_full_stop_soft = 42; + } + + message SimpleLateralDebug { +@@ -226,6 +234,25 @@ + optional double jerk_reference = 47; + optional double jerk_feedback = 48; + optional double jerk_error = 49; ++ ++ // modified lateral_error and heading_error with look-ahead or look-back ++ // station, as the feedback term for control usage ++ optional double lateral_error_feedback = 50; ++ optional double heading_error_feedback = 51; ++ // Augmented feedback control term in addition to MPC control ++ optional double steer_angle_feedback_augment = 52; ++ optional apollo.common.TrajectoryPoint current_matched_point = 53; ++ optional apollo.common.TrajectoryPoint current_reference_point = 54; ++ optional apollo.common.TrajectoryPoint preview_reference_point = 55; ++ optional double preview_station_error = 56; ++ optional double preview_speed_reference = 57; ++ optional double preview_speed_error = 58; ++ optional double preview_acceleration_reference = 59; ++ optional double vehicle_pitch = 60; ++ optional double slope_offset_compensation = 61; ++ optional double path_remain = 62; ++ optional double acceleration_lookup_offset = 63; ++ optional double acceleration_vrf = 64; + } + + message MracDebug { +diff --color -Naur common_msgs/control_msgs/pad_msg.proto /opt/apollo/modules/common_msgs/control_msgs/pad_msg.proto +--- common_msgs/control_msgs/pad_msg.proto 2023-12-23 18:21:36.396614904 +0800 ++++ /opt/apollo/modules/common_msgs/control_msgs/pad_msg.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -2,10 +2,8 @@ + package apollo.control; + + import "modules/common_msgs/basic_msgs/header.proto"; +-import "modules/common_msgs/chassis_msgs/chassis.proto"; + + enum DrivingAction { +- STOP = 0; + START = 1; + RESET = 2; + VIN_REQ = 3; +@@ -15,9 +13,6 @@ + // control mode, set mode according to low level definition + optional apollo.common.Header header = 1; + +- // send driving mode to drive +- optional apollo.canbus.Chassis.DrivingMode driving_mode = 2; +- + // action in the driving_mode +- optional DrivingAction action = 3; ++ optional DrivingAction action = 2; + } +diff --color -Naur common_msgs/cyberfile.xml /opt/apollo/modules/common_msgs/cyberfile.xml +--- common_msgs/cyberfile.xml 2023-12-23 18:21:36.397614904 +0800 ++++ /opt/apollo/modules/common_msgs/cyberfile.xml 2023-12-23 18:05:58.948028975 +0800 +@@ -4,22 +4,24 @@ + + This module contains code that is not specific to any module but is useful for the functioning of Apollo. + +- ++ + Apollo + Apache License 2.0 + https://www.apollo.auto/ + https://github.com/ApolloAuto/apollo + https://github.com/ApolloAuto/apollo/issues + +- module-wrapper ++ module + //modules/common_msgs + +- 3rd-rules-python-dev +- 3rd-grpc-dev +- 3rd-gpus-dev +- 3rd-rules-proto-dev +- 3rd-bazel-skylib-dev +- +- 3rd-protobuf-dev ++ 3rd-rules-python ++ 3rd-grpc ++ 3rd-gpus ++ 3rd-rules-proto ++ 3rd-py ++ bazel-extend-tools ++ 3rd-bazel-skylib ++ ++ 3rd-protobuf + + +diff --color -Naur common_msgs/dreamview_msgs/BUILD /opt/apollo/modules/common_msgs/dreamview_msgs/BUILD +--- common_msgs/dreamview_msgs/BUILD 2023-12-23 18:21:36.397614904 +0800 ++++ /opt/apollo/modules/common_msgs/dreamview_msgs/BUILD 2023-12-23 18:05:58.948028975 +0800 +@@ -1,17 +1,9 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "chart_cc_proto", +- deps = [ +- ":chart_proto", +- ], +-) +- + proto_library( + name = "chart_proto", + srcs = ["chart.proto"], +@@ -20,37 +12,42 @@ + ], + ) + +-py_proto_library( +- name = "chart_py_pb2", ++proto_library( ++ name = "hmi_status_proto", ++ srcs = ["hmi_status.proto"], + deps = [ +- ":chart_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", ++ "//modules/common_msgs/basic_msgs:geometry_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", ++ "//modules/common_msgs/monitor_msgs:system_status_proto", + ], + ) + +-cc_proto_library( +- name = "hmi_status_cc_proto", ++proto_library( ++ name = "hmi_mode_proto", ++ srcs = ["hmi_mode.proto"], + deps = [ +- ":hmi_status_proto", ++ "//modules/common_msgs/dreamview_msgs:hmi_status_proto" + ], + ) + + proto_library( +- name = "hmi_status_proto", +- srcs = ["hmi_status.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:header_proto", +- "//modules/common_msgs/monitor_msgs:system_status_proto", +- "//modules/common_msgs/basic_msgs:geometry_proto", +- ], ++ name = "hmi_config_proto", ++ srcs = ["hmi_config.proto"], + ) + +-py_proto_library( +- name = "hmi_status_py_pb2", ++proto_library( ++ name = "simulation_world_proto", ++ srcs = ["simulation_world.proto"], + deps = [ +- ":hmi_status_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/monitor_msgs:system_status_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", ++ "//modules/common_msgs/chassis_msgs:chassis_proto", ++ "//modules/common_msgs/monitor_msgs:monitor_log_proto", ++ "//modules/common_msgs/basic_msgs:pnc_point_proto", ++ "//modules/common_msgs/perception_msgs:perception_obstacle_proto", ++ "//modules/common_msgs/planning_msgs:planning_internal_proto", ++ "//modules/common_msgs/prediction_msgs:feature_proto", ++ "//modules/common_msgs/routing_msgs:routing_geometry_proto", ++ "//modules/common_msgs/config_msgs:vehicle_config_proto", + ], + ) ++ ++apollo_package() +diff --color -Naur common_msgs/dreamview_msgs/hmi_config.proto /opt/apollo/modules/common_msgs/dreamview_msgs/hmi_config.proto +--- common_msgs/dreamview_msgs/hmi_config.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/dreamview_msgs/hmi_config.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,56 @@ ++syntax = "proto2"; ++ ++package apollo.dreamview; ++ ++enum HMIAction { ++ // Simple HMI action without any parameter. ++ NONE = 0; ++ SETUP_MODE = 1; // Setup current mode. ++ RESET_MODE = 2; // Reset current mode. ++ ENTER_AUTO_MODE = 3; // Enter into auto driving mode. ++ DISENGAGE = 4; // Disengage from auto driving mode. ++ ++ // HMI action with a value string parameter. ++ CHANGE_MODE = 5; // value = mode_name ++ CHANGE_MAP = 6; // value = map_name ++ CHANGE_VEHICLE = 7; // value = vehicle_name ++ START_MODULE = 8; // value = module_name ++ STOP_MODULE = 9; // value = module_name ++ CHANGE_SCENARIO = 10; // value = scenario_id ++ CHANGE_SCENARIO_SET = 11; // value = scenario_set_id ++ LOAD_SCENARIOS = 12; // 加载全部scenarios ++ DELETE_SCENARIO_SET = 13; // value = scenario_set_id ++ LOAD_DYNAMIC_MODELS = 14; // 加载全部动力学模型 ++ CHANGE_DYNAMIC_MODEL = 15; // 切换动力学模型 value = dynamic_model_name ++ DELETE_DYNAMIC_MODEL = 16; // 删除动力学模型 value = dynamic_model_name ++ CHANGE_RECORD = 17; //value = record_id ++ DELETE_RECORD = 18; //value = record_id ++ LOAD_RECORDS = 19; // Load all records ++ STOP_RECORD = 20; //value = module_name ++ CHANGE_OPERATION = 21; //value = operation_name ++ DELETE_VEHICLE_CONF = 22; // Delete the parameters of a vehicle. ++ DELETE_V2X_CONF = 23; // Delete the parameters of a v2x. ++ DELETE_MAP = 24; // Delete map that value = map_name ++ LOAD_RTK_RECORDS = 25; // Load all rtk records ++ CHANGE_RTK_RECORD = 26; // change rtk records ++ LOAD_RECORD = 27; // Load record ++} ++ ++message HMIConfig { ++ map modes = 1; // {mode_name: mode_path} ++ map maps = 2; // {map_name: map_path} ++ map vehicles = 3; // {vehicle_name: vehicle_path} ++} ++ ++message VehicleData { ++ // Upon switching vehicle, we need to copy source data to the dest path to ++ // make it in effect. ++ message DataFile { ++ // Source path is a path relative to the vehicle data directory. ++ optional string source_path = 1; ++ // Dest path is where the data file could become in effect. ++ optional string dest_path = 2; ++ } ++ repeated DataFile data_files = 1; ++} ++ +diff --color -Naur common_msgs/dreamview_msgs/hmi_mode.proto /opt/apollo/modules/common_msgs/dreamview_msgs/hmi_mode.proto +--- common_msgs/dreamview_msgs/hmi_mode.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/dreamview_msgs/hmi_mode.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,130 @@ ++syntax = "proto2"; ++ ++package apollo.dreamview; ++ ++// This proto defines a mode showing in Dreamview, including how you will ++// display them and monitor their status. ++ ++import "modules/common_msgs/dreamview_msgs/hmi_status.proto"; ++ ++// For ProcessMonitor. ++message ProcessMonitorConfig { ++ repeated string command_keywords = 1; ++} ++ ++// For ModuleMonitor ++message ModuleMonitorConfig { ++ repeated string node_name = 1; ++} ++ ++// For ChannelMonitor. ++message ChannelMonitorConfig { ++ optional string name = 1; ++ optional double delay_fatal = 2 [default = 3.0]; // In seconds. ++ ++ // The fields will be checked to make sure they are existing ++ // Specify in the format of "a.b.c" ++ repeated string mandatory_fields = 3; ++ ++ // Minimum and maximum frequency allowed for this channel ++ optional double min_frequency_allowed = 4 [default = 0.0]; ++ optional double max_frequency_allowed = 5 [default = 1000.0]; ++} ++ ++// For ResourceMonitor. ++message ResourceMonitorConfig { ++ message DiskSpace { ++ // Path to monitor space. Support wildcards like ? and *. ++ // If the path does't exist, raise UNKNWON which will be ignored. ++ optional string path = 1; ++ optional int32 insufficient_space_warning = 2; // In GB. ++ optional int32 insufficient_space_error = 3; ++ } ++ ++ message CPUUsage { ++ optional float high_cpu_usage_warning = 1; ++ optional float high_cpu_usage_error = 2; ++ // The process's dag path, if not set it will check the system's overall CPU ++ // usage ++ optional string process_dag_path = 3; ++ } ++ ++ message MemoryUsage { ++ optional int32 high_memory_usage_warning = 1; ++ optional int32 high_memory_usage_error = 2; ++ // The process's dag path, if not set it will check the system's overall ++ // memory usage ++ optional string process_dag_path = 3; ++ } ++ ++ message DiskLoad { ++ optional int32 high_disk_load_warning = 1; ++ optional int32 high_disk_load_error = 2; ++ // Disk device name, such as sda, sdb and etc ++ optional string device_name = 3; ++ } ++ ++ repeated DiskSpace disk_spaces = 1; ++ repeated CPUUsage cpu_usages = 2; ++ repeated MemoryUsage memory_usages = 3; ++ repeated DiskLoad disk_load_usages = 4; ++} ++ ++// A monitored component will be listed on HMI which only shows its status but ++// user cannot operate. ++// The whole config will generate SystemStatus.components[i].summary by Monitor ++// module, which is generally the most severe one of process, channel or ++// resource status. ++message MonitoredComponent { ++ // Generate SystemStatus.components[i].process_status. ++ // OK if the process is running. ++ // FATAL if the process is down. ++ optional ProcessMonitorConfig process = 1; ++ ++ // Generate SystemStatus.components[i].channel_status. ++ // OK if delay is not notable. ++ // FATAL if delay is larger than fatal_delay. ++ optional ChannelMonitorConfig channel = 2; ++ ++ // Generate SystemStatus.components[i].resource_status. ++ // OK if all requirements are met. ++ // WARN/ERROR/FATAL if any requirement is below expectation. ++ optional ResourceMonitorConfig resource = 3; ++ ++ // Whether to trigger safe-mode if the component is down. ++ optional bool required_for_safety = 4 [default = true]; ++ ++ // Generate SystemStatus.components[i].module_status. ++ // OK if the module is running. ++ // FATAL if the module is down. ++ optional ModuleMonitorConfig module = 5; ++} ++ ++// A module which can be started and stopped by HMI. ++message Module { ++ optional string start_command = 1; ++ optional string stop_command = 2; ++ ++ // We use the config in ProcessMonitor to check if the module is running. ++ optional ProcessMonitorConfig process_monitor_config = 3; ++ // Whether to trigger safe-mode if the module is down. ++ optional bool required_for_safety = 4 [default = true]; ++} ++ ++// A CyberModule will be translated to a regular Module upon loading. ++message CyberModule { ++ repeated string dag_files = 1; ++ optional bool required_for_safety = 2 [default = true]; ++ optional string process_group = 3; ++} ++ ++message HMIMode { ++ map cyber_modules = 1; ++ map modules = 2; ++ map monitored_components = 3; ++ map other_components = 4; ++ repeated HMIModeOperation operations = 5; ++ optional HMIModeOperation default_operation = 6; ++ optional string layout = 7; ++ map global_components = 8; ++} +diff --color -Naur common_msgs/dreamview_msgs/hmi_status.proto /opt/apollo/modules/common_msgs/dreamview_msgs/hmi_status.proto +--- common_msgs/dreamview_msgs/hmi_status.proto 2023-12-23 18:21:36.397614904 +0800 ++++ /opt/apollo/modules/common_msgs/dreamview_msgs/hmi_status.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -6,19 +6,69 @@ + import "modules/common_msgs/monitor_msgs/system_status.proto"; + import "modules/common_msgs/basic_msgs/geometry.proto"; + ++ + message ScenarioInfo { + optional string scenario_id = 1; + optional string scenario_name = 2; + optional string map_name = 3; + optional apollo.common.Point2D start_point = 4; ++ optional apollo.common.Point2D end_point = 5; + } + + message ScenarioSet { +- // id 是key ++ // id is key + optional string scenario_set_name = 1; + repeated ScenarioInfo scenarios = 2; + } + ++enum PlayRecordStatus{ ++ // action:play continue ++ RUNNING = 0; ++ // action: pause ++ PAUSED = 1; ++ // action: default kill ++ CLOSED = 2; ++} ++ ++message RecordStatus{ ++ optional string current_record_id = 1 [default = ""]; ++ optional PlayRecordStatus play_record_status = 2 [default = CLOSED]; ++ optional double curr_time_s = 4 [default = 0]; ++} ++ ++enum HMIModeOperation { ++ // None ++ None = 0; ++ // 仿真调试 ++ SIM_DEBUG = 1; ++ // 自由仿真 ++ Sim_Control = 2; ++ // 实车自动驾驶 ++ Auto_Drive=3; ++ // 循迹 ++ TRACE=4; ++ // 场景仿真 ++ Scenario_Sim = 5; ++ // 播包 ++ Record = 6; ++ // 循迹 ++ Waypoint_Follow=7; ++} ++ ++enum LoadRecordStatus { ++ NOT_LOAD = 1; ++ LOADING = 2; ++ LOADED = 3; ++} ++ ++message LoadRecordInfo{ ++ optional LoadRecordStatus load_record_status = 1 [default = NOT_LOAD]; ++ optional double total_time_s = 2 [default = 0]; ++ optional string record_file_path = 3 [default = ""]; ++ // Compatible with dv download scenario use plugin,only dv use it. ++ optional int32 download_status = 4 [default = 0]; ++} ++ + message HMIStatus { + optional apollo.common.Header header = 1; + +@@ -49,9 +99,31 @@ + optional string current_scenario_id = 17 [default = ""]; + repeated string dynamic_models = 18; + optional string current_dynamic_model = 19; ++ // for dreamview(1.0 version) + optional string current_record_id = 20 [default = ""]; +- map records = 21; ++ // for dv1.0: map value no used,is also equals to empty object ++ // for dv2.0: map value equals to loadrecordinfo object which includes ++ // record total time(s),load record status and record file path ++ map records = 21; + optional sint32 current_vehicle_type = 22; + optional string current_camera_sensor_channel = 23; + optional string current_point_cloud_channel = 24; ++ ++ // dv2.0: add operation concept ++ // operations is related to hmiMode ++ repeated HMIModeOperation operations = 25; ++ optional HMIModeOperation current_operation = 26; ++ optional string current_layout = 27; ++ optional RecordStatus current_record_status = 28; ++ // Mark global component status. ++ map global_components = 29; ++ // Mark the expected number of modules to be opened ++ optional uint32 expected_modules = 30 [default = 0]; ++ ++ // {module_name: Used to identify whether the user clicks on the module} ++ map modules_lock = 31; ++ // Used to identify whether the backend triggers automatic shutdown. ++ optional bool backend_shutdown = 32 [default = false]; ++ repeated string rtk_records = 33; ++ optional string current_rtk_record_id = 34 [default = ""]; + } +diff --color -Naur common_msgs/dreamview_msgs/simulation_world.proto /opt/apollo/modules/common_msgs/dreamview_msgs/simulation_world.proto +--- common_msgs/dreamview_msgs/simulation_world.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/dreamview_msgs/simulation_world.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,303 @@ ++syntax = "proto2"; ++ ++package apollo.dreamview; ++ ++import "modules/common_msgs/chassis_msgs/chassis.proto"; ++import "modules/common_msgs/monitor_msgs/monitor_log.proto"; ++import "modules/common_msgs/basic_msgs/pnc_point.proto"; ++import "modules/common_msgs/perception_msgs/perception_obstacle.proto"; ++import "modules/common_msgs/planning_msgs/planning_internal.proto"; ++import "modules/common_msgs/prediction_msgs/feature.proto"; ++import "modules/common_msgs/routing_msgs/geometry.proto"; ++import "modules/common_msgs/config_msgs/vehicle_config.proto"; ++ ++// Next-id: 4 ++message PolygonPoint { ++ optional double x = 1; ++ optional double y = 2; ++ optional double z = 3 [default = 0.0]; ++ ++ // Gaussian probability information ++ optional apollo.common.GaussianInfo gaussian_info = 4; ++} ++ ++// Next-id: 3 ++message Prediction { ++ optional double probability = 1; ++ repeated PolygonPoint predicted_trajectory = 2; ++} ++ ++// Next-id: 13 ++message Decision { ++ enum Type { ++ IGNORE = 0; // Ignore the object ++ STOP = 1; // Stop at a distance from the object ++ NUDGE = 2; // Go around the object ++ YIELD = 3; // Go after the object ++ OVERTAKE = 4; // Go before the object ++ FOLLOW = 5; // Follow the object in the same lane ++ SIDEPASS = 6; // Pass the object in neighboring lane ++ } ++ optional Type type = 1 [default = IGNORE]; ++ ++ // Shape Info ++ // Can be used for corners of nudge region ++ repeated PolygonPoint polygon_point = 2; ++ ++ // Position Info ++ // Can be used for stop fence ++ optional double heading = 3; ++ optional double latitude = 4; ++ optional double longitude = 5; ++ optional double position_x = 6; ++ optional double position_y = 7; ++ optional double length = 8 [default = 2.8]; ++ optional double width = 9 [default = 1.4]; ++ optional double height = 10 [default = 1.8]; ++ ++ enum StopReasonCode { ++ STOP_REASON_HEAD_VEHICLE = 1; ++ STOP_REASON_DESTINATION = 2; ++ STOP_REASON_PEDESTRIAN = 3; ++ STOP_REASON_OBSTACLE = 4; ++ STOP_REASON_SIGNAL = 100; ++ STOP_REASON_STOP_SIGN = 101; ++ STOP_REASON_YIELD_SIGN = 102; ++ STOP_REASON_CLEAR_ZONE = 103; ++ STOP_REASON_CROSSWALK = 104; ++ STOP_REASON_EMERGENCY = 105; ++ STOP_REASON_NOT_READY = 106; ++ STOP_REASON_PULL_OVER = 107; ++ } ++ optional StopReasonCode stopReason = 11; ++ optional apollo.routing.ChangeLaneType change_lane_type = 12; ++} ++ ++// Next-id: 41 ++message Object { ++ // ID ++ optional string id = 1; // primary identifier for each object ++ ++ // Shape Info ++ repeated PolygonPoint polygon_point = 2; // corners of an object ++ ++ // Position Info ++ optional double heading = 3; ++ optional double latitude = 4; ++ optional double longitude = 5; ++ optional double position_x = 6; ++ optional double position_y = 7; ++ optional double length = 8 [default = 2.8]; ++ optional double width = 9 [default = 1.4]; ++ optional double height = 10 [default = 1.8]; ++ ++ // Motion Info ++ // For objects with motion info such as ADC. ++ optional double speed = 11; // in m/s, can be negative ++ optional double speed_acceleration = 12; // in m/s^2 ++ optional double speed_jerk = 13; ++ optional double spin = 14; ++ optional double spin_acceleration = 15; ++ optional double spin_jerk = 16; ++ optional double speed_heading = 17; ++ optional double kappa = 18; ++ optional double dkappa = 35; ++ ++ // Signal Info ++ // For objects with signals set and current signal such as Traffic Light, ++ // Stop Sign, and Vehicle Signal. ++ repeated string signal_set = 19; ++ optional string current_signal = 20; ++ ++ // Time Info ++ optional double timestamp_sec = 21; ++ ++ // Decision Info ++ repeated Decision decision = 22; ++ optional bool yielded_obstacle = 32 [default = false]; ++ ++ // Chassis Info ++ // For ADC ++ optional double throttle_percentage = 23; ++ optional double brake_percentage = 24; ++ optional double steering_percentage = 25; ++ optional double steering_angle = 26; ++ optional double steering_ratio = 27; ++ optional int32 battery_percentage = 38; ++ optional apollo.canbus.Chassis.GearPosition gear_location = 39; ++ enum DisengageType { ++ DISENGAGE_NONE = 0; ++ DISENGAGE_UNKNOWN = 1; ++ DISENGAGE_MANUAL = 2; ++ DISENGAGE_EMERGENCY = 3; ++ DISENGAGE_AUTO_STEER_ONLY = 4; ++ DISENGAGE_AUTO_SPEED_ONLY = 5; ++ DISENGAGE_CHASSIS_ERROR = 6; ++ }; ++ ++ optional DisengageType disengage_type = 28; ++ ++ enum Type { ++ UNKNOWN = 0; ++ UNKNOWN_MOVABLE = 1; ++ UNKNOWN_UNMOVABLE = 2; ++ PEDESTRIAN = 3; // pedestrian, usually determined by moving behavior. ++ BICYCLE = 4; // bike, motor bike. ++ VEHICLE = 5; // passenger car or truck. ++ VIRTUAL = 6; // virtual object created by decision module. ++ CIPV = 7; // closest in-path vehicle determined by perception module. ++ }; ++ ++ optional Type type = 29; // obstacle type ++ // obstacle sub-type ++ optional apollo.perception.PerceptionObstacle.SubType sub_type = 34; ++ repeated Prediction prediction = 30; ++ ++ // perception confidence level. Range: [0,1] ++ optional double confidence = 31 [default = 1]; ++ optional apollo.prediction.ObstaclePriority obstacle_priority = 33; ++ optional apollo.prediction.ObstacleInteractiveTag interactive_tag = 40; ++ ++ // v2x for perception obstacle ++ optional apollo.perception.PerceptionObstacle.Source source = 36 ++ [default = HOST_VEHICLE]; // source type ++ // v2x use case info ++ optional apollo.perception.V2XInformation v2x_info = 37; ++} ++ ++message DelaysInMs { ++ optional double chassis = 1; ++ optional double localization = 3; ++ optional double perception_obstacle = 4; ++ optional double planning = 5; ++ optional double prediction = 7; ++ optional double traffic_light = 8; ++ optional double control = 9; ++} ++ ++message RoutePath { ++ repeated PolygonPoint point = 1; ++} ++ ++message Latency { ++ optional double timestamp_sec = 1; ++ optional double total_time_ms = 2; ++} ++ ++message MapElementIds { ++ repeated string lane = 1; ++ repeated string crosswalk = 2; ++ repeated string junction = 3; ++ repeated string signal = 4; ++ repeated string stop_sign = 5; ++ repeated string yield = 6; ++ repeated string overlap = 7; ++ repeated string road = 8; ++ repeated string clear_area = 9; ++ repeated string parking_space = 10; ++ repeated string speed_bump = 11; ++ repeated string pnc_junction = 12; ++} ++ ++message ControlData { ++ optional double timestamp_sec = 1; ++ optional double station_error = 2; ++ optional double lateral_error = 3; ++ optional double heading_error = 4; ++ optional apollo.common.TrajectoryPoint current_target_point = 5; ++} ++ ++message Notification { ++ optional double timestamp_sec = 1; ++ optional apollo.common.monitor.MonitorMessageItem item = 2; ++} ++ ++message SensorMeasurements { ++ repeated Object sensor_measurement = 1; ++} ++ ++// Next-id: 31 ++message SimulationWorld { ++ // Timestamp in milliseconds ++ optional double timestamp = 1; ++ ++ // Sequence number ++ optional uint32 sequence_num = 2; ++ ++ // Objects in the world and the associated predictions/decisions ++ repeated Object object = 3; ++ ++ // Autonomous driving cars ++ optional Object auto_driving_car = 4; ++ ++ // Planning signal ++ optional Object traffic_signal = 5; ++ ++ // Routing paths ++ repeated RoutePath route_path = 6; ++ // Timestamp of latest routing ++ optional double routing_time = 7; ++ ++ // Planned trajectory ++ repeated Object planning_trajectory = 8; ++ ++ // Main decision ++ optional Object main_stop = 9 [deprecated = true]; ++ optional Object main_decision = 10; ++ ++ // Speed limit ++ optional double speed_limit = 11; ++ ++ // Module delays ++ optional DelaysInMs delay = 12; ++ ++ // Notification ++ optional apollo.common.monitor.MonitorMessage monitor = 13 ++ [deprecated = true]; ++ repeated Notification notification = 14; ++ ++ // Engage advice from planning ++ optional string engage_advice = 15; ++ ++ // Module latency ++ map latency = 16; ++ ++ optional MapElementIds map_element_ids = 17; ++ optional uint64 map_hash = 18; ++ optional double map_radius = 19; ++ ++ // Planning data ++ optional apollo.planning_internal.PlanningData planning_data = 20; ++ ++ // GPS ++ optional Object gps = 21; ++ ++ // Lane Markers from perception ++ optional apollo.perception.LaneMarkers lane_marker = 22; ++ ++ // Control data ++ optional ControlData control_data = 23; ++ ++ // Relative Map ++ repeated apollo.common.Path navigation_path = 24; ++ ++ // RSS info ++ optional bool is_rss_safe = 25 [default = true]; ++ ++ // Shadow localization ++ optional Object shadow_localization = 26; ++ ++ // Perception detected signals ++ repeated Object perceived_signal = 27; ++ ++ // A map from a story name to whether it is on ++ map stories = 28; ++ ++ // A map from a sensor_id to a group of sensor_measurements ++ map sensor_measurements = 29; ++ ++ optional bool is_siren_on = 30 [default = false]; ++ ++ // vehicle param ++ optional apollo.common.VehicleParam vehicle_param = 31; ++} +diff --color -Naur common_msgs/drivers_msgs/BUILD /opt/apollo/modules/common_msgs/drivers_msgs/BUILD +--- common_msgs/drivers_msgs/BUILD 2023-12-23 18:21:36.399614904 +0800 ++++ /opt/apollo/modules/common_msgs/drivers_msgs/BUILD 2023-12-23 18:05:58.948028975 +0800 +@@ -1,25 +1,12 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "can_card_parameter_cc_proto", +- deps = [ +- ":can_card_parameter_proto", +- ], +-) +- + proto_library( + name = "can_card_parameter_proto", + srcs = ["can_card_parameter.proto"], + ) + +-py_proto_library( +- name = "can_card_parameter_py_pb2", +- deps = [ +- ":can_card_parameter_proto", +- ], +-) ++apollo_package() +diff --color -Naur common_msgs/drivers_msgs/can_card_parameter.proto /opt/apollo/modules/common_msgs/drivers_msgs/can_card_parameter.proto +--- common_msgs/drivers_msgs/can_card_parameter.proto 2023-12-23 18:21:36.399614904 +0800 ++++ /opt/apollo/modules/common_msgs/drivers_msgs/can_card_parameter.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -40,10 +40,16 @@ + BCAN_BAUDRATE_NUM = 4; + } + ++ // CAN卡驱动类型配置 | 根据所用的CAN卡硬件型号或驱动类型配置 + optional CANCardBrand brand = 1; ++ // CAN卡硬件接口类型配置 | 根据所用的CAN卡硬件接口类型或驱动类型配置 + optional CANCardType type = 2; ++ // CAN卡端口号配置 | 根据所连接的CAN卡端口号配置 + optional CANChannelId channel_id = 3; ++ // CAN卡软件接口配置 | 默认配置为NATIVE + optional CANInterface interface = 4; ++ // CAN卡端口数量配置 | 默认数量为4,最多支持8个,默认可不配置 + optional uint32 num_ports = 5 [default = 4]; ++ // HERMES CAN卡波特率配置 | 只针对选择HERMES CAN卡时设置波特率,默认不配置 + optional HERMES_BAUDRATE hermes_baudrate = 6 [default = BCAN_BAUDRATE_500K]; + } +diff --color -Naur common_msgs/external_command_msgs/BUILD /opt/apollo/modules/common_msgs/external_command_msgs/BUILD +--- common_msgs/external_command_msgs/BUILD 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/BUILD 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,89 @@ ++## Auto generated by `proto_build_generator.py` ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") ++ ++package(default_visibility = ["//visibility:public"]) ++ ++proto_library( ++ name = "valet_parking_command_proto", ++ srcs = ["valet_parking_command.proto"], ++ deps = [ ++ ":external_geometry_proto", ++ ":lane_segment_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", ++ ], ++) ++ ++proto_library( ++ name = "lane_follow_command_proto", ++ srcs = ["lane_follow_command.proto"], ++ deps = [ ++ ":external_geometry_proto", ++ ":lane_segment_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", ++ ], ++) ++ ++proto_library( ++ name = "path_follow_command_proto", ++ srcs = ["path_follow_command.proto"], ++ deps = [ ++ ":external_geometry_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", ++ ], ++) ++ ++proto_library( ++ name = "command_status_proto", ++ srcs = ["command_status.proto"], ++ deps = [ ++ "//modules/common_msgs/basic_msgs:header_proto", ++ ], ++) ++ ++proto_library( ++ name = "chassis_command_proto", ++ srcs = ["chassis_command.proto"], ++ deps = [ ++ "@com_google_protobuf//:any_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", ++ "//modules/common_msgs/basic_msgs:vehicle_signal_proto", ++ ], ++) ++ ++proto_library( ++ name = "free_space_command_proto", ++ srcs = ["free_space_command.proto"], ++ deps = [ ++ ":external_geometry_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", ++ ], ++) ++ ++proto_library( ++ name = "speed_command_proto", ++ srcs = ["speed_command.proto"], ++ deps = [ ++ "//modules/common_msgs/basic_msgs:header_proto", ++ ], ++) ++ ++proto_library( ++ name = "action_command_proto", ++ srcs = ["action_command.proto"], ++ deps = [ ++ "//modules/common_msgs/basic_msgs:header_proto", ++ ], ++) ++ ++proto_library( ++ name = "lane_segment_proto", ++ srcs = ["lane_segment.proto"], ++) ++ ++proto_library( ++ name = "external_geometry_proto", ++ srcs = ["geometry.proto"], ++) ++ ++apollo_package() +diff --color -Naur common_msgs/external_command_msgs/action_command.proto /opt/apollo/modules/common_msgs/external_command_msgs/action_command.proto +--- common_msgs/external_command_msgs/action_command.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/action_command.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,36 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++import "modules/common_msgs/basic_msgs/header.proto"; ++ ++enum ActionCommandType { ++ // Follow the current lane. ++ FOLLOW = 1; ++ // Change to the laft lane. ++ CHANGE_LEFT = 2; ++ // Change to the right lane. ++ CHANGE_RIGHT = 3; ++ // Pull over and stop driving. ++ PULL_OVER = 4; ++ // Stop driving smoothly in emergency case. ++ STOP = 5; ++ // Start driving after paused. ++ START = 6; ++ // Clear the input planning command to cancel planning. ++ CLEAR_PLANNING = 7; ++ // Switch to manual drive mode. ++ SWITCH_TO_MANUAL = 50; ++ // Switch to auto drive mode. ++ SWITCH_TO_AUTO = 51; ++ // Varify vin code of vehicle. ++ VIN_REQ = 52; ++} ++ ++message ActionCommand { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ // The action command. ++ required ActionCommandType command = 3; ++} +\ No newline at end of file +diff --color -Naur common_msgs/external_command_msgs/chassis_command.proto /opt/apollo/modules/common_msgs/external_command_msgs/chassis_command.proto +--- common_msgs/external_command_msgs/chassis_command.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/chassis_command.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,17 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++import "google/protobuf/any.proto"; ++import "modules/common_msgs/basic_msgs/header.proto"; ++import "modules/common_msgs/basic_msgs/vehicle_signal.proto"; ++ ++message ChassisCommand { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ // The basic vehicle signals which can also be controlled by apollo system. ++ optional apollo.common.VehicleSignal basic_signal = 3; ++ // Custom chassis operation command defined by user for extensibility. ++ optional google.protobuf.Any custom_operation = 4; ++} +\ No newline at end of file +diff --color -Naur common_msgs/external_command_msgs/command_status.proto /opt/apollo/modules/common_msgs/external_command_msgs/command_status.proto +--- common_msgs/external_command_msgs/command_status.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/command_status.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,32 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++import "modules/common_msgs/basic_msgs/header.proto"; ++ ++enum CommandStatusType { ++ // Command is being executed without error. ++ RUNNING = 1; ++ // Command is finished. ++ FINISHED = 2; ++ // Command's execution has error. ++ ERROR = 3; ++ // Cannot get the status of command. ++ UNKNOWN = 4; ++} ++ ++message CommandStatusRequest { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++} ++ ++message CommandStatus { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ // The status of command execution. ++ required CommandStatusType status = 3; ++ // The message for the status. ++ optional string message = 4; ++} +\ No newline at end of file +diff --color -Naur common_msgs/external_command_msgs/free_space_command.proto /opt/apollo/modules/common_msgs/external_command_msgs/free_space_command.proto +--- common_msgs/external_command_msgs/free_space_command.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/free_space_command.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,24 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++import "modules/common_msgs/basic_msgs/header.proto"; ++import "modules/common_msgs/external_command_msgs/geometry.proto"; ++ ++message FreeSpaceCommand { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ // Pose of the parking spot. ++ required Pose parking_spot_pose = 3; ++ // Region where openspace trajectory will be searched. Junction containing ++ // "non_drivable_roi" should be contained by "drivable_roi" ++ // polygon points should be clockwise if outer polygon can drive. ++ // otherwise polygon points should be counter-clockwise if inner polygon can drive ++ repeated RoiPolygon non_drivable_roi = 4; ++ required RoiPolygon drivable_roi = 5; ++ // Expected speed when executing this command. If "target_speed" > maximum ++ // speed of the vehicle, use maximum speed of the vehicle instead. If it is ++ // not given, the default target speed of system will be used. ++ optional double target_speed = 6; ++} +diff --color -Naur common_msgs/external_command_msgs/geometry.proto /opt/apollo/modules/common_msgs/external_command_msgs/geometry.proto +--- common_msgs/external_command_msgs/geometry.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/geometry.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,26 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++message Point { ++ // x coordinate. ++ required double x = 1; ++ // y coordinate. ++ required double y = 2; ++} ++ ++message Pose { ++ // x coordinate. ++ required double x = 1; ++ // y coordinate. ++ required double y = 2; ++ // Rotation around z axis in Cartesian coordinate system. ++ optional double heading = 3; ++} ++ ++// Region of interest in form of polygon. ++// If the points of polygon is in anticlockwise, ROI is drivable area; otherwise if ++// they are in clockwise, ROI is prohibited driving area. ++message RoiPolygon { ++ repeated Point point = 1; ++} +\ No newline at end of file +diff --color -Naur common_msgs/external_command_msgs/lane_follow_command.proto /opt/apollo/modules/common_msgs/external_command_msgs/lane_follow_command.proto +--- common_msgs/external_command_msgs/lane_follow_command.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/lane_follow_command.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,27 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++import "modules/common_msgs/basic_msgs/header.proto"; ++import "modules/common_msgs/external_command_msgs/geometry.proto"; ++import "modules/common_msgs/external_command_msgs/lane_segment.proto"; ++ ++message LaneFollowCommand { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ // If the start pose is set as the first point of "way_point". ++ optional bool is_start_pose_set = 3 [default = false]; ++ // The points between "start_pose" and "end_pose". ++ repeated Pose way_point = 4; ++ // End pose of the lane follow command, must be given. ++ required Pose end_pose = 5; ++ // The lane segments which should not be passed by. ++ repeated LaneSegment blacklisted_lane = 6; ++ // The road which should not be passed by. ++ repeated string blacklisted_road = 7; ++ // Expected speed when executing this command. If "target_speed" > maximum ++ // speed of the vehicle, use maximum speed of the vehicle instead. If it is ++ // not given, the default target speed of system will be used. ++ optional double target_speed = 8; ++} +\ No newline at end of file +diff --color -Naur common_msgs/external_command_msgs/lane_segment.proto /opt/apollo/modules/common_msgs/external_command_msgs/lane_segment.proto +--- common_msgs/external_command_msgs/lane_segment.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/lane_segment.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,13 @@ ++ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++message LaneSegment { ++ // lane id which this LaneSegment belongs to. ++ optional string id = 1; ++ // Start s of this LaneSegment on the lane. ++ optional double start_s = 2; ++ // End s of this LaneSegment on the lane. ++ optional double end_s = 3; ++} +\ No newline at end of file +diff --color -Naur common_msgs/external_command_msgs/path_follow_command.proto /opt/apollo/modules/common_msgs/external_command_msgs/path_follow_command.proto +--- common_msgs/external_command_msgs/path_follow_command.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/path_follow_command.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,43 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++import "modules/common_msgs/basic_msgs/header.proto"; ++import "modules/common_msgs/external_command_msgs/geometry.proto"; ++ ++// PathBoundary with left and right boundary. ++message PathBoundary { ++ // Left boundary of the path, each boundary point mapped to the path point. ++ repeated Point left_boundary = 1; ++ // Right boundary of the path, each boundary point mapped to the path point. ++ repeated Point right_boundary = 2; ++} ++ ++// Path boundary generated with the distance from center to left and right ++// boundary given. ++message BoundaryWithWidth { ++ // Distance from the path center to left boundary. ++ required double left_path_width = 1; ++ // Distance from the path center to right boundary. ++ required double right_path_width = 2; ++} ++ ++message PathFollowCommand { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ // Path point to be followed, a valid path should contain >= 2 points. No lane ++ // on the map is followed for this command. ++ repeated Point way_point = 3; ++ oneof boundary { ++ // PathBoundary with left and right boundary. ++ PathBoundary path_boundary = 4; ++ // Path boundary generated with the distance from center to left and right ++ // boundary given. ++ BoundaryWithWidth boundary_with_width = 5; ++ } ++ // Expected speed when executing this command. If "target_speed" > maximum ++ // speed of the vehicle, use maximum speed of the vehicle instead. If it is ++ // not given, the default target speed of system will be used. ++ optional double target_speed = 6; ++} +\ No newline at end of file +diff --color -Naur common_msgs/external_command_msgs/speed_command.proto /opt/apollo/modules/common_msgs/external_command_msgs/speed_command.proto +--- common_msgs/external_command_msgs/speed_command.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/speed_command.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,22 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++import "modules/common_msgs/basic_msgs/header.proto"; ++ ++message SpeedCommand { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ oneof linear_speed { ++ // Replace the target speed of current motion command with this new target ++ // speed. ++ double target_speed = 3; ++ // Multiple the target speed in current motion command with the factor. The ++ // factor should be in range [0, 1.0]. ++ double target_speed_factor = 4; ++ // Restore the target speed with the initial value(The default configured ++ // target speed or set in motion command). ++ bool is_restore_target_speed = 5; ++ } ++} +\ No newline at end of file +diff --color -Naur common_msgs/external_command_msgs/valet_parking_command.proto /opt/apollo/modules/common_msgs/external_command_msgs/valet_parking_command.proto +--- common_msgs/external_command_msgs/valet_parking_command.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/external_command_msgs/valet_parking_command.proto 2023-12-23 18:05:58.948028975 +0800 +@@ -0,0 +1,27 @@ ++syntax = "proto2"; ++ ++package apollo.external_command; ++ ++import "modules/common_msgs/basic_msgs/header.proto"; ++import "modules/common_msgs/external_command_msgs/geometry.proto"; ++import "modules/common_msgs/external_command_msgs/lane_segment.proto"; ++ ++message ValetParkingCommand { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ // If the start pose is set as the first point of "way_point". ++ optional bool is_start_pose_set = 3 [default = false]; ++ // The points between "start_pose" and "end_pose". ++ repeated Pose way_point = 4; ++ // The lane segments which should not be passed by. ++ repeated LaneSegment blacklisted_lane = 5; ++ // The road which should not be passed by. ++ repeated string blacklisted_road = 6; ++ // The id of the parking spot on the map. ++ required string parking_spot_id = 7; ++ // Expected speed when executing this command. If "target_speed" > maximum ++ // speed of the vehicle, use maximum speed of the vehicle instead. If it is ++ // not given, the default target speed of system will be used. ++ optional double target_speed = 8; ++} +\ No newline at end of file +diff --color -Naur common_msgs/guardian_msgs/BUILD /opt/apollo/modules/common_msgs/guardian_msgs/BUILD +--- common_msgs/guardian_msgs/BUILD 2023-12-23 18:21:36.401614904 +0800 ++++ /opt/apollo/modules/common_msgs/guardian_msgs/BUILD 2023-12-23 18:05:58.949028975 +0800 +@@ -1,17 +1,9 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "guardian_cc_proto", +- deps = [ +- ":guardian_proto", +- ], +-) +- + proto_library( + name = "guardian_proto", + srcs = ["guardian.proto"], +@@ -21,12 +13,4 @@ + ], + ) + +-py_proto_library( +- name = "guardian_py_pb2", +- deps = [ +- ":guardian_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/control_msgs:control_cmd_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/localization_msgs/BUILD /opt/apollo/modules/common_msgs/localization_msgs/BUILD +--- common_msgs/localization_msgs/BUILD 2023-12-23 18:21:36.402614904 +0800 ++++ /opt/apollo/modules/common_msgs/localization_msgs/BUILD 2023-12-23 18:05:58.949028975 +0800 +@@ -1,57 +1,23 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "localization_status_cc_proto", +- deps = [ +- ":localization_status_proto", +- ], +-) +- + proto_library( +- name = "localization_status_proto", +- srcs = ["localization_status.proto"], +-) +- +-py_proto_library( +- name = "localization_status_py_pb2", +- deps = [ +- ":localization_status_proto", +- ], +-) +-cc_proto_library( +- name = "gps_cc_proto", ++ name = "pose_proto", ++ srcs = ["pose.proto"], + deps = [ +- ":gps_proto", ++ "//modules/common_msgs/basic_msgs:geometry_proto", + ], + ) + + proto_library( +- name = "gps_proto", +- srcs = ["gps.proto"], ++ name = "imu_proto", ++ srcs = ["imu.proto"], + deps = [ +- "//modules/common_msgs/basic_msgs:header_proto", + ":pose_proto", +- ], +-) +- +-py_proto_library( +- name = "gps_py_pb2", +- deps = [ +- ":gps_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ":pose_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "localization_cc_proto", +- deps = [ +- ":localization_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) + +@@ -59,71 +25,26 @@ + name = "localization_proto", + srcs = ["localization.proto"], + deps = [ +- "//modules/common_msgs/basic_msgs:header_proto", +- "//modules/common_msgs/basic_msgs:geometry_proto", +- "//modules/common_msgs/basic_msgs:pnc_point_proto", + ":localization_status_proto", + ":pose_proto", +- ], +-) +- +-py_proto_library( +- name = "localization_py_pb2", +- deps = [ +- ":localization_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- ":localization_status_py_pb2", +- ":pose_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "imu_cc_proto", +- deps = [ +- ":imu_proto", +- ], +-) +- +-proto_library( +- name = "imu_proto", +- srcs = ["imu.proto"], +- deps = [ ++ "//modules/common_msgs/basic_msgs:geometry_proto", + "//modules/common_msgs/basic_msgs:header_proto", +- ":pose_proto", +- ], +-) +- +-py_proto_library( +- name = "imu_py_pb2", +- deps = [ +- ":imu_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ":pose_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "pose_cc_proto", +- deps = [ +- ":pose_proto", ++ "//modules/common_msgs/basic_msgs:pnc_point_proto", + ], + ) + + proto_library( +- name = "pose_proto", +- srcs = ["pose.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:geometry_proto", +- ], ++ name = "localization_status_proto", ++ srcs = ["localization_status.proto"], + ) + +-py_proto_library( +- name = "pose_py_pb2", ++proto_library( ++ name = "gps_proto", ++ srcs = ["gps.proto"], + deps = [ + ":pose_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) + ++apollo_package() +diff --color -Naur common_msgs/map_msgs/BUILD /opt/apollo/modules/common_msgs/map_msgs/BUILD +--- common_msgs/map_msgs/BUILD 2023-12-23 18:21:36.403614904 +0800 ++++ /opt/apollo/modules/common_msgs/map_msgs/BUILD 2023-12-23 18:05:58.949028975 +0800 +@@ -1,64 +1,64 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "map_signal_cc_proto", ++proto_library( ++ name = "map_road_proto", ++ srcs = ["map_road.proto"], + deps = [ +- ":map_signal_proto", ++ ":map_geometry_proto", ++ ":map_id_proto", + ], + ) + + proto_library( +- name = "map_signal_proto", +- srcs = ["map_signal.proto"], ++ name = "map_overlap_proto", ++ srcs = ["map_overlap.proto"], + deps = [ +- "//modules/common_msgs/basic_msgs:geometry_proto", + ":map_geometry_proto", + ":map_id_proto", + ], + ) + +-py_proto_library( +- name = "map_signal_py_pb2", ++proto_library( ++ name = "map_lane_proto", ++ srcs = ["map_lane.proto"], + deps = [ +- ":map_signal_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", ++ ":map_geometry_proto", ++ ":map_id_proto", + ], + ) + +-cc_proto_library( +- name = "map_speed_control_cc_proto", ++proto_library( ++ name = "map_stop_sign_proto", ++ srcs = ["map_stop_sign.proto"], + deps = [ +- ":map_speed_control_proto", ++ ":map_geometry_proto", ++ ":map_id_proto", + ], + ) + + proto_library( +- name = "map_speed_control_proto", +- srcs = ["map_speed_control.proto"], +- deps = [ +- ":map_geometry_proto", +- ], ++ name = "map_id_proto", ++ srcs = ["map_id.proto"], + ) + +-py_proto_library( +- name = "map_speed_control_py_pb2", ++proto_library( ++ name = "map_junction_proto", ++ srcs = ["map_junction.proto"], + deps = [ +- ":map_speed_control_proto", +- ":map_geometry_py_pb2", ++ ":map_geometry_proto", ++ ":map_id_proto", + ], + ) + +-cc_proto_library( +- name = "map_geometry_cc_proto", ++proto_library( ++ name = "map_rsu_proto", ++ srcs = ["map_rsu.proto"], + deps = [ +- ":map_geometry_proto", ++ ":map_id_proto", + ], + ) + +@@ -70,46 +70,15 @@ + ], + ) + +-py_proto_library( +- name = "map_geometry_py_pb2", +- deps = [ +- ":map_geometry_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_crosswalk_cc_proto", +- deps = [ +- ":map_crosswalk_proto", +- ], +-) +- + proto_library( +- name = "map_crosswalk_proto", +- srcs = ["map_crosswalk.proto"], ++ name = "map_yield_sign_proto", ++ srcs = ["map_yield_sign.proto"], + deps = [ + ":map_geometry_proto", + ":map_id_proto", + ], + ) + +-py_proto_library( +- name = "map_crosswalk_py_pb2", +- deps = [ +- ":map_crosswalk_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_cc_proto", +- deps = [ +- ":map_proto", +- ], +-) +- + proto_library( + name = "map_proto", + srcs = ["map.proto"], +@@ -130,58 +99,6 @@ + ], + ) + +-py_proto_library( +- name = "map_py_pb2", +- deps = [ +- ":map_proto", +- ":map_clear_area_py_pb2", +- ":map_crosswalk_py_pb2", +- ":map_junction_py_pb2", +- ":map_lane_py_pb2", +- ":map_overlap_py_pb2", +- ":map_parking_space_py_pb2", +- ":map_pnc_junction_py_pb2", +- ":map_road_py_pb2", +- ":map_rsu_py_pb2", +- ":map_signal_py_pb2", +- ":map_speed_bump_py_pb2", +- ":map_stop_sign_py_pb2", +- ":map_yield_sign_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_overlap_cc_proto", +- deps = [ +- ":map_overlap_proto", +- ], +-) +- +-proto_library( +- name = "map_overlap_proto", +- srcs = ["map_overlap.proto"], +- deps = [ +- ":map_geometry_proto", +- ":map_id_proto", +- ], +-) +- +-py_proto_library( +- name = "map_overlap_py_pb2", +- deps = [ +- ":map_overlap_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_clear_area_cc_proto", +- deps = [ +- ":map_clear_area_proto", +- ], +-) +- + proto_library( + name = "map_clear_area_proto", + srcs = ["map_clear_area.proto"], +@@ -191,70 +108,6 @@ + ], + ) + +-py_proto_library( +- name = "map_clear_area_py_pb2", +- deps = [ +- ":map_clear_area_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_rsu_cc_proto", +- deps = [ +- ":map_rsu_proto", +- ], +-) +- +-proto_library( +- name = "map_rsu_proto", +- srcs = ["map_rsu.proto"], +- deps = [ +- ":map_id_proto", +- ], +-) +- +-py_proto_library( +- name = "map_rsu_py_pb2", +- deps = [ +- ":map_rsu_proto", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_road_cc_proto", +- deps = [ +- ":map_road_proto", +- ], +-) +- +-proto_library( +- name = "map_road_proto", +- srcs = ["map_road.proto"], +- deps = [ +- ":map_geometry_proto", +- ":map_id_proto", +- ], +-) +- +-py_proto_library( +- name = "map_road_py_pb2", +- deps = [ +- ":map_road_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_parking_space_cc_proto", +- deps = [ +- ":map_parking_space_proto", +- ], +-) +- + proto_library( + name = "map_parking_space_proto", + srcs = ["map_parking_space.proto"], +@@ -264,64 +117,23 @@ + ], + ) + +-py_proto_library( +- name = "map_parking_space_py_pb2", +- deps = [ +- ":map_parking_space_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_junction_cc_proto", +- deps = [ +- ":map_junction_proto", +- ], +-) +- + proto_library( +- name = "map_junction_proto", +- srcs = ["map_junction.proto"], ++ name = "map_pnc_junction_proto", ++ srcs = ["map_pnc_junction.proto"], + deps = [ + ":map_geometry_proto", + ":map_id_proto", + ], + ) + +-py_proto_library( +- name = "map_junction_py_pb2", +- deps = [ +- ":map_junction_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_id_cc_proto", +- deps = [ +- ":map_id_proto", +- ], +-) +- + proto_library( +- name = "map_id_proto", +- srcs = ["map_id.proto"], +-) +- +-py_proto_library( +- name = "map_id_py_pb2", ++ name = "map_crosswalk_proto", ++ srcs = ["map_crosswalk.proto"], + deps = [ ++ ":map_geometry_proto", + ":map_id_proto", + ], + ) +-cc_proto_library( +- name = "map_speed_bump_cc_proto", +- deps = [ +- ":map_speed_bump_proto", +- ], +-) + + proto_library( + name = "map_speed_bump_proto", +@@ -332,112 +144,22 @@ + ], + ) + +-py_proto_library( +- name = "map_speed_bump_py_pb2", +- deps = [ +- ":map_speed_bump_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_yield_sign_cc_proto", +- deps = [ +- ":map_yield_sign_proto", +- ], +-) +- +-proto_library( +- name = "map_yield_sign_proto", +- srcs = ["map_yield_sign.proto"], +- deps = [ +- ":map_geometry_proto", +- ":map_id_proto", +- ], +-) +- +-py_proto_library( +- name = "map_yield_sign_py_pb2", +- deps = [ +- ":map_yield_sign_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_stop_sign_cc_proto", +- deps = [ +- ":map_stop_sign_proto", +- ], +-) +- + proto_library( +- name = "map_stop_sign_proto", +- srcs = ["map_stop_sign.proto"], +- deps = [ +- ":map_geometry_proto", +- ":map_id_proto", +- ], +-) +- +-py_proto_library( +- name = "map_stop_sign_py_pb2", +- deps = [ +- ":map_stop_sign_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_lane_cc_proto", +- deps = [ +- ":map_lane_proto", +- ], +-) +- +-proto_library( +- name = "map_lane_proto", +- srcs = ["map_lane.proto"], ++ name = "map_speed_control_proto", ++ srcs = ["map_speed_control.proto"], + deps = [ + ":map_geometry_proto", +- ":map_id_proto", +- ], +-) +- +-py_proto_library( +- name = "map_lane_py_pb2", +- deps = [ +- ":map_lane_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "map_pnc_junction_cc_proto", +- deps = [ +- ":map_pnc_junction_proto", + ], + ) + + proto_library( +- name = "map_pnc_junction_proto", +- srcs = ["map_pnc_junction.proto"], ++ name = "map_signal_proto", ++ srcs = ["map_signal.proto"], + deps = [ + ":map_geometry_proto", + ":map_id_proto", ++ "//modules/common_msgs/basic_msgs:geometry_proto", + ], + ) + +-py_proto_library( +- name = "map_pnc_junction_py_pb2", +- deps = [ +- ":map_pnc_junction_proto", +- ":map_geometry_py_pb2", +- ":map_id_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/monitor_msgs/BUILD /opt/apollo/modules/common_msgs/monitor_msgs/BUILD +--- common_msgs/monitor_msgs/BUILD 2023-12-23 18:21:36.406614904 +0800 ++++ /opt/apollo/modules/common_msgs/monitor_msgs/BUILD 2023-12-23 18:05:58.949028975 +0800 +@@ -1,17 +1,9 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "system_status_cc_proto", +- deps = [ +- ":system_status_proto", +- ], +-) +- + proto_library( + name = "system_status_proto", + srcs = ["system_status.proto"], +@@ -20,44 +12,6 @@ + ], + ) + +-py_proto_library( +- name = "system_status_py_pb2", +- deps = [ +- ":system_status_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "smart_recorder_status_cc_proto", +- deps = [ +- ":smart_recorder_status_proto", +- ], +-) +- +-proto_library( +- name = "smart_recorder_status_proto", +- srcs = ["smart_recorder_status.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:header_proto", +- ], +-) +- +-py_proto_library( +- name = "smart_recorder_status_py_pb2", +- deps = [ +- ":smart_recorder_status_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "monitor_log_cc_proto", +- deps = [ +- ":monitor_log_proto", +- ], +-) +- + proto_library( + name = "monitor_log_proto", + srcs = ["monitor_log.proto"], +@@ -66,11 +20,12 @@ + ], + ) + +-py_proto_library( +- name = "monitor_log_py_pb2", ++proto_library( ++ name = "smart_recorder_status_proto", ++ srcs = ["smart_recorder_status.proto"], + deps = [ +- ":monitor_log_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) + ++apollo_package() +diff --color -Naur common_msgs/monitor_msgs/system_status.proto /opt/apollo/modules/common_msgs/monitor_msgs/system_status.proto +--- common_msgs/monitor_msgs/system_status.proto 2023-12-23 18:21:36.407614904 +0800 ++++ /opt/apollo/modules/common_msgs/monitor_msgs/system_status.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -55,6 +55,11 @@ + // In some modes, other processes besides modules and monitored components may + // need to be monitored + map other_components = 10; ++ ++ // In all modes, needs to detect progress and resource space. ++ map global_components = 11; ++ ++ optional bool detect_immediately = 12 [default = false]; + + reserved 2, 3; + } +diff --color -Naur common_msgs/perception_msgs/BUILD /opt/apollo/modules/common_msgs/perception_msgs/BUILD +--- common_msgs/perception_msgs/BUILD 2023-12-23 18:21:36.407614904 +0800 ++++ /opt/apollo/modules/common_msgs/perception_msgs/BUILD 2023-12-23 18:05:58.950028975 +0800 +@@ -1,14 +1,16 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "traffic_light_detection_cc_proto", ++proto_library( ++ name = "perception_camera_proto", ++ srcs = ["perception_camera.proto"], + deps = [ +- ":traffic_light_detection_proto", ++ ":perception_obstacle_proto", ++ "//modules/common_msgs/basic_msgs:geometry_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) + +@@ -20,18 +22,12 @@ + ], + ) + +-py_proto_library( +- name = "traffic_light_detection_py_pb2", +- deps = [ +- ":traffic_light_detection_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "perception_obstacle_cc_proto", ++proto_library( ++ name = "perception_lane_proto", ++ srcs = ["perception_lane.proto"], + deps = [ +- ":perception_obstacle_proto", ++ ":perception_camera_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) + +@@ -47,67 +43,14 @@ + ], + ) + +-py_proto_library( +- name = "perception_obstacle_py_pb2", +- deps = [ +- ":perception_obstacle_proto", +- "//modules/common_msgs/basic_msgs:error_code_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- "//modules/common_msgs/map_msgs:map_lane_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "perception_lane_cc_proto", +- deps = [ +- ":perception_lane_proto", +- ], +-) +- +-proto_library( +- name = "perception_lane_proto", +- srcs = ["perception_lane.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:header_proto", +- ":perception_camera_proto", +- ], +-) +- +-py_proto_library( +- name = "perception_lane_py_pb2", +- deps = [ +- ":perception_lane_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ":perception_camera_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "perception_camera_cc_proto", +- deps = [ +- ":perception_camera_proto", +- ], +-) +- + proto_library( +- name = "perception_camera_proto", +- srcs = ["perception_camera.proto"], ++ name = "perception_benchmark_proto", ++ srcs = ["perception_benchmark.proto"], + deps = [ +- "//modules/common_msgs/basic_msgs:geometry_proto", +- "//modules/common_msgs/basic_msgs:header_proto", + ":perception_obstacle_proto", ++ "//modules/common_msgs/basic_msgs:error_code_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) + +-py_proto_library( +- name = "perception_camera_py_pb2", +- deps = [ +- ":perception_camera_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ":perception_obstacle_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/perception_msgs/perception_benchmark.proto /opt/apollo/modules/common_msgs/perception_msgs/perception_benchmark.proto +--- common_msgs/perception_msgs/perception_benchmark.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/perception_msgs/perception_benchmark.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -0,0 +1,21 @@ ++syntax = "proto2"; ++ ++package apollo.perception; ++ ++import "modules/common_msgs/basic_msgs/error_code.proto"; ++import "modules/common_msgs/basic_msgs/header.proto"; ++import "modules/common_msgs/perception_msgs/perception_obstacle.proto"; ++ ++message SensorFrameInfo { ++ optional string sensor_id = 1; ++ optional double timestamp = 2; ++ repeated double sensor2world_pose = 3; // size should be 16 ++} ++ ++// For perception benchmark ++message PerceptionBenchmarkFrame { ++ repeated PerceptionObstacle perception_obstacle = 1; // An array of obstacles ++ optional apollo.common.Header header = 2; // Header ++ optional apollo.common.ErrorCode error_code = 3 [default = OK]; ++ optional SensorFrameInfo sensor_frame_info = 4; ++} +diff --color -Naur common_msgs/perception_msgs/perception_obstacle.proto /opt/apollo/modules/common_msgs/perception_msgs/perception_obstacle.proto +--- common_msgs/perception_msgs/perception_obstacle.proto 2023-12-23 18:21:36.407614904 +0800 ++++ /opt/apollo/modules/common_msgs/perception_msgs/perception_obstacle.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -95,7 +95,7 @@ + // Format: [x0, y0, z0, x1, y1, z1...] + repeated double point_cloud = 12 [packed = true]; + +- optional double confidence = 13 [deprecated = true]; ++ optional double confidence = 13; + enum ConfidenceType { + CONFIDENCE_UNKNOWN = 0; + CONFIDENCE_CNN = 1; +@@ -126,6 +126,9 @@ + ST_TRICYCLIST = 9; + ST_PEDESTRIAN = 10; + ST_TRAFFICCONE = 11; ++ ST_SMALLMOT = 12; ++ ST_BIGMOT = 13; ++ ST_NONMOT = 14; + }; + optional SubType sub_type = 19; // obstacle sub_type + +diff --color -Naur common_msgs/planning_msgs/BUILD /opt/apollo/modules/common_msgs/planning_msgs/BUILD +--- common_msgs/planning_msgs/BUILD 2023-12-23 18:21:36.409614904 +0800 ++++ /opt/apollo/modules/common_msgs/planning_msgs/BUILD 2023-12-23 18:05:58.950028975 +0800 +@@ -1,119 +1,39 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "planning_cc_proto", +- deps = [ +- ":planning_proto", +- ], +-) +- + proto_library( +- name = "planning_proto", +- srcs = ["planning.proto"], ++ name = "pad_msg_proto", ++ srcs = ["pad_msg.proto"], + deps = [ +- "//modules/common_msgs/chassis_msgs:chassis_proto", +- "//modules/common_msgs/basic_msgs:drive_state_proto", +- "//modules/common_msgs/basic_msgs:geometry_proto", + "//modules/common_msgs/basic_msgs:header_proto", +- "//modules/common_msgs/basic_msgs:pnc_point_proto", +- "//modules/common_msgs/map_msgs:map_id_proto", +- ":decision_proto", +- ":planning_internal_proto", +- ], +-) +- +-py_proto_library( +- name = "planning_py_pb2", +- deps = [ +- ":planning_proto", +- "//modules/common_msgs/chassis_msgs:chassis_py_pb2", +- "//modules/common_msgs/basic_msgs:drive_state_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- "//modules/common_msgs/map_msgs:map_id_py_pb2", +- ":decision_py_pb2", +- ":planning_internal_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "sl_boundary_cc_proto", +- deps = [ +- ":sl_boundary_proto", + ], + ) + + proto_library( +- name = "sl_boundary_proto", +- srcs = ["sl_boundary.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:pnc_point_proto", +- ], +-) +- +-py_proto_library( +- name = "sl_boundary_py_pb2", +- deps = [ +- ":sl_boundary_proto", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "planning_internal_cc_proto", ++ name = "decision_proto", ++ srcs = ["decision.proto"], + deps = [ +- ":planning_internal_proto", ++ "//modules/common_msgs/basic_msgs:geometry_proto", ++ "//modules/common_msgs/basic_msgs:vehicle_signal_proto", ++ "//modules/common_msgs/routing_msgs:routing_geometry_proto", + ], + ) + + proto_library( +- name = "planning_internal_proto", +- srcs = ["planning_internal.proto"], ++ name = "planning_proto", ++ srcs = ["planning.proto"], + deps = [ ++ ":decision_proto", ++ ":planning_internal_proto", ++ "//modules/common_msgs/basic_msgs:drive_state_proto", + "//modules/common_msgs/basic_msgs:geometry_proto", + "//modules/common_msgs/basic_msgs:header_proto", + "//modules/common_msgs/basic_msgs:pnc_point_proto", + "//modules/common_msgs/chassis_msgs:chassis_proto", +- "//modules/common_msgs/dreamview_msgs:chart_proto", +- "//modules/common_msgs/localization_msgs:localization_proto", +- "//modules/common_msgs/perception_msgs:traffic_light_detection_proto", +- ":decision_proto", +- ":navigation_proto", +- ":scenario_type_proto", +- ":sl_boundary_proto", +- "//modules/common_msgs/routing_msgs:routing_proto", +- ], +-) +- +-py_proto_library( +- name = "planning_internal_py_pb2", +- deps = [ +- ":planning_internal_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- "//modules/common_msgs/chassis_msgs:chassis_py_pb2", +- "//modules/common_msgs/dreamview_msgs:chart_py_pb2", +- "//modules/common_msgs/localization_msgs:localization_py_pb2", +- "//modules/common_msgs/perception_msgs:traffic_light_detection_py_pb2", +- ":decision_py_pb2", +- ":navigation_py_pb2", +- ":scenario_type_py_pb2", +- ":sl_boundary_py_pb2", +- "//modules/common_msgs/routing_msgs:routing_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "navigation_cc_proto", +- deps = [ +- ":navigation_proto", ++ "//modules/common_msgs/map_msgs:map_id_proto", + ], + ) + +@@ -129,82 +49,41 @@ + ], + ) + +-py_proto_library( +- name = "navigation_py_pb2", +- deps = [ +- ":navigation_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- "//modules/common_msgs/localization_msgs:localization_py_pb2", +- "//modules/common_msgs/map_msgs:map_py_pb2", +- "//modules/common_msgs/perception_msgs:perception_obstacle_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "scenario_type_cc_proto", +- deps = [ +- ":scenario_type_proto", +- ], +-) +- +-proto_library( +- name = "scenario_type_proto", +- srcs = ["scenario_type.proto"], +-) +- +-py_proto_library( +- name = "scenario_type_py_pb2", +- deps = [ +- ":scenario_type_proto", +- ], +-) +-cc_proto_library( +- name = "pad_msg_cc_proto", +- deps = [ +- ":pad_msg_proto", +- ], +-) +- + proto_library( +- name = "pad_msg_proto", +- srcs = ["pad_msg.proto"], ++ name = "planning_command_proto", ++ srcs = ["planning_command.proto"], + deps = [ ++ "@com_google_protobuf//:any_proto", + "//modules/common_msgs/basic_msgs:header_proto", ++ "//modules/common_msgs/routing_msgs:routing_proto", + ], + ) + +-py_proto_library( +- name = "pad_msg_py_pb2", +- deps = [ +- ":pad_msg_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "decision_cc_proto", ++proto_library( ++ name = "sl_boundary_proto", ++ srcs = ["sl_boundary.proto"], + deps = [ +- ":decision_proto", ++ "//modules/common_msgs/basic_msgs:pnc_point_proto", + ], + ) + + proto_library( +- name = "decision_proto", +- srcs = ["decision.proto"], ++ name = "planning_internal_proto", ++ srcs = ["planning_internal.proto"], + deps = [ ++ ":decision_proto", ++ ":navigation_proto", ++ ":sl_boundary_proto", + "//modules/common_msgs/basic_msgs:geometry_proto", +- "//modules/common_msgs/basic_msgs:vehicle_signal_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", ++ "//modules/common_msgs/basic_msgs:pnc_point_proto", ++ "//modules/common_msgs/chassis_msgs:chassis_proto", ++ "//modules/common_msgs/dreamview_msgs:chart_proto", ++ "//modules/common_msgs/localization_msgs:localization_proto", ++ "//modules/common_msgs/perception_msgs:traffic_light_detection_proto", ++ "//modules/common_msgs/routing_msgs:routing_geometry_proto", + "//modules/common_msgs/routing_msgs:routing_proto", + ], + ) + +-py_proto_library( +- name = "decision_py_pb2", +- deps = [ +- ":decision_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:vehicle_signal_py_pb2", +- "//modules/common_msgs/routing_msgs:routing_py_pb2", +- ], +-) ++apollo_package() +diff --color -Naur common_msgs/planning_msgs/decision.proto /opt/apollo/modules/common_msgs/planning_msgs/decision.proto +--- common_msgs/planning_msgs/decision.proto 2023-12-23 18:21:36.409614904 +0800 ++++ /opt/apollo/modules/common_msgs/planning_msgs/decision.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -4,7 +4,7 @@ + + import "modules/common_msgs/basic_msgs/geometry.proto"; + import "modules/common_msgs/basic_msgs/vehicle_signal.proto"; +-import "modules/common_msgs/routing_msgs/routing.proto"; ++import "modules/common_msgs/routing_msgs/geometry.proto"; + + message TargetLane { + // lane id +diff --color -Naur common_msgs/planning_msgs/pad_msg.proto /opt/apollo/modules/common_msgs/planning_msgs/pad_msg.proto +--- common_msgs/planning_msgs/pad_msg.proto 2023-12-23 18:21:36.409614904 +0800 ++++ /opt/apollo/modules/common_msgs/planning_msgs/pad_msg.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -15,6 +15,7 @@ + PULL_OVER = 3; + STOP = 4; + RESUME_CRUISE = 5; ++ CLEAR_PLANNING = 6; + }; + + // driving action +diff --color -Naur common_msgs/planning_msgs/planning.proto /opt/apollo/modules/common_msgs/planning_msgs/planning.proto +--- common_msgs/planning_msgs/planning.proto 2023-12-23 18:21:36.409614904 +0800 ++++ /opt/apollo/modules/common_msgs/planning_msgs/planning.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -106,6 +106,7 @@ + PATH_FALLBACK = 2; + SPEED_FALLBACK = 3; + PATH_REUSED = 4; ++ OPEN_SPACE = 5; + } + optional TrajectoryType trajectory_type = 21 [default = UNKNOWN]; + +diff --color -Naur common_msgs/planning_msgs/planning_command.proto /opt/apollo/modules/common_msgs/planning_msgs/planning_command.proto +--- common_msgs/planning_msgs/planning_command.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/planning_msgs/planning_command.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -0,0 +1,35 @@ ++syntax = "proto2"; ++ ++package apollo.planning; ++ ++import "google/protobuf/any.proto"; ++import "modules/common_msgs/basic_msgs/header.proto"; ++import "modules/common_msgs/routing_msgs/routing.proto"; ++ ++message ParkingCommand { ++ optional apollo.common.Header header = 1; ++ // The id of the parking spot on the map. ++ required string parking_spot_id = 2; ++ // Expected speed when executing this command. If "target_speed" > maximum ++ // speed of the vehicle, use maximum speed of the vehicle instead. If it is ++ // not given, the default target speed of system will be used. ++ optional double target_speed = 3; ++} ++ ++message PlanningCommand { ++ optional apollo.common.Header header = 1; ++ // Unique identification for command. ++ optional int64 command_id = 2 [default = -1]; ++ // Move along the lanes on map. ++ optional apollo.routing.RoutingResponse lane_follow_command = 3; ++ // Target speed in command. ++ optional double target_speed = 4; ++ // Indicate if the command is a motion command. ++ optional bool is_motion_command = 5 [default = false]; ++ oneof command { ++ // Move to the given pose with open space planning trajectory. ++ ParkingCommand parking_command = 6; ++ // Custom command defined by user for extensibility. ++ google.protobuf.Any custom_command = 7; ++ } ++} +diff --color -Naur common_msgs/planning_msgs/planning_internal.proto /opt/apollo/modules/common_msgs/planning_msgs/planning_internal.proto +--- common_msgs/planning_msgs/planning_internal.proto 2023-12-23 18:21:36.409614904 +0800 ++++ /opt/apollo/modules/common_msgs/planning_msgs/planning_internal.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -11,9 +11,9 @@ + import "modules/common_msgs/perception_msgs/traffic_light_detection.proto"; + import "modules/common_msgs/planning_msgs/decision.proto"; + import "modules/common_msgs/planning_msgs/navigation.proto"; +-import "modules/common_msgs/planning_msgs/scenario_type.proto"; + import "modules/common_msgs/planning_msgs/sl_boundary.proto"; + import "modules/common_msgs/routing_msgs/routing.proto"; ++import "modules/common_msgs/routing_msgs/geometry.proto"; + + message Debug { + optional PlanningData planning_data = 2; +@@ -132,9 +132,15 @@ + } + + message ScenarioDebug { +- optional apollo.planning.ScenarioType scenario_type = 1; +- optional apollo.planning.StageType stage_type = 2; ++ // "scenario_type" is deprecated because scenario is designed as plugin and ++ // "scenario_plugin_type" will be used instead. ++ optional int32 scenario_type = 1 [deprecated=true]; ++ // "stage_type" is deprecated because scenario is designed as plugin and ++ // "stage_plugin_type" will be used instead. ++ optional int32 stage_type = 2 [deprecated=true]; + optional string msg = 3; ++ optional string scenario_plugin_type = 4; ++ optional string stage_plugin_type = 5; + } + + message Trajectories { +diff --color -Naur common_msgs/planning_msgs/scenario_type.proto /opt/apollo/modules/common_msgs/planning_msgs/scenario_type.proto +--- common_msgs/planning_msgs/scenario_type.proto 2023-12-23 18:21:36.409614904 +0800 ++++ /opt/apollo/modules/common_msgs/planning_msgs/scenario_type.proto 1970-01-01 08:00:00.000000000 +0800 +@@ -1,100 +0,0 @@ +-syntax = "proto2"; +- +-package apollo.planning; +- +- +-enum ScenarioType { +- LANE_FOLLOW = 0; // default scenario +- +- // intersection involved +- BARE_INTERSECTION_UNPROTECTED = 2; +- STOP_SIGN_PROTECTED = 3; +- STOP_SIGN_UNPROTECTED = 4; +- TRAFFIC_LIGHT_PROTECTED = 5; +- TRAFFIC_LIGHT_UNPROTECTED_LEFT_TURN = 6; +- TRAFFIC_LIGHT_UNPROTECTED_RIGHT_TURN = 7; +- YIELD_SIGN = 8; +- +- // parking +- PULL_OVER = 9; +- VALET_PARKING = 10; +- +- EMERGENCY_PULL_OVER = 11; +- EMERGENCY_STOP = 12; +- +- // misc +- NARROW_STREET_U_TURN = 13; +- PARK_AND_GO = 14; +- +- // learning model sample +- LEARNING_MODEL_SAMPLE = 15; +- // turn around +- DEADEND_TURNAROUND = 16; +-} +- +-// StageType is a superset of stages from all scenarios. +-// It is created to keep different scenarios have uniform config interface +-enum StageType { +- NO_STAGE = 0; +- +- LANE_FOLLOW_DEFAULT_STAGE = 1; +- +- // bare_intersection_unprotected scenario +- BARE_INTERSECTION_UNPROTECTED_APPROACH = 200; +- BARE_INTERSECTION_UNPROTECTED_INTERSECTION_CRUISE = 201; +- +- // stop_sign_unprotected scenario +- STOP_SIGN_UNPROTECTED_PRE_STOP = 300; +- STOP_SIGN_UNPROTECTED_STOP = 301; +- STOP_SIGN_UNPROTECTED_CREEP = 302; +- STOP_SIGN_UNPROTECTED_INTERSECTION_CRUISE = 303; +- +- // traffic_light_protected scenario +- TRAFFIC_LIGHT_PROTECTED_APPROACH = 400; +- TRAFFIC_LIGHT_PROTECTED_INTERSECTION_CRUISE = 401; +- +- // traffic_light_unprotected_left_turn scenario +- TRAFFIC_LIGHT_UNPROTECTED_LEFT_TURN_APPROACH = 410; +- TRAFFIC_LIGHT_UNPROTECTED_LEFT_TURN_CREEP = 411; +- TRAFFIC_LIGHT_UNPROTECTED_LEFT_TURN_INTERSECTION_CRUISE = 412; +- +- // traffic_light_unprotected_right_turn scenario +- TRAFFIC_LIGHT_UNPROTECTED_RIGHT_TURN_STOP = 420; +- TRAFFIC_LIGHT_UNPROTECTED_RIGHT_TURN_CREEP = 421; +- TRAFFIC_LIGHT_UNPROTECTED_RIGHT_TURN_INTERSECTION_CRUISE = 422; +- +- // pull_over scenario +- PULL_OVER_APPROACH = 500; +- PULL_OVER_RETRY_APPROACH_PARKING = 501; +- PULL_OVER_RETRY_PARKING = 502; +- +- // emergency_pull_over scenario +- EMERGENCY_PULL_OVER_SLOW_DOWN = 600; +- EMERGENCY_PULL_OVER_APPROACH = 601; +- EMERGENCY_PULL_OVER_STANDBY = 602; +- +- // emergency_pull_over scenario +- EMERGENCY_STOP_APPROACH = 610; +- EMERGENCY_STOP_STANDBY = 611; +- +- // valet parking scenario +- VALET_PARKING_APPROACHING_PARKING_SPOT = 700; +- VALET_PARKING_PARKING = 701; +- +- // turning around scenario +- DEADEND_TURNAROUND_APPROACHING_TURNING_POINT = 1100; +- DEADEND_TURNAROUND_TURNING = 1101; +- +- // park_and_go scenario +- PARK_AND_GO_CHECK = 800; +- PARK_AND_GO_CRUISE = 801; +- PARK_AND_GO_ADJUST = 802; +- PARK_AND_GO_PRE_CRUISE = 803; +- +- // yield_sign scenario +- YIELD_SIGN_APPROACH = 900; +- YIELD_SIGN_CREEP = 901; +- +- // learning_model_sample scenario +- LEARNING_MODEL_RUN = 1000; +-} +diff --color -Naur common_msgs/prediction_msgs/BUILD /opt/apollo/modules/common_msgs/prediction_msgs/BUILD +--- common_msgs/prediction_msgs/BUILD 2023-12-23 18:21:36.411614904 +0800 ++++ /opt/apollo/modules/common_msgs/prediction_msgs/BUILD 2023-12-23 18:05:58.950028975 +0800 +@@ -1,50 +1,16 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "scenario_cc_proto", +- deps = [ +- ":scenario_proto", +- ], +-) +- +-proto_library( +- name = "scenario_proto", +- srcs = ["scenario.proto"], +-) +- +-py_proto_library( +- name = "scenario_py_pb2", +- deps = [ +- ":scenario_proto", +- ], +-) +-cc_proto_library( +- name = "prediction_point_cc_proto", +- deps = [ +- ":prediction_point_proto", +- ], +-) +- + proto_library( +- name = "prediction_point_proto", +- srcs = ["prediction_point.proto"], +-) +- +-py_proto_library( +- name = "prediction_point_py_pb2", +- deps = [ +- ":prediction_point_proto", +- ], +-) +-cc_proto_library( +- name = "feature_cc_proto", ++ name = "lane_graph_proto", ++ srcs = ["lane_graph.proto"], + deps = [ +- ":feature_proto", ++ "//modules/common_msgs/basic_msgs:geometry_proto", ++ "//modules/common_msgs/basic_msgs:pnc_point_proto", ++ "//modules/common_msgs/map_msgs:map_lane_proto", + ], + ) + +@@ -52,32 +18,12 @@ + name = "feature_proto", + srcs = ["feature.proto"], + deps = [ ++ ":lane_graph_proto", ++ ":prediction_point_proto", + "//modules/common_msgs/basic_msgs:geometry_proto", + "//modules/common_msgs/basic_msgs:pnc_point_proto", + "//modules/common_msgs/map_msgs:map_lane_proto", + "//modules/common_msgs/perception_msgs:perception_obstacle_proto", +- ":lane_graph_proto", +- ":prediction_point_proto", +- ], +-) +- +-py_proto_library( +- name = "feature_py_pb2", +- deps = [ +- ":feature_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- "//modules/common_msgs/map_msgs:map_lane_py_pb2", +- "//modules/common_msgs/perception_msgs:perception_obstacle_py_pb2", +- ":lane_graph_py_pb2", +- ":prediction_point_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "prediction_obstacle_cc_proto", +- deps = [ +- ":prediction_obstacle_proto", + ], + ) + +@@ -85,50 +31,22 @@ + name = "prediction_obstacle_proto", + srcs = ["prediction_obstacle.proto"], + deps = [ ++ ":feature_proto", ++ ":scenario_proto", + "//modules/common_msgs/basic_msgs:error_code_proto", + "//modules/common_msgs/basic_msgs:header_proto", + "//modules/common_msgs/perception_msgs:perception_obstacle_proto", +- ":scenario_proto", +- ":feature_proto", +- ], +-) +- +-py_proto_library( +- name = "prediction_obstacle_py_pb2", +- deps = [ +- ":prediction_obstacle_proto", +- "//modules/common_msgs/basic_msgs:error_code_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/perception_msgs:perception_obstacle_py_pb2", +- ":scenario_py_pb2", +- ":feature_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "lane_graph_cc_proto", +- deps = [ +- ":lane_graph_proto", + ], + ) + + proto_library( +- name = "lane_graph_proto", +- srcs = ["lane_graph.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:geometry_proto", +- "//modules/common_msgs/basic_msgs:pnc_point_proto", +- "//modules/common_msgs/map_msgs:map_lane_proto", +- ], ++ name = "prediction_point_proto", ++ srcs = ["prediction_point.proto"], + ) + +-py_proto_library( +- name = "lane_graph_py_pb2", +- deps = [ +- ":lane_graph_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:pnc_point_py_pb2", +- "//modules/common_msgs/map_msgs:map_lane_py_pb2", +- ], ++proto_library( ++ name = "scenario_proto", ++ srcs = ["scenario.proto"], + ) + ++apollo_package() +diff --color -Naur common_msgs/routing_msgs/BUILD /opt/apollo/modules/common_msgs/routing_msgs/BUILD +--- common_msgs/routing_msgs/BUILD 2023-12-23 18:21:36.413614904 +0800 ++++ /opt/apollo/modules/common_msgs/routing_msgs/BUILD 2023-12-23 18:05:58.950028975 +0800 +@@ -1,14 +1,16 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "routing_cc_proto", ++proto_library( ++ name = "poi_proto", ++ srcs = ["poi.proto"], + deps = [ +- ":routing_proto", ++ ":routing_geometry_proto", ++ "//modules/common_msgs/basic_msgs:geometry_proto", ++ "//modules/common_msgs/map_msgs:map_geometry_proto", + ], + ) + +@@ -16,46 +18,19 @@ + name = "routing_proto", + srcs = ["routing.proto"], + deps = [ ++ ":routing_geometry_proto", ++ ":poi_proto", + "//modules/common_msgs/basic_msgs:error_code_proto", +- "//modules/common_msgs/basic_msgs:geometry_proto", + "//modules/common_msgs/basic_msgs:header_proto", +- "//modules/common_msgs/map_msgs:map_geometry_proto", +- "//modules/common_msgs/map_msgs:map_parking_space_proto", +- ], +-) +- +-py_proto_library( +- name = "routing_py_pb2", +- deps = [ +- ":routing_proto", +- "//modules/common_msgs/basic_msgs:error_code_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/map_msgs:map_geometry_py_pb2", +- "//modules/common_msgs/map_msgs:map_parking_space_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "poi_cc_proto", +- deps = [ +- ":poi_proto", + ], + ) + + proto_library( +- name = "poi_proto", +- srcs = ["poi.proto"], ++ name = "routing_geometry_proto", ++ srcs = ["geometry.proto"], + deps = [ +- ":routing_proto", +- ], +-) +- +-py_proto_library( +- name = "poi_py_pb2", +- deps = [ +- ":poi_proto", +- ":routing_py_pb2", ++ "//modules/common_msgs/basic_msgs:geometry_proto", + ], + ) + ++apollo_package() +diff --color -Naur common_msgs/routing_msgs/geometry.proto /opt/apollo/modules/common_msgs/routing_msgs/geometry.proto +--- common_msgs/routing_msgs/geometry.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/routing_msgs/geometry.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -0,0 +1,48 @@ ++syntax = "proto2"; ++ ++package apollo.routing; ++ ++import "modules/common_msgs/basic_msgs/geometry.proto"; ++ ++message LaneWaypoint { ++ optional string id = 1; ++ optional double s = 2; ++ optional apollo.common.PointENU pose = 3; ++ // When the developer selects a point on the dreamview route editing ++ // the direction can be specified by dragging the mouse ++ // dreamview calculates the heading based on this to support construct lane way point with heading ++ optional double heading = 4; ++} ++ ++message LaneSegment { ++ optional string id = 1; ++ optional double start_s = 2; ++ optional double end_s = 3; ++} ++ ++enum DeadEndRoutingType { ++ ROUTING_OTHER = 0; ++ ROUTING_IN = 1; ++ ROUTING_OUT = 2; ++} ++ ++message Measurement { ++ optional double distance = 1; ++} ++ ++enum ChangeLaneType { ++ FORWARD = 0; ++ LEFT = 1; ++ RIGHT = 2; ++}; ++ ++message Passage { ++ repeated LaneSegment segment = 1; ++ optional bool can_exit = 2; ++ optional ChangeLaneType change_lane_type = 3 [default = FORWARD]; ++} ++ ++message RoadSegment { ++ optional string id = 1; ++ repeated Passage passage = 2; ++} +\ No newline at end of file +diff --color -Naur common_msgs/routing_msgs/poi.proto /opt/apollo/modules/common_msgs/routing_msgs/poi.proto +--- common_msgs/routing_msgs/poi.proto 2023-12-23 18:21:36.413614904 +0800 ++++ /opt/apollo/modules/common_msgs/routing_msgs/poi.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -2,13 +2,29 @@ + + package apollo.routing; + +-import "modules/common_msgs/routing_msgs/routing.proto"; ++import "modules/common_msgs/map_msgs/map_geometry.proto"; ++import "modules/common_msgs/basic_msgs/geometry.proto"; ++import "modules/common_msgs/routing_msgs/geometry.proto"; ++ ++enum ParkingSpaceType { ++ VERTICAL_PLOT = 0; ++ PARALLEL_PARKING = 1; ++} ++ ++message ParkingInfo { ++ optional string parking_space_id = 1; ++ optional apollo.common.PointENU parking_point = 2; ++ optional ParkingSpaceType parking_space_type = 3; ++ // The four corner points are in order. ++ optional apollo.hdmap.Polygon corner_point = 4; ++} + + message Landmark { + optional string name = 1; + repeated LaneWaypoint waypoint = 2; + optional string parking_space_id = 3 [deprecated = true]; + optional apollo.routing.ParkingInfo parking_info = 4; ++ optional int32 cycle_number = 5; + } + + message POI { +diff --color -Naur common_msgs/routing_msgs/routing.proto /opt/apollo/modules/common_msgs/routing_msgs/routing.proto +--- common_msgs/routing_msgs/routing.proto 2023-12-23 18:21:36.413614904 +0800 ++++ /opt/apollo/modules/common_msgs/routing_msgs/routing.proto 2023-12-23 18:05:58.950028975 +0800 +@@ -2,92 +2,28 @@ + + package apollo.routing; + +-import "modules/common_msgs/basic_msgs/error_code.proto"; +-import "modules/common_msgs/basic_msgs/geometry.proto"; ++import "modules/common_msgs/routing_msgs/geometry.proto"; + import "modules/common_msgs/basic_msgs/header.proto"; +-import "modules/common_msgs/map_msgs/map_geometry.proto"; +-import "modules/common_msgs/map_msgs/map_parking_space.proto"; +- +-message LaneWaypoint { +- optional string id = 1; +- optional double s = 2; +- optional apollo.common.PointENU pose = 3; +- // When the developer selects a point on the dreamview route editing +- // the direction can be specified by dragging the mouse +- // dreamview calculates the heading based on this to support construct lane way point with heading +- optional double heading = 4; +-} +- +-message LaneSegment { +- optional string id = 1; +- optional double start_s = 2; +- optional double end_s = 3; +-} +- +-enum ParkingSpaceType { +- VERTICAL_PLOT = 0; +- PARALLEL_PARKING = 1; +-} +- +-enum DeadEndRoutingType { +- ROUTING_OTHER = 0; +- ROUTING_IN = 1; +- ROUTING_OUT = 2; +-} +- +-message ParkingInfo { +- optional string parking_space_id = 1; +- optional apollo.common.PointENU parking_point = 2; +- optional ParkingSpaceType parking_space_type = 3; +- // The four corner points are in order. +- optional apollo.hdmap.Polygon corner_point = 4; +-} +- +-message DeadEndInfo { +- // dead end in/out routing +- optional DeadEndRoutingType dead_end_routing_type = 1; +- // traget point from the out routing's start point +- optional apollo.common.PointENU target_point = 2; +-} ++import "modules/common_msgs/basic_msgs/error_code.proto"; ++import "modules/common_msgs/routing_msgs/poi.proto"; + + message RoutingRequest { + optional apollo.common.Header header = 1; + // at least two points. The first is start point, the end is final point. + // The routing must go through each point in waypoint. +- repeated LaneWaypoint waypoint = 2; +- repeated LaneSegment blacklisted_lane = 3; ++ repeated apollo.routing.LaneWaypoint waypoint = 2; ++ repeated apollo.routing.LaneSegment blacklisted_lane = 3; + repeated string blacklisted_road = 4; + optional bool broadcast = 5 [default = true]; +- optional apollo.hdmap.ParkingSpace parking_space = 6 [deprecated = true]; +- optional ParkingInfo parking_info = 7; +- optional DeadEndInfo dead_end_info = 8; +-} +- +-message Measurement { +- optional double distance = 1; +-} +- +-enum ChangeLaneType { +- FORWARD = 0; +- LEFT = 1; +- RIGHT = 2; +-}; +- +-message Passage { +- repeated LaneSegment segment = 1; +- optional bool can_exit = 2; +- optional ChangeLaneType change_lane_type = 3 [default = FORWARD]; +-} +- +-message RoadSegment { +- optional string id = 1; +- repeated Passage passage = 2; ++ optional apollo.routing.ParkingInfo parking_info = 6 [deprecated = true]; ++ // If the start pose is set as the first point of "way_point". ++ optional bool is_start_pose_set = 7 [default = false]; + } + + message RoutingResponse { + optional apollo.common.Header header = 1; +- repeated RoadSegment road = 2; +- optional Measurement measurement = 3; ++ repeated apollo.routing.RoadSegment road = 2; ++ optional apollo.routing.Measurement measurement = 3; + optional RoutingRequest routing_request = 4; + + // the map version which is used to build road graph +diff --color -Naur common_msgs/sensor_msgs/BUILD /opt/apollo/modules/common_msgs/sensor_msgs/BUILD +--- common_msgs/sensor_msgs/BUILD 2023-12-23 18:21:36.414614904 +0800 ++++ /opt/apollo/modules/common_msgs/sensor_msgs/BUILD 2023-12-23 18:05:58.951028975 +0800 +@@ -1,16 +1,8 @@ +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "delphi_esr_cc_proto", +- deps = [ +- ":delphi_esr_proto", +- ], +-) +- + proto_library( + name = "delphi_esr_proto", + srcs = ["delphi_esr.proto"], +@@ -19,18 +11,12 @@ + ], + ) + +-py_proto_library( +- name = "delphi_esr_py_pb2", +- deps = [ +- ":delphi_esr_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "sensor_image_cc_proto", ++proto_library( ++ name = "oculii_radar_proto", ++ srcs = ["oculii_radar.proto"], + deps = [ +- ":sensor_image_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", ++ "//modules/common_msgs/basic_msgs:error_code_proto", + ], + ) + +@@ -42,21 +28,6 @@ + ], + ) + +-py_proto_library( +- name = "sensor_image_py_pb2", +- deps = [ +- ":sensor_image_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "mobileye_cc_proto", +- deps = [ +- ":mobileye_proto", +- ], +-) +- + proto_library( + name = "mobileye_proto", + srcs = ["mobileye.proto"], +@@ -65,21 +36,6 @@ + ], + ) + +-py_proto_library( +- name = "mobileye_py_pb2", +- deps = [ +- ":mobileye_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "ultrasonic_radar_cc_proto", +- deps = [ +- ":ultrasonic_radar_proto", +- ], +-) +- + proto_library( + name = "ultrasonic_radar_proto", + srcs = ["ultrasonic_radar.proto"], +@@ -88,21 +44,6 @@ + ], + ) + +-py_proto_library( +- name = "ultrasonic_radar_py_pb2", +- deps = [ +- ":ultrasonic_radar_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "racobit_radar_cc_proto", +- deps = [ +- ":racobit_radar_proto", +- ], +-) +- + proto_library( + name = "racobit_radar_proto", + srcs = ["racobit_radar.proto"], +@@ -111,21 +52,6 @@ + ], + ) + +-py_proto_library( +- name = "racobit_radar_py_pb2", +- deps = [ +- ":racobit_radar_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "conti_radar_cc_proto", +- deps = [ +- ":conti_radar_proto", +- ], +-) +- + proto_library( + name = "conti_radar_proto", + srcs = ["conti_radar.proto"], +@@ -134,21 +60,6 @@ + ], + ) + +-py_proto_library( +- name = "conti_radar_py_pb2", +- deps = [ +- ":conti_radar_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "smartereye_cc_proto", +- deps = [ +- ":smartereye_proto", +- ], +-) +- + proto_library( + name = "smartereye_proto", + srcs = ["smartereye.proto"], +@@ -157,21 +68,6 @@ + ], + ) + +-py_proto_library( +- name = "smartereye_py_pb2", +- deps = [ +- ":smartereye_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "pointcloud_cc_proto", +- deps = [ +- ":pointcloud_proto", +- ], +-) +- + proto_library( + name = "pointcloud_proto", + srcs = ["pointcloud.proto"], +@@ -180,18 +76,11 @@ + ], + ) + +-py_proto_library( +- name = "pointcloud_py_pb2", +- deps = [ +- ":pointcloud_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "radar_cc_proto", ++proto_library( ++ name = "radarpointcloud_proto", ++ srcs = ["radarpointcloud.proto"], + deps = [ +- ":radar_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) + +@@ -205,23 +94,6 @@ + ], + ) + +-py_proto_library( +- name = "radar_py_pb2", +- deps = [ +- ":radar_proto", +- "//modules/common_msgs/basic_msgs:error_code_py_pb2", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "gnss_best_pose_cc_proto", +- deps = [ +- ":gnss_best_pose_proto", +- ], +-) +- + proto_library( + name = "gnss_best_pose_proto", + srcs = ["gnss_best_pose.proto"], +@@ -230,21 +102,6 @@ + ], + ) + +-py_proto_library( +- name = "gnss_best_pose_py_pb2", +- deps = [ +- ":gnss_best_pose_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "imu_cc_proto", +- deps = [ +- ":imu_proto", +- ], +-) +- + proto_library( + name = "imu_proto", + srcs = ["imu.proto"], +@@ -254,22 +111,6 @@ + ], + ) + +-py_proto_library( +- name = "imu_py_pb2", +- deps = [ +- ":imu_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "heading_cc_proto", +- deps = [ +- ":heading_proto", +- ], +-) +- + proto_library( + name = "heading_proto", + srcs = ["heading.proto"], +@@ -278,40 +119,11 @@ + ], + ) + +-py_proto_library( +- name = "heading_py_pb2", +- deps = [ +- ":heading_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "gnss_raw_observation_cc_proto", +- deps = [ +- ":gnss_raw_observation_proto", +- ], +-) +- + proto_library( + name = "gnss_raw_observation_proto", + srcs = ["gnss_raw_observation.proto"], + ) + +-py_proto_library( +- name = "gnss_raw_observation_py_pb2", +- deps = [ +- ":gnss_raw_observation_proto", +- ], +-) +- +-cc_proto_library( +- name = "gnss_cc_proto", +- deps = [ +- ":gnss_proto", +- ], +-) +- + proto_library( + name = "gnss_proto", + srcs = ["gnss.proto"], +@@ -321,22 +133,6 @@ + ], + ) + +-py_proto_library( +- name = "gnss_py_pb2", +- deps = [ +- ":gnss_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "ins_cc_proto", +- deps = [ +- ":ins_proto", +- ], +-) +- + proto_library( + name = "ins_proto", + srcs = ["ins.proto"], +@@ -346,11 +142,4 @@ + ], + ) + +-py_proto_library( +- name = "ins_py_pb2", +- deps = [ +- ":ins_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) ++apollo_package() +diff --color -Naur common_msgs/sensor_msgs/oculii_radar.proto /opt/apollo/modules/common_msgs/sensor_msgs/oculii_radar.proto +--- common_msgs/sensor_msgs/oculii_radar.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/sensor_msgs/oculii_radar.proto 2023-12-23 18:05:58.951028975 +0800 +@@ -0,0 +1,60 @@ ++syntax = "proto2"; ++ ++package apollo.drivers; ++ ++import "modules/common_msgs/basic_msgs/error_code.proto"; ++import "modules/common_msgs/basic_msgs/header.proto"; ++ ++message OculiiRawPointcloud { ++ optional float range = 1; ++ optional float doppler = 2; ++ optional float azimuth = 3; ++ optional float elevation = 4; ++ optional float power = 5; ++} ++ ++message OculiiPointXYZIV { ++ optional float x = 1 [default = nan]; ++ optional float y = 2 [default = nan]; ++ optional float z = 3 [default = nan]; ++ optional float intensity = 4 [default = 0]; ++ optional float velocity = 5 [default = 0]; ++} ++ ++message OculiiTrackTarget { ++ enum ObstacleClass { ++ UNKNOWN = 0; ++ PEDESTRIAN = 1; ++ BICYCLE = 2; ++ VEHICLE = 3; ++ TRUCK = 4; ++ BACKGROUND = 5; ++ } ++ optional int64 id = 1; ++ optional float x_pos = 2; ++ optional float y_pos = 3; ++ optional float z_pos = 4; ++ optional float x_dot = 5; ++ optional float y_dot = 6; ++ optional float z_dot = 7; ++ optional int32 confidence = 8; ++ optional ObstacleClass track_class = 9; ++} ++ ++message OculiiPointCloud { ++ optional apollo.common.Header header = 1; ++ optional string frame_id = 2; ++ optional bool is_dense = 3; ++ repeated OculiiPointXYZIV point = 4; ++ optional double measurement_time = 5; ++ optional int32 width = 6; ++ optional int32 height = 7; ++ optional int64 packet_id = 8; ++ optional float ego_speed = 9; ++ optional float ego_angle = 10; ++ optional int32 detection_size = 11; ++ optional int32 track_size = 12; ++ repeated OculiiRawPointcloud raw_pointclouds = 13; ++ repeated OculiiTrackTarget tracks = 14; ++} ++ +diff --color -Naur common_msgs/sensor_msgs/radarpointcloud.proto /opt/apollo/modules/common_msgs/sensor_msgs/radarpointcloud.proto +--- common_msgs/sensor_msgs/radarpointcloud.proto 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/modules/common_msgs/sensor_msgs/radarpointcloud.proto 2023-12-23 18:05:58.951028975 +0800 +@@ -0,0 +1,22 @@ ++syntax = "proto2"; ++package apollo.drivers; ++ ++import "modules/common_msgs/basic_msgs/header.proto"; ++ ++message RadarPointXYZVR { ++ optional float x = 1 [default = nan]; ++ optional float y = 2 [default = nan]; ++ optional float z = 3 [default = nan]; ++ optional float velocity = 4 [default = 0]; ++ optional float rcs = 5 [default = 0]; ++} ++ ++message RadarPointCloud { ++ optional apollo.common.Header header = 1; ++ optional string frame_id = 2; ++ optional bool is_dense = 3; ++ repeated RadarPointXYZVR point = 4; ++ optional double measurement_time = 5; ++ optional uint32 width = 6; ++ optional uint32 height = 7; ++} +diff --color -Naur common_msgs/sensor_msgs/sensor_image.proto /opt/apollo/modules/common_msgs/sensor_msgs/sensor_image.proto +--- common_msgs/sensor_msgs/sensor_image.proto 2023-12-23 18:21:36.414614904 +0800 ++++ /opt/apollo/modules/common_msgs/sensor_msgs/sensor_image.proto 2023-12-23 18:05:58.951028975 +0800 +@@ -86,4 +86,6 @@ + optional bytes data = 4; // Compressed image buffer + optional double measurement_time = 5; + optional uint32 frame_type = 6; ++ optional uint32 width = 7; ++ optional uint32 height = 8; + } +diff --color -Naur common_msgs/simulation_msgs/BUILD /opt/apollo/modules/common_msgs/simulation_msgs/BUILD +--- common_msgs/simulation_msgs/BUILD 2023-12-23 18:21:36.419614904 +0800 ++++ /opt/apollo/modules/common_msgs/simulation_msgs/BUILD 2023-12-23 18:05:58.951028975 +0800 +@@ -1,35 +1,14 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "agent_cc_proto", +- deps = [ +- ":agent_proto", +- ], +-) +- + proto_library( + name = "agent_proto", + srcs = ["agent.proto"], + ) + +-py_proto_library( +- name = "agent_py_pb2", +- deps = [ +- ":agent_proto", +- ], +-) +-cc_proto_library( +- name = "scenario_cc_proto", +- deps = [ +- ":scenario_proto", +- ], +-) +- + proto_library( + name = "scenario_proto", + srcs = ["scenario.proto"], +@@ -42,25 +21,6 @@ + ], + ) + +-py_proto_library( +- name = "scenario_py_pb2", +- deps = [ +- ":scenario_proto", +- ":agent_py_pb2", +- ":grading_metric_py_pb2", +- "//modules/common_msgs/perception_msgs:traffic_light_detection_py_pb2", +- "//modules/common_msgs/planning_msgs:pad_msg_py_pb2", +- "//modules/common_msgs/routing_msgs:routing_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "grading_metric_cc_proto", +- deps = [ +- ":grading_metric_proto", +- ], +-) +- + proto_library( + name = "grading_metric_proto", + srcs = ["grading_metric.proto"], +@@ -69,21 +29,6 @@ + ], + ) + +-py_proto_library( +- name = "grading_metric_py_pb2", +- deps = [ +- ":grading_metric_proto", +- ":grading_condition_py_pb2", +- ], +-) +- +-cc_proto_library( +- name = "grading_condition_cc_proto", +- deps = [ +- ":grading_condition_proto", +- ], +-) +- + proto_library( + name = "grading_condition_proto", + srcs = ["grading_condition.proto"], +@@ -92,11 +37,4 @@ + ], + ) + +-py_proto_library( +- name = "grading_condition_py_pb2", +- deps = [ +- ":grading_condition_proto", +- "//modules/common_msgs/map_msgs:map_geometry_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/simulation_msgs/agent.proto /opt/apollo/modules/common_msgs/simulation_msgs/agent.proto +--- common_msgs/simulation_msgs/agent.proto 2023-12-23 18:21:36.419614904 +0800 ++++ /opt/apollo/modules/common_msgs/simulation_msgs/agent.proto 2023-12-23 18:05:58.951028975 +0800 +@@ -14,6 +14,7 @@ + PEDESTRIAN = 2; + UNKNOWN_UNMOVABLE = 3; + UNKNOWN_MOVABLE = 4; ++ BIG_TRUCK = 5; + } + optional Type type = 6; + +diff --color -Naur common_msgs/storytelling_msgs/BUILD /opt/apollo/modules/common_msgs/storytelling_msgs/BUILD +--- common_msgs/storytelling_msgs/BUILD 2023-12-23 18:21:36.421614904 +0800 ++++ /opt/apollo/modules/common_msgs/storytelling_msgs/BUILD 2023-12-23 18:05:58.951028975 +0800 +@@ -1,17 +1,9 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "story_cc_proto", +- deps = [ +- ":story_proto", +- ], +-) +- + proto_library( + name = "story_proto", + srcs = ["story.proto"], +@@ -20,11 +12,4 @@ + ], + ) + +-py_proto_library( +- name = "story_py_pb2", +- deps = [ +- ":story_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/task_manager_msgs/BUILD /opt/apollo/modules/common_msgs/task_manager_msgs/BUILD +--- common_msgs/task_manager_msgs/BUILD 2023-12-23 18:21:36.422614904 +0800 ++++ /opt/apollo/modules/common_msgs/task_manager_msgs/BUILD 2023-12-23 18:05:58.951028975 +0800 +@@ -1,34 +1,17 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "task_manager_cc_proto", +- deps = [ +- ":task_manager_proto", +- ], +-) +- + proto_library( + name = "task_manager_proto", + srcs = ["task_manager.proto"], + deps = [ + "//modules/common_msgs/basic_msgs:header_proto", +- "//modules/common_msgs/map_msgs:map_parking_space_proto", + "//modules/common_msgs/routing_msgs:routing_proto", ++ "//modules/common_msgs/external_command_msgs:lane_follow_command_proto", + ], + ) + +-py_proto_library( +- name = "task_manager_py_pb2", +- deps = [ +- ":task_manager_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/map_msgs:map_parking_space_py_pb2", +- "//modules/common_msgs/routing_msgs:routing_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/task_manager_msgs/task_manager.proto /opt/apollo/modules/common_msgs/task_manager_msgs/task_manager.proto +--- common_msgs/task_manager_msgs/task_manager.proto 2023-12-23 18:21:36.422614904 +0800 ++++ /opt/apollo/modules/common_msgs/task_manager_msgs/task_manager.proto 2023-12-23 18:05:58.951028975 +0800 +@@ -3,8 +3,8 @@ + package apollo.task_manager; + + import "modules/common_msgs/basic_msgs/header.proto"; +-import "modules/common_msgs/map_msgs/map_parking_space.proto"; + import "modules/common_msgs/routing_msgs/routing.proto"; ++import "modules/common_msgs/external_command_msgs/lane_follow_command.proto"; + + enum TaskType { + CYCLE_ROUTING = 0; +@@ -22,7 +22,7 @@ + + message CycleRoutingTask { + optional int32 cycle_num = 1; +- optional apollo.routing.RoutingRequest routing_request = 2; ++ optional apollo.external_command.LaneFollowCommand lane_follow_command = 2; + } + + message ParkingRoutingTask { +diff --color -Naur common_msgs/transform_msgs/BUILD /opt/apollo/modules/common_msgs/transform_msgs/BUILD +--- common_msgs/transform_msgs/BUILD 2023-12-23 18:21:36.422614904 +0800 ++++ /opt/apollo/modules/common_msgs/transform_msgs/BUILD 2023-12-23 18:05:58.951028975 +0800 +@@ -1,17 +1,9 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "transform_cc_proto", +- deps = [ +- ":transform_proto", +- ], +-) +- + proto_library( + name = "transform_proto", + srcs = ["transform.proto"], +@@ -21,12 +13,4 @@ + ], + ) + +-py_proto_library( +- name = "transform_py_pb2", +- deps = [ +- ":transform_proto", +- "//modules/common_msgs/basic_msgs:geometry_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- ], +-) +- ++apollo_package() +diff --color -Naur common_msgs/v2x_msgs/BUILD /opt/apollo/modules/common_msgs/v2x_msgs/BUILD +--- common_msgs/v2x_msgs/BUILD 2023-12-23 18:21:36.422614904 +0800 ++++ /opt/apollo/modules/common_msgs/v2x_msgs/BUILD 2023-12-23 18:05:58.952028975 +0800 +@@ -1,32 +1,16 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_proto_library( +- name = "v2x_traffic_light_cc_proto", +- deps = [ +- ":v2x_traffic_light_proto", +- ], +-) +- + proto_library( + name = "v2x_traffic_light_proto", + srcs = ["v2x_traffic_light.proto"], + deps = [ +- "//modules/common_msgs/basic_msgs:header_proto", + "//modules/common_msgs/basic_msgs:direction_proto", ++ "//modules/common_msgs/basic_msgs:header_proto", + ], + ) + +-py_proto_library( +- name = "v2x_traffic_light_py_pb2", +- deps = [ +- ":v2x_traffic_light_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common_msgs/basic_msgs:direction_py_pb2", +- ], +-) +- ++apollo_package() diff --git a/diffs/v9/cyber.patch b/diffs/v9/cyber.patch new file mode 100644 index 0000000..6706ed3 --- /dev/null +++ b/diffs/v9/cyber.patch @@ -0,0 +1,18183 @@ +diff --color -Naur cyber/BUILD /opt/apollo/cyber/BUILD +--- cyber/BUILD 2023-12-23 18:23:13.077910841 +0800 ++++ /opt/apollo/cyber/BUILD 2023-12-23 18:05:58.566028978 +0800 +@@ -1,228 +1,71 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_binary") +-load("//tools/install:install.bzl", "install", "install_files", "install_src_files") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-cc_library( +- name = "cyber", +- linkstatic = False, +- deps = [ +- ":cyber_core", +- ], +-) +- +-install( +- name = "install", +- data = [ +- ":.release.bash", +- ":cyber_conf", +- #"//cyber/python/cyber_py3:runtime_files", +- "//cyber/proto:runtime_files", +- ":cyberfile.xml", +- "cyber.BUILD" +- ], +- data_dest = "cyber", +- targets = [ +- ":libcyber_core.so", +- ], +- library_dest = "cyber/lib", +- rename = { +- "cyber/.release.bash": "setup.bash", +- #"cyber/python/cyber_py3/cyber_py3.BUILD": "BUILD", +- "cyber/proto/py_pb2.BUILD": "BUILD", +- }, +- deps = [ +- "//cyber/python/cyber_py3:cyber_python_library", +- "//cyber/proto:pb_cyber", +- "//cyber/proto:cyber_proto_hdrs", +- "//cyber/proto:cyber_proto_so", +- "//cyber/mainboard:install", +- "//cyber/python/internal:install", +- "//cyber/tools:install", +- ], +-) +- +-install_src_files( +- name = "install_src", +- deps = [ +- ":install_cyber_src", +- ":install_cyber_hdrs" +- ], +-) +- +-install_src_files( +- name = "install_cyber_src", +- src_dir = ["."], +- dest = "cyber/src", +- filter = "*", +-) +- +-install_src_files( +- name = "install_cyber_hdrs", +- src_dir = ["."], +- dest = "cyber/include", +- filter = "*.h", +-) +- +-cc_library( +- name = "binary", ++apollo_cc_library( ++ name = "cyber_binary", + srcs = ["binary.cc"], + hdrs = ["binary.h"], + ) + +-cc_library( +- name = "state", ++apollo_cc_library( ++ name = "cyber_state", + srcs = ["state.cc"], + hdrs = ["state.h"], +- deps = [ +- "//cyber/common", +- ], +-) +- +-cc_library( +- name = "init", +- srcs = ["init.cc"], +- hdrs = ["init.h"], +- alwayslink = True, +- deps = [ +- "//cyber:binary", +- "//cyber:state", +- "//cyber/common:file", +- "//cyber/logger:async_logger", +- "//cyber/node", +- "//cyber/proto:clock_cc_proto", +- "//cyber/sysmo", +- "//cyber/time:clock", +- "//cyber/timer:timing_wheel", +- ], ++ deps = ["//cyber/common:cyber_common"], + ) + +-cc_binary( +- name = "libcyber_core.so", +- srcs = glob([ ++apollo_cc_library( ++ name = "cyber", ++ srcs = [ + "cyber.cc", ++ "init.cc", ++ ], ++ hdrs = [ + "cyber.h", +- ]), +- linkshared = True, +- linkstatic = True, +- linkopts = ["-lrt"], +- deps = [ +- "//cyber:binary", +- "//cyber:init", +- "//cyber:state", +- "//cyber/base", +- "//cyber/blocker:blocker_manager", +- "//cyber/class_loader", +- "//cyber/class_loader:class_loader_manager", +- "//cyber/common", +- "//cyber/component", +- "//cyber/component:timer_component", +- "//cyber/croutine", +- "//cyber/data", +- "//cyber/event:perf_event_cache", +- "//cyber/io", +- "//cyber/logger", +- "//cyber/logger:async_logger", +- "//cyber/message:message_traits", +- "//cyber/message:protobuf_traits", +- "//cyber/message:py_message_traits", +- "//cyber/message:raw_message_traits", +- "//cyber/node", +- "//cyber/parameter:parameter_client", +- "//cyber/parameter:parameter_server", +- "//cyber/proto:run_mode_conf_cc_proto", +- "//cyber/record", +- "//cyber/scheduler", +- "//cyber/scheduler:scheduler_factory", +- "//cyber/service", +- "//cyber/service:client", +- "//cyber/service_discovery:topology_manager", +- "//cyber/sysmo", +- "//cyber/task", +- "//cyber/time", +- "//cyber/time:clock", +- "//cyber/time:duration", +- "//cyber/time:rate", +- "//cyber/timer", +- "//cyber/transport", +- "//cyber/transport/rtps:participant", +- "//cyber/transport/rtps:sub_listener", +- "@com_github_google_glog//:glog", +- "@com_google_protobuf//:protobuf", +- "@fastrtps", ++ "init.h", + ], +- visibility = ["//visibility:public"], +-) +- +-cc_library( +- name = "cyber_core", +- srcs = ["libcyber_core.so"], +- hdrs = ["cyber.h"], ++ includes = ["."], + linkopts = ["-lrt"], + visibility = ["//visibility:public"], + deps = [ ++ ":cyber_binary", ++ ":cyber_state", ++ "//cyber/base:cyber_base", ++ "//cyber/blocker:cyber_blocker", ++ "//cyber/class_loader:cyber_class_loader", ++ "//cyber/common:cyber_common", ++ "//cyber/component:cyber_component", ++ "//cyber/context:cyber_context", ++ "//cyber/croutine:cyber_croutine", ++ "//cyber/data:cyber_data", ++ "//cyber/event:cyber_event", ++ "//cyber/io:cyber_io", ++ "//cyber/logger:cyber_logger", ++ "//cyber/message:cyber_message", ++ "//cyber/node:cyber_node", ++ "//cyber/parameter:cyber_parameter", ++ "//cyber/plugin_manager:cyber_plugin_manager", ++ "//cyber/profiler:cyber_profiler", ++ "//cyber/proto:clock_cc_proto", ++ "//cyber/proto:run_mode_conf_cc_proto", ++ "//cyber/record:cyber_record", ++ "//cyber/scheduler:cyber_scheduler", ++ "//cyber/service:cyber_service", ++ "//cyber/service_discovery:cyber_service_discovery", ++ "//cyber/service_discovery:cyber_service_discovery_role", ++ "//cyber/sysmo:cyber_sysmo", ++ "//cyber/task:cyber_task", ++ "//cyber/time:cyber_time", ++ "//cyber/timer:cyber_timer", ++ "//cyber/transport:cyber_transport", + "@com_github_google_glog//:glog", + "@com_google_protobuf//:protobuf", + "@fastrtps", +- "@com_github_gflags_gflags//:gflags", +- "//cyber/proto:run_mode_conf_cc_proto", +- "//cyber/proto:cyber_conf_cc_proto", +- "//cyber/proto:scheduler_conf_cc_proto", +- "//cyber/proto:classic_conf_cc_proto", +- "//cyber/proto:choreography_conf_cc_proto", +- "//cyber/proto:transport_conf_cc_proto", +- "//cyber/proto:perf_conf_cc_proto", +- "//cyber/proto:topology_change_cc_proto", +- "//cyber/proto:role_attributes_cc_proto", +- "//cyber/proto:proto_desc_cc_proto", +- "//cyber/proto:component_conf_cc_proto", +- "//cyber/proto:record_cc_proto", +- "//cyber/proto:parameter_cc_proto", +- "//cyber/proto:clock_cc_proto", +- "//cyber/proto:qos_profile_cc_proto", +- "//cyber:binary", +- "//cyber:init", +- "//cyber:state", +- "//cyber/base", +- "//cyber/blocker:blocker_manager", +- "//cyber/class_loader", +- "//cyber/class_loader:class_loader_manager", +- "//cyber/common", +- "//cyber/component", +- "//cyber/component:timer_component", +- "//cyber/croutine", +- "//cyber/data", +- "//cyber/event:perf_event_cache", +- "//cyber/io", +- "//cyber/logger", +- "//cyber/logger:async_logger", +- "//cyber/message:message_traits", +- "//cyber/message:protobuf_traits", +- "//cyber/message:py_message_traits", +- "//cyber/message:raw_message_traits", +- "//cyber/node", +- "//cyber/parameter:parameter_client", +- "//cyber/parameter:parameter_server", +- "//cyber/record", +- "//cyber/scheduler", +- "//cyber/scheduler:scheduler_factory", +- "//cyber/service", +- "//cyber/service:client", +- "//cyber/service_discovery:topology_manager", +- "//cyber/sysmo", +- "//cyber/task", +- "//cyber/time", +- "//cyber/time:clock", +- "//cyber/time:duration", +- "//cyber/time:rate", +- "//cyber/timer", +- "//cyber/transport", +- "//cyber/transport/rtps:participant", +- "//cyber/transport/rtps:sub_listener", + ], +- includes = ["."], + ) ++ + filegroup( + name = "cyber_conf", + srcs = glob([ +@@ -230,4 +73,6 @@ + ]), + ) + ++apollo_package() ++ + cpplint() +diff --color -Naur cyber/README.md /opt/apollo/cyber/README.md +--- cyber/README.md 2023-12-23 18:23:13.077910841 +0800 ++++ /opt/apollo/cyber/README.md 2023-12-23 18:05:58.566028978 +0800 +@@ -21,17 +21,17 @@ + + # Documents + +-* ***New!!*** [How to Develop Cyber RT inside Docker Environment on Both x86 and ARM Platform](https://github.com/ApolloAuto/apollo/tree/master/docs/cyber/CyberRT_Docker.md): Official docker image for Cyber RT development, which is easiest way to build and play with Cyber RT. On top of that, we officially support development of Cyber RT on both x86 and ARM platform. ++* ***New!!*** [How to Develop Cyber RT inside Docker Environment on Both x86 and ARM Platform](../docs/04_CyberRT/CyberRT_Docker.md): Official docker image for Cyber RT development, which is easiest way to build and play with Cyber RT. On top of that, we officially support development of Cyber RT on both x86 and ARM platform. + +-* [Apollo Cyber RT Quick Start](https://github.com/ApolloAuto/apollo/tree/master/docs/cyber/CyberRT_Quick_Start.md): Everything you need to know about how to start developing your first application module on top of Apollo Cyber RT. ++* [Apollo Cyber RT Quick Start](../docs/04_CyberRT/CyberRT_Quick_Start.md): Everything you need to know about how to start developing your first application module on top of Apollo Cyber RT. + +-* [Apollo Cyber RT Developer Tools](https://github.com/ApolloAuto/apollo/tree/master/docs/cyber/CyberRT_Developer_Tools.md): Detailed guidance on how to use the developer tools from Apollo Cyber RT. ++* [Apollo Cyber RT Developer Tools](../docs/04_CyberRT/CyberRT_Developer_Tools.md): Detailed guidance on how to use the developer tools from Apollo Cyber RT. + +-* [Apollo Cyber RT API for Developers](https://github.com/ApolloAuto/apollo/tree/master/docs/cyber/CyberRT_API_for_Developers.md): A comprehensive guide to explore all the APIs of Apollo Cyber RT, with many concrete examples in source code. ++* [Apollo Cyber RT API for Developers](../docs/04_CyberRT/CyberRT_API_for_Developers.md): A comprehensive guide to explore all the APIs of Apollo Cyber RT, with many concrete examples in source code. + +-* [Apollo Cyber RT FAQs](https://github.com/ApolloAuto/apollo/tree/master/docs/cyber/CyberRT_FAQs.md): Answers to the most frequently asked questions about Apollo Cyber RT. ++* [Apollo Cyber RT FAQs](../docs/04_CyberRT/CyberRT_FAQs.md): Answers to the most frequently asked questions about Apollo Cyber RT. + +-* [Apollo Cyber RT Terms](https://github.com/ApolloAuto/apollo/tree/master/docs/cyber/CyberRT_Terms.md): Commonly used terminologies in Cyber RT documentation and code. ++* [Apollo Cyber RT Terms](../docs/04_CyberRT/CyberRT_Terms.md): Commonly used terminologies in Cyber RT documentation and code. + + * [Apollo Cyber RT Python Wrapper](python/README.md): Develop projects in Python. + +diff --color -Naur cyber/README_cn.md /opt/apollo/cyber/README_cn.md +--- cyber/README_cn.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/README_cn.md 2023-12-23 18:05:58.566028978 +0800 +@@ -0,0 +1,41 @@ ++# cyber ++ ++## 功能介绍 ++ ++Apollo Cyber RT 是专为自动驾驶场景设计的开源高性能运行时框架。它基于集中式计算模型,针对自动驾驶中的高并发、低延迟和高吞 ++吐量进行了大幅优化。 ++ ++在过去几年的自动驾驶技术发展中,我们从之前的 Apollo 经验中学到了很多。行业在发展,阿波罗也在发展。展望未来,Apollo 已经 ++从开发走向产品化,随着在现实世界中的批量部署,我们看到了对最高级别的稳健性和性能的需求。因此,我们花了数年时间打造并完善 ++Apollo Cyber RT,以满足自动驾驶解决方案的要求。 ++ ++使用 Apollo Cyber RT 的主要优势: ++ ++- 加速开发 ++ - 明确定义的任务界面与数据融合 ++ - 一系列开发工具 ++ - 大量传感器驱动程序 ++- 简化部署 ++ - 高效的自适应信息通信 ++ - 可配置的用户级调度程序,具有资源感知功能 ++ - 可移植,依赖性更低 ++- 为自己的自动驾驶汽车赋能 ++ - 默认的开源运行时框架 ++ - 专为自动驾驶设计的构件 ++ - 即插即用您自己的 AD 系统 ++ ++### 相关文档 ++ ++@subpage md_cyber_2docs_2cyber\_\_quick\_\_start\_\_cn "Apollo Cyber RT 快速开始" ++ ++@subpage md_cyber_2docs_2cyber\_\_developer\_\_tools "Apollo Cyber RT 开发者工具" ++ ++@subpage md_cyber_2docs_2cyber\_\_api\_\_for\_\_developers "Apollo Cyber RT API" ++ ++@subpage md_cyber_2docs_2cyber\_\_python\_\_api\_\_cn "Apollo Cyber RT Python API" ++ ++@subpage md_cyber_2docs_2cyber\_\_faqs "Apollo Cyber RT FAQs" ++ ++@subpage md_cyber_2docs_2cyber\_\_terms "Apollo Cyber RT 术语" ++ ++@subpage md_cyber_2docs_2cyber\_\_scheduler\_\_cn "Apollo Cyber RT 调度策略" +diff --color -Naur cyber/base/BUILD /opt/apollo/cyber/base/BUILD +--- cyber/base/BUILD 2023-12-23 18:23:13.077910841 +0800 ++++ /opt/apollo/cyber/base/BUILD 2023-12-23 18:05:58.566028978 +0800 +@@ -1,129 +1,69 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_base_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "base", +- deps = [ +- "//cyber/base:atomic_hash_map", +- "//cyber/base:atomic_rw_lock", +- "//cyber/base:bounded_queue", +- "//cyber/base:concurrent_object_pool", +- "//cyber/base:for_each", +- "//cyber/base:macros", +- "//cyber/base:object_pool", +- "//cyber/base:reentrant_rw_lock", +- "//cyber/base:rw_lock_guard", +- "//cyber/base:signal", +- "//cyber/base:thread_pool", +- "//cyber/base:thread_safe_queue", +- "//cyber/base:unbounded_queue", +- "//cyber/base:wait_strategy", ++apollo_cc_library( ++ name = "cyber_base", ++ hdrs = [ ++ "atomic_hash_map.h", ++ "atomic_rw_lock.h", ++ "bounded_queue.h", ++ "concurrent_object_pool.h", ++ "for_each.h", ++ "macros.h", ++ "object_pool.h", ++ "reentrant_rw_lock.h", ++ "rw_lock_guard.h", ++ "signal.h", ++ "thread_pool.h", ++ "thread_safe_queue.h", ++ "unbounded_queue.h", ++ "wait_strategy.h", + ], + ) + +-cc_library( +- name = "atomic_hash_map", +- hdrs = ["atomic_hash_map.h"], +-) +- +-cc_test( ++apollo_cc_test( + name = "atomic_hash_map_test", + size = "small", + srcs = ["atomic_hash_map_test.cc"], + deps = [ +- "//cyber/base:atomic_hash_map", ++ ":cyber_base", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "atomic_rw_lock", +- hdrs = ["atomic_rw_lock.h"], +- deps = [ +- "//cyber/base:rw_lock_guard", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "atomic_rw_lock_test", + size = "small", + srcs = ["atomic_rw_lock_test.cc"], + deps = [ +- "//cyber/base:atomic_rw_lock", +- "//cyber/base:reentrant_rw_lock", ++ ":cyber_base", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "bounded_queue", +- hdrs = ["bounded_queue.h"], +- deps = [ +- "//cyber/base:macros", +- "//cyber/base:wait_strategy", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "bounded_queue_test", + size = "small", + srcs = ["bounded_queue_test.cc"], + deps = [ +- "//cyber/base:bounded_queue", ++ ":cyber_base", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "concurrent_object_pool", +- hdrs = ["concurrent_object_pool.h"], +- deps = [ +- "//cyber/base:for_each", +- ], +-) +- +-cc_library( +- name = "for_each", +- hdrs = ["for_each.h"], +- deps = [ +- "//cyber/base:macros", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "for_each_test", + size = "small", + srcs = ["for_each_test.cc"], + deps = [ +- "//cyber/base:for_each", ++ "cyber_base", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "macros", +- hdrs = ["macros.h"], +-) +- +-cc_library( +- name = "object_pool", +- hdrs = ["object_pool.h"], +- deps = [ +- "//cyber/base:for_each", +- "//cyber/base:macros", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "object_pool_test", + size = "small", + srcs = ["object_pool_test.cc"], +@@ -131,65 +71,30 @@ + "-latomic", + ], + deps = [ +- "//cyber/base:concurrent_object_pool", +- "//cyber/base:object_pool", ++ ":cyber_base", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "reentrant_rw_lock", +- hdrs = ["reentrant_rw_lock.h"], +-) +- +-cc_library( +- name = "rw_lock_guard", +- hdrs = ["rw_lock_guard.h"], +-) +- +-cc_library( +- name = "signal", +- hdrs = ["signal.h"], +-) +- +-cc_test( ++apollo_cc_test( + name = "signal_test", + size = "small", + srcs = ["signal_test.cc"], + deps = [ +- "//cyber/base:signal", ++ ":cyber_base", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "thread_pool", +- hdrs = ["thread_pool.h"], +-) +- +-cc_library( +- name = "thread_safe_queue", +- hdrs = ["thread_safe_queue.h"], +-) +- +-cc_library( +- name = "unbounded_queue", +- hdrs = ["unbounded_queue.h"], +-) +- +-cc_test( ++apollo_cc_test( + name = "unbounded_queue_test", + size = "small", + srcs = ["unbounded_queue_test.cc"], + deps = [ +- "//cyber/base:unbounded_queue", ++ ":cyber_base", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "wait_strategy", +- hdrs = ["wait_strategy.h"], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/blocker/BUILD /opt/apollo/cyber/blocker/BUILD +--- cyber/blocker/BUILD 2023-12-23 18:23:13.078910841 +0800 ++++ /opt/apollo/cyber/blocker/BUILD 2023-12-23 18:05:58.567028978 +0800 +@@ -1,25 +1,22 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_blocker_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "blocker_manager", +- srcs = ["blocker_manager.cc"], +- hdrs = ["blocker_manager.h"], +- deps = [ +- ":blocker", ++apollo_cc_library( ++ name = "cyber_blocker", ++ srcs = [ ++ "blocker_manager.cc", ++ ], ++ hdrs = [ ++ "blocker_manager.h", ++ "blocker.h", ++ "intra_reader.h", ++ "intra_writer.h", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "blocker_manager_test", + size = "small", + srcs = ["blocker_manager_test.cc"], +@@ -30,12 +27,7 @@ + ], + ) + +-cc_library( +- name = "blocker", +- hdrs = ["blocker.h"], +-) +- +-cc_test( ++apollo_cc_test( + name = "blocker_test", + size = "small", + srcs = ["blocker_test.cc"], +@@ -46,20 +38,5 @@ + ], + ) + +-cc_library( +- name = "intra_reader", +- hdrs = ["intra_reader.h"], +- deps = [ +- ":blocker_manager", +- ], +-) +- +-cc_library( +- name = "intra_writer", +- hdrs = ["intra_writer.h"], +- deps = [ +- ":blocker_manager", +- ], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/class_loader/BUILD /opt/apollo/cyber/class_loader/BUILD +--- cyber/class_loader/BUILD 2023-12-23 18:23:13.078910841 +0800 ++++ /opt/apollo/cyber/class_loader/BUILD 2023-12-23 18:05:58.567028978 +0800 +@@ -1,61 +1,41 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_class_loader_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "class_loader", +- srcs = ["class_loader.cc"], +- hdrs = ["class_loader.h"], +- alwayslink = True, +- deps = [ +- ":class_loader_register_macro", +- "//cyber/class_loader/shared_library", +- "//cyber/class_loader/utility:class_factory", +- "//cyber/class_loader/utility:class_loader_utility", +- "//cyber/common:log", ++apollo_cc_library( ++ name = "cyber_class_loader", ++ srcs = [ ++ "class_loader.cc", ++ "class_loader_manager.cc" + ], +-) +- +-cc_library( +- name = "class_loader_register_macro", +- hdrs = ["class_loader_register_macro.h"], +- deps = [ +- "//cyber/class_loader/utility:class_loader_utility", ++ hdrs = [ ++ "class_loader.h", ++ "class_loader_register_macro.h", ++ "class_loader_manager.h" + ], +-) +- +-cc_library( +- name = "class_loader_manager", +- srcs = ["class_loader_manager.cc"], +- hdrs = ["class_loader_manager.h"], +- alwayslink = True, + deps = [ +- ":class_loader", ++ "//cyber/class_loader/shared_library", ++ "//cyber/class_loader/utility:class_loader_utility", ++ "//cyber/common:cyber_common", + ], + ) + +-cc_test( +- name = "class_loader_test", +- size = "small", +- srcs = ["class_loader_test.cc"], +- data = [ +- "//cyber/class_loader/test:plugin1", +- "//cyber/class_loader/test:plugin2", +- ], +- deps = [ +- "//cyber", +- "//cyber/class_loader/test:base", +- "//cyber/proto:unit_test_cc_proto", +- "@com_google_googletest//:gtest", +- ], +-) ++# apollo_cc_test( ++# name = "class_loader_test", ++# size = "small", ++# srcs = ["class_loader_test.cc"], ++# data = [ ++# "//cyber/class_loader/test:plugin1", ++# "//cyber/class_loader/test:plugin2", ++# ], ++# deps = [ ++# "//cyber", ++# "//cyber/class_loader/test:base", ++# "//cyber/proto:unit_test_cc_proto", ++# "@com_google_googletest//:gtest", ++# ], ++# ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/class_loader/class_loader.h /opt/apollo/cyber/class_loader/class_loader.h +--- cyber/class_loader/class_loader.h 2023-12-23 18:23:13.078910841 +0800 ++++ /opt/apollo/cyber/class_loader/class_loader.h 2023-12-23 18:05:58.567028978 +0800 +@@ -100,8 +100,8 @@ + return; + } + +- std::lock_guard lck(classobj_ref_count_mutex_); + delete obj; ++ std::lock_guard lck(classobj_ref_count_mutex_); + --classobj_ref_count_; + } + +diff --color -Naur cyber/class_loader/class_loader_manager.h /opt/apollo/cyber/class_loader/class_loader_manager.h +--- cyber/class_loader/class_loader_manager.h 2023-12-23 18:23:13.078910841 +0800 ++++ /opt/apollo/cyber/class_loader/class_loader_manager.h 2023-12-23 18:05:58.567028978 +0800 +@@ -47,6 +47,14 @@ + template + std::vector GetValidClassNames(); + ++ /** ++ * @brief get pathof library that class belongs to ++ * @param class_name derived class ++ * @return path of library that containing the derived class ++ */ ++ template ++ std::string GetClassValidLibrary(const std::string& class_name); ++ + private: + ClassLoader* GetClassLoaderByLibPath(const std::string& library_path); + std::vector GetAllValidClassLoaders(); +@@ -102,6 +110,19 @@ + return valid_classes; + } + ++template ++std::string ClassLoaderManager::GetClassValidLibrary( ++ const std::string& class_name) { ++ for (auto& lib_class_loader : libpath_loader_map_) { ++ if (lib_class_loader.second != nullptr) { ++ if (lib_class_loader.second->IsClassValid(class_name)) { ++ return lib_class_loader.first; ++ } ++ } ++ } ++ return ""; ++} ++ + } // namespace class_loader + } // namespace cyber + } // namespace apollo +diff --color -Naur cyber/class_loader/class_loader_register_macro.h /opt/apollo/cyber/class_loader/class_loader_register_macro.h +--- cyber/class_loader/class_loader_register_macro.h 2023-12-23 18:23:13.078910841 +0800 ++++ /opt/apollo/cyber/class_loader/class_loader_register_macro.h 2023-12-23 18:05:58.567028978 +0800 +@@ -37,4 +37,4 @@ + #define CLASS_LOADER_REGISTER_CLASS(Derived, Base) \ + CLASS_LOADER_REGISTER_CLASS_INTERNAL_1(Derived, Base, __COUNTER__) + +-#endif // CYBER_CLASS_LOADER_CLASS_LOADER_REGISTER_MACRO_H_ ++#endif // CYBER_CLASS_LOADER_CLASS_LOADER_REGISTER_MACRO_H_ +diff --color -Naur cyber/class_loader/shared_library/BUILD /opt/apollo/cyber/class_loader/shared_library/BUILD +--- cyber/class_loader/shared_library/BUILD 2023-12-23 18:23:13.079910841 +0800 ++++ /opt/apollo/cyber/class_loader/shared_library/BUILD 2023-12-23 18:05:58.567028978 +0800 +@@ -1,55 +1,31 @@ +-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test", "apollo_cc_binary") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_class_loader_shared_library_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +-cc_library( ++apollo_cc_library( + name = "shared_library", + srcs = ["shared_library.cc"], +- hdrs = ["shared_library.h"], ++ hdrs = ["shared_library.h", "exceptions.h"], + linkopts = ["-ldl"], +- deps = [ +- ":exceptions", +- ], + ) + +-cc_library( +- name = "exceptions", +- hdrs = ["exceptions.h"], +-) +- +-cc_binary( +- name = "libsample.so", ++apollo_cc_binary( ++ name = "libcyber_sample.so", ++ srcs = ["sample.cc", "sample.h"], ++ linkopts = ["-lm"], + testonly = True, + linkshared = True, + linkstatic = False, + visibility = ["//visibility:private"], +- deps = [ +- ":sample_lib", +- ], +-) +- +-cc_library( +- name = "sample_lib", +- testonly = True, +- srcs = ["sample.cc"], +- hdrs = ["sample.h"], +- linkopts = ["-lm"], +- visibility = ["//visibility:private"], + ) + +-cc_test( ++apollo_cc_test( + name = "shared_library_test", + size = "small", + srcs = ["shared_library_test.cc"], + data = [ +- ":libsample.so", ++ ":libcyber_sample.so", + ], + deps = [ + ":shared_library", +@@ -57,4 +33,5 @@ + ], + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/class_loader/shared_library/shared_library_test.cc /opt/apollo/cyber/class_loader/shared_library/shared_library_test.cc +--- cyber/class_loader/shared_library/shared_library_test.cc 2023-12-23 18:23:13.079910841 +0800 ++++ /opt/apollo/cyber/class_loader/shared_library/shared_library_test.cc 2023-12-23 18:05:58.568028978 +0800 +@@ -23,7 +23,7 @@ + namespace { + + const std::string& SAMPLE_LIB = +- "/apollo/bazel-bin/cyber/class_loader/shared_library/libsample.so"; ++ "/apollo/bazel-bin/cyber/class_loader/shared_library/libcyber_sample.so"; + constexpr double epsilon = 1.0e-8; + + } // namespace +diff --color -Naur cyber/class_loader/test/BUILD /opt/apollo/cyber/class_loader/test/BUILD +--- cyber/class_loader/test/BUILD 2023-12-23 18:23:13.079910841 +0800 ++++ /opt/apollo/cyber/class_loader/test/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,32 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-cc_library( +- name = "base", +- testonly = True, +- hdrs = ["base.h"], +-) +- +-cc_library( +- name = "plugin1", +- testonly = True, +- srcs = ["plugin1.cc"], +- deps = [ +- ":base", +- "//cyber/class_loader:class_loader_manager", +- ], +-) +- +-cc_library( +- name = "plugin2", +- testonly = True, +- srcs = ["plugin2.cc"], +- deps = [ +- ":base", +- "//cyber/class_loader:class_loader_manager", +- ], +-) +- +-cpplint() +diff --color -Naur cyber/class_loader/utility/BUILD /opt/apollo/cyber/class_loader/utility/BUILD +--- cyber/class_loader/utility/BUILD 2023-12-23 18:23:13.079910841 +0800 ++++ /opt/apollo/cyber/class_loader/utility/BUILD 2023-12-23 18:05:58.568028978 +0800 +@@ -1,32 +1,17 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_class_loader_utility_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "class_factory", +- srcs = ["class_factory.cc"], +- hdrs = ["class_factory.h"], +- alwayslink = True, +-) +- +-cc_library( ++apollo_cc_library( + name = "class_loader_utility", +- srcs = ["class_loader_utility.cc"], +- hdrs = ["class_loader_utility.h"], ++ srcs = ["class_loader_utility.cc", "class_factory.cc"], ++ hdrs = ["class_loader_utility.h", "class_factory.h"], + deps = [ +- ":class_factory", + "//cyber/class_loader/shared_library", +- "//cyber/common:log", ++ "//cyber/common:cyber_common", + ], +- alwayslink = True, + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/common/BUILD /opt/apollo/cyber/common/BUILD +--- cyber/common/BUILD 2023-12-23 18:23:13.079910841 +0800 ++++ /opt/apollo/cyber/common/BUILD 2023-12-23 18:05:58.568028978 +0800 +@@ -1,34 +1,38 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-cc_library( +- name = "common", +- deps = [ +- "//cyber/common:environment", +- "//cyber/common:file", +- "//cyber/common:global_data", +- "//cyber/common:log", +- "//cyber/common:macros", +- "//cyber/common:time_conversion", +- "//cyber/common:types", +- "//cyber/common:util", ++apollo_cc_library( ++ name = "cyber_common", ++ srcs = [ ++ "global_data.cc", ++ "file.cc", ++ ], ++ data = [ ++ "//cyber:cyber_conf", ++ ], ++ hdrs = [ ++ "environment.h", ++ "file.h", ++ "global_data.h", ++ "log.h", ++ "macros.h", ++ "time_conversion.h", ++ "types.h", ++ "util.h", + ], +-) +- +-cc_library( +- name = "file", +- srcs = ["file.cc"], +- hdrs = ["file.h"], + deps = [ +- "//cyber/common:log", +- "@com_google_protobuf//:protobuf", ++ "//cyber:cyber_binary", ++ "//cyber/base:cyber_base", ++ "//cyber/proto:cyber_conf_cc_proto", + "@com_github_nlohmann_json//:json", ++ "@com_google_protobuf//:protobuf", ++ "@com_github_google_glog//:glog", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "file_test", + size = "small", + srcs = ["file_test.cc"], +@@ -39,63 +43,28 @@ + ], + ) + +-cc_library( +- name = "log", +- hdrs = ["log.h"], +- deps = [ +- "//cyber:binary", +- "@com_github_google_glog//:glog", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "log_test", + size = "small", + srcs = ["log_test.cc"], ++ linkstatic = True, + deps = [ + "//cyber", + "@com_google_googletest//:gtest_main", + ], +- linkstatic = True, + ) + +-cc_library( +- name = "environment", +- hdrs = ["environment.h"], +- deps = [ +- "//cyber/common:log", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "environment_test", + size = "small", + srcs = ["environment_test.cc"], + deps = [ +- ":environment", ++ ":cyber_common", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "global_data", +- srcs = ["global_data.cc"], +- hdrs = ["global_data.h"], +- data = [ +- "//cyber:cyber_conf", +- ], +- deps = [ +- "//cyber/base:atomic_hash_map", +- "//cyber/base:atomic_rw_lock", +- "//cyber/common:environment", +- "//cyber/common:file", +- "//cyber/common:macros", +- "//cyber/common:util", +- "//cyber/proto:cyber_conf_cc_proto", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "macros_test", + size = "small", + srcs = ["macros_test.cc"], +@@ -105,27 +74,6 @@ + ], + ) + +-cc_library( +- name = "macros", +- hdrs = ["macros.h"], +- deps = [ +- "//cyber/base:macros", +- ], +-) +- +-cc_library( +- name = "time_conversion", +- hdrs = ["time_conversion.h"], +-) +- +-cc_library( +- name = "types", +- hdrs = ["types.h"], +-) +- +-cc_library( +- name = "util", +- hdrs = ["util.h"], +-) ++apollo_package() + + cpplint() +diff --color -Naur cyber/common/file.cc /opt/apollo/cyber/common/file.cc +--- cyber/common/file.cc 2023-12-23 18:23:13.079910841 +0800 ++++ /opt/apollo/cyber/common/file.cc 2023-12-23 18:05:58.568028978 +0800 +@@ -111,6 +111,10 @@ + + bool GetProtoFromFile(const std::string &file_name, + google::protobuf::Message *message) { ++ if (!PathExists(file_name)) { ++ AERROR << "File [" << file_name << "] does not exist! "; ++ return false; ++ } + // Try the binary parser first if it's much likely a binary proto. + static const std::string kBinExt = ".bin"; + if (std::equal(kBinExt.rbegin(), kBinExt.rend(), file_name.rbegin())) { +@@ -173,6 +177,13 @@ + return stat(path.c_str(), &info) == 0; + } + ++bool PathIsAbsolute(const std::string &path) { ++ if (path.empty()) { ++ return false; ++ } ++ return path.front() == '/'; ++} ++ + bool DirectoryExists(const std::string &directory_path) { + struct stat info; + return stat(directory_path.c_str(), &info) == 0 && (info.st_mode & S_IFDIR); +@@ -326,6 +337,47 @@ + return result; + } + ++size_t FindPathByPattern(const std::string &base_path, const std::string &patt, ++ const unsigned char d_type, const bool recursive, ++ std::vector *result_list) { ++ DIR *directory = opendir(base_path.c_str()); ++ size_t result_cnt = 0; ++ if (directory == nullptr) { ++ AWARN << "cannot open directory " << base_path; ++ return result_cnt; ++ } ++ struct dirent *entry; ++ for (entry = readdir(directory); entry != nullptr; ++ entry = readdir(directory)) { ++ std::string entry_path = base_path + "/" + std::string(entry->d_name); ++ // skip `.` and `..` ++ if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { ++ // TODO(liangjinping): support regex or glob or other pattern mode ++ if ((patt == "" || strcmp(entry->d_name, patt.c_str()) == 0) && ++ entry->d_type == d_type) { ++ // found ++ result_list->emplace_back(entry_path); ++ ++result_cnt; ++ } ++ if (recursive && (entry->d_type == DT_DIR)) { ++ result_cnt += ++ FindPathByPattern(entry_path, patt, d_type, recursive, result_list); ++ } ++ } ++ } ++ closedir(directory); ++ return result_cnt; ++} ++ ++std::string GetDirName(const std::string &path) { ++ std::string::size_type end = path.rfind('/'); ++ if (end == std::string::npos) { ++ // not found, return current dir ++ return "."; ++ } ++ return path.substr(0, end); ++} ++ + std::string GetFileName(const std::string &path, const bool remove_extension) { + std::string::size_type start = path.rfind('/'); + if (start == std::string::npos) { +@@ -347,6 +399,58 @@ + return path.substr(start, len); + } + ++bool GetFilePathWithEnv(const std::string &path, const std::string &env_var, ++ std::string *file_path) { ++ if (path.empty()) { ++ return false; ++ } ++ if (PathIsAbsolute(path)) { ++ // an absolute path ++ *file_path = path; ++ return PathExists(path); ++ } ++ ++ bool relative_path_exists = false; ++ if (PathExists(path)) { ++ // relative path exists ++ *file_path = path; ++ relative_path_exists = true; ++ } ++ if (path.front() == '.') { ++ // relative path but not exist. ++ return relative_path_exists; ++ } ++ ++ const char *var = std::getenv(env_var.c_str()); ++ if (var == nullptr) { ++ AWARN << "GetFilePathWithEnv: env " << env_var << " not found."; ++ return relative_path_exists; ++ } ++ std::string env_path = std::string(var); ++ ++ // search by environment variable ++ size_t begin = 0; ++ size_t index; ++ do { ++ index = env_path.find(':', begin); ++ auto p = env_path.substr(begin, index - begin); ++ if (p.empty()) { ++ continue; ++ } ++ if (p.back() != '/') { ++ p += '/' + path; ++ } else { ++ p += path; ++ } ++ if (PathExists(p)) { ++ *file_path = p; ++ return true; ++ } ++ begin = index + 1; ++ } while (index != std::string::npos); ++ return relative_path_exists; ++} ++ + std::string GetCurrentPath() { + char tmp[PATH_MAX]; + return getcwd(tmp, sizeof(tmp)) ? std::string(tmp) : std::string(""); +diff --color -Naur cyber/common/file.h /opt/apollo/cyber/common/file.h +--- cyber/common/file.h 2023-12-23 18:23:13.079910841 +0800 ++++ /opt/apollo/cyber/common/file.h 2023-12-23 18:05:58.568028978 +0800 +@@ -104,15 +104,15 @@ + google::protobuf::Message *message); + + /** +- * @brief Parses the content of the json file specified by the file_name as ascii +- * representation of protobufs, and merges the parsed content to the ++ * @brief Parses the content of the json file specified by the file_name as ++ * ascii representation of protobufs, and merges the parsed content to the + * proto. + * @param file_name The name of the file to parse whose content. + * @param message The proto to carry the parsed content in the specified file. + * @return If the action is successful. + */ + bool GetProtoFromJsonFile(const std::string &file_name, +- google::protobuf::Message *message); ++ google::protobuf::Message *message); + + /** + * @brief Get file content as string. +@@ -136,6 +136,8 @@ + */ + bool PathExists(const std::string &path); + ++bool PathIsAbsolute(const std::string &path); ++ + /** + * @brief Check if the directory specified by directory_path exists + * and is indeed a directory. +@@ -201,9 +203,45 @@ + std::vector ListSubPaths(const std::string &directory_path, + const unsigned char d_type = DT_DIR); + ++/** ++ * @brief Find path with pattern ++ * @param base_path search root ++ * @param patt pattern to compare with entry->d_name for filter ++ * @param d_type entry type for filter ++ * @param recursive search directory recursively ++ * @param result_list a vector reference for storing the search result ++ * @return the result count ++ */ ++size_t FindPathByPattern(const std::string &base_path, const std::string &patt, ++ const unsigned char d_type, const bool recursive, ++ std::vector *result_list); ++ ++/** ++ * @brief get directory name of path ++ * @param path ++ * @return dirname of path ++ */ ++std::string GetDirName(const std::string &path); ++ + std::string GetFileName(const std::string &path, + const bool remove_extension = false); + ++/** ++ * @brief get file path, judgement priority: ++ * 1. absolute path. ++ * 2. relative path starts with '.'. ++ * 3. add environment variable prefix before the path. ++ * 4. a common relative path. ++ * ++ * @param path input file path string. ++ * @param env_var environment var string. ++ * @param file_path the output file path. ++ * ++ * @return if no valid path found, return false. ++ */ ++bool GetFilePathWithEnv(const std::string &path, const std::string &env_var, ++ std::string *file_path); ++ + std::string GetCurrentPath(); + + // delete file including file or directory +@@ -212,6 +250,22 @@ + bool GetType(const std::string &filename, FileType *type); + + bool CreateDir(const std::string &dir); ++ ++template ++bool LoadConfig(const std::string &relative_path, T *config) { ++ CHECK_NOTNULL(config); ++ // todo: get config base relative path ++ std::string actual_config_path; ++ if (!GetFilePathWithEnv(relative_path, "APOLLO_CONF_PATH", ++ &actual_config_path)) { ++ AERROR << "conf file [" << relative_path ++ << "] is not found in APOLLO_CONF_PATH"; ++ return false; ++ } ++ AINFO << "load conf file: " << actual_config_path; ++ return GetProtoFromFile(actual_config_path, config); ++} ++ + } // namespace common + } // namespace cyber + } // namespace apollo +diff --color -Naur cyber/component/BUILD /opt/apollo/cyber/component/BUILD +--- cyber/component/BUILD 2023-12-23 18:23:13.080910841 +0800 ++++ /opt/apollo/cyber/component/BUILD 2023-12-23 18:05:58.569028978 +0800 +@@ -1,25 +1,31 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_component_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "component", +- hdrs = ["component.h"], ++apollo_cc_library( ++ name = "cyber_component", ++ hdrs = [ ++ "component.h", ++ "timer_component.h", ++ "component_base.h", ++ ], ++ srcs = [ ++ "timer_component.cc" ++ ], + deps = [ +- ":component_base", +- "//cyber/scheduler", ++ "//cyber/scheduler:cyber_scheduler", ++ "//cyber/blocker:cyber_blocker", ++ "//cyber/timer:cyber_timer", ++ "//cyber/transport:cyber_transport", ++ "//cyber/base:cyber_base", ++ "//cyber/class_loader:cyber_class_loader", ++ "//cyber/node:cyber_node", ++ "@com_github_gflags_gflags//:gflags", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "component_test", + size = "small", + srcs = ["component_test.cc"], +@@ -30,21 +36,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "timer_component", +- srcs = ["timer_component.cc"], +- hdrs = ["timer_component.h"], +- deps = [ +- ":component_base", +- "//cyber/blocker:blocker_manager", +- "//cyber/timer", +- "//cyber/transport/message:history", +- "//cyber/transport/transmitter", +- ], +- alwayslink = True, +-) +- +-cc_test( ++apollo_cc_test( + name = "timer_component_test", + size = "small", + srcs = ["timer_component_test.cc"], +@@ -55,16 +47,5 @@ + linkstatic = True, + ) + +-cc_library( +- name = "component_base", +- hdrs = ["component_base.h"], +- deps = [ +- "//cyber/base:signal", +- "//cyber/base:thread_pool", +- "//cyber/class_loader", +- "//cyber/node", +- "@com_github_gflags_gflags//:gflags", +- ], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/component/component_base.h /opt/apollo/cyber/component/component_base.h +--- cyber/component/component_base.h 2023-12-23 18:23:13.080910841 +0800 ++++ /opt/apollo/cyber/component/component_base.h 2023-12-23 18:05:58.569028978 +0800 +@@ -71,19 +71,22 @@ + + void LoadConfigFiles(const ComponentConfig& config) { + if (!config.config_file_path().empty()) { +- if (config.config_file_path()[0] != '/') { +- config_file_path_ = common::GetAbsolutePath(common::WorkRoot(), +- config.config_file_path()); +- } else { ++ if (!common::GetFilePathWithEnv(config.config_file_path(), ++ "APOLLO_CONF_PATH", &config_file_path_)) { ++ AERROR << "conf file [" << config.config_file_path() << "] not found!"; + config_file_path_ = config.config_file_path(); ++ } else { ++ AINFO << "use config file: " << config_file_path_; + } + } + + if (!config.flag_file_path().empty()) { + std::string flag_file_path = config.flag_file_path(); +- if (flag_file_path[0] != '/') { +- flag_file_path = +- common::GetAbsolutePath(common::WorkRoot(), flag_file_path); ++ if (!common::GetFilePathWithEnv(config.flag_file_path(), ++ "APOLLO_FLAG_PATH", &flag_file_path)) { ++ AERROR << "flag file [" << config.flag_file_path() << "] not found!"; ++ } else { ++ AINFO << "use flag file: " << flag_file_path; + } + google::SetCommandLineOption("flagfile", flag_file_path.c_str()); + } +@@ -91,19 +94,22 @@ + + void LoadConfigFiles(const TimerComponentConfig& config) { + if (!config.config_file_path().empty()) { +- if (config.config_file_path()[0] != '/') { +- config_file_path_ = common::GetAbsolutePath(common::WorkRoot(), +- config.config_file_path()); +- } else { ++ if (!common::GetFilePathWithEnv(config.config_file_path(), ++ "APOLLO_CONF_PATH", &config_file_path_)) { ++ AERROR << "conf file [" << config.config_file_path() << "] not found!"; + config_file_path_ = config.config_file_path(); ++ } else { ++ AINFO << "use config file: " << config_file_path_; + } + } + + if (!config.flag_file_path().empty()) { + std::string flag_file_path = config.flag_file_path(); +- if (flag_file_path[0] != '/') { +- flag_file_path = +- common::GetAbsolutePath(common::WorkRoot(), flag_file_path); ++ if (!common::GetFilePathWithEnv(config.flag_file_path(), ++ "APOLLO_FLAG_PATH", &flag_file_path)) { ++ AERROR << "flag file [" << config.flag_file_path() << "] not found!"; ++ } else { ++ AINFO << "use flag file: " << flag_file_path; + } + google::SetCommandLineOption("flagfile", flag_file_path.c_str()); + } +diff --color -Naur cyber/component/timer_component.cc /opt/apollo/cyber/component/timer_component.cc +--- cyber/component/timer_component.cc 2023-12-23 18:23:13.080910841 +0800 ++++ /opt/apollo/cyber/component/timer_component.cc 2023-12-23 18:05:58.569028978 +0800 +@@ -42,6 +42,7 @@ + if (!Init()) { + return false; + } ++ interval_ = config.interval(); + + std::shared_ptr self = + std::dynamic_pointer_cast(shared_from_this()); +@@ -53,7 +54,7 @@ + + void TimerComponent::Clear() { timer_.reset(); } + +-uint64_t TimerComponent::GetInterval() const { return interval_; } ++uint32_t TimerComponent::GetInterval() const { return interval_; } + + } // namespace cyber + } // namespace apollo +diff --color -Naur cyber/component/timer_component.h /opt/apollo/cyber/component/timer_component.h +--- cyber/component/timer_component.h 2023-12-23 18:23:13.080910841 +0800 ++++ /opt/apollo/cyber/component/timer_component.h 2023-12-23 18:05:58.569028978 +0800 +@@ -47,7 +47,7 @@ + bool Initialize(const TimerComponentConfig& config) override; + void Clear() override; + bool Process(); +- uint64_t GetInterval() const; ++ uint32_t GetInterval() const; + + private: + /** +@@ -57,7 +57,7 @@ + */ + virtual bool Proc() = 0; + +- uint64_t interval_ = 0; ++ uint32_t interval_ = 0; + std::unique_ptr timer_; + }; + +diff --color -Naur cyber/context/BUILD /opt/apollo/cyber/context/BUILD +--- cyber/context/BUILD 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/context/BUILD 2023-12-23 18:05:58.569028978 +0800 +@@ -0,0 +1,30 @@ ++load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_cc_test", "apollo_package") ++ ++package(default_visibility = ["//visibility:public"]) ++ ++apollo_cc_library( ++ name = "cyber_context", ++ srcs = [ ++ ], ++ hdrs = [ ++ "context.h", ++ ], ++ deps = [ ++ ], ++) ++ ++apollo_cc_test( ++ name = "cyber_context_test", ++ size = "small", ++ srcs = ["context_test.cc"], ++ linkstatic = True, ++ deps = [ ++ ":cyber_context", ++ "@com_google_googletest//:gtest_main", ++ ], ++) ++ ++apollo_package() ++ ++cpplint() +diff --color -Naur cyber/context/context.h /opt/apollo/cyber/context/context.h +--- cyber/context/context.h 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/context/context.h 2023-12-23 18:05:58.569028978 +0800 +@@ -0,0 +1,136 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++#pragma once ++#include ++#include ++#include ++#include ++#include ++#include ++ ++namespace apollo { ++namespace cyber { ++namespace context { ++ ++class Context { ++ public: ++ Context() = default; ++ ~Context() = default; ++ ++ /** ++ * @brief Set value to context. ++ * ++ * @tparam T type of value ++ * @param key string key ++ * @param value shared_ptr of T ++ */ ++ template ++ void Set(const std::string &key, const std::shared_ptr &value); ++ ++ /** ++ * @brief Set value to context. ++ * ++ * @tparam T type of value ++ * @param key string key ++ * @param value T value ++ */ ++ template ++ void Set(const std::string &key, const T &value); ++ ++ /** ++ * @brief Get value from context. ++ * ++ * @tparam T type of value ++ * @param key string key ++ * @return std::shared_ptr value of key in context or nullptr if not exist ++ */ ++ template ++ std::shared_ptr Get(const std::string &key) const; ++ ++ /** ++ * @brief Set value to context safely. ++ * ++ * @tparam T type of value ++ * @param key string key ++ * @param value shared_ptr of T ++ */ ++ template ++ void SafeSet(const std::string &key, const std::shared_ptr &value); ++ ++ /** ++ * @brief Set value to context safely. ++ * ++ * @tparam T type of value ++ * @param key string key ++ * @param value T value ++ */ ++ template ++ void SafeSet(const std::string &key, const T &value); ++ ++ /** ++ * @brief Get value from context safely. ++ * ++ * @tparam T type of value ++ * @param key string key ++ * @return std::shared_ptr value of key in context or nullptr if not exist ++ */ ++ template ++ std::shared_ptr SafeGet(const std::string &key) const; ++ ++ private: ++ std::map> m_map_; ++ std::mutex m_mutex_; ++}; ++ ++template ++void Context::Set(const std::string &key, const std::shared_ptr &value) { ++ m_map_[key] = value; ++} ++ ++template ++void Context::Set(const std::string &key, const T &value) { ++ m_map_[key] = std::make_shared(value); ++} ++template ++std::shared_ptr Context::Get(const std::string &key) const { ++ auto it = m_map_.find(key); ++ if (it != m_map_.end()) { ++ return std::static_pointer_cast(it->second); ++ } ++ return nullptr; ++} ++ ++template ++void Context::SafeSet(const std::string &key, const std::shared_ptr &value) { ++ std::lock_guard lock(m_mutex_); ++ return Set(key, value); ++} ++ ++template ++void Context::SafeSet(const std::string &key, const T &value) { ++ std::lock_guard lock(m_mutex_); ++ return Set(key, value); ++} ++ ++template ++std::shared_ptr Context::SafeGet(const std::string &key) const { ++ std::lock_guard lock(m_mutex_); ++ return Get(key); ++} ++ ++} // namespace context ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/context/context_test.cc /opt/apollo/cyber/context/context_test.cc +--- cyber/context/context_test.cc 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/context/context_test.cc 2023-12-23 18:05:58.569028978 +0800 +@@ -0,0 +1,53 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#include "cyber/context/context.h" ++ ++#include ++ ++#include "gtest/gtest.h" ++ ++namespace apollo { ++namespace cyber { ++namespace context { ++ ++TEST(Context, Set) { ++ Context ctx; ++ ctx.Set("key", 1); ++ ctx.Set("key", std::make_shared(2)); ++ EXPECT_EQ(*ctx.Get("key"), 2); ++ ++ struct Foo { ++ int a; ++ int b; ++ }; ++ Foo foo{1, 2}; ++ ctx.Set("key", foo); ++ EXPECT_EQ(ctx.Get("key")->a, 1); ++ EXPECT_EQ(ctx.Get("key")->b, 2); ++} ++ ++TEST(Context, Get) { ++ Context ctx; ++ ctx.Set("key1", 1); ++ ctx.Set("key2", std::make_shared(2)); ++ EXPECT_EQ(*ctx.Get("key1"), 1); ++ EXPECT_EQ(*ctx.Get("key2"), 2); ++} ++ ++} // namespace context ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/croutine/BUILD /opt/apollo/cyber/croutine/BUILD +--- cyber/croutine/BUILD 2023-12-23 18:23:13.081910841 +0800 ++++ /opt/apollo/cyber/croutine/BUILD 2023-12-23 18:05:58.569028978 +0800 +@@ -1,71 +1,33 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_croutine_hdrs", +- srcs = glob([ +- "*.h", +- "detail/*.h" +- ]), +-) +- +-cc_library( +- name = "croutine", +- srcs = ["croutine.cc"], +- hdrs = ["croutine.h"], +- linkopts = ["-latomic"], +- deps = [ +- "//cyber/base:atomic_hash_map", +- "//cyber/base:atomic_rw_lock", +- "//cyber/base:bounded_queue", +- "//cyber/base:concurrent_object_pool", +- "//cyber/base:macros", +- "//cyber/base:wait_strategy", +- "//cyber/common", +- "//cyber/croutine:routine_context", +- "//cyber/croutine:routine_factory", +- "//cyber/croutine:swap", +- "//cyber/event:perf_event_cache", +- "//cyber/time", +- ], +-) +- +-cc_library( +- name = "routine_context", +- srcs = ["detail/routine_context.cc"], +- hdrs = ["detail/routine_context.h"], +- deps = [ +- "//cyber/common", ++apollo_cc_library( ++ name = "cyber_croutine", ++ srcs = [ ++ "croutine.cc", ++ "detail/routine_context.cc", ++ ] + select( ++ {"@platforms//cpu:x86_64": ["detail/swap_x86_64.S"], ++ "@platforms//cpu:aarch64": ["detail/swap_aarch64.S"],}, ++ no_match_error = "Please Build with a Linux aarch64 or x86_64 platform", ++ ), ++ hdrs = [ ++ "croutine.h", ++ "routine_factory.h", ++ "detail/routine_context.h", + ], +-) +- +-cc_library( +- name = "routine_factory", +- hdrs = ["routine_factory.h"], ++ linkopts = ["-latomic"], + deps = [ +- "//cyber/common", +- "//cyber/event:perf_event_cache", ++ "//cyber/base:cyber_base", ++ "//cyber/common:cyber_common", ++ "//cyber/event:cyber_event", ++ "//cyber/time:cyber_time", + ], + ) + +-cc_library( +- name = "swap", +- srcs = select( +- { +- "@platforms//cpu:x86_64": [ +- "detail/swap_x86_64.S", +- ], +- "@platforms//cpu:aarch64": [ +- "detail/swap_aarch64.S", +- ], +- }, +- no_match_error = "Please Build with a Linux aarch64 or x86_64 platform", +- ), +-) +- +-cc_test( ++apollo_cc_test( + name = "croutine_test", + size = "small", + srcs = ["croutine_test.cc"], +@@ -76,4 +38,5 @@ + linkstatic = True, + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/cyber.BUILD /opt/apollo/cyber/cyber.BUILD +--- cyber/cyber.BUILD 2023-12-23 18:23:13.077910841 +0800 ++++ /opt/apollo/cyber/cyber.BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,11 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library") +- +-cc_library( +- name = "cyber", +- includes = ["include"], +- hdrs = glob(["include/**/*"]), +- srcs = glob(["lib/**/lib*.so*"]), +- include_prefix = "cyber", +- strip_include_prefix = "include", +- visibility = ["//visibility:public"], +-) +\ No newline at end of file +diff --color -Naur cyber/cyberfile.xml /opt/apollo/cyber/cyberfile.xml +--- cyber/cyberfile.xml 2023-12-23 18:23:13.077910841 +0800 ++++ /opt/apollo/cyber/cyberfile.xml 2023-12-23 18:05:58.570028978 +0800 +@@ -2,10 +2,10 @@ + cyber + local + +- Apollo Cyber RT is an open source, high performance runtime framework designed specifically for autonomous driving scenarios. ++ Apollo Cyber RT is an open source, high performance runtime framework designed specifically for autonomous driving scenarios. + Based on a centralized computing model, it is greatly optimized for high concurrency, low latency, and high throughput in autonomous driving. + +- ++ + Apollo + Apache License 2.0 + https://www.apollo.auto/ +@@ -14,25 +14,26 @@ + + module + //cyber +- ++ + libncurses5-dev + libuuid1 + +- 3rd-rules-python-dev +- 3rd-grpc-dev +- 3rd-rules-proto-dev +- 3rd-py-dev +- 3rd-gpus-dev +- 3rd-bazel-skylib-dev +- +- 3rd-protobuf-dev +- 3rd-fastrtps-dev +- 3rd-glog-dev +- 3rd-gflags-dev +- common-msgs-dev +- 3rd-cpplint-dev +- 3rd-gtest-dev +- 3rd-nlohmann-json-dev +- bazel-extend-tools-dev ++ 3rd-rules-python ++ 3rd-grpc ++ 3rd-rules-proto ++ 3rd-py ++ 3rd-gpus ++ 3rd-bazel-skylib ++ ++ 3rd-protobuf ++ 3rd-fastrtps ++ 3rd-glog ++ 3rd-gflags ++ common-msgs ++ 3rd-cpplint ++ 3rd-gtest ++ 3rd-nlohmann-json ++ libtinyxml2-dev ++ bazel-extend-tools + + +diff --color -Naur cyber/data/BUILD /opt/apollo/cyber/data/BUILD +--- cyber/data/BUILD 2023-12-23 18:23:13.081910841 +0800 ++++ /opt/apollo/cyber/data/BUILD 2023-12-23 18:05:58.570028978 +0800 +@@ -1,69 +1,36 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_data_hdrs", +- srcs = glob([ +- "*.h", +- "fusion/*.h" +- ]), +-) +- +- +-cc_library( +- name = "data", ++apollo_cc_library( ++ name = "cyber_data", ++ hdrs = [ ++ "cache_buffer.h", ++ "channel_buffer.h", ++ "data_dispatcher.h", ++ "data_notifier.h", ++ "data_visitor.h", ++ "data_visitor_base.h", ++ "fusion/all_latest.h", ++ "fusion/data_fusion.h", ++ ], + deps = [ +- ":all_latest", +- ":cache_buffer", +- ":channel_buffer", +- ":data_dispatcher", +- ":data_fusion", +- ":data_notifier", +- ":data_visitor", +- ":data_visitor_base", ++ "//cyber/proto:component_conf_cc_proto", + ], + ) + +-cc_library( +- name = "cache_buffer", +- srcs = ["cache_buffer.h"], +-) +- +-cc_test( ++apollo_cc_test( + name = "cache_buffer_test", + size = "small", + srcs = ["cache_buffer_test.cc"], + deps = [ +- ":cache_buffer", ++ ":cyber_data", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "channel_buffer", +- hdrs = ["channel_buffer.h"], +- deps = [ +- ":data_notifier", +- "//cyber/proto:component_conf_cc_proto", +- ], +-) +- +-cc_library( +- name = "data_dispatcher", +- hdrs = ["data_dispatcher.h"], +- deps = [ +- ":channel_buffer", +- ], +-) +- +-cc_library( +- name = "data_visitor", +- hdrs = ["data_visitor.h"], +-) +- +-cc_test( ++apollo_cc_test( + name = "data_visitor_test", + size = "small", + srcs = ["data_visitor_test.cc"], +@@ -73,20 +40,7 @@ + ], + ) + +-cc_library( +- name = "data_visitor_base", +- hdrs = ["data_visitor_base.h"], +-) +- +-cc_library( +- name = "data_notifier", +- hdrs = ["data_notifier.h"], +- deps = [ +- ":cache_buffer", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "data_dispatcher_test", + size = "small", + srcs = ["data_dispatcher_test.cc"], +@@ -96,7 +50,7 @@ + ], + ) + +-cc_test( ++apollo_cc_test( + name = "channel_buffer_test", + size = "small", + srcs = ["channel_buffer_test.cc"], +@@ -106,21 +60,7 @@ + ], + ) + +-cc_library( +- name = "data_fusion", +- hdrs = ["fusion/data_fusion.h"], +-) +- +-cc_library( +- name = "all_latest", +- hdrs = ["fusion/all_latest.h"], +- deps = [ +- ":channel_buffer", +- ":data_fusion", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "all_latest_test", + size = "small", + srcs = ["fusion/all_latest_test.cc"], +@@ -130,4 +70,5 @@ + ], + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/docs/cyber_api_for_developers.md /opt/apollo/cyber/docs/cyber_api_for_developers.md +--- cyber/docs/cyber_api_for_developers.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/cyber_api_for_developers.md 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,1225 @@ ++# Apollo Cyber RT API for Developers ++ ++This document provides an extensive technical deep dive into how to create, manipulate and use Cyber RT's API. ++ ++## Table of Contents ++ ++- [Talker-Listener](#Talker-Listener) ++- [Service Creation and Use](#Service-Creation-and-Use) ++- [Param parameter service](#Param-parameter-service) ++- [Log API](#LOG-API) ++- [Building a module based on Component](#Building-a-module-based-on-Component) ++- [Launch](#Launch) ++- [Timer](#timer) ++- [Time API](#use-of-time) ++- [Record file: Read and Write](#Record-file-Read-and-Write) ++- [C++ API Directory](##API-Directory) ++ - [Node](#node-api) ++ - [Writer](#writer-api) ++ - [Client](#client-api) ++ - [Parameter](#parameter-api) ++ - [Timer](#timer-api) ++ - [Time](#timer-api) ++ - [Duration](#duration-api) ++ - [Rate](#rate-api) ++ - [RecordReader](#recordreader-api) ++ - [RecordWriter](#recordwriter-api) ++ ++## Talker-Listener ++ ++The first part of demonstrating CyberRT API is to understand the Talker/Listener example. Following are three essential concepts: node (basic unit), reader(facility to read message) and writer(facility to write message) of the example. ++ ++### Create a node ++ ++In the CyberRT framework, the node is the most fundamental unit, similar to the role of a `handle`. When creating a specific functional object (writer, reader, etc.), you need to create it based on an existing node instance. ++The node creation interface is as follows: ++ ++```cpp ++std::unique_ptr apollo::cyber::CreateNode(const std::string& node_name, const std::string& name_space = ""); ++``` ++ ++- Parameters: ++ ++ - node_name: name of the node, globally unique identifier ++ - name_space: name of the space where the node is located ++ ++ > name_space is empty by default. It is the name of the space concatenated with node_name. The format is `/namespace/node_name` ++ ++- Return value - An exclusive smart pointer to Node ++- Error Conditions - when `cyber::Init()` has not called, the system is in an uninitialized state, unable to create a node, return nullptr ++ ++### Create a writer ++ ++The writer is the basic facility used in CyberRT to send messages. Every writer corresponds to a channel with a specific data type. ++The writer is created by the `CreateWriter` interface in the node class. The interfaces are listed as below: ++ ++```cpp ++template ++ auto CreateWriter(const std::string& channel_name) ++ -> std::shared_ptr>; ++template ++ auto CreateWriter(const proto::RoleAttributes& role_attr) ++ -> std::shared_ptr>; ++ ++``` ++ ++- Parameters: ++ - channel_name: the name of the channel to write to ++ - MessageT: The type of message to be written out ++- Return value - Shared pointer to the Writer object ++ ++### Create a reader ++ ++The reader is the basic facility used in cyber to receive messages. Reader has to be bound to a callback function when it is created. When a new message arrives in the channel, the callback will be called. ++The reader is created by the `CreateReader` interface of the node class. The interfaces are listed as below: ++ ++```cpp ++template ++auto CreateReader(const std::string& channel_name, const std::function&)>& reader_func) ++ -> std::shared_ptr>; ++ ++template ++auto CreateReader(const ReaderConfig& config, ++ const CallbackFunc& reader_func = nullptr) ++ -> std::shared_ptr>; ++ ++template ++auto CreateReader(const proto::RoleAttributes& role_attr, ++ const CallbackFunc& reader_func = nullptr) ++-> std::shared_ptr>; ++``` ++ ++- Parameters: ++ ++ - MessageT: The type of message to read ++ - channel_name: the name of the channel to receive from ++ - reader_func: callback function to process the messages ++ ++- Return value - Shared pointer to the Reader object ++ ++### Code Example ++ ++#### Talker (cyber/examples/talker.cc) ++ ++```cpp ++#include "cyber/cyber.h" ++#include "cyber/proto/chatter.pb.h" ++#include "cyber/time/rate.h" ++#include "cyber/time/time.h" ++using apollo::cyber::Rate; ++using apollo::cyber::Time; ++using apollo::cyber::proto::Chatter; ++int main(int argc, char *argv[]) { ++ // init cyber framework ++ apollo::cyber::Init(argv[0]); ++ // create talker node ++ std::shared_ptr talker_node( ++ apollo::cyber::CreateNode("talker")); ++ // create talker ++ auto talker = talker_node->CreateWriter("channel/chatter"); ++ Rate rate(1.0); ++ while (apollo::cyber::OK()) { ++ static uint64_t seq = 0; ++ auto msg = std::make_shared(); ++ msg->set_timestamp(Time::Now().ToNanosecond()); ++ msg->set_lidar_timestamp(Time::Now().ToNanosecond()); ++ msg->set_seq(seq++); ++ msg->set_content("Hello, apollo!"); ++ talker->Write(msg); ++ AINFO << "talker sent a message!"; ++ rate.Sleep(); ++ } ++ return 0; ++} ++``` ++ ++#### Listener (cyber/examples/listener.cc) ++ ++```cpp ++#include "cyber/cyber.h" ++#include "cyber/proto/chatter.pb.h" ++void MessageCallback( ++ const std::shared_ptr& msg) { ++ AINFO << "Received message seq-> " << msg->seq(); ++ AINFO << "msgcontent->" << msg->content(); ++} ++int main(int argc, char *argv[]) { ++ // init cyber framework ++ apollo::cyber::Init(argv[0]); ++ // create listener node ++ auto listener_node = apollo::cyber::CreateNode("listener"); ++ // create listener ++ auto listener = ++ listener_node->CreateReader( ++ "channel/chatter", MessageCallback); ++ apollo::cyber::WaitForShutdown(); ++ return 0; ++} ++``` ++ ++#### Bazel BUILD file(cyber/samples/BUILD) ++ ++```python ++cc_binary( ++ name = "talker", ++ srcs = [ "talker.cc", ], ++ deps = [ ++ "//cyber", ++ "//cyber/examples/proto:examples_cc_proto", ++ ], ++) ++ ++cc_binary( ++ name = "listener", ++ srcs = [ "listener.cc", ], ++ deps = [ ++ "//cyber", ++ "//cyber/examples/proto:examples_cc_proto", ++ ], ++) ++``` ++ ++#### Build and Run ++ ++- Build: bazel build cyber/examples/… ++- Run talker/listener in different terminals: ++ - ./bazel-bin/cyber/examples/talker ++ - ./bazel-bin/cyber/examples/listener ++- Examine the results: you should see message printing out on listener. ++ ++## Service Creation and Use ++ ++### Introduction ++ ++In an autonomous driving system, there are many scenarios that require more from module communication than just sending or receiving messages. Service is another way of communication between nodes. Unlike channel, service implements `two-way` communication, e.g. a node obtains a response by sending a request. This section introduces the `service` module in CyberRT API with examples. ++ ++### Demo - Example ++ ++Problem: create a client-server model that pass Driver.proto back and forth. ++When a request is sent in by the client, the server parses/processes the request and returns the response. ++ ++The implementation of the demo mainly includes the following steps. ++ ++#### Define request and response messages ++ ++All messages in cyber are in the `protobuf` format. Any protobuf message with serialize/deserialize interfaces can be used as the service request and response message. `Driver` in examples.proto is used as service request and response in this example: ++ ++```protobuf ++// filename: examples.proto ++syntax = "proto2"; ++package apollo.cyber.examples.proto; ++message Driver { ++ optional string content = 1; ++ optional uint64 msg_id = 2; ++ optional uint64 timestamp = 3; ++}; ++``` ++ ++#### Create a service and a client ++ ++```cpp ++// filename: cyber/examples/service.cc ++#include "cyber/cyber.h" ++#include "cyber/examples/proto/examples.pb.h" ++ ++using apollo::cyber::examples::proto::Driver; ++ ++int main(int argc, char* argv[]) { ++ apollo::cyber::Init(argv[0]); ++ std::shared_ptr node( ++ apollo::cyber::CreateNode("start_node")); ++ auto server = node->CreateService( ++ "test_server", [](const std::shared_ptr& request, ++ std::shared_ptr& response) { ++ AINFO << "server: I am driver server"; ++ static uint64_t id = 0; ++ ++id; ++ response->set_msg_id(id); ++ response->set_timestamp(0); ++ }); ++ auto client = node->CreateClient("test_server"); ++ auto driver_msg = std::make_shared(); ++ driver_msg->set_msg_id(0); ++ driver_msg->set_timestamp(0); ++ while (apollo::cyber::OK()) { ++ auto res = client->SendRequest(driver_msg); ++ if (res != nullptr) { ++ AINFO << "client: response: " << res->ShortDebugString(); ++ } else { ++ AINFO << "client: service may not ready."; ++ } ++ sleep(1); ++ } ++ ++ apollo::cyber::WaitForShutdown(); ++ return 0; ++} ++``` ++ ++#### Bazel build file ++ ++```python ++cc_binary( ++ name = "service", ++ srcs = [ "service.cc", ], ++ deps = [ ++ "//cyber", ++ "//cyber/examples/proto:examples_cc_proto", ++ ], ++) ++``` ++ ++#### Build and run ++ ++- Build service/client: bazel build cyber/examples/… ++- Run: ./bazel-bin/cyber/examples/service ++- Examining result: you should see content below in apollo/data/log/service.INFO ++ ++```txt ++I1124 16:36:44.568845 14965 service.cc:30] [service] server: i am driver server ++I1124 16:36:44.569031 14949 service.cc:43] [service] client: response: msg_id: 1 timestamp: 0 ++I1124 16:36:45.569514 14966 service.cc:30] [service] server: i am driver server ++I1124 16:36:45.569932 14949 service.cc:43] [service] client: response: msg_id: 2 timestamp: 0 ++I1124 16:36:46.570627 14967 service.cc:30] [service] server: i am driver server ++I1124 16:36:46.571024 14949 service.cc:43] [service] client: response: msg_id: 3 timestamp: 0 ++I1124 16:36:47.571566 14968 service.cc:30] [service] server: i am driver server ++I1124 16:36:47.571962 14949 service.cc:43] [service] client: response: msg_id: 4 timestamp: 0 ++I1124 16:36:48.572634 14969 service.cc:30] [service] server: i am driver server ++I1124 16:36:48.573030 14949 service.cc:43] [service] client: response: msg_id: 5 timestamp: 0 ++``` ++ ++### Precautions ++ ++- When registering a service, note that duplicate service names are not allowed ++- The node name applied when registering the server and client should not be duplicated either ++ ++## Parameter Service ++ ++The Parameter Service is used for shared data between nodes, and provides basic operations such as `set`, `get`, and `list`. The Parameter Service is based on the `Service` implementation and contains service and client. ++ ++### Parameter Object ++ ++#### Supported Data types ++ ++All parameters passed through cyber are `apollo::cyber::Parameter` objects, the table below lists the 5 supported parameter types. ++ ++| Parameter type | C++ data type | protobuf data type | ++| :---------------------------------------- | :------------ | :----------------- | ++| apollo::cyber::proto::ParamType::INT | int64_t | int64 | ++| apollo::cyber::proto::ParamType::DOUBLE | double | double | ++| apollo::cyber::proto::ParamType::BOOL | bool | bool | ++| apollo::cyber::proto::ParamType::STRING | std::string | string | ++| apollo::cyber::proto::ParamType::PROTOBUF | std::string | string | ++| apollo::cyber::proto::ParamType::NOT_SET | - | - | ++ ++Besides the 5 types above, Parameter also supports interface with protobuf object as incoming parameter. Post performing serialization processes the object and converts it to the STRING type for transfer. ++ ++#### Creating the Parameter Object ++ ++Supported constructors: ++ ++```cpp ++Parameter(); // Name is empty, type is NOT_SET ++explicit Parameter(const Parameter& parameter); ++explicit Parameter(const std::string& name); // type为NOT_SET ++Parameter(const std::string& name, const bool bool_value); ++Parameter(const std::string& name, const int int_value); ++Parameter(const std::string& name, const int64_t int_value); ++Parameter(const std::string& name, const float double_value); ++Parameter(const std::string& name, const double double_value); ++Parameter(const std::string& name, const std::string& string_value); ++Parameter(const std::string& name, const char* string_value); ++Parameter(const std::string& name, const std::string& msg_str, ++ const std::string& full_name, const std::string& proto_desc); ++Parameter(const std::string& name, const google::protobuf::Message& msg); ++``` ++ ++Sample code of using Parameter object: ++ ++```cpp ++Parameter a("int", 10); ++Parameter b("bool", true); ++Parameter c("double", 0.1); ++Parameter d("string", "cyber"); ++Parameter e("string", std::string("cyber")); ++// proto message Chatter ++Chatter chatter; ++Parameter f("chatter", chatter); ++std::string msg_str(""); ++chatter.SerializeToString(&msg_str); ++std::string msg_desc(""); ++ProtobufFactory::GetDescriptorString(chatter, &msg_desc); ++Parameter g("chatter", msg_str, Chatter::descriptor()->full_name(), msg_desc); ++``` ++ ++#### Interface and Data Reading ++ ++Interface list: ++ ++```cpp ++inline ParamType type() const; ++inline std::string TypeName() const; ++inline std::string Descriptor() const; ++inline const std::string Name() const; ++inline bool AsBool() const; ++inline int64_t AsInt64() const; ++inline double AsDouble() const; ++inline const std::string AsString() const; ++std::string DebugString() const; ++template ++typename std::enable_if::value, Type>::type ++value() const; ++template ++typename std::enable_if::value && !std::is_same::value, Type>::type ++value() const; ++template ++typename std::enable_if::value, Type>::type ++value() const; ++template ++typename std::enable_if::value, const std::string&>::type ++value() const; ++template ++typename std::enable_if::value, bool>::type ++value() const; ++``` ++ ++An example of how to use those interfaces: ++ ++```cpp ++Parameter a("int", 10); ++a.Name(); // return int ++a.Type(); // return apollo::cyber::proto::ParamType::INT ++a.TypeName(); // return string: INT ++a.DebugString(); // return string: {name: "int", type: "INT", value: 10} ++int x = a.AsInt64(); // x = 10 ++x = a.value(); // x = 10 ++x = a.AsString(); // Undefined behavior, error log prompt ++f.TypeName(); // return string: chatter ++auto chatter = f.value(); ++``` ++ ++### Parameter Service ++ ++If a node wants to provide a Parameter Service to other nodes, then you need to create a `ParameterService`. ++ ++```cpp ++/** ++ * @brief Construct a new ParameterService object ++ * ++ * @param node shared_ptr of the node handler ++ */ ++explicit ParameterService(const std::shared_ptr& node); ++``` ++ ++Since all parameters are stored in the parameter service object, the parameters can be manipulated directly in the ParameterService without sending a service request. ++ ++**Setting parameters:** ++ ++```cpp ++/** ++ * @brief Set the Parameter object ++ * ++ * @param parameter parameter to be set ++ */ ++void SetParameter(const Parameter& parameter); ++``` ++ ++**Getting parameters:** ++ ++```cpp ++/** ++ * @brief Get the Parameter object ++ * ++ * @param param_name ++ * @param parameter the pointer to store ++ * @return true ++ * @return false call service fail or timeout ++ */ ++bool GetParameter(const std::string& param_name, Parameter* parameter); ++``` ++ ++**Getting the list of parameters:** ++ ++```cpp ++/** ++ * @brief Get all the Parameter objects ++ * ++ * @param parameters pointer of vector to store all the parameters ++ * @return true ++ * @return false call service fail or timeout ++ */ ++bool ListParameters(std::vector* parameters); ++``` ++ ++### Parameter Client ++ ++If a node wants to use parameter services of other nodes, you need to create a `ParameterClient`. ++ ++```cpp ++/** ++ * @brief Construct a new ParameterClient object ++ * ++ * @param node shared_ptr of the node handler ++ * @param service_node_name node name which provide a param services ++ */ ++ParameterClient(const std::shared_ptr& node, const std::string& service_node_name); ++``` ++ ++You could also perform `SetParameter`, `GetParameter` and `ListParameters` mentioned under [Parameter Service](#Parameter-Service). ++ ++### Demo - example ++ ++```cpp ++#include "cyber/cyber.h" ++#include "cyber/parameter/parameter_client.h" ++#include "cyber/parameter/parameter_server.h" ++ ++using apollo::cyber::Parameter; ++using apollo::cyber::ParameterServer; ++using apollo::cyber::ParameterClient; ++ ++int main(int argc, char** argv) { ++ apollo::cyber::Init(*argv); ++ std::shared_ptr node = ++ apollo::cyber::CreateNode("parameter"); ++ auto param_server = std::make_shared(node); ++ auto param_client = std::make_shared(node, "parameter"); ++ param_server->SetParameter(Parameter("int", 1)); ++ Parameter parameter; ++ param_server->GetParameter("int", ¶meter); ++ AINFO << "int: " << parameter.AsInt64(); ++ param_client->SetParameter(Parameter("string", "test")); ++ param_client->GetParameter("string", ¶meter); ++ AINFO << "string: " << parameter.AsString(); ++ param_client->GetParameter("int", ¶meter); ++ AINFO << "int: " << parameter.AsInt64(); ++ return 0; ++} ++``` ++ ++#### Build and run ++ ++- Build: bazel build cyber/examples/… ++- Run: ./bazel-bin/cyber/examples/paramserver ++ ++## Log API ++ ++### Log library ++ ++Cyber log library is built on top of glog. The following header files need to be included: ++ ++```cpp ++#include "cyber/common/log.h" ++#include "cyber/init.h" ++``` ++ ++### Log configuration ++ ++Default global config path: cyber/setup.bash ++ ++The configs below could be modified by devloper: ++ ++``` ++export GLOG_log_dir=/apollo/data/log ++export GLOG_alsologtostderr=0 ++export GLOG_colorlogtostderr=1 ++export GLOG_minloglevel=0 ++``` ++ ++### Log initialization ++ ++Call the Init method at the code entry to initialize the log: ++ ++```cpp++ ++apollo::cyber::cyber::Init(argv[0]) is initialized. ++If no macro definition is made in the previous component, the corresponding log is printed to the binary log. ++``` ++ ++### Log output macro ++ ++Log library is encapsulated in Log printing macros. The related log macros are used as follows: ++ ++```cpp ++ADEBUG << "hello cyber."; ++AINFO << "hello cyber."; ++AWARN << "hello cyber."; ++AERROR << "hello cyber."; ++AFATAL << "hello cyber."; ++ ++``` ++ ++### Log format ++ ++The format is `.log...` ++ ++### About log files ++ ++Currently, the only different output behavior from default glog is that different log levels of a module will be written into the same log file. ++ ++## Building a module based on Component ++ ++### Key concepts ++ ++#### 1. Component ++ ++The component is the base class that Cyber RT provides to build application modules. Each specific application module can inherit the Component class and define its own `Init` and `Proc` functions so that it can be loaded into the Cyber framework. ++ ++#### 2. Binary vs Component ++ ++There are two options to use Cyber RT framework for applications: ++ ++- Binary based: the application is compiled separately into a binary, which communicates with other cyber modules by creating its own `Reader` and `Writer`. ++- Component based: the application is compiled into a Shared Library. By inheriting the Component class and writing the corresponding dag description file, the Cyber RT framework will load and run the application dynamically. ++ ++##### The essential Component interface ++ ++- The component's `Init()` function is like the main function that does some initialization of the algorithm. ++- Component's `Proc()` function works like Reader's callback function that is called by the framework when a message arrives. ++ ++##### Advantages of using Component ++ ++- Component can be loaded into different processes through the launch file, and the deployment is flexible. ++- Component can change the received channel name by modifying the dag file without recompiling. ++- Component supports receiving multiple types of data. ++- Component supports providing multiple fusion strategies. ++ ++#### 3. Dag file format ++ ++An example dag file: ++ ++```protobuf ++# Define all coms in DAG streaming. ++module_config { ++ module_library : "lib/libperception_component.so" ++ components { ++ class_name : "PerceptionComponent" ++ config { ++ name : "perception" ++ readers { ++ channel: "perception/channel_name" ++ } ++ } ++ } ++ timer_components { ++ class_name : "DriverComponent" ++ config { ++ name : "driver" ++ interval : 100 ++ } ++ } ++} ++``` ++ ++- **module_library**: If you want to load the .so library the root directory is the working directory of cyber (the same directory of `setup.bash`) ++- **components & timer_component**: Select the base component class type that needs to be loaded. ++- **class_name**: the name of the component class to load ++- **name**: the loaded class_name as the identifier of the loading example ++- **readers**: Data received by the current component, supporting 1-3 channels of data. ++ ++### Demo - examples ++ ++#### Common_component_example(cyber/examples/common_component_example/\*) ++ ++Header definition(common_component_example.h) ++ ++```cpp ++#include ++ ++#include "cyber/class_loader/class_loader.h" ++#include "cyber/component/component.h" ++#include "cyber/examples/proto/examples.pb.h" ++ ++using apollo::cyber::examples::proto::Driver; ++using apollo::cyber::Component; ++using apollo::cyber::ComponentBase; ++ ++class Commontestcomponent : public Component { ++ public: ++ bool Init() override; ++ bool Proc(const std::shared_ptr& msg0, ++ const std::shared_ptr& msg1) override; ++}; ++CYBER_REGISTER_COMPONENT(Commontestcomponent) ++``` ++ ++Cpp file implementation(common_component_example.cc) ++ ++```cpp ++#include "cyber/examples/common_component_smaple/common_component_example.h" ++ ++#include "cyber/class_loader/class_loader.h" ++#include "cyber/component/component.h" ++ ++bool Commontestcomponent::Init() { ++ AINFO << "Commontest component init"; ++ return true; ++} ++ ++bool Commontestcomponent::Proc(const std::shared_ptr& msg0, ++ const std::shared_ptr& msg1) { ++ AINFO << "Start commontest component Proc [" << msg0->msg_id() << "] [" ++ << msg1->msg_id() << "]"; ++ return true; ++} ++``` ++ ++#### Timer_component_example(cyber/examples/timer_component_example/\*) ++ ++Header definition(timer_component_example.h) ++ ++```cpp ++#include ++ ++#include "cyber/class_loader/class_loader.h" ++#include "cyber/component/component.h" ++#include "cyber/component/timer_component.h" ++#include "cyber/examples/proto/examples.pb.h" ++ ++using apollo::cyber::examples::proto::Driver; ++using apollo::cyber::Component; ++using apollo::cyber::ComponentBase; ++using apollo::cyber::TimerComponent; ++using apollo::cyber::Writer; ++ ++class TimertestComponent : public TimerComponent { ++ public: ++ bool Init() override; ++ bool Proc() override; ++ ++ private: ++ std::shared_ptr> driver_writer_ = nullptr; ++}; ++CYBER_REGISTER_COMPONENT(TimertestComponent) ++``` ++ ++Cpp file implementation(timer_component_example.cc) ++ ++```cpp ++#include "cyber/examples/timer_component_example/timer_component_example.h" ++ ++#include "cyber/class_loader/class_loader.h" ++#include "cyber/component/component.h" ++#include "cyber/examples/proto/examples.pb.h" ++ ++bool TimertestComponent::Init() { ++ driver_writer_ = node_->CreateWriter("/carstatus/channel"); ++ return true; ++} ++ ++bool TimertestComponent::Proc() { ++ static int i = 0; ++ auto out_msg = std::make_shared(); ++ out_msg->set_msg_id(i++); ++ driver_writer_->Write(out_msg); ++ AINFO << "timertestcomponent: Write drivermsg->" ++ << out_msg->ShortDebugString(); ++ return true; ++} ++``` ++ ++#### Build and run ++ ++Use timertestcomponent as example: ++ ++- Build: bazel build cyber/examples/timer_component_smaple/… ++- Run: mainboard -d cyber/examples/timer_component_smaple/timer.dag ++ ++### Precautions ++ ++- Component needs to be registered to load the class through SharedLibrary. The registration interface looks like: ++ ++```cpp ++CYBER_REGISTER_COMPONENT(DriverComponent) ++``` ++ ++If you use a namespace when registering, you also need to add a namespace when you define it in the dag file. ++ ++- The configuration files of the Component and TimerComponent are different, please be careful not to mix the two up. ++ ++## Launch ++ ++**cyber_launch** is the launcher of the Cyber RT framework. It starts multiple mainboards according to the launch file, and loads different components into different mainboards according to the dag file. ++cyber_launch supports two scenarios for dynamically loading components or starting Binary programs in a child process. ++ ++### Launch File Format ++ ++```xml ++ ++ ++ driver ++ driver.dag ++ ++ exit ++ ++ ++ perception ++ perception.dag ++ ++ respawn ++ ++ ++ planning ++ planning.dag ++ ++ ++ ++``` ++ ++**Module**: ++Each loaded component or binary is a module ++ ++- **name** is the loaded module name ++- **dag_conf** is the name of the corresponding dag file of the component ++- **process_name** is the name of the mainboard process once started, and the same component of process_name will be loaded and run in the same process. ++- **exception_handler** is the handler method when the exception occurs in the process. The value can be exit or respawn listed below. ++ - exit, which means that the entire process needs to stop running when the current process exits abnormally. ++ - respawn, the current process needs to be restarted after abnormal exit. Start this process. If there is no such thing as it is empty, it means no treatment. Can be controlled by the user according to the specific conditions of the process ++ ++## Timer ++ ++Timer can be used to create a timed task to run on a periodic basis, or to run only once ++ ++### Timer Interface ++ ++```cpp ++/** ++ * @brief Construct a new Timer object ++ * ++ * @param period The period of the timer, unit is ms ++ * @param callback The tasks that the timer needs to perform ++ * @param oneshot True: perform the callback only after the first timing cycle ++ * False: perform the callback every timed period ++ */ ++Timer(uint32_t period, std::function callback, bool oneshot); ++``` ++ ++Or you could encapsulate the parameters into a timer option as follows: ++ ++```cpp ++struct TimerOption { ++ uint32_t period; // The period of the timer, unit is ms ++ std::function callback; // The tasks that the timer needs to perform ++ bool oneshot; // True: perform the callback only after the first timing cycle ++ // False: perform the callback every timed period ++}; ++/** ++ * @brief Construct a new Timer object ++ * ++ * @param opt Timer option ++ */ ++explicit Timer(TimerOption opt); ++``` ++ ++### Start Timer ++ ++After creating a Timer instance, you must call `Timer::Start()` to start the timer. ++ ++### Stop Timer ++ ++When you need to manually stop a timer that has already started, you can call the `Timer::Stop()` interface. ++ ++### Demo - example ++ ++```cpp ++#include ++#include "cyber/cyber.h" ++int main(int argc, char** argv) { ++ cyber::Init(argv[0]); ++ // Print current time every 100ms ++ cyber::Timer timer(100, [](){ ++ std::cout << cyber::Time::Now() << std::endl; ++ }, false); ++ timer.Start() ++ sleep(1); ++ timer.Stop(); ++} ++``` ++ ++## Time API ++ ++Time is a class used to manage time; it can be used for current time acquisition, time-consuming calculation, time conversion, and so on. ++ ++The time interfaces are as follows: ++ ++```cpp ++// constructor, passing in a different value to construct Time ++Time(uint64_t nanoseconds); //uint64_t, in nanoseconds ++Time(int nanoseconds); // int type, unit: nanoseconds ++Time(double seconds); // double, in seconds ++Time(uint32_t seconds, uint32_t nanoseconds); ++// seconds seconds + nanoseconds nanoseconds ++Static Time Now(); // Get the current time ++Double ToSecond() const; // convert to seconds ++Uint64_t ToNanosecond() const; // Convert to nanoseconds ++Std::string ToString() const; // Convert to a string in the format "2018-07-10 20:21:51.123456789" ++Bool IsZero() const; // Determine if the time is 0 ++ ++``` ++ ++A code example can be seen below: ++ ++```cpp ++#include ++#include "cyber/cyber.h" ++#include "cyber/duration.h" ++int main(int argc, char** argv) { ++ cyber::Init(argv[0]); ++ Time t1(1531225311123456789UL); ++ std::cout << t1.ToString() << std::endl; // 2018-07-10 20:21:51.123456789 ++ // Duration time interval ++ Time t1(100); ++ Duration d(200); ++ Time t2(300); ++ assert(d == (t1-t2)); // true ++} ++ ++``` ++ ++## Record file: Read and Write ++ ++### Reading the Reader file ++ ++**RecordReader** is the component used to read messages in the cyber framework. Each RecordReader can open an existing record file through the `Open` method, and the thread will asynchronously read the information in the record file. The user only needs to execute ReadMessage to extract the latest message in RecordReader, and then get the message information through GetCurrentMessageChannelName, GetCurrentRawMessage, GetCurrentMessageTime. ++ ++**RecordWriter** is the component used to record messages in the cyber framework. Each RecordWriter can create a new record file through the Open method. The user only needs to execute WriteMessage and WriteChannel to write message and channel information, and the writing process is asynchronous. ++ ++### Demo - example(cyber/examples/record.cc) ++ ++Write 100 RawMessage to`TEST_FILE` through `test_write` method, then read them out through `test_read` method. ++ ++```cpp ++#include ++ ++#include "cyber/cyber.h" ++#include "cyber/message/raw_message.h" ++#include "cyber/proto/record.pb.h" ++#include "cyber/record/record_message.h" ++#include "cyber/record/record_reader.h" ++#include "cyber/record/record_writer.h" ++ ++using ::apollo::cyber::record::RecordReader; ++using ::apollo::cyber::record::RecordWriter; ++using ::apollo::cyber::record::RecordMessage; ++using apollo::cyber::message::RawMessage; ++ ++const char CHANNEL_NAME_1[] = "/test/channel1"; ++const char CHANNEL_NAME_2[] = "/test/channel2"; ++const char MESSAGE_TYPE_1[] = "apollo.cyber.proto.Test"; ++const char MESSAGE_TYPE_2[] = "apollo.cyber.proto.Channel"; ++const char PROTO_DESC[] = "1234567890"; ++const char STR_10B[] = "1234567890"; ++const char TEST_FILE[] = "test.record"; ++ ++void test_write(const std::string &writefile) { ++ RecordWriter writer; ++ writer.SetSizeOfFileSegmentation(0); ++ writer.SetIntervalOfFileSegmentation(0); ++ writer.Open(writefile); ++ writer.WriteChannel(CHANNEL_NAME_1, MESSAGE_TYPE_1, PROTO_DESC); ++ for (uint32_t i = 0; i < 100; ++i) { ++ auto msg = std::make_shared("abc" + std::to_string(i)); ++ writer.WriteMessage(CHANNEL_NAME_1, msg, 888 + i); ++ } ++ writer.Close(); ++} ++ ++void test_read(const std::string &readfile) { ++ RecordReader reader(readfile); ++ RecordMessage message; ++ uint64_t msg_count = reader.GetMessageNumber(CHANNEL_NAME_1); ++ AINFO << "MSGTYPE: " << reader.GetMessageType(CHANNEL_NAME_1); ++ AINFO << "MSGDESC: " << reader.GetProtoDesc(CHANNEL_NAME_1); ++ ++ // read all message ++ uint64_t i = 0; ++ uint64_t valid = 0; ++ for (i = 0; i < msg_count; ++i) { ++ if (reader.ReadMessage(&message)) { ++ AINFO << "msg[" << i << "]-> " ++ << "channel name: " << message.channel_name ++ << "; content: " << message.content ++ << "; msg time: " << message.time; ++ valid++; ++ } else { ++ AERROR << "read msg[" << i << "] failed"; ++ } ++ } ++ AINFO << "static msg================="; ++ AINFO << "MSG validmsg:totalcount: " << valid << ":" << msg_count; ++} ++ ++int main(int argc, char *argv[]) { ++ apollo::cyber::Init(argv[0]); ++ test_write(TEST_FILE); ++ sleep(1); ++ test_read(TEST_FILE); ++ return 0; ++} ++``` ++ ++#### Build and run ++ ++- Build: bazel build cyber/examples/… ++- Run: ./bazel-bin/cyber/examples/record ++- Examining result: ++ ++``` ++I1124 16:56:27.248200 15118 record.cc:64] [record] msg[0]-> channel name: /test/channel1; content: abc0; msg time: 888 ++I1124 16:56:27.248227 15118 record.cc:64] [record] msg[1]-> channel name: /test/channel1; content: abc1; msg time: 889 ++I1124 16:56:27.248239 15118 record.cc:64] [record] msg[2]-> channel name: /test/channel1; content: abc2; msg time: 890 ++I1124 16:56:27.248252 15118 record.cc:64] [record] msg[3]-> channel name: /test/channel1; content: abc3; msg time: 891 ++I1124 16:56:27.248297 15118 record.cc:64] [record] msg[4]-> channel name: /test/channel1; content: abc4; msg time: 892 ++I1124 16:56:27.248378 15118 record.cc:64] [record] msg[5]-> channel name: /test/channel1; content: abc5; msg time: 893 ++... ++I1124 16:56:27.250422 15118 record.cc:73] [record] static msg================= ++I1124 16:56:27.250434 15118 record.cc:74] [record] MSG validmsg:totalcount: 100:100 ++``` ++ ++## API Directory ++ ++### Node API ++ ++For additional information and examples, refer to [Node](#node) ++ ++### API List ++ ++```cpp ++//create writer with user-define attr and message type ++auto CreateWriter(const proto::RoleAttributes& role_attr) ++ -> std::shared_ptr>; ++//create reader with user-define attr, callback and message type ++auto CreateReader(const proto::RoleAttributes& role_attr, ++ const croutine::CRoutineFunc& reader_func) ++ -> std::shared_ptr>; ++//create writer with specific channel name and message type ++auto CreateWriter(const std::string& channel_name) ++ -> std::shared_ptr>; ++//create reader with specific channel name, callback and message type ++auto CreateReader(const std::string& channel_name, ++ const croutine::CRoutineFunc& reader_func) ++ -> std::shared_ptr>; ++//create reader with user-define config, callback and message type ++auto CreateReader(const ReaderConfig& config, ++ const CallbackFunc& reader_func) ++ -> std::shared_ptr>; ++//create service with name and specific callback ++auto CreateService(const std::string& service_name, ++ const typename service::Service::ServiceCallback& service_calllback) ++ -> std::shared_ptr>; ++//create client with name to send request to server ++auto CreateClient(const std::string& service_name) ++ -> std::shared_ptr>; ++ ++``` ++ ++## Writer API ++ ++For additional information and examples, refer to [Writer](#writer) ++ ++### API List ++ ++```cpp ++bool Write(const std::shared_ptr& message); ++``` ++ ++## Client API ++ ++For additional information and examples, refer to [Client](#service-creation-and-use) ++ ++### API List ++ ++```cpp ++SharedResponse SendRequest(SharedRequest request, ++ const std::chrono::seconds& timeout_s = std::chrono::seconds(5)); ++SharedResponse SendRequest(const Request& request, ++ const std::chrono::seconds& timeout_s = std::chrono::seconds(5)); ++``` ++ ++## Parameter API ++ ++The interface that the user uses to perform parameter related operations: ++ ++- Set the parameter related API. ++- Read the parameter related API. ++- Create a ParameterService to provide parameter service related APIs for other nodes. ++- Create a ParameterClient that uses the parameters provided by other nodes to service related APIs. ++ ++For additional information and examples, refer to [Parameter](##param-parameter-service) ++ ++### API List - Setting parameters ++ ++```cpp ++Parameter(); // Name is empty, type is NOT_SET ++explicit Parameter(const Parameter& parameter); ++explicit Parameter(const std::string& name); // Type is NOT_SET ++Parameter(const std::string& name, const bool bool_value); ++Parameter(const std::string& name, const int int_value); ++Parameter(const std::string& name, const int64_t int_value); ++Parameter(const std::string& name, const float double_value); ++Parameter(const std::string& name, const double double_value); ++Parameter(const std::string& name, const std::string& string_value); ++Parameter(const std::string& name, const char* string_value); ++Parameter(const std::string& name, const std::string& msg_str, ++ const std::string& full_name, const std::string& proto_desc); ++Parameter(const std::string& name, const google::protobuf::Message& msg); ++``` ++ ++### API List - Reading parameters ++ ++```cpp ++inline ParamType type() const; ++inline std::string TypeName() const; ++inline std::string Descriptor() const; ++inline const std::string Name() const; ++inline bool AsBool() const; ++inline int64_t AsInt64() const; ++inline double AsDouble() const; ++inline const std::string AsString() const; ++std::string DebugString() const; ++template ++typename std::enable_if::value, Type>::type ++value() const; ++template ++typename std::enable_if::value && !std::is_same::value, Type>::type ++value() const; ++template ++typename std::enable_if::value, Type>::type ++value() const; ++template ++typename std::enable_if::value, const std::string&>::type ++value() const; ++template ++typename std::enable_if::value, bool>::type ++value() const; ++``` ++ ++### API List - Creating parameter service ++ ++```cpp ++explicit ParameterService(const std::shared_ptr& node); ++void SetParameter(const Parameter& parameter); ++bool GetParameter(const std::string& param_name, Parameter* parameter); ++bool ListParameters(std::vector* parameters); ++``` ++ ++### API List - Creating parameter client ++ ++```cpp ++ParameterClient(const std::shared_ptr& node, const std::string& service_node_name); ++bool SetParameter(const Parameter& parameter); ++bool GetParameter(const std::string& param_name, Parameter* parameter); ++bool ListParameters(std::vector* parameters); ++``` ++ ++## Timer API ++ ++You can set the parameters of the Timer and call the start and stop interfaces to start the timer and stop the timer. ++For additional information and examples, refer to [Timer](#timer) ++ ++### API List ++ ++```cpp ++Timer(uint32_t period, std::function callback, bool oneshot); ++Timer(TimerOption opt); ++void SetTimerOption(TimerOption opt); ++void Start(); ++void Stop(); ++``` ++ ++## Time API ++ ++For additional information and examples, refer to [Time](#use-of-time) ++ ++### API List ++ ++```cpp ++static const Time MAX; ++static const Time MIN; ++Time() {} ++explicit Time(uint64_t nanoseconds); ++explicit Time(int nanoseconds); ++explicit Time(double seconds); ++Time(uint32_t seconds, uint32_t nanoseconds); ++Time(const Time& other); ++static Time Now(); ++static Time MonoTime(); ++static void SleepUntil(const Time& time); ++double ToSecond() const; ++uint64_t ToNanosecond() const; ++std::string ToString() const; ++bool IsZero() const; ++``` ++ ++## Duration API ++ ++Interval-related interface, used to indicate the time interval, can be initialized according to the specified nanosecond or second. ++ ++### API List ++ ++```cpp ++Duration() {} ++Duration(int64_t nanoseconds); ++Duration(int nanoseconds); ++Duration(double seconds); ++Duration(uint32_t seconds, uint32_t nanoseconds); ++Duration(const Rate& rate); ++Duration(const Duration& other); ++double ToSecond() const; ++int64_t ToNanosecond() const; ++bool IsZero() const; ++void Sleep() const; ++``` ++ ++## Rate API ++ ++The frequency interface is generally used to initialize the time of the sleep frequency after the object is initialized according to the specified frequency. ++ ++### API List ++ ++```cpp ++Rate(double frequency); ++Rate(uint64_t nanoseconds); ++Rate(const Duration&); ++void Sleep(); ++void Reset(); ++Duration CycleTime() const; ++Duration ExpectedCycleTime() const { return expected_cycle_time_; } ++``` ++ ++## RecordReader API ++ ++The interface for reading the record file is used to read the message and channel information in the record file. ++ ++### API List ++ ++```cpp ++RecordReader(); ++bool Open(const std::string& filename, uint64_t begin_time = 0, ++ uint64_t end_time = UINT64_MAX); ++void Close(); ++bool ReadMessage(); ++bool EndOfFile(); ++const std::string& CurrentMessageChannelName(); ++std::shared_ptr CurrentRawMessage(); ++uint64_t CurrentMessageTime(); ++``` ++ ++## RecordWriter API ++ ++The interface for writing the record file, used to record the message and channel information into the record file. ++ ++### API List ++ ++```cpp ++RecordWriter(); ++bool Open(const std::string& file); ++void Close(); ++bool WriteChannel(const std::string& name, const std::string& type, ++ const std::string& proto_desc); ++template ++bool WriteMessage(const std::string& channel_name, const MessageT& message, ++ const uint64_t time_nanosec, ++ const std::string& proto_desc = ""); ++bool SetSizeOfFileSegmentation(uint64_t size_kilobytes); ++bool SetIntervalOfFileSegmentation(uint64_t time_sec); ++``` +diff --color -Naur cyber/docs/cyber_developer_tools.md /opt/apollo/cyber/docs/cyber_developer_tools.md +--- cyber/docs/cyber_developer_tools.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/cyber_developer_tools.md 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,379 @@ ++# Apollo Cyber RT Developer Tools ++ ++Apollo Cyber RT framework comes with a collection of useful tools for daily development, including one visualization ++tool cyber_visualizer and two command line tools cyber_monitor and cyber_recorder. ++ ++_Note: apollo docker environment is required to use the tools, please follow apollo wiki to enter docker_ ++ ++All the tools from Apollo Cyber RT rely on Apollo Cyber RT library, so you must source the setup.bash file for ++environment setup before using any Apollo Cyber RT tools, shown as below: ++ ++```bash ++username@computername:~$: source /your-path-to-apollo-install-dir/cyber/setup.bash ++``` ++ ++## Cyber_visualizer ++ ++### Install and run ++ ++`cyber_visualizer` is a visualization tool for displaying the channel data in Apollo Cyber RT. ++ ++```bash ++username@computername:~$: source /your-path-to-apollo-install-dir/cyber/setup.bash ++username@computername:~$: cyber_visualizer ++``` ++ ++### Interacting with cyber_visualizer ++ ++- After launching cyber_visualizer, you will see the following interface: ++ ++ ![interface](./images/cyber_visualizer1.png) ++ ++- When data flow through channels in Apollo Cyber RT, the list of all channels are displayed under `ChannelNames` as ++ seen in the figure below. For example, you can use the record tool(cyber_recorder) of Apollo Cyber RT to replay data ++ from another terminal, then `cyber_visualizer` will receive information of all active channels(from replay data) and ++ display it. ++ ++ ![channel information](./images/cyber_visualizer2.png) ++ ++- By clicking on options in toolbar, you can enable reference grid, display point clouds, add images, or display ++ multiple camera's data at the same time. If you have `Show Grid` option enabled, you can set the color of the grid by ++ double-clicking the `Color` item of the `Grid` list below `ChannelNames`. The default color is gray. You can also edit ++ the value of `CellCount` to adjust the number of cells in the grid. As for a point cloud or an image, you can select ++ the source channel through its `ChannelName` sub-item, and `Action` sub-item to play or stop the data from the ++ corresponding channel. As shown in figure below, three cameras' channel data on the button sections and one point ++ cloud channel data on the top section are displayed simultaneously. ++ ++ ![visualization](./images/cyber_visualizer3.png) ++ ++- To adjust the virtual camera in the 3D point cloud scene, you can right click on the point cloud display section. A ++ dialog box will pop up as shown in figure below. ++ ++ ![visualization](./images/cyber_visualizer4.png) ++ ++ The point cloud scene supports two types of cameras: Free and Target.(select Type from pop up dialog above) ++ ++ - **Free type Camera**: For this type of camera in the point cloud scene, you can change the pose of the camera by ++ holding down either left or right mouse button and move it. To change the pitch of camera, you can scroll the mouse ++ wheel. ++ - **Target type Camera**: For this type of camera in the point cloud scene, to change the camera's viewing angle, you ++ can hold down the left mouse button and then move it. To change the distance of the camera to the observed point ++ (the default observation point is the coordinate system origin (0, 0,0)), you can scroll the mouse wheel. ++ ++ You can also modify the camera information directly in the dialog box to change the camera's observation status in the ++ point cloud scene. And the "Step" item is the step value from the dialog box. ++ ++ Place the mouse on the image of the camera channel, you can double-click the left button to highlight the ++ corresponding data channel on the left menu bar. Right click on the image to bring up menu for deleting the camera ++ channel. ++ ++ Play and Pause buttons: when clicking the `Play` button, all channels will be shown. While when clicking the `Pause` ++ button, all channels will stop showing on the tool. ++ ++## Cyber_monitor ++ ++### Install and run ++ ++The command line tool `cyber_monitor` provides a clear view of the list of real time channel information Apollo Cyber RT ++in the terminal. ++ ++```bash ++username@computername:~$: source /your-path-to-apollo-install-dir/cyber/setup.bash ++username@computername:~$: cyber_monitor ++``` ++ ++### Useful commands ++ ++#### Display help information ++ ++Use the -h option to get help for cyber_monitor ++ ++```bash ++username@computername:~$: cyber_monitor -h ++``` ++ ++#### Specify the channel ++ ++With the -c option, you can have cyber_monitor to monitor only a specified channel, such as: ++ ++```bash ++username@computername:~$: cyber_monitor -c ChannelName ++``` ++ ++## Get familiar with UI of cyber_monitor ++ ++After launching the command line tool, you will notice it is similar to cyber_visualizer. It automatically collects the ++information of all the channels through the topology and displays them in two columns (channel name, channel data type). ++ ++The default display for channel information is in red. However, if there is data flowing through the a channel, the ++corresponding line of the channel is displayed in green. As shown in the image below: ++ ++![monitor](./images/cyber_monitor.png) ++ ++### Interacting with cyber_monitor ++ ++#### Common commands ++ ++``` ++ESC | q key ---- Exit ++Backspace ---- Back ++h | H ---- Show help page ++``` ++ ++#### Common command for topology and channel ++ ++``` ++PageDown | Ctrl+d --- Next ++PageUp | Ctrl+u --- Previous ++Up, down or w, s keys ---- Move the current highlight line up and down ++Right arrow or d key ---- Enter highlight line, display highlighted line data in detail ++Left arrow or a key ------ Return to the previous layer from the current ++Enter key ----- Same as d key ++``` ++ ++#### Commands only for topology ++ ++``` ++f | F ----- Display frame rate ++t | T ----- Display channel message type ++Space ----- Close|Open channel (only valid for channels with data arrival; yellow color after channel is closed) ++``` ++ ++#### Commands only for channel ++ ++``` ++i | I ----- Display channel Reader and Writer information ++b | B ------ Display channel message content ++``` ++ ++#### View the repeated data field in a channel ++ ++``` ++n | N ---- Repeat the next data in the domain ++m | M ---- Repeat one data on the domain ++``` ++ ++## Cyber_recorder ++ ++`cyber_recorder` is a record/playback tool provided by Apollo Cyber RT. It provides many useful functions, including ++recording a record file, playing back a record file, splitting a record file, checking the information of record file ++and etc. ++ ++### Install and run ++ ++Launch cyber_recorder: ++ ++```bash ++$ source /your-path-to-apollo-install-dir/cyber/setup.bash ++$ cyber_recorder ++usage: cyber_recorder > [] ++The cyber_recorder commands are: ++ info Show information of an exist record. ++ play Play an exist record. ++ record Record same topic. ++ split Split an exist record. ++ recover Recover an exist record. ++``` ++ ++### Commands of cyber_recorder ++ ++- To view the information of a record file: ++ ++``` ++$ cyber_recorder info -h ++usage: cyber_recorder info [options] ++ -h, --help show help message ++``` ++ ++- To record a record file ++ ++``` ++$ cyber_recorder record -h ++usage: cyber_recorder record [options] ++ -o, --output output record file ++ -a, --all all channels ++ -c, --white-channel only record the specified channel ++ -k, --black-channel not record the specified channel ++ -i, --segment-interval record segmented every n second(s) ++ -m, --segment-size record segmented every n megabyte(s) ++ -h, --help show help message ++ ++``` ++ ++- To play back a record file: ++ ++``` ++$ cyber_recorder play -h ++usage: cyber_recorder play [options] ++ -f, --file input record file ++ -a, --all play all ++ -c, --white-channel only play the specified channel ++ -k, --black-channel not play the specified channel ++ -l, --loop loop play ++ -r, --rate <1.0> multiply the play rate by FACTOR ++ -b, --begin <2018-07-01 00:00:00> play the record begin at ++ -e, --end <2018-07-01 00:01:00> play the record end at ++ -s, --start play started at n seconds ++ -d, --delay play delayed n seconds ++ -p, --preload play after trying to preload n second(s) ++ -h, --help show help message ++``` ++ ++- To split a record file: ++ ++``` ++$ cyber_recorder split -h ++usage: cyber_recorder split [options] ++ -f, --file input record file ++ -o, --output output record file ++ -a, --all all channels ++ -c, --white-channel only split the specified channel ++ -k, --black-channel not split the specified channel ++ -b, --begin <2018-07-01 00:00:00> begin at assigned time ++ (in the form of String, e.g. "2018-07-01 00:00:00") ++ -e, --end <2018-07-01 01:00:00> end at assigned time ++ (in the form of String, e.g. "2018-07-01 00:00:00") ++``` ++ ++- To repair a record file: ++ ++``` ++$ cyber_recorder recover -h ++usage: cyber_recorder recover [options] ++ -f, --file input record file ++ -o, --output output record file ++``` ++ ++### Examples of using cyber_recorder ++ ++#### Check the details of a record file ++ ++``` ++$ cyber_recorder info demo.record ++record_file: demo.record ++version: 1.0 ++duration: 19.995227 Seconds ++begin_time: 2018-04-17 06:25:36 ++end_time: 2018-04-17 06:25:55 ++size: 28275479 Bytes (26.965598 MB) ++is_complete: true ++message_number: 15379 ++channel_number: 16 ++channel_info: /apollo/localization/pose 2000 messages : apollo.localization.LocalizationEstimate ++ /tf 4000 messages : apollo.transform.TransformStampeds ++ /apollo/control 2000 messages : apollo.control.ControlCommand ++ /apollo/sensor/gnss/odometry 2000 messages : apollo.localization.Gps ++ /apollo/canbus/chassis 2000 messages : apollo.canbus.Chassis ++ /apollo/sensor/gnss/imu 1999 messages : apollo.drivers.gnss.Imu ++ /apollo/sensor/gnss/rtk_obs 41 messages : apollo.drivers.gnss.EpochObservation ++ /apollo/sensor/gnss/ins_stat 20 messages : apollo.drivers.gnss.InsStat ++ /apollo/sensor/gnss/best_pose 20 messages : apollo.drivers.gnss.GnssBestPose ++ /apollo/perception/obstacles 400 messages : apollo.perception.PerceptionObstacles ++ /apollo/prediction 400 messages : apollo.prediction.PredictionObstacles ++ /apollo/sensor/conti_radar 270 messages : apollo.drivers.ContiRadar ++ /apollo/planning 200 messages : apollo.planning.ADCTrajectory ++ /apollo/monitor/static_info 1 messages : apollo.data.StaticInfo ++ /apollo/sensor/gnss/rtk_eph 25 messages : apollo.drivers.gnss.GnssEphemeris ++ /apollo/monitor 3 messages : apollo.common.monitor.MonitorMessage ++ ++``` ++ ++#### Record a record file ++ ++``` ++$ cyber_recorder record -a ++[RUNNING] Record : total channel num : 1 total msg num : 5 ++... ++``` ++ ++#### Replay a record file ++ ++``` ++$ cyber_recorder play -f 20180720202307.record ++file: 20180720202307.record, chunk_number: 1, begin_time: 1532089398663399667, end_time: 1532089404688079759, message_number: 75 ++please wait for loading and playing back record... ++Hit Ctrl+C to stop replay, or Space to pause. ++[RUNNING] Record Time: 1532089404.688080 Progress: 6.024680 / 6.024680 ++play finished. file: 20180720202307.record ++``` ++ ++## rosbag_to_record ++ ++`rosbag_to_record` is a tool which can convert rosbag to recorder file provided by Apollo Cyber RT. Now the tool support ++following channel: ++ ++``` ++/apollo/perception/obstacles ++/apollo/planning ++/apollo/prediction ++/apollo/canbus/chassis ++/apollo/control ++/apollo/guardian ++/apollo/localization/pose ++/apollo/perception/traffic_light ++/apollo/drive_event ++/apollo/sensor/gnss/odometry ++/apollo/monitor/static_info ++/apollo/monitor ++/apollo/canbus/chassis_detail ++/apollo/control/pad ++/apollo/navigation ++/apollo/routing_request ++/apollo/routing_response ++/tf ++/tf_static ++/apollo/sensor/conti_radar ++/apollo/sensor/delphi_esr ++/apollo/sensor/gnss/best_pose ++/apollo/sensor/gnss/imu ++/apollo/sensor/gnss/ins_stat ++/apollo/sensor/gnss/rtk_eph ++/apollo/sensor/gnss/rtk_obs ++/apollo/sensor/velodyne64/compensator/PointCloud2 ++``` ++ ++### Install and run ++ ++Launch rosbag_to_record: ++ ++```bash ++$ source /your-path-to-apollo-install-dir/cyber/setup.bash ++$ rosbag_to_record ++Usage: ++ rosbag_to_record input.bag output.record ++``` ++ ++### Example ++ ++We can convert [Apollo2.5 demo bag](https://github.com/ApolloAuto/apollo/releases/download/v2.5.0/demo_2.5.bag) to ++record file. ++ ++```bash ++$ rosbag_to_record demo_2.5.bag demo.record ++record_file: demo.record ++version: 1.0 ++duration: 19.995227 Seconds ++begin_time: 2018-04-17 06:25:36 ++end_time: 2018-04-17 06:25:55 ++size: 28275479 Bytes (26.965598 MB) ++is_complete: true ++message_number: 15379 ++channel_number: 16 ++channel_info: /apollo/localization/pose 2000 messages : apollo.localization.LocalizationEstimate ++ /tf 4000 messages : apollo.transform.TransformStampeds ++ /apollo/control 2000 messages : apollo.control.ControlCommand ++ /apollo/sensor/gnss/odometry 2000 messages : apollo.localization.Gps ++ /apollo/canbus/chassis 2000 messages : apollo.canbus.Chassis ++ /apollo/sensor/gnss/imu 1999 messages : apollo.drivers.gnss.Imu ++ /apollo/sensor/gnss/rtk_obs 41 messages : apollo.drivers.gnss.EpochObservation ++ /apollo/sensor/gnss/ins_stat 20 messages : apollo.drivers.gnss.InsStat ++ /apollo/sensor/gnss/best_pose 20 messages : apollo.drivers.gnss.GnssBestPose ++ /apollo/perception/obstacles 400 messages : apollo.perception.PerceptionObstacles ++ /apollo/prediction 400 messages : apollo.prediction.PredictionObstacles ++ /apollo/sensor/conti_radar 270 messages : apollo.drivers.ContiRadar ++ /apollo/planning 200 messages : apollo.planning.ADCTrajectory ++ /apollo/monitor/static_info 1 messages : apollo.data.StaticInfo ++ /apollo/sensor/gnss/rtk_eph 25 messages : apollo.drivers.gnss.GnssEphemeris ++ /apollo/monitor 3 messages : apollo.common.monitor.MonitorMessage ++Conversion finished! Took 0.505623051 seconds in total. ++``` +diff --color -Naur cyber/docs/cyber_faqs.md /opt/apollo/cyber/docs/cyber_faqs.md +--- cyber/docs/cyber_faqs.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/cyber_faqs.md 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,114 @@ ++# Apollo Cyber RT FAQs ++ ++## What is Apollo Cyber RT? ++ ++Apollo's Cyber RT is an open source runtime framework designed specifically for autonomous driving scenarios. Based on a ++centralized computing model, it is highly optimized for performance, latency, and data throughput. ++ ++--- ++ ++## Why did we decide to work on a new runtime framework? ++ ++- During years of development of autonomous driving technologies, we have learned a lot from our previous experience ++ with Apollo. In autonomous driving scenarious, we need an effective centralized computing model, with demands for high ++ performance, including high concurrency, low latency and high throughput。 ++ ++- The industry is evolving, so does Apollo. Going forward, Apollo has already moved from development to productization, ++ with volume deployments in the real world, we see the demands for the highest robustness and high performance. That’s ++ why we spent years of building Apollo Cyber RT, which addresses that requirements of autonomous driving solutions. ++ ++--- ++ ++## What are the advantages of the new runtime framework? ++ ++- Accelerate development ++ - Well defined task interface with data fusion ++ - Array of development tools ++ - Large set of sensor drivers ++- Simplify deployment ++ - Efficient and adaptive message communication ++ - Configurable user level scheduler with resource awareness ++ - Portable with fewer dependencies ++- Empower your own autonomous vehicles ++ - The default open source runtime framework ++ - Building blocks specifically designed for autonomous driving ++ - Plug and play your own AD system ++ ++--- ++ ++## Can we still use the data that we have collected? ++ ++- If the data you have collected is compatible with the previous versions of Apollo, you could use our recommended ++ conversion tools to make the data compliant with our new runtime framework ++- If you created a customized data format, then the previously generated data will not be supported by the new runtime ++ framework ++ ++--- ++ ++## Will you continue to support ROS? ++ ++We will continue to support previous Apollo releases (3.0 and before) based on ROS. We do appreciate you continue ++growing with us and highly encourage you to move to Apollo 3.5. While we know that some of our developers would prefer ++to work on ROS, we do hope you will understand why Apollo as a team cannot continue to support ROS in our future ++releases as we strive to work towards developing a more holistic platform that meets automotive standards. ++ ++--- ++ ++## Will Apollo Cyber RT affect regular code development? ++ ++If you have not modified anything at runtime framework layer and have only worked on Apollo's module code base, you will ++not be affected by the introduction of our new runtime framework as most of time you would only need to re-interface the ++access of the input and output data. ++ ++--- ++ ++## Recommended setup for Apollo Cyber RT ++ ++- The runtime framework also uses apollo's docker environment ++- It is recommended to run source setup.bash when opening a new terminal ++- Fork and clone the Apollo repo with the new framework code which can be found at [apollo/cyber](../../cyber/) ++ ++## How to enable SHM to decrease the latency? ++ ++To decrease number of threads, the readable notification mechanism of shared memory was changed in CyberRT. The default ++mechanism is UDP multicast, and system call(sendto) will cause some latency. ++ ++So, to decrease the latency, you can change the mechanism, The steps are listed as following: ++ ++1. update the CyberRT to the latest version; ++2. uncomment the transport_conf in [cyber.pb.conf](../../cyber/conf/cyber.pb.conf); ++3. change **notifier_type** of **shm_conf** from "multicast" to "condition"; ++4. build CyberRT with opt like `bazel build -c opt --copt=-fpic //cyber/...`; ++5. run talker and listener; ++ ++Note:You can select the corresponding transmission method according to the relationship between nodes.For example, the ++default configuration is **INTRA** in the process, **SHM** between the host process, and **RTPS** across the host. Of ++course you can change all three to RTPS. Or change `same_proc` and `diff_proc` to **SHM**; ++ ++## How to use the no serialization message? ++ ++The message types supported by Cyber RT include both serializable structured data like protobuf and raw sequence of ++bytes. You can refer the sample code: ++ ++- apollo::cyber::message::RawMessage ++- talker: https://github.com/gruminions/apollo/blob/record/cyber/examples/talker.cc ++- listener: https://github.com/gruminions/apollo/blob/record/cyber/examples/listener.cc ++ ++## How to configure multiple hosts communication? ++ ++Make sure the two hosts(or more) are under the same network segment of the local area network, Like `192.168.10.6` and ++`192.168.10.7`. ++ ++You just need to modify `CYBER_IP` of `/apollo/cyber/setup.bash` ++ ++```bash ++export CYBER_IP=127.0.0.1 ++``` ++ ++Suppose you have two hosts A and B,the ip of A is `192.168.10.6`, and the ip of B is `192.168.10.7`. Then set ++`CYBER_IP` to `192.168.10.6` on host A, and set `CYBER_IP` to `192.168.10.7` on host B. Now host A can communicate with ++host B. ++ ++--- ++ ++More FAQs to follow... +diff --color -Naur cyber/docs/cyber_python_api_cn.md /opt/apollo/cyber/docs/cyber_python_api_cn.md +--- cyber/docs/cyber_python_api_cn.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/cyber_python_api_cn.md 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,415 @@ ++# Apollo Cyber RT Python API ++ ++## 1. 背景 ++ ++Cyber 核心代码是由 C++ 开发,同时为了方便开发者,提供了 Python 接口。 ++ ++## 2. CyberRT Python 接口实现思路 ++ ++Cyber Python 接口的实现思路是在 Cyber C++ 实现的基础上,做了一层 Python 的封装,由 Python 来调用 C++ 的实现函数。Cyber ++Python Wrapper 的实现没有使用 swig 等第三方工具,完全自主实现,以此保证代码的高可维护性和可读性。 ++ ++## 3. 主要接口 ++ ++目前提供的主要接口包括: ++ ++- channel 读、写 ++- server/client 通信 ++- record 信息查询 ++- record 文件读、写 ++- Time/Duration/Rate 时间操作 ++- Timer ++ ++### 3.1 Channel 读写接口 ++ ++使用步骤是: ++ ++1. 首先创建 Node; ++2. 创建对应的 reader 或 writer; ++3. 如果是向 channel 写数据,调用 writer 的 write 接口; ++4. 如果是从 channel 读数据,调用 node 的 spin,对收到的消息进行消费; ++ ++接口定义如下: ++ ++```python ++class Node: ++ """ ++ Class for cyber Node wrapper. ++ """ ++ ++ def create_writer(self, name, data_type, qos_depth=1): ++ """ ++ create a topic writer for send message to topic. ++ @param self ++ @param name str: topic name ++ @param data_type proto: message class for serialization ++ """ ++ ++ def create_reader(self, name, data_type, callback, args=None): ++ """ ++ create a topic reader for receive message from topic. ++ @param self ++ @param name str: topic name ++ @param data_type proto: message class for serialization ++ @callback fn: function to call (fn(data)) when data is ++ received. If args is set, the function must ++ accept the args as a second argument, ++ i.e. fn(data, args) ++ @args any: additional arguments to pass to the callback ++ """ ++ def create_client(self, name, request_data_type, response_data_type): ++ """ ++ """ ++ def create_service(self, name, req_data_type, res_data_type, callback, args=None): ++ ++ def spin(self): ++ """ ++ spin in wait and process message. ++ @param self ++ """ ++ ++class Writer(object): ++ """ ++ Class for cyber writer wrapper. ++ """ ++ def write(self, data): ++ """ ++ writer msg string ++ """ ++``` ++ ++### 3.2 Record 接口 ++ ++Record 读的操作是: ++ ++1. 创建一个 RecordReader; ++2. 对 Record 进行迭代读; ++ ++Record 写的操作是: ++ ++1. 创建一个 RecordWriter ++2. 对 Record 进行写消息; ++ ++接口定义如下: ++ ++```python ++class RecordReader(object): ++ """ ++ Class for cyber RecordReader wrapper. ++ """ ++ def read_messages(self, start_time=0, end_time=18446744073709551615): ++ """ ++ read message from bag file. ++ @param self ++ @param start_time: ++ @param end_time: ++ @return: generator of (message, data_type, timestamp) ++ """ ++ def get_messagenumber(self, channel_name): ++ """ ++ return message count. ++ """ ++ def get_messagetype(self, channel_name): ++ """ ++ return message type. ++ """ ++ def get_protodesc(self, channel_name): ++ """ ++ return message protodesc. ++ """ ++ def get_headerstring(self): ++ """ ++ return message header string. ++ """ ++ def reset(self): ++ """ ++ return reset. ++ """ ++ return _CYBER_RECORD.PyRecordReader_Reset(self.record_reader) ++ ++ def get_channellist(self): ++ """ ++ return channel list. ++ """ ++ return _CYBER_RECORD.PyRecordReader_GetChannelList(self.record_reader) ++ ++ ++class RecordWriter(object): ++ """ ++ Class for cyber RecordWriter wrapper. ++ """ ++ def open(self, path): ++ """ ++ open record file for write. ++ """ ++ def write_channel(self, channel_name, type_name, proto_desc): ++ """ ++ writer channel by channelname,typename,protodesc ++ """ ++ def write_message(self, channel_name, data, time, raw = True): ++ """ ++ writer msg:channelname,data,time,is data raw ++ """ ++ ++ def set_size_fileseg(self, size_kilobytes): ++ """ ++ return filesegment size. ++ """ ++ ++ def set_intervaltime_fileseg(self, time_sec): ++ """ ++ return file interval time. ++ """ ++ ++ def get_messagenumber(self, channel_name): ++ """ ++ return message count. ++ """ ++ ++ def get_messagetype(self, channel_name): ++ """ ++ return message type. ++ """ ++ ++ def get_protodesc(self, channel_name): ++ """ ++ return message protodesc. ++ """ ++``` ++ ++### 3.3 Time 接口 ++ ++```python ++class Time(object): ++ @staticmethod ++ def now(): ++ time_now = Time(_CYBER_TIME.PyTime_now()) ++ return time_now ++ ++ @staticmethod ++ def mono_time(): ++ mono_time = Time(_CYBER_TIME.PyTime_mono_time()) ++ return mono_time ++ ++ def to_sec(self): ++ return _CYBER_TIME.PyTime_to_sec(self.time) ++ ++ def to_nsec(self): ++ return _CYBER_TIME.PyTime_to_nsec(self.time) ++ ++ def sleep_until(self, nanoseconds): ++ return _CYBER_TIME.PyTime_sleep_until(self.time, nanoseconds) ++``` ++ ++### 3.4 Timer 接口 ++ ++``` ++ ++class Timer(object): ++ ++ def set_option(self, period, callback, oneshot=0): ++ ''' ++ period The period of the timer, unit is ms ++ callback The tasks that the timer needs to perform ++ oneshot 1: perform the callback only after the first timing cycle ++ 0:perform the callback every timed period ++ ''' ++ ++ ++ def start(self): ++ ++ ++ def stop(self): ++ ++ ++``` ++ ++## 4. 例子 ++ ++### 4.1 读 channel (参见 cyber/python/cyber_py3/examples/listener.py) ++ ++```python ++"""Module for example of listener.""" ++from cyber_py3 import cyber ++from cyber.proto.unit_test_pb2 import ChatterBenchmark ++ ++ ++def callback(data): ++ """ ++ Reader message callback. ++ """ ++ print("=" * 80) ++ print("py:reader callback msg->:") ++ print(data) ++ print("=" * 80) ++ ++ ++def test_listener_class(): ++ """ ++ Reader message. ++ """ ++ print("=" * 120) ++ test_node = cyber.Node("listener") ++ test_node.create_reader("channel/chatter", ChatterBenchmark, callback) ++ test_node.spin() ++ ++ ++if __name__ == '__main__': ++ cyber.init() ++ test_listener_class() ++ cyber.shutdown() ++ ++``` ++ ++### 4.2 写 channel(参见 cyber/python/cyber_py3/examples/talker.py) ++ ++```python ++"""Module for example of talker.""" ++import time ++ ++from cyber_py3 import cyber ++from cyber.proto.unit_test_pb2 import ChatterBenchmark ++ ++ ++def test_talker_class(): ++ """ ++ Test talker. ++ """ ++ msg = ChatterBenchmark() ++ msg.content = "py:talker:send Alex!" ++ msg.stamp = 9999 ++ msg.seq = 0 ++ print(msg) ++ test_node = cyber.Node("node_name1") ++ g_count = 1 ++ ++ writer = test_node.create_writer("channel/chatter", ChatterBenchmark, 6) ++ while not cyber.is_shutdown(): ++ time.sleep(1) ++ g_count = g_count + 1 ++ msg.seq = g_count ++ msg.content = "I am python talker." ++ print("=" * 80) ++ print("write msg -> %s" % msg) ++ writer.write(msg) ++ ++ ++if __name__ == '__main__': ++ cyber.init("talker_sample") ++ test_talker_class() ++ cyber.shutdown() ++ ++``` ++ ++### 4.3 读写消息到 Record 文件(参见 cyber/python/cyber_py3/examples/record.py) ++ ++````python ++cyber/python/cyber_py3/examples/record.py) ++ ++```python ++""" ++Module for example of record. ++Run with: ++ bazel run //cyber/python/cyber_py3/examples:record ++""" ++ ++import time ++ ++from google.protobuf.descriptor_pb2 import FileDescriptorProto ++ ++from cyber.proto.unit_test_pb2 import Chatter ++from cyber.python.cyber_py3 import record ++from modules.common.util.testdata.simple_pb2 import SimpleMessage ++ ++ ++MSG_TYPE = "apollo.common.util.test.SimpleMessage" ++MSG_TYPE_CHATTER = "apollo.cyber.proto.Chatter" ++ ++ ++def test_record_writer(writer_path): ++ """ ++ Record writer. ++ """ ++ fwriter = record.RecordWriter() ++ fwriter.set_size_fileseg(0) ++ fwriter.set_intervaltime_fileseg(0) ++ ++ if not fwriter.open(writer_path): ++ print('Failed to open record writer!') ++ return ++ print('+++ Begin to writer +++') ++ ++ # Writer 2 SimpleMessage ++ msg = SimpleMessage() ++ msg.text = "AAAAAA" ++ ++ file_desc = msg.DESCRIPTOR.file ++ proto = FileDescriptorProto() ++ file_desc.CopyToProto(proto) ++ proto.name = file_desc.name ++ desc_str = proto.SerializeToString() ++ print(msg.DESCRIPTOR.full_name) ++ fwriter.write_channel( ++ 'simplemsg_channel', msg.DESCRIPTOR.full_name, desc_str) ++ fwriter.write_message('simplemsg_channel', msg, 990, False) ++ fwriter.write_message('simplemsg_channel', msg.SerializeToString(), 991) ++ ++ # Writer 2 Chatter ++ msg = Chatter() ++ msg.timestamp = 99999 ++ msg.lidar_timestamp = 100 ++ msg.seq = 1 ++ ++ file_desc = msg.DESCRIPTOR.file ++ proto = FileDescriptorProto() ++ file_desc.CopyToProto(proto) ++ proto.name = file_desc.name ++ desc_str = proto.SerializeToString() ++ print(msg.DESCRIPTOR.full_name) ++ fwriter.write_channel('chatter_a', msg.DESCRIPTOR.full_name, desc_str) ++ fwriter.write_message('chatter_a', msg, 992, False) ++ msg.seq = 2 ++ fwriter.write_message("chatter_a", msg.SerializeToString(), 993) ++ ++ fwriter.close() ++ ++ ++def test_record_reader(reader_path): ++ """ ++ Record reader. ++ """ ++ freader = record.RecordReader(reader_path) ++ time.sleep(1) ++ print('+' * 80) ++ print('+++ Begin to read +++') ++ count = 0 ++ for channel_name, msg, datatype, timestamp in freader.read_messages(): ++ count += 1 ++ print('=' * 80) ++ print('read [%d] messages' % count) ++ print('channel_name -> %s' % channel_name) ++ print('msgtime -> %d' % timestamp) ++ print('msgnum -> %d' % freader.get_messagenumber(channel_name)) ++ print('msgtype -> %s' % datatype) ++ print('message is -> %s' % msg) ++ print('***After parse(if needed),the message is ->') ++ if datatype == MSG_TYPE: ++ msg_new = SimpleMessage() ++ msg_new.ParseFromString(msg) ++ print(msg_new) ++ elif datatype == MSG_TYPE_CHATTER: ++ msg_new = Chatter() ++ msg_new.ParseFromString(msg) ++ print(msg_new) ++ ++ ++if __name__ == '__main__': ++ test_record_file = "/tmp/test_writer.record" ++ ++ print('Begin to write record file: {}'.format(test_record_file)) ++ test_record_writer(test_record_file) ++ ++ print('Begin to read record file: {}'.format(test_record_file)) ++ test_record_reader(test_record_file) ++ ++```` +diff --color -Naur cyber/docs/cyber_quick_start_cn.md /opt/apollo/cyber/docs/cyber_quick_start_cn.md +--- cyber/docs/cyber_quick_start_cn.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/cyber_quick_start_cn.md 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,211 @@ ++# Apollo Cyber RT 快速开始 ++ ++## 如何使用 Cyber RT 创建新的组件 ++ ++Apollo 的 Cyber RT 框架是基于组件概念来构建的。每个组件都是 Cyber RT 框架的一个特定的算法模块, 处理一组输入并产生其输出 ++数椐。 ++ ++要创建并启动一个算法组件,需要通过以下 4 个步骤: ++ ++- 初如化组件的目录结构 ++- 实现组件类 ++- 设置配置文件 ++- 启动组件 ++ ++下面的例子展示了如何创建、编译和运行一个组件。想更深入地探索 Cyber RT 框架,了解其各种功能,可参考`cyber/examples/`目录 ++下的更多示例。 ++ ++_Note: 这些例子必须运行在 Apollo Docker 环境内, 且需要通过 Bazel 来编译。_ ++ ++### 初始化组件的目录结构 ++ ++以`cyber/examples/common_component_example/`目录下的样例程序为例: ++ ++- C++头文件: common_component_example.h ++- C++源文件: common_component_example.cc ++- Bazel 构建文件: BUILD ++- DAG 文件: common.dag ++- Launch 文件: common.launch ++ ++### 实现组件类 ++ ++#### 头文件 ++ ++如何实现`common_component_example.h`: ++ ++- 继承 Component 类 ++- 定义自己的 `Init` 和 `Proc` 函数。Proc 需要指定输入数椐类型。 ++- 使用`CYBER_REGISTER_COMPONENT`宏定义把组件类注册成全局可用。 ++ ++```cpp ++#include ++ ++#include "cyber/component/component.h" ++#include "cyber/examples/proto/examples.pb.h" ++ ++using apollo::cyber::Component; ++using apollo::cyber::ComponentBase; ++using apollo::cyber::examples::proto::Driver; ++ ++class CommonComponentSample : public Component { ++ public: ++ bool Init() override; ++ bool Proc(const std::shared_ptr& msg0, ++ const std::shared_ptr& msg1) override; ++}; ++CYBER_REGISTER_COMPONENT(CommonComponentSample) ++``` ++ ++#### 源文件 ++ ++对于源文件 `common_component_example.cc`, `Init` 和 `Proc` 这两个函数需要实现。 ++ ++```cpp ++#include "cyber/examples/common_component_example/common_component_example.h" ++ ++bool CommonComponentSample::Init() { ++ AINFO << "Commontest component init"; ++ return true; ++} ++ ++bool CommonComponentSample::Proc(const std::shared_ptr& msg0, ++ const std::shared_ptr& msg1) { ++ AINFO << "Start common component Proc [" << msg0->msg_id() << "] [" ++ << msg1->msg_id() << "]"; ++ return true; ++} ++``` ++ ++#### 创建 BUILD 文件 ++ ++```python ++load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") ++load("//tools:cpplint.bzl", "cpplint") ++ ++package(default_visibility = ["//visibility:public"]) ++ ++cc_binary( ++ name = "libcommon_component_example.so", ++ linkshared = True, ++ linkstatic = False, ++ deps = [":common_component_example_lib"], ++) ++ ++cc_library( ++ name = "common_component_example_lib", ++ srcs = ["common_component_example.cc"], ++ hdrs = ["common_component_example.h"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ "//cyber", ++ "//cyber/examples/proto:examples_cc_proto", ++ ], ++) ++cpplint() ++``` ++ ++### 设置配置文件 ++ ++#### 配置 DAG 文件 ++ ++在 DAG 依赖配置文件 (例如 common.dag) 中配置如下项: ++ ++- Channel names: 输入 Channel 的名称 ++- Library path: 该组件生成的共享库路径 ++- Class name: 此组件类的名称 ++ ++```bash ++# Define all components in DAG streaming. ++module_config { ++module_library : "/apollo/bazel-bin/cyber/examples/common_component_example/libcommon_component_example.so" ++components { ++ class_name : "CommonComponentSample" ++ config { ++ name : "common" ++ readers { ++ channel: "/apollo/prediction" ++ } ++ readers { ++ channel: "/apollo/test" ++ } ++ } ++ } ++} ++``` ++ ++#### 配置 Launch 启动文件 ++ ++在 launch 启动文件中 (`common.launch`), 配置下面的项: ++ ++- 组件的名字 ++- 上一步配置的 DAG 文件路径 ++- 运行组件时的进程名 ++ ++```xml ++ ++ ++ common ++ /apollo/cyber/examples/common_component_example/common.dag ++ common ++ ++ ++``` ++ ++### 启动这个组件 ++ ++通过下面的命令来编译组件: ++ ++```bash ++cd /apollo ++bash apollo.sh build ++``` ++ ++然后配置环境: ++ ++```bash ++source cyber/setup.bash ++# 从终端观察输出 ++export GLOG_alsologtostderr=1 ++``` ++ ++有两种方法来启动组件: ++ ++- 使用 Launch 文件启动(推荐) ++ ++```bash ++cyber_launch start cyber/examples/common_component_example/common.launch ++``` ++ ++- 使用 DAG 文件启动 ++ ++```bash ++mainboard -d cyber/examples/common_component_example/common.dag ++``` ++ ++#### 提供通道数据给组件处理 ++ ++打开另一终端, 运行: ++ ++```bash ++source cyber/setup.bash ++export GLOG_alsologtostderr=1 ++/apollo/bazel-bin/cyber/examples/common_component_example/channel_test_writer ++``` ++ ++再打开一个终端并运行: ++ ++```bash ++source cyber/setup.bash ++export GLOG_alsologtostderr=1 ++/apollo/bazel-bin/cyber/examples/common_component_example/channel_prediction_writer ++``` ++ ++这时,如果成功,你会看到第一个终端有如下的输出: ++ ++``` ++I0331 16:49:34.736016 1774773 common_component_example.cc:25] [mainboard]Start common component Proc [1094] [766] ++I0331 16:49:35.069005 1774775 common_component_example.cc:25] [mainboard]Start common component Proc [1095] [767] ++I0331 16:49:35.402289 1774783 common_component_example.cc:25] [mainboard]Start common component Proc [1096] [768] ++``` ++ ++此即验证第一个样例组件已经跑通。 +diff --color -Naur cyber/docs/cyber_scheduler_cn.md /opt/apollo/cyber/docs/cyber_scheduler_cn.md +--- cyber/docs/cyber_scheduler_cn.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/cyber_scheduler_cn.md 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,212 @@ ++# Apollo Cyber RT 调度策略 ++ ++调度系统调度策略分为 `classic` 策略和 `choreography` 策略。 ++ ++- `classic` 策略是一个较为通用的调度策略,如果对当前车上dag结构不清楚,建议用此策略。 ++ ++- `choreography` 策略是基于对车上任务足够熟悉,根据任务的依赖执行关系、任务的执行时长、任务cpu消耗情况、消息频率等,对任 ++ 务进行编排。 ++ ++## 2. classic策略 ++ ++### 2.1 classic策略配置示例 ++ ++cyber/conf/example_classic_sched.conf: ++ ++```bash ++scheduler_conf { ++ policy: "classic" ++ process_level_cpuset: "0-7,16-23" ++ threads: [ ++ { ++ name: "async_log" ++ cpuset: "1" ++ policy: "SCHED_OTHER" ++ prio: 0 ++ }, { ++ name: "shm" ++ cpuset: "2" ++ policy: "SCHED_FIFO" ++ prio: 10 ++ } ++ ] ++ classic_conf { ++ groups: [ ++ { ++ name: "group1" ++ processor_num: 16 ++ affinity: "range" ++ cpuset: "0-7,16-23" ++ processor_policy: "SCHED_OTHER" ++ processor_prio: 0 ++ tasks: [ ++ { ++ name: "E" ++ prio: 0 ++ } ++ ] ++ },{ ++ name: "group2" ++ processor_num: 16 ++ affinity: "1to1" ++ cpuset: "8-15,24-31" ++ processor_policy: "SCHED_OTHER" ++ processor_prio: 0 ++ tasks: [ ++ { ++ name: "A" ++ prio: 0 ++ },{ ++ name: "B" ++ prio: 1 ++ },{ ++ name: "C" ++ prio: 2 ++ },{ ++ name: "D" ++ prio: 3 ++ } ++ ] ++ } ++ ] ++ } ++} ++``` ++ ++### 2.2 配置属性说明 ++ ++每个配置属性的含义、影响: ++ ++- groups:如2.1的配置示例,classic策略可以配置多个group,主要为了实现资源隔离、跨numa问题,比如一个进程产生的所有task在 ++ 0-31号cpu上执行,内核的调度会将线程在0-31号cpu上切换,跨numa节点会给系统带来额外的开销,这里可以通过group将numa节点进 ++ 行隔离,一个numa节点下的0-7,16-23号cpu划分到一个group中,另外一个numa节点下的8-15,24-31号cpu划分到另一个group,这样既 ++ 保证了资源利用,也能避免跨numa节点带来的开销。 ++ ++- process_level_cpuset: 控制mainboard进程使用哪些cpu ++ ++- affinity: 取值为range或者1to1,如第一个group,创建16个线程,在0-7,16-23号cpu上设置亲和性,每个线程都可以在0-7,16-23 ++ 号核上执行。第二个group中,affinity为1to1,表示16个线程对应8-15,24-31号cpu,每个线程和一个cpu进行亲和性设置,能减少线 ++ 程在cpu之间切换带来的开销,但是前提是开启的线程数和cpu数必须一致。 ++ ++- processor_policy和processor_prio: 这两个一般成对出现,processor_policy指设置线程的调度策略,取值为SCHED_FIFO(实时调度 ++ 策略,先到先服务), SCHED_RR(实时调度策略,时间片轮转), SCHED_OTHER(分时调度策略,为默认策略),对于设置了 ++ SCHED_FIFO或者SCHED_RR的线程会更优先的得到cpu执行, 调度模型中设置processor_policy背景:为了保证主链路的任务或者其他一 ++ 些实时task的优先执行。如果processor_policy设置为SCHED_FIFO/SCHED_RR,processor_prio取值为(1-99),值越大,表明优先级越 ++ 高,抢到cpu概率越大。如果processor_policy设置为SCHED_OTHER,processor_prio取值为(-20-19,0为默认值),这里为nice ++ 值,nice值不影响分配到cpu的优先级,但是影响分到cpu时间片的大小,如果nice值越小,分到的时间片越多。 ++ ++- tasks:这里是对task任务进行配置,name表示task的名字,prio表示任务的优先级,为了提高性能,减小任务队列锁的粒度,调度模 ++ 型中采用的是多优先级队列,也就是同一优先级的task在同一个队列里面,系统调度时会优先执行优先级高的任务。 ++ ++### 2.3 配置案例详解 ++ ++例如拓扑结构为下图所示,对应2.1中的配置文件,那么A、B、C、D任务在第一个group中执行,E在第二个group中执行,对于没有出现在 ++配置中的任务,比如F默认会放到第一个group中执行。而且配置中我们对于任务进行了优先级设置,A、B、C、D优先级依次增大,正好对 ++应下图的拓扑依赖关系,在链路中越靠后的任务优先级越高。这样设置的目的是解决任务优先级反转的问题。 ++ ++ ++ ++## 3. choreography策略 ++ ++### 3.1 choreography策略配置示例 ++ ++cyber/conf/example_choreography_sched.conf: ++ ++```bash ++scheduler_conf { ++ policy: "choreography" ++ process_level_cpuset: "0-7,16-23" ++ threads: [ ++ { ++ name: "lidar" ++ cpuset: "1" ++ policy: "SCHED_RR" ++ prio: 10 ++ }, { ++ name: "shm" ++ cpuset: "2" ++ policy: "SCHED_FIFO" ++ prio: 10 ++ } ++ ] ++ choreography_conf { ++ choreography_processor_num: 8 ++ choreography_affinity: "range" ++ choreography_cpuset: "0-7" ++ choreography_processor_policy: "SCHED_FIFO" ++ choreography_processor_prio: 10 ++ ++ pool_processor_num: 8 ++ pool_affinity: "range" ++ pool_cpuset: "16-23" ++ pool_processor_policy: "SCHED_OTHER" ++ pool_processor_prio: 0 ++ ++ tasks: [ ++ { ++ name: "A" ++ processor: 0 ++ prio: 1 ++ }, ++ { ++ name: "B" ++ processor: 0 ++ prio: 2 ++ }, ++ { ++ name: "C" ++ processor: 1 ++ prio: 1 ++ }, ++ { ++ name: "D" ++ processor: 1 ++ prio: 2 ++ }, ++ { ++ name: "E" ++ } ++ ] ++ } ++} ++``` ++ ++### 3.2 配置属性说明 ++ ++choreography策略,主要是对主链路上的任务进行编排(choreography开头的配置),将非主链路的任务放到线程池中由classic策略 ++(pool开头的配置)执行,choreography策略中classic线程池存在的意义:主链路的任务执行先后关系比较明确,但是存在一些其他链 ++路的任务在不清楚前后拓扑关系的情况下,或者说未被编排的任务(包括Async创建的异步task),会被放到classic线程池中执行。关于 ++配置属性: ++ ++- affinity: 在2.2中进行了解释说明。 ++- choreography_processor_policy和choreography_processor_prio是设置编排线程的调度策略和优先级,这里设置SCHED_FIFO是为了保 ++ 证主链路能够及时抢占cpu执行, pool_processor_policy和pool_processor_prio是设置classic线程的调度策略和优先级。 ++ ++### 3.3 配置案例详解 ++ ++用2.3中的拓扑图来进行说明A、B、C、D是主链路任务,都设置了processor属性,那么A、B在0号cpu上执行,C、D在1号cpu上执行。在同 ++一个核上,A和B还设置了优先级,所以优先执行B,再执行A。没有配置processor属性的任务E以及没有出现在task配置中的任务如F,则 ++默认进入classic线程池中执行。考虑到任务优先级、执行时长、频率与调度之间的关系,任务编排有如下几个依据: ++ ++- 同一个path的任务尽量编排在同一个processor,如果processor负载过高,将部分任务拆分到另外其他processor ++- 同一个path上的任务从开始到结束,优先级逐级升高 ++- 不同path上的任务尽量不混排 ++- 高频&短耗时任务尽量排放同一processor ++ ++## 4. 默认配置说明 ++ ++如果进程没有对应的调度配置文件,默认采用classic调度策略,开启调度任务线程数值为conf/cyber.pb.conf中default_proc_num设置 ++的值 ++ ++## 5. 进程加载调度配置文件示例 ++ ++modules/dreamview/conf/hmi_modes/mkz_close_loop.pb.txt中,设置了两个process_group,分别为compute_sched/control_sched,也 ++就是这两个进程启动时候,分别加载compute_sched.conf/control_sched.conf的调度配置文件。另外要注意的是dreamview进程的 ++process_group:dreamview_sched 是在modules/dreamview/backend/main.cc 中进行设置的,加载对应的调度配置文件 ++dreamview_sched.conf。 ++ ++## 6. 调度策略切换 ++ ++默认调度策略采用classic策略,compute_sched.conf和control_sched.conf两个软链分别指向compute_sched_classic.conf和 ++control_sched_classic.conf文件。可以通过将软链指向compute_sched_choreography.conf和control_sched_choreography.conf配置文 ++件来切换到choreography策略。 +diff --color -Naur cyber/docs/cyber_terms.md /opt/apollo/cyber/docs/cyber_terms.md +--- cyber/docs/cyber_terms.md 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/cyber_terms.md 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,59 @@ ++# Apollo Cyber RT Terminologies ++ ++This page describes the definitions of the most commonly used terminologies in Cyber RT. ++ ++## Component ++ ++In an autonomous driving system, modules(like perception, localization, control systems...) exist in the form of components under Cyber RT. Each component communicates with the others through Cyber channels. The component concept not only decouples modules but also provides the flexibility for modules to be divided into components based individual module design. ++ ++## Channel ++ ++Channels are used to manage data communication in Cyber RT. Users can publish/subscribe to the same channel to achieve p2p communication. ++ ++## Task ++ ++Task is the abstract description of an asynchronous computation task in Cyber RT. ++ ++## Node ++ ++Node is the fundamental building block of Cyber RT; every module contains and communicates through the node. A module can have different types of communication by defining read/write and/or service/client in a node. ++ ++## Reader/Writer ++ ++Message read/write class from/to channel. Reader/Writer are normally created within a node as the major message transfer interface in Cyber RT. ++ ++## Service/Client ++ ++Besides Reader/writer, Cyber RT also provides service/client pattern for module communication. It supports two-way communication between nodes. A client node will receive a response when a request is made to a service. ++ ++## Parameter ++ ++Parameter service provides a global parameter access interface in Cyber RT. It's built based on the service/client pattern. ++ ++## Service discovery ++ ++As a decentralized design framework, Cyber RT does not have a master/central node for service registration. All nodes are treated equally and can find other service nodes through `service discovery`. `UDP` is used in Service discovery. ++ ++## CRoutine ++ ++Referred to as Coroutine concept, Cyber RT implemented CRoutine to optimize thread usage and system resource allocation. ++ ++## Scheduler ++ ++To better support autonomous driving scenarios, Cyber RT provides different kinds of resource scheduling algorithms for developers to choose from. ++ ++## Message ++ ++Message is the data unit used in Cyber RT for data transfer between modules. ++ ++## Dag file ++ ++Dag file is the config file of module topology. You can define components used and upstream/downstream channels in the dag file. ++ ++## Launch files ++ ++The Launch file provides an easy way to start modules. By defining one or multiple dag files in the launch file, you can start multiple modules at the same time. ++ ++## Record file ++ ++The Record file is used to record messages sent/received to/from channels in Cyber RT. Reply record files can help reproduce the behavior of previous operations of Cyber RT. +diff --color -Naur cyber/docs/images/cyber_monitor.png /opt/apollo/cyber/docs/images/cyber_monitor.png +--- cyber/docs/images/cyber_monitor.png 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/images/cyber_monitor.png 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,581 @@ ++?PNG ++ ++ IHDR? ?z??sBIT|d?tEXtSoftwaregnome-screenshot??> IDATx???y?w}??W}??܇??f$?n??}?Mcl0`?p$$@X ?? ɲ?m~K.?r98a?s?m??u???{?????cFҌ4G?4?????x????T?Sߪ?O????2??*}???a?"""""""""r?|?|ߟl??m?l??2ML??0M ?įEDDDDDDDD?\????y????z???m,?², ??s=?C??????????B ???O??<ϣ??ؑh۲1M?󰬋??????????ȥ'6'r???űm??.v^"""""""""?,?DM ++N; ++a???I?"""""""""??i??m??i??]?Oaj????'?j?e`????5??????????yr?Ge[?9ٔ[??y??K<#? ?0-???9?? 2???C#揷\c-Fq??\???~|l{?'F,?X?Q?l#Fiq??P???4~(????RĸX|,??0?eE??B?;?-X {?????s""""""""??<???vr??b?V??Y???h?E?QV?\AgG7???q?r??X7B????(??&jO??Y?69??/d???)?``[ ?i??f?漟?"?G4?=??=S? .?D??????1??w??e?|=?WDDDDDDDd?{????Km??@W??A(dS]SAGG??????r???d????bu??*)OE? ? YF??lm???T?&k?څy??녹?5?Rn???,??ǎƖ?1'""""""""g???R9??(*J??O^??y>??'??\.?? ++?1??e??(?d?L&?eYs? ++"h????9c????+(Nj?8??????}:S??\"?;uu?ɘc@~˂?X?qw??3?ƱC ?z?5???71HO{??bE?Wղ????????\3q?g°????x?fʧ?7?r=?G??9Ʀ??z~?l~2?{?0 ?0??ɫ?|l2????N>8?0??\B??ģ4??f??ck?X0??0?C&?Dmr?.??K????r???J͘??8yz{???? ???f??맪??Hx??c?T???'?_?? ++b1?N4ߦ?ެ?-V??P???~5 +RD ?l?Ժ}¬??%\Q ++N?3??d??b?][?`?Ac1[?@?%? ++i???p)ތK??\??#ٞ???:J?h %0?Mw??(???????RR&????D*IY?D9??m?????P?&?Y?XA}??ԛ?sZ?3ԯ?QQ_???vB?Ga?ő%!?tK#k7??S?E ?? ++? ++4u?(???lchk efq??-????ce&8?\/a?!?R?Om??"RY???X?J???a??novq?RDDDDDDD?b?xЃad?Yb??ɫ?r?}?TWU?F?-??ީ)??SSX???T?̟3VP?3֢&??c?i?5??-???a?o/&?j+?J?????^8??a, ?)?O{??l?h?&?:?gQ\???U?5??u???kX?$]Ȓ!9#o??1DXDDDDDDDdY?A?a02??+l?gG?!-&i?:???V???(=CY\+??? Q?ɑ;1$?A(?"Κ? :??ɦ??i?`.Ob? ++R??p??+ 0J%?v9??Q??%Q??o?? ????,??y8?5?2?? ??+شur?jcsv(J???i"?0?~??[2?G ??0G?{?CÄ??qf?PDDDDDDDd???)g ?R^QA8d?y?i?q?????I.?gxt??m?k!???n?ڳ?????Pg׮ S??Eܶ??k????c?u8֙??6?McG???r???2*M*? ?l?Nme1d?iL;??VSm? ?~????و?MJ?????"?V?"rd???V??7??????s?M??.???`[?VG??q????????FF=?C?I?T^?"?O[[N??9???k!>!?N ++????? ?s??G?f;/???P??G~s#l???}?#?0?aF˸??kI?C}v/G??'?=7????wZ?A*??%N&???m???a ++? ++??? 7???C {?\??+?2??Y?_)'"""""""""?????? """""""""K??}?7?RDDDDDDDDDΒ??=y?5u?DDDDDDDDD. _?WEDDDDDDDD.4{b????ADDDDDDDD?????]??_??e#???o??#Ceu[?\l?>_O?? z?'?ʰ)w?????́o?'??abPt???̛???u????Л?8y?????]??????Z?EDDDD^?&?rf1??Λ?,?$?g?`???i?s????߱?]????@2?ރ???o?oO?)L??,??}??\W??????????z????l?????{????o|??;3??RVTzteՐ????#?ā?t9?a?֍???_??^FCl??????OS?W??o??P?&?`m????????[????9#????U\Ϧ?4???o?v?????e????????????ؾ?p?Y??+"""""'?v?** ??c??x?S?ٹ? `{?+??]?xK????6????}'??W???l?\?u???I{?0O????5̎?{+7l.??]?x???j???r??????|Oc'??/??W???7??/пl??b0???8:?M4|"""?x??}??{-WT???n?b3?J ++}??? 㹽????k?????????? ?,\??O?r?0?~o3_|?o?????l?-P???hild??J??IZ?fW?(ᄆ???Acr?j???????09}?????N4?h7}yXU?b?`o?5o??[v??2a?????b?~sl?????4?ɴ??c??} ?d5WDDDDDN? ++?? fE}1???"???<0̩?*n???x[???[_aW?8F?V???;)?7???]?ٖ1 `?G??e~???\?0N?i/?'??_?O?X{?????y??_?[?????oQu?DD$8oh?ݝ??/???????W?7~??????c? ??Ŧ??k?G?h?o?|뚧??غ??x?,_?-a??I6L????=???-???????*._c???{??c?Sa{b??Y?)?x??W?i????V??????w?p???-[???_???/???V????Ȼ_?(r_???#""?????ѓ ?fn??KE??~?????*c??b?:J??????c????#w~??m31ڦ^^d]???{~?=??????j??????29}???o?????k???K????h?%^??ͥG??ރ????q? v???yu˯8ԟ?(Z;?D?%楟??????|6?#~?l?n?Қ2ƞ?? Lk??t???Ko?7???n?׏u?e?????C?k?c? Q?y?xt??bR?????e??7???x;G?ʾ?3?ɺW???"??r???v?R;??/=K? ?bj?ɕ?Gt???՞zm????j??????2ٔ?'{?>??Ox?[_?+???4?igׯ??????T??????$?v^??O???;L ???;?? .?á?? ?'oy?k??K???x???????????|?j??+?C????W_??ǻq?a???^?nnKM?3????yl??ۉ??̫?ï??,???U?O???#?T@/ʦ???+?M????ꟾƷ??j?-?Ɲ??????ٛ)??h~?n??v3?? ??????,4}UDDDDDDDD?2? ?Y"jʉ????????\`??)?gyQG w ;???????ھV??=N?b?~??????%?"cg????0???L?????+?j???k?2???C???/>? K??yb?????&?O?P??o*eb?ˈ??2?h????v?^? ??#????~?5[?ª񖨞??|T???c??1?)???ad7Y?q۸?qDDD??g???GM??j?????Cl??s&/T?׶%?7??mg????????*}?|????8?|T?.EW7?????W?e?I????ߪR?,??? r[{'?5?1lzc6?9?s?? ????? ?o?3?,?Xb\M????]z|?d.G8V????? ? w?ֶCԹ????q????l/9?̶P)??Y?ѐO???wI??????o'M??j>??m?m`g?c?p/?????\???4???A??j??/?3la;9b??ɓ?s,g???B??Yc?2??V4??8""???4V????IM??77$n]??JC?,\/?P_ݞ$?繡?0?=?:?G=??r??B?? ???Q32?*???7?0D??=???x????x :?*????y?o??;?~R??]Q ??S?3?>?y?????iϓ3?a^6?ѳr%??i0-?>5l:b6?`7d?y0f?9ff??o??_Lt?????_???b??=;r?`>?,?|?/Y??<5?2?(?g?????O?{?"'<????y,?????Ӽn?@{?V?Q??Y??;J??f8W>?w? K???????5#a??O]E`?QV??9?~??KZb?VO]I??cN??M]i?WRM????°???7??;?|?ӹ,?|.t}????S<[R?p ??}o ׍:?,?;??|?X??}??X?N?8?L???7~&?s??????U???p??5O??N?2LZ?????K?O-???=?1޾//???U? ?>ʍRM?G??K֤?++?Ɔ?T??7?-B?9???#""?#̡? ?R?U?o-M???zz..d>??_?|<;J? ??? ??rӝ~???XX]?3G????4ͥ<^^?#?12g38c???ӧb?V???&??촜?!?~K?O}+?O.???7??p??ݼ1???4???"?p????x??????iM9???AJ?R?????c?xs???Vo乘?? ??cm??\???L?? ??d?3и' ????*?zY)?C?8??Ǻycb_?Pˁ?>!4???6җ? IDATV_̨i3 3???9B1??X1?`????K?O 2?b\]?CU}???&~???O?I{???s?????R??,?^?d ?=q??S???????M??lq?X???9??j???'?=>'???gc???F????n??Ƿ??k??w???yJ??0#t??tF6?N?ٷ?x<+z??4????8??p??Q(???8&}ä?G?;?v/"?y?,???KɌ+??}\Y?TE??) f??Q????[?U[???'DM????[??'?????"8?QJ??=D???????槩0^a?8???y????pU1׶4??#???)??x?,? ?@Ǧ+??^?o??*P??pYgQˈ?Ȳ?eǰň?ek_?Ɇ?զ2 Y/,:?a????>?gC.^?ߔ?p????????^Z???$????j?s???s?q??????|?A??ˆ?V??S?G3=?F?(Š'dμ0/бq?9Gxt?J~?`'?8?r_M9?????E?`U1cK5?~?k?;X)?P~?7?&?8{???}P,???߅Zyco ??|,?x??'?'N* z+7???M???8??|m,?dgd????`?_??υ?????;?z??a+??Y? ?s??cr|e=??4sK?Qn1lZ*?O注eDDdY1Lz???K????݀?H??߰??M=?q???u?:??8Ϋ[?q6???y??v?ݕIB>??ۙ?F???M?&?y??|(??ך،????S_??????c?`?4W?????E?3o???_"""rI1??7???2p???=??X????:qvߒ.?喏?????????0?O])??r7?C??e?[n????ȹ?(?d)?皌g??Q:Ú?'""""/ SM? ?C???<]????喏????/?k????y??Um?O???xya85}UDDDDDDDDD?;?@]?&""""""""r??)'""""""""r???????E-?1??x>i?ED?'}>?0]???R?.??`??);??_??4*`??? 7u?pM?;?8K?ϥj??YDD??>?_?.??~?n? /dž?A??L`Yz??/{Ԥ??6K????⟆,?|DDDD?/˵-???0Ct&??a?v??_?( ??r]~??̰?N????Z~?x????2?|?X?g??฽??_DDD??fo??Y?O???s̺??f??#"""??r???y'?䙔ź?0?f??7pwI;?2^?u??qI?e?a?H???o?(c?$?JN_n?mW&?9?'ɑ??ƽ-?d????džæ?V??N???q?8?֬???)F?S۵???7?R????P,ɓ?????~п??Z???F??=y??@?r?in?J3W???^?"??}+"""2?Y?r?(?J?zb?ei??????x8"K???????????4?w??? ??y????Q?ý?>s?Z??+?ҁF>?4?_T?}?Et?-l'G,>y2?`΀?????A?X?7kc Y?[?8)?X?~?w?#??n?????&g?}2?[Z??>??j??o1X??ƝG?ڸ?o?N??=jFFXeT????ȳ?????2?}D??4?""???S??.\?,g????m??}???Y??a3=?F?????z:,?h??Aj\?=qi?eæ#fc ?qC??c?,9.???M?<?Od???~?O??UԌ??,r???1?|????X?(~>?? ??n?5Q\`O?Ŏ???m?s???qG? ?d??XM?\?? ?|?Ϥ???'R?͏?I? `?r8??XhreG??&??M}y?W^??N]]?'?ڿ?;:??_TEz1?N?lI1????-\7???h??8????.F?K?:?6M?Wl?E?#A?ϡ5?b?Y???T??`???"??<5? ???j]?8?f???x??]????_VU?h?Th?oW?0?5?7ܓ?ܟf>?]?9?????O??d?v???A?*jH;i?؛??f_?M?p=?F?_(8? ??7>~?d8#??0?????y?"""???hʅ3}\????H?qY??????v^:u?c(7L??mz?j:퍡,)F???????dC?,YW????#"""r!?֔?????.???iW??Yn9v?7犹o?F????0o9?F?iA??M???i?͓?To? ??y!?h_?????n???cݼ1??/o???q???q?X??Q???2?Յ?YDD??E?? Ǚ?NY?6M_?3?c?/|]??1[?[ȥ]? 2?b\]?CU}???&~???O?IN[??w\???\???]j???J۴???LjჁ???6??Ӯ6?M??T??_ ᅶ+Ⱥ ??#"""r>?<[qǹi?a?????{`^???[????S4??O&N????):p?6?!ZL;6?? ?btN??+"?#E???y$??S??]A?u??u??????????sm{k"????f??;&?mU??rޮ?`%?њ ++n:???U)?????e|?????9ħ?U??$ΰ?R??3^Zͮ??)㇥|??0?k??dԧz???O??d]A?? ++?$fWutp?W̰???K???s?f+"""3?r.k??H??yt??Q~??@???W?ě}??p?=Qsj????5[??P+o?m???>`0)??艓??? ??|o?=?G?'_?$??~"?@>?Wn?s?n???㎦^"f?Ɗzv?Eq????a[?q^U?̰?????o???06?l??v3wu7r? ?h ?7??ÓOB ?? 2?""??.x???#ܜ????i??u0PmZ*K??????\??ݧ>?v7????}????Wn?_???l?k???*?o????????5?Gj??7?6????w???8??IU?k?????????&???????P"""""""""K???U9?fL_? CM9? LM9????????vTtEDDDD?${?_d:???]t4\?WKl? ??%.1?̟?'[??/?J??tY???02??,??m\?ܖ?~_???ܙ?>>????/m?ÛJ??eY????e??????5?_|??????4??6>ϧ}??-""??5Ǘ?5?~??*RCni???*}???3gW4????ǚ?1w!G9???<>˟*?k۶󹭛?qt?e5?""A=?j?? ?v??=m??&_?3????;????y?bs???|?2 ++C|`?S|?靓?=?,_8???? \?6?j???? ???M~???92???.pF?r???y'?䙔ź?0?f??7pwI/P>??5r??8?y?F??Mm=??F(pz?7???9ȋ?6???Os?ԯr?????)?A?'?8/??5> v<;l?m???4k׎?l??]?bt????ٟ??}??%????K?p?Ԯ???WGp?$t E? ?j?????M???R?`(# ++ ??T?@?????a??y?ւ T?:, ++Ըv'=?Ng?A ??8Rau????n???XWn??L$Fs"?O?#1??{[xɈ?C?'??n9?fi]y???*?????K??4???A??j??/?3la;9b?S'K??????x8"K???????????????rFxy? T?ᛵ1?,?-`EO????z???p??cy?dtڷ?&e??;HYE ?Kz'????wXf?jA?Pm?3?B??o0???9??7t@?x=Mv+??'?ðs?????:?O%T?? ?IM???"""r!?є g??Ʊ?U??q??cCZ*?????l??U???tx???O&d?a???<7?a%!+????eo*??T{U?-???x?H3۝??????+y?8F?lo2?>? ????P>??yv?~j????EƜc????s? S??D??㟚N?e????y8?Ed?-T?B?Q? ?hQxSP?N?????y????'?2?,?|?p!k????bP??y?v???ȅ0?,???A??? ++ZN?͸?$?m???|?$/?? ??\?}?)??q?''O\??GSt??y8w?k?g?>?@??????ͥ5?ݰ??o[M?x???q6_?fS |??-??2K??;??_?|?]m?{|L?!? ??(??(x??1U.?? R?r?(???Ԯ?{??i:9?\?[DDD.???щ>?,?x?"q? c?$?\U̵-?|????(?#db?y??"*???QG???Nn?Wq8laƧ?F?.????|???7jy<泺??;?a~???A?eCG+W?)?#??e?c?b?2?? ???gQ+??L????;?l? ?TxI~S?|RP'?0???????b??<5S???Op???.??9W^???Uw?'=?????_??6\J?y?K??6t<!?'?[;xo??OSa??(%0?49??x?zxm??~?@?_??e?`cx??G??#@?????[??'?????"8?QJaڔ?E?-{㼾????f7?'뒧?>??????%?%??m???g?զy?'?z??u??! ?w?????̷.??e}+ɏ?Tp??n?J?ݤ??-"""Ĵ?????!??r??Ʊ???\??;???{?WZx?{.}??u?,ٲ%??e???a ?3?aHv``& ?T? ++ r)Ȼ?e?V6?T*?T?ݰd?a?B??:??p??336?-Y?[K?VK???>??t˖e???ݒ%???r?%?>?w??s?????x| ?@u???ɉz/?????n?c?P̓?kOUT?w??????!t???x~?@????Bg3??}}??? 6uq??G???Tʻ۹|jA?R?A??=??q??c ++??0? 7s?a}V?5????~%v??L??9?Y9?r???g3???1Eg???x???(_?B?8??4??:?_??yGl?Oڀ¢'??ޥ㴊cY?p&???qx%?????? mk????~??l}Ӛ?c?*X??n???Q11X??/?r?Z9)??ɿfx??4???S??B!??S??w???z0?|??E?5??????w!?B!?B? ???_?RΟ??????ms?͢.???^?ܪ??{w??V׭f???V??!?B!?b??&? ++t???s?pܻ?O?_/V??\:?ëݣP2?|???ۆy???B!?B!?XG?n_B!?B!?B?;?\?S??&k(0?ȟ\?!?z??۹??+G?|3X?]ٰ?n&?j~??xz?Υ_?z???(?? s۩? oW?B?$+?CS?:Zy&r??7k3?ݛ?f+??? !?w?5&?,Z?3??u|1$r?e??gh?-?V??2?|?/?K?n?????n????Cܶ?W.?غƸ=US???n!ĝl3?ݫ1x??I>???'w0??????'??n>??ƪ??6_??ۖR????.s?4?Qt&??m?#?? ??c_??/???&?ټ+:1?v??ܛus? ?b??}?jl?6??yMv'?~h??? $?:?U'?n?V+??y?????: ??????+? IDAT??څ ??^~????.!?w?U'?\?Y?i??\1???ON??D?{R9|??y8??????c??7/po?D W??v?Ŧ??Z????>???)v? ?6??????e??????? O??h3a??{??y&?.?P?E?42?c???ʼ??????̚7?^ϝ?w??9??0?A^ ++k??'iR|???/֕?&W??஑~?J,Ғ7с?'??;?J?C??'X ???y^W??c?_?X?O?h/??&??|?????ע??r?%.?W?i~?{? .?J-??^?O'?|??~^??`l??&??1lL??˭??|K??*????a?mU,;?g?p,???? ?0???˄:???????? !ĺq?Ǚ^7:??gRDm?9?/0???Z? ??~?R???7??tB??Jբ@???gA?Wdz|??',.E?4?,?y?? ??#? ++???ŗ|?kf?'.?#??0?ֱ????{???{?'????5?0Y?U^??b_???=??????i?ot?2???C?<??_u?m?:??N???u?1G?ީa??L??!??U?\?|?p????????j???{?M??W??ݻ??}?r?tOi ??|?????צ??r?H???s$??,=?????D?B???:?I??y?(????n?ů???=??m???q|KN??q??ڕOE???b=U??l?W ??} ???ws?k?#?m??뮞?~?r???? ???Sl?:K?TS???vGU??"|-??7^ ?$??X>7?WڪFp?K7??@!????I9+Ã????cg?!??,fUδ?Y(??S??:??? ?3?A??N??X???Vf????|=???Z??ʱV?B?uV???q~)Q`?? ??Z??N?4?N_&T?X??N???|a?~p??25?+???kFS??M???y??"] ?èf? Ic??O?m??@??L\?8ױ??. ????3m?xC???????@J?S[??G??2.?t/3*?&*?????ʧ?u??w?]9W?.?4E????@v'C~?9;C???J/?p璴?6ށS|v`?\Y?6UNʭ??h[?P??V?v̕[?? ?????8闝?????F???en[_???Y?z??k??<^ ++Z??D?O?l??O&???K? ?? ?~?B??ι?z#???(k0+ų?'L??k?ne?V}6???'???P}?Z?=?U?P?_.q?_???,?}e??ߙ}w?mX?(??P[/?1???W?*N??|<[?|?????wQ??>~+?3?ӯ?#!?b#\??0y(a0mdh?܌? ++rE??3 ? YY?!???? a?~?UO???a?1?M????Y/? 1?|}???h+_?>???`bq?wO縙???p7????X1UYU{??O?m+??? _???C????a?WP?1?B!6IJI9?=3s] ?d??*?4?? ?$OLL??@ ?ꦿ???^ ?˳????x????T?n???jUo>?? ??yj???L?x?x?????޾?m?????)G??????|???E?(??? ???3?+<:??C? 7u??????????f>02???&A?l??x??|M㩐???Y?J['?f96x?c??PcW?u??4???c???w?1?64.????#<??3&??? ??p3'kzs??m9*?XS??WbW??d?w)O????eʰ?D??!?X7??1????׮a??Ó6??? ??w?x??MP??K?չ>?X?;0!?b??W??Ek|???/?tn?u??qe&?P_??劾??Hw?[?{?r*uC!?7i???0??]??|iD??L?y???6?x?v?i?<ß?fV???W??׽??mň???q??m?Ϟ3?I$_`?%LjBQ+?O??Y^ϑ?tҧmpD??l???!yB!??@c?fr?~??N?c?y??0?v!?}??x???"????$b????c????8?R????q?S??.^???O?r??B?V??sefy ?qzw??????c?<5g?ac?~^n???[?,??zՈ???7k??+? m??bS??y;??F????EZ ?0??????|3?¬"??????>?"j+??|x??e?T??Z??????Bq?c?_?X鳹h/??&?h??Q ++ ???$?ϧؙ3???????> ++?,??S<1??T`kη??7;?v????<??̈́E_????晈?B?8)g'1;?wGy_?M#C<OQo??????N??5̩???i?8s?c?^~o????O^&?q?O?x0??,?????L???3??????N?8??;?Ka???$Mj??w???:7??e,?*??y*?HK?D???l??+Q? ?@92??c?r2?76A.?l??2?? ?kZ??wnt/c:,??g3?>????rp ?8.~?‹?\???G?D???F9(!?B???t????Y?:>X~y?I??y?(????n?ů???=??m????,-???????"K?=3ü{?y?Q>Th?_?Uo????c??q 6???????V?~?F2????]|??fFx??9??????m?qT???F?}wR-?F/񞸇o???I??b?i?)L.-V??:\OebBl ??8g}SmԦ/Ќ?????dt??Mk|????x????p'???W?;?E??<;?>?]?yz??y??2?Ç?????d ????٪Fp?K?G)????\??PȻ?N8+!?B?w㤜???x?ź&?M??8O?r??2?N???Ǹo????rDe?????7??8*g;??# |?????b?|?Q?q?9?g??.??t??t؇v? ???y&?L?????S??׍ ++ۺ?y?`?Z???0}???\^Q??ɩ??T?$f!ĖP?ݰ??M?`զ/(? ??B?!@~?`8???]?4?&?;Xf????Y ++????i?????+Cܿ`?o??@??| ??ޱ1???.n[?С??`?㢺?B!?Zn??sg????9? ????\?v??;p?????+K؆Tc?GFGyc2Mc?&????0k?k?aJ?q*????yZ?&??k???-Ђ????e?7?:??'??ȧ?)?Pc=?klܝ?? ??,;{?xy%????Z?f??sN??iݨ?Zy?s?y?? ???8??F?74?㈏L??ب??2f!??U??p9??jA?Q_0??K??llVyM??8?wV???t/3*?&*8???1??T?g??c???♞n?-]e)eX??:kT>B!ĝnŤ????uz????It?????W?-?U?Y?????Ow???OG1??r?? ++?? ++??????,Q?] ???zpT??Yh+Qn?^?r??4f???=?m?3wE霛嵳3???mD??i??????#d? ??,???????j? l? 1~!is?????k ???d???֫????\Y?ej??8?wl?1@??/ɹ???܌?w???s????FYp϶/??W??]!??3i???O?M>??c????;x?}??ּL?q~a*???B?H.;d?w?IM?Sܗ*???XV??l?{g??[?~؅?I??we??T????? O?ۼ????|?fa*?3m???? {-??]?1=??s)?H+??؎?)?O?8??h?&??Hf??i?Q? ???T?x?t??????8bqTΪ?m?7Ʀx}??Vl|?B!?X?2?Y~??ɞ?9??~????5.????#<??3&??? ??p3'Q@??lw7??1?r?'m????i?z??U1?79 ?䇝????k??D?x??:?_??yGl?O??x02???&A?l??x??|5?u??3 ++3M=|?5??<>+^????o??D?????i}??&??τ???g?;?ZUo?rPΎbv?B?m 7?&??H????????n>??^???] ++???6?Į??I??'? O?|??Y??9j7???ڍ???p&???qx%?? ??8Q?m??wl?1?~???N?-0ûF?y????r'??M??e>5z?ծo?t????+????N?n??F?-B!?????ﶭ??`&?????kN8??X?8O?c厐??ab???Y7?ޝy??d?T])????b?y?{?O'?rS>얳4???:???-?!??V%Z?z??03?e??e???RE5>ܿ?-???k?n???oG0??1"`~i_񖁂??W{?o??????u1/?̹K? ???i=??z??Ĵ??3F???4?0y? ?x?L?A????IL??????x?&ʈ^???_ t0 v2??3??x ++(?e????ԋ?XXtaS??;F?CW?g??Y)????4??I???⼅?}?h?Z?Y#?˧???????????A???h_?evLl??A?ޜ?o$?? ????3P?U??N?*Ʃn?.???JS??0????e۩E???? ??????????5Wh??!??.?s???? ++??l=m)\?&??oK??=4A???hO?'>?aNԓ????͢L?K_?s????m??Bl%??|????p҆Wn?o??ܷ:0v?t@#??n???4?~???v ?? ++??f?a??I*sІod??V?S6[ݰ4??:??%Xf>?ʾ???+X&??Z?͖S!?b??qRN??2???/????(?i??*?2?"=T???˜ s???? ++9B!6??g<\iB{ ++????|???m.U??Ϧ?6????Y?sx?m?W|?_Q??S ???@??™i=?? ++?v??+??aޤP???-?l????ΡLUxs??\,}1???`k? ++?d?O{%V?/-?og?? ++`????????װ??ՔO?x??P?,?7???oa?D??r?Q????? ?M??l??e????4???????4?60~j?cE5??? ^??% y?M??4?Y???G???z[M.???y?I;oi?9P"YT5t????hm3?; ?J#???F?I??[??X'ß-???Ak-S?6?̾_???$W7?? ?M???ާ8?5r?ꆽ"=?? ++?ۓw?M~ֻ???2NB!n?u?rjS?Wg?b? #[#???#1???3&?`Ჷ???'_0??7APc*.???K^?T?3S????????Ӳ?"?@#锂=%9:E?k??[I/ظ?fq???LWU???_?$??F?)?i?U^?q?1??#qn?ֻ?iQv0?????(?r?zNsa???#?_#?7?T??>/v*J????^????b?ƽ???????Q?#?܉?7?????/?ȧ???X??bWQ>e?Y?????F?0B?Q#?\??OR?=rJ???$'eX????9?L??cD??|?? Ś??Ӗm?y.r/u0_?B? ?K?X?/???b?Q?G?? ??v;scK?' ++?0???'N??3?/g??,?{1?)???\[f??S?׳?? ??/[s?????a???? ?ڠ?K?Q??Ä}?O?/?S???V???M???p/??x6[??M??y| !?pn??)??(?4??'??\?????I?ʜg?N??m?????N?????Hd t?t?O!?[ժ?r??,?4N?^???i???:? ++??????`??F?y*?HK?D???l??+Qk???>?? ++?O;?"?J??E{???0Y?`l??&??1lL??˭??|K???????????%h/h$|AN???K6????I??O?3gോ?]n??_??(??7/po?D W??v?Ŧ?Ǭ?^7:??gRDm?9?/0?F?V˅cv????<??̈́E_????晈??Յ,??S<1??T`kη??7;?N??g??b??i?ߩ?CX????? g?j????x????:??j9u?????q?- w???{?I???????u???ꘓ|)?"o??x?z?X???F>???3:`?y???z???arf????????U???V?i-곸s9;?*?g?Ǘ3???J혓?Gw?Fվ?\5[tLR?Ӿ`+??Nt/c:,???}??gԵ?sjh5=?,h??x??????ť???????n۴?B!ĭ[eR?b??, Z? \???r????A?G?????/?`??O\>Gx?a?9?cc???? $?C-???ʽV?????F?? d???S!??w㤜???x?ź&?w??Ƭ???\????0/?EH?|?_????x?X?$?>2?N???Ǹ????8O?r???/% ++???Z????????˫?\&??8???3?v_:?y:?C;{????<j&n?x|$?/?????Bl??B??????{??)}??>+?{wqvyM?A????? ?.[??)?S??@?3?O ÜVC?+??ل?B?:6?8)?`?Z???0}?b?/??? ++?>?jz\?"???#D??]m;+??m??v?8_X??w??@a?̵l?1I%?˹_e˵?3???j??T-? ? ++??&N???} \?.?aT3?φ??=????T!??C?0)??Ls??s?1P???Y??? ??y??\?$w??X??,arIv?ⅈ?8P??1?#???1???`?qixl?5m?o?ss*?@ .~r;??+?pg?i??O#?nR??v???-V3I#EO???.???(???4?\??p????yW ?7('e??3???yG9]????K?wR?f'??q?c7/]?wg0????&~???qBky\?*?_??vR????l?o???܆;i??`??ˬG?Yk[aLrU?\l?v~='pngN53????'Q??)?????*(f??}?n??B!jcŤ????uz??+_????V?_L?xŤb????????3??jۨ@?Vv?c}x2???}???(F?_?!R?j?\?YuT??b͸V?????\֨|?ĶD?N???$???B????m??R??????Ӝ*X?r? 'u?i????|??(?s??vv???&yG`??i?\?-u6???V?????:?q???Tj?kq|-??l^??[???f?ڵ???c???Z?[??__?/??U??? ???? ?i(y????vBQ?Oʙ?EA)???k?-?B?ڸnRΛ?枂?o ???5ƃn????i??]&?V?6???e??2?N???1?"$?6u??2w??:?IŤ.?g1??I???i??1??z?_S?x?mӼ0?n???'T/?p??8?????P ++???Z?6f???W?????E~?n??!Fa?(???9g?Й??`z?????? ++??!~T??p????q>:~??T?9??????????'?Z????p?? ??????\*?????\????)??e?????ޞ?8??̥i@!??ӕ???I&=cüJs??!?Z?/???0?R????8????c:??? ++ ???a????踨Uޫ??B????8???_?"o???x?䣻???/'m??v?[???j?f?????٘ĉ-??_[?|N?B??"?/FP?I?^P??zIU99u??????`EM|??BQ?&?L???t5????~??????>&??s? ??????#??v??zu?l?~I]ud??U!??@?yG?V;o??D?????M?v??VrZ?R?27????f?{&?7?~9?G!????gL?,????NrK?"K?????? w?8?G???x;??}g?ow?????v????t1?l?????P)?{`???4?`1k>D???U???S בa??^?ۉ?? ??Բ??I?H'?/?aڐ?Vp????YR/???,???#??U{>???? .??0??!???櫫?R ++?^;H}W??̙?????=???>??w]?????-[?-[??IIB??I?%Г??2Z:N[?(?????????)?p??er޶@?MBB?!?Ŗo?u?K[?[???Z??C?-???k?[???>3???Gk???????????NOW?8??*|.??1??6?/da?d?Uܻ?p?????I???? ?U?>?)???M??;%96RN?/??]?Xi̭Q??Q?hg?y?B??YaQ?µg?fj??玙x?x?? ++??[I$??1J?g?~???a ?????z[{???σ?*??@M.? >?/?`.?¦?g?0u??Þ??????S??L~;????Y????v?O/?ٕ%??FsSK?S)?????#?0N??9rO?f6?p?X?=??;??A*?ms????#??x ????{I?.?2m???????󀞥? +???? B?7~ԃ?l??"??md??a[M?QrRfq{?0??E1J%????????{H?繨X/'?Xݘ??* ??4?b#?? ciE?G??y?????x??????<$?????"???q????????)??kcfRC?6A??=4?3??v??6U?|)%???, ;uҿn#??p?L?[?`??Q?????7?f?G?1Z?hܯ??q;Ʈ>??^?b?a?=???4Kr????%??$?x C?7PZ??&?C???91 ++ _{/?-ʸë,?Ҭ?J?̭vރ?g???[F??$?J._M<*fҋ?ѰQ0?<3?&uN?q҆?e3!???g?r?=?_ IDAT????l1H?.? \ANo?BVEi(??,t?B1?BCUuV?|??"?υ?c?1???L`K?T??<5????X?$$7???a??s??ͳ$?? 8?Ƕт&?䇂? ++ৰt?????Sgά?{a? $?O5?~,?k_??Wh??.??s{?^??-7????[?ם??(?????0??,???ű 9#?ݞ???A???*? ?H??9??r$?0?i?>??????=d ++??Z? ??G?j??2OBQC?,?)u ~?????נFҸ?? -9i?? ?D???z=???? ?_G?X?4?[F mϡ{m????????5?6??~?@??m?f? ????6,]??7?{(?????/?_??+????(????W?L+x_n??1{?c?(,??R.jP/9V??Z?U)y??D?Ӹ?zl'???-d????$???3????oWR#s???'h{??}f h*2?~-???RC\???\?l;?*?QN>???Ӱ?Ɔr?,)s???e???r??Z?Vs?#??v??W?????J?1w?-??j??2OBQK??,??h??o??rc?Z ??nb????$7??????P?M???@?N???9???$??5?U???6k?rɗ?+˩?wca??-?tJi@1???e???2?}?[)油?Q??"?jͭ|?^ΆP? Ҟ?g??ܭ ?{f??}??d?Ol!?W?U??Ow??Y??W8K/?i?_??d*?!e?3???V?ϩ?`W?2??L???U?p???????Erz?k7??i??w,Ts? ++?i?U??Z????B??ū?,??%??: ++˟G?hq???Kf+Ġ???x???Vķ??AJ%??~ ++ypw??W[K? ???tb???i?1?ʃ\?x.P?M?e??TF??mO????Wx?{5??6?k?X???? ??$??????ޝF[ ț!P?a???l??q?R.??????X??j??j@2Hɬ2K???D?? ~w+F??????J????dc?x1???????'??9?|-??????r??Y%?????,m?$??O??_|?9飪??Z?m |u??P?L?????~???󛫟w??2$?l:Pf?=? ++?u??V??j??2OBQK??S??:?Ӿ?[Ø?a???|?DS??????3'lj?x?{ ????c?h?????l?0?|?o??]9R?C? ++??@W?u{?K????7Fx??|Zom????ų?Lq??M=??͙?Z???^ll????4?τ!?c?I ++V?C??@???Œ???Q?zS1p??̝q??6???bŜj?H E/?i?x ??T??#???e?X???h??"5?#C?2ݵP''eq? ??9V7ٱ?H???LrI??1b1??O????8?ύ# ++ArS,?BےAC?ȩ??NG?9>N??n??fR?>L?B?X? d?W??qU9?|???t????fe ?7?'?????:??~x?( 7j??]ؾ??e?Y???A??g??2N?(???]k\?>?\?I????y'9?D???^z啭Q?ucIN7^N???v0?֨^?Ԫ?e? ???? C&??$j6F:Qn??Rxq;??A¿?K??)??A?Njmk????D~?ؑ~n?f?$?????? ?J?v2?? vC??[????\No'??Ŵs?L?|???ܠ??? ???)??u???x_e??H??M??;?i???|??Ya??u???t???\? 'cnm??H??Y? B!jG???n[??=G??z????Я?r????Z???Z/?:?H??.? ++;x4r/,B!?B!?>?+q?)?y??Ez?e?bS?Vsz?????B?д?2?`?<?u J!?B!?Xs ?r&?})?t??5~??X'?jN??z?F?y"w?!X??y|/Cϭ?^!?B!?bs?p??B!?B!?bͩ]?ڽtM!?B!?B??,? !?B!?B??dQNԀɮ?~?`4??j?"???????ܕ4d?B!?B???????0wb?????rTG)N?W???-??c1?????*? ?????)???????5?K? ++?????(?te?2??R?sZ?7??%vO??=?w??yb?e????l??P??+ǭ?ㄶ?y,r???6T??n?xd,?$??k???Iǁ?~>??p?oK??ぱ?K??????6~Ա?9f9?ٸǡB\9?}?F?GƂ??4L???:???}ӮZ ?䴲?|]?L???ǟ? ++/?K??q??4!??6V^????>Q i?{qR??L?t? $6??7??Q????g|yJ??U;?~??Y)??V????!?3??H_??4Lv???4???|){????t7?C?????gx~?Q1k?v??M ???? ܾ??Bl????V??mhpx???f24Mt ???tKߋy???+??b??9?K?xrW;u?ݼn?Z9nMaE??rK)J˫=?{2ǯZ???\/_x?,A ++?0?k???c?1;k??1;$?!???Õ???? ??(??1~???a??x@13?u??;i????K????6?/?v?A????%?iؘ????;?Zs?99.*p?'(f?7 ????41[a??? L/n??r????Xr5?9?'??%?????p?WT????qgG???- w???I?O??????A?j?o8$c?Y??$??FʩƔ???*W6V?kT/'??U?v΃?%?B?? ++?rۦ??ע<??ށ????I?ߴ???>?15??g??=Ŀ?ullb?=?m? v??G?B??5t???{aBei?n??/?.???95????P??kAg??-W_>?c???4?^????????  ++?Xi???^nR???B?+ƣ?????4;?_?KrbW?????t?v??6?-??۔fj?2K?}???s?䡃?Ȼ|6?ZNU????2???B???(? ??S??!???ͯ}??T???'?X??߷?1???;?ϻ{Β8|??z??\9f'?8ܘ??*l?xj????vF?? ????3]D:񍐆?(?????@????j(f?xAa?|????S*???η??? ????u|?ѳƷd?ͮ?g?6?????ьίZ?y?k?%9??9??_'?X?ώf??[????6?f{xpR???}?'z???? ?1??L?????#2l??????ʩ?q?F?rҏ???ig?K!???K??oL?D??r-D-&?g??????s?G ? ??N??????H?i???l?3{??Xm\W=t?]x??9\7}?}?"Z???*Ec??[e?????{?Y?25?MV???????֩?J??#g??PH{|?????A?Gt?4?L?%T?X????????z??` ?q' ?a:??Kdi2a?A???U?7ʐ?`??eHN7bNS??c?/?C??u?~^?*??Ԩ^???Q=jm?Y?B!j???wn? ?c ??˳??Χ؊?_E?\ڮxy5????9??&?F?=%?o?c?̀?)?>4?[?YJ69??dži?fm?9?Ʃs|x?????w??N?8iÕ?mb?^?Th1LT?h|%9?@???0?h?I?:?˗?tS*l-??p?V???\???8?rkqVE??r?Ż)??FrN??4??????>???}???7?ˈ??B?? ++IZlo??|?w?>]y?62?eU? ? ++s4??ِ??[P/?V?܏9?,?-????̟??䣾J???o,#c???ҵ?S???????'P5Ɨ??qyM???j??2?BQK??,Z?f??1~??-??,??e?bـUn?????}?{ ݾ??}:??????\vT+ǶHϏ??IRM??z?u??*?S? W? V????rj?2?? Eq1?0?-?=dVͣBi??˶s?b??qXu͍?)??f? ++/=øzUA/?82?ǽ)?v???O?vϞ?~??Y??E???-5??Sf???K???y7?m|?CE??B???$??c??o"?p?45/??4w?O?????%?)n?McE??? ???;RI???<]r[??~??gY/L?΄͋?FF?|9Ջ ?1m?j??Q?r?w???ru_? 6?XP!???$w$m?E?Mc????MQ??n??Vʗ?`\?kT/?A?6?զ?K2?BQ#?dn???&;?f ??yv?V/?rnk???q{?YnWt?v?|???;?%????z?Ʉ?7?c?m<^???0ո?ϹƸ{t??z'??nz?淣x?I{;??a?q?????ͺ?tz?e_???s??]?|W? ++S ????????O? ???;m??SŤ?I;;?y????8tH1?;??[ ????v?s-??A5????Q?Z??̑?B!??*?r???j?gB:k1ur??x???76?ĬV?l?z !?26??>?cp˩?y?s???O??_x?y?z?X?? 5???s??i????Q i?[[爄B!?5??V(&x}~~?'?if?:n???E??i??lk?k!7V)??9?m-??B!??)???m?@?E?te??? ??^???_?sgG???- w???I?O????? ?6??ྱ; S??R|_k3???<ɛJ?S????????H??ӽܘ7????[[y?1@?? ++??:?ϝ?4u?J???W??q\?a<?#?b3??K?s??7? ?[?p2?????dL???????큅E?????x????A?RW???g@˳?hQryv[?l?SX?U??PJs???7??l+xm??-ñ??v?"GF??wb??&d|1?li屈{???ᾙ ?E?{"?j/.?Ŗ`???{?4{=*?i?????O??f5?,?y??M?C??]????oZv?m?????]?????:?mO?ئ4?P{?Y???Ξ?$?G^?W_???q=????2g??1??g??t?! ?V1;j?qP-?6?Z/7??>2EkL?F+?#?,?1?9'y?ռE???(3?ܒ???O??2GB!?XS?.?Y9ޘ(??6?{ɭ?:??? P?4??TC?/??Ʉ?R??& ++t??_??? ?!}?'f?k?3??$?>r?N ???Ljo?E6?Cg?????????3?Kт??g?˳ K??8????Bp???(??B?9Yi???l?3{??Xi?Iqq?!??)laԫ?S?7?c??[?^s?,@؏?????߉6?0????R?k???Jϛ?flZ};j1?=?Eƶ???B? ??N??????H,v?y)! t?,????s??.??)W??H?,p"??>q?;?U?V?O?Ŷ????W{???+O?fɗ??T#?ۇ?xK2KC?&????0m?U? V?k{+/????^I?k?h}#????U?????#?b?Ҋi???U;~??h3g??????{?g?+! ???Jqs*???9?f?j8?ւ;?b+.~Yr???հ????h??H???b?^?Th1LT?nQn)???a?J?h??q??[G1??v4??????|v????~ry?,???ek???:?ɧx??8w?}?????۷qRw~??I!???,[??h??!?????? S?R?K&׊ ++:Gwu??eg@mUg??IQ;??ݧ?????{y٧?I~?{???M,*z????m?Ӽaz????xo` _??B?? g ?B?yـUa??\~V???4?MMlKd?m?Y??J?(??p??َb???`(*?[???z??i(E??E??3?f?0? IDATR?y#????^8<5??&N?5?Rf????0?3???&r?(?????÷?^D?pֱ?vZ!?B!?1jW?•r??$יn??g+-??Q i?[[??:P????g|yJ???:??!?g?(:>??k?f? t?]??,??`??>?????43y?U?Z?v??VH?;'B6'???????|2? !?B?h?E9Wn?[ ++????4wv????@??py1??+??Q ?T?????"GF??wb??&d|1?li屈??{?o&Cs?D??O??񽘇os???`?I?4?Qn???/?????w??;????32?ͩ4? ++^@?l??!?;_?\?,E]r??G'?!]?ؚ???=????b??^???Y?t???&`???zk+7?9lCge۠cb????4lL??K?|?9?\ ??q~?T??a?+??r|+?ÜVP9???N???Ns!?XA?>?dL???????틷??>?dzM|??????0???aGѢ? ++???6??ৰ?+?s???F}f j2?;cpx????3?K?????iK+O?]?8????k8???*7=??x]"?|p??ř???y?•e?r??2=?Vo??n?Ѯ ~;??o?[??1N!??5+,?Yl???^??P??e`??fo?ã{?????I????1????Gx.?F?Zb?@:?????|?;???l὇????m[?S)?)?`???o{g?C???C???I?[?*???H?"?2???g?*=?m?O qo?I??u|%??v??W??j?g:O?;N??"??#?????Q???'??L??C|#?9??\ùD%?m?4^n ?}d?֘ʍV?GBY>0c?rN???A+??? ????~*?S9??ɩ?c???V?4?5?N???|.? ?+p?'(.N4??#?-?z?b???Bwl?Up?-|?y?ʤ?5??=? ?m&aT?????צ?t4?.v269? ++? ?N???'Np?p??;?qPwgs?Z?%V???l?L?????3 ??nz?T??φ???o?qЕ??f??7?/???wb?m-z?Od?B!?k?%?r??$7:???l?daR??2?_??[q??Ȓ+?/??]?5=G?մ??D,?˔ ++-?? ++5?:?Qn??ъi???*o,?ǔ ++[???j??H???!ޒ??P?ɹ4<6L?6?m?I./????6?ޗ?j??®6`U?BiiLv?ۻOqo!£????OG1??~? ? ++۩Ԇ??(6(??????e?U??5???|?\?x?????t?F.7?k?????, !.??O?\~V???4?MMlKd?m?q?jK????ݲ?`|w?V?7Tm?\?9nG?JxQ0?????|=L?4?????????e??v???? }?Ë}?J???=????d?B!?k??_? ???b ??Y?ˇ??????߳??Eo??K??Y?sh?o??j'??J^???fV?ڊJ ??y??????i????L?P_?t?g?????}?????o?qP/?pc??S?{yʳX?b??i>??SCܕw???u?π?j??1t??(wM???2i??<]?;??˒;Ȱ:?o s?!i?/?):?? ++e?G ?ȶ7????3Yo?0?R??"?v?g????ԩz9???S#??o??[C)e?[?Ӽ????4?????????'?~??I4_$k??{i???]09λ?tNh%???pZ??S6?U???1vUrZ?????B???>???c????a?v]:??8??HYyL?μ??ȕMvU?seW?g?||?2?^O?o)? ?h ^Gf??(4? sON???uL;?????l.Q?^n?BU?K?Sl??go?q?C$?`???!?#KNX????= ㌝_??1N!?b?%?r&;?f ??yv?W???????}c=?dB????6q?v??? l??c?s?c??[?h??sK?l=??ۚ???8?=?N_?n???(?4?J??0ո?ϹƸ{t??z'??ʪnz?x?????'???yǹS?;???n??^?Ʒ`h?i9?܃?=1??L@!? ?D??c?Ȣrnk???q{?YnWt?v;?W??)??j?;ƮFN˴??B?KU?'(^??Vǻ?P??k?fT?C!&?|?????????]?g?ż?'?B??r??ݶԁ???;O??? ??^?+?_?}?BTAϏ?7'&???oW????B!?B\??J?O??s7s?+_.%??*+?;Ϝ??2?q?6?/w\?W???.?X?;7?GNMR?N}+_?#u?opB!?B\?.ܾ*?B!?B!?XsjW??K!?B!?B?u&?rB!?B!?B?3Y??f??? ???B???y?8??]IC]!????B?????"7?ߝe??z?կ??G*V??T3圾?S??>>{v?||??m??Y??K?O?q????+??I?\)?8?_u?Ҷ???>?#?&{B?ub??ut???8?E?v0b3??s?ךM? ?? !???*?r???j??C????+7ƃ? ^?d???????Ѷ(? tX?I???E???r?+?Wp???;͝k?!?bc۸s????????_??wy???o7?7?ۇ7R.+ύ#??g2I܄?7??[[?A?wM?)s?!?b(g?y}?@.?F???mX ++3?{??/O?X?3x??\(:>? ??K!?X?U???Ķ  ++?}-??mrv?xr??2x?V????Ǹ?????ʅ?.L?yjG??צez????"?柣??y]?~B!^?V\?s妹????\2?08y@5|?t/7?M4?p???Vn ?;???:???T/!?? N?:?????^?3?&f+??|x??ō?Y?>~?????]???؜?????~??i?\S+r2V?/????{?E ??ŰƮD?F5?Sm{x8?FwP?r???W&s???:?㜤,??@ @? 02???t???????Js?姸{?Dw?A?????}?{???x$???????O?~B!6??(?m???kQ ++,?4˶?????q?ig?9????A?>?E???iؘ???S*???η??? ????u|qa?)n?????k??YMA7Kh??I?Ml??????5?h[???n?y'0??$f5?w??????\??:x?7???=?UǗ??En?9ͻWl?????I?ߴ???>?15??g??=Ŀ?ul?"?J?Mi???(??7>=gI:ȏ??o X%N?u>o*=?m?O qo?I??u|%???b??Hxx???c^ ?,/(?-??A?XZ??[w? ??<%vN ???3}G?ZPu?S'?c?%???b_g?V?I?hF?W-??=?a?υ?qP?G]?qp??˜d??$?P(* ++?6? (??+?E 3K ~?^XP?t??a`?]?-?-??e?'s?!??ƥ?rV?7&?d????4??BtF?d?a????9????F?F??& ++t??_?& A?????? u q????T??y.??N?4w ?? ?????L?0/T??? ?E%???3uJ(?=>F|ˮ?W4??>?UfW??^-&?g??????????ΰ??q?N?X???baw????@???Ы?????:?????u?gؗ.???rꄣ?;??B\? ++}?]L??3%?Z???^L?3?qd?,?Z??p??4^̯? B'@q?` ?S ??D?&F??-??8X??IV?&s?ˠev?{?3M1?U?c???%,υ?`????E?vS?xܔ??X?/??e?'s?!???%?r??$7:??+????尋w%R4[?d IZlo??|?wYYW??͒I???b?=%?o?cr?????ײ?gjt?̝O???,??C??j??]?s4[M+>+?ҽL??b??p?x?\\??Pܜ ++?`z?F??)M?k{+/????^I?k?h}#????U9qR?o?-?, %??K?côi??,?N8?{??%?KU??\?9?q?l?]?-???I??d??[? ?Q[{??qPf-?Ȝ伫??t7_za? ;?Z???? ++s???d?'s?!?ڲE9?֩?z?_???Fl`~?UlP?9???.;?f?:?U?պ?<4_?????|?`*J?Ř??T/VN?$??~Mc?m???1??$\NfU.???X($]:X??+????,|?:??+?V.O?~B!?Ƴ4????3???Κ??c?L\?*??!?(?{?b??ad??.??׵?=:예S?ʤe?u-k???+*LF?Y???Qc??Ë?d???]䘢?_?i???K!l?u??8?????H???{{???j1(Dv?W?^~-??????-????K]?/?B.??ׂ??IU,??y?????*?U????Ȝ???I???$W ?t?o}?c?W?7ɶ?B??oOȪ?F?e??f_k!~Ƌ??N???~|Ak?C?????j???sۄB?-f?E9-?ows???$?"??.?cY??s????bajbP5\r??B???4'WPB4>8?'"??N2) ?.??c?iWJ?z?$??.&F@o?&x?-?ӌ}??L?z7P!??:V\?S?q|??3????R???>j;S8<&?`L??~???!?¼C-?>4L??.?????:?J?U???F?Y??E????PU????{?],?Bo?Ps?$????m?y'?Wv9Q?E?\]vڬ'?o7~?\ӂ?8I??L????0}?l{? ??>??d??Е?`5???a?8\`???J 8??R ++x??'?3???w?9 ?|;?^??s?ca??y?c4????š??|???9?BY??7 ڕB?Kň??x??t???x?hx? ??\??Y/?'ډ??,???FL????m6?\??J???!?'`b%}??U??38 ++^???I??a?_v?[???? έh??s?K?K??J??Z???? D?z???7g????E}n??']??=???!?8݀?R??H=????*? ++Qmv??rǎ?}?;??t??s???~\??I?˜du7h?T?x?8??&??;He??af?v???攗??Nv4Hj?E󻆩;R???m???d ?B?j?,f??G???,?]R1q?$q???{S??>8J???h??%6?&??/?|H!?\???????K4??3v?9W?w??ke?97FNAqP??˓_?????X#?$~?'?RQf?_??ls??+??ﶓ??G?~?????????M????-T?ر ??_?H?N????N?8?& ?V???J??v???M,R/? >??o??????ʠ?i/H?L???ֱS-v?Q????sT??y?Z??UȜ?:?I?f?dk?J? ?6??KM?3%??}???$?Gh?L???!o?@!???+????ߙ???[??)?项????^x??t?9jUK?c?σ?9ɢ??_,n?\i{g?2}_?w?!?ձlQ?Ĺw ++-"9a??'K??"??"???$_6?7???]???f??պ????j?U?,P??ҳ?XءXs???{?????p??????-Q??FƟ?F??[V?,?{? L=??t\? ?o????^???Ǫ?/;m????????Z?N??)ܮU\?1?d?T????@?Jq;!???W?c??>_?j???*ݦ?jW̃k)H?$Wkͱ?s??vc`??ϣ ??`?e?n?? ??0m?G?B!DYK?); ??d??Z??q??!??`???g ++w?E?dz淁Y)/? ??N?w׭?+ښ?Z??? ?Q?? ++?8?? ++K???ϵ?-?)>HW??i-nrR?$?D,?\????&?_:y3ur???z??F???u??ye?????Yb?N(8:??5fP37 K??5N??n?]ML?{0L-????'??9???z!?????4???R ++?3?????vcURW?6Y?^r?m??? ?????2s0?Fn?G"??I? t???E7V2L??8ͷ?Pomc6f??;JM??̿?P??h\2???K?mW1????BNf?)n????|Y?? ?a?m?EC!?V??[r| ++.2S??7Fp??LRw ++m??e'???9??þ??????zIڎ??~?d??v?nG???j????7]?I????˕Dc?i%m.???/z? ??ߪ1=????.?˚???u??Zͤf,-?8???h??;Ǘ?c?*??_???96L?~????} ??ʕ??EծŮr,??y2'Y?9?U9W????d??f???S???&??,n?????M?w?&??IE??&pk?L=c???2B!?bQ ++6p?M???$c%?薁?? ????1??N????hd??alf??C????LH ?a?P8???t???1BwM?}i(8Ȟog??ê???m.???????OP??(?:ٳ;H^t/?\^%??v??؇??ɝ?>?Xdid??M$3D?h?>'?SA?kcj?????F]?J~?Ga??????'Z?)n?X?J?M=s???nүt?^??|??1]L???c??&???М??N?/?ى??8g_jg?v??/?,?????8??{%?*?F?m???^_?c?V,l??g{O >8D?ѹ???>?SZ?m???P8?A?;H??o?r]??u?N?Ou??q????( ++F?57*?"????a???s?????N҃N??!=??a?6se?rS9U??dߋdN?s?~??̹??~hF??'5??|??V?C??w?j???wC?0??????X)??팼\G??Հ2B!?A???e?j?9C?{.ᾰ???y?Lpj??g???d????/?_O???P>BFi???dl?Z!?ֶ??fl????Bl???•rj?$????[#?u!???L?pM[mt????l_??al־?8?M?ʻɧTpe?ř???>B!??8d ?b?*.???M?&?I?7ڗ??????3???@з?&Ʃ-z??f??Z???fWM,??X???[?-??w!?Bl^2B??-ܾ*?B!?B!????3???tM!?B!?Ba?,? !?B!?B??dQN??b?+??o?????MBlLV?7 ?s"/IWlA????B?^V}???濜e??&?\?o???_???k:?ᯡG_?????>???????i???:?m?X?is?X?$??߆"L???'??w??{??6?1?j.?gO??1???n>?7Lj?m??=V???8w?A?V?? ?o??U???cBlQf?;G? ?7?x?z7fk?o??t??u??!??ZVY?3i?MФ??H`?/?8?c|?;?K????|-??4 ?I.?G?uJ??Ǣ|??G???`??????!&?P?C?`??C????pZy??9?}?n??1]?xU???l?BTJ??ʶj?L???vO??'?y?^^ծ??K??0q??????:u?>N??ύS??Cg/񺬉?^??6???????5??^? ?Bl5+/?Y^˒u?]????????z2??°?f!6????i?8??;'??-?)?w:???qa?ر?N?,????>?=?I??祠ƮX??Ǐ:v?H???6???֒W???A[?`??sz_?!>???+??|???c?;H?q??? ?Bl-???JWʙ?NNR???Uߢ?o?4O?Ь7??;k????? ?3???]Cg?tD???.?ɫ??}C???v?/6?0-??ݑ8?o??m?4?(????Ex??? ++4?XG??????q?'2u?i????}??aj???Ipz?^+>???]d?Q˗?qY9??t???8????w? ++?o????>1???s??Ա,???iZ?&??U?9??pߥ?$?????ǯ m??8???8޲?g?2?91?{?/???~?D] ++9G񋣝ml????W?i?=????(?ܲ?G??O???qeL ????Y??j?e\)?'???.]$v??t)??e??t]?}1O??? ??b?h?*???6?Z{ܯA???D?;V?[???????ںx?m?-???eW??9?|n??I??\?c?x??;???%?Z??UH?j?3?s??}??t???????? ??hj?2?ؘ????|?1??{?B????E93?b9fk?]?K?#??P?p:??:}???c?Ñ,g:???????~/$O??H???f&.????? ?P?????8??pO?r???Q??6????C??)??ty?,??@јt{?R?Z?65??h??????⯰'??ӧ?8???Fb?;??\"???z???g?|?]?G?X?h??mWg???څwk?x????%sh~7????3?v?^56c?`4Gt?!???xu?ar/??o? ++s<\S?i??? ???r?<? '?h4`??6??k?W%y??m?<8???@??k??????2?m??z?w??;?h???:yt?n??>??m??5??^N??k??Rch'????????}???1E???sY9%ڣ8?ٮ}x?x?@7??”?}??Υ?:^???<G{xKa???????.?Q??a?%?? ??۬i??_?z??H?3??t?y?U\p???Blx???????????1 P?ux?=?m?ع\??S!o??kAײ?8?9gV37?S??J?}????um??3??+???(G 'O۾?N\+?՘Ԥ3?X?M???g?n?4??Щysh(?47?Ѧ??o~???????B??i??A?~$?B!?FR\?+?51????q?6U??c_?\?Ͻ?_???|o?z5|?}|?????,?u?w-c?l?~]??_?*??????l?2f|????4w??sk????̭J1?잊??puV9?B??B!Ħ???g???Mj ?tۯG7a?????玞??W?f^ g.M?e?K??a??`??1?????R?󡳗x]v? g???lm?ni???o?*g???ݑ?s???????T?ux???G??^?z??zB???1>????G??׾,Z?r?E??B!???򢜕?u?,?Pݕ,?(:?V?؆?GG!^????d(x|?֫ڵ??F?B??@s?d?e/_ @]*α?^?s"??m??*K??U??bi?w=??g?8????.:,©i??-?kX?չNDžB??&yG!?bkXq?Ñ?䎬???E?????ŀYO???v?x?Y??;?CW????YKB???:?MWx??$????O^??? ?i??68?}??M5?'??ӷlqu?~?I?}\ ++?tB?r?????x=?m?R?R?}?.?8t???[ۘ?Z?|ȏ??qǥ??m??ة ?}g?D^n?ţ~??xO?8?2&??X????P?Osw$???z??)MA7 ++h??/,???w? ++?o????>1???s???1??|?3?_???{?????z?U?Ɵ??nm???o&Ե?U3??Y?t???+?v\?_+(??y"0?Gc1?Z? ??7ʖ??qO?빨\?H?ֹy?ŷ??ri?H???z?Or4??Q????f^?;????F?~-m%$?Ԙ0??ۙ???-?}???F?-G?g ++??????_=3?2*?ڂ?07?G???8??????? ?|$????D>M-*?~g?+<\a??k??X??? ???ǻ?!k??+%??W? ???2???L??6?ڹ?ŲP?????^n????B??? G??ͱ(M۹??Y?#??*????????,??? W,?V?/??t?/a?Z????r?b?:g?ͼ????h?o?Y?=?#^׼? t???˿-?*?Ru&U(8<$0ٖʣ? ++??+s?Ǜ????"?n?ˇ?tLM??? ???A?6????3ŷ???????!?? ++??Zf?dm?Õ?1mb'_?oi*J?????دk??????r?Z??d??(?j?Y??B!?ֱt???x??p=?v?]??f?? ++]r?B^????13JA???????z???}L^˷?**0?_ ++P????$y?$???j?a 9w???KdVU? ?f??0^,G1fy{w{????:8?????/)?m?Lg"?==??p?????s? ++??g'?w?"Z[˸??I? W?S?2q?4??kp??q[l???|??[|???!?(?{?b??ad??.9????Q?V????*9.}?f?:?'?3:;?{?٥???mlv??Fa?8͹? ??`"}e??????Epf????؟_????ӣÎ?8u??c7_?????_?? %?U??6??U??}???9?RT ++??ʨ??[??Jbj뼺z?%?!?BlK???T?? ~^?[??ų?<8npڥ?桴Ƌ??L.Y0??: :?['tNkj??Ժɫnλ????x9??P ++?ŷl]+#~'??rT?e?A???'u[???:????????N?ƙ(;`??8E??ՙ?Zm?S#????q?E???g??xOm??t{???????PC?S?_==???0[???ج???{"??]䘢?_?? ?n???tu??ޞs?k?Iä?^N??5??4??m?x????&5~?Z????k\h;???<???0??d??śo??6?p??;?F9???Z`?^^m???T;Dže?$????R?+???r???o̿???6vƧ?r??A??_g??/<??cc?0? ++??{~a???p?N?B.??ׂ?e?W?h???c<0???.?ɥ????k#_TO??*?? ++?Q?^??w4???q>?=?N_C'??D?????˿?o?1T? ??????]|w?+?6[??B!?B!6???\???)???bk??6?j?????¾͕S$/o][2??n<ϟ?x????_}????~n?-mۖ??B!nH+υ? ??eI?:??*(Mщxt???6?=: ++??=??'C????W????cBq]m??"yYl&#???8????o???4{f??5??M!?[ӊ?r??$wd5N??/?,?9Ƈ??rk?@??Ϸ?????u]???,M9ȸB????o?]lnc??;uV?#??<??VЈ{??ж?o????*?wP?4o???I–”ǃ??x ??˜??'???b'??}?c????}?ng? ??god???b??[???????? 3?y?R???GƸ}:Ik6?ۚ??m??f??8?????&?y`4???,??\?m??_n???;??g5?1˛??/???P?????=????a?6?)?J?S??㓻?d?8??"???|?Ʌa??B?5?{+??sxur???j?e?;%?Yϼc????b????Zf?s?fq??h߅Bq?Za?`?:9I?V?W}?.a?L??gh֛?۝5?XY?Gy??B{???m????-?x?? C?????9?Q??W?uMӪ4?ծ?ȱo|??.]$q? ?u+??1?|??????K?y?J??S????(?ܲ?G??O???qeL a??O??繥?,???????&?ޑ???R}???n'??m?I?,??r???(?\??9???7-s??c???8?]??w+???Cm??湱8?8???.?cX2^* ????S@!??0?Y:Pj.?Ñ,g:???????????w?;?T???A^uC(?]??nξ !?B\iɕr?T?? ~^?[?!???<8npڥ?桴Ƌ??L.?1Pg????8o??9?????Q???yl??b??x"8??.??J /;-g??b?4?F?Mg?j?S?????Ə.??°???J??F? ++N???(? s?"a?h.?O?Y??7????????S5^?AM&?l????~.??i~?????>>w!??!?*???? ++????????Er??"????$ ?0?P?\?Qr +hs?rg?|XüX?{A'fa????~??kU"??8?W?S?Y?q??? ++?&??g??????C??>??t4?>?dK?<; IH!?&%???8??O????q0???d?c????????0{ZC8t;'J?????v?l?m?????ln+jy??>?Xc?C?3??F?t??h彡>?7?q????}#?2 !*SNQ?s?)??????C?y??)yy1????y'c[???????;S?L? ++xum=??p??vU?]!?b?E?Z??Z?>?p???m|????+?f???^?f?&n?0y.J????>?9??h??|-`]yWCWb{e?cBq?ZPNY???9????B!??ћ"???s??ٙ??l?KKΒf}8D??E?͂??rQA??7<L ++?1 ++????HZ???/?GVN??B?K?r??n??P??B!?8???\?ځa\?r?;???ū??f?? ?E&??B??__??6 ?I?y???2fD????N??"?[m1??#?B!?p??U!?B!?B!Ēӛ"?mqB!?B!?B,3Y?B!?B!?b?ɢ?j`?xCw;{F?^?]?uB?d[]???B!?2????n?????ڋ??Ъ?50=?s ?T?????L棤?P0??? V??/?[?/Q6?\?ۏ???}???^3?ԎN???b]?d+??%?{??ƪ?cBe9??K??????9\T??ז?nY?#??j?a>?t???3?J?????A~[????\Ƅs3?B!.,s/ʙ1^??WӜ˄J?rYY1?|h ??YW?????? ?-???U????1!.??|???œyG3RT? z???=/O?????????92?3 >?ꊡ??$aҷ???Zp$'y]o<?ܾ??:?y?kE? B!ąkΩ?-:?q U??&)Ivt6s??)?u?U??'|6?9TOF??h+???X??????V?`iѓ?:?MC?'?X????3?j 8H)n?v??ʱ3???vn LXryx)????6?+???Z:??Z?n`???1?r?s?a??2Ƹ??0o?????/?{z???f>Q?#`&?upS_? I???́??r???|?e?;??;??Nx?4{?????3??E ?[????è?E[??\&u??y?h?gK????V/?I???? 6?ɍ>??!>u?8??]?S?PT??B!?X?9? ? Rl)????na2 *FǨ?V?? ???q??:?{? ?v~䵨??j)`?ڍq?DU=??t???F?t???)?t4?????57fc#?tGx???!????q??[\?s???X??I??U?l?h?.0u??ݢ?a?$"\N^??o?u?H\M?^?*???LD???]?G?T,?v???>?j 3??Έ?E4m%?Ƹ?E?kv??D??Bq??w?????{?0~????(*?`?d??t???/??p?>?+?]?Rn?2?x?NO????.?22II?$j??0a0m2????ɀ?d??(?l????X?#?????Ω??"d??->F96???3^?_H ?^??A???? ++?m=?c?LN[?S3_?+?]?q??U???ˊ??=͝?3??65???,N?m??9{??i???Nzr????? ?a??ae??z~q?URS?2?????},S?U?cF??5?? g??P=<ȟ ????? ?p?? M?|?l?Þ?s-?se*}^q.?w?g???S?!y9w?wN?F~??AI4 6#???g?f???&??_G?t??'=U??R/???!?B?S?3z?+???J?>co&?zH?y$~j܌?}, N/??D??K??=?8?[N1???sCW[? ++ L??握?U??Ck|???L?EE?kC???I????k??u???>??tNs??????#ś5?Ƅ??f? ++!?"?f?)?? sq??J ++???D/???ith? usC???5E κ$g??m?p????hIQdzy??IRwr? ;z??]?Q?-51???b??c??^?????)1< {?-????#|:??? ݌hi ++c &???v-6SS???R??G???M?x??n??%?????l???;e?i6uwp??G??nP46N?~?~?E? ???piw??6-?~?I?@{bv~[W4??'?? ++??d:߳?c9?c?w?h?-)xS?ÝU??/?H^^p %?(R?????5 ++?ü???{9_)?~ߟ??$????K??x;???Ǐ<?>?R/????̎n???????1 ++???'Ƅ?-2?s??B!?pڢ\? ?xl???????L???&|??????????4??(?K#T??M???P ???ٸ??K?3$3? 3m?q~(?B?|?.rך??"H??ᆣԕl?3?g'[3?UM?r?u???<?]A?x??d??b?X? ++????1!??@-(???q?Z?yY!?B???M?Swʹ???L?yV?~?!??p???>?-???.???ox,?Fc???؄??I??̫??cB?s??Nb(?B!V??E??ø???w?[??b?Y7>?u?I<&???????W??Mc?wk?? ?? ?m?????a?DŽȞSDvC!?Bq8???B!?B!?b??M??%!?B!?B!??,? !?B!?B??dQn50c????=#Ii0!?Xmd B?*i6?;?@??s]!??@?b _X? ++??`D???oe???߽fĩ?$?)?ź|/?^H[?T?????????%?3??|a???r???0SԆ?x????*_???g?ԱN!??f?E9????z!z?K [?on+?n&???(?䭘?abOD)5 ?$V? ?l?>>???[v-??????j?=??W?X?V?y*y?¶??N?םhⶡ?ɻ?bvʃ?=?5??o??O5?`}? e????j~\?&>??Zz??v?sMd?"@g?]?w??yͪV?jsc??R????K!?ȣ9R??A?-??_p?-L?A??? ++????13ΖP'{?5???Ώ???\-?_????6b??0???ۏ?p???>}?Q?i??_[?0 6?wp͉??l??/???6?????{p? ?8q?k?*?ʱH????;?p`?F?? 9??Z??3x؏?????䒶??2d??`-/9 ֌?xw4??(??^?Ûw?????e?ƍ?<暺?hXӓ?4?]??tH???Z~?????]G??e'_???Y???-4%??~?ŰEÚNaq?5!_L?WyL?'???!Lo9?U{??[?&㸜3?[?c?)ΦJ_%Ŗ?&>??C???\?~???Ǜ??m?>+?RB,?ZNQ???S$//S %????40M4Ф-??q?C??d??4??c???5???u`??(???N??H7??m??76L j??񁈃'??9贠?T?5?f?vJ?L??G??T???z !?yt???? ????Ε|l^?>&?F????k?#<^_ʐ??Kw?P?8??-.?9x??? ,穉??ǁB??@??`??v.K?????D?m4 ?N?:??neϰ?'??ηf?H\M?^?*???LD???]?G?T,?v???>?j 3??Έ?E4m%?Ƹ?E?kv??D??Bq??w?????{?0~????(*?`?d??t???/ˬe}l$???????????u?????Ju?S?Q??z"? ?}kw???+? >?????a??????*??"7??i?1\?gN??KC?;?&?hF??p7? ????8'?`?†'??Axֻ?4&vR?(M???:(X?#??w????? ??ᧅ? h&?D ++,??|4ۦ?w|v?????? ++??B????K!?ȟ????0?&?,)?zt1??+>Rn?2?xIO????.?22II?$j??0a0m2_?5?Nt&??0?Oeg??a6~?w.?}&??n??Q??????W?Å??->B?4q???w[???>??&?j??&?TKb?M)h/)"??򘀑!Jǚ??r>/?:??ϵ?ϧ??;B??????|R???p??!???8ւ?U?1??%???_?6&???r?f?s?)&??:b?X^?a[?&yy?????|????t?݌?????o????t?????~f????તe?1v?&1]>B??m? ++?<??3????\??kN=???? ++??J{?*??c]Nm?P/!?"f?^?d??S6?PR0??????4????nn?Zx????Y ?J???~?5`?ђ????\??????v ?p????v Zjb??FK?B????? [9`KSbxx?إ??K?Q???nn?:??????????S??P?Pw?^?#?=??{???A~?u?L??S?+?C??J?=t??\??͕??3A?t|?"~Z??]?G?tzO????L?9h??/???13_??xxt????۸??$??????X? ?M/?9I?r????T?????".??Ξcܦ??2??bO??o늦?%w? ? 2??????r?1O????)???*?? }???4??w??wT?"ӯK[,?-??~V???t4s??%?I?@'?Rm ???'1Ʈ ?F???n??????c?fSw?X}4???Ec????鳊???*??J{??8?X?Ԧ??B!???E?4??؊y~??????????֤I?????Z~????tZ?V?T???m?٭Yi/???"'I??S??ttsu?n4?????ip?K??+??5?7????\????^T????ya?f?m\??̛?v9O?'E9A+?????[?????C???g2?^//:?'??P??Lk!??.?C???????????H`?Xp+_?w?7?í???8}?L?X6??S?1??,?Xq?Sd??傉?j,??J?B!???7EN?)??3m??YW?Ĕ4??!j,.?l?T?????~???`bP?Qh??'?F????~a??.}L! {N?I ?B!??7?(??v`????Ny[?Y?4???.2????????J^?i`L??c?\?ᙛ??mܵ~?7\?? !?=???$?B!??&?X?V??.c??I 3?y7p??4?>?????p?`a`i??6???1?+?-?]rB!?Km?E9[t?+??Q?#`&?upS_? I???́??:κx?9??|??u*?Ӥ?-]B, ??U?????2fJ ?} M??n????MN??E\n?l??S?'(͑R?|??Ԟ^_????Fe?E#??? q?x?t]Wl?_ָI*ϑ??i???0k?0? ++?t??}~??8g?{:9ȧNPV???T?1Y?緯?m?, !?"??X?3X78H???? N??iT??Qa??? ++3?l u??X????ȫ?.?R???y?n#F? ??? ?.????e?V???? ?`sל8???m?ҩ)mc؊?o?????G?v?¨?4?;??# ?n?a? ?ü????1???(Oܳ?=?%m??e?? ?Z^r? ??h??Qh/???7??W?=?m???y?55?3?????:̧C:?U????h?:?0<5} IDATG-;?r??$Gy[hJ?????a??5???t?? '}li??bi???*cx??w3%?+!??T? Yc??B??} ???r??#??[L?'???!Lo9?U{??[?&㸜ӋiJs?[:??xX??r???N?o?W????^ϑ??V/???## ??#ʮ ????>Y?B!?[g/?Q?I0QXJ?\?ؼ4?}L?>7fc#?tGx???!?Wm??'???;??y?????a?????I??XR??슯?שaM??%??pO/ ++!??|t֢?=?Ҥ??%S??g??x?g?]?QʍR???'GyGWo??$e?Yp?0?6?~Q0`X? ?L?????5?mT??K|?u????95i]?lu???(???^{?+? ??B??!h?8[_ửg?c ??i?rj??-mB?;v?1ܶ?绌??'1L???Q??ǰ?B????(gP50D?5???j?PSP?,a???|??~????-9?{?;?g?Em???3??ۨ?s?~4?DR???Vu?3?s?1̽?44???X?/θBl?Vs~?B??\??[B,??N?Lc?R??2f.???X???t??0?T?3w?-`Ͱ?yʧ?сA???X??,???ܟdB!?ybv?OOp?P??@ ?*?%f??cIpx ?>??4?`?????1?OB???NJ?SW?)ur?t?DӉi@z???9N’v? Q7??R?X?;V??p??&¶?(v???~s?Ϝ?i/S?Ia?M?=?L8?taӄ?`?k??PH?S???b?e8?U????w?X??1i,/??-??"c?$?sY?.D?b?4o?yh??C?e?????G6?ıL?ʌ?}, N/?9]???ښF??xۨ??q8^U??JY4B!Ē??(?? sq??J ++?_|?????4????nn?Zx????Y?+?n??y׀?FK?"??sEN????N?1??U?2??-h? ?????-?}?Yi+?a?????E{'{C=?:??*????2??܃?? ??DŽ? ???2??p?k^?;xS????52fJ WF +o1T??h ?n?n[{{??i ????(??j???e?#Y9?~+?Z۸????!?,d_m5???.8?ɳ??xWs?*x͖??B??h?kMck?G?p?Q?J????9?1?\??*7[7q{}`?c =??=?:????V?KxWb{I?Ɋ?cB??Y??.c?,??[uynjr?k??S?f>Q?????U?????0 [v??;?? ++!?bћ"???s??ٙ??l?+??$?ziևC?X\??,h?(?w??|?c?Ġ0?Мo????:???+?????e??? !?r?/??p?Vc M?#]?=???e?9??????V??BKǨ???S㼵?_??_fz?@!????E??ø???w?$?,f?u??\??cXyK?~}%/?40&y??F?????p?6?Z?χ.??2??DŽ?9?Ob?x?2?&?D???~ޑ4@wp?b?lK?????G{??#a???^\ŗ?]?M ?B??:???B!?B!?b??M??%!?B!?B!??,? !?B!?B??dQn50c????=#Ii??$qB,[?|?o???I?!???&????!???y??h7?????>?B?]?z"??/???3?;:?;O]???6??Ǘ??{?N.?(W??si?Pn?\hF?M?ClL-????ǖ?O?x ?D?? ++'yg吶8?LQ??m#??/?-?r?3W?X'?Bd3O?5?? P???׊j ++5l?????䊖?\??b.??=??4HD?X????l?>>???[v?b]???ǖ_??O?8K_b?[]??????B?;I^w??ۆ?'?bvʃ.g]?p?? ????????q??831?ଢ଼?\???u??ݺj^??>?u??Zv??? ?%9??BCP???] [4???\??????R(?B???&???c????Ǫ???-X?q\??I?B?M?c?????????? ?t??x?????g?T??B??P?)*cx?r???e????s?w4???f???bۢ`b? n~??c? ???b7t ?1?????L????ܩS??ƶø-;?f?AM?1>q?DU=??t???F???Ni??0???Y?ʜV?^B!D??(gDyC$?Da)?s%????I????ll????ח2??E E????₝????mS?;?k?!????????*?B!???E9{4̥I+K ++?]?Dw???ƻ"??? )^Aғ???????LR?2??,8LL??~?ΰ:?!?L?ÜF96???3^?_H ?^??A???? ++?m=?c?LN[?S??}L????q?ƒgS ++?K?/?Mh??(k??????5'?|6? ?Qn????|?B??? ++c?-?9?,??O??I?$??7s??3?a??d?'?9yWU6???n ?? ??9?????F9 M?U??Xw??-P???R~?w?1?Ɵ|?YmN??z !?*?X?3????wn????dX:?b?n>q??U???ˊ??=͝?3??65q??,N?m??9{??i???&???g???c?{{i&hXٿ??_?qu?ԭ ??2ݥ?c*e??i?8ϵ???K0Q?o?g?\?Z?sG?󝧙Ɩ???yH^^Z?nZ< X?Ɂ?Ӏ?? ?s??{$I?x?E?NB?? ??n?l????3?y???tRx?g'???E?M&?.=????a#?k ???2P)?R?gd??i??+T Q??oe??ʱN=$?<???n??>????G{?K&?y?ml?-????-I?&yyy?a?wT)???????Ǚ???T??-2?(??$?M??#?L?sp\Z????c?h??#4kl???????|r[%?????u^f?????K?3?u9?i?%?B?ì??? sq??J ++?L`?????4:4ʆ??!j???"gM????m??]V-)?L/?9I?N?:a?@W??8j???&??n?T,?x???˞???4%??g?]J???????u???qh???YE?Xw??'?8g??????B!???E?4??؊y~??????????֤I?????Z~????tZ?V?T???m?٭Yi/???"'I??S??ttsu?n4?????ip?K??+??5?7????\????^T????ya?f?m\??̛?v9O?'E9A+?????[?????C???7??? ???ӓ?\b??^???V????~ni??J[i ??]$?p,??/?;???ց?Ty?>???qP?)???2Q)?B?O??4J7q?????a???p?vN?TO?y?8?????[????M}'?, Qg!?j?y?g????&?y?2???S4???)?|s}?????L$?(Qi?E?????+?[????wwe?q???7n????>???{??#??v??u?٦?<1?Ug??N?m?-?#5u???McE-???Gƺ+???q?8֩???%?B??v???4?Az?7??d??,8?ʥ窦W?ٺ??맿?t??}?s??њ??Z`.?????>&?sZPN?1s??B!?XM??ȩ;???av??<;늝??f}8D??E?͂??rQA??7<L ++?1 ++????HZ???/??ޥ? !d?)";??B!?X????"&??|?? [j??)?Jd?Y7>?u?I<&???????W??Mc?wk?? ?? ?m???s?v?HQ;0??^?~?|?@q˖SDvC!?Bq?v^z???|+??????Q?N!?B!?B1???F??%!?B!?B!??,? !?B!?B??dQn5H???O???ʧ???0'i~?!?????.?????Bd'y??#m*?Bde??R]???g?$??/r??n??C??>?Zf~??????]??o/??????????O?7??~N˳?^~??o??fώ??ތp??˦?z?o???>6?j??-O??W???>ˡ?qR???ʭ???nᚠMq???c??W?cL????y?`???#Ĺ???k???L$/+?H?Μ$????i?)?o???c???P!???gQ.E??_?Ϲ?ֻP???????xj????+?歘?a?&?Nb?!??ΐ???~??????qr;[???#???}??u????o?D?1<8A?g?a???c??????s??8WVWN???F????׼3y??|??G0??G} ??w?x=Z??iw?????;~?????[^7o=WN??c??o??????c?@%?^?6n??O?v?????<߳k升B!??܋r?>^x>?k??????,nʃnH?8??S M??M?W+???[??'-?????V?R^?p?5\?i?iP?m???)?_???X:???????H?9?\[??/~!???؁????p?]??:???2W?????}ُ??????κ?í[4Z_?ɟ??{?????F???y?⭜8 !?87?\?K????..?e?????_??[?M??????ĵ??X???ǟov????????????p?c?ć6?P̜3?B,Y????ݼ?????b?l????p??z\?+Q???x|/???U?}-??? ?(>??5+??]ߢ?P?TM??$^ǥm?lXgߧ~ʫ?ƹ?,??gc?Z?⤨? )??*?9?!?:???????}7?????? ^`?d?????=???0+?|???T??h??ן????ev ??^V?e?&=hhx?˨?8?z?z???r? ??|????q_S?r????>??n????lT^q5Wn?p?:?>?d??? ??4>f?ef3?X???=??H?????Q?????x?l??? ???MS?Ee???z?W?yGIJV?K?e????2q??4C?򙏡???[?y?'?$?R?0??m?7@? :CtfO.f?1??v???t^???t޷?g?{j?(}?xk]??W??d ?d{???ԓD??Y>??S????h??r?d????3???%?̑qX???)Y+?g??;.??aR???N !????s????H^>k$路?????ݗ?6=1]??z?L;?9?}????՛?N?????}?????ů?p? ??s?B??wJ*????k?x/??j3(?(`?_ŚMj?g???yt`=?|?>.?pc?4?????eQ#?????????8OiGO?????|????+(?n??q???-??J?x??>??hgVi??b?c%?X??????T?9ܒ???????+?a˶1????)Kl?䭢? m/??мv?is_&????||U??^B?k?8?̜ó;uF^???}???&???YdC?;??y'?c?L,?????? Ɂ????%?_L]?:ߺ7?q6կ9sJ=?????c?L ???T?X?}M!Ģ8?N?h?+??q?[W?Yn˯y????,????u???S4??p?EY?^|??^???9?pr ?^?j-f]?{y'?????"?x+?ig?r@qRY????'????a(????*3u˽??r޽i'??????껸?(?@?oh??q0?D?ՂK???_??????[x??B?G1cce3?&??V??J?/???^?y=y?z#????2l[?????O?#?g?]????Yb???x.??K ++?{0??>6g?,ME?񹛦???E?:??7?q6??ΙS??????+??W??r3WW???????/??y??{C嚨B??fL?Ei~i??s??9?5ʡ??s?:???\????\?;? o6???An?z?_???????????-?Z)7??G???S?????G??bŕ????z灕???/nn?;?^V?T_7W^i??ǒ?5?????~????a!??P??u?L?>??5?|`??????9?????O???i??^B?s?:?M?ó9?".?\ċ?\pA???_??.??"??aX8Z????$%5?u?????@Ps?????}??o??$??????5>?f?1ӎf??lu????>b??=?w?f?Pj'e&f!?Y1?SR??j喡 ? ??G$??????s?9&??gsO??P??Ig>?WV??o# ??=??????N???5????Q?U7/T??h? ??2??u??2;o??ck?>???p]??-?\?.?B??? ????ө?В???`?N`l??໫?7b??d???u??ׂa??ƨPJy?&????wpS?QF7n??0?n拭! o);????,h?N?m??????L?w?x̶???_`???-N?`??q,nj?T? ?y?7[? ?#üex?mM}??.㛵?4?-?s????EsNbB1%?s???#?f???B?\>=u%m| ++??d??{??:??? fH^V?8??????%????V>ғ?gWz?? ++?\??B!??p?5??$W????nfNΈS????A?O3??Z4? ++Q???#S??Q6?a?x; ++}??\?x? ?ɓ??????l?SV?;???c???;E%??75KPY?3g;h5?G#x3?????B?`?w??&??? eq??7??m]}?K????<w??!A?h??U8#???8??????>v?:v????t?d???????e??M?}????>?ñ???s??B!?珓JjGx???V?P?N????^n?OqЮP?消?=k ++???CfOU???y??O?UŒ?Shxy??q???s?c???al??W ?m????W????????5 .;?N???(?[Փ???y?V{?????u??F?????B'?,♳?Jc????uk??gCO??3?2?BL??u[!O??????oT???N"9N>?x???9?X?????εI?&??3U3??2?m>)?)?(??????͍-???P ?\?w?&?[:6l?m??ɩ?&?.jx????RZ??.?#??????F[?v:?gϜ??0P\˿?[y?@ ???? ??????6???B?`?n?q?z??????g ++?v/?:?M>?8?_??~;??M???/??ɧ?+??M??;???4G;k?yʧ?x2$?뚫??=/Ϲ? P???k???S???[??+?????8??.?BqQ.t???H?????Y[??W?O?ㆆ}ܩ?r_]>ᅎ,S????R}??Z???'? kB???W???]`??l#Δ?s??9 ??"?B???L???C??y??w!?B?35?????`????&?"G4???BR4?1??,?Bq??a ?E???? ?|v?,??? ?0By ++&??<_Y?N?m:1??|x#WMw`k??NG˯??k|D%9??{??ll??X?`?h?z?pN??1!?K??r??V?DSX?????˫x??Mdz%᪮Vn? ?Pq:q??1?l?p???z>??G ⁽G????J?YL????=??????N???5????Q?U7/T??h? ??2??u????˶0l??`?Z?7֭a߱j?_??'-? ?'G}??q???a???xnB!?9g?I9???a ++-y+Jd??4U??9RH????Ih/*`?Dq?.3?آc?c??????>+D?Mǜ+g?B??AM??G? ??{??=?_???-e???8?X9??-???$N???? ++i?Y̜+5@f??*[??????㸀???ٜ:΋ynB!??9?N9???yZ>?u??????/*@?*fTH???Q6?'?????K????DǛ:??(?x???Ilg?6!?9?G?????(???r??q3?%N^x!?`?W??.Y?????J?L?s?b?=c4K?H?>??e???{?K? ?r????|? 3? 3̝[?Bq?9?tp??(i?E??/?=?d/???8hW( us[?ž5 O}?!3???*?\???CG?<]??۪bI?)4??\?8???9?1ӎ??'?{?L??Q*??4X1?Ŷ???2????C??????\??5?t/:???}?Lԭ?+? =9N?~W?>????\??kR>S?9?or?9S9.???E??9]?5>??WV????>}(Ŏ@!M6Wl??q/???3?\?'G}??qa??a??s?B!?93&?R??c-䕴/??k?Z?.a??zx?????[?????ky?????A??`Pm4U??x)3?h4?\?7?6??k??Dy쬩??3?ʙ?????>????M}?h??a?ɂ???Qi)???H[ێ?U?h/Z3c|?B,*?55?;?????*a???u??5 ?+??O?nh??>P??{yաN???k??x+?h?}S???{?mWO???~;??M???????-??Zb}_r5?1w%_]o疮^???cR??}???,??Y?????y? 3?!?B?k? ]5???R?|t?a?m???? (#? ??S?徺|? Y?x?B!?B!?8? ???sM rA??n?W4?R?G!?B!?B?\???KR34??V?.G.?p??Z猒t? ??v?B?8?_ ??I1???:~???p??=???h???_ɡ4?m???sk ?$Eq???:??gsIo<??Xϋ?E??R4?1??|?B?l?ZrY#?\????3??I????;?' $u@a̕?s?U<㳒:?L3w?&)??Ѐ???K??b??=?w?f?Pj?Ωf?ȧr?-???M=???$l^?YX?Xu?Bu-????L,??XW.??????7?^?&?????y|2?+g?}??o???lm?????????5>?f?B!Ģ?eRN?bx?BK?gܖf??? h??*?q#ƺ?N?i?_???x-?N`l? ++???k?!N}75et?~?P???f???𖲣?K?͂???t?f)&?œ???F?i?????%??? IDAT???n????5]?|v@?7+jx?e??????q??}??D?NO?[[?@??1M'????d?????q?0?B!΀jg????8???#?Oıx&rSΘȧfr???8x?ge??8?zɬ?9u?eRN!rOM??ή.? S?4?X-? N(??Dn????e&??????vT?P?`?ϴ?Yf1???'[??|?c?ժ?7???c!z?Y[ó?wҙ?!%7?B!??tʤ?N?P?<-?ߺ??So(?? ++e???q??tS?H?x?9>????ku?8?J??j ???3??Y~w???M?T? ???!?5?q???o?VҐ??W?V{?ϕ???:}??B??ek?!n??ٱb-o85??(?m??ʢs?&???2?ʝ&C?\?2?StE?0?3?2????8???t?" ?:Ue z????| eM|,???Ԏ??f??L?ruNB!Ĺ?? ++"5?աc?E????3?ԏ'??e????)?? ??Bf*???'???M? ?li~=???E??I?a??????[?g??U?TG?e+m???ȧ6??w???ư?l'???C???؉S#???8???SBqv?Q6?a?x; ++}??\?x????s? 4?أ?' ++ |?????Ǻ?? ??_?攨???]???s|y3?2??_??.5?Y??p6Zl??  ++?Wd b6=N7?U???Z???9?????1ׯ,? ?BB?d?}?PT??xSr?V!?X?,k??b'??n?d0??n;?Z]?5??l??q? ++Z2???6n3س?????˨?<]????[?K???????ϊ????Lr?@??L$0g2Nyx?  ]3?@??aq0????!V??F?????L??????-?SA????ƸB,???Q ++mn?, ++d(X?C?md?Ն?`cX??eE'Emw;7DtTCǝ?R=?????2~??̸??`b?w? (V??0?v?r???WU?{?jn?s??!?P? ?ϥI?v ]OR?`????so?Dn2??1???+ $)??qih??2?֩O??CM?06?z/??x\?D?2?S??04x-PLό -???o??Md^?Ö??5Gߥ??*?0o????Ѧ?Y5?ϝ-??YK???b?թq>_???ü?????e?C??戱?{???6?????W6?l?A???٬Xb??e? Eg???#!+?#?l?t?? ?X?B!?S#3_M?jh???W?z)??bm_+?% RV/U???|kOL( ?򐵏lk???h.?fw?c?8???ƕ??'k??s_?(Lڽ??P???p?r=_?u?}?????q?x?W?^?,?P?([??p 7v4q5?kx??I?б?`Co ?LN?=iuq0P?#???ty?v?h\??ojm???̥)?8??YS?S>M?NB??Eq?lM ??nnl9???J??b?C?>ϛ?M ++ŵ?K??? ??M?=춫'??;?v? ›>?)_(7??3??x]s?]j?????j??U.?9??{ nu?X??/??v?:?1?i?W?????s?g? (&??T??8'??R^ͳ?6??e???^???q6?<~\]?G:???????5?*t?|??B!?:?BW???/??(???Exp????mĸ?awj??W?Ox?#??B!?B!?? ?!x??r??A.H?ؽD??-?x?B!?B!?ȕ?I?$5C#8m??r,?/ ,?x?B!?B!?ȝ?? ++!?B!?B!?I?? ++!?B!?B!?L? !?B!?B??dRN!?XHF?+???6???+?B!?8NK??n?|???? ?V????Q?(5>????R}??Z???'?pa??k㯏 ??+n???B,gz??{???????9H Ś?>?o??u??Dz ???Ǩ ???Ѣ) ?!?B,Wi&?t?!J?<??? ?3?G???? nlF?+Zsӂ?h??-??ЉGh ?B?cR? )?5???C?Uy_ 8HM??? qOc3??t nu?XP??ˋi??܌5⦮?6:I??0i?'Ji???`??e??tM?+)z?@L????x?0bkO+3???Wrh??Ԣ????k>;W?s?j??.a?b?U?UV???:}U5?f?MRO?Q???*?y2?N?x[:??l?ࢉN?i ???2???c??r??V?DSX?????˫x??M?t?2/c?Q?chĹ????BT&,??vW??q??B?2? PR??j喡 ? ??0|?#??????S?}?R!?{???|?ԞE3?O?8?{ڸ}`??L:?y????~I???????u6??,??R??y???G?lh&??M??|??????tʆ?)w?? ++??7 ??p9?q?Ə??????????F???0[??u?7c??|r???????????Tb??7SR??W{?9Ŧ??|2\—6??m?L> !?¬Y&?t*??)????{ƥKC'06N@ ??Uy?1? t??H?????k?0tccT(?<\??q??;???(?7?K??7???????^zl?D ??6KA>?xL?nq??|5??Y??d?P?o?Bܹ?G?NO?[[?@??{>??}??jg????8???#?OıxN?[e?~?YF?0?p??2??x???An?3X????O? ?ҹ?~?&?,?? d?F'????d??d??!?N????&???دz?+?$=&?iMf^W?X`f??R̫?F??,??? ]?7 ++??>0DE??ִ1? 9?0!O??D?T?=?]X=*?ż?K?L???ul?a??V?A???P??No?? &?r?@???C??zUe??$??H?0aw??TO[W??B9?^ھ+V??}?ͱ2z ++Z|?u ??|???B!?5?M??"?lIh?-rO?r???>+? ++?Q?????5C*T&R????6 ?E ?(????w???1???ŵ?a?????)c???ү???0????c??R?????=?+?b?d???8?Xy?k[?;?-&??-:F9V~???????M??m????%?????vT?P???X?̺f{?[?r??Y?LY0??U?>?TO?? ++????? ++Z]?o?Z?Wf???:?56J?a?h}?﷞??Q|???W?1u\??WBy??h᪑??x'F(^??,??? !??L?2)?S5"O???.sլ??U)S?̨ @7U?,D?%??'?|?f? ?T#?\5G;f?驋(i?S?%???˘_׉?ȜO͑ F?KB1?X_{???RCQ?t??lc??H?NFUHZ???SN`?Yv2?????4v??????f????2_??X?,1dK??y֧???aJKJ?Nb??92?dž?Bq????S?\J0?_tڧ?geĩO??ˠ? ?)?? ? ++QXP??\?N??Q ++?'???/U֣l ?@`; ++]SW1SI?U?*𲢨D 5?"??, ????0!?N$???y!?B?3f"_?>? ?a4?͓??\A ??^????2????Q????4ZO,l&??>zR?CsO=:?e?x^?O??Q_ ?d???Om,?2ٮ+??}?}q?N?~ ?X?-1/Ԭ???????9?GB?????E-6̍????04/?????^??VѰ?D9?^q??.??N 8g?3?z?PT??xS?ϴ????r????C\???p?V?1"i?B?s?I??#?u?*??n3(? ++N??G!Dn?????'?{?L?a?7*y?k'?'f;??++?y[c?>?bG??&??+6?ڸ??W?????M????m???????MU?|??Q%E^4?d~){mJV?j???[????n????q??4n???B????nkm||ۗ??v?B??̘?K?jh???W?s\?SR??k庄A?????~??MA?0T\?C?>????u`?J?j?????Nj?\ƣ?R^ͳ?6??e???^?fj]??gkjpwtsc?!n7???\?w?g?n?9?t??fg??;?????5?j? G??????:?xwGoEa??8??)΄b??W?矬?:??}}?0i???C?>?+ ??/?V?7??'??~6a??ۮ?|W??۹&o?짼H?L>?h\??ojm???̥)?8??YS?S?\??*?뚳?ǖ?`? ?&Y ???? 9???O??\>??E?F?]岞?|??V????RY1m3*Ș?????sKW/[ۃ??)?žb֩C 7r??,?\?Wm?l???C)@a???_ {Q0_???????>????M}?h??aW??xΏ /W??? 8`Ͷ!?B,%ʅ?C__?Q>??0k?6???Y?1b?а?;?Z?????񏅰??Y??X_x???5????_!?˘?'?`F?[??;\?|r?/?G??Z??/d??M)gD?<#⯦ɲ??f?œ?B?p-?sFI:݄?ͺ?B1???0 Ƨ/ *?Wu?r????ˆӉ?^????[?>??????g)?2?]????jz??6?a??o?????q??2?l?i????S0?????*v?m?????B?&??s??-? a????*-v?^&S??????????j1?T??Żb3_(??a??ȧr?-???M=???$l^?YX?Xu?Bu-????L,??XW????׵?5??A?????q????dž??\t*?-??-,?!?'i???O?????"??@?O???;??p7?ofe\'i??JE5?-rM?k%5?u?????@Ps???w??u?????g????Ւeٖ?ŎWB??I ???YZ ??2С?-?i3t:??m??t??R&mi?PHZ??????8 N?8?ے??W??u?s?9???X???\?Z???k&3?tt??y>?v?{?9?j??? (?Gm<,t͟?R???B?e??l???Pa??Hɢ??965?Ԙ5|sW)?N???9v?????{??qlj&&ئU?Hc)c$?;?ŝm???y5l???k? Vs?>H????? ???0? ?=4 ++?;?v??1C?L?0?? ?4?=????γ???Axb??{????!??ʃ?X???5y?????6[LJ?`lQ)]?|?@??????| cu+Į???ރ?d???^???=??~th???t?7t????Ư???v ws?b ???k?T̗B?y?Q‰???y???0?tP?/?Ge>????IǛ??k?????2m㣝}???O??6}?Y??5?FR??q?@?\?4%?c????Bs????~?ewj+??zG?????{uj?=??q?q?o??p?i????QO???)???NR???_f+? ++?a?k?lچJ\B!?:t妜???$ӥU?g??\AN?C?gC~??g??7?S{???????03@????라u???nl{??ݣ?;?Rs5C??|+)??k???W?B??ГQ?J?R???[??0u?O?R^YC4??FS?????j????A?Ñ??_H3???????{??uƽ>bi?S}?e/?p.=??H??ڃ???'ЧC>??g8????????W?P?bS?=?.?,????\`?T#??Q?/?EaNQ? f?3L?K????dĢ+????????O?????;??h-??mQ7?ǽ?6?[?\RF?????E a??!???n?7)?T??˫???Ce?!?2?80?v?W?? *s??\б??^G 2??`?b???????AW?.?ߺ?·???\,?4??/??捠 F&???6 Z???? |??(e??????a??"?xX?zVi?Z??B!VӲM9??ã??e?ү?]oGp?>?i? ?Ew?u[i???YV:4LN????} ++??&#??7$z?w????.??W~?L????pe??BN?#?opo"???ͼ?3Ѭq~?????C???;?sU??Q?S?? [??l??>f-?Y???5ͅ;??>̤n2?q3]`???+??r.4?<&8??7???Ws(I$11?}?.??͟2?????Q?6¯? s?u??K????:ZT???8??U?F??B!V?ҙ-=?-?e?t???9I?NZ? Q|bR??? ;?G?ȷ Y??$?azH?4?0??ѷ??~??$?????b?x w??t???????p ++???tR??9?q??7D{??w^?8&-??]N"?"/;΁??????~??% oAu?0??????}c??䞞n???2?:?C????K9n??????;?c?|??.ǵ??=????y ߐ?-??"???2z??m?ˋw'ɡ???q)[?????p|!??Ks?QV?c?????????#????9cW Z?k?ة+r??6 ++?K!?XO?W???*??^?O???????^??J??`,?O?0S1tp???????g\>F???J??S??ep??@5? ??u7??4???S???K%???d̠?g.|???򀞚?ݑ)&+????ʕ?cxLG???!$5R؄34??S?.a??p /k????mĝ?3?ul ++;\?????5??0??M?w?q?S?????????p?a???$?gtz??E?ld?W???Fx?`??E*=?[z??????w??E?????jVB?iP>:?[?R?=&???<>?M#x??̴?|??Ĝq?????q3E?-? ?2:??|N????7Z?}b?Cv)?+]tٞœ?2???ux????EӤ??r?H??k??????.???+vY?<????3???)7?^?pl?w????i??犯??4M???????T???Q?6?`?b+?? u?3v????z ?L?w??0?.???Ʊ?m????B??B??_??f??W?e????_?ih?6?!? ++?L}#?)s0?i W5??k?c?????ݴU??R?w????U? u?????cC}<0?4??!?m???]18?c?????N?}?ش'? ^}ٹt????əK????-?tU5?B?K9vp?R??~ ???c???tT5p?b??7׹L???????h?-i?yKy????LY?!D?4/?nl????;.??Ό??i?>??Re???j???????%>=0??)O??w'??? ?????~WO????ˡlf?=?Cz? ?ah W6??a??X??57pʥ3?? 9!?BG?M9Wl???w?lh?in??????6?΄??o5?sf???=C]?7e???6??R??G?CLj?۸ot??d?{?>ȱ?!n?J??ù?&??Տ?V???o??x?\^???cU%??L?j?c_??rx9d?;:N?^????x?ԍ?T?jq?+?j?U???^>w??I??+?s???N???jN?I8}?w̽??s'92??QC??r\???D!??POF??????l??=eK?X?m(??$9???=C?ԥ F}^???wî?ozWfj}Y??*?Y?/?l?i??????N>{C??CIE??k??l???/?t?m%cB????w??ݭ|hd??? hL???I?N??ހ?Տ?آ0?g.-?=??51x?q/??6>??? ?z?t?:T?+_y?bW???j?i????^??h?v??o?e.???%?3}b???mϫ????>?1Ja?P72? ?$?i?qn?????l???????u9w !?b]?r9g?x{4?ti?K?0?H??(?|(D?ܛ׋??ГQ?J?R??????=?a?=???(O?]X????W?B(ϵg?b??8?=?/??/5W3??=???t?gៗ|ph?{????OM?K????dĢ+????????=?P??q?)ϒobd?]???.???s? ??gNsO???V3???)??{}??&)4?<>?|?-??j??Pjϋ_;[?? F?>pt?r^*??m???cw?Q??$?l=????}K&ms??6?|r???e??U?i?cT???? ?ABc??e{????3V? nz]???1A??????5????&?.??1??? #d??T??g5ǟ?y?B!?ZY?)????Q???J:??+h.:?j?(???X?_???ǵ:N???p4???????q?&g?F?l ????0?S?az]:F:I???^,??y/??v?λ ???ܓ??? (O?ؕ?y??p?7??????򾸛??3???9??r???yso/??aƝ$5v?g*|$U?R????&?~Dy???Y#E???r/V???w ++F_? ??????JS9W?r??T?T??z.?{Z-???LF? ?r*^?-N??E??j^??:?2?െR????t?? h??Yr?Њ???x??n.???=???Gc?h/?? N6?3??.??????????'??x????ɻR??t??v.o ?E;̡??B?sľ??$9c?<?:?IGU'*|$??R????t.????XG:.rD3??l?;F5???򹺶??əK????-?tU5?B?O??6*?kn?߽W?j?7??y??4[?Ejc?*sѨ? ?A?C?h?g??˙????g,7?0&u??4???f9?]??o?;e?^G!?*??hs???[Wwu???3{?'? ^???Y J?Y%.???&?.???]??????xɳ,v?Ù??wF????'t?A;̩?m>G?zM?'v QR?W?y????#?Q~ہ??絪.?d?Y???P9|???????.??.?\Z*ƛ{????}?P\?۔???:ְَL/}?u?m?"X_9B??c?B!??hnS.E??>w5'????M?挽X?Y:i?M?pWt??`0???{?s2?M?3?c???Yn??2?e?_ر??X?,?B!6?b??B!??.]?|U!?B!?Bq??-Q?k B!?B!?B?2ٔB!?B!?b?ɦ?(?4?"]??0?{??"6'??{;9:n? u=?|?&?#??'?T!?k ??Ì???'O??X??v?Y???؝?C?{????w~?^;[?Lt???O???ͷyYp?v?[??)n??n澼???? K?G??O??B!?@?=???0?z)??M?(v?}?cw??dk??o8?%??,?mW??_?۱???y?,?+g?Cw2F?c??Y??A?\??Zž>ڳB\ ??(w??q??4??ƴ'???:?`z? ?!8? ??/zb?~?????W???B?r?7??8o?&???i5V?DkMb??k&C>??b^???5F+???/N?W?LO???Q웩= !63>ħZ:??*???\t9??L??rH?u?6 ???&?4lk??^???N?t?^`?ȹ???6??y?|Y?n?C#?Ԥl@c?_?O?v?tȵ??Yi?R???????ڠT?`??qf8v? GJ??ǻC?cdz?ϝ?Hp?a?\?)`ceuڳ?<??/??*6Ú$#?⦮.??|??^????_,9NƱ??c)?K? ?3???D}~z\????B!?Xo2l??l??(??c??z.p???;?p?k????$4K??s??????'jm#?WʗfS31I?Y?7w?2?$?a??cZ?9 ?1J%v?1?Xc?J?6??}pU?g??s???0_(??2? ?$?i?qn?????l???8????7w !?b??r9g?x{4?ti?K.?r$S`?q>??5?p???=御-??????O?~?:?'?F)??ax?`w?WJ??->??w??I??????uO$?@?A?q?S??!??3???dp х??Noy/??\Ö-v{??ݣ?;?Rs5C??3?N?{?y??F.?w*????Ԥ?$?JHF,?!N?A>?aK?S ++u?W??,?&F?ؕ?y????????t8? p6??9??? IDAT{?;{??k?:?h???????J˓-v?zδ٢?y#肑I??j???9U?/.?|?Sh.???ei??v31?6\??f?D?Xm,??2??S???L?a?? ??~?ǰ???܉I?q?\Н???b?B?m??????#_W?}?r????v? ++c?Z?*??8c??B?6?|}е???f?9?1W;_\?P?~ïIr?????`?N?n!?B?/?6?lv?Rj??K?????w _?XF???>2????.??ך?h1544LN????}???MFf?,?@?]-?]?s]??e?tՏX??ع;N?#?opo"???ͼ?3Ѭq~???p??а5??7Ju??????}??W?S???V՜#???R)yA??_?K^;?o3? ??5?AR9NP?6fy?hl???m??S5????3?wU?M??_4?Ѧ?? ն?????+ G?-?j?T?]?c _x??g[??~@w??A??Y????????+?*6??$????86[g,???sSIƱ?Ǯ??[!????M??4??ZL?Uҙm_As?QVCGY O?????n>????^??0=Di?v)?-??????O`???D8΁I ?A ]???=? ++pɄ??G?(ߒ??H;΁???? ++?ly?)Ft2n??C?????g?ϋV???'G?W]?v?C?/???cr?t????餰 ?3???R??By4, ?S?a? ++ʅR?щk@z?&??Yʕ?m??n??0J???Q??f??jc???˰8 ????W94G?yO?b2?[?0??'?!z?????ǵ:N???p4???????q?&g?F?l ????0?S?az]:F:I???^,??y/??v?λ ???ܓ??? (O?ؕ?y??p?7??????򾸛??3???9??r???yso/??aƝ$5v?g*|$U?R????&?~Dy???Y#E???r/V???w ++F_? ??????JS9W?r??T?T??z.?{Z-???LF? ?r*f{??p?X??J?z~V??'&?e?g?%8?c??N??O??pJ?B?s??۱????7??[????dc=?X?DP%ybGc????]??p?}h?SP?M[e=/?{?4/?nl????;.??Ό??i?^???T?????B=k:?? ?? ?8hL???Ϧ<=?d6???r?R??~ ???c???tT5p??GR).?|-?M?Rm=??up??"G4??ʆ?cTs??/??k?n????]?܂IWU/T???i??????{?wu???V~?1?w?>M?5_?6?Aw????k ??˙????g,???c?08?c?????Npf?? ??W/??E??E[-M?@;?YiW?g??N????Q?]?m W???4??ԏ?PU?l?w?.???ٟMy??YV???3a??????O?\???S??N??7??$O?@??????pWO?G:???i??kU\??8??q̡r?"?s?{?w]8?]xy??A~????u7w !?b=???ot?}????O???r?_ܾ?.I??7g?Ų??PO ??׻?h???)+???uf=??Ip{?k|?l??=eK.?B?낌ckfS??B!?&??D/S???P??/*|?nS?Z??7g?Ų??0͎? ???????????0X???llJcqJ?lGkX??>???V??ʅB??s?B!?Gs?r)?????9??l?o??7g?Ų???I?mj???3??`%?޳???n????}?r?????-??Ž????u? !?BE1?n!?B\?._?*?B!?B!?????(?u!?B!?B!V?l? !?B!?B??dSN!DvN???vrtܒ ?jI ++??I?B!?0??"?˟??M|?ts=?]b?2v?N?81C:P?%?Z?tءt????g????f0? ???v??>]???????0????m?y(A????ZKz2Ÿ?n?~??&?S???i???OW????A??kx2?օ?NI ++??I?B!?Ȳ)gS?Z/???f{?+?g??Q^???5ߔӬ(????埛? ki??c??@??w2F?c??Y?P???l?s-ε?lW??_?۱???y?\?]a3?S!?Wb?;{??u|?R[c??du?o 0?օ?j??=?e???ā???+OEB!??eޔs??-? ???X??5?}?cw%??u\??????/"???hE3_??I?J?? ???s ε?4?!? N??z??g??U!?X f|?O?t??UƓ;j??r(??`???^??mÕM?i?&4??C??_? ?r??ydCN!?őqS?????靁% Zz?ۺ;?3:E? ?3???[????%?b?P? D?e9?M????????????6???:????0????D??TA?Jr???{?ƨMô??????ɰ????&yO?o??b[???\???_????;ؔ?r??????p????n?c????۹)??,W?kw?XU 1?=?ǧZ?ؗ???^쎎S?????&+uc+աZ\?ʣ?w{?N??su??I???*Q???j/Vy????7Nr?ܹ???p????1?????s??~T.?TͻR??$??;?gh???l???T????]??Sh?E????w??YI??Wf?|Y?n?C#?Ԥl@c?_?O?v?tȵ??Xi?Q?? ++?aq?g??1????]?S?9c>^`??[Ɇ??O?֡3ñ3g8R????"??s?.?~?/W{ ++?XY?6o*?_El?5IF??M]]??+?? ?6?p9?Xr??u+?R??^&gf???????.?~C??B!?X6?l???Pa??H???? =??????{8?5??Ij ??i?9???t????? ???s??4?WUlǦfb?mZ5?4?2F???]??v?????WS???x}?>??i%?y//?m????y??"N?]?]|??I?a ???IǛ??k?????2m㣝}???MW?CŸ??G)v?????'3}|??8gw????=?l?3?f?X??z.??k?M??1?r?~ ??Irs?y>pe#W?i???Υ?w?|?????g"?J?n????????<??J?XWC?*?w????B-??ˬ?/ͦfb???o?*e?Ip?P7?.??s????J?T??b??o?8??FM??k?%????!>?i???OW?W???)?c??2? ?$?i?qn?????l?;?X?c?Ɲ߅B?Z?\??1?M2]ZE?????e??h??w??EG??(? %h??̿T?}j???)>94Jye ???C?Rfh??x???NZ??׍?x?{"Ij??s?ž?0Ξ?ho?'?[?.??uz˫x!??:?l??S???ɗ?????A?p?ܳ??K>84r??SI??w??&?%A?PB2b?qZ??? [?ОR?Cո??g?FGּ??{}??&)4?<>?|ٮg\iyTΥp?f0????3????9]8>K??? ȗ?6=?8?(wG?D??j??????A???????i?R??8GG!?%V?OU?O%&???sA?ܗ*?|?Ե?u?fm>?1??6?6??$?|???n ƺ 4? !?b?,۔??9??U?y9G? 6??$G???D ???Ϟ?]?d????u???]w??B!օ%K9?L?S.~UY?a?O???ś?-~S?M??eh ???O???|???/ ??????i??q-Mi???ǵ:N???p4???????q?&g?F?l ????0?S?az]:F:I???^,??y/??v?λ ???ܓ??? (O???J????????[?0?N?;?3>??l???0}7 ?s4b??+M?\?-??ν?J??:???I{*x*??=?=??W?[&#섅?4??3??? 2???M?)ʝ ϖ{?T????J\?V?O??]???L?s?`???-???38?PΈb5??+?xX???vW?DU???SN? z?R??AAO?ܰ??Rj.?U??t???^????S?????&?=??:yW ++ޙ?????1w-?|J?r!????}??IrƮyxnG-?????o?9^SA?[ß??9????L?XW???Lũ?lB?ٞY??.?3??2???u;? !?b=X?)?f??W?e???c??b?%ޛ?]?\~??4??? g1?P?????96???i@c????N?^??t.?s;??5????xKb?R?l??sO9S?'v4???x?5?Gۇf??ݴU??R?K????FJ?z??????̸????<?Hu?\?|??r?R??~ ???c???tT5pBuS?h?S????yr?wt?r &]U ?P??R?)?Z??Υt????????o?1??.܃i????,??Rm=??up??"G4??ʆ??)RT? ??O?:nZ???vn?Ү??7??2W???/???h????[Wwu???3{?'? ^????h??1?:??j???????%>=0??)O???9T_??{.???? g? /O8?U??n?w!?B?ڛ???????????4W????7?eK???]?:?=1_?f??F????o??NƸ?S.????Ƈ?&?S???^!??0d?[3u~B!?ezK??7??S???B??O?ľ9cW???'͎? ???????????00?6??8?N??5,?K?{5????ʅBQ,Ř߅Bq=?۔K?8??˜????h?K?8)_ 3?(X????+?NڳB??S-?w????Z.??f&?c9?׺p??pe? ???P/?Ws?\:cِB!Dqdܔs?F?9apzg`???????N??NQn?L?+?Vs=g?_ɱ?3??}QvYi??+5;x?:Ĥ`q????F??N?1??'?3u??1?%m,w??C???T?%?????J??Ju?W??(?ݞ????x?\E9w?#s?J????BċU?e??????:w???C<\?%?p????'?۩??!?ă{?2l???i???Υ?w?|9I?wr??(u??:?x?n7? ?f? ??~T(?A??v???E6$42MM?4&?e??n'O?\ o???(?1A!_??AK?xGO;w OQ?h??|x???u}S??y?Ǚ?ؙ3)????H???S n?̗?=l??N{6???|?]m ?b3?I2r,n??b?^?Woh???????Œ?d[?8?2???093??N????u?????.?B??#æ?Ͷ?*?R)1??????G=?f/W3? ?=4 ++?;?v??1C?L?0????bw(i???Gq?????60?>??Ŷm?p?v7Ϻ]?I?k???t^ ?;̣Ú??ٻ??H????ߪ??7??mF??H?c??8??,?v??$p???'???99<$??CNNN??B?j?8????`?ml?-?4?4?ז?Ջz???EK#͌?]???ь~?s|?G*ս?{???u?V{rN????? ??m??x??ԎY8?-?,????M)ĸ5n0??J?:/!?v???cWg?.?B????ᜑ? ??5 ?s?m????d ??һ?N??B?E?g6K?!?Y?t?????QR[????Ǝ/?I???.? IDATn????pS"?O\ ?i??1?z??-݅? ?????D?G??DΎ?U&jx&P???b7????u?g{??]??Au?[???3n88??d?ϵ?S?1??cxɅ?????~?IѨ?P?BZ??L~?Y??n???\nҺF???ͤ{???\l~??ea?Ƽ? ???zY?Z?g?_?|?????A?|?????????Z?V??og?r?X9-]????r?8?Y:? ze??'????@??yZ?q?E??Vږ?u[?:]n]?~z?R@_????n j!vkuj???ӆGr~/Z`?}/??\lGz?6?O?=?i???V>??x????P??c+?dZ>M-*#??n YϏ?c?:O???]!????r?t??G???=f?[/???/G?s???_ݤ??l?v??5?_:o?? ?5 ??bN???? ++?rd??b??઻ˊ?Wv?'h2?T8?]/v[.?????.1?Q?qn?-????݆ӄyݼ?K^K?PSs??7Z??????z**?K?j?.?Z??S?P?|?l?6?<t]?h????????9Zs?Gt?Kp?Zq1粕?ex???? ?n^ ++???H?&????حթ???N??&h??S~ǖ|wU???~?????lc?_^???p `)?k~LRJ??H;vڱ??B!?frޤ?A?\?-į=??r?F??@?΅y^?????i??m?K????4????G??b1U?y?uF?JqP??w??Z??????O,????R?3?m'?;??m{xɭ??c????5?@?P? .>,????t?UQq?T?ZUW?NϪ?|J?r?z?R>?i?? T????9x~|.<?w?Zq????y^?N?a*?\X?v?Z?V??m?ً̭?9? ++ڱr?c?y?7$???\z???? ?V\?c???nb???????JҎ]?v???߅B?y?;)?/rK4O??1?s????/?u?????R?K{?R>?Ҳ?B???: L???Ӽ_i?E?Ic"L?}O??<???yj?8??s?B?]?﷔?)?=???Th?NpW????j????:?R_?i? G6L򙩓??????N??!??˙W% 穥?Q???b?N???p`???"??-x???3??6?J?%X:?+??S*?k|LR2v??S?[y??I>}B???: ++?l?=9??IJ;V?vL+dh?r?3?6??????r??Z???B!?f?jRNg??>{O??u??A?}Sg??P??????? g?q?}/????I>8? ++???9j?AKii߾?/i??3=?ktH?jx???.}?̺2??0װ??ۧ?s*?????]P??`}'?պ?+.???;:??Ϝ?n@%????R+?"V???r~??^dj5?{g#??Ӡh 7????I???O%TF[v?H? o?4Fv?L????:??O??,???J?(??كgt???M(,?]g??T?"u%?"?!??#??Bq?S?#++??Ƭ??????k?}-F?w???m??7Yh?ǟn?|???d?%?BXQ??]!?W???W?B!?B!????A??!?B!?Bq?ɤ?B!?B!???Lʉʙ?01??X??:?.g\?j ++!.$绸Z\?cUgGx?{?q\???B!??u?\Zz??z?y>?P`??bv??Mjb?|??E???s|?????nOW$???e?B?????].#?-S3ܘ1.??qY????Ťu??]?1??m?b\?c?,?5;?[c?寐 !?B\???4G?hRk??_?b?b_?v%???????w?St?? W??X??4? Dx??C?Ѯ?K??|??گw!??Q ++ |??47??zEEc?W?????һy?J??p??? ++?h?!? ++?Dkպ.?׾?o?h?F??E;}~?}?9Z??ߌE#?B?-m?I9{z??em?v?H????/r??wD??*qO=_??ɱ?=?y?gG?g:Ž???yx?y;?j ++?P????"M9 ?8?tr?3:6 o??lk?i??>[in?]sIB?‚ۍ ?_Un??S???J??JZ??J??S???Lq??c????? ?У|??i????&g+z jc3?95???,n99޼??o񐇲??#5ɟ L?7g?w?x!`cg$F???睻?N???6??????? ++c?R?N7?^&>N?M??2›?y?l(??f???w???Ƿ??)??/s??? ?0??`j????=gP??x?????{???պe~?VW3_?f???Yޔj??ޕ????*?7???ZMl?1IG?j#8̕?f?? ,.Ў?,M?(z?<0eg??鳓?*?M?Ӿ?6??????$??~?^.??????U+ 7S??a??~;?'h0????? 0h?D zZx?Q??\M-3an?lc?Sݥi??G!Z?ĩ?3ܼ???f'??͊??6??9?Bqy?7)g?1?F ?kυ?ǜ??<?sa????qx`?w{[???v?5??#;???y+xLUc^??GJq@??w??Z???????M?ث??<_X>Uaf?m?wg????1?A?|ln???F?"???NN???5!?Bl!??En?扇?Yo.D?3jf8?̃?)???}?>??"? ++2N?݋&????_?_2??D??eѼ?QȰ?????Jo?Z??"U;Ϧ?R?op?od؟???m<\?4H? ̫?L?\&??/???[yK???????&???i???jׅbE??4"83i?f?L???@b?ߎ??55qܾ??n?qF???E??m\s?W??N&??G_]???;+?M?????u??I,Ğu??t;?l?ŏ?????N? ??M?.zCL0?k?9~?????S??ƙ?&?? ?yLw???eX?.?l??~޵???????ɓ|8????t???Y.;?Zꉟ???quI8?QÂ,_B!??s?A?T?? v~S?]c???{b???'Iՠ6?$?Œ]-ޭw????I?t?????Y????S?ɱj??????ZZ4L???S|Hi???d??8?3~???h??ұW???&?uW=?Q;??=J;ϹL?͍??E?????Y}l??و??'xG??/??˰\]???Zl>???arՍ?x?}0??\3??*͆UP>Yo3?q?r??0?+?o??Ω0??f?+?T????{?=????z??\??r웍ԅB!?AZf?/?????߯?'?Bq?Q?#++?@d?vyst?]??_?y?8J?,???X|?:?Yk"??H?Y?e)W??;????&? ???ϵ???r???????s?M?L /Ԓ?U?;9~?B!.??'?l???cmd70x??]??_?yB!?UG?????dn؆?M?y?u?????"???d???0ȿ???I??n?u{?????d???B!?ظ5'??P??F?W^?տp???a?????*z$??#?H/?????.????7??6"/??M@)?~??)???c?F?O??mD?????s??}1?N0"A?ϵ]??"????m[??/??6???f?e????n?j??????p???)D???? 2?U7.+?Xɳ??= 4???`1?梇ţۈwc???>F????????wv? 4?????',??О???1B݋?T=?D?y?\??Z??? ?s7????ҟ?C?{?_,?r?B? 1Ѷ?Rs?s?K??mDO?V??r?)?o筶?V??r}??~????????Jaw??>WL+>n??/?g??ce?a?w? ?!?%3o?z???????????Z?????NH?:i?{????L??ma PA?H?+?B?!kL??wG?r??y?????3??t??.R 6p????U??t??? ++?g:??m??f??i???uL?;@1??%p???W]????A?mC???ClA????? ?iܫ??\?8????4??0?Q̻?I???m???B?)(?Jt???z??j?k?z?????8uo ? ++?(cf?Ⲳ??<[?=?&??v?vL ++8{&??? ??u?πӠ6???N?k????̡??M[??????4?;4??v?7????=o???Q??!?P???oK???."Ky?:V.f??G!*fb????1??zb???K?(???R?a??jDr??es!Dlb??]1????riI?+?Bq?]8)?e???c?ԝ???O???̸?lJW!?b?Νɱ???(?Ւ]ﮯ??j$??n?h%?0K]O??B瘟<\?&z?E~?q??;?%???jϭ???r?? ++??????D?f?C??7?*?s???,??q?N?Q??t?Ĩ{}???/a????L ++gj???J?+?Bqŝ?RNm??qi,?t?1??q?8?7?#=??? l-??Pȧ??????fh>8@??????0??C???V????"z|???Po??1qtOQ???QM??w)?????CԚͤ&??y????j?ei??y???$???i??d?*?R?V??L??ב#????I<??,i)jn????????? ??0K??N:?`?5M(dc?????V0N(Y>??7?ĵ,?!??Z|w????V??/?5)?M*??8?gq&??~yi? }?B!??jȤ?莡?B$#k,PLT%??U???!??v?~?????ņ?̑=L'&???C}?(1???:,?ح???nf3????u?? ?_?,T?%?2???ۅz?8???W?????X??????-?? ++?I?'??7Ox?!????&[?45rS??Oh`B????4?H%?l#??fR????x?xgĽ$?_????e??'?ix???????? yڅY?~??2?‰L?g ]!????r?????m,?VV?.??!x? 6?N?ڍ????R?=G?;€?>$?h???v?J???Rm??F??}.?w??9?????:7xL??1?3?%???C???T????S?~?ĵ?1?L,????????B??e]?W??? -?3?&}z?/֑[?r???B!?W??*O?i??G????:????=[k???aZ?p??}LWt?P%[????*????z???G??B!???????J9?i??N???,א??8z?p?]?S*83xM??? ?\??o??2????l??B?L;?/??b pdq???L??yu?????B!?B? -M??8{???z?ѭv?`!v???5B?? 60m?C????b?R| ??MT_Z???x??D?&???[?Z;K??ϣ?????<,??!?B!Ė????B!?B!???S?#l?eqB!?B!?B\q2)'?B!?B!?e&?r?43??????}Q;?????EUʚ? o??p,/'?W i?B!?%&??????||???t5?~1yV?,???,??6r??D??????,?5;?[c??O???g??ej?3F??]q?\??P??Ҥ|J??B!??4ֹ0h??Ѥ????ž?y5?~qy????o ? ???v?LC??%?.??!?{i??|?????M??^Zј???x{;??Vw???|?? ??o?????6?Pk#???'ǏB!ĥ?ᵑ,?`'?]ծ?د?< !?[?Y?>g2????jl8?)^=5??O?1???Kg?&??@s?`???o??.???!?W,?{?sB?? !?Bl ++k???y^?????#??犾ȭc#?IRk??=?|}O'ǖ?d??????;?&??????|?)@B?s`l?{??4?t4 ? ?D{'??*J+ǡ?a??]?U?Ew???w?Hб??B?ߚ???x??l? `?t?^???}v?r?c?885?]?Q? ?}D?>?k????v?*?e)v+?U.v#?{?s?R?n;???N??q>7???m]|?c#?????|?v?/681L??x?6??otհ@???Q?~?R,?U???~>V?M?.????sc?y????[??(?-筳Q??ο??Y?)hz?k? ??b?????ax?u'???_??C3??<?jqY??J?-Įzy???MM??31?vv?????ACs?\?e????f(4u???N??*?M???U??15?G?????%???`???p?0??K_?t??F??s??"?g????Q0xm<ϳZ??f??"G6Av??;J^??/???%?Vc?%?]???Z??? ++њ&N?????,?7;?'hV???WbE?y?a?2?c?X?s?h?.?7Hu?R???D?4 D-???'T{??c?%?yx?6??????U??ҧX,h?/?B!???&? :???h!~??p??s5??Bt.????9L?no _??N??????qdg7?:?N??j̯~l?Jq?a??ʥ?????iß/[?v?4Q?B?#ˍ?e5?r?UU?z??????A???????? (?"23?6p???A޶???J>? ?\?uU??j?????Ǽg[z????G?Mn????ρ?????2??1n? ??[? e?????????ijl?-????䔥?????ڎU??>??~p?L???J??j?????????2;?G#c?U??%?S ??y?????ҲD? !?B? ;w??/rK4O??s?s?g?.?ڱ?<}??X????^[e r ?lč {??#???K???8??s?????I? ??????e??8??J?U'\&?,dyyW ??Ͻ?|8?mNˏD?:l??3S'??????? B??H??2,*Y??G?-????mA^32??O?x?>Ȅ]Ŧ??3?>???0?S?{F?ϩ??ழ??w?2o1?J? %˧?񆕸??6??^?-?G??????0?ԧ,gɓYdGR?&??['???h?o??ލ+??B!??jRNg??>{O??_??A?}Sg??Py???????K??q?}/????I>8? ++???9j??Kii߾?/i??3=?ktH?jx???V?%?2?+??كgt???M(,?]gߏc9-+qY??B?+`j5?{g#??Ӡh 7???Zk???:??????Ì???KV?RTf?~‘>tzP?{B????o??Ω0??fq??;ynդ??'?j????6s̾z7??*?c??k?f? (N???1???:?????ּ?n??Dg? ?1?Y?޽?uZ!?B!?1jde??'????I?wͯ?c???e??ʹ݆RH???q?? _?U??f?l??2?Ig?1?+???bҡ^?rZ?f??fˏb?=CgFG-$?ut?@??_?jf!?B!ĵiiR?@??nGG\[???B??N[r?wER?L??z??{?۫?(?e????4?8???J?m?q?}???ly?l?Bl?#=?GO??Cc???/n?݄B!?b?[y|U!?B!?Bqɩ??ڲ8!?B!?B!?8??B!?B!??2?I9Q????? ?????y???? #???Q???????EW:+B!?B?+f??o-=?_=?<_(???Q}5?~1yV?,???,??mO??D??????? ??????????Yg[o|??~?y?0q?/jK??5?Hs?? 7f?*?B? ??f?yk,?? ?KL??Ҥ|J??B!??4ֹ0h??Ѥ??????]??_\???i????u?8?]?iH??+??8??k??-9????M?j?/?ogxy?%5?g{ٞ3(?}e?#?U?|;fj~?x??b1?ڽL)???ТA?_ô ++g?S4U?:yȥ?????xl?JȎi??z?|?6?B?k??R????Z3_?QC??r??w??'ؽ?o?m?w y?T>??:?T9?a???R?W=????X$BS?? E?y!?B?+??I9#?"9k:g??ė+?-??@???A??U[????f???vkySs~/Z`?}/???Bz?6?O?{_m???$M8x%䶵????e???Թ?f??ʬ?@?!????m??h??E??f? ++?#?r?÷?Z????ޙ???h?qh?,? ++?u??3????4 ++&o?)???{??\/t?fi??K??J??S????V??c ++????q?t??]R?4*???sG???\??Y??f/3?])???UrP??????????gh0?H??+5O??|c??????????;7 IDATx??????EX???fCK?B!???.Z?3i?&?????{? 3???ۇ´N?x{,?ў >??Ʒڛ?? t???Ǐ.?%?Rub˷?/,?w??Z??Eg??ח??bY?@??????e7?R?UQ?Z~?????^??v?DP/????+0;_?;P???[??r????B?{I???????2???H??? ?????????6uCZ??S??4??u ?f&yw??c?a?yw?Q ++Hf?n_?Y?n??q!6:?y???m??d#?53??)讫bz??$3??3,O?????X??\,???|pd?? ++6?d???-?+Ͳʩ?z?S^????9݌y|?ڼ?? ?????G\@??x???Tu5????촏?y!?B?˷?w{??7??ַ?C? ?G??I??u?RM?gS?Q?t??w8??׆1?|?_6??Y???bP?͓7p?i??m{e=^7???? ??c???f??|o????س^솫?g??||????l?5?E??-?? ? ++?e???u.G??gT???Q?4C$? ?m?2?#ĆWF????'??? t\?+??Nj̘Y?O??{Y'??o~??6X?5斳?g?y? ?,?; ?_l?_Z??8?48?R?O??Ɖ=??l?^????b@?]??m??9??Sn??_?d??x?;~?????9:=6G?sv?~??1?"?|f?Ү/?~m?g޺?S?y?????c????y_O?9?X~??@???$???f?a?g?N? ,?????X%?\@qq:??qx#?????`?D??*X??hm??ë,nV????O?ۉk?t????????)??h$R??@ՙt??:??????ٚ]|m[?c??y!?B??N???f????H?'???[{????Un??Zp??? ???03{n???˸ y??r !?5@ώ??3S????ye/?mV??t??????̾??? ++!?B?ɨ???;弩)?7??Pɻ??c7?9a??a¡?3?09B?????ܡT9??L?2Y???ZA???s?W??????F??[?bdi????%n??o?nf!?B!?洰(W?-:????1?V?x??eД?qo|?? ???};8???-i?????Ο?=?:??dA]!?B!?k^??Q??? >3]d?=??Z?]1s?O'?]??wi??):q????J????k?}?bC03?9>??YSr?B!??}???4ƣ4?U<й?%?kյ?#3=q^??0}z??z?#????? ++????=?>?f?8r ??w?i?L??+?f???.?vo?E??i??H梿?y??!~???b!??*??B!6????,o??ȄZ????]m[)vE'???????j??ѳ>?9?G??wn??a??a_?¸"?_?B????#d??勣???{8?P?v?ŊB?k??qB!??Ū?r?L??r?Z??-??b?y?? ??ST?*3?Z????Ӌg? ++?? ??D?] C??Z?Ni2?84???4 yȺB????'?.?e??????G??n@??g?-<r.??8˻?&?u&ES?????n??_5z.?~???\?>?D???㥎?|׿? ++f?7????=<恝?a???$?? ???Z?f?+??ڝ|??ô??E4?j??5b?U???I?k?Vz?>??????rܔ?Q ??{?7L?DZ??y?? K?]?!>Sw?O???E?_???G)&y׌?????YcCt%???>]?VH?7????VF?{ypJ㙶&??|tp?????? B?????V??????ί??8?6ٖ????wV?E8???O`x?5SC/????J?^;?p?N?Tm?y[㩭??s??'c?B!ĵ??%3???8?gb?!?a???SAڙ???t???? ??hu/K?G]3??u?N}A^ (|2g[??A?l?۳*????^???Sծ ??y???y:Ry4????C??)??ry???j?/ʝ???>z!C5*?~????/?}?.?a_????O?9??P|?zz?\`BlY%򳕏??"#????F7p*?qx??@??b?8:???o?/?6Y%??ɽ??????1??m??Ŋ?;?c ?I?4??B!6?K?d??7tN????@^?ѹ??W?𧿉3??XM? y?,L4?$͖???u??щY??.???? ++?0m???ΰ? ++-?uYq?F????, f=?2??k?^?κ??88]"???l?^h?E???|o?K?? w??????E??C?eA̰l???r?b=??O?b\?????vPK????#??[K?????Ҁ???+??O˧h/?`m5Sk?s;?w`????5????WI???lE???$#c?B!ĆuѢ?IK4A????Kg?yw=?>?u:??cQ??L??6???L???X??sl?>~tѝ[??SYc?F??xY??J???ɋ?tٯK]?v;u?S?t??״s?65??-???I?4.?4??r????B?????$?$c?B!?F?r?j??3Q`&\??Z?R???p#????v0???S94 ?1B???E??al???.??3?ʱnYA?(Б?-?,ZY??`??E';???n},??O?\????mE/???.?????D?v?TM?~??>?o?E4KQ)b0.?????BA?"??hKp??&?ٷ??Պ?We?m|귮??%????upe36ą?⪲???? ?8?̬?O??-??I>82?u???}:?DԬq?rs?????1???k?~?f??؉?&??B!6?S4??7??ַ???? ?G??I??u?RM?gS?Q?t????;??׆1?|?_6??Y???bP?͓7p?i??X{e=^7???? ??c???f??|o5?2?]?????Ge?????A>6?Pǖ??Zu???C?1?㭧˩?? o{[???3??s??(w?!?V?F??/j?gF??'??t孬?p?Į?9ڧ?.Z??y5??C'?????] ?6>?????p??$7g???? ??WO???4ΫV9!Ė?F???$c?B!DŬ?(g??ҠV?B@???|?U?N???? ??????t???yh?>?q???%??L ??8ɇ????v ?????i3?:וd??g??L2??Q!???d?B!?? ++?????'K??c?jWG!?شd?B!???.?921n?i?j???X)F?w rO??WuP q>????Y (8?????G?|d?Y>~?,w,|?? ?,?-???????????ݰ?F}J?(F?;F??7?"l)L{?# ?? ???ͻy,???wR ++!*?9 ++k??N?戯????0|?d7???j? ?v?L????7??T`i.?6??7ۼ???????=c?ϛ?~^ j??'?S}?????!ʸpBl??Q?c???_?X??j 0??? 9???'u.n?????ۊ^~P???????Dw?T?w??[???u??JS?qy??/جs;??C?\!?B?kÊE9??7??ַ?Π}t??? ?^)դz6E?I?:?k???m??'??e???UyI*U?6b7?5??Q>:?????8K?Y?B!?B!??-&?rB!ĕ????2BUs?j?D!?B???k? %vʹ?BlZ??Q?\?]?")?B!??\??p?I?(?Ol?E?k'v?:B??I??????2UL=?EU ??????????qCM?f/:?M??}$???iB!DeȘ+?B?Y??(?e???0??????]m[)vS????᲻?j??Q(???萉?:H??0???2*??8B!*G?\!?B??b?E9%???ȼ?[???9G??B???u?R1?a?O? ?[8F-?>8J??i\^ +?a?T???1,@)??m???9~0g?^?A?߹???VYy?7?>???3b?xɡe?q? ??ה?(???Wڙ????mD??n??%???????R?k??????Y8o>???n"???\?NS??xC?eYi/??;???`Z?????=??????????0?\`?????2??ݰ?. ++Y0k??*&8J?=???]?va?,?????WHo!??q???F?Q????+?Y??p????n????*?$V?????:???1^M?ij;?2?]?X??ݓ??Nnqb???:??ٴ?"??Q???Ê]7??W???a3??4?%??=L?~?9?l?E???n??x?p?L?x?????H?????j?1Iz??????]?????N7??tR????1q4?W_??Xhml?+?5VK??~?s*????\?J?Mv?s?N/??m??vl?9???1W!???p颜?ſ??9XC~??M ?o@?Mv?OnN????KP}(O????v/?j>??mg?۟D?W?t?@:????]?????G?m+??v?+˟ ??@?D???]ΌzP>x??[?I??P\???B_ ??/?]3vu?S????q??]?8?{??TM??d^Yv???"?{?? ????~?? ++(?.,T??ӥa?`̺($.??N_?z?C??S?Fa?G??b]W$??'S?c?ep8??ۅ?׾R?9??j?A?????4ʌix??W?u??U?'Q'?y?v??ncl??????`㘜??8?X?u?vl?9ɛ&c?B!?Fwɢ?R??ՙ;???-??c???3L?G???ä?אr_ز??fq(???????NZOS???/:ى}??ڭO?G???m ++_[??C??g?m??(?i"? ???????aa?9V?O}?8a׍?/??d????h+C?i'???_h9PBم?_ !?b#?/?^OKn?u??r???}??ۦp{W??֜?\??f??8O?c?????1?׉}??M:'???j˘+?B?a??SN???u뤻?Ӛ\$!?.[?Y#???L΍>0B????(s?G?B+#?N2?N????? ? ++?s??D?'????[?A?k?^7?Uɱ?? ++??^??zNR"vs?B!6 ?o?e???,u??}~/#??n???V??i!?B!?B??Q;?K?VԆ???y??[t?ʱ?!?#?B!?BQY ?r???T?Tb?=?w+?n???B!?B!D?-m_B!?B!?B\q+?? ++!?B!?B!??('?B!?B!?[L???ce?}t??ɂ|???亍C?B!?Bl k?I??(y???.???5????3G?t????{'??????yx???^??X???????y???Ͷ?B??r?X??B?!?B?H_??&??( j?t?ִ?ډݑ??8?^w?>??? ????pZn???{?Z?}3??c??;??р?;?/????j7??k??y?m(????qG!?B\?V_????-?#j?G{?kt?m????G+G??>?Uۧ???N?;y~?>???Esl??uR???zqS!ĵF?!?Bq?[uQΑ?q[N?T???eW?4???x?j@e?[?w??rz?LV?}?!????`a?^^k??# Af???{y ??!o?YW?_4??D?E???????4? H{??????CΥ?gy???Τh?p[?????Fυ?֏?^?K?'??⛽s??q???W?L?G??kn?}x????|?????Pp?ye{ ??????|??Y?X(???Y8[.?? ????[?}?l??bEzZ???\??y?2??#?Q? mcB??p?H??FS?-?i?7[^@?6t΍?ٞ1??M ++N??5vǓԩ>?om??*'???m?a???Q???S????+;| wg?9ɟ?????;? ?i?????u???>?_??$`$???n;?????T''?o<???\?ml?o?y)@E??n;???m??%ȸ#??B!?f?ʢ?IS,F?V??>m??????#q϶???[C1?4?&.f?6r?/GT^??ƿx5B3|d??Ok???:?e?83C????mUL??cr?{z?I<݊Ͳ?\7????~ݼ??)-?J/?'28? i+?M????z??|۾?????Ã??{??_???????1?З???}<噟???k??N_??uY?}|?i?????s霊?S5^J???? ??Mg?XB?W?mw?lKFxf??K??VH?7????VF?{ypJ㙶&??|tp??????6b?Ն6??z?c^?O?$5?>???p8m? T1!FBl*%??e'?U?E8???O`x?5SC/????*?W?l?^㲭??4wd?B!?? .]?33?ϓ?????M ?Z??`???Ĺ{?j>??????n??D????I?$??m$?x?3?kU!??N???7?u??O?NL?e}p*???C???o???3?9:??@=? s{???:^?؏?f??댝?8??P?d"ζ&?*???gUN7??P]??]???????t??h~7*I????SD!??0?Y9 ????-?j?X?sP\L?x6?B???H????j???D?????c?8?8G??E;??n?e????Gqp???1??1?V??3\WP? {/\d !6???ʗ?uc?8:???o?/?6Y%?W*???8??hc\?غs?RdܑqG!?bs?dQΙ??????Z??? 4:w??????7qµ????!??9?#??ٲp???w?/:?#K?bՅ SwU??`?????????W?ew?)n?:8??'^?3?֎?t?u[?qp?.D?7?m?&???R???޲?&??????9j???˂?a?~[????z?i?K>???/?kn˲ӧ???P??????}m ++????q?t??]R?4*??o??!?W*?;l??J??)ڋ0X[??9?Ry???WY??tP2?!?B????E9??h?*=?/???h???|?P???o?E9?3?|??V{3???b??α????E??Z?NL??g????yٿ+U??'/:?e?F׏?N???'l?5??M???f???y5?K/M???9???O???????{? ????(?Zr?`?+Z?-???/?GG????0?W?F???SSQ.???|??3!? ?|:?????x????5?m,??F???K?: P-????w??I?l^-???????????qG?!?B??`???Hsg??L??֥?F6?????3J??e?ӻ?6\? ???ߚ?߮???zmh????j?9??75)?n?b?bwE!6??N????l??"?n???F?ݤř??:?6~?t?-????~?;?*?W?S?qy??eܑqG!?b3X1?t?Mqc???U&??????d?C?)v?g8?LF!?P??wV?? .j'????q??Nr0??? n̗3??W??uN?????7LG?????:?yS5?2'???^???? ?5?g???`+??c?l???rC}t??$f؝N?'?^x?JE??Q????Q??Nr(1?{b???:?^?'y_4? ?)??gq?l?]????i?ᏣI?S??5x??u?7?2??????:'u?]|v$?M?$??g _V?? ???׆???????]?&ȿ??H???F~???P???aeF??h??33J?R?Z?f???r???y,?27i~?l ++a?????Kph&? ?)?,??J????xY??.㎌;B!??;? vE??;jxi?[&N ++?????????r???Gj?????|?9?}?1>5??;ȳ?zN?ݨc?,??;??-}?&z?ŀ?????Zy2X?3UJ?n?????Z~P=?b?7U1??4?????? ??޾s?o??9??r?+??Xz?o???Ó|?g???=???/?/T????\f?#?Qtk?p?ڽ???T?8x?u???c??uqĄ?+??v??D??E??ٝ??k?? ?? k?>?/?Յc*է?c_? ˠ?y?????ġ??ӎ?B\cl?g;?N!R???????H????[????K]???C.??7??5\!Z??C? ???hd??-?Iom?B??XYJ??Z7vwd?B!???)7x?,s5I??T{k??km?٤?r?vH?آg????)N]w?Ǽ~??Bqw?B!?]jg|?N9oj?? '/??K?&??c?C?gm???5k?S?kh?`??_?ݖB!??d?B!??<労E??88??j????>?qf??Թ)j??i?;??ȃ??B\!2?!?BlK?W?B!?B!?W??Gn}B!?B!??-&?rB!?B!?B??dQNT??!>2??y??"??????A?& 2? ++!?B!.X??@ό??'N???"[????J슙?}:???uY?W?S??]?[>???ZC3???ͰB!??X}Q????x?L???-??ն?bWt"?q?{??R?!??b??[?4u𝐆?0?o?row?????_???ϑF?/??&??0_mp?q??Iur???#ܘ??,????v?f??bH??????=c?ϛ?~^ j??'?S}R@??G!}?O??4n?2??l??B?Ŭ2?1i?ŨѪxا??????|$??ٖ}?tk(F?Ɯ?ą? ?F????ʋ;???Fhf???t?i?z?Q?´LgfhRx???i?tLqOo7Ƀ??[?YV???:?ܔ¯????vF??????ރ?Sp~k?V???Hjw??fӚ?n?ܫM?׈?V?K?'寥[???D??G??qS"G1?????05Ƕ??E??,EvE????y????GR:??????f[z??j??~??8?? ??XO? ??n???????̲??屾?????????N??? ???0?b???8?j?u?[`M??????NЬ??j`)?9??E??(?8(??'?B????rv?{?er - ?Z9???b\?D?dT??+?P?I?)q??_lZ?T?2-T?vQ???@???8???x%bp_"C??J?????u???*??-Q? ?)v2????Z?/?xi?j.???qޚ??\q(^????}????}P????4F?w?߻B???qB!?k?")g?c.E??ǁ?W?e_+??-F?|??J?qߥ)n??}]??t???˷?8???: ?~]?R?????j????+?tͯݸ?nbvO.?΋?y????h????ʤ?ڗ_??9v?<??<ֽ???:????/???6???.????Hp???m?oX???????v^k̎R-l?????h!?5?c|Vk?E?:?O?l???N?ϕ ++???H?m?M?????i-??????3??!?????T??X?8?^????Dɨ:i????9N!?b??+5+ǛS& ?fF?˻(ñv??{?????:?Bl>???i?-|z??t??A؋Y?????k ++????p\??v%C\}˫??}#??o?B|zGh9????Vg??F????:g ++9_??DZ9??FWe???~????<<5?]| k??~??7Fy`f?OL9?B??Y?RbAa????,? 3???T?gYo??+????Q/oI?+?+?Щ0???g?)御???????1|3??Z6????~K?I6????$ x??9??8?J????f?w1?{?\W?9N!?b-???^?>?V?_9u?=????`??u?̶r?ݸ?G-M???????,??_DkpJ????|@??{?N+?B!?B?-K=?\?R.??????)?g=o[??n?|?c?}v?ݚ?)CC??}z?.5?_?4?F!?B!???Ť\?޹y??6?????͛?V??7a?8???O? 93?f????? y{?B!?B!^{˷? ++!?B!?B!?;?l????'!?B!?B!n??B!?B!??????;gG??T?k?B??8Ep_ڔIW!?Bqٺ??B?????|b??V{4??Rw?.?7?bW???'??g???'??ҟ ).>wU?8zg?x{???:?????]!n?'?9Z?_?s???9W!???X'?bӞ??Mm??a????y?n????$/?? ^?W=ۈ???x?{/?nw?z]?ϫ??Bq3R*)>~?G?K3?F"婎?<?`]?27?sM?0p???J???/zB?????Z#,?-?B????rN?7&K?=\?npD???TwEgƯ?S"??>B!???bWh.;?w???Q ??? ?#???D??>wd//蠚I>va??E 0??u???-A ++v???:Ǜ >v?y?-????????/??ޱ@>?o?`{٦b?x????kP??>???????nr??%>???^???@????w"??Un?7ǡb˨9>?U?M?C?.K?Q???????8y??}?c?}???Hu??R???~??G??6oW;?4???r?;?%???y9???_l[L???yi?e?ⅈƮd?5?z??j???6???\ϧ.l?5?F ++?c? ?????bo??I?????5?.?|??d??P3w?_M$i?`Lq?>2? ++!?b?Yc?cәHФ5????/򡤗????I??b?i/)L]?̢w??=??tw/Ј.L??? ??v??i?b;6? t*m|???y?????????|?˲*?=˯?*?k?n????sc???ȞC??H??J?\??3)h?Η???k ++?UA????_???b?O6?L?2??TO(H?)qg?D%?M?bo?Z???x?cP??ιQ>8r???_??????????Lsf?^?W?|??]L??苺?vRh??Q?J{r???????1?U<.??M???? ?z;?cg????1??x???C?ﰆ???qs ++!?????cr??9>???IW/'|6??3??P{??s?%?áN???z?Lx4t??߷???=?if?=e/???0>???g5????tr??L?l?? ? ?.?UW󩫞?kwǀ????t?f=?WK??9wM ++eE?AqE?\!?B??\??? ܛ,?khah?"?!T???B$?%??p?_??ZN??L??=G?b??Y?P?'??L???v??6?Dx?!J8??9??wgL???`?,???2S??7?g?OE?hgNs_,T?>?K??B??g¿??SW}Q??r??'??o?ŪW?E??S<8???H?n???︨?eF?S?y?L$?s? ??'ybo i????&!ĖRc|v?Iޛ?0?u??m?a??Gf? ov,v???R?C;??=m̬1???+??B??`??)Ϛ??"?R??b2O?.???W??p ??X???7?"?sp?_^~???W?:???s?"?6隟ࡴM?5ƴ??}d?B!??sUR?S?娩s?9?|Kg?w???a~??$ñf?7??㨟??B?(??r|C/???+vl?8???us*t?*`?(?S\???DW?]V|?1?/???n%Y?zw??׎Yw????(???; @gb?V-ƗV?4A5x??8oM?i?8 ? ?q???k틍??>(· Hdh??ȸ??v?_3??K??$h?[(???????Tk|6J?0x&|}???V??W???Ff???̕?+???ppX?5??l?j^^#?s??U?o?5I-c]??|D?c?ّ?䡁??w??=.???s\??}~???;??]!J?O?\!?B?5]????1??A????իDz?????g>?O%??????پ.?? ++? ++:?w???W?IuT?? ++k??S?~yY???Z??{??ׁn\w71??'i?E??}??L?O?I??-??"?i?b??zc?1?Î?M???޹???W߰????v?G?????_?`k???67?;?\?h(???[?V?xB??I???y?%??i?C???O???Й 0;?{?t?h?0O7??o?s?>? G? v??q~???_?V??v?????F?I??8?UhM?y?????F????/??!????i?-|z??t??A؋Y?????k ++????p\??v%C\}˫??}#??o?B|zGhy??B|?3?]#?|?b?'??? ?*???y?ч?b??mR????87??-?&ٸ?U?r????Q)ћ???9??? ?+n???s?FՑ9W!?bM+?r;?? M:g ++9_??DZ9??FWe???~????<<5?]| >cLq??,? ??P= 4?,???9Wֲ?emT?[zM?q?U'a??????T??0O?8?7[?????`?ݐ̹B!?kQn?:??F???ʩ ?i>??v뿭?f???????>N?w?}??}|b???`?B!?B!^'Գ??g????1_A????,uW?}?)vU?k??Z??3ϟ? K.??????>a??????xύ,?.???i?????????u?U? B??G?\!?B????lӞ??Mm??a???T?y?n????$/?? ^?W=ۈ???x?{/?nw??I???S.??ؔ &:P~?Cr????B???(?x??????`+??a?o????!r74????????????C??m???s?$??????UA/????????v?S?-??9;?Ž??7amq?_??rm|?Pq+??? ??R5?]6?kl?юF4?&s?B!^kk'??"oL?(D{?t ????V???3???)?t{O?M?> ++??=???H?$?Z?#?Bl?8?'?sЈ???? ?X~????uãQ?k???Fm"?|:?ܳ???ʼw1???t?@9?????=??HMt????K{rL?Ό??T?????x?};_n??QLn??T?????Q~???7b^*u?U???0???aA???];x???EW}Q??? ?iLOs?? wdK?G?r????????????]???O ѳZ??O썭?ד?&8P?1=!^?h?J?iQ??????6x??ͱ?>~sW?????N??>??y??*???!???%?(?????Ċ?6?Ok?Gq]???9&?[?y?c???Pw3f?(??|??VX???19::?A???ؿ???ʏ6?Ԫ?n̜[*????|?l]?`?X?]????r?? ?"??????Ũ?u?}?d ?s)全??=3?/M7???*Ȝ+?B???I9??D?&??/?U??=~?%?|g?^N?4?L{Ia??f????????{???Fta??_?״??I?۱i_X?Si? ? ?Sf??(??'}? ??S\?Ua??Y~}V?_?v?5?l?????D??E??Vj?o?IA?v???g^SЭ ++?o???:uws?x??f??? ++xB????N?;S%*?n?{?ւ?????"v΍????G?rH5???????'??`?3??򘿚??uo? ?????pY??p?%?áN???z?Lx4t??߷??߼?????????:e??]?&??eO??c}=????Y?'z?1???#<?a?M??1?s?I?????>?m??w?j}s???~??U??A?c??؜???x8?f?T]????SW=??$kS*i޶`3??u? ??s????[㥖0?s숩??|+???R&> ?r_W?????1~-???#@\?9W!?7???sv?{?er - ??=?!T???B$?%??p?_??ZN??L??=G?b??Y?P?'??L???v??6?Dx?!J8??9??wgL???`?,???2S??7?gjOE?hgNs_^?ܗ??f???s??~?kǬ????tK??@?{????31G??K+^??? ?s|????4W ++??ׁ???~sߵ??F?k????#͍̮????_?f1fpp????W??2?a?Lس??|3?t3?#??6?~ ?c?fج?wx?܌??l?j?_cp?z ??????d#????z?s5????????i??P(*(V?&?5J?\!?B?,?H????KѠ??q???Z????n??3???s?wi????l_gu???????+?8:?NBe???R?????j????+?t? ????&f7??"????ݴ?!?M??? ?[j??f??돇n???_{>???^???b?Ic?-o?E? ???՜{%Ů?C?TTF:??GM0??P? ++?դ??(?[j????T?^?t??? ????̹B!????^?Z9ޜ2Y?5??jy?`8??W{?????M???P?E?B_?!??3??Ϥר>C??a?}??rf?)r(c?/?t?I'7u߀?x-?w[?D?Sܕ??k ,??]?PfZ?y?)?P ?`(?f?QT*؄????u???`*?]?s ?c!uP`?? IDAT?1??i?U?????JQ??S????W߰?W]7????[,ޠ^qL? ???&?i=?B\.~]? .Ɩe??4?O??\???{?ko?????u??V]?lPwGs<ۦ'ٻ????ɜ??2?: ++l??p?G^[QP???%?EG???8uL??6?^??$??R?wef?V?9W!?7?UKj_~?;*??????e}?Q??#? xɪ6??,1? ?z??????M?;???m???7H+ ?2?X'=n? pW??[&???E>?tq???=7?}E???H???6?{m??Qkigpz???@)?????V}\??ms?#????R?-??m??'D\???x?7?Q?N?v;ď????? ?ɀ?ӼgN??V?? ?t?????Z?Vg??F?????#??Lڤ?׷I??j??J???~??I6????????? >u????&.y?,{?a팒??s?^)?f?D??#??????2???U?c٨?v?3?DZ?;`? +++?_?лx??О????…?? s??*4?y{|?ݞ6??m?m?2? ++!??&?")g?sn????3k=?ֱ?`rpr?wV?????L{/_^z?2??Ǟ1??s???E?N???no?qU?ι???>??S?eA?????=|+??yL????>???7?|*????V?F??do/??8????????I????/??0@?????B!?B!??k1)W?wn???㾭?ۭ\w7?}?B!?B!6????B!?B!?B??n???B!?B!?B?C?rB!?B!?B?`??B!?'?D??q?*?u$B!?B?בu?rJl??GNѺݺ???.?4u??xw????k?|0G^?g??{Ӯ??뵏?9N?/???h??"B?[?V$t??FK?F!?B!?e???v0v?0??)??F???y??4????4?G?S*^?W?B?_??&?c?D]}h??qPB ??i4Q?s??B!?B????w?????????W ?dۇF?Ll'?D#??w? ??N??????4??`xKǜ?1?T??J????*_N(ۙ ?3?H?a???;MkS??Ei?ŠJl???????>8?w?ߓ;},???٬~W*?j???y ? (Xs?v^76????Jn? ?H??1b{sh???????}hb_ ?v??i??-?W ++???G?Wt6???f????++?"v??|~s/U?.?~???p?????;???+?}|??2v?6??嵞v?\?ƭ?&? ++??2w\?aO ?W?w9?????m???G?]??Ͷ1??v?+_ ?>??G???Q????s?ź*T1??j?)N?g??B#????C`?Σ%Z)?????4`ޝ ??AiN?NB!??tER?Ƴw?%??əob???xv$ ??hx?,??V?????xS?????nҩ+V??^??j?u?〲?#5??t??M̮J?h!_ ??@?9?Ȟ2V??K??w]" 3??N ++)?9A]??u??E^?}???????,?J? lg!???rܨ>;m?)ձOݤ??ff???Y7??[?5̧???dU,??? ?xkm?`?G???=????1Z?F????JL?0?UѰ2???,D??O?-??(w?T.????2??2Jd??__]zO?Ԝ??? !?B?JV'???@??4??/??mcaďe?hQ{??|????MY1R??i?:H???\?w???A?? +?????uw?u<*峭????pF{?-?h?????^?]u?՚uws?x?]t?L??? 1?t???s?G|?|e?"????c?ղ?\???n?????gi??%B??"?;EdioC?{2\??V_\?u? 7??a?l??{??`'c?6???;O?????!f?Sl??ޥ?????c?U?(MS??? ???? ???xvg0*??Ir??@?? ?gz?~??yO??_B}v????r???j??g?H??1b{sh????R??hѦ??z? w$???? 0=^????ū?k?Mn?LW㪋?\ϧnl?5?F???Yf??? uVȜ_??͘s?*NыY???n?????+?W+膇??M???| ++?;-??????$??a?o%????????v+??O?N??s=?l????????;L???8ͤ??WQ?&jzi??=7?3M7?j?ż?j>uc+?I?PѪ V}?^6c?uC???s!+?O?v?W9?ÞSE??y??50?M1Qo;A?m??83??-??!??T?ۘ???JYil?L ?;?\??? ????*J?%?Z???W??b?>6?'|?oI? E???mg=`,:?+\i7?kʢ;M????BY?~????b?j??T?˘tb?r??"?? `??Rd??C͹Vݟ??`b"??B\? ++????†Nz?vɯR&??F6??{??[????jV?bu5_u?,`!.s?M?LcOb?r?T?tx??9??vMs?/??t??rS??"??????V????k9?-;f?r??{????I*+??J?[ž???????n???(???`*?[???Ҹ ++??t;??˛?ӟ?5h!?B????tԖ?D?;L~?3??N????c?????51?v????Q???֤?pR??_J_}ҵbY??? s?}???LxW??d%???j?>?Sv??QC?c???o?1?;??<(????BXca?{]?????V5??h[F ?4?ӽp53n?9??J?/???Εˎ??Y?yy??? ++ݠ9??؍)ń???ZH??T?>?6[??Ϲ+??P??xn???mS?0???o?S??,??> ++?^DW=Lv:1-?Mkv^????????:ɾ?B?s?R-?ܑ? OF ??z?(I??*,g?V?z??Xn?С^w׊Z7??nc??s?-?l?ح??B!?B!?X[3?re?S????f{??f?? ++i!?B!?B??6w??B!?B!???[p??B!?B!?b}Ȣ?B!?B!??L??Bf?[{9?,n??zƵQ?PqadLW???Y-?m??{????{?B!??Dz9??俿?"?(??g???9v?,o???q?c_?v^Ǹ.?,???6?`{I?s+Ć?????r~V???anO?׻l!?B??d??? ?N ??Ogs-l??ד??Rl?a????ҞC?????B?????????S???y?????\???b??>??;F?DʐuxrK3?;)\??o???$???T??|? ??Ѹ?????mW1v+??;??8:????2P?y?͖f???]EYV??TV9˭ݼc,M?T?p?p??b_?:?U;_iq?IY?$s???????3 -|??=}?X? ??G?????&?????????3?Ԗ?ʵ??8?9?Em?>>?䙹*?́Σ|"S˗?o?G6)?BlZK,?4??S???G[??g?7????]uj(???????ʴ???1???Z??[#??ށ?|T;?Wj?A$??A??ۭA&(?{??;?:H???Ϝ?ŲJ??k??? ++/4???.?:??]??w???ӷph???P???6????r ͹T??\?V?c!v??<ٲ???6r??6???z?Pp??j?,k?T,?,rm?I>??y???????o?oug???6?|?ŵVe?~????D???$'???a?t ?q?ˈ?: !.??ֆIh????N`??x??GԮ?󸜳 A??J??fg???m- Ltqߨ?O[w3????Q?????M?ja^??X??M???ⓠj?9w?ٕ4W??&h????3????cUn?K??T????M???~?T?????$n? _?0-?`?x?x??H?!??S??2??GϹ[e?+?2uG????$U????rh? ? 2,S?B??-^?3??/0??{?z???P-?i??N?t??1o ???X???C|?j&???!}??b ???f7??y9 ?? ???ˍ?Es?1,?????[?͙????.??9<?_-?s???`??????\6???????????? ??aw??????+u??M???B??K?h??????c????3Ԗ!ja?yy?b+?Vl???"[)?????P?J?+i??`??S>?ORc?1?U? 0??'??y?>?ñ`???Qn?5??^?K?*??B"XǙ???:????_z????'?+??B!?X?-?4?%?!~?^?=??|?@???q^?>???a?????m??? ++? ++:G????ϻ??Tu?UX:?P??y??T??_??? ?nV??k?縣?w?<ܴ?W\:J1?t???j/ge?+?ٚ?????J?k]?Z?Ϗb???Y?2/~Q? ;?>W*?Raal?mV?//????9Ie?-??_!??X'??????>???J??C?8}E?6?J&?|??+????l5+?????D=??_?Գ0?D???Ux??c?/??95'?{??$??m???R???? Nm1 W?\9? 1H?7? ++?j????g???????SEL????6\?/?|???v?h????Dk?5z?'?Toq3?V??Yn???I??q{?IU:??L?%?B!Ħ? rfF??d??j??k???>??????U??d? ++#6u?l?=???E???S|???/?n?J?`??T???v?ه??~T???3|Hi??ˤil??9;??3Lb???ʱWf)v??i'??fw-??Jij??ak?BY????j?|z?4???@?3?{?K{?wŢ|p? (L9?G?"Kei?ܺ??????X/6??????s?????y ????km?2? ?k????#|?s????rQX?Ϗb??P?մ?w?n?;?LJ??vxyޡ.???????翡Sa???/؆?kh??ݱ?+?T;]?-<vR\ӹ??5.k??7tNR!?%L??7??????bW?\i㕖?|?????Ns?y??_no????┢2??1?CÀB??_ڶ??O?ަb_?π?n@?`?~nJ????f??+ZM?(N?j???8?#_?*!??ꦼ??j{?PN?G?N??z?kZ j3Ǿ????B?I??(_<1ʱ=???pB!?W?=>w??;=????\?n?d3Ǿ????B??(?-?2j)?m}??C??????B!?F3?(W?ul???#?͖(l??ד??B!6{v???? ++?ުf??5DJ^? ?B?s?? ++!?B!?B!.9?=?\?$?B!?B!?:?E9!?B!?B!֙,?mf?[{9?,J?^n?B??dL??|??B!,ї?Ev?/?b??u|-?c?g?.?K?Z?O?u?2?_?"?;7??ah_S?Gk??+?????'c???<(?Bq?-?(g??Q?yз??.e??-???y??En>{?;?p?W ++g.??#1nLN?Tt??{y¾?5c??0???c?????????o";?/J\?q??ej???pv????Ż(c;???C??mC??????^?1?$RTQo???l??%?B!??B?AKdB!?Ub?E93?M?WF?6/???̃5???cY????qQyL??p???????'????|?h??C|??A?r?*˕?1{&???Q? ?v//?5?ǓԨ?hi???6????r?? 9?Q?<(??B!6?%? ?ǩ҂|ۣ-????3?w?h?.?:5?r?H^a??feZN?٘??M??H s??i>??+5 ? ?JѠ???? ?=?ǝ]$???gN?bY%?????Q?w?Cl?箎v?;?????[7?b??c ???w]Lh ++z???\*YZ:????,v?L2i??6???k?C???.??Y?ڞ?| ??lc+?; ??1ޞ?ۋ??8???L&?j?0?F?CSY_?a??V?*r0?'?v??; %??"??C??fw??8Q???q??r*??{? ++?!????+qY?K?d?!??? ??????n?A??abR5?ͽSA?????bPs}???h?ɻ??4?C?k?Ȏ????ə?қ?/??[w??r'?=q?ۃ?????g???r?4?????|~g???Bup,?8?ϳ.88~?????9w%ϊDzL??´2&? Dz?qlz?D????8 ++?E??~??>??P[???m?K??ي]??? r???<(??B!6?E?r??(?u?V{?-??F{S3/????_????HU ????$3?|?F???? ++??>oǶ~?%?@Cw2?Bc?? ++ʲ?Rl?Ƴ?yg?'??m??Ψ%??|w??m? P???\?nh?V ?ݙ?A?/0?Eu?W&?I6???W??I!??L?Yn???xā/=AD?????>?/4 q???B? ?٭^?3?4V?Bf渣?w?<ܴ?W\:J1?t?X1??Dz?*??Jc? ???_?-W? ++?? ?s???(V?f?????;'Y?̃2 ++!?bcX? ++??xC?H*TM?rgt=?=?e??܉~?7Z??????6e2v-??B?X??(qv'?螙?#?9?O??cd?o???y?y???G???]榒??u?[n??A7I?L0W`*T?Q????ZY??????>?4r?e?46?᜝??&???V?@??&?ّ^>? ?@+G?=?wu?? ?m0:???tNh%¦???N??2?U?s? cW?>1?`???ZP?\?Z]f?*v?0ʟ??e??6>?+Df-vndy??????b?W???9????5??? rV_??i_????z???1r?=?E?????{??sI?e+6???aI?+???3?8B!?e?̢?A$>F??A?f[?t??_???n???i?\?}_)????ĸ19IS????? ???ܑ??S}??5?g?\2?̟Ëc?s_g???Z?E?????u]?|(??>?U?????F~X?_???L??,5?A![D? ??h?}l?wD???ACa???źF~T?e??;?M[?G?n??fʤ?U4)Õw,?y??7?n{-???DŽ???h?;ˌ?ųK,? !?R2? ++!?BlK.?ٲ?ܜ?8??]??)?)n????x????rW???-?ݓYdW??{??l+??u7/G??@??I?ȁ?.?ILQW(?9G?'(䠴?? ++??pwl?-e?r??ec3??s?)M?;?anL?i?q??{?????v+??K??texf?!???? _?K?N?vh/?Vb??J\?,?t???4!Sa??? ????8?g?uQ[???5?ގR?@?Q>???K??ңZ? +q9????P?????[[??6???=?x?v???N?O/? ?}? ?ᮡפ??Ssp2?????|?І?L??;??-?^^?kl?'?Q=?j1·Nws}??m^~???kx?$??????/r??????|b??????;?hN?<?@??Cq?(??wӯT???ۚ,????1?\???>???ݳ?WgǛ@??Ώ??J?lf???q????????? >s?_?!?X??L?????w_?c?2sU\???,O?ٟ7x?.??k??1??????֬?x?[3+?eu?Y?ց?|6??tS+?pkR??;p??j?J??4??R4(u|?5?v??qgW?????S?XV?=}?||T?????[????????????9????X????F??^.?9?J???=C??`"??;??e??6???k?C???.??Y?ڞ?| ??lc+?; ??1ޞ?ۋ??8???L&?j?0?F?CSY_?a??V?*r0?'?v??; %??"??v ???????S? ?b????00??}??m??H????Fy??B?bIM?#|c[?I3ϞX?w?i'?k????0??3???Ȗ???{???xUP=?h?~?????INl??î??dCwL9Y?cgi ++E?D1?r} [?????0 ??u????n?????QJInK?l?‰e??i??v????`*ʂ?9 ?8???%'k??1h???????Q+c?je??2Z??M???????b\B!????FF?[???5t/?nm?-?@ q???s??Ďy[??8??????;U3gͽnH??X?pu??ٍ?~^??.????r?d?ǜv ?e?k????|s???1? ??q?y?WK?\n?2??9?łeb7m~??)|8???C? ++zn?[r*??LZ???w +qM??^??@?^?!?? ?i??7?#?Ɖj??s(_ϐSA/??ST? ?gg*?V?2?\?6?xC< 1????y?)ܶ?|-d?Ĥj??{??|c_ Š??#???.o3??YGl?6?҆?y?N???q<F??y?S}?7??? ]?G??DZ?? p????????&????p??t ?V?_㲍??ls??? ;N7~NR?????a\B!??T?[1hK?C?ڽ8[+8k?ځ-??~|?Ýü?S?W?i?t?l?ſ?w??Tu?U??ʔ??h??*?5????邳??c??GxY;?ͣ~?hr?X?DU???-ž ++V?R+?j??!?s%%??$??"?_??/l??2լ??Z?xp????A??V??f\.?[[?8+???~?X%.?x??6?[V??F?I,?qu?ߗp\B!???f??)ސ(? ++Uӻ?T?FO(ƒ?????&???x?h (8 P?m?d??":??!?m?e??bY~?ٝ?ϭ,?9?O??cd??Q???y?y??@|??Qn*?y??}.?UŮ(?(a??+q?~)?/?]?? ?8^_M*??T?[??Qdb???e??ڡ.?????yv ?p?V`*?????z??}?}P{-?w/?K? ++}Q?y9?C?X??e???~6r?V>r?????????"8|??????ȱ???&????vs??Yr??TTJ?ʋi??T?n7Q??/??????S????/?J?c?>?x?~d?]??ct?:8rY|+|???ja???c?`?????K??1h??*?????fOq?Ɨk<\n?5[V??????X?]?ՙ?_?qU!??R[?R;3?\S??B?g?3?(?6?ǵ??v???j?LBaĦN???????(2r?ϖ?e?MR)?? ++?q?n?[???~T???3|Hi??ˤil??9;??3Lb?_HW?@??&?ّ^>? ?@+G?=?iu?? ?m0:???tNh%¦???N??2?U8???????\p??????i?\ ??WSA?s:??k??B????7????3~Z`Ц?? T?>??؆?U?SC?s?? ?Bmb?we5^?1??a??g??i'??fw-??Jij?M? ??^?!?? F??Y bxy??Eaݏ????Xֈz?02??Q??me?g?*????Gq???-???(?:U??H?vw>?΂?7?{i???`?d??o?????o?(M?sW???w??C}?? ??ځ7??;?Su0??,_ *V`???_J?~???o???M%xc?˧??s?I?c<\??cyU? ++?o??d??-????k0? ++!?B\z???l??k???R???)?o?,o-Mg?%???V?}?2g????~??E??XP?r?y?_?Q?7?X*K??ֽ|U????.n(C????~b??[Vc?a8???? ??x?!Hj?oW???--?s? cW??9 ?NO??T?(\?cge???J_?vɜ?w?:y:}5;xn?_Wn?{?˽?10??q~߄????/????\}.?XV?մ?w?n?;?LJ??vxyޡZ???;?E(O???&???'?Ԑ\e??%X:???V?}?L?????翡?2??+Z??w??7tNR!vKd\??qU!?b(?s????0???ѱ????????B??K?:??$'B!?????";ȗO 1??:??1׳V???n??1:›t????\????Q??X7-??????]!2???K?????|M \??!?%"c?Xo??!?B\?9io??Q?yʷ?䮆? [???????????]!?B?????|?????ƕUl?S{jH?߸糯?e????o?g?????x ?;???q;???O??۰ȁ?N?3>E?d ++)w?_46???ƹ??kTg???ցn?1?&d*L?\8?q?! !?e??|?t7???h@???7[?y??Cvf??c?????ǹó?On??('???|M??b???e/? ?ᮡפ??Ssp2???ֻ)BŹҞ?rg??????K~???$5??'Z?x0hG???a?,?9??!'YJQS1Mcѭ?i??????+('B!??-?(g?0>N???m??w ??޸?G?wqԩ?? D? ++??6+?:p???T?nj?n?@j?{N?Q? _?q`??T???o??????>??? ??s*?*??????*?и??`?X?wu??߹??O?z?S?K@?V???bBS??%4?R??R?+L:u?l? f???Ʉ?N?\?ۼ???ߚŒ(%v?z??]????Z?X?? ++ mhDR?D???d?̳'??]g? ?????4̵??Y?ڞ?| ??lc+?; ??1ޞ]1!?????#[????F????x_? ++?C??;???I?B!?R/?Yn?? ++?н??o?Z??~??3 Q??P q???io9?w?fΚ{ݐ>?}???c???? ??]?_????"?9??z?h??-?????c~ډ??󈯖???^e0\?s? ++??.?J?e??<>?????2????'?9|???;-?q$???ġ??x?d?_:?(?'^?І???Tn?sl>??d?~7???9移jHZ???:? q~/Qb?q/?qR??4?v?[?NBq%R Ͻ??? ??aw???ub??Xg?9ܟ??m??;??-17X?+?? u?=>???0Z????????? ?e?Zئ?da^??؊9?? 'Y????(`3?l???M?"?ѳ?uc˽.c?w[ ++ӷ9i?g??p??m?$??+~o???3jȬQ???I????Ͼ?۲???o??b??????:wv?B?E?IQ?;???vc?ud$($N?4}hQtA?OA??????/s???????Rm_?S?O?3Kk??Yo?2P$s?"?$???j[+9?INNO??M>???W??? ?_????$EnpG????k?|????k??F???In?Wmd#Eݵ|j???F???ŵ??`??P??q??5 7r](?????>??z{???ڗ????Z??'?.拯??W?????7??+?I%??;??+*I?? ?n?????މ???G??Ͻ?b~ms<_>?P~0XO????ꩌ_??v?uE?jQ?m??.%???"??++?U*? ?n?f??????x?$7׫5?^)2?z!?N????_?~!?E????VrG?$?ݵ?\w5?Zh???tN???J#'&???????????s?????w?ne?5?ә???"s???^???q?m??l????f?×/?\l???v??????{?>?7j?<~a&??w???-?Ѕs?{?v???壟????N??RI????I3???W??|oxG???????h.Tw????X?d>?-??92??[? ?N????k?????????~???\5o?r[}}??3_O6?3Z?g㖡Z??????R????+/\u ?nc$?ד?_\???????}??ؑ????????/v?6??_?????~?In1?^???J7G/,es?XN ???????j6????{??=?I??5?\k?B>?i?o??oPxus?????X??J?????L???????????????ߟ1??{ ?g(K?n?lleu??|???1?m????o?}9??ro?,r???|q??o>4??~p˱W[y?U?S?????=?(??'?/.%????g~v6???j$???.??\???b45?J??9|??????n??d?™|i?????\%)v?Ͻ?T?p???????o?{??iw?3???n{??j+/??]?Z>?M?[{??#??Ǘ?rֿی=??H6??g?_?ٻ&?vi-??v??~?g'sX????7?O?s'^??*???>?g&[i?5??U?yh?x>?.?m??/??O4.?k??\? ?=???x#?:{2?5Sl??wZ՝??P?J+?8r$?o??^1?V$I5k͡<۪????g]%?{???m???}=?vf??VF???u?????h| ??O????w????ޣ???L~?܅|?????k?f^?>??/??}?????n5??uMr??W9?HR??3??????d.Μ?r???k?X??t??)z?N&ݥ??g_?Cӏ?w~?N/?????????a~?~4?ul©&%?>???jC+?D??g??8??e??P?ˡ\'G..f?9??[?[i}???{???????W?r??dB9x7?63????so??? |0yw????L???_?M???t?T?IDAT???????????lnTn??"??f2??? NtR)j?̍??7?˥y9  ???|?b??{?t?????ﱟ??????=ܡn?i^H?=????5?T&g?贈???#7/̆3???8W??M???6?Ig?'???(??_?}O????b4???pֶ??S???????'Ogϱ?4?t?i????????ʕ??U??c7?j>??ީ??1????Z??zV??C??~"??ޗ3?M%I????2Y???Y[OR??i??=??;?F????k??D??̡??4??FZ?;?l ??p?P?2????Z??j8??Z?d?7_??????~?ٌ]~?8~8??1??umF??lF/?i??H??`?)??Z?޿*C?ہP?:????? ?齹?kld???2ql5?j%???T??u5??z&~??????????6????O?;??ܳ;?W??͞??eh????b?ͬ????~p?u?[??3?xl)???7??K????I*S3?? ???X?ڙj????? ?ҷ???F_m?ǶR?d??'3??Z#?sػ4??????f??n7Ӟ?氯??J'??8???ki ??Tҽ?=?K?W?^?????L???'_ɾG+Y}????'?c?2??WR??Ù;SKeh-??f??`?????GjY????????=B?2???G??d?;?t?*? tRY??&??????^>?z???_??b-in?1VI?ͣ???????>?U?k?jٚ?'?edr??׳????c?????Ҹg%??????ҫm??عL??+?}?X??ն??g_???+Y?Ρ,\??v`6???Z?n=????}??X/??=??od?p;??Sٺ???j?K??j)RIwy ??? ?~??O??@?_x럛?E?O??v*?R?.dσ?l}???]>?m?l-C???۝?ײ??K???7??d:?? ڌ,d??v??{8?}d????T??b?|t1Kg?.+???g?7???N?fF??Iqd=?F????f???z?H??Ѭ??>?j}????8????YZl??,%????TVO?dn??}??Hm??l??qz$?k?$C????>j?>֫s吱[??v?թe??f?y"?_?QFON??s?Y9}???}?u??þ???d??d???y>3?|饌??b??x*ݡ?L~h+?|4_?|t??Vr?s???R?/?Mg???`????{[(W????P=k/?F?=|` ?d???2zp=?V??z-?jҭo????4R??L?]?:?2??V+??????$???4R??髎 ?6?~??=GVR?O妗?-?"Er??׮j?϶:????@:??1??>???#?e?Y?z[?kY?ެ????u|"+/Oe??֕Ӛ?????#??_ӭ?\??#Yٳ??G.f? /d??]????l?????ި??? d?t=?GVҨO?_N?R????r??׵]?L????z??z?Sׅr?4?-??1????p??T73??W316?ſy ? ?dh9?O????)߾vڭ^???H*?]??7C????v????f??-??{qo?>??F??s?8???O????]Ȟ?.d?¾??ӻwp??ۮW%?ű,?=??????K??????????~?v:?;??)*I?x??I?Y?߇??pݜv??tr%ؽ͔߱?|?\??5?2?@'???ټ?7??Z??Rk????;F}3?SI??Yzu4?s?ٜJ窫???F?N'??o?<????L*??/?+Ej?\???.?5tmDR? es#i???M^??4?v:iݻu???? ?$?#??=Izg???z4?7?????t[?w????>?tGz?lߗ??˩??'?zx?v?Е??????o*?G????&????U???9?IRm?uO;YI?{????W???J?????)??{??μ??x??9R??w>C?zV_?鷣??P?:? }?\F?c?V?i4???rˍx?? dc1|x&cs??X?&??Ԯޓ?????3????rW??\:?L1??Z?:???g??????2?d-??4R ?^??M????ܙ?&#C9???+m??Y|f4C?T????\zi4[k?T??ԫ?Y~??be" /???'_?tqwV??4??˞?F???'???o?ށ>?????Vc?-??i_?x?l?7G?~q ?n/??WSK%??j???gwK????Ϥ?4???fzE7???g:?z??:???߮??e{g3?D7?K?4?db???o??>E{eO~t>??x5??ʥ????z????;>???J???Z/?w誒??汥T?&?r?;p?ic,?9???????.$?z6_??+??R?bx?? ?????wf2???f??$??V????/??l|???_;???Ng?Om'Q?K?YY?]nSI??C?:????Ⱦ??6?o???????fF?&맮??y%?????L|d>㟹??u?|?`V_k?[Բ?7G3?q:?u2?ͤ?8???ݛ?3?;As?vy[??.?kM?P)R??????~V????e?՝?ZP?zI????2>?}??bu(k?{0??^?E??j?>?pGG?? ?7? IDATx???wxe?????m??SziJS?.(XVŎ???VEi???]?,ֵ??)? ???=?י?7??0??|?'On?Nyߙ???y?=?U?:???B!?B!?B!?B???B!?B!?B!?B?$?)?B!?B!?B!??S???B!?B!?B!??OA??B!?B!?B!?B?? ~ ++!?B!?B!?B!?N~?S????71??dL'?`B? ++r? ++!?B!?B!?B??5?S ?? Sy?鿑????s:?Z??~?Lͩ???"/?ѝH?T7??R?Q??֓???:ˍ?Cy??????8 l???G?W?B!?B!?B!D?N ?c ~???????舟w?u1????b ++ ++?qk???&S??~? ????t ++=:??F?????๱i?5/?EE?8🂦?%$??????:dn"C??v?8?I4?Y???(*,??ʇ??m=??pzy?S?ܿ,?=???x????~?Iַ???? ?g??g??VPO%??ښJX?}1^??????OQS??JL???^??Џ+z.??uU??Xs???d6[ ?B!?B!?B!????xhRs??{G>a??U???{#S????z#rF?{]ȵ? ?G?p??\2?~?G????l٢:΃K?b?M????c ???OC ??h?Z?kJ?`?gĤI?.|?G??? (?m~?X.8? &7E{?2??٬-Ri{?T?躕???A`L???Opn?????<???g?d?w?? YE٤!\?f????b9??G?)=?e_??'?>?c?ɷ ?ld?9??y^??؋}pD?\5?7?v+?W|Ϭ?_Pbj?YcF??????Ss9??1D??[z???Śb??^??r,?ry???x?r????.??g.?O???o??b?d2a?U??dTQjU<6D??m?????????أ{p?uW񐹈????Qq|?BJ׎$???G?8 Q????Qw????????'?/B!?B!?B!??Ĝx?3??6????*?=???#?Fs????o?????*?^Oq??D??3U͖Q??`?* ++Ͼ??{F?au%?$?B?w/?m??T???\?n?۩??8??#??4z?ї?I??(??7pFF8?K??? I?B??C??e[Ch9( ?p9?fNT??1?;?η?\?᳭??C#?zTgf???Ms?HFw??????G???1?8K????%0?? ~I8?2?Z??޴???Ԁ???5?v??\?e)?eڃ??do??????Oij&?D?e7y! ??n??Ξ?Ntr?߼g???͵b???JD۶DX??d??\R?\?`??n@??bE!\{fK???#qPލs??ag? c??$?lm?x?>l?V?7?߇?۸Y?l6NT?i????|z?nae9Dft *P9?&d???BR?8??????o?fv?Σ{?XL???u???g#pV%t?!$v ? ?????@B??@??+?֔?]ӕ??ؤ??B!?B!?B!??ů???Ma????z, ++(??N??EԎ7i~;??]G4PE?????????2????^?????C|??;lw?ZI????A??kU1???2???T????2???F?? :[JY???ˢ?Hr6-?i;?5F?~J?r??~???:?^?p\???Vnx?h~PP|?|??l?ԟ??9???1??W???n????Y??p0+??Z?5:?ԙ?SQ?W?-/???????}TZ?F?U??&?,?B!?B!?B!~3'?<. ++???E?J????۶????7%??W?q???+嬋??֋м9,/j????98 =?nc?>{=1@?ʭ+)?r4?F?? ?˫ wE???>??"??[6U4s?/?%? ??l?4?XSQ?d?????d????-?I???? jʖ?Gd\?#?!GNtZ???-???}?*J+?G2???S???m??KSڬ?(ݵ?Y?ֲ??Gyꊋ?1g+?T4sJ?1y(?^t$?9?????u???(a???j??"?d} ++!?B!?B!?B???'???2?ND???: C??M_?LU?Eg1rH"??u??X?k??Ug????N????Q{????.?L??>??Grzx9?W? ;?k~?ؼx??>??:w?Bf??w?]\3?t?u?L?3?7?H?~?}6 ?ƜϠn??q? &??8???ճ??m? w?eXώt?s.7?{>qū??????? 1=1?t?d??m?NtK?@?ٰ???????x????r??sр?t?܅? ?춡?`???**??/???}?٭'CƎg?iF???"?)??B!?B!?B!?h????Ԭl????? ???6???=ط?ӯ?s?Ń???? U?T??`???l?dd(_??-???{?w#x?/?ۗ^?3?2ν?FΎ2⷗??????`)U??-_??q_v,>?Sݕ÷۬????????-y?????΄?/??ң'Eu??`?? z]?AĴ?,y?|c/??ѷ0"B?S??????P??W?}C¸a??йh?\~?p???ݟf?»ϼ?e??1w 'B?????????M ^"?r??C?*9???"w'_??)???k?? T???+\~?Hν?1g?!6~???\??W_+ n?3???k8/5_?6?x?OV?ьS? ++!?B!?B!?B?f??uf??)D} ???4?х/??ٸOu{?B!?B!?B!D?N~?[!?B!?B!?B!?? H?S!?B!?B!?B?? eo?B!?B!?B!? ++??)?B!?B!?B!??S???B!?B!?B!??OA??B!?B!?B!?B???ZU??p>?%*2 ++]?k~@4]GQt] n?(躎B?oE9??? ???B??E???:??T??T??`????????%???B!?B!?B!?B?e??cسs'??????T??Q??VUcu????Y???`|????sPkU??ĖM????-?)?B!?B!?B!?_?b??Խ>+?-!,?p?.-???{odAN?M?Ѫ/???$f1?.5oE?7_??y#R?????c?{?-f???ң?%?f?BQM???k> ++???m?| ++??9?f:v??X!?B!?B????Ჷ???u??.qk??1??M*{[RRBbb" eoO????`Ƨ?P?` ???\?ibf{tPu???AN?!:?5???????5??J?S?u??Ӧ?Ɠ'ҡCޚ?_BCCy??י3g.V??f?+????????fs?m??v????;ػw/S?L????m?.?&z??W???O????PU???ln??NJ?K???p?]w??ĉ??ʅ^???NE?4?7??]?7x??S? Q??iu26?n7???g?Ok??|???ұc:v?@DdK?,?Pn.?? 8?nF???2j?%X,!?/R ~6?y?ux??dr2????*???????4???????0( ++F??ɠj?kZ???v?ø?ή????sٱ?2?????!B"Z?&Yc?????"Yt?}=?z??-?+?B!?B!Ф??ڙMY~"?ͤ??-!S??s??8???????oX?t)C??????p?\̛;?w?{?!C???? Y??k ???I?????OQ/??f͚?'?~??ysٱs'C?c?k?s?9??Y???F?ͷ???ڂ_3d?0v??ü?s???Ϙ5k֩??h??R?n??w?}????`Ȑ?Lx|??| C? %**???|??¸0?q? ??(??a5?????N]??????+??U?ud??Rʭn?n/6W????bux?9?W/??|??\??]??[۳3???=??i6{?/a????a??i7b0E?????T???)???n?C??]?>b??ŧ?;B!?B!?i???YRR??i???Ք?+--??V??χ???d2a4??lx??:eo?V+?EQ(++? 9?}?k:??R]?0?A?f$!pV?u?*8<`0A?V_?n??p?????????}?????3????>?-??cg-y<?}?9r???>?? /????2?o??<9q" ??g?O?q?ͷ???X?f ?>?f̘Q??}????f?پM??x}^?l??'?ŗ\B???e?߁??|j?Ƽy?ٽg??3n?8N??UU?u????? ?u??Ç??(?3???:???{?n?ΝϘ1??l'?S/'??ܯ?Ф?ٞS????????p?????????AU j0??l ? h:[?1?? ^?????R??s?:?%l]?>???D???h????B ?x<???l@U??:nw?@@?dV1??h??:?ҳ?-k?'?U/?#eP!?B!?B?S??????D??????'99???dHNN&))??qBBIIIu?%&&?l????'''k?E???3??????2~?;?y???,?V/?`??z?O??????@x88ݰ?E?r?U??0HRC?t \a?)?? ?'2f?W?^'??h1???[m'9KZw???+f.*?{r?Tc??)8?N?~k:3g????????>bܸ?0???S?H3f?`???xk?q:?L?????`$&&?Ӂ??? ?o??q??q??wq?M7??*??s?\?߉?_Lڶ}k֮?&0 ++??k??Φe? 2?&??( ++={?????h4?f??m??5?Cю l?kG?f????60????T?px?8=>v? ^T???O????O?ˋ?????????@??Q׷c?? '?y?Y???[L_X??y??d???y???F9?@HDK|?J??rJ?*1???vCqQnW%?????n0??SZ\Iey ^w!- ?@|??-k?D׵S?+!?B!?B???F?????iZ?LJ?Bj????X???=^?????,gS??????7?ϟ??^?L?q-_1?,f}?????&???`0C?????¾\(???6'?ؠ0???ifpjo??:T?N`???????/]ƿ??,k⠺??`7?? ??@?}???ݰ?J?I>k???? Y?Y?oQ??̛??1c?ʓ'1k?,F_v? ?|????y??&e????+???2f??͟ρ???Mx??ױ??5t?u????Y?~=??z $&&????/ἑ#????Y?(X?6!!?W^~???R}?1\.6??'?|?[n??u?ד??ݼ??kx?EA?4?-???O??m0?,_??????jc?w?j?>?6? ?͆?n?n???6?^?z???????G?%zR?>*??)????oN?]?*?D&?pz?x???.?????ҘpU??j????)?kw?p?}8?~?????n??Fl??v????ׯg[??S?*?W?S??3??og???ﭢ?????tR[?#?c_?U?X?*???TUV?ѱ/?-ڑ??NiI)NG%??4????? ث?OQ??B!?B!??-{k?Z?4 ??JhhhM?[?ٌ??TUU?( ++??ٌ?h?j??(JMK??S3?_p??Z??e2?8??;??????v?S?Q?M%??pn7???????=??_??%k?z??G!4.??n??? ?yd???f?SRIM?h????????`??????P?~ ++>_???C?dH?!O??P0:!Po????? ++P??E?xk+>#??XRӻ1??K8?W?&??+??SS1D?h????C3^aZ???{ ++??nsy?2w?Z?(??3?ؚN??s???DG?fϙ???c???0???jJc?\.^|?%f̜???=??7???)S9t?P???×_~??[oa֬Y|5{6=?`?????y???B9???G?ɮ???ϴ??Ł?Sy??4-???o??9?=??????.&>?$?|? ???`?ʕ???j29???0?LX,?F#????? 44EQ???FUU?~?qqqجUu??۷??3??1??\7??h????-?%??x?oNw?????7?$?9?KolG??CUiY?+0?? ?8??'9?$6O?]S8D?@X??`[G0+?0+?m8Dy?o?%o?????¡???Gn?c??????-d?˓?u??<48?c5?݇[???< ?}??7?#)T?Z?ŮC.??S??X????dz???ܹ??z>???{?????ׯ??wޡ?i=??o~???f3׏????Fll,))ɬ\????Y???g??KX` ?2/??D7[P??d??U?f??t:ٹk?Z?7/?N??Ekπ?iX??uTQ??M??,vȠ.??????+?uAjp^O??ׯ????}z??.?ѡmK?3>??d?ʼL*?: ++?*`20??????Bع????? ++Z҅?k_b??(;Ȇ??xs?Vʦ>?? ?Y?TV???????????D<.??????`D??q???uNG^?ŗ_S":, J ?G??r^R?*_?B!?B!?89 ~??vt]??ra??p:??l6t]??p`2?p8?|>?F#???X?????q8 TU?پ>޲??k??}7qY??꥽X?(?_??ЧOq??Tz-$v7\͐??o???J~f??sY?-?1???Gpŵ#??#??????M???"?Ox?%?'????X_?bm}??;?N/?q??? I?lO?N'?֠?/A??????yٗW??o ??ULz???<Μ?Gy??v??N}4?śP?EТ}k?>?k?ի?Q_hP?@???CM۾??X?6_p?P??z??׫?F???Ѕ?????f.???A璨8طt3?]ϾR?ai]|?5\>0??-????????"?-⭷V?'??J?%$???????G?>???>?.?]?.????I}1????hq?&??}??gX?#?Qh?놩??PǕ??|??u?K??$????ԛ?q`֛?c}V!?V~C-O;??;???? ?έ??F??n?֋;????>???9??t,qm?{?8??????W??y??e??*< ++?щ?u}:??v?M{?_|??+V2e?dF??????5kx????gzz:?;u"++???5l?l;???g,ݒKU?Ll?^\??m??9?o?h?F^n;tDQ???8{??,^???f?n?d}DD????&?sժU̞3??ܼF3Dc$? ??s??LZ?tZ????w?gk?9?N^???۷?&?Ď?Fl??ֳ-1?㏎?{ٰ? e6'no?Ab??*????P????'?ѳ]RB??v[???N?????$2z?N?$s?癧d[wdQP?ďshq-zҷ{|0{X?R?w ??P??1G%?ޭ??$??w??Ԁ+??????O?_?????[??b6sv?? ?֖/Wn嫵??T??怊?`?? 5?[p?'?a?%??H0t??n???M?-/b?G????_?????J7JX"?\??? &?<>{l"?Z???B0^?f???_??????'4??~???? Հp?q??v)?n????Y??l!??p9+????n?? ++?rBMT?@ ??h?5???6z^?þ?;??????Z?-bCv9^S)]/??{?%??+?e?}Ƣ??Q? !?ә\v? L6K֩B!?B!? ~??fL&S???M?0??X,|>_M???e?H-K?2EQjxܮ???? ޴??K?s??`Z??7c ??9??O ? ++?|?;?*? ???0????U???x&Ӳ? `?<~0??'????WCT#?F??&?????Y???J?Q7?`??32??R???Wʛ?: ?????|LV?\}o/?(a?ʹ???M????d????y??X?????p????c?cd???̯????????5#???^? c?2{(??K>?1????pc ?-?w?????A?m"???????I??RR?:?]?????I>?Z?)מo???Wx=??<2(??Y?G???"::????:?7o??}????'? 7/???;???`4a???/װ?k8????????ݹ???᧢?J??K??u?݆?(DFE?,?|6n?????m??????u > ???cbP??v???u(&?:?$%{5??+螐?ɓ?ϫ6Qߙ??J??.bW?~ D0??D?vk??[NI???^?i??-?O??M?E?ӵ{_?}???̮?7?R, ++BIm׃d????hO&??o"???$??W??U?f??t???8BpS?e{K??xLJ????Y?_?M????ԩ??m"j ??9} g??@?+???l&?K??u?B??Y??????cP? ++t?s+/?O,fƎ????!?0?ͺ,;?'E????b-?דm???h??????M??)??}????I =v?J i?i?????8U?nY8O? ++????dl?0?[?֮x??s?T!?`??P??#???ۇW?8 ++u0???z? ++??_?:? ?????gϚ9??W?g]???k??v?c??r???h????=??9?t???Ȕ?mî? ++|??0?? zWoݾU([~x?ݻ???R?z??m?~?M ?7???{%g????v?ۛ(h??ΛKvc؟?_??s????????_?g??j"6)??0?°田7?5m[?a?B+?Y?K?3@??????5?G[*?Y?K?;@??GѶ8?:rv?N???;?r???=?AD??l??E)-????.?u??ٟ?Jm??S?ׯ?'????8\>?[?G?>k????z??e???Ą??MJl8?v? ???Z?EUa?/????(????#+?(X?{?/???v-P֮e??<\%?:?+?????Kzk3?>?TYH?t??????+??Z???(???Wgx?????uЌ???k?k?<??2T????P ???E?7r??΋K??M?pQ?? k۝???bQ ??)O?|???䂩7r^ Б??s?0?'?????'z&?B!?B!~? ~Z?Vt]?n??d??l???N?Պ??8?f3??͆??5eo?^oM?[UU??l5Y?FÑ?|F???cR?K9????_?[???p?M<|?@??i?96?He????xcz??t??e????t????[*??֞a????98?w?xu.??c???KVr?/????$_ޑȣF!ut]GA=?,X??G????[??P????8?Ø@???f+3?렻??? t#??Xf?? ++??/??A?7?{?^՜??ϝ7T??`?h?i?ō?[??!W??S?IvP"h70????9ǐv??h??PW?? ++4??qe??>?9?6!????I?7???'??񯕔?Haaݺu?[???;??ݺ????]?ܷ?n ???????_|A p??Mkт??"??=f??'? ??c????z??̌??????i???C??J???i?\?T#a-?`}1?ÉV?0?C??{???;???૕;?-??7??=@?;??'x_$??[C?M?l.qc??ʽ7??n=?GM-?凘?̔??????? ';;???V}?=??b??d?d??e???+/?ʫ?ؼysͺi??5???k??5 ?A?+????GLx|g ?9?N?U؉??E!2"]ױVU?????N??-9t???????…??喛?U?y?????~?E.|?V-ȩ????8?:ǝ?|$?L?YAs{???C5Fb$?+l??????dU??PM|??C?E?]??2?????b???g~˜Z???5??????C-*/??˹R?????a.???l??E{(???u?)??SR?Ԡedx??ux??o|???B?:3??빺c???য়?M ?l?Zv???$?0?=̓?CH?s9=rWs?5-?ZK??5cZ???Q!?Q蔢(*???V????? ?ǁ??????qrx?O?QE5`?ābD? ? $????F?K??M?Tkƞמg?L?{1|?? ??A?!?=;????n??ٷ5???~8e?%!?B!?B4?F??111?\.bcc?`0366M?P???X?FcM?[UU????? ++?? ?????|??}٬??9T?Ѥ?=???#?h?y??x?W7?ѩ??U?Z???N?#`:?F?eX ++?/Vp?*? {t2??`?6?i+???\?NOu??$?1??3????z?]{zI͋?j??ozpK?n?v???FXs?0A1??lk?>bB???@????????????uXH[n|?:D??G???|{???5?)T????j`o??????ӟ?z?'m??h???(h?4????wܱ?fԡcGv??Njj*?Ϛ?c?=?SO=}TPs??߳m?6n??&??z!3gάwQQQthߞ?;wЩS?z??R?|1??b?'??7??R?,???3/Ml??Pt?8jG7????Z?DŬ???+׿΋3 ?q?8??L?;?/^??|?Z?t??Ȁ??t?\?R???b?$??w??edd?s?.?l?“'ֻ??d??d玝$%'?? /???0o?|???>??0????o?i?{?f??]ddԗ?(װ?k?b?v-S^??UK???י0?W??z?)_n?@???o?l?_#?j???g????dN????%?l!<:?????7?/?????7n?? &;;?????&BZp??hV??c??^u??u???/5DĴAs????SEAQT??,?1?F FG?p?????X£?u]W?Y+ ?j??q>/?x?? ??JmG??????j?b?y{ ++?^??=6?8t?????E??ߝRT,??G?K!?B!????$?ۍ??????r??z|??ÿ?|\߲???????I0z(;h???aA!$??C)]?^?/?ܾ?Lv?L$???؞??????뗱?ۖsZ??????w???+i??? ?)????3?U뙹?_z?X?"?3???j??׏?VSU?????|Q!?????ꈉ?U !??Z?:?;?^??!??I'?M+?~ |c????$k}?/??u;YkJУ;Ӳ??i?8?Ft_?ڱ???'??g>????G?? ??Ӵs?`?????b????c??fq???<ܧ(:l?P ++ ?ظq#??>????՛?????x?????Q?Q??? $֓?9jԥlݺ???B?r?݇X???????=Ϳk~&s_?p??/%?۔ס?ĞqP??U?H?m6>*?????e#?бMKZ???`?~?V??w?B/??G?K?x??\L?i????????n??C??t?R.??bT?菏V?Z??7?`?ڵ??5eεK?bAP?>#wg??:Ҿc %?Ϳ ??^{?f?D???%/N???^=??%?-?zSW?? !?ZΥqH???c<-????&3?-??????3??\^AA?>k=?ڟ???wl????#?޶?{u6W?Nެ?y???;w&;??I?sh??=?m?b ++??Te?$I?$I????B????????????ν?Ҷe??Lyu<_׷`???DY??=Di??al???????>p E?ә???,.?I?s??????~n?9???N?!2: ?G?*?{=F??????!C?n} Go)7?})??/C??*#D?ܩ,K@ˍ8ߴ?#8??;?u?????:fC???'X9??JB4 j?C} ++??Ht??*`??7?g@?LXV ?!H?@????`˿^????/?m??Ǯ???_0?kK>z???????Mq?oON?^qZ?/"??K???Z:5??g??;0?o???? ޵???,????AC電?/??4 ?:r?? ƹ??ϢE???????????? 2?g?}?ǟx?>???n?'mڴa???x???W;??p??0?????, IDAT?/????δ͍R3?s?U?H/\{eݺA@?v?)))?믿f?m?c??Ms"67????:??8p?H?w؁?>??/?~7?Huu%%%?k׾a???$JA}K.d9 j+?X8k:?֑?c0?&?$??'??z???x?????OQ_?????????d?B?.??y?ٴk?? ?eN??~Η???:+FPYI?`? ??j?go?۟???.?p?B?U??(??Чs?|?6oG{QR?M,?a?2(.i?jE?&0lX{????)?' ++?E?n?h? fޒr?x?K?RN}(F? ??dC?r}}?p}?P}?P]??6A"?$??Z? k??N? #IJ?????"??&??x??W)ڥ3y?jf.[?? т??1n??.‰???+?{ ܺ?`fMϊ??A??h???K!?O$??^?X=?????D"?4B?Z??Lzf+b??@?ʊ???Ei?~?wh???;??7??E???d?:u ?^????PE???g?.???M??C?a@?B?0gYO????Ao%I?$IRJXg??b?ڴ??o?O&???Ԑ??A}}}Ӱ????M???Guu5???U?UQW??hA2????y???_^?lZu????eD? B0we8w'\???????y????4`$g??]?? ++ ?`?=Ⱥ?k??ۙ??2;?_?\&?ߞ??>?j$????=???+?p?[?RY!='???2?`#>p?0???H{?!?~?V^.??? ++???w?????mP:?4?BMd?AV??Am)k(??ͅ?????z?'?" ???Aͷ? ~$?k?????????????????r???s?~7> ????9?f}??U?NQ?})١'9??????)x?1?z?U|g?????=?OU?N~????ߐ?~??????A?v??\~?e???????x?h???+N;???j?}?ݗ?_u?>??^zIS? PZZJ?N????;?~? ??w??Y?̚??x??+??r??j?#8e?U???P?P?p8̞{??رw??G2`?m?ׯo???D? ?????@????0-?ȑ#?z???ʈF????k?n<"??8??Sy?թ??Q????v`?n[ѡ?y?w`?!0?ө|??,??hA??m??#J??_WZM???'???N???9X?8? ?燓???ט\?h???|r?! DZ?m?y?O????xgZ-??|????E?]?)?S>?z?N?%I'???6}?٣GC?j??Z??8?X?X,L,! sݤ??O.ca]?HA?P?A???3?~R????'-?e?Vy????9{?+??6?ڏ޷<Ͻ?D?????QK???\?b??42s?????Y?m?L???S??(z??O #? ???RY???D?q???Z?????R?dsfN!I???~o????7?+?Z?#3+?XZ????????m??i?Z???????j1}?cLx`???dvf?C~???!?ξ??O?Ï??c??by=??Vl5?????X?)I?$I?RA???t??N"???? PT?0?٢E?(,,$?LR^^N?-X?|9?x?H$BEEyyyTWW???NYY999??a/^LAA??P??&???'(?} ?"?B?X?a?Ϭ$ ՛I??5??E?* ++u??b???JHF!^ ??n???k?????Љ??? Z??o?a??w??????nu?????񕾌???t?D?;3f?`?}???'?`????WT0??1|??ʉ???8׌?ɧ?Ҵ???????\?????b?~?m??ݛ???g????k?6?d????q??????Fu?(????b~??G?{????y晴?k???&M殻?RWW?.;???L$???=MQA߼?g??>? ~?0??ƾϜ????}??/;R?x4L<! ?F?FBD?aV\?dc?Y?LRW?p??KR?H???ڇ????w?C??Mpvk?,}????ڟ??e?'?^???E??♴,?&7??X:?,Z?`ɒj"? ++[R\?Gffյ?hQu?!??trs2??N'??p??L??? ???2 ++???$I?$I??Zg?Wnn.????5~?YSSC^^^Ӈ?yyyD"??Қ>????#o??vE?h^^?p???ڦ}-_V?i??',?J!?Am???뢐??rh? ?+*c'??J?f?ZX-?PU? ??lܯ?=u?ؑk?\? '??#?c?*? ?????*??x?M?ĉ?????㎌9??.??k????? ++??D"?9???2e????.v??~???[n???>?[n??#G0v?]??????ȑ#8??S???b???0u?T.??R=???t?_?r?Mx?Of.bY}?̖???o9????0q??v?a̙3?#Gr?=?0ᕗ??E??3?!?L??????o\e?^x?[n??????$#F???_?/~??M??-?漆k?|Nδ?t???????R? ++???/>m??=8???Knzb&?~?5???[?&?LRZZJ˖-??? --?h4JYY???TUU ??.]??i?????V??m??????o??!mC??}F?!?j?!Z Uu ??ŀ? t?CM? H? = ua?P??N0? ?O??????0?%?\??O?'Ob޼??b1F ???????%?1c?\r)???.8???ڋ^={6 o^VV?g?? /????????A\|?h:w??y?oY1????r??fϞ?g?Μ?s(?( ';?v??ѫgOڶm?4???}4ߗ?????Ϝ??ї?ϜX?v%?k ?s??! T?$ZQ˲?K?2~*m????????9>??j?1??{([?>y??/چ????Z ++EH?W???k?̛Ȓy??W8????"??P??$I?$I[??Ӳ] "yP??!?@< ++?l?_Ջ?:???L?*??8??x҃?9C??? Z?!(?o??U}??W????????????~? .??U+?u?ΐ!?qЁRRR?C4[?@?k8m?4????????RR݇x ?p+B?????ﯨ]?|?m??t??S?Jps?!ރ??)S????s?tZ?,????!ω???*F?.???G;z??#?i\? HR?|.K??EŒ??,?A2????? z}‹???D??K?n?VI?$I?$I???mt?h??A??\???Z&I?$I?$I?6???$I?$I?$I??6??+??9??$I?$I?$I??{???$I?$I?$I????S?*??I?$I?$I?$??Ƈ???Գ??{?oR ?:a??Mv ??}J?$I?$I?$im??I?q?`9Sn:?Q??ʗ???z?$??`6?A?u?(??oO?OMr#??-?o?4???ٰ[??w??o?9?Gf?n?6A ?????-#?|y?L??(~;?=ʃ????w ?H?%I?$I?$I??; {????^:????z?+G ++???cdaڶiEz???????1 ????%?Y???]?j??Oފ???~Q?????Ooͧ& ?h:Y-?P?s ???3???c???d??m?8?І?皹<>?o??˕\S?E?iWi?iGۢl"??׉$I?$I?$I?V????*?K8???#?U%?K߸??'ds?????????ͦ?V???o?TY????B?A?6??j}#HP???d??s? ??j*|?'o<ǭ????C????z?????z???55t?X?yF v??????a??O?$I?$I?$m?6>?\%?ѢK/ZPϼ?҉??)?هޙ+֩囻?䂷w??k??C?aU?n??Co ???????#?c??G?????? ++?????ќ0?7??a?^?????sM?NoC?????3?vߛ???K?]}???ޙ??????(&͡2VH??#9n?0J2B?0??{?e??L?_I$??n{???Ց4 ??Ʉ?a?k???,Dvq_:?,? ???7=?G_?a??$???z???? '_>???\ž?`???r?c1c?R?Յ?*?€=???[?]qn??w:??F?Qc????<????E?A??P?o??ᬇ???ʾt????D:%}??GI!:ӵ?ճ??Iv?9?2?f@?hN1:?_9?g???i|mT??L????gpx?????ي?g???????v#???{???!D??~?W??[ I?v1?hc??$I?$I?$Iڢmt??L?>5VM?,0Xp6?lN??V??i??N????|???????ͯVFMA??p??,? ?3????V?c?H?+j#i ++?? ?򱠚?.?z?+\??W?m\O},‚?=???ȭ'rוg1{???5l/v?Y@,??b?g?E?٥S?*?k??5,o??????>Jm)x?y&.?a??f??͏?t? ????s?#??ڹY[?۳k?8?~?eu]I[?M??6???"7???? ??0ݯ$I?$I?$I??? {??j??????f\}y?r2?u??$"???t?;? ?s?p,?V????????/?t??A??[\KzIr# ??ιg?FA?1??q?sCi??g_Àɯ???O3??'??i\z??dC, ++????6T?*m[????U???o??)?l??\?~V>C?l??~(J??D?!]%I?$I?$IRj??ޮzge???+:Ymy83???$?0Ͷ?$? ??ӿ0»?fm?-m?U???????5vew?d?w???|vQBq ++?? ???,???Y?Ѭ?p?ay???? ??"?z?{??tq[?ҕxa:?%???'??M[?=l0??˿???? ?I?x-K?,$w?=闻zx?????_cÔɓ??P??&??_^?TE???pd?,?h????F???Vʇ?k~???sY?n???I??}^? A???????r???DC???????}?^MΡ?1?]&??%?vߑ~?f6?t??A?K'???mر[!?????ӈ???ZFBy?lg?{??[?-????^??5;X??#8?Ǜ?y????Z,???????~??҃5?W/>?$I?$I?$IJ5??g@h??G????????m?Ҁy?N??I72??kx?>??>?Q2?'?w??=?˳w???z???????3 ++???W????R?L'?}??zw????OϷ?_(D`?l?Mm Xuy??q?}?8??_@mzk??r??v??2?y??v??<~????[?uȩ ?ߢi?A???ϼ????x???_?U??9??#Vmv??[???ۯ_I?$I?$I???PyY?? ?? ?)?#?՜Y?ж}??݌猪???????s?U??>??ۣ??????ײh???????I?$I?$I?~Z??J7xݍ??t?@mN????Xk?67?$I?$I?$I?~0???Q??????ܛ???$I?$I?$I????~T~??/F????m?C? T?$I?$I?$I??????F???O?$I?$I?$Ik???gZZƦh??A??$I?$I?$IZ????~?ߛ??????7w?TԺ??n?$I?$I?$I?~t?ᛢ???z}‹?? ?$I?$I?$i?7w$I?$I?$I?$??`?)I?$I?$I?$)%???e???-???º?ݖu?c??Y7 IDAT? 7p?ߞcA??n?$I?$I?$I???~??g=???7??0?e??ݖuIP??˼??????I?$I?$I?$)?m??gP;??? g{0???;C??/N?1????3???ˡ?z?!?? ++?,|n ????L????ꀴ?]V=?\>??o?'?4?y5?????Qg?Ȟ???? C?ٽ?$???:?p}?֜???z??.x?g?Rͣ?6???s?gHQ ?e?s????Tf-(?2???nr` s??ߛ ?Y|Ĭ??8??~????囯?濾ǮG??9??&??7?p????v$N5??:??ǥ???.???I?>u=7^z?w??/ ++fr??7?v?c???A??9 ?[C?$I?$I?$I??-?~&?Mgڲ??:????m#????`JҀ??({?h?>9?e{??Q0x;7??{?,?y?L>????nō;ȡ???ٶ8 ++?R??N?Q?^x??ޘD٨?.??[?ϡ?Iw????}J2???sxz???ٕ??};??Ӎ?t߰?&I?$I?$I?$m???3 `?cƮM4??Ҩ_???$@????ϼϴ?e$Ҳ?,A~e=?w?e?|"?̣?~-Lj?ѳ? ??|NY?L?=v_?mv?? ?/K?*? ?^?s.9?N??b??z ???x@??{?#???,UF?ά????k>b-:??t?T&?(??hY?N0u? ?[??,?d֘_2l?????ӗ??܊???YcOf??{q0??[T?$I?$I?$I??n???"Yi??`????e{?6" ?„?I?,y?2.???;?t?؎̪ϸ??k?f]??C@??Z??U??o??c.f??f+?"d??j?????9???9?+/KQ??ʇ??q???̓yq?g?#??? ?3????-I#J?H?8??xC{????\??7????|K??Ť??t;??.?y|???w???a?u?o跾2\I?$I?$I?$i ?E??dt??;0ṛytJ??陹?E?P???3?-ܓQ??0dmu@qzh???Ɖ?۽;??7x????[???Ɇj?5??%??yo?G?y)A2?aqr?4>\???G???y?H?rN?:kI?'?rڧ???'h?g'2??Ć?????=??s;??n??.?? ?'? ~ ?'? ~ ?'? ~ ?'? ~ ?'??k_??6?a?IEND?B`? +\ No newline at end of file +diff --color -Naur cyber/docs/images/cyber_visualizer2.png /opt/apollo/cyber/docs/images/cyber_visualizer2.png +--- cyber/docs/images/cyber_visualizer2.png 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/images/cyber_visualizer2.png 2023-12-23 18:05:58.571028978 +0800 +@@ -0,0 +1,542 @@ ++?PNG ++ ++ IHDR? x??sBIT|d?tEXtSoftwaregnome-screenshot??> IDATx???wxe?????m??SziJS?.(XVŎ???VEi???]?,ֵ??)? ???=?י?7??0??|?'On?Nyߙ???y?=?U?:???B!?B!?B!?B???B!?B!?B!?B?$?)?B!?B!?B!??S???B!?B!?B!??OA??B!?B!?B!?B?? ~ ++!?B!?B!?B!?N~?S????71??dL'?`B? ++r? ++!?B!?B!?B??5?S ?? Sy?鿑????s:?Z??~?Lͩ???"/?ѝH?T7??R?Q??֓???:ˍ?Cy??????8 l???G?W?B!?B!?B!D?N ?c ~???????舟w?u1????b ++ ++?qk???&S??~? ????t ++=:??F?????๱i?5/?EE?8🂦?%$??????:dn"C??v?8?I4?Y???(*,??ʇ??m=??pzy?S?ܿ,?=???x????~?Iַ???? ?g??g??VPO%??ښJX?}1^??????OQS??JL???^??Џ+z.??uU??Xs???d6[ ?B!?B!?B!????xhRs??{G>a??U???{#S????z#rF?{]ȵ? ?G?p??\2?~?G????l٢:΃K?b?M????c ???OC ??h?Z?kJ?`?gĤI?.|?G??? (?m~?X.8? &7E{?2??٬-Ri{?T?躕???A`L???Opn?????<???g?d?w?? YE٤!\?f????b9??G?)=?e_??'?>?c?ɷ ?ld?9??y^??؋}pD?\5?7?v+?W|Ϭ?_Pbj?YcF??????Ss9??1D??[z???Śb??^??r,?ry???x?r????.??g.?O???o??b?d2a?U??dTQjU<6D??m?????????أ{p?uW񐹈????Qq|?BJ׎$???G?8 Q????Qw????????'?/B!?B!?B!??Ĝx?3??6????*?=???#?Fs????o?????*?^Oq??D??3U͖Q??`?* ++Ͼ??{F?au%?$?B?w/?m??T???\?n?۩??8??#??4z?ї?I??(??7pFF8?K??? I?B??C??e[Ch9( ?p9?fNT??1?;?η?\?᳭??C#?zTgf???Ms?HFw??????G???1?8K????%0?? ~I8?2?Z??޴???Ԁ???5?v??\?e)?eڃ??do??????Oij&?D?e7y! ??n??Ξ?Ntr?߼g???͵b???JD۶DX??d??\R?\?`??n@??bE!\{fK???#qPލs??ag? c??$?lm?x?>l?V?7?߇?۸Y?l6NT?i????|z?nae9Dft *P9?&d???BR?8??????o?fv?Σ{?XL???u???g#pV%t?!$v ? ?????@B??@??+?֔?]ӕ??ؤ??B!?B!?B!??ů???Ma????z, ++(??N??EԎ7i~;??]G4PE?????????2????^?????C|??;lw?ZI????A??kU1???2???T????2???F?? :[JY???ˢ?Hr6-?i;?5F?~J?r??~???:?^?p\???Vnx?h~PP|?|??l?ԟ??9???1??W???n????Y??p0+??Z?5:?ԙ?SQ?W?-/???????}TZ?F?U??&?,?B!?B!?B!~3'?<. ++???E?J????۶????7%??W?q???+嬋??֋м9,/j????98 =?nc?>{=1@?ʭ+)?r4?F?? ?˫ wE???>??"??[6U4s?/?%? ??l?4?XSQ?d?????d????-?I???? jʖ?Gd\?#?!GNtZ???-???}?*J+?G2???S???m??KSڬ?(ݵ?Y?ֲ??Gyꊋ?1g+?T4sJ?1y(?^t$?9?????u???(a???j??"?d} ++!?B!?B!?B???'???2?ND???: C??M_?LU?Eg1rH"??u??X?k??Ug????N????Q{????.?L??>??Grzx9?W? ;?k~?ؼx??>??:w?Bf??w?]\3?t?u?L?3?7?H?~?}6 ?ƜϠn??q? &??8???ճ??m? w?eXώt?s.7?{>qū??????? 1=1?t?d??m?NtK?@?ٰ???????x????r??sр?t?܅? ?춡?`???**??/???}?٭'CƎg?iF???"?)??B!?B!?B!?h????Ԭl????? ???6???=ط?ӯ?s?Ń???? U?T??`???l?dd(_??-???{?w#x?/?ۗ^?3?2ν?FΎ2⷗??????`)U??-_??q_v,>?Sݕ÷۬????????-y?????΄?/??ң'Eu??`?? z]?AĴ?,y?|c/??ѷ0"B?S??????P??W?}C¸a??йh?\~?p???ݟf?»ϼ?e??1w 'B?????????M ^"?r??C?*9???"w'_??)???k?? T???+\~?Hν?1g?!6~???\??W_+ n?3???k8/5_?6?x?OV?ьS? ++!?B!?B!?B?f??uf??)D} ???4?х/??ٸOu{?B!?B!?B!D?N~?[!?B!?B!?B!?? H?S!?B!?B!?B?? eo?B!?B!?B!? ++??)?B!?B!?B!??S???B!?B!?B!??OA??B!?B!?B!?B???ZU??p>?%*2 ++]?k~@4]GQt] n?(躎B?oE9??? ???B??E???:??T??T??`????????%???B!?B!?B!?B?e??cسs'??????T??Q??VUcu????Y???`|????sPkU??ĖM????-?)?B!?B!?B!?_?b??Խ>+?-!,?p?.-???{odAN?M?Ѫ/???$f1?.5oE?7_??y#R?????c?{?-f???ң?%?f?BQM???k> ++???m?| ++??9?f:v??X!?B!?B????Ჷ???u??.qk??1??M*{[RRBbb" eoO????`Ƨ?P?` ???\?ibf{tPu???AN?!:?5???????5??J?S?u??Ӧ?Ɠ'ҡCޚ?_BCCy??י3g.V??f?+????????fs?m??v????;ػw/S?L????m?.?&z??W???O????PU???ln??NJ?K???p?]w??ĉ??ʅ^???NE?4?7??]?7x??S? Q??iu26?n7???g?Ok??|???ұc:v?@DdK?,?Pn.?? 8?nF???2j?%X,!?/R ~6?y?ux??dr2????*???????4???????0( ++F??ɠj?kZ???v?ø?ή????sٱ?2?????!B"Z?&Yc?????"Yt?}=?z??-?+?B!?B!Ф??ڙMY~"?ͤ??-!S??s??8???????oX?t)C??????p?\̛;?w?{?!C???? Y??k ???I?????OQ/??f͚?'?~??ysٱs'C?c?k?s?9??Y???F?ͷ???ڂ_3d?0v??ü?s???Ϙ5k֩??h??R?n??w?}????`Ȑ?Lx|??| C? %**???|??¸0?q? ??(??a5?????N]??????+??U?ud??Rʭn?n/6W????bux?9?W/??|??\??]??[۳3???=??i6{?/a????a??i7b0E?????T???)???n?C??]?>b??ŧ?;B!?B!?i???YRR??i???Ք?+--??V??χ???d2a4??lx??:eo?V+?EQ(++? 9?}?k:??R]?0?A?f$!pV?u?*8<`0A?V_?n??p?????????}?????3????>?-??cg-y<?}?9r???>?? /????2?o??<9q" ??g?O?q?ͷ???X?f ?>?f̘Q??}????f?پM??x}^?l??'?ŗ\B???e?߁??|j?Ƽy?ٽg??3n?8N??UU?u????? ?u??Ç??(?3???:???{?n?ΝϘ1??l'?S/'??ܯ?Ф?ٞS????????p?????????AU j0??l ? h:[?1?? ^?????R??s?:?%l]?>???D???h????B ?x<???l@U??:nw?@@?dV1??h??:?ҳ?-k?'?U/?#eP!?B!?B?S??????D??????'99???dHNN&))??qBBIIIu?%&&?l????'''k?E???3??????2~?;?y???,?V/?`??z?O??????@x88ݰ?E?r?U??0HRC?t \a?)?? ?'2f?W?^'??h1???[m'9KZw???+f.*?{r?Tc??)8?N?~k:3g????????>bܸ?0???S?H3f?`???xk?q:?L?????`$&&?Ӂ??? ?o??q??q??wq?M7??*??s?\?߉?_Lڶ}k֮?&0 ++??k??Φe? 2?&??( ++={?????h4?f??m??5?Cю l?kG?f????60????T?px?8=>v? ^T???O????O?ˋ?????????@??Q׷c?? '?y?Y???[L_X??y??d???y???F9?@HDK|?J??rJ?*1???vCqQnW%?????n0??SZ\Iey ^w!- ?@|??-k?D׵S?+!?B!?B???F?????iZ?LJ?Bj????X???=^?????,gS??????7?ϟ??^?L?q-_1?,f}?????&???`0C?????¾\(???6'?ؠ0???ifpjo??:T?N`???????/]ƿ??,k⠺??`7?? ??@?}???ݰ?J?I>k???? Y?Y?oQ??̛??1c?ʓ'1k?,F_v? ?|????y??&e????+???2f??͟ρ???Mx??ױ??5t?u????Y?~=??z $&&????/ἑ#????Y?(X?6!!?W^~???R}?1\.6??'?|?[n??u?ד??ݼ??kx?EA?4?-???O??m0?,_??????jc?w?j?>?6? ?͆?n?n???6?^?z???????G?%zR?>*??)????oN?]?*?D&?pz?x???.?????ҘpU??j????)?kw?p?}8?~?????n??Fl??v????ׯg[??S?*?W?S??3??og???ﭢ?????tR[?#?c_?U?X?*???TUV?ѱ/?-ڑ??NiI)NG%??4????? ث?OQ??B!?B!??-{k?Z?4 ??JhhhM?[?ٌ??TUU?( ++??ٌ?h?j??(JMK??S3?_p??Z??e2?8??;??????v?S?Q?M%??pn7???????=??_??%k?z??G!4.??n??? ?yd???f?SRIM?h????????`??????P?~ ++>_???C?dH?!O??P0:!Po????? ++P??E?xk+>#??XRӻ1??K8?W?&??+??SS1D?h????C3^aZ???{ ++??nsy?2w?Z?(??3?ؚN??s???DG?fϙ???c???0???jJc?\.^|?%f̜???=??7???)S9t?P???×_~??[oa֬Y|5{6=?`?????y???B9???G?ɮ???ϴ??Ł?Sy??4-???o??9?=??????.&>?$?|? ???`?ʕ???j29???0?LX,?F#????? 44EQ???FUU?~?qqqجUu??۷??3??1??\7??h????-?%??x?oNw?????7?$?9?KolG??CUiY?+0?? ?8??'9?$6O?]S8D?@X??`[G0+?0+?m8Dy?o?%o?????¡???Gn?c??????-d?˓?u??<48?c5?݇[???< ?}??7?#)T?Z?ŮC.??S??X????dz???ܹ??z>???{?????ׯ??wޡ?i=??o~???f3׏????Fll,))ɬ\????Y???g??KX` ?2/??D7[P??d??U?f??t:ٹk?Z?7/?N??Ekπ?iX??uTQ??M??,vȠ.??????+?uAjp^O??ׯ????}z??.?ѡmK?3>??d?ʼL*?: ++?*`20??????Bع????? ++Z҅?k_b??(;Ȇ??xs?Vʦ>?? ?Y?TV???????????D<.??????`D??q???uNG^?ŗ_S":, J ?G??r^R?*_?B!?B!?89 ~??vt]??ra??p:??l6t]??p`2?p8?|>?F#???X?????q8 TU?پ>޲??k??}7qY??꥽X?(?_??ЧOq??Tz-$v7\͐??o???J~f??sY?-?1???Gpŵ#??#??????M???"?Ox?%?'????X_?bm}??;?N/?q??? I?lO?N'?֠?/A??????yٗW??o ??ULz???<Μ?Gy??v??N}4?śP?EТ}k?>?k?ի?Q_hP?@???CM۾??X?6_p?P??z??׫?F???Ѕ?????f.???A璨8طt3?]ϾR?ai]|?5\>0??-????????"?-⭷V?'??J?%$???????G?>???>?.?]?.????I}1????hq?&??}??gX?#?Qh?놩??PǕ??|??u?K??$????ԛ?q`֛?c}V!?V~C-O;??;???? ?έ??F??n?֋;????>???9??t,qm?{?8??????W??y??e??*< ++?щ?u}:??v?M{?_|??+V2e?dF??????5kx????gzz:?;u"++???5l?l;???g,ݒKU?Ll?^\??m??9?o?h?F^n;tDQ???8{??,^???f?n?d}DD????&?sժU̞3??ܼF3Dc$? ??s??LZ?tZ????w?gk?9?N^???۷?&?Ď?Fl??ֳ-1?㏎?{ٰ? e6'no?Ab??*????P????'?ѳ]RB??v[???N?????$2z?N?$s?癧d[wdQP?ďshq-zҷ{|0{X?R?w ??P??1G%?ޭ??$??w??Ԁ+??????O?_?????[??b6sv?? ?֖/Wn嫵??T??怊?`?? 5?[p?'?a?%??H0t??n???M?-/b?G????_?????J7JX"?\??? &?<>{l"?Z???B0^?f???_??????'4??~???? Հp?q??v)?n????Y??l!??p9+????n?? ++?rBMT?@ ??h?5???6z^?þ?;??????Z?-bCv9^S)]/??{?%??+?e?}Ƣ??Q? !?ә\v? L6K֩B!?B!? ~??fL&S???M?0??X,|>_M???e?H-K?2EQjxܮ???? ޴??K?s??`Z??7c ??9??O ? ++?|?;?*? ???0????U???x&Ӳ? `?<~0??'????WCT#?F??&?????Y???J?Q7?`??32??R???Wʛ?: ?????|LV?\}o/?(a?ʹ???M????d????y??X?????p????c?cd???̯????????5#???^? c?2{(??K>?1????pc ?-?w?????A?m"???????I??RR?:?]?????I>?Z?)מo???Wx=??<2(??Y?G???"::????:?7o??}????'? 7/???;???`4a???/װ?k8????????ݹ???᧢?J??K??u?݆?(DFE?,?|6n?????m??????u > ???cbP??v???u(&?:?$%{5??+螐?ɓ?ϫ6Qߙ??J??.bW?~ D0??D?vk??[NI???^?i??-?O??M?E?ӵ{_?}???̮?7?R, ++BIm׃d????hO&??o"???$??W??U?f??t???8BpS?e{K??xLJ????Y?_?M????ԩ??m"j ??9} g??@?+???l&?K??u?B??Y??????cP? ++t?s+/?O,fƎ????!?0?ͺ,;?'E????b-?דm???h??????M??)??}????I =v?J i?i?????8U?nY8O? ++????dl?0?[?֮x??s?T!?`??P??#???ۇW?8 ++u0???z? ++??_?:? ?????gϚ9??W?g]???k??v?c??r???h????=??9?t???Ȕ?mî? ++|??0?? zWoݾU([~x?ݻ???R?z??m?~?M ?7???{%g????v?ۛ(h??ΛKvc؟?_??s????????_?g??j"6)??0?°田7?5m[?a?B+?Y?K?3@??????5?G[*?Y?K?;@??GѶ8?:rv?N???;?r???=?AD??l??E)-????.?u??ٟ?Jm??S?ׯ?'????8\>?[?G?>k????z??e???Ą??MJl8?v? ???Z?EUa?/????(????#+?(X?{?/???v-P֮e??<\%?:?+?????Kzk3?>?TYH?t??????+??Z???(???Wgx?????uЌ???k?k?<??2T????P ???E?7r??΋K??M?pQ?? k۝???bQ ??)O?|???䂩7r^ Б??s?0?'?????'z&?B!?B!~? ~Z?Vt]?n??d??l???N?Պ??8?f3??͆??5eo?^oM?[UU??l5Y?FÑ?|F???cR?K9????_?[???p?M<|?@??i?96?He????xcz??t??e????t????[*??֞a????98?w?xu.??c???KVr?/????$_ޑȣF!ut]GA=?,X??G????[??P????8?Ø@???f+3?렻??? t#??Xf?? ++??/??A?7?{?^՜??ϝ7T??`?h?i?ō?[??!W??S?IvP"h70????9ǐv??h??PW?? ++4??qe??>?9?6!????I?7???'??񯕔?Haaݺu?[???;??ݺ????]?ܷ?n ???????_|A p??Mkт??"??=f??'? ??c????z??̌??????i???C??J???i?\?T#a-?`}1?ÉV?0?C??{???;???૕;?-??7??=@?;??'x_$??[C?M?l.qc??ʽ7??n=?GM-?凘?̔??????? ';;???V}?=??b??d?d??e???+/?ʫ?ؼysͺi??5???k??5 ?A?+????GLx|g ?9?N?U؉??E!2"]ױVU?????N??-9t???????…??喛?U?y?????~?E.|?V-ȩ????8?:ǝ?|$?L?YAs{???C5Fb$?+l??????dU??PM|??C?E?]??2?????b???g~˜Z???5??????C-*/??˹R?????a.???l??E{(???u?)??SR?Ԡedx??ux??o|???B?:3??빺c???য়?M ?l?Zv???$?0?=̓?CH?s9=rWs?5-?ZK??5cZ???Q!?Q蔢(*???V????? ?ǁ??????qrx?O?QE5`?ābD? ? $????F?K??M?Tkƞמg?L?{1|?? ??A?!?=;????n??ٷ5???~8e?%!?B!?B4?F??111?\.bcc?`0366M?P???X?FcM?[UU????? ++?? ?????|??}٬??9T?Ѥ?=???#?h?y??x?W7?ѩ??U?Z???N?#`:?F?eX ++?/Vp?*? {t2??`?6?i+???\?NOu??$?1??3????z?]{zI͋?j??ozpK?n?v???FXs?0A1??lk?>bB???@????????????uXH[n|?:D??G???|{???5?)T????j`o??????ӟ?z?'m??h???(h?4????wܱ?fԡcGv??Njj*?Ϛ?c?=?SO=}TPs??߳m?6n??&??z!3gάwQQQthߞ?;wЩS?z??R?|1??b?'??7??R?,???3/Ml??Pt?8jG7????Z?DŬ???+׿΋3 ?q?8??L?;?/^??|?Z?t??Ȁ??t?\?R???b?$??w??edd?s?.?l?“'ֻ??d??d玝$%'?? /???0o?|???>??0????o?i?{?f??]ddԗ?(װ?k?b?v-S^??UK???י0?W??z?)_n?@???o?l?_#?j???g????dN????%?l!<:?????7?/?????7n?? &;;?????&BZp??hV??c??^u??u???/5DĴAs????SEAQT??,?1?F FG?p?????X£?u]W?Y+ ?j??q>/?x?? ??JmG??????j?b?y{ ++?^??=6?8t?????E??ߝRT,??G?K!?B!????$?ۍ??????r??z|??ÿ?|\߲???????I0z(;h???aA!$??C)]?^?/?ܾ?Lv?L$???؞??????뗱?ۖsZ??????w???+i??? ?)????3?U뙹?_z?X?"?3???j??׏?VSU?????|Q!?????ꈉ?U !??Z?:?;?^??!??I'?M+?~ |c????$k}?/??u;YkJУ;Ӳ??i?8?Ft_?ڱ???'??g>????G?? ??Ӵs?`?????b????c??fq???<ܧ(:l?P ++ ?ظq#??>????՛?????x?????Q?Q??? $֓?9jԥlݺ???B?r?݇X???????=Ϳk~&s_?p??/%?۔ס?ĞqP??U?H?m6>*?????e#?бMKZ???`?~?V??w?B/??G?K?x??\L?i????????n??C??t?R.??bT?菏V?Z??7?`?ڵs????"y?Q?l?̫??BBB=ztg??麆?s???Z????ģO?@{WӾ?tĥ?5,?"AAA[?le??-lٲ?-[???_?h?@Æ 9?m[.??bl6_~5??[????j?1?~Zed????>? "q? 8?%?)r???#4??C[?ox??d????mD??1D???????M?J??)=@?n???P?mT???????C;?e??]D?.??β]?H?ҍ:3????&P???Ě?̟?????&?HZ?>??/L????8??.;?n'?m'??W????^???{{?Q.????b ++P^?g?t?ڕz??۷??? ?i?O|???t?ؑ?S?????3?F ???D&M????Wo?????ael???ƤP#?Ai? ++??xb MmH????h?<|?k?1?PV??H'?? ?i??^?֜P?"?Ǭ?<6QavVd?`զ?ć8????]??DR?x????_4J ++?V???|?֮?t?h??0sկ??hDj\(N???HHM?sF?qеkM^?x? \???i??p8?X6???/??de~É=:?Y>K??`???FY? `?xW??ڵ?? ??&:Ƞ ?G????7?H&????!??? {??#?z֛̈Qc?js[???*_?3&?돽U?ā?a??0,  @iIa??q_i???n GQ?)x?cqz?Nf^)?B??ݘ??zӣn?a?]i oɭ????c'3??o(?E?ܲ'?_{)i???Bm4?р??kh?-?`??.i??y5??2??%T푴??I?N⋙3???O(????E_?-?????#?N???=??bO"i?T?W`ڤ?????f??˓(??s?KX?f)?e?0?B???N>??g?^:Չ?kˇ?????t?p:?86^Y???\???أ?K?[?᧭"??oBY??m>:??Ҡ????=$????????0???4??b?鳃џ?g??|?67????j??4??K???? ????~4?>???DbZS?;OP(v? ?? 6>???&w?V6oX????0/!?5Io?g???M??J"8ċ????`{Ʒ?$?&(,?Ft?{ǡ??[?;?Yn??o#$&?W?????c3?0???I>N?w֭[?E_???ڵk???gȋCX?䯅?].C? ?ߝw?????????{????N'?F?E??t.?ޝiS??'??i????8?~??G}??CӦMv?? -d??1???s?}??-??K?.c̻?)+?ӡ}{??? ++??????!h5e????, ++:???E?0?\U??6????p??6??6\;N???a?a7p?l??TfE??7M???_?IY?$?߸?Lu?j???;03?g???j??7???TZ??y3?#*:???d?N?? ?cG vg1?1$?y ??۷S?7p?VaA??9?3??r? ??_?s??N?BT8d??ht??f??"0l??Xe?A? ?K???????ڵk3tȋ?zۿ???ky?XR??????-?[???????#''?^}5?9??364??V???[?H?#"???a???x?;????%''????\s?u|??d~?m.k׭ۣM۶m??????6{?ϴk׎?s???k????s?ѳ'? ?5=z???(?ό]F?d?cm???? ??2???bq???&a'dv???U+?G?k???7?|M]??p8l??O???a7?W??5??fV???[X?D??c3x???'.? ?f??f??˖:??/???OwP ????nٛ??'? ??????".???????fs?tP?c#`ڰٜ8N?'??Y??Rߨ?SDDDDDDD?$:??q?fi?l???w?ū??f????r???U~M?=??0?P ? ?;???|h1???ۀ" ++???3?W^?.?? ++L0??J?????z???֭?<>`?\?7F?1?+????#GңgF??G???pz???]w?Iqq1]/???? D?޽O?Y?|??u,???7l??o'8??]n??^)?8???*6o?B??=??{̚?=?=?8_}?5?ir?E????{?3}?tF?1???TLӤGϞ\?ϫ????q?G{?:??p*???v{??曘??dY`?N? gE?i?,? ô??&N??a? ++??????랰qr????o??Nr?˸??vG????$?t???yՇ$?x??k??D?݅???fwc؜?Á?????a8???3?C?z?$!?˱?????????T?A?ޖ??0M???,????,kw?[˲??????RTT?G?????ݳ??n7yyy{????? ??>1gy ????k@0?J!$ ???0?_ ++???Ҁ?? pP????\`??;7???쩪%+?0a???EEE\y???z?ʹjՊ???Ν?a?HJ?n?:,^??7??ĉ f??????T1~?x ȝ?????ob˖???-Z????} ++˲???H?֭???25?m^}?U=??|??,??#??, ?4Y?t)3f?`??ջ?Vn?KZZ^؉??????i?e??O?ރ-????V1?? 4?ۜ@???R ????J?, ,?\v??sY???ݽ?_W?Z????Mg?????ԢFjW??|_y??Q;?I??p:_?D?^??3?:Z?Ii?vf?B??e??? ???6?wH2aQ?DƟ?;$?P?/"""""""r?8h?)"""""""""""""r????EDDDDDDDDDDDD?ZP?)"""""""""""""Ղ?O?~?????????????H???SDDDDDDDDDDDDD???"""""""""""""R-(??jAᧈ????????????T ++?EDDDDDDDDDDDD?ZP?)"""""""""""""Ղ?O?~?????????????H???SDDDDDDDDDDDDD???"""""""""""""R-(??jAᧈ????????????T ++?EDDDDDDDDDDDD?ZP?)"""""""""""""Ղ?*?-??x?CD??V?A:?;v???DGE??x?G&""""""""""R????v?*???Ͽ?????,c?R?5l|??qT~?5c?? ??c?I?????????????????eY?c"R?U??F???`?DDDDDDDDDDD??њ?"""""""""""""R-Ty?'?`???`?o???????????? ???"r???!"""""""""""'??O9?t???????~???KS?׭????D?1*?U?)"""""""""""'????XU{X??q}?y?U%`R?i)???D?U?myKg???LJ?*???z?r? ?r'?r?>,?2????w?Mg??|l?)???zn??N?????b?3=???6O"?4*_??qKξ?"??8O|2?1M?rGz0????w>a???9c?ۮ'7??Jj?V)?f??ȉ??2?{X?:????U7`?n`և?1??el*0Mh???O7???1??k6?]h??i?]O??f?C???V??,?b!??7???D?u"""""""""""r??^???3?????ݪ???q׼??;??ܱ?;?:V??w0?W.??C??R?| ++o}?C???p?ȓTSD?,0???`??ٞ????}c??B?C??7?z?`?L???F????W?`U??s?c? ϙ??o???| ??)?m?2j?Knc?95pnc?#;V ??^??j??껸!?I????v?6,d??|Z?p/?j?+0?j`e???|d ++?,?? ++?EDDDDDDDDDDNG0?s?e?Qy}? Ӵ0 ?????ڣ???$?f??_V)Tn??ܱ?R??N??G? ?N"?ܻy?????ێ??PSD*X????eV?]???M?<=-R= ??v?۶??+kH޷??o;?????~??r{???%닚?V??€??&?i??A ++u+?(????9????i(?oŖ?P??lI???7?????WZ?SDDDDDDDDDD??Q???4?J*fQ)??p??[)??&?????ʷ? ++J???UB~????_EV-q?e^gUG/"'?>? vUµ??r???a???UBւ?d?d?M?T?ُ?ig[q??5.?g???y?~6?݉.]?оa4N#@~?rr? tH?#p??]???A?^ە}????????????>????ea??KeQ)??????ۭ?V?f~???IM#?n??gbw??|?+׺??? 7??E ?岟?fꗌ??.??A???2ˣU?:????z?769?A??=??5c??3:?k?-??J??J?[??iYX?H????m??????,O??9m???Q?e?=?V+?ü?H???J.b?F`|???i??J???u?~W???Ӵ???????-9+%?P?B~X[H?&!{???vl?"???4 ?;?S?^?????,???e??j???}=K???K?I?ٟk??q???????~?M򺷣n????-?H?@??`̜yL??V?X??\V???t?"?a??ً?????a/??Z%?ہ??94?ve?????EDDDDDDDDDD??P?5?- ???X?ܬ?l?Om?0𶽕k?g⸡?????R?5$?????p4S?|M???Hiz??f?䙼??'?"k6????$܆????o??0??/y??/1nB"Hi؞?t?C?p??m???s?????????Sb#8:?6W??SZ?????e:l??g "?V??q#M??"????(??⫉?1-??;2?s?lEc;TD?{ݱ?ܮ?SDDDDDDDDDD??a????g???N?Vm??xD??ټq=5j?>??8B>6?? ٍ??7*n?-?6mz??$""""""""""rf???9??U???5?D??N???f~????????????N~??qw??7,??)""""""""""rQ?)"???{?pR??عp???????????????*?????T??"""""""""""r?U9?t????8D??}CDDDDDDDDDDDN?*??_~?????TcK/:?C8*q??'{"""""""""""r?~^????1?S?O?f??!????????????a????????????????? ++?EDDDDDDDDDDDD?Z8 ?????3r? ??N?X??????? ?????c??N???O?/??????'{, g????`3%???????????????H?wJ???o+?|??x?t??N]/??=??O????<?O??????ߌZRȞ?Q??ׯ???C?(9I?9?9??333?뮻(..޷3??#F???? >x?^?ZB??zsw?ڄyl?c+wذ??q?? .??G?$??'?,?y??#""""""""""""Rm??3>>?+??????? ?޾d?.?袃?Pʚ3z??˟?????????m?ۧ?? _?5?#"??=o??k?a???+?Q??ɏ???ow<ɝ)&S^e??G}?5??????הydX[????????????????????ȩ踄?.???}?2d??n7?W?????\???g?eu????)????=?>/hG?h?L??3???\M??$?]G?W?M?œi??pQ?z ?a۳h???VMHX?3w|?KZ?0??Ip2m?jS?G ++???0???ڱ|?"??F?ϕ?.?)u\?Ow|ǔ?7qo???ފ۟???;_dФz?pe??mB?q???~j@?Ω?~k???0pŵ?m?t?iN]׏|?p&-/?ʹ h?ӿc??????ML?ޜ???w?K?????S?Y?K????+???B뷡M?zx ??K """"""""""""rJ9.?'@?6m?[?.˖-#==?6m?r ˂֌=G8 b??wfQj??p?F5?ՙ?ܡ? ?ȏ????j?????Ї?K??}(Y???? ???c+?A??ڂp?)??Կ?D?????@>h>???xݢd? F???7???Nhp%?????? e-??? 7Qq?????l?|??q???:???L?E???u??w:???G?E]??G.?؈?????c??F[????????o߾???R???s?o???5?V!?9mV?3????is?=?awc3L??0????kU??2?i?? ?[/???8Bp.?]??q???&2ᙾ???*??o?j??????????????)ฆ???? :??????!(????fִ7?deSnh\?I??#{?:|1??ӫCy????q???j??ׯOx`6??#???????Z???Y?{?(λ?!f??C? `?o6 W?`???{??[k/&Q?C:??P?Q-??ǚEb;'??7?Fp??\q?Y\z?(n?;??\ˋ????XDDDDDDDDDDDD??r܋?v? `??~k???1??sk??E??I?يٱa9?vv????? N"?'??6???7??f??}k?~???U?v-W5??O=??7???:^??ͬ?k?e?%??|???g???3W?????ؼm??`~p ++;*?O[H ++???|??G|?:??09??0 >??aM??GM??{???7ҳm-??;ٴ??щX?2?????M%?SF??U?&&XuoEDDDDDDDDDDD??p?%[6?????k4?>?}??~?K?Dt??4?Ԃ2?PG?{?Z?"o?}??v?b?B??ԦE??f??3??????#????|?? GD"?:נ?????$????ח??剜??݄??? o};?;????*6y?p??;(yu???????H??z???? ??*fsF????ڀ?2????S/Lc???EDDDDDDDDDDDD?x:s?O???F?޷E??F?w/????&|˪B???}Td̜?ܵE??<@????a?fNt+""""""""""""r?E????>?ӷ????????????ș??????]u7?\ш?I???x??q?\?Iip ?[??J??䑫??y+cFv'??;???_???3????JmK?;?sm/v?l?? {?S??????\?g?舧8?p???! 6?P??R?E7n? 5?TDDDDDDDDDDDD? gD?i?-??e??nK? ??????.?D?J???(??Hp?w????T>?2+R???'ڑ??5?ex??o_???????Ǹ???????F?ǚ??X?s???ʫ?f1w?<~?n*?v?09??c?8s!+32X??JP?BRh?g???ͼ?ddd?????C?b??x*?g??NP|??????u?;????????????????Z???g??g?4?ۈ??uf??^8??־??c?஝??P?1?i??l?xh? ?>?O?-YŬ??#?o??d?EDDDDDDDDDDDD?gN?i?b?H????ݨ??eY??фoYUh???OKf+&}???w???c?3?~Z?+?x^1I??#?y??-""""""""""""r?8C?O???XTZ?^?cq?1}??????????????9Ό,??c??%?R?rN??Bj??۵???s-<?m?7~@???(??U/q???q??ps???iC??G?X?9?? wTm{??׶!?^q?eY???K?3?w??@t?t2????9?Έ???[?????ݖh;@??]ͽ]??t????Q 1????ro=??? |?eV?^?mO?#?-??j ??}??,?p7/,O??-?qg-'YyԎt?3??W??md$m???K??? 4;??ae?s?aag?9?ni!??L???????r#? kK;ٜ???c݇?y`??\w/O5&?????l2?fP???8?????$;???O?`??O??1O?d?1??b5F???w??F??G?е????Q??4^??;&""""""""""""r???i?d?? ?z?2?"j ??p?F5?ՙ?ܡ? ?ȏE1[?ƈ?M???\u???-[?N{]??????Y?o?ɤ_3ز?g??????u?>??ps?t?ݏ>??pY?\ֱ?(???5E!4?T??9??puN?????-?????=8?4?u?ߙE? ? ?XB?s?q??DDDDDDDDDDDDD???L?N}???|???????X?s???????s!}zu?I?T??7$+" "??X??-?wp\;?I9K?*?J?v???'ܿ?o?,?3\?????B[??U?[P?-?z k|XW?Fp??\q׳???5D????? ++qF?&9????o?dWS3??nŌlAJ? {P"??b6????p??gT+j????U-C9f?w?[?'????V??w??N"?'??6???7??f??}k??c??5?v?2????K??]h? o?Jw?lt?????熍??.?g;Ks?}??!(?Z??h&?|????N??P;?(mܖ??A?/?ę????[(9T?X??i??'?n*1?22筢71??????;???}?g??ӽq0?~????@???? g}z??x??gy?ӛ։?Wm?? ++?8??&???4??0???{?U??q??3?LzB $@(??AA@<?"VT?W??HDz?" Ez?"" ?T??T?"=?$??df?DEMA?&?ﺸ.??g=k?5|?Y?r?L???xX?q(??>?????????????ȍ(??gn???Z?٭*???~5?bNNd??a??r6g?B?Uڂ0??ŀ??Y6s)k& dv??W)?k6 ??J??R?c?????%?Z?????o?Jԩ??S??s0??N?2g6+?bM? ??HZj??}?????|4??e:pv??78?ׂ?ڳ?8?y1?f?'?j?#(??/ ?{?+:L`??mf0?W???Q.??^?J?V?????3d8?&?d??A,?2??H???򞵠ݯW???$???˼?1be9&w??"?S˧x?DDDDDDDDDDDD?oÐ??t͍J???I??-n?|n"+g?w?????_:?h???|YLk??????Mx????Z?5n?lDDDDDDDDDDDJ????k?????i?c?gp???nw?x'k??????????????P?6??9??u??$?T[DDDDDDDDDDDD??*??1:????u?J\m????????Eᧈ???????????? ++?EDDDDDDDDDDDD?X(Q?gv??,[?)'????El?d?? ?'2p?*?Zo??"""""""""""""? %'?t?sx??l???d???&|?{+7?s???j?????m?K??????F?????H9?15???Ą???#?ڕIp??)e?s???6????|xN?4EDDDDDDDDDDDDn?~:H=??}١Lu/??=k? ޝ??v???K8\Ch9~}}>-bl9?7??????'Iu*E?&ӹ{{jy?????5L???-?%?m??\L? ??f????1??-It?]??????F?? ?""""""""""""r????Ӟ?#???Y?+??~?^?????ř??gʬ??E/?W? ? ??g*????uX#?9????? .7\?`??Ѱq?f??` MϩR.?'?`ɡztч?^V.??L?? ???P+?x??KSh5b:O|?&??G2h?s???8?.?N???̘щ???Ȏ? |?? ֶ}ݸ,??t,?.??)zl{?w??c$?????n????/???՗S?>?3??,:???g??z??2??6dq??Wxm??_I? ++v?~?63??c?t/??SDDDDDDDDDDD?$)᧝??+9??H??~y}~??7jF??;?*??c?+?ݗDn???>]?^?0tD7???????}|?á?m0??([??p׫?-dN????ѧ?kW%? U?X+??o&???#??7????ɓ*?P7? b?Q? ++t????>¸??q?7?1?ky??f9?翘?7Y?xutO??7u????.????1ތN?lxD֥n?\ ?7?#u?s?-o ?3?Z?ս??????4(}?#=??s[?q?~??޿=?%?.jz??;?iT??????t?w/?۶?u???:???nN?g;? ZM???=ׁ??4l??SDDDDDDDDDDD?)???-?V3RyPM???????^?{???_ftL0n????x ++??>c0?;?G5`0p?s?|S>?)? mQs2?Ӄ?+?g?????at^R?????Tؕ????W??|?v ???E??a???π?8??Y?ol???l????g?bE???b?jV??Ʋ???????Á??E?k????O;ya? ??????wg#q?jN8E?hu????!??S????CwQ="???*??K?R?~ ????˶?5???=i? ??6?<0;?$g\}VgQs??ɻM???[????r??+N??w??R?? ~??MR?h? V??*$?-?5~R? ????5=????J???0?}́d?????}??dg???|??p+߀v???????)?~J??W?r.????Z????J??s?睊???????????H?R?w~?&????X?w!????ьOtN?7???h??%?$s??z??????L?;??g??j?)ϓ?k>g?̽w?j 㧬???xq?ɹ?_Xm0yFP?;?us?e??>>iH?zх?ɑ?ɏ?秠H??:????Lp-??????T????׻; ͣ??n?p??|;?.M"??=Ɔ?K8??/?????g?????? w?Ƥ???|?n?f????_????h???????F????]????7' ?5?ܶ?W f?????^n??9 ?6'P=oEDDDDDDDDDDDJ?b~?&lam???ݪ???6@?-?0??D,?/gcp??; ?Z?-??] ?9?e3??f?@f?۱x?"?f???D????'???.a??Tlf|KW?N-_? ++? ??????k ?????W???Т?9?38y?K?ΚN|? g?`???`???p???g6??????|?i2?f?͂W?q/j ?? ???Y0j힄ƴgp????0\ӳ???F?&??:??o/aސ5????lܑ1=???{jG6/f????ZMxE???!t?t???? IDATD?0???3Y?v#V??k?#??T{Pᧈ??????????HIcHIN????????I??r>7????;???p?/Bt? `q???d̓}????9<ts??[9??????Mx????Z?5n?lDDDDDDDDDDDJ????k???&R?86}v?:??t???;Y?j?tbO?#3ߣK?XJ?^S?Z??b~??[Ϻx? ǽվ?=e'?????????P??b?T?ݳ?5?q?[??CmoEDDDDDDDDDD???x ?!"""""""""""""r?(??bAᧈ???????????? %*?̎??eK??d?5s*????N???a:?'?'>?N?EDDDDDDDDDDD?ƕ??ӑ???sX?1g??N?????-?y?틼s:??yz/۶????????>??.mx|?w$?G6?`??4?wfF?????_??=??????????????????mPb?OG?V??$??ݔ2????3???Z?R. ?c?3|Ξ+??M??X??R?B )ㅓ?>???C???EJΦ?[??""""""""""""??ӝ???? ??J?e?ҹI`Iy?dģf7&????9????dm?A?:?6w??????????????ܰ???S8?r?9??0??#????d????N5?\?cF???if????H?u?/??y?/O???X/|̔7װ??3\L??\????ݾv.?x??~Ķ?q?T?~???o???G?????%9p.?wQ?bL?p\ ++?{2;??f??'?aw& ?)?<ƹ?_?u?)??%??3?????浍??r`?Lf????Cc?????w?7Ï"j?Sٻ?Mf?#??'?m?$????_???M?Q掚?7????N?ɛ??mi_3??}??}??q/O?G{??S5??ۻl?<κy3X??^b3]([?9?????t??Į`??????ySs0??"??G??ˏ?n?? |??9? ????Q??Ù%??r ? ??1??`LE?*?;R?F???;?-??????2p???r?,Vw#??濽???ϐ?\?*?p??#'P}??x?&??{Sh?c(?b??????????Z??_`@?p???b?ܡ?H??>up???aS???H&6 Ŝz??f???j?$v?^b??a@?x?????Ә??N?~? }?,???fN???21?>gr8??/}]??3?]͍???3kL?0???F?E??F?????ܗq?4?+?1??鉑??? 8???^LnDS?y _????h?1???+Fl=@r?P20????<4?A?F^?YZ; ++?3?0|?b??L(&??P/???????~??&? ?;?;?s!aᔾ??G??"k?7???O?z?쪼?6???6?_?U?u??1P????????n?-@e????}???j(????h?w?J??W?3?F;???EGy???7m??J??? r??????K_NlVm???B1??#,??????????#?? ߘ?ԯ??^Z?]2???L??? @$????q?J?g? > ??4? ???o?????????5??(?{???ٽ?(??G??cl???eS0?*y???ӏ???W?????ON!C?????˰]??_)Yɲ?5q''2ܩܼ?o-u?^TmYc?NN????D?c??|????r}???im???g?'??s????=v3???? )?$??}????=??*XH?i??????_u_L??Ƚ֧??Z?+??;ȸ???mZҢE Z?????#3;? &?Z=Gs?=??ؕA3>dGl? Ğ""""""""""""?l?~??-?V3RyPM???*??J???֠?4?M????+???Ci?E??5 ?????p.?C#??p??~?????c??C???.|??;?ɂ?`?f?%=5`t6bp??vN?|???????A?9oA?T????M~uM.F ?\?>?g??????Q??? ?=???K}c??u?p.?$cG???'F ~FL?? XX??_̚U??z ?{?`胥0??ఓcwpmt#?rEDDDDDDDDDDD??b???F??՜p???꿴?5??W?9?=?_ʻ?s???d??K{ ++?7^??[? ++?׳??E??? w???K?WE? ++?JP] ?{??,G?????{^j0?S??s ????1?l_?9???>???.??RN?U??????XDDDDDDDDDDD䟢x???M`뇧?T?B??o??k?????_?7??3p??έ?1????????? ??r"7q+k??????2%c7???|?w??Y΁D=0??????Z?0?d?T g?Ǫ?H?2?Q?w?_SZWv&??=|?d'3qX| ?nK?^?h?g-z???i? ++? ]C?Â?*?T?? ?L?????'????ܽ?7? ++Xc??"""""""""""?O`HIN??lߞ?4i??V??&?rvyg:????C?v?y?Z?g?v?&??J?{?F??y6"""""""""""%KJr?5?[|w~Z??????????8\?g??Tl??E?Fg|CB ??q?????4+IgN?P?A?&ײT(?^?????m??sn=??=??0?;=?Bd??~g???H?’q#?q,?NOEDDDDDDDDDDD?o?䄟?tϟÒ?8? wz6?v.ọm_???9????{ٶ? 7=;?Ƶ?&n??op)?&???pdDz??mI?]??z????ƾ??;<3???~:ҏ?jW&?m?N?????U???r?r1??5??s?p?7^jm?O?ō?1x<???驈????????????-8?? ?R?d_v(??????AFC?W?C?k^?X{*??d??????=4??????-Cp1G?;z"??r?r?&?F???+/?? ++.???y??Y?_4???? ???x??3???xwz3?(??=?? ?d?W?r?|?FO"?Oa???a???Xؼ?M???ө?A???????w?u????$uKo: ??3???D??????oy??H2?/a?XOo`??KY?? ?Υ?r??ܽ nEm?????ټ?t Oőlu¯ƋL?Ў2?dv???9l?H?? ++uhݥ7?6 ++???k?2e[~J ??K????emǙֱ?Z?bQ? ++8??H?'????f?H? ?m???}| `.?#sӫR??(?b?D????Yu?Fx?z?????ғ ??y?? z??IKH!?? ?4iםz??????~?d??@??#??i????M?A????NN??ʞ?Φ??k16???1????s??#a,s?????Z?M??#}??,s?yΛ?)?˫=???{??~?}k??s??gOc??;???.?}?4?3?9}:C??0??P???????Yt????bt57?[ά1=8kX?????ٳ????1?^??̆ys???3?v?b???B'?? ?#?\J?c??Բ?k?????;??=E??? 0???W ++????ΥoF1??˴zy?E??w??K??_!kU?ʃ??&?ՏI<? ??&??]y?F??Qֿ???r???,9yհ!1Ay?Ϟ???҉??#? ԫE??g???ggp_?9?l?D?ԧF?'F"???g0?\*?z1Q?M%?-l|-????q?ĄÆ????C ?8???????t=yegi?(|???E?v??\????ȌO?j.Mt?h??? ?j?T?Z????P???~??k??1?ӟ?'?t;88??|??STw7??K?BDž+9?C?{ѫbr ?A?:??}-??0??s????n?Ka???????|?9?vm?9??u?[-D]?pe+?z?#?????????????????~??+?b?@m#`#??^.??iUɓ?68??峹s?p?Q?_???a&-?L??Qp??x????ߪ>?n?t?/? ????6>?????T?-?ݿ#??=H۶mhY?΅?0̟?'Nr.?8?_)G/?ek?NNd?S?y??Z???ڲ Ɖ;9?։P?G5` ???x???׾ ?Zj??*??Z#A????'o0?cW6>І?m??n9????V&? c???؟܌?.??xWekAis&{v$?qq=۬?jD?f'.d؉v/??m>???nN?g;? ZM?j???O?as?? ?F?{Qw:?m?ҺYU|???B?ۢ??.??Xu?H?A5??˳?+A??rGG?&?g??y???4?"?????vCsp8?㡑?h?wk?X??^?????L?{? ++" g0Y0???????F ەZ?|???????A?9oA)?u?"??1?7g?š???c֬?π?Kh?{C,???E?? ?????-V?M"??G???馥0??????d??x??7Z??????99p??ym?"?މi??#??g?bE???b?jV??Ʋ???????LF?{???jב?????????????kי??S?Hܾ?NQ??W?Y>?`缰҈[????8N????OY?S:??(?? ??Y2 ++?J8p???'?+???7a?b?x???M`뇧?T?B??o??k??[o#d%??1+6?l?+?uyr?+????K-T?0?񖷙??^???G?h?{u*]Zb??v??3?״?=v??¹??du?lL{"[DY+???????????Y?H??a?%4?-}{?K? ??ӽ?1w?4?j??{?~T??k?????M#7????oH(??5??7_??&""""""""""""?@? ?sέg]????~?'S?̟?ҳ????\4???w?n???????kS?DDDDDDDDDDDD?8(?moEDn???s?J?[?-????????????????m??SDDDDDDDDDDDDD???"""""""""""""R,???3;?s?-???Y?|??MaO??GK??1??狎LN|??9??!?????%??6ޟ????l7iD+ ߼ǒ??j?IC?????????????Ur?OG:???a?? ?M??X?N?3???6?fS>??8??{|????0??z????ƾ?k????&|?{+7?s?MJ*?ϰr?B>=㊹?v2O?e??3???ܑͅ?;?v4 ??""""""""""""?O? ??GX?+??6wS?| ?/?{???(?|n?u?^???????|v??5?:?1?\?????p)??L????9{H?+)f?YV´?.^S?-""""""""""""7G ??Zɾ?Pj??m?lK??U? Ty??%?m??eq??-$?˿?-wz2""""""""""""r????α?p`?~r*t?aֳ??#??5???:l7?k???+]iY΂ F??vN%f`?(K?Oӻ??? IDATۿ)?b?̣?5?????? ??*?l/v?_?nW%?6w|?I?j ??}????,???Owr" ?+Fg??>Shm?E??z_???Ȝ?? ++?aׄW???츔????z?r?????Sٻ?Mf?#??'?m?$????_?B?`O?????Y?5?e??S?????ڽ?8?S9?f&?Wm?`\??1??tw?o???:?b???9{)?k-??b`uWҏ?e??|s0?l?`?D:H?_ݮ?J??K???????ѿ??u????x ?2N???[???3ؒw?l? >?q?˹.??5??؁???R?O?i?xܫ???????N??.;S??,_͞¸?&???F???*-?ط-??&Ҏ~????T?9O??)?"?v???1???$?ە?x??Gɜ7?ve????~x ++?]??eG?f?b?G??؏?Q???????j??׾r?/?????0 ?x[?h???O??^|??8???L?5?????(?????αo????S?[?C:~?0??r8?^_z/?H?ǻ1?v) ? dFy?D????ϢK?}???????rf???Y????ǘ}?o??ڶ??Ŝ??%ԅ܄u ?3??a??:?g???p???v??N???o~?c???o%???Έ?wwo?c?_????+?-c/u:?w?^ٶ???~8?????:k?ѯ3?S?+ad????V?#?Es|?p?????d?y?????H?R|F?jԯ]?`3DT?Ûq $,?Ҧ?~???M??2A?ױu?f???#?x?}?}???? ??5?????\???T?7ADբ>$""""""""""""y??i????G1D ?????r?0əgX???,??F?\WN??+ ??e沍?x:?T?? ?????1zU??Pg?w?I?Upu???ǜs???Hw @Υ=?f?ٸ4?4??k`Kf??Y,?|?㒱Y< نoF.?}???|O??8??N?=????Rk?NNd?S??U׌^TmY?ĝ?L?D??|drag"?R??Y@?????e?|h0???zʹCN?f#/??3G?V?ʤ??M?ҡև:]Z:p*/t????????Ƅ{?+?AV?&?ZɖC?\?0???AV??????? j???y??????6?m{?u˹???yEDDDDDDDDDDDnH??m???ꘑʃj❗ 9p?H?IC??y????]??[???????%?t?Ais2?&??\[a? Mp??X?????????{޾C???G??[Sh??۟ڹ??^?{???_ftL0n????xJ??V S?{??G?sr??_??W?g0?{??8N??اC~?Y ?}*?[? ??J?f??????/????\q?[?????????t?6??? ++h6?u????????w`/*???!u??D?'??֢q??`??Sda??? Gv"?W??????d"???_? ++?ᕨZɃ_7?L??d_??w9?ɍ??R??%???`??Z??4c?c?پ?s?[ ?_DDDDDDDDDDDD?(?;?s???i,ջ??[???4?U??Y?2??Gi\?C?9N?Ԣu?`??k?b?,???????9?)?K??3?p'???6??Ո??~;???Y????y????ܙv C????P? ??YEDDDDDDDDDDDJ?b~??[Ϻx? ??v?8ɚ?)>?/?:?????̻????{???Z?>Ut?'$,???ۀ????߮>?/ ?l???O?ޓ9r?A??Y?_??8?rԏt?p/??? ??P?Bq?ê?:?????cA?uɱщx?'??Ű?^Xcg??7????IR21??!??|?q=??.??er|JcjNp&??D??7sv;f?????{????բM??? @6???0|?68E*?x? ?X????e ??)??ПQ?#?d"F"???~?Б>ks?? ??[?+K???v?V??? ?f˱?6?e;???H?g???mjy?e2;i????? I???@?B?π???-??r??{P?s??n??̓k?4l???I?C?Vz??m?S??t??,?m????!?ɏB5:??͢[???M$???/????T?c?e? b??C?_?2bb+??O??????׍⽦3?? +??ӈ?MH??L??h??e?;_j??>???/??z?'Ӷ@"ߵ|?I????3 ++W?ұÙ?|?????N?V?Q??F ??j??5hH;Ę???@,??_ ??NpTM~Ҋ? 8c?F??? 2?uϐa?!_ن??Y?`S????????$,W"??R?V4??)~?5??g??????NӬS,x?)c}{1?_y2W?b?DDDDDDDDDDDD?E?iK????????~??~????m????G=x>đ??????o??:???????d'?~HW&Ɩ?n O??(Z???????ąC?=?A??v??}x?G_?w???\ ++? K?̠? ???^??Ma??? m{??1??b?u?n??ֳ??v??????$??c?ّ"?P??'㻏ds?w?2?y8O??L?-???w?ՈN?Dᑝ?﫦1?gk?vO???????%p???x?;+O?o???H?M?+?(ZDDDDDDDDDDD???1?m$???{Aڗ???f??6?E+?b?(]2????m)?k??~)????#~f'le?a#E????vs'??hl7?v?O?v@???pp??~? ??ƿ??8????9F???U?\??3???]?F?vp????~???ǫ???5?j0??͂7d???u$???r9??l?^5???~????0??7???:viK#?k{?Ŝ?.???-0??T? ++?bt?.???7?.=?c?ي?mJhNb?????c}???o?8E??v??5?Ɍ?`?T??D6????ʒE???Mk??j@?A?Q2?t?&??s?s??Ό?? %,?????Po???KDDDDDDDDDDD?a?w???P6 ??q?!?7Jx???5?p3??8?qMhh?-M>?tbwg????/?F??#GJ?Hغ??Y7=?$l=J? ??V???D.J??t&W'??L?e?\? A??0$???G???O?? ?L&Wo08?c?[IJ?ُb³H^?q?8|????GXqԂG??x???0?R `?5?S???/???#??~?-??k????"???@??? ?;??????w(O?2???~????????????<,??Ϭ3lXp ?-???????K??L?0?9k?Kq?D?m?y???4???6?????]?S!׬󜈅?u?`?C?w?bB??t?6????q8???Gӱ??tB???a?*?~??? ++?)?O?f^??9ϓ??M`???x?D?鳄T}??ޡ???کIoנ?????c?)?"u???\?MJ??_~??f??j!/H?IbW??M???? ??}.o?M??`;????j??S? ~????`P?hқT!8?w~3?????Z? ??N??5??q ???????1?q??OU*@1?,?O??rǪ?{IS??`??;?<~e?g2?g,!??"???8?|5?4yDR?+??c????$?N?\?&?]??8?7?i?U ?՛???)?????BaZ?[7 ?V?s?j?z?e?v?Q(g+????N??^??&e??,x???\H?6?Q???u.6????ؘ'???h#>u?S??b??x??yX_???茻??????:G??g 9?????0 ?o!??{??????{0??f淟35݉????Ԇ?份?ȻU?6K]|??????ڷ???r ?? 1l߰??ֻ0Xf?O?????|?uz%?c????Hʮ??eg?%?˾5k??g??=???g@#j5́?;?n=??_7?;??_??(?Z??͞?H??t?t4??""""""""""""???&?????????ԮB???!a???8??d?`N?/?v??? K?9);?ӥ?d??axsV??,"ε?#?y?q?[`(a????a?f?]????? ?????D?|a?????&x""""""""""""?????ؒ?;g?ZS?߄=i#??z?bXE/????????v?$ )?]?Y? >??Qn?? 39>?15?8?f"c??9;???e?w??=W?r?jю&O?s??/???s>~?"g???Q??G|޲??vM?Ϩտs2? ?????m ???H???9{s??Ti??-ƕ%]?E?W?`?~?a3?R?͎?? ++? ?ʲ?Iu ??????6????2?????CG?݆?$d{R?x!?g@?uۖyr9K?=??9?\7?N?ɵL6??[?$?!E+?N?6?)?e?tO??^|??ϐ??G????IY\?fѭ? v?&???EX??h?is????A??wh?KUFLlE?c?i?r?״??Q??t?W?"aŗt??? i܃)^??Z?L~?K-??gY?????Ro?d?H他?0)t3zF? ++??cX:v83??"6ݙ??i??=jv?d?V???I;Ę/???q?S?2y^??K???????I ?-??hGǷK?qi([??,9?٫?r*Õ?R????????????dO??-??)+????+??W??O??o??#"""""""""""?y,?O[?o?ݗM?G?3?????=l?=??????!??_??#??]??]???A?{?e?`?q? ? 1?>??<'^m՛ ++?8??0F?????h? v u?(>?4??JMh?U ? ???ˬm?Ȱ??ݖ?????q}?ߔ?ߐJ?o?FG?Wy??????h??/?2?;?OL?m??Ņ?????w?ɍ?.?}n-}>?ϾMi7? ? ???# ++p)zĞ??1 ?k5?ֵ?`????kӧ,^{?? \????^??????y??????5 ++??|??ځ۬A???] ?n??? ????{?m???ͫ?~?j?X????=?/?A??֯]??o?\?+Y??}^?????????????%9)???}t?-k?coED?{+""""""""""????co?u͇""""""""""""""???Oy$(??G?c~f??Ĵ??r???????Ö?0??3+??j?2Ng݇????D?͛œ????e=??)#'?=?v?c]???-???ۻ??ԁ??=?7n ????;??<?¯wa?DDDDDDDDDDDDF?O?iO??LY???z?u?7?{J?}?8??]????8.fm6ί??u?gұ?;?F??]l?|?kr<{*{4?V??H??)n ??J???c??#?{3?5??+??`-???0??QƳ ?䵺|???}p?Idq??y??iɷQ?ք??^??swZV""""""""""""??&?????????ԮB??]??3/aa???l?Ñ?9 ?W?[?Y????;R? ?N???s?4a6?c-8???v{?^F|? K=jӦgE\/dؘ???1??/?@??v????iډ???01?>?m???(׻^[N?A|:??]???u """""""""""?xy?؊Z?fx?(?4???y??>??c̞??J}?԰,(??;?Me??F ??si????6cO??b?'??|?q=?܌X??Q?E?_s~??{Mgxuߋ??uu`O??o???V? ?M? ??????j??ܖBΗ~?=?h?? u?N????_n)T??t??A?????(?????#???cQ?Č-i>??/>/ҬS ++?Y8{ޛ3???궡???٧?u?`&?@???(?q?Ź???I?eہ,N??5=?gP?^~\|??j?p??s??{X8d4}{??????,N??u?j???????$??3>???s?oܖ???rf? F??????????z???c?_U????X1v ?:;RdB ++:_+n?r?x>?k?.?C1fFc??t????K????ǰ??̓??[??/?ôq+{?? ??b?9B_*???????I???X}?????э"/???E|?ŭgR??fbr?2????????d'?~HW&Ɩ?n ?+G?ު?7݃???(?k?????B?f ?S??#ͷ???pu????h?w>/?]?????>VN;??}˩-q??????Z??֚?̃,3??'=?9?Ά[Ե??????????????1?m$???{Aڗ??x}?d?s:w8P?Ow?????-??????>??|I??ѬI/A?Q?y???7Dz?D??ǧ'????_Ŧ3???????X??L???)?4?6Oz] ??"?R???E:?? c???????p?'4Wi??ȴ???ի?T???"ϑ????'b-e(??Oh??`%n?0f?????x.?r???????{?N?:q????gx;4s?)VoH?M?ZDDDDDDDDDDD?a??'? [?{?H?7J?????=?v?v??~?݃:1x???ͻ??????MU|?N?eKa??/Y??4?;?D??#G-1??? ?Ζ?a? ??O??A\=??F??Yd?wr~? ?????????E?H????noj??N?S??z%C??y? ??n8???f?p*1??Z?҈M????? ??hlW?g??^S?+??\?/??u?s ?D?Q???Yw&????I??I?0??R?7?[?},Õ?nR?""""""""""""?GǙ?s4?m??ڙ???>?? ?]??9?o%??>??? ?7/fdω??=O?r޷U??؅??G?(?r???bb?$??? ??q??~??q?Z?Qƽw?5???~?g֙u,?u?T?bx?<:խ?7?Dϩc??? ?j?J??0*???~??t'????fP???b?g??A?av& ???~K8???ox%>*W?*?~A???ba?O?n?????(B]??????G?̓?n???5?tc?Օ???)\??u;?D????4?Q? ???L??=? ????L????????1w?AoR=???O?[)>??????U ++x???Q???Tb?Ƒ??ۇF????e?!~B?;?P?XGf?2??v??.?=???:k?FV??˹K????>y?.?.>}?? ???֚???????????ȿ?c~?Sg??tBjW!???왗??|?q6??H?ٍ??wrM3?[`(a???ޓ_?J??EĹ??~?;???n9??_???wfg?y???+??}Cj=_??궤??=??\?-??3{Ѳ?K?x?6??G??????Mu`t?'$,??;?C?Ap7kMDDDDDDDDDDD????A/??????3?h^)????R?8?^??Lx?> ?W?[?Y????;R? ?N???s?4a6?c-8???v{?^F|? K=jӦgE\/dؘ???1??/?@??v????iډ???01?>?m???(׻????L???th?{8???5??????d???Cf??T?7AR.??ǰt?pf,?El?3?%?Ӡ?{?*?v?+?N??uL????_s??F`T-z??8??N]Y????,G|?+??V?Ҩ?W?G¦???[?O???Ѽ汗? >dKr??J?x=?-????1vݺ?`gl"^??~?f?6?Z????????l??J|????$?|?ֿTe??V?;????k???[XY^jԆwk??l?1櫁?=˩??2?U?????????3O.gi?;G? ++X??͘?|?+?? ?ˣ??,?Ͳ?|?;?????tQ??ΰ䋏???ךw??P3?$??F?Wy??????h??/?2?;?OL?m?sn^e?????d???QˑY???3?/?L?`?u??V?k&???o}?c????f??f˜?|p?ƴ/??cs????????????ޘ???[?9a??z?)*???@??w???F?ķ?`~?KCDzxu?U?v%?3`??ɴ?LΟ?`p??t?~G?\?8??E?=?T? ???v?:????@ک$2?`p??t?j<?e??sd=????XK????X?[0?Y}x?'? ?\ⷮ??٧?ؙL??@?ozӦ??u??4??t5*]????nlY? ?v'?t? ?̄[p~"ۅ?|?u5???dH?b?ӭk??up?oq?M??th3&th@??P????4>??? ?N?c??yd=?I??<;???e?skk?&??o$?Bx!??J?ep ??ٻ?????{/??lAܸW???6?lh?2??e????J˕i?̑?̙eh?-??????"??????*&?????W|??s??s?????{?灊??}/I?A?????1j??? kF????xk???1??I?1??,a??>?+?j?$????#VmXbV3sJ?p6ӄ?s&?<?J?4??;9??B?{??W?P?u9?cv?Gz???p? ??x??Y??ZN?缸?mW??X??UK??????Ϛ?~?#??Q?6,??0h?A?w??+u\/??W]%?N8?$?T??+???V?S?\8????":>?|WH??33??cP??M??GK ??r??e??#? ?bs???|.qk?W?f????3? ++?EDDDDDDDDDD????'??;Xp?H?u(&?? ?? ?V?B&[:{??c??Jt?9??!e?;??A?7??+k{&Ē?????C???,?|?g???????j?F?? ?È?k?[?w??Z ?????|???%H?y?GJֵ?/_lGN?????s??\r??????B\r6? ++???$&ӆsEw? ??h?7? ??,G?j?\b?vg?ӡ?? %]W'?? ++?`???!??A??=֠?????Жs??J?J2Nf?T?J??XVY+rH?q??Vtz?njU !?ju?/ &m6?W??ϭc̸m?>????Yz?5V?u??/M?ّ?}???Iڳ??M}Kh????????????ܢJw????'p??ae.???? ws1?????\B^?S??ʗ˷?c?? dizU??\ ̔?3w?E2???|?z?wog?????s?z'???b??HGEq??i,?-N~NX?nf???d]Nٲ?0g?2?B???o"DG??Ұ?T?F??w+L?1??y|3r)?r?? ++iƛ ???;??ө|??m?Ȳa?\??a93?ڼJ????n?B???E?"??Ưa?i ?S??y???NU?2g?#t???>?3?t?'7O????j0?բo?????:י??ڪ?e#?@?F3?a"S?M??9??偾?y?~_L???S[G?$????+y? `p??c?`7f?/$?Le?vF?6~? Ќ???8?S&}?駱??ӆw?JM????Ϲ??8?a?2?/?7??u{?^????(?:???8a.ϓ#??0m*3>bQJ>??Ui=??[}Ȼ??˹??_R6{W?}?????p?ؑ.??N?? ?i:?g݊Ԓ}???'???׷\??Z???'??/?ؕ?A]|/? \jwg??2L?1???%a??Q????l?]??Vۅ#/?????*"""""""""""??0??$?8?ػg'?Z??7빎r9?uW?|?ȹR?D!?\?-mt|?ؗf0?}??Pj?u ?n??ո{?-??ڵk??jDDDDDDDDDDDn/?)?%???{?????pi؞? ++?????????]3??P??ց????????????m?Ԇ?9??Yvƕ;ڇ?r???>r????*??:????coED?{+""""""""""r???[??(??RAᧈ????????????? ++?U??? _???c?1瓡|~?rz?%a?$??^Ι??ݍ???΅s??|?k~-k???ŧȹ??rIX? s?#1f!c?~??kI !m?"?O_J\?5r????&"""""""""""R?O?i????i?Y??9??l?pZ? ?8???_Y?'? ?J҆x??k?:q?Q????l?z???B? ???Hۗ?q(?????3????}N1k??,???)??f?$b? ~:??6?f?~??@??=??? ???HRo???W\??DDDDDDDDDDDDn?M?i?8̂]Y??9e?7?s?rR??p?-eqt? ???K67L??????2ùį]B?sC:Tq??[?,??????y?[b/?9i#??*&?~??????'?1??}??tC??`9?k?yqO?@/????????????܊?nv7???????k3ߛ??F\??Θ??f???8?????s?Y?s΍?R??O%??f????1?*\z?-c????2?G?1? ?G?gb?? r??'_???p?? $??剁tӝ?f??:e???{?r??k?? ++?K?? ݞ??t?נz<ܥ7????5???=?????? ???E??[<3??xs*?m?'?}???q????+?`???D?d`?W???I\??l? ?D?q?S?.???x??臇?/?$??_?C???h??[ ??L–??2? N?dpko??gٳ?(?'?0???a???}Ϟj3zP??b[?KW?P?)??8`?H??/b4dqp??G?Z8????s?Oa`kp????6?`J>!^??}???΍(o??&3??xU???L@??1#z![??h_9??9?y?? x>? ?_(???ꫣ\>? 2???ק*_??,bvGS?#}߮?{~"???? cas?כ?w#????ۥGI?׋2?O???$*????}?????2s?iN????""""""""""""??? ????![%z7*??v??&-?c?n;?H?Fe0 j?#?S/?͌?M?*$/??ڬZ??ڛ??/???;u[?]??5?????V?%!?????? ++!? ˑ? ?!???&????]z.Uh??????OZƦ/???>΅M???߅`7??.l?? ?6??'1४;????q?E????] {?;i??? ????>?Y? ++?*?6??k?hގ? ????>?i?!???k0.????{??d;?Ɍv??X?c?ݴ ,??F ?W1h?q2? ăº???]? 꾺??i?ޯ!w?Y??????0&??Xo沴??,??????u???????<_???X??????jWu?H?J?""""""""""""???~Z????ʻ????+?j?$??Ђ?h?a?Y??)l8??L?ΙX?????]:??T?/?Gn?'?????f?Z\???˝?&?n?H?>????Xkyڿؖ&5*R??fF???u&?A???~?H8P??ьt????F?wz??uy??x^??q??y? ?,?I??3????v?\??Ƙ>؍???? ?+S??]?ѫ?_?`?)~ڞHNr?^?r??k]??O????ҫ??%i?cŎt??w??L`M?i?{?۸n5?^e???v??7???KjJr???e2??.7?????Ұ?|^#i#؛H?f??Ԣ?O?΂?F?????-??Y-?9?N^q???=?A???߸?h?8Ƒx??ۙ3j~?|NC?"""""""""""RJ?J9?u???eg\???P\nv1?u?T?/?GN??4L>?[???]k????:2?7{l ?Z̏????W???[?!?????????-?? ?m?Y?+???6?????b.S???@?:???,?N?????\~L??????2ùį]B?sC:Tq??[?,??????y?[bs??o#??*&?~??????'?1??}?? ?????=??=mq??͗?????SD ?? k?^(LP?2?]?R)?nv7???????k3ߛ??F\??Θ??f???8?????s?Y?s΍?R??O%??f????1?*\z?-c????2?G?1? ?G?gb?? r??'_???p?? $?????d9P?^???*m??n?????9?f????$Y]? k???R??|?oKƓ?g?WHc???{$l??x??):Ϝ??n?????ؖZ??Z#?wM`??:???????fOL2?v??{?.?t?e???Y????=#p???&5!y?˼???gv'ā??eMf??u???%?u?A??A8??(‡?aݡ????3?֚????)??0?? ++?Ż???P???????J?`聱|t???%i?4?'?yLw??????9???^??V?b*?/m?'t{2???V\???p???_K???DV???r1?O ?ʭ?㓷?{???(???/?A????m ??l?t???y|~?;?+?????O???@?V????T??;8??s^??GB{???&~??2??????0???:Ή?ψ?????$??`t.K????=??r?l?R????????@>?o6ƻ?42/??{2?pU?~m ??سh ++??:FN?X:?7cM???7???A??{?J.?&y?k??ٓ=h???s??=??CGSk??]?8?j??|??6 ??_>fТl?m_'?????`?.Gb?^̛E??UH^6??Y??3?7?y_?CΝ?-?.???T??b?k?ْ?s????????l??O?N??q?{S?*4oq??j?'-c????~??&?} ++ ??B?}I?????????RՂoa????? ?r1ͻ ? ??wҸ?;?汗?}6?6?*U?/l:???$?Ѽ?Q?+?f???X0??b?x???/N?C???/#?-huw?ƺ?Ml??1+"?i??K@Bk?& XCV???Y??\??hG?$??s??W?N?\N/??ZKM?{?pQ74??_YȔ]O3?I>[??ę???x?i?_?L ??J ?>????.????=y|T???-?'?x7- o?Q??U ?x?????`|????V??|?y??q?uVp?ɍ???4?????t??b,??????!"""""""""""r++???5??Q??K}?????'??o$???@7??ap ၊??}/I?A?????1j??? kF????xk???1??I?1??,a??>?+?j?$??Ђ?h?a?Y??)l8??L?ΙX?axp:+??Uˉ????? ???_??7J???@?+???$ ++??&???!?hi????P?H8iK?̂]Y?ԂbO?%??Mg??=~?:??M?y?ؖ@N?\6???}c|????? ??o4? ?;M??:???-???????*~;q?4?3???؂?(?*?:??O???U??/qd???G???R~?'?`?Q#?ԡ???/\?RذZ??B???;???W?cρ4 )C??E ???]Y??3?#?d?E????|?f???>#??? ???[T?4?n(F\^??؊??P??b?? ?"???K6????:\??K??u?v?$??k*?1')? ?+-A?F? ??sn?F???͈?4?,:?6?F?D׻}?bQ???"??l??W????Y??Ր??V?δ??ܐ?????Һ;?{??Ϝ®1? ??9_?Q?E?q?????7?V?[?ߊ?{?Iܺ?cva>İ???l;ET???9???E???$m????;ٵe?lJ??|ǫ???ɋ??>O??˄?d??Γm?2)?B????ޗ]??J???y X?@??k?V??P???b3? gRdS&?????q0u?L???,??Z?cl ,??Lޭ0?ƌ????ȥ?˱?+?o6????|H?O??????"ˆ?s<ˇ?d̔k?*??? i>?勔?????-d?N?g???;U?˜i??mHw,#???<ҭf??gk?N???f??>3&????j??j?N ??;n ?b?_&?^¸ӱ? l?a????:?+????>r????-}???;?مѡ?{?]?""""""""""""R"???[??C?ފ???????????<:?VDDDDDDDDDDDDDn; ++?EDDDDDDDDDDDD?TP?)"""""""""""""??m~f???Ws?K??s*"""""""""""""??O?i????i?Y?????/??M܁ml?J?z?[?sw???}?f???ݐ?DDDDDDDDDDDDDnu?M?i?8̂]Y??9e??B٧??!֜?FĊygW??#Y?{C????&᧍??????f????rDDDDDDDDDDDDD亻=r@k*?#??S?u??? 3???ư??I??3?3?Ҥ?d?~?:?F'??R?&O?????q3ذ?X???sY??$?~T??Yz?x?*??3?N?y??s ?1?/??'y?G㉙\?٪#?^? ++?W;~?JơE|??|6??@?ٓ?/0|p{|?ϲ???0????ټ?î?}??(gӭ8??J??ߤ??5p9_fq?Uv???.""""""""""""r#???5?7?'???x?{?=??“?~?/??m???Q{??T?7y2????3?c0?Ρo '?ϭcx?Q?Չ^??㑸???&?/;?Y????????1b???Fܪ???;??v7???ɓ?1ȿӞ?/O????/Nak?μ?YcʒDl????ߍ??5?^ q???`4Q??s?u?7??N???gS?\w6oUq??s"""""""""""""?q?A?i%92?C?J?n???`½Nc?u?@5<[N??Ux????:?\ٲ?m?nI ?F9???Vc+F????O??F? ?????O ???y??'?#?F6k?? ??c???5y?耏???o97v????uwz9?]c??_?????L??>e~??,]????????5?Uj???sk???????dX??8gd??q?›??????????????N?????݄8??????]qω?????????????????3/?M?O?P??????̔o?2?}??~#Iy??}LdƟ ?⃴?????E??????k???C2??z? ???Y??R???9?c?% s?X?d7n?C?q?%~??q????[j?g?,|˭w??Gj?{?[??嫙?C]????C??͹?d?ϵ?>?+?!""""""""""""?P??ϼ? ,?q???5p???^M>??p??S?a?$Z?????ݯ??m5?7??Ջ'?N??!?????f-?t`??g??T??J??WO*????*}Z-?^7?e?O??k?տ*M??CzTuc(??}?ӟ.bd????*so?;i??C??c _?????1ػ??L=???#o?????5???? ?)ɶ??V`4k??߬?:????]??m(#?~H]}?RD????V??U???j׮}??????$???һ?37?????Ұ?o???j9???t򊋟??x?ck?.""""""""""""r?)??gN?r??q???Cq???\A֑???c??b~4???/f?F?? ?KDDDDDDDDDDDD俨Ԇ???0wY??]?_r?5????*DDDDDDDDDDDDDJ??.@DDDDDDDDDDDDD?zP?)"""""""""""""???O)n??3;????Xl7??_~2;?!b?9??|)??e???$??????\VNb??圹??ܖl????P>?j?٥?????????????t?O?i????i?Y????psj?>??W???[H??-??o??ޔ?????YŤ???s??t??Hܲ??V&?z?K???I????{b?i??-?????NI?*7n1o??$??|?/???QV ?l?pZ??؋?????????????m~?2?`W?mNY?M*??@??`?ʕ??ygW??#Y{??]??v ?? ?Pŕ???.٧??!֜-Q?i???|p?=?o?d""""""""""""7???.?ư?v0????tm?{?^??ϣ'?h????I?????9?F}???ou"??u7?f?!"""""""""""r[?=?Ok*?#??S?u??? 3???ư??I??3?3?Ҥ?d?~?:?F'??R?&O?????q3??9??Yg????H?+K?fOеG??,?3?#~????IL???\?*w???z?o? IDAT?'??yq|??ef????a??ϲ???0????ټU???}????g??????M????N?OFsO#9?W?,ލ&??? @?vD??????{9?Tn???]??׳+??R???1x??????ݱ????5?/???l?DzUi????|?.F ++?r???!.)? ??????]???M??CDDDDDDDDDDD?kn? Ú? ??fc?M`?=˞]G??~ ??k?6挟è=?x???<d?????1?? ?з???-?zc(}????? ?????_зg*??t??????}??2纳y??c?X? k??GX?E8c߳?ڌTr?'??n?%V?[?w???C??>/?Gn߿ߛ??w???]??x?5S???~&*L?*??????s??sju????x$na?? ??bV??`???C??Cf??{?ag=?э[?v~?>#??c? ӫ,f?.]?)[??`?{>H?~?P????$|?z??????N;??M?G?`??q ??ô???=׫?Wv7 ?]o?5 ??C?#y' ?nӞCy0?D?o ??h?VjG?W???s???1g?(j??]?:?WDDDDDDDDDDDn=?A?i%92?C?J?n???`½Nc?u?@5<[N??Ux????:?\ٲ?m?nI ?F9?,??ZKM?{????@#??f??+ ???iF5u/???F??w???????f??? 1??T/.?2?p ?Hh?S??\N}W¾??֤ ??Lcv ??Iģy;?k[??ę???x?i?_RCvAɮUiy?]?8u*???%f?Mz+o??x?Ւf?O?Ura????ܛL^???̈́{?;i??? ????>?Y? ++?*?s?Ѩ????m?Ĭ?>???˼C<=??+???????᧘.?U????ߛ??????؊??>O-P?>)?4#????51{Z????\w(ww5+?i ??????lk?j?gj??9-)??w?2???0?^Š???x.?2??$?e?g???Q??®?L??5?????sj?N??{?6?????s?寮dM\w???DZDDDDDDDDDDD?(???5??Q??K}?+?Nv???aXKf~?%?+?? ?O??O???`?{?ZEv?9??M?y?ؖ@??@??x????K?y?Uw????????9/?i?#@v<cr???1>%?߮ ?|?KJ ? ++?B??)??e??)?;?BJ>??y?!?? 8???a????O??־z;?&?v?????'na?!#zU???ɀ?Ո??JBd0b1p:?((?+?F?p?T?-?[?dpl?Z????P??ќ???7?f#?.??ϻ?S?Mg??ݶ?I???xa?? ??ù???r????0?5? &?݀?/>_Eϯ? ???CL????f??і?݌?=??~?ճ?? ????8?[j??+???6?N????????E,????{?????@~???vM~4x?)>?'??????m?غ?????Rdg?d? \V2????>p??????]??+n?/?l?,6 ?ɨy?شc;??|ϼ?N^?*)n?n8?o`??c?n>},????/S˺?Q݇0s?F???º%_3Zn?i?垲?\\??9?????,Z?ȍ??fB{?:.;?c_??????Y?t9'2 ++Os-~??'?of.f?ރ??O`??z??3?KDDDDDDDDDDD?/ʐ?t??7ݵc+?6?#빍?99? ???d?????Q??g?6z?ԓS?????J?T[?O?n?J?}K?{?J?*r5"""""""""""w???K7|m??Ȳϲr??}s??ý}???+?x?X???g??#C;`]@s^?ݞ??,?0??vNf̸6D??I??????۩/?X??X??O???=?????iȿ?$??OgF?/ϳ??'?7?ߌcԛGȚ0??C????$'? ??4^???v5x?M??y????????p@9*?|S?gu????Toٞ~?KaHJ??? ?~?Vdpx?[?3?ʣ?б???ߏ??~=??| -KgY????????????????ᧃK;????o???80?]?u??1G??eHkՓ/???ˑ??$6?0?? ?z??tKZK??s8?^????S????&7'???W?Ym???go????_??&??1?Y X??S;w?f?$?b???l?2? &??c/g???1?iS׼-?Ù?? ?O?n*훗?T?pg??]Y??O>?Vd}""""""""""""??R??O?E??9?!??K ??X???[???=\? ?????/??cK???N?م3??Z?%?Sk???'?޿????1s??_1?P??` ?6q????I??'.?Bx(?????*keف]\̾~?ep?q???G??l?!?ms?{??????p??x????8Ɉ_????v_??'na?!#zU?7yd?&8??,??3x@3?_yh???k????p?p8 ?C?c??S? pN ?]????=j(?Tn)??~????_a??r??p??#%jt????~?|?}՗6?bi??`^?(?)3?y??|??o?|? ++>Fή?{s? ??y]%?r:qJP??a?}}Tk??3+F\ ???hUDDDDDDDDDDDD??b???N??yq??????l? V???3?%?n??Ð??s^??)S?ڿ? < ++??c??8??=I?|??????9?ç*!nF .????$]]??????pvU?:?ήcg???Z???p?7?량b???b??ԫQ?3?ˏe?U????Gs$?gщ,J????????;???u??/>?A???>F\<]pf&?y]i??q?D??/?p\E"#???ɕ֙}?!?5???N??oN?'Ϋ?ڈ?e' ???(N???j??}""""""""""""?WT?W~?$?~?q??m?)???3?c3?07?%R???x&??⿢?k???????>???P??D???$?mF? ++?.4??+??f C{ #?????1???Ddæ?1fn?vRvOc???'ԍĭs?lC6?:=A?L^?T???d? ?:jS2? ɕ???-o??hK??}?{ ??Gp?~M?????}c?w?s?x?VUW2?????MM?v|=?ũ?i?J????Za??\?d?G?d??iL|??M~??׊A[R???6?-?.?<2`$|6?Y???t?????tс??.?4X??ɪ??ygF:W_?TmF?Q??Yi3ؓ9?oƍ?\??w1?;ҷe(??6?N?m0yBoVf?\?i?7?7??oG??9|?m?3n^>EG?i ?D???!?c?8,}?L? *????5?P?????5????:??Q??3??S>_0???Sȱ?V?*?ژcz!??????????_?!9?Rai?c׎??o?䏬?6????6??*?!?ߣ?ǵ?Ι???-?A?ٌ??}????????W_fJ?f??N)?"w?ukV??[*?sU?T????????????I?n??⻃g?YV.o=?$]?#??????\???X0?k֞????f??;ٰ??-???rp??M?q??????&?t??g?6!??G)???????_???0?Tv??F??!?a??X??I?s?g?и????$%?""""""""""""r?\?t')???+3?6???C?|?uT??h???????;r,G2{??&?l{????v?I????s?b:?/e?6???[?,????I'Ǘ3i?t?n?A?%????G???n??#??K???? ?8??h:d=c??:??ic??p?!.:<?i΀?ZĘ?$6???u?9q.? ?;?q??=??_}???ײ?щw?8???¿???\h}?"^8g???۽???%9ǂoD-?ٮ+/???D KG?m>?@r?U??3???7??T????f??ٞK[.?/?s??1????|$ ?_?>ٞ7[V????|??C?aӁ?O?c ?û?R7mN?????+?OG?O??k'?S-?L??:϶????n?_???n? }? ???x????5 ??hݽ-?<28?$f???a?Ķ??{?D??b??'???L?מc???Oc??2?po?y=? ++3?!V????/??ЎXМW{?'8??'L保?3? Ѯr?v?u:?v?˃!l'?2??O?e?bj??x??9 ,?ә????????Ma?7????&????+ᙓ??2??C/??;????Gv?&~ؙL??}x8҃?d???,??????DDDDDDDDDDDD ?tpi?~v??횾'&??աN?7??]? i?z???C??{9???Fc??x?XP?nIki5y??kP|jԣ?=?????H IDAT?ٜ?jm?㚷%y8Sv3a?)??M?}?R???????+ ל??g݊?/ٜYR?;?M?FW?'?L??A????????<%???լN????d??pi?(M???HUB??a? ++N?7???֏[NZ?w?ݺ~n@\1 ֿ???v?Ԥqn\JS?.5????w)????7??""""""""""""-???t\d????{P?䯃?k?%*?H??~?å?`NoJ ??:=???????]8?%?Q28??,?????{ي37???? ++?0j??Z冟E?qj?9??????Ԁ??3ز)??+?g|c}0-:Cz??C?韝????)?????nqk??ࡲV?????+?g^?p?ZY|d????6'??(??z=7oA?G??Y??????|1nk??s>݄?{:9%?qBv??{P??м?g>?/l?xZ:?#???׎;r??M?n,} ?A??8??p??o??0??g?W}i3-?6? 慈?2?0?w?w?O?F?7??c????7??????+ʼn?P?? ?????Z.?AX1?Z`}?E????Tv??????x?s?E? ??7????? &\M9???5YL?+?q:]x?/?_ ++??L?h)I??o??*??""""""""""""CE-cqG\bx&?D??~?U'2???D ?A5?0$???W(eʔ??/,?????;ήfO?#?s7=?#?Ck????J????'fg6IW?f?_G麥0?]??????ؙd!????.\????g?D????X~(?j ?L;??cxEU??9????Yt"??c(y9vw????s]???yк?y????O???d^?FG?av\0???<W???(*Eyr?uf?{uMe???d?[??É???6?w? ?n.ʄ?g???__a ++yr.?ӁT`T?!$?Є??&??'?l3ZT?(`u????^??7?c???O?????$"6%??1s+???{????=?n$n??g???? B?`򊦲??%f??Q???gH?Ԕ?ny??G[??ˈ?c???>?3??h? ??E?8?K? ??kċ????????ij??????,N-O?W*???v?vmf?kƔì?=??eV???Q?9m?v??S?Dž?????-? #Vjc\?_,??yY??=?O??u?DDDDDDDDDDDD??b~?$?eA????+????Ҁ??Q?=G.(U?V;?|dntc?o?{??L7??×??aijT ^kH? ++??3?5??h'???`֐?\Ȳ?Q?Nq? +bL???L??|3????0???}??F? ??????EN? C????E?.uh\%oF??tՓɣ?1??oH6?Q?^+ulIE??????D??{ |Bbs3R???1R?fF?d??E?~? R????????~?Z??^^弱???P?????????????y???K7?Z?ڱ?? ?????Fٜ?ن?_E2d?{T????9?6бe??;??u?o?;???3|???L ??~1׭ ++????fݚ?x????\?*U?=."""""""""""?Grҥ??????>?ʅg???F???????ϞF??S????4b-N??????????????????E?m??uj)K?yR?g$w???!?/??? l?.???;?JԛS??T????%"""""""""""?V????=??????????ȝs3????:DDDDDDDDDDDDDD?4 ++?EDDDDDDDDDDDD?XP?)"""""""""""""??]~f?/????s4???s*?)^??&a?[ʹ?["?$?>??C??Z?????????????ܚ?'?t?????L[???d????2g?l????]???????t]x?[?? ++???????????I?:???y?fMѰ᣼?1 ?3??%#??bs??!???Δ$6x???L?X???祝??a?)2??Ϸ{?K4??H~??,әq???Z?,???؎?d??ܞ???ŵ?y???L9?u;)V\?tg?~?n???>J??t5?.?? ++>?=?ȏfP????-????a???!????󻴂w???V9?63?????:};W??G?9'???G??z?M>???ɓw3ǂ?)?(??v>?G`?a??߶qmכ~g?2?f??????Di?í?r???""""""""""""??$?t??o?2?iS??X>?ɷ]G5??F????????uv5?3?y??c?|%?v???ZΘ+?????q???????[?JĿ1???{;??ڞ????EDDDDDDDDDDD??????#?=sv?U?=u?M`;Ȥ????}?9s1?՗?U?????i?~y夓??˙4z:K?? ?H????s?Ljv7B?f ??%????t?na42????d?Y˴1SY???4g??׈r-bLG??d????8?D???8~?/5 ?ze???iلO\?y{?X?M??~i=??o#????yԋt??$'?H?p??w?g????=?l??,C???y灛 ?39i՞ M??ūe???D?纑?n?=?mX?*"""""""""""rG???#?'???٩~&pf?g??C?D7ޯ?I?Y7? ??q??a4?7?ъ?? 6??]??C? ? .?????1?z?W?i?O??5?????6?9?~WODDDDDDDDDDDD???????s??Y??k?VNLxW?C?8o ?Q?f?Z??˩??G?r$~????& ????<ݒ??j??נ*.?ԨG?{?/Sٜ?j??&??1?Y X??S;w?f?$?b???l?2? &Y??J~L?"?˚{?h??ԋ(Aαo?;h?͌R???7[Ӎ ????&G6?1???wkU???crUZ???o?N?Ǽi??2?>??c? W?G???4?,& ??r?LF'?,Ga???????????????ҭ-??۰??qG\bx&?D??~?U'2???D ?A5?0$???W(eʔ??/,??/??gW?'ɑ﹛ӑ¡5gq?T%?͈???3???K3???t?Rή?SG??u?L?R˟|??F????.˹?OR??? ++?6?????DW ??6?yf?{uMe???????8q??'4??%В?gȼ?? ?x???L$?ׯCQ?4?Q??5? z??d??E?ξ?B?1???$??I?o?&????~?$?~?q???S?׏?ɱ?S??l[6.c???0)????3!?_??u??a???l߱?uK?f??4 ++Ό̄A?L^?T???w? ?n?Φ?-b????????4??fD?1|???????wgp.???y???п??2?T,?Fʎ)?[????ˡ?dܦe????mJ??=?;q!???`ۆ?,?r?£Yn?n8?o`??c?~5?F?{h?ď3?{3|????ƪ?sٕt3??Z ????w|?`۶?g٢?>?????3?V?8Ⱦ???}. ?g?????ŏ??ž{$ç/??m?غe糯?g{G??ѧz?8!'ϱG?~?e??W??4??y??????????????A?z?ۜ??,??R?}%?~????,??{?\2P2?.?v????/G?????('???b???$f?,E??Ҽ?-?4?5??h'???`֐?\Ȳ?Q?Nq? +bL???L??|3????0???}??F????5?F?J?9??7 ?6?o??ԡq??u}??}TO&??????!??G?z?Ա%?nl;??w?5?>N jt}?V}?? z??6'?????v??aM?B^p3?y?G???y?7?C?95xP??pz??b?W??h\?????5#? ??q?L?Л????x??M??]?v?~???q$ц??Cx?t}?L`??[?L??????L?7?w&ecr??T?=?/mͳQo????-??<&"""""""""""r??.?pl?k?V?7l?G?sesrfZɐ??Q??Z??L?@ǖ???lF????ߋ?e9g??՗?6???bp???ܿ??3y?}?i]?d????|ٴ\oݚ?x????\?*???"""""""""""r?$']??k????쳬\x??nD)??y??92Ns,>????}???p?-?=W6 ??????J?q?? Ʊ?Jt???m?????҉?$?P?[0eC=?????????????܂b~f?Zʒs????ǝ.?o?????/???a-????!??8???ւpfqn?Z?Z?????8?| ?T?????7???o?$????|r8#??U3kL}J???f?;?o{+"r{h?[?;?f?????"""""""""""""R,(??bAᧈ???????????? wU????/??ь?̩\?x?/???c8l)?rnq?̓,?|,??nke""""""""""""rk???ә?ϓ?3mE:??NWs˜?8?y???&v?g????O?u?9n5?+????gv^̷?[g'i?z??I?5iDÆ????$??L◌????y???4z?;;S????a/???#???Lg?q??j???v`;?? Op??b{?a???????????CDDDDDDDDDDD????N?gq??g?6!??NWs?rί???3??hU??M???OHx&??h_???K+x7?n?#i3C??ắӷsEJxDz?s?Kz}?????ú!??p???ic?75???tx?>???3??Q/?y??L??"?f???1~?*????R? ????n&????ؗi?CC>??V??ߎ??9??}2?ŋR????JO?h?{?=????7xf?i.dY)Ӕ?j??ʺre?l????C??}?c?[?????|>?I ?s<<?i?s]????O?I?G/??d=F???*?C??8?:jr???t=ۖ)?#?8.??? v??9???ә??ş2|? ++??J??Ḍ?3??H\o??""""""""""""??"?t$??ܽv";???ά?l?z????5? ?0??|??7b?8?'K??_Xà?C?ۊ.êS2?G??????aLy???gX?v/?-?f`?`̶4???8?~dX?~??ӌ???R?#??K`??1?6Nl?I??Kt+/{"?W~??~?9??s?4??} ??????#?`0?b?_}??q?G?v???ڻ=?YX?+]&??z????^ ++CR????rgq|vWޜx??ϵ?\??}L?[????~?P???iנ,?GX1?3F?c??????Z˶??>????5???n????????y?????F??Sd?Y????W???ߡ?;L?v?????:Nх?? ???2??A_? IDATO???F??SNs????x?h)??????s??Y??k?VNLxW?C?8o ?Q?f?Z??˩??G?r$~????& ????<ݒ??j??נ*.?ԨG?{?/Sٜ?j??&??1?Y X??S;w?f?$?b???l?2? &Y??J~L?"?˚{?h??&?:??##??&??? ++ש\?s? ~??Ұ?7jP??N?w????m)W?ʣ?????Hvl?.?m?Z?jT?3At???.?7l?Id??WX? ?#??j?O?jw?|??T)hbn?1DDDDDDDD??ٻ?訪??ÿ??Lz?$$!??PB ?+ņ? ++?bC?+ P???( ?R ???"?{??!?????T?$^?$??V???9?yΞ?O7{o? ++?i?gk?A ??ϒ;?Gy??X?u?nr9?1????ѭ??ˮ??cv &?FeKn?dpz?Yl??R???Z????c.C???z ?؍Om1???tN?;??????Ѐʞ_?ic,Y???b?7?1??\?U?/??ԃ,?:?%r&>????,3iV? ?w???MJs??}?7uֿ?-?`??ೀ,???2??L??+? ??E?!?ۿ?[Ҫ?C?v"??????)? ????q=?s??Ghժ%M+?a??9?U ++}?i????CF????Uy??0? `???v??c??)~??=?#?|????vl??æk????00`?U vJa??SWl?[0vl?s ??^??$s`] ?7ܝ7??qd^?:\?N?/??>fҷZ&???L???#F[.??s?W&\?\?%?"6??4:?? ???n?8??,6^??? ++??ϜX?-9?c?NDz\??erl??,L?I?G ++{?Nayb?>?+f?Z?H??2??p?iB?b&??'????*???Z:3A-_?????H???G?????D?5%?c^??J????^r?U???????ٔ??8`r???g:?M??U?Zx?ĐT?)M???G?Ýh?p?O? ??ϊ?_p.? }?{,??c? ++??%?+?L???Y??j?`;{???????+өU0]???˴? ++?9???Q4???? n?????????)?j??S?gU:4???}?? ++?u#q?Jv$Z??_ 8R?f ??e?7?(m ??+???g???????SlI"?=0?b׹,Ln?q2??_-?l3?3{9^??y? G?@\?7?p??-ʺ?Wve?mB?qvfL????Wr!˂Oh}?UoL?k?i?ԗɒ??ţYx<?_yv???08???{?r??? g&?p?]?ƕ?݇ѻ>=??bƸ?L뷘$?/e??ghק(?\??*??+`ǃj=?????|=?-??۱?x?II盰???DD?1 ??%07\???C?~?)????0???.???.??N ?T?:?^Nc??ˏ?q?N??????ՈO??t??!3????l?=A?&???VR????ٓ8???ћ?*???f3????(?w:?G_?ὥ?R??U???3?!????????zՋs?????|ͤ? d?)V?v?ޢ???O??? ++?oǶ??o?????&??Լ?t?2??s?Q????ƞ???O ? W????y?rb??????????mm&??+??Iy??????˸?| ++???r??~? O???\?T)??_DDDDDDDDDDDn??Ą_[xW~f????1?V?pw??.??[???L!'?h?hd??ݺ5?؟?e?!??~?3ΰ??Il?=???Ǯ??1|}?YDDDDDDDDDDD??+??ފ????VDDDDDDDDDD????mo???????????????? ++ ++?EDDDDDDDDDDDD?PP?)"""""""""""""?B? ++?3O?`??e͸?1?Y?1j??H?݂?n?lb??g??]$??u???????4&/9E???EDDDDDDDDDDD?Ut?O{*??Oa??iXL?k^?????ͅ[?4و_ۗ??^????Q??DO?Θ??o?N?מʮ???????K?E5m???f!˷&?s?Jd?,???Z?c??[ZWDDDDDDDDDDD?F8??n{?~nI'?}C?̷??ܙ=J∟ӵ???qb)k.?иE0N?I????~M'?ӥ?Tv%dc7?pt?ƿtyj4z?֏?#??:?ьC?}?+K??c7????O?0*?nL?6?P??B?߀?IBJ??rCٜ?m|;k>????????? )_?fϾ?S?o^??a?#(?$&oK??"""""""""""r?*"᧝????? ?c??w?Cq?ܙQ????38??Z?=??A??U??????N'r!ݙj=??Ri Y?q?ؽ?s????????= (`?m??B|6??z????????/?&???Kyt?(^???)??}~(nғd????]>?w{$?~??ü1?????ݜ3?c?C&????6U?>wfx?ْ????ҝ?S???>d??=NL|6GJWnB?W;?`?K?+?21?gV?=KR??К??Ȕ?OQ??Gfӥ?W?xwo: 慁??0sO] +s?~?+/L?ؐ/????Š??~/?i?;???;P?nSZ????? 品?2?5?Tv?jG????|JK?M??k?U??Sò????И~S??????Y??@??????H????>˙nW???zG??[?;jK6&>? ?кt֋?|?9?r"?f????i?<?|dC_ ?1q=]?0??'?????;*?U?D?iK???=Vº??????l?|?!5|!?0?E?d??I?6??%rYAh.F??]??퍋??ͬ?#?8g?? ?$?b??4?v??A?O?e?ĉ???3?On?tNn??I??x?? ++xZ????$f~??? <xu?k?i?????9-??O?Ơ????2k?L6I?vY??zx??iӬ?Š5q'?.??,?L??M,?9??{?0??8YIص?MgK?r????9?cs{?}?jX?츍??=??]??P?+YI6ʺ???.J5/??/??-6?????Y??4????o"e?h? \CГ]?=??ь?ޛA????f??N?d?A?];Ѡx????uy??Y?ػl"?/?{G?R??? f??I?Aݩ????S񄺛?>??c?DZMwF??9? g̾\?F?S?CDDDDDDDDDDD?NP?O ۣ?g???5|0vLxV?M????N??Hmߋ???p?rWc??ʽm?Y?z?'~?͢???mdMY??P?"??????̈??ſ:?kF?T-cf?3C?~{m???~>c???e????7M??q5???4??p?????ͤ?hGc?cצF?T?I?rС?WL?ކ?j_\?hr ?v???^zD{?V?~y??????2??????? ?l1'v?T???~?^?>?O?f?c|]z??????J????n??cg~>???I*x??7WxW.???Wv?g??#?p??G??"N?L ??K߉??u?P-???????׀kx+?:???????? ?X?Q?߁??G??(E?R???,????A?@??C3g?%?WR?u? ???=?d?G?︛E ?]???D=?+??2?[)??4??r?%?1DDDDDDDDDDDDn??}?gN,??DZb'"=???296?s&?$?#?=K??<1?g???p?ٺ?~?NT?0ʕr&y??,Z? ?]??=C???m??=?ҡ?/o-??(?Wx???{V?#??wpgK???=VB????t?YgX???8?/?O?!~?>?3>ң??<6?5?W??:??<_?e??>? ?F?֔t?!v?p??????D)?+??Y?k?????p?s???{??f?? +??'???3?~?????lͰ??z?{ֳ??5?hL??- 08R?YC?-\??1 ??,γ;1|/?NF?^?m??)3?s?v?벥??ģ?{???:?m?0?h?????X?R???`0?R?ccf???{C???2%3?=?׽???mKO?j???f???m݌???p?N???ݜ.۞?u?Q??#?wԞ?ѥ+8P?R?d????tp?w?????[ ?'W[<{?&b3??e?b}o>c?E!"""""""""""w?B~?Į囓?T?\?\?iup8?ʉ?8?`?+????F???)?S?????Sg?????d?~??d2_}?i?v,.xER??6?>W*uE/??|??G??`?xxFF????쳅?vu??*??s??l?4??? ??}?|?*n?m??H?gG2?q??ɻӳp ?????1$????{(?n*?9?~?Yލi?Р_-?3?!????????zU??/?т???????fG7?èX?5F?mNu??u?? f~???>?T????;<5?Q?m? ?gœ??7?? ?Jפ]??O ?????)?,???~?1_ŧ??aib???A T???%st??L?4?s?V,?AD6?ʀ??1???? ?f??2 ? ?A?^oQ????հ??9F???? ++?~qǶ??o?????&??Լ?t?2??s?Q???8˞???O ? W????;?=i#?>ӟ?s????ݞ?cSOfr/?/fL?ݗv?O???)<p;2? ?{???gژ?7?8~̣_????_~???/??*U?t??)Z? ++|m?]??}?????Z??] S?y?lb?? ? J?y`?8??o&????S?{??,_ӭ??EDDDDDDDDDDD??*??-i' ?X ?V_سγe?!x????????=??$}?HZ?0??????Ө?m?YH???Y'??ά>Q??8>?o?8O?S???!1??HϿ'?ʺ?IJ?_7F? 㱎}?Z?LJl!?`t?T?v???oK'~?ΘI?q?2?7#?Ȏ?ȯۓ?ݵ?????d???8???Ć?/?kLM???tl1s?k%i?v?MA??~?a??D?/???[8|6??$Z?N˹????^n??3??~G3Z?jE?{???﷚M??/?8?Gv?G????4?!?X?,TF/?wjAH????a?hE?G??VD???ۮ?'SָM,3??;P??_??>a!<??a?i?y";Sly6?}z1?~??R????x&~҇v?ΗOC??d?c˲?1=F?7?p=݃Of~????Y???5w?? ++???9??[rNJ????2???ؼ?Y?\?P??,?????}>W ?C?+өU0]???˴? ++?9???Q4???k]???x??&?????OP????X2+?K?*8???9K??x??8f?|?5?Ȏa?7[q??S6g??I ++?sq?UK;1g?4???? ?b!T?w?s'Z[?Y??2??&?!9ۄ[@??܏.e????|??Odޠ?dX??|??Q??8>?o?8O?S???!1??HϿ'?ʺ?IJ?_7F? 㱎}?Z?LJl!??~gD???V????L`?VN?ƻo$1~RG"? ?? Zb???1b????v?C???a?gxgX? ????aΉee?7?x?|u?}?ٶxc?EF????(S???|(??hљu?0?]??D?߿?:??-?,????1?p5?ɼ??????(???4?\֏=????=?^σ?Ma??????????????? ++???9??[rNJ????2???ؼ?Y?\?P??,?????}>W ?C?+өU0]???˴? ++?9???Q4???k]???x??&?????OP????X2+6??Ýh?p?O? ??ϊ?_p.? }?{,?6?P??s?M#z??TpLଭ*?j?~?S賴??? &????If?WX?R?N/???⃧9???]??R?k?9 LEDDDDDDDDDDDDn?B~?Į囓?T?\??;GY9qG x?ס??h?? ?W38?a ?='0m??M?*???zA?s?k????8N?L??!,N??T? M?ԧa???ۋ?f3??b?L???מ?]???s?F?;??|??Odޠ?dX??|?j??~??????????io??;و.w???K?>]?????8g*???c\??""""""""""""rG2$%&x???6S?Q?????(?S?:???0???G?";{?z?>5,`\ϛ??]WD?N????>~?~V?R?[܍??????????Hђ??P?k ?g?iy ???~+??UWDDDDDDDDDDDD??+??g??U|w΍Zm?.?]Y?늈???????????u?x?[??C?ފ???????????>??VDDDDDDDDDDDDD???"""""""""""""R((??B?H???'W0w?2?f??ӻ?.???~???N?vk+??????????????rE'????o?f????d(?u?N???E?r*???/m[???dz?q?????Y????k????-^;???o?Pd?O{?~nI'?eC?̅?nn?% ???Z!l:?&?e??m$^?d?`?տ$!%?q)2o??????????????-nw???????? ?c?????oW??q?ܙQ???c8??P&ܬ?DDDDDDDDDDDDDn??~ڒ????ҝ?S???>d??=NL|6GJWnB?W;?`? F ??? [??cg?K????GD????F"]/-{??????LY??ݧ?q?*E???x?٥???f?,ë?l?_????}i??/͜?c?????????"???d {???y????V????0?E:?ڈ?3_#? ? ?3n?׬???+?Z-_??g?Q? ??8???????Dҭx???????????Ű""""""""""""R???Ӗ???{??u??? ?Y?ٲ?m$?K??I????i??6???,??Xˬ??c gV?(? Y?߃?g?'??? ??ÐKz??ߓz#u??6???$jw??Ca?d%?(?n?za C???y{d^q?3k????,?罫??}??????Ux??!D?fq|?7|?-?yI???]????t?ى{\38?Eq3?Kw?????c???^FH??vR?L?[?o06~??:?aD? ?Y??Z???W?v?H\??e?lxf(?oO?M`qL??????????????????????"?#?˘?eF??4?????$?????+,?T?ƴ"??Ⱦ??Ci???/8???f?H???X??G???.????1i?8@???C\0?Y?r?^{???T?̻?|e?c??l|??E??p:?S?>ŭ_?۹?K???]?u?-?Ӱ??O?) ++}?i????CF???L????v?_K4?b?V;`?a??v???? ح???[hy< ++p ?٧*?N)?_}*?meov]gj?b???9?`J?*??O?\M&<ʖ?3?$??$0?8&gװ;??; 8?9`ό#3???S??ql".??g?߶?X????;????p??̉eݒ?8V?D?Ǖd&??}??䚄z??g??'??????i???^?N?????=X^?eT ?Y8o??I?̛\?LP????C??N?3M(W?D???Ė~?Ve]q*?/T??O????O?(?ⶑ?C???b&??K?^?#?I\????6??HX??????o??M-J?;?J???{?/?^}?boO???F:????jfL>?{?i???u,E?)??gN?Z?9?H???q?j'WGY9qG x?ס??h?{Tx??0?sӖL`??Tp ?B??????5kJ??vfL???Q??a??/??kD??????2????w(??e`p???4????m?mB?qvfL????Wr!˂Oh}?Uo̽?z?uˇ̘ڗ??]??e?\~b?k??3?`?w?ؽB?Ѧ?_?uq?_??""""""""""""r?? ++|???m??ߨ???M?ͩy??e???????)?=q=]?0???M:??v????o?????_??U?T?w#""""""""""R?$%&???{?g?Y~Z?k?6???˜?v?)? ++m??uzߝs?V?0\?@]???o{+"rsh?[??G?ފ????????????H???SDDDDDDDDDDDDD ++??"""""""""""""R(??3?? ++??Y?ьszG*,ϑ[?~??=??f?b~;?i_?&??o????a<?\Ź???|f/?E??f?&"""""""""""R???Ӟʾ?S??c??vws? ++?s??F¦ L????T?˓????nI?F?Fk?a????????????u?in(????\zQ?d??????j? R-????i??Ғc޽??0?gV?=KR??Кߵ???S???# 0z?c????d:t?~s??)? ?-a??X?} o?>????w?9?K???O?x?? ?@??~??fN???]?1????ӱ$e?s@??}????Æ??N1QD????%öT?-????5?:?????_p??ԋ??P???EDDDDDDDDDDD?(E"??%?d?+a?j?k?qa?>?*??????#??8{????????S? \CГ]?=??ь?ޛA????f??ϳm?!쏿?5?Aҟ?0m*?o???.?c8?g?'???K?S??9[ O@?????? ?x?M>??B????4?+? ?1??/??~[???V???^ ??TC?ry '????1ro?u?CגfRb??v?3????f?x[28??t?L??K?Y??DN?.6?O???y????????Hv?ӊ???KG?d?/???#?4??z?^???o?`O???=2 ++??ߙ5?Szf?????p˫ws1???BMoo\???c?hf I?9???~)?̉eݒcX*u????@su)?Ś?@???x&ȉ?D3y?;?6}ƨ??H?5????r?;?}*????J g_???g2???>ϛ/T?+?q?R8??Z?Zs????^Ćd?4+???1?V???ʮ?P?׷'Ω??bǎ???y???xg`?ة?N?q-?3?ɻ?t ???????1S?h?=T??LY_Ѓ7??P???T=s?^f????#i?~????????????]???6?G??~?k?`?J?????T?]?r?&?(???????UzӷC}??@?????,?Ab??x`³JmjV??@?^;???z֜??=?R9?nejP?BN(s?{?n?~y??ػ??*?????s??-?(KPPq??J?L?23+??vڰ??j?ޫ???W?#?̜YV?Zz??{?)??"??l???!?%?Τ????^]???~/?z??^?>6?>??q?????8mG?% ?j?玚>?C???9??c?L?:޿????z ???o1???^???g$y?`?ͻX? F?&%?"""""""""""Rr\k\ `'5q]bhU??ma f?6y?>gзv.?s???!??e\H?sײᄇ_?Z?s?s"#??;i???L??,??2co&?Ruw?d??.o??H??'q?դ?GQ?QX&????????? ?H?x???ƴy??EE]? ??t???!u??B???? ???+?x_L???X?ʔP?B?1f?g??ɛ? ????*??g?a????=?9??????{?????W???r?5?Jl. +??e,??Ē?+????`? n?u?˸????Lc*??J>LJ?iQɣ?Ő.?Tw??֏Y???(gő|??KimǗ-'Ż?G?_??Xcep?wj 6??kKe?????f?^??q??\??vLg?????/??S? nP????????xft?B?wsh?`UJ??8}Ɵ;?+?^???u????w?_w?H???]v":܁1^??2z??????f~?w???e?ܡ,???ѧ&/5?筹}??*U?$m׷lO?_?%g&?ƶ??????Ch?r?X?5?xk???Ɏ?o?}]??c""""""""""""?@??m)kXr?B?vU??????ܷ?/gM?`j6N?a?-???~MF q??? g??~3?pX (_???h^??ӑ?̞?3Y6???MxEs???h}!?+??H޳?烅#?65ϐX?6?W?b???\ ?0?r?,~?CX?f?-0??>wӠq?z?:?i?🳹\=? ?fKqwl?S@?3??ZNj??????{i^ɃBG??M?.?h??|1?->?v?j??/8?Pw#?e??T|?y?0?+/?\w?0?Z+?ൟ?n??1X)]???7????D?5? ???+{??Xz| ?a?h[3?fת#^?;1~P f.aL???}?Ӛ???P??k?H??q h0?3Q?3wҷ??G$?딺?˰?*???7????]?%?a??ˏ??H?|8]?8 ???р?7Y??΂??wLDDDDDDDDDDD?/dHO;W??b??M?}o??e=7Q>??????#yov?b=n?o??> ++??4??o&rߤ?????r?Z?TVtx?Ѧ??z?!?n?&????t{???]>a?}79?????z%>? ++?Nl?????jDDDDDDDDDDD?Y????ܒ??3???_?ģNW*?΁aI??P?Z?#i?Mh? >{???7R?w |???1????"?Lhio?9'زd2[?B?j> ++>EDDDDDDDDDD??Tb?ϼ? ,;???"????? %??Be?ʢ??>? ?\ou15;?? 9?C??? lt?qj?>_??c?Y8?KR?>?{????N?M??moEDnm{+""""""""""r???mo????????????????? ++?EDDDDDDDDDDDD?DP?)"""""""""""""%??*??=? ??^ʯ9?????RI??0??=|1k+???s2I_M??/????/??IY>?wF&p?v?ׯ??Y?wr?q?k)??9??3?_?~ȬY?? ???WR?(??s'2??uͦb?~? ????s?H?h?8????9]????w?ܶ?????P.?{?y??????̵}i??u>>???uEDDDDDDDDDDDn???ә????? ~??ͷ??WR?(??,[????V???_???oA??39???~T1???UgJq_?P??X??}??sMy(? O?v??k??????p?t~???????+??)??6??_o??y???Q???뉁|N?8?qӾb??4???ײ?????d%1??Q???('?f`3yR.&?g?z??ʻa?A?/?;v.k???k?#??? ?/ʙ?y~^4???fWra?i?\{^?????ӑ??l?>?????J?{??U???}Μ?$|4?9˷q????Z<;tO??f??n ]????JG???tlY#??˰a_??? R??a? ?v?'?o?D??HJ??R?-????z? ++^'9??3u?l?!ӵ ??{???!?j,???'?ؽ??N&??J????1S{3(?c????1?4[7???xWީ??X??F?t????T0?ʴ??I,?"??֥4g9??? ?Cs????3?=߉w?ZI?i????1?4??c?=ɏkv???mީ_sv&?0?B?l)|ۯ#wG?X?>?j&#%?0?0???i:?kG?;????c??I?(7li;ٴ'???`??s;0f?H?WhA?????z?ms?0k???z?z>F?gV3??vUkC瑵?M???c??|ܻ6?E?n?????????~? s?0s?H??D??Ӗ??Ňp?? ++U? ????{? 1Ou??`7No???r?4?Q?????????tՓ?V0?<(?8?U/d???=???өuU|mgH5??^?j??????3, ?|?uY??՟!?s~?v?F?Z??D?g????L7???=??/?MaԠ?ĎoNi??j?p??????;?b?? \??c ???]???Ij???#f??`??"""""""""""r????m??/? ++?W ++#v?O?#?\??;c??o??*??f???d????Kw?k*???g?`;i??? ??;?[?????Nb?u?J~? ++????8??F?f???J??3???>6?>??q?????8mG?% ?j?玚>?C???9??c?L?:޿????z ???o1???^???g$y?`?ͻX? F?&%?"""""""""""Rr\k\ `'5q]bhU??ma f?6y?>gзv.?s???!??e\H?sײᄇ_?Z?s?s"#??;i???L??,??2co&?Ruw?d??.o??H??'q?դ?GQ?QX&????????? ?H?x???ƴy??EE]? ??t???!u??B???? ???+?x_L???X?ʔP?B?1f?g??ɛ? ????*??g?a????=?9??????{?????W???r?5?Jl. +??e,??Ē?+????`? n?u?˸????Lc*??J>LJ?iQɣ?Ő.?Tw??֏Y???(gő|??KimǗ-'Ż?G?_??Xcep?wj 6??kKe?????f?^??q??\??vLg?????/??S? nP????????xft?B?wsh?`UJ??8}Ɵ;?+?^???u????w?_w?H???]v":܁1^??2z??????f~?w???e?ܡ,???ѧ&/5?筹}??*U?$m׷lO?_?%g&?ƶ??????Ch?r?X?5?xk???Ɏ?o?}]??c""""""""""""?@??m)kXr?B?vU??????ܷ?/gM?`j6N?a?-???~MF q??? g??~3?pX (_???h^??ӑ?̞?3Y6???MxEs???h}!?+??H޳?烅#?65ϐX?6?W?b???\ ?0?r?,~?CX?f?-0??>wӠq?z?:?i?🳹\=? ?fKqwl?S@?3??ZNj??????{i^ɃBG??M?.?h??|1?->?v?j??/8?Pw#?e??T|?y?0?+/?\w?0?Z+?ൟ?n??1X)]???7????D?5? ???+{??Xz| ?a?h[3?fת#^?;1~P f.aL???}?Ӛ???P??k?H??q h0?3Q?3wҷ??G$?딺?˰?*???7????]?%?a??ˏ??H?|8]?8 ???р?7Y??΂??wLDDDDDDDDDDD?/dHO;W??b??M?}o??e=7Q>??????#yov?b=n?o??> ++??4??o&rߤ?????r?Z?TVtx?Ѧ??z?!?n?&????t{???]>a?}79?????z%>? ++?Nl?????jDDDDDDDDDDD?Y????ܒ??3???_?ģNW*?΁aI??P?Z?#i?Mh? >{???7R?w |???1????"?Lhio?9'زd2[?B?j> ++>EDDDDDDDDDD??Tb?ϼ? ,;???"????? %??Be?ʢ??>? ?\ou15;?? 9?C??? lt?qj?>_??c?Y8?KR?>?{????N?M??moEDnm{+""""""""""r???mo????????????????? ++?EDDDDDDDDDDDD?DP?)"""""""""""""%??*??=? ??^ʯ9?????RI??0??=|1k+??ou)7?v?_DDDDDDDDDDD?v?? ????2?Cf????d???ܸ??G???8?)????b?????K??q???I?????hx?}???ld?]??7??Y|C?m܊?I??,?F??:??? 1???y???<“"?f5 """"""""""""??r? ??83?0s6?mP?|???q%??B9βe?>??AM??؏u?????럽?=??????tҕ?V?,9??g?_???Z?v5Q*̂??r??????~??????? #??7.%-???????N??????0??x7]R?(?=u#??ܧ:>?37???GY~?ND??hz?ߥ%??G׳9ݗ?/????.?G'????qU?_???GnZ""""""""""""r=%-?+?#????$?|;? ++0A~ ++???`??[8|<?h??=:?zb ?S??bܴ??p0 ?E??lG?'c?6YILyg?9?ɳ?L?????ٷ????np???"Ǝ?˚?)?????,C??rf?q??M????ٕ??GXm?>מ?Cq39?t??,۲?cg?p????dzU??}?3? Mb??m>o?+???e???1S{3(?c????1?4[7???xWީ??X??F?t????T0?ʴ??I,?"??֥4g9??? ?Cs????3?=߉w?ZI?i????1?4??c?=ɏkv???mީ_sv&?0?B?l)|ۯ#wG?X?>?j&#%?0?0???i:?kG?;????c??I?(7li;ٴ'???`??s;0f?H?WhA?????z?ms?0k???z?z>F?gV3??vUkC瑵?M???c??|ܻ6?E?n?????????~? s?0s?H??D??=am)?]|???P???.=2?!?.?#??ep?ι?kؘ?˽?P??NFv??F???iӥ?>&2??c҄1 ?τ??V??A??? ??^?si?x??C\???o?+?|??$s?t??4x?N???k;C?)??KH[???wЙ????C?? ?3G?zf??ň?5iն-C͜^7?q?2??,?Uq??:??1????j?K?_!???????????=O?%??E?~c0o?w??t???c??:7?Z1?y???q?A[?pv}??郡?> ??g???B?a?i_Ǜ??Niƿ^C?.?[L?'?Ŷ???E]8h??R\j?@L?6?y?iv_5?@Հ=$????O?Q??ĉ?SI46fd?g??a?隶?6??q ?65??݇؆??\?(?$^_?O)y???`KYÒ#nĶ??ץ ??}C??,?7?/??&kw?U??-??CÐ????cX???"??|0?ND???r f|B"???|?̫^??$N^ʩжL??d????[&|jԥN?*??#???hڴԋ?? IDAT???'?}??J!?J?kΡ???}????0? ?K????qYq?|???LY|??7fҮyiL@?+?~??׫O???`????䇟??l???!??|????&/???w??UV4{?-???17???,?v????W??n?z? ;??? Xb?5??D??x?U ?g?????iޢ?V???S7q0˃J?B??uI?7U??b??_3^"???ч??]?8k ++?IE????=?m &3???HN?n??4;~Y6????ŋH/#?gΑ??\??????H•?fv?d??????I|=e ++??8q6????<3Y??????×w?M?h???)??u?2???8|??N+??Y8ò?????̏G??oR??B?????/ ???uq??ٓ`???Sr??k?a?L?Y?e??*??????ÙY?MF_>??9??5??3??0?????????????ݕ??Ӟ?????T?S?????߈?k???/Y4*=̢~???o N? ?M0??P??򌮾5Z&3??B?f???}?6?K0oX;>??#F?F????w?Xket???tq??Y5??S׶#??ƚ???}?r??LX???q8/??`t?t?/??א?6?A??یJ!???:3?>?;c6T๎??????" ]w???dV~}k\W*z???????^?%'? ?n_?2?46??????-??5V?u0?18l8/N??р????s?t`?;1??z?Ӊ??M??#??~ճ]??????I?? g??g????{31??C?{&{~8F??S????$????(j: ++?Äwt4޶?|???7?i??И6??C??"?+?vck*/p'(?C?6Ny?\56??Ax?b?v?{3???"O??$:2???aX?h5?x?Nyqg? ++x\2?`u??U?W[EpvQ?}?=??&?͇??^lIhQK? ++??#???*9|߿7??f???$~???)??K?Jf???{?Hڷ??yf0?7???݌??s?'?e?F~\???{2?(]???????`?6?$%?o? r.??y_???z<q??Ds)j?w??ڏ??j?Z?7kS)${?տeќoY?+???}L????/3?sϫ???B?wg???f?nZ???vs?QD???:sh!??'????{?>????ٶ?[?}??wL?Wuڶ??Ҿ???K?l??????r???5?Wrf?kL?W?M?]u?ٿ{??i??c;F???????????-P??????a?Q 5?U???27;???????L??i?#,?]:?O?Ɉ!?3??a??o?o+????͉?+jy?e??d???ɲI'8?o?3(??^?G?? ?X?gG??e<,I??yx???@?q??$?o}[x?9????`???M¢4;n???????????QL?=????????O@5?Xnxş) ?~??L???G-'5Ljg????ڽ4??A??c??v?~?y???e;q?z?C??r??te*??S?1?R?51?,?????????`???}???|F?5??! ??96???X???Ĵ%2h?yl?R??hFՇX́)t;f'?????1???!=?\????[7q???????D??Ӗ?>??????-???nJJ??IC?7?o? ?E?~_??{՟??/???q??ى?75??g?q?J|J?.??U?^?/?FDDDDDDDDDD??%=?\??-?+???Y??I ++?͡%???߄f!?:8???~G?n?.?B??r?{??}?0{^2~M"??????9?W???/Bƒp+?c???????????H Sb?ϼ? ,;???"????? %??Be?ʢ??>? ?\ou17??o????o>a??d?m.xFP??>?n???>?ˑO?????~G?X?!? ?????-"""""""""""??R????9??????????ȭ?G??զ?"""""""""""""R"(??Aᧈ????????????????3??7|2{)???3?K%???82??Ŭ9?Hοեܐ۽~????'?tf?????" W??VWs?JJ?rpn?D?|??????ֳ.)?M?{~?j&ukã4?????r?n?q??w!C?x?f? ??q+F'e???-????$ļ?~?Q???O????Հ????????????\?˭.??????????i@i????ƕ?> ++?8˖y? ?5?O0{`???O?N?'?????8?/???aHW?[8?#???c\?I$V|???jQ??D?0 ?g????????+??s'#$?в޸???ZDDDDDDDDDDD?o?~:9?{?s?h{w?m?tI??p?ԍ??`?r?????ܛge?A;=???~???????J?{??U???}Μ?$|4?9˷q????Z<;tO??f??n ]????JG???tlY#??˰a_??? R??a? ?v?'?o?D??HJ??R?-????z? ++^'9??3u?l?!ӵ ??{???!?j,???'?ؽ??N&??J???????C?]-?w?,???j?H%?#??Zu??3??2^xo?5???k?=a&K7??t????W???'??????????5?Iu?S??_?L?z????""""""""""""???ӑ?????Dv????UC??,M:?g?;9??? ?`?Aƶ????U??&C?"k?&?<????3??|'ީj%??9L?&? ???1?$???E~??y?~9?ٙX?? ++????m????cm??f????t??\??Nx???t??~?9??T?N??5v&??ܰ??dӞ,?w̃?&??Xi#?^?m_?K[?y??ì?#?>?????Y?Ў#?U? ?G??7?'f???????q??xU?9??[????V?)6????#?6{u? ++?v?!\??Bo???? ???f?????;?v?acr(/??B_;?a?2qV??M?????H??I?0 ?>R??[?~{?kx&??zaH̥i:??q?+????o???]С???y:????? ??p?/.!?m????Ag?i?n?-?3??@???5n#?֤U?? 5sz?t?MȤ:??V???s?H[Lj7?ګ /u?(o???+?r????ߎ?o??i?DZ?J????[l?)??*a??9???Z?!????Ä.4/m????eŅ???w2e?q?ޘI???1U#?l?? _?>E˧???SDDDDDDDDDDDJ??~:βe^????5F???@???ep?WY??Z?hJ\?????H?ݗ??_q? c?!2???W2` ??׸??v?V??V1t?ў6???y?4oX??O???,*5 ++???%??T?/?q?&~?x?0??PDv?wm??)?&?~|?4?-?̌o6s 9 ?????e?pv/"????9G??p??j??t??????N/??# W>?م?Yj?vcpd&???),NL???\̞f2??d?/V?O?_rܽ6?=(2;??|R?}ʤOV???)?;?x?g? ??^h?@n2??ǿI] ++M o?~?"?0?>N??U?fO??~N????9?9?1gٗ?S???&??gfqt?S4}??????׌ ??? """""""""""?wW??O{?F??7R?O | ++B?#zL?A??d????X0???'ҿ18?.6?B?2?3??T?h?? ? !??JT????p?.Ya??d???? ++b?߅c???և?Y??ppf? zO9L\ێ?S;k?n?????`0a1?f???pS???ž?\C?f?? ?2o3Z(e??B???`?????P??:??~?7?C?0t??s??Y??I?q]??a?jL?+??"z ????7x?}uʘ???????J?,??v?ͣ??:??O?=?X֞?]????:??3???L/{[????,??^????ld????p,9?ŗ??v??ْ?C\/& ??_1a?l2?n?????m??-jz?칉?8?ՓȰ???????#?b0?a ?,???^???G??}m<Ϸ ++?D?K??`???c?L???Y?Y?f?% ?o6?q?A?;?3???)y?=???N?5??3??`?x??,f?{ߐ?kģ|U??O?Vs???1x?g?????#^???n^?E?j??S|?>?{"?????2????:?طg'??4???\GVN/?J???51?ދ?VSV?(\tzi???A?????b????G????|K:m??.????m??????M$?? π0???rM??h8w?]??EDDDDDDDDDDDn?2?쭈???eoEDDDDDDDDDDn??Y?V?Z?????????????H???SDDDDDDDDDDDDD???"""""""""""""R&?V?gީ?X0?K???z??[RY??pv2~^Ό_s?z}?x#ƫ??|??l?\?]?k`=??yӘ?K&??{e?2?? ?Y?1?y??q6nv5????aM????:?н??W??t?p??y{?~????ܠ;???'|??^үG?x???5?[/]????Q??ዅ???t鞢-?(??l??u ++?EDDDDDDDDDDD?ɜnv?+???,ەCP?Ɣ7??j?ݟ?0&?f?H>?i?????f??]?x????xg?B??XHm?[??)+Ͻpv2??f??&?Z??2ן????????????չ?ӫ??A????? ?k??p?????}|s?FX???n?{M?-????EDDDDDDDDDDD?4n?<Ȟ?/K&??;w???ƙ???j7'3?= ?fF?+?V?m????+??XF???վ;=????>????c??S?Mɤ??A??tx?E?u???7n ?~M"??K????(?̀=?_?Of겍?'??K??=x?E0. ? ?|??݇9}!?k0-FMa???Ñ?K?-????)????B72~?r????3l8Wh?Sަ??? ?3a????k2??4x????ǹ=???f??8??F?? ??:?ߥ7?5??剅????v/k?yt?\zVN(???g????|????gʅ?????1??#??k?b??5?=??s?(?{?p劷?SK8`{N????MH??t?ӕ???`?`???L??'?&??g?$??q|??0,???5?%Ո???+?4q ??s ?z??,??o?蔶???O??-??l?"?fUR? ??wwט????3???/?J????vg??W??}?f????2)?'?????????,?F????3ٹ?a8#?M??+#??Jn?r?-????C^???'^bD?@??-e??70??-?0Zϳg????????~?o>??????6????n#ߊ???{?wdqd?V??=E?w??o?"?\y̅??#?Zj4P????s ?=݆?E ??j?????cq???8?S?K'kv IDAT ??_>'??`??+?7?R????l釯s.?}??qS?3????8v??k????L?Tt??$"""""""""""R?᧝ԽK9w\9???9???\???1T?3Ad?K??g˔oȊy??]?c?Ö???>Қ7??1 ?덁?D??c[?ؐ?<?Y????8?jF?b??K?82a??G?yx"ov???Ս?緧:s9?w%'|c??Ao E? ?V!,??c??????Nb/=b{2?&}ɹ?.???Af?~??G??w)??3?[a???L66?j? ڳ?j?t>?v???`I??z?',}?; ?)???^3????|L???hԵ?^?K??6:?_????gI?т????E?*?d???'??A%7?? ??>???G??0????ҥM*Zr8z,?r)F?Pjx?v?b?:7!??H??l?W???W3^%Ո?Jm?????3??N-???Dz|????T#?ڑNu????????Ѥ?7$?!??K?"??? ?i?z??#?????A?K????b??U??+??s? j|W =?????????????Me:?,H?ĊSjw????Y?6????yS8?????KHL;??lI?Ɉ!??U`????0h6?v7?C??d??? ++??8?ՓȰ???????#?b:?a ?,???^???G??}m<Ϸ ++?D??????2?^?E????Y ?:?Oq???N .. [???p??ׁ??3??L??ҬWC??*??^??D?????W?(ǁ???A??/??????ZAsȰ????D??x?s݆?H?뻐L?WO_#??(?q\?x?X#}?????,??YSX?`+?s1??P!?.u+?&??????9?M???쁷u*X0N?????2r?8?}^!wѵN (?'??Ȑ??Z??`????Q??7??????E]??q8??"???SÛ?????????o???x?+_?w?j????????Z?c??40k"?W?ŽޣT?'`e?????????????????m?̆??gְ??  ??f?7??>?W4^""""""""""""??2?쭈???eoEDDDDDDDDDDn-{+"""""""""""""???"""""""""""""R&(??2?? ++??N}ł?_r?Y?|?"?%Zov)?*??4?-l7???n??ӑŁӘ?.g??fWs?n?>????????`4?nv1??&}????8?e/??vrN???m?q?d?""""""""""""RJ?M???:Ȳ]9=ؘ???]͵??????{?a?z?:>e?u??Ȕ? ?????d?""""""""""""r?( iU)8?ؿ?}y!???6???{H,?;?????c,??w???l?5?w???{??3'?h?N?X1y?Q?????m???5????]=?Dz?K?p????;??c???z2??[?/g?1y?f8#???R?8?H??)ǝj2??7F{{g?f???q4!?D?哸s)?? ???s??[? ++??[???޼?4sF f??ع?}Q?tIA[>;?s????e[G6o???S?}?.??,?˕?lt?J?'???_?\~?~?? ?-f.=CkӸ??eߝ"????rv?2s???t???C^"ߟ( ྺ?+??-HZ????9֞nC?"?v5?x\.c???M?0??󀔟?|?4F?Aͱ?r)S?څw7??L.?1?8ODDDDDDDDDDDDn?? ????w)??+?9?R??+?0??~&??q???l?? Y1o0?K???W?`?????GZ?f?`?;?!?c?1P?h?}l???'??????G\?H\ u?G?/L??(>O??NQ㸺????4Cg.?T㮄??o??4???G???> ??bf?6r??????#`??????[??fj????3sV%????gȴ?ۀZQ??$k??tIA?&V??BL??x^.Ԉ?b???????ՔF?????5??w_*?4jP?yד?CU?y????????oϒ???Vv?{ۤ??>k+g?\?^?1xXw????ot?>V???(?{$????[5SV?壍$?݋????????S??P?版????????????S??O{ ++???ُ?>F?H`?gh????܍u?Tl ?؝b+?{?Q?\0?LZ׫NxxUjT??? ???~?mt??6-y$?+|????Y? I^w?H?k w0??Ӛ???"?Gj`?????+?q#?}c?V/d?9????c6h???3&Π5/G?}??Jm?????3??N-???Dz|?? ??J ???]?Z?&?yI=??????W¸n%?WD?6?@?9w4)?<???t?Y????,??^?? md????p,9?ŗ??v??ْ?C\/& ??_1a?l2?n?????mK~?s9?q.?''?a5?ŝ? ?G?Ő0??FY&0??1?6#??1???x?o??—?-???ӣ?¸٬ۏ?VoB?|0 ???[?v??K>gʩT? ???????W??m'??q*8Ť?????!%mÉ?????w?=f??S?08{??B? ++?ˋ̺?>?A+Y?܎U???l?{?ʴ?d??8%e??}?????,???V7*?>FT?N%?'""""""""""""7?!=-??+??۳?FM???z?#+?u???ጚ???b]]9F?t?x????1;R?K?????ɳ?n?!???l޸?r? ??V?Z??jDDDDDDDDDDDn/?i??>?????&?~?Y??????6???>l)l_????AT?u?v>??}Kfp'??1?'?pb?f??Z?@??q?鰒??I??܌? ++&?J?Vv/?ي???????????H?l??f ??y?`@8??-?VUl?غ?/??$)ӆ?w%?t`X?'?|?????,ߒN@????|??Q??$? |???1*??z????κEDDDDDDDDDDD?ڕ?eoED?-{+""""""""""r?\Ͳ?Z!TDDDDDDDDDDDDD???"""""""""""""R&(??2?? ++??N}ł?_r?Y?|?"?%Z??ĜC??:????;?gqh?,>?? ?W{?m???|??l?\???RDDDDDDDDDDDDn??'?tdq`?4?????d???\?[?;?;&1}?ͦB?pX/?????/??ϟ??g׶??,(???o??O?.??]?\?ٷ%kҷ,^???Y?Rm'??^~???H?."""""""""""R??&?tddٮ?lLy?ͮ???r}?Sؽ?0D=N??_????xg?(>;s?3C?&??Ȕ? ?????d?""""""""""""???$?t??)??Bx?QN7??kv??aK????^ ???m?[ӭ???x?t~Y?3??ݹ???$6?͌U?9???40?^1?rn?1??XZw?-?q1??X8?V?>?? ?8\?i1j ++?p?k?#?kgNb??=?H?b??#(????M?@Ik???Ż8z&??\?r???zw???8r9??dޛ??_?dc?$??pFt ǥ?q????S?;?dHMo?? ????o?hB*yFO"???y?v?????<:m.???1?.l`?F??n??ޔr???{??%??L?u>??߲p._?Ə??K????x???o????m?H???Q???;ҫ??Tq1??8?=? 3&?g????r?@???^?? ?n%??\?8???7"?4??j???1ᴡ?z*g|ŋ?c컀I-?0????T?dz̟?}?Fpd???'y#?+s?=L`??v??`??%l?O$?-??Q??W,??{?I?????I/p?\X}z????}?s~?c????Y8?)?g?0p?"??J%?ɛ?:??ҧ+Mo???"""""""""""r;?-?O{?O,???r}?Lv.l??OSh??H?G???x??` ?d?????n 艗?;??}K;? ??adK??????y?#}y????曏??~g???A??83Oa[?? W???p&?o@>'???? ?=ݓ?k???uSF??i?L???Øw?͛ⱶ???wWœ??%ĥ?>??$??c?????y)č???????ϰ?6?@?????J?7???O?ΥL?3??*?at ?l +2n-?G{?^?? $??0c???E??%Il??ε????lYټ??nO??ݺ???.W??Kf???!#y!?3?A???92?1??H?Vy? ???"?p`?:??^?? ??????r?4??Č??-?ܧ~?&2?e?ı ?ʹ?*?QL? ??h???L?1u?I??ܱ?z^0sވų??Vm??????<7?5|ld??P?l?QT=?צqy;˾;ENK??????#d???????w??D??Q@?}u)W?_nA?j?ρ??trA$???9????Af??A}__?l??q?X??5?;?????C,?]xgpS???R#?K??aA֓???J—3?flΘ~Oq????o?&:?Z???Xb?KQ?[ ??wq?Wd=q4jP?yד?CU?y????????oϒ???Vv?{ۤ????ʙ/??z ֝{|/?T??Ǫ??(Л???\??&???X??z?&?_??????S??P?=??M~???)????F???? ???쇟?v/=?!?u}????V??l?;?չ?x?v?ZW?c^??I????-????c? 2m\ ++??d????1???E??????݃??ZҶ];?6???X?wr,۝j?*?1???E?1?????])j??_???q`/)? ??.???fo?X(HI"?^!??T?MLx?3'???]?iQ??ild??/؞x/>_??%??T)??J?؋~???{?u??A?Wsw?'?3d??_???r?2?ﻬ?~???I5_#??b?ҫ ??oL??'?????9E??^j?`??f?gxs?l???m?W$??_???p?X?*U?? ?荹???* i?ߑ̚???_2??,???Q?5??ߝ&??C??Xw?oB??MXXNxFT?=???dz? NK.?B`?6t{k:?_?¹?s?~?1NV????????V?58y`vXI?.(?[> ?1fLG*??H???I?_c?T??9????`7?I?8c?ѧ?rg?ªV????ϵڟ+?q~??rγ??ރ*?_㾖%???# ?9??*?[z ++?VwX?!?˝g???,;a!?ђ?\?? ֱ;?V?!???k&u???u? ++'?zn?_ANN8??ɻ?yس??炉?g:к^u?ëR????SDDDDDDDDDDDne{?gA[>;???????=ձ??? ++?'Y? c?~>???#???6c??s?7?F??kSђG?ɳ?4mG?o)"?Y֬؍g?0?]?$?:L&?ݜ0x֤??a?0?M??~?k?qn?"&m????_???[?5 ??"??X8lA/>B??=I֫??-???FXD ?????a7???? ??? ++'c>gVC??]<?Z?=L?????a?􅬱7?'?,?5Z????Fܣ???7??m軼]s:?? ?\?Ep?n7????S?????????]??3?????\?/??J?U?לͱ???b?????P?;?}iO5?????ē$??G?j???????????Z??i?P??/??l????̘8??ּQ??F1S?M7?|:??}F?ک%5??H?O?#?t??zW2???? OѠ???r/???W¸n%?WD?6?@?9w4 ??Wk?.f?s?????T>?*?8pv??7(?`׋{??k?:/?z?Y????F??Ljjމn?^$w?R??]H?݌??/???xh?????????d????R???o?N5i~#빎??^ԕ.?3j? bJؗ??uu}???=?y|?G?;?乓?"??X:???M?M??kޠS?c???x?+_?w?j?*?s?>??RK}lٝ?iMd??????K?l?I?}?Rؾr僨????|??-????J?7?@?????c???{? ???^?I?NozmI??-l?Xp??.?'6???????????\?2?쭈???eoEDDDDDDDDDDn??Y?V+c?????????????H???SDDDDDDDDDDDDD???"""""""""""""R&?V?gީ?X0?K???z??[ҭև=? ??[ĺD?՝?s??_g??Y\?N??l??#?F???nYe=??yӘ?K&??]??????????????p????,̘Ƽu?8? 7??kw??a'u?$?/???T??~??????????ڶ?????w?l?ڰ?dz/?y?,~ӑ???r ?:?Ñ?????p? ??g?b?'l?!???؃g[?br??p???}???q??b?????>G? ?ΜĢ?{8?b???GPD=?ߛ???ּ?;?wq?L??,?©?? ???? p?r??ɼ7o?????Ht?????K??`#y??w?ɐ?????5?????фT???D>6??????v/k?yt?\^ ??c?]?????`O??Ly?)? ++_E????I???L[?????ɧ ++ww??M???y?? ݿo???/fli???C?}?????C????^t??3%???6?iZ?p!??l>?A=!?? ?2z?&?O$?fu?\??8?!?6 ????8???5?w?W???b??????6?????;?2i?ު????>??u?????к?1?%????J87??s^??'ڼ?/??9??&??̉?????q?/:??0??V 3F??*??e#??M?H ??}??c#3'?rf#??-?ܧ~?&2?e?ı ?ʹ?*и???Obn,.?}r???q?|??z???????B???Y?????Xҷ?3????+é?????+????????᧝ԽK9w\9???9???\???1T?3Ad?K??g˔oȊy??]?c?Ö???>Қ7??1 ?덁?D??c[?ؐ?<?Y????8?jF?b??K?82a??G?yx"ov???n4>?=?Й?9ո+!8?{7 ?x?4???=??ٻ??9t8=???X??}z??F??V??qg?q)??gda??k%{N&??p?Ú?#4??+????V?9ϳesX??J?KO?4u5{Ϸ%0{-?3?iָ?5????v? ?r4 u?/?????????????ȝ?ԇ?????;b?ʻ5񾘫????wZM??,f)????F=?3?8N?x?/?\1????CPQ?2?1???3??~^4??#?2kγ|??ߨ???????u???n???x}1??l???ap???Yܷk???˧=?a?_?Y???[T??(?ٚȪ%gp??Ce?k???g?)??a?x???Z?d???;???1?ۨT/{[???E?jv?????ld????8?????Kh?8z?x?@?ClO?.???~b???d????? Z?[Ԇ???&r`? ?~~? ? ??(?{eݢ.????F3?2??ߍ??S????#???W[b???o ??D???A0f:K>??t?7?Q>?????i??4?{&ğ'??J@D,??????$է?xƯJ??/OZ? 7]"x?o;N??Q}?`??LӞ iZ???L?6~????s????!???????Nc?=?? ??ެ,p"&?}? 㾮?Rw?w??? ?W??{]?ze ???g??/<'??!5'扦^{?̋???f??<5?sf?E?s я?ǃ??_? ? ??a????ɬ???}:V? ?Tj???????ş ??y??/F?????o?????%4`.Kˡ?p?6?of 燔\ ?>??X?:?.?????5:?s&???c""""""""""""??!=?|????;????f?r<7??S?;???F}5?Z??Ky纾:r???}?}??2??*?0?N??>?C????y??n???? ??갥le?QU?????5????????????ȝ?N??n={:???K~xW? 0?5??S?`ʒ????H??E?Z???~&?N??-??0?W??6]??\-??@?!& ?????9??I?Ƀ???i???y,?v??/`̘9?;?L?ٗ???>?iʛ{?-????ֲ/1?к???n??<?{??G???9u.?k?GM?_u????'X>u?H??;?;??^?7F{??}???{8z?h????"???ӽ??I(??Ӝ6?c?ιէ? ++?ٰ??5^???lYY???n/?gD Yd????#3?r?{#y?? f?+X ??o???͔>#??*c{=X|?I.G??oϷ???C?n?Џc?|P????g#?$?J??,Ne?GT,?1?? ??H??1?ۣ??ǻ?p??Ͽ?3h???L(N??mD????W??'?a?#? J?F>k?^?'&?0b?R?? 'cCG???(???q?N ??JT?Ԉ??H$?X???E??X?oju???5b)׀??G?v???4`0?Q>?????w\ ??Y??o0?,????(?P߈ IDAT#c/?&?? ??,? ???ƮM?Y?6?6?W?b??T?ߐ? '?[??U?S??iF6??~?F?LP??h곓!???????? /?͉٤m?O???ѬY3?=܆?2)?8A????D?c??t? ?*?J?h?gu?c???\?;????l?X?;U??r?v?՚?Ø????????F??]??*?x?w???ٛ?? ++2?ɳ?K?3????:?m?~ڕD??k??B5$?YL?k]??r??3?}ڏiG??cH{???????????G?G?f?U?7Y??O??L ++?Tp kFu?Tv????}֙???s?rƎ^L??Zb)A?u?M?H??Np?????^vڀ?G?????""""""""""""r?(?3?m?l??1?h?V???X?ٟ?/???????????q?@??N?8?s?0???? )獹????????H??k????~0 ?_=?\?8????.????쾵 /r?cau8?Y) ??Ӭ:?u?????Z??]?Lb?a$???.D??? ++? ?X??I?6?p/??'?+i???5?Ӱ ?G?H??????zΗ u4??&?%???6C/?V?T?w.2p?&??o?????"???_???Y?̆?'?T?h?K??=?X?Bd???#?M?????ٟƝ?2???j??c5)g?#??|???k*???3,[??? p????0?Xps??C??ymƻ??~?V1n$m???_!??6f?7hY??Ӟ?ȁ?3X??i2?&s0?U?iφ4?q?E&|?ɀV{?9?}~????A׈? ?D?2?Qޟ3u? ??A?ŏ?????e??? ??5L:??vOB?>C?/Q???w)?;?!=?|?WLݽs?lv+?sY95?3???`?W?U̾?w???#g?H???G?)?y?µ?N޸?C?С?f?|:]#J?A????[??u???A?"7l)??????+S??5jz\DDDDDDDDDDDn????%???&B?DV-9?{?>T?k?O?]?-?_XGF? ++??u?vvK'?&3???ܚ?r8?h=i?-x΂ ?>?(??o?;??ß?F?u??r?\??&I?;x֩????????????????eoEDn-{+""""""""""r?\ϲ??[8????"""""""""""""R*(??R?? ++???b?W?rzۙ*ӺQ?p??'?9?e???ORIH???ωٽ?5???{0,ƍ?M??0?;? S??c?֯ۇ5???ǜ??%ԥ?:??d~Н???h?j????st!M???6Z?8???)?ty?7???I?6??_?ǐ?/?????Ӌxo?r,O???&??3Ns???;??UT?.*Hf??8?x?j^?eqd?&???@?u0d??W???????䵊0???`?????#s7S??dSث???`??g zy1?fu"????? ++.??2?????`?ʇ?ːQ\?""""""""""""r׸?O;?w?e???b?0b#'?F?jlx???w?֬)????Ր?u?1P?h??l__?R@???#*?ؘH\ uq$??ߘ??Q|Z???Q?ԉ????4u?t&'|?6?Am??B???rO~??F?4?n?|0ր??O?wELna?6????NƆ?|??Q2??㜝@?͕?? ?剑H??ݧ? ++?ױ??.??Z??j?R??׏????i?`£|8????~ڳ0??`Y???AOj)>z,I/Ì??g?th}qF?LP??h곓!???????? /?͉٤m?O???ѬY3?=܆?2)?8A????D?c??t? ?*?J?h?gu?c???\?;????l?X?;U?_??^Tk^c?6?gگ??w?j?????%??fo?Z(?H&?.???B+??H?!S?iW??ݧ Ր?f1 ?uy:????)?áO?1?hz iO5??Urý4zR?Sws*?TL?""""""""""""r7)???-e+???Ҷ&??5?7???o???p?5???1??D????D`??L?6?i??f?d?OQ??y?&3??0???c?L?s?SX2?+?w??=?v?puPx?????p`???`?l????h6bp?.?|?2??>x?:??????4j??k? k"????-? ?ݯ??k?u?l?D?w1v?b??W?*n??p8p` ׮QDDDDDDDDDDDD?*?ǜ?i[???b fbZ?Ļ??ӿn?g??iC??:?~???? ??/??7?g?F?????#?6??Gd??,?~?s??S?^?Ԟ???g???&??Y?????g?0??O??x?5????k!??t2?Io???j???0???>Y!?aK?&?@\??4?ܔio͠?P?I9K?'???$?X_S?ﴞa٢xV?H????????B???????k3?e??k??q#i?l?? ++?o?!?&y??n??i?_N?ן???W????? ++R6?h?????p?????4????8;H߳??>?IX??d??y??k??0yF????I_?????3?WkN??n5?ݞ??I?ˠ ????-?0_??%?e????l?nŧ ??W}??]f??ߚ`?k?J?? """""""""""R???? y??-??Z ??fm??:???3'p,%?ŗ?Zq???0?&#?؞?\??_????ɴ?^???,Q?i?M???,??4VAQ????E]H??ۍf?e,??????\?G??)???D?˵^`????`?t?|җ?Vo£|0 %??[???Ms?gB?y? ?D??|?P??NrQ}*?g??|??$?.ſ?^?ێ?/`T?9??*ӴgC?ָ?"???d@?=??>??~H??kş?b{?ѕ?:????[????7?T??3?о?&???-???""""""""""""r?0???/񊩻wn????n?xn"+?fw?ӷ??j??ٗ??u}u??I??h;e2?U?Vxx?r}B???y???t??ܒw??I֯]??_?B?ըQ???"""""""""""rs???/???w??5?UK??^??????k?aK??֑Q?e}]?????ɫ? ?@?2?&??N,ZO? ?u=?4'?3)(,?7:?J??]?]EDDDDDDDDDDD??+??g~?2?&yР_??{0??k?Q???M X??$ə6???ՠ??>K???>???`C:?O׳????CDDDDDDDDDDDDD?Fᧈ????????????? ++ ++?EDDDDDDDDDDDD?T???ϼ????Տ?-?6?w??PG???|8d [??W???g?????x?????DDDDDDDDDDDD?.u?,?O???+?q6n?hn?U?????ظ??\okM?????q.??sI+7i>{]?1ݜ??????????????=?? ?Y??=? ++????v????Yu?pdB}???&p?+??,"?Dz`?g???(z?܆ǚ?D?-y??[|?? Y7???;>??[j???_]G?c(?ܯ?0v??lo???d??/C?]*-??ۑ??&&?b??]??Ơ_??lw?? ++"{?\>????d????gٹ????0?~?f??I|??3U?u???8SN`s???S?2????? ??{?k?9b??`X?ɛf3axwN?2???Ƽ3?_?k\/?5*?9' K?K!u?????8??7?7?Y???+?????j?MH??L?U??ǫ??v+듭T1y?Y??l??4)k???F}__?lIl?? 3????W???y????N??? ~F0????X| ?O???I?jD늮???o??¹?`???*b???{j?gqd?&???@?u0d??W??݅??ܕo(H?˶?4zs???8?g>?L??Jqt?[:?e?k?'??5f?~??????u??v????~G%z??a?FN?y????jX???&??v?ҳl????Z?пSc|?@???C??&?YS|0?]?!??zc??>???g#?$?J??,Ne?GT,?1?? ??H??1?ۣ??ǻ?p??Ͽ?3h???L(N??mD???goV8?KH???HRH'??y? ++f?~m??G?8~"k:??e?8?X?zc2/??ǜ??S???(?-??j???c?!???^[Ŧ????O?s!#({i*h ?h)?S?ųdu ++>??????4P??"f????aF#?r ??~4n??M+??y??~&O??֣v?Dqj?6?-?(??T7 &??????g???۹?????????????-U??O{*;??ٗ:>F?HP??h??? ?؅???".????`?Kfsb6i????×=?V?1??6.???3` ??Ǹ??96p??+m??9?w?L˸8Z6???XS?q,۝*M?q?t?ыj??a?p?3;j??E?Q??K^???h@???5N??mL??[?'?W=??5\??&Rڴ??q ?S|x??P\{?!?L???͇8?????Lf??l??螗??????'???? ???????૔??a^E?C???gӾf??T>?}zC:4?l?\3?kG??#9ՠ#??]Ȥ?????????????hZ?|EF???c?8b??Ţ5??MyW??W?V??X??b{z;EDDDDDDDDDDD?ƕ?eoEDn-{+""""""""""r?h?[ ++n? IDAT??(??RAᧈ????????????? ++?T?????????%????T???5???aK??ꓶ?l?????Q???e?d?])?s?z["""""""""""""%p?,?O???+?q6n?hn?U?????ظ??\okM?????q.??sI+7i>{]?1ݜ?ޠR???۟v?n?N0??V<7h?e?""""""""""""r{?3??#????P???1???ܸ;???L?Ϡ/v??0?J?/?Hp??3?.$}߉?ugK?\?{??ϴ??1GȽY?.??B??PB?y?t?sg????????????;/?΍???KK?`MdՒ3????J??q??s9s???????????????????T?gW????ܽ??w??X?Y;??,??? p??i?Q????+I?g????r, ?e?oӕ????dbҰY???3???<(ݜv?x???]0`'k?ƌ?ú????} ?ێპ???g?ۂϙ8o-??q??__????Cp1???z??,?q?S??q???|??Uw???b?P_?a????x0?Oe?z???kD?9??C^?Ǟ&L?у?.ڕ?w0?z$n?4^.s??o??Ͽ'?^??_???j???p.EU?Tl??_p?ﺼė!1{P4n%꿍???2~?B6??C.x? ?Z?7x?Ku<4?TDDDDDDDDDDD䦹'?O{?????F}?Mv??2??ߥ??͑??Jnb?! ????o ?? ++?vgx? ?w???)?08?KF>???z??ێ?x???@?aVL??Go;SeZ7*?3u?6??L?1?)C* ?x??91?7???#?}?Ÿ??i6?w??a*???c?;??u????bX???s????R8?????}y??E??B?NO?fڤ?tO^u {?*nk??>?J?3?Ǚ5???kL??fp ++?q?n????͖Ėٟ0c?h?5?z??k ?????g?KY|????p?$???d?F??? ++\8?pP`?'???A??د?g4??_????[x??!t?s?DZ|>?S??\y3&ߺ<ѹ"??{@?^??#?T"??G0?I??nϠ? ??3?8?[? j{c(?p7?? 6?????NL??,?@??D???q?D?tO??qT? d??d^)?9? ?7??U?Q?[????/?C??!????M????F?B*FP??T???Rاʋg??|??b?{A?n?ٺy!7?)w??{??0???gеeL@LE7vm?͒?I??? ++??#y??K?V!(u)&?%1?,)l????J??y?')?P? ++ K?׏E????&?'?r??ܯ=a?Yg;?mֵ?)""""""""""""7?????Tv?=?!?/u|????/????ұ +oE\?_? v????l?~?O??/{??c? 2m\ ?/g???q?sl?V?W?F?sz7:?~??qq?lR _'??l?X?;U??G?g??Z?r?????N???zAu??ƒ?Ć+?-`?t?~uh???Iy?U??m ????6m?O\??|2u?%?&?p?!N??a?0??o&??(b @ ?XX??{r1k???P?.?>q??͡???~ٱ??|??G????s;8??M?G?G??.k[?????p`?_?? sY?{fN?-??h>sGte֜g?ࣿQ??\ͫV:?x?qb?u;?b8 ^D???K?ŬK~??˗??לV?.??d?Go?ɖJ???@U???????ʁ??b?????X????Gx"???Q?aUc????r3>??????a???ۣ??z? NAXr??y?????׃*?F?a??ˮ4@?w-?????j???????Z1Z)`#e?|?9EӶ?????Ĵx?w?O??<6???ӆ??u"??1?˅??_H9o?%N????5???G2m\;??????Y?????Ł5?Ƚt?=??+?`??M?{Q???:???}??Hٲ????Jݹ?dcYZ?????4?/?ʂ婔{?%?????9??G??y?ym?""????0????#/???7?t.a??"??c,ܐN`?G)?$?~? v?!~??????JgYG?y?D?K??k??DDT?Ze??hk ?a?????s??d??8?R??@??]?ܤg????????????H?J??ςd6,&?@\??4?ܔio͠?P?I9K?'???$?Xߢ֤??? ??rE\?$n?L&ܜ0x?ХmE^??.#?_?U?I?f3?W?}? !?3-??0??????9?~??"??5L?x?f?Ӵ?????3?ʰd??E?v? ?N^T s%c??????wÞx???&GZ?_????(???R??i?H?b?hr ??v??wQ???x???̲?y??«?&?g :??mN??̓?Cp+H?Tӄķ?2h??g惘C??:????zo*""""""""""""????gQ?z??Рg?/?ڴ???NϞ???\?oB???ߧ ?&#???L9?2i?L?l.?U??ɸv? ++?my)\7?e?!?Є[`M?L???G?V?8???IL?b?N/jw?:??m?1Q?ѷ%?Q\????a|??#????J̣??9???s??בZs?p*? M}?/???ҵ???B??\·??S????,Nl?ϔ?.?t????.NDDDDDDDDDDD???hY?e???,Ս??a??u??R?2ػ`!???E?:Z?9??Us?͡3??7??R?6}?ѭ????""""""""""""R??[??????q?ȱ??|&"""""""""""""??O?~?????????????H?pK???'???9?p,?ܯ9?)U?> ++N%?????v?v?E?y?'?f?????K???['??gs`?G?^????p???~7U6rO?bӖ_??9la?&Vo??ق????drB{?1?9??????????????-?? ???Y?#?*?A%??????\}?rd? ?~???6p^?BR?.??Kc w"??7?2??????????HEu???v2??gw~7???F?s?*J?P?ª%ɸĴ????.FDDDDDDDDDDDD?N*d~v[{?zO????0?u3?a??8? ????8??Qn($u?l&???mG/`???m?{???(?E?ɍ???t|??????????X(?|?7U?;2j???[&{~ȴ?ؗR?kH4?v?ų??q2yG?l???????`w??ة ??zue?P?٭?bR?Wl:??ݫ&q>??;6?ߜ͞????c ???CM?????3??}?q"?V:o?t ++E?????? ???y?H??Ccy쮱???g?[?c,c??(8??e)?4}=  ????????K????3 0?U%??'hf???5?9???%???^??m>8?͞?O???;?|? &?v????b????? ????&""""""""""""7?-~?2~d?>+a/??k?qv??|q??/???pg?RN?l??]??еTy?7????{>?M?a??0??/??_ٹ??G^ad?d??w'0?uGj%????3?LeK?g?~,?8??4?r|??"? ~4oߋXoo\??l??????ޜa4v?8_K???=?>F09?e,{?%+????y4??Pg???O]????94{i8??8?c?????t?? ??d?k?{???g??6Ͽ? %""""""""""""7?[ ??q~?|?k?/?#VrS?Sh ?I?}M^?????q?wdG????2??a?S?H?ͅV-?gTb?=1ЈH??lyekS?S?/?S9?CL?p? Q\?=k/ ????Óy?sN?"???i??X??;????͈k?Y?{??>?^V-l?? ??]I|?q???؆D???e?4?t?B???Բ a??4? ++?\???M? ?'Q-n/??.?އY?c?? ++.??FG??C?.??,?-%=???,Y??????%3?S+?1  2?S˷?y?=?W=\??~Y???X?\??SDDDDDDDDDDD?R??O?9~?C?k4?2F?>C˯?fx??Yy?????KLU'??ilI????A?os?=?E???e?8????_$^?}?ɵ?K ??Iߙ?費 ???iע?P????9??jY??ٞу:?+c|w;Dz?b?j?R?(?Ԓ???Ӆ?????|?3?D7???9R???I??N ^??????MY??t/?|('}?% |??0g??cv3?U`&?j/}???cI?gމŬ9??]킹V??;??{?;???5C>??Y?{?*|?iM??G??z??ř?ɷ%?%6 ~?b.??kI?i?w ++CZ????۷?)?+?ct?"??i?? v?v??Bx? ?k????????'??{?w???Z?{5 ???ſ?F?Xbe?R;???8 \???{?]??t??<??,v??{?j???!4 ????B??????t?2?Xp?_?q|?z.???UK?Z2? ??EVl??%???.??d?n+?x]DDDDDDDDDDDD*?k?h???-Iu??C=??5k0?R??3?9e&????2?[??? p ??Q+W?Z??~?+{b.=??F\?5???ǐ8?#????C٘}S?9??kN?w飶 ?L??ݐꮥ=????&??M+;???{? ?׹?I3???p?|??g?j??,\q?ʏ???#Pt?e???Yoݐ??0?k??r?n???ɷ]??c9?h?c????ˍ+???? ?*.???!-?ϼ??????????????l*??Ϣ46~yK??Dz\J?ld???UiW?u?=????q2?Ҽ[K???V??׀ʖ|?N$??"???Τ?Ba2???{?P?? ++I??YX?sq??^??;??c֛???u]H?E\? ??3?]?Ai??6?ʯ??(?v? ???ww?2?hr??z??V???C q?9?-Y?oSs??\' ??܁߂??}?ڄ???P??B""""""""""""r?U???(m=?NZhг??wmZ??i'?gO?hz.v?7!Q?????CL_& `ʜo?4x&Y6????d\?r??????ŲϐYh?-0??? ?W?3?;?c?eӾǫ? p??ݯN?{[L?|?m?}????/0q?$~ƈe??{???`?w????\3A?u???1???BS?? ???˄i|5?e>ε????w?H??/????????6? ?XU?BP?cD???Zst?މ?m?0?V?6????|??n? ?T?+??0a?lF,??jv?;?&?zW?""""""""""""?Cƅ??~????i~g?????Q!??v???a??3?(????D*J??g?`P??????G?VV )7? ?V??S??k????W#""""""""""rkɸp?ܟ????,LaՒd\?JͿs`XQ?(?????ٝ_???? ++>EDDDDDDDDDDD??U?????r????h?7???BE??T? ?.?CA??4?W?)""""""""""""ׯ{+"??б?"""""""""""7????[??O?~?????????????H?pK???'???9?p,?ܯ9?)U?> ++N%?????v?v?E?y?'?f????? ??b?G?ٛE +????????????Hr넟?lL???+sp4nt5?????F??]l?? 4?-L??? {9[p???ԕLNHb??#???Ă?,?,?u????;?W?Y??c?V~-??e????????????Th7???{?A?ȥJ?;?d???\????\?L?Д?|???T??v?]?r??^???/f??|3?~9G?ɓ??ci?hg:?^????F??w8???yq????&"""""""""""R1?"᧝???ٝB?????+J?P?ª%ɸļJ W??d??}?yȋ&?A?.Up????u_1{p7??5?????????,""""""""""""?????Ul읿???=i?g??4??x??K~?D&????r?X?F?a??? ??8?k???ѷ&???I?'??09?I?.??$?\E&7?"[??????ldX????c??4???T??Ȩ??dl??]?!??c_J?!??۩϶???1?(???~?????;???\????Z?8??_LJ??M?ұ{?$??g?g?f????3?}~l??Y}??tq\9{?ѱ?!??N??J'?2?M??O!????Xz???b??`?????3?z?>??_l?? K??F?C%j7?n???? ("m?x???~>?FF8֥u???=??????t? ??{?6?'m+;߷?f???w`?jƤ??v?b?g![?¯?V????n??Ӄo???ӑ q??T?;?#/~??3??ݣ""""""""""""W?%?O[Ə,?g%??X|M6ή/????1??L^?i??-????^??*??fT?@rv????o0??ƴ??X?+;????+?????ƿ?H??^?0cƐ?l??,ߏ??8?懧 ???s??o?Yb???Ⱥ.?m???Q?9e???־??ٰ~????,sn6???{Y?8???7??X???s??5 ???$& ?w?h?ES??ڸ??? i?? 6?$??G?OsZ????{?퍋5?ms?c??qԛ3????k?ޕ?????&???eϱd?^??4?f<? ????4N G?u]??Z?+u:???WX??O<7?>??0??י?kO?4?F??غ?;??.???;?????IP?!?&|̫/e0yj7?d??{?C?Ǡ?;g?ӷ??p??T???}? ???X<1?w??$jR;*???????.?y??ש??+?????V??+?&??po?+6j?V!??I??s*?!????46?Q3?|???????????????m??5???????????jEm_??)???l???Qo0?ks??@?`??#?vs?UK.?X&???؜Vp9?4:?F??嘣??G??%????#?'???X? ??j???[??L?ߟ????~Ά?|??Eҡ???n&?}{|Sְ:݋; ++? ?efIB_n9̙s????d?ɱ?K?y9?XR??wb1k??pW???k??B ?\8t?LSeZ??\_)??S???8??????j^^??qb?}?YK?";D?4p1???!v? ++?}Z?`?س?=~?m?A????,ԃ?? ykԦ?^ҽ˘c?U???E???w7T??ݪQ??ʦ?O??!??XΞs???V\????`/#4-y0??/??ɀ??v?#&G?f/O???YS ???H+_??^ĉ???]r{???r?????U?$?J??$?:Dҡ????5?}???ޜ2?A??l??-g ~?8?q?(???Q??o?=1?{˝?jMh??1$N?????0?P6f??Ts????S?ǰ? ?L??ݐꮥ=????&??M+;???{? ?׹?I3???p?|??g?j??,\q?ʏ???#Pt?e???Yoݐ??0?k?\q?7????_?8:?s?v;??Ĝ?|?1???t)=t???????!????}?i??)|??G˧j?? ?Zu?,:ɒ}???TnZ C??^??)?u*?~? .˭?~ ?\,mw???????j?:??c???H?n?? ++???(??_??R?;??R#?.bUZ0?U=0faOj&7?̾4?֒??xm??.?5??%???x??'ƻ?3i?P???E??^3??BRv?D?\0????????&?={?`]R7?e?V?О` ?????G9}i??>??Ng?x#?چaEDDDDDDDDDDD?Őq?|9?y????i~g?????Q!??v???a??3?(?? ?n???G???;?i ?;'?ѣ?+v"???W?r׏?>z&/?q???ܲ6?[??O??կ_?\???????????ȭ%???r???L?)?Z??k?W??w +J????>???ҵ??B??LI?l=ͺ?????͠?""""""""""""e??YS???,Ku#n`?7???BE??T? ?.?CA??h?_a?????z&???}w ++_n??sEN???F?????Z?[9?c>Sf|???d??g???x?7???[nٳ/u]?BN,??wg?d??L??D>0?Qχ??{??#?e??$???f??z?Vt?ѕ{?\??????3??d?',?????????z????J?=???n??Ӗ?# ?Y {1_???kG0??s?}i ??;??r??` ld??????????/????yo? ???1m|1????G??? ++#c? ?'??8???;R+?5 ǘ1d*[?????c??9N??q1?*??????y????0?? i??2uToNf0??/??d6??Ga|?F6 œ??%ĩ?>?^V-Nv??M??7al??u ?xb5? C??6??~?T??6.??gCZ!5??@>?k???Ӝfp??y?^?z{?bMe????5|?? ?????Z?w??!-?1??)/c?s,Y??? ͣ?:??.??#?)^y??_?3??wx)ݕġw?S?Z?-?????c?9??< ++???9B? ??????9`!E?;?gd=| ??0y ??'?o??kY??d??n??$?z?G??n?̙g8c?? ? ~e??#??+???? ??a?L???ar?G??fl?7?N??l?o???zTp?? ??KL?ڍpKv?=????????????TD?@?i?????נ_?F?䦞??@T?(j?? ?N?Ge???Ȏz?A]??ej?Ƨ??? ?Z? ? Ϩ&?F{b??^????&֦t??_6?r?-"????8 ??{?^>???'?f??E???? ????wt#?????C?}???Z?3??u??????i?ͫ˫#_????!*,?Cݓ???q?ij-?g???????v???ށF^F?L`?gh鵓?]???)_??d6??4???pa? ڷiE?V?hզ=?weQ?y?,kI ??E?e??L?\j?\?H2>?E?>c??r???.~?0};Gs\?ղ*??=?uZWƘ??cY???G9j?Oe??B|c??3_??>?????aCj>F?H:?w"y?fҋ?0e ?ӽ????[?a?~?U?=??{?????Ԃ"r???k??9BމŬ9?C?v?8??W?&??eۯ?e?e??q?v??2?纾?{?????? ??ʦ?????N???????????u?B??8? ?B????vW*??ѣ??8?q`/??r9?1{@K?y??=??N?|~ٚF?5???*??Ok??,8b?֛ ???|[?Zb??,f??鼖4?f}?0?????}?ѝ??2?2:zXڴLf ;V;`p!???????EI?ݓO?=?;??A??}}?????_\#?*??2k)???Ad?h?.f}?=ĮXA?Ok q{????m5?????zPt|!o?????K?ws,??/?8?h=??恪%? ???6?x?k?e?ݛ????o?$????6??>?S???o?Sh?????w?7?Q??Uyx??4???????>???{??A???*???&?m????k?|?Zk?+??????????????U???Vҷ$q?!??<~׬??Kݶ??攙 ??g??o9c?#6??Gq?\?j?~? ?쉹?I??jMh??1$N?????0?P6f??Ts????S?]??-?+??y7??ki???>???O???o??????un?FҌ4???"?????Z?= W???#??????CY?5z??[7$",???!?\.????t???X?X?9???.y9G?rc?m?!蚻- Iݲ?TS M+Yʽ??gM????L?9????$?;N^??{???@???.?ڽ^%? -6z???'??b5RW?b??Rvg??š_?q ???ٙ?M+aHY?? ?}? e?.8R%??r\??""""""""""""T???Y???/O`?םH?K?????*-??????'????Nf_?wkI??Y?6?J??PْOډd?Z??m??r&?|??? ?ϩ?????? ?uy?C(=f??h?]W?8?ם????A???|A??6?3R???ƞ??v??"""""""""""r????gQ?z??Рg?/?ڴ???NϞ???\?oB???ߧ ?&#???L9?2i?L?l.?U??ɸv? ++?my)\7?e?!?Є[`M?L?g?w?X?$?}1?W??V5??_?H????(?@Ӓ?(??_`?0>H????a? ++%??? ?w???f???H??c8ׅ?>? D?L? ??j??|?k????*?;#>w????ILĪB??#?U?ʘ?S?Ntms?????? D.?Nv?? ?2?4?^3?z۶????d?p?A?.o???h܍FJg??N9?9???|s&??4??x?ɾc?;???2? ????Pxk??z??w??_fúUx?T*?Z?????Ո???????????Z2.?/?goʜ?OQ?ª%ɸ6~?????Q*;????;?*]???4_ȼ?K??Gw?V??ݔʼn???rԅ???q??ʼn???????????H?n???OWpz9?R݈?????_?(}?ʖ??{(???o?????c?X5??:s?|? ~!?i?w?{轙""""""""""""7? ++|쭈ȟC?ފ???????????8??[mb? ++Aᧈ????????????T ++?EDDDDDDDDDDDD?B??????????o8?W?לޔ*B??xw??l?`????<ۓf3S??$1=q iE??EDDDDDDDDDDD???? ??????W??h2??j??MՇ???ش??h[?????r???kE?+????g6-`???dY?????????-~ڳ?`G.U??J?]?????????A ?h'%m??>???]?i??<??gݴE?""""""""""""r??"᧝???ٝ????q???\????5??jI2.1???Wg?""""""""""""R?T???*? ???CA??4?3Aa?f???%?p"\??i9p,}??0PH???L??5ێ^??[??????Qx???$?|?uN?|.?"?A????? ?W? 6?,??????P?fo?Fwd??G 2?L?.??i ֱ/?אh??ԋg[?d???ٸ ,??'N????L??SX???>ʬ???[?Ťį?t(?WM?|?vl??9?=?;???L?Շ?NǕ?g?"??D??t?)?d??2?? ?????)?S?xs?屻??Zo?Mn????9???? ++??????0\?g=??I/??????w?~뎼??^?;]:???kY/???w???֟9W??o?m?=??|K??9֕x{?6?????Bn??hڮ3/<????e=K{'?~Ȼ?W??t&?@"??p????""""""""""""??n??Ӗ?# ?Y {1_???kG0??s?}i ??;??r??` ld??????????/????yo? ???1m|1????G??? ++#c? ?'??8???;R+?5 ǘ1d*[?????c??9N???i(??????y????0?? i??2uToNf0??/??d6??Ga|?F6 œ??%ĩ?>?^V-Nv??M??7al??u ?xb5? C??6??~?T??6.??gCZ!5??@>?k???Ӝfp??y?^?z{?bMe????5|?? ?????Z?w??!-?1??)/c?s,Y??? ͣ?:??.??#?)^y??_?3??wx)ݕġw?S?Z?-?????c?9??< ++???9B?M?W??~+??`OzϿ? ++a???^?'3?;?>??wc???vfo??ˣ?x?E??3?1?r?O+??n?????]?9`?A??X?M=O?9??&Q??5Ax?????Ʃߑ???6?????O1"i7Z???QM????@#"?v???M?M?N ?lN??[D 1u?q2@Dq%???$|?3^O???w?5??뗧:c!'??FxG7#??'?R?{Y?g?y?7?w%??ǩbba>B?)?X?y ++?j?S?2?՛?x*8sA2?7??#??,?D???????{fy?UlN+?~? #?R?X?9ZJzT?'Y?:?;? ?bk???v:?ՎP ט:.?yz?L֦6??J篽?]Q?M???U??Fu?b??ڿ_????CW?K5b??^\76?n??k?4???d?s.?Y??&??LDt?#?1Nd?V?~????????1??F#/#`$??3???m?wy????H|???Tu˜?Ɩ?.?D?6W??Z?1?8YV???+??E?e?Ǚ\+???????ً.???.>?v-??????9??J??U;???A?֕1???cY] 1]?@)}???j?Oe??B|???wy??>????~Ά?|??Eҡ???n&?}{|Sְ:݋; ++? ?efIB_n9̙s??ki IDAT???d?ɱ?K?y9?XR??wb1k??pW??k k«n??_???|?,c-{ woG?^?Ɣ|ڸ??,?????{??A???.-????G????XIߒ?Q?H:???]??/u?>ÛSf2(:?-s????2űr5?U??'??'?rgeF\?5???ǐ8?#????C٘}S?9??kN?w飶 ?L??ݐꮥ=????&??M+;???{? ?׹?I3???p?|??g?j??,\q?ʏ???#Pt?e???Yoݐ??0?k??r?n???ɷ]??c9?h?$9G?rc?m?!???*??n?@?)???,?^?&w?_&?C[?^??'???Kd??ޭ?j?#??R?gi?????@‹?H]5??g?\LDDDDDDDDDDDD?C???Y???/O`?םH?K?????*-??????'????Nf_?wkI??Y?6?J??PْOډd?Z?S??z??,_??5C?s*$e?Oda????{]??J?Yo2ڳ?u!u?\?l??? ??oIZY}??їf=?ï?t?7ҭm?kH?v?VoӲR??w ++??+?d?h?D?z?@?Ԯ?L??OHZ?qA.?RΐwyW??? ?+?f??p?U7???J???˜??9g?A?[??F5???$?dоMe??ц5?۷? õ???KH?s?{?????2??W?ˡ??y;?wr''s?9?c??_|)h???57??"0????i?? ?E% Ʋ?eQ?Fm?Z#W?9????ν?KT???(m=?NZhг???&+???d???M??n?&$*??}??o2b??ˤaL??-??$???_?X??kW??Ӗ???u?X??2 M?F??????p?z?q??Lb??xuznU???Չto???CU??Gyp???y?A?g?Xv?W(1?fx??+??5t_Gj?é?.4?)?`? ??`?L??W?^??\;?.xW?$????S}?@?o??0?U?.E?FD?(??1G?????? ??`?m?\????'hpe?i½f4??m員??(4?^9?&]ަ?Ѹ?x\k-???_A??ɤf[q??Bd?޼?DUK??b?itp$s?g?3? ??U?w?+????ٻ??????㯙a`??PP\PC?*?e?Js˺??2?EK?%?J??TTL-+4K?Rs?.?Kj?k???>0??C4?????????pΜ??|???????ɹ????,s????/?aұ??\????/??Kᧈ????????????q?t?y????izg˿??????9=??e8cf"??f ??K%s????N8?9?)?T??<M?J????3?'??? ?[?????? ,?X?z??q5"""""""""""???3??|n?}??-???N?????́ay??D??Nd{^0qMn??SDDDDDDDDDDDDnV?6????????4z$??]?????Q"{;?? ??!?(??+W????:?????????????moEDDDDDDDDDDDD䖣?SDDDDDDDDDDDDD???"""""""""""""R.?R?gޱ??t?w??[?לސ?C????ް?lj????9? ??R'yи8֢???Ȅ????}??s?D?Vy??{?j9?????Uxf ??7??>Dz???;xa???+??qa,y??|??ʔ'??ϢW?????Tz; ???t:Ϙ????-?-H??g;???????7ݦ?F?ōY???0?'???r]?r?????2wW!?/??g???j8??J??K???Jn? rC\0`'sۇ?8d?{??}+??=?????ЀO?????n>???Wx;?2???x??w?fB/?~c??Il?ڍ?c $?)?x??92?}g??Toޮc%??9L?? ???c?)֮م-?/o7??9' ?PK1}???Z,?vM??7`l?4?w?xt ??y!e?}??r-??7?6?F?3?ǩ????mJ? 38?Ӵ}/b}|?&?q????.ug??ǹ??T?Έ???5??????9/??,%ų ??BQ|h/??3?I^????5̞?/???0?N|K?W+v?ʬݱ?ڗ??6?8?N????]/????#otc??31? ?,???sHkԟw???+?~BLcY??4*`?A֡?$???0o*??Ԧ??G??L8??U??$@?????????????????ޖ?G5???b???????AD?E-?D?.:??M????7ؽ)?F?V?{????s?e |0?u;??^h@??v6???UI?P??????^#??:X P??G?N???c?z ++?>?MhT? C?}???ZB?????H?N?+?Q? ?֧?? ]&Nfe牴?GM?X?“!?0??b??t?i ++????6w?k????#=F/fs0U???4V ??M? ܞ*?6-""""""""""""WK???????C??4?6F*??J?oG0?˳,??qq?l?†?l??H??]??c?2 ) ++?/f???o?.N???Ow??ό^t?ޚ?qq?m^'??n?p?5[s!?3zR?UE??m???.?A }??j?Kf? ~m?aѡ??M (????y?Ս?C= ?~??????KZɊTo?|0 `??Ϣ?x?ް???y???d???.t??÷?+""""""""""""WK?? S71oކׅ???'?F?ʅ̟;???͢I?? n ?m?bT??/???ٛ ++%M?d?`pP? V":?????a?<G???/㝱??f?ZM?????????ZJ?0x?!ˀ??I??إKI?mE?P 82?>?5??X?N/ ?I?'G??????Yxq?.e???|"?# ?p??n??I??0????2b?~?????u?ͼ/ߢǬ???pO??\?@??_?9Ɏ?%?}??Lj?{ p0???qj?!qK:??lbM?'?[]????????'>???n??????????????????g2??n??a?H:????f f????ʛg00:? s???? '2?ƹb?T??'????ge1b?r;??5???:?w?;f????ې*?Y?]y?????3س?v??Tu+?q???e?и??7?j??Z?[בb ?I? `?=? ?{?䛅???4?????3Pp?_?e?ޠ???O??p"j?b?P?'w'y???/??s??p`??f??u???J'?????a-ɦ ++4t)󽜼?s???c܌Ѵq?ɼ/??[R??S|?b"????Gt!p?F|??c4??й? ?_??u??????\?^?v??#?s?rg?yn?c???)???(.u?!??|bg'??,O !"?c?Av$?cr?b??i?$?6?ׇ???ۨ??G??Sx7?#Ƨ [??N?d?/xT??b#i?2q?????v㹙o2??9?ձ???&? 1??'??LEK?? ?~4y?>??Lc?X#=ڄc???ch?oc)??;??~Ͼ ++5???D?? W?%?_???c?r ?N??*?????J??L????3a? 2?V????D??e ++???I?]=?????̈́{?4~z?j?P?㻌q???????i??Gq???L?L??m?}???z???PO>L?????qx??? ?unt???f*?ב?sFs?Q?0x?o]?M曑/35ǁ???ʑ???{??–$?d??J??G??2?*???R??[?#~և??c?s7?U?qZ]}???Mݍ??ɐ~d?LxT???]F???h????o?SL?eX,7??????X??z??]?jDDDDDDDDDDDn-gN??ܛ'g??lI,_t ++???P?f ?K%rpvw"?????4?&?B??=~?c6?;???bg?{?? ++>EDDDDDDDDDDD???k?B?'??8ٝF?q?????K%?g?s??C?I????????9o???S8W??}}??t W?c,-"""""""""""r?)??ފ?\??VDDDDDDDDDD???+????:DDDDDDDDDDDDDD???"""""""""""""R.(??r?? ++???}ϧ?????2????T???>????g??? O?y?,קQp?K??l?,?5??;3)f""""""""""""RF?N???bϴ)?Z????p???r7Tvr?nc?????9?-u=+??$-??c???(~;\?1]?B??N???t?{?O?S??)? ??????e:?0?[??????.???-~:??2wK??5#?|???r7V9?4?!S?R??+c#i?NX?h?;?2?5{V$44?@???/??٭?0`?L?\?ZDDDDDDDDDDDDn,N׻?k???݉l? ?GӀ??????eؒX??֘W??v-ol?????7?Z?SDDDDDDDDDDDD??r??]ž????W?Ic?RX=??-???g?- ???'?6??????߲???~չ?}Oz?????O????z?1N?gR`r?Rd+:??R =?Z?:?yp??u˻?2r?A?ȴc ?A??^????q;???m?y?F?&L?|4?LK}V""""""""""""??-~?3~e??B?_???d'm?pF?N??F??•ܤ䆸`?N??yq?**??#?V {{"?O{???0??F?l?|?ï?v??d?ǩ????L̈́^T3????P???H:'R??2?sdN???H#??޼]?J?Os?4???3??ƼS?]? [\_?nR sN.??b?Gi?Xd??̋o,???i^???? ++??B?(??FS??ZXWobm???!f ?S+w??۔?Afp??i?^???`-Lf????9?]??JC?s?u?ڝ???k?%oc?s,^>'~XJ?g ++s???? 4{?ޝ??]?F?? ++???zk??=??k???I^?Cپ?8?m/~ƿ_\K!g?Ž?0?9?5"\?8??>?`??h/ 4 ?{;^YϪ?g?????lp?CL?,?QT?#s'?_????x?s , "???)?L?ϱf=? ??&4??u?;/??p?VK?Y~???!?Ix?1*?????0???ɬ???_??%??? ?6???:?ݔ??/Y??G\?H:Գ0臟Hm?????H???C????,???? ?9?????Lf???BG?3/????r?.de?/w? 97??$????&????ߣ ????? ++]+?b?ة?xc? k?SAiyv(5?,?̾}?5U?E???b?aۼI??~ ???P??g ++??.?2S??g%"""""""""""R?????0us???mxe?&???pq+2?4^?7?&}&2?%8N?y?Q?Bp??:Fgo*?4-???A?0X???????ߒ.???a?רE???0Y]0??ϭ6=??g%"""""""""""R??)???(.u?!??| ++d'??,O !"?c?Av$?cr?b??i?$?6?ׇ???ۨ??G??Sx7?#Ƨ?=i/b;Œ??Q= ???-????:L????3a? 2?V????D??e ++???I?]=?????̈́{?4~z?j?P?㻌q???????i??Gq???L?L?]k?}???z???PO>L?????qx??? ?unt???f*?ב?sFs?Q?0x?o]?M曑/35ǁ???ʑ???{??–$?d??J??G??2?*???R??[?#~և??c?s7?U?qZ]?rO#ѽ?04??f.??7??k?"?ag"??M??z???'X?ugT?|?͞??%g)4??T???}??c3?v?GX&???#?65??7Aa hP??h9??{?????_?y?????~? ҃?f???? ?3?z?o???}V""""""""""""??!???2? ۾u3M?l?w?s?8>?ݿ g??AD?]#o奏?9?na`????G*??D^nJkW/??7??c??ջ?Ո???????????Z2Μ.???wI?-???N?????́ay??D??Nd{^0qM|?????????????+??g??%,Nv??#??]?b?奏?3?9w???$@ѧ????????????\?r??աmoEDDDDDDDDDD?m{+"""""""""""""???"""""""""""""R.(??r?? ++???}ϧ?????2????T???>????g??? O?y?,קQp?K??ԭ~:??3m ++??e?l2\?j?? Շ????X??w?jkK]ϊ?;I˿?XA?2>???K{??D????'??T,""""""""""""??-~:??2wK??5#?|???r7V9?4?!S?R??+c#i?NX?h O܂B ?z?|SEDDDDDDDDDDD?J9]?? gw'?=/?Mn???K?aKb??SXc^????S#?x?k??B???.a?`g??? l)??????ѳ?A?c????kg???o?x? F???Ѿ'????d?'???X????3)0?S)?_~???Z0`'k?|Ə??5?R?3?ݑ?C????e????????@?L|?M~؝DF?3?a?G?N1x??쳵??ѣ?c?o'H?,?ɫ2u?=???>L]Ϝ?2 ?~n??Ӟ?+sw?b,~&;i??3??tڼ4????&? 7?v2?}ȋCVQ??ٷ??y? ??ѭ?0??`???8~??c?!??N?glgj&????7??Ć??0>?@?9?⏗ ?#s??wF1O???:VR~?ä?/p?0?!??0??b??]????v?J?s?p ??8J??? k?d^|c?O?z?p?GW???RF?7?*??ºzkSlT1y?Z??lߦ42???M??"??ka2????a?Rw?Pz???K????_#?,AxK?c??9??RR??wI? ++??ʦ?????[??l&??&???}w?a??n??,???WEDDDDDDDDDDD????ޖ?G5???b???????AD?E-?D?.:??M????7ؽ)?F?V?{????s?e |0?u;??^h@??v6???UI?P??????^#??:X P??G?N???c?z ++?>?MhT? C?}???ZB?????H?N?+?Q? ?֧?? ]&Nfe牴?GM?X?“!?0??b??toM?LdpKp8?h??:??|?u???T(iZ&3??B`??y_4?? ??8?'?~????'5??j^?Aj?.??G????`?$?C4? Y?r?K???ۊv?pd?}?k????^L?0O ++??筑??????]??/?D.G?????<??VQ?F ?B?\??>T?? Lp8????BDDDDDDDDDDDD????h?@!??q?)?u=??Y?ُ:m???? ??cÜ?9i?'6ȉ???q?X?*U?? ?腹̯u4b?r;??5???:?w?;f????ې*?Y?]y?????3س?v??Tu+?q???e?и??7?j??Z?[בb ?I? `?=? ?{?䛅???4?????3Pp?_?e?ޠ???O??p"j?b?P?'w'y???/??s??p`??f??u???J??W??gk+?\[????p?B???Y??????????????V?W~???룸?}?H??)???_?<%??`O??ّ???=?ُ?=Z???L^^H??n??K)GO?????G???ÿ?4?5ңM8ƣ+I????#hX??-????!3???+b.??2?̳=????|?ɗX??? ?N??I?{?W??\?|ų???\??)kXp̅?z???ª?B?le??IN????ChT?z?&?d?Ӈ C??8?{& ?A?݊?X?hԶL??=7???g??㓜??p?P??O?W W?v|?1.??ջ?:-??(?~??i??ⷾ-???0?V?y>?ɇ ?1|q:?0bİ΍.?>?L??:Rs?h?7?BcߢO?? ?˸?|3?e??8p?z?S9??s?O???5^?2????,?Y??(5ZFQ??9Z?v?{?}????w?#r?f?*/?l!???s?J???vB?e`??D?????BDDDDDDDDDDDD?7Cƙ?e^??}?f???????*?q|N?Θك?r?K?? ???Q2??- ?4????Hſ-???9?'??ی)J????D???4?|/E??U? ??O,aq?;? ??z??(/}?Ȟ?ι;?}?&?>EDDDDDDDDDDD?ʕ?moED?m{+""""""""""r?h?[??(??rAᧈ????????????? ?T??w?{>??????5?7???G??y?7l<??/=Xx???f??>??k_?????????????ܤn??ӑŞiS??,g??zWs?n?>????? ??WsX[?zV??IZ??? ++???Q??QZ-Y?&?? 0?x?׻?c>X ??8?}f{????????|]?vg?????d ??X???ω???ل??\??'C*a??Ŋ??x??C%/??????:D??g?s??)%?B?it?'$,?܊?2?ѥ?G?w?E+R?nGQ?{?Ck?7nH??r??ٝ??I??Ŭ???????ڦ6֥[??Ղ 9???>&?7o"?V?ʅ'Yv ?????6???RL?P?4 ??U?c???ũ??j썑?N]??i??=?-?%~?DDDDDDDDDDDD?*???=?_?c?x??F?H?6]i???uy?e??#.?^b?-?Rؐ?͙?i???k` 9Bf!E??? ??G?m??ɜB?V?????ы.?[?6.???k??????v?f?`.d{FOj????????ٝВV^?Gq????d֝??צ????8?ݔ??/Y??G\?H:Գ0臟Hm?????H???C????,???? ?9?????Lf???BG?3/?? ?s?.de?/w? ?R???9?=???Y??d?p?f?[?M??am????????????1? ;??1?`1?ѴG ^???? ?r?mTt?#??)????SҞ???bɂ_?????FҖd₿? ?G???s3?d??s??c%??9L?b^kO? ?????G?h??}???ƀ?Fz? ?xt% ????r-??%?G??h?(Zkпe?N?Ԫ??٭?0oՓ4?dŞt?? ?]???qٷ?XA۪R??htw?R?hr??k?^~\??????<6dѾuE??w?g[nU??Y?ҙ????N?????3????9???O]??F}|??h?u?>?]??L?}?? [7??|ƌ???#??v?)??v)E?? Rְ?? ????DžU??d???Y?8????ŇШ8??nM?Ɉ!??1q??L4?L????<Ѩm??O{n{W?d??'9k3?^???D??T??.c\&0??wyuZ>??Q???c??t?a?<2?a?]?}??J?u????oԅƾE ?D?D?q??f??L?q?l?ħr$!??ޟ?{?k??e ?Yn?R)?Qj???J)s?T?D??????!+?G???dUx?A?E????}?? ???32?f\=|????|?u???֭??h??K????/?:po?2??/?T?Ψ????=??K?Rhv?'?: ????d""""""""""""7Cƙ?e~K????izg˿??????9=??e8cf"??/??7???G?g?0??NtN`?#? g???x?{?^?z׸?[Kƙ?e>????Ӗ??E?pk??o???Q"gw'?=/??? ++>EDDDDDDDDDDD䊕??3??'????pܮw1????G??윻??Їh??SDDDDDDDDDDDD?\9??VD??ж?"""""""""""׏???[??O)~?????????????H?pK??yǾ?????[n?_szC???p?p???|?;yW??6RV}ά?wp?~U.?9?c>Ӧ??)?պ?9i??r? ֥^? ??????????????n??ӑŞiS??,g??zWs??C?L?|?9߬O??j\/?w'%??ﮘ??7????????md\??Җ????q ?,I?????X??wn֬[DDDDDDDDDDD?Z?e?OG?^?nɡr?f??w5W???q5????Ui???6??.????ँ ???3WmU????????????H?t?????Nd{^(5 ??z?s??KWS.G?Y?i???W??z#""""""""""""?ѭ???3ؙ????=i?o[ ++???ôE?p?,???{wgc??q?uΙ3?jf?0 ??`,3-??d??6Q??$?H ++?"K?}K??E?ZZdIe͚?1f1??g?9???R????k????????u>?u?_﹮?7??C?g@?+ ++Hܺ+J?? IDAT?Is?৓???pW???4w#?}?Y?Ƴ?p,????\)ޜ'_?E늎??ux%'.a˯I䙽??$???Hy3`?ȁ?Ә?|3?q ???]??L?  @?I>?v?\J66? ?????5\?????:?{?+?L????ϒe?G????>?u6?5?]?^???ǹ?iűlww??K??b?v ?|?f?ؕ???Y.\?`?׀ק??a?2???=?i??y\?~??҃{/oM-Hb˂?Y???i?]9??p??@??z???vp:9?ky"?ua@??Tp4\N?O?j{?m[R? ++????m???r6?>????,??¨????'??l?NdY??)K??`y?T ??e??????LcZxc,??DZ=?q??f?b?k?T??Ce?)??Ύ??0tb4eI%.?@>????y)D=՟Q?$????????a.#?{c̋g떃?ȨF?1?d??XL`?,?ZK?f?{i,ktc:x&??bp^?_???щ ++w?N??x??r??9L?>???u?v? ++????{3h?w8?Wr!??JU7#&??????ޮ????&?d?ە??????94??#??Ѥ? z???ul K???b???UkN?W???a"???L??!#?k1??@??3'Y'V???[?? d'?D?&+?;????Z=˰+a?r?M??c??5&m`??I?@?w?yv????+?5?иC???p?$???Y??8j|??܊.q?؝w??K#???4^????????t??V??.㰭2??`?BNbf?"DR????/]z?mӿ"+?u??޸(`?۞???Ho?/LxD6 ??????]?sT???\6??E???.Ub?5????|3??k???DDDDDDDDDDDD?@?>??$????F???ǥ???ݔ!1?h????\>?!+?h?T?7??ߖ#?%?+?1?{???2?1lE!?Ю??ޟX?z?F?fђΌ??5?3??k??̲\?;`???e?? ?G????%?XT&?KZo?ƢqmX????L?Ṁ?U??K?i?N?镌xo??n?'?;M)?-$?X?I?pF?p????`?&???D4kG?!?xw?:?7oC???9?}?&T??z??TgĹB:?X?Z???ޫ??kƅ֣??R?|{???Тݟ? o???Ն?.F??k}\? ?(o ??K?۳D??y+i.q??&ߧ9?jB??k???pS??5?{RLTz?I????+e?\?|Ws??;-?З??ǹ?,/?iq??{?- ???,???p?z7?????T??]>??K?_??ؼc+?=B?]???'????E?؝ڞ?W?P??/?f?Z?:7?(p ++???{?i?j??L2yV?\t?=????????????܁Jw?Y?ĶUgp?????#C+????? B?1fgb>&W_??4?є?? ???n?kQ?!??3?x?۞(??? ++?ٸz7nUB?q, a?12q????[=;??‚a??x?v?$?????B??9P|?Yl?b&???D?|?I??'??fT?1??p????h_??H?6~?ǟG?p-_?Oq!??M?eF??Tw/????K?{q3?v:+E/?4?ՠ?#??5?5????C?`\ ?8?aע1?????V.^O?VU?2gs2??????????B??ǻ?e)?F??4?Ն?3?????M9?N?????՛?̔oӓ{>·??!?k ??ؑq?|Q? `?N? ++N\?3??=A???XΓ?[???oty???`??P?V4???B?{J?IDDDDDDDDDDD?T???¤-??u?V???????Bֱ=|?p:'?s?9xٞW????d?5??o?1??uL~s?Vg|*F?x??7~Zs8?y???b? W?0>?&}œ???8?w?̌O????|\#?ϫ?x??/&??YZ|?f?iΛ?l?L?/??Er?ײUh??=????o?7rj?""""""""""""????(?n#]?߱.????????ϱ???SNڅ?HM????????????????_V????g??[?[G?ފ?????????????Gᧈ????????????? ++ ++?EDDDDDDDDDDDD?T???ϼ?u,?x ?ro?5?????> ++H?j ++??m$???Tc????̙?????3?-dIc犅,۞?ߚ??hnEDDDDDDDDDDDn?;'??eqx?Ln???d???ܼ? i{???=q??,??ԟV?t?^2,g?[?0qSf?`??=?dDͭ???????????ȭpDŽ???#,ߕC@??)k???ܼ?????Vp??_Lc?K??ض??r?I+?̠??Myp?A???y ߭&ι???A?f???)֫?F??<Լ??g?; ??????????????bw? ??a???e?? ?Gc?۸?????g?????#Y[M????u?r???iNld?????גs??? ??????*??+??ԏ5???s????????.rh?n.???G????????????ͺ3?3k??'?bo??? ??s?2g?n?\?P?}???( q?B&????N?c???]z???H܍@?Qf???ñħfRhr?|xs?|??+:b?J???L???-?&?g?"?7?#?̀?"VNc???L??%?.?w??3̓p4?'?d?l?}?s)?؜?h??t??p?cng???s??4?E?j? ++@'????_F2??!T?Og?ҏ????$???X??? ??]>?i?F???̟????,??¨??Jѩ?VҶ ?ɑ?t?7?G??R??=?????Ox??:ƌ^?/?ϓ|1?sYB?t?ŗ:?r9l,a ,?|??;|4???4??5Ϊ??|??a?)?s?>??b????%?h?Z%?q ?MK?}????\?y۲??k?8??}Y?m?u??ӧ?????9P?%?^?I?@?????????????k26?*?o?4/>??ˋqݹ?b?[]???^?/?OǢ?J?֟'?ʥ??i4?[??????W? ???~Z3~a?A ??E?m????;??4??/???P'r?? r?̽?o?wt??{??޷????[????c???e???^? ++???TFE8???b??חs???l??1/??[R?~ ??ǜ??C???}8??,ʓ??7?S?jN@a ++;w??њ`?\N?}??V8Ц????h????L9׹Sx?|1???c???V߶?|?7??e??ټ?RS?? ??F??q???V?2??JاdӢ??kĽ??&???4:?b?F։oI0?X?+????4?a]?p???٧9w%?w? ;??6?~m?+v??#????~?r?V?K?N6?w$?wN?3kU???ƈg??? ++k7'??1???S??????^Տ?F ??Jy??? ++??????l??BV?^L? ~v5 ????k?F1zզm0L??i-1??ߜ??י#$&7?Eק??ԭ??????v??u???R?܃??-$?G?V=hZ?,???Y2~&??93?-e? ++I?0??I-?vm܌)??y???&ϻ?|9?4??쉪ČY?W??? 3XS?y?,U?Ң?????aO:?@? ++?@M? >??^߰&?;????LᇩkH ?N̠????ڄ???m? ??:??>?%̭????0?o?'?xPy???l???G?]??) ++I?3?U Kz&??SDDDDDDDDDDDnk??????{?Q ?C??i???|??_????z???v?o?Q????ؑ?M??7????1,??N?i?R?y%>?xr>?Εy?S8???۾?mߞ??V?? ++?wr2ۅ?M?ms?ѝ???a??S?? ???W??!q???l????+??? b#?Uݍ??ݜ??&v?c??p?0?6?Oeb???gq???=D ???u??߄Z????I??)??D e????ZO?ɛB???J~I??{]?z0????? ?W}25?0??'???5(??tV?pZ?jDu'?J???f?xg%;?[??~????ᣨ?l?? ++^-???|?R?????)S?)?:?Κ??Щoe?7???c?p??a?s???3???o߳a)t?T???"?%?-??????-]??L???Z??51???J?[?{?j:????\?Б???!ř?????.an RJz&P?)"""""""""""??R~Z?f?q#U???r?g?nʐ?Z???sV.?Ð i4`*Û??f?o???????=??f?g?`?a?gB?~{b??,ݛEK:3v??T?p?;!/}`??}?T???)×??r?[g?:?ct_?\ p??N???????7?s?ǡ?D?? ++ W??`??F?ńw?G?n˲]?4???-)?4l??=Ņ?`?7?߆???s0b?K%???Op?+??9?SH?????O???Xw?3K!?#}???)f?z? ++???^??t???&?????ע[?2??z G????O9?҄?u<1b?f??ce?LN?ە_4????_g~?vy6K?[???E?c?w~?????Uplej踄??,?6???U?k??~??lN?kXâo9???'leo?=?>?;?????[??R?????Z߁????C??$ѽ \?"??????6?j?????l?˥n?#`???Sd???n?#j8???[6jKc???,?}? ?Q? d?dն |۵??U?p?bǎ?Y?w??E??ފa??????3;Of?q??]????<&Ĝ???6?`50?э?>)?5?u{?rh?7?$.M?R?ӈ?ٟ? ++?p?_p >???????l??+ؑ???-?{ԫ???t?4?{?{|?F?????Bu?ԅ????>j(?V|ˏ{v???5???y3?x????????? +زk7?VM??)Gqk֓?e??F?ֱ:??z,???Q?c7?}??3??a^????J???¤-??u?V????Y?:???N?dr6/?#??J?????0?-??~???o?#???O?h?ߖ(?k???w???l^i??X`?????ϾI???cF+>9??&3??q?:'??H???$?k鋉?w???%&o?<]??w?T+?]N? N?=;??=?1w?L?Zr?B?2?z??6M?5?)??????!?NZ??1?j??IC?????o?$??MX?n???Q?9?إf/>?????L~s>-fܼ?S?nuܯ?? ++?t?U?:?G??A?HU#?%???%??^???L?9?f?j4???Ѹ?H?o?????d??JS?k????IԳ-)?ӧ?7???>W4g??1?8s&+????????w6?b? !?㛼ݵ??c? 78?v?mу????????\}?????L?6AEG??a?lz6m?|&"""""""""""rk2??n8?طg'??i?o??*???t_Z???~??????v?#???????O1{???????]??]??5????~P?Ҟ=Y?t???sU?Y[7?G?????f͚??Ո???????????Y2??n???.??a |?6?z??r??Ÿ????{??&2??`?{Z?o???P? 6.Zƾ?@?7??}~l?\8z?L??i?F???̟????,??¨??Jщ?VҶ ?ɑ?t?7?G??R??=?????Ox??:ƌ^?/?ϓ|1?sYB?t?ŗ:?r9?,a ,?|??;|4???4??5Ϊ??|??a?)?s?>??b????%?h?Z%???%??eL?????&???M?f?1?庸S??ee?;????YҲ(4yҰ=?????/7??D2?.h?i?>Q7#?s?9????Cg?O???P????????|)???{?+?L????ϒe?G????>?u6?5???b????&??c??#?6????{?0??],??U?? ???;z(?y??_)=???Ӛ? ?Z??/o?????a̧??|i ??:??Gn??d???~#?#?s_??O??e|8?u???Ϙ? .?g?qlbT?d??ٳ???=Uc?P?p??ç???3 ?MYR?K??(;????W8/????3*™?3????3?edso?y?l?r???ը? ?? ++??jd??7?????Y'?%??c!?X???H6w?A?{r?nai ?Ta:?J^??ωٕ?]????0?4қ5? ? ??끁:?{?cǠ?|???}?8? ?aQDE??h??K??20k? <?°?a8? ???S????ػ{ ?^uQ??????sFZ??}?.6??R??#???lMS?=?ݭ'æ????ܢ??yI?H?&??7?Т͚5?Y???7?‹?ɴw>?x?9?c??\???{?DDDDDDDDDDDDnS?~??%?g?7RuX-.gz&?? ??E?o?g??9 Y??F?2??lv????.A?_1????k~f `p&??,??'֯^ѽY??3c'?>K?`??3<?sa*?b?a????M8?9a???M;??x? ++?o?M??`?S??z7????n?'$??Ȱz?иW ?Ϡ? ++?ަ6?r8q2???H ?T?r?^??1!Ƃ??x? M%??[D7???gݨiTЖ???3?$.MFQ?ӈ??O`?+ƴ?r?ހ?ٟ?r???+ؑ?G??0_q?&=?3??Y??n.][EP֜ͅo4?ɵ?!y?^?O4??????3$UlE??.%??-?S???W?0*xّ???p?s?&|?k????t9??&3??q?:'??H???$?k鋉?O0-??KL?4y?3?"??V?????{v"?{Lc?꙼??"?e??m??k6S???i??C>????c?՘?3y!??\I?ɛ?F?x???Ts*??K?^|4Ɨ?1????|.Z̸y??z???_1=?骫uЏ??p?Fq/a .???.`????4?Q???????F6`ڲ8?|'Y?????ʗ{q?۟?o?2e?j>6?\????~_??Z?c???맭?d??* ?6??W*?M>?ys?????e???H?5?Z? ++M????7~Z?9u?KfM?Bb?{?›?eģ?WEl???m7ߥ???????????ȿ͐??v?iƾ=;i|O???P?????J????D??????cn?>r9:?^9??'>??wU?b???x??P???0?c?[?????}t$?X???ſnTn????ƣL?bV?f???jDDDDDDDDDDD?,?i7|m???Y???k?q?7?*?M`X?۪+???[`"s? ++?m????????`???e?? ?{c?R? """""""""""r?)??O~?F6$?Rh%\nu1???G>g????ؗ?M???l????nFk??'??y????_DDDDDDDDDDD??T????g??[?[??{k?????SDDDDDDDDDDDDDJ??"""""""""""""R*?Q?g^?:}??S?7????I7ׇ??]K?9?k? ++??Ұeaᘷ?zDDDDDDDDDDDDD?ywF~f????W?MC$?y?X???͙???Jӡ?3 ?$n]Ȥ?_???t??U??Co?????>ʬQ??|8???L ++M??oΓ/??uEG X?:???????$??^?}??Fv???^???i?X??? ?????.}x?y? ?$???? ??q.%?S?ߟ??.??=??]z?2p ?G????l?ϓ???bޯ??+I^??IN [4??@ᅯ??z?21x??? ?????\Y?ٽ?#f~??#?6<*֣?s?z?EMK?????\?.e??5?=GJ?;?"?~?g{>L??+?~6r?|Ŝ??q?Y????v?c?ԧ????jز?Cb???dxW???\??'NDDDDDDDDDDDDn?;"??f????*????d%??w?i*-_?k?N?&đ??+?{??????ܗ????o?y??|?3??7Ƃ ??y?Ã???j?,&?fO՘>T6?b?????? C'FS?T??|?0?sz?+ ??B?S??L????^_??2??7Ƽx?n9HA???jTsNW????ݵ=Y???$??????l?\v6N[ɫ??#ٜ?6????????1??Ow??????˘<o?glso??rb?˼?6?ަoE+G?Lf?ȡ?Ν£?M%???Bj%??k?5????G????Z??>?3??Ma??t?N?Neǒ׃?ͼ??X??ƀqu?L??~??? ??^7?94??#??Ѥ? z???ul K????~ EDDDDDDDDDDD?_v??V??.㰭2??`?BNbf?"DR????/]z?mӿ"+?u???O#P-?=?;+??ެ)^???l@t] ?!?s;m组????Źlp ?"*"G?]?Ėy?YKO????u ??N8?g?b?ܕ??݃`???ۈ??=??܇??-????.~?P@?@ ?7? ??D?ΟI.?L??6?!]Bp??Dޗ???=d""""""""""""???????Tv/;?!tut?ׂ???????x?AA?NNf?P?i`Q? `t?z?r???Tfw?MW??}?sH[?ٿ?7????/?-{ ++?x?a?~???N?fofW?7??Ō??1?ܩ??@ajyVpL?͙?lb'EDDDDDDDDDDD??*???%?g?7RuX-<.%n&?? ??E?o?g??9 Y??F?2??lv????.A?_1????k͖Ɍ?`?b ΄v??%?????+X6?7??tf????z)?4????>(&??n?0 ?cԚ?$?L???@?n؊K6?????6??٘???@^???F 6 V? ??????? ++?s?ǁ?y~?9?m??o?`?d??h>J?_? ?g?ۭ??286:?S?? ذY?3?""""""""""""R*????B???? gD ???64???h?4???xH7?]??????g??GNb_? ???z???8Wh@???@?9S????Ƨ? ++?@?=?u???/,?~?Gyc??^ݞ%???m??2u vZ¡/O?~uO""""""""""""Rj????0?m???P?9??/G?V2~Y??IA??c??,?#???e?*?9Q???xqms7Ϋg?_?y?u?d??2?դG?@?,y?????`t΅????????{?c????5N˲???a0?FA5\?6??&???j?B??j???iZbvPs?h12$S1-?`Ԓ???q-?2MD9?A`?9? ???Vq???????u????f???s???n?+ߐ?~???v???g?]?????????B???M????tk?c??z]^?vH??%e??7?^yz???o?j?8??????٭G1k?ϒ~???]kR?i?|?? 9??_?+&??Q}S?qa?X՜?n???M(???iɽ?mAe??<(?^??ל5O=?ۯ?2?,[??ʮ?;???y??ӳX??^???????fܕ?\??[?ӣ??9v??[~?4.Γ??g֔?zc1??3??䔁????w?e??rr?{?e9k??????Ϻ"'?3?lzg?????B?!9n???????##??,Ie????^?䦚?s??[?`?? ???\R7%?n?*o\???n?q?2????gyY:???? ʿ||?\8??|?ѽs??7Z?d]?:???_d?W??ҖN?;??9???V[HRx??{??W??{Wސ??yO?5????.?????kM?R????}?gӒ????S?? ??/9o?Ӏ ?[?YW_??-???ˋ?jИ???̻?w????ٴ??ܶ?2C??N??u۱!?8?? ]??\??3r??o?o?z9-mV)?V???ύY????|Ո??k?_??Y??????W?????}?;W"??)ݝ?gR3???RSx???6?d?? gg֋??稆Դu1?VW?mo+v:>3f?u[[?T???O?}~%A? ??? ?IDAT??'P??l???Y??r?^NK[?? ?dˬ>3/? ????4?u-? ?O?$th????????8W????*????rhCM6?jɮ??R???&?ϱ?k???O&]?o\?s?|???(6g?S??e?s??gg@՚??¸t]???~?????]2l???*n~*????k?]???>.??l?tY????o???;??? ΁{u????ʂuó[U???y??????[՘??}6_?Qe;??|?_K?p??L????N?N?i??4?|<>?6????Ի"랻7ӧL??w??/??j??!????|x???,ݷ+?? ?%? ?*?b??y?>?S?d?}F???q?t?my~???[^????7??:z??5y`?g??c+?4????:g??QQ????0 ???????Y??5??x???Q???buߌ?k???L??i}????tx?a3?K?24}???}S??֎M?N???Ƽp???_v`.;??ٽ??d`>??ތ???1?]=?{M8-????uOd???2s?h|:?>??????|??ӳkײ,?wQ.????ӱXHKS?k?j???B??7NY_?ښT?96_????|}?ܲ???V???C??eμ;???????Oǽ?????dikZ ?3? ???U?k-:?֧2ɺM|?????%ͭ?,??????eu?8oqZ???UMY??g??ǘ?????_???5? ? ?[???zn?K??cS?Or?????us?.?I??mx?t?1?<֜?cvJ??'?,SSޚ??ק?-???v~6g???????}?????}3??#ҧ?<+?է?칙q??1?g*7?)K7l??e5?2?sS?L?!s*F????xvmZR???P??c?g?[??+ξ$+?z`v?Q???????!9|ך?%)????S?????kS^B.??1IR??G&?'??x~?T?????;????/????ݎ??????????`3J;O?P?#?ݝ#ۺ?7Q?ut???˶.?iem]??A? ??'P??@I~%A? ??'P??@I~%A? ??'?(?[t h;??~5o?֨?]?{??Y???477'y%??ޭkW?^a???m]?[??-P??@I~%A? ??'P??@I~%A? ??'P??@I?Cƾ?Ι\IEND?B`? +\ No newline at end of file +diff --color -Naur cyber/docs/images/cyber_visualizer3.png /opt/apollo/cyber/docs/images/cyber_visualizer3.png +--- cyber/docs/images/cyber_visualizer3.png 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/images/cyber_visualizer3.png 2023-12-23 18:05:58.572028978 +0800 +@@ -0,0 +1,3054 @@ ++?PNG ++ ++ IHDR? x??sBIT|d?tEXtSoftwaregnome-screenshot??> IDATx???wxTe?????S?{?&?PE@?JQĮ(XVŎ???[E`u?յbY?? UP?? ???=?뽿?&??0??|?g?;???}????g?y??N?#?B!?B!?B!??s??n?B!?B!?B!?B? ~ ++!?B!?B!?B!?$?)?B!?B!?B!??C???B!?B!?B!??A??B!?B!?B!?B?????T??}? L8'?q????\?B!?B!?B!??k??T??|?T^}?/dX5??O?g?o7?Ԝ??ǟ???z????_?1??=??5??`?1a8?? ;=C?????U!?B!?B!?BѤc??H?o??M>8????/ ??]QJQq%???bJ??y?w_??na?G4՘?O???w;1mB!?B!?B!??*??Wi????19????J*?>|?_??????"????֝s2?ٵ?Y/???sMe???_ ???e'??GO%?ߥ ???e?e}??55??XsЖͻOe?Z ?B!?B!?B!???{hRs??w????`?????o=S???F#rF???՗?N?6h5?d/???ޅ?ղEu\????֏~gw"r?&????XN??? V??gL?????\?????7M?????ȇ???dΟ?(g??P?ᓓG??????O??<?Tμ?=??/?Q???}?i?????zi??%???????]I??q??d????D?褗 ++(g?????:?G??^{?'69?Q0%???W?ϰ??D??ݰ??f,e?=4H??????S隞Hl? ?S?? K???o???A1?v?8???:'Yќ?]??}^??u?H )?S2??s95+?0%9k?????4???F????????Ga?=T?og??ϙ?? ??*EV!?B!?B!????؃???????AӴ?LU?v??֏?E3y?? ++?]???Ko??????:,?AVC???Wn?(`???Q???? ++mA?4;ٯMcF???R?R:W??͍???U?1???(3uറ???E??s???1Dv?g?????`U?Kj_.?|??y荝??s?Ճ?-???*!?@R?Ƿ?Y1`2?0?+?l2?(?*?O文??i?|???N1????+x?\?#o???8?b!?GWR y??\??h2??ŷ?????k?O_?B!?B!?B!ı9??gX?6?????հ??G???? 5??/Hخwxm??P6fN ?}?[Gu!?ǟ?i??:E?VP|????'?u+? b$q?0R|?yyK??b-m??? _O??E?~`y????? O????S??S2#XTf#,}0?J z|:F,??f???d?????Z9=P???ŽP???? ?}%_ŕg1??l?:??F3&+?????ۜ ??(@?*+$???? ?i$??K`??;?f??Z??3?D??gpE?%??Nqm???]Lm-O??5{?:?GyT_?u񙴵?`???=??+??iK(#x떝T?M??K???a^?l[!?B!?B!?Bqb??9??x??8?l??Y?=?.ͱ?I??q/?Yo?j@+N%?5?P ++T?ȗ??????IX??R5??qn??]???*?;iI?©/qa?r??Kz?? ?o???S??fIC????ö.sZ?p??M???J????je|C O??ҁ` ?????Ρ_?&?WBTf??e???jA&nc,$??G?X??z?Uld??lz???t0?ـ??=v??%f_?R?o????M!}?J?-??ջ+??r??ⅼ?v6?z????['???Sb?X?qC?8mp?- A?j??Cm?XU?vU???Sd?ڷB!?B!?B!???`?O?y??=?V??(??\?:??/?~?I 8(o?:????l?s?H??|?/e?????G???W??dJ?C???[?????Y?S?c%3w?f????e?{?f??j???#?R????J?k[+9?\??Q?i????%^??B!?B!?B!??-Q??4/n??.?9?}8?`5??????y?? 9??,???f????>N???ha?S???[f??????'_??;?N?՟?Y????4FK?\?N?z ??M???T?r??ߥ?޿?]jo?2$???i?اBD?hN??d??m??`?#????????9????/`A???w??U#O?gV}N€8#A???-t{C{v??)C?h:?X?V?b??3??9?}?ң?Y?x?9ė?`???‡3??a԰???ٞ????3#?o?~b8??%l۶?o???'??']x!?'?N???Op??A???gʔ???f c?\?}??K??,bbB?????a??,Y?? .??A?????С? n?h̡?˃????}? ++ ++??mDEFѦm?geѦMۺ@?:??L??K?? ?tb???U?? ++~??RQ???7v???????KaA???'&&??????[o???????=?e?]???Gi?̙<6iw?y7?|EEE̛7????SXT?N${C6^xiii???ۼ??+L?2??/???@ԧi??????h?Ɩ?[???e???ԭ[??2339㌑??? ???`ߺ??FE?9??`]??????K?????X??-?????i:Z??*J?GR???b?Uy??͜=*?????1ƽk?"???.)I*??_HZ??(???uu?OQ????GQi????H?^?? !?B!?B?C5?m??<6i]?t????KXX/?? ++?g??f?խw???s??????,n??<7??z?w?f??)?s?ݭ?%?B/??}?1}??????˭??NYm?b???T????4 UU9??s??ԩh??5????+??}??{{!??4?AƦ??a??y??q5~????0?v?B?.]???f?????'!!?Ӊ???h42d?.??B,+?s?T????X>?u^{m9\??5????]>|? ??FP??t?ПE?hP1T????H???7vЩ}8????ݺ~?ֽGfF?=?5?=?_?5G???cˏϑ??I?~?ҳߘ_??B!?B!?? -?Y???%ˏe_??Ԗ??J(?S= ++??5@??a`1C??V??B????-?s?Ԗ??|???<6i? d??_?x?? ???? ? ?q??;g.o??Æ??/?p ??c?͝ö??6|?^~?3?!&&??_???YK^????y?????8??????4h???+ڿ??M???y?X????x?M??~V?Z??O???ӧ׭{ʀS???? ??о=>??M?6?чp2h? ??7???U??`]w8x? h?ܳ?3??q?/Y?;?}?f?qΒ?=?/?? ???#ՙ_??2 L??fƏ??????7܈???}??2????e?V?^U???????(??߯"77??m?0|ذ????(??ݛ뮻??Ȫիزu˯?x/%?ֱn????:?_???;?We?? ???qz?8<~,?P??3?m??3??n??LJ?v?}?6.???_G0x??W??M???? ???nw[L?56?~??h'V X#???V??WRVR?ٚ???%%x???6?K??x?lM??????2|?*??m?Z !?Ŧ????? ??B!?B!ğ[??OM??4????Y!???_v?G?u???-b?W??P8?????+??????W6?d\?_ʲ??X[?=?>ze}F:?o[8}?'?lಃ?ev(.????C?\$Xj?U?c???w?^??K???w???-????)?I??b???qu6????:p?Ϛ?&g??fW?kT5޷os??c?ر????ؤǙ9s&c.????$>??SN=uh???^x?E??0Ǝ??y?طo_?6??C?|??????????\֬]??7????????m???E?9{?h?=?. ??MLL??^?????~?ۍ?n???㦛nd?ڵ????nce ???(h??ҥ?h߾F??e?~Kum?f?????uY??`?ݎ?n??p?p8???A߾} |?Ͳ??=.t?????~??7?ӎ?؃A?RL???? _?7???ܾ?L?b ?u???vו?u??8=~\?.oO?vN???$#?@?;?qN????kײ%?͉z:j ++)+???ڏ3] ??PUYNRZim:??u??jl5Ux=6j????:??6?HNˠ????] }???@Y?:5?'?WB!?B!?n͖???lh???f#,,??ԭ?lF?ujjjP?Ӊ?l?h4b??P?????뭛?/t??V??e29??'?{>???wR?U?K#??H????????ѽ?]Ȝūټ??W!,>?̞????s?uh?j?fR?HK?l??????l`???X???0?~ ???vB?Hԡ@??00? ?h????x?^?????*??Kdi=|օ??7s ??+?XR??0Ęh??{??ȴ???w?T,?]?^ ++?.`΢?l?W??o 2?=?????q?}??]?5{6~?? 7?Ĵ?_?+??v?y????>c:?>?????t?V?z?-և??kƐc?]????q?5O???N??/??????gq???H2{?)/"goF??[??Dθ?1?8??S?@W??V?5?ke?6#e?v????0 IDATh/?#??k????a???j[??? t ඕ????za2;n~?N??HM5????G??N??_??Fq???HӰ??〛???x?~????z??͜9s{?????7^?/??]?[o?E???0o?????f???[o????8RSSX?|E3?? U??`?#???*ff_?? ?i??ʟ???+???{?7o>????u??L?0?'?x?'??O\.>???m????????i??~G]y??4Mc޼??5?^xQ??7`??t?ڙ??X???|?l?ʏk֐??† ?? ~?????+y|??n??r?}?ڵkl^^??LJޙ??ұ?笡? ??9??6???0???M?vV??ܴм? _@??????_??KǶ?{B2?o??Ź?Tyt@U?d0`2????$?[پ?????*;Z?y?{?b????ϺEsym?f*?>???Z??TQ??????( ++^w??$?n;????`D 𸝵?u?A/.g>o?_XW":<ʋ???[r^??,??B!?B!?8>? ~:t]??v?p8p?\??vt]??tb2?p:???~?F#N???X??p:? TU?۾1????툠?=7pIװڥ?R?,?_????Op﫥T?,$u?E?]ɰ6??_????~bևsX???1?̓Gq?գ??'獿???}??? t???M|?ŝ'?̄?X?lyt)z?;??O/?q???k??I?d"????Z????A? ????????SP?#` ??_Ʀ|jl{N>?/\w^??9??ɡ{V?{?@(x????s?I'????x???Y??r?L???ѣ?z???j???3M?3##??n????i??2?M?aо?y?~’M???ĵ???? أ???i?еKWE!99?3F?ŋ?b֬&K?GFFr߽?b?X?2?5}t4??ͺu???????(?H?:t!M)%???W5"??>???j ?5l??G?W??i???d?>?n????3o?6oˡ??E#??H???a@??P????l?&??-?ʣc?N&?g_??8?/t1(̀; ??C?O_@????lX??b6sƀ,?????7??????*>SsP%4ꄇ?/:??? ՒJf?.$zqR?$???K??0??C?|A*?/?????jJx?_čW?N:|??$V????ߝP??ÞW?????ɓO6?Lh)?cq?% ?=??????VXȺ?J|?hR{\ăw?E? tw.K????????o%?۩\r?e I1K֩B!?B!?? ~??fL&S???M?0??X,?~]???eo?Z,??e???=?z? ?I?i9{??@??igm?????g???m??j? ?}?D?SW?? ?m#o??5?Ǎ??;?$ٷ??>??g??`?䱤??ˏ??Z?C?ͱ?u??9;? t$٨?ܿ?*S;?I?4 V???HN?Q\yw_?)c??9???-????f??}?W???_??1??P555???PXT?`?ƍ??????أ?p??g?& ;?t??׿??_4?ρ2w?ljjj}]ư?1bf??^e??^\u??t? PUj?]ı??뺎?aGQ???????~?֯?????mKJJ???5?9??cbcQ??~??? (&???!5w%?;?蕘??[?O+6P???ɧ%b???#{?#uJ-?z}?URV ?? ?G*?*???m1??5??F???7??? $?5?T??0?:?&?b?)ٕ͎???k?f?Wna??h???;$+?6m`w?????I R?}%???t?=?>Q:??7?y?*Lg?K?? ڜUG??u_ Ha??myW?q???hp?j1s????8?#/????A?-F?zh?:PV?mq;c8=?? ++J?Dt˜? .RŹ?>??}?%vc?I ?͢?(?v'??+Y??&?G_??1Y2ೡ*?kVU ?_N??`? AQ??j?@?T?n(A?u?/??$ƚ??3???iATE'????>-:/?~v??j???ٴlls ?M?E<6J+??2?2?|??P??I4:W?o~???hZ???????]?f3??F??'???k_ j?$n?$?G'????ϗP<`????Nf?>?J4@??$f3y? ++?????"TLq??i[?????S?Ŕp2?-?~BGlaKZK? HFF?=:????k?㞻????nk???7?@V?,z?a?????`??M_lB?y}cTLQù??W|?Hy???/tөK?q????`????ަ ??%$'%5z?`ŏ??oe?ÝB??X?]???W泾?/#h???K??j??s??Z?T#?m?am)???V?pR??TzC??A;O????ȯ?0??#H?'??7t]$??gS?M}Ul,?`????7??n=@M+??أ̔????????!77???V|?C? ?b??x?b???㛥??ҋ/??K?ظqcݺ?iiu???1lf ?????᤿???i#Fr戓i~l!4EQ???B?ul55?At=????z????8?x u???`??tӍ?k?????:?@h????7~O+??5XGSU\??Nc>?j&Ƭ?y??~???0? ?E?W?o?6rK?qz??&??J@?!??ءai?Nxm z?q?8??fv??q?Xm~48???0?ʇKw?|??.𩪇?]s??????yq?.?lt?????.5h??q=?????ߩ=????,F?t-Wv G ? P?a>??_???J\X ?{?ӽh:X۞??QkX???+?j???j? ????????E?S???(??Z???׬h??N4- ?~???s~???((??%#??`ְ????=/?~v??S?wvg??=????ȑg0r`&ц ??\?"?L???g???:p??JB!?B!?h=??cccp??????`f\\???( ++qqq?ƺ??????*i? 2&&UU???u???/s?c?p6Fq????ث??fߞ??[#+?&???K:M??5??#R |?-jbY?K'sBoFi???m?Q???M??^???4F?k?_??r?@b?O/??p?l?-n)? Վ6? [>?? f#(?3?--?Gl8?@8(5???M???????????i?CBB4??????`o? -??@??W{3F?]??A?62=i??8BUEAï?M?Ծ?????.]??m?V????t?L~??x??Â?+???-??p??7??? ?1cF?K??l߾?nݲY?G??E?;Jɝx_?I1???2N?(?E?C????????덉?Y] ?h?^? ++??(??e㹯g ++a?>{?} ++!TjQ?QTc37?u?@?л??E? ?K*?(????o\ff&?w?`??M<6iR???L&??~?o?NrJ2?>???s??㮻??щ/G????????c⅁[X?t_?9?y ???G<:X:p????W??N)*?????%?B!?B?;?l??????v??zq?݇=????}?ز????جA$?T?w?\??+?}?Q?ײ???Mny6;?&R??b?@\?3I???˵K???șm?iwFgؽ????Ɲ?P??m5GH?m5~????%??ӵC[?ed?h???V?$t?F?X?>gj??w?Gn>??t??~?%Ea?? 8,?????ӧw?s/?7o??q?????????ի?&M???>c??y ?URRR?8?>?????>?cFT?n????ϠQ??????Xf???ue??ضMjj????X????ƀ???D?){?&^z?%?n7??~:??#?8?????g֟???k??????IjjZp??]$J???-99?W?O?ڕ?̩ ?U:'?$?a܋?PlƐ?e?_t*M???B?h:?oE?s+h?7?P?? N???9i????!T1???b[O??????J??1$??J??Z?pu?????L??/?{?????A|j[?&x???m??lyP ++K#|y`??$32G???*?q?Œܪ#iu?X8?=?:?^7?????#?> w(эh????s?>???;>x?+J?)4M?r?:????|s?/N????ڞ?:?ڧ?333?ûw??7G??СL?>??ϐ?믿???[??y?????|?I?'???U??yyy???3r?[޽??p_?0????g2??1??X?"ivą?x??C??-?00M?N8?Q?F3??#??????0?ŀ?yv?0???q:??p??;??<"?#7?_???0????D?7?˱?h\y? oc??f?l?Z???&?}#2b\????I???/N%???}???&?KwZ?[Ċ?~`?L?ox N0??F?? X?l ???0?b? ++?V??It?c8ʳ?%+?k???%<.?????[???w???}?qn?..??????4yi?V???ɩp?? %o?`U??fe??߂???|?nE?V;??w??(:_p ++mG|?{??N??O??A[??X??Z???C??Q5?l??xn"???N?h?O?>??????$&ސpN7?i?????G??e#??,??$<"???4?v????f???u?JhX.???Y??|!)?Т=v??w?????ٟ0????M??3?|??\???K?;??3v?>???????H??????EDDDDDD?!0 ++??v????_?oڴ?????f?7o&>>˲((( ::???b?n7????B???(++??ODD?i???K\\pn(???????Ң???? .38?g?E?zӂ•P^#m? N(??-~p[??M%`9?]?6???I?+gS6i??)//۫?W?^?Q=?&99?????{?c?V?~?UW?a?>????n???΂?瓗?G??NfÆ ??????9?U????y`z{?u ?uT??j?*N:?d>??3V?\IAa!ÞƂ??&v??<7l7?xc??_|?????)++??r1r䛴kۖ???c??I?C????]?,????????p:? ?d:??1??>?Q?F?m??FtT0? ++,Z???????={r?Yg?p??]?? ?]??iS?=?(N????ؠ?~?YS̉?M???&??v???\N?Ӂ?a?4M??ʪ ???E????UXT,"-?}???#??q??:8?]??~???Ƒv??\?t?'?ޥ???̙z?q?DƤ?ry???yk?-[?p?B?O?'91????|?ys)~??KdD(?^L???u??|ɷt=?9_ ++???a??+l_R?? ++'D??,??H?- V4?`Z?? 38?UNĚPZ???T?W?jҤ ? {????? /????{???t^x?ŝ?[?????K.&//?? HVVo?x?? ????L?i?ɉD?@Y|?u.Q?CR?f???<2t(^t1?}? ??:???Vm?N??????_?[6s?O??уٳg??+/???#??`C~X}?/???????`~?l?a?ҥ?~g4G??}???_}?????޽???¶m ++ ++???df??~???-Zҿ???3??a??C?h+s]D???2+(ܸ?N?G?+??{?q?0OOYK????\??4??O?i?t8*?|-l0?ʊO???Hq;??^?\??? >ŬX???ïc?cC? ?!?????x2? b??7?L????%5?Mb??t? ???`?.B]NyM??i?p:]8?.????j?7d??L???????H=?????* ?4??W ?W??i??=?????j?&??a?]X@8PF??PQ?-<^?PbC? > |?!?? ?????^?l?Ǖ?ι???ƍ?<8x0??z#^?Yg?ň#?????F??n???H ??M7?Hii)}N:???,?>?0??{n=?E? ??bɌ?Y?f3E~???i{??\wF?'ص??;???7???{?]fL??|????˲8???y??׶?fʔ)?x}8???X?E???????u??W}???Ԝ????r????'?????1}? ~??+?? ?[????P??Ù1c:fe???Y????t:9?gO??????quw?}66??-?[????? '!q?u?I????????攖V0j?? j?:????4p9L\???a@?l ???[?,haQpC?$.??????@???M??"I?z:?_?c???ޙ??????_?)^b;?p??pc?nL??t??? F??a8????MZ????q??k???????????n??-?U`Y999$&&b?vmSPP@TT%%%? {Y]???x(((?n????XB???,!?1?`?? ??Ya??_?|)`?Ҁp?pP??2???`??醭k4??l??C.?4n?8n??JJJ8?쳹??+?ڵ+yyy̞=?0h??J?f?X?`o?9?????sÞ=????رc??m?(%??;?~?N'%%??#???W^???:????m????mcY -b?ԩ,_??zݚ?Tiڴ)?ߛvm?mW?i?m???~۶?;?.c?gkhs}'?Qd?[`x?4?3?l(??$?8?????y\ӯ1?\ܼA?ڛVMa??w??oL??>x?aV????4]P??? _Y.??|Ȧ?????"?|????????Է݆????iׯ_O?F????&)) ˲???#66???B<N????|bbb(--???nݺ?z?ۚ??????r?b???֨???釨x(/g ?VG?s>???N???P?? &8m???kf*???????s?>???|??gTTT???D۶?HNN`??l/^?ƍٸ\.???ǐ!??aRD?V?⡇f֯?r?8??iӺu??????,???L??ĉ?px?? 2?????m??M?p?Ua厯?[??%???u?)(, " {[?????s#/?U???q??g?B????v)+?}?a9?|?FxjTxV?k?ǑzW????{'???M???KXl ++???r?ɧѫu?S?k?O?Q??8??w??? |:????e???ޕ???T%?㰷?OEDDDDDDDDDDD??R??s??? ?˵0??l?9??g?s?m?H????F??6???wܶ??lg?W?t 0 ۶w??s?????`%?????e?Q?i5 fN???z???{^+???z0??? ~???{??.??O????^??a?y??????????????j~n????nچh?l?ˋ? '?u;چV??c??۸??#y⹋i???t?p?>w8?????Ǻl ??ͳ'??GS???3&???\?U????J?????sg??`zShѪMp??v]8⸓8??yh?0F???چb`S??>x{3???O??bP2C ??Y7?]F?????%8"iq?]?{A}?\?@??/x?çx.n?SOé60?Mդ??mc?a??v?|???w??J????.??)C?51???t$$?g^2?e??????7????6???vS??&3l? ܧ\??#?,??&g4l?@.Ӟ??˚?w?M\???xK?Q*??g֒B:_z+????+?hn`g[lY?? X?? ?| M??,???????7?ϓW?#'?}???S?pa⎉?$???*߿?\?>;?7?gr?E??1??E??㭇W?{?ANKvaW??h?*?????:?@?*~??F???7?? ?8?hۙ??#0hG??????o??????8`Ԧ?EDDDDDDDDDDD`??-k????j??IU??Z#? ++????z??|)????ٛ?9.?F}g?cT???m???A?#?c2j?ś?1in?_?????x??%@u??1͈4?$?ԏm??t?""""""""""""?[?l?[?ƨ???^֘r?????w???m;?=??9#??9???$?Qs[??????????'?%??-ׇ7?)??M6?R?q???Ws?b?ML??$N??9?,??o&}ɨ??g?q7???]??`,iػ??] պ]?vl?Y?Jut???T??ϭ??g??n??? '6KCʊ???????????ԅ}?v?'?*?v]????P??(??&5?? ˶??1t?w???58??ߪ???!????cx&????2??J׳t?b6??n^͢??e??R????Z?? ??Ϣ???????A???? lI=???b??a???'b??lY??1NO???|???,??B??P[???D?}??????%/>?%??CXt2?{r????2G??fLnb3~?|?֏䕙?ƥ?m`7z7 ?_?s??˜ ??b???u??>l9???q}?!_??Ʌ<1ucW?9?m?uV??f??6`:?-??7??&???+x??nD?66????r?????:???ٟ\N߾?0ra1۟F9?_?I?#????'""""""""""""r??????k?壏>????z[?4?1w^#gct>??|?G?????R???<kUk ++/????? ???"""""""""""""g]????3m?4???kn???u붗[??b?PF-??̧?sc??m?l?S???o??C?~???"??L???;.?F?? ++?? IDAT?????Č??\d?Ml?1???-g?!??ڏ???d ??0Ciq???t?ٴ 3?9?????sX?>??2Ol???X?K?t??塤v?àۮ??4?.??I??F?x?޷?x?*ڇ?<ͭX??????QI??\~???Jt??ϬW㍟?X?)??M|?c9??L?? 3?"?Z{1w?6??!?j?????????????H?Q'?'@?V??????g??m۶\}??$%%?~????r?C??s?n?R oz_z r??????H?h?>!? !????zb1?2?|???!??;??‹?!?--????'?M??x???x Мw?B??p?\?fp??w?,?G?o?x??1*6??}w?z??\uߕ???c??/????G^O ?.?jĀ!}?? ~?%o<Л8??Ws?t??+3[?? #x??f?{?$??R?Ν?ڨ????D?????/??ӿq?EWq??$?5Sx??W?ҕ??5?'""""""""""""r???? &&??âE????y???w?ZE+Y^? ?{?{??ޒ^?? ?tL'??K??r???#?pף=+?m?,?Y?oc??y?[$W? ?????d'tmO򪟸X[օ?!???????n??Ƞp? FWý?=???y#n??t7Ё?w????????˹????nFv??????gyxb ?9;??넵??c??kE??I?|s??'?0p'v?{׶?҉?????l??ڇ???е)L??Й??Ԅ??|?`?=???s?֭?\??V?Zq????????ƶa?c???3?V ?[s(????~8??????|?p?S?????Ķ????FJ??8?+????P???K???e}y???!?, ++;)??f?????ν???ք԰?箣??iD?"5]&???b??????j?]y ?uM%?t #|?ջ??m?]????m?6??aC?Qc%?AHR??C?]$?|w̺?'??"?????u?????'?F۫????5???:????o?Ŭ?????? {}!E{,ct?)g?T??l& ??"k?_l?S!f-?4?????????xq?w̚7?_g|????Q@????????Rk??1??s??'U?mH^3,?6?~???!??YBVVY?J??.??E?̡??? x|V~??,?f>???^??? ??m?????????????????????sOs{??u??? ++??{?O?{?'?̧?!?Qs:??L??8 ?枕???{q??r w8Q?M???هJ?]p?rΓ??1???>[+pF????F??R??.RN????<τ?s??7??3&??k???/2Ϲr??|?l?k ?G=?,4?V.??џ? -??؀Qߍ9?5???b?C???N?E5q?y???K???Ֆ#Z?6T ?7?;?????>6yo???٘??%??????`???ٺl!???CE???m7z??C? ??$?4?O??J\?????p????SD????Xi??{?????M7?Dii???t2|?p???v?u1??\?]36P?1?"?Ri??X? H??!{L?"Sh??C?w/?[??q???sX?pv?Km?F~???&????[(3?I?lǑ?\?????1??U??ɣF???٬,0?hԆcι????$???B-ۢ"`a??X? ++llL?A?ޖ?B#?Z??}?ڂ2N??^5o]? ٕ????????4(?=?LJJ????fڴi?jժz?… 9餓v|v????l-g]?W?r&??*|3???^???y?]??-?0??E2??u\6jg$C??a?HL\?id6ͨ????Y??"??3?ۘ???ϯ~Ɨ??]????w???/??:?]?*?w3?o??c?"?>?sy?0 ?k?(?~~?NkM??|??;lnqw???T??@ ?6??`?ʕ|??d???d0L?4?E,??vs?Yg?Z????B?@?NDDDDDDDDDDDDEu???p? ?\.????ZmW?? ??p??9??/???X??iw=?-??????`??U????;?֨?W???/&1q??,?c)g?????\??Qa?????? ))???{????(u?~ ??w,?/?1?$ņT? ++v?EU+?k??1l?&?`:?s&??ok?o`??U???|?q4????뗸£?c`???EDDDDDDDDDDDD??:O?j|??d??jE?f??T?"[?%*??)UG?v? ++??*#?y?];??n?\6?[ʷC28?g%?^g?Ғ?F?6V?Jԓ)Nr?Mnuj???f?c&qT?p????????:?lՆ(?Z?\\??4??O?LJE???3?^? ?9??6؁?Mk?*дF)???mݒ?۵?|?$l????h?O?uZ?Y??2??T??????n??̛?*_????Z??v??X:gxyo曌???y?ȶ:s?Qq???NN???o??g?A?v?D??lY???[????[????'???ф??=???Gr?0?+?4?\?o??E????;? 8I9????1O??W?؂H6?(?q???q?t??s???????c?GA?ı=??:??^?v??ϧ߽͓?Sn?ר9?zw??r?r?5???y&?8?c޾???š??????;:?ng??K'??8???r?{????{?G'p??Ԝ?:?;ŕ?鏾????|??|?[?MRf??x?K泥,?o?^Ƿ5NǕv#G]Gf???t??Imʼ???(?i@i>ƒ????????/???`???\⛵??t?]?DDDDDꒂO??Q????0?>?7z{|]?G%?Ŭ]????z?????q}?4I?hN?+??Q??xCB??V???㌩D?&???:?˭??T?+"""""r@+????u??O9 ???Ѹu?n}??e?{\?0 ?.?1q ++>EDDDD?ߵ?pS?????H???S?YHh(!???? ?N? ??VDDDDD??a?wDDDDDD???1?Aᧈ????????????4?V??m?P??GE????#{?0 ?a????c*q??C???? ??`?&?q?x?????ݷ??d???ێ?X???? ?q_????1???XOY??L?AfV?W?????""""r?7??8?"""""""??0?;???]>?mf?w??o?????P?$N??n??T????[???gX?}7{?u?$?1qɥ|??K???j?????f%?ji???????ۺ??? O?????$ ++g???7]͹???^?1??8k?:????{?U?H>?in<03???S???h?LF&Z??QU???mu?t??1?Q?,?$?֥m??.?FuS&?Έ 3?;)??"??.[EUC ?a? ??=?)sg06-??*X???]??D? )y?Y|?x??v?wK)k˫?os???2f?,????4?q?j??6????TF/9??~???ݴ?h?LF??X?? lK_̅?r?"?(?k?????|??C?u??1?????k?#???? ??/???N????&?w??[??oV?2q??&?+gպ7x3?|??a"??4a??cQ^??رn+_??y?,?if??R?Ӧ???|餵=D6ʾ?????N???eQv?՛X??eZ8???C?H?v????hD2N4?/??`;{?#??3:/Hy?Z?yd&n'{vw??5?T?KS٫????ؙ?1;?Ҹm k?\??????lb?z?ᴝ?Y??[?3??Y?? l+-?՗Ü}?t2,?իxy?.BE?8ev:NG=;66?BK?@?XR?*v?u119?????ظ??h4J{[??ҵL?>???L,??<3~,EDDD????? ++=EDDDDDD$fX??n?6*Z|?,K?! ++"})?8????Ych??'x?/???M?????Lǖ?6>?e????k?L,?? ?) Na^A?̠`?R?y?o???˔??"Ic????k?e????h?5??? \????dL?Ʉ[???5/?םW?? ???I+?3_???????q"߽$????C?6? ?KGm9 6????n???%???Ef???L\??????s?3??Ș͜?????Z? Y 8???? 9d??~}7;Z????%b?g䒓?F????????MƝɼ)?;'??XV????H???7???@|kp?Kgm9 6????5$??#PYö?0??>l????Ț??????[ZI?q3?z!df?\jw?ƶ?V?M z???[?k]Z??Rɢd?LF? ?CVj?????f??6??su?[\?ؑ???????Y??????'cT???)?7?z??Yǯ;?xx?v?as?!s~&?x???s?g???lټ???(?}??`G/`????? 6N0V?x??t?? dLY?{ ++k??Z?敯??|EDDD??Ct;?%??Ë?i[? ????O???t?w?v?r???,a??b?M?BA?X^=??6iiѽ?ܗ??1c??F??9L??|̗??7}?3????_?%z [؛u??S;????d1!;? ?o? ?Y8??g????(5啴?yI???fLb ++))=Sr?c{Uc?x?d?{]?{?R?(?y??>?`?v?7?q?9???4T??/?vҰ? ?!?ǁ?o]??T??d1?+ˌ?wH)CR?.??lgKK?Q?H?'?M?/J?^?PJ?mI&)????tW?WNGl^?????g^_ֺ඲??'{o? YSY?0ĺ ۽?c??d2s2b? ++ǎpJ1?3???!?ס??7?W?i??d??֍??5??UDDDdH??s???? ????ɎH?z ?׭?????H?inj????V??c?????????/d?p]??Uc??Ӫ??????{???/???4?3?l?@??pEi*}??'q??" ?ˁ??6o\???????0cv ??6V?i?! ?n?jJ?v?W|??H??;?c3g?|?[$"""r?4????V?U*G?H>?}4??{Y?^Z???`???y?HK??X}a??? ׈?? C ? Tn;U?m$??&=0Ѝ9K?????????>??|??LO?d???l\??@0D$?Ŝy??????Q?24?nKk ~???p9??C?0m0}??K?BOy7???/""""C??O9bY99??q(85,????*?`b]?vw&k? ???֝?h??_?????\Zʗ???6|?9?Zȴ ?????1?????)?ٸ??y??F? ?ć?k????ڹ?????%""""?4dz??1ؿ??ȉ?D????H ++?刍9???g?6m?+?OZzF?G??)?P8?H??E???V???q???[6?X@nAAwn?߻?u]?:;ضu ?c1??8?XDDDD?xh??@D?*}v????H ++???9?ä)?ٳ?????l?R>?M??d?! ++?????"""2P:??!?u??X?B?w?????~9?蘋?????t~?Qq???Q8z??"""""CM?????x?????v,?m?u??2t??s???Ko?? ?????:????????zƝ????Ҏ??=??'?A$v{?????U9?} ??S???*?娸?K??]T??N{[?@7G?q?99y?????ʀ???g?*?xEg?4?mz;?Ӿ???`W-tEC???g??羈??? 9:U???j??8?!''???o?1??'?}O???c?@??`ku-?p?55?^?% N=1???W??I??s??OЅ?cE??? G???""""2?(??#?uK9?H?Q?E$???A???mc??bL?O'?}[??_?Z?cb?bc;<~,?A???hl1[?lf?? ++??;???!L??? u@?@7BDDDD?5??r?vhL1?χ??????.??X??q?????>???S??d?? ++?w#7v??SDDDdH;i*?m[?\~=u.?'??Ȕ??y?˾??ᶯ????????yğ6??? y?????u]?׵??X?%V?iq??]??1^?'??u?ub???Z?s?}???L;??l ++????+>???j???G?^x'????Ы?\?4,????*m.??'\K?;\D"?k?????~??e~?}͖cA????I~F?{?A^ڗMJ?9^?q?sNֻ({uH?u-߻?6qq?????^?u-??Z?W?p->ާ1?po`?%??k???m?㌋??e???R?֊&???u???.???b?!&?;m ??S????]?ȁn????? ??#?????D???᳻??W?3;O???^?~?c+???~?ﹷ??gH-??~??\??6???8???7?b??/?ћ???#????ҵ???Q?Y??} yLY?A?????I?j?????f%?ji???Ʊ???p???????r?\??Z?k-???Z?q???3ʧ? ẝ? Y{x????%???/M 6?d!???r?~??|?i???r7w?7????/p??\??OKm3E?>? ++$M???E?'??%3"?wT ??o??????܋????2?k???ύ???L Eٷy?{?r??na|R{V?????????Գ??+?[D`R)?_???=???Su??H?8?i??1Lb??|??? }???????w???O7??ml?7?C??[?0t??Ö??}??l??k? ?;???z/""""??P)6? O???CS?P?$ν}1?ϼ?/^??o=?C??gH+Zȕs??~????[t???W??+?ٗͤE??????)??? ++??y]?b,??BP? ??X??????NBOP;m???f???{??o%l????f?EW????%???K??????~y?] ?=?̚>?????k???W~?????)??????j&???%T????`?>Cꨩ\x?9oD'*???'[╶=] ??\k??o??????Z??SDDDO՜???????*`ED??m??c?.}? ++???????֬^??3?9???!???>??)S?HO??[????,??3??ߘXgz/5???2~xׯ??۹qZ???ۘx??cc?:?p??s?ӽ?5?qhlnbúu\???q??y??H??;?c3g?????}{5?׭a????nҀ?~????%??}?[r??!55???g2s???n?????  @?@7BD???klU????? K ++????|>???cNɼ?n????? Ea??Ѝ?â?SD3?""""҇???O?? ??9?~????????܁n? {;?"?d tDDDD?XR?)""""""???)??V?p6z? """""Õ?O????{ꀴBDDDDDD??% tDDDDDDd??C?i? ++?wmP?????7?K????U??ᤐW??????#e?|??p}IZϠ?g??{??????????;?LH?h΅\q˕?????e?}????????67@??3????z???^??F2?x?ǹ????;ۊ6??????_e?^K??y\t??????D??A??ث?m?CS8???????^L???˭?????m???L??c|???2&d???'~]F`?????KH50wL ??x??W~??-?Ԡ?""""""r?Q?)"""""??q????? ????سg???455?D???x?'?o??g?̼???I?7?e???+??hv ++4???>ķ???\@?mg窷ٙ?q?p?Lһv?҃????????]?-???x??ﻏ;F???O???Go??Oy?5ws?X??????_?????ǿ?ti,}??{F???najF???"??vʹ\~???N??R?O????Y0???c??mV?'0?????N????rJ??y??j:?d?xL???H?v#?""?I+?<Ѝ8?j????w8.?g ??k???{?! RQQ?-??B p?q.ݖmT???Y0????D:?9???_?)h?????t^@N??+aA?4??̈́7?wG?????8? ???}?q:ν????I??????G???G?l:?n?’?e??6v?Y?ƦPէ????????n???0_?????? a?5????????>??????ı|xq6????Mv??\???8? h?5?u?? ?????g??zj )?u?xko??3 p?"""""rܝ??'8???k? ~? `??v?-?o?????k?~?|?7Mt?D?GN`??s?q?]??q???????I??q?m??Idҧȷ????O??]??G$???Y?????~? ??]7???_?ȗ??L? ?????S?b?$?S?????m???'??[????7?p?1=YW DDDD?8??͓???+?y?[b??????cz??:얊??????7?????Z?+X|?9dz="2??? ?g????3g??ֈ????!??I@3?6??y7??{Y??*"""""2?̃??A|?`?c? 4 tDDDD?xQ?)"""""r????譁n??=? 2?""""r?(?9Z?al???!???9V?""""""?^#?1Ѝ??b0??EDDDD???rT????k????p?k??#?????#)9??????????a??g-?{??????&.^???@??k??ȀYL?F?????@P?)Gew??㐑?E0???r??a??1?`i?8?>?o?? ?#?0????޵???lGDDD??z?? 큂O?\,? IDATI???A?????? ??S?XSS#yy?n???D-?Y??W n|?1??XX???qc?2?Z????ac???1?C?????MMu??O?S?9?ī?? 6??œC/2?EiZ???j?ݖ? S??}|???R??tu?bE??%?o+e???????C?Z?u??N??zi? ??????p??? N?>??ź.?Zorc??ci/ MH??h?V?ǎ?n???????ȑS?I??o????????K?(?o?ĿV??c? 'mw׵???{׮e??0?xh,c3???c,fO??8ݖÛ?q0?kb??ωM???w?uB?čwS???CyDZe?ƫ?n??)???2n!?]=??k-??U???u?^)yЩ{;F?hA{??Ӎb?(??z??Z???D?=՟??x?=??t~????:v???-x_?KXط?[?g?ᴳ(6?? 7???qB[!""""?Ȱ?Ӷ???????듙wѥ?pyi???Mk?X?? ??7?ZƯn???????????Ok]?1t՗SMe??$|????v??l]??bۑ?-??ޯ????XOY??L?AfV?Wjm????u ??V????2??0?(??N?s?????*??]??+?1~-0?(?ӷm?CM{??ED??????:???o????????D'[??G??????????R?3?۽ @??9???ߩ?ӂ?(f?ş????'??ͬ?????W?P??ʛ?????J?];?7?? k??f??.??<&.????x Ӓ B?????߬?bW-??`ָ?_p[7??????QݙD???????9wT??k&qg?\ǽ_?9cﻊ???͍f??v?6?M???D ?6?JWR????.?'?3??Ŕ???????eۨn?„?1a&s'?0@???e??jh??#?5??G1e? Ʀ%?pC?W??????$%o2?OO??.?n)emy?m.??\?L????|?f6?\???&Z:???%g? ??????M?ɈP??2???uk?XYǾ?!????ŧ2)9B???X????0??2(?8?92?????|?v??[???b)䍝?SC??Z?"8ɹ??=?i#B?????????ʚ¾$?FMd??b2???Nϵ)k-?MM???X?n ?f?$##3V??-i???X???? {?@n???mj???M? ^??;?>'??}??Pg?2f???z?{???G=?w???qs?G??y?d:??????? i?/?????RVllc? wr~a??????????~y?\RL?}?WQ?w,W??'u?gœ???k????m7?`????J???x????[}??ٵL??K?$??d??%???I<|??d?????a??????ޒ>;?????o?|s'E?1??G???? ??5??f)g?xn2??rV?{?7?g??&?AmMv?<兠???ֱ?5???"?f?--?:m* ??'?NZ?C0`?????*?$?\e'?^????_???X8:????kW=nq ?F$?D??R?` ??g;B???m?+?lHc??S???n?"5? i#'3gT??/ʾ]?X??Mr?gnF?????#??ƘT?κͬ*[E]?8??8???.?6?f?[?Ⱦ`!#??Q?[/??>{*%????f??5?M??y??ޚظ??h4J{???\Y?Z?N?IZz&?c?;?????Ȱ???v?ف7???8?׼??u8??SD????_????AkX??n?6*Z|?,K?! ++"})?8????Ych??'x?/???M?????Lǖ?6>?e????k?L??s?KeʂS?W?%3(ؾ?k^?;;?2%1?H???2??c????<{??x|C?=?y.f2?֭?v͋?u?|nB?mw?J???.g???????w/9?Wt???Na]:j?i??????p['?/???,2 df???T??$?3??SG4@?l??~??6??^XH?Z?!??G^n?!3PG?????:??P-??#???4?to??]u?-o"0?L?M????9?=Dz??4??Fj|??????[?k]:k?i?i?? `?K?y#e????NeF^?????k!????????YTo?ں"?I?ւ?@F^?Id??WYCy?h?f?d?????Nv???8?l[G5?X\2??3???*????Ʈr?m????i,??6??su?[\?ؑ???????Y??????'cT???)?&M"-????2=f c?S?(??=????o^??????m??/?=?-?ͺ^???[hv????u k? 3A2 '1?????????V"/???،IL!%?gJN?cl???????um?y?Kɣx?i?s?D???Y?? ??? ?P?B$???I??6l0?T^?ui?SA?????X??z:???Ʈ^?Z???^?7????d?????A???Yk???vw7k{mGO[|$冠c/m ??훔?D?g?D;b???a???ٟ񧹮?.v??:?X??????2? ?ee?v?A?:2????DD??y??p????#\^DDDD???~?d?]u ???7^????_[Ʋ?/??'??Ki9d??'cv ?/?؟_?tS9囷Pw?B?#?8?c\6???_??=??V???W??S???ԭ[??+???Oa?????n=????????? ???????i?5??]???????#7??ח?.????h??Of?\2?Kg][wղ????u5?mw1?? P0??`?F???@eu-u????ZAM? ?????z?s[?Q???? 46??>&?ǧ?Y????????Ce?rV?@ޔbR|???m???'k?????&2!3J?[o?v?.j?j?SUɮvK0; ?^Ŧm??ol??????߃m??g?!y?$???,]E??=???P]Y??Ʈ^??}???p?66?^????-?]?u??c??????XG*^?y???;???????o???I?p?㊏K+DDDD?0 ?no??S??????دy??_???4?i?9??g?!|???G?9_? ۾?????6tb)??1'?x?z????o???C?ԯ??? a2F0?ܑ??t???????o?????)N?? ?x?I??n9?M????c??k ?/v𥬵D۪???#gF???BK?y/[7???# ++? )?c?=k?וk?LN_?H??J?.?H?B??L?-"7???n?*???Ikq#m4??Ď?6®?A??????R&??B?:?*?f??( ?ٌ???i??????}?}7[[?g???=??I???E8eelٰ??N_b:???3????}kX?i?ꌂ?'J%'?x??^{?? ++???,d?ˆ?-lY?????Έi?'????????ol?x?`??8?ō??5??UDDD??p??m?=?B??O>?ml????? ??E?a?475v??f? ++?qΡ?am?[o0ƿ???Oa????J 6~????_5?7x=?/?\כ\Z7?̋[?Xx?EDDD??*`|EDDDzU~J???Kَ?lۺ?ښ?x7G??8iii1r?XG?????????;l4H????]??C???hKk;????c???????? ++??S?~??q(,,";;Ǜh ???}??T?Z????1??`?`c?w?b????>???i????H?km????b?????SDDDDDD$?7?%mX??P0?Б??R??A??mc??bL8???>????f??8?_?/??? i????Ɇukٴa=?G???v????$?Ό?9^g[ʀ?NC????????"""""""I?????O?????ٓ8??L]? Y}WO??f ??????oW??싯??a?T?6Y???~??,0?lgrH????]n??F?x???r?4???{???WVr?]36#ā?KY?g???*Fg5?s?ܱ?zn??[N.H?X]7?W=?ULZ????A?????߷G;?u???????Yv?yL?z???B?(E$1Ds??|?>??W~ֳ??'?X?????_#o2?w????y??= ?3םRH????<|-?~?)6??]Jƍ#7?/??????"?? ??t????.-?f2xv??????L? ??v?Ňi??,$?_fOsݐ??????4\?z????A `??D?2˸? ???????vP?8???????`(???p??P??*??좶?????V???=??f3(?? ???!?P?{???`??2F#˄???4?߭ր?b?ׯ?t?!??΀?1?EDDD:+|VҾ?ozJG?+???r?(?8??X?(oW??/?`°ԃn-9&???????k???L|?;~?S???\???!?o7?G?Ĝ?Y???Ѓϑ??b?w?Sr??|У?2??K??????g?S{?q ?_ſ?}?]C?ĵG?????6)5??麀??q?1@???ƫ???m ++?z8??u?y??wH1?Ң~??5?Z?6/?A#?J?atq/,?W???ȴjq????b~??}'?rsֈ???? ++???N?????? ?dlQ;??ğ????|?,??L?u?{L?y??=e??]DDDD??*?EDDD??t?RD&?ۅ????d?:6:?L???!?? 3]`6?.03b??ˋ?Y?|?{????L?9?BTDDDD??*?EDDDDD?[t?T2 ++>{?;??ϻ??h>? ++4g?? ++>?5-U?FV??JTDDDD??O黴??c|?G{ߧ??B??Q?DzüWRx"???뱺?M?.?EDDD$?(????????N???#???Ϟ3'?r??~?P?_?|O͉1oK??^?ց??n??$?XU???T-*""""?(!??? e?????? ??b?^???FNf???ƥg?#;?"[Kc??????YYJ ++w?u? j???v ?\?}?[???g???.,%?T?m?G????$Y???l??????_a}?a??x?HDDD??Y??綈?t??|?!`?辀?ni?t???adڞDDDDD|]~4?/}?K???k???i????9??S[ >?? ???+?8?滸bzn??? ?7?ո?1~v?_X?u??)y?N;??????R`?????wְu?~j?4 ++?ϗ???W^?????O?? ???Y???9?*X???r???d?Kވ?9??rBR ?w????Л?ش???L???{)o?W?????`r?0??????Ogx?B?Yx+?????~?K???v?IF]Y?q???S????????݈?|/?sԷ??s8??\??DDDD$J?t{{?9??? /?s?N???OEE?`?s?9??;?n??綑6??1-??;?????G2? ?-?????8?ɿ??B[?֥?5???US?k???w?/w߲???~ W????2w?~;????b?˚go??_\CΟn??C\?/?v?߮????!?jK??`'?̅W?IA^??5/q??????#???CI%????79??4l???u??ILm??֎J? ?>??:*? ????>G-?{B!?????D???3--??/??[o????t֯_?UW]EZZZ??s?6??*@????ҥ??=???G?3??}/??} ?Y*?i????̜>?,?2&?M^??N???plq ++L/?? oBŅ?V/?޿o?????3??Gf???W???]|?+??Fr???9f??y?0Կ?ms??R??U?? ?\????9Y5?? Fw}?K?/%??l? )`?P??]SN]?.esu [o? ++???|?7h)?XE??????w?·_??ͻ8`??i??҆?????5%m??%6#?1??O?I??Ż]@?1??+?C???z?>???O??|?;??????/o????RJ?C|?t5_J^????????n??y???k????;??uO???&??c\Bn858iƆ??"?Ś\????|lf?=I?)&??%?m??g??????K+8?B??Sy?!?O??6T;????4???"Ous+?#A?>?Қ??i?@ ۧ]N?|??u9??? ++DEDDD$?u{??QN?1???ۙ??????P?/+?Ą?G???(?Z??p???U??H???f ??[?'z޾hz????Xx?6}?=.}O??_?l ++J? ++GF?6??MDDDD????g=??V?q??wq????R?No? X?2??y?vVa?G2??????g??J?????z?:ʫ\2??q?????/N$ہ???q?M?????9Ѐ?U??y???+?Ĥl???[?գKX?}7?u???~^??w????}BY}%G?…????????=b2???!?p?O?Ĉ?/????OsÁ?l??????r?0$?B??m˗?|c9U ?????Ys?^? ++֥f??|?b#e ??<???Q? ++I3@p??-e۾*???&?삡L8?F????}?Y?t ???r??)??٣?v?u??x?6?ָ???? G2?4?@??UK??iwUu??ҏa?>?̂T???Y??P?g????J6}?1?6?s?ѐ?=??s?a\v?]K?⃭?6B +???S?6???BUk???M?WVS?¤?P4b,??.6o???? N?@FO=?I?3?ޓ?[X???l?UEc ?C?2m?H?SL?m'b[?Z*+*X?|9i?i???#&1????~??7?1??u)""I&??A?tF???E~Ύ8:? ?n?W??????eS??IH?~؈i ++EEDDD?????g?niSn??r[???d?r?7?g?@Þ?Opۂ??q?n9???d?q???g ??Vǖ??#???dM?3??A?b9?W?0?{?sJI?[???w?ɵ?1??ڣ?1!?]??=#???W1:?????????h,?????????k.fB?6^???????x9c3Zhx????W???O???????)t??lf????uy?ג7u?j???k?)?z,3?k??Y??X?o?????G2??l??kX?ɻ??y ++??e`?u??U?}4?e@C[>??%o?ʑ?Q?'?,?,w"3?D&?T?f??????? ?p??P[????x?*>˜a?` ۷??9?cg?? 䤂5???ב??P-?YȒ}????#??s?=??K?Ӏ)??zo}?5??z??r۝??\?? Yu????????/ i^fъ?T?D???DQaZ???Z???k?gs9j`ֺ+W?b?aȱ?pDQZ????k!m?`?5O~mz???u??p?'???B ++???ͻX?5??%H?g?e?k[?R?Ƞ4????P?P?N?W̙???m??r ? ++)l??o????3?????4?Ỏqhll??z??c_U~??$?¶g9l?#???m????.?zt\OZ?N?wC?]??_Ak??P?YF??2h?????"?w?QI?:???:?C<%??? ??M? PO???Z?????s?"D??` ?B?1????U?_|w??<&4=G??U?RQ????uE??P0??U!??rNC??s??;K???#So=dد??Z ?[??5?!??k??Md??x????2|8#G?2?_ ++&TKYM????x??f]LN% ?қ??l圌?????F?????x??7x?|(#F?dĐ??;??Ee0??%?l?qR???vQ?8?s??{W?صv??O?0ͫ???[N??Ͱ?T?Q????-??M?T???Ҡ?%?1?????e &??T?[WG?Z? ??B?ڠ??!??ji????n?|"\ǡ?ѥ ?B?}??غ464??ֿ?4?? ++`????S??Ll??D>?+???? ??#?????3??M'?+???7?D>?ళ?Ź$Ѵ?yU??""""?@zu??.?$;?K?Q????u????`l??o??O??̌?????KȪ]??6?v?4??Zɖ???L/c4߹????1? ?9(h?? MR????G???_??EGv_w???ͭ??? ++C??I?C9?6??N:??7?n?~5?S?gV? ?!s?L??sоF㤓???G?`?B??'??s%?ؼa=k?,d???;o2???z?v????F?7?(?퇱?m{?w???hґS?Mjp+??????0?k??H3?_{??|??1?9??̃? ++??a?1??6?[?{,k??Ӏ?n?4?q?n??????T??""=??Օ?JBӑL?Խ?t?bL?+??H?w#?G?z_???zO???,?֕?O??}?y???ݻW?Ν[@Ͳ??۪??4??6?Px?=?#ƎdԸ gt?/???Ƒ?Ò? >???S?P?қW?ťż*0??~???P?O???݄??????u?ZW??Jgc ++?naM?a&??%??q?g?Qbך?T? ?? ?+1?9??4???R16??ѿ?Խ?????"FN??IǍ%?r+?5???hd߶*??y?z?m??/@?Ƿ.?;?S? `????Bj^in5??7D?k?6D????%?Ỳ?~???'+?܍???m?M??ڈ??ܖY3?n5)?-???LRhaل??@?????6/???\??{?F??.ED?Ǵ4?wt?edɶ31???.??H^ɶ?;????]??^b??n??O????S?)*""""ݨw??&?I?\?狶???o??{?╷???7x???????T???;???Ť?~???y???װf?:??*????Q_??? ???k??'_gѲ????Y???6??*@??wxe?&j[(?t?f????K^??]?w?????\??v??????4??l,?;????Z?jv???)M?\2?K}?z6l?͞? ++???bO??I??1iO,!?z?,???e?)?]?? ??U?r𖏍8ELs?ٲ~e{???v?? H?? ???G??~?"???????l^?KvAф??Zx|????U8F??????ܱ??b????????*???m??^kI/???nc???ݿ??? ++j?J|[{??i???(r???;KY?u'???(ۼ? ?"?C??I????Z????z'o???P??1????W!,""??1?-la?7??wv?`u'???;?[ ++zE?7?݀??@¦???????????a??m?n@?+H\??no??c??ݷ3???y????ͣԛL ++??a???hl3? 0????ύ??O]?w??c?r?+,eڠ?????Z¹??=??Ó????5?????'???t'?????9??????y??????_1?G_?U'???>??Ͷo۴??P???j???*@???6?ZB?{ذz?BH'?`8S??u?:e?? IDATp ++???d???|?h????o c?20?i~ވ*Ц?Ikq?5?۾?-?kht ?Y? ?0??y??????????䝕!R? :?X& M??1#/??;?P?PpD??c{?,F?>g? ++?}????.??sv?????W?P??)S????????ToG?>???"???y??M?M?F???=o???V?Ejjk?V?Z4?ܔp??i????\??z???6???M?l-?6א2p$yi ОN??????3~?d?!#3????ϜMvv6??*??????HMMkeM??HUY?.Ywv?Is??Ϟ?`?yK??v?H?Jֿ"""""??(??PX????q??U:??X??cMD???16??'???z+[jS4*???????1????? ?i????ǐ????????5?????l;?E?z??#"??ڻC7:$?????t?c?e?ڞE??7??[??nnG?i??#???d?f? a ?9ލ?Y}y? ???C?2uƑ??hHDn^~ĭޘ?&v?dN????Ż?"#?????^?l!%???7??4?ױq?:?0x??????ᵷ????Vn;Y]?X????^?r>??%ޭHPz?JG%?}??????y?????|???R?|s?e?^B??t??8??0??;??m?f6?[?&I;cH?Ƞh?`?|?HOK??{?x?ژ?'??N(??}?4l?'?ޛ??,??x7?0?????f?|?? ++FE?/????G??v?;t???{Rp???!?>#??Y?:K?]?@TDDDD???O??q\2??%m?-?>?(v;x߮?qt?w?????p?ڒ??m???>c??m-??jOG<|???Қ??3???Ex?g=??n?. ++>E:(тO?]?iZ??7?'pF?цXA?f??/?6??"""""I@ᧈ??t?B????'t???p?o??n@???Ƴz??ﵞ >???3?c???vt?"`VԴYx#?wSW??X??Q???%?Wo??$?D>[??? @???????t??O??u)۱?m[7Q[S??H;?!--???"F???$??R?.?!֎??*M?s'?[??nzl??d?S> x?f????YS??8???3??d??]???4V??3o2????pb?g?3???ڻ#?<_wg???O??oƘ??????7????ւ?Xף??7g[???;oq?z"??????ˑ??n??3?`$???Y???S:lú5??!??,%%??U06j?1Xk1?y@/e?]?D]??b????xx]???TJG?dú?lڰ??#G?x?ED???T?E~Io??j???|?D????1?|J?=???3\?Vd?L?z?X?ft?Z?????uf鸗?S??ܪ?m??[??[C϶??C?F???ȸ?FDDDD????a[?l?t?H?@'%?@ ??`???'b?%2?4?b?R?q??x?~?lmD?lk?i??d?p?|?Rᧈ?nA??NWT????8zL?d?Z???J?d???? ++?;?????p?[g??n v??r??!???Sa)??E?T?|B????;??n7?c:?????????G?????^DDDD?F2?W???,y{卑S]???3?;?2ln?W?⦦????t?xA?qp'???cp???;9??8'ٳ?c>?T??w[:yrL??d???`?q?u?o??q ?@???2?3??????I?wS?{???0?m??ڹ?ڝ I ??əl;C???|?i???˃/kc?W??bUX????|J?uj?????=???p?K?}o?O???O?̡9?????t?>S?ikVp??W??swmsפ'wz?????? ??M?v?0???????l#eO??o= ?ư??? ???V???'x??Ŭ??H????;??|??b? P??'?y?E??(???Mˣd?,>w?????s/????`??+?i?n??87䏹??4~??*??^?????Ι??Cζ??n???z???5?|B??M?%m??ZZ??0=??H???H_????#??;??? 9[?????? ++:c?-??U|????H????R??C<`{GU?ɠK??/???????L??<?????Q?}??\1,??ݕ??? k???O??&???L?t???-W??[??ҟ]ΐ??<?}???Jn??b?f?8?v)????ҟ^???v.~?;\ύCp??I3???????I?W{?h?????????,'?ѹ+?z?e'??????(?K??.???$Cj^>????ܭ??t%???*???ޏ_????D?{???S??+?`O??+&?A?6??? ??&j?}N.왏Vxi??l??X??[L???`\/??!??bCx]???#:0? ++`?? ?????ȝ?????C?`G???T???!????oD??u-???P4???0Cg?x??᧻?E?/?N?????????Op??%??i??m~???p?M7???s#BH??N:ť???????Ȏ??捺???????0????Y}ɓܵ?|n9??$?5??f028r޾??\O?I?&?c?p姵?e?p???7Τ7ا7O??Xq` ++8??/??޿r?O?`??Y?;?8??\L???*?@v!???Mc~????/m??g???N/?TWJN?/????c?Y?\,r?Nb??l ??4~5??Oof΅?{??p? ???{??:???5?C???u? ++\&E\?L?I????\?@v'??;Dv3?[????s&k?1?·?NTF??5?g,?d??J]?=?ȟ???MѤ+??rx0???EDDDD????_??|???dr??&?c?@?^0 ??a?*!*W|Ⱦ@ ?????R???wa??y͏?^?2?P8??ź?u ???\7"???!oM׻??揭?c'KJ?.??&~??󘑻?W?o?+U??? ++???a? ++??eR:????t????????:??z??????,enq*??R??C?1Լ\C?K(?-w ++ ?"?{??믓P???????;]?x??̭ia:x??u?D ++>-???_w?-?4?E;?;|B;????q7?~?Y?H?h?{?p߇??ˉ???V}??p[?ѐ?S???D[?"""""-?啟?l}?I6Vng?E???țL????S?>????C?cud?V????M8?Ɔ?F7??!????x?????`????m??T???j?6?䏜Ω#??ē?????`??G???g?m??Dnׯ?????? ????????)޸?X?p???͕??P?????b??`qms姗 x5??u)"7s???Z???j嶌v;+z?5?\o>?ڱf??n`???D~?b}_v?;4z\?*?_????z?????>??;?}߿}V????j????}????HB???????Gy???/~a??tk??3????x|?E\3??|e???????o?2gD?}????$?͢Ƚ??|???S?????????-?!?_¼?^ϭ???? ?cH?*?u?#??%?=:'vǷI?i?O? ????j]?5^???.hS?????ӏ?Cʈ1??#ͭaת?y? ++NAVj???xa?????DF?U??͌#F???????3?;2?}+^??Oa????bq?,?v??1?CȺ?W????S?ފH<%J?ՙvD???t????4?T?]???r] ?????cO.? ++Dcvq{<?CJ{+G??cL?^oAz?J?u7?!??H?u????5^Z??u??dK?3Q?n?>?(2???:?????3??i}^"T????H???v-4s+Y??b??ωũ?ܜ5?lf???;?|B?/g?ś~O?=w?????S!2???k?rܔ???%???#??????9\#f_??S???۩??酏q??A2?F1?+?sƌ~~ͤ??)e???w?~??o?DN??>;8???>#7$-?J??.????Zo?,?1????/?L?'"?}?ݞ???{ Q??W??k?.(?<<.j???nn??v??rp?S??n?????f??????I?n????9??"M?O!?B'???^???#????/?l?JiY)??K???@O35?v(?:^?*!?Z?vz?????.?}>?? l\??4o??N?W??}M8㒅*P??;2!??"d?2?\?=????9??mH??uo?t\??m?;??@? ???pjh??qs(?s?{??2?Ŏ??|tdX?i?Lsw{-?B!D??noE??|>???U_~A}}}??#B??x??/??'1i?Ԑ'?? ++??L?XZB????d???? ++??0?? ;?В? ?E???.?ҕ??r?/g??U0?@o?cl?{??D??u?I??Ə??'?2?y?@T?P!?B?`??[u^???Ӧ3u??x7E!DOD2??L?u?? ++???y?2?K >E2?L??kO?.?? >{INB?s^???Z?? ?'??*H?X ̶f,????5@??k???????;Е????5?|?1????2??A`???-K^x ++!?B?!??B!???a?n???2??S$?D?W?.? py?u???ū?||?K?uO$?k?'?W?֗i ?ut?/T???/?A?g%D??????P? > c^wHz9?m?ב?3\??e?B!? D*??B?d?)?1?`$|???+r?oJ??"?????"? g??iX^2K?uO$?k?????U?gg????A?N` ????G?@?8؎????د???% ????u?к??]?FU??z?U???0=ߦ%? ???n?Jbu?+աB!?" H?)?B$??|Bh"?nl?D??e(b??Cw?)D?;???g?? ?A???6?iGo ??~??d????#?dA???????W?P????6/??????s??a>o? 9???]u??O@B!?" ??B??????x4???!???]???.???g?#??0??²#M?=???W޿?\??sPi]W??+p?.`7p?:??<_g?y???6???'?`?h???%B!?B?O!?B$?H?m@?kZ_?+???_????R?O???o??9e?#?B!D??????_-UC ;?/S?uv?>? I? Ϡ8??EO֋@?e_ ?E??ﲮ>S?????dwɚ`?????H?1?{*???????v\??w?~????? ????\wW?????i?B!????sϞ=\??455?dii?ه?????x?O_?BF?B!D??B??/?u?l??e?[??au?."???11?ߥWӳ?m?H? F?Oѝ??K????z?? ??Dh??O?u5Y????.w?? ?Ht???nѫ??dY?w?n,?s?H??ϗ?K A?B!D ++?x?ֿ?9??y?Ǝ?1}Ŋ̛7???Z?4?_Y??w=??ӑu????޶?Y~z??m??%??ʩ?r?MWrBy:??|r?/x??ul?[C??A???9????|?M>X???}???|㙌ȶ??|?,}?O???y??[?rH???ֈ?l???u?S??|q???񨂠U?B!D?{8)ލBt?? ?0?gW{N6 ?? ++ ?#?{٠w?e???8??M?S?޶C?Q???X!?H??d?-"?HQ=???????o??k? i~on%?>>[??? Sh?ּ?G?+?Up6???]?yس?Nn{>?r o&??g???< ????J??|???7|wt????? 3?@$m;??-??O?)????&????%?? ?:?ž??????2?;▯V E?B!RZ??O?????????r???W?Q= t$???K??&?'???7????e???NJ?aӖ??k??1;? ++??? ??4?P??????Or?o>f?????S!Dj T???O?d??> >?????_N?a?i?+?= BE??ף????rH??Vz?>Z???-?aw??1h?B?{]??޳C>?\&\u?/??'n??M??? +??i?U?OBf???f?S]?_N?J??So??D??ُ?P ?rغ?? ++?-?w( ++??@?u?^nW?w'???? ++???@?oEvoN?H?>; ++??p?n?u C?B? ++??.?pH???=Gq???2????һ???gji1?)4?)'M?-cW?q ?~???`>?f:???0zy=-?4????pW??#|?? ?`}0?9?."??? g,O??S?P?Ohs?e[Zx?8; |B??ڊ???{z??C\??j![Aͺ*?}uA?H?O?p5P??????Ġ v????'?B??B???3??ښ?Z?Ų??9^?\ ++??,Z?6????4?Wr !?Hv??|@\$? ?qpa/????d??D??؄?B!D???o ??,D«?? y^?wU!??{'?  K???t?????+?j+ >?_?}A9??\*{??`?@?d:?nw%?L ??s???B!??=s????A?B$ ??Bѽ?N?'f  C?g??v?Od?!??C? ++??a?G?? ++? ++?] P`?????.?k 2? ?zk????ҽ?!?s?z?u9Z???8????'?B-X?o?@?&?>?}T?)?B?8sW?Tt\??:/D?:>?y???=A??B??!?wV?k??̂D????f?֦???Z8|?Q?wy?u:??Q??Ad}J???}????#?B?5??_?????-?????!???B!D"??8??'t3O ???'? ??G??a,S?d?8"???0???C >eg=?^?!?u;??.????"??{?]???@4P5g???s?oЌ? ] ++?????Ӄ?s????|?6??Ϸn?v|?(???v??JB????@A?;B!?J(?r@????5!D?H?)zD)E??:?jjhkk?wsD? ???GQI)??HG???DcEg???`g?HO6?ڭ?O?00M????+??{?0@I?Qv??R??P:?4:?J)0???%eT??C??ǥ?B?>?#t?]2?????>{?t??"?L???+?nw?ui? ??35?ף`?Ϻo?=?.Ҝg?vׅZO>???)??? ++K?Ӻ ++>?v\??W-?$X??D% B???I?Ԣ??u?&'? ?+?? ???????????D? ++?????iO6 0??I1??^Z!?R?;o??6 P?`????NQI {w???S}?c]???????"ѐ0E;?L??3??G??vN??G?޳?7B?7???=??~??5=???ɺm??|"C??x?i?Qw?? C?????B!J?$??]???9P圯4??h? ?|cϽX x?F??Rt????}?V??????t:}:??^??&?{"?B?5?? ח?????$?w???????s~?I??#Vn=@?'???9??or??C?ݼjg???????9?7?p??x:?ka?}???wfr?S?ct??(Su?1?R?????Nބ?dzK??Ɯ??]U???5Q??x??6ɐ~*eZ??&?ǃ?? ???1ͮ 5??ߢ??[ ++!W$?????f3?!0;?}? ??f?[o*?????+?pd 06?ϟ?zrP??q????H??]?n?ϮD#?ݖXn???????m??\!,?]dE?u???h???ř;? rn??3? '?y7T??H????Nwl>!?B$?D???.?????[)~??i?j????1r?t& ??X'}??????l?[O?7???:e8?iF?m??????????+V???/?`??(,,??????\ ??q%?S??o??>?????F4*?U\????_????=?E???i?갏???Yv? ++??k?`?????>?8n?66?????????S??h??v??yc??I??ps???/b??;???P!?BD?3?\ L?WC??????6??+;ȘtOu?Y??t??L*3ؿ?y?????9? ?>??'???U?ݯ?P??̶??x?g?Ly???΢?v??42?;?3?"??m?????s?oO?z$y??C뗲b?0???M??ie??????m???-??c???+???w????????6x׵??8?gR???p?o????'Q??ƛ???jU?`?E?d*h??)??o?r?1?(???Ԁ?񂂶?/x??䍞̜#si?^??/?????;$ ???}{kQ#?sLy?ֲ??/Y??K???PǗ?`w?xfߟlZhh?"??Ck???-?w$ǔ?Ѵ{-??{?z???!Y????ys?4????׆7/??j???, ?5??Å,9??ȉ???硭??~?^? ?X??"?????/Y??c?J?rda??{?3p?? ?硥z=KW.??`?????V??.cէK)?7????y????%??v\ͻY?? ???c??r2?h?S??Y???GSc;+W,g??I??Pxc??K!?"??-?????? K?`???T???l??>?$??^2?????<Һ?l???7'幫h???>?nk?e?,?p\???jo?C?P?? ,??????]?O ++??ѯ?i ++????? ??"a?WB G?y\?????T???B!?%H!)~????X??t?0??ٱ?????g3<??9ּF???7??5??`-??f?b??4?v?|?5?????#?m͒3??fX?1?C\??sdl~??? 9???q?? `?n?Ģk????W??Q???ɟƷ~q)k??[~?????????{G)eu ++kҼoU??g&m?-??J?S?m@?>}?4?ر|+m?3?1~ ?P8????????h?? K)?CfI9?e@)E???`???/???vEza??????=???Z??u?d?8??? ++??]ZHơ????? ?@?{?e?)/Ͱ_ ?2iٷ??*?#?2Pʤ?n +? :?(?(?pW21d?????02???Ͼ?f? r0?O?奔?x?(?C[??.gC+?I??????lkh?????_???̙6]̙ϴ???j5???m{?????Bf?>?\?\E?1?3?m??O??dr0"??U??????4?}?;?hv?j???w??/ᄝ?>6XPhz???*Bݡh?+D?B!D?I?}!?,??O???"-??e???G? P??/`?u{??RD]?qߡ??J?i?????????MU?} ? ?gM|??o??Yg??Z^??cہ^??] ???]??些????_??#?l??/~|??????{?X??i?????;??n4Y@?????k??c??R&? ??X??dEV???????l?#?7Zk??db?g?120??̏???b?q?%?x}4?7?1h???#?PN???դ???5i?WK;^?Ӏ?"&??ǻk>aI???Ѵg=+?B?????*}pɽ|???????(???i??U???~L???ji?W\J?? ++?? ??i?̰?t?w?c?t? P?0??mg?O?6QJw??;õ?X? ++a!D?(g:?\K?೯ ++'?|??q{t ?McL eLP??ilK8j?W?e$? 7ލ???gb"l/Eg?????߭??w8? ++~\,?r??+???1??U?I?'Af??iL?J?? ???N@eA?@????TDžrěJ?3???u?m???g??Hqx???6?????论?6???~8Ћ?w??ats????KvM?????B 5?????L??v? ? ++!?"?z??ž????|&b? ??d??????g??ք?~|?l1s??9??I`ɧ14}???㘹3(N???Ӵ?U?nX=?*?h?|Lֿ?;??}?tJ??˱??N덭?9??5?0M???x8b?4???PV??adff???eL?yt?ϳh????oҤHt?%???C@?ӻ#0???3{?.ѷ,zЅa??@e??%??`?}????Y??.(ψK??["U?~??(ۼ?`???;??鄋j? ??X6.Lv??uw?}(BW?:??????ڝ??U??z?v?G?ZT!?"lr??Hu?5!ϛ???"???3X????????) ????@*t???z^??Pkj6?ck#ieS(Ȉwcz?p??PPP???Y??K22?hoke??Y????3}?2?zP}C=??I?…????]?u?=?#0????;#???.n?'6s?O[?9 ? g9??@??"Gw?q??j?">ۺ:?%?节7/???й ++?q?O?[????U7???q?㫀V?ߟ??????T?%??o??%????(?px?h???6?'? ++!?"??????$?a+.-e?UB?j:;Z@V???`$??װ?mM???V@z?+ʕ~z ??/d츉?Y??鳎&#=?v_??(U????ܾ?????o?"q9?vz??Hί??p???? ++?|B???????'?['???????nY?Rag6^??2???O?j???3:?k?@N????lB??iy? ++.x???ne???S??v%?O??|???F???t.l????M??!ȟ|̎????{l?0?Q??B!???D8?m=0*?m)/?no%?=b?&{v?`??]???Ļ9"D?a???Ey?? T??,~ ++???+C????b???c???S?Ԗ???Y?x?]??Fr ?Dk"-??i??R<޻@??虏>`3˺?[???O?b;????Χ??l?_WuW? ]?Z< u?@?o??+?K????O?/?\??|??H;??B?@a(H *?B?H?} CEH?)??( ??Ho??#T?qS????H-??U?N??,?"??J{?O?c?JO?8?? ?SE,w?%?L]??by8??}Ί??m^??? ++?~W?O?OtXK??@???\???vW??F?i?? ++!?"bdC$9 ??%???]?/??ȭCƏ???$R?'Rer??f?j9?+?x ??? ?????w/??9v?? ~??p?ۀ?V[?jL{}x???1oiV{fZ????????~???5L??B#?p?RJax ??P?n?-l ++شa=???:|D??#??1???F? ???ډ?&]?䬮?q}??z8;???Y|?q?kQX?H\??!?3tW??:~??1?J?"?K??I{?^??7??nE???+@?]?o?X?k??v?3t7?;??{?????ԅp7???)Up/??]????W???]??u`_?? !?"u*t?g???U??3 H??"??o?J???x?^?匓 ]?i??ΰS?A?5???:?u?W?~ ++!b$??s??i4?c&; >S?s"~?v?3'P𹫪?W??:贃?X????3ߨ?go6:?X??9?? ???;?'^?_!j?95?g?o??????Y?#p_??6 ݺ?\???+??? ++X?=?ì??.??i?zХlwڀw???"?2?9????Ntl'߭ ++|?~̉=ئ?????ZVW???*F???>??B!D?r???;M?}?dig?I??D ?W??Ͽ??r?,J?NL??3??kg???\Z??&?\cc?Y?x?ྈ??]??9??????q???@)?6??it\????n?c??@??'ۘ?\??U?)?Ƙy?f??u1:??c]?' @?????dO????`???|8?? ?8?^??k???^??tL 4?vt??&tuh#???#k?.?9W'[?? ?¢W???G?e빻 ++0????1?@4в?M&X?yJU?`4??| ++!?"?Ej_N??3??j\?=?~??=gr??70.;?G?Zv7???˝?:?OH?Hee&?Y}??k?&(?i* ?£LL+?T??nW`????Ŵ? ????/?????=Ԏ7????Gr?0'o7????,?};??Mz??K@&??< ?1 ?Ui ?4u??g?????ۃ.Y$ >E8??(???=w??*???:??Ȋp? ? >?WA??Ve??Ƣ??? ++Fv?ڣ|ڡ?`Z?'= >?U??m?????cXNw\oC?????L?u?s???????A?Vt?????Iwۧ? ??d???????]?.@W?~?????C?da{ ???D?|s???????Z???w?d( ++:;????S!?}?/q?G?O???Ȼ?J?????????O.?E?????????G??I???:C3u??3L??=??p??SZ??1???d?~?ӛ?9???8?"???ic-???iꓠ??i?V??d??SuT|Z]?:5??c\?ʠ;?i??Re??Fz|O??h|?q4E"?????*?^??Ձ?M???w???s??6??gO????q}f???gE??Fs??9z?Jq???{??9O?+??Q?????????A?O?W?2??m??J?????? ??ě???H?I????U??u >;?T_s?N??UP?|???xx????????N?*??7??/???m??4voO???Vtw???ϵ??:?=8?q?XtE? tp???qx????)c#??????}A???$?~P??????f{? ++??v?\O?Ϯ?T?0*9?{???=!D4$r?? ???᧢~?Ӽvh,ל5?#?F???ɂ??q?D??M?>^??;?f?κ?V?=$??}uTy???9???o??0?? ???*A??#????,*;??z-?Z???Ï??????+???????????r#sZٳ?y?{?v??w?R?4cN??]=?+&?U?iXA?fX????m?'???V}?.?N9?ie靟????K? ???_)# ???B?5???{???:&?q!׏???????#?b?y?U???+WnC?t ߞP ;X???y??????rJil>Z?c?*[????î?40LP???????[ ++!D/?A??.R?s̻[T?1? >?߽y?]?&B? ? >?ݹt?]?????M??8? 2?d.?n]߶N:XeU?:*??{???^o??!h???=??A????Ht? ??׹?y.D?Xm?]͙????r?r????2??~?St?{2?????u$?XU??]??7T?v?J?)???@?o?q?%?B?[????}l-?כ>.??O? ???O,??W?R????????4N?՝\7=?B?z?ӓɀ??p?#???I???ڃ???W???g ?4?c?;?c& ??t??7??t??Z?_??N???U? 0????????Ů)g2?g???7z??b0? c??x?}???Vf_:T?.F???????q@=??? :?~B?(;@?qÂ?Lx?`?&??G?wG??P??^?)???եm_#?~C??AoWc??9??gW????%?????K?u?*??s??:??\x?????J??v;P /T?9????G?DQ?????[???==c?陃>?6=?~`R?ǜ\??m?????O>? ?w??#`6?z9??b-[??? ++r ++D? ++C?"??}?}B?.??g??0/ҍB?7? >?>~??y???????O ??%s?T??_XT=??ˡn???V0wT?V_6?󃽨?gqD? ??er?|>?d??(EH/`\Y&???bI?????1?401?u P????p ??35??gs?-3??????Cw򏊓??5gqD?5v?k?϶?+?ќM??R?;?g3tF ?_V??? ?=?X??~??]ɜ?,ۼ?ڶ!????iw{k???Rx<P ++_G ++x?L ++ C??> ????p?OH??S?x?x?X???S??t?ً?5??υ??=[N? ?=?????kN\4?C?V?v??}??$?cׯ@?P????6 ?:?????s????[?s??^k?Vz|?LO???5?@:WR???_?j?n? ?K?> w5p&?J?@?2?YW??Gp|??%I@??5?0u??0TBP!DB6?z???y?zJ??B?g?a????W)~????/??n'k???_?wYx?Bԩ7???U={?3x?epj??7Vu>???.@;$?B$?~Ⱦ?BDR???T?ƮFŻ=???g?F?{c????ⶹ????V???V~?Ͽ?????3????ysC=GM??X' ?9?x?F???m? ?^g?w?xo+YÇ?c???p???U???X? ++T??5@??`???????2??????z$? W*?p????廃?H?AWv???? ++&?[??3?>?v?5?C6w?&?vE?"U?B???????lH?R8?TZ? ԕ????!?%?8&???ϭ??[?^???㾟???o???ay???刓?]>?r?1?~? ++O@??j*??/vZZ:?N??c?z;???^?.9?A-kx????t?N/??їU???Ӵ??5 ?T???u?ָ?a\??Oռ??????a??,?G????5??n(?7???1<|????U?CW~J??B?֛?\??$=sJ???>W???G/?7???Ev??? ++>c-?P3U??:t??=??????? ++????u??;? ++??q????>?WF|?{? ????:\tNs???:k??j?-??*m ++]?j? 5Ǻ\k]w,?5?4??4}QW??.8?:??E?]O??k???:!??O???,?????4 ???s??Ŭ???p????b_????|?A?????ZYec8??97?L~|?Z~=??蟐_9?+??? ++??S4???x ???)??o?yKs̥????`\v???t`??T?P({?OSn???{????# ?Q;??œ:>y?E?:?@??I??!L?Nv????aeMUJ?? ++?0??0???S??D?~ݛt.?6???-!D8??{??P????????Nj??!T{?[]??Gꄚ?9?NR???Q?݄֓JϺ?W0?@???2:??`??c#??@?5t?>+` ?Z?????]???{???F?G?.?T??W?w |??G???v/??"8???:z?y5?6Ϋ?7t??'??3ZU?z ++!?B?(8????L!Dl$X5?QW[r9??3??????^xv>?Ǎ?? 瑁?Ia??ֱ@ðB8?9WRS +??O?rÄܸ?^4?????1V=v8???y O???Px 5u????K??ƅ?>Ϣ?oSP\??I??-?Bt%??y|/!D??ag???????Y??e'w%[??k?vZ]??????????t??????}S1:?>????p??n??t?m!????U??u???o2o}??? ++? ?;??-?????|"?]Y?&0Ӻt0?a=G1:??@W?s=?z` \q???˚j?yW?*?????????}v???/??a?; 4?B$$??sj?B???G?|?dB{|???r4??????K,[???C?RZV??_&???@O35?v(?:^?*!60V???o?>???a??G}}ׯ%͛Ƥ????`!???ts+D?-???'.>fE?=??Ӱc?ŀb?;*Zϳ(??>E?߃Ǽ ??М???? ????Ҹ0?c?????ۜ9?*?&t?Z ++MU?}|~L??X?>`???|???c??}???T?I??{?.Eu??6W7("?J ?b x!*L?HT4Z??`?s????/??83??8???Θs?u???? *A?F?HTPA??\?\6?????w?]???????{???駺?V?Zݽ??k}??}????ö8?*-0&9^??G?jQA?(p??????x??@QE)?j?QǯgA??h?[? 87?`??o?s??j7GIH?.]8??> ??HF?rj??4쭢??? ???AQ????g???9?D?l!w??7?S ++8Fgb/??k?_?6???VT??(??N.???u{???ζ??q?õ_L]Ųݴ?XEr?.?_D?[_?=J?\??9?V??#?????m?Tσ?e`??}???Y?sEQ?D?ׅ&4׷?$E??E) {????]?r??/p??/T?)??(?G?<~{??????EICT???oh????!B??tbD??d:????$???? ??y? q?u+?qW??~?x? b?????]f??? ?? ?o?? ?[?w? .??s?:೦??k?J?`?$??Ƞz7??FtA?޾??? ?MW??(?¼??????X'j7???o?y0? ?O?e1?:?Ծ?U,U???t????a??^???z?^??J??5E?>?C?nQ秢(yQ???a??Ҋ?q? u??w??S???? ?A??????6?C?s**?A\?ۋLb82?l?>??b?ClB&??!?d?a??8??Gܨg?? ?rL?? 3???:'\?+?????uI??A?g`??????c?;L?[BuZ1TEPE?@< |'?>?!?MS??:@?? ?~BQ? w?h ??OEQE??V?8??????p[?Mgu???[iɕ?3??|F?u1Z?Ć?TⱮ??B!?J?Yz?p-??[???:???Y???f?Lq?żN??uF?? ????a? ?????%r?Sn? ++h?u1??ֵ?,=???G? ??^ ???E?/?=h???m?YLJ??~??>?u0 *|*?"???[+Je?????ߟ:?Eɋ:?%!??? ?o7 ++OQ???=ӒD?? ???o?g??-?:????# ?m?GH^O?~؆?6/??p??C?!ƶ?H? ++?R???ء(J?? ??D????(??(?N? ??Ri?np??3P?5??? ?Ä?N+???(uN??y?p}?}?ʱ??,???????HlE?gTU??QE?4쭢( а??R"????nO????,$????7?D=???q|?BE?ʰ??pR?2?????.?s?/?#ajE?? :?>?pFı?!3??"?g҉?q????-???9r,?m??@3??YjA??? ?Yt?S?7?w;???(??\?&Q?? ???????e??YQE?th?[EQE?E?n"w=8ޑ?O??7?:@??j ++????i???5go~?g?@ ??o}w?V???lGB???n3??@?z2C_[h0 !k???M??H(d????(d_$?nz/?qu?$?w?t =?X;l??B???)?O?S)J?,??99?S???YZf?R?L?pn?K???|I? '???????????`?N????W?y?R??????5????(?R???SQ????SQE?????>'3??? {?P?A?J ???=7?E???? ?жQ}?=w?F\??????^ ?N*|?Z ?gZ)??????,???T?5?7pUX?r?h?õ???C?1??l p???:?̾????P=I?oX?,????#u?>?zɦ?V?O?L"j??Q(?R????̨my???+j3?0e'\?|???z?UE?7?ձ?(??(1???(??(?$?`= ??7?J~v?>?_R&??RT??|Ly???p???]??祈ϊ3??6#e7D???l?o?? 1˨~?8?y5?? ++??SW?$^?V;M__iʿ???ݑ>?Pt?9??M+f&5ӊ??$?P??mAD?!??)0~??W?SQ::ISQEQ:*~*??(J5ћlE (????A7_?b?S `/????9?ɑ?? ,Ar??1el?] ,.?. Օ??????!}m$l???8`pJ???=??к|"g???W??:N\?r??.?^?L??c??f??J{(EQ??'S???? ++E? 4秢(yќ???(J":?Mޛ? ++ ?+EQ??^ ???H8?Rc^UE????G???m?? q{hDAt'????HnP[???ߺ???G?lH?[DP+?-?΁????}?a?;????????*??(???t??dE????T?SQ?????(???e?VJ???ˈ?/?TH#J?DKu?Zb?Y?:t???6?? ?e72?QAxY+r?Y|&?q6""?|`|D>ED𰣸 Q鶚2GA???? ++f???"d?? ??9'}???=??'??`??K???;?n? ++??8?Y????????߆?w?pK?D? p???G?H3??׀??????????;???*J~l4 ++?QaBQEQ??4⧆?UEQEQ?'??;????F?|8;OW???`i?w??g9??͔>W???????`s_?????s?&?O|???????P?kL????q?w??:??y?J??1?/?Dr???Qf?{??l?Y???H.???A? ++?Ͳ??A????b?@O??S????y? ???L#ݫm?.yp4?x??|nNwHEI? ++?5Lg?ߧ(??(?EQEQ????F?(S?`???0?ql?}ߕ ++s??g?b/??`$~j?I??^???X???M?6?/? "BZڐ??q?????? q???=?$>??yl?`??? =?M?????VC?ݹ#???t?ar ?a??#??2??8??3?ˮ#j?K?X?O?_,?{?? c?Ͱ?f?c?o??(??(J???q? ???(??(??U2R]^Ϊ`[?\??\?95???T????СPڛ?r ???Pm??Eĵ?YBJGwD? ?D!?Wn??k??' 6?_V"??6`50???A?7?D???????p7???K??"}vp????> ?ڶ?ǜ?&?1?9?8? 3?Mκ8?3?S?8O? ++_?|???i?WԿ@?Բ/TG[?:?- ??_??\G[?r?~?Y???????Lu?)??A??j7BQE?8*|*J?М????Es~*??(??%????P??/b?y[?>????=?#?~??????????Uφ??y?{???O ++7W╈S}'?E??Fз?&,7?N???{?H??c?mV(??̼????"N?+B???~fBӓr?????hl!>dm??iN+l????V???D?~^?1G?@?0?4???A?e???8F+???%?*J)x???֝?i??j7BQ?N??S???9?EQEQ?ʳ??7b՘/S?? ??g+?????%??r????^??O?? ++???z`=4?? ??ȼ????v?E3"$??)? ?_??? 7Cl????"?ؤ?/#??_???C??L???D?"???߃C?n l??԰?l??:JG???qu.??p?5?1?y???o?,??y?B????d????§R.:?? ?D??|EQ???ySQ?⧢(?R?荳???Kɝ??#P???n$>e%Ι?(|?=7"bՑ%n?"|?I?ٓ?Z?????O?z??LǕ+n?u??j"???%??-A\????ھY??Y?[?2?|????\?8F????<&܀?? ++L???L?????(??? ? A?K??[??? ??uD ??|83?????a?x?8:?Lj(?#?;? [???7??i߄o??~???a?????^??ُ@?? "?6#ێ?C?????8??T?I:T7mk+?iX?m?{ ?? ?}`&p??[?8^K}?Q???n???;{0j???x?>??"hg?b??????yR???$?^n????!pEQ?6P秢(??(?RjY??„?Z?[*?:9?I?L??|? ++q?#|??;???j:?? 0?>?A???8G??????tZ.A???߅+|?O?WDM??6Ա?'t?"&\?ݾD??????6??q?>ӄʝc??q??Jۨcb-| c? -Ό)?:A??{?=?4!??z???m?? ???? $?rW?-y?l?????WԽŇ!???@Ѱ??)?ƽ>=Ʊ??{?'???"?? m7??~8?@㥈KxL?a?E??nYGO???K????p??xp? ++???|`|??Df??#????=??IEQE?4쭢(?ұ?GEQ??r?????B&qK??9??χmHh?r?ix x?t?'?M?P?? h&??????.N?????7?k?[???tT?oz?2??c???e???+??a???'~E?0̓g?Go?[???s?̣8?w2E??C?D} ??s?Y??,?Lj????g;G?^??D w_o??4OҶZ??i??`?d?+??cʅ?3*|?<%>EQE?8??T%/??Tj?mȨ??(5?B?Tz?h?#L?n?]Gu?z$?d)I???#0???:[I?6?^D?L?}?ݞo ??;????????&p?F? Os????j??????Yexp??_!???S????ύԆ?y???&D1)?N??,? ++?sE%)v?=??)??e???G??g?? ?X?0??f? I? ??a֛??{"??`??5?&???_F?`??WС ?? ??ڋXĒ?? D,?,a??????????z?Kd^??v???|????????#?w??d??2s?G{?H?˃?ȝ'?= ??~?ߐ\?ۀGq?? ڴ??v9?_z{???:bʺ?xR???a???V|t???{? ??????Z?f??q8-??p*?}??'?;a??p+p?IQ?"??n??_??.??f?ت?(m?m?p2????wC&R?MZi ??9/?=J??9?(??(?E??J???(??T???۠?$E?_???>?????z?(Q?mvYG??O%??D?I7L??9?t??bD???7?0?H*?V?o???=?FLz?,W?#???? h??ӆ???%0?:??]??t系ѓ??\| n?&p??k?2?/?y!#?tq???=?2???Ag?W;Ǵ?胀6G?lC\??+nF??M?FS?z?A?? D_?c??P{??z?Cv?"h?4??ĵm?? ?g???{c?????(??T?b??\??E?]?.JP?Y??%-6?o??? ?|??LJp???2??p??y??g?G????c??0?I?:?Ԟ??#?I?????r?????R\?r?1?6xr9i?u.????"ۣ(??(?u?vH?>ݞ??A?OEQ??⧢(?R?亙?h7:??~ڀ ?V??a???ا?(;R??c>e?I??%?????????:>??R?LF??5?L??ѯ?o!?|OD?(+vN??ν??5??t?"???g?"~ƹ?j?i?T??v?^\??=??X?|? ??>??#?????1??~j?^????ˁ??ߗ??}?!? "p??iv*?:?4?̷???????Ϩ(Vo(??B?y? ?я???K??1?????k?"}??j7BQEQ?4⧆?UEQ? ??o??ify??m*???????}?>? P?zQ?^i???~?C?ю?????+?X??8AF?? kL??????L?BF??Z?=ԮY??????? ??}?@????=??9???L?S???A!?ɏK??j??/o?ʒ$s+???????4?????a?rz??w10*?q????? ++*??(?ZP ++??)??(J??Q?N?r;?N??\?M?w???y?G?P$?=H\(???"????)ˇ?Cr??yDII*|??$?L2`?@???.>??J?????Ms??rV?x2?]׊? ???sR?)??p??X_G?!m?e??ֱ? ц??????7?v?@4?]y5??sb?=X3W?J???????&?=xt4ND\?ˀw??!???|??,??><?/3??}??A?w{?"?P)??????c?7`?蛖??????h?O??CjQ}??o?֜/l?D?x`?y?8ю???#?c&?p?l??lk?.?#?nz1'w?b?y???E~ ++???C&???}???????9??k?K~/?~#s] ??Aܳ???ŭ?g&??@>?i????u????l?( C?8??07Ƕ???$??拡????6gٍ?????!8O?D:w???v??m?<????V?B?L??3#EQE?y4秢(?R?6}?5J'?*?Rz&U??Q"QXج???nS9??zJ/ ? w?Qo?Jy?R?!% w?,?BʾI??v??Z??-??????6?:}f?r3a?u?8???Ȝ?,??*?????_????"??L??^???F?m?<(?秈v?qq6 ?eo?l&??m???? ?=i}y?\?????<CW77?~'??=.???;??;Es?=n???20ljp??gP????|@?E????"!j?1 ++(?8?Ÿ???ܛ?? ??{n??,?"a??$h?K?͈? B??a9??*?E?dh?N??>VEQE???kEQE) >???^?Đd??5???A????Of6???M2?0?8??D??C??BH"|B???3(. f ???"^??C????D޶??l?h????????4?{&?=d????vz42?a?/c???c|????x?t1Lu?? ?Ç?|x??9???{??Ի? ;?ߑES?9ݕ????DBjG1?d??!?v?7?6?1?v?כ?s?`???_??p"?i?N?????PEQ?j???(??NK?"??(??-`?Kފ??&????p????9?? 1[?Ќ??Ae?7???J????"??I?9&|? ??v?'? ?e??*$???#?.`?'.?{m??o??y_????#?ϗ??1ao? ??"\?A`$???*????K\?????1?BҶ?e?Y? h'UX3m 0?:???2ŗ?????K?g?ēS?????`?|?g??=O?k??L??`)L?< ???|!????f9 K;????6?0????:j???Pj??>??h?oEQE?????(??N?Ѐ[ ?;A?(EQ:qy>+I???w?????v uMĶ0Q??II*??c??4?????? _?Jq??.?s?E?|??w????|??0???}??hg bC??%??o?+}?!$???KY??acE? |??????I?eL?9"?i?ur_?m*!??|$??N????nj?j??vA{Ɠ?;?G&?0ˇ=>? ?G?%??9?z?|} ?ۃ????[??????E?k?`???!!rמ/???*??-?m?*,??Ft??6?????!??K???w:A??sc??v?w^?$?S?????d???up??m%??KB?";???߄??;tY?6(a?O?dEQE?KG? _????(????~?? ?G ???7qRC?;?:8AY??X???r ?m??ͅ??=??y;?)??~gI??93???;+&???"???*?M???.??̾-A]??V????L˯??a9 0?_?kw??-??m?SW/????#???;ݓ??-lq??à ̣??H??p\??0?C?f??R;g?Av  ++??.F?ШQ?!ȹpI?6?# rlB???S?Bz$?8?ßHfh^??:?y]??5"b]8???!Y???x?q /?J?iC?㊢(???rN#??D?????dD?Q?Vy? ?;#9??z>? G?$$q??w??????D???qw??? ???K?.:x?(???E?UE?OEQ??Dg???U?(J ? W?Xѳ?ܟ????tϙv?4??^ ++??9?#??}??y w!bUZ??҄X???T?"Y?L??(??B??9?????G<9X ?L?????qn?????@>??eH?փ??K?^?Ο"??`\?#?@??-?9??M???zXr?~'"r??V??|N?????_????Z_?['????D#??????~}cP???|?`???a?'?K??]B?ks??m͈{|???'j??)??d?H?j*??(?R"T?TEQ?K-?M??8?? (1V?|?YW/??r ++??????gԣ u?}?; 8F/??DЕ??҉??I?GI?]?~Q?~-?/?¨[?ߘ???y??%v??z?.??v&???QX??K?0?O?D@D??"&??"!s8?N?:?;??`?X?ӓP?M???????*4??g??J8[?ቾ?+???3??? ?^?0 ++???*?5??m??0?"?1Y?Y?^O\?? Z??2D?kg?Y.Fr????c???|??:|>z?xiy?,'?{9?d?? ??a????#93? Ǜm?uw??F?p?>??`??9i????䂰?:?<7 I&???>???:W?פN??1??"?{???׺a{9???M????8@0?)A??)?uVD??̜??HUH]BQEQ???⧢(Jg?\ɷ+-hl?Y?Š??S????>?3!!M;? |z?r????????"M??B??1K??W??B???(?#??N2?4?Y?w7???(k??a7 ??[H??͈@A???E?0??t准?Y"???T?[q???A>X?&ך?"????{????|G}???Dr}?D??????H??#?L#???D}U?{?cM+?n??@n?????Z??? 0???7?C`?ղ??ꊥ????|Y?ʪ/< ?e??s/????}????H??F?S?j???f???ҽ??6l?tW?@ ??H;'(3?y??V?!??\a???=? 3Dp??_G{|?y?~σ?׋P?Ιf?$j?NH%?(??(???Q?SQ??S??{??v)J-QLX?Z?V&$?iG??|??Y??g9??n?81?Z?G???V?L??[?P?i???????$?????f]?9`-"???mf]??;??3??ܔ?[[10ж??????y?bl)?p??????e?????!?Ki?(搘r???????PnVK?I/Ju?0Ŋ?(J9 ??QJ?????(???Qi??`??(??K%???D?T?J????????????ĬOB?Έc?ȵ?~??H.hEQE) ??? ??݀?EQ:+??Pg%?7*??18?D?T???n????D?r}F???T????Ub??q ?0ø??gφ?&;?o>?,o?umw?eD??*ב?; ++:r?(??T??(?ƨj7 @/ኢ(??qe?S?OEQ??+?J?wN,C??~?,G?ۦ2ԩdSl??3?9?Sl?Yw?Y6 ????ld ?k?s? q?6 !pW?? lP?/?D9?N?X??k7?Qp?u0?r?Ʒ@?9i,0?; ??C?'???k???8?k5???_?곀??pK ????il??ҥV??5???qhq6'??P?u~H?܎????.Jڱ??Ӧ??B9AGk-dG`px4?B+?uξӝ???u??8???$??? ??y}$??7L?(Q????t??????c?[??(??(?R??????V?Ԉ?S?OEQ?z$Wn?|???H*??^k?[E? ??_$?E?ΉrЗ??7??.?T??J???y>.?dp?O?U??D??????q??L#?? ??N$??G???\????XL?Cb?n#F?ED??p?!b??M????? H?؝?ӈ?7? !\&Z? ת?gIi?%??N??????r̻ה????9??H\?mH?XL??BE??b?????0y?"?_?5VY}ĩ:? ++b??ܬ?̈́>?+{?#?-fY?????](o?w????e?[???7Ϸ"??A?h2?v??? >?s?ن80A??0D??2?F?E m[9 "?ۿ??T?5?{?뺒?6z????c??D?6̓e??????z? ??#+Ӱ?΋S?z???@?uܽA.?? 2ݧQ?%*?-ȹ v???r 6?^p?#r?L(?j ++??????>>g????J?y????l8n?[?q?]Z?:EQ???%???uD?T?T??H2???0?J? ??M? ++?????IM??3*q?????d?QT:O_'8????????`?Y?F&P??????kHh?$4???!??yhB?yh?'?Z5????????G??????G&?<? ++sA?T ?t?ȪfSS??Y?_?m6Fn#َ?2E??????;<2?Ӓo"?烧??Q????m?C?'-?F ??(?i+???$?2?-_#a??t???\???A??*??Ѩ??????>A?OEQd??gU???9?? (?Z?Qh???Uj?;Q*CT?G?q?ل??n? ??s%bo?k?ٌ?G? ? ++???'?@???L$x"8N?`}h????O?lڿ? ?{.??H?S ++|q׽??ۀӑ??Sb? \!O??????ۯ?:D;???4?ۓ0?;?{C????>q8?.??????;\v??h?[?۬ 9?l??D ++k?+? Sۂ???L y???yܟQ??Èun.?p?p?PK?36-a????z?.&????T??|?a?(??T????T??ʊ?5?Q?OEQ??J\??b ?ԛBE??E???X????? F%???"?Sm??S>j!,??j7???74?l???}?p??????PD$\????I??,8/A?? n??m?o??[?e???"?^?????2m{i??E?R????9?,o?=ʢ?? j@?󛱦???'???{?ӭ5?g7W???:???:? Ƙ??>sn?HDH\??<@?d?????"֝?X?qy0?\C'O^_?ֈuQ?d?Wm[^F?I?HQyCAf"?I{?m??g?????? ?u?P???(??(g?-???*X9T?TE?oT?5?;???7??OJѳbT??ϭ??=?۰*-F???Y+?j???R???????? ??'}?  ??Ѕl??[?o"7??C?E\?i???d?(^??{F#N?C!?:?NC??#BE-???}??$_?D?BD z¼7w??JD8Z ++M?g??y????T;?Ć??????i?D?ȑ???ɇ<x^??ô?6m??9ޡ????x$a3??+X~??o???\!4???n^ƽ?h??.<L?4? xKHhlB"?f??tht?m?q?-?-@?!?bO??Q???3K{???&%nA??Zm[?J?Py ? ??o?=?????}]??+.?h?Pj?i?ǚ??ewE? O???=???}?h?!??N?/ΩvEQ? ++???y5?zr?SET?TE?IQ????HHY9+?6???tD????<ۻP?? ++?Rk????=??&??[??O?3m?rѝ??:?[?8?㖰h???? ++\?|?= ??W?s?Y?8? ++?:9?????Wϒ"d?C>?e???$??D?8?^???^GD??8?_???<?z??qq{=k?[?u??æ֙?Ө????=?i?V?0????$??V?@+ ?/?gwDS??)??Ou?.?v?')3m????xK'?o?{??(???~``l?Y?E? o?E??9Jس?ې???"??P??d ++?q#K??h`D]c????޸s???k?:ٛ?I ?eۈ(??Gĺ|?r]???h?;?=x?D?H*??(????? *~*??T?J9??} ?e?y??E?"<??? ?8?욣ϢB???YX?*?u|6????z;????qΚJ?b???x?,??W9?[?o??_'?o???g????p?'0???5{??? ++????????????g??0?3???9?????????m@D?ň;?u?B????93??/?,{??ɴ춺?@{?^???{{bD[???+??q}n?B??V??P??? }Xd?????=[?g/??i???`??fe34??e?;w??? aG????xsV`l1Ͽ??"?ἎsZ68,??I??z?ܓ??B??9N??h??e1??[??;pe??S??N?,??(??(J1Tjrw?q?*??T?SQE?.??T:Iܟ??I??:??G蕲?j??tY???????$篎p?+G??\N?(?-C?h$p.~???G`#r?h???F????? $'H???q6?uqx ??? ??? ??????#??=???:{??0? ]??S??<???&}?lx ??9G??Ln?\)&ғp??}o-В?ɵ?,{#,?ٵ/??Rj???|???A??>??p%?(H?r?!h;mH?K????U3?dp?Y????!mv?|5?G?0??/NC?Y??xGP?n??B????: ?T???n??~????h???R??i???XQ???t??>W???n!h9??o9?Ϩ\?v?u}.???y?5?N??Y??ٔ?н????,??2??Cq??7??o?2MID?KbַĬ??Nԃ??7??(q?%2? ??뽘:?K??Q?˨kU??4Q???^g?|??{"EQEQJ?!?????*5QL?OEQ*G?,?e??j7???zE)??£????4????E*J??a??9?]?,???p?1Ue\?"J 0 '?V?6?`Cnpʮ"???%??C0q??<^#?8?|???P]???C?? ??EJ??1????gG01??Y????????@s?$?]?9%??n?`??yoD6??Ȥ>o?2?.???u?I/_?os#???q?~y._D???@?M??'? NHy ?K`'?ε? ?A\??H??m?Ob= ?L????????p?1?r?yf?????W܍???$?O?LGm?s~$c~.?ȴ#???F?1g??s?\??b???%?)?yd??_5? c|???LK:?U?zDZy?????TE???Ҿ??:??_:)?m?_?֘_?????8?w".EQEQZ???iy ?[@?????/?(?Ryz?-ʞ?!j?(?2?qK??DC?}k???ȶj+N_? ??s???>?\[??=?? ++;l???OEQ?VqF???ԻGQ??KZ?[(?????'I????hy~?w????O)?s"NF??P3??A C???G?4?"}A?AR?????y7;׍(}2?1??1I????}6?????g#DV?{|???? ru?w?}?l??f??????O ??<???5???{???S????o??h??om??-?k&?K?V??|$Ym?????l?)bq??"??????J|???M????f`IJ?[??@$??H‡?T$???o?D??e?ER??b??????Ӓ7???H??~䅺nS]~v&???y#??"M9?o???? ܷ9| ++?s??z??K7?X??x?ǥ?'D|?M??y?\L??ۓt?6t ???Ϊ?eߏ??Ik.???SHt?#f>??eME?d?"~>?ȣ?keR?oT?J??"??????? ????c??!?????8siӟ?#?aE^?c& ? ?????I?/ ?=gWm?kj{|n???j?6UL?????!???8?i?[+L?ı??????v`k?V???M??????4??B?pj??????????n????K^???vw`}??-?8ׇ?:??I.+?jB\??/v??r b???:??r ??aC?>??\蛅X?w???%q????? n?⊴ x?"?sۦ??1( ?w??wk^@?<*?cRGY? qa?E? 'n??HO????(n i??+d[???=??n??=?"??H6?eن?5?h???H?Ӿ?~?W?}aJ???,G??G?R?.y{??x?8???????T]פ5O ????K?&q?s=+ޜ?F8ݻ?{d'??7??^??UE??G!,????2?glن ?????1W?N?L?RFT(????vREQ???ݓg@|?w?R??-?????\?e???OEQEQ?n'??o??\?L?"???d???? ^u?'????N7?v???V8?&?*?N?+??ܷ???q?? ++b?.>??|>?#3?I???????0?>$!vҫp!R???x??_?ȟq?}?V`40?2??Sy9??? ++DHu????o?ȹ#??>D??D?2?H???????H??*?>?fz+>onW??{?>x? ????Ĥ?rt?k_?$???s?f??u?UTK?a?ӚK???C,???vf?ej?IY????ܿMv?R???????t???'?K~?]&?7????t7??r???[PQEx???[???I ????:?S'*?EQ???sE?4???=?????iU?=M?Y}????_F2/?p?#?Xh??????u`1?} xۤ?N@??5AcM??~??g?q?t???\??$B?C$?p?X>?????Y.??c??w_zpv\?t ++?;?=+?R?/?2?6?i????}ɀȮ[+??3?| x?X?*?1*??ё?{w#A??ҷ???O$?]?:"ϵ'T???JE?5?|N#????????"q??W$?ۇ?r??{[%??em+? ????@?É7?y??uO6M5?p???*q\?ۻ?/?6?0'7?M???9?8a"????m???;???Gރ~??<?'?$????|d}?H??c?}?6WԱL???>k???(??t2??V ?YX?,U~&? IDAT*????ٓ? xEQ>;9 ?????`?ޛ=Iy?f????W??q?3??)? i?ɧO:??<<9?<?+6???? ` <09>}Y;`?Mn^??!?8b/A`??ҙ???W➁??\D??g?? V?????N?"???l%??h??Z??k?;?`$?z`$bj7?8??W????٫??#??%???w-??[?q?x|zK-??{?δi?3?=??c??/@????7#??#W?T?U?YƘ?#?M??"??$鹇?T?+=A????y?2??v?3???l?'??<0 >??睑T?????b=?};gR;??>d????^@u_?u??é?9???XDuj4??ԫ?r}?Qk??ьv|8??-*?[?5?o???P?\?2???.?>?c?ouEQepb|?ӺA? ?T~*???????t;۽ X??|M;?،c?-??3?_?`??rfs??6g>T????????(e?4ۿ??ޢ?٭??????"3?q+?;oL?Ѓ?????B????}???s?????i??g??/?̿ ++?9喒??(??(???z?m??$]2?G姢(???? mY M*??? ++?0??bx?)s??.?1ߕ?vݹ????E??`??H??U??pF?$p?3??|?l.???????Z???#?ޔ??/B I:DJ???$'?>???/A????GH?k?e???~????W" Sw? ??Xt?K\????t?v?k????')vkE?,I??_?U? ?PI[???}?"?JOWxB?????'K|?i{{Z?2??=!?????Hv??+pI$??{L??~`{B??iF|???]#>"?3?@??C????l???{??~?зጿE?????/{?ؾ!?2?w???I ????+p?4`]?E??K??#Ҙ,???7??h?J??????he EEQ??΁ٓI;Nw???*?E|?"թ(?Rz L???O??y(???@I?7k????s9"{????o??| ??,?̓n?$???Q?G???Hzp??/pu'M?3?????!2 ?+'??^?Sᬯg3`?O???s?8X??N?HkĽ'??^?J?d?&OH??fj??ڋ????>Q,??"67V?:?-?*??????_??~?!??@ާ??u a?i??;??1???XzZ????%?=m?\?M? ?Ti???3*?$?q???Q??dnW??_ %?7?ۏ#?+'?2'?????g.????4? z2??p?D?IlOy dЃ[?????!$???}A?:?-????+O??~ ++???$?Ab??ۻlV??=>?gG?$??(J?(?{??}????????%?Ky??8???dO?(ʀb???2???N9?????(??4?-H??zyI? ?Q[zXQ ++?"?R?E0k*??t??H??ˈ|\???}????k#?S`3,?o&9 ++?*"P'???@7?d[o$UnWw|X???+??C?A I?%??>?rNytL????\?9ĐR]?v?#?l0m{Ed????+??!?+?|???2??w??ȴ=??Ym????с'??$?????m?Ľ;}vW????%7ݪ_??c???e???`>???>W|7?ݱv???D??\??/x?Ӗ??8??5R?????Φ?$. ??}?g??+? ++?x?+???7?.?=??~? )?J?*?&MkXB?k?ԛ>?E????i??^??)?K?D~s??????=?pT???'8?OE?t??yEQ??,%?1???OEQJ????2N??EK?*?R???ˁ?۴.J-?r??➀?R&??X?=?M_5?W?2ѹo;?>??gZ????w+ ?????? dy?8? ?'??#u-RZw;"v????F?5"F?CV#?3??;3???+g?1??????M???H?>8?Ȍ, ++q ++?Dr?????WkR??,A݄e??I?J????V??u??U?????{?e???V?s??Ox??Ǔ"i5iY弟neu???K??#??I{fIO?|˱?'R?'H?? ??W#q????y-?j?U?s>2?/3?"ߣ?&?????e??d?8?\??J?v???Ϭc?t?`????c??}??????F??O??Nx-???f'q pEQEQ?vӮs,)?T~*?R*Z?VQ?A?Mv?Tk&??5??fT8?h??!???;?2$=?R]?֊UWzoD?TjӞ???p?$????ܮ???#=p?)/}!??????eՈ?a??????ez??;o" ɬ?!??zV?4o卬??r䵆{?#?-???;-˂??i?/!?"F?S???F?*?`D?QEQ2P??(J?t???䧢(J??M'C4??%?Dy???^"?^?BN??;#??F?? ++".?????e?l??h?b9ҟo?"??f??Lg$??&?-"B?#??=$???,o"=1??p??#???w????????E?w_'??y?"??;Ͻ?H??U8??2?N?B??a???hHF??Xۋ3?????????bE?I?|?!? ?)O???P?&u???H>?7]?jE~?? |??5kI'???A??u.E?n?n??ρ???+r?V.Z j??w#= ??EJo??&?2?_[?SOy?n?<]?1 ?p?R??*?w!???@??&W?!e?Y4?Y?j?yZܒ??F??9$=????/=???:MzNE??+??{!?ps??ͦ@?9??Gu??TKP?Eh( ++??ߡ?$zx`Z˪J?R????f?8?$?N???????j?y??纄??P+=?v??g??W??|Il^??w/?M???Lߪ^??#?iǡ??D?+?g!?a>zRf! ?C?z|??6$/#?'r?ۦN?z?.G?o??T???zd?B????y??^????Q?nF姢(????OEQJ????&=Ei6?g?????S???^???u??Kv??@???&?=? 3?e^ZT~vz?l?ǢjX?3ȉ???e??iɮ?IO?,??????f??B ̄??)k???Ԗ??ZiĪ?t?ts?(d???????߹??0?????9(Ԧ@?c? ++???)P????)??????H?MԖ??䕩?I????GQ-?l?? ++??ɇ}?.s? ++?$BB???J}B?k?T??НvK?6vd@???䴲??r?I?oWR??n ++{`???1*?%*@SpY)??(???????T?TZ&??>?_Qe ?8??v??R ++ہڽ%R?aQ??sY??,C~?D?O?2?3??? ,?{??D B?ZĖ? ++??jqЋ?K?uA_E??_??y?k????,??? X4θ 8?????k."1??K?????Г#XR?????rs?LG?%??X??????j??G??IПE??ز?6 8i{?KP޾??2Ԗ?]????+??!?M???ߖ?uef?????©?D?O??sI?? եm?R?c?)?;?j? ??sc??q101??*g9??<6?M?E???W?????7??????}??pK??#Q⣈??????{l?—!????????쟎?_?柘ֶ=8W?ڿ6x?ZA?g?.? ++M:?h??JZB?u?H+????I????????~?$??=?????{?(??P??(J? ??? ++OEQ??h ++Li ???z?&???F?߼? Әn.? ++Й?6? ??????!A!??׮R??=?tJ9ۢlF??/ I,+P?>???????<5=?&D0?N????&|A???F??oG?ʻ??/#iV???? -? ?R?????sm|?+?v;??B? ++??ͪ?}??n?3W??@>???HP?i"tG%N???2b! ++?wQW??i????JJ{byi??3?2?0b!?&Xg^G#? ++ ++O??????',ӄ'???Ds?zs???%???]2y?n?}?^?#?ғ???FYT|NA?M????}?.???????-s?>????O?HRE??y??(?B姢(????O?y?(???>?OⵙQJY?ǩNc(?Q։?Fh'???z?Jf?H)Y+??Ⱦ<)?????F?޿ ++ɩ2???a?8???<)G??7/M?x?e?qw)?!d`?sHi??H߿?H ?G??AzE??:zɺJ IDAT??A$???{??fJ??F?2&_%?$??L_?B? ?8? А4?|4??????I?2??ش??k_EDn=?ӒGzNt??'=둞+"?_H??s3???~ ++?ğ?nxl\???????0?f`????R?|?&H??$??x?.??]H???l3? ????uG??Χy??F?(??(?2HP??(J?t??TE?b??*??=????~;Q?6?N?(?\?y?\^?s?G?+\f?p?????#???,:?W???|?"?L;X?I???~d`???v⮏?|~?Xb?# ?aH??s???*?^?_"?n~? ?oG }ȹ?#?| ++??@-y$h?q?ɐ??Hd??Z`?i?P?=???>@o??1D_%~NZM???q???_????䑝P-??5??N ????3R_h??C$???cs???????|=???N?`?_???9?????$?PjEh( ????ݙ֊????9?"?F??9???yi'?$k?!?P?$:-E??Z?????E???????7-??????iڃ?$??ʕ????W?ﶬ??s?i??,!?:uyIqCX2?Bd??z??????/?_?7\^??0l???>?RVŋv?HEQT~*?R2]/????.?n?4???~?O??M??zD^7???e??m&?`?ӫ-????R??h_??yL???߄????N?? ?f?'GWK??Lj?}?ȗO?????s`?]q??Ls?,? ?%o?P?M??3??(TKP?.?k??I?=?c뚰?%?,[??J=¬O???p?ӒV?֒??-ԟ?\????g?g#?????????gE???H?É?i3??a?AU,E!???j?>H??+?????kp?s????]???j1p???U?B?9 ++EQ?A??OEQJ?n?i??k ??EQ???5???x?%??2?xײ?\ؤ??F??"%????Nbpd??uY??zף?? ????g7e??+%????5 ????H?2O?[???1?5Wz?#?'7?ڋ ?(R?;???o???)*hT?(?` lg?5(??( ??SQ?R?Ot???CQ?N?[?M??m??g?P4??8R????e?2??/a>??V?ee!?쾿?=>C?be?L??ܿ?4??P+a?"?pץ,g6?N??&?t?#?B4?.????;2J??{??Vi%q-I"?e(?ue?P???H????$?%??? ???i)?˓??k?7??#??????؏%???\$? ?7N?: ?0V|?+{?X<ܔ1?js??݁??u.?}[DhN?o_?????UAEQEQ???SQ?R?z???SQ?b?ޞ? ??ְ8??+?2?? SO??qDv?-u??g???? r???L$,B}|j???cWN4???_?͓??"Mj?$ NKR [+k??E??a5R?v????=~??=??????Fv?u/1zQ??{??W??}Z Y?u}????O|?L???_?(?hv?yEQ?cQ??(J?tM?spF?WBQ?Ǜȉ?" ?җJ2??C[??V?O7?R6=?? ???K???????v +??rL?g?rKH???!????n??H?ڣ??????>?I夷 uAW'ֹ?\?3?? ??.#??L??}ʗ??????VH??H?m$? 1+W9?Y?IQr ++b?f)??6-v?6?N<](?J??vz???~ZV??r4???ߟ?%??t?K?Z򖴅t?9?{,Sx>? 6?l??>y?ב????? @/?/y'??\SǼ?X???k3?? K?1??H?;)y?x??ޙES??T????Տ??????a?????(??ԅ?OEQJ????N;?(??D???N????s??l_+iG??U????QO?i?????#@?ɕ??ˈ?H?a$?5?`.R{???_?d~/"????8?\wKC۞x?i????eH??ϙ?旅} I??D?&s?biD|??y??1m???[?w?-e??yo??? 7i?F????m???~??`??@??VR? ++0????QEQ??B姢(??K~.&????)?????-ZV;?Ey?I*ͥ?h???l??Ԧy?A3??7?e?T????Nɒ0; ????\?|ۑ?|~_?-?!???I????????3Vʾ ?j[??})???VM?J??5?R-?<+# ++?}2?D褀l?G??p_?o????/?G??;?{????ף,B?NȖ????"?ӥ!?9???n??G???0je??? ++_????o?\?c????U?u?Y'???L ??y??\;?"n??F??Ŧ??Os[??0?ܟ^QEQ??????J?%?Q?O??(݃??TZA????f ???柴????l?Z?>t??-??$?Y???Jޮ$?II?P??_???^G?ǟ?@(??t.????b%?ʢU??K???8?F?sHi???&?c??I??-?b,+?R? ??R?}?~??n??y?&?'?????³n? ???F???S5`?/??"?r???;?? B?Y$!?,l[?????6Yߡ??n>?Io!)??.?2???-??&/c?????@ ?cj޲??`?I?r??沙?u9*????????M???;???릉?~=?0?"sE?2d????|3? ?s??N???\ ++? m??????+?????ӗ???t%???F"/??8???Pj)[????q1???????_????,?9???c?L??>???Y?|??-??<,F??_?ץ?:.?S?Oc???s??????1)ӛ??EQEQ@姢(%??9O?+?@D{)?d???T???'^?d;p@????`lˁ=$K?$f??:۳?i?{f? N9 I??Bu??d??????IKs-CRWg?? ?3??w?????q>"? ??z?????L??%b}?V??Z?~??X??&9-??M?f?N?mf????*???e???D??}?'O{???s???/H???~??Cǥ?23??d?O=%?;?w??(??(J???SQ?RQ??(??D???|??M'????{E?L+?s??x?????7zb?????n??Y"??y)a? ????D?g??z?=p?S?'g?M?`?"?o??>?|??Hyk??g(j? ++L??? ͹?"?n?%?1?X҉?K?????UEQ%7*?E)???O?PQ?7?y??C'Ǵ? ?K??p????????O( ???????????[??B>?i??H??P?X???? ++?b?Of-A?nn??a???ہ?ˠ ++?"4?,.4.//?T??$IM?2%??+?q8??\m????Ho?k?ں????c(??2???U‚2ī?kd????|7?N???&?w????3?½??.???v?? ?] EQ????SQ?RQ??(J)?gG#?????)wr?O?:};ieN?V?/ˁ㛼?e?[vq0?(p?s??y??~$?y ?%l? ?????_?24???z`?7??$Y?pR]?@????0?IK??7 ??,? ?e???w???x?\/??J?K^GHtB?????? ?1|?=q?Ms????(?sv"%v 03??? {?K?A+?????b??I??e??x ++8???U????EQE?Q??(J?h?SQ?v?#????ԧ?????r?8ڳ??,??d??Y D?BJ/& ????>??&?t`|ʴ/L8M??O?6"I΃Ͳl/W[}x9?????.??(+B?? ?j8Ѓ?b/? ++?t!z"??.??BR???(,;ω??*??ֺ???xߞ+(Y?B?????????lC??4GfU??;k?ۑ?}??Au?ӟ?4?>NJ?(??(J"*?E)??????T???B??^?:hW?R?~:]???H?V?c??M???Y587ez?Mdm?l;S????.1????W?3:?I?-8???? "???K?oz??,?R???S&7/?V6??$%9]|?yN$?9.aX???)??Njl~5????^??Z??o??H??#&_?'>???U?SMy?IX????la??W¼E?>?z)+??(???T?T:J~*???< |????z?M@? s?d???8?I:?ɂq ??r??v%#?J???u$ة??@c5?/?G>?ר??َ)3?1???f?PD؎%}?|?@????ғ?P??rE????{_Vz???????vAj?i?3?\???\??t{?6*;? z????ش??"Dҽ??ܴlB???????g?dž ??S?@???f j??&??l?\2f}??ևD?}????(??(J.T~*?R**?Ei V????R?N?it??I??Q?W?,E?vv??T?h_o??H߽]?~%??a2? IDATo???%%=:?????? ????y??0?.????HJ?Z?!B?Z?????? HW???m{??? ++??5!.=???????4,: _?b?? `L?޳?H?s#??,?fn???v$??/px???GR??S?W7??Hr2?Tv?8??5 ????d+?>??_f?$?Ȝ?ga??m ? ?p]I?P???,r~j:?????(J??SQ?RQ??(J۰e?l?E???(ݒ? ++Lhp?????^?Χ?m?+???ȋɝ??^YiPh???[?????/])?_?f-??P?q???8/??l??RV?7??Nd?Xpq??[?>??" ???\n??iӁ ??Vn;?K??XƱj+\?x?????\mp?fFpq????(??(???OEQJE姢(]???U?XM??J;???kӲ[)??R?Jc?I?%H??zY?????=B]?2?[?m?3?|B?i3??>?ulþ?֕?u??l?$`L????h?`?????fHNh?Ğ??? ?@J?^???0/އ?.???? ?$H??{?ݏC??-?????? ?O3??ǝ|????V=???`?~w?ZiHQ?kP??(J???T%w_)i^???R??J???Z???ގ}??????1-^n??'???F?<^B????H??ly?L??s??x?zeVY\h? 1????!??,??2!???e?N?4?8?9y_o??~3??H??Ө.???[~:/?"U??????B??????'?????g?_XQ?`62H)+?EQ??E姢(???SQ??08?\??d???:??i?沇???k*ݰ??? I)??????V?v{ju_ٙ$????????qTo???W?????,a=ѓTEz?Z?)? ͑???|ۛ?0)?&4??$? -x?g#?~?????y-??:!ُ엗d?sZ?$nA??i??f?????Ϳ??!?<g?`?JgaSVEQ?T~*?R**?%?N+?ա?E0?=?T?ɰP??iQ?^l3??m]?l?)iw??i٭?ɞ?cT=?b??Gx?~9??? ????VD2쇔?????[??q??????"? ++??ŵ4S???%E???h'?????H?w?c?U ?o)R?? j?!?.?Rޱg ?' ί???2vD0"?s?ޣ%?Ϫ?????(??(??E??T?TT~*??(A?pލ??N??P6u }??? ++?'???}?{?i??T?X??>?V6-NDD?H?\?Wo"??:?ĺi?zE(?K?B{e(??CX?w] YZ???#??Z?{??a0 Lp(??ۑ?? Ғ??????y?/?Ox?[?2$??.3?q?L?d??n?sy??(??(????????OEQ:?9+??(???%pw#?ە?lg?сJ?$?S??[??Wz?J?C???>?????[?D0 G?U?HBu`>?Q??s??AJ?Y^?2J?Z??P???}?? o4?q_?? ѮTi?u?????f]?S?_ ?@$???i?科r?'X??Z??|?B?y?"?;3??lu?O?&?$?`_??c??(??t*?E)??????NK@)?n?{??7ڽ?nŦww#?/?"???????W??YǬdXh^??x)?Y???y%GϾL??*? B?ꕡ??"???e????u&]?q%i^?XdZ;}Q:En??)ث؅??#?m??ụ? ?=????K???\??y.?8.??B?????ݷ????3Y??s?>??M???~?d ?1????#뜧?(??(?C姢(???SQ?f??kI?,???& ++?Yϼ??l^????? ++???/????:?? ++[??,".[???} ++8 8n??o?1? ??Ē?7:ªQ j?2?}s?7???'c?=?PK? ? ++L7Qک??L????????? ++?40???o?ⳗ??O??~t??K??ϝO}"???I?#?O;?-?(?{6+?????qEQ?cQ??(J???TEQ?d???va? ?o"?X?v P???lӲ?e'????>?? k},3hL?X?# 5????g??m??'??m;??o?~p???+K???????E?X??Q{????L?? %?;_G??#?W?????A?????GG?x^?2????,??c9P?X?hO?2?=6?Y????a ++ps??K(V?ZQEQ0E䧎SEQ?2?\???(?C?u?^????az"?}?91׭'??e?mi?UmX??6??J>?>???6B?hL?????? ?Ϲ??9??:?s?¯þn+???j?w??A??$?H?????|?YV*?M~??2?????yӫ?Q??Z??O*????????;Ka ?2??P???L??????b^V!????&̠)3k????spQ??4Q??Xi?k?&?????FY?????.??v???(??t'??T%M~*??q<?i??Re??n?>{????J7???T?|??ݷ?8??9?_fi?4?? ?O?LW?>l?*n??P?՝????QD??|?-K??hV*?r^?]W)?`·?/????F??g?w?3H??? ?t",G ???z?Y?~?%C?x?b?k?Rn[?u ?)?????H??zp϶m&>ևp??+j??C?d??L????(??d?eoE)???????O?{%8???J??-=4?hgyע?Ң?`RFQ? \??l6#2b)?};?4ח#)???=FlGR?v^/?#???o%???9?I2??P? U?!T?J?ϙ??H?R?????Y?uz???,?}i???0/)^oo????f$?(??1??9^??TEQE?D姢(???SQ????ߕ??>?YX????)???????n??[?b??O?]?~MZ??? ??P?| ??/C?/k?J(??(Jg??SQ?RQ??(???Һ?r?WBɤۅX? P[δt{ҷ??J?v?????N??yD|?R??$??]Dm)̇??(.>?? ?G{D???h?ӏE???Gp?s???????g??[?$?-?k??D??Zk(&\??/݊ħ???? ++L@???Q{L???Q??(??(%??SQ?RQ??(JG1???+??E7K??沛h;O??? ???Ϻټ|?s??G[??$??qk????S?P???o?8?yZ#??m??ͪ? \?????7~\??P?a?w????gۯ?'KP!?P?B???C;?s???ዟ:??RCN??HZt?"?f???˜l??g?(?m?9???ND??d\?Y??y[?Ns??9???|@8J?.??5)??{??8"X?o??????*?Ph^?U?~????b@YfȘ?7?κ??q??Y? ??ϒ|???Wb]???+I?i??O???I?ܲa?-?????u??>??>%I?&2??T*?OIj[?,??t?{B?B:?????.?C?O7???? ?=C?G??H??_Z2D?? @3U??Y;4ST??rB??ŀ3 C?R{ؙ?Nf?k?U??j??y???s/I?4?᧤R~J+???????B+?6???2pl?"rZr??b??s?>gu??b?lj???`???E?{??IC?׀M?A(T?f!???&??yU????um???s??g?y???8`/?f??M???'?3????_e?3??/??I_ħ????H+?y???n[?N?????$I?$???Je?)I ??p? ??I??+t! h??߅ ?nY ͧ?L2?????{??d?ǁ;???Y??$??^?r?? I?3????i???!h?ꖡe~o}?mc}? ?o?-W?!{???N?a??C?Qn$?f>?????Zdc?f-:??=?c??????|x?䄘c????-??wQw???V???e???4]??\??$goH*W]=WH?*e?)?T????P?TkJ?5?._?i??!?Is??=???=?>I?5.]eY?$?,z?9ɉ)?<?????:?`@?Mv2C?3\?????~????Mx?I?$5?᧤R~J+???YU?J`6?q?oW??.?=@҅gP-/?gq?Ǽ ???A?mn???ԝ\??8?Ƈ?s>Ww?E???u?????H?U1??????N?T???C? ֒3?3??ԣR??? ++???h??P??j}/i??s??~??:???Je?)U?M]r}?L?"4?.4???t???U?$aQ??y??"???G?o??yEC???????ٯ΃y"??Y$c??=cm? t?4??|????-DU?/??y?H?.?^??e?<\P?c,?ɭ??u?%O??*??Q??p???k?!I?&ir??e??????8?o??*? ++@??>???"???h??????}??|?z?Qu???p??1????I??7?Q[Axf!ha?7F?_Y?X???I????3??Z ߗm??t?\?IZc??^?>?;?X?x8?ĺ?????p?????.Ӣ?????IZ?β]?BY???c?9???$UŖ????姤???S?fх?p??K?gH?M;??n?y??e??'????Y[?V?Y(?k?|??䜆C$cg~?š?2???I?Cɪ?7"Ȯ,?|?$?????'R?cRW?e?Ku?jS̻ms?M?$i"[~J???????I???t8k???NY?????????N??3?9??y[?y?}(;???.? >1??Y??$?????O????.b\?Ϗ?S??stր/?Hh虨5較$yϺR?I?u?4???????lQU?????o ??~?$I???!DI?4٥4+?h??->৖y[:?j|?.Z4?,??g?H?0?????????tzq???H?[%>W?V?YZ??_-????q??????? ++???nNU?Q!'T?ھ ?_$]?F$??"?b? u??& j?U??5m?hZ=???/+?E?$i?~J??ׁߪh?7ו?.???k????pJE?>??qhG???I2&$?d1t?p%?p???P?\?v\?R|?o?N?wN?qBw?Ýi?uI !ֹ?u???I??x?????e?#?%?pߔ}?Z????F????????|????)S???~??>??=΍_?k?H?$???S?$I?????:g/?f|Mʒ>g g?>c?o? ???|(??pez??t?Hn??ºf?n3/ i?????4 =?!h??(%????+ - ??~?2?q???rZ?.jT????cցh?? ???5??q:?|.?Z?cd??!Iw??8???eٲ?=??NI??![c2vYD?^???(?,??TѸ?ø0f{Ec?ǭc?c? o?>??????????g??? ?????f?F? 9Gy???rfߛ$-wMX?,???????uM [??p?[vVv???;?P?!\?}???v{+I?4???J??u_>??l??M =0')?U??9??3?[ڬ?gV?=?;|??x???a??5??\??i?UV:*?,?M C??椀sR0????-K ???pr??IV?Fzym?|^>??.?h?҅?? ++???塋P?8?L??f???????2???T?A???Sjxu[???F??P?1U?T1????????.??Y?Yu????z ????+?ߒ??|???g]!???1??jz?:ͺ-?w?{#p?BI?$u?᧤R~J:?-???>?Bk??ڟN?Z??i??s??????T?c??=?z???E?*`?)IҢ?|???ټ?פ?M??.?wc'uŸmդ??m?UB??QjC߹5???V? &????????U%?{???wH®???L|?J9?I)w_?A????9ν?E5???-_?s???֓y[??+?x?$? |n??E?_??W?6^?????A2??4?$I#~J?????ˌ?6ICjK???ϗ_???V????.T7??U9???LK?#F??? ?^??}R`?ݖ?f??ؒT???nR C7r???\ScA%1?\????O?y??W?p???.?K???;Ķ?>?B???&? iy?kڂ%?=?0?L?t&??[MY????/??yY?OIS~J? ++???ʺ?[eh??kJ???.??KC??1P??Gt5|M?^??????)??)??4?I ݝ5<ָ??۰?z???1?????$I4O?i???$M?-?#?????B?N???zI?ͯ?U q?Y??|D$-???|G=H?c6??? ?1[?????2???pftN?2??E???~L3?Ϻ??챲?????????u&??????W]??jUO0??9~J?4MӃO0?T=???V??fQ<0?6????>`W??s ???!??u?=?m3?q? .^??x??? 8'9?%t9?]?!??l?? $????????j?}?$?u???$?ӆ?RY+?!?;p-??k??? ++??7?U_N?|g?ޥp.?"pb: ?Nj=?dL???ˇ?G.????f=????8hy?9$???Dr <{??????/j??M????? BZø?C?|cm?vL?q I9槤??S?4???J]6?????<0?????\?3Hr??#n?????l??r??I??f??C???ܖ??O?/]Y3?"y?z3,?0??U|?PE?.3??khxp?.???5??$I+?1?%I??;??I??kQw?& @O%i???6p[?V_??e??o-??mn??????? (??,?^u??>W?'BH?X???4?-?%????4 ֳ?wU??? ??{D׋Z???.??>???38S??Y?ƫ?Nw?mc???%]]?*???"?F?$?,??V?e?S^??|([g?????0??r?????E??[Jtw_S??d?)IR? ?8 ?K ?BO??m?k?4pZ]?T???? ++??|ؙ??@?0????T??Yr???q@???t?#钷????????yK??jzkԼ??g۾???K.]?Z????C??"?????uC????S???ǁ??P??i2?K???8?~VW?%??????= >УNٸ???}?,???WK|?Ɂ???? ++??????S?l??ɿ?????????:?QS??yO" ++?,??3s??n?e??|~ ?X?B??N?:???3???#??a(IRY?]??z8)?c??M?{C ???|?? >2[?ؔ1vvy?????"7??ρߞa?Y??q?| ++?? .Yb5ϧ??l?lp?:I?Ӧ?͸\S??? >C??̳?G???L???>Xg!??$/?OIR????ͼ??????e?y??Hj?=???7??Ƒ?]x??5W#U,??cu?>???E4?O?黂V!5ϐ????G???֣?/??k?????=\p?շ??&?:?Қ??{???????_O???m?? ?*I????A+??9?V??? ?Yr-??????I$I?????}3/k?OI ++??????2|??.?PI[&??ʂ?Y?????)՝lP???•gI?ݕΟZ???)?2t?m?A>?|؄???X?? ??W??X?{???u????xŘ???Az[|?$A&7??0iŹc?ݓeG̷? $??~???"?>{g?wVY???f?}?ή????u????_IR ????;???S?顋?R?????1???uY?9mܬ|?vu~޲.??ag6ߠ????Q???eU?󀛒\??I?;g??+????I??\pFr?????Y`????f-8????u?n?9N֯W??x?p?,j\K?Y?# ??,$???̷?R8M>????n1I/D'N[P???no%Me??R?J??r??+?in&iյ?؍5*??m C_?1 ???V??ǐ?V>̘??H??l?b????70??[?Nj-?FKkQ?(?_????ԗ?O??8m???K??? ?? lu?\?= 6t!?VJ????4???$)$\Hջ?$??%?'?????? 1?N???E?ύ????Y?ϖ\G? ???,????l??b?ٚ????O???Wg(P|???ޫE???????J?$?X?ZM]??? ?%IZ5?????BO[?J????y~?N?$??i?5???ZB1?,????SM^(a??ӿM&?~?$?&L)?˴?%?GuE??Jb?)IZQv{+i*???V?g ++/ƀ?~?"i?vY?B?????ߗ???T?=iuYK?o ?4 F??mw?????X?u???r[X9?ef~?i?k?{??B??e??ǍX???$I?e?)?T???T?IZ1{r?U[??Q? ?0p?:??^???i??z{??ɂ???|0:?:??3B1'???<?????T"???Z??SR? ?%??W??KZ??4%??=?$m{??*?%0?[??(?wa]F?!?f??gxMy?-Z?4feI??&?'??UX?$IR??|??A????? ++??t?k"U* ;?i??1???|?2?jU?4??}?:??RKYM?}?Q???????w???i???u??cn$???{$????H?$5?!`gE?vܩf9=??:Hӕ??*???U?vYK?,????(O??gm?;?Q??1???ՔS???{???>붳??;?? ++?? ++?6???EH????$)????.Bʩ*?,??: f*?)?m?*?F????|>]?P?j?.?????E4\?s?*p8???w???o? K??=1???? P???f?)I ++??SMR???(7???N?=?BQ[??Xx9?}t???k??d???U?(???>w/??eu?߀ϲ?3???OI?s?,iE8??$???.?㞚??? ?cpZ7v?T?i?v?8n($Ah??{+p2?R???r???v???^??GF\.Z??????nҀ??SR? >%??OIRsƖ?Z?g?J?lFm/[? ??*4߫??p?`?T 4 i ZfW????@3oT?M???=?]?*|Bk???Z??3t?T?h?K?f=??﹋????*???@{~xo8??#o???EN?? ++n>??E6?6I???#?5Q?N?O\P???_???$Iz????ͼ???$I?|J?Y# @cl-I%t?.!?|%u\/t?$IZŽ????%iف???? ++?u?}0??i??Un??SM?ă?O.?ZQ??8?#7-?K?$??-?%I??"???n?$-j???w????!??*?Z?lej??e<????~?U_??q??%?3J?0[~J?$u??b%-j?????rSI*[L=?gC[=V6TnC?_I???~J?$??WC ??>?Vk?????IҢ*WQ ??k??O??`?)I?? ++?N????T?|K??? AWד? ??y?f?[e!5x???9??]L??????~8P????c?=%??K?ER3?\R~J?$???sӃ! ??2?!h> -N?-C???E?P1|???f|s???????[?]??? ?(?qJ?U???? ++ם?{?(7_?? ++???-@%u?Z?$I??.?tW?B$??M??ۅˤ?M????L?s??h??????|rC?EF?? ????gU?P???????4? Ǘ?B? *}?%I????S?$i??P?PIu?Иy? ++>G??j?_ ]@@O???$-aG??lCXY?s?/?)??{O'?ޖ???D=?$I-a?)I???v??Y?2pl??$i+?????]wS:???*?"?????]?|*I?InZ??H??=??Y ?ǗZɘ???$?? ?%I??%;X??Yz ?\#JR?= ???9L??0TU????\?]kE?????x??%??$auC?2?c?l?yf???$Ij(?OI?$?????????RW?)????mz?4?z?Q?" 1??8?????!?%l?Ֆ?$?!i% pt?B?+5???I?[R??B Iߚr?Å?{?*D?L????????fYI?ۇ ?=?? ????0_ N??b??t?s??_??n?׆??n??V?M>????$I??c?OIRx?r?[ ?Cԑ??,2p????S ?[?????:??S?$I????Rsda??*Tj?|?????-????????,7z??#IE???b???????I??A[?y.`|??UB?$|??*?eO3>?????-o~7??ޱ?%?)?TRk~J??????3#n???B$IZQ?T??b ???f?????~Fz???iϦ?}??i?4F??U?j??n?m???yB???2??$?????7?B???u^M?sA???M????_??[Dd??g&,???[???d?C??x4?f??????tzڄ??[v?-???E?Rw+?????T7[~Jj???H?T?????.B?$ms?L>}{?rS?ӿ?/?Ϸ??zj?? \ ?B?>?I??????e[?xtg˩?? ?k??YW???? ++?V??z׷?T+[~Jj)w?%I??ԃ?o?&IR?????M;?i??W???-X?w???R:=????>?!`g:??l>??Oh?sx?\?"$?4?_$????$I ++?Q?T????.bN???,???袿???k?/?b+?d??O?YI???`\???S?顋?? ?????V??ERk~J??p?8?$եm??$o/L?c?6???4??h?b????%k?????_N0Y?Y???I?˓B I?|o??p???$)?OIR?;?gV?j????,??:oM????b?p|??+?o?s??#??ЅHZi??Z??S?$I??I? >#???L????,?????? ]?$IR???BR?š X7?.@*Q\?J????$I?T?OI?恠?]??9? ]?*???uD???$?z???/?.@????n?? ?????%????$?=k?????,;hkPI?lP??x?"$IK???EH?l#?5 ?%I????g???>???0Ϳ? D%u??t?????tzv??hA????????T?g?????$Ij?OIR????޴??l??]etw;??0_<`?DI]?#?f-?#T!?٭??߭???Q??IMפ}???????? ?$IZa???????#_????n?U ???GҪX??)?? ++??? ++???.?h?????.nC$?.G??@k? ?$5LS~?K??j??]O/???M?N????no? \[?z$)??H???S??|1?LK?T?Aa?>?6??f???E??W^ o??? ++???: >%IҊ0??$5?s?DفF8J??b?Yl:j???S?r??۲}?/?N?+?Og?Y?$??ocI ☟???9???*$?M??:Ɖ??˷ ??? t? }.?J?10???#??u???+????v??9?=a?OI??m ?%??s.??J????@?*??????VE1-???˙?)?4???)?tg:???5????l>?>88?c?x_??A??b??v???˻O*?n~?Hj?OI?T??BP?IZU?Z?f???:??-!? #?{y??f???Gx??M_Dz]??.?O??G??Ӟ?I????~$I?r?-?! ?%IR}???S??^ ]?j??:?BP? ++C??????sތ???S?? ?]o?? ++??P?:bGn?p?*?0???ڻG\??5?????t?{N?????V?????њIV1??#?v8 IMg?)) w?%I?pM?4Ҫ?6?????1?F?K????xτ.?a?ah|;tZ?{G\???????o?~?????'$c?y???IH?$?e?)I??4????Z???????|??{~?7?.@K?P?4?|??o?m?I?ߓ?#7??ۅ˞$???NI ++??S?$??b????3???Y??1O(,c*=?????????s;%)?OI??.???C?0T??{9??/36????@????q?1??ЅH?$5???$iv\Y]????C'????j?o?.@?vl??o?ؤj[Ԭ????.B??p0t?V???$iv\Y]???R AWQM???????? ++]?$?V?e?$iI?B iU~J?$???0????s??C????uN???5?e_?sK?B?$?? ?%I?$I??????+z? +Z?({j|,???f?o???Q?Ke"I??mk? ?$I ?4pZ?"$I????????籇#?㼵??V??tc???B?21['ZH?$i,?OI?$I??,??87? C??2???????b??j?e?)~?y???K?O?$?? ?%I?$?+.1q?z??z,3??4??g;-???8;w??%?'I??a???$I??J?ah>5???%?_WW??V???$I?? ?%I?$iU??ǽx҂+?4?G???T?G?+?]?J?$?(?OI???^?4?'%I???]?i?a?j?\u?>w??u??֞?$I 1???:??U?(\?=)I?R??.@Z!??i?6??jV??6???$I?? ?%IZ%ǥ?6y"??????$7͏w?h?Z?y-?/??ۼ??G3t :?I??v0??$i??A/Ig\?pO?U??Q?E?c???4????5? -"?}?e|,?k?????`UH?? ???? ?%I?$)3.PxG?U??Q?EcS???s???.@j)????? ?%I?$I?Qf??;J\??????\?I???1??$?i?1??$??֡?/qߧJ?B?n?????[>?N:?}?UR?O?.@?$?} ?%Ij?hļ?$Ij?Ӂ??.B?Qܗ??o7??F?rL??????H??Z?--I+?]>I???T??g?{????????qۍ?#K????I???V?V???$Im?7I?Ψ???$w0_w????????t?v???$I?T+?OI?$I?֟??r??nS?rN?4?l????UH?$????$I?4J??Z?$?ΏB )?l??ɠU,?@?$?A? ]??&3??$I??Y??Ԗ?չ4t??{Ij?l????5???%I?V???$I]?zI?$i˨????\É%????!I??q???$I?$i?O ++???Q????lT?ˏ?\C???^?:$I?:??S?$I???*???U???X?N?(L??IMR ǵ????Br????ƒ?#I]?@?R???$I??ݡ P#??? 2S?\?:K*[1h?Ƙ?.??? ++\?Ij(???2???Ey6??l?I?6????????????ԏ?Y?Fw??/?.@?$?y ?%iQ?M?6s@???Lܿ?^???u? Q??R̺M?%n=X?|l?*$??<9DZi??$i?m?????$?[`????w????ӷ?ER??Y??+?o???m???A??????i?~J????F?g?ù????*?H???I-04??B ??p?殻xg:Ѿ??? ?:???I?H???$i?c?v??b?ju?HR???. g7I??????4?Y?|5??I??-???X???$I?; ??N?????殓?69!t?G??=?6I??b?~?H??(?$I ++??$?|G???*?`͵HRW?f{j?PI:??d?)I????S?$??N?M???@?????´8_???$?Hqa妆??k?s?.B?$?? ?%I????1??,\Fn??´8?yb̴ m9ب?^]?$?H??f????0U?Uq??7*X?$IR?~J?$??3?/2?Yc?Y?? ??_Bj?cs?u????????j?Y 4?????e?????GKZ?$IR?~J?$i9Yzv:}?p{???עf?rx?K???????eZp??SE?{??A??$Ij,?OI?$???)??d?5?????[?.?p ?Pw?????bP??$ie??IE???$I?[?H??dG??Hœ???5???/?/~_IZi'?.@R???$I?$I??œ??ݚ=?S?$??S??J??$I?$I?$???S??*??$I?$I?$???S?$I??~?I?$I??OI??`w??$i???.@R'|3t?$I?b?)IR??V?VϏB IZ)? ???B?$?q ?%I?$? ??.@??R"?@??Ƃ?y??Z$I???S?$I?$Ij????q????u???H?$5???$I?$I??&јyI?$~J?$IR????H?$I??r~J?$IR?l?#I?$IRm ?%I?$i??a?U^?$I?$I??S?$I????????*$I?$I???$I?$IR?8??$I?X???$I?$IR?8??$I?X???$????H?$I:??!%I]?t??v3??$i^dž.@?$I???r?$I?:-tR?~J?$I?$IMv|?$I????S??"?˒$?w?.@?$I??j ?%I*?rwY?$???tj*?l???xs?UH?$?? ?%I?`?$I??˧/"Iwf\0f??~???$I??*???$??+t?$I??ؽ>?????r???$IR+~J?$I?$??f????J?k?n~%I?V???$???XI?$IE?N?2kK?w????*y}????7$I?&2???Ж??I?{5t?$I?Nh?Ks?? Vő|oH?$Md?)??? ]@@???ѡ ?$I?Tt?`?o?r??s.??v??????|%I?*`?)??????Q/b?pL?mF?DD?>D?6c?8??M?Ӌ?llBmě??!?#??Q?f3???C??֢!q?=?D??8?????^??\?!??Dk}67?AD???1?L???0&^??; qܧ???&C"?Z?x?~1?A4?Y??c????~??? ???f?I?}"?(b??It??M???9??zi]@??#?{Ћ???x3&? ?"z?MF??>Í???O^?(y?^/"?^"z?k@R#qDC?56؄??(?? I??#???gx(f?ׇhȰ c?>???܄??56N^?h-y?z1l? ?C?kq?Go1 ?D=2$?`???E???{Cb?^?:'u{?րᐨף?,G??????? &????D1q?1?^??@??ސ{??9?7$??d?4????p??r?llGl?W???t??Ϳ?????a?]???dmGLGlc?x???????O????w????????'?r`?????9 ??J?3È??????[?????J?*?Fv?ٌ?D????Atl???????mZ??|??_??_>?͍???G%??a?k?????0?^?+??? ++?^??????Wv??s?s?w???\7???>r??ᗎb?Σ8??]l?cv??;??z?A??cHD??%۹~L?1??????w?!l ?$???9???1?~?f?O????k?~???=??qDԏ???%???E?矴?8??~??l[;?'?ߵ ?c6o?c?6???l7{?v???c?ɓ0????????8???|????˳e?q???\??{??h4?I@??_?9l?#?p(??3?=???=?HY?p?I?$eB$??% ??]U???2=?2?޷?)O???v??[????zd~?}?? ?c?Ob2?tc?,3?_sc>L???9?=??#IN^?ٓ??0???)?2C?????3???3?A>. ++8gb7^~?0b?] '4?ƹ| ??a?L?(??[9B`???5?A0 ?F?/?Z?O??Dlx$vI??|??d?|? ?????km??S??'?6??H???i?????)??e>H|s??~??7ȁ??{ͫ??Yc? r?D?$?ȑ????+2?p?  ḵS8|"????6?y????/?X:nzP???i ???ll??˄?#H?Z??gB??K5F?~??p<?IX???J -*^̀?b??>???????? -d7'?DP??)l?3?C??i?.7b?E; ++??ݵI??I۱??@?|???ߞ? ???l(???????s??;l???T,?s'Ә??n??O?xG?=?&96, s??HfaXRx?݅?g`.h?"????…;??G\'6??0???m$?]?af?}??$d???a?7`,d?cOҽ???;:?4??`F??qa?7O`???Vv>?i???l?ՄǬ????ᬉ? fh.??e?sg?????[߽?/?﯒Ϯ0???|1?L?;???W???۸0y?{??_?K_???sݓ?k??>?? vw???}#vw?i?????T\d??5)?$B??"?M?D9?g??)?o!??????i?1g??&?R>????\????Mo????????\??uK?? ++? ++??0??LfID?s?;?p5??q?𶨄???#??????m?f?Ρ)Ý?????R?I?~ ++9´ G}o?"?? c2?9????*>?.?%?*????ڲ???kf????z6??+ rs/nL~M??? )?c?О+d?k???q?5?G????????B??Y??ĭ??l?W???;?XD???&~??+lw a)??'VM??>??pT=?{᳔?l?,P???m.q?#1??M Ls????q??j?Lٳ?¼??s6d,??jq?ix?n5??N??w????`za??.ƜF?ć3]w?????E?W?Y?J?xa%???ݸ??eWH?tq???o?o?v6sf?>???????_???8??????????ԯ??a ??3 63?Dz??s? ?)?0 y??`>?8?4??E?8D2??Y?zg??v@ޛ?z l?̈? ?%?P?r?S????3 ? _?qmnXʩ?1?N?(???? ++?:???ŶbV?@?5?9 ~M?5?|pW????+Є?Y??? ??? 졈???x???? ?!????(???+p9w?g?E_??????͊?,?W?s?y/1?ZI???h??%|%??ݜx??(ǃ@{d5`:9??w?]?K??????J?Q?3%??c????@????)-?a??*?5?χ?2Ȩ?$??A? ?kY????????i؈ ++? `??;??ZL-H?&?%LC???,???F?8??K`??Y?d? Ok S??.Ṙ???3????z???N?#8?1??lR`?ȁ??A?`?>?"?,?pO`?S†WPJ?P ?? ?^{??9?"?Lb?1????? ?&?{?-˩??{???? ?k?3|?y\?^??+ ??k0S?v&؃c5?-x???9v3?? ?Z? R????0?Qv)J(?I?$??0???3?Ix??&????*?>??z?$?D????:????;]?sٞ??a????9??G|n{??ߐ{2?/e7#?????#?? ?Kc?{?׵7????؞p??챋?????O?????' 3??p1??J????-???G?g???)?yz???4????????`j??y??????|??y+&?7?[???????? IDATW?'? ??,?i0vx????/? ?b?q?6 ???????????~?_???峟?????????????'??w??d>?%`?]?1?lJ@?K??u???yH\ݶ d??ˍaV?Ӏ]V۔,b%^??c??̀͋+?0??d??Mw?ˇ?S??????Sv? ?v%7?ɗm??oU?Z?ifC???H?JdrD?z?{D?E???S???E?c???S? ??sQ??WB?5qb?+???E“?Z?}3????]?Fd????~U$??)7?? ??^??? ?|:?uβ!)[c"?fLF#?~t"^"???b{???5??#??? Y?C{;*???R#ΜW.?d??ȼ2"?!1????w??u????Œ?? (?n#?[j?}!?X?\c!|??? ??J ?9e????3} ??HP?߹j "&{??On?w????????…??q??]F??????r??,L????d?d&???w??o?o???گ?o߾??? r@ ++?E??(v??zJ????Ja?$_h?E??oJ??kŒW?v??%??q?Ox?????????G?u ++???????O?R???놧3]???T­? J??¾??ً?@{W???~olv??I{?a?!f":l?? ??ˆ???q?$B??Z?"D?|栘z????}?xς? ?Q??Њ?g p?l?V?{bJzm1j??AT??9q?8+?P??b]?^NO`l??Ȭqo;?????(7ܓ4%???Jf???91?$??#`?u_????Il˚#/?Sv????a?+???%??H??sTBaj\?*???(w??ڜ?mӺ7???R??6?????N???e q?O"?????7???g??S?????????\?7?z????Mq??S?4???ğ~?x????? ???{~???ē???}b?q?F?{Hgەq-l9?&?Q?Ba >??Ҹ{?EYG?[Z????????l6$??????v??__???ק~m???x????{?*b?Z??>???#?f?Wfm6?~/?ބ~?ךhê?T?????????[p???){nU?F&?/????f3?^???o??}T???? ?{??? c3lָY?1????iU%V?Y~??????t??ϼ????????98_??t<??*?r_??n?l???????͓ ??~??]?TX?p|K^>??f^????ϴߧ???b??]??6?????>s?????????9???????'7????.?V? ý?(?/!G?%?K?ܯ\?A? ??d?N?-?E?km?˦WE?????P?!?A ??9|l?J?j?#=ٶ?,3ؗ}??&1]?*T&?ީ???S0[%ڦ?J&?L??>???u????d.??4?????/bCR??㓌??O'O???q????.Gv?@wh@???c(?q??+?? Q Q????,?JhI?G?Y??وI%??L?m?*???W?dR9??"??1."?mW? ??)V5S?0?Ƌ?p[?ID?:a+y??@ʘ+`?j?Ȕ?7?-?L??~?/q&?hc l'Zœ?M%,?)NN?UǁZS?E?c/? ??6%????+??O?p?6uT??J>_7?????-?????q?V????t??Z%?d??????5>Y ?\{??zߧ?? ++U???ğ?O;n?c?a^??[%???? T??k???D?l?w?"?sk\?h.???5?p??)??ˮ??l?y? /4V??έx?????98??J?==G??%???%V????@U????՜???eų??{t?,????J ++0S'?r%?3??Ӊ?@~̚???kL??Y?????)O?;?*???`???^??!$,?8<֜f̅;?Q???U [?Uݣ\v??4n?{??׋??????(??sd?g?a????g??[?Q?=?P??z????%"CM':?O????s???}?=S???{õ_|5??(????T? B?]8?6l_&\?g?? 1ߢ*؂?Q?L?A???+g[???~$+9?֛?kr??&7$Zh? SUl op`??C?g?? p?j#??q?}??????w?񘔫?y?i({ ?$%&Yc??d??8?Dkݡ???Tu;?ቍQ-֢?E??[???d0??sQW?P?Y%?K?R?????UK??Ÿ(??D?Q??N8??d؎e??&kN?҉j??JPbU???r\?R-s%G?W–?zF;?3F?1v???؎??o??f?J?&?yıǘŲ?}?5H??;~??w????S??8???*Ţ??M??|d??@%žD;`*p??d ???<=& ??? ?x~7?p????\~?ja??񵗲?S??>fV ++ǝ?????_?D???ݖ????P?@Խ???U?g???d ?=??l??????j??׀? ???5??sCz??};????'[w??Zۏ?=O??I{a?7?N?? R?#?"Ns?e??cx?~?s???+??'0*ab^̝???ܻ??????<}??'7??????+_??l??? ++fy??;????7????'??????????W????'w? ?????W~?nޚ??ܿ???? ?K????????0,?YG???}??H????|?????????????z}??>?k??6??٤???3U{?x?^? ^?23WՑ???;???k??E"?*(N?T ?}???KH???˪jO;?ҪU?q?? ++??j1G?9j?k? ??~?c??֟Z?8?XU?v????!?m??j;???Y?్???&???R???.)??DV??ӓ?ɾ????%??9q?????\?CD??/??ѻ?4x0|??j?b#? ???Uu??\c?G0?-?Q?EF?Y4?V????=?\3???ÌkvrRͅ?7(9r?U???'/J?q???k????ύ???N?π??j\????ו?}1[ o????dN(?y7?$R?T??]91?*?4?MFꌤ?(s?P%???$LG%d??Wq?y???FVb?j;V?W?A????um???,??8?W?SV6?^;??Q?D?W۱7??jS9????q4???޺C?Z)̣p?X+ >.mߴ?2??P?1.?PрqT?,?mX%ծ??Lu?m???NG?D?urwwÇ????o?????_? ??'o???eᴁ3??h%iN?j̝q??[?D:???=?[?Ȁ?p????M~?~?????W??/?????7?????`?P?i}??W+?,?3???j?OUy?q?~?W\g}??D?9]? !1?[?ΊkVrY?j'm?-?????wF?O?W???X???sG?P???>}?'Ż-2mد6X??+??=V??'}?/%???ĝS?p ??m>|ؾ??+i????:+35`g??A???ٱ4???{}һ??iŵ????p??vT???Y?pV??h8????$???2s??J^8D?5w?ck??H ]T=xu%A???]??n?? G.??b@?q???xG k?:???^q?s^?jk?k?????t?G?_?Z?>?lu?9?????{?9???8?`??b???!?D?s,?#?5??????:v???;???Ga?y???3?U????W ??Tg???????~???ė??\x? ?????????????Z?'??}?5F??.bKg?=???(?s??~????Z?|}??^_??5o?f??:dt8E,g?l?рǔ??+Q Ƭ??$t?J?bQ[J??????Q????u.OF??]?%?LF?̪?RV?*???.????0?%Z1Um?W2????????pC???3?T9??0'?{-???8????R)?^ n0??[urhd??EJT????H??!??? ++#??? "Z?l?ge?-Q??????;A????gf??U????zmak8'ᴄ3?]>֙?jyC IDAT??}?*D?(塪?LUCE?v?2??Ұ* lR瘺#X-bF??z?"(V?l?????y?N0? p?W*????6Nj=gr?????M?a?H?̬?rL?A??`???q?9?%I0Rfq?=w,4]5?B? ??Te?d??????`^?s?솽??VB????_y??g???7???????ŋ??aj???aZ'+???;g?<\??f"a?|x?2.?y}?߮??Õ??+??Ͽ?g??E>?_??G/?Y?W?nض?~ ?'?f?ש2?L,.̙<}v?G/ﹻ(??????'???????Fr%l?????`>l?_'?????0?`??????]ק??~?2??}?9:-:]?Zš?.????U?g%?tU?LҪQd?3??????? ++&?W???~G?????8????$???n??Q?=?D.F??`۶???"?΢?Y????D? =?8? ?*/???V?%YE?Y?nS?P??f??"$\?????%x?t???!???2&3ux??If |?{?C???ΒїtK???ư*?o?q+[???L?jH+?i?t??o?J??Os?? ++??t?fI??E?M???Rq????xT???N???L?A?Z+??,,w? -f?B5?????d?? ?c?R???o??B?D>0f??rҁ???G?֗?z?2Nϱ?? ?]٘V???H???m??T???~)!8?a"??P?iX??4?_c?+EWLF?v???$??/?3?º?s????wJ?$????8???6??C?'???(?????}h?b??k???/a????A?g'?i\#?*٪M?i͝??8Sm?s -??y?????p-uą??X?1????!?,b?T1elj?? ++??ɩz?2??eV?e?;o????'m!????J2hK??r?Ԕ=LzVKsݯ?7O?y?????%???ٛO?}?????????????#?P?U`7;sVrWʖo?\b#?MgY?s/?t??)Q?b޿}??;?? ??}?/?~?y?¦?b????fݙ??N"}K? ? s?1v?b???Z?'??v6K?L???@?)?1v?d?dl?????w[{o??̮??}Q~ɪ^j?J:Qqacl???*???z?[?Z??;jI?˕H?$6S1??0FU?j??oy?T6???q?_ouQcj=X_?|d?KC%4??*ia\|%?cj%}??D?O/?lV,8VrЫ?ѫ???R6?{??8'??g?7?./?J??d/??ߠ????a????N?x)Lz:;V?????x"O/?x????c?꼼???w^?{?V???{?$?M???n????|?????3^???&c??*Wv1???>Wua?N??5?*Φ?k5?.Lg|8W'?u?????????W?{^Z?UA?????7?T????tZ?V?W>z!?3?? ??_5no?;s????[???׏???|?s/_?r??)????/???o??>̗;?L??ŝ??[??X?t??a{?]Ž??q]??????????_??΀+?3s??L?-?? ++?cS;??? Db??,??B???)?ʲ?J'I*?dC?D?)?+3??;,?R???s!m?k?6-E?G ?0X?^O?1?N?=1+??Y]?ю??&??į$???qK?@?? ?,X??H??8B?m<3YgZ??<&,???!???i=T?P???>?l? ?z?i??*?Ѱ?8? e?z?a?S?G ??k R?AR? ܍y??,????n?P?A?q@??-~+c?* ?1??%?Q?b???Z@?[yˋ??????G????_?n??,ı?NV?38?S??A?{?l?[??`k??DF?}FRf??9?~/??Ѻꅨ???fUՑ?Yh?Ԓ??m????[Ut??'E???Q????gU d ?ETf?zQп?v?5???l???B??|K??NAqTA?7?KX?ɺ?V?g??=?6??a?F??%???hU?[?n??T???j?W??1P??-?؈Μ.׉??kAZ??1?2?Ev????-/~?? l?? ++?'y?u?g޺a??\??O???ʯ? ???????+_??E??Q6t?????g??P??=?c#V#?]??B?9a??˗??|??ݐ?l?\?????'????re??d????=? ????L.O.??d^w?0????vw?u??i???ü??????}??q??c??_'?>?鷽????٘^I$V?E????Y?+?._R???_̴?V???x?<|?Ů???EqU??)?|?S/V%^!!vd???5mɨ6HJ??j(????Ё??r?jd$?f????C"c?*???vٝE?U?D?ڲY?!L56??^?^Ʋ}??? ++?_?Ш ++QSYը9????J?a2R?C?ʈT H?S?)L??T:(???slj7????$??G9ٗ&{?*??5?P-??Fef?d???y?=????\?jOE`????K?????7??yM??[?^n.ďB??I???¡N??rq3?%??U?s&????O??_?!_y?M~????????>????]? ?????`??>?ajn=????9'#*n1?(?|d??J&?Jp{H ?^UM?B?????[6??Vڠ??`u? j?j։?ef?cJ?(Z6?[?WR????މժ?? ?F? ++??p???Ծ?'????: ?u??T?!??I?znK?ҁ??Z?[A?J??y?-^;???t?n??Y?? ???]c?+x'???9??N~+???l??&jܗ??f?D???q??n???Gܑe`??????8l% ???????cak??+??xa??P?mnĮD?^'???[c?g?3??WqX??=K.?p?#?W??6?Y^?q?߯?????3??U?u??N??6Ϥp?c??H>????,?/??/>?΀=?sP~?l???}aY??K6???hv? ??C?v?ѺW?`;??|ߥ?z???cW??N??p?c?뢱A????#ss?S/N?? ??yu?;???a|?9?y?$??????k?Q?S?K?????Դ-Q???L???}+???7?22>?[?!|?Q?????{+?y?t[|?;?)??d?]*?̳?dqD?\w ??? ???ep}1?Q<????W???'oܱ͝???w??????v?????[c????{???/??_b??|?H???%?????6?x??x?????{??__???ק~mT??$*kT9?WeZ.aa'ֹ2":??U1Y?Sg????jc??Y???????2ڋ p_?կE ?? ++vT?.,??b??h?|T0?z??De"?Ph@?θ?Vu?i?$?ͥ ?jSY?F?+??cB????}?V??????%h?U???Y]5N~?? ++??PJ?f??j v?x? ?}=?S??[T?@unQ C????~? ++J??_V???a??!??5P缦?Vc??A?????ɐ-?7?77?=?Đ???+7Ù????[??U??/?1??]??3,?(ٳ?(*h^?`??}?{????׏?-??s???5???ۍ~????}?˳A?c???l?9??????v?1 Y ?9?????%?g?iĬ??Y????I] ???B%?Qg?_k,????^|?G?????_??2?]???????vpJ?? ??J?S?yc?????=N-???kUb???¡???#U7gH?^?>????v?Z?e??? ?c93?sr݃m+?8?c?YU?k???w5???;?[vܷ:?~#???N??*?z %??;>?CT??i??h?n???-?Dl??;??UAD?v??+β?V(??? -????????lK>?:z???*O1???????=Ǭ??C??????[??N?>sz???c?g???'T?DzWk?^?$??|?Ǧ??<~?[??Ͼ??񱶪?{?*???Wk??????q????z??JhR[?EJh?????hY???S ю?3fJ?鱰J??4?t5?G'ث"\?SO??y????*??,?~^??2N??-@?0?????k?x??|̹??; [W?(?????C???y?*?z/[u?Gョf?????u?????_????i-b?l?x????7?????^?W??R??wg?W?/!=?@?Q̢????%fk?إ1?1??gɲ']$s???^?.|??g????N?:y%?"+?uxd߬?L%uer$??x)???|??X??????۝???'̇????9??[?????/??9??K?????G?+?DC'???b?'??-?|l^?????????????/???pf ?aWv??Ƚ???H??k???"F? ++(??c+???rj}?r࣪7Mg? ++?Lh?Yg??J??n????V?|-X|]e&/???S??M??Vى ++?;?S>?K?HT????g+??9`h????ԏ?sv??7E?ɑ[?L;D??ѩ }??x;??X?ߊ7*#(ER?lElum1hd&??s?????DRK??.?[k?'*8?@'Ls??j?)o?ÙU??tLݖQ?,Y???>-r?*?jƚ U??,? c6???nV?F??QQ?=??kM%`3D??/0?A?Ar?????$TA?z?탪?(&??ZyNs?\???'? ++?"??dXf?Y???nt???q)?-?N9??/???}$??%?yy?M?}9%f??:?Ɋ??WR?m?,Su?Wk?Ym{????A?u?X???M?i????\9?>{S\??!2K?R`?{ʰU???jѓ"?T?(3+01?!?+????'???vl?e;|U6;f;Xzڪ`?/?G뾲q??1??[yf?HU??3G??Ӛ?l8W??1??oo?.F?????!??^?zc۰H??[?Ͽ?S??ɛ??? ++dQ?O ?uXo?뜱x ?????K???gˮk?sY??N??*?a????n???e'?DY?-[??'}v???%?d??)????Yk3?FUOU?ܵ???au|MTܟ䞰?x? ?????s?˧lT%???t6?i??I?1?V?Z???4?Nw5?"?3??r????7??vӑ`|󲭬?X?P?jlxH?`?&K;? R????ں?*?#???1?-I??fTr??es????#`???{?I?ɽ??v/???9?'?H /??pJ?j?Ԯv?r??df?ċ???-6?d???=}u!? S%?Җ#?>?7G?BoAU???K??J????(?3?O??l?b?1W??=?l??z?q?GA WJ@ ??P+P?(? PI ++?.??[;?9??_ƒe?E?V??#"??mY??t?") x??;??_? nn6?=??yS5??????\?+_????G/x?љZ??ˏW??? <\?f???`?X?,???!?2? ++d?>d?n??}:???γ/?'??}?r?:????"_|?s?^????-K~???JF??9L?z??E\?n?1??(7%%f?q???(n?5?rE?]?^??] ?YϕHUs??.??V?j??? g?)?06? ?1?"Cmy3?0?v,6a??>?r#?V?? ?????Uѥ??Z?.L????w?.P?e???jV??9?]?`TG???&?9?)??}T~??Y;?`?>s??-&??G?LU????Q ???r>2d?9t?M?,4N??h7?oS^}?O???6?f??f?~???dOُ|t_???ج??1vX???>?????-Q?&\c ???}???z>~?~ ?سX??Q??NX?;??v??9????R*A?|.?#A?mm] c??@oĞJ?????U5?c<9?ZPﵽ,??????l'G/Ռ?Q??U}?=???u??r?0?m?;?#~֜?????????c>??4Ok?|????WaNNkH?????{?+su??Wƭ??2????Y???vH??????R??Q?щo?í1?Q?չaVV% @q???V+??g#!???*>?˟???c?;!???????e??U?{???;?1N??3G?nN?Lj?CnFރm??k?]????*.>QZ???5]??f?&??????????8?????Ͼ?/??O???U?k?ufu~l??0??ck???z-~??^_??O??vrn??+u?U?Pv????*????y2?](???up??V"Լ?].j???? ??®s?ƹ]?"??|?vz?? b?]8b߫?B0c??????ELe?]?`?d?v1 b8Tƻb?S?@?m ? H :k??ʬ&"??Z4Rg??0?*?zD??? ++Ce'??]Ǿ??v?A?9?J?>?????޻6[?e?Acε???ffe=??Vɲ$, ??-?,?|2????_?#?0BB?eK?BV?[ ++Y?ƭn??zuUf????????s?}n&?PW wGvV?{???? IDAT??k???c?9f ?dF??()̪ P??UUa?c}??f?:b? ?[1 _~?ʾ? |}?(K?;6snF??]???b2w???0?`?P?R??k:?c???S??V?O???={?sίT0?????q?????? ??Pְ??v???p?1??W???%?r?s?c vc?k ++?{ eC?F'E\?a??2?)?Z??}??,s{(??ynI??????U?tJ?֤"??_?wL?Q??N?z2?mw?2?5R??ow6?? ????K?J,?{@`g?ӻ?T?/,س??? hT=hd?j}x(+??&Q|>?8v??"?`X3?z:????kP?o???PjVj???%?/6??????G?-1?7??0z?????o}?;?6ps????"a?qo?-? ˚r??]G;9ƒ[4!?I?0????×?/??!??>????I?HtXk_`?J???jw?)X%ٲ?8k?j?t[?????G?Mm T?{i!?u?9X?'?#)g?I>P?M?5)%;?6dP?Ҳ???7?V??$?_ :?"?8 ۉ?[?.?x????J8?q??J?(PDd1?A|??}7?ƾi?0???gKS ?????Zҵ?uC*@??d??? ?6l?D4?ѹQ'??U?Tl?????&3?Yl???g??_f?E]E??V???????ޗ?Z???J?u??????n??SɅ?,??ϙ/??({9?%?X? ;hu???????:!?̿?[?m*"vf9`????Z????%Cs?8?m?3???U??\??U6}X? ?[?u?`?9?9?>V??9???Zs??MuŘ?a?? ??7e??E?L?p?G?{D????tk???@x????0?c?V?º??????^?eU<Þ?ڮE?R_??@?9?ʪ??e`?+?u?R,??8?3????????1 ???"_f???q5??F^???]+쳆??鴠??`x?Vgm?yH?????@F?Z?m$?|???Iv??_???"4????eI?E???o??7?g??7p???:?>!1p??#?c9%b??3_7܍?n????IfT?Y` w?t?[??Պ?btd?"r_d??I??#}?ţ?Z??B??????k?~?????/?(?>?(?;?'???J?ry9??Y\?~?`?S?f??R?:? ?l3S9??3?Y?UÆHΘsɲ??f???9v?і6?p???1x?lk??6???dc:?F?d?-v&']??ڢC? ?#??B??$?֙I??K?_??p#c???:???? ??̇??ÙVg??ǡQ???!x r?ȹ??I?u?0*X???!??.±?\?}?s??u?a??:??w?????BJA??ʃ?????Ƭ??R??N?Ҿ?? ?Lr??}???>??z?>ڤfe?\??U?????x?|F?԰M{?h??T??1??/k??ܧ1?m?@?lWŽ?Y~?|5ڞ哦?*hE"??}b????"km??y?r?k??? ??A?i?c.?~"????? u$b??E???j_??_U?ۊ??d??C???K?l??'U??(?&k???<\?M?m? ???I??8H??)k:e?j???Xk?8r?0앃?s?u??"???<\?{?? [?5s,?U??A?^!????? ????w????????_ķ????????o?G? >?=Ӧ?I"qz?pk???{}? ++~??^]???? ++[???`????s??s??A?w(?O@??ްi??%?Y٣?D??c????RR?6$???1Y\9A=?!3 d? ++_??W?+?? ??$j.??Vf[6ɺdC????M&u??R?4˚???t?ͱg?^? ++:?? ???G?cr??wËF?j??1???X??#?)6?S?AybX???-a?N/?r???Ы??ɹ?=??R \9B?ϼƨ??P?WF?(??K?s??jg? Qgd?UpT?R9?B,?=?9?̿????J`???@ճM?$T?!?^???r??C?g8 ?0@?3c?2?X?oȹ3?Q??? P?]I4?~+?:>??????.?^?s?????7l?c??6%N??I./??l?`??!???T`?NK??E?wL@i?ظ???"? ?lP"S??`? ???V6G6? ,?l3֟?Z?;?W??Y???!?ta?X????`>0?`?????F??o??_|????rAܟ???ey:??w??\??? ??3?.W????kob?Y?????7y?r |?????j;??x?֮????L?p??Ѱ?q?|?Z?}?]??W?g??}???W,???=?????7??????????K'??>`v???q??????[tl??_@.}??7?????j3?O N ??????????~??z??Q??????h?p??e`?{}-~C??@V??L ks?pT茍X?h??s??kբN W?hX??3?5T+?`??(?4P???L ۊ?j}??n%í?M?????TH??yQB???=\?O?q??.?{3?x$?d"E?p?M?73?4V?Ru}???LU?? ++$2???`Kd?\^??5?}$Rq?&< C?Sq ٧?0AI?`?',$6??$??-s?푕??@??t???(I?*?ԾL0?????1It??*SPjnmϐ??%j?????s?D(ih?gF ???l`?v??/?g?38#/?????(y?L??:۹P}?B ????&?4?L??sx????????v???)??l-??58fR? ?5X????k ?*`??d?)?3Θ?h":Xc`?t6 r% ++??-1`?I?sٴ ?? ++?w`?~Ce?Y3???? ?.?'G??K?da]?S? -?ҽ"?t? [4G-y?b??5C?1AX3I?E`?gC?!h? ?#?|?)ʾp d(c?L(b??J???yH?? 1 KKt???K[1??2?h?^7?`???]cԚ??h?{ ++?LGZh?u?n]?0??2?`???? (Dr?dF??B{ުn??}p?~?o????w?y?%?W0;8?????`'?? ++/??.??D{d?qFK??[?????J??p ΆX??p ?ֆ??%?V_pw[r3?'?z?1+Ә??h?턑? ?&??, `mx???????~???????a?_??]r??@?V?g]/7ذ?x"C$??9?P?4;??3??A1ZsX??g????9??p:??_?7?9O????Zl? ?<ԧ+? ??.??h>X/??sCg??ơs???ʚ?"O??e?W?$&??W??F?|??U??րI????D?v:5Y????{??ٲ??&??0??^?#???7?6????n>15K???=?????]?;?????H?????U?vU???t??KA,34?I?>???{۹???o??7kwJ?.?????r'?$ ?!? ?r{???\?T?I\#1 ?*A$?*?w??4>?M3?]v??ޮ?'dVɠ?s?2?W2??) ???Æ^?zՎ?????Y?>??J&,????[?k )??? q???,??X???9?Ś?s?ȶ8E?)? ?s?QFT???amT)x??_<^?NV&aD:????~?;?ɹ?k.U??0H??Ɛ@slA_j??M?]??RQ?)W?T?*){i????C?܇͠7??'??X???О"R??}?>K?Є?????D???s?I'@<???DÂeqlg&??1???y???Z@?1l??J??5 ??a??? ?.|??g@?!fRϸկ1??????????W?8o????? ???g?????????~ϳ?????^_?????W׫?3?VK ?????.?m??67??4Y;C????`4??ja?U ?Z#?>?? ?P?b?7I^?(i%~?щ?H?S? ?-??7?0}?^?c???Z?t\? uH>`?e??R??=x?{??Vl??aiI?^??8ԣ?hg???]9\?{=4??guhEn2X0>B?Ѱ.x?a??@ɿ???S?/?xKvu?????88^ft??{@Y3??%Q?+?b?vϝY??53????n????lI k??+?????;?}??e+? ???E??oeP??∝YU?'վӲ???`@?R??Y???}o?k???t8??讱?{ޖ?hI`lt? ++?*?I5v?ih?o ????<~?+???>6??\!z??x ?n????c?q??ׯ?7???S_?[????}???yS?O?]["??+?i?f/?????k????Ox?D?ʡ?????㉿?xt??݁g????7???q?݋??т?N ??D????Ͽ????o®V,?p???o?}????z????? ?;?????+??O? ?hqE?{1,hX?k$?hW?}#_?gM???mf?%?9?3?g?-????Ӊt??XN???????'?`g?={?????rrfs???΄y??j??$??????6?????{??#?Sn!??X?&?X?B I???cl??x1uA??T??d?`k?=?$? ,??6? L?Z???Ot؇???Ҏ????޺6d4?Jr ??0A (?}?o3 of??w?,??>??803?`}???]7???pɈ ?)qq????@??^????? ++??R H͙"?????y???̊zr?,?F٥ղ>m?Pg?q<9?e??f&??#?Ox??`3̀?a?BAl?M?#Hm?6m?W????UoP'????`0??s?>]?? ??????=%O?6%?h?1C??? ??ܲ?i?X&?u??R??,?с?:н|Q?r8? ++ ?O?~?)??TW?????????????????? ?]&??mqa{?5S???Lhgνw?"?e?CΫ?`襵M{?An͹?????????e_??5?Vn??x?i>?(??R? J?|?c?S!?m ??}?G1 ?????????????sø?f?q?3?4?\???;x???l@?f???r??'??y?????O??G?6:֛8V[??:????6?y?????kZ"qf???P??-I+# qmx??_?r?u?????xk{??C?n???#|?j~???Z?3?-??ٿ?w^???,??? K8?w??l?C0?쓇A??e{H?P ??N@???.??U?⑲9 ??E_'??4՚>?<??",???A? 3K:+?y?LV???B?-JХ??t?/??Ax??tx-b57yV???q?YIҗS^??[???&\???kcb\{[???>?c3?T???? K????6^??M?N$Բ \??F???د"???Z?l+5??? #???L?`?T?8?k??0???T??H,R)9з?f*??Z??????gVن9ߒ?e???lK?x?U١l)???X7?l?v??B????Ww?G???w?????? ???ś_~?x?H?)?u3?z??????d??^]???__?"Țu?jv2۪?b?ӹ? 8H*?l??b?1?????,G??'A??e?4????h????S?/???\??Y?EL????dg??S?d*Rm?A? ???-?ɭ1 ?dI?6pD??ئ?bp +???t\?+ ?? m-?S???hSP????r7?b`??`o? ? ++D??z4V?Ȕ5؊!p?  ?߲X?? ++??.??w??!KΣ??Ν?ɜ?[?? U{4[D??af4??;3h?`i?ؗ &??{? I)&u? ++2??Xdd??L?l??2n绅??AGde|???-Vp= ]?ݦ?^?????y?&)fS-????؆???XȐ??\??{????ծ?Xz?0???Y????oT&??C?_?CIMw???לj?v???ּ ? ??3?$r????Z?C?1?K?St?C??*l????尸 ?K?V?V?y?r<5?ʀ?~Lm(????Mǣ?C`єqA`ʇ!;?\?u?p2?s]%?ݨ b?祜w?/??@T?Д?!;?|?J??lv0*?仔vd`??m???y?33??q?p?n? ????????X?O???]???\8.T?+?Aѫ?Gx????vBo+?N mtXf??"?????:?_??"O????G??Ͼr??[???ai???GWhXa??N?Я???xn?#?????27?&??D?%?? ?nVg&v?N?`?p?~?y|֗?U?G??T+?@)?Np({?@k? K???+?>`pex???3??%L?j? ?2???yNEe??b?DŽl?????6?h???\P5v?vF??PK?-??`??1??Q?K#8??a?????U??(? ? ?u]?(,?l2? ?Ӧ???h?!?Qe?Qi?a V?`???? ?$??{???°`r?? w?d?/ ?>e???g?,M?^?Y?u?$A\ֲ??ԯ]??Ɲgα???̈f;(?D??٪??v????g?L?1? ++????u}??&?ֻ\[?Y????^Q? ??i? ˱}?5???wV??WF???Rv??c?o???Ӱ$A3???????7 i+2ͪ?$?hnR??????0#Kc?'$+?V?ᕝ???Y?j???5?s4?:?|0crU0?@??6???P.?S?@????.?????????܌ف^???i?H??f?Bq? 6??c#???K???|??#4???(? sUSW6?Zs??7Ӭ4?]`h?? J? '?`@???(;kԹ??? ? ?k%??#7??`ec?_+#???H?*;`z?4??*Y}?"l??Aj*5R?}w?cLY????Hr8?G??#?ܯ?2n??-?????1???;?qZ???w??|?'???'S?Ze??|??S?}?sU?? ?݆?k??X;4?7?vr?7 ??c ???p??`???~\U?̝D$}_???H?A?IJ.????;??m??_?5?????-ZKf?F ??L???ݧ??iL?????Z?????}iܛ? 3???s?Pa??!5?&?,?`??G?'+?,̇?n?笞?ڝ??M?X??k?J&!?Pm??ۏ????g???H?~js?륨w1އ1??{2ԫ?I??f{s?? ++???? ???????u????vL?2?,??o?>??/`?1˪??]?G??ܯ???? q|???B0m6 IDAT?*??g;|V?NX?[?b?r,5?͵U??к#F??.rL?d_???7I?u??e?G? e???9?%?7?+??????k?????????ۿ?-|???؟9??_??*?????zu}??/?t?$r??ă},? ?g????2??A?ڌ??&??R:%??|???-?эx:tn? u8`???f???a?wg??MD???aM̲?)??v?3NJ??^uA??L K??Kֆ????z??$?!??өA???0G?`??Ug.ɂ?`p1?2)?;:?_??`e?@?mis?2L??? ׫^ M=??X?8??n?>?$?x?چ??R=??(3?Rt) ?0??J?dw?8cgfT???t?8?d?3Y???F.???k??4.3??3??;U,~dɹ?4?,?M `????W???M??*?gH?)Rƨ"?m?4? ?t?8?d???`[9?5^?}(z???p???a???.u0?&? ++x0l????0bf<??ܗ?1?? #|?? M??? 0x2??ּ}??-??}?? ????y??'??L??}͕?*9??k\??0έȁ/???j ?????'x????x??-?????|?m???x??)???????G'?????+???6T?0V??H?K)?|???k??0?9o????v:a??_?L;??? ++`f?|ND ?? ??D?e???+ t????r???A ++$治??Md?[eN?\??lV??4圥??l^ ??????????Kh?ñ`䆰 o??9????M\_o[G?l????~ȶ? ++???|??$??%?5?????-?U7?7\???'?\??|W$?[? ++g??6????'?x???g?j? ,W +V????o?X??k??4? ++DY??????#???b$u4|n?A|???ﭿ????~v?b?7?ˆO???? mHxR&9K»??p??1?/,?j+???"T???U?;r7c??2?.?N??z?M?? ,??h??ecb%?LQ?dM???a???*?LB؟33)-? ٖ9?F??????T?I?????n%??mV0?|?E?ߠϺg??J?????OI??p?????N?C?H@X????yz ??\-p ?}??g?'>?/???F{??B=?R"t??;?h?v??O ?U????c?V ????Ѫ`??6?K??j?Ͳ?/?????A[??N??? ++b??z??=?=?=h???{??? I]??p????????l?Ri??F?*Oi^N??MV?????]?X,???w???Ke?ѥ͋?/??X?MT????????????C&??~?|4LIg=f??C\?V??.?x~N6??de:b??sf2Y?6??}????}?J??=???iӵ??[?ݚ?༜r????@ ????(?H?w3?I?U?>?4????$??Мc?g??*sѱ??P6z(?<?[?kP??&??4)I??s?]??q?f}Ox? gπ?????XLj"?\ ?@`=7?????_?C|?w????_??w?ßA|?B??ˋ?/?z?|u??^]??u??F,???e????4Z9^ ~Aq?????^DY2????A ?ꀞ??Y?ep??d??A??4??S??n??礌?y?A2?J#? ++gx[$??C?]Wt?? "RR?zd2?`????ˠ???4???)y?e??P? 5H`_C? ?N??M`B??0?P1m?????2Nlf??d?MY??v?[?e??&?D??9G?$S͇??a? ++?쓛7?]?]5U;k ++??e?^m????? ?!1F?x??'9 TM+?!ik?$? M??}{??Y#?!y8??%+@?Db?B?Q?=U?6?sF'?0b?????` C l(?E?"?? d?1?* ??LЀ?Q?)04?$%??Z????ߕ?̑d??,?i??9?T(ۻ?ʲ?~3Ѓi1???UV???&&x??J@?R???]9Y?????@??D? 9C??מV?????'?#k???f=Z>+H??????q???Z+???I??(RmsNG??^ߕC?5?6?`?r??uq??g]5М?,??e2q??/??m?-hΜ?6c0?)???ܘ?%j?(??$?5??33?A2??b??:??w?b????DYi?ĢW?pI=A?G??A2X[??v?e}??z?cP?ǖ???P??????d??? ?I??6???\?M?)?)????.?H?-?@]?*0ɳ?v?Ҙ ?.?0dk`??_?Z?&AS?g?O?v? ?ԙW:?e3W?I?f?P??4?KcО???j???3ŧ??K0ORm?w??????!???DI?I?Rӣ??{??U?j???G([U6?]??\? ,`v??L Mu?e]???XO???? ސ6z? ?Ŕ?5?ʊJ??Irg331??!gq??oJ?Ӓ"?0j??v)?T???I?@??:?q?%?:?L??`%?[K؀"????˦?|'%m????f?? ް~jJ??'? tٛj ?o????S? [?????????K????E\??q?|?q[9??>?"Ж߽?[OV??&I????ȫ_??w?ē?+??5F???7?z?`aXO???_??y?am׀?Tǵl'??X????6:| ??@??\g??????x&????<8??G?w??x??m??/??8/??????t?}l??>?+)??:?Q?-?}?U?L??o]~ \???u?ֻ?L???f??(?[?D?B?4 ??iT??o?V????p??CgJ.?w???c?0??@????V`????0ʢ??#=? ?#?^ӷڜ??????????l?ڣt??A?:??K ?aE???g????W??? U???=l??y?;?N??cF_?c???3{0P??c????R^?? @=lk]?C{?R?˧\?6??Z??X?)??$ɉ?w?????/??? M??3!(:?+?22?9?I???}?w?:????3eh?̠N-??Kخ ?9k?N?????|????????ä?չǺ?@?? ??K?c/??f???}({???0??;]?h?f????'gq(?DkBͶ9Wk???SXY??.ld+[`"+?Hs??֞???a???}?C??q T??3?3Bx??O@{?b?kJ????6??"F?f*Ǭ?*???mo(bK0??(l?D?O2???ڴ? ?{0??y(?a? ++?l ++?K?$?PI2?}????e?T-?7?"?a??9/*0J9??VDY?!??4h?ҷ??'*_q-?L??ɺ?Y?? ++?:&??Ӑ?b?@? ?;?'pw?~??6???}????(n|?? ????W׫?????˽ ϡ?b!?SB??XzCF?P???Y???4? ?̐(I???ڌA??ʐ?b1?X?P??|?W??=a??yi)???bm ++@?N#?<P?? ?????&?X??"??[ ٪?WF#??{?L#?)??Wp?}?ʶ"?P5*A?'?@?6???hJ?O?? ?? ++?? ???b?w??I?*C??xpd??ذ0? ++??|;?= ??vT?מ?Z7?$+?֡?f??9?DQ?zB.?\d0?W??P?$zBa]??Ȕ?h??W???????!??:????M?????h????? ???LJ̤c??h?|e????ͱ?V?#??? ,?-?W?o.۰yG???[?ï?4C?@??? ??<׌???y?;?4f?. v? ?a?_? gK` ?u?=6?u??4?Q?-? ??? =??zEP???w???~o:?????E?9h?JR?k???]`^?!?j1??"?Z?cÃ???x?2??:F???J????0??@XWV?k?a־jv?W?_??y1?d??&8????e?+K???X ??[ѩ??r?g?]???M3d?I ??g? ++?r??5?[?@.6"Gb??,6P?"8??< bf۰=??g??e??c`r???? -g@(??ਹ???????ql?6۬5?]?- ?I?5l?.>???%H?? ???????f?]?TA?ZzSf-?h޸?c(T~ԵD??о??3fp???vI?ʾIy ++?@????Ͳ?XC ??K(?? ?_??JaϞ??+e{ȫ?G ???Ү?.s([5?????QR???????1>x?C????ʭ}??i????l???[??3?? ???7??'?1:kj?'?7l?Ʒ??.????޼????'z???shY???d?????????!?a?L???:?lXN?? \???5??0V??~l?؊? ???:zl??p?6s?m??,3,3N?uP?????p??:p>???p?h??????18?k??? ?f??͸?77??V???h???`\?a $ r?sfc??K??^?%?????? ????㎥?%_@E3?im l???:???@?f???T?9*? s??x? ++z3;?5?l1??????ڭv??9?!???D7??g??UohH HV3???7?޳?k?N?l'???????\D/+?0A?MP??|'???2?;??????s?????_O_???g?ȭ?-??Y?w??F?? ++ ++r?1????q))?\??1eC????B|o?:??/??Դ??/e?ۗ?b,?K:v??;?1?n?y%+ ++?{?e?p?.?%}8?qy??'????2]?/ ++*??8??t?c??KD$;? ???c???M[/b(SM IDAT/?R?g<_???a/?? ???Q????~x؟????h?$?uf?Mϗ>_?~S?#??Z? ??o?E??????3hN?"pa+?{??Y?????L?j ???t>u?y?ܧl??P?{ʈ?٥f??uW?7x? ?@cP?R?f ???H???˴~???? ++???\Yr,?[;?6n?? ?;-᳀ӂȮ???ZX?5u(??˃q_* ?f??i%?%ʽ???Gp??{W)?GpV4 ??a?9?p?h??ᖙ3?????????? ++???.>?:??A`}{I?WA???)I?C )??9?h??@k?6,?:/ڰ??{6E? ++?~??qDف{Ǥ?z???,E"???dN??????3? h??f{?!% ???????.[?+܃{?pdQe??????F???&??aн$#?S`?~0?u?_@V???uv1?P?x?2I????RI??&?mD?K|?a??h?k?6???.?i?? ?Os?G]????/??k'??s???4??#|??Gh?W?G??????'??CX?a{q?%?$N?????Ǘ??,?R?0?|Yp?????~?????O??%(,??@낻?????cYV??NN?O?-]{??}C[???`9p??.ek$'??\?OC???,?16f??}?sWo????????? ++?-*cFq?5???`e?J?OP־?D??????)?}c'? ? ??b$j?=?|JJ6?0갵j"???˄? ???'Z?IIZn??d???ıNze??ޭ?9?̻?Wz?swx GX?? ??O????6??ևxZN?$EfH?R??'?| 0>??x??Y?st?^??? _X????$?dΪ)^?r????Ş|?{>?p֘??ņ????lĔ???@?ɇ??l???r*?U???8E>lW^|?ط????k?+?S?l?"T??ί?$v?}???g??sN??:???1 ?Vϊ4}/?????L??? ?@/?)?D?}p??𫔂???????s?y?i[L?m?S??9fP4?????ul???O??/e??x?? ?v ??*[?q.?,????\??9?ú?Df}dH ++ך?,?*3C???|??E3T?D????:????? ?&ǒ;&?rD??4??*??%??3???P}%???F"R\?"?!X{?;%{?ދ?u?????{2J?F??ڿ{?2 !tNZ??ٌV???? ++????ʼ7????>?(??~q??_ƞ!K$`???$r?3wAF????O?????????7>??:?????W׫?3??s?_?#cŲPv??d???FKP*???v`0b???F??cL J? e`u`2k?@??^%???4?2˲b :??????L鵛?V???YԔ?W?D (?*j `?6??w0tK`}?3}GU~X?#?|( ?F@s? ????(?I5?X.R? ???R?Qh??E?3?b2V=&H?????%?TA:?jN{7T7-Y3?" ?z?????e~b7???$????S???Y?Q?*Ir Ug? ?H֔??? !?E)xY}WN?? ?9? ???/???t??H?-??vM?G"???? ?`v˝-?Ʊ  Tw? ?85njk )? ?Dc?fZ??Fș&\&FTf??=v???FJ?q͕???gi??????C??c?wǀ?p:zhF?ڱ??al???9 ++B>t??NE???r?8FhMq?R??????#?p[(?,?m?A??Y?s??G*p;??q"Hob??L?ܳ?]?s???M??1??q'?dI'???!?Ƀ?݈{?M@RC???ZC??k??OȈ?+???{?'K???j?????s@?x?(Q!Qv(????zv???bH?? J?E?@??\????2????j?nX/???bpf???jժ?2???/q??]l??y??k?????o?????????DӅ?ޜ?}???q?,k㓯?3>wN?Kn_?????YDIjx)%?e8?9?r?92Ά?#r2?h??a?Lܣz? ???o޾??????????s?9⬈7?zd????i???4 ?M??w'????S?,????2X?GNv?*?|z???OYV\???????#?}~????LJx???H?????>??>?i?ε$?ʢ??z?????V??,?т ?3?V|,?6\W??0[?b???????"?"?Й?q??(?tk!V"+??? z??ӎ??{z????暃iV?W??Q?Ϫ??s???6bY??K\??C??:bO??" ++&?#6TN?l???? ]4? ?A?x^<?.M ??'h P}4?tyV?hks]n???=(f?3??????N?i??U?`??ɥ5?>???????(Br?i;`ixV?z?????՚??z?C ^?u?H???e?`???/?F?z? =??6U??@A n?bU?j?'??W?b?_????"Y\% ?????@{?ja???@?7@?$ٷ???%?Y??!?,Q??ӱ?$0?:?ƻ???s???x???/??1?9,!?k??[?ξ? ???$?#Vh!fZ??9E'?BT?Y??xT?K??5?q9/??`[?<+V??? ++>?]eV????R??JRsf?????#?4ϊ?/g?kęCF??U??eU?%???2?H?9???gX~]?? ^?T5???C}H??s_????Pwc`,???Fk?|?-iRO??E|o??!z??=?o?N?I?A??DՓ/??6???'????xq???K??W?zW"S???؛z>?{aQ:??2?5d???@\t/?ܵ???#E`???S\?W{D]???&lzN?I?Y?ݲ~?W\?s?a?_=n??V.?v??̄mw??P= ??q?.???*???????*UrO??ij[???8Q?????Q]??R؆???X???{r?&?sItf?Pd??>??g???v?r!??ݹ?'%????cM?lO?>G?_?oX???'?̷~?e ?'?????X??P??M???V?!d?g?)?)QF]??=M?73fq?^?????:?{$HX!?ʊ s|?m$?s???????k?v?X?;??>?H???,??蠊v?؝E%??\6RU,0w?M??a?E?p?Ș'>?2??l?'??9?- ??ˢ??m?E$??????e?뼹?4??utt???????g????Y????LJ?????:????áe????R?Z?&? ++?*+'bс??-????^Sv?D?I?\ĉV? V???E?$G?28c?w?`???ӠE??a???#OM??؀+H???Ȯ??,???r??ܰ??*=????"-3`*???T?YÆb??پ?R?w%?G2? D{?? [ ??Mp?z??#@ ?V`???? ????b?P`???ֱ????)P,?md?j?S?gV?R?????S?{?=???i?$??؉?????) ?????=??????@[b??:E??? D??O?{_?E"? O???,?s??A`t????s???HVu ??5?ǭ??[??_???45??hX%?,Y?F???ƨ???kq[??hZ?7hn??U????0zT4)p???Z?A??I?FsG鈯?v?h3?W???E?4ĕEz?_??#].4?i??D????? ??? ??e??2??/?-f?䨃s?x?B??;??i?e??[}???????6.? ++?&1U?d?.??w?iV?%@kE??Xee?6?_/? ??3???k?$?&??ύ? ?!\@???&?,??4??S?'Wd?`?8?;T??^l? ?G6w?'WV6?0Mu??}?&?y??v?g??!??lĥ?g??5q?$߮MS1?!*?? ѫ?-*@?8??ƞh?uh?p? ??g?}???̧}???G???8r? ףּ?Ɵ~??????ܶ4^`kL?pϗ$???;;?ƣ??? Oѓ4?[?6??????p8???A?E\-Y)??ż&???????yk[???;???z???y????AVXb? ?.s??$?|~??}Gk`?!J?Q???:+? a??|????G? ?????"t?-???`?d?b????=:K????٩ ? )V?}??4??m@??.!??pГ IK|?? ??uK`!?????????N?!.^??-w??[??湑3??????Ҩۭk???????n???Q??z??'??:V?K?/???T??a??{?H???^p??ur;?-??}~????}+?q9??==߯;|C?]f??$r4U?K?vʙ?ijƮ????? ???פ??}?ށc?>EXT.D7??V??{??"??ă????\??R[?"??M????+ǵPo??c?w????t?H۪I????ά[????5Wv??2??tB??3}?!]Y?'B0????}vx>???????ł3?{p?wa?? O.?m??ױ??s?ѿ[*?A????l1r`??g??IW??>T~~8>???8,g?5?~?[????"Qo?e?\VOxZض??W~Teb(A?T?`??Hp??X??(m?!#??[Op??a90??C0uڲ`??z?K?#a?Hx?G8??'\?[???OT?.?,`&,A8?dB?'?I??u????J?!?j*q>??ag?s?l???9?;??Mcv??Ł???h[?.1?VJ᪦Iu???t???vݺ??e???m|?ӎm?7???F??O???@?)???hM3މ?s?5?-??pg?]?X[i?= $???_?˦?R??RVY?{?D??? ???!?ζ̪??OqO?SA????{.N???$? h?o?d?V?a ?V????a?n?e4??o?;?+ʼn?8"??[lJ?????Gdya|V]???ZrN'?^"6????q?n\??ys>Q?}Ɵ??m?????,?=ӣ??????v?6h?G?t??UU?3t?;EΕ?H??t?]Bm???Qoq?gqž^?1?52?ؤ7??h?? ++?dqa?M?A?y??=z?B?~Q]Z?)???幚?fI??+?S?? k??i)?Q??7??|}#??p????ʫG??;ǂ?ۿV?X?>?%+?!N???WL??5?]$???m^?}?( NHk??F??>?n*??? aw????O?\? $???_??????~zK&??陰???7?^?????????=??Te??E2sd;????l??J9'?>g#-S?h??s8??f[?^!?;??{]@??L???b?#???{?%1??'?7?z??n2H5F?Hl*?? ++%I???_(I+???T????????M|??J&0-??2? @?0v???=????Q?MZ??kE?FO28?J??l?? ++pÑQ?>O?MOp??M??50-v/|ɀ?rD? ??9T? ???E?%~?=? ?Q?;@K*1?????vo??$ ?YkR???hB???F2d&x??f?i>????u?l??@LS!? vͮ????‡X?*!Ϫ?YuJ?;?]???WI?f?????{U??????? ????GQVN?t?<>?5????o????^nX ޽?n??G??㛗?ַ4?i????{ܻ??~v? ??y??#??Տ??7g????M<sad?u%??㴞N?ݸ{?|?c?ځvp?C1[???/?W a??c????gdyD\X?›?'^???閃????p???}????o???G??? ??G??`}{?xnGL??@?y; ???8?????|???J @?b?&%??U????~آ_?9Uf?F\??!W???%?]?&aŧ?A??g@=Ѳ?X??z56O?? ???V?{1~l??^a?ĜͣW?%`m ?l??|?j< j ++?ŵ-??[??;1?V?1??$?@`??????EZ??`Z??qRřx?#򮹥f?=w?3?N???q'??EB?V0f???h?!???Ҳ?}?F??+M??$?Q?L?$?2?Kx[Q5Z?sV??R ?%`)?+?#??E?_?G>ߟ|?s????_???[?Ѱ?p+]??'?w?O??o?K????6ҿ????n?q??Ͽ?C????sK?????j ? ?= ?ri??5\:vp?;/??y??D6????????X???ee?-$?ϑ????݈?K6?k?Yb?????l?VTS????e?&&?id??Rv?YW?m??|?-???8??}J??gp????)??8?????ͪ0? ?*nf?e???9?????8??Mh5?E????v\T?J ++$????F`si؉???{????$??Eĥu?????ڌ?tN??c?-?2?r?py+w#?Y?1?኱2:???:vW%w?c!?[??Ż>??X???J?K?W?ޅ??dZEH%8s?p?}??;gC??qڒ?CsE?b\<#q}??yQ??]?φ_Q??譧?????2?m?r)Z??%?ײ?D????H%1>?g?'>8??ǚD`?w%??r?9'ܳ0$-?????K?????i3$%\{ܪ5V~Ռ??u??&A??x??1=?!ܲ??3?Hs?F?????&???R?#???????LJ?????Ê??%??T???7??0}?a):l?*F? B)*9\=??8lH?Ò?????N??H??ʗ??+???G?6?d?H&J???w?U??)K?Q?j??4h? /??Y5?!U?????ѷ??a=?V?U?0՜?TYb?n #s???EV?(?KT?jU??IMX:R??$r)`?????; }`??۬^? C?????ΘF5:?~?X?Ll?$JJ?I?KX_?׭(D3?"l??u߷`jd?x?IUתJB??$w ǽ?=ˋ? ??O??"?S???|ȴa?Tɺ???]??"?tPۨgH?[& ???dB??fVBp????L?#???xy???i???*????Iϵ?????;*y?e ???Ԑ??l??^T???=?M?xZ5?z?"??;???z???՚?\????+O??Ek??>??x??i??ڳ?(?8F`Yȟ?0u;???b??f???ٯ?????PV???????9(?@u???oJ?Y??j??J?}??d???X???Dq.???ٔ7_?????|??????_??????{^?8rԏ??;r{?1?????{qϻ/N? ?q?N??K??Dx}??x???_?Ǯ?Dp?Bמϔ!Cq?Ѳg"?W???????u ?&{?B??????m{?ve]?۠-???q>"?B??8 ????? ???z???c??q??^??ߩ?Ρ??????r?8=??V?"pt?????=!??et???ܜ&?X?D??. JS??{p?O??Z?BT֨ \2??g ?ԉ T&?Ah??\??Pa?ݢ?V?~)?]2?|i!?{?????*D/✊5hK??ȑ zn??tFl?Q? H%? WK?s?k#? NAI??g??Z?g?SD ?NY?)?"??????S.?? &۬??*3?ir?k????Cr???H??h??bi??/+Ų?)??m_?yt B?5??D???=j/?? Hw??Fx?z ?u????l???m?M?L??=@??;????:?t}? ???v?cۣ??XF ????,?}?WO@6??k? ֌?G??o"?K??s{ru??l???f?k?ii?a7?;+?????H?\?%[??TEE??1-??x????8?lEP?p????z?Zڤ?J??X?m??c"???a???G?B?|?i "????X??;'?g?c".+???\,?U?nx???|?L?5??z?@T?X?s?D=)?w™X?Z[?v????????-?nh?]g???7o????????5?7?`i?N?P_???xï??o2;m?Vq6?c??5 ?U;?w^|rϛ~???x???????1r??s???~:?w??š?r????L??&?!?????????>=?]??.?x? ???,???R)U????{SJ???.ǥ6m?)1?0c?X*S???:.),?yT???%????-?t@Ƽ?????????L????H5q??/????˯?>???=???.P"??0?`?,]??ǽ???? ?G?Q,rSo??ˈ;D??t?RR?-~|f??=????LJ?????/{??2?g?l???J`%^??$?f? w?YĊ??Fmn:?V9?Z??kl?=???H3??-??ôo*e??0[3ږmS?T?xCLQ[R??O$ ++????=\?;? ??GR2??=?i?s?z??? ????vj??!?K?3?^?? "G??R=???h??TN?`??(?'?"y?,``4???E?jK2?H?I?$j9(?2)?Sٞ??A0?? ??|?^????v[???. ??{?-?c???R???{?"z??rی???L(?<]?C???K ??͠?d2???5?bu????|? Ho?m?JI?Bz?o?k??. ???S?????[3 ???!⩘???mU?J?J?/ɫ?M ??w?Ό?i?5Ḧ́|?f??U"?^s%???ܙ??o??`??L?????J ?Ř KK?vP???ud?c8cM?]?^jc???????|???? ????$N{??y?0??m??A?#?F???IY$_1W?y?%YV???*\5????????O???;??????????????c]????/y??;N????x??#cy?????p< ++_?{@?P%hV?8,oc?=?/kǿvd?@?q{sv?7?=???6,&?z?޽ ?tp???fI?w?Hk,?p>??H?h????w?? ++??98??q?p?v?Y Y??? 9??J[???/???30?@??????k??9?`杶Hjk/??????dA?i2&@g???\k)"? (䜏?6l?k?????S??????p?|m?*T%~?(j-?sU?????I?ck???*? ++?ɵ6ɐ????D8ԡ0$a?$???JE??R?#?D@(@?FTVi??s_)???4?ӹN@ Cj???????fK???a[?/+?=?z??D5K??j+r)??b?^?s_ l??O*C?y??N?p?A??(??暥????^P???T"?F?*???y?m???Ɓ?(? ??X?ߟ?w?un??ڶ?????,?0???_? ???%?U{?V?]߷?D??Ο?\?*T???gNC??ԝq?!Ԋ=Tv?,",??G??"?S?ؕ~??nsu?????{?w???K??Xy???:??????i.,>?!4W?QC??c?U?T|??/b???1????Pq?????{I?r?vgș?ڪ_???y8????`9?=zOb??0pV?Q?0?6?$????7c?̖?\???uT?:?5Mb~???#?@?>Ǣ?JGd?????????????A????8 ??>~u?w??/??~???????X?????p3n????snn>??c?=Z?p???#,?5 ??غ?e?x?? ??+???p??指?aQ|QW8??X??"%???J?`o_?I???\4u?????)? mEi:XD9®/?#hrF????ʟ???|?{m 2h??$?w?????:!H???!?z?????=?f?jZܱ?V??dR????Ur~z& D?o{ :H?@??,??M??+A?a?*4??f ?????i?? +?i?1???m/????v?vas?ٯeu???=3nKbsn9???cU?2????g?3????)l?????l?o?2??1m??4c???sس???:?C"??o??_??D?]?6%q??Fad5,?ڲ ????\z??c?Tfq?jJ9??7'??e?ڊT?C9+??1g???4?[??*. ?????????p|8??c?O? `?ie??g-A? ++xxæ??uO2? y??F?hE?O?Ȭl?aQ?!?ʻ?|كH ???UD??R ???i}???q#?R?+IjN[????F?uiKK??lT?????Wx^?n???o?@2?k?TuJ$J??$p?ۆk??`?p?A???yWE?N ??SAϼ??tDE?.a?M72?R-??iyW?h?1???W??{???????B]9?;?%??ݗ_`?s\?????~??_??~??x?pf(?|?8?у?7??Ѹ??`??/?,?f?j?((#? Tб?8?c??jՕ?? ??> k?5 ތ?錛mB??????^??h????S3?U??x?j"2?gm ????p?WA??8B{???"??????U?s?Y?!?pO??纯e8r??8/??tipvv^? IDATf??C??"IUM??ܓ?\?Ȼj}s?c"??Isr?d?c? ??"?ZC????c?ܟD?Y????,???ߣ??1N??3????)MC?!??A?cĺ??q ?i?????7??o?s??״?]?5????????F^$_G?-}??n{Q??T[??ڿft???.???Do?????m?yB.zT?q?k???????{q?yS?[a?_???q?zN??????s????LJ?+??l?Y X ++??ńZpc????=???9?#??Lb,?e_"???(?"s?@Y!?E?mFX???6?s??=?D 2)? ++d]IVdl ++x?$({???J˝eS??????#lc?.???@?̗ ???)O;?ht]?L??ITd6M??f??!U\p???Ls? ?_???? ?$?F$????m`_5R?)????sܟo?V ++????%??? ++^?? ++?? ++?m`?y???L?T???FְL????I????췓y6?DK?XT?Y???>?@???+?m͙(?_T??-????Gy;??3??|???[8?QA}#\?????I???$yO?^??I????4ɫϯ??-a ?| ?=[? ?~ ?~?ծ?ZKB????*? ?????I?(U????{?5?znKޣ(????+f0[??xV!oնj2???]?Ә?+>o ? ++?Z?fb??W?y~$Y??U?IU5???L?????Φm?????}??ÍW/??;??6??-=???^??G|??'??ͷ?Xݹy???{^}?|t??l?????m??k_?????~???G=#????L????N4?mͥ?GT ???}?????ܼk????2 ??Ǟ6, ???q???A#?)??z?*?Ŏ?筚j c?9?ۙ??????n,?9?}??X?G??q`?"??|?k_?x\???(???#?:?6.??_??m?z6?`???>???X???^[??????N|?=́?p??o?l/ K̮?|??$?*?߽??*??uJ|?l??L@?W???????x?????,?m??,P?c??W.:??{~?S?vLC~?l?PQ?3{??F?"~?????={$W??????m?P??????A?:?y???ݻO2?9???#???%P85?U??~U!ZU????*?????l???e?Y;???ה9w?g?q?*Ƒ?'?M??????.B?8?գ?rs????,??}? ?Ѭ?Z'muY?ZV??J ?bZ??T?2X??"W1?t???s?????+?%*??c?5?UQ?????j? ku??Z"??l'?Dې??»G???_qws?4?.??@?wގn?????}???????ۿ??="8K?X?_????~???-??l$-Y*??FF?(J?%?a??34-?e}8;?/n???yk3\??z%ib????ʰ?????YOgֳ?- ??V*??֞*?+?? #z?Z??E?g? k^~|??^K?6hˠ?W??y?G??_?씆{?~??J.7?ۉX:???'c?!?&) ++?i ??P??6r???EHXil꽗BH!Z????Ex?OV|??vޅ???G?L5?0?9@???VB???????A?t?1z?Z,??reA??uu$?N??7?C{????(?w?;????^ٍ_?b??DO??HHT???????ǻb????{???n???}?~?.6-24ڕ?-s??ݸ??????ij??[ro??-^??IK?9+l??~???I??d?P?a??????7?Z??Id???K_b???d'??yb???E??M&n?º3??W= ++yb?IQ?? e M"ּ$??r?H?yܐ??y_?~@??6?j?8tk+?)?.-???q?ܴ??En?{??C??LJ??????{.@?Z?c?q??h*???!?L.?oZUL????7?D?~ ???@?L?0?5ȩAV?v6ENZ?AA[?l??? ???Gߖ?{^ג i?X?>"?b6HO??"???pm?6????6"?w?JQ?@u&cY`#?x?1?l????!?TO???2 ???Y???²D"/??Fڍ????wv?ٹL|?k?=??6?+[?#?g2?F????Y??%??Ⲫ?:.{??3 I?`???????e???21?-?ރ?????*?pb?SO?? ??\0?Ϯ'?W??dd???Z???i^?JU???$U??0ȵ 7?* d??qDb7???s??0l?門F??9?ୄ??,??X???>mZ?;?^~???'???ѿ??6???k|????7'??ps???? ?7???-??? ?^??o?9?>??'????5?????+?????????????????o??k>??zh?fpz????c???$aD?7?[?ⷨ5?_)˗@Z?b?CC{?A?H3h?QX_i?=????Ų??S?7??g^?(?T???????9?zk?8??f0??\??,?Q??:?? ++>]b?6?|L?I?8??Zw?????????l??0DŽ?q?O'>??@:]? ?:?\/?- ~z|????s??|CT????I??.?? ??{?????,K?G??3?E/??{????o?/i.?[??c??pϏ??1?7ʝ????o?[??-??? M!`?5 ++?vn????aTo?PAVN)?;ײR?%A? ???:NQ?????#7o?>??# ?w?M'?xl? ??N? ?/o???s?4?WL??Ӗq???{k?_???[??3 ??qa=;????>n??c?pL?R?E?D??_I?eF?5E??:3>F?m?ޔr%???)rs~???ʔ1 )N?C?D?????8'jF?n?Ĩ??????b?3U??4l??a?Z"???;?HV???U???1??A??/?m??=?Y?0c??2 Ud????????s??D,??/?&1C0??SDL?ň?6??^??M?U[?}I? ?:.??????1ϡ]?K?}}???׳???w쯷?????9?M?:?޿??~?i??dϵ?kN?\???y??aV.__??u>=????~?{f?#?rO??8??ntV??{?O ?yr????Ü?X?h?C??T???u?50?=!?,??????f????עZ?M?,WW????]???{ܪ]?;??󢬖?k?? ??ύ?c?бK??x}??-??v?u??.~V?K?'?s?H?j??9OvIkt?2???? ++?QP?2?u}???o??s ??x?H??????????:??P??{???f?eW??9?-??\Wʂww??O????d??jma?*ee?zes\?_|Ŀ?????? /???;>????????????18?qStQƗg??o?Ϳ?6????{??=_?D9??????? ??k ++??>:r?ė????籰??W/_2??r???(???Ao9?{????QX??%??e6Ԛ??lGy'??J?8???zs???Pg??Lă?[W??/?w?1??A??˂???G/x??g???.`_?~??I?? ?v?C(?????p?3h,D???????????I#VX??{*??A??`G?΁?Gt?aM?o?DF??R??2N tL???????3??cKrQA??3???$?>#???ؓk?Q??k#?ƛ`j?ps??|??/iy`???v?K ??????^??O? d??I????7??o:+?&id?g?4!?Ke?./??}???0z????˵)U?Ø ???P?A??o?]??˝ve???tq?{/9&*?B?}?AV??????? }:?? ++h?g???m?P?ح?qͻ???/vD?????s??5?x &ǿI?'????'???v?????-a??ϫM????5??? f???Z?>d??? B\t?G_????[q_?_?%?"?v$??.?z|g?جML?XZ?i?7??E†?$??/??J???<s?sZƎ5? ??k?1dޅ?HWA?{????r?ky?y??cܶ?%?^???lj?G?`' E?,1@d?Z???ن ?ΐs ++7$?ǯ皭?????V?????ówjV??H'(Ӭ?i?잶?#?{?{?i?Xq?g?,???_ȡ??????.ֲ?8??????v?L???WI?dLQ?,K??? ?b$@?7~?[??~?'?IX/?c0?#E?-???I?D??H?? ??????}?=??U???j??O߱^??Cz?}?9{???ګ????+K?&-???^2mT?J??v{̧ ++???H@??1?B?? x??\??h??~is?FP\P??'???p??c?%Z?8???g?ը?L???mD?R*??*բ?$?8?X"?;?? ++`?3v`勅Q1?Bm?I-?Tu?? ++?xƅ?]???a(?DB?R?w?l??Cf*@?RC???p?? ?? q?el? .??? ++0??N???$?Ȏ-???PV'?$??}??z???Ҷ????⁝d??dz?GIS????K`?p?0Y:????f???/?ϓ ??<Ĺ?+?x?@}/???3c???FB?M????? I??}2???Z@??V??????D??9??3?}????E??c]s~?? ?m????s??Q׉??oW?B???3J%?uuu_?:$^BFcG?????|?? ?U??}?g?["???`T{??8FS? ++ ??q#c?_?P,PŇ=?5H??Hk??!I$}a???!0$h Rzb???m:?p?T3?? ?4?6x??K?ļ?\0??J?ڛ\y?5H?????P?a*}?*?P?????3?A<)??HF?s ?SD"?)?s%?Ԝ????E,?sT???\??:A?1?? ??f??D?cv????????~?_??????#ώgdz????=t{+?*oί? M2???cYB????&????`?u?? ??`_?ޛ?옐`)?9 a&t??)?C?U ++=?G2?=?4؟G?r??????Z?z(=?d6Q?#?+:?`?e0?H,?\?=F?WDy?&?K??hem%??Q ???G?\AV? ++,P?ó?hHN?1N-2????Ͱ:?W] ++?sr-)O??A???#??67UX???7?;??=?|4i????L?1)wXɲzf?J?h????i?>0???:p?Gob????=?y?#Q??P? ??%?t??zه? ++?5Tb?~?0????/??LB %uj??^??CԢ???;?7P???N?Baoc?-?????ɂy>?W??u???????L??G?????-?? ?5 f? ++??w?????}?~?˸~????v??  ?O??????+????q|?{?l???mNEV?|??};?fl?=?e{?(ˋ?)?̇VcK??Qʶz??$8?d????*??3)???:E?&?@???D????'-??}?q?m???J??΀O?y???? ~??7????????c?+?t ?Ji?v?4񳈷hǸ???~Ձ?"?8?m??y?? ?=?? ++?z?/?o???:`?7?3?LF*?˨?t?6Ī??8?, ?ұiU? {????$FB?fq f?x5>C ?U?????'??B????@'p??6_??)|7,?d?9???o?????????"?+??? ??t?I=???CY??X??hVfo?d?:?b??l1kcR ++&Wn欞`?M?uf6??^G?}]?6:?y??Y?13L i$?A?GRU?a-?C$^#8???4?j9W?~???=d@t???19?? ??yQ?ߐ}T??)??? ++Q? (,???BF????@9@J???3?L#????ٛ5?n??U?? 6?tl0 ? ++?z?ڮHxD?xM?????R?$?????襯y ?X??o?٬@ר??ڏ?51?ws?S??>?_????D?8?gr?WN?|쎾Zo?\/?@m?(??5u???: ?>V??A?aP?Ƅ|?bL???ϕˀ? ???v?z#??)??&?5???ZW???E???b????P?P?/Ǧ?? ?x_\?1??o??,L???}? ???k???׿?6^z????|?????????=?{/???;w???ܻ}??w???o??ӣ;?_^???+?{uFǭ??x???x??_A?G?73?? ??/?<..8?s ???ǎ???????u?Wb?d?z]Q?A̱????>?{??L?????V\??N=:??:+?r>[?𜁝U\????k???????;^`KG?-???5??AtB]Br?(L?zP?m?}Z?b??a?,??x?w???]??=?J?Z$2?}????H??0?XS??PE??? ?a???8+?"SK4?|B??I&?.?ό*(?????????9?????їI?:~?????Y]mޫrT?j#m?*ԙ??X)??? ++4%?X??"?%!?1 H??XO????@?`* $P *d?<?9nH???-?4?J$?co???u?Ls???bH?P?ك??x?+?Z0?P?:? ++d)1????Utf(p?,?????į??????q:?b.?2-?z????Ǧx??c|??_?'??Gp?ڤ?ڳ? ++???V???EU?㇏?>E?yO0?z???4??H?j?_?e?D_??,??21?p8? ??=?????T??/??XA9V??>???#??*8???Q?T@5 ( ++?IT|bR?C???5&?P73?e???? NNJ[cO?8??a??*I@.l?B?JS???ͩ????hЉ????iƾ???U??0?????b. ?D?????????8(?M@ސ???l 2Kb?K??}??`N_??ÁVճ?_?JO?k???2????1ķ[?gӶ3 ܠ??Br?'???Ԇ???H?@??Af?2T󻛝?Y^=Q"Þ{U&!nJ??w?k ???ML???s??Fv??+Id???H?8c???o?|??u[?XK???:?I??uE?????Y??^???Y~?????????ѿ???1???5?=??2???ګ8Y?q4?? ??Z????)??ߍ?????J|1I??Ι?xS?=??ʢ??'?h?C?y???1???q? ++prsEI?Ĉ !?9V?/5b????opE]H??:????ScԌ???]???????ĸ'?y{?.??WE:K?Òr?$??d?gQAb?q>?J?? ++AT??X??Ν>?'/q8?D?? ě$lb6\5?C$?q?F??????:FA}㹽??Kg?>?aDR?E????i$?-??YԣM-1"?1??&9s?e2???~?_?6?ӿ??a?zxÊ???do?ώg?S?\?K?(?&XO[?~?*?U??F?? -ek?w\z??j?`\"??T?pŦM&q??yظt?? G??$;???G????f?}g?Nf?? {u??ƵC@?(Jd/???i?dԲ??'[uqNk?d_?}???>);??%???T8d!????W^?????zL*?p_?ѣV??H?D?mpJh??&?Ъ?ԁ&??7???f86??R??AMCp H ??L&(? ++??4@?\ ?b?W?k ++??x???K4?tȕ?%????J?N?c?Z?!N???T:fQ=??#8??o AG #??o1?t PS^(?g???????IN?*??ҲL?I?=?wI?mIk?????1@??@dD ++!????U؏*?w???%?fh?')?&??`?????0?lmM??ye2G?ڍ?$???׾?lU??^??/S?.d???ǀQ%Q? M}??5????Lȸ???d*?&YDBڅ??H$??wT???6?? ???oa?????;???cY?o?t???9??Q? ++???? ~?/}?g???????????&|?{o?????[? ++6P???>^??=????8??ˢ?-@H`2^??j.8:;???l?0Y`?E?{GO? X? X??K??9????Lv? ++`?nQl???-n?;??W?bY Ձ??¤?ɼ?v{?ͱc?`Zp?\????~?????q??c?O(e???v??4㥗N????N?p????Gѧ6?~????4?w?P????{"?? ++-????TF5NH??&m???0?????w?)?O?????8?@ar??p|?U????J?P?6?{??wT?jx$Ln?DS&$k?}?K??J ?S????]?? ++??,???V????????;I%??e?\w?@mVئ?f?cǀ?Z?z???`??}E???& ??? "??????D??M ++BIL??Jܯ??Do+ ++????????*?[{??[?`m}??νw?r?k[?@Ŵ??L?? ?V4??[?a>??kS???𜷛? X????%3?qE?1???}?R?~?#????c??v?s6??L??FF[ ???y??{??ɹ??W?????"@?dܻX?w'?5?Q???y?'?b$??S?[?_???þ?A6Q?XEE?(/@?1Q?eN?7?Is ?ϸ?X;2?~?:͟??Vԁ,??n ++A?Z??? ?s?sq??s R,?;?????????p~rºau????ѣwP7?{??_?2>??????;??;?ʞJ?x??;??za ?8??]???1?-`@????K?1/???8?$:??Q???R???ﯡUG\/??;??3??+??𨼡?k?? ?R?[??*j???y:B?/S??N_7J??j'?o?k>?????Wq?C/}?m?&?p??h=?.?lW?I oN?}?F??$͌ ?????W?? ??P?ف?_?EBz??/%'U#????{ik???eس?E??}X%U?T??g?l?+կ??Q~Q?ԛ[?H?H,??d??cV??M?1?3 {?+5??yx.?????\??==?*6?;͌%?*?H?????q_?_6???? V@?z; ?^?^V??^????طt?f??X?縿6?MiXP?? ++nJ??m]>?>μ????9????????????}>~??w??y??N?Q?????,o ?? 1??:??@ ?ll??6W?e??*}NiCz5????????m?9ڸ?%?e?????‡Pn?~A??$?o?C?7Iy?8[?????3?tbNh? ???d,?6???xs^-?\????Vk§&????????0???1?,???U?wXz?????Sb? ??P?Ř????X!??,?ϰ?ֶ?wY???????????7??V&"?? Fb??d$4?`??H?? ++???i??*>??= 0???c?y{????xT ???????_???R?_?????<;?ώ?_?gb?Gˍ???? ++$????M R6?&A??C6?4??3&? *K8K?ڸ????;????}?d???Q՟K ?N? ???|Nt?Y?s?h?R????,??????p?`?!??0?`?#e?0|??R&ͣ?y?^?p[??ٻM$????@??,?$e???I?[0???????ۙ?^?) ?k??X?ߗ??B[?????$?g?,"?c???RWq.?JRv?p? ??~D" ??? ?5R???y?y?>???r?l7??K۰F??}?ܣڦ??L?? ?2??0??8;??|?"?]S??(??? ++??jo??#,?ϛ;&?}??oa2a:?Š?Da??f%??Sn?????%???G?R|?\?? ʾ?(? ?2Ȭ????y? 1?/???y,????[???xw?)?9 ?*K?{V.?{v ?"??Dr??Wr?0???2??H???}%???[? YE?h?V?????pa??z?pb?֬?򶷧?R??&??f?Vp?d???e?m??@pC?Υ .?U?ї?%Ւq?L*?d١?k$?????OD??&Oӄ?L??@?k?g?k?1?R*???d[o?cЖ?dr%??*Ь&?H?W?ݛ??Xc???c??\@?#h??}???%?j?3?G????8??8?*ҪS?"?f?o ?T?cmM ????? ++??5????????n??k?.???[?ɏ|????o?dBY???38??{??f???:???c+?w??E'?9}[???k0?=0?V?IT}?$??~?k?n 4H*??:d??˵???????5i??U??>?= ??AQ)?????|?????????/?S??0dq,?KY@D4?O}B[?&(>???w?Tп?L%????ᾟ?gnnHƪK??80UT[ ??$3?/???;?cs???т)????-j?c? tg?\_?%LQ???b\?!???(!? ++?ޅ 0??8 ++??R? !??\*??J??y??V? ??Q\Xu????mBW@q&?hs=Ԫ,1?P??S#y?p4?a ++?d?Ī??>dE/????k$c?4V?_i7;???~H???X1mg??"?'ȸ0}~O&?????w??}?"#???~?|?}?ds?}M?0?&7?]??P??Ƹ ??u????P???iu?A?\???&Q8mG$>?9???^ο?;???t|"????\f???MmH*???L?a?|??i???]nF???j???g???????u$@??M?;?3???r?? %=)???Ŷ:__S}n4??7??:BI.qB???5???X?Sb?Ė ??3?2???h?? M@!*7!??????:V? ?5?'?sG?O??D>1?/`P??~B??g?#?j ????2r]?p??%?UꎩHc ?#?F?v???sW:???g 64?wc*4@?tu?\O??4??\?A?x?ԁ:?]U??0??E???^?R⽶LS.?&?*??r ?{?4??????!۴?՗*38F??hQ?w?s=??\?;$?>??>s????????????V?$Pge?Z??n?? 8=>?????G|??>???e?&l?q??/<??}???????y?n?«>?&???b??t??%d>?5???j??@>9^9}??W?!??_?0n??0?6HRE?F??qhQl??8:???{???r??Uf???????|?u?????z?? pj?pf|b??X????j?zJ??Tش?)???P????????J *^??????} G׎? ?RB?~?t?&r}"???[(????$?ɏ=???{?@??6E*(??$+uT ???$?g? ++??|?????P?&?(??V_z$O<}0~????3??T??zI?????w???y??f?*/?Lj^?^3a?cK?H?8I????B?KY????ߒ??8???{"%'Ƒ???9?;?3q?????G?C??;?Q??I?df?W ++???P\ɼ+?X?žo? IDATw???J$%%b\΁4???F?OKr?`?D?nVqv???`j?]?&D&V??? ?2?(?D??ω?Ae?`?c?YE?g?vٟr??$^??????⁔?s??i?????t{?k?S????ӰCT??>N?5?????A?wkߴ7?m?l????p?????x\?uQ ++??ՖR??rM=?͋7߲??~7?#? {?j#8??Փ??Z೑?&2?H?{??_?_*R??????? ++?^?J??z??!???k?;???(?"?;??6??*=?,bq?}????8O?+?????f???q[-J?K&?4$??{(????Xh0?????Va ????5ܿ0<ؽ?{'??K??7????~ ?=????J*???0A?3P?.·t@A?>&`2??????*??????S02ѫ-Ҫ`?+??Њ?3Ԛ??il?O)!???|?=??+??? ???7?G? ,???kȤ8qҸn??c?=:(?,??g?@?D???? ++????FK?? T2??;? ??5???g?? [ ? ++?_?R#?1W0&HNGH?/?H?Rj??͹?y ????©?"Ƭұ??k=??Ê1??ddG?+?y>? *?3??\?:?Ht"M!_e?$?? ?N?Sԡ?؀??>?6??y3?X???u?~??$?????2`?>?f???/?/????o?q?_??????c?{??m*??9?y?|?k??,?h?????E????D???Q?{??4??q lǸc?????3???-**+g?r_[??P?ݓcl?S??֛?L?o??c|?????r חo?!??f?]??~?cP9›???????=lw?m,{??˾?lvEu??Ȣ??A&??.Q6(?i?R'??z|??#?L%Tm? ++!??ű??pT,?bp2mP}?4??gU???5v??)6pPws? ??[?6?R+ ++?ߤ????Ό?*\??[<|?!&?P? ????H*?36??o?v??W΁e?;xڇ?2EŲ??h?3BO?,v+Kd[ ++bO????# ++&?S??Rdh[j]?/?rS????????6?Ž?|O?? ?{wG?6 A3?5????Z??Xl?LB9??ѝ&P#??8ZD0Ö^q?q;J'?-??????C"N?Du?+]5U5, A???+??GQ?a??d??U??Y??&?_5i?č????1q]?8??` '??X)k????7??U>?p!??=m?h{???d???ta????t `6?v&??fa??j?7?z?%;????? ?Kv?]?\? ?fK?N????c?VM?:?I?y??????4??L??}?s?????մ?A???uw'?? ?[?(?H?Q\??R????X?[??T?K?i&??Du?J?Ԩ?O?? 0X5?G ?8ؗ???Cp|v????~?????#??I????ۏq|??ջW???}?/W??????^d?0#???*_Ur??{??!{????$??X?ҦsJe??8L??")$O???ŵ??pv>?B? ??C?S???v????gwVO1??Ьv?V?>?s? ++?y&??\,?{*?|\??]7?CJVj???ܪ?r???|oX= ??Lp??ن #?&?$c?%>?J??D?O?LB??oY??3?????1yİjJ?:?V&H?X۳ý?'??DT?~?ޜ?\??????LzڲD??1ѩ?M??0?R.ףڎX?1&??l?8N*?n???l??u?9????v??? ?d?ى ?{<.,b?f?_? ??dB'?@??$?'??}>?3??+?A4?{????ژ??w?V?A?K?d?람?????Z?s????OV8I??]}A??Sj(T%?X@?8??xOG?? ?5p??????Qd" ?E%?c????=??1??j? D??l?`??g??????Ռ????SQ?(??ꨋ?4|??J \??w ?/}??YA?x???j?cJ&+ӟ????S{&\]??k! ++???j??p4??6??+?0?Zó???????x?G?U?f?5?? /C?^CE vag?u??Π?@&?7???F???¾??6 ,2?6h??Df??>??!???w??[S?!?)?ɠ?s)??%?Ȉ ?$??i?Ȧ>%F?D???y ++X-? ???RJ?Η?<&pk?$YUo???^[ʊ??r? &????5??#{??WX:x??eX???? ?\?dpֶ????9??-??`?%.?Q???0xn?/b????ݩ?qV??ēe;gxMu??*3I ?}??????\???ܛ'?R+T?T?_ ++???A??H f??d?E&PIP???Q?????a?cwq???c8?]*????A??/WS?? Ț4.??4??I4??J??b? ++?/„N?8??u??R???C?+\??! W7?陠m?F8؃= ?J?G??ӑ?jb-?L??????q~?k>?F????r?? c??9??k????f?y?F???????X tY?pI?C????????" 50V? )??&V?BR??;/c?N?1??? ??h?#ʞ,? ++?Pq?(?????;??o?~?? ++?z)Q#E?c-??g??gdz????u?ƫ?~J?????j????}8 ?dwI????C??`??7?΂?#?m?? E???h1?)|J??`???-?l?$???|p??2?dV??;[?KpTR?? ++???=????????1f?u?N^??2???o?S??$???݋-,?L??.IH??%C???X?I???pI?*P?`?3??j??N?R)??g??^( ??3¶???4???Bf?V ??q?kw0???:H??ѣq7Bn?W??¢'l?5y??Ik?A?BՃ??Ln????8???ECs??? Z??|????`s?823$7?H??|? ++???w`??i??"S#??N3????E?g?L?Y?:?u?qA??A?[??P??dԭ\??*+PrX?k??8'???????????"a`?x??a?O=? ??o}??{?ay~?? ????-???????T??g>??? Ň~????x???NJ]??J@??WJ?X5`?:?w?sB????'w??/}_?>???7?#?^?Kg????_?}e|??~??)???[_?c|?#???V?M????????py??L3?vp(?3?ž?I???????l?;???w?ݷ.!???c,?/HƘ???Ǜ?|?0p??W_???}? ????x??W???????s??Oвƚ9??D`?[?D??ˋ????A|K»T"? ??AY???ߺB?M?+P??1??+? ?Ի?h????E???ۅ??^q2,{???έ[?x??G-?w??0??????ŽO???[?g??~????+Ύ&,?]h9?J? ?? 쟡???r?m??}8G??񻒲{:?E??!%???k?Ͻ??J??IV# ++čҦ&-?px????K??؇??9~?z???;??,f??????T P?)I?E????+U?#?eћ?W?4??JlR0|?C?ayg=!?v'+ȉ#??x??GK???{.m??gm?g?Vi??n?ZP'??AfV.{`?պBF^????I5?/*{?:x???????1?8Q ++??:?&%?H+?Y?pV??c? ++.??????3`.8????/w8>R?? _??o????I\??pm?@?Rx+cjD? ++?w?? A??Α??C&@????V "??2.h?$?(??/>???` )??k?LƄ? ?-??^1?n\/??T`6&XT???(:??D?K݇R??~??jK??????*V?A?4G??8??]?%b???C?Ք$?w?????QQ).???????#???g?JT?r-$?~?}???$̏8\⽑>?*!?Ai??t??r,Q?? ???~`??yE&{???Zi?m> $k???ʄ}?o??k?2??Zʦ?Z??W{pKz? ++? Z5p?'W???b??c\Y?ҳ6q?:?p%=?``3???H?2RzO ++???rKm???k?g???Z2Ɲ??M??;???Ͽ &l?B?!?????O!ϕ?aL?I?ݎ?g?N??k??$MKȀz*q?뤝?s???'?$??hM?~??0??r?"Y??q{?S?D??=L???.?L???+@?~?am&>??!QI9AtAKz"?i+?g? P?6????ψ?͠:??D?^O?H?R?'?+???1??sGT?g,??+*?m@9??*Ziώ??&q?k?EK?@?!q1??2Q??w??Qmk??h|ƒ?!m_??? ++GV?? ++?Dq?n?#?k?|?^?;?=???Z?? p???ket?}Pv` ????o:? ;?H`\???X^?)V {??o??D?&?'Hr??oZ?V$?'Qy/I??h????s2??Oƹ??YYU?????J?ƻV??[~ |???-f?F?????????k?[??????ǐ2?y?>~?????????x???&?/(?????`??LBE?4E??0}.?z?UU?0?????\??D3a??a??ꢇ?U?ا???WI????N???d?1??t???|? ??_y /???S??~@?~??G'3???o?w~??????8~?e????0kN???9?Ov?!T3?I?erI nSs8"??W ????zp>$*5r?0?Dg?tgJ?????U Io??@?p?G9??w>? ++ۺ???|??I?4????zJ#?"u??g@???P?8???^5?ƕ?w???`BY?`A?y??tV2?,b_?Cʼn????>?G&?<fD??롁]X>?Sw??!?jZ?????Y:V?a??????8&?[bq???| {s? ɱZ,F???w??=e ?? ?ʤ(?҃u??0?`ƽ%????1?e??AJ @'???^??@??&?݂??߆?Q?????3Q?l????ݏ?έ#?L ??????s|?????????????!???K?zg???????f(3i??5? ++w?????/?/m?ŗz?/???????x??K??? ???{$~?68????-???e@?å?*Lҽ3?[?'?(?u??=?M_??b*{??̵3M?š X??`?6B?\\Aհ????Zp???kxh??<???'?o0?Yt^-???H??T?E??ŭ ??&??;g??y ?'??ҕ' ? jJ?UV8T)|?%?KSn??ĥ??]???2l{??<4P? ? ??l?F?D?[u???V?C??????W.S?/??~k)?V??vv? ??G?? Z??tq?Guo??$ >$?? |掵?pV?6ۦ V???09*???M?8?i"??Gȃ=??:!??¶9H?YP???a } ???ڹ???!+`??????gM???!F??&q?T??&??]a???p?*:??lߓ??C"??1mgI8?_|??}??%L*?>U[??Y?}.?t_?[? ++?4?_B{?????? IDATb ?!?^~A-?-??YV?LD???D?$??PB???????????3?;t'd??9?X,?D/Ϊ܏?2N4?? ++?Yq????? ?|?( Gp3? ++`??\J? Ղc8D&??,X??9U?????`S ++?l6?Xp?2Ϩ???3??E?qbMA???J?uQ????+?????5O?ݒ?????/??6?????+?2p?3?(?J?E?D[?>ko?h???.$?({N׽G?:??g????BȆ9ĵ????`?IR??'7???R ?6?s???g??J9?[?L????}nI?p?T?ߡ?#>?@??n{??L???J?zO?=ea#??gd?s?r?{??U7; ??G@P?Fe^̑uR??.=?7?'???G??2???d,?|^?B*XA????xߢ??r@?Xa??Ą? ? xoC??L????'?#΂@@??d?|h$?;J[/y.??p??̽x~hs????: ++ӈ??????R?????c???DQ?+z?*AV??G{A?=??J????$?'MJ?"R??@ R?g?????4_Q`lW?7[@?:|M:??-8?vY?r|??҇?!????????????;x??%j??B?ه?????,???xv<;??!? +?h?$????_*Љ ?K!PV݂??d?$?V?a?o?P0  ? {^Ŧ?J?????6???xD?xd%c9x??T ?q?.?X=???X?LGgG?N78???[?????X ++N?????O????%擂???e?p??Yq?????6Ο;???o????'?z ???9?G?,???????]?Wg? ??d_??"(,ٗ(G??s_?yuu???Z?c?QU??׿????g??r? p???[?4????MY?????V??FJz??*@9R?Х??ɋ????????????KZ?|?s??/????;??????k?۟q??d ?K_?"??H????/ft??pƴ?㗿?y~?7?.??????M??'?2q??????????S?????[???|????g?]1?W?1O \??"?H??x0??제?8??l??#7??&??n???{;????}B?4**??ǫB?!?~??C&?)ݾ?Hf?@)!? ??G???0cOOPw????J??ӊϲ??@?*?????o????[?:??@#???????? ???= ++ P???=?{&??? ,??{?ؾX?s??/2*?N?ڽ??=c?0ݬ?? ???k? ???S?J]}?>?dK?&?~7Ȗ??a?v?#+??~D?? ?0???L2n???Ǩ$??????~\?w0{n< ?G?xH?|?O????uX???x??[?a6?b? *Sȫ9i???? ???q_Y?q;??bJ??W??߃{??[??8k??&?D?d??? v?q?T????)????d???ħ?׌I?#BwJ? ??? ++?P@???YUj>}h?PP bA?) ?'W?+????SY?}S?7g??j??S??t?????RX ?Un?-?ԩz?X ++K?Lt???*? i`?UJ????N"r????%)??T??*e??q?e?2????UA5ځ????????ʐ?TS?5???W??0?'eZAM(??????K?w??6????T?j???????b? ??(?}l$?6?Q??>+?k?X?f?sq?h%??>?u??YK?~lۄ?m?=1_o'?4l???w? ?z ??j#"??|hV??Ds??CY?5?L?_ò?a???m?2?TO??L??w?^*" ގ?????+??k*?{?F?RV???6?[????xI?$????YwLa?y??)[,?qu+H??1???oT??g??G?ޖYyKY??HV??/? ???Q???])2^??Wß&j??m?kM|???? ????6J?q?xJT?n??.Q?1)'K???I??t?q??m???G&?"q8???֤혯8??d?D?{][?d]O?Cd???R?rnV_t???uTc??RQ??3?i?#?L?,?d`??k?DPI}?d҄??)a?|?Wo?? ++?n?-?,,3  ++??U??%??HR?(?g??]7?????_y?g???y?=??&o}?cp?y?????`????!ו: ?*?+Z? Yk=u"V?&?5?_$?I?2?'??~??g?0?y>2?}2? ?9?Vjk??1?l|??x? ?$??b%RU????????f ++i`d?tq?F???!+\? ++?s?L? ++@?8Ȳ???m?G?????X???M?q??O??!?SP5???@?B,??s?=?q9ߚ@?X??@p?o|һ????YW??~6+̳???ˆ?F ???3R@??Z??#ʴ????????dPVZ????U?v???;$$;K2)m???2*^????? ?_?8????>???տ??????????????? ",???:????3^?(g<{~?W~??o???So|??????ʑ?? ????P?h?p<??????=?n?ᣉW?s?E?p}?F*??B??KQ??JB?????Z4?? E9???(|?????E?^\s???C????Ij7????o?3?????<{Ƭ3??4y??p? ?ͧ??pu{?|>!???񉏿ʗ?>s???O?H???Rl?[???4M??? ?⌲Wn?cY?eb>TZ?)???#?N?4???????Lif,?c??????펲;6 o|?k?j?pu????g/??7?%j???cejB?W/n׊????[?KU ??N?T?fx?2??rZ???XEq??f5??>??K?'`nS?e߶ ?%?6??ŞS????p?p???IˑɈg]?=+??d?FKx"?`c?!v?eqYzO??!a7lX!җ?.?l?#?? k?s???p???Qݑ@??C?S2MU)?S??????Ba??LR?ܔr??r??x8"?G????V????R{??!??d??kT?D?Bn???G>??䱒u??YS?_6ɧ?^V;&??O? {?$s?林?%@???;E?H??????d??Oy? ?$???` ???>`??\9?????{??d?N|h??6???G?B`?k2ᩉJ?߿?[?k????q-n????????eT ?ؼK???v~O%7??7??QE?>??Ϲ??@??0S?_+?\??aG???/?/????S???5??>?K?i? ++?A???%?$?u?? ?sce????c?S?H???af????H3?~??m?{?m????d?? ??????t?/~?+? ??K?fIt?1?]???Ӗ??.@n????!6"3ʼn$? ]R ??????74?$????xRI?}???R?J?YB???Z ?%*sDF?ۤl????S!ݴ1???^g??6??k??SB??JV??Vj?j?{_?ZVr{5Ђ?X}8??????'?????j&"1?+٤߱MƮ?????J~%?LW?e%(????':?26?!?b?????????u`?P?%?+?G?6???& О̹?))?9G?????+??疔?$?>Y?}????ָ???L??Y?3^?1?|nx6????l?G.I? ??]?G=????0$O?;??oۯ~?o?B?4 '?f???u?9"?U?D??>??yMճ?}???Pw?????;k???~-??1???{N??1VVƚ???kd??Q?f? {?/??ICN??q???N?p?ג,w?j?_?ߊ??%ܧ?JVՈS ++?gƻVd?5F??Jc??uS%b??f?:ƒ????\?W ?6M"N????J?,?1J??&???Z??????w?????w??U?,F??K??oBix??MR?$P ???HG? ??!?hk?S5{?? *?: 4)?}??*?NF?S????c??޿b~qCi?V???~?_??ʗ?~????Sw;?7r_=?j?R??5???????2?I?_'la?????R?F??f????==K??h??i^,?r?Wk?j.?匰l?2?C?ap n_???o??Y?+?\6b??H????I??q??o?Ni?g????G???SvV??Y}?hl?wN?Z,??s???S?DZJT?m|?휺? ÿ?b7?T?G?A??b+ؖ1???Qh^a/x%??Y??\?2j?ӱ[Xe?X!????5ȇ0X????K?D?$o?W?P?ƸBF?;?t]?)a?%??[=??0? ++?h??0W?)3?? ?Z?=͸???Q?UJ?IdՑ2ևϓ??b?6??A?D\&??I??]??5d? ++k?-??A?e??p??G??sC?k? ?&?-`???{???7_??o???f?QRm?E$?5'???qr?:?>?0?e}=ӎ??ԻQj??s~J6?" ++??H???5??r??=|? ?'?!"?>????/?$?????h?%iWk???ۖuz?f?m?d=r?Vqpfن???}ݜ#}???0],???}?????? ? ++?@??՞??ϑ䜦3?????ά?>0?9?[Xԙ?(?Τ?V+?a?mη^3??*'????[j?[8D?u??Fy???????K/?N??}YI???d????W񄫃n?vs?_?Dr?kw?[s?????????4U??J^[r?K]ר??Xܗ?c`??r?.M!.???7wU????|?zH?i?5?K??[?#???n?>???????m?}???SJ]+??? ??\????s???? c?4?&?8*?b?u???LC?=????????9߄?6R?"?I??Q?J?? mEbB1*??w?Z???????"?N?Lo?5?H ?s}}?l?Y=?{>?)?qYh;?L??ޥ??%????޽??[??+?? _???N?S&??k?T?}j7??Z??^?me?hG???? ??~[ѣQ???2(\?h_A?*?????????r?偏W3?t??4O?U??_?L????=%?ә?=??8+gԿ??\=^*?????¤?? -$9?Ϸ?W???K,???U?=H)B??"??O3????b??I??d?I??@??K$&F?4?? ++?J???/%*?+?#s???Gak~?'?3???6?*?B_?{w?f????k*?c 8昩*?m??*4!N??U?B0?e$A"???Bk>^R???f?%y?11???R???ɾ?I????i?X cw?-??4m??ҩVOv?'.?????k?Y$ad?M???PJ?F????|˪g2???'???qfu?Ƴmއ??>V ?֊?!?/?U?>??????:a????O?W?e&?f? ??Q2?Y?Dh?W,?E@?Q???_lJ?Iz????>?>>?9H?ߏ (???5??Ҵ?? w?~??5?G?wm???k?tkzܳ?tl??' .??H?I#)?i?Vz???>w????Qb\?B5??VI~??-,?V???:??{???&MN|W? ++-??n?_ b? ++?3C ++T?'<-* ??X8x??'?^Cf0d??Ѧ???+??O?MJ?^??}?o_??Cc?!۶??%?? X?!??O?1??R?U͢?*,z??S???g?ʿ??~?ó?$?0mJ[??k?????=^&?_/???G~ؾ"??#??/D??N|?ʂQYf?????gaԊK?!??!?d2??"x({???ABGʎ?:??l???&tmLeA?ҏ S????_????O???r??C???V??o??+????N{??}љ?D g?\ ++?WZ??t,???z\?e???????j?????W??Gd?Qg">????<}v?Bay?nh?B?r?t?N:?[y?5?P???X?%???@????????zR????2x?s?-ÑK S_? o??{?bh????YdG??d:K)%{ q)Mgx0?{a??I!?ٮ3???WȘ??2ɐ ?i?I?M???(?;?Ba???lBK?X??Ba??g?y??W?}q?Yk?+e??.?U?R??v?q?7? m?Xs?????1?t?%X?5??Y"T?zd:{H;?8C?w&??^??Ą˳F/?|U???u?Κ h?X????}??OY揾???ч???O?`?J??h??? ?ޫ?&?C0*?????,??]???K7?:IP??ܹEi]????XUϔ??Q??d2J????_ Հ??e????-*?? 0?Se$????_?#?ޥ?JrJ?i?#]?>X=??W?8????r??UnJ??2????L?645?0??!?? ?s?4+?c;p??p??feA&U??3??L??*?L^!???u????X{4?q??G????D????Ț??Z?<\&W???r?Qڌ?]?;?????g?zw?i?ה]\?? ?80??9?TG????^????I]O??}?Wz?濫)U?'J?q j??I]{??V lm??????V???????\?o?']?.?????U$5?4T?H?a??O?h?tSJw?)??? ++ޮ?_??K??ď!?':?8???˰??w?:I????ِUٰ?M?^7??H$>5??zKn???o???$???? ?-=?c]uR?Ѐ?kSKT?:???O?`?zќhZ?^_W&?T+:n] -????P?????^??????ЙB????x??????T??s??y>?]??l7,?1G?'? ??P??D??/*L?!WLXd^?????n?L?/?nc&P??U?dŪ??E?A.K$\??)+?????>n??E?)tAz??ގM???.??=???#T??M;?IX?;??9????z?$??????l?t?Itf?S/^Ij?%I?J?}3E??S?9??[1v?W????????1???tU_ ++?!?"?l???^1\????V????D???=IL????B? O'????J????Ab/????o?d?[?ϗH???ye?)#)?[ eہ81Ժ?eA?Y?%1?m??q-+?A???K$ MŸ??? ++??#??ZFbVkb+b?šx_???y?q&v=??i???ޱwG??v???[ ++??+T???Ą??t7Yx?7&????HE4p???Ӂo|0???u??-?1?w??-?(????2+?I????s?dXV???-??????>}:k9??,??????????????aM???>??Z9???Ϛ%???h?~??E,?l˳|??P Jŷ????F??ja?????u??^?????.???x????/?-??_{?nɚ?Wyu'}??n?@)?е?d??*T????_?????\-?8n?Rf߫??$?A???????x??|y?<^?a?????}F?΢?$????߀ ????{??sGS???j ++ƣ ?vXS? e*Խ???Sdrp@?&{?+??xz|?;??5??y??w???|+?????m?8?????x??0a?#?G?0?\#???vg'A???t???_aݘo??g ++?Ջ??{t?'?????e^|???-??v??w??x;s?o??=??,z9?>÷}Ƿq~?????ޓ'??TFo?L?8?|?jec?:dkbgem?f??kp?'l???w>???ήDEW??ę?.i??*???Q??5?????/??xV!Y? ?:S???!C?tu2?$н??m?1??P?߃'?W'?D!??*}??,?9?8???{0???;??4H?T?d???a??f?P??z3?r;?????'??I??Y??U?$tJ9 ++w???K?$渮?" ?RB,N??`'?K?ud??ː??ӦS?Υ?ܪ??hN??:??Zی??H?h&g ??"??? ??4@????EG?e????)???3? ֕?\)?9?W??????O?3???}?;9???O?????{?5??e? dQ? ++}c_??_~???{?????;????= h?+jA??ͫ?k)T???Sl??x65???щ.3?W???ObcQ8g:??s?܂x??7xzs???Iy????υ_??79??w|?o???? Ϟ??$c\? ??z+p{X8?;q?ʞ{?!??OG??v??/??L??2???6\??T? ?@?g???????3_Cj?f??????E???e?? "3M??Ʉ????f??ϴ?Ut???);?o)??g/???;h3./???a?𣶂Z?l?d???B ++1Q;]h\<9???^=A?-?Y!u?6#?A/?,?3Q????E?S?=???Hwy~u?Us?F?>5pU??? ?/(8;ك?͋^ ?ޠMĨ!???Ǣ?1+Ê.nO?}???wD?H???K??-???DI??îG???=!??&???v??D?>#? ?d???J???:?GO ???-?\I???4?? ++Q????o?Ѵk?y?}M)?W?9?uF? ??&??W???&1???Z)ϗ`?????:?7#?JV~&?w?H?/?BY?{ׂ???S?O?A??C?5??7?_?F?l?2̒??d? ?E??B??pݎcB8&P???v?????kR#??mU,?m??o?+^?\??_Ԝt2i+?????{?z{??X[|????3!?Y?N^????M%G??OD?|??;r???5?H?'???j??? }?4??k???3??????>z?V?ZaQ?{?,?*Y???d)P????U?avm??q?????A9?T?#{h????g\?~?????#??{???]??Y?????u?w?(??~???y?EF???q?*a?<=\~P?ǂ$T??E????s`?\f|%????\?I&??z??K??ܣǃ-L??? hB?5?z? aV+??+Z?4?x???Du?j?j???+????e6fs?]??:y??ބ???}?? ?$?o??\??IL?6g??I??2I'5?U?Z??? e8? ???u ??t??T?&?Н? ?E2xXD??y[??x8:z??_8He??餓@?? ?Ӎ???o;?2???6O??A??|?%VT?l ??&?mr??? ?6?r???%? ??\# $X2u;?[?}?\? ++??????5?l??2?qp?)?l?^Wk̵?>??4CJ[????") ??????wk8??i??ɱ??F?ߪI?ʍ??β?}?????^E +?Ǎ?.$?T???2a?3??e??:??6œ/&ƛo????}???_????I??????x??]????o??_???C??c4!?????O??~?o??ӯ?'???o????^]sv^(-eb^`7???H?8?3?$tUjU?*vm?a>R?1?Ƅ??U??P'???+;΁????þ?F?^???q??ԩp?????u???.???+?\????[ڱ?n$?ԗ]e?)HQvg??ib~?n&Z;?c???=ޟ?(??7?+?j0. ?~???<?=P?'?0?A?d?${?(??<1??(?P[c? ++?0u?j,Z0*?(K?;.?/8?.?w;?v????B???????k?2UJ????d??????\f??V??jش%?? ?ϏZOhëcœ!?xE???sO$?y?2H??-Yjbb%??d??`o????H]BP@X???~?B??2?? ++? ??j??mj??? e?s?27O??ZF?"+?1??bW??[?$sO.???+?6??????)?????¢!C?? ?R??A? ++:$!H?Q?頯?B?^? ?$? )޷??o?ڪni%zxGu?.???Lg[??L??>*??wZ?? ???? I?A?K?n???@?H3[???$??? ++??"HI??Ɂ??:??HE{?OV0s}N?ٶ?ɨ??s??<'?????w_'??s6??+?:? ?O????r??n???%סU؛#?n???ͤ??!z?;???9????)?v?L??????=~???ʊ?dZ`???5???O?|???F?t??Af)nS??L,???K????(??L??o?`ދ??Z??&? ??_?^G?W?u#$j3~p??? ++b?B??K?1^Тw??\z??UfNi??~d?"K=80?%?h??? ~????g??m1n߿LaY???G??Ȥu???V ?N?W ???mj׺]h?;Q??X?R*B?X?~?z~??P ?&a9jH???qŔ*+JC?/r??:El?Ifd?????3???w??$9?+?J????0??[Y???t??bA?????~n??????:6L&?m?#? a?=??nK???,g?,d?WI;/??=???H?i?d0* 3????nR?;cr???7?? ++6??????M???Y?5?I??????2?kQY???ˋ??? ++?w?h?>8?w????t??x?dS??=?5Eʗ????Z?Ԗ??9>?W&˄Ę?,jܧ?B???| ++?????{??P??/??]4????????M5|k5??D??K?W_?|~-h???Rk B?v????B???yŲ??+?V???b?9????? ???w?J? ++?qm@6 c3?cD=?IRA?? 5p ++?x?|???WJ,?I?? ?? 4K /ȳ? IDATN??=??&?֚9٬Un???rͫ????????R??=Zk???G??2???xy?<>??޼?Ww???4a:oX??Vv?K&???vfY??r}?>O??Cn??????k^<;Pv?/X???E;C? ++??????z//X?????Xng???v???Bљ??Tp`??Ս?nߘ?Ʈ]r3?p??мj?F?I?f\__??w??JT?d?%Hw???:^????D?;F}u|#??*Ll?veY???&?h:UC?? ++]li?4J??e5?r?ђɯ? O????$??$b???NT?v???2%J?H??e(?8;6?=???|???}? ++???j?e?=??1?X?l??rX?UJO?@????w???_?? ?u`??Zɾ ???\N0???zYrs<??x?*??߲h??????????&?!??n?? O?/?R?쓹&>E?>??u-????~F?֝?%z???}?E@?^?????컛?D?N4c ++?(??׎?f??xeV?5n?8?s)????????H?"N?誴?}_ .M?"?cyXn???m????/?????o??Oq?^P???|?????]l1??T??b???]>?;~ϯ?????W?Ǿ-?Yq?n79?fs??r???NJ? yX??0ϳ?*?????G.o׍I???N??????o??O????̷WܼX\?|)?v?\&?p۹wϞ??????/???P 4$?DBѦӥr}?Rpϴs^:V:W???w????9VZ$RJ???$?ig?*????3e7q???T;B??p<^\?p??9?E?=???]=?l3^5?+7???+??"½???a??-?٬(??R?????ٴ?. @0l?????бj8?????!?=T?2???M??:K9M?ts?AV?9h???^?Ъ??xͼJB@??m?{?U???{7??@?H???? ?ը?(!??'?a?ij??Z???r?V]}???`??M ????H????Ň?秜[??ou?#.a~7?? ??????Ղ0??'?????ο?A???? ???$?15??7?y??6PY??????Ln??R#qL>Ӈ?u ??X??BSq?aGo&]?WT????u)~s??z?y$x????`K]??J%??uq???XC?yb?J?\??"?m[?P?U??!?x/??ӭ??c?2?}1j.ٺ??V???6y_Y? LN?S$4??C ??????rhI???NJ? VXd??d+hw`?ߋ?v???O?W?׿{;?w{??????v{?y?)_??{????8?sJ??k??㶄??s<\B??ZyI ?f????9?? c?7??JHی???W]]?b?-c????_t]&???٩-**#*??H?-I[???&?8dKv???~-??g{???~)?҆?Y"N??H?އ?ݘ????*3?w/??O ?????F?????&&H?C???d?q? P?p??r?uŬJq?Jm?7o??D?k??I1??b?ʋm.V_?}<*o?? ?2s<4^??x????Y??^1oKcW?p????7????????????ȏ'?c??????q?????!r??s??kΧ??????5???v? ?:Qʞ??`}b??wyd?]PϜ5??????RM2?,W,םk}?a?????{R????t~F?+??۴?F}7??pdw&?^7.w?S2Π???'??;?z(??Z+?.D. U&?ΐ?~S?]C?L??yvǶ? Q???r??v??vY؟A_ ??R?7?T?l???A?-P???OrXu9;w?V?d?Y?N?p? ??ak?ݩY?G??7???Fo?q?????H[0?V?l???{?ޚ ++I :B??ⷨTau??c?x??????K???:5?`?flA?????k?JϒN`?Q?????`??W>???t???:O???? ??????,@??9??OV????sĴ??@?;? ?d@???}?ϧ??Wp$?:*???6?m+?.?t8?┕+???)?YT?2?+`'?W?C?j4? ??Hȣ??FyTs?ke?%s5??ʐ?q?#$3#i?}+2??*ρ䉢݁PI["ɒ?O?y<8+4???#?N?;?(\z???py?G?:???N?E?>{???ݲ??B)ʽ????=?? ??yN?z???&??8??????e' 2??????2??,l??4?E?2?ٯ?٫N*Y9???R?́?-do%w???z?&p?~]??kD?????=YDŽM??+K1O?x̢r??x?ZX?mz??I??????2????[?Dn???}ݫbE???????pT?g?b?Z?^?%??D"J?4_?[c?ⲱ??iH?{-Bk?F???6???>?$A?m??׊???/Ԋ??yt ++?Ó??ޭz??O??]}??/Bt[?ѝ?߉_),??? ++???'o?/*)ٖR~ ??Η16~?A?Qo_?,?{?|&?{?h??g|?~?z??????=??{??? &x??H?m8+?zU?ȓ?8?~B??`??????i???Ƈ???????:A??_?PZ?u??󧟹?9?I? ++????[T????޻?ڶeg}??zs??׾?[??S岍??c .?&??U?< A??䁧?9? ??(R??I?($(???l?2.?????ꔫΩ??>{?5??????Zc??M?>~??h???.s??G???}_?Z?e??B80???`??f[?[?]ې'??o7?????m???㛿?\T??'?W?$????t?Xu?J9?uwu??k??q???Ғ????jܳF ?ū?Fo??@}~vOu?/H ?p{8??Oxc??9?9$?}v}M+#?< `??c?ݰ}??!z-?????:i?iLE?eA{??? ??|R|mV?-?;?~t????ע ++?BS??t?v?nbn ??????D?c????6?g? O?? ???K?g ?W??? }?~??F BVC??Š ??`-Axkj???Y̫?̐?s#+v??[? "??iQuiQMX?c ??Y????=??N??3z??????ϼ???$??D?7D>5?X?????;'.?j?]?գ?h.?6?????Z?;Q?#G М?͞?y??zf?sﵕN{?9?W?m[2F ???p?j?????vA?????$?Җ?G????f%1?= 6{???E?ILĭY???Y3??x6I? /???{H?n?A쏪?p?? ++?a+?????D???N??‰Hc?v?r??Կ?=????>=?LB?㤝????o????:#???`??k?$"??<??1?? ??????8?????֑e/?"pvBR-?_@? ?գ/?E2?k???????|?[or?\cʼnrW? ֣?[???_???????ÇTQ?A8??+?E91?v?[走??R??"?;]*???,????k??????>?h?D{?g?O??_??????KN???ބ,.R?>?B?m?C?yG????J?眫U?8?? v咯???W_??{??=?b?k?*?:???ƌd?6/???C????yd?kN7?vW??^M? ?'????_?/??ks?6??ģ?,???>???-ͮ??ߵ{.?|?-?Eg???\?x6???|0?8?}?L?'???9???V??(???P???:V8Mnu,?^? mkPE܊0???[??e?z P?ؓ??%?UI?KXv!?DV???X?7`H[?b^!-?+??u?dqu??? ?C???C???{????_??+)?Qq ?$??b?x,]'2???N?^??,?????ͷ?N?^9??@????????p??r??A???g`??b. ;r?m??e]??gc $H???;? ~f%Tׯ???)??K?&h?c?L;\?C??N|?󨲙>??ڜ????6???????y?\??T?\??b ?9A???C??bONP$ut&!,?????#??R P'?U??_?îq`ly?N0?F\ؖ???????????1,??8Q?????T|=???el??J???|?WT??3?gJT$??-P??#*?[?:ߪn????<*eǂ?&??E??ա???? =????ȕQp????P^?#???a?i?tq??D??}?~?Xn??׿?w}??8?'N}?n???eqs?N?B?4??ߑbR?+9???EloaQ??m#@?3mF?}\?WyH& -QM9Z????????D??sS ++?ج_ ?t??V kۘ?0?1?2????|@????u?F??5?C?????7ו?8o???X*7?.?????C?????8??HLŲ?3?Ì?_?Y?>?????tQ??j?g?r?ߔ??i-cg̞?)*?]_??]???|???#!?]??a?e?F&???C06?Z5?pI??}߉?Ɔ??????e???s????']??/+? ++S?????/????l9???????o??t}?v??`-/?LEp[\?.?w?=???5l???2????6? ?A???ay벻?O7@O?sk ,?ՙ??{??h???1??ե?[$YS?wpH?V ??!??S?\?W??????^? ++'????L#*%ńQ??\P?uX??8??V/?ϗ????????>???D????e?9?[??K??ߚW%ZG[u?r?Z1?dnG?~?m???:Ѻ????8?.ܞf???q?=r{?i6Sw{v:???y???x??K.W>?֛ܿW?w????? Zg?@?$?????_??????:?`b??ן??(?Z?}c??"??{{?O???UWuJ?^]Se??RK??"0[G?? h??S?r}s?d ???|??]e????'????Ƀ????????ң???e6"?%"?6>Q?I?h?8<@KP?5hѰb9??????+??????r????2???s??``?a?? ?jE%&A*??)?^'eHk??^?=bW?RC{q@K<.]+?OP$???%???k ???'? ??`F&???F)????:???BQ??eD??H??]U>????|۷?????_??5????ps?vZ?o4????K??7^?Z???????O(*???8^??? vū"?@˳vW?Ң??"? ?~?,???? ?U&?@?\?= ++?Z???; ++?3?#???i?j? ?Q?д???t?߃:=??d???塴aiF?޻??U?m?M?????Ft;??rR?^ p?QppJ?Ł?H2+?J??&h?$?Xitd??????0*???P,?1? ?՟?????"??  ???M?#???k_+?ן[A?XW_@j??G?~??`???X????5?J??$I?YA??A?X? X??R??dl???*????qs{ۮ??s???q?[xi?^N?c?sMu?[?y??˶?{/?3wyH?ۖ?ݒ??????iC?sȉ?#???? Via ?SV????io9%??[?YH???????"?~I$?????M~???2?"??<????E ?d3.+VX?T?V%???6?M??)3.???D?@GX?:?? ?Z?sv?R??J?5 IDAT?{???a???u?? ++?`\/7\???????? o?M???ó??@| ??4??(??&?wc?X??4?Z?|???ta??E4?????Sl???EkF/ =?O,???\/^?\2`?z_;+??2??}???w??،? &??zZ?.45??wo\?w<]?X? ??\????m??ԅ^??g??+??=?{G?Y?]+???yo??? ??h?z?2?+?E?$???gC:??K |?F?????빰*?vK?$+??wr߭???s?źn燹]x|v:?dxt׌??zl %???2?\??S?w?䛏Y???D?4O71?l???x??c??λ????}]xz???₏>x??r䣏3]?x??}???~?:?? ??ͳ݌?4o+??g>??x^?z?xl?8r}?????b{N???????$?s????l?????Ry??b?J?Y???1????w?'/l??? ???\Hb???N???ů??m?v>p??????rb?3e????.??[????7^?ޕ???T?_x?V?p?g???R?qj3????B?N?aL\O\????jT0y?R&?/????B-??캨a?1?;E&Zs?xo3?¼\p<?{??g3??r?????Ƴ'G???=&???W??[?8???W??O~??i?d?\>??t???e???u?y???;/??}?ij?#??#5??=MZ.$h?VN??%0?&?T?&1???$??$?F???8S䭀???B΂,?0S???Z ԍa?'??7Ɔ?U??A?4\?)Q?"???\?X??eꗞ????q?}??2V?nO???x?k_?^?_???5%???s??{????[>?-?????_}??%?oY??ߝdz??-??B0???yeIϵӺ??s??Ͻ?69т;vIOh?4?ܿx?O???x??=vS? ++L{??ܢ{?yw?????]??Ino?w??;3?{͘?+K?????lz)G!? ???Ή?=?J/?N??? ++??P?????HT081"?zO6? ++???e?$X??`51L?????c?Z??J??$?@ ++?t??? ?A/?5*????"\??n7c???? ?N???Vŭ?=W?c=j^uD??D+?p???J$c??ዥ??{??-?2?+??*?Bֵ????/?,`Q??1mP???v?v???$A?=?R??O : ??Z??q3?g?{??Ua??յKX???L???P?2/?J??B,??ș|? n??#???jᡎ??-?????/A>%?.?n!????&sMV?RoL????i????N ?>Skei˦?.DK??f+?у?x??|??Z??????,?~ ++iU??N>???E~?!??D>/k~?d?O?{e??g֭c#\??OU????>E@k?x????D?oZ??DWt%??C?$^9?_s???|? ???.?ur??|??????%~??ϓ?????{X?Z]]0?????6?9??D??N ?>k??????3?:????????ՙ????u?y??8{P?Z??}?x?vFn??`J??;?eƂ?????J??8T-?T=?W????0???݂?A-?,a??Z???c?ū??4ԉ??Z?w??? ?J3?N?????????????????v/w????G?X(@g???????w?}?SX?E????_?[??v???^?@q{????zf???????l??0???????"???T)̶?????JU?? ?,3????C?^3? ??V? ++c?M??9???ۂ~g6"??TR#?>q?/-k??<̠[Y?D̐?y6ɍH?*?"Y?5?t`?b?????^?ו???r?? B???n??o??Q ???Ÿ??;|??>???ս?'?d?6?????>??G?N+`??e?i'?ޙO???????????6v???B?Pg?L?g}?X'??[???>??z??????>??a? m?g?=?i?6]?U 5}??U??Q+??P??;A4??2<(Az&X?C??̓/??G?}E????=???hq?M5ia?R?*???E?x??J_?6 K??j>????,????? `޷6ڒ-S$hqBT?( ???y??x?*??Y??Z?'????????90? HK؏i?}?J?????8HSĉwsԃRK?v??'?E??u%t???IDMT?4?ZŽ?? ^O{?-p??y`]K???]?C?m)?J)?Z *J-P?????zT?=? Yu!C%?K????H|"B-?j??????R???I????? ^-BRX ??]?[*-qN?w2:'?K??2??"??=????ݺ??IѡR?x[R?(H ;?F?e\?F????? I 0+J?$V???????V ++?????xzx??J-|????????ܻW???????@1??߼6V?*tK4???Y???8?^U??;-????H??Z??d\p??T???????~F? L???6 _???x?~?S????I??Am?*n/??9?-EEQ1???????g2???m??U??;^? 0 ??][?0=??GG??$??h??>T???fܳ?[Nj?+g~߯?lփ???&?P?j>???BQ?v??k???'????I??!ݘ?1]????n???????o???poj??Q??%r??;o?????XV?C??D+ ?s큕?s??x?4pO?]?1???? ?$EL?/L??_???|??#}U?j ++N?d?S?m?XR???#k?ƞ]y?7???I?K?????xy|??O~?=?????_??????????O??OsjϨ*\?w?^;?4O?K?F??,?A?#pB/?]鼿??͝?É??%sZ??????9?d???qU.:Z?Xz??z ?v?$??C?r??X???a??k??e??+;?@f?2??(*F5??t?? {?? ?iϼ,!?i?\Xn?.좊J{?*??{???k???k???v??z@?W???8??8/?8Iqr2??+??{uJW?Y↘??ҽ??r??? ??"?z??,b3A????}5???M? ++n?$>Fb?^???,P?W $??????tE? V? Kw'x??햮?jA????O}N? ++?g'h?htv?7???5?t[?}?؃J???߇???;j?\?MF?m??٧>̣.?>=??&?N? ?Irw??Y-?!??*?;9???s]?.?k?+?l*+!??DG???u̠???$R}iklD?????Ң??.I[??B?6??xG??K?U4YG???C??%?6?Տ??$?A??m?r6qy???9?V???'+ʛ?#??????b?g}@ِ/?n?????A?w?p?????Y???>?-?'߉cd9?????s?(?1??Y?X?qދ??3 -??e?Y~?'I?l13?t?ke???RH%? ??_E@?c׌ ???Ŝ??K?+B??bY?ٓ#??`W'>???O?wp ++ۯN?>?q?g????57?'?-?k_~ʗ??e?)SC&? ++U+eKk?T? ??+??}e???j?HjT'??ӑ??P?`MhvD???k;???֞Ч??e?????r?)?C???}??????Y?-?f?A({?L???eA???aA?2K?????:?\ V??mh??w?Tt$ ?*??T&??r?=???}OU)?q???Q?;?6(n騪?]?Խ??7?v??vf????E?p?Aځ?x?ٓ???n7?4eaF??? ???N,}??~zx5?q???{*?'T?"%??? J?;??!$ ?N?tl^(?Q??^Iwݼ?@͐?Pih?^?U=5"??P??@?0??z?'??qo??vxb?,^?&ݫv|?`(?E????٨?5?,??M??V??6?????I??c??ڐ"??>d??Z??m??? ? ż"ɣ?4?ʟ?UE5 ++뺚??#8P?$r?N.?????:??d앱[?K?`6?????lN~??????A? c??VXS?6@??t??쑕0X??G?m9?=2n):?5?E??9?ss?^$?'I????= ?U??_E?l??s?YΪD??v????Pt??>7??? 4????X?R??? :{nPls?%H?J? MkT}JT3?V???9?GL?1BA??2?p??o?Ш?QUY$I~7Hш?. ????<ՠ??2?e?? ++L???cԨ?͵?????K\???JOq???fT????j???.???ޱw?'?????????+?^?????!?^}?˫?\\\p}}??#?g??/?1??????fބ???? S?x?Vb??8_??WW??????????Z:?̔??|??=^Ex??=?^???[???|?N?z9?C??Y??M>??_????_?s???҅˫???U(??O?????bU????e,?????PP???}??z,???D?e? ?.?8N!E?LX?.??x@&"?{???;?xL[@?R?z^,??y?>Zf?y?P??H???Qk?;??????^?ρn?_~?6?x??.?????p??R?&V?%*??%z6?n??_{?+|??}?s??o???????????Џ?x?1????'??<9T?"0Z?F?e ?? ??+?J????}?Z ?3@4QO ??????w??????ܻ7??????Z?|Og?\??dT8???? ???=?K6 ++?XcU ++˲@?0????ތ=ں>?ט??uG߿\??ﳂ??Lb??O??eĘ?n??x?f??r?V?AdM???h?I.?E?N|D??=!??1↱G??1??ym/@τI/??^Y??G?~֋>?7??s?X??X+?F?z??? ?]???Sb??#?_??Q?E?&r????w~?g !0??????"??Ӯ???yK?? C??h??B1?}. ? ?!Č?/?0]t,A?/1??E?8v???I???c??|?U ++? hc)ݫrCdJW?*]??7H?r? `?1?~??? ??}?4iR??3?⤲M1??B?? E+ٻ??4,\?|n?p[???F?S?SC??=5?i?????? ?D?֡mD??wE?,Ļ???1\?$???UV??o5?v??,?vE???Q??????)H?'??H???R?e????ޗR?X?ڋ?p'?????7??l;??~??>??{o????~#g>?"ň?%?%Z?F[1$2?(??ؙ? ???0?S? dŰ?ْ,˖,?I??HS??(>Q???_Ow:g???QUk?s?i#???Ooⱻ?=gk???????? M?~K)?a?G????Ph?g^?p?M{^.??"n?&!O?Q?Ƥa6???si?Y*?L?%??jV?9{t??V??r?????i?d!??$'????NٗbQ(q?"oN?? _3?Cv?wLWsAdb!N???|?t{=?rFV?ê]?c~F???ӗ?????6{?xָC? e?+X ++?o??5%}0:2???8E?&sƯ?$?????gfv:????^܆j7?>72??????K??`??ʔ?ؕ?KϏ?ͱ???-??d????s?1???λ???Id>$? ??>?????T?6??qr?5͓??9M?1];?r6?>?R?V??w???}|?kZ?F??? ??"ʹ?K???/???sܳZ?? >?+????7o`?^g3*'놴?C^?3?>??K\^?pK??߽????O??׾??s{??bsT???>??|??;Q|????B???wMbG?lt?!?U??F??_d? l?̫?4'?u?}3?DR{ƚ.?? ++Znom?B?J17??m~?xK?????D? ?????⑓??ɰ拆?٘?HR ++jͷ????=uaDū3 ++u?P ;?&v????9?\\??Gα?;-????.?y??{?=^??⃯????!vl/?i??J?11?;C5?A@ ?@??P?x ++?H??ģ$IQ?+?- ?A?a?5??$?a?ܩ?k@V?I?$@??5,?%?hYU?bQجW?x??, ?b??)?2??a??Qs?.ȹp?ݡȁrP?z_?? ??f??,E???Rj?:x???eL?gJw??3??%???????R??y???ނ_????????f?c???P?RX??;????????!e?yw?0p???\?u?0 K????d?F?+?G???F?Zh?g?n?J}?U??Seݎ?[^?He?pPVף?`?X??keX.??????.??5?W?{?%츱,K?p??A?9f(⎿ ???`?J???H3_?:2ZAE?;X??P?;??1?ɀ.#?X9Ǧ???V?g??eף??5/V?&+?f??5?,hViM?I?A?l?r??e?6?s?Y%??[?٢?|??;??[?g??x?r?zFQ???\I}???8???wtlF??~??@?|??1?NދYcR?4?%H_~???5?]?$??Nco}=???????????=,?澶A?S?oO *y?ֳ???? ?D?Z?|f?^?"?j?羙??c???????????H??4-sj???1f?>N???s??yFAA? 2?mÇ*??]?2?E?Z??DKs?ˁ?(gW???}??????????S??'?GC??[?|?G??E?kZf????f??R?-????CZĎI??a?? -k? ҳDs?uF F'??????닃??^ V?W"(2P?`e??SpB??i??ʭ??s??w??????B!?\`Fel Y??aՐ?? ?(?6????jA?Rz;??Seg?ܤ纑 ?e??RQT?3W?? ?Q???z?p?YlZԳ???????Qw?DR?!Y?9IMq­4A3?M??'>?D/3?;>v?b??? ?cVA!E?3k?S,2*e:??F:?rַb?٘d??8$??6=g??:I???XU^#????s?sQ:??Vr즿?IF/ ?U64?Ƕ?Ȳ?;ʬz???)ev??x|?Q?R?l????>\?q???????柟?P?6_?9?????l???];?c-3?҅Ny\?ٜ??W? Q??8?????l?V"??r?Q?@?E?VMy??_??W???????W89Ν??? ???g?????8>>u?FV*??? 7y˗???|?/?e?G)r???Z6 IDAT?p?? X?1`??3??bhkA????NJ ?u???"?qAT?]-?.????? ++u?z??r?Қ??{?/??W-"?T?H?QYy ??$??.o'???ˇ???????O??j ++[w???????q?xŏq?H`GbY?|?$?Fa?(?(?8$??wr'g&??$LYrt?? r%??9 3?#?0?*??(3?w?5?ޕf?=??3@ʼn?^R3?*???&?1`M?????f??=?R2+a?kPJ??F*??d??J??,N?Lj???#{\?E6?d?3????֙???Q?s??I?ُg?gY??T?.?b??????۝? ??xִ֐?CS ???*0?r-up?&gU20%@??????T???\???T?;??Y????. ?Tz/3??w9'yS???? 0N?xb??k'㾂?? 3?ݺ?q0z??9??C?%;?$?!V???7&cC? 2?-f?"Kr???m????ӭ?S?sN?4[?<3???s??? ?2?$?~x "& ???չ?,WǜU?_?%??[?R?RGs?2ˉ?}?? ???b???9??ڌa! #֊?7fާ(?s?A???s|?g?ϗ??˱??g?N??{(S?#?w??5{?xIY ++ ?b?Ͽ?$??A?;h?ɲ?q?^3?????gNĜ?:??Tch0?07L??ׯr???ؠY9B(J??FYx???H???+7k??{??o??Yp˔f?j?;;#?,??d????a??`?aQ?? ??l??j?ɱ2?-X4?pm ?/.rn??1?M??iFu?~???6??ؐE?????}????BG?5??-??yR?a??MC???PY܃?#Jm???5.?3n?????. ?????c ?U??ɧ??o??=?0 ?hMh?M^??$??e?GL??j?#)?!??L ++?,????Ț?Ak????? 5h?(????!^?nXdO? U?|U?q]?J/????!Tp!|??X??ݘ?n?-?????dIB?!??8??????4?ӆ?"ۯe?!????9??s?}?K??i\73Tk???%?w?v???7????(w??e???Cv???????CW??5?_???M???? Vh???t0Ǟ-?=??WM; ??n%???z??,????? ?3|~5߃ܝ?1.=Ɛ??)?4??? ++?? k(?:?S??Cݧ2Y?Z??}Wψ+hT7!ځT???9?k`??8f'te`4DXedl?? ?e'$??К?ГAi?^ju8????(#*i57fEk??if?Vo???A???U?Ij????=8?wn?'? ++ ???????=?0 ?Lk@??(Ip?ȳ?&!??Yu??|?t??,??T????R?+[?'Ҽd?0?%???Y?~?R|߃^???y?[??XԢg?A??????? M?ZaA??&???B?Z"??y\!^??L]ē?}IZj?Ŗ?Ї??u?F?B'b ?? ????lŬ\???????=??"~?h%??ɀg??]xƟ?'?{?i}ly???n-?{?5??' n('~?s?ǥx&K?{6????pɂ????r>J?VB?L=š???az_??m?@????? ???k}????իTe???l????g????8???Q??A?f?ǞR4r?}slX??\|???!|?#\z?KY]y?s?\?8WFn?j??]????`?^???N99?q???v?o?r????k????|?#ܺ?O=?7?[???????.p?~???,???7h?딬?Rpq ?=??K˻??%J?)?????b??p?4U?5pW!???`#??ap?????N?ܽE?!ձ?RrmG??M? ?W????؉r/??X???bX?ܓ/sσW?? X|?????N?R)?_? ++?e? ??s????????? x$@d?7?8Bi??X?x?????g1u?;?/U??????L?8??q_3?? U???d?K#?(?1?|??[?y????u??D/?!zW???_Y?R??Y?{??|?t?{ ??a?????P*??avO?(H?^f" E?'?8??/?P?a??R?????????????????ŧ>??????1?W?x&@????B??P?:??ڨ??? 9e?R???j?L4?e:?????9???em???????????z0?)~??R?Տ~?w???q??k?z???k?Z??????Ua?? ??),?X5????G+??Jy??F?򕋜??0?]?? {{????p?-?޿?nNj񲱋|??T???n?ݝ}n>?2{v(?Jf?? ݧo?uc??_?pr??:????x9?"^*? ?Y/zl??????[7?Ys???G?YR4?|ÃK5?m?55J??J?l??1?3@Y2j??Q%Z?3Ý?Y`f???[,?ìe??ūWV?H]2nNY. ++?a?H???1?x????o| ????8?u?b???+??\hu????^q?zk?@eey >[J?s?ȸ?????y^?F&?*h?"?Y?~?dݬ?ڛ?|h?k*?m??o???Y???N???@?DT??52R4U???>5?Rv?hp@??ߜ\k?a-?5?!?b?92be?w???B???k????L??2uAVB,?h?T?9?)???9΀Ԫ ++c??Y?MQ3?M??&*??4??i?Fk-?1?kyv????F?yk?8:ܚ??qll6T??????.???????3??g??-? ???=?f+?p6?w?w????}?8?k}???}????????????`q?n?Ӈs???? ???t??#Mß?A$??8???f?????'2j?&r?Y??~?=<'0?&N"*??):o&?`eo7????9 ?Gg$x/U?9{M?n??R?̽??Oc;>z?U? A?3U??7??=??Pj??A?-3b?)5 ??(;???'?տ???(??(˂???G4U>?̯??o|?????ZHaP?& Z??????v\??0?D=??l??g?? ++?????y????c???R?x?W????c[. ??R?"?Y?c???? ++U%@??V?('[? ?#r????vv?<+?????ߤP? ?ihU??q??"?h???OC? -?O??V?V?-+?}?2???m?ՁV??d?~ ?JcM+???%|ި?Bqңa\l??????NPY?߫ C?'?M??J#DP2?$??)Q???`?} ڈ??u?h???r?,?N(!??ʘ7֮eI?؃*?U.ؘ1v?*?@ %lk? ?? ?d?O??e??e?Af?V:?,?E?????_?E?W??R'bI??!WfD??????F Qr?iN?N?ׄP;?q9????????I?R?????|,???6X'_???????w&?^?Y( ?Z}x???}??0???? <ĵ ?????~KL?s??}??v?bO0K???I?T{? ??? {?~!?r?]c???iӥW{??P3pqb/?ZK?<{??QEC310?c?U????HѨ?4???|?7|#'????????[8?z?O?????6cd?>?Y>?q???^?t??e?ڵ??????s? ???????緟z?s?V???,?ن?'k???!??w?#>?k??au??/2?4? ??N??Ns+3???ز?;?IT?ERe슳?????G0w???,??j?ڬA?y???,H!1?@?g???h?ͭ?KgA5? ++&??$8oV?z?y??y&?$?5??5??ۖ??J?&ЯL?3 s ?jw??$?? q?/??-????X??W?mEB-B???x?!y2f?E?????g??ɏ?[?j~G????/???׽? ++u?@?P??4??H?(C\?f?{???Ķ,*K?T? PF*#??l ??8???q? *V??? |??~?/?ʷcDžJ????T?bHY????[?????ɭS??W?????p????>?-"???R?{@?1? ?^4KD?,]ܱ^?;-????{??r?????'???!???nm?z?:??N???!/?{?vz??*:z4`?r???Ժ???&ð???R??~??) agw??F??S???R]l?6DRh??x??_??3??Cl????'ܺ??FYV???h0@????_qtz??ɆR [*:?r!TY!U&?K?_??????y'???w?wH 9?5??\?([??f??M'?+I? h?t?~M??fμ??Ȕ)??E???I ++?T'b?L|wۘ?=?j??j?w悠y??;?Q? ?͙???n?Wj?-?o?v~???47?Pd???Ֆx?????R??}?????FYx???r????=??2,α?????O˽]?x? V ??????͉???\?X?8?Iq?r??t/V(??Tų?J Q霈??՜?v ++??_u6X?ʸ?0ֆ ???z-??? ?|? ++?¦??.VY?qP؋.0 a?U????&?????a\ 똓???K?J??c6?͒??b͸????*:*?W???Mտ[???oJ?8?T?m???? R?HmP7?l??T???FQ?b??5cY?{b???-|?Lu???????-?(֫???.sច(A?? u?F&r? K??_l????`?@ĉqS#?VÄ-??s;=+u$?[???R??p?j+H5?`H???1? ??:????,DD?Z?l8?o?c??9??%???$? )pVhN,????????k???J?E? ?? ?b?3?0u??F?ª??K/;??1{?B%??J?w?g?޸P?Ԍ?[ܻ???8Ɣ?h?bs????s?pV?te??????????,??[????姾?Cԡ???????g!+?}???o???????7????A98??_???ù???Qy?"o{?????Ort?2oy??????Ͼ?o????????图?k?}o{?????}???????|?<;??e???Γ$Dk??0DzlU??k??R?`A??I ++}?i_f ?wM??iX??6CT??y? ????[֔?1??RJ?j ?"?????O>?A???o??????9??M ?ez???E?a???Y-¹?????ğ}??q??1??@ ++?0???}?%??w???+~lz?Ĕ???]?3v??4a???Tn??[8 ??3?aػ??$!9e?I8U???j?????I??cs%??y?f??L@cr?R!*j???$?1E?ؚs????=???????????~??/? ++??Ajб?t? ++??7??}?W??????? ??G~?tr?f??;??;?}D͂?{`?xM?(??$~???D`Ώ-?_??c?m?}ńZ?;???٤????6?'D?S???s??9D=C1J??t?vL??c)?????;??XQ??avm\??^NGNn?9??a?h둖=??>?U????4F?or??}?K5??"?y????V?-(??l8=}?{V,???⫨c????4????R?u?B3???:2?P??*??=?m8?l?utB)U ++C?T ??Rf???=T???s;Ti?醵??3???B?Q_?v?lt???3,V?|t?7?? ???Nn|?n?ͳzTb?M ++?<??}?co??t?TIѓg{J???i??3-?v???F&????w>{r? ++ZF4?T?c????qd??b?*_-????DR̢S??Mv?y?j??1?vL?(SfC?9?j?ټ?e?C?Ƣ?=F?_Cu?6?[??^7?y????Y??::q8/?oId??&;2? ++cs?Y??cs?ff?6mt" 3?q;?9e?N???u?I۔??"{b?L?u?n?3???6?^????m ?FNP??I????6?l^?v???uN???????֏?rJp?}!aT??v1???l?i?>?DF:Q£?~?{??,??{z-??~???&V?? ʛ?? ++???V???o??[^Ǔ/Lf?ڇ?O?????#n??2_???0??-???>????????7?x???+?????ƅYIH??%????[?sZ񾙾?xk?? Yi?RJ????kI?N?upu? ?,?%?AY?Y?-޿???w?F??#?ٛ6??;w???W?????}?8p?h??q0w?̿??ҫ???*ò?? ?x驧??iT????@??????.w{~?=?w?W??fP?+?̢7??gF?I?.3c???r??},???d?5 $T???B?rR?? ???&r??B?hd?e???(?*?,?b???,??P??r??yvd?????SO???>΋GN? {pp?"?^??l???@YV줅*??Q?2"?Uᾝ{Y>????z??e??a?M?l?(???_??????s????PF?Z3/?-?+Y`?@Ʊg?ݸ??•??)?PJe????@??Z???mӰ*??E3?x)?i[?Ҹ5?*?????''',w}^;@???g5A-_??[?t??~??g??&:'?\?oy??????=?m?9????e?E?:?-??YY?? ??r??Fk??en?,@A?b???3ۨ?Wj?{,?iADyc/5??Cۺ_?ʥ?eT{???S?kg??SvM??$@? ??(ּ???Yu????͉̻݆?%I}]M?;k???C6?to?????-?fM?`2??L?d???E?X????&?"?L?|e??w???m&Vl??????w????K????8?~?Y?I֢7.}m! ++ͦ????e?????????p/;C ?q?????UBl??hV@ 7?2?), ++6x?0 2??n??Y6-?3D<;{????E???,\(?Y?,???&??%Z?d???,X??َ?.hj??Q6%?![`????<??zkS????dž?F?=(?P?8????????-???E,&?(Q???`??n??w?2L?@?~?E?N?/g?g'???J?K??a??{ ju,?D?!??9_߾???????:!?p???!???}?? ++EG?,d扔$??@???ZL|???1\zE& ?agA??϶@?nc???"Cw???*ӹ:f???K?bH߰??'Yk?fo?m?y??"3???x?RX?8 /}8?|=K|?g,l?4?x?B??>?GK?y^?1, ++?N="ً ;??}?????????y??_?by??4???o? ?~?????~n???א??;??7??|????u8i8?Q???_Wc<?????k?|??-\?&??9???w?????o???????˧'??M{????*?_g??2p?? v??????????ع?K+????ͧ?????? ?~7nw???????u??/ `???f.??q3??|??n:X??`?{?Fǝ?E*?p`?P?q ++??u??)?M?$FDu??r??>????????Ώ????׾??~?Ӽ?i?|?=??Y??????O\gu~?O??????????_?ߎ?rr?ji`?"?g*D??ut'?BɝG-%@??Ld???cs??E??ϼ??x?;?VQFM甛1?q??=??c????N?O}??e)/?? 7?+ܼqȗ?????~??ʂQ=??uQ?a ⸸?,k?|??ΰ?p?? ++;>?L?7?F ? ,Ka}:?ة???????:5??Z?u???-^??/??1mݨ? P???!??v??@w??? \z?GOmh??e????b??`??!'????y???8???fv?9??? f ????ZC??n???:2?+?Yzk?)?Qv0vv??h?H???21D?2?5???Лk???5NNG?8?Tw)E8???M?????B٭?s?2'(zz?Jݺ~?;??}HY??? ???bV???0L??(??`:$?T?gH?m???W4??/-???^?$!P?}?4?qߣE?3plN.??T??u?Dr:?W/ ?L??(8?cb?Up??x?/6?4$9r{??b2k?˭?ffB?$??o_{?aA?<?گ??? '??? t????ݎ ?`??G"?i????+V???VL?8wR3$????sf#????y?}K?#?s ++?͉O !?XwJ?F@?6?M?.N?? ؛g>?K"??Ҝ?5?qQ??>??>???I???%?D??y??şˈτ=????t?*E?o?,??{{?3"?̪ ???BF???[Y?A?J??%?Sw,@=F1J? ++?}?—;?&N&??ɸ;???&?J?????Q??wD?2?~m? 40? ?r.???H)uZK???1?IĖ#%???????? a?ߞ?N?ՠPb??L????#ĞL?Mql?cBP?!?UR,|ô?[?I??Ѧud6d??r? ++?¯_??A??ڬ-?_??}k?9dm??????Ϩ??G$Tm??ʤ"???gf6^?C??v?'?{?Kra2???? ???????? ??1T?z)}m)?u?n??}qL)???)???p?N??'?gy?c?|?{?#????_????7n)??u????~?w????y????K?\?m?????o??????/}??>pa?????M??^??+??O??#????hD+????7^?Kʃ???*_?u_̽W??o???S???G??]?Y5?????%???Yn?<?????????O}??p?٫??M?$?w??=+???jw?ϻ??????E?M?????B ++?O?J??b? A:?+m? ?x?!??`@?? >???Jl?%A?t???e?sJԢ?D8??b`??dQ?X?,9\?ܳ?????????Fc???jw??Uag???}+ZS?P??'G????{??? {?+???cS+??'?vWdp`?????bX?\U?U???ǛSw?t'??e3??ڝ,?P?????????dwW???dʾ%-2?t?7?????r^??k^rWc?8???4???e;? ??g???G?@,N????%{??sg魒???PCNi?}L| ?g~???v0????z??=?f?H?p?k,??m??dx@?????3&?/???ue?A??н?X!3+?~6?2???]ޫ $?7?a?` ??å??YT ?'?b? J??Nrh5|?a?????????%V;\?v?s?/𱏽?w??+9??ǧ' uM?c?g ??J??e??Ƚ?????[?^??+? {?u0??M0?Ai?ww?Ȼ?u?A??0?t?s??XQ?(E -ŋ?'q?.??C\4j?Tl????wYY? ??V,Z?d??b??_??b?K?i?f? ʫB???8}?$?QN?@W?QY0????e?w?jE????`?bj? ++G???W;???ύ????޾RG? 4?a???x??(U?I?e?n 1??ϥ?m?1@nl^ŧ???7J??K?d?Ոb? ?L>?,? +1??fQ?ó???q??k? 5?%Hcߓ?W???b? ++??9.??;???i"n?6?@X???iǥLJ?4b?S??????ר??ϛ???gy???2?խ?K?3?*?/?? ?mA?? s̡???h?O????~&?|???!?Rub7??T???????sL?hܛ?$tl0??ɯ???89???gYQe2T?(?n?????????????~{???6??.??챠ڀ???????????}??M?2?p???{v?Ͼȝw\ϑ?#v??t] ?0?+??Ux?7ӵ1*?????G>???w??.?bkk??"a3)?/??yKq???S?E$? ???q???I??.?????DV?????????{????? ?6z?0??M?k2QQ???H^a? I? ??s??(?JP??9?[M??`?'??J?͹T&Z?$*?IX??Đ9s?EΝy???f??ؠ ?M??kV&S??G? lv?g޳?[$?J?J@A?`??Sfeu?.[ߏ?5?djM??????&??x\C? @" U͡c??x6???l{`2?J\?S???????e?֕U@11?2?)n-??d????π??S?????n?lSc??X??? Q??Ṽ?o`?:C?????*????v?(?<)?.???]-??U&?E{??I?%?????!?.6EX????P?s??r?(VK???"ҫॠWo C ??TlH_GB??r??No EMO?c????+??v?????????eCH???\?,?z??E?vytf=?5???1???/D?0?B?^?0????^?滿???M???????6n????????_??????>?.>{?2??? gϜcst?_??????o}????Zh"˂??_z??˗x??|?`?.?:???8?s????v"????????0?p??iڎ?BGU솁????siu??N???&?j[?E??O?w??;A'?dsm? ??!??4@1t ???H-??Mع?K??|i?y?ˍ7?@ȝ?_,?K?J15??]&N5L?bh??F5???GW??#?ڮKǎ?????1v.e?:??O???? /?t1QJ??p򚣜?w?z??[???????)gw??U??Z???-??j'???#V ++]E]?iۖN?I5?&????Z!???ݧ??T?יLj?YfseD???X?????Sm`w0pW???B[r/?H^? ?%??R?k?;?3?E???!8???D??a?=??-e?W?n?T ?_C????vT?z?V? ++???PD2I?)?-????.?ޮ?t]7|?+IJ5?=Wp?㥤? ++?'U?'??[??,?b?:??D?u?`=g?USIȤTޣ!?֫N??/g?IU???^????}\???oW??.Db?͡Ćl?W??q?_???> ++???}?}o??+???c?k?Y??C?l????Ć>??5?!"?W??-f??Ezed???Õ!??B??孭&`0?2?vv????3,Ο?_???Ӭ??G>???ì?x???`??9??Q??I??ze]??6?? ++Ɨr?3eH?xe*n?שu>??,?ݮ4?*U?lVʆH?v#h?L BU???*??!??}?L?Z?hڵ??h9??ԁ?DrT:i1Gȵ???*?6lNڃ?1?U????r"6?hb??5*?^!$Y?ij??"?#? [?l?>?6Ϫ+??????? ???Dc????Q??S)??u?}1aUH???Tƛ? ?>?8?W???9???+?F?????ʠ&?J??L???I?G˱?N???Ÿ?4??????h?????:?L???????u?_η??4?%??&???$???=??eQo???o;.?]ꃩ?(??b???m?HOr?j??=?K5]&A?}>g?-?ve=t?)?Dq??r?_#?-?11?-}?b!q?ZX|???; 9lVĉ?e?????bo?pő?ʕJ?ԯ?-?1?Oh?A?߫?;\?????????%6?~M??`? 綸Cz?Zv?Au?I<R?JQ)1t.?9xL?T-vR?????Zb?#}?????疻P?ܺ?僖?C?[?=??vh??ʬ???U???9?p# {??:?[?fխ?K??cW0g({ނ!gr???@:??*?x?A|???t?ޑ??0???'???e?'?U???2?J?ʟ=?i.?7x냯??;??????s????ﺋ????|??locm???oy;?-^???hf3NN????Ώ??????ey???;g???=??&^??????tW?63????7?'?? ֪){???>Y???>???v'U]q͉??l5 ;? .??p????r?Q?y???“O??ocs???=h?b;w???9*??So;? ++֧T?????P???/0?8?;o?&?? H$???b?!?:?VPd1???ϫ?????????1?9??T ?s ?)%??7???e?H????E?HE?T?@?"_?{?=7"Q*?JP???L`D?a?2?q?'??I???'?W^???Փ?}?Ry?_^M1$cN?J? ?}????t; ++)6)~?Ŷj?N?,Q?*??Gdě[h?a?ĥ1,N?uz????k???E???zM??[ ?S$?9?Z/?L?k$hH???j???DF??c???L598??D??$͠f-j%uC?f?oX?'|A?|Rd????PG?l??2S?p??mt????+?3U?YMƬOk}?9?=??z???p????GyYo????????O?_?????𮷾?׼?0?h???ǿ??????????N?????Ꮇ??>?( ?{ ???g9?? _r??r?T?W??N???/???y???$,V?n?0N>$#/??yh?ݝ]??b???t?Y9V??Ŗ?ɈՍ???R ??k:B????v?b4??????H???U!????]?6?Rz i4?????R8?\@?e?B?-???0G?!_?2?9_?O$?:W?"?*ʪ,p??.5???????u?N2??~?S??ɏ>̟????]U????7?Ie>qr??i???? ++?Ư??'8R]û??Vvw?ؾ0?g?ߛ?$???x=/????????o?????7}?i6Ɓz??Os? Ǹ???s????3?˽???.('o[???ƿ????x??[?? ++??&:ky?s?q???%???w????.?1S?Q??e7?+???>?4??????X?'??????)?mp??>?藸t??=x?\w ++?;{Y:"#?Ʈ#'?*0"???pÍǙo?n??=B!ibu??'??8???~?yG֖ ?I&??G>?)n??$5L?Ҝ?h?g?{],?r?DKb??X_*$@k=.5-Hi?jh\I-?8????H]??jg?uV ?C@?Dn??ݔ?)* 9?h?hW{_%h????vfu?UDžs??&?TTA`?2?8y?GNpd?AJ &?-++c?.9?d?b??ǎ????ȪLWk]fTMa?d4??&喍? ?/??tD? ?"TU???A*W?'?uFR?i/?Ҙ*@p?y?dVhIUB;_P?#??%??k A;??〘????c?&SE???EA2u?h??lŗ????o ??'?/K?c_?????y?]T?P???e ++N? `B?dD?@d=??LԀ????U&Y?FP?z'k-=M?گ???z39i/?Qp"?2[?L????E?ڥ??A??%?FX?M?ؽ??[?w8?_?m=?%?͞????6??????앾???؟w???rrQ?P ZMp:9??' ??????mhK? ????A?m?q???4??M??? ++Af?Qo???N>j?(m?????????~?^=??c???Z?????aY?ܧs??y?.qP?vk??B??=?KDQ!"KUc??׵w?(?8??e?????8???;[?|؈?vI,???za]????ۈ?'?K????P?c???Q?d?* ++6K??R)?u?_?????m????ϲy?e?????Պ??Vd¯?????/{K??]?x?DG[$?1?TRvB??"F????{g0U??@?m93?gY???a?gȡO???+B?A?@k?F?1????d?V!=a?|???!?c?????k??y%??n?k ??H wp?l?rqQ?zL?0?C?&-|DO??q蟺?? ????}4{7?,^?ޓmV??????P?P??? ?gaM??jx????=??oyv:??5Y?I?(?-gx&* ++f???0?2???Q??P!?tdV?*??@??4E?SD?0???`R????l?w>?_%X????h?H?o?h?P???*??~???3t٭K??C!?K,:??ғZ?f:?0?9: ??X'?I'Dr??Qd:??Ք?????U?b C] ???-??.v?}??ս?O?⧀a??n?D2[???????zE-`????bϸ?J,?Df(J/???:i?P?!?UMp "??00,S*?Y ?f??F?@S)??p?˕"F0?,?'??I.???Ի???QUBm??R2]O???cI!?_l^? 7 ??µX??W?ò??Ǥ??Pz??WY+?T/?䒽GHP? _x?+?#???{?<??3O??e6?O???2??-?ј????.????????{y??}7??????Ee??͑??g'?Y̞7?H? ?Ա?2??S?}R?0?9?zL7?H;??/~?{N?????? ++cVW6??] LS??"?[/q?? ._ܥ#Q??Z?YX0?mٹ?˵??P?"g???u ?????f ++?qf{???B`B??2Ev??l?t?zI'Fuͥ?}??#?2?U?n?HaD?? U?_?3M??L׸?{ل!0??X??DY+??C??2Z??~?U?Wm쐬TUE*???R???(?7.??!?]??f=??]pZ???ad %??Y[??+s???$?+??W6"????`?AQī~1?1?1l?/???l?L??۝?W?W?-'?????T[?? ۹?.B?W $Я???4?n+??|sr?H?a?Υ?&T?δ????v??bG*Nd-?#??*U?m?VE?[z??@??p_^e?W?{0,?#A?ҵ??m??Ao?=?׏?>?H$??D D3X??w6m6ـ?????~??+-?D?2??ʍ???? 4T?-?)B?EX 4??±r4de??*????=?N??p?,|M c??d"hqQ?1\??ZvwZ.o?QŊ?? ????r??c???????r???~?K?^$?[4]?Dv{??\Hˡ?n?L?b#ڻp??T???5?=???ψ??G??>?G|??>?=??g}=????b?????????W󆷽??YK??&w????>?*?8?`?=?jiX?P-U?ۺY???dj?$F?$J?`?a?ր?&8A?Bx????(1R?????J"M??U?mbO?d?~?*B?'Lte?-Δ?'?+?,L???C?E???څ7?3?*G?}^?->???g8??D?`??YdT?1?ZQjr???vh????QE?st?. ??5el?v???h?7??????????#? S?Wqh? ++^?+?֦?F??F@i???????x???m??~d??ʰ??)?澣5}.f?Ɍd?5ѐ<_?Ho_쫬?7$'????????ڐ%?\$???v??6#>? ++?"Z]Z#??????'????T?*H??n!????P???b?k??c=?CT????1Z?`;???9 |?9K!?W?????"B?%???Q???>??FTkG%"?}??????Q??7?? w??- ??S?e?Y?! ????ON?7??a ϱ?-ܮZ???b??"Ƀ????!??λl9}?-??=/??{!z%`fuT?>M?ɇ???????N1[???}??P6W&?v?*??????Ϣ?1?o????}??ii?a??1Y??????/?????????U3?@dTU??C?r?????u?I?|? Nl$E>??????㆛???o??N?? A?2~qTD?>R???&~?qN???x???????q???z\=?/???O?@???k?#ЅY?4-??#F1??:??YtU4}???QMY J?:B?:??cM?b?O?h?a?m?UˢY??t)?B?΅D5????m??F=V????CR ?1?? ?d4W???2V??4WbP? H??8;@??*9?d?????d?*  Hg`Jc621LPm??f???|?a??5???H?5K?PA?5hǤ:??/=?lwD???Ru{,@u;??.I??DF??[vu?? ++????-9?U]v?f!?tԬh?=?a`??I[?? 9??5?U?O{??u?~?I?)"???ꞥj?^?ڳ??h+/tP[j?D?+?H\?oI?U?`??'W&????ҹ?}??=?h????2$8??y?]??8?c?^?)^Y???ڣ?;0?S6?$?^є??M?H6P]T?6%?x/?$?????8D? ++?OI?,P?B0????'K?=??N?9f?h?5g??5f???BőCS?xf?/?????? ??????cϲu?"'????r;???>g?M???Ӥt?Es??o~????)_X9????O?h?r???7?E7?C??bEZQH??;'???V4???:V?Wx?kW?ƚ??/\X?‹s?{?????澗??????"?}?i>??'????|??????|#?n??DR??D?? ~???w?}\?y#???D?/??E?2?{?=,v??Z??x?n???eο?C3?X?2??e??#1V?h?L׶?8?t?3?UM???Em????5]n??????G끼??w?+VQWW#??HW???!'?mfu?????\|??}???M??<㖻o ?tH????͔O~??dݡJ?D?1??ڌ?p?"???ҥ*` ++??E,v?#?똌????Uk?;uE?2)g????)???f?\?isK?-?/:???Ɓ???t??~b4^??u??K?h???jE c?#1H?:Z?????d2F??\?????Ct?0?????t-*?J"U?4Mbe5 ?調??A???A3d뛨]r?+K???"5????ɿ???=(??PG??x??X? ?X??!??zu?V??F5RK0??qA?  ++h?}?0???tYm\??????ɗo????????K{??Iĭ?Ԋ??FWW??=??TV? ++(h ?R? 0?U ++(????{ˣ+I???}?'??1?t?^ɲ?sQ(?????-??? P?Y?}^OF?~?{????y?&%p?K??\?O{??ʶR??????)-??FB?\?a!B[??j)?Y"?tP?s) ??p?=_=???r?y ?0?v T-??K?,??g?س?١??2???9?Wq$??(c@?b#?&'Qݒ:??n?\y??????%n?/3? l?)?b?蕝??3?-dAvq??^?????????6?+q? ??pPC?O4???ַ?????K#?3?J 39??*>??#1?~Nu??N?a =??c?S?????bK?F:???t?X%?u??RI?j}WUHd? ?2??Ƭ?ňK鬭@Eb2ҵ?VIҍM?Pa?e?EW4bU? ? A?\?ɴ?29i?U??L?Y???հ:??^???´?Y,???*??z(Yճ? ++?xN?यմD??B?`?U$G?? ?*?B??S!????!פ;?????? ++???_-??\???(?ynq??X5?xHD???M??SV????o87??.m?q?K?Ϩ?y?????????U?enK??k I -{zT???Q?[?? ?}mv{ݜ?:6cXz?U?%? |I ?:hZ*+?$K6~?????:@? ٜ?? .??6??~zp?2A? r?qI??R??`q??N>f??aɪ?\???=?-?{???? ??X^?B`?`kM??fa???e??ػ:???"?>(ʄ?P????]iy??ZbiM٭b?:&Z~&E?]?g72? ++??MzT????W?$X???-?Yo8B(7n??b?????2 ++?v?Ovٰ??kkP?|???D??mC???:?f}??? ++I?? ++kC?q??t?#???Ke???%Wƿ?:b?3C&d?,}????X+e$F'???[*? .?t?|???Գ????ň;???K?#??NLF?R??y?~?;??n?|??? ?Rq????/??l?2???s[??ݯ?{??.\????=w۲??O~?ENZg?^g?; ???`f.&????o????y??x???, ????k?J;[??-7??̙3?N:?2$Y?K?????y?v?II??.o]mlK?@G]?H,B???m??R?????Y?o??D\ު?1????~E ?̋[ՎS'??=?}????:D>?????_@d????6n? ??Z?݆&Z?5?????? {?=?9?'>???????@?&r ++?lV硬?^c8???F?'w0!v)G?Q~???{??-,f??rc?{?? ?-?J??EUb1?????͛ ?g,?"n??W?ϫ???????\???E??ژ?>DN ?&S?B? ++;?????-?u?n????εdM??*f?-4?u?0zRW?5(3T#????h??T??X̷?hkG??x??L?v8?Z?(??j4???1?L?c?jI??B=??`љ6?9r?-Q?-0f?S???L=??6y?䅔?&?w???E%?????G??????@ ++?F???))wTZ?I?\M0?9 I?P??Lt?f+FD9?N,?y,???6U?l7D ??[2զ?m?U?zr??b?a??*k????^?A2?ш???'>?_?x???U????????/l????}????l??H@????x g/???q??z??//??-??S??/?ʿ??^ ???݈/?)??a&'F??/????6^???P?rn??n?9?ɡ&???:?N?q?5SV? ?.^?c?~?c?Wx?=7?Y9y??Nq?8??C????K????#???=?5???kOM9TU?x???_?????b?%j??????g???i?, }{(?k???M??w??? ?`?p???m??=?45t*?*?fa??^?;%?얤P? ?;??Q:4t49?"B'J??(?Ă??m???i9~?2Svw?V?5AۚQ[??c?2?#G?L??nyf?n???}?i* ?ʀ&a?QՑ???K/n!u`??B?ߢ?]N???/'?A?f?I?z?Y?R Kkc8?"a??Bd??Sk|?3_??? `^!??Qe t5? Ɂ??#?"e?ٱ?ѝT?CG?c??#B??y??uV????U??X? ?y???**?ټ??y 2?+??ۅ???X? ++A6(??d?V?BX?:$ ++??q!? ??`E ?b??ʚj?C???,?? φ??l???7Y?C^?Yqׄ4-Y?Z???fe?jxt0?pW?p??)h__??8??#VatB_?Q?6]?,K?i???jרz?s???0??b?s???;x????J5Y?L??[???[???~$??%?*#e???{b??Vs????\^??????]?SK?e?????N?V ++0}?h??ڋli5?]?c ++?g??PՕ???5*?kn?-?.??l^?\^y?#"ғhPB?+9?>?????????Z?aUv???f???ZL??&?$)o|?}???eY??=_?{ ??==g?}DI9?X??{^???[?[ ??g???????????X ā ??????PU?GM???p?u?<}??tC<1???h?,t??e?o???^??߿r?,??!?N??E???$#! ???9??Qߗ??#j?nE@s???ܯ??a^?=? F7qZ??? 9?{???:o?p??????}?? 0??ͨDRb?~??)a6Ȏw??%??????!V???Q?????xw?="/???&5?????k?????????|??K?Sd?/r?,??]?tdY??dq???^?????????6?/?#aq?⒄??b??P?1??????????ۛ;???c???%?ʿJ~^=?W????=?Ϣm??%.l-М?Fmͦ?M?z4ŠeEs?(?uNZ ++?/ϨbE?#?A+4g?.u??I???&e?^?jͤ??-??3:?L??1s???X]?L?k??#?V??5?'??'?$??????>q?z??@H???5?QC?5 e???y?C????0RRFAhrf?4?ۖ?`wg?r?4"Ȉ?H??2?lRS?L??ɂ'5Q"4?,?Nh??u??C\????W?c?'? B??,?*Vm"'????`tq+?aJGO?{?1?dKu??a?9JjԚ????vo?Sʼ#?f??r?"ƒKS???v+b?,ɮO?W?????L?h?W?\> ?!0$???b?ի*$d??К?W!?(?]?#1%P?W?U?}9?g ??%M???? ?W=?|!0|????K?W-xrV?(9Yo?`}8?my?X?@?-œ ???,????n?? Y?D,Q?"??"B?u?(D ??2]F+?n??R^??H?j???GAd??iTm??'&??)???`-?]??a?R+??dk ?????I??|?*2!A??}?؞?aItN ????W??? ++ŜM4b.e.?إ?tD??瘐?-???7?(?K}?P??E?P?$?K?-)????}?m??N???R?FqY?km?s??x߉T?+?q????>??`?N?I????){A9??>?x? ?%+??_DAĄ?}?R?aDbMK??ִ?=?U!Ԃ????H?J)?L????ACE??????????9?K?Y??xƭ[C?????j IDAT?~? ?`?YJ٫BO쫓m?Y??;O?zv??x?j?T??P⚊?\?K)?W???]??êBZ??w??ݏb ?? ??????YQJEo??H? ++=9?F ++1?.Y?`??[??=M"Y[???`k?˱?2(?d]?`????̮?,{h??=??[?DT!w?O??D??T?H?Y??rS'.?ы&?/??E???bxAh?k?d?>?՚.Wu??]?d.??B0?[?Ȗ?v!ߵ>*?9?|?ϒP?)?^??a9z???.??f#??SO????&?`?H??xAs?d$?(J?]?j1???/0.|v??h???y(?(?? IX???=?bg?=W76:?ƒ?~????(?? ++@?X?:t??????????,?~?R@+b?7b} ?@?Z?($?KLV??b??5ɴ??M?*D??V? ,tE?lkư5??s)?b??S?˓?r w?|'??LW??p? ?ғ?Wr??G??\gI\b?B?? p??|?j$???????H]?Ĝ??Ϟaox???߷????|/??8Y1G?????? ?|??ǘL?2?)??L?BȾ?r??̵e????¹?p? ?Ѷ????Sy!???H?k?S??9?G???y??E??/=Hֆ?:?h??Y?ʰ??????XY2ϡ[??ܗ$??$?s?E?w??ݾP ++U???l?A?w?<8'Ҷ ??g? ?{VF#&?c>??'9x?:???KUfv????#̷????T?"?}?p??y??v]?^?k??@U32???L+?&?M??tn ???f?%?[???S&5???uFQU???GVYY??Vsd?ˣ= ??V???Um??`vB휶1Fu?B3???3?s????6g??e????Y??%?w?7??٘??W?n5\:??d?x6fڬ0W??e?ڤ? ?4D???"??Q ?S?2?O???@?h????L?P???%!4? 槝????7B? ++M y?R2&} ?D((Aٙl???j??~)??9?'R??,?P????*??pؽ? ?D?=?j?aV?%D????5?|R?QY?Α:ck?h???c (? ?ϔ?Qc?唑Pw?H)bk6V??h?R???b? ?`O$~?iط ?? ߿?s ?? ?O]?KǿC !0?1??h??(??i??+}9?8H?^???>??^N8E???z??~?%?W?9rj?7??a$]???G?N8???_?;?/??;6??(??T?%?+š??lS?H??????z[????+W?̦{?u ח?O??W?d???=?? ++~?w ??2ł?֭E-Bp??~!ZM?`Q>??^q??lQ%?Щ??l?^?]ū*?????b?,?rJ ?O?????? ??"???6Q]o11u?_???/?35??G?W?vLp\հ??u??, jb??pm|???+???v?tH??穂?"?]?;V???؞?????*&?z??S!iK BK??~E??? ?JO6?"?????}NUA:??߂???jt?_rt??o????^?~cVh??9??N ?n?O?[b7_c?X|?w??, ++?>?5 ɋ???A?`??B?5r??Y??O?6???}??????s?]s??3????@T?k?W? ?????H-8?;??????rj?0???L??ظ?͋O??チw????7?m??? !X.E?q}???se?)??jmJ???d??Fr!a??²?vQ?G?t?hq.c??Y'?? ???@???c???b?h??@?B^0??\?.1r??n????1!)x~??`?l?΂??????{:?g?0T??iQS??Y?j,????S????{?8???K3Ta??[?ZFՈAH?$??g??,!??????r" ???4????Ii??????Z[???Hb?? B@rM???{????mE!]ؚ0 Y?Ϳ??;#?????뜾?Դv??%̶?z??yA??t9??????e????ԇ?\v?h??k%?? ++ն? K/Y???c[ڃ(?*?q??m?TJ?b?#Ұ?,c?W????VT?3?+?"?Oׄ????9??B????i?????q????^??Υ?T?q??b?Q?F?W'???r?S?faL?l. ?v???{2K?g??"??g???,? ?j?)sH)???`?????"ȩl,?????V????\>???Q{ue?ݮ"?~^?aT?>dJU{??{o?>????? ?j_3%???=?c???)??w?v8S?~0?q????Ob2-P???:??Y?o?\/?????V{p ̢??X?.?C0???????,k?m?[i,????]??ܛ?G?ഞ.?h???? ? h1zY?W:??c*??7ۻ?°?a?l? ??/<͑??y??wpj?ϝ???x?[o$?3?mE???%??N?????????1o?]qlL?q??????????x?????s????O0????W ?:? !(???O?勛?ʇ??/?Ҽ? ?\ݻ?7???C???[?L&?f???s@??_????Gv]+~^??]׮??z??? ????R?ط?b?????U9?J?,/?,?? L?W?4h?yC??!¼?@6??? ?@#0???j.??0A??L)٩Ք??qP?f????`h?s??ܒ?l?V????#?=?u'O???6?X¨"6ʠ??????&ڼ?d{???H|? ????O??|??<{?????P????a@m9G?(??? ++?x??8xl?ۛct懤?U?B?A? =d?-A?J?>yQ-P??*???k?f?f??????B?@!5?z n?? ????ۏU???͹Esb?ރ|??G???#7r`?μ?VW??Ŀ???? ?nl?fn?????W?j?]T?i$r7~1[q??-n nwk? ?????JB?J4??/??=7m?R?wHr??;\?#???Q_???? ?`d%jM?9oVݮ??B?&o?????#?=?S??:?L"@2????6\bm??␘G/?s????i??h 6??2?6I??p??^9??d6?Y? 2?j?l2Du?????N??d?h??̧T???? ++?j?(с?o?&0?#r??s?????BkN($%???c?ۙG??d}β?3^??TK?*N@qrI???????NX-?M]_XB?;C$%?r?W?mC?yLi????????!?ھ??D?gT?H???Q%{??dk??ukx?l?"!E-??+W?+? ++Q????+}?a+?v6?Z?g1??{Y ++?Pk????z?{???!9X_ ++???)6???X???l?59zA?̷k?ȥv?>?Ӆ?(.?|\p??B???kwB???0????` =a??????a+?\t????]??KQuB[!??fb ++D??J??}s??ȼ??8^???"O?xEʺ?+Y&%v#?R?9???/ԃ큪@"hk?d???*?@^??,?T?r??]ի ?g????_??66???%?R;-̿?[?vֱ9vnSY?۪f????@5B???ϥ????&d?_??%-xM! j?q?4????wh}Se??W?Mj???e??É??i?????????Eb$?Ch*2m??c??xc???D?+?????&ި??1??AdXW???}??J??5;;;?A?X1??q+???Ҁ??:C2;s9???1Õ???L?j?|N?*1 ++?D??0bL?8~???y???8?\??i??????U!HD\%???dҌ*T?9Ѡ?8??SSZ#????3?o2?2??Z#???????T????_?r? \>????Ւ;?&?hȝ???}?e?q0w)8? 9!$뙗??> ?T? ?7??&%??{P? xϡ?ޔ???ԝ??z??0y?M E?k?5\YX8.Œ?[:?Ò΢???0???r?C?(?;?A1p?l ?Gv?Y?v??[?gW??yI싣??9?b?????X? Sh ++]????3D$S_ ??PU??D ???bgA?P3?-9R????$?-8????Sm?????{ef??n?'?&??VR.?????;C_?z(+fQ???):??4ef?b??????r/??V??δ?+?*Tv?Z?Z??:???YLJ?m$?W?5ϰ??? 8?5? ????*v??`e֨?W???؁??교??`??????y?ML[T??n???b??F\??8o????[\d???|?_v6?ޯ??N2PK??^??=7S;???,?XV)??]??r??pk?Bft칬 U[KU9|?$?????ٳ>↓G?q??9??˜??????????-???{'???V????>????k? ??O?l?]?e???????f%"T#?s??M????b??fu??F??0?Z`??*Ui??????4????'?$/P$?v??Q#)$???J>FI???!??4?Y??ZT? uˆYBۺ?wҿ]??D????Z?J???:%???J?\ ?b????W7??ꡒ???RE!J?(?m ???]???9A2??#*QZW?a'f?#?`= ?Q??f??? IDAT*',??A$[A?d*?u /͖?U? F? j???n??.4gsk?'ɚ??7]??=?ڔ?h??N-?kSQ4 ?su???0Ra?S6SWVQ??[?H?N?l??)?Y??E]og???v??6[`-/???z&^9??,ͻ|?????Ԣ䎠???????W?`?̂???u?F??M?0T?Q????Ф????fG:??2?^??"????m]??hS[Ι?d뮠Yzr'o??{?wK??ڎ)????c?R??5??? ++?7?n?c%?:??j??P??梸j??8@??:?+?+??yW acT?????_??ܽA?;???^?M?+?? ???l?]???? ++ ???H?k?y???7???h???+????vOѓS?8@?s?#Z_+????\ Q??I?s???r?M?[? ??i??t?Ȓ?7SY??El?g?G?R??3O???|?????:x 7???ϼHuW??w???`g*???>?u7??w??????4?????B|??CJ??B??O?>?wU??????W?|?ᅮ?O??+V?!?0?!s??+???V????ngg?ٷgġ?ޅNo?+O=?o??-?p@?J??|?7?????ҙM????8w?/??9[P?rv?????ʐ???W?a=??'w?-??D????[?rK?,?P1?YI???i?2U2!U???????&ξ? ++???G?ܣ???Hy?!k>.??칗?s22ۙ[??E?b?gl?R?[?Ԭ??#U? B?^[b?L?0?>?\??ZJ??r??ZP?4S??4)?I ?H?$M Ѹ?*"??F?M?+c' ?Yl????k?J?vY?? ?͑?(?=?J?H22i9x?0?q??-?qui?)?]O?V?-^T6?DO?,(4ֽi??(?????-@????>? ???Y+?|e]d??jKX?? ?|?X????(DWى?Y)?w?? ??Z??L???b?X????XQ?tǕ?? ++{?;)????If+h6?p] ?{q??&?>?Y???[??????\|?y????py?{???V?B??[??k?hr??-? Oɤ????J?????y?ng>?x?)??P\ac?a????l_i?c??????????{?????J́?G?_????_??'???>??<|??|??ǹ???9x?f?M??lB5\b90? I??xž???M RcEcW?E?a???4?????g?v ?IJ???T??????d ?@8t|??H????b?l??0??!Y#YZ?P??zoH???>w0?&I`0Z??K????#??d?p??2W?]" ???L??tO???V?@??&?P1?????l?q??y???T?֦Lr˚?? ++??BbDh??ZQ?C6g?. Mj?ځ9??<)?R??X?5??ʋ "?+????8?q?U(m?d'???>.^?b??=????BN?e???],|}?4??6?mM??,??>d?ם?k?q  rh}?*/??Է?S+?+?-'\?e_??E?? ?B??@ -???????_Gq?AUw(???9i?SH!!+t?gsQz?J?.FZ????*?{??E?????ƿ?ǂr?????$D?_??nO(-??]???Z???>???%??\??ւm+v`? ++?B4?y?Ǻ( ????;????6???8z\?? ++ծ{+???{?W??[? ++)?w???? ++=?p?{?nǒr?H?]/- ?}dP???(E? ++?V8?????^?X?P??cw0?^???X???8??~?????]?H??XXA??읎????b??OP+?f?h????̅??????q??^??[??? VV???'>?'??Ifۉ?`G????<#hEr{p#U$???|0??=???XQ*xa?u?Y ++?'w%???'8s?4?g??M???g???'??G>r?????!?o??̿?=????B3?r????z*Eh1r??}{+?wl??)ս?w?Ò?3?S?#????|N&??6??????*C?V??=??W?g??S//Q/WL?;??????0w? ?:?46?mp??>?!q?? ++U?7/????J????T?x???>???w??0N????8????XpH%P?s??[?{'???ع????-???l???˚PInU??9S?s?mwp?????%t??|??X??w????? ????????W???پt?Ϝ??y?F[?-L.o1a U????O?F??o}?????????\ ?ѧ?˗^ec2&2 5??$?b?J2R ?xq?c_???GX_?? [T?SFЀh ?q2B?T???ȃ:???????]׮k?? ?H?8? ++KLM??ݶC-?????Fc?[?b???6??" ++uhZ?X????^t H????ސY?-?Z"A??&?t@??????7` e ?Pc?Tzi%???un fA9???阪R?y???*?M?ͧ??tjV ?.J????6?????.Ŝy[Uf???h?X??c?x???%"???T????-X8?D???e?P/??'?Eb?X??j?VI??q??+?P?-?V:ƙ????8??????|?|?YT??????3??3???~??[W@f9~??G2? ?)??o?Q@Ogcb???b5U ?5 MUq?S???R????-?EnY??j0??˧i???g?a?L??:b{k?? ??????39??$s?lƽx?}?Sڷ???????3????ͭ???)as?????"?U~???g\???WhR?Zr??/??e???{??&f ??%N?w???? ??^??Qf??锕?=?q?]ĥ?l^x?o|? ?????????g^??'???>?mI!?%}- 1?9?Ah??I?"??_?H?V??ɘ??y?:Lx???"?? ?q;Vqt^??l??ڐ??? ++#S?????Re?4?k?hȹ?=ω??غ???}Oma?އn?? ?IuF?@?Ū?m?OX?iH? ++4?4???C?cii?pN??Rw???;????l?&? ?\?ƀq?,?D?( ??h?=O ?he?$? D+ ??H????V??n̑T?%1i?*?]csk??????i?J'P#??????ʋ??^???ع?i?zLCвGZo5??K??h+??Zp?3MF?Hj kQ?,ڻf??a?9?p{??g?'? ??r?x?bd?'?Ebqż?젻kr|? [?S?????H?q湓b??B??˸KeW?z}?? ++C?/?Y!n????z?9?{(???B)V?+T?4〈88?#??h???(8k??׶1??x?Ӫ?:R??z??~o?YX?ַ,bMj????Yo?? ++?Vn?cX?u}???3?Y=??e??8:????Y?!??t??j ڀ4V ++???(??܍#??S???Iٔ?n?foHG(??%[?Bk`?:s?ް?>x)?~?+?j???;?˕?Ц~?*;q??н@>??H?m?$?d|>?'-???^????CZ???6??O?'??:?C??(?Nsj??ic?.f?l?V?H91Z??? \E?n?????????r??q.?~՝/??)?[?????ꫯr??1 ǎ?7??o??{????`?ի3.??L???=??o͈?9mn?uEjsp?Z(ĘP??ݺ?g?bq??_??,?o?Ɇ?u?Nw?H?+-??ۣ"??q?Dq\?Z?o#ݩ??'??.r ?X?fT?W|??u???o ??{?:VAȵ??=??3?dZ??YfpyLZY??"F$?cLP#??l??P?F?????n?֚??u:?X???^????|?5-?<q?rp+?l??,??eU^???@??1D??rgq??x/a?Тs#C?v?Y?????*T,(!?퇋?V?C-?i?5֥?R??X??"?????_Y?4E*w?*d|? ?-;??}?ٔ?e???/,ҍ?&????j.x??C???????=eߗ?g??j??????إ??EM??H??????g??5???)C??]r?p??'?????1?u??^?Qcqsq|?yp,JD?=??%?????'!Wvv???F ?s??Ǻ??G?F/<#????I???s????3t??~P?r?ƀ?dqKz )???̆?t?S???67??5{????K????s?u?????w?v????e??9n~????O????:g?w???????7_+????bŅ????<͞K?y-??(bSG?0?ĀK??G?D|2?cΜ?ȍ?^?d?.???3?m?1?ai??+?1???/??O???????p1???$z?>/ @˳Cq92,Z?6???Z???u??v???tf????o ++;c?-H0?n??e?8`???**5?^?????DC4?;ۊ.(\լ??ZH???????.ȴ??vfz:Ig?a??@jLqj?{??E???P??<?T??փ0;?h???6)Q??W???? ?|??h%?1DjF?!?~?E>?7????-??4W???ç??8-0爙P W?O???9?.??????lW???œ???i' ?? K?wZ?e????[B??@???9˫K??????z????? ;y?Q|R???S??E?H??? ???:L* ?\6???PUbj???y??m??Ԡ?PAJ??? ???MMQ&?!???T#X ?r???]V7Pp+K?"??;??,h??h ?x?;@ T?dP? ?J0j??"???^t??]H??ս????Xy????Aŋ[??>?Ȓ Q?{?J?????w&????]?:~?o~??l]ħ??????Ư|?׈???[O?3o?U??U-?no????ag?c?[??'ָŸj&h??W?B?Y?ۖ??ږ???8&??b?o?h???*?? ++?y?o????o???٘1 H?????+??s??q? ???h'cR ???J?` ?6????\snr?w??v??ٸ?M&q??wr?Cw??< ?~??bH??׹Bk6{?^?cm}?:L-?s?????8:ܳ??57?>??_?&?-=??K?"?u?????;?1Xq?R??{a???j? ????H????-??????W,??? U' ++9??by???"?`V??+Rj?$?@?!?9?fU?j?CA?[?+?h?}o?j??[????$??X??lV??v%??O-?Y?BqKEcj??XK???????`???( і n$?$?.2??y%?*0ڼQUR?̺???~e?f?(#9?a}??? Ya?nd?E.4?"?kxu? ?I? ++??U?f?D?T?-?Q???;?rM???vL??8=@]?&?? ??j??E??̎??Z?q_c?[?@?~?+9?D??K?!&*i??q%??V??Z?1\9ƪZL?????9?}?#q;??R????E??P??1F'??P???WLтv5nY???bg??궭R??2?*??? ??????? ++?@n??Wl?rE???=????u?G?zKړ|???a?????t_???sv???`kX?????:u ??+mm????ږB_M?$T??2?g?\'9?2?? +?O??s6%g#IS|L?sB[?g[???????bE?R?????a?+\C?nX1?"k?]LU???{??f(???9/|?ϋ????Ȟ?z?]Vޫ??&?*??4cD??? ????ɥ<&???Rp\?Hsҷ2(???щ???Ũ??|?3????|???K?.?ќ????޽??z???%????O|????w}????]\??oR?)7??c?Z??]??$Ξ??B ??壘????b?֓?n???A@?L??W(=b?;???ħ????ヘ ??y??/07|??o?7-sI???^????.?qa??????? ??? ?&p??]???_??e????3?v??????}???hB?/??)?ﻓ?k???????? n^?????Z$???F?*,{??T|M-?/????ؕ???mi?7 ?+?Qș??u~???????????ؿ?G?"?eG p?[???pq????&??ܳ???q?C??{?e?y?|??vK???7????}>???pn?pxt?y??zUA???hX?_|???؇>}??#???w??ͯ=????????鍏qz?G?WXv?:#g???%?????x?[??[׭????_?0e-?Y?F?C}?6bm2???K?q???|??? ?;[?? Bl???잺qs?&];U?X?x???TXV?/dF??U/tX&[K$?^??;msV????)C?gm??ͬ ???? H ???XvR?t???Y~?(??,??4h7%??I!%?ԭ??{? ?LgLc?T rnjG-W????8??F?p@???.[B??F?/??2?.]$a!sR?A\Kh??S?,???olqe??xFZ?$O????y?D??ȁ2??Em???q?E??? ?+ ++f??S=?/?; XĔ/mmt_`?XC?:}?h?'Ž?N(j???"F??v????`lj?P?|??x?>`?????G???v{#???;{?s??,?RԿ?????'*?z֒$+?Ty??~[?$?y?T@??!@??ξ??&?F?1??:Y??}??\}?e???򾷽????8???`??K???v????ڒi?"?]??ޱe?????G?????3]???ԙ??=??qW??]?(??l????R?j?кD&?a?&?6??1f???O}???./??]1???Q?)?-?$?'??????? ??Wܸ?OX‚??i1?㛳????98Z?:?:?@???ot?s?z:Yo]g ++{_?e??ɿ????l??b?b?????J]???1,H? 3%???Bac???(?V8??ƕ???$? R????PZb1???N8?[ ???1󢌚?8?|V?qp??ӧ?ܘP??h?tYXHKK?%&B6??????l?`???p?????!JY??Q4ڒAY"?d???)IF?2%!6#6/?e1?I??n?????#x?^?n?E?u?}?a?xk?^??>????(?&?kQ??tJێ??JVA]??1q3'?d??????;"ͦ??aL?,?4????S??)?????ڧ )O?:#?HT?8`'?2%ڤ.???6i%{?N?ˆ?'؂??? ???Ǻ??????Q?xMn?j??Z??ILef?&??ǽ?E1??WY?ژ HC% ApeG???IBc??ۻ?`??f2????y?? 5kwq????`?????*??[N??????y\??.??;?"U-??????l/?s???/j?1?-u??????.>??? ҟ?ulW???Tz"?\ ???Օ?d??ո??,n?O0??f?ޞjֆ?5x?P???5;'?C{?j??TU? ++?Y??B???W?Z8?@?!??ֲy<2r??m?]gv_ ++fK\z Z??!37ÕX???.??]ў??*??????;?9j?????Y??vT ++Q,?&(qe??8???WHzh???掠핑o??B?PYHv? Ǧf g?G??]k?|?عY???X 2??(N?.'?B????G5+??Z 1? ??z!?_w??{Q;????g??[Ɠ?dt??W?????,?^?}띜????]??W~?=???g>?N$N??_ᓟ|??マ7???~?c???N??{1^???bDN?6?? n?l?h=?U??J%t?$}?V???b?*z?"?n?k?@??6?x?{?z?n1???-7X?-!?a}???{??uJ?K?Ӗ?S[(??a&?GڹŮ.10;??А?7X?^????i?ǔ???c??L?????t?_<=???/????|?r??Y??ⵠ???f??+zڸ?>Ŕ?>???URÐ??x??LR?[Ͽ?|??~???H)?r?????n?a? r ?-?v&[3??!?.t?A飤A.???_g?Se????48X???f=gd???????G??*?yg?????88X9?啅? ????;O=˛y?E?YG-??;t???N k?ABG cN??G?cvб??Ц??6BF6?K??????.?dÀ'????;?cw?T?C????S?m?NUo?k?6?????# \??.})[`?1f]??>>}p޳?^}??E?џ?0?>?,eH?????z?????*???????'n1?O?Tch??U????U-??=?[??D?ڻE?????:?' ϟ???/ӖB????$??=?S???cJYo???ӫJX??沒R?8??8??8?h???????Lٖ ?2 ?iZY?bC;/?(?dSt??$%eaB$tD?'???? 4 ??? ?gϙ? ?? Uq??Y???=???y[0?m? ???j?/?????M?H?Z 8~?? ++? }^??!??%???2?ge?~??kK%!9rq?O#X?Z??Y1?U??~?d.??e)?Z?AB$g#?Z???8?lu??O2%}??H鷄Z???{?g????JH?>Wr??ԭT???X(R??z.z?9D]??EW??0?CA?sf???߇tť?U?????z??⩉??k5O????*^?????C???????K??!5/x<?|????0X?K%?T?K???1nQ????=??!'???JNJ???x? ?&?ie`V??vϥ??B??q)??NJ??P???ڄ??_??Wx????U?&????4???o???f$?H??????|?2????u$n??/=?S??.????9%?????1?j???j??(?Q?1?y?M???ĕ@?????Z?zΎ?,?A??,?=V޶TV?D?$b??$?$S???7ɓ???L???P?Ų\???[??p??yڅ"1??a?J??ߧ ?????e??q?آ? ?D)?o??]??>F?cN_8MZo`R?"1D????z7J??MK?J31??U??zm?????*s?|>TlKV? ?Wͼ?^^??*۳>??%Du?$?~?*???[D??a??z?????bTMb?k?I*?g??C=?(?9?? U??V5???Q$G?` L7??(V\??]Ww??N?O7?U??Sb,?JQ?YR??k???Gc?????????(w?鎻x??y?????>÷??2;???m??;?"w??[?????jU]??=+S?x`,??;f`{j? ???Tdh|e???ǣ? ++*}??>3??Vz ?ث?6?I?1?????.ˮ徻`}g???M $ř??%H2???p?? ~????????????|̬b??RU?A??QU?z??????e ??Y????9?pM?????|????{j??5a4i???b?h4 ??}^?+?S$%??U ++?4???Ư???LU??}} hb????????1W??dk}??~?EjW?x&6?\ף6w6?7y??.;?[?T?yGHPr6?G?9?/?v???#b^????6ih?9?4"j?i??$0?H[,?H^?? ?vƸ?!?'????Έ?bA?8$2????v^f?? ?Р?N??9i! ?$(??>?`J??E??c??E?A???OЮ ????D(??:"#??8Y#d(m?Ω-?n??{f?v?#[????>?;?ݒ??ĸ?ժ?΁???h?sҀ4???Fb?g?^?駿N?2????.|?,/?]w?|? u?1??U?#??y?Ԣ??e??$֛?]/ ? ???R????0??G)?VR?l?@A$WJ???ʋ?ˊvҟ?!X????Q"?J&D?kA.? n?f?Qm?b.?ϯJ? ++4??Qm?ڜ??P???~???*?h_??X9N????],?-x??/եB$?i??g??9HpŢ??V?Z???j?յa??u]?*,Y:E?z?i???? ?Ɂ??V??b?Ns*'??!j+?f?$?ls?- ?=x?gl?H0????gZ??}Oy?$??9B!G?S4sD)?ā?:.^???tmF?%q??6?Q`* ??U{??}???eJ??~?v????M?yǃw?On G???Փ_???~???#??????c??%)?ˋ????J???͋??x4й7Ht,?ƞ?[?>>S?y?? *f?X??+?kL?W ??Ƹ?b+? ?Vt H?p?? ?H??C?Jh0??J??+?Ԫ?k???r???mH?? ++=??;%f?WZb]????g?ł??jT '?\b???^_?^??uܓk;???l$?y?H??ҢŋYc??D??d?? ??'?m$1?Q2L{?*Fz??i?$???^m?+E?𓱽]?4x1?E?Я?????|D?}R?3?F???~?????????*????+?????ah9"??d?bcLh%?uB???>??=)ٳChqa~??ig~(?? ?;|:?? ???????j?d!?p~?_?????`??I%8??[??b?'?,???GI?h????d?MK?,x?S6®??7Qj8??[??"?m?߫?N?$T??^?)?q?7?1̲?k?U?? ?E"\?F??;?8?ˆ.?|????seJ??W??=????djo??? ??u?5?=??y?>???옟z׽?f????=ć??(?y??޾?K???}??? w}?"??x???|~?vʹ?c>??1I??i1?3O??3?x???]??}?*~޺n]????? ++m&5????=????(?t?K???i??u?Z?`????:?m?B?pf»{??.????B+fѐ??^?C?????lS?P?p???????? ++? ++?;?00?,?C???=????????Zs ?:p??i??h?X ++?y?ol?????????????J?P?\D?=w?bݯX??Q3????LVT?9st|???1Ȓ??`#?ٺ?ɹ?m?X????;??n(?Wo????b????\;?N??1?Px`?Q@(?????ʊ??8?P?1^%سX?Sc?dzݪLܓ???ʊ???{uA-9-??ߐ??jkk?Ź?[b??ϛ??ZYȮ6????z????? ?bJOE??)n}Bl,??? ?e??eN-n)???J??;9V۽a>?W?- ???i???zv(?o???ٻv?/|?Y^z?&??}?x?]???;x晗y??+?\????s??u?3?????'????Zu? ? H??[?B?dْ?b?VUr-???W???'??????n%??"q?s??r?hg?|?EgW9??K ?s??Y,?HIh2U?`Q??H???n_coo?????S??Rlz[*?K`??XKoׂ???tR7?GSC;/H6??ͪ???n??˅?$?uFn?,̎???&?)*?&,?iD?%?@;+hb????8A)ܸy???6[?[Ϧ??q*`6?lF?~?1z???4?ދӛ3????`??? ????1O?G????? ??K???ۻ?E??"?????0'?_?gm????et?&????),????I?P?!?٘lp(K?Zd>?'????D)n/U*?"X????r???0ۛ193?%??N;B?̺9Y?Z?????~ ++??%1??w?ز?ҁvll?q||?O??.?H'U?`?8?J1S??3?ީ? ?????}???m?ũΊ?? n!_?@=?P=??XB??_?P???????6+?Y??>L?W,?+9F???J%w???@?? ++h????Q?i%??X??Ģ????'?y??¯}䣈(Wg???a?:???5n??u? ??,`qſY?4??]??+???????檄(WT??=?)???þ??s?k??E?\?i??!f!ed6@Պq1?Ç)?,.???- ձ???t??B`?+X?7̡?L?l????f??@2??ֹ?????\?Tʠ???L?????R{??`*?????ģ&??a?C????ոS??OO???x??T?ş1+ o4b_??XQW?UE-???#???~??;?Z??`t]35??g_?-?w)F`B???]qU?;??r???A????K???k????m?Pg G#S??Q(?????=Z?"D?&j?ˊq?=?Fr,?t3??*#%?"hT??+Ԫš!? ~!?,H2? ++@vR?A?z?FEC!t???TDA?:24????0??̰u*??]c?=? ???d?x`?????Z??(g/??????$S??% ?Z?7I?Kcb,F ++cI׺??HX??KC?&ϝ:2??!KK? ?6F,???KӒ(c:w???D ^P?=?(D????;F ++???%??>W? ?"J??jO??"_]qb???u??>???; ؂???/?a?z?VL?n˪?@???ۦ???R?x?`-?ɡN+??趖????`?'y~S?t??g?z?P??)??S :?-?B?Do???vDZ????\?/???v???A?RI?1?Пo???g??????????q?ql??? ??? J?z?֜$z_?Zd^? ++j???,??c??????j?=1?/Ji?5??WJ/H/V???A??x?j?(???mk??E?d/??q?LVqD???ǺB(m?ϗ??yŨd?[Jb?????Xk9$Ŋ?u.?|+?}?????s%m??O?? ?????R????!+??I,^?|b???~??О??*?䚳+2??Z??????S_x?w???????.??X??5ǁ??C??.?(??????:٫?B??łY,?L,???K? ++`A;???v???{?????=?r????en¤Y?-???? ++?}?RI???d??G?Վ????????'????8]欥Ǒ?? ???y?9????L6G\???S??!O=u??ڄ?h?|???W?ë?? o~????s? H?$???p?A?R???o ++??ʬ4l?C&????????gyכ2??7Qk?F?}???tE)9S u$Avsc?O|?[???V???u??u???,#mTJ?x?{??s{7????A???w??׿?[???C$&???|?=g?/???=??sYtS^z?;ܳ???? 7?????FqZ?K?????????RJo?aA@?????p????AE?wி??? ֥5?3?Q(j}?J)H*=?6D?ϗ?9?A?D?3)?ܰ??3i-?T?˃ ?iT?D?bY-= \]??6??J1?cGFb??M"?Nq????ȉ?f?k??v?n_?`????,??I I???a???!Y/;??????\ȁ??Q{X[?%0?-?4C";*????JNi 0??(?Z?o ??Z??sH???h??'5L??F șA??[OPl??C?X???}??|?#???W?Ǔ???=?C???G??ZSM?ݨ??ѹ?f?5>??٫k_5?^?k? ??)lT????@?zث??{9??$]??V?og ??j %??IUP?TŅ=?hm?JV?=? V?ͦة1????{??;?? ++Ra?d?3J(V? 1??Z?@P?T;?"?db???Vۼ,??v?ǯ?sg1??K)<ֲx?4=|7?k8j ?????????l>g?e?-N>E?XJ?VTb??U??)?WtX[ַ-?:?N Q]D??u}d?????????5B?CaO!wK?܂46g?????t%C?Hj?t#%?%?`?h?:4C???`nyM?R???`??Ss?P? ?m??%(?+??m?????XE?o?2t???sr???ѬJU?ԋŭ??VT??s${G ????$K?Hp??2t/;`???ň??(mV??Db\#tB#?????$??"?2?]"+'kg?Ւa?K?嘟ĕ?f????B濫???B?^?:?kK?!??$??l????mr???VME?N??????y?@???? JB@k?`? ??q N?)V?????g?z?U?w ʀC?;B-?Y>DH???Ӣz???xl??????2?=?]???˰6+F~8qi?*?t?M%?Uk?J?YٗE????J??????? ??n??E??ߏ?-? ++?^?V?q-Vb?̼??.v??~Nb??7T???ҟk????V?DQ?m?R? =??}W?td?g?D?Z???{ ̾pjN???G?=ȡ??Z?hC`? ????^Ԫ??W??G?=?-g/???}x~d? ++O??>???'???!?????3V?#.tlBB?!?1??~J?9????m?O?g?]??z?[?.IV3????si?z^2`Ec?=????])??/=???Y6?#?l?$~??????뭚*iψ??xP67&?e??O?7??.?%???he??D?????+???{yǛγ???;Zr?????q???w'?p?.?;[̦3???+:?W ??*Ôu??%Ι??c?d???P?.?풬?{?e?E??o kXXٚm[?x?-(l?u?˖??? ++???ZRq|4'?#????%7??6;???g?v?e???wX{?>&?5??t??)s???S????6?-?-ZR3q??mX????G?j??H?̳p???}?????)?? ++bx֫??s??gVٿ??v58??F LDro9 8)Vz?????Y???ċ?Ek?je??M??/????\?Ժڱ*8j??w H??(ҕ???? ++???H? ???9??欤?8uj?x??S?7?GM?|M?@9QAk$}2eA?`?}rM?? ++???w??rg?_??????&????A?Ξ??b?bB??h?? ?{s?U ++?i;????????]??D?2X?%cU??n?g??-~???????O?m???,p?Զ??X?3?]ي?=0`?dBtR?+?B?̜9?˘?.???-5? ?O8s?7o?(???#??w?Kr+l?Kt{-uJ;Z?????&?2??????W8w?9n^?d??)ƍbC)????^?g?g4?D)?Ef?`Y?ѥ?}f]C3qs?4?????X{??-?|a?(?[oQ"??VZZF??????i[?c?],????? uH ++hg??6?QӐҘv4??67.??* ???[ᥪ?>?? ??=???^?KUA?;????I??? Œ??SQ!V?ALacd????y? ++|A?™?iZ ?-eX??Xz?:?߫?k%?????Z??؀?# ?G??λ4$S??ȝ+U?Pe????J?4?Z??HH?T??LD???1?& 6????t??&???FdLj?)j?a???-1_?^9???ˤb?͑4Z??;??????????{?2?{?????????T ++?N ++?:????Y ?Ϲ@@?d?Q?$?R gbl???=?Bv%??? ++?&:??=??f?t???????6W5? ++1?%?D7oi????/D??9??=???(6s?/bJ@???J??-Z????"%!{oK+???H>?K????⾕?????\?}eȮ*??? JgB???. ]???#?}?(? ++GkD@3s? ?h?VX?Jiq???/?*???)@eD)3bZ7?qkE?2??4?'J?????G?M*???Х??O>0?+qm?7S?Pe?2?f?沢'HG?1g?????b??u??Z??Z&2??)?}VS??v"????=?C??",>ǰ?ZBh(? ? ++O?5?E?\]???%Uu?ͿR?yd?4?9?%X??D?|?Oj??#b-?\I??*?_A?c(b??Z_??b???^V?????WtUzPsqQw????-?????Ǭ?LA?2?:??y?祥???O?1??K;Vc?L??}!???H# ?"?j?Gs?dwi??$C?C??]?}Pq??ҿn????A???1 ?ֈ+??gׂ?U?$1?3V?j??J?(?{??^???^????Nե??' ?? ++S??ϱ8I??[?????~??d?;?u??;??Q0??+]??W?!??W\?*qG??v9#?????frp)D??i ++)??//????x???s??m??n??{ 3.]? ?v?F ?E?'??"{??/?????M.???\ιr-8??[?m????-~????;?*??=?Um?? ++Y?lZ??aKfuZ?a??B?? NB`e??[_?(??D 0!Xl?9?ws$n?4@?C???d2?O??k|??o?=L?td?& HAi???? ) ++?l????}Ã?w?e~???y???????Z?,,&??a(9?Hd?X?^?,??]w???8f{#? |??????????.??º&6ϝ? ?3?%G#?y?ʘ܆??y?Ţ?????{|?k/??w??G?w7o? ???U&?*??(1J ???O??C?????|??o!????g>?W_Q>??{8wi????}\[,?3 ??a?z?&??ai?4 ????3w?m?q4????p??>^x?r???נ????,`ſkU??ی?6???hGr:*?h}OuT??->+?R?? :? ?Fr??@ZF??B1S?"??f??=?Սup?? t)????aе????$???.q?YT?R ++2???K?9? ++[S!u????fN? }qї ++Iqk\????I???2?IT?:??˿B?s?Y6\ "f???y?????.???I$???-??a?߁?????? e?I?+S$ ????4?]??9P?.?P:?!??d?.??z?%'??R[,i???$Q??ǹe???N?9ǯ?h????w6?N??ԪSX?f??Π?u{??&??أ??@???(G !rnq˚D?{QTQ??MA ++?2??u^?1??M??(??W?͜e?|q??{>??? s???#nɮH??+N4?????{n8@T?'[?.,?c???b!?i?3???87?3h??<~C3%hn?????J?R?R????k޳m?a5?? uB??\?j?[??Ze?h??Qm??b ?m?*#9QS? I)I??k?|??'?\6מt??;? ????????=??|??u,?????b?????,ْ?[?*??????3???%??????????b?6]?ˆ??y?4?[??v??? #???+??? ??D_?4????k??????N%? ?H=E?1'bVR??~%#9?5??1H??????H)͏????????^x?????A?ø?u}G??t?????k]???ͷٹ?å?3~????x? ???8?{\?#?????&????'???????CWy??? ?????????6??t????????_?3]???g??x9? ̗ V?L??t???????ԍ{؞??#?˷??˹?e?u?@]1??]??Pc+)\},??840??s?x????s??틜?utt|?a????眹x?o|?i:????V?*B?y????h ?t????o???????????ԯ.???(???????^?????̟??}?????????h??]??>?g?{?/|?)n??>;WN?????3/t??;??IbY?x???????????Pʀ??)c?ˮO^m??W?5+?4?#?f?"?{ ???????????u?????\??G????^{?6???&??˗y??5?d?'??R????1.? R?"? ++?! $W???-???i??AR&6z?:?yW5.>???q7?*FA???'}f??.(3ړ???YJ6?'?D???@?o$???PH ???v?y?}rRr??S??٣? ++Y?H??????VY?V??*U ??7X?x)???ǔD@?8???? ++?uec?{-?A? k0A̫׀f{4?x??w???~uf?ֹ{0??3$]???.ut I?L???????]?%???'? %?֦?&rx????>?Q??'??+?k?m֒y??????{?SeC???&N?5q?H?IT?D5c???Xu$8????w?13s?-??R??r?}o???𓠌?????t=&Y????ޞ?i?>iq/?C???`??$*???;F?x??6 !B???O?co5?6Zm.???U?$?D%k??]?? ?Ϭ?dtM?,?[?9????9i?k4ߵ?zܗ??'?0!U???? Bc?$???Klk ???rNh$?\?????{?;?T???ʆ?S?3Y ++Q?/5M?^[??W??????vF?9??x??X??Qjƪ?V?V????B?F`#?? ?Eq"?4?[?3??Tj??>?a,?P+???u?`? U_?F?? ???Sj?i:???@\???@?Uީz?*J? ??^ݖmM?;?VV?INd??F??'wNI?E?\???t?_b1?]$?H??? ???~??#?0H?ܢ??h? &A???+A??G? ?I ?\??)b?X??dNB0Zt?9g?#?a?- ?f?*ND??m-Ú? ???s??e$?.????Մq??_??w???7?r??6g?ۣn?G,?n$?5b?V5y??=?K??a?bl?Atml뱈???H?F?x?Z?o⒳???BX7?X??" ?8??9?$P?p>h?sa?F.C??e??????Ք??]???????pa^??A?x]SV?%:?9^*7?ek?q???{?O敟????|??ֽ|??s\?]?q??????F???U_????]?]?]????,?V?OB0?p??????}??̓???? ?=???%???3?'???korke?{?6V?9???o????????~????S???'??????n??%%4y?))??HwYk?XAn???fC?b?F? f??-?[??Ѱ5??c|???U?-n/UER%??L?-l$???n??m?c?b?{?y|?W???/~?????~?o??_?????"7?E????\??͹3?0??ɢ?eba?? ??R.o$?6?i?$?.???&?/%??.??>m???L?y?~V??q`??% ??X%?#[?~2??ƷTź??H?ƻmJ??y?_?n???w/?RV??J?,?K?x?e.?{??"?? ??3?Z?|<1?;????f? M?8????=`BġW?&?f?+?8?r?d???)??!?m1Vޘ??N?9G]rp????5q???? =??3ʪ?& 2????v???1??l??V???jb:IXM?֌?;??ذ?????ܣ????-tA~J??$C댔&?VK??&??:í???>vB?D?S??9-?u??S[?$? ++);?*?rj{??l1 IDAT???C??`?G????-?'N??J?????C??b????t+aCT????Y?Ue>W?? ??o?J?0dASBkf???}??$?LM=?b?t?U?s?*PJ0e?N̄?? ŁM?Kl?>??!?*??7Kb$d?3'?s??=-????In?w??^??ݯi?h?4$??O??v?k~?5????ec??/??n?CR?7?<6??h?ehq?U??p??p???I9s?"??N??Q ++?T}?W? ?n:c xj?) ep?? ???i???¡l??GI??K???????[>?أlw{ ?????[_????????:&ɢ?d?ZL*h?q%רv֨??5??R?F?}??u??B&^bKCK???T?Ā-?[h&'?? !"?V?,??O?2-??a}s??? ? l\?Eum??Fh????BAt?\?K2??8'?֝?u^?籱A*?????Z?JIp??Dt?{?ZAF??6y?8??px abD-???I??)*D?s\On;HC??X????8?`??2??xx?.^??n?????h?Jg-?.??N8]? UB????Q??L???T?V??t9?Z????=?RbXfG?:?K*???^f:3VKa5̙L?|??טuS^?髼?ފ??? {;??xA?X? ތ嶇???? ++??-????wx??w?g??~?????J?{???? O'????W???d:Ӽ???;??z??F͞+E?????N?????)%??X??J?L?gȢDp? ???MP?????̓,?кbg??'@X???p$??)f?I??`q?Kz???7????x?'?????{?????}???r??e?^???????/a???h??????X$W??!???U&?o????j9????d?V,??r?d????R??C? A,D?P?hՑ|r???z pԫM%?[Ϲ????S"??T-r?b F?%???!??Հ????sa????k?p????C+՝?n KSy???"?????w?g??F??t?????+???????Y?*???ݵqܥ??k??ӫ`?Ӎ?rcM7???i?& Ъ?7D?>?`??ܖ??դn??񆶪 kuo???pBY??=!?{??8?H?k|t????_}??̇%]??r???D?=ƽ5в?Y?2??V???m2?s?U?Y?4?Ѯ?ZB?%H???6?j??O? ?H l??DS???V???A???eYW ??@N)E/˨pC?R?T??'?y??a??Q?!9*????k?9?H??]??U??.Ϋqc????o??)?.R??K;G?}esN? t???????E????8Ӎ??gq޶???cO?5)???p??Fn??x"z??v?q??#????????S?? ++?yF쉭Z"?????hkl??????Ǝ?I??F??;?h?? ^13?$1F^????p??l?b??PL;????[w?b?\?r??G??????s_???9??????|?מc~\????>?M?l??Ӟ12??ٶЌ?:Ɲ??%?чG?s???~j?+X?l??XV'GLhΠ4???n?'_{?E??%??[??d"gH?7Q?)%k+~?5? ?V5wzI*?֭??f???qM_?Ɔ?P%D?5Ÿ?t?T8u? ????™ `i?ge????lJ???u?os??C??eʠt?:??baY?"C&89?ֲ|????KMae?R?D=???p???{?'J!`?@*??&?W ++9???)??|Б?wbL?X ? o??@??F?5??o;???u?[?K??'?w??????x???Άǥ?m?1?g%?"G@??)p??*?⸊?h??*oy?Wd?U???E?I<ը??5#??@;?????w?*?y??q?܄uş?|???#??*.nm?N??Tc-????ջ??1?m??a??4R? 7?x݈oR?_?0???~????8?D?8?"'\?a?a??NIN?$?O??;??K?3??ݱ????%NH?0?$??4?}???Db_\疴9@???s3ھl?????a??1Km?h???I??VK[G???TS??2 ?0c3?H?{w!?t1?%???? )?x?Û???7?? ?>? ?Yb?8F?6?%O>q?r?????Px?Ƿ8[????󐵸n?f?V[?? ??K?-?<?'?u?SC?n?? Au???qXJ?^%k?K[?1????r??en??????ð;?Z?Ű?܎xOl???ǟ|???????w?,???????s????֔?_??t???+???ͭ??ڛ??W}}F~~v}v}v}?W^VV?ÒK???L?g??:u?c? ??? ?Un\8????l? ???G?=H?{?????C???]??j??X?g?>6|敮Ͳ$N???^!U;8?0?U3?$?U׶$ƫ??u?-?m?Z-???q?D?u?)? i??-!jS.?F?/??G|??׮s??u?z?r?j'????Hx??pJ??n?T?|?-?X'DM???? ++?p C5?]??U`?3??~<C?z/A~#??s??@kq?H|???\?AV$c-h??l??l???X? "??????J??y?ã9êU 9???o|?S{??s?6.???[?H??A?U?U&}?f??????䪕?&??d:ay?&I??jE?C??: ?{???1YW??e?0a?%?L]???f|???L???:?????́??}km?"????9e? ???C畘V ++C +??{}6/Yf?F?ğ]?o"??Dͅ(e?d?g???????a ???L?O??ۤT??}???>yR?-?R#+???&??ɪk ++Vm?s15??A~\Fo?W??W??r?? ?xL??뾗6??]??? ?????"y?׼`mՄ@?ӻ?? d?+??F?jջ??~??=?=?4 ^UK??V?p?|hN???Az??l`S??h?????{6?&??q`Կw{J?4A?RT飺? ?%e?????\@???R???ō?kU~k?$?3???67??mr}"?6wl??umk???D(CS?;6? ZS?????}?'??g#?s??ʻ?3[???l??6?5?~?e?7??v ?Q?0???"?Z??YpJف?d!??i|6?*?Z>??FT?f y`?k?go???~????]????8:????O????????r???T??Š?Q??d?k?_?? ???=-?g?p???H????`??us?*#?UK?0Yſy?5??????????7K"{^4?X?0????B??걍???J? ???????b??U??X?ZܒV?*??@dQ?Y?%?Eq2J???+?7?J?-???[hYlm4???5Do?T\??]ĤQ??ܶ5UA{Az?R?2?.?J?H?+?E????z?8Ij?R?t:XeiƩi?ꨢ???yta `??I??ђn?cm?]a?i]?G+???QP??x?aE?1?}w??^Զt _ Rҹ??{??W?a?[;?#H? ??D?R?=d\?m?o???Y?e.??g??oIb\??5?g??? ?%lZ[?????x|^?9??Q??T˕܍Ý ?>"f?@;3qhN˜???h?02?q r??u?{???"P?H?YJ?x|-?1r?2V???+??k\/?????D?!J?5?Q?5g|?/C????Y??S9XZ a??e?חtA?:?????F?H?#?U??a??????~=??Υ?8_???Ϧ???/?>sÞb,??25??a??????8hcP?g?H?eR??Ę X?Bx????v? hv??l?J????1??MZ??f]kA???R6??~?"$*?????l{??;??/?ŭ?7x?k_dy??k?????N??a~t?{o????S|Bŭq?PA0?^??:l8??0?Չ???????????????l???o??????od?????-?/?Ó?/?uj?N&???]???/??}?G???t?????} n?????{?w??W???_?u??????G??{???z?F??A?IJ$???q?????}??????8w?,?>?g?l?ؗ?,?#??[?XWCp???????????6???I߃?F,?BT??????p???&?ӌ??j?]!? ?2ଧ????}??j C???R??????W}}F~~v}v}v}??*˺?$?$\&???3H[?? ?))????w??n???̫???ǣg?1?v䮲u?"???{?9???'^}?ϸ9?tu?w~?䮲??Y????<'jT?t?܎?u W?n?~g?D??I?'?ķh?ݚl???5)???O???????0??\?ˠK???*??W????????:D7??s?s????|MI6EX?(?t???[nAY???:?f&????/??9i ? ?ڧ?>?l2a?}???;?;???????[????w?k??z?? 1ezf??'-??H?N*H?53?JZ???%???;8ɰ?G???'???l??PY?ЮQ?I????????8?вe?AZ??RF5}?*,qK?֗bTϮ?J???Ϣ? ?{=??aѫ#U?*nE?5c??????-???????}?z/_???q??|??Y~???x???н??ܓ_?????w?.?}?;?????$?EFA?֩XyϽ ?+O??????q ?V?k_s*???ɳ????i$?v??Q?Pŏ?F?a?Uխ*?Y??)"M~j????V??5?6+XG???V?????1???ޣk?L?p???i ++?_F?AZ%2?B??? @???4a ?P?(~?-^?U?z?%????:?? b?hs??~^;??`???T?!,??с???c????????S? ??搥R?Y$?ޔ??Z?.DR??????k?d;? w,E?qmb???f?@?{??F ?K????????s ?????u?gJu???#?_?H? ?d???? i?WD????O9?*???????O ޹??????a??c??QM?*?? ?"M?*?Ut~r?lktM??????g;??U(??= IDAT9E?{ss A?X??????? aMA????ȑT????-?ƪ?>???Z?N??8.??/? s??T?l??&cٝO? ?y?b>O???-?눃?C??٨?@?j?x?U????>?oֈ?>¹*l,UK????Tk??}z\?_??|????D6?ϱ???ß?oE?e?????E????i),?[?h?Rk?9?4נ??}???/?ߋ??:?y?????U?????ٟ?R?6v??9??& Qj??/?+fx?6?ī?`?????Y??D(?-Q?@??W???^?~?X? ????.~????0 ++???Mh#_??xV#???y??j)???k??|?ٯӯ?x??W9{??????g???< u;s??%??~?ޥ?o~?;???)?^?6?V>>> AX ++?"???6q\?u?}o??k?pb?9z?J ++?y?b?jEr??F?zGDn?r#??V ?=?pm??%?J?84??U?o??>??(??gV')??8???k?????? ?m?jB ?.I:???A???x@2+Y???|??Δ???j???~?C^??7_{? ??r???9s??=!?=i"tV??C??qe?x???+gWy??}~??K? ?q???????cN?Ο??? ?䟿?d???Z?sz???g?p???[\?*\??8??c?f?bޱX??E?IJ?u$??v??? ???*9܂6????#??=???? ++5|?q9???N??fa????ϑ?g?u-????;?????U_????]?]?]???me?]?m?o?9?u???@7g?[XIH???p??Y~?ʋ_???E]Jd?6?4?????-o$?6?q???!1l? ???u???????'????【?=?U?M???b?&?{{??% ?D????~??O???S???=?W.s??9???$?? t?'YQ&)q?Z????????????M'?5hs??b 3??*??????=?Wr?ED욵V???ⲁ??5d?Y?????w?L?????^y??????iO???N&B'?08:ԁ??k(?XU?өWge(s?]K? ??e?`?????H?u?????:$????M???T#?B??? i2!??cg???P???l???y?5)'V??x????a1?AeX);A?Y?R??Ţ?????d?ŀ t?????ۤ?sL???T???????JT?%?X?L??(?????9*;_?]2?v ? ?-v'?H??L2?v?խ????Xf?? ???e???;?+???3e(T?I????? ???B???/+RA W?3?p????&)n1??'f?????7??6?e?fft??wvy??;?y? ?|x&??|?7?~v P??B?!0??"F??D?2??q^??T]??RTk`??????2????Kw=? ??A7{bժQ?&???4H?,?w?/Fk` ++?"4?{?a?+?dObk??????{i??x3V????.??y5?\T.???W??o?????????H??l?\޻?u=uUܹ@Z???\?? ??R??Z?6?~??@?O?"?U??F????}?4e?yoǑ ?? ?}_?\ݹ?.zx?q?&?????4 r?"????%?̲???6??? ?PYU-ٰ,??u??+C???V ??:??8??*????!Ƽf?7????;?4?Eą *㞥)??????l֬?f???髯è??"?\&???(???)K?'l?e(???a?;????s?N???????R??)??b]E{??W?x\??C [f?Z1?r?Y???]???e?S),R㙤V?D?!F??ˏ?}???f}??yG??3md??.2?8V??go???'t0G?C?dx???0l?ɾf??~F??9mT?I??@6?s?%@?s? ????h4?l??Ϭ?X~ֵ*?F?%?c??^?8?@?}/j?h????i C???67?5I]u$ ????c?M?5ɮ??߹73??MU??{5?Pݍ? AP ??8(D? ++[ ++??p8??y????ʒ?vH?B?dK2%[ ++ɔ? ?@??0h4 t??kz???M??/ι?_?Z?FkS???7??y??????????{?s?L?)????@??-q??~?a?͕'??g?9??م|*\????a? b???? /?+??8'??!H?5?gr??(??[?? R ++?l? ++?s?#???)d??? !ٙ?Z??ц?/?u??? ++???2Ȯ?b?s?KJ-F?w???^j3??EX??nNjx?K? n???????u"f?c???B????b?U?4|?+???????O?;W???o|??? W?T?????8R ??q??????5??>??~?W8xv????> m?duJH TV?d?D????? ++?6??=Y??\?I?T????݇@?z!??=6?? ++[?g^?p??ą???z<^a?l?%???'?)???K1 ?,???s??P4{??'Dj??*?R?X,??6v]?Hn????^D 㱽???Gt? ??d?Z??#? ܾ?2?????O~???1uS?4?? $??H???Y?E?ܼC7?????t?3????? 4?n=???gͩ!؞8ڀ???_?|??/??Orq~Bۭ ??<94쪬u!Z>(?Ŕ>? ??????2??:?[T?"? ?ygX?m?(*?\??һ? ++A??9y ??s,?9?v????}#??c^+??? ?)?k?~ ~??S?????xz??G;o?&???Py???/;?!7???? a\??BNJ:??????o?᏿Bwa?? į? ++:Y?8?/??1??>???T?e??^?ŏ|?????;??,?x?????wO`???_? q???k\\@??y?v?x?H??V??W??????v?F$X𥞌ye|QNXO*?k?MK?98h?I??rK ++K?΍??????4??_GJ??^E\ig/?6st????;??lE}???t??Ņ?jJ??d jī($V??{?n???4?G?u???|??_???}?h? R?17l6???????~??㪾i:Xqvrƍ??p??ѵ ????X???a????|?]Vyο??{?r?e?%I????#>???0gBX?haյ?AY5F? ?ֵ?4.???op?j./??"?`%????Y?^??&$?TQX̗?P??u]?5??}???c??wi/???O~?1y?????9u?yKUYX??h??┈ ˖\@??s?65BN??%91W^0???????)uֿ?1?I???@F??:k'D;GBC?(?]?jc6[-?f7?Ϳ%Gm@kY?{?7 ?fVݒQ?m???!?Э? ++ZK;zW???XAG??89???????E_?t?U#^??gw?A NKN!w+#?????P_??U?VΥJ9??&?HK?Ȱv?Q???>AB?K+3Tm?7 ++Hi???5y?%????ʁ]#?S"Z?QֻX?m?????!??p鑹???z?T??'Z?u?o?$?Ĉ???l(??C%?@LZb??cM??y? ++????@J??DU9????Z??????U?n????9???X?h?߷???z?5?^??+z?U?z~I_?e}kD#??(6?| ++???? ?ߛb%$??L??b"???|???#%߽ʘjd??R'?\A??b??:qB0?D̲,gt??M8!?????9??!?\??wit?:?=T???????3?&??c?'?Z18Iw?ʉ???^???Y`?xv????y?g/?\M???Z????7??_???O?=???[?ڞ??1??G'?:A^????F(g ?uQ ???oc^T????VTP???R-6???KJ$?jI????Sp?????{`???F?#M??l?gq?X?????C'd?^y?/?k2x??П?H???F蟧??X??#W???l*?ގ?}P?J?ֈ???=ER?w???T[|-f?Nq*?lk});2Q?+?|?t?j?l??b??b hPs?(dK\[Ln?e`Ҏ=?KF爠???ÚĄ????$???ˎ???)a?????B!D2MYee?R??{_,?"?ǃ?????0??v?mz1 1????6?? *??????ҟ}?5ǭ?=#?ҕ?%_?ޫ3 ̜????(?MT? ++????<+{ve?,??h????? ?r˶???Z????s K?mO?,/`?Y)??k{????F??Z)q???????"??$Nj?ðO??Dq?)9|?76????Z؞1ud????E??yYT????w??tW???͓J?R?k_???`??'? ?? r*4?1?ZK(1Bi??Y~`r????~?"???>?+?)???jxm?K?P??GK?ĢǪ?"?q)??U??*` I@儎???ܖ?'?W???icEե?? ++WF?7???0(U???Ԭ??? ?h?٢?_~??????????8????d???c?9^???ڛ?\???#.μ?}??)/??u?x???}??U?Ė{???]rG _W????eo?e???$?ڸ???@xr?>?c???u??W?W???y)e?9??QY!oyrE,??FP ++e?q?*V???ȣ?????ؐ;/?2r=W?ekE~Y??Q#?q2 ++??O????tN???61?? ?+-v?.&?0?eD,n?FC????b?%QH?"t???"?k????????????/?o??Or~vB?|?%6?b? :?H??3ؽG??X!??????4?????????P?oI-9?UA??{?WRD???? B%B?Y?!%??X!-3?w???LGZ??3wJY? ???????|z<=?????x GΉQ=bc?pxt???X???Ie??tC0??}/???q??;a{?E%?kN??I???v???.??????????3?0??%m???ѻ??/???7???}???>:?rޱ?,Ӓ??6/??C*A????M???c?`$?xP?4?$??v?O&????z[)?M?D萔7 `:??Jt,@(?zUd?:?Js"?D??FiB?r~F #n?y??ٹW?5h ?Id?N*???׸??????,??g?[?,򂑎ٛ?q??hLJ?`Zs%?Im"n'n?o?WJ=??V? ++???a??????V??`?ZGi??i:?ҍ|?????ϾL?%?Uh???B??Z???[ ?z????oq???8???????6ո???[׮??K''3W?H???U???/?T> ??W?q6????*?c禾0??? ++?P̾ֈgOW?)bM?????tB?b;?@??u?B?͊n??????s?????e?Ŋ?CI?ܵ??vE?W$?rI???!g?G?????K?!)x????C??/???????W>??? MW?Ԩ,,?͖???'>??d*F?4?>?ym;?B?91??1?3?\Ы???֏???ޏ?&^뻼??]?Ϲ?ʋ|?????????5!u-???????[?n??-Bⷿ?U?|????7???V?D]??%???Yhf??-m??%?5˳?Y?nU?J0? ++?ԉ??Ys ++b]S9 Jv&???6$%f?Y??"??\WtD?_P?hҘ[;/??????j?"UMlA5?2ٙ??%????????i?Xm?Y<ו?&G??jv]fuz?h?Aj?H?B?5?ӆ,?ܒ?? ̳?_?T?I]"??.???EE??@׵?????*??H݂T?TR?u???qq_32??,J۵Fx )2???È??x?q?i/V?? ++?????:??0??t?w??ь'4????y/3???ޗٳ???g?l?3`۔ ?z???????????H,??޾???;??s???[?)(Z ?k?:?>Nf?????1?*???y??-?&F?T??b?f???7???a??????????W?ދ???(??B}???+B??@T??h??*O*) 86V?k?^^???????????݀??,Q????*??%Mc???@ۊ?^sPR????[S+) ????=E1S?? ++`???=dВF1F? ??mM?_???XU?cɼ N??? ??zCd???S ??l???m??P????? _???"9?Y?a???Z3FSyB?~?}??ը?{[?XS! ++??@SAmM???@r ++? ???ll??w??)V?k?#??tj3!?~\c??\C?fH??,???*?l???bсh\???d?hpQR?zźeEY?qH??v*??U???"?a?P6 ?%??4?4z?T??? t??koq?? @???ȔT?M?|,?????\/?p N?????뀔?.Qm????Ie?}?գ+?z{!"????fٖ??5EK!D?*PQ?=?])?QGr?i???Z?dL?i6??8=???+\v??}?g???䘽?}?[c6?s~???<3?nAOy?{?x㝷x??????????C|?cσ????=?"bP????6`'6??c???< ++???q?xP-wB?]2???:yY???0W??&[?E?|ה?F|>y;roM_?K???u?;;?Z| O>?2>R ??fy?C?Qp7???Z??geLr??6?C ƚ?&B\?-e?_C?Ќ*????\???t???/9Q̢?8 ??|k8L??g2??B譜???????????M~???ŧ?.i??????bg&.??-c4??V??D??=?O???????I?Sa?X1?r??r!c?b.???α?6g?????׾???|??2?1??k0?/4?n??}??????Ʒ???,? ?s?y?W?2+?O7?????????c~????#&??@?ֵ]? ?w????IME5n??ry?5?U?%?9X?? EU?%??~???3???̚3ms ++$b? ttyA?,g0ɑsB,?Y?뿀_?Y?d?M?w??1?Y???zɥ?8e??m??t??Ŝݫ;,? F] ?:^<`kTÈ???7ؾv?6 ?fJ^?s?>??ي?_?7^?A??"?܀?JȹE?)M'??F??y???!c{??H? ++?l?wmJ|`?yf?R??????{ U??W?YX?j? ??q??́v?????? ??Y2,?0S?5???-3T ?? 6Fc????????? ??????S??=^y??{?&W??rmw?_???G??????????DR??? n=s??? ???S??S???m`??`?:?hvz6?:?X???ìg?YJJ?y??????`???b?E??D?x?MY?bJ??W?Y߰ܓ?9?$V `?2,?3ox%??ޏ"??m??Ԃh??+?Jb?bP4%B!z(?u?+3?O??uk?V??'???l? ??'?/O?{ *???x???S?? .?/????{p?????_??_?????br"?:?~|ʕ?QS)X ?"? ~?\??ir۞????~?&???n?b????-&???ޜTu\???/???@g Ώ`??? ???e????ۜ??O??????????????U?D?KTڎq!U?)r?:?"H??Y???f??t?c????ԭ?ݕ???nj??{?U?*hG???!?ȼP??NJ??\?D/Oy|????1?"J?#L+f????3?C????!?tfA-6'?hBRh*S5???V??Av?????]V???HU??%AjW>??с@3?T??]??lhՁK:+?D?????ȟ*2$?(!?I??l?%1?\?&B??? x?:+???{??G?#? ??F|?d̦jUk-"6???>1s_??n?0??Q??\?$?b??J?D$x?O?z5?? ?Hw?QG+?K?m?v[???X?dj\?C:S+???@? ?xk?˃??ؐ??wNi]Ff?3?QdsYiE#?V?2? 1??????ɞ?D+?ӹ???X ++?????? ++q?DD?$K?:1??$?V?Ț-bv??Pp?I f???v9Kt?I?T?U????kQ???̾Owf?^o)??????hpU??[?_x9?Q????T ++?J>3?C????A+?M۸?|Ny??|?K??g?????/ʻ?W???b?Ә{???h?N?H??9ZO?zj?g7?ؙpps??kY?r?Tv??،f?PU??匓?[#??1???%;WG,?-??&;?U5&?)6???t?43__?G??ˠ?y?ޕ=hA??????F?=8U?{U?0*?!Ryu???y?T???????%?T?D?? ??d?M?3x???6???|????lIZt?<~????=????L???޹??go?H`c??O|??hW?$ ++?9??0 Z?5?L??Ux'*J??);*?:h????p"?{q???%?5??,?$?nQ?ۍx0#????T?d?-RRTZ?ŚC?͖e??#?M؈?}Ͼ???wHs??ݷ ?@&??Q??R???%4Jۭ8O?HH?"??V???l-V??? [2U??hB?*?耷*]?"? ++ծ?/?@?????.j?&??a????,?`?9e??T?_??t?v??tźJ?$??B??k?%u???1r??????ݒ?⬞h k???_????A??'H?L?SOa?Z?ͣj ??I???p=傂)N??3????7?q3?YZ?}??윻{?X???x t??9|oD?0Ϲ?+#n?????/????J?\? ?]T? ++??n?mm?ס0M?????[|?NO???m??+?|$? ++jz0?8/c????6??'?7????????M4Po ?+{e??' ++h#X1Av;??p?_N0?A?d??[????ס"??UHT?2??}t@M????~???*?Ȗ?'?kCal???җn?wk?(@?KC?? ++㘞??? \??b? ??}ٯ?_?u ??? 욚:h$HZ?L6??(r?????{ u??q?2ݞ?????6?ڊ?z=? ??>ќ? ?$? ++(?w=???Y??Z?dgs?I?Wپv?w???[/?????K????????I?aA?fJ??`ĈJ??????Ĭ?8/dS?Wx???Q?6N?oϷk??z1?;???dsK????|??v??_Z{??a|??޵k?x%i)B?? ?? ?wH,??$3??X.??փ?bA??;?$?? ,?ac???M?g+D??˯;F#r?ڴ/2? ??:??]?z?????Z.'?b???re??/?S?W????R??w =?O????Զ2T5??ս-Vˎ:???a????U ?"_?H??$?????????ɝW5???\_????s?fg?y?8?>W?)?????w?qհ\vd:K^ =f??,4#?PQn޺??;?>?h??fB???L{~???}??N8lƌ? ????K??-?N?{?xm?w_?&w^~%???%!C?J?5?Y?ږQ??TQa6???e`z??y??|?{?|???K????Qid? ++???Σ?loq!??F\??U?k??????~????k?_??/???|??ф???*g?3?]????su?˓%?1?$Rw?,??G?L7&?rkU?Y??/?6_????ryN;6????c۫C?? ++r????W?"???h(??AG?H ++U *?k?*??@?LAW?/N?޽?y??9y0#?n^????_???4r??>/??Y.??]f??x??wy???i??6&vo\??ք??g??????Z ??????x??R????A?E4??}?>? ++f??+??~?Y?????[?????~?K????qλMK?l?8?i?ҷ??0?Պ͍K?ɤ?B???uE-?Z??????=Fx??g???????S=?s|y?^V????? n6c???n???~?_????????O??'?????|?'? d?|???4$5??n???@bI?j???2u??߻? ?x??? ?ԟ?h;0?+t??E??$?X7^=]?@?A?5qjV@??0??*??t??9P ??6u??????n??VU???=????@R?v?9o? Ħb??hӊZ7YΖ??иUy{vB~n?{????ο|?liҹ:?m?c@;Sy?nDT?h???5?g+?:?$?lV?,S??̲]?4#?????,t?2??????-?&? ???????+,??4??q~?[????"6;??????}i?7?M2??????%?g??d??@gਃæ?.Xa?????????"*?"9??`??bԞ??s??[Y?c?k-??0??$?Ǩ????u?Z??s????@,{?ML;?P??ԩљ\ ???? ?B?' $]+J?W?gC?M???vm??_????? 6r?s?@Z6????h??CQL9,>?s?d?q?x?ݵ"????B?Ɣ??(絸???:????l gg???g>???w?'6?)?չϜh?L???6??Ñ?H?m?W???}x??a.G??Ijۧ?YKh???jv?)??/???|??5;K\?f'?}l??+?e}??ަ??+?QR̤?2?ȉ?y| ++?i??;+_?肹 ?D?_??T???Z`s-adL?{?N!??l????z???0? ++???????P,5=/?j?žSXy????9؜@M?2???O??@?+{????a2??gg??zr???@?J???S?ɔ? T1@?验TJ? ???Sp?gS4K??hPd"???? `F-?e? ɕ?j?_M??=e??????N)??\????T)???rы)%???'?/??Ti??n??4??F ?W???????b(?c ????䒸?+?ĮG??5??@ ?????%??8-???o???2?z)??L,?`??\?鹬R?V+?*?3%/?5uuRW???l??_?? js4K?l)Jn?k??s?ϵ???]?C????y =?]FR?????X?⸖???bo??k??{?},&ZbDW?!=If?E~5?_"k?M!#??~?:^????? ?,?"???ٷz]!?U|??[V????Įd?\???YxAT? ?p7??/z*?z9??'S??d6?#4(?=???~?t??ߚr>?e??y??5????j??5"?>??x??&??k??R?x?????Lv??ӥ??AI?? ++??;??J?x??$?-D??z?g?????T?#yU ++h?U???Of?cnԬ??a":_??겠tf?,??j???%6??6S?ߖ??+??&wH???AC?Z???9?ץ]??:?IW?1m???ð IDAT????+Ck {*ª]??~??LW?QO?ϧ???????$?(z?G?_tT?&?'????!a؝?E"_?4?+???]J???????C?u?d?I?'?R6x FC?????₃?>?ƌ?H8_,?F{y???W???!?2??????Lʝ?#?P ?e&v W%b\????&^a:???13?/?QG?j_?1y9|?5r??ͯ???4???????ڂ????k3?qd6??G?[c&?!k&w?u-???DʊJ`?Ƴ,KώR??A?tN??????^?? ?Y??㣇???@????Ƚ??4W?t?ī?׿?M?~?\?W?MTK^}??ۏk?J?????~???w???????L?????o????۫8?0?ιLK?|???ȱXO???????ެ??s?`=D#???o???Bup_??uSKUW@`TUtqL?@5? ?j?[?|????W?6???N??? Z%t?I@RW?x ++??5?b?j6c{z@j3???K?qt????5?o]c??6?ۡ?:V]?b?De? ??,?????h43??I???????_?ƕk\΅?????{?f??? ????Fۑ+[S????%??ib?հ?d7ĈL#׮???;????XO????;?c?j?T ?`v???{?4R??Dd??r???LK?ABE?eR?"㊐+E??l?L??X??bM?;)?1٤???څ??ْ??%W?!? TU?eXA?$kd????q3!?-U4???(???rf??OΏ?ֈW??܉??a@A!(L?V?#͖??#?wt?????lN݌Y??t?[??&?P?Hm??mVv668???t0jl?^Ƃ?3?F,өO??V?:??:B??@??jXtO4?}O?h I?*U5???9KghL8?b??@?i???C??\?ֵ=V;K2?l6g2?B$?]?*??l4?;???j???????)?'~?!??n?Z??RQ_Q??ŌJ??{h=J?1t????PI?_S ?9??i?(?W ++?| ??h?,?X?C???޺:??ݹĴJjtɲ@?&??Fs??Vpf?%K???e????al??????V??Z{ h] ++"?ǟ????k??/?Џ?)|?????B??+S)? ++??ȿ???cE?????=@?X?e?|?P%???H?l?4w ????hJξ???2UK??B???Y???{?]薃+|??C ++֛1?^ͯYي:Y?r&?UeJN?l=ق?•?$?=?l ++?8??(?\W??&Fu??8?L?I??\t",/?|nL?h?du?O?h?H?Ȧ?1'???;ci??;̘? ?{/,?͎?i??????pA!*??x?D??M??8??T[?????????/J,????"X??Կg*j??[U?n?????l??/??v?????(??????;gD???hy_?=6e? ++?l?=?u???.????aa???$п???)?"?B+)?ڇŝ????٪Lsl?(???B;W??}d???GH????~???k\0??NQb??L}H??lN?mƲG??Ѱ?a"eN?????H??q??A?v?:??)m~??ϮA?T? ++?礮d?=ϗw;E????????ϫ??qZ?s'3?x:[??SP}?|???u=&S)B?DsW2?,TUŤ?Ҷ3?|???ߚqks?7??H?;?V?n??sm??T??!y???C???G???????>?ÜW?Zo?4??%?qr??+{~??]^[??;?Fw??/>?k???? ????w?b%??~??m '?׋??=`??ۭ%6%?(? ?9?PV??p.?dm?CI?\ ?]FY??Z~?Jn3?f_3??d3???5??NQ?k??M֟???D%??b?l??:Y????JU??Fq8????c|??ٸ????Cԟ?T???F??'j?c,7?n!n??z???>A?+ ?Xp???w)??E?)????xŅ?ŕ"e??93?%??bN?ۊ??z?EN?"?r?B%B?:a???ُ?xJ~>=?O??????=?Ń??y?V???ʹB??,5?d??r/}???m???k?}u?J?=?΍?h?芵?? ? B???#v???/8yp̳/???r'l? y????ܱ<[?I?R??LS aR3mT?N???m?78??U???l"???G?[?? ?????^F?[???7y????O?x??=*?H?U효G5?x?? U??|? JG?\?]v?IE?k??a?Y#U????????P?:a,[L??8yX?d6??ll???/??&o<|ȭ????h?3N?9??-^xv????/?ʭ????? ?j????Ǖ8a?Z??lƸ??%??y???W?W??/?4??S?Z-??^? B="4??{????b?X?????h?[???!???f5??aY)?XٌS???imS?*wTd?Y\?Z???????c???Y?l5!??ͫ?ܼ?͵?lɘ??}6?̕i???igK? ++?=Ww2݁?P?2ղ????[9?????? ++I??M'œW??D??hC<-?c?&??] ???W???/???{-?Q??Δ?V5????#???f2f??!А?o?T?`?~3aR?Z%V?? h?E2???v??*[?e??v?jݚ&??cr???p?Lۙ?jT(}r??a?Mb.ɮ;?߹7"???SN?U?Y?RqIM?-?@?x????†?6 Ȁ??F??7??ya@ ?B0?? C???5?U?8?Xk`Vef????{SĽNjsn???^?PiS_?7?/?ƽ???sv??*??????TU??lA?7YFa?Qr??????mCb????KB]?P??8_?q0@??P?Z?I?b??`?Ӌ??%???i;%J???  HeN*FͶ??aβ?|F7???$X?@??s?"Ԧ$m ?\fF[,N?֟8?? ?`?URn?lB?JP`:w ?<*sH3??????9??Cp???É+?f????=?[?̎?`j?XҌ"" ˶%M?j?&*?}?R???g3?n?'?+?טM?쎘_^?-??ç?Ց?łW_??>????2°p??????zPY?D ??D?c?J?' x?[c?I?1a???H??-?/??"??'e6?IT?4?8?Qz??䰁??H:__?.??27????p׀?@?????5??!??-???`%bU ++C&F^H???^2??z?M[??"??@!?g ++?RJ5?[?U? k4?U1?ӊ|??B????l????V@??=??S???? L?'?B???O?????"?[?[???1p?ZO?u'm? ?Lـ?@?q J?8XS??Vs????Da????9`JQ??Y??+???? :?Z?!x??~Q?@6]m EY#????ϺG?? ++??9?@??@?????ł???|?F?W?~?ꑫ??g??w????a?5Z"?2ؚ??ՌOJ?&?g??b#P{?A??&??e?,ӂ1?K?:??U!?2T???+? d'?}l???v?3V???Q'$?[?B-nhO ??{l?.?;??]??5??.?D䚔?W??![?Ϝ"?`?Ry̮ ?x%xě?\?0???b????sYPT??g{??c?9?^+?,??C?#)}??????s?А\H???ds?j??Q9?YbK;k;? ??M.m??Ĉ?3)gt???I????V??"?kcHS????L??????e??fS?p@=?h??t??ˀj??D?&,????f!??~?p?f?%fk?a??q?????6S????,?????B(9f?gC???Ϣv??\?5??oO-????= ++?o???k???2?͞??m|ĪD??????L*.}_ $?????G#oP_?r???b"Z? ?Pn????~??ߋ~=l*U??b???BmcܟS?E??3S????_??>???p??w??1=?c`??NSzgZOb???\ 5??*??`?7vY????{???{????o=???[J???WG?Ɵy?:gm"\{?B?s?????v?ʼ݋?|????9?j`?,kO ??w;?????UY?>????F\LVy=?d".:?DyA??ATƃi1????x?? ?_?$??????Ͼ??+?.wX^?`?&?\3?FN.g?ٟ\??_??_??ڳGl?Ѷ,?x??^?H ?1G/?s9J?+H?=ֵ?#?? !?????? ?l?\?Å?s:?#?]?iͤ??`?-?????^=7k??3X?N)?ޛ۪?B?j.?zyzʹ??z?????ڹ?HP?`????Z??W??4??R??G???:]??k{|?H+.L+G?dRN,?-?i,?6??V/?%??o??Ͼ?kD6?\?C??CJ??Q??????{}zgs?0??T??K??:?w????????????ZK??8?6R?vNv?s*??J?0?.B%H*"J(?v?ll??Q?E?Py??7?;??h!?y???Z???2?z떕#7???-?y52>???(?? ?k?̿??#????????C??0e??2?I?Ais"?D?XB#??Սl?JJ֟!?}?J?.?r????+ט?\p?^p??5?>Š?X??r??]????t????g?8?c??l?j?ܰ??뎳UO??ً?D?]??"?ઢ??????+????????sv???M޾?׏???o?T??Orm??om?ֻ?(?i6Fֿ:Dn^?????Xq2H?[?urh٨??+e?/????٘^?o???b3??N&?a?a??!g2???0yx????& IM?x8}?~???ͽ? ۯ?M;?????{?>B???o]??????D;<%L+??_?U~?G??I??o??3??9??>??Ã;??7??OP.?钫?_ ???6??\???j\?̮9Dw?2?"J??g?'G?Y????S?S.sd)???K????!??ػ???.?lm????0???&??W8P????%?V9?NY?e_(T6a!zD?)?C??V?M?????ʣ?4X,????Ӳ?\4?(?G?u?3?|??`?ئ\ŁN??"??\͚,jH̽?w?! ?d???^???q???,?eΙp?? ?"??? ++???V??3*'WT?LUUѡ???ƣM?h?,????X??R?S?{???U$O@?:D#? ++???U`s?????y?d??l~??qb?????l?{{?????Ш ???K^????ݺ????_?a??LΔ?? ?(?ώ?˷_? [/#K???c?1?Pk??l?? l_s6?????S?M?W??HEM ++-*5m?f4?2??` ??????_?ݯ????|C?-O????E??_?u6??0??Eƙ?`?q???!?)s?TUe|??Gg????EMm??̖KⲥM1?&.H ??u??????|???&?g$D:???Ɵ?զ1e? vZ?pl ++i??ɑ?A??b?=R?8???AGSEڶ?ܱX?4[?Z*Dk޹s??_z?V/y??;????l?&?q?yQ??h?U0?T?t%????+?ZE#̅?N?PC??RWC?RfJۺ?Z???mG? ?J?)?Ò??$VH̄?????i???Xw??????IEڀ?c6%wZb??^3qf??(VO$Zʃ^H|{??ZܺǢ?'??{"&n?^??E?&O???#???f'??6?LH?k?5?o+?*8?? ????Ͻ???"???(??}??? c?D_????յ*??k8??㫞?O??V?U?a?? H????5R2?M??_?o!?????${-?x_??&T]?o????M??[vn?;?R)?/??o?Vv?FgW.????gE5Z:?H???6?jyp?????p?0?????):m??gy???9??n?5Ru0?X0??^???Lٿ????#7?ys?????d???'3?~??݋??ڑ?M?zԵ?nWTKj&l??T?????.kG`???uj ???gw&?????+???q?AO 9??????#|???qpx??w^?]?v????]??????zm???BoЏ?huV?Z?]V?«??? l_???1a%n,??r?X[??????RڿF??B? ++7 ?2o9&???h????1???Ϗ???????"?s??霍f?3??UN?z? T??S?7?:v(?n+?{a????՗?uM?\ )3 ?M&?i)Ħ?????]2}?5጖?ۼ????+??}x???ܿ?>ן?¼^2}?.????7??ƍO?;????k3&???gK~???|???::???x???~?_??_????? ??????/?ij?vxj??$?YܼΕ????x???ޫ9??ɏ??6?'?\_2???yͣ?d?DΏ?]V????N&?J??h9?s?vu?V88أ!S7F??? ??$?^?܍H????ڎ>u?e?xpv???Z??]?@E??˚?$?r,??ǹ??w?j+(%?;+??? ++?lT??PEOh`????)++P??tQ? `)???6?#~?? ??;???;?͖??=?)gUK??P\6E?U6?B??8jDeW?]z׵G???Y?%??(|??ǡ? ?Im ????.. ++e?5$?uɋD#?2?D?)?J꠶g???? ++,-?5??r?Iqq????????? ? e???.??`<`[?&\??v??U??i%???%?? ƺ?????wO??????H???????O?3?v???#?-?F???????Q??? ++???U?^6?ڶS???????/Y\,?s?>gw'?4??8?q??E??????h??/^???5k??hbG?3]W? ?B???EG5Ό???lA?K??PW??T?????]_AS? ?|????c?n3?f??"???}?6?x????5n?̹!;???ej|??~?A`<F?'?~t??o}@ ??????b ?.??[ˑR2??]b?l6?ȁ??{???*?l{????5d??3C$??Թ??9??????N???!YWu]nE?EG?Ds]Kj???鲏?@e? >NN?w?i?4YR?c,??L????p???&?s?{=X??$'o}???ѷ??d??sD ?E[#< !9??C?z/)?Zowu??(+?%?4?}ˌ?-?E?g??ST???$s????9&?+????6??ermW4r?x=[?SP?Q?%G?F?HYI?M??X}??KT6?K??d?H]5??"D'?4eR???5l?o|?eٍ-????0":?Fz??????סl?b%??L??`0`?6~U????6???h???qv9e?I ++??H?w?:?# ++)?<&kn???ou?x?H?\?a?=s? ̥???[k?Sb@$q"??: ?@?=Z??՜Z?M????i? ?s*?-?%-'?c[{?? ez'???????ޥ?4?(?~? ??4'?????v?4Wx t?????l$???蚋?|???b?1v???G??CpW???@6w: ?X?Ѭ=a!?#%!?<&???%'n?????+?????H?I?׺8?KSS?V???18??$FVO??{?gPO?uA???(?[??A??D?=??1? ?l?$ۜ?iE(*???MpR?#k$?L??115?y???I\<?`g???????V?FB'w?k??X?kg+C?l#l\???~f?~??{?i???7y????po?"???,:8Kf[՛F??+E5 :c?*??2Ks1y[/DS???9?j?'???l ????ԋQ??ڞ?_K?j|M????7?)??eW-?%??ͦⱶ?u???Ѧ91??tD????=?~?:??2/\{????_?w>?y?w???^y?m?iBD??]???.?ԃH?Pv? a?`?????ǟ?M???/`n??`sL۵s?Ƒ???k?? Ҝ?Wv???}?T?7iwB?x??utޢ?-???????????g>?7_?f??}f?Uw?}??A1??sW*?J????z??H?߷b?ߌ?_??R????Q????ѕ:?/4S?DVy?)???eC?js?h< x?Պ?csk?3W??????_?"o|???fq(HgR?>?\2(??z??k5E?^?jG??l?km??)??F@??կSr"???AfPm???n??18Ȥ??fY{wA?ʺ? t8fu??}?._??G? ++4ў???%??yt|p?}?m???k?X??/??&?4????8-5?:?uS\?d????-?{D??] c??;??hؔ??? ??]0??ǘ?.???jp-? w??+r?ШV?-? ??à?2??"EE?L?? ++zM?V?;?21jP1!G???S?Q?D"???R":????DK????QKJq????;? ++Bk?#??]ջHŝ?6;?3! m??np19?kA*?#?l{a?@?? ????{-ϐ???k???ͮ?-5??h&?2?e??W??#?}B?M??R???M??'? ++?g?nNvc .F?yS??j?%?w ++IO??J?*b???e???DJ? ??GC½?!i??y?'??? ܸGK???V?M????? ?S?H?2w??i??X?.?  _???}?A????vž:????T?`?Ѽ?Ey?????c5bi1Y?O??Äcy?(Ƚ????ĕH??\?d????Z??jI???k??F-?#VkA? ++|"?4???8E?;??????'?[wJ?D?? ?{]?o?????ٮ?}&???}e?z?׷?????{? ,1??????}wvQO?ekg??? =N??;a^?KW??;?ȱ???}??h???? BʄN???39y???W??Ғ?? ??:??s ??9?t??%J??k(%?v?n????Yj??V8̺ ?t????1?U?ү??I??y????\?3b,?ʓ??jr????e/??K]?N????MI!FS?{k??鉒???F?kH???e.(cd%?L?R?Q?K??w?Z΁?4???h .~?.?????".fZ}6??ɕ`?'???:????1??[??3?,(???p6|??{?4?`?;Jt????d??UŽ?k????IYY՞O?eM???T?99>?????~???L???k??!@U?????W?3J?E?R?A]"?D%???~ ????;eD?2n?*!??>a?????Ң前?׽??h!U???"???넢???????Ϗ???????z??!1O]?BH-Sm?n?, ?cb]??????3?둓?b??S??m?B???4? ?]? ????1Ӑy??uB???CXP*??J?bQ?6F??ҳ?M??D??99?r1i?ڲ?3???3?s??????O???`0?`4&/??_m???~??FÄ?$c}?hFMfkT1?U?? &????? hP&??8?????7h?g c?\`~z???. ???K+?$?`?I{?S??;L??"/?z??ܿ?w??6???}???ɷ???~???:;?}???]~?? ?7?,O&?;?Ó???.? ?<x?? ~???s1??????1?:?k???G޼?w??:??????!?ل։???̀\Ts?D?hY X?"?U?)?$Ś?g??MY?JCs Lqw?Xtg?8&?s?ˆĎ?seЪ?@K? ???`???{VA???jq?M???2^0??Ƣ? ++???A?a?*?Ja?R???:?Y,9??? `?K\F?b?p??? 5? ??I??LUV?;x?)?Fk????x@???3.???%??MK4?hC???awkbMSG?{j???FY8/?f??l>?7?!??!??Z?Yfc?PW??+L?&?3ڤ6??? BN??B?Tdl???? ?T?_??D?d.????????jBU???3?;???昋?'l^?h ++p?r????K*6w?,??W~??? ???y??6y{?2y?w?U???7Zڶf?&??? 6SW?m??#]?L?f 7G d?2ϐ*??? ?*?|C?u9Ef]M??i?&U?j?l1e??K4?rE?K??!Lf?dV? ?)$Tk ?:?K?al(???2_??=??8?s?{?"?T??N?V،Ӆ76xt甭? ++? ++?1V??@?J?)M?????ׁ#?bT??c?h8@?@?-?BS??h?e?e??& ??"k?r?ҩ? k&iJ?B ++?*A%?v?Ү]@??A?C??KMd?\??=`r? ?&ر??濴????@麆?+ ???3?b?T57Բ]?TB$???MJò h??L?Kb?r??U?? ?o??;?????ʍk̺??hH?????a]??u??o~????v9???T?-e??р?XP55?k??ցx%䖼Pd{?????lnrzqL?B&??Ɗ?F??3?J?-V3?hΨ????? ??s\9???~?_?7?Ր7f'\}S??;??1???{??? ?z??}3k??????b ? Qu?+G?? ?l??:`??hݑ?%Th???L?? ?_(b"J%+e?Ȕ?f?Pb?Vu]???@?Vjw???:$bc?i‡"??A?x ++CG?ŕ ???4?\??3IF?ٔT?~+2Ǟ?)??LE?D-?E|~B2?]??!{??27?9?#@5A?ٞg???{????d??]???w?d?V?+??\'7? ++5^w?2?Q?pg, ?? ??]}.w1 ++hT4*'?3?@??6s?L??I;???j?4DK?鷩?߿?Z?..V?x?xB???]?s??W?E7??v?M<&??? }ma????B??ϐ??????"?~bcN?ߚ?2>?"?K?R0?+?ڑ}?,?y????p7,???_??K?o??˭??=ƚ?????m?D?????.e?׸0f?>?V6Y???? ?????y??[?37??l`?+=b4ܱ?+?q??i???M??|q?>ؔJJ?C/,{eE?????????mPp:Ӟ.O'H?h??Ũh?z?q???Zd՘???L? ???~??#??????????҂X??4%e?1`??89??`pU?b?`??? ?pE???+?Z?3/?)ůo?Ko??qn}??BG`?`???????1)'?^c8?????_?}q????F?U?6)???????????u????? b?va??a?f???'???~??rFT?>?????闎x??1??*MU??j?????V??,????f??]2{???^~???Dꊊ??ˎ??|??_|ʜf?41 B?;??y?;????@kNg?SՐ?^?3??;|??3\???f???=??g?7???g?tN*?=???o]????a??>?W???????׾??ѐ??????????&?#???? IDAT??r~~N???Q??????̄7_?6?ߺ???6t?????79J???j??b?ߊ?Ǥ?T}???+*˲a ??]??P!e??BP?]?⺒???@?N? +'??}?J_????? ++?7+x?V*X߁?Σl??V17+pv?!(źRD?)?TZZ???Jݢ??lh&?L PES??U?D??"?Ɍe?L?sN>???&Ӷ-{{#?? ׏?? ????M?n?u?a?+?sf?]??kkX?׿A`?'?r?7? 0)???3?n?/~???[?.????1???[|?S/??H???ţ??f?'PA???^B????????????%?ȝ?ט,?n????????o????m??P)?߽??'g|??1?U?d???/?????փwy?ͷ???????=???????778????_???)&?f>c4 ++D?!?y?V\LN8?:??w?s????/}????p?69:???rNh"?6Q??S?|9e?8A[a{б?U1??e???̦ ?m???h????[Whs$4??<<???)??&?^y?????B?FVC0%????'0???G???L ++K?8H%I?C???#6v?M?S???57z??U???3?L?*4I/ 3U??K?\2$?ϒ&b4?? ?j? ?:?h?IY3Wd ???? 5????c2?>#7?Y1g?????/??<b`ֵl Ǵ??6?\????H:?k?#?}W?kR???у ++?t`??[?5?w??Jo??*s6ۯ??:8@??k?Ģ?d 4????=?U?dr.jV???U?MS??"??d???????????!?????????#os?g????.??w?g???????f???g??,'t?RH/??????VG8?lq???rZ?sY??k!;Ho?~}V??????bA*iX??Wޯ?%ى ?vj5???X???B???jew?d???u?n?+"?z$*??C3????8???F????7yҙj?h????cϼ$?c???٨P9?,??a캕Hq?iv?8$??? 5?v???>?]XFw姞4Ӡ?:?)?z'?~?L=???/??r%?EY?3 ?E`?І?ni? 3x?,'Τ???WQRM??$Zͯ?Am??d#tsd8???k뻧9!9:?P9???????]?vЌ?Z?M'F ++d?u!??˭fvp< ??8BPI????ғ!>? ++~?????j??Wa???ǣ?3FT?"???:y?-ܥqE???%???)_cy ?C?@@b?D"]WD޾#?2w????VN?L??j%??? 吆????D?a-U%???#? ?6????i???uNuMpk?( ?O?g?E?>Y?7?!L?K??π"?I~?,?????$??????yE:?z?|??ۥ?c?E?7J??b)oI?G??=[?~??U???`?럵??.???v?:~P??w?A?:??% 0l???kע??\?N?A??@E??????0?wLO?;w?8?\ ?-?lF?Ԍ?"?}?*??}?\?]?D8;=e?9???f-o?q???!?o??????z??????K??d:%'???e$x}du?:?Q?????W??{?p?z9?Ӱ?>?o?j?zq5?=???"Z??=Qe???߫c??ۘ?I|?^]??;?K?]'????k?l??k??G ???ݕ>^?J/?)?嫵x??i%?6?:P?\??9?W??*??W쯓h?h?>???]O?????ˢ?????@?ܭ?FJ????F?:PX?g?9QW?D?? ?x?U>񉧬V.?NQ^?l$".>?:?օr???????ոTJ?J̑3?~????=&?"?\??????S????;Yf@kO]??D1??5tWf?YV??Ya???1??%?}????7?'>????Q.??U){8?^?v^9g?jM2?t????9>"??:>:>:>?C?C???J???]n޺N%?x?E?o?? 1? ++Ɗ?k?@?^'ArZ??U)?~v?N???剚?Et????}B%?3Y????V??j?p4bc???E?%@????n>??bA?­k? ??=R?B??ڮ??C,JP2?L?ۥ?g_??7?{?z?A?????3???l?Z?????m+K???\?$??7?X*???m~?{???Ǜ,?s??qX1f???u?6????j?ǟ}???9?{5??-???q?蕯??[?{?=^???\?3??;wx??n??????|??wy??? ?,po????!?\{??,?֣c>?}???;??|?Nw??}?w?w????f9j?q??ဋ?d??k ?1l½?[n^?*?]?r???>???l?h?÷??S^???op?P?㞤???}!"HR?@???? ?6\?VZ??? \+ ++䛪.g#?p?B???Z?R+?Sv?4[?? ?c?? ++??tJO6??????puui????Qԕ? IL???V!XW?"'U? -.O?L?J ++¢r????Թ?5H??GJ??9uԡ2G?????L??c?m ??o'm?]??r??>?c??O}?ͭ].O????+??{???y;??_?/?p???8?;!d%Q#RC?\??&??^9?0??/2{?g>??????+??????~?N+?????O?ϝ?ݟ|?_?̓{?/4kX?m?UU`?`??#??9? ++TIˎA]?jZ???C?gS:b?2].??ݦm;Y?3Hg??9CE?7N-č?S?"!?qG??? ?K?? ]?1U}M?ު??D??A?/Yf%FS?Ru?R???mv? ܿ????0??ͩ??$-]ʜ?-??Q??L??)?DF#???????&YL?bQo?.:??%j?????x8?m=?K?)?r??!VJfn??.?ZKbv???Z??l`?J"??]??^frLl?`: ??L&d???E?v?8?D?X_???#-??8 ??0?/???MhZ0n?7^????T?&W??^?͏??_??7_?^ ++????????*?? d$ܻ????^??U?ń???#I??`rv??????咐?t]K???`Ќ?z????q?? ???}?{?&?[??_Lj`P?9>?Kw????U?A???2??d??(??Š?̪??z ?/{o?k[v???Ɯk????Ϲ}Su??X$UER,?"?V"?v,[I??F???)0 _ ????C`'/ ?`?;ȶ,??E?Yb??U?jo{?iw?֜s?a???)B1?R/???m?n֚͘?n0]??ee5??,?L&##9w͉??uo;K?U??%??@V?cp???sL@??? ?%7F*???$??u??j??H??ĬhG??}? ?? ++'h?A"??F?I ??H(???)P?E???>?4 ?????#?????E?z̩??[O?$C?5 ?(*?|T4{d:,ݏ*?\??V?<)Iiv?t!\?Rt??Ej?'҈?????Y`%?`DE??".@q?R??J&x???dq\???ue j.?*f4Wg?C?J 0y?6 ˄??tY??a?T' ++?"??m??Rk??\??F?,??v-T??*V l??hg?:F?z?J=kB?Yk*?T-??????Z?&?S?v???>?N!)??y^9?\?k??j}?m-?P?\u??yCp?k 6?6h6?/???????.? ++??t>????>8=?a=????1M;?????맼??k???y???r???????s??Ƀp?2?=?ƾGV? ?W?M?T1x}Fu??ed? ?Z?֚????W?ls?Յ??9??$?m??Rphk޲?K?M@?? ?ρ???"-hL$?????????u%,??T?&(u- ͒V?FJ?W5??]#???\0|5?ƕIB?????ê???ퟭT1??k??˒H ?:?P??5?3????o??/?-?66M??E$?㱥GD??z?) ??G??]v?Cy? 6?[?Nz ++?? ???????!??$E\t??sq?????`?4???Bd?{???7_??W&??u2??z@?6V???[???焊|?wj9?Y1,??R8P\7?g?`b?L&亟?w?ܰ?2?Bl?j?S?????\؛??4]G??Ӿ>"???>?>?~?W7??Jf??x??eɌ? ?????t`1_ӄ,3 ++r?)??E?1?? ?6Ѽ??/????D44dϨϺ Ɩ?ׯ!1?C5*M?'??#??ƤV?8? 9SRA??? ???=?b?W?7(C? a?xc??8ONv?Ғ-??x??"4??#;rl?? ?0 ???]???0??{_??y?????w??m?|?Ɠ1???Wx???$?@l="N??4???ޙn???I;l???????G~??a?????x?ه??????&e???mη?{?㫿??????K??? _{?_2]?蚎4_??e?Sf?>az|L??!MD?Pr!yl??d??@? M;J=??:???)?qr??Ԓh?Bۏ8?{@:?5???5Mu?LjrTR???8:??F?&ȘTz"B7?f???d!=??5?}?b??-U?"#????6??x???,68??*]?F??&?>?[?w?Dž?? ??6??? m???gko??t ?m?Qcv?U ???֨ܐ*X????ñf??uN?'t]?f?? ++bR-#Bcn?&x,?????ͥ?*6???z?b?s???8???D??e??.?8??WNn??????qrz???;?????;????HW?h?-?N@??5???x?>?蓜???B?ؠJ??|K???'???W??q8֩?U?~6??_?~?V@????6?~??8pa@_^F?e????s4?)?4?N??Rɤh???D????RM+h4q_??E!dA???@L?K??"/]?P4Rk0Ѕ?bc?bB?=~R?Q???^[???t?EMv+i?W=???jG????׾?}V?J?}Q? `%P?T????z;?S*hML??e??R?u6??޻???? ++?˒:.??????)/Z?)o?N?+?S???nyX?????P?R???c;?hBK$b"???׸??M?]?Y??_?94???&?@??????|?Z#˹V??M??׼??~O5T??l?/?]??;/???z??`?*e?W?Uͬ??5??F-b?Uj??????'֏???4W?WJ??\ψ8V?????????^?ߩԼ???Q{X???^??%??r??h?-r????????????3??V??g?G????L?SBT6?Ǡ?F??G?6$R?V?? ++?????`?(?iA???g?W???9?ᦨPt]޸ۈ*???9?DP??? ??u?p$4,@?*?ClS?)?`b? ???hP„?4???E~??-?m^??c??P"%C?ϙ?2 ++?Q?J?Y?IC???g??/~??|?ۜ?Ia2???;?p}?O?Z8N?? ++??|?+/??'??7??"??g????!??A??+W؟ /???n%#? IDAT????Ĺ-???? l??_????m{?c??e??5?Hoc???ci????m??h?z? ֶ-d? =!?v ?d ++ݤ??D??"5?2??W??????m?2?v??n??xy??9Rj?y??E??xN?/?xq???>??}??????o?ƨ*??t!?~??k[L9a???{?????=d???????7?9?Q! ??Gdm8a?{?ݥEN?"-?us,?D~???r??4?@ɍ???P? ++r??8b@??zR8wq???/s#^???ט?.?l?? ++~?a?r???ăiϹfL??$v?:Ь6Y?ފ ++M7&?A???3?4?9?  Mh)db??\MP4{l?6T??s]HХh>?WJ?1FҰ????+?$?B??,1R?iA? Ȅ??`:=a~???[???m;a??=~?;?????I6?/?G/??/?? W??????qq??>8?焊GO8???????Y?TΙ??I??)?aJj? ????B?8?X?؊?FH???s?yU+`?P??Q?Z?UL??P??:??Ƶ8?#q??{,zVU???x ????ڳ?s?J?m?0???P[??6&K??M?g??{?}+?.P??|??l??!TpYȚ?}???????w???I˵ǯr???q4\?O}????ཱJ????>?π??g?Z??Ր?j0'hq??j??[??DF??%?UI?1?aDe??'??*??w?? ??R????s?pL?R???q??q^ǭ?S($5??k" ?s??+֯P??D+y! ?????}d4B????PksE?x_%?FAi??Ʈ?/%??kkmD????b??B?"?? N?X?%NX??=?J[I!P5?0??x?\.?1?????????li?%?x????D7!m??B?#I?w??}/#?qP;R???4;?Y?#O4???i10?'? ?HC????m?{>????>?)B~sB???B??X?boE(m?c??^??P?)?????Â??,??+?j?g??$????%??Ȏ???x'D??_\r`"B1?s0?j ?r?m[↎\Hb??vM*O??H?%?ZϜ??? ????_???]???o?܍O ?y?Ey? ++??a~???>_??? ??k?ܥrW? _???]?巾?/b?"??sp??9??.)!??6S??????rJ"???%;?(yW ? ++1????R?zn?iN?Wu`??R??>R???Bqŧ??bY????'????????O=?????g???r??m~??????K?{??/}??Xϳ?䎦?!??3??PN??r|س??X?]? H6'a)?PA?4? ??????!?̶?g?\,VY:a,-!GNO?f??6ţ??e?/??e??F?2?=?윃?.0B?S ????1?n???ͬ??Վ??H)r4PSX???53m???e!??[?Aڀ?̹??MN?ߦ???ֺ??X%3?e?g{?h???~oQw? ???3g??9?sU?Gs,Q??9??&?G?8?OF_"????V??AOI?? ??(?Q?????????c???F????Ŗnr??9?&?Zat??t-?w7?r????z??????????ıp?i9{? $ |p?=??M?.?quw???Op8?2?w?????D=-?D[!F???????6ט?$h?쓡FzG1{K?N?Y?L??]t7V?F??,B? V????&8f?iR??>J??N?R0?Gc? ??R??S???z?VdX?E??|F#{?NgG??9we??E??w?z̕?7???7&h???=??/ȩ??^3?>??I@Tν?K`L?5??+?ek???vX? ? ?d??p?=??#? ???????C?M??????406?,?FY????t )???V5Q??;]?|ÝJ???????????\Rk????auo?ZE5{U,,?iY?òt`V?d&?????&????|?ғ?? F&??`??*???????ڰVg????i?;*?\??/+?"??>k?W???V?6?D?eR?Y!??;?????̙gS??wV???Nl\| ????D??ԯP?ZUtV?3?2?Ll? ++?N4'?????B????[K?#y}?5???ڼ???}?-]????W.D?:????F? ???O?̳7xo??g???m????????x?c7?s??????4[c??_??4???o?t?QX ?6DJ???J?0Z3?t?t??cK)?_0?L??zO???Y?Jc}y;????@?dr???9A?4??A?mؚlp?֜??#JRN? i?9ݟ1n ?a???eJ~?????\l?(*?v?x??ł;?iiC ??4$?h(? ?\\?/?Zm/~?%~?1^?ѫ?6???U~??m&?A56??U?E????,S`?? Fd?? p?ȳeL??9??T?%??P4"J?WSw???cB?{wg?аwy??ɂ"&\???O?(??\]ء/'??????e?Գ?q?????'c??iq̐3???&??????rD恜?ǎh??`??ͽm?'{????LF ??{?EOd??????r?…?x??????9???>Wn?p??>W.?3?????{?6:r?i???????l4™^\???Ex????[?lL????e???ϒ67є???  ??F?9b????)???!X?Y?i)?(?vJ??i???:??/??????;?;?M?l~?????? ++!$????@N񃭵1²󨷬??d|?b?,?J??i??R?i?2???:jn%s9??/?H)tMbz̹???;?C|J?q???r??]???????x??m???O?G??p??.??ȭ??????5??^F???D??Ei7?#???? ++MlVu?'AX=q6Z???,?Ѐ?(?h?V??P?WtrM?E??@??{??D??Ŋ?HE??Bv???/ԁ??? ???Wɹ?f?^??2y???? ? ++|UHq ?.c?????y??Q?ҡN???T?0SUBk??Ԩ1,?PPu???9?????"?? ????7?t??w???+{?m?????ٯ?Y+΂?i*?????- g?.?^D?9?.S)??Ɉ/sZ$?M???]&??y?1?T2?ł&nXr???|J?!PU?>???AH?@7S??+U?}?Ju?8?V_Ѐ??@1(???!f?6T?m?C&??Ң??he?? f#??RP??-9@ ??^w?Иc ?uKB???lr\N(??RB9 ?n?29Cl1?S i?;J?? ++ ????+V??8???????< ?d?;F"??-I??; 4K@?ɳX0??h??#?" ?@a[l?? ?B?(?D?S??,?c? ?.J??0к?3L0b??]??66??IX???D??؈????7x/?e\?z??3dKY ++?? ????d6[ò???[ܭz??4Tbl?|? ?? ?pw??8?Ԅ]???E?o?`9???????k?a???U??V???>*.$#?PWt?k?E????L0'4??'??d?Ѱ???ጛ? ++??P-(?f???????H?ʜ ?;?{D?h???or? ++?{S^?ћ̦#?Zr???|???i`?3??30?J???]?xD;?do?˽??????????&?:n??6ǽB%??Y??????)KtE?K????j?B?s? ^???????-?Z? ++?}?U?(~&Е?X4TߟSX?*???@q!???}??5_X?}???j:?RJ???cb9.VWpA? ++??????l?K3?6? -??b ?? ++??)?D?xպ??!????_?,?? ++??Zr?>?d??4g????c?m?b}?%?J??~^???Z??ͨf"???0?? ???%ޔB?"???C\? 4?~?a?=??u?ɂ??1?Z?R????HE?h??'}?kS???5kq?X???ń+?(???CL?^hk?x??h????x=?G??Ft?0?cc?ԍ? 9{??Zw?;?FԢ̣,???1????բ???'S??)??G?t?cKU?h[?짟.?????????3?.t???#66v??BFN??2? ??E?????h*gŊJj־??pG ++ IDATTģ???[7p?%??ͭ?>???Z]I?Nɭ???aQ)?B??K'??`??X?????4??6ɮ<_??? 5?Jd?*Q:?Q?p??t•???W?Ǘ>?K,?2?9??F訠?????%?????y~??x?fu??櫯?1?[????O?)?w?!?=f?‹?z?7?2???$??>?n??????s?|?x?????+????m~??????ւ??\?r??????ӟ{?W?x??Hl?k??s???q??kL?????C??>`ry?????W?#,q`U %? W%b?n9 ?΀?8{?]?X???:??=% ++????????a:???sS4*4mC?ul???Ah?c6&???E??wArE?VqJrA?+?+?^ Я?@)ֿ?: ????z??.???Ƀ?Rz???xe????f=???4r?T???'Ć??a?x??].?-#??]?s??_??C>???X?fh^????ɽ[Į?`???PxdOx????????<_9? ++???=? ?`??S7????訥 ??W? ???\?????M??y??d?:?,?????))?l4#ֶ"y艡a?Hl?????zi?????$????b^c1ճ?K?9????w??ARY??>f>`?d?h??*l?ό?2??Mtc%?{?Q?)i?"????\z?G?r?????????F?@?ؿ??? l??rx? Ha?8F&???hM8=Y0?B* ?0ׁ/~?????ȴGB??~6wB??m?(??AѧĨUƛ9)HNm0q|?ó??4?ޒ??wbA??"9?޷??ט??dY??r??? vv' ?@ܘ0????ե?v=???1o?9got????x??]v6;??Ѧ? ?n߽???h?ZҼ'?t?DhL?OɄ???4???tqD?Y????}?F??\?v?{?c??qܠ%??m;??????K??????pzo?ŝ=??{~?\#? ++Bh?vml}yf???mr4?e??v ++,#P??l???m?v?_?w>??tF?Jh;?SB???ў??^b???g?cKȡ?c3?*H?iB?9{??ٿu?P??#?.?2/=Igtk?N?4&rR"F?H????@r?n??0G5?&?z?U?/DHC1?Tl???zhZ?B.?p?????\"?g?c??}q|0?7?c'????-.l?c-?????????g?c>w?*???Ɠ??;??Ώx???̇C?`}??4FDJ??@Z?ކ?JEb??բyI?Y??ju)T?W?; ??]??????d??{{?? %@tU???H???P?z?b????ljQcB ??\??? ?ו?J??[???*%??]??d???t5??Ζ`???s??m??|'?h ? ?\ߣ?j.E???????=???Ǚ??J?p?????bMv?:????C6?V?X?\? Kgh?Kq???:?????y)K?T ???ߩ?Kk ++??Ȃ?Ti?}-?Q?;?]hO??*4?|jY??Ոu,?r??R5b???+?eʙ????э??Vw4?I:???)??Uv?B??3??????'??D??p?>ZBU!F??J(R?%c??U?EkM???؛8???r2 ?B)??3+թ*K???J??PHBV%?T5f??D??`8r??????>?%?ɘ?d ?${?8???.??.???K_u[q??z?s.v$3 ??"N?:?,jITbcUP+??????;??m??{b.ٰ?5W?Wm? ??j????s?'%?%??.nP?e???,????~???~?sg}?R?'?? A??O?????????????_?[?x??3?C???{)?EP????Ͷ??&?|?utv??G;??F???qer.???Ps$J3?.??´?????93n??]??$?{???ZLģ?LM#???f3r/?%???????Iw4????m????|??ж?m(1Sb?":???ĵ'/r??[,?u.n????^?????:?b?4??+o???Wx??K?????d?????????ϠB??1??pt??_???????7?? ????????k???}??k??[GP2??[_?C?6F???????o|??????ޛ?Zv]w~???9?No?j$???L??Es ?xH5PDRl@`f?M??]gm? 17?v{?S? 1 ?fY?.???k??T? R??z ++M???*?መ=L:4??????E??%ƒ?z$_s??-?lsS?????P?z?/??ӧ3Q?3??:?PG????E/???P????Q?G??ǎVio?`19m??٫^?????.g??$??,ԣ ?_???'?qAݑ?????????=N??ʫ???Š?ht???EFMP?F???g?????x?g??w~??p8???ˏqc?6~?#???5?l??;?u????_?Ox??W?޸Mg?sv?,??x??2?6?<??O???L"Ӫ???zb?Gh4~g2?P;?{????:BJZ?? "fu???H?,R??җ??b'!9!9?#Q{?Ř?ғ$# ++??5?9??ܱ????uz?C'-:5{;?sq???!ŴK^??z혺?p???????N?k? ?`?K??z??@?3R??)?~???FFo??1?4??,?{??x4d??9??qu?????'>?;o????*?C?ʳ??cVO????s?f?.,??0?ұTi]? ???>W?}??8f`? /^?>es??B??RJ??:??/c`?)?S????? ++?D]??? ?t??????:7? ++^x? ^`?~)6?????΃?8??s'pgoƇ7 ++f??#?s??1,q??o1;???? ?~??VCU?z:???(?.??e?}"fu??????5??9y????SL?x=ɜ?7s???E???;?x ?U,?ۘ?y??S`Q3o??:gd?3?4?Ɛ%?9?? ?a$?z;????♻p?B?g????H?8?(??KJ?e%???>??{??77?????N#r???GJ4?>o??J??YZ\?`8&???? ??O?????????????U6wO3m(:?]?sq????.????G ?v????@{Uy???+??2??3E?C??ŵ????8?l?w?MJ??#?c?L?00?R?!?????1????LH??o?!?J??b?5?\ZPL??i{&ƈ:4?Qf????% ?n??l?9@???%?I??ܢJ?{$&???)?ӵ?Z???))???????֌6~[???z?*t"/?38?:>?}%ot?8lES?9:???4y??9&??s?F\??\h???#???Q?$s') k?,?W?????D3-°?O%9Ff?=A? ???A;????=OD]?9'????|???d??7???2h?t?Z???? YG ++?fo????p?!1??Ʉ?sq?k?1PY??????б?? M?dG??0E=?gw?^?(s???ƈE-f?9?? ++???{?@Tg?ɦq????-??5V;h}?-?v??'?58w?e}???ʟuYw?l'$|)?;իs1?)ʜPB ++#???CrƹB?O??S?R1?]??+Fd-?}-l] &"????l :?bA?4źN?????u?pc??9G?-??sPLx%??t????oD???!^?{?<͋?č?e????X?k1@h[%%???k[g?9????`s?????VMI{??????G?Ϧ4??ɭ?G???hu???)?~u?:?4V??5ݻ??Xj??)%c???<@?t]Wa&??d?Jhf[R????g???1???? }a?ſbnE]xZ???oǏ??Vd&9?V?^???9??{??LS?)C ++?P?)??? Y?-@?:???e??Uiϫ??N|)k-F?s?o?\????Y I?DD????V?[8? G???O????ضO?????%?gqv?h??؎}^A]?)?XD毭N???y_{???J??f??Ι0͵?wn?????B3?o??VfN?X[Q?X?UE?????????????????k???S?ץYl??#D?ހ??y?????e???1????{?ַ( ++OQ?`d?+?(?Jɞ䩪.Y2??"?(?'xakѱs??=g7??3?(q1????dɔ@?P%???N"1:??'?/???"???????MCoi$3??6zCcV?X?]d?l??=ȁ6"G!L?>v???x???? ++wI?$?q???-?w?x?0N<|???g8??l?????47?\?b? ++??T?}?i???=?/?O?8???????????k???~?o>? ???~??7??ཫ\:s?w[??}?;l?V?S?ɳ0?t?L?ܹ??- ++?}? ++_?ڷy?s???=?v'۸?>??{?????,?õ?vg?????&?|???????+?????_y?3?-v?ܤSػ??wJ?:??C?<#&ȡ?STU?^??q?i??i}?6??mQ?pE?? ++?,?l6??? ?T55k}:?]??{?eZ{q[P??2W???/1?w?8?+??S?K??sz?(????DU??ɐ??m???w:$I????,t??/,?S?hՂ???Pu*C??`?@?WR?B???pxI????@ ??w??^zsOI?%E???X??8???H?!5?l.??t?(?#%?? ???+?s??3???r??d?R?*p??? |???w?7u??DE?Ĭ?B-??`E???`?E>??UK?+?>3M?F???p$??????Bo@?g?:M?$g??????=?r???q?C??g?*??????._??????O_?s?n$J?y?]??g?}c?:????g?????l>z?[/?Y???? ++U??޻?v=dc???S?g???l?d:???????.??.??Y?ӓ.Ͻ?j+?Mw? ++?O?Sz?>?a???!k?s???S??tX#???"QE$?C???i0奮?E? ???;?2RO???t???:x"S?Ni1??ҏ?c???^l8?r2ܠtuh?)\f?߰?????U??HI???dz?B#?:eI.4H?ɍ??h܌??EVz[?????DwУ?]2???ށ^c?p?????Έ?H1?cKC?m?# ?5?I?S-Iyi#2??A4??????L?}4[!2 ?qds}??hb??O???w M.Y[֣?1???Cn?????a:X>?? ??D?(?Jy?!?NJ$?2z:RGm??ʲ 4ɑ???ٟ? ??????u????s????y???r??o?z?U??????\E$K?4?F??n\?͙?K?? ?:B?????qf?ulx??'?޳?cm1??0???k\8?F"Ke?,????RU? ?;G!?&Z?U!?????.? k???p ?}?|??o?`` ++?ְ?P?UQC ?ճ?jP?w???s=??S{?Èn!???kT?h?xyx?O=?߻???^Y<ǻ???_??_d??%??!F??ٔ.??`U'P{?'ȅ??T?[???s?/;4?????Qgȁ?݄?g???B??>d1%??k?jV2??????m?1'&.?64?q?hshDh ?6B7jm!8?̝*ޡkE?g???O ]y}[O??18'ཉ?z?@?Tu?hl? ++?O? ? ++]h{Զ?殳?h?벑kJ??-YA?薞?G??-??;E??,&????9:??B<?^oA??ɒ(ij?????-? hH$C)Fs???6N??d?=??UR?/??~?tb?iR?2???Ѻ?[B??ȝ_???|ݒ??Jwݶo?>Suk w?S??? ?{???/???fRKҵAMS???? ɩ?xPqs\;G???{??: ?X?ё]?/K3|?b???sv??>o??o???%??ʒ?B??K ++P?]l%?Q?&???O?u"?+?aN ?n???$?k%Ɉ??&?DJ??ua)J'ISk??2?? c????N? ++!???5???_$?萤 Qe_?u"?ԥ,Q1??Vc??1?o??B?0?hNeg?_?xѫ?YR??rT?W? ++?D*)??????k?f Z???q???n⏀?q??.???+?얜?Sy?J?1??y??Nn??\s?9?Xה??ν???S?Fkf%4?u}>wsk2??T???3bR?+g?n?;A3FL??gё?m???%nL??%??+????e?K?XL? ,??R??ۜ?rIɢo-?Ys?I?<__?Ll?Kl????mߴ5b??[?ݼ?Я??????ͺ?2'pZ?i?>cw??m?0)??;IM?-?TE??'{#?8? ?Qb l?ﱵ?Ε?7??M3u ?74?]|YQ??f6cwg??aÝ? ?\\???"?W????3L?? a???6Ǡk?$??7%?M????zݧ???mR??ď?8G?j"Cui>?????C??->???p?g? ++4????|:??5]̶7??gc>?LiD?5BH??;{?&?ٙ?}f?l??V???j?Ks?f>-??\?9%??&6PQ?8 ??4{!kl_?m? ?m???(D???5 ??5????YN?T#?[Q?͆??O?_eс\?w}}@~~p}p}p?įo2ܮXZ?r$ԉA)?+?ILo?W.??v?_?ʧO????JH?t??? ???F?4PV "??'??$U?{[c?????g?t?x?*.A?P?S????Ĕ :??Ʋ?H????#?ņ7?q??K? ?'?F%?L?5?*(\`?/??[wvx??]?????? ?$??&?E????y?nܺ??Θ??2??VM?J?'V?N????+?䡇????? ??㯞y?^@?v?Ǒo~????M=??9???L"???ܹ??y??v???~?;??L??f^y?*O???t/?????f7o???????7$????Q3?????M?CM??PO|QP???fF?o??D???dEz??F??=b?z??????i!ze???[??1??$????4Cn2R ++?0X?H????1V?_e??dai???? ++W?Swn? U?`: ++?^z"? ++?kF??????? ????M?hv?,4T?.?@'???L?cc??}jT??ɳ??&???J!??T( %,???@?A?;?Ya7?[??=(:'H??e???>?z?? ++?uL?)M>???I^wˆ?Q????K?/P?HSkl?G??HŐ?^??????-?q?? ?&??S? ??? ޣ?C=E??q???9M?0j??"4??ęcsq?>??=?8?3`oL<8?? ??R?d??;?=??7)??qG??!??c??f6??7??????F??Tub??p>i??Mgt?.??3???eT'??X93`XQ?? ?X\Y???X??K?:ޝ?4??zB??\??E?#.????ZOcꐩ:}??? \zz?dB0?H?Z???E??l\???J??H?OI??{r????+?q???M??P?%gi9?}?????Y[H;3?Nhr?.?????][??)R8?:LFZ?6:U?u*?)NI??Y???VӢ?qF?b????ss?DyDϡ.E;5?("?9?)X?????\?r ?Z?d?8Kp?_?????W??.??i-?m ??G?N?????$?Gk8 ?(Zk?i??c?'Iź??p?j?D? %?C?x??q?BK??i4?H??????O??Kz?ET?[^߇ ??89??;??{ ?YC??rѳЭ8w??޴?1??i?hc?j*h??VTe?5??d?fKj(?O?J??Xk???yTp?Lj????c̦??Tϥ?6?uehݓ??rN؊7??R?ca?v?$W1ʢ?w%?P ????y??aT???w???٬=??9'???ݕ??&^ ?8??Qm?&t??Y???1?>?L=u?U1???J?;k??:?O㬙????a?> $yR??w}}@~~p}p}p?į?0#???~?Y~?מbg???*?ip"?5_P? ??~?˼??̦cV6??Xcr??ʉ M??q??Tz@vd?R{&???$???~????q??8>?0XpR'6??C??)??x?Q@???r?bا*???&?u?2?C᝿???e?,m?w?U??A&? ????+?Q?+??Ӽ?⏹?u???C>??'????????G?????#~??ϱ??O:???"S0<9!???`????3|??}???K??ƿ??????Ugã.]|???????_???ɋ????????/??/r????{???q?????_?Pu ?t?(:???a????3??+??'B=\̭;%??u?͕?N?l?9?&?????Q`4??,i??UǬɈ ?E$h?Nn??=??4????? ?T?????’*ET???E ++U?Sߊ?d+~%6??c?W???̳?a?챵\rc?*?n? ??????ˌS*??{V|??….??????j??̄?Pш??A???????[? bp"x???????cC?? g,,???U?C?3?????R?J̔4f?Y?d퉖0B??\?3????f ?L????4 ?]???????.G?#VVx??o??O}??KK????pe??7?qr??ģaq??N)?~?6?jȬ???? ???Y9??έ????:?镬:έo0???@?F???#??*?????4 h:?{?w?ǁ??Wz?7????9F?c?? %?޻͹s皳????w^y?=?Q??b?f???A?????Zá=j?࢒7? .i?q**Jw?-??o6?@??X?l??? ?'y?Q?????3~?7o??.??x?.^??+$,??q?OX????9n??? ?/????r???o????Ř?h??x?N]q??;?w??QS?E? o?~?+׿?????????????V#*Z?bN?eY?A"%} l??V=???B?m?????. xB2Gc??~??M?׊???%u?????jY?n????>j?\? ?%? ??ɓiO?icwA?6'L?a?? ++Ol Q!??s?V?????(й????Uģ?fRO?*??x\tD ?δ?Z???.j?????y?!$?d??|?k?\(ւV#osmdO{_[Goaj??9R?u-?H??؜q?S?)%??'??lыڟ?Y/i?I?&??Z???r??(tfr"9?c"????);?&?Л?󪍉?PcC)?y;P?I????H4)??c5M?c^????R'?F?Sz??އU? p?X???l(????tMqJ?_y?h??c#??W?,;$'ҼwZ????? ?????:?P?s'?7?=??d?Q??lу?9!???֟?Οќq?$p??)"?Dm?`??X?g7jdq?*3?U_@lm?O)?{kK??"?F (??ދ?( ??;M?:?? E?|ޫ?*????aNt&"?yZN??H???va??1?Ѡz&/??ss?.ə$?Ϸ?~? ?%[?j!O!??A?$J?y????????)Mܢ???`?'??LǺ?ǜ??)?&Q? ++?2]???C?w?p???Xo??x???X?Xc:r ++@dzSjW8(JueђQ?????,n?\?3?9?b?3.?????pΚ??7???z??}????+&?Z????MT?eϊ??K?$?ߚ?:??mw?????`??'^?7?E??k1l ? ?R9u?,4Q?/?U#?g??(^?ZRϻ9??? ?y??~Nl???DUp???.{sM??98??,sx?D?b?,̓(H??o??i?yzπyd?؟? ??????5???b+@͛?ղ*?s??[?x? ?*!??Tu???jS(hS,Lx??? Wx???Y???s)hJ ++?)??sD?? ?????,.l0??$!Ј?}?h?L0,????a? ?@????????s8?Hq??G?i+u? ?1?U?d?x䐌P??E?9?? r?>?Ą}? -?)Q_ϵ???GD??ǧc($u???=m???S]_ ????gM±s????P;??)Y]fjN?jp??vl??]??\\\??k|-P?:?c??=?{?c?U??????\HH???!????d???±yf?????U)cj???9??.?ㆲL ???8"t/???\?L???v???tÀ(t? )JR??1??? ?;r?I?00X薄Q???????(??͊??m8?E??????quU?:aۨ?ȴ?k?m???r??B??H ++;W?Ʀ??3r%?iߊ???,?@?????)?sR?Qn???GA j18:????)bS?܋??tL?S??_?2???q?$?ۙ L?ő?\8r??i?Qu`?h?z0?o?}?? ++V???/?n>??j?1?b6;3??1?? ++?h5,?=???? ++n?;k?]????? ++?HGV?n????)?q?hn??q ?> ? ++?OсV?)2G!?>N}? ??G????D?o???C?A??JRU?EI?3c=?@]?b?g?u???mV7??/?^URf?ğ}?yfǗ??g?!ZŘȥ??T$a?h???x?$'???ae??gr?P??z???f?c@??Lg??=1g??5?#t?L=S?M????:???P?H??6???w8?pf?3F??? ?fv??d??b????M"?q)???g?7?J?"Ĕ?????T?+??UA3???;d?[`qi?Y8???Օ??? ?UA?T%g?ͽ?8?? ? ?5A??IA???$?Hlt|[c1D??k-"G??G?U??JG?z??9q֧T(?L=??B?!?n????????X?_????p???ȟ?e>????eBYp{?u??ʛQJE("????"??M??1m?u{8???ں1??u/'\t???A2UYqx?? ?,?HS?Ʈ3??K:o ++?d?ﰳhk?ҽ??Kt??L??p9??Ο?߹ ??2#?2d???+??8F??=*[b??;??/k?o ? .ӞtTha???RDcD?"????U??h????&s??-???????3[?s??<.?FtP?? 7)???C???Ӹ??HR?)R??????ݫ[?(??E?Ƕ??(]?s????Ұ;??]r{?aw????J?+?<[˙G?ۂ*??=c? u?p??|???{??B??xĭ? ?? ;G?nOx??-??{? 6aFf:??Q?d??3RR]????L???a#5Hm2?????????Yr????%?qtwM???8'????}??_[?:#?>]??F4?o?j?.???6?S?1gY????l?Z??Z??(?GέD?}?m?;sv?y??Wl?????сD2???Č??uNT?YL??=?cm???m?\ 6????h???'??tn8o?ѰrBW*s?:#zST?3e???<5?u??????7"KN?[B?????Z?N?,?>??!?b{w?Ó)>W,?F?????? "????V?:?%&r?B&?L?h}?=Y??~ȭh?M?H?0O??g?پ?.?pJXVB? D(?cgu^*1??$???B!?h}????b?Β?jʪ???L' ׶?Ȩ褝sk?\??N?ry^>??R? ?Ydr=?j+0??~??+?^????U??b?F(r???L1m?&Ř1??~vN䛓4?E?;?C޻VR6??R??\\\???p?z???????????*A???8????!?@?#9??????5???????J?<'?(h4`??^i"??y?Ǟ????;ll???s???& ?>??nOwa???(?.S?HQ8???`????q?/?y????Lc&y?Ǒ?????!W.m????Wn??'?w??u?????+??S?y?, ?#3?=䍗??????G?+L?gǔ??€???S??????>?K|?W?B???k?|???/???w{?????68?=c(?4W?:?????`l}oJvwN???V?^A9??R??9?Q ?H??)??'?Z???~??P^`???ߛ???C?n?)?????i???]:+g1???ֿc???U!p?q?!Fa?S???:{?_???.?{/)ez?[p?6o?{?n?Cg?ϭ???!JA????ؓc????a?4R443|Y?q̦5?? ++????RP\R?Ȥ????g??H?`???i??U]?23?3?5??y?(?@?7 ?ib??-????{??L??HO ++?'???3?"?]"?S'N?????jI ++ ?#Ӭ?s??_??IMY?B?M??IM)=??"9D???;{??n????::????:Ѿ:?%r?t}???%B??*GIf???f??e?}??[k???9?ܹnU?[suWw??ds??&-B?HG?GR@??8?S^?K?Ǽ?%1@q? p6,;?lQ??")N-????k?ӹg?{?!????Ƀ?A?B??{???? ?8$L?(Y?^?1?Q?.?x?_[??F{?D?????bgg??";?9~????? zV?7?x??X!? 9?,1z??zo??/??u?1???F?CI?7K?m??LA??v"?[ϣ?7zL???????8?n???Ա$?g1?P?C?N??!` ?۔#?cc??8??^?+??!(???9?3ض??IZΐp?IPP+ID?F?b?Ωa?H$???u??3I???>?,R?????k????t????6% ?i=????0??O?G|":O0 ++Z2!e?3\㇯q?m?vV?v??????!?W?}?Yh'q??׎?.?篐?'Bt??&%Bʛ????ߥ?S?K?X?ۻ?ԄΖYt?q???????B??w?'l?n?[K8?Sd?Zp??#N&?ιU???N? ?Ʉ6D??#?O?KW}?????uʑ???,?$BpL'?^?Q???$??b?^L?? o????^?پ(|??+|????޾?????0??m-?9g?p?qNFG???0???"?b??-06h_M?b?z???x????*T?:?t ++6??~??? ?xxoB??úD ++??~??!??zn???P?J7 A?ۮ?9???s$???(i5J!%?6??csk???p??k?/?}~J4?????????>מ?N???????m???E????I?DO2? ???[z???[?C6V7"!??樞?????1?w??9??-=u?OYF.}n?|??F??Ur??c?>?Cz?ǟ?ƚ ++jUD%??&??3Z?? eች??xN]פ?s?z??0??????I??TS?,I??\??5DE??B??>?.28odsDR?1???-4x???s??H&?|??Ŷ?La???s??? KV???ߒ?? ++RZЈ*?T?EH?jD?ށ????͚?!YLV+y????NҐ?]U?'%:MV??|?%vބ?????&?a?=@B?#?[?E;??>??????'??GU?(??8?у?&M$???^??I?V??^?.??w~???{?>????;?????}??{ƙ?Mα????Ƿ???iZ?T?x?H? ??F?Mc???[b??H]?Vz4m?WZ??Co?!M ??B??%?( ?ϩ?? ++????=??>%???? ++!%O?X?opn??bh???*??$??-q?RH???}v?A,~V?5s?f}?ǃ?s???q??#V7+B???#??}?!2?U?-?ɔ???? ?gG? v? ++R[|?7 4?DlT*E??e_??i??K??X ֶ???>?̘?Gl?牭??$/K?@?*?????j?.???>?a1??VAH??Qƈ&Qߢ1N6,??#I???%??? ?(?6h????%B?? ?,7???cU?9?_???r~?I.n????????????????}??Ǭ?o?1F,E???d?)?E?P/z2X ?h?~AQi?o ?1? ???????? ++????{?????????e}? ?7??z4|??_?]i?r???5???LMI?[??? |??WH???NZ?~?"??*?Gv?? Z&??g>?A^{?._?????p??g???Ⅻԋ)??5PT=????n3?Ω\Ao??8?&?c:?S8z? ??'???1;[?????????wߥ?k??c?=.??ڹ LC?sy?H?|(? ?f??}\TّK???g`? ???? ++??L???}? ?G?B?Ur??A???????????K/??'~?W_?O?mma?f4nh??ɋ{????? o???~??l1m 7??????????k%??x??{?6??+?????W ??sn?=ԑxE??? I????=?cVuQ?]?ZL?${?n>Gu?????F9{?#psD[J?? ++-?^??Ս?I????4??h??2nV??!???Z?2??,)??3$1??1?h?Z~7Z+?F?? !?,_?, ??4? ???"Ȯ/??0??%?? r?hާ?N?1F??b8?&????[9?6?)???C?-7o????p??=???????n?֭[????????7????G??P?Ľ?JGe*J??>?!)j?1?R?9G???]??^!,?]?_򢱹VH^ϑqA?yɐL?),ɹ?镅??p??Dj4???V?o)@? ѱ??4?YΦ??HQh?n?(y-T?cw???D?)?????F?AIh?/?????$?5O˘Р???n!??2P?^?,????9u???O =?]w?ɯ???U??IRɂ?t*?????wϨ??,?5?si?X?KPP????"??t???z?w????离?Q?^̟?9?M?Ha?Q?ڥ??j#?^???D|??xw]?t&L?2??ԁ???????J?:i^?gT??x(J?,?ݛ??it??e????v???y???沼?K??Ք?!?)Ҕ/~??\?Z?????Ͼz?͋?? R[?dN ^|a????:[;???'?9]R???Zb ++?'?©(??i?&=???8b ++? )_a????T%5?????#??IMQ??9kWe???J??H????7??~cb?l?l???8???.???~?;??A\"4q?h?6"tI??HT?MR?U? ?Q???I?`KA^HJ???Yβb ?񈩭?4?"읈A+1E\i?!b ??{?R??~?&??????o?@E??{#>?????W???]??????Kv?6 Hc?s? ??oQ?V9??F\?:U?9???m??McZ?bu@V?ֆ=F?????????K_???????a"C?K??+??%=|4㝷???ۄ?`????&??m??+?̏??????7?.a?)???X4?RLd????)??;??˗?????s?=??0?hf? O?????jB?I??7??F\2!???1?c?:b kC??H??d,!L??K5?(?h%?D>$b?* b(E x?:Q?,?C?>?b???ق?+98y??>z?:Z??s??>?+(?P?>???L?o?a?c?? ???Xb4P?C???K???D4?6?i?Yv?hgV?/?u%7M??%?զ)?M???N???Do?S?v?x????D? ++ ++??YMAH=z=??dNa=DS?Y?8q絻???Ӭn_???[+?G?1????n? _?,??0o',?>?a?S:?=?1?v??~1V??>F?"o??Fh??? ++??=???potDiK*ɂ?(?W{?MM=?IFp?,#q"?"?W????L?$z?u͠?D?`lA3??z??Ԏ+D??dBok?? ++??q???(+??d ++????y??m?L"?ʁa?`}??d:ag{H??4Q}??X?9z?????g???w???$|0???? ++? ???ʼn#?@UUhG??c?ˀnC? ?ox??n?b8???I???٦?=???? IDAT?-??u?E?FO?.??`??P{???c??? WX?l-r?h'^H??j?:-m????t?k?Ui?? ưuv?Զ???1??PقJ?o??+?????o??^c??pfg?>}?ɔ+{?0U??o?? ?l???;/?I?Z6?U?)p6?6?מ7A(+?Ok????~ ?-?iIV? ++?*H_?28^8K???Ue???]??Nj??Mo????=??7???=>????8???o?F????a????e??0??ş?_?ڷy???y??W???> >2 M???9?E?K/???{?m?8???q???."?3?%&?cάn?΃??zqW??L1+HU???Ρ?X?j?}.?????]??b!??\???s??]dz???U?r??)??bs ??̙???:#????w~ą?4???+>5Xk ?m}&ӳ{HA5?t>Z+??{?=u????I?????ijO^???|???عx?'?G$p???H??Z?????!??˿ī???63z????G????c??W??/|???8??W?T5??c?atr?????r?????R????)?a?ﺟ??????`??\??/]L????@U??@R³?۴&*`%%m??7hT???Jb?I?!&u?^B?,6E?@??7J?IPϷ?e???)?*?6 E??x????@h.I?F%?b?$89?+???+#dG??? v=Z??xu}(?B??4j6?g???+G?qic??E?mh?)?sU?Xy?}Ǽ^?4???JW2?GT??ck!?K????e~??&_}?j????v?? ? ]???'?yꘁ?qlnl?4 %?E??^??2?ν?l??҆?6?? ??? ?? ?{$f???????M1??< ug$??h?? ++???I?=?͟MD?b?L$?Ḫ?????IT?6f?  DLrZ?Af?0?(?$J ++%?r?5???LQ ވ?&??A?^??mjJ??L;???E?2?Y vt?92?S&??sd(x?]?Q?Ag?(?x:?Q?????3?_?F??h ??Q'6RP?Z?Z?3?3ir?M ??jј?ؙ?????%b??'İz? $?LO?i????Ԙ?OK??Xє!????7???D?1???y?_w???cY? ++e??}c?DH9??H5ɕ??sv6x?W??}E???I?Y|?A?v???ﭔݱi?? ???Y?Gm?n??k?H??a????c????I??ͱg?1d?]2????.]݃??K???l????9?t?ͯ?s6 ?lN?3?$y?L|n:????d%;? ???J?&??N*?\㗉XAR????h_???ԡ]????l?? ?1???V???g>A?3̛??N?7rr|? ?B&C?Zh??9???H???B ?ߌb?,?KC?8A?Y??b?t??a ?~P???w?ci?~?.??$?9? u&i??*?|K~w?sb??UE??'?????;????z???жNƬl???V???)???+\?hYLW8z0R?? 1??l??????????????1k ?ʒl¥????????> Z?4A7?u?Bq+V????2r?n??bh?_R????(p??.???0???[3?*p~k??????+O1?????MRSkwGT?1&GgDR0?pV?6hyp????q?h???r?4???>W/????MV???g煯?1???A??? ? ??1,/r?????>???e??xx??3???/|? ??7??#??????!?kF?y?c???????O-??t?ݳ?x?Gw????G>? G2???ak?d?#?z?'??ݚӅ?&????sta?U????1 ??q?`6Z`]???n??????????4&????a?? ?-?牔 ++?k[??1bq??1 e]?O??*?M????|M?d?;Mq.PV%L?@?"E??HT???ܓ*K??1H*l???w????{??>Ҏ@?*n1 ? ++??ƈ?m ++? ?g??g,?g ?b?"6R??i??u??d?ιmu???hr?WhbC!?3?V{{?TBȭE!bm?????Y????L?HDS?????VIԲ??????}?\? rB3?ְ??y??{?W L??>tO?O?0??xv?\???_????9?????9,??W?V4?amu???)eiic"C?"i????0?G?4?N,?:?fNU[l????R?hg,?&?q???J;hC?`??G M:???O???????EX_YcF??-?k?ܸt?o?t??????????+?M?????K??8q?9?.({%???????U????ʕ???z?e????fJl??[?,? ??D???{??O`3a?U5?u}??;?sH?? XѸ?ns3??b`?p?x?$??>?z?A?.r??O?X??v{%?[??K_??f38?2??????;?o????c1?[??ጫ???????g??O???#?+`???1,Awu???gv?(d?4}]v??Ot??(? 9K?P? ++?ƤNO# ++꤈??D1A???}&??t????Nߟڏ????\??@c??fUc?cL?? ++? ++FY?h?q??E?????SJ??S??Ο?m?<"??????䐊u/{?5?7?ۊf?@?$?j??9?N1Z?tC??{Q??,?N )??U4?9G???????h?4!Pa??????cq>j?x2????$?Uk?v?&O?c?5H0??????h\???,)?&֫ =?&???xb??`|??????? ?Q?: ++ch? Sj?2I??1?|a `D:?@״?pڽ?I??eJJ?/????S~?L??dL???$??:?C??J^ ,??5/! ?F??"$?8u???O$?&?,3??{?e i?*;???????:?u??J????SixN@?Bl?g3?iN4?1?ǔ?&?'?z?9x?p??x ?!?@]R?E?B@???"??:@ܐB?9U???W&??z?U?F57??!e?l? ???? ++) ++???۫??n??7d?????o??????՗???dZ?#???? ++ƖE??+l? 8p? ++??|?L??_?[?{?!;??sW??/???ͷ9?????_9????U?K?X?H??ǿϭ????-??x?A ?~??l ??L?|???Y?.j?????-?p???r??y??]?ڊ????9?-????m&^?7???h??F??[??????ekS0XW?l??G ??*t@?=??|?C??0??|N?Q??gVy8?!????D?F?vjQQҊî?z??w02@!m/j?p{p?a?x?K?!'?ʡɱP?5N???C?IUg??H??)2e5?,A?? $y#??'?ddǒJ?V&lj?7??? ?F1?? 3I0?U~Q{?/?T?6,??1?? mZP-U??7F̉?9???З=?v??O??????;?s|??fo??(???JA???>h?N?jͲ??S????[?),1???k?cJTE??dAo??6-?:` G??W?Z8?z????g z?J5?A7?&?l?ВV0M$?r?V6J?0? ++L''??d?Š?C??1?8oI&?y?d-?????p?h???kJ??#-???"??:3??xLQVL$`|?h4??[(?،?E??#???k???Y?y?*?????8???Q?'eQ0X??? ??&B??~??%??LY#??,?0V??$G ??#v????6;?>$l? *??????Äo}????ܤ?O0e???9?F?? 9?s???1???aee #?? Ͽ??????̠n???̤?NM?A???I?FJuN?? y?Hx?ѱ!pi?:???_cNֹ~?"??????1?/a???a8F???C???e,??X?x?cO,?jt?oM?I}????_?SO?????}?N??j???0R??u/????D)?S?0?;?m? 6 ???Փ;?I$?Ɓh?P*;???{?dX??A?&??f???C??h?{?Α-R??G?&???????m?}?t0??e????tkrC??G?E?AI???$??^RW??Nk$h]Gv_5?Vy??????4>9;7%??bvԩ?-tK???-_B????9?H???}9?Ɛw?= '??һ???%??'??J?c?xH ?U?֭??P?{?}<?,,??9?N?m??p??Fbe????m??p??1??3|??n0\Y?????c&?? gE?????ɨp{??d(l?[?|??s5 ?/ ????)*V?K??r?3?6?l?5N界?Z??eތ?f?E?LhJEʠ??y??w|?9?C?)kݺCNQ?????aR?]NŤb4??8%??o񘈦??~)24???&?ق??>?????,?p?-??{??Ɉ?\??U???ꐌ5)?(?C??q?1??I??????LjM?@?i?&/?u??|????/R??|BmK?3?5?J?Ⱥ?PU%?c"?a????dJ???,"-E?M???Uk,f?8z?{T՘?cz??p<;?WmP?Jl??{vv-w?9{f?s???l?V`?R?E??? IDAT+C?ɴU!4???C^?>;g?bl?;퐩z%뛛??k??_?`?-??T{kD{?꺦?֤?)???=?Hh?CR(I??X?p??[?֑?????Fh?????N??q?-~|?O_?ƃW^???????s?????g>F?W2??4I???~?K;{4??h??g~?:???????̓??i⃷y?C???^??= W?????{????f??*? /?????W??c????|??:????Q?w?s4?h ??ik????Fb)?? ???ѧW pEA???,)X??$6 &5???j??U?x+}??????M??%?????3n"iQcMK??d}LX???m??1V݄)F Nc4??Kcm;??i?3L??1d??|;g1^??? ++[?X????fA???}?翜s?~{????3X b!AR?HQ?(?%??+??*YR^?8NE?r?yS*??ѩr???ة8??؉k?$K%?XH"@,? ?Yz?????????*X?6???v?0????? ??? X$f???v9???h1Ƣ?GGO37??c???H?&???y???TJ?B????????h??B:?YL?b?,?jE????mp???IU~?7?ƥ???i???쓷?4ʜ????? 8[???@?Y.??+=JI$??,??2????C9D??!O^???????_?????????T!őEO??&?l3]8F?-?i6????\g\?x?????_?;????q2fr????Ŝ?^?g?_g??q????+?|??V?`6???~?v#g???c\???O??????#W?? o??.O\}{?1&?c?zkT.`1hc0?&?N???"?vǬ\_???њM?v?2??????????T?)Ji?Ϟ?a9Ut???` ZqQw?@\?(V?|????j???n.?uT??km?}?ǹ? ??f?^?'??a(r??????>'??4ۗhV??l? ?>?q???3(o?|?a???????????x??^???3?9?ʧ???r?Iσ$??V??aQ??a*???????gP??K???JR?Tr/$Q2?נ??Z?J?!FMU9????6?>?GE?D?'?XF?nJ?? ?U&s??", ?T?(K1}Q??-??ud3Ԁ?|q??sfH???? 1?!?Ȗ?v?? FG?>??)]d??I`?R)*.??^X ++NE??a???t????? B0?? V?????~FT>?Ȋ襇=????"#kgW?}?&?!? ++Uf(o ?T C???H_LĪ???8V?bVLWǠ~???;rϵ?gHG-I ??4????y]??j??????*??t?n? X???*?????[?I?(???ƞ:?Ds?(d@H?[?8&??B?e??.?kȼbI??Й?$?P,??b6??????? ?V ?Vt??V???z??3+\???-2?[G)O5???R??A?|??L܂?5?ٽ???4?rL??Q?????}?Nv(l@-?=t??F?N??ģ?i??*?m?????xpJ`ȫ@0҇T8M,x??Q!*]Z?R????(h?#.?Z????"?CƖ??B??t?|T??\?k?J-????IP?\???+?܎8ǣ?h9?k???6P?ѬRJ?L}z??? ?D???V1kM??Y?v? ?)?E?W!?j*G???w??L+ FIܽ??zo????)Y֪?0V˩?w??ǃ!g\? >?\?u????N?Rp-k?_????{#2.??P? ??]:?%"?S&?TՂ?~,? ++`Z??9 ?2z?e??n???󜹸A??x????lB??{??3(g.??b$??`J?6?5 ???γ??J?? ++yۢ???6???DbU2??h?Q?6???Ws?3??-???,3~?_? ?/_ ? 7޽?/???e2??? 9??? ?n???V?U??ht?? ?r%:??p??QVM?r(??r ??h5??k??~? ?????h(? '?1/?? ++??|?????G?R?2?J/Z]?#??z?gp( >?&?[???????_????SϦՆh#?yE?0??>d???]?661E??r??4????&?x?Ŭ????@I??e~?w?J?(?+n????W?P?c??L??E?)ޚHT?8?i????X?$2=???ڤZp?BA{?ziM??yE? 1Z?+2? + ?ϱ-???愠)瞢(* ++??{{Y?iUb?a?yр,m? ?s?*X?²??=mm?h}n??p??׮1?$-??7??1?!??a8?/n??ux??^e?? ++?V???4???2[?8?}??x@????+?[??????`JZ????1xGgu?????ڼ?Iy, ?????o4 M?m???? ?C ??J!?I????%^x?u܁?????????O???"?UǼ?? ????}?s???/P?5???~?_?7~???}?,??7?????:JGZL????????N6??5??3ss6?/R?QS???~A?t????1???????^??#8?sʲd8???K???N#???U?6???]?y??????????N?O?|?T݅]?}1??d$V????|?S?eT?,K?:??B?@?~?>?7@-??eT ++??yL??1?S?թ??G?z?O|???{ w?8y?=?刏\?8?f????~??=?????q??e??? ?$B?30=>???͎MP???&??Cb?X??(b?b2d?\??? ??8???? \ !, *?p@??PY??*??ް?(?KJ?G??Y?B(????'a?f?????}6.^?*+fÀj?Rd????sb??%(?? ?S???^????T?X???OnE$?`?XP `ޥX???]?]?+x???:%9l??ڈ?S?t2? ++q?%?sr??ॣ??:Qa?OrQc??{?$?bPX????@2 ?H?<???_H??\?.?3 ?cF ?`TET???~1?"??K?L???A;?? ???N?@H??????F?Y#)?>T?_J*Q5 ?#Υ??%?%??z??,??E??dD??y?????dY??z9:??G??#?y?r:IĶ3(????~\?k?XF|?0Y??0?4???ˌ???LK_j-?%g4????"?j?2???*u?BJ????S?X?? ??????:??? ?B&?cL?~?K?gH?ܚ?]v?/?%?? ?R?wĥ?j??????#?<?\A?pFN;???EBR? ++^ƌB??:??NbH#!?&?????PV?>-J2I?Q#*??T?5!????;? ?????5?Z??#??ǔR???E?S???S ?S_??? ?:?QF???D?&{y?S????6Yﶸ???9???&?A?m????u????d???x??????ȓtۖg?>?h? ӆ?4????x-?xĉ)?{?*?°Ѵ?w?6??????????????~i?SV?Z.".,??K_?:???Ϡ?Ql????y??ݥ?]%:'??????l?a|???p?????h4L???{??̊&?Ǟ?0???????ܹgy??O??6Evn?d??5???????W?TM.???x?Ͽ?vg??????6Z*9???p??#?????f??Ν???̠ ??o? M??a??@ 6.??g: ?^???4)+?dRb??޹???/S ??"E??>L)?? ???, ?B+???J9bP?hٻw??N?p??7D?Dq^a??s_????H??^?Ѣ??K=??08(???m??J]??A?jBpܺ??bz@??`s??c>¹ WY;?E?)??'?,?Z8|? ~???=?VXU1T?އ?͓=?????c?D?iql??-K??g ++*??ęa???????VS6?Y??C?+?!???|$??,7??b?V??u҅:??????kl????r?V?f???@?:?[]b;C?&???cy( K????Ì)?kQKs ++???e? ??7$?/Z?Jޯ??A??????) ++&?BM?????8% ??????ݝ{\:?M?fl_{?_?K??)?9?7v?0?xk??? TUd??o?v???+?Ŝ?³???j?L?W*?ڝ??rh??U??8[=H?J7yTT?BE9??*?Ei?x8???q?ČFY ?? ):?+??2?(?]`???p?i?h#?)g?o3??Kϴ??7)??Q?M???j`@a???Գ;?????j ++? ????l>A???DDOΟƀ#Q? ++hɍ?$?JE?Q0s'd?a?????"??????j?????JAU:fƳ1????=?{{T? e9?????ս?l?i??????ϲ}??????Ӿ?????L?"???cZ????[????F???*G??X]??F˝?#.l??.?ܸ?ǣ???;??w|???:y???????????r??z??9??˚ؚ??u|?????)if?"?Z?( ++}jOP??Tk?!%?$?, 9%~???3? ?—??V x%?ŚXrE????]6?יL???,Бj2??m??#˄??ߵ???̐?aU??*EJ??1)?6 ?d??4??g???RL䶐)?????-I\?2y&&?X?????EI?+??4??x#??ͨ?F?`????n?N?*rtr??[w?x4C+h?4????﮲??N?h?u???90ק?**?',$1?q?¨??+??rx8AE? ++?h%*T?m401??W??J97i?l8a4???w?j6!kg?;=?_~???t???V???%?r?S???p.2?'bKb?????|S?e$-?ٚ ?I???LcI??t 5?m?%?".?q9G?1#??\?N]|?=??'«&??/g]9?*j?m?? ++%?1???Id?]?[cb3? s0?M?t;+?o|??s??j?zy????L???5*?ʐ?X?ϗ??^???>i+??? &KwJ?&?c"l?ZҀ2!uU?I??>AP?'???_(=ץ?Rbuc<%.봁"Q??ߥ(u???q?VҒ??"?B[?>ۣTM' ++[%"LibH?(?2=A??IT?Q??H?????B6T ??H ???Q?Nk?&!%?H?pTm?(w?????"6W??L??z`'?g?5蘥??T??Hb\U?L?kN ?4??L????T????"#????Q5??7???????D?z?y??o??s???a|<$:q??r$b$j?mD?_??Z?嘏Q?o̦??? ?I??޿F(D?~?:V|????u?3*g?P`??\?????қ?R?`L?G????QG]??IϨ?(B?։PQ???p壏2??Ct P?@??F????d????/_G?7?x?˗Γ7,??????0ͅt%?T?l^?,?V?? d??n??屇?cBŅ?.{C?F{5???????????????_:f(U???iQ{?X\??_????>?I ??,?̲)y???3?,?4?ǂ??-n?>?hXQVG??"???a&?@?J67??c???1g?+??????M??un?q?'????1s?sg??'C??0??Ж??ݢh+T6`8o???.??FyX??44o?r?g?}??{Ǭ?? g?h7rv? ?]R?٭??LJZ?????јn?????!??J?t???l4?F+E?E5/9:be??Z?D???Oh5???a???s????????R??Sy\Y? ????q??Qf?"?ڤ??d??3???91????;?<wZI-?? ? ??t%?'(?.*?N??|6?W??/1G6c?h VB? ZTn??W?6ȁhr|B?Ӥ??\k&?&?8??y!Qw>E)F!?]U??LipS?G1&?N??9-B:??9l?I??6?*?o A????V?c? w߽G9?c,????T?1*?;???PG&???G?_U??U?}*RjBp2!x ++?? ++*???? ???:?u??#y??!??WXil?x?????C?Ϝ???????<???????^???'x??ٽ???wY??8yzj?/?e??/?r?J??h? ??o?MQ?? ?˷nަhd"YfsG??ޝۄr¨,iM??0?e3f 9d{展??q???k[??&?'t?o???o?s??$?, ??&.2c9?١?_?h5@??Jq??MV??B?? ????=?E?I?ݥP ??c~?2A?z2?p8??????NС?7?oq? ?ɟ??G??}?Lڞ???:???>?}?Il̰:?4?v????G????????bp>?B[?G?*ye?PZc??L?/ZQ???? ++I?f?4?*??{'`?8?Z[?????>Ic????"Ƥ(y#??:??U?΍Ķ#Qn????O^}???C???+?a???V?RBFU1>?\~?R%???F?`8?ۜ?xL??P?K?6???ˋ,&CZ??k??c?~??xB[5?@??Xw?YM?DOm? ????? P?f??B??? ?-????]??lv????FeL?c??Dߟ??y#Ν? ?9^?*?????T?u ++?'R ?)??????????o?????j??I?}Dq?????<>??K?[?n;??დH?T>??-Ā?^?d??)?4?E?"'80Xb??@yHј??nAr %G\M?? ?w?cr?X"?8??)@??????H??$?/?Tk &??F???.??i\/?S@"ߢ?}?,?|?j5?ѧ^€????9(?K?&?];?br?,?NM?3@%?2?`UN$?*DNA,?O=?!?y???3??T???ZD,T"???g?Q?F???WE?东???{t?)Va?e??`b#?J?9.T?F??X?U$}?*?6û ++cLrly0BrK???J?*?A/j Do?3??Z?TgB??"?-JqpFq?e?e^"?7nA?iY?LZ??:3P??E??R ?6?LDI?4T(&?әbz??????????xif-?ΝǶ\??)?Sw?T?Ht??0?T??#??B??E?hpɽ??v?Nx????KJ?J?eM'?Q????eOzM?KW?<??T?e???DPA?F?"??{?? ???>?>???W{m??(O +)?? y?i???4???{??YE9[??L??4??Ѓ??J??x?p2!F?+/}???=ZU?J??&?7?z?+ׯ?XFn@(U? ?????4?ڸ?,8?޾I??"_?`?_?Q?c??{????F????5?}?IvC޾9???ns???pR1???????5??}t?E,"?fTNz#4ut??.E?R???????:Q\?"w4????a4u?Q>R:q`QJ7V??dNț?j?l?Y][Ƕ??jJ?"VA 䅥b@#?XT%y??t?ɲ.?3Ʋ?eW??y????*#E?????v b"k????`ZF\U?Ȍ?JPV????P\????mf?s?'%g.?С?9? ??|?`1g???'?????^???"/y??_rf??`??O???7?T'g???1??p?@?W??2????e~???%?~??­y?_?)u???1u?#?;?3?Qʅ?Z???"3???;!Fw?i??p?u5? ??#ʱ?? U=?* >?E??&??Oom?$??6i??ڣ?dy?ÊԈ??l W)d*???6?r?7???P?!esf t?2wx?qJ?????x?LAf??ǫ???m??LF??????K+,^?`%mc˂?Ś^g??s??? ? ? ?R3?{<7??ƚS?H??@???&5??=???X?l???G|T?#?kB?h L?u<DD?9????ܢ??c48?h䢲REkbdZ?yF@E ????E???b??????y5?z?? ++PB???=\?s?I@?8oE?o)???FM?b????c??eN,i?G?:?M?A?C??G?N?UthP?@???$^?t??1ϫ?1o??+????Dx?+?????W????6`?GK>*???o?`{ ++(???2?ѲT?:H?????wj?????:??28?(??? ?C4???)??Ճa??U?z-?"?|՝???`xcѭ???????Rqj?+??>?_?,?:P??X==޷?{_?BDe=??N?c??"?4?K(?|??hBg??/??????o????m??3#Qc#ج???gl??z ++cP.????u??Va_?b?Čm?q?????? ޷pt??&dIJ-???$???scA-d?? +???:?Qf?GPֺ?GD??D?۹Ps?"?%Éa??cxț?P??/~??<?:??%l5?ٚ??????d?r?hT?-h??LF?+-?6??O\??˯???sH-qj?3?(~?????????KT?=byk?7?_?'??'???????Q??}?>?ַm?"?+??L?:?(k?$??c?=杛o?ya???vvio??l??ᐵ?? ++?V ?-''3???L:?N?W?|??OQ?٠?֎?kk?E?͛79M?? ??*N?C?М??$?(?ýg???0>?X?l??iV<?kA]??@? ++???SNN?t???R? ???e AIe+?V_??Ҥ8B??"??"I?d?X[??N1???p?Ba?"/ I"????uŠ?f2?ᬧ???4?a???b??6?kG?? ???SN-???C? ?3?z?K0Ɠ??4?D^??? eQ????^c6?????c?#??-?^z?u?t(FؠD?,??!?ZZ?SS` ++G?ˠ?UD????a?C??P??G?.?"?*̭ksj????M?~???@?g?x'0???6h?y?Ox??{T??ܽ?9?K+?s?52??? ???&????t?Y????/jR????{??|??T????C~????????>? ???/^??o?k???+? ???? 6?;Ü??&??)?3??U?xf??????t¤?#-?-ɫ?ј{??p??&ÓiPXK]?P?ti?ୡ??hB??k?jYЂ~??? ++?i????e?H=RkS?BAM*E?j???r? ?߹?Ɏcxx??h??????k ????/?􏡜?ʷ:a ????P?s?Y?? ^d???_?Hp?A?"? ++??V?R?uP?8??r?ɸ ++6ʑ`䭈?ưf ??My?J?????K???????C?D??GE?k?=??$iP?t??~????'>??ɔZ8V;-???[??????qn????8??M?h?l??J? &7$? KR?cOOM?-??`KG;?P?w??䙧/pT"m??????f?EMb??E??,ᵝ;p?>(??????0???8???ᎃr?p???y?GF?? p?~ۇQ??G%??>?+?¥???D?pkNǍ?????{ \t;j\?k@?g??Q}??gT?z????\??Ü??w???l?rEtX ++??h??Q???@?.??&f:?`??•7$?=?O????N?Z?T?;^Db?*['?}K?h? ?J?|?_??6~.??H2??H?i)G?y??쎘??_?“??1&X??n£?9~???x?"??~w??ф???????fLGSz/3*?YP?{??? ???M?5/??.O}?,{՘??????}?>jz;?$uU?J2|4 .??*;?P?>O]??F?1?l???8'??{m?ӂ4M????4EY?t????? Ԓ?b??Lx?=???#n????VL???(i???ϰ{2?8????J?w???t9???? db?š”N?L&?????]b???V???{??ޘ???MGH?bkEq????7?e???? ZK???Ƹ? RIҶ`VT??????i?b2C?[??`?jdU??-2.J?i?F?Ӱ?~?Y?SF? ??*???t?@?1??yO)N??V?w??~x???6?쐲??|m ???4e7?Fw??p2???9G??{?????ܥ3<|?{o???~?s\[????E{???䘵sK?'????͍?8???$Zbr?????`?F?'-?:?e4JH???괰%?????u͢??,?LN??zk]???>?xQd?\?Dت??k??[?????wos??1????6ҷ??^?Xʖ??? ????A??????? ??s??$?6?P?ie???b?,?qv qn??^?????????(KK??k? @?O?y???8??ճ??s?}???????? lt1?R?9?x%)?:?d$)???3΅*Wc????_??9?H?sh ++#>Q?#?r?L3j??T?+??0'?????i0?,I( ++n???G???6af???6|??2AUnI? ?σ?????? ?q3Wz6?ܑ])??Bؕ?4g????ܒ?Q*d_9??&њ?< ?#?LG??Z?p??V????ِv???o??M&G?\{n??;)ZW)}M??H?R?(?1Π ?hc I?q?D?????;?N"???Aו?@UXT???Ԡ??j??fu?G?+T*??!?R??:0}????Y??????gK? ??NBZ??- 8?????)??N?j?7?W*?s??Σ???# ++r??BU?݌z&q ??P?|??v?p6?? ??,2?( ++??r???"?[&?D˒խ?X?vo?O??"ǏvtV?~?&??pes?:1h?Q????pyi?G{??D?H?ъvU z R2q?ET??F?%%ݎfw???b ??8??{?m?}?y??fJ??0`:.?J??????舕?U??QixTY???x??z??9?????Y?)o?z?3?>Ma???]޹}?g?z??ȩ?E??f??c8?????Y*???/?$??????7??_b69?^???????XZ_g6???#Ҕ??0?Z,(?A??H)??????|??N??rk=?|f?2OYh?r<??.?l?1?T?!M??aQUt?m???h???3k?NN????FI?H2: ??!h??;w1??!??p?a?ŸWP?v???Ȳ"IA?231N??????r?B?FQ?֮??v??… ++Z?y??-!?Z+9-???52??&E?"X?????P?"8mx??3@??C????s?W?y??f?????.O???X???5G???4??a,??>?W?????O????^????+l??2?? ++ʓ??? ?*u?xĕ?s?ų?6Й`2?a????{?|?u???????? ?JHS?q6?Pб?????k?????'2?gh???N?_?o??????u???GSn\????s??kC?C?&???X???7?5?=©???r&?tD??ƾ?58?Ǜh??>?? ??S(,?C?$ lT?46?>?*??????????XBŝ???`J??d??t?w?`??Fap???@?h) .?O.?Y?~(????C$$ƀW??M@??5?*B?[z??xӀ^???F?X????? ?Ya I?? ??ֱ?L ? ++??|?)?GA????!ީ???E?H?3??9/????H?5?4??Dܿ:e888d?{%-–Z$2 @?O?3tM? ́?h%٨s<a??-???V??N?PՖe??΢????y??/^??I?O??ŔN???M?*?,?4_??:dd?%?A??o0&?1Ij??1΢?L?6???P??L"??p????&7Y?AA?ԂFi?I?,?V????P??&dݐ??LMiKF???a?????ORMzl|WQ???\o?/ႚfT??t????o?a??U?;??~Nj?VDR??kJ???u??";? y???+? ??C?|SS j??\l??w?!ք4Jߨ~??*栱?%`:,\?j?8???Ά??S??hܼц??????_Ӭ!?b?s??c? ?3O????t.?5d?Q?R6O+\c?,`??w????? Jd7??|???[8H8?qJ"?7W???d??5??.6?oER*?w???0Ɛ??P??NQ? ?U?DW%Ϩ????/??_ȴ??‹O2?????????$?u?s?@&?U? ?o@?#??E???qݘ?DT?F???~⍍?OT?G? ++????g?B?? $mSH??d???C???1%?????}?M'?`?-y?;???f?u??z???آ??????3?5???e??*?@v?P???O?u??????v???????'??,?? ++w޻Kr?¿2??i???Ϗ?G????7k+???[֬?AdB??a]U\?????o????y??8??g??:'c?\X??e?r??ڀ?7?? ++Ju?͛?\???????????!??&?o?????"? ??j\1+ ?D????#T???W?t?i?????+x???{?H?R~?v?&k??kE???%??tR??????_?=???ϲ??E?f(=?????~??T???????"?>??c??1?*tW?k??????*?+??%?J6Q?????&_|?9Z턼??ۖ?????ɹti?d|L???%?;ڭ,?v??%d??_??E?H??Զ"m%?'m?yPT,??tD???י?????&?Iں>??ڠS?os??????%????i?????!2uL&?ܢ?St+K? ????j\?9??㓜?`J?ТՌ3??%??Pxk?֢S?,???$?pz??5?T?????~??;??/??xRƣ ++p(2W?q??w`???? ?Z?D??_??_G?R?????o}?%?E???U -?,#iuX[Y%iY>?³(?8%??F@P?(?lVa}F??A???5?r???9;ZI???e?'84????X]?8UPYzK??A?m????H?H??3???2?? ????N?s????dn?6/?Ѡ(ܚ?s8h??R$iD?!ׄ}6:/b?x%???X֖?(q??iWs??? ++g ?T??%*Q???P=???NFH?ś?Ҵ??x??G???(??v?MU??? ? G?NJ??ٖ3PVS[??J?Ev?;$??(-I??O1?Q* Ըڢ????Tj!н????d??峋?y????T?fڧ?i???JJ?TR????h:c??!?%,??K??? ? ??Wnἧ,kZi??? u??|???G??g{ϱS?r?3???'Ȳ7>?~?;?W??{G?X;ä,I|??]+6ݠ?n????&???????[?G3?,????c?64eR??w??O\?2y9cae?????y?K?ɴ(??o???A?ʅM?&D?0? ?f??????$???'?"kCn*?:?XL?YZXb8???A?%?<r2r? ++fj?t{?????M??? ߺM??c?Z?.?y????w?/*ZZ#???W^?S????w????J:????t?Z??Yda?????*?????v??Sw?1?c???JjU?G??}???????m| ++?????L l?Mx??EZY?s[????u?? Y?wY?w???????^????Ks??¾??|???DP??? &??\?$??k.=??D????`?M???9????!?u????9?}?$N???AhMP???x? d???S??@?'?Q???D@???s?\?? @???p???)=?1*?g'????o???0??lm??VͳB?+??siش?g1????ƺxf?9Cz???????FqO??ySĸ??u??]|??7MD@/??????}t?????Y?RF????0?W????6?o??eNZ <0??`M$?4D0?t????Ǿ? ,J#?ܬy?????~??`lp?h??X????jwn??U?:2X?sڛ??"?T[4`n?f??5:?AI?*?>??]%?ˠ? ++L-?=4"?^?5?6?? c?qD ??\?~?q2h??Ye?'Ŭ????q,??h?*?غ&Q?Ç??qU?]r?L8??p?/?????????}?/?:??'Ȥ???????6?s?T ? ++??>???g??????a?DB????)????"?ノV?????0<>???? qج???!W???Xj?Й??3?)?*n-?Ng%%????K??ᄣ?t?g5Δ???~x?c[cˌ????/p??}?"gZ?p24X??UM?m?!y???-?6ʼn ++??ٔ?Z?+Mj??????Rlmi)?????3 ??H*T7?????>'??n????\T?y??(g?????E?PC?3^J??c\???27_?S?^Gw??i8?D?p????Q??VZ?E?ۥ*?x*k???'X?q?B??????5??PT^?0????? ++gBf??#?B?0?̋?.*P ?Cn?˞?o??̏=?? ?xg?6oͶ????.??/P?ZJ|mI ?ޣڒ*7x?hw4?v\?Z???]T?1?jj%H] :d"??d*????7?d:????????O?t?<'?????}?+kKg??ǟ???_ ?ί??o?^? ++ř?U??~??:d+]a4??/????C?^z??ވ?k?? UNY?8{????p???YF???xt??Χ?????%?[?ns?? *????A?v?L?d??r??pzH?e ?Ϣ?)GiG&??,??t??f4rl???c?#?W??t?p?>?V?^??C???3?T??S?36? )מ?2???%?>????; ?n??'$IdJQ??? ?[??z?*??iK??J?jZ???8㙕9? =?ܲ?ﳓ??e?qQ?n'h?I??N?N??u?A?C QmAzlYH[d?"k?Ȑ-Nq??w9?ҋ,??????W???'?\b:=d???h?(???'???????/_?o?????Z?os?b???GtW??,vx??e|Yad???ԏ(p|,ޞfr5^??QE?v?mc#?X?F?AQ?]??M?ڃ?Π?O?8|c?(!1*"???\)?? ++?N?M!\? ?5ao???-? l$??b},r+?p????+t??????@J??>ds????h??a??$??AD?3??F)??;,? ++?Eeμ?rH?~? @B#??c??~?tN%??*E? ?mc8A? -??d????1J??B]??3?S? ?I,?y???n\?u??uϬ&I%R ++??Z(?pN⍎?L8??P"??d??8Ǣ4Vz?(I???|?-|? ?:?di?ٮ?]vAq?????n?W??O"T3G?9??A?f,??Y?+?EQ?%$??:?nsX???u????Ay7qD?9??q?G?(?g??N??2??>ڷ2iÿ?mmu?????Y??WqZ??,???yu!oQ?#???+??88g]>L??N????????Ia?@`???g^ST?v?Q $?DP ?q??H?9?#9d????8???W?8?Ɇ8I?^?D?I ?#9A ?)?}.??P*D=????7?ET??#:$?4 ++?x&r4}???%?[?0??g????Z?P?=?ӵ!t?p???$ ++!?GG;?x_?"Q?G??8S??????w???$?H?=?@?Y8?G?????6???ٟy????????ͧ?9Gmj&??G{;\?<š???O?cb?"!?c??*ֆ!?L+?>??ֶָ?s?HLP?:?l???p??KP???Z?Ȱ??OIF?|?Cgs?{?{???q??3???2??J?uS??w???ͳ O?]M??2/??[???^3??8|???? ??????.?y??> ?]V7Y??Бe)?????ܙ6/.??{ ?1?=?????j??ڇ?z??2?c??a???G?Fk??%U=ewzUJ?????cKK???x˛?x?,?.ɍfkc???C?;?????&?c?b6eõ?? ?{??cY???}"???????,o??????t?L???p I??Y? Hk??A?BO? ? ?r)??%w?"?f?!?q???Ӿ??l?KS????DŽ?CĹ?, =,G/}??+?;q?ĉ???>An%???4g?????F??b?v?3׮p??&??y?YNYX?u????@s????^+#H,??)c$)Q*??9Q??JA?????B??"?j??%7o>f?;???>?+?Kˤa???h?`~???#N??ОI?.???4i?R?P?%hg?ұ???$AkK?O?'?f??????????:M??$?s?????'q??I? (?(\F?h?#?'Q?ZCa?i?\=??3???JI?4Z\????'?y??KLr???)Hd ++Q????4????A^IY??~?_ ?X???s3?M?I?I)ʄ?&?MC60\?=EV?Q?"I??????V?+]?: ++?n|??/l'?.???f?kƔ?!+??"??݇???`c?~???a4???-??8q?U?I#F?Р҂((???r???Jh?5?8?X???t?|>??~???x??v?M???К(I|???8"߇>??9??CT3BE?Aŀ E??h???Y???7?+,???:?Y=?`??ٜi^?`???\?x??"FKZ?)sMV????V?DJaKC??B? 1k????Ƶŏ#(?Vb?#??2P? ???h?Zg@? ??D?IN???rL,C'"??N#]L?Qo?Pr?I???l??37??)E? s??????aGs?]^??ԛ]"c1*b???~?S???e{c?FC?x?!???8X??ֿì?,??????9?8?_????>A+?p"??????5????G|??O??'/?????q??D??Y??f?>''???!?܄?;??pf???>[?n???e???'y?????w???M?{d?!`?m?ϵiƊ?o?ac??s??38:b{c̋מ?6?"MJ??????/?????i?v??KW?Nw??d?m??c??*ܹ???'?^Zd??c???(0?eB+U???w9??K?{?6?g?"Jå?W?Q??tF[?;?hoD?ۥІk?|?Nw?-cI?M?k??ϳ?????㙓t?Mv7???I?9??p?t???Uz? ??!???:???xDka??pH??2????? ++?n}@w???????w_?ŕ?.????J?????>????(%(l??? #?x??Ű?? ?%Ũ?? ??~???|8?????W?#6:X?K?4H?l?R??? ?Z?0???'?$Q??Sx`??)?EJ4??ӄ\?ȷ*}???9?J`J?J??? ?-"?(?XU?????(??c???lo??\:??f?g?}?-e&p?@X????_??;9??p???3D??3?d???????^?;?~???ڿb~u????͝???????xb?Rn\?sg???[w?R?? ++??.?Wx???q???B??0???٠??r3?Q?a?O.??t?i?|?T?Y5?/~? a??#?D??j?U????|??? ??}??V煷b???????mu?=R??T?g?|???B??W?MUqaMń?B+/??nu?W?? ++57???y?xV?J?q??,?p?۰?RJa??9?#??p?????ʞo?]h? a?sچޭY9I?ޤ$8a8kc??7+@??r?xp8`??.cw??????g?-r??9$3?3؋%?)??u??2L?=,???6y?~Ĥ/A<&m??Z"???@2? 8{?*yY?ȱ?c?;??ך???K???GH????g?];doK?zr???eN,.0?????Bo|??L??L?s?`??x??%2??u%?(?V?#jΐ???W???;???MfV???wy????ʌ??=Z2b???)??`?V???d?'?Z????Y{?N?Q?`4F?jPjT?jD?p???O?????2tGl??:?wtē?gP?1?8?ʳ???+?q?cK? ???Y:yDg?? {?o?????W???[?k]je?`2?j6??????O?ƛ?O}??'???C?????u???d?2????? ?Mh?+ k)n8??p?(??6?? ??"?(??+????M??Lm:bA?h2?Ǹ???2?q?{? IDAT9?? ?? G?d?tk]v?1?C??mnlnq?? V d???Y??? NRp? ?ut?qӍrD$??SHK????jO? ?w?t?H!IU??-?p?Z??????.?S?ѥ$I% sM?Ih??\ԙ?J? ?uX?W?Z??D????g?ag???k?O:?l?6?? p??R#?/pHQ???5???"? ??Wy??g?3ID?(u>??Y???^;??+p?ù!$?t>dg??$;?\X??p?~? ????Q+%?#d?q???K??*?R??ےQ???bAg&exX?it?MGj4???O?t????I>I9(3Ν:ͽ?d?8s??>?y???/]? ++G??Y???Q?;?C?9??????~??+???l2?R??0??@??q??%~?ۿG}??;???sמg?:l??g^????&?}?s???;8h]b??L,?1??}?_8?a6??;?v?X\>A?:??n?x?????7?????%?^??B???{ FC?>u???????oS????Oa'???{|???????:˵![?c?\;?p?O?r'$????=Z?$1yV`cK>)X^^?d??L???Ɖ?%v6??,?#?േ?`j?8?ݚ'+KF?&:????8???u\;??y???C????gM???,?[^???????????ǟ}?z,(?c?'????Wy??2?6(3??$i?<+Q???U?`?0?+?????U? t*?Dkx??o?;4?DE?f??u????;??k)W.?%???Y??En ?h??@???????7??0$q??-YY c?훷?|?ⴱ??%?S???????K?ЇP?? -??.tx???Q?E?F??:q?|r?t?W??F7Mc????%gq??ĚA?? KL&?#-#????%2%?V ??ج$?j ++?h5Zt?g(??՝? Ayw????0?????'.???#W${????_?G?xo??????Un]?@#&??ϰ???s?&}&???wrp??ʪS?|?X.?"?jnô????ɩ=av8??`,8[z???XSپz[B;m?:g??$@(?*Q)?*>Ä?y???[g?4??t?TD ++??X?? ++Jc???c????z?R??L?6??[9Uz:???ԇTh^?j?E*?Š?q?M ?f??V?"9N??S??`??U0U?G$F?QyҚϲ3H????q֫>E N?;??F??#?L$ &? ++?M?c?!??z??dԒJfD򱠑L??Gb?????4???` ?????.??8ʺc\d??Q????mnr?Ҫ?-?V??Rqx0?ծ?????? ? ????'?7=?Z?8?sjim`RT??~? ?$!??!???ڂ?6?Jyм???a? !#????????N?Ѿo?? ??|?-?C.?:NT???Wm@_???KD??ec+PL!???kP????XKT?֓t? ???ʩ???}? M{Q? d????#???%????? ++)=YH????L?`?Y??/X?IҾ| #O?(?4V?ڠ? ++???/?t?i? ?qS?Q??@?)?????թa??>?2?bBZ??u>3P(?H?ϥ???)?V?'?+???kя??L׾c?,"d?*??` ?o4^+?z!?_???W?V?M6???Z~?u@yx&y??ۣ??vJ?!?q?E?J???V)[]??͆? ?̸?2%Uv?.???G?s?T?!??J??d??a p?ZO????TN?d ??@??[???y?,??־^5?$Q?T??mp-?sm??1?F]?????gN?&??@?F?Ô????#~???4?'?? ??Y?p??g??1F?|?h؇X?=??WT?Wy0?7??T)?NT?OTc'?fj$CC? ??F???ޘٚbG?DQ???!??!???????d3%?=??)Ÿ7!???@H?S??V]???F?JN?v???????p`H?O??k?'N/.u98??ֽ?y??ŠrM???&G?`Ƈ,?y?b???"z;?^8?{??bue??%G^l??U6??8?|?H)&v???GwgR2 ??&G?????D'???y?1?v??f{w?~??B????}R5?h"?Y?P?z??Ҿ?G-?8y?????͇??.,??.??嗱e?<;??3???ppD?UC?S?)?%m?ll>?Yos??.?d?XՐ??Y??&?Y??r>'?;E??q??3?\??P?R4???I.\^?b??X?W???E?R???ؚpp8f8>¹c?`E;Md ?ˈ??8 ++??2?:RJ"!I??[?J????X?"E ?F??HIk?utf1??[*?H?E? 63XcPq????K0F??L?ǒ`3?m?Ҡ??XEYL?7?i?2!)????8??{???n???????>???Z????"g8?2??S'8}???? q?"?ŵ1!}A; r(?d4)?/&B??Lې?@?X?%"??% ln????X?T)??(J0dF?)?o????C?v?R?&??B??C??8!a<?˜4J??`??K??q. ++r?\??d2̧?g?4?s?4?,?aN?r??VM?+??%V?a#?o? ??Ȅ??T"#G??pf?(???I?????EY)bʉE%1??q?D??7%???,???7??1q? ++BD??8?????T?@%j ++N+?ԘR??!?I?TSv???b??"m?I?uT??P??e??J???ZR֊??N??????}\?1??? ??????? ?9??:?J?ׅ???V?=/ |???g??>ʤ\[=?^?8???pw?3?Oa? ?ʼM?tX??|?}????cD栌?Y?m?cà?c?$V????F™?6O?}?t??λ7y??w?'?]?ƍ{k????y<|?hG??w0????\}???p??#~?y?{??ƫw??Y?ݥ??P? Ϟ???s???.?T??ZaT?r???q?D?-s3u&eA$cLi)?????|p?[??u?[E????u?^??XG|?????ۯ?v???????.rm??jÓW?P????c^:?4?T?????????]g??????.?I??C?s??&h9???&{?%???ܸ??]??n?GK+?s??=6q??*2?X==?hF?ݽˠ_??%eϱ?p??_?????K??}?E?+??&?9i4?ls?Օ??ݾ?j????ez N.??{wƃ '?U??Yj???as?$e????N???MZ3?I??S??!:C?:???֊ϝ:O2l26??-?c?II???&? ???nD?,??!?{G8'ɇe#?Q ?J?yյ` ??)Ȅe?pL=\{? ++????A?`?ܾ݇?E?h?? ?? ??i?B?a-???NR????q???u???(T=E V???YM$??\?@m֙???Q?? ?Թss?v??h??? ?I??\?x?3?'? ??a4?^?]????Uo???v?????q???"Z$6E ?{?+???²;?"?Ė???^Q??4[;??,?6*?<1Iԑ?R??dJ??,?k?. ++?D?AhK,٨?VK???????pL????]??2???m??0"?=???^??z??3j?K?3L???7p????o??o??֑?wa?3?6Is??'x??Op??<7?~?HH??M??&???U?܇?@???W?U??ک??s? ?;AO?*Lyы?$????}??%8?>???J????G?>??J?VYh????64Xcp)???U??????4^?? ++ C8???v??z0?rLp?Q`?R?z??B??Uࢷ?&B:o#???V|???(?A ?P??,??ͥ???cг?_p???!??sΫ?>;?V0?Rlq?????SY???n???.c??0--iZgw}???=?ob??49Jz?1$Fh??q??%-?3??2T?@f?????5?m??p??c??J{???`EH"@F??U?Lj???m7?? M?> ?!ED?? v4???IΤ,??v8?Ãi????:P??eX??8%???j??????ZKx??T?ˁ5?g?O?w 2?D?Vd??(?1^O??5?? ???Y???Wd7?y?O?w>.?Cق?R?z?Q???*??9v??H?:?G?+++? ++h5??yM???CUg9?2 8a? ?pd??F?u&????????S????j???:^?𶜑7??'$?)??T?%??>'???,?sI?5????`5~???½?0??ᕛr ++@???œt?v?2?)d s?oΠ?=??'?L ??}??S??, 䌰?? R7????*?څg??=yH???|?Y??????pJJD???*N?x?????"?s?g JOB???}\5??X?? =????y???Ā?b????ɘ?/."?W??ʡ1??>?????d?!ڕ<?FZ??I?i&e=a?[?`k???G,?%*J8*2N????{??]?g?]?`0b??I?4???3??R~~t|t|t??CN,??@&??4?Q??UY??M???[[?`F??%?쀮????.cQ060?Lȇ ++?(?;??z??t9:?X?%Ik<:ܣws????8qb??? _??y??[? ? >??O??{?9???=???ӔÒ???.?s????wXJ??-??Ǟ?s??9????oR?KVjm~x? N??#?G?=???s???s??W.?eh ++j?F?洓?l?ϩ3'??~) ?h?.ȳ?(s??A??O\??e0s??i7a???ғsX=&+r?(? p??'??? ??ֈ?E??G??7W?? ??V8?;T??)*1?{?tw???i$,,??5?-`0??? ?X?????;? {I??; {{4?u??????p(?&١ρ???>??N;T??y*=??xRY?DI??H*?R?fd?e?c?e?V???X ???q?3%Jj??Rt9 u? @kCG? ???????B??%>?(X?8???ɉ????@?й#m$?????=??V???|g???0.s?I?B??X;???8??v? RhT?Y??HcD???c5*?$c᳸?񥟱??h??:E??c?3S?GW?:??K?????Lt??1)2???44{?s$)??d?P?kR?(?@?W:L?Pq? ++???tfQ??(?QJxr?%?hJ,?+?)?g?F'??o?[??U??'w?r??/??o??? #y??D???>6??b??UJ\='.j ?r?(!J}^?????9>?8?S??~??g???? Y?Id9?c`'???4w?;,̮????+ hJ?"??kKD?9?]N7O???[?x????ǚS?vMr?f/s?? d?3????WY]??gO!Y?^??????????tu??{????????2????_c??Or???Í?:???VC?5V?P?a?????Ƣ?Kp?$?H???9?c??ĢAs??v?O3?u?=?Hrt?ǩ?ܸ?5q6b{m Ւ z?۔???]?sW>ɣ?w???ˈ??0??wX?{?a?E????`?? ++?p?҄2??J?i??B??0?@?ѥ]??v??6a???7?ޢ?.??5Q?`????$'AX?o????lP8??M]??0ZR?????GJx{q??%?S?5h"??? ++?@d$ ??",Ψ?MJ??9#???*?`?賬?c!?z?y?B???+̬3 ?ɈN?A??=??8Q?X?B?o[?+u??Xd$?:?%W??0?p&??IH?v??Gs $i'q!???c?B???D?K???+?!???i?w??????Z啿?4@???u?zR??x%Ik?H0?r?۷ 6?X~r???٤?]"=,ypT?ɔ?8?#z'g???'gh?.?????,,͑??^?9?Z?????/\??\?،?5??|?k7kǠ?&??f??~????qݙU????N??5"????8j?? ++d?? ck?\B1`2?GG?e??f?Rj?"?I??Q)??K???M?^???4:A>??D>?CNu?s8???@?6˂p??5H??FSd???\E?+2?&????8?d?E?i???>?L8uv???p?1?1?I-?? ??Y??????R0)i??Ї%? ?.???w?ؓWhv?(?????m??6???Ǜ,.???|???Cv?92??[?(!??!C5???>),?#?@??%r??:??(ˌ4Mȋ???@??T?a3??E?֦GgQZ?,y?Xnm??#Il?h?$?j????Z??J8uz??(?ƽ??56X8?12WpV??V?զ???????????"Bf??d?7S??b?jg8u??o???SO?41j?)2???qҠެ?7??%???8??|????JI?j ??ƈ??w?4RX??HQ ??t#) Aq???DD???ޛyv??]??????s????ZU*??K?Ҩ?gzz??=??lc`?-?xr?@&??A?!f`f????g??^$??VI??R??U?{??s????u???y?RY7?r?????n?:2??a??B??h?cm?6 ???N4X)?0?.g& ++?7??5elD(??ҳrl?I5Û44 ??qei?`???Gi?0H?^?E???}??? ?????L%E*u2BK?6X?i?1E?J? V??R$?e%?@?-h??=??4v?E?c??ɽ??͘M+T??48?V?18?l????Ќ?R1.? {??p%?+r??? V????G??=*K(????X辶3?o?l/ ?c<( ?c?!2??-$r?3?d?i"????û?????>?X??@z?}???l???g>?r??~?Y>????۴??r 2???%^?mH??l]?WM?????/^x?[????? ??gN???????3????L???v? S Ƈ??B?? [???@??x-(??@9??????ɽ???'q v?_?K_~???o??????????_z??>|???ݡqSas???G?k?ҿ??j?ٍM???2?N??ʚ?ı???A1?҉e^????l????{?_c??Cvvv??+Zb?5J??4??6d2n??H^?lG )?f?eZ?llx? ++_}??r???&+?>w?~???????%?!1Ӕ~??po{?g2?< S?j?`T?iA5???EP?a<3,?.???,-Hf(\)h6???o?!?]p:!?w??O?x?I????CN_?J???0dB??I?}|??W?B? ???wԣB ?˿???@t?7r??{,D?n1_?{?A?5W4KQ?L??D?AY%x@? ?X?T??w0WDPP?#K@??s?QS%%I?#} ?HdH?LT????ǡB??)m???:?l?>f???L???$?D????y????<7??? `??I???Ϲk?5???J"? j??xB?_P2I?ʣ?DfQ5g?9d;???H?#????????͒?r???????u??Yķ?!?DY??C?Bkj?X???K??)#?X??`0? d?Ο??'R&8;???`???o?⬋??>?KP|E?ܡ?g?'?ƈ(??N????H?@?58!??;?P?H`???>???d?lП:T2???d?C=rd???~6?p???#???FRBPB?(1Q%7se???1?}?????28??H&pD?! ???BX?D??2??:Z?z?%?>?????!?:N\j?8???Gz???<`????? cFbP?C?0`A?x????????9?????ˆ??px??D?4ƍ??uf?w}T????1??G???fI ???)??9#%?wa?????y?Ь?>Ă?;ܪ?c?t>X?Gy?????\g2:?z??Ca?!h "??"?4c?J?a??j????~΃ *??ψ?MtA?'U?????`m??qD?%X?)afP???j?v2BU??A??????=??X"M?p?P??Ҙ????W`@?X?G?HJ?0gJ?-??i????1??o#k·^?ͼ?`2???p??t??]?h?ֽ ??!k,??fd??vG??>??????/??t4?x???w??i?l??e?:V8}?eu@??do???v?v?8?B??Y혒2?G??ؿ?C?z֎??4-C?Ϲ??zy???>w?H?p? ?-??????W???(??,?N?ڏ????O???65???%?n?kw???6 ++?ۜ|??????{?Y~??I??BB13??M??y?2???v ????3?H??VN???ֈL?????ɋO ?->?v???L?1???????G3됦c?Wcxla??R???^(?Czɜ ?z???!C?7?r?k?.????=?]X??i?%O-???5l?찵?p? I?S?S???bqaBa[[?R?9vV ??y????xJ??x??? )4Z+?f!? lܝ?$?slIǠ-?Pn_?G?=??V???E$?k3m#UaC??q?Fʬ??F?{????!G"?%???/?;lNI?*Tdg?ب?;?RG?????U?w??I?a?T؄?}r??tB?$? ++ ?P?C6?O?ՋRLF?K?:A&?ږl?4??? ??yAh+???VV*2????"????w?Hl?aX%??BFJ??V1'??????v???n???j????*0j?\0?^ Ll?jT????QL??ʃ2?&??545?J????|?6TLaI2?r'j\&?wS??A)?)?4??` ?~T??_{???-\???? ?I??????̿???&?&S?S?]??P??n???A`ܷ5??^㱋'??Q? ɻ)m??Zj3 ? '?s?c??????d?Ќ??????????~???C*?) ?oYz'?%?~?{Âr2?WAe$=???ڸ?ڙ?!?X ++P?v????ie?N2?:Xh??{?'ά?5as???5??س#???|??!r?Q??(??????+,?woA?*4?E?_b?:'??3?f?H?b???????e???? H?Q3?????3W@J?WxA? ?QE???GP?H?ȴ?4?^ñ?i?8s?߽?3R???qf?B???4?$?U8t?[ӎf'c??4ɯ2Z? ++?˹??!?=???텋?f?*?v?΅y-?@8???0#??0]$?g?*??2???3C????k?? ++? ++T??3?e?N!>P?nnXBqAD???w?j?ef?m/y?i??:???V?Vpx ++?S`???c"7W ?A?C?o?q?A???5???????>?sA???x~???膝??|?E?l??ɜ0"?5?8??9i???=a??????????:???? >u<8̨T??"??gmXە?+79???#p;?o???%;??[&?p?a?=?:G?a?9Z}???????R)^????C????]Xc?????? ܿ?s??d?M??q??3_??aݧ?Q?=?ѹS??$??j??.?o????l??G*A4s׃????@??Y?PX??X???X\a???(?q?U lm)x???i-??ê? + }?-??"???S[?u5? ?%?Zjj?x?x6 ++? ?h9???{?Գqwē/?ȕ?~???`a(?c??1?)Y?B??'9y"??"xk?6?k?ˏ=?o????7??U?D ????v1?0[ ++?n?\i$???ҵ??SC?Z????? ++̸B?R:>??Ԡ?ƥ5?PE?đ?m?؃??V???xKe,?cl\??Zj|&??gb\?g2???5??6?Śέ??L c\??L? ??0??tR֎????ifG???}?ʂv?????|??fm?s '?I??-??k?}n? ?cy!????|tm?- K}&?C??}?6?Ξ??貽W?r??s???~6>???g :|˖?I??J?R??;??4e]SU??Y??d?r 8y?,???K?kl??????B{6???????[ﱶr???\Z???=?͊^??4???.ݥ?-Zm>?| ??K????q?C?/ql??'ܣ#=[SMO$?? l߻??XF??L??W^Dw?P9L1?xG??2? .?=???>?Xg??SO??q??,9?]EJM?g8?k?9????[W??6N?]X;O? ++R???O]W>??/???Σ?cz??p?L8???Go?dz?#i5P48s?8'??(?K?]y??????pPL?/?Tb?? ?? IDAT??Xnw(&?]~??)?C9???K?3?[p0??[???; ????[ԣ???????2t:)6]??a?????E ?SO????]:?V???|?Ǟ\grm?ɨ???&??&??a3??k?`RTTUA?n?? ]j?}???O=?8?q??]???^????t??l@?F ++??g????+??7^??ϿȽ{[?i ?5??,?Z?^Y?ht??!*?xe??!MZX[aJ?jfT3?n?s64?!??y??)?a?c?NSU%??썸{}?\P?3h%a?{??EOe ??Xk???d?g?>?h?hu$Z????d??cm??? I?J'??%?C X\5?#?я?P ++eS|??z?ɠFHAU? ???????+???23??M??? ++Ŭ?8a??D??#,ld>???>??:29??b3?????1ʿP0x ???l,?C]???V!28?BEX?SC??>???3O??7ޠ?Z?YHʪ ++ů?Ru??ڌ?F ?(??.dNYG??8B?P?1?q9%?s??$???w???W?h ++4٠?>G2ϑ?e?)??th??ƃ??EȠ?pV?$??^?7r?#??Zl????R?9=lLb???:?.=?????U??X??^ Te??3?c?RC??b1???Q(??M?a?✐TE4HݦT2????gQ^!2?V???AU ++????Ml?:lM??z??Y?????=?{?-F?¦A?#??)?/ Zz\??? ?IM&-Z????F?!YV?? ??suh&???M|?Vc ++??*??ɒ\Ijk??D?gTTeM?J`m??w,]??6 ++q?8y???]??h1?????ǟ?A?????s??a}F???wk?????ͷ?????V??ܼ?A???FR??N??????2?|?D?LdX??z???YTTî???Nb͈???s??I???E*??n=?o?;?:߸?????M????c:>?j-??w?^}????.?J?nrgw????F?#!e??*I?g?? kx??ۘF??dLSfL??=????M?y?, ??* ?I"TU?? ?*?X?*???:?v????^????_|???wY:???k??K???=.?|?_??_fj&?d ????2(wX??b?j:i??G?8?}??q?B!??v????.c??????/}????ߦ?d?W??FxH$'?Ǹq?:?$?IPS5; ??)6g?????????;?_??B??iJ???h??`8?(?׎??ce.~?C??N????!J?ª?????i?p?$'?4?s"??B{?$ia??ˣ?G?L ?hG?#?OU?T?eyaz?x?HӜ???0??v???????^y??_?,?????|??$$J`?`65??ho'sƓ?]zSCq0?ȁ?NA???U?u8???EAe?v9u9??R??J&?J?????Ȍ^;???`????B??Xaвÿ?????}?Wβ?q??9??\?!AjK*Z??/?k??v?????$A5`???l?A8'?xBVAY`?07][?H??x?a??F"|㼏??C*??????U)?H7? |,???x?"? ++?HBc?6"Pbb8f??C?%>=??{?"\3??Ԟ?ץ?b?q?"?F ?zY??\bA?#[`<`4^?о???yTl"?o??nL.T????=?'x?!?AƮ???A}?!z8"ܥ??-q???*??E??h@C-͡?t Q???Tx????T??@?s?$?(-????? ??lM"5&6????J??3?7??J+????:?? ???gO?(? ++=?qT"???“ª`]?&??nFe=?D3dB+?ߏ???3PN ?z±n?????a&F?] ???&( ++?xiq1?Q??.?Gv?%BĆ?sq??98pG|?? ǘ??҅???E??񽚃2?Y? ++???X?[{??1?7??`? ++*Iû??!(9G????΋C7?9??j{)?`???;R???psUe|w??n?nD?t??"ZAF"0^???C{?P???qdTR 7??yzB??s?i$'??.7f5z????????\?|u??5?P?-a?nNGf?$???5l??ɸ6?R ++qHV $Ӡ?u?!t\s"????a~??? d?yft???G????w???,?6?ē??????s{p?`?H?.?b׿8??;5?֧\?`?t???e???‹P???U{??????S?Z???p-9NВ?r?>???2?#7?????(??SV?? ?`????Q?,?8???}????x2?6?????? ??J?????B)MQװ??Q(?n??S?L?đ?\?r*akk?޲diy???e?꣄F)???RS?S??{?y?_?=???}???[?:?q?2????R??? ??k????u?֕hBc??6???Zt?v́D?!>+P5α???? '?????~?Un_{??յ??e=2??~?1a?1?tW?,?@?-+????DɄDB??QJ?g5??L0=???G??%?x?]??!??  'ז?;P?#Q?{?Ҥ?L?I???^?潏???3??F?Iv'?????@??ڣ???ۻ???X]j??h??ф?j0?*??s ++S?6$?Đ? ?M??sf?c:?YX^???-??p?[wv9??<??diq??h?X_oqks??;?????YAԚ???3???N?9?̟?? ??l|6>???b??p???O??U?9?"SV%!?,M!Smz?6?=:???y????_?}??g?PT??c+|??e??~?+??~k???+4G-n޿σ?\???l ?=^y?ݡEϭ?!M??S?b?a? *?q??&_[;???̫???O~|??B??ۻ?i?K?}???!r?9?vׂ??h?cT?c?޾???2?V???m?~?:???w͈fo?v?pn?b?Gi=?8???d4Be-ʱ?׎?{?;??/=^*v?Gx9?c?X?`b ????U?Y???^c??Ev??ڕ4n=d??d???Yfs ++???.??X?)??d?`HeYk|?P_:tS1?MB?W?*2:?-ƂK?+gt? ?s??"?(?I? ?R?S?(jS?XXb2,?ڐ5B&?p???II???spe?h ++d?A ??"?Ѫ/??l6 ??ڥ??????[դ??[7n???K?0???*k>?{?եe??F3?5My??u??D$??&??'H??x??,I9?r?bjqކ,:??{#?,kzǻ???? &?!W?%ɊmZ?????????po???J?N?e2??j?u?nr??]?ň?? ?????F:?l?K?5?mA??d2???r??R??snm???D??k???*?#???? ?x?9ZB?p??AzCY ?z? ++?,:o2???2????Yll?????f4?f??3*,????#???HTC? ++?6?????Y?J??t*$B??1??*ʐ1cB[?k?|????uc?j?u^x?q: ???d6???-??Oi7Z???6x??/1~?q?-?z???????+w?:現??,-??=??6?^R??5尤(k? v?Ji*?P???=ˋ'y??w?=?3RK?x4CyOä?*aجI ++ 6? ??2?y??????O???%???}?_z?)n]??ų?s??????????????}?I???Œ8?~??V?????? ln?❷ަ????+??_????ݓ??v???68oQi?B?h????Qr?q]?t`!?ܹ??6fFDž?77?9?xF???L%J?l|t?۵???{???????????`???BA5???B$IhxA??Ȥ(????=Ldl?V!????wn ++?UXkP?c빽??.-B?????!?&Q???I?P0?,H?j?49ʥT??4Iq???겾??Պ?2?????N=?????(P???OLkq???!Z[l??5?0L?CV?ss7??}??F?R?I]1?Y?Щ?mv?h????f??(n"Y???A?D^ڐEh4b.????o8ZXkA`h~`?a?^?T͝??}?@????.??(to?!?????a_?D0?-??? $\'cnh??n???M????O?????p{?6????#^|?I???.??{?? ?1M??v?ɍ?{|??????xg??ܽ???m?t??*???K????ݣ??0m?`?Y={?3V{???G4;-?b?Vs?m??J{???????Nh?,?ss??ϟ???k?w?a`D?97?_??(???? \????ftz??op???tZh???????+?M?q?4??????Ur!`? ++UM???L???aѤ`9?4Ng??|?Ǟ???o?I1(???޿?h2?r58ϕ;3?wP!?%??J?k???^+ E?o?&????W?x?,?v?????c ?l?@h??J%????u?n0)????k?????w??W???g.´D? ???A]?f??S? ???????j!??#4????%??C??z??? 2g??Ml? ?]RȐ??J?P ?9[9Z?⣭PǴ??~???q???o???L?PW???8%LGjE]?(?c*K%=??M?T????o?@KdۊhwĬ&|a???pm??D$4A}?> ++??'XҪPX???? ?Xg?ޒ&4I?"?5ާ??FI??u(D???D ++&?Fy ?JH???wԵC? u??? Y39ʼn?U?.fR?st??? JiNu(.??J?yP?? 9???*?8㰕E%[??f?????M ++3o  o=??$??I?ͦ??}?|TuN?YJI????52f?1 ?{???3?Ȓ?d??D?%??썐I?B?h?ڣ? laAP:8?(i?? Rk|e?: ??WX[????bIBo%?T?i=????[b????N??0}?%h H?lV??r2???/?b????hiP?fZ?$ͽ?X ??9??1m?l+޿y??????`g?????/?/??x????*???????ﳻw??g????#8gx??&O???????,?x?{,O?Ͻ? <}?"?Ϟ???ϓ?H? IDAT??????-a??n????(?W8???p?bP??17č2?M?hMM2??9? ?W?????????άR??O?~?hy?&u??W?\?p?"??G?ma#&9f?g+z"?P`,۬?E?JHW GG k?5L%xIL?z?? ++0?gzTc?%????=??=C|_???wt??l0c?q1B??pc??Ov؟??n}???)R??*??~??O????t?Q??6?t??8V?$?????9K?ZlQjC?dU??;???s?Z??rX?Y?Upa?Q2bԆ9??6?ש??v?? (?tL>ǏF?3Qm??~g)??P?@?C?[?X$y????$c??6?%y?Wrs?؎|?ؤ$7I???!h?a?;?LFM-?H?΀N?K&jûS?????I???ܸ?Z?EG5?,!??1k????F?O????,?iF?0&??=VG%"^ .?:??κE?.g?ƜO? ?J?w?@05??X%?->?3?F?h؋B?A???$??)?????~?Ng~????M:Vr-dDׄu?L???4f????eE?? ???sT?9?1b?dEo9?< ?q?_??? xAs?LvC?@?aa?????랒>_???̰?R?F? ?U}j??P0*??2?[G#?gsw?(p?cE?? ++nX??G??Jz06??r X1?(??Q?Ǥ ?????%????D ???+??Ӛ?A?*?UB????aH?I??????`??VU??m?xM??%??V??? ++??Ŗ???;??$磚??5?>??`?âֲ???#??N;Q??f?[?I??,gC??drG??{֨r????9Y?Q?4??2?u?2j?s] G ??Rv???$??? 0*+????Pk??C??? ++-??dP2?g??yҤ?k??T?\?N9~޺?2:???uq?b?ؑ3? ?RW?????R?>7??W?=?ZJWc??ۼ?ڬ?|xO3&XDe.?L?;'[????$?t?TO?-B????BaH1??#?WVJ*?ga??PK?H??I????$?d??J??%??7)??h?aX^?Qw??'?K}?SR????d??kX?{??3gy?i4f)9?[$????9?j??r?]{???!;;?ܟ^}?u?au??????w????6?s??S???????_??|? =,????3?2??g?>?!?=?K#?????>'??@j???_?˓???A)?* ++?z?????;o}??_?????%???s???q>?Os|~~6>?????ҩ???Ħ?9wl???}1d.)? ++v'?$c?KǙ?!??y?7??-vY?|????ڂ?9??#L?5w>???p??^x??;?9|0???*???????????????L?9??=????t?4????;???????s???'/p?????}^y?K. +??)?o!?7x??)?n?3?mH\>??;???ǟ}?O??????Q?????SܺŇ?^a}?<]؝}???^????]M[?qa?+??4??˅pa?????W^q??56O?q{2f???3=??ﱾ???՛?K#??m7c).qtk??%???"?? 2????K_?2???~?6b?Z???5??P???GL?`?`??԰?q???}?????@;???$???M??X?"??u=vƄ?!f?NjRԂuwk;?T8b?m`?v?&o????%?vv??9?mZ?f ++??%?U?h?s##????j??ۇE?s???[|???h4?Wha. ??Ol?w??ʑ???O?}6?  ,?+??wvh?sl??kn??Z??Hd`ƪ?k9??E??0??R???ʼt Q??H???% ?q??????]??U6??,(8??I??+;??VSYE ????b?A??'?}??K????U?ؾ???s?}?F_?WPEJK_?v??4mL?#?:??? 3?Z?t0Q$I??NI-CʴLQ?;E8fd????9?y??!?ک??C?t!3a???ׂ97=?^ɬ???M??????|??#???zh&)7?:ʢ?H??i??=?l?bB$I?( ++D?([?, ?x?\?!C?J?nf?Z?????????W@J??F?c?????E??Pw?n~D?=?р?g* ++?0?%Qׁ^eY_?s??!eY?l?D?4倹?S53J???P-TB???g??zLM???vHQ?&\???ۭI? ??&??~ɭ?{???L?? ???1?=ŝ?l?UR????ㅮ?t?H?_?@5?vި?X?r?6??j???*ᥣ?*?V?R$? HkYZ?4??????;K?6??P?J??J??A??3?J?-!ИDY?c?x?o??!ɥ??`)?b"$??Eb?R?=??g11Ѥ????? мwg???]7ħ????E???????o\???Bm?'?4??"FU?]n?%??m??^?????Y?^g???x??or???l7?1?O9??_?/~?Hm?nS???ݾC??????Ƿ8?,?݌?O?e}??????r?Q???n?b}?9??Eb???G4?4??z?8???w????3;J3`F?_ ??????~?7?}?S??6$f??;???>?!????????׌F???/??~{ k+??CV?%?ʡ6b%???j?:????????; ?\???.??#z~9[, ?)???????l?????ި?;??^??P??!l)?p?U?ÀH?qB;d??<*цvZ??&?0` ++?\f??2??@Yj3Z)$?c*??G??:6??-:]ի?6?%F?W?OclV!:lԼ[??5??tH?0A3ƓQŢq???????E&C* tTȪ??$??h?????`?&b?q.?E8???6 (0? ?:??MZ|? ~dE????*P?1cv?%?Zf>?j?`?Q?H?x???%?O?8?&U?g???D0??h?D?Eli j?i26g????7R?ڀ?{\|"??l????!??Xu???(??K?C$&??Y??o ++??ejRL??=l?@X(?: ++,?ols???;U??EM?-Kȇ?? 8???!4kqX?yx_$7?M???X??? D??ZU??Xs?????Eb@-XA?rza??E???:!? ?8t???gC??G?6?j????"?p?;y,!E??z`????Ъ?&b?%foѼ??=?EJ?g?X?m????Iy?XX{??3DR???%????????????6?cՠ1?? ????6 ?U???$3pU??U?*U\?5??9@?s?????? lJ0 ++J.ȭ?aa?k???6*?!???/?g:~?*?????ޣ}7?????%?6????^??[??a?ׂ?????6????c?_4*Z?@ɠ?b?z??v1G%????=4eF??c??]??Q"?~ ????H?iq?b?ZI#??Y?k?A??!??sں?2жc??÷|=Ƕs?f?ܵ ?U???U?-9?qW:?v… ???89K d?[U?G?0?#&q8??X?|g1RVOfcH?u?ֽv?H???q?*Q1???幚?C?%???????>?B?HT?WtϓD?+??~c?|y????d?f@??l??لDKU?1!2(Wu???`i5a|????.+??~??K??ԼJgS?m8?z???R??L2??F?c???c??y?l????a??9AZ(??9?hi??G?9?%i%2A?]?9???m?}???vv???~9 T???-?eũ??q????W?ヷ?r???????|??wy??7??~?p??u??5.???p?'W??ܙp??-b??ӎ)l??䙋?{?#??(?"???յ%(7?&??????"??r???W??d????+??*??????>E????d?是}???sX????????}???ϳyb?+??b?0l?<~????J?ט?lW???u°d}???1???????W?c7 ?߱y?,?9?^K;3H????9 ++??Ad7R?????c?؟OX_^Dž?wo^??_}??ed?p?&?l???'W6???O??Kl?:?ݭ{?????%????|??_??4??\XFK??Ğ0j;>ݞq?u??˼???3??Ϭ?1?H?ж??V?=????.D?K?<K;???Pӓ>?@???u?n???????c ??*C?-?L??b?Z?`>Q??]`y?E?O??A?Uu???.?-)?=Ƴ?Z????? ?X"!E ++_b?? ??+?`ÕG ?:*??o? Fi?w#>?n?¯~?W?x??h??u????:?׳?{K??1qκ)y?ͫ?????7?byt?c??)?;;̏?s??]N~?%?̲4\????9?R??? ++'?^??'?$z?`???Lc??y???`??戁?&?4?????:} D5??z??%??y??uI4?T7t?e ????K???{R߲}'p???|?27??????@?q)j^;kq?vN??? ??[f?M??ؐ?#{???%6ZF??uL?3m????%??????1??y?? ?M?)???`FoX2?6?$?ז??{<{?i?ܸͬk)???BԵ??? ++H????F?<{?9?e?Ý-?md??k?U?Մ?ݖ?r?!??@?E?Up0w)??c[U%e9??6?6?R"vN? ??#;(??V?l?????2X/ ?X?:??$*????Ha??.??<?bZlV?X???)*?ҿ????ERE??R??1?J??mSA? ???U?eDל;???T(y??8?Q??]z?????^???u!??l??c??m?$? $i?Y??|??h??18_`%a:???1t???mʹ?&H??48???D%[k???,???|MڎT?Ԇׂ?@???A??????ꜧ'Y͚ ?^??-.Y?P??J?S:?k?°7I?[????׆??????}VN???cְ:?Ę?ި??׶ټt????D?Y!?@??\%??j?2??3.3j??'??w?H>?gN??B????P???C??) c?d2???.?Y=g??oL?eJFc??j ++?e?"?B?I??YV[???1ePv??T?j?n???P??J?????,G??ҼW$?|8Ƙ?ܰ???$?1?3??6;??6?39}?ˬ??cH???&?`j?i]???@l$&?+? ? ++*Wa?ӤVU?]"?H?`?c?R(g?? ?ub?:??;?>?? a?)??Rh??s?~??q???^I ??????RQ?b??????XqX??TR?2?k?V%.-,?mޯ?|????|p??t?y???V>#h)g??!J.Ǩz_?W;?V?1_$U?+?Y?K??h?F??QB?:?!.??????NN??.?(h?;?Xq?i???,p& ++'N???k??af3(? FJ??Z )D?f+ʺ?^X1X?G??8x??#??.?|??ia?? Μ=ɷ???on????f?u^????:?ag׼?????{??^??Ǐ>????2_??I?㭫wx???o???/s?????ZI????Q???/?i?ju?g??????w???*_?RI?Z(s?Y$8ژ??>? ???8l???Z?v-?*C?>?O?oi????* if5?X?y?Y?1?7?? ?r1??C?ɶ??Z?b????? O?أn???Wo}?pc?Ʃ30m???o? ??????????cJ?D???D??J??J?R4I?)r~SH?1??u????< ?T?V???*K?͘~o?tX?3?~j?&?????s?8???D??V?I???R??? 5#?x?[???2????]?vE?M6?`6n1^?B??)??J-eUҶ5??l?Ci?IDSP????9CQՎ?.????]??4Ase?k?$??b ++??:?%K= xS?? ??6?XL9?&7J?Fm?aێ???e6?Y?-$) Ko,???[C2?6u?+!4??p?lv?6S138???"?? ???6uHt?Ǭ?.??EY?hH3w?G?????e??2? ??Z???h??X__?d??ff@??#?}?D?k)???8)HF??$ ++??D???A???> ????qX ?p??G?o???V?A??Pb????mDhq?3?).D|? ?c??I?`???$ڲ??Y?I?h?@?H??#p?f?gk$?V?)9????E?ApeE?gUhc??j?Q????h,! ++?EWu+8p?#a???T??Ŏd:p??>l闆? `?M??m???.??@+Di??,?v?Ii ??,b ?Ġ?a??*A T?P'Z???I?s?R?tB7m9]?0?9???KI?K??? ??5?A? ?????PU\MctO?? i,?m??iK3mqE??k?a???? N?1??;ںU?g'X?CZK?<@??3?āu???FĪVSZK_Ц@UI~?????]??N??C?dK?d-???Ĝ?d۬??kd????????XH9?7?I??d?o0?S?9????y?9~??:?߁?o????Nx???M???y??)zKά??X??????~TГ?Z???!P698?r8????HC???"?Hh?,hҜ??4??jS݈e b??:??bP????f???u?B???&]\?U??X??pL?X5'?????E?? ??YR$?sm??^?C?A|?g?t?}? ???"????????".g?.???χ9???@?1?R?SL????G$?m3r?t??u?ae??SuaWk??Ihn?璘;s$6}?٠?!k,ۻvwﰱqG??S?LMJ{???q???\?ᇜ???$?^bL??u??M>?g?'A#LbT?h_???k? ?ݴʢR5lV_Z???,?z?y?5?a???????????w~Q? i??8??S%?և|??6???????l|6?F?.\?"hfHNs??mj??x?t,?-???[?|??#v?8s?"?a??'?8?q?݃#N?????u.????q??}?fS>????%W??ɗ??un?~?????'W)z?? ++?????Y??;?m謁 g"??a\?D??? ?????;ơ??gl?o?Ȥ>?ʱ{?O????s??q?6eo??)[{G? ֘?_M8[??Ut8ډ?N???zr??f̃????p??????ݖ?n?Y?湳????????ɐ???i?0??ٙS?)??L߃PG? ????L??????k??V?]CQy??͏????v?,O?w?m)??9?0M??v??l?_??@+5݊?}p????Q?,]?x?????Kܾv? ?7qU???TS W??s?A???4^Y????$???]? ??&?I8?d?d:?.1X????ȹ!?L??h??m.uHT{?iLT?? }?9b??:????ѽOx????VVpI??z }?? ??`???Jpo-.jQ?bG? h???kk ++_4mbgw?ե?Z?$?`?N8ya?yk?E? c ?????p??4[?v<#?? ???t7???/??"?w???M\ߣH׳` ?w'|??w????a??}????k??҉???????????\:??/I ?VT?+?-?{?[t?$W Q({?")??v?_R`?nH]K??\?@;??b? Ť?ZH $???u ++??>tA????iԂvI??????? ?N??b?)lA?????????f??l K?ܬ?邾c?u??6?l?{A????{??????$?DHc??N(? ??DvRU?W?????=K?Ydgἡ??[X[([:D!?*g/???: ++o?*?¸DJ^?8 (TbP????V??bmyb8U?$[??Q???]?t?$???????”DA??1?K?j{????Cb?=o?$*Ill?????PV??$`m???_bLK? u?6?X(????:??Ӗ~?G???y?:Q?-??x?(?D?)? c?M?]?? kp?!b]?6??#?cu<ŠP? ++?-UQ2?-f?H̪0Q?/?.??ܳ?0?I]?9?`????;#W???I?ƒ???,M?C`??uV??D$Z?U+???c?`P2~p???&??.???#???1\??7??[*8?|????VV??????3?A????g?=eg?X?|pe?9???j?????i??x싏s?ڧ?پE????o?-֍???W?? W>?ʩӧv?????`_?-v?8?t?ݕ???????????ݝO???웼?7?痿?U~??????K+S~?w?s֗?88:???X?$ ?egw????pnH ++ ?bн??l6ŧDJ5??3?5????? ?1T?????2i,C????L??? B!??K'??*??????b,??y?? H???rPQxC??'?M??{%?v?????????????6??}?s+?p?{???f??z-K???ߊ??????X?5tuW??nu?a??????;??O6`0DXd?M?$?MRT????P]SgUfe?ͼ???+??=ـXO???n?֟???*~?N`i??0cw6?J?s?"R[k?LBEpg?+??'x\y??????ؙ9z??'x˞? ??=s?u?~dv?f????bJ?)Έ??E?c ?xk⋖??8 ++??o?]TH??,?d? W ++? ++W??_???C(֯]?2^fc????2???4?=6%}3f??nɕ??m???M(?>?8Wt??-???,@@y?F?, ++V?%(w?t???[?yiV٨E??T? ++ ??;A$??0UQ:Fp??׀n%_|?27?ecDu???k P?Hpe????ҋ??Zw?^m? ?,xD???r)?ϛ??,???H?Z?}?X??=K.???1a?b?]Ĉ?ٙ{??\Z??L???]!ۨ?? ?Q=+`?8H?R??N*??T i?QG ?27(3??W[?zB???"???!?#l?θ?\??,Ѧ????;8?Kd??Y???܈???w@v?=$0?8 t?u??99D&6??b???j@Ad?Ҥؠ:??\?mM?? ˗??bM?Y?\Q???#?a?? n?(sRR?c???`??{5Y??:?/?Q?+bQ?%w?T??`??D F s????/???΂?6??o?=????{w??@?ڮ???7X????n??خ76???{s?8??P/??9^??Q?7L& ?g4'?͊?0?rEr???b?,?x?{?\??=L?՚?+M?Q?%?kK e????????*{??? i1?>?>??h???s?2w4_?????Ly/??1?x~|?ͫ; h5S9O??s\????՚????CN???ǿ?y???????4Oہ\??G?| ~~|}|}|}???@?b?9Z4)I#ܸ?\???*4?wO?????o?????????,i??J>ܰZo???] \???&??? ++???=?6[s"??7[?wԋ???Zls??(??ָ ++?º?ݖ???.o???ݝ)????$???????%.??!?l???>???O?????d?8^???@?2?n?Y4h=??,9i?؁b4??N??O?|Oy??}??+???\3??0˜???k?o??>%??QOk??K??.G???k78z??;{;???׾?w???y?????+˶?+??????}?n?p???#fS???T?q?V????-??]????k?%?9??<= |?????/??mOV?1?+@?ͳ????)E!TXi!;^?? ?XFcL??Xo?H?I-lOZ??R???z???>'?#';n^?#.Ы??????~?>??s???1??N?h??????q??ݬ?,?4?.?W???.Er?L?SR?g?̪9?????H?|?????/???=?S??$?a?"??5W??\? ?&q~?ruw?7~?sV?۝{ϐz??????????#?d??2?5??????????????????+\?v?q\???TS??????? ++?Ѭ??w$B??????????/?[??[p??C????&???4?3 ?????cV?(??? ???ɓ3????O??=?g-7s^Y?????4??,)[al ^kd:???? ؒ?G??{΀$W??r֤??\6??????X???:pޯ?x??ʡ??&:q ????!`?gq#?3?UDU?]՛:O??(??h? ?????o?/?Ly_I?g???S????}q???????m?? ??J? ??Μ ++cS????fRJ ?0_4?]w??B???2?rL ????b?????????DŽ?€?}&T??#?vk?Ip??:>?g??xA?@G"Ɩ??3?a&???j??\,?9u9?HS*hn??? .e>t???.WYK????????P? 6??o??d`}vv`?y??Y?u?4??g??T?)ޙr#??Do*jUr?Mb?u|?F І?m?q????l?ж=,??!??? ???c???>??͑?RQ1X??f?Kx?ٮ?L????{blє??#L-??T8ilC?1?4*?|?? ֧??L?@́L1??'?H?3e????3p?? ?`RG6}?F??.#?2DL?????yT?a'?h???3^???F?è?s??. R?\???]??|?W????'عu??^?Ϧ?????u???1t????(?٬?????#d:??U ? ?Ib??=*lx???ɢ??????G?z?????d??6??? ?)?IE?????;<|??G?7?????.??ÿ?!y???? ++~?:?v&W????>????? 7?r?ð???????>? ++?j?N8?i???????}??9?5B?mM?sg@Bb?K ?H?հ!%????4?hG???:rNl?m???Dj??g????h?%}?0??GL?~??Y??q?Py?TW??? C?#?@??)???6g?s?8??????+??o??9o9z??>????F?u ??i9?冽;W9~????[?Վ???)7f N??h?fM??2?3??ښ?Kc??2?????`?6w????u?DWHO?5?@Q??bci?r?;Q׵?8E????i*?m??F+ N?t?Cf0???QI????JG??x?MY?(????0uh@)???gl?. ?H6?>?]?r?޳?b??????|T/??? IDATo6?vF5???30WG iWȏc???????IE??hi??h' )?Y??&?@c?l?z??]9?=βЂ ++I(?{?$d'?OȠPyv?.y?v??$ ++xajXOΐ??z1[A?? ̕M?>@j?s?a???Y???)Sg?L???V??L?]6|?Z??? ????wnߠ?̺Q??????1???(8??C9?[???????ڽ?$??W.??o??5˘?Y?̑???=???[M!ʅ?[ ?T?H,?t?eͯj? ++`>fա???uǍjq켡?????=6PF????HF??5?]Z? ?E-?5??8U??(????b$?˜˒?h?????=>??k?T/?}!_??? ?+&?\e GE???jT???^??q????? ???a??TW????\6f?bS.?lY??,?֖????1??3??@tT?]?!ͦt?b???^??EV?X=?S??$gK??&??qHT???ܠ0??[?{?N`??mf1???[??2y;@U?sҶ???Z?? ++????y| ?5?'?\I8;?A?j ?_ 8x*Wq#G!F#ׅ?6ը8R65?$?V*???1)?1?i̹?U?g?)??IKve!?8???H?Z?mً??q0W)c?l??l?~??e?8{??z?8v????k!.U?oX?^?4$?'b6??lM?b?m?P[??? ?v;;ے??W~?Eˀ 5???)??ћ?v? &????9?i?|????^C?*i?!.?ک?>\??Z,?SϜ??.%Q?9?]??:ԏ.d?3?u??w?Q?$l}???w??~??~???? ++???cƸ????B&?qo?? E?y???z??e?fҐ?3??1WU????|^U?l???p??M??3???\??G????r1???8??Oj#???"?~????}B?ˣ??? י??X?? ?????M?~?-^?꫈ ??4u?&F?y????????dN?9????x?S????~?'>?:n?98_?z???/?3???????=??گ?H???n?;?s??pۖ??c????????#?????????#?A???G?=3{?ֳ?2$??y??L??&??>d??>??? X?;kx7?y=.x?I*?:51?R?CT?:???i??????7? +??u?٤??ݻ??Nz????k?????΋7???????%q???z?D8?[4yj??u[???n?r?8$?0?4??Ӱ?? mXni??t?:'ǐ??g?(?????;c?,88}?p??ͦF\d?w??? ?f¢??v????΍x?????ܹU?iO8!???[O?S?|?pz?X?)N??.??pe?6M3pe>?m?t¡ ?v?ܺ{??>?N????y?g?n2? ?Tf?3?zb ++???kd??!b?~????!?{?t??f??V2 l??zj?lU]YNUo-????r(?W??˒??v[?? ??uN????5?'gt?-?|>x????,?????\???+?߰???? s??Gic???1?V?Sb?YVyy??]?7v????ܾ??ݶTћR/fS?G??x??? ͶF9gv?)?T????-hQ??????+?׺ Jkt?b???$??6 ?\??z H??4??\? N0?Q=?ٮf?!??"ހ??%*Z?9?K4?b?v?C?@GΣ*??0s?3?x??>???#??@????ڞ^?9I?l?R?:?z??'eCq??r?T.????)??J?=?Zp???X?v?U4???Ҩ?t?Ϋ@???u`L T??F??]??Ml?O?ri??[%?L(jE? ?'5??|.>)????????D???4?n ++????YΡ?9=^3?>#w???)???[???5?(R?7R?x??"PBT ?/??w?Y???Ώ8?VN?zД?9??M]:Z?^ ??/????K?? ? `͹`?@??????8?KS??!Y?X????UU???e ???d?ȅ?I!VX??^?G?T7??j?\?V?v3?Z??? ? ???>Y ?Qe?!?????? ,4G?/$1/?;??ŏ?Z@?u ?R~? 8?m?Y?!'??%??a?????:??i6P??Zp?$F???hTm?c._?f:w??'c l_?zA?-???J@V?˕???X?z?0???r?U??B?r???ge?9?Z??A???|d???q{i???@? ++??s ?¤N???????H?#?ec???~??4?uʐ;?'?X?Dʞ?A"?=?? =?]???Ň?JR?L?ݶuB"M?˾6??|?H??8pS?|?If?=??????_?????E?\??H??E?罝??|m???ϱ?ec?????sB?\l`?jWI???Fxq d_T??=đ?`?? R??~9??`?dFH(?YUb? ??|z???g?v???2>??Sj???Y???l?~{????Ev??g??Ȟ?ʬ6????x??M??S?7???W?j*}lI%?G?#i?ki ????v3?i?u2N??R??t?R0?U???z6E4$ >??݇?_??,?K ??㡅???i?ר?e|??M?Ⱂ?? ? ++?? 7?e?q?&?&\!?os???S^z?e0???3??D?Wv????B?ʃo?].8x?b5?????????]???d?|??_????O??o|???#??1????|??????֯? ++????????K??i????S|????w?<|rN?:n}???wƯ}??|?;?k_?,?PM?ٿs?!????????????G~?MF'?)%??\?_?d?e? ?O??!pv???p{?yT\y??3>w??^??'?Y?\?????f???~3Шr?TK??+ ?Rp???? f???d?w?Q]y?n?xߐ? ??A? 7???GR?H#?v??-LJO?}??v`?????!_??Wx?tͰN????*? D?!;|e "??K????"^IZ!?p!?v????g???7?????????v0l{?K???$???>??@? ?Ϸ?N?O?cZ??;?9???R 3m?"?i???;???w???6?#Y"?mO}eF/?p&$?y??!??? &s?9???G-;??dI???!/??2??ػ?C7 ??3?VY??r?AU??XK9%r?15]L?2?? ]6P܃D??dl@?f?$??)o???j??v?,???mE??????s? ?x????}????:?=ZoX?????ݫ?m?m?l?Ň???{??/?ȳg???[??7?>?V?Bh??Fư??\"??? {??r??????ʽO?g?Zs??}?Ym?d??????Pϖl7?xj??H???????p????,???c??v?!^??7??O3?:??)?[Wx???W??5?l?uc?????? ???0k?-> u????@,???? ?ܨ??U?b???Ķ'?¾ 5?G???k/1ٝs?|KN?s|i?9GJ0??l76W) ??K.ڣ?? ?v?h0??s|? ?b?36o??(OJc??4J???b5??? ?g8??Adv?I$?Mi??j???@??}???Ҙݣ?TKSԁ8Rg?tQY???!~??p???3?֫c????B??d?ɩggoAh?S;|???~sF?0?-x?'op??;G#???8z?a>?8?͒?#?Z"?P???5 2??|05|*y?C?܋Y?#??????f??d?o]*U4g*????-ٜ?sT +++?F?ܩl?F;?F?*ʤ?i-????b$!Ih2?z!????(Y?DO&??P jQD3~????/(^??:,ٽ??[26/Z??e#?(? 䠨?.???X\??? ?(??? eM?}0???????`?:?]??9jqv?? ++Dp???;O??;????N?wwNL? W??յ??9??z?ɬf????Y0W?B,?BFɅl?4? ++?*?$?Dl?2KR_?aZ?? ++2??D?Ap%?8=???v??w?i=%?H2??gs.??\H?3?z? d??c5Td?sv?f1?H????j?,?k?z`??BE?,?Ԟ??_??????{?k???g?????o?,?"?t? ???!?AD?f????>6$? ?熰?%1???q=??O???h?/? ??Bt?(?Ȕ.;???? ++????? ??l?????????????`g? ??????k?;GR?;U?????? ??3??v8G'?:?d猩??Q??_- ++HQg???{?ݺq`?W??2?U?C???+TM?|s???x???89?T??M? ?n?????x?? ??Go??3_??}????6??o??????`u???????>???9~8hOp??:x??;?? /??o??g_Snݾ?/~?cn߸???s^y???*??YV?~@?[??}`?驦 )Gc?D?+2??v ???5۸aV7h??????ZXE??I"i]?]#9???Q?z\??[?????+}????}kQn9*?H1?r?v?1??k?Q???bQ?????%?e?M?5%??J?,k$?f??'?E??nNɺ????g?y???`2?e2???Ǡ???7{K?4?????᧰??>??ʰID??ق???`?d?㧧L+SMa????O~?3^?1??5!l8=??jCʙ??z??y k"???7?????*n.j޿???+4?l?Rv?5?v?V?X?3??f???#6'=n??J;??q?????]0?3OZn?~????=O??%??7?3???y????+sR{??HJ??d?fu????-?ٔ????$C????=ah;?x~??7XΦ???'??fB??4??F???h????j&hR??sm??zMԀ?r?iYL?D???4?Dj#19S?T4?"?????z??-?U?V?ZҠ?ͼ??Yض ˅?ڃw??nL%]?>G?vj??}J?ӢRӵ={??lSF?K\4?2?6-~2??iY ++?? ?I?ˉ$ ??f?!]ǴnȒ?? 9+?UpD???p,?????hj??5??B??_?????_??=?O??[|???9??)U?$?̼???V?q?$??f?zBd??????????'?=/???????2???ɚ?G+^zi???cnߘ????B?????U????4???[o#/.=??????U??6??][??\0??p~?f????Rϔ??????? ~?75?????*??'?qu?ó?G?y??T?;??3?M??w{??p?e???S?i ?P???U?z?h????l?j??l?xOP%Ɩ.nHk???????-?΄?????g4Wj?e?~??Н?R>????8(۳@??5稝?X^#?7?\?????????op??*3*i??2WE\0? ??_?طe|("b?Ȭb??)y?y?L??g)j?k??2??Qa??e -@ x?????9 ??? ??q/T\DLq$??,5??8??V??H?p??i?? ? ++%" # ??AG??,#j??^H3|???&??kU-2?(1,???R???#??2??eR??P?????e???MQ?#?DSm:E??!.Y$????M?9???BP,b???????PA\*????A????D?2Jh?(?}9g?ġf??Yw????P?9}?:????" ?\??֠??r?a ++0Luj9??ޙTT???"?(~??U?`v?????B?0?2?[?d0Ri?Gs??E?{??]R?3??|pU1?????޻?5??h?`?;???~J??e???5?2??@jb]?u?aӣ"??II8?N?Ml?pb???9??P?B?=a&L%???S?ר臁??G????4ӵ-??&r;0??.??2?????"?? ++;צ }$???5?^{p??:x???????/!?????X??CJ o ??ZgX? ++q?!?D]E??'??]2?Ӧ?-??^j???}?W?v???ՙ?AjΏ?\???&ļ????iF???TS?w.$ ++???!??Vǣ??.???,?A?Z?K??$;??tL@???Q2??ﳁy????h?ґ?2???|S0?2?.??/3Yn57 ???5 ?a????,Q?Zj?lnI?\?s??u?.*??????)??/??[3???7???]~y??w?n?nXu?E?hS?s??\Y'5??f?W?? ++?k?nV??g???Z]?-w_?K?:??HK?(?#e1?b??Fb?$?z\?e?d???%z-????M:/j? ?G⑚?FRRg??b???U? ?^dR?=E?]?Z???LR?????K/r???ٔ.?Qב'p??U?-?_]R?O?=?k??????/??6v>Y??F?????f1???;_????O?fN???ޢ???Ω?ܜ??1???PIx?O|? ???x??ݞo??)D?.??????|??????&?fe??[??#x?G???RM){t??n}?????? k?z????n ?f?S+?yʘ???z??g????? ??^?:??IUr??D)e?٧??+????>??|͟???Ƚ????????L?T*/.ι3l???o???wyvsF8? 3??W?F??x??0ι8~?˯݆?-~?????^@?d???V?%?>{?????f8?!??M|?š W[????j˕???UqN?2??cI?7W??569m???A? ++i??? ?~\$?eG?????;J???Z???-˩?5*L??;aGb7á?|d,?}j6???p$??,r"?d6K??nJ??|????)m ?{?????5?0 ?? `?? ???ZpZ?U?m??Z3G? ˜???8?w?씣x?ZQ"?&?S?\?Rɚ?b?+'b,?$?7ӈ2???? ?qo?#f?5?ч??$u?*?K?h*?P ++?s??nq??)l?j?h???Īx? /\?]?䒣?[?7?????Rlp???g??Wbl?M????fԙ*t?[srp???O?q??>|?1'7O(Ce?-??*??͘??#)A J?$&?$?l?3Ԃs?)U.넯c?r ++???E+N"??y6>??? Wۉ????ԑ??Vݜ????ݚ?P?0??,??'??%?7|?y^?[?֛oq?gh????%;???yve`???U?????~?;?d??? f6 5ESȅO٬??[??9?ЬL??o?????l?P7?8G+?9??[????}~?/??q`?쒩 ??^???q\2?2??{N֞?+Y3?0pt?6?|??????? k;r嗿?K??_~?????o?ʔ'f???V/???srs??-~?{??y]?:???H%M??G?@*?n7PQ?:Q?H8??6BeG?@?z?I5#????J?O??Ly??3?Z?Axp~F-?ӣ?ˎ?.y????>q?vgj?T?9?\5U?}?FlB*?8#v P?rC*U ++΅??? ??j?v&Iˤ?X/EZX?j5?g,/?֌wV{Ivvn??L?ٞޫ?jS???? ++H??? ?)m?'gY?NQ????&?j0T??f????y??M9"???I?b?ٿ?? R=JI?K?V??+??X???3??e1??F????"{??}.?v iD4?yۧ?Nh`?d??)??R_?B???9:q?????? ++$#???49?A?+?Z/ܪ?v???Z??bom?Q??>^??F?H?*????.?V?zS?jZ?o???? pĻ?0[???y︠b??q??ݽ???o??e?J??l??Z "???Fi?8?ϔf??f4ҀO?;B?{袹%?j=?????<-&???s?I???"?G?:yζ/X?؈??l?2??w????b}??X??5???{jI??g*?l-??????-? 5??UP~???^?y?z??7?????W?x???}?????S?? )J??k??Z?D?0BI?? 1??C?Ue?b'??l?G??(PT 5??!5S?S? WK???lP J?j6~??????+?B????? ?{?D?fs?k?Q+?????3??~?z?x??/???????Z????????W?9???l???????+!?ʎN??G?s?:Dv????7?ku?ՎW#???????}?????5?l?f9??=?45?T??vx?????ِ?V?*Y+G7N???C?v?zaV6՘??P??fe???*{S ++??˫??Qq?Y?????5??TP'?I?XCU{?S??@&??nPr?R? Ŕ??-?ed??AG? ?$%M>V7? R)Y?F?F?m??9[spth??;?]PIB??[-{ZK1?I???? $2??P?_F????%R??E'??d@?&]r?v?7K?bg??K{W?=??Q$?Ea?JM ??.k?p?????c?????\%;G??T ???]?Z?u? ???Qk?$!G-G?????,?\b??h????CX8?????O^?Q'?u4׆?f?V4??F8??e?M?kq?b?C4?e?ւw???쬰??fZ? ??h?ܬ9e;W\?|? ++-?&?P?????Ppё? ?i?k 2'θ?"?G?#??쯦???#?"j2??????kF ???F?iE43?z|BqW?L)??#˔??%%B?=)Rv?\???[Vo*?b??A??Q??Ϗ?Yp?3g?[?)e?+???a;!C??c?!?Z?T??H ?`?Q?Y8?????)P??\?{?? ?,???v?!^?YHi??F??Lӎ2?A?'v |?4%|?C??O?#,???{???r????:?:??{????=?????????????#5MLIxe?x???????????????u????>??/~?;??)Z;23?>r??@?????woT?_й????BXFn?Eʉ/?|?4?y?S???S?p??3??s???'\??'?>zx%??zz?w?z`??iM?#?a$?B??0ᵣ?@?*?u????)?@-0 =?$?ij???O?y??۔00??eI??\^?s???E??=?????W?????o???CQ????T??0u??P???|? Qڐ̀2????p?9?;_?????` ++???j??3F??BB??UH??um????(J?V?Yd?8??ȅ?T???0??jm??k??6ж͝`?hۻT?G?ՙB?U6?FxҐ ?)m?LlC?l??^?????)?&#*!???#M(????خsSUVW?;s?u0z;?? ++2??ȭBj???a*41[i?u????+??A<{?7?ݮ? ++GB8???V?Jh???o??;???'g?L???7C????p?-?2????F??ų??R??????_??ʮ?@?UfI??r?m*v?I?$%??>?6?S?7??B?'?9v???'W??V???9q>g??̻?v?3?????a??G??7TW?*8/??O???????????NX?Ή]`??ٜ????l?.xvv????????g\?D?!y???? U?;rc? ++?????9?h)??by??Ɔ?:?/??5[?T02? "R&?}o?l?l?Q?ji??????o9??1?\?????k??h?l????????? ?r?*?0??????$I% ???2Rő&k???Y??D??X?m?Ĩ?Ӗ?U?K?R軎?&󕯼??|????r¥JOh?Z?j?5r?fۋ???;Hf+9[,?:;Ct1??5??l??5g|tl??8b?3?"?R?pI?l?d?H?9Q?5?bE?0ly??/??e.?3D?(?,???'|x?SB?S5P???Zf??q~`?2E?ٜ8% ????Ϸ?Z8<^??g?q???X?#/?=cBY? +w??'4Ɛp]Ǹ???;GM?)?Ė?>?Ձ?8?3?ѽ'䳑?Yb?:Ƴ??W???????N???3?Wo??X?????p"??-Wmv????Ԟg?0?О?? ??ʓ??P?޺0US{Vi??ژz??8??^64`o3??X???=Y<=!t??-????섳???? ???_r?;绿??wO???{0?F??A?ڞ??ZC AH?5??&?V??,????ܳ7!???2?;???$ ?w??}N%?)?f?f?{??9B??p???vnZ&?B??b?ʻ??q??1Wg[?? >X?e?Da??L5Q7/????oK??,,?? ??? V/????#A?!??d@? ++>?''#Ex??? ߪ?R?7E?????s?;gwby:$?&{??2?w?xR-tN??f?6?M?|??肩 k5R?8????x{?Z?n??l?jU?tF???g??(}?Q?d?Θ??5? l??N;??XV\Jx/?l9?*??6h??a???9?UR?"u?2քK????C??y="n???4M???f Ƣ,?ȋ?Wܾs?n??n?f?Y????i??|???M??2?Nf???4%^y?.??Kj6?????3???yp??b?wt???𾧟?8T?y?(;a??y7c?>#?+?=Z???????p ??T2???M?ub?rhP?:???#??Ʒxq?e?;6? ?Z_???|???6?????5?W^?q??v??@?6?Z?~?q}g??DV??????o???????<??@ȯ????ڗ????g ???FZ_?????ω?W^㟝}???K?O?????D? ?J?N?Ay?????.??????`ѱ]-o????%?_y??N???????X??o|??????N9y?5??7?l_2<ذ8\$???0?x??S?̱??g?? ???;?n???R?Y?.Ь]?~?9J. 崳R?X??"?ˋSK???V???ۅ`?{R??^????0(??b?n)Y3"?ٶ??X#?????lo?i?r?\+????????٫?,?[?????$??t?XvV?I% 5`?"?ԇ?!>??|g&D?L??K?m]?E(???)?T??.??ϕk? ??Zѐ????Io?ū??EL?R}2P l?\ Q2?"ΰ/??}?gQ??&K??1??$???$??I?c????%?3BL?dt?x??K???\?P4,P?XF?H??_pxpa?+S?V??BPǔ?y????|???:e?l.,g ?aq?Y?9%?Pg9?{??? ??D?Jo?6?2J\???R????G????c{??7@Y?eG1[eúĈ%b????Zߚ??5м?ܵ??`?X߲Rm^eﶻ&'?2?)????,?????D?&?F?s???:pr?(?RBϋg ??W?????s?????r??!e;p???n0? ?8c?J??ʘ?u?J???RZ?1͘??3J??ւm??Cc0??Q?Cd??w??a?xmJ?????E??R???p?^@M??`????j??V??ՀA?ܨ??ֺ??hg???>8??w T????^??xjm???_ɨUP??ǀU5?)?}Ob$??t??+???????Ե??]?O??}T?????|1?+ؾ?s??ŎR?????'/_?R ??rv?RS#??#??. ?+>z??˷??k?ݡ???b?ɍ%??*FDp???o???(?TO^?s?K?yB??Os6끏??_??_d?Ox????p?x?????????{??????????}?3-#o?.???????l? 7VG~}~~??X_???Z9?I׾]Z? ??{I??B?ņ?͖)v3j????i??P?l?4[????z??o???Dw????9S???ч?nΏ??b??7o??k??6?Ϯ?y??q??ي?oRR??k?/??0U??X,:?????"?cV=???b?9???????Ys???U+X?bv?.??£??) ++???lq?d+h]?-?T?!???G?l??k-T̲ċQ??????Z[???PM???0?????V?V?CS?e!7?X??V?}@?0?L??Y??j???驩??'Hţ????*??Te???{T;? ?:&??%??I3???M?? ??1 ++9?;U????B??1$??%??????\f!?@.?'#"#?4E?¸?'f??c????y??X?x?Tq??wW/:?d?lƁ???|?Ċ?M??m@? U!l??k?$? ? ??b?k????!M??????K?h?UR?f?+e,??%!8?Ԋ3I????g[J.H?s?9?b??h9p???{F?;?2??l????w??;$?-?1?i ???5p_?"??'V]???+BM?? w??`3??DF?l6??UVSG7???{? ? ?(??????6??@?1_?(ib?n8]yR ++????TO??I?5EљR?f$Wj??????A?7 ?f??l?9?)???iX?e>M?@??4r????)jr?,?Z?m??s??,j6????Q=M??X?G???TO? ? D??d??>?k+9u6?W? ZN? ?*}?ȥg?|`Ghy??ˑe/,? ? ?2?{*?TI??,??Ї??D:???????? ++ͅ?&?l??p>>?0???}???⬣L???Y#8?ʐ ++??.??New\ ??Uf6;fw?xzv?r?х‹???}?&y??􂐕???a??w??K?x?ˋ_??+t???缸????!$|????o?????? ?}ʃ??Mr?ڽɛo?????[o|?Б????ƫ\?.?(cٱ??UfW????s???D8\r?h???~???b?Y7??vuQ(91??,격$T,?Zf$??^[鵊??8QK?0???sm((??????H??x???l???,t???k?>pM??z-?.?A??G?X???? ??: S???$??"3?? ++}???֊$Z???{???U?HA?@Uk!8G-?Z??0?ShRH???7 ܪ???7X???>????lE?vũY??z ???9?X?&Voـ ?? ?????>?}??}??}K?)??k????q??n?z??²El8?Q??xR??K?x/????]????Ϥ=?????O~????ų??f7w??A$?FWG?/?????????H? ?(e?????C??? %?sZ??-??%+?"?K?XM??'O??)9?D??#??e4?PR??;?f??P?P;??J_?L?&???W$?{?e*?Sճ??k??4????ce?2??B????'????:BG??4&?y$?`|?3G*???iy? ++?@Ia?#SƅJ?ύ?'??u?`?:$?-??`?T??^UL?|?0?"?fq?E??*??1????ȂJ??"g?¬??I??d?J? ?HG?`&?'???&a??6?h ??4R?J? ??n??\rx9?U?K?b?(Q?Z1o?}Z;WK????,?)?վ7 ?j???𚵵??{f?m?r??h{D?Bw??K????4u]i??3?Z??aD>Q?/*j?4w ,k?$???H?^9?cug????@ٌ*?u=?u??%ɨ??;?Ϭ?#g?/9??`X+?#?z:' n?Ν???9PM?&[dLsJ??g3n?a?#??.f<??D???ÀN????3G???ҭ?\]?p????)1ӈ????,ɽ?J???ZP?}?vA?9/&?|I??/H??v.[ш? ++???^?9E?z??jMEj@??B??Fr???,?fs\iX#??XP??@?_??wioM???沄ڻ??????˽2?:?wU|??F?p{b???F@????rr?}? ++#è,u?4?Hؒ??!v?\??S??q9?-;sϹr??JNg??*?????????2?8f}? ?`?s????X6????[Ο_rz?????I?s*eJ???N?v?5??=r}??*ꕟy?-????c??>??[???O????????W?_?Λ??w??? ?/???7??o?a??.?8?]a1[??w???_?????C~?`????????<>???????!?~??mF? ?;H?1?g???{??#:U???Wo0}p??r?K#?߸?{?#c'???v<^??{????W_=??;????????????b}??X??u?xB?h?Ni9^?w?ځ??V5v?Qs?B΅?v"kA?gVZ?no??8U.??|??W????yt???;?y?c?@?D>?gwqEe5??mACc?kk?? ++?= ?yC???ٰ?J%O?ӎ?XQ9s?8??À?4?x?Z?\5#݌???? ??V?[>t? X??sfA?Ƒ??????A??rK{$?1wK1k'?4?X?Ck|??ץ??(j?C?2!JSJW?fزZ?MY? ?[aj1?p??S??\ ?o?)???]?l.jqh????G,ٜ??y??;??qt<|??Jǝ[???x?? %*?2?????ճ-????juLI;^?} ??{??GTd?4?????|??w?????4?U?!%???ѯS??epUa?MP?̜/}????????W??(??֥58?Dzjq??<Ն??h#W?)X?5?^5e???+?k???D?^??Ҭ??1xKL?X?Ρղ?r?W????????3?qf?;u?d?W? ?l???.BS??3R????q?q|???5TE`;???_\@??aq8͌2R?? ?V?????]mھ)??$B???-fӛ?@NJ???c? ++???S?.{v/?/??*?b?+-??%ۃ??A??[Z?\???~ۧD???Oqӵ?Vf?!F&؄>R???c?{?х W?&cfd???ԫ?$Ѐ&S??T2? ???`??[c? ?B?w?6?6?Ѧ?T??wc?j???h?!s\co???{|/l? D*U??LC?֔H{?????d?͞w????ϳ????7???nYrk?ڲJ????*?T)?T??_??q?P? R?@Bllǎcɒl?jM???????????Z??ų??Q??H?MoUW????9???Z???<|8??;OH???]>)?Z?G????41]??cFKc)?I?????,sa??*????/.(?? I????)??? ?|}ODW?? ++k?Iw;? ++9?;???ͣ??'???@$?FhR56?#?2%!??@4Ek!oO?p??6?(?x?)%??????????s?Hq?2?H?n,b???[^}????????s?????ś?mR?"",m?!9۸#?????4?赗ئ-o~?M6?LJ?;?.e؞$?JD?@V'+n?n?xE??''?Uq;???52W??????e?{ ??k?? ++?? IDAT??{?x??NU?????4Q???K\l??+?0??????F>?wNO???89_????}?????-_}?e>x?1g?_壷????????w??`'??{??#????@??,el???6????@dO?????㻏?Y??K?#????石? ??r?D??U _c??i??D?Y %???z{bl? B?@??E"~? ++r?ƛJ???N??L??{w??]+?k*G ??? ?{??3??zO|±??Eխ?N^1???X? @ ?c?B?Y+??٨$,zd?$??:u??7?J c?9?E?????E}????Gѻ?ӏ??Yʂ?y?U%????????a???x$ ++???iAj~?I?ݗ!f?Z??~???֣??k????h??aǯ??9V??U??ksLB????= LA?ދ?|M??'Ǒ7?????_????w???>????????G<~~?7??&?????K??5~?7?_??_?ӟy????? ?? ??ȓ?=???????5ۋS?Z?}?8ϰ????K?ہ?ՁW_:???ǰ??G/q???????????|?k?Æ??????oh^??#???ۼ???x????Ͻ?~?#NWY??????'??'?'?'?O?ږ?8J?h????Ŋ?E??q?+? ++!J???xR?W???m????]Y0??]??LU"a??????g?q???57?"H???I?xT C?N??????Dm?έ ZV??p?'?? ++?1UBR?J5ZZ+?6?b6&?S$?m?,???????2k%??K!???z?#??Te??2?s]zRu? ]If?+胫 ?g??J?B????9?.R??n??Bt? ??????qؕk??F??J?49I?=??5%? ++*\N "??%?A??yy=R??0???I??2"k?tv?z)(?Ŕ???I?2pn?Z??fdQd?ggT???2]?q0? u&l?????VO??r???{?:p?Q?8>????n7L?0?s]?(?Ҹ۽???o??????W?;?w'??5`X?Ĵ_?i f?<<;a?b??!CB?R??D ???????:@m?d??L11U?Y!Hf. ++I(?Q????JZ%?=.???)?ZC??D{?l̂??i??X$X??8??]??B??b>?z??0?FYj?C$s??-x?f?????lNSwO?H??2?9? ??@????Q?(??"?'k??0??(g??Ͻ? ++?O?b??6[?Phe?? ?@P??B?L????r`?? (???4l?.0b?n??9!3WW??Ba????]?E??'׷??Ɠ?͖???7?????yp???6?a8? ++?݂EH?!??S?D??4???!???]&1??z\{V=]bo?????!F?? M???sn?/?eqF(??-?4?v?Qi\?^???9WWqs??O.ia`Ox????c???Rw`?, Hw?$???#?ѽ????????ˣS??s??Ô???Z}??j???G???n 'ٜ ??????ޅ6??݆8x?1 ++?Bh=?Q?UqG?98/?ޓ??"J_ׂL?>??nM?1?ӿ? @???H'_9??&?tD1?mZ쯯ݓ?r????????1?ԁ??????[+??V?????DN???`=?0?@#???????Q??? ++???%???9?C??]???????????ks'??????#???1.ZI?"??v??|?g\ohb?N?#4?C????$Y???"?S??ʗ/x??????J????r?=e????j}BR??i??W_A??!??:?9{??ϕZ}FX?#?????y?H?ETs? ??QR?M?̽[[Di-b?1ދQcTkOBq?/??G?l??S[ MHapїA???????u??l~VWD??&??????? j?y?B ?@???1?{??F?(I????? ?j# ?@` ? ?R0??+?|툩cYQ?)2??]??uKH+hg??7????????ƞzp$灔@8?^w'oB[?6X?FGfZAk!??&???sd?&???9?f?g??zu?Ț?S?W??^?İ?J????)??ՙ?{??3??? ??.????펋?+?5R?Z?5:?̮\?NJ ? eM?M ??ʊ?=?a?"???I?2???o?1o????3?ɻ?? ?3????n?GH?U?m?$,??bt(5Z??`Mգ????g$??%?'_?C????7?;??????0s?Ͱ ++??Q?????˿??o?IH????3.??`?k????ww??K_?,?_|?2+?TB??O?\c╇ϣM)??a q?I1?KaLA??򗙗6 ???????h?`?????a$??'r?-$x???4 lOV ?+????]ew??G??f]Mc??ޗ!?j ZԻ[ B?h?????4?? ? ?v??nmDM4\?l?%?9???p?R/b?~? ?`R?????",?ѥ@?i>?!?:?????ԝ??@? 9y????ϟq}s ????f???????G????ǁiړZ??Q$?BFG0'(\e*Xl?y?S8?\ ++??`1:?X`_`?F=Ƶ?@Vj??q???q脚`c?L???E?`??7?P[%?#ڄ?2??6???&DVpT<ʱ/D?f???G??]Af?`H? dF\0?L3!w???$rr?FJ?(&?y???;yn?<$wtǑHp?x??HD??ݸz?￳'????L ?8???z??Ǫ?!????F?LM3A#???T?5?@}?1?l,0?t?t?#?f?????{?Eb>`Yqb8?Y? c?n' ?GǨ??;??ۑr??Ub@2\^???????Î_??_G4?#~@ +B̼?ÿ?ᣇ????{???ϲ?RmF?D???!?f;rysGZ H????W?4Yu?[p?????f?????>>????n???1?3???a?Ė;???w?X????(k,+uCJ?a??b)rz~?2?aTTyB/??,t ?????? ?1?T?>ZD?????8??}!r?{@[b-?(??R??Ib??????U??l? ????|?0h?퉧???SU???zt?I? ++? ++?R?t????if*??n2+?qD?ȩr???O??²,?l?63?\?g|?+X?t?Y$8???σ6#Te??O???g???`???T?HO?p??6}F5???@??? ???3??|???O???3??W????u??#?Uzk?W?5???o???_???g????zF3,O*??}???;???? ????????S?Vu?V?o??рH Xp?*CnN?ikDs?^%???¸y?W?x?0? ?IY6/\????o????`Sc??Y?FΙ?7Д???͚?cD?V\?,|?3?prr?j?P15ƴ?DWE?R??ShKe>ܲ=9!????|??7??;kR????ca=V??tg????X DUNV+????DH??? j??1y?U??? ??7pɴZiIQ hI??ChJ???5cL?DB???;?o??v@???EZ0w^??X??A????k?I?A#? ??D1r???g1!G#F?S??f??g[N/V??K?e;Fۓ??j?R?Z?????U?????crc???H??%?P??!5??RHPv?űs???f?f??vuR?%8׉(kZ??pN?????????G?2???G.#?ѓY????;?a???????~?Hۭ??? "$͔????T4?T?5z?q?????]?g?b??麐????^c??\?l?(?M?Û? U???؜?'RU,?E߅rP??=??T?H0q2???????.?֌H?5?6w??j?S????ؾt?/?????[?z???"????[o???OXm??89[w???????Y????N?9XjJJ??Ur?oP ?0?O?????k?z̘?gH#?RY?N썒?x??7q ???7????9?=???+^}?9V??z}???????q[?ÚyXX?.?2?? ++???aw?Dx??C>|r???5?f?0 ++???J??Z??  ?$huBH;?Ĩ?d??х*m2?Р??4?C??5qA??? 5E$qe?i?N??}?u?ゟVU@㽃??k???ܵ?????? =?8X??\0?C#?V?E???r???'???W?#??Sb????;Â?R?eG?U9v??L??J?????7???ȹ;??]W&?󭡋???n?? ?+l? Y???]??????D?y??W??v?????????JK:?pQK'??z/Mq?3QV??frJM???ּ??p1?E??FՂ!?? m?N?i% k_?T!'??3]N?pve???? f???,"???ޣPU1??:>ۍ0$n??#?VR?&?????1?L??ԥ?7ZA??? ???4??x}s??? ??[s???ٚvyO?3?]b?LWŅ?? ????$?2?J?ʼ?5???M??1?qn?f?(?1?$?abX??j???ub???I]|-C@v???f&?p:\Ϸ?m??@e?$??ם???}u?_ {??Eg???6??Fl??3 ?R??c???K?x????|?o?{_??o?g?????ݜq}y?_?????7?a}?????ι{??????%?????^???P?|?????K?>!???>?>?~?W?[j?B?y?????jq?r?C?Њ$?rf???bD5?????W?5볇?????0b?#=???????ZI N?TW.?a/ͣ???*???oƏ???b?B?+Ji?4? &???U~!??b?? ??q8?V2?6??VW?7S??# ̇?3?Մ?Y?nid;U]=5$ߴ5;X?e?ŠC??S???09?R????qv1xDaX?????h-?⯪G???Z1\?M#?ļ,??5j???1?]!ĵ?f}?5T?^??stZ=6O?B?:i?NB`?*?z???GW???0D?w?h}}????ep0?w݅蟕v?pW?????Z?KaGj???U?;?Z?????`4i?w?8????????ృ?U?.^?^$?MXXc?=????????ʤN???{R8 ??AL?y?????O?O?????ռ?/?:=^?{??)??`?8?ɾ???Gm??-??4Z??*NV?-??Ӧ???k??)???IU?T#???,7?횲???X 0????u?\?*?H??? ??ńX???U1?z/?U?)+"?4???vC?nk???3?x?Y????d?IZ??&???6???y??Dm?? 8`-⑬? ++?V?1bi?H ?1R??Ҫ???1?C???{?C=????ŮM(?+??t?Sb9q?,??`?????Y??????⠡??E?Ē??Z??YOU0?1$I]?ޤ Q?!????h????????????hأf???OV ?o???o????????V޻~?WO??????/}7??????WPnf???w??i????b??zn????߳?????????f?T?&?-A???%? ! ??H??????&΍ہ?lHT&'L?E???}z > 2?:8`?mp?#??< ??T??p???[$K0P#U?dž?}\S16?r??u??\p??p??)?J)?!???!4+?????{?b.? p????Π.?^??M] ?l???Xp*F?y?gp]????\oq??d?x"?+?w???r?Ue??y????Z?4????a̞????^?j?Hۨ??????x???v?V???0g?4 ?]?47R?Y7????????n??*@ ?/??gb?d-F^?!_ ???M4$???Z[?&??DU??(?*??u???t?Uf[s????=4]??W9?DI??C?L??TYyh?{aˮ*sM??T??8?r%Ϝg?@?yD?EB??M?C? \)???3o?g}???RB???? ++????3]????H)b%?}v?w?m?????f|??d ??.?9?x???⇞fv?h"?????????P|??f$gN_y??O??&?{???>C?w????? L??ǝ???9???????l?????5??G??b?v?8_[?Zw#?) ?W??+%?:?????Վ0E?XPg??z? P?x/?Z]??;??S$??i?v?.5Kw????? ?cc???^Q؍???1?E????8;9??_???SΟ??)??p??6?$?[?L[?[{t?R)8Z!G?o?)Q???Is??P!7?M\E??HhD???2????m? ++????[l????g??g!A????^?Ɍ?f?JQ?????"?hD?r?á5?y??$X,ў?U3X??3bDD????.?{,??|iU???w{????H?e?ndT4???Z???2???c????f?FHB???i?5???.?=?$,@U??шMœ-j]??u!P?G5#*?eLjXF:?"j.|Q1l)?٣??0S? ?H?I6??{??@??œO?r???zsߵ????7.W`???7???w???lg?Ď۷Ϩ:?׎:x=~?_?C?fJ? O?s??[?_[?uF???V??G??]?V???&???\??}?Zn???)???D4K7?~??7b?????m,n @???Mg????Y?>???*??hϽ????I?????Q????a?0?=1??+V?"??]e???$j? b?]?7??8>??/??????o??7??zx??]? ????𞜅0X?*??x?????w??7?nX?Z׶?????{?"?>?x??????Ϳ???u|? S?u?>?z??G???| ??7????????g~?і?;?????t??>?????-_|?u~??wx??~??!?^zwy? ????????????>?p??????%=????n˻?G?????α???8qpxJ?w??A????˖??S?=?`??/_`???|q??^\????ũS(??2?????????ur]????ʘx??5O?+?e?W?? ??b??W?5?+?[V?}???F?F(?Z`?9????"??{?????rB??Ő' ++JzJ??9??l¯1???N??9????Z89繸?p?^sx?fsy?E??Jp?9??n@C???ݪc??U뻒^????큻]??)B??_?);??9Xw??[Cߔ?N8?"?fK?1??E??k:??J? ???%?/&@)?,n[\@??r???^Ԣ ++?-m x?D ++6?!QQgĨ?\?&R?Ujs?:?}$???˺C֑"ȸ????Ƴ?v?U[???O?Ò?4??ᆣ?C?=?"???#{.?@6??ѝ3J*F???? ???[?$͉???????*?>????K?s?7????H'Mh?Hh??'??-???[??ߴ(???$?\??_p75,Kl?B?֪Įk?Uv?E0g6&P,??׋ ʻ?x^?+m????K??*-??@??w$Z?K??'?ͽ????????_??F?????W$˽W???~e?]?p?9???a !6Fp;)?(?:CH????)???f?DJ? ???y? 0o?Y/?d..&??9<=b?u????&B? ++????5?%ٴ?0?jrlPi{?o?-7C#Ю??.ĺ???y?0 ??빭?vN??F:??F?z???1e?܋??bl??KK?Ps?: ????)*??#. ???QM&??-?'???U??????????????????b$?İ?q??`K{q?{?fK?:>x??G??_?e??{????????????;̻??l?{O ++3=:f?x防?⍗^?'o???٘?w??z? ???so?????y?ͷ????m~???????1U???????c^???\_l?k??W??O(%#9?C????b????Y>?x??2CҹLQg?þRf%?"qJ?j-?y???Y???Nǰ?T??^ON???? j??*???U3???ٺEKZ"BN??Ң~??G?z??hb?E???Z7?S)??);5?_A'??1ω?fJ?2?5??Dw`??4'???JEVdr;?(??M??A??打?C?WBpE?@?E}))}?-R??N=u??x#???t??`?H?kd?Ũ?Z?{E? ++WՁs??;!?8Z?4??[ǵ,?P?O???8?r?Dpp?xq????q ++%???9?R?M? sT8???w+p??Q- kn??o??B??"??N ?>????.{O???6???????R)D? ?D?B?Sp?u??i&x,B?Ut?>????????k?E???{??^???*?s?G>?p???C??}?"?=; O?~Q????݌hIh/t???ǏQ*]??%?l?D?'?*? =??&e?;v?Y?V?b???//(aE_?q??"??:ArF??\ ? ??q~92 +?T??;G?;,2?3??c!VJ_??z??w>?Axĝ??a?/|??<:???O?#<ܱZw?w????v?}g??^????4?ۀ" ??H%?}Oڌ?f????,?j?Č@ ?h??,???ʸ????Η???3]g? ++???]1?(? ?2Q??oN,?׻????????sJ?J!?;?~@??????] ?L67??x9?I???}0?ɄxÚ?Y?qNʳg?????ГRjn??0?e?X"??B?)?-?UAX???V??xLY-?}????t=[?_{]?? a???aGng{S?0wb???s0?]??떜=J?5R,?? o??G??v?-?E;?4|qWئ???????;????z??"???w??? ++?x???'???????_?G???.?s??>?s?y?ݣ????_??7???^???m~??~????G?^??{?>?????????Ÿ???Vb ?Ex? ????=?uw?y?0M??;|???ү?<?????|????????zq??>?+ ++??A??>???өE?^K%?B?;r??*?~?u>~zI7D?Wz??ēU?A{???MQ)F?^??????????? V?wx2%+?T?^+y|?H???1a?y????U?A?H]??????4%R?l??-α?? ++P}????Ҝ|??PD >??R;????P?p J?k?6???7?U]?,?H?P???W]9?????2E?I??`?m?҈?64?T%?@????@??t ?g???ގH???F?׉y?h= ++?Þy?!α^ Uw?H 2*??迸?h?r-qͱ???F X?S?EJj3o?|??J?U?????!?L?9??C?i??\?3?`?w?ž?&,t?;G.6?YoE?䙮?y ++??@sK???6?W5?-r??Ҿs??,????J? ??M#??ڿ????.?;>|??????>_??]?2?i#???? ?? ??Tz?(?Zoߋ??Cg?v?>f???h?s,N?ڔ?8s?8??]L??????x??t???E}??"R?l{h??4O??%Ms?2^]?g?+dU????g?U|????:qrt??hE%?ē?`n??? ?c?d?`?& ++?yj??W??8%?1i?R???[T-? F8? ?y??1???P?a ?Ԕ??f?$'??Hw?]a??6Ч?8 䱰˕^??;?Y?@Z*?? ??l?]???[{b?^f[?E7??41?S?W????-?͈ǫ$?????\?_??m?BV?9SR????qMĄ?ReW? ++??i6b(?B???%P?2?V?b?W8:?ﹼy???~͜'bxg????U88p??b%??R ++n?7??Y&??&?.?a????f;? hA3??L\?:J??p?k?`???4?:???v[??o???J?B&????͙U????Ӽ#??36O?rx??&K7??\?jk'R??"???5?a}????H??f&?WHQ??t?9?`? ++5р*sbժMY]??,?\????_.ج!b??D????dѻ??[J???IV??yu?V/?eG?+?'?ܽ{?;w??lf?~??Ǜ ??? :?x??zp???>???r????????{2???P?⺫?^VY?v5@?6[??A9'? ]?H6?`??v?P??1l?E??X;Rگ?????;w?X????2E?U???5??? ?S?R??y??~)5????@?~?\?3!D????ݶ?#LS2"nVB?F?:z?AT#4R?֝[F?????9?TR^"?+}??Zۼ?bb???*i?ԃ?\?\ ++?ZŪ%?H?A??g?>???????nq7??u????P?od?b?XH ?y?%m? @?????J?и ???Q?Bb*?x??y?V????????u?y?Z??B6?Cl?nO#SE??ЋP?!?;O??^?&|?}jR?.}??O?ΨTX?6-^O??bΪ)M̵??j.}s?6@Z??Id????????????ZC???Ymv,???"{5???x????|C??a??e??}??j#?Ռ???v#2??z???Έ?ptF?w?u?Iu?ؓ??p? ++?Yʌ+FH?͡?"??^??)^%U??&NON?????O..???Ǽ??ꄪ?Z8;[?[??pf8t?Q???=?a????ɶä????D?պ?5h?+hN??H?&?r~?GZB ϑO??7?_2҈???՛?Ԟ???_o?C?-2?????Vdg&Oc? ??S?3???AK5?k????vO??:??B&??j10m????I׉9?̬???=']ljI?Rm?,,id {1?=wK??4셖?????e?3??h?? w{C6??n_G]??`?`?UsA:1L?"r?^??i?D??f}X^?a??????,1???]T ?#?}sbwM?T???Z????=??2???. ? ?a$?f??R`? ++???7?Ώ??/?mb????c?i[??????ְ^??9U??=???C^e?D??+??e ?=???>~??_z???????)???>>GK?ݷ??֯????.?ᚪ???zM?ٙt*;???>?8=?!???G}????'??w?}?>??~?7??EvO????'????{?|??ۜ_~????g??rH????~??i?s?y?????\?x??k|???L?Oy??>????X?η??<(_??W??ˏ ?1???]?y??w????????k????臏??ڟ?ů????.??=c?@o?????zq??>??ͅ?u??D??bS???#+t?qd ^A??C??j?⩌sb????#_?H??o&???/񕯾? ???s???כ?@Zȼ?g?z???5?z?Z{\???y?>E?=??A????\K?s?2???vH??v9d8q,??Z??3?|??v?C??ރ?a?|?[?g??Tc.??;w8??XDz^?,ވ?????kkdrV??xK?";C?WSj?@¾o? ???&st]_o?38_?s?.C?˫ ??T????j}?x}???w?E?Aq>bn.?i?:?S?;?????_????x???囯|)??je?`???ã?90?l? )??y?????%??.4?N???F?Ee+?|[i????;?ձ?:?LS??B?=?y???910?\D?ۻ?Ds?xo?o??6F??+%G??p???w?z?????luD?? ??tP=%Mv??ǟP?ಣ?%U°fڌ8?lrt????x1Um? ???v&???s;??:3zGՑ??~ӎ4+?_?q׳}?Hsgκ?Zq??#?b?x?C?Z????H3???~i??ȇ=????O?`?@ ;??ý????E?R??'??̕n?3?Qh??6w3? ?-&????n??rO?c?= -??Ʊ?Hq??L?????<E????`?Ҩ?j@8?"??? !&: ??)x? ++!??*>?<????G ???gd?#????jdC?!\1 ?(?Rs8:q???!???{&?pJ?#~L??(?u???????ʒ@???????@??8s|v??f????c??3??"?p@W?i˜u6p??JG?<3 'x?ו??L??? ??Acޒ?96???+??) L?H??O.?Y?+|?????|?1?:bhDI5w?%e$?B?j?gT?g???Ԅ^?3??DI?d T?Vo?:Ң?B?P?s????'#Z%xcg*?R?w???]??ENM???U`?Q?O?]]Ov4????????m4??\8?*%+??@7?????U%?p?? 7r?????2mf?k]???)?Gr?H??7???O????؛?m:Al?g.C`?; ?? ?}g???)?F?{+x???j??zK7ؤܝx?T?;G͠?Rʒ????c im?j?????>>??y?.Rt&?HN???e?x\??cY???g7?Hi?Ԍf ?`{?84???'?? ?aEJ[?T*?f???X??P?Úiw?:h??>?????/nI??[:A1?\????g??-???͵??6a?????}h?? *́)Q?? ??FR lvuOz,??b??*??R???h???M?М!Հ?Һ6?[" ++??ʎ? ++A[!??~l?r?m~?j?[U?R5?D[??????{?>?楗O?%???X4??@?'?\??E??Bb??????FƖDŃ? ????\[gl??sx]???Tٟ??8lX?hߧV?L???=??^{?X??????????ky/?w?w?.?!?'BZǪ?YX\?&@v???x??*S???w?T?[*Un"1?h0?????Rb????o????-U{?Pp?=????}F???%M?KO???1]#?UJ???4+???Do)??jy??%z阒W?LЭ? _???????????5?6????=b?Y??U?ѣ???)??rzңW?׀^??b)??X???v?h*?b@)%B?Qk??Kq81?Y۫ ~??a?M?mɮ????Mf?U??/?X@YR?a?"eY????F8???6? ? ?????z?}?9}???m ]?I]??(P?????hJ?6?x??, b.?? 9px???Jc~???I '??D???udc}?m??O???DŽw?? ++?????L?Bѯb ے0ΐ????"bi?=??%????f??sJ??v?f~?Ħ??(?i?^?1*??K?ϼ???El??2?6?㽆H?%?p8??]???%??e??Fc????¨s?XX?+??S?q??}?u??T'???U&Kϸk?š??PRb??$?H?ׂ?\???8?H??0?+???+????ѫ??Lqd468??˾??z@?*_???J??B?~???8R??.?@Ϊ@EP?o?H2ړ?,!(N?r?#? q3R?S?̐t?mЈ??N0???w??5?0p??u??%???E?x???SZ?7??-?????Z??WO??$?!?<۰???G?I?ub ??-N ͨ??q?? )'??K????!dFݞ'?@?ɲM?u?P???#? ?D?)aG-?E?d<#?HZ&?????g(???o??OE?l[?7u!IR????;[?'??e??a?b??dh???Q]????v??(?H?X-?k(E06?J! ???*2+^L&???l?{?{??;?fK?%Yu????5???+ْD?S ++?i?!f?Y?1g,C ?T@rѮ_o?~>Ў ?v???m???=?=9?*)??Ӕ?g??7???|??l?;?=??{s????Ќ???c?q?g?|??`J?5t??Z?S?Zq??0 ٹ?ΫE??څ'8c1V?Ɛz?J??| ++?*?S?|? ??O3??mG???MҞ0A??4v-???4?a]?VW??MJ(x????EV????b!E?Mc????s@88ܣ? ?@?]???g???0`?VlR?:??gb ?/?v???{??[P0P??l??? Eb?Q??L????@??N?????W????Hp????s4ސV?m ??*(?L?,??'?=?vʧ?I.Ej??S?R)??3?_J?u??\g ++?K?$?n,1&????h?? 5????K+*??L?d?V?zG??1??: k?WI??w Mٹl?YPϳ1??X?B)JԱ?s?-V'Tp??_??A??5?|ɥ$?h"? ??9??΍f*kt??ف"Y?(WA??dL?`????+ֱ??s??????'????-, ?`??f? ?8???Hu?ힳ??P?yI???c??rYv/րi$ՔC*????zEd?G??֭H?{?e%????  ????,U????=???P?r?fԕ??S/???،2ӑ>?a?pӱW ++Ψ?P?c?Xs??U?qw'??o?K?ךc?fW?{??4?$ݼ\ ++NJ?g?Œ???%N=?J?W??J$?????X ???s%????(W??$'???i?@.5 I??\?K?LVRsG8e??g$?8Q'{?*Rݹ?L?J?F???\?n?G??1%%yZ?b??? ?1?i???o[?M????d?s??????%??p??/I#??fBI?? ++fu?,`-???G?z?????????T#??ғ??ߩF????iT??5Ґ!????W?`]?^w%???K]/?]5e????\?>v$????RŘ ++Y??.Ɏ8??U????2?%#h?dJ0???Sw?T??P??%?/䚦Q???c?C?m??Yb??=??R?L?T?2N??$V2?\??????'J??u\??e?.??w?a)?wID?3C?%=?0;nXܛ????珹w??Oo??T?-Yx?`IgG ]???`R?& A?<16?&????R??????8??$W2??н?Xu?ٹ??e ?X??0hmF????#+W?Y?*8?x!u??*T???>=M?WK?^?SyJȗ]?J?? ++̥?W?m?k_??l*??†??#d???g8>:??????'l?pe??r0?_-4H?0? ++??? tS1P?Яڱ?+?dR?R???u? Q??JLk?h=G?27Lci???;??ܣd?yc??"??:?:?:??G( &nJ?h?Z)?X,V?SO6ܼ>???B?'??*Q(?09?+f{?)%?"DkIۄs 1??diƖ?fKN??O?%bln?#??+?SKk;?????Ýo???|œ?9?·?'>!??+7;6?-a0 a?f??k?z?p?8a?b?~??O?????U?y?ju?7??2? ???)?R??鈰Z#1b??@S??fJ?3b,?W???7?(?@?0?5?-7?qe??G_?6?ap??1? ++?Y??{׸U0H?DG?*u?uN??y??j$???vygX??)?R?ʁppxCO3j0űYn?v???9[ {#?s_{???O?+>?????n?kG2?ؾy?aI?u8i????? u#?Fh?s2???a跄e?@?ug<&bW????kq ++Bӌh?L????̇???ݳ-et????Mn????S>??S&?W?k#qkY.?P? ++??sI???b?T2?i?z??r??5??>'???1?g#???? ++???`??E?Rc˥0h?? "??K'D1?c?? ??TA?*0P??? cr%=?????\ّ~???:????{5[#wSBى?v?A%?????J?/?xuyJ?BH*?nQ???;??V?PH5^?R???;f?e???o?????Pl???{Y kI$?;?x?2??D?}?}??q??{\?:?????h"*P?b???zO'?DGF;cs=Ϛ`?q?'???uCrYSҮw5A%?v??$j??h??d#C^aJ??V??ɤ???n`Ɇb??Ȉrj?????0??pLI<\Gڱ?m?????p?)?6?M'HQ?^?6W?]???M8?U??u? ??B?M&???V???D D?d?????L?ęXv?z;??T?b'p??FI??|?q??+(p^??*Z?H?J?/ ?? U??.H_c/? ++F??ų???+PS?WD?ז?4?Rcuc??\ ++Hpg?x?t?=!???7??ݝ?{?o?????D.T??F???y??59?`G????w?ߜ??D]SթZ?> ?ĮčqJ╴{???RQ2P??B)???`?? IDATC??*F.??K???R?9Ѝ?p???o1钘?x?*R??^??gޑ?;?zG??Ȱ?0?3d?k???x?5+كv???>J?$?P???c-????4uHR??kM??k?-?r?l??+3$a2j?k???q??͓-7?'ls???v???8$Zp????г???k1?)'?1C4x??IrΤz>???&??.????Kq?O?}?皞r?????G?ȥଦ?"u??٧??-??`w???W??]=??q????5??G7???????3??O4*}7????yQW?~îw ?£'?$??7?ө??w?O?{????y????9?+c^{eD??$?9?ID??lq^???[?1?#?H2?2DZ?1??x{?m?5/?#?VyŸ???%?@$Ԕ=??x?Y??{I|%??Kݡ b.?? 7o?V????0^;@s\?_??QU?i??x?_z??X $?0?8?*%¶?u??^G?[??,????~??~?7o_aX????ќ?^???gDk???N?+?3?m:r?Lǎ?f?x֩??F??C??F;&??f? ?5?#???m?ج, q/?y??կ=K??(??K???r?7??|??g;J^`ŒO???p??т(????8=}???k??@?a*;?P?@?[??? %1??٣ ++?HL ;??[B?k?f?i?{??????3br\1?x?y?;???[??{???n??x?#~?????Syܶ0r3bJ????p1?HuCXd???+?T;?s?? ++ۑ? ++e???????•??S?5?$?<Ƃ?k->??X???i?$?α?|ے?SEp1C??@?xu??Dc??N0J????N?`s??XK???Hv???9M?2 ???4 ?ZR??:?J ?c??fS???.?ј???v???@n=y?%l?kH)Ӵ ?&?? ???r)&⛆??(???N0b?LN?LW?X5&?????=.w?t???dT?숽VaY?Jqթ???????'?*?V?xs ?f?i?/??W\?5?F?4G??vĭa3?8?1p??7?Ѹ?????u!?5޷L? % ?`??*?5*=ת??4-????%q??9r?????WF???-r???7?ҧĨ?`ru?Z?PO??(ۜ???X-?L???Dl0?:%?rVS??%)?/?c?d?K???RVG???C5o(??|1?5)k??duu??c!?(BT%]ѮҢ???Q!jֿ?D?@??? ++kt??R?Q??\_?/05~??BU?*??8&???.O? Y??R?]???^4G ???i?y???Uʲd f???z?`?cq?`tА???~?;??:}R?xk(?cr$? V:?xҠ£?~?>/??"R?Qt??????O?{?iS?u? 9??Z??V?!?$?+X?e????s1 ++?k駩 ??4I*??D ++??o?K^?\l?E??U?@?????*^??h?N?5R,65_???#?????~?m4???G?MMt?l?5?????QcV 5?^?0!?Jm$?w&?=W̮_?"9?o]]?f'0????#+wduu???$??D?????v+????v?e??RJ?S %???-?Ѽ?CtJ?弻??*??RI@?:????1*?6?b?E??Q);?X?ǎ?? ++?&??}a??0j[??ٰxt??~G.[????撄????H??g.I?]???????y?k?>?'???P??,l?????|????Ǻ?Tw?.???G?螘*K?=?3HI?*?X?=?E? ?s??\y?X??.?s$Pɻ???ߡ?}R;??? ++?wQ?????|????T\?F?^:????d?/j?s?=?V????7/???z.??r+ ?N㰓 ?f?XM??P???w'?`!6d+ =%;u?Cu*Ws@???dK?nx???_S??h֜????)p?pε??u,????3FS??c?#䔸?g1???X?7?K%?(???x??/ ?#? "*??8_?t???f????"??F?6??u???"$???|??x?k???O??>o????ב?0 ????ޕ ??g\9??bu?ۿ9???????.?????;?ʾ?b.?M?j???+%K?W',???CЙT:? ?X???%+?1????M??O??o????Ń??4 ????z???%?!Qİ ++?9V?%??|?????x?\p???ܼ?????9o??-JH???wy??o????0MDJ??=???4????|?_??o??sn??~ؑ????????z???s??={?'????_????f<\??;~??? n?????????+?|????p??gx??]?O"!?q????e$? 1zf ??ϙo???/??{d"??v???ܺs?????9??ȿ???????????“?Yn3׺C?????? B H6???o??Wn??{?)?0???a?}|E~~u|u|u??!????a26??f?b?S?2 ?Y?>b- ?q?z?y?&???XIؐ??B?4?S??⨔?Z# ??>??)Y?NR&???Ǐ8????Ї?uܿ?q[?X죞"????Y-F?È?oxtoEa2?!?%? u@???g C X?"??)??k-ƨ[??l?4()d?*??h̪n??vo????.?-%?1?F]= ?r??m?`bA"؄!??,(h?`U?Z g?I?t΂_oiƞk{3?~?؆b?q???u???w?%J`AA??m6xq????ֲ^FlN?0??Ӎ?UBTj??~^?3??b?=?TUd](5??T%?q8??n7u? %??T?K????QP'????S???ks???x??\9?`ێ? ?z&]f6??o?ONp??j/???}???;??????c?y??,v??"g ++9W?;?|ف?Ƈ?Ρ?'?Z%?J???&W??(??Rb̐kjM?an\T?vT??.*/[?I??J?D"????\?J???.S?ǖ?[??i"ר?m'???1???sK??^??oBE?z? "QE????GMV ++)x?M???????I{??{?RL9?0\??vM?v`',?{L?k??DhIJ?p6kM1*???{??QKp??y°??AL?6?D*?????v?&??ԩ??T?eB??9? ^??)?{??UI?rwU;???G*?bx*|??B?"?"JH^???'????l??r?4{?-#???X??9P??y?~׮?]?u5????R???????_???-?4??ni?)f?????Ȓ?)`?Ú?q??{?JV _?( !r??O?????xY??w?Ǎ??x??/N?p}v@"?I?f?3?#>??1??0t???Oִ?=<>??3????????O????>?4? ??5??????G?o?????]n??:???wHx??>?????{?(?Z?w?p?g??O?g??;???/??8????????w?1?.?t????????}??l?rt??~???9{W?????_????>#???ǟ??߼?ll?w?{?t????o?? ?w,???r΍?????OigWhs?i/ܹΰ???[O?M&???Rz:7?????ϯ???????!??H??Č?? ?bu#??$??????k???Ɍm?b???l?ruA?*? ++????HU???;??*=?e???bh$??\?0'????#?_???q?f?0???I????o8y??;o?a~??????Nc?J??J?\ԍ?S?:?PlK ++?E?:SN:0??x?5>????t?j?{?c5~ψ}???!?@?)?!!???Eؐ?u?o???1o??"_|?[? ++B??Xa???^~?'????_????7o~???9?????cK??????Xq?w[?yx??1??4?@?n??8?fS???x?t(OI@??0??\"m"?f???@????Uk?^??5??Q?)Ui??5?>?g???57??\?MO7=`? W?>Ͻ??d???B2??X??-?R[RƸ??U8???F??dp???y???N4??x!Ga??("[v[_? $?uS7?Ɖ?W ?Y?Cٟ깷?????D??_?????}bJ?[R???V?ep?i?Jr?ɟ??ˆU???bII?v???b?F ?3iH??P$ҵ?>bZ???u???H?(eCJB??? ++9??????/~???k??޶??E???_?`<?࣏?r? ++???V???@t?9l/?&3l{ڶQ?)ô???!?H??????s_??K???B*?M???%v??i?XC1?0br\?^c?\??7kLr?]??f??????q??- &?d? ??s??;Di ++?Ʉ?0??1?aA???H? ??!?#?d?? ?-?l??2mpp?F??%???L!??g?>??s?’ַ$? ?h???~??[??xgH???%?ߣ -M 9?u3?״?V H" ?vl?l??? ?B ?|@?g?iT??-?Yǰ?????a?????????D? ++????2(???ޭ7??ZB??"Xk???i??j?*Q? ??{)p>,8?]?0hd??:?D?2_l??*??K??W(Q;???K?MX$hu?7??$??Ē@?@????Ni+D2M?R?P?hv??3?q?^?? ++x ?D?F?ߢv??ɩ??? ++??1?mm)D???????9[&n???? M??pmau?ZO1K?ya?M??ԅ?#?Z??gR?pmÒ?????ڳ??$*?j????"???&']??DlA?Z??vΤ]?ZOH?yp??\η?a??o|??g?&?vxUs^5?_L?j??&???????k??Z?????(e???f?|??O?Q?i?d{Bj????Hs??????????!?gk?f?l=?`????????.?;S$6g?L?7?xL?\i??DG\???h?Kw?bUM&Hh???????\ޯ??Z17??F?j8z??&??$?hk\K|?9ݍ??{?|j\F?j??^ݭ??:?k????K? Õ?~?/?Nw???? ++o??(H???Xj{???d?}???E?r???Jl?a'?q(??,j??Y?W????b?ŵ?÷????3'h?=2??ޒ?M??;?F>??7????dC3???;JȔ?"??Y?L ++?F0:R?C???ޚ>?h??=???v?:??e??uķ???9?M???????????[????&??EjwŔ??Ў????J?z?]???[??{vN?b? ??e?????3???l)Y?h3)?U?b}?g???[??|??? ??w?????s???~?ڜ?-&W?9;?O????y??=G{Wy?'?????3؏??o??3?)Z?F???{?GmQ?j???`???Ul??B?MX??}??y?????c?ݒ??g???c??ʤ?Yt=??,???s????n??????`q???q?x?f?s^y?6???}???L??H'lV???_??[?l.?_??{|???????x??o???|?w??????/??:?bM?u?????'dz/|???oq??-Ξ??ޏ>??P????s?d?r?qz?y???ȴ????sJ??x???r6g,? ?????bj???XO??9????8?D?Q??0 ؒ?@??S??e?l?9_?s??sl??ZA5?َt\???3??g?|???;?}?믾????PK??x?BH?(9C?x(??h%????Yfq??c????]&??F?[???7?/??E,?)d??BꂁՓ?#??#??? "y`uv???uD2q?# =??g??c*˽J??w=??g[ ++F??F?#j".=}?y4????7=w>???́?:??9??}?.?-?~?ý?*?  ?8t%?YG? ?W? ++[?8[??w??7 ????n'd??Y???? "???¸? ?'??? ++kQ??)y??$?1?2?i$??q?7?u?8n=s?ݻ'J6???w????Q'???n?D:f??iZC?D_?D??;nMQ-?0On????cg͡1Y?q-??4?Vj0???.&M??7k??6?(?b????[?M? SZ?M?l ++?72I_M?_B?;s9?>R??0翓?/????o ??Ř1"o??ON5C???UK?k>$??ȵ??k?1?`}~????E?g??9W?zX?-]?Yg4@????ᚄ0L?y??>??'??}????G??Y?q???;??v?Hz\???$??????b_???a^l?pj????xv?Kh?@^"L???b1??z???jGT4!vp?([!???  ]2?[??K??u"?Di????ϕ>?H1cG^hP?86?L?T???\?l? ?:(???????I??N?S?5?????v??'d*???UH1??֣;KcH?A(?Oe?X???`L? ++???D{????j=݊?? ?Rt?t?ρb?>=s?z?g'???5?9e,????9?\?W_?b?]=a9P????????k?U?4Ǭ?D?[?S?v?lX????ӯ}?????Μ?'w???`?&`?0?<*?????{??~?9???v????f??;?2aߜS??z?7?v?A?C'g?>?_,????? L???;/?8U,*[/6????":)ɧ???R㎔???2\?????o]]R~??^{? ++_??k?21n?????+?@@r??-t??Ào)?'??98?q????hu?Y$Tr黁??>?\<2^??p?? ++O^??΄;?µ??Kb???>?R?NO????? s?#Q,??B?2>(e??&?f?膓?ׯ???gțCV???4[3??M4 ??DG???)g?d??ǣZH F9\ ++t??s3?4U)???{?۩݇J???~ ?u8?r??cw\K??q??P??{n?xpSe??J?1i??P:?0c???\?3AN?j?ZSo^:???w-hAU?p?-M??Yhݛ??W??K??vD???Rä07??c?-V?\????Yg?????Ϻ?V???e??~???????.n_?????`??\zr?w?:[ȫOBk6?\=?? ???&?? .??u??-???bO\?;??k?q??Aͨ?T?$]??`딈Ŵ??=N?'\?8?f??gJ?Lp??\?D3?;?G?͏?B?`?-??8??y2,???Fnq?MfIv????沬-?r?/#Ρ?q6??P cB?h?5? ?? ?jp?}w?|?{_?j#??"䒚???Dj??׺K?P??NvI ++\?8??)gT?Z?M?I??۝3?9??js.???;?=៯??Y??)NhV??????t?????Oϸ??§w?????- ++?;?l?ą@?Ԓ??3?}?/?-j?? ??ٸ? ?yWz֣???????O?K???"?O?_?+????<:e??O ??/?? ++?x?{w?3=9??o?@᷿???????\?,:_?c???Y?gg???l??ԑ??????????????~~??{??k??Ho" ??????@??ygih???;??ǿ??iσ?[N޻???????:a?V??q?H???Թ?)?Z/?Ey?zs??_????7`?5`(ۀ:GQ d?HhQI?@\5?Է~&????ĀO? {m????????5#??x??????6?o?/=??6??E?ƈY???n??n.]??+???o??? ???a0?4Tj?~???휘?Zts6??sFx8????????R3>%??s]r?????/7???{|uq????? u?BD?-{^|?%???S??q"?S-?? |??Op?K$8B?hLLyC脮@?>W Xo???1-t3?/M?u?t ?????? ++Sĥ?T;?:1R(9???ǧ ?w>e8?CN70?Ã?X=??2??d͌uCYmI?? ?҈Pٮ???1?+?MQ??/???{wHю?y?tsPWq???o?p#??Yb?A??J? ?/????YH?ȴ?x???e???g L?&B#?c ++?R9??B??L???????k????L!???e$????-???L?q|??񃟱ٌĽ́!?.'?????k?;wٮ?♧_g]??O??7??S?a???>???B?!`??hb6L????u?h-&z???P)m?0?/F?̓=#-Uͮ??.???-?G7???a?Ku?}?s???????????7*I?m_?s?1??[]?9???|????`g?\??"??sj??\??;W??D???К,?8{&??0?_#'}i??u?Y1w??\?DMTcp?D@m.Z?}??(8?&T???in?AcfgwT ?O?p??9(??G?|z???e^??7?????#??躁????)??Ēp"?`.:??/]CG???s|??O>???2??????Tm??D?=O9Y???†??]???O~~?4[??[  *օ???2???1?#?4?=???h7t?;??l?R?#1XU ++Qx#????&??&????i?g??;'??CL?D%-5Ƹ???n?ϵ???:?~z??8?`???D?dsEuv??????1z6?咭?"B?2!?=?@h?X?Kv(!oZGL-8???????O??????C \F???????9J F?w|??q???S????x??????ŒGO?W!1a: IDAT8?? .??I??Esx?&?*-????ͽ_????n????6?u????臀?Ք????????E?????)Xš??,?|?ۯ??/#]Hܼ?4b?=^?f?n9PrE??Q???q? p?^hr?f?~?0?G??G?V?O?^d?2? {?E??d?nu??^I?L???n?d?;??3J?????lǑ?-Z{o????>?? ܸz?q}F?l?jÂ2??\3Az?M??9>;?y??pN?9?p?F?@0'ꨢ?42OJ????v??(.????:???NL???P}f?;r-?h(@ƛ?3z?h??W5?h??Y?\L?̑7?|?t?3??v?r?4%0?2 ++C ?:"?????պ]m??`>?y?o????"XY?7a?/??u?e????PA????6?κY?V ++q?(?m???:?+?>8[_\D?LN%+??r4?O^?}?}n??"?\??K?vsΘ??%???Ja?R?^????_2O?}????,?>?l?G??'?????]/?8?ަR ???[?B(M}??o?e,?h?? j. ??hk??5??ELj??*??1?Z?e?9?j?8??s???6?????v???y?*1X?@-?@??P $?豾?:V??]?8?ua???/?h???y-??k?cD]a9?خGB??R?>P??K ?H#?xP*?D?\GV????D.????|Ҭ?d@??f???N?y??=E ?胲:?# ?"??*?y\)?dgٜ0????; ?l?D?*OGW8?z??+????͑?b?????.&R?M???E?)?=k??Yk??]S?K?`??U&?7`?{?m?Sn??.;???e?E?Axt?>?????<<~?z??̳?X]L???~?7?M/g%???NL?<}?(?k??J?QQH??b?????????H??iaZ??ӈ????=???f$?y??9j?R ++1?;mFbj???l???O??]$xϝ????=??? t?ID? Y??????9??Ľ'O?LSe?{?8?y???y??}^??߄?Cs??HP?=??*Nlƭ-vn?S,???Nl?v/??s??s???????jĦ?N[se6??.??)m?0???!m5r?I?ö????0휧%?"?????Wݎ?h??C??I???>4甇8?????寽??j????Ĩlʖ?"????E>|??? ?z??G????Il?7???"^Z?G?????'????^!?х?g?繯>KY ?????b??????/???m|I?I?ѱ?6Do?^?bJ̳????A?S??p??v?$?G?b?Rc!?B???q?2 %???"&?h????_~?????~`}~?zG?)??x'?Dr?.ڙ????????&(.,3???-~4?"?????cO?J.?$H? [$ytlۮ???5q?q_-l???.C???\y????%W??n?T?8?86?:?X??O?HM#??"??@.??:{\x????f?"?uc?]=@DX &??P?Du???;|? ?a]m???*CɓPK%??E??{f??s|N??#?q?&?w?3??g?3??X4??ތ??????.pp?)?LLLv??֧?8?{s? ????P?????JF\B?̳_??x???ӷ?s?A=>??h??x%Ɩ?V#??D΅?&)o ?ΒQ?c???? 7a??E¥?Г?e??????ڄ{?.??????U?qcשknj????KK?PuML?ܞ??,??B??MԦb?!Ɲ??qI???۵?E?O-UA????w䬷NRמ3?}?>?W?~P??mъ??p??kq??-vU`Q??~??v?v_vq??L????Qwi&(u??`m??ﷸ?p.?c??J?*?t???????В????e J)u'?)?a?֗?,?;wO???8/??e?????9??4???????nPc?o?ɷ?u??>?9??????ǁ????????????W?a1?َ[`?r>c????@X|????q?u??Z?ڙ??fho?Ulݹ?? ?Z?X"??˕2??d3G?В??+??9?V?y??-?t??ن*??&???$H?$t????(3a?z\t cK?Ђ??~?(k???s?O??W/????????????_2 ?m??ѩ??2?g?ܧ^?qx??/?,?pSd?-?}??\9{H~??Ѷ2??ZDj???)?Y? t??D??????l???'?a?|? ?b ++5M\}n??o?9T??{?%"??t??ϩZL)?1a????? ??«?=??J??0v?? ??UD???!ʔx?B?\@\E???Y????c?&g.?pvp̬wd6Tߡ2q??C^???ܻw???=R??3(??8q???n?dS??-??ȹ?5st4??E*9E#?넟? [?T??e?Ǹݠ?Bu̻>(??^^a????>???Y\?????qb?[r?3???q?b?y???V.?7dY?b͂@?%ʸF|??E?͖<>>?ee?`΃???ӌٞre??K?????>?O?ź?????0???Fg?????C>?lMP??7??ᜧ??ν???.xJR?K?w8??eʈ@ ++?"?}?7?8=?$??DB eG?????+?͈??l??Y?_eo~?L???S? ????>???_??s?i?f[?i=??N???Y?Ht???:?"eb????7????/??+?S???º??6?Tmn???HG?ZQ???%?? ?l0?T?3??%? ?bh폴??|z???????U;gLSŹl?][,?????Uňu?a??*?ƣ?K??KsY?.??}FYOJ?????~???5??B??d?}???+??%,???&???f?W{=???}?u?q?K???_??oߣ>??|vH??'I???5??;e??-??id????b??T?+mMiN\Z3?#25Ru$jl?@on|,?@(??I???{ǃsTo???>@8 ?L???/QGO ?ǩ0kݪ?w??=?)?-Fޏ?^(?2???Ap1?ߌ?'q;Q?? ++5???h?>j!?u??[c???Z7??t?????????)u*t?1 ?ֽ?‚is?;o}???????????Y-?8}tJ?9?n???k?,?=[???"?&#??lI`?????/??Q???!x???񄐚???(?'?h??r-?n??霾OL? ? ???*?Z??N??6?w??QNVFq??#?E???|???U??"?36???빗???g?⁝E^G???????8F??a???g?&?~?!%O??:S ?%????D???>?WX??li?kF|???TM?X?֚?Ϲ??j?^G6aܥ ????????? ????|a҈?f?@+Qqk??۫L?b???vzI??Z??IA.S ?w?????Yń??Ɉ?ܩ??*???? ?0%K/??a?????]?f??9????jL ???#?3??_??Kbք??vVT?w?#~in???I???bg?o{??]߽W#?m?M ?9?[?n?@q?i*?S?КǍ9?[?,(?b?h?-mG?:?_m?qɊ?W,?$gǴ)0)???.v???C??c?? ++?????!??Z?O~?u~??x?z䭷???/?`????&??M??!????X?-??|?x7??????,?c?m[|0?????L?eM????U??h?%?Ho??v?Y@Y?-????#N 7n1?#B???|$?[?9?Zp;?f??L??ؤwí????????f?r???? ?{;|?h?+o^'/G??팦?0??X????ҫ?O?<"???????4?????@???k ;?????7s???#%????8???ܧ?Q????MZ?q5??8v&-?.?d`/???G??x??'???m?"?Ͻp??? ++?0$?f???i ?`9?Ѳ~Thۊ?5?n?O? iX?=?(?6??f?p???!??"??͈?0mZ????5????ي????x??S?9?)g?I??/8?}?Z?RX??)(N??li? ++H??Ʒ??*?]?R߀Ĵ??LQ?9g???lE?+??l٬#?ل1ElS?a{???]?|??|??2??ElJ???~?o|??c??RZ~海x?K?æ?l????#XCI???9?_????"B?W???d??8????O\???]LJ?8??U?՚?b????wn?|? 91??˻&8V?B3q?Dv?`??Hb?5???va?a?:?REs곫T???????z>???z??\?% ۙ??w?CJ5?%K?????ih?;??j?δ?q?a??gڬ?4]?i?Il???ԓךD??pt2cqY?BɳK:;c?yJ2?(?e(?ɮ?>R??????~???!?{??s?[o?LKk?iRrD? ++T?? ?v;w?L????.??????S?D6??7?x?bi?s|?6?%?>?b?SӉ-DI??F٘??S?\L?:[E???6?“???3A-\j??>wK??٬?)tɦ? ?5?؀dA?}??E"??}K????u ?FA??;??U??T ++3c??? я?cO ?j?;_?9?.?h?"??>kC???H?-?iɹ?)MJH?i8佯?c??????????s??Bkȫ )? C?8)??>????\E?j??uj?u@?@??|Qʃ?@??rk?E?D}DHR?D????R?N?1?)?Hz?f&?g=??&??Β?c4???.L?v?&i?|?w???Mtl6???Ǹ??4?????2$?l@??Ö͸???Z?w?\0?)?????T??9? W???I?X_??? c??)?Ͳ?tV?)㚖"*&:??kB??Ո??X02 R????V?#???????ܣ?j?-?????"#6ºO?8???Y?K?????9m?x????AS??Rq?+?r M`Ք?D??>?F???/9lL̅I?fDt???#ydb-?f?N? ++?q?&??l?Ǡ????z?7?~?56?ۚ??{J??f֑?????f?!#"???S,V??E????U?.?????bPsNA?;???-?? ?5?农,n'3wZ?bL??yO?&?5H^?&.?`7?Y?ΰJ7??V??y????????,? ?nr$MW??0$???E2?(?k?X??I??j????&1?~V???y?d?簦`?v?J5 )?K}"Yw}??bj ++T??v{??/ų?L1?'???YX?! ik6?B;??????&?R??Uc??3?????K?????}?? ++9??N\???D?×*?k??+]"VOϯ?v?Zkh:O?#b????? ???o?9$??????+uW ++?5xgh斍)4mC*??#?Y??X????u???L??o?̐2?>??`H?,o\?2???????????}???[?y?q\?='?.ݼe?????':???? ??,?Kڮ??j???1b?Wtr? ++?(*1??cm?457Z?N??????_???_:?h?J??k]G"q]?B״??Y]??F?-?L2?|(z>?I`c??K??x? L&s?(??g?????s?????????~]????u??x c??.??Ҝ?7?????AN'0?z????k????????8h[?I{nj?i? y-??Y,?????)?]D?B b??5)???hX? ?(?.??F?KH?ж?@??q????T?fS???P?5?b??/I?????r?7???;?9????l???C??4m???"o?k?? ={?vH?5iv???Ÿ???8?{?~???֝;?i?Ï1?????ɿ?4|??Gl??P,???.??(S? ????-?]??-F(???Z?3?؃??W^y??????)?LN?&x???MYb܄`??!?D?????e?96}??7n???1?4?~M?N?٨+1k?D??)^?7Rj??0n.?Z[~??Y?????]]L??R-ڟG@r?9???ݦx?䆵:?J?????DME????r?ڠ?%? z?+?:???[??3.???-X)H1???x??O?N9y??7??]1$??y?????soS?.G?~C3i????S,?iX?̯?3??q???g?"Sю?x??g??0?hb?8?ڲ? 2!?YQL}!t?a??L?a?.ٖ?%?????s\͗???uRu'I-ʹ?l?0???:l9?i^?S( ? ??????Cגd?I???@?F???? ?Y?????u?K???S????G???ϿpKDZ??'O?%a?1??Ō?N ?Fr ++4ݜy'<~x?Y?i_긱w????k??&??~@7?p???H??^T,?T??↳dڮ??x?πd????i?D?0 IX.¬?R?c o?GBp?_?68-N?z/?15?emōZ?4?c??U?%??Q????1m3?7??????.#?W?]?S?_??|1j?*?x?:?c?[QYU?I?x?a??????~$??eT??Q!0{??T0?'N??IϮ?[?????lI`3??<'??p5?i??3,?q?l;????*>%??eF ?? ?✭f???VQ??cK!Wř? 5nP??M??????1?3X2NL5r(??:?l??[??}???ٔG???)9oh?J?H}?K2#?O ?Q?HJ???6W4͌?a?^??3?q?S??a?>?W???>??????mDw??Y??5W????z`:kX_?9??1t?~w?ݏ???}??|??寰{2W?O????W??????µ%?? ????Yp??s<:????>?t?jH?'? ;y??:Ҷ ?C?D!?)Ck3?&?MԔR?'??&?3?h??9?. ++? >U7%?e???>??? ++#?f?9i?hCC7M???Y??x?????u?Jdrq ++y;gc?? c???$ ??x?Ɲ??^????_?_?_????LXKю?̳eM)??!??kOQ?n_E ?Q?vg?????ړVpͶ+#k/FEe?*??B?CkJ?6V?A"?W?W??͡h?????Ugt?GH?X)?P????l??L?QT??????S?=X?"Ƕ.?R??xu?? d?? S;)??0?b?^9??w_?[??/??I?????o???????_????[$?x?1 ++?2?uH,xg?\??&'??$\;?g?ZP??m;?7????q??iIq?^???? ??L??4Z?J?l?k??4??M??[_b??~??t??>y??x??\?r?|H?k;2~?c}??T88???O????ؙ??z?"x??;o??aB?,?Χ????ZÕ@???????>???3????7ؙ?,/W??_]?????1??u?5D?\?/عq?ru?d~? ?0,??;G3&?8???s?w??nj1 m?db?ǂ-?d$xaW̎?,VW?v<{?s1ɸ`?Y;?$k???pm???z?@|Cgˌ0d?{M??H1c'??? ++b??PR"?$E?%,?c??DŽ5???@B$E??kZE?)?^7?i?=Hz(??fׅGV??m???%?????n??69?7+?\-i?????4???ES??D?il?kf??????|??h?b w???o??M'??????hMHi_?v??pX?,@?MM??N?ǰ?ՙm-??Cd?Z2?R)"E??????r+?i?????g??\???h???E5)?1?????f ?t???"???`?Q]?M:?l??????5V???mIH??w?`?p??????9?5 ҶdI???b???q?Tg5?`???????JT9S? ++?Z;??̐P??O?˦?*????`??0??u ?F?db& Ĥ5??dѺ??I ?3n???q??O0????JQ-??9?@?????GPa??9.7KrqX?j??? ?7֑?j??o??8 ?]?x??7h?{??5??? ?V?LY+4DH?@?v?q}?z,???k3????c????Q8?y?????.?ο??ӈI?vJVl?3??&;?N??? ?gN???$KMe? -غ???F?s?FJʺ`ON?s?B\??q???v?!?b???(?? O?? MQ??)??e?g??h|KȰ.k??5??@3?D??3??rXbw,??`6«_y?8J]???M?j ??????'?N????/R?>@kR???D?6??[?c????_x?ݮau?>???#Gw^`ňu?l?d?^H??}6?별?s?ճP6???&??T?????q? F{?ɂ]ln?nZ?Oe??z5?0???11?& ?? jJȩ@?0?4??)?L`?'ډeu??Xڠ"??K?$???I?44?x?X???h ++?? ?ج?nʓG???? ???;?????m`???PL?y%?Ś" [????dJv?|l 1f?z?k??1??? ??? ?5.G?&R??@?*??P?I88?c???l,???IC??y??;i?1??;??i??1??t?bFb?? ??s??,0? a6?O,I ??5??+|Ӫ!??L?e?k???aֱ????#?lJ? b?`?vڒ?f?e??݄?? Xg??U$/?5B?Y?I?,?}??vP ++?8е?????|??????????Ҩ?dE???hr?>????Rڦ???H2?j?HB?}K?4?(?*?ݻY??"??Z!?e??T?d ??ɑ????\]??N#>?G???&o????u?NN?`??.? ?D?S&SQتu ++?b?????,?????WL?h0#??{?J?+??8?CV?? ++ +??I?[߱[??-?*?f???j?u??ʨ??uj?G1?j??b?SaU1??َ??J92???? ++???T U????\M?t???ePq? q?H?tiNJ\.ּ?????;?ύt?i????ǟ?׏?4??o?ǫ_cX+b????ːFM???CW???8C?&u??.?R?E;??qM*?I??y?r?ˁ1'??}?]V?=??-?nX?#?xŸ?d1?G??o??_?/??????7?ܟ????O???~??G??9:??.xf>~?cvOf??%^???CǣO?Sa?????d????9O?9>??X?u?YS?]?q?>%?HG?8?\,.9??"?}?"????T?O??H????N?nԘ??_?G?z?????^lh'?Bb:???"??1?4X?b??⹺???1?ߡd?tR?6?:מ??? :l?=S+IJMW[?/?u??PE????]C??ᐢ???}??񘚎?M?F?Y??«??????:?????????7~?ס?L?%? ??_?k???/?W???? ??J?W!ə1?X?o??P????&\?^qyyI???0E?L?????4A?;??s???}~???>X?O?~\?ڎf?(?EMn??o??|?M??W?y?_??????60V??vbi???{pY?????jO??@?N?$ $"?I?????! ??c?? ?l,?{?????B?g\???'???Atak? n?u??jB0??r֩#??hw??Kp(H/?j?Lw??0 ?j?V񵀷?uY?|?f?Ra&?󤸄ͅq?~???8EM[Hudz?i[?h?,?k?U?"őnv?????1?{??rv?d??p???a?b?6 }?????w?:?ά???~?aH??=)?w|y?ӏ+??3?????{L?X?.?=?c?6l?k???L?a???b?-/??2;?!o|??d?(??)??? IDAT1f???ާ????-??}Hw??O?.?mau???.?#y??Z??قU???? ̺!???S??Xf?9?m?WgO/x?3/?pBp ?)?????S]?&8?v?G?srm?a??L'3H?????????#?%??Ƞ?[E֤R0YQ?68boi nFVYq??$?0еS?̧???DS?ڝ]?{1:v??????㟼???8OB?? ++m??}??? ++???`uS??s??̿???q9_??7??+??%o??^z?&??%??`?????_???0?????????5$+?@????l????e}?I?I??}MI?R!U?@7??B?1?? ?U??)a[??K.V? [T$0?(?W??"??w ?3?W#?%s?Ճ??ق?ojmД9?oBh??-?)?zGN?L??Lk??;??5?c?ـH]&Y??Vĕ??W?6?Q0&??.???)???K?ME?iJ?B?;??fsy??F???y???]C~?9??@????'P}*x' ?#˘#x?O0??4?S"W??{?????y?? ?>}?|F?v??`p?hO?;?2?G,??{?? ++-?i??q?.`??U?@???RBb?"????6????v?#???մ?????(???O??!x?vC?X??(???N????%???M?p?Vlg#4?W?Z 0????jz4??ʌ?? ?>l K?dP??WDVݫ?Ԇ~A?9OJI祺??N?&?.?"P;??Zma???=?]?&>???%?? ++?ɦ??ꡑ???VE?R???C???U?v?Vq?h??Z?Kd/????T2?I???vni??????+??????,.??v??[???Z?~`\??Œ???ְ? ????z???'Xs???5?^}????& kX??Tc ++?l????E:?n?;?=ϕc?HM_kwh?<0?i:?#??s?ݒk?kM????Zߑ?ȐYibOb$F??Z??G>8֛%??eu?F٦?^Ϝ36?:?????B???a?9?"2`?? ?? e?9?j?·?`???q?sk???????P ?idvp???3?v?? ]??u?qHLw?Lm??]P#?3??? ++4ũ?!?????lCU?ݚ?D?2zO???j?΂????NZ?xD??Y??+v?????GoT??֖U?|:B?ϣhM?????9?8?v??r???f??̧,=?O??_???O8????~??ᒽaJT?t~£Ǐif7y??`?c??w?? 7xr?>;'_f/gb?doJ#I?2?? ++??BRT???J?ɂ? ?-^?Vh?QX??[??tF58c?>?W ?b?w??Y?=˰l??bj?y??M?Ig ??(??y?)??%??vnqv?H?????s}.~~~}~}~?ԯ)?%dM???ut??!??H??(?jQ*]? ʬ7?8?e?X?^0????jj????/A????2?D?C????/ܹŝ[o0?7? ?l?|??O???)??qD?əO>??Λ?04=???,?=]?|????R1???Z??}???#^??? ++??_ ?2ӝ??1%???8?랃`Ϋ?Y"m?p΀?$????b?K??i;e?7?ӴlI?~??0o??qE?xgk?N?9?????3?q?|'p??5LR?Q???.(???"?f,? ??????f?=?4bKSg??}V?3{??t??bo??(P????(b.??ڤ?????q???d5lA?U???\?F??(-??u(?u?n,?J????К?@???l?B?????)?????????ڿ????????8}?3?vx??? ?k?L6???ϲ^?)???wqaJd? ?d?3$IU?.??-?`???#n?ʣ?WȘ??(6?r,R?K???? ????#???????????~?"&&~?? .7?8Z?????~`??4]= G????!?o)&\?gL?Y???ݚ59!ɰ?#????7#?c???? ++??h ?|?㈝RV??b Yp?5_????5z??N2??_;7 3i??[u??Ɠ??+??op?)?9LΊ?szXp???!eCh?"?v?Jh???? c ??q??z?&?[?z???ڌ??}??b9????Y?%?u??[{??s??sVf?Yd?8??ȖD?DQ??z0`? ?o~? ??~4?`_ ?m?e?!?aH?-Ac?E?3?5WeUf?p?3D???>??0XbF@??r??Ɖ?{??HO???zK??}z?_~?nߺ??GOx????s??xʽ???x????`????Ǒ?-Z?????/?? o????7?2'褢-?b???}?C??x??-?ܾ˃G[J='??WBׁS\U&9?x???-?{<|???ԕu? ?0?sm??? D)?.???39;???L??i?%?˝Ѥ?#??:Y??.[7??^}#??E???GR8Zw??^e.81еjA=UO??\V?g???9. ?ĞP??&Ni????v?|?k/????Ժ sm??.&?~fE?UVwU2?k??{?K?q??iG??%?⃝??!%???y? ?/$[?ܥ0?????N{޻A?Z?=?Uj]?4??????X???? ?N?vֳ?????M??????2o?P?? J????j?$vn˳i$???Q &?#??["?SK5???͡#??:S????p?ґFG??.Fk?L?A?Dt{v???\b?a? j?T???j??pU(?5^U?^??b"4$??qvN? ?s???Z_??S??????*?< K4?Z? Kl?u?j%h?k???LM`??Ǿ?TB?jd7?aIT-?][?????&??k??g??ߥ???>w,W?^U?h?V?a:?????p??ꤹM?״??;M??>?<[?H??)MT?P9??]????g3_??????_e???{?{6Z [?fP?R??>:??\?s?2^???g?G??/x??e?R??-￷b|6r??-??s???E???u?????s?9??O?aZ?s??/~?s???C??:?L?L9GN?,??r?u??,a?*R ;r?᪥$??)?E????? !f???? ?/?Ӛ?>?zw?3噡_2? q?1? Z?#?*?dх?Ч?y?xߵä7Oj??/%???9D"B"?J???Z??V????L9Y???}??????h?ϏV?{???I:r??? ?ӑ????/?k?i!?G\?v?7?x???y??)??}f1uѓ'+4͠????9H?2_???.?8???#?n?x0Ux??Ԣ??V??\0?G????7?x?????Һ?oۖ?k?dX.??=)̈́`*#???ٮ֜?vO? ++^??D??S?e??k?????M????????:oϻj??J?j?*i. ?!???$? ++?ɑ???5O?f??ṣ??C??-:???????W??~?w??.e?\??G??? ϽJ?6?1??ko??@Xz??+? ??߿O??\???:?{?????@?T:B??rY??? ك&6㖴???o?5???5?G??r? ++gO?•x?????!,73Q?m?Z?{???Ā?!??Q -2?9??mq??.?F"?d?s?>???W?/8}?FCby?{?=???n??X?SJeڌ8Ma? ?Ǧ?io?3?ucD??Į7g?? ??? ?8??8J? ??????`@,?_"????ۿ????~Eg?E???jsV??????B???????|?&????(?????O? ??????'??=?k?? ++w^x??v???i;Q|?g~?~9???G??W?FRV?????⪂?\??g??1???0?Ug?Z녬?N?G????Z."??3?`?Wg??s???A??Ρe????Flq?(N?"??p?m?1?e?@?p??T??3-by???=s?&ةF?>#v?(?o?c???9???G?;}? 0N??6h?_?Ν?G,???DΙ?)<|???y??H?V?ؔ???{|?d?d???S?x?C????g?r?????Ç?w????????]??bk{?Д&bjε??EGɦj?8????E??6??B!???J X??U?)??DO?????sk????E???@lK??m???????;? t1"N?e?????R?R?q???p"?Dob?֏ ?'?)ψZ?X????sF;1???tb???1??)???9??`]?m???,????K??rU??? j#:mf?-UK??Z?????????p?Q??x?!? >?[I/?]?ߝCψEs&.??X???=#x??؛sJ\0"?Y???{?CMt??lY.`9\gu?Hl?)P?2M???H/????@?4??A?Z?s??cl?l?@,????'V?9?XF?NP?O'???/θ????g?v??2???a-?Ehs?h ?"h???f?d? ????d??B??:;? w??k?kR?r???!N?IEx???x???????%???<b?W/?i??u??S??~??H??Wo]?R??k?h?ǵYI??B?? ?s4????????g'?TG??e??gВU????jIIg>?????^ç??vF???I?q????? ++?%??\? ^?λtn???z?n???;?;???????%???v???}Tw{??-??_ ++?L|fi ?Kd??]???-6?۶?E????Smi~?>c?wd&??5??\;a?i?TMl*??Kꔩ?f,??y???Mbh? ++[n\????u??!?v]??R???j??)mX?r3?#{{{??fN??????;???????]??? IDAT??>?????HϽ?????# ??H????!????o??_?????K??????? ?'̕Ք|????e?n??iOv KG??q5!??i+.?gU??? ??Y?qG?;??u????Q\??,?:AXڊ%/֜??D??&.???v{?ǂƜ ?`v???R????\?\?\??kq8????T ++y^q?̜+Ӷ??zJ?EIs?ئ??&?????e:???'{???I?L?7?? ++s?`??SJ$?S??u?])?^}?Gg???:?n)x???g?whr??E?????s?t??F?,N?X??E?9?U??^*?J6??gk#Ū9?B?;?K?`??n? ????a?????uXrtұ?ذ?'?iD???,? ?ԛn?F۰??????\s???#N??w?i?m?OM??? ??T?B+f?AJ?E?V?8W?ِ??uR??v?eC??h?????0ŭ?????*??]a<ށ?U??M:?:؜_?6?C$J????;o?Õ?%Z???>?G?????3_?Y>?8?K?|?"? ?`??!O~*3?O^?Q$?!? ???????s?Y'?9?b;B,?? ++?d?7?5U?1?皲܈???r?????-a"OJ?G?ٜ,????P?t+???l0#٭˯?~???7y2?5G?D W?(8?8?s???>{̲?~ ?3)???b53?#?lbS-+u+L@?-g???r??7?Y o??o????|?s??g???]~????o?d?????hy ???¡M?t) ++1?C??SM?m?jR?????'P(??Q??%?;m???ݮ????>Q??vl?-)??7??3??/???}֮?w?:?!מ??Xe΄γ\.()|?x?xv????{ Z??. ?9[?pN?~?F8?r??p?;????^?>p~62?3?s?-?58O?gjٚK?z!O????ވf???X???UBt=cl?L?] ++??蘛hĞg W?ԯb n?|?m??Y?j????+ВN??p3??,ܭzM(V?;d4??k??F?V;7?  ?f?抏j???]???:?????jk?ń?oiׅ &?o???a`?>Î?7z??ŵ?߸b+???Jm?rm??&???k6?XԞ?K?s?N???i?j?Wl?n?D?_DZWg??E?\??1e????m??Th? ??v?%???d7?W????}_֤EG? E? Ss4C".z?? ++?W??~?s???}?yfwo?zƹ??????'?#?????9N???????o??EL??ٗ?[???_??G?m????Ov???a?o???+wy??3??+D*W??ωE?q?!:Δ????@W?Cn?IuPZ???D*?]3t?8$????l??G?I??P?ԒqҌ:?e\Dp2Sk{Q?gH&)5a?1???????Ns????[?V?P!q?a=*ݠ????Ӗ?wz}B~~r}r}r?ԯ2?#???*U#?b???3f?akD??NJ ?҅??']?r?[?~??8??  n?\r?? ҵ?$ kb??~f??cJ#IR@\??n0Ȃ???????C??ٵ?7?i???KBE?X'?>??{?ү?????O????5?y?˟~???~??爋H? ??1?@????й@%?:*W?????? ȴC? ??d ++Ħr??b??6?Ak?9?p??9D?E?qvv?q???`?g???u^??ك??Ֆ???;f??v?*?????}??)?ՈG???????߲X8??w?cq??y??{{?p,?#%CΙ2'?.???eRniD? ?3?F.?8?3_??????:?4??K???b???:nE %Ӣsí??? Y[?bm?U#?PT?v?V????3?d^??`??M?^??E[????:6???ΉR;?Wb?j?(R?? ?? ?L'??-j? ??(8?cG???QuQ+?z1wK ?jh??R???? !?&??`?Tf??)EΑԄ??C[?m???@?ã?|p?=?NP7?ů|???}?m?????u?9?tzd2?9???,?|.?@?㘪?q??{??? 5?????N@]%????n??? ???l?????|??U>}??ٲlZd?N?`?La??&z?7ꔜ?=k ?V??V?R)T?ȳ?>?é oRcG?(ٷwj-?9WR9y??+?????????H,?/???R??[???_??p?x??I9s?^?F?z????UwȻ??1/??x?WOٌ8?u ??n0?Hjb??gIJ~Ik _w`{??} x H?SC???̎? ++???4#A???Z@??????_?3??M??h??xr??@?;?z?oN?9????????'?pI ̹"?:O-??t}?f?????|?Eh?W(?_??CĢrw?]?D7) 1ڬ???????Kw?X??J4r?̸?#a????O???{???????H?sHK[r? q?;v?J{?-%?:?K?\?Rqjq?4??制?'???(?9+???2???;???t?ɓG|??~??^?S-??i?/?????&??ށvw??߼??????ȬHM-??uE ++?#~1P?S??n-’q?J&??T0+?y????ɵ}N ???s?ܰ?^?1O?iV?c???)?l./3M?lO*?R???u b??&tu&dU!bg83!??k?[?\G?t?گѳ?? r????@?͖?W'??-???'?[>|?C??|?9?F?[B????l?ޜ???g?+??s???y??W??Fy??w9{p??/px|“??ņ?X? ???R^q??-??gX??_??3??ݷ?~뀧???7???iB?'? ???j?J?+,??:w9_u?yf?CU? ??$???L??Q5?)?Z]hg?B m??J????%?-=ˌI?E#^)8??, H%Yg?Cp???pQ\v։?f???qnIqg㌟????????????UO#?a!?F??*?9gbt?????ɣDp"7(R?+'KJ?pu?n??锔??O?&?2XFa?L{ φ???Ŗ?әE??2r????OUPz??ޫ???Q@V?bY???g ??3~??"z??۵?]??fߧ?@?xי??{$??\Z?????H?S9?"?ߘ?QzJ??=u ?I??io3]U ++??:=|???q;qph?"??{????C00?9q??d6??`?c?8}?2??SjN'?\y?xE??? B?sZ???E????h?_͕???X*??J셒l8s???b?REճX??W?J?? B? ?(e2??œV|? _????Pe???',?p?????yx?!??$U??ج?G??Lvp?&???o})???_"?. ???C#|4?ţ>?????U ++U?ΛjS????_?d^-L?½Wn??Ȱx?+?n????wu?+͑??R?(?ВM?d*??`???(e???EK?g??\?{?'?Z$3?f+?W?>&xG ?T2uR????<:`???1_?ye???0????????Ãۈ??????? ?@m??Bݲ8??v?eqp??????D?qK?=?ef?X#?? *"?R*?;VŢ???????t???/j??>"?????Ǒ???T?V??JU??10?5dp?k?{??5????C?)e???V???l$v???EX???? ?%W??X'?ue??>?a???? n??[G?????g?ަ2?3??D?Ŵ?"yɅ???s???֑?\?x?T??CN7k?\???dE?ڇ??Z?g???Y t?9+GWO????YN]s?E???8"Q???x????72?%?:p6%Bg???f{N ?b$?J7?Sיu????p??p??????????5??2??j?t??;?L???En㗔?2?72?D?w??):????p??? ++?????????W;??N??\9:޷?6??{?e#???????s}HW? ++?B?8 ++_??/???c??????\??=O?f? ?,??Ӏ??D?? h??(? ???L????u?, ?7+??#? ?B X??? ??H?J?Ff???! ?R?) v?:???o?EE??S?\?q?p???GO?ҹP??nQ?????'[;???M??o(g??.X?Μ?ι~cɋw??x???9Gs??\x????R(E?r1"G!?LmuO*??{怽?d????????}~?????????܋???}??????>??(??yn?????3_.?4????N|(-!S??C$ ?\?????l(Q?[?#+?B'?8ʮ?H???? ?;??ZL??4??q;??6??R'.4 ?Z??)???AՁ.?y????--??0??Q??Y??K????\H???h"?bD?}????j?d'b??Z^e?q????????f9??E?u?$?S??x??_????WKiNu???R(??H??]?"??:???5?q(???#(i畒 ++5;s9??~C+>T??1???? S?|?D?i?<&?xb &?+?z?r?nS? ?}??{??űx:0? ?*?w????p?? ??????8 -C?"???Ѻ?8?q??;??$]?Q: Q??]??5'k?Fp???bQ???.??^???1??ko???,?ޜs???????RHOϑ?$vBn??}??P `??EIj?l6?.??????ϳ}??-??96?5?9???:?e$??9W99^D?>9?݇glOg>?>????5X?K6s?s???X=*&.5R?2???P??W???rIF(??d+,(??C?}?>X?9?K[s??.عK0@???ώ??`Ϥ9?C IDATS ?*?W߻?x??nE?5)??$z?v?9(???͞?z??Z?Q?,́??q?dKQ??E?!?+?@?tZ???hU??TH1q?sl?ļ???G?,m-??:O?v??????e;Gj???L???wr?M?Ѱ??s?I?є?Z ++?a???o?dpNHUqQ???7~?zr?Y8 ++??К?/:????????h?????Ӆ?X??|?Q????x>?xIJ?q?c??3????y????x??7){??? ????[8J2K*k???? ++?Z?????D?Q?V?Q?%?iE⎲kQ?ѣ۳??œ??8?.i1?!?گřhO??/j??T%*.T?֛=??? ?3!???0S>?Z?D?????Žn??RO???7w}N~~~}~}~}??|V?xҨ\_>??՗???4??#!?\ ++?O??;q|???x??W???;???_F??5??HZ!a?]2???=q?Y̖̞?ms????sN??????v ??zV?s??Z ?????81h???M?(3x??1?s‡@?JXt?????]?t?{*F??t??EO?"???صaϘ??8>aL? ?v?u3ҰF??;?,???S?f?J?{+?N?;???Ugj???a?EsHQ?A?",?^`Y??ݺ0_.H$S?gpZq???T?7 W? ??R?Ĺ?j%zA%3??{???X?????Z }?񙊪?܀D??A????3# ++?BP?(??)?_Z?#W???_x?1m y??xa!?-???>5W۠????Y????????Ff?X?pq\n?\=??js????N?&B???g??????????o?t?HXk? ++?[????)??-?????U????wH??_옱D?D?=??'?B? C??|?nW?~o?Ue?/???]Ut0??o?cT ???LM?J??;H?1%*?x?Z?SW ?l?f?qͼdYaF`T?z #m.??k??J-???)?Eb"???8??X??? g?U???!j??7?Y|s??9)cf? ++t݌????V??$g[??@&?9g?:{?j????-Fֹ??Ҷ?Z H 1???ԩd??&*?yj???9?W/?s&??{??aHt]h?l?;?oQ?A?,??H4 ??????ƌ????@?????[!(???y?5?9?K?ȵ??D{W?Y0?kN%??R?M???!QC??=?uu?0_?lֻ&^̄YG?]????Cn.De_NVG?? ??|?XӇ?]Ak&??ݗ?????!c?tل Z+?????]g?dŞ?\??s??/?^?<5?&?hkl?(?I?XK??%????p????^????|k#??, ??m7ܻu?k/??|??{m ???Z?F ++Ff]???????????+?????6e?V???:`X?sBjsB ?o?W#+?X/?s??{? ^gB'??b???? ?*'FҶ???ݮ???6K'????_???w_A?d.HR??{/???%?????b?Cal??j7،zz ;?%Qٳ??b3i?&NZ?zn?|?????^q?I??????ʸ߲?z???I?q?bv??"??U?TK??&TG?KJ?3?L=. ++R??\ ++]T??؞?:T:r???뫂?V?>??????_?ϭ?)?????@(;??yʭ?/????'??t???祗o??w~??'??t?|?}??_?pq??9?=BE)??/?q_?????&?Ξ?n?_??O?v?E:?WŊoD|?ھ Kԥ??'*??I?!?F?4?c3Д?qyK???N??N??>g*"?޿???%?8?/??7?????s????????3??????W*?^X.O9???ﱾ?Lu???.?Qf???? ++݊'?????42???MƩC?0?3?????VG??????F?B?,^ ??\n?,??"?8C??l?`??<_?P?G?%?'O?݈?????+/?Gu$???>q|?B??B&fw}????1gy?gL#Z+)? ?/?p؟ 檠Y???? ???r??? ?ċ??&?? ?Qt???'|???q?ޛ|???Y??Jx??!?7?}?ˁ??=g?:??+o???ܐ???=5??`??nq???MPO?t??=76G????PF?p"??;e?\????????(x)?#S??w?J????(C?#??/??h?&????f猠 ++?"ǂ?????ŭ?X?~?'?je?-hY??q?g3֛Ī????c?'?ؑP\q?C?3n??]?Z???,????+q?/bB??l_p???C????? ++?矘?y;?Q????H???O??hJxvmd?R:S?'Piq}*H1?D?6???fm`es1?j?[???v?Q*?:f??W?????5?????+?^????@?v?????k?G??OX?Y?-?$o????:?q?_??o?9Z*ON#????3??????P???y4??4?-v??Hn????k???ԥxs?*To c??b????~WA?j$??? ??qb???????w-?R,???=?Δ??/=??s??g?Q?sd2?ٍ?\?)?k!?J???4?牬??>qu5??p????:>?{????????6~\???|?7??_??_?G?????o?b?{????3^??3?M?d?"?uRisR7`rj?P?+%Mn (???涃;?p?|s?4??6???6uY?*? ++? S?????@?ཹk??Bk?x??'ӛ?' ?/E??h.?`y?W??{??????g???~?????!???@{?{4????Oս\i`?3 U*?,?V?f4?#?&?(? ?ZG|?(?w?j? ?=??Ǣ?\???-?????? [+iT?{uA:???,G{?K[??ܿ?h?F?7WL3R?* c6ўVj1?? ?J??Ì:9*tZf??J?J?Ej????İ+ ?J?I?&??o??6??U?:?EϢ[???G??3?gL??? n?|?nx????TNn?Z??/?W'\??S" ???Y?X.?\\]?J??*??c5p??Q???X35??]?E?6?????%iȬ5?џ}???9??s_???r?x=??2H :?iSg,sMW#?Z=??4??Wɵ#???_?|dH?ŋg??ܰ?8?W8Y?? ++uċE?U\*???d`k???c?X*??cL?2&??c?!6W&Ap????ϱ:VN???O??[|??_!?v????z??ź?4C@??T?"??N??jB?ֻ׼6?Y?X? ++??N3??͉SA?Rպ6????5Z?m?&$5? ??)?l?W,NWTW?"&?  ??R?F?$?)?u?_̌?!,5fj.?T?F|?????rR?S`?gy????h?Ҙ?n??ɍO??&0?Ufs뀛/#ԑ??\?z;>?ߥ ++?c?[??Þ.1??T???4Ò???ļ?C?$(?*i_~?ӏz?i?k??'[^y?ŃH?h?3Hs\Js ++???7????'????3???Gn??jѥL?V??q?U????e??????YF?z??٢?E+?H??Ԃ???ĻeGݬaq?j! ,?s?l?;3>|?1a?sy?e?/|??SVG=??:|]m"????????[a_??+n^'??) ??&?Ov???????#??Db&ՎFzaJ"Q1A???աj?G???=n"???V?E??0??????wd??E??{ ++?????? Nf=??|??;|?[???*??ADn9?_ ++4q?9ጄ??w?a΁???7"???*??:???? ?a????7???x@?uȐ?&?Ƒ???[???2?B??:XRJ?,????0?svqɦ?2_???pa??%C?2?N?SS??????٢o?a??\?9?s???ut?-?( ++)??|?Ų? ??c?ޑGג?lO?d$sJ??fU??^??q??7????ϡjb6?'i޹?2k٨??4ܬ՞?Zltֶ???????W ?f??c?`3?6A? 9???S?&԰HS??z???>? ++ '&?s??8T?????)??P??8?6?{?3^t?:??=\?u??Ohs9?$?-?X???@???91xR???j?e?V{??~?'o_?nm????c?|?閟8]?D#Q/????L?W?'????3??????)???kyҘq3OW?1??BPߔ??[?P)?b??? ++?[?m?;?Rj?LSEKfH0?k????)M??Y?Ę-?]??ɹ??)g?yGɊ????'E`E?hU)??\?[?Z,?6є??4??K??Z+??m???S?p[zڰ??r1???(9??$?;???I}@Sf?:?\??р???9e?)?W~??W??e?`?O??X/? J]3?!8???я J??O ????jJ8???M#-r ?C??(??=??mN?Ң~&?`[??-\_?????q????????sf7nAr?!?M?0?5O>?f??d?W???l???~乣@?=UG????|S\??j??jN_???Sk??H@js?5@?A1??9???G?TJ?\\^3????)g7osO???q?pu~ŘG? ?f ??PZrB??gC?z???????c^z?#?s?||????p??S?|????? E????_???8;]1[-x??[ ????j6X??!򹑎.???6?C??˷{Q?#??oT????;?h?L;?k??1?:δ??5"?F ++???E~}?????}ѻ?Sw?H=#h E??+$? :??l???Bb vs?Y!фT?\.?????]??'ZG'z?Kmn??]/m???CJĢ?UnTM?Ah}W?L?Df??Us9?K=??%?X?*??~_???65??6?䲳??{sӆ??dN(??y!C2?ٛˢ?"s????ŃXd|?&x?61?????1???.s?𞇄?G7_?\A l?? Vv##]??^[WZ??4d??n??s??)???Xo?????;G\\? ++ވע?}5P?E?­I-ږ?S!?L/]ǝێ?=???'l???*g????W?⪲??g?3;/9? ?%?Ti???$՟@?W?{J-???pt:???]B虅?`?w~???o,??{(B???????? 0]x?????? '7nq筗8;]0Ԅ???????|??#Nn??9vaĕH??g[???L=????Yԭʳ?[??PJ??d????XD?:E:?D~h??=$??y'/?Q?S?62?u. Z???p??.?~?n,h??? ++j??&2?-U?=: ++?l?r??Y?`$?յ???b?Zt??׬_3?١_?{?ȣ?3r????[??|?c??2??D.????ZU?wm~o?V?9??c??>?,??op"\_^qt??j1p?Nܘ\?y?????^?LK2hN?Yׄ/9g|p?D5??"?[?&n????4a,29?P#0?>??UO4k6?/?# [x???Z??b?bsX[5?SAh{?3??"8T ?? ??3???%?7??C?}w??ʖ???/?Y{??؀?և*????s??????%?h????s???f?,??5???? ?Ն?ˣ?nϠ???Y\v%X?/?j???y?????"?<??N?&?QT??+jq?4?????G?b??j??=??s??@??K????w>"????[c??H???Dmt?>Fm????h???6k:QZ??u??Q????I????O^5?;?C1Ռ?**e??͑JðTh???.???\5AC?t8`$?_??8`??բV4ApF?W??D ?z???*j?>??ߙ???Rs;T-??V]a?B#?ՙ??Ȇ???6{?k??_Tq??c?n>%x?6D??T?<??F?p???????g?5?0"?~Nk?*H??oZ ++ʄ\??9Ԗ?g??!F? m??>{5?ի}'??ķ߯?y?d#C???\?"?R[?Wsw?????k?V?3? ??N?g??3??%7??a??h$?P)?#??s?m ?抔2>` I2r? +>x?C\????d?n?? '???}>|???x?r]?????G?:9EN???7?"/????ņ͢íN???????????bCp?.v???%/??H?y??{?w~????Bi}ς??GZܴ:Ë=?lg??w?ѣ??S,@?}??????????????'%-\???fP?GO)vPͶ??Z????'????Kf?#?c??[m?=j?G???6?⃳?*g૏Xw'=) ? h1y2??VP??\%:?H!?}??HO??yR??A?';??Oд?:?a?n;??u?Ѱb??)??G?Y?D΀Em?j"???8?ܺķ?`?????)?Qߢ?,????[?g2@?+%*???????(3??=?k?:b???-B)頚l?:U.hp??:?\??b???ܟ??3??n?? oG?*?=s8? ??? ?ȅ??k??G??]b???[????M??ق?vKQ?͓R???j???~'????p?aT??W?&n?9??jd?BM?]??nT??Sί????(?? f????z????K???6?$????????5??%қ??B?????/?????%W? ??^?_?Z?dE? ++?????w.??)?db?TW??H??Y??@ ?M-?[?S晴P??sG?x?2t? ++>+y?l???8??Up#d????`??L???g?H?\R4W?!???Bt??G?R) ??uD?Ų?T??py?/?uF?@?n?ٌ?q?{??a?ɍ???3????o?`??d?70Y}?a???)??¢9j&?^ V?????b?iUЌIxhf%+??y???hJ????Mn???????ßl????op??㗿?K?????CRO??_?;??u|????s?p?Y_)c???x?}%v ????{O?J???s??є????j9Cs1p?G??*8 ???M????4???0L????!z??DJ??[?\?̗78==??{?͸?Z???c?|??????GB??Dxj?8?v=0h?(??????n??.????@\??+??^??]???}?\?????Sf???$Ğ??_???Z? ??^UL? R??A?E-Y?is2i[;[wc?؞???Q???bs?qd?YG????w=Z??V?f ??~j?&?? ++1⽉???"??y-?$Ɲ9W-b?p=#????HӖ1???SzR???&h?]?^\???5ś ??&?t??????b`?1Ts?jk?q?Z?7X??m??d?? &<׷???Ԁ`????????O??^?x ?j??9?[E??S??D????6?/??;???Z?? ??S|j.?4?<5U??u>z??#Qk-?@#?[??f?bi'??q.F+??c??xɔ?)?- ++?[2? ??~!??l$??|n??X?;?T{t[؎;K?6m?ӓvʋ/?L?;??1???'W??yǗ??????O>a}u?jv?SO"q??b?â??鮭??g:j?Xp1X?J.&???".?g?&?,???2?R? ?-,?n?< ??W?p???18??.?o?&???;??(5?ۅ ????Дb x?xɊ?LIs??1Q??:n?^Q??5???ud[*?z$E^?Y?P???T?]G?q??Z ?????G?;?Jb~r??????VG(?????w?z??qG/???eԋՀ$?gS-?ȉo?REs???%)?"??7? ?P???&???%!>X/?ZT??Ƃq?&????C??zܚs?:?jѱ|?:????<8?4X?e?U4?;?BO??@VК?}0?ɠ?F??X?&?P?8 ?????,qpވ?? ^???=?????<_-bX?3? ?u"X?t6??~?"?* ++"?a???;o׉???,kn?X?<:f??ฃ???H?Z??????-?D ++?&?|*n??̴_6???H?z?d??Ԯ?uCM??G[???uNͱ6???dg??GjI?????z??[?Ĺ7̥61_???Y?5??H????(?}#)??x?NL?a????\B9?AN ?? # Ğg?63za??????_cw?. ++??w?n?????$?H??x#????x??g????????????????g?ټr 9?A?M?d߀?P?X?§?ONi.@??T?z[ ??*?[??j!?Fܠ?:?5?=i=??g????@?>???;L3?͙?%\؞?¥L????D?Y??dt????rǕQ?6?"?ۻ9łK#??OXŔ???1 -??Yb????TD?9??n?;X?&Q????}??GN? ?????aߟ?Ӝ=?????M??T?%8Mg????H?#?????H`???LȐi?U ;??:f???fwpL?v?9???>?aLbACJ?gj??w??}k??NϢ??j?$?P?"??H??muj 84????AL0$?????ڄD?JgkS#k??Ć?΋?A"?*???*??z???(.̈ݜ?|?ۼ??}4x??8:???OhH??=???+i?????????o~???s??֫??׿Σ?/xr?e?)???!~??0?б4`tF??B?T???>??Ѐ????uJI;???P?7&????E?Jt???-??y?I!????J#?2?j?J???3??i????Z???-RF;h?LV'?i???QD???"???Td(I ++??7v?Ӱ???O??`?^?|?T????kQy/?qo?R)e\o$[??S?g?a??޹Ŭ뙩????Hf?????f$4?Lsxo? ???"?c&?P)8RS??:?W??1???k ?m`o?ks3g?Oh*?)??x?z#?4K#???b??,37?X K}`?~??Mio(??l???,R}K??@Z???5R??e???ڻ!?rj?e?S|?9?}??< ++?j??EQ?TMl??IZ??K+?̙????????yBs?<:?B]??{"?lq?s???\=^????&?;䎀$>|?c?9n?fl??l????G??˛Wͭ$ ????˕ůË???(???1}׳٬???r???????j????s?B*? >?8???E???ܴ?H???,???J3?؂??,a}#Նv??m??޺g??тC??(?jզTG?b ; ++{?? ?7wE???? ?0r???*??Z#e?L???D?3??0fb??8f3?'=EBA?k??C??\?H??>??f????5? ??"#c????????*?????????o??X?ֱ?]?X?鿉?s??l???6E0?V?????q??3?c???????/??Φ??????5???̯??/????w,?7?ٯ?"1.?^??_??}ǘZ?N?ȡRG??K??? Z?l??zw?2\?9?_2?;ۃ?G????[<v?2? ?)g\+?"۬??z?|n{\{?Ӱ??'W?/x???ܻ{???7?????????&???3_?y??Ƌ?Fx????????X??ɝ??{? )??7W?6`ĕY??????ns?G?mnk?.uд???!e?6a????Y??D?W?:*D"???"? ˞???g,??*%?3?ys]88?i?6? ??.??5bu??T?Ô??{Z'??b??j???E?J#: ???b*r??4Ti??]??@ζ???"'0?{??H2Hi}W??\?FPJ??m?e?L? Bcb@W?aV?B ?Eܺ???% ???B??k?B???4Zj?$a?^1@W?;????ڪj????o?miR?j??x?\???Zϩ=?&??]$HA?q?}'???????d1?z?'???O?U"??>W???;?r2????|???#???}Jx??S??? ++??_??[l???}?;̎Ϙ???F"Hɸm?h?A?JN?(?D"?k??\? 4?V?Nѿ ++u???q?3???{??˲????????;??????3)J$%??-S r? ??$H???? ??%p?G0ȉ?8?,?RhY?`??A?????CUW?o?????^+k??+?cX}@??V?o8??????]???6?c??˒?v?6?(?w?x?|C?V6????o???kPF? ++S. }???y??? &bĉ-?j???N??T'J???`^[ҭ???q????y??GK?Hi?+?.hR??q?j 2>x?]߳88??)jldls?Fm??`????????z????H????9A:Н{???'??l"????"s|?4??ZM??????N?? ++????P??K????@??"՝db?Ep?N?w[#???????F(P?T?????o}I.?m3????.?VA?O9Z5???X?C d*I+D?N???o?l?)Z?????ȄYh3K??z??)Yh?,???'ܽ??[????gh???? ??o?$3??v?D'??bۓK"M?f?z}?.9-E???d?F??o ?w?ҧ?[??R???!$???豢&?*m?:'?T?;@?kp????2G?[?d?룁?y3HslN???Ad?????Pꈕ3$F?????9u???? ?6?`?I+???/^FL??7_??????}?????pvzδ???&NV?t?????#??8??=eFE?(Ri$YL?ܻ????+?-?e?e????/?????????.ș? ?U90'????s??9??|3j?O? ++?zq?L>?׌?\F?:??l?tn??q??LH?9???????Br?uhB??yk??D-?.??TZE???}????#????㓭??>+̕ ?1?????}????h???к?=nx~&? D??+ԫV?&?xT??X?-E?+w?y?>?0ϗ?QA?h3?x/?%1??14a???#M??\?MH??????l??????/???E????XK????ϵm??0i??L? ??????)??jq?D?,?C5??*UA?L??^T;?~E????z!??E ++?}?????"5??????????^}????X+?~?.??}8??;?ˇ??;??r??z?=?????g? 5U*]?&?U ? ++R)?pp5R?9??????K?(??S'? (]D?-]?I??:R ++??M??-?3i?LFc??4?w???s???qp+6V?~p??Ż???ɳ???ji?a$y??[?țAn?q)?7Q+? CIA?ۊYjm??~0?Z?b?+?s΄ݩY?M??ȹ??چ?0??r?f?Aʦ?U??A ????$w?F??1 ?ݖ????h?e?ϕ? ?؎F??4Yz?k0?1???&?[?|`?XȒZa9t?자?@bZ?Ŗ??-??j???x??'????ʚq{??r???n IDAT?Ŧrp?&???[?1ew??yx??ŖժgW??:???m?Ɛ?????x?????!y?x???Y? ??pw?f??_??ιY1???+?3ZW ++????Qz??v8Ii?dX4w?VW??xA????|??????5O ?????s??g2ǂ ????9yx????Dsك????7??I?j???W??a????Զ?9?l??յֽB]???????/???I?F???gE)??5??2?aAVC??LY??'`???>?ǰ?W?kB??&$EҪC?2????J-yD軞??ۑ????V???>%n??c???????????W???????[\?>ͯ~???۝?:?V?L[,??ow??[:?T???\0?F.>$HG?FR\ ?c?^????cRL??????E?ʖ??3b @G???tC`??B?Ĉʎ?.2mN?3^??x??3B??yJ? ++u??je???v?s??ט?????>?D????'锧?ТT?GJ0G7: @ԁ?"?5?h ?3??֊???+??u??SA?@J=?ZI???j?-?\?=R"j??Œ?w??b?͉p??1ۋ?T+?!r??,???=???p{??????삓???????^??/?a?????N ++??+N*?T?+H?? ++?????*?p???+v?????|E?.`]O ++??Զ??????`????? ??Z  ???~?W?y?g?x?>???9???z"?`??c?k??Y?fpX???7?F@???-?-88HH ??8ab?????\? ?????YQ&?@ɂh?[??8f???cZ K??Z???K??/`.? ++x??b?"?#??s???Z???E??s???E?????h?MB$yd??1?^??Ͽ?1?8h??D?`Y?HC$?s]????z?4?0C?m??v?7??V?%?5!?|? j?h???1?c?.??]?tB?-?,[?IK?\??n??cq??9?ϊ?φ??!?97D???c?z?&??;??I???yœ4lɨ?n?ia?=??C??9?.??b#????9??p??????e??T?????tJ?? ??^* /?1????%v??a?61Qb?˗?i??c?????s~:????y??w??+ן?ɛ????}??ן@o?y????ǟ??[??t?????)???+,GO?*?ԛ?c??F?'Ùh?}AH!Rs??nTQ H????T???.??$B;O???\??c? ς???T?16?M?Zְb2Z???$l?D??D???ڢt?;ɵV??aYH?O??O?O?O??^A:?i?X?'?PIM?H} 눕?P(wɈ?X???? uB\y߁Za?z?l???i?aL?SiN?@ x??j?ZF?G$x4E?05W???KIt~??bt?S?@?E멄v??0??:???&&?$?(????????? w?j?,#?;U%?3?I?*eڠ5x?=W-s?H? ? ???s???o/I?????$?~??Mq??e???g? 2q?(Hb΋?ݥ?2ѣ?ܤ??`Z???*?!?h?87?????/GH????FfT ++??ܿw??|??9??1?[??ٜ?\%?w][?/??C?????2UHuE,:1???N?U H??.?k?b?\0惣Z?]?+ށi&Lh?mi???-:6*?g??U{?)6????sϽ????\?s????_?.??????}?eǕ?7y??:o??+??!ǹ??{??p}̃??k7?Ա?w?[?{?4????5?t????؊諾????Ԕ?d??%$qa??s?e&??A??`?ґw?4D?QM??l6n޾Ƶ?Wx??w`X?ԉ?<s? ?3?\I?'???j? ??Z ++????S\/?8?Ā5`?E?j#?TI?Ҝ{;hD~?? ??.?؀?w?/?mz?Fh?Tm?]?8?N?????$?3??ܕ????s?????ku2MC{????,=??LQ?)^?*?!$T"?z?H)??YL?Ɖ?Է???;?T?|ȟo!R?:?еC?Nz??}?0?9????=????[:?/?GkQ?3a)NH?N?Ù????`ì??@?-v?溚]?f????v??ʟ??????K-`mT?!0????5P??????SB?[7?@Av??h??]?S?HJ????L+%NF????DH?RC$Dc?9G???vo???lX?????wp9??촄????@?]k??Ht0P????*??|??SG)$k??d?H7?حx???K??????=?4????/x??U?ۿ?_󕫿?W?? \L?U;?p50????r%???'_?????s?ң??@:?; ???J??5?n?B??? H?顿B ++?ۘx?v\t??#?EFF?؞_??R?-]Z0?+??3????1f?E????-????x???g8X %??+???w?? /}??}?k?x???[???[??op?????6} ++????%x?UP???xЇ?E?=6?(F掠?*1޳? gh?+??ܹ?_???>?Ó?3??? U u?$?C?^?Đ|}????훼??v??RO?e??ht??Ζ???????b?֊YǍ??<w???#g/)L K?c؝Q?.?F?}?)t?i?Z3K?q?n?0???u?????c??X(_?? ???.l?v????????(?L?攐 b???G"? ??G'?ZG??Y??????(???.?y?m?? ++??i?{3?(:? ?0;?G?+?f??>?v??m" ??.?K_?$??s?N?Y?m szDp?w??????Y???ll??'?m??r5.?/?Y ??-???@ ??\?-?%?C662=??!ԑZG?g'???i,:B8 ???n??u?R????y??-T??'r?H-??_??1?????????1??D ++~O????????M~&ʱ?V?????"d??J]0??.?r??C??? ???c???x???/~틼?9e??cl8??1??c??d????w?5~?_`7n?N9???K,?7>x??????s???? n??????ޖ?}?;??i???qt ?b!o???F2?c?[???1:??)??? X4?D"^?a58?X ?Zf?;'̂c ?V????`ĶІ???ֳ?_ܰ?43???T?*?U?lt?Z )t??,??|??????c???????????_g???8ч??ɚ???]?е?ч?h?@???I?B^?LŬ-?js0???? B?WJ?mSS?6 ++Og???nҀ??ج??M?!?Z3?;:??Fռ????????32???Yu2??ȣ67Rh?dS?U??(??????s?K???Y?ex?q???F2?pboV??Qhs*??)LPW ?U?v??(??^?EK?as/????rsi?zsԆc_R??Eϱ"mx??????ϧ>????;?0u?Ϫ+"c????.? t???P?nt?Q??G?m?5s?(???,40[ij`?5?=$Q.A?2y??4?? ++N@??????????Z???/iđ???is?j#?/??G??[=?Q????`)??;?B?dtCO???/???4?u?M?t.?hqU??A]1G?}kqO-n??|pt?\u&??!Z=xԁ????~?Fn?t?$??H??????N?*n?????????? Ș??? ++"?? l? 48?`e??:?Hy?3??z??Zdf?mMnk??},?i?N?[?bK3hQ臁@dѹ?ؿUG'?JX?hQ???s???i?ia?o?????2u-???g??0?>-9?ʥ??֙2?? j?r??.?r???? ++u?`wq???R????lӢPj?? ????s??W?JͲ-?:kmf?#??Eu~??Wg?o,W,??Y?B D?I]􄀐\?T+?K?Gm&"}?H}@?Y0?M???B?D?>?????ih??@?i????'??;b?6;յN??=?6]??iFUٓ?f?]f?n+??`Xr??U^|??aa??DՀ?J????n??#?u?x?pK?n???V???? ??ڨ??¢#?FzJ@,??_ ++?|6???s?b[=????х?\?3h?h?????;d?*? ++ %?V,-5???d fk۬ ++i???)_P&?*???9?E\??+??`?aՐԁ? Kjk??}G??QƂE???????A?c??:Z~ ?]e<???+B?'5'?̄???3f?5?? ???8:?k?????j??\i?B???EG?)?E(?P?A?u??'[??4q??CȻBL?׾????/~?[???????y??'???끇?p??cl/2?|???뙿???e3?nx????!??D???[n=; ?5?{?Yjb???͗??y?.????? ?z:?????Ԉbd???B?6]C}F?F?????wvӚ81?@ ++m R?[?J???~????W ?{?8???/?9?U????????~???{U? ?e?Eߑ02???? ++:?皳c?1@=~4???????????????_}????lM/-R?]j??ċ??RQ?{?LcQ$(EwDYa?"̇???.??? U??? *"w?~?O??ٞ+?_a?J???a?f|p?$#?~|??~?????c?k6wm?I?W?A %?h"?(??߻`[$Y#????T?8??j??J?2"=U!4W,?L??C?GyD"DE??p?;???ȋ/>?{O l??e?q???iܴHM?V?}?<|?-?+???+t?|??~?????Mn_????9?Lx??[?????d,?????(0?B?#l?]???mC?eb?L?>DY?|?D??N5?F? >UJ0????9??:5E???t????{ VHRۺє?~?pG???w#????Œ????????{????o?? ?????QN?e?\?č|??_??v???njc??"h(?D?@ B?;JVR???f?n??T*).}V?B.??? Sc'%?rt?:_??_?H?aM?.??ޝ;?????~?يp??-GG?%q??l?????f??y?悴.ľO{L,FA)?C"O?Z&%?uF? ++rݠ???DH+j?|?I??+??G׶^(???ÄV??P4?]?f?" 'rm?V?]l?????u?WH???O>?O?!v$9?^[??>?? ++?Z?ص?x㱮?pʹ??b????.?(m3??????%???'!HGH.?L!q??u.6[?F??.0???gY! #???@8;?[?%? ?b?A??~?%??-?~M.??S*???8֨d?6#???=(??q??!?=??/?Ή????????Y?????gX?Y/ Z?}o?H#?'???X???&??S??}x8?|??1??H߻x5??;K???z#3?O??????j??0G???K? ?????+?8}????(?Xu;????X??´?T?$QH?]@?Pw 0?M??ܸ,6????4?P?rqvFHBH?ܾvЀ???E&_?qZ*׎V,??-?w(*ͩ>???Q ?;?? ?)D????>jИ0???a?? f???Pܴ@????F?????Yh?!A??-??H)?ka;M???PJ?????uw?O?N?UX?\??b1'nk Ԉ ??#4*?P???:?s??%???r??X[???%?(]?Xm)ք?)???M? ?ZdXs?WD????F???#1%?p??r&??????o,?9s??m????Wo?-?5?}???#?ϋcg;&K?o?cu`S.?n? ?%????#)?Sq???`) JޱX???ĺ???:??1,LQܹl=? ?,h\??H+?pE[ ??g,[r?MH8????F?E???S?T?j`?1%b a?Ȥ~?b?{.v;,V?..?]$ ?ej?[?dA????{?8?A??????Z???;??pU?S?Z 3?%?(X?LEIK???:S?Ⱥ_qjX?y???x??9?{??_x????$/?I??:?W~???1?e L?>??]??c??Y?L????@/Vs:? ??`???~?u>z??xrM?????!?????? ^??$???~?`?(\??Xt=5Ol???ye?cGenr1pt?l&?.?\????ZmV???3.???}T?a??Id?~\?N0?,rqa???E???q???ц=ޕK??e)a[??ds??%?Jd L?at??Z8ꗾW?S6?G`???ο?c?!??? ?u??=???:?%t;2n?~pH???D???gB#{g1??~kd?_?R?=????g??B???w?? +?;um?=0?'????R?bV?s??xxN??-i@a???9??j???M4??\????vƵGΡ??{??`??jCSe~_d&I?؞:?u?{?]??/6?n]8?L?v?圳?????? ??rp?wϹ?[0?F ????????ε?W??`;f?? S>zx??ʂ???G??k??????{?3?)|?[????`???^????????????????|??]?Г??~?gx?O_#-W??8???? ?(ĺh???@ ++~??,?**???5(,??6?ph@Y?w3E?d?8?%?6??zW)V?n?=?&V.???KeڄZ?U?S??.???s?%??<$g??? ? ??????_|v??>???g??WC?O??s5V??@l??5͝????m?,???]???F???'ʳ?ֹ?v? H???:?o?.~??4?;q?s?e~v?΀`# ???Ğdm???%?7?e??fR???? Ĭ`?G ]?g??@?#"mF???T?h?Gh.RU#DkNa?Y???:I??????u?$]???gA???H?]?rIĔ???}??͑z?]?t????{?ݩ"s/???\8??=QkY\?+?????s ???V??J????>oe-?*?K?R??@3&?????j???:q??גn?h?Z*Sl??W??x??H?n?t?11??+{v???l?? óԋ?X?jasR??9?w??ʊ?Or?c????7???U>???Y???{?6???T+]??D??i?U?c?xwu?+h?u="?}?c!-=??,?>8$????R?y̥8Q?????QC??X? 7"?{?k??????¦?Lc?J`?trKZ??V٧}??(?7?`{@7??תJ?????0)~??6????? ???'^????WӊIw?wR? ?? ???????;v????c??`?&m??{??$??eW???\4[???(D??.M@?E???xJ??a??mb??? L????JF??c;w?b~?w??`???Ͳ??m???W'?]#<%y?S?PƊ?)2n3?ՀP?????MLP??L?|A??????R???? ++??kQ89-???$מ?????N???Q[p??Xt??g?*?x?e?X/?2V???}?:???F=7?,??7?4?????? ]M?vݍ??m2??????Đ?hĮ???R?>???;?????A?Y5,?RH? ++*??p?Qs%D!????6(8?c???h??:?Z!?,??5.?kζ????ѱ???#?QO ?~>R?ELllj?tf?b`? ?,`???yOʶ??;w??????? ??|???v?!???{?F???a?C?͞?p????9??cJ}ؐY?j?n??????b?@Vc?????{??Zs????ΊbZ?픮?瞻B?*o~xʴ{???/+?-?? ^??~?Gñ ?BaK$P?/P?H?}5 ?? ????$??SՊ?3w3̼?V͠??+1[?E*Q?u w`?kKH??D??J?-?䋑{&۶^C?0?c???j?En?Ϸ?d???aB????.W?A/zL?x-?׬0R5?n? ++lA<*ӽ?????D??J$Kt,WlQ?M?e??T?'&yH?!.˱d?VdE?)J2#Q?@ @?w:????????s?zJ?%????~?.?'{??Z3???????SӖ????~?k\~?#???????)????lӎ???#W????࢑?w[l??҈3?]??>?@?wTo?'N??r???r1????$ծn???eb'8oJ???ʡ9??f13?%UMm?c??P&??o?+??[ө3(?8?,?H|?m? ?2V??3>x?r???M?9? ”6D?C?R???v?Z 7?#ͲM?l9N?O?K??8?? ++?V?8cꕙ?ր?*???V+???.i?f#(׊?????fWEZv?<̳??ZD?????޽?j??p??z? ++?ǁR??9??4?FS???J???O.?z?o?CN???K~???X-#'??E??\?P?i?7͚c>W????3Ѓ??Yi????۠?+B=d0?W?Tj??hZN?M-?ˆ??>K???!??MY?1????????????osu^???7ނ/???.,H?r~y???7??w??_??l`L[?i??_?????w???????۷qE???????-o?}???Ϩ???B????+??0;@?O??T?????6i6x^ ++?T?5?ɚ?*??l?P jY]?r????Pb?lK?????ڞk???-?J?#J?I&޺M????I????f{?%uf???쳵8s??>??lk????К?? V X??@Ɋf?uv???Э???6k????5?>_?5g{!+&it/???_????S;?ֶ??o?Bb۠S?5??q?*??: ???Z[Ƙ????????wh[??m?^?)???g~C?"R? ++{f'??ֶ?|???Z#-??4r??Y^\???N?xRU??m+r????9?=?~?]?JVSK?Y???2??Y?\k??? `?Ím{p??ֈ???3g?֗??Z !??}?gyD?P? ???K?\ۣ\??ՆY?@ ???ȴ?9??"fٮ??;????X?U?KpM??#?ӊ?3M??.?Hh/?aO???D???{|?????O~???W? ?"?~?#>?????/??\?0?3+]?ۿ? Ӟ??????N?&????H? ܷ?Yl?j?ˆ{Q#????????y???j??bJ?bPHN?B?;?m9nJ?Dm˼暛KA??"?6??w???#??2??m?)????~?????R? ++5??[Tr*?yB?? ?[?6?Dۛ?Mu??bv`2??hS??؉???K?ໞ?ǫ?@v6??}?;?~?Y?9?????-?`?^?s???ǟ>?Bᑄ????؈5?31]?(JM????0???{ X?rI~~?͛ n?????K????[M?G_??/Pk?ᓟ??g????V????w?^???R?Y?7~?|?͒??????Qw?nw?????'?Y???????޲:E?Tr۟??zT?j???Z??&T???>?rL ????m??4??3K\???HJ3?1?+ ͖??ع???%~i3?n?"?}??Fv.???m?Uw#??e?7?\\ ,W??Ԧ?S5W???????Tp*HRH#?????Z+????[u?i$?BI?N&?J?FdYw?? ????؝'??+?=?~??1????7~?m:?x?q?3N?)???l$???ֲQut=y????-Vf???.?K".VFH'? ++F???}?;%?#R:????5?*9ڵ?q?f???[????Csê?n(??W?[??2!??=8?????V?)?}b???????v?Tv?o}?&??????+??3?K?x?u~??????d?y??;???\2׶پ?/׀?8f????????kS?p?5Q?????ch??i??????t?Α[? X?Hfեz??????????ԗp|g?.?"???F}?+f?s?w???6ǒ֛ۇ??;?95箐(NL????Wİ!????B???? ~???)?o?rq?gʎi?On IDAT?Uv50?~?1>Z?s?????⻄?q??Мy??wyr?f}g?/???fw??M????)????ç?؃t?\Y\????j??_8?b?????΍??????|B\????d?_i??ȁ$??? mVnDs??V??bnq?@??3?o??T?M??j???-R??.??Ju???r??68 d ++C????8Ee? /??ouwq??vA???[????}?????xu?:>??gi?P9l?H5?Y,@?????????y?U??s ???ߖ ꜣh&4a.(???l ++?Q?6K?j???d ++?bVZ ???*??#xa?M???,}h?E??j?9?J?B?RSF\$O?cI?}lCoz,?Д?Um?jj ++??Ul`# ?(?6(?ҧ?\???a?bU?y?\?2[? rA?I? qV? ?{???sbj a?rC?2MX7?֜o>?\+DE??? ??5)s?6?F?@+)?z|?}?>?s?=z?Z???%i|?0 t]??5 M Gn???b??P3<{?1???~??n?K??폸/X.???>#?, 2e??H6???B?}?- ++N2 ?2? ?9oՊjmC?R???xj????+2?@???R?n*??8g??p?"T{~+x??46??'Oί>勯?ƭ??\\V?io?K???Đ?sz|L͞?????O?[ew?p9????LXD\I?Q?o+?????? {??? ??X????????6đV?k?h?^ "e*?67gP6?.?[:?f&a{??:?0??Qk??z?w??v?04?s?????l??ܸ?4?H?{? ?/?w(????l5?VB??a???.?????" 뵂Sm??,'vnf???w?W??8???`ԵAcM?k[???? Z[æ??F[Ϝ??}>fu?)??Ej?+p?4?mk?b 6d/????#??w{??c?ʵu?ߴ?????5?އ??θhS_O?|??Jy~w??!30y??c?>?6??2?{????U????O?????3f??'??V@J??l???|Ӯ?m?????p/??kd??0+?T[~s?UkSwA?z ?P?? h???l?/???=J?}C??C?4???Qp???8?%?=MZ??X1e? ?i?? ???_?^QC?5B?U \%TG?B?? ?ֶ? ????@???G;n??΍#???-?(?h?R? R? v??Ү?RJ1`5??6?1??E4n}?{6????J?~?_??:d~?Y?H#??Am?4[?k???K?cL?R@?Q????8E|?m?S?sh??"^??ŷ?M-??)W? b9?9?6H3?N?)?Ü%??HFR???0M????w?=1vą0M?T!t???D)??-7?P?S&?T j?B??`/[??C?b.-! ++O?FǙ?BF??H??7pI P???Ӫت剚?;bdܛ?d?;?J+???F????jQ?;?&p%??f??x???6?;?uE?彨y?(s?????&m????@????@???R ++ӘH%??????x????)>?a?VO???'|I?Ɯ? ?2? ?=c?Q??x?s??{?-ʾPJj?? ?Yc ++u?J?[,??jZ????l2Ǩ?S???1\???DX????t?????????䃟??????;????0?'E???lm;??FLɞ???>??B????S?x?7"?1ċ????P^??u?T3Z?????0J?U?V1R????M"?5?0?k?Z??Õ??1???Kǟ????#Ӗך?zϰpa???H???(U???M?:K?1^Hby???W??v?c?????Z<%j5+??S?7????? ˀ?(?????&?E?u??Ym ,KR??i?0??T??T=]p6?????????Sc ?X??,?prly??QǺ????G??? ??????55?4???jǔ?}&'?)>?{??D͂gBb? ?ţRY.?p?=?GT* ?????N????$?JB|! ?W? H??3?OP{?x*?Z??Ci?u??k?q`????7?????E8(??F?6b?)F}?? 'wOIy?????o?f? 1?????[??u??AA7?g*sW?? ???e???\?|*Qq????????d??}?_9e??????`y?NW?4?/ ?4??d@????iAkO???????S?L???GGDɥcO??????Gz?؞?????q?#]f????͉?G?8?~?4\? ++???? i?aAߛ?@ e?B?,za?@.??H??|?8?QO?? 4???́?Y|5ž4???ff?rb$???j??J?,??#'?????V?F???ϱU????7??8?پ?з????A??????x?k??Kb?Q???7a???~X??S???h?m?I+?V??D??x??I?3۞?8?ֹ?Y???9?rFi? ڔ??ئ?3qey|?????`???lǾVn?{?g?|F/7VG?????Š[7o???c6zp????@????A?? ++οL W?bY?I?&?!????K?T?n?? ++?? ?*??I]UJȐ??&+?ԡ?Y8{??Ϭ%?s??????X??/??l??r???^;;?zm???m?s?5?p??&????????"|㛿F'??dѥ;b?q?.????[z?[?~ZC=??L {T#T c͗??Ex㭛|??O?Eq.???.???^%-&? B?? W?~Iu?s????R89Y?ɓ+ːYe?k??????ѱ??O?\hE?P???Ԅ:g_?w?? ??????\fR??Pc?g}????Bu??nm)?_R????Y??{憹??,?汯Ƥ5`??Q<???9s??m?b?b=???X|??? ??|??zܺÇ̳??????_????G???12P?s??l????????M?jO.???|??~?7?????#V.??{nnN???Cyqu?t?%?D?@m????O?sJ??8R???]0u? ???f????Ǥ5?U ++?gf??#? ]?Pz??V???~?.????E?A???????V?? ??َKf??.)?ʬCg???/?{sf?Kd?v?e????aQ?QK8???A9[?{???E TU?jm1&??mħ?_R??ڦ6??M?fU?)U??_?iHKօt?k?c`RѮ??? ++.?wU ++T%???k??`?nղ?m?Rcxg;??????g??ɓ????ͱ@I?L????[??2? 3'????fo??4??? ??$?ܬ?fW?Vgˊ*%?5:?{N?????\̖????р?F&Xnzv??[yk?6kDS??f5n ++??\*B???n%?*rNvD???PD???{j)?Z-j?IDa?{|??bC?>? ++y?&??Mw^?????:?d????#5??h??Ҏ?? ?`Y?Euh??x?? ?u\}??j????S???M??~?j9?:? ed????7?N????ᇈ˾????? y(??򸘍?酸rTT?r?FT.?u??oZLeYk5???^?{?q?j?R?7? ?,|Oɕq7P??O[??? ???݀??? ++??}??gO??/y?s????RŲqS>?????e٦b?L{?d??Z??m@?\3??+8WH(Wg????7???{???O?0\????ɱGz\׃%?$N*?$??Y/P9??8??!?????殓)??BF?h???#% ??֤* ?i??-? ?e7\W???n??זŭb?;O?O]S?4? ?|v?x?Z??Pͦb?YMWJGрwʐ??\2?"?????"??5???"??#???n??)? BvB!}???:??????ܸ?$] >.`???89\??޸E????'|?ko????E὿?)_??/0??????4?-?!g??1???ggg?8Yi?i%?J?i$?4 ???R?S?????^?9H[??S?ņ?/o"?`DD/?h$?????G???=??.xp?.?.?O9Gt???2???T?s?ݢ?Vs ?:?R͜tʻ??}?.?????[?,Gp ??})??̪uG??[?D??YI?@??Y??z?.@ۏ??0Y.pN?~AҊ?F?n??3?MOҀ?Dpal$Ie?(?(?eҞ???F?q?*[????(A[????4T#_?dD??!2?/?E+?x??SaJ????6T?? >v? ++I'?????-???^?٨6'$?@-?????\?x??zS?S?̕a=?H??????6/?v(j?????)J?j9?|????Ј+v?:׽???zA?M?n#4?J?ũ?F?#OVs^??*???????z?b??f?w??????^??ױ=???_I???7`?6?j??Uf?溢N??~???A?p?}????"6??^?HTw?ع?a!?p?? }???~? |?;?gt=?4?/??s??銓???3?qy???z\?;۳??y?? ݺ?f?ܺ{???s??ɏ?}?9?n?????I???????x???'o?ş?ѷ?y|????j!g[??~v PD+???T1+?J?,O???#J蔴7_??N???Ю????u??=??dO׹Co?hs?R҄?t??;?L*dN??V?{?72??jzY?? q?q????\????W????????̏I?tDʾ?m?Nl??nf]?ġE??)?Tm?b?}??R?N?cU?)??FăwfM?6?%i??خ\??]?mK??Z΁?2????m?ƚ ?4|?y???6?lIA?l????zP'jԪ??̋?1ʣ?3??Y c?m??ڬ ++?ԛ???o?D?^f5?!ϡ????Hy?Mz?^L?\??p??U??B?Qefy?k????T?lw#:\????8Z,?;???????l/&???f???Z??_w??뚚 ??DFY?zj.?? ??h??b??z??č?[??g?^Y?t?ơ??NL??L???1Q`?V_\?YY??*?? ?q??#Zg/???w?ew~?~p(??9?0]^ ?"?t??.??l??ͣc>9{a) Α?????ep???!??W?44?????^? k$*???z?8?P 7OVW?֟|?=|????_????l??????????????? ?B?o??L?3;??"X?[Ѧ?r???y????:?|ל??? j1P?B-??_&{??r?q x???.(^?8????????o??bꜚfe?d?H???H??~?wn?MV?׿?U?????:9?? W ?ķƴ?ܐbP?kj?Z??wE?4MDV????`??e???v;Ptk??.??apL????E?l}I???hJg֧?,?k?!??@X?C??4?w?:,ɴ?y:?s]q?FRS????fh?ksShy8?h4??1kf?0????g?6??M?ڞi?9)fKT????o?!5Du??{?????恲?`? "??j*?f???U?D???&5?N?oN??-q??=p?\??>????p???B????_?E~???>_?w?w?]?????.Sʂo???C???rų?Ox?t??+_}???&/^?=??Gp??4P?b?k????o????l t~??6?t??em?r@?55PǻY)-????*?Z??=]????7?_???r? ?eo??Vo?4??\??F??6?h/???m]?fi$ / ??u?bV??r???????}??Um???R}??\!8? ++?5??o?- ?/[aα?YU?`??????o5?{!?l???dB?jᮩ?]4???\ϵ?2E?? 2/??@2???])L | ???? ^?|衈??B?p8?2?kƕ yt?jV?“R2p??j?s?7??v??8|?(??+x?????f?+???V3????z???? k??.XFxu???v???x?bp??ZL o??ʰM??kħ??D????Rb??\?????%??????ͺW???أ???????v7???.w???^1?vŲs??l/?-U??x????F)ZHY ???1?cgOFGV?5?/?\ ??????פ???|ɫ3aQ n????->????ma??rtgí?\=?????x?;??[?? sn?C??heytBΉGO??urp???8X'??,o*w҆<^???rm???t]???)??+??ht*1?U?:Ξ?s?>B?) ޸?:5W??? C??E?d}?9?H?.?@?) E?2???p?Et4??ԉ?P??ֿF?iŲ?4?>??*??????????????b%HO?+?X?????n??w??1??j???N???޽O?*??č????D#?>$?q؟M?B?0g??O싲qjj`͌9?e"?"??0?DѳY??????-.wTq?h?J@;f#6?5 ?? ??w8f??L??8Z??aZ?fP?H???Z1?}%x????W=??cB?D??*H?U?r?H ΀#q????g@*??]d?8????? qð?My?P???djE(5"???M5[??w+>}tfs??88,t??N??O???,F??-???*?\?x???3?sr?:r??ϟ?cB_??.X?'N??O?_!?c???l????pzs??O??D:??%T%?ՁX7c???} IDAT??,?]?%#??T?:?Z?F???V?Y?W??؀?9?? +???M1g>??? ?@???ܛ?? ]?O??>'CQ?k??T??%^;?ݖ??J????E??țQ"??#n?7|+%6/????_?z?S.????VBWXԑttĺ[p|??? ?*???[t??Ψ?????????w??E?????r{yd?? ++?ϯ?ٳ:??,??[?f?2???L??~?l$_???a?t4???Oa2Н?? ?8_?%???֥Z?+`/?y#&v}????'?\*E'??!?"?}".??3;?6W??րx???l???f+媰>??c??????ɝ[?t?f8?l?ʝ{?p?5??w~???Yy|?hI{?L?nG???sx?? ++?+?t-??~??0?4?q?t?I???3S??H??=y??㳋??9?G?:A|???????N??W?\Bd????? ??6???D??q???=????5???o?e?^??O??uğ???\>?~??? .~?1o}?5?=z???_????r??e??NX?\?m? ???=U?AM!?@???????????? ??K??G?'ܾ{??E#U??Pԣ?1.???9?=o???b;zH?%K????6%??]Y??R-?7?H.?$??M?Xm??p?? ???sU ?n$??b*֪?ແ??l?BZ????3??Z??\j?m???zAm?c[??l[??㥝?RL9?'kB|hk]m??k9?-F???T????d?????A?)~??j??a???T/? ++?p]??BP*?p?a?M???OD?b?[??7?H?????7;=?f21%?~L,? yk?Զ?ov?ēed?gb?@Kn??6?,?t????9?TU?Tּ9??[?m?e&??~j??J??P>+q?U?&S?O?B??1|?kz?T?7ڐ~?gbg??U ?-[)xB?7??????@?;6??;?ɵ?QKD?&?7Ҕ???C.?X????hJJ???!?W??l?????c& 5+¢e?V?Gܹ????v ??O? ?]?j????ÞY?PU6?????#?(?? ?-'??T?e!K??/#I??????A?$??s?&1n???sXDV?\%????$S1p?L#?;B?t??k?a#|NI?w?.?Ḻ ?]C??FlP?uj?P?,?L_+??=???LE????"???;&J????d?Y??YN??)ͦN?:T?? ++T??*PFS9?DG*?\*n?$??LSaw?e?????ZZ?????VT?0Kw?8GLB?Q?u??????$0?w??TI????"4{[?U??P&X???8?{GF??ՙr?X??W??9?(5?????w?(A! ?6?????':?b?Q?NX.+?U?\?????{?qd??S?L?z???w?q?,en???????ܼ葮???{?޼E?j???dI???g????GO???-?a"FO=??D?[???Ǥ???S$?U*A??? ??G??O>8??'?+NV?1_qg????-G?y?Q?s_?LC???_??[??????Fv??v?\??wMXa{]:?pV??I??K??s_c??o}??is ?_f???{Km9?????? Mg??[?=????-9[t-?2?P^&5[??/ Uk???F?6???k;?? ????j=??????P?B?$?0d>??%??sr?q???/}A9???c??????Z?Ȍ?磋s?M??+?O??su?gL?99????~????|??'???????O???S?#?s\?-??3?:???t?&O΅?j?'|??Q?ͷN9=y??g???9?????y~?W????|? ??4??~?Sv?????? ?8P??5????H)???%?0??y??4繚B?Q?Qf??_??????6_????g(?4Uda.:?? Vj?k?x?Tg?v?E#oF??t????ċ ??f?ly[?p?>?6?[j??H9_??ͬ??Bs??\#??)J?:Sc9??dnl?V?]+?Z???i??cm?H\1@g?ݰ?? ??ȃ+$}¡??f?$???V$yo5V??Q`;֦??_???K??_???%o?5? ????????'?X??t`g(b??n???}?a?y???sz??l???'????tű?86??7????M???Ǒ*?w??n?C??Yk8!׉1%??q?5?d??{Jݓ? ?k?炮Õ??{+&??l֢?~??c???R?̔????a?M?-9?????!"??o?L 1 ++??????E3?"%????dZi??>??Zi)3?(??Ԓ?T???fwu?????{o???????/K&??Sq??T?|??~??֕?ń?y!hb???#"??G$L? Y"/?/?k?ŗ_9??lo??.V???ٟCP???????????g_????????S?w;???9?Ѵy?g\ q! ?0?|?٧0x,MϪ?Tm~???f ?7?Rʁa???8????0Æ?4?}7??\@?KٳԻ~??zId?Dc?;???~?????2?????7x??K???v5䃨??\_O?GT?kw?Br?y?????[e??8a?????쎴V?? ???K ??R?}Mp??c{??{?V%Fo?&c??;lz ????ɇ???)2$???,i?49f?? X?tƺŪ?ip'??HC?C??:}MaY\?,}?q?l??C??;??5???C7???U\l??Y???I????=.Z??9???z}Z???]??uݎ=R i?D???>Z8 M??o?7?????CH?5?@??¾????xQ?٦?w??)y?YW???x??xW????D?h??j'f?]??*????`KFF??z?w??/???}?i???$f?ۤ;?#MZ? 5q?}5??=? ɮrV???B????W?$???,y H??@J?d??.?ٟ}Λ???i;bR?5????????1??????????O??o?z???????=Q??&?E? :??8??;?bw??5????;????7z?f????0?#??b???Б?v(???{?{??ZwQ+????#??????????????xF:?`-@???SZ9?2H???  ?*??Vq??@S??J^??3V????O9?2?.??@????݁???VO#X?GS?B1?/?;?j?Q֍??N??:??hj?l???)'k?{??j%F??i??N??R՟?y98?kGAScw?c??xBK??y???r?rhXh??j?&M?I?yz?? ???%?~tË?=W???{????e_)-Q?2D ? V? ++?什?Xa???1??~M?!??O[???R,??7\\^x< ?D??????7??f?ͳs4͔ٝ????F&?<զ?pymG????L?ش???%w?k?y??g_??_?5???N?l??̓???nx????IB?[b??.?q7y??G|??3?????}???ϸ?????????-?R2dlMfAi?d@?̴(?ғS|??.X?X???? œXƜ]ȑ???~?pi"?5? ++ ?z?0??.???Y??B??wA????`k]Q?_vC?ڹ????C6? ?ccp??jh?????+??????????/?j:;???j?J?? ?q? ?19??X5? a?z?8|?^??????K????4?}4q8????=_m??᷿?~9P???{>0/???z?Z ?A????y?)????N?z??.ؒ ,???o?y??m?8?h?)D? ++???A?H ++?͕?ݥC?N^??,:???`i$???}???'??6ܼ8"8mȄ9$??????n?s??'??????????w/ys??}Xm"?????)0 ?㑛? ?U,??r>?h?YiX?ÕG *???J{?B????E#??????;?!GB\?Vx???0???R?-???/?؜m???Ǘ??$M?)3M??D?=:?uj????(?\??Γ???z}ƪ6?TONBi;C ?'m?#¥???;N}?z???BHXs?R??c????CT???l:Q??#Gb0viŠPc???? Jì1υR??ف???????|}?r??&=z???Xc?䀥???? +?~ډDX#?M"w?|?V`??k}?@AÃ??ce{_???T7?wW?Ձ#Ő??-??u??]??/????7pr["??Bދ?$y????#+???ԯ??????RQ~???????????5??[??>!?LHC?4'G,?C?7?v?$$'?k"?$}??IO?;1???#d?GnF?*M? \ж???ͽf!tp ++3b????t???S?GҞ ѯM????A?.?s??!?a???/??=????!C?]p???UbF??[O7 ?W_~?'+ p? ???w?rL?'?,в r$?P?^wǚѶ?l??? ?&??t_?[$(??b ?ޚ8[&??????????#o?|??3../8^?əc'264*sY؝E?ya?7jp"8?5??t?q??+2?, ++???v?x ???ϷI)????;??5??/???????,????֓2ل????$?4?R??2{??ZsQ~?I'Ma[??????ӈ?G??hW?? ??b*[ ++!Y ?‚ҲPC`?B ???l?M|? ?N????NJ?.(?.>Cs7???9?g^w]?DS10?????s?=??????????}??F??W???|?ٗ ??=???w?.ys.m??8?C??????σ?c?ʬqp'?Cˆ??:!ܣ?cF?ϑCL??_'??4? ??^GWy???H?"*??? X ??v9P? /_?@J;bICCj???j???{?l?? ?[^??'H?g???{??o`7?r?B?y??/G?=??[^?t????y9??Ǎ??u???l?k(??-???uÀ'[??? ?1ſ@|?v?????9{>C? p???=Wձ??_?^?g?>3?s???w??úG)z???0???=1??\??o ???j?2ei??? ???????????\?'?z92??DFg???O??cW(?????3?/#9r???ڸ?=??z?d???>Ƈ??M??S?}???????D?ȋ?/?|??R???l/v??Ͼ|Ii??f?x??9\0?/y??1??.??x?r??{????%?, i<'-??Xɵ?a8?N!)?m?̲?)8?L2bP???y?\?n???͆?J??4d?#?????b??N)???ak?\??Nm ????%B ?{Pbpgp?*R??qY?:?K?d?]W?"????](5b!?6??1???ϯ?????_?U?-?zVwK@? W? ?;?!=??(?/?>?Z?a|??!??ù?W?N?!???r???>8@Պ?+?km??¸?N^v0???Bz8???c?B????ؔ??}A?gJ?t? ++N?{?ꃥ? ?qq?;??pb???Dd=??S.?X????k/F?XF?o?! ++7 ?????{? ++w??r?wޙx|yh?MԄ?^??xu???j!?v?AR`?`?8????????|???o?w?7?{??????Ϟ???'4???1?BN?????-iP'ǂG?E ?V aϣ??s?? ???2u?vw???3?q?`???~??A?U?0??wJ??6???ew??{ Q??*???޻?>?BEl??y???c?줎Z ++ ???%!?1s?!??Z?Ą??ZA?P??Z!E?A0a???&Q#1??/?`?????~d?z?t? 2?????/??g??A?R?c?????o?>???Ͽ???1?? b???????["??"? _?,v"?9?.NYHy?d?????G??lv?v,@&??\ܩ??Cy????Vr?1ЫR?˘?"?lûf???1'?]?a???+9??X?'s?J???@? ?<^?[?R??A'?r??}??ޭ??Դ??????*(Hp?ه? k??J$?ϻ????҉j%??z?^B'???????ڔ??]?,a@i??????@s????(????u?p????zda???*??.Ґ! ???f?>x?e??} =?????e4??ûх"?0[?Y}]S8??d?Y????> ? ?z?;?]??;?:??m?{b?3E??w???wy??Kw ??:???e?)s⫠??M?@J=ҽ8H?B?n ???_?V'?S???!?X??=???0ߧ?F??g??? Qz?r~??kue???8~??????I? ????"???0??]?-?s?G?粃?Z?? ?F??Y??Ё5??3ҝk??̋????[?m??q??n?i? in??/???ǡ?٧?2m?p??b?J2?NC??? )e?{a ++???E ?|?}?Ҽ?˼gQ ???V????? #nGJ)?`?3???+??n????? ???+??$|?Ԋ??R?b????Z?%?6????>c_???_?`?????Pt???Am@?{??)hk=~=&N(f???~??uG, ?i???ß~ī?¸}ē?`??b?Y??ّ??#1%R{????XC ^????? ?H???Os?p ?S?g[: ??~bow?\_G?l]X?????,?@R???J? 7?.D尺????6c?o0%d֖?c罡5?=??k.??BM;?}Ɨ???;lR&??????Bb;?\?m???<~zq?=ٔ0E?ޝ???W|? ? 磲I[$7?Х\&???A?z????7?:?? cl$M?r??H^ ++???3??ч? ++H?4?h?1I1??=?2>8b????}%?Z??e_/??g??[v???T?_?i?B Nd??Ӭ???`["??-?????c:???֗Á????????݁???׶?xL??*b?gH?G??J?? t3[?jqW?x?A\c??@40"ڬw;.????cZ?(u]????œ?4??}?YU???????g???,??{?=????????B????Q1????O?1?H)±F??Q????/?]m???&1aؗ ?o8?/?????{?{?? 2 9=?Y?l?؍?|???,T~??????o?j??;*o? ??[F1?uH?D6?G?????%???fK??2?9y~??Y??ω#??g?6????P???G????G?K^|qO?2?Q?_I?3??@????|v ?#qYx???M?.?mըR?D1Z]??,X?? 1?=?O??z ++?? ?́*"); ???s?v??3?=PG#! ?T?x????p?9?U???b?ged??@??h"LƬ? ?~?rC?C ++???^`??X4J]C?ÿ?^??s}M~~}}}}}?ү2L?KbK????p???N?H??kF? ++kAN????????s?C???????Z?V??(?J?=?^?Z;??0 Z?`? ++??:?%???ߣ??D???L???p?>???U5????M=?/?.S?*ѾA?xRh?ۆ??F?I'k???.??/@Ǚ?~7s?v7???"?gǛ\L?q???c9 F퇭H???q??DЌ?D-??m???iwE?3,?3b?s?? ?r-u?^#?b?4ˌ??qB?`j???8?>E???D1yx,=?lUm?Ǣ_?]]B)????c?If]ȪXPB\U???Z;?V`|U<;?{䍻?̝.ꋋֆ?]5W??ߍh?1Gӆv`?4cL??????cm?S?#Cc?P?M?C??? 4e:??$??'???|?)???$????4J;C?kנj_w???_????v ???,?h۶v???`???>k?{+ (?? ?y2? ?=?x? ++'?q?a?k`p?n??? ++h?$????K?$??w(?|x?Q?1O$??}?N??J';l]?9???g?L?Wk?"???+!?Z;???^??;?N???d+H??? R?????D=s????(Z?{Q[3??E???{??6????u?0?ٰu??w????K?)?l7???h?+? C?37GN?V!bq?O???΄@Bcc?9??b?Oh????????.??r?????C^?ў7./?????,?Z\?Qt]U?????sz??)N1?8?~????Ϯu?R ++??????D??N????X??}p??Q?? 3???g???b?)){??p ???n`Uǔz?w??fԥw?w?ge?g???m?l????j}??w(???u!?=?z?"5?M?V?@??b낯?) ?R??崫????B3??n??ң?*D?g6ۑ&??$?Ď??????X2t?#V???V?"6??ŀZ???????TfS$fR???q??=ye1????????Qk? ++^??DB?`5?աSk%?EU]E?/???3?*??????H1????h?P?????:/?T?4?of?ݰ?ܜ?!M1%w??b??F j^??Kg'8O,??????ЮsQ?!q?? ??׼?? ???ϕ?턦#a71?q???H????bs?ArEԨR?f轒R"?D???u#)D4T?ݖԟ?? ???=%??0褃4X?BL??4P????,.?w?zuKTw?k0?_~??????jk2N??u`?ŋ=? ?}?9?]?Ky8?????˅g?????6???i????rXXJqa?b$??aH???+k???!???*.??$?gʾt??ԝj??pv???s??*E?_^s}???w?O#O??0|q??ܽi="1?F??R??-??+|SoY? B?O?ŏ?{??W??_??w?d\????? .?R??A??z?}? ++?b??`?j儌???mY??_?????q?KO"CO???5?oz?i???i??9?\p?F.??fb\???,lQ?s?q?I?#ڌ???#k?l?????or??#J?.????/8?pې?E?ş? ?ë[&3?1????5??????"?>V??iS??i??????5??Nbw9???????d5TL?4??4?Ba?6?z? ^?ܭ???A??[EX?K֤d????E????\????F??[???g?Ax?V???.zuLF_??? }5?y?Lp[n븚P??,G?f?x?0? q?=???T?NxY?'R׳V??t?.QJ?uI??g????v??a??t ??Y]?]\? >c=?4%???̀??naY0*???#?ј? ??&??r??ۙvXإ?q??<2M#o?;?l???6{????????~?)~?Ωaڡ????????Ҧώ?????8q>?Y?????✻?????mJ??.??+????=w??Ĩhl??%???ž){??F?U9? vV??/|?????????}???h????/n?1l?n?/R?=?D?U?]???a?? Ǯ?ϠmnH?HR2#?}Cz%+??@?"XE??vRw|?~??(4)???M??????????k^ X]??V??5@+???*?\?;k?@M S???E?D/0??o?????????????/?ڶ???+@c|p?!Įa??5?]]-??5????@L]?8y??????N???a)@?Z͉ ,I???̼#?V?̪??? ???"HWmwgOɫ+g=???[?}f??N?8???;?IFwn ??Ʌ???[)????-tpMR'0??F???5?O? ̉1R?r?+?P6?;߸"?#o?y??FkQ??c???=Qbˮ???H????@6?9?g>???A?????????????~?s>:^3?6Ĕ??ItR??=?+@/??@3?qANN*!b! 6??p?M?i ?~?J??1 ???R?,?e?ݒ???? D &`?4Ll?Y?#䪞?5???lu????=?ڕ{~?uo.q?Cn?{0?Z?,?b?@??M$?? ???]N7?u??V@?;?>?aJ??qC??~?;???3?????9E?? ?IJ?i?"???M+"#L?UCrН???^?,?֜??m4????b?tE?e?U???e-?Dy??w???O???3???????????3?|t???2%?G*/şϔ*1?LL?xUaU??У???tc?o?Np?@?z&a?t}V"?zZ*e]Ϣ?????(?q???-)oi???xt?8?I1c9?E{???!V?A?X??O?a?????|k`t??9Ѕr1v?[W?7?^???R+?? ?0??w ??Ct?AsR}?c?n; ''??>???w}ƭ? ???????ڝ??=??,?@?DðY?)z????*?3m???P?++???XHɣȃ??4?-?G?ip???}D?$ mҷ2_C9?? ++???Ew Y[aE?g;? 1f??͐?iգoWZ??py?y???g?7g?_y?욳?G?8?U?./H???S?]2??12.?2??J???*?I??cen\L;B,+l????|??VO?h=%CB?Ψ?߿)N?MT?'??.U?Cfx??????r?#˲GB?P?'??Ɓ]%?Ĥ}~j?҄?????/>}?<????O???wߢFei3??xE ٟ5/???x o2Y3???Ʉ???~?U?S?hO?@ݍ,Ii(??@??q????q?????????X?;tşU1ePﶔ6Rb#4q?z??R?4'Ej?x?'???2l?͋???Tk IDAT0c?_bRH??l??hesq???L??$????wsv?????l?? ????w?~?????????ֆ˫???>?EO??(?n??? g?3n?|??/ ??????w??r???1??G????㒈?;>?²ߣ?H?Xo9;{?;w?X????RPc{???G3??[8?;#?= ++???+???#?z?)???V?,ʯ}??????͋k?rM?\0?|???\??N?(?1?y???<]??ѩ?.& ??(?? "?G?A?????I>??w?r?E ?l?M?܁,q&?/^|?ݭ???-b?0=9w'???????o?λ,Z ?P?UEYI1?? ?BiN^6-???O?/???Hz?=?S"N???Ś?c?䌞??C??T?????Q?6r?????|?o???X?_???X4`Ô?=R?Ur??۶y?6???G??f?>???4֜??????H???̤,$?i#?XE'5W????N???%~o?????:???4??.????`??bq?'?4?:o@RB"???? ?^PBJ?1#z? ?`??.0$?!???W?GD?eT?%5Z????:?? -??E'S dP?L?۞?Y??ɴ????"??Ns??H??I?.?#???)/?4'N?FHn????ϐ^?ߎ?^??- ++ǥa?G=r? ٞq֌-??5Z Д?9??k֏'d?X?!??1'?L2???????-K?Hq: .Pc[3?"!U]?}, \^\p??Oy???va?L?%#?x???8 #wKes~?f8?H[ ++gO??/9?/?[!b\]>?_??Gl'a:. ???????cXH??h?P?Rf!??㾧?S5?a?T0A?j?A?Kc?g??c7??<$?uB3 Rj~ Y??E[?՞l??1fh??t$??=????????P?kU{??Cc?|3p?u??MC?F}?`??????????????_?rG?;?k?{.??ї???`??P????? 䓂o?'???J?5N{? ???ߴS"ĩGp?\?IMY{qzGf?ò?:??U?tUlk?S,??!?????Dwo?GA??s0?H?aH??&??YG?????5??7???w?C?+?䓏?٧/؎ޅ5????խԉ9?@? ????$?q?(?GQ??] ++?6;???ԁ O? ++???o+?3?[./)d~?ُ?z?[?o?ww`ч???O? ډ???e:r+~?Us???r":?b>`X?Ò?? 8??:n:Ab?0???A?]\?L???#w??z{?k1C???????? ?v̭??H?ȫ?B?k.?S??? ++?#????VP????a?????~x??5???!??y??!ɿ?=?(? ?????;l?a?????$`VO?Qx-?iU??$???b??$???/v}????z?c<?c????1{ ??큀?3;???O ??D?? ??????O(?B ??<??j??"?,???????5?1p(?aL??????k?r???5??3p??v5????????SE?CD?)'u4bD???`̼C'??. #??W ?`u??"?????A??sJ??`?>?????J???B\?SzOn??????SϨc?֮=e?+?І?CQ???g???ޛ5[?]?}???ޙg?SUuU?ܘ?A?HٖL?!?r???+??VP6-Y?E?`  ????5ݺ?9's?k穒???#H<8:???=yv?\??v!Jk???L??b????????ݟ?#??>1w7[t0B?j??bye??o?????a?????Z????I?_??1?z?)]??S?A???@z?Xׂ???G[??C????6??Q`??T?i ++b?O.J?J??9??K??\?wTJ ???7?@)?!%J?=????? ++?a&?a,>?`p8L ?D?????Vs?[wm??cq?? ??V?B??f??"????ӗ?!???A?X? ?]???CJ?8??Ɲ*??Q'?D? ???j?Zu?Qk@̴<??E?? V<%C;)i?\t???jO?99]qs}?N?f?????0??_??????-S??ً ??w?jb?????=>?W_\????????K?_M???c?|?g????O~?)???]6???>????gL?0 aM yٽ?$?8a???V?zu???l??'????g?????sw?q0Oݙo?ʞ???S???cZ????#?͚#a????O?U??㇨ 1??Č?ϛ?%?uI+YlT4U??&N????8?? ?l?????-,? E+P"A+?&?Y?????/8[ ?LWs6???@?A?? 4?)?Pͨ?JJ?g?Z$?y?s@?2wVd?r??ܔ??ֲVSAO?T\xb???R???~???@???VC???L??f9??Q єJ&Jt H?ӳs%?-ח?i????%??/x????y?x?ƶ+R?N?UQ? hd???p?Hi ^J?L? ???6ui?̵- ra?ࢷ??????????ϧ???=?????ϯ???????[?ģ\0XE?!?x/?y??H??m??c? h??+??_?꤉??t?"?.$ }6????f???.?Bz$?B?8?ᱴ?/?J=z/?????T?xgM?L׮???N?&Xs??X!Hq??J'?T?Kf?G׮????נ??kwT????mᵠ~??a??????5s??QY??W?k?h|?\??Q>-bdL??bzW??z?P֛3^=?& ]!?K?!P??j_?Һ??p?Q?Hā????????G1B'??a???P??Ӥw?4?{???????vwmQ#?Q??d'???????Վ????B?@`d3&??????G???????&6?&cl ?G?1'k???S?&?{[E???tb ++:? X??WV?v?(?W?[c?t7?<b?8^Z#?L?zt??j????;?IJ?m??|ݕۻ!k#??qq:?gX?l?c???5?F)xd]??R????^Ur' ?"l?9E???c?BPG??]?H??a?2????+F$qwsfH???]%R ?B+4t5??????j!?S??O ??y?Km?1???J?5??N?!??@^??kQ?R)E1 ++y?H?H둒?#?bT'??!?2?o??V?峗\??:??h?D/.U??f????rϺ??j;??q???fT?N????? b?9????hc!;?AU??HD^p?c$??N?/??V?Ċ???c֛5$?cU??t??浿?c?=??#?ݹ?????-? ?]??& ?o?????n?6&d???X?)??V???????iE[? ????? *???PB?? OI.??-JL??f?uW?????u???\DŽ CD?!z?P??+h???%???????'??6ԃ+?e?\??3?????ŗ????????????????W??7?? #?ʴ??g֕????{l?O{]??>?[܉B k?? w?Y? ߈??˨?t ?:Z??r>B`3??T??n0? ?@??? ?Q????l?my??S??m-t?? ??1l4a?]?꿛 Tz m?B?Z3z?T?s?Қz?SO?P??Su?Aw?z?@??NZ????:?D{8?c???m}J??If2??۞?nth???3\'?p?????*Ʊ?, ??ߍ$?=*?81???T ?n?R$w?e???u?m??k????L?G??ȴ˄???"?????hkN????(?ur?ߕ?w??6)A?;.O=???J???U??Z?ufB"?#6+??? ++?J?*=rKz???h?Ъ?6Nb????v?1??(???9WR?`??|?(JS.?_?ib?Q???,?c? ??q??r?j??? ?͖?n?j??|P#?2{?b?DT2E??kԝ?K߸-ϥ??vwfi??nV????csv?|Ɣ??.$?N?E?#?=ߺQ?ш2???_?????k???rǫ??:1?lӖzس+?? Z5_??~???Α?XM,??R?;c[??Q?@?kE?ugq????7#??? ? ++?d?N????????W??k?FH????d??? Gw?{???? ??{s????@???YCt@R?̙???A??po?3???????r??)???Σ??s??+hPf?/?Uj4$Y?#?;????????????)q>???}ҝ?>_GH??d>??qx????jϹx0@?pu{?????\_???=?8/??5??%?Fv?~??O?? ???{?}?:???=Y*qy?iw??w????ڨ$?fw?W?4q=?? S" ?yS?1?3????????`Я??ϯ???????u?]s;?~8?E?ӕծn!P?B.?!??? =??-`{?Dz?????t????%? ++:?????!g?hGu_'C??xd???IS?U]E????\??????Z?E?鿇w#h?9ީ? ++?Rfw??qr22O???K????`.??????&???m?n?BdMZ?????dHQ-..?:????4e??+?x?; ????|??{?|????bnoo???ʋ??;?g??2w???N?kKN>???]?6???`?x?Iw,٢ ?v?4r?nf'cd?(?g؇r?Ǧ??]/?!?}?X\?]ŦQ?b?8??????????6B?^??̓|T?#E1T????Y???t"&??u?3??@vk?c?JM ?;?TI끼w?Ml/?`??U??%:(??:e?? $?cH?\ 4?qEm?Jqǚ(? ++)80?z?cP???ϥ5?{?k]??R;?5?&?Mm???։iI?@;??Fw???1$T?`F+??ň ????? ??7?????_D9]???|Ȩ?????b???{l?n??R ++?ZC????zd?8Q?#?=q?'}]80MwWw5d9??x?Ǘ??=??.??w?Ϙ'8!%??/?????!@{?"Bz?)Pj%??[n??ں??5.?1?????RQ?f???t??l?آ:??k?6J]??aE?8???c?@?x8üS? ??? ???????YSn_y??? ??V?????۝f??????ox??}?>????????g\???O????????[?]?i5?j????????u~??z9ݜPC9????˝,?{S??!???s!???b!?= ?#?:???@??? $$???ƝW???L"I?? ????G?qG?????}?????7??/?u2?u??,???Bp'D?????]?`??@????.>????1,Jyo?[??媵??????1e9v??????ZbF; ,??o??$? ++?d??&???2?Ϙ?3Ʉ&??????k?EW?E߃ą3?e??`?ژ??7??o:??,?s#}IX-?,????i?{??L????$??#??"?H%?﭅m???M?@Z#?????_d??)??g`?????.3DՓ ???H?^?f?T'?????=?D_?U>s??u??Rb??L+??^Ol )?JZ?̷??g?m??w?nl?6*SQjVR?.N?XY:hgKʐ??GŒ?R?E?fRׂde?*???PV??o?C???? ??sn?_p??G|??wcS??{O?ϡ!0TAS?Hv?J?G8?????Qإ-"????XO?ih???r???a34??? ??? ?n?!F?l???I1??ٗ?aK?_w??@"R??Ѱ v?c?????c????@*?h???k^e#_???-???-i???'iY)2s??g? E?aD?????m?????Ǥ1fO??P?4?^???i،1˴V?scu~Ba2"W?????a?|p?s8q젵??q??????+?V???#??kw*????????=??Xm ++O8??f?i?^]? ?Gl????? ?}?2???????????? ???'R?+???)(Ҏ????Hh?Ix??2??Y+䛫??1.??ګ???Q???mq???o^???*?y?????~??3?u???y??1?.x?0Ѫq?????83??|????4?????????p??n???ؤs4N?n_Q??v??????ɗ???_??7ϸ???S?-si??zNSu??:/??2< ??a)x?B??????|???rr?????L? ?͘fd;pw;???=?ʼ??jPAK?d??3?&???; C`j3????/??_?V?C&?D?GTG$j????G?n?3?Oٱ??-?$?I?&6e???Թ????ud?2????E?"=?*b??Î?T*?9????Y??~?^q`?{ɸ:aX??S????|y{??aG?3]1j"?rr???n?g ???m????p?")?? E?P???y?Rk?Ub7?? ++3?I??L??p???g>xij/.??٧|??o???V'R????_z?W3?H ޻? ӹ? ++??9?G???DI???Im(~???R??V??h"?E#H?HHĮ?o=M?;Պ??Ywf??????⇕???f??8???s?0r?l?af迸s?N5k?L B????]}?)!?& ?y?X????????u???b????k?t2RT;?@????J??G?-???W???^l??sU??????Ԟ?Ƹ??b?4R??pR?I?=??6? ++???'&????RѮ? D ??????I/?C??????8???{d,?\?1??ui??h???n??69(Nc.?h?@?$]??{>Cp??f??????p?(??????N???????u?D[?J???@c'??? ++????g?9s{}??o?Ͻ?|??ɓZ???/???֜n???s?׀a?Ǖ?????]?ʼn̥???zd??g?u?rp?????&?.`?????????{N??|N@???W?u*?֝??;?\??????T ?e?8?Z??yR??s?b??L?.JkNn?4???/???+3??MOF?`?[?J?b5???z??fX\? ]l???7?>?ڝO?A??v"?i?@ l?HM?8?k??{F???އ̗W$q?@??AQw??v??D??/?????[???ϻ`(cx??M??G~??????J ?w?6??w #?a??k?9??D??'-k???????^????..건#"Ę?`?J?vN?V'???u%???wA??T<>??ul?<.?wM??u??K>J?3? ++??|m?????W???Ya'JA?c??D?U??!,?Yv4O1?kDB???KiF5??\>?1>9??????O??4?P??;?]䳧?????????*?[?jĹ?W[,??9??2?$̹??????˷?} BÊ0?L?-v???m?X?LS!m7??|m???\ j?Vg?1???@?????? ?Te??{'|??3???!O_|A-p???g?}J.??Zqȍ_}???7?^??#QU#?5^?D^? z?M?[t?????v{?$k?)1#E{???}?@?{?ـ?????J@O???(d\6???zɽM??????A?K2D-??{L͍?j??ج??{gi??A???/???Zv?_???D1?N{N/.8????????J?????fC? 6&4??׵???~Wh5z?7?l{?;^?TBeV]d???6 ++??a>D?q@?q???Ja?ٸ(? ++?2ԁPAm"?Sڼ?? ?H鳫?H??Q?[J?F?? ???*??d??XA[1D??7?VJ)?????V?W???&?k6r?????GĄ????]????]E??,s????0? 9?y??????JT?6??? ?׷?†????????3F(b4{???ӎ?(l?Nx????=77????lUJC%??W?x?ܒ??Hί? ??? ++?JR?"=??8٫????UǑ???q0@D???s?~????y??ŠV*w????ɐȇ??d?z mG^fd24???紵n???& ƕ?Ik???f??_????? ?z:K?ٯ??j?~nh??^???>?? ?F?Bc????B?v?1F?vt?V1?4\?踖'? =6??b?}j?+!y?M=??a:TT ++!4??V ???Ǵǃ?#_s?2?r#?#-׮'?Xl????r?^3ᅧ???????????Q?A?[?>,6?K??~$c?MqйaH?V?H|.@???" ++I;!?????A%k???N?4kGB?Z??G?{???R?:???च?h9?bW3?ǘ?0?:? ???i?(~P]9?.@?j?#?p?? h?́ U%???n??p???9??3NvATW???????xuu?????^?????? ?#?ы?C?V#?6?=????t?????{?m0???s???_њ??$֫5?.?We?s?j??? ??%??? ???5r??X/?????)ɒ?礹??Bh?G??ȻN?]?b??C??F?N??Ap??h#I?I\1d4Zn?|?h?p? ?y?>?I\\͠??i ++?u????R?W???jCW?????]1?{?$Ҳ??Pr????ܱ? ++! ????vˤ????cB5no?xp?aW??VDz?? ????G? À?1???Ehᑇ?A?quqw?Ws?|{?v??:???/???? M??h?Zkp??? (???o c ++?K?8dA?ڱ??.?Rz???P?s????j;?5)??;?̈C??d\A??d?ǐX?R?g?\~F?g??????_p?޽~(?7W?????^# u?A?b???Y?jHs7oeYo????????k??x?q??gs?K??b t׹???H[???d0f?V<9?1ݼdL?? ++Wh?. l?Ł|????G??GotD?;?Bnr??S?︪z?>!??_?o???~~???{?c$?qn?P?????V???f7;e+??DK?Ju???j3C????_?a`v|6}4\(:??õ@?a??u{Ge??Pw?u!?2G,?כn??????EV??@KT???;;Ic@??? ???d\?? ?N?h?x?? ɰ?/?؞??9C?Nv??C??9 ++j?????t?k? dr<%????*Ȑ???x?VO?i?X@?Al.?)???|??^??3?ȼ+??na!???Z2*3?`?&n?v??J&Zf?#????5??-?z?o?)?VfZS?93?k2䘰\99 ???3Ww??g??Ǖ @?D???Wn??Ž??????;x???g?|?????'??CY??w???$? ?wة??ٿS?~?ҝ?@?5?? 7?׎? ?;????1?:? ?]?=?޿y??cpgL????.?? ?Gj8?v{?.?z???7ت#??'G??!i*?g?j?\z?E??Es꾯j?xè?}!k??x̄?T?L????u?_r?=?2W_SR???t?j?w??P~ǧ!????@?? ???F??f?a??N~???$ Z^ֶ???4q-?&#?uy ++?kɟo{? =Z?O?v??w?-???C?? ?~??E^?@? Vu7?????k??????? ???O??zw`.??v???P ?5s??l??=?Ժ???ເ4?F??@)`???Qz?e?O@???<&jnƠ#??@p?@p?ѓ?ck?R?c`>?.p????? ???`D????V_??䎀P+h??ه]'??.?"G?sYs?y_??r'>??????\?ػ?kn?oy??7@?!ЧBW???cm??zP??Q#???b?N????? ?X?;??M2????Z?Dg3????r????!?*s?I???W??3?;???5mw????Z???JΑ?^G???ޓ&??6????߹)??ޭ??5%?x??Z?8\\?n L)?'?t?I?6Ƕ?1?A?ԠZ?w-???_8*mVB̴i"??Z,64??fe???6EX??.b?g ?8?????n?@]??J??l?c??)@6??)y?^&? ?i?mK?N" ???;f-?*?ɜ??-???y??ɢ?Z]j?:?cr"0?j%&s-??F??V???Q?^ U???H`?i}`}~?~[)r@u?z:?ʐ???l???b?? ??Ԟ#ʖ9s???3IJj?7??????s????o?? b???R??(?ڊ??ɓX?.?i?ѻ?\??upU?%???Ȅ?[??k?q?9??g? ??+.??K?W#????)'?????ݖx??J(??Ȭ7k????`U?ZM]??$?BPa??u?H?ޔ6?Z?6?2??? ??? ?`kU?e??1??#V?~bo?ݳZ???8L??!??zGX?P??㧅??N)}ϰ??Ɏ,p2&?}a???? ?S???m?a????.W??L?K???8{x?'??????A????;???+f?[3m???NOX?Y?????h?d\?v%?S?*=tblh]?]WD魒?Bkb$%M??#'?^?;?F???e ?J?+v7?N簫?Hy*?>v}kBG??(?e' <{<d???|????“? Vi?j??ٚ?m!??_H)P??+/??ŧ{?^m?(?D?W̉?%?H??{?)qv?&/?Wh???b?,{n???Q'?qI??~"&?Q?b??$??"N?{????6K??E??# ?2|?f ?s?o??3???Tt??請\??K??7*?FO=?.P?0??3B?tEӉ?i??ꄶkh?Le•??R?8_?/7?6 *???8??U?N??? $٤???w?h?0Alc??}?? :&B ?+&?Hh??=dO6 ? PA;}o?%?6rN??R??cBz]? ????R`?J??̔???σ9{??쬓????H?0 ++??)%??'/8}???c?????????W?????J? ?H|?('CQ?Ѣq ? ++?@?|-.?#????,?_"8??Qs?`?x?????DE,??? ???U?x????m??????~G|??Us ???ű?oj??:q??i?煜;?*??j???`?w(F&0???}-?Z??#?uNF??BkC?k!?@ ??a??o?????C???_??WXex???????UfFVi??.Eŕ???;n?K???=???;XCG?$k??? ???v?I??P??!ޓ$?h?[/?@?Z?E;??(?̇? vF??&??p?ڑ W??7.? "1%w?aR?o?:?;?lش.??? ?ع?H㨴?F??.5??,?>?????s.d1?5%??O>??j??R?֛???1iQ?1???NM?ݛ;Jz???Ѣ?Ce??$?p)?t??)r?I??/?k?s?cwq??¼,O???1???D??id??.??)??'?eqo`ۑ?r??8I??,??????????????Cg?m??????>?jwK??? ????0/????ڬ???#0?U?6?v??E?ƍ? ++G?qq?J?@???(?)?s?[ׇq ???"??К???bm?????]?{ڀaC?U??J??l?????6??l?GL???&?p|???PM?(????? ?BU?j?a?#V??`???~-c?????\=????6'ܿcjr?Y?7????' ????}:*???(ßgE?? ??>? ??l??^?˳?,?R?k?~??? ?B???VK????(&??????wNQ??&???C?he?Yaj???:?"?N??[o????????|????????s9?-7ۙ??̃???Ն??|?G?>S+hICe8D.N7?v&c?N6X???4??n???^,?P?ʯ?X4l?`';???????տ????1???Ö??????? ??????_?Gx????O?j???ލj?ŸF??L???_?????Ɇ?_???l?2?F??? xWa0e???9??????sT+?AD?b ӶuT ++y??qBJ6????I??m?????? at?I4`?q?~?;?؏??G????A??y욨 ?L?`" <?3G??/?q????i?U?{?c4??,g2?Y???(-?lq?N?.n?jg?„?????????"?<X??6K/5?y;???[???9?k?T?,T?L?? '?????ӭ??????_ATȞzaNoKޱ???s9????-Ѵ?; ?D]?7d??j?o??X?O>???????c7??<\??UQ??8a&pu?[ ???Q!?O??m~???Î?!s??%?]p??Pf?{?:??#?$??؂@¼c.V??? .?????E???w,&Un?0)G?֨?h# ++A?kZ?.??͖?_?Ngm?f?hX??@N6Jm??΄y?ၤ?pщ?F>ѷ???e?u ++̇N̉?i?HL??::ONV?????u?N??eߕ?*???wŠ??=?(BՁ?m?lb߿?@ JZ?q?M1?;l??[?K?-p?3?m????'??B2????\\>???9???&??!Ѵ???$???o?\=A?)??ܻPj??-??$HuB+R?WǘAaL??ʸɴr #u{ ?ґ?=0zRSw?o?׿? ???~?:fz??hIQ}?r{;q?>'W???+??Pw??};S{?I2?h??9x? ++?ْDFzh???5R+??0D?}??????{??#??*/v?y^?s?T?????i? ++c\[?IS?X??DZ????M???4??Ti?}e ?[溧?JL????4????F#?R%??@??LgO??φ?L??+o?_C?--OG|"?8?38`D?CZ?R?6S??Q? ??s}[?93?;b?H}?:?W;??dvN???/?????wY?-Y???3֥_?I?%?n|??Rߜ??ʌ??? ++wҪ??ni{?p?OuT??dz?Q?|?d?A_??e?b??R?u???9b5?7???OVhk?>???OX? ?.6??]]s??>o?~???o?????}J?????9۬-z %??F\1? ??z??r?׮???f?c??Ϧ'???t??K?? M `u?K?`G0S?????_;xV+i'Հ'?????Y???:?F?Z???? "?????b???+?⊱Қ]%???g?I?j??.f???;y^?Q&?~?#??e5S??wF??k,???P52`*?c?hP#???tX?????X?ۭe??3??wx??Zon? ??o???pq??DL@B D?iu???bϏ??#@e{J<g??9?????z ?V? ????9b6!?5%XE6]E?B?m?F?)Ԫ?d?{???ĸ????AR?9JД??jC=??Em?R???H?6+)?π???(???Z????%??\???Y??P #??Z}??H??N?jc>??@:m???h??dj? ??[m????5?˵?? ++41g? ++:?wO??????eF????Gͣ?׋-1Z7n3B{٧?$?v7?????+A#??? ???g0???c??S??????Kln ?1M?ЖnR?u?i??r?????F??&???@U?P?b??Ϯ?wqI???cB8?N?_?3?Ԉ???-??N.??vB?? $;9%У???Ђ???J??NRw??????? ?0????x????㧬7+?Bk@?b??x?rމ???>???y?N?Ip??O?g??u????{x?\ m?????!EvW?xq?z,N????? j?Q?x???????፷N??O???JW|??5A:??=?3?fI?!??9?R?????3?A6h??ls(???yW a????????????mo?????2^f?]!'?g????V$=P?R$?JAs@'??N?????;hd??????sDI?f?k???tE??T??v?H?=?1I????|??K6?k?n?}Ѹ҉???ܔ?{???7?x???? ++Q? ڎ??x??g??&B????mG?+'?5?.?@둏>x??÷??{?f??'?qv?֑???l??󽗸?5?ڹ:WE??d???hm?G??{?ٟ??? ??Gs ++?d??;Z?\??}MH???L??/?D+???퍣=???U1??Y???*?}???k?h:? KЎ4eL+8t?B?ʉ(??B2?&?1?L??<+) t?J??o ++$&팫?T p?"?C?$_?R??7?:,mI???W??3?O?$-'?@?Ӗ??? ++@??6DL??XT?f>?&????w?x??}? `??$]??? _?????Z4<@???f?!d^?{?y?M?^????y? ?CB?H??f?ߙ???k????%U5F?+S??? ?r蜝gnogRTVy??????^?`??hj?!M;?? ?>??ޗ?????Ʀ?^??i??$???l??wZ7???m?v?v???EX?`?Ҵ???C???3?h?'!?j?k?sD?x=?:&?m aHi??????zpE?R?">?Ժ`HD?c??B??ӍEߪDRZ?7????W??W??^_?~?/?N??h???ʼn????k???^??Xn?S???27??"? ++??I?l +??I_q?c?Fx?r?G0ź??Ti??űkІ9Q??"?Rw6?jg.\a??}#?z;? ??9B;?Dх`mw?C?q??.7l??OSsf?X?#?k???V??h??T?}?j?wS???????U?!R??!?Ն2 ??@ m??g=??"?& 12?J??7^??n???!Gs&xLh?YZw?П???={68@??ƪU w?w??=?rv??Z?t2U?E?? ???)4?????9س?A$Z??;?C?x?0 M̱??/>{Nm????!E??曬V??^y??W7???pu??????f???Hr?8s???b?'????g?n[?5`!±g|q?w?L?#SX??`n ??a~????v!Ժ???`*؞?Ą.?'??Z?j ?T ++??W??????w?h IDATV? ? 2|??G?^D Cb?+e*L?ʋ??ս ?}~λ??????0q?'z???????????????w??2o?!?[??a??a?,?&e*+n?[~?? ?/~ƽ?5o??]??!?L??/?9?;?h??a??1^!D????/?=???=J7???Ц?/?)?z?c@Tx???Q??z??D/7?O iŐ ????K????n?ǭ?????"bL@??K????V[D(?Z_?? w?{?E?;??D??-?!z?-k?H??@??1??p?4M5k?8̀?l??hn?ޭ?????@N??] ++9$Tq??\??We?>?L?Db{???e??_?.F?\???M??iş???0NB?w(s!g?V?>O?kTR?t#?9]aIʐ?9?lK??~'X???c?c72 ?V[?z?l$y̝y2F?aEo?^+??*֖? ?Ɖ??????πĊ?,?c]??E???b2*1?????1????%a ???t?t? ??iϸʔ?<0W?D)}??if\'?H(??????&R?h{#?1?r?t,??/cF?I??????-?9?-??֖?#?-??-?m?g????]???2"?.BOw?`K`???mP?E????bK???k6nh???/w d???wH??]?I?????Li???[ʨ?5???7?????ǰ:c?-t????9?̼?v?T^?|??B??W?̄*?UE?F844??;?iB??u?.?\!?`$?$??η(???F6?????7׏???[??}N??p????k??'?͡?b???W/y??Oh?PgE??N??? ???%?!k5q????0f??جW!'$]???????OY?V?r~?????'v?S?}?;#C?Q?׉???Ov?QtA?F ?GT!i$F D?飼?%cn?,h?ߓWJ?,??0?h?U@Bc>?،?ܻ| ?/P??h?U9@^%?}eج?RI9D?? B????b\?uJYs????<|匔 ?f?????w????]2*?V???-?4cc?\?̓?&????? ?je_??R??–Nk?i??P??L-???\?????????|r???????\?4XA#?l?KaW ? ++? ++ʹ?_Y??B%k??Љ??g?W ? ?J[?mj???g ?@???(;aސP???N(Pj ?H%??*船?? b???`?Y?L?G̫??1?{????H??0z??? 6??????9????ٚ h?ƈ?D螑?#!???P ?NI? +놽?W??\???\?^+˱??Y?g? 4А11?U?D??!?;8??S?i?f/)?? 12?V|ƞ)??<?? k???Nu?b،??l??-???)'?ޅ?1?Fe?*?*B?GbXQo'????ӛ?zЫpz ++Ͼx?0?? )b???r!5?ے???3*??j???օ*?-.?v&I???v???(?a!u&Xl8???F*9?i??pLci??p??}FR?7?2s??+&?Xf0ܮ?J??4????8?h,?9????ufO??8 ++???+????Ah %??UM氳B\?kW?_=?V??? ???H)???l?@k?8G??g?????72??8ԗ9??Ep?2?n?X??Z?(? ????Z?s͔?a???UZS?!B?R?FL??H?$?H??(??j?? Dw?*???C?(/#?c??a?@L?>,??oU?r!u#S?D???'???}q??????Y?,T??Bdw??'?>u#Pb?z?D}!ݼ??{@???E??7???.??7R?5?׆6?x\????6#U6򎊶p??????P b?d??8}?t?^;_???ۮBk???????>?G??̟??g??~???z??*?>5$?%a?f???H5????`Г?s\?????ӳS????>x?T/?7??،?? U? I?9??Vk%?3:MF?_d?Z?$I???0Y$?Ք?*?O?????????bʬ??i~F?ʶ)??w??N??N3?+?y??A"?? ?V?%0?F?M ??f?a=??zG?H?Ƹ????\???&b??"?w ++3?9?a??k ?+????4???i?g݋ˍ??WFmԐG#6?5??z????$? ++?D?$N??ν?S??{?????Rx???????I?͍?5r?? ++?n"} ????JB??=??2P?I=Z|?c?C???ҩ?-J?l2??Һ?d?<17fL????+?UDG(3???ke}?]??|+4Y?bgO???2?? ??>???.8??si0? X?v???4T]?T?????㞾W?\l? ? ++y0?UC??w?)Aw??4'6c8F??<7_)?\??>c[?T??9L??D??UU????A?????S`?l?x?n ??¶??? ?m???5?????ӏi???G{?Kah??Bk?&G3?!??m??L?O??5h?? c?7(??Vny???O???L?8&ʡ?L/C? Q?l?`Ğ??? ??t??T H??㊫ݞ????ϮB?????T;x?????Gj???? KPQ?M?v??Y??ZEU?1S?? #??0????ʊ?d???0?@???4z%?ϭh??hs?T???!???}T?W??W??^_?~?/љ?WG??H0v=??!?g??z) ++??#a?e2tQ[???ň?^2)ڐ?]??D?9? ? `?U?h???????{1@d??W?H??bS??????j'S???%?K???y?$???/8;???~?tC\????/?????'?x??!]g??; ?;ב???XUW?c??}???*Yz?,?X$?s ?J??B?y?j2?\??d? ?b? a9?????ֱΆ????@Ush??:ҳ{7?9??)?܉@??d:????n?N+B?ʄD? BW1?H?k?n@P?6ti0?8D5,?YBJ??n #????,????ed??%??? ++ݣY?;?cM???@??-?+ꆐf???#we?H ??4#=q?fT?En |?R????Xң:͈???????9:??)Lj ?p?t? ++?M}??s?:Q??p\k?>5?????݀?(PJ9v)XT?⬳?(????O ?|??7I??ھ?G??C>??)???????Hfi37!?E?ծ}?Ev?`q??``w̵:Q?`??u猢?>I??P?ԙ?l???1dB?^]j_?D9?O?hS??L?W?Ѵ?SU?y?No??bH?????Q Ԫ?ͭ?k??wdB???S??$? xs?5L$Ԝ???t?~??2 *?&??~g????+?[gM?$D?~?s?lo??_???/??r?r:e??p???ǟan?nkO?z?[3?y?õ_U|?ۏ??m!|/\???﫸S?.?P?)'??ܻ#?YDCb{*?2?\??""?l?C?@ dž???5?ݒ?????*W????)?z?????O6H???՘?????_^???? ?????*???7????O?e?????=M0?i?-??5?D?&??{??i?mk t??SR??q$?@-?:??m???j?B?^gB?hWj7P?j?Z+y(??a???a k 5s?+???&?}?{Z???=,)S?{L !*?'??Q?iaM??'~ʴ?1?Dk???)???߰:Ol.7ЕŔ?,Xw,W???????3?`?a?C?*yLN?,Iݜ???x?ܢ.?Ps???~???? ?????_׼g??E1?_R?vB/??T?6s??|?? ++??/ ?nQ?u? ???@?Xg???<&?.?E)?>W?i??mm??}???s?̋ ?Y?i1B??*J??????!*4L0?????B?F?D#??C??E?.1Io?b????t5?????6??L.?*?[?ኽ?أptc^="-?\???J??? ++ $-?@???HR??T?y[??j???w??I?heNf? 6??̼???'??????mhsq?&?ĺf5???-????Q????J 7?*}???>???9???F?.????eZ?֑?#????"??j??7??:??V??_???????????????e?͚$I?B??n??0|?0??U???;?J?1^???OٝM9?ܱ2?1j?M??9z?±1M;?#Ė??5?-??2?lBO??`????3?????~e?j????C?aW?|͐??^(?O?????rq??????W??;?y?V??Ô:o?)???.??o=?[????Î????????x?]?:O?????|??m8?6?%?ƈ?}3QJo:?[?e??&?/??? ++????g\9??2??w????Q 2?9??? Ύ???z?{>??sy~A?݇????/_???????????ߡ??}???/???{????W????Ͽ?????Ec?T*~LBx$???????????/??q?S8???pU???? ?LP?NxL?(Rv?????1"*ݭ%fV?"$/?Ԙ%Z?±;&3??A1?n6<{Yx???|?? ??&?䏿??#????xJ???p?B?@U???5???????«?¤N?-X)?2???pXn??????W🼾%???????~?W?Z??+8 A\&???a?5?=?Pw???t?? ++kԨd?z??1TsM?&?;+???g?,J?;?q?L?v. ??H5???????`mɹj~ͣ??g~?(s???y??O?DD?-??ES!???p}p??8?LU%b'?B???J?????O?????????f??4?????O?@?̓?\>8??)V????????m%ٜxv.?`?f???sI???@??,?;DNn?c?t?(Z??{?$?&??.? ???kĕ?*?b?O??A?T?tP??,əb?k??x?=JF?z?I3????=????^C"?? ??T0??k.WI?)?6???I?|?-bӘ?* 7??Ν7??9/q{Y)??E?? ??7?????3r????"?q?Y??${D?fS??1?????cf?d???ݸ#P;? 9֬ ??.?N????d?d?L????????????p????????????ϣ+?o? IDATG?xv ??w?X??u??‘?˪?4??{wF????5. ++?/???X?? j??u?Fk?E??'J??m%C}?X???|~1?>(L?-5c?ܕ֍??m???LjW???;i?|D?VIw?#????`}$??J??/???O?6??^??1G4??(TB);n YW?3???r??=@p??\^ ????σpUGp?߼????????u?Ȝx??9?Ѩ(k?m?n??I??ƺ???l ?r?笫Z!?H.?Lz ++??Dn??q???t??7gW??~\sm??{?𛾮??hK??k.l???????sQ7 o?^??q???7/???W?????;??ٻ|???|?;????~?P3?? ????W?L=D*???.?=j??J?V??J5 ?:2:??"????gs_???????4O?z?'?7??q?ca????T???چ??? }(o?????????%?v?+??Y?yJ ???S?N?χ??e݌I4?]??3???8?Y???????̂??)???}&?\?;? \Q? ?B?Tl???؛?zC??1H?񨆣????E???8???*=?B5??I'?>ٗ5?ЎND?ňyD?^?????{O?5???(.?3%c?"R?`[???Ei?? ++Z???:*?"?G??L? ++Y?Z?qKݬ??+?D? ????S&?0n?}P??~@{?Ԃ,??!??hDf??Nqa?L;???1?3?C????OE?? ?bV]??j&Wh??P?? ++?N?9??_??W?????)?޺G??> ?{???~:)Z? mi8#?SGz?&1?;??Wϟ????c??1e??NJ???P??H??? ?z??H;6?T?~?aT?9?'???CË??2ZK?P?9?[????{???^˫,???=?9? ++?_???*<{??.????-j????u???$L??cݨS$???1a7ߣ???q??Y????W?Tc?nY??97?Qc?"Z4?%?S?%j????-?E??x?R?Z???hsn????>?CC??>=??v??w?2Z??ꖟ?l?? ?????K?l[0SFl/v????!?PQ??_???!r?????????Ñ????o??$C?g/??s}3??ϟ???*??/???'j? DD?{?????+? [???[6e??/?MeJq9????????1o ++!?Z??L˽6?7?֖???????OW?;?}o?_??v???F)???W??LpZ???????bKAT??n,nܻ???ۯ?t????s?w?5*B??Z?e2?*?????L???k?W ++???Ͽ??????~ȱ]???? >???꺆?????7J??[?????!?@[?q????s??&?B??_~?st???????????|???\\?ۣ??5+$??? ?|???i0D)2???2˄??܍?F}9??xA\?ӏ?r>?lpS?y????iL?j?H?DŊS?3???A 2?<0M2AAUYƂ?P?ufY?h??iw;??ÝR?f????;O?g或$2?vl춙JT?~?z??@k?Z?>?p?{`b?`??V????GR4V%?A???L?=??8???I?????i?a??:~?q}K~~{}{}{??// ??u""??C? I??BFN???#???????;???(sk?W??e??}-? ?:??z^~NA|??^???++????#,??o)?????????k??c??????ؿ֙6N???f?:KV?I?},????"?P ++bʜ??f?ssXp?p???t?N??WO???ދH?*4?$E |?c?{???ؠ?ʋ??L?y-[~?7????}???@??E??X??R??.?Šr?)s?/~?S~?????f*>E)I??0y ???i~s ++M????b ???g?`=?VfY??e? "6???*C??ڑ??F???3???ͯxp??"17????S??? ຳ ed5????Z;???ZDjZL?i????!_?x?7?糏??n??????|???K~?㟳=;?&???7?G^}? ֩;I??ˁ??n??L?J1?cϲ5?=#9?S???Ձy?e??????????}?;??e?ؤ?P ++?82??#ʄh??? ????M?ps?ըlQ?h?Nt3?D?xR?pj??%7f?AN隲???F?گ??l??K=???)I$[x??s?w0????w??!??u???p?.½g?ۯ;?C??tZ?g?? ++?S ++?:f?n??$]??? J?h??S?.????ͫ>???ma?c??(#`3?b??_???2n????޻?????????\??1? ? ?? ??3r???r?????ԃ?,?g?85S4V G)?3ļ?U???U??\}F ++???i?W?w?? '?N???Ĵr??J?l???t??w??^ad?*!?11?R?$?*L o??Z4???j#L?Ʒ? N?P$??M?XW?p????&??a??Q?'&?9?ۭ?..ߢ?k?o?????6???OC8???F??W?8 )??uE????Ƹ???t?????? ??,?&?Ŝ/.yr?1EG ?\??Tj?? ?????D *FQ0?!??E?q????^??8R&??h???&6-@)kQP8?lU???g?n???,??)=)?t[???JLN?? ?x??MљwU??3??9??#z?n??M?5-@?P??Cϝ:?T???yBόZ?M?\??^5nn??????;??Ç?Q?ҭ???=?`7???????|D?????3?? ++?x???٫ ?? ++??EY?YV+???.??T??=??i????u??(??t-?d-?<.??ϯ%?p?D?)I?!2???p?d?Π????0?? ?*=?$??U????j0?f?RK???bG?T ?{?Wg?궊? ?J??Uc꡸? ??z??E?{???@_?W??????y?F??[A?P1??Q??*?ASآܻ??t ??????z:?F?9??S`?f????? NuxC?n?5Q-_???K??ϱ???ZF?z?k??3?S???m?NU???zX?bWM??D,\??}???u??P#^???~?h??=?_??????s??n{??~??_???/??r{/ D??&`8V?0?????F?h??Xs?߯?]|??~?-??{?{秨Z??+Ifo??wN?X 5?S?6Ǽ=O??[?? ++%?? ++??Nn?1h?\?????????=? ++???i?AN???nÒ@?٢?B?=ȨZ"bI-f`bL??3]??? Z?-"Fb??l0????V?)???\???&?[??=?6+??JX?L?Zc?????H$ɺ? ??ƻ?B"O??w??X?n ????ü\B???z??6a?~?֕? ++?WO??7O?z? ?z?-~?????G???????h???ޤk???H?H??pjC??w?????~?.=}I?-e??"????i]vQtd?h?7$?(?A6骢.'L???9???n?,???F?^ZM?Zi??hG?????rl?Ʊ?ީ[ !?G???a???-???5???Z'< 0w ??8?i?P|d\???֌? `{??:!??ͮ????f? ?>Ję˪?!rS?m?^k 6z?>??ֈP4???M:g ???)ʳ?#ǽ???+??{??ϛ??yŻ߻ϟ???坷g^t?jC????3??$490?6?֞??/`????X3?;"5??W7;Ʋ??1^? ???ގ????>~??Ej?j?-=???^nFUno?P?۩Qn?????KY??{E????w?{?B?\%????ڋ{d ?;67????w???~??$ '?????C}M? ???*?|&,?%???W<{????????Ͽ????1w????x????-??R?36U(????7????*?t?%n8???V?W??1ơ!R?.? ?[???Z?ߵt??*??[???? ++???? -?D???=?迋HD??cj,H??5r??[??WL/??@?~]O @?VEN?????????A?Z!, \??? )?F????r?t F??%b?E??z????l?g?#??&6????g^?p??;???qc/Q?2-ӳ0?T? ++?"?b???Ur??yw?Q??ZP7???ˉ??B???D?ㅾ?????ӎeэ1?FI?{?~??0??h??f?D??{?uS'??V??%??? ?E????Z??)J??s???SR?H?????f?L?DK?+?޻???]???L\=_?????+???S΄{~v??ȹM?tpp?ee3?? ??ʹC??&Y???|&?^?י?=r?d??l?׾K??^??$I y2?+y??5??vRT{>;q?1Ǘt?G? ?X???i?%4̝R?yn????k???"????ޏ s|?}? ++?ēU9?v˗?z?L???L?S??p?!?i9?#伣? ?? ++?ƺ???I"f????p ??Ũ???3^???ZT???zW?h?$?q?F?I:??M??#'??|?%"bd?Y??,?-??E?v????~?s?`???r??߽?????WA?[?o:@%]??!?I????%???? ++??a0?`c ++H?y?L%e??f(糞?!;??9??\??Ej?F?C?0a?D4?t??????N???A4??f???#AXN?͙r??!?&1w7??GݡJ??5?9>?y8?? ++?R?M????U+???;?nb;??/?12?INcVH"Td? ?R??M????8????qՓ??Mw?[pB9k?J???X?? ?ƀ1?% IDATR??ܛU??2>?!?K?1??StrJ'w??s`m?cͭ?n?n??????7??O~?C>???|?????? ??pYI??D|?th0™????3Y??EX?`m??s9?F?Q ++V???3?????? ?+??Ho????X6??/?q??5??????????T N应????CSҥ?=??֎?2?? ){????V??V!?)?f,^$1?C??eY2?|?????\_U?$??????0\O??#E/Y_?z????ˬ?E?I?Y엣?c;??.?7V???}???Z? "3,?Qe9??;?5\?? ???2?G"B8Uܠ?1??5gYg?? ??y?????;??4????o&?Q:X????.?>"r???? +T7:9?G????K;?j?Y'^}}??bf#s~?K?~??Lc?Di?=?9?#r-6d?l_ӽ??e???\???h?13?J?psż?QfAst???2)?K?,Z?ʹ?ĹR??.%?L???b?????Lĸ?v?l7?!p?z?V"L?x|Ƨ?}????3???/??s?:????;;?????9e*?????k? 5?H?????}i?U??-'_???KwYɚ?Ξ???ٳ?G??(?5??{Cd??6?d ̣>?QS??(?2?w?????ω?i??#?ޫCt?p?q>R=???PD??N?????A??Nb????YE?k??X?,?Q?B?qIqV???q?Ke???G?=RF??s?-?x?3d9rl??T8?.???+>yo?˫??^?y????????.?}?PU???䤃5??xƶ֫???i??????)??x`w???4t"?8*A?E?1zY??KQ??s?o.?t??ΰΨ??=e;E ?????lu?,K????qF??sw?(??&WJ?9??J?<9~??pF??b?f?1??V???QQ??853??w?????秳???????<3r????-??????????6???F?z4H?S,ҩQ??? J8?T/????,??h?5f???P?T??,+JOZ????:?AThZ?e????????GhyH?J;??????????G3u3?z򄯞?d*p??>?/????S,???}K?????H0??1!?&?6?^B9k????V???}Wr??3?c??R??(b(??o1E?3[??9o+????6???HG?h:> ?v]?> ++S?&1?#?!#q??1?y?D?Q????Yf???}??~ A?[? +?(,??)? _bf9B?!??5ɢw?%?KI?4???u?I??\1 ?$kk#?Q;???? ;?$??(? ݄~???(?ک?duI?İhƑ?{Ġ?CU???U+?i?>?\???5N???KV5E?bk????O1?x8b>???$?? ??{ᒢ ? S??5???? &???Y pp?C? ++_?:2b$4??_E ++??#j??E ?3???X4?B2??:?6???J?Ո?؈1?T???\&6?YKDk???эQՓ Ξ?ƾ]u?w???ZŰ??r6?;Ӊ؞?'?ź???њ?Q ++Zf????G?W?s??Mw??;ṽ?;aaL>??d??zcİ>???z!?u??j?~4F???? ^?Fp??Qz??.A.K??b??R?{????e?.;Vb2iE??e? ??=)????l?޺`bᘮ ?J?D??~3?F?? ???????㺩??/?ӛ?G?2?Q?ޔn m?xw?ȏ3?d??*???N????????j??D??????pm?#???M?cG???k?P?????????????{?p3?eOi}??M??z?i7???RxuXx??-?͆? ?z?WO?y??̽Z???ՋW?"??5U ??????<|???????Ae4?)Gר?=?p7b??(RX????|z?83{?? ?S?Z?"??vޔ#?ƹa ?`?h ++?Vp??]\2?3"??Ky?y?e1,??oo9?xDD??Cb4?y?l9?/j?Xz???{???py1S3?6z?Hi@?j?e?3¢7Y? sa,?????X??gW '???]iFΫ??jY?!?u?'?z l?h$????@ĺ aa?ב??'????c ??????????9??F??H%P5?-?Y?E2ZԬ??????????????x??qh{?????N??7??#[??????lPw???3Ձ??rvo??p???!??? >????Ik??9?2o6|??5?<Κ?e?GC?ó?|?7??D?H?w?8???Z???KbX???Y?N??kA=?U?9?1?g???7;???k?ײ?P???5;U??Α??????????}????S|???UCH????^??/?H?X??1"?/L?3???Fj?u>_r??im3 ++x? /????:??kEA$?A]?)?mQJ??Ÿ"?:?dXa6??:;m;+???!t??g5? Vl???w|X????f?(?h1?e ?1??-?t!r ݤ??L?2?ћ@??G?DŢ?`?5??p?????????????? l?????p\?n?q???ȏ7#??t? ?w??p???VI?????Yh M?S$?zP^?`o7|?ч|??{ 3m922??pmx!f?P??ٳ?'??????9*"?R,h???????u??P??Rٞϼ|???~?/y??????q??!?<1?~??W/??=?1??{?/?}X??A J?b?z??X?m?]??i?D}u?d?)??$??(?ן ???O?J??$U8??2bfTN?Z"??V????'A'??7TK?TZ]????:?n$?u?+????r=Q?$?Ez????GM?K?|?????j0?K?(|?ہ?A&8?;g;8?*?8S?????Qlf??H??????5z?= ?S??I"ټHDU???JB&?'?9?C"????݄?"W??G? Mӆ1MhY????Z??Q<ܓ?` ???9??I?]D?5?[????4?X[#?`?????]??:3ө???=E???? IA?;|??%䜋????pY?W?p???ٙ6S??9߬?7?:?6LCc?ԱfVL4U?'27? }9??nӑ{Z?9?e??p{??-?????h?b?-???07???;c?C????S&Xn???&?۞N?Q????0? ??????_??_%?$??fB?y??ܲ??Iر:?????Y? ?%j?PkwtS?٧???xC?g?qGʯQs????h??#?1?????+.?!??5???*:5???{??Pl??k Q?x??ј?3ޜ??!⊿L4????8?D?M?4??[k?X?6?l?h???s?k?H??-????L??,?P?d?V(?]j?_Z?6'?w????d?M?%ɲ??߹??G?r?????zB7? @?H???wZ?+J?h?e(??@@?=Tה?#???G?s=^??h&??M?Y??eV??p?~?9??(??BZ?$??MD׷,?f?\ ++?@Qm?lmv??y?Xb?_h?.??y$S5k?h?dhD??i?k??aJ??zj?K??h????w?2X????*???v??Ix??)tk?xt?j?AR??s?8q?l^??"?R??%?????5??k??Ѝ? ++SJ* ?v???@?z?e?VM????hΔi&?W ?B?1??T??GI??.6?[????a???[???z?????߀kF??????l ܳ,ٲ?".4????~5Ыg?-?T+H??ø7?WfOmkD???t????A?)'J?{դWv?? ???G????z?egÀ?D?#?TO^???q?0?????Y?k0?? Ԧ?l???֚e???G??x*?)?ks?i;?ڻY[?(?5]N??;???}1??ZƭsF??j ++???]?Ǚ???f????|?g?e??>q??k?Ss?qX]?k0??:JWM ?܃*v?E u??G?y????z??.?|?????jͶd?U???7????o??????w>?L;?y? ???29??????Y?wv????=?9?:°?????H?/oX????斾??|???c?g,?%?:??t?*^GG????ř ++?eG.?y5ס>62A??V?=??[????O/q???L?X? ?a????3??\_'3??f?]&??.P]!hE?Ī?v????*E???m^ ?ޙ??4?||δ?Q?4p?K C?f! ++???jb^???m.6g5?? v???76GI?At??X???Έw?p??`? ++???^?0?°???-??V?\^?Q??Pg?v-?EM???#?.Cm?2?&??/~??????F7?;???,?? ?9V?f?????????9͍?%F&k??dm.J?_?#??^??G8???̛qC??$????xv??km????7?/???uQ?6??K6Ŝ?E???&?{s??????D?=?.??N܏??~bu?&????E`?ޛ?N55??l}?H????????X[????kz(Ŕ?m?P?Ԓ?f??3k??r?S6?S????ҾW?7?6?2N??x???յ,???y?X??Fɮ?lv?}0????m?6??u]?ZTD?E]?fO_(??"??W??ۄ??%??#??1N+4??q?X᣷??"b????? ^?w?~?(y6b???%v?R`uM?1???Μ?????yyð???H09??f?????⚀?2Ua?!#]?̙Zۜ;? 6_????4??7p??ȑ?z??Ze?s(?y;??HL???3TM???*??LMs??z?;?3??q^}m ++hE?:J?>?ń???ds ++?;%?6????g/HW?\'????=~??=??g?9\?y??2+?? t??G??3? ??z??b?Y?.?tQ ??l7?n@???A?U????d??M??b?? G?2?n?~T?Ȓ??̴Z?Bm?????????1ZBhV? 2????1ϭ??fӲ?){b?B4\͵?[ѶL????v?TA\?C ?nE?) |???1b?~&'ˠs1? ++???q!P}??,+?`???S??vt?Haߞ?)?8?'+?????ف???6d1??u?fű|3s0???8?????}ҵ|ӂ???%??sw?@??m?z?Hn?jɵ?5?n? l??E?,??hg[C[s????_#?P۽?r/?p4?<^7e?A-M]͹????쐥?E??ˆO˾????r?Xs?_M?~?&?1??#?=\($?JN??Y?%P?P?|T???d???b??.))?$?^\???ho??e?9?x???*foXQ\????D-CA?Ń ??K??1x?e*????(?Q?)?t??t??S#6????h$T[??? ?jGN???????΀ܖ??[vh?v?= ? ?lp???ґӲ?(?{Ҟ?w?Ѝ?` ++??R y5??6???t?3YD??HH? ??V#?A3t?Ѵ?Y IDAT)?Q??????PM?k???'???:_lؐ'|???'D?w?#A?????E:ױ9]Bl?????Ja??'MEކ???a???R? ?#cy?m??sm?????^?r?M(?I?L??S]?I??|??g?Q?\??%?r?g??o???֯?K?????z?ߎ\M#????᷿?-(#?? ??????W? \?o???9=?rs?c?,??I??y????vW9 ++}y|v???5?sH?f?,B? P֬w?8*?r??C?y+?,ڡ=ϡ???wǨs?J9????????b{?k ???Ŕ?]{?K{????Yl?+?շ???w$???>??ع??91R?Ɇ?k卍?????t{?O?????;o??L?????f?Z??4??^ۚ3g?ZԬ??j?Z??9QU@??????l??(??Q??$?g?(d#cii.j??_?'vxF????K?kK6^?o=#m?`??<%B????Z?V[M?2R?????'? ]?xo$????^\?t? Bwg???Rk6֩VP1+?lhq?X{m?m?fUiVxX??/?L???k?w????(?ؗꏃQ?\??3H?H;?M-)?P?? ??)?8P1?fg?g???ֻ??2??jc)L??tF?ܫ?p?? ??3;:?>q??m????kJ$????56?*???f?@?f+?????e??RԖ?y????"??=???f?լ??Ҫ ?o?#????!4??Q}W??wH?kj9g?Y^??lQ?Ʀȗ????9U`?ecQ?@@)??'??B?2Дf[?L-/??%4`?i2???? ++'?g??7?? \?????Y?j?[??i???2???N???J????407??Z+?ÄoL?ž-?6؏? ++3?6?X?????5U????C6K?????[???W???.glǗ}??Yvp]??f!?j?sԶ??SK?&??K?H?6??uo?nQ?h?fMZ???g????)!1@m??e>?X?a??@?B?L?Ŕ?.???]g?a?&?=ۛrI3?Vk??? ++W???ڐ???Q윫?~??jX1?E=n??w????r??????1?ɩ?qi???%?q?Q?|?K1?:??u?????S?gd?F?Y?j1b?əp??????l???? A?6????[??sm?2m?S?`?.D'?޷? ?;???z!MjC??D ???9????x\(?S?!?E?֏??k?$? ?[r?G) ????f?o?J????l???*??DםXM??H-?T?Yl?;D31?~ŋ'O?%?ڜc$v=?f2???+r??.?,k?w??#n"1???] x ?ω=?x?"????+noF?zR?X???Д?C?H??r??́????\|?????S^??s??w????tcf^ Q??g???w??}???5?M?f???????W6??X?B?wSN??.??3nG{?b0BLtt?'?g:?T?;?a???)?b?Ε?g?8q?F?)Jp???K.? ????>!?0lR~???|??3??3?????7?)????D&?@I???:??+ss@,???"??k?G???????+?[?D?? ??Y???-N 9?F?(?w[?b???`i?m???DQo׮9??e??KX?2Î????O?NiS:???EYmz?&{[?#kQBRJ8 ?YYu?˧?8?=??PKƯy??@? ++-S9 ?;$Y???C5%?f?Q?Z?. ubHt?`?5W???????V?,????VJ.͍?v???#[ z???yi??-??l?^???je??????f?Xg6Ϝo?y*x????5х?<{ ++3??x??7H??+I?B?MeQ?H??T#??e??3?V? f?#%YL?ҳg$??@?ʴOP;??????~?9?#R??O?67"׷??????Sn?]P?i?\n?df?v???_l? ++?. 3?'?km8?=???ϸ?_?????/??????_???yV?q? :>??1??c?3˚?aBKa?? bk6$??j?8b D? ?>???융??B5Y!?c??m*Ј?*ػ?FE?8C?l?Sm????9??J?^? ??'?a?Q=??̩???????G?^?QU??o??~?]?~q?t??"??X?A????9?́8 ??? ????????N8{?b{?q?1±??F?^?}???x? ??1 ++?|'??X??Mb+-?7y?1? ??F?? ++?um^`??]O???*?h.-???/V?{??1k??????w??o!7??????))???MT ?[?~zˏz?o??xuu~?9???????????????Êk`??????x2nw?O~?9?????g?k?(???????7????E??C?Sһ????O_???k~????矒v??j?j??喷?>???S??????????|?C?????ы?+J?.?vV?Uײ]???*? ++9??UiO?r^?ǔ??`??J???97?+?oK{?O?:RZo?? I??a?SR??]?Y3? ??|?bD%s?I?!Ї?9+?????? J?5?;[*??v??x??o???=????????ͯ??????????Y?????%?^?g????z?*F?ϊ??ɸD?CA?G??7 )0?d??[n??߾?dw͜#!ʃ̂w???k\?WI5?R???)F`?ym?????A??{?? 7[l+?J?o?g;VJ !?Չb? si??B?d@?L??Rr%??a???n(D?1???N?Ի.?+???????/\_??_]_]_]_???i:??o??;?Ӳ??5??n?d`YI???(M4Ք*??c?: )?ɚ?Z`?_2?????;o?g????C!??:nn ?5?E??B"sN?SZ6???k?֌?j?fci??D?N?E?C?w? ?E??p?ի?L/??????;?"kO??????g???%??{??ѭ??D)??M??6??s,L?????ْ.jKh?Ic;?Й͞??T??F+ ??????[ ?Y-6?]?Uu????k??????0Rc 7??Vf#]??BO.?<?K?????d?5??eX???lL?j?Qc?8a?U=?6? kG???`? wS?!UmX?i?dS?? j֫U"PXm? +a?0k??Y???????GA???3?lA??րXgwЩ?P?w?Nd????B?Eb?F(???iL?eQ˝??p"??Z ?? ?P????~?,M??G?I?(?j9?>?:e6????|=˶ȡ?\??J??X?U??e?b?]?f?ZD\?@XlY? ?х?n?()?@e? Mi/?5D ++??"?@>̼?yI?8zwBN???#?N6?ΓSY 9@?RA3?z?N?ۑ?i???\?cF?H0?b?+?!?HW?ͽ?F???&ѹ??)?O?g????????3??[?zq??[? t?)n?y????????y???ۿ?=?u?ʃ??t???g?'?s?lٛ"????IG??Й?n????S7(׬?ғ4?Y??????oHi?? ???qwM?J?M?7?5?>8?Dr.t?????S'\\\!???8; ?o??o???????Ϲ?/???{?;???????yN?R?1??q??Y*???y??B ?޻????&#??B YcNL?H?룻ˢ:X?aKn?*h?Sl?Zt?x?)?Q?ea?Y??7??? ++F?r??KUWѦ&\j??B???????8?aBW#e??3?L?Vw?Ym{?<)]7?Җ?"?!U?vH???U?c???brDKg?@?֋???\?????lMG?^?HÒI!???Z??S?7??,[?Y?֦???դ:\??Dמ?T?U:瘷7????Tr??^Oa???x$?`’b5I??\$D?`??S??\?N"?6? ?? ????#?? ++qf???n?d?F?Y??C? a`?:u?W+???&??????H??B?k?qm?ޞ[Ռ??Ҏ???+? 5[to???P)S???r?+??L?9'J??39@?%???????????p??????????N??㋏????G/???s.??????~?????????{?o'?nw?????O??S?g?ŋ?˧?q?R???@]?蜩  P?xl??3?B?tf*??{?셠??H???4Cs?y?;???CO? шȢl?8?k?K???v?+?'???G?M?F,?? A???5??T????2UN?????c? ???G'R?DG)??*-??th??B?>???'??k>?䂷>???????????~*]?x?2q??#??????w???:????<{? ?Ȼk????????*?7;??'{?/??9yp??Oo??n??;??:?~?sN=??7>????????wy???Dx?V?k?^-H0'-?P? ??6ss6??ш0f??@,#?B K%ϖoY??Ks?Y??Fz??ӌ#?????R&{?jI???8 ++?>?W%????7l?\???ΚƖזk!?l?`??/???l??,????MŠ-?????!?}??pqŰ^q???????j?[o?Ň???ۏ?????????o?Cܚ?? R??o>j?a l* ??[?p??5?[?q1???{?Ì@h,?????m??PE%???#{??yP??~?խzFў?b?ך}D??? P??2 @K?y????\?B??4?)????Ls?X?V??o??jJ????????=?JIJ ?J?^ ??c |?0ͥ?C???$lQ?V?z??#3*?HGrP4??Ĕ=yʈ?vbl+*SΌ??w/???b?n.?Nq???N?????H6 ?f?Qmh??;ͳYL?T??@??ZJ??IE?14֙???qw f`+??P??p?fb?????ŋ[B?SS?9?w???k??????( ++PB??u?E ?@?e?^?V1[???Q?͗?ބ\2$,???ZLi??]?k?Ґx?\??2I??*?1 ??nh??R?ls?U????J+N?2??N ??X?c?????bk?Xa?+J*/?by"G%?????C??|#e+??58RI?U??*F????:????^L???1?1??? _?ԟ???|V1????~@3D)3xgD?Z ++wV???P?>8'???W{?? ?_Ԕjy\U?? NY???]hDS ????X?azn??og嘇X?? V(Լ??"?V˖??y;!2?????':G??\j໫?*?3????棷Yw+./^7??g.?tBE8V?=i????{??8#Hs (???l??՛?MR?L?tBR#P?8#pΫWW?:???ϙv?q?gw?k?Mx? ]?Ï??a;R?:&ݳ{???*Ӹ'?JaE씜?{{V)???`{fP?8&Ɣ8?;????CJ?x??d*?]ߣ%?c?%????Sr?? ++}od?i???gB?H???"?=?W?? rPȕ??-_<|??ٚwW?s?=???????]????????G?'??:S?N???3??Rgv)S?ʔK????+???b74p????ge?=??Y?/?4??)?M9? #x.uy?'?l?9-?z????ka?-qv^Ҕ m?3BNV??R??????@ £{???7F?S? ?f_??Ȱ?؅?X??????Bҩ?????P?Gk?D?6?????SqW???Z&????-?ۨ?~?8?S??? i?7_m?Xe!s??_??o6?T??r??/?ղ?|?h(?Hr?z?W??ҫ?5Œ^?l7?Rj ??????Ri??Mn?}???{?\~aQ''|????=???W?????{?Oy??G\_~F????xuI???f$??գK}J{???^fA??c?HR?wǼk??y?fai$?y???[??t?g?\r+Z^\P?OT#iu?5;k?"&W?j?vc???Fb?i?v?0????T?d????? >{6?Oz?2??^y?? ???Ļ??[?V??g?G?)??@?{?F?s\m?H? ??3 ???L??*?3??"????r?????\\M|?? ++?h?݆:N?=8???K?I????????A???x???????Qʞ8D??W?R?>?y?h?X(?9_uՀa'3R??KP??ҜY?"???;?ȥ??????|??P?Μ??ڲ?ɈvMF?o???_sz?M???s????A?F@ ???ki&?8Y=Dj????? \J???9?pb$0?Hu??z?n_?}?'?5o?{??/?0z?O??6?{??~?????7ˊ???(k~??眆JD?Jgx7?????e F??Y+?u?bG?L?M??S?"??1???y?"1?TI#?0㝐??HWJ?UM?fp?7 Iŀ0W??(?6k?OG΅?j0?:??kdԍ?}Rm??Q???}-#?S? ??Nz$??N!?Vk??2???0?)??o??????ӕ?͏??? ?k?O? ̹"M??Si$E=?Q?31*?R? ?m?H??.?V?#?Գ????kN??'?!?Cgٝ?Qj?+? ??/?q?"??b/bG??H Vx?g?]?)ZpE蜽?8ۓ?q"??Z???9˩???8OhD?ڈ?K?7m?.??]?}G?c]p?LSn?+??r΁T`?,ZA*N-~G??b???:??Y??z}??????????_''????=>J??Z?|Sw.?S???6v?6?M??ִ?n?8????8ۼM?{_?쇰a?\gS"?? 4D??r??L+B??Ҭ`i??R5?????ցi??5?jU٬?\??s??ܣ>|??Go?????-??idzg7Hx?:?8;{??M?Qv?y?S?iۘ?j? ????z??j??4[??,B??OZN???K??[?y Сw ?ww??4E?5??;?Ɇ???֘?[z??:υEm ++?~?Avp?\T>m:l??z7x $?؜??? ?2f?wy???X?Bh6?8Gv??G?? ??ϫ?*?? ?BAC?2[?m?[6V@\?NJ??w(? JrJhCj?[A??O???l>??????C??)5??\?1'??6?w???r?????5??L??,?]?Ëk ++c?? 0n@AnJq??b?y??9aP[6?*??????}h*????V? ?o?3?ُ,c[GKq؀?ZHumT?X?KU=???QzT{.?)^?s?;U????7S? ?^?h9?? ? ?Y좳֖GX`?p$???¸3??4? 9*3j.??-G?6??{c62?? bשּׂ}??M?g?w ??hΦ?.?s,?????y???; G??kv:?F?0?Z4B?J???@1????^ ++Ѕh.b?l??yr-?ɵ??<'NVJ??????Jxg?{ι?j?Ҭ^?s|??/?sm`?ڒG??+?9??^?䵊8?? ????TaP?uꖉ?B??,t?Q??b????`8?3????H>?6Ѩ,? ++M?l?~?S?ٖ?l?˺????!?,y?6?2{??}???\<š/??-??+fP????x?-'?n??}$xJ??J?쑪r?־و??|G?r˖?T??%sSA6R???? ?0??G?:??y?a?????~??t+?? ?y?m[?i}??[?.??? !??b$ g`????Y?N8?f?&???Z֜"f?ژ6 ++\??w>???????Z???8 ??Ysyu??F# ++ ]ϸ?Lɍ??g?T?ܻ?????????[?PS$/?o????ˀh?/d????/??_݋??????iQ?i?,+?w??*?? ++8?Ԭ?-?4%|?? j?m?a ++?`CbYQ??Tcl ????Ơ?`J#Y@?LQ??$t?ݚy??V????um?6?=?ɚ???????? ?6?? ??%U ++a??i??oy??????&2n\`?^qs?????????_?#?42???????w??>????ӇLO????_?????a??? ot??(?N??????p??I???|e????V?jV?U??=? (۸S???)?s?t????????>S? !?r????v?H???3Q<'C?! l?g?\???.?#Ku???U?????5eDB#-???mVW?B??xo?hM??Ϯx??C?K̅gw?7??.????o??????????i??a?xqý?a?f??\鉥@? ?R????LM?,???- ?>??c? ++?>D?5no???7T1?kw?"?$?lP??&L?C?j5?r?Tq??S;V?????l???8D??p5cBO"z? T.???ٲ??3g?q??qe?}??p??w͚t?ӛj^??????n͕⛂3????Hj灑6??yRg??6?Ru??To=?????jn*??8j?V???$I ?d#X?O!???f????6Pt-/?z???+Dq???}??"c. ??h)Fh?f?? ??1nt?f??q]?KjTj??W?Д2E*??Xk????K??Hp??+i6?aJ ? U>T???e?xﻏ9w????L?????????Ȱ)?Q)S&?HX ?\ 1?a{??K??0? ?lOs? ?C??1??z??6pWs-t?????\?'/??9??X??B?a߳J£?????7??%???~kq?̛yǚ??zH?l?r?l???Y????7?? ذ?-lIV???nvUW??[w???{X~X;NV????*uo?͓?c?????֝??~y?;?>???%Jo? -?9a????? I??^? ++? ?4"??3N?z?8y??W!??on?j25?1?Oh???u?Hc??QE?RZtL?5[]???4b'?{?j?z??B??Ǣq?cQwIU+?vJ????a?|??K?u??? ??=????ɚ??Dq??يx?x~s˳???7^}r?{F?#??jjdH!Q?qtQ?y&????[6??f?????>????:?????=???5?֡????[???2 ??뚛q??*_|? ???݋׬?'?:? ++sRӞr????c?&t`׽`ws????8b??r?t8????t\?[ζ'?NNs!?8y??nLlֶ???S5C)FN?Q?}?#?5??G?L3??L??? a?*???IE3??\??Xx??E????5?{???Ӏ2"?)?????~?). ?mV? ???FW?!??06??g6;??f̀,N3!SS???Z?d,M?-?ŶT??+?????L?0h?A??rI?LH@??S?b??J??Q&?v,?4-? ???i܃zj ++???.t??ޡ?I?L????J???????*?=? ?8??l?q?'W?gs??l?r????X?ֿT??V?zS?9o?e#???:$?;ij??TM5?7?Y????+???J򰄏:?????`%??{??ː???\S79'?E??О3????Ya???????lB??k???Ӯ?b?*?gk???70-/??j?Ӳ?E??HQ?|hVUj>f??.x?Z? j? xSQ?:?ߵh?4?B:.bNk콄??i??????z#????kn΋2??y쭁??L??????u?%?ޤ?q^??e7?f??Ir|'?s Tn??T?!?? '????c~???f?9I$U?W????a?>?`vS???U流SZ?l ??#/?>y?Y?q-?±?_ٔ?.?[ ?kv?Αӌ8???+?&o9?E?n??ڞ(??l`?#?ޑ?)?l ?Ί?DI?r????5;??°C?????0?d??? ++5??b???)m??m??? ?HҘ?_??zj??8???5埽?*??ZOp2??Ϟ="MD?թ??_~L??????A????Ͼ?z?"?F~??G?i???C???f8a?? ?????@?&?.0?#R??lV????i???t]͜?y?w? ??????R???p????҈?F??hTY??j ++}?4[f???EN?Q?B`pf7*?"> ?\H??:Y)???鄏P?oD???,?%[ g?o?|????;g? ?4??[g???œ+atV???oZ?? ?Z????`?u??r????z`??R N?TP?#???:?i??Վa-t???HF?2???e??tãH???????;??I?=?J??K?/B-? \?????O?o??Rb???_~?z???}?-????????6[psj??6?9!??w?*?Xq?ιd?-qj`1ry?f*[#??W?E?-??f_?a?,?Qv:?h?[?X??{??5K?????Ί?ÿ??s6?B?#?Ry??.>?$??|`s??_?|œ?S?b8aw}C ???N?9?{?9:?x????X?q??Rs????o9[?|?I??q?ͮ??L\)???翻%?tsΔ??? z??l?hu??&??958??2??@i? ?4u?!?V??!6B??Nf??uXqĈ???D?35%?W?͡G,O???x?Zn??{?H?XQ ++M?as )jgg[m??8&%1{???~????#????y???bw???>??? n}$?1?,~?5?f? ??8??;!??? h1+Y12?1R??--_?zZ?jV??1H??k?~???k?[/?i!? 5?0f??\??????h?G)t?????[??DE?!????_?7??7?7?7??~??, -,?/p??????e+?H????n?ol??9?aށz?zkȧÄ?????Y??Q??\?0?F??6?G)?LY?F\?q?Rm???,?γ ++?Tf}??5rq????|g=?~7?Żs???w?^U~???)?sz" ???"40iy~????\???|r????F` h_XF ?j????6UZњi??M K?f-AS?b????"???y?vuQNH??, ?)J?n??Zi?dE??? ???ܔ?*??? ?*?6?\? 0???Cs?B̎c ?P?5[???H??H??b??voC/(iA???@I??܀???t?\?A??.P4?6?+? Z;j?Dq??X!???b?!x??u??f×2?????$?՘2̆??)S?Ř??D???? ??qݴ??V??f?(??l??+??v?`???????P=? H???H???????p.Z?ۉ?,??e*91??T?=@??Q???ZQ?? Q????A)?P)???*7Ms?v;?~?wh?&?.1???ƾ\є?f????3?????(?Ζd?????!Z[28????M???f_?-??_r,?f???)?Ji??}??f]?>??a?b????? Xr?Mbj??]v???d??, ??)?1?Y'??-65"G!W?? [?z?[?w ++???R-??????N?@?Z+q???Aʹ?6?G ???"?EuLc????(%?4W|g?S? s4u}???Y.?VrQrN?V?>۠???m?5flA??P???FX???+zu?aIM??? Y? j??_?q_?%.?3K??3h?;?;???s{O????vv? DK??&P?o6?6???y5?Ŕ%;???l????J#󘸸z?ag ?j????2?,?}??????p?哻?ؾ/@g]?֐?0?L퍸?#640*!B?vv*?5?:?S?\pÆnX?:#j?v?f_r?[??R?ȋ?{_:ę]??.s2D?►??,?uLw??ԓwz?YB???q?8?&d?ـ?̲NK1?????? ?gA\?Qg???[??2?U?޻?⹯S?9?dm?q?u?)???:V?f}+???5x\???W?_*?*f???Ⓡ`5?o{!??w?ݼ?n????Ԭl5?.???j?⋝?(?v?{Wk??(?]S??G???? Q>[\???;?u^????s? ?fEB???~|?H??s??t???Ww????б'?'? ?m?̓ p?j$????gϢlwtdZ_R ]ǫ?=?0????e%??y?:L???>D?? ++?8SB@???B`=?Úo?{?????3v?????3???#yL?] H??? ??x?Y????|??z?{?6߂??.0?'b?V+?dd?V??̲?)?[f{??CAߙ??ܦ?v ̨*H?FK?\-&?e?k˂k?87??>?"p??w?????.??G?V??Sa?aLm]2m?Q???݊?M????/npqM?#O=b?G?.?H??w??8e?????/?֣qwq?z?f|??C`?a5t\??ٜ |?????!O?z????a?9=?lj???????zc9?xrU?? R 1 ?w???J5ry[???Z :???d??8???r???daf=???q?V??>?d??Y,T?M??ׂs???F]? ˬl?2????0?=?Tj-?T?c}?;?B????a \4????8?u?xO?R?H??HG????݃??&??M-T_p?PS|TO?99?%?`T?????P]6??_??l[?v𴙰???d:??b?j%[b????????wWlN6????'?4??+? |?? >????[?5??-?8?????A??Z??K!@?K?ø?華??ڀG??Ȓj?վ?)? ++?` ++?? ?u??????CH?Ų?>oQ????}?S?.??@???? ?*???Ζ1?6?ٚʦ?[??"???)8?Y[z ??d̿C(?& \V?_Q?v?e֨Z?lm,Um@????˕ L?oְ?h?J+4??Tі=U??Lj+???H?1??b?i?R?TT?1??&.?????31e?c,r|~?e?diV?`Mb?rT?i?0vc?)?x??w?bP?!?#(x#1? ++??C????7??Rl(&??n j??????m?#? ++V?>? S??l.??5ЬfpAhҰ6???^?z>??Ԃ???? ???{??hQ?- ++?6\+Z?nM T*?f?'?0"r?{?cJ????,;?Y?_???~? ???'i?Fcd???[!?Fȓ"?2X??V?꨹?????k%vb?M)???~???yb?JX???N?8SE????Em?rh??b_][???E?~7ty?*?Բ'??+?XS???????|Kuxo?NUU????$??$L?)?M????\??Z?s‹?\/8??t@????=?}!hF]???(b?N9W?%S?)F????\f???qM?Jc?.?]?YI?*?4??;W?B??m??rZ?zS?.???s?G?C^??%aA-GU? ++???뾤? ?l@J?h1?8prˬ?3?#0?2???™E???F?o??m9??2'k?? ?b??*?????g??*?}d???ө???i?*`?-?2ٖ??v??羘J??{??.L?T??̰?~*m??y{悑?\#8@;3?>v?٧h?)???R ++.c???q?7<;9?[o?z??>'??6??0???? ?>?????,.ۚ{? \??K?K!????YC/N????9ZA?7??W??8?ȴ??d?c?a???Q?? ++Y??`?N???jj[??R?і#?x/@S?MqfQ?5??Y?Q?r{{???#??31b?ڳ0b?4?u)?Y?:?quf?>???ç???w"i??rw;?3R?۾mA??????Lg????Nq??n?t??o>???.y?}??v6+}??????-?Π#1 ?ȘFb?p?-GG?8$4?u???V{4R???Y閳?R???^j??Q?B? j??\???QC'?\??E??>{?:V??????_??ߘj??xf?7?S?gm!?????? I??&?? ??'???,?m,?ϯ??؞Xݯs???cz??'???'?????x??????_?y?Oy}???Վ?? ???D1g[?f Wk%?@ԎC??[o????;???????=???3^~???w????;??jm?;;??膈?L???+?T @??C?H?L?e??9"2c?Ƀ???\????6?^ x֥??ZZ??q?Ns{?Z \??D ??LIJ^)AM?h=??DžS????V_b$??\"0????d? ),??cm ++?Z??*ع???????S$:?K?`??kٝ??fM?)?en?o?9)VKj?8??v? ++> ZmY*Ah:b} ++N"?f??;? ???Ն??k ???R ^??ף???=?? ??GͦB!/ ++WA?( ++m?8?5?\v???9?'???3??#?5+??,???:{t??Վ?8??oC?]3?3?;?~͖`?G Q?yf_?G?%+??@?֔0???)?@?B?=?Cf?ZU]??ω(5W$T?w;|l??R???o=`,t?OF??E???T;?]52????:???>?֧???H?QV? ++???S?\W???ه2?D???z???????U????"?ztVȩP?k[?G?"n??F?2???@?j ++9?36}n糸l?휈?7?????ѷ??[?E?9Ɉ?rkrRjv???V?lX??=>??E+??V:(?[??g?W?^ӹ??e2s??x}?v3?yu5??њ?bf?u???e?z8ݜR?^??2??)R&???s.?_qw?!???П???߲^?p"??N??&?d>????????cޜ7???k? ??Ys?r8Un/????>?41?ny?}?'??HJ???z??????痟??w?OIº??S??2N??!??g|q?!?'??Iӄ?[^???W??"??}F?7???,sP???d?x?9/???9gs3??E?V?b~??yO?R?^_1?wl?{??|??￉???PXŁ?o?2??L3??>?{'??????xg?Cc?[????A?p?a?7? ++??U?=?????? ++uU?? ?ش?50?}og???-%gv??~|ɣ?'|??s????d???o?w???ן#???7??g??????摬??f????o?K!??>R??Z ?R??W?2so?? ++?.S?\?[?M????(?T+!DJ???9?tβ|???~֮?K0?=n?&:G?v̓?)N'~??3>?????swq???O???l??-mQ?ku ??>]b?j)ߙ?????T?????v?P?V?????q??J?r$??%Z??vm.bQ/???^??????>w?1??1??7;U$?+Ii*?v?ԗ??p?z6?@A???@?m ?Ԛʚ?%?t??_??T2Z8?ȩ4kS?E?۰ya=O?UU?1f??C?E6 ɲՉݿ"H???fy!գ???Z???G[??ڰ7!xS?Պ??\+?????EQlC^S!? ?? m(M???&??YX??T?d?m>dn.'\4uL?????R}?? ???fy?'?????9??l?zgl???N?-?R? ?? gSu?Tm9g??-???g??/9??s??zߜЬ˔J???5???Z??z_??/?4?Y?K??+????)?LQri??֊?rUi!? ++̅-?L??,FjS>?M???bDk???? ++h? L{???YВ(UM}??:?????,r?M?w??C?U????/4K???~?2????????QU?[paE? ?=?4??m1Fm@?P?b?'M??-ւ?h??1Zl?!t?>2??s??q??m?Jcqf=???й?Q????v?y??O5F7{i?|?W?????G?#???=?eߑ???`[?????GZWod?$??UG?lj?????|O?????;??l??];%l:#??%Sסl?^@???0f?r?j v?E?(?ׁ????3n?_?????(?y???L?WM?AQ??t7rusK/+z?QKb???U??j??????\F?<#?????ζg?? ???X??~??_???#????ϩ??x??.????O/_R?L?m@?v[?)7????_}ȼ??]????W ÖyJ???(???+?u?ps`?'NN6?޵????k)?,?"?}? ?T6??9TN??????xØ'ƫ?z????oo ????5U???MX????yo???4'?b??V???8ն?YQ??6\]89??}?]#????g?nnn8}??/^2l0????=Rg??ıb?Э3??̷?iG? ++|??ԙA=?*l ++\??3??z??~?%o?}?I&>??#?e n???M???c??(?e?X????krR?]??? ml@?gB?L??xy?ɳG??+??%o????6?9t?ae?tW??B????t!???.5b?RJ?j?M%?R?9???t??kS?C?L?ׯw|??????gs? ?? ++?G?'???????цiwm?x?u.R?? ???Km^??????걡M?I??:??VG?L2K??~??DZ ?,6#v6r???uIw?fń?V???v?qiS???@ד?B?}?ݏ???_???#??=?ʻ?ن??Q?yb??!ͬ֞?Z???P????>{~ɦ??'?????qu9:?w?z????~{?????>??In?L??ݲ6?l=*1???̢5??h+?ԆG57"z IDAT??F8gLF'ǹ??J?Qd"?W??=??US?.????J"????f???bMM?-??4?Zh?3?vm??????G~l?,?? /:?1??2p0;˲l?0??h???Y??X#?΀m?s[??҆??բm?mj9?R??wV? ??e_??{? cܚN?_????_@?A?Þ? Y?`?Ė?i>d?rC͆?z?(?????1??B?FӤh,h?p? ++.W?s |?S??=??&?S$J?????z?x?Z?D?G^? ++??,Ǧ?0?f?f??%??#q???H?g?<@???*Do6?Z??b?ը5+????I?؊6hl$?bxi*2??fT? ??`???Zk??dj?#p?fC??? ?P??s#??X?Ӟ'?Oy?=ew[?:e:$????1???W?????m????3??hGu+?f??+?????R?>8n??????????ۯҎ???s\_xpzN߉5?Y???İ??ww??+] ?fzt?8?j??;?xg:?Hh?q???4Y??w6<? ٶX??jcUo6???+????Ҭ?????cES=?y?%%???[mH?B??_~? ?.]d???Ųv՚g??L%?J??F ?լ?>[[?-Fh?4?Ys)???W- $m??u4&t????*1x*-???*vVJSm???m?f?]k?i??ݻ??v??'k?e?? γ?z?=jᰛ?P???w?Ew????3????W{^\?b??=???????????????~?O??O?9SVh͜?>???????{ ?C?(T?^Q?]??ڙ/??v? ?j??? ?Z&?NDq??\+??6?,>iD?`vm?c???-?? M!??_s{?r??5?Y?bZv???wK?$?@?bd????<`??h*$??g?i??? `w?p??ps??u??????>????????=1򐉈??%n!??(?̄.b?̑dTJAgo,'???/??u????#v?r???^???U???#????cJ3o?i????E???3?ΖA<1*?B?G??r?ۅ???ׅa; ٵ M#m??=\??FT??֤??Ubs?>&?; ++e?Tr?A?'?Gx?????ϐ??J6?????.??Lȉ?????|?%??F?yfv쫆?|??13?"?lY7s??`???v?4??I?v??J?Ql??ѱ7?? ???7%?? ???w????smh??XXw7(? Y??6XJA??nW?e???;?z?'????o?b???sz?&??>?9???"R??A??????։V??Eڤh?1ᥴ?????Fb???;2u4ш??F????.XbA???nh?,Dف*Ck??b#J?q8????zipQ??t`???jf???v<}r`q?h?g?8?f?Nq\??,??V?e???$, 0??;?ޜ???m.?ʜ G???k????f????Ӌ?d?d)?? w?]f?? ????c?1-?& - ?gm?g??XK?q?? ?t?׎a??-i?L_??+?A?Bkj3 3?H6Ru?Oj?n??[C???pϫW7??L???:?a??JFV?l?s???3?k?????z}??/9??wz?r?yft?\]??L????FN?yPZ??b???&#??P-y?Ԉ?z??)???gN?Z ++???lO;4?>8#$s.fl??xr?n????o}?y?|??BUa???ˏ??Ήn?I???ޔ????U????????@%?A?fqK?`?;/8?T?k????!??$t????.??Ԃ???)??Kl$F?5?u???%??Ŕ?????'3dqu?m-V??-x?G?[@???HPr ++?ٺU?@fioݪКEN?f?q??]('#?}&?F??:??K?q述J???kJ\)Mgj1??HE?)??? ????$"??P?B>U T??*?? ???'?/&??_sf#=I??U?(4ˇ#-???w???f1?`ߡT???Zw*?$Wu-]ş?ȬFT??)-??n??F(?F?Lk?????JRBgB7:S#??q?#b}0??e1???A?A??\??\?U#]??U?I%?@̉??)?%????f?e??֔9??`?;??ģ???̨4?? Gҩ??? ?.?p?????]^e?? h?a$???J*???Щ?!V?vț???a.{???J?~Ŝֈ?݁?Á?tAL}?I?C%#U쾊????h???,?ps??Ǭ/?ɑ??r?%?dIP;??????? -?4?5>??5??Y?s????)???r7fb0]???悙a?ރ-e???L)bc%?? ;.? ??~???쇉g?/?NVh-t?[?n2??h?RHI?? -&G????ıS????X??ġB\?}6P?N??U?NCZ?F?ΰ??/'`??[?֔qht?\Z??!?`ĠzG[?0O?yb/y????|??gs?7?㊛?g}???f????|??O9;;E??%3?7|??ߤ?e7̄??ُ???÷?ʼno??k????{???????_?L????ݓ?6;?hѩ??!?o??b?T?~?c?z^>yŝ?h?y??T?<a????T???h???t^????Wȩr??LS?իK?F??H?J????f?>?w???t???b? ++EI?0*?/t?????O+?v?6?-} :J??Y ќi????2"245Ѡ??mg{????E?g=*?(0?h?jnMi?U????$?(î?T??{-?[0k?V??X??,zE???ju?2b.????J??"?6bѷ?$@ktW&???k?$Z?w???`F?nFj@?@??F??`n?????ṇ?9?l?s??HUj?????T?ÆU??\4Ҧ??b?}m?%梄P??"???/?N???????Ƥ3???R?K?y%??? Ɨ\\]Pt??d???+?϶?6???=?????^????yǓˁ??i?Q??u?8?????d?/?????9???W/y~u???!????s?Qx??)?i?Ț????of6????7x??SȖ$M)ٷ???xU?v??&??q???{?xpJ[??%?Z?8:3?@L0???iOә@Db"6????R??`?&?h?? ++Ғ?w??C? T??[?F?HH??? 5?????_1?̣?N7?=?????!2Db?;??GC?EBJESB?@j??hkt93(?P*1&JU?W??b??R???iF?j??2?'????(??t?.??? ++??z?:??u\????:GBn?JJJ?{?xCJ??Vb?l7?g?\?X?Z????Ӟ?ٚ?I??[o@???\???|?*?hU?Ն?U4?褗?? )1?b?(?V`??c?T ?͙????^?c???b??'??$DE;?E?@??v??v?E,r ?r??ɤ ???I &B3?^JF?.?]?Uh??D??m???"?H???@???C?"⬷ "Չ?X? wf??7???bw?h???5#????Ȇ??|??EmBu?8&?f?W???(????X???????&?IP'?9?w?wbZ!?B??B??i??@l#?????????0?&?6r??az?d{z?tP޸?e3?\?if~??<~R*c)Ld\?8 ?(??4?#j? ++1???[g??f ??R???6????Z??eH??lg?)s??N?P?I?6?@??&????:ʭ[(????⭿?3?;Ƀ?K?ن?P'W?/??-nh?w?y??x49?? [?$???Bw$????H?s?v6n?VV?? ?#ĥ ??????I\Q**??R? ++??"???9"?Wc???ȫW???Gw3R?? "E3?Z?u?Y?Y?[??,?$Q?1q???????"I)ENNN?ץ?J1?-ѭ????:Ө?:*?Fl}?ַ?8̵?D4/Ij?mQ??.??\? ?"j????? G")x?P ++?Q?F?[????ߩ?-d?p?׈????????|ȧ_^?YwLe?t?????*??4f??O??_R?????T??????ψ?FQ?7iǽ\u???޲=y?y7Ӹ?'{??ݽ??>yΰ???7?`V??????????;?????C9????4?23??^q? ?ԑ?:޼?Yu?~}J??7?|?x0Xk??8??{km???@L?8? ?N6gf????Rm?+z???h ??f?L???[a??;qe?B?%?,??!?+???!򳏯y??;<}??????/??)#g????kb???'+???(p?|?j???d.b?tq??ͫ?V??p??R&????e?fV????'???Ϸ|??s?g[?????_ox???????? ?????q@?S??O~?o|?C?||F@?? ???M??ʟ???囿???/.?w?m?ܨ??a??????-???4?N?0?w=W?H??X???>Bk??? aeg?Y??+752?H)??d?? &-??a???(??????{????*?A??r1??i.?<:??r?H??,?W?b?#]????t?&?__???ׯ?R ++?dwP?X(22NB?3m?㤭????e??k?\V??w?u??)Z?z]?^u????(??yy?/?9[?~?1?q??q?-){?̋'????%?NO ??u????">?o~??s?-?¢?w=??@$KA&??jy???K|؀?Uݱ $??:U?j???V)z??BN?˅??????M?b?Z4Ro??:Y?km??A?:?d?K?͈+?9?:Q?0?~hk?}??Tj)?*??? ???ҿ??\?D???Z0r|J?H?J???*?IԢ?????YA?!???df??΅? @?3 ????l? !:?1?aȋ;?<,b?@Uq $DS??d????? ҃4???Le!?X?N0e{*?V??? tFj?Z??@???m?5??9???ťbq?1Eh?`???t?b?$F?&k뚄??JZa???+,VXb?˙6????)?.?z??b?J _??Չ0????g??<ۻT9?&??}/?`n???b??Y?%! e~?ܤ!????;-k?1U?y??m??"B??!??R?1R?d?Om?f???{hS?>???!x??d?ZH= Åpq????????z}F`6!Zה??72^?1?hbkp?F?}????ji ?R??pM?d????~[?,?j?is?ݦ8???@??7mЂ?$_OUѹ90??I?,????%??s61RP}s?q???ϟ?hX3??~?'?[(???C???S????F?2?????7??~?KJVD ?A?v??6Q??MM??-???i?E?[?dE? ???"j??kհ?z?? ??,VS[?h"?Z?z%?;E?e?j;?`?????? ??#?#w޼˦??? ?Xhu?_?Y] ?I]?N?UV?t*????ٜA)?K??????{???!???????Iϳ痜?5??c~????w?????Lș ևռ\?.n??f???> ?????=?x?ų????w?䣏???w!?c=???:?DL?Ld!????F|hSZ[? j1Ey T???־?lF]:???Y?l?? /?1?€?m_1??? ??)?h?????Ő{׆}a?U?Ժ?E0LH????|?????{?nMJZa^??h?y??Gps????·??????a ? ??? ??n??`?"??O~?/????]Z?9?n?y2???e??%/ɇ??ҟ???d?r?=?g??1???w????ʛ?1??)??YM R!??UbMl?O???7?&???1OF8/kMk? ?????%ڬ'??j?ȧi??0?j?:???2?.,?X??B?F J*??H??\??H?{w?Tj GWS?'v??? s5?_?nY??M`?????9n? Mv?%7?? ?Q?&?S??o(9C?Di??B?Z??f???4??[?ipڂ]?Ԋ?\V0??bs???BT?Rl,х`㱒?n컞c?cy??,~??#B]:??6[+^???E??c?֫?lJ% )?D?)[?P?9m??J?W?پ2??s\??g?& ?Z????\D???????????ߖ???5?Eg? ++}??w?ח`p?̥ҭ"?d?? A?????і&???R?K???y????Al????? ?????\A?JN=?D?f?FX??c?}?AiͨT$T#E?g?PYDW?t?٩X! ?\ͽ? "?\?1V[?k?cH?0?`:?{??i?S??lK??U?j??H??????Q?gZ?}??L???F??!5E$?,?E???+0R["??"??m}k?1?H\??y+??Ydms+dV?????0Ný?_!?0M? ++9gj?ϟ?]g??????>?ѥ?aP???;??§O??Ҙ??֕?mfy??[???B-l*?? $??!3&º?㊫???℁$aP?g?}?????#A???v?Sb?ٳ^??:?F"S?ˀ2??˯x??/n?ؾw?<?R?????W?톷???g/.?????g}Gz?É?~?7???.?z?;??SU?0ҫ9?V+sNaDs?ρ?fv??I}??(??H??W#!???p???? ++?fQB(XQ? F?BЙmN?n;?m?????0e??? ?X9\??[???6K9?:?Sd.?v+????q??sm??fg3?????G? ?E ??qqb??"UDTt,Q??)?????'??U?@??;c ??o???:??=???c?F??{L7?د???#R8e??a??>Z?<_???L??1?`? $%L#%v???ds?.?6~Dr?d???F??J??0G??<?#L?????~?3hdwB???%m??????0???Z%???'??hmf??WW?duz???.??n??n??Ҵ?`.[킙/?^??CL???u?TYm?cV?l?#7ہ???f?qʀ?LX?BJb?%?_?j?R???m?B??7LԤs?듽??k???*??wH4Q??BE???$?{???R ?%?y?ư?ȹsx?9 ?GApmV??FK?PM? Xc ?9rx?g?IL?SH?^?????????t?&?__???ׯ?/ ?ǚ?f?c??@???>͂ǡT?-?Ɉ??*!76yý?¤?ȔiZ?V???R??Ͼ?fT?8?9???o|????~?d??H?f??O~?3b?7+ș??g?$??G"M?%T?p0?bl????Q???N '#-^?6??,? q'G?g?6':?Tber? ??j1?JD?"?f}?v,Vb??)?bs???C?-??B?":5F??!?? gK?b?q?12??%????Չ ?pר?l?????~ʲߥ?%Yć?EE??ܱ??d6?U?Т;C?{Hk?_gvӄ?E???@??x3ΌcNp:???҄?|??8??a$??L??#k#??M?g??1bd?9t=^H??j1?K?VT?Ń???[℩?*F;?[v??=?)Ge?;??{??'N?!???s?,? ???V??????ѝ? ?]????cW?.?΂쳨????U???6$6???=`??V8ɏ??Rg?g\4?>?ϠFh)??6 ++?@m&^?_?[?a?:?r???*;E??6I????p?@v?%?3`??P?J?z?\ ?M"??\sZxG???2ĉ??%?JQ{f?DS'v??6ЖRI}t?3?vR?ANUe?gj???F?O??v?FV?6?Kef?u???j?δ??x[QBD3???*??]?9?0??? x$L֗?o?N~h?8OW?H??m??k??xD??>B?$j)?,?Jm?@?%?+Pg?YE??sБl?1?{i?????_?j?i[?Ԣ{??? ++]?n?L??*1??M???A) ++Q?z$??????_??a??ij?zz~??/???{???Ě?yO?֒ëh????mR??z`?wT??Kb?[??\??g?x1g0?????z??(%Z???9?<?v^??m\???Aj??'?l"??`?{??????? ?Z????V!????*=UYeV?o? ?.?ނ?K$?ID?}?K?*u6? ?|D?/?N`?`??"t#Wm )N?Y힖F??0??n????,?,lhs!&??n?LӞ?V???6??L????! ?d??ڄ?????3E?>E???)7?+NO????o}???_????)X?c?Ay??????{???8r?W?WLse&n>??P???p ?2?)?;a}wŪ?h???k?>s?f"?sjy?\"ZM?p!??H+J???e?????P?ل-A?]??e5???D ++?e?p"Z?XUse??? ?Y?􏚏fB?uS-I !K?A]h?"??_??Q??_?????????x?EVHl?2!Q?W'???n'????????I[A?iw???ۏ? 5??D Q|??)????ID?G??d!??R??N????G??1?????ˡ ++??ե???S??Y?ܔ????z?? O?? ?F ++M?????a?II $?lU~NZ? ?Y??W?1QYpw?ۯ PWZKD1rm9#?>?^H1??&????-,???ΉV6A?l?L1??????hX??r^gkbJQ?L8 ?|w?}V??5???7?@h?mB?g?i,??<#????????s??h?e???M?К ?"???,HJm??E??t???f?&љJE?L ???kP??nw???z?E?Qj#H?@#???? ?[5???;]??%?q???????D?J??W?k????F?&??Rd???Ʒy???8"S?????m(m?TK.?։:G???o:?q!)%3!w?U??????{,?!?s?????"W7?7|?N9?}L ?v?y?_???78????%?F)??D?7h?\]??uy,|??o??~? ?z?/?}???ߢ?&?H]`?dN$???ʺ?~ ???E???|*? ?n?P9+J????3?&??U$Z=?y??N2??x?t???@??)?)?FK?E?;?b??O8??4?c???h?j????z 1$?]??v?ɢ?}]??%??MK??˘,??NzH?uK7????????a*|????^??H?V????5?4WVc??~??????S?????9rL??4?S?8?:W?]???v??o??????o????J|?U??@?[4????????????)?????g?#??n?2%T:it]d????+@????{?ӿ??&???m?SS~ ++}oѼH?DO{??;_??v@HL{%??K?8??X-5??Z\x? ++4b?U???B"H?Y94-? z??0?Mr???Z 9?V? ++ V=cr??8效??uUx}??? ++?y??,١-b??σa?shtA,??(?????)fj?G?.朔?(??VL???????r??^?????????+??U??z?d?US-?!uB?bM9?7D;??????H????偳?޲??#????:\??~뻿C???.?? 4?8????+?Q???b?n3???1?gl ?j.QmF?"? *?* ++b??Z?Q?Y??(??#? TrE ?Y??ZM????7csк㣙[N]?zt4G7'???j:Ai?A?E? ++??bǿ??Y??rb?(?M ?$,?kv7??Mco?V.??愤Ec42֝W?-??r????S????@?@?h*?%T????{s2??@ȊR????????`d_s??QK???'͉…?ş?d???&???%#?EH?$??wކ??e???.? ??:sc?T??3??? ytt??g?()???1F???ܨ? ?p ???u??tT0???6?yv1???B?B ??{s ?3?!??6=????w)??{?=֑㚡????aC?Z?K$???????x?v8?? ++??????>U?{F\?!v/?RH???=?ze]?գk???-,?? {?O~?:?m??????+m????????G?? "?????1 ???s??F??<?v???F?????Ai??rjD???T{^T???????.ci??є?+TdEL?\Fr??xq?6w?䠾Dh?? ++z???Fsaݔ??%?Q??Bs??hD1 ?E+~Bi,??? ++6?;??X=??<;>쀙E{t???0?zu?E???*^???T????.s?ٳSj??? ?-???????'?{??z????/??B3???????(!N?f}۪?:KR?/<???J?ipw??"?\\b%>hZ)?:??/`????@H_LLR?V??????-龖"???x????p???????"F???"??db??3p:?r|&?Ɲ?+D?퇏x?? ??(%A?????e?+????????;gҽ???3>????? ????>???'(?y??mў??vG.Аhi#?haqF?*?U?櫔?d?*??c??a?w??=[4?EE?+V??ȣ????̻??c?y?i?)??3??*:????P??pyu?ūO8˅?Vy????@#v??^]_3?xc{???5??9???M~???z?&?1???͡!)?g??????o??U?|?!??Sej??e?ﵟ?I ++:6?Z8?Š???R?j<??k????r5t\\z??o?m??6? O:Bpצ??????}?x???Eb4?????w????gY?Xo+??%?|>G?P??'?q???u?G??16+a8??X?L??=?{?y?f IDAT]u?2?z?/ ???ɧ1????(Ĥ?_L?i?;?????{???\?????%B?e?'?:?CG?3?q????c?????>?z?>%?hM?4?i(?f s?6?'????ǧ??0i??k???u??ZH?p=)7??????d??B?#)?>+6?B:?q??D)?n?fj??B?M|??R?????89_c}???}FD? 2=?)?t??S??2?G???D? ++?w? ++5????b?D7???N?9?cRRe܍??$???5db?Rc?"?%~??\C ?x??1??5ued?7-?f?3??w??g@?AP?,??$?r?кS???_??rX????_? 5?]-??3?5??%?}??;R??i?C-?e?p*{}??E"?+m)q6 ??????????????.???K??'??/?????|?m6??g;??k?@e??B?;E?K?AưNuPw?B?KXPk(i??AhxE?x?1g?V?垗Q1l????Z?C???%x-am??&Yb?u嫬Ot?[??j1j=r???2?J??9]g???????'Ժa*??#??l???\? ???g?y??;? ??_?7x??>}?\}z????﷾??/=?o|???]®?? ++?x?Cd??? HE???Fڑj(-KY!???A?"?~?L???c%???p?>?'p??z3???pP??}??k???Y?V?]<ֲI<#Z????k? ????S(w2?)??~?W?;M?U(??L???R? ?ý??W??? ߀*????;?????x?? ??O??~"B???~4? ??J?? ?O?X?3ّ???????? ?>?f8??????/?*????|??????Y?5?`??????b??????^??????? ǎ?f}%???U??D ?2?3????l?;t?0Hc^?P???N0?4W%??N?? ?Os-?e??ic????G?bt??ݲ???la> ++??m???0?,޹ C?͎!-d??*?j3K?ס\?o?fc3?Q???"??????E??h=?Q#?NqZ?)????ۉ????r?~?????d? ??i??#?%!??d&(x1?ゲ?zخƱe??Ȁ?3?»SV??*??!??Z???vNN.??RQ0_`.a?+?Z?T1= ???ȝ???kE?9gύ???V-?.9??Q~{̎(JwR??H-???w?? 4X??t??L????hC??F?|O?q??p?{??N ;??vn? g??i?3? ????? ++] ?7e?d?T???a"g}]?'?=?'?kO??G^\pSL-k??+?B?-K? ]Y|?I(C?WOs"?k?F???^???????-??????cv??x??'?{???&4~???>}??rAݎ?7 G?7?????£W0?l?8?? ???l?????{^<9?9?ħcΊ ???~:?/?|? ?a|???o~????,?Yc???u8?:??,j?"???$|???{??#?qDV2j_??p??d nZ??f??wOb?h??dƸ? j?ϰ߽??4z??Q? ?"??@.(9F D????s???????7?#rF?6???????5?v~^0O:?P??/ai?i??G?????????W~??{׌?(??KE?mg?؜??o??̳q?u^??n???????˳-?~?-~??? ++??+???`?tZ_??7r??5?]p?g??xՎ??7?6???_?M?޻????@?.????ƫQ?#??????|??h???̟?????!#?8R?=R?????????N????? ++E?yy??4B???|?t6?????6o ?Xn? y????^??#>yr?O~???-gp>?Q?????K?s?{W??????'զ??1KٖZ?A??qŢf????|?x?ύ???>s??*??d??1~??%Fo" h???_?ʰ٣eK??&?w.?/?M ??̈́n?ݰ???1e^6?&}?`-_???? 0ܺ?e???V??wA?oo?a??yX??53?H+??? YIB?&?h????6?"??p?~??γy?Y8?nN$2Ŕȋ7???U???c?i?Q??P??u??A???u]??._??Ep????+?hGԩSe?k?V??3?9?G%??KX^w?ѩC? ?z??0?xnˬ?2u?82^?mބ?%???ΘQdΞ<@??????,??[?-?j?zk?4a?b.?????W ???V??l??pD?:??t-??7?,??#??????ڛ?6?H?=??ת?s?j?nt??????|pXf?B?? -ɥǠ? _{Xs????)??#:g???)???]??8 ?ܘ?????p??`6/I?k? ++??????J?Ztz>ρTz?P"???(Ա?_??????;tW? uG??Qxa?a????S??&xI!IR?hr{˩5?i7?ꔱ@??? ?/????3??қ??θ?z ?;e??Z???\?l"ŠG'rri2?("?{K?G?ܜa?`??,?v??N?AG??? | ++?qc,??????Ox??C?????o??n????87?m?ܿ???+?C??l????p??Jx????^?͸?^8????=>??^{?s????6|Ў?q???-W??Q????2???2??T?>?f??Җ%?>???zι4???k_?????"? ???&E'??b?Y??m?p??YW??͸y?????ynF???T??O?n?l`?Af??? ȭ{X?g?_???>`HP???`;??◩i=???4??܅??e./w,????/N?_??C???ٌn??? .??????cW??#?7???R???P.?Ǘ??78,??lf?J???:?G~?????ӟ?R/?a?#??O~?????;?}??xk<ނ????:$?1 s3??,?r?68҃l\???b?k?Eg??ÝV?L?"?4??P)X????b???Ph?B?G???{? K????D??,c?Tws*??nb&mK?A?nQ???%b*T??*? ?Ǥc_??a?>?e????????[?`=? ?&?{?BS@?)??7?yc??xlQe??z?U?#_?????>{}?????9??+J?bG????G?(l|w?~3??O>?Ŵ??O9̷|?????v?????G?7??o??????g??_^?????h ?^"??ZM?ִ!???? ++????1?^??V˻??????9D& ????+?sT??j?Oi??x `??????+ZdН?b?2D?>#?f#?vL?GA??]Q?bF????(C??)a?!???5???u?=?X?! 0??Z??A??T???װ8??`?+X?,"??ZV&q?????i?awK+`?|???@w?P?Q֣??cZY|?Ʊ?Z???? ++?.h0K?,k?-?2_?yM????k?y?i_? *??[?????$??J???X?j?zŗ???m)??ʼ4d7P\ٍ???6+=C?;?F~goaIU?:??x???????1 ?(???,+??p?iY3?|?.i???-?dFP4????NK=?`c???'??R?A???a"?̣????EI?FG]?3 A҈{?}??P^#2?:?J?-?MYz?ǚ?wa?pj?v?n??CJ????5?&????ʀW8. ?n????????????u?`la9s ?KO?GV????%?O??[???>?Z?/-???V?R?????|??ՙp??\?? ?????Rd ???W,ZV??????$?zG?u??8N9??U QaI???I??ǀ???d?$??żQ????h?d%???N-1???_y ??_??2)??5귈??????{?1?????w???%?꾐@h?bn?x 2A?VϽ??R?????P?rܣR?????c?ݞ?*|r???6?IhSg8+?Pd??T??\??#?xo=???!??IU???N???S-???p??n?Sg?֚5????{@?D?[sm˚3~_F?؁?N)???=?| ++E??b? ?M?EP ?)?%???Q,@꥞???Nƞ??C?:?8b??p@B??M3e?3??l??:߫1??O1 ?#??R?6qv>????-{^a???????x??????vS???둉^ ++??w?D?ٖP?H?;??o?HF ????8?x|??Kr D?lN8+?a-z? y?gK\??Z???n??Ķ???GH˪?l"?"????????r?S???3{???8????HLW? )??????H?1W +q?j?Mtg^425o?a?B?kf???},?M?a?G_?????Kɐ?zG?9r?5zj!j???]0Ѵ ++ r?f.^?ނ?????N? ?u&D+??F!?\?.E?????uShS?uT???sad?)E(ǁg?уZ?ō??r`?钖?v??#???`^±G?l?"ALEV?2?a?ja鍡s ?????V??;???=??y?????qw????3???W8̝??t+?ۙ>yQ.F?q???q??0-xENg??a&?~Q?3Y??uj;?>2? ??m??g6??W^???Ӟ7????W?z?!W?'>?G>?U?>s󣧼??????|K? W?|? ????_e{? sk?)\??F??}????????_?\|+???qx????A???F?L??p10>??3L????~?O??_F??oy??=????m???O~???W????ͷ??o?W?>???p??X2?S?v??k????Tg??g?֊??5A?p?????N?&v??Q?j-?????????g??g??^??~???q?я4?g?v???b?]?????????a?o?9^#???K? Xk?t?ѕ{_????o????_??ZG??~+3~]???y?/EN?,?+?:??NdTF??Z'????!????IP5?n?Uz??N??]S???[C}? ???g?V??Z???|?#?eI_T_?W?????4s@B*??O????^?T?y$?Ăj?&???sIuu[??1T ?Ű?l-??b??Tw?KI3VO?RJ???d???N?o???a?B?]VI???r{Ť.??`h?1???<?}?+T??5R??h?0Ƅ?|?T?Zad?Ө(?{{ln?w?C??@/K ?7C??a?)?`D??v?O?)??Š??N?6Y??-????3??*?c?lf?M&bq=ơ?{??J;=?E?,??i??0"4????Ĵ ?6?e?(xq?i??&?k6򉃱??Ȓ*@*???"?TJ ?m eN?N???RB??Щ?*0?~??.????:"i???/x?L4??8'?Լ?ἴ?&IJB???uC??????Z  J F+e??????[J1? ????#?ܠ2PKXѪ? ?ҫ%??EKf? ?~C?$???????Kd?HZm?9?D?6??e?H???"z=????????-H???????͕??&??>??uz?j?1h;???l???!Tu?P??;^af?????e?gcH3?? ?l&.?ݣ ????㫏???q¤1????_9???~?mƩF3?q:`??Td???7?Ȥ-Z 3?̖p???0?#E$??=j??s$3T+?~???g?4_??????_??!???%^????v[??#r??Wsq??E??77??Y,?Q/_?????Do^|0q?9???(@г-?9;??+?????;???.?]lhj???[ofl??a?B:P?8??̆)???$?Yiϙ?6?,K??6?J??i??=m????͹??%??X?????^??V?ú?Hk1S^?b?O??}??i?O?w??,U? +A?,5??`?-?Y??8?z_??kr̦Pp倥HEk?ټ?, ??+?q1??t?H g???[?p???ы??? ?K??",7-?b???+uK?Tkw+??r84f;???3 ++XSJga?/?Q9?*7?υ?J?%j?8?Ө?Z???D???P??T??+Ҝ^#?|9??????-?? ?v????-???#??????3 4u????tF\??x;???z?????!??^?+?cQ?i?VO?pa?cjŻ??kU@6d????爅A?S?L|??????PCJ???5??W{Ip5??-??w礸2?]{??????P????PV瓌 Ig?Ց??t??????'?B?*(¡??q?l*? ???TШ???5????R2#??>??VY??? &Ό%`Ӓ??%I K][? ??T???i???????y??/???#???>?aڹi7Tq??=?pqq?O? gm??q?'??{?cul9bs???g?l?N^?#?l????浟??ў???GNı xU?? CEw;???rx?ͳ??ic-?F?h?5%?:1?7 ???? ?!?:}??.??????4?K???R? ++?+]?.R?$rH?????p~??P??1?Yy???2?J????qv???'W??v\-??3A? ++??J???????5?9????????????????#????~?}???/?Ϳ??|?so???/???чب??#6E???cƵ???\??????Y?b?s{?AP?c ?gL??5TF~?ۿ??&?N~???,?З?~??G??-??t?6?{?2~?ﷹO&Y,?ח?g???4???X???????[????? ?B???6T?A???q?g?- ?0??e?c??? ?k.?@`??S?cgj c??Ekn@1["?ޖP?????p"P6?k?Z?;ϱ/???4?X[(u ??:?C`"?Y=?<(t?????}?;?? =k?6E-;????3??D??~??>4???????g?????Fݳ?g.?1?w?c??'O??? ??s ?/??԰?E??"%m?J?o%??T??&?(?jý3?srmD?{v?V?:???gB?z?V???/? ++К??d?iL͢Gx H>??C?UZ?sH????]m?l2???BY??N% ++??6?ݱg?+kƢ?x?K??0h?h?????*???Ӣ C4?f???O{D?8g???_?W03?`?v???? P) =?52)??y???Jl?+???jh?ӔM:?߹?1??j?+??q??a ??k?i?`??H;?s??U??iw?H?K>k ?Z???6,?>%KS+?ru?iO???殄?=d??h????JXv?5?Pŗ?&ᙵG???[0?SԵI?c?f?J??"c _?l?r?ڣ??$?#j??Z?^ ?Fݍ?U????#??? ???>??FXZ?;????Ц?Ղ?H????0?/?TJq??1??C?\?Ml$??k??g ?ҖR?Q?o?SW?5?R?g??}?t?e8??5??0j??q?ͯ|??ϙV?>\??oF?9?ӗ?%?F{?ę??8????>H??????# ??C???!???*Ξ՜??hœtލ?.U ?|?U ?? x)?n4?5?Hԅ>{??R???k????6f ?:c??"m??;??{?3lF???k*??? P(?w?F??_*zZ+???%ؕ)*?SS?*???H?2??IW?qUP?r@???dB??o}_??? $?c??6Y?Cf??Be???jo??P#C3??u????f??'Kzmr-9܏FUk?f>?!Oui ?O?? ??H? {?-???X?^???b B?T7 ++ݘ?#?h^?1?^a??E?EpF??i ?T?Z?q?HX!??2 ++A,T7???蔭0 ??w?8??cn?f? F????$??QO????T%Խ?R?8Լ? ?->/l?L?R??y5dQҭ( ,?PJ????"??覆??[X?ޅ? ?|z????yZ1{Y?LX!??eE/r? ?Ş??X#??ck?5-??B?b???a??Z?;퐃S??!??5?W??i??????{p?#̌?4?^=E???&A??r"?P=٭?$?R;????`?:G???G?"?UX?Cc??Z_?$xٍ??QX???#Δ?8?`?8???~:??>;?T???w??Y?H|?S?ud?H??V+???}ډJ ????4 *??J5?Ʃw??-???9?ݎ?F?Xx??>??|? o????W.)?????????4??&u?`?i???,?LO?.?E??2I ???e?*????g?}?.?{㌮? ?g{~Lh_??ATN??Zr'I????5s?T񊅳I+y??0d?'??eV?4???-I?+9 ?I{D?3A?>% ++~??iw??????9?vd??d?!?Sҁ?j???ZZ?Mb?z??j????7??&???#?@ڰ?*FXӪH?r??X?O*??P+?vv?b?%?1m?y2tSs???a??9????m??A???i?${ BdEԫj?wuo???kY2/6??-??(? ,K O?$?f??io??? ???ݺ?Z?bx?Y???*1G{Ck?ȽF(?j1?,mm??RI?e????Y[??ݍ?k>??4s???&1 ??ِ'7Z?+"????z??2??Tr?1M???????????U#?_{Y?j?{?2ăЃ????3??Y???*឴?Q?<:???a#[@R???) f??@???dB??Pa?9??ƫ,ӑ.3??~gul9?H??????8o?E??NBT??y?+??? jC:??i͹???/??;?We9p`?9WWB??r???c?$:????z?aN?)??;?7IX$g™F??K??O????BՑ??1l???oqkl? S???ZPU???G????[ e?nD?~p?_{??>???????r????)???E??3???޻?X?$w~?3??sNf֥??????X`?X,? ????=z? ?????\Rr8????[Ue?9'??M??Z?A?D??T3????<??nf?[_???>?O???3???8?>?!?"?g????:???!???o$?r??؆?????Yk??ld?I??!?????j??-I?`>?~;W?H]%?7??? ?l?_??h? r??P?T??s?`?"??'YS?b[?????^Bq???p????׬?G????????q?:????O???6??????r???f?T?_?տ???c?ޤyʋ8b IDAT7?p???Tʼ??nT??49?8?u???7?u?????N???.???U.?VY` HM???J????7?^ ++:??~]????????y???T?;??7^`???z?bD??g#???@F??Y?2??8??B?Һ??L??e???։Ȇ??>O‡?JC?,J?An?X:?E??CscJ??Sa?4?????x f?? ++Cu??#????Eʠ4&????? ?(??}?????^8????@???????p}??xVXޞ???oi???????K^????pe)?u???<㱝????????'?????????M"??fc????؆n????|Q??Lv??|???1????0?K??r6$#?KZ)?????4???~[?l@?????^?OM?lj2??M??,gK??,??i????4?a?Cv`O7???V?fJoj??:ҞC?????++Rp???=K?s??I????? K6V???????X0??C?| a???[?M`????o?b?B7?I????>Z?&?????3?[?%X??;?k??# &???P?F?0cS+Z??fC???#?u?ӑ?S+???GH????1 ?t??N?f񖬬???u?.U???D"?& ???f????????`:?`?:1eÞ??{!ti???c, ?+5X?n??$?:???E???CO?? ?sP.0???F*???݆h??U?"uk?]zL?l?l2?@?0z@,??JE???x????w????Nue/?ݖ?)r???CLOk?2k?Ԭ?????ji:b?????L?I{^???j??4w?Q?G???? ++7?sg:TȦ??Ү9??????2?O?uSi??G?8qאַa??s8BD?z^??i%r0??? T?5NȞ??*?8Fcʼ??????b(?X??'1?}S???`@=l@?ރޤ4ݞ?a?? ?3$?y%U?R?:jZ.? ?m???خ???\?#?&?i?/??6@ 9?1?3???????? ?b ^????ןqzVY?|??;N?#??ŗ??~ʟ~??r;????M???????|%??G/^?~??_Һ.??!??,?u_۱????ܫm_??ˡ??ю?b&?ƛ????O?????F?”}f?? ++}??-?????#?>??????_????/????'????3????O_?V??e??-_???Y[c>΄_??????????A????Y?,?󩦊?y??I??^?Na??Ҵ??P)l??>??n?????$???p??&c?ӚKg?%s???L??!?X??????A-?- Љ?S???iً??Y?Rd??w?9c\??h?J?U???; Ԇ??C??N?sKP?v?^???u(?o?m?????F/??}?%'D?b-?س?,???se?떵%?l`?tu??F??0?????ض??]??{J9???w?????G????;??6k?˵?f=*??#?4L??X????mP??B%?>?a?~????^?B)"??ӷ??? ??S?-n?ڕ????ry???3?#?8??a???—αB????K??E2Ͻ??:e?{?+G???G??rە]g??Dn.??bc??@?????֠-R|?u??ӊ,w{?J?jr??."? \2??Sq]????????5?w ?,?zL???-??f/\fٻ2L@s?#????J??z?'%Uu?۞[fV?,???]?T?Uņ??~ ?L?U>???u ???0:T'?8??????????O??b?dۍ???????{n5??PU?Q?rK?_?U?f???=??}1J?? z?GFl6?r?)E?P??{p0??b?z?P*?ꙶ?H"??? ++V?b}????hn( )?!T?{-??p?????aڼMĂ??P?מ$??rռِ?TMKݶj?f<%gt??br?3?M=gWr)y?-??R??f?c??\C ++}??"???????#?? K?P.???{+??U 1 ++&???K%Tꇾ??p???~??/??????????&m]?\ ,U3??7t?:=`'Ӵ??J?Q?8?A?6L????,???n?"tzw 5?l??[Z???b?2???P?t?a$U?????|?#???}??Xό?=??`???!b?????3??g~??o?O???-?ӑ?????????B=????ׯ_?\?d???/???W/?s?O"?????E?#???6ƻ???????ٜo$&s,*N?? ???_??????/????^Sn?}[9? ?6o? tg?f&??m??|?????????ٿ??n?yf?~|?????~?3??? ?[???7????d2c??̇??~? ???岰^!b͵??$o F????K?v_!????#fy*L?x???E??????n?y??/:'Z?¶5???????|?r??s??????mJwm+7w?,oVʤ?,>am?N?p}x?a??????t?i}֯??N Y?:???Is?Ʋ?Λ??j???T??v?H)р?*:??????L??)-?R???CC?t?Q??'???3Q??U????`t?pY??.???K?'+E8?? ?~???ʢ[? ߖ?9B|??'?7eX7w\??2????V؊?????)??K?Y5?Č0! RL??[??????i\???"bt?????,??3????b]q???:u??wϨ&|?ͩ$????MFھ[K???????ې ???}?4????W??????N? 5? ?2ҡ?v7jZ??ыT2%3?? ++D?0z?1<(C??cHU???2??:w???????v?Uk? 8L?????|??ӳ[???N????6?F?U????т ]Y??s?ӌ?? ???A?"ג?@?6I?xoPI>y?g?r ++?bЌh"h?fU6?&?AR??g?Duܯ|??_? ++??w0???I?%?מ?0?c5?N,?Z4???̪V??K??r?f>???{???t??Z?;0?????68?-X??͙n*??U>?slһ?pi?7???^????k?pz_?? ++1_?š?M?"g??T???9/x)?-??2??Uh]?P?X'-??}??ir?? b??`?؉8^UGۚ??*?܁??????#???e????qJ???e",?6s?B?$???&?ދ??G?A????TC[(C5???eL:??l???I? kYK?F=h?+>????/?????<>\??~????p}?>\???O???2???;/?????? ?????@???W/3 ++?={?!?{?K?MR???$,Q11$???,}?԰Ff?9ʑ?A?x?9??#%? BB???`??ަ8̣?3/f??????}??=`l??l?F ?AYv?a5?OY ??B?7??,?t??ั?B????>? ?)?l?R*ǻg,? 1??[?gC?'??Eږs zF??????m??'? ?;??`9??Î?&p??i< ???h??g"? ?8?6Db??D??d{Y??Q?????e?4???? ??MC?5Þy?e????B??+??"u??bz2?Y??cWM??? ??6+7?}5?*???~?C)??Q?!Y??fo????T?ڠX?L!+?HV?0?仚??N[?,?X???(????Yg?Y??)4 ???r{'?^PL??Czς?qf]?,F??^??;?4??ڛ?Q??p?WbL? ̘Ke? ՞该җ?|?@e?cmɁ?6????E͖Tj??????u\??,?P????7?g???-'??n?y?????v?|y`??????돏??_?Ï?d????????w?x????^cU?c???z?ʶ6}\??f?ڥC?.\?*??E`?? 4cm 6;m?{?h?3z0?c^ҹ%?yT????q???^?r? ?%??wtn,?? ++߼{C?@??u4q?F?K?)??H????E*? t"ޞS?ʐ~?_Rd?zr>h?(P??9???.3?"pX2???N??k?[?!??p??%?|?H?R?l?(:۰.Tq?9?m??չ2\??n??uD?uN??~??*R]?R?4 ++?t??>????_?c=_???E빍?;T?v?%hbfDs??f??k?#ѯ?;?.պW?&{?H?`????؊[cݨ??? u?2?He?9??친??p??9??vkLEj9NT?5 ZXՃ?"?Óp??;???!?V?l?;3J??@lX??,??T???b?d?Xx?bd?&??1?[V{P???3??y?Z?we?4;-?~PƽDW5Aȴ<\?̳,72t?S????x??g,PP?{??i\?%g"cnv????%`n |?h걪??=????{?9y7?6λ????j0?l\p7|ڥ??u?&???e ?? ?s,`S? ??7?ks??F%???3???5??g??l?~??M??e?^0????ZͅZ??^[?T? ,????@?~>g?N??;?V?D?1an?a?u?aA?k?????e?mp]?/??ks꣥?4?ު?U???Q"?I???R?׷?X?3gYWՇ;?? ??!??>V?'???R???`]y??Us??2DI?ϹZ[f?.w?>p߈?!W???&???3??A?f?lX? bYk?z?/?֥(?׳z?2???[???^V??߭???k??u??S????Gϟ????~?%??'?C???N???+?W???m%??????????ӗ?~??????r(??>?????\8??^Pt6??Ķ???:??.????1??y????T?I=????${?k?z#Z???Df(?X??%?IY?ۜ?&!%6?D??o??̝???z;]Ba??r^?=g>??*??*w?Kc?$-?bT ++???^B??y??/??+~?????i?r???5??-?'?? ??kF??Rg?S???ןs??O?9>??? ?BC?#?ơT????뜄?0?-LDž?ڵ?? ?s?1q8̼[??ߏ1?vPED!環A,?˖?z?D?#礣1*}U?n?"?o}?h,r^Y5??m?h%?n?"??W???׷g?????Phk״!?`??P??????R??A?z? ??m??$?>?W??@???@? ++??ܷ~'??r0F?Ka???i?޸9?M??&gi??t?|wy?x????????^??ׇ????_??>?????g???_???~z???e?nY?????y?R???ٮ?-??*?t?q=?nl?:EJeC9T?ê?6u?DX+?N?,-?0$ *p???tڐ?ö?I???O?bO3??`kutF[??[S1*?cI??{f/ʛїK%??0在a?M?)?wٗ?"P?)??u?L?????S-TO??"?@~??]f[;u? ??}???mZu??y yO?9@?w?^yl?"?ʒ????nJ???5p?=????&rfٚ? ?f???` IDAT%????d????M?? ?DRQLq?Д?!??o ( ?r? ????X6=?f?F??*g?%?Ђ…??!Ũh???WwYT???f ?}? P YG???8cT(??,?wf??Z)????)*???C??P????z?tl,G?(?b??~?6`h?I?i???E????ҥRkF?]??Sں?k?y!F???b֔y:???1?u?2#??v?h&+???,?>????EN)??9?s}X?qswb]??B*??)>t??,??>???2)K3?w????2Q=??ǃ?8.?rG??,_???Ӿ????#??????g?2?i?>?i_?C??Lװ?4???jWnE???F?wͳ?Ӗy?̎?N?NI??y.?? ++?:??????y|X9qb??5l?????d{[3#????̾??ia4??????w?|?;=B6??g\??i?\?????? ??y-?6??<`?:??R?؇?%??=???9?r?a??6^וR??? $cY??<[???5?9T#s?6k??ɭ???????x????٩??ocW?"2G?7??K?6???ۙaH?t???#?!?"?*?&?ʃ?k@??? ~H0?F?wQd???vZ????U??h??ױ"??EמV*?[*Ҿ?H?C][??L??6???.L?)??*???6q??g??]??? y??Y??oޞ)??T8????#_??ן?????a!|??7???|v???'?/_?W_??ٕ?E#???8??t#??}F?N?f"?U??V?l?c??;??e?(?ƫ/???g\?>??? sǏ???W?N?9y??? Ƌ?nW? ???+1??8>7~??????㷏X/ܿmI?h??'???/rP??g??Xc?????--UtY?Q?2??K???TCfc??Z?5?$-ӻ????l?? ++c?j????nU6?޳?`??P?p?b??ѱ2???L9??O??^(?pm+??L_;??`?4.?s]//??R2t?kS?dI*,??N?T?????9f?!7?5?Z:S??.??y??D}?????|w??c??L???[?x?A?d.?2/Ե" hPs?oݰ ++m?"!Ńe^x?ĥ??j1?*B(???j???v???????77n???;??5\(R??ΡL4k???U???x?C?S b????@?{????Sa)??t?wlM?o$?]deP?VEp̪Y?R?k??O?뛿???~?g ??M?,??C?'????kc??9J[#-?c6???9?Y?? dD?j?Se??ؿ?P??l?z?'Y·?.5??P??#??ѻ?????[V??Ԓ??? }#? ???^`8c??h?8I1)wsSk?H??[+?JF4O?̢ ??Q虧]´??>뽰?`C??R?1??Pg??>L???6O?f$?kf?P8?}??[??U?EH???z:?????e?;O??q?x?0?8_?ӑ????ڕ{ ++٧?C???#Ai͒?#d?F??l??](?C*xCD???y?ڍ?????+C?w??]B$UY[?b9????y ?????W???"?^?ZH?????7r? ++??K??alb?wf?G;?O'????T ++?˲???s??<|??W`?Y?̴?0֜?!2q??:??zEwϵ ?l??0??O?????r8?,??@SS8&?3Ӕlk??ypic??2t ?ښ4??%?氫?l"W0䉧?P??????IB??}1?|`W|??H?:O"?,??H'??L?k?w??I?B?ґ?e?ϗbrD1թ??????O??β4???)?????W?|˧?????x??}}??\???~?/?K?)?????é?PX?f?R,x????|????.3^??斖???)?/??rP?ٹ?F?L??0 ,?:?5?"U%?- ?.????f?1?ڌ?ј?a????{?? ???8??>?H??.Me?a??ɨDv ?K?6[D?n:? ??5?S?퐗R4??T???!???5?:1'S?:???x??B)?X?IMdk?3?d?nO?I?"ƥ??O ?lB?ɸ?,&??5?~l????؛ ???H??A?f,ji??ٷ??gR??@?0J???I???Q|???,7@v?4C???`?d??@??Cu?u?p????-{?m?d?n???ס?Dv???6?=??????P? ?@?+???,F,??J???n'????{;U=??? ?2c?ϕ ???QO?v?R"':k??ȬCe5?jt? ?xЊ?h ???ىV???g<\D?d??23??D??q?g[Cq+???`???ь/k?a鞪߳?#?i?re???t?s????b?e"?ܺ=?*UYf?R &Tg&?P?? ?o??????1?\? }? ?|???;?7??ճ??1B?^?qOb?㋿?5l?{??Q?D??m-?^??_~???%:??~c?r?54?????eŬ1?'????6???~?,j?o.91z?( ?`???h6???_8?e??J??0?هqzc????|??{?Z?D-?|?Z?ȷ?? ++[?ʱ?]?? ++F???3I???3̓???-?~???G??y ?m{?Ե݃?X?q0????e?Wz ?:A?2?JɡL?v??>??3?1׵?1???X(ǐ?E.I??rI!??А??8?6??-"??*[)T?= <3kJ,h?? l1???ԛV??@??i??^ ??????k?""-?|/?UK???F?gs ?シ??v?-F?t?ߜ?Ǚ??nkc#??6?p?!AP?P??Ű?lxN????B)??ZU@?.%?%?uo??V??p???̸?mʌ??\4DC4??O?ҧ???E_???,?+?g6˚?֎???t?֠??0?"??B?֤?Z|?ʑ?b?j?jl?"uh?C???Se??2?r?r_e???????ݲ???Q+?a?X??Z*DW??d ??\ b?N,?7??4?:?,???T??"ˆO???й"w8O??!???Ip?4?-??mpL???j?1 N?XCo`02?o2e???(՗՜???i??6$Ϟ??P?̸e????T??ݶ??詖??!b????Y?6?"^ ?=?ʨ ++??+?????ֶ??T+?]?X?Jd?ۆ~7?@"^?Bk??k7?pZ5?"????$p$?FITl?"???\k?1S?U. ++%߽?R?s9?wp??3NL???ܕ[?U?S??1.??????'???ţ??|U:Љ?2?Ƴ???.???~??gj???????n???rk??9׌Tߧ?BU??:d?ׇTy ?`???n}?#?!?u???????{lG???a @?|?3{3?P????()wu;???????ci/ ++ ?~<(k??V?%??Iu?iÍ?eI???|??a?M??{p=???"s?v7?$)???3}XPzPa??(???Y??R4??? !??$???-??v?1yFrx?-s?D!L??^:6??X???o&??6Ru#])rf????!???Xb0?X?&??y???3?윇? ???ۃ]Q&0p?9`!B??znF?w????õS??W???O? ++???$xq|?????^޽??X??Z?J ?gmY??@C?_ō??ʳ???s?T?|$٠0X???fzk?I???h#W?@? 7?????? ?j?a?|w?hIpA߰Q?KB?e??*?????tNG?:?????5w?>?x ?:?;??&?ь????aY?X?l0 ???ۭ?-???P???э??t?it??h?B??,e?<^~ ? ?͵1?t?Xj?x ???h???????_??ׇ????_Ʉ???=??΀C?+?????^ʢ?G?VYˎd?????? ?}b??\1??n??s:x??? ??Z?N?_i?Lo??ac“????????o??{???[][!?????b???w????|?l?7n?'??4sz??Ӳ??EҚ???'? ?P׆?J?׶??M N??\~,DD???X?m?Z~N?#wN?x?cp???????!??+??E?Yf?{9?K?????@?C ??.???8?? E?&??Az(2?՛G>?pD/??(???#??$?? ?t???Y??Zom??FfŢaL\kD&ݺ????W?؂?I^P,8].?R?Z{V????+ IDAT??o-n??kĊ/?u?G?x-?39???s'nf ???f65????Dk?(ŵ 0?}?80?y 7l*z??G??_0??·?-E?$???~>?C???9o? ?g??,?m?6?\T?`?uoh??Vb??+5?J????????-?ׯ??i??79L?+/ϝ??????Xo?3;pZYQ?48?4EcY'??T/??N?}1-[]kX ӴoY??5??-+%q???1????ٌܣν??)??Ya\=I?CR?s?^v ?q??$F???aX?*?T??T???Y?ŤY?????u?u?y???S?^??ǽ??^{Rh?Ќ??8i?9?]?I?>^g???GO???Z.#U)?|U??8??_־ ?Mό????^?L?޸??Z?=0?:;?y{??D,??!??V?0?X?~??:??.?κ?p_H`?`??|??? EfjOh?k???l?\&??% C`???L?????_X??F_???p^_?.??a??!"?̻p?Ή֍??p???1???1????y??ls????w~???>`m???焞7@P{J%?䐨?????? ?ڢ?,"#,???Gc ?&!????Ť???'r?8?L?h???&r?^DS ???߻?q?c?y"9??d??d?FUo??n{?|?????#?Xw?U??ݰƞ?P?c4=Q? ++Zw2???X???؞&}???R?? ??)b9;d'=x?(??j~˚?9?{????Z}?y?pt?qN?#?k ++??t?,??/Kf9??S?$????,d?pK*f6H??}??&r?????????z?:??)?>ux?u8?%???w?v;?? ?/????)??????6??,???_r>?d?M$CDEAy?>?em??޺?????dXS߈?= Z9?m?"89t|?p?$7?mbt[o*????* ?V/u??xd???]???{?R??z%#??{?;9????m?v??z???????r??^?-??~?gч????n^?r$9?/ɺ?D?>=?K????|??Ӈ????cⲐM?}Y???~-@ #m??u~?7~???#.o&sS????G??#?f ? ??%7+?*ˢ'~=)?`^:a+??x???l?oyz|`?)?:7? ++?݉1DG?r6?????????????!?????*N?V`pR$w`v%?:Z}?"?S8˜?䎳ll??L??V]?Y?n~<?(N?";?}-??vW]?????k$?[ōoXTܣQ???U??Za?K?J??^ŷg???0?Jנd?,???4?*ȁx?W ++ȴ"???Q??p^?z?- n???l{??Fӳuݎ?9??g&!p?z??eų???j(ޏ.????o`??E?zr~q?9sy??́δ???M??U??ł49m?2?J?\YX?????*?ֺT)??h?DuF?uZY9I?? _??Y??1FOg??dH?f?ɓ????8? ??0??}2[g?Ht5??NB??/?窅?IM׭??xD?K??梤a{?????(2?ŋ{?{??N??i???D?\/??7_??W|iX6ֳ?S???SJtZ?c? ?w?3??M?U?R???_7+????E???\b4?ma^??qk{vE?ga^{1?O??:? ++?9?賅⫎?! #?9?z??Kȡ????>G??V#c?"?C???}n??N???z???ϲ??dk?R??C?#?!Vؒ???X?!?m?"?????L?c?Sը?_?W7?ȏ?Ved疐???bS?u?aW?ʌ?ug?7p9????"N}N???"ܩX{???"????HX1?Y%Y ?vb?=huN??g???pbB??~??=U?qe?N[?lgnYE.w\X????=B?񤵿??6/?Q?a??rD??ċ/???8?p???&?E?4??o^?8y#?5|?Es??(a??Y)????gGJf?75?5?F:5hk????6Nx???7,B??[%c???? ???W???W?????{???ϝ??ɋ>??7?\??[?V??0\?:o??<ϵpA:휰 ??Jj?"??k ?A\M??+???՜m????Il?W?5??h?!????Ai!???]?????????`?$???~????????/oRT?y??(??P?ߴ???[@???I-???fwL4T?LB?r??"unqtE?y??:?y? r?͑{ȴi?pbO??A???@y???P???yg^?.m???W??M?up~?????9n?????,7J?G?"??eӰ?M???P1+??8?4??u0?H?T???Gt?3?u??oX?O??f??Jua????? ???H?xKM? }??%?E????y??jת/??W????yz?ʥUgOW??e{?qww'fºt?ro?[?=G?uVN?ңȒ??[q??e Wںȉ?IW?Y?ǻ??ej?,???? ???f?]??1 /?z75??(?+?%???,?d?3????@V?ߟcE??dBڭ?]?4?ݸ?qf\??ິF?? u?P?M??"??uQ?~??R????Jo].z_ۡ?6???r?y????6?QHr(t???ҋ?ܒӺ?^?R?g?+rN???u=??sd?????????s?vҜe?????????k0:?n?8ރ?? ø>????V?WL\??l?]v?E????8?5R?e?x?;1??zR,??S??C?@??>B?$???٭\N?r?3!?ĨxsP??孱􃤕*?ur.I?A?ڧȡ.??"Jm?K?m?}?ּm/?W?icN?{|???_{??˲?@?nĜ?zn֣????EІq{?n? ?ifD??7$??????3?rm??Hf?K>?kD!?G?b?LQ`??qy8???*rn?)??r?QQ@A9?9?A??D?$??8??aTD??˷?$?o???yS?7Dt?\?ܜ87?ֳ???"I?qĈ6?;Q???G??[GеGg?????I???o?????W_E[W???@??>??q???}?????????S"????o?g?Gt`??Y??DdV? ??|>1Ǖ??`ƾ?_????b?W~??Oys?x??3>?ɇ??@/ ??VP̚???/??i?R$)???NkJ??r7?e?????\@?y??ן÷?G??쉙??*?/ ??/յ??Tl?:??7}?Sԑ1-S?p?p ?ڛ?R ++h?>?\???I2???EqS ??????u?h??h{??^1ٽ??ì??4?2ʅ????X?]?h?rF?n?s??i???4E??bg??)???U5BR??!??Ўu?N37wV?(??C?j??V$1??8mm? ?mgۂ7???w?3j???1rV?B????L??????V??? ?Lb,w??I;kN??{??*?vҬ6şY:-???` g?w?u?D Gm??:?,??|???? ??]?ë????+? ++s?B?d ?t^?"7/?yZ????s?r?;'??M?S=p??E?.Æ?s??p??C?pш=???V???PK:???Aݧ?Y?RU!d?sD1??Q?1?:??]"t? ++???=???H??9?O 6侺-??,???$??? ????l;î?~?????|M6?+??h?5WT?Lȅ?"Au?Hś?hk?]sT??R]n57v??????8?Ijn?=cn",?f??\b?>!?@g&b??r?????FN?m?r??,\?v&??m????? K?Vq#rG?? ?'R??d?y?a?-?-?Y?՚w W???R?lЭ???X???l?Wƒ?ݡ/'l?????U4?sL???????7????_??.?)hK??I?sa??wf?Md?????j??#u???7"??????J????ߟ???IN#Z?{Pl??????Y???ܧ?WB?BͰ?p?2kɶ ????z:?z?.????8"|?ٴr??g??????"??+F?k?`??Y?K'{?C?+p????x??b?̴??r!??O"?1?YS????3??]??CN??}Ws=?M???d????u܂??S??_?|‹ ?????'6?b??<?.R<?bC????EL?L??@1??3o?Q??"?,'9Ե"??"?{ ?ˁ?pCd/Cq?}?|?@6.o??k??W_???/ض'?7??`w?2????H?;????m{"'|??#?ݙ??????O?NO??D??8?F?6?&Ü?)?????ȱ??q???U?z?۳???z?|?:P?V?ao I?}???? ?mB6מ?U?d=w??E??tl?i?3?? ?b??X???}?q;s}|dw???S?ߴ??d?\X???)??wc??=???s???6u??M7A?+yz??ٷy??P$?!њ}?9????@?߸&+?????I?e3 IDAT??yq???? ++www"???^9!?s?$y????????H?d=?x???7c?r繑u?? :?'????6͏`?HS?,g???Mو"?2uޱP?|kֵ?/?O?C??i?n? Իj??x?룋??Pw???̓t(A?0??rZ??I??Ί=ܟ$??<u?Z&? ???͜?d<<]??aitS???/[^??F?7X?NcԌ;??z? ?D|?]?d™?x?? ?0??7??%Rv?SQ?toEeQ ++?hO??????k?'n????"?????Pdz?9?}??+??F??eqZ??????mS???&W\hޜ?Yb??k?k?5?f%y??"%?$v?1?w 9?a2w?}V?_?`WE??ܒ??HP?Y? ++?s??s? '?? ?(??f?@??R?]m??FZ;a{????C?????ݛY$_a?v?C??7$?w#?\???W4??*???P????JE?r d?p??????~???????_g?s??.??ܘ???? 9r?-u??_??/C?-1n? [kʱ?[????Z?&??vszӿ?5??z?Y:컒?:5K7a?<"??v?< ˍ?.???N??V???㫃??t_?f??j4~??7??2?߼?????ŕa??t¢1?Bϝ_??kl?=\D?N?Kė????]N?R?gݗޥ?s?*r???K9\?X?"????D= ?^??3?y1?l?P??RN???-?V??d????????O??????7?K??????????/??+r??4"?}??O c??=?\?}]jX3ֳ???-?(???m)s?B?M??` q??g]????ך\?M)d۹??????ܶsW?[/??~á ? ??L?;???p???????\?޽?z e)@7??ar{t ?1??@?5?;??d=ė??(?fwE?i?\?c??<|??тu??(?$?.m?????|J??/bP}i??$[a??3?)1T?P??R ?+?????7"???>qıQ{???"d?@??(?M` +?s?9?m?k?????X8??ՑU?fw??U?S????????]????_??KE_g???M a???????????????Ė;??????{???s~??o??5'W?c??????p?&?*Pjۃ?:??q%???????e=?\?żsם??f|??????1?????N?N?NNEJ??Y?4???K?xx䛟???Spc??;?}???Ќ??W??쳱,?AnF6D??Z?:?ֳ???z+]?o??oNΝn0i???$?"=??f????;q#??޹???/"???`,????u?^??,???;S???UJ?s?8??n???`??x+?*?|(K?m/8??g?Ѱ=nI%Y}?:??m??'"???ZWv??'?-L??$?K???_?Hcyy??Iy+?nl?F?g?zD?ύ???>?2%?????sW?U??_??s??3?oux XSΗ?c;,??+%??nD??]???W?-?o??J ++L?Q}?F?E?)B-?s?? ??> ?u&Ӎ6??Ơw?? ?;u?I?%"c???,w?4??j?,??+? ?yJ|*M??÷?_?b?FT ?I????l?N'8I?% ל?^????? ?D|????5?JNH??????B?]?T:?/r%??XO?r\9{?K;????ق??&?i?>??^??+? ??{?0???}???3????K????\?#?J`A?&A] Y{?Dy??K? U#C?i@?(b?]Sِ??E?x ???2?+?R?{J???i?Pǽ??3?d2 ????6?5y??*?o]?=F@?u?)"QG?%?5???;8?N?ml???=???????????59??`9Ka6Y?EBC6яxGS???DE????m??^??z?y=R}S?????ͪ??7??{?К?]?r???{;?ô??B?D*??n?=ng??<~Nk??d???L???c???C4[0??I??F????j????????߂m?/:??`????X????ܗ???oyc?????\?>3?41?Zw"?"9????7CUi">?&?-??;[?^F?ߜ?+&8?*??sB?zò???S?????ou?5?Z̑׏??˛??]??R?ATe;???l???7??*??Aғ??t3*flB?????o?]f??*??1ow?@?xD ++???T?mEj?g?rHk?<:A3ˁ54/|?A??!?3DL??8J֓??U??????a? ++??A??5?$?V ????^??l???f?Y?ݬ?~??v6?P?l??@??ӣ?????CWd?AZZ4?"@n\??D???33C?k??g?B?i?X???F?'n???:?? ++????c??_7??Y??6n?k?8 ?+%?hM?ɜ?y?SC?? ?????z_/;?z???e0wx?7???_}???w????c??3c??L??_??O>????CKE?F*?iT????ޛ??C-J?????kF?[g???6܃녊]Қ??ds????!?n?F Z}=?p??`???r????Cp?2?u-??t??*B!3+?6k;?? ????tS̒@Qn???ջ՞???H?cX?$??$?s? ,?3k????*???f4?Jar|쉻z*}????t???????n?e??SW9D!??弥O?,?0X?9??'?R ??%)?E???(q?M???{??섷??v??v8w?r???>????پ??????-???JP6?Dʿ???%N ????K>???>???????????O?ŧ????_?rGf0?M?l;D[?n}?|r????!"?-???? ww/y??@?Fo/y|??O??i?G?????~?d'?P<_Y?{?^Ǖo?k>??>????A??G?']?ŝ|?q?????`i'"7r?a`?,?"J-??ز?2#X??rj?>?^???U??aK????e???Ʋ:3????3?d??? ?4?U?sYVƶ?9??CBn?)`tΤ???f#cc???w/_p??o?}`^?????3?x???ܟ^???l?????1???????ˇ?$??O?w߹g];?~?Z{wS??????wٷB?gp?wF?Ŝ#????=T??[ĕJ{??8??y`???D?1???-??I?+???? ?rȑ??4rޗ;?8??,?\??-?%?Ӣ?D&n??v?????m???{E%?<?b ??S?2s?????7`?????WxC.?)???y??Hy??m?ꪎt??M:[yg_q7???Mʾ`?8?????-??aͥ???,D??2??,'???????>???/?Z0???6??~?? ???~??1??W?e??Ύ"?1i?akg?(nof??Y??z??\׽?ۉ?~?:???????VF$?>?]??^硱??????<?hl??}?´ɻ/??.????1?À_???Y??o]??ʌ?S? ?""??>??9i??M??᚟Z.$?;?8?{/?}?E?z??v0XB.AG??&??쏰?s?Lv??󲱾{?uo???y7v??]??$7g??~_ ?_?ixvF??s?9d.짉??G?m?? K?@???+?g?9???*?? ???%?3?l????4֜/נTd?s????A?ș?bB?#?????Rr?fQdI?? d???y ?iސ??Lmedʭk?Xnjɜ0]?A?R]?3??1:-??Q9??J??[S ?r8ή"???8????S$?v;gI??1???j5?&?F???x?tP?6?pl5 ??J?uXKT|??0-qL%q5??ysB?n??~???PW?nMaOG?K?\??3????y.? ,L?-??π:/g'?????ẘd֙Z?QEr?5??y?|??G?m? T43?FT??l?Y??=C?Zލ?+Ȋ(?#??z/0e 5 ?7?Ҷ/?Hŋ:??2?ә??:??y? ??????l??*,??*6?w?ԍzD4?њ?9??]???Y?In"䏘??)zs??Mۘ?WLx???4???g???.?9???"????m???ˉ??#;??4&????+aLĤ????^??$?XO]???7??o????A[?qկQ???v??wc7? k??"???ƪ?&??-?R?N??Q&???Je?R?p#H?e??#??&7(??~E'cjݫ?Dr&X???:H?5G?&???=??|?9?O?+9g ?q?iOu??6?7??_??3~?G????????????????w?,??;ɤ?r4?ž??ܦ?????ř?G?͟?bc=?H??n?Bb??8n3?????[?,ّ???X+?????t7o?s?F?-?Cҋ??o?ob؀a@?%?,x`??$?!=?v???U?kE??Y??0???p???d7?OUe?\+"??9'?O.gg?w?mS-P]??N??_??????/7??????w?????7?M?3??F?????˿??s?????몳w?"???0????V?????|?'?/?R?:? ++rYV??? ++ ??N?ﲴ??~??&??0g? W??;^6,??4?7x??'v?#?F?????BB? 6??:???-l?c?j?Y??ɛ?D9?fH?C??h?5eiٱվ3sbM?!?T&L???C ++?/;KK??`o+??rkO?qFy?1.????g??? ????U?=?O?v???mҚ???ee?ID??goHG??)˃67l&#??wb?I??U?o?Syx?lF???6?98? ?>???4@??>?"??{)?e/?M??????? e???? x|ն)"f!h??????? IDAT???p??{?R6?-:ގ[???P+?^?ݣ6???T??,p?ί?>?*?5?uҤ??̸??E??4~?B@?Q???-?!'#?yoR????1???:N Z?p??E٠?"?? bԚ@|?S;?;&G7?֥b?&ٝ?????ڎ?z???Cm~8??so?Y? ?@X?g?U֩D#?;fg?????θ??tΗ.r??:瓳????B?x^???!H????δZ4E???gE>4d#?Y??E?33?m?tZY??;1f9?Y?yL? ??'?s?=Ǥo ??\{??]d?B`?????g?蕘rv?d?H%"?HE?9??????-K?m??D6`??4י5 ???zȩ.??r"?dg?'??s]B?C?F????R??0??¶?`9?tYj??9? W?i]??????Q$8i???ak?B ?????l?Y~]g??q} ~~}}}}}?Ư#7??E???M_6S???#T?b?e??%?e%%?????]C???p?azWi?a????;?^?? ++?Ȳ?0Ӡ?P?Q@RT?z4 ++QB}^}WB??fD??-???ᆜh^u?נ?o?H?k?^??????夺??,?s???j???i??X?#Q*oGJ????)?P?dP??#? ???Ź?@??sG???N???o?z?}vh?????{?D??O6?`?? ?ES?????ce8?7?iX???tH?????4o?sb??S??0????s??Ln????7??3J?B?~7?9u_?`n]?? ѧ?l???W92M???Y?6??1r*kx ,?>?Q7 F??E"?"?{??翩2???/??(?c?G???3?"O?s+2??ϧ????????7????U?????`Y?????J{r?'m??W B?u????ۚ?]??3?4c??B??Ѳ1-k??/8u?4?3????.?'??u?u?v???"??nx ?" "+x?FΆ??8Uc??ۚ?2Qqb?E?K?I?<.??$a?????p?IA?U????a6_?P?-?T??;x;GE?h??"V?????YD?d?)?` ?aX?l?y??Ez^?|#??6???+r??4????{k?J??}??Y?TiMv??Z??? ++????? zw<%8?Q?YHbH? ?6??yWRk&?9iKg?r?0+W ??c??Ђ?r:??????5??]????!ޘ?v?????z?0?n?Ba??? ??A??R,#?%]QshE??_?kө?+#?>ڬ?_y?Z?"? ?-?uh?????/&?Nl?{W???6hm?]֚-U?V?~?CD?R#P.U?TB???4?eՁu???]???#X?D\?,늟ԇ?1?????l؇??yg|R??,?ЬZ~ܚx?>??7 sgƆ??H?A????[?a??ճ??>n*?"?2???F;n2a????}?qZ???CԼ9?s:97z_E?7'\?ܶMz?ƀ?&'??5f?=N???^K??^????6??????9??????ϯ????????`??_?k6?q???Y⯬?;(X?0 ??R/?|"v7w??v?AY3?T ??a+K?ΌAoV ?+???A?XHm6n????NK???a??5s?l)ǡ?y_???~?|?;oys?m?????&?'?o????g_??摙????r۲?cV~b?a?$?Ѱv*??k֫W???8??C ?}?y????n꽠????ƈ?k,ǣ?g???H^?|Q??^ ++g?N?0?1?]=?L??9?!`?ue0?9?1yXۼ+W3?n+1ח????2??,c rWX???`Dp{??0"n?V?˲??*??ln?r?? ???B?˦?,??ܫ??û?@}???RS?S????e??l]N?????y??X?1??ak?q??XVWb V)?|I?0N?i????rC??z8????|?n??i%37?Ei???-?4?4?(???-j`,???N??(??Z? 9? ++c??2[?>֩?r?aV?p75?i?????<_}?,?4???E?1???=?kV???Ѻ?2?痏d?|?2??YN+??}?u~5??????6?M2?"????qh?:Ӛr??X????)????۠?Ά,??>Y/?ٟ????N????Y?ʯcj8??fj?.RA???R?h??D?? 󎭵?Ġ??????,?cf?O?mԃ??D?>x?7?-?h?K5?,?M????|?V?F??:'s4XL??ۉө?w?-???m?^?????????"??]?QQ???> ++`?D??&??? ??G?N??? ???W?̷?QY???g??|0?=ô?-?-???H??ad[rZ??hD??6? ?.?$޹?!??Q?K?<'??R???6 ???4???Y???1?T?FM??&???Ƭ3Ҥz???TN?L?;썶4?+eo[Ȓݥ??5讕?fdž (X5(????`????;?l?u*f???????L?CT?3Ru?Y?????Uv???????x?zZQ١BAl}!h?r??`"??U?`??9?ɺI?+?+??"E?l?j??d??r??"u?yFq?E???C?&?mi???? ??l???MQTV???+?%???Ai?r?ݘ??a]9?[e????޴?#???1?I??!5>Y???l?u?fR?y??dz?>KB?"?6??k???????A.Go??`F ?~?e?e?{(h?fD?O?=?????w???"{ F ???"?ޒ?????̆?XGcY???B??l?>%?d텰???y?C? ??֖??DQCf??6 k????????MJ???]?!7Ǣ3>n??oX?w?޸?????c>????v?[?ɪO!>fB?ར?C?????????o????ޓc??y??˥????_???_?????fk??????"!???Ed? )ˮٛ?ra? N?G2?R@[:?<\^?k??\? 5? ++??l?????l??C??y????+??º?Z?e??t??(??"?bI?l?K???\? a???j? \_v,.x ?%{j????s??????ϯ???????e3u??AGQ~L?׃U61q?܏?\????? ??(???]???*4h??-?ya|Fy*:????Q??G?X?????Q?P??????0?Ry?P?<XG?e?@V?s?ih\Q?K+,??????????z???D0???:???L??Ŕ1?4?s?-?8??@?1?@ێ??CO????7YD?,L'?!#1?ƫ?? ?X[?>_?޷????+?b??B????~?c?-$N??]?r?rT??{??f??,i?F$.??b??`??Y?=???ɥ35~~??wz޲?Q???DԌw?h???b?0Z/?\??a???yI?Ԕ8?2)ͼ)? ?S߯?.V???b??;7??AJ?|ﲎ|yޙf?9?p>?U????Dž??z??? ?p??4??B????Қ??????e??}BC???2?a#edV? ??)?TJ}??َ#???l1?E????,?"ۢ?fcHe?`. 0??آ????K?<̈́9?E?T?='????*??i]???By?3??>x??eTvڐx ++???w?????_і???cSfT??92ҹ?W~??????O??×?ևZ?ƹ?2ȦP{e*?s??`'39??β&???鈉lj(^?m??̴.Ƙ2??ZJ{}?? ??H?RF?m?/j?ܭ?tü3Ʈ=???k ???0˼?????}?!??Q?c5J:{???"[D???^??Ԯp?bF ?5?k??װN????ʮ??ڑWl??9??$?]V??@ P?????9?կ?????Om??:ku>z Ͳ ++:?ڝ0??m5?+?A?*X?AԚ+??? Ǽ?o5I?T???cH?!F??)??P?+??VܙwE?!????ׁ?A??????SJ?| >|T.????W??1?É?x?? ???????#/{??ݕsw̍???????!Kl?o?v??㳔?!eNY?9TV?lxG?5- N?|Eed-ɲvV???c1?C9>S/?́?%?p?a.?<<+?C?m(???Q?????g??l??YW????{4?.??_?????٪??H?+/ ++?????l?~KR?? ?0z?I/?a??b?2R?$?????,S?_???R????]-SD?a?^ֶ3????·/\????΍ݵ??O????;?v?7)?^?/??(SY r{????3?,??K?4BXm???)?t^?"?)?AC"r??`i?1???Kg???6Ol1y?ى?????Idg?{? ++?dO??_???A?#4ٮ{?я$dlT??jg?jw[??cFr?ok?*w=E*?&???y}?:??'jSB?e?1??????C)̇cV??aХҧ??w1??t?1:; 2??J???ִNH#g?{?x;????4?No??`il????˝f;c?"????#???Y)8??,???T???f?>? ++H?n??3d?????z???K?~?}?x?id?@?o????2??/?gF r???~???ᦓ$?a?K%'?CWωf?Fk ?Q? 8ejmh.? r7Z[aNڢ~?ى?v??S?Ej?y??????h????O?s?????%Ȣ>?pc??vջ0??ƽ?1ſT#?3?N(9v?H?J2?M?c]w?? ??>9V?~Ufd????Fog???CM? ??>~???O??:[?m?(??+???᪎??cqD??"?osr????/??~?????ۨ?3W K??v?[??X??$?3X??v?:???9Z?? ??j? ??_` ?&Ǚ???e,6?s:y?0??I6???:#o? ???uљՖ????=?zg]?ϛ?s?0?8=1???w??rr?X?4?XD?S????>G?_???????????_7??leg?6j`sX1b?z???N?*G?e??c??t ++L ?S?q&R?,y?b?90?,S??-??i*U?^YNP?????| IDAT???~?(@A??O3 ?,????5p?wK?#????)K?]??d+j?R???,/???%1qX?8?( ?j?S??QHjP)0??+?P??G?S??g??R7?gB?`?s?????=2 ++??{?X????|?Ͼ?C>|Ԁ1V?C=?P?RkRy?ͤ?????̕?(??ǎ?? ++??Ԋ?^?!??|?v?ygF ?b??YJ??6YҴ&???ĵV?????z??p???[?? \??F??R&?R-?????j?u*?J`>?:U??[?dY?]??G??L????z???????Y??-?h?Nʕ?d=_?c?i\o??ظ?l??3v?;?^J?R?4??g?????i&%?B:j?3?????Y??Ŋ?-3?ʞ1?y>?ܙ?cON?5??.?,'?'b?KC????$????? ?֧?߳??;?e????d??6Y?N?m???p?v?!?;?N???3"????~қ????G>???|??????.gݓ??,??R?v??̃?}?%?F?hN?r-??ud J]?C ?]???`????(?@?4`x؋d??ie̍???󆯯?M1???e??D ++i:_f ? ??2}?KAxWjOh????=?=?K??V@X??e?њ??u?점?c?y֙/????F_5?O?:c?*?g??ȾNޮ?kp?'? ?(tX n"$&?J?]?N??@wW}A???h 5?i?????:??????? ?E?=8?"c Z??f??r??q????{?v?q??0Cy?ˢ?t???M_???n??*+]9???#" ?C#??u??^βJϔm???ۙ?y?x??K??^??l?F????zg??yg[?)k ?׾??bX;K?d??a?&@;n??U;O#??OW???Z?U?C?U???5???|Zz?o?r??Әdؘ?i??ˬk??7N<<=r{??I֋??ۮ???6?mǗ???x?b?ل? /???A??wax?>?ń???W ???S?њ,??ϝ-????j??L?:wn??za?J6K??%oe??'?????? ?vYٶ?w?x*^D?%(????????ύfR?d?9~ MM??g2,˞\?Ӝ?<"#?+9?>???>??i?R?T9?x??u~u??{,2??|`?F?i?F??ʎ?!Q.'???D???ƈ???km?y??"?P?}B6?S???L}??\???7??_uv?M?ł?'K???w+?gTs??uX ++4????~?n?R???9??????D*6??P?v|?k?E"??B???U?0d?:?????9uőH?1ԯ???w??4@?$?~?"???笑\??%?c??M?? ?-x?W?????????e[έ??)?=]u }?=?HT?o?" ???3??dh?O^?+q?>??N? ?yK?AgRDl?9?i???I???̰?뒋?M?c'=??x????[?o?Ω(?=e,_" ??=?v:eۮ????|?ےR???^6/?????`{9?<)%??{_?/???w??=l$1w?qjMh??xW??ŀ?:XW9??????%?e#?c3?_6"??̱S?{bs??m???F??hC?%?078/??O^n;k?S?yY??W?,?*5j????I|l칗m?qӳ\LJL??z?^???Nlڤ[:{8??? ??`l????????????o????+?:????P?Q?eS?@U???*Z??k\VZ?-?Q??S?t>ء"*`??l2稳???x ??:??5ؙ?@!?у??5?? \??E7JF?q???lE??B?ʿLe???482v?*???7?Uw~rcf?????՚?ֽ?;?{υ??ѿ?8L?3f??X3|???IѠ?W?j0??@????jT?4*?$?r??S?ἧ???K????K??? ++?T??mr^??????Dp?/M?\?p??? V.??R???B??=sbT6!? ++L???R?ꫫx?vo??AI3 ??R?n????;Q?N?ؓO??v???jɜ;???Ϩ sk?1?o???`S-??P?b(km?n?|e??{??z????[?_????3ӻ??Cp??p???,i???????3v5?v ?wS?8?c )?"????????K??7?\??yǻ??h?7k?qjζ??.||???;?˙17????y;?6y2Z5E???y0???v?|n?? z??]???ǝu]??0???8??=??e??Y??^k?H??c???ͼ?'3?;????2??7?U???-????B[?'??+???oܭ?Z?}?;?$*p?~??????,?C?^C?~8?ޟ?D?$??x????????O??? l???O?:???MB???9j??feGi?:?n?d@?,????'̛s~??????7??? [??`]\??????? N?gn????A8H7?;I????>CJ?AQ??N??)?H?V??c0???/>g~????????;??????{ ֵAt?M?????_??}? eYa],?,? ?wb?EՄ??9??󇏬}??W??e`??Ǐ?X ???99-З??{[p?????Sef{ߴ?"??ܝ?T??([u?ʋ)%fβdew??d9;??ܜŌɂ1?q??Q[ ???6???r7?c??;?V?1??i?F⬮????f?B????d?F{??n??`9'? 3?\?? h?i??????Uh?^!pt???&r?p틷?P?e ++? ++??n?????]6??8lrk)\??!??,???"??\? bjx/??a){Ĝ?U/32?5???????ʢ63lW???2???]6??`?Sks?$l?h??Z?N-UǥȢ-????^?aܞo??s ????8rg??治_q>{??b|??'?}S??H?z????????\???J ????[???!?7?v??x?1???? sݺ?????5??3?&?q?]?5ɪ????[ľ`ߡ??"-K5Z=?,D 4r/?v???b?iT?/5TF?G???R???\??w?????H?|?s} Fʌ5????n?_N|???-~???|??#q??5اr*???KX?Z/?fW?8'6?'ՊF?Y???i????F??????J9\_?????I?"#OS͞#?9љ??"?߳ڕ?)?3?؍"o??Ќ%?zG ܇جȥ?H?? c|???????}?0o??v&}???3ެ??]??O???F?'?b??A?1o?w?????]?????{???1?{???rv?%4?q??/?.TTPչգ??9????? ++ ??|,??uO??????x??? k"m?Z?W?K???:???ɹ???k?v?(o???H??Igǵ?i ?˭?QQ ?,????O??c?1?+[2G=?׾L{F??d?? o'?~%g2????M~?? ???C?IM?}?>?6???=??kV?JS????ݜ????%'???m??????|?????????6??,]?9?6t?mΣ????Ԝ?t:1??>?? ++\l~?L?fr3n\??L??vz;?N5???+???e? ???Y???yE?d7޼=s}Q?S?Ug=/z??x{a?z ???[~?W_?^?~W??cwf?r=D????c?E??Ms??׶?______????????:???Y?5?&?_s???z>)?"??/Ԉ??uB ++Ȧ???o???>?#E?X??~??+_YA?̝^? `r?,?,;@Ohma΁ye?%?h???? ?س?(~??B)?:T?TSu?wܰ?B??vb??l$T?Mfb???????&-???Yk?h??43?Y?.1Y?PE???rQC5+???eh(w?\SC??Rx?pY?????g????2E+?l????????3i??,???Y?p??????y???j?}ߪ ?tk=?H???M??w"?xd???TX?j????????/:re)?11?S#|??{2?,?W15 ?rm?Y??,M?֫?\O??6b???U?.???z5חN?J+[Rwg????E????#XW &?*?𖬧?{nb?f7?c?\?[???,??kn??{????"?i?U69?,?M*,o?8?+Y?.ɛ7?زr}~V???>B6??Yh???=j??' >?#??????p}l??$ˣ???mV6???????fc]??%ӱh?x ?u=?????s̙98Ի??E9?.k?44t=?V?}?K???o??3ۋ?-P!??q?^????c????+?D5??=˲???U}bx&??e?x?^???*w{%Qaƛ?7??U??1ɥ3??????;????\????f]Y6????V?;e???RõIr??Jo?@Z?l?Lz.X??!????U??????1X???6. ֖?U??2?=^?R?[?X/'????(?Gh?Ծi\?K2???R?U&V?S??]???ș??$???i??? ??`w.Ÿ]l]???̨7??Z?!?L??N?N??-\??~ܞ a???kh?????$?D????? E?ZcI?`9D?`?l??Z>;??Z??'K?9???:??????cf?b辿?????1????h???ŝ?έ-?a?D1>??X}??(???1?.??/r?(˹? X"??*kVNF?ns:?' Z*?c?&g?v??*?5G???;1?dqC2TU?+?WB?I??Օq??s?IL'????? Re9????۞_???>?rO"B??0F?N?????9?6?g????갷β??sO?)_{#??Ϲ?yn?? \??y'??:?bgh~?H??R?zQD????'???T?謥1bgI?ޒnia?? ?\h7?:?aLY??9"?? RX+?????~Ώ??W?? E??????E???6?b?9??iDa?ƾ_1+?Y:r?j??fy9??X??w?:Ǎ?Efi+e?}LгZyt%3?j)?????u}`̃?R?|??????'?lԲhTT??"Pw> ?n??"2cj?,?P??(K?B֍i;?Z???f?7?{G?7?????tF N?cK?????X8??????R??w?w^>,?3{}wg?|???8? u}??/>`??ʸ?ѹ ??|`?`Ɛr????B\;T??p?-?ǿ???g???Z?<??4??ӎ???k??U?u$P???r??Y֘D[?"z???i??Q?a ?????[??????????6?5TlF6?&u??ȡCZE??p?! ?.?F1?˙?q?p?hF;??PU????H?"Hb??){?I?bګ)??? ?;?????R?p"7}?;&?? ++KwRe??Q?^`b ++p?%??Tl?? 9D#?j??~? ?p5'r?8 p?????F?Ӣ@| ???e?z1????L0T4??+il9??b`M?'???YC:}??:?YO???1]>?????????o??e?k?UX ???a}˟???????????)ٸ?zo??="?$?X?ʲ??܎??h?&?ډ9d?:M??"%?;j?2??2?h???a?L???R??ݝ????Ծ?@? ?Y?????????y?Px?;g&̹?????????_?᫗g??e?ej???q_?w?j¶T?ɞVHg?????? IDAT?DM??W|u??5D6?c?6ⲗ,??ٖ??!6rq?9GoR???ODt??Eֹ?E@YVf??8??s`c?8?Jn?t?*?O?0{m?e?R?&?dF????kG?T?b?c?)?ʭ5J ?V?Ȼ?W????W?f?q?V???r?e?m?~=? ?ǭ3?¶?ݘ?Ɩ? ?k??w????^V??'? ?u ++??Z?I@82u??????c?bP?y?h???b=]N?1נ?N?s?y??e???{?] \?4??끝\?s?/?sL١yL?5aFY??C??eq?^???_???|??????[?????0ǀhX?oF%gC"9?{?U????~}??-?{F????_??E ++?ko??????OY???JT?G?O?7?k?Q]C? ?G???k1Y?????????н??ԕ"?@??sR?k-?C{J)p??/?ճ?CYv ?Z?|hpypv?c\ٿ???Kc-?m+,??f7)-7wև????Q/+G??m??E?m*㺳??Z*?R????m????T?G%j?{?,:?w\? ʠTK?)K???\zT{@?̹K` ???H??*?f?? Uൂi_sV??z??vw">LO???5P:????^?s?±?)P??5?????0??tb)4Fq)?d??s?,??=݈?e??"xw?҉??Fڑ{???uX띕]???%ِ??Mj6??5??9@c&`?5\??,FĊ?$\?sG}?ET1????;Ș????$1#RV.???'??I݌v????ԣ5?M Jߍ??v?-#]:<:?h??I}??C???rY????5fe?hvEL(??8???? ????M}?g1??"Ee?Ao???tUF???(??K?X???Q'6??@u??3'-Hr?-?0?@Ԃ????b????fz?%^ {Ҁه??c ??d-8?Z???X.?eH 3??O~*F:??kM?xfK?F????????yf֯?S?;"Z?3???ŝ6??>B?VJw??,?k?;?4?땩eO\??3)??????TK??iOY'D%hL?Bɬ/???~Jxd?-??????????g?j?F??i(?%R[?N#b2?? ++?RQ???U?}?R?~?O???v> j`?t?P9D?Cu???X? ??m??j??g?S ?V?~,RIY??? X/ ??P^b? ??????J?~y???????7?,?_?? >9???|0[?( cL???o?9???7QkZ:e?:+6??|2????q?1|?v??ʽb%??v'1? ?e~L??ȫ3q???)޹p?v?7???`???V ++?+?t????o$?eC5????ISu??6??h9?o??1?:vf|???????֠?[AL?uR? ?aIC???k-?u??p ??Y?:????W?ϞV??23? |????`??ʺP??#^?Q?^?>Y?c?;8?????? ;?F?zQ,ЄK-̗θ?>و??HRt???f$Ɛ?Q?`??Dzp'f?{{>??/??>??_?? ??R7F???g??_??-?????????_??G,?9???Ҫ??b???#7S?pRx?u?f?!?Rʔ?W???+BLW?B?_-;?+&m ++SM??}Uӝ? ??? ++?F8_,??RV??\??gAw????-?9??Y(? 㯁`1????xHC15r??z&?T??ӂ?X ++Y?ڳ??c`㞍? P?Y9[Rl????u?u?????y??OYps>,? ++??_SWYQ?~ރ??????9??????K?n??z??????????{è ?Z???]?\??y????d^?!???v???9?;??P[??>E*z??R??_???SN??5C?fg?=3?*?Tcb??. ?Ӫ?d?=?C???i??YpI?ۣ??%??s?EZ:F?-B?W?G?ۦ,?чl@s???aZV??ʦ4?e??F?e??2 ??ZVc?? j?l????A???o?>o?R(?2????F??rL?.??"Gt^A??9???j?zQvl?Ă?`_)?AĪ?XS?5??+?s??_?kP??? ???L?/X??{5???Rrxbb??1?Z???[???????l??+??ԋ?}??y?w?????#???:$?]i4??`&??????=?޵V ?=?do?2^|??Օ????????????ӟ???a???m?5?N䲀@???? Y??? B?5?d?$Zh?$?Aa?o????o??;?/?r??Gk?????lv?,-?F?^?;t{?I?P? Ѫ???S??lC ++'7?с?21?x{??G?a??O???e}?{??zU??"?$?$??R*M??H?=????,??[?????x??1'Q'=??@B? ?yU3&?t??A?̋_?,?o????cd?L?P?"???l ? ?M????)???+?<ssi??A??tT???z??K?X??aW?ǬԐ???0?ઋ???m?|>0?A?~?, #:?.?t̳???茒{D*9]=PvaW??^?? ++'Aia??d???g~?yk?qj??laٔa}? ? ?&??T?(F?????E?nϞu?NL9u]?-B?+ӞUc??????f??;?C?պunmQ?mI? ????o??o?o?o?o??<$?7_ ++?44au)`?Yn??Y???s-Y?3Ưb??'4I?#?m?ؒ???k??=??"Ɏ??iu7=?'CE???lU??o??//dՔ???Q?2x???'???G ++]Me?ѷ^??4K?6?պ(?(b??*v?@x'?uf??g.???LJ?5?)>???S?uZ????eu?"c?hZs???g?}???=??y????f?Re??4?E??eM?F??:m????\C???5???C?sp? ??Z?ZI?T"? ++7v??zІ??>? j?x?w0?R?9:uӓ??tA0?ز?VmN.[́???J??6?k'fw?  ??eb/?`?a?Uõb?m??o??9?bDZ????Rd!?,33f?0;ɰ5?K?`???`? ?????v?z{?????^Y,?d?FW?qY?P5?Ѻ)??f?ɚ?L?g??ԧ????*??Z??sf ???`?\????z???]????? ?ύN???j> ++-v?Y???i??#?Su\1|)?*?D?@??7?ڥ??R0.?]?O y|Lbv????>Ԍ?? ??|?l??&?|??/?nb????z??f`d?\?X ?F!?T?1?Ζ???4??R?2yzz?u?8????;b?͊?1\?f?A?l?m????1?QcR7?5?P,??ÁB???6ɥ?̫??}HM??O??6?nFy??v?I??f??\??,t?ʠ=??4>?Zv?NɈ+?>=ת?2o?1(??}?L?G3???r?(:??X3?ѩ[??S?XA???٧m'?Zǟ?&?????IT?Zk?o????1?Kf_??ˎ??M?Ey????"?z??xY?9????s}??=????&?ۑ{s(??1Ӎ?v??V?H{??[?v???$?ӎ?M?f1?K?b??-????????~??????????>??Ǭ\?̓?}?J?X+?\?,˗L???0.???'?u~Ĭ?p?????p????;???o???????G?????_???s?&?>?G>n?$??Usָ?j?L??و?l?{r??? FxD*?9R??;?v??ڽ??$+L?r?lXK?}?Ř]./??˒??3??T? ?^a6z,?.&U߰,3??P$Ø???VЊ2??z???=??P????q3l E?4Q?n???GZ??;?2R??? _?v{U?a??0K??]&?SQa^??LЯ ?x?5EjC?l???? ??Z??A?^݁=H?W?H ?,?cb?b???P?9???7?? ??ȏ?f&?cf???ۜ?Yf?* AP3?5q??t ???~eR????c?'?? ?,??(???8oEޫ?:?2????'Ч??L?Ӫc??T"m?????????? ?m<__?)_~͙ԴZ?l? ??sy???LV????T_?,?ǽ???"s???j?%5l g?}NYu??k???|- lX> ????:q>v?1dm?kv?q???????ד?&76?+?)6?P?|?:˥?M???S???{ "k??6??z?Dz &??K????D?`Y+у?K???[?????J?????}?3>????~?T?ɋI57?r(Ƌ?m???tJ???R?y?,?H,,/???&沚MCR_???%??&?,Ƙi??gS26߫SA?d&gqS&JK ?b?o?Nk#?? b??7g4??N?]v????{/?9,H'?̩?z:?_k%?? W?R????OJY??,?T??.???4h&eI?.??|???? ??l??K?95GM??o?r?2? ++???T?ds?????@??4upZ: 5????*???҂(?:???M:?c?@Qs??T???#4??q??U?Q???? ?6is?,,?Hec???~??j??ʜ?W8? V&???b???,??ŧrB???hGa[?Y잶????WXR????????;???}S G? IDAT??????Ǥ??scq?5+.ߺ??e?ʔS? R&???׏????[??h?7K?????6?M?V?cUd ??W?v!\H????+K0?\?????aKa?N?.?}轩?'??5???/??$A??, ???|?????0????S?1)V?s'?ܞ???k??jf)bf??u??]?[0]??@{??Z?I?2?}NN{u?V??y?l?ʠ$+/?!??~;???B&??%A???E|Ph|????1x??????<=?}??V?P?#??????9n\?^(u?hr)?????أ? |?? ????????J-?:tvm9W??!??n?C???Ҟ,{?? ++u?D?* ??а?2?̞9???y?v|q?@?dgl?r!L?~6C?v#? ?K?&????ި?R?d?~???YNM??? ??>9???YyJ?=?T??9P?Ї%??7?@? ??H??M?i%??(ܮ7??B;ϕ6????Βa2H???e??^ضB?Pj??o"???k?Mk?,+?:7?@D1?b?p?,?????Q???^?BD֋1?Z??T3?L}X?9Tb??_?????i7??ǣ ?٤~×]Ӓ?H???첬????}t???(??T??@ LY?f?>?+x]1???~P.5ہ?y]??b?7?ŝ?$3?=?D?$ ??Jc5?p7?`ݠ???????~?Ҏ&Ws?N???X 4?L?C5??F??-A?????ZXf0?2B??Y??1E?%???`yZ???L??a???T[Ԡ?????oh?1??d?? ++??;?????>(?U?????ڌ挝p_{?@??1?????GZ50U ?H??TV? P&??>???Gۍ????3???B?Jg?~??o}?@??x???vE??+?x٣?i:???Te?yny^???:?y1Ry?)bN? ???S?e ??r?"?+?^???3Ӳν/r???ZW?F0?^??????8}?t ?\R??Z?Q??P?G??T ;?*Y?9I????sk^???8wdw1gR???)r??g????@?????5XF?3-?_?:&?Z?/???!b#?|?}?ϵ??@?v??ͯ?!?`Q??1?`?????????{??_???????W_??K?w??&Ǖ?r0????N?7>???:E?PZa)??,|??%K}L????W??2?No???~ ++s?o?_?/???????G? ۻϙS?}3??Na??9k1??A???H/?^??Ls?????C?t- ?]? ?bec?w??tf {?`???r?_? ?$??Yv???fnF?!b????,N熗E???????ٍ?4i?qK ??qm?R?????? ?Q?ħ???ܟ?a%??/??h?K- ??+?m%~ ???[?lnu????J]??+?;:^Et)V(???L?ͷ!??:?mMgPL<]X?يr;??1???>????P?9???h?o)??w?ȯ?"?????[?????????6???5Z1??I????/R???5??L?CeM?0?0lP?}-?NU????w??X>?aۘ??v۳I?q_Q????+?+??S??28???? 5?== ++so?U?????F??;?(???5?Cţ+?*?????p??ؠ\6|-pk9d?t??h|????c?p??̘??1?]w???|??E?ȶp{o??GH?q?L?^???peU??5??????T?y???q=??<'f2????Zeg>_?׼8?+6dG???z?g??h??h??]D???8?,?\?^h?t)s???ǐ*mB?;? ?"??m(??x?6?9(i =?R????Ȅ"??n?٘?g=??B\Y?s?x?He? ?,̡?ы?I:?Ff?)u??Ϟ???a??(˙1a0??e?p???*???w???G??w???M?/L?????7oW?Hf=8????0??? ???7?*}?׾??c?%bl??'?????+???/?a??+?7V??S>ĕ???S}??N޿???/~E)???².i??3???*?E`?? ?i=9C???6?wN;QXcf6??Ne?#ϲ?o}?? ?F3?[?v ?)?f?1?]????p9?????NE?ÀQ?r8'??\???1?T?ۥr?]??4zL??hG`??<?˦m??e??3=??=(???c`???J/??">?2?c*S?{Վ`?? >4?.????1?Nz??Ƨ???y?ꆴ??u?1䲐.?0Y&j????Lc???*F??d??k1???U ????li ?5˴?fM??!:?1F?lD????"Gө??@? ݳv/?Q??~$?+6?K????&A?d?QD$??????w̜7~??OY/?ύ?'??49C)g?쏇?RI????k????l??WBD? E???d'?w?gB?̳?S?L?>?O???TeE?d?????j???q˟???qG?\??T*/%????V????lO???|7D??(?1?f%A???/8?67????????? ?Eu??ɭ5f??L?e????aq8?asj~Qr?G?m?^&?e?f?rH?????????GF??#h??O@F?Ե/?????<?>ٶ??O???=??'oٯp?+???3??? _֟R'????ō??c????P,??'??Tm6?`??C????`t??D!?U??P?F?wڪB?\6Wr?*{W?&?? ??nP`?q??d?lm??Z??ءS,?̩??E~?kȻ|^?λ?????\?Ԑt !j]?[N???f???>d ++hCV?m<>=??!p}y-i?l?8??????M??Hq?? ++?!b?+{?܃g???ʏ?]? ++?Rfu?&?D6??4?f?&??d?{4pdS ??l?? r?I???Tg??{?ZQ???????YO??ż?Ҿ,???,?????!b?$Γu]?]??b?=??O*?H????u?:3? ?????????~|???????h????=<# ~??gt?Ȧ?ɮ??u?Y??_??????>? F?n?%?t]?_??????????ȱ????Y???_?}C?-_P7N5 7???c?z?D?r?ޫ?????0 ?n?z?]cm???6?ʃz ++L?L?Ih???<p??T$Gǻxt??E?CýG??>???h? o??I}??4?+???h????ް ?8??P;e?D[2e???&?d?? ?V*??RG??,?Z???$?+?>R 2?a????ٰ??4Vu?*???/_??SŶ??L?ؑ.?.]?2F?7??&O??????0y5??,?MH ???y?) -:0???s??Ȿ???%???S?]Rׂ??~ɜ?+???HbIt?N?*?M???????H6Ѭa]8,y?S???*m??"r`??2?u?߉Z?)?m??{???^?ڊ?.??#~]?^f ?b???O???e??)'&̸?4??Lm??x?B???bzvR????F?????OJK??}?????|??:]????ow??J?F{:bUТ8??L??{2UXr?{~??J???j???˽x5?9+???????w?B??}??!? ??p5??{s??S\?F:??bO?X?)e???aj?v$? ++?څY??ݤ"5??S"?D'? ++X?????1??? ?;?? ??q??Rm???????kNYC?6?????Lm???a?b??R[?.V???-9??7:?!ˢx???e?V v?C?jQ ??? ++?!??A5NB?R?s?2DEw IP????d5|N?O?c?OԺ];n? ޔ2Ma??xV?4G/y߅? ?}w?? gR?xj?E87?f?????0/??a??F?*?$JY??Vo a????y?|??D?????I???v?̇??Q?????-?4?q?Ԁh??RP??q?F??8??O<ܝ??;?O?~&???Ƕ??+?t3(?̜T???[?!5??+}??0?jn??"?x????Ά??Q>?{;'??????H??<$?p u?N??"?=6??p??ӌ?e ba ++?2?݆???)?2`?'?z???F??f??????!???4\S? ?\?b?J??; ++??/??.?Ua)\"?t9?:þ??_\??B???-pvn?e?*??,Φx ++???']cR`[H?V?\1???>??Q???~??>????/xz?h?X?????????????o??6D ?EJ??/=??VC?? ,ܵH??s ??P p?\??WLGo=0??C0K?*?w??|?X??p????G$??P?@???G?O??FG"?????F?? ??:?G}`u???????4?N?I???sUс????-???{^}??Ft=I?s|ѳ#???????Ie??h?b?k? ?%:]T?%??VP?$?A~?ݥ??p??N$??L?ʲ?ѷ-6??${???dL?ĶF?ʼngK??*??ϑxބ A$??әe?????iZ??^?? ?Uc???????/?-a}#?9?s????5A…?CL?ޯB?H 3'RN?nW???07\??~7?1-s?o?s$?*??^?B?uK??5A??1??3?tٮ?T?? ??x~??/??Fr?"?3?^h?i??ӟ???y?c:??{t*t5&&????J)?a#?<ƍ???R?L??v?և??p?,_6?㯩??%OS?????BF?Xp7?~?mۘ???1D?????U?1??????;%B1?I^h?^?'@??D??6???C??E??&VQ2??.?EBV???+iB??ۂ? I?iW0?ȹ?{#Y'?Lb?b????:?????m??s ?????n?]?>?'??) :B;UT??LѿU㚑?ݢG'9???⭇?\?.?/?ׅHG-??1?VL?R?4????H??@ԇaE?6??????}???)B?Z?<|??????~? iʱ?)??!???̱aמ?w??ɝz2V}?????P?)???Q?LZHS?2q?!???{??.??y??????>í??M?a۰?5n>݁ǻ;??-Q?JN1 Դp:wn3V???#?,??C ++?W)Ě@;?@?y=????n?FYt?????;?S??gRI|???$+t Lp?D?k???2M? t??D[???>????eb))0??ND:Λ???:;??TH??EZ?7?y? ???z?T??????3i=#??M?`?H)?7h??I3?T???)??z^h??ޙ?Bm?V"՜??p?????^O?nI14?T?A@??R? M?tt>????=E?????'d IDAT???>@"9g?? 1?3Ĝ?~??0?0? ??5?#??'?S??Q?D??Yc?e&??b?S"ѣ?*?f?̞???b?X?λrE?b#E?fV6????)VBI?ו?De`=??(紑?X??/??#%3?????}r~DsB??8Qv????!COM????DV??%ⴖP?s?t?m ?Aw?????2????P?&??ɡK'???t?Ib_?Yi?"????b?vI???Y?"_?S?=1?u?,?QS??;? ++?nN:C[?)+͍T?0C???J?K???# 4?S?c??ty??:D?Ԁ Єɱ?HdR???Jj?j4 sjM??ɛGj? ++?C???DB???}k?6A?????Y枉=?x?K'???B-?H?8????He?`?0:D1?)P?r??WC?0??˾???6*?wIƪK???k?%?I?,*0?bY?.I/??kg-??????B??9j¤?Id?N?+e??u?0ɥ{ds???V?0zf0???P???{?^??C?T'?y???2?ۑ?[Ȣ?y??7'>??W4??]?8?өC}??>5~??)L -????? Z ++3ж)o?ܯ?}Q?3?d?CD?ij?[?zf?{?aܲ??6??C=?s???????pWRU???O!??iu??u?? %k???MQ?8?Z8?bF?5(s?^@r?T6J?8??H?A6nf?ʎ?Ol%????????ʆ??q??f'r???㧊OJ=?)#?!)?+f kB???/?=?? c?n?xb??mSNw&fÏ1WNI?b!$??X?4Ś?Ś?9?FҔIF??cV??>~?8~8~8~J ,t???{!?p1??F/?^;y?pE`e??:#cH?|$?.}?4??p_????s-??t@???>?c??>? ???0???:??W?#?ieç)b״S??l?}?C?????^?9O???nl??YiV????????2??!?j ??;uk?vl??Yٖ?? ??P??Ĥ2>?????q? S???rΑ?p???$ t??T]$0@'ŷ??Bx??<ĝ?C???KG??-???e?? ?[zt???Jt?`?????????????m?Pɤ???劌N?Xu|^?j~E ++[Ҕ8??W?H?ٸ?? %g?z?A?wJ??5D?d1y??/K8}??>3?TX??,!?Z?$'z? ??'?X$jIh?p???ӎ?UN?+?n???G8??>??{l8??w?2??x ++%h??}?y<>2?ýc5??i=??3??4?`?(??̅?Rh-?4???.???L?>???'j??խB2ѳ?Yƿ??ͥ?)?T??лW?????"???1_??n?e? '?]???!??E?O???pE?M?:mϜԐ?dz???`??,?ѕS.??>?? ?X??>????V7t?*??X??gT? u?98????,?1p?V?縎????s?TyJ?-??9?(?&t?>?IY둲??????~:???_??Ƈ~??v|?d?n??ܘ??????w??d?(???*??S???e1?.?I??+?:?? AF2:?u???5?kՍ?1?? k?(??ko?y ??9?aj?YpI???C2?N*???Նt?ue*1첋??????8"+^?????K ?? ++>9/_??t:Q?ǐ?[1?Q#??9?1?n?h?a????p?9?????v??"??'C\????a@??????l???ұ??d?2ޭѹk:?J???W$)y?ԭ3?θ Y?f???n?m>?>??HV?gQdu???t(0)??Ś?+} JS?$vGP?0??u??\́??9?rU+iQ??0¦H ?h&u???u!{????V?f????l ?R??_(?8%E??S??"?e@?`?}ĵ?֙??ϑx??.??4???????=?T???+{?k%?'?U|<&70N?@???Iݗ???~JK>??=???V?fԡF???FZc?䋱V??????n?m??cQ?4 ??? b?b??H?zhM?}??؃y ??'???t!???U?kR??=f?Z?{?*??? ?U?"Q?????1K?^H?EZY}eR??C????ӭ`? ?????????????-???/?XwJ??^iy??G??GJf??͠?????W?Y7??'?ڙ^??uk*?t:??I???D??b?????l??#i?U? a.%@? 꺲,3?E???3?|Z??^?gr*h??zt?%?>??&?Ab?? (?ө2O;??E9?'??v?????ꎤ?hG?=??8ni??~o???e??T?w?o3;Qv??鉭&&?LIIi3?k??o?ϙ?o?g?iVnG? ESEz"?I??Vc&tIi2??f?eo?rrC????k?Yy?h6???;??/~?????w>=????׿????????#????&??Ơ??Y??]?9??)?&?[?נ?hJ??3 ++v???ݻo(?d&???r?ew???]??}?3?yI?9?bW锅??F??[?)Ok&??YJ???]??Mh?]???????Χ??1e???@?fhBgG=??W??????˷d??XO????[? ??4*b?mk?R??N9??#??D\?lvbm?%?q?֝? ++Z?5)Am ++?41?|?׿nܼxA;?????%????0R??? ??e?^?9?0????A??!?p???[?D;?U6?ы!???=??x:V?8}??|?d???)?w???f??C??]?9?????ټ??:R ++N?-???T- ?Δ?@?]?>?i?L?+?X?3V@?m3?+i?]?'hFa)?g???ǜ?v?ɂ?Rf?g?[??H??1W?=DΙ?S?ni$?????? ?^?ջ?a??蛱+F;V?? ++6z????2Q?Ɯ?xΉ?[&?Buwb????y??????????~M??/^? >G?????_}?-???7?y ????!9?^ ++?q-???0?[??&?????Oy????{????u?a?֑|W??FZ ? I?j??????VR??ܡV?d?#}?y???????2?r~?r8?֍?F蛒U????J?5??mCd?os??? /?'?? ????x???_??K??8???????f??u?%?uc?iT8s C???1?L;z?S^??ϑ??M?V??ӟ??|??????Y??n??k?H?):g?v ++#?s.?? ??T&č????????N?????z?܇?s?Á?Z>@ZO?+??2m0??k?W????@?J?Ĭ??? 9??T?)??ކX>\?}kh?()ܨ?????9????",NrE?E?BZ#??4%n?=?>???u??9pͽNE"?Z#Qۏ??l-??? ++??? ?m$?=P??HG+?????琈?}IS??َ?p????ub(ax???C?lk?.??ܬ??p?-???x??y?G?k??i???n>?D%)?*L?u}??h?????J???j$??s6j?[/Ҕ???=~YZ?Sΐ ??{?dtU?c?????W??Ը?AӀ?Y7?2?3?L-! ⍤?2???kb? Zş?5R??Ct?u?D̺?x???i??uؤp:u?7?F?JK??3??Oah????????=?{?A?%?H?*] m??u?u.=?Xc??"? $????g???F?Fb??/????J4d?x?s?Z??\?|֣?F??Ww?w?JG???OW,????ズQ???~d??U~??G??ן????xF???kE??e??> ?\??a IDATn??Q+9n5??"?D]Ԃ??????5?e&?????? ݕK?,Z?F??z??Y!???????QYXO'?2#????dmg?? 2????'2????x?▩?O^QJ櫿?7/o?2{>???(???y˫?W????;???O?y{gmщ??4?[^!????WT??y???W?M?EN? Nɞ???D???td?????j?T??rԯ E'3"u?Ӻ !$ǭ?=?&d??c$r ++?"??-??I???zW.>J??5?'??ئ?N?EhK?o?*??0??~?ٳg?{??;4?R? ++J?Ъ?a#?????=??}?*t[???}b?9??7?U??^ ??Y?& ?i c??????x_i ?A?0c??q ???)???~6 ? ++?s??=???%E????o???U$???Z?T_;2{?Y?&???xqEһ?{b?ވʃ6j^?????|7???S?#<*.&թ?6#+!:l ??C{=??D???f?ˏ^?r??"?v>q??4??_??_??Bꍔm???h?cw*??s4??̒G?M?  ????c????/>?????X?x?4??XI?[?uz???{??/n??>??ا?}?AAf???؅?X?P(34 ????1???g%qm{l???/??|??x?T퍮+g??m???????{>????ݻ{?Ώ????e?c?Q?P4??j???1f`9+?[??]?l?-?Z??z?z?????h͘K&g(e???&+k???Q????ލ\©/?W??jfZ&??q?==?,l?6:T?R?)?8??_'?^???F?36??,?̶F?-悾?0p~?P??^?L&?????????????UYm?s%6#y??9<{?w)p??oUHl??? ??0u? ?i??]\?9?x?Y?!????@?F)ė\R ?50ڭ????????A?R??`搜?ǰ?????y?\.!??94~?4?2*2?|?c-"@?b?] :.)??;??D? ?? ?b?g?0up??d?? [ ?Au ?? i?$Gw??a??KG]?<9????-R?I???^C??=?????D?q?8?*s??????J???rU?l ???A?M??#?d??@?????'?գ?U??%>? ?S?O?ޥG?$????cf??{DF>??U?d?? ++Cq4???V???=???ւC??i?I6??^?/?{?q???G???Ű?W??Ȉ??????/RVGI/??4G䴒??!k??tbx'?????RhuNj?dF+?? /??>H??S_??B??K???_p s??sy,)??U??????FR?i?q??4%8??>vʩ???gĥb?h>?\3??u!???p9_rК?????i(S?`??$ŏ??Ư?Z? ???$?? SJ?????S????1O"?C??\?q?8????/???E??0???????ؚS?-?`??1?o?pp3??k:?8??s(r?Š???5??}m??????fʁ??zĢ????5??? Av?/??W??????Z??r???E??????^?R/??~?r?(|?oX^??)???o???x?????>?????????ƫ;???oغ??????????|???Y??y????n^??????|???[N?)??q?9?????WXR??N??1?Z?"?'Z?R?1?G?r???? $f?*???z?k?%??s??[???)bT|?O³M??"??)5?}vle???hY??^?9??c:M?ɔ:!?а??=g?YՌ1?+?>?Df????Ξ??5?|?̾u??????ˆ$W]}Ӻ׹? Iēp؝eI?)1??٬?,T?fz?3,??N????H.?ٱ&??Cs????J>? Z?'?2?"??????F??ܾ*,q??t??? ++1???1x??>^H?A ?!?L?zgE????ܺ"?=?~??_hm?l??%???5??4R??orhڐX???gy?1?;S`J ̃z?YJi5?M94?I8G lSg?u?a?A???y6??Ҁ???????˸pM{ʹHT?A,?A??\ ?!W??[?έ?s?UДb??hsu?δ??????t ++ J??u;??x?????Q?̓/F?7??^??N??????_????;>??I????r?Z7?N[?GZw")}??a?M?ͫ?u?v'fo??}?XvFUr?? ?g???J? $???\iEh ?+?q?6???*??n3"?1?b"V?k?&1?s?b???NN̔?Θ??`?% 4(?t???z=?):n??s??SiM?????*A??U?8??ydI?/~yǒ+?i???6??eMԺ?|YI>???w???o??Z?St?6ߏ͵2???B?????B?????nm?9_?r3뛕?? ?n^?? ??Hb?/?? ?z?צ??@???|@?.Q?\??z?\????׿bl?????g?G?xU??-8[?2?;?d??'?Z=Ӓ?Ơ?{as?!=C_??5C"Q˃?@qkx6?gk?pZ?c????P?!?f?w?}TZuzw?????eq???O~?6?d??r?/??7,w??g=;? ? ++?vu??8??y???(?ʕ?????$??{#,??'????|?3a1o޾????yotu?ʘ Q??p?$????yN????[=?O?Ə_????B??%? l???? ??#'q??????8?D:Bj??'???z/䔉??)??W?d???????w????2O?G?p?? ++?^.$\"?H?xzz????hd???ih?H?` -??.?[@?ζ=Rb?0? H@FO/3g??m??κ?|Ӿb?#???cp????%ꥒ7íp?+?DžhNJ?8?x????????xlxZ??f?H?Mb ++vR% ??/??ޘ.?1 ?j? \?36?i??????4K?gٍ???????IF\???;h?H:??4?? `? ?9????U?F????,5?\??,~ R?$w?A??l?@?\????ڧj ?t]????. с@??f쯉????"?u??9K????5?g??>?9???rv??fK?(R:???w???? ?c?aI?(`??????????ۅ?B?]Ce'^??_?>?>6?%ӣ?ަ?????"????>B?h?r]ݲ?g?"??j?)GbF?h0????Y??????*?ʒ?? ??B?͵g4J??J=o?u??}?S00Z'z???VIE` ?z8?ZE?X??Y???6R^'?*??s?v)36??r?DQW?$?@ׄ ???R:????\Ó???L???S????o??+?צbu? ???3f?p???uM%??.?ׄ:Rs[??Z?????n?h:X&sZo<=n@?p\? ???c???|? %c9,??I)?????9?=???%'Zo?&>?S4??bp??ۧ?????w㲫S(?O52????'[g?u???E?FSoe????>?D??ֻ?R?X?`?????"?9??8?[%u̎+L?m?.???~??%??C?{?e????ܥ??ˎq??pӅXR!noCZG??S???&?? 9'RN9G?.?/j????*?O?$?{Y?Gh??E??>AjʼnE??&a<3?? &)?=?3???q`?V/;??C?s5???z?0r2??I?ke??̵ ??u??t?e?9m??~?1㲮B:?7????}pXD?(n??2??????????:??B?AYV???1+???MQ????/r?G0.?n?.[? ??&?+w???? .M?o-???X?,??xH?|7(??[b%??*F??B?sC???B? ?:?N\B?t?????Y2?̸+????2??????W{??v??ֱ\?3?_f?1g????;)????L???cƻ??I$?????7Fk\.?\?????mۛs8i=3K3%??&WkZ fC$??GE6t3?9???L?o?b??0>? ?O?? ???Ę??a???ʝ1?'fy??4瀽?Z??a?Z? ++?: )ٲ???D{????z??L??V?Y?}?T??)??????V???F9?&?A9ܐsV?ᜧ????]s??????\??>????/??eu??c:???@??]??3[?0:?4s???7?h3?v"?0??????HOEn????????[-i?w$fԜ 1??9Ij??;??}߹?J$Q`J??u???j͓??j-? ?????\??,?}t?wjy ++c3$?#l??1?D7?e? ?B??-0+?|???̃???y,??C?|0?S}s?*Lj??D????c?/ r?`m?7g??L%P?D?G?W?%ʚ?>HZ:??5???a!v?ǽ?vĥ?O)?4?'???PxLbS? }"??L?A??^?????똩5 u\???^???׋???Jx?'?Y????S)>5??[?X?D6V?????zN?4???H?)?-Kgt?_?????NY2mK?r???bW "?{4?p.?;KI?:?rn?8g.}???9??O?|?2?????????KSn?p∝;OuGn?R???}????!l+??עt?]2??phD?]?Œ?????E?gD?{R??2??N??0?܌FZTgd10???\?]D]?$?wF?[????9?v:?:_?S?~?Kx??k????{1?P?{Ἁ >U?M?&????R??yg?Y?g????? nvat?t????{%?u )?a?hS?4H????L?\?nz^??E?&>g??)L?M?zy?\??=??x ?$$?????hA?i??????j???7?T=?-??)???wG?%???3??%??\? ?56܌???W?Ӂ?v|????5???/y??#?=6j?X?"?J%'Ÿ͔he?J9.??KY??????????I??pMaSp?|??W;O?????7??o??|?xx0?~?#???sh6Z?h???]a\?7????lU{־?D??%j4??N???ێ?L)??a ????Y?[2?????쑿(?0%J~?X???&qy&?C???,u?=?????q?y?Dʴm#e??B?A????|???`??#????????o?d????~h???????????Us?F?J?I?uE?c?W?P̡Xè?eS?W??'U?u???[)??>>???O???Mr-4,rUݛ??Ix?8 ???t?jЈ??[/s??b?f??oQ$??]@??s??m??*ZΆ?lL2,?P??T?????>???d??M??*i?vHq6??Ů????&??)r?`??U?C?}N"???N[???%?/??????X$T(?.?LΉ??-??Z7?N??:?C?/?y?D:?6??e?x2.ύh?iI????n????ON?ЫJ?E?2?u??? ؠ? ?t/?????t ????~???c??u?Rj?"J?$?>??ډ?0?ާ??J??6? !?Ҽb^rq?h??a3?x?|?Z%F???????I??>???1c??(?G?)lO??N?B.???Fyш?? ɝ?dz ??UJ??0??M?tr ++z??4?Ձ??*%^?ϗgS??.?XΫ?]????`=B?Ij?I?????Mױ??T?O??b??{%%?Sv[?.=??D3?C?2*?Z???????? _%9[?? l? ++1???;Vb?<ԟ3F'?"?m2?K??s%???."?-?,zV??N?b'?<??????X? Ğ?iɍ~D?u{0jc??ζoܞn???? ????a$k??-?]??o?%??Q?U??H??+*w????yƯ?ivs?k??J'???)%????_?߈??땐??תn2???\Q>Z#,? ?.?5?,???E?|w?\???_bt?B&?a?????????T???ԭQʢCЌ???gv?u?&E?I????i??D??Tj????)D׽)2iP??L?;^???tKXN?V????VE'ydZ?"q?Zۀf???l??,??F?жD>???L???????2 ++Fax%OR86?q??u???8A? \??Y`J",?.? IDATl^*??`?YӉ????????C??ߞh[??????aї?੝????????& ??Z??flxr1K?D ++?? ?ſ?#???C??????v)????????s?y????5:}?5?9?c??g ?^?Fp?w?,,s6??g?l97?[??&?zn???p??gׯ??L?(H????Q??1A??~ȄG?4??t?r X?@j?? &!?tkr??R+r?*JN?r=(?r???Y?ҠE??q/M'I?8?s&?]x????+5?H?M]l?`??Q[?,w?3h-??N?I?U??L?מ|dWW?o%??R@bಋ?{??cpc?fF??])I?s??s?၈D????????, ?_?0??Ë?#??????W5???=???)???hr=??#т?N???????L??茭?sE=??H?g?xz??, }?τ ]?&???Q?J)+V%?k??<??3???n?NNz?L7bO???7홷#s?y=j ??#{?? oNi???N???K64?`?k ++V??3?$??C?nrS?? !9?= Q??0??r?F?ZC̙uD?1,?Ѝӻ?ׯv?|"ZQ?dWr????OA?;??????a-X??)F?w? ++?02?V#??????~??R????ʡ?????wd??R??9????wJ?KY?q?;??????)~ܠ?7,?H??ՃQ??T!?H??U?&>???JN?QE?]?=}??ܮЛ?y*1???;F??E?:??=???????o7??یT??ؒ?S%a<||??v!q????zE[:?F ?1???GN??c?\??PǙ??H:?KM?4?[ΗJ?o?'V3E?[??5?}??(??^x _???? ߮?????????E?,? ?)Ēp?FĢ4???hĨܮ?H??~???V?????}K???h??[?p?BZ?,?A?>?ՅCy?????"?K?p???m\bZd??䎏??O??@?p}#3Bq?K???yö??ѡD¸jh? _?????~x??sݔ#??c???????$????xqV$?7??_?????3?N????&??7????S&???? \?R??[ ++>R? ?????.B?,R?E?x~??GEl?|362??_k?RY?$?g??:.g????L}??JT7??ӡpU?{??o?!%a?/}??y? %K?????#???+??SR?i???tlOaj5??????P.?e???1`M??:?Ad???9m9???)Me"{?a???[???y????Ǐ|?????7??a???8 ?-9e?_a?5?u]Bd?1?k???G<9??0?D)\gUX???(??~???}??ޘ???TJ??F?z?pW?ok?N????????LZW?S??a??^?D^??.'???1?u?T?????Y?+U?]?⹬???/?? 1?thc~ͥI???{o?K)?U?'?^YO?Brp9K??.?T ++c4????Tl??n`?G.???)s?? 3?&,?r~y&? x.0ř?Y?Kh?\9?????49x?K?\qݭ??F?1{p???ڵ?'P??W!??t??5J)?6;??_?/}?Fq?E???o?I?R????纟,?????????']g??[?????RnW(?S^?"-?W:f?????л????&Y1???%`=??YD?7RsZlx?h?????i??A???q'Ι4 ++?V????k??dq?#L??D?A/)??5????I?݋?O`#?l???s{????5>???}?????^??o??+?? ???^7rS?h????"7??'????S?????????W???z?t?)ō?O?Sf??ێ[c??7#??|w?X?0?????)`?-ڃ?M????O?[?I??q9?KL?Ǖ?2bFz?S?@?????\?|??? v?u??#?K??1\.w???Č?Ory$?\?ʮ?S??l??f ++?H??;??D??p???;???MA?(r????N4???B ??9?\?_:??k??*H?t ??>?0Ed{sz|r7? g?ހ??r??>???"ǘ? Cɡ??q[$ ???d?u ???????䢟s#??r4???KI??10?sV??0??1?'~%??z???0#? #m????+>;??>%? ????f$r?u#???H?¨???uYq?????܍r?Ԫu?{????>`??2???z?כ"!V??ڙ?:G??????g_?0??}? n?VF?V??,G?t??t???S????Mw?7#????X???aP??׉?u?,??{???-"F?$D??E????NJ??? ++%&????"E?%l?i͉%?xw?w?W??\*J??_?mqa?D?x?t?D?Ƭ??b?%???l?XȆ?X ?کg???=???q|??2D?7?MQ??? ͈??o? 2g?4 ??????i]4z?R-o??B9V ??D???8??H?'u?㍱gu?ڠ?y.?1 ++>`ͶޝHr?FJs???HA3?@6?Q??q????e?9)^YB??QgL??#i}?~??ZS?>??mF??????B?E:`??k??x%(ڕj"-Έ??Z9?z?ӥ??L??e?n???E?m??/P8???Q??.?O?o?5??+:?g??t?M??Cٰ??DKج?_??D"???:/Q??C???3?D??}L?O?R??VD"??:???????/{??AZ?"??.g?>?<ݥ6????h3?Kd?'KS????g??RÒ???Bxg??$"?E?m????:y?????JL?z?k?IpN?͈^??ze??J????W;?????ǿZ???????rZ???A??2???J?d?>0??Mv??3??]s?V??CU#H????????#?U?䧯???K_???? ????(6???K?X*? ?u ++Fw?o??X8?????{????Ϊd)??s?j?L?׼?c4?@?????g???W^T??'%? ?i_uvh3{?{ ?ZO???h)è?y???8???(????.???6??!??????????~I?7?|?T(,??????$??#6?$ƌ0 ?2#;?9 ++????ǝ?~S?o??/???CSj???5??~????ú?G?s?n;=*yʹ͕?5:?0??ԋ???>=pXa?;??ݤ?Q??.?????M?4*o>{Ï??\??鳷???????y??5 ++???????s??y&?a%?ֹ??5=o??Ic?ddh??D??cɴ?ȡ???m?Dg??vE??l?O??9?????p j??g????i?A?DԎ[??.?yW?"WM?}?Tc ??8dclrf???Ա^??????©獵,?㪈?n?Ej??ad#?eF???x`?IT???+؏r????W???u?r9s|?????W??r]ۘd?|?R?OX????e0zg??lsX_??&am?ͮ???&?ά'? #t}R??$p90?Z?Z??Ow|??|???y~??;U?)????H?C???}????D;?? ??rC???rJ?*q?nur?zJZ???C?I:??lvO?5?{h?M{?g?U?a???????Ã?˻?1??8?? ?k=9?L??d?K?8,ED??>-G r5Zex?q)vSb?ˌUl??6? ?P?6???S?? ?????fb|??? ????矑??mvo?4:%?u?{Г?9!??=5 0?????7?????̛???z?????o??'l?rxub]lF??u31Or?#?LOJ}H?@ pܹ?P?=f|v?ٛmX??z#??=??iᎏ???@?1?M<ؼg#?i??0??z?b ,\??k?;?n?y???2??5V"?l??E2?vx?7Px?$d??>MC??=?[???5?é`???,&?.R?D??,6G??zEc?????z\#???>?{?c?/??|b%W?r??w?yWZ??[?7L?t???ơ?+?̞bY ++4玐?Սs?KS3?:?E?gX??9?v??{?zw?g?#?,7?|1h?????Kc???;~n?B???5f?ѧ????.?[?VcK?RDF??BJN????7?`o???? ????$x$?????AL'???w?3r? ??TZ#g????,??????=ꝯXn^e??????I}????? ++[?<>^8?[??H??'??5b ++Nu/Ǽݚ?hR??q????9?*?}?3???:?ۺ=?ܜ:%2{????d?e?N?X?=?U#??r"Ghh"?@Z?V?? u??s?ֱtz? I??????t~6?N?$??;{k???˚?tJ%ST?nja7???t?? ++?????Iߴ?n?HDK?%u??????J^ӝ?V~??g\? )g?s?}?|ct???j???L??κ&?$1C1?y)????k:????䊬?k??_?bl??ѧé?R?*%?"?2???h?s??GՂ$?t?(??&B?9uF,䤟$?????0???&?ܰ???w???^??.??F1???xH?㾈<}&??????Z?d6u?]?2?%?Rj???I?2??x?K0??j?M??{?d_????|`?y|z???v~??W???2E?氖{?P??????,??0??^??:?m??i{p??2.??׉?+?9??o?:?1??P?}??p??A?;??d2?i?c\?ъ?l????3???ܾ???,?M.2D??????C?p?1d?????x????$?Ƌ?%?Y ?&??n??y??)?_F????ϙg#i=K3??*l߻??5-??Y-O??2?ƒ7??????w??7? w???????d???kb?`?S?q?p?d?{`?{?????\"eb4Kܽ?ᗿ???4>~??JY?u????;?}v???=9?l?]?a&"679?}???ܙi ??d?]?`1??|Wg??od;?m ?`{n?9D???O???????????g,????wu????X?{?0rct??F?????2x&g ?U????o?n%?ܧ{׾_φw??SXΒ???R21?~??9}?bE]?9 N?ʒN˴?Y????(M???5????M??÷|???\څe$?7Z_Xo?,?K粜(? 3????P??+?3S?C9?X??NYiO(???J:9O?\&.k?C?E??؉?p?????Ab???)???D%?p?}4Fڱ???aV*?$Z?/8??;O???Cal}??9?^!?, ?????矑R???r??s중?F??<Գ:????????D???^??~x??_%*??^?aVc??O???l =BH?T(?Y3A??? ++3,M?;????????P??QW?N?1f?R??5^?ESJ/ ++?}f?_;?a?96?:???= ?r??KQ??????L?fh`XҌ??p?*???8/???V?X?] K?Wב܀6??m??6???/m???@w??&9??LZթ????m? ??N?(?мm??????_6H????ڌfUT^*???????"m?ub~~?Zޝ??>?#v?,e?)??R??sx}???LJ:,K??#?? *kY??E??Ķ?TD?N??N???? ?\Sӭך?qw,4??&٬?pm???&??I??Ď??^???} zk?Rh]???ŵd?Z?yO1; ?h?+?"B???F??ȳ?}?}?.?Zy-t??G??6?k6w+Ϗ????q_~y?tWXN?mA*Ak????)Ȝ?U???r8?%??`D?Xdj?F???ꛢ??l?1K؏???U ?{o?(|O???mi^?"e??F??1?y@??t?{Wʀ???*??@kV?Mk?bPՅ?miF ?U=????Z?{0z%e???."U?S<1??!e +lH$??$>????4???d0U??E?1f????:?eD?%??~'????d?z??w@u?r???n%߰z?R?T???+Z?D?:Q?g?`f x??c ??????7??P??휎?s?㧔B????????g.uǛ??????O8???o IDAT?Ҍ?>?;??獺><???O~?+W?????}?g????L:?f??"'_?A????"?.?*3&?$??Rл?ZW?\m$F???z?\???????nu>_?????op???\?;?Y?Us?9)kd??????????gL?u??:?pMI?+???]????]U?q?q׃{dCO+jI?K?0Uݝ?~??y???5E?w?a?`???????r??<9xq?;??Ӂ?Á?\?????U`?"?3?mh8?U!?\2ֽ???????kL???5???ѥ???b?D????N???C?z%J]?]?E銗SuČ(?L=?M#??<(? ?*?]?ܑ???`{?b???4Go??\?|`lD|?h??s??:.??fh?uv????ESjġ?ώl?A???dh????/4???Qb????2a??ԅk?g?E??.?h[????Lc??b??fG?a?A?j?X?%????J?g:L???ʏ~???3??0Ʀ??9ڃ?sO?Jk?8?$?Q????!? ++7p?h]-H???9F?B?0,:?}???)s????ך/????Q????I???\?????7 ?Ԉ?x??ǥ?/?:edz)?="ɭC??S??uK?S5?}?p=??Y??+?W|*??6?????p?'??H???B?%????}j??b?5?*)3??C??R?V??:?á?*ס?*8[???f?j=BL???9??Y?`?<]?L?hS廷W?N4"??Nw??V??b[$ ?Cġ7?^???p??d?G5? ???????4???Q??L} ????o?x??"1???k??1?Z(?{??D?NJd?8?o??b?Y??{????XF\q???}=????P?`??H\b?t'?.?ϳ???M??Q?XF?`JF??D??j????]"F?%?F?\??yf)!Z?;U-?n??N??z?ی??$ Hg?G?h(??g?A??trFTZfI?+?k?R?T???5?_??JH????ͺ0?·O??_~????3^F?ث?B?tUf~??????ւ?s???%?G? h??n??? FgF?@?v?y????m?8?K:E*???BG?28Յ^??????28???r?=b6Jn??'?{??/?&D,?????J?,??])J߂??{'#?.y?Ń#??f?? e?c?$ɐAoq?)?Q??Q3??F?0??Nũ^?x?=\?B?s#U?٭????>?]-ȯ??#?r⺶?8?5z??8??4????Ҙ??)D ++?٘??_??ߢt^:?2?E?ִ?? ?ԉa-\?b,5??h?^ M?L?T??ѯ.ب???;???̌?7?S????Z ?^?T/Wl !??X?X?)z??O???=?n? ?L:#??gj?k`V????;?}p9K??ީ????f??u??? ?]?c?/f??,5?????V???? ͘???J)?Z&Z "?|θ?>R???7????}??}rDfD:?????n? n\?!?:?2$H.?nI G?p???d5?z??i??N?m=]?????ez??őo?7g??w???w\?~?_?ٯy????xg????;??S6?Ĺ?iP???w_Şf?Q@UC?w?术$?????k?!?D??w?u?_????ܿ???< k?p??8s?r:??????i9!??+??I? s?SǤ5f???ø?XW?"?o At??]յr)????Ah????:iB?$?29?N??P`?lϏ0??F?PZ??qݮ\Ɗ?}????@mb??uk?KlM??X?>????/;0!?jD?P? ??????_}?????|?L??B@R2????? GH?hӌ?:??E??D(T|XD2??????I?Ò@?*?C?C??!??n??'??Z?g8???n???N3?-???ַ>f?T??gk:?? :M?n?9??j~?I?>?Ls?{???z??O)B??]j?r???z?????/i?F?݂?`*s8?t$???Ta?w>; 6??h?{t?S?B??¿??????????X^n??????O?'?õ??N?H??8????k' Z???I=?M? k(????Or?#Rl$???ϷX????]uB?\PY0 +???ʄ???*L?{??/????^??%???N??q?E?Ϯ̏??{?c?;W??(鴄Jaȶ/?d???Gw' 2??t????T/+!8??"??\2?KC? ?????D?ވ??š;% ??F?]9??ATo}?.?9?-?WJD??L?i?R,b??y?? ???`X?92???T??ٝ?G#z??&??'??Z?Ƴ!??X?85]???c8?H??-?.?PM٠??? K?bV??#ݥI????A???\pi)?? ?t[?.?b???M?N? ????vgdyD??VwԂ?.$?9cZt]6T?kN??i??N?8#HGD?w7\7?-??"([(?S?|7\8??p???)??P?[U0?G??A<%Fߜ?v?;?Aq?U??$c?*]? V?b?eJt?:??B??? ?D????p???h?P?f???D??]??*?Ñ?+??1g?????1??#?L?u88????Dv"&?? ??0?n?Qa??5h?zg?H???5?n?:???+??I, 35#j+M?P?B~????*?Q9K4G??sQ?^?EO-D??(1?)??ߞ?|W??QG?&-f?K?G} ++??Ş???????uE-????B1˸????????(????BY? ?????????a?J???}ڣ??H+?e?:9!?p???????KF?fRd.ᎄxא??2 ????e?L9? \???x~#O?bR??Ƃ???L???cOD ??%ޱ?^?lA???????????Y?РF??i??_?????6?|{a6g??%??R? ++D?e?L??6К*Q?^?Oի#??A ? jLL??? ???3p&?? R&ƞp???h 1?;??'dT^/!,5??rK?U?܎}????? ??mt2?y?'?C ?=l$U?c?dq??]3Ag??W?%p??or#?ђ???xHosިlW??T~?????oYN???#?p??P??.H?a??D?μ8??°X?M1o??????e??Z????bS??????̂?U?(G?[????Wk?8????ޒ! :󼰖ƩF???P???#2v?gܕ.??F?????W/???@?1??Q?+?:?N???N???FO?T??e-L?nR??N ?6???;^??G|??3???!1tm=Ի?K???p?ͷE?J ??u?=0"2vWi??~O ;7??){?g"?ql?׹??I? r #??Noz???$?5?>??y?ZI ???G? *?dҩ?SY ?Bt?9???#?#?@?RӍ?{???Y?-??????;? ?s?j??]?|?T?r??ܻ*C=j?I?3r9T???[????[.? ?j?? "a??3 tp*ޮ?4?LD,???=??!xQ???6#??5??9u ++K?1?j?>?k~?p?9?X۸??%;_0nD???%?Qx8?n1fy..#???o?ɠ?????R??3Ҷ?&Ȭ?W???!??z??S ))?eL3??? e??o???5? ?v f??6c>f??d7?(e?:Wjт??X) ?N?з 䯗+??y^???~s~?T???H????G?q9 Z*0:%7_U+]=???????? ?ˊ ++l?c?#v??? ???s$?XK?n?Ce.s????Z?mO????TiI?Zn?,݊D???????̋??s?$A)(SM??&?ь?!6x?S???eF[sS@8? Hak??m??V??u4??;}????|??Ħ????">??5T-???m?̅??3?*YÍж1q%?? ??:M??A?*?;Us??v?ElZ[%?=ǂ?w|??w?/?{?T?pV?6n.D?????C????`.???g??"??$??(m? ?1???F??w W?C)Sl|4?6(??XmH???|??)O`4?I[?p?ec>,???X?J????N?????q?X?n[a??????????Jz֣o4?h??>? u0??N?????oF8??&?3 c??????T??X4?????Ã?($Q?w?ͿX???\c?{???μLT,?͒?r???H?=~5a???v??%?;&???w???Λ1?????D????????o??/~???????O???9????r??ѻV?I,E?O??I? ?F?]?IIx???N2?xn?*???Ļ??KOQ??? !l?r#]?N? IDAT?1K??? Sa?????vY?????֯??(?? /? ?܅?n$7??DVLF(? ??ԡ???wj??????BX²??H??????*?????]??~????v??????g'?1҉J p8z???GT?(e?K:X?????PDG??(A?G??E??Z8?b?? jT???R?\;B?6??)N םӰ??!jqGtc402?? ??T?. ??Gf?F?a??#?]????A@?F?dD??b݌???;???0?F?A???{vW?x?A9???I?X?S??)?Rv?}????"???>g?X??=s1 3?ָ{??V??S?8"q?D"?e???#?2!B??BkB??C;n׈/???T???_???C???d?A?K????#?ٹ??tG?@ȵ?؛??PQ?*+?????A???x????1?R?[?2B?f#E<?N?ٓ?*[|H?vI?#???/$5#?k???>D?}3??]???g?}????hq?5??L??? ++:?x??X??aq???̮49????>??)??N?IS7???K?o?5?_? I?????}PL????UG??c??(1K[AJ?Uc!T?H?}6 <+H?[J΁x|^??ӣq?b???z?y? +? ? ???#?#? /???0)?i?Āj???? ?-??/~??O??r~B??]?x?4b??qzI*ޜ??C?Y[$?1???4A[???n?ʪ3ޜ?btsz{?㌯#??:?l??r cʦ?*Y[?I?r?iM?????;?w??ѯ̧?Y?:??r??f[?B?mWjdr|??4??W?Yh??=???<1??C??̕??nc0/?~5? E?8ʌ?!?;??0?(?W???͢6ūP????T?x??N???j??2J??͍2f0ů?4WN???L???4???Z??? ? ֊ԅ??1Z????MhR???>?߱β???f????|A??%??^Y^Th????=9?B=yz??f)|??????cZS?16???^??5???Z&?L???n???L|???o5???%LFb??yo+2CgC&??????????p|8>?????B? $??Jo????gC????2=??1????7٤ +E(S?q ?~cK%w?]N?C?F??+/???ƺ?q??)}????2?YDl??R?p??:????0?)*?????????al)??j???/???????}_????_??s???|????????5t?????`??E?ܕ???{f????T?s????M1???R??t? ?ԃX'??-??+?j?L?֮?"d?s?????#*o'? ??Q?P??2+3ĕ?R?du¶t??????-:?{?9?B??z?#5??KU???*?DD?,?j?:/?:!?fZ????B??^5DZ?|?g???UQ???d??V3?'ֳ?4??(?$ĈeI? ?P?c~?9?*6Ō??Ч?[??t???AD?u?W??Ͻ?C??~?.?E??z ??Ԙ5?r???1?JUc? ++??????x??p/Z?j?)?s?: ?)?@? ++L?????c? ++?x????F?6?o???UpS???q?~[?JMq?f,?B????֪??s?񂷍m5T'???0Rb??>{ͱ^?\s??Bp?E??3??n??d b???F?^-???몑?T?x?P??????^D???+XC???6wC?)??Xj??ׯ?x?t?? ??șk?:?????:B?/??0?p???|8??N?? gC???l??0?/H???????3Ɗ?3-G?ۙ?>????ޡ5ޛ6?i?????5?^????c??????x|???/+????? ?Kg?-4?7o???????#???_?sa? ??W?|@?Snjh?_ ++???Y?\?m?se:?>??\???囍?2Q???VE?c??a??\?}?D?????T???{???p??B_g?I(??,/Y?;μ,?^i?0 ??b?\?"4?c?2??)??5?a?lk!????w???G?Ia:".lù?5??J?'޾}???|??o:E?Qپ|??Q?_\?`??U?q{?L?rd????W??8???p? L??s? ߮+K?LG????h??g??????????"o??F$??:???(ǪDǗ?##g????c??(l??"v'㰌?H?'???S?}?;??&?? ++?P@J~?c??TbF*1??ȍ???n?xOт?$??Ò1G16ѳf??#? ++?< ????gF??[?o/sI???>?e?$9???? "ցTzڮ??(▪?2lܮIDD??n^6???????.?h????Fܜ??A???1???n.?T??P???)??5@?6t?,??zm????U?g????,??!??+?,??????(???P?i}?xt??ּ?b?.?ЩZ?+I?9?`Y&???k?CE?M8?J 2Mj???9ޜ?????3e?t;A???,????"?m0r????~???iV?????r?ѩ#???ˋ?5??3?6A?Z5?????~Sn ++?i?(??z??ީ??{?Y?L?? ?B???@ˍol?ō?????o??3,??"?富|??[J??]?a?,K H?c?c8H?p??A?ZF??,|??_Pu?{a?\??G????"??=R?wB? ++?p????!??QPlZ??tA?H??zb^?$???Ĝ??IE??%b?D???"????????G?_???u ??ܘ|?mD?N ++AΉ`?3???ѳ@{?m??ej!+5BۋG??jƶ?|?-?4?]w"?ݔN??G? ܕ???f$@6+e w? L???銛pi????? e?݉?џ9?tj????nEK???b# ? ?d????J?eK:݋?Q????=6??D??&?jxإ0?)R???5?????De?[+????13f??? ++:?4+@??????DT??Ac(?P?Ft????%???9Ӛg,P???j'{?s?n?a{?u?%?;42 ?g ???䗝4,?zt? ??ø???Nz?J??tg$?G?? A?l???yTFw? "??c???9?J?uw[ǎg?N???Y?C#?X???U2?rl? +K?B01?X*??4.$^X?o?y??ij0/??%K̵?F?D?t?(???r???i??0 V??????-?ٸ??b??۽4???Tc}CRX?yw?j?t?x?2?F?zs Y?&??4?:t??L????@??(dJGk?y*?b???X "K?$?K\?ԟ?S?_ $?ұ?i?#8?A{\e%?V?-?????5zƏ ?"?HbAM? ,ѵH?3N^Ә?%?ZSC=i}?"3?????PE??u?f????n?'+)??m?"? ???+,ʸ?@E??I 秎??R?M????y:????g???z?2zsLBHk??S=???'????V??#"?'B??]?n?rdg?7-?w???ߜ?5??7?'?z?/????;??Dv???o&???Cr??r?TI!7???c?????m?;?R?I?????)†??z0??r#??1a?????\z|?Є???!?Q?4{ih ++???ab?A?????L?=e?t??䌗d????ƈԏ?=έJ?c0?N~????????3?*o?^??3ۺ?Wt)P????4??!??L ++?G?wd?X3z]/)?s?????P&8?G?} ++w?6Z`J???*??P??>w??h?^?8?]"??GPԸޥ!?"ؠ?)???ԕn??)u??Af?>??Ve?Ӳ 9?؈T&??:b???????v?i ++?x:ѫ????v??Y??????? ?7???O?L??~e?+{?????g?x1 ??????? tD\%??KFǑ?&?1"31?P$6????? ??p޽oD????t?b?cC?Z?????7뵥????1????ާ?Z??HJ??ȑ? ???or?????p?6?8F,?j)??????ת????;j*@[?????<???8s5? ?l?@5??????>??Ȥb??#????n0?????ZX?F??{?????]?9?eb??LM?@???[???N??R??h??̫?1???'g]r??Ce4Hea??=??m;9?X?`«O???E?;Uc?]W??????—?|Ò??{4????1???]u=??T???6?j??>Y?W|sܕ?^??vʤ???~?{?g?D.?????6 ??,ˢf7I?W,??1?C՛?1?ʆ̅?a?H?h?r???]C??F=?xz?LBJCO?~??????Ѥ??n??4 :??V?T????>??M?:u)? ++7<L?5>???Rz??^ R-??mK?????A?-???ˠ.Y?"Y?/m?U???v?-?TeTE?R?4?T??zU??$-??IU1?QSb=%?&?]}??=eU1Zre????A?j?\??ѝQ&?wŮ< JU?`?e?,???Y????Q?¡?HEYA? ???`?ֳ?ݤ?m}bj5?L?R??????-Ƌ????i.h??????cM9?V? t7N?IsJ?R??슽?_???>?TR?'z?{R?0?? ? ??ڶ???E?????????;???IV\???Y???X?M????Fw޾{?r>3g?H??8@X?S76?,?????O a5?9\?f??#?$0??U6?n܌[??????g??4Y? ?x?)v?>8r?n?zK6|?e?֕?](Y??x??)B?(u?Ҩ???B??{???? ++??hq??sʧ)mh?P?"Su??EM꼵)??? ??H(# ???=T }2?د?eɤe??K???G??????yׯ<_?j?0Eyw?cr>??/??7????O?w?,/(?=???9ޤH,?P?S?+?????IH?'^a?????7?Y0???)?? ??D?sw?ر?HS?v??}W?i??B?:?1??Ό??}??? ݍ???????x????^?x?R?????o{?'/_a?6???W_???,x?{`)?2??N/lճT 7?TS&ZT?? ?D&???]?\+ާ???͎???rÖ)?;??S?GS??uM{?l`???)Y?+A$?PE?M???,_?W? IDAT2?E??y8dh??6%KIO??S:a:÷L??$???a?3JI??ivS??$??5??~???va!?&`RD?4?'eF ++?G? x?sqp=?? Q{0c?d̡?$???]M?(Ve?lSn???Q?yڞ???3?{??=??v??$?A???#?U˞??? 0??['?,k?k?7ڌ?,?E?U ?=9??j?l?ȿ.-B??c#??z?c?I??????6H?Ĭ??L?N??:?@?^L?y??j͕?ʼn??H??>6N???;?t,GΞW??={??????=?R3/a?Z??rp?_fY?Aa ?`oCĆ}??߫CCk̀?????s2???=,?;?NFOxN?q-C??>_K?L?? ,"??i?KSY?f??=4bNF?@v?@=`Y??t8?ַ&?,;?".???jY?d^v??J???õ5???=g>?h%MŃ?w?8DL?????-Ex?/?o??C??v??8?>9??:?I?L?????B?7?g?w"y:>s?1S?=+?W%HF ??~?ˉ?{???İN=??1[??&oy"e????x??ܜ??o???Ox~?8?x͖I??=q:U?г??cD?lYN???ge$g?F?w????F??ThO;?x6??I??ow~??O????8??s??ӻ?????O\?W ?bYy??_???H????K?Q? ~??????B?6??}?N???: ?|???V9̘??? ++nLɣo0???j??^??????k?o??o?o?o?_????0禁???r??j?rd,z4eB?Vt%?`ki?+դe??5D2;??Q??b'Ǧ??Pt?&?? @ ++?7f??]??`??.???.1| v? ???u??і%3E1g&Y`?.?ٝ??t???5??`R?T???M?3?GД?` ? ?HE????? ??E???d?p?m?' ?r??\[?7????M?F?*9'%jI|??WԲq?Я?? ++L?k??!? ??˖a???d??vU??t?)??{?8s?Bէ?>?????%s?k?ū??????5??&KILoj???+??ϏO?al?+???~?6?Ek!gc?6r??T#??0???Sc] ++??5??xa?Vٝ?u2R?t????O??????ݡ??T???j??)?w٨?ޕ7 x?԰??9z??˂??}=ǔdM??v??????bv??ª ++??Beݝ?w\????]ʞ???:V?caXJ+:&???~???S? ?;?;??|??Oe?Y????F?Y9?n?5??`L???g)?1,?V?Je??R(?zxU??̪ES??n?%ރ#K?FF?c?? ?`$#{?Z -??G????!bǍdH???c(v)6~??2s?,????˘?L)s??9yzX??kSFx??????{g=e?n?2?G??????,??e2w#y?!?ˆ?8n?45jw?xJ??8???":? ?a?!UK?h?&?x'?0????z?r(h????/?O>??:dk???3?q????F??)Cu??G??ցybz?]=zW`Rg?.?hRY?_?? ?̋???לc??$a??DM??MC??wʩ2??? 0?* p|?ݗ?^?+??ŕ$?)??h f ++?????????+v?? ?#?9?d??E 2L?(?]?H P2???YFq??`??<½????d/ 9?????K?=M??e?k?<2?? ?M?Ξ)~??;???ը?i??F?ao?rJ??????E???ʬU=??AF?FʫȲ?d????L!g???(????R ?pj??6?? ?L?Yk?  ?!?w?? ?N?Q??" 9?a?Ȏ>??????????\?|:?;?tԍR'f??[՝? ++?'??Mf????$Kh?t???<ޅ?8?l?,H?5??????r3?2?7J??@@?O?\ev'??~?x"1??a???f?h???ʭ??{I?p|w?;)g?ez??n?"??<9?Z??!:;?E:??Ȫ??d&??T??vLV????:?,?ѣN?r[J.?h>?x`g?,bA??)ת!??Mg?*%U^<?j?@?/~???{?????B?/??`\w?~??7???????_??k?W????KjJ7NB???m??+SuH???a`W?P?sP?1F?|?g?+???ʒ+Ԍuea?Εٍn??O??d??,???k???qy~K???SƲ?v(sA?)?t K????p??AXr???0]?1dylY?"R?????#??i??z#??????+Zk?g/i?q2?x"??4?"AD^ m)a@|???4ceߛ?5fgMI??%q?&???p????????ae?? ++?,??[??_??????`?Y?^???>q5WR???طMn|?v0?׷???׷׷ׯ????{'??.6??M??>#+s?+7??1?>,\R???Ȇ?A`'; 4se???!WLC??dרL:?>?6H?`??i?2?(??IU ?? ++i?`?I?::Q?Ý2iA??s??F???D?`?C-z??nH?Q?U8B?d???5?? ?-?֌?_0#?v?Q???`ekQPN?T?"{y?Ka?WǾ?&5?:??\?>???hBg???\(?hV???h?ܕ?;6??T??u???~?곅?k?????]???K!??[?i׎???동?rn?1???a+kԵ?_w?>yz?s??5??c?0?NΕ7????[ط?uջeH?W?&?Z??'c??{<3#??F? U?w?gs6????7;˽?Q.? '??$??s*?4Z锒??m?, ?~ ??9?'??\{??)k@?eeuZW?醪p?Ik?+?;w fF??????9?Cj??????p??ן=????+???,?0????2?/+????N= '?A^wb?ϡ?B?|?1???dK??׵ߥ??-'E??񮈰?h???\?a?v??? ?????q???2? ???^???^:???߯gc?|??????e?9j?zMJ:d?e??????z????B?" ?????????.kb]8e?`ig΄e?j,)?b8${?@i?i?$?? # ???8?ԑݣee? ????|??O8??o?{??I}?1???????_?????~??????{?S?????????O???/XN??j??{??}%???a?&???? b??hk洬Ԛ?]?4o ??c J6޿??0R?,g?ڠ]d?6mR?Juc?Aə>??TF?ȩPk v?"U??r?R??xz#?h?vr??^)??ݟ??ziX??&'??nh?? k_?F?[???u(?;??9?P"??գ?Խ9lp???)?n)D.? !$Y???w-?i????֔??O5???Q-q?qY?????Fj?e?6H???cj?h??LE??P? ?զ????{RɌ ?9BR[ xX>? ?%MF??4 G???+??6?C?)?$U6?[?k\??? 3rԶ>b0?vGh?>Dt7<+7|o0??sY?'X9???.xz??=]?nHP]???yz??]P?Gn?Mf?ٕ?qy?y| .}Ha)?Mf???N??????%??6(??T???H?pW???!2????}???R?+G2a??;~??w%??f?}Le]??r?p??ghl0????xª^?ekMn<.???=0o?????s?stz???? ++?iK??o?6v&?? E?FN??jsB??O??z$T??W?l???n??л@Ek? sʚt??????b?? /?e/R"M?}??eULD?̬`??K?J)?g?S???? 1ˣ?񨿭?K?ލn:?s??? ???'R?2?3???1?ܟ??? Ƽ???????7_1F??rf?ɲ?^???fF?3??2Ct9???.?ȳ?1??lR? ++?w?@.Yc2???$?[?8j??z`ᆕ???1??G ?]f?? ?)?.4Cr?RV?p???3 ?Q???G>??????/???? ?H?ѷN???????ɢ[??9?_??/????/ILj?,?O?󒘏?QG߭??wZ?K?~???+/{?W?_ ?i?}??}eOƩ????j???}?.?z??g)?!3?`?Ð;??3ct?e'M?픻?w?????-????r?7'??Ȯ??|??j????^:?/(9?͛G?+%)????z>1vAuvRma?m` p?4Nw??i????7? ?v??=3?q??s??/???W??z?=O?w??Ϋ?|?Օm^?3?v8?ѸP??? ?2??a~?A??m??`??4(?????}?`??r?R??8ׅ7??k`p>?syܴ'3??d?[?3?????̟??^???5QG?)?S?NR/???V??&;/?(L??E ?@?!?oH[J?)?ε??? ~?G???j??::9V?????˯????? TI))?e?NanN^Q^?ez??%?? ?2??l?Z?ydpN?zf????W?e??C,?&,+?@?e???0??3 ?LO???? ?)?P??4?:?H?՛@zL?b?,?c?zY?"k1??0?????O?E??9}? %$s??[??v?Y?J?R镒i? PeF?ZħU?HG?^0?ez??? -??f???vg9/????)+? ++?նw=???0ڸ`6?{?,'?|*\??????6???U??m??????e?(????U???????m ?&??&?tbd'?[Jb??ٴ??lI???"HDN$^?^V???gg}?Z֊s??Ȋq?ls2??ˉ??<????7???1??Ͽ?\??g+Ǝ??f;??o??2? ???Yg??{????aZǞMy?c?Z??J?ċW?p?S??+?X<%?Y?18U?>??h?%"????=`?P?i??T[2vN0lƸl???}?<wy?????-?Ew??[{???o Ų???=?#e???? ????Li????Qg}}???޼?.??6K&?E??2A=??[ 5g(?4???1??Wసed2??4g?B????n????L??i??bjJ??T4?IIDATpS?:R`?$?  k?dd;?V \????,??`~?&?F?i?4 o,?g?,??<?Ek#M???"W?9?>ʒm@J?????Hr?̬.???f?;Eb??UžQ9?) |Maq?fO?v?0???=?=?????? ++?P? z۴?5???????İA?u=1?????2ٮƳ;?L?zԦ??c?ggV??u&RMd!?f?? ?ha???^?#?v?????L????r?~?H?Q???l?-??F)S ????={F?2?4?7????]?y??29??w??`Vc۔k_??)+N?2?U\?3wec.ke????2g?,??J%VW?? ??.?J??f??D??;????ߡ?j5)?ʌ?:x???X?&q?T?qߛYH???M???? ++>s??6и3??????w?;?L???Cύ????#?;9^3? l???99??T?????d?]Hf?’D????1\\(??o`Lp$E??6??j۬?F?)H?ʊ? }*?1j???? `T O?a9?d5?r??;)?fFύj???????u.?@Z?z????-̣? G?C ?G??)?? ++???B]{?$)ҋ,??ôV????w,?&? ??A?DR??L`?怕Kb???3N?ύ?G ????J????Rt???????;? ?????? ++???A?? BGQK??mI??z͊`??,P?ҤG ??:#??v??zd?Z?3??#?0?r3???#????,??޹D????㟰??e????8?%~??g>??S???Ώ?????????'|??g,??3???=?֭??O?6 ++?&m{O???_?,?D??=?hQ???LN?׿x???̽e???:?? ++???絓???Ϗ?}~-@???%?߇3M?7????u???h1\???%ޱ?-???fJ? ?̒ ?0?$??OX?1'Lka"B?r??m6?"??YW?y??>3? ?`"*O?1v^~??v?b????{??eU?w????BU?6??ճ 螘M?K??)/?9m???'?z"g??n??N?+? ml??:?2?%?'?`$??ݵy???e)?ZX?Ī??]d????bU??}? ?????6?r??N?I?K?S???_|?3F{??P?I??$??? X??Y=???'???7_??c?&?>(ysy??????ڕ??r???߉SW㗿???j??'???????K?=T ++&u?Ѡ̰?[?c?,?2??s&.o??? q?`?I-?mc??)?P?9U????OR????P? ? G>e<zNx?a??a??D??? ++?r???Pq??U*A5?6?B.5??#?8g???od?8Ò??>???‡uiθw%???*?m1K??i?Z?? ??>G ??&3?s?uК?]͕??????ecz^Nx7?u?ZB?p?d3R??)q??r?WR???[ o?'??????m?HflS?,>?w۝?z?? ?(I@?RL??bH"u?z:???-ڧR??mo??1??x?O????Uf????*?e?Im%?1???????????礏??F???:KN??=???/Z??.??,????????qsz?}z?1??8Zj???t???DQ??i????.??ߴ??KI?.?? ?x3??1?ԢzV8? $?w? ?eʲ2?Ss(?rg?3???jJ?Fdυ?T????`?&)=+? ???MN?\"?ە! bP??????ld5?hN?R?N?=?us'?Dg???p00?8???!?{??>???LT??bLDI&?R??am?&y?K"??_y"?ʄ??^>y??W>??P??????#2?#Gy2r??1?X7-?&"+?l?w-?9g? ?rU?D???NX??Q?B? %??r ++?$ծeF?er?? (???9Y?['u??1?NZ?>+?$Y?պ????4c?6e?%?f??Y֭?N??c5,?2w?Q?3v "@??"2????璥^?y+???9k?C?5?????E0W?? g???(MC$?0d??E_?"3???L???AKAB?S޹?X?9?8???? ???))?A??D3?}?l? ?r?a ??Z.8???ʍ]??M?K6"?P*??Ŧ?7?y???Sf??6G??՟&?N???Fʓ?6?r????&????LI????Rk:HL8V?i?t*,???e?????? ++y???fW?k?????X??????w???υ7??l ,/??B?9?b?D??rݓz=????:Ȥ???K? ,9ʂTm??r???Eo?????Ь&D?X`?pK??D|6?ipĥ???$?c?m???=??Ĝ?t&$??d"MU??Ǚr???Eu?9????y?????? ??|?h?p?2??7?d?.pP??)??D"??'?J?\g????7z????E?$9iY???v?|3.???'???????????O???1?Rط?? ?O?K^n??s>-???????N? ++??|1raZf??z޷1N??藝d'>??Op?̔ICs^??\?Ak1?8?B????Sf?st???ea???7??0??v-??????Q??C=jf?_? ^??u0/I?7 So=T??????kL?xue??r??d?'??D.????!k?e???+ ?V??0kxS???gj^I??$?wf??>HyrwR",^B?Y??Y???????;?1)v???`?LQ ??/&W?aԽ ??"̶ |j???ek?-?]?????"?c?J?f??????&???????6'??L? ??>????m?FnzR-??o??m?e? ??E?Ƒi?G?:?? ??x?? z'l??Yy~?L9+??g???_~Cǹ??1'???N=5V?t?9m??? cã?Z???vex[??F?+???K"/S䌂?D?(ѳ?n?͉}0w??7???he?;??^?d?JQ????+??w|??35??,?|?? ?9E.G??Ͱ|Tѹm??G?>+51?P|???? ++S???ӀG???A?ᒘI#쁒}??X(=2?{?.u???,?????= ++v? $33?1tK?b?cb֛3??N?????q)?Q???>??Ϙ0?䑙???iH:Zg2X??zd<ڤ??s?? ++??h?n???+??~??O?)??)??-k1T uY???}?????㜓}0-ѼM)9ŰQ???ӕe??G??1s???u??w???!F?C?(`u?5 -?L?6j?@ wH1Kf?l?m??u??$?SC?϶??Ӎ58\?G?k?O?DE?f?R?/?Z??w|:k???H?sC???????B?D???d?C??V?G?G???f<*K??L??PXeU]vڜ,?X?%??X?E ?u?2z]2????A?IhΠr?4,'f?#K???\?.????wj^4L?z????ޭ?{??po? ?Tj]?`?˒c8?j??SLE???j??!??.e~???Dk?\?P?G2ڥG??\'&? ]*]?????B???ry??BoW??h??0??ߩ??B?X???-2??6?d?$g??5 ??/l[?e????*?F.?v???7r3?ʡsY???1?{?O??cϿ? ?'?LFV?JWL?.qCns:??I٦Ds???M6?O6x?????3?+?????#???wVXׅ?>??|?4?\???????_??m???n??d?Kxp ,[(?e?*???3w??.X _?:??;Hu?b?d??x/?C???A?]????M???`@?E?%C?u?Y?Y?Xw̕Y?E?S??fL??!???l??Y?ޅ??? pY?0?t?????DI ??|rO?ޑJ&??m;???Q???^?IO????̻?e ???(???b?Z?c??w?+kX\??pFV? ?W?&? q䂩j'?Yp.?W??&? ???667??V?) ?RI?m?`9?G?? ????????)[V?g{?x.s?T???u????(|?~??ɞw?P???{???S??????̠x'+ִ???x?d??դ?(??,?y??R???rV.??}??lx?Zfի??E??5???C?T?6tqQ??????????V}x??)W??x?h>??#?F?(9N???N??'?s????m)??????8?????eY?Қ" ?=u{6?X?R?6y???R?E? q???;G*o? ????????????Ef?9~Ol??5?'&?5???I?P???< .??*????(?'y??dY?????%u;(?ICCkK?ه???$=??I???????h?? }??_??O??v?;m<Ԛ?eεh?H?R?oq??G?\?ZD?/_O?>$??D?+?#??O%??H??dIe??p?Z??W:.?l?Q????)??mʺ]??v:?4??W|?\sVZ?J?T.?R?S??]??>wG ++???j??xM??5??a?@܊?H^^5e?]?#E??$???????????,?z????z?ߋ<???Ņ?yRע>?6?????????3??w??J??"1%?̊n?u??????Uf~"?ui?*???A?????h=6?y?h]:?I??Nm???V?~t=?????j??>??s#Z$ף?m??x?}?OzJɫ?II?œ Eo?W"b>̦?W????????u???MѼ???ݐ,ڻ<.|?k.Y?<??yc???{hZ1;???G^?>Z?$?t?o??T?'fOv??u?h?'??ѫ.???z???fֲ???\5??ˋ?>V??x֡??+_^z?uU?????y??ˇ???? ?/????$o?2MZV?ɔ???PN??e???ۗ?z?u???Z??w?\?Տ%?hL?ŇDo???\?4i???f???_??F??T?4??? tS?]_???[-???ˬ?z\ӢM?h??j?;?6ڽ??h#I?H?M?Y????\?t???e??3-'?4_MZ?]5?^?????Cͪ?I?K??o???޹O~??S|?????=???o????????z?ş?zg?oO=?_??S???O=?6?p~8 ?????R?{???;?}}???~`X/???5?&????_????b??^<??_?z ??R????'?[????=? ?'??@??Y ? ?,?p~8 ??????Og??'??@??Y?7??{G?n#IEND?B`? +\ No newline at end of file +diff --color -Naur cyber/docs/images/cyber_visualizer4.png /opt/apollo/cyber/docs/images/cyber_visualizer4.png +--- cyber/docs/images/cyber_visualizer4.png 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/images/cyber_visualizer4.png 2023-12-23 18:05:58.572028978 +0800 +@@ -0,0 +1,90 @@ ++?PNG ++ ++ IHDR ??sBIT|d?tEXtSoftwaregnome-screenshot??> IDATx???w|?տ?iۋz?d?ɖm???AB%?$?R /^B!?? ???{{I()?b w,?^Ի???????ҪZ?e?H??Y????{g??w?=? ?$???NfVv? EV?d IJ?H?:?O?7^Vm?[?t??Ͷ???q??a?D(/?????4???*#G?v;QE??dY??()8=?Qrr{j:??z\{E`,1????`?&?n ?t???0?$IbԨx?nUF?$ ??????ą !;??m?ێk??W??3??v????⾋??*?1?Ʀ&֬-C???8?@? $IF??2 ?>@#f??*????|T????i?qOF?g?I???????t\?6??????;+ ??zLGQrs???dqXw?????⠈???v;?$?0?܋???0?$.Sr"$+J??@ pH$y????k?'?????"#ݎ1?U;?PX?_0?????p*`F??Uƺ????B֨&???g?0? ?߶?? HJa]f???ex???n?Ml?_??9ѱ?ݖ?h>?0æ?N?O?}6??????????&աhPQ?7?? ++}8U 0֕?u?V?1?:Ca???exq?$Ѧ*?TD? F?G=HծM|???? &z???? ? ++?&22' ?KC???|??6??M??>a=LPvt??XXУ?/????d6????L???hnn??????,lZ????i?LI~ a?t?A:?vc?z?У??I?NǣI?F?`C?jCG%? .>?D?v?f??a#c?tf???gĢ?#??I3)?v?A$???돋?00????1?o?aDF??!E??3:'.`?װa_ PA???ڦ????Ԝ8d?h4???+???f??' ++?BVn??$LL$l?\????Q㿇?"??8&d9???A?'?!$ScXQ6i. ?U?5E????VS?????dX??N?n???)?i?͆?磡???? lv[kF?m??ڮ,!@QD??~?|?#?e?}Y?? `??f????‰? Z???c?Nj?C??I?h7`R??rV?nFG?k??|&9???~–&W? OJ#gT*?????x)??쌚;?I~??B/??Pl=???|?Ǐ ??5?l?e$6E p 0q?lԗ}?Ihv?#?i?Ƒ?? C??h???3?q?q?)?P????dF?]??4??<eU??_???h)? dE?cw?P??C??,?R?`IJE?:>??inj"3#???4M??h ^H?ϥ??>?N?ɸSjY?IToZ?[?ٌ,*?0ߏ'??)9ToXƧ???҇?0jض/@?S????B?d??MɂŔ??????5E? ??#෣94L?AʱI??)????o!?Ey?gp?H???MM?x}%$??? ?yA?d)JCC?????կ???q?4K?bR??1???j{????KHD???`??h?????2?;쨊BMm=9? ++v{?F"?D֬-? ++?q:?Cqe 9l?S?z<7a"?F??-?*?\?d?ԙL?V?3????Z?z?k ?@????~??]?R???P%?v7?hS?8??iIz*?TTD??0`?IN???{c?l: ++??PD??pa?ɴ?~?̞?{?3C?ME???%HzF ????$Y¦?w?m6[?`?D?1?Zh)=?eE??????6MEQ#???eI??Ƣ46??+?7??\?_DWa?Xu?? U??b$??Tr'???I&?$#ׯ??e?|`$3?idO??W&??BF? *V,aGc? =??%?? W?Xή??rؽn???I??M?AѤ???J>?YG]C1?h? ,ZX@???????7???<?????X =?VH(?LUeub?Ğ?8?^??W????P????괿??R|V?}{tQ???U4??5?p3?;??p} vU?nרX???۫i? ++?ddtZ?%F???,?ZIc?ddI 6F/CZ??c9&?#u,[??M?? ??Y?????_??H?M;Y???ƨ@???Hs?QZ?ji??.{?i??;O?"ִ?????????Hc?G EQZ?? ?r???@S5 ++ ++??Ը?"%f-???? ++E???b8P?3?[?L???4?iE#???Jbn?x|'Ջ??b?ݻ?XTO)????????`??$hWL?J?D?4"1?]g:M1q??D??Ő?ԡ?f3??N ???z ?fТ?i???zE6q??$?=??$"l?XѡΚb?RU"?)n]QH?$Z????Q}?B!?0?j:????0???!I??oe141M3)@r?? & ii>|>?v?MS1 ?X4JSc3?M???d???4?<?&??g????˲i1]'???H}CC?,??ؐ?????4???G%?ƛO]?-?p* Y??????G?'??nͲ???(B??&?l?.?q???t?%F?_?????Iȴ?d?8)???%I2 ++(??-Q??*X??-,, 5?QH??u1Q|???=? ??qC!Z?u5???2I?????8????W??6lv;6͆??????j??j???*??$>9????Pؖ?Z?%?w?Q븚j[P????}???ȶ???daa1`Xdaa1`Xdaa1`Xdaa1`Xdaa1`Xdaa1`Xdaa1`Xdaa1`Xdaa1`Xdaa1`Xdaa1`Xdaa1` ?ET?0ijj????X4??1?`??!I????x???B????E?2?h??=8NF?????⁖?a?D????þ}?>?h??d1?TT[S?"ˌ.??>?.qri?$?,'?an"q??E?(??u ???%IBv?????ؼq??5dff?Wu??6$??*$?K?l=???A%@?u??L???wRx??рNB4H??5J^?V?? ?E#G?yCِ ?4Zغi3? u??AdY??p???O?ȑ??d??V??hϠ?H$??_4/?????J}o????T?:_???j;^/??N4?uLm?a??唭]è1c9~? |?4 ?  ++?g?N????g?&;7E?D?pT?\?3????Dɛ/??7?`?+?I?':\?TdY??H?&?@?u?W??K?????="I?????????`?b<?a,n1????LiZ7&?!:?Z&?S???Yt??x )b$?? m[_:?? a?._???(7??{v ????bP ?ٶ?j|?D U??;?E뾁y B??c??????!y=R=???KzN}?% ++???ek??lqYG?4????hĨ.:?5rL1{w????␚`???-?L*O?$?J:s????F:?JE{???x?X ???R????J&?o??K?8???????m?Q??c????P(???j???Q?Z???F1?W??ӯ~Ȇ?u???J?˅_??~??_ ?揔x??؉?@???u??u9]D??:I?Ɲy1???뷷?{?gW?8??3$??\?Ѫg?0??+?)>???7?2????}x??? a$??a?[?Lt???Hx?[?n??G????c„ ?)xh??[o?`???q?}ocL>?o?:?L{?????????q~?0?cQ???)D;??+dY?0 ¡ ?맚{Ȳ???+H?-E?"?(P??)S?Xw|Y???{????z?5|1G[?-׿???7???u???Ӭ?YAmsa??_2?/?} ?;O_A????̿??? ++B?LF?:? ?}"E??-?L} ????@:??(??Q?K??L?? ?????w?nj?&??????????Ÿ$?U??C}?Ow?6`b˚ʥ??*f?M???cϾ???????*`?싹??%?%?hb?????V??N?>????C?9=#~??v??%߼W?U?{????Fݺm??u֯?A??~?Mf?'2uv??Qχ????|???pQ? ????3?\3?0V????h.ߋX???Y?f??v?O?1+?.~??u?"?ǰ?EdY??r3n?x??[?}?s?!G~??;????? ??r6_.pAl'?6텓.?g?iH-X??+?@?f??7{??v?G¡??Id?M,Ŧi????o?477QY??*}*@???????????}2??|????|??;??ldS]VG???[~?q?1??Bu?d?????Hf?:fv??V;1M????hf?kO??m`oM?? -&?`?4If??ib??[(\êr??y??RL?v?&z?i????`??.??[k?? ??63=???n?/!I??}$? ޽%ѣ?7Ah?ˤ????ye?|??%Osӫ?d?w.璓 ??R Zv??%R???^?+??Mt????w??0???2??A?a?$I‘???????C?1???v??Z?[???$I(?F??sX??㎈2?ғ??3????)?Y??f??L?8I?r"ԙx?hy???K???VI?@?????k 4????n???? ???2?_v7z??Ϲ?_???o??;?<) ????a3AV???Ŀ??4L??????p???Y6ŕ?jꘉ?b? Pے?$??r??O?!}??l*????O>??O:? O]?m?????~???/`?yW??I??,??3?@???P?#?@T?F?%????????!??0??u??ƍ??cbB@N^>.W?? ??ut]'??g??'???)5?k%?B+?sǂ??c? ++?WFq?£??.MCzm ??3)M?+Po?I???i?W? ;!6I11 ?HR???????r???(??,?D?0[ˁ?w?T ???4?5ei8kX??????S|%?????M:is?pv<3??T!ZOD7?uu?J)}?$I??5B???E?0zV!ηv??9??iNT?9??H?3r$c ^?8?۩?(]uA???E??{?EO(???WD?U%'???g?c1t?k?????? ++?0??,?J?~?????{??l(??{#,}?_|x???jZF?e^?i?2z9???N???L?E ++Tq?e<'??K܄L[_楷?3!?NÆ?x?S?1?}??#??vMb?(B??(???????g??}ŢQTeP?j?7??U????W?>??ݙ??0???!???蹥?k?? ????~?S ??4%m??F?? ???c?h?H?3G0???#]=v?NN?2???qk,H$b5??!????????????H6'޴|?gؑR???b?2?i???????7_?/ﴠ䌢H?Z'?8q毸???x???o??#o? /?E?"???}??????????A??/3bV ???0MHq;o??("??0h7g=?d???س??T?4Qݙ???K?:?i>(???F?co?????+b???cNv._???Ͽ??/??w?to6c??0_$HBV ??????P3G3??Wq???>3dYV?????e2?????lL????6???g F=????W??6lv;6͆??????j??j???*???(2???( ++?,'^?~@I?]?u??x w?>?뮘O???9?R?~? ??V~=ŋ??H?Y??oo??????z?7??b?l?,F???( ++????^X??=㿭f???W???_???T٨???~?K????K?Y??E ࣥK? ?I?&w!?4???g(?¼?p8?'???O=?h?^j?Jx??^?2???֏??P?eIXS??}R[???V.??-.rs?p+!?׽???= G??q?"L?$ƍù???sϽ???%r??QXP?.x/??Khp?v?????.y??u?2~Bi"QϠnۺE????K|??>?(o?Ÿ??G?˼o????{???5?4q?ٕ??C?TiBxR?:d?0 ?????aWM31?AZ?X?\?KΜ?>?????9?Ǝ˹?:?????.??a???x?????2 ?Hp??,\t"K?{??֗Q?蘹}?6TUe? 'b?[?s??&????u?j/?? ?䝷?:k>????Jx="???Lt?K?Ow?? V:?z?D?a?? ++?m?1?1?@??U˖???/ H??@ ?c??? ++??????q:-?? U?>???۶3c?LbB?= $E?w??d +?焆?ߩ????!???:?????}J???X?c?;? ???"?`?b????J???e??e|????WB^~A?cCo??H&?=?! IDAT2c???a4?4?b?G?`L??~?㱂????E'"+?%>}̠ EQ?1k?vng????B?.???w?G:?9r ????:????* J?A\??ǖP?5?֏?1?????????w?Q #X???[X?{8iF.6???P*z=?Y?>???ӲQ???a?JVi ?5܁ ?????ز?ͺ?#?h?`w??} lLNg?E0?????ZG??ȊGg?6?K?;? ?,?????????Û@? [??4??χ??ũ$E?$?k5?벙q?l?'/+?[????H?V??>~:???N?׮??g2'?;???dg?????g??x?{?G?=?Λ??~?m!?4}? /???+???????|???Q???m??6???#????"?h??6??:"?{??6?? R??}7㦍?(7?a?S8>W?n?.F☊?|v?$o? F????g?? ????ߛ?o?}???WfC?0??`? ?v$?E?_?F???>*?:%??Y\(??¦-G?c?dܓ??{?ʸc?v????̱ζR?3??;?s? ?l] ,>n??Q? ++Me?VL?z?1n%???ϛ?*??2?aE???? H??2?/?b_t]??Z43?B ?? ??Ȁ??0??Ž??9?;??H%??ɝ6?4?.??&???QX??/???T??Mu???~P??b??a`???]| g~tO?u???s???;>?(?R?.M???=[???'??s??* ?z???#?m??V??????\]?P;??d?? &8 3ƐT??1?#???c?Ƞ??Gy??Ƽ+?eJ???.d??????R?\??Y0 ՝F?;eK7,??{&N????0???"7#??M?G?pHز???D??wQ*׬`?c ++s&e??e?tʶA?,?bM-???&??Bpx?b???=\?Tj??+߃\]Eux,^? ?h???o????_?P?5W??s?ͻ?sJ\HH8K??? ?ly?Q>?7?R?$?w+??VP][KM?^6?]?????"W?%nϡ8G%?m[??i?/g˺]????? "X?????:$Չ?????r㐥?v? ???2?a?ڍ??k??je???r????e?]???/?;D???3?ܲ?}?5???R????%d?a?G?76d4mb?o?lw {?8 ++l??????*????R?>f$?e?????????D?-/>?zi2?=kw?r?&???rv??B(&?m.|Y??^2?,M???PNJ?L?=?l+V?Bh>r?Mg?????3?m?}??+?v6??fC?TTMCS??{5?RTEVPEQP?u64YV????D?m???I??z%}UIj?"?㿽} ++???!+;E??q2T??hjj 7o?p?????&֕?a?ۉ?b̟?MQ?S?e?;TV ?`8?h?'?:?I?Y>V$`????????>~??)?'?D??o?"ӣ?X?!H???g??????݌v????????rZ?X,?,?Y6Ӂ~??A?ɲ??iDI???!?^z,??uڮ??M??\nL1x&n?l?+??>??(*N????FdI??? ++!???B?:?? H????o?????j3??.?????A#@??????N?ill??ء?v;???*z}|_??x?#9k??ih????d?w???S????h???|ii?4[??Ujiib??ѽ>!?????H$?ן6h;$Z ?F? C'l??????ga??CAhA`?s???r?|?:?.q?O???K8 ++g??P???[;?6?T6?h????m2??0????*?f:?? ???N??PS?<R??$2??i???\??p>ga??3d4?.Ř?S~tB6Zr??g?ew0爿??I?tP?jJ?OFu?P f?u???Θ Z??uU2æ??=?tx!e+fq486Ȩe?OR?>???=?????F??O+?N?äۀv?t?????,,??c@?tj?\?[?T[W????M?&?2?g??a?????E_#?w???n?a?۱i64ME?44U??W?/EUQdE?QEQZg˓eY?+%Ʒ%?''????L#IR?????P0@mM Y?9(Y\m?N????@n?0"??=??XWV??n'?1?|4Ei?̮?ᠲ??ÉYk?[??FX¢??j,???e??ID"?ϛ??????5???s d??????݌????????x??.?m?Ţq??R"?>d?x@?,?iQ?ypD?I.=C??:mWU???F\.7??y?k ?Ca?x@???t?hjlD?$쎞?e?A?????inn@?$<^????ő2hH?4g??sjN?????8??*@?a $C? ?0-??8* *0 ??E a? ++`?haqL1h????,???0,???0,???0,???0aL???3aC9 v?$???$ ???a????A???9R?T ?h??g???-?7T?xl ?P???K??????.?>???6s?f???գ? ?>???? ?lݲ?I?M%-=??c??mݼ??3{???0M"?0?????icU?Ĥ?lټ??63?4d:???aB?d?F???ء*@Izm ????dt?8?n?Hue%?YY??3?a??ݻ?????f??i??Qo?&??iC?)v?>b$??5?r_.?=?X6?w?} ?5?n????f>??a???uc???,??@?Ǡ??,z?@??W0?v?$K?N?'Zɒ???=??kq???}X4?H.????e?Vn??&>?lc??? ??p?O???>?Y???Y???ͽ??H9???.k?uk??>???㐛`F?R?????̼?k???u?N???7??q?/Y???P??ã??vG:?r???'?~&y? ??5?z????????)_?????????"?????'?X??f??1?8??q????:???x)?/K?O??o?ŏ0???׽w??{?%???????}??ξl[???#????x??Ǹ?? ?0a?a?d?=?qۊ*"&??p??2r? N?ک?)t ?62??????F?2?v׿~?)??M!???/???쳽4?M\????)_/qwx??/????/?|??7?݋?M??>???z???????'?@????a^_W??-f????Ξ?7??}o3G?>:s??d?????p??/?|??,?N?#ڼ?ߩ!??+??u????|N??/̉?u<3j???????8?0?q??w?j܅???٤Uģ??7??ȵ??w?E ???%?h \ussBl|???s??p>??U?"?z ??v?o%?????p%w?͹?s3?X?3w?ɕ?L?vn??????r??7?xL? ++6??7c???e??A??Y??+???2jo?5_??b?Ϯcq?#?a??@ ?HM8?|?_?; {h?>?w???d??WS?D*V??????|F??f^??????Q???o? [? ??:?1???8+?grrf?_6R?[+????O?ւ؀1?????s#Kv9???ω0۟? ??X?o????k?? ?U??CG)??Z?wr&2?(?ʸ?O?N?L??? a??UN{?ٞ???c?R&q\i6?W????V??o?y??_?R?????1q4??????C5?/??.*?!"?X?????6q ?ɝ??~?sNqD???M\??*?v??????? v$???゙?+?r??2??ޣ?揸lf??iL?|??????&?R? ++f??w;/G???N????ѫ?????7??q?͜??U??u?I????Fm!???6L????m??k???La]_??ѷ?Tˢ%?(?zv)?W?????%??? ++?nT??u|p?-^ɆF??>??????|??x??3???3O??i?Np?w8{?'q$??S???X?pt???}?B_)??I~??z95?????????]QC???~[???b!?????@_???g9?C???4Ѝ?;X?????1w~6??\9 /l???????f]? ?[?iw??J?Թ̜?Ab"?=?Xs?ZV?|??ai̽?.??Y&?h3v?M?a)??w-?6 ??????(L]?V>??]???[y????|??x????R_F??f??l?b{??`3?am?=+>?;?????s??M??_???:?eo??7V?????d?? ????F?????ldum??VV????S??K??>V?m? ++??%,????Cl?????j ?X?H ?F???s;],?}??*?ȋ???????e|?A??q??E.?????p?>*¹,8?F7?f?Yˊ7?d? ?Sꎱ?????????lT:??? ?L?QD??8tr?q?]s?E????9?9??p?8?مu e?f????p?? nK?W?BU??4b???'ot??7?k?????X?????????????w??q???̽?fƻ$???|AȾ?????T?聪??37[c??II????,???? :?,??f1??[???$2???Lp?`??Zf~H?>ӦK,{?}????[Z????????:vF^tw????????I ???????? ++??س???o\Imu??I????KK???YE??{n~??yq?Y???g???|?n}?$>7ƫ?量?n?????2?u??;g????????¾??4O??zp?ACÛ??/rDBL?ЇR?{S? ;??~4?t????L????cw??!?)?5$ ?f {;#/??{Rl?0i3???Q??5?)S ++??????????KFrh?K?ƲgX]SA????ob?0t????? ??o|??l;b?^d+?h}5a??p?W?L?G*G%]k?@????S09KE??D?*Rr?G?';?ӒY???3gY?2??/????`+?1?[?i?#E?9|???mi ???eux?? ++݉??&3?Ipӓ???F ++?yc?Ȫꍛ??Q0?????2&15C???&???????k?C???o??i???W'?qם@.??Ά????BIDAT?ޙ??Y???]???\=w??L&?dr'B.? ++ ??OW??"???*+??.????(??(9VT"??!?p??I???̕?gz?????y??̑???t?y5y???????O}??????K ++0??n?C????i ?]?F?Í@ _?ӧ;N?!03??0?=???$?????V6?????ɹ??ӿ? ?? Cr?&?ܥ_?λCD?\???׿̽?????;?ro??3??l?? M???? ??ݏ R?^??zȚ??:3?#?1 O??Q??0?Z?tG??`?m?7???QF??Q?4????Cx??'x?/ҳ?j~???m7??ē7}?[??????" ++????|~?>??׃????????az~??(/+????Y??Sƻ~?k&F?a????J<ƟQ]?? ?i?~gg^?w '??]g?2??c?X@?a???Mˑ???1?p?C1??^????z?? ?c??N?a???Lƻ~L ?4=?UL???????)+??M ?R??????JEoo?Ç?!(?RB$?????lj%;_ۆ???u????? ???z?????=j???N???CNl????K^~?]?&ц?.n?ٷwO?[B????[? ++???RRvԭ!?U??ea?#??H%'??@??O)?t?͎?TԏI%@?e 9?3]?4'Z$˲t?8?w9L'?F??xh?h4)C ?F?IZ?4M????hR?$??E?"??F??9 ++6R?y]?!t?I.?J?B=???????$|Ff? ++PN0H8??d??ut?Q9mư?_)E$????P???ܼI;!Q?&?YV?ήr???G? *]?e/???BPTr???_倷?y'?i?c??y?{*?*?????P ?e~Ag?ufB?D?S?@??s??@?+?d?? ++|?@?Yļ) |?Wy??l>^?,Z??????W?? 8???^?%8??????? ???n?,9??5????0;Bӆ??j?ay???o5!??{?m?ŁP???P?i@I޶?ya?>:????P??K??W?ѝ_????1 ?cov"tYPt?y?[~?g?J???k???????'|??t?䃏????f{ ???D?M6??%??v?8?e??]?v ???"??[??j?H??w?J????$?$ ????ww???]te/be?d??Hs?|??s(? ++Ă9L????? ?p?P?_??????Yq,??tQ&??8?5y?o2ɝ{?? ?4?-@?`?m'm?8m? ++5*1?q0?Xp???`?'?????;?????2e?J?}???? Oa???;d?Έ??????^?&??????s?2ԃ%w?ox?k????f????HJ??557??k??l?f˗/#????;?&?L??Q??:ijl??x ++?????vmm-???????zKk?nۆ??'s?)??5?>???:HYE%???oj???ԯӌ+????a???B!NY? ++?i????`?1gRmǑ??͈P?????8?4 ?mk8?k[?Z?4Id?X@?a??z??Ã!P??"?0??p??=/?m?dff!?ޣ@?<&?d?223ikm???Y {\??.?+B{{ B?sr???4?ce????%ۛ???A[k+??-??MסZ #@C??a?? &???s?????3i??ZFF??9G?~??$- c?a?H%??hƄI%@?e?PBH_?????I???h4-@?&eh?h4)C ?F?IZ?4M????hRƤ ??R???6Z?!ֳy???i???CQqBL??J?:i??W??%?&????1țVK? ?0̑?I????u??M?A0????L???zC????PYY??,?+???%?dV?,??9??w??@/??h??twu?v?^?lnd?9?g??556`3jjQJE'* ++!???u??OT?L?'`??6??B???QSˮ??ijj???h???T>???c^i!?aV?3Y޽w?g¾tvNK ?? ?_???mr?a2oJ![6sh?˔?;qDߕv???&??gF?? .??8'#*nK?D??O??WU??Hc???3?4ifVU%??]????Q+b?8???Ս4x?߫r?{?@7JE?I?@FP???T?S?ƶ?.ia?B!222??V?@?-?ZJ9??m?[~??^ #?%?????w?}?& ++=def?-?0PR! ?;? J??r?#"?'?? n???!?}?ޣ%6BU %??]]#?ʴ ?????m\?Kl?????'?=?PN???5??B) ?r6d?l?Q ++%?>%ҽ?x?Q?????????޲r??;Uq??XA???5??NZ??k8?y?{???|嚘q?' -i?v??x?G?&?I??,?R?uE??DF??mp????Z??????e?l???3f??m?+????,??k?i'RIÒ?:? -(ފ?6&?y?0,??O?a????w?[???????O???w_?Km?X????$i ?Ì?x?n???a?c5!??X ++QV???L??C?U? [? [????f??RI?$(kT?e???\1????6]???K???Ä$`???/e?•?w?,/??y?i5n???>B???07gd?@???1???????r?[??i(????a?@??BE\;` A%9?? ???+?=?+??`'V????< ++]?\?9?Ӓ??8???r??n))?/? j!Z???CI?w\??C_?Q*I?H???t? ++?U7???b????^糷??YEc{j???#"??J????N?!??K?WW?= ?;? ????B?T?W????7C?U??ѓ3)2,ީo汭????J????L?<?yq?z4"(??? ?0?@:?yv,]Y??82?B?d?U3????? ņ?r? 5e̪????-f??,???Z??\??_??0?/>?]???+u??՜??K?????6?H??????k??Y??Yu͍\97 ?"t?~w?C?c?A??EԬ?\??s?????jf×/a?g ++?????t??|?퉳qz;H(? ???~ ++7???9???q-???b??_??u??f??E???6??ZZ?ϙ???????z7? ౜r?$ʒX=-???}l/??;'瑗?,?t?~??0U??Ȕ???J ++?%G?A??%??I??D?ep?}&?Ο?ߔ?u??(:v???~????/??>SL???q?}?????????????c}+?]~#WO??x?P?]%#-???k?e?싸?? ????+o????k0r9??7??U~rJ}??(?X;???\O?!?Tʱ~d? ????霄A?8$?Dx??VZy|i??_'XR??y??xOgUP͈D?۸o?>^?)??'?I?M????9> ++&H?T'?!?? ??p???=????x?C?GAɨ?@)? w?Z??????V1?./?c5??=??{5?~l)A?,E?x-??ym?N????????'?fF? ?3?????::}??}?H)?0'?))Q? ;????߷C:?k?? ?˛?_FS?b#?8?y`O'?!?J,??:x???t?g?????~??(??,?ܫ>??*?ȞF?4???z+??$??kE0??ѻ??S.d????G???3g???sNgQ?A7?_i???i?v?????????0?W)?A B(5˞3e?????> W???ߋ?h?`P??8?ORڝb?2*???E?????6o?L?>???L????W??? ?p?fH9?N/MHF+?BJ???/B??0??OI??G??_????x??k???b??BLe??T&?\??*???“C?!????͵?~?o_????1?74p_ ???R?D:N?`Q_.?p??z????[???!}?r????&?Nhu a(?E/?e-???`???T\D?*? ++7? Z?Jb??Ҳ???T???+|??_򛓿?gOr?E? ??߽#‡O????ȡFr????㍿??H)?J?]??????ã ?N??????|?N?>???&?M?r?|??g"2*??b????B?]?t?X?ʢD?????D?T?5`??ʰ?ˌf????Rv,?????b.???'?F?g?'???">7-ĭ;??k-??]??????cow?UP???=x??1s????K?{?q?!?ȫ??*??5bG|U??8?8??La[?: ??Dt?/6?e_ (z?? Ľ?\????I.??U?Z??g]J??K??Յ???????V?*????3?G?U?:?~?A?s)?=??.]A?"oW??{???-!Af?4N??I?^?????G?8?ƻ??/oY??b?'??0??VnO?g?? ++?rz?8Ǭ??{o??Ҏ?)????c??n$0?2t??}?N{?y?I??U?f?K.?@?h??mș????M ??>?C?T6u*{v?椥'vB??i;l{?4F??7k?>?Id???c ??%:??/?????Ӧ?OFǀ???yk?&?M????D(?Lwq:"g?S??TT|?=_???C'J!?U(q??b??`?????`k}UK?3??J ?Y3?6??? O3?v6e?S??I?\?㛨??j???eY?w???+Ϣ??̚Y???dRs??l?{???S[?IENF ;???O,??(q_!??D???'???nd??Y+????C ?ƴw?n??y????T:b??TW?dFMM??s?X?0o???}/=GW{K??3?1L???|?/Y??e???3??0M??Y???5{?3?5? ++???v?jjW?NuV4iq,?F?9>???hR? ?F?2?i4???H?Ѥ -@?&eh?h4)C ?F?IZ?4M????hR? ?F?2?i4???H?Ѥ -@?&eh?h4)C ?F?IZ?4M???iW???r?IEND?B`? +\ No newline at end of file +diff --color -Naur cyber/docs/images/topo_sched.png /opt/apollo/cyber/docs/images/topo_sched.png +--- cyber/docs/images/topo_sched.png 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/docs/images/topo_sched.png 2023-12-23 18:05:58.572028978 +0800 +@@ -0,0 +1,236 @@ ++????JFIF????tExifMM*>F(?iN???~?`??8Photoshop 3.08BIM8BIM%??ُ??? ???B~???ICC_PROFILE?applmntrRGB XYZ ? (acspAPPLAPPL???-appldescPbdscm??cprt8#wtpt\rXYZpgXYZ?bXYZ?rTRC? aarg? vcgt?0ndin>chadH,mmodt(bTRC? gTRC? aabg? aagg? descDisplaymluc& hrHR?koKR ?nbNO?id ++huHUcsCZ0daDKFnlNLbfiFIxitIT?esES?roRO?frCA?ar?ukUA?heIL?zhTW  ++viVNskSK$zhCN  ++ruRU$:enGB^frFRrms?hiIN?thTH ?caES?enAU^esXL?deDE?enUS?ptBR?plPL ++elGR"svSE>trTRNptPTbjaJP xLCD u boji???? LCDFarge-LCDLCD WarnaSz?nes LCDBarevn? LCDLCD-farvesk?rmKleuren-LCDV?ri-LCDLCD coloriLCD colorACL couleur LCD EDHF)>;L>@>289 LCD LCD ??????_i?r LCDLCD M?uFarebn? LCD&25B=>9 -48A?;59Colour LCDLCD couleurWarna LCD 0   @ ( LCDLCD *5LCD en colorFarb-LCDColor LCDLCD ColoridoKolor LCD??????? ????? LCDF?rg-LCDRenkli LCDLCD a Cores0?0?0?LCDtextCopyright Apple Inc., 2019XYZ ??XYZ q?9?gXYZ a#???XYZ #? ???curv ++#(-26;@EJOTY^chmrw|????????????????????????? %+28>ELRY`gnu|???????????????? &/8AKT]gqz???????????? !-8COZfr~?????????? -;HUcq~????????? +:IXgw????????'7HYj{???????+=Oat??????? 2FZn???????  % : O d y ? ? ? ? ? ? ++ ++' ++= ++T ++j ++? ++? ++? ++? ++? ++? " 9 Q i ? ? ? ? ? ?  * C \ u ? ? ? ? ? & @ Z t ? ? ? ? ?.Id???? %A^z???? &Ca~????1Om????&Ed????#Cc????'Ij????4Vx???&Il????Ae????@e???? Ek???*Qw???;c???*R{???Gp???@j???>i???  A l ? ? ?!!H!u!?!?!?"'"U"?"?"?# ++#8#f#?#?#?$$M$|$?$?% %8%h%?%?%?&'&W&?&?&?''I'z'?'?( (?(q(?(?))8)k)?)?**5*h*?*?++6+i+?+?,,9,n,?,?- -A-v-?-?..L.?.?.?/$/Z/?/?/?050l0?0?11J1?1?1?2*2c2?2?3 3F33?3?4+4e4?4?55M5?5?5?676r6?6?7$7`7?7?88P8?8?99B99?9?:6:t:?:?;-;k;?;?<' >`>?>??!?a????@#@d@?@?A)AjA?A?B0BrB?B?C:C}C?DDGD?D?EEUE?E?F"FgF?F?G5G{G?HHKH?H?IIcI?I?J7J}J?K KSK?K?L*LrL?MMJM?M?N%NnN?OOIO?O?P'PqP?QQPQ?Q?R1R|R?SS_S?S?TBT?T?U(UuU?VV\V?V?WDW?W?X/X}X?YYiY?ZZVZ?Z?[E[?[?\5\?\?]']x]?^^l^?__a_?``W`?`?aOa?a?bIb?b?cCc?c?d@d?d?e=e?e?f=f?f?g=g?g?h?h?h?iCi?i?jHj?j?kOk?k?lWl?mm`m?nnkn?ooxo?p+p?p?q:q?q?rKr?ss]s?ttpt?u(u?u?v>v?v?wVw?xxnx?y*y?y?zFz?{{c{?|!|?|?}A}?~~b~?#???G??? ++?k?͂0?????W????????G????r?ׇ;????i?Ή3?????d?ʋ0?????c?ʍ1?????f?Ώ6????n?֑?????z???M??? ?????_?ɖ4??? ++?u???L???$?????h?՛B????????d?Ҟ@????????i?ءG???&????v???V?ǥ8????????n???R?ĩ7???????u???\?ЭD???-???????u???`?ֲK?³8???%???????y???h???Y?ѹJ?º;???.???!?????? ++?????z???p???g???_???X???Q???K???F???Aǿ?=ȼ?:ɹ?8ʷ?6˶?5̵?5͵?6ζ?7ϸ?9к?<Ѿ?????D???I???N???U???\???d???l???v??ۀ?܊?ݖ?ޢ?)߯?6???D???S???c???s????? ??????2???F???[???p????????(???@???X???r????????4???P???m????????8???W???w????)???K???m??paraff?? Y? ++[vcgtndin6?@U?L???%? ?PT@333333sf32 r??????r??????????qmmod?*?<???`~"?? ++ ???}!1AQa"q2???#B??R??$3br? ++%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????? ++ ???w!1AQaq"2?B???? #3R?br? ++$4?%?&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????C ++ ++ ++ ++ ++ ++ ++ ++ ++ ??C ??8?? ?????+@ ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(??4b??iG4???A?4??@ ӊ3?(??Լhʀ?;9⓾hҀ?u????94c֎?֏?KҀ?x?8?u?` ?????b??N?u???gڐ?R??Q?:P`?9??/4? ++\?I??????:3ރ?/N????OsGL????F):???????????i??;/?????K????T??‹??}???'????O??????~?_?M???e?\?评??????????*??G?&??????P?? ++.ݴW?_????? ??B??+?????hx??z?????L? ?2?????)??9f??R?? D𤣣jZ`QEQEQEQEQE 9???}h>???G?G???+????]?{??a'?6??c??'???Q?ܞl_??ly??????ʟ豟????(??T???E?????9G0r?b????6??c??'???Q? ????????2G????O61????ß?ʟ豟????(??T???E?????9G0ry??w?Γ͌??|9? ???????1???g?!?? \??P?\?>?s?i?^??u?"??}Kſ ??gY??? ???#/Ez?9?0???h????=??h'???? ?@=(?ޓ9?qFrqG?J^;??s@?f?qڀ???3??w?P??????i?????_ ?-???[O? `????-???[O? `???s?/????/?]???????h?-?????????h?-?????9???̏??~t???1???????h?-?????????h?-?????9???̌?????D8??:?k?o??????K????[???趟????(??o1?>? #???????e????i??,?r??e????i??,?r?`>??#??΍?va???????????X???G7???@E ????R? a?](??Ѵ???Q?5??m??k:N???????zCF?Ȏ?w?ҟ??@^???M0曒8??q??????n?????????3?nx?P??_????_?=??u?!?5P?(??@QEQEQEQEQE??p̿??????? ~???E?????????*hД???MO?)?`QEQEQEQEQEQE~}~? ????.x2? ~?i???m?\??A???x?ȥ???A??a??}??<-????"?@[??*@(??(??(??(??(??+????$x???޾?QW?~~~ڿ?3???SS??uXQ@Q@Q@Q@Q@Q@??????Z?t?6????????'??+??????KO????F?_???x[?$??EL??ET?QEQEQEQEQEW?????#???U?_????????޾?QS@}ǣ?:?jV^?? ????VEPEPEPEPEP?(???I?(Ǿ9?;?G? ???y????&??o?????Z?O?_?Nu_??CZ????M??????\?2?:(???(??(??(??(??(??v?????x??m????5???Y?$+?_[o?(??(~???E???????????????-?o???W??L?>???h?ހ??:Ҟ?Z;?I??G=)H?@9?F3??Ž(?h??>????=?.(?ޓ?S???O????c??.??7????????9>?? ++??????j????&JR?>?(???(??(??(??(??(????7?????W???Y??o?@???????'??o?-~??????l?????? ?=kD??isG?h?????o?ii????/???x????Ѫ???/????~???????`QE ++(?? ++(?? ++(?? ++(?? ++(?? ++?????վ???E_????s?'?}?l?????%>??SS??uXQ@Q@Q@Q@Q@??m???h:??? ?\.?$Y?H#???????E-???? ~?????m?\??A???x?ȥ???A??a??}??<-????"?@[??*@(??(??(??(??(??+?????????????*?????W?F???_(??>?ѿ????+/F??t? ++ԫ??(??(??(??(??(??ѓ??Y??'?c?@X?aּ?????G?֯u?x?k{dB?A4;K#?QA???n?s??n?^???5?;????ڼ-??????^??Ȇ?s??9?CZ????M??????\?2?:(???(??+^?'?|+?????V?G?BOy>???Q????{????DKx?^y?K}??=???d??=2>?????T???s??ٻ???5????F[x????? ?"????ŷ??a^E????L~̟?}?????6?ӧ??v?I?8?c?/?0?jv??z+ɾ|U??7????}#j??]:??ND7?q}b?^3???4QEQEW?g??~ ?K?Uk>6????v?c䙦??M???????W??~H?o?i?ϋ_????????M??D??h?l?G22?ʃ??T?????[G?W_?#y??i???_??????????5?#? ??????/?????Կ??)??????v?????g?g??????4???/??????????5??? ???????M???O?v????B????=F?{??????s?Ǩ??????????ڍPE?ձ?%LR???hy??_?? ?m?ξ4=? ??D?D??fX???9$??'?oC_x?l???f??_?z???{m0G???I?E?}??aڿ-??1x????Լ?v𗆝???{@t???Y?I????c???c?L?;???w[5kg_?Y???E?M??x?[! ??n4??????I????|u??+?ׁ߳l?? ?5K?_:?s???@? ????A??x[?$??E&?(??Q@?_?U??>j?t??^-????*????? ?eh??a/?? ?????(????? ++???x7T???-??o? {??H?O(??&&????\>3?Q??j??J־j? ?k;?ra???Mm????:??? ++??Kǟ _?k߇?,?}6?X?$?o*???X??a?2?~\?N?݂?Y?a??n???? g?#W??N?,o&ҵHm??}??#??A?2??ʏ??*I\?2~¯????> ?K?o?{E?>x?Z]?Ow?j0#ûR? ?6?LI ?5?8 T+?? ++??? ++(?? ++(?? ++?????ƛ?x ++???(߶:g???N?=?m?D?"?{????*h?????.??b??a#?$?﷿;N3??7?>b??%???{??5~??? ?.???P~???? ++_J????j????>b??%???{??5/?>b? ??????j?G????E?|???—????_???????1o?ᄿ????G?>f??1?????k?????<"???h??/??????,???>nӿ??9????|ݟ?R??s??-~?—????_??????????????E??????X?? ????????|???D?_? ???k?????<"???h??/??????,???>sN??k/???ȴ????;?????'?"??'?)}3?xE?|/??–???_???????? !??[???o*???:?u????? ?|7?%?^??s7?5???Tq"??۽T????>??Y??"ʤ?ؼ?q޿|A?4?ҟ?g?.,?$ƾ??.1?ZO?????hߖ@y???K????7???Y?*ѵ?z?SP!??????g8 ?v?~??????O?O???\??'??d??m?O?X??6/?),??s??x????a??f? ?????Z?֔QE ++(??>s???hM?a?#?|X?![۫0??u?6ߵ????H?(?܎B+?~7???G???1?K??>6?E֚S?i?l??Їۺ?$???*B"FZA??2??? sy?z|d??}~ie?L?Z?Ǒ??|~5???v?I???"?A!??mM?ԁ?`Kh?g??(??S??=??V??V??=o]?????[?#?kM??m/???ȵ?? ++_M?_??????t??L_???,3??3?v?o/???ȴ???????K????-~?”???????U/?)M,t?/?????????Y?'9??q(???????/???:??$??Z?:??'???#??c?i???????????????|???D?O? ???i?? /????R?l???_???ȏ????*??GJ????f?ƀ?3????7???2O?E????h??N???????LO? (?????h??ϼ??????9톕1??E6????|?????F?????tQEQEW?E????}??g??U?/_???z?????H???A?h⟱=(O?)?`7bzQ?=)?Pv'?ҝE7bzQ?=)?Pv'?ҝE7bzQ?=)?P/?o?????.??*FA??W7?φ?6??s ++??#??޽2???????i???????Ct??????I????????R?????Ѱ??>???????S -?E QE~?d?S???? ++??????K?W?Wů???7?j?????U???hd???h?$?+?EE??'???o?Y????O 'ĽSY??????Ȟ??n?|?7??ǐ?v??Ns?>Sѿ?n?z?W????x??`??-V6?bm??~}?P???,????c?,b??_i?ج??????:?????HG')?_?u?????*@(??????????j/??T?6??x?J?=[G?"=岺?Y?M?F ef?W???q?(?~xR????ӵ?j~ ??Q{if? ??;k?u_9????7???yW?O??~-?r|N?F??y?]??e ?F??IYw???`(????V?d[+?;I?^??-KT???(l???dF???KԷFy??W?=xg??f???ᮣ??O????A??? :r???T???s??(??(??v?????x??m????5???Y?$+?_[o?(??(?????l????s??$q_;~???H?l??o???Oִ?G???Q???b??????}h}?F})???J??i84???????)1??g?@ ?z?5??4???s,a?w???]?׵ɠ ??Hm??X?)???c??.???/????????I>?? ?????|j????&JR?>?(???(??S? ??`| ++???9?M???\i?:???֋ ??^bA??0? ???f?????(~?E??? $???G?????P????*????M???6𞷮???q?i?%?I-D?a???&?G?Hw??3?!????'W??~ʟ ++????sM? ??????o?ii????/???x????Ѫ???/????~???????`QE ++(?? ++(?? ++(?? ++(?? ++(?? ++?????վ???E_????s?'?}?l?????%>??SS??uXQ@Q@Q@Q@Q@Q@??????Z?t?6????????'??+??????KO????F?_???x[?$??EL??ET?QEQEQEQEQEW?????#???U?_????????޾?QS@}ǣ?:?jV^?? ????VEPEPEPEPEPf?۵???Ƞ??????????k^w??ɵx[????+??????]j?vE??ּ????j??????W-L??Ί(???(??(??(??(??(???j??!^"???Du?M|??V? ++????J#? ++???????篢}+?oك??Z7????????Z_jN????N:R?4g???J?ޣ?hϯZ?Z_QI?J_қր#?G?J:?4v????zR??KP??Y3?k?????K?Ư????d??u?????+???????????)H??(???(??(??(??(??(????Ǭ??7??^??=f?q??~y???:??߶?R??0?5????????ݷ???A??+D?i:??Sh?????o?ii????/???x????Ѫ???/????~???????`QE ++(?? ++(?? ++(?? ++(?? ++(?? ++?????վ???E_????s?'?}?l?????%>??SS??uXQ@Q@Q@Q@Q@Q@??????Z?t?6????????'??+??????KO????F?_???x[?$??EL??ET?QEQEQEQEQEW?????#???U?_????????޾?QS@}ǣ?:?jV^?? ????VEPEPEPEPEP8??F=?0x????'Z???5?;????ڼ-??????^??ˏ?Z??a?5?3??n?S?k???Ȥ=?????jd?tUo????x???G?l????ة?[???????Q???????(?[???????Q???????(?W??_????)~?g?=????Y??}???{??}?>?g?=????Y??}???{??}?>?g?=????Y???j??!^"???Du??l????د??j??G??Y???p??t???$?F???G=}??_:????o?m???????z???)????4??i}?h?J<҃?:?t??c?/Ґ?`?^??O??qހ)??s???_?????_]?D?_z_?k >??????/??D?*d??H??JR?N????O??????>?i?=????P?*??-????C?h?e???O???X??????{????Ə?Z?t??????*??-????C?h?e???O???X??????{????Ə?Z?t??????*??-????C?h?e???O???X????7?????e???O???W????,߿O???=>????????ݷ???A?????5!??9??Ik???h?0GJ:w???K??????n??????C?_m>/?s???K?*?H?N??ϝ ++D9???{W? W??????|Y??5??y?Z^?Λ?:???_J??C??V?'???????????h????a?????,????6??_J??C????ҿ???Ƌ??? W??????|Y??4??????????M~??/??!??????_??~??E???????a?????,?????j????????&?M??ҿ???Ə?E?????_???~d???????????M??l?????ş?_?????_??~??G?"?W?????`?2?j????????&??Z???????????o?E?????_???}+?y??h?????l?????ş?G?-_??~??g??????"?W?????????(?K?/,?6&ȇHZ#?dz??#?????G???_2k߳??'?]#?????? ?Q??;0???Y*?+??ғ???????O?^?ƾ(??u? ?F6?o"7*??h?+?_?e??zO????r?D~?J?_?l?}>?A ?`.I?$?Ԟ??T???E;?3? ??o?I?~???Q? ??o?I?~???W?/?`????<?@?`?&???m?A??????????a?1????????f?4}?G????f??3? ??l??zO????r?????2P,???2??/????+??(??]???C$?????~??????Q?k?E?????]???????+??(??]????rߕ??????h????@:?4X???e߈_?1??~S??Pe߈_?1??~W??W? ??()~?o?`??~N??.?B???O????r??e߈_?1??~W??W?٭?? ++>??(????˿??c???????w?? rߕ??????Ks???[??X???/|A???O????r??-?@??G&????????a???(??? ++,?_?O?;O???6?d??YF?3??f?7v??{u?$H???ʀ??K֚}?L???????+@ ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(????v???b??zo?(?i=?P?֡????&???h?$????~=?8???{i C??}??1~???Q z??}?W~e?}????? ????~?h?????P?>?????|9?/?????n?j?C!Td?$???=h???k_??h??j7w˓??67`q?J??`Ru4?(?c????.s֓?ڀ?M4?v?? ++1?=(?t???J?(){?????d??g?:f??4?RL?m4?x??}?RqI??1?zb????{Q??R{????????~?q?J}?"?8???.1Ҁ?Kӽ!??K???v?????ڐu??(?F?^??B ++Q?ڐs?F;?1&??K?Ҕ?=?=????b???>?f??A??????'c֌?????'nis?N3?@x???.2i????????+@ ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(?? ++(??=?????׏|`??????%?/??5???d ?!'r?1??õz???D?N?4Q???W?w?M?#???{?|??/?H?R?+/?????!dm?ǿ???%????O?o?x4??2??o0`:L?H0?7C?Ҿ????a??+?-V???e?????c???YFc?@|a???G???H??~%~җ?u$?p?+Lc綑?D?w????????.?o?i??o?Q???z?$??X??5a?B?€??????4??#?@? T????>?q߭???G???*=??ޗ4C?JzQ?K?J'|f??Ԁ Q??stϥ'9???s??4} .s@?K?x??????>???3?(?:џŽ????_AH?G?.qI?(=h?????Fsڎq?K?x??ir(ǥ??? ???)Ⓝ?@????R?ޔ????? P??????G|P8??٠?Ν?h?.x??Ґ???;PFh>???i8c?jC?G?=zPӭ??}z????????Gz????V??}??1??-??;u;q??Z??|?? ?????????d?+?j??G?(|?AH?#???\????? ???????jG??????ď??R??????|?A8??o???????ex+????Y> ++?R????wtW ? +?????o?????????R????wtW ? '?Y????? ++??ex+????G?(???O?Y ++????? ++??-?n?y?OÒ???ښ?Z?3?^BN?P1??õ~?O???h?K\???C??B?? |?B?'?)6?{????O???? f??? ?????M??!x|?v8?HYr???+?߇????o?i?'???ẏp?+?J??D???_e??߰??,Z??ikM̗??w?}?+/ ++دӍ ?6<+1???_ސC??< ????e??????d???Q?3?FN?~?c?J2z?MG?P?g??ր{P???jv=?1??1?K??i?A?:R ??pi?(?I??)z ++8?(w?????I?@?>?gg?P{P?Rt??ZJ=?Fs?iF{???Fizs?e???????GҐ?x?l?????~??ş??ᧄ???W??R??a/ه??I??>???Q? %?0?Щ'?????????K?a??RO?????? ~???*I?????z????>A?????T????????_?? ++??}???????ᄿf?$?????=G?0????B???y?ǫ??(??a/ه??I??>???Q? %?0?Щ'?????????K?a??RO???????~?'???ss?x ++??????i???e?2??k?:?9?o?=3????)??B?4?ڙ???~?`- ?t`???y??(&? ?@ ?Q?8??G=?P? ++Px?!?????7R???M?4?(??? ++^?????O?9ѯ5?ԑ?Ub??q ????z???G?6?eo#?]?4hO?u?R???y????"????????Ѝ;?A??????S >Y?? ????W??????~??+??]????ʊ?>M?? ????W??????~??+??]????ʊ?7???k??]??:????? A?5?Ю??w??k?*(???bٯ??w?????;G?1???B???u??????????f???????????_? ++?????v????>M?? ????W??????~??+??]????ʊ?7???k??]??:????ɿ?O???????< ?xH}6???/????????tcڿY+?????????޼??T?rir???\????????g???1?X ??@???у??u4??'9??????G?R?y?*??????O?o?k???'k?NYT|??7V??%?(#i&`???O?1?j??(I/??E? ???B??$?a??ѠX?? ????-0+?k???ch??u?G'?P0iG?'JN?4?=?3?(???@O??QFI?@ ?!??qގ?Pb??<ҏJLu???n??;Q?4?Pg(??4?c=h?K?׵????{???җ4??K?Q?Ǝ????A???K?J\?L?qG'?;b? v????4~???9???ґ֓?րs??FGAI?ހa?)y??E?? ++Q??h???J^???)=?:?\gځ?I?E??hϯ4c?0zQ?h?ʔP?ޓ?R?=??◑?G|Pw?4?i?(z ++C?;?)h????>????Խz?7̦??????|? ??'??"?Gk?????|? ??'??"?G?QH?(??(??(??(??(??9?q??O??ϐ?ъ??տ??????!M? ?pv???MO?;9??ӱ?J:????n?d?4c???'??*d?(???(??(??(??(??(????m?? x?????_?5???m??[?^?*h??^4??????YZ(??l??Z???A??=h=x? t??r?1?e`??I8??~/????'???u5????,?^C?,j??aڿ ~+??_?k?r??_J??!nnC??p!]Nۈ?u?Ѱ???}??U??E? ?m????S????n?H|?|?;B??F'???| ?2|k??|U?o?*?ͻ??m?J}?i#??z?G???:r(??>?c????@ ??1G9????i: ++>????Z84u?????ހ?h?????΃?g?jC?PS????A?=?=???hȠ?(??u??8????J) ++A׊9?w??b??Q?Ҁ?)1F(pi:?4z??????H(??@????????&?#?N?C??????#?3????????W??~qx??O????????W??C??)QEQEQEQEQEW?F?q?i?????/_????????퐦??Q?????E;????Z3?(?x??d???(?J0h?MiO'Z9?FJ>????q?????:???Ҏh?????? ?????t5???>???'??+?????????'????A?????$??EL??ET?QEQEQEQEQEW?????!o?y???????m?? x?????M????????s?Y:)M????|M???O?>?????5??m?,?^C?*nK?`z,??fY\*?Rx?5?j??(??~ ??'??????|)?C$^Q;|? ?ʱ={W?_?lߎ????ß??????-??h_?+? ql?Z67??}%?.????v?x???7׎Y??zrw???????NԀ??߳??/???Q|D???d???d H ++?#u?Ǎ?ZW?οh>|?????J?????v?Y??b~bĞM{O??%???,p??z???ҝ??mi??` ++?ׁҗ??g?jN??FGZS??q@ ++??/^h?#?o?h??q@????$??? c4Z?})=??'?~???>?t4????p:ю?JN?b?3Kׁ@^h$Gz? b???? ?j1?@sG3G^)q@ ????i1?.{?????G??۹?{:qK?Rd?c?8?A4????J:?(????????})?8??49?Mh珌F?n??]O?HE~???????~}u??!?9P?(??@QE|??????m?a???|@????Z??囋;???????7#?b+J??d?sT??4??Z%???4v???伒??c?1W䟍~?=?????_?~'? ?hV??j?? ++?à[?h????xX|I???_?????k?????c??%??&?*??>_???g??d?_???F?Lr???_?zw???????"??߇~9???C??l>&3\x]??? u+?????.??U?Ii?????I?????(??Q@3~џ???a|>?on?lj?в?-?????????q?&3?'Ҿb???~???տ?W5|????????1??K????2???` ??pA?֟?f?????g??Gc??h??u???R?6???2?6??X?-T1;C(ʖF?O??γ??H???k?h60i?u?k???K Ƽ*G???Z4QEQEW????ʚ??Y?k?O????*???????+??o i???-ԟjF?w?z??????????>?? xU?!?`E_?!?-??a?? ?????_?^???;??>)????A?ӲZ =??@T???20cS????g????o????I?}u?o?>??N?~A+)?X?????ӴH @?Ͽ?X!???}??í?I?l??????b2X???=O?}+kg???\V??Ȧގ??9??j ???G???ր?Jw?i:s@$Q?F{?ӥ.3H}h=h?v?R?z@ ++^?} 'O€)q?@ ??G?h?sK?Oց??G^????t?b??;b???H?????R??Rg??<????? M??c?= ++ե\Ǝ?:e~?}???b???xO???I?'?忈?/?^?6??,??[?ތ?W?r+??7?2??Y?c?oŚuީ??Y???Yy~{? ++?%#?d\y??}_o???q?_iy????;?=????k?O?3OǵX? :Fq????'? Z?]???k?#?4?7?t?????? ????~??q@? :@???4??>~????}?(?8?@t|}???4?????????k??)23@?+?s??????G????????:??c?????????????????wB17??Tf??9PG^???????🂯X?K?{VBH?p?c;??̽?~???=??v?j?K?i??0???kz???  ++h?~𶍠j??]i?V???K?%̐ƨ?6?c??,r???=k~?(??(??(?ϟ?~?V? q?W??J?A??????????޼??T?kxz?+m2?`l??5???i?s??8?*?3?j>???zw?9?i"?ޏ?zAҗ?Ԙ?(???x???J>??qH?:?@?s@??ƀ b??J3??'Ҁ?t?ǽ???L?????Q??:sJ?c򣿽!?G'???A@?? ++^i}???J(#ҁ???? ++=??A?v?? ???I?C?=?/??????.?(>?t?G^(9??◭'S@^?~????y?sڃ?K????P=E/׭'?;P?G^?q??)rzќ??Fx???>?u???@^i??J??.qHy?JN( 4????ǽ(掦?ؠ??I?QדG^???GQ??J8?(Ґ?????@?????{w??S@?b????揚??I?=????????҃??g?(?=h??R3@?? ++N??x????????Թ?^???ӽ???O??RK?z1?@ ++?M9???8??g^)y?G??M?=???? ??K??????kci?sLo?OZ?????|4?????????/????4??D???W??C??)QEQEQEQEQEW?F??'????W??~s???z??? ++h?t'h??L?|??p*?=h??'ӵ/4gҁ????N???Fzv??(?@ ۚ????(94?F;????K?F1Ҁx?~|~??? ???D?????F?? ?o?????????D o????>?ӿ?m?\??A2?QREPEPEPEPEP_?߶???? ????ү???????-?O?????4??)??l???n?VN?? ?????Vp=??tf??1?3K?y?#???(p}i9"??j@3@ ?M.{ќ??H?(?b??GS??@??rh'ך0GJ{??n?}{??Rc?zQҎ??.zO?I׊Q???JNE) ??4??&3ӥ9????{G?4 )??4?zPt???H1ޜ??'Niy??N????J=??)?? ?Kސ???A@=qF; ++8??旯~)9=(?@??4??ȣ?ӵҌs?>?cހ?ғ?;? ??=?}???9??????ց ?JP1Hx??.hߥ'?K?zB ?4b??֌z??R?? ?{?g??'q?QҀsI?i????P???84?֛?P$??????$R??LqZ???{?>?/????[?=ɴ???Ot??͒?????W??Կ??a??y???????7ÿg?}j?\=???s)]?sʲ??^? i?S?.??I??)4П?Կ??a??y??????~???????????1??????I??? ??< ????Ȓ??\?} ? K?????????????? ??/??_=????|??$??v????????$??r?P>??????C?K???Q? K??????????????< ?>?O?9G?1??z?????????} ? K?????????????? ??/??_=?????D???R????\?????Q?П?Կ??a??y??????~???????????1??????"I??h??5?'?????'??????~?????????R?????%???+???c_?χ?D???R???|??$??r?P>??????C?K???W?z?<1????O ++]??d?_c??????????< ???"I??k?????Ë????2ɍ͹????֚@})?zw~( ?ҎqL??>?g֓??(ǥ/?!8????4?Z3??sJi:R???????G8??Z^??AҔ???u??????~Gv? ?D,B????M}c?X|K+to`?h?5?`???w?~??4Y4mZ!=??ܧ#8*G ??Wˍ??%?ac????Rho???? ?C'?K\???ᬾ??????n?;???Y??/?}???'?1ׂ?Y????)r??_??_??d??k??7G?5??o???Z???ׇ?x+?|?#???O?c?c?b??????r??_??_??d??k??7G?5??o???Z???׆????C?\??????/?1ׂ?????9G(?? e???O?????t?Y|????%????xo?1ׂ????????)??|?>_?????9@??k/???2????????7? ??-q????Ꮌ?>]??9G?1ׂ?}???9G(?? e???O?????t?Y|????%????xi????????9G?1߂?????9G(?? e???O?????u???G?????o?M?v?o?Q?2?S???:^?? u??????9]g??e??cY?W??x3????A??????&??+W?z?m???X?}z??K?4m??& ?Iځ=qH28?ځ??~???ތ??>?`? ?????K?9???K?ހO9???9p(?l??4?րAK???=???@ ?L??rz??h ׽4~?? (??FzQ??c?1F28?A?P1?ZPi:??P}?Rr? ++?u??/֑{р(ɣ??4?E?K??4? ?94}8?.s@?!?T????(#w???? ++^?c?B1N?ɤ????nsK?ڀ ?c????d?@_?J\v? P?F=(??4???G= ??@?????Қz??Q???z94gh??ր ??'?/????Z9Q??N??ئ?:_l?K׊A?K?M'|????m.h??c?z:{?i4tJ^OZS?7Q??/?&=zQ??? + #include "cyber/examples/proto/examples.pb.h" + + #include "cyber/cyber.h" +diff --color -Naur cyber/examples/proto/.gitignore /opt/apollo/cyber/examples/proto/.gitignore +--- cyber/examples/proto/.gitignore 2023-12-23 18:23:13.084910841 +0800 ++++ /opt/apollo/cyber/examples/proto/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,3 +0,0 @@ +-*.pb.cc +-*.pb.h +-*pb2.py +diff --color -Naur cyber/examples/proto/BUILD /opt/apollo/cyber/examples/proto/BUILD +--- cyber/examples/proto/BUILD 2023-12-23 18:23:13.084910841 +0800 ++++ /opt/apollo/cyber/examples/proto/BUILD 2023-12-23 18:05:58.575028978 +0800 +@@ -1,44 +1,12 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") +-load("//tools:cc_so_proto_rules.bzl", "cc_so_proto_library") +-load("//tools/install:install.bzl", "install", "install_files") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +- +-install_files( +- name = "cyber_examples_proto_hdrs", +- dest = "cyber/include/proto", +- files = [ +- ":examples_cc_proto_hdrs", +- ], +-) +- +-install( +- name = "cyber_examples_proto_so", +- library_dest = "cyber/lib", +- targets = [ +- ":libexamples_cc_proto.so", +- ], +-) +- +-cc_so_proto_library( +- name = "examples_cc_proto", +- srcs = [ +- ":examples_proto", +- ], +-) +- + proto_library( + name = "examples_proto", + srcs = ["examples.proto"], + ) + +-py_proto_library( +- name = "examples_py_pb2", +- deps = [ +- ":examples_proto", +- ], +-) ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/examples/timer_component_example/BUILD /opt/apollo/cyber/examples/timer_component_example/BUILD +--- cyber/examples/timer_component_example/BUILD 2023-12-23 18:23:13.084910841 +0800 ++++ /opt/apollo/cyber/examples/timer_component_example/BUILD 2023-12-23 18:05:58.575028978 +0800 +@@ -1,26 +1,16 @@ +-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") +-load("//tools/install:install.bzl", "install") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_component") + + package(default_visibility = ["//visibility:public"]) + +- +-cc_binary( ++apollo_component( + name = "libtimer_component_example.so", +- linkshared = True, +- linkstatic = True, +- deps = [":timer_component_example_lib"], +-) +- +-cc_library( +- name = "timer_component_example_lib", + srcs = ["timer_component_example.cc"], + hdrs = ["timer_component_example.h"], + deps = [ + "//cyber", + "//cyber/examples/proto:examples_cc_proto", + ], +- alwayslink = True, + visibility = ["//visibility:private"], + ) + +@@ -32,14 +22,5 @@ + ], + ) + +-install( +- name = "install", +- data = [ +- ":conf", +- ], +- targets = [ +- ":libtimer_component_example.so", +- ], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/examples/timer_component_example/timer.dag /opt/apollo/cyber/examples/timer_component_example/timer.dag +--- cyber/examples/timer_component_example/timer.dag 2023-12-23 18:23:13.084910841 +0800 ++++ /opt/apollo/cyber/examples/timer_component_example/timer.dag 2023-12-23 18:05:58.575028978 +0800 +@@ -1,5 +1,5 @@ + module_config { +- module_library : "/apollo/bazel-bin/cyber/examples/timer_component_example/libtimer_component_example.so" ++ module_library : "cyber/examples/timer_component_example/libtimer_component_example.so" + timer_components { + class_name : "TimerComponentSample" + config { +diff --color -Naur cyber/io/BUILD /opt/apollo/cyber/io/BUILD +--- cyber/io/BUILD 2023-12-23 18:23:13.085910841 +0800 ++++ /opt/apollo/cyber/io/BUILD 2023-12-23 18:05:58.575028978 +0800 +@@ -1,109 +1,67 @@ +-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test", "apollo_cc_binary") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_io_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "io", +- deps = [ +- ":poll_data", +- ":poll_handler", +- ":poller", +- ":session", ++apollo_cc_library( ++ name = "cyber_io", ++ hdrs = [ ++ "poll_data.h", ++ "poll_handler.h", ++ "poller.h", ++ "session.h", + ], +- alwayslink = True, +-) +- +-cc_library( +- name = "poll_data", +- hdrs = ["poll_data.h"], +-) +- +-cc_library( +- name = "poll_handler", +- srcs = ["poll_handler.cc"], +- hdrs = ["poll_handler.h"], ++ srcs = ["poll_handler.cc", "poller.cc", "session.cc"], + deps = [ +- ":poll_data", +- ":poller", +- "//cyber/common:log", +- "//cyber/croutine", ++ "//cyber/common:cyber_common", ++ "//cyber/croutine:cyber_croutine", ++ "//cyber/base:cyber_base", ++ "//cyber/scheduler:cyber_scheduler", ++ "//cyber/time:cyber_time", + ], + ) + +-cc_library( +- name = "poller", +- srcs = ["poller.cc"], +- hdrs = ["poller.h"], +- deps = [ +- ":poll_data", +- "//cyber/base:atomic_rw_lock", +- "//cyber/common:log", +- "//cyber/common:macros", +- "//cyber/scheduler:scheduler_factory", +- "//cyber/time", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "poller_test", + size = "small", + srcs = ["poller_test.cc"], + deps = [ +- ":poller", +- "//cyber:cyber_core", ++ "//cyber", + "@com_google_googletest//:gtest", + ], + ) + +-cc_library( +- name = "session", +- srcs = ["session.cc"], +- hdrs = ["session.h"], +- deps = [ +- ":poll_handler", +- "//cyber/common:log", +- ], +- alwayslink = True, +-) +- +-cc_binary( ++apollo_cc_binary( + name = "tcp_echo_client", + srcs = ["example/tcp_echo_client.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + ], + ) + +-cc_binary( ++apollo_cc_binary( + name = "tcp_echo_server", + srcs = ["example/tcp_echo_server.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + ], + ) + +-cc_binary( ++apollo_cc_binary( + name = "udp_echo_client", + srcs = ["example/udp_echo_client.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + ], + ) + +-cc_binary( ++apollo_cc_binary( + name = "udp_echo_server", + srcs = ["example/udp_echo_server.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + ], + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/logger/BUILD /opt/apollo/cyber/logger/BUILD +--- cyber/logger/BUILD 2023-12-23 18:23:13.085910841 +0800 ++++ /opt/apollo/cyber/logger/BUILD 2023-12-23 18:05:58.576028978 +0800 +@@ -1,27 +1,30 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test", "apollo_cc_binary") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_logger_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "logger", +- srcs = ["logger.cc"], +- hdrs = ["logger.h"], ++apollo_cc_library( ++ name = "cyber_logger", ++ srcs = [ ++ "async_logger.cc", ++ "log_file_object.cc", ++ "logger_util.cc", ++ "logger.cc", ++ ], ++ hdrs = [ ++ "async_logger.h", ++ "log_file_object.h", ++ "logger.h", ++ "logger_util.h", ++ ], + deps = [ +- "//cyber/common", +- "//cyber/logger:log_file_object", ++ "//cyber:cyber_binary", ++ "//cyber/common:cyber_common", ++ "//cyber/base:cyber_base", + ], +- alwayslink =True, + ) + +-cc_test( ++apollo_cc_test( + name = "logger_test", + size = "small", + srcs = ["logger_test.cc"], +@@ -32,18 +35,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "async_logger", +- srcs = ["async_logger.cc"], +- hdrs = ["async_logger.h"], +- deps = [ +- "//cyber/base:macros", +- "//cyber/common", +- "//cyber/logger:log_file_object", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "async_logger_test", + size = "small", + srcs = ["async_logger_test.cc"], +@@ -54,18 +46,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "log_file_object", +- srcs = ["log_file_object.cc"], +- hdrs = ["log_file_object.h"], +- deps = [ +- "//cyber:binary", +- "//cyber/common:log", +- "//cyber/logger:logger_util", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "log_file_object_test", + size = "small", + srcs = ["log_file_object_test.cc"], +@@ -76,16 +57,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "logger_util", +- srcs = ["logger_util.cc"], +- hdrs = ["logger_util.h"], +- deps = [ +- "//cyber/common:global_data", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "logger_util_test", + size = "small", + srcs = ["logger_util_test.cc"], +@@ -96,4 +68,5 @@ + linkstatic = True, + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/mainboard/BUILD /opt/apollo/cyber/mainboard/BUILD +--- cyber/mainboard/BUILD 2023-12-23 18:23:13.086910841 +0800 ++++ /opt/apollo/cyber/mainboard/BUILD 2023-12-23 18:05:58.576028978 +0800 +@@ -1,10 +1,9 @@ +-load("@rules_cc//cc:defs.bzl", "cc_binary") + load("//tools:cpplint.bzl", "cpplint") +-load("//tools/install:install.bzl", "install") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_binary") + + package(default_visibility = ["//visibility:public"]) + +-cc_binary( ++apollo_cc_binary( + name = "mainboard", + srcs = [ + "mainboard.cc", +@@ -15,15 +14,11 @@ + ], + linkopts = ["-pthread"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", ++ "//cyber/plugin_manager:cyber_plugin_manager", + "//cyber/proto:dag_conf_cc_proto", + ], + ) + +-install( +- name = "install", +- runtime_dest = "cyber/bin", +- targets = [":mainboard"], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/mainboard/module_argument.cc /opt/apollo/cyber/mainboard/module_argument.cc +--- cyber/mainboard/module_argument.cc 2023-12-23 18:23:13.086910841 +0800 ++++ /opt/apollo/cyber/mainboard/module_argument.cc 2023-12-23 18:05:58.576028978 +0800 +@@ -28,16 +28,21 @@ + void ModuleArgument::DisplayUsage() { + AINFO << "Usage: \n " << binary_name_ << " [OPTION]...\n" + << "Description: \n" +- << " -h, --help : help information \n" +- << " -d, --dag_conf=CONFIG_FILE : module dag config file\n" ++ << " -h, --help: help information \n" ++ << " -d, --dag_conf=CONFIG_FILE: module dag config file\n" + << " -p, --process_group=process_group: the process " + "namespace for running this module, default in manager process\n" + << " -s, --sched_name=sched_name: sched policy " + "conf for hole process, sched_name should be conf in cyber.pb.conf\n" ++ << " --plugin=plugin_description_file_path: the description file of " ++ "plugin\n" ++ << " --disable_plugin_autoload : default enable autoload " ++ "mode of plugins, use disable_plugin_autoload to ingore autoload\n" + << "Example:\n" + << " " << binary_name_ << " -h\n" + << " " << binary_name_ << " -d dag_conf_file1 -d dag_conf_file2 " +- << "-p process_group -s sched_name\n"; ++ << "-p process_group -s sched_name\n" ++ << " " << binary_name_ << " --plugin plugin_xml_conf -d dag_conf "; + } + + void ModuleArgument::ParseArgument(const int argc, char* const argv[]) { +@@ -70,6 +75,9 @@ + {"dag_conf", required_argument, nullptr, 'd'}, + {"process_name", required_argument, nullptr, 'p'}, + {"sched_name", required_argument, nullptr, 's'}, ++ {"plugin", required_argument, nullptr, ARGS_OPT_CODE_PLUGIN}, ++ {"disable_plugin_autoload", no_argument, nullptr, ++ ARGS_OPT_CODE_DISABLE_PLUGIN_AUTOLOAD}, + {NULL, no_argument, nullptr, 0}}; + + // log command for info +@@ -108,6 +116,12 @@ + case 's': + sched_name_ = std::string(optarg); + break; ++ case ARGS_OPT_CODE_PLUGIN: ++ plugin_description_list_.emplace_back(std::string(optarg)); ++ break; ++ case ARGS_OPT_CODE_DISABLE_PLUGIN_AUTOLOAD: ++ disable_plugin_autoload_ = true; ++ break; + case 'h': + DisplayUsage(); + exit(0); +diff --color -Naur cyber/mainboard/module_argument.h /opt/apollo/cyber/mainboard/module_argument.h +--- cyber/mainboard/module_argument.h 2023-12-23 18:23:13.086910841 +0800 ++++ /opt/apollo/cyber/mainboard/module_argument.h 2023-12-23 18:05:58.576028978 +0800 +@@ -31,6 +31,10 @@ + static const char DEFAULT_process_group_[] = "mainboard_default"; + static const char DEFAULT_sched_name_[] = "CYBER_DEFAULT"; + ++// code for command line arguments without short parameters ++static const int ARGS_OPT_CODE_PLUGIN = 1001; ++static const int ARGS_OPT_CODE_DISABLE_PLUGIN_AUTOLOAD = 1002; ++ + class ModuleArgument { + public: + ModuleArgument() = default; +@@ -42,12 +46,16 @@ + const std::string& GetProcessGroup() const; + const std::string& GetSchedName() const; + const std::list& GetDAGConfList() const; ++ const std::list& GetPluginDescriptionList() const; ++ const bool& GetDisablePluginsAutoLoad() const; + + private: + std::list dag_conf_list_; ++ std::list plugin_description_list_; + std::string binary_name_; + std::string process_group_; + std::string sched_name_; ++ bool disable_plugin_autoload_ = false; + }; + + inline const std::string& ModuleArgument::GetBinaryName() const { +@@ -66,6 +74,15 @@ + return dag_conf_list_; + } + ++inline const std::list& ModuleArgument::GetPluginDescriptionList() ++ const { ++ return plugin_description_list_; ++} ++ ++inline const bool& ModuleArgument::GetDisablePluginsAutoLoad() const { ++ return disable_plugin_autoload_; ++} ++ + } // namespace mainboard + } // namespace cyber + } // namespace apollo +diff --color -Naur cyber/mainboard/module_controller.cc /opt/apollo/cyber/mainboard/module_controller.cc +--- cyber/mainboard/module_controller.cc 2023-12-23 18:23:13.086910841 +0800 ++++ /opt/apollo/cyber/mainboard/module_controller.cc 2023-12-23 18:05:58.576028978 +0800 +@@ -21,6 +21,7 @@ + #include "cyber/common/environment.h" + #include "cyber/common/file.h" + #include "cyber/component/component_base.h" ++#include "cyber/plugin_manager/plugin_manager.h" + + namespace apollo { + namespace cyber { +@@ -39,21 +40,22 @@ + const std::string current_path = common::GetCurrentPath(); + const std::string dag_root_path = common::GetAbsolutePath(work_root, "dag"); + std::vector paths; ++ for (auto& plugin_description : args_.GetPluginDescriptionList()) { ++ apollo::cyber::plugin_manager::PluginManager::Instance()->LoadPlugin( ++ plugin_description); ++ } ++ if (!args_.GetDisablePluginsAutoLoad()) { ++ apollo::cyber::plugin_manager::PluginManager::Instance() ++ ->LoadInstalledPlugins(); ++ } + for (auto& dag_conf : args_.GetDAGConfList()) { +- std::string module_path = ""; +- if (dag_conf == common::GetFileName(dag_conf)) { +- // case dag conf argument var is a filename +- module_path = common::GetAbsolutePath(dag_root_path, dag_conf); +- } else if (dag_conf[0] == '/') { +- // case dag conf argument var is an absolute path +- module_path = dag_conf; +- } else { +- // case dag conf argument var is a relative path +- module_path = common::GetAbsolutePath(current_path, dag_conf); +- if (!common::PathExists(module_path)) { +- module_path = common::GetAbsolutePath(work_root, dag_conf); +- } ++ std::string module_path = dag_conf; ++ if (!common::GetFilePathWithEnv(dag_conf, "APOLLO_DAG_PATH", ++ &module_path)) { ++ AERROR << "no dag conf [" << dag_conf << "] found!"; ++ return false; + } ++ AINFO << "mainboard: use dag conf " << module_path; + total_component_nums += GetComponentNum(module_path); + paths.emplace_back(std::move(module_path)); + } +@@ -72,21 +74,15 @@ + } + + bool ModuleController::LoadModule(const DagConfig& dag_config) { +- const std::string work_root = common::WorkRoot(); +- + for (auto module_config : dag_config.module_config()) { + std::string load_path; +- if (module_config.module_library().front() == '/') { +- load_path = module_config.module_library(); +- } else { +- load_path = +- common::GetAbsolutePath(work_root, module_config.module_library()); +- } +- +- if (!common::PathExists(load_path)) { +- AERROR << "Path does not exist: " << load_path; ++ if (!common::GetFilePathWithEnv(module_config.module_library(), ++ "APOLLO_LIB_PATH", &load_path)) { ++ AERROR << "no module library [" << module_config.module_library() ++ << "] found!"; + return false; + } ++ AINFO << "mainboard: use module library " << load_path; + + class_loader_manager_.LoadLibrary(load_path); + +diff --color -Naur cyber/message/BUILD /opt/apollo/cyber/message/BUILD +--- cyber/message/BUILD 2023-12-23 18:23:13.086910841 +0800 ++++ /opt/apollo/cyber/message/BUILD 2023-12-23 18:05:58.577028978 +0800 +@@ -1,21 +1,9 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test", "apollo_cc_binary") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_message_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "message_header", +- hdrs = ["message_header.h"], +-) +- +-cc_test( ++apollo_cc_test( + name = "message_header_test", + size = "small", + srcs = ["message_header_test.cc"], +@@ -25,19 +13,28 @@ + ], + ) + +-cc_library( +- name = "message_traits", +- hdrs = ["message_traits.h"], ++apollo_cc_library( ++ name = "cyber_message", ++ hdrs = [ ++ "message_header.h", ++ "message_traits.h", ++ "protobuf_factory.h", ++ "protobuf_traits.h", ++ "py_message.h", ++ "py_message_traits.h", ++ "raw_message.h", ++ "raw_message_traits.h", ++ ], ++ srcs = [ ++ "protobuf_factory.cc", ++ ], + deps = [ +- ":message_header", +- ":protobuf_traits", +- ":py_message_traits", +- ":raw_message_traits", +- "//cyber/base:macros", ++ "//cyber/common:cyber_common", ++ "//cyber/proto:proto_desc_cc_proto", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "message_traits_test", + size = "small", + srcs = ["message_traits_test.cc"], +@@ -48,51 +45,7 @@ + ], + ) + +-cc_library( +- name = "protobuf_factory", +- srcs = ["protobuf_factory.cc"], +- hdrs = ["protobuf_factory.h"], +- deps = [ +- "//cyber/common:log", +- "//cyber/common:macros", +- "//cyber/proto:proto_desc_cc_proto", +- ], +-) +- +-cc_library( +- name = "protobuf_traits", +- hdrs = ["protobuf_traits.h"], +- deps = [ +- ":protobuf_factory", +- ], +-) +- +-cc_library( +- name = "py_message", +- hdrs = ["py_message.h"], +- deps = [ +- ":protobuf_factory", +- ], +-) +- +-cc_library( +- name = "py_message_traits", +- hdrs = ["py_message_traits.h"], +- deps = [ +- ":protobuf_factory", +- ":py_message", +- ], +-) +- +-cc_library( +- name = "raw_message", +- hdrs = ["raw_message.h"], +- deps = [ +- ":protobuf_factory", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "raw_message_test", + size = "small", + srcs = ["raw_message_test.cc"], +@@ -102,7 +55,7 @@ + ], + ) + +-cc_test( ++apollo_cc_test( + name = "protobuf_factory_test", + size = "small", + srcs = ["protobuf_factory_test.cc"], +@@ -113,13 +66,5 @@ + ], + ) + +-cc_library( +- name = "raw_message_traits", +- hdrs = ["raw_message_traits.h"], +- deps = [ +- ":protobuf_factory", +- ":raw_message", +- ], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/message/protobuf_factory.cc /opt/apollo/cyber/message/protobuf_factory.cc +--- cyber/message/protobuf_factory.cc 2023-12-23 18:23:13.086910841 +0800 ++++ /opt/apollo/cyber/message/protobuf_factory.cc 2023-12-23 18:05:58.577028978 +0800 +@@ -47,15 +47,28 @@ + } + + bool ProtobufFactory::RegisterMessage(const ProtoDesc& proto_desc) { ++ FileDescriptorProto file_desc_proto; ++ file_desc_proto.ParseFromString(proto_desc.desc()); ++ ++ // If the message in this proto file has been registered, return true. ++ if (FindMessageTypeByFile(file_desc_proto)) { ++ return true; ++ } + for (int i = 0; i < proto_desc.dependencies_size(); ++i) { + auto dep = proto_desc.dependencies(i); + if (!RegisterMessage(dep)) { + return false; + } ++ FileDescriptorProto dep_file_desc_proto; ++ dep_file_desc_proto.ParseFromString(dep.desc()); ++ const google::protobuf::Descriptor* descriptor = ++ FindMessageTypeByFile(dep_file_desc_proto); ++ ++ // If descriptor is found, replace the dependency with registered path. ++ if (descriptor != nullptr) { ++ file_desc_proto.set_dependency(i, descriptor->file()->name()); ++ } + } +- +- FileDescriptorProto file_desc_proto; +- file_desc_proto.ParseFromString(proto_desc.desc()); + return RegisterMessage(file_desc_proto); + } + +@@ -153,6 +166,22 @@ + return GetDescriptorString(desc, desc_str); + } + ++void ProtobufFactory::GetProtoPath(const std::string& type, ++ std::string& location) { ++ auto desc = DescriptorPool::generated_pool()->FindMessageTypeByName(type); ++ if (desc != nullptr) { ++ location = (desc->file())->name(); ++ return; ++ } ++ ++ desc = pool_->FindMessageTypeByName(type); ++ if (desc == nullptr) { ++ return; ++ } ++ location = (desc->file())->name(); ++ return; ++} ++ + // Internal method + google::protobuf::Message* ProtobufFactory::GenerateMessageByType( + const std::string& type) const { +@@ -207,6 +236,18 @@ + return pool_->FindServiceByName(name); + } + ++const Descriptor* ProtobufFactory::FindMessageTypeByFile( ++ const FileDescriptorProto& file_desc_proto) { ++ const std::string& scope = file_desc_proto.package(); ++ std::string type; ++ if (file_desc_proto.message_type_size()) { ++ type = scope + "." + file_desc_proto.message_type(0).name(); ++ } ++ const google::protobuf::Descriptor* descriptor = ++ pool_->FindMessageTypeByName(type); ++ return descriptor; ++} ++ + void ErrorCollector::AddError(const std::string& filename, + const std::string& element_name, + const google::protobuf::Message* descriptor, +diff --color -Naur cyber/message/protobuf_factory.h /opt/apollo/cyber/message/protobuf_factory.h +--- cyber/message/protobuf_factory.h 2023-12-23 18:23:13.086910841 +0800 ++++ /opt/apollo/cyber/message/protobuf_factory.h 2023-12-23 18:05:58.577028978 +0800 +@@ -82,11 +82,18 @@ + // Get Serialized descriptors of messages with the given type. + void GetDescriptorString(const std::string& type, std::string* desc_str); + ++ // Get the storage location of proto. ++ void GetProtoPath(const std::string& type, std::string& location); ++ + // Given a type name, constructs the default (prototype) Message of that type. + // Returns nullptr if no such message exists. + google::protobuf::Message* GenerateMessageByType( + const std::string& type) const; + ++ // Find a descriptor by FileDescriptorProto. Returns nullptr if not found. ++ const Descriptor* FindMessageTypeByFile( ++ const FileDescriptorProto& file_desc_proto); ++ + // Find a top-level message type by name. Returns nullptr if not found. + const Descriptor* FindMessageTypeByName(const std::string& type) const; + +diff --color -Naur cyber/node/BUILD /opt/apollo/cyber/node/BUILD +--- cyber/node/BUILD 2023-12-23 18:23:13.086910841 +0800 ++++ /opt/apollo/cyber/node/BUILD 2023-12-23 18:05:58.577028978 +0800 +@@ -1,40 +1,41 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test", "apollo_cc_binary") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_node_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "node", +- srcs = ["node.cc"], +- hdrs = ["node.h"], +- deps = [ +- ":node_channel_impl", +- ":node_service_impl", +- ], +-) +- +-cc_library( +- name = "node_channel_impl", +- hdrs = ["node_channel_impl.h"], +- deps = [ +- ":reader", +- ":writer", +- "//cyber/blocker:intra_reader", +- "//cyber/blocker:intra_writer", +- "//cyber/common:global_data", +- "//cyber/message:message_traits", ++apollo_cc_library( ++ name = "cyber_node", ++ srcs = [ ++ "node.cc", ++ ], ++ hdrs = [ ++ "node.h", ++ "node_channel_impl.h", ++ "node_service_impl.h", ++ "reader.h", ++ "reader_base.h", ++ "writer.h", ++ "writer_base.h", ++ ], ++ deps = [ ++ "//cyber/blocker:cyber_blocker", ++ "//cyber/common:cyber_common", ++ "//cyber/message:cyber_message", + "//cyber/proto:run_mode_conf_cc_proto", ++ "//cyber/service:cyber_service", ++ "//cyber/service_discovery:cyber_service_discovery", ++ "//cyber/croutine:cyber_croutine", ++ "//cyber/data:cyber_data", ++ "//cyber/proto:topology_change_cc_proto", ++ "//cyber/scheduler:cyber_scheduler", ++ "//cyber/time:cyber_time", ++ "//cyber/transport:cyber_transport", ++ "//cyber/event:cyber_event", ++ "//cyber/proto:role_attributes_cc_proto", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "node_channel_impl_test", + size = "small", + srcs = ["node_channel_impl_test.cc"], +@@ -46,20 +47,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "node_service_impl", +- hdrs = ["node_service_impl.h"], +- deps = [ +- ":reader", +- ":writer", +- "//cyber/common:global_data", +- "//cyber/service", +- "//cyber/service:client", +- "//cyber/service_discovery:topology_manager", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "node_test", + size = "small", + srcs = ["node_test.cc"], +@@ -71,33 +59,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "reader", +- hdrs = ["reader.h"], +- deps = [ +- ":reader_base", +- "//cyber/blocker", +- "//cyber/common:global_data", +- "//cyber/croutine:routine_factory", +- "//cyber/data:data_visitor", +- "//cyber/proto:topology_change_cc_proto", +- "//cyber/scheduler", +- "//cyber/service_discovery:topology_manager", +- "//cyber/time", +- "//cyber/transport", +- ], +-) +- +-cc_library( +- name = "reader_base", +- hdrs = ["reader_base.h"], +- deps = [ +- "//cyber/event:perf_event_cache", +- "//cyber/transport", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "reader_test", + size = "small", + srcs = ["reader_test.cc"], +@@ -109,29 +71,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "writer", +- hdrs = ["writer.h"], +- deps = [ +- ":writer_base", +- "//cyber/common:log", +- "//cyber/proto:topology_change_cc_proto", +- "//cyber/service_discovery:topology_manager", +- "//cyber/transport", +- ], +-) +- +-cc_library( +- name = "writer_base", +- hdrs = ["writer_base.h"], +- deps = [ +- "//cyber/common:macros", +- "//cyber/common:util", +- "//cyber/proto:role_attributes_cc_proto", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "writer_reader_test", + size = "small", + srcs = ["writer_reader_test.cc"], +@@ -143,17 +83,17 @@ + linkstatic = True, + ) + +-cc_test( ++apollo_cc_test( + name = "writer_test", + size = "small", + srcs = ["writer_test.cc"], + deps = [ + "//cyber", +- "//cyber/node:writer_base", + "//cyber/proto:unit_test_cc_proto", + "@com_google_googletest//:gtest", + ], + linkstatic = True, + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/parameter/BUILD /opt/apollo/cyber/parameter/BUILD +--- cyber/parameter/BUILD 2023-12-23 18:23:13.087910841 +0800 ++++ /opt/apollo/cyber/parameter/BUILD 2023-12-23 18:05:58.577028978 +0800 +@@ -1,27 +1,31 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test", "apollo_cc_binary") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_parameter_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "parameter", +- srcs = ["parameter.cc"], +- hdrs = ["parameter.h"], ++apollo_cc_library( ++ name = "cyber_parameter", ++ srcs = [ ++ "parameter.cc", ++ "parameter_client.cc", ++ "parameter_server.cc", ++ ], ++ hdrs = [ ++ "parameter.h", ++ "parameter_client.h", ++ "parameter_server.h", ++ "parameter_service_names.h", ++ ], + deps = [ +- "//cyber/message:protobuf_factory", ++ "//cyber/message:cyber_message", + "//cyber/proto:parameter_cc_proto", ++ "//cyber/node:cyber_node", ++ "//cyber/service:cyber_service", ++ "@fastrtps", + ], +- alwayslink = True, + ) + +-cc_test( ++apollo_cc_test( + name = "parameter_test", + size = "small", + srcs = ["parameter_test.cc"], +@@ -32,21 +36,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "parameter_client", +- srcs = ["parameter_client.cc"], +- hdrs = ["parameter_client.h"], +- deps = [ +- ":parameter", +- ":parameter_service_names", +- "//cyber/node", +- "//cyber/service:client", +- "@fastrtps", +- ], +- alwayslink = True, +-) +- +-cc_test( ++apollo_cc_test( + name = "parameter_client_test", + size = "small", + srcs = ["parameter_client_test.cc"], +@@ -57,21 +47,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "parameter_server", +- srcs = ["parameter_server.cc"], +- hdrs = ["parameter_server.h"], +- deps = [ +- ":parameter", +- ":parameter_service_names", +- "//cyber/node", +- "//cyber/service", +- "@fastrtps", +- ], +- alwayslink = True, +-) +- +-cc_test( ++apollo_cc_test( + name = "parameter_server_test", + size = "small", + srcs = ["parameter_server_test.cc"], +@@ -82,9 +58,5 @@ + linkstatic = True, + ) + +-cc_library( +- name = "parameter_service_names", +- hdrs = ["parameter_service_names.h"], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/plugin_manager/BUILD /opt/apollo/cyber/plugin_manager/BUILD +--- cyber/plugin_manager/BUILD 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/plugin_manager/BUILD 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,25 @@ ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package") ++load("//tools:cpplint.bzl", "cpplint") ++ ++package(default_visibility = ["//visibility:public"]) ++ ++apollo_cc_library( ++ name = "cyber_plugin_manager", ++ srcs = [ ++ "plugin_description.cc", ++ "plugin_manager.cc", ++ ], ++ hdrs = [ ++ "plugin_description.h", ++ "plugin_manager.h", ++ ], ++ deps = [ ++ "//cyber/class_loader:cyber_class_loader", ++ "//cyber/common:cyber_common", ++ "@tinyxml2", ++ ], ++) ++ ++apollo_package() ++ ++cpplint() +diff --color -Naur cyber/plugin_manager/plugin_description.cc /opt/apollo/cyber/plugin_manager/plugin_description.cc +--- cyber/plugin_manager/plugin_description.cc 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/plugin_manager/plugin_description.cc 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,131 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++#include "cyber/plugin_manager/plugin_description.h" ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "cyber/common/environment.h" ++#include "cyber/common/file.h" ++#include "cyber/common/log.h" ++ ++namespace apollo { ++namespace cyber { ++namespace plugin_manager { ++ ++PluginDescription::PluginDescription() {} ++ ++PluginDescription::PluginDescription(const std::string& name) : name_(name) {} ++ ++PluginDescription::PluginDescription(const std::string& name, ++ const std::string& description_index_path, ++ const std::string& description_path, ++ const std::string& actual_description_path, ++ const std::string& library_path, ++ const std::string& actual_library_path) ++ : name_(name), ++ description_index_path_(description_index_path), ++ description_path_(description_path), ++ actual_description_path_(actual_description_path), ++ library_path_(library_path), ++ actual_library_path_(actual_library_path) {} ++ ++bool PluginDescription::ParseFromIndexFile(const std::string& file_path) { ++ this->description_index_path_ = file_path; ++ this->name_ = apollo::cyber::common::GetFileName(file_path); ++ ++ if (!apollo::cyber::common::GetContent(file_path, &this->description_path_)) { ++ AWARN << "plugin index[" << file_path << "] name[" << this->name_ ++ << "] invalid, read index file failed"; ++ return false; ++ } ++ return ParseFromDescriptionFile(this->description_path_); ++} ++ ++bool PluginDescription::ParseFromDescriptionFile(const std::string& file_path) { ++ if (this->description_path_.empty()) { ++ this->description_path_ = file_path; ++ } ++ ++ if (!apollo::cyber::common::GetFilePathWithEnv( ++ this->description_path_, "APOLLO_PLUGIN_DESCRIPTION_PATH", ++ &this->actual_description_path_)) { ++ AWARN << "plugin index[" << file_path << "] name[" << this->name_ ++ << "] invalid, description[" << this->description_path_ ++ << "] file not found"; ++ return false; ++ } ++ ++ tinyxml2::XMLDocument doc; ++ if (doc.LoadFile(this->actual_description_path_.c_str()) != ++ tinyxml2::XML_SUCCESS) { ++ AWARN << "plugin description[" << file_path << "] name[" << this->name_ ++ << "] invalid, parse description file failed"; ++ return false; ++ } ++ const tinyxml2::XMLElement* root = doc.RootElement(); ++ this->library_path_ = root->Attribute("path"); ++ ++ std::string plugin_name = ++ std::regex_replace(this->library_path_, std::regex("/"), "__"); ++ if (this->name_.empty()) { ++ this->name_ = plugin_name; ++ } ++ ++ // process class name and base class name from description file, this will be ++ // used to build index fo lazy load ++ for (const tinyxml2::XMLElement* class_element = ++ root->FirstChildElement("class"); ++ class_element != nullptr; ++ class_element = class_element->NextSiblingElement("class")) { ++ std::string class_name = class_element->Attribute("type"); ++ std::string base_class_name = class_element->Attribute("base_class"); ++ ++ if (this->class_name_base_class_name_map_.find(class_name) != ++ this->class_name_base_class_name_map_.end()) { ++ AWARN << "plugin description[" << file_path << "] name[" << this->name_ ++ << "] invalid, class name[" << class_name << "] duplicated"; ++ continue; ++ } ++ ++ if (class_name.empty() || base_class_name.empty()) { ++ AWARN << "plugin description[" << file_path << "] name[" << this->name_ ++ << "] invalid, class name[" << class_name << "] base class name[" ++ << base_class_name << "] invalid"; ++ continue; ++ } ++ this->class_name_base_class_name_map_[class_name] = base_class_name; ++ } ++ ++ if (!apollo::cyber::common::GetFilePathWithEnv(this->library_path_, ++ "APOLLO_PLUGIN_LIB_PATH", ++ &this->actual_library_path_)) { ++ AWARN << "plugin description[" << file_path << "] name[" << this->name_ ++ << "] invalid, library[" << this->library_path_ << "] file not found"; ++ return false; ++ } ++ ++ return true; ++} ++ ++} // namespace plugin_manager ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/plugin_manager/plugin_description.h /opt/apollo/cyber/plugin_manager/plugin_description.h +--- cyber/plugin_manager/plugin_description.h 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/plugin_manager/plugin_description.h 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,64 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++#pragma once ++#include ++#include ++ ++namespace apollo { ++namespace cyber { ++namespace plugin_manager { ++ ++// plugin description struct ++class PluginDescription { ++ public: ++ std::string name_; ++ std::string description_index_path_; ++ std::string description_path_; ++ std::string actual_description_path_; ++ std::string library_path_; ++ std::string actual_library_path_; ++ ++ std::map class_name_base_class_name_map_; ++ ++ PluginDescription(); ++ explicit PluginDescription(const std::string& name); ++ PluginDescription(const std::string& name, ++ const std::string& description_index_path, ++ const std::string& description_path, ++ const std::string& actual_description_path, ++ const std::string& library_path, ++ const std::string& actual_library_path); ++ ++ /** ++ * @brief parse plugin description metadata from plugin index file ++ * ++ * @param file_path plugin index file path ++ * @return true if parse success ++ */ ++ bool ParseFromIndexFile(const std::string& file_path); ++ ++ /** ++ * @brief parse plugin description metadata from plugin description file ++ * ++ * @param file_path plugin description file path ++ * @return true if parse success ++ */ ++ bool ParseFromDescriptionFile(const std::string& file_path); ++}; ++ ++} // namespace plugin_manager ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/plugin_manager/plugin_manager.cc /opt/apollo/cyber/plugin_manager/plugin_manager.cc +--- cyber/plugin_manager/plugin_manager.cc 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/plugin_manager/plugin_manager.cc 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,209 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#include "cyber/plugin_manager/plugin_manager.h" ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "cyber/common/environment.h" ++#include "cyber/common/file.h" ++#include "cyber/common/log.h" ++#include "cyber/plugin_manager/plugin_description.h" ++ ++namespace apollo { ++namespace cyber { ++namespace plugin_manager { ++ ++PluginManager::~PluginManager() {} ++ ++bool PluginManager::ProcessPluginDescriptionFile(const std::string& file_path, ++ std::string* library_path) { ++ tinyxml2::XMLDocument doc; ++ if (doc.LoadFile(file_path.c_str()) != tinyxml2::XML_SUCCESS) { ++ AWARN << "fail to process file " << file_path; ++ return false; ++ } ++ const tinyxml2::XMLElement* root = doc.RootElement(); ++ ++ // TODO(liangjinping): parse as struct ++ *library_path = root->Attribute("path"); ++ ++ // TODO(liangjinping): parse description file and do something more ++ ++ return true; ++} ++ ++bool PluginManager::LoadPlugin( ++ const std::string& plugin_description_file_path) { ++ AINFO << "loading plugin from description[" << plugin_description_file_path ++ << "]"; ++ ++ auto description = ++ std::make_shared(); ++ if (!description->ParseFromDescriptionFile(plugin_description_file_path)) { ++ return false; ++ } ++ ++ if (plugin_description_map_.find(description->name_) != ++ plugin_description_map_.end()) { ++ AWARN << "plugin [" << description->name_ << "] already loaded"; ++ return true; ++ } ++ ++ if (!LoadLibrary(description->actual_library_path_)) { ++ AWARN << "plugin description[" << plugin_description_file_path << "] name[" ++ << description->name_ << "] load failed, library[" ++ << description->actual_library_path_ << "] invalid"; ++ return false; ++ } ++ ++ plugin_loaded_map_[description->name_] = true; ++ plugin_description_map_[description->name_] = description; ++ for (auto& class_name_pair : description->class_name_base_class_name_map_) { ++ plugin_class_plugin_name_map_[class_name_pair] = description->name_; ++ } ++ AINFO << "plugin description[" << plugin_description_file_path << "] name[" ++ << description->name_ << "] load success"; ++ return true; ++} ++ ++/** ++ * @brief find cyber_plugin_index directory ++ * @param base_path search root ++ * @param path_list vector for storing result ++ * @return true if at least one is found ++ */ ++bool FindPlunginIndexPath(const std::string& base_path, ++ std::vector* path_list) { ++ // TODO(liangjinping): change to configurable ++ size_t count = apollo::cyber::common::FindPathByPattern( ++ base_path, "cyber_plugin_index", DT_DIR, true, path_list); ++ return count > 0; ++} ++ ++bool PluginManager::FindPluginIndexAndLoad( ++ const std::string& plugin_index_path) { ++ std::vector plugin_index_list; ++ apollo::cyber::common::FindPathByPattern(plugin_index_path, "", DT_REG, false, ++ &plugin_index_list); ++ bool success = true; ++ for (auto plugin_index : plugin_index_list) { ++ std::string plugin_name = apollo::cyber::common::GetFileName(plugin_index); ++ AINFO << "plugin index[" << plugin_index << "] name[" << plugin_name ++ << "] found"; ++ if (plugin_description_map_.find(plugin_name) != ++ plugin_description_map_.end()) { ++ AWARN << "plugin [" << plugin_name << "] already loaded"; ++ continue; ++ } ++ ++ auto description = std::make_shared(plugin_name); ++ if (!description->ParseFromIndexFile(plugin_index)) { ++ success = false; ++ // invalid index file ++ continue; ++ } ++ ++ // if (!class_loader_manager_.LoadLibrary(actual_library_path)) { ++ // success = false; ++ // AWARN << "plugin index[" << plugin_index << "] name[" << plugin_name ++ // << "] load failed, library[" << actual_library_path << "] ++ // invalid"; ++ // continue; ++ // } ++ // lazy load ++ plugin_loaded_map_[description->name_] = false; ++ plugin_description_map_[description->name_] = description; ++ for (auto& class_name_pair : description->class_name_base_class_name_map_) { ++ plugin_class_plugin_name_map_[class_name_pair] = description->name_; ++ } ++ AINFO << "plugin index[" << plugin_index << "] name[" << description->name_ ++ << "] lazy load success"; ++ } ++ return success; ++} ++ ++bool PluginManager::LoadInstalledPlugins() { ++ if (apollo::cyber::common::GetEnv("APOLLO_PLUGIN_SEARCH_IN_BAZEL_OUTPUT") == ++ "1") { ++ AWARN << "search plugin index path under bazel-bin enabled, it may take " ++ "longer time to load plugins"; ++ // enable scanning cyber_plugin_index path under bazel-bin ++ const std::string apollo_root = ++ apollo::cyber::common::GetEnv("APOLLO_ROOT_DIR"); ++ // TODO(infra): make it configurable or detect automatically ++ const std::string bazel_bin_path = apollo_root + "/bazel-bin"; ++ std::vector user_plugin_index_path_list; ++ AINFO << "scanning plugin index path under " << bazel_bin_path; ++ FindPlunginIndexPath(bazel_bin_path, &user_plugin_index_path_list); ++ // load user plugin with higher priority ++ for (auto dir : user_plugin_index_path_list) { ++ AINFO << "loading user plugins from path[" << dir << "]"; ++ FindPluginIndexAndLoad(dir); ++ } ++ } ++ ++ std::string plugin_index_path = ++ apollo::cyber::common::GetEnv("APOLLO_PLUGIN_INDEX_PATH"); ++ if (plugin_index_path.empty()) { ++ // env not set, use default ++ const std::string apollo_distribution_home = ++ apollo::cyber::common::GetEnv("APOLLO_DISTRIBUTION_HOME"); ++ const std::string plugin_index_path = ++ apollo_distribution_home + "/share/cyber_plugin_index"; ++ } ++ AINFO << "loading plugins from APOLLO_PLUGIN_INDEX_PATH[" << plugin_index_path ++ << "]"; ++ size_t begin = 0; ++ size_t index; ++ do { ++ index = plugin_index_path.find(':', begin); ++ auto p = plugin_index_path.substr(begin, index - begin); ++ if (apollo::cyber::common::DirectoryExists(p)) { ++ AINFO << "loading plugins from plugin index path[" << p << "]"; ++ FindPluginIndexAndLoad(p); ++ } else { ++ AWARN << "plugin index path[" << p << "] not exists"; ++ } ++ begin = index + 1; ++ } while (index != std::string::npos); ++ return true; ++} ++ ++bool PluginManager::LoadLibrary(const std::string& library_path) { ++ if (!class_loader_manager_.LoadLibrary(library_path)) { ++ AWARN << "plugin library[" << library_path << "] load failed"; ++ return false; ++ } ++ return true; ++} ++ ++PluginManager* PluginManager::Instance() { return instance_; } ++ ++PluginManager* PluginManager::instance_ = new PluginManager; ++ ++} // namespace plugin_manager ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/plugin_manager/plugin_manager.h /opt/apollo/cyber/plugin_manager/plugin_manager.h +--- cyber/plugin_manager/plugin_manager.h 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/plugin_manager/plugin_manager.h 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,277 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++#pragma once ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "cyber/class_loader/class_loader_manager.h" ++#include "cyber/common/environment.h" ++#include "cyber/common/file.h" ++#include "cyber/common/log.h" ++#include "cyber/common/macros.h" ++#include "cyber/plugin_manager/plugin_description.h" ++ ++namespace apollo { ++namespace cyber { ++namespace plugin_manager { ++ ++class PluginManager { ++ public: ++ ~PluginManager(); ++ ++ /** ++ * @brief parse plugin description file and load the library ++ * TODO(liangjinping): parse description to struct ++ * ++ * @param file_path the path of plugin description file ++ * @return process result, true for success ++ */ ++ bool ProcessPluginDescriptionFile(const std::string& file_path, ++ std::string* library_path); ++ ++ /** ++ * @brief load plugin clases from file ++ * ++ * @param pluin_description_file_path file path ++ * @return result of loadding plugin, true for success ++ */ ++ bool LoadPlugin(const std::string& plugin_description_file_path); ++ ++ /** ++ * @brief get singleton instance of PluginManager ++ * ++ * @return instance pointer ++ */ ++ static PluginManager* Instance(); ++ ++ /** ++ * @brief create plugin instance of derived class based on `Base` ++ * ++ * @param derived_class class name of the derived class ++ * @return instance pointer ++ */ ++ template ++ std::shared_ptr CreateInstance(const std::string& derived_class); ++ ++ /** ++ * @brief find plugin index file and load plugins ++ * ++ * @param plugin_index_path plugin index file directory ++ * @return result of loadding plugins, true for success ++ */ ++ bool FindPluginIndexAndLoad(const std::string& plugin_index_path); ++ ++ /** ++ * @brief load plugins from installed path ++ * ++ * @return result of loadding plugins, true for success ++ */ ++ bool LoadInstalledPlugins(); ++ ++ /** ++ * @bried get plugin description file location that class belongs to ++ * @param class_name derived class name ++ * @return location of plugin description file ++ */ ++ template ++ std::string GetPluginClassHomePath(const std::string& class_name); ++ ++ /** ++ * @brief get plugin configuration file location ++ * @param class_name derived class name ++ * @param conf_name configuration file name ++ * @return location of plugin configuration file ++ */ ++ template ++ std::string GetPluginConfPath(const std::string& class_name, ++ const std::string& conf_name); ++ ++ /** ++ * @brief load library of plugin ++ * @param library_path library path ++ * @return result of loading library, true for success ++ */ ++ bool LoadLibrary(const std::string& library_path); ++ ++ /** ++ * @brief check if library of plugin is loaded ++ * @param class_name derived class name of plugin ++ * @return result of checking, true for loaded ++ */ ++ template ++ bool IsLibraryLoaded(const std::string& class_name); ++ ++ /** ++ * @brief check if library of plugin is loaded, and load it if not ++ * @param class_name derived class name of plugin ++ * @return result of checking, true for loaded ++ */ ++ template ++ bool CheckAndLoadPluginLibrary(const std::string& class_name); ++ ++ /** ++ * @brief Get all derived class name by base class name ++ * @return all derived class name of base class name ++ */ ++ template ++ std::vector GetDerivedClassNameByBaseClass(); ++ ++ private: ++ apollo::cyber::class_loader::ClassLoaderManager class_loader_manager_; ++ std::map> ++ plugin_description_map_; ++ std::map plugin_loaded_map_; ++ std::map, std::string> ++ plugin_class_plugin_name_map_; ++ ++ static PluginManager* instance_; ++}; ++ ++template ++std::shared_ptr PluginManager::CreateInstance( ++ const std::string& derived_class) { ++ AINFO << "creating plugin instance of " << derived_class; ++ if (!CheckAndLoadPluginLibrary(derived_class)) { ++ AERROR << "plugin of class " << derived_class << " have not been loaded"; ++ return nullptr; ++ } ++ return class_loader_manager_.CreateClassObj(derived_class); ++} ++ ++template ++std::string PluginManager::GetPluginClassHomePath( ++ const std::string& class_name) { ++ if (!CheckAndLoadPluginLibrary(class_name)) { ++ AERROR << "plugin of class " << class_name << " have not been loaded"; ++ return ""; ++ } ++ std::string library_path = ++ class_loader_manager_.GetClassValidLibrary(class_name); ++ if (library_path == "") { ++ AWARN << "plugin of class " << class_name << " not found"; ++ return ""; ++ } ++ for (auto it = plugin_description_map_.begin(); ++ it != plugin_description_map_.end(); ++it) { ++ if (it->second->actual_library_path_ == library_path) { ++ // TODO(liangjinping): remove hard code of relative prefix ++ std::string relative_prefix = "share/"; ++ std::string relative_plugin_home_path = ++ apollo::cyber::common::GetDirName(it->second->description_path_); ++ if (relative_plugin_home_path.rfind(relative_prefix, 0) == 0) { ++ relative_plugin_home_path = ++ relative_plugin_home_path.substr(relative_prefix.size()); ++ } ++ return relative_plugin_home_path; ++ } ++ } ++ // not found ++ return ""; ++} ++ ++template ++std::string PluginManager::GetPluginConfPath(const std::string& class_name, ++ const std::string& conf_name) { ++ std::string plugin_home_path = GetPluginClassHomePath(class_name); ++ if (apollo::cyber::common::PathIsAbsolute(plugin_home_path)) { ++ // can not detect the plugin relative path ++ AWARN << "plugin of class " << class_name << " load from absolute path, " ++ << "conf path will be relative to it's description file"; ++ } ++ ++ std::string relative_conf_path = plugin_home_path + "/" + conf_name; ++ std::string actual_conf_path; ++ if (apollo::cyber::common::GetFilePathWithEnv( ++ relative_conf_path, "APOLLO_CONF_PATH", &actual_conf_path)) { ++ return actual_conf_path; ++ } ++ return plugin_home_path + "/" + conf_name; ++} ++ ++template ++bool PluginManager::IsLibraryLoaded(const std::string& class_name) { ++ int status = 0; ++ std::string base_class_name = ++ abi::__cxa_demangle(typeid(Base).name(), 0, 0, &status); ++ if (plugin_class_plugin_name_map_.find({class_name, base_class_name}) == ++ plugin_class_plugin_name_map_.end()) { ++ // not found ++ return false; ++ } ++ std::string plugin_name = ++ plugin_class_plugin_name_map_[{class_name, base_class_name}]; ++ if (plugin_loaded_map_.find(plugin_name) == plugin_loaded_map_.end()) { ++ // not found ++ return false; ++ } ++ ++ return plugin_loaded_map_[plugin_name]; ++} ++ ++template ++bool PluginManager::CheckAndLoadPluginLibrary(const std::string& class_name) { ++ if (IsLibraryLoaded(class_name)) { ++ return true; ++ } ++ int status = 0; ++ std::string base_class_name = ++ abi::__cxa_demangle(typeid(Base).name(), 0, 0, &status); ++ if (plugin_class_plugin_name_map_.find({class_name, base_class_name}) == ++ plugin_class_plugin_name_map_.end()) { ++ // not found ++ AWARN << "plugin of class " << class_name << " not found, " ++ << "please check if it's registered"; ++ return false; ++ } ++ std::string plugin_name = ++ plugin_class_plugin_name_map_[{class_name, base_class_name}]; ++ if (plugin_description_map_.find(plugin_name) == ++ plugin_description_map_.end()) { ++ // not found ++ AWARN << "plugin description of class " << class_name << " not found, " ++ << "please check if it's loaded"; ++ return false; ++ } ++ auto plugin_description = plugin_description_map_[plugin_name]; ++ return LoadLibrary(plugin_description->actual_library_path_); ++} ++ ++template ++std::vector PluginManager::GetDerivedClassNameByBaseClass() { ++ int status = 0; ++ std::string base_class_name = ++ abi::__cxa_demangle(typeid(Base).name(), 0, 0, &status); ++ std::vector derived_class_name; ++ for (const auto& iter : plugin_class_plugin_name_map_) { ++ if (iter.first.second == base_class_name) { ++ derived_class_name.push_back(iter.first.first); ++ } ++ } ++ return derived_class_name; ++} ++ ++#define CYBER_PLUGIN_MANAGER_REGISTER_PLUGIN(name, base) \ ++ CLASS_LOADER_REGISTER_CLASS(name, base) ++ ++} // namespace plugin_manager ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/profiler/BUILD /opt/apollo/cyber/profiler/BUILD +--- cyber/profiler/BUILD 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/BUILD 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,37 @@ ++load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") ++ ++package(default_visibility = ["//visibility:public"]) ++ ++apollo_cc_library( ++ name = "cyber_profiler", ++ hdrs = [ ++ "profiler.h", ++ "block_manager.h", ++ "block.h", ++ "frame.h", ++ ], ++ srcs = [ ++ "block_manager.cc", ++ "block.cc", ++ "frame.cc", ++ ], ++ deps = [ ++ "//cyber/common:cyber_common", ++ "//cyber/croutine:cyber_croutine", ++ ], ++) ++ ++apollo_cc_test( ++ name = "profiler_test", ++ size = "small", ++ srcs = ["profiler_test.cc"], ++ deps = [ ++ ":cyber_profiler", ++ "@com_google_googletest//:gtest_main", ++ ], ++ linkstatic = True, ++) ++ ++apollo_package() ++cpplint() +diff --color -Naur cyber/profiler/block.cc /opt/apollo/cyber/profiler/block.cc +--- cyber/profiler/block.cc 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/block.cc 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,60 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#include "cyber/profiler/block.h" ++ ++#include "cyber/profiler/block_manager.h" ++ ++namespace apollo { ++namespace cyber { ++namespace profiler { ++ ++Block::Block() : depth_(0), begin_time_(), end_time_() {} ++ ++Block::Block(const std::string& name) ++ : name_(name), depth_(0), begin_time_(), end_time_() {} ++ ++Block::~Block() { ++ if (!finished()) ++ BlockManager::Instance()->EndBlock(); ++} ++ ++void Block::Start() { ++ begin_time_ = std::chrono::steady_clock::now(); ++} ++ ++void Block::End() { ++ end_time_ = std::chrono::steady_clock::now(); ++} ++ ++std::uint64_t Block::begin_time_since_epoch() const { ++ return std::chrono::duration_cast( ++ begin_time_.time_since_epoch()).count(); ++} ++ ++std::uint64_t Block::end_time_since_epoch() const { ++ return std::chrono::duration_cast( ++ end_time_.time_since_epoch()).count(); ++} ++ ++std::uint64_t Block::duration() const { ++ return std::chrono::duration_cast( ++ end_time_ - begin_time_).count(); ++} ++ ++} // namespace profiler ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/profiler/block.h /opt/apollo/cyber/profiler/block.h +--- cyber/profiler/block.h 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/block.h 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,63 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#ifndef CYBER_PROFILER_BLOCK_H_ ++#define CYBER_PROFILER_BLOCK_H_ ++ ++#include ++#include ++ ++namespace apollo { ++namespace cyber { ++namespace profiler { ++ ++class Block { ++ public: ++ using time_point = std::chrono::time_point; ++ ++ public: ++ Block(); ++ explicit Block(const std::string& name); ++ virtual ~Block(); ++ ++ void Start(); ++ void End(); ++ ++ const std::string& name() const { return name_; } ++ std::uint32_t depth() const { return depth_; } ++ void set_depth(std::uint32_t depth) { depth_ = depth; } ++ ++ const time_point& begin_time() const { return begin_time_; } ++ const time_point& end_time() const { return end_time_; } ++ ++ std::uint64_t begin_time_since_epoch() const; ++ std::uint64_t end_time_since_epoch() const; ++ std::uint64_t duration() const; ++ ++ bool finished() const { return end_time_ > begin_time_; } ++ ++ private: ++ std::string name_; ++ std::uint32_t depth_; ++ time_point begin_time_; ++ time_point end_time_; ++}; ++ ++} // namespace profiler ++} // namespace cyber ++} // namespace apollo ++ ++#endif // CYBER_PROFILER_BLOCK_H_ +diff --color -Naur cyber/profiler/block_manager.cc /opt/apollo/cyber/profiler/block_manager.cc +--- cyber/profiler/block_manager.cc 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/block_manager.cc 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,70 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#include "cyber/profiler/block_manager.h" ++ ++#include "cyber/croutine/croutine.h" ++ ++namespace apollo { ++namespace cyber { ++namespace profiler { ++ ++thread_local std::unordered_map ++ BlockManager::routine_frame_map_{}; ++ ++BlockManager::BlockManager() {} ++ ++void BlockManager::StartBlock(Block* block) { ++ Frame* frame_ptr = GetRoutineFrame(); ++ if (frame_ptr == nullptr || block == nullptr) ++ return; ++ frame_ptr->Push(block); ++ block->set_depth(frame_ptr->size()); ++ block->Start(); ++} ++ ++void BlockManager::EndBlock() { ++ Frame* frame_ptr = GetRoutineFrame(); ++ if (frame_ptr == nullptr || frame_ptr->finished()) ++ return; ++ ++ Block* block = frame_ptr->Top(); ++ block->End(); ++ frame_ptr->Pop(); ++ ++ if (frame_ptr->finished()) { ++ const std::string& routine_name = GetRoutineName(); ++ frame_ptr->DumpToFile(routine_name); ++ frame_ptr->Clear(); ++ } ++} ++ ++std::string BlockManager::GetRoutineName() { ++ std::string routine_name("default_croutine"); ++ if (croutine::CRoutine::GetCurrentRoutine() != nullptr) { ++ routine_name = croutine::CRoutine::GetCurrentRoutine()->name(); ++ } ++ return routine_name; ++} ++ ++Frame* BlockManager::GetRoutineFrame() { ++ const std::string& routine_name = GetRoutineName(); ++ return &routine_frame_map_[routine_name]; ++} ++ ++} // namespace profiler ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/profiler/block_manager.h /opt/apollo/cyber/profiler/block_manager.h +--- cyber/profiler/block_manager.h 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/block_manager.h 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,55 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#ifndef CYBER_PROFILER_BLOCK_MANAGER_H_ ++#define CYBER_PROFILER_BLOCK_MANAGER_H_ ++ ++#include ++#include ++ ++#include "cyber/common/macros.h" ++#include "cyber/profiler/block.h" ++#include "cyber/profiler/frame.h" ++ ++namespace apollo { ++namespace cyber { ++namespace profiler { ++ ++class BlockManager { ++ public: ++ using RoutineName = std::string; ++ using RoutineFrameMap = std::unordered_map; ++ ++ public: ++ void StartBlock(Block* block); ++ ++ void EndBlock(); ++ ++ private: ++ std::string GetRoutineName(); ++ Frame* GetRoutineFrame(); ++ ++ private: ++ static thread_local RoutineFrameMap routine_frame_map_; ++ ++ DECLARE_SINGLETON(BlockManager) ++}; ++ ++} // namespace profiler ++} // namespace cyber ++} // namespace apollo ++ ++#endif // CYBER_PROFILER_BLOCK_MANAGER_H_ +diff --color -Naur cyber/profiler/frame.cc /opt/apollo/cyber/profiler/frame.cc +--- cyber/profiler/frame.cc 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/frame.cc 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,67 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#include "cyber/profiler/frame.h" ++ ++#include ++ ++#include "cyber/common/log.h" ++ ++namespace apollo { ++namespace cyber { ++namespace profiler { ++ ++constexpr char kModuleName[] = "perf"; ++ ++void Frame::Push(Block* block) { ++ if (block != nullptr) ++ stack_.push(block); ++} ++ ++Block* Frame::Top() { ++ if (stack_.empty()) ++ return nullptr; ++ return stack_.top(); ++} ++ ++void Frame::Pop() { ++ if (stack_.empty()) ++ return; ++ ++ Block* block_ptr = stack_.top(); ++ stack_.pop(); ++ storage_.push_back(std::move(*block_ptr)); ++} ++ ++bool Frame::DumpToFile(const std::string& routine_name) { ++ // Use 'ALOG_MODULE' instead of 'AINFO' to specify the log file ++ ALOG_MODULE(kModuleName, INFO) << "Frame : " << routine_name; ++ for (const Block& block : storage_) { ++ ALOG_MODULE(kModuleName, INFO) ++ << block.depth() << "," << block.name() << "," << block.duration() ++ << "," << block.begin_time_since_epoch() ++ << "," << block.end_time_since_epoch(); ++ } ++ return true; ++} ++ ++void Frame::Clear() { ++ storage_.clear(); ++} ++ ++} // namespace profiler ++} // namespace cyber ++} // namespace apollo +diff --color -Naur cyber/profiler/frame.h /opt/apollo/cyber/profiler/frame.h +--- cyber/profiler/frame.h 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/frame.h 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,51 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#ifndef CYBER_PROFILER_FRAME_H_ ++#define CYBER_PROFILER_FRAME_H_ ++ ++#include ++#include ++#include ++ ++#include "cyber/profiler/block.h" ++ ++namespace apollo { ++namespace cyber { ++namespace profiler { ++ ++class Frame { ++ public: ++ void Push(Block* block); ++ Block* Top(); ++ void Pop(); ++ ++ bool DumpToFile(const std::string& coroutine_name); ++ void Clear(); ++ ++ std::uint32_t size() const { return stack_.size(); } ++ bool finished() const { return stack_.empty(); } ++ ++ private: ++ std::stack stack_; ++ std::list storage_; ++}; ++ ++} // namespace profiler ++} // namespace cyber ++} // namespace apollo ++ ++#endif // CYBER_PROFILER_FRAME_H_ +diff --color -Naur cyber/profiler/profiler.h /opt/apollo/cyber/profiler/profiler.h +--- cyber/profiler/profiler.h 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/profiler.h 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,62 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#ifndef CYBER_PROFILER_PROFILER_H_ ++#define CYBER_PROFILER_PROFILER_H_ ++ ++#include "cyber/profiler/block.h" ++#include "cyber/profiler/block_manager.h" ++ ++namespace apollo { ++namespace cyber { ++namespace profiler { ++ ++#if ENABLE_PROFILER ++ ++#if defined(__GNUC__) || defined(__GNUG__) ++#define AFUNC __PRETTY_FUNCTION__ ++#elif defined(__clang__) ++#define AFUNC __PRETTY_FUNCTION__ ++#else ++#define AFUNC __func__ ++#endif ++ ++#define TOKEN_JOIN(x, y) x ## y ++#define UNIQUE_NAME(x) TOKEN_JOIN(prefix_perf, x) ++ ++#define PERF_BLOCK(name, ...) \ ++ apollo::cyber::profiler::Block UNIQUE_NAME(__LINE__)(name); \ ++ apollo::cyber::profiler::BlockManager::Instance()->StartBlock( \ ++ &UNIQUE_NAME(__LINE__)); ++ ++#define PERF_BLOCK_END \ ++ apollo::cyber::profiler::BlockManager::Instance()->EndBlock(); ++ ++#define PERF_FUNCTION(...) PERF_BLOCK(AFUNC, ## __VA_ARGS__) ++ ++#else ++ ++#define PERF_BLOCK(...) ++#define PERF_BLOCK_END ++#define PERF_FUNCTION(...) ++ ++#endif // #if ENABLE_PROFILER ++ ++} // namespace profiler ++} // namespace cyber ++} // namespace apollo ++ ++#endif // CYBER_PROFILER_PROFILER_H_ +diff --color -Naur cyber/profiler/profiler_test.cc /opt/apollo/cyber/profiler/profiler_test.cc +--- cyber/profiler/profiler_test.cc 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/profiler/profiler_test.cc 2023-12-23 18:05:58.578028978 +0800 +@@ -0,0 +1,62 @@ ++/****************************************************************************** ++ * Copyright 2023 The Apollo Authors. All Rights Reserved. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ *****************************************************************************/ ++ ++#include "gtest/gtest.h" ++ ++#include "cyber/profiler/profiler.h" ++ ++TEST(ProfilerTest, single_block) { ++ PERF_BLOCK("block") ++ for (int i = 0; i < 1000; ++i) { ++ } ++ PERF_BLOCK_END ++} ++ ++TEST(ProfilerTest, multi_block) { ++ PERF_BLOCK("block1") ++ for (int i = 0; i < 500; ++i) { ++ } ++ PERF_BLOCK_END ++ ++ for (int i = 0; i < 500; ++i) { ++ } ++ ++ PERF_BLOCK("block2") ++ for (int i = 0; i < 500; ++i) { ++ } ++ PERF_BLOCK_END ++} ++ ++TEST(ProfilerTest, nested_block) { ++ PERF_BLOCK("outer_block") ++ for (int i = 0; i < 500; ++i) { ++ } ++ ++ PERF_BLOCK("inner_block") ++ for (int i = 0; i < 500; ++i) { ++ } ++ PERF_BLOCK_END ++ ++ for (int i = 0; i < 500; ++i) { ++ } ++ PERF_BLOCK_END ++} ++ ++TEST(ProfilerTest, function) { ++ PERF_FUNCTION() ++ for (int i = 0; i < 1000; ++i) { ++ } ++} +diff --color -Naur cyber/proto/.gitignore /opt/apollo/cyber/proto/.gitignore +--- cyber/proto/.gitignore 2023-12-23 18:23:13.087910841 +0800 ++++ /opt/apollo/cyber/proto/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,3 +0,0 @@ +-*.pb.cc +-*.pb.h +-*.py +diff --color -Naur cyber/proto/BUILD /opt/apollo/cyber/proto/BUILD +--- cyber/proto/BUILD 2023-12-23 18:23:13.087910841 +0800 ++++ /opt/apollo/cyber/proto/BUILD 2023-12-23 18:05:58.578028978 +0800 +@@ -1,101 +1,9 @@ + ## Auto generated by `proto_build_generator.py` +-load("@rules_proto//proto:defs.bzl", "proto_library") +-load("@rules_cc//cc:defs.bzl", "cc_proto_library") +-load("//tools:python_rules.bzl", "py_proto_library") +-load("//tools:cc_so_proto_rules.bzl", "cc_so_proto_library") +-load("//tools/install:install.bzl", "install", "install_files") ++load("//tools/proto:proto.bzl", "proto_library") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "runtime_files", +- srcs = ["py_pb2.BUILD"] +-) +- +-install_files( +- name = "cyber_proto_hdrs", +- dest = "cyber/include/proto", +- files = [ +- ":topology_change_cc_proto_hdrs", +- ":dag_conf_cc_proto_hdrs", +- ":proto_desc_cc_proto_hdrs", +- ":choreography_conf_cc_proto_hdrs", +- ":component_conf_cc_proto_hdrs", +- ":cyber_conf_cc_proto_hdrs", +- ":perf_conf_cc_proto_hdrs", +- ":classic_conf_cc_proto_hdrs", +- ":parameter_cc_proto_hdrs", +- ":unit_test_cc_proto_hdrs", +- ":simple_cc_proto_hdrs", +- ":scheduler_conf_cc_proto_hdrs", +- ":transport_conf_cc_proto_hdrs", +- ":qos_profile_cc_proto_hdrs", +- ":record_cc_proto_hdrs", +- ":run_mode_conf_cc_proto_hdrs", +- ":role_attributes_cc_proto_hdrs", +- ":clock_cc_proto_hdrs", +- ], +-) +-install( +- name = "cyber_proto_so", +- library_dest = "cyber/lib", +- targets = [ +- ":libtopology_change_cc_proto.so", +- ":libdag_conf_cc_proto.so", +- ":libproto_desc_cc_proto.so", +- ":libchoreography_conf_cc_proto.so", +- ":libcomponent_conf_cc_proto.so", +- ":libcyber_conf_cc_proto.so", +- ":libperf_conf_cc_proto.so", +- ":libclassic_conf_cc_proto.so", +- ":libparameter_cc_proto.so", +- ":libunit_test_cc_proto.so", +- ":libsimple_cc_proto.so", +- ":libscheduler_conf_cc_proto.so", +- ":libtransport_conf_cc_proto.so", +- ":libqos_profile_cc_proto.so", +- ":librecord_cc_proto.so", +- ":librun_mode_conf_cc_proto.so", +- ":librole_attributes_cc_proto.so", +- ":libclock_cc_proto.so", +- ], +-) +- +-install_files( +- name = "pb_cyber", +- dest = "cyber/python/cyber/proto", +- files = [ +- ":record_py_pb2", +- ":topology_change_py_pb2", +- ":dag_conf_py_pb2", +- ":proto_desc_py_pb2", +- ":choreography_conf_py_pb2", +- ":component_conf_py_pb2", +- ":cyber_conf_py_pb2", +- ":perf_conf_py_pb2", +- ":classic_conf_py_pb2", +- ":parameter_py_pb2", +- ":unit_test_py_pb2", +- ":simple_py_pb2", +- ":scheduler_conf_py_pb2", +- ":transport_conf_py_pb2", +- ":qos_profile_py_pb2", +- ":run_mode_conf_py_pb2", +- ":role_attributes_py_pb2", +- ":clock_py_pb2", +- ], +-) +- +-cc_so_proto_library( +- name = "topology_change_cc_proto", +- srcs = [ +- ":topology_change_proto", +- ], +- deps = [ +- ":role_attributes_cc_proto", +- ], +-) +- + proto_library( + name = "topology_change_proto", + srcs = ["topology_change.proto"], +@@ -104,24 +12,6 @@ + ], + ) + +-py_proto_library( +- name = "topology_change_py_pb2", +- deps = [ +- ":topology_change_proto", +- ":role_attributes_py_pb2", +- ], +-) +- +-cc_so_proto_library( +- name = "dag_conf_cc_proto", +- srcs = [ +- ":dag_conf_proto", +- ], +- deps = [ +- ":component_conf_cc_proto" +- ], +-) +- + proto_library( + name = "dag_conf_proto", + srcs = ["dag_conf.proto"], +@@ -130,78 +20,21 @@ + ], + ) + +-py_proto_library( +- name = "dag_conf_py_pb2", +- deps = [ +- ":dag_conf_proto", +- ":component_conf_py_pb2", +- ], +-) +- +-cc_so_proto_library( +- name = "proto_desc_cc_proto", +- srcs = [ +- ":proto_desc_proto", +- ], +-) +- + proto_library( + name = "proto_desc_proto", + srcs = ["proto_desc.proto"], + ) + +-py_proto_library( +- name = "proto_desc_py_pb2", +- deps = [ +- ":proto_desc_proto", +- ], +-) +-cc_so_proto_library( +- name = "choreography_conf_cc_proto", +- srcs = [ +- ":choreography_conf_proto", +- ], +-) +- + proto_library( + name = "choreography_conf_proto", + srcs = ["choreography_conf.proto"], + ) + +-py_proto_library( +- name = "choreography_conf_py_pb2", +- deps = [ +- ":choreography_conf_proto", +- ], +-) +-cc_so_proto_library( +- name = "record_cc_proto", +- srcs = [ +- ":record_proto", +- ], +-) +- + proto_library( + name = "record_proto", + srcs = ["record.proto"], + ) + +-py_proto_library( +- name = "record_py_pb2", +- deps = [ +- ":record_proto", +- ], +-) +-cc_so_proto_library( +- name = "component_conf_cc_proto", +- srcs = [ +- ":component_conf_proto", +- ], +- deps = [ +- ":qos_profile_cc_proto" +- ], +-) +- + proto_library( + name = "component_conf_proto", + srcs = ["component_conf.proto"], +@@ -210,27 +43,6 @@ + ], + ) + +-py_proto_library( +- name = "component_conf_py_pb2", +- deps = [ +- ":component_conf_proto", +- ":qos_profile_py_pb2", +- ], +-) +- +-cc_so_proto_library( +- name = "cyber_conf_cc_proto", +- srcs = [ +- ":cyber_conf_proto", +- ], +- deps = [ +- ":scheduler_conf_cc_proto", +- ":transport_conf_cc_proto", +- ":run_mode_conf_cc_proto", +- ":perf_conf_cc_proto", +- ], +-) +- + proto_library( + name = "cyber_conf_proto", + srcs = ["cyber_conf.proto"], +@@ -242,128 +54,24 @@ + ], + ) + +-py_proto_library( +- name = "cyber_conf_py_pb2", +- deps = [ +- ":cyber_conf_proto", +- ":scheduler_conf_py_pb2", +- ":transport_conf_py_pb2", +- ":run_mode_conf_py_pb2", +- ":perf_conf_py_pb2", +- ], +-) +- +-cc_so_proto_library( +- name = "perf_conf_cc_proto", +- srcs = [ +- ":perf_conf_proto", +- ], +-) +- + proto_library( + name = "perf_conf_proto", + srcs = ["perf_conf.proto"], + ) + +-py_proto_library( +- name = "perf_conf_py_pb2", +- deps = [ +- ":perf_conf_proto", +- ], +-) +-cc_so_proto_library( +- name = "classic_conf_cc_proto", +- srcs = [ +- ":classic_conf_proto", +- ], +-) +- + proto_library( + name = "classic_conf_proto", + srcs = ["classic_conf.proto"], + ) + +-py_proto_library( +- name = "classic_conf_py_pb2", +- deps = [ +- ":classic_conf_proto", +- ], +-) +-cc_so_proto_library( +- name = "parameter_cc_proto", +- srcs = [ +- ":parameter_proto", +- ], +-) +- + proto_library( + name = "parameter_proto", + srcs = ["parameter.proto"], + ) + +-py_proto_library( +- name = "parameter_py_pb2", +- deps = [ +- ":parameter_proto", +- ], +-) +-cc_so_proto_library( +- name = "unit_test_cc_proto", +- srcs = [ +- ":unit_test_proto", +- ], +- deps = ["//modules/common_msgs/basic_msgs:header_cc_proto"] +-) +- + proto_library( + name = "unit_test_proto", + srcs = ["unit_test.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:header_proto" +- ] +-) +- +-py_proto_library( +- name = "unit_test_py_pb2", +- deps = [ +- ":unit_test_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2" +- ], +-) +- +-cc_so_proto_library( +- name = "simple_cc_proto", +- srcs = [ +- ":simple_proto", +- ], +- deps = ["//modules/common_msgs/basic_msgs:header_cc_proto"] +-) +- +-proto_library( +- name = "simple_proto", +- srcs = ["simple.proto"], +- deps = [ +- "//modules/common_msgs/basic_msgs:header_proto" +- ] +-) +- +-py_proto_library( +- name = "simple_py_pb2", +- deps = [ +- ":simple_proto", +- "//modules/common_msgs/basic_msgs:header_py_pb2" +- ], +-) +- +-cc_so_proto_library( +- name = "scheduler_conf_cc_proto", +- srcs = [ +- ":scheduler_conf_proto", +- ], +- deps = [ +- ":classic_conf_cc_proto", +- ":choreography_conf_cc_proto", +- ], + ) + + proto_library( +@@ -375,79 +83,21 @@ + ], + ) + +-py_proto_library( +- name = "scheduler_conf_py_pb2", +- deps = [ +- ":scheduler_conf_proto", +- ":classic_conf_py_pb2", +- ":choreography_conf_py_pb2", +- ], +-) +- +-cc_so_proto_library( +- name = "transport_conf_cc_proto", +- srcs = [ +- ":transport_conf_proto", +- ], +-) +- + proto_library( + name = "transport_conf_proto", + srcs = ["transport_conf.proto"], + ) + +-py_proto_library( +- name = "transport_conf_py_pb2", +- deps = [ +- ":transport_conf_proto", +- ], +-) +-cc_so_proto_library( +- name = "qos_profile_cc_proto", +- srcs = [ +- ":qos_profile_proto", +- ], +-) +- + proto_library( + name = "qos_profile_proto", + srcs = ["qos_profile.proto"], + ) + +-py_proto_library( +- name = "qos_profile_py_pb2", +- deps = [ +- ":qos_profile_proto", +- ], +-) +-cc_so_proto_library( +- name = "run_mode_conf_cc_proto", +- srcs = [ +- ":run_mode_conf_proto", +- ], +-) +- + proto_library( + name = "run_mode_conf_proto", + srcs = ["run_mode_conf.proto"], + ) + +-py_proto_library( +- name = "run_mode_conf_py_pb2", +- deps = [ +- ":run_mode_conf_proto", +- ], +-) +-cc_so_proto_library( +- name = "role_attributes_cc_proto", +- srcs = [ +- ":role_attributes_proto", +- ], +- deps = [ +- ":qos_profile_cc_proto", +- ], +-) +- + proto_library( + name = "role_attributes_proto", + srcs = ["role_attributes.proto"], +@@ -456,30 +106,9 @@ + ], + ) + +-py_proto_library( +- name = "role_attributes_py_pb2", +- deps = [ +- ":role_attributes_proto", +- ":qos_profile_py_pb2", +- ], +-) +- +-cc_so_proto_library( +- name = "clock_cc_proto", +- srcs = [ +- ":clock_proto", +- ], +-) +- + proto_library( + name = "clock_proto", + srcs = ["clock.proto"], + ) + +-py_proto_library( +- name = "clock_py_pb2", +- deps = [ +- ":clock_proto", +- ], +-) +- ++apollo_package() +diff --color -Naur cyber/proto/record.proto /opt/apollo/cyber/proto/record.proto +--- cyber/proto/record.proto 2023-12-23 18:23:13.087910841 +0800 ++++ /opt/apollo/cyber/proto/record.proto 2023-12-23 18:05:58.579028978 +0800 +@@ -50,6 +50,15 @@ + optional bytes content = 3; + } + ++message MapInfo { ++ optional string name = 1; ++ optional string version = 2; ++} ++ ++message VehicleInfo { ++ optional string name = 1; ++} ++ + message Header { + optional uint32 major_version = 1; + optional uint32 minor_version = 2; +@@ -66,6 +75,8 @@ + optional bool is_complete = 13 [default = false]; + optional uint64 chunk_raw_size = 14; + optional uint64 segment_raw_size = 15; ++ optional MapInfo map_info = 16; ++ optional VehicleInfo vehicle_info = 17; + } + + message Channel { +@@ -88,3 +99,10 @@ + message Index { + repeated SingleIndex indexes = 1; + } ++ ++message RecordInfo { ++ optional string record_name = 1 [default = ""]; ++ optional double total_time_s = 2; ++ optional double curr_time_s = 3 [default = 0]; ++ optional double progress = 4 [default = 0]; ++} +diff --color -Naur cyber/proto/simple.proto /opt/apollo/cyber/proto/simple.proto +--- cyber/proto/simple.proto 2023-12-23 18:23:13.087910841 +0800 ++++ /opt/apollo/cyber/proto/simple.proto 1970-01-01 08:00:00.000000000 +0800 +@@ -1,15 +0,0 @@ +-syntax = "proto2"; +- +-import "modules/common_msgs/basic_msgs/header.proto"; +- +-package apollo.cyber.proto; +- +-message SimpleMessage { +- optional int32 integer = 1; +- optional string text = 2; +- optional apollo.common.Header header = 3; +-} +- +-message SimpleRepeatedMessage { +- repeated SimpleMessage message = 1; +-} +diff --color -Naur cyber/python/BUILD /opt/apollo/cyber/python/BUILD +--- cyber/python/BUILD 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/BUILD 2023-12-23 18:05:58.579028978 +0800 +@@ -1,3 +1,7 @@ ++load("//tools:apollo_package.bzl", "apollo_package") ++ + package( + default_visibility = ["//visibility:public"], + ) ++ ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/python/README.md /opt/apollo/cyber/python/README.md +--- cyber/python/README.md 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/README.md 2023-12-23 18:05:58.579028978 +0800 +@@ -46,7 +46,7 @@ + ``` + + **Note**: Like C++, Python code is also managed by Bazel starting from Apollo 6.0. +-Please refer to [How to Build and Run Python Apps in Apollo](../../docs/howto/how_to_build_and_run_python_app.md) for more on that. ++Please refer to [How to Build and Run Python Apps in Apollo](https://github.com/ApolloAuto/apollo/blob/r6.0.0/docs/howto/how_to_build_and_run_python_app.md) for more on that. + + ## Step 3: Build and run the demo program + +diff --color -Naur cyber/python/cyber_py3/BUILD /opt/apollo/cyber/python/cyber_py3/BUILD +--- cyber/python/cyber_py3/BUILD 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/BUILD 2023-12-23 18:05:58.579028978 +0800 +@@ -1,20 +1,21 @@ + load("@rules_python//python:defs.bzl", "py_library") +-load("//tools/install:install.bzl", "install", "install_files") ++# load("//tools/install:install.bzl", "install", "install_files") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "runtime_files", +- srcs = glob([ +- "*.py", +- ]) + ["cyber_py3.BUILD"] +-) +- +-install( +- name = "cyber_python_library", +- data = [":runtime_files"], +- data_dest = "cyber/python/cyber/python/cyber_py3" +-) ++# filegroup( ++# name = "runtime_files", ++# srcs = glob([ ++# "*.py", ++# ]) ++# ) ++ ++# install( ++# name = "cyber_python_library", ++# data = [":runtime_files"], ++# data_dest = "cyber/python/cyber/python/cyber_py3" ++# ) + + py_library( + name = "cyber_time", +@@ -56,3 +57,5 @@ + "//cyber/python/internal:_cyber_record_wrapper.so", + ], + ) ++ ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/python/cyber_py3/cyber.py /opt/apollo/cyber/python/cyber_py3/cyber.py +--- cyber/python/cyber_py3/cyber.py 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/cyber.py 2023-12-23 18:05:58.579028978 +0800 +@@ -32,9 +32,14 @@ + PY_CALLBACK_TYPE_T = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p) + + # init vars +-wrapper_lib_path = os.path.abspath(os.path.join(os.path.dirname(__file__), +- '../internal')) +-sys.path.append(wrapper_lib_path) ++APOLLO_DISTRIBUTION_HOME = os.environ.get( ++ 'APOLLO_DISTRIBUTION_HOME', '/opt/apollo/neo') ++ ++if APOLLO_DISTRIBUTION_HOME.startswith('/opt/apollo/neo'): ++ wrapper_lib_path = os.path.join( ++ APOLLO_DISTRIBUTION_HOME, "lib", "cyber/python/internal") ++ ++ sys.path.append(wrapper_lib_path) + + _CYBER = importlib.import_module('_cyber_wrapper') + +diff --color -Naur cyber/python/cyber_py3/cyber_time.py /opt/apollo/cyber/python/cyber_py3/cyber_time.py +--- cyber/python/cyber_py3/cyber_time.py 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/cyber_time.py 2023-12-23 18:05:58.579028978 +0800 +@@ -22,11 +22,14 @@ + import os + import sys + ++APOLLO_DISTRIBUTION_HOME = os.environ.get( ++ 'APOLLO_DISTRIBUTION_HOME', '/opt/apollo/neo') + +-# init vars +-wrapper_lib_path = os.path.abspath(os.path.join(os.path.dirname(__file__), +- '../internal')) +-sys.path.append(wrapper_lib_path) ++if APOLLO_DISTRIBUTION_HOME.startswith('/opt/apollo/neo'): ++ wrapper_lib_path = os.path.join( ++ APOLLO_DISTRIBUTION_HOME, "lib", "cyber/python/internal") ++ ++ sys.path.append(wrapper_lib_path) + + _CYBER = importlib.import_module('_cyber_wrapper') + _CYBER_TIME = importlib.import_module('_cyber_time_wrapper') +diff --color -Naur cyber/python/cyber_py3/cyber_timer.py /opt/apollo/cyber/python/cyber_py3/cyber_timer.py +--- cyber/python/cyber_py3/cyber_timer.py 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/cyber_timer.py 2023-12-23 18:05:58.579028978 +0800 +@@ -26,10 +26,15 @@ + + PY_TIMER_CB_TYPE = ctypes.CFUNCTYPE(ctypes.c_void_p) + ++APOLLO_DISTRIBUTION_HOME = os.environ.get( ++ 'APOLLO_DISTRIBUTION_HOME', '/opt/apollo/neo') ++ + # init vars +-wrapper_lib_path = os.path.abspath(os.path.join(os.path.dirname(__file__), +- '../internal')) +-sys.path.append(wrapper_lib_path) ++if APOLLO_DISTRIBUTION_HOME.startswith('/opt/apollo/neo'): ++ wrapper_lib_path = os.path.join( ++ APOLLO_DISTRIBUTION_HOME, "lib", "cyber/python/internal") ++ ++ sys.path.append(wrapper_lib_path) + + _CYBER_TIMER = importlib.import_module('_cyber_timer_wrapper') + +diff --color -Naur cyber/python/cyber_py3/examples/BUILD /opt/apollo/cyber/python/cyber_py3/examples/BUILD +--- cyber/python/cyber_py3/examples/BUILD 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/BUILD 2023-12-23 18:05:58.579028978 +0800 +@@ -1,30 +1,31 @@ + load("@rules_python//python:defs.bzl", "py_binary") ++load("//tools:apollo_package.bzl", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-py_binary( +- name = "record", +- srcs = ["record.py"], +- deps = [ +- "//cyber/proto:unit_test_py_pb2", +- "//cyber/python/cyber_py3:record", +- "//modules/common_msgs/basic_msgs:error_code_py_pb2", +- "//modules/common_msgs/basic_msgs:header_py_pb2", +- "//modules/common/util/testdata:simple_py_pb2", +- ], +-) ++# py_binary( ++# name = "py_record", ++# srcs = ["py_record.py"], ++# deps = [ ++# "//cyber/proto:unit_test_py_pb2", ++# "//cyber/python/cyber_py3:record", ++# "//modules/common_msgs/basic_msgs:error_code_py_pb2", ++# "//modules/common_msgs/basic_msgs:header_py_pb2", ++# "//modules/common/util/testdata:simple_py_pb2", ++# ], ++# ) + + py_binary( +- name = "time", +- srcs = ["time.py"], ++ name = "py_time", ++ srcs = ["py_time.py"], + deps = [ + "//cyber/python/cyber_py3:cyber_time", + ], + ) + + py_binary( +- name = "timer", +- srcs = ["timer.py"], ++ name = "py_timer", ++ srcs = ["py_timer.py"], + deps = [ + "//cyber/python/cyber_py3:cyber", + "//cyber/python/cyber_py3:cyber_timer", +@@ -32,8 +33,8 @@ + ) + + py_binary( +- name = "talker", +- srcs = ["talker.py"], ++ name = "py_talker", ++ srcs = ["py_talker.py"], + deps = [ + "//cyber/proto:unit_test_py_pb2", + "//cyber/python/cyber_py3:cyber", +@@ -41,8 +42,8 @@ + ) + + py_binary( +- name = "listener", +- srcs = ["listener.py"], ++ name = "py_listener", ++ srcs = ["py_listener.py"], + deps = [ + "//cyber/proto:unit_test_py_pb2", + "//cyber/python/cyber_py3:cyber", +@@ -50,8 +51,8 @@ + ) + + py_binary( +- name = "parameter", +- srcs = ["parameter.py"], ++ name = "py_parameter", ++ srcs = ["py_parameter.py"], + deps = [ + "//cyber/python/cyber_py3:cyber", + "//cyber/python/cyber_py3:parameter", +@@ -59,8 +60,8 @@ + ) + + py_binary( +- name = "service", +- srcs = ["service.py"], ++ name = "py_service", ++ srcs = ["py_service.py"], + deps = [ + "//cyber/proto:unit_test_py_pb2", + "//cyber/python/cyber_py3:cyber", +@@ -68,8 +69,8 @@ + ) + + py_binary( +- name = "client", +- srcs = ["client.py"], ++ name = "py_client", ++ srcs = ["py_client.py"], + deps = [ + "//cyber/proto:unit_test_py_pb2", + "//cyber/python/cyber_py3:cyber", +@@ -77,8 +78,8 @@ + ) + + py_binary( +- name = "record_trans", +- srcs = ["record_trans.py"], ++ name = "py_record_trans", ++ srcs = ["py_record_trans.py"], + deps = [ + "//cyber/python/cyber_py3:cyber", + "//cyber/python/cyber_py3:record", +@@ -86,11 +87,13 @@ + ) + + py_binary( +- name = "record_channel_info", +- srcs = ["record_channel_info.py"], ++ name = "py_record_channel_info", ++ srcs = ["py_record_channel_info.py"], + deps = [ + "//cyber/proto:record_py_pb2", + "//cyber/python/cyber_py3:cyber", + "//cyber/python/cyber_py3:record", + ], + ) ++ ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/python/cyber_py3/examples/client.py /opt/apollo/cyber/python/cyber_py3/examples/client.py +--- cyber/python/cyber_py3/examples/client.py 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/client.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,49 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-"""Module for example of listener.""" +- +-import time +- +-from cyber.python.cyber_py3 import cyber +-from cyber.proto.unit_test_pb2 import ChatterBenchmark +- +- +-def test_client_class(): +- """ +- Client send request +- """ +- node = cyber.Node("client_node") +- client = node.create_client("server_01", ChatterBenchmark, ChatterBenchmark) +- req = ChatterBenchmark() +- req.content = "clt:Hello service!" +- req.seq = 0 +- count = 0 +- while not cyber.is_shutdown(): +- time.sleep(1) +- count += 1 +- req.seq = count +- print("-" * 80) +- response = client.send_request(req) +- print("get Response [ ", response, " ]") +- +- +-if __name__ == '__main__': +- cyber.init() +- test_client_class() +- cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/listener.py /opt/apollo/cyber/python/cyber_py3/examples/listener.py +--- cyber/python/cyber_py3/examples/listener.py 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/listener.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,48 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-"""Module for example of listener.""" +- +-from cyber.python.cyber_py3 import cyber +-from cyber.proto.unit_test_pb2 import ChatterBenchmark +- +- +-def callback(data): +- """ +- Reader message callback. +- """ +- print("=" * 80) +- print("py:reader callback msg->:") +- print(data) +- print("=" * 80) +- +- +-def test_listener_class(): +- """ +- Reader message. +- """ +- print("=" * 120) +- test_node = cyber.Node("listener") +- test_node.create_reader("channel/chatter", ChatterBenchmark, callback) +- test_node.spin() +- +- +-if __name__ == '__main__': +- cyber.init() +- test_listener_class() +- cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/parameter.py /opt/apollo/cyber/python/cyber_py3/examples/parameter.py +--- cyber/python/cyber_py3/examples/parameter.py 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/parameter.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,57 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-"""Module for example of parameter.""" +- +-from cyber.python.cyber_py3 import cyber +-from cyber.python.cyber_py3 import parameter +- +- +-PARAM_SERVICE_NAME = "global_parameter_service" +- +- +-def print_param_srv(): +- param1 = parameter.Parameter("author_name", "WanderingEarth") +- param2 = parameter.Parameter("author_age", 5000) +- param3 = parameter.Parameter("author_score", 888.88) +- +- test_node = cyber.Node(PARAM_SERVICE_NAME) +- srv = parameter.ParameterServer(test_node) +- +- node_handle = cyber.Node("service_client_node") +- clt = parameter.ParameterClient(test_node, PARAM_SERVICE_NAME) +- clt.set_parameter(param1) +- clt.set_parameter(param2) +- clt.set_parameter(param3) +- +- param_list = clt.get_paramslist() +- print("clt param lst len is ", len(param_list)) +- for param in param_list: +- print(param.debug_string()) +- +- print("") +- param_list = srv.get_paramslist() +- print("srv param lst len is ", len(param_list)) +- for param in param_list: +- print(param.debug_string()) +- +- +-if __name__ == '__main__': +- cyber.init() +- print_param_srv() +- cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/py_client.py /opt/apollo/cyber/python/cyber_py3/examples/py_client.py +--- cyber/python/cyber_py3/examples/py_client.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_client.py 2023-12-23 18:05:58.579028978 +0800 +@@ -0,0 +1,49 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++"""Module for example of listener.""" ++ ++import time ++ ++from cyber.python.cyber_py3 import cyber ++from cyber.proto.unit_test_pb2 import ChatterBenchmark ++ ++ ++def test_client_class(): ++ """ ++ Client send request ++ """ ++ node = cyber.Node("client_node") ++ client = node.create_client("server_01", ChatterBenchmark, ChatterBenchmark) ++ req = ChatterBenchmark() ++ req.content = "clt:Hello service!" ++ req.seq = 0 ++ count = 0 ++ while not cyber.is_shutdown(): ++ time.sleep(1) ++ count += 1 ++ req.seq = count ++ print("-" * 80) ++ response = client.send_request(req) ++ print("get Response [ ", response, " ]") ++ ++ ++if __name__ == '__main__': ++ cyber.init() ++ test_client_class() ++ cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/py_listener.py /opt/apollo/cyber/python/cyber_py3/examples/py_listener.py +--- cyber/python/cyber_py3/examples/py_listener.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_listener.py 2023-12-23 18:05:58.579028978 +0800 +@@ -0,0 +1,48 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++"""Module for example of listener.""" ++ ++from cyber.python.cyber_py3 import cyber ++from cyber.proto.unit_test_pb2 import ChatterBenchmark ++ ++ ++def callback(data): ++ """ ++ Reader message callback. ++ """ ++ print("=" * 80) ++ print("py:reader callback msg->:") ++ print(data) ++ print("=" * 80) ++ ++ ++def test_listener_class(): ++ """ ++ Reader message. ++ """ ++ print("=" * 120) ++ test_node = cyber.Node("listener") ++ test_node.create_reader("channel/chatter", ChatterBenchmark, callback) ++ test_node.spin() ++ ++ ++if __name__ == '__main__': ++ cyber.init() ++ test_listener_class() ++ cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/py_parameter.py /opt/apollo/cyber/python/cyber_py3/examples/py_parameter.py +--- cyber/python/cyber_py3/examples/py_parameter.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_parameter.py 2023-12-23 18:05:58.579028978 +0800 +@@ -0,0 +1,57 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++"""Module for example of parameter.""" ++ ++from cyber.python.cyber_py3 import cyber ++from cyber.python.cyber_py3 import parameter ++ ++ ++PARAM_SERVICE_NAME = "global_parameter_service" ++ ++ ++def print_param_srv(): ++ param1 = parameter.Parameter("author_name", "WanderingEarth") ++ param2 = parameter.Parameter("author_age", 5000) ++ param3 = parameter.Parameter("author_score", 888.88) ++ ++ test_node = cyber.Node(PARAM_SERVICE_NAME) ++ srv = parameter.ParameterServer(test_node) ++ ++ node_handle = cyber.Node("service_client_node") ++ clt = parameter.ParameterClient(test_node, PARAM_SERVICE_NAME) ++ clt.set_parameter(param1) ++ clt.set_parameter(param2) ++ clt.set_parameter(param3) ++ ++ param_list = clt.get_paramslist() ++ print("clt param lst len is ", len(param_list)) ++ for param in param_list: ++ print(param.debug_string()) ++ ++ print("") ++ param_list = srv.get_paramslist() ++ print("srv param lst len is ", len(param_list)) ++ for param in param_list: ++ print(param.debug_string()) ++ ++ ++if __name__ == '__main__': ++ cyber.init() ++ print_param_srv() ++ cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/py_record.py /opt/apollo/cyber/python/cyber_py3/examples/py_record.py +--- cyber/python/cyber_py3/examples/py_record.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_record.py 2023-12-23 18:05:58.579028978 +0800 +@@ -0,0 +1,123 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++""" ++Module for example of record. ++ ++Run with: ++ bazel run //cyber/python/cyber_py3/examples:record ++""" ++ ++import time ++ ++from google.protobuf.descriptor_pb2 import FileDescriptorProto ++ ++from cyber.proto.unit_test_pb2 import Chatter ++from cyber.python.cyber_py3 import record ++from modules.common.util.testdata.simple_pb2 import SimpleMessage ++ ++ ++MSG_TYPE = "apollo.common.util.test.SimpleMessage" ++MSG_TYPE_CHATTER = "apollo.cyber.proto.Chatter" ++ ++ ++def test_record_writer(writer_path): ++ """ ++ Record writer. ++ """ ++ fwriter = record.RecordWriter() ++ fwriter.set_size_fileseg(0) ++ fwriter.set_intervaltime_fileseg(0) ++ ++ if not fwriter.open(writer_path): ++ print('Failed to open record writer!') ++ return ++ print('+++ Begin to writer +++') ++ ++ # Writer 2 SimpleMessage ++ msg = SimpleMessage() ++ msg.text = "AAAAAA" ++ ++ file_desc = msg.DESCRIPTOR.file ++ proto = FileDescriptorProto() ++ file_desc.CopyToProto(proto) ++ proto.name = file_desc.name ++ desc_str = proto.SerializeToString() ++ print(msg.DESCRIPTOR.full_name) ++ fwriter.write_channel( ++ 'simplemsg_channel', msg.DESCRIPTOR.full_name, desc_str) ++ fwriter.write_message('simplemsg_channel', msg, 990, False) ++ fwriter.write_message('simplemsg_channel', msg.SerializeToString(), 991) ++ ++ # Writer 2 Chatter ++ msg = Chatter() ++ msg.timestamp = 99999 ++ msg.lidar_timestamp = 100 ++ msg.seq = 1 ++ ++ file_desc = msg.DESCRIPTOR.file ++ proto = FileDescriptorProto() ++ file_desc.CopyToProto(proto) ++ proto.name = file_desc.name ++ desc_str = proto.SerializeToString() ++ print(msg.DESCRIPTOR.full_name) ++ fwriter.write_channel('chatter_a', msg.DESCRIPTOR.full_name, desc_str) ++ fwriter.write_message('chatter_a', msg, 992, False) ++ msg.seq = 2 ++ fwriter.write_message("chatter_a", msg.SerializeToString(), 993) ++ ++ fwriter.close() ++ ++ ++def test_record_reader(reader_path): ++ """ ++ Record reader. ++ """ ++ freader = record.RecordReader(reader_path) ++ time.sleep(1) ++ print('+' * 80) ++ print('+++ Begin to read +++') ++ count = 0 ++ for channel_name, msg, datatype, timestamp in freader.read_messages(): ++ count += 1 ++ print('=' * 80) ++ print('read [%d] messages' % count) ++ print('channel_name -> %s' % channel_name) ++ print('msgtime -> %d' % timestamp) ++ print('msgnum -> %d' % freader.get_messagenumber(channel_name)) ++ print('msgtype -> %s' % datatype) ++ print('message is -> %s' % msg) ++ print('***After parse(if needed),the message is ->') ++ if datatype == MSG_TYPE: ++ msg_new = SimpleMessage() ++ msg_new.ParseFromString(msg) ++ print(msg_new) ++ elif datatype == MSG_TYPE_CHATTER: ++ msg_new = Chatter() ++ msg_new.ParseFromString(msg) ++ print(msg_new) ++ ++ ++if __name__ == '__main__': ++ test_record_file = "/tmp/test_writer.record" ++ ++ print('Begin to write record file: {}'.format(test_record_file)) ++ test_record_writer(test_record_file) ++ ++ print('Begin to read record file: {}'.format(test_record_file)) ++ test_record_reader(test_record_file) +diff --color -Naur cyber/python/cyber_py3/examples/py_record_channel_info.py /opt/apollo/cyber/python/cyber_py3/examples/py_record_channel_info.py +--- cyber/python/cyber_py3/examples/py_record_channel_info.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_record_channel_info.py 2023-12-23 18:05:58.579028978 +0800 +@@ -0,0 +1,64 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++"""Module for example of record.""" ++ ++import sys ++ ++from cyber.python.cyber_py3 import cyber ++from cyber.python.cyber_py3 import record ++from cyber.proto import record_pb2 ++ ++ ++def print_channel_info(file_path): ++ freader = record.RecordReader(file_path) ++ channels = freader.get_channellist() ++ ++ header_msg = freader.get_headerstring() ++ header = record_pb2.Header() ++ header.ParseFromString(header_msg) ++ ++ print('\n++++++++++++Begin Channel Info Statistics++++++++++++++') ++ print('-' * 40) ++ print( ++ 'record version: [%d:%d]' % ++ (header.major_version, header.minor_version)) ++ print('record message_number: %s' % str(header.message_number)) ++ print('record file size(Byte): %s' % str(header.size)) ++ print('chunk_number: %d' % header.chunk_number) ++ print('channel count: %d' % len(channels)) ++ print('-' * 40) ++ count = 0 ++ for channel in channels: ++ desc = freader.get_protodesc(channel) ++ count += 1 ++ print( ++ 'Channel: %s, count: %d, desc size: %d' % ++ (channel, count, len(desc))) ++ # print(desc) ++ print("++++++++++++Finish Channel Info Statistics++++++++++++++\n") ++ ++ ++if __name__ == '__main__': ++ if len(sys.argv) < 2: ++ print('Usage: %s record_file' % sys.argv[0]) ++ sys.exit(0) ++ ++ cyber.init() ++ print_channel_info(sys.argv[1]) ++ cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/py_record_trans.py /opt/apollo/cyber/python/cyber_py3/examples/py_record_trans.py +--- cyber/python/cyber_py3/examples/py_record_trans.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_record_trans.py 2023-12-23 18:05:58.579028978 +0800 +@@ -0,0 +1,63 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++"""Module for example of record trans.""" ++ ++import sys ++ ++from cyber.python.cyber_py3 import cyber ++from cyber.python.cyber_py3 import record ++ ++ ++TEST_RECORD_FILE = "trans_ret.record" ++ ++ ++def test_record_trans(reader_path): ++ """ ++ Record trans. ++ """ ++ fwriter = record.RecordWriter() ++ if not fwriter.open(TEST_RECORD_FILE): ++ print('Failed to open record writer!') ++ return ++ print('+++ Begin to trans +++') ++ ++ fread = record.RecordReader(reader_path) ++ count = 0 ++ for channelname, msg, datatype, timestamp in fread.read_messages(): ++ # print channelname, timestamp, fread.get_messagenumber(channelname) ++ desc = fread.get_protodesc(channelname) ++ fwriter.write_channel(channelname, datatype, desc) ++ fwriter.write_message(channelname, msg, timestamp) ++ count += 1 ++ print('-' * 80) ++ print('Message count: %d' % count) ++ print('Channel info: ') ++ channel_list = fread.get_channellist() ++ print('Channel count: %d' % len(channel_list)) ++ print(channel_list) ++ ++ ++if __name__ == '__main__': ++ if len(sys.argv) < 2: ++ print('Usage: %s record_file' % sys.argv[0]) ++ sys.exit(0) ++ ++ cyber.init() ++ test_record_trans(sys.argv[1]) ++ cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/py_service.py /opt/apollo/cyber/python/cyber_py3/examples/py_service.py +--- cyber/python/cyber_py3/examples/py_service.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_service.py 2023-12-23 18:05:58.579028978 +0800 +@@ -0,0 +1,45 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++"""Module for example of listener.""" ++ ++from cyber.python.cyber_py3 import cyber ++from cyber.proto.unit_test_pb2 import ChatterBenchmark ++ ++ ++def callback(data): ++ print("-" * 80) ++ print("get Request [ ", data, " ]") ++ return ChatterBenchmark(content="svr: Hello client!", seq=data.seq + 2) ++ ++ ++def test_service_class(): ++ """ ++ Reader message. ++ """ ++ print("=" * 120) ++ node = cyber.Node("service_node") ++ r = node.create_service( ++ "server_01", ChatterBenchmark, ChatterBenchmark, callback) ++ node.spin() ++ ++ ++if __name__ == '__main__': ++ cyber.init() ++ test_service_class() ++ cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/py_talker.py /opt/apollo/cyber/python/cyber_py3/examples/py_talker.py +--- cyber/python/cyber_py3/examples/py_talker.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_talker.py 2023-12-23 18:05:58.580028978 +0800 +@@ -0,0 +1,53 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++"""Module for example of talker.""" ++ ++import time ++ ++from cyber.python.cyber_py3 import cyber ++from cyber.proto.unit_test_pb2 import ChatterBenchmark ++ ++ ++def test_talker_class(): ++ """ ++ Test talker. ++ """ ++ msg = ChatterBenchmark() ++ msg.content = "py:talker:send Alex!" ++ msg.stamp = 9999 ++ msg.seq = 0 ++ print(msg) ++ test_node = cyber.Node("node_name1") ++ g_count = 1 ++ ++ writer = test_node.create_writer("channel/chatter", ChatterBenchmark, 6) ++ while not cyber.is_shutdown(): ++ time.sleep(1) ++ g_count = g_count + 1 ++ msg.seq = g_count ++ msg.content = "I am python talker." ++ print("=" * 80) ++ print("write msg -> %s" % msg) ++ writer.write(msg) ++ ++ ++if __name__ == '__main__': ++ cyber.init("talker_sample") ++ test_talker_class() ++ cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/py_time.py /opt/apollo/cyber/python/cyber_py3/examples/py_time.py +--- cyber/python/cyber_py3/examples/py_time.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_time.py 2023-12-23 18:05:58.580028978 +0800 +@@ -0,0 +1,83 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++# -*- coding: utf-8 -*- ++"""Module for example of cyber time.""" ++ ++import time ++ ++from cyber.python.cyber_py3 import cyber_time ++ ++ ++def test_time(): ++ ct = cyber_time.Time(123) ++ print(ct.to_nsec()) ++ ftime = ct.now().to_sec() ++ print(ftime) ++ time.sleep(1) ++ ftime = cyber_time.Time.now().to_sec() ++ print(ftime) ++ ftime = cyber_time.Time.mono_time().to_sec() ++ print(ftime) ++ ++ td1 = cyber_time.Duration(111) ++ tm1 = ct - td1 ++ print("ct sub du is ", tm1) ++ tm1 = ct - td1 ++ print(tm1) ++ ++ tm5 = cyber_time.Time(1.8) ++ tm7 = cyber_time.Time(tm5) ++ print(tm7) ++ ++ ++def test_duration(): ++ td1 = cyber_time.Duration(111) ++ td2 = cyber_time.Duration(601000000000) ++ td3 = td2 - td1 ++ print(td1, td1.to_nsec()) ++ print(td2, td2.to_nsec()) ++ print(td3, td3.to_nsec()) ++ print(td2.to_sec()) ++ print(td2.iszero()) ++ print(str(td2)) ++ td5 = cyber_time.Duration(1.8) ++ td6 = td5 ++ print(type(td6)) ++ td7 = cyber_time.Duration(td6) ++ print(td7) ++ # td7 = cyber_time.Duration("zzz") ++ # print(td7) ++ # print(type(td2)) ++ ++ ++def test_rate(): ++ rt1 = cyber_time.Rate(111) ++ rt2 = cyber_time.Rate(0.2) ++ rt3 = cyber_time.Rate(cyber_time.Duration(666)) ++ print(rt1) ++ print(rt2) ++ print(rt3) ++ ++ ++if __name__ == '__main__': ++ print("test time", "-" * 50) ++ test_time() ++ print("test duration", "-" * 50) ++ test_duration() ++ print("test rate", "-" * 50) ++ test_rate() +diff --color -Naur cyber/python/cyber_py3/examples/py_timer.py /opt/apollo/cyber/python/cyber_py3/examples/py_timer.py +--- cyber/python/cyber_py3/examples/py_timer.py 1970-01-01 08:00:00.000000000 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/py_timer.py 2023-12-23 18:05:58.580028978 +0800 +@@ -0,0 +1,54 @@ ++#!/usr/bin/env python3 ++ ++# **************************************************************************** ++# Copyright 2019 The Apollo Authors. All Rights Reserved. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# **************************************************************************** ++ ++"""Module for example of timer.""" ++ ++import time ++ ++from cyber.python.cyber_py3 import cyber ++from cyber.python.cyber_py3 import cyber_timer ++ ++ ++count = 0 ++ ++ ++def fun(): ++ global count ++ print("cb fun is called:", count) ++ count += 1 ++ ++ ++def test_timer(): ++ cyber.init() ++ ct = cyber_timer.Timer(10, fun, 0) # 10ms ++ ct.start() ++ time.sleep(1) # 1s ++ ct.stop() ++ ++ print("+" * 80, "test set_option") ++ ct2 = cyber_timer.Timer() # 10ms ++ ct2.set_option(10, fun, 0) ++ ct2.start() ++ time.sleep(1) # 1s ++ ct2.stop() ++ ++ cyber.shutdown() ++ ++ ++if __name__ == '__main__': ++ test_timer() +diff --color -Naur cyber/python/cyber_py3/examples/record.py /opt/apollo/cyber/python/cyber_py3/examples/record.py +--- cyber/python/cyber_py3/examples/record.py 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/record.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,123 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-""" +-Module for example of record. +- +-Run with: +- bazel run //cyber/python/cyber_py3/examples:record +-""" +- +-import time +- +-from google.protobuf.descriptor_pb2 import FileDescriptorProto +- +-from cyber.proto.unit_test_pb2 import Chatter +-from cyber.python.cyber_py3 import record +-from modules.common.util.testdata.simple_pb2 import SimpleMessage +- +- +-MSG_TYPE = "apollo.common.util.test.SimpleMessage" +-MSG_TYPE_CHATTER = "apollo.cyber.proto.Chatter" +- +- +-def test_record_writer(writer_path): +- """ +- Record writer. +- """ +- fwriter = record.RecordWriter() +- fwriter.set_size_fileseg(0) +- fwriter.set_intervaltime_fileseg(0) +- +- if not fwriter.open(writer_path): +- print('Failed to open record writer!') +- return +- print('+++ Begin to writer +++') +- +- # Writer 2 SimpleMessage +- msg = SimpleMessage() +- msg.text = "AAAAAA" +- +- file_desc = msg.DESCRIPTOR.file +- proto = FileDescriptorProto() +- file_desc.CopyToProto(proto) +- proto.name = file_desc.name +- desc_str = proto.SerializeToString() +- print(msg.DESCRIPTOR.full_name) +- fwriter.write_channel( +- 'simplemsg_channel', msg.DESCRIPTOR.full_name, desc_str) +- fwriter.write_message('simplemsg_channel', msg, 990, False) +- fwriter.write_message('simplemsg_channel', msg.SerializeToString(), 991) +- +- # Writer 2 Chatter +- msg = Chatter() +- msg.timestamp = 99999 +- msg.lidar_timestamp = 100 +- msg.seq = 1 +- +- file_desc = msg.DESCRIPTOR.file +- proto = FileDescriptorProto() +- file_desc.CopyToProto(proto) +- proto.name = file_desc.name +- desc_str = proto.SerializeToString() +- print(msg.DESCRIPTOR.full_name) +- fwriter.write_channel('chatter_a', msg.DESCRIPTOR.full_name, desc_str) +- fwriter.write_message('chatter_a', msg, 992, False) +- msg.seq = 2 +- fwriter.write_message("chatter_a", msg.SerializeToString(), 993) +- +- fwriter.close() +- +- +-def test_record_reader(reader_path): +- """ +- Record reader. +- """ +- freader = record.RecordReader(reader_path) +- time.sleep(1) +- print('+' * 80) +- print('+++ Begin to read +++') +- count = 0 +- for channel_name, msg, datatype, timestamp in freader.read_messages(): +- count += 1 +- print('=' * 80) +- print('read [%d] messages' % count) +- print('channel_name -> %s' % channel_name) +- print('msgtime -> %d' % timestamp) +- print('msgnum -> %d' % freader.get_messagenumber(channel_name)) +- print('msgtype -> %s' % datatype) +- print('message is -> %s' % msg) +- print('***After parse(if needed),the message is ->') +- if datatype == MSG_TYPE: +- msg_new = SimpleMessage() +- msg_new.ParseFromString(msg) +- print(msg_new) +- elif datatype == MSG_TYPE_CHATTER: +- msg_new = Chatter() +- msg_new.ParseFromString(msg) +- print(msg_new) +- +- +-if __name__ == '__main__': +- test_record_file = "/tmp/test_writer.record" +- +- print('Begin to write record file: {}'.format(test_record_file)) +- test_record_writer(test_record_file) +- +- print('Begin to read record file: {}'.format(test_record_file)) +- test_record_reader(test_record_file) +diff --color -Naur cyber/python/cyber_py3/examples/record_channel_info.py /opt/apollo/cyber/python/cyber_py3/examples/record_channel_info.py +--- cyber/python/cyber_py3/examples/record_channel_info.py 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/record_channel_info.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,64 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-"""Module for example of record.""" +- +-import sys +- +-from cyber.python.cyber_py3 import cyber +-from cyber.python.cyber_py3 import record +-from cyber.proto import record_pb2 +- +- +-def print_channel_info(file_path): +- freader = record.RecordReader(file_path) +- channels = freader.get_channellist() +- +- header_msg = freader.get_headerstring() +- header = record_pb2.Header() +- header.ParseFromString(header_msg) +- +- print('\n++++++++++++Begin Channel Info Statistics++++++++++++++') +- print('-' * 40) +- print( +- 'record version: [%d:%d]' % +- (header.major_version, header.minor_version)) +- print('record message_number: %s' % str(header.message_number)) +- print('record file size(Byte): %s' % str(header.size)) +- print('chunk_number: %d' % header.chunk_number) +- print('channel count: %d' % len(channels)) +- print('-' * 40) +- count = 0 +- for channel in channels: +- desc = freader.get_protodesc(channel) +- count += 1 +- print( +- 'Channel: %s, count: %d, desc size: %d' % +- (channel, count, len(desc))) +- # print(desc) +- print("++++++++++++Finish Channel Info Statistics++++++++++++++\n") +- +- +-if __name__ == '__main__': +- if len(sys.argv) < 2: +- print('Usage: %s record_file' % sys.argv[0]) +- sys.exit(0) +- +- cyber.init() +- print_channel_info(sys.argv[1]) +- cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/record_trans.py /opt/apollo/cyber/python/cyber_py3/examples/record_trans.py +--- cyber/python/cyber_py3/examples/record_trans.py 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/record_trans.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,63 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-"""Module for example of record trans.""" +- +-import sys +- +-from cyber.python.cyber_py3 import cyber +-from cyber.python.cyber_py3 import record +- +- +-TEST_RECORD_FILE = "trans_ret.record" +- +- +-def test_record_trans(reader_path): +- """ +- Record trans. +- """ +- fwriter = record.RecordWriter() +- if not fwriter.open(TEST_RECORD_FILE): +- print('Failed to open record writer!') +- return +- print('+++ Begin to trans +++') +- +- fread = record.RecordReader(reader_path) +- count = 0 +- for channelname, msg, datatype, timestamp in fread.read_messages(): +- # print channelname, timestamp, fread.get_messagenumber(channelname) +- desc = fread.get_protodesc(channelname) +- fwriter.write_channel(channelname, datatype, desc) +- fwriter.write_message(channelname, msg, timestamp) +- count += 1 +- print('-' * 80) +- print('Message count: %d' % count) +- print('Channel info: ') +- channel_list = fread.get_channellist() +- print('Channel count: %d' % len(channel_list)) +- print(channel_list) +- +- +-if __name__ == '__main__': +- if len(sys.argv) < 2: +- print('Usage: %s record_file' % sys.argv[0]) +- sys.exit(0) +- +- cyber.init() +- test_record_trans(sys.argv[1]) +- cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/service.py /opt/apollo/cyber/python/cyber_py3/examples/service.py +--- cyber/python/cyber_py3/examples/service.py 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/service.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,45 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-"""Module for example of listener.""" +- +-from cyber.python.cyber_py3 import cyber +-from cyber.proto.unit_test_pb2 import ChatterBenchmark +- +- +-def callback(data): +- print("-" * 80) +- print("get Request [ ", data, " ]") +- return ChatterBenchmark(content="svr: Hello client!", seq=data.seq + 2) +- +- +-def test_service_class(): +- """ +- Reader message. +- """ +- print("=" * 120) +- node = cyber.Node("service_node") +- r = node.create_service( +- "server_01", ChatterBenchmark, ChatterBenchmark, callback) +- node.spin() +- +- +-if __name__ == '__main__': +- cyber.init() +- test_service_class() +- cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/talker.py /opt/apollo/cyber/python/cyber_py3/examples/talker.py +--- cyber/python/cyber_py3/examples/talker.py 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/talker.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,53 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-"""Module for example of talker.""" +- +-import time +- +-from cyber.python.cyber_py3 import cyber +-from cyber.proto.unit_test_pb2 import ChatterBenchmark +- +- +-def test_talker_class(): +- """ +- Test talker. +- """ +- msg = ChatterBenchmark() +- msg.content = "py:talker:send Alex!" +- msg.stamp = 9999 +- msg.seq = 0 +- print(msg) +- test_node = cyber.Node("node_name1") +- g_count = 1 +- +- writer = test_node.create_writer("channel/chatter", ChatterBenchmark, 6) +- while not cyber.is_shutdown(): +- time.sleep(1) +- g_count = g_count + 1 +- msg.seq = g_count +- msg.content = "I am python talker." +- print("=" * 80) +- print("write msg -> %s" % msg) +- writer.write(msg) +- +- +-if __name__ == '__main__': +- cyber.init("talker_sample") +- test_talker_class() +- cyber.shutdown() +diff --color -Naur cyber/python/cyber_py3/examples/time.py /opt/apollo/cyber/python/cyber_py3/examples/time.py +--- cyber/python/cyber_py3/examples/time.py 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/time.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,83 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +-# -*- coding: utf-8 -*- +-"""Module for example of cyber time.""" +- +-import time +- +-from cyber.python.cyber_py3 import cyber_time +- +- +-def test_time(): +- ct = cyber_time.Time(123) +- print(ct.to_nsec()) +- ftime = ct.now().to_sec() +- print(ftime) +- time.sleep(1) +- ftime = cyber_time.Time.now().to_sec() +- print(ftime) +- ftime = cyber_time.Time.mono_time().to_sec() +- print(ftime) +- +- td1 = cyber_time.Duration(111) +- tm1 = ct - td1 +- print("ct sub du is ", tm1) +- tm1 = ct - td1 +- print(tm1) +- +- tm5 = cyber_time.Time(1.8) +- tm7 = cyber_time.Time(tm5) +- print(tm7) +- +- +-def test_duration(): +- td1 = cyber_time.Duration(111) +- td2 = cyber_time.Duration(601000000000) +- td3 = td2 - td1 +- print(td1, td1.to_nsec()) +- print(td2, td2.to_nsec()) +- print(td3, td3.to_nsec()) +- print(td2.to_sec()) +- print(td2.iszero()) +- print(str(td2)) +- td5 = cyber_time.Duration(1.8) +- td6 = td5 +- print(type(td6)) +- td7 = cyber_time.Duration(td6) +- print(td7) +- # td7 = cyber_time.Duration("zzz") +- # print(td7) +- # print(type(td2)) +- +- +-def test_rate(): +- rt1 = cyber_time.Rate(111) +- rt2 = cyber_time.Rate(0.2) +- rt3 = cyber_time.Rate(cyber_time.Duration(666)) +- print(rt1) +- print(rt2) +- print(rt3) +- +- +-if __name__ == '__main__': +- print("test time", "-" * 50) +- test_time() +- print("test duration", "-" * 50) +- test_duration() +- print("test rate", "-" * 50) +- test_rate() +diff --color -Naur cyber/python/cyber_py3/examples/timer.py /opt/apollo/cyber/python/cyber_py3/examples/timer.py +--- cyber/python/cyber_py3/examples/timer.py 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/examples/timer.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,54 +0,0 @@ +-#!/usr/bin/env python3 +- +-# **************************************************************************** +-# Copyright 2019 The Apollo Authors. All Rights Reserved. +-# +-# Licensed under the Apache License, Version 2.0 (the "License"); +-# you may not use this file except in compliance with the License. +-# You may obtain a copy of the License at +-# +-# http://www.apache.org/licenses/LICENSE-2.0 +-# +-# Unless required by applicable law or agreed to in writing, software +-# distributed under the License is distributed on an "AS IS" BASIS, +-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-# See the License for the specific language governing permissions and +-# limitations under the License. +-# **************************************************************************** +- +-"""Module for example of timer.""" +- +-import time +- +-from cyber.python.cyber_py3 import cyber +-from cyber.python.cyber_py3 import cyber_timer +- +- +-count = 0 +- +- +-def fun(): +- global count +- print("cb fun is called:", count) +- count += 1 +- +- +-def test_timer(): +- cyber.init() +- ct = cyber_timer.Timer(10, fun, 0) # 10ms +- ct.start() +- time.sleep(1) # 1s +- ct.stop() +- +- print("+" * 80, "test set_option") +- ct2 = cyber_timer.Timer() # 10ms +- ct2.set_option(10, fun, 0) +- ct2.start() +- time.sleep(1) # 1s +- ct2.stop() +- +- cyber.shutdown() +- +- +-if __name__ == '__main__': +- test_timer() +diff --color -Naur cyber/python/cyber_py3/parameter.py /opt/apollo/cyber/python/cyber_py3/parameter.py +--- cyber/python/cyber_py3/parameter.py 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/parameter.py 2023-12-23 18:05:58.580028978 +0800 +@@ -26,9 +26,14 @@ + # init vars + CYBER_PATH = os.environ.get('CYBER_PATH', '/apollo/cyber') + CYBER_DIR = os.path.split(CYBER_PATH)[0] +-wrapper_lib_path = os.path.abspath(os.path.join(os.path.dirname(__file__), +- '../internal')) +-sys.path.append(wrapper_lib_path) ++APOLLO_DISTRIBUTION_HOME = os.environ.get( ++ 'APOLLO_DISTRIBUTION_HOME', '/opt/apollo/neo') ++ ++if APOLLO_DISTRIBUTION_HOME.startswith('/opt/apollo/neo'): ++ wrapper_lib_path = os.path.join( ++ APOLLO_DISTRIBUTION_HOME, "lib", "cyber/python/internal") ++ ++ sys.path.append(wrapper_lib_path) + + _CYBER_PARAM = importlib.import_module('_cyber_parameter_wrapper') + +diff --color -Naur cyber/python/cyber_py3/record.py /opt/apollo/cyber/python/cyber_py3/record.py +--- cyber/python/cyber_py3/record.py 2023-12-23 18:23:13.088910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/record.py 2023-12-23 18:05:58.580028978 +0800 +@@ -27,9 +27,14 @@ + + # Refer to the _cyber_record_wrapper.so with relative path so that it can be + # always addressed as a part of the runfiles. +-wrapper_lib_path = os.path.abspath(os.path.join(os.path.dirname(__file__), +- '../internal')) +-sys.path.append(wrapper_lib_path) ++APOLLO_DISTRIBUTION_HOME = os.environ.get( ++ 'APOLLO_DISTRIBUTION_HOME', '/opt/apollo/neo') ++ ++if APOLLO_DISTRIBUTION_HOME.startswith('/opt/apollo/neo'): ++ wrapper_lib_path = os.path.join( ++ APOLLO_DISTRIBUTION_HOME, "lib", "cyber/python/internal") ++ ++ sys.path.append(wrapper_lib_path) + + _CYBER_RECORD = importlib.import_module('_cyber_record_wrapper') + PyBagMessage = collections.namedtuple('PyBagMessage', +diff --color -Naur cyber/python/cyber_py3/test/BUILD /opt/apollo/cyber/python/cyber_py3/test/BUILD +--- cyber/python/cyber_py3/test/BUILD 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/cyber_py3/test/BUILD 2023-12-23 18:05:58.580028978 +0800 +@@ -1,15 +1,16 @@ + load("@rules_python//python:defs.bzl", "py_test") ++load("//tools:apollo_package.bzl", "apollo_package") + +-py_test( +- name = "record_test", +- timeout = "short", +- srcs = ["record_test.py"], +- deps = [ +- "//cyber/proto:record_py_pb2", +- "//cyber/python/cyber_py3:record", +- "//cyber/proto:simple_py_pb2", +- ], +-) ++# py_test( ++# name = "record_test", ++# timeout = "short", ++# srcs = ["record_test.py"], ++# deps = [ ++# "//cyber/proto:record_py_pb2", ++# "//cyber/python/cyber_py3:record", ++# "//cyber/proto:simple_py_pb2", ++# ], ++# ) + + py_test( + name = "init_test", +@@ -20,15 +21,15 @@ + ], + ) + +-py_test( +- name = "cyber_test", +- timeout = "short", +- srcs = ["cyber_test.py"], +- deps = [ +- "//cyber/python/cyber_py3:cyber", +- "//cyber/proto:simple_py_pb2", +- ], +-) ++# py_test( ++# name = "cyber_test", ++# timeout = "short", ++# srcs = ["cyber_test.py"], ++# deps = [ ++# "//cyber/python/cyber_py3:cyber", ++# "//cyber/proto:simple_py_pb2", ++# ], ++# ) + # FIXME(all): parameter_test seems to run forever + # py_test( + # name = "parameter_test", +@@ -60,3 +61,5 @@ + # "//cyber/python/cyber_py3:cyber_timer", + # ], + #) ++ ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/python/internal/BUILD /opt/apollo/cyber/python/internal/BUILD +--- cyber/python/internal/BUILD 2023-12-23 18:23:13.089910841 +0800 ++++ /opt/apollo/cyber/python/internal/BUILD 2023-12-23 18:05:58.580028978 +0800 +@@ -1,32 +1,9 @@ +-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") +-load("//tools/install:install.bzl", "install") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_binary", "apollo_cc_library", "apollo_cc_test") + load("//tools:cpplint.bzl", "cpplint") + + package(default_visibility = ["//visibility:public"]) + +-install( +- name = "install", +- library_dest = "cyber/python/cyber/python/internal", +- #data = [":runtime_files"], +- #data_dest = "cyber/python/internal", +- targets = [ +- ":_cyber_wrapper.so", +- ":_cyber_record_wrapper.so", +- ":_cyber_time_wrapper.so", +- ":_cyber_timer_wrapper.so", +- ":_cyber_parameter_wrapper.so", +- ], +- #rename = { +- # "cyber/python/internal/internal.BUILD": "BUILD" +- #} +-) +- +-#filegroup( +-# name = "runtime_files", +-# srcs = ["internal.BUILD"] +-#) +- +-cc_binary( ++apollo_cc_binary( + name = "_cyber_wrapper.so", + srcs = ["py_cyber.cc"], + linkshared = True, +@@ -36,19 +13,18 @@ + ], + ) + +-cc_library( ++apollo_cc_library( + name = "py_cyber", + srcs = ["py_cyber.cc"], + hdrs = ["py_cyber.h"], +- #alwayslink = True, + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "@local_config_python//:python_headers", + "@local_config_python//:python_lib", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "py_cyber_test", + size = "small", + srcs = ["py_cyber_test.cc"], +@@ -60,7 +36,7 @@ + linkstatic = True, + ) + +-cc_binary( ++apollo_cc_binary( + name = "_cyber_record_wrapper.so", + srcs = ["py_record.cc"], + linkshared = True, +@@ -70,20 +46,19 @@ + ], + ) + +-cc_library( ++apollo_cc_library( + name = "py_record", + srcs = ["py_record.cc"], + hdrs = ["py_record.h"], +- #alwayslink = True, + deps = [ +- "//cyber:cyber_core", +- "//cyber/message:py_message", ++ "//cyber", ++ "//cyber/message:cyber_message", + "@local_config_python//:python_headers", + "@local_config_python//:python_lib", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "py_record_test", + size = "small", + srcs = ["py_record_test.cc"], +@@ -91,12 +66,11 @@ + ":py_record", + "//cyber/proto:unit_test_cc_proto", + "@com_google_googletest//:gtest_main", +- #"@fastrtps", + ], + linkstatic = True, + ) + +-cc_binary( ++apollo_cc_binary( + name = "_cyber_time_wrapper.so", + srcs = ["py_time.cc"], + linkshared = True, +@@ -106,20 +80,19 @@ + ], + ) + +-cc_library( ++apollo_cc_library( + name = "py_time", + srcs = ["py_time.cc"], + hdrs = ["py_time.h"], +- #alwayslink = True, + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "@fastrtps", + "@local_config_python//:python_headers", + "@local_config_python//:python_lib", + ], + ) + +-cc_binary( ++apollo_cc_binary( + name = "_cyber_timer_wrapper.so", + srcs = ["py_timer.cc"], + linkshared = True, +@@ -129,19 +102,18 @@ + ], + ) + +-cc_library( ++apollo_cc_library( + name = "py_timer", + srcs = ["py_timer.cc"], + hdrs = ["py_timer.h"], +- #alwayslink = True, + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "@local_config_python//:python_headers", + "@local_config_python//:python_lib", + ], + ) + +-cc_binary( ++apollo_cc_binary( + name = "_cyber_parameter_wrapper.so", + srcs = ["py_parameter.cc"], + linkshared = True, +@@ -151,17 +123,17 @@ + ], + ) + +-cc_library( ++apollo_cc_library( + name = "py_parameter", + srcs = ["py_parameter.cc"], + hdrs = ["py_parameter.h"], +- #alwayslink = True, + deps = [ + ":py_cyber", +- "//cyber:cyber_core", ++ "//cyber", + "@local_config_python//:python_headers", + "@local_config_python//:python_lib", + ], + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/record/BUILD /opt/apollo/cyber/record/BUILD +--- cyber/record/BUILD 2023-12-23 18:23:13.090910841 +0800 ++++ /opt/apollo/cyber/record/BUILD 2023-12-23 18:05:58.581028978 +0800 +@@ -1,60 +1,42 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-cc_library( +- name = "record", +- deps = [ +- ":record_reader", +- ":record_viewer", +- ":record_writer", ++apollo_cc_library( ++ name = "cyber_record", ++ srcs = [ ++ "header_builder.cc", ++ "record_reader.cc", ++ "record_viewer.cc", ++ "record_writer.cc", ++ "file/record_file_base.cc", ++ "file/record_file_reader.cc", ++ "file/record_file_writer.cc", ++ ], ++ hdrs = [ ++ "header_builder.h", ++ "record_base.h", ++ "record_message.h", ++ "record_reader.h", ++ "record_viewer.h", ++ "record_writer.h", ++ "file/record_file_base.h", ++ "file/record_file_reader.h", ++ "file/record_file_writer.h", ++ "file/section.h", + ], +- alwayslink = True, +-) +- +-cc_library( +- name = "record_file_base", +- srcs = ["file/record_file_base.cc"], +- hdrs = ["file/record_file_base.h"], + deps = [ +- "//cyber/common:log", ++ "//cyber/common:cyber_common", + "//cyber/proto:record_cc_proto", +- ], +-) +- +-cc_library( +- name = "record_file_reader", +- srcs = ["file/record_file_reader.cc"], +- hdrs = ["file/record_file_reader.h"], +- deps = [ +- ":record_file_base", +- ":section", +- "//cyber/common:file", +- "//cyber/time", ++ "//cyber/time:cyber_time", + "@com_google_protobuf//:protobuf", ++ "//cyber/message:cyber_message", + ], + ) + +-cc_library( +- name = "record_file_writer", +- srcs = ["file/record_file_writer.cc"], +- hdrs = ["file/record_file_writer.h"], +- deps = [ +- ":record_file_base", +- ":section", +- "//cyber/common:file", +- "//cyber/time", +- "@com_google_protobuf//:protobuf", +- ], +-) +- +-cc_library( +- name = "section", +- hdrs = ["file/section.h"], +-) + +-cc_test( ++apollo_cc_test( + name = "record_file_test", + size = "small", + srcs = ["file/record_file_test.cc"], +@@ -65,7 +47,7 @@ + ], + ) + +-cc_test( ++apollo_cc_test( + name = "record_file_integration_test", + size = "small", + srcs = ["file/record_file_integration_test.cc"], +@@ -81,41 +63,7 @@ + ], + ) + +-cc_library( +- name = "header_builder", +- srcs = ["header_builder.cc"], +- hdrs = ["header_builder.h"], +- deps = [ +- "//cyber/proto:record_cc_proto", +- ], +-) +- +-cc_library( +- name = "record_base", +- hdrs = ["record_base.h"], +- deps = [ +- "//cyber/proto:record_cc_proto", +- ], +-) +- +-cc_library( +- name = "record_message", +- hdrs = ["record_message.h"], +-) +- +-cc_library( +- name = "record_reader", +- srcs = ["record_reader.cc"], +- hdrs = ["record_reader.h"], +- deps = [ +- ":record_base", +- ":record_file_reader", +- ":record_message", +- ], +- alwayslink = True, +-) +- +-cc_test( ++apollo_cc_test( + name = "record_reader_test", + size = "small", + srcs = ["record_reader_test.cc"], +@@ -126,18 +74,7 @@ + ], + ) + +-cc_library( +- name = "record_viewer", +- srcs = ["record_viewer.cc"], +- hdrs = ["record_viewer.h"], +- deps = [ +- ":record_message", +- ":record_reader", +- ], +- alwayslink = True, +-) +- +-cc_test( ++apollo_cc_test( + name = "record_viewer_test", + size = "small", + srcs = ["record_viewer_test.cc"], +@@ -148,19 +85,5 @@ + ], + ) + +-cc_library( +- name = "record_writer", +- srcs = ["record_writer.cc"], +- hdrs = ["record_writer.h"], +- deps = [ +- ":header_builder", +- ":record_base", +- ":record_file_writer", +- "//cyber/message:message_traits", +- "//cyber/message:raw_message", +- "//cyber/proto:record_cc_proto", +- ], +- alwayslink = True, +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/record/header_builder.h /opt/apollo/cyber/record/header_builder.h +--- cyber/record/header_builder.h 2023-12-23 18:23:13.090910841 +0800 ++++ /opt/apollo/cyber/record/header_builder.h 2023-12-23 18:05:58.581028978 +0800 +@@ -66,8 +66,8 @@ + proto::CompressType::COMPRESS_NONE; + static const uint64_t CHUNK_INTERVAL_ = 20 * 1000 * 1000 * 1000ULL; // 20s + static const uint64_t SEGMENT_INTERVAL_ = 60 * 1000 * 1000 * 1000ULL; // 60s +- static const uint64_t CHUNK_RAW_SIZE_ = 200 * 1024 * 1024ULL; // 200MB +- static const uint64_t SEGMENT_RAW_SIZE_ = 2048 * 1024 * 1024ULL; // 2GB ++ static const uint64_t CHUNK_RAW_SIZE_ = 1 * 1024 * 1024ULL; // 1MB ++ static const uint64_t SEGMENT_RAW_SIZE_ = 2048 * 1024 * 1024ULL; // 2GB + }; + + } // namespace record +diff --color -Naur cyber/record/record_viewer.cc /opt/apollo/cyber/record/record_viewer.cc +--- cyber/record/record_viewer.cc 2023-12-23 18:23:13.090910841 +0800 ++++ /opt/apollo/cyber/record/record_viewer.cc 2023-12-23 18:05:58.583028978 +0800 +@@ -78,6 +78,10 @@ + + RecordViewer::Iterator RecordViewer::end() { return Iterator(this, true); } + ++RecordViewer::Iterator RecordViewer::curr_itr() { return itr_; } ++ ++void RecordViewer::set_curr_itr(const Iterator& curr_itr) { itr_ = curr_itr; } ++ + void RecordViewer::Init() { + // Init the channel list + for (auto& reader : readers_) { +diff --color -Naur cyber/record/record_viewer.h /opt/apollo/cyber/record/record_viewer.h +--- cyber/record/record_viewer.h 2023-12-23 18:23:13.090910841 +0800 ++++ /opt/apollo/cyber/record/record_viewer.h 2023-12-23 18:05:58.583028978 +0800 +@@ -176,6 +176,15 @@ + */ + Iterator end(); + ++ /** ++ * @brief Get current iterator. ++ * ++ * @return The current iterator. ++ */ ++ Iterator curr_itr(); ++ ++ void set_curr_itr(const Iterator& curr_itr); ++ + private: + friend class Iterator; + +@@ -199,6 +208,8 @@ + + const uint64_t kStepTimeNanoSec = 1000000000UL; // 1 second + const std::size_t kBufferMinSize = 128; ++ ++ Iterator itr_; + }; + + } // namespace record +diff --color -Naur cyber/record/record_writer.cc /opt/apollo/cyber/record/record_writer.cc +--- cyber/record/record_writer.cc 2023-12-23 18:23:13.090910841 +0800 ++++ /opt/apollo/cyber/record/record_writer.cc 2023-12-23 18:05:58.583028978 +0800 +@@ -20,11 +20,13 @@ + #include + + #include "cyber/common/log.h" ++#include "cyber/common/time_conversion.h" + + namespace apollo { + namespace cyber { + namespace record { + ++using apollo::cyber::common::UnixSecondsToString; + using proto::Channel; + using proto::SingleMessage; + +@@ -39,9 +41,10 @@ + file_index_ = 0; + sstream_.str(std::string()); + sstream_.clear(); +- sstream_ << "." << std::setw(5) << std::setfill('0') << file_index_++; ++ sstream_ << "." << std::setw(5) << std::setfill('0') << file_index_++ << "."; + if (header_.segment_interval() > 0 || header_.segment_raw_size() > 0) { +- path_ = file_ + sstream_.str(); ++ path_ = file_ + sstream_.str() + ++ UnixSecondsToString(time(nullptr), "%Y%m%d%H%M%S"); + } else { + path_ = file_; + } +@@ -75,8 +78,9 @@ + } + sstream_.str(std::string()); + sstream_.clear(); +- sstream_ << "." << std::setw(5) << std::setfill('0') << file_index_++; +- path_ = file_ + sstream_.str(); ++ sstream_ << "." << std::setw(5) << std::setfill('0') << file_index_++ << "."; ++ path_ = file_ + sstream_.str() + ++ UnixSecondsToString(time(nullptr), "%Y%m%d%H%M%S"); + segment_raw_size_ = 0; + segment_begin_time_ = 0; + if (!file_writer_->Open(path_)) { +diff --color -Naur cyber/scheduler/BUILD /opt/apollo/cyber/scheduler/BUILD +--- cyber/scheduler/BUILD 2023-12-23 18:23:13.091910841 +0800 ++++ /opt/apollo/cyber/scheduler/BUILD 2023-12-23 18:05:58.584028978 +0800 +@@ -1,124 +1,46 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_library", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_scheduler_hdrs", +- srcs = glob([ +- "*.h", +- "**/*.h" +- ]), +-) +- +-cc_library( +- name = "processor", +- srcs = ["processor.cc"], +- hdrs = ["processor.h"], +- deps = [ +- "//cyber/data", +- "//cyber/scheduler:processor_context", +- ], +-) +- +-cc_library( +- name = "processor_context", +- srcs = ["processor_context.cc"], +- hdrs = ["processor_context.h"], +- deps = [ +- "//cyber/croutine", +- "//cyber/data", +- ], +-) +- +-cc_library( +- name = "scheduler", +- srcs = ["scheduler.cc"], +- hdrs = ["scheduler.h"], +- deps = [ +- "//cyber/croutine", +- "//cyber/scheduler:mutex_wrapper", +- "//cyber/scheduler:pin_thread", +- "//cyber/scheduler:processor", +- ], +-) +- +-cc_library( +- name = "mutex_wrapper", +- hdrs = ["common/mutex_wrapper.h"], +-) +- +-cc_library( +- name = "cv_wrapper", +- hdrs = ["common/cv_wrapper.h"], +-) +- +-cc_library( +- name = "pin_thread", +- srcs = ["common/pin_thread.cc"], +- hdrs = ["common/pin_thread.h"], +- deps = [ +- "//cyber/common:log", +- ], +-) +- +-cc_library( +- name = "scheduler_factory", +- srcs = ["scheduler_factory.cc"], +- hdrs = ["scheduler_factory.h"], +- deps = [ ++apollo_cc_library( ++ name = "cyber_scheduler", ++ srcs = [ ++ "processor.cc", ++ "processor_context.cc", ++ "scheduler.cc", ++ "scheduler_factory.cc", ++ "common/pin_thread.cc", ++ "policy/choreography_context.cc", ++ "policy/classic_context.cc", ++ "policy/scheduler_choreography.cc", ++ "policy/scheduler_classic.cc", ++ ], ++ hdrs = [ ++ "processor.h", ++ "processor_context.h", ++ "scheduler.h", ++ "scheduler_factory.h", ++ "common/cv_wrapper.h", ++ "common/mutex_wrapper.h", ++ "common/pin_thread.h", ++ "policy/choreography_context.h", ++ "policy/classic_context.h", ++ "policy/scheduler_choreography.h", ++ "policy/scheduler_classic.h", ++ ], ++ deps = [ ++ "//cyber/croutine:cyber_croutine", ++ "//cyber/data:cyber_data", ++ "//cyber/common:cyber_common", ++ "//cyber/time:cyber_time", + "//cyber/proto:component_conf_cc_proto", +- "//cyber/scheduler:scheduler_choreography", +- "//cyber/scheduler:scheduler_classic", +- ], +-) +- +-cc_library( +- name = "scheduler_choreography", +- srcs = ["policy/scheduler_choreography.cc"], +- hdrs = ["policy/scheduler_choreography.h"], +- deps = [ +- "//cyber/scheduler", +- "//cyber/scheduler:choreography_context", +- "//cyber/scheduler:classic_context", +- ], +-) +- +-cc_library( +- name = "scheduler_classic", +- srcs = ["policy/scheduler_classic.cc"], +- hdrs = ["policy/scheduler_classic.h"], +- deps = [ +- "//cyber/scheduler", +- "//cyber/scheduler:classic_context", +- ], +-) +- +-cc_library( +- name = "choreography_context", +- srcs = ["policy/choreography_context.cc"], +- hdrs = ["policy/choreography_context.h"], +- deps = [ +- "//cyber/croutine", + "//cyber/proto:choreography_conf_cc_proto", +- "//cyber/scheduler:processor", +- ], +-) +- +-cc_library( +- name = "classic_context", +- srcs = ["policy/classic_context.cc"], +- hdrs = ["policy/classic_context.h"], +- deps = [ +- "//cyber/croutine", + "//cyber/proto:classic_conf_cc_proto", +- "//cyber/scheduler:cv_wrapper", +- "//cyber/scheduler:mutex_wrapper", +- "//cyber/scheduler:processor", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "scheduler_test", + size = "small", + srcs = ["scheduler_test.cc"], +@@ -129,7 +51,7 @@ + linkstatic = True, + ) + +-cc_test( ++apollo_cc_test( + name = "scheduler_classic_test", + size = "small", + srcs = ["scheduler_classic_test.cc"], +@@ -140,7 +62,7 @@ + linkstatic = True, + ) + +-cc_test( ++apollo_cc_test( + name = "scheduler_choreo_test", + size = "small", + srcs = ["scheduler_choreo_test.cc"], +@@ -151,7 +73,7 @@ + linkstatic = True, + ) + +-cc_test( ++apollo_cc_test( + name = "processor_test", + size = "small", + srcs = ["processor_test.cc"], +@@ -162,7 +84,7 @@ + linkstatic = True, + ) + +-cc_test( ++apollo_cc_test( + name = "pin_thread_test", + size = "small", + srcs = ["common/pin_thread_test.cc"], +@@ -173,4 +95,5 @@ + linkstatic = True, + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/service/BUILD /opt/apollo/cyber/service/BUILD +--- cyber/service/BUILD 2023-12-23 18:23:13.092910841 +0800 ++++ /opt/apollo/cyber/service/BUILD 2023-12-23 18:05:58.585028978 +0800 +@@ -1,40 +1,21 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_service_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "client", +- hdrs = ["client.h"], +- deps = [ +- ":client_base", ++apollo_cc_library( ++ name = "cyber_service", ++ hdrs = [ ++ "client.h", ++ "service.h", ++ "service_base.h", ++ "client_base.h" + ], +-) +- +-cc_library( +- name = "client_base", +- hdrs = ["client_base.h"], +-) +- +-cc_library( +- name = "service", +- hdrs = ["service.h"], + deps = [ +- ":service_base", +- "//cyber/scheduler", ++ "//cyber/scheduler:cyber_scheduler", + ], + ) + +-cc_library( +- name = "service_base", +- hdrs = ["service_base.h"], +-) ++apollo_package() + + cpplint() +diff --color -Naur cyber/service_discovery/BUILD /opt/apollo/cyber/service_discovery/BUILD +--- cyber/service_discovery/BUILD 2023-12-23 18:23:13.092910841 +0800 ++++ /opt/apollo/cyber/service_discovery/BUILD 2023-12-23 18:05:58.585028978 +0800 +@@ -1,30 +1,62 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_service_discovery_hdrs", +- srcs = glob([ +- "*.h", +- "**/*.h", +- ]), ++apollo_cc_library( ++ name = "cyber_service_discovery", ++ srcs = [ ++ "topology_manager.cc", ++ "communication/participant_listener.cc", ++ "communication/subscriber_listener.cc", ++ "container/graph.cc", ++ "container/multi_value_warehouse.cc", ++ "container/single_value_warehouse.cc", ++ "specific_manager/channel_manager.cc", ++ "specific_manager/manager.cc", ++ "specific_manager/node_manager.cc", ++ "specific_manager/service_manager.cc", ++ ], ++ hdrs = [ ++ "topology_manager.h", ++ "communication/participant_listener.h", ++ "communication/subscriber_listener.h", ++ "container/graph.h", ++ "container/multi_value_warehouse.h", ++ "container/single_value_warehouse.h", ++ "container/warehouse_base.h", ++ "specific_manager/channel_manager.h", ++ "specific_manager/manager.h", ++ "specific_manager/node_manager.h", ++ "specific_manager/service_manager.h", ++ ], ++ deps = [ ++ "//cyber/transport:cyber_transport", ++ "//cyber/base:cyber_base", ++ "//cyber/common:cyber_common", ++ "//cyber:cyber_binary", ++ "//cyber/proto:role_attributes_cc_proto", ++ "@fastrtps", ++ "//cyber:cyber_state", ++ "//cyber/message:cyber_message", ++ "//cyber/proto:proto_desc_cc_proto", ++ "//cyber/proto:topology_change_cc_proto", ++ "//cyber/time:cyber_time", ++ ], + ) + +-cc_library( +- name = "topology_manager", +- srcs = ["topology_manager.cc"], +- hdrs = ["topology_manager.h"], ++apollo_cc_library( ++ name = "cyber_service_discovery_role", ++ srcs = ["role/role.cc"], ++ hdrs = ["role/role.h"], + deps = [ +- ":channel_manager", +- ":node_manager", +- ":service_manager", +- "//cyber/service_discovery/communication:participant_listener", +- "//cyber/transport/rtps:participant", ++ "//cyber:cyber_binary", ++ "//cyber/common:cyber_common", ++ "//cyber/proto:role_attributes_cc_proto", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "topology_manager_test", + size = "small", + srcs = ["topology_manager_test.cc"], +@@ -34,14 +66,7 @@ + ], + ) + +-cc_library( +- name = "graph", +- srcs = ["container/graph.cc"], +- hdrs = ["container/graph.h"], +- deps = ["//cyber/base:atomic_rw_lock"], +-) +- +-cc_test( ++apollo_cc_test( + name = "graph_test", + size = "small", + srcs = ["container/graph_test.cc"], +@@ -52,65 +77,27 @@ + linkstatic = True, + ) + +-cc_library( +- name = "multi_value_warehouse", +- srcs = ["container/multi_value_warehouse.cc"], +- hdrs = ["container/multi_value_warehouse.h"], +- deps = [ +- ":warehouse_base", +- "//cyber/base:atomic_rw_lock", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "multi_value_warehouse_test", + size = "small", + srcs = ["container/multi_value_warehouse_test.cc"], + deps = [ +- ":multi_value_warehouse", ++ ":cyber_service_discovery", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "single_value_warehouse", +- srcs = ["container/single_value_warehouse.cc"], +- hdrs = ["container/single_value_warehouse.h"], +- deps = [ +- ":warehouse_base", +- "//cyber/base:atomic_rw_lock", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "single_value_warehouse_test", + size = "small", + srcs = ["container/single_value_warehouse_test.cc"], + deps = [ +- ":single_value_warehouse", ++ ":cyber_service_discovery", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "warehouse_base", +- hdrs = ["container/warehouse_base.h"], +- deps = ["role"], +-) +- +-cc_library( +- name = "role", +- srcs = ["role/role.cc"], +- hdrs = ["role/role.h"], +- deps = [ +- "//cyber:binary", +- "//cyber/common:log", +- "//cyber/common:types", +- "//cyber/proto:role_attributes_cc_proto", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "role_test", + size = "small", + srcs = ["role/role_test.cc"], +@@ -120,40 +107,7 @@ + ], + ) + +-cc_library( +- name = "manager", +- srcs = ["specific_manager/manager.cc"], +- hdrs = ["specific_manager/manager.h"], +- deps = [ +- "//cyber:state", +- "//cyber/base:signal", +- "//cyber/message:message_traits", +- "//cyber/message:protobuf_factory", +- "//cyber/proto:proto_desc_cc_proto", +- "//cyber/proto:role_attributes_cc_proto", +- "//cyber/proto:topology_change_cc_proto", +- "//cyber/service_discovery/communication:subscriber_listener", +- "//cyber/time", +- "//cyber/transport/qos", +- "//cyber/transport/rtps:attributes_filler", +- "//cyber/transport/rtps:underlay_message_type", +- "@fastrtps", +- ], +-) +- +-cc_library( +- name = "channel_manager", +- srcs = ["specific_manager/channel_manager.cc"], +- hdrs = ["specific_manager/channel_manager.h"], +- deps = [ +- ":graph", +- ":manager", +- ":multi_value_warehouse", +- ":single_value_warehouse", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "channel_manager_test", + size = "small", + srcs = ["specific_manager/channel_manager_test.cc"], +@@ -165,18 +119,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "node_manager", +- srcs = ["specific_manager/node_manager.cc"], +- hdrs = ["specific_manager/node_manager.h"], +- deps = [ +- ":manager", +- ":multi_value_warehouse", +- ":single_value_warehouse", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "node_manager_test", + size = "small", + srcs = ["specific_manager/node_manager_test.cc"], +@@ -187,18 +130,7 @@ + linkstatic = True, + ) + +-cc_library( +- name = "service_manager", +- srcs = ["specific_manager/service_manager.cc"], +- hdrs = ["specific_manager/service_manager.h"], +- deps = [ +- ":manager", +- ":multi_value_warehouse", +- ":single_value_warehouse", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "service_manager_test", + size = "small", + srcs = ["specific_manager/service_manager_test.cc"], +@@ -209,4 +141,5 @@ + linkstatic = True, + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/service_discovery/communication/BUILD /opt/apollo/cyber/service_discovery/communication/BUILD +--- cyber/service_discovery/communication/BUILD 2023-12-23 18:23:13.093910841 +0800 ++++ /opt/apollo/cyber/service_discovery/communication/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,35 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-filegroup( +- name = "cyber_service_discovery_communication_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "participant_listener", +- srcs = ["participant_listener.cc"], +- hdrs = ["participant_listener.h"], +- deps = [ +- "//cyber/common:log", +- "@fastrtps", +- ], +-) +- +-cc_library( +- name = "subscriber_listener", +- srcs = ["subscriber_listener.cc"], +- hdrs = ["subscriber_listener.h"], +- deps = [ +- "//cyber/common:log", +- "//cyber/transport/rtps:underlay_message", +- "//cyber/transport/rtps:underlay_message_type", +- "@fastrtps", +- ], +-) +- +-cpplint() +diff --color -Naur cyber/setup.bash /opt/apollo/cyber/setup.bash +--- cyber/setup.bash 2023-12-23 18:23:13.078910841 +0800 ++++ /opt/apollo/cyber/setup.bash 2023-12-23 18:05:58.586028978 +0800 +@@ -27,6 +27,8 @@ + done + + pathprepend ${bazel_bin_path}/cyber/python/internal PYTHONPATH ++pathprepend "${PYTHON_INSTALL_PATH}/lib/python${PYTHON_VERSION}/site-packages" PYTHONPATH ++pathprepend "${PYTHON_INSTALL_PATH}/bin/" PATH + + export CYBER_DOMAIN_ID=80 + export CYBER_IP=127.0.0.1 +diff --color -Naur cyber/sysmo/BUILD /opt/apollo/cyber/sysmo/BUILD +--- cyber/sysmo/BUILD 2023-12-23 18:23:13.081910841 +0800 ++++ /opt/apollo/cyber/sysmo/BUILD 2023-12-23 18:05:58.587028978 +0800 +@@ -1,33 +1,27 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_sysmo_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_test( ++apollo_cc_test( + name = "sysmo_test", + size = "small", + srcs = ["sysmo_test.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "@com_google_googletest//:gtest_main", + ], + linkstatic = True, + ) + +-cc_library( +- name = "sysmo", ++apollo_cc_library( ++ name = "cyber_sysmo", + srcs = ["sysmo.cc"], + hdrs = ["sysmo.h"], + deps = [ +- "//cyber/scheduler:scheduler_factory", ++ "//cyber/scheduler:cyber_scheduler", + ], + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/task/BUILD /opt/apollo/cyber/task/BUILD +--- cyber/task/BUILD 2023-12-23 18:23:13.094910841 +0800 ++++ /opt/apollo/cyber/task/BUILD 2023-12-23 18:05:58.587028978 +0800 +@@ -1,42 +1,28 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_task_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "task", +- hdrs = ["task.h"], ++apollo_cc_library( ++ name = "cyber_task", ++ hdrs = ["task.h", "task_manager.h"], ++ srcs = ["task_manager.cc"], ++ copts = ["-faligned-new"], + deps = [ +- ":task_manager", ++ "//cyber/scheduler:cyber_scheduler", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "task_test", + size = "small", + srcs = ["task_test.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "@com_google_googletest//:gtest_main", + ], + linkstatic = True, + ) + +-cc_library( +- name = "task_manager", +- srcs = ["task_manager.cc"], +- hdrs = ["task_manager.h"], +- copts = ["-faligned-new"], +- deps = [ +- "//cyber/scheduler:scheduler_factory", +- ], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/time/BUILD /opt/apollo/cyber/time/BUILD +--- cyber/time/BUILD 2023-12-23 18:23:13.094910841 +0800 ++++ /opt/apollo/cyber/time/BUILD 2023-12-23 18:05:58.587028978 +0800 +@@ -1,85 +1,58 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_time_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "time", +- srcs = ["time.cc"], +- hdrs = ["time.h"], ++apollo_cc_library( ++ name = "cyber_time", ++ srcs = [ ++ "clock.cc", ++ "duration.cc", ++ "rate.cc", ++ "time.cc", ++ ], ++ hdrs = [ ++ "clock.h", ++ "duration.h", ++ "rate.h", ++ "time.h", ++ ], + deps = [ +- ":duration", ++ "//cyber/common:cyber_common", ++ "//cyber/base:cyber_base", ++ "//cyber/proto:run_mode_conf_cc_proto", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "time_test", + size = "small", + srcs = ["time_test.cc"], + deps = [ +- ":time", ++ ":cyber_time", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "rate", +- srcs = ["rate.cc"], +- hdrs = ["rate.h"], +- deps = [ +- ":duration", +- ":time", +- "//cyber/common:log", +- ], +-) +- +-cc_library( +- name = "duration", +- srcs = ["duration.cc"], +- hdrs = ["duration.h"], +-) +- +-cc_test( ++apollo_cc_test( + name = "duration_test", + size = "small", + srcs = ["duration_test.cc"], + deps = [ +- ":duration", +- ":time", ++ ":cyber_time", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_library( +- name = "clock", +- srcs = ["clock.cc"], +- hdrs = ["clock.h"], +- deps = [ +- ":time", +- "//cyber/base:atomic_rw_lock", +- "//cyber/common:global_data", +- "//cyber/common:log", +- "//cyber/common:macros", +- "//cyber/common:util", +- "//cyber/proto:run_mode_conf_cc_proto", +- ], +-) +- +-cc_test( ++apollo_cc_test( + name = "clock_test", + size = "small", + srcs = ["clock_test.cc"], + deps = [ +- ":clock", ++ ":cyber_time", + "@com_google_googletest//:gtest_main", + ], + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/timer/BUILD /opt/apollo/cyber/timer/BUILD +--- cyber/timer/BUILD 2023-12-23 18:23:13.094910841 +0800 ++++ /opt/apollo/cyber/timer/BUILD 2023-12-23 18:05:58.588028978 +0800 +@@ -1,60 +1,37 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_timer_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "timer", +- srcs = ["timer.cc"], +- hdrs = ["timer.h"], +- deps = [ +- ":timing_wheel", +- "//cyber/common:global_data", ++apollo_cc_library( ++ name = "cyber_timer", ++ srcs = [ ++ "timer.cc", ++ "timing_wheel.cc", + ], +-) +- +-cc_library( +- name = "timer_task", +- hdrs = ["timer_task.h"], +-) +- +-cc_library( +- name = "timer_bucket", +- hdrs = ["timer_bucket.h"], +- deps = [ +- ":timer_task", ++ hdrs = [ ++ "timer.h", ++ "timer_task.h", ++ "timer_bucket.h", ++ "timing_wheel.h" + ], +-) +- +-cc_library( +- name = "timing_wheel", +- srcs = ["timing_wheel.cc"], +- hdrs = ["timing_wheel.h"], + deps = [ +- ":timer_bucket", +- "//cyber/task", +- "//cyber/time", +- "//cyber/time:duration", +- "//cyber/time:rate", ++ "//cyber/common:cyber_common", ++ "//cyber/task:cyber_task", ++ "//cyber/time:cyber_time", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "timer_test", + size = "small", + srcs = ["timer_test.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "@com_google_googletest//:gtest_main", + ], + linkstatic = True, + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/tools/BUILD /opt/apollo/cyber/tools/BUILD +--- cyber/tools/BUILD 2023-12-23 18:23:13.095910841 +0800 ++++ /opt/apollo/cyber/tools/BUILD 2023-12-23 18:05:58.588028978 +0800 +@@ -1,17 +1,7 @@ +-load("//tools/install:install.bzl", "install") ++load("//tools:apollo_package.bzl", "apollo_package") + + package( + default_visibility = ["//visibility:public"], + ) + +-install( +- name = "install", +- deps = [ +- "//cyber/tools/cyber_launch:install", +- "//cyber/tools/cyber_monitor:install", +- "//cyber/tools/cyber_recorder:install", +- "//cyber/tools/cyber_channel:install", +- "//cyber/tools/cyber_node:install", +- "//cyber/tools/cyber_service:install", +- ], +-) ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/tools/cyber_channel/BUILD /opt/apollo/cyber/tools/cyber_channel/BUILD +--- cyber/tools/cyber_channel/BUILD 2023-12-23 18:23:13.095910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_channel/BUILD 2023-12-23 18:05:58.588028978 +0800 +@@ -1,5 +1,6 @@ + load("@rules_python//python:defs.bzl", "py_binary") +-load("//tools/install:install.bzl", "install") ++# load("//tools/install:install.bzl", "install") ++load("//tools:apollo_package.bzl", "apollo_package") + + package( + default_visibility = ["//visibility:public"], +@@ -15,8 +16,10 @@ + ], + ) + +-install( +- name = "install", +- py_dest = "cyber/bin", +- targets = [":cyber_channel"] +-) ++# install( ++# name = "install", ++# py_dest = "cyber/bin", ++# targets = [":cyber_channel"] ++# ) ++ ++apollo_package() +diff --color -Naur cyber/tools/cyber_launch/BUILD /opt/apollo/cyber/tools/cyber_launch/BUILD +--- cyber/tools/cyber_launch/BUILD 2023-12-23 18:23:13.095910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_launch/BUILD 2023-12-23 18:05:58.588028978 +0800 +@@ -1,5 +1,6 @@ + load("@rules_python//python:defs.bzl", "py_binary") +-load("//tools/install:install.bzl", "install_files") ++# load("//tools/install:install.bzl", "install_files") ++load("//tools:apollo_package.bzl", "apollo_package") + + package( + default_visibility = ["//visibility:public"], +@@ -13,13 +14,15 @@ + + # Note(storypku): + # Workaround for install support of Python not ready. +-install_files( +- name = "install", +- dest = "cyber/bin", +- files = [ +- ":cyber_launch.py", +- ], +- rename = { +- "cyber/bin/cyber_launch.py": "cyber_launch", +- }, +-) ++# install_files( ++# name = "install", ++# dest = "cyber/bin", ++# files = [ ++# ":cyber_launch.py", ++# ], ++# rename = { ++# "cyber/bin/cyber_launch.py": "cyber_launch", ++# }, ++# ) ++ ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/tools/cyber_launch/cyber_launch.py /opt/apollo/cyber/tools/cyber_launch/cyber_launch.py +--- cyber/tools/cyber_launch/cyber_launch.py 2023-12-23 18:23:13.095910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_launch/cyber_launch.py 2023-12-23 18:05:58.588028978 +0800 +@@ -31,12 +31,13 @@ + + + g_binary_name = 'mainboard' +-g_pwd = os.getcwd() + g_script_name = os.path.basename(sys.argv[0]).split(".")[0] + g_process_pid = os.getpid() + g_process_name = g_script_name + "_" + str(g_process_pid) ++g_default_respawn_limit = 3 + +-cyber_path = os.getenv('CYBER_PATH') ++launch_path = os.getenv('APOLLO_LAUNCH_PATH') or '/apollo' ++force_stop_timeout_secs = 3 + + """ + colorful logging +@@ -84,7 +85,6 @@ + + def exit_handler(): + stop() +- os.chdir(g_pwd) + logger.info('cyber_launch exit.') + + +@@ -112,25 +112,42 @@ + + class ProcessWrapper(object): + +- def __init__(self, binary_path, dag_num, dag_list, process_name, +- process_type, sched_name, exception_handler=''): ++ def __init__(self, binary_path, dag_num, dag_list, plugin_list, process_name, process_type, ++ sched_name, extra_args_list, exception_handler='', respawn_limit=g_default_respawn_limit): + self.time_of_death = None + self.started = False + self.binary_path = binary_path + self.dag_num = dag_num + self.dag_list = dag_list ++ self.plugin_list = plugin_list + self.name = process_name + self.sched_name = sched_name ++ self.extra_args_list = extra_args_list + self.process_type = process_type + self.popen = None + self.exit_code = None + self.args = [] + self.pid = -1 + self.exception_handler = exception_handler ++ self.respawn_limit = respawn_limit ++ self.respawn_cnt = 0 + +- def wait(self): ++ def wait(self, timeout_secs=None): ++ """ ++ Waiting for process terminal by call Popen.wait function ++ """ ++ if self.started: ++ if timeout_secs: ++ self.popen.wait(timeout_secs) ++ else: ++ self.popen.wait() ++ ++ def kill(self): ++ """ ++ Force kill process ++ """ + if self.started: +- self.popen.wait() ++ self.popen.kill() + + def start(self): + """ +@@ -143,12 +160,17 @@ + for i in self.dag_list: + args_list.append('-d') + args_list.append(i) ++ for i in self.plugin_list: ++ args_list.append('--plugin') ++ args_list.append(i) + if len(self.name) != 0: + args_list.append('-p') + args_list.append(self.name) + if len(self.sched_name) != 0: + args_list.append('-s') + args_list.append(self.sched_name) ++ if len(self.extra_args_list) != 0: ++ args_list.extend(self.extra_args_list) + + self.args = args_list + +@@ -160,7 +182,7 @@ + return 2 + else: + if self.popen.pid == 0 or self.popen.returncode is not None: +- logger.error('Start process [%s] failed.' % self.name) ++ logger.error('Start process [%s] failed.', self.name) + return 2 + + th = threading.Thread(target=module_monitor, args=(self, )) +@@ -168,8 +190,7 @@ + th.start() + self.started = True + self.pid = self.popen.pid +- logger.info('Start process [%s] successfully. pid: %d' % +- (self.name, self.popen.pid)) ++ logger.info('Start process [%s] successfully. pid: %d', self.name, self.popen.pid) + logger.info('-' * 120) + return 0 + +@@ -227,11 +248,9 @@ + @type p: L{Process} + """ + if self.has_process(p.name): +- logger.error( +- 'Cannot add process due to duplicate name "%s".' % p.name) ++ logger.error('Cannot add process due to duplicate name "%s".', p.name) + elif self.is_shutdown: +- logger.error( +- 'Cannot add process [%s] due to monitor has been stopped.' % p.name) ++ logger.error('Cannot add process [%s] due to monitor has been stopped.', p.name) + else: + self.procs.append(p) + +@@ -251,26 +270,21 @@ + for pw in self.procs: + if self.is_shutdown: + break +- if pw.process_type == 'binary': ++ if pw.is_alive(): + continue +- try: +- if not pw.is_alive(): +- if pw.exception_handler == "respawn": +- logger.warning( +- 'child process [%s][%d] exit, respawn!' % (pw.name, pw.pid)) +- result = pw.start() +- if result != 0: +- logger.error( +- 'respawn process [%s] failed, stop all!' % (pw.name)) +- stop() +- elif pw.exception_handler == "exit": +- logger.warning( +- 'child process [%s][%d] exit, stop all' % (pw.name, pw.pid)) +- stop() ++ if pw.exception_handler == "respawn": ++ if pw.respawn_cnt < pw.respawn_limit: ++ logger.warning('child process [%s][%d] exit, respawn!', pw.name, pw.pid) ++ pw.start() ++ pw.respawn_cnt += 1 ++ else: + dead_cnt += 1 +- except Exception: ++ elif pw.exception_handler == "exit": ++ logger.warning('child process [%s][%d] exit, stop all', pw.name, pw.pid) ++ # stop and exit ++ stop() ++ else: + dead_cnt += 1 +- traceback.print_exc() + if dead_cnt > 0: + self.dead_cnt = dead_cnt + if self.dead_cnt == len(self.procs): +@@ -300,158 +314,117 @@ + + for p in self.procs: + if p.is_alive(): +- logger.warning('Waiting for [%s][%s] exit.' % (p.name, p.pid)) ++ logger.warning('Waiting for [%s][%s] exit.', p.name, p.pid) ++ try: ++ p.wait(force_stop_timeout_secs) ++ except subprocess.TimeoutExpired as e: ++ logger.warning("Begin force kill process [%s][%s].", p.name, p.pid) ++ p.kill() + p.wait() +- logger.info( +- 'Process [%s] has been stopped. dag_file: %s' % (p.name, p.dag_list)) ++ logger.info('Process [%s] has been stopped. dag_file: %s', p.name, p.dag_list) + # Reset members + self.procs = [] + self.dead_cnt = 0 + + ++def get_param_value(module, key, default_value=''): ++ """ ++ Get param value by key from xml conf reader. ++ @param module: xml module section ++ @param key: param name ++ @param default_value: if not found key, return the default value ++ """ ++ value = module.find(key) ++ if value is None or value.text is None: ++ return default_value ++ return value.text.strip() ++ ++ ++def get_param_list(module, key): ++ """ ++ Get param list info by key from xml conf reader. ++ @param module: xml module section ++ @param key: param name ++ """ ++ l = [] ++ for v in module.findall(key): ++ if v.text is None: ++ continue ++ value = v.text.strip() ++ if value: ++ l.append(value) ++ return l ++ ++ + def start(launch_file=''): + """ + Start all modules in xml config + """ + pmon = ProcessMonitor() + # Find launch file +- if launch_file[0] == '/': +- launch_file = launch_file +- elif launch_file == os.path.basename(launch_file): +- launch_file = os.path.join(cyber_path, 'launch', launch_file) +- else: +- if os.path.exists(os.path.join(g_pwd, launch_file)): +- launch_file = os.path.join(g_pwd, launch_file) ++ if not os.path.isfile(launch_file): ++ filename = os.path.join(launch_path, launch_file) ++ if os.path.isfile(filename): ++ launch_file = filename + else: +- logger.error('Cannot find launch file: %s ' % launch_file) ++ logger.error('Cannot find launch file: %s ', launch_file) + sys.exit(1) +- logger.info('Launch file [%s]' % launch_file) ++ logger.info('Launch file [%s]', launch_file) + logger.info('=' * 120) + +- if not os.path.isfile(launch_file): +- logger.error('Launch xml file %s does not exist' % launch_file) +- sys.exit(1) +- + try: + tree = ET.parse(launch_file) + except Exception: + logger.error('Parse xml failed. illegal xml!') + sys.exit(1) +- total_dag_num = 0 +- dictionary = {} +- dag_dict = {} +- root1 = tree.getroot() +- for module in root1.findall('module'): +- process_name = module.find('process_name').text +- process_type = module.find('type') +- if process_type is None: +- process_type = 'library' +- else: +- process_type = process_type.text +- if process_type is None: +- process_type = 'library' +- process_type = process_type.strip() +- if process_type != 'binary': +- dag_list = [] +- for dag_conf in module.findall('dag_conf'): +- if dag_conf.text is None: +- continue +- dag = dag_conf.text.strip() +- if len(dag) > 0: +- dag_list.append(dag) +- if len(dag_list) == 0: +- logger.error('Library dag conf is null') +- continue +- else: +- total_dag_num += len(dag_list) +- +- if process_name is None: +- process_name = 'mainboard_default_' + str(os.getpid()) +- process_name = process_name.strip() +- if str(process_name) in dictionary: +- dictionary[str(process_name)] += 1 +- else: +- dictionary[str(process_name)] = 1 +- if str(process_name) not in dag_dict: +- dag_dict[str(process_name)] = dag_list +- else: +- dag_dict[str(process_name)].extend(dag_list) + +- process_list = [] + root = tree.getroot() ++ # set environment + for env in root.findall('environment'): + for var in env.getchildren(): + os.environ[var.tag] = str(var.text) ++ # start each process + for module in root.findall('module'): +- module_name = module.find('name').text +- dag_conf = module.find('dag_conf').text +- process_name = module.find('process_name').text +- sched_name = module.find('sched_name') +- process_type = module.find('type') +- exception_handler = module.find('exception_handler') +- if process_type is None: +- process_type = 'library' ++ module_name = get_param_value(module, 'name') ++ process_name = get_param_value(module, 'process_name', 'mainboard_default_' + str(os.getpid())) ++ sched_name = get_param_value(module, 'sched_name', 'CYBER_DEFAULT') ++ process_type = get_param_value(module, 'type', 'library') ++ exception_handler = get_param_value(module, 'exception_handler') ++ respawn_limit_txt = get_param_value(module, 'respawn_limit') ++ if respawn_limit_txt.isnumeric(): ++ respawn_limit = int(respawn_limit_txt) + else: +- process_type = process_type.text +- if process_type is None: +- process_type = 'library' +- process_type = process_type.strip() +- +- if sched_name is None: +- sched_name = "CYBER_DEFAULT" +- else: +- sched_name = sched_name.text +- +- if process_name is None: +- process_name = 'mainboard_default_' + str(os.getpid()) +- dag_list = [] +- for dag_conf in module.findall('dag_conf'): +- if dag_conf.text is None: ++ respawn_limit = g_default_respawn_limit ++ logger.info('Load module [%s] %s: [%s] [%s] conf, exception_handler: [%s], respawn_limit: [%d]', ++ module_name, process_type, process_name, sched_name, exception_handler, respawn_limit) ++ ++ if process_type == 'binary': ++ if len(process_name) == 0: ++ logger.error('Start binary failed. Binary process_name is null.') + continue +- dag = dag_conf.text.strip() +- if len(dag) > 0: +- dag_list.append(dag) +- if module_name is None: +- module_name = '' +- if exception_handler is None: +- exception_handler = '' ++ pw = ProcessWrapper(process_name.split()[0], 0, [""], [], process_name, process_type, ++ sched_name, [], exception_handler, respawn_limit) ++ # Default is library + else: +- exception_handler = exception_handler.text +- module_name = module_name.strip() +- process_name = process_name.strip() +- sched_name = sched_name.strip() +- exception_handler = exception_handler.strip() +- +- logger.info('Load module [%s] %s: [%s] [%s] conf: [%s] exception_handler: [%s]' % +- (module_name, process_type, process_name, sched_name, ', '.join(dag_list), +- exception_handler)) +- +- if process_name not in process_list: +- if process_type == 'binary': +- if len(process_name) == 0: +- logger.error( +- 'Start binary failed. Binary process_name is null.') +- continue +- pw = ProcessWrapper( +- process_name.split()[0], 0, [ +- ""], process_name, process_type, +- exception_handler) +- # Default is library +- else: +- pw = ProcessWrapper( +- g_binary_name, 0, dag_dict[ +- str(process_name)], process_name, +- process_type, sched_name, exception_handler) +- result = pw.start() +- if result != 0: +- logger.error( +- 'Start manager [%s] failed. Stop all!' % process_name) +- stop() +- pmon.register(pw) +- process_list.append(process_name) ++ dag_list = get_param_list(module, 'dag_conf') ++ if not dag_list: ++ logger.error('module [%s] library dag conf is null.', module_name) ++ continue ++ plugin_list = get_param_list(module, 'plugin') ++ extra_args_list = [] ++ extra_args = module.attrib.get('extra_args') ++ if extra_args is not None: ++ extra_args_list = extra_args.split() ++ pw = ProcessWrapper(g_binary_name, 0, dag_list, plugin_list, process_name, process_type, ++ sched_name, extra_args_list, exception_handler, respawn_limit) ++ result = pw.start() ++ if result != 0: ++ logger.error('Start manager [%s] failed. Stop all!', process_name) ++ stop() ++ pmon.register(pw) + + # No module in xml +- if not process_list: ++ if not pmon.procs: + logger.error("No module was found in xml config.") + return + all_died = pmon.run() +@@ -498,11 +471,6 @@ + """ + Main function + """ +- if cyber_path is None: +- logger.error( +- 'Error: environment variable CYBER_PATH not found, set environment first.') +- sys.exit(1) +- os.chdir(cyber_path) + parser = argparse.ArgumentParser(description='cyber launcher') + subparsers = parser.add_subparsers(help='sub-command help') + +diff --color -Naur cyber/tools/cyber_monitor/BUILD /opt/apollo/cyber/tools/cyber_monitor/BUILD +--- cyber/tools/cyber_monitor/BUILD 2023-12-23 18:23:13.095910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_monitor/BUILD 2023-12-23 18:05:58.588028978 +0800 +@@ -1,18 +1,10 @@ +-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") + load("//tools:cpplint.bzl", "cpplint") +-load("//tools/install:install.bzl", "install") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_binary") + + package(default_visibility = ["//visibility:public"]) + +-install( +- name = "install", +- runtime_dest = "cyber/bin", +- targets = [ +- ":cyber_monitor", +- ], +-) + +-cc_binary( ++apollo_cc_binary( + name = "cyber_monitor", + srcs = [ + "cyber_topology_message.cc", +@@ -22,68 +14,19 @@ + "main.cc", + "renderable_message.cc", + "screen.cc", ++ "cyber_topology_message.h", ++ "general_channel_message.h", ++ "general_message.h", ++ "general_message_base.h", ++ "renderable_message.h", ++ "screen.h", + ], + linkopts = ["-pthread"], + deps = [ +- ":cyber_topology_message", +- ":general_channel_message", +- ":screen", +- "//cyber:init", +- "//cyber/service_discovery:topology_manager", +- "@ncurses5", +- ], +-) +- +-cc_library( +- name = "cyber_topology_message", +- hdrs = ["cyber_topology_message.h"], +- deps = [ +- ":renderable_message", +- ], +-) +- +-cc_library( +- name = "general_channel_message", +- hdrs = ["general_channel_message.h"], +- deps = [ +- ":general_message", +- ":general_message_base", +- ":screen", + "//cyber", +- "//cyber/message:raw_message", +- "//cyber/record:record_message", +- ], +-) +- +-cc_library( +- name = "general_message", +- hdrs = ["general_message.h"], +- deps = [ +- ":general_message_base", +- "//cyber", +- "//cyber/message:raw_message", +- ], +-) +- +-cc_library( +- name = "general_message_base", +- hdrs = ["general_message_base.h"], +- deps = [ +- ":renderable_message", +- ], +-) +- +-cc_library( +- name = "renderable_message", +- hdrs = ["renderable_message.h"], +- deps = [ +- ":screen", ++ "@ncurses5", + ], + ) + +-cc_library( +- name = "screen", +- hdrs = ["screen.h"], +-) +- ++apollo_package() + cpplint() +diff --color -Naur cyber/tools/cyber_monitor/general_message.cc /opt/apollo/cyber/tools/cyber_monitor/general_message.cc +--- cyber/tools/cyber_monitor/general_message.cc 2023-12-23 18:23:13.095910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_monitor/general_message.cc 2023-12-23 18:05:58.588028978 +0800 +@@ -16,8 +16,11 @@ + + #include "cyber/tools/cyber_monitor/general_message.h" + ++#include + #include + #include ++#include ++#include + #include + #include + +diff --color -Naur cyber/tools/cyber_monitor/screen.cc /opt/apollo/cyber/tools/cyber_monitor/screen.cc +--- cyber/tools/cyber_monitor/screen.cc 2023-12-23 18:23:13.095910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_monitor/screen.cc 2023-12-23 18:05:58.589028978 +0800 +@@ -18,11 +18,13 @@ + + #include + ++#include + #include + #include + #include + #include + #include ++#include + + #include "cyber/tools/cyber_monitor/cyber_topology_message.h" + #include "cyber/tools/cyber_monitor/general_channel_message.h" +diff --color -Naur cyber/tools/cyber_node/BUILD /opt/apollo/cyber/tools/cyber_node/BUILD +--- cyber/tools/cyber_node/BUILD 2023-12-23 18:23:13.095910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_node/BUILD 2023-12-23 18:05:58.589028978 +0800 +@@ -1,5 +1,6 @@ + load("@rules_python//python:defs.bzl", "py_binary") +-load("//tools/install:install.bzl", "install") ++# load("//tools/install:install.bzl", "install") ++load("//tools:apollo_package.bzl", "apollo_package") + + package( + default_visibility = ["//visibility:public"], +@@ -14,8 +15,10 @@ + ], + ) + +-install( +- name = "install", +- py_dest = "cyber/bin", +- targets = [":cyber_node"] +-) +\ No newline at end of file ++# install( ++# name = "install", ++# py_dest = "cyber/bin", ++# targets = [":cyber_node"] ++# ) ++ ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/tools/cyber_recorder/BUILD /opt/apollo/cyber/tools/cyber_recorder/BUILD +--- cyber/tools/cyber_recorder/BUILD 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/BUILD 2023-12-23 18:05:58.589028978 +0800 +@@ -1,82 +1,43 @@ +-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") +-load("//tools/install:install.bzl", "install") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_binary") + load("//tools:cpplint.bzl", "cpplint") + + package(default_visibility = ["//visibility:public"]) + +-install( +- name = "install", +- runtime_dest = "cyber/bin", +- targets = [ +- ":cyber_recorder", +- ], +-) +- +-cc_binary( ++apollo_cc_binary( + name = "cyber_recorder", +- srcs = ["main.cc"], ++ srcs = [ ++ "main.cc", ++ ], + linkopts = ["-pthread"], + deps = [ +- ":info", + ":recorder", +- ":recoverer", +- ":spliter", +- "//cyber:init", +- "//cyber/common:file", +- "//cyber/common:time_conversion", +- "//cyber/tools/cyber_recorder/player", +- ], +-) +- +-cc_library( +- name = "info", +- srcs = ["info.cc"], +- hdrs = ["info.h"], +- deps = [ +- "//cyber/common:time_conversion", ++ "//cyber", + "//cyber/proto:record_cc_proto", +- "//cyber/record:record_file_reader", +- "//cyber/record:record_message", + ], + ) + +-cc_library( ++apollo_cc_library( + name = "recorder", +- srcs = ["recorder.cc"], +- hdrs = ["recorder.h"], ++ srcs = [ ++ "recorder.cc", "info.cc", "recoverer.cc", ++ "spliter.cc", "player/play_task.cc", "player/play_task_buffer.cc", ++ "player/play_task_consumer.cc", "player/play_task_producer.cc", ++ "player/player.cc", ++ ], ++ hdrs = [ ++ "recorder.h", "info.h", "recoverer.h", "spliter.h", ++ "player/play_param.h", "player/play_task.h", ++ "player/play_task_buffer.h", "player/play_task_consumer.h", ++ "player/play_task_producer.h", "player/player.h", ++ ], + deps = [ + "//cyber", +- "//cyber/common:log", ++ "//cyber/common:cyber_common", + "//cyber/proto:record_cc_proto", + "@fastrtps", + ], + ) + +-cc_library( +- name = "recoverer", +- srcs = ["recoverer.cc"], +- hdrs = ["recoverer.h"], +- deps = [ +- "//cyber/base:for_each", +- "//cyber/common:log", +- "//cyber/proto:record_cc_proto", +- "//cyber/record:header_builder", +- "//cyber/record:record_file_reader", +- "//cyber/record:record_writer", +- ], +-) +- +-cc_library( +- name = "spliter", +- srcs = ["spliter.cc"], +- hdrs = ["spliter.h"], +- deps = [ +- "//cyber/common:log", +- "//cyber/proto:record_cc_proto", +- "//cyber/record:header_builder", +- "//cyber/record:record_file_reader", +- "//cyber/record:record_writer", +- ], +-) ++apollo_package() + +-cpplint() ++cpplint() +\ No newline at end of file +diff --color -Naur cyber/tools/cyber_recorder/main.cc /opt/apollo/cyber/tools/cyber_recorder/main.cc +--- cyber/tools/cyber_recorder/main.cc 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/main.cc 2023-12-23 18:05:58.589028978 +0800 +@@ -197,7 +197,7 @@ + float opt_rate = 1.0f; + uint64_t opt_begin = 0; + uint64_t opt_end = std::numeric_limits::max(); +- uint64_t opt_start = 0; ++ double opt_start = 0; + uint64_t opt_delay = 0; + uint32_t opt_preload = 3; + auto opt_header = HeaderBuilder::GetHeader(); +@@ -271,7 +271,7 @@ + break; + case 's': + try { +- opt_start = std::stoi(optarg); ++ opt_start = std::stod(optarg); + } catch (const std::invalid_argument& ia) { + std::cout << "Invalid argument: -s/--start " << std::string(optarg) + << std::endl; +diff --color -Naur cyber/tools/cyber_recorder/player/BUILD /opt/apollo/cyber/tools/cyber_recorder/player/BUILD +--- cyber/tools/cyber_recorder/player/BUILD 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,73 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-cc_library( +- name = "play_param", +- hdrs = ["play_param.h"], +-) +- +-cc_library( +- name = "play_task", +- srcs = ["play_task.cc"], +- hdrs = ["play_task.h"], +- deps = [ +- "//cyber/common:log", +- "//cyber/message:raw_message", +- "//cyber/node:writer", +- ], +-) +- +-cc_library( +- name = "play_task_buffer", +- srcs = ["play_task_buffer.cc"], +- hdrs = ["play_task_buffer.h"], +- deps = [ +- ":play_task", +- ], +-) +- +-cc_library( +- name = "play_task_consumer", +- srcs = ["play_task_consumer.cc"], +- hdrs = ["play_task_consumer.h"], +- deps = [ +- ":play_task_buffer", +- "//cyber/common:log", +- "//cyber/time", +- ], +-) +- +-cc_library( +- name = "play_task_producer", +- srcs = ["play_task_producer.cc"], +- hdrs = ["play_task_producer.h"], +- deps = [ +- ":play_param", +- ":play_task_buffer", +- "//cyber", +- "//cyber/common:log", +- "//cyber/message:protobuf_factory", +- "//cyber/message:raw_message", +- "//cyber/node", +- "//cyber/node:writer", +- "//cyber/record:record_reader", +- "//cyber/record:record_viewer", +- ], +-) +- +-cc_library( +- name = "player", +- srcs = ["player.cc"], +- hdrs = ["player.h"], +- deps = [ +- ":play_param", +- ":play_task_buffer", +- ":play_task_consumer", +- ":play_task_producer", +- "//cyber:init", +- ], +-) +- +-cpplint() +diff --color -Naur cyber/tools/cyber_recorder/player/play_param.h /opt/apollo/cyber/tools/cyber_recorder/player/play_param.h +--- cyber/tools/cyber_recorder/player/play_param.h 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/play_param.h 2023-12-23 18:05:58.589028978 +0800 +@@ -31,13 +31,16 @@ + bool is_loop_playback = false; + double play_rate = 1.0; + uint64_t begin_time_ns = 0; ++ uint64_t base_begin_time_ns = 0; + uint64_t end_time_ns = std::numeric_limits::max(); +- uint64_t start_time_s = 0; ++ double start_time_s = 0; + uint64_t delay_time_s = 0; + uint32_t preload_time_s = 3; + std::set files_to_play; + std::set channels_to_play; + std::set black_channels; ++ // for dreamview_plus play record;use record_id to check source ++ std::string record_id = ""; + }; + + } // namespace record +diff --color -Naur cyber/tools/cyber_recorder/player/play_task_buffer.cc /opt/apollo/cyber/tools/cyber_recorder/player/play_task_buffer.cc +--- cyber/tools/cyber_recorder/player/play_task_buffer.cc 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/play_task_buffer.cc 2023-12-23 18:05:58.589028978 +0800 +@@ -60,6 +60,13 @@ + } + } + ++void PlayTaskBuffer::Clear() { ++ std::lock_guard lck(mutex_); ++ while (!tasks_.empty()) { ++ tasks_.erase(tasks_.begin()); ++ } ++} ++ + } // namespace record + } // namespace cyber + } // namespace apollo +diff --color -Naur cyber/tools/cyber_recorder/player/play_task_buffer.h /opt/apollo/cyber/tools/cyber_recorder/player/play_task_buffer.h +--- cyber/tools/cyber_recorder/player/play_task_buffer.h 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/play_task_buffer.h 2023-12-23 18:05:58.589028978 +0800 +@@ -43,6 +43,7 @@ + void Push(const TaskPtr& task); + TaskPtr Front(); + void PopFront(); ++ void Clear(); + + private: + TaskMap tasks_; +diff --color -Naur cyber/tools/cyber_recorder/player/play_task_consumer.cc /opt/apollo/cyber/tools/cyber_recorder/player/play_task_consumer.cc +--- cyber/tools/cyber_recorder/player/play_task_consumer.cc 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/play_task_consumer.cc 2023-12-23 18:05:58.589028978 +0800 +@@ -63,6 +63,10 @@ + consume_th_->join(); + consume_th_ = nullptr; + } ++ // reset value for next use consumer ++ base_msg_play_time_ns_ = 0; ++ base_msg_real_time_ns_ = 0; ++ last_played_msg_real_time_ns_ = 0; + } + + void PlayTaskConsumer::ThreadFunc() { +diff --color -Naur cyber/tools/cyber_recorder/player/play_task_producer.cc /opt/apollo/cyber/tools/cyber_recorder/player/play_task_producer.cc +--- cyber/tools/cyber_recorder/player/play_task_producer.cc 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/play_task_producer.cc 2023-12-23 18:05:58.589028978 +0800 +@@ -23,7 +23,6 @@ + #include "cyber/common/time_conversion.h" + #include "cyber/cyber.h" + #include "cyber/message/protobuf_factory.h" +-#include "cyber/record/record_viewer.h" + + namespace apollo { + namespace cyber { +@@ -32,18 +31,23 @@ + const uint32_t PlayTaskProducer::kMinTaskBufferSize = 500; + const uint32_t PlayTaskProducer::kPreloadTimeSec = 3; + const uint64_t PlayTaskProducer::kSleepIntervalNanoSec = 1000000; ++const char record_info_channel[] = "/apollo/cyber/record_info"; + + PlayTaskProducer::PlayTaskProducer(const TaskBufferPtr& task_buffer, +- const PlayParam& play_param) ++ const PlayParam& play_param, ++ const NodePtr& node, ++ const bool preload_fill_buffer_mode) + : play_param_(play_param), + task_buffer_(task_buffer), + produce_th_(nullptr), + is_initialized_(false), + is_stopped_(true), +- node_(nullptr), ++ node_(node), ++ record_viewer_ptr_(nullptr), + earliest_begin_time_(std::numeric_limits::max()), + latest_end_time_(0), +- total_msg_num_(0) {} ++ total_msg_num_(0), ++ preload_fill_buffer_mode_(preload_fill_buffer_mode) {} + + PlayTaskProducer::~PlayTaskProducer() { Stop(); } + +@@ -52,6 +56,14 @@ + AERROR << "producer has been initialized."; + return false; + } ++ if (preload_fill_buffer_mode_ && node_ == nullptr) { ++ AERROR << "node from same process should pass node param for construct"; ++ return false; ++ } ++ if (!preload_fill_buffer_mode_ && node_ != nullptr) { ++ AERROR << "invalid param: nullptr node"; ++ node_ = nullptr; ++ } + + if (!ReadRecordInfo() || !UpdatePlayParam() || !CreateWriters()) { + is_initialized_.store(false); +@@ -72,7 +84,12 @@ + return; + } + +- produce_th_.reset(new std::thread(&PlayTaskProducer::ThreadFunc, this)); ++ if (preload_fill_buffer_mode_) { ++ produce_th_.reset( ++ new std::thread(&PlayTaskProducer::ThreadFuncUnderPreloadMode, this)); ++ } else { ++ produce_th_.reset(new std::thread(&PlayTaskProducer::ThreadFunc, this)); ++ } + } + + void PlayTaskProducer::Stop() { +@@ -165,10 +182,13 @@ + bool PlayTaskProducer::UpdatePlayParam() { + if (play_param_.begin_time_ns < earliest_begin_time_) { + play_param_.begin_time_ns = earliest_begin_time_; ++ play_param_.base_begin_time_ns = earliest_begin_time_; + } + if (play_param_.start_time_s > 0) { +- play_param_.begin_time_ns += static_cast( +- static_cast(play_param_.start_time_s) * 1e9); ++ play_param_.begin_time_ns = ++ play_param_.base_begin_time_ns + ++ static_cast(static_cast(play_param_.start_time_s) * ++ 1e9); + } + if (play_param_.end_time_ns > latest_end_time_) { + play_param_.end_time_ns = latest_end_time_; +@@ -187,13 +207,53 @@ + return true; + } + +-bool PlayTaskProducer::CreateWriters() { +- std::string node_name = "cyber_recorder_play_" + std::to_string(getpid()); +- node_ = apollo::cyber::CreateNode(node_name); +- if (node_ == nullptr) { +- AERROR << "create node failed."; ++void PlayTaskProducer::WriteRecordProgress(const double& curr_time_s, ++ const double& total_time_s) { ++ RecordInfo record_info; ++ record_info.set_total_time_s(total_time_s); ++ record_info.set_curr_time_s(curr_time_s); ++ record_info.set_progress(curr_time_s / total_time_s); ++ record_info.set_record_name(play_param_.record_id); ++ std::string content; ++ record_info.SerializeToString(&content); ++ auto raw_msg = std::make_shared(content); ++ writers_[record_info_channel]->Write(raw_msg); ++} ++ ++void PlayTaskProducer::Reset(const double& progress_s) { ++ play_param_.begin_time_ns = play_param_.base_begin_time_ns + progress_s * 1e9; ++ play_param_.start_time_s = progress_s; ++ record_viewer_ptr_ = nullptr; ++ record_viewer_ptr_ = std::make_shared( ++ record_readers_, play_param_.begin_time_ns, play_param_.end_time_ns, ++ play_param_.channels_to_play); ++ record_viewer_ptr_->set_curr_itr(record_viewer_ptr_->begin()); ++} ++ ++bool PlayTaskProducer::CreatePlayTaskWriter(const std::string& channel_name, ++ const std::string& msg_type) { ++ proto::RoleAttributes attr; ++ attr.set_channel_name(channel_name); ++ attr.set_message_type(msg_type); ++ auto writer = node_->CreateWriter(attr); ++ if (writer == nullptr) { ++ AERROR << "create writer failed. channel name: " << channel_name ++ << ", message type: " << msg_type; + return false; + } ++ writers_[channel_name] = writer; ++ return true; ++} ++ ++bool PlayTaskProducer::CreateWriters() { ++ if (node_ == nullptr && !preload_fill_buffer_mode_) { ++ std::string node_name = "cyber_recorder_play_" + std::to_string(getpid()); ++ node_ = apollo::cyber::CreateNode(node_name); ++ if (node_ == nullptr) { ++ AERROR << "create node failed."; ++ return false; ++ } ++ } + + for (auto& item : msg_types_) { + auto& channel_name = item.first; +@@ -205,20 +265,101 @@ + play_param_.black_channels.end()) { + continue; + } +- proto::RoleAttributes attr; +- attr.set_channel_name(channel_name); +- attr.set_message_type(msg_type); +- auto writer = node_->CreateWriter(attr); +- if (writer == nullptr) { +- AERROR << "create writer failed. channel name: " << channel_name +- << ", message type: " << msg_type; ++ if (!CreatePlayTaskWriter(channel_name, msg_type)) { + return false; + } +- writers_[channel_name] = writer; + } + } ++ return CreatePlayTaskWriter(record_info_channel, ++ "apollo.cyber.proto.RecordInfo"); ++} + +- return true; ++void PlayTaskProducer::FillPlayTaskBuffer() { ++ task_buffer_->Clear(); ++ // use fixed preload buffer size ++ uint32_t preload_size = kMinTaskBufferSize * 2; ++ ++ if (!record_viewer_ptr_) { ++ record_viewer_ptr_ = std::make_shared( ++ record_readers_, play_param_.begin_time_ns, play_param_.end_time_ns, ++ play_param_.channels_to_play); ++ record_viewer_ptr_->set_curr_itr(record_viewer_ptr_->begin()); ++ } ++ ++ auto itr = record_viewer_ptr_->curr_itr(); ++ ++ for (; itr != record_viewer_ptr_->end(); ++itr) { ++ if (task_buffer_->Size() > preload_size) { ++ record_viewer_ptr_->set_curr_itr(itr); ++ break; ++ } ++ ++ auto search = writers_.find(itr->channel_name); ++ if (search == writers_.end()) { ++ continue; ++ } ++ ++ auto raw_msg = std::make_shared(itr->content); ++ auto task = std::make_shared(raw_msg, search->second, itr->time, ++ itr->time); ++ task_buffer_->Push(task); ++ } ++} ++ ++void PlayTaskProducer::ThreadFuncUnderPreloadMode() { ++ const uint64_t loop_time_ns = ++ play_param_.end_time_ns - play_param_.begin_time_ns; ++ uint64_t avg_interval_time_ns = kSleepIntervalNanoSec; ++ if (total_msg_num_ > 0) { ++ avg_interval_time_ns = loop_time_ns / total_msg_num_; ++ } ++ ++ uint32_t preload_size = kMinTaskBufferSize * 2; ++ ++ if (preload_fill_buffer_mode_ && !record_viewer_ptr_) { ++ AERROR << "Preload should not nullptr"; ++ return; ++ } ++ if (!preload_fill_buffer_mode_ && record_viewer_ptr_) { ++ AERROR << "No preload should nullptr"; ++ return; ++ } ++ if (!record_viewer_ptr_) { ++ record_viewer_ptr_ = std::make_shared( ++ record_readers_, play_param_.begin_time_ns, play_param_.end_time_ns, ++ play_param_.channels_to_play); ++ record_viewer_ptr_->set_curr_itr(record_viewer_ptr_->begin()); ++ } ++ ++ while (!is_stopped_.load()) { ++ auto itr = record_viewer_ptr_->curr_itr(); ++ auto itr_end = record_viewer_ptr_->end(); ++ ++ while (itr != itr_end && !is_stopped_.load()) { ++ while (!is_stopped_.load() && task_buffer_->Size() > preload_size) { ++ std::this_thread::sleep_for( ++ std::chrono::nanoseconds(avg_interval_time_ns)); ++ } ++ for (; itr != itr_end && !is_stopped_.load(); ++itr) { ++ if (task_buffer_->Size() > preload_size) { ++ break; ++ } ++ ++ auto search = writers_.find(itr->channel_name); ++ if (search == writers_.end()) { ++ continue; ++ } ++ ++ auto raw_msg = std::make_shared(itr->content); ++ auto task = std::make_shared(raw_msg, search->second, ++ itr->time, itr->time); ++ task_buffer_->Push(task); ++ } ++ } ++ // not support loop ++ is_stopped_.store(true); ++ break; ++ } + } + + void PlayTaskProducer::ThreadFunc() { +@@ -237,15 +378,16 @@ + preload_size = kMinTaskBufferSize; + } + +- auto record_viewer = std::make_shared( ++ record_viewer_ptr_ = std::make_shared( + record_readers_, play_param_.begin_time_ns, play_param_.end_time_ns, + play_param_.channels_to_play); ++ record_viewer_ptr_->set_curr_itr(record_viewer_ptr_->begin()); + + uint32_t loop_num = 0; + while (!is_stopped_.load()) { + uint64_t plus_time_ns = loop_num * loop_time_ns; +- auto itr = record_viewer->begin(); +- auto itr_end = record_viewer->end(); ++ auto itr = record_viewer_ptr_->begin(); ++ auto itr_end = record_viewer_ptr_->end(); + + while (itr != itr_end && !is_stopped_.load()) { + while (!is_stopped_.load() && task_buffer_->Size() > preload_size) { +diff --color -Naur cyber/tools/cyber_recorder/player/play_task_producer.h /opt/apollo/cyber/tools/cyber_recorder/player/play_task_producer.h +--- cyber/tools/cyber_recorder/player/play_task_producer.h 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/play_task_producer.h 2023-12-23 18:05:58.589028978 +0800 +@@ -33,11 +33,15 @@ + #include "cyber/record/record_reader.h" + #include "cyber/tools/cyber_recorder/player/play_param.h" + #include "cyber/tools/cyber_recorder/player/play_task_buffer.h" ++#include "cyber/proto/record.pb.h" ++#include "cyber/record/record_viewer.h" + + namespace apollo { + namespace cyber { + namespace record { + ++using ::apollo::cyber::proto::RecordInfo; ++ + class PlayTaskProducer { + public: + using NodePtr = std::shared_ptr; +@@ -47,9 +51,12 @@ + using WriterPtr = std::shared_ptr>; + using WriterMap = std::unordered_map; + using MessageTypeMap = std::unordered_map; ++ using RecordViewerPtr = std::shared_ptr; + + PlayTaskProducer(const TaskBufferPtr& task_buffer, +- const PlayParam& play_param); ++ const PlayParam& play_param, ++ const NodePtr& node = nullptr, ++ const bool preload_fill_buffer_mode = false); + virtual ~PlayTaskProducer(); + + bool Init(); +@@ -58,12 +65,29 @@ + + const PlayParam& play_param() const { return play_param_; } + bool is_stopped() const { return is_stopped_.load(); } ++ bool is_initialized() const { return is_initialized_.load(); } ++ void set_stopped() { is_stopped_.exchange(true); } ++ void WriteRecordProgress(const double& curr_time_s, ++ const double& total_time_s); ++ /** ++ * @brief Preload the player,producer fill play_task_buffer before ++ * playing. ++ */ ++ void FillPlayTaskBuffer(); ++ /** ++ * @brief Reset player producer for dv will repeatedly use it. ++ * reset the start time when dv reset play record progress. ++ */ ++ void Reset(const double& progress_time_s); + + private: + bool ReadRecordInfo(); + bool UpdatePlayParam(); + bool CreateWriters(); ++ bool CreatePlayTaskWriter(const std::string& channel_name, ++ const std::string& msg_type); + void ThreadFunc(); ++ void ThreadFuncUnderPreloadMode(); + + PlayParam play_param_; + TaskBufferPtr task_buffer_; +@@ -76,11 +100,19 @@ + WriterMap writers_; + MessageTypeMap msg_types_; + std::vector record_readers_; ++ RecordViewerPtr record_viewer_ptr_; + + uint64_t earliest_begin_time_; + uint64_t latest_end_time_; + uint64_t total_msg_num_; + ++ // This parameter indicates whether the producer needs to preload the buffer ++ // When this value is true, it means that we preload the buffer before playing ++ // we use it when dv play record under nohup process,all record player related ++ // to the same node,so when this value is true,we pass parameter node to ++ // assign value to node_ ++ bool preload_fill_buffer_mode_; ++ + static const uint32_t kMinTaskBufferSize; + static const uint32_t kPreloadTimeSec; + static const uint64_t kSleepIntervalNanoSec; +diff --color -Naur cyber/tools/cyber_recorder/player/player.cc /opt/apollo/cyber/tools/cyber_recorder/player/player.cc +--- cyber/tools/cyber_recorder/player/player.cc 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/player.cc 2023-12-23 18:05:58.589028978 +0800 +@@ -26,7 +26,8 @@ + + const uint64_t Player::kSleepIntervalMiliSec = 100; + +-Player::Player(const PlayParam& play_param) ++Player::Player(const PlayParam& play_param, const NodePtr& node, ++ const bool preload_fill_buffer_mode) + : is_initialized_(false), + is_stopped_(true), + consumer_(nullptr), +@@ -34,7 +35,8 @@ + task_buffer_(nullptr) { + task_buffer_ = std::make_shared(); + consumer_.reset(new PlayTaskConsumer(task_buffer_, play_param.play_rate)); +- producer_.reset(new PlayTaskProducer(task_buffer_, play_param)); ++ producer_.reset(new PlayTaskProducer(task_buffer_, play_param, node, ++ preload_fill_buffer_mode)); + } + + Player::~Player() { Stop(); } +@@ -78,6 +80,55 @@ + return buf; + } + ++bool Player::ThreadFunc_Play_Nohup() { ++ if (!is_initialized_.load()) { ++ AERROR << "please call Init firstly."; ++ return false; ++ } ++ ++ if (!is_stopped_.exchange(false)) { ++ AERROR << "player has been stopped."; ++ return false; ++ } ++ auto& play_param = producer_->play_param(); ++ producer_->Start(); ++ consumer_->Start(play_param.begin_time_ns); ++ const double total_progress_time_s = ++ static_cast(play_param.end_time_ns - play_param.begin_time_ns) / ++ 1e9 + ++ static_cast(play_param.start_time_s); ++ while (!is_stopped_.load() && apollo::cyber::OK()) { ++ if (is_paused_) { ++ consumer_->Pause(); ++ } else { ++ consumer_->Continue(); ++ } ++ ++ double progress_time_s = ++ static_cast(producer_->play_param().start_time_s); ++ if (consumer_->last_played_msg_real_time_ns() > 0) { ++ progress_time_s += ++ static_cast(consumer_->last_played_msg_real_time_ns() - ++ consumer_->base_msg_play_time_ns() + ++ consumer_->base_msg_real_time_ns() - ++ producer_->play_param().begin_time_ns) / ++ 1e9; ++ } ++ ++ producer_->WriteRecordProgress(progress_time_s, total_progress_time_s); ++ ++ if (producer_->is_stopped() && task_buffer_->Empty()) { ++ consumer_->Stop(); ++ break; ++ } ++ std::this_thread::sleep_for( ++ std::chrono::milliseconds(kSleepIntervalMiliSec)); ++ } ++ return true; ++} ++ ++void Player::HandleNohupThreadStatus() { is_paused_ = !is_paused_; } ++ + void Player::ThreadFunc_Term() { + while (!is_stopped_.load()) { + char ch = Getch(); +@@ -94,6 +145,33 @@ + } + } + ++void Player::NohupPlayRecord() { ++ nohup_play_th_.reset(new std::thread(&Player::ThreadFunc_Play_Nohup, this)); ++} ++ ++bool Player::PreloadPlayRecord(const double& progress_s, bool paused_status) { ++ if (!producer_->is_initialized()) { ++ return false; ++ } ++ if (is_preloaded_.load()) { ++ producer_->Reset(progress_s); ++ is_preloaded_.store(false); ++ } ++ if (progress_s == 0) { ++ // When the progress is 0, it is completely reloaded. At this ++ // time, the is_paused_ of the player should change to the initial ++ // state to avoid being disturbed by the last state.On the contrary, ++ // reset the progress needs to preserve the past state to ensure the ++ // unity of the state before and after. ++ is_paused_.exchange(false); ++ } else { ++ is_paused_.exchange(paused_status); ++ } ++ producer_->FillPlayTaskBuffer(); ++ is_preloaded_.store(true); ++ return true; ++} ++ + bool Player::Start() { + if (!is_initialized_.load()) { + AERROR << "please call Init firstly."; +@@ -191,6 +269,24 @@ + } + return true; + } ++ ++bool Player::Reset() { ++ if (is_stopped_.exchange(true)) { ++ return false; ++ } ++ // produer may not be stopped under reset progress ++ // reset is_stopped_ to true to ensure logical unity ++ producer_->set_stopped(); ++ producer_->Stop(); ++ consumer_->Stop(); ++ // clear task buffer for refill it ++ task_buffer_->Clear(); ++ if (nohup_play_th_ != nullptr && nohup_play_th_->joinable()) { ++ nohup_play_th_->join(); ++ nohup_play_th_ = nullptr; ++ } ++ return true; ++} + + } // namespace record + } // namespace cyber +diff --color -Naur cyber/tools/cyber_recorder/player/player.h /opt/apollo/cyber/tools/cyber_recorder/player/player.h +--- cyber/tools/cyber_recorder/player/player.h 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/player/player.h 2023-12-23 18:05:58.589028978 +0800 +@@ -25,6 +25,7 @@ + #include "cyber/tools/cyber_recorder/player/play_task_buffer.h" + #include "cyber/tools/cyber_recorder/player/play_task_consumer.h" + #include "cyber/tools/cyber_recorder/player/play_task_producer.h" ++#include "cyber/node/node.h" + + namespace apollo { + namespace cyber { +@@ -35,26 +36,60 @@ + using ConsumerPtr = std::unique_ptr; + using ProducerPtr = std::unique_ptr; + using TaskBufferPtr = std::shared_ptr; ++ using NodePtr = std::shared_ptr; + +- explicit Player(const PlayParam& play_param); ++ Player(const PlayParam& play_param, const NodePtr& node = nullptr, ++ const bool preload_fill_buffer_mode = false); + virtual ~Player(); + + bool Init(); + bool Start(); + bool Stop(); ++ /** ++ * @brief Reset player for dv will repeatedly use ++ * @return If the action executed successfully. ++ */ ++ bool Reset(); ++ /** ++ * @brief Preload the player,fill play_task_buffer ahead ofr ++ * time to ensure fast playback and avoid consumer waiting. ++ * @param progress_s The start time we begin to read record ++ * and fill task buffer. ++ * @return If the action executed successfully. ++ */ ++ bool PreloadPlayRecord(const double& progress_s = 0, ++ bool paused_status = false); ++ /** ++ * @brief set nohup process to play record. ++ */ ++ void NohupPlayRecord(); ++ /** ++ * @brief Pause or continue to play record by change the nohup process status. ++ */ ++ void HandleNohupThreadStatus(); + + private: + void ThreadFunc_Term(); ++ /** ++ * @brief The nohup process to play record. ++ * @return If the action executed successfully. ++ */ ++ bool ThreadFunc_Play_Nohup(); + + private: + std::atomic is_initialized_ = {false}; + std::atomic is_stopped_ = {false}; + std::atomic is_paused_ = {false}; + std::atomic is_playonce_ = {false}; ++ // is_preloaded_ is only used under nohup play mode to ++ // mark whether the task_buffer_ is preloaded. ++ std::atomic is_preloaded_ = {false}; + ConsumerPtr consumer_; + ProducerPtr producer_; + TaskBufferPtr task_buffer_; + std::shared_ptr term_thread_ = nullptr; ++ // add nohup_play_th_ to allow background play record ++ std::shared_ptr nohup_play_th_ = nullptr; + static const uint64_t kSleepIntervalMiliSec; + }; + +diff --color -Naur cyber/tools/cyber_recorder/recorder.cc /opt/apollo/cyber/tools/cyber_recorder/recorder.cc +--- cyber/tools/cyber_recorder/recorder.cc 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/recorder.cc 2023-12-23 18:05:58.589028978 +0800 +@@ -16,6 +16,8 @@ + + #include "cyber/tools/cyber_recorder/recorder.h" + ++#include ++ + #include "cyber/record/header_builder.h" + + namespace apollo { +@@ -54,6 +56,28 @@ + } + } + ++ auto get_patterns_func = [](const std::vector& channels, ++ std::vector* channel_patterns) { ++ for (const auto& channel_name : channels) { ++ try { ++ std::string name = ""; ++ /* replace escape character: \ to \\ */ ++ for (auto& c : channel_name) { ++ if (c != '\\') { ++ name += c; ++ } else { ++ name += "\\"; ++ } ++ } ++ channel_patterns->emplace_back(name); ++ } catch (std::regex_error& e) { ++ // ignored if channel name is not a regex string. ++ } ++ } ++ }; ++ get_patterns_func(white_channels_, &white_channel_patterns_); ++ get_patterns_func(black_channels_, &black_channel_patterns_); ++ + writer_.reset(new RecordWriter(header_)); + if (!writer_->Open(output_)) { + AERROR << "Datafile open file error."; +@@ -124,30 +148,46 @@ + AWARN << "Change message not has a proto desc or has an empty one."; + return; + } ++ ++ if (channel_reader_map_.find(role_attr.channel_name()) != ++ channel_reader_map_.end()) { ++ return; ++ } ++ ++ auto channel_match_func = [&role_attr]( ++ const std::vector channels, ++ std::vector& patterns) -> bool { ++ if (std::find(channels.begin(), channels.end(), role_attr.channel_name()) != ++ channels.end()) { ++ return true; ++ } ++ for (const auto& pattern : patterns) { ++ if (std::regex_match(role_attr.channel_name(), pattern)) { ++ return true; ++ } ++ } ++ return false; ++ }; ++ ++ // white channel matching + if (!all_channels_ && +- std::find(white_channels_.begin(), white_channels_.end(), +- role_attr.channel_name()) == white_channels_.end()) { ++ !channel_match_func(white_channels_, white_channel_patterns_)) { + ADEBUG << "New channel '" << role_attr.channel_name() + << "' was found, but not in record list."; + return; + } +- +- if (std::find(black_channels_.begin(), black_channels_.end(), +- role_attr.channel_name()) != black_channels_.end()) { ++ // black channel matching ++ if (channel_match_func(black_channels_, black_channel_patterns_)) { + ADEBUG << "New channel '" << role_attr.channel_name() + << "' was found, but it appears in the blacklist."; + return; + } + +- if (channel_reader_map_.find(role_attr.channel_name()) == +- channel_reader_map_.end()) { +- if (!writer_->WriteChannel(role_attr.channel_name(), +- role_attr.message_type(), +- role_attr.proto_desc())) { +- AERROR << "write channel fail, channel:" << role_attr.channel_name(); +- } +- InitReaderImpl(role_attr.channel_name(), role_attr.message_type()); ++ if (!writer_->WriteChannel(role_attr.channel_name(), role_attr.message_type(), ++ role_attr.proto_desc())) { ++ AERROR << "write channel fail, channel:" << role_attr.channel_name(); + } ++ InitReaderImpl(role_attr.channel_name(), role_attr.message_type()); + } + + bool Recorder::InitReadersImpl() { +diff --color -Naur cyber/tools/cyber_recorder/recorder.h /opt/apollo/cyber/tools/cyber_recorder/recorder.h +--- cyber/tools/cyber_recorder/recorder.h 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_recorder/recorder.h 2023-12-23 18:05:58.589028978 +0800 +@@ -19,15 +19,17 @@ + + #include + #include ++#include + #include + #include + #include + ++#include "cyber/proto/record.pb.h" ++#include "cyber/proto/topology_change.pb.h" ++ + #include "cyber/base/signal.h" + #include "cyber/cyber.h" + #include "cyber/message/raw_message.h" +-#include "cyber/proto/record.pb.h" +-#include "cyber/proto/topology_change.pb.h" + #include "cyber/record/record_writer.h" + + using apollo::cyber::Node; +@@ -67,7 +69,9 @@ + std::string output_; + bool all_channels_ = true; + std::vector white_channels_; ++ std::vector white_channel_patterns_; + std::vector black_channels_; ++ std::vector black_channel_patterns_; + proto::Header header_; + std::unordered_map> + channel_reader_map_; +diff --color -Naur cyber/tools/cyber_service/BUILD /opt/apollo/cyber/tools/cyber_service/BUILD +--- cyber/tools/cyber_service/BUILD 2023-12-23 18:23:13.096910841 +0800 ++++ /opt/apollo/cyber/tools/cyber_service/BUILD 2023-12-23 18:05:58.589028978 +0800 +@@ -1,5 +1,6 @@ + load("@rules_python//python:defs.bzl", "py_binary") +-load("//tools/install:install.bzl", "install") ++# load("//tools/install:install.bzl", "install") ++load("//tools:apollo_package.bzl", "apollo_package") + + package( + default_visibility = ["//visibility:public"], +@@ -13,8 +14,9 @@ + ], + ) + +-install( +- name = "install", +- py_dest = "cyber/bin", +- targets = [":cyber_service"] +-) +\ No newline at end of file ++# install( ++# name = "install", ++# py_dest = "cyber/bin", ++# targets = [":cyber_service"] ++# ) ++apollo_package() +\ No newline at end of file +diff --color -Naur cyber/transport/BUILD /opt/apollo/cyber/transport/BUILD +--- cyber/transport/BUILD 2023-12-23 18:23:13.097910841 +0800 ++++ /opt/apollo/cyber/transport/BUILD 2023-12-23 18:05:58.590028978 +0800 +@@ -1,47 +1,175 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_package", "apollo_cc_test") + + package(default_visibility = ["//visibility:public"]) + +-filegroup( +- name = "cyber_transport_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "transport", +- srcs = ["transport.cc"], +- hdrs = ["transport.h"], +- deps = [ +- "//cyber/service_discovery:role", +- "//cyber/task", +- "//cyber/transport/dispatcher:intra_dispatcher", +- "//cyber/transport/dispatcher:rtps_dispatcher", +- "//cyber/transport/dispatcher:shm_dispatcher", +- "//cyber/transport/message:history", +- "//cyber/transport/qos", +- "//cyber/transport/receiver", +- "//cyber/transport/rtps:attributes_filler", +- "//cyber/transport/rtps:participant", +- "//cyber/transport/rtps:sub_listener", +- "//cyber/transport/rtps:underlay_message", +- "//cyber/transport/rtps:underlay_message_type", +- "//cyber/transport/transmitter", ++apollo_cc_library( ++ name = "cyber_transport", ++ srcs = [ ++ 'transport.cc', 'shm/segment.cc', 'shm/condition_notifier.cc', ++ 'shm/segment_factory.cc', 'shm/posix_segment.cc', 'shm/state.cc', ++ 'shm/multicast_notifier.cc', 'shm/block.cc', 'shm/shm_conf.cc', ++ 'shm/xsi_segment.cc', 'shm/readable_info.cc', 'shm/notifier_factory.cc', ++ 'qos/qos_profile_conf.cc', 'common/identity.cc', 'common/endpoint.cc', ++ 'dispatcher/intra_dispatcher.cc', 'dispatcher/shm_dispatcher.cc', ++ 'dispatcher/rtps_dispatcher.cc', 'dispatcher/dispatcher.cc', ++ 'message/message_info.cc', 'rtps/participant.cc', 'rtps/attributes_filler.cc', ++ 'rtps/sub_listener.cc', 'rtps/underlay_message_type.cc', ++ 'rtps/underlay_message.cc' ++ ], ++ hdrs = [ ++ 'transport.h', 'shm/state.h', 'shm/xsi_segment.h', ++ 'shm/notifier_factory.h', 'shm/block.h', 'shm/shm_conf.h', ++ 'shm/readable_info.h', 'shm/posix_segment.h', 'shm/segment_factory.h', ++ 'shm/multicast_notifier.h', 'shm/segment.h', 'shm/notifier_base.h', ++ 'shm/condition_notifier.h', 'qos/qos_profile_conf.h', 'common/identity.h', ++ 'common/endpoint.h', 'receiver/hybrid_receiver.h', 'receiver/shm_receiver.h', ++ 'receiver/receiver.h', 'receiver/intra_receiver.h', 'receiver/rtps_receiver.h', ++ 'transmitter/rtps_transmitter.h', 'transmitter/transmitter.h', ++ 'transmitter/shm_transmitter.h', 'transmitter/hybrid_transmitter.h', ++ 'transmitter/intra_transmitter.h', 'dispatcher/dispatcher.h', ++ 'dispatcher/intra_dispatcher.h', 'dispatcher/rtps_dispatcher.h', ++ 'dispatcher/shm_dispatcher.h', 'message/history.h', 'message/listener_handler.h', ++ 'message/history_attributes.h', 'message/message_info.h', ++ 'rtps/attributes_filler.h', 'rtps/underlay_message.h', 'rtps/participant.h', ++ 'rtps/sub_listener.h', 'rtps/underlay_message_type.h' ++ ], ++ linkopts = ["-lrt"], ++ deps = [ + "@fastrtps", ++ "@uuid", ++ "//cyber/service_discovery:cyber_service_discovery_role", ++ "//cyber/task:cyber_task", ++ "//cyber/common:cyber_common", ++ "//cyber/proto:role_attributes_cc_proto", ++ "//cyber/message:cyber_message", ++ "//cyber/proto:proto_desc_cc_proto", ++ "//cyber/scheduler:cyber_scheduler", ++ "//cyber/proto:qos_profile_cc_proto", ++ "//cyber/base:cyber_base", ++ "//cyber/event:cyber_event", ++ ], ++) ++ ++apollo_cc_test( ++ name = "condition_notifier_test", ++ size = "small", ++ srcs = ["shm/condition_notifier_test.cc"], ++ tags = ["exclusive"], ++ deps = [ ++ "//cyber", ++ "@com_google_googletest//:gtest_main", ++ ], ++ linkstatic = True, ++) ++ ++apollo_cc_test( ++ name = "rtps_test", ++ size = "small", ++ srcs = ["rtps/rtps_test.cc"], ++ deps = [ ++ "//cyber", ++ "@com_google_googletest//:gtest_main", ++ "@fastrtps", ++ ], ++) ++ ++apollo_cc_test( ++ name = "message_info_test", ++ size = "small", ++ srcs = ["message/message_info_test.cc"], ++ deps = [ ++ "//cyber", ++ "@com_google_googletest//:gtest_main", + ], ++ linkstatic = True, + ) + +-cc_test( ++apollo_cc_test( ++ name = "message_test", ++ size = "small", ++ srcs = ["message/message_test.cc"], ++ deps = [ ++ "//cyber", ++ "@com_google_googletest//:gtest_main", ++ ], ++ linkstatic = True, ++) ++ ++apollo_cc_test( ++ name = "endpoint_test", ++ size = "small", ++ srcs = ["common/endpoint_test.cc"], ++ deps = [ ++ "//cyber", ++ "@com_google_googletest//:gtest_main", ++ ], ++) ++ ++apollo_cc_test( ++ name = "identity_test", ++ size = "small", ++ srcs = ["common/identity_test.cc"], ++ deps = [ ++ "//cyber", ++ "@com_google_googletest//:gtest_main", ++ ], ++) ++ ++apollo_cc_test( + name = "transport_test", + size = "small", + srcs = ["transport_test.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "//cyber/proto:unit_test_cc_proto", + "@com_google_googletest//:gtest", + ], + ) + ++apollo_cc_test( ++ name = "dispatcher_test", ++ size = "small", ++ srcs = ["dispatcher/dispatcher_test.cc"], ++ deps = [ ++ "//cyber", ++ "//cyber/proto:unit_test_cc_proto", ++ "@com_google_googletest//:gtest_main", ++ ], ++) ++ ++apollo_cc_test( ++ name = "intra_dispatcher_test", ++ size = "small", ++ srcs = ["dispatcher/intra_dispatcher_test.cc"], ++ deps = [ ++ "//cyber", ++ "//cyber/proto:unit_test_cc_proto", ++ "@com_google_googletest//:gtest_main", ++ ], ++) ++ ++apollo_cc_test( ++ name = "rtps_dispatcher_test", ++ size = "small", ++ srcs = ["dispatcher/rtps_dispatcher_test.cc"], ++ deps = [ ++ "//cyber", ++ "//cyber/proto:unit_test_cc_proto", ++ "@com_google_googletest//:gtest", ++ ], ++) ++ ++apollo_cc_test( ++ name = "shm_dispatcher_test", ++ size = "small", ++ srcs = ["dispatcher/shm_dispatcher_test.cc"], ++ deps = [ ++ "//cyber", ++ "//cyber/proto:unit_test_cc_proto", ++ "@com_google_googletest//:gtest_main", ++ ], ++) ++ ++apollo_package() + cpplint() +diff --color -Naur cyber/transport/common/BUILD /opt/apollo/cyber/transport/common/BUILD +--- cyber/transport/common/BUILD 2023-12-23 18:23:13.097910841 +0800 ++++ /opt/apollo/cyber/transport/common/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,54 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-filegroup( +- name = "cyber_transport_common_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "endpoint", +- srcs = ["endpoint.cc"], +- hdrs = ["endpoint.h"], +- deps = [ +- ":identity", +- "//cyber/common:global_data", +- "//cyber/proto:role_attributes_cc_proto", +- ], +-) +- +-cc_test( +- name = "endpoint_test", +- size = "small", +- srcs = ["endpoint_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "@com_google_googletest//:gtest_main", +- ], +-) +- +-cc_library( +- name = "identity", +- srcs = ["identity.cc"], +- hdrs = ["identity.h"], +- deps = [ +- "//cyber/common:util", +- "@uuid", +- ], +-) +- +-cc_test( +- name = "identity_test", +- size = "small", +- srcs = ["identity_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "@com_google_googletest//:gtest_main", +- ], +-) +- +-cpplint() +diff --color -Naur cyber/transport/dispatcher/BUILD /opt/apollo/cyber/transport/dispatcher/BUILD +--- cyber/transport/dispatcher/BUILD 2023-12-23 18:23:13.097910841 +0800 ++++ /opt/apollo/cyber/transport/dispatcher/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,110 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-filegroup( +- name = "cyber_transport_dispatcher_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "dispatcher", +- srcs = ["dispatcher.cc"], +- hdrs = ["dispatcher.h"], +- deps = [ +- "//cyber/common", +- "//cyber/message:message_traits", +- "//cyber/proto:role_attributes_cc_proto", +- "//cyber/transport/message:listener_handler", +- "//cyber/transport/message:message_info", +- ], +-) +- +-cc_test( +- name = "dispatcher_test", +- size = "small", +- srcs = ["dispatcher_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "//cyber/proto:unit_test_cc_proto", +- "@com_google_googletest//:gtest_main", +- ], +-) +- +-cc_library( +- name = "intra_dispatcher", +- srcs = ["intra_dispatcher.cc"], +- hdrs = ["intra_dispatcher.h"], +- deps = [ +- ":dispatcher", +- "//cyber/message:message_traits", +- "//cyber/proto:role_attributes_cc_proto", +- ], +-) +- +-cc_test( +- name = "intra_dispatcher_test", +- size = "small", +- srcs = ["intra_dispatcher_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "//cyber/proto:unit_test_cc_proto", +- "@com_google_googletest//:gtest_main", +- ], +-) +- +-cc_library( +- name = "rtps_dispatcher", +- srcs = ["rtps_dispatcher.cc"], +- hdrs = ["rtps_dispatcher.h"], +- deps = [ +- ":dispatcher", +- "//cyber/message:message_traits", +- "//cyber/proto:role_attributes_cc_proto", +- "//cyber/transport/rtps:attributes_filler", +- "//cyber/transport/rtps:participant", +- "//cyber/transport/rtps:sub_listener", +- ], +-) +- +-cc_test( +- name = "rtps_dispatcher_test", +- size = "small", +- srcs = ["rtps_dispatcher_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "//cyber/proto:unit_test_cc_proto", +- "@com_google_googletest//:gtest", +- ], +-) +- +-cc_library( +- name = "shm_dispatcher", +- srcs = ["shm_dispatcher.cc"], +- hdrs = ["shm_dispatcher.h"], +- deps = [ +- ":dispatcher", +- "//cyber/message:message_traits", +- "//cyber/proto:proto_desc_cc_proto", +- "//cyber/scheduler:scheduler_factory", +- "//cyber/transport/shm:notifier_factory", +- "//cyber/transport/shm:readable_info", +- "//cyber/transport/shm:segment_factory", +- ], +-) +- +-cc_test( +- name = "shm_dispatcher_test", +- size = "small", +- srcs = ["shm_dispatcher_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "//cyber/proto:unit_test_cc_proto", +- "@com_google_googletest//:gtest_main", +- ], +-) +- +-cpplint() +diff --color -Naur cyber/transport/integration_test/BUILD /opt/apollo/cyber/transport/integration_test/BUILD +--- cyber/transport/integration_test/BUILD 2023-12-23 18:23:13.097910841 +0800 ++++ /opt/apollo/cyber/transport/integration_test/BUILD 2023-12-23 18:05:58.590028978 +0800 +@@ -1,48 +1,49 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + load("//tools:cpplint.bzl", "cpplint") ++load("//tools:apollo_package.bzl", "apollo_package", "apollo_cc_test") + +-cc_test( ++apollo_cc_test( + name = "hybrid_transceiver_test", + size = "small", + srcs = ["hybrid_transceiver_test.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "//cyber/proto:unit_test_cc_proto", + "@com_google_googletest//:gtest", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "intra_transceiver_test", + size = "small", + srcs = ["intra_transceiver_test.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "//cyber/proto:unit_test_cc_proto", + "@com_google_googletest//:gtest_main", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "rtps_transceiver_test", + size = "small", + srcs = ["rtps_transceiver_test.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "//cyber/proto:unit_test_cc_proto", + "@com_google_googletest//:gtest", + ], + ) + +-cc_test( ++apollo_cc_test( + name = "shm_transceiver_test", + size = "small", + srcs = ["shm_transceiver_test.cc"], + deps = [ +- "//cyber:cyber_core", ++ "//cyber", + "//cyber/proto:unit_test_cc_proto", + "@com_google_googletest//:gtest", + ], + ) + ++apollo_package() + cpplint() +diff --color -Naur cyber/transport/message/BUILD /opt/apollo/cyber/transport/message/BUILD +--- cyber/transport/message/BUILD 2023-12-23 18:23:13.098910841 +0800 ++++ /opt/apollo/cyber/transport/message/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,72 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-filegroup( +- name = "cyber_transport_message_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "history_attributes", +- hdrs = ["history_attributes.h"], +- deps = [ +- "//cyber/proto:qos_profile_cc_proto", +- ], +-) +- +-cc_library( +- name = "history", +- hdrs = ["history.h"], +- deps = [ +- ":history_attributes", +- ], +-) +- +-cc_library( +- name = "listener_handler", +- hdrs = ["listener_handler.h"], +- deps = [ +- ":message_info", +- "//cyber/base:signal", +- "//cyber/message:message_traits", +- "//cyber/message:raw_message", +- ], +-) +- +-cc_library( +- name = "message_info", +- srcs = ["message_info.cc"], +- hdrs = ["message_info.h"], +- deps = [ +- "//cyber/common:log", +- "//cyber/transport/common:identity", +- ], +-) +- +-cc_test( +- name = "message_info_test", +- size = "small", +- srcs = ["message_info_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "@com_google_googletest//:gtest_main", +- ], +- linkstatic = True, +-) +- +-cc_test( +- name = "message_test", +- size = "small", +- srcs = ["message_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "@com_google_googletest//:gtest_main", +- ], +- linkstatic = True, +-) +- +-cpplint() +diff --color -Naur cyber/transport/qos/BUILD /opt/apollo/cyber/transport/qos/BUILD +--- cyber/transport/qos/BUILD 2023-12-23 18:23:13.098910841 +0800 ++++ /opt/apollo/cyber/transport/qos/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,29 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library") +-load("//tools:cpplint.bzl", "cpplint") +- +-filegroup( +- name = "cyber_transport_qos_hdrs", +- srcs = glob([ +- "*.h", +- ]), +- visibility = ["//visibility:public"], +-) +- +-cc_library( +- name = "qos", +- visibility = ["//visibility:public"], +- deps = [ +- ":qos_profile_conf", +- ], +-) +- +-cc_library( +- name = "qos_profile_conf", +- srcs = ["qos_profile_conf.cc"], +- hdrs = ["qos_profile_conf.h"], +- deps = [ +- "//cyber/proto:qos_profile_cc_proto", +- ], +-) +- +-cpplint() +diff --color -Naur cyber/transport/receiver/BUILD /opt/apollo/cyber/transport/receiver/BUILD +--- cyber/transport/receiver/BUILD 2023-12-23 18:23:13.098910841 +0800 ++++ /opt/apollo/cyber/transport/receiver/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,66 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-filegroup( +- name = "cyber_transport_receiver_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "receiver", +- deps = [ +- ":hybrid_receiver", +- ":intra_receiver", +- ":rtps_receiver", +- ":shm_receiver", +- ], +-) +- +-cc_library( +- name = "receiver_interface", +- hdrs = ["receiver.h"], +- deps = [ +- "//cyber/transport/common:endpoint", +- "//cyber/transport/message:history", +- "//cyber/transport/message:message_info", +- ], +-) +- +-cc_library( +- name = "hybrid_receiver", +- hdrs = ["hybrid_receiver.h"], +- deps = [ +- ":receiver_interface", +- ], +-) +- +-cc_library( +- name = "intra_receiver", +- hdrs = ["intra_receiver.h"], +- deps = [ +- ":receiver_interface", +- ], +-) +- +-cc_library( +- name = "rtps_receiver", +- hdrs = ["rtps_receiver.h"], +- deps = [ +- ":receiver_interface", +- ], +-) +- +-cc_library( +- name = "shm_receiver", +- hdrs = ["shm_receiver.h"], +- deps = [ +- ":receiver_interface", +- "//cyber/transport/shm:readable_info", +- ], +-) +- +-cpplint() +diff --color -Naur cyber/transport/rtps/BUILD /opt/apollo/cyber/transport/rtps/BUILD +--- cyber/transport/rtps/BUILD 2023-12-23 18:23:13.099910841 +0800 ++++ /opt/apollo/cyber/transport/rtps/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,77 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-filegroup( +- name = "cyber_transport_rtps_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "attributes_filler", +- srcs = ["attributes_filler.cc"], +- hdrs = ["attributes_filler.h"], +- deps = [ +- "//cyber/common:log", +- "//cyber/transport/qos", +- "@fastrtps", +- ], +-) +- +-cc_library( +- name = "underlay_message", +- srcs = ["underlay_message.cc"], +- hdrs = ["underlay_message.h"], +- deps = [ +- "//cyber/common:log", +- "@fastrtps", +- ], +-) +- +-cc_library( +- name = "participant", +- srcs = ["participant.cc"], +- hdrs = ["participant.h"], +- deps = [ +- ":underlay_message", +- ":underlay_message_type", +- "//cyber/common:global_data", +- ], +-) +- +-cc_library( +- name = "sub_listener", +- srcs = ["sub_listener.cc"], +- hdrs = ["sub_listener.h"], +- deps = [ +- ":underlay_message", +- ":underlay_message_type", +- "//cyber/transport/message:message_info", +- ], +-) +- +-cc_library( +- name = "underlay_message_type", +- srcs = ["underlay_message_type.cc"], +- hdrs = ["underlay_message_type.h"], +- deps = [ +- ":underlay_message", +- "@fastrtps", +- ], +-) +- +-cc_test( +- name = "rtps_test", +- size = "small", +- srcs = ["rtps_test.cc"], +- deps = [ +- "//cyber:cyber_core", +- "@com_google_googletest//:gtest_main", +- "@fastrtps", +- ], +-) +- +-cpplint() +diff --color -Naur cyber/transport/shm/BUILD /opt/apollo/cyber/transport/shm/BUILD +--- cyber/transport/shm/BUILD 2023-12-23 18:23:13.100910841 +0800 ++++ /opt/apollo/cyber/transport/shm/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,152 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-filegroup( +- name = "cyber_transport_shm_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "block", +- srcs = ["block.cc"], +- hdrs = ["block.h"], +- deps = [ +- "//cyber/base:atomic_rw_lock", +- "//cyber/common:log", +- ], +-) +- +-cc_library( +- name = "condition_notifier", +- srcs = ["condition_notifier.cc"], +- hdrs = ["condition_notifier.h"], +- deps = [ +- ":notifier_base", +- "//cyber/common:global_data", +- "//cyber/common:log", +- "//cyber/common:util", +- ], +-) +- +-cc_library( +- name = "multicast_notifier", +- srcs = ["multicast_notifier.cc"], +- hdrs = ["multicast_notifier.h"], +- deps = [ +- ":notifier_base", +- "//cyber/common:global_data", +- "//cyber/common:log", +- "//cyber/common:macros", +- ], +-) +- +-cc_library( +- name = "notifier_base", +- hdrs = ["notifier_base.h"], +- deps = [ +- ":readable_info", +- ], +-) +- +-cc_library( +- name = "notifier_factory", +- srcs = ["notifier_factory.cc"], +- hdrs = ["notifier_factory.h"], +- deps = [ +- ":condition_notifier", +- ":multicast_notifier", +- ":notifier_base", +- "//cyber/common:global_data", +- "//cyber/common:log", +- ], +-) +- +-cc_library( +- name = "readable_info", +- srcs = ["readable_info.cc"], +- hdrs = ["readable_info.h"], +- deps = [ +- "//cyber/common:log", +- ], +-) +- +-cc_library( +- name = "xsi_segment", +- srcs = ["xsi_segment.cc"], +- hdrs = ["xsi_segment.h"], +- deps = [ +- ":segment", +- "//cyber/common:log", +- "//cyber/common:util", +- ], +-) +- +-cc_library( +- name = "posix_segment", +- srcs = ["posix_segment.cc"], +- hdrs = ["posix_segment.h"], +- deps = [ +- ":segment", +- "//cyber/common:log", +- "//cyber/common:util", +- ], +-) +- +-cc_library( +- name = "segment", +- srcs = ["segment.cc"], +- hdrs = ["segment.h"], +- deps = [ +- ":block", +- ":shm_conf", +- ":state", +- "//cyber/common:log", +- "//cyber/common:util", +- ], +-) +- +-cc_library( +- name = "segment_factory", +- srcs = ["segment_factory.cc"], +- hdrs = ["segment_factory.h"], +- deps = [ +- ":posix_segment", +- ":segment", +- ":xsi_segment", +- "//cyber/common:global_data", +- "//cyber/common:log", +- ], +-) +- +-cc_library( +- name = "shm_conf", +- srcs = ["shm_conf.cc"], +- hdrs = ["shm_conf.h"], +- deps = [ +- "//cyber/common:log", +- ], +-) +- +-cc_library( +- name = "state", +- srcs = ["state.cc"], +- hdrs = ["state.h"], +-) +- +-cc_test( +- name = "condition_notifier_test", +- size = "small", +- srcs = ["condition_notifier_test.cc"], +- tags = ["exclusive"], +- deps = [ +- "//cyber:cyber_core", +- "@com_google_googletest//:gtest_main", +- ], +- linkstatic = True, +-) +- +-cpplint() +diff --color -Naur cyber/transport/transmitter/BUILD /opt/apollo/cyber/transport/transmitter/BUILD +--- cyber/transport/transmitter/BUILD 2023-12-23 18:23:13.100910841 +0800 ++++ /opt/apollo/cyber/transport/transmitter/BUILD 1970-01-01 08:00:00.000000000 +0800 +@@ -1,65 +0,0 @@ +-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") +-load("//tools:cpplint.bzl", "cpplint") +- +-package(default_visibility = ["//visibility:public"]) +- +-filegroup( +- name = "cyber_transport_transmitter_hdrs", +- srcs = glob([ +- "*.h", +- ]), +-) +- +-cc_library( +- name = "transmitter", +- deps = [ +- ":hybrid_transmitter", +- ":intra_transmitter", +- ":rtps_transmitter", +- ":shm_transmitter", +- ], +- ) +- +-cc_library( +- name = "hybrid_transmitter", +- hdrs = ["hybrid_transmitter.h"], +- deps = [ +- ":transmitter_interface", +- ], +-) +- +-cc_library( +- name = "intra_transmitter", +- hdrs = ["intra_transmitter.h"], +- deps = [ +- ":transmitter_interface", +- ], +-) +- +-cc_library( +- name = "transmitter_interface", +- hdrs = ["transmitter.h"], +- deps = [ +- "//cyber/event:perf_event_cache", +- "//cyber/transport/common:endpoint", +- "//cyber/transport/message:message_info", +- ], +-) +- +-cc_library( +- name = "rtps_transmitter", +- hdrs = ["rtps_transmitter.h"], +- deps = [ +- ":transmitter_interface", +- ], +-) +- +-cc_library( +- name = "shm_transmitter", +- hdrs = ["shm_transmitter.h"], +- deps = [ +- ":transmitter_interface", +- ], +-) +- +-cpplint()