From 62f77fd4a0435a9023cf83ff2a91e182ef15acc3 Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Tue, 30 Jul 2013 14:44:23 +0200 Subject: [PATCH] migration to gradle, splitted wiiusej, wiigee and itunescontroller into subprojects --- java/build.gradle | 16 + java/itunescontroller/.classpath | 7 + java/itunescontroller/.project | 18 + java/itunescontroller/build.gradle | 3 + .../com/dt/iTunesController/ITArtwork.java | 55 ++ .../iTunesController/ITArtworkCollection.java | 55 ++ .../dt/iTunesController/ITArtworkFormat.java | 13 + .../iTunesController/ITAudioCDPlaylist.java | 76 ++ .../dt/iTunesController/ITBrowserWindow.java | 45 ++ .../iTunesController/ITCOMDisabledReason.java | 12 + .../com/dt/iTunesController/ITEQPreset.java | 236 ++++++ .../dt/iTunesController/ITFileOrCDTrack.java | 39 + .../iTunesController/ITLibraryPlaylist.java | 20 + .../com/dt/iTunesController/ITObject.java | 112 +++ .../ITObjectPersistentID.java | 53 ++ .../iTunesController/ITOperationStatus.java | 62 ++ .../dt/iTunesController/ITPlayerState.java | 13 + .../com/dt/iTunesController/ITPlaylist.java | 180 +++++ .../ITPlaylistCollection.java | 67 ++ .../dt/iTunesController/ITPlaylistKind.java | 15 + .../iTunesController/ITPlaylistPrintKind.java | 14 + .../ITPlaylistRepeatMode.java | 14 + .../ITPlaylistSearchField.java | 16 + .../com/dt/iTunesController/ITRatingKind.java | 11 + .../com/dt/iTunesController/ITSource.java | 51 ++ .../iTunesController/ITSourceCollection.java | 66 ++ .../com/dt/iTunesController/ITSourceKind.java | 17 + .../java/com/dt/iTunesController/ITTrack.java | 493 ++++++++++++ .../iTunesController/ITTrackCollection.java | 99 +++ .../com/dt/iTunesController/ITTrackKind.java | 15 + .../com/dt/iTunesController/ITURLTrack.java | 175 +++++ .../dt/iTunesController/ITUserPlaylist.java | 60 ++ .../com/dt/iTunesController/ITVideoKind.java | 13 + .../com/dt/iTunesController/ITWindow.java | 32 + .../iTunesController/ITWindowCollection.java | 55 ++ .../java/com/dt/iTunesController/iTunes.java | 539 +++++++++++++ .../com/dt/iTunesController/iTunesEvents.java | 62 ++ .../iTunesEventsInterface.java | 115 +++ java/mimis/.classpath | 11 + java/mimis/.project | 18 + java/mimis/DelcomDLL.dll | Bin 0 -> 90112 bytes java/mimis/WiiPair.exe | Bin 0 -> 10752 bytes java/mimis/build.gradle | 35 + java/mimis/build.xml | 61 ++ java/mimis/client.jar | Bin 0 -> 1777650 bytes java/mimis/irtoy.exe | Bin 0 -> 22528 bytes java/mimis/jacob-1.15-M3-x86.dll | Bin 0 -> 176128 bytes java/mimis/jintellitype.dll | Bin 0 -> 30208 bytes java/mimis/jxinput.dll | Bin 0 -> 94208 bytes java/mimis/launch4j.xml | 22 + java/mimis/lib/jxinput.jar | Bin 0 -> 73232 bytes java/mimis/main.jar | Bin 0 -> 1777648 bytes java/mimis/mimis.dll | Bin 0 -> 197844 bytes java/mimis/mimis.exe | Bin 0 -> 1904112 bytes java/mimis/src/main/java/mimis/Client.java | 25 + java/mimis/src/main/java/mimis/Gui.java | 98 +++ java/mimis/src/main/java/mimis/Main.java | 102 +++ java/mimis/src/main/java/mimis/Mimis.java | 81 ++ .../java/mimis/application/Application.java | 6 + .../mimis/application/cmd/CMDApplication.java | 80 ++ .../cmd/windows/WindowsApplication.java | 100 +++ .../gomplayer/GomPlayerApplication.java | 127 ++++ .../photoviewer/PhotoViewerApplication.java | 110 +++ .../cmd/windows/winamp/WinampApplication.java | 181 +++++ .../cmd/windows/wmp/WMPApplication.java | 86 +++ .../application/itunes/iTunesApplication.java | 177 +++++ .../application/lirc/LircApplication.java | 42 ++ .../lirc/ipod/iPodApplication.java | 86 +++ .../mimis/application/mpc/MPCApplication.java | 102 +++ .../application/robot/RobotApplication.java | 35 + .../mimis/application/vlc/VLCApplication.java | 198 +++++ .../src/main/java/mimis/device/Device.java | 5 + .../device/javainput/DirectionButton.java | 39 + .../device/javainput/JavaInputDevice.java | 85 +++ .../device/javainput/JavaInputListener.java | 85 +++ .../javainput/extreme3d/Extreme3DButton.java | 43 ++ .../javainput/extreme3d/Extreme3DDevice.java | 38 + .../extreme3d/Extreme3DTaskMapCycle.java | 70 ++ .../javainput/rumblepad/RumblepadButton.java | 41 + .../javainput/rumblepad/RumblepadDevice.java | 38 + .../rumblepad/RumblepadTaskMapCycle.java | 70 ++ .../device/jintellitype/CommandButton.java | 74 ++ .../mimis/device/jintellitype/Hotkey.java | 46 ++ .../jintellitype/JIntellitypeDevice.java | 71 ++ .../JIntellitypeTaskMapCycle.java | 45 ++ .../mimis/device/jintellitype/Modifier.java | 25 + .../java/mimis/device/lirc/LircButton.java | 10 + .../mimis/device/lirc/LircButtonListener.java | 5 + .../java/mimis/device/lirc/LircDevice.java | 108 +++ .../java/mimis/device/lirc/LircService.java | 160 ++++ .../mimis/device/lirc/LircTaskMapCycle.java | 19 + .../device/lirc/remote/DenonRC176Button.java | 50 ++ .../lirc/remote/DenonRC176EventMap.java | 32 + .../lirc/remote/PhiliphsRCLE011Button.java | 57 ++ .../lirc/remote/PhiliphsRCLE011EventMap.java | 32 + .../lirc/remote/SamsungBN5901015AButton.java | 70 ++ .../remote/SamsungBN5901015AEventMap.java | 14 + .../device/lirc/remote/WC02IPOButton.java | 28 + .../mimis/device/network/NetworkDevice.java | 189 +++++ .../main/java/mimis/device/panel/Panel.java | 180 +++++ .../java/mimis/device/panel/PanelButton.java | 20 + .../java/mimis/device/panel/PanelDevice.java | 44 ++ .../mimis/device/panel/PanelTaskMapCycle.java | 33 + .../mimis/device/wiimote/WiimoteButton.java | 38 + .../mimis/device/wiimote/WiimoteDevice.java | 271 +++++++ .../device/wiimote/WiimoteDiscovery.java | 80 ++ .../mimis/device/wiimote/WiimoteService.java | 122 +++ .../device/wiimote/WiimoteTaskMapCycle.java | 50 ++ .../device/wiimote/gesture/GestureDevice.java | 112 +++ .../device/wiimote/motion/MotionData.java | 29 + .../device/wiimote/motion/MotionDevice.java | 190 +++++ .../mimis/exception/ApplicationException.java | 5 + .../java/mimis/exception/ButtonException.java | 5 + .../java/mimis/exception/DeviceException.java | 5 + .../java/mimis/exception/EventException.java | 5 + .../java/mimis/exception/ExitException.java | 5 + .../mimis/exception/HandlerException.java | 5 + .../mimis/exception/InitialiseException.java | 5 + .../java/mimis/exception/MacroException.java | 9 + .../java/mimis/exception/TaskException.java | 5 + .../java/mimis/exception/WorkerException.java | 5 + .../application/ApplicationExitException.java | 7 + .../ApplicationInitialiseException.java | 7 + .../windows/WindowsApplicationException.java | 7 + .../button/UnknownButtonException.java | 7 + .../button/UnknownDirectionException.java | 7 + .../exception/device/DeviceExitException.java | 7 + .../device/DeviceInitialiseException.java | 7 + .../device/DeviceNotFoundException.java | 5 + .../device/JavaInputDeviceException.java | 7 + .../JavaInputDeviceSpecificException.java | 7 + .../exception/event/SpreaderException.java | 7 + .../event/router/GlobalRouterException.java | 7 + .../exception/macro/StateOrderException.java | 11 + .../mimis/exception/task/ActionException.java | 7 + .../task/TaskNotSupportedException.java | 5 + .../action/ActionDeserializeException.java | 7 + .../exception/util/SendCommandException.java | 7 + .../exception/util/SendKeyException.java | 7 + .../exception/worker/ActivateException.java | 7 + .../worker/AlreadyActiveException.java | 7 + .../worker/AlreadyRunningException.java | 7 + .../exception/worker/DeactivateException.java | 7 + .../exception/worker/NotActiveException.java | 7 + .../exception/worker/NotRunningException.java | 7 + .../exception/worker/StartException.java | 7 + .../src/main/java/mimis/input/Button.java | 5 + .../src/main/java/mimis/input/Feedback.java | 16 + .../src/main/java/mimis/input/Input.java | 5 + .../mimis/src/main/java/mimis/input/Task.java | 47 ++ .../java/mimis/input/button/ColorButton.java | 7 + .../java/mimis/input/button/NumberButton.java | 7 + .../src/main/java/mimis/input/state/Hold.java | 11 + .../main/java/mimis/input/state/Press.java | 11 + .../main/java/mimis/input/state/Release.java | 11 + .../main/java/mimis/input/state/State.java | 33 + .../mimis/input/state/sequence/Macro.java | 49 ++ .../mimis/input/state/sequence/Sequence.java | 19 + .../java/mimis/manager/ButtonManager.java | 76 ++ .../mimis/manager/CurrentButtonManager.java | 99 +++ .../src/main/java/mimis/manager/Manager.java | 51 ++ .../src/main/java/mimis/manager/Titled.java | 5 + .../main/java/mimis/manager/WorkerButton.java | 49 ++ .../src/main/java/mimis/parser/Parser.java | 135 ++++ .../main/java/mimis/parser/ParserInput.java | 42 ++ .../main/java/mimis/router/GlobalRouter.java | 89 +++ .../src/main/java/mimis/router/Router.java | 75 ++ .../src/main/java/mimis/state/Active.java | 37 + .../src/main/java/mimis/state/TaskMap.java | 40 + .../main/java/mimis/state/TaskMapCycle.java | 14 + .../src/main/java/mimis/util/ArrayCycle.java | 39 + .../main/java/mimis/util/BufferedSound.java | 29 + java/mimis/src/main/java/mimis/util/Ir.java | 180 +++++ .../src/main/java/mimis/util/Multiplexer.java | 54 ++ .../src/main/java/mimis/util/Native.java | 45 ++ .../src/main/java/mimis/util/Reader.java | 19 + .../mimis/src/main/java/mimis/util/Sound.java | 214 ++++++ .../mimis/src/main/java/mimis/util/Swing.java | 29 + java/mimis/src/main/java/mimis/util/Type.java | 25 + .../util/multiplexer/SignalListener.java | 7 + .../java/mimis/util/swing/CycleButton.java | 23 + .../main/java/mimis/util/swing/Dialog.java | 18 + .../java/mimis/util/swing/HoldButton.java | 33 + .../mimis/util/swing/HoldButtonListener.java | 6 + .../java/mimis/util/swing/ToggleButton.java | 18 + .../src/main/java/mimis/value/Action.java | 5 + .../src/main/java/mimis/value/Amount.java | 5 + .../src/main/java/mimis/value/Command.java | 84 +++ java/mimis/src/main/java/mimis/value/Key.java | 180 +++++ .../src/main/java/mimis/value/Registry.java | 21 + .../src/main/java/mimis/value/Signal.java | 5 + .../src/main/java/mimis/value/Target.java | 5 + .../mimis/src/main/java/mimis/value/Type.java | 18 + .../src/main/java/mimis/value/Windows.java | 20 + .../src/main/java/mimis/worker/Component.java | 124 +++ .../java/mimis/worker/IntervalWorker.java | 81 ++ .../src/main/java/mimis/worker/Listener.java | 35 + .../src/main/java/mimis/worker/Worker.java | 123 +++ .../src/main/java/test/CustomAppender.java | 27 + java/mimis/src/main/resources/M.ico | Bin 0 -> 99678 bytes java/mimis/src/main/resources/M.png | Bin 0 -> 15771 bytes .../services/mimis.application.Application | 8 + .../META-INF/services/mimis.device.Device | 7 + java/mimis/src/main/resources/Mimis.bmp | Bin 0 -> 900054 bytes java/mimis/src/main/resources/Mimis.png | Bin 0 -> 140366 bytes .../main/resources/commons-logging.properties | 1 + .../mimis/src/main/resources/icons/camera.png | Bin 0 -> 1548 bytes .../src/main/resources/icons/comment.png | Bin 0 -> 1185 bytes .../src/main/resources/icons/connect.png | Bin 0 -> 1562 bytes .../resources/icons/control_eject_blue.png | Bin 0 -> 2090 bytes .../main/resources/icons/control_end_blue.png | Bin 0 -> 2146 bytes .../icons/control_fastforward_blue.png | Bin 0 -> 2027 bytes .../resources/icons/control_pause_blue.png | Bin 0 -> 1962 bytes .../resources/icons/control_play_blue.png | Bin 0 -> 1971 bytes .../resources/icons/control_rewind_blue.png | Bin 0 -> 2044 bytes .../resources/icons/control_start_blue.png | Bin 0 -> 2148 bytes .../resources/icons/control_stop_blue.png | Bin 0 -> 1930 bytes java/mimis/src/main/resources/icons/down.png | Bin 0 -> 3680 bytes .../src/main/resources/icons/forward.png | Bin 0 -> 3925 bytes java/mimis/src/main/resources/icons/image.png | Bin 0 -> 1292 bytes java/mimis/src/main/resources/icons/mute.png | Bin 0 -> 4423 bytes java/mimis/src/main/resources/icons/next.png | Bin 0 -> 3916 bytes java/mimis/src/main/resources/icons/pause.png | Bin 0 -> 3559 bytes java/mimis/src/main/resources/icons/play.png | Bin 0 -> 3793 bytes .../src/main/resources/icons/previous.png | Bin 0 -> 3926 bytes .../mimis/src/main/resources/icons/repeat.png | Bin 0 -> 4352 bytes .../mimis/src/main/resources/icons/rewind.png | Bin 0 -> 3871 bytes .../src/main/resources/icons/shuffle.png | Bin 0 -> 3773 bytes .../src/main/resources/icons/sound_mute.png | Bin 0 -> 2080 bytes java/mimis/src/main/resources/icons/stop.png | Bin 0 -> 3237 bytes .../mimis/src/main/resources/icons/unmute.png | Bin 0 -> 3413 bytes java/mimis/src/main/resources/icons/up.png | Bin 0 -> 3606 bytes .../src/main/resources/icons/volumeDown.png | Bin 0 -> 3959 bytes .../src/main/resources/icons/volumeUp.png | Bin 0 -> 3964 bytes .../mimis/src/main/resources/log4j.properties | 8 + java/mimis/wiiscan.exe | Bin 0 -> 281088 bytes java/mimis/wiiuse.dll | Bin 0 -> 84341 bytes java/mimis/wiiusej.dll | Bin 0 -> 19456 bytes java/mimis/wiiusej.jar | Bin 0 -> 222970 bytes java/mimis/wpcom.dll | Bin 0 -> 34934 bytes java/settings.gradle | 1 + java/wiigee/.classpath | 7 + java/wiigee/.project | 18 + java/wiigee/build.gradle | 2 + .../main/java/org/wiigee/control/Wiigee.java | 46 ++ .../main/java/org/wiigee/device/Device.java | 245 ++++++ .../org/wiigee/event/AccelerationEvent.java | 79 ++ .../wiigee/event/AccelerationListener.java | 65 ++ .../org/wiigee/event/ActionStartEvent.java | 84 +++ .../org/wiigee/event/ActionStopEvent.java | 44 ++ .../java/org/wiigee/event/ButtonListener.java | 54 ++ .../org/wiigee/event/ButtonPressedEvent.java | 80 ++ .../org/wiigee/event/ButtonReleasedEvent.java | 48 ++ .../java/org/wiigee/event/GestureEvent.java | 71 ++ .../org/wiigee/event/GestureListener.java | 47 ++ .../java/org/wiigee/event/InfraredEvent.java | 70 ++ .../org/wiigee/event/InfraredListener.java | 40 + .../org/wiigee/event/MotionStartEvent.java | 63 ++ .../org/wiigee/event/MotionStopEvent.java | 42 ++ .../java/org/wiigee/event/RotationEvent.java | 66 ++ .../org/wiigee/event/RotationListener.java | 43 ++ .../org/wiigee/event/RotationSpeedEvent.java | 61 ++ .../filter/DirectionalEquivalenceFilter.java | 70 ++ .../main/java/org/wiigee/filter/Filter.java | 62 ++ .../org/wiigee/filter/HighPassFilter.java | 71 ++ .../org/wiigee/filter/IdleStateFilter.java | 86 +++ .../java/org/wiigee/filter/LowPassFilter.java | 67 ++ .../org/wiigee/filter/MotionDetectFilter.java | 102 +++ .../filter/RotationThresholdFilter.java | 71 ++ .../java/org/wiigee/logic/Classifier.java | 109 +++ .../main/java/org/wiigee/logic/Gesture.java | 156 ++++ .../java/org/wiigee/logic/GestureModel.java | 206 +++++ .../src/main/java/org/wiigee/logic/HMM.java | 315 ++++++++ .../java/org/wiigee/logic/PreciseHMM.java | 449 +++++++++++ .../java/org/wiigee/logic/ProcessingUnit.java | 72 ++ .../main/java/org/wiigee/logic/Quantizer.java | 310 ++++++++ .../wiigee/logic/TriggeredProcessingUnit.java | 195 +++++ .../src/main/java/org/wiigee/logic/XHMM.java | 85 +++ .../src/main/java/org/wiigee/util/FileIO.java | 234 ++++++ .../src/main/java/org/wiigee/util/Log.java | 43 ++ java/wiiusej/.classpath | 7 + java/wiiusej/.project | 18 + java/wiiusej/build.gradle | 3 + .../src/main/java/wiiusej/WiiUseApi.java | 366 +++++++++ .../main/java/wiiusej/WiiUseApiManager.java | 711 ++++++++++++++++++ .../src/main/java/wiiusej/Wiimote.java | 569 ++++++++++++++ .../java/wiiusej/values/Acceleration.java | 33 + .../main/java/wiiusej/values/Calibration.java | 31 + .../src/main/java/wiiusej/values/GForce.java | 83 ++ .../main/java/wiiusej/values/IRSource.java | 106 +++ .../main/java/wiiusej/values/Orientation.java | 120 +++ .../java/wiiusej/values/RawAcceleration.java | 84 +++ .../wiiusej/wiiusejevents/GenericEvent.java | 62 ++ .../BalanceBoardButtonsEvent.java | 11 + .../physicalevents/BalanceBoardEvent.java | 31 + .../physicalevents/ButtonsEvent.java | 128 ++++ .../ClassicControllerButtonsEvent.java | 329 ++++++++ .../ClassicControllerEvent.java | 177 +++++ .../physicalevents/ExpansionEvent.java | 40 + .../GuitarHeroButtonsEvent.java | 214 ++++++ .../physicalevents/GuitarHeroEvent.java | 119 +++ .../wiiusejevents/physicalevents/IREvent.java | 319 ++++++++ .../physicalevents/JoystickEvent.java | 135 ++++ .../physicalevents/MotionSensingEvent.java | 204 +++++ .../physicalevents/NunchukButtonsEvent.java | 89 +++ .../physicalevents/NunchukEvent.java | 169 +++++ .../physicalevents/WiimoteButtonsEvent.java | 267 +++++++ .../wiiusejevents/utils/EventsGatherer.java | 529 +++++++++++++ .../utils/WiiUseApiListener.java | 37 + .../wiiusejevents/utils/WiimoteListener.java | 149 ++++ .../BalanceBoardInsertedEvent.java | 15 + .../BalanceBoardRemovedEvent.java | 17 + .../ClassicControllerInsertedEvent.java | 46 ++ .../ClassicControllerRemovedEvent.java | 47 ++ .../wiiuseapievents/DisconnectionEvent.java | 45 ++ .../GuitarHeroInsertedEvent.java | 47 ++ .../GuitarHeroRemovedEvent.java | 47 ++ .../wiiuseapievents/NunchukInsertedEvent.java | 51 ++ .../wiiuseapievents/NunchukRemovedEvent.java | 50 ++ .../wiiuseapievents/StatusEvent.java | 293 ++++++++ .../wiiuseapievents/WiiUseApiEvent.java | 67 ++ .../wiiuseapievents/WiimoteEvent.java | 447 +++++++++++ 322 files changed, 20394 insertions(+) create mode 100644 java/build.gradle create mode 100644 java/itunescontroller/.classpath create mode 100644 java/itunescontroller/.project create mode 100644 java/itunescontroller/build.gradle create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtwork.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtworkCollection.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtworkFormat.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITAudioCDPlaylist.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITBrowserWindow.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITCOMDisabledReason.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITEQPreset.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITFileOrCDTrack.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITLibraryPlaylist.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITObject.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITObjectPersistentID.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITOperationStatus.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlayerState.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylist.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistCollection.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistKind.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistPrintKind.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistRepeatMode.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistSearchField.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITRatingKind.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITSource.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITSourceCollection.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITSourceKind.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrack.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrackCollection.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrackKind.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITURLTrack.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITUserPlaylist.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITVideoKind.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITWindow.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/ITWindowCollection.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/iTunes.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/iTunesEvents.java create mode 100644 java/itunescontroller/src/main/java/com/dt/iTunesController/iTunesEventsInterface.java create mode 100644 java/mimis/.classpath create mode 100644 java/mimis/.project create mode 100644 java/mimis/DelcomDLL.dll create mode 100644 java/mimis/WiiPair.exe create mode 100644 java/mimis/build.gradle create mode 100644 java/mimis/build.xml create mode 100644 java/mimis/client.jar create mode 100644 java/mimis/irtoy.exe create mode 100644 java/mimis/jacob-1.15-M3-x86.dll create mode 100644 java/mimis/jintellitype.dll create mode 100644 java/mimis/jxinput.dll create mode 100644 java/mimis/launch4j.xml create mode 100644 java/mimis/lib/jxinput.jar create mode 100644 java/mimis/main.jar create mode 100644 java/mimis/mimis.dll create mode 100644 java/mimis/mimis.exe create mode 100644 java/mimis/src/main/java/mimis/Client.java create mode 100644 java/mimis/src/main/java/mimis/Gui.java create mode 100644 java/mimis/src/main/java/mimis/Main.java create mode 100644 java/mimis/src/main/java/mimis/Mimis.java create mode 100644 java/mimis/src/main/java/mimis/application/Application.java create mode 100644 java/mimis/src/main/java/mimis/application/cmd/CMDApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/cmd/windows/WindowsApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/cmd/windows/gomplayer/GomPlayerApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/cmd/windows/photoviewer/PhotoViewerApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/cmd/windows/winamp/WinampApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/cmd/windows/wmp/WMPApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/itunes/iTunesApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/lirc/LircApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/lirc/ipod/iPodApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/mpc/MPCApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/robot/RobotApplication.java create mode 100644 java/mimis/src/main/java/mimis/application/vlc/VLCApplication.java create mode 100644 java/mimis/src/main/java/mimis/device/Device.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/DirectionButton.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/JavaInputDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/JavaInputListener.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/extreme3d/Extreme3DButton.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/extreme3d/Extreme3DDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/extreme3d/Extreme3DTaskMapCycle.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/rumblepad/RumblepadButton.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/rumblepad/RumblepadDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/javainput/rumblepad/RumblepadTaskMapCycle.java create mode 100644 java/mimis/src/main/java/mimis/device/jintellitype/CommandButton.java create mode 100644 java/mimis/src/main/java/mimis/device/jintellitype/Hotkey.java create mode 100644 java/mimis/src/main/java/mimis/device/jintellitype/JIntellitypeDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/jintellitype/JIntellitypeTaskMapCycle.java create mode 100644 java/mimis/src/main/java/mimis/device/jintellitype/Modifier.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/LircButton.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/LircButtonListener.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/LircDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/LircService.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/LircTaskMapCycle.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/remote/DenonRC176Button.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/remote/DenonRC176EventMap.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/remote/PhiliphsRCLE011Button.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/remote/PhiliphsRCLE011EventMap.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/remote/SamsungBN5901015AButton.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/remote/SamsungBN5901015AEventMap.java create mode 100644 java/mimis/src/main/java/mimis/device/lirc/remote/WC02IPOButton.java create mode 100644 java/mimis/src/main/java/mimis/device/network/NetworkDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/panel/Panel.java create mode 100644 java/mimis/src/main/java/mimis/device/panel/PanelButton.java create mode 100644 java/mimis/src/main/java/mimis/device/panel/PanelDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/panel/PanelTaskMapCycle.java create mode 100644 java/mimis/src/main/java/mimis/device/wiimote/WiimoteButton.java create mode 100644 java/mimis/src/main/java/mimis/device/wiimote/WiimoteDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/wiimote/WiimoteDiscovery.java create mode 100644 java/mimis/src/main/java/mimis/device/wiimote/WiimoteService.java create mode 100644 java/mimis/src/main/java/mimis/device/wiimote/WiimoteTaskMapCycle.java create mode 100644 java/mimis/src/main/java/mimis/device/wiimote/gesture/GestureDevice.java create mode 100644 java/mimis/src/main/java/mimis/device/wiimote/motion/MotionData.java create mode 100644 java/mimis/src/main/java/mimis/device/wiimote/motion/MotionDevice.java create mode 100644 java/mimis/src/main/java/mimis/exception/ApplicationException.java create mode 100644 java/mimis/src/main/java/mimis/exception/ButtonException.java create mode 100644 java/mimis/src/main/java/mimis/exception/DeviceException.java create mode 100644 java/mimis/src/main/java/mimis/exception/EventException.java create mode 100644 java/mimis/src/main/java/mimis/exception/ExitException.java create mode 100644 java/mimis/src/main/java/mimis/exception/HandlerException.java create mode 100644 java/mimis/src/main/java/mimis/exception/InitialiseException.java create mode 100644 java/mimis/src/main/java/mimis/exception/MacroException.java create mode 100644 java/mimis/src/main/java/mimis/exception/TaskException.java create mode 100644 java/mimis/src/main/java/mimis/exception/WorkerException.java create mode 100644 java/mimis/src/main/java/mimis/exception/application/ApplicationExitException.java create mode 100644 java/mimis/src/main/java/mimis/exception/application/ApplicationInitialiseException.java create mode 100644 java/mimis/src/main/java/mimis/exception/application/windows/WindowsApplicationException.java create mode 100644 java/mimis/src/main/java/mimis/exception/button/UnknownButtonException.java create mode 100644 java/mimis/src/main/java/mimis/exception/button/UnknownDirectionException.java create mode 100644 java/mimis/src/main/java/mimis/exception/device/DeviceExitException.java create mode 100644 java/mimis/src/main/java/mimis/exception/device/DeviceInitialiseException.java create mode 100644 java/mimis/src/main/java/mimis/exception/device/DeviceNotFoundException.java create mode 100644 java/mimis/src/main/java/mimis/exception/device/JavaInputDeviceException.java create mode 100644 java/mimis/src/main/java/mimis/exception/device/javainput/JavaInputDeviceSpecificException.java create mode 100644 java/mimis/src/main/java/mimis/exception/event/SpreaderException.java create mode 100644 java/mimis/src/main/java/mimis/exception/event/router/GlobalRouterException.java create mode 100644 java/mimis/src/main/java/mimis/exception/macro/StateOrderException.java create mode 100644 java/mimis/src/main/java/mimis/exception/task/ActionException.java create mode 100644 java/mimis/src/main/java/mimis/exception/task/TaskNotSupportedException.java create mode 100644 java/mimis/src/main/java/mimis/exception/task/action/ActionDeserializeException.java create mode 100644 java/mimis/src/main/java/mimis/exception/util/SendCommandException.java create mode 100644 java/mimis/src/main/java/mimis/exception/util/SendKeyException.java create mode 100644 java/mimis/src/main/java/mimis/exception/worker/ActivateException.java create mode 100644 java/mimis/src/main/java/mimis/exception/worker/AlreadyActiveException.java create mode 100644 java/mimis/src/main/java/mimis/exception/worker/AlreadyRunningException.java create mode 100644 java/mimis/src/main/java/mimis/exception/worker/DeactivateException.java create mode 100644 java/mimis/src/main/java/mimis/exception/worker/NotActiveException.java create mode 100644 java/mimis/src/main/java/mimis/exception/worker/NotRunningException.java create mode 100644 java/mimis/src/main/java/mimis/exception/worker/StartException.java create mode 100644 java/mimis/src/main/java/mimis/input/Button.java create mode 100644 java/mimis/src/main/java/mimis/input/Feedback.java create mode 100644 java/mimis/src/main/java/mimis/input/Input.java create mode 100644 java/mimis/src/main/java/mimis/input/Task.java create mode 100644 java/mimis/src/main/java/mimis/input/button/ColorButton.java create mode 100644 java/mimis/src/main/java/mimis/input/button/NumberButton.java create mode 100644 java/mimis/src/main/java/mimis/input/state/Hold.java create mode 100644 java/mimis/src/main/java/mimis/input/state/Press.java create mode 100644 java/mimis/src/main/java/mimis/input/state/Release.java create mode 100644 java/mimis/src/main/java/mimis/input/state/State.java create mode 100644 java/mimis/src/main/java/mimis/input/state/sequence/Macro.java create mode 100644 java/mimis/src/main/java/mimis/input/state/sequence/Sequence.java create mode 100644 java/mimis/src/main/java/mimis/manager/ButtonManager.java create mode 100644 java/mimis/src/main/java/mimis/manager/CurrentButtonManager.java create mode 100644 java/mimis/src/main/java/mimis/manager/Manager.java create mode 100644 java/mimis/src/main/java/mimis/manager/Titled.java create mode 100644 java/mimis/src/main/java/mimis/manager/WorkerButton.java create mode 100644 java/mimis/src/main/java/mimis/parser/Parser.java create mode 100644 java/mimis/src/main/java/mimis/parser/ParserInput.java create mode 100644 java/mimis/src/main/java/mimis/router/GlobalRouter.java create mode 100644 java/mimis/src/main/java/mimis/router/Router.java create mode 100644 java/mimis/src/main/java/mimis/state/Active.java create mode 100644 java/mimis/src/main/java/mimis/state/TaskMap.java create mode 100644 java/mimis/src/main/java/mimis/state/TaskMapCycle.java create mode 100644 java/mimis/src/main/java/mimis/util/ArrayCycle.java create mode 100644 java/mimis/src/main/java/mimis/util/BufferedSound.java create mode 100644 java/mimis/src/main/java/mimis/util/Ir.java create mode 100644 java/mimis/src/main/java/mimis/util/Multiplexer.java create mode 100644 java/mimis/src/main/java/mimis/util/Native.java create mode 100644 java/mimis/src/main/java/mimis/util/Reader.java create mode 100644 java/mimis/src/main/java/mimis/util/Sound.java create mode 100644 java/mimis/src/main/java/mimis/util/Swing.java create mode 100644 java/mimis/src/main/java/mimis/util/Type.java create mode 100644 java/mimis/src/main/java/mimis/util/multiplexer/SignalListener.java create mode 100644 java/mimis/src/main/java/mimis/util/swing/CycleButton.java create mode 100644 java/mimis/src/main/java/mimis/util/swing/Dialog.java create mode 100644 java/mimis/src/main/java/mimis/util/swing/HoldButton.java create mode 100644 java/mimis/src/main/java/mimis/util/swing/HoldButtonListener.java create mode 100644 java/mimis/src/main/java/mimis/util/swing/ToggleButton.java create mode 100644 java/mimis/src/main/java/mimis/value/Action.java create mode 100644 java/mimis/src/main/java/mimis/value/Amount.java create mode 100644 java/mimis/src/main/java/mimis/value/Command.java create mode 100644 java/mimis/src/main/java/mimis/value/Key.java create mode 100644 java/mimis/src/main/java/mimis/value/Registry.java create mode 100644 java/mimis/src/main/java/mimis/value/Signal.java create mode 100644 java/mimis/src/main/java/mimis/value/Target.java create mode 100644 java/mimis/src/main/java/mimis/value/Type.java create mode 100644 java/mimis/src/main/java/mimis/value/Windows.java create mode 100644 java/mimis/src/main/java/mimis/worker/Component.java create mode 100644 java/mimis/src/main/java/mimis/worker/IntervalWorker.java create mode 100644 java/mimis/src/main/java/mimis/worker/Listener.java create mode 100644 java/mimis/src/main/java/mimis/worker/Worker.java create mode 100644 java/mimis/src/main/java/test/CustomAppender.java create mode 100644 java/mimis/src/main/resources/M.ico create mode 100644 java/mimis/src/main/resources/M.png create mode 100644 java/mimis/src/main/resources/META-INF/services/mimis.application.Application create mode 100644 java/mimis/src/main/resources/META-INF/services/mimis.device.Device create mode 100644 java/mimis/src/main/resources/Mimis.bmp create mode 100644 java/mimis/src/main/resources/Mimis.png create mode 100644 java/mimis/src/main/resources/commons-logging.properties create mode 100644 java/mimis/src/main/resources/icons/camera.png create mode 100644 java/mimis/src/main/resources/icons/comment.png create mode 100644 java/mimis/src/main/resources/icons/connect.png create mode 100644 java/mimis/src/main/resources/icons/control_eject_blue.png create mode 100644 java/mimis/src/main/resources/icons/control_end_blue.png create mode 100644 java/mimis/src/main/resources/icons/control_fastforward_blue.png create mode 100644 java/mimis/src/main/resources/icons/control_pause_blue.png create mode 100644 java/mimis/src/main/resources/icons/control_play_blue.png create mode 100644 java/mimis/src/main/resources/icons/control_rewind_blue.png create mode 100644 java/mimis/src/main/resources/icons/control_start_blue.png create mode 100644 java/mimis/src/main/resources/icons/control_stop_blue.png create mode 100644 java/mimis/src/main/resources/icons/down.png create mode 100644 java/mimis/src/main/resources/icons/forward.png create mode 100644 java/mimis/src/main/resources/icons/image.png create mode 100644 java/mimis/src/main/resources/icons/mute.png create mode 100644 java/mimis/src/main/resources/icons/next.png create mode 100644 java/mimis/src/main/resources/icons/pause.png create mode 100644 java/mimis/src/main/resources/icons/play.png create mode 100644 java/mimis/src/main/resources/icons/previous.png create mode 100644 java/mimis/src/main/resources/icons/repeat.png create mode 100644 java/mimis/src/main/resources/icons/rewind.png create mode 100644 java/mimis/src/main/resources/icons/shuffle.png create mode 100644 java/mimis/src/main/resources/icons/sound_mute.png create mode 100644 java/mimis/src/main/resources/icons/stop.png create mode 100644 java/mimis/src/main/resources/icons/unmute.png create mode 100644 java/mimis/src/main/resources/icons/up.png create mode 100644 java/mimis/src/main/resources/icons/volumeDown.png create mode 100644 java/mimis/src/main/resources/icons/volumeUp.png create mode 100644 java/mimis/src/main/resources/log4j.properties create mode 100644 java/mimis/wiiscan.exe create mode 100644 java/mimis/wiiuse.dll create mode 100644 java/mimis/wiiusej.dll create mode 100644 java/mimis/wiiusej.jar create mode 100644 java/mimis/wpcom.dll create mode 100644 java/settings.gradle create mode 100644 java/wiigee/.classpath create mode 100644 java/wiigee/.project create mode 100644 java/wiigee/build.gradle create mode 100644 java/wiigee/src/main/java/org/wiigee/control/Wiigee.java create mode 100644 java/wiigee/src/main/java/org/wiigee/device/Device.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/AccelerationEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/AccelerationListener.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/ActionStartEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/ActionStopEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/ButtonListener.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/ButtonPressedEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/ButtonReleasedEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/GestureEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/GestureListener.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/InfraredEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/InfraredListener.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/MotionStartEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/MotionStopEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/RotationEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/RotationListener.java create mode 100644 java/wiigee/src/main/java/org/wiigee/event/RotationSpeedEvent.java create mode 100644 java/wiigee/src/main/java/org/wiigee/filter/DirectionalEquivalenceFilter.java create mode 100644 java/wiigee/src/main/java/org/wiigee/filter/Filter.java create mode 100644 java/wiigee/src/main/java/org/wiigee/filter/HighPassFilter.java create mode 100644 java/wiigee/src/main/java/org/wiigee/filter/IdleStateFilter.java create mode 100644 java/wiigee/src/main/java/org/wiigee/filter/LowPassFilter.java create mode 100644 java/wiigee/src/main/java/org/wiigee/filter/MotionDetectFilter.java create mode 100644 java/wiigee/src/main/java/org/wiigee/filter/RotationThresholdFilter.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/Classifier.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/Gesture.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/GestureModel.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/HMM.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/PreciseHMM.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/ProcessingUnit.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/Quantizer.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/TriggeredProcessingUnit.java create mode 100644 java/wiigee/src/main/java/org/wiigee/logic/XHMM.java create mode 100644 java/wiigee/src/main/java/org/wiigee/util/FileIO.java create mode 100644 java/wiigee/src/main/java/org/wiigee/util/Log.java create mode 100644 java/wiiusej/.classpath create mode 100644 java/wiiusej/.project create mode 100644 java/wiiusej/build.gradle create mode 100644 java/wiiusej/src/main/java/wiiusej/WiiUseApi.java create mode 100644 java/wiiusej/src/main/java/wiiusej/WiiUseApiManager.java create mode 100644 java/wiiusej/src/main/java/wiiusej/Wiimote.java create mode 100644 java/wiiusej/src/main/java/wiiusej/values/Acceleration.java create mode 100644 java/wiiusej/src/main/java/wiiusej/values/Calibration.java create mode 100644 java/wiiusej/src/main/java/wiiusej/values/GForce.java create mode 100644 java/wiiusej/src/main/java/wiiusej/values/IRSource.java create mode 100644 java/wiiusej/src/main/java/wiiusej/values/Orientation.java create mode 100644 java/wiiusej/src/main/java/wiiusej/values/RawAcceleration.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/GenericEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/BalanceBoardButtonsEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/BalanceBoardEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/ButtonsEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/ClassicControllerButtonsEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/ClassicControllerEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/ExpansionEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/GuitarHeroButtonsEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/GuitarHeroEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/IREvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/JoystickEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/MotionSensingEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/NunchukButtonsEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/NunchukEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/physicalevents/WiimoteButtonsEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/utils/EventsGatherer.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/utils/WiiUseApiListener.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/utils/WiimoteListener.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/BalanceBoardInsertedEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/BalanceBoardRemovedEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/ClassicControllerInsertedEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/ClassicControllerRemovedEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/DisconnectionEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/GuitarHeroInsertedEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/GuitarHeroRemovedEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/NunchukInsertedEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/NunchukRemovedEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/StatusEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/WiiUseApiEvent.java create mode 100644 java/wiiusej/src/main/java/wiiusej/wiiusejevents/wiiuseapievents/WiimoteEvent.java diff --git a/java/build.gradle b/java/build.gradle new file mode 100644 index 0000000..a81b2f9 --- /dev/null +++ b/java/build.gradle @@ -0,0 +1,16 @@ +subprojects { + apply plugin: 'java' + apply plugin: 'eclipse' + + repositories { + mavenCentral() + } + + dependencies { + } + + version = '0.1' + + jar { + } +} diff --git a/java/itunescontroller/.classpath b/java/itunescontroller/.classpath new file mode 100644 index 0000000..4589d57 --- /dev/null +++ b/java/itunescontroller/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/itunescontroller/.project b/java/itunescontroller/.project new file mode 100644 index 0000000..3e38131 --- /dev/null +++ b/java/itunescontroller/.project @@ -0,0 +1,18 @@ + + + itunescontroller + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.springsource.ide.eclipse.gradle.core.nature + org.eclipse.jdt.core.javanature + + diff --git a/java/itunescontroller/build.gradle b/java/itunescontroller/build.gradle new file mode 100644 index 0000000..9c99f6a --- /dev/null +++ b/java/itunescontroller/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile 'net.sf.jacob-project:jacob:1.+' +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtwork.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtwork.java new file mode 100644 index 0000000..53846c9 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtwork.java @@ -0,0 +1,55 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a artwork. + * + * Defines a single piece of artwork. + * + * Artwork is always associated with an individual track. + * To add a piece of artwork to a track, use IITTrack::AddArtworkFromFile(). + * The IITTrack::Artwork property + * + * To get a collection of artwork associated with a track call + * ITTrack.getArtwork(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITArtwork extends ITObject { + + public ITArtwork (Dispatch d) { + super(d); + } + + /** + * Delete this object. + */ + public void delete() { + Dispatch.call(object, "Delete"); + } + + /** + * Returns the kind of the object. + * @return Returns the kind of the object. + */ + public ITArtworkFormat getFormat() { + return ITArtworkFormat.values()[Dispatch.get(object, "Format").getInt()]; + } + + // TODO: Comments + + public boolean getIsDownloadedArtwork() { + return Dispatch.get(object, "IsDownloadedArtwork").getBoolean(); + } + + public String getDescription() { + return Dispatch.get(object, "Description").getString(); + + } + + public void SaveArtworkToFile(String filePath) { + Dispatch.call(object, "SaveArtworkToFile",filePath); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtworkCollection.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtworkCollection.java new file mode 100644 index 0000000..c1d8afa --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtworkCollection.java @@ -0,0 +1,55 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a collection of Artwork objects. + * + * Note that collection indices are always 1-based. + * + * You can retrieve all the Artworks defined for a source using + * ITSource.getArtwork(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITArtworkCollection { + + protected Dispatch object; + + public ITArtworkCollection(Dispatch d) { + object = d; + } + + /** + * Returns the number of playlists in the collection. + * @return Returns the number of playlists in the collection. + */ + public int getCount() { + return Dispatch.get(object, "Count").getInt(); + } + + /** + * Returns an ITArtwork object corresponding to the given index (1-based). + * @param index Index of the playlist to retrieve, must be less than or + * equal to ITArtworkCollection.getCount(). + * @return Returns an ITArtwork object corresponding to the given index. + * Will be set to NULL if no playlist could be retrieved. + */ + public ITArtwork getItem (int index) { + Dispatch item = Dispatch.call(object, "Item", index).toDispatch(); + return new ITArtwork(item); + } + + /** + * Returns an ITArtwork object with the specified persistent ID. See the + * documentation on ITObject for more information on persistent IDs. + * @param highID The high 32 bits of the 64-bit persistent ID. + * @param lowID The low 32 bits of the 64-bit persistent ID. + * @return Returns an ITArtwork object with the specified persistent ID. + * Will be set to NULL if no playlist could be retrieved. + */ + public ITArtwork getItemByPersistentID (int highID, int lowID) { + Dispatch item = Dispatch.call(object, "ItemByPersistentID", highID, lowID).toDispatch(); + return new ITArtwork(item); + } +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtworkFormat.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtworkFormat.java new file mode 100644 index 0000000..ed4b61e --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITArtworkFormat.java @@ -0,0 +1,13 @@ +package com.dt.iTunesController; + +/** + * Specifies the Artwork kind. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITArtworkFormat { + ITArtworkFormatUnknown, + ITArtworkFormatJPEG, + ITArtworkFormatPNG, + ITArtworkFormatBMP; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITAudioCDPlaylist.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITAudioCDPlaylist.java new file mode 100644 index 0000000..bc12943 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITAudioCDPlaylist.java @@ -0,0 +1,76 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents an audio CD playlist. + * + * An audio CD playlist is always associated with an IITSource of kind + * ITSourceKindAudioCD. + * + * You can retrieve all the playlists defined for a source using + * ITSource.getPlaylists(). + * @author Steve Eyre + * @version 0.2 + */ +public class ITAudioCDPlaylist extends ITPlaylist { + + public ITAudioCDPlaylist(Dispatch d) { + super(d); + } + + /** + * Returns the audio CD's artist. + * @return Returns the audio CD's artist. + */ + public String getArtist() { + return Dispatch.get(object, "Artist").getString(); + } + + /** + * Returns true if this audio CD is a compilation album. + * @return Returns true if this audio CD is a compilation album. + */ + public boolean isCompilation() { + return Dispatch.get(object, "Compilation").getBoolean(); + } + + /** + * Returns the audio CD's composer. + * @return Returns the audio CD's composer. + */ + public String getComposer() { + return Dispatch.get(object, "Composer").getString(); + } + + /** + * Returns the total number of discs in this CD's album. + * @return Returns the total number of discs in this CD's album. + */ + public long getDiscCount() { + return Dispatch.get(object, "DiscCount").getLong(); + } + + /** + * Returns the index of the CD disc in the source album. + * @return Returns the index of the CD disc in the source album. + */ + public long getDiscNumber() { + return Dispatch.get(object, "DiscNumber").getLong(); + } + + /** + * Returns the audio CD's genre. + * @return Returns the audio CD's genre. + */ + public String getGenre() { + return Dispatch.get(object, "Genre").getString(); + } + + /** + * Reveals the CD playlist in the main browser window. + */ + public void reveal() { + Dispatch.call(object, "Reveal"); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITBrowserWindow.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITBrowserWindow.java new file mode 100644 index 0000000..16dc6cf --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITBrowserWindow.java @@ -0,0 +1,45 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents the main browser window. + * + * You can retrieve the main browser window using + * iTunes.BrowserWindow(). + * + * @author Steve Eyre + * @version 0.2 + */ + +public class ITBrowserWindow extends ITWindow { + + public ITBrowserWindow (Dispatch d) { + super(d); + } + + /** + * Returns the kind of the object. + * @return Returns the kind of the object. + */ + public boolean getMiniPlayer() { + return Dispatch.get(object, "MiniPlayer").getBoolean(); + } + + // TODO: Comments + + public ITTrackCollection getSelectedTracks() { + Dispatch collection = Dispatch.call(object, "SelectedTracks").getDispatch(); + return new ITTrackCollection(collection); + } + + public ITPlaylist getSelectedPlaylist() { + Dispatch playlist = Dispatch.get(object, "SelectedPlaylist").toDispatch(); + return new ITPlaylist(playlist); + } + + public void setSelectedPlaylist(ITPlaylist playlist) { + Dispatch dispatchRef = playlist.fetchDispatch(); + Dispatch.put(object, "SelectedPlaylist", dispatchRef); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITCOMDisabledReason.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITCOMDisabledReason.java new file mode 100644 index 0000000..500280c --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITCOMDisabledReason.java @@ -0,0 +1,12 @@ +package com.dt.iTunesController; + +/** + * Specifies the reason the COM interface is being disabled. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITCOMDisabledReason { + ITCOMDisabledReasonOther, + ITCOMDisabledReasonDialog, + ITCOMDisabledReasonQuitting; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITEQPreset.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITEQPreset.java new file mode 100644 index 0000000..1d00cfb --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITEQPreset.java @@ -0,0 +1,236 @@ +package com.dt.iTunesController; + +import com.jacob.com.Dispatch; + +/** + * Represents an equalizer preset. + * You can retrieve or set the currently selected EQ preset using the + * iTunes.getCurrentEQPreset() method. + * @author Steve Eyre + * @version 0.2 + */ +public class ITEQPreset { + + protected Dispatch object; + + public ITEQPreset(Dispatch d) { + object = d; + } + + /** + * Returns the name of the EQ Preset (e.g. "Acoustic"). + * @return Returns the name of the EQ Preset (e.g. "Acoustic"). + */ + public String getName() { + return Dispatch.get(object, "Name").getString(); + } + + /** + * Returns true if the EQ preset can be modified. + * @return True if the EQ preset can be modified. + */ + public boolean getModifiable() { + return Dispatch.get(object, "Modifiable").getBoolean(); + } + + /** + * Set the equalizer preamp level (-12.0 db to +12.0 db). + * @param level The new equalizer preamp level (-12.0 db to +12.0 db). + */ + public void setPreamp(double level) { + Dispatch.put(object, "Preamp", level); + } + + /** + * Returns the equalizer preamp level (-12.0db to +12.0db). + * @return Returns the equalizer preamp level (-12.0db to +12.0db). + */ + public double getPreamp() { + return Dispatch.get(object, "Preamp").getDouble(); + } + + /** + * Set the equalizer 32Hz level (-12.0 db to +12.0 db). + * @param level The new equalizer 32Hz level (-12.0 db to +12.0db). + */ + public void setBand1(double level) { + Dispatch.put(object, "Band1", level); + } + + /** + * Returns the equalizer 32Hz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 32Hz level (-12.0 db to +12.0 db). + */ + public double getBand1() { + return Dispatch.get(object, "Band1").getDouble(); + } + + /** + * Set the equalizer 64Hz level (-12.0 db to +12.0 db). + * @param level The new equalizer 64Hz level (-12.0 db to +12.0db). + */ + public void setBand2(double level) { + Dispatch.put(object, "Band2", level); + } + + /** + * Returns the equalizer 64Hz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 64Hz level (-12.0 db to +12.0 db). + */ + public double getBand2() { + return Dispatch.get(object, "Band2").getDouble(); + } + + /** + * Set the equalizer 125Hz level (-12.0 db to +12.0 db). + * @param level The new equalizer 125Hz level (-12.0 db to +12.0db). + */ + public void setBand3(double level) { + Dispatch.put(object, "Band3", level); + } + + /** + * Returns the equalizer 125Hz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 125Hz level (-12.0 db to +12.0 db). + */ + public double getBand3() { + return Dispatch.get(object, "Band3").getDouble(); + } + + /** + * Set the equalizer 250Hz level (-12.0 db to +12.0 db). + * @param level The new equalizer 250Hz level (-12.0 db to +12.0db). + */ + public void setBand4(double level) { + Dispatch.put(object, "Band4", level); + } + + /** + * Returns the equalizer 250Hz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 250Hz level (-12.0 db to +12.0 db). + */ + public double getBand4() { + return Dispatch.get(object, "Band4").getDouble(); + } + + /** + * Set the equalizer 500Hz level (-12.0 db to +12.0 db). + * @param level The new equalizer 500Hz level (-12.0 db to +12.0db). + */ + public void setBand5(double level) { + Dispatch.put(object, "Band5", level); + } + + /** + * Returns the equalizer 500Hz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 500Hz level (-12.0 db to +12.0 db). + */ + public double getBand5() { + return Dispatch.get(object, "Band5").getDouble(); + } + + /** + * Set the equalizer 1KHz level (-12.0 db to +12.0 db). + * @param level The new equalizer 1KHz level (-12.0 db to +12.0db). + */ + public void setBand6(double level) { + Dispatch.put(object, "Band6", level); + } + + /** + * Returns the equalizer 1KHz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 1KHz level (-12.0 db to +12.0 db). + */ + public double getBand6() { + return Dispatch.get(object, "Band6").getDouble(); + } + + /** + * Set the equalizer 2KHz level (-12.0 db to +12.0 db). + * @param level The new equalizer 2KHz level (-12.0 db to +12.0db). + */ + public void setBand7(double level) { + Dispatch.put(object, "Band7", level); + } + + /** + * Returns the equalizer 2KHz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 2KHz level (-12.0 db to +12.0 db). + */ + public double getBand7() { + return Dispatch.get(object, "Band7").getDouble(); + } + + /** + * Set the equalizer 4KHz level (-12.0 db to +12.0 db). + * @param level The new equalizer 4KHz level (-12.0 db to +12.0db). + */ + public void setBand8(double level) { + Dispatch.put(object, "Band8", level); + } + + /** + * Returns the equalizer 4KHz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 4KHz level (-12.0 db to +12.0 db). + */ + public double getBand8() { + return Dispatch.get(object, "Band8").getDouble(); + } + + /** + * Set the equalizer 8KHz level (-12.0 db to +12.0 db). + * @param level The new equalizer 8KHz level (-12.0 db to +12.0db). + */ + public void setBand9(double level) { + Dispatch.put(object, "Band9", level); + } + + /** + * Returns the equalizer 8KHz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 8KHz level (-12.0 db to +12.0 db). + */ + public double getBand9() { + return Dispatch.get(object, "Band9").getDouble(); + } + + /** + * Set the equalizer 16KHz level (-12.0 db to +12.0 db). + * @param level The new equalizer 16KHz level (-12.0 db to +12.0db). + */ + public void setBand10(double level) { + Dispatch.put(object, "Band10", level); + } + + /** + * Returns the equalizer 16KHz level (-12.0 db to +12.0 db). + * @return Returns the equalizer 16KHz level (-12.0 db to +12.0 db). + */ + public double getBand10() { + return Dispatch.get(object, "Band10").getDouble(); + } + + /** + * Delete this EQ Preset. + * Any EQ preset can be deleted, including built-in presets, except for the + * Manual preset. + * @param updateAllTracks If true, any tracks that use this EQ preet will be + * set to have no assigned EQ preset. + */ + public void delete(boolean updateAllTracks) { + Dispatch.call(object, "Delete", updateAllTracks); + } + + /** + * Rename this EQ Preset. + * The name of any EQ preset can be changed, including built-in presets, + * except for the Manual preset. + * EQ preset names cannot start with leading spaces. If you specify a name + * that starts with leading spaces they will be stripped out. + * @param updateAllTracks If true, any tracks that use this EQ preet will be + * updated with the new preset name. + */ + public void rename(String newName, boolean updateAllTracks) { + Dispatch.call(object, "Rename", newName, updateAllTracks); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITFileOrCDTrack.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITFileOrCDTrack.java new file mode 100644 index 0000000..570896c --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITFileOrCDTrack.java @@ -0,0 +1,39 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a file or CD track. + * @author Steve Eyre + * @version 0.2 + */ +public class ITFileOrCDTrack extends ITTrack { + + public ITFileOrCDTrack (Dispatch d) { + super(d); + } + + /** + * Reveals the track in the main browser window. + */ + public void reveal() { + Dispatch.call(object, "Reveal"); + } + + public ITVideoKind getVideoKind() { + return ITVideoKind.values()[Dispatch.get(object, "VideoKind").getInt()]; + } + + public ITRatingKind getRatingKind() { + return ITRatingKind.values()[Dispatch.get(object, "RatingKind").getInt()]; + } + + public String getLocation() { + return Dispatch.get(object, "Location").getString(); + } + + public ITArtworkCollection getArtworks() { + Dispatch artworks = Dispatch.get(object, "Artwork").toDispatch(); + return new ITArtworkCollection(artworks); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITLibraryPlaylist.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITLibraryPlaylist.java new file mode 100644 index 0000000..c19cba8 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITLibraryPlaylist.java @@ -0,0 +1,20 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a library playlist. + * + * A library playlist consists of all the tracks in a user's library. + * + * For convenience, you can retrieve the main library playlist using + * iTunes.getLibraryPlaylist(). + * @author Steve Eyre + * @version 0.2 + */ +public class ITLibraryPlaylist extends ITPlaylist { + + public ITLibraryPlaylist(Dispatch d) { + super(d); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITObject.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITObject.java new file mode 100644 index 0000000..27475fd --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITObject.java @@ -0,0 +1,112 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Defines a source, playlist or track. + * + * An ITObject uniquely identifies a source, playlist, or track in iTunes using + * four separate IDs. These are runtime IDs, they are only valid while the + * current instance of iTunes is running. + * + * As of iTunes 7.7, you can also identify an ITObject using a 64-bit persistent + * ID, which is valid across multiple invocations of iTunes. + * + * The main use of the ITObject interface is to allow clients to track iTunes + * database changes using + * iTunesEventsInterface.onDatabaseChangedEvent(). + * + * You can retrieve an ITObject with a specified runtime ID using + * iTunes.getITObjectByID(). + * + * An ITObject will always have a valid, non-zero source ID. + * + * An ITObject corresponding to a playlist or track will always have a valid + * playlist ID. The playlist ID will be zero for a source. + * + * An ITObject corresponding to a track will always have a valid track and + * track database ID. These IDs will be zero for a source or playlist. + * + * A track ID is unique within the track's playlist. A track database ID is + * unique across all playlists. For example, if the same music file is in two + * different playlists, each of the tracks could have different track IDs, but + * they will have the same track database ID. + * + * An ITObject also has a 64-bit persistent ID which can be used to identify + * the ITObject across multiple invocations of iTunes. + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITObject { + + protected Dispatch object; + + public ITObject(Dispatch d) { + object = d; + } + + /** + * Returns the JACOB Dispatch object for this object. + * @return Returns the JACOB Dispatch object for this object. + */ + public Dispatch fetchDispatch() { + return object; + } + + /** + * Set the name of the object. + * @param name The new name of the object. + */ + public void setName (String name) { + Dispatch.put(object, "Name", name); + } + + /** + * Returns the name of the object. + * @return Returns the name of the object. + */ + public String getName() { + return Dispatch.get(object, "Name").getString(); + } + + /** + * Returns the index of the object in internal application order. + * @return The index of the object in internal application order. + */ + public int getIndex() { + return Dispatch.get(object, "Index").getInt(); + } + + /** + * Returns the ID that identifies the source. + * @return Returns the ID that identifies the source. + */ + public int getSourceID() { + return Dispatch.get(object, "SourceID").getInt(); + } + + /** + * Returns the ID that identifies the playlist. + * @return Returns the ID that identifies the playlist. + */ + public int getPlaylistID() { + return Dispatch.get(object, "PlaylistID").getInt(); + } + + /** + * Returns the ID that identifies the track within the playlist. + * @return Returns the ID that identifies the track within the playlist. + */ + public int getTrackID() { + return Dispatch.get(object, "TrackID").getInt(); + } + + /** + * Returns the ID that identifies the track, independent of its playlist. + * @return Returns the ID that identifies the track, independent of its playlist. + */ + public int getTrackDatabaseID() { + return Dispatch.get(object, "TrackDatabaseID").getInt(); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITObjectPersistentID.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITObjectPersistentID.java new file mode 100644 index 0000000..e5c674b --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITObjectPersistentID.java @@ -0,0 +1,53 @@ +package com.dt.iTunesController; + +/** + * Simple utility wrapper class to represent the persistent object identity + * ID numbers. Use the getHigh() and getLow() methods individually to get + * each ID, or the combined hex string through toString(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITObjectPersistentID { + + private long High; + private long Low; + private String hexString; + + /** + * Create the ITObjectPersistentID. This class is not intended to be created + * manually, and this function should only be used by classes implementing + * this utility. + * @param high The High Persistent ID + * @param low The Low Persistent ID + */ + public ITObjectPersistentID(long high, long low) { + this.High=high; + this.Low=low; + this.hexString = String.format("%8s%8s",Long.toHexString(this.High),Long.toHexString(this.Low)).toUpperCase().replace(' ','0'); + } + + /** + * Returns the high persistent ID. + * @return The high persistent ID. + */ + public long getHigh() { + return this.High; + } + + /** + * Returns the low persistent ID. + * @return The low persistent ID. + */ + public long getLow() { + return this.Low; + } + + /** + * Return a string representation (in hex) of the persistent IDs. + * @return String representation of the persistent IDs. + */ + public String toString() { + return this.hexString; + } +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITOperationStatus.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITOperationStatus.java new file mode 100644 index 0000000..cf764aa --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITOperationStatus.java @@ -0,0 +1,62 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents the status of an asynchronous add or convert operation. + * + * When a track is added using TLibraryPlaylist.addFile(), + * ITLibraryPlaylist.AddFiles(), IITUserPlaylist.addFile(), or + * ITUserPlaylist.addFiles(), the add may not complete immediately if iTunes + * needs to make a copy of the file. + * + * Similarly, when converting or importing a file or track using + * iTunes.convertFile(), iTunes.convertFiles(), + * iTunes.convertTrack() or iTunes.convertTracks(), + * the conversion will never complete immediately. + * + * These methods return an ITOperationStatus object, which can be + * polled todetermine when the operation is done. This object will also return + * the collection of newly added or converted tracks. + * + * As of version 1.1 of the iTunes type library, you should use + * iTunes.convertFile2(), iTunes.convertFiles2(), + * iTunes.convertTrack2() or iTunes.convertTracks2() + * instead of the original convert methods. These new methods return an + * ITConvertOperationStatus object to allow clients to retrieve + * additional conversion progress information. + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITOperationStatus { + + protected Dispatch object; + + public ITOperationStatus(Dispatch d) { + object = d; + } + + /** + * Returns true if the operation is still in progress. + * You cannot retrieve the ITOperationStatus.getTracks() + * property until the operation completes. + * @return Returns true if the operation is still in progress. + */ + public boolean getInProgress() { + return Dispatch.get(object, "InProgress").getBoolean(); + } + + /** + * Returns a collection containing the tracks that were generated by the + * operation. + * You cannot retrieve this property until + * ITOperationStatus.getInProgress() returns false + * @return Returns a collection containing the tracks that were generated by + * the operation. + */ + public ITTrackCollection getTracks() { + Dispatch tracks = Dispatch.get(object, "Tracks").toDispatch(); + return new ITTrackCollection(tracks); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlayerState.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlayerState.java new file mode 100644 index 0000000..4be2a70 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlayerState.java @@ -0,0 +1,13 @@ +package com.dt.iTunesController; + +/** + * Specifies the state of the player. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITPlayerState { + ITPlayerStateStopped, + ITPlayerStatePlaying, + ITPlayerStateFastForward, + ITPlayerStateRewind; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylist.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylist.java new file mode 100644 index 0000000..6c937cf --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylist.java @@ -0,0 +1,180 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a playlist. + * + * A playlist is always associated with an ITSource. + * + * You can retrieve all the playlists defined for a source using + * ITSource.getPlaylists(). + * + * For convenience, you can retrieve the main library playlist using + * iTunes.getLibraryPlaylist(). + * + * You can create a new playlist using iTunes.createPlaylist(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITPlaylist extends ITObject { + + public ITPlaylist (Dispatch d) { + super(d); + } + + /** + * Delete this object. + */ + public void delete() { + Dispatch.call(object, "Delete"); + } + + /** + * Start playing the first track in this object. + */ + public void playFirstTrack() { + Dispatch.call(object, "PlayFirstTrack"); + } + + /** + * Print this object. + * @param showPrintDialog If true, display the print dialog. + * @param printKind The printout kind. + * @param theme The name of the theme to use. This corresponds to the name + * of a Theme combo box item in the print dialog for the specified printKind + * (e.g. "Track length"). This string cannot be longer than 255 characters, + * but it may be empty. + */ + public void print(boolean showPrintDialog, ITPlaylistPrintKind printKind, String theme) { + Dispatch.call(object, "Print", showPrintDialog, printKind.ordinal(), theme); + } + + /** + * Returns a collection containing the tracks with the specified text. + * @param searchText The text to search for. This string cannot be longer + * than 255 chracters. + * @param searchFields Specifies which fields of each track should be + * searched for searchText. + * @return Collection of IITTrack objects. This will be NULL if no tracks + * meet the search criteria. + */ + public ITTrackCollection search (String searchText, ITPlaylistSearchField searchFields) { + Dispatch collection = Dispatch.call(object, "Search", searchText, searchFields.ordinal()).getDispatch(); + return new ITTrackCollection(collection); + } + + /** + * Returns the kind of the object. + * @return Returns the kind of the object. + */ + public ITPlaylistKind getKind() { + return ITPlaylistKind.values()[Dispatch.get(object, "Kind").getInt()]; + } + + /** + * Returns an ITSource object corresponding to the source that contains the + * object. + * @return Returns an ITSource object corresponding to the source that + * contains the object. + */ + public ITSource getSource() { + Dispatch source = Dispatch.get(object, "Source").toDispatch(); + return new ITSource(source); + } + + /** + * Returns the total length of all songs in the object (in seconds). + * @return Returns the total length of all songs in the object (in + * seconds). + */ + public int getDuration() { + return Dispatch.get(object, "Duration").getInt(); + } + + /** + * Set whether songs in the object should be played in random order. + * @param shouldShuffle True if songs in the object should be played in + * random order. + */ + public void setShuffle(boolean shouldShuffle) { + Dispatch.put(object, "Shuffle", shouldShuffle); + } + + /** + * Returns the total size of all songs in the object (in bytes). + * @return Returns the total size of all songs in the object (in bytes). + */ + public double getSize() { + return Dispatch.get(object, "Size").getDouble(); + } + + /** + * Sets the playback repeat mode. + * @param repeatMode The new playback repeat mode. + */ + public void setSongRepeat(ITPlaylistRepeatMode repeatMode) { + Dispatch.put(object, "SongRepeat", repeatMode.ordinal()); + } + + /** + * Cycle repeat modes. + */ + public void cycleSongRepeat() { + int repeat = Dispatch.get(object, "SongRepeat").getInt(); + Dispatch.put(object, "SongRepeat", (repeat + 1) % 3); + } + + /** + * Returns the playback repeat mode. + * @return Returns the playback repeat mode. + */ + public ITPlaylistRepeatMode getSongRepeat() { + return ITPlaylistRepeatMode.values()[Dispatch.get(object, "SongRepeat").getInt()]; + } + + /** + * Returns the total length of all songs in the object (in MM:SS format). + * @return Returns the total length of all songs in the object (in + * MM:SS format). + */ + public String getTime() { + return Dispatch.get(object, "Time").getString(); + } + + /** + * Returns true if the object is visible in the sources list. + * @return True if the object is visible in the sources list. + */ + public boolean getVisible() { + return Dispatch.get(object, "Visible").getBoolean(); + } + + /** + * Returns a collection containing the tracks in this object. + * @return Collection of ITTrack objects. + */ + public ITTrackCollection getTracks() { + Dispatch tracks = Dispatch.get(object, "Tracks").toDispatch(); + return new ITTrackCollection(tracks); + } + + /** + * Returns the shuffle state. + * @return true if current state is shuffle. + */ + public boolean getShuffle() { + return Dispatch.get(object, "Shuffle").getBoolean(); + } + + /** + * Toggle the shuffle state. + */ + public void toggleShuffle() { + setShuffle(!getShuffle()); + } + + public boolean containsTrack(ITTrack track) { + return getTracks().containsTrack(track); + } +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistCollection.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistCollection.java new file mode 100644 index 0000000..3717735 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistCollection.java @@ -0,0 +1,67 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a collection of playlist objects. + * + * Note that collection indices are always 1-based. + * + * You can retrieve all the playlists defined for a source using + * ITSource.getPlaylists(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITPlaylistCollection { + + protected Dispatch object; + + public ITPlaylistCollection(Dispatch d) { + object = d; + } + + /** + * Returns the number of playlists in the collection. + * @return Returns the number of playlists in the collection. + */ + public int getCount() { + return Dispatch.get(object, "Count").getInt(); + } + + /** + * Returns an ITPlaylist object corresponding to the given index (1-based). + * @param index Index of the playlist to retrieve, must be less than or + * equal to ITPlaylistCollection.getCount(). + * @return Returns an ITPlaylist object corresponding to the given index. + * Will be set to NULL if no playlist could be retrieved. + */ + public ITPlaylist getItem (int index) { + Dispatch item = Dispatch.call(object, "Item", index).toDispatch(); + return new ITPlaylist(item); + } + + /** + * Returns an ITPlaylist object withthe specified name. + * @param name The name of the playlist to retrieve. + * @return Returns an ITPlaylist object corresponding to the given index. + * Will be set to NULL if no playlist could be retrieved. + */ + public ITPlaylist ItemByName (String name) { + Dispatch item = Dispatch.call(object, "ItemByName", name).toDispatch(); + return new ITPlaylist(item); + } + + /** + * Returns an ITPlaylist object with the specified persistent ID. See the + * documentation on ITObject for more information on persistent IDs. + * @param highID The high 32 bits of the 64-bit persistent ID. + * @param lowID The low 32 bits of the 64-bit persistent ID. + * @return Returns an ITPlaylist object with the specified persistent ID. + * Will be set to NULL if no playlist could be retrieved. + */ + public ITPlaylist getItemByPersistentID (int highID, int lowID) { + Dispatch item = Dispatch.call(object, "ItemByPersistentID", highID, lowID).toDispatch(); + return new ITPlaylist(item); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistKind.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistKind.java new file mode 100644 index 0000000..e6f685f --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistKind.java @@ -0,0 +1,15 @@ +package com.dt.iTunesController; + +/** + * Specifies the playlist kind. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITPlaylistKind { + ITPlaylistKindUnknown, + ITPlaylistKindLibrary, + ITPlaylistKindUser, + ITPlaylistKindCD, + ITPlaylistKindDevice, + ITPlaylistKindRadioTuner; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistPrintKind.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistPrintKind.java new file mode 100644 index 0000000..6fc8ef8 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistPrintKind.java @@ -0,0 +1,14 @@ +package com.dt.iTunesController; + +/** + * Specifies the kind of playlist printout. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITPlaylistPrintKind { + + ITPlaylistPrintKindPlaylist, + ITPlaylistPrintKindAlbumlist, + ITPlaylistPrintKindInsert; + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistRepeatMode.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistRepeatMode.java new file mode 100644 index 0000000..4b6fc16 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistRepeatMode.java @@ -0,0 +1,14 @@ +package com.dt.iTunesController; + +/** + * Specifies the playlist playback repeat mode. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITPlaylistRepeatMode { + + ITPlaylistRepeatModeOff, + ITPlaylistRepeatModeOne, + ITPlaylistRepeatModeAll; + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistSearchField.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistSearchField.java new file mode 100644 index 0000000..420b305 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITPlaylistSearchField.java @@ -0,0 +1,16 @@ +package com.dt.iTunesController; + +/** + * Specifies the fields in each track that will be searched by + * ITPlaylist.search(). + * @author Steve Eyre + * @version 0.2 + */ +public enum ITPlaylistSearchField { + ITPlaylistSearchFieldAll, + ITPlaylistSearchFieldVisible, + ITPlaylistSearchFieldArtists, + ITPlaylistSearchFieldAlbums, + ITPlaylistSearchFieldComposers, + ITPlaylistSearchFieldSongNames; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITRatingKind.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITRatingKind.java new file mode 100644 index 0000000..7d1cb22 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITRatingKind.java @@ -0,0 +1,11 @@ +package com.dt.iTunesController; + +/** + * Specifies the rating kind. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITRatingKind { + ITRatingKindUser, + ITRatingKindComputed; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSource.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSource.java new file mode 100644 index 0000000..b0d93fc --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSource.java @@ -0,0 +1,51 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents an entry in the Source list (music library, CD, device, etc.). + * You can retrieve all the sources using iTunes.getSources(). + * @author Steve Eyre + * @version 0.2 + */ +public class ITSource extends ITObject { + + public ITSource(Dispatch d) { + super(d); + } + + /** + * Returns the kind of the source. + * @return Returns the kind of the source. + */ + public ITSourceKind getKind() { + return ITSourceKind.values()[Dispatch.get(object, "Kind").getInt()]; + } + + /** + * Returns the total size of the source, if it has a fixed size. + * @return Returns the total size of the source, if it has a fixed size. + */ + public double getCapacity() { + return Dispatch.get(object, "Capacity").getDouble(); + } + + /** + * Returns the free space on the source, if it has a fixed size. + * @return Returns the free space on the source, if it has a fixed size. + */ + public double getFreespace() { + return Dispatch.get(object, "Freespace").getDouble(); + } + + /** + * Returns a collection containing the playlists in this source. + * The source's primary playlist is always the first playlist in the + * collection. + * @return Collection of IITPlaylist objects. + */ + public ITPlaylistCollection getPlaylists() { + Dispatch playlists = Dispatch.get(object, "Playlists").toDispatch(); + return new ITPlaylistCollection(playlists); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSourceCollection.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSourceCollection.java new file mode 100644 index 0000000..357bdec --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSourceCollection.java @@ -0,0 +1,66 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a collection of source objects. + * + * Note that collection indices are always 1-based. + * + * You can retrieve all the sources using ITSource.getSources(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITSourceCollection { + + protected Dispatch object; + + public ITSourceCollection(Dispatch d) { + object = d; + } + + /** + * Returns the number of sources in the collection. + * @return Returns the number of sources in the collection. + */ + public int getCount() { + return Dispatch.get(object, "Count").getInt(); + } + + /** + * Returns an ITSource object corresponding to the given index (1-based). + * @param index Index of the source to retrieve, must be less than or + * equal to ITSourceCollection.getCount(). + * @return Returns an ITSource object corresponding to the given index. + * Will be set to NULL if no source could be retrieved. + */ + public ITSource getItem (int index) { + Dispatch item = Dispatch.call(object, "Item", index).toDispatch(); + return new ITSource(item); + } + + /** + * Returns an ITSource object withthe specified name. + * @param name The name of the source to retrieve. + * @return Returns an ITSource object corresponding to the given index. + * Will be set to NULL if no source could be retrieved. + */ + public ITSource getItemByName (String name) { + Dispatch item = Dispatch.call(object, "ItemByName", name).toDispatch(); + return new ITSource(item); + } + + /** + * Returns an ITSource object with the specified persistent ID. See the + * documentation on ITObject for more information on persistent IDs. + * @param highID The high 32 bits of the 64-bit persistent ID. + * @param lowID The low 32 bits of the 64-bit persistent ID. + * @return Returns an ITSource object with the specified persistent ID. + * Will be set to NULL if no source could be retrieved. + */ + public ITSource getItemByPersistentID (int highID, int lowID) { + Dispatch item = Dispatch.call(object, "ItemByPersistentID", highID, lowID).toDispatch(); + return new ITSource(item); + } + +} \ No newline at end of file diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSourceKind.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSourceKind.java new file mode 100644 index 0000000..f332249 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITSourceKind.java @@ -0,0 +1,17 @@ +package com.dt.iTunesController; + +/** + * Specifies the source kind. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITSourceKind { + ITSourceKindUnknown, + ITSourceKindLibrary, + ITSourceKindIPod, + ITSourceKindAudioCD, + ITSourceKindMP3CD, + ITSourceKindDevice, + ITSourceKindRadioTuner, + ITSourceKindSharedLibrary; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrack.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrack.java new file mode 100644 index 0000000..57bb11b --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrack.java @@ -0,0 +1,493 @@ +package com.dt.iTunesController; +import java.util.Date; + +import com.jacob.com.Dispatch; + +/** + * Represents a track. + * + * A track represents a song in a single playlist. A song may be in more than + * one playlist, in which case it would be represented by multiple tracks. + * + * You can retrieve the currently targeted (playing) track using + * iTunes.getCurrentTrack(). + * + * Typically, an ITrack is accessed through an ITTrackCollection. + * + * You can retrieve all the tracks defined for a playlist using + * ITPlaylist.getTracks(). + * + * You can retrieve the currently selected track or tracks using + * iTunes.getSelectedTracks(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITTrack extends ITObject { + + public ITTrack (Dispatch d) { + super(d); + } + + /** + * Delete this object. + */ + public void delete() { + Dispatch.call(object, "Delete"); + } + + /** + * Start playing this object. + */ + public void play() { + Dispatch.call(object, "Play"); + } + + /** + * Set the name of the album containing the object.; + * @param album The new name of the album containing the object. + */ + public void setAlbum(String album) { + Dispatch.put(object, "Album", album); + } + + /** + * Returns the name of the album containing the object. + * @return Returns the name of the album containing the object. + */ + public String getAlbum() { + return Dispatch.get(object, "Album").getString(); + } + + /** + * Set the name of the artist/source of the object. + * @param artist The new artist/source of the object. + */ + public void setArtist(String artist) { + Dispatch.put(object, "Artist", artist); + } + + /** + * Returns the name of the artist/source of the object. + * @return Returns the name of the artist/source of the object. + */ + public String getArtist() { + return Dispatch.get(object, "Artist").getString(); + } + + /** + * Returns the bit rate of the object (in kbps). + * @return Returns the bit rate of the object (in kbps). + */ + public int getBitRate() { + return Dispatch.get(object, "BitRate").getInt(); + } + + /** + * Set the tempo of the object (in beats per minute). + * @param beatsPerMinute The new tempo of the object (in beats per minute). + */ + public void setBPM(int beatsPerMinute) { + Dispatch.put(object, "BPM", beatsPerMinute); + } + + /** + * Returns the tempo of the object (in beats per minute). + * @return Returns the tempo of the object (in beats per minute). + */ + public int getBPM() { + return Dispatch.get(object, "BPM").getInt(); + } + + /** + * Set freeform notes about the object. + * @param comment The new freeform notes about the object. + */ + public void setComment(String comment) { + Dispatch.put(object, "Comment", comment); + } + + /** + * Returns freeform notes about the object. + * @return Returns freeform notes about the object. + */ + public String getComment() { + return Dispatch.get(object, "Comment").getString(); + } + + /** + * Set whether this object is from a compilation album. + * @param isCompilation True if this object should be from a compilation album. + */ + public void setCompilation(boolean isCompilation) { + Dispatch.put(object, "Compilation", isCompilation); + } + + /** + * Returns true if this object is from a compilation album. + * @return Returns true if this object is from a compilation album. + */ + public boolean getCompilation() { + return Dispatch.get(object, "Compilation").getBoolean(); + } + + /** + * Set the composer of the object. + * @param composer The new composer of the object. + */ + public void setComposer (String composer) { + Dispatch.put(object, "Composer", composer); + } + + /** + * Returns the composer of the object. + * @return Returns the composer of the object. + */ + public String getComposer() { + return Dispatch.get(object, "Composer").getString(); + } + + /** + * Returns the date the object was added to the playlist. + * @return Returns the date the object was added to the playlist. + */ + public Date getDateAdded() { + return Dispatch.get(object, "DateAdded").getJavaDate(); + } + + /** + * Set the total number of discs in the source album. + * @param discCount The new total number of discs in the source album. + */ + public void setDiscCount (int discCount) { + Dispatch.put(object, "DiscCount", discCount); + } + + /** + * Returns the total number of discs in the source album. + * @return Returns the total number of discs in the source album. + */ + public int getDiscCount() { + return Dispatch.get(object, "DiscCount").getInt(); + } + + /** + * Set the index of the disc containing the object on the source album. + * @param discNumber The new index of the disc containing the object on the + * source album. + */ + public void setDiscNumber (int discNumber) { + Dispatch.put(object, "DiscNumber", discNumber); + } + + /** + * Returns the index of the disc containing the object on the source album. + * @return Returns the index of the disc containing the object on the source + * album. + */ + public int getDiscNumber() { + return Dispatch.get(object, "DiscNumber").getInt(); + } + + /** + * Returns the length of the object (in seconds). + * @return Returns the length of the object (in seconds). + */ + public int getDuration() { + return Dispatch.get(object, "Duration").getInt(); + } + + /** + * Set whether this object is checked for playback. + * @param shouldBeEnabled True if the object should be checked for playback. + */ + public void setEnabled (boolean shouldBeEnabled) { + Dispatch.put(object, "Enabled", shouldBeEnabled); + } + + /** + * Returns true if the object is checked for playback. + * @return Returns true if the object is checked for playback. + */ + public boolean getEnabled() { + return Dispatch.get(object, "Enabled").getBoolean(); + } + + /** + * Set the name of the EQ preset of the object. + * @param eq The new name of the EQ preset of the object. + */ + public void setEQ (String eq) { + Dispatch.put(object, "EQ", eq); + } + + /** + * Returns the name of the EQ preset of the object. + * @return Returns the name of the EQ preset of the object. + */ + public String getEQ() { + return Dispatch.get(object, "EQ").getString(); + } + + /** + * Set the stop time of the object (in seconds). + * @param finish The new stop time of the object (in seconds). + */ + public void setFinish(int finish) { + Dispatch.put(object, "Finish", finish); + } + + /** + * Returns the stop time of the object (in seconds). + * @return Returns the stop time of the object (in seconds). + */ + public int getFinish() { + return Dispatch.get(object, "Finish").getInt(); + } + + /** + * Returns the music/audio genre (category) of the object. + * @param genre Returns the music/audio genre (category) of the object. + */ + public void setGenre(String genre) { + Dispatch.put(object, "Genre", genre); + } + + /** + * Set the music/audio genre (category) of the object. + * @return The new music/audio genre (category) of the object. + */ + public String getGenre() { + return Dispatch.get(object, "Genre").getString(); + } + + /** + * Set the grouping (piece) of the object. + * Generally used to denote movements within classical work. + * @param grouping The new grouping (piece) of the object. + */ + public void setGrouping (String grouping) { + Dispatch.put(object, "Grouping", grouping); + } + + /** + * Returns the grouping (piece) of the object. + * Generally used to denote movements within classical work. + * @return Returns the grouping (piece) of the object. + */ + public String getGrouping() { + return Dispatch.get(object, "Grouping").getString(); + } + + public ITTrackKind getKind() { + return ITTrackKind.values()[Dispatch.get(object, "Kind").getInt()]; + } + + /** + * Returns the text description of the object (e.g. "AAC audio file"). + * @return Returns the text description of the object (e.g. "AAC audio file"). + */ + public String getKindAsString() { + return Dispatch.get(object, "KindAsString").getString(); + } + + /** + * Returns the modification date of the content of the object. + * @return Returns the modification date of the content of the object. + */ + public Date getModificationDate() { + return Dispatch.get(object, "ModificationDate").getJavaDate(); + } + + /** + * Set the number of times the object has been played. This property cannot + * be set if the object is not playable (e.g. a PDF file). + * @param playedCount The new number of times the object has been played. + */ + public void setPlayedCount (int playedCount) { + Dispatch.put(object, "PlayedCount", playedCount); + } + + /** + * Returns the number of times the object has been played. + * @return Returns the number of times the object has been played. + */ + public int getPlayedCount() { + return Dispatch.get(object, "PlayedCount").getInt(); + } + + /** + * Set the date and time the object was last played. This property cannot be + * set if the object is not playable (e.g. a PDF file). + * A value of zero means no played date. + * @param playedDate The new date and time the object was last played. + */ + public void setPlayedDate (Date playedDate) { + Dispatch.put(object, "PlayedDate", playedDate); + } + + /** + * Returns the date and time the object was last played. + * A value of zero means no played date. + * @return Returns the date and time the object was last played. + */ + public Date getPlayedDate() { + return Dispatch.get(object, "PlayedDate").getJavaDate(); + } + + /** + * Returns an ITPlaylist object corresponding to the playlist that contains + * the object. Use ITFileOrCDTrack::Playlists() or IITURLTrack::Playlists() + * to get the collection of all playlists that contain the song this object + * represents. + * @return Returns an ITPlaylist object corresponding to the playlist that + * contains the object. + */ + public ITPlaylist getPlaylist() { + Dispatch playlist = Dispatch.get(object, "Playlist").toDispatch(); + return new ITPlaylist(playlist); + } + + /** + * Returns the play order index of the object in the owner playlist + * (1-based). + * You can pass this index to IITTrackCollection::ItemByPlayOrder() for the + * collection returned by ITPlaylist::Tracks() to retrieve an ITTrack + * object corresponding to this object. + * @return Returns the play order index of the object in the owner playlist. + */ + public int getPlayOrderIndex() { + return Dispatch.get(object, "PlayOrderIndex").getInt(); + } + + /** + * Set the rating of the object (0 to 100). If the object rating is set to 0, + * it will be computed based on the album rating. + * @param rating The new rating of the object (0 to 100). + */ + public void setRating (int rating) { + Dispatch.put(object, "Rating", rating); + } + + /** + * Returns the rating of the object (0 to 100). If the object rating has never + * been set, or has been set to 0, it will be computed based on the album + * rating. + * @return Returns the rating of the object (0 to 100). + */ + public int getRating() { + return Dispatch.get(object, "Rating").getInt(); + } + + /** + * Returns the sample rate of the object (in Hz). + * @return Returns the sample rate of the object (in Hz). + */ + public int getSampleRate() { + return Dispatch.get(object, "SampleRate").getInt(); + } + + /** + * Returns the size of the object (in bytes). + * @return Returns the size of the object (in bytes). + */ + public int getSize() { + return Dispatch.get(object, "Size").getInt(); + } + + /** + * Set the start time of the object (in seconds). + * @param start The new start time of the object (in seconds). + */ + public void setStart (int start) { + Dispatch.put(object, "Start", start); + } + + /** + * Returns the start time of the object (in seconds). + * @return Returns the start time of the object (in seconds). + */ + public int getStart() { + return Dispatch.get(object, "Start").getInt(); + } + + /** + * Returns the length of the object (in MM:SS format). + * @return Returns the length of the object (in MM:SS format). + */ + public String getTime() { + return Dispatch.get(object, "Time").getString(); + } + + /** + * Set the total number of tracks on the source album. + * @param trackCount The new total number of tracks on the source album. + */ + public void setTrackCount (int trackCount) { + Dispatch.put(object, "TrackCount", trackCount); + } + + /** + * Returns the total number of tracks on the source album. + * @return Returns the total number of tracks on the source album. + */ + public int getTrackCount() { + return Dispatch.get(object, "TrackCount").getInt(); + } + + /** + * Set the index of the object on the source album. + * @param trackNumber The new index of the object on the source album. + */ + public void setTrackNumber (int trackNumber) { + Dispatch.put(object, "TrackNumber", trackNumber); + } + + /** + * Returns the index of the object on the source album. + * @return Returns the index of the object on the source album. + */ + public int getTrackNumber() { + return Dispatch.get(object, "TrackNumebr").getInt(); + } + + /** + * Set the relative volume adjustment of the object (-100% to 100%). + * @param volumeAdjustment Set the relative volume adjustment of the object + * (-100% to 100%). + */ + public void setVolumeAdjustment (int volumeAdjustment) { + Dispatch.put(object, "VolumeAdjustment", volumeAdjustment); + } + + /** + * Returns the relative volume adjustment of the object (-100% to 100%). + * @return Returns the relative volume adjustment of the object (-100% to 100%). + */ + public int getVolumeAdjustment() { + return Dispatch.get(object, "VolumeAdjustment").getInt(); + } + + /** + * Set the year the object was recorded/released. + * @param year The new year the object was recorded/released. + */ + public void setYear (int year) { + Dispatch.put(object, "Year", year); + } + + /** + * Returns the year the object was recorded/released. + * @return Returns the year the object was recorded/released. + */ + public int getYear() { + return Dispatch.get(object, "Year").getInt(); + } + + public ITArtworkCollection getArtwork() { + Dispatch art = Dispatch.get(object, "Artwork").toDispatch(); + return new ITArtworkCollection(art); + + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrackCollection.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrackCollection.java new file mode 100644 index 0000000..3e1f3bf --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrackCollection.java @@ -0,0 +1,99 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a collection of track objects. + * + * Note that collection indices are always 1-based. + * + * You can retrieve all the tracks defined for a playlist using + * ITPlaylist.getTracks(). + * + * You can retrieve the currently selected track or tracks using + * iTunes.getSelectedTracks(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITTrackCollection { + + protected Dispatch object; + + public ITTrackCollection(Dispatch d) { + object = d; + } + + /** + * Returns the number of tracks in the collection. + * @return Returns the number of tracks in the collection. + */ + public int getCount() { + return Dispatch.get(object, "Count").getInt(); + } + + /** + * Returns an ITTrack object corresponding to the given index (1-based). + * @param index Index of the track to retrieve, must be less than or + * equal to ITTrackCollection.getCount(). + * @return Returns an ITTrack object corresponding to the given index. + * Will be set to NULL if no track could be retrieved. + */ + public ITTrack getItem (int index) { + Dispatch item = Dispatch.call(object, "Item", index).toDispatch(); + ITTrack track = new ITTrack(item); + if (track.getKind()==ITTrackKind.ITTrackKindFile) { + return new ITFileOrCDTrack(item); + } else if (track.getKind()==ITTrackKind.ITTrackKindCD) { + return new ITFileOrCDTrack(item); + } else if (track.getKind()==ITTrackKind.ITTrackKindURL ) { + return new ITURLTrack(item); + } else { + return track; + } + } + + /** + * Returns an ITTrack object corresponding to the given index (1-based). + * @param index Index of the track to retrieve, must be less than or + * equal to ITTrackCollection.getCount(). + * @return Returns an ITTrack object corresponding to the given index. + * Will be set to NULL if no track could be retrieved. + */ + public ITTrack getItemByPlayOrder(int index) { + Dispatch item = Dispatch.call(object, "ItemByPlayOrder", index).toDispatch(); + return new ITTrack(item); + } + + /** + * Returns an ITTrack object withthe specified name. + * @param name The name of the track to retrieve. + * @return Returns an ITTrack object corresponding to the given index. + * Will be set to NULL if no track could be retrieved. + */ + public ITTrack ItemByName (String name) { + Dispatch item = Dispatch.call(object, "ItemByName", name).toDispatch(); + return new ITTrack(item); + } + + /** + * Returns an ITTrack object with the specified persistent ID. See the + * documentation on ITObject for more information on persistent IDs. + * @param highID The high 32 bits of the 64-bit persistent ID. + * @param lowID The low 32 bits of the 64-bit persistent ID. + * @return Returns an ITTrack object with the specified persistent ID. + * Will be set to NULL if no track could be retrieved. + */ + public ITTrack getItemByPersistentID (int highID, int lowID) { + Dispatch item = Dispatch.call(object, "ItemByPersistentID", highID, lowID).toDispatch(); + return new ITTrack(item); + } + + public boolean containsTrack(ITTrack track) { + String name = track.getName(); + try { + return ItemByName(name).getName().equals(name); + } catch (IllegalStateException e) { + return false; + } + } +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrackKind.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrackKind.java new file mode 100644 index 0000000..ec233a1 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITTrackKind.java @@ -0,0 +1,15 @@ +package com.dt.iTunesController; + +/** + * Specifies the track kind. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITTrackKind { + ITTrackKindUnknown, + ITTrackKindFile, + ITTrackKindCD, + ITTrackKindURL, + ITTrackKindDevice, + ITTrackKindSharedLibrary; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITURLTrack.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITURLTrack.java new file mode 100644 index 0000000..9829190 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITURLTrack.java @@ -0,0 +1,175 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a URL track. + * + * A URL track references a network audio stream. + * @author Steve Eyre + * @version 0.2 + */ +public class ITURLTrack extends ITTrack { + + public ITURLTrack (Dispatch d) { + super(d); + } + + /** + * Returns the URL of the stream represented by this track. + * @return The URL of the stream represented by this track. + */ + public String getURL () { + return Dispatch.get(object, "URL").getString(); + } + + /** + * Set the URL of the stream represented by this track. + * @param url The URL of the stream represented by this track. + */ + public void setURL (String url) { + Dispatch.call(object, "URL", url); + } + + /** + * Returns true if this track is a podcast track. If a podcast track is an + * IITURLTrack, the podcast episode has not been downloaded. + * @return Returns true if this track is a podcast track. + */ + public boolean isPodcast () { + return Dispatch.get(object, "Podcast").getBoolean(); + } + + /** + * Returns the category for the track. + * @return Returns the category for the track. + */ + public String getCategory () { + return Dispatch.get(object, "Category").getString(); + } + + /** + * Sets the category for the track. + * @param category Sets the category for the track. + */ + public void setCategory (String category) { + Dispatch.call(object, "Category", category); + } + + /** + * Returns the description for the track. + * @return Returns the description for the track. + */ + public String getDescription () { + return Dispatch.get(object, "Description").getString(); + } + + /** + * Sets the description for the track. + * @param description The new description for the track. + */ + public void setDescription (String description) { + Dispatch.call(object, "Description", description); + } + + /** + * Returns the long description for the track. + * @return Returns the description for the track. + */ + public String getLongDescription () { + return Dispatch.get(object, "LongDescription").getString(); + } + + /** + * Sets the long description for the track. + * @param longDescription The new long description for the track. + */ + public void setLongDescription (String longDescription) { + Dispatch.call(object, "LongDescription", longDescription); + } + + /** + * Returns the user or computed rating of the album that this track belongs + * to (0 to 100). If the album rating has never been set, or has been set to + * 0, it will be computed based on the ratings of tracks in the album. + * @return Returns the album rating of the album that this track belongs to (0 to 100). + */ + public long getAlbumRating () { + return Dispatch.get(object, "AlbumRating").getLong(); + } + + /** + * Set the album rating of the album that this track belongs to (0 to 100). + * If the album rating is set to 0, it will be computed based on the ratings + * of tracks in the album. + * @param albumRating The new album rating of the album that this track + * belongs to (0 to 100). If rating is outside this range, it will be + * pinned. + */ + public void setAlbumRating (long albumRating) { + Dispatch.call(object, "AlbumRating", albumRating); + } + + /** + * Returns the album rating kind. If the album rating has never been set, or + * has been set to 0, the kind is ITRatingKindComputed. Otherwise, the kind + * is ITRatingKindUser. + * @return Returns the album rating kind. + */ + public ITRatingKind getAlbumRatingKind () { + return ITRatingKind.values()[Dispatch.get(object, "AlbumRatingKind").getInt()]; + } + + /** + * Returns the track rating kind. If the track rating has never been set, or + * has been set to 0, the kind is ITRatingKindComputed. Otherwise, the kind + * is ITRatingKindUser. + * @return Returns the track rating kind. + */ + public ITRatingKind getRatingKind () { + return ITRatingKind.values()[Dispatch.get(object, "RatingKind").getInt()]; + } + + /** + * Returns a collection of playlists that contain the song that this track + * represents. + * + * This is the same collection of playlists that are shown in the "Show in + * Playlist" contextual menu for a track, plus the specific playlist that + * contains this track. + * + * A track represents a song in a single playlist, use + * ITTrack.getPlaylist() to get the specific playlist that + * contains this track. + * @return Collection of ITPlaylist objects. + */ + public ITPlaylistCollection getPlaylists () { + Dispatch playlists = Dispatch.get(object, "Playlists").toDispatch(); + return new ITPlaylistCollection(playlists); + } + + /** + * Update the podcast feed for this track. This is equivalent to the user + * choosing Update Podcast from the contextual menu for the podcast feed + * that contains this track. + */ + public void updatePodcastFeed () { + Dispatch.call(object, "UpdatePodcastFeed"); + } + + /** + * Start downloading the podcast episode that corresponds to this track. + * This is equivalent to the user clicking the Get button next to this + * track. + */ + public void downloadPodcastEpisode () { + Dispatch.call(object, "DownloadPodcastEpisode"); + } + + /** + * Reveals the track in the main browser window. + */ + public void reveal() { + Dispatch.call(object, "Reveal"); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITUserPlaylist.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITUserPlaylist.java new file mode 100644 index 0000000..b4025cf --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITUserPlaylist.java @@ -0,0 +1,60 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a user-defined playlist. + * + * A user playlist includes both smart and manual user-defined playlists. + * @author Steve Eyre + * @version 0.2 + */ +public class ITUserPlaylist extends ITPlaylist { + + public ITUserPlaylist(Dispatch d) { + super(d); + } + + /** + * Add a file or files inside a folder to the playlist. + * You cannot use this method to add a file that requires conversion to be + * added (e.g. a CD track), use iTunes.convertFile() or + * iTunes.convertFile2() instead. If you add a folder that + * contains files that require conversion, they will be skipped. + * @param filePath The full path to the file or folder to add. + * @return Returns an ITOperationStatus object corresponding to the + * asynchronous operation. If an error occurs, or no files were added, this + * will be set to NULL. + */ + public ITOperationStatus addFile (String filePath) { + Dispatch status = Dispatch.call(object, "AddFile", filePath).toDispatch(); + return new ITOperationStatus(status); + } + + /** + * Add a streaming audio URL to the playlist. + * @param url The URL to add. The length of the URL can be 255 characters or + * less. + * @return Returns an ITURLTrack object corresponding to the new track. + */ + public ITURLTrack addURL (String url) { + Dispatch URLTrack = Dispatch.call(object, "AddURL", url).toDispatch(); + return new ITURLTrack(URLTrack); + } + + /** + * Add an existing track to the playlist. + * You cannot use this method to add a CD track (ITTrackKindCD) to another + * playlist, use iTunes.convertTrack() or + * iTunes.convertTrack2() instead. + * You cannot add a shared library track (ITTrackKindSharedLibrary) to + * another playlist. + * @param track The track to add. + * @return Returns an IITTrack object corresponding to the new track. + */ + public ITTrack addTrack (ITTrack track) { + Dispatch trackToAdd = track.fetchDispatch(); + Dispatch addedTrack = Dispatch.call(object, "AddTrack", trackToAdd).toDispatch(); + return new ITTrack(addedTrack); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITVideoKind.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITVideoKind.java new file mode 100644 index 0000000..d318724 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITVideoKind.java @@ -0,0 +1,13 @@ +package com.dt.iTunesController; + +/** + * Specifies the Video kind. + * @author Steve Eyre + * @version 0.2 + */ +public enum ITVideoKind { + ITVideoKindNone, + ITVideoKindMovie, + ITVideoKindMusicVideo, + ITVideoKindTVShow; +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITWindow.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITWindow.java new file mode 100644 index 0000000..4af825f --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITWindow.java @@ -0,0 +1,32 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents an iTunes window. + */ + +public class ITWindow { + + protected Dispatch object; + + public ITWindow(Dispatch d) { + object = d; + } + + /** + * Returns the JACOB Dispatch object for this object. + * @return Returns the JACOB Dispatch object for this object. + */ + public Dispatch fetchDispatch() { + return object; + } + + /** + * Returns the name of the object. + * @return Returns the name of the object. + */ + public String getName() { + return Dispatch.get(object, "Name").getString(); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/ITWindowCollection.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITWindowCollection.java new file mode 100644 index 0000000..df1f3cf --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/ITWindowCollection.java @@ -0,0 +1,55 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; + +/** + * Represents a collection of window objects. + * + * Note that collection indices are always 1-based. + * + * You can retrieve all the windows using + * iTunes.getWindows(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class ITWindowCollection { + + protected Dispatch object; + + public ITWindowCollection(Dispatch d) { + object = d; + } + + // TODO: iTunes.getWindows() + + /** + * Returns the number of playlists in the collection. + * @return Returns the number of playlists in the collection. + */ + public int getCount() { + return Dispatch.get(object, "Count").getInt(); + } + + /** + * Returns an ITWindow object corresponding to the given index (1-based). + * @param index Index of the playlist to retrieve, must be less than or + * equal to ITWindowCollection.getCount(). + * @return Returns an ITWindow object corresponding to the given index. + * Will be set to NULL if no playlist could be retrieved. + */ + public ITWindow getItem (int index) { + Dispatch item = Dispatch.call(object, "Item", index).toDispatch(); + return new ITWindow(item); + } + /** + * Returns an ITWindow object with the specified name. + * @param name The name of the window to retrieve. + * @return Returns an ITWindow object corresponding to the given index. + * Will be set to NULL if no ITWindow could be retrieved. + */ + public ITWindow ItemByName (String name) { + Dispatch item = Dispatch.call(object, "ItemByName", name).toDispatch(); + return new ITWindow(item); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunes.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunes.java new file mode 100644 index 0000000..6a54d07 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunes.java @@ -0,0 +1,539 @@ +package com.dt.iTunesController; + +import com.jacob.activeX.ActiveXComponent; +import com.jacob.com.ComThread; +import com.jacob.com.Dispatch; +import com.jacob.com.DispatchEvents; + +/** + * Defines the top-level iTunes application object. + * + * This interface defines the top-level iTunes application object. All other + * iTunes interfaces are accessed through this object. + * + * @author Steve Eyre + * @version 0.2 + */ +public class iTunes { + ActiveXComponent iTunes; + iTunesEvents iTunesEvents; + DispatchEvents dispatchEvents; + + /** + * Initiate iTunes Controller. + * @return + */ + public void connect() { + iTunes = new ActiveXComponent("iTunes.Application"); + } + + /** + * Add an event handler to the iTunes controller. + * @param itef The class that will handle the iTunes events. + */ + public void addEventHandler(iTunesEventsInterface itef) { + iTunesEvents = new iTunesEvents(itef); + dispatchEvents = new DispatchEvents(iTunes, iTunesEvents); + //System.out.println("New event handler added."); + } + + /** + * Reposition to the beginning of the current track or go to the previous + * track if already at start of current track. + */ + public void backTrack() { + iTunes.invoke("BackTrack"); + } + + /** + * Skip forward in a playing track. + */ + public void fastForward() { + iTunes.invoke("FastForward"); + } + + /** + * Advance to the next track in the current playlist. + */ + public void nextTrack() { + iTunes.invoke("NextTrack"); + } + + /** + * Pause playback. + */ + public void pause() { + iTunes.invoke("Pause"); + } + + /** + * Play the currently targeted track. + */ + public void play() { + iTunes.invoke("ASDSDPlay"); + } + + /** + * Play the specified file path, adding it to the library if not already + * present. + */ + public void playFile(String filePath) { + iTunes.invoke("PlayFile", filePath); + } + + /** + * Toggle the playing/paused state of the current track. + */ + public void playPause() { + iTunes.invoke("PlayPause"); + } + + /** + * Return to the previous track in the current playlist. + */ + public void previousTrack() { + iTunes.invoke("PreviousTrack"); + } + + /** + * Disable fast forward/rewind and resume playback, if playing. + */ + public void resume() { + iTunes.invoke("Resume"); + } + + /** + * Skip backwards in a playing track. + */ + public void rewind() { + iTunes.invoke("Rewind"); + } + + /** + * Stop playback. + */ + public void stop() { + iTunes.invoke("Stop"); + } + + /** + * Retrieves the current state of the player buttons in the window + * containing the currently targeted track. If there is no currently + * targeted track, returns the current state of the player buttons + * in the main browser window. + */ + public void getPlayerButtonsState(boolean previousEnabled, + String playPause, boolean nextEnabled) { + + } + + /** + * Returns true if this version of the iTunes type library is compatible + * with the specified version. + * @param majorVersion Major version of iTunes interface. + * @param minorVersion Minor version of iTunes interface. + * @return Returns true if this version is compatible with the indicated + * interface version. + */ + public boolean getCheckVersion (int majorVersion, int minorVersion) { + return iTunes.invoke("CheckVersion", majorVersion, minorVersion).getBoolean(); + } + + /** + * Returns an IITObject corresponding to the specified IDs. + * The object may be a source, playlist, or track. + * @param sourceID The ID that identifies the source. Valid for a source, + * playlist, or track. + * @param playlistID The ID that identifies the playlist. Valid for a + * playlist or track. Must be zero for a source. + * @param trackID The ID that identifies the track within the playlist. + * Valid for a track. Must be zero for a source or playlist. + * @param databaseID The ID that identifies the track, independent of its + * playlist. Valid for a track. Must be zero for a source or playlist. + * @return Returns an IITObject object corresponding to the specified IDs. + * Will be set to NULL if no object could be retrieved. + */ + public ITObject getITObjectByID(int sourceID, int playlistID, int trackID, int databaseID) { + Dispatch object = Dispatch.call(iTunes, "GetITObjectByID", sourceID, playlistID, trackID, databaseID).toDispatch(); + return new ITObject(object); + } + + /** + * Creates a new playlist in the main library. + * @param playlistName The name of the new playlist (may be empty). + * @return Returns an ITPlaylist object corresponding to the new playlist. + */ + public ITPlaylist createPlaylist(String playlistName) { + Dispatch cplaylist = Dispatch.call(iTunes, "CreatePlaylist", playlistName).toDispatch(); + ITPlaylist playlist = new ITPlaylist(cplaylist); + ITPlaylistKind playlistKind = playlist.getKind(); + if (playlistKind == ITPlaylistKind.ITPlaylistKindCD) + return new ITAudioCDPlaylist(cplaylist); + else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindLibrary) + return new ITLibraryPlaylist(cplaylist); + else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindUser) + return new ITUserPlaylist(cplaylist); + else + return playlist; + } + + /** + * Open the specified iTunes Store or streaming audio URL. + * @param url The URL to open. The length of the URL cannot exceed 512 + * characters. iTunes Store URLs start with itms:// or itmss://. Streaming + * audio URLs start with http://. + */ + public void openURL (String url) { + iTunes.invoke("OpenURL", url); + } + + /** + * Go to the iTunes Store home page. + */ + public void gotoMusicStoreHomePage() { + iTunes.invoke("GoToMusicStoreHomePage"); + } + + /** + * Update the contents of the iPod. + */ + public void updateIPod() { + iTunes.invoke("UpdateIPod"); + } + + /** + * Exits the iTunes application. + */ + public void quit() { + iTunes.invoke("Quit"); + } + + /** + * Creates a new EQ preset. + * The EQ preset will be created "flat", i.e. the preamp and all band levels + * will be set to 0. + * EQ preset names cannot start with leading spaces. If you specify a name + * that starts with leading spaces they will be stripped out. + * If eqPresetName is empty, the EQ preset will be created with + * a default name. + * @param eqPresetName The name of the new EQ Preset (may be empty) + * @return Returns an ITEQPreset object corresponding to the new EQ Preset. + */ + public ITEQPreset createEQPreset(String eqPresetName) { + Dispatch eqPreset = Dispatch.call(iTunes, "CreateEQPreset", eqPresetName).toDispatch(); + return new ITEQPreset(eqPreset); + } + + /** + * Creates a new playlist in an existing source. + * You may not be able to create a playlist in every source. For example, + * you cannot create a playlist in an audio CD source, or in an iPod source + * if it is in auto update mode. + * If playlistName is empty, the playlist will be created with + * a default name. + * @param playlistName The name of the new playlist (may be empty). + * @param source The source that will contain the new playlist. + * @return Returns an ITPlaylist object corresponding to the new playlist. + */ + public ITPlaylist createPlaylistInSource(String playlistName, ITSource source) { + Dispatch cplaylist = Dispatch.call(iTunes, "CreatePlaylistInSource", playlistName, source.fetchDispatch()).toDispatch(); + ITPlaylist playlist = new ITPlaylist(cplaylist); + ITPlaylistKind playlistKind = playlist.getKind(); + if (playlistKind == ITPlaylistKind.ITPlaylistKindCD) + return new ITAudioCDPlaylist(cplaylist); + else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindLibrary) + return new ITLibraryPlaylist(cplaylist); + else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindUser) + return new ITUserPlaylist(cplaylist); + else + return playlist; + } + + /** + * Subscribes to the specified podcast feed URL. Any "unsafe" characters in + * the URL should already be converted into their corresponding escape + * sequences, iTunes will not do this. + * @param url The URL to subscribe to. + */ + public void subscribeToPodcast(String url) { + iTunes.invoke("SubscribeToPodcast", url); + } + + /** + * Updates all podcast feeds. This is equivalent to the user pressing the + * Update button when Podcasts is selected in the Source list. + */ + public void updatePodcastFeeds() { + iTunes.invoke("UpdatePodcastFeeds"); + } + + /** + * Creates a new folder in the main library. + * If folderName is empty, the folder will be created with a + * default name. + * @param folderName The name of the new folder (may be empty). + * @return Returns an ITPlaylist object corresponding to the new folder. + */ + public ITUserPlaylist createFolder(String folderName) { + Dispatch folder = Dispatch.call(iTunes, "CreateFolder", folderName).toDispatch(); + return new ITUserPlaylist(folder); + } + + /** + * Creates a new folder in an existing source. + * You may not be able to create a folder in every source. For example, you + * cannot create a folder in an audio CD source, or in an iPod source if it + * is in auto update mode. + * If folderName is empty, the folder will be created with a + * default name. + * @param folderName The name of the new folder (may be empty) + * @param iSource The source that will contain the new folder. + * @return Returns an ITPlaylist object corresponding to the new folder. + */ + public ITUserPlaylist createFolderInSource(String folderName, ITSource iSource) { + Dispatch folder = Dispatch.call(iTunes, "CreateFolderInSource", folderName, iSource.fetchDispatch()).toDispatch(); + return new ITUserPlaylist(folder); + } + + /** + * Returns a collection of music sources (music library, CD, device, etc.). + * @return Collection of ITSource objects. + */ + public ITSourceCollection getSources() { + Dispatch sources = Dispatch.call(iTunes, "Sources").toDispatch(); + return new ITSourceCollection(sources); + } + + /** + * Sets the sound output volume (0=minimum, 100=maximum). + * @param volume New sound output volume + */ + public void setSoundVolume(int volume) { + iTunes.setProperty("SoundVolume", volume); + } + + /** + * Returns the sound output volume (0=minimum, 100=maximum). + * @return Current sound output volume + */ + public int getSoundVolume() { + return iTunes.getPropertyAsInt("SoundVolume"); + } + + /** + * Sets sound output mute state. + * @param shouldMute If true, sound output will be muted. + */ + public void setMute(boolean shouldMute) { + iTunes.setProperty("Mute", shouldMute); + } + + /** + * Returns true if the sound output is muted. + * @return True if sound output is muted. + */ + public boolean getMute() { + return iTunes.getPropertyAsBoolean("Mute"); + } + + /** + * Toggle the mute state. + */ + public void toggleMute() { + setMute(!getMute()); + } + + /** + * Toggle the shuffle state. + */ + public void toggleShuffle() { + getCurrentPlaylist().toggleShuffle(); + } + + /** + * Returns the current player state. + * @return Returns the current player state. + */ + public ITPlayerState getPlayerState() { + return ITPlayerState.values()[Dispatch.get(iTunes, "PlayerState").getInt()]; + } + + /** + * Sets the player's position within the currently playing track in + * seconds. + * If playerPos specifies a position before the beginning of the track, + * the position will be set to the beginning. If playerPos specifies a + * position after the end of the track, the position will be set to the + * end. + * @param playerPos The player's position within the currently playing + * track in seconds. + */ + public void setPlayerPosition(int playerPos) { + iTunes.setProperty("playerPosition", playerPos); + } + + /** + * Returns the player's position within the currently playing track in + * seconds. + * @return The player's position within the currently playing track in + * seconds. + */ + public int getPlayerPosition() { + return iTunes.getPropertyAsInt("playerPosition"); + } + + /** + * Returns the source that represents the main library. + * You can also find the main library source by iterating over + * iTunes.getSources() and looking for an ITSource + * of kind ITSourceKindLibrary. + * @return Returns the source that represents the main library. + */ + public ITSource getLibrarySource() { + Dispatch lsource = iTunes.getProperty("LibrarySource").toDispatch(); + return new ITSource(lsource); + } + + /** + * Returns the main library playlist in the main library source. + * @return An IITLibraryPlaylist object corresponding to the main library + * playlist. + */ + public ITLibraryPlaylist getLibraryPlaylist() { + Dispatch lplaylist = iTunes.getProperty("LibraryPlaylist").toDispatch(); + return new ITLibraryPlaylist(lplaylist); + } + + /** + * Returns the currently targetd track. + * @return An ITTrack object corresponding to the currently targeted track. + * Will be set to NULL if there is no currently targeted track. + */ + public ITTrack getCurrentTrack() { + Dispatch item = iTunes.getProperty("CurrentTrack").toDispatch(); + ITTrack track = new ITTrack(item); + if (track.getKind()==ITTrackKind.ITTrackKindFile) { + return new ITFileOrCDTrack(item); + } else if (track.getKind()==ITTrackKind.ITTrackKindCD) { + return new ITFileOrCDTrack(item); + } else if (track.getKind()==ITTrackKind.ITTrackKindURL ) { + return new ITURLTrack(item); + } else { + return track; + } + } + + /** + * Returns the playlist containing the currently targeted track. + * @return An ITPlaylist object corresponding to the playlist containing the + * currently targeted track. + * Will be set to NULL if there is no currently targeted playlist. + */ + public ITPlaylist getCurrentPlaylist() { + Dispatch cplaylist = iTunes.getProperty("CurrentPlaylist").toDispatch(); + ITPlaylist playlist = new ITPlaylist(cplaylist); + ITPlaylistKind playlistKind = playlist.getKind(); + if (playlistKind == ITPlaylistKind.ITPlaylistKindCD) + return new ITAudioCDPlaylist(cplaylist); + else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindLibrary) + return new ITLibraryPlaylist(cplaylist); + else if (playlist.getKind() == ITPlaylistKind.ITPlaylistKindUser) + return new ITUserPlaylist(cplaylist); + else + return playlist; + } + + /** + * Returns a collection containing the currently selected track or tracks. + * The frontmost visible window in iTunes must be a browser or playlist + * window. If there is no frontmost visible window (e.g. iTunes is minimized + * to the system tray), the main browser window is used. + * @return Collection of ITrack objects. + * Will be set to NULL if there is no current selection. + */ + public ITTrackCollection getSelectedTracks() { + Dispatch stracks = iTunes.getProperty("SelectedTracks").toDispatch(); + return new ITTrackCollection(stracks); + } + + /** + * Returns the version of the iTunes application. + * @return + */ + public String getVersion() { + return iTunes.getPropertyAsString("Version"); + } + + /** + * Returns the high 32 bits of the persistent ID of the specified IITObject. + * See the documentation on IITObject for more information on persistent + * IDs. + * + * The object may be a source, playlist, or track. + * @param iObject The object to fetch the High Persistent ID. + * @return The high 32 bits of the 64-bit persistent ID. + */ + public long getITObjectPersistentIDHigh (ITObject iObject) { + Dispatch object = iObject.fetchDispatch(); + return Dispatch.call(object, "GetObjectPersistentIDHigh", object).getLong(); + } + + /** + * Returns the low 32 bits of the persistent ID of the specified IITObject. + * See the documentation on IITObject for more information on persistent + * IDs. + * + * The object may be a source, playlist, or track. + * @param iObject The object to fetch the Low Persistent ID. + * @return The low 32 bits of the 64-bit persistent ID. + */ + public long getITObjectPersistentIDLow (ITObject iObject) { + Dispatch object = iObject.fetchDispatch(); + return Dispatch.call(object, "GetObjectPersistentIDLow", object).getLong(); + } + + public ITObjectPersistentID getObjectPersistentIDs(ITObject iObject){ + return new ITObjectPersistentID(getITObjectPersistentIDHigh(iObject),getITObjectPersistentIDLow(iObject)); + } + + public ITBrowserWindow getBrowserWindow(){ + Dispatch window = iTunes.getProperty("BrowserWindow").toDispatch(); + return new ITBrowserWindow(window); + } + + public void cycleSongRepeat() { + getCurrentPlaylist().cycleSongRepeat(); + } + + public ITPlaylist getPlaylist(String name) { + ITPlaylistCollection playlistCollection = getLibrarySource().getPlaylists(); + ITPlaylist playlist = playlistCollection.ItemByName(name); + try { + playlist.getName(); + } catch (IllegalStateException e) { + playlist = createPlaylist(name); + } + return playlist; + } + + public ITUserPlaylist getUserPlaylist(String name) { + ITPlaylist playlist = getPlaylist(name); + ITUserPlaylist userPlaylist = new ITUserPlaylist(playlist.fetchDispatch()); + return userPlaylist; + } + + public void playlistAddTrack(String name, ITTrack track) { + ITUserPlaylist userPlaylist = getUserPlaylist(name); + if (!userPlaylist.containsTrack(track)) { + userPlaylist.addTrack(track); + } + } + + public void playlistAddCurrentTrack(String name) { + playlistAddTrack(name, getCurrentTrack()); + } + + public void release() { + ComThread.Release(); + } +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunesEvents.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunesEvents.java new file mode 100644 index 0000000..ddbee23 --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunesEvents.java @@ -0,0 +1,62 @@ +package com.dt.iTunesController; +import com.jacob.com.Dispatch; +import com.jacob.com.Variant; + +/** + * This class is used to forward all iTunes COM Events to a class that + * implements iTunesEventsInterface. To receive events, create + * a class that implements the interface, and then use + * iTunes.addEventHandler(). + * + * @author Steve Eyre + * @version 0.2 + */ +public class iTunesEvents { + + private iTunesEventsInterface eventHandler; + + public iTunesEvents (iTunesEventsInterface itef) { + eventHandler = itef; + } + + public void OnDatabaseChangedEvent(Variant[] args) { + // Not currently implemented + } + + public void OnPlayerPlayEvent(Variant[] args) { + ITTrack itt = new ITTrack((Dispatch)args[0].getDispatch()); + eventHandler.onPlayerPlayEvent(itt); + } + + public void OnPlayerStopEvent(Variant[] args) { + ITTrack itt = new ITTrack((Dispatch)args[0].getDispatch()); + eventHandler.onPlayerStopEvent(itt); + } + + public void OnPlayerPlayingTrackChangedEvent(Variant[] args) { + ITTrack itt = new ITTrack((Dispatch)args[0].getDispatch()); + eventHandler.onPlayerPlayingTrackChangedEvent(itt); + } + + public void OnCOMCallsDisabledEvent(Variant[] args) { + ITCOMDisabledReason reason = ITCOMDisabledReason.values()[args[0].getInt()]; + eventHandler.onCOMCallsDisabledEvent(reason); + } + + public void OnCOMCallsEnabledEvent(Variant[] args) { + eventHandler.onCOMCallsEnabledEvent(); + } + + public void OnQuittingEvent(Variant[] args) { + eventHandler.onQuittingEvent(); + } + + public void OnAboutToPromptUserToQuitEvent(Variant[] args) { + eventHandler.onAboutToPromptUserToQuitEvent(); + } + + public void OnSoundVolumeChangedEvent(Variant[] args) { + eventHandler.onSoundVolumeChangedEvent(args[0].getInt()); + } + +} diff --git a/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunesEventsInterface.java b/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunesEventsInterface.java new file mode 100644 index 0000000..3d8f17e --- /dev/null +++ b/java/itunescontroller/src/main/java/com/dt/iTunesController/iTunesEventsInterface.java @@ -0,0 +1,115 @@ +package com.dt.iTunesController; + +/** + * Interface for receiving iTunes events. + * @author Steve Eyre + * @version 0.2 + */ +public interface iTunesEventsInterface { + + /** + * Not currently implemented. + * + * The ITEventDatabaseChanged event is fired when the iTunes database is + * changed. + * + * Each parameter is a two-dimensional array of integers. The first + * dimension is the number of objects. The second dimension is always 4 and + * specifies each of the 4 ITObject IDs, where index 0 is the source ID, + * index 1 is the playlist ID, index 2 is the track ID, and index 3 is the + * track database ID. For more information on object IDs, see + * ITObject. + * + * Note that you can use iTunes.getITObjectByID() to retrieve + * changed ITObject, but not for deleted objects (since they no longer + * exist). + * + * @param deletedObjectIDs + * @param changedObjectIDs + */ + public void onDatabaseChangedEvent(int[][] deletedObjectIDs, int[][] changedObjectIDs); + + /** + * The ITEventPlayerPlay event is fired when a track begins playing. + * @param iTrack An ITTrack object corresponding to the track that has + * started playing. + */ + public void onPlayerPlayEvent (ITTrack iTrack); + + /** + * The ITEventPlayerStop event is fired when a track stops playing. + * @param iTrack An ITTrack object corresponding to the track that has + * stopped playing. + */ + public void onPlayerStopEvent (ITTrack iTrack); + + /** + * The ITEventPlayerPlayingTrackChanged event is fired when information + * about the currently playing track has changed. + * This event is fired when the user changes information about the currently + * playing track (e.g. the name of the track). + * This event is also fired when iTunes plays the next joined CD track in a + * CD playlist, since joined CD tracks are treated as a single track. + * @param iTrack An ITTrack object corresponding to the track that is now + * playing. + */ + public void onPlayerPlayingTrackChangedEvent(ITTrack iTrack); + + /** + * The ITEventCOMCallsDisabled event is fired when calls to the iTunes COM + * interface will be deferred. + * Typically, iTunes will defer COM calls when any modal dialog is being + * displayed. When the user dismisses the last modal dialog, COM calls will + * be enabled again, and any deferred COM calls will be executed. You can + * use this event to avoid making a COM call which will be deferred. + * @param reason The reason the COM interface is being disabled. This is + * typically ITCOMDisabledReasonDialog. + */ + public void onCOMCallsDisabledEvent(ITCOMDisabledReason reason); + + /** + * The ITEventCOMCallsEnabled event is fired when calls to the iTunes COM + * interface will no longer be deferred. + * Typically, iTunes will defer COM calls when any modal dialog is being + * displayed. When the user dismisses the last modal dialog, COM calls will + * be enabled again, and any deferred COM calls will be executed. + */ + public void onCOMCallsEnabledEvent(); + + /** + * The ITEventQuitting event is fired when iTunes is about to quit. + * If the user attempts to quit iTunes while a client still has outstanding + * iTunes COM objects instantiated, iTunes will display a warning dialog. + * The user can still choose to quit iTunes anyway, in which case this event + * will be fired. After this event is fired, any existing iTunes COM objects + * will no longer be valid. + * This event is only used to notify clients that iTunes is quitting, + * clients cannot prevent this from happening. + */ + public void onQuittingEvent(); + + /** + * The ITEventAboutToPromptUserToQuit event is fired when iTunes is about + * prompt the user to quit. + * This event gives clients the opportunity to prevent the warning dialog + * prompt from occurring. + * If the user attempts to quit iTunes while a client still has outstanding + * iTunes COM objects instantiated, iTunes will display a warning dialog. + * This event is fired just before the warning dialog is shown. iTunes will + * then wait up to 5 seconds for clients to release any outstanding iTunes + * COM objects. If all objects are released during this time, the warning + * dialog will not be shown and iTunes will quit immediately. + * Otherwise, the warning dialog will be shown. If the user chooses to quit + * iTunes anyway, the ITEventQuitting event is fired. See + * iTunesEventsInterface.onQuittingEvent() for more details. + */ + public void onAboutToPromptUserToQuitEvent(); + + /** + * The ITEventSoundVolumeChanged event is fired when the sound output volume + * has changed. + * @param newVolume The new sound output volume (0 = minimum, 100 = maximum). + */ + public void onSoundVolumeChangedEvent(int newVolume); + +} diff --git a/java/mimis/.classpath b/java/mimis/.classpath new file mode 100644 index 0000000..c80843f --- /dev/null +++ b/java/mimis/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/java/mimis/.project b/java/mimis/.project new file mode 100644 index 0000000..e30efa6 --- /dev/null +++ b/java/mimis/.project @@ -0,0 +1,18 @@ + + + mimis + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.springsource.ide.eclipse.gradle.core.nature + org.eclipse.jdt.core.javanature + + diff --git a/java/mimis/DelcomDLL.dll b/java/mimis/DelcomDLL.dll new file mode 100644 index 0000000000000000000000000000000000000000..ecfa470c3c66e19ef056dd7553d648e0605a1342 GIT binary patch literal 90112 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 literal 0 HcmV?d00001 diff --git a/java/mimis/build.gradle b/java/mimis/build.gradle new file mode 100644 index 0000000..427e0f1 --- /dev/null +++ b/java/mimis/build.gradle @@ -0,0 +1,35 @@ +import java.util.jar.JarEntry; + +apply plugin: 'java' +apply plugin: 'eclipse' +apply plugin: 'cpp-lib' + +version = '0.1' + +sourceCompatibility = 1.6 +targetCompatibility = 1.6 + +def mainClass = 'mimis.Main' + +repositories { + mavenCentral() +} + +dependencies { + compile project(':itunescontroller') + compile project(':wiiusej') + compile project(':wiigee') + + compile 'commons-collections:commons-collections:3.+' + compile 'commons-logging:commons-logging:1.+' + compile 'log4j:log4j:1.2.17' + compile 'com.melloware:jintellitype:1.3.7' + + compile fileTree(dir: 'lib', include: '*.jar') +} + +jar { + manifest { + attributes 'Main-Class': mainClass + } +} \ No newline at end of file diff --git a/java/mimis/build.xml b/java/mimis/build.xml new file mode 100644 index 0000000..4d47af4 --- /dev/null +++ b/java/mimis/build.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/mimis/client.jar b/java/mimis/client.jar new file mode 100644 index 0000000000000000000000000000000000000000..a16b1bd65597742e5d7395fd1cf01d6aaf294864 GIT binary patch literal 1777650 zcmdSAXIRtSvOY{vP^2j+O+Z9xN)1hrA_yoDP!Lg?(g`J@gc^!Sm8#Nvlir08TIjta zy>|#Dp@$A{+-INT^WSH0p7Ztfx==pMJ+pqZX6~6aYxzov@CpeY-ZebDG3c=j-e3M) z$Gd_Dlza1x`=yFJ?|BCv-m8C#Uc(#3iE7+*{e+K?hu4Sup~k`fM-=!><)yrw`Wqgg zyxZ4Kl}2e&xr1*z6mJgzK!Q2`D&cF_f4ur}AKTLe((PuAjcM4V`izIq^{8`re;Wzz z-s zg5!$c)2fm*7IE~)*mA0weMydYc_z0l&%WyMQ%)YIt($hw_x_?{2h^+Hti7xGv-%L5 zii{v0tm!O4zlbFsma;y`H7W7Up1&be0@7zJpXrC}XD+xYrfKn*rqX&zeN_=SHtZ8r zE`BMdm>HiWy5G-$At1^){80My4w??CAS|JyG0XS{Ud{q6OS_koTJHPv&3-!9`T<2X z{(rj+4{y}y|Ml(_oXZR$R=odNg7}{jM$k)yX#WU--q?eU?PMWfs4c|O(%AMA6!||< zR>qc=5J!Dm<4a^2{+Fyd2n@vmK~QJw%YZ~UAjl8`w!1|6Zy76)73eaVTmK`YZ*6S} zGSr8HAmB@M-ubukhE_(GV3__R#t{TIf;e8bK90Y|nnJ9sE%lu*-4d?9)naW1fkGTW z#*UZjdHA<_a9^ZvWqpY=?*F}tOYwC777v2{4$n)>()?SPCCJwB642fM3<6n0F5B{d zA0}4Tms$IrZT}Une+@-jhymoX9R2r}94s%hMD{|9|X3x zzidq`|Em8F$k+*LYiwl0PagcSZD0?D zURo^v9q6Af`p;|q6a9ZI{S)*jjs7$I4p1Z~ooJU-Ch}L+&qtza_2T{`!mj z-x1Egs5b#wUd}TAqTUi>3c9Sn`CV52vYNjMkgGUpD6Ys|;tt#a77yoSdpl$EOQb0N zBK40rxU3=lO`QL&@}K|y!)upeez)KM9%F6hY==9%SpKbw-$eTFRs8nSWyab5Bl5rW z>05*T#rie8xBv$kAm}MCmlgrua1|Neb({|1?-Lo1ftB?J@_MzYhW$$Jef8HGZ(i>@ zL8h`zasocb;*nju_MC|DbMoipE)s(K27_kz0RjP^>is_sUb$*>jW+1}NKKEDquz1) zZr6HLiuh)_kk{&0+OT0PsMa34xiRCB0Qa*yA3$D>-#@ZD8bMybE>>!Lm}+3?8Lg91 z_4CECC%lg={Z0`o=O=M)df1;pUXQU(z4M>xn3K@9-dc$RV~iB!q69vyWs(2?lfPWx zNx-!3JyWZ{E*ROL5!Oy@06-W0^-CBEx&>`0`c1~+FrV%{V3F{^xmmt=+$#1KA_l9t zDLjyptO3y6ek=9x37Lp+dTsCO@6b%bc%8#!h&Ue9YAw>lvX92T>i6_(&}TXllltNe!N zAzB711t9~=L-;P`+5#8t)_K}F9`#chOnJTH7I_YCgP~+twGVyniQhsg;rQ=9n@Ja;we-2CtZQ5AVPU<)ntK-zA!~)>!{T>q@U={(i60*b}6E3k}p`G7dRj0@>vO z9?MgVs`7i7}{ZqS%1%!8BTnHJ?i|C)kA_ z@Y|30x|JN4>d%->u0P{$s!VlpBO7=Ec3f{^8I$I*zt_!noXtR9J!h4#i`p-`wP7X5 z9? zR{fqPS&W`X>1&0r?M_BlIA&`L2b~OM?mHA(oP^Yj95rk9b{3B>Y27Lm%6zi-+RyroPsEg)EcPO2>Knz`;Q8M@sMi>kC~T)!bPQ3pY+itCH? zABdDBc4$*?06!>Ag>PZ@2E1ZL(U}@=DGDEyGCP8R=NTZsGi43rk^U<~IcO8AK9zO1 zbRPvm1r2QUdY138e=%MbtPGWNArEp&@{AQg^=vXT5@*pNl5*L_Fl6oa+(Vr1pY`<0})^pGnq+oz~v!4mKRSHMc$sv3uha@ognP} zizdb+w!E$S{Na53a)Qn5vjzwMxSo3Mwe~(kmIgXe3ef2Z|4CJ}4{ztJ8})J;E%S5@ zC~n)Y1C5-54!AYg$9zfmLx@7M)87WnIe#GSTkbz&5AN*oX06y(B^pVqKI8Q~E9&W5 z-=$3=I2<(HbSXlmZJ)OB9+WcgD4ke4W;moojlB;HY1!z}-Ctq}u9NC6NG8VgE_bek zYx>RoT8$Ywb_5~v1>wD-4?Ko{fqGww1@TNaJ(1l}MWt?CC3Ni3n|7*P3xYSDmpJ${ zpeRS;0BIIUePMek*jqPwNLIYJYJsCOgYVa9$fifWKixERI%$AqLT2>jHsJ@zqo6wl z{qD5SN178gCm#0Ot2YWoMf*Ar^pn;d$Zuw^1|{}?fCs8Ig@^z>#h#odofL8O9uRFw zgtD9oCVJ#6=A;rrpw(x7CXw`!-DdH)Ds(rI2)bFHGzT5dlmc|Fn7Oh-S1CSIDrl-} zLktb=3Nx1BS~4$y=C2>1@*~I_lcc`%gF0fBj|m~RfC-H2UAPGa`$R6 zX(vGNK>0Q^!CUrJg_zSqq#J~?rS{HexA4U@(!$M;VK)tD*T?W}VT~u#iy3ixX(vAK z{fBtUyQXkiY5yU%4;G;7ajOsJ!Do<vdM zs(Vn_IP6d!p{{MBx89n5#8NO@yeH z9kzQATFJYD4f~pqU3X1K>sOOZ)5q32=C(7y)_w^&FR}KgwInBn8m#RWzNQz7{V=XA zJqG8V&{3d2BhRl#W2ifcddsH>6D&oCOppkvl(owRXsFLtCh2*~ncwvJ`<0soj)FZ&Wp}M$b zJK)qs^O(n5EX`E(x!h?s<*HCS6?Iz5A?0iw1wCQrfqS{c(3jLe_?u|m8Arx@XX5O> z`i_0cOgv4cF;}DXjOct@XH@%PdwPP`s}=mVw}d#<|xn??^8kxp$rOSj`3Q!ki`g z#HDsr8Q!7phR`1I!2(A2vvP?iti@X_8-4D8v*Zw#4I%Ms%~L8?gfabUN-5(#W_O;& ze0qtR=nLyU;DA|kBI)I_-OW-&UYMcO0EK5jONQ;L_cuo3y!K5gps}BS=?hjcodUk{ zOqO^Mq2iIX+oajQ!?+`tj4|%R$(}rzQ#H1Iq^L4OXs3c`Q_2x*I(=TMbOJCwRQFvY z>+++$&~4s=<0Z{VfCS7)uTRA(n`dh?%kkRH$f6q1A=B#@I`A%Yr5SpIYJ4Yti6Dhd zIe&}+C$v{Paa2}tsGRA3C7t#z>} z*n5$kgg*oo@&c_AjaHc-kqORuq7 zU#@$L48O+IrFXK`H5BDJ0Yg29dwpl&36YtX{w%_oU{Ty9*7^A7p4;`+sitWFsz3pf z3X^qN2_!3Sl!At=(tCUu8c!Ls2BhkLx*9pgHFQEgC-bWhwp(|inzN@To6K zvKdsy)=gxLt{XLabN3ea54Lj3@wBg$*bfr$A>WkBTXymyuEguTX2hyw;9~^Q#G>z7 z(z0&3$i-s9?tSo6!e<8#{_FTtaM-@ci6{1HvBDIsu{|MV(eD01lITfD$wdjpNr=el zGp{{w=Uawt0UP(=3-ah3DSKvFJhL`D!a3}60>|BOrd9v*YmA)qXC|_N{RD;iWCSIzBuGh9+yHF&&3dE!g z$(&GV*mKHMMY7sfc}jj!(Kn&!*{C^lZs-!wF?>pFH0e`xLxi+?1qM!tVJ9vfJ*|}DZ0PrHjIKx741)C`T`b~EMrC9NrF$^N5Acv7LiZ@iZS6=&n^FWOX$4x|3nl<0o{(w1yN@w9WS4 z$&jW5o4`H^NadJOvV;!G#*@Okg?)Z;KQr+c|J&JN z1;?2hs(0m+jYWoddKAs0=P$?_`V({6&m>vwXcPLg24^SuEDi3n!#~S%3k8J)%njZN zR!lc~aaQOn5Z`zEL3G);wfV`wXn{>fOr;HZdy@XgvA*o1*R+KUmSGJ39u4QYev(v9 zn+~9`;^jxNGztrJmS(Ap^RZ4sJ{SpESdFnjOMy0z)o!Lkte;*Th^6Hm1mAYhdPo5ESA?bU- zoG-Ex#)CBDu8G@s{*aQDM$aU@hN{|tWX(2n+E=q{O)sL|N(ZUqSF$)NMN%9kZv5y& z$&EP?4be@o6nxPX+UQ3fiyucw6uQZXm`jv6q_x<~f{ldL#MjKEKc_2$;Sci;DYjCoOZ+lL7Rc7B*pSa()2U$?!7a8%!jW^A+ihJj}q6U8Wky2mY z(^7sEC&ib%{mJ~6lL$AT>;}9KEKkZB^enFaooDlnR_!U1KFjhDC9BGqZg^3>wes>^ zQ&fVdV@M+%l)0@saxKV35K{s$xZC3m+%vnoMv->oK9WtKE7|WkGAd;vg^4t6S4%24 zufEIz_Txd1nLWSkg@#^vBAxQlACyEV-Jcf@3-SxXRrOxn9naaT{b83YH;P` zjH>d5A6RCk8pY6?EJKB+q}ey;uB5m!t`0Wp461ysMIDc~$zP!ImN<*5Uns`oWMbxA zq~|=U&K-d}tZX~hpq14n^qC&0nhBCp)Dz+B@iuk!OeJGq5d~s46o7YX;f^zS(M;hl zHiC*5YIZXM>)ZQ>Vrm!hLG8#K)!K$RKSzny;(CaT_Wv-L)}! zvvdDmV~Vzt@7~8${X|-3utX7~06pctECnjj4{KKXT((NZqwaAFkPcbEp1yt?sW+m4 z7%D%$p*c@KD}*drLe+`Kn+%J`A29g-5YUA?Kgdbyp=I=Iz8+s4M8aQ7-_a`AHF!st zObB;)dQY~raLeVhl8q+yEg2NafmbR+tFsb%mwY&hCH5E6M5*{m=|SHj(GqjXvG88v zd=?uDtYajs9VdMfShy{?8srRy_?5Hi<;xvVj>8<%rt|$Pzjgnb6)O&|%iz>CJhJPR zIN&y(fnvoqPUMI7LTgrm7dMaM=r{0pSz5y8=yrzim_wLMRtmnLREVc#N!#+8U8D~< zxCE01)f_(*j!+61ALs`$9!%x+mrFM)Di-GKG1dcF+807*9cJ}r@|R9buz`T4FSt6f%H zaFKpooot!nER~6}U<7JX#jWFOXV<-vT};zBU3mey?Cfme zwT)}~GtW`^q%;Qd_(R$|G8d@x5~BL7!5@*U&s~ri_8Sizkhuh>cUlP$T?AylFi*IK zlfoW)7TM={aNaLb`i3M2L!;Fl!Y8i5|G}q4%NXzV1*ax0?v}iRECtEF+gHW2sc>_ zKWhuyYB)nLh)v04)yP-?<8%P;u_Az4y2<2;pZP_@hQpb*vCGXLX>=|}UBH)OVGAtu zEaHZ{&cIO5sRCbmqKW-0G`5;hhXJ04P&u#HE}QQPMS|%nmibQUD&wBsaX6jA|{S59dHnz(1154tZr^#9gbHs z7aW&D+djZHVKXP&p&mNthXbloWQig;YETBA(Ml^HO5BEpg40~3-hQl}s9tzlsZfD* z*q(4zTbOEfAwx($a0rnziIG} zUUe6U+>^Qbf|jJu<`e22qdbxSwmeqVWyD>2HX)dAoIn;jvIl-lg3c4U?c?C&+j!NK zzrwaHX;iB`tCb@qE&%+X*99NPiJJL*$m>@}A3lkUpz20IOd?6x3deSHR% zm%V24%!v96-ILU}w6VZ;lv5Tcz)QarKp(zlC-gjevm?FtMBoM|=GU|9u5 ztTuokQuW7KHa=X{W4T}Oc7jkWZACJyr5GuB?WG%3GOQT2=P_q=N?cM8BaJA%W+0_OS%TYcd zA^5McRJp)qu{a@%;m%6IquZwir#DaG`|Bf}%)}E(_QUU^^jxy*P6;WVZVjrd;u8us zF7(VNu1S7|M<<@eS*HCUdHekK2;uXCr-(R>IL;ZrszSs?km%T?3vlCI*V@NyB0g(P za|WNP2i1(#G_lkDDOoXJQek0P;(o?n>trcYS-1}2;hRs^PW(HekW3&2=RIfE#q%_2 zY$4(1U>7QAigIdDyv>1DV+`lh6AA%> zgvP3fmwG9u8tba&)J(!1Z=i9zQ{EbDt71|sRI(?0H$8LeG+yb#o9BM^HAnnQY3 zNJ254(hY73sT*Cy$g^iVXqJa=dmeiv4ze^BmDIzBei_{>Z{kx4G7qLb*k`hDwc_Q_-L=Ol=}U25L1w? z`cm3y<+4%SI(<-c&@RTvo$}J~#rx40YH05XYgqitxNt0I{+`A(PxvY3DiDvZ1k8ak+48XE!=>(+q?7I?=b1=Z+C01eTp}vB%_)l{fuG8aD{%Kqr(WVR7j50&wb?`pw4o!Oj)pF3X5?tzy_Nwh(=I#QE(-0L6HTd) ziN(CLAQ>;lH!{c~;QmbSbS|UGa-b{~z~ipo7gBW*QRpg% zNy{r+?v5L&?IkuSG3{kyU=Ux4x1+S~c|MhfQgIpCjbg#B3>7P87t8sLWe2bn6OL3U zkkXGZPy*HRm-eY`Ek2E)`LrPHKA04v+&fdiXcfp^)8qsT*H!g~iOxvwuqxpJvP=WJ zl^$ILcxqxAE9?~H7MUp^C&Jl8k&z@%Gvdn!NZ=<;dCuaQkNKsrAm>!^mw`;V+ z+i&}F^Fcx75%Dw4X7g%96T3XklnR*2-5zn{j>wnhkX>_GkBq*-zHBxun@(kv$dd}D z3S--aMJxzP5o&U+Q(!=<H))a3#ONPOf*%*a%PG}`r%2uB~x5VS`3dtvF z8I{_N>7BH0BwI;@6%u}_N9W`gRIV3PmG6cen&yLrsh|0H9)wT2eL^L!DP-W| zsRP-6;rYI(lCH|DI0kQei99H+92~@^Tml5%%Z9o+W}qUMoxV0ykkt>FG*Q;OXk4 zCMs3eUfA^RtQW=oQ*xKgd9la#20u+o=OyeV7e4mu+QF>&)|@p+pF7?+5o}ZVY6Dsy z&i4ZEdliqB;I+Y!Pgxs)E{PY~ z&ir!KxbF?*vF}SO-X=D7gev&HV>jg^rH2GhFRJrje~eE{6QN^l2+ZDw4$&Ek2jHfC zKAMeR#iu$wGCreIWaJCoN^jjGLCfSjPT5D{wOHuw(!Y0U8+`mU{y2!Bz0h^((M`FL z@B)6A!_e}cRYI+OpQYR`G3dM0>?gv-oW*f9eCMOpfZLDA#W#v@P1ISG`)bq`gS28t zs@)A?3zJzC6B-xir)g3Vl5g6IsM;02$~|m-_@-=!QS6{<=}MyKsvLJz1eX z{^OaWTdcW1h6QP1&^!1nSVp{*A2IE+{*paG5Z6U?O{f_w5ok|#HGCNKxC0U7=P$;k z*$v+6S6UgvU1pSMk||jLKnv<6f8%`a?#8p~?O@1a21D7eO86PWJBWv8J_?l<8i{Q@ z{u+M_ALL@T?Y-j1fN>RKQLbn(43&tCl0dMFzl-UT+&$E|NJdEI-xn6(wZ8HAdA9YV z3g>xg&A2bUnnODM`HM=tNa*?LQMqMFW8f26NlnB=P3e30pB8)OBIS%(Ok`(tY^v#f z;jlomiZ|15remY}Ynf%%mwWFfU)1wF#_dyTNQC|th3SM@s(N{Rf6r>g_EscQ*0{9j z8KYAj{v5=|;|FnEVvpz+iwXi!PikWx9#_v20;M6Vu;{!p5trwd+IQ~5>-y{(*1ixn z70IoAh5I)tQRlLz>N#j%U3)Fs>oh(3)Ho)}{`@WJ@*~Ydf zj%WKLQaf#|vD4q+^xW_Cn_BKFrw0C{uJpSq1zX1QjWQ9?_M~Nsu0?8t>FDTIBPW~( z_NPM0M@}OOPzeW1{;VN~XEPUWdC}2v?LWCPs!8#JJP-P4O?suPdStGa&baP&SLvDK#(7bP8+Ro`@!J=h{e09TLNCsTemam=Lqni`CB2eyKe4`(OuE@ZrCLFu zwkO{dm_WB4mR3PEgW0kiuEvN7++_@YAJgicGCRstp3u1LYU(GdjkiFxUwz20*TG+w z`4XtPas4&d?NG&+#-*C-@yV@-AQ^eyx~2Q}uDpv5%6C~5Z}%s?Z$7no<={BlB?^4C zk7s-0Ni2L|N(6-4cc$;)813XSV1d}?iPapBbED(fj33F(Q*V#GS>~yQ5H_*ZCFPDM zQ^HIzRiw6<-sixz*uG~b9hO1cji?}CInu%3VtSg0uL%?esod<{pfpYWNi?-z%!wQB zeD&v2FS=L%yI}Oo(V$0*4J|E|dtC%s^qPhqb*qtmU`ba1-4(8-c;um5(-Sx2d0Me{ ze%R^Xv|`#D85l)zi=f(7&~p^mJ=N?cY`Wsgzw~CC*3eHnMkkTjn5UHt6`#kla`Htp z)#V!8jlz?(&~-L1?FdkBl1rZ;)=$7?Z*~ab^@r3hH&@D~embDX6`0+^CH)%rwZ1G- z%0fl3Zjh%pR3AwrCY`K))_g4PM!mIV>xhc#FpDy2 z5fL1*{(K`%jpl=^4LPzSqpcoY_W~~`dOSy;1K0Qtgpn%LJotW$ooPza(TcsRkxxi^ z)pPOJs|w&nGVgl2!Omw52zP^i{PxrjDH@6u-xq1ym>l21HT*=%`@gf04kNQFiT?&7;Lnv=M#fDH$3r zllE%32Oio*J#*M1BDwP|G~RhRCQjJudoL}4*Y*699&LSlv9VW`zGzv3z`W=H?FF5h zPkOw{7+HH=jq}Rtu8X&zQ{ywm+AS_f{3Z|a%Y{&a)8AYwb-MMauv#toW<(383$8EB zkLgD-P0a_T!XV~!Dpvi#M;U2rj7HX<$;-T`Fx9&%?=$Aq10Ts0Kf8u@P*V?tpGF%A zQvvo0D$dlCj>8Xik}~KuI=xX$<1j2&kAw#b|N%LVB!&Gs#l#a&BeqE43m!6M`gGotRRN@F0AGL>hvq^LjfyR(4Q;}+@Hiv=ZKq6b zK$ZVCEqAAlfH-{hWpMT#mq$;SLpwHmEG%j`nRQ84vj*j8bO)~>1;0614|<~Nk5dr7 zL&9#RG|^s35XAOD?wXO>Icest1h4G=!D|G;c@p&SM(Vz=6Hiu8`lp>+u68biG`;16 zBU_!6$%vQE)R!D8zUVl1HY+S7?WyWD5_V|o7iLb7GgaFy3>D19y^<$CehkXje)D*Lcw9XIN;@Z{8s%i}HgNlCkt?G(iRQ@rm@JTMSQdVtxc)5=TtK)FZ8K94JO?$ir24KvrtRJRhRqXgHIu*o$E|> zT+!Gi@z;YwekRi11ga891OD^l&;7fB%o!OODo>We;~+J3o{pc?oys#Kt8nK7Wdd8P zHi_|2e-g1#a8JgF8l`oEsnp5XQ-pP;BshvGdjUXAb;F8SyDm|KL2tF0pIw8r!M z6ZXg(9Z5^q?WBS&8M4Q03wf)zWR@Sw9k9NbZ2`%XsU;M5s!m;*UCPvXtq4Klj#cWY z9=2Sasjem`h6cZ z%K-Ek(^Bw%3}`=CN@DHVB5=Mx6ZPSJ$m+fx?k?cakYsN&3on63k0t=ZT5wNCjRHu)ccu=0L}D7R*=T!4fVed;f{id@upk z>)XhZ=C{dbbtDMWQ;-aXeu^wsAdp=dIa2R{tTl`ba5iIC&o)-VJM# zLPKFWUb_0Tljo#Ev*vT1xDY_!3e9xuYnnib^6wy#dDEBB#sQ+!aL3I1^H|F9 z6%)sI%H*G04mpsS<$;ru!oqAflwBqUBlX)Db-&2q?$ny>6{)ur(|AliUG3vp7w}Yj zpMjo6#?h2~(7ku|snoLS?N$ik7F2ZxyO3h&&UV%* z#x;E6s9Q_rW1C=5lr852rA<;74TZ9bT`?D}-nAPf$69R(2Cb=q0TS~*KGDNKb}i+q zx;_~7l$VPD{9HNvnVMOS+`X9D%xaMDL}2!e!gsP_-YtJ}&2r*-dklW>AsK{Km<>6R z4vfXcK3pcU15UuD6CUjjPAp5X(%am;31Ykm+S# z-@c+pNa*BGN8BNN-s-MQ_{&#vU*B6y184GET|>_l-YE_3F(xhh$3@(- zNUigzzMotLqo(^ufQ_!1%akdtBCD_k7I-Tgs zQko@mU%vfq4J~;F#gY)oW3yv*h&gxz25ITovRc_il9o}VR6il>__!%CXWeTFY^mlc(Ni* zfwtr7VJS{apiZoBJZY>*LDlk{=F)ft^(r*uu~e$6nkrklubxMbopvA)9Hp}Po>tFp zRhih+)$oPrhsRl`X`6=cN+m3_^j!NYFxi8j|7dO|LQ{{E`=Q*1`*(?~yWKioq+fIw zDoysk{vvYE|e2$2<94rz}>4?*!araRliN zO}gWTBj=dS^MY3ff{Q)zpDBOG&D0y#C{OyUEW!*#6U2B;}rlK(xo9 z?y>-RQz_SxpOZQ!@brOLCf^v}BCZ_)z8L%cWTer_mi9DUB-j=v6uq(6;-0I!k`|HN z^YmGfC(O*=My`PVOVkmQt_Ib&i6w$XHi72sw@U?QhL0EG$6L}W62^19(&)m+pUA0m zN)WC*mbJ4XyUwGvA%yqlmzhIhGVJpN@dO==D&HsW0~`$u_qyUMIyL}(Ic#m>I*;Aqf;7Gqe+nKH1Sp)F8shdb!743M2l#uyFl?Brx+I$ zLTgJ=q3d@@37h+2f~Rap@L=*aSfn0n*5>oRh3z6LyES%B2svU)Gm%*;GUs4vZ6t%K z{7%uY%TUu^t{#0W%NYF$3vu6#%S?1xdnWlIZsj7wf2ys_B4UCKoQLRdyh;EU`vsmk z>Tx{p**qoho4PiY9jX6KS)Dx?rLq9MLo{JucSVVT(K71B;bE&(;=F?>ySIbax=S2e zDQb;($XmHB0r)~|`L?DGi|%c4YSNTfODfr!g2`VUZOftkbrRd{R z+)zXoJo1f0M!Z$8$4r3DKuml6P$xEk)MI_Pqc-CnK5lxQ@HA>B;=^M$G14?}-(z3J z=jl1Su}*qXA7{-CD!VNCF*>X#){^UpVmHm{&174wi66&9^j+UcLU8X1fLV>aUyw?5 zxE*L_uN5n_UboZL;AP^>qtWyJ-I`(N_)Y7pQs+A%+}fVh!eSh;mcBd%{m7ii{z)E@ ze(7*dl=&%@oTJRiObhvDmetdf+yQgSQ9(O{^yQbU@#*iH594bDN(xcNTrU2`$xn5g zoB=w6ZQ5^TF^%iE=K`St!>MUHRgyg6QBl>(P{u@g4hr%qCB zvCN5)^BCdIzt0EZOC(kO#M`*JRClYdid~t<{vel$=8?zZq+PGu>2_;OwpJi!`RioC zpulTz?}K!Krq-%L3#pFe=PHy;)5V4g0TV){ar_$;ow zGfZSKPmcpo;4W#H;xG@C{oqaV*%$W2k1Yk*AWsL`4VMvBDXCFSTE5lF77CNwvT3r5 zN7vcow{Y!j$L*i!*QkOafsC@CXO6i03C0KpDkycecX}{+na8^JOy$M-i7c3c#!df+ z?n5~DM>_#+VU|YIK8cb&fVOZY-%SKN^z`{@U3Pxt#6E~#Sy5ejM7&pKgL7W!xU1FB%I3g&vfh~Lc~K5(%-l{= zU>9OLL^-`F5521xs+OHiyH0Nl^Q8(}&i}0Ek6^a0%iHNoH?WS|v{R{1S9+>A_sH5U z<_4P=+^7XLDEkV^b@3e@R*snT4{iRe+=l!jRYk%n@`c@kCqjg*0vQf}#DkVTnU{NL z%9XNVOUa3yK^olI&2{|#2!ABIxAjWBPr8x((aOEsHGPu>xdC)jGAL%iq>aB}OPE8* zdqsAJ&=rRczva~+sajSqitM)z53|I3omR}4pY&2|#Wn}drT$!lD;#)ryFU;5O<}kO zF$|cR3a1p^MF$h!cx6|t9t$!veP!^A0!%w&bT6#mvhjF-2Y9qX#P7GhK6%iL=eIM@ zSvx11AgjZ+*aJ${Zy-N-jHx*R_ml}#b(23PMEj14+os_SGJHQ8=gGf5#1N!PSiRuL z?Aq$D7J^_?nJ3u%r4KiecVETLgliT;#7QgHNpSz$!Ym=}xLT}JAT9E`ECxP#?q&}r z51ZxqUZ3p!v1%(wQcNK&ds;!|Sych!bAHxU3DRnjMIM=`Q%ri4-f=L*Ro1R5Td(J9 zl{~JGKFsvR*1lRvrS}P77b)Tq6Z8sc-?HA=oDAas6l2xU@vb24mcOI^`*}maMD|zQgSK1ZB2mD! zU%)oYNpB!W?OxS#tVLI3a4GYYY`?^k*Lse?^6Z-~3;1N>+822jYNCl^`f(%-F^BE> z@izFm{vp~sWitL@IS(LKSzjR3%DX*`jNwOjc_zbF8o{jbv0WqR$;bN~OUpuZcQi#Q zb>|meTV_=Y(+QRW?5_=OuqtT4Il&?fbYeA8E8e70i5}-iH}_Mkl@f;Q zDZ7pu>%H~;X55qYR^}bPKeN4E>g2aq-tB#>cXP^fClj|#cfZ;qwvB?E#L@{|kY272 zNvyMPct`ftjLM$u+=F+&N&RH^wwX)r%K4K;%41^KBtD`O*p+9YcHZBZ!1LH7en4Y^ zzuti)_nvW->hfEMB`u;Py{B_buhsE3OW2ANUiVe05L}bN$fASvf4&Tu049rSJ$^Ja zEh=7xTlgGVT@*>I#zSNri(Dwe zjw+VUCQ9BhBYQZKg2V@->oWA0sW!#g3a8*B5qvzxo z#7x#!!sckQ4NFK}Ku}YC%7Cz?lguRdW5@*-!dl&B)MeJjNOe~S=)zuX=$etIyTa^4 zLg(BX$W!S*p_Yf2Eiy({EYfe8X>@^`9->sTgP@JS+k0D|*YKbMZbKCV#T0RErFZ8y z`Lp;~HKsN1kRMFLcqc}}df__Fmxh93WwmA< zHuY#_Q}RLM`{Hl9fTnT!n3IS7tml{&p(fD|XDj1xjT+#GfsM#3Z&b}W%#CD{UFyx$ zh{}DwO;hd)L1skAMEYrm$zn zHjPQUu_Vc2uKWq%hb&u)a)~9?u!J00Oa?C%a4u#mFP$&(F@)Y4cGEH`x1-gj)b9;L zBBxaLquIxy4J^4zh@eV^^c@C?#m3Ee^IX`ZR`ir)*pzh#^n3Kyo+SUk>m%-*CDsMDmhiTd9bfl@(3M5K z{PLji`n2~9XCl9B0C{zz-1E=Wm6-xFvMDgO1QvSRP+OQFr-nTHq#L91$0ZW(Yflz} z0E_Ch;F0^p1q)o+B8i2OS=A4$^baMT|6`&kg?q$Md%j=jr$)zUD`HMZ|7A)V7VYue z&lOksTz=m;mo@ z$&CCCB8BZ;52+%nmE8kYm3>7k)U^@dh?N~Ty5o*()z2J7xHO^y@_}g;cWv~_ZLZ|oWyUSG|aXhRjxAD;JsOYv`=JzpmCC=KtOysL( zbh-f98R&;V|5saD+~w={>lL~Mz=Exh26*4?&O}wsJ}gyGm-9^H6~t*l9yV5uK(Xwl zes^-ekJpGRR3v0C!PR1Fv8JX2O0FS4Re;Y0`diX&KNle2{{J{S>$oQ0Hj1lANJ+zx zl96eg4ySuxU5*TBEba&%MH@G24{1A}$@%@iK_hI**`?}8gp7Z=# zCbP(L8&t1}JR+dVmhuUkz1h91cD$D3rh9isY@p|<7zYGy^BNw(_mrG`lQf1f_{gx| z@)d9Rq8pGubF`UL3%lwncSdfN60q@qx6@98 zH%Q!GZ)$lC{?^lR>|{x38XFb*p4*_9bEPUM|dWsf5+B0rAzH6R@HVyNlr{5!(kAycZ+LQ z^|w#f{tM@)#D2f~=%COVp7H%=r)c+8=!HfWMZzw+qu*%1_*yac@OzHwoLA1Z_s2z#~d$7Xpmw?EzO++>;UK zF-v@`D2h^4XT|@x!}%4blKkKsqdT+5J=##^y1A!W8b&WnV&*mM^z06-Q<4Srh1FuL z2k2r?2`A$s6fW(w-`y}k^RT~`e~#!xBX=`ojkZ?#EF-B=5^G2 zHmTY#T~uXvBZ=UQte4>Cs8=OASvLpn+DWk|k8Oh5LbXL&y;?mx4L?`P5MaSR5ueBM z-c{y6dLbBb!gXc6^}IGHuHSC7^TlS=wK5^JwT70Lal6E~ zHk&_|n;bl&@L9|yD@HbTYyr|&jMhip`|+ijkx4g089YFy z4hg7SdqJb-{cU;S1NKq*^9F%;U8khjAndg2hxzK_!{FcTruS~foWQ^q>s9T-4I#jn z(sI1@@CQi4jv@)bzas3o_^lHm&&~#^1(*!aSe!X(K`dNNq`KA0v(#LV3RAVfVqiK_ zDOytg@r*Czl?kuMdJsLu*+AAsMbb#-&rz!Er}mTvoXWi=_HwIw9;u#8Aa_#OSFM3k z`30=>R#D&;p}ar2#(No)as)N<6^qU#H+7ZI+jPghMQR(9Wr{RiJhA@t(0^BJ<~!E3 zsPcREcbSR)VoOX+9T_gt_*4@I+$i<)?8&IYLdeVa8w?{+#wE?3+KA;fp1cjVUo|yH z^rRt1i>dc5#HYj^q;EY3ez3cJtH~t)TJ{5FYWBB*>i(fQvgX}r_g6|=T1#)79~P*V z50@}NfgJv{^ZP^IG&F{Jhsf?o-U?yuVb6xhFo>e%i*HX0VLnBu~Kr%j~ zV-$FW4iEJK^B@lep8Y~;B@3po5p1YxdWpdTa(pkv3&SJB|4CdA#gX# zuJfX~F3)WMGOJ$yJH z@b3-|hcP-Ya_MBLiJGnqRkKcFB10o`#7(TJIba{kKj)H)c#^xJM2bL!y5k)3hh?dZr(4w@-xb#I7pZo0EH|0dIU}NODt%7n^r3@N zDlUsK4%`DZ{9+}d)AF{n{h->r;tgu;w{!EXk36>yQTSx??;(v5= zg!EeRr-c}eeP|FWCsF0?d6D~m$Fd7^<)yh_@N4d8rH5z?{j85Is+y5#+BrQ#9~@0J zSKJ&cjPFWSz=XO!l`X9Id1>%+z=wdoI`74SI1Cx^U$MK&+t&S2vHXuxR;ehb6ixYQ zlk$$Vt(;MnFalxX76qn~q7D`q{vlwW{YP#Y!7Lb(bK@QQ?50xos+SZMO@O;e8Bamp zB2YpJHFQHvYKbeD7QEMVyZ$aUN*gpr)%9v4lu|wl+zXDW79Z5dkXeG!1u_a86J9P=GIRgj(RLM zxa>o_F)N@`7BSXVXK@|n?q3mX8jLz_I}${EE$2O!u`!6=svG$NDCsT8n+ zcq+GhmTB-ZU?A(XXjwOV$Puqw)!E_Zf94uZ#npbG>2g?@QRA=S2L4URns6c&LGjj? z)SDc99-O$@;Mc72e6vh7;drb2>f7^erWh`#yja;_nsys@tS?XGbdYr)hIoYz8WCBU z8a!4Ylt*&Nulyi%Mu%?8t)uizl_4^uPeS@6SP$zMu}#{bv2!!>8L*jl7sZP{{grwl zp3@82&)tnv&SkqyELo=5K5R4hM~H8wcx*6#ajFN0Gk$C>(`}*mr*vvB9ZK=HTQMZ{ zOY)V!Vb0n!U*^jW9$KI`ib>y5v>nk#} z^q%{jjOWeKvbZ`1w*!_ScW)b3*0iKc$R_U|Gli?a%X{&IXuOr{?Tdftn;eTSq1e{~zcUUz+!cnG6N0O&!%+wfg}`cU%<#UZY=`(K0J3}nEhr;h znd%QCh70L)1bCGReXuC6t`#Ujtn{TH=p4Yz{+?#UaVpwX93~>^7L-f9$-vxm+}5E= zan}1;cKJ!-JrS>NEF9w4x9y8-(+5MRpxltX2a0JZ5N=Ypwn0cL-c8ZtK$Thp=@55p zRwDQ!sVIG;NN??T`DB^s)2zx?#-||PBVa0)-iCE>6fKIIEYuc3;OW$>@}3EVwVo5L zNhSxBw#)z`@AHUtGZCfzL*3*0^84NGO9W$8@af_hh;SRGtM~iJ?5>SJ?BQ1dc!_*= z&Y~0=o2-M|INFn-#$NKQ#oAQBC=i&?X~QVHe$fq#s!$EB%t!KQ3wEYha~gVt*WsDe`*dTGnWt4F!&mVot?t__!&bkC+17O$ zg6?a=tnt?YaJ8Y15*(?C`&cO8_|642M`%xMGKNreNNpw zWwbt_nuNPVOg8iy5qrIqod)fc!levHuLZrte?NAcXSqIc%zQx>j?VG$Z-O0tfUmrM z5!9Dg;UE;7XF?rqo$cW-=0t_0cF)mRS)A8*W;R~2_^EY&vYMK0ID6!y?$@$?h#m5J zE0e}aC9`hgJ(q#op1d^AXvdp?P0G*Q9xqF(PRUnK!dbn0F@RyT0sA?js}n=;Z7O)Z z;J^EeLd<=x{=7@IvwMgS7V)VnN}A6oY}_+;FN6XQ)P1Xn<*|yFuWIN!tBPd4+(vT5 zu2+5`{})8St$t8S+L9wITC`Gn^qS}=9VSBi^ZpWYIckcJUXWtPX0PDW-+u&lJ?&Sx z0{48?J4NrnQvMVCC89ovfI>@+SV`t% zv*2ZE7%g1F?mdgCPg1dKhqkhzI~_xTTYf@m-JGYDlpxCk0b29tN#4h+j4R)#syd}F zMy-3#$1ojkJ-{ebQ%0J~eSPQ=qo#=zN@;9En=$b`7%3UhYn_0b^nYH`4so;B05=hm~7C?`lw7s%T z))XxkpIsd()q`ho7r^?cgLv2|UNYRbA53gsAqQ`Z{7bYTJSwEg->w}nfqw<;O)!SR zc3mHCs~26T3y4l_5EJ!Ov>Wocc_X94QP(GjzglmBz2&JDII-0UYDU2@mOT7^?fpNCz)OxG!1;sQK7PL`{M_lNNSx&a2j|WSG+h-30s_kbZu1Al&R$ADPg^T#FFCea+8%294eJ)AExp3 z-*IFBGHgNItM9FU3UbHD2BR|A;tij6S2xJFOYMvtrG4q_KU#301R142rxLbVAl%fdaE}sM2WOA$O^QsRnd8K+nP-YKsNSZmA z3fRHHQ2d&hVeTeWR{fvaJn#v_E8hJT+-;G4i!Z%Z8Voxuwdt3*a5izTx9>^RN6rQ? z8@5v?gUodtSk6_Zor}s=8D?8$j@MV`^ZYu8Y)6dE2*Q>lX8o>@`VDR%{kaV4^d{;O zr|w@{R^+2o{%VpX;!GNqVy9NCZiwgAHloT7iVE1*3^t9ry&e&o9br_$vRu7xkD{Sn zhaH!z>QLo&ndtWxQjXCmawU-|Y7#^RJJy}V6n~iU6F>v75=`sM-K*R*qIAD|Ga=Rx zqrE`d+#>uW1Y@oJ5XBtuOU{C>z1bAUsU^qUzgn16PNo{?(GIgVxypM*#Yq*rn=bs9 zg++7Q5YhZGHXF(2tl!omF$Zy00?8tqFyo^@K)p}H)lz^a@LJ2;C)8eh4y{yvrE`(U zE>1)>n3bqgSg>gnWUE2VylRN*>|(Ivqh`Es21TY|INnR!4A zmJ9Y|ZIv;1DNm6#4CLdzzA7mbCVv@kU~9~ic2HQg1B1NbmnsYY%i8ut zvk<0L{qxh359y1-l#FTwg!U%mO&CO2ZMh-<@zc`9^21(c&Il+;x}jBf8QK?yZeZM) zJu@__k47SQg1?5$3YHhG4G-F86@uhS6`6%#HP@VG{%|q0E%!57A z*5Tj5i{2Rda>tWfMle|&cN12Snb|*v;H_sr2I4!Pn(EMlx$*-{-tXJV>PGj-C@xdA zY{g#af_49DZ?&~AdA-S3)4qQhd?LzqFUPR$E^W})(5b%!F-QJQBMi|INH9;0X~*ybbqX#dgSO}BB0Rg8sy6E_nv2ixnVG|=-4D8W=h~=(`itutoxHs>o z$B_*WeNC+qN0XAkl)1Kk>lkx==%{lUO9WTTjAU}MZNq4x@&ev^nIJw2Uak}RF`I4J zdMFR>BU@p#;InemXIt7?f!2)K_V0T-9>FEHL%HEwR3^FHO>+tv6MPTh3I);|=fl!} zaaf}NUq!gw+C zuLzBoR_}nv=W4EABLm~`$Q<&&ijb?JCoxmlA3SwMo6i;TSGeY*66bMjx>!_J^!-*& z^^AKln)GjsZrFc-oDeGyqf7d&v*8lG7`kOO=%qM{1bzhgw1`%1yapNEmSdB>x8DiA zA1|>2#HoENqYmh5)Xz|)A0y)r=#Sp-@F^zRfxt4i+nV=UpssI~$yz?|Dpcbmp|3UQ z^L)3_U%q(%ssm&|=RnlaSoarq)iHIB2*asB{?D*mA;t)1$TKO5N9|6Y-lFYlnnS`g zyx+b0sSSnYnm4o&B##w`T)`BZ#PDZR6~A?cYyO2{o9s+mOz(oexcp4faq=SlV{0Ri z)s`ah5GH|-%8*03{IvD?AgcCq5$G_G>uZ67+c)jn3x6XfJnQppfSsnmXEW;Cgj7sk zhKMzUL!8?A@s7x}iof3dV)17tcg)n}2T!vG89c^lJAdIC&t+0vhL?B_FStn6NY&1u2pJnM@JV;83OFYHm- zU&SKAq(ALFC!%$(3>&)6YomtI$w`4xe|R-uHM#j)IsApGb_-9=g0YcOwQ~pR5I6tB zK8{29j%E$|y|JhF)SM8IU8sG|nTzb>n2AMOx^Ceyci_~)LKSWLI!aQbJg##k{{fu4 zth}kM5&IM7{sWR(18j@4RZY57aI>W<#nR_&XKs3@Nip%peLjnpm-nBL9qA3_nPgGO zOTD}M!vLDZ^t;mj+pLEvZ4Za^K8(kJ!z!~JTvVan8^3t8OW%m9^&GcbGB zIWT>FxGkc=xGU|mik9@KN}mpT>A((OfxR z(N~stF~74P1s%43{cfNfB(V*1eNc1eNxe3kJH-W0@NQk1f9{zk8xWV;5am9&V5sKS z&syYc*5O|E2EmW$(Cv{ScgfIJQE%0rV)1Gtj_s`I-;#4jQR7Ytd-ZB@yqGxS_Ld?8)Z?_hmqw4nJA4;-&m2B0AnSk&&R`SdL{ep zPOe2pJC#Cf*t8?3fjJO#Y9Q5Yka_?gI9qw@rgE1?*^aD}`HRDp_uFO*PP2h*fDqfT z)zGc~{LF2etnLe>_y)}5eRUOAuMe_G)p_bjmtGuR(T5qWX@ogO8}PEG-WQI;T2MpX z7o9)#H1A#jsfH{^GTqu-9l)-O!p@XF@o7d0_jT7UG%2FY&N+gCX{rDeqyTKi-OO^_Q1A28Pf@ z)vC9aqd80-VTCmk< z6vGfbjLDtop(pw?W*Hcn)~Z*lYt+_*nV)W*gM+KBe?4@U`BZ^c-Pc!R+*PSN46SG% z>W)O+YE(253!7iZtKh-`bh;DrmJn|$tY^n(Mdp* zt6kAgAtYe7z{Ar^bq`Q13ZD8oR$n}pYOI10waiTn=cdv-NcUhqn*97?KW7YSyDhZk zY_UqD3_9Fg`eCx?em|heV+LOHD1Tdgb4a10{E&W58=CMuKY(W_e2-T7n$6*vKDtWP zUqNzQ^ngi;#b$bM7A9Qy!A-R);z~EYYa2}6^dtn!h{lrINaa>l4ee|UJjIi$zQ3a; z4?SM4xhlyZhUaW;6T@*qmTMJI*Hf%|w zM86N_rXYrxlnH^h3RkB6BT&YmnNhg5hD91Uak@aD$zHDbA-oIkVl>|$E6KR`C;^2H zLLmanDfx^P)mPhkF@LAZuI|H$UOmkxRw9d8O7OL3wiA?qTG@%JId`OD27I& zdED@Gb`cQhQ#`ove;~+Ws9>>OaZL8>IIiuB{+JA}_#@sUc*0w2eZO*Nm3T2i?tW}0 z_`%R9m63sM?zo+&A}%oroED?(=HGcznyeY#jmcs^vG=dpfq|x4pv%FH7~+=W(|N0l zpUZ5oDEyYUh@BsQ1rGo*dH=18{0_(J2hX=*y!XZ*8ThSeR*j8Itnq&!UVIeg&z)wB zePd?QkzH|_E=;UC=B~`7{q}hOUcj&RB?&z@B`aJ8LZ-Gs%TIJtBz4oY!q`d1-tv1+ z%Gq5=Iq%1qw3HR}5bjnp4=H$|#XS2lIv_WG%TYz| z51(OkN^-f+h+A+J!-6EU!f|y7Fx7PBaSev_7T**e?(=qqo=)=)LSh0NVesiRxjse%N8HhIYjsDXaG?UqF)PA{;F;c>OFYE^R%xj0(O4Q!di z2sMlt{!?eG9g>e+y+rbqmjCIS6W@lJam~73%RPeD$rwUa(D^@%#^7*bc%4fR2I);3 zhW5ttR|Z}}=UkMB82?-_2KJ%+FC0Cf5^26YDRw0s=n@KVK)0z5*%oX2Rx5OQ+59(` zA|u&Jx=aY7Q>8l|X^Ey0+?-C4E~n)DZWO*y!$EsMt zYOlAT;TlWJ2=f2f9`SN$r6HHT#`ZzfTQ`^wBe&_TKX5M!{bkJ_shH)!8av}Ri$r06 zxYqNB6MSnM?BaWACz1u2-#X#(z~17&nA<8QgRXr7z|9-e>NtC_yeAXQ9+_Z=L&wwg zds{QyaI3T4s8`z;=Ruu}N_3Uc%ZCNtjRq@JwyhAZGRrTcuE^ERjU+<4wc_9Ot&sMS z@jfUbF9dZN{4}wRi9qVb+3+Tc4$f>Er%8<#WF#-!BO^4B%F;RC=)+K^K)nsz9K=^^ zZR7M`Cby%b;9#`ixcC5O?Du>OR%19-c$-OS*1m&^-JlTc6rY{84$GP_)WH`e{A@yRq--%rFXK{&dmIrWTpDXVcE8uPX+h1i09>1eGi0cO#Nn>#o75n9U0% z8-LepcUOO7CJ#lvNGUM6&EH1<{|2^h-j-I?zN-<(=22k(POW@K?E#L57!xC_wJ0PK zG>(vw)?i&@eufd~$2jG{y6IB zDnKVwQ-@X1Aos`9fnl#`z7fZAO@y&m(wfl-iKKSET@J2f++@B9*P)8ppwV@IEP6@z z)}3-m<$GbJ)xp4Gv`M+bPfFtNP7T+s@|US5;lEf`KtvXx+kKs@6#$rHP5CjkJ@?hV z;4lc)i(^)=T(Ak7B_{Unrsmwv-+&1OM7tx?U7tWd0bD(>W05gW>8ab0xpTESSysr0 zH!~-}N=IK2{s3A{j#Hd=>C-_~ZEX)slj>@E6POv~$t=A5qHJflTY1Hli9|~I*CYW( z5cewa0ok~g%}|~rC8PNizuljpZrQLvjp|zVUIg)h2_L#heQ1e-%OjF3#g}Zk z)BPkeI9wl{)T02Uji7_R$*Tnd9|i|k`BK~cR6*7rxbV@j>u`y7Ibh>UL_vnA7!BHa zp>lXZQZjb!&*Uo28#iD9%F6x*8Q1osOO8ncjSER_ z=w);4h|j-Se#=JudRXg2YIV$MlELx5qVF&4Lyuf#wUfJ% zO05A`f3=61Qr~@4&`bg&*$yt`Q12X3O~eW-nECbkYDH&wMPwUsDoXJqVZoeNi(R+{L*bV8bk#KhLQRLcR?~LOx<{V zQU&cbbo=TBPRCu5ge-W#n$mf3dg~v3^pilo|C_D$p3ta~ffAqTh9iMz`v$ouZv4~r zLGO+8?Ovox$~EETV!exgo7(DxI$9lg<3^s^PVt+MrzvmUdS5LiO!*>-5efpo?I!-B zpZrx#iXDExsOFrjMeUAUpo$uN%RByReRdvPT}ht_VZm(o?d<`bLuKis)D zF*)$`qzeIpwreijZ~o3gLn{#|H+M3%zb$2&qc$=^L z>g8_F&oFsZo}aOFLGHeEE`Mpje{b74FZJ`9MjL6YyUUD1kJ|M}9_=Hh$Cm@Ddg~`F zsxzM-mC?lqcix)kW|+*OjNiuI)cPR7P>1<_g7{ndutASwtl+5te5*@H{_Az$s})Tn^{|Ezo-IK!b`aXU3;6d2Mg>n9l{WkDkE+a z&A;I>e)~1K?8_U-K*@2)G1{#UFfCxm z6!vQfyUSX(%b)3k`G+{`*rg8kOAJc;KAga$m2u#l4%;{XeD&q42@FXGJxLoqbnire zI$2ahb6y7&SgckZjntqyb>+iOv{B3owmz|AMh+JD7s>7FY_`2VC(ZB&FLj&5ZHQz0 zIi^O}W==lQem047SYhQ5DNN;Tbs&wVcMfb+>+(UIOGYV-bDs6u)x>8J5Qbns-cjcG z6PemKeL2Pb&${7d7XL9|Yt&X>M&JuOMEL_#gQOb|^!sKs-*$*=QPCD=j_aAw3*r>p z;t|f++~ko=osVs5h?{+Y!=fn_sj7NmMbOlhh-8u4&ogV54;M#)ob6s$-vl01v^`)C z!L-F{q_jy<^_q{rNUpcf1F>czr$Zr!eBtKMUDf2I$Wm0JB6Vsc2Tt`sKrHRV2B zU430j+l3=%PS4}56^17+oAT{WD=VCh!iMl%4{>{M9J6DQG0`BJW(9BNe<0ZcfQzB8 z$yM{Se?C;#bk16{fP{!{cDnD3XmwC6NH(3L?mvR0xdJm;b3f{+btNyi(>m%U=X_+O z(LBjs@u@v)BwV|JL7v`Fu#wWm`=qXTHD1eyZ_~Wrh<5Kn*f&D;5&-Lxrd(rG)#hWe zD=Tqw#Fu@LyBBFTS$WgsW>MyP6-QbY>OIYg#Z?-b=|dZ5hGiaej&B%3Ik)>$IN&wb zZRK%XpR65$K6R;wUoHH59pu(8<~iUAC9i384j%UxsYfuj1YW~vQpklDpMtFTiBw&^ zm0vRtu<08AhM}q3zq()F1o?<>Uoi7H`nPQ(f9* zPxHG}lvjDkLg-wzoR}vt2tz0ov44Tc8@Eb{u5NQ5L<&HkWWE2f*5xIlOQaY+&;HYl z^P&dn0JVbVQbgVrBK*~@j)*1w`f{|q?7UP~Wg&s_y^WcFnU%hof!sVtd923^?B5u9>G z;gNSfO7g!&4}Wb9&K?Y<^f1SZF`EwX;|5(GT*9Zerfnki9%A|%^vY%H_=_dt@R+*L z0$r(My+@ZOz}DcYx~jb@@xw=BBVKy+uY9AVqRuP!Z6i$3Mu4K7*C0pstY$tRy@UZe>_;jEv zGV0CSul(;!qI&BtA`Eia4dSpMsKkE0?kGR6HG9mB!}?8TtFxMosPS+!Qot`5n89n; zYSpXh^I}1H#PBCysqnbRG1KN?X-W>AaZDS1f@;Uyj+i+7JD^+K-t4`43{`flPH#O* z1W)CKAFux|z9{jOWq4tuD4GF*fn-?5lhG3jR=qc-0!|goI_P{NL|wJBM(AgHzo>ap zx9;F^QNh67X9aQubFt5*^=VkWD{bUGfr;JB`hhZNz?iQ71Jb%b%|nj9a*}48i%LlwV^KV zwPbA`0&vIlguI=d5GDD7;X2Rmu#AGwAJlD3fzzUlOiZr96rPH^>E#gH^n>;RH3v?6R!T% zr=RqU&t`z1(Kw|$Qp_DP9a-Vv`HN>9BMNfx#D_oQY5pxefB_JUQH+$3zO8I&?yobB zam>=2P_i0U_$>UDcEmsKkzZ=ikHsQr9Qfp-((mglGeos_E*|w_wtW}Y1-HsOCyuHc zA9{CT=6#UDc+^l5#EObd&!270R>=Pg`^a}LcD64HTW?EehPj~yr}%`LPbp_z{Wq-P zw4KSd+7V^$kw+0I1cyZ{r1KRw)a=W1CkA+i6ewS1z6!mn{Z8{se{HBbmpA*X?v!>Z zl0gB-fV@1Nr@hW{k&$P`b*fug&!NZF9RMtaq=Kicj&d=f0lM;I`;S}{kk7zchT4&I z!T*^!N}Df{sU!A&-pcLzTfd;Ncr~-cOaxHjL}vP%^PwmzXTn8kRcv>2?s$Yj!0;YC zV%|jzo|EWL37w2U^8kt$UV+kIc1~uoe5I<`n?GOStMoEQUpGYh+TH<$QAtvS?HBeG zjM!Q9$7>9Hl&imN1XA+jepMLNsV~&5+f=^5=Fye1YDsF)=XNSY#;;mk-P_K6X)_(p z2~5E?de2BFoWffmP0r%q+V?N#;5Eb?cs30*Gm>Alx2{k%n0>xcvo3v#ps0OoT&dSH zC%vHOd0dkfbs*9V+(3FwHCIDj{Cy2J-D8250#7n;&cDl|?`XFN0=@;s4qpOpLb;q#{_3drMDhO;wZhxfsQ>n?_A3zNU7wA745ZOJ#v} zVORa!@RITd>}NE%cH^Shz2EZcCtu7Ny!g}bTRrDa+R{)-(vyp)Li$|+qeVmN)Sj=X zST8ogLn>bFTJGLbS?7PJI6kpVWS`#ilW1ifu|q&UX2p?Qo2h7uOUb6EPP640+zUt7 z_BR2?JEc$;9S@D~EhK@f?`7?&T_FaHUo22_neF~L<=s{2?xnO@waE$_iIpeIAo@ey z+=e83U*7BYp<+r$!j-XAE}H~6Y1zZT~}HiA+D^z16-^VdRlKtS>VrE zF=?w+C=mi;hkl%ZYNi8Tt3>~JM7+=-aEv3E~xl*H#^0Dpk z)}D4=&?=@*b0AkFh7-Mm&hvW+4Ep1Hl)b2|8K4{&6EQ*WqH7nYvr)ahF~0%K<9$;D zwGykr)laBV4lgA}!X;VT3DxoyD_e%C)dODhI+;x^SUW8nIB9NJehR_TBY=^LX3ZFW63JamW^uCcBp?5c>Uj2!kw=jAY`3}{lDp1 z7wFOorPN9+=mgpsl0llgv<|Z~-_I>)zb$-(=H6#-Eg?(ycGo+%mo~^RpB`54AL_*? z72XPQsNUL=*0)Nv1l5On)=_ZM&~k11awy=x-02ZS{%nLk9@7+v&_zQh0;1f(u#~v= zi&g()>a|TBad-rmt4LAT5aL`;-p|2G9$R0jn8kta#=L$=;SP2Tb^yEv(Yp!MF_^81 zh?8|`B33W;1MSU!zan1o)5gMy`Y{&h7bS_H^TYA>jb_dZ=+iN60XR>ls*vh;6i~`C zuc*g(^iwYs-E1;I7lN5l$pqvH*+aFh`*816B`Ki+=Y>pjf5()k=(?ysp`%$HysN7? zaH}=0aZC(Zvb+XeH+~;Op-bIERE$CfLkZGPLrG-pNty-ruD+!Ef~`(@Jv>-O_}}lr(J!A zA)rrHFIju!!b?Tb>rO#B3vn-RXffMTE(B!R7xBHx!$=Y!tDmg?3TFa3JHRo+05HTU zS2O^)GcKGZATkIGP=^$qd9enbmM$>m`H6Php9o zdKmSMw)&bT35TUkK4ZpQ0N-%&9epSG{pR%X$6p~5t3F#m-*A;Oldodu-|TPyav_GF z&JACkM7@#z4=6X5{?&DRxpvo(5U5dkibWoG0%g+M=Z0p1=K$Eq#x4ZSi0}Q}k}0j6 zrb1%ahr{Rs)UNQ@jD6Yg*3tH^Mnm9U4OJZKZ$Hx9M19kB`_N<9$nN0&%fN_0jGqVS zIO*WozNnYT67~GtKm~siNMNc4mFO#r0={9+-S}JYSfy+g{k+}@(ioOOpkvNBm0MXA zv@hFLmO4VVV)0)E89kM#)RG{M=s8m`vrFL7yRykf>XVy7dycHi#ualrnq}oHk2oxA z`JqXP_G={^tM4fTJVazC6!VHkKg{1PhXSre_Ua>y^m`hrKF52~?`S~xk9`KgrKg34XN5tylD5 zbU7Mu*7UEa7Tmeu8Jx+$zW#U_~3$tF#*&6|PuOurxXOk-(wP%f3Ir#KCE91w; zg=*m3gI2~o(reSVRNdN6BQRZl#~Xtg6+vGi1UG#|;O55%=6POSc(<&1R zEA|Hnf@-vv1t<>tU?#OyflK(P%b2yTq>YF_Z`ve2~M8hfyxUg64UYyirC3^s{I!O z@4K2=z5<%akafchKNII2iHDpznd(g7QM7BK~Ah<=F0FkP@i$$BiQ>Pi(YvK(@Ai!X6L!iSnDOyvlu+k?maq=j z21@X4kvDYE1^5zI+Dn)E+RVRuW_Dmw_EU7?DN@SpOQsmTN%?Ht7|Ex zZ~QqA^HKengzjwm?sI+Sdd=WHM>`l`#)B)4T4b42H;JiF3^0-7kee!|Pr9zx`qC`- zWA-)tI^_7-uT|sO|DKIzsWzDKXk}308t(F38}@TY zs4&zZ*A#?PdwAr)Qo8XvZ;~JW44hV2h6ucn`*z-4HDh8eldR?{tdHKQbyHXt`%DG5 zs}`h#+PPR>q>n)xW#?a>ptP`|nN-KO?oo zZ&F~lO4jk+r+7m^h{!t_bL@{;j*IEkK~LaRznINZKDVzH-XzsG(OY}T*N@@{}0htms-VHPS<^o`0VGhq<)pN4WqqzjZI#tmf-oA2Scdn3Y0YBx=l1}j?(c> zB2wsE$LrNHpk>lg^AV6OIrSB3Bmw$LrV-ripOK#9Gk|rQhZYPh-G*7y3YvcI3(}u* zLE`Zg^1+XW-;s=9ZvqxXubXxE{>06XrjscJ3C1==fb)-53*DfTqn!r1 z?EODpN9x*_b5auDwd5BeywL_Js~Nt26`wAiLkDB)t=#~oSz2{LW<&wG^pSHkrD9vR z_i>p-eWhCsJ%eu9q&YpK(r|DwM$cq|we03jsTU&{QQU*sB=zZl|75bzrZ4~=y-60$I>K%1+}E^{zRz?P zzXZlPR`ga}0m6i}2_Mf&fMRZB;kBm3${FAHQ@($%Jc*awrOWD%de3U-7lou1Y~%P| zJ@}64iNz-7?@4x`doiMqoDshCRl-QFt6HX_$uC5^2&H za`jvgA>0xGQRUSAD-zq}^oo7_PWViR_mBx7=B-(0UYD8eE8e4N8!QIg;2@7;! zVEW{XGxMBQB59TRXlYpeC``c4ix{2M1U)3**}}Lluec+zfzJjpzaK!EEdXhr^M4eb zg{?vMJ+H?gQ0|Q8E z>1d(QPd;E*_95(}UpAp-ts*42AW)8A2T38=QJ zg`6a}9r{6@5W}nD!O>dLN+FB}882%oQBsoZukd#1w9^Phwf|ly zOKy^&+kXH_A7U^j#PDweolldjF&8>I3TxaijOJ@kp{d_AIU6k@^y`DU~Si3ZM0*CUH-=1BG1HRU4 z;Am0z-8}I;4(iz16BupZi{%86dQJi=OO!C@r3K*dbpYTn;86#tZNe-*vY*-9tlPBT zT##N(=uwM8LgJw(S)e{M0mEv%UqoJdgJLYJ0s|Fm=0hLy#L4DZvUt}JW-Q> zkb{td|mE~bGVEO;KE zqAiA~AB@^`EGB?Rl$U?v5nW?>_=UL($}5|g#Q)^K$8gb6NhM6i6(jB7lJxuI1j=GP z@_Dh24DU0s%=%+DxC_+nB$GXetOz9YUXB{rWao52wQSWi7D$k?7OJTN>%c!dssNEd zE(bw)%ydK%!ca5>z-IJ2Sca={ui+jyH>{6qE5qS&1Nyzx06Yohn91?ttDo=ON?oEd z2V_$r{X1I7dIyfu4thzG(&cKBc$<%-bWaB`f#tN2fHqkBCXOp6L+}s3<8v^tmCWPZ zq@#}KRb*T)X^;QAeSS9&WZa3QKNRwPT*3PQQJ)^Rf$J510I|vUGp_8lMNx)C(0DI^{&=2Tlb5dBqYn|s~q1rhD4 zA$5x5O}WjS!jw?n!leTTD!~BRO>fO#_#<54I^Qa1?bCZ3ha+4vO7#(f!`2~3DS-I4 zh*fGZ_yY=m9)C7~F3ldwrs^LF7{gz2_hMIYk5!g=b!1{m!^3>R4ZA@Q3V`Wwp zk+vf};78IorM;j198%iDZ0xvJ&)}Ew*3HHFn^lZMQLXx{6STh7wOa$k7x9+4riREy z)ZlyBkgSoP;Y#)F$KxxYD<3ytBn1mT7+f{<&J-NaA#j;pf&Qf}i)HAH^#Su^RFTY~ zpLHM-n0Kv1MY`drZgPfo=&$>k3J{x}73?RCxMu$TkyJvB2(*w*1lihWi-q`sLlX~% z%V3Zr?=<~0mCr9)t+JSp`wG$VPA0=xFTsyu#EBQcO5{FOKiRk5$MksL6C9!e*tX#V zsYyiu$w0HH;(csa^55b;mh6Y{s1Jww>IW=KR(x05YBY!F_PhCt>|_e~@aJa9sDPb< zyTVXw;LKaG(!JA%I25f->d4`XKScYK#5U|228Zn5XJIzLN37C^z;?aBJ2GX3r0WFO zUf`*?hMTEWQ6)v_CZdK340$8OKM4$R#QM)m{*r88uHxuO$Z+1b13mw>e>;ZxEN5F&(WaH!b zLL-ypZmG+?WyEaguX@PQAY}$Gg2JMext^jMF9-Db*iYn(NIoaz3>~iv6&7CJJvU7p z-djL4Iw!zYgv5Nn%{h)6ecA0HEylM}hzlsrZ4hg*A{~J)PIpxeP+kB6`uyR6Hva3z zj1<5)V@w&sG=^*uJ z-;<#Azser$`BfJo>xiJE(SMfdAm>i({L*O2g_pg5@+6^8B>2Ct0_1~5AeOcwXyR32 z4(dn<2I;3x@5x!!+p1P^ajwez9W}v=g4#`*c3c=63wf>JcA1dZ9?GB`Gda4)uIaR5 zz}m%>k=3?u>3TGveHCzTH&zi38;r08J5QN%CbJ_1-l=zqoGMH5xp(ryGs=+OP1n^e z`&5XGBisn?Md06r+w%mbXq2Z(5ZfMPVv55HtVGOCLWRmsHZT-*arO(Ld%1XpCgl>n z+K5FRDK`Upy(ylYk;d1gjn3$OYQj-!gmYr&lUQ7%pDA1Fq!z*3B=vF(Cf!+U46Cq{ z7;RNzLHd;M``BI~{Mun??Oi!7;^oD@19A3>eWI@^TJ9_7VyfqWz;Eylg30uE$^@7!SgRMc^-atnF?@q@r>#CP zCl@xqF*lK?2JGLpz|HnwF4kTwRwFkawvKd1Qgi?tl2@)lyGijhGae4-eQYw)A5L=f zTMG84n=cbvjP|Yhl^}2bu4m*0Z7`0o$)SMM4UnicL$Rk@6@i?il3ibcLHbt@qTxVi zI8w%W|H`HHUHY7&(J(1l0Dm@rx?YgNN2QrK1}B5CMl*$UbnXnV>n4H`@T7#Q8< zS?@vKqb_$Lx1y(l4AOQ4dvR5_x}+>-K!s?>_48#6U#sGY>>{#J!2M1eOC0+jDJ>~e zEUOQ=7&zwC3o|ke&Rx*G4H@>8rpN&8ZthO!fx$L8>cI~yg0&vw@nyzk3b3@8EPv&l z$gnLckuNpV$HrFi6}o*@e}^QM1~m8!LB=}*Z_Ze6k64Eb6F%p-4fC(*_}$tVT-q3R zH}|{($30um<691UK&@6)i`5RyhHEiMjYgGeXc&Jj)`7R0Lo0X!Y!ETlFBZI7;zgu8 z&Pjx41TmTDQKC=u?V{7|wN>hWXj$vEB+|2A{T6jBvco6g{7-}IW1E{tDD+Jz)Wa6~ z=(et*%3H`MT-(E8dIdDyA1*1V8qS`vmzHpU zvo|Xd-i~4B&mpZnY5cY|C!T-PGdk=COP31OMK0`^a(|{_@-#N6a839+I?L(hH%Ttc zPGVf#UiJ8(;q8c)E}yD@Fn8j9t+?4IHBV^W*lvsv=)V21AH`h{~R-@ zFkPvtVBefSGlX20feTBDyKM)t9Y9W`3*Y-LC5u-gj5Uf|`=3n*9Dq%+!?#k+OJa;W z<=}b70bcJLIB_mT$uGW!{nbHhCPRJ{(*oP@E>SL7+D+_c0zFrW9b<6tLS>_%(mrEz zJ>@)O^T`U7n8G1=kr^?o#TN2SHl`t9r>rlrh2H!tlczj%FLM*Bs6U8xY;Cg)tuLA; z8OD0w$2D_^itaK>{tEs zP|p_Td!@Kn-$E)3{0wogFz5AY7Amfp)Izy3seWu}?3_&vX(*`|i%dCM8YQn<+vKfY zQivvN{f*4A$rM_q1!)AvQ-~g9)=nNja!&qv{;*9$dtrMoRYC-@$PYQ#%;z@#pkKu7 z3nEK9Ox`rq2=qvYDf&{g`sYn1aYx-oK1N)weG)}hAsL$5sMNHINSHC~1%>G;N%rI2 zMQUKLoN(OrCB>uP2)a)pi@7200!z66d~9BJQ%n+5rMM4vGIxYs5TA%jXVS-vT=)7u zcsW?2y_tXlzh;GJv`mAjnrmYA8L9y^o1``OM`8j3xdPuieZRj4MOJ$~+SLyZ_Pl$Z zjH!JdG)Gzp+`{jF()g4PSs5@2dzU7)G+nQ<-b!vH@fN5C_eP`o4O`oq^)@`}V444U zs=nlZ*a3O^7k~Iq^hTbf14Yjxq0P3XZyId1LJ0daDN)ERj{tlq0Bw(l%!$BfvNwE8 zh~W!ZfzDTI@EAs;lq-~~C%B%U&sV40Cj9M=H#4g9_1gp5G%PYF9mJqUipq{aatR?0MowUll|2eoQgM3o=VdVAE69XZHhGy(tS)6x}1PYA8ch z#|>f`NOurn3_h&34)jk}q1J*~MZQp5ClB`fsQwM-z9-`nk-Z|T&?;9N#U=ay?5WWR z)fB<)x`)U%E=;Igla+f`hth}^+aUH)C67*a*|tM=I0;92f01geTixWko=-C4_kBn0 zlPJz)%I24^f68gJ$V%e{9Wkb@h@j7upJ+BekTcl=znbP6*i568x$C|7h z3*oRy)p`JN^*0vbj8gr$PmGixUeI(N7_lW7yRZ4QjDeF>q^~)W=kM9u+p`hN-4_QH z-cwN+TG-flPBeVg4B2*r0$j`y|;f3nOwrZUzC82*Mc zm^fKZ9${i)-jJH32~UpGzYQH{$p8nH!Q(!^2sc z0R5>h?sHm7w9wrS22a8`eY6f_vBPsQcSg1)BZK0@yUUvpm?`e-=mA9+&iLa>*lV&Q zT*H=jY@`~#ukPWjFkq%hoc#UrS0UID@1Nk$N;}SqeA< z@#4@zBxg{F=ZW5uC+(qjyS=lG{os|}W*Es-~ybM=#Ug<$Awyg4C5u|N;t!f)U;^D*&k7{bO znv($S{4_#fC-+W!1uJJ4j#2(ZGr7G@dc`5F!pMU+IzHu*X8)r%>-mu^$*;K&xQ(pS ztHG&Vfqr9Om@nyjvDuA|Nps+XRzq~?Pq8K3Vr^x##X)WCJwv?U?4~xoMu|jNbGhy2 zNk#Chq1f?nuB$j;o)$YE_ZHd;^UNu*Gs?;-R@s3(>6}pr_ESKIT3wpR+Ts zlXh0(!xmY5CPBoDgUs!6bwN|hF1k%;dU~hVn^}3JD!fyEse|GBCKc^I7HZ&mak!lS zAU3Y=94Hdzn(-1Z7-}<5*PxgxX8BN=*+Gvu)nk-hTmlv>Kw2NI`F-l?e(g0dkoG6UUSt)miDo_D?Hd?fVg;D-a6&Do-fZAm!8Ke^WMynArLeT(vj%gAe6WdScCx`A8-pqaZ0~hp?14P*U?=$ zKtZn~O$eOurDPg5oYzzAJWUak568a+_#$=vsJzykn1*iZJOLPdvGF5 z1X=VzhrV3Fu?x9(In0=d_Ms+B*$!m8G@W$+9Xh$ar7i;}iF28yi?Ggp!n5kHwzb{# zXBAF6Lqm1!Io_9#c7?RfdWlQ^?EP+kKhrKwjzD|?n=0mm`=L?$egV!)*SFsqAxmv9 zfB{X&z=EdZJm848=0{!wGwqB&S3q`(0-4$NOEoGst;w&<2P`%A46gmEnzH1*$aJO; zprCSv(VA$~Ww&EGkU-$oGKG+u<9t;Z0cSlXB7tEA41N*(%v5*~#E> z`$zuPH*X+&E@4WGyYi7y4{D6D0S3t+9V~1qqt(ryAOocgeHoL#{X1sJU-%3oxTf9dGv>bIWhkj-F;JLr#2ZfZkf`|8{n;9I@kQK&$Y<)d2NX%pS z(27(MKIP_nU==Gag6Pk+y>2zT8<%@a_85+jnf4KDz3YC7+jrE=X(*33C`UdOiyne6)Qo zCkj>D2+4UeGN#3QA|pRWWR&k4m^ry#m1%ITK%JD&WrZ|~xGh^3=mn&-A@X?g09S)i z+yO%psu+bjatea>i2^GDoCYyk%0#*tyjZ^v9LxRkH{N7St=2>JvIt+_Gx9a_*6S6sz7e8vK}Vd1&DBviyceJm;{av-X2K|2dd1&ftpXs8i!cRz#l zvK`LtuPC z$h6l;1pf$w*9(@3*o-<+CZttySMw&+dt2%xEcTdvH^rqsg>moDr)!HQyIc*_H(rqR zrWY%u`aKEt1n=p8H0_EtOUybvg)&=lJy?nU&kuYZun5AlF8v{IX2eu|$WvnP)$i@4 z0WC+m=xPicvVm*w!6K{`(W9^{jKka$_4-+aulCFB5vISa<1Eb$O1N0-K*l$8w9 zLI83<40;UwwyN((szCZBwk&@EhXYs3Es3-e>taGO-`B2L-P&r&0q&hVK@^mD-Y`@4 z!PWT}_&u@%WQyaV4#`gzPYL?rF8n!YA29blKU!s=Vqn7j$eGeGfZsM^7(7ZR(+HJv ziTRSHf{q3Rt_xF}Avup0CTzEa-pVe+ zNbe*#sxsak(lP#LcPwZr4Ul){OV&4VGjVQALV3sDc_Hv5`~tdpWfO%W%&u!|XbCWY zXQR{LZpZu@AG46a<7a2OJQjuAwvQX~;Sq&wPJ^u=JPy$)I74V3IzC^`8#XzGn~P;~ z63>e$YI^ol{UCCIC_A38P*?l4M2D@E+8qHOgxHf{^A|ZIZ1v0cJbZ%r!?s46tX`s! z>(Gub`g6S>a#SE4LaR{wY35&TwxyqD8L!`$_-sn|E&WYpwAA8y-RM6f>6m=NPLcPj zxBHk)vl|ds*C%tzAiug2(;lDfie6ck)^PW*ye5}SuFTobbkO_t`0G4VZE71prcW?HrmO7;jKTXxynFtjw&_^p!^%QiMN^nUuwa5) zM*fWb<8*CiR)p8kxtV2WDYvnU(gpOQ3a1L>~qgeCI1z#|0;h=FofO1)Z{z~RWGGA{XuY01X&0DR~ zL4NN~*Z~HC41?P{Z$DcXTO`er6%2dXi-lSc4Zahq_xT*D>sSO7Aig%d0_W|rI2)QW z(~i8`6Z9wwirE$sJ8j+#Wh4CNOMqV;k9ZN3$6dnjMjN3^R90>-`*#XwPT z&p`$F{lvZpycV*U&=4>p<;hV6zy&2kIC}(%pg^wm(DIp}AV7HCq9V z$+3G{;=f0qBI-$>UDIhmW=H*5kjx=3HMNV2wLICL`g$jzb3tVG3tV!fOQjyyh;!d} zxLQi@%P-z7M<#DQStC6ycM7=LZDHSo?(&y8509r7p0M65vzjsQ0gbN-d<|EXk&3@0 zwd3@;5z))J)c~{bDNwdw-}^fib42|DRKP)rtN<8bSt0=WkBW_ zz=3=FaY5jr=s}ET7;1ZD%9*j8frwfmT+9&}=`Hq>2wBWdpT;X>+261E9;gFP*v~`< z^nZ@GX&L@h+|NbTlbq2dY0-HAmSBPOi+^6~(^;E;>xO@*;79XaLi1m!8|>es6bkK+ zY1!HTbE-NQ@5vO|pf5F>7U(nCgu)(dSKg_Uf=$p2|2SQ?^%)NpXq_pvP>e<3xjx&y zU81@<(_Hww zLb{$DJ-FXio&Lgbu;L*iPbP>8PbsK84t=xO#NGWk{p^^rT#_nuThr!8%0vtoG#$4J zS8UN|Pw_^Ql7azZ+7xGI(r(GMD24;}^+64;m8nQ#>}pF@en=<9NQFJ1CY`bk=8~bN zQtT8mSdn*owTZc~rpr>!nRD8`Y)|z_Zfg6rgU)^5BK%^eI;AV&?cZUW4Fz2fb)c)} zZxun0?j=K3u)u7=yRWP39|9o95lc1bckj#sdvKp@XpT{n>g=Yd!qL-44RYo_5BCQ9 zmOV9Tvn`(;L|b}a;+RWTcT(<+zW`bG7rn`BkV{BQ8>#Xff<6GzUCXO{T~%43T^qkM z`wo+uq9OlAvwJMMb*aq-NeeV^+GA3P%g5WT7R8v%O1%?dyB}X%8Gs&Ybj{GPern2h zkZ{s&&-aa>9^9jj5zY$}|LVa^s$;lRnGhx%kBA$rwp`t`10SMqS}yG^_7Fma;QWhpDwSW#|Cs$B#9s}5l7Cc!A|14$Ty3c2h5 zf*do%YKcflYgc3f-6MZCzdiE`!*L{CF1io(82HCNzF^}7C|GCmk2vu2=2AO14eCX>H2 zfb}Z?3e_055f9{yS_7SnZ!Lq+T+&Xfv-T_pyDj5Ds^5i!CN11iaQs1rIg>j<|f z4VlgLhaj)oK!5)ifrdtyiu3KD}*H09=lx0&&N zdS6yGwfSh5TMkJ`A{IvqjKB_!DJQr5+{3ZcL8T|1c+~sx;P`OfyU9il@A(J+7$C>Y zXDWg_W&L$PfY{7+8%Re$C5Ve%@qlDP9o~Dj92nPKbeMrPzXKDhOX&*p0a;Q1GXr=m zs!i>qdb#4{WrM6~GD!yb|KUj0B5oAV#^&5U<23e7pFiP5PKLst%FC_sv^ z_q^zrEFz`{pePnQJx%JxKF4SEJm|r;v(*^n2BjIEv2^r(9(({^=j@&pvM)$~bs4k* z^|axL17pafnlD#ct@+=}-2xI`evUK2H6g!#hVug}js{p#ti;;#+$NB`BNd6R*4Oue zrDru)=f%bkIt&M3f+C&MRo1-*u~=jZQz9zFV8@dQkwFCB^||!VMH#;u5UGkpLoOoO zD^Xi#G0~{gPfR_5^K7wmv4nlGgm%)lHq)q0*-eHTRL zkQ4ZMzolpjnd~7Q6!>Uf_TuCmK)`(1zq_bBwL-J9?H{FSYP9*vI6MIDXizJ&CDL=9j|jOh@IS#EGW0{5qnz8 z0Wv?cj%#@nM-vrI6+n1UPczU&nI{6@n=~-Y7=ufM}fF0!aRhVJO}+e0F5YE_|0Df*hi76x3-VI zNZ28ZU%4uJ!vq^%NVyCx&p+`7OLoc2G#R?I2zY}X^HP};T6k^z@=zk^Y9U!*JJd;7 z-BKQn@LYgurb#e!pO5BT+pe-H_Y_Tk@l2o^I^uOls8+G25CHi`9pei8?srd*x5YXiXCf}l?>P3WtV8!S#9uYO zPKX-W%S-eRzhSJufj5v!wsy{>Ews?lr)SUwd{%??CTkoj^EXhiN`HFGBJKCzEm0<8 zyOgE6WK_#AiVWqrm&M@Ou|Bzid$y|bl+DY_)_}ihp$A)O;=<U3)BU{sX*|Xl z*iyb{jNj0|J)+OMTI2br2#@}4tldWqUh0`#g#4KQtW1!pnMTFK)M*e^mNNSIi$&a% zWk2Z|rt~2z8tI3XOEcqBzAfxFj`xB9II2r243LqdVuZxV?-*Mgd_*1nT>rp79KKq! znzQnd3(`MmG)BkJ_uJKp75np0^Hjf3RJYv6*{^re#Av<43MdIuts^V?au^*5Pd4@Z zTxz@q3ThsEtQd*D0mup~2gkFMcPIO!MH3{A6*DUGC||KY+pkOW_OJOM+)=7Gd@>*n zY;;VkW0T-h( z4SH3zwC-%h{W+3ZeC^Uen5OnvOgJiNruXzU8-Ccj=U$9l{k@2Qch4X--%TKSrSFy> zui!){2Hz~Ly7$yJQ!M|CPQ+#bULxY1yTY$IC&yzaM-2VYb7j^-duW_47n;a-3= zBa0-^2zPbS8>`;#+C88)Y_zWnFR~KRXJ3ViDV9%v1tv{}%h=8XeLMV7{2i__tby_* zVRFb1a-s-9ZLGX<>&Qjh~(G)vrTSJxOoU{&aS*`*Xo&IL*6!hv_b#-V=FQFVwuaB_Lz zil6!Imu<;DX+*wf+nu)g0jx7enyX;<8WI>30Ja#u-=PHKH-J2`_3#JDKjpPZ-cyce z&LJ(wLjtwJm4f86n4I!w6(V&t5~V{<<}LU3s?FJ(wj21TL|^$#Zli$v*mH3-_aVa2 zPCpA#^YyE(`|yZ^G#r88kxWI8PHOJ@fH5s95aC(glX}VYj0ak*iE=#wfqmHa?+&Gn zUf>#j5QOK=&Bbg79m4qnI?=Kdlq4=SX-2;USZcb4r%!(xn_8`l8VqKOd2SXR9hUJe zoWhrb?cJ|7RQ}+Y%N@`8IRf5J_e%CFn5nY-6S>(=Tb@8na0iiwzLNqpNR?&G6(v(B>9XLtwU(iONI`z|2A`m?&DZ6d+tX`A^ zSRVe;%7d|+q(Lm1TkgdCX?Uvhwgl5H!OV4^5{6jVm85Xzrp%M|&zFHfu(U zLc)grP}1^xmkzZhp=v*Sbve@mG6ltkO=#@>F|5q!8hVu9$mxf;;}A~Iy&S}o@NsQe z{9bn%$d)uD1@6sf_4C;nSZIvCBL!dYF`^^j0(Xj(O(UOG(A~fe*~AaM<^Qy?A+mt` z{80-KCOo5Ewc@`K<@27^uX;h#ajl?|N2USFSP~0>eaMgxa|$KCl)Vh zkn+8#Nvz|dpCPdyax(oAg?e8=Ag>Azs0^2|RE`bkOAgm>a_Ol)FCC!H`{$iAH>i+E zF`sQ+pm^tx%<(Ma?+64Yi?cr;;@{-A1Fd$k%ZF-UnK!WcdIcw!k!9i2BKQmtqyU`S z;uQ9`6(`9QNCB845e*O|p+&I!u17NvUR)=usk*L=XH%0!&}qIB3^N>9=tq71v5FJi z+Y{zHEb#LT_k`_~m)0eMhf60vsBY~ub(H-u22dEI_k8KbqTk+oTN!}@N1=*6&Q77m z#R6o>3c}vN9q8}W<*Mi`YctWun*H>yYt8HrY*sK+I*Mr(TjY1t{4PHZl|s3uJcK=; zT39Q7i15Un8n~l%`j?jT*J#DXxmidev!cb_`|$g)_F8M|?vG+zaa<&`xkayIf*2cz z%HO~-0QDs9ibe}AO6E%U#X98<@|{Jn|@HRBAba| zYJT}VNNDhRU%w%F&CF)uWRr7uKkBtWm5oXwD(zcU?1GfW^?M5#{Wv8JQD6_L4Vg$UqFqeQr??|npRCdGzht=Xp@ zVB@lIhNU{Pf7epn-QBmId9-7u_2cg1I`JeR&8~*Zd&#W!q!gq^*zGP?a)7=#EmI;W(L_d(k=Q3c8)Sfly)}s7=ZJ-TmoPVzZP&p6vUeo<)bDo+0 zPnPcON`D7HsvgkYSbX^hJ=zJDKRRvYgp_vTb-Y-Ck|KAj-3dko^XnF0#Hzp3p00Yd z%@id|T?->0^RZy+n0i~^wD7)?=)iNvHEDMLSOnnq1d8MvZP0g|N7Uf~VQhu4UvIuy zO_`u?0GHQ7w(m=4z_mPg@ZbTnR1*cluYUml9a%7&lxX-&( zq(1!h%;Tu#D{Ml)#G|y+=f|4`o@7(6Lr;?P9D> zkkqgc?UxGgdXwz9OEHOE9n0wQiASE!6D>79rYECuoH;jw+z&f}8h{P%>1BIT$1GiJKBe7ObmKeyyINa2+2P?roC zDcxU*#W#NdnSi|a%KbjB^iMiXH#cV;c_tr%Vizbcp(J3t;&qUwOApgi8hXrDO?9$* zafy{1?&>KmYjV@7#Np*@zX)aN8EW+Q^OcP!wY3jNPeD_C#HSf=|7O6Ou17{3fYK%I zw*rOu#&&+&5VIFFVK_~ogXn6e&Ila+sl5y;pLek&~&}bBLg^)mGwvq_n!5t)AZ|P zlIoVu*OpH?<2pstBgXM}bnXIoZ?14lEgpgbD84Oiqge3OQ~0T>;97f>v+Tk26G*8x zAs`-;1|le|*PsLXRQda@dg(1fj8QR{4&fU>hY)`9#D5K! z6NQSjx8|4VGMC3aMjS+=+aL9@-_0fMaEORBdo^I@I&_@J!~HX?f6}0^Ip@@1oyT`o zB@QvwDofz|L;HRcz+Bh!b`1u6$%=s^lUA9Fz3ua~$;M{~D3U6)dv9hZwk0Fr36HD( zfLQG(Fz#ny1v}!*vKcM+Mj9OoTfr4BL1l#?5F5lD!}1iqYaol&nzQf~I1Ov?ua*k3 z294cdJ>Om$=3Pwh?C@i_g_Vr)x^3)fH{qO_lr0IhEoNKfu{$qfsV$B7(o>4}`z)yR z!HU2Sc9_(>c~q~N_H9(80raYihJ+5r)crG6=t861FYd(f$ zS&#*sN|gFRcQb9IDFMg)^|mgc;_0!5nwGlN6E_a0L@ub|U8%B$7^%vzymfe#1%F<_ zB$}ipeId5xP$2*h)6ktUExTSv4i!;ZPpQEPjKF{dv?*sh)GVuc6X$_#6G7+pqKxlH zzSrYUG}PJ`rB)-36-bKZYUhI3d}VPe`Nm(awS+5HBOcXrN=EzyO|A%R>XoeT2VN3GI?OMi{n&inD$)=tPfboG z;X)%TUNy9m>XRetjY_+3_>SS4+HpdOzdSi6v`g|#sckvFiG9sMY3eqTz%wdB61SUY z^x)Yi(vNkjGs~Dnp{w>8y|YiL&AA3h`@;4$Wz?wAaVUHJ3NPv|l!^(uWx6ROaO8uE z)^>66Yo~kW)Ps*G5sS;L`cDeOwKmqOdyF0q9nuXnEr1F+5N9@bAY)o=W0}Ccrv)s( zzFBEV@j2YbqTk=gHoO@TnzIT0yG{|ZrIfjCo@5xgJ3A0FMtMocf%^>p4`wuCXGBc{ zH;z8D6a0l_@>Jui*vx}^7(RtLO_s}MR%@Wfz7*(Yp|n27CHNuqMyPA>vkMUzQ6(O4 z*x&uUr-;=D8^|_FmNNf0H-9%#$b}kHP8^gA$eqRj(gpM|gfm>c4>gD-Mv^Sd-NydNKx)$Bi)j z75dZ{%va3>$;i_J{$%EU>O(j!_Cm{P(s^@B^?y{e#oOye)y;FUJnZqXFrkH+-O{Oq z<=gH!3A7p|EInvmagX!v2{IB|Mdp`L@L1N3!X0vF*ZXqX&!19S9jMK#I9H+3>9tcj z@T(7R;r>;Jb#8AU7dTnkhI+3hjc0}KQ3zd&b+%mfOTnSY>JpM6u5PRZ z7_#Ybkn)u^(k{IA$cUS^Ej7E3-;W2Ox+qBRsT)-8eJ@}TJJS0f!o6w*zfK;IZ?HR% zAVfz$>hlaUUpWb#3#yr}LYx1aMq2qvGZI<@B>L>Fpo>94^O*76dk3-IDK8@SwVGpv zUW-qNM^N$a2S=wp>!j#+z&^|L(+ zI^A@VK3FAXy^|YhqpuiF2b2L@479bp1NwTSu-wCh#T1?qd%qjIVi{9o}5hS z+PecAFaCgu%MRVRaUnSMBcKu_Vo!X?!3F89LgI#t-sNz0B*=)u(~(+q7fw10GDI9 zH@t=unff}Cct0JUprCj*NF=(~&A_tm!dzRRslFOH&C}tBvLJybm|!^1SCZMq@=gMxs!zFx^Qpo$*@=a)X;O zNn6rc%X{c}TPJ%#uNL!IofXT-391I;7CgjdfhN&B1*@#jC9`V63-imIfOFM~b|btq zt))?A3Oq?4nAz^guuJz^akW5l7Zrb!R=LL+F{45Yse?=dOac7q8W8!qazZ_h%oMw5 zB{)NVX#Xt3~tQFb15 zUGUPaFlG}T>ToCC^p+%v=0?xN0^J>X=0p}*l8{Sq3Qv)6R$?#esFx=SE{>GN;aX5$*7PrZ34T%(%;He?_$~4nnEfY!t12h8p!a*Km+0J3*zWk zI_-5od>4}=ex)>pm;)wX8pAxL!=QM-EdKDU$C}NCJZVvFAGQS{|6n{1^!)~8fM9i- z93U9M#w4Du{vts+qh#buT1f`U#wpFrjkv7;UE3{|U@Y`2ii{+I>^23L*-z~;B zV{6?>P|C^+KNKyUrl`QoO1q-3?=glri+L*2Fp`jjQVyn62InC|(sxCyC&+&NbCR`t z{ZG(hXnfa`b3W5$PN?x=W;Cz(54)4#|z~7$Gtm z--qA(4|t$*JfG*e@AEpZi#A8!W!i1Ap7^KK%}4qgAOY;J3P|u0t-kB};!? zb!IjLnTxJ>d777^jV`oY^_9rg!f`w%V+kypl}Q-%@U|T{W-x_!1*i33eRKskKvzG@YyW~n z4I?=sI!EtE;0al&`S|OXdm+1&nWKslW=#y4E7gG|kTD_PYS@6S5zogndAAV+9c@?H3IS2o$j0CIgy(sYc;TWTQf7N~KaKz^K;F1jv8#y0Im(XhEjeNf>`~W+X9DbJh3;uA!#HE#xu9ePzTjNju%%plsDt|EJ|K-| zhO=8t1i=itKA!Qlfg)nB2wD6*L9@bQ=Gyj~{7);_MGFxjbU)`N4Ofrvnh^_HdRmA$ zTyD6U^1mA%G$wQ;QmZVr7#_CrWEWb_o^9w>Ruy^w^2g7250Wgb|54G6zWt~#$AJs? z*=wfUL-lf3&JcLi^ef0!{*YUTg`(Ax(6sCE>#(L!En&Z7)I2s0-TWiHM=@jQQ~~o_ z%oU}}P5p(dU?kcp(kiOsl$t1^EkP&5-Qn!T z|K!&fZY5umTL+2<-glKwc83D44mZ9fM*MbvBd}^X--ew|1DJ{fYuCv|2d{s&&=X!J z=X0yEp6(VpTBCrH`WJ06WaILG=ACEqdT&TEAAhM0tov^Hkg3Y4yeE?0XNRAUO-21m z$)2p=Lgf#Y%QOEwMW@x7mxP=ZFK=BKq$`fPtK~21eqa|%-552hz43RL@-&okzwZl1 z9#hM;K>EY!839YciOoZ`Z3hJmUK^`s3uO<)W!{8Wn(QpH_$ET@9x0ZY;q<=D?gj;b zsTzS8_QfYpPt)WtNl6c%bR6?)ETA~q9A1u7J`aQ^rThS zq;vY|^lc&O**9=uprBiMG#IXIDGW)e#7||GSc2r(UO@TR795kPy><0 zJBxJO%aGt?Wab+w>)23^3Kn)O^h~{b>-pkKf%KGuAS;p_j*}nVXxQ zPav?Qfc z+mepCiK4Ide7_w1m<(8e{CZH$m)WMm4t>&)zDUX$YfCjTi8kc0cz$)zivtfRn%uie z{DIiHI^$`le+pqo$Y6LhUmCR6^bJr!xKczPTpYXtB}djnmrQe`sNIW zBJbR=tWISa$b-A~WTzL)Js5B@i|F&M42JOE6}0=}<;x#lLn_3t>XwmH54fad-1o%T z-Y?9V;U%9dh%jX#K4*HbAOkr{*{~o?OT(@c zTj@%Ibd_j7v{oRiRu08PVX0*9qxqfg-|lhYqwM|N7w;z8mDe}D@J8?hYUhi@vs|h# zq3e}}-XQEe+Vc_3AKpsKjVX&T9>U6c_{~Wmfs}F`_kkSg8c0?7`SlAp*e&t2eO7qZ zyxoE2MD^7*LB@*|g-IhC)DDfztNHF>Mud}WOzhZzx>=(ZEVmSjvz6@@aLm>N*u}D6 zu8=dTYBCwRp>>HBT;hK|I`%!B76SUHV3<|y{TW-j!|Ta0P*QdJ!V}L0!pBVP^HnwP zLkW5k)m8MBD~w{DB)mMdL<`NcU(kN1D@=fiW%jaqyxuW>b>0hwnsACgOkH#MI-W2p z>tbNe?fRd4{#I^dbs^LgiDyVC+|Re{Jstna)8GB>?Y^bM4F zjzHxMwwkX&^-EZ3Cb?&&fAfeq|Aa~Km^8Flw{~%<2Ll#+3$U-4e+2fje@(|}e>}`# ztXV#9ML0GeO#r@efBl85dl9CQ)jLvgX5@JswfnuJxoM4KydNc65<;~FF1qYIO+0&N zWg))GZi>^WUfrX{V`aWyF{mL`?QxE;7$L@kb`u}0kXs0GgO8hTT=@{${!{7;#s<1& z*{l5%PW^EX{jZAme*^BAH>CMBH$0LeG$i>{!#g;G8hQSN)Y<1=q6ua$6usK!eGe0* zI=ICHhzO3TcMmYm5Z2G?6nY)#z_(U=268*KiFYwc(#1({3JRV*5Q%!1%si*vGu0o#e!$WMa+VNp<|ZiAo&DHO_x;G>W*5WFiNI6aGPR8QUW?H>Cf|4=RX@ z74W`i9=aT?6YLFyoG*7*{^)!|#S`vNe_&=l2w|RAZ-VGIrDIfei(t_8&a=!E18|i= z0zV7Uh$}>=fy^Fj|H9w3^!mz_f}iT=tGzIcMeJmwLUB>AOHt@h1a|r~=kIVXHhCNsp)Vc_St& z^Fx~E%;tqahiJZK2?(rh_tmFMulCdzYunz^o|_O|f;}Ob_doxT4awal{C>zB3U*ny zsin`a3yGqASC~EfPQHN|9_@OEfu)??JuHX`8y(}9j3SBU{=;+n%EZzjIr#7?Ec1qv zMDj-Z0?;O92%7LLH)HZ$3cvLOXKNvUsH4wPDBCa-VMF!p1onMXAtCU?#sP@yjC8NG zGZe}rK#PDuc@wbQ7?UGwzZxyfkNi()XT98I)_VYwTb-sFE0uRgF1mK)EiUjWzrUL()_U%5tfa&?rsolA z1u1-!tWPuBxrD2&_47HVCqtqlexu^5E}yRA92nTa$F92h4HL6Iq|kSb0R)an*GJ?T z-mqD}hm}VD-S}^xn)9Q_INaB-Fd_f2fZ8ooz3H*5f$GlTQU0s?IfZtA?{*%G@+^r? zq6(I=aOC3|!63rW*}_~CtK$sQ^O?!2ph@c=oX=t`^UjKYKabmN$NH9om)8}=VS-+0 z?pQ73AdSgCFsl&sdBoso{joW$z^w~A#{!(47w!ztZzFHh^rW?`zFZWey@E&Aw4AP` zUb}dk%WgZu<1`W|umpMDF*xet^v_u4qlvgAZ-o7ZYG!=N!H`smg&v~+q@W0;_D;Lo z_|2VtfrDpT6(1$V!D9LBj)Y7{Y`>R406l{(u&zC&h83^ls+;}U#dmpy zIK`!#`wcp=RiDLupvU}Sk$u=fsNS<*fqB!sUE+bR>nc);3}FR6S*YJ@3Z+ImDm;CT1Is*c4Fi}CcCePA}n-w2tkVIOND(ti;EM~uN@|e9dHT1mm$CCLD({~iTl^TLc zd-WM}S@x(m54`p;C>PHyrd7DFT0(FE;FOb)xeb=(H`nqp&+y4roB$DC>TH3^7xZ_9 z`7$x*+Zy5m?%@iC)yj|*b*66?EsRVXvOk)~S$EYx=8Yh$|0#}_P{8nD%}9{ZFP`Od&l2u9ym(?3nno)Sn_HViTCN?Z~OhOYWA_~`RxlndAr}Mc<^*eOe zXJ%>K$^8xbo^&O~28mDF9UviHvu3{xTT=%_s=>ybD^yof$xULW$E8LqkTBXXgXKFT zB0WqpIyyOupFj7AyCGVero;NW1PH(?7A24Dy6&9p!n>(f8Ovd%(DyAJMSGX7#cDhV}T9lzS$ zzy%gKA<>=MhJOJZm?O@doDaMU%_cb**+$|zB_`%&d1>Rsg2h>LKK+X2<^CnS2;yqT zstVd%YW6>M-1#R&qhDDU#rziUZBN@VHExjY9Mq?*Y%3vrjoI@Tmv?79A!HEixtlEv z{}LDu$T|Pe5jWIo%%kEY9bd1?w>3UBBpzdV8}kTg4~1@t46lplB z4#)~Hf<;TZqZ>2QJb&~YtuaB(%W^lLw%+eKW~O>q17z7gi1jt45YBFw31}p>ldx7P z!t)8aF-I1|`?wn-)S#gfK6i9LS1abTZmVC>JI~09Zui0b z@Ye-a_UE$#4(tt=PacSN!)d>u3kzI;w7cGqSjC*HGeeJ##gSM^!FV+VAX?;)jDpe4 zdAOYhI?nN+by)vhXCJ~k%^F*tRVo`TvgpxiUKgLYoyzznq=Zf9kGHujOSaqjrEI>z zt<;`WDhwq$L&o^UoFOPst=lCGIJ}Inrg6>?6~+U3@KVSZHIYkxd~-YBjBz;R235}? zK@g81yAE?-$o>6ivH1UNXGqk|XUW+3N8j8%^vu;Kb7ZBdzq~r%Tfdn`UOXj8V|(=! zMGMvCRVVhH0qKAoO7BC4P#r4i*zc zb;4nQkdZx(LraKTV4{v5?74Je5gP}K!3@wPoYDNQyTEvDF&rXLwPY!1!mWARgFH}4 zThlUhh+e15EawyL-L!nw&b}G;U-#Z$fuP%2^ZdEQhu9|CKj7_ROM)!l#+Y!RgEbLa z#b&b0l9^fx#SXeAUY5VhQpec;#3ncpNBE=D?`Ffcg-8IQ36Z2 zjpu@o>989AJVSj5kV%qMb4^egm-8a$bHdsHWxOd=U0uNZ4@M|h`6)BGVl4RM+xNpe z_dGP_AHs+qAOi6MgU=U#;SphK&&C`4K70Qr=*L)~htJm0R{N%#tkOUE~fw&C)+;CbZ<7?BX2>NqL+`TY6x1iB6zui5&FZf>7V zs``V85+cI9{qXWrwZjYlcBDGX?Y0X5Qim|*xpml=H|w0%#lbwCeRSAt+7lFxxLuw9uldYh*X@^5}p;|gp~*uT;Vl9UvO z#?z8xbMn#lR!A00xYco$-K3Rp^<+IpRe_ox(HQ+8CWFr1QkM-n6wyoDAVJW;Ic4I4 zl6G=)d?p!-K9IK;L$qV3u-(|^ehvNusqJK^fd2aQM9={;l;14sgd&=>#okiK&~x(i z@CJ2w3>(upWT5v@dy+>Hyolc4THtui4?-gdVh}wirEnOuWngeb(%&+dl||OcY>AbZ zhYLKv;+@ZXw-g6HdJ9=jKX#G60cK6|x%}$Q7IwgouuvJ>;J5L&A-xLsNMFjEMRtK` zh8bx%tEHoQw`MGAE#}iXpx{+!(Ij9!jL?`Uo3Z;0Q;rz|YpM;k%%HGXWwXhb=^_&M zF0~-|MD|I(w+=vh(a~h47OR7C;@NraZq_BQ*!*SDb^EiJ%--*@{4TAgjBUMEQZ&mBy;W>Y?Qo3Y@f6{P@}9oNTwNRv?Y$*; zbf#wq&hG#6U$CZk3qYei{3d7`j2+fwG_aVc(1PccK!T-E3}7mOYgg$7_vw76PiOQt+u-86TQ_r&pEn%^(YWsJZ5TjZ4k`3d6O)N_p4obP??zw49`O9s> z?>Ls#UP&KEpz*OJpv&zj-1Oq<)uRB~hqBsB!rg{?Kz@psoSnT=3b^QD9SG} zXmXe10asLXTd`K~I_#n$0xcR#ik$EC^vNV@$!2s9PkNk~2~l#TLJENh5Y?M8LP?Y- zWY#0+r(AG4Sf1;RhdwmcTE~Hj>9ONKoZ~@8uZCQMx%kLJhj+0uB0VJ(J*^a3jM9iS z+w=sJYC$PPDfHy6;$);(akXHN!mltMZUw%I)Oh+4Kg*5|bS`S2b(`yOSuHz3D3Ku8(4o12`Dx$f42JV(IJIl z4(1gShyD)g*I(di^!3G+|Gtt<%XH8L=iYrK0oG5R#Xq$Ko>&dqHu|Q;WZ&^74#;== z`o61-cuW7I#A0J9405V<62opVQz6IB4)+f{d%tTm>X^kKUXv?K?|<^Xl>2Y#K99D( zSP5^;j7r5NxZgMe*yzeC#@(^7P9OpH8NaDu4Z=pk0xf01Bl( zenZs&7$ha`6M7)sU7U!dKP$+KJP4C;VWD9+xBJ)WWeopNlmOzi9jmFS-Q*{G>$q$Q zn_h3s?jDIT>BI+?y=4_*Ref`FaYBQmGGjv7FF8u*$8dC@7vx3I_g3Jd}5WvQxukC%MbdIr{A3 z-=aG&J=`M1cl_uMV(X)#lXp=&p4#4`OPs2blXojnox=?YnyPo-g;SxTlj2Z$O>|*G zN%mi{pB2{5ig~syDIUF&zv(!k-F@PwwKqMdQZXBDF|i8E_+391i${o9yo~IRt+g8g&3h~OBPgFWI5~2*&Eqey-<6N!F>7V`* zSw9e6=<#IpqM*}kk1j5~80$aDy04`@dC6>RyR2Q^q%+D;Cfc9H=I+_La?9VRIO5^! zNUM{kmj42NfS2}ll@Yb0?t7sie*MZI>J2xBoPUB{%2Y2&OTKY-I1RXkAUAf$JG3w? zP+e>__p{~s-`&_(@e$|*7w|B!da%~lxd>}=)>#h{qqd8X*H86?S*29>Qw)L1-Z9e6w5Qg#N~(BnmiaSFp;E8yOF@IxX{XzCm>2jj@#v#f zBsm^sfzLioKn)uYt3uZ|p9#X5kk*Ni40NDsXOv)baU(P_sn;d5WCiL~i~|1p%DmE{ zx0au`6nke3qqM_qZG<7~w|3c`g(LDS&W_|-=!UR*L%bRQ)2tMpt@rD#pWS62=GM!? z;Z4msw&H#%5WB7)EYP^F$1(@+H61>eY+2t0=HF4(fc>fU8YXZ3KK*8T*(-By37aFUF~3p0;Mm9) zCQ8GCTj3W-C=pZ^JY|>23A}l=KJdQ&eB%>?0wQl)JV)T!TBhox?|m%2CSMk#rLox~ zN}>y16NT}nwGh0@kc&t;tmNZ_;V3~>HXBFvZoVniw<6#F^Xb8+>98V~KQ7EW6V|C> zuE6GJNjuBqN!;v0!|WqzjHE?|EnP#p*AI#a_J(Gi4oTw=?GM#HnYo;U|pvWwNM9 zQeR~iPc-ZHn*?J(y#a8SY#RKD=VBj;_5fpkJ?!33?ECh?jwU588$s9D#oJL^uPKDg z5jKV#r}E0Kp+^*L_1q0~d+b(EGd=*khhlfz#Yg8;2P7Yy?dyECe%$xCNQK$7El6DU zlt&^MpVDZ*WnwXxgJufQ;AP@Dqe5pu1@JwAShUyM%#dI=Q^ILyh`}GxQfJ5l7wKcm zmwio>P~{oc%5bz{p6m+D?Xf2K)JijUpufLMs`rz{l#RJ9;ELe*n5c$(aWB%9y{Q_5 z5%xhd2Orjaq=p{m5wApi5A136OWuV6_1x_rq{u#^<(y@lUle+e4=P15svb=p%kX1+ z5b|>yd{2%gJc7Gs+dTwbq^xiP(jJPI`{1BtCNO&kxY%Gn_R{NT9brv|kC82)BBx3W zZ*7FPlAm{c(m2IURMFSoVtBdAZ`n}V>DX@gy)`@YL55<1H#A^1L05qDZD-h<9WA$o z77doed|p5HzO1|tC^7-X_UEo_&0_hi%-Y$ws)%AjlYQi0j(xSiJ++f2eF00Bic2P% zYY}p+_>Kj6k?h*6kzve7dAbeTJ0GJub_&|luf(_HvLVb^#2aG&JM!7U)!~Igt`@gz z<&G09io6f6n)>Z#X;ti?saf*(`^D;~s5ePP@R5g{P+s=8`u>=aZmb@$VZHHNuhxdk zH9ZgZ)qK0M>~g(1Gli$rn$_j)L%PT4O95jtz4|Y(2P8G*Nj=TJ4< z6r#tjg<=afhRhzZ!gRFxCnmSS8^#Mpvo#huZFr|?sl3eY8g)vm zgO0#RY=qj;l3bYx7~D?X7DJG-sqPDW9#3L<`e#|?>C=E5+ZRa6nk0GJ%=j?#HW2RF zYoO~2#n##Xbyi$rG*>8A&N9!}N=(-<;V7VrdEEDSn14t~Xh6A}V7@lIM3-N+!Gm@Mid;ioml;6x*!Bn(+hNl$*LHWEwms*w;c3%E`_e%PaH&u?}{wrl1%;e+Z+sP zTQnU%!=%@)yWuUOH6Itez8VpOX>t$a5Z(3K+=rxHI=<&x!D-SW;%;jl#M zPU#@YzGKQM6d6I@qw%ckkozQ|BTzY`h0-9E(+R4kL#KmlV_0; z3aiZ~MYK3J~Ad%4{)u3r`*88`gxIK*D5j?;Do z7%3TV@gNuFpi=%9o=S~jw=BWjjXQS@4ig0DcS1c7fx17|iM}qnq;Mqulf7^{11ZpE><)7&aeW+X4~*i8XwN@I>{^NSRYbTFPFS#!ikroMfq zrE(V$I0_msp-vFVhV4O=DoxGpo_^QP`t&KNWK1mjSjZLfGRbKYF59*qiuRj7i};=R zA4Esoz5FwFPDW1V_;<0U$>G=8cf+a@PWQ0%eD|?d1(MrBSWjNr9Xt(9*$~3LY`VP} zOxn|J*F*NU>~ue|TDR>CpAL&qAMG#AA(cK7f$L9BwT54tD%;WzI^_vsIO8b#a|@77CzzC zY?-)^Yd?F69Wc9+3>x#$Ria=sm9{GBAveJa zQi86}d~-P9X^;rS5&XpNjP5r0jfeHWfg-u12^_k0BeP?*OE8-CenC7a)ZkrYCYuyu z41_Of!kH|cCO4f>VK;OzJn$Gj-REa;(04=Gg>`%JDC6ye@=A5vR~zwd5pCGUTh+8i zL)c`qs*QvEBnx(#P)ND+L0iynyVh$+Aok?t!k7Y^Qsx1aG@1)Xr#j;DCIc<`sFJ4>U8cg(B%k{hM8f19&W+IvaG-y`}9d_)OqA z;{Ibc$M|2I%odN>eN~6)faTy=i{C%FB^=k(uAqh>Edrd2I~n&=MNE=lKS34FpS4$& zUbbyP)>%%Oglm7IDm=DQ3pKN>y1xaPM-cpxX~R08M(xIGuQN48Fi^O zS(e21@>!`Sv$u1<2`-BiN1hiNPa5m$unG9D*tgDWSdnJjzISRKE%BA%fW(79b1%O3 z4TZ~b)l&u(5We_I=8F;!kZhuI3~rx@-Q)8P&B>K>W2;F@JYhwSDHJq?j^#(RL}+#m z7D(Gt*PKHO<+>SuR%hohD=;I+(wApF=8wv}4SX7M5A^)-ozCf*ovrY(t{D3Gbo-Gy zKPlD>^15=q$qgVc#GTNB5(>rF6N|WbkLjd5M$0BYfe!U`D@}=a@;f_aqIkPcH6B=v zD!_5rPORjdi4zK3UO3+}XycfU31=m01c8Fow4vMjO%hE*x)p>S6gYLE;fatLiG9-8 z)Bb*Ce_ZDzn+hh1ba;gYcZB%)$9XyoA^Q3jrM=W~o|#<+8eydx;G<|cEGic23Vz|t z`J4{9_n4=o6y;YNI+IG?`zfqpm(;St_t$rukLSYBaN?E0m3VS@fz}ECw64TA1a*`3 z5~4j?&tiHWjCP^*DW5_0+6d2? z@L3_B{ufTw{GeKx1VWo7sR!5BEI<1o5m-cF<`~~z(>|qnX42#&T-eo{JsUh-`E@~5 z9NblvZP#-+!i_V-!MUexSqzshIR6iD)&4KXIGlal?s5LnxE;qo#6$I?EsNg7E&pknftHi%KCj^qy;PdPHpreAr$q z6s}l3Kwp~wts><(uzjyJ&^B99#S&x8dvn(F-{rB?)yXmynn%-JP;-S#LIJ%$+23mmF)S@4)Y+ zPuC|u02yRW=ByRhe)Vm7Z9grKqqC>2dCeW+>_ZU>{z>P84xW~#qxp|OLf+8>1GQa< z1zvEgXQU5`1(oh|{g~7!o8Wr$T(5{Ogya~o-@_8mL^yVYL)2F2G1iGN^^jCM^uR{g z+|I~T>Ju1rB7^R&jv zrPmMrsb)oV^@-I~bO+zU*$sW4Cs%$+D^AC_N{4hiJZu6F!)V)$?~K*IwK{`*yN&;M z;RN+Q=w?KOGULts6W5bmco~j=0L}f%Bej8U_en+G?-xn(SP^r52Svs7unpC{E`70A zE}w&C{_ECF??k={Ki>~z3U#;Y&Ho+z5kje|N%Fzk*k#jVANOfG9(kTRe{nBerdS!w zFN)8KP*T4u!uL&^L%RC{g&5f5T77OZa=8hh^}i|23SLrz3!bcP&n z>N@t39OGB;XvPuF3dZ&$?xIC&ufJ}f3*uf$bY76kbi!=t6h-yB!Z8YQMwZ z>o8G)#RhW0@e#cz^FxNV<%R5Dc)!+ziQk9wJ6o03%bIIKLV38k+HV&bnWea>x~4lO zkg=G5c=lKLF(h{m0nbWesf&uV z(bsOz;-;0$+gRd?>t|1qS`O3gSV3=m8lQxu>4jGso5wL6?1}0&bmn`2$@2Tt!xsHS z^z-^JUbDPKA5Z&C>D|lS2U&{8s+|G=rA*siv?!V0lio#+dUQ0pRX@x=L0t2`93Gil zeMLTq_3)^CRXNmGS+~ZB-1LGc!5db^QAZ71PpE*|-KsIdvNKFm!L;{Di?)8he~~YM zV;oA&e$iThr~NN1lX$I1q!9Rtx{ae3e$0nRq)4aa_ot}0hdKK^Z?3rjE*+XYy{Rr6>gr1B+anZ%?x-PRM~WO7p18fEsZWQp3$KGli4MgF z%Dq`(sm+R3`%E6d6lvVfV>3C(6DUGHX+AW3ha{k;6PqeLZw6>MNXE&3jW?AKaF3p6 zc}1Nnx^*aFYM9A z6a3k6L9xkU+A&i(5at3x0o~)rz^VHPUubjB!bhGMb=Ps%W(8N-jZIFiUW~`%xRXfB zWY9FbVZ1@FsVVbB(z9pBz$nCDV9=V`&5RUT9S*8p&S0P##$D9WLjG36^LjcF|D}`4 z|F~Sa?u;KCtn`pdACt=M0ApHAet){hljdcccfEH`Uf6#>zV-?EPyjse{8n+~O99IY zI>$5c9r?!kFqN@<5>8bg+~Coq*54#6GRU{jfm2<*cL%%3ed8O0Sa-CqUfj{vZjS!2 zpTchJ#`~s1bs50=u|IfDM4sTpg)l9f(4xaL6OONZ4hiBu9hQ{RybkX)cCd&CO)cX2}dS=rle66&dL3xz#h_!Zd^UC5qYEJAd zRmh~^J|H#?AzMS_5?sYl=!sMN{_FY<6bB3%ZCpQg9aaugzDvH=E=fMf0Y#9#J6gO6 zt(5#3BgTqHtc~Xmrj|q%K3nH|dGzgE#PQkkxz1^yB`%CoCo;e70P)e3 zRg*u+y|+_1P0XDG{^aDrLIwxF8oT)~F@=(qzbx8NKp#6}=<{s2_y#^xHtATgq))b< zthc(gQ2*L(Vt+_;oXp;}#mgm2QU*+NLn#~pOPNB4qV0>EMgaa-cH~CbfmUG=6m89_ zOtVy-fc0*c_FU<6n3y@q7P-;$o29^dTBaheXj_ZDval z)M>K7S@V~o*A8I)mZs!2Wf(Y|P^n#2;WUv@o8?K$qJ?g=mZs@@t<$jX*U9ZW?z)S8 z6W>5joSQ6HnxZ>}%x=@4i3Yj9gK}opl-U8vQHnN{dN~1nE@Tc}4fjX~2D&!(v`$~8 z{Gcnhl)kC_#N<|E@J(|&MAoCVqr}zx0<+@ZJ;{xJwv#+w$RX5#hAwIu)|8!6HG@3XkuTRVghXS1wjmh*W$I1!@0uDhBvq5mS`q&7Mskh2g$dIatFn~$b6855|fds*Jmi0O$DE<#Z8gc@bc!@ zg?~D~^Jzv$tk`T~Kz!A!U1?hTRxMelk=1(;ZVNao4CoDNLv@uBU=gLwv_Z zQ*E?k#cM|@TVl}-B~pKfWk$^flg0w6os&2l!jbYWAT*ubi8YE8fEJ#AUguw>burGd z>Tx{>_uhMq#~Z5NY?TBv2Sil;C$%*FCM+@oPCjPt`6r5^G*3PmmJvLlv^7oitS z9T%I2|E}G#)b=N;9gAKsa1_E@D;#wF#TX@0QsJx%=}w?S>n4fGW`6dBn=ff?k(T}fD>&qw_cpLW9po2#GB6d4!ul7Fk5!1$14pE7j*}ku zzP0?fU=(=Ox)nT`b^QFS>Y1NULW}ts4j-S`$}0Khq~XpP0tL;PrHQmbjtL;=DUpq z?f#=?+iY0U5}<9Nc8VU?jHZ{M@&APdttU?BGc$L=6v=i3Nf8^d!=TMrJ0e#=SZA)r zR^#d{L%TuT!_HzsX%qP+@HM4W{k+g-$Gcs4LP^;lcvgqc4(6pokC%uZSwp= zH?k~h)`H&<=@6v>YpjA#H4iLXDhz;&ZS-w}eVjW!HibFe0{Gjip<-Lqt`J_Mc4B}E zB*}d_nVr7`;gyXv?u6SiANbkc{x<*Z%1&Q9JcwnDX639fX{Gu$rc+r3e2-vm;(zjs z;cANJB<(Y`&}+z#_3I8dlOPbuRwyXMU3(ez;=+9oU&nH-%uzYA>1~}ZuVMoJU1py4 zTVG3n0_XUzR+s1nGBmnpi!JT&tLbM!S`^>-SwfHPqP^+40YYHm(ATeocNr@(t*{ap zB(2eC^J>ImFEjnCZ{DmZ`)@HFXv~#dAWO0N<8^lk@|^QX4ysGl>xwEOaV=Sa<(zk} z;4ZDGT^S9qUl&3r-uu6wpVNEcK5khJL?S6$4e5opZb$hfj`NKJ<4OZd*xX8Q=>=R0 zoX`?WVO#hRq4D$7^Fldg1>wp1!PCx(n3J_I}zymG2C4V`P~llHsEJs6Jo zbi8#3${!Vh_F@=;!|ZWG&$_T#yj-uFqHky|vxXG!M=cAPQ7%uBHYQy%+x*KcJ(Y>H z$|+|FzdERTKd$-CWGjX!ncw79a&6S6h1GhSKJW0kwB^A2-o=hLuYBrv3_u012e(Du zy;x;(!Z4idSi;f02EX=kC${L##+S=DRekX}JPm@`hE*I1FKQjf#Y;Y~xt4!xmOn|R z`|`v&&g+ClcJg+A;ZU^UXFFC$yh;XsT|~@luZ0^}r-Sp!RTz$=+&%uLUs=6zD^8i2 z$*Qk+x9F8!U0@T?KT1xSBz5WC#rY?iGOW^v>D%A7|Jp}>?#2BYlvV$2AAAe>(eqx4j?c`#v(XtF9C+@?GW6%@r{d^gx!FIUH8-O?mbLB{_={Bst*`K_f z!nvnqriLQhvuF9sQvxii3Y#zusQ=f!C6uJtnFrD70WpspWLQapfMq zLsqYZ%<;d0nSap8Ou^Bpxdke7z6M}AaXtqPPa6$%GJ`tbv8+h8==7{rD{%alxhRo5 z9w_7?X&NG#O{i+qs%eZ0!9eGrOicv~HyY@+iR{wrLi23M@%orO~zI4{vB##!+`os$uB+uIHF~97ms=J{z?!1`sVxh z@S%F3Y+@HD@B0^C32Gx6jhK;vd`eJW5PfulP^jG)0{`jWB)20B`Ivv|O&HW))-Rs* zkg`2b7Nu9Xq+;m0f%5?5svn~YyX#-vXLLjM(2RjcBPb^zY4Jl+N1)BTewT=zHM%t;Hp|b0paxxEc55fXx<4pz z$Dw5X5uJq!Kc(vae@|NY662C-D(5|yi6-aYZB6l3?{mQvcA$D=e6a^*UN&7mlSDNh zakU;A-D%JYiDg_sRa~(@Rnbaf=SLnR8e(X#!T;YUy`e+mLp^Xr>N|jUp+twwAs!PT zc7utkCDT*=%|)AiiJHIUk&At3hEOz3J?eHMydTbSv?5XF)0`;Hd{|s%vHbm$tU%c5 za?b+#s(prF;yUg8o#ck0$8logu&dvfcirXt zPme-xH}*YmFz&D}-e8F_d(2G%tP;62j&2$Kwq35o%KusXU$E3i(q z{!Q0s2yRa(nF_$f6X-xUU^INwZn@sE7fX7(XL5{rRh3?rW%DbjE} z`_!OZZ>YbJChN**IYGe1m$^|%o(0;nmSWGRQ+f5@8=!ikX)q65+wJGX&-O82e>8I- z5m&3p1blq{hvoi9oMIMNo0(VabHeI3K>)8FzredV;jwg(X~eO?4KsemCI@yC3Qp`2EmB+(8gT!<(5uFdCaIWAqMPhh6~U8kBCN8v4`|78T@BJ_1DjQex5XJIpOK66!{!R8gp#j6Wqvl}sFXzm zu{~8(9mkxuKNwvtzcQpga|&6TXo?5aQZA_85^C}eEwFx*cRxH_&2|f#zswv zKNq)T7t&4Fi2o-n&km^$cHBH@`W$cDosQ)(a#f+Vb;WO8BNmk(XZ*Om?5<5FX$#Ey zGxr&6^r{$Gy$shYu4{q#E`f|Ay)ZhZ+3W`TtNiJP-VM|;>DU938VbokB^bpoPPnf7 zwywe&P$_;XhjS$wrKK&;QjNSSu7UYmi={EOjIsK4LBs16c{k>~_X2wDSJDu})KZJ7 z5PoKGP^W$JRl2eBSBsH^0ypNiwh%(zI=$2h&B#9bg@MSQqH+D35p$1z?41~^Sw|VL zfPMM_z(>4j70^3#Z1W}d$PS$)x0m}EdEX4$T$@1e^8Y8d;Tw$?>zh-DENy24`|sJqq{hw%|Ws`*7eH1{6@TZ}3%Q(dAdQl9=1u`gCNd z_7-roTqBF73+Z+~_n@VH1o2hxK-=iG+m}bXedv!`;aZWqUmCIqx6x4IHpj9{Zw;0> z^XyqX8&l_=nlUto@knN#+8tob*voS8D0-@S$SE(JUa#@-WUP<;`?<@A>=OWE`f_RF zz0%VsaPrU-pnP&MKHRcUnCrQG>k&Xzu}Y}i0qTyKCQg=ud5`bQ8rf+}6pF^ryDy`W zM$4M$R=QNFJtkMtm|!A*17%YGQ8~XENl3KSnJU`RpOo=b`Ohm(&>g|OvKO^q29 ziHrIEJL877T)4%jRM(TSgb(Rbbu*`&i(3%^~Am!#n^7A`T6&&htCs;j4TG+*&s zm#|y!67=ypF%EeLD%S>OVA)!{oF!m6;w@3ZxqIO!Cih%u1W(+)hgPE=ZaForNFX4w z%#x~OI{bs3>lER8+k%$b``%@2@-p!dYsChiQ(2f9J!?WOv?(8(w}gvRj&E#rVC!)k z&imom_ro3edHLYC9_2s4h3$R=S9VJ3dq4wCQ=_BBL$o5VbCsOEYVQ?mIJ)Z&?XFD; zvkAEStk0hDyekYjDRFGGbh4C`)b#CLqmGGpnb2;6(3#bDhpGpaL9I?nd9HZpBgX}E#WzY z=S%At^t?D!GU)fMDHhxT1ESi_fF)}ijNW!*UA84Mm%^mE-Tu9c|4h)W>{ZsYDyRnwB=C#;?fSw^&8&EP z<7&bG_7o2mx>Z>2KB)O#2~~eU+N)<%)XSE#X+PTzmu!4cjXf%-$X9^iMYzg#z73A~ z^Ut7S(hvJ4J5D15Kz?M;5BcqcvhzvDIF399?uId(HmXb=R7BcaveD`o zW_^&*(nOrT7cgY5dX4gIfl+h3iP7g$qh_vZ*mH8?mBzUfxwZ$h^xP*74z$VOwC_1% zLJsE@zkDjS?8-=Q+$wnGbH&5^qz!Y2E+6s#6gc;=ItQ{}RJu$Iwl?=kYuIOT^{Go7 ziOE4vpxYD*)ciMhs5zA9Al-`OyC7T-wGVdb2PdTt zJ8VGcE1qriRl^1(aY920c(oKImbX~n6E39$Vie9~KTjjEOII^h?P-R+I1%yor^BKncvzIsc-rKkrp0|2+)@Q=p< zCE{;zppx)lhSp$*a&6fB5DPqZwrlkfIV-Hn=oUB}KnQKn^%i(Ne+`Z>So#CdEX?ec z0Z(~bO-}}SHyBBzIT5K^-I!E)=;226YZ`${dCK_`T^F}uyq2+7GQ1cZ`yOIn@Ej@0 zv0la_&C{!zHqc*5$uXA4@=$@i{V6Gg?w!L4PslG#(bZ3QWHfFXi8palO)ilaQ?+Wd z+y@&(wrQ~|@{HTFIuM9#o*2x9B?>7m_wGjk$SB$&zrt3Fdtb;B4G;c0CFlR!mlRWr zs^v7r?DWMP)xGe4zexb<+6be_8(af$13ltXcZn9gu%N&H!rGz_%i9@5>xL{w6p5(h z@v8iF`Ay>H75DzDFSU4{$(fstPp_!8CzcjM5qt??GJ;E%>4BEHL-zWxvLkzpM9%&r zvLlJpluRvtw%OIE+d<~|Hr*LS_39?gukpH$nA#(31``Tw-kd627h=T1rQ5ex=t4i7)s8vfo6|aS>{wcE%?!G3&@OR#zXXwg5LwWaiva;x>irnQ zL8Mu$g{Z|n3Um(iIuQ`m8Xry2-Fvk{6QmiST9IU7gm-cq!j!B!M0AuFgeaK|_-L-% zatGTD0L4`w#Ri?S6lfHgFAaILQ=#qq&|*V(d!}kAzT_hE-&g<8Bo=#(dci{-32ez) z_pvTPIQPTyfSGSg_ls&U5V|97KD==q{5eE zM$QLFXUbtmL~b8`jj4#35IC=5y%wPkQG45;vkN`BEpwC#|0)#;1@w|%lc6UR3YixV zLV-_#uaTc-^;XYv1!svCm}hExY*i2A%ficA8Bf|L41W_t8fdlRZmag zp_eqqmLUWUp4PXiZ(WU7aK07mq9>+!{0h7cNF{6PvZ#bSlN2Otic|bmxon3UfNLXc z`L}T<9X>0r&Pr|@W=bXdVXzgir9a)vJ()41)9dwG%pKxN@uXRCY446sCWkP&??;}h zu7EyYT=Y{dQb|hBb}9pjbD~DF5PX7pEFdEQScx_V_WM*E9Vm}drg#^XgFGUtJ7Ay3 zqH&QB4~VBj^T|egFDG5S6b#Gjf&C49+34W=`6N3mv~U>hDL*J&5{BGQ%t6Kj4qS2H zSR`MYV+obbw)VRm4j=Z8*d^8UMCmK)ftq(>6e<>IKU&@;8E9d59=kjs)w7}nhSBFS zHR74HIzc%Y;dbnP=Lw19YQUe~WsRPnyWv?&PKAH_86w!yAJq*uN^5zD)&ynTbm)l9 zn?SvVXhapftO}|KuOt<&x5Ro+qt6~)$bxKY%D9XypMV^wV~|9X=-SV8u$=GVceMK- zo5Z)yBfPaqiM1=E_DhBJ;S7whQJE(Y{IL~V`mBBq3j(Y)AcljQaKx+7wbUNnyGq?) zpN)exs#D1Rq8dkg4c(WwN-thn&=4%R$8mxLjhC3Ur#09XI{WAn6S`gBsTEu3Oj5K$ zKiY-QWc8sj zZunZup*o$0%4P<9Je;9dS= zs}zR;cAT63XKtatP@N{%W#OeA;yuUCMppLB#-==?z5l}fOY`Jd(pgRAkDW9+d6sZ~ zgJ6r!u(sf^bTDuPnwX;n)axP>B2>?Wn8dhW@FSe?X z9? z%>C)AYNqqe7yW=)O;L&%&C_=kHjnW8ONRHK>|m=;?W%t`)EMf@P&M*YmH9G)Ww82R z&_}#oz~z7BG9KwbOfOZQL~LnjBvk;1I_u)~J5(7WprYm&+@K+8aP^k!O_XOq=!J49 zi_f=P!>NQtjkZUzt7=n$;cqS9Z!)I7Qf_U}mS}x&&6NI~3YH?vxRwl{66qc#j)XSS zM&mndP_n_!_jaoxGp%>FeaJ%QP!C9h2LP@dU9+$K zq>Cp5IImRA?mQ5(qAZL_`Yxa@7H^2y(sSWArWy}mo>k&%_JYHz_7CsC%YW|VR~R=1#XAE*)rtL*XaL2`g`yR6+O6rPJE)cN`n}qQ84z@v=`=vpnC5 zIZ@X;499x49(Y^>f5+f;txPJ#ySNZ}cg~Q5J_RiD@&SPIPT11uP3<~p)$Q={x@y9c zeZmAqKkM7eq+)ja5|ponBdMmTiN)3i7j?cdQHd22V>Ti4lJE#r9>&Xb+G?fiiu7Jh zabl~?Xd{%(GNh;l4foi!r6Zl>O@Z<&C!6NZRk-w`Mdi6}iTi!rEDS+DU+%8l>;A4r zTPv^{p%5&2-XDj=z1;+(BhR#eUnCF_7?;V{9C(KTOLC>!!hjzuV&*r8|>XPJ%q z^3x^Y`s)pR+RSf}ozV<~5Bd~BG&Y$9EGde(tFJx~eU)^J5AKbmlc(z<%HNPDk$!yi zU1P}Ahmi4&Bzy1k6@$VAU)msE=YpgPY1=PUuBSRLnnhu^FAT=fHR(~Y!nj_NdsT)Y ztMnMF>ofQ3NXC&9Zny=juYIWlElgCswAQ35CCqaABSR1SjhhRT1^^T(r{6vU5*=bz zi8}Sp>1IVaEZoKVOf?T0USFH8o{Zb#-v`92THtg7JATN+qrn6^h;*~f0tkVA)q1^g znFe1hm0qzcA1l9?8_x)161#a+wDR^XXOSB=DCo}|u)A0D;rng48r#_)dbcOqRk6tk zx^DI{2s3o*s+m9&h>QDnZwEd^L+zbR*O5QjxhuKCkOCitI1IpKoXjf4EHLi{fQa_Z zLcf9%Muj*`9YVv0K&V>FJJC_JgoIQpDo;^xqE*@hu?nJgQ+TVC;shT*7i(p}09Ers z!-cu$J)cazv1sm>x^k0Mj&hVpsKK?RFZKV>o(N_)P&$s33r<`3s0H#p&ts|Ao3)fj zgrRTbC#A1*S&|)cJqK9pX$>m59zQsf7Lt$v%zEk1Mq1EBJ|v=iY~!U`_OI+t)iz~h zwjO^I5RaNogXXvhO)LS#SbqZ9e_6*rz(00}UG{049)E9*rptY~cior{z20ld4gt(9 z#;6mZeOoWZG6nfCt=O<_za1EG+LRfd=l?Za2R;g-l_iKhnaFbRDb01-oBgh;l|f25if|kjt`MTMyPu zrY8JZ9A|@}OiQ!Z36!y~$gsR_LC$}%r3|GZW-d&eo)d3w<$gLP4s%Jla!0L7EP&7- zi8!l1RY?QpJQr!gw~uXTWD}~|0NEVy)@h=);i9)6!3Oa1W3@&6tZn?3{3w+@SZ%Nh zYC>)@v$>c=S=746cAAMet|z6Wie%?c7)fr7@2}?s|4o+q-vaddZ{sM-o7-rfW1PCj zG%iv$92aZAGL{DprD{)#V-Q!6hMk+;TLwLb^RuU^;Dj3Wl7?QW0~Y5+-CLmVt@ay6 z>TeZTRfg1fuy($;XXDYva`VbL8wlph)bU7x>g{A!zWY>Yv4Ir1!IK z^Ks|YeK6=)SWe;8+MnUG13MK4+*x4=TAYsCzjCQ&lQOqI zfY26oKf0GWhEo~j4yT*2J6*4KwW>?urGEE;)#n|15pV2?}0c732?H2TjA%pyX@iXs<<^Fa0?SG-(Mu5)<~dzJBWVezDmRs670{IOn5u{ z?fH+%e^FxHpfB8_QfA>gf?{x;q$1<|rpGMjXpWsuh~L5cH(ESG|2?Guk58W_UzG?E zAz_?jGVu2=GID!Mj=rvoq7JF?Zp<>%9w=u1_K>~$0Om`?*c}G#Hp?;2@+_?-#%m-e zw-F|5$fDMcxb@e~QGJJdOt9^}9`>rgf;w({zhQa^ejhMAU zvv9`pH_0}adVWOfa{svuc%0zB`q&Wfs|?9nud5q*&R!NiKfa{f9}cp&nl3+(?jkhN zcQoraIJL|9HB>0e-2NdpeX7&xj*Y9W4o9OD*4Jd{GMXQ5Jhtx|fsX1RAdK#Xc{Dmq z6W>^iU*an%`9(CFvLO-JBYXKx8lJ+;kCHsv0DLQtAl95f1MvMI- z*MqlH{U2IJCMub$X?xZ2MqL9Wa(Y1YdlIUp)C>={brDmD`tenAYSWXBOA2_ z01LC(P!#x*LMee}U@)HDtAJ>TKy03MNk!-H`EP=LYo{(zCvk1wF1>%>yO(R< zh(tr7@|u#8`#>tmXn*5+arru;#d(N`rT_w$W@nR|T+-wu(*fDWDCb@1jWj1h%KZvVpKub7_iQ>-Ny>q z=ml84@lmaX24|HkeIsWnM_jaDBcIp?!E!mRwvHHm`CD~s$H9;J9Y9o$A^1WEwVHY1 z?0B7h)gvA0#C@@tQVo=CFfFYe-5D?xrrPV&aw7ShPsN9Vo;DBj^%HVgQ9=E5t$oUfX=kB6VpbcF+P8ljc zzi01oklGU9ogiJW7JOzDTN2UWUO_v>cJNA&QcpjCopa~JVq|)AQubcz>(hfLAN2K2 z4kqAa8T^kppQXpcd94SL*HgR^gj{OjA2C`Kq}@%=5?2f^crM3OMpU46z0;r;G%uYm zJr+JQp`Rd*Nqb{Ix^WAPT#U0L@MEpP2t#Mns(n0j)&W%>wMec^D(Ba3w=R3cbV;a$ zEr~0wivF*_0vb+7Cb7R%Z*#+a(b{*xYvk$lGTOGMZaTr;y619CgV6V<6f7Posq=pR ztOaJqx6;yxO8IT;*0A~j#>IuNJ`gXu25jMBjNSp{?tJ8Q_&oT06zX%*<-;`_;6%#5 zFS}kIz63cqWdfHFBcSL3tB2+ql{Yq^EZjO?mQswc!j47A~fBk zqNRQhl2l450YJtxaI=|i_3ExopHR{7_=_aBvutUlHQ=pUvlth-FMHiO>68RT)~fx-pL^}6b6fSNQ@re?_^J5+)XvAt zMJZMAmwhSlQ{xRXi9kh^9=zvYGIQ_1_Ido8RP*D>zu}W3lM$M-hF2bX_&i#_?=L_V zCzqAOj`|Gt;5(oq1PUxeGq$ca99Y%yiN(p>6XW7kB!!)PB%my)J@@rbVDH+c4i_pv zQEI#X`0)fyHcy+B5q=So=ZmJAZ@~#SkGY;k@|H52|3RE~#zy=FE(hla69>5m(7SCK z;32B=#&>ks{|A#kqOF!89ln`Ts8+N?pOP1i}~r^tLPf ztYoPw*2k+V_exuOun2U5k~9qt;w-rE+J$v$lL`fYDGgyHEjnUl>(Rg zQUsh`mb-$=>RED}%;`WeQ(PMa@B&tGjA=QRNhwie)De6)2f+7)EkYdWs01zyD&bh) zjZe2wbV+~kXv*+B=kbhUeO@-8vUMj8sg@$yRJy@FY-_QUAaw!6Qr2rwQ#M}-H9Tp= zRh`i<=pzDLzf5WFlJ~(+*DJsfn{o;iaZ0q}Hg)t)1>Hly2f%L=4?Ay9uxzH<6JU*D zXrI}cj_MzIpoS}^rIU1^zAxO;uC6xcZu=*^BmW&FA7z`yQ&!@82&)Eo@%iq#Ic#f7%9OG?z?Sa;Ot;DUrNx^n=UN z5tph(KhFm)c2`$yA&h$>>Mb$%zX4(%Wt(Tn8~y=%y?QzyNaCoWELB#XNE;Pu0uoay zs@SjO_Q_M!BJ}POzXf8QAqTWG|33Z(w0n9&x6p(OPen2Y(R5{%q-~IV+H7y~ivL7l zLg9($ZqPI}kkL4H_HeEkjB9v^ArRQF?DLe)?ihk5(<}83kAf?qD^O&`<87Yd_PupL z_6(};Ls#F9ZP1?+#ri{3>S2#H+UQ=j1_KlkhsGfK#Z7KX0)i!?$WQ@}PvVbm1AqAK zZS@Q+ztR0q_e7tzgIixfA>1yzVAFnaCQ=n^@eF_&sq--V7!j)Zj3}b9T)OJ6yj{X{ z+cR6gh%{|4bRJb!v7~gfbg2boyz0e0u2Cq9VOLiuF83-ExQDmvLn0d;yU`Kfsv2v? zfxxWfzHaoGwt%RLt0=#lF3)+#X|VRe#NS`n3v;rv?yqDHB|on)`Vxn*OX9xWlq}0p zi5xB>0vWaOrs|^ICLtggZX2uqs)g~CIh13F+_1XSZ{6Lcp_+>8W6|O>gZ5MU4KS*Z=bH5}Lo6rwr`#MsUCNA=awU5SA7A z_eAH;O0_uzc5UH5g(!fFz*>R&Lob=r$>=hu$GsGY-2kSHFl$j?hhL97RBYq6B^`<9 zBm#p;48LVzRyl9&u&h)AtqT|X-zo?mOk6ettt72NcYW^z?JrFmvp>W`#y0kk&i#R1 ztfW=j(M;hShvP$r3z0?hUR#M5|4mYgPhRp zUnL5Ityy`MNCH!VJr8%l##K6(k(cWnM`|AXzCFYf;U7+ja&p!pU+0Q5F>PHP)w)0f zss;=0hsFsBb*3yel+5P2NTwVOg&-j8!lBp%ETC^>vIMv)+G0X`ADKn|A}a#yWKLe} zM|C!Q8S#%scu8gKfb%)!{3+YidGu^U1op3M?6+GVY@>loJ8cM7=uXqDmQA|_YJ$RQ zcUl^DymcI`%$R~v##u9}9AY~dKp)%#w_XlKRG@cfiE#2cx}kNI&sh;_J&CsbW#S>Z z_fo@9sMdBV8t{)*OCzrN>s?5wYHSzjLu_xsGTW`eE|qt8-!hTU+^u%w^>C~=N4F?l zUZ!$Ho0#(l-)_ly>)Hs*#JnN>B=F(+5!G2_31epjTdskMMnvxe!$>iSUx4Cn_ixhJ zwwXG-J?-KPbhx=ItG(;X{+gC-J6Qtks(J0{QQLq@kv6m0npY`b2w%+_CO2R4P*Y6? zQ)M3yEoNnBX?ePvQ5`0U80CD4mt5U?MO$V55xV?S3G7jz&o80#-`6Ken6VJObE4;#nWXs1S!@4 z%$o$VnA=^QWap5A*@sX0s2;6a-H?6v>S{eRBdm7(>h~jOhwk%a1Wv&W^C9iBH$p)M z8+QKt&JZ-woVD}(XsnLrr}!xr9%xZ6a{pg-kBR?#{aFnqRIOUY7PwzkO4lo4SJRYW zDIpfgaa1nUA|nM_cYn3*@0IUj-cuLiw%q>g9*=Ke@xBx;y^n0_!rgHaY7b+Gj^~z)(OAuinXFnE|*?wvXub)xWZCh zyCONH${gkPp#S5;lFQnbTJ*K`J04rAogPM&FHZ-t85SIG*!j z8O0{-zKM*v7T8?$mYj48?s4x%qbMs>QI=xoZ&`Z95+xdW6QVDzyLYc%`3ef~i8v#x z&5PvH@{mRP_P5}NW}c%9$*(h_R?e~w`Ntz&j57rC{S%dgVy%3SYhWR}Tvh=r z0p40q)8y8l(y31~0Ym7BXhYF|Vuj^_?e9g{Vn79Zp*xiu?j359i@1_^QsQt0p)d2Zt3TQL?-hKeFBBy>g!XAUC|a%YDkQZn@;7K6 zn3p--8{cM(v_q**FKKG*1)Je?QUQZ>e&ye}3_r_iX{K8W_%Hy5(&de*gl02VW^t~o z4KRZj6=N(?(VA34jWb#{CP)1}*nP2xFf0sk(M?l2b)>B53cShs1B}4^58;YOEZc)y zL$6s~n_6zko|ywgGk>BMFW_naFPTlOAwf1x3{WG@Tz5IM}I;iwz^ zL#e+g&_lB1hri6@wfZr1mxf!H)0((V>gGKK;29wqZPyR%wI?Nm@oUoPNf(-&04eA)y({NADQ-s&3rz=?ph&(eiXaAPe4W{4^a00tOB+8X}ZuK5~({4 zne&Q8b{GZdK2>Dis4rzKPB(D<3h<;e>8GK5U4I%Dg0D!{IAE_1Xiq>xXTa*N{ktD= zv;0wRk#gb|nk&t7GlJ@O(K9H^jD49*oC=D*t(*Wh=v(LUA#T|+_t?5%&i{AaNA^|? zHS9ucg7x$^xj5rEqR{rC!->&4@zrDle2~#=e^t;a8}<)@{$GI!)mDE1V#s56*amoB zzIq$Y5$u&=|LT+{JXGK?;#)Xp0-ie6^fm8F&axxr{KIk9#`V1Hb6{SPqZhSoR(#I-`7#j?CWXPy)c;C^&*Ybx?S76Ji`Ak`ou|GTj}`I6 zMuaa`kD-$S&nW40EMJBDqKDb@`x0+?B1u}#9eY0)w|92zf$u4AOkUbJN;EIT&B>`o zbenh}s{Kp^(WXN~XvIx;w_3ASI_(xO2;*Pi^VOGgh_y?B*h8p*RtM^wpAvr6 zjyKxauvweUbz&I122lhbO{RnttpSRRjQWFwpjO%EEMzc#hV`kMX2~=@b2S*3_e5Vi(N&&a};qDc3(+R61Zf2yx3I#|9zB&TTQBq`cU9i!XWEoPZ;#ohBKhxZ(`s{k1XI@* zI>9N!bWHso4UU<*4?&&~Ar28QM3qxm{=nQO*W=5LtCiZfC`%d?6u4<<=jxe{qy3e! zVO*zqO)o(EJBEEoAsD-+q_hKX*AK5rH0kh^s**Y($#?~w9XkXxXt&`E(6Y6c%trjV zRMJ{H)5fOp&9=m*<0ntC zf&_9{ z1X0yPKp7+~$)%m9(YD3QQ}F&+6RfAkHRpc^?Zi-HP7`NJrUBFKC&C2h~0FB+?5Z$%0TAtbA7=Z zx&Ick_#^R^52pREt0O7`DZYHPv83IS#}4sE2)hE3#;sU0n_DwI)2$*J4i6TX@7iuF zEg?E4=Kvz+uR{_kx;I0A8&SG1vb3@$v*$CyQWi_j1jEreGngsr^H$REh=<~` z`B5EEWXHqa!v3|Qi*5?dH%4ppPBQQiBVl_IEvqq_AFbg1fyd?|h!l%Y;<>rFl zzdxqTnIT#=C>ja1=tK6F4yf9(rH)8{LhIHurXZ}a+Xb*YJAewB=o3Q0GvUfvzGoHN-_7*f@-2BoE_Fphp-U-z0JHY_5wq5OTG3Mvm9Cjs2@DlEjJHF!ZDLJ8lM zKilL_1kqkZN*QNk3Z#I!ZR6@6!e=7}h~QrWY_$LH&NM|&Od^?0x6vXn2sG{jjSXYS z&i6ay7cKy2X^gW;A`EQTI*fT2ND{->IXjPIC<9}OeTd^;s8(a+K z`rG7E(|1B6OZ7)GeR78VPrA^#Vyzf9Z2Q~dznqEXS%6pTDite-#!QS9Gn?C`jKWn( z)iCL^uS$or~!WpI_UXpJp}SxH2UlZ4UJF0pRt*ISnF2f<14uq+N{iofWiqTeo}QA+ zGdZwP$yjgb{#7CW#r^&Y#tY(tubs%;ZwSg)HB2(@l7b0I8XQ=9-tJ~(sY(JtC(N z0!-*z`vQzApyDDGqnky~c)c*APS~o>Ia_1vOy~7Yo$sy|4uw%S(mR82Nn?@Xy@_#Y z1Ann`xGd2DGqSBLuvAKXkgV6vkWts~`NeFa$q&-PRoix}3W7`whi5Jzhf0wyUg9TG zFslELwpRbt`@cT7p`cgLCF^BulF`16F`-Eom^x<>Y=bE16Ffp;-Cgug0nUk7fE?ut zy%lQ=?!_wY&wujsB)V!APqIK7rzm@Y)^euTr0`}Dq7i)*u)D%^*lqJ2UY z18>X72=vE`Ek4W%O8GjlvJIeo>AN!@n68Sy_FET^>wslH@Mm}s`eA8B{ATz4Q`Lb? z8r^cv46~nRQd&d98Usih&bA4GkD+1V%3p{k_r{^k7}xP+^(xA?~Tm7K#*ELQzr3eyoKmKM8Sf8L<2vgS7@VdM3X{J#)|0s45$3vE=ldA6?E_%cMkF`E(pxgytDm8h#7V7i5?5(7{zv|NILi$=n{K@ z_Gqn6MRtJ6Lv`9vhM++a8#WGZ;@`t`2cMC#{)m0BuRRycFBezlS%haD2!{BI~r-j0;~gr5+rJSY65{5ur%Nz-T)Koc-Ma4Qc3=((Y<;h39SU{)>pVuwLg&iCJXXFKF6rI*+1D8K5vB-Zt zXh4lalr0;Zmr@zrsC8b_{2X(|lQa7LQok{~7y!#~GE!eHsdH){;Z{taeI&w4S0VBF z=c5Xk5Z`w+xa^N>=N#r@ZRa15ha3xhM7=O`X?I4vna%5Q(hJE^PNYx2BtoosL)=Ub zA&9BX+jiOAncvLfoq9Oz{b(A|SNh+6c<0Y93anc^e-5!}3gmIA@iy{6ba7>jqx+}J zGPs>N2Y%>#LlTR5ybyolS^w(C1!pW%F+`y{yQW}N&&*Ke1Bx~ANCM3MDGBVBg|7cv z3TEZmPZ6PogX(;LXX9&0fx*%@h`XGyF#^w1^9WQ2rS-)8 zTZ1h|oW>fk#v?m+z2Uf=>7rW>%Jv@Ii_^cWT{h)v^ISpc!d4%(-o~*01ST=W-4znE zDBbk$j-1jAf%Lk%zQiimze}y(T-Mi8d1Ldd=oTbOF zIt1K8sYsaT@QB!-N&3|ZHsttTOsU$EOTPdRFm`fjSe$MFzW+V8lmlg0;acL|Fd9={ zzdJT(2T>Vc@qZ+5%U1yLRf7mX`^nbhXvLY}r|y%DsJ~*P7?B&30c1()=GMU_8ozTs zpu+!Q?H9%uR`?3ausq--{JE3PAZ{!fw!v{QLN>+k1l31sJ zz4F_P#M!o@vvYw*i?r8-teYm+lY`E>axOk{8AWjAE9C>Xi!#?&5f52D0w8on2pQP7 z%HcKz)tSj1nLQFV;VSf?->nm@`kZ<#v=cB}6?i5}_^BV+0`J7Nl#CK#=hzR0Ad%P) z*Du+O$yq&B&5({cukXsfv~)nO9}L*EOK%3&DXWi6))>}%8a-)IPL7NJ5;2r@F9$5v zi_^@lJZ_u#-q4KM8h-rvs@iI>CpTR2xkx|B0ynKd#-HI}=gr(lr#ehC?`1CKiv8GZ z+2ES$??$9;u?4cSNj1=d51ik>Lk?SfJb_DNINrJ3Z-kQwGOR;310~H%j%G{Hx2F4usnuzf9`T zc;&O7tRUG|<$XX}JyFpS7IEwdP(=Fx4Jn%bZ4=9z+w22Ivai7}AU}+^C$u`{Qzz^{ zE90fTf4P>2eJ|yc>Aq94cgV|8fxpO2pZC?2=c<;%z~Nia@)J0${;4-z$aG{0giUXm z*N3IJ|BKHL*vq;xdFJYjy#reX`lQdZk=W=SUpL{PJTJ6hu}(Ky>G*s3qTpBJwNAK2 zs#|wzC4z-vDDeXlk*?9NStbDxi7^Epgy%*18j9cdQ(FZPAVl>1Gyiovxwi}WC>!O0 zjIux$Ddo;FDJD$52lLO()4~5D8=eZHQJ+nzL?+QP3xkSizaccfYO@!FztO@MFA|`k zID;6pFjo(3IPogE)px(fAcAg!L9ZM_6f5F7i0?}&`1wK<{GiJMSe_q#@(maneH-}B ziyvX-zZv1rnz=KS%>2(%49%Oo0`gd^fM5MPH6gtssc?iEy*&F^w?24;!&ZaMc96(c zhXX~Lu+l+`>ZPRGYb0mse2-`E&)GeZ9H$`hY@ocXOuYv2zTVG=LG3QJY0V|;$yZuS zUt-IT&99-`WM5e-AIrTX?R8EdSv@|MYWkLVB2n*CUHMjENy|X{0~iNs63e;#V}t1D z4eQFv=&X#1udv$NR-J-XbFERk_SH3h#Z34+Y~wQ>>#CkUX;e5l?6z2+632Rr<+NLZ zqnST-^V7i4rs^hmEpg}ScgT-%v=otp%0serd!SI>KUROkijLV5lt^7r$K?ItPfdMF zA@NuF;^0@}!y0V$E{Ply-iZ7yV5@XmCgk3A2VPy=&jacpS0lJ^!?h0`x2_IrQ3;G3 zxyC8T?bYQ7!=_on-M?hX9r^tZh<-9Q@hnsr{#cc|mbNbU>RVi`XWuB!FnRE?u2lYQ_4 z0>l~+`~FJ}tq;+UwiVDF@Q!lZxe;{c7c1u$U`1vLS6{)rd54`$UF+K1xmhy*uTCn5 z%6z&+!WP|+p7Gn%mc9MaC~;ljTvfZS960!rwQZY^b0`v&p|A8su>YBIS(cNoH{#I> zG#9#Z0*gLg#BlM_!^}2QCts`qx}Cl^f=@Xm<8LX8D(b`!+&@owak5Wj0oKvVSaVzp z`)A5&x&UIXKnGA#V#58M+?U_MO5yHf`@wYYy!l{0TC=AS(8YNpwx_yJqZw zue6W!IEChRt}xsw(IJ{ZIXuBHpv~;#!OLGKW64O#`VhTA^(>**#6;!WUe|n5T(Cm3 zdU!;X=;t}%D9C?&1E0SCaxQa$U!GN+g{$ow#WuL%qP=ize0a4E^<}lR&!wQZRC$6? zlgsQA8=eUld8GRCB#wGy1=7+(u*Pb37roGM!oro{G3-^*VRNN^c_KTcBrb!1WfVho zk-*LPja#PC@r3wkyLT(NTK#9Hxx_0DTdzH@6_hHAP|nEE#JGaU)4&&{2c@R^@$Vqn z8{`CAlBL+T)oIQ&6nKw@(fC9)=B+=0%-|Kaw3EYl&+E2_0d+4Qf_0|!FufA~H;65; z68rx+I?I42-!_V?h(W0|A|Nf@IpQx!H>0FP=^CA*k?t<(?q+m%m()ggY;=RZkMFmA zW#f77>ps^xzXSZ$iTfYqM!xd@u&KakJFdxDoP~L>dePk*gvO!eU0ZZ!W|3PhW`_VN zgQHPErv>6}$-wgE-~zAchy~G>A5KkC(Z?0v$W}0HceFzFbPU=ume;@yGh`%N$Xb35 z5r0SkfS33mKZk%O$%-U3f$a~&In!jixsUMVGHCRs6V%>${Lg-SYPT7S@q=h(EewFL zfrnLCfNREY&NgvWz1q%~#2CG#Q+i*jCctz?{N!N+P{DdeZk~Cl0^OvG7D$?zexw(0=F4Ztoz4p!VGsk7;Ec{g zHgI81njD{QW0w7M3_i~v3P8aS_F*oy7l;hS_8Rm@gjMbdh0=X?!aHOR12S;TlpI2>s1=_uT9HUvod{Du8YzfE47@}viKfR zY56N_Ij^cmt+d~bGbP%F2WrZ?Bf}Zb0~dK3C-f0Q|C_IY>n!sWs9QbXQHc{C%}-RB z)Y}_Z8zXjpSx}~r?ICNaAz$Ek+FgFUAnH*THYYafe+PD@B)&WwGD(#Fz!+$G{;`; z%i53j(+C^a-M0hC`XB)LNgqc_b3Eo|4Vk)=A#eFF`41nv0AJDUtoV*{jX@aQ8CkS@P+cfjmP6_GD2lX z!}Q#xF`WXP!AIA8&hiIaKSbm*z~XCDae!vm7pygqfX5K50zY9E``K~DP0Q5zyUvKF zh5EMW_wDUK3lyzQe_@kO@A=A*zd8 z@K)s!+Mgn$Mwogw)0|=tBV>+^O?d5EoaNV%Rzrw!7nt#RqITv)+IYIWZ@(_X z{NOC)ed9`W<^x?weD4f=NMS?6nzP8?^*%tGrx-WxjvwNohV071swT_Ye=Y;Ex?6tk z_=J=YeH&MF^P*Y#=3H-zn*FCG@%};eUa&wBR&rGesl_x1qC}f}xq3o<)5XIuI{sz$ zV^nrErE|d7In<15K`~S3LNHJtiP0c66eM;?M%ku6)D}(kj7t=>ccqPPDc=5xp((%cJ}mr2m4>zy{QAm$yH_<+nIVJ2Z} zQLTLXl_8}`D;VyJeIOYQ6yfk?$(>LuQa_C57c&pANbEm4+-q$(lOZ;p*F%qLC2VDG zxQw{mHg7uo!yW;MM0cPCW&`6CcJSB|oUSn7 z&}i}?vGP$ws$P9><-PrJOuD-tVr6V8XUDl&hUVG@4p1iw%d15U$D3^cplOb+)Xi^W6qePv{+(8TJ*ot+fd7jbB4sBnwHMHpO-_wIZ zJk=WB;G7DAhsFn+n`ir!mz+uyB$s#Ca8LAg87t!m3vPso>!_)*9<4kzp4bR{&Q| zYEtpXZnQX>`WdE>xck7ve~#XOr^D7|&#U*CyZ;m4nXftAoO~ZZ?zT`?54C>M0@3PHvNBuK{6^5jeA`G#A4!<5z<2`K0#8!0u79+w=O1ms&amBT&I5rV|@wiE#9z*_w_ zUgxCt_o9z8q69(=ka_z#f4Jpeb?+I1yDMV{P&2-8XH?oIVGsVd=ef1Q(Cg>+tF=&~ zKS4HED0r9zlC$T^pU~`06k1Zy*=qJPeri?dHFBv5lS2Caflk@qF68-;QvUY_pUV@TkmsV01CWi2!?Iw~k`}i@}@YDe_uM>h@es z=NqFV-zt_T=Ou`@K%}&&hl?XHPLDFz6rGiT0uSs;f{3$w>cU$ZXM{8I*-}>z`>;iD zp!;Z!t1fc!EwrDPM_gu3nCXULs)~!y&NLA(&5^O%nB(Yl zuOAYBC_Ji0`>0?&yG#1BuI^mLS0=lbXZTtePfPJ(BTa3v#*YY<;E#%?VShIQH#NCopx=3YkXAAfYQ&NJOiX*z-JK#7o z@16cuq&Kov4xMD9dSNsi0DUt&H7;3m&V5z(jw3ek7UNoNJs@EFZvz|>M@jRWlYBYf zNi&skFFl`8T}u5=be8)=>_3HR&quEN*hUyq+bvF{J8iY`oSnrdvj8P_Ewdz>ra*KTXZYg88OK9W8o|- ztQj=0m%QM2Mc{Dy(_&8n9uHt_Z|qh>GqW`_1IM~XIPg~G`o3!BwSd*xL+y$^z<&A< zj1OY(Dg!*Km2CK7n;RVb!gYA_#Zx~vVL2|@_u1k>b=aRL;B@ZRz`#6?-mns=)|cd= zc{pg`yp#J+d{^V?YHQvQj4x06`sY3SU; zyV{c+(TDsZHG#az3x09rmN6J@9UIR0LZ-@p@-cX1NB$5qX0RhYpaWohy-9$Fjd7l< zT0(Z!03<}=-ivc><>z<23FNOv7CoA4tGu#Xs)CWr;tZx)*Kb2Gs*606^j@fnY6-=T z*lk>8MK7AS%(BnAt@w((6iG36S&)jtD*ZI%j`dnEZIsZl!cNx&lbn?Q(i7n97MC7Z z`F`KcUT62|8OQ4-R_)lVlQc-TX{HQlF~6T112sHZh9MCRw3GLVV_{dahO>)H0AKv%07kUtxpe z!1lF9P>kJcQ23xA)m3=*ee^NON4}OH$W)%!Yd!nB`Oac0+{{LdxIu(1#*dvZW@-mE zWc?F=L~Zxvc|TnWLPz4+Iegc{cXlS!QnuMc26@U-T@4~ zsuU+|JCMjXHpsviO@5f+JGNOLtvx{9h*ibR*0w{iIf{Note}o(*p1b3|wABtaO@RcghasbOm@|EQ6lmqnwjF-}F4EOrWH~pA)8hl6OFsSsI$NQU zO^v5FM9YJX->IjHd+mZ&vrTsHfr4s20L=-sN8JKQpAMim@^o=S*4A?EvEc>l$yU?u zuMxL)h!|1pQAueEGa|tR+ko%wk7(&N*338eN_r}ffu|A&@EVqa}PG3E5v16S1LGZr{?XS zKJ9QzYNHplE$Kf_X6AeRPC(d8Fy2jM7!Ry4oy@=UH2H}k8fJaX=%nVin{Fa4;S*rB zOTYxKec-@+Rdd4EFKVNDjJ6m7H?Nwchi%SX2?E*ho7@ce;agcUo0sYZ!e`H6<^__5 z9q5n&3_`-tfP1$;w9LRbOyh?A3J>=ZDa$P zZwhSIM(BT-v3$?m%532YqFnEZgu(1V1z|(21DdUE;?~lkFgDh4wxe!VM>{+CMmGwn z;{sX6a$m)z;W%e#ke|6qNe=3!&!yO6)|?QdN(Q%e2N*naylDSigSzCf&*6|MM|+sy$`g>as^i7m6;3ZB!9X_C89V=C-)?Gz**aNdL4=H}6tli;lIS)ztsAM;GJsmR6?tHIO{XY3N0A9EiNf!Eloul>Pp6+0OfRy5EmP zD5RpFqMOQT3`jLVk@ah^AaeJ;^&kon_lv#UD3Q?0YKkUg1H3a6aCdc61z>8h3j9~6 zLx;)#@aE6j8;y$AB7%9(b6giI@6OILhNA#ffOdh@U|aNXoh$+f$PkO&w3H)o0vQ_h zUSwy$Cq%siUi1EF6~28VUB$8Kac`KTYFX6=f|aK3=0!Y5uKoDny4?H%W(a^HtNqWf z=o+L0d~m5du^Q-w-!!%LSW8gaR1$Fh5ybwOGAkfVzM~bo5g6N;j(d1C@{?oV(yQ9} z$=63V-Ayj?W#7Bxh-x8o`VB5j*XgdRtDga$vAv$zJPYl=SNaG~PIAtKH@ke*WE7fi zd={|y$lS5+HMdGU}NUXME2`hF`T_DywrsO}LVVS}|kqRo1wJsp09TxxgO zZCIw7hU64r~yeHVB|$0zih5)pYKO=WIUwpRXBXtg$Abx{COQ)a_^fgxi0@K;)J znxJ~*o!l6fk)&tdvb{>7`)BCV+RX*n+B8RXFe^Q?vG|7GbykdJa`NNj0kHh;bp_x~ zE7N$Qcm5O)J}wk=f}uvPC7WaGE5NK!*hvf_BnIuRbGM@w7 zlvg~|X-_^WmNq?B{=KUNY1 z6Gs1D7nE_L;-L;b9kn-C_z-#*jdk)LsGHG^AX;$Y<3$a2pKDD(Ox$r?Se=q)%+=34 zhe(Ob$X{yxUW_td#0V`k8Za%5wI~^GE*!--6rBj`QO_?8biN}ZD~J^qU+%2&i5!hn zHh5})bUFGI{7Rm2Em2$A5}@+g#DT+GLLFnimMJg(%X6h#an8d&wbN<9)Y){ zPCJMHP%K{(bhXD&r$I$BW`DB*u%np1aN7ICH|iCJ3aeQx_aaBuoR5=!4sAXNOpT_JtB$0MNaI>5Es`c}u{2_~!|m*G35ai2!G+ zW~s6JPXuQ1Xbl*gAU5p}FV6TusrSvPP3zJ%iA>mC&D_kfSApRT8spkvOSr5wk@^13 z;BkY=xd~^$PzX+#F>4-wRb^(_--|lS#wTP0duM@L2Z_&Q&)OI;2==MkmKE$`$aXEL zkvEk9xd)t=&f)BL$5#GWId>8Ov;!&DkFNIw8Cyxm;4XjU%Zt5s>SL0N zAJK@G2pS{2`F*zqT@Oxly&4h|R|mZf0R8SZ*pDdyXrP zN7fDL@4);_U;EbKn25+Znb%|>u@9*ucI2sIR?;kXC8zquUD0&HuGyi00dJGzb=(VV zZWb96#vw)8^_F)J(S@fG1gWtSmyBS`pcC$Ll~0=#Y+D@MDyD8>iUaf7v3$@5(@cdR zjGajl(p62}P0~vvQ2gM4mo!tKJa0*I$R9zlV38s7guB5nI(Tk1MI-x3wg>~Xr!o7s z4Sjo)T1dhnb%7;iA?T9cD(dZ@i^kG0*`U#{B--O+bbo*O!AYYO1^w5Be@k0ciM?KD zmBY+{6>AP#v&43tM+u!ti&CYKk0S#b+bAIP7OYY5>S?F-tNKWIZDx3QtywleP_bHv z%nLLjH#E8n2KkVhSd8$S^r>C&g+&j*$y9!$^Jbls_DrSKu7icu(E;lEUMy z9DC)Qj4{B);#{r)V|ts!qDhtRFm^A?Ge_~pxhx25iS+-vJF|^`H-D+p9fXOd=?HGR zfIM+}_?YPW)9b*R!3HgNoMd<+p7{;Dky*yymR7V8>+YV;q$RxN< zu6pZ8hWi0SaUqZroqrOVDy@lMKnj~dRqkAAZ>20S_xoN_Zn){fiOPk6Vw{^wk3ZpD zF%)B8Oku0K{8)b>usJMEFrDd6Dh4sFqb%^OC$X_WSvVa7NpVe!T(u;fje*b+ zE~deSl)8W|tk#hd^y;rwE|yW#a>LAK+s??n({KL(M=?g(h)zlM0O`hTNO^phXPrjf z9H^QP2Cf`*!uB3?D446yk+v&s2hRS+bkd129bUsCi~F905ji92L)RVPvUaznp3QUf zI7vxJE8x1;xvfD06t9)mRrQ6XwM0LstX0l{9xMU=@tbTI!D&z0-GKK4AT7*NS8Et{ zA=`K4V6C$&02%!y!LLq14IX-Bpo(Xv7s*I0$jKSA!|m~Q4?FzxLl{St%8&00nI;VbLq#$uS(nS(a0!9D7~2 zv`KJ|5W*b14&&gKhus=_FPk0#+<%{)ZOd;mlko0JA`E`r#2wZ^<}C=5?JkBiwKOZL zq{YZoei_D&+QBNRsHME=ByhB>@IDur0WSSaXZmQ2` z$btxBJ{0BaEDIrOR=SUdF6r}yBhJIQlSi!pW^{|9ZUot0C;?OF`tC0W9G?fkF8q*e zxvK>@-p_$yLM$=EXx;Tpz*{`ME+;Rep5Z#^$*SzJtQop}7HLXEe(lX%G?XQwm=-mn zsGt`M=b*8GT%$K>IguUblfvffL53f@C)1%uiSpLFSLL)Y7hU0xvIx&XJv#%2bX#m- z#di&!!=VsiHt1(pc2`+3l#Ch8YasX~1{A8}D6_G0|AH6#tL0|DCgQux=~?Jixx>W5 ztBafd`b!ggm2fZe>jr=oT7+gU~=17WP=h7FK%`3500Ijy60?-9kfGlupx?l<+go4;?{c0=(UhbI1 zshTU@Ps3^8#4hBTj)*M$d>K1#`@09zY?mBib~NkHQ)MQg2)X{#4@9FVBZ{B@E7jG^ zoSjGL&uSfK!Yvhx7MXxz?9SM4v4m2{U;otyXg9dmS^ zV4jR%LWm|Um}XuzkqU&pdH+O7#`wI8Q}rO^rn1m+rpq>sH?~3A5b<$gbxqM1#Qz2f z?)qb=VI#16=nhc=YK0W?M}J|51Y$ZPvcqRuG8L2j{hLfG2u9n~K8uktJTnK>Nx>EO zfH--+m{GeB`2DVPUyx2yTh#|q2qfzCsuKxnu;KGHepM?6AO8eha~?GbfuC|tAVDri zuV@+l-eI4sCJiCIyuTEVK@j?&t6=zF9gA{Y7gmxR?8|pA@;RMk)hH9}DmasHjiEmg z_5XofwP>z-l;z4@fRd1QaF^%?FOttv=U0ABd#Ikf z`*Ob#ZD*)Dd@G8--^P&fu5&H*AEcaXYh3KWX>gfzWL7mrd&8@yv29^^e|81@v6!5lT6w6~hi{kAr;em;oW0z6A6Opv~kiWj=0IqYaE$}U2+LCO4 z2`fBPNedfRmguAX{djs6@&;(JG(!40A6^N;}ZidPvBT)YIjRs}i=&)LS3q6bfqr<+@LRMRd(6B1`oXlS7Ae|_$$DS_iu)O{;tkVbt+N5&vj8gt{ zClw^Ob|n>D{Y{?^Z+fF0i-!<6(@yNGo5=zC6cMaWL7k&>cZy}S@w&3qy@En%mM==m zN?b!51%o3vLh&8d8{se4NyCSgZHqEv33xa#(&0t-KOD=7SwhU--+0eH8{8}_!_N}l z&QkTYt|`?6$-^3wSGL7Iqt<6R@28|7N^VK5rs;><%&QKsenFz_zobdkbn2OQ z)-v!V+*<7o@3NDSkz=%5IC5NTQt0t}c4 zPx2o&#o_$e)Ok9C%S2g6g!Y=*@+PVi@lno@%y7o*YN~^ZPAF+xSSgw|X=2>gJpY(n z&rn0>B~`jd)nfcTwGRL_hSQ4m&;P?3_qdl+UTYMOa?+q4Z9%`Yd0>Xi7gFr@aaV|n zy;Z=+7oy~Q9LZC|gZl!^z*>N0KaA^gCjZEkrLD}-mP}(?5 zK)klR`TCSp#0(woWSvL0V>7;ekdxoorkvn9NdSX>ZhUj4il~Sq(tVh3zv5vu(h5zQ z#Q8E1am5D!W~Gm@S`EE!!a8m+ON;?8jEHyq$4nhI*E#HkkOX|fI*N5i&0imHaIOW= zC2R}_q13~G^K-g$_p4*kLFG`eTt;=aX z$;3`jpSb4%oKKlDQlOMe!qP*@sqD{%(qDYTz8( ztbg7<^!?0T4H=RVMx!D_tJ@4o*=ImI$(vE!Rz97o{RtWEv*t~ZNk7ip^iN5#qBY#b z#MX<(T=